From f2c3ab413ae07dda62d982b4c30ed881e692e26a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 13 Jan 2022 17:18:07 +0000 Subject: [PATCH] Update documentation --- docs/_images/config4.png | Bin 23114 -> 37377 bytes docs/_images/temp1.png | Bin 0 -> 37897 bytes docs/_images/wifi.png | Bin 16076 -> 14827 bytes docs/_sources/backlog.rst.txt | 2 - docs/_sources/compiling.rst.txt | 2 - docs/_sources/configuration.rst.txt | 59 +- docs/_sources/functionallity.rst.txt | 43 +- docs/_sources/index.rst.txt | 10 +- docs/_sources/installation.rst.txt | 5 +- docs/_sources/q_and_a.rst.txt | 8 + docs/_sources/releases.rst.txt | 16 + docs/_static/basic.css | 255 ++++-- docs/_static/doctools.js | 16 +- docs/_static/documentation_options.js | 3 +- docs/_static/jquery.js | 4 +- docs/_static/language_data.js | 6 +- docs/_static/pygments.css | 311 ++++++-- docs/_static/scripts/furo-extensions.js | 0 docs/_static/scripts/furo.js | 3 + docs/_static/scripts/furo.js.LICENSE.txt | 7 + docs/_static/scripts/furo.js.map | 1 + docs/_static/searchtools.js | 59 +- docs/_static/styles/furo-extensions.css | 2 + docs/_static/styles/furo-extensions.css.map | 1 + docs/_static/styles/furo.css | 2 + docs/_static/styles/furo.css.map | 1 + docs/_static/underscore.js | 37 +- docs/backlog.html | 325 +++++--- docs/compiling.html | 382 ++++++--- docs/configuration.html | 808 ++++++++++++-------- docs/contributing.html | 317 +++++--- docs/functionallity.html | 377 ++++++--- docs/genindex.html | 298 +++++--- docs/index.html | 334 +++++--- docs/installation.html | 351 ++++++--- docs/license.html | 317 +++++--- docs/objects.inv | Bin 511 -> 523 bytes docs/q_and_a.html | 274 +++++++ docs/releases.html | 350 ++++++--- docs/search.html | 324 +++++--- docs/searchindex.js | 2 +- 41 files changed, 3815 insertions(+), 1497 deletions(-) create mode 100644 docs/_images/temp1.png create mode 100644 docs/_sources/q_and_a.rst.txt create mode 100644 docs/_static/scripts/furo-extensions.js create mode 100644 docs/_static/scripts/furo.js create mode 100644 docs/_static/scripts/furo.js.LICENSE.txt create mode 100644 docs/_static/scripts/furo.js.map create mode 100644 docs/_static/styles/furo-extensions.css create mode 100644 docs/_static/styles/furo-extensions.css.map create mode 100644 docs/_static/styles/furo.css create mode 100644 docs/_static/styles/furo.css.map create mode 100644 docs/q_and_a.html diff --git a/docs/_images/config4.png b/docs/_images/config4.png index d7c9c60b6981656a48901ff4c57d7a889cdc5235..a9484a56c29c7c120fcad860c43700768d42ba86 100644 GIT binary patch literal 37377 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 EKYi4;tN;K2 literal 23114 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 diff --git a/docs/_images/temp1.png b/docs/_images/temp1.png new file mode 100644 index 0000000000000000000000000000000000000000..a362886f65208e724ef8d381cf4d190a5c53a782 GIT binary patch literal 37897 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�A{BW!pf`0I~U4*<4Vm*>h!Qo2FR3hZBewb<>UJ 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 CZIBuO diff --git a/docs/_sources/backlog.rst.txt b/docs/_sources/backlog.rst.txt index 5f90826..50e94db 100644 --- a/docs/_sources/backlog.rst.txt +++ b/docs/_sources/backlog.rst.txt @@ -9,7 +9,5 @@ Documentation Code ------------- -- Support for MQTT - Support for plato - Use pre-commit for validating check-in -- Automatic builds via github actions diff --git a/docs/_sources/compiling.rst.txt b/docs/_sources/compiling.rst.txt index b0a2ee9..d8dbfbf 100644 --- a/docs/_sources/compiling.rst.txt +++ b/docs/_sources/compiling.rst.txt @@ -82,8 +82,6 @@ This is a list of C++ defines that is used to enable/disable functions in the co - description * - ACTIVATE_OTA - Enables the OTA functionallity in the code - * - USE_GYRO_TEMP - - Uses temperature from gyro instead of DS18B20 (experimental) * - SKIP_SLEEPMODE - THe device never goes into sleep mode, useful when developing. * - CFG_DISABLE_LOGGING diff --git a/docs/_sources/configuration.rst.txt b/docs/_sources/configuration.rst.txt index 91581e3..ea45b72 100644 --- a/docs/_sources/configuration.rst.txt +++ b/docs/_sources/configuration.rst.txt @@ -125,6 +125,22 @@ Push Settings Token with write access to bucket. +* **MQTT server:** + + IP or name of server to send data to. + +* **MQTT Topic:** + + Name of topic to publish sensor readings to, iSpindle format is used. + +* **MQTT user:** + + Username or blank if anonymous is accepted + +* **MQTT password:** + + Password or blank if anonymous is accepted + Gravity Settings ++++++++++++++++ @@ -165,7 +181,15 @@ Hardware Settings * **Temperature correction:** - This value will be added to the temperature reading (negative value will reduce temperature reading). + This value will be added to the temperature reading (negative value will reduce temperature reading). This is applied + when the device starts. So changing this will not take affect until the device is restarted. + +* **Gyro Temperature:** + + Enable this feature will use the temp sensor i the gyro instead of the DS18B20, the benefit is shorter run time and + longer battery life (this is an experimental feature). The value used is the first temperature reading from when the + device is activated, since the gyro should be cool this is reflecting the surronding temperature. After it has + been running the value would be totally off. * **OTA URL:** @@ -235,6 +259,7 @@ Other parameters are the same as in the configuration guide. "gravity-format": "G", "temp-adjustment-value": 0, "gravity-temp-adjustment": false, + "gyro-temp": true, "gyro-calibration-data": { "ax": -330, "ay": -2249, @@ -358,6 +383,10 @@ Used to update gravity settings via an HTTP POST command. Payload is in JSON for * ``gravity-formula`` keywords ``temp`` and ``tilt`` are supported. +.. note:: + ``gravity-temp-adjustment`` is defined as "on" or "off" when posting since this is the output values + from a checkbox, when reading data it's sent as boolean (true,false). + .. code-block:: json { @@ -367,17 +396,22 @@ Used to update gravity settings via an HTTP POST command. Payload is in JSON for } -POST: /api/config/gravity -========================= +POST: /api/config/hardware +========================== Used to update hardware settings via an HTTP POST command. Payload is in JSON format. +.. note:: + ``gyro-temp`` is defined as "on" or "off" when posting since this is the output values from a checkbox, when + reading data it's sent as boolean (true,false). + .. code-block:: json { "id": "ee1bfc", "voltage-factor": 1.59, "temp-adjustment": 0, + "gyro-temp": "off", "ota-url": "http://192.168.1.50/firmware/gravmon/" } @@ -440,10 +474,10 @@ present or the API call will fail. url = "http://" + host + "/api/config/push" json = { "id": id, - "http-push": "http://192.168.1.1/ispindel", # HTTP endpoint - "http-push2": "", # HTTP endpoint2 - "brewfather-push": "", # Brewfather URL - "influxdb2-push": "", # InfluxDB2 settings + "http-push": "http://192.168.1.1/ispindel", + "http-push2": "", + "brewfather-push": "", + "influxdb2-push": "", "influxdb2-org": "", "influxdb2-bucket": "", "influxdb2-auth": "" @@ -452,16 +486,17 @@ present or the API call will fail. url = "http://" + host + "/api/config/gravity" json = { "id": id, - "gravity-formula": "", # If you want to set the gravity formula - "gravity-temp-adjustment": "off" # on or off + "gravity-formula": "", + "gravity-temp-adjustment": "off" # Adjust gravity (on/off) } set_config( url, json ) url = "http://" + host + "/api/config/hardware" json = { "id": id, - "voltage-factor": 1.59, # Default value for voltage calculation - "temp-adjustment": 0, # If temp sensor needs to be corrected - "ota-url": "" # if the device should seach for a new update when active + "voltage-factor": 1.59, # Default value for voltage calculation + "temp-adjustment": 0, # If temp sensor needs to be corrected + "gyro-temp": "on", # Use the temp sensor in the gyro instead (on/off) + "ota-url": "" # if the device should seach for a new update when active } set_config( url, json ) diff --git a/docs/_sources/functionallity.rst.txt b/docs/_sources/functionallity.rst.txt index bdc086f..1128509 100644 --- a/docs/_sources/functionallity.rst.txt +++ b/docs/_sources/functionallity.rst.txt @@ -48,7 +48,29 @@ The main differences * **Gyro Movement** - The software will detect if the gyro is moving and if this is the case it will go back to sleep for 60seconds. This way we should avoid faulty measurements. + The software will detect if the gyro is moving and if this is the case it will go back to sleep for 60seconds. + This way we should avoid faulty measurements. + +* **WIFI connection issues** + + The software will not wait indefiently for a wifi connection. If it takes longer than 20 seconds to connect then + the device will go into deep sleep for 60 seoncds and then retry. + +* **Use gyro temperature sensor** + + This works fine when the device has time to cool down between measurements and it saves up to 400 ms. + My testing shows that this is quite accurate with a deviation of less than 0.3C. This + reduces the run time by 20% (with optimal wifi connection). + + The graph below compares from the temp from two different devices in the same bucket of water. One with + gyro temp enabled and one with the DS18B20 sensor. The blue line is the gyro temperature and this clear + that the temperature will be higher after it has been running but cools down when in sleep mode. The interval + has been set to 300s. A low delay of 30s will not allow the gyro to cool down and the temperature will + be 0.5-1.0C higher. + +.. image:: images/temp1.png + :width: 800 + :alt: Gyro temp vs DS18B20 Other features -------------- @@ -62,26 +84,21 @@ Other features Experimental features --------------------- -.. tip:: - These are not enabled by default. To enable them you need to recompile the code and enable the correct defines. - -* Use the temperature sensor in the gyro instead of DS18B20 - - This works fine when the device has time to cool down between measurements and it saves a few milliseconds (reduced battery consumption). My testing shows that this is quite accurate. - There is lots of battery power to save, reading the temp sensor takes almost as long as the gyro. This could reduce the run time by 40-50% and probly extend battery life with the same. - However more testing is required. Might add this as an option in the UI. - -* Performance measurements +* **Performance measurements** I've also create a small library to measure execution code in some areas of the code that i know is time consuming. This way I can find a good balance between performace and quality. See the :ref:`compiling-the-software` for more information. +* **Power measurements** + + I've also create a project to measure the power consumption of the device, but more on this later. + Battery life ------------ -I'm currently measuring battery life of v0.5 but previous versions have been able to measure gravity for a 2-3 weeks without issues. Using 900 seconds as interval. +I'm currently measuring battery life of v0.5 but previous versions have been able to measure gravity for a 2-3 weeks without issues (Using 900 seconds as interval). *More on this topics once my tests are done* @@ -95,7 +112,7 @@ The typical runtime in a measurement cycle is approx 2 seconds and in some cases essential for long batterylife. Out of the 2 seconds of run-time the major time is spent on gyro readings (1.3s) and temperature measurements of (0.6s) so using the gyro sensor for measureing temperature would reduce the total runtime with 25%. Sending data over http takes less than 100ms (on my local network) so this is not drawing much power. -The image below shows how the run-time varies over time. The pink line is the wifi connection time and this is why the time varies. +The image below shows how the run-time varies over time. The pink line is the wifi connection time and this is why the time varies. The orange is the total runtime for the awake period. .. image:: images/perf1.png :width: 800 diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt index d3bb0a1..b61cb97 100644 --- a/docs/_sources/index.rst.txt +++ b/docs/_sources/index.rst.txt @@ -7,7 +7,7 @@ Welcome to GravityMon's documentation! ###################################### .. note:: - This documentation reflects **v0.5**. Last updated 2022-01-09 + This documentation reflects **v0.6**. Last updated 2022-01-13 GravityMon is a replacement firmare for the iSpindle firmware, it uses the same hardware configuration so @@ -30,6 +30,7 @@ be found here; `GravityMon on Github `_ I dont take responsibility for any errors that can cause problems with the use. I have tested v0.4 on 5+ brews over the last 6 months without any issues. + The main differences: --------------------- @@ -67,7 +68,7 @@ the following libraries and without these this would have been much more difficu Can detect if the reset button is pressed twice, is used to enter WIFI config mode. -* https://github.com/tzapu/WiFiManager +* https://github.com/khoih-prog/ESP_WiFiManager Configure wifi settings. @@ -91,6 +92,10 @@ the following libraries and without these this would have been much more difficu Create the gravity formula. +* https://github.com/256dpi/arduino-mqtt + + Library for sending data to mqtt based on lightweight mqtt implemenentation. + * https://graphjs.com/ Render the graphs in the UI. @@ -111,6 +116,7 @@ the following libraries and without these this would have been much more difficu configuration compiling contributing + q_and_a backlog Indices and tables diff --git a/docs/_sources/installation.rst.txt b/docs/_sources/installation.rst.txt index 5850fbb..73a66c1 100644 --- a/docs/_sources/installation.rst.txt +++ b/docs/_sources/installation.rst.txt @@ -59,8 +59,9 @@ Configuring WIFI When the device is flashed it will need to have WIFI configuration in order to work. If you have used other software on the device its possible that wifi settings exist. -If this is not configured in the device it will create an wirless access point called `GravMon`. Connect to this AP and -enter the SSID and password you want to use. If the web page dont open automatically you can enter the following adress +If this is not configured in the device it will create an wirless access point called `GravMon`. The default password is `password`. + +Connect to this AP and enter the SSID and password you want to use. If the web page dont open automatically you can enter the following adress in the browser: **http://192.168.4.1** .. image:: images/wifi.png diff --git a/docs/_sources/q_and_a.rst.txt b/docs/_sources/q_and_a.rst.txt new file mode 100644 index 0000000..9a71124 --- /dev/null +++ b/docs/_sources/q_and_a.rst.txt @@ -0,0 +1,8 @@ +Q & A +##### + +My device is no going in to sleep after fully charged +----------------------------------------------------- +- Calibrate the device in the web interface +- Check the angle/tilt. If the device is reporting 90 degress then its not going into sleep. Tilt the device and check if sleep works. +- Check in reported voltage of the battery in the web interface. If this is higher than 4.15V the device belives its beeing charged. In that case adjust the voltage factor under hardware so the voltage drops below 4.15V. diff --git a/docs/_sources/releases.rst.txt b/docs/_sources/releases.rst.txt index 3095f67..36fa92c 100644 --- a/docs/_sources/releases.rst.txt +++ b/docs/_sources/releases.rst.txt @@ -3,6 +3,22 @@ Releases ######## +v0.6.0 (work in progress) +------------------------- + +This is features for the next release. + +* Changed the wifi manager and refactored wifi.cpp +* LED is now turned on when Wifi Portal is open +* Refactored main.cpp to make it easier to read +* Tested runtime performance +* Improved documentation +* Added warning on config page when sleep is <300 +* Enabled selection of gyro temperature sensor under Hardware settings +* Added warning when short sleep interval and gyro temp is enabled +* Added support for MQTT +* Bug: MPU init sometimes caused crash during startup. + v0.5.0 ------ diff --git a/docs/_static/basic.css b/docs/_static/basic.css index 0119285..603f6a8 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,6 +15,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -124,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -271,25 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, .figure.align-default { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -313,24 +319,31 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + padding: 7px; background-color: #ffe; width: 40%; float: right; + clear: right; + overflow-x: auto; } p.sidebar-title { font-weight: bold; } +div.admonition, div.topic, blockquote { + clear: left; +} + /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; - padding: 7px 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -352,10 +365,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -366,9 +375,30 @@ div.body p.centered { margin-top: 25px; } +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + /* -- tables ---------------------------------------------------------------- */ table.docutils { + margin-top: 10px; + margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -416,32 +446,34 @@ table.citation td { border-bottom: none; } -th > p:first-child, -td > p:first-child { +th > :first-child, +td > :first-child { margin-top: 0px; } -th > p:last-child, -td > p:last-child { +th > :last-child, +td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -468,10 +500,71 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ +table.hlist { + margin: 1em 0; +} + table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -495,17 +588,37 @@ ol.upperroman { list-style: upper-roman; } -li > p:first-child { +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { margin-top: 0px; } -li > p:last-child { +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + dl.footnote > dt, dl.citation > dt { float: left; + margin-right: 0.5em; } dl.footnote > dd, @@ -546,7 +659,7 @@ dl { margin-bottom: 15px; } -dd > p:first-child { +dd > :first-child { margin-top: 0px; } @@ -560,6 +673,11 @@ dd { margin-left: 30px; } +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + dt:target, span.highlighted { background-color: #fbe54e; } @@ -573,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -621,8 +731,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -637,6 +748,10 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } +pre, div[class*="highlight-"] { + clear: both; +} + span.pre { -moz-hyphens: none; -ms-hyphens: none; @@ -644,22 +759,57 @@ span.pre { hyphens: none; } +div[class*="highlight-"] { + margin: 1em 0; +} + td.linenos pre { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; } div.code-block-caption { + margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -668,12 +818,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -685,21 +837,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -740,8 +878,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index daccd20..8cbf1b1 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,9 +29,14 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** @@ -285,9 +290,10 @@ var Documentation = { initOnKeyListeners: function() { $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea + // don't navigate when in search box, textarea, dropdown or button if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); @@ -295,12 +301,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index b1053e4..ac7b311 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,10 +1,11 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.5.0', + VERSION: '0.6.0', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false diff --git a/docs/_static/jquery.js b/docs/_static/jquery.js index a1c07fd..b061403 100644 --- a/docs/_static/jquery.js +++ b/docs/_static/jquery.js @@ -1,2 +1,2 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="

",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0{var t={212:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},i=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},l=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=i(a,m);t?d&&t.content===d.content||(l(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(l(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&l(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(212),e=n.n(t),o=null,r=null;function c(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function s(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",c)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current"})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),s()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/docs/_static/scripts/furo.js.LICENSE.txt b/docs/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 0000000..1632189 --- /dev/null +++ b/docs/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/docs/_static/scripts/furo.js.map b/docs/_static/scripts/furo.js.map new file mode 100644 index 0000000..5755bd8 --- /dev/null +++ b/docs/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1))\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n }\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index d11b33a..002e9c4 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -59,10 +59,10 @@ var Search = { _pulse_status : -1, htmlToText : function(htmlString) { - var htmlElement = document.createElement('span'); - htmlElement.innerHTML = htmlString; - $(htmlElement).find('.headerlink').remove(); - docContent = $(htmlElement).find('[role=main]')[0]; + var virtualDocument = document.implementation.createHTMLDocument('virtual'); + var htmlElement = $(htmlString, virtualDocument); + htmlElement.find('.headerlink').remove(); + docContent = htmlElement.find('[role=main]')[0]; if(docContent === undefined) { console.warn("Content block not found. Sphinx search tries to obtain it " + "via '[role=main]'. Could you check your theme or template."); @@ -166,8 +166,7 @@ var Search = { objectterms.push(tmp[i].toLowerCase()); } - if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) || - tmp[i] === "") { + if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") { // skip this "word" continue; } @@ -249,8 +248,9 @@ var Search = { // results left, load the summary and display it if (results.length) { var item = results.pop(); - var listItem = $('
  • '); + var listItem = $('
  • '); var requestUrl = ""; + var linkUrl = ""; if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') { // dirhtml builder var dirname = item[0] + '/'; @@ -260,39 +260,44 @@ var Search = { dirname = ''; } requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname; + linkUrl = requestUrl; } else { // normal html builders requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX; + linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX; } listItem.append($('').attr('href', - requestUrl + + linkUrl + highlightstring + item[2]).html(item[1])); if (item[3]) { listItem.append($(' (' + item[3] + ')')); Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { $.ajax({url: requestUrl, dataType: "text", complete: function(jqxhr, textstatus) { var data = jqxhr.responseText; if (data !== '' && data !== undefined) { - listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); + var summary = Search.makeSearchSummary(data, searchterms, hlterms); + if (summary) { + listItem.append(summary); + } } Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); }}); } else { // no source available, just display title Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } } // search finished, update title and status message @@ -323,7 +328,9 @@ var Search = { var results = []; for (var prefix in objects) { - for (var name in objects[prefix]) { + for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) { + var match = objects[prefix][iMatch]; + var name = match[4]; var fullname = (prefix ? prefix + '.' : '') + name; var fullnameLower = fullname.toLowerCase() if (fullnameLower.indexOf(object) > -1) { @@ -337,7 +344,6 @@ var Search = { } else if (parts[parts.length - 1].indexOf(object) > -1) { score += Scorer.objPartialMatch; } - var match = objects[prefix][name]; var objname = objnames[match[1]][2]; var title = titles[match[0]]; // If more than one term searched for, we require other words to be @@ -377,6 +383,13 @@ var Search = { return results; }, + /** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions + */ + escapeRegExp : function(string) { + return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + }, + /** * search for full-text terms in the index */ @@ -400,13 +413,14 @@ var Search = { ]; // add support for partial matches if (word.length > 2) { + var word_regex = this.escapeRegExp(word); for (var w in terms) { - if (w.match(word) && !terms[word]) { + if (w.match(word_regex) && !terms[word]) { _o.push({files: terms[w], score: Scorer.partialTerm}) } } for (var w in titleterms) { - if (w.match(word) && !titleterms[word]) { + if (w.match(word_regex) && !titleterms[word]) { _o.push({files: titleterms[w], score: Scorer.partialTitle}) } } @@ -488,6 +502,9 @@ var Search = { */ makeSearchSummary : function(htmlText, keywords, hlwords) { var text = Search.htmlToText(htmlText); + if (text == "") { + return null; + } var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { @@ -499,7 +516,7 @@ var Search = { var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); - var rv = $('
    ').text(excerpt); + var rv = $('

    ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); diff --git a/docs/_static/styles/furo-extensions.css b/docs/_static/styles/furo-extensions.css new file mode 100644 index 0000000..3d00c6a --- /dev/null +++ b/docs/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}.highlight button.copybtn{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);color:var(--color-foreground-secondary)}.highlight button.copybtn:hover{background-color:var(--color-background-primary);color:var(--color-foreground-primary)}.highlight button.copybtn:after{background:var(--color-background-primary);color:var(--color-foreground-secondary)}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-background-secondary);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/docs/_static/styles/furo-extensions.css.map b/docs/_static/styles/furo-extensions.css.map new file mode 100644 index 0000000..ba68881 --- /dev/null +++ b/docs/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCACJ,8CACI,kDCjBN,0BAEE,mDACA,gDAFA,uCAEA,CAEA,gCAEE,iDADA,qCACA,CAEF,gCAEE,2CADA,uCACA,CCXJ,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,6DAA8D,CAC9D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n",".highlight button.copybtn\n color: var(--color-foreground-secondary)\n background-color: var(--color-background-secondary)\n border: 1px solid var(--color-background-border)\n\n &:hover\n color: var(--color-foreground-primary)\n background-color: var(--color-background-primary)\n\n &::after\n color: var(--color-foreground-secondary)\n background: var(--color-background-primary)\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-background-secondary)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/_static/styles/furo.css b/docs/_static/styles/furo.css new file mode 100644 index 0000000..c46db39 --- /dev/null +++ b/docs/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}.visually-hidden{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.1);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.1);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.1);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.1);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.1);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.1);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.1);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.1);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.1);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.1);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.1);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.1);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.1);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#646776;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2962ff;--color-brand-content:#2a5adf;--color-api-background:var(--color-background-secondary);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link--hover:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link-underline--hover:var(--color-foreground-border)}.only-light{display:block!important}.only-dark{display:none!important}body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto,body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1{font-size:2.25rem}h2{font-size:1.75rem}h3{font-size:1.25rem}h4{font-size:1rem}h5{font-size:.875rem}h6{font-size:.75rem}h1,h2{font-weight:300;margin-bottom:.75rem}h1,h2,h3{margin-top:1.5rem}h3{font-weight:400}h3,h4,h5,h6{margin-bottom:.5rem}h4,h5,h6{font-weight:700;margin-top:1rem;text-transform:uppercase}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;-webkit-text-decoration-color:var(--color-link-underline);text-decoration-color:var(--color-link-underline)}a:hover{color:var(--color-link--hover);-webkit-text-decoration-color:var(--color-link-underline--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{text-decoration:none}a.muted-link:hover{color:var(--color-link);text-decoration:underline;-webkit-text-decoration-color:var(--color-link-underline);text-decoration-color:var(--color-link-underline)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{background:var(--color-background-primary);color:var(--color-foreground-primary);height:100%}article{background:var(--color-content-background);color:var(--color-content-foreground)}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:-webkit-sticky;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);-webkit-text-decoration-color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);-webkit-text-decoration-color:var(--color-link--hover);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1rem;vertical-align:middle;width:1rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.25rem;width:1.25rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:-webkit-sticky;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;width:100%}:target{scroll-margin-top:var(--header-height)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article div.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.5rem .5rem .5rem 2rem;position:relative}p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig{background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em}.sig:hover{background:var(--color-api-background-hover)}.sig a.reference.internal .viewcode-link{font-weight:400;width:3.5rem}.sig span.pre{word-break:break-word}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}.versionmodified{font-style:italic}div.deprecated p,div.versionadded p,div.versionchanged p{margin-bottom:.125rem;margin-top:.125rem}.viewcode-back,.viewcode-link{float:right;text-align:right}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}p code.literal{border:1px solid var(--color-background-border)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);overflow:auto;padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:-webkit-max-content auto;grid-template-columns:max-content auto}dl.footnote dt{margin:0}dl.footnote dt>.fn-backref{margin-left:.25rem}dl.footnote dt:after{content:":"}dl.footnote dt .brackets:before{content:"["}dl.footnote dt .brackets:after{content:"]"}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd>p:first-child,.field-list dd ul,.option-list dd>p:first-child,.option-list dd ul,dl.footnote dd>p:first-child,dl.footnote dd ul,dl.glossary dd>p:first-child,dl.glossary dd ul,dl.simple dd>p:first-child,dl.simple dd ul,dl:not([class]) dd>p:first-child,dl:not([class]) dd ul{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);font-style:italic;margin-left:0;margin-right:0;padding:.5rem 1rem}p .reference img{vertical-align:middle}.code-block-caption>.headerlink,dl dt>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{font-weight:100;margin-left:.5rem;text-decoration:none;visibility:hidden}.code-block-caption:hover>.headerlink,:target>h1:first-child>.headerlink,:target>h2:first-child>.headerlink,:target>h3:first-child>.headerlink,:target>h4:first-child>.headerlink,:target>h5:first-child>.headerlink,:target>h6:first-child>.headerlink,dl dt:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}dt:target{background-color:var(--color-highlight-on-target)}p.rubric{font-size:var(--font-size--small);font-weight:700;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.related-information{border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);line-height:1.5;margin-top:1rem;padding:.75rem .75rem 1rem}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;-webkit-text-decoration-color:var(--color-link-underline);text-decoration-color:var(--color-link-underline)}.related-pages a svg,.related-pages a svg>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search:-ms-input-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%;word-break:break-word}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23607D8B' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree .reference{color:var(--color-toc-item-text);text-decoration:none;word-break:break-word}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling.Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/docs/_static/styles/furo.css.map b/docs/_static/styles/furo.css.map new file mode 100644 index 0000000..ec55add --- /dev/null +++ b/docs/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/furo.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_permalinks.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_search.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","@import \"~normalize.css\"\n\n@import \"variables\"\n@import \"base\"\n@import \"scaffold\"\n@import \"content\"\n@import \"components\"\n\n@import \"shame\"\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\n.only-dark\n display: none !important\n\n// Enable dark-mode, if requested.\nbody[data-theme=\"dark\"]\n @include colors-dark\n\n .only-light\n display: none !important\n .only-dark\n display: block !important\n\n// Enable dark mode, unless explicitly told to avoid.\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto\n display: block\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.1)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.1)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.1\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #646776; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2962ff;\n --color-brand-content: #2a5adf;\n\n // API documentation\n --color-api-background: var(--color-background-secondary);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link-underline--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #ffffffcc; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2b8cee;\n --color-brand-content: #368ce2;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1\n font-size: 2.25rem\nh2\n font-size: 1.75rem\nh3\n font-size: 1.25rem\nh4\n font-size: 1rem\nh5\n font-size: 0.875rem\nh6\n font-size: 0.75rem\n\n// Main headings\nh1,\nh2\n margin-top: 1.5rem\n margin-bottom: 0.75rem\n font-weight: 300\n\nh3\n margin-top: 1.5rem\n margin-bottom: 0.5rem\n font-weight: 400\n\n// You're in-too-deep headings\nh4,\nh5,\nh6\n text-transform: uppercase\n margin-top: 1rem\n margin-bottom: 0.5rem\n font-weight: 700\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n text-decoration: none\n &:hover\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: 1rem\n width: 1rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1.25rem\n width: 1.25rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: var(--header-height)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article div.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\np.admonition-title, p.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding: 0.5rem 0.5rem 0.5rem 2rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference.internal\n .viewcode-link\n font-weight: normal\n width: 3.5rem\n\n // Break words when they're too long\n span.pre\n word-break: break-word\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\n.versionmodified\n font-style: italic\ndiv.versionadded, div.versionchanged, div.deprecated\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n p &\n border: 1px solid var(--color-background-border)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n overflow: auto\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\ndl.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n font-style: italic\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","// Adapted from Sphinx-RTD-theme's corresponding CSS\n// https://github.com/readthedocs/sphinx_rtd_theme/blob/1a32899b/src/sass/_theme_rst.sass#L201\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\ntable > caption,\n.code-block-caption\n > .headerlink\n font-weight: 100\n margin-left: 0.5rem\n visibility: hidden\n text-decoration: none\n\n &:hover > .headerlink\n visibility: visible\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n :target > &:first-child > .headerlink\n visibility: visible\n\ndt:target\n background-color: var(--color-highlight-on-target)\n","p.rubric\n text-transform: uppercase\n font-size: var(--font-size--small)\n font-weight: bold\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.related-information\n margin-top: 1rem\n\n padding: 0.75rem\n padding-bottom: 1rem\n\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n color: var(--color-foreground-secondary)\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg,\n svg > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","//\n// Search Page Listing\n//\nul.search\n padding-left: 0\n list-style: none\n\n li\n padding: 1rem 0\n border-bottom: 1px solid var(--color-background-border)\n\n//\n// Highlighted by links in search page\n//\n[role=main] .highlighted\n background-color: var(--color-highlighted-background)\n color: var(--color-highlighted-text)\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n word-break: break-word\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Backlog of changes

    Documentation

    @@ -88,42 +204,69 @@

    Code

      -
    • Support for MQTT

    • Support for plato

    • Use pre-commit for validating check-in

    • -
    • Automatic builds via github actions

    +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/compiling.html b/docs/compiling.html index 27e679e..d94ad2e 100644 --- a/docs/compiling.html +++ b/docs/compiling.html @@ -1,41 +1,159 @@ - - - - - - Compiling the software — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Compiling the software

    Tools

    @@ -120,11 +232,11 @@ stable and works fine.

    Source structure

    - +
    --++ @@ -166,16 +278,16 @@ stable and works fine.

    -
    Directory structure

    path

    Test data for developing html files

    +

    Options

    This is a list of C++ defines that is used to enable/disable functions in the code.

    - +
    --++ @@ -186,79 +298,115 @@ stable and works fine.

    - - - - + - + - + - + - + - + - + - + - + - + - + - + -
    Defines

    define

    ACTIVATE_OTA

    Enables the OTA functionallity in the code

    USE_GYRO_TEMP

    Uses temperature from gyro instead of DS18B20 (experimental)

    SKIP_SLEEPMODE

    SKIP_SLEEPMODE

    THe device never goes into sleep mode, useful when developing.

    CFG_DISABLE_LOGGING

    CFG_DISABLE_LOGGING

    Done include verbose logging in Config class. Excessive logging may crash device.

    GYRO_DISABLE_LOGGING

    GYRO_DISABLE_LOGGING

    Done include verbose logging in Gyro class. Excessive logging may crash device.

    PUSH_DISABLE_LOGGING

    PUSH_DISABLE_LOGGING

    Done include verbose logging in PushTarget class. Excessive logging may crash device.

    TSEN_DISABLE_LOGGING

    TSEN_DISABLE_LOGGING

    Done include verbose logging in TempSensor class. Excessive logging may crash device.

    WEB_DISABLE_LOGGING

    WEB_DISABLE_LOGGING

    Done include verbose logging in WebServer class. Excessive logging may crash device.

    MAIN_DISABLE_LOGGING

    MAIN_DISABLE_LOGGING

    Done include verbose logging in Main class. Excessive logging may crash device.

    USE_LITTLEFS

    USE_LITTLEFS

    Use the new filesystem in Ardurino

    EMBED_HTML

    EMBED_HTML

    Html files are included in code, if not defined they are served from the file system.

    USER_SSID

    USER_SSID

    If defined the device will always use this SSID

    USER_SSID_PWD

    USER_SSID_PWD

    Password to the SSID

    CFG_APPVER

    CFG_APPVER

    Defines the version of the compiled software

    +
    + +
    +
    -
    -
    + - - - + + + + + + \ No newline at end of file diff --git a/docs/configuration.html b/docs/configuration.html index 1cc66ec..fcf7efb 100644 --- a/docs/configuration.html +++ b/docs/configuration.html @@ -1,109 +1,199 @@ - - - - - - Setting up device — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Setting up device

    The device can operate in two modes and must be in configuration mode in order for the web server to be active.

    One of the following conditions will place the device in configuration mode:

    @@ -116,7 +206,7 @@

    Status

    URL: (http://gravmon.local)

    -Index page +Index page

    Configuration is accessed by entering the URL for the device, this will be the mDNS name device.local or the IP adress. The following chapter assumes the device name is gravmon.

    The main page shows the device readings; gravity, angle, temperature and battery charge. If the checkbox is active then the device will never go into sleep mode. This is useful if you are collecting angle/tilt for calibration. If this is unchecked the device will change mode as explained before.

    @@ -128,7 +218,7 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w

    Device

    URL: (http://gravmon.local/device)

    -Device Settings +Device Settings
    • Version:

      @@ -152,7 +242,7 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w

      URL: (http://gravmon.local/config)

      Device Setting

      -Device Settings +Device Settings
      • Device name:

        @@ -188,7 +278,7 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w

      Push Settings

      -Push Settings +Push Settings
      • HTTP URL 1:

        @@ -225,11 +315,31 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w

        Token with write access to bucket.

      • +
      • MQTT server:

        +
        +

        IP or name of server to send data to.

        +
        +
      • +
      • MQTT Topic:

        +
        +

        Name of topic to publish sensor readings to, iSpindle format is used.

        +
        +
      • +
      • MQTT user:

        +
        +

        Username or blank if anonymous is accepted

        +
        +
      • +
      • MQTT password:

        +
        +

        Password or blank if anonymous is accepted

        +
        +

      Gravity Settings

      -Gravity Settings +Gravity Settings
      • Gravity formula:

        @@ -254,7 +364,7 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w

      Hardware Settings

      -Hardware Settings +Hardware Settings
      • Voltage factor:

        @@ -263,7 +373,16 @@ you are collecting angle/tilt for calibration. If this is unchecked the device w
      • Temperature correction:

        -

        This value will be added to the temperature reading (negative value will reduce temperature reading).

        +

        This value will be added to the temperature reading (negative value will reduce temperature reading). This is applied +when the device starts. So changing this will not take affect until the device is restarted.

        +
        +
      • +
      • Gyro Temperature:

        +
        +

        Enable this feature will use the temp sensor i the gyro instead of the DS18B20, the benefit is shorter run time and +longer battery life (this is an experimental feature). The value used is the first temperature reading from when the +device is activated, since the gyro should be cool this is reflecting the surronding temperature. After it has +been running the value would be totally off.

      • OTA URL:

        @@ -275,7 +394,7 @@ code the update will be done during startup.

    -
    http://192.168.1.1/firmware/gravmon/
    +
    http://192.168.1.1/firmware/gravmon/
     
    @@ -283,9 +402,9 @@ code the update will be done during startup.

    Create formula

    -Formula data +Formula data

    Here you can enter up to 5 values (angles + gravity) that is then used to create the formula. Angles equal to zero will be regarded as empty even if there is a gravity reading.

    -Formula graph +Formula graph

    Once the formula is created a graph over the entered values and a simulation of the formula will give you a nice overview on how the formula will work.

    @@ -299,48 +418,49 @@ code the update will be done during startup.

  • gravity-format is always G (plato is not yet supported)

  • Other parameters are the same as in the configuration guide.

    -
    {
    -   "mdns": "gravmon",
    -   "id": "ee1bfc",
    -   "ota-url": "http://192.168.1.50:80/firmware/gravmon/",
    -   "temp-format": "C",
    -   "brewfather-push": "http://log.brewfather.net/stream?id=Qwerty",
    -   "http-push": "http://192.168.1.50:9090/api/v1/Qwerty/telemetry",
    -   "http-push2": "http://192.168.1.50/ispindel",
    -   "influxdb2-push": "http://192.168.1.50:8086",
    -   "influxdb2-org": "Qwerty",
    -   "influxdb2-bucket": "Qwerty",
    -   "influxdb2-auth": "Qwerty",
    -   "sleep-interval": 30,
    -   "voltage-factor": 1.59,
    -   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    -   "gravity-format": "G",
    -   "temp-adjustment-value": 0,
    -   "gravity-temp-adjustment": false,
    -   "gyro-calibration-data": {
    -      "ax": -330,
    -      "ay": -2249,
    -      "az": 1170,
    -      "gx": 99,
    -      "gy": -6,
    -      "gz": 4
    -   },
    -   "angle": 90.93,
    -   "gravity": 1.105,
    -   "battery": 0.04
    -}
    +
    {
    +   "mdns": "gravmon",
    +   "id": "ee1bfc",
    +   "ota-url": "http://192.168.1.50:80/firmware/gravmon/",
    +   "temp-format": "C",
    +   "brewfather-push": "http://log.brewfather.net/stream?id=Qwerty",
    +   "http-push": "http://192.168.1.50:9090/api/v1/Qwerty/telemetry",
    +   "http-push2": "http://192.168.1.50/ispindel",
    +   "influxdb2-push": "http://192.168.1.50:8086",
    +   "influxdb2-org": "Qwerty",
    +   "influxdb2-bucket": "Qwerty",
    +   "influxdb2-auth": "Qwerty",
    +   "sleep-interval": 30,
    +   "voltage-factor": 1.59,
    +   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    +   "gravity-format": "G",
    +   "temp-adjustment-value": 0,
    +   "gravity-temp-adjustment": false,
    +   "gyro-temp": true,
    +   "gyro-calibration-data": {
    +      "ax": -330,
    +      "ay": -2249,
    +      "az": 1170,
    +      "gx": 99,
    +      "gy": -6,
    +      "gz": 4
    +   },
    +   "angle": 90.93,
    +   "gravity": 1.105,
    +   "battery": 0.04
    +}
     

    GET: /api/device

    Retrive the current device settings via an HTTP GET command. Payload is in JSON format.

    -
    {
    -   "app-name": "GravityMon ",
    -   "app-ver": "0.0.0",
    -   "id": "ee1bfc",
    -   "mdns": "gravmon"
    -}
    +
    {
    +   "app-name": "GravityMon ",
    +   "app-ver": "0.0.0",
    +   "id": "ee1bfc",
    +   "mdns": "gravmon"
    +}
     
    @@ -351,18 +471,18 @@ code the update will be done during startup.

  • temp-format can be either C or F

  • Other parameters are the same as in the configuration guide.

    -
    {
    -   "id": "ee1bfc",
    -   "angle": 89.86,
    -   "gravity": 1.1052,
    -   "gravity-tempcorr": 1.1031,
    -   "temp-c": 0,
    -   "temp-f": 32,
    -   "battery": 0,
    -   "temp-format": "C",
    -   "sleep-mode": false,
    -   "rssi": -56
    -}
    +
    {
    +   "id": "ee1bfc",
    +   "angle": 89.86,
    +   "gravity": 1.1052,
    +   "gravity-tempcorr": 1.1031,
    +   "temp-c": 0,
    +   "temp-f": 32,
    +   "battery": 0,
    +   "temp-format": "C",
    +   "sleep-mode": false,
    +   "rssi": -56
    +}
     
    @@ -373,20 +493,20 @@ code the update will be done during startup.

  • a1-a4 are the angles/tilt readings (up to 5 are currently supported)

  • g1-g4 are the corresponding gravity reaadings (in SG)

  • -
    {
    -   "id": "ee1bfc",
    -   "a1": 22.4,
    -   "a2": 54.4,
    -   "a3": 58,
    -   "a4": 0,
    -   "a5": 0,
    -   "g1": 1.000,
    -   "g2": 1.053,
    -   "g3": 1.062,
    -   "g4": 1,
    -   "g5": 1
    -   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    -}
    +
    {
    +   "id": "ee1bfc",
    +   "a1": 22.4,
    +   "a2": 54.4,
    +   "a3": 58,
    +   "a4": 0,
    +   "a5": 0,
    +   "g1": 1.000,
    +   "g2": 1.053,
    +   "g3": 1.062,
    +   "g4": 1,
    +   "g5": 1
    +   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    +}
     
    @@ -396,28 +516,28 @@ code the update will be done during startup.

    • temp-format can be either C or F

    -
    {
    -   "id": "ee1bfc",
    -   "mdns": "gravmon",
    -   "temp-format": "C",
    -   "sleep-interval": 30
    -}
    +
    {
    +   "id": "ee1bfc",
    +   "mdns": "gravmon",
    +   "temp-format": "C",
    +   "sleep-interval": 30
    +}
     

    POST: /api/config/push

    Used to update push settings via an HTTP POST command. Payload is in JSON format.

    -
    {
    -   "id": "ee1bfc",
    -   "http-push": "http://192.168.1.50/ispindel",
    -   "http-push2": "",
    -   "brewfather-push": "",
    -   "influxdb2-push": "http://192.168.1.50:8086",
    -   "influxdb2-org": "Qwerty",
    -   "influxdb2-bucket": "Qwerty",
    -   "influxdb2-auth": "Qwerty"
    -}
    +
    {
    +   "id": "ee1bfc",
    +   "http-push": "http://192.168.1.50/ispindel",
    +   "http-push2": "",
    +   "brewfather-push": "",
    +   "influxdb2-push": "http://192.168.1.50:8086",
    +   "influxdb2-org": "Qwerty",
    +   "influxdb2-bucket": "Qwerty",
    +   "influxdb2-auth": "Qwerty"
    +}
     
    @@ -427,23 +547,34 @@ code the update will be done during startup.

    • gravity-formula keywords temp and tilt are supported.

    -
    {
    -   "id": "ee1bfc",
    -   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    -   "gravity-temp-adjustment": "off"
    -}
    +
    +

    Note

    +

    gravity-temp-adjustment is defined as “on” or “off” when posting since this is the output values +from a checkbox, when reading data it’s sent as boolean (true,false).

    +
    +
    {
    +   "id": "ee1bfc",
    +   "gravity-formula": "0.0*tilt^3+0.0*tilt^2+0.0017978*tilt+0.9436",
    +   "gravity-temp-adjustment": "off"
    +}
     
    -
    -

    POST: /api/config/gravity

    +
    +

    POST: /api/config/hardware

    Used to update hardware settings via an HTTP POST command. Payload is in JSON format.

    -
    {
    -   "id": "ee1bfc",
    -   "voltage-factor": 1.59,
    -   "temp-adjustment": 0,
    -   "ota-url": "http://192.168.1.50/firmware/gravmon/"
    -}
    +
    +

    Note

    +

    gyro-temp is defined as “on” or “off” when posting since this is the output values from a checkbox, when +reading data it’s sent as boolean (true,false).

    +
    +
    {
    +   "id": "ee1bfc",
    +   "voltage-factor": 1.59,
    +   "temp-adjustment": 0,
    +   "gyro-temp": "off",
    +   "ota-url": "http://192.168.1.50/firmware/gravmon/"
    +}
     
    @@ -454,19 +585,19 @@ code the update will be done during startup.

  • a1-a4 are the angles/tilt readings (up to 5 are currently supported)

  • g1-g4 are the corresponding gravity reaadings (in SG)

  • -
    {
    -   "id": "ee1bfc",
    -   "a1": 22.4,
    -   "a2": 54.4,
    -   "a3": 58,
    -   "a4": 0,
    -   "a5": 0,
    -   "g1": 1.000,
    -   "g2": 1.053,
    -   "g3": 1.062,
    -   "g4": 1,
    -   "g5": 1
    -}
    +
    {
    +   "id": "ee1bfc",
    +   "a1": 22.4,
    +   "a2": 54.4,
    +   "a3": 58,
    +   "a4": 0,
    +   "a5": 0,
    +   "g1": 1.000,
    +   "g2": 1.053,
    +   "g3": 1.062,
    +   "g4": 1,
    +   "g5": 1
    +}
     
    @@ -477,65 +608,66 @@ present or the API call will fail.

    import requests
     import json
     
    -host = "192.168.1.1"           # IP adress (or name) of the device to send these settings to
    -id = "ee1bfc"                  # Device ID (shown in serial console during startup or in UI)
    +host = "192.168.1.1"           # IP adress (or name) of the device to send these settings to
    +id = "ee1bfc"                  # Device ID (shown in serial console during startup or in UI)
     
     def set_config( url, json ):
    -   headers = { "ContentType": "application/json" }
    +   headers = { "ContentType": "application/json" }
        print( url )
        resp = requests.post( url, headers=headers, data=json )
        if resp.status_code != 200 :
    -      print ( "Failed "  )
    +      print ( "Failed "  )
        else :
    -      print ( "Success "  )
    +      print ( "Success "  )
     
    -url = "http://" + host + "/api/config/device"
    -json = { "id": id,
    -         "mdns": "gravmon",             # Name of the device
    -         "temp-format": "C",            # Temperature format C or F
    -         "sleep-interval": 30           # Sleep interval in seconds
    +url = "http://" + host + "/api/config/device"
    +json = { "id": id,
    +         "mdns": "gravmon",             # Name of the device
    +         "temp-format": "C",            # Temperature format C or F
    +         "sleep-interval": 30           # Sleep interval in seconds
           }
     set_config( url, json )
     
    -url = "http://" + host + "/api/config/push"
    -json = { "id": id,
    -         "http-push": "http://192.168.1.1/ispindel",    # HTTP endpoint
    -         "http-push2": "",                              # HTTP endpoint2
    -         "brewfather-push": "",                         # Brewfather URL
    -         "influxdb2-push": "",                          # InfluxDB2 settings
    -         "influxdb2-org": "",
    -         "influxdb2-bucket": "",
    -         "influxdb2-auth": ""
    +url = "http://" + host + "/api/config/push"
    +json = { "id": id,
    +         "http-push": "http://192.168.1.1/ispindel",
    +         "http-push2": "",
    +         "brewfather-push": "",
    +         "influxdb2-push": "",
    +         "influxdb2-org": "",
    +         "influxdb2-bucket": "",
    +         "influxdb2-auth": ""
              }
     set_config( url, json )
     
    -url = "http://" + host + "/api/config/gravity"
    -json = { "id": id,
    -         "gravity-formula": "",                         # If you want to set the gravity formula
    -         "gravity-temp-adjustment": "off"               # on or off
    +url = "http://" + host + "/api/config/gravity"
    +json = { "id": id,
    +         "gravity-formula": "",
    +         "gravity-temp-adjustment": "off"        # Adjust gravity (on/off)
              }
     set_config( url, json )
     
    -url = "http://" + host + "/api/config/hardware"
    -json = { "id": id,
    -         "voltage-factor": 1.59,                        # Default value for voltage calculation
    -         "temp-adjustment": 0,                          # If temp sensor needs to be corrected
    -         "ota-url": ""                                  # if the device should seach for a new update when active
    +url = "http://" + host + "/api/config/hardware"
    +json = { "id": id,
    +         "voltage-factor": 1.59,                 # Default value for voltage calculation
    +         "temp-adjustment": 0,                   # If temp sensor needs to be corrected
    +         "gyro-temp": "on",                      # Use the temp sensor in the gyro instead (on/off)
    +         "ota-url": ""                           # if the device should seach for a new update when active
           }
     set_config( url, json )
     
    -url = "http://" + host + "/api/formula"
    -json = { "id": id,
    -         "a1": 22.4,
    -         "a2": 54.4,
    -         "a3": 58,
    -         "a4": 0,
    -         "a5": 0,
    -         "g1": 1.000,
    -         "g2": 1.053,
    -         "g3": 1.062,
    -         "g4": 1,
    -         "g5": 1
    +url = "http://" + host + "/api/formula"
    +json = { "id": id,
    +         "a1": 22.4,
    +         "a2": 54.4,
    +         "a3": 58,
    +         "a4": 0,
    +         "a5": 0,
    +         "g1": 1.000,
    +         "g2": 1.053,
    +         "g3": 1.062,
    +         "g4": 1,
    +         "g5": 1
              }
     set_config( url, json )
     
    @@ -543,7 +675,7 @@ present or the API call will fail.

    -

    Data Formats

    +

    Data Formats

    iSpindle format

    This is the format used for standard http posts.

    @@ -551,34 +683,34 @@ present or the API call will fail.

  • corr-gravity is an extended parameter containing a temperature corrected gravity reading.

  • run-time is an extended parameter containing the number of seconds the execution took.

  • -
    {
    -   "name" : "gravmon",
    -   "ID": "2E6753",
    -   "token" : "gravmon",
    -   "interval": 900,
    -   "temperature": 20.5,
    -   "temp-units": "C",
    -   "gravity": 1.0050,
    -   "corr-gravity": 1.0050,
    -   "angle": 45.34,
    -   "battery": 3.67,
    -   "rssi": -12,
    -   "run-time": 6
    -}
    +
    {
    +   "name" : "gravmon",
    +   "ID": "2E6753",
    +   "token" : "gravmon",
    +   "interval": 900,
    +   "temperature": 20.5,
    +   "temp-units": "C",
    +   "gravity": 1.0050,
    +   "corr-gravity": 1.0050,
    +   "angle": 45.34,
    +   "battery": 3.67,
    +   "rssi": -12,
    +   "run-time": 6
    +}
     

    Brewfather format

    This is the format for Brewfather

    -
    {
    -   "name" : "gravmon",
    -   "temp": 20.5,
    -   "temp-unit": "C",
    -   "battery": 3.67,
    -   "gravity": 1.0050,
    -   "gravity_unit": "G",
    -}
    +
    {
    +   "name" : "gravmon",
    +   "temp": 20.5,
    +   "temp-unit": "C",
    +   "battery": 3.67,
    +   "gravity": 1.0050,
    +   "gravity_unit": "G",
    +}
     
    @@ -594,51 +726,115 @@ present or the API call will fail.

    Contents version.json. The version is used by the device to check if the this version is newer. The html files will also be downloaded if the are present on the server. This way it’s easy to upgrade to a version that serve the html files from the file system. If they dont exist nothing will happen, the OTA flashing will still work. If the html files are missing from the file system they can be uploaded manually afterwards.

    -
    {
    -   "project":"gravmon",
    -   "version":"0.4.10",
    -   "html": [
    -      "index.min.htm",
    -      "device.min.htm",
    -      "config.min.htm",
    -      "calibration.min.htm",
    -      "about.min.htm"
    -   ]
    -}
    +
    {
    +   "project":"gravmon",
    +   "version":"0.4.10",
    +   "html": [
    +      "index.min.htm",
    +      "device.min.htm",
    +      "config.min.htm",
    +      "calibration.min.htm",
    +      "about.min.htm"
    +   ]
    +}
     
    +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/contributing.html b/docs/contributing.html index 3d091a2..1cd3e5f 100644 --- a/docs/contributing.html +++ b/docs/contributing.html @@ -1,41 +1,159 @@ - - - - - - Contributing — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Contributing

    This section is under construction.

    - -
    -
    - -
    +
    -
    -
    - + + + + + + + + + + \ No newline at end of file diff --git a/docs/functionallity.html b/docs/functionallity.html index aec1245..940f421 100644 --- a/docs/functionallity.html +++ b/docs/functionallity.html @@ -1,52 +1,163 @@ - - - - - - Functionallity — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Functionallity

    The main differences

    @@ -118,9 +230,25 @@ sequence can be handled via the web interface without need for additional softwa

    You can adjust the temperature reading of the temperature sensor.

  • Gyro Movement

    -

    The software will detect if the gyro is moving and if this is the case it will go back to sleep for 60seconds. This way we should avoid faulty measurements.

    +

    The software will detect if the gyro is moving and if this is the case it will go back to sleep for 60seconds. +This way we should avoid faulty measurements.

    +
  • +
  • WIFI connection issues

    +

    The software will not wait indefiently for a wifi connection. If it takes longer than 20 seconds to connect then +the device will go into deep sleep for 60 seoncds and then retry.

    +
  • +
  • Use gyro temperature sensor

    +

    This works fine when the device has time to cool down between measurements and it saves up to 400 ms. +My testing shows that this is quite accurate with a deviation of less than 0.3C. This +reduces the run time by 20% (with optimal wifi connection).

    +

    The graph below compares from the temp from two different devices in the same bucket of water. One with +gyro temp enabled and one with the DS18B20 sensor. The blue line is the gyro temperature and this clear +that the temperature will be higher after it has been running but cools down when in sleep mode. The interval +has been set to 300s. A low delay of 30s will not allow the gyro to cool down and the temperature will +be 0.5-1.0C higher.

  • +Gyro temp vs DS18B20

    Other features

    @@ -132,25 +260,19 @@ sequence can be handled via the web interface without need for additional softwa

    Experimental features

    -
    -

    Tip

    -

    These are not enabled by default. To enable them you need to recompile the code and enable the correct defines.

    -
      -
    • Use the temperature sensor in the gyro instead of DS18B20

      -

      This works fine when the device has time to cool down between measurements and it saves a few milliseconds (reduced battery consumption). My testing shows that this is quite accurate. -There is lots of battery power to save, reading the temp sensor takes almost as long as the gyro. This could reduce the run time by 40-50% and probly extend battery life with the same. -However more testing is required. Might add this as an option in the UI.

      -
    • -
    • Performance measurements

      +
    • Performance measurements

      I’ve also create a small library to measure execution code in some areas of the code that i know is time consuming. This way I can find a good balance between performace and quality.

      See the Compiling the software for more information.

    • +
    • Power measurements

      +

      I’ve also create a project to measure the power consumption of the device, but more on this later.

      +

    Battery life

    -

    I’m currently measuring battery life of v0.5 but previous versions have been able to measure gravity for a 2-3 weeks without issues. Using 900 seconds as interval.

    +

    I’m currently measuring battery life of v0.5 but previous versions have been able to measure gravity for a 2-3 weeks without issues (Using 900 seconds as interval).

    More on this topics once my tests are done

    @@ -159,40 +281,79 @@ However more testing is required. Might add this as an option in the UI.

    The typical runtime in a measurement cycle is approx 2 seconds and in some cases it can take up to 6-8 seconds but this is mainly related to establishing the WIFI connection. So stable wifi is essential for long batterylife. Out of the 2 seconds of run-time the major time is spent on gyro readings (1.3s) and temperature measurements of (0.6s) so using the gyro sensor for measureing temperature would reduce the total runtime with 25%. Sending data over http takes less than 100ms (on my local network) so this is not drawing much power.

    -

    The image below shows how the run-time varies over time. The pink line is the wifi connection time and this is why the time varies.

    -Performance view +

    The image below shows how the run-time varies over time. The pink line is the wifi connection time and this is why the time varies. The orange is the total runtime for the awake period.

    +Performance view
    +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/genindex.html b/docs/genindex.html index 58e5e0a..db3923c 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -1,40 +1,158 @@ + + + + + - - - - - - Index — GravityMon 0.5.0 documentation - - - - - - - - - - - + Index - GravityMon 0.6.0 documentation + + + + + - -
    - - -
    - -
    -
    -
    -
      -
    • »
    • -
    • Index
    • -
    • -
    • -
    -
    -
    -
    -
    - - -

    Index

    - -
    - -
    - - -
    + +
    + +
    +
    +
    +
    +
    +
    -
    - -
    - -
    -

    © Copyright 2021-2022, Magnus Persson.

    -
    - - Built with Sphinx using a - theme - provided by Read the Docs. - - -
    +
    -
    -
    -
    - +
    + +
    +

    Index

    +
    +
    - +
    + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 8983e8c..01c664c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,40 +1,159 @@ - - - - - - Welcome to GravityMon’s documentation! — GravityMon 0.5.0 documentation - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Welcome to GravityMon’s documentation!

    Note

    -

    This documentation reflects v0.5. Last updated 2022-01-09

    +

    This documentation reflects v0.6. Last updated 2022-01-13

    GravityMon is a replacement firmare for the iSpindle firmware, it uses the same hardware configuration so you can easily switch between them. It’s used to measure gravity in beer and show the progress of fermentation.

    @@ -127,7 +247,7 @@ the following libraries and without these this would have been much more difficu
  • https://github.com/khoih-prog/ESP_DoubleResetDetector

    Can detect if the reset button is pressed twice, is used to enter WIFI config mode.

  • -
  • https://github.com/tzapu/WiFiManager

    +
  • https://github.com/khoih-prog/ESP_WiFiManager

    Configure wifi settings.

  • https://github.com/thijse/Arduino-Log

    @@ -145,6 +265,9 @@ the following libraries and without these this would have been much more difficu
  • https://github.com/Rotario/arduinoCurveFitting

    Create the gravity formula.

  • +
  • https://github.com/256dpi/arduino-mqtt

    +

    Library for sending data to mqtt based on lightweight mqtt implemenentation.

    +
  • https://graphjs.com/

    Render the graphs in the UI.

  • @@ -153,10 +276,11 @@ the following libraries and without these this would have been much more difficu
    -

    Contents:

    +

    Contents:

    @@ -210,6 +334,10 @@ the following libraries and without these this would have been much more difficu
  • Contributing
  • +
  • Q & A +
  • Backlog of changes
    • Documentation
    • Code
    • @@ -228,34 +356,64 @@ the following libraries and without these this would have been much more difficu
  • +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/installation.html b/docs/installation.html index 75f6676..48ec9c8 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -1,89 +1,199 @@ - - - - - - Installation — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Installation

    Official esptool

    @@ -101,7 +211,7 @@ here;

    To check output from the device (logs) there are several tools out there. I found this simple tool in the Windows Store called Serial Port Monitoring. Just select a baud rate of 115200, 8N1.

    -Serial output +Serial output

    Binaries

    @@ -125,42 +235,83 @@ and code is in sync.

    Configuring WIFI

    When the device is flashed it will need to have WIFI configuration in order to work. If you have used other software on the device its possible that wifi settings exist.

    -

    If this is not configured in the device it will create an wirless access point called GravMon. Connect to this AP and -enter the SSID and password you want to use. If the web page dont open automatically you can enter the following adress +

    If this is not configured in the device it will create an wirless access point called GravMon. The default password is password.

    +

    Connect to this AP and enter the SSID and password you want to use. If the web page dont open automatically you can enter the following adress in the browser: http://192.168.4.1

    -Wifi page +Wifi page
    +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/license.html b/docs/license.html index a53c920..81c3457 100644 --- a/docs/license.html +++ b/docs/license.html @@ -1,43 +1,161 @@ - - - - - - Licence — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Licence

    MIT License

    Copyright (c) 2021-22 Magnus

    @@ -95,35 +214,51 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    - -
    -
    - -
    +
    -
    -
    - + + + + + + + + + + \ No newline at end of file diff --git a/docs/objects.inv b/docs/objects.inv index 9820c3ca68f40ecedba693d45c4aa1874b6e92b5..cd0cb155219d015745cc8db265d9efc712fa67fa 100644 GIT binary patch delta 412 zcmV;N0b~CE1B(QZd4E&OPQx$|y!$JRK-_}Fm0NiViAtqK;#h5+O=98LA>I^v<2U#{ zz63YU!)}Y{Et#E}owdCy5O2!l+){d#8o`rGzVgsTL8ao?UEO3{6rgjoOqjBgO6o{7 zfL?YpaHv3TO-3J3<0wrWob+((qhN(<-|6)1Z!ew6ys3et(SLE2py1;ykZ5brR6NDC z6s?+SxoT){juG!i84)IG1i~aUb=fG`4ZhoV8@?6rPQX$iXw^XW2=%R_^LtNcS);|a z2uexXgrVb#k9{9uhr~nc19I1U#~?>7b&8*{v`2l<$L%K@XpzUhcCaMv41(%Eve||TH)5oIUxH4T5GLy&uX*O@e8Or}2o`Nf>oL!pcYiT; z$P$s=!31 G>$8>-%+u}w delta 400 zcmV;B0dM|`1pfn&d4E((Zi6ro-TM@-+AWp3?XJI6ks2vVB6V%d09K8S@Q^mUUZdCR zNos69Hl$K^@aBDHu!ofK52*`kFuTt*r^y{nJ#<@QCFx^d*E!`SQw12pbyW)~R3sWf zFMAp}SOPUV$4}P4Buy-w46yT&ECsoAy1x0}OXZ?y8-_xwxPO(P;M>^)VrS6SG=rny zPK}L7TU^XB;ln5sLU;oVA<1=9wUW&npXYYXI|1zlBxA^&nxVNs{cP!U<>@4E74M2n zN`a@a>A2$CUPahB@fdwZZnI|w1t_61_==?i>ND5fBbjJ@djaDeq&;7tsOf9Nj@Edi z)$jL@p_bcLpnuTKe`QS!+T_LIhWHRVAw=4$y`vZO0u89HG@G@3- uY*-Ih-?9QM*R4v@)`?%03xbyGW$-lrL-deOJlH9^x(Qzew_1PoR-_q(iNh=a diff --git a/docs/q_and_a.html b/docs/q_and_a.html new file mode 100644 index 0000000..6b900ba --- /dev/null +++ b/docs/q_and_a.html @@ -0,0 +1,274 @@ + + + + + + + + Q & A - GravityMon 0.6.0 documentation + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Q & A

    +
    +

    My device is no going in to sleep after fully charged

    +
      +
    • Calibrate the device in the web interface

    • +
    • Check the angle/tilt. If the device is reporting 90 degress then its not going into sleep. Tilt the device and check if sleep works.

    • +
    • Check in reported voltage of the battery in the web interface. If this is higher than 4.15V the device belives its beeing charged. In that case adjust the voltage factor under hardware so the voltage drops below 4.15V.

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/docs/releases.html b/docs/releases.html index cee5f1d..c0a8eca 100644 --- a/docs/releases.html +++ b/docs/releases.html @@ -1,48 +1,162 @@ - - - - - - Releases — GravityMon 0.5.0 documentation - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +

    Releases

    +
    +

    v0.6.0 (work in progress)

    +

    This is features for the next release.

    +
      +
    • Changed the wifi manager and refactored wifi.cpp

    • +
    • LED is now turned on when Wifi Portal is open

    • +
    • Refactored main.cpp to make it easier to read

    • +
    • Tested runtime performance

    • +
    • Improved documentation

    • +
    • Added warning on config page when sleep is <300

    • +
    • Enabled selection of gyro temperature sensor under Hardware settings

    • +
    • Added warning when short sleep interval and gyro temp is enabled

    • +
    • Added support for MQTT

    • +
    • Bug: MPU init sometimes caused crash during startup.

    • +
    +

    v0.5.0

    Latest stable version.

    @@ -99,35 +230,72 @@
    +
    +
    +
    -
    -
    +
    + + +
    - - - + + + + + + \ No newline at end of file diff --git a/docs/search.html b/docs/search.html index f4bc71a..3cd443d 100644 --- a/docs/search.html +++ b/docs/search.html @@ -1,42 +1,157 @@ - - - - - - Search — GravityMon 0.5.0 documentation - - - - - - - - - - - - - - + + + + + - -
    - - -
    - -
    -
    -
    -
      -
    • »
    • -
    • Search
    • -
    • -
    • -
    -
    -
    -
    - - - - -
    - -
    - -
    -
    -
    - -
    - -
    -

    © Copyright 2021-2022, Magnus Persson.

    -
    - - Built with Sphinx using a - theme - provided by Read the Docs. - - -
    -
    +
    - + + + +
    +
    +
    +
    +
    + +
    + +
    +
    + + + +
    + +
    +
    + +
    +
    - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/docs/searchindex.js b/docs/searchindex.js index 4722d64..afa6083 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["backlog","compiling","configuration","contributing","functionallity","index","installation","license","releases","styling"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["backlog.rst","compiling.rst","configuration.rst","contributing.rst","functionallity.rst","index.rst","installation.rst","license.rst","releases.rst","styling.rst"],objects:{},objnames:{},objtypes:{},terms:{"0x0":6,"100m":4,"15v":2,"20c":2,"2e6753":2,"60second":4,"8n1":6,"900s":2,"break":8,"case":4,"class":1,"default":[2,4,6],"function":[1,2,4,5],"import":2,"long":[2,4],"new":[1,2],"switch":5,"try":[1,6],"while":4,AND:7,Added:8,BUT:7,FOR:7,For:[2,5],NOT:7,One:2,THE:7,THe:1,The:[1,2,6,7],There:[1,4,5],These:[2,4],USE:7,Use:[0,1,4],Used:2,Uses:1,Using:[4,5],WITH:7,Will:2,abl:4,about:[2,9],abov:7,access:[2,6],accur:4,accuraci:4,acheiv:5,action:[0,7],activ:[2,4],activate_ota:1,add:4,added:2,addit:4,adjust:[2,4,5],adress:[2,6],afterward:2,against:2,all:[2,4,6,7,8],almost:4,also:[2,4,5,6],alwai:[1,2,4],angl:[2,4,9],ani:[1,2,5,7],anoth:4,api:[4,5],app:2,appli:2,applic:2,approach:[5,6],approx:4,arduino:5,arduinocurvefit:5,arduinojson:5,ardurino:1,area:4,aris:7,associ:7,assum:2,auth:2,author:7,automat:[0,1,4,5,6],avoid:[4,8],back:4,backlog:5,balanc:4,base:[4,5],basic:[5,6],batteri:[2,5,9],batterylif:4,baud:6,bblanchon:5,becaus:5,becom:6,been:[2,4,5],beer:[4,5],befor:2,behav:4,below:4,between:[2,4,5],big:4,bin:[1,2,6],binari:[1,5],bold:9,breakdown:5,brew:5,brewfath:[4,5],browser:6,bucket:2,build:[0,1,4,5,6,8],button:[2,5],cal:2,calcual:2,calcuat:8,calcul:[2,4,5],calibr:[2,4,9],call:[5,6],can:[1,2,4,5,6],cannot:2,caus:[1,5],celciu:4,celsiu:2,certain:1,cfg_appver:1,cfg_disable_log:1,chang:[2,4,5],chapter:2,charg:[2,7],charger:2,check:[0,1,2,4,6],checkbox:2,chip:[2,5],choos:2,circumstans:1,claim:7,cleanup:8,code:[2,4,5,6,8,9],codeplea:5,collect:[2,4],com4:6,com:5,combin:5,come:5,command:[2,6],commit:[0,1],commun:5,compat:2,compil:[4,5,6],complet:5,condit:[2,7],config:[1,5,8,9],configu:2,configur:[4,5],connect:[2,4,6,7],consol:2,construct:3,consum:4,consumpt:4,contain:[1,2,5],content:[1,2,5,9],contenttyp:2,contract:7,contribut:[0,5],control:5,cool:4,copi:7,copyright:7,corr:[2,9],correct:[2,4,5],correspond:2,corrupt:1,could:4,cover:5,cpp:1,crash:1,creat:[4,5,6],creator:5,css:5,current:[2,4,6],cycl:4,damag:7,dash:2,data:[1,4,5,6],databas:6,deal:7,debug:1,deep:1,def:2,defin:[2,4,8],defint:1,degre:2,depend:8,descript:1,design:5,destin:4,detail:6,detect:[4,5],develop:1,devic:[1,4,5,6,8,9],differ:6,difficult:5,directori:6,disabl:[1,2],distribut:7,disucss:5,doc:1,document:[1,6,7,8],doe:1,don:[2,4],done:[1,2,4,5],dont:[2,5,6],down:4,download:2,draw:4,driver:6,ds18b20:[1,4,5],dure:2,earli:5,easi:2,easier:[2,6],easili:5,ee1bfc:2,either:2,els:2,embed:6,embed_html:1,empti:2,enabl:[1,4,6],endpoint2:2,endpoint:[2,4,5],ensur:[4,6],enter:[2,4,5,6],entir:4,equal:2,eras:6,erase_flash:6,error:5,esp8266:[2,5,6],esp_doubleresetdetector:5,esptool:5,essenti:4,establish:4,even:[2,5],event:7,exampl:2,excess:1,execut:[2,4,6],exist:[2,6],experiment:[1,5],explain:2,express:7,extend:[2,4],extern:1,factor:2,fail:2,fals:2,fantast:5,farenheight:2,farenheigt:4,faster:5,faulti:[2,4],featur:[5,8],ferment:5,few:[4,5],figur:1,file:[1,2,5,6,7,8],filesystem:1,find:[4,5,6],fine:[1,4],firmar:5,firmwar:[2,5,6],first:6,fit:7,flash:[1,2],flat:2,follow:[1,2,4,5,6,7],forc:4,forget:2,format:[4,5],formula:[4,5,8],forum:5,found:[1,5,6],free:7,from:[1,4,5,6,7,8],functional:[1,5],furnish:7,gather:4,get:5,getbootstrap:5,git:[1,5],github:[0,4,5,8],give:2,goe:1,good:4,grant:7,graph:[2,4,5],graphitemast:5,graphj:5,graviti:[1,4,5,9],gravity_unit:2,gravitymon:2,gravmon:[2,6,9],guid:2,gyro:[1,2,4,5],gyro_disable_log:1,had:5,handl:[4,5],happen:2,hardwar:5,has:[2,4],have:[4,5,6],header:2,here:[2,4,5,6],herebi:7,high:2,holder:7,home:6,homepag:5,horizont:2,host:[2,9],how:[2,4],howev:4,htm:[2,9],html:[1,2,5,6,9],http:[2,4,5,6],i2cdevlib:5,idea:5,identifi:2,imag:[1,4],img:1,impli:7,incbin:5,includ:[1,5,7],independ:4,index:[2,5,9],influx:[5,6],influxdb2:[2,4],influxdb:2,inform:[4,5],input:1,instal:[2,5],instead:[1,4,5],instruct:0,interact:[4,5],interfac:[2,4],interv:[2,4],ispindel:[2,5],ispindl:[4,5],issu:[1,4,5,6],ital:9,its:[5,6],jrowberg:5,json:5,just:[4,6],kei:2,keyword:2,khoih:5,kind:7,know:4,larg:6,last:5,latest:8,less:4,level:5,liabil:7,liabl:7,lib:1,librari:[1,4,5,8],licenc:5,licens:7,life:5,like:[4,5],limit:7,line:4,list:[1,9],littl:5,local:[2,4,5],locat:2,log:[1,2,5,6],loglevel:5,lot:4,low:[2,5],magnu:7,mai:1,main:[1,2],main_disable_log:1,mainli:4,major:4,make:[4,6],manag:1,mani:[4,5],manual:2,maximum:1,mdn:[2,9],measur:[1,2,4,5,9],merchant:7,merg:7,might:4,milesburton:5,millisecond:4,min:[2,9],minifi:1,minimis:1,minut:2,miss:2,mit:7,mode:[1,2,4,5],model:1,modifi:7,modul:5,monitor:[2,4,5],month:5,more:[4,5],move:[4,6],movement:4,mqtt:0,much:[4,5,6],multipl:[4,5],must:2,name:2,natur:5,need:[2,4,6],neg:2,net:2,network:[2,4],never:[1,2],newer:2,nice:[2,4],noninfring:7,note:9,noth:2,notic:7,now:8,number:[2,8],obtain:7,off:2,offici:5,old:5,onc:[2,4],one:[4,5],onewir:5,onli:[4,6],open:[5,6],oper:[2,4,5],optimis:5,option:[2,4,5,6],order:[1,2,6],org:2,organis:2,orient:2,origin:[4,5],ota:[1,2,4,5],other:[1,2,5,6,7],otherwis:7,out:[1,2,4,6,7],output:6,over:[2,4,5],overview:2,page:[2,5,6],paramet:2,parser:5,part:4,particular:7,password:[1,6],path:1,paulstoffregen:5,payload:2,perf:[1,6],perform:[1,5,6],performac:4,permiss:7,permit:7,person:7,pick:5,pink:4,place:2,platformio:1,plato:[0,2,4],pleas:[4,5],plugin:1,point:[2,6],port:[1,6],portion:7,possibl:[4,6],post:5,power:4,pre:[0,1],prefer:6,present:2,press:[2,5],previou:4,print:2,problem:5,probli:4,proccess:5,process:1,prog:5,program:5,progress:5,project:[2,5,9],provid:7,publish:7,purpos:7,push2:2,push:[4,5],push_disable_log:1,pushtarget:1,python:5,qualiti:4,quit:[4,5],qwerti:2,rais:4,rate:6,reaad:2,read:[2,4,5],readm:1,recommend:2,recompil:4,reduc:[2,4],refactor:8,reflect:5,regard:2,regular:4,relat:4,releas:[1,5,6],render:5,replac:5,repo:4,repositori:5,request:[2,4],requir:[2,4],reset:5,resp:2,respons:5,rest:[4,5],restrict:7,retriv:2,rewrit:8,right:7,rotario:5,rssi:[2,9],run:[1,2,4],runtim:4,safeguard:2,same:[2,4,5],sampl:9,save:[2,4],script:[1,2,4],seach:2,search:5,second:[2,4],section:[2,3,4],see:[2,4,5,6],select:6,sell:7,send:[2,4,5],sensor:[2,4,5],sent:5,sequenc:[2,4],serial:[1,2,5],serv:[1,2],server:2,servic:5,set:[4,5,6,8],set_config:2,sever:6,shall:7,shoot:1,should:[2,4,6],show:[2,4,5],shown:2,simpl:6,simul:[2,4],sinc:[1,4],skip_sleepmod:1,sleep:[1,2,4],small:4,softwar:[4,5,6,7],some:[2,4,5],sourc:5,speed:2,spent:4,src:1,src_doc:1,ssid:[1,6],stabl:[1,4,8],stage:5,standard:[1,2,6],start:[4,5],startup:2,statu:5,status_cod:2,step:[2,4],still:[1,2],stl:1,store:[6,8],stream:2,structur:5,studio:1,style:1,subject:7,sublicens:7,submit:6,substanti:7,success:2,support:[0,2,4,5],sync:6,system:[1,2,6],tabl:2,take:[4,5],target:[4,5],telemetri:2,temp:[2,4,9],tempcorr:2,temperatur:[1,2,4,5],templat:5,tempsensor:1,test:[1,4,5],than:[2,4,5],thei:[1,2],them:[4,5],theori:4,thi:[1,2,3,4,5,6,7],thijs:5,though:5,ticket:5,tile:4,tilt:[2,4],time:[2,4,6],tinyexpr:5,token:2,too:2,took:2,tool:[4,5,6],topic:[4,5],tort:7,total:[4,8],trail:2,trigger:4,troubl:1,tsen_disable_log:1,twice:5,two:[2,4,5],typic:4,tzapu:5,ubuntu:1,uncheck:2,under:[1,3],uniqu:2,unit:2,unless:2,unsabl:1,updat:[2,4,5,8],upgrad:2,upload:2,url:2,usb:6,use:[1,2,4,5,6,7],use_gyro_temp:1,use_littlef:1,used:[1,2,5,6],useful:[1,2,4],user_ssid:1,user_ssid_pwd:1,uses:[1,5],using:[2,4,6],valid:[0,1,4],valu:[2,4],vari:4,variou:[1,5],ver:2,verbos:1,version:[1,4,5,6,8,9],via:[0,2,4,6],view:4,visit:5,visual:1,voltag:2,vscode:1,wai:[2,4],wait:4,wake:4,want:[2,4,5,6],warranti:7,web:[2,4,5,6],web_disable_log:1,webserv:[1,4,5],week:4,well:2,what:[1,4,5],when:[1,2,4,5,6],where:2,whether:7,which:2,whom:7,why:4,wifi:[4,5,8],wifimanag:5,window:1,wirless:6,without:[2,4,5,7],work:[1,2,4,6],would:[4,5],write:[0,2],write_flash:6,wsl2:1,yaml:1,year:5,yet:[1,2,4],you:[2,4,5,6],zero:2},titles:["Backlog of changes","Compiling the software","Setting up device","Contributing","Functionallity","Welcome to GravityMon\u2019s documentation!","Installation","Licence","Releases","Testing formatting"],titleterms:{The:[4,5],api:2,backlog:0,batteri:4,binari:6,brewfath:2,call:2,chang:0,code:[0,1],compil:1,config:2,configur:[2,6],contribut:3,creat:2,credit:5,data:2,defin:1,devic:2,differ:[4,5],directori:1,document:[0,5],esptool:6,experiment:4,featur:4,flash:6,format:[1,2,9],formula:2,from:2,functional:4,get:2,graviti:2,gravitymon:5,hardwar:2,header:9,indic:5,influx:2,instal:6,ispindl:2,json:2,licenc:7,life:4,main:[4,5],monitor:6,offici:6,option:1,other:4,perform:4,post:2,push:2,python:2,releas:8,rest:2,serial:6,set:2,softwar:1,sourc:1,statu:2,structur:1,tabl:[5,9],target:1,test:9,tool:1,version:2,welcom:5,wifi:6,window:6}}) \ No newline at end of file +Search.setIndex({docnames:["backlog","compiling","configuration","contributing","functionallity","index","installation","license","q_and_a","releases"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["backlog.rst","compiling.rst","configuration.rst","contributing.rst","functionallity.rst","index.rst","installation.rst","license.rst","q_and_a.rst","releases.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[2,4,5],"000":2,"00000000232820948":2,"00000204052596":2,"000134722124":2,"0004":2,"00130346":2,"0017978":2,"0050":2,"01":5,"04":2,"053":2,"062":2,"0c":4,"0x0":6,"1":[2,4,6],"10":[2,6],"100m":4,"1031":2,"105":2,"1052":2,"115200":[2,6],"1170":2,"12":2,"13":5,"15v":[2,8],"168":[2,6],"18":2,"192":[2,6],"2":[2,4,6],"20":[2,4],"200":2,"2021":7,"2022":5,"20c":2,"22":[2,7],"2249":2,"25":4,"256dpi":5,"2e6753":2,"3":[1,2,4],"30":[2,4],"300":[4,9],"32":2,"330":2,"34":2,"3600":2,"3c":4,"3d":1,"3s":4,"4":[2,5,6,8],"400":4,"45":2,"5":[2,4,5],"50":[2,4],"54":2,"56":2,"58":2,"59":2,"6":[2,4,5],"60":[2,4],"60second":4,"67":2,"6s":4,"8":4,"80":2,"8086":2,"85":2,"86":2,"89":2,"8n1":6,"90":[2,8],"900":[2,4],"9090":2,"93":2,"9436":2,"96":2,"99":2,"boolean":2,"break":9,"case":[4,8],"class":1,"default":[2,6],"do":[4,5,6,7],"function":[1,2,4,5],"import":2,"long":[2,4],"new":[1,2],"short":9,"switch":5,"true":2,"try":[1,6],"while":4,A:[4,5,7],AND:7,AS:7,BE:7,BUT:7,FOR:7,For:[2,5],IN:7,IS:7,If:[1,2,4,6,8],In:[1,4,6,8],Is:2,It:[1,2,5],NO:7,NOT:7,OF:7,OR:7,One:[2,4],THE:7,THe:1,TO:7,The:[1,2,6,7],There:[1,5],These:2,To:6,WITH:7,Will:2,a1:2,a2:2,a3:2,a4:2,a5:2,abl:4,about:2,abov:7,accept:2,access:[2,6],accur:4,accuraci:4,acheiv:5,action:7,activ:[2,4],activate_ota:1,ad:[2,9],addit:4,adjust:[2,4,5,8],adress:[2,6],affect:2,after:[2,4,5],afterward:2,against:2,all:[2,4,6,7,9],allow:4,also:[2,4,5,6],alwai:[1,2,4],an:[2,4,6,7],angl:[2,4,8],ani:[1,2,5,7],anonym:2,anoth:4,ap:6,api:[4,5],app:2,appli:2,applic:2,approach:[5,6],approx:4,ar:[1,2,4,5,6,9],arduino:5,arduinocurvefit:5,arduinojson:5,ardurino:1,area:4,aris:7,associ:7,assum:2,auth:2,author:7,automat:[1,4,5,6],avoid:[4,9],awak:4,ax:2,ay:2,az:2,back:4,backlog:5,balanc:4,base:[4,5],basic:[5,6],batteri:[2,5,8],batterylif:4,baud:6,bblanchon:5,becaus:5,becom:6,bee:8,been:[2,4,5],beer:[4,5],befor:2,behav:4,beliv:8,below:[4,8],benefit:2,between:[2,4,5],big:4,bin:[1,2,6],binari:[1,5],blank:2,blue:4,breakdown:5,brew:5,brewfath:[4,5],browser:6,bucket:[2,4],bug:9,build:[1,4,5,6,9],button:[2,5],c:[1,2,7,9],cal:2,calcual:2,calcuat:9,calcul:[2,4,5],calibr:[2,4,8],call:[5,6],can:[1,2,4,5,6],cannot:2,caus:[1,5,9],celciu:4,celsiu:2,certain:1,cfg_appver:1,cfg_disable_log:1,chang:[2,4,5,9],chapter:2,charg:[2,5,7],charger:2,check:[0,1,2,4,6,8],checkbox:2,chip:[2,5],choos:2,circumstans:1,claim:7,cleanup:9,clear:4,code:[2,4,5,6,9],codeplea:5,collect:[2,4],com4:6,com:5,combin:5,come:5,command:[2,6],commit:[0,1],commun:5,compar:4,compat:2,compil:[4,5,6],complet:5,condit:[2,7],config:[1,5,9],configu:2,configur:[4,5],connect:[2,4,6,7],consol:2,construct:3,consum:4,consumpt:4,contain:[1,2,5],content:[1,2],contenttyp:2,contract:7,contribut:[0,5],control:5,cool:[2,4],copi:7,copyright:7,corr:2,correct:[2,4,5],correspond:2,corrupt:1,cover:5,cpp:[1,9],crash:[1,9],creat:[4,5,6],creator:5,css:5,current:[2,4,6],cycl:4,damag:7,dash:2,data:[1,4,5,6],databas:6,db:5,deal:7,debug:1,deep:[1,4],def:2,defin:[2,4,9],defint:1,degre:2,degress:8,delai:4,depend:9,descript:1,design:5,destin:4,detail:6,detect:[4,5],develop:1,deviat:4,devic:[1,4,5,6,9],differ:6,difficult:5,directori:6,disabl:[1,2],distribut:7,disucss:5,doc:1,document:[1,6,7,9],doe:1,don:[2,4],done:[1,2,4,5],dont:[2,5,6],down:4,download:2,draw:4,driver:6,drop:8,ds18b20:[2,4,5],dure:[2,9],earli:5,easi:2,easier:[2,6,9],easili:5,ee1bfc:2,either:2,els:2,embed:6,embed_html:1,empti:2,enabl:[1,2,4,6,9],endpoint:[2,4,5],ensur:[4,6],enter:[2,4,5,6],entir:4,equal:2,eras:6,erase_flash:6,error:5,esp8266:[2,5,6],esp_doubleresetdetector:5,esp_wifimanag:5,esptool:5,essenti:4,establish:4,even:[2,5],event:7,exampl:2,excess:1,execut:[2,4,6],exist:[2,6],experiment:[2,5],explain:2,express:7,extend:2,extern:1,f:2,factor:[2,8],fail:2,fals:2,fantast:5,farenheight:2,farenheigt:4,faster:5,faulti:[2,4],featur:[2,5,9],ferment:5,few:5,figur:1,file:[1,2,5,6,7,9],filesystem:1,find:[4,5,6],fine:[1,4],firmar:5,firmwar:[2,5,6],first:[2,6],fit:7,flash:[1,2],flat:2,follow:[1,2,4,5,6,7],forc:4,forget:2,format:[4,5],formula:[4,5,9],forum:5,found:[1,5,6],free:7,from:[1,4,5,6,7,9],fulli:5,functional:[1,5],furnish:7,g1:2,g2:2,g3:2,g4:2,g5:2,g:2,gather:4,get:5,getbootstrap:5,git:[1,5],github:[4,5,9],give:2,go:[2,4,5],goe:1,good:4,grant:7,graph:[2,4,5],graphitemast:5,graphj:5,graviti:[1,4,5],gravity_unit:2,gravitymon:2,gravmon:[2,6],guid:2,gx:2,gy:2,gyro:[1,2,4,5,9],gyro_disable_log:1,gz:2,ha:[2,4],had:5,handl:[4,5],happen:2,hardwar:[5,8,9],have:[4,5,6],header:2,here:[2,4,5,6],herebi:7,high:2,higher:[4,8],holder:7,home:6,homepag:5,horizont:2,host:2,how:[2,4],howev:4,htm:2,html:[1,2,5,6],http:[2,4,5,6],i2cdevlib:5,i:[1,2,4,5,6],id:2,idea:5,identifi:2,imag:[1,4],img:1,implemenent:5,impli:7,improv:9,incbin:5,includ:[1,5,7],indefi:4,independ:4,index:[2,5],influx:[5,6],influxdb2:[2,4],influxdb:2,inform:[4,5],init:9,input:1,instal:[2,5],instead:[2,5],instruct:0,interact:[4,5],interfac:[2,4,8],interv:[2,4,9],ip:2,ispindel:[2,5],ispindl:[4,5],issu:[1,4,5,6],its:[5,6,8],jrowberg:5,json:5,just:[4,6],kei:2,keyword:2,khoih:5,kind:7,know:4,larg:6,last:5,later:4,latest:9,led:9,less:4,level:5,liabil:7,liabl:7,lib:1,librari:[1,4,5,9],licenc:5,licens:7,life:[2,5],lightweight:5,like:[4,5],limit:7,line:4,list:1,littl:5,local:[2,4,5],locat:2,log:[1,2,5,6],loglevel:5,longer:[2,4],lot:4,low:[2,4,5],m:[1,4],magnu:7,mai:1,main:[1,2,9],main_disable_log:1,mainli:4,major:4,make:[4,6,9],manag:[1,9],mani:[4,5],manual:2,maximum:1,md:1,mdn:2,measur:[1,2,4,5],merchant:7,merg:7,milesburton:5,min:2,minifi:1,minimis:1,minut:2,miss:2,mit:7,mode:[1,2,4,5],model:1,modifi:7,modul:5,monitor:[2,4,5],month:5,more:[4,5],move:[4,6],movement:4,mpu:9,mqtt:[2,5,9],ms:4,much:[4,5,6],multipl:[4,5],must:2,my:[4,5],name:2,natur:5,need:[2,4,6],neg:2,net:2,network:[2,4],never:[1,2],newer:2,next:9,nice:[2,4],noninfring:7,noth:2,notic:7,now:9,number:[2,9],obtain:7,off:2,offici:5,old:5,onc:[2,4],one:[4,5],onewir:5,onli:[4,6],open:[5,6,9],oper:[2,4,5],optim:4,optimis:5,option:[2,4,5,6],orang:4,order:[1,2,6],org:2,organis:2,orient:2,origin:[4,5],ota:[1,2,4,5],other:[1,2,5,6,7],otherwis:7,out:[1,2,4,6,7],output:[2,6],over:[2,4,5],overview:2,page:[2,5,6,9],paramet:2,parser:5,part:4,particular:7,password:[1,2,6],path:1,paulstoffregen:5,payload:2,perf:[1,6],perform:[1,5,6,9],performac:4,period:4,permiss:7,permit:7,person:7,pick:5,pink:4,place:2,platformio:1,plato:[0,2,4],pleas:[4,5],plugin:1,point:[2,6],port:[1,6],portal:9,portion:7,possibl:[4,6],post:5,power:4,pre:[0,1],prefer:6,present:2,press:[2,5],previou:4,print:2,problem:5,proccess:5,process:1,prog:5,program:5,progress:5,project:[2,4,5],provid:7,publish:[2,7],purpos:7,push2:2,push:[4,5],push_disable_log:1,pushtarget:1,py:6,python:5,q:5,qualiti:4,quit:[4,5],qwerti:2,rais:4,rate:6,reaad:2,read:[2,4,5,9],readm:1,recommend:2,reduc:[2,4],refactor:9,reflect:[2,5],regard:2,regular:4,relat:4,releas:[1,5,6],render:5,replac:5,repo:4,report:8,repositori:5,request:[2,4],requir:2,reset:5,resp:2,respons:5,rest:[4,5],restart:2,restrict:7,retri:4,retriv:2,rewrit:9,right:7,rotario:5,rssi:2,run:[1,2,4],runtim:[4,9],safeguard:2,same:[2,4,5],save:[2,4],script:[1,2,4],seach:2,search:5,second:[2,4],section:[2,3,4],see:[2,4,5,6],select:[6,9],sell:7,send:[2,4,5],sensor:[2,4,5,9],sent:[2,5],seoncd:4,sequenc:[2,4],serial:[1,2,5],serv:[1,2],server:2,servic:5,set:[4,5,6,9],set_config:2,sever:6,sg:[2,4],shall:7,shoot:1,shorter:2,should:[2,4,6],show:[2,4,5],shown:2,simpl:6,simul:[2,4],sinc:[1,2,4],skip_sleepmod:1,sleep:[1,2,4,5,9],small:4,so:[2,4,5,6,7,8],softwar:[4,5,6,7],some:[2,4,5],sometim:9,sourc:5,speed:2,spent:4,src:1,src_doc:1,ssid:[1,6],stabl:[1,4,9],stage:5,standard:[1,2,6],start:[2,4,5],startup:[2,9],statu:5,status_cod:2,step:[2,4],still:[1,2],stl:1,store:[6,9],stream:2,structur:5,studio:1,style:1,subject:7,sublicens:7,submit:6,substanti:7,success:2,support:[0,2,4,5,9],surrond:2,sync:6,system:[1,2,6],t:[2,4],tabl:2,take:[2,4,5],target:[4,5],telemetri:2,temp:[2,4,9],tempcorr:2,temperatur:[2,4,5,9],templat:5,tempsensor:1,test:[1,4,5,9],than:[2,4,5,8],thei:[1,2],them:[4,5],theori:4,thi:[1,2,3,4,5,6,7,8,9],thijs:5,though:5,ticket:5,tile:4,tilt:[2,4,8],time:[2,4,6],tinyexpr:5,token:2,too:2,took:2,tool:[4,5,6],topic:[2,4,5],tort:7,total:[2,4,9],trail:2,trigger:4,troubl:1,tsen_disable_log:1,turn:9,twice:5,two:[2,4,5],typic:4,ubuntu:1,ui:[2,5],uncheck:2,under:[1,3,8,9],uniqu:2,unit:2,unless:2,unsabl:1,until:2,up:[4,5],updat:[2,4,5,9],upgrad:2,upload:2,url:2,us:[0,1,2,4,5,6,7],usb:6,use_littlef:1,user:2,user_ssid:1,user_ssid_pwd:1,usernam:2,v0:[4,5],v1:2,v2:5,valid:[0,1,4],valu:[2,4],vari:4,variou:[1,5],ve:4,ver:2,verbos:1,version:[1,4,5,6,9],via:[2,4,6],view:4,visit:5,visual:1,voltag:[2,8],vscode:1,wa:5,wai:[2,4],wait:4,wake:4,want:[4,5,6],warn:9,warranti:7,water:4,we:[2,4],web:[2,4,5,6,8],web_disable_log:1,webserv:[1,4,5],week:4,well:2,what:[1,4,5],when:[1,2,4,5,6,9],where:2,whether:7,which:2,whom:7,why:4,wifi:[4,5,9],window:1,wirless:6,without:[2,4,5,7],work:[1,2,4,5,6,8],would:[2,4,5],write:[0,2],write_flash:6,wsl2:1,yaml:1,year:5,yet:[1,2,4],you:[2,4,5,6],zero:2},titles:["Backlog of changes","Compiling the software","Setting up device","Contributing","Functionallity","Welcome to GravityMon\u2019s documentation!","Installation","Licence","Q & A","Releases"],titleterms:{"0":9,"4":9,"5":9,"6":9,A:8,The:[4,5],after:8,api:2,backlog:0,batteri:4,binari:6,brewfath:2,call:2,chang:0,charg:8,code:[0,1],compil:1,config:2,configur:[2,6],content:5,contribut:3,creat:2,credit:5,data:2,db:2,defin:1,devic:[2,8],differ:[4,5],directori:1,document:[0,5],esptool:6,experiment:4,featur:4,flash:6,format:[1,2],formula:2,from:2,fulli:8,functional:4,get:2,go:8,graviti:2,gravitymon:5,hardwar:2,indic:5,influx:2,instal:6,ispindl:2,json:2,licenc:7,life:4,main:[4,5],monitor:6,my:8,offici:6,option:1,other:4,perform:4,post:2,progress:9,push:2,python:2,q:8,releas:9,rest:2,s:[2,5],serial:6,set:2,sleep:8,softwar:1,sourc:1,statu:2,structur:1,tabl:5,target:1,tool:1,up:2,v0:9,v2:2,version:2,welcom:5,wifi:6,window:6,work:9}}) \ No newline at end of file