commit 6cb49b3353bdcd0e5f439032e9c2354f60924f24 Author: Dorian Zedler Date: Fri Aug 5 07:40:51 2022 +0000 Update pages 🚀 diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000..a48c7fa --- /dev/null +++ b/annotated.html @@ -0,0 +1,118 @@ + + + + + ScStw shared libraries + + + + + + + +
+
+
+
+
+

Classes

+
    +
  • class ScStw The ScStw class provides some shared functions and enums for use in the ScStw project.
  • +
  • class ScStwRace The ScStwRace class can be used to measure timings of climbing races with multiple lanes at once.
  • +
  • class ScStwSoundPlayer The ScStwSoundPlayer class is used for ultra low latency sound playback of the speed clibing start tones and commands.
  • +
  • class ScStwTimer The ScStwTimer class is used for advanced time measurement.
  • +
+ +
+
+
+
+ + + + + + diff --git a/classScStw.html b/classScStw.html new file mode 100644 index 0000000..b54afba --- /dev/null +++ b/classScStw.html @@ -0,0 +1,492 @@ + + + + + ScStw class | ScStw shared libraries + + + + + + + +
+
+
+
+
+

+ ScStw class +

+

The ScStw class provides some shared functions and enums for use in the ScStw project.

+ +
+

Public types

+
+
+ enum SignalKey { InvalidSignal = -1, + RaceStateChanged = 9000, + TimersChanged = 9001, + ExtensionsChanged = 9002, + CurrentStartDelayChanged = 9003, + SettingChanged = 9004, + RaceDetailsChanged = 9005 } +
+
The SignalKey enum contains all signal keys a client can subscribe to.
+
+ enum SocketCommand { InvalidCommand = -1, + InitializeSessionCommand = 1, + StartRaceCommand = 1000, + StopRaceCommand = 1001, + ResetRaceCommand = 1002, + CancelRaceCommand = 1003, + SetTimerDisabledCommand = 1004, + GetRaceStateCommand = 2000, + GetRaceDetailsCommand = 2001, + GetExtensionsCommand = 2006, + GetTimersCommand = 2007, + GetCurrentStartDelayCommand = 2009, + WriteSettingCommand = 3000, + ReadSettingCommand = 3001, + LoginAthleteCommand = 4000, + CreateAthleteCommand = 4001, + DeleteAthleteCommand = 4002, + GetAtheletesCommand = 4003, + GetAthleteResultsCommand = 4004, + UpdateFirmwareCommand = 5000, + UpdateSystemTimeCommand = 5001, + PairExtensionsCommand = 5002 } +
+
The SocketCommand enum contains all commands the base station can handle.
+
+ enum StatusCode { Success = 200, + FirmwareAlreadyUpToDateInfo = 304, + AccessDeniedError = 401, + UpdateSignatureInvalidError = 402, + CurrentStateNotVaildForOperationError = 403, + CommandNotFoundError = 404, + RequiredParameterNotGivenError = 405, + TimestampTooSmallError = 406, + ClientSessionAlreadyActiveError = 407, + NoSessionActiveError = 408, + ItemNotFoundError = 409, + LastTimerCannotBeDisabledError = 410, + UpdateFailedError = 500, + Error = 900, + NotConnectedError = 910, + TimeoutError = 911, + SettingNotAccessibleError = 901, + InternalError = 950, + InternalErrorTimerOperationFailed = 951, + ApiVersionNotSupportedError = 952, + CompetitionModeProhibitsThisError = 953, + FirmwareUpdateFormatInvalidError = 954, + TimersNotReadyError = 501 } +
+
The ErrorCode enum contains all error codes that can occur when sending a command to the basestation.
+
+ enum ExtensionType { StartPad, + TopPad } +
+
The ExtensionType enum contains all types of extensions.
+
+ enum ExtensionState { ExtensionDisconnected = 0, + ExtensionConnecting = 1, + ExtensionInitialising = 2, + ExtensionConnected = 3 } +
+
The ExtensionState enum contains all possible states of an extension.
+
+ enum ExtensionBatteryState { BatteryUnknown = -1, + BatteryCritical = 0, + BatteryWarning = 1, + BatteryFine = 2, + BatteryCharging = 3, + BatteryNotCharging = 4 } +
+
The ExtensionBatteryState enum contains all possible battery states of an extension.
+
+ enum PadState { PadNotPressed = 0, + PadPressed = 1 } +
+
The PadState enum contains whether a pad is currently pressed or not.
+
+
+
+

Public static variables

+
+
+ static const char* SOCKET_MESSAGE_START_KEY +
+
SOCKET_MESSAGE_START_KEY contains the key, a message is supposed to start with.
+
+ static const char* SOCKET_MESSAGE_END_KEY +
+
SOCKET_MESSAGE_END_KEY contains the key, a message is supposed to end with.
+
+
+
+

Public static functions

+
+
+ static auto signalKeyFromInt(int i) -> SignalKey +
+
Function to convert an int to a SignalKey.
+
+ static auto socketCommandFromInt(int i) -> SocketCommand +
+
Function to convert an int to a SocketCommand.
+
+ static auto extensionTypeToString(ExtensionType t) -> QString +
+
Function to convert an ExtensionType to a string.
+
+ static auto firmwareCompare(QString a, + QString b) -> int +
+
Function to compare to string firmware versions in <major>.<minor>.<patch> formar.
+
+
template<typename Enum>
+ static auto toEnumValue(const int& value, + bool* ok) -> Enum +
+
Function to convert a value to an enum.
+
+
+
+

Enum documentation

+
+

+ enum ScStw::SignalKey +

+

The SignalKey enum contains all signal keys a client can subscribe to.

+ +
+
+

+ enum ScStw::SocketCommand +

+

The SocketCommand enum contains all commands the base station can handle.

+ +
+
+

+ enum ScStw::StatusCode +

+

The ErrorCode enum contains all error codes that can occur when sending a command to the basestation.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Success +
FirmwareAlreadyUpToDateInfo +
AccessDeniedError +
UpdateSignatureInvalidError +
CurrentStateNotVaildForOperationError +
CommandNotFoundError +
RequiredParameterNotGivenError +
TimestampTooSmallError +
ClientSessionAlreadyActiveError +
NoSessionActiveError +
ItemNotFoundError +
LastTimerCannotBeDisabledError +
UpdateFailedError +
Error +
NotConnectedError +
TimeoutError +
SettingNotAccessibleError +
InternalError +
InternalErrorTimerOperationFailed +
ApiVersionNotSupportedError +
CompetitionModeProhibitsThisError +
FirmwareUpdateFormatInvalidError +
TimersNotReadyError +

One or more timer is not ready

+
+
+
+
+

Function documentation

+
+

+ static SignalKey ScStw::signalKeyFromInt(int i) +

+

Function to convert an int to a SignalKey.

+ + + + + + + + + + + + + + + + +
Parameters
ithe int to convert
Returnsa SignalKey
+ +
+
+

+ static SocketCommand ScStw::socketCommandFromInt(int i) +

+

Function to convert an int to a SocketCommand.

+ + + + + + + + + + + + + + + + +
Parameters
ithe int to convert
Returnsa SocketCommand
+ +
+
+

+ static QString ScStw::extensionTypeToString(ExtensionType t) +

+

Function to convert an ExtensionType to a string.

+ + + + + + + + + + + + + + + + +
Parameters
tthe ExtensionType to convert
ReturnsString
+ +
+
+

+ static int ScStw::firmwareCompare(QString a, + QString b) +

+

Function to compare to string firmware versions in <major>.<minor>.<patch> formar.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
aversion a
bversion b
Returns-4: a is of invalid format -3: major of a is lower than b -2: minor of a is lower than b -1: patch of a is lower than b 0: a and b are identical 1: patch b is lower than a 2: minor of b is lower than a 3: major of b is lower than a 4: b is of invalid format
+
+
+
+
+
+
+ + + + + + diff --git a/classScStwRace.html b/classScStwRace.html new file mode 100644 index 0000000..bf407cf --- /dev/null +++ b/classScStwRace.html @@ -0,0 +1,175 @@ + + + + + ScStwRace class | ScStw shared libraries + + + + + + + +
+
+
+
+
+

+ ScStwRace class +

+

The ScStwRace class can be used to measure timings of climbing races with multiple lanes at once.

+ +

The ScStwRace is a container to manage multiple timers at a time and introduces a propper start sequence with start commands ('At your Marks' and 'Ready') and the official IFSC start signal.

Basic usage:

ScStwRace race;
+
+// add two timers
+race.addTimer(new ScStwTimer());
+race.addTimer(new ScStwTimer());
+
+// start a race
+race.start();
+
+

Public slots

+
+
+ auto start(bool asyncronous = true) -> ScStw::StatusCode virtual +
+
Function to start the race.
+
+ auto stop() -> ScStw::StatusCode virtual +
+
Function to stop the currently running race.
+
+ auto reset() -> ScStw::StatusCode virtual +
+
Function to reset a stopped race.
+
+
+
+

Function documentation

+
+

+ ScStw::StatusCode ScStwRace::start(bool asyncronous = true) virtual public slot +

+

Function to start the race.

+ + + + + + + + + + + + + + + + +
Parameters
asyncronousif the function should just start the start sequence and then quit (true) or if if should wait until the start sequence is over and quit after that (false)
Returns200: OK; 904: state not matching
+
+
+

+ ScStw::StatusCode ScStwRace::stop() virtual public slot +

+

Function to stop the currently running race.

+ + + + + + + +
Returns200: OK; 904: state not matching
+
+
+
+
+
+
+ + + + + + diff --git a/classScStwSoundPlayer.html b/classScStwSoundPlayer.html new file mode 100644 index 0000000..0655a4d --- /dev/null +++ b/classScStwSoundPlayer.html @@ -0,0 +1,240 @@ + + + + + ScStwSoundPlayer class | ScStw shared libraries + + + + + + + +
+
+
+
+
+

+ ScStwSoundPlayer class +

+

The ScStwSoundPlayer class is used for ultra low latency sound playback of the speed clibing start tones and commands.

+ +
+

Constructors, destructors, conversion operators

+
+
+ ScStwSoundPlayer(QObject* parent = nullptr) explicit +
+
ScStwSoundPlayer constructor.
+
+
+
+

Signals

+
+
+ void playbackStarted() +
+
Emitted whenever a playback started.
+
+
+
+

Public slots

+
+
+ auto play(StartSound sound, + double volume, + double* timeOfStart = nullptr) -> ScStwSoundPlayer::PlayResult +
+
Function to begin playing the sound of a certain state.
+
+ auto waitForSoundFinish(double* timeOfStop = nullptr) -> ScStwSoundPlayer::PlayResult +
+
Function to wait for the playback to finish.
+
+ auto cancel() -> bool +
+
Function to cancel the current playback.
+
+
+
+

Function documentation

+
+

+ ScStwSoundPlayer::ScStwSoundPlayer(QObject* parent = nullptr) explicit +

+

ScStwSoundPlayer constructor.

+ + + + + + + + + + +
Parameters
parent
+
+
+

+ ScStwSoundPlayer::PlayResult ScStwSoundPlayer::play(StartSound sound, + double volume, + double* timeOfStart = nullptr) public slot +

+

Function to begin playing the sound of a certain state.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
sound
volumeThe volume to play at
timeOfStart
ReturnsTODO true if the playback was successfully started, false otherwise
+
+
+

+ ScStwSoundPlayer::PlayResult ScStwSoundPlayer::waitForSoundFinish(double* timeOfStop = nullptr) public slot +

+

Function to wait for the playback to finish.

+ + + + + + + + + + + + + + + + +
Parameters
timeOfStopthe point in time when the plyback actually stopped (msecs since epoch)
Returnsfalse if there was any error (eg. there was no playback currently), true otherwise
+
+
+

+ bool ScStwSoundPlayer::cancel() public slot +

+

Function to cancel the current playback.

+ + + + + + + +
Returnstrue if the playback was successfully stopped, false otherwise
+

Note that this function will automatically play the false start tone if the currently playing action is 2

+
+
+
+
+
+
+ + + + + + diff --git a/classScStwTimer.html b/classScStwTimer.html new file mode 100644 index 0000000..86b5343 --- /dev/null +++ b/classScStwTimer.html @@ -0,0 +1,814 @@ + + + + + ScStwTimer class | ScStw shared libraries + + + + + + + +
+
+
+
+
+

+ ScStwTimer class +

+

The ScStwTimer class is used for advanced time measurement.

+ +

It does not work on its own though. It is recommended to use it in combination with the ScStwRace class.

When using standalone:

ScStwTimer timer;
+// start the timer
+timer.start();
+// stop the timer
+timer.stop();

The timer will now go into ScStw::WAITING state. That indicates that the timer has stopped and the final result has to be assigned by an external handler.

// assign result 'won'
+timer.setResult(ScStwTimer::WON);

The timer is now in ScStwTimer::WON state.

// reset the timer
+timer.reset();

The timer is not in ScStwTimer::IDLE state again.

+
+

Public types

+
+
+ enum TimerState { IDLE, + STARTING, + RUNNING, + WAITING, + WON, + LOST, + FAILING, + WILDCARD, + FAILED, + CANCELLED, + INCIDENT, + DISABLED } +
+
The TimerState enum contains all state the timer can be in.
+
+ enum ReadyState { IsReady = 0, + NotInIdleState, + IsDisabled, + ExtensionIsNotConnected, + ExtensionBatteryIsCritical, + ClimberIsNotReady } +
+
The ReadyStatus enum contains all possible reasons for a timer not to be ready (>0) and the case that it is ready (0)
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ ScStwTimer(QString letter, + QObject* parent = nullptr) explicit +
+
ScStwTimer constructor.
+
+
+
+

Signals

+
+
+ void stateChanged(TimerState state) +
+
Emitted when the state of the timer changed.
+
+ void reactionTimeChanged() +
+
Emitted when the reaction time changed.
+
+ void wantsToBeDisabledChanged(ScStwTimer* timer, + bool wantsToBeDisabled) +
+
Emitted when the timer wants its state to be changed by the external handler.
+
+ void readyStateChanged(ReadyState readyState) +
+
Emitted when the ready state of the timer changes.
+
+
+
+

Public slots

+
+
+ auto start() -> bool +
+
Function to start the timer.
+
+ auto start(double timeOfStart) -> bool virtual +
+
Function to start the timer at a given point in time (present or future)
+
+ auto cancel() -> bool +
+
Function to cancel the timer.
+
+ auto stop() -> bool +
+
Function to stop the timer.
+
+ auto stop(double timeOfStop) -> bool +
+
Function to stop the timer at a given point in time (past or future)
+
+ auto setResult(TimerState) -> bool +
+
Function to assing the result of the race to the timer.
+
+ auto reset() -> bool virtual +
+
Function to reset the timer.
+
+ auto getState() -> TimerState +
+
Function to get the current state of the timer.
+
+ auto getCurrentTime() -> double +
+
Function to get the current time of the timer.
+
+ auto getReactionTime() -> double +
+
Function to get the reaction time of the climber.
+
+ auto getText() -> QString +
+
Function to get the text, a timer display is supposed to show.
+
+ auto getLetter() -> QString +
+
Function to get the letter of the timer.
+
+ void setDisabled(bool disabled) +
+
Function to set if the timer is supposed to be disabled.
+
+ auto getWantsToBeDisabled() -> bool +
+
Function to check if the timer currently wants to be disabled.
+
+ auto getReadyState() -> ScStwTimer::ReadyState virtual +
+
Function to get the current ready status of a timer.
+
+
+
+

Protected slots

+
+
+ void handleClimberStart(double timeOfStart) +
+
slot to call when the climber has started
+
+ void setState(TimerState newState) +
+
Function to change the state of the timer.
+
+ void setWantsToBeDisabled(bool wantsToBeDisabled) +
+
Function to set whether the timer currently wants to be disabled.
+
+ void technicalIncident() +
+
Function to set the timer into INCIDENT state immidieately.
+
+ auto wildcard() -> bool +
+
Function to set the timer into WILDCARD state.
+
+
+
+

Protected variables

+
+
+ TimerState state +
+
The current state of the timer.
+
+ double startTime +
+
The time the timer was started at.
+
+ double stopTime +
+
The time the timer was stopped at.
+
+ double reactionTime +
+
the reaction time of the climber
+
+ QString letter +
+
The letter (eg. "A" or "B") of the Timer (only one char)
+
+ bool wantsToBeDisabled +
+
Defines if the timer currently wants to be disabled or not.
+
+
+
+

Enum documentation

+
+

+ enum ScStwTimer::TimerState +

+

The TimerState enum contains all state the timer can be in.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
IDLE +

Timer is waiting to be started

+
STARTING +

Timer is starting and will react with a false start if the climber starts

+
RUNNING +

Timer is running

+
WAITING +

Timer was stopped and is waiting to be set to either WON or LOST

+
WON +

Timer has won

+
LOST +

Timer has lost

+
FAILING +

Timer encountered a false start and is waiting to be set to either FAILED or WILDCARD

+
WILDCARD +

The opponent has done a false start

+
FAILED +

A false start occured

+
CANCELLED +

Timer was cancelled

+
INCIDENT +

There was a technical incident (most likely a disconnected extension)

+
DISABLED +

Timer is disabled

+
+
+
+

+ enum ScStwTimer::ReadyState +

+

The ReadyStatus enum contains all possible reasons for a timer not to be ready (>0) and the case that it is ready (0)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
IsReady +

Timer is ready for start

+
NotInIdleState +

Timer is not in IDLE state

+
IsDisabled +

Timer is disabled

+
ExtensionIsNotConnected +

Not all extension of the timer are conneted

+
ExtensionBatteryIsCritical +

The battery level of one or more extension is critical or unknown

+
ClimberIsNotReady +

The startpad of the timer is not triggered

+
+
+
+
+

Function documentation

+
+

+ ScStwTimer::ScStwTimer(QString letter, + QObject* parent = nullptr) explicit +

+

ScStwTimer constructor.

+ + + + + + + + + + + + + + +
Parameters
letterthe letter of the timer (only first char will be used!)
parentthe parent object
+
+
+

+ void ScStwTimer::wantsToBeDisabledChanged(ScStwTimer* timer, + bool wantsToBeDisabled) signal +

+

Emitted when the timer wants its state to be changed by the external handler.

+ + + + + + + + + + + + + + +
Parameters
timerthe timer object
wantsToBeDisabled
+
+
+

+ void ScStwTimer::readyStateChanged(ReadyState readyState) signal +

+

Emitted when the ready state of the timer changes.

+ + + + + + + + + + +
Parameters
readyStatethe new ReadyState
+
+
+

+ bool ScStwTimer::start() public slot +

+

Function to start the timer.

+ + + + + + + +
Returnsfalse if the timer was not in the required state and therefore not started, true otherwise
+

To do this, the timer has to be in ScStwTimer::STARTING state!

+
+
+

+ bool ScStwTimer::start(double timeOfStart) virtual public slot +

+

Function to start the timer at a given point in time (present or future)

+ + + + + + + + + + + + + + + + +
Parameters
timeOfStartthe point in time (msecs since epoch) when the timer is supposted to be started
Returnsfalse if the timer was not in the required state and therefore not started, true otherwise
+

To do this, the timer has to be in ScStwTimer::STARTING state!

+
+
+

+ bool ScStwTimer::cancel() public slot +

+

Function to cancel the timer.

+ + + + + + + +
Returnsfalse if the timer was not in the required state and therefore not cancelled, true otherwise
+

To do this, the timer has to be in ScStwTimer::IDLE, ScStwTimer::STARTING or ScStwTimer::RUNNING state!

+
+
+

+ bool ScStwTimer::stop() public slot +

+

Function to stop the timer.

+ + + + + + + +
Returnsfalse if the timer was not in the required state and therefore not stopped, true otherwise
+

To do this, the timer has to be in ScStwTimer::RUNNING state!

+
+
+

+ bool ScStwTimer::stop(double timeOfStop) public slot +

+

Function to stop the timer at a given point in time (past or future)

+ + + + + + + + + + + + + + + + +
Parameters
timeOfStopthe point in time (msecs since epoch) when the timer is supposted to be stopped
Returnsfalse if the timer was not in the required state and therefore not stopped, true otherwise
+

To do this, the timer has to be in ScStwTimer::RUNNING state!

+
+
+

+ bool ScStwTimer::setResult(TimerState) public slot +

+

Function to assing the result of the race to the timer.

+ + + + + + + +
Returnsfalse if the timer was not in the required state and the result therefore not set, true otherwise
+

To do this, the timer has to be in ScStwTimer::WAITING state!

+
+
+

+ bool ScStwTimer::reset() virtual public slot +

+

Function to reset the timer.

+ + + + + + + +
Returnsfalse if the timer was not in the required state and therefore not reset, true otherwise
+

To do this, the timer has to be in ScStwTimer::WON or ScSTw::LOST state!

+
+
+

+ TimerState ScStwTimer::getState() public slot +

+

Function to get the current state of the timer.

+ + + + + + + +
Returnscurrent state of the timer
+ +
+
+

+ double ScStwTimer::getCurrentTime() public slot +

+

Function to get the current time of the timer.

+ + + + + + + +
ReturnsThe current / final time of the timer or -1 if it is not in the required state
+

To do this, the timer has to be in ScStwTimer::RUNNING, ScStwTimer::WAITING, ScStwTimer::WON or ScSTw::LOST state!

+
+
+

+ double ScStwTimer::getReactionTime() public slot +

+

Function to get the reaction time of the climber.

+ + + + + + + +
ReturnsThe climbers reaction time
+
+
+

+ QString ScStwTimer::getText() public slot +

+

Function to get the text, a timer display is supposed to show.

+ + + + + + + +
ReturnsThe text to show
+
+
+

+ QString ScStwTimer::getLetter() public slot +

+

Function to get the letter of the timer.

+ + + + + + + +
ReturnsThe letter of the timer or ""
+
+
+

+ void ScStwTimer::setDisabled(bool disabled) public slot +

+

Function to set if the timer is supposed to be disabled.

+ + + + + + + + + + +
Parameters
disabledif the timer is supposed to be diabled
+

!!! CAUTION use this function with care, it immidiately changes the state of the timer !!! It is recommended to only use this function to change the timers state after the ScStwTimer::requestTimerEnableChange() signal was called, during the race, the timer is used in, is in IDLE state.

+
+
+

+ bool ScStwTimer::getWantsToBeDisabled() public slot +

+

Function to check if the timer currently wants to be disabled.

+ + + + + + + +
Returnstrue or false
+
+
+

+ ScStwTimer::ReadyState ScStwTimer::getReadyState() virtual public slot +

+

Function to get the current ready status of a timer.

+ + + + + + + +
ReturnsThe current ready status
+
+
+

+ void ScStwTimer::handleClimberStart(double timeOfStart) protected slot +

+

slot to call when the climber has started

+ + + + + + + + + + +
Parameters
timeOfStarttime (msecs since epoch) when the climber started
+
+
+

+ void ScStwTimer::setState(TimerState newState) protected slot +

+

Function to change the state of the timer.

+ + + + + + + + + + +
Parameters
newStateThe new state
+

Doing this will emit the ScStwTimer::stateChanged() signal (only if the new state differs from the current one)

+
+
+

+ void ScStwTimer::setWantsToBeDisabled(bool wantsToBeDisabled) protected slot +

+

Function to set whether the timer currently wants to be disabled.

+ + + + + + + + + + +
Parameters
wantsToBeDisabledtrue or false
+
+
+

+ void ScStwTimer::technicalIncident() protected slot +

+

Function to set the timer into INCIDENT state immidieately.

+

The current state of the timer will be ignored! It can only get out of this state by calling ScStwTimer::reset

+
+
+

+ bool ScStwTimer::wildcard() protected slot +

+

Function to set the timer into WILDCARD state.

+ + + + + + + +
Returnsfalse if not in STARTING state
+

Only works when the timer is in STARTING state.

+
+
+
+
+
+
+ + + + + + diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..0b3888c Binary files /dev/null and b/favicon.png differ diff --git a/files.html b/files.html new file mode 100644 index 0000000..7cf8213 --- /dev/null +++ b/files.html @@ -0,0 +1,114 @@ + + + + + ScStw shared libraries + + + + + + + +
+
+
+
+
+

Files

+
    +
+ +
+
+
+
+ + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..beba7de --- /dev/null +++ b/index.html @@ -0,0 +1,101 @@ + + + + + ScStw Libraries documentation | ScStw shared libraries + + + + + + + +
+
+
+
+
+

+ ScStw Libraries documentation +

+

Introduction

This library is meant for usage with the Speed climbing stopwatch project. It contains some helper classes to build a client application for the ScStw basestation with Qt.

Installation

cd yourRepo
+git submodule add https://git.itsblue.de/ScStw/shared-libraries/
+git submodule update --init --recursive

And in your MyProject.pro include the .pri file: include($$PWD/shared-libraries/ScStwLibraries/ScStwLibraries.pri)

+
+
+
+
+ + + + + + diff --git a/m-dark+documentation.compiled.css b/m-dark+documentation.compiled.css new file mode 100644 index 0000000..8cc82fb --- /dev/null +++ b/m-dark+documentation.compiled.css @@ -0,0 +1,2923 @@ +/* Generated using `./postprocess.py m-dark.css m-documentation.css -o m-dark+documentation.compiled.css`. Do not edit. */ + +/* + This file is part of m.css. + + Copyright © 2017, 2018, 2019, 2020, 2021, 2022 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +*, ::before, ::after { box-sizing: border-box; } +body { margin: 0; } +.m-container { + width: 100%; + margin: auto; + padding-left: 1rem; + padding-right: 1rem; +} +.m-row { + margin-left: -1rem; + margin-right: -1rem; +} +.m-row::after { + content: ' '; + clear: both; + display: table; +} +.m-row > [class*='m-col-'] { + position: relative; + padding: 1rem; +} +[class*='m-clearfix-']::after { + display: block; + content: ' '; + clear: both; +} +[class*='m-show-'] { + display: none; +} +.m-container-inflate, :not(.m-row) > [class*='m-col-'] { + margin-bottom: 1rem; +} +.m-container-inflate:last-child, :not(.m-row) > [class*='m-col-']:last-child { + margin-bottom: 0; +} +.m-container.m-nopad, [class*='m-col-'].m-nopad, +.m-container.m-nopadx, [class*='m-col-'].m-nopadx, +.m-container.m-nopadl, [class*='m-col-'].m-nopadl { + padding-left: 0; +} +.m-container.m-nopad, [class*='m-col-'].m-nopad, +.m-container.m-nopadx, [class*='m-col-'].m-nopadx, +.m-container.m-nopadr, [class*='m-col-'].m-nopadr { + padding-right: 0; +} +[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadt { + padding-top: 0; +} +[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadb, +.m-container-inflate.m-nopadb { + padding-bottom: 0; +} +[class*='m-col-t-'] { float: left; } +.m-left-t { + padding-right: 1rem; + float: left; +} +.m-right-t, [class*='m-col-t-'].m-right-t { + padding-left: 1rem; + float: right; +} +.m-center-t, [class*='m-col-t-'].m-center-t { + float: none; +} +.m-center-t, [class*='m-col-t-'].m-center-t { + margin-left: auto; + margin-right: auto; + float: none; +} +.m-col-t-1 { width: calc(1 * 100% / 12); } +.m-col-t-2 { width: calc(2 * 100% / 12); } +.m-col-t-3 { width: calc(3 * 100% / 12); } +.m-col-t-4 { width: calc(4 * 100% / 12); } +.m-col-t-5 { width: calc(5 * 100% / 12); } +.m-col-t-6 { width: calc(6 * 100% / 12); } +.m-col-t-7 { width: calc(7 * 100% / 12); } +.m-col-t-8 { width: calc(8 * 100% / 12); } +.m-col-t-9 { width: calc(9 * 100% / 12); } +.m-col-t-10 { width: calc(10 * 100% / 12); } +.m-col-t-11 { width: calc(11 * 100% / 12); } +.m-col-t-12 { width: calc(12 * 100% / 12); } +.m-push-t-1 { left: calc(1 * 100% / 12); } +.m-push-t-2 { left: calc(2 * 100% / 12); } +.m-push-t-3 { left: calc(3 * 100% / 12); } +.m-push-t-4 { left: calc(4 * 100% / 12); } +.m-push-t-5 { left: calc(5 * 100% / 12); } +.m-push-t-6 { left: calc(6 * 100% / 12); } +.m-push-t-7 { left: calc(7 * 100% / 12); } +.m-push-t-8 { left: calc(8 * 100% / 12); } +.m-push-t-9 { left: calc(9 * 100% / 12); } +.m-push-t-10 { left: calc(10 * 100% / 12); } +.m-push-t-11 { left: calc(11 * 100% / 12); } +.m-pull-t-1 { right: calc(1 * 100% / 12); } +.m-pull-t-2 { right: calc(2 * 100% / 12); } +.m-pull-t-3 { right: calc(3 * 100% / 12); } +.m-pull-t-4 { right: calc(4 * 100% / 12); } +.m-pull-t-5 { right: calc(5 * 100% / 12); } +.m-pull-t-6 { right: calc(6 * 100% / 12); } +.m-pull-t-7 { right: calc(7 * 100% / 12); } +.m-pull-t-8 { right: calc(8 * 100% / 12); } +.m-pull-t-9 { right: calc(9 * 100% / 12); } +.m-pull-t-10 { right: calc(10 * 100% / 12); } +.m-pull-t-11 { right: calc(11 * 100% / 12); } +@media screen and (min-width: 576px) { + .m-container { width: 560px; } + .m-container-inflatable .m-col-s-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-s-10 .m-container-inflate.m-left-s { + margin-left: -10%; + } + .m-container-inflatable .m-col-s-10 .m-container-inflate.m-right-s { + margin-right: -10%; + } + [class*='m-col-s-'] { float: left; } + .m-left-s { + padding-right: 1rem; + float: left; + } + .m-right-s, [class*='m-col-s-'].m-right-s { + padding-left: 1rem; + float: right; + } + .m-center-s, [class*='m-col-s-'].m-center-s { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-s-1 { width: calc(1 * 100% / 12); } + .m-col-s-2 { width: calc(2 * 100% / 12); } + .m-col-s-3 { width: calc(3 * 100% / 12); } + .m-col-s-4 { width: calc(4 * 100% / 12); } + .m-col-s-5 { width: calc(5 * 100% / 12); } + .m-col-s-6 { width: calc(6 * 100% / 12); } + .m-col-s-7 { width: calc(7 * 100% / 12); } + .m-col-s-8 { width: calc(8 * 100% / 12); } + .m-col-s-9 { width: calc(9 * 100% / 12); } + .m-col-s-10 { width: calc(10 * 100% / 12); } + .m-col-s-11 { width: calc(11 * 100% / 12); } + .m-col-s-12 { width: calc(12 * 100% / 12); } + .m-push-s-0 { left: calc(0 * 100% / 12); } + .m-push-s-1 { left: calc(1 * 100% / 12); } + .m-push-s-2 { left: calc(2 * 100% / 12); } + .m-push-s-3 { left: calc(3 * 100% / 12); } + .m-push-s-4 { left: calc(4 * 100% / 12); } + .m-push-s-5 { left: calc(5 * 100% / 12); } + .m-push-s-6 { left: calc(6 * 100% / 12); } + .m-push-s-7 { left: calc(7 * 100% / 12); } + .m-push-s-8 { left: calc(8 * 100% / 12); } + .m-push-s-9 { left: calc(9 * 100% / 12); } + .m-push-s-10 { left: calc(10 * 100% / 12); } + .m-push-s-11 { left: calc(11 * 100% / 12); } + .m-pull-s-0 { right: calc(0 * 100% / 12); } + .m-pull-s-1 { right: calc(1 * 100% / 12); } + .m-pull-s-2 { right: calc(2 * 100% / 12); } + .m-pull-s-3 { right: calc(3 * 100% / 12); } + .m-pull-s-4 { right: calc(4 * 100% / 12); } + .m-pull-s-5 { right: calc(5 * 100% / 12); } + .m-pull-s-6 { right: calc(6 * 100% / 12); } + .m-pull-s-7 { right: calc(7 * 100% / 12); } + .m-pull-s-8 { right: calc(8 * 100% / 12); } + .m-pull-s-9 { right: calc(9 * 100% / 12); } + .m-pull-s-10 { right: calc(10 * 100% / 12); } + .m-pull-s-11 { right: calc(11 * 100% / 12); } + .m-clearfix-t::after { display: none; } + .m-hide-s { display: none; } + .m-show-s { display: block; } + .m-col-s-none { + width: auto; + float: none; + } +} +@media screen and (min-width: 768px) { + .m-container { width: 750px; } + .m-container-inflatable .m-col-m-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-m-10 .m-container-inflate.m-left-m { + margin-left: -10%; + } + .m-container-inflatable .m-col-m-10 .m-container-inflate.m-right-m { + margin-right: -10%; + } + [class*='m-col-m-'] { float: left; } + .m-left-m { + padding-right: 1rem; + float: left; + } + .m-right-m, [class*='m-col-m-'].m-right-m { + padding-left: 1rem; + float: right; + } + .m-center-m, [class*='m-col-m-'].m-center-m { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-m-1 { width: calc(1 * 100% / 12); } + .m-col-m-2 { width: calc(2 * 100% / 12); } + .m-col-m-3 { width: calc(3 * 100% / 12); } + .m-col-m-4 { width: calc(4 * 100% / 12); } + .m-col-m-5 { width: calc(5 * 100% / 12); } + .m-col-m-6 { width: calc(6 * 100% / 12); } + .m-col-m-7 { width: calc(7 * 100% / 12); } + .m-col-m-8 { width: calc(8 * 100% / 12); } + .m-col-m-9 { width: calc(9 * 100% / 12); } + .m-col-m-10 { width: calc(10 * 100% / 12); } + .m-col-m-11 { width: calc(11 * 100% / 12); } + .m-col-m-12 { width: calc(12 * 100% / 12); } + .m-push-m-0 { left: calc(0 * 100% / 12); } + .m-push-m-1 { left: calc(1 * 100% / 12); } + .m-push-m-2 { left: calc(2 * 100% / 12); } + .m-push-m-3 { left: calc(3 * 100% / 12); } + .m-push-m-4 { left: calc(4 * 100% / 12); } + .m-push-m-5 { left: calc(5 * 100% / 12); } + .m-push-m-6 { left: calc(6 * 100% / 12); } + .m-push-m-7 { left: calc(7 * 100% / 12); } + .m-push-m-8 { left: calc(8 * 100% / 12); } + .m-push-m-9 { left: calc(9 * 100% / 12); } + .m-push-m-10 { left: calc(10 * 100% / 12); } + .m-push-m-11 { left: calc(11 * 100% / 12); } + .m-pull-m-0 { right: calc(0 * 100% / 12); } + .m-pull-m-1 { right: calc(1 * 100% / 12); } + .m-pull-m-2 { right: calc(2 * 100% / 12); } + .m-pull-m-3 { right: calc(3 * 100% / 12); } + .m-pull-m-4 { right: calc(4 * 100% / 12); } + .m-pull-m-5 { right: calc(5 * 100% / 12); } + .m-pull-m-6 { right: calc(6 * 100% / 12); } + .m-pull-m-7 { right: calc(7 * 100% / 12); } + .m-pull-m-8 { right: calc(8 * 100% / 12); } + .m-pull-m-9 { right: calc(9 * 100% / 12); } + .m-pull-m-10 { right: calc(10 * 100% / 12); } + .m-pull-m-11 { right: calc(11 * 100% / 12); } + .m-clearfix-s::after { display: none; } + .m-hide-m { display: none; } + .m-show-m { display: block; } + .m-col-m-none { + width: auto; + float: none; + } +} +@media screen and (min-width: 992px) { + .m-container { width: 960px; } + .m-container-inflatable .m-col-l-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-l-10 .m-container-inflate.m-left-l { + margin-left: -10%; + } + .m-container-inflatable .m-col-l-10 .m-container-inflate.m-right-l { + margin-right: -10%; + } + [class*='m-col-l-'] { float: left; } + .m-left-l { + padding-right: 1rem; + float: left; + } + .m-right-l, [class*='m-col-l-'].m-right-l { + padding-left: 1rem; + float: right; + } + .m-center-l, [class*='m-col-l-'].m-center-l { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-l-1 { width: calc(1 * 100% / 12); } + .m-col-l-2 { width: calc(2 * 100% / 12); } + .m-col-l-3 { width: calc(3 * 100% / 12); } + .m-col-l-4 { width: calc(4 * 100% / 12); } + .m-col-l-5 { width: calc(5 * 100% / 12); } + .m-col-l-6 { width: calc(6 * 100% / 12); } + .m-col-l-7 { width: calc(7 * 100% / 12); } + .m-col-l-8 { width: calc(8 * 100% / 12); } + .m-col-l-9 { width: calc(9 * 100% / 12); } + .m-col-l-10 { width: calc(10 * 100% / 12); } + .m-col-l-11 { width: calc(11 * 100% / 12); } + .m-col-l-12 { width: calc(12 * 100% / 12); } + .m-push-l-0 { left: calc(0 * 100% / 12); } + .m-push-l-1 { left: calc(1 * 100% / 12); } + .m-push-l-2 { left: calc(2 * 100% / 12); } + .m-push-l-3 { left: calc(3 * 100% / 12); } + .m-push-l-4 { left: calc(4 * 100% / 12); } + .m-push-l-5 { left: calc(5 * 100% / 12); } + .m-push-l-6 { left: calc(6 * 100% / 12); } + .m-push-l-7 { left: calc(7 * 100% / 12); } + .m-push-l-8 { left: calc(8 * 100% / 12); } + .m-push-l-9 { left: calc(9 * 100% / 12); } + .m-push-l-10 { left: calc(10 * 100% / 12); } + .m-push-l-11 { left: calc(11 * 100% / 12); } + .m-pull-l-0 { right: calc(0 * 100% / 12); } + .m-pull-l-1 { right: calc(1 * 100% / 12); } + .m-pull-l-2 { right: calc(2 * 100% / 12); } + .m-pull-l-3 { right: calc(3 * 100% / 12); } + .m-pull-l-4 { right: calc(4 * 100% / 12); } + .m-pull-l-5 { right: calc(5 * 100% / 12); } + .m-pull-l-6 { right: calc(6 * 100% / 12); } + .m-pull-l-7 { right: calc(7 * 100% / 12); } + .m-pull-l-8 { right: calc(8 * 100% / 12); } + .m-pull-l-9 { right: calc(9 * 100% / 12); } + .m-pull-l-10 { right: calc(10 * 100% / 12); } + .m-pull-l-11 { right: calc(11 * 100% / 12); } + .m-clearfix-m::after { display: none; } + .m-hide-l { display: none; } + .m-show-l { display: block; } + .m-col-l-none { + width: auto; + float: none; + } +} + +html { + font-size: 16px; + background-color: #2f363f; +} +body { + font-family: 'Source Sans Pro', sans-serif; + font-size: 1rem; + line-height: normal; + color: #dcdcdc; +} +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + font-weight: 600; +} +h1 { + margin-bottom: 1rem; +} +h2, h3, h4, h5, h6 { + margin-bottom: 0.5rem; +} +p, ul, ol, dl { + margin-top: 0; +} +ul, ol { + padding-left: 2rem; +} +ul ol, ul ul, ol ol, ol ul { + margin-bottom: 0; +} +main p { + text-indent: 1.5rem; + text-align: justify; +} +main p.m-noindent, li > p, dd > p, table.m-table td > p { + text-indent: 0; + text-align: left; +} +blockquote { + margin-top: 0; + margin-left: 1rem; + margin-right: 1rem; + padding: 1rem; + border-left-style: solid; + border-left-width: 0.25rem; +} +hr { + width: 75%; + border-width: 0.0625rem; + border-style: solid; +} +blockquote, hr { + border-color: #405363; +} +strong, .m-text.m-strong { font-weight: bold; } +em, .m-text.m-em { font-style: italic; } +s, .m-text.m-s { text-decoration: line-through; } +sub, sup, .m-text.m-sub, .m-text.m-sup { + font-size: 0.75rem; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup, .m-text.m-sup { top: -0.35rem; } +sub, .m-text.m-sub { bottom: -0.2rem; } +abbr { + cursor: help; + text-decoration: underline dotted; +} +a { + color: #5b9dd9; +} +a.m-flat { + text-decoration: none; +} +a:hover, a:focus, a:active { + color: #a5c9ea; +} +a img { border: 0; } +svg a { cursor: pointer; } +mark { + padding: 0.0625rem; + background-color: #c7cf2f; + color: #2f83cc; +} +.m-link-wrap { + word-break: break-all; +} +pre, code { + font-family: 'Source Code Pro', monospace, monospace, monospace; + font-size: 0.9em; + color: #e6e6e6; + background-color: #282e36; +} +pre.m-console, code.m-console { + color: #e6e6e6; + background-color: #1a1c1d; +} +pre { + padding: 0.5rem 1rem; + border-radius: 0.2rem; + overflow-x: auto; + margin-top: 0; +} +pre.m-console-wrap { + white-space: pre-wrap; + word-break: break-all; +} +code { + padding: 0.125rem; +} +*:focus { outline-color: #5b9dd9; } +div.m-scroll { + max-width: 100%; + overflow-x: auto; +} +.m-fullwidth { + width: 100%; +} +.m-spacing-150 { + line-height: 1.5rem; +} +.m-text-center, .m-text-center.m-noindent, table.m-table th.m-text-center, .m-text-center p { + text-align: center; +} +.m-text-left, .m-text-left.m-noindent, table.m-table th.m-text-left, .m-text-right p { + text-align: left; +} +.m-text-right, .m-text-right.m-noindent, table.m-table th.m-text-right, .m-text-right p { + text-align: right; +} +.m-text-top, table.m-table th.m-text-top, table.m-table td.m-text-top { + vertical-align: top; +} +.m-text-middle, table.m-table th.m-text-middle, table.m-table td.m-text-middle { + vertical-align: middle; +} +.m-text-bottom, table.m-table th.m-text-bottom, table.m-table td.m-text-bottom { + vertical-align: bottom; +} +.m-text.m-tiny { font-size: 50.0%; } +.m-text.m-small { font-size: 85.4%; } +.m-text.m-big { font-size: 117%; } +h1 .m-thin, h2 .m-thin, h3 .m-thin, h4 .m-thin, h5 .m-thin, h6 .m-thin { + font-weight: normal; +} +ul.m-unstyled, ol.m-unstyled { + list-style-type: none; + padding-left: 0; +} +ul[class*='m-block-'], ol[class*='m-block-'] { + padding-left: 0; +} +ul[class*='m-block-'] li, ol[class*='m-block-'] li { + display: inline; +} +ul[class*='m-block-bar-'] li:not(:last-child)::after, ol[class*='m-block-bar-'] li:not(:last-child)::after { + content: " | "; +} +ul[class*='m-block-dot-'] li:not(:last-child)::after, ol[class*='m-block-dot-'] li:not(:last-child)::after { + content: " • "; +} +@media screen and (min-width: 576px) { + ul.m-block-bar-s, ol.m-block-bar-s, + ul.m-block-dot-s, ol.m-block-dot-s { padding-left: 2rem; } + ul.m-block-bar-s li, ol.m-block-bar-s li, + ul.m-block-dot-s li, ol.m-block-dot-s li { display: list-item; } + ul.m-block-bar-s li:not(:last-child)::after, ol.m-block-bar-s li:not(:last-child)::after, + ul.m-block-dot-s li:not(:last-child)::after, ol.m-block-dot-s li:not(:last-child)::after { content: ""; } +} +@media screen and (min-width: 768px) { + ul.m-block-bar-m, ol.m-block-bar-m, + ul.m-block-dot-m, ol.m-block-dot-m { padding-left: 2rem; } + ul.m-block-bar-m li, ol.m-block-bar-m li, + ul.m-block-dot-m li, ol.m-block-dot-m li { display: list-item; } + ul.m-block-bar-m li:not(:last-child)::after, ol.m-block-bar-m li:not(:last-child)::after, + ul.m-block-dot-m li:not(:last-child)::after, ol.m-block-dot-m li:not(:last-child)::after { content: ""; } +} +@media screen and (min-width: 992px) { + ul.m-block-bar-l, ol.m-block-bar-l, + ul.m-block-dot-l, ol.m-block-dot-l { padding-left: 2rem; } + ul.m-block-bar-l li, ol.m-block-bar-l li, + ul.m-block-dot-l li, ol.m-block-dot-l li { display: list-item; } + ul.m-block-bar-l li:not(:last-child)::after, ol.m-block-bar-l li:not(:last-child)::after, + ul.m-block-dot-l li:not(:last-child)::after, ol.m-block-dot-l li:not(:last-child)::after { content: ""; } +} +p.m-poem { + text-indent: 0; + text-align: left; + margin-left: 1.5rem; +} +p.m-transition { + color: #405363; + text-indent: 0; + text-align: center; + font-size: 2rem; +} +dl.m-diary { + margin-bottom: 1.25rem; +} +dl.m-diary:last-child { + margin-bottom: 0.25rem; +} +dl.m-diary dt { + font-weight: bold; + width: 6rem; + float: left; + clear: both; + padding-top: 0.25rem; +} +dl.m-diary dd { + padding-top: 0.25rem; + padding-left: 6rem; + margin-left: 0; +} +a.m-footnote, dl.m-footnote dd span.m-footnote { + top: -0.35rem; + font-size: 0.75rem; + line-height: 0; + position: relative; + vertical-align: baseline; +} +a.m-footnote, dl.m-footnote dd span.m-footnote a { + text-decoration: none; +} +a.m-footnote::before { content: '['; } +a.m-footnote::after { content: ']'; } +dl.m-footnote dt { + width: 1.5rem; + float: left; + clear: both; +} +dl.m-footnote dd { + margin-left: 1.5rem; +} +dl.m-footnote { + font-size: 85.4%; +} +dl.m-footnote dd span.m-footnote a { + font-weight: bold; + font-style: italic; +} +.m-note { + border-radius: 0.2rem; + padding: 1rem; +} +.m-frame { + background-color: #2f363f; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #405363; + padding: 0.875rem; +} +.m-block { + border-style: solid; + border-width: 0.0625rem; + border-left-width: 0.25rem; + border-radius: 0.2rem; + border-color: #405363; + padding: 0.9375rem 0.9375rem 0.9375rem 0.75rem; +} +.m-block.m-badge::after { + content: ' '; + display: block; + clear: both; +} +.m-block.m-badge h3 { + margin-left: 5rem; +} +.m-block.m-badge p { + margin-left: 5rem; + text-indent: 0; +} +.m-block.m-badge img { + width: 4rem; + height: 4rem; + border-radius: 2rem; + float: left; +} +div.m-button { + text-align: center; +} +div.m-button a { + display: inline-block; + border-radius: 0.2rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + text-decoration: none; + font-size: 1.17rem; +} +div.m-button.m-fullwidth a { + display: block; + padding-left: 0.5rem; + padding-right: 0.5rem; +} +div.m-button a .m-big:first-child { + font-size: 1.37rem; + font-weight: bold; +} +div.m-button a .m-small:last-child { + font-size: 0.854rem; +} +.m-label { + border-radius: 0.2rem; + font-size: 75%; + font-weight: normal; + padding: 0.125rem 0.25rem; + vertical-align: 7.5%; +} +.m-label.m-flat { + border-width: 0.0625rem; + border-style: solid; + border-color: #747474; + padding: 0.0625rem 0.1875rem; +} +table.m-table { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; +} +table.m-table.m-big { + margin-top: 1.75rem; +} +div.m-scroll > table.m-table:last-child { + margin-bottom: 0.0625rem; +} +table.m-table:not(.m-flat) tbody tr:hover { + background-color: #405363; +} +table.m-table th, table.m-table td { + vertical-align: top; + border-style: solid; + border-top-width: 0.0625rem; + border-left-width: 0; + border-right-width: 0; + border-bottom-width: 0; + border-color: #405363; +} +table.m-table caption { + padding-bottom: 0.5rem; +} +table.m-table thead tr:first-child th, table.m-table thead tr:first-child td { + border-top-width: 0.125rem; +} +table.m-table thead th, table.m-table thead td { + border-bottom-width: 0.125rem; + vertical-align: bottom; +} +table.m-table tfoot th, table.m-table tfoot td { + border-top-width: 0.125rem; +} +table.m-table th, table.m-table td { + padding: 0.5rem; +} +table.m-table.m-big th, table.m-table.m-big td { + padding: 0.75rem 1rem; +} +table.m-table th { + text-align: left; +} +table.m-table th.m-thin { + font-weight: normal; +} +table.m-table td.m-default, table.m-table th.m-default, +table.m-table td.m-primary, table.m-table th.m-primary, +table.m-table td.m-success, table.m-table th.m-success, +table.m-table td.m-warning, table.m-table th.m-warning, +table.m-table td.m-danger, table.m-table th.m-danger, +table.m-table td.m-info, table.m-table th.m-info, +table.m-table td.m-dim, table.m-table th.m-dim { + padding-left: 0.4375rem; + padding-right: 0.4375rem; + border-left-width: 0.0625rem; +} +table.m-table.m-big td.m-default, table.m-table.m-big th.m-default, +table.m-table.m-big td.m-primary, table.m-table.m-big th.m-primary, +table.m-table.m-big td.m-success, table.m-table.m-big th.m-success, +table.m-table.m-big td.m-warning, table.m-table.m-big th.m-warning, +table.m-table.m-big td.m-danger, table.m-table.m-big th.m-danger, +table.m-table.m-big td.m-info, table.m-table.m-big th.m-info, +table.m-table.m-big td.m-dim, table.m-table.m-big th.m-dim { + padding-left: 0.9375rem; + padding-right: 0.9375rem; + border-left-width: 0.0625rem; +} +table.m-table tr.m-default td, table.m-table td.m-default, +table.m-table tr.m-default th, table.m-table th.m-default, +table.m-table tr.m-primary td, table.m-table td.m-primary, +table.m-table tr.m-primary th, table.m-table th.m-primary, +table.m-table tr.m-success td, table.m-table td.m-success, +table.m-table tr.m-success th, table.m-table th.m-success, +table.m-table tr.m-warning td, table.m-table td.m-warning, +table.m-table tr.m-warning th, table.m-table th.m-warning, +table.m-table tr.m-danger td, table.m-table td.m-danger, +table.m-table tr.m-danger th, table.m-table th.m-danger, +table.m-table tr.m-info td, table.m-table td.m-info, +table.m-table tr.m-info th, table.m-table th.m-info, +table.m-table tr.m-dim td, table.m-table td.m-dim, +table.m-table tr.m-dim th, table.m-table th.m-dim { + border-color: #2f363f; +} +.m-note pre, .m-note code, +table.m-table tr.m-default pre, table.m-table tr.m-default code, +table.m-table td.m-default pre, table.m-table td.m-default code, +table.m-table th.m-default pre, table.m-table th.m-default code, +table.m-table tr.m-primary pre, table.m-table tr.m-primary code, +table.m-table td.m-primary pre, table.m-table td.m-primary code, +table.m-table th.m-primary pre, table.m-table th.m-primary code, +table.m-table tr.m-success pre, table.m-table tr.m-success code, +table.m-table td.m-success pre, table.m-table td.m-success code, +table.m-table th.m-success pre, table.m-table th.m-success code, +table.m-table tr.m-warning pre, table.m-table tr.m-warning code, +table.m-table td.m-warning pre, table.m-table td.m-warning code, +table.m-table th.m-warning pre, table.m-table th.m-warning code, +table.m-table tr.m-danger pre, table.m-table tr.m-danger code, +table.m-table td.m-danger pre, table.m-table td.m-danger code, +table.m-table th.m-danger pre, table.m-table th.m-danger code, +table.m-table tr.m-info pre, table.m-table tr.m-info code, +table.m-table td.m-info pre, table.m-table td.m-info code, +table.m-table th.m-info pre, table.m-table th.m-info code, +table.m-table tr.m-dim pre, table.m-table tr.m-dim code, +table.m-table td.m-dim pre, table.m-table td.m-dim code, +table.m-table th.m-dim pre, table.m-table th.m-dim code { + background-color: rgba(34, 39, 46, 0.5); +} +img.m-image, svg.m-image { + display: block; + margin-left: auto; + margin-right: auto; +} +div.m-image { + text-align: center; +} +img.m-image, svg.m-image, div.m-image img, div.m-image svg { + max-width: 100%; + border-radius: 0.2rem; +} +div.m-image.m-fullwidth img, div.m-image.m-fullwidth svg { + width: 100%; +} +img.m-image.m-badge, div.m-image.m-badge img { + border-radius: 50%; +} +figure.m-figure { + max-width: 100%; + margin-top: 0; + margin-left: auto; + margin-right: auto; + position: relative; + display: table; +} +figure.m-figure::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #405363; +} +figure.m-figure.m-flat::before { + border-color: transparent; +} +figure.m-figure > * { + margin-left: 1rem; + margin-right: 1rem; + display: table-caption; + caption-side: bottom; +} +figure.m-figure > *:first-child { + display: inline; +} +figure.m-figure > *:last-child { + margin-bottom: 1rem !important; +} +figure.m-figure img, figure.m-figure svg { + position: relative; + margin-left: 0; + margin-right: 0; + margin-bottom: 0; + border-top-left-radius: 0.2rem; + border-top-right-radius: 0.2rem; + max-width: 100%; +} +figure.m-figure.m-flat img, figure.m-figure.m-flat svg { + border-bottom-left-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} +figure.m-figure a img, figure.m-figure a svg { + margin-left: -1rem; + margin-right: -1rem; +} +figure.m-figure.m-fullwidth, figure.m-figure.m-fullwidth > * { + display: block; +} +figure.m-figure.m-fullwidth > *:first-child { + display: inline; +} +figure.m-figure.m-fullwidth img, figure.m-figure.m-fullwidth svg { + width: 100%; +} +figure.m-figure.m-fullwidth::after { + content: ' '; + display: block; + margin-top: 1rem; + height: 1px; +} +.m-code-figure, .m-console-figure { + margin-top: 0; + margin-left: 0; + margin-right: 0; + position: relative; + padding: 1rem; +} +.m-code-figure::before, .m-console-figure::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; +} +.m-code-figure::before { + border-color: #282e36; +} +.m-console-figure::before { + border-color: #1a1c1d; +} +.m-code-figure.m-flat::before, .m-console-figure.m-flat::before { + border-color: transparent; +} +.m-code-figure > pre:first-child, .m-console-figure > pre:first-child { + position: relative; + margin: -1rem -1rem 1rem -1rem; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.m-code-figure > pre.m-nopad, .m-console-figure > pre.m-nopad { + margin-left: -0.875rem; + margin-right: -0.875rem; + margin-top: -1rem; + margin-bottom: -0.875rem; + padding-left: 0.875rem; +} +figure.m-figure figcaption, .m-code-figure figcaption, .m-console-figure figcaption { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + font-weight: 600; + font-size: 1.17rem; +} +figure.m-figure figcaption a, .m-code-figure figcaption a, .m-console-figure figcaption a { + text-decoration: none; +} +figure.m-figure figcaption .m-figure-description { + margin-top: 0.5rem; + font-weight: normal; + font-size: 1rem; +} +figure.m-figure figcaption .m-figure-description a { + text-decoration: underline; +} +.m-imagegrid > div { + background-color: #2f363f; +} +.m-imagegrid > div > figure { + display: block; + float: left; + position: relative; + margin: 0; +} +.m-imagegrid > div > figure > div, +.m-imagegrid > div > figure > figcaption, +.m-imagegrid > div > figure > a > div, +.m-imagegrid > div > figure > a > figcaption { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-color: #2f363f; + border-style: solid; + border-width: 0.25rem; + padding: 0.5rem; +} +.m-imagegrid > div > figure:first-child > div, +.m-imagegrid > div > figure:first-child > figcaption, +.m-imagegrid > div > figure:first-child > a > div, +.m-imagegrid > div > figure:first-child > a > figcaption { + border-left-width: 0; +} +.m-imagegrid > div > figure:last-child > div, +.m-imagegrid > div > figure:last-child > figcaption, +.m-imagegrid > div > figure:last-child > a > div, +.m-imagegrid > div > figure:last-child > a > figcaption { + border-right-width: 0; +} +.m-imagegrid > div > figure > figcaption, +.m-imagegrid > div > figure > a > figcaption { + color: transparent; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.75rem; +} +.m-imagegrid > div > figure > div::before, +.m-imagegrid > div > figure > figcaption::before, +.m-imagegrid > div > figure > a > div::before, +.m-imagegrid > div > figure > a > figcaption::before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: bottom; + width: 0; +} +.m-imagegrid > div > figure:hover > figcaption, +.m-imagegrid > div > figure:hover > a > figcaption { + background: linear-gradient(transparent 0%, transparent 75%, rgba(0, 0, 0, 0.85) 100%); + color: #ffffff; +} +.m-imagegrid > div > figure > img, +.m-imagegrid > div > figure > a > img { + width: 100%; + height: 100%; +} +.m-imagegrid > div::after { + display: block; + content: ' '; + clear: both; +} +@media screen and (max-width: 767px) { + .m-imagegrid > div > figure { + float: none; + width: 100% !important; + } + .m-imagegrid > div > figure > div, + .m-imagegrid > div > figure > figcaption, + .m-imagegrid > div > figure > a > div, + .m-imagegrid > div > figure > a > figcaption { + border-left-width: 0; + border-right-width: 0; + } +} +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-note, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-frame, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-block, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-imagegrid, +.m-container-inflatable > .m-row > [class*='m-col-'] > pre, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-code-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-console-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-note, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-frame, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-block, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-imagegrid, +.m-container-inflatable > .m-row > [class*='m-col-'] section > pre, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-code-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-console-figure, +.m-container-inflatable [class*='m-center-'] > .m-note, +.m-container-inflatable [class*='m-center-'] > .m-frame, +.m-container-inflatable [class*='m-center-'] > .m-block, +.m-container-inflatable [class*='m-center-'] > .m-imagegrid, +.m-container-inflatable [class*='m-center-'] > pre, +.m-container-inflatable [class*='m-center-'] > .m-code-figure, +.m-container-inflatable [class*='m-center-'] > .m-console-figure, +.m-container-inflatable [class*='m-left-'] > .m-note, +.m-container-inflatable [class*='m-left-'] > .m-frame, +.m-container-inflatable [class*='m-left-'] > .m-block, +.m-container-inflatable [class*='m-left-'] > .m-imagegrid, +.m-container-inflatable [class*='m-left-'] > pre, +.m-container-inflatable [class*='m-left-'] > .m-code-figure, +.m-container-inflatable [class*='m-left-'] > .m-console-figure, +.m-container-inflatable [class*='m-right-'] > .m-note, +.m-container-inflatable [class*='m-right-'] > .m-frame, +.m-container-inflatable [class*='m-right-'] > .m-block, +.m-container-inflatable [class*='m-right-'] > .m-imagegrid, +.m-container-inflatable [class*='m-right-'] > pre, +.m-container-inflatable [class*='m-right-'] > .m-code-figure, +.m-container-inflatable [class*='m-right-'] > .m-console-figure, +.m-container-inflatable .m-container-inflate > .m-note, +.m-container-inflatable .m-container-inflate > .m-frame, +.m-container-inflatable .m-container-inflate > .m-block, +.m-container-inflatable .m-container-inflate > .m-imagegrid, +.m-container-inflatable .m-container-inflate > pre, +.m-container-inflatable .m-container-inflate > .m-code-figure, +.m-container-inflatable .m-container-inflate > .m-console-figure +{ + margin-left: -1rem; + margin-right: -1rem; +} +@media screen and (min-width: 576px) { + .m-container-inflatable .m-center-s > .m-note, + .m-container-inflatable .m-center-s > .m-frame, + .m-container-inflatable .m-center-s > .m-block, + .m-container-inflatable .m-center-s > .m-imagegrid, + .m-container-inflatable .m-center-s > pre, + .m-container-inflatable .m-center-s > .m-code-figure, + .m-container-inflatable .m-center-s > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-s > .m-note, + .m-container-inflatable .m-left-s > .m-frame, + .m-container-inflatable .m-left-s > .m-block, + .m-container-inflatable .m-left-s > .m-imagegrid, + .m-container-inflatable .m-left-s > pre, + .m-container-inflatable .m-left-s > .m-code-figure, + .m-container-inflatable .m-left-s > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-s > .m-note, + .m-container-inflatable .m-right-s > .m-frame, + .m-container-inflatable .m-right-s > .m-block, + .m-container-inflatable .m-right-s > .m-imagegrid, + .m-container-inflatable .m-right-s > pre, + .m-container-inflatable .m-right-s > .m-code-figure, + .m-container-inflatable .m-right-s > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-s-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-s-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable .m-center-m > .m-note, + .m-container-inflatable .m-center-m > .m-frame, + .m-container-inflatable .m-center-m > .m-block, + .m-container-inflatable .m-center-m > .m-imagegrid, + .m-container-inflatable .m-center-m > pre, + .m-container-inflatable .m-center-m > .m-code-figure, + .m-container-inflatable .m-center-m > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-m > .m-note, + .m-container-inflatable .m-left-m > .m-frame, + .m-container-inflatable .m-left-m > .m-block, + .m-container-inflatable .m-left-m > .m-imagegrid, + .m-container-inflatable .m-left-m > pre, + .m-container-inflatable .m-left-m > .m-code-figure, + .m-container-inflatable .m-left-m > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-m > .m-note, + .m-container-inflatable .m-right-m > .m-frame, + .m-container-inflatable .m-right-m > .m-block, + .m-container-inflatable .m-right-m > .m-imagegrid, + .m-container-inflatable .m-right-m > pre, + .m-container-inflatable .m-right-m > .m-code-figure, + .m-container-inflatable .m-right-m > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-m-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-m-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable .m-center-l > .m-note, + .m-container-inflatable .m-center-l > .m-frame, + .m-container-inflatable .m-center-l > .m-block, + .m-container-inflatable .m-center-l > .m-imagegrid, + .m-container-inflatable .m-center-l > pre, + .m-container-inflatable .m-center-l > .m-code-figure, + .m-container-inflatable .m-center-l > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-l > .m-note, + .m-container-inflatable .m-left-l > .m-frame, + .m-container-inflatable .m-left-l > .m-block, + .m-container-inflatable .m-left-l > .m-imagegrid, + .m-container-inflatable .m-left-l > pre, + .m-container-inflatable .m-left-l > .m-code-figure, + .m-container-inflatable .m-left-l > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-l > .m-note, + .m-container-inflatable .m-right-l > .m-frame, + .m-container-inflatable .m-right-l > .m-block, + .m-container-inflatable .m-right-l > .m-imagegrid, + .m-container-inflatable .m-right-l > pre, + .m-container-inflatable .m-right-l > .m-code-figure, + .m-container-inflatable .m-right-l > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-l-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-l-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +pre.m-code span.hll { + margin-left: -1.0rem; + margin-right: -1.0rem; + padding-left: 1.0rem; +} +.m-code.m-inverted > span, .m-console.m-inverted > span { + opacity: 0.3333; +} +.m-code.m-inverted > span.hll, .m-console.m-inverted > span.hll { + opacity: 1; + background-color: transparent; + border-color: transparent; +} +.m-code.m-inverted { color: rgba(230, 230, 230, 0.33); } +.m-console.m-inverted { color: rgba(230, 230, 230, 0.33); } +.m-code.m-inverted > span.hll { color: #e6e6e6; } +.m-cosole.m-inverted > span.hll { color: #e6e6e6; } +.m-code-color { + display: inline-block; + width: 0.75rem; + height: 0.75rem; + vertical-align: -0.05rem; + margin-left: 0.2rem; + margin-right: 0.1rem; + border-radius: 0.1rem; +} +div.m-math { + overflow-x: auto; + overflow-y: hidden; +} +div.m-math svg { + margin-left: auto; + margin-right: auto; + display: block; +} +div.m-button a svg.m-math { fill: #22272e; } +div.m-button.m-flat a svg.m-math { fill: #dcdcdc; } +div.m-button.m-flat a:hover svg.m-math, div.m-button.m-default a:focus svg.m-math, +div.m-button.m-default a:active svg.m-math { + fill: #a5c9ea; +} +.m-graph { font-size: 16px; } +div.m-plot svg, div.m-graph svg { + max-width: 100%; + margin-left: auto; + margin-right: auto; + display: block; +} +div.m-plot .m-background { fill: #34424d; } +div.m-plot svg .m-label { font-size: 11px; } +div.m-plot svg .m-title { font-size: 13px; } +div.m-plot svg .m-label, div.m-plot svg .m-title { fill: #dcdcdc; } +div.m-plot svg .m-line { + stroke: #dcdcdc; + stroke-width: 0.8; +} +div.m-plot svg .m-error { + stroke: #ffffff; + stroke-width: 1.5; +} +div.m-plot svg .m-label.m-dim { fill: #747474; } +.m-graph g.m-edge path, .m-graph g.m-cluster polygon, +.m-graph g.m-node.m-flat ellipse, +.m-graph g.m-node.m-flat polygon { + fill: none; +} +.m-graph g.m-node:not(.m-flat) text { + fill: #22272e; +} +figure.m-figure > svg.m-math:first-child, +figure.m-figure > svg.m-graph:first-child { + padding: 1rem; + box-sizing: content-box; +} +figure.m-figure:not(.m-flat) > svg.m-math:first-child, +figure.m-figure:not(.m-flat) > svg.m-graph:first-child { + background-color: #405363; +} +.m-block.m-default { border-left-color: #405363; } +.m-block.m-default h3, .m-block.m-default h4, .m-block.m-default h5, .m-block.m-default h6, +.m-text.m-default, .m-label.m-flat.m-default { + color: #dcdcdc; +} +.m-block.m-default h3 a, .m-block.m-default h4 a, .m-block.m-default h5 a, .m-block.m-default h6 a { + color: #5b9dd9; +} +.m-block.m-primary { border-left-color: #a5c9ea; } +.m-block.m-primary h3, .m-block.m-primary h4, .m-block.m-primary h5, .m-block.m-primary h6, +.m-block.m-primary h3 a, .m-block.m-primary h4 a, .m-block.m-primary h5 a, .m-block.m-primary h6 a, +.m-text.m-primary, .m-label.m-flat.m-primary { + color: #a5c9ea; +} +.m-block.m-success { border-left-color: #3bd267; } +.m-block.m-success h3, .m-block.m-success h4, .m-block.m-success h5, .m-block.m-success h6, +.m-block.m-success h3 a, .m-block.m-success h4 a, .m-block.m-success h5 a, .m-block.m-success h6 a, +.m-text.m-success, .m-label.m-flat.m-success { + color: #3bd267; +} +.m-block.m-warning { border-left-color: #c7cf2f; } +.m-block.m-warning h3, .m-block.m-warning h4, .m-block.m-warning h5, .m-block.m-warning h6, +.m-block.m-warning h3 a, .m-block.m-warning h4 a, .m-block.m-warning h5 a, .m-block.m-warning h6 a, +.m-text.m-warning, .m-label.m-flat.m-warning { + color: #c7cf2f; +} +.m-block.m-danger { border-left-color: #cd3431; } +.m-block.m-danger h3, .m-block.m-danger h4, .m-block.m-danger h5, .m-block.m-danger h6, +.m-block.m-danger h3 a, .m-block.m-danger h4 a, .m-block.m-danger h5 a, .m-block.m-danger h6 a, +.m-text.m-danger, .m-label.m-flat.m-danger { + color: #cd3431; +} +.m-block.m-info { border-left-color: #2f83cc; } +.m-block.m-info h3, .m-block.m-info h4, .m-block.m-info h5, .m-block.m-info h6, +.m-block.m-info h3 a, .m-block.m-info h4 a, .m-block.m-info h5 a, .m-block.m-info h6 a, +.m-text.m-info, .m-label.m-flat.m-info { + color: #2f83cc; +} +.m-block.m-dim { border-left-color: #747474; } +.m-block.m-dim, .m-text.m-dim, .m-label.m-flat.m-dim { + color: #747474; +} +.m-block.m-dim a, .m-text.m-dim a { color: #acacac; } +.m-block.m-dim a:hover, .m-block.m-dim a:focus, .m-block.m-dim a:active, +.m-text.m-dim a:hover, .m-text.m-dim a:focus, .m-text.m-dim a:active { + color: #747474; +} +.m-block.m-flat { border-color: transparent; } +.m-block.m-flat h3, .m-block.m-flat h4, .m-block.m-flat h5, .m-block.m-flat h6 { + color: #dcdcdc; +} +.m-block.m-default h3 a:hover, .m-block.m-default h3 a:focus, .m-block.m-default h3 a:active, +.m-block.m-default h4 a:hover, .m-block.m-default h4 a:focus, .m-block.m-default h4 a:active, +.m-block.m-default h5 a:hover, .m-block.m-default h5 a:focus, .m-block.m-default h5 a:active, +.m-block.m-default h6 a:hover, .m-block.m-default h6 a:focus, .m-block.m-default h6 a:active { + color: #a5c9ea; +} +.m-block.m-primary h3 a:hover, .m-block.m-primary h3 a:focus, .m-block.m-primary h3 a:active, +.m-block.m-primary h4 a:hover, .m-block.m-primary h4 a:focus, .m-block.m-primary h4 a:active, +.m-block.m-primary h5 a:hover, .m-block.m-primary h5 a:focus, .m-block.m-primary h5 a:active, +.m-block.m-primary h6 a:hover, .m-block.m-primary h6 a:focus, .m-block.m-primary h6 a:active { + color: #dcdcdc; +} +.m-block.m-success h3 a:hover, .m-block.m-success h3 a:focus, .m-block.m-success h3 a:active, +.m-block.m-success h4 a:hover, .m-block.m-success h4 a:focus, .m-block.m-success h4 a:active, +.m-block.m-success h5 a:hover, .m-block.m-success h5 a:focus, .m-block.m-success h5 a:active, +.m-block.m-success h6 a:hover, .m-block.m-success h6 a:focus, .m-block.m-success h6 a:active { + color: #acecbe; +} +.m-block.m-warning h3 a:hover, .m-block.m-warning h3 a:focus, .m-block.m-warning h3 a:active, +.m-block.m-warning h4 a:hover, .m-block.m-warning h4 a:focus, .m-block.m-warning h4 a:active, +.m-block.m-warning h5 a:hover, .m-block.m-warning h5 a:focus, .m-block.m-warning h5 a:active, +.m-block.m-warning h6 a:hover, .m-block.m-warning h6 a:focus, .m-block.m-warning h6 a:active { + color: #e9ecae; +} +.m-block.m-danger h3 a:hover, .m-block.m-danger h3 a:focus, .m-block.m-danger h3 a:active, +.m-block.m-danger h4 a:hover, .m-block.m-danger h4 a:focus, .m-block.m-danger h4 a:active, +.m-block.m-danger h5 a:hover, .m-block.m-danger h5 a:focus, .m-block.m-danger h5 a:active, +.m-block.m-danger h6 a:hover, .m-block.m-danger h6 a:focus, .m-block.m-danger h6 a:active { + color: #ff9391; +} +.m-block.m-info h3 a:hover, .m-block.m-info h3 a:focus, .m-block.m-info h3 a:active, +.m-block.m-info h4 a:hover, .m-block.m-info h4 a:focus, .m-block.m-info h4 a:active, +.m-block.m-info h5 a:hover, .m-block.m-info h5 a:focus, .m-block.m-info h5 a:active, +.m-block.m-info h6 a:hover, .m-block.m-info h6 a:focus, .m-block.m-info h6 a:active { + color: #5297d7; +} +div.m-button a, .m-label { color: #22272e; } +div.m-button.m-flat a { color: #dcdcdc; } +div.m-button.m-flat a:hover, div.m-button.m-default a:focus, div.m-button.m-default a:active { + color: #a5c9ea; +} +div.m-button.m-default a, .m-label:not(.m-flat).m-default { background-color: #dcdcdc; } +div.m-button.m-primary a, .m-label:not(.m-flat).m-primary { background-color: #a5c9ea; } +div.m-button.m-success a, .m-label:not(.m-flat).m-success { background-color: #3bd267; } +div.m-button.m-warning a, .m-label:not(.m-flat).m-warning { background-color: #c7cf2f; } +div.m-button.m-danger a, .m-label:not(.m-flat).m-danger { background-color: #cd3431; } +div.m-button.m-info a, .m-label:not(.m-flat).m-info { background-color: #2f83cc; } +div.m-button.m-dim a, .m-label:not(.m-flat).m-dim { background-color: #747474; } +div.m-button.m-default a:hover, div.m-button.m-default a:focus, div.m-button.m-default a:active { + background-color: #a5c9ea; +} +div.m-button.m-primary a:hover, div.m-button.m-primary a:focus, div.m-button.m-primary a:active { + background-color: #dcdcdc; +} +div.m-button.m-success a:hover, div.m-button.m-success a:focus, div.m-button.m-success a:active { + background-color: #acecbe; +} +div.m-button.m-warning a:hover, div.m-button.m-warning a:focus, div.m-button.m-warning a:active { + background-color: #e9ecae; +} +div.m-button.m-danger a:hover, div.m-button.m-danger a:focus, div.m-button.m-danger a:active { + background-color: #ff9391; +} +div.m-button.m-info a:hover, div.m-button.m-info a:focus, div.m-button.m-info a:active { + background-color: #5297d7; +} +div.m-button.m-dim a:hover, div.m-button.m-dim a:focus, div.m-button.m-dim a:active { + background-color: #acacac; +} +.m-note.m-default { background-color: #34424d; } +.m-note.m-default, +table.m-table tr.m-default td, table.m-table td.m-default, +table.m-table tr.m-default th, table.m-table th.m-default { + color: #dcdcdc; +} +.m-note.m-default a:hover, +table.m-table tr.m-default td a:hover, table.m-table td.m-default a:hover, +table.m-table tr.m-default th a:hover, table.m-table th.m-default a:hover, +.m-note.m-default a:focus, +table.m-table tr.m-default td a:focus, table.m-table td.m-default a:focus, +table.m-table tr.m-default th a:focus, table.m-table th.m-default a:focus, +.m-note.m-default a:active, +table.m-table tr.m-default td a:active, table.m-table td.m-default a:active, +table.m-table tr.m-default th a:active, table.m-table th.m-default a:active { + color: #a5c9ea; +} +.m-note.m-primary a, +table.m-table tr.m-primary td a, table.m-table td.m-primary a, +table.m-table tr.m-primary th a, table.m-table th.m-primary a { + color: #5b9dd9; +} +.m-note.m-primary, +table.m-table tr.m-primary td, table.m-table td.m-primary, +table.m-table tr.m-primary th, table.m-table th.m-primary { + background-color: #a5c2db; + color: #2f363f; +} +.m-note.m-primary a, +table.m-table tr.m-primary td a, table.m-table td.m-primary a, +table.m-table tr.m-primary th a, table.m-table th.m-primary a { + color: #2a75b6; +} +.m-note.m-primary a:hover, +table.m-table tr.m-primary td a:hover, table.m-table td.m-primary a:hover, +table.m-table tr.m-primary th a:hover, table.m-table th.m-primary a:hover, +.m-note.m-primary a:focus, +table.m-table tr.m-primary td a:focus, table.m-table td.m-primary a:focus, +table.m-table tr.m-primary th a:focus, table.m-table th.m-primary a:focus, +.m-note.m-primary a:active, +table.m-table tr.m-primary td a:active, table.m-table td.m-primary a:active, +table.m-table tr.m-primary th a:active, table.m-table th.m-primary a:active { + color: #2f363f; +} +.m-note.m-success, +table.m-table tr.m-success td, table.m-table td.m-success, +table.m-table tr.m-success th, table.m-table th.m-success { + background-color: #2a703f; + color: #acecbe; +} +.m-note.m-success a, +table.m-table tr.m-success td a, table.m-table td.m-success a, +table.m-table tr.m-success th a, table.m-table th.m-success a { + color: #3bd267; +} +.m-note.m-success a:hover, +table.m-table tr.m-success td a:hover, table.m-table td.m-success a:hover, +table.m-table tr.m-success th a:hover, table.m-table th.m-success a:hover, +.m-note.m-success a:focus, +table.m-table tr.m-success td a:focus, table.m-table td.m-success a:focus, +table.m-table tr.m-success th a:focus, table.m-table th.m-success a:focus, +.m-note.m-success a:active, +table.m-table tr.m-success td a:active, table.m-table td.m-success a:active, +table.m-table tr.m-success th a:active, table.m-table th.m-success a:active { + color: #acecbe; +} +.m-note.m-warning, table.m-table tr.m-warning td, table.m-table td.m-warning, + table.m-table tr.m-warning th, table.m-table th.m-warning { + background-color: #6d702a; + color: #e9ecae; +} +.m-note.m-warning a, table.m-table tr.m-warning td a, table.m-table td.m-warning a, + table.m-table tr.m-warning th a, table.m-table th.m-warning a { + color: #b8bf2b; +} +.m-note.m-warning a:hover, +table.m-table tr.m-warning td a:hover, table.m-table td.m-warning a:hover, +table.m-table tr.m-warning th a:hover, table.m-table th.m-warning a:hover, +.m-note.m-warning a:focus, +table.m-table tr.m-warning td a:focus, table.m-table td.m-warning a:focus, +table.m-table tr.m-warning th a:focus, table.m-table th.m-warning a:focus, +.m-note.m-warning a:active, +table.m-table tr.m-warning td a:active, table.m-table td.m-warning a:active, +table.m-table tr.m-warning th a:active, table.m-table th.m-warning a:active { + color: #e9ecae; +} +.m-note.m-danger, +table.m-table tr.m-danger td, table.m-table td.m-danger, +table.m-table tr.m-danger th, table.m-table th.m-danger { + background-color: #702b2a; + color: #ff9391; +} +.m-note.m-danger a, +table.m-table tr.m-danger td a, table.m-table td.m-danger a, +table.m-table tr.m-danger th a, table.m-table th.m-danger a { + color: #d85c59; +} +.m-note.m-danger a:hover, +table.m-table tr.m-danger td a:hover, table.m-table td.m-danger a:hover, +table.m-table tr.m-danger th a:hover, table.m-table th.m-danger a:hover, +.m-note.m-danger a:focus, +table.m-table tr.m-danger td a:focus, table.m-table td.m-danger a:focus, +table.m-table tr.m-danger th a:focus, table.m-table th.m-danger a:focus, +.m-note.m-danger a:active, +table.m-table tr.m-danger td a:active, table.m-table td.m-danger a:active, +table.m-table tr.m-danger th a:active, table.m-table th.m-danger a:active { + color: #ff9391; +} +.m-note.m-info, +table.m-table tr.m-info td, table.m-table td.m-info, +table.m-table tr.m-info th, table.m-table th.m-info { + background-color: #2a4f70; + color: #a5caeb; +} +.m-note.m-info a, +table.m-table tr.m-info td a, table.m-table td.m-info a, +table.m-table tr.m-info th a, table.m-table th.m-info a { + color: #5297d7; +} +.m-note.m-info a:hover, +table.m-table tr.m-info td a:hover, table.m-table td.m-info a:hover, +table.m-table tr.m-info th a:hover, table.m-table th.m-info a:hover, +.m-note.m-info a:focus, +table.m-table tr.m-info td a:focus, table.m-table td.m-info a:focus, +table.m-table tr.m-info th a:focus, table.m-table th.m-info a:focus, +.m-note.m-info a:active, +table.m-table tr.m-info td a:active, table.m-table td.m-info a:active, +table.m-table tr.m-info th a:active, table.m-table th.m-info a:active { + color: #a5caeb; +} +.m-note.m-dim, +table.m-table tr.m-dim td, table.m-table td.m-dim, +table.m-table tr.m-dim th, table.m-table th.m-dim { + background-color: #2d3236; + color: #747474; +} +.m-note.m-dim a, +table.m-table tr.m-dim td a, table.m-table td.m-dim a, +table.m-table tr.m-dim th a, table.m-table th.m-dim a { + color: #acacac; +} +.m-note.m-dim a:hover, +table.m-table tr.m-dim td a:hover, table.m-table td.m-dim a:hover, +table.m-table tr.m-dim th a:hover, table.m-table th.m-dim a:hover, +.m-note.m-dim a:focus, +table.m-table tr.m-dim td a:focus, table.m-table td.m-dim a:focus, +table.m-table tr.m-dim th a:focus, table.m-table th.m-dim a:focus, +.m-note.m-dim a:active, +table.m-table tr.m-dim td a:active, table.m-table td.m-dim a:active, +table.m-table tr.m-dim th a:active, table.m-table th.m-dim a:active { + color: #747474; +} +figure.m-figure.m-default::before { border-color: #34424d; } +figure.m-figure.m-default figcaption { color: #dcdcdc; } +figure.m-figure.m-primary::before { border-color: #a5c2db; } +figure.m-figure.m-primary figcaption { color: #a5c9ea; } +figure.m-figure.m-primary figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-success::before { border-color: #2a703f; } +figure.m-figure.m-success figcaption { color: #3bd267; } +figure.m-figure.m-success figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-warning:::before { border-color: #6d702a; } +figure.m-figure.m-warning figcaption { color: #c7cf2f; } +figure.m-figure.m-warning figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-danger:::before { border-color: #702b2a; } +figure.m-figure.m-danger figcaption { color: #cd3431; } +figure.m-figure.m-danger figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-info:::before { border-color: #2a4f70; } +figure.m-figure.m-info figcaption { color: #2f83cc; } +figure.m-figure.m-info figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-dim:::before { border-color: #2d3236; } +figure.m-figure.m-dim { color: #747474; } +figure.m-figure.m-dim a { color: #acacac; } +figure.m-figure.m-dim a:hover, figure.m-figure.m-dim a:focus, figure.m-figure.m-dim a:active { + color: #747474; +} +.m-math { fill: #dcdcdc; } +.m-math.m-default, .m-math g.m-default, .m-math rect.m-default, +div.m-plot svg .m-bar.m-default, +.m-graph g.m-edge polygon, +.m-graph g.m-node:not(.m-flat) ellipse, +.m-graph g.m-node:not(.m-flat) polygon, +.m-graph g.m-edge text, +.m-graph g.m-node.m-flat text, +.m-graph g.m-cluster text, +.m-graph.m-default g.m-edge polygon, +.m-graph.m-default g.m-node:not(.m-flat) ellipse, +.m-graph.m-default g.m-node:not(.m-flat) polygon, +.m-graph.m-default g.m-edge text, +.m-graph.m-default g.m-node.m-flat text, +.m-graph.m-default g.m-cluster text { + fill: #dcdcdc; +} +.m-graph g.m-edge polygon, +.m-graph g.m-edge path, +.m-graph g.m-node ellipse, +.m-graph g.m-node polygon, +.m-graph g.m-node polyline, +.m-graph g.m-cluster polygon, +.m-graph.m-default g.m-edge polygon, +.m-graph.m-default g.m-edge path, +.m-graph.m-default g.m-node ellipse, +.m-graph.m-default g.m-node polygon, +.m-graph.m-default g.m-node polyline, +.m-graph.m-default g.m-cluster polygon { + stroke: #dcdcdc; +} +.m-math.m-primary, .m-math g.m-primary, .m-math rect.m-primary, +div.m-plot svg .m-bar.m-primary, +.m-graph.m-primary g.m-edge polygon, +.m-graph.m-primary g.m-node:not(.m-flat) ellipse, +.m-graph.m-primary g.m-node:not(.m-flat) polygon, +.m-graph.m-primary g.m-edge text, +.m-graph.m-primary g.m-node.m-flat text, +.m-graph.m-primary g.m-cluster text { + fill: #a5c9ea; +} +.m-graph.m-primary g.m-edge polygon, +.m-graph.m-primary g.m-edge path, +.m-graph.m-primary g.m-node ellipse, +.m-graph.m-primary g.m-node polygon, +.m-graph.m-primary g.m-node polyline, +.m-graph.m-primary g.m-cluster polygon { + stroke: #a5c9ea; +} +.m-math.m-success, .m-math g.m-success, .m-math rect.m-success, +div.m-plot svg .m-bar.m-success, +.m-graph.m-success g.m-edge polygon, +.m-graph.m-success g.m-node:not(.m-flat) ellipse, +.m-graph.m-success g.m-node:not(.m-flat) polygon, +.m-graph.m-success g.m-edge text, +.m-graph.m-success g.m-node.m-flat text, +.m-graph.m-success g.m-cluster text { + fill: #3bd267; +} +.m-graph.m-success g.m-edge polygon, +.m-graph.m-success g.m-edge path, +.m-graph.m-success g.m-node ellipse, +.m-graph.m-success g.m-node polygon, +.m-graph.m-success g.m-node polyline, +.m-graph.m-success g.m-cluster polygon { + stroke: #3bd267; +} +.m-math.m-warning, .m-math g.m-warning, .m-math rect.m-warning, +div.m-plot svg .m-bar.m-warning, +.m-graph.m-warning g.m-edge polygon, +.m-graph.m-warning g.m-node:not(.m-flat) ellipse, +.m-graph.m-warning g.m-node:not(.m-flat) polygon, +.m-graph.m-warning g.m-edge text, +.m-graph.m-warning g.m-node.m-flat text, +.m-graph.m-warning g.m-cluster text { + fill: #c7cf2f; +} +.m-graph.m-warning g.m-edge polygon, +.m-graph.m-warning g.m-edge path, +.m-graph.m-warning g.m-node ellipse, +.m-graph.m-warning g.m-node polygon, +.m-graph.m-warning g.m-node polyline, +.m-graph.m-warning g.m-cluster polygon { + stroke: #c7cf2f; +} +.m-math.m-danger, .m-math g.m-danger, .m-math rect.m-danger, +div.m-plot svg .m-bar.m-danger, +.m-graph.m-danger g.m-edge polygon, +.m-graph.m-danger g.m-node:not(.m-flat) ellipse, +.m-graph.m-danger g.m-node:not(.m-flat) polygon, +.m-graph.m-danger g.m-edge text, +.m-graph.m-danger g.m-node.m-flat text, +.m-graph.m-danger g.m-cluster text { + fill: #cd3431; +} +.m-graph.m-danger g.m-edge polygon, +.m-graph.m-danger g.m-edge path, +.m-graph.m-danger g.m-node ellipse, +.m-graph.m-danger g.m-node polygon, +.m-graph.m-danger g.m-node polyline, +.m-graph.m-danger g.m-cluster polygon { + stroke: #cd3431; +} +.m-math.m-info, .m-math g.m-info, .m-math rect.m-info, +div.m-plot svg .m-bar.m-info, +.m-graph.m-info g.m-edge polygon, +.m-graph.m-info g.m-node:not(.m-flat) ellipse, +.m-graph.m-info g.m-node:not(.m-flat) polygon, +.m-graph.m-info g.m-edge text, +.m-graph.m-info g.m-node.m-flat text, +.m-graph.m-info g.m-cluster text { + fill: #2f83cc; +} +.m-graph.m-info g.m-edge polygon, +.m-graph.m-info g.m-edge path, +.m-graph.m-info g.m-node ellipse, +.m-graph.m-info g.m-node polygon, +.m-graph.m-info g.m-node polyline, +.m-graph.m-info g.m-cluster polygon { + stroke: #2f83cc; +} +.m-math.m-dim, .m-math g.m-dim, .m-math rect.m-dim, +div.m-plot svg .m-bar.m-dim, +.m-graph.m-dim g.m-edge polygon, +.m-graph.m-dim g.m-node:not(.m-flat) ellipse, +.m-graph.m-dim g.m-node:not(.m-flat) polygon, +.m-graph.m-dim g.m-edge text, +.m-graph.m-dim g.m-node.m-flat text, +.m-graph.m-dim g.m-cluster text { + fill: #747474; +} +.m-graph.m-dim g.m-edge polygon, +.m-graph.m-dim g.m-edge path, +.m-graph.m-dim g.m-node ellipse, +.m-graph.m-dim g.m-node polygon, +.m-graph.m-dim g.m-node polyline, +.m-graph.m-dim g.m-cluster polygon { + stroke: #747474; +} +.m-graph g.m-edge.m-default polygon, +.m-graph g.m-node.m-default:not(.m-flat) ellipse, +.m-graph g.m-node.m-default:not(.m-flat) polygon, +.m-graph g.m-edge.m-default text, +.m-graph g.m-node.m-default.m-flat text, +.m-graph g.m-cluster.m-default text { + fill: #dcdcdc; +} +.m-graph g.m-edge.m-default polygon, +.m-graph g.m-edge.m-default path, +.m-graph g.m-node.m-default ellipse, +.m-graph g.m-node.m-default polygon, +.m-graph g.m-node.m-default polyline, +.m-graph g.m-cluster.m-default polygon { + stroke: #dcdcdc; +} +.m-graph g.m-edge.m-primary polygon, +.m-graph g.m-node.m-primary:not(.m-flat) ellipse, +.m-graph g.m-node.m-primary:not(.m-flat) polygon, +.m-graph g.m-edge.m-primary text, +.m-graph g.m-node.m-primary.m-flat text, +.m-graph g.m-cluster.m-primary text { + fill: #a5c9ea; +} +.m-graph g.m-edge.m-primary polygon, +.m-graph g.m-edge.m-primary path, +.m-graph g.m-node.m-primary ellipse, +.m-graph g.m-node.m-primary polygon, +.m-graph g.m-node.m-primary polyline, +.m-graph g.m-cluster.m-primary polygon { + stroke: #a5c9ea; +} +.m-graph g.m-edge.m-success polygon, +.m-graph g.m-node.m-success:not(.m-flat) ellipse, +.m-graph g.m-node.m-success:not(.m-flat) polygon, +.m-graph g.m-edge.m-success text, +.m-graph g.m-node.m-success.m-flat text, +.m-graph g.m-cluster.m-success text { + fill: #3bd267; +} +.m-graph g.m-edge.m-success polygon, +.m-graph g.m-edge.m-success path, +.m-graph g.m-node.m-success ellipse, +.m-graph g.m-node.m-success polygon, +.m-graph g.m-node.m-success polyline, +.m-graph g.m-cluster.m-success polygon { + stroke: #3bd267; +} +.m-graph g.m-edge.m-warning polygon, +.m-graph g.m-node.m-warning:not(.m-flat) ellipse, +.m-graph g.m-node.m-warning:not(.m-flat) polygon, +.m-graph g.m-edge.m-warning text, +.m-graph g.m-node.m-warning.m-flat text, +.m-graph g.m-cluster.m-warning text { + fill: #c7cf2f; +} +.m-graph g.m-edge.m-warning polygon, +.m-graph g.m-edge.m-warning path, +.m-graph g.m-node.m-warning ellipse, +.m-graph g.m-node.m-warning polygon, +.m-graph g.m-node.m-warning polyline, +.m-graph g.m-cluster.m-warning polygon { + stroke: #c7cf2f; +} +.m-graph g.m-edge.m-danger polygon, +.m-graph g.m-node.m-danger:not(.m-flat) ellipse, +.m-graph g.m-node.m-danger:not(.m-flat) polygon, +.m-graph g.m-edge.m-danger text, +.m-graph g.m-node.m-danger.m-flat text, +.m-graph g.m-cluster.m-danger text { + fill: #cd3431; +} +.m-graph g.m-edge.m-danger polygon, +.m-graph g.m-edge.m-danger path, +.m-graph g.m-node.m-danger ellipse, +.m-graph g.m-node.m-danger polygon, +.m-graph g.m-node.m-danger polyline, +.m-graph g.m-cluster.m-danger polygon { + stroke: #cd3431; +} +.m-graph g.m-edge.m-info polygon, +.m-graph g.m-node.m-info:not(.m-flat) ellipse, +.m-graph g.m-node.m-info:not(.m-flat) polygon, +.m-graph g.m-edge.m-info text, +.m-graph g.m-node.m-info.m-flat text, +.m-graph g.m-cluster.m-info text { + fill: #2f83cc; +} +.m-graph g.m-edge.m-info polygon, +.m-graph g.m-edge.m-info path, +.m-graph g.m-node.m-info ellipse, +.m-graph g.m-node.m-info polygon, +.m-graph g.m-node.m-info polyline, +.m-graph g.m-cluster.m-info polygon { + stroke: #2f83cc; +} +.m-graph g.m-edge.m-dim polygon, +.m-graph g.m-node.m-dim:not(.m-flat) ellipse, +.m-graph g.m-node.m-dim:not(.m-flat) polygon, +.m-graph g.m-edge.m-dim text, +.m-graph g.m-node.m-dim.m-flat text, +.m-graph g.m-cluster.m-dim text { + fill: #747474; +} +.m-graph g.m-edge.m-dim polygon, +.m-graph g.m-edge.m-dim path, +.m-graph g.m-node.m-dim ellipse, +.m-graph g.m-node.m-dim polygon, +.m-graph g.m-node.m-dim polyline, +.m-graph g.m-cluster.m-dim polygon { + stroke: #747474; +} +p, ul, ol, dl, blockquote, pre, .m-code-figure, .m-console-figure, hr, .m-note, +.m-frame, .m-block, div.m-button, div.m-scroll, table.m-table, div.m-image, +img.m-image, svg.m-image, figure.m-figure, .m-imagegrid, div.m-math, +div.m-graph, div.m-plot { + margin-bottom: 1rem; +} +p:last-child, p.m-nopadb, ul:last-child, ul.m-nopadb, +ol:last-child, ol.m-nopadb, dl:last-child, dl.m-nopadb, +blockquote:last-child, blockquote.m-nopadb, pre:last-child, pre.m-nopadb, +.m-code-figure:last-child, .m-code-figure.m-nopadb, +.m-console-figure:last-child, .m-console-figure.m-nopadb, +hr:last-child, hr.m-nopadb, .m-note:last-child, .m-note.m-nopadb, +.m-frame:last-child, .m-frame.m-nopadb, .m-block:last-child, .m-block.m-nopadb, +div.m-button:last-child, div.m-button.m-nopadb, +div.m-scroll:last-child, div.m-scroll.m-nopadb, +table.m-table:last-child, table.m-table.m-nopadb, +img.m-image:last-child, img.m-image.m-nopadb, +svg.m-image:last-child, svg.m-image.m-nopadb, +div.m-image:last-child, div.m-image.m-nopadb, +figure.m-figure:last-child, figure.m-figure.m-nopadb, +.m-imagegrid:last-child, .m-imagegrid.m-nopadb, +div.m-math:last-child, div.m-math.m-nopadb, +div.m-graph:last-child, div.m-graph.m-nopadb, +div.m-plot:last-child, div.m-plot.m-nopadb { + margin-bottom: 0; +} +li > p:last-child, li > blockquote:last-child, li > pre:last-child, +li > .m-code-figure:last-child, li > .m-console-figure:last-child, +li > .m-note:last-child, li > .m-frame:last-child, li > .m-block:last-child, +li > div.m-button:last-child, li > div.m-scroll:last-child, li > table.m-table:last-child, +li > img.m-image:last-child, li > svg.m-image:last-child, li > div.m-image:last-child, +li > figure.m-figure:last-child, li > div.m-math:last-child, +li > div.m-graph:last-child, li > div.m-plot:last-child { + margin-bottom: 1rem; +} +li:last-child > p:last-child, li:last-child > p.m-nopadb, +li:last-child > blockquote:last-child, li:last-child > blockquote.m-nopadb, +li:last-child > pre:last-child, li:last-child > pre.m-nopadb, +li:last-child > .m-code-figure:last-child, li:last-child > .m-code-figure.m-nopadb, +li:last-child > .m-console-figure:last-child, li:last-child > .m-console-figure.m-nopadb, +li:last-child > .m-note:last-child, li:last-child > .m-note.m-nopadb, +li:last-child > .m-frame:last-child, li:last-child > .m-frame.m-nopadb, +li:last-child > .m-block:last-child, li:last-child > .m-block.m-nopadb, +li:last-child > div.m-button:last-child, li:last-child > div.m-button.m-nopadb, +li:last-child > div.m-scroll:last-child, li:last-child > div.m-scroll.m-nopadb, +li:last-child > table.m-table:last-child, li:last-child > table.m-table.m-nopadb, +li:last-child > img.m-image:last-child, li:last-child > img.m-image.m-nopadb, +li:last-child > svg.m-image:last-child, li:last-child > svg.m-image.m-nopadb, +li:last-child > div.m-image:last-child, li:last-child > div.m-image.m-nopadb, +li:last-child > figure.m-figure:last-child, li:last-child > figure.m-figure.m-nopadb, +li:last-child > div.m-math:last-child, li:last-child > div.m-math.m-nopadb, +li:last-child > div.m-graph:last-child, li:last-child > div.m-graph.m-nopadb, +li:last-child > div.m-plot:last-child, li:last-child > div.m-plot.m-nopadb { + margin-bottom: 0; +} + +body > header > nav { + width: 100%; + background-color: #22272e; + min-height: 3rem; +} +body > header > nav.m-navbar-landing, +body > header > nav.m-navbar-cover { + background-color: transparent; + position: relative; +} +body > header > nav.m-navbar-landing { + opacity: 0.8; +} +body > header > nav.m-navbar-cover { + background-color: rgba(34, 39, 46, 0.25); + opacity: 1; +} +body > header > nav.m-navbar-landing:hover, +body > header > nav.m-navbar-cover:hover { + background-color: rgba(34, 39, 46, 0.75); + opacity: 1; +} +body> header > nav.m-navbar-landing:target, +body> header > nav.m-navbar-cover:target { + background-color: #22272e; + opacity: 1; +} +body > header > nav.m-navbar-landing #m-navbar-brand.m-navbar-brand-hidden { + visibility: hidden; +} +body > header > nav.m-navbar-landing:target #m-navbar-brand.m-navbar-brand-hidden { + visibility: visible; +} +body > header > nav { + margin-left: auto; + margin-right: auto; + color: #ffffff; +} +body > header > nav a { + text-decoration: none; + text-transform: none; + display: inline-block; + vertical-align: middle; + line-height: 2.75rem; + color: #ffffff; +} +body > header > nav #m-navbar-brand, body > header > nav a#m-navbar-show, body > header > nav a#m-navbar-hide { + font-weight: 600; + font-size: 1.125rem; + padding-left: 1rem; + padding-right: 1rem; +} +body > header > nav a#m-navbar-brand, body > header > nav #m-navbar-brand a { + text-transform: uppercase; +} +body > header > nav a#m-navbar-brand img, body > header > nav #m-navbar-brand a img { + width: 1.75rem; + height: 1.75rem; + vertical-align: -22.5%; + margin-right: 0.5rem; +} +body > header > nav #m-navbar-brand a { + padding-left: 0; + padding-right: 0; +} +body > header > nav #m-navbar-brand .m-thin { + font-weight: normal; +} +body > header > nav #m-navbar-brand .m-breadcrumb { + color: #747474; +} +body > header > nav a#m-navbar-show::before, body > header > nav a#m-navbar-hide::before { + content:'\2630'; +} +body > header > nav #m-navbar-collapse { + padding-bottom: 1rem; +} +body > header > nav #m-navbar-collapse li { + border-style: solid; + border-color: transparent; + border-width: 0 0 0 0.25rem; + margin-left: -1rem; +} +body > header > nav #m-navbar-collapse li a { + border-style: solid; + border-color: transparent; + line-height: 1.5rem; + margin-left: -0.25rem; + padding-left: 0.75rem; + border-width: 0 0 0 0.25rem; + width: 100%; +} +body > header > nav #m-navbar-collapse li a#m-navbar-current { + color: #5b9dd9; + border-color: #5b9dd9; +} +body > header > nav ol { + list-style-type: none; + margin: 0; +} +body > header > nav ol ol { + padding-left: 1.5rem; +} +body > header > nav .m-row > [class*='m-col-'] { + padding-top: 0; + padding-bottom: 0; +} +body > header > nav a:hover, body > header > nav a:focus, body > header > nav a:active { + color: #a5c9ea; +} +body > header > nav #m-navbar-collapse li:hover { + border-color: #a5c9ea; +} +body > header > nav #m-navbar-collapse li a:hover, +body > header > nav #m-navbar-collapse li a:focus, +body > header > nav #m-navbar-collapse li a:active { + border-color: #a5c9ea; + background-color: #292f37; +} +body > header > nav.m-navbar-landing #m-navbar-collapse li a:hover, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:hover, +body > header > nav.m-navbar-landing #m-navbar-collapse li a:focus, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:focus, +body > header > nav.m-navbar-landing #m-navbar-collapse li a:active, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:active { + background-color: rgba(41, 47, 55, 0.5); +} +body > header > nav #m-navbar-hide { + display: none; +} +body > header > nav:target #m-navbar-collapse { + display: block; +} +body > header > nav:target #m-navbar-show { + display: none; +} +body > header > nav:target #m-navbar-hide { + display: inline-block; +} +@media screen and (min-width: 768px) { + body > header > nav #m-navbar-show, body > header > nav #m-navbar-hide, + body > header > nav:target #m-navbar-show, body > header > nav:target #m-navbar-hide { + display: none; + } + body > header > nav #m-navbar-collapse li a { + line-height: 2.75rem; + } + body > header > nav a, body > header > nav #m-navbar-collapse li a { + margin-left: 0; + padding-left: 1rem; + padding-right: 1rem; + white-space: nowrap; + } + body > header > nav #m-navbar-collapse { + padding-bottom: 0; + } + body > header > nav #m-navbar-collapse li ol { + background-color: #22272e; + } + body > header > nav #m-navbar-collapse ol ol li { + margin-left: 0; + padding-left: 0; + border-left-width: 0; + } + body > header > nav #m-navbar-collapse ol ol li a { + padding-left: 0.75rem; + } + body > header > nav #m-navbar-collapse > .m-row > ol > li { + margin-left: 0; + border-left-width: 0; + } + body > header > nav #m-navbar-collapse > .m-row > ol > li > a { + border-width: 0 0 0.25rem 0; + } + body > header > nav #m-navbar-collapse ol { + padding-left: 0; + padding-right: 0; + } + body > header > nav #m-navbar-collapse > .m-row > ol, body > header > nav #m-navbar-collapse > .m-row > ol > li { + float: left; + } + body > header > nav #m-navbar-collapse ol ol { + z-index: 99999; + position: absolute; + visibility: hidden; + } + body > header > nav #m-navbar-collapse li:hover ol { + visibility: visible; + } +} +body > footer { + width: 100%; +} +body > footer > nav { + padding-top: 1rem; + padding-bottom: 1rem; + font-size: 0.85rem; + text-align: center; + color: #c5c5c5; + background-color: #444e5c; +} +body > footer > nav h3, body > footer > nav h3 a { + text-transform: uppercase; + font-weight: normal; +} +body > footer > nav ul { + list-style-type: none; + padding: 0; + margin: 0; +} +body > footer > nav a { + text-decoration: none; + text-transform: none; + color: #ffffff; +} +body > footer > nav a:hover, body > footer > nav a:focus, body > footer > nav a:active { + color: #a5c9ea; +} +body > main { + padding-top: 1rem; + padding-bottom: 1rem; +} +article h1 { + font-size: 1.75rem; +} +article h1 .m-breadcrumb { + color: #747474; + font-weight: normal; +} +article h1 .m-breadcrumb a { + color: #a5c9ea; +} +article h1 .m-breadcrumb a:hover, article h1 a:focus, article h1 a:active { + color: #dcdcdc; +} +article > header h1 { + font-size: 2rem; + margin-bottom: 0.5rem; +} +article h1 a, article > header h1, article > header h1 a, +article section > h2, article section > h2 a, +article section > h3, article section > h3 a, +article section > h4, article section > h4 a, +article section > h5, article section > h5 a, +article section > h6, article section > h6 a { + color: #a5c9ea; +} +article h1 a:hover, article > header h1 a:hover, article > header h1 a:focus, article > header h1 a:active, +article section > h2 a:hover, article section > h2 a:focus, article section > h2 a:active, +article section > h3 a:hover, article section > h3 a:focus, article section > h3 a:active, +article section > h4 a:hover, article section > h4 a:focus, article section > h4 a:active, +article section > h5 a:hover, article section > h5 a:focus, article section > h5 a:active, +article section > h6 a:hover, article section > h6 a:focus, article section > h6 a:active { + color: #dcdcdc; +} +article > header .m-date { + display: block; + width: 2.5rem; + float: left; + text-align: center; + line-height: 95%; + font-size: 0.75rem; + font-weight: normal; + white-space: nowrap; + border-right-style: solid; + border-right-width: 0.125rem; + border-color: #a5c9ea; + padding-right: 0.75rem; + margin-top: -0.1rem; + margin-right: 0.75rem; + margin-bottom: 0.25rem; +} +article > header .m-date-day { + display: block; + font-weight: bold; + padding-top: 0.2rem; + padding-bottom: 0.15rem; + font-size: 1.25rem; +} +article > header p { + color: #f0f0f0; + font-size: 1.125rem; +} +article > header h1::after { + content: " "; + clear: both; + display: table; +} +article > footer { + color: #c5c5c5; +} +article > footer p { + font-style: italic; + font-size: 0.85rem; + text-indent: 0; +} +article section:target { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + padding-left: 0.75rem; + border-color: #a5c9ea; +} +article h1 a, article > header h1 a, article section > h2 a, article section > h3 a, +article section > h4 a, article section > h5 a, article section > h6 a { + text-decoration: none; +} +#m-landing-image, #m-cover-image, article#m-jumbo > header #m-jumbo-image { + background-size: cover; + background-color: #0f1217; + background-position: center center; + background-repeat: no-repeat; + margin-top: -4rem; + padding-top: 5rem; +} +#m-landing-image { + color: #ffffff; +} +#m-cover-image { + height: 30rem; + margin-bottom: -26rem; +} +#m-landing-cover h1 { + font-size: 2.8rem; + margin-top: -0.5rem; + padding-left: 1.5rem; + padding-bottom: 1rem; + text-transform: lowercase; +} +#m-landing-cover { + padding-bottom: 10rem; + margin-bottom: -6rem; +} +article#m-jumbo { + margin-top: -1rem; +} +#m-landing-cover, #m-cover-image > div, article#m-jumbo > header #m-jumbo-cover { + background: linear-gradient(transparent 0%, transparent 50%, #2f363f 100%); + width: 100%; + height: 100%; +} +article#m-jumbo > header h1, article#m-jumbo > header h2 { + text-align: center; + font-weight: bold; +} +article#m-jumbo > header a { + text-decoration: none; +} +article#m-jumbo > header #m-jumbo-cover { + padding-bottom: 5rem; +} +article#m-jumbo > header #m-jumbo-image { + font-size: 2.5vmin; + margin-bottom: -3rem; +} +article#m-jumbo > header h1 { + font-size: 10vmin; +} +article#m-jumbo > header h2 { + font-size: 3vmin; +} +@media screen and (max-height: 640px) , screen and (max-width: 640px) { + article#m-jumbo > header h1 { + font-size: 3rem; + } + article#m-jumbo > header #m-jumbo-image, article#m-jumbo > header h2 { + font-size: 1rem; + } +} +article#m-jumbo > header, article#m-jumbo > header h1, article#m-jumbo > header a { + color: #ffffff; +} +article#m-jumbo > header a:hover, article#m-jumbo > header a:focus, article#m-jumbo > header a:active { + color: #f0f0f0; +} +article#m-jumbo.m-inverted > header, article#m-jumbo.m-inverted > header h1, article#m-jumbo.m-inverted > header a { + color: #000000; +} +article#m-jumbo.m-inverted > header a:hover, article#m-jumbo.m-inverted > header a:focus, article#m-jumbo.m-inverted > header a:active { + color: #0f0f0f; +} +.m-landing-news h3 a { + color: #dcdcdc; + text-decoration: none; + text-transform: uppercase; +} +.m-landing-news h3 a:hover, .m-landing-news h3 a:hover, .m-landing-news h3 a:focus, .m-landing-news h3 a:active { + color: #a5c9ea; +} +.m-landing-news time { + display: inline-block; + margin-left: 1rem; + float: right; +} +.m-article-pagination { + text-align: center; + padding: 1rem; +} +nav.m-navpanel { + text-align: center; +} +nav.m-navpanel h3 { + text-transform: uppercase; + font-weight: normal; +} +nav.m-navpanel ol { + text-transform: lowercase; +} +nav.m-navpanel ol, nav.m-navpanel ul { + list-style-type: none; + padding: 0; +} +nav.m-navpanel a { + color: #ffffff; + text-decoration: none; +} +nav.m-navpanel a:hover, nav.m-navpanel a:focus, nav.m-navpanel a:active { + color: #a5c9ea; +} +ul.m-tagcloud li { display: inline; } +ul.m-tagcloud li.m-tag-1 { font-size: 0.75rem; } +ul.m-tagcloud li.m-tag-2 { font-size: 0.825rem; } +ul.m-tagcloud li.m-tag-3 { font-size: 1rem; } +ul.m-tagcloud li.m-tag-4 { font-size: 1.25rem; } +ul.m-tagcloud li.m-tag-5 { font-size: 1.5rem; } +article section:target figure.m-code-figure, article section:target figure.m-console-figure { + z-index: 1; +} +article, article > header, article section { margin-bottom: 1rem; } +article:last-child, article section:last-child { margin-bottom: 0; } +.m-container-inflatable section:target > .m-note, +.m-container-inflatable section:target > .m-frame, +.m-container-inflatable section:target > .m-block, +.m-container-inflatable section:target > pre, +.m-container-inflatable section:target > .m-code-figure > pre:first-child, +.m-container-inflatable section:target > .m-console-figure > pre:first-child, +.m-container-inflatable section:target section > .m-note, +.m-container-inflatable section:target section > .m-frame, +.m-container-inflatable section:target section > .m-block, +.m-container-inflatable section:target section > pre, +.m-container-inflatable section:target section > .m-code-figure > pre:first-child, +.m-container-inflatable section:target section > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-center-'] > .m-note, +.m-container-inflatable section:target [class*='m-center-'] > .m-frame, +.m-container-inflatable section:target [class*='m-center-'] > .m-block, +.m-container-inflatable section:target [class*='m-center-'] > pre, +.m-container-inflatable section:target [class*='m-center-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-center-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-left-'] > .m-note, +.m-container-inflatable section:target [class*='m-left-'] > .m-frame, +.m-container-inflatable section:target [class*='m-left-'] > .m-block, +.m-container-inflatable section:target [class*='m-left-'] > pre, +.m-container-inflatable section:target [class*='m-left-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-left-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-right-'] > .m-note, +.m-container-inflatable section:target [class*='m-right-'] > .m-frame, +.m-container-inflatable section:target [class*='m-right-'] > .m-block, +.m-container-inflatable section:target [class*='m-right-'] > pre, +.m-container-inflatable section:target [class*='m-right-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-right-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target .m-container-inflate > .m-note, +.m-container-inflatable section:target .m-container-inflate > .m-frame, +.m-container-inflatable section:target .m-container-inflate > .m-block, +.m-container-inflatable section:target .m-container-inflate > pre, +.m-container-inflatable section:target .m-container-inflate > .m-code-figure > pre:first-child, +.m-container-inflatable section:target .m-container-inflate > .m-console-figure > pre:first-child { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 0.75rem; +} +.m-container-inflatable section:target > .m-code-figure::before, +.m-container-inflatable section:target > .m-console-figure::before, +.m-container-inflatable section:target section > .m-code-figure::before, +.m-container-inflatable section:target section > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > .m-console-figure::before, +.m-container-inflatable section:target .m-container-inflate > .m-code-figure::before, +.m-container-inflatable section:target .m-container-inflate > .m-console-figure::before { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-width: 0.25rem; +} +.m-container-inflatable section:target > .m-code-figure > pre.m-nopad, +.m-container-inflatable section:target > .m-console-figure > pre.m-nopad { + margin-left: -0.75rem; + padding-left: -0.75rem; +} +@media screen and (min-width: 576px) { + .m-container-inflatable section:target .m-center-s > .m-note, + .m-container-inflatable section:target .m-center-s > pre, + .m-container-inflatable section:target .m-center-s > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-s > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-s > .m-block, + .m-container-inflatable section:target .m-right-s > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-s > .m-frame, + .m-container-inflatable section:target .m-right-s > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-s > .m-block, + .m-container-inflatable section:target .m-right-s > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-s > .m-note, + .m-container-inflatable section:target .m-right-s > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-s > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable section:target .m-center-m > .m-note, + .m-container-inflatable section:target .m-center-m > pre, + .m-container-inflatable section:target .m-center-m > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-m > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-m > .m-block, + .m-container-inflatable section:target .m-right-m > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-m > .m-frame, + .m-container-inflatable section:target .m-right-m > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-m > .m-block, + .m-container-inflatable section:target .m-right-m > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-m > .m-note, + .m-container-inflatable section:target .m-right-m > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-m > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable section:target .m-center-l > .m-note, + .m-container-inflatable section:target .m-center-l > pre, + .m-container-inflatable section:target .m-center-l > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-l > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-l > .m-block, + .m-container-inflatable section:target .m-right-l > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-l > .m-frame, + .m-container-inflatable section:target .m-right-l > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-l > .m-block, + .m-container-inflatable section:target .m-right-l > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-l > .m-note, + .m-container-inflatable section:target .m-right-l > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-l > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +.m-container-inflatable section:target > figure.m-code-figure::before, +.m-container-inflatable section:target > figure.m-console-figure::before, +.m-container-inflatable section:target section > figure.m-code-figure::before, +.m-container-inflatable section:target section > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > figure.m-console-figure::before, +.m-container-inflatable section:target .m-container-inflatable > figure.m-code-figure::before, +.m-container-inflatable section:target .m-container-inflatable > figure.m-console-figure::before { + border-left-color: #405363; +} +@media screen and (min-width: 576px) { + .m-container-inflatable section:target .m-center-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-s > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable section:target .m-center-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-m > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable section:target .m-center-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-l > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +.m-container-inflatable section:target pre, +.m-container-inflatable section:target figure.m-code-figure > pre:first-child, +.m-container-inflatable section:target figure.m-console-figure > pre:first-child { + border-color: #405363; +} +.m-container-inflatable section:target .m-note.m-default { + border-color: #405363; +} +.m-container-inflatable section:target .m-note.m-primary { + border-color: #a5c9ea; +} +.m-container-inflatable section:target .m-note.m-success { + border-color: #3bd267; +} +.m-container-inflatable section:target .m-note.m-warning { + border-color: #c7cf2f; +} +.m-container-inflatable section:target .m-note.m-danger { + border-color: #cd3431; +} +.m-container-inflatable section:target .m-note.m-info { + border-color: #2f83cc; +} +.m-container-inflatable section:target .m-note.m-dim { + border-color: #747474; +} + +.m-code .hll { background-color: #34424d } +.m-code .c { color: #a5c9ea } +.m-code .k { color: #ffffff; font-weight: bold } +.m-code .n { color: #dcdcdc } +.m-code .o { color: #aaaaaa } +.m-code .p { color: #aaaaaa } +.m-code .ch { color: #a5c9ea } +.m-code .cm { color: #a5c9ea } +.m-code .cp { color: #3bd267 } +.m-code .cpf { color: #c7cf2f } +.m-code .c1 { color: #a5c9ea } +.m-code .cs { color: #a5c9ea } +.m-code .gd { color: #cd3431 } +.m-code .ge { color: #e6e6e6; font-style: italic } +.m-code .gh { color: #ffffff; font-weight: bold } +.m-code .gi { color: #3bd267 } +.m-code .gs { color: #e6e6e6; font-weight: bold } +.m-code .gu { color: #5b9dd9 } +.m-code .kc { color: #ffffff; font-weight: bold } +.m-code .kd { color: #ffffff; font-weight: bold } +.m-code .kn { color: #ffffff; font-weight: bold } +.m-code .kp { color: #ffffff; font-weight: bold } +.m-code .kr { color: #ffffff; font-weight: bold } +.m-code .kt { color: #ffffff; font-weight: bold } +.m-code .m { color: #c7cf2f } +.m-code .s { color: #e07f7c } +.m-code .na { color: #dcdcdc; font-weight: bold } +.m-code .nb { color: #ffffff; font-weight: bold } +.m-code .nc { color: #dcdcdc; font-weight: bold } +.m-code .no { color: #dcdcdc } +.m-code .nd { color: #dcdcdc } +.m-code .ni { color: #dcdcdc } +.m-code .ne { color: #dcdcdc } +.m-code .nf { color: #dcdcdc } +.m-code .nl { color: #dcdcdc } +.m-code .nn { color: #dcdcdc } +.m-code .nx { color: #dcdcdc } +.m-code .py { color: #dcdcdc } +.m-code .nt { color: #dcdcdc; font-weight: bold } +.m-code .nv { color: #c7cf2f } +.m-code .ow { color: #dcdcdc; font-weight: bold } +.m-code .mb { color: #c7cf2f } +.m-code .mf { color: #c7cf2f } +.m-code .mh { color: #c7cf2f } +.m-code .mi { color: #c7cf2f } +.m-code .mo { color: #c7cf2f } +.m-code .sa { color: #e07f7c } +.m-code .sb { color: #e07f7c } +.m-code .sc { color: #e07cdc } +.m-code .dl { color: #e07f7c } +.m-code .sd { color: #e07f7c } +.m-code .s2 { color: #e07f7c } +.m-code .se { color: #e07cdc } +.m-code .sh { color: #e07f7c } +.m-code .si { color: #a5c9ea } +.m-code .sx { color: #e07f7c } +.m-code .sr { color: #e07f7c } +.m-code .s1 { color: #e07f7c } +.m-code .ss { color: #e07f7c } +.m-code .bp { color: #ffffff; font-weight: bold } +.m-code .fm { color: #dcdcdc } +.m-code .vc { color: #c7cf2f } +.m-code .vg { color: #c7cf2f } +.m-code .vi { color: #c7cf2f } +.m-code .vm { color: #c7cf2f } +.m-code .il { color: #c7cf2f } + +.m-console .hll { background-color: #ffffcc } +.m-console .g-AnsiBackgroundBlack { background-color: #232627 } +.m-console .g-AnsiBackgroundBlue { background-color: #1d99f3 } +.m-console .g-AnsiBackgroundBrightBlack { background-color: #7f8c8d } +.m-console .g-AnsiBackgroundBrightBlue { background-color: #3daee9 } +.m-console .g-AnsiBackgroundBrightCyan { background-color: #16a085 } +.m-console .g-AnsiBackgroundBrightGreen { background-color: #1cdc9a } +.m-console .g-AnsiBackgroundBrightMagenta { background-color: #8e44ad } +.m-console .g-AnsiBackgroundBrightRed { background-color: #c0392b } +.m-console .g-AnsiBackgroundBrightWhite { background-color: #ffffff } +.m-console .g-AnsiBackgroundBrightYellow { background-color: #fdbc4b } +.m-console .g-AnsiBackgroundCyan { background-color: #1abc9c } +.m-console .g-AnsiBackgroundGreen { background-color: #11d116 } +.m-console .g-AnsiBackgroundMagenta { background-color: #9b59b6 } +.m-console .g-AnsiBackgroundRed { background-color: #ed1515 } +.m-console .g-AnsiBackgroundWhite { background-color: #fcfcfc } +.m-console .g-AnsiBackgroundYellow { background-color: #f67400 } +.m-console .g-AnsiBlack { color: #232627 } +.m-console .g-AnsiBlue { color: #1d99f3 } +.m-console .g-AnsiBrightBlack { color: #7f8c8d; font-weight: bold } +.m-console .g-AnsiBrightBlue { color: #3daee9; font-weight: bold } +.m-console .g-AnsiBrightCyan { color: #16a085; font-weight: bold } +.m-console .g-AnsiBrightDefault { color: #ffffff; font-weight: bold } +.m-console .g-AnsiBrightGreen { color: #1cdc9a; font-weight: bold } +.m-console .g-AnsiBrightMagenta { color: #8e44ad; font-weight: bold } +.m-console .g-AnsiBrightRed { color: #c0392b; font-weight: bold } +.m-console .g-AnsiBrightWhite { color: #ffffff; font-weight: bold } +.m-console .g-AnsiBrightYellow { color: #fdbc4b; font-weight: bold } +.m-console .g-AnsiCyan { color: #1abc9c } +.m-console .g-AnsiGreen { color: #11d116 } +.m-console .g-AnsiMagenta { color: #9b59b6 } +.m-console .g-AnsiRed { color: #ed1515 } +.m-console .g-AnsiWhite { color: #fcfcfc } +.m-console .g-AnsiYellow { color: #f67400 } +.m-console .go { color: #fcfcfc } +.m-console .gp { color: #16a085; font-weight: bold } +.m-console .w { color: #fcfcfc } + +a.m-doc, a.m-doc-self, a.m-doc-external, +ul.m-doc li.m-doc-expansible > a:first-child, ul.m-doc li.m-doc-collapsible > a:first-child, +.m-code.m-inverted.m-doc-include > a { + text-decoration: none; +} +a.m-doc, a.m-doc-self { + font-weight: bold; +} +.m-thin a.m-doc, .m-thin a.m-doc-self { + font-weight: normal; +} +ul.m-doc li.m-doc-expansible > a:first-child, +ul.m-doc li.m-doc-collapsible > a:first-child, +ul.m-doc li.m-doc-expansible > a:first-child:hover, +ul.m-doc li.m-doc-expansible > a:first-child:focus, +ul.m-doc li.m-doc-expansible > a:first-child:active, +ul.m-doc li.m-doc-collapsible > a:first-child:hover, +ul.m-doc li.m-doc-collapsible > a:first-child:focus, +ul.m-doc li.m-doc-collapsible > a:first-child:active { + color: #dcdcdc; +} +a.m-doc-self, +ul.m-doc li.m-doc-expansible > a:first-child::before, +ul.m-doc li.m-doc-collapsible > a:first-child::before { + color: #a5c9ea; +} +a.m-doc-self:hover, a.m-doc-self:focus, a.m-doc-self:active, +ul.m-doc li.m-doc-expansible > a:first-child:hover::before, +ul.m-doc li.m-doc-expansible > a:first-child:focus::before, +ul.m-doc li.m-doc-expansible > a:first-child:active::before, +ul.m-doc li.m-doc-collapsible > a:first-child:hover::before, +ul.m-doc li.m-doc-collapsible > a:first-child:focus::before, +ul.m-doc li.m-doc-collapsible > a:first-child:active::before { + color: #dcdcdc; +} +h3 a.m-doc-external { + font-weight: normal; +} +span.m-doc-wrap-bumper { + margin-right: -1rem; +} +span.m-doc-wrap { + margin-left: 1rem; + display: inline-block; + vertical-align: text-top; + white-space: pre-line; + max-width: 100%; +} +dl.m-doc dd { + margin-bottom: 0.5rem; +} +dl.m-doc dd { + margin-left: 0; + padding-left: 2.5rem; +} +dl.m-doc dt:target, dl.m-doc dt:target + dd { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + border-color: #a5c9ea; +} +dl.m-doc dt:target { padding-left: 0.75rem; } +dl.m-doc dt:target + dd { padding-left: 3.25rem; } +ul.m-doc { + list-style: none; + margin-left: 1.0375rem; + padding-left: 0.9rem; + border-left-color: #405363; + border-left-width: 0.0625rem; + border-left-style: solid; +} +ul.m-doc li { + text-indent: -1rem; + padding-left: 1rem; +} +ul.m-doc li.m-doc-expansible > ul { + display: none; +} +ul.m-doc li.m-doc-expansible, ul.m-doc li.m-doc-collapsible { + padding-left: 0.6rem; +} +ul.m-doc li.m-doc-expansible > ul.m-doc, ul.m-doc li.m-doc-collapsible > ul.m-doc { + margin-left: 0.5rem; +} +ul.m-doc li.m-doc-expansible > a:first-child::before, ul.m-doc li.m-doc-collapsible > a:first-child::before { + background-color: #2f363f; + display: inline-block; + width: 0.4rem; + font-weight: bold; +} +ul.m-doc li.m-doc-expansible > a:first-child::before { content: '⊕'; } +ul.m-doc li.m-doc-collapsible > a:first-child::before { content: '⊖'; } +h1 .m-doc-template, h1 .m-doc-include { + font-size: 1.3rem; + font-weight: normal; +} +h1 .m-doc-include:last-child { + margin-bottom: -0.5rem; +} +h3 .m-doc-template, h3 .m-doc-include { + font-size: 1rem; + font-weight: normal; +} +.m-doc-template, dl.m-doc dd, ul.m-doc li > span.m-doc { + color: #747474; +} +dl.m-doc dd svg.m-math, ul.m-doc li > span.m-doc svg.m-math { + fill: #747474; +} +.m-doc-template a, dl.m-doc dd a, ul.m-doc li > span.m-doc a { + color: #acacac; +} +.m-doc-template a:hover, .m-doc-template a:focus, .m-doc-template a:active, +dl.m-doc dd a:hover, dl.m-doc dd a:focus, dl.m-doc dd a:active, +ul.m-doc li > span.m-doc a:hover, ul.m-doc li > span.m-doc a:focus, ul.m-doc li > span.m-doc a:active { + color: #747474; +} +.m-code.m-inverted.m-doc-include > a:link, +.m-code.m-inverted.m-doc-include > a:visited { + opacity: 0.6666; +} +.m-code.m-inverted.m-doc-include > a:hover, +.m-code.m-inverted.m-doc-include > a:focus, +.m-code.m-inverted.m-doc-include > a:active { + opacity: 1; +} +article section.m-doc-details > div { + margin-top: 0; + margin-left: 0; + margin-right: 0; + position: relative; + padding: 1rem; +} +article section.m-doc-details > div::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #282e36; +} +article section.m-doc-details > div > h3:first-child { + position: relative; + margin: -1rem -1rem 1rem -1rem; + padding: 0.5rem 1rem; + background-color: #282e36; + border-top-left-radius: 0.2rem; + border-top-right-radius: 0.2rem; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +article section.m-doc-details:target { + border-color: transparent; +} +article section.m-doc-details:target > div { + z-index: 1; +} +.m-container-inflatable > .m-row > [class*='m-col-'] section.m-doc-details > div { + margin-left: -1rem; + margin-right: -1rem; +} +.m-container-inflatable section.m-doc-details:target > div > h3:first-child, +.m-container-inflatable section.m-doc-details:target section > div > h3:first-child { + margin-left: -1.0rem; + border-left-style: solid; + border-left-color: #dcdcdc; + border-left-width: 0.25rem; + padding-left: 0.75rem; +} +.m-container-inflatable section.m-doc-details:target > div::before, +.m-container-inflatable section-dox-details:target section > div.m::before { + border-left-width: 0.25rem; + border-left-color: #a5c9ea; +} +a.m-doc-search-icon { + padding-left: 1rem; + padding-right: 1rem; +} +a.m-doc-search-icon svg { + fill: #ffffff; +} +body > header > nav #m-navbar-collapse a.m-doc-search-icon svg { + vertical-align: -5%; +} +a.m-doc-search-icon:focus svg, a.m-doc-search-icon:hover svg, a.m-doc-search-icon:active svg { + fill: #a5c9ea; +} +.m-doc-search { + display: none; + z-index: 10; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(34, 39, 46, 0.75); +} +.m-doc-search:target { + display: block; +} +.m-doc-search > a { + display: block; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.m-doc-search-header { + margin-top: 2.5rem; + padding: 0.5rem 1rem; + height: 2rem; +} +.m-doc-search-header > div:first-child { + float: right; +} +.m-doc-search-content { + background-color: #22272e; + border-radius: 0.2rem; + padding: 1rem; +} +.m-doc-search input { + width: 100%; + height: 3rem; + font-size: 1.2rem; + border-width: 0; + color: #dcdcdc; + background-color: #34424d; + border-radius: 0.2rem; + margin-bottom: 1rem; + padding: 0 1rem; +} +.m-doc-search #search-notfound { + display: none; +} +.m-doc-search ul#search-results { + list-style-type: none; + padding-left: 0; + max-height: calc(100vh - 12.5rem); + overflow-y: auto; + display: none; +} +.m-doc-search ul#search-results li a { + display: block; + padding-left: 1rem; + padding-right: 1rem; + text-decoration: none; + width: 100%; + line-height: 1.5rem; + color: #dcdcdc; +} +.m-doc-search ul#search-results li a > div { + white-space: nowrap; + overflow: hidden; +} +.m-doc-search ul#search-results li a > div:not(.m-doc-search-alias) { + direction: rtl; +} +.m-doc-search ul#search-results li a .m-label { + float: right; + line-height: 1rem; + margin-top: 0.1rem; + margin-left: 0.25rem; +} +.m-doc-search ul#search-results li a .m-label.m-flat { + margin-right: -0.75rem; +} +.m-doc-search ul#search-results li#search-current a { + background-color: #34424d; +} +.m-doc-search ul#search-results li#search-current.m-doc-search-copied a { + background-color: #2a703f; +} +.m-doc-search-typed { + color: #5b9dd9; +} +.m-doc-search input[type="search"] { -webkit-appearance: textfield; } +.m-doc-search input[type="search"]::-webkit-search-decoration, +.m-doc-search input[type="search"]::-webkit-search-cancel-button, +.m-doc-search input[type="search"]::-webkit-search-results-button, +.m-doc-search input[type="search"]::-webkit-search-results-decoration { + display: none; +} diff --git a/modules.html b/modules.html new file mode 100644 index 0000000..bf15202 --- /dev/null +++ b/modules.html @@ -0,0 +1,114 @@ + + + + + ScStw shared libraries + + + + + + + +
+
+
+
+
+

Modules

+
    +
+ +
+
+
+
+ + + +
+ + diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 0000000..f328b64 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,114 @@ + + + + + ScStw shared libraries + + + + + + + +
+
+
+
+
+

Namespaces

+
    +
+ +
+
+
+
+ + + +
+ + diff --git a/pages.html b/pages.html new file mode 100644 index 0000000..c061bc3 --- /dev/null +++ b/pages.html @@ -0,0 +1,114 @@ + + + + + ScStw shared libraries + + + + + + + +
+
+
+
+
+

Pages

+
    +
+ +
+
+
+
+ + + +
+ + diff --git a/refman.pdf b/refman.pdf new file mode 100644 index 0000000..081ef06 Binary files /dev/null and b/refman.pdf differ diff --git a/search-v2.js b/search-v2.js new file mode 100644 index 0000000..3c8fd24 --- /dev/null +++ b/search-v2.js @@ -0,0 +1,897 @@ +/* + This file is part of m.css. + + Copyright © 2017, 2018, 2019, 2020, 2021, 2022 + Vladimír VondruÅ¡ + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +"use strict"; /* it summons the Cthulhu in a proper way, they say */ + +var Search = { + formatVersion: 2, /* the data filename contains this number too */ + + dataSize: 0, /* used mainly by tests, not here */ + symbolCount: '…', + trie: null, + map: null, + mapFlagsOffset: null, + typeMap: null, + maxResults: 0, + + /* Type sizes and masks. The data is always fetched as 16/32bit number and + then masked to 1, 2, 3 or 4 bytes. Fortunately on LE a mask is enough, + on BE we'd have to read N bytes before and then mask. */ + nameSizeBytes: null, + nameSizeMask: null, + resultIdBytes: null, + resultIdMask: null, + fileOffsetBytes: null, + fileOffsetMask: null, + lookaheadBarrierMask: null, + + /* Always contains at least the root node offset and then one node offset + per entered character */ + searchString: '', + searchStack: [], + + /* So items don't get selected right away when a cursor is over results but + only after mouse moves */ + mouseMovedSinceLastRender: false, + + /* Whether we can go back in history in order to hide the search box or + not. We can't do that if we arrived directly on #search from outside. */ + canGoBackToHideSearch: false, + + /* Autocompletion in the input field is whitelisted only for character + input (so not deletion, cut, or anything else). This is flipped in the + onkeypress event and reset after each oninput event. */ + autocompleteNextInputEvent: false, + + init: function(buffer, maxResults) { + let view = new DataView(buffer); + + /* The file is too short to contain at least the headers and empty + sections */ + if(view.byteLength < 31) { + console.error("Search data too short"); + return false; + } + + if(view.getUint8(0) != 'M'.charCodeAt(0) || + view.getUint8(1) != 'C'.charCodeAt(0) || + view.getUint8(2) != 'S'.charCodeAt(0)) { + console.error("Invalid search data signature"); + return false; + } + + if(view.getUint8(3) != this.formatVersion) { + console.error("Invalid search data version"); + return false; + } + + /* Fetch type sizes. The only value that can fail is result ID byte + count, where value of 3 has no assigned meaning. */ + let typeSizes = view.getUint8(4, true); + if((typeSizes & 0x01) >> 0 == 0) { + this.fileOffsetBytes = 3; + this.fileOffsetMask = 0x00ffffff; + this.lookaheadBarrierMask = 0x00800000; + } else /* (typeSizes & 0x01) >> 0 == 1 */ { + this.fileOffsetBytes = 4; + this.fileOffsetMask = 0xffffffff; + this.lookaheadBarrierMask = 0x80000000; + } + if((typeSizes & 0x06) >> 1 == 0) { + this.resultIdBytes = 2; + this.resultIdMask = 0x0000ffff; + } else if((typeSizes & 0x06) >> 1 == 1) { + this.resultIdBytes = 3; + this.resultIdMask = 0x00ffffff; + } else if((typeSizes & 0x06) >> 1 == 2) { + this.resultIdBytes = 4; + this.resultIdMask = 0xffffffff; + } else /* (typeSizes & 0x06) >> 1 == 3 */ { + console.error("Invalid search data result ID byte value"); + return false; + } + if((typeSizes & 0x08) >> 3 == 0) { + this.nameSizeBytes = 1; + this.nameSizeMask = 0x00ff; + } else /* (typeSizes & 0x08) >> 3 == 1 */ { + this.nameSizeBytes = 2; + this.nameSizeMask = 0xffff; + } + + /* Separate the data into the trie and the result / type map. Because + we're reading larger values than there might be and then masking out + the high bytes, keep extra 1/2 byte padding at the end to avoid + OOB errors. */ + let mapOffset = view.getUint32(12, true); + let typeMapOffset = view.getUint32(16, true); + /* There may be a 3-byte file offset at the end of the trie which we'll + read as 32-bit, add one safety byte in that case */ + this.trie = new DataView(buffer, 20, mapOffset - 20 + (4 - this.fileOffsetBytes)); + /* There may be a 3-byte file size (for zero results) which we'll read + as 32-bit, add one safety byte in that case */ + this.map = new DataView(buffer, mapOffset, typeMapOffset - mapOffset + (4 - this.fileOffsetBytes)); + /* No variable-size types in the type map at the moment */ + this.typeMap = new DataView(buffer, typeMapOffset); + + /* Offset of the first result map item is after N + 1 offsets and N + flags, calculate flag offset from that */ + this.mapFlagsOffset = this.fileOffsetBytes*(((this.map.getUint32(0, true) & this.fileOffsetMask) - this.fileOffsetBytes)/(this.fileOffsetBytes + 1) + 1); + + /* Set initial properties */ + this.dataSize = buffer.byteLength; + this.symbolCount = view.getUint32(8, true) + " symbols (" + Math.round(this.dataSize/102.4)/10 + " kB)"; + this.maxResults = maxResults ? maxResults : 100; + this.searchString = ''; + this.searchStack = [this.trie.getUint32(0, true)]; + + /* istanbul ignore if */ + if(typeof document !== 'undefined') { + document.getElementById('search-symbolcount').innerHTML = this.symbolCount; + document.getElementById('search-input').disabled = false; + document.getElementById('search-input').placeholder = "Type something here …"; + document.getElementById('search-input').focus(); + + /* Search for the input value (there might be something already, + for example when going back in the browser) */ + let value = document.getElementById('search-input').value; + + /* Otherwise check the GET parameters for `q` and fill the input + with that */ + if(!value.length) { + var args = decodeURIComponent(window.location.search.substr(1)).trim().split('&'); + for(var i = 0; i != args.length; ++i) { + if(args[i].substring(0, 2) != 'q=') continue; + + value = document.getElementById('search-input').value = args[i].substring(2); + break; + } + } + + if(value.length) Search.searchAndRender(value); + } + + return true; + }, + + download: /* istanbul ignore next */ function(url) { + var req = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest(); + if(!req) return; + + req.open("GET", url, true); + req.responseType = 'arraybuffer'; + req.onreadystatechange = function() { + if(req.readyState != 4) return; + + Search.init(req.response); + } + req.send(); + }, + + base85decode: function(base85string) { + function charValue(char) { + if(char >= 48 && char < 58) /* 0-9 -> 0-9 */ + return char - 48 + 0; + if(char >= 65 && char < 91) /* A-Z -> 10-35 */ + return char - 65 + 10; + if(char >= 97 && char < 123) /* a-z -> 36-61 */ + return char - 97 + 36; + if(char == 33) /* ! -> 62 */ + return 62; + /* skipping 34 (') */ + if(char >= 35 && char < 39) /* #-& -> 63-66 */ + return char - 35 + 63; + /* skipping 39 (") */ + if(char >= 40 && char < 44) /* (-+ -> 67-70 */ + return char - 40 + 67; + /* skipping 44 (,) */ + if(char == 45) /* - -> 71 */ + return 71; + if(char >= 59 && char < 65) /* ;-@ -> 72-77 */ + return char - 59 + 72; + if(char >= 94 && char < 97) /* ^-` -> 78-80 */ + return char - 94 + 78; + if(char >= 123 && char < 127) /* {-~ -> 81-84 */ + return char - 123 + 81; + + return 0; /* Interpret padding values as zeros */ + } + + /* Pad the string for easier decode later. We don't read past the file + end, so it doesn't matter what garbage is there. */ + if(base85string.length % 5) { + console.log("Expected properly padded base85 data"); + return; + } + + let buffer = new ArrayBuffer(base85string.length*4/5); + let data8 = new DataView(buffer); + for(let i = 0; i < base85string.length; i += 5) { + let char1 = charValue(base85string.charCodeAt(i + 0)); + let char2 = charValue(base85string.charCodeAt(i + 1)); + let char3 = charValue(base85string.charCodeAt(i + 2)); + let char4 = charValue(base85string.charCodeAt(i + 3)); + let char5 = charValue(base85string.charCodeAt(i + 4)); + + data8.setUint32(i*4/5, char5 + + char4*85 + + char3*85*85 + + char2*85*85*85 + + char1*85*85*85*85, false); /* BE, yes */ + } + + return buffer; + }, + + load: function(base85string) { + return this.init(this.base85decode(base85string)); + }, + + /* http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html */ + toUtf8: function(string) { return unescape(encodeURIComponent(string)); }, + fromUtf8: function(string) { return decodeURIComponent(escape(string)); }, + + autocompletedCharsToUtf8: function(chars) { + /* Strip incomplete UTF-8 chars from the autocompletion end */ + for(let i = chars.length - 1; i >= 0; --i) { + let c = chars[i]; + + /* We're safe, finish */ + if( + /* ASCII value at the end */ + (c < 128 && i + 1 == chars.length) || + + /* Full two-byte character at the end */ + ((c & 0xe0) == 0xc0 && i + 2 == chars.length) || + + /* Full three-byte character at the end */ + ((c & 0xf0) == 0xe0 && i + 3 == chars.length) || + + /* Full four-byte character at the end */ + ((c & 0xf8) == 0xf0 && i + 4 == chars.length) + ) break; + + /* Continuing UTF-8 character, go further back */ + if((c & 0xc0) == 0x80) continue; + + /* Otherwise the character is not complete, drop it from the end */ + chars.length = i; + break; + } + + /* Convert the autocompleted UTF-8 sequence to a string */ + let suggestedTabAutocompletionString = ''; + for(let i = 0; i != chars.length; ++i) + suggestedTabAutocompletionString += String.fromCharCode(chars[i]); + return suggestedTabAutocompletionString; + }, + + /* Returns the values in UTF-8, but input is in whatever shitty 16bit + encoding JS has */ + search: function(searchString) { + /* Normalize the search string first, convert to UTF-8 and trim spaces + from the left. From the right they're trimmed only if nothing is + found, see below. */ + searchString = this.toUtf8(searchString.toLowerCase().replace(/^\s+/,'')); + + /* TODO: maybe i could make use of InputEvent.data and others here */ + + /* Find longest common prefix of previous and current value so we don't + need to needlessly search again */ + let max = Math.min(searchString.length, this.searchString.length); + let commonPrefix = 0; + for(; commonPrefix != max; ++commonPrefix) + if(searchString[commonPrefix] != this.searchString[commonPrefix]) break; + + /* Drop items off the stack if it has has more than is needed for the + common prefix (it needs to have at least one item, though) */ + if(commonPrefix + 1 < this.searchStack.length) + this.searchStack.splice(commonPrefix + 1, this.searchStack.length - commonPrefix - 1); + + /* Add new characters from the search string */ + let foundPrefix = commonPrefix; + for(; foundPrefix != searchString.length; ++foundPrefix) { + /* Calculate offset and count of children */ + let offset = this.searchStack[this.searchStack.length - 1]; + + /* If there's a lot of results, the result count is a 16bit BE value + instead */ + let resultCount = this.trie.getUint8(offset); + let resultCountSize = 1; + if(resultCount & 0x80) { + resultCount = this.trie.getUint16(offset, false) & ~0x8000; + ++resultCountSize; + } + + let childCount = this.trie.getUint8(offset + resultCountSize); + + /* Go through all children and find the next offset */ + let childOffset = offset + resultCountSize + 1 + resultCount*this.resultIdBytes; + let found = false; + for(let j = 0; j != childCount; ++j) { + if(String.fromCharCode(this.trie.getUint8(childOffset + j)) != searchString[foundPrefix]) + continue; + + this.searchStack.push(this.trie.getUint32(childOffset + childCount + j*this.fileOffsetBytes, true) & this.fileOffsetMask & ~this.lookaheadBarrierMask); + found = true; + break; + } + + /* Character not found */ + if(!found) { + /* If we found everything except spaces at the end, pretend the + spaces aren't there. On the other hand, we *do* want to + try searching with the spaces first -- it can narrow down + the result list for page names or show subpages (which are + after a lookahead barrier that's a space). */ + if(!searchString.substr(foundPrefix).trim().length) + searchString = searchString.substr(0, foundPrefix); + + break; + } + } + + /* Save the whole found prefix for next time */ + this.searchString = searchString.substr(0, foundPrefix); + + /* If the whole thing was not found, return an empty result and offer + external search */ + if(foundPrefix != searchString.length) { + /* istanbul ignore if */ + if(typeof document !== 'undefined') { + let link = document.getElementById('search-external'); + if(link) + link.href = link.dataset.searchEngine.replace('{query}', encodeURIComponent(searchString)); + } + return [[], '']; + } + + /* Otherwise gather the results */ + let suggestedTabAutocompletionChars = []; + let results = []; + let leaves = [[this.searchStack[this.searchStack.length - 1], 0]]; + while(leaves.length) { + /* Pop offset from the queue */ + let current = leaves.shift(); + let offset = current[0]; + let suffixLength = current[1]; + + /* Calculate child count. If there's a lot of results, the count + "leaks over" to the child count storage. */ + /* TODO: hmmm. this is helluvalot duplicated code. hmm. */ + let resultCount = this.trie.getUint8(offset); + let resultCountSize = 1; + if(resultCount & 0x80) { + resultCount = this.trie.getUint16(offset, false) & ~0x8000; + ++resultCountSize; + } + + let childCount = this.trie.getUint8(offset + resultCountSize); + + /* Populate the results with all values associated with this node */ + for(let i = 0; i != resultCount; ++i) { + let index = this.trie.getUint32(offset + resultCountSize + 1 + i*this.resultIdBytes, true) & this.resultIdMask; + results.push(this.gatherResult(index, suffixLength, 0xffffff)); /* should be enough haha */ + + /* 'nuff said. */ + if(results.length >= this.maxResults) + return [results, this.autocompletedCharsToUtf8(suggestedTabAutocompletionChars)]; + } + + /* Dig deeper */ + let childOffset = offset + resultCountSize + 1 + resultCount*this.resultIdBytes; + for(let j = 0; j != childCount; ++j) { + let offsetBarrier = this.trie.getUint32(childOffset + childCount + j*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* Lookahead barrier, don't dig deeper */ + if(offsetBarrier & this.lookaheadBarrierMask) continue; + + /* Append to the queue */ + leaves.push([offsetBarrier & ~this.lookaheadBarrierMask, suffixLength + 1]); + + /* We don't have anything yet and this is the only path + forward, add the char to suggested Tab autocompletion. Can't + extract it from the leftmost 8 bits of offsetBarrier because + that would make it negative, have to load as Uint8 instead. + Also can't use String.fromCharCode(), because later doing + str.charCodeAt() would give me back UTF-16 values, which is + absolutely unwanted when all I want is check for truncated + UTF-8. */ + if(!results.length && leaves.length == 1 && childCount == 1) + suggestedTabAutocompletionChars.push(this.trie.getUint8(childOffset + j)); + } + } + + return [results, this.autocompletedCharsToUtf8(suggestedTabAutocompletionChars)]; + }, + + gatherResult: function(index, suffixLength, maxUrlPrefix) { + let flags = this.map.getUint8(this.mapFlagsOffset + index); + let resultOffset = this.map.getUint32(index*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* The result is an alias, parse the aliased prefix */ + let aliasedIndex = null; + if((flags & 0xf0) == 0x00) { + aliasedIndex = this.map.getUint32(resultOffset, true) & this.resultIdMask; + resultOffset += this.resultIdBytes; + } + + /* The result has a prefix, parse that first, recursively */ + let name = ''; + let url = ''; + if(flags & (1 << 3)) { + let prefixIndex = this.map.getUint32(resultOffset, true) & this.resultIdMask; + let prefixUrlPrefixLength = Math.min(this.map.getUint16(resultOffset + this.resultIdBytes, true) & this.nameSizeMask, maxUrlPrefix); + + let prefix = this.gatherResult(prefixIndex, 0 /*ignored*/, prefixUrlPrefixLength); + name = prefix.name; + url = prefix.url; + + resultOffset += this.resultIdBytes + this.nameSizeBytes; + } + + /* The result has a suffix, extract its length */ + let resultSuffixLength = 0; + if(flags & (1 << 0)) { + resultSuffixLength = this.map.getUint16(resultOffset, true) & this.nameSizeMask; + resultOffset += this.nameSizeBytes; + } + + let nextResultOffset = this.map.getUint32((index + 1)*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* Extract name */ + let j = resultOffset; + for(; j != nextResultOffset; ++j) { + let c = this.map.getUint8(j); + + /* End of null-delimited name */ + if(!c) { + ++j; + break; /* null-delimited */ + } + + name += String.fromCharCode(c); /* eheh. IS THIS FAST?! */ + } + + /* The result is an alias and we're not deep inside resolving a prefix, + extract the aliased name and URL */ + /* TODO: this abuses 0xffffff to guess how the call stack is deep and + that's just wrong, fix! */ + if(aliasedIndex != null && maxUrlPrefix == 0xffffff) { + let alias = this.gatherResult(aliasedIndex, 0 /* ignored */, 0xffffff); /* should be enough haha */ + + /* Keeping in UTF-8, as we need that for proper slicing (and concatenating) */ + return {name: name, + alias: alias.name, + url: alias.url, + flags: alias.flags, + cssClass: alias.cssClass, + typeName: alias.typeName, + suffixLength: suffixLength + resultSuffixLength}; + } + + /* Otherwise extract URL from here */ + let max = Math.min(j + maxUrlPrefix - url.length, nextResultOffset); + for(; j != max; ++j) { + url += String.fromCharCode(this.map.getUint8(j)); + } + + /* This is an alias, return what we have, without parsed CSS class and + type name as those are retrieved from the final target type */ + if(!(flags >> 4)) + return {name: name, + url: url, + flags: flags & 0x0f, + suffixLength: suffixLength + resultSuffixLength}; + + /* Otherwise, get CSS class and type name for the result label */ + let typeMapIndex = (flags >> 4) - 1; + let cssClass = [ + /* Keep in sync with _search.py */ + 'm-default', + 'm-primary', + 'm-success', + 'm-warning', + 'm-danger', + 'm-info', + 'm-dim' + ][this.typeMap.getUint8(typeMapIndex*2)]; + let typeNameOffset = this.typeMap.getUint8(typeMapIndex*2 + 1); + let nextTypeNameOffset = this.typeMap.getUint8((typeMapIndex + 1)*2 + 1); + let typeName = ''; + for(let j = typeNameOffset; j != nextTypeNameOffset; ++j) + typeName += String.fromCharCode(this.typeMap.getUint8(j)); + + /* Keeping in UTF-8, as we need that for proper slicing (and + concatenating). Strip the type from the flags, as it's now expressed + directly. */ + return {name: name, + url: url, + flags: flags & 0x0f, + cssClass: cssClass, + typeName: typeName, + suffixLength: suffixLength + resultSuffixLength}; + }, + + escape: function(name) { + return name.replace(/[\"&<>]/g, function (a) { + return { '"': '"', '&': '&', '<': '<', '>': '>' }[a]; + }); + }, + escapeForRtl: function(name) { + /* Besides the obvious escaping of HTML entities we also need + to escape punctuation, because due to the RTL hack to cut + text off on left side the punctuation characters get + reordered (of course). Prepending ‎ works for most + characters, parentheses we need to *soak* in it. But only + the right ones. And that for some reason needs to be also for &. + Huh. https://en.wikipedia.org/wiki/Right-to-left_mark */ + return this.escape(name).replace(/[:=]/g, '‎$&').replace(/(\)|>|&|\/)/g, '‎$&‎'); + }, + + renderResults: /* istanbul ignore next */ function(resultsSuggestedTabAutocompletion) { + if(!this.searchString.length) { + document.getElementById('search-help').style.display = 'block'; + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'none'; + return; + } + + document.getElementById('search-help').style.display = 'none'; + + /* Results found */ + if(resultsSuggestedTabAutocompletion[0].length) { + let results = resultsSuggestedTabAutocompletion[0]; + + document.getElementById('search-results').style.display = 'block'; + document.getElementById('search-notfound').style.display = 'none'; + + let list = ''; + for(let i = 0; i != results.length; ++i) { + /* Labels + */ + list += '
' + results[i].typeName + '
' + (results[i].flags & 2 ? '
deprecated
' : '') + (results[i].flags & 4 ? '
deleted
' : ''); + + /* Render the alias (cut off from the right) */ + if(results[i].alias) { + list += '
' + this.escape(results[i].name.substr(0, results[i].name.length - this.searchString.length - results[i].suffixLength)) + '' + this.escape(results[i].name.substr(results[i].name.length - this.searchString.length - results[i].suffixLength, this.searchString.length)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)) + ': ' + this.escape(results[i].alias) + ''; + + /* Render the normal thing (cut off from the left, have to + escape for RTL) */ + } else { + list += '
' + this.escapeForRtl(results[i].name.substr(0, results[i].name.length - this.searchString.length - results[i].suffixLength)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - this.searchString.length - results[i].suffixLength, this.searchString.length)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)); + } + + /* The closing */ + list += '
'; + } + document.getElementById('search-results').innerHTML = this.fromUtf8(list); + document.getElementById('search-current').scrollIntoView(true); + + /* Append the suggested tab autocompletion, if any, and if the user + didn't just delete it */ + let searchInput = document.getElementById('search-input'); + if(this.autocompleteNextInputEvent && resultsSuggestedTabAutocompletion[1].length && searchInput.selectionEnd == searchInput.value.length) { + let suggestedTabAutocompletion = this.fromUtf8(resultsSuggestedTabAutocompletion[1]); + + let lengthBefore = searchInput.value.length; + searchInput.value += suggestedTabAutocompletion; + searchInput.setSelectionRange(lengthBefore, searchInput.value.length); + } + + /* Nothing found */ + } else { + document.getElementById('search-results').innerHTML = ''; + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'block'; + } + + /* Don't allow things to be selected just by motionless mouse cursor + suddenly appearing over a search result */ + this.mouseMovedSinceLastRender = false; + + /* Reset autocompletion, if it was allowed. It'll get whitelisted next + time a character gets inserted. */ + this.autocompleteNextInputEvent = false; + }, + + searchAndRender: /* istanbul ignore next */ function(value) { + let prev = performance.now(); + let results = this.search(value); + let after = performance.now(); + this.renderResults(results); + if(this.searchString.length) { + document.getElementById('search-symbolcount').innerHTML = + results[0].length + (results[0].length >= this.maxResults ? '+' : '') + " results (" + Math.round((after - prev)*10)/10 + " ms)"; + } else + document.getElementById('search-symbolcount').innerHTML = this.symbolCount; + }, +}; + +/* istanbul ignore next */ +function selectResult(event) { + if(!Search.mouseMovedSinceLastRender) return; + + if(event.currentTarget.parentNode.id == 'search-current') return; + + let current = document.getElementById('search-current'); + current.removeAttribute('id'); + event.currentTarget.parentNode.id = 'search-current'; +} + +/* This is separated from showSearch() because we need non-destructive behavior + when appearing directly on a URL with #search */ /* istanbul ignore next */ +function updateForSearchVisible() { + /* Prevent accidental scrolling of the body, prevent page layout jumps */ + let scrolledBodyWidth = document.body.offsetWidth; + document.body.style.overflow = 'hidden'; + document.body.style.paddingRight = (document.body.offsetWidth - scrolledBodyWidth) + 'px'; + + document.getElementById('search-input').value = ''; + document.getElementById('search-input').focus(); + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'none'; + document.getElementById('search-help').style.display = 'block'; +} + +/* istanbul ignore next */ +function showSearch() { + window.location.hash = '#search'; + Search.canGoBackToHideSearch = true; + + updateForSearchVisible(); + document.getElementById('search-symbolcount').innerHTML = Search.symbolCount; + return false; +} + +/* istanbul ignore next */ +function hideSearch() { + /* If the search box was opened using showSearch(), we can go back in the + history. Otherwise (for example when we landed to #search from a + bookmark or another server), going back would not do the right thing and + in that case we simply replace the current history state. */ + if(Search.canGoBackToHideSearch) { + Search.canGoBackToHideSearch = false; + window.history.back(); + } else { + window.location.hash = '#!'; + window.history.replaceState('', '', window.location.pathname); + } + + /* Restore scrollbar, prevent page layout jumps */ + document.body.style.overflow = 'auto'; + document.body.style.paddingRight = '0'; + + return false; +} + +/* istanbul ignore next */ +function copyToKeyboard(text) { + /* Append to the popup, appending to document.body would cause it to + scroll when focused */ + let searchPopup = document.getElementsByClassName('m-doc-search')[0]; + let textarea = document.createElement("textarea"); + textarea.value = text; + searchPopup.appendChild(textarea); + textarea.focus(); + textarea.select(); + + document.execCommand('copy'); + + searchPopup.removeChild(textarea); + document.getElementById('search-input').focus(); +} + +/* Only in case we're running in a browser. Why a simple if(document) doesn't + work is beyond me. */ /* istanbul ignore if */ +if(typeof document !== 'undefined') { + document.getElementById('search-input').oninput = function(event) { + Search.searchAndRender(document.getElementById('search-input').value); + }; + + document.onkeydown = function(event) { + /* Search shown */ + if(window.location.hash == '#search') { + /* Close the search */ + if(event.key == 'Escape') { + hideSearch(); + + /* Focus the search input, if not already, using T or Tab */ + } else if((!document.activeElement || document.activeElement.id != 'search-input') && (event.key.toLowerCase() == 't' || event.key == 'Tab') && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + document.getElementById('search-input').focus(); + return false; /* so T doesn't get entered into the box */ + + /* Fill in the autocompleted selection */ + } else if(event.key == 'Tab' && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + /* But only if the input has selection at the end */ + let input = document.getElementById('search-input'); + if(input.selectionEnd == input.value.length && input.selectionStart != input.selectionEnd) { + input.setSelectionRange(input.value.length, input.value.length); + return false; /* so input won't lose focus */ + } + + /* Select next item */ + } else if(event.key == 'ArrowDown') { + let current = document.getElementById('search-current'); + if(current) { + let next = current.nextSibling; + if(next) { + current.id = ''; + next.id = 'search-current'; + next.scrollIntoView(false); + } + } + return false; /* so the keypress doesn't affect input cursor */ + + /* Select prev item */ + } else if(event.key == 'ArrowUp') { + let current = document.getElementById('search-current'); + if(current) { + let prev = current.previousSibling; + if(prev) { + current.id = ''; + prev.id = 'search-current'; + prev.scrollIntoView(false); + } + } + return false; /* so the keypress doesn't affect input cursor */ + + /* Go to result (if any) */ + } else if(event.key == 'Enter') { + let result = document.getElementById('search-current'); + if(result) { + result.firstElementChild.click(); + + /* We might be staying on the same page, so restore scrollbar, + and prevent page layout jumps */ + document.body.style.overflow = 'auto'; + document.body.style.paddingRight = '0'; + } + return false; /* so the form doesn't get sent */ + + /* Copy (Markdown) link to keyboard */ + } else if((event.key.toLowerCase() == 'l' || event.key.toLowerCase() == 'm') && event.metaKey) { + let result = document.getElementById('search-current'); + if(result) { + let plain = event.key.toLowerCase() == 'l'; + let link = plain ? result.firstElementChild.href : + '[' + result.firstElementChild.dataset.mdLinkTitle + '](' + result.firstElementChild.href + ')'; + + copyToKeyboard(link); + + /* Add CSS class to the element for visual feedback (this + will get removed on keyup), but only if it's not already + there (in case of key repeat, e.g.) */ + if(result.className.indexOf('m-doc-search-copied') == -1) + result.className += ' m-doc-search-copied'; + console.log("Copied " + (plain ? "link" : "Markdown link") + " to " + result.firstElementChild.dataset.mdLinkTitle); + } + + return false; /* so L doesn't get entered into the box */ + + /* Looks like the user is inserting some text (and not cutting, + copying or whatever), allow autocompletion for the new + character. The oninput event resets this back to false, so this + basically whitelists only keyboard input, including Shift-key + and special chars using right Alt (or equivalent on Mac), but + excluding Ctrl-key, which is usually not for text input. In the + worst case the autocompletion won't be allowed ever, which is + much more acceptable behavior than having no ability to disable + it and annoying the users. */ + } else if(event.key != 'Backspace' && event.key != 'Delete' && !event.metaKey && (!event.ctrlKey || event.altKey) + /* Don't ever attempt autocompletion with Android virtual + keyboards, as those report all `event.key`s as + `Unidentified` (on Chrome) or `Process` (on Firefox) with + `event.code` 229 and thus we have no way to tell if a text + is entered or deleted. See this WONTFIX bug for details: + https://bugs.chromium.org/p/chromium/issues/detail?id=118639 + Couldn't find any similar bugreport for Firefox, but I + assume the virtual keyboard is to blame. + + An alternative is to hook into inputEvent, which has the + data, but ... there's more cursed issues right after that: + + - setSelectionRange() in Chrome on Android only renders + stuff, but doesn't actually act as such. Pressing + Backspace will only remove the highlight, but the text + stays here. Only delay-calling it through a timeout will + work as intended. Possibly related SO suggestion (back + then not even the rendering worked properly): + https://stackoverflow.com/a/13235951 + Possibly related Chrome bug: + https://bugs.chromium.org/p/chromium/issues/detail?id=32865 + + - On Firefox Mobile, programmatically changing an input + value (for the autocompletion highlight) will trigger an + input event, leading to search *and* autocompletion being + triggered again. Ultimately that results in newly typed + characters not replacing the autocompletion but rather + inserting before it, corrupting the searched string. This + event has to be explicitly ignored. + + - On Firefox Mobile, deleting a highlight with the + backspace key will result in *three* input events instead + of one: + 1. `deleteContentBackward` removing the selection (same + as Chrome or desktop Firefox) + 2. `deleteContentBackward` removing *the whole word* + that contained the selection (or the whole text if + it's just one word) + 3. `insertCompositionText`, adding the word back in, + resulting in the same state as (1). + I have no idea WHY it has to do this (possibly some + REALLY NASTY workaround to trigger correct font shaping?) + but ultimately it results in the autocompletion being + added again right after it got deleted, making this whole + thing VERY annoying to use. + + I attempted to work around the above, but it resulted in a + huge amount of browser-specific code that achieves only 90% + of the goal, with certain corner cases still being rather + broken (such as autocompletion randomly triggering when + erasing the text, even though it shouldn't). So disabling + autocompletion on this HELLISH BROKEN PLATFORM is the best + option at the moment. */ + && event.key != 'Unidentified' && event.key != 'Process' + ) { + Search.autocompleteNextInputEvent = true; + /* Otherwise reset the flag, because when the user would press e.g. + the 'a' key and then e.g. ArrowRight (which doesn't trigger + oninput), a Backspace after would still result in + autocompleteNextInputEvent, because nothing reset it back. */ + } else { + Search.autocompleteNextInputEvent = false; + } + + /* Search hidden */ + } else { + /* Open the search on the T or Tab key */ + if((event.key.toLowerCase() == 't' || event.key == 'Tab') && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + showSearch(); + return false; /* so T doesn't get entered into the box */ + } + } + }; + + document.onkeyup = function(event) { + /* Remove highlight after key is released after a link copy */ + if((event.key.toLowerCase() == 'l' || event.key.toLowerCase() == 'm') && event.metaKey) { + let result = document.getElementById('search-current'); + if(result) result.className = result.className.replace(' m-doc-search-copied', ''); + } + }; + + /* Allow selecting items by mouse hover only after it moves once the + results are populated. This prevents a random item getting selected if + the cursor is left motionless over the result area. */ + document.getElementById('search-results').onmousemove = function() { + Search.mouseMovedSinceLastRender = true; + }; + + /* If #search is already present in the URL, hide the scrollbar etc. for a + consistent experience */ + if(window.location.hash == '#search') updateForSearchVisible(); +} + +/* For Node.js testing */ /* istanbul ignore else */ +if(typeof module !== 'undefined') { module.exports = { Search: Search }; } diff --git a/searchdata-v2.js b/searchdata-v2.js new file mode 100644 index 0000000..699ffa6 --- /dev/null +++ b/searchdata-v2.js @@ -0,0 +1,2 @@ +/* Generated by https://mcss.mosra.cz/documentation/doxygen/. Do not edit. */ +Search.load('O+!-x00000PXGV_lobE~MkoLPMil@60RRC200Aik00032001Zm0Du4iat;6h00Ctd00001c^m)$00Chl00001Y$yN#00D3=00001WHbN(00C|~00001bwB_B00D1C00001b4&mL00DPW00001bXWiY00DDe00001V`KmT0RRI400Aj*000312><{ADS7|^0RadAD1HEd00Cr#00001WsCp-00DH800001a+m-B00Cj100001bff?P00DEV00001Yp?(S00CpR00001VY~nU0RjR5C}MN~fWiO(00DW(00001VblNs00C^;000311poj6DdqqG0RaR6DCz)!00C(500001bNB!N00C+K00001ZUg}U00C(V0RR92W)J}Y00Cqc0RR92ZX5vs00DI(0RR92Zzur(00DC@0RR92ax?(|00D100RR92W003A40Ehtq00BCV0RRF53IG5AIw+t4fCvD900DBQ0RR92WwZeR00DWr0RR92VZZ?Z00C^q0RR92aLfS!00Csu0RR92ZrA|;00DL00RR92Z{z_00RRgC00Cw20RR92Z1e#D0RR;M00DFW0ssI3ZUh1V00CtR0ssI3WDo)X00C(h0ssI3V;lki00Lxg`T+nU0ssL33;+NDXEFi+00C|`0ssI3X*>b|00DGD0ssI3a!3LI00Ci60ssI3bW{QW0RRmE00C!U0ssI3Ze#)g00C)g0ssI3Zg2ts00C}x0ssI3b$kK<0RRpF00C!+0ssI3Zj1r|00C)|0ssI3beIAF00C*90ssL34*&oGZmI$R0RR#J00CsQ0ssI3a<~Ej00CjX0ssI3W5fag00Csm0ssI3Y|sJ#00UufX`})Gt^xqo0ssL35C8xHbm{^C00DFE0ssI3Z}b8H0RRyI00CzJ0{{R4ZUh4W0RR&K00CqW0{{R5X=Mrn02BiN00C?o0{{R4X(R&x00Cht0{{U46aWALWHti;00Ct>0{{R4Y(N7500C@90{{R4WlRGA00CoC0{{R4Zdd~V00CiM0{{U4761SNWNHHd00Cug0{{R4Y;*$v00Clp0{{R4VSobw00DD`0{{R4X^aB^00?Pwa(8TIV`L}-09pb7f&u{C0s#5~05AgpWCH+_0{{R4I+z0h0Ra~PI=TaZ00Cvd0{{R4bjSk$00Cjn0{{R4bkqX?00DE_0{{R4a^M3100Cv@0{{R4ZR`U80RT(@00AlZ0{{U5O8_YR1AqVlbOHnb00C|a1ONa5We@}a00Cqc1ONa5X&eLq00Cnn1ONa5ZYTr*00C((1ONa5Y%~M_00Ch-1ONa5V?YD|00C)61ONa5ZcGFK00C%H1ONa5V^{U00C}V1poj6b6^Dk0RS8T00C@l1poj6VQ>Wi00Com1poj6X?z6$00DG@1poj6X@~^?00DB21poj6W0VB|00DEF1poj6X`lrF00DWX1poj6a;yaa00CvP1poj6bhrfo00DHq1poj6VZ;Rh00L=ZW(5Gs1poj6ZqNk)00D2>1poj6Y2XC_00DF61poj6ZtMjB00Cw41poj6bod1T00DUZ1pom69RL6Uc?t#q00CqU1^@s7VH5@c00Cth1^@s7av%l(00DF+1^@s7Z!87?00C|?1^@s7b2tV700C(}1^@s7azq9I00Cu61^@s7Vo(ME00C`Q1^@s7XMg>!UO;m1povF0B8mP00BB~1^@v7RsaA2DTW3B0RdG2D2fJv00Cr>1^@s7Wtav400C#71^@s7ZlneP00CjD1^@s7Xs`wV0RkQXI%9wafVKtz00CvZ1^@s7bjSt(00Cjn1^@s7bkqg_00DE_1^@s7dEf>B0RU0}00AlN1^@v8Q2;3L27mwoWcCIC00CwG1^@s7X9NcT00C|a2LJ#8VGsuZ00C$g2LJ&9A^>9?2LJ#8Wg-Uv00C_(2LJ#8X)p%>00DG12LJ#8ZafD700D182LJ#8X-EeE00DGP2LJ#9WMk$A08|G60RS`r00Ajv2LJ&9GXN-P2Y>(pbZ!R#00Cuo2LJ#9VRKps0DK1k00Cu!2LJ&8Pyhe{DUt^O0Rc|{D3%9+00Cs22LJ#8WuylH00C#J2LJ#8Zm(pbod7V00MM!&<6kp2mk>9ApigYWflkk00C_p2mk;9X&?vy0st-mFaQ7nDJ%#80s<`nF938XCI|pB2!H?qa5xA600Loe39CIA2dDOLyo0RbfdC|U@B00DAf2mk;9WoQTh00C`o2mk;9X>AF#sr>2!H?qbfO3V00C^O2mk;9b+8Bk00DEh2mk;9WxNOg0RTV%00Ak;2mk>AKL9Aq2!H?qWYP!#00Cv%2mk;9Y~Tn000Cm=2mk;9VeAM100DFI2mk;9Y4`{L0RTt<00Aik2><~BM*t`Y34j0rWey1d00DFs2><{AVH^nn00DF&2><~AN&o->DJ}^B0Rc$>C^89v00Cq;2><{AWk3l400C@92><{AVoV7D00CiA2><{Ab65!g00C)U2><{AWMl~d00Cuc2><{AVsHrn00D1y2><{AbbJW_00DD?2><{AbchK600C}}2><{AVU!5~00eSmb9cfB0R9L7C<{Abf5_U00VSmWlRVFk_Z5@2><~ABLDyaa>fY&00Cvn2><{AbkGR^00DH?2><{AW!wn>0RU7000AlJ2><~BQvfLJ34j0rWbz3B00CwC2><{AX8;NS00C|W3IG5BVGIfY00C$c3IG8CBmiR=3IG5BWF86t00Ctt3IG5BY%B@@00Ck$3IG5BVK@o^00DD83IG5BX+#PD00Cr53IG5BWl#zL00ClF3IG5BZ(Irh00DGj3IG5Bb7%?x00DGv3IG5BZgdI&0RT<_00Ak03IG8CO#mo_3V;9sWQqy^00DB63IG5BVVDX400Cp33IG5BWTXlJ00C^O3IG5CVQG2_0I&)G0RSuj00Ak$3IG8CD*!0O3V;9sY|07%00Cvv3IG5BW7rA+00C~^3IG5BVdM$`0RT1t00AlR3IG8CH2^5|3V;9sW%>#L00DFY3jhECVF(KV00DFk3jhHCH~;_vDH;m^0RcAvC>{%d00Ctr3jhECZ7d4_00C(-3jhECbT|tD00DG93jhECZbS{)e00D9&3;+NDWh@K;00DF|3;+NDbT|wE00Ct_3;+QDLI3~(DM}0g0Rce(C{7H300CrF3;+NDWn2sZ00C@b3;+NDVrUEi00Cic3;+NDb94*<00C)w3;+NDWPl6+00Cu&3;+NDVvGy`00D233;+NDbeIeP00DEJ3;+NDbfgRb00C~Q3;+NDVXzDU00whoa&&BW6bk@i3jpv702B-WL<|773;+NDbi51z00Cvz3;+QDMgRZ-DdG$O0Rcq-DCP`+00DID3;+NDa`X%U00Ck83;+NDbN~$i00DCb4FCWEatsXs00CtZ4FCWEVi*ko00C_t4FCWEX(SB*00C?&4FCWEV=xT>00Ct-4FCWEY&;DB00Cq|4FCWEZb%IP00Ci64FCWLbaHcScVlO0WCQ?=2LQMU0OAP%wh9313IN;;08|YC00BB$4FCcHR{$jdIw*V%fLaKE00DA>4FCWEWsnU300C{54FCWEX`BrJ0RUqF00Ake4FCZFVgM+t4S)avbg~Tq00C~g4FCWEX}}Et00C{r4FCWEZ_Et<00DB+4FCZFSO8|&4FCWEdEN~G00Cv@4FCWEYwQgG00C_B4FCWEVfYOI00D0P4FCWEX9Nxa0RUwH00Aiw4gdiGWB@1>4uAjwbQ%r-00C|y4gdfFX($c=00C_-4gdfFZ!``700DA34gdiGSpa504gdfFWJV4E00C}J4gdfFVN?zP00C`U4gdfFZD0-n00D1i4gdiFU;qFCd2$W_00Cuo4gdfFYkUp>00Ccu4gdfFbchZB00DB24gdfFVU!L400DHG4gdiFVE_ODd8Q5k00CvH4gdfFYp@Og00CdN4gdfFWV{Xl00C~o4gdfGb7i0o0LTsi00Cdl4gdfFW!Me?00C#-4gdfFVdM?~00DFA4gdfFbMOuT00Cw84gdfFZTt=Z00LuQYz_bd4*&oGbO;Xs00CtZ4*&oGYZwmz00Cnj4*&rGS^xk6aw-o100D0<4*&oGax@PB00DA34*&oGWk3%A00DVM4*&oGWK0hL00CiA4*&oGWmpdY00DAd4*&oGbYu?z00D1m4*&oGZg39(00DD$4*&oGa(oW}00Cu!4*&oGZHNy500C)^4*&oGbd(PO00BCh4*&rHTL3zs4}bsxWu^}R00CsK4*&oGZ?q2p00CpV4*&oGbHEP(00DKz4*&oGbj%L`00Cjr4*&oIX>W824ge$%0N4)z0RU$J00AlN4*&rHW&kMg4}bsxXZ8;O00D0P4*&oGX#@}e00D9e5C8xHbPx~#00DCr5C8xHZyXQ+0Rdb9bRrM{00Ctv5C8xHa4--600DV65C8!HT>t<9WkL`D00DGH5C8xHVN4JJ00DGT5C8!HUH||AWnK^f00DGj5C8xHVQ3Hl00DGv5C8xHb94{@00DV=5C8xHa)1y300Cu&5C8xHbc_%H00DH85C8xHVVDpA00VS$VmuH4SP%f75C8xHZln+Z00D2Z5C8xHX}Ayo00DEp5C8xHZp07(00Cvn5C8xHbkGn000DT`5C8!HUjP6BW#SM300DI75C8xHVeAk900DIJ5C8xHbNCPd00CtF5C8xHVFVEX0RU+L00Aiw5dZ-JXaFb_5r6;zWf~Cx00D9$5dZ)IVJHy*00D3=5dZ)IZ8Q-800D105dZ)IV?YrA00Cu25dZ)Ia!e5b00CiA5dZ)IcUTbs00C`Y5dZ)Ia%2$z00C)g5dZ-IYXATNDRvP60Rd_ND0&fq00Cuy5dZ)Ib%+rF00C@{5dZ)IVU!U700DNI5dZ)IZJ-eV00DKT5dZ)IZmbai00CvP5dZ)IZ@3Wv00nbpaAtJg4*=W{016QRa1j8$5dZ)II>ZqG0RU|P00C~`5dZ)IZ{!gG00C+05dZ)Ibnp=X00Ck45dZ)Ibo>zj00C|S5&!@JWe5@g00C_d5&!@Jbrcc+00Cnf5&!@JZy*u?00Cqs5&!@JAS@C900DC{5&!@JWjGQ500C(}5&!@JazqjU00Ci25&!@Ja!?Wg00ClF5&!@JX=$&0s!U*06G(Z00DGB6951LWp&600LBjh00MG!R1*MN695AMaR4p=FaQ7nDQ*)00|IaWEdVb7bSNeW0Cp3A00D4(6951LVQ*v;0E`m=00m=oWod6L69AGE0I~@H3Jw4y4*&oHY+>2}00a>L00L%dKmh=f0ssI3bi5M)00L=l#uET^3IGBDO#l)AD1-`t00Csy6951Ka^MpH00Cj<6951KW9$*_j0CW%l00DW{6aWALa^MsI00Cv@6aWALbnFxW00DIJ6aWALVfYjP00e1bbaQ3}0R9vJJP-g_5C8xHZUhwo00D0n6#xJMX&e;*00DC%6#xJMZYUK100Ct#6#xJMbTkzJ00DS96#xJZb8vTKbZK&IW@K(@9M09*+GkqH2m2>{ax0M`is2MPcR3III{06+==c?tl03IMhW0J#bP>k0tw3IHMt03{0mUkdkI(y3;-bw03;0nTnzwV4FHS{0FMm-&J6(44FDJp02~egFAe};4gi%70M8Bp0S^E+4*+Zr0I3fE*$)625CB&Y0F@8`nGgWm5CGp004xyzFcAQH5deM>0L2ji$q@kF5dZ`d05}o=JQ4tF5&&)z0G<*6p%MVH5&)^Gsi~={si>)_NZ8oe*x1>+!a#L@0Ze&JjZfSF9C}eMSVr*q9DF7p3Ffuo0G&N*3HZo#2I5%QuWjQoBH!@;1W@0xvH#Ijk1OPk-3IG}cIyz%vZewL^C@BCVVKZegIW;#pVlrf5FflY`Ghs3_GBjm3W;0_oH8eS9F$MrU3IG}cIy!J{VR>RBBVl1OW@TkCVKy>2IWc26GdDFhH92KtGBjaiV>o6pHDd?>JZu08Q*U){WKe8jd1Z0{Q*U){WKe8jd1Z1gXmo9C7XUUoI!Q!KMF3$qIbk+3G%_|ZVKp;kVKg)|V>vZ2Wim5nF*ss1I5{&H05&>0Q&d4xR7p-p0AXWdFfcVSIXE_AV>vQoW@9sEH90miHaKE6WH&NlGB6haHaa>|RZdPxPDcP?IAmlwWi>ZBWiewkGh$^kW;Hi6Hexw5WiUB2Vr5}47XUUoI#)qSR7p-p0AXP>G&M6fV`DQlFf?IiVq;}6G%;m1I5jjiGG;kpGBp0MnOqTNlr%qVK-$nIWsvoWHM!DH)LjEIXPr9G-75nWn^SEFf?X4ITrvnIyzTLOhiLLQbYh@H8(S4Fk)pgGGSsgF=8?^H8C|ZWHB=}VK`woG&E*57XUUoIz~ZBOhrThVKQbkHDfg~HZnP3IWadiH#a#nVqrI8Vq-O7WMVmDW)}c9Iyyr^PD4dZOhrThVKq57Ic76AH83_eG&Ev0H8nY7Wj8c5Wn?%xFf?IgGZz3hIyy;CLrFwMPE-J4IA$;~FlID4HZV0fH!(3`GC4CgH!)#iHDftsGcsaf7XUUoIz&lRK|)MLL;zu7GdVJ3GG;YpIXGiAVliVhGB!ClF=H`dVliSeH)J?h02DepRB3Hxa#M6+bY%b|VPs)2WHd5nIAdXBIWjmfH!?RdWivQ2F*rFnHaRh5G#&spIyy;nQe|Oec>rN#Gh;GlVK-!EG&3_YGB_}0W@a;EGd4A5Ibk$nI5{*P05&>0PH%KcZb@WpWm9xvbY%cxFflY?Gcq_iWim8kH)S(7W@R`uFk@q4FlI0_IWajm9so8vI!SXxX>(y>Y-MBsVP#`6H!x;mFlIA1GhsF{W-~E4IXN^lG&N;5IA&pGWgY-FIyyyobY*UHX>V>xb53t`LvL0MR;^&ZgXjGZbD&nbY*gRNpnMTX>@60VQc_lHaRymV`MO6G-5Y5WM*MDH#1>1Wie!CWiVqiV>mc89so8vIzwz}ZDM6|NpntbbW&wuWO)E#W;ZZ3VKZZ4F)%bTIbks~VP-HkW-wtjIc7IzF=S+BR{#_`I#Oj}WO-9`VRU5xBVjQ(HD)+7GG$~lIAtsIX5>qVKp;1VlX&3FfcSTF*P+XR{#_`I&*Yya8zk+WdI{#Wi>fwGc`12I5jmmHD+cxWHvN1GBr3cGc_|bH8nFhR{#_`I&x)UV{~b6Zd7S)WdI{#Fflo0IAS$qV>LN7Wi~T6WMnfpF*jy2WHK`~WimE4R{#_`I&5WhbY*e?BVjpVGdE*7Gc`3bW??aAG-WenG&f>nVL3TuVlgyfIbl}-6goP0VQzGDRBu9ML}_zjVr*q(03%^#VK8Q5Gc;pjIbu0DWHB;kW??pDWn(iqV>U2mIXO6202C8CI#Xj)bazx~ZDn#OQB!nsX>MmMAW=_ZYGq?|Dk%UXVKX>6Wid5kH8C|~Vl^~mVl^=~IAb+sW@BPCW-v8nG$jBw5mx{d0y;W#bYXIIC@BCVVKFo`Wo9&HHa0LgWi??iHDxw4WMN}uV>LK2W-u}_Fed;uR{#_UIy!T7VRCdRWN&q1Y-K3`BVjf;HaKE5GdE^9HDNbpVrDjDV=y&2Wic=^V>x1DVmT=QHU?J!6aqRrV_|M%Wo#%Z03%^HG%z`4Vl`%FWi(_lW-?_mVKg>kIc7C5Ghs6}VmD(e05(?u6aqRrb98TTC@BCVVPZF8V>vQ4Fk~@gVlyx_Hexe4Gcsl{G&o{pW@ctGHZ1@)R{#_UIy!T7Z*VANZ*^j9Whnq7VKp^3Ha0gnIAUTrHfA$6WMViuG%#Z`V>K`_G&yBsFfRZ$23G(S3_3bK}~WH&cuW;ii0WHdK105%F&02Bf`I&x)mWppSh03%^BH8(b4VP-gGVr67xIAvrqHezEmVq#-uIW}TAF=03}05(?u6aqRrXJvF#bYXO5C@BCVVPZ95Vly~5G+{C{F=jP4V>LKpG-WkqH(_HqGh{Y1Vl@CZR{#_OIyz@%bVGG=a%FCGRB3HxC@BCVVK*=`Vr67GIAJq6Fg0U2Ffn0eW@KSyW@2JwG+{MiHa7q^R{#_OIyz@%bW&wuV{~b6Zd7S)Whf~CBVjl(Ib}ICVmV=AWj16nFgG(|IX5scIAUZsIXO3BHZVB=Hdg=?0y;WpWpq?!cyuT!03%^$H8nV6I599ZI5ak4FgaypHD)(4G&wmnG&DIiG+{G405(?u6aqRrXJvFuWps39awsVPBVl1;H#Ik5Gi5SjGh}5kWH)4CH8?b8IbmdGF*jpmWivehHdg=?20A)(WpqSob75j^Wn?H~Z*OcV03%^EFk)jlH)JBBVlDVH8W;pWj8c8HZn41VrFA9Wnwd8W->NpVP<47IAK8mHdg=?0y;WpWpq+yVPttzbYXO5C@BCVVKHPmVlg-}WH~r9VKQbmVPY^dVmM_pI5#&lH#TBsWsEVKXu~VrDirV=-hnHf3UFW@0cnHezLAF*ssH05%3!02B;5I&)=oQ*>c;Whhi>ZDn#(bYXO5DF7p3F)(FiG-NS3He_RFH!)#2VKrhgVKFy1Ff}(gWHUB5M*uboR{#_SIy!S@bXQ?+baPa1LS;m0b75j^Wn?H~Z*OcV03%^yF<~@gF)%kVI5;;mW@b1rWHUK6VKg>5H(_KrWj0|+05$|y02Bf`I&@`YXl`j^VQfimV`*e%ZgeOq03%^yIAJnoFflh|FfwL2H#uc7Gcq_bVKFdaV>x3oHDO{)05(?u6aqRrcWG>7V_|Y+C@BCVVPRorHaB5mF=H|{Wn?okI5aRcVL380HfCWpHfA?7GED$B9{?5%Lug@cXJuq4RB3Hxa#M6+bY&?3GGaM7VmLTuIWjh6F=9AlWMMO9F=8`iW;i!wGB7z}PXIOwA^;cyLug@cXJuq4DF8D#GB!CfGdMRnW@TkJW-~QmH8e6}H8^HBH8(XhQ2;h102UKNXkl(=Wn?H*V^ef@RB3Hxaw;q!VsCG3DF9|RH)LWnH(_QrGiEkpIXO9DH8o-~W;ZrrGi5kqWMNYPHW60<6bw2#a%Ev;c~f*@bY(+mVQyz-WGGT)VPttzbYXO5DF7p3VP;}DH8eLjH#cT9GBGh_W;JDGWM(lrHZwP5F*IW{RRA^$Yyb*WX>Db4090vhWpXZPbZu;G01rAkQ)y>zVQfofc>p6}Wie$oVKgu{Gi7EnHDxw1VlXygIW}TtHa1~pIXGrDYyb~BI#X|BYh`ppZ*6U1Ze#!>VKp=|Ghr}cH8*59I51=}W-~Z8Ibt|5V=`kiF*GwZWLp3+IyzKoZDn$EPH%KlWnpA_MRIa)asXjDIAk|sG&wggGBi16IX7iCFg7z~IXE~uG&3c;b#p^+WMu#&VPr62Gcq}3WMeTjGGk$4I5A>lIXGo7WHc~jGcqtXIBWn9IyyyobY*UHX>V>+d2nR_BVlG@Ffcb^FgZD6F*Y?cG&wgmF=1w5Wn?llVKp>kG&O7h4>~$UcywiMb7^mGQ*>c;WdI{#G&N*0W;i)wGdMLcIc7OBG&y57GG=3DI5sggVKrqmYyb~BIz@PNWo~n6Z*D?ibaZ8Mc~f*@bY%b|VK_51VPi64GiEb3FlJ#kFk?4kG-hTsIW;*jF*r9eVr&2pIyz8cWK(oubY%b|VK*}|F=S#kI5J^lIAu3BF)=wfGc!44WHn-8H8W&1G;9D5IyzHNLrXUN8Vq!BiW@9)qI5uHsH8^54VPj=6Gh=2rV>mf%01pK^I&*1fZeeUoWqC$&Z*56#bSPN2W03%^IF)%V=HfCjIFfnE{GchzYWH@4GGi73BFf}w{H#IY405Jn>01pp3I%RltWo~n6Z*Ek1aAj0)Q*?4^Zf7V(cywiMb7^mGRC#b^DF7p3WHc}}HZ)=~Gc!11VKHN7Ffn6eVPj=vW@IrnGBsmiW&kk_Yyb}uIyz=)a&32Ea%DqrZE#_7WhhZobaH8KXDlF5Q*?4^Zf7X~BVjZ*Gcsf~V>dWvFg0N@H!)%~IWlEtVrDU9IAt_AGB9WWF%WD34-+~%bZfrIWc56Vlif6W;HT3Gc#dgGh;V7ZU8j|bN~|qIy!T7Z*V9n03%^IHe)z4G&wY3HDfn5VlZJfVPa%AFfn5@G%+`1IAJ+(05x;~69PIqa%FR6bSNnRBVlASHZV3YGdVM4V`MovIbvgFWHT`|VKp!}H)b?tVK{OCHEaM1Qek6d08(LNWiDuRZEOM_0U`n`0WbkI0XqRe14jc&1x^K00ayTB0Av7XaA9X