From f243160e498bcbd34078adf3d37a931081dc9da5 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 14:38:03 +0200 Subject: [PATCH 01/99] :pencil: Added branch definitions --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 5684998..2a83fee 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - [Configured Platforms](#configured_platforms) - [Development](#package-development) - [Pre-Requisites](#notebook-pre-Requisites) + - [Branches](#cactus-branches) - [Development Environment](#nut_and_bolt-development_environment) - [Build the Firmware](#hammer-build_the_firmware) - [Upload firmware](#rocket-upload_the__firmware) @@ -57,6 +58,13 @@ The following libaries are required: * ArduinoJson@^5.13.4 * OneWire@^2.3.5 * DallasTemperature@^3.9.1 +## :cactus: Branches +Here some description about the used branches + +|Branch|Description| +|-|-| +|master|This contains the latest stable version| +|development|In this branch, I will put every development work for now. This branch is __NOT__ stable| # :nut_and_bolt: Development Environment From 1905f12f375b031745eb785b8f7315b095f8384b Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 14:41:18 +0200 Subject: [PATCH 02/99] :construction: Added new compilerflag "GPIO_MAINTENANCE_PIN" --- platformio.ini | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index bbfe16e..83b81f1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,10 +9,10 @@ framework = arduino build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -D HOMIE_CONFIG=0 -D HOMIE_MDNS=0 - -D GPIO_HX711_DT=13 ;D7 - -D GPIO_HX711_SCK=12 ;D6 - -D GPIO_ONEWIRE_BUS=14 ;D6 - -D GPIO_ONEWIRE_BUS=14 ;D6 + -D GPIO_HX711_DT=13 ;D7 + -D GPIO_HX711_SCK=12 ;D6 + -D GPIO_ONEWIRE_BUS=14 ;D6 + -D GPIO_MAINTENANCE_PIN=15 ;D8 lib_deps = https://github.com/homieiot/homie-esp8266/tree/fix/711-Espressif8266-v3.0.0 @@ -29,9 +29,10 @@ platform = espressif8266 board = d1_mini framework = arduino build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY - -D GPIO_HX711_DT=13 ;D7 - -D GPIO_HX711_SCK=12 ;D6 - -D GPIO_ONEWIRE_BUS=14 ;D5 + -D GPIO_HX711_DT=13 ;D7 + -D GPIO_HX711_SCK=12 ;D6 + -D GPIO_ONEWIRE_BUS=14 ;D5 + -D GPIO_MAINTENANCE_PIN=15 ;D8 lib_deps = https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 ;ArduinoJson@^5.13.4 From 31b6aad82972f7cd99ca6725211def1f9268ed3b Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 14:51:24 +0200 Subject: [PATCH 03/99] :pencil: Added readme --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 2a83fee..061591f 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,50 @@ You can Build your firmware very easyly with the following command: make build-complete ``` +## Environments + +I created two environments. + +* esp12e/minimal +* esp12e/complete + +The minimal enviroments reduce the image size. + +This will be done by setting the compilerflags for the Homie Framework see [here](https://homieiot.github.io/homie-esp8266/docs/3.0.0/advanced-usage/compiler-flags/) for more info about this. + +## Using Compilerflags + +I decided to use Compilerflags to configure the port mappings. So you will be able to modifie the used ports by modifying the flags instead in the source. + +|Flag|Description|Default| +|-|-|-| +|GPIO_HX711_DT|The DT Port for the HX711 device|13 (D7)| +|GPIO_HX711_SCK|The SCK Port for the HX711 device|12 (D6)| +|GPIO_ONEWIRE_BUS|This will be used for the onewire temperture sensors. It declares the data bus|14 (D5)| +|GPIO_MAINTENANCE_PIN|The Switch or Button, that tells the System that the hive must not operate. |15 (D8)| + +This looks like: +```ini +[env:esp12e/complete] +platform = espressif8266 +board = d1_mini +framework = arduino +build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY + -D GPIO_HX711_DT=13 ;D7 + -D GPIO_HX711_SCK=12 ;D6 + -D GPIO_ONEWIRE_BUS=14 ;D5 + -D GPIO_MAINTENANCE_PIN=15 ;D8 +lib_deps = + https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 + ;ArduinoJson@^5.13.4 + OneWire@^2.3.5 + DallasTemperature@^3.9.1 + bogde/HX711@^0.7.4 + RunningMedian@^0.3.0 +monitor_speed = 115200 +lib_compat_mode = strict +``` + ## :rocket: Upload the firmware After a successfull build you can upload it to your connected device with: From 8437aeea9b2688095edf0f632c0e9fa80d24181a Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 14:51:43 +0200 Subject: [PATCH 04/99] :pencil: Removed obsolete init --- README.md | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/README.md b/README.md index 061591f..2ef6319 100644 --- a/README.md +++ b/README.md @@ -103,27 +103,6 @@ I decided to use Compilerflags to configure the port mappings. So you will be ab |GPIO_ONEWIRE_BUS|This will be used for the onewire temperture sensors. It declares the data bus|14 (D5)| |GPIO_MAINTENANCE_PIN|The Switch or Button, that tells the System that the hive must not operate. |15 (D8)| -This looks like: -```ini -[env:esp12e/complete] -platform = espressif8266 -board = d1_mini -framework = arduino -build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY - -D GPIO_HX711_DT=13 ;D7 - -D GPIO_HX711_SCK=12 ;D6 - -D GPIO_ONEWIRE_BUS=14 ;D5 - -D GPIO_MAINTENANCE_PIN=15 ;D8 -lib_deps = - https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 - ;ArduinoJson@^5.13.4 - OneWire@^2.3.5 - DallasTemperature@^3.9.1 - bogde/HX711@^0.7.4 - RunningMedian@^0.3.0 -monitor_speed = 115200 -lib_compat_mode = strict -``` ## :rocket: Upload the firmware After a successfull build you can upload it to your connected device with: From eb49d0d44dffb308c25d5d851e552204dc5357af Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 21:03:30 +0200 Subject: [PATCH 05/99] :sparkles: Added Maintenance Button Support --- platformio.ini | 4 ++-- src/DeviceManager.cpp | 24 +++++++++++++++++++++--- src/DeviceManager.h | 14 +++++++++++++- src/main.cpp | 15 +++++++++++++-- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/platformio.ini b/platformio.ini index 83b81f1..ad671cc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -D GPIO_HX711_DT=13 ;D7 -D GPIO_HX711_SCK=12 ;D6 -D GPIO_ONEWIRE_BUS=14 ;D6 - -D GPIO_MAINTENANCE_PIN=15 ;D8 + -D GPIO_MAINTENANCE_PIN=8 ;D3 lib_deps = https://github.com/homieiot/homie-esp8266/tree/fix/711-Espressif8266-v3.0.0 @@ -32,7 +32,7 @@ build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -D GPIO_HX711_DT=13 ;D7 -D GPIO_HX711_SCK=12 ;D6 -D GPIO_ONEWIRE_BUS=14 ;D5 - -D GPIO_MAINTENANCE_PIN=15 ;D8 + -D GPIO_MAINTENANCE_PIN=5 ;D3 lib_deps = https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 ;ArduinoJson@^5.13.4 diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 2d8e0aa..9739e8f 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -2,7 +2,14 @@ #include void DeviceManager::setup() {} -DeviceManager::DeviceManager() {} +DeviceManager::DeviceManager() +{ +} + +void DeviceManager::Setup() +{ +} + void DeviceManager::SetSleepTime(int time) { this->SleepTime = time; @@ -38,7 +45,7 @@ void DeviceManager::SetStateToMemory(byte value) void DeviceManager::SetStateAndMagicNumberToMemory() { - byte buf[2]; //__attribute__((aligned(4))); + byte buf[2]; //__attribute__((aligned(4))); buf[0] = 0x55; // 85 buf[1] = 0xaa; // 170 //set and write the magic number @@ -52,7 +59,6 @@ bool DeviceManager::IsColdstart() system_rtc_mem_read(RTC_BASE, buf, 2); this->SetStateAndMagicNumberToMemory(); return (buf[0] != 0x55) || (buf[1] != 0xaa); - } void DeviceManager::SetState(byte state) @@ -74,4 +80,16 @@ byte DeviceManager::ReadStateFromMemory() byte DeviceManager::GetCurrentState() { return this->CurrentState; +} + +OperatingStates DeviceManager::GetOperatingState() +{ + int result = digitalRead(GPIO_MAINTENANCE_PIN); + Homie.getLogger() << "Result" << result << endl; + + if (result == HIGH) + { + return OperatingStates::Maintenance; + } + return OperatingStates::Operating; } \ No newline at end of file diff --git a/src/DeviceManager.h b/src/DeviceManager.h index ad9c19b..ef7db8e 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -15,6 +15,12 @@ #define STATE_SLEEP_WAKE 1 #define STATE_CONNECT_WIFI 4 +enum OperatingStates +{ + Maintenance = 1, + Operating = 2 +}; + class DeviceManager { @@ -25,20 +31,26 @@ class DeviceManager void SetSleepTime(int time); // Get the sleeptime in Seconds int GetSleepTime(); + // Do some Setup + void Setup(); + /* Sets the ESP Device to sleep, it convert the sleeptime autmatically into ms. It will also set the next state for the wakeup process. */ void GotToSleep(); void GotToSleep(WakeMode mode); - byte ReadStateFromMemory(); void SetStateToMemory(byte value); void SetStateAndMagicNumberToMemory(); bool IsColdstart(); void SetState(byte state); byte GetCurrentState(); + // Get the actual Operating State + OperatingStates GetOperatingState(); + private: + OperatingStates operatingState; int SleepTime; byte CurrentState; }; diff --git a/src/main.cpp b/src/main.cpp index 2c1d7db..e4ed6e3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,6 +72,7 @@ void onHomieEvent(const HomieEvent &event) case HomieEventType::WIFI_CONNECTED: case HomieEventType::MQTT_DISCONNECTED: case HomieEventType::MQTT_PACKET_ACKNOWLEDGED: + case HomieEventType::SENDING_STATISTICS: break; case HomieEventType::NORMAL_MODE: @@ -144,15 +145,25 @@ void setup() { Homie.disableResetTrigger(); Homie.disableLedFeedback(); // collides with Serial on ESP07 - WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption + WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption Serial.begin(115200); - Homie.getLogger() << endl; + Homie.getLogger() << "///////////////////////////////////////////" << endl; + Homie.getLogger() << "GPIO_MAINTENANCE_PIN: " << GPIO_MAINTENANCE_PIN << endl; Homie.getLogger() << "GPIO_ONEWIRE_BUS: " << GPIO_ONEWIRE_BUS << endl; Homie.getLogger() << "GPIO_HX711_SCK: " << GPIO_HX711_SCK << endl; Homie.getLogger() << "GPIO_HX711_DT: " << GPIO_HX711_DT << endl; Homie.getLogger() << "FW_NAME: " << FW_NAME << endl; Homie.getLogger() << "FW_VERSION: " << FW_VERSION << endl; + Homie.getLogger() << "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; + Homie.getLogger() << "///////////////////////////////////////////" << endl; + if (devicemanager.GetOperatingState() == OperatingStates::Maintenance) + { + Homie.getLogger() << "INFO: Device in Maintenance. Go to sleep" << endl; + devicemanager.GotToSleep(); + return; + } + Homie.getLogger() << "INFO: Device in normal mode." << endl; if (devicemanager.IsColdstart()) { From aed4cbbe2b6be22d5eb161ac48222d8870057588 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 21:18:02 +0200 Subject: [PATCH 06/99] :bulb: Added gerber file and updated the schema --- Distribution/V1/Gerber_PCB_Hivemonitor_V1.zip | Bin 0 -> 17591 bytes Distribution/V1/Schematic.png | Bin 0 -> 79593 bytes README.md | 9 ++++++--- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Distribution/V1/Gerber_PCB_Hivemonitor_V1.zip create mode 100644 Distribution/V1/Schematic.png diff --git a/Distribution/V1/Gerber_PCB_Hivemonitor_V1.zip b/Distribution/V1/Gerber_PCB_Hivemonitor_V1.zip new file mode 100644 index 0000000000000000000000000000000000000000..3a6e6b68c82b24bd0762f50c62a544be96fe4f47 GIT binary patch literal 17591 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 T-mGjORUAO51B}a3ClC(+>-;?6 literal 0 HcmV?d00001 diff --git a/Distribution/V1/Schematic.png b/Distribution/V1/Schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..eb88e6cb1b1d2b96860c669a568be361b848094b GIT binary patch literal 79593 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%0AFrj4XG?=UzH+49awkCTt{79l6op>tTwSLOg_A# zC4*1sO2`f;jnHQAn>L``gmhXome|ppl`NeXlr$kS>H(mCmcSe7Q8cRAAgkG(xGLnm z;xPzl&wnYTqC0p5U|>|`#2P-b>Jbx?o%A$F7z;ctAh!i4C)~5yhSw}5sN546DU5b6 ze%WWu?5GRWJ(ed@(kJ%f1)C47)d^s_`t{a@W8H(5mI(4>@;g;AG&(!ugFp{waKyqN zV!6s z#=b=F<@gElS=#mcrHy1^S)H9Lca%)`&VDOJ7?pR3{{02zm2Sq=Tzow7Lxqc~ zYAxZ_yr3|+K}U&mF?!o0ujTYKcbmevIb#?# zi5bUkTZzskEB6#T_Bgrk=!@!1l{X#7L z#sSuKc0wAM+i%g1#a2yz|7FWf((+}rMk3y43b7sWur(VsIEj)iDtR2)-^u7)q#*su zvW%fey6E)N3lA+G0G*^CJy5fZZd$KqXP~HLEIS#NrB#zqZ5DQse%!Di)vKE7!L|J0 zyd7Yn#J@n2uPcoLt)&E|z}GgD$E~EXwY8i@m&&?zMg~g*CqdFXxWgQ+J|B1bK9qLo z8KkqLGXZk$LrpJX*~w>rrnclq>%5tvrzVCY1L1<6TYrD5W9W}ahX*ytZv8IQt+JUE z_QqUfR6=RB>J#K*vBN06uT$NKgmtI0!?;cQa>A;6oN9@e@T|P@4=N+5B-7|BnUlZS zpPs=IQQK0FY?*U&l&ireBHa@BJD{D*x{245mqV8=0&r0lahyDo6BKq>QTKR9zP1;c z32B-LyP>s~=lhvy=Tsn)xRO2B?xA5$=y^vBb&fp?nLYNPTHnRUsratZZRZ4&r_)OR z>`{%!W9*y#t4Mtk7P!idh2|^vZ3c%8*~Pt!Z`k1V94h{2p_TH#XJy2Y7*+5HYOJ8( zz}R?fNl$TmyTz*IHRE9TJDyUh{#a=8DvBr4(ca1`F5d-1HwH#L0GmkP@bk21p$T=# z&xrfR8-M9Dk6y3NKXD=O*Ni0S#~*8Fbuxs2sCt0;AplLjM#z-T|Nm~mg+2DmBM7{q zvRh{H@4;d(T+?s5WpLp=z>0dv6Ps4}Moru!w{LGfq`xplO?qH};sdc{uO5l;PAlz= z??*l>xpPGdR>zGMVj%%@O1}4r?37|s??6DpB_^Q!F+v-MIlf6xq}!Q7!sxN)GcBs{ zmjWNG!h%YM_DWZEEJTS@bp%WnNeCGaBL_vwK^-zwT$^bS51CjUwdChW#GS)>cHb+; z=)oF+X<^L{A=EHB;7Q3**ZmXr80wnOB>27$qH5s^qh+J?Zp)n@L^;jvZ`s6yZ(IZ? z>1SmGj3vDzI>bdT-34P)oD?=rS=Iu+nawigCjrdUAM?7+055WsX;ls_&b2M zSp$#Wpd>ztIpE=r^W@5vx6TdEJH*AtA$ewA$^6SSPri*!RX94s*&ioTliWHylpiNe zY1q?Y>t34cG6(-)_k6rhv^@g0#-zWUvCZacd`)hTUZ`#77hvvZ*JT z^C{T&CO+2SUKK6DkO{oa0t}z0KQB0P8WGC(*-#dLv^FIdTsl!PYV@k&pmo6ggm{iH zCBk0nW9pY?Nv3T43UIqR1BmM`)w{_2C+zBHf{%e(r$Mk&hwO`~gWc;yMWDdu43?en zEv>|}AFgWD(-&}H_EAiXWK4DbQ`GBsPos9v62tH49Cgm_ywA^cD=EznHs;x3`s%K~ zkL<@(d2a)0=k%ee)|*$!H>Ofp$AYK<_l_T%e(>x zkjZ^ZcJBcqY+vACt-|p^eYm)XB8TR+`To2j`-;N)^;h=<1C3-Rr_JAAHX>QD5fH%v z$An=_OaZK90p5#w_aEW5SY;ER*A!`3dkCiBA_jCgLbS&YpLo7wxIe-v!|DXqW(9|E zYQ!@!pL}Yk@zgfGCG;d7suLFovOnt~5v>oRgci0QWG6EK>U>QghYxaN3$3t*L$AIi zlF9j)AR_PYVz;RP-WM>m!#gXz@GctVDFqea4Y?RlN5%0D*01G8pZ3e)VGK$+^qTU398>>an@f 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%0AC~p5cCtr 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 z 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 2ef6319..816e384 100644 --- a/README.md +++ b/README.md @@ -142,8 +142,12 @@ I Ordered the following parts from my local seller * 1 x TP4056 ## Wiring Schema -Together you can wire it up lik this schematic circuit: -![Circuit](./wiring.png) +To wire it up, you can follow this schematic design + +![Circuit](./Distribution/V1/Schematic.png) + +If you want, you can order a PCB by this design. +You will find it [here](./Distribution/V1/Gerber_PCB_Hivemonitor_V1.zip) ## Wiring H30A to HX711 @@ -151,7 +155,6 @@ I was sometimes confused about the wiring of the loadcell to the HX711. So I dec [Wiring](./h30A_hx711.png) - # Configuration The Configuration is done with an json file. An example of it looks like this: From 4d98eb02ac7727d9a3eaec9f08282d8487d97275 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 21:18:21 +0200 Subject: [PATCH 07/99] :mute: Removed verbose log --- src/DeviceManager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 9739e8f..9951382 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -85,8 +85,6 @@ byte DeviceManager::GetCurrentState() OperatingStates DeviceManager::GetOperatingState() { int result = digitalRead(GPIO_MAINTENANCE_PIN); - Homie.getLogger() << "Result" << result << endl; - if (result == HIGH) { return OperatingStates::Maintenance; From afcb2592c021f09d0f32be5d00f85bd7d67db7a4 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 29 Jul 2021 21:22:00 +0200 Subject: [PATCH 08/99] :sparkles: Feature ready for #12 This commit is the final commit, to add the maintaineance feature. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 816e384..1a13359 100644 --- a/README.md +++ b/README.md @@ -221,8 +221,8 @@ For future Releases I planning to improve some thing and extend it with the foll * Support Lora * Adding custom Webinterface to Configure the Device within the wireles connection -* Adding Maintenance Mode -(Especcially when you work at the bees) +* ~~Adding Maintenance Mode +(Especcially when you work at the bees)~~ DONE Feel free to suggest me more Features. From 97f321362bf6b7fb9487fe96c93c2376dc15bd9a Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 30 Jul 2021 15:56:06 +0200 Subject: [PATCH 09/99] :construction: Added first implemnentation for the autotare functionallity --- data/homie/ui_bundle copy | 7 ++++++ data/homie/ui_bundle.gz | Bin 59532 -> 0 bytes data/homie/ui_bundle.html | 7 ++++++ src/TareUtility.cpp | 46 ++++++++++++++++++++++++++++++++++++++ src/TareUtility.h | 37 ++++++++++++++++++++++++++++++ src/WeightProcessor.cpp | 1 + src/WeightProcessor.h | 3 ++- src/main.cpp | 5 +++++ 8 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 data/homie/ui_bundle copy delete mode 100644 data/homie/ui_bundle.gz create mode 100644 data/homie/ui_bundle.html create mode 100644 src/TareUtility.cpp create mode 100644 src/TareUtility.h diff --git a/data/homie/ui_bundle copy b/data/homie/ui_bundle copy new file mode 100644 index 0000000..07e12e3 --- /dev/null +++ b/data/homie/ui_bundle copy @@ -0,0 +1,7 @@ +Set up your Homie for ESP8266 device
Homie for ESP8266

diff --git a/data/homie/ui_bundle.gz b/data/homie/ui_bundle.gz deleted file mode 100644 index 13983d499881b63c9027a044e856d758894eda9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59532 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
  • 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 Ra{liB{TFnm9UVJ^0|0f1Kdb-% diff --git a/data/homie/ui_bundle.html b/data/homie/ui_bundle.html new file mode 100644 index 0000000..07e12e3 --- /dev/null +++ b/data/homie/ui_bundle.html @@ -0,0 +1,7 @@ +Set up your Homie for ESP8266 device
    Homie for ESP8266

    diff --git a/src/TareUtility.cpp b/src/TareUtility.cpp new file mode 100644 index 0000000..eee1ccb --- /dev/null +++ b/src/TareUtility.cpp @@ -0,0 +1,46 @@ +#include "TareUtility.h" +#include + +TareUtility::TareUtility(WeightProcessor *processor) +{ + this->processor = processor; +} + +float TareUtility::GetZeroOffset() +{ + + this->zeroOffset = this->GetMedianWeight(this->amountWeightSamples, this->delayBetweenSamplesInSeconds); + return this->zeroOffset; +} + +float TareUtility::GetLowerBound() +{ + this->lowerValue = this->GetMedianWeight(this->amountWeightSamples, this->delayBetweenSamplesInSeconds); + return this->lowerValue; +} + +float TareUtility::GetUpperBound() +{ + this->upperValue = this->GetMedianWeight(this->amountWeightSamples, this->delayBetweenSamplesInSeconds); + return this->upperValue; +} + +float TareUtility::GetMedianWeight(int sampleAmount, int delaysbetweenSamples) +{ + RunningMedian weightSamples = RunningMedian(sampleAmount); // create RunningMedian object + do + { + delay(delaysbetweenSamples * 1000); + weightSamples.add(processor->getWeight()); + + } while (weightSamples.getCount() < weightSamples.getSize()); + return weightSamples.getMedian(); +} + +void TareUtility::DoInitialAdjust(float kgValue) +{ + this->GetZeroOffset(); + this->GetLowerBound(); + this->GetUpperBound(); + this->kgDividerValue = (this->upperValue - this->lowerValue) / (kgValue / 1000.0f); +} diff --git a/src/TareUtility.h b/src/TareUtility.h new file mode 100644 index 0000000..e992e84 --- /dev/null +++ b/src/TareUtility.h @@ -0,0 +1,37 @@ +/* + Temperatures.h - Lib for gtting weights +*/ +#ifndef TareUtility_H +#define TareUtility_H + +#include "WeightProcessor.h" + +class TareUtility +{ + + const int delayBetweenSamplesInSeconds = 3; + const int amountWeightSamples = 10; + +public: + TareUtility(WeightProcessor *processor); + // Get the Offset value, when no weight is places + float GetZeroOffset(); + // Get lower bound; + float GetLowerBound(); + // Get the upper bound + float GetUpperBound(); + // Get the Values to Adjust. + void DoInitialAdjust(float kgValue); + // Get weight + float GetMedianWeight(int sampleAmount, int delaysbetweenSamples); + +private: + WeightProcessor *processor; + float zeroOffset; + float upperValue; + float lowerValue; + float kgDividerValue; + float GetWeight(); +}; + +#endif \ No newline at end of file diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index 2ad5907..8ac0e48 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -75,3 +75,4 @@ float WeightProcessor::toKilogram(float getWeighMeasure) { return getWeighMeasure / 1000; } + diff --git a/src/WeightProcessor.h b/src/WeightProcessor.h index ef0f0bc..b611ac9 100644 --- a/src/WeightProcessor.h +++ b/src/WeightProcessor.h @@ -15,7 +15,8 @@ class WeightProcessor float getWeight(float temperatureForCompensation); float toKilogram(float getWeighMeasure); bool DeviceReady(); - + // Performs an automatic tare for the first run + void AutoTare(); private: int _dtPin; int _scPin; diff --git a/src/main.cpp b/src/main.cpp index e4ed6e3..f46dac0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,7 @@ #include "MeasureHandler.h" #include "DeviceManager.h" #include "ConfigurationManager.h" +#include "TareUtility.h" #define FW_NAME "Development" #define FW_VERSION "0.10.0" @@ -40,6 +41,9 @@ BatteryProcessor batteryProcessor; MeasureHandler measures; DeviceManager devicemanager; ConfigurationManager configurationManager; + +TareUtility procs(&scaledevice); + void setupHandler() { measures.setup(); @@ -163,6 +167,7 @@ void setup() devicemanager.GotToSleep(); return; } + Homie.getLogger() << "INFO: Device in normal mode." << endl; if (devicemanager.IsColdstart()) From 891c6a3bdf4ffa55d4e85c87287e74c88f96eff8 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 30 Jul 2021 15:56:29 +0200 Subject: [PATCH 10/99] :fire: Removed obsolete files --- data/homie/ui_bundle copy | 7 ------- data/homie/ui_bundle.html | 7 ------- 2 files changed, 14 deletions(-) delete mode 100644 data/homie/ui_bundle copy delete mode 100644 data/homie/ui_bundle.html diff --git a/data/homie/ui_bundle copy b/data/homie/ui_bundle copy deleted file mode 100644 index 07e12e3..0000000 --- a/data/homie/ui_bundle copy +++ /dev/null @@ -1,7 +0,0 @@ -Set up your Homie for ESP8266 device
    Homie for ESP8266

    diff --git a/data/homie/ui_bundle.html b/data/homie/ui_bundle.html deleted file mode 100644 index 07e12e3..0000000 --- a/data/homie/ui_bundle.html +++ /dev/null @@ -1,7 +0,0 @@ -Set up your Homie for ESP8266 device
    Homie for ESP8266

    From 81521a8f408053c56955859ea5f50db6c5fddb3e Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Sun, 1 Aug 2021 21:21:48 +0200 Subject: [PATCH 11/99] :construction: added new frontend ui for the autotare method --- .gitignore | 2 +- data/html/404.htm | 46 + data/html/index.css | 104 ++ data/html/index.htm | 35 + data/html/index.js | 46 + data/html/settings_general.htm | 0 data/html/settings_tare.htm | 41 + package-lock.json | 2284 ++++++++++++++++++++++++++++++++ package.json | 29 + tools/cdata.js | 254 ++++ 10 files changed, 2840 insertions(+), 1 deletion(-) create mode 100644 data/html/404.htm create mode 100644 data/html/index.css create mode 100644 data/html/index.htm create mode 100644 data/html/index.js create mode 100644 data/html/settings_general.htm create mode 100644 data/html/settings_tare.htm create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tools/cdata.js diff --git a/.gitignore b/.gitignore index 4043c81..53e7516 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ .idea .venv* - +data/ui_out # Created by https://www.gitignore.io/api/c++,visualstudio,visualstudiocode # Edit at https://www.gitignore.io/?templates=c++,visualstudio,visualstudiocode diff --git a/data/html/404.htm b/data/html/404.htm new file mode 100644 index 0000000..6e5241d --- /dev/null +++ b/data/html/404.htm @@ -0,0 +1,46 @@ + + + + + + + Not found + + + + +

    404 Not Found

    + + + \ No newline at end of file diff --git a/data/html/index.css b/data/html/index.css new file mode 100644 index 0000000..b491f3f --- /dev/null +++ b/data/html/index.css @@ -0,0 +1,104 @@ +body { + font-family: Verdana, sans-serif; + text-align: center; + background: #222; + color: #fff; + line-height: 200%%; /* %% because of AsyncWebServer */ + margin: 0; + } + hr { + border-color: #666; + } + button, .btn { + background: #333; + color: #fff; + font-family: Verdana, sans-serif; + border: 0.3ch solid #333; + display: inline-block; + font-size: 20px; + margin: 12px 8px 8px; + padding: 1px 6px; + cursor: pointer; + text-decoration: none; + } + .lnk { + border: 0; + } + .helpB { + text-align: left; + position: absolute; + width: 60px; + } + input { + background: #333; + color: #fff; + font-family: Verdana, sans-serif; + border: 0.5ch solid #333; + } + input[type="number"] { + width: 4em; + margin: 2px; + } + input[type="number"].xxl { + width: 100px; + } + input[type="number"].xl { + width: 85px; + } + input[type="number"].l { + width: 63px; + } + input[type="number"].m { + width: 56px; + } + input[type="number"].s { + width: 49px; + } + input[type="number"].xs { + width: 42px; + } + input[type="checkbox"] { + transform: scale(1.5); + margin-right: 10px; + } + select { + background: #333; + color: #fff; + font-family: Verdana, sans-serif; + border: 0.5ch solid #333; + } + td { + padding: 2px; + } + .d5 { + width: 4.5em !important; + } + + #toast { + opacity: 0; + background-color: #444; + border-radius: 5px; + bottom: 64px; + color: #fff; + font-size: 17px; + padding: 16px; + pointer-events: none; + position: fixed; + text-align: center; + z-index: 5; + transform: translateX(-50%%); /* %% because of AsyncWebServer */ + max-width: 90%%; /* %% because of AsyncWebServer */ + left: 50%%; /* %% because of AsyncWebServer */ + } + + #toast.show { + opacity: 1; + background-color: #264; + animation: fadein 0.5s, fadein 0.5s 2.5s reverse; + } + + #toast.error { + opacity: 1; + background-color: #b21; + animation: fadein 0.5s; + } \ No newline at end of file diff --git a/data/html/index.htm b/data/html/index.htm new file mode 100644 index 0000000..50a1ef9 --- /dev/null +++ b/data/html/index.htm @@ -0,0 +1,35 @@ + + + + + + + + Hive-Monitor + + + + + + +
    Load Hive Monitor UI...
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/data/html/index.js b/data/html/index.js new file mode 100644 index 0000000..96190ed --- /dev/null +++ b/data/html/index.js @@ -0,0 +1,46 @@ +var ActualPage = "INDEX"; + +var cfg = { + theme: { base: "dark", bg: { url: "" }, alpha: { bg: 0.6, tab: 0.8 }, color: { bg: "" } }, + comp: { + colors: { picker: true, rgb: false, quick: true, hex: false }, + labels: true, pcmbot: false, pid: true, seglen: false, css: true, hdays: false + } +}; + + +var d = document; +function onLoad() { + document.getElementById("cv").hidden = true; +} + +function toogleAutoTare() { + ActualPage = "TARE"; + var ct = document.getElementById("ct"); + +} + +function sendData(data) { + var req = new XMLHttpRequest(); + req.addEventListener('load', function () { showToastMessage(this.responseText) }); + req.addEventListener('error', function (e) { showToastMessage(e.stack, true); }); + req.open("POST", "/upload"); + var formData = new FormData(); + formData.append("data", fO.files[0], name); + req.send(formData); + fO.value = ''; + return false; +} + + +var timeout; +function showToastMessage(text, error = false) { + if (error) d.getElementById('connind').style.backgroundColor = "#831"; + var x = d.getElementById("toast"); + x.innerHTML = text; + x.className = error ? "error" : "show"; + clearTimeout(timeout); + x.style.animation = 'none'; + x.style.animation = null; + timeout = setTimeout(function () { x.className = x.className.replace("show", ""); }, 2900); +} \ No newline at end of file diff --git a/data/html/settings_general.htm b/data/html/settings_general.htm new file mode 100644 index 0000000..e69de29 diff --git a/data/html/settings_tare.htm b/data/html/settings_tare.htm new file mode 100644 index 0000000..b1f880a --- /dev/null +++ b/data/html/settings_tare.htm @@ -0,0 +1,41 @@ + + + + + + + + Tare Weight + + + + + +
    +
    + +

    Auto Tare Information

    +

    This procedure will guide you throught a small setup with two steps.

    +
    +
    +
    +

    1. Remove all weights from the scale and click on Start, wait until the led is blinking.

    +

    2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait + until the led is blinking

    + + + +
    + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6e43092 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2284 @@ +{ + "name": "hivemonitor", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==" + }, + "cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "requires": { + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "requires": { + "chalk": "^1.1.3" + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "requires": { + "q": "^1.1.2" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", + "integrity": "sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=", + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.1", + "os-tmpdir": "^1.0.0", + "osenv": "^0.1.0", + "uuid": "^2.0.1", + "write-file-atomic": "^1.1.2", + "xdg-basedir": "^2.0.0" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" + } + }, + "css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" + }, + "csso": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", + "integrity": "sha1-F4tDpEYhIhwndWCG9THgL0KQDug=", + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "requires": { + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "es6-promise": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "requires": { + "ini": "1.3.7" + }, + "dependencies": { + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + } + } + }, + "got": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", + "integrity": "sha1-5dDtSvVfw+701WAHdp2YGSvLLso=", + "requires": { + "duplexify": "^3.2.0", + "infinity-agent": "^2.0.0", + "is-redirect": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "nested-error-stacks": "^1.0.0", + "object-assign": "^3.0.0", + "prepend-http": "^1.0.0", + "read-all-stream": "^3.0.0", + "timed-out": "^2.0.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "infinity-agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz", + "integrity": "sha1-ReDi/3qesDCyfWK3SzdEt6esQhY=" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inliner": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/inliner/-/inliner-1.13.1.tgz", + "integrity": "sha1-5QApgev1Dp2fMTcRSBz/Ei1PP8s=", + "requires": { + "ansi-escapes": "^1.4.0", + "ansi-styles": "^2.2.1", + "chalk": "^1.1.3", + "charset": "^1.0.0", + "cheerio": "^0.19.0", + "debug": "^2.2.0", + "es6-promise": "^2.3.0", + "iconv-lite": "^0.4.11", + "jschardet": "^1.3.0", + "lodash.assign": "^3.2.0", + "lodash.defaults": "^3.1.2", + "lodash.foreach": "^3.0.3", + "mime": "^1.3.4", + "minimist": "^1.1.3", + "request": "^2.74.0", + "svgo": "^0.6.6", + "then-fs": "^2.0.0", + "uglify-js": "^2.8.0", + "update-notifier": "^0.5.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jschardet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", + "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "latest-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", + "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", + "requires": { + "package-json": "^1.0.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "requires": { + "lodash.assign": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash.foreach": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.3.tgz", + "integrity": "sha1-b9fvt5aRrs1n/erCdhyY5wHWw5o=", + "requires": { + "lodash._arrayeach": "^3.0.0", + "lodash._baseeach": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nested-error-stacks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", + "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=", + "requires": { + "inherits": "~2.0.1" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "nodemon": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", + "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", + "integrity": "sha1-yOysCUInzfdqMWh07QXifMk5oOA=", + "requires": { + "got": "^3.2.0", + "registry-url": "^3.0.0" + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "requires": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "requires": { + "strip-ansi": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svgo": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", + "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=", + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.0.0", + "js-yaml": "~3.6.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "requires": { + "promise": ">=3.2 <8" + } + }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "requires": { + "debug": "^2.2.0" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "update-notifier": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", + "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=", + "requires": { + "chalk": "^1.0.0", + "configstore": "^1.0.0", + "is-npm": "^1.0.0", + "latest-version": "^1.0.0", + "repeating": "^1.1.2", + "semver-diff": "^2.0.0", + "string-length": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "zlib": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", + "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bdee556 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "hivemonitor", + "version": "0.0.1", + "description": "Tool to compile the Webfrontend", + "directories": { + "lib": "lib" + }, + "scripts": { + "build": "node tools/cdata.js", + "dev": "nodemon -e js,html,htm,css,png,jpg,gif,ico,js -w tools/ -w data/html -x node tools/cdata.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SBajonczak/hivemonitor.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/SBajonczak/hivemonitor/issues" + }, + "homepage": "https://github.com/SBajonczak/hivemonitor#readme", + "dependencies": { + "clean-css": "^4.2.3", + "html-minifier-terser": "^5.1.1", + "inliner": "^1.13.1", + "nodemon": "^2.0.4", + "zlib": "^1.0.5" + } +} diff --git a/tools/cdata.js b/tools/cdata.js new file mode 100644 index 0000000..cc07b75 --- /dev/null +++ b/tools/cdata.js @@ -0,0 +1,254 @@ +/** + * Writes compressed C arrays of data files (web interface) + * How to use it? + * + * 1) Install Node 11+ and npm + * 2) npm install + * 3) npm run build + * + * If you change data folder often, you can run it in monitoring mode (it will recompile and update *.h on every file change) + * + * > npm run dev + * + * How it works? + * + * It uses NodeJS packages to inline, minify and GZIP files. See writeHtmlGzipped and writeChunks invocations at the bottom of the page. + */ + + const fs = require("fs"); + const packageJson = require("../package.json"); + + /** + * + */ + function hexdump(buffer) { + let lines = []; + + for (let i = 0; i < buffer.length; i += 16) { + let block = buffer.slice(i, i + 16); // cut buffer into blocks of 16 + let hexArray = []; + + for (let value of block) { + hexArray.push("0x" + value.toString(16).padStart(2, "0")); + } + + let hexString = hexArray.join(", "); + let line = ` ${hexString}`; + lines.push(line); + } + + return lines.join(",\n"); + } + + const inliner = require("inliner"); + const zlib = require("zlib"); + + function strReplace(str, search, replacement) { + return str.split(search).join(replacement); + } + + function adoptVersionAndRepo(html) { + let repoUrl = packageJson.repository ? packageJson.repository.url : undefined; + if (repoUrl) { + repoUrl = repoUrl.replace(/^git\+/, ""); + repoUrl = repoUrl.replace(/\.git$/, ""); + } + + let version = packageJson.version; + if (version) { + html = strReplace(html, "##VERSION##", version); + } + + return html; + } + + function writeHtmlGzipped(sourceFile, resultFile) { + console.info("Reading " + sourceFile); + new inliner(sourceFile, function (error, html) { + console.info("Inlined " + html.length + " characters"); + html = filter(html, "html-minify-ui"); + console.info("Minified to " + html.length + " characters"); + + if (error) { + console.warn(error); + throw error; + } + + html = adoptVersionAndRepo(html); + zlib.gzip(html, { level: zlib.constants.Z_BEST_COMPRESSION }, function (error, result) { + if (error) { + console.warn(error); + throw error; + } + + console.info("Compressed " + result.length + " bytes"); + const array = hexdump(result); + const src = `/* + * Binary array for the Web UI. + * gzip is used for smaller size and improved speeds. + */ + + // Autogenerated from ${sourceFile}, do not edit!! + const uint16_t PAGE_index_L = ${result.length}; + const uint8_t PAGE_index[] PROGMEM = { + ${array} + }; + `; + console.info("Writing " + resultFile); + fs.writeFileSync(resultFile, src); + }); + }); + } + + const CleanCSS = require("clean-css"); + const MinifyHTML = require("html-minifier-terser").minify; + + function filter(str, type) { + str = adoptVersionAndRepo(str); + + if (type === undefined) { + return str; + } else if (type == "css-minify") { + return new CleanCSS({}).minify(str).styles; + } else if (type == "html-minify") { + return MinifyHTML(str, { + collapseWhitespace: true, + maxLineLength: 80, + minifyCSS: true, + minifyJS: true, + continueOnParseError: false, + removeComments: true, + }); + } else if (type == "html-minify-ui") { + return MinifyHTML(str, { + collapseWhitespace: true, + conservativeCollapse: true, + maxLineLength: 80, + minifyCSS: true, + minifyJS: true, + continueOnParseError: false, + removeComments: true, + }); + } else { + console.warn("Unknown filter: " + type); + return str; + } + } + + function specToChunk(srcDir, s) { + if (s.method == "plaintext") { + const buf = fs.readFileSync(srcDir + "/" + s.file); + const str = buf.toString("utf-8"); + const chunk = ` + // Autogenerated from ${srcDir}/${s.file}, do not edit!! + const char ${s.name}[] PROGMEM = R"${s.prepend || ""}${filter(str, s.filter)}${ + s.append || "" + }"; + + `; + return s.mangle ? s.mangle(chunk) : chunk; + } else if (s.method == "binary") { + const buf = fs.readFileSync(srcDir + "/" + s.file); + const result = hexdump(buf); + const chunk = ` + // Autogenerated from ${srcDir}/${s.file}, do not edit!! + const uint16_t ${s.name}_length = ${result.length}; + const uint8_t ${s.name}[] PROGMEM = { + ${result} + }; + + `; + return s.mangle ? s.mangle(chunk) : chunk; + } else { + console.warn("Unknown method: " + s.method); + return undefined; + } + } + + function writeChunks(srcDir, specs, resultFile) { + let src = `/* + * More web UI HTML source arrays. + * This file is auto generated, please don't make any changes manually. + */ + `; + specs.forEach((s) => { + try { + console.info("Reading " + srcDir + "/" + s.file + " as " + s.name); + src += specToChunk(srcDir, s); + } catch (e) { + console.warn( + "Failed " + s.name + " from " + srcDir + "/" + s.file, + e.message.length > 60 ? e.message.substring(0, 60) : e.message + ); + } + }); + console.info("Writing " + src.length + " characters into " + resultFile); + fs.writeFileSync(resultFile, src); + } + +writeHtmlGzipped("data/html/index.htm", "data/ui_out/html_ui.h"); + + writeChunks( + "data/html", + [ + { + file: "style.css", + name: "PAGE_settingsCss", + prepend: "=====()=====", + method: "plaintext", + filter: "css-minify", + }, + + { + file: "settings_tare.htm", + name: "PAGE_settings_tare", + prepend: "=====(", + append: ")=====", + method: "plaintext", + filter: "html-minify", + mangle: (str) => + str + .replace(/\/gms, "") + .replace(/\.*\<\/style\>/gms, "%CSS%%SCSS%") + .replace( + /function GetV().*\<\/script\>/gms, + "function GetV() {var d=document;\n" + ), + }, + { + file: "settings_general.htm", + name: "PAGE_settings_time", + prepend: "=====(", + append: ")=====", + method: "plaintext", + filter: "html-minify", + mangle: (str) => + str + .replace(/\/gms, "") + .replace(/\.*\<\/style\>/gms, "%CSS%%SCSS%") + .replace(/function GetV().*\<\/script\>/gms, "function GetV() {\n"), + } + ], + "data/ui_out/html_settings.h" + ); + +// writeChunks( +// "data/html", +// [ +// { +// file: "404.htm", +// name: "PAGE_404", +// prepend: "=====(", +// append: ")=====", +// method: "plaintext", +// filter: "html-minify", +// }, +// { +// file: "favicon.ico", +// name: "favicon", +// method: "binary", +// }, +// ], +// "html_other.h" +// ); \ No newline at end of file From 932f14314500d8158bbd00ed1cd12de1d18737c4 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:40:10 +0200 Subject: [PATCH 12/99] Added wizard style methods --- data/html/index.css | 77 ++++++++----------------------- data/html/index.htm | 101 +++++++++++++++++++++++++++++----------- data/html/index.js | 109 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 191 insertions(+), 96 deletions(-) diff --git a/data/html/index.css b/data/html/index.css index b491f3f..2bb41ad 100644 --- a/data/html/index.css +++ b/data/html/index.css @@ -1,17 +1,26 @@ body { font-family: Verdana, sans-serif; - text-align: center; - background: #222; - color: #fff; - line-height: 200%%; /* %% because of AsyncWebServer */ + background: rgb(212, 211, 124); + color: rgb(0, 0, 0); + line-height: 200%; /* %% because of AsyncWebServer */ margin: 0; } + hr { border-color: #666; } + + .container{ + padding: 5px; + margin: 5px; + border: black solid; + border-radius: 5px; + background: rgb(214, 158, 46); + color: rgb(0, 0, 0); + } button, .btn { - background: #333; - color: #fff; + background: rgb(214, 158, 46); + color: #000; font-family: Verdana, sans-serif; border: 0.3ch solid #333; display: inline-block; @@ -21,58 +30,10 @@ body { cursor: pointer; text-decoration: none; } - .lnk { - border: 0; - } - .helpB { - text-align: left; - position: absolute; - width: 60px; - } - input { - background: #333; - color: #fff; - font-family: Verdana, sans-serif; - border: 0.5ch solid #333; - } - input[type="number"] { - width: 4em; - margin: 2px; - } - input[type="number"].xxl { - width: 100px; - } - input[type="number"].xl { - width: 85px; - } - input[type="number"].l { - width: 63px; - } - input[type="number"].m { - width: 56px; - } - input[type="number"].s { - width: 49px; - } - input[type="number"].xs { - width: 42px; - } - input[type="checkbox"] { - transform: scale(1.5); - margin-right: 10px; - } - select { - background: #333; - color: #fff; - font-family: Verdana, sans-serif; - border: 0.5ch solid #333; - } - td { - padding: 2px; - } - .d5 { - width: 4.5em !important; - } + + + + #toast { opacity: 0; diff --git a/data/html/index.htm b/data/html/index.htm index 50a1ef9..0cebc9d 100644 --- a/data/html/index.htm +++ b/data/html/index.htm @@ -1,35 +1,82 @@ - - - - - - Hive-Monitor - - - + + + + + + + Hive-Monitor + + + - -
    Load Hive Monitor UI...
    - -
    + + +
    Load Hive Monitor UI...
    + +
    +
    +

    Thank you for installing the Hivemonitor Software. 👍

    +

    You have enabled the Settings Mode. In this Webinterface you will be able to set your configs.

    +
    + -
    +
    +

    You are here 👉

    +
    -
    -
    - +
    +
    +
    + +
    +
    -
    -
    - -
    -
    -
    -
    -
    + + + + + + + + +
    +
    + \ No newline at end of file diff --git a/data/html/index.js b/data/html/index.js index 96190ed..56ad459 100644 --- a/data/html/index.js +++ b/data/html/index.js @@ -11,25 +11,112 @@ var cfg = { var d = document; function onLoad() { + hideAllControls(); + parseQuery(); + setBreadCrumb(); document.getElementById("cv").hidden = true; + setInitialPage(); } + +function setInitialPage() { + switch (ActualPage) { + case "INDEX": + toggleIndex(); + break; + case "TARE": + toogleAutoTare(); + break; + case "TARE1": + setDisplay("cTareStep1", "block"); + break; + case "TARE2": + setDisplay("cTareStep2", "block"); + break; + } +} +function parseQuery() { + var param = new URLSearchParams(document.location.search); + ActualPage = param.get('page'); + if (ActualPage == null) { + ActualPage = "INDEX"; + } +} + +function toggleIndex() { + hideAllControls(); + setDisplay("welcome", "block"); + setDisplay("btnbar", "block"); + + +} + +function hideAllControls() { + setDisplay("cTareStep0", "none"); + setDisplay("cTareStep1", "none"); + setDisplay("cTareStep2", "none"); + setDisplay("welcome", "none"); + setDisplay("btnbar", "none"); + + + + +} +function setDisplay(control, state) { + var ct = document.getElementById(control); + ct.style.display = state; +} function toogleAutoTare() { ActualPage = "TARE"; - var ct = document.getElementById("ct"); + hideAllControls(); + setDisplay("cTareStep0", "block"); +} + +function setControls() { + hideAllControls(); + setBreadCrumb(); + setInitialPage(); + +} +function setBreadCrumb() { + var pl = document.getElementById("pl"); + switch (ActualPage) { + case "INDEX": + pl.innerText = "Start"; + break; + case "TARE": + case "TARE1": + case "TARE2": + pl.innerText = "Tare Scale"; + break; + } + + +} +function tareStep2() { + sendData({}, "tarestep1").then((data) => { + ActualPage = "TARE2"; + setControls(); + }).catch(()=>{}); +} +function startTare() { + sendData({}, "tarestep0").then((data) => { + ActualPage = "TARE1"; + setControls(); + }).catch(()=>{}); } -function sendData(data) { - var req = new XMLHttpRequest(); - req.addEventListener('load', function () { showToastMessage(this.responseText) }); - req.addEventListener('error', function (e) { showToastMessage(e.stack, true); }); - req.open("POST", "/upload"); - var formData = new FormData(); - formData.append("data", fO.files[0], name); - req.send(formData); - fO.value = ''; - return false; +function sendData(json, uri) { + var prom = new Promise((resolve, reject) => { + var req = new XMLHttpRequest(); + req.addEventListener('load', function () { showToastMessage("OK!"); resolve(this.responseText); }); + req.addEventListener('error', function (e) { showToastMessage(e.stack, true); reject(); }); + req.open("POST", uri); + req.setRequestHeader('Content-Type', 'application/json'); + req.send(JSON.stringify(json)); + }) + return prom; } From e4ea1cd3eb1b54e3a052195e9b1562254b5bca71 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:40:26 +0200 Subject: [PATCH 13/99] adjusting port description --- platformio.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index ad671cc..c8f330e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,4 +1,3 @@ - [platformio] default_envs = esp12e/complete @@ -32,7 +31,7 @@ build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -D GPIO_HX711_DT=13 ;D7 -D GPIO_HX711_SCK=12 ;D6 -D GPIO_ONEWIRE_BUS=14 ;D5 - -D GPIO_MAINTENANCE_PIN=5 ;D3 + -D GPIO_MAINTENANCE_PIN=5 ;D1 lib_deps = https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 ;ArduinoJson@^5.13.4 From eeff411c8b6af20cf9840a0c1456efe6879bec39 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:40:45 +0200 Subject: [PATCH 14/99] Added singleton and destructor --- src/WeightProcessor.cpp | 9 +++++++-- src/WeightProcessor.h | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index 8ac0e48..70505fc 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -5,6 +5,8 @@ #include "WeightProcessor.h" #include "HX711.h" #include +// Avoiding compile issues +WeightProcessor* WeightProcessor::instance = nullptr; int _dtPin; int _scPin; @@ -50,9 +52,13 @@ float WeightProcessor::getWeight() return weight; } +WeightProcessor::~WeightProcessor() +{ +} + bool WeightProcessor::DeviceReady() { - return scale.wait_ready_timeout(500); + return scale.wait_ready_timeout(200); } float WeightProcessor::getWeight(float temperatureForCompensation) @@ -75,4 +81,3 @@ float WeightProcessor::toKilogram(float getWeighMeasure) { return getWeighMeasure / 1000; } - diff --git a/src/WeightProcessor.h b/src/WeightProcessor.h index b611ac9..47a07db 100644 --- a/src/WeightProcessor.h +++ b/src/WeightProcessor.h @@ -8,16 +8,36 @@ class WeightProcessor { + public: WeightProcessor(int dtPin, int scPin); - void setup(float kilogramDivider, float weightOffset,float calibrationTemperature, float calibrationFactor); + ~WeightProcessor(); + void setup(float kilogramDivider, float weightOffset, float calibrationTemperature, float calibrationFactor); float getWeight(); float getWeight(float temperatureForCompensation); float toKilogram(float getWeighMeasure); bool DeviceReady(); // Performs an automatic tare for the first run void AutoTare(); + + // Get an Singelton instance + static WeightProcessor *getInstance(int dtPin, int scPin) + { + if (instance == nullptr) + { + Serial.println("Generate new instance"); + instance = new WeightProcessor(GPIO_HX711_DT, GPIO_HX711_SCK); + } + else + { + Serial.println("Reuse instance"); + } + return instance; + } + private: + static WeightProcessor *instance; + int _dtPin; int _scPin; float _kilogramDivider; From 6bceb1bbcb90d05eec7de6bb027deb75002e086e Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:40:56 +0200 Subject: [PATCH 15/99] modified bundler --- tools/cdata.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/cdata.js b/tools/cdata.js index cc07b75..c95f27c 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -186,7 +186,7 @@ fs.writeFileSync(resultFile, src); } -writeHtmlGzipped("data/html/index.htm", "data/ui_out/html_ui.h"); +writeHtmlGzipped("data/html/index.htm", "src/html/html_ui.h"); writeChunks( "data/html", @@ -230,7 +230,7 @@ writeHtmlGzipped("data/html/index.htm", "data/ui_out/html_ui.h"); .replace(/function GetV().*\<\/script\>/gms, "function GetV() {\n"), } ], - "data/ui_out/html_settings.h" + "src/html/html_settings.h" ); // writeChunks( From ae2b1e6cc369b6583c209c3eae7d9892fd896afe Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:41:32 +0200 Subject: [PATCH 16/99] ignoring generates html file --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 53e7516..90e8e46 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch - +src/html .idea .venv* From 1aac98481f92aa6587cdecd0d3702a9debc10c3e Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 2 Aug 2021 21:42:03 +0200 Subject: [PATCH 17/99] included html directory --- .gitignore | 1 - decoder.py | 307 ++++++++++++++++++++++++++++++++++++++ dump.txt | 312 +++++++++++++++++++++++++++++++++++++++ src/DeviceManager.cpp | 74 +++++++++- src/DeviceManager.h | 3 + src/MeasureHandler.cpp | 30 +++- src/MeasureHandler.h | 4 +- src/html/html_settings.h | 25 ++++ src/html/html_ui.h | 142 ++++++++++++++++++ src/main.cpp | 48 +++--- 10 files changed, 908 insertions(+), 38 deletions(-) create mode 100644 decoder.py create mode 100644 dump.txt create mode 100644 src/html/html_settings.h create mode 100644 src/html/html_ui.h diff --git a/.gitignore b/.gitignore index 90e8e46..7bd3458 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch -src/html .idea .venv* diff --git a/decoder.py b/decoder.py new file mode 100644 index 0000000..66f6e53 --- /dev/null +++ b/decoder.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 + +"""ESP Exception Decoder + +github: https://github.com/janLo/EspArduinoExceptionDecoder +license: GPL v3 +author: Jan Losinski +""" + +import argparse +import re +import subprocess +from collections import namedtuple + +import sys + +import os + +EXCEPTIONS = [ + "Illegal instruction", + "SYSCALL instruction", + "InstructionFetchError: Processor internal physical address or data error during instruction fetch", + "LoadStoreError: Processor internal physical address or data error during load or store", + "Level1Interrupt: Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT register", + "Alloca: MOVSP instruction, if caller's registers are not in the register file", + "IntegerDivideByZero: QUOS, QUOU, REMS, or REMU divisor operand is zero", + "reserved", + "Privileged: Attempt to execute a privileged operation when CRING ? 0", + "LoadStoreAlignmentCause: Load or store to an unaligned address", + "reserved", + "reserved", + "InstrPIFDataError: PIF data error during instruction fetch", + "LoadStorePIFDataError: Synchronous PIF data error during LoadStore access", + "InstrPIFAddrError: PIF address error during instruction fetch", + "LoadStorePIFAddrError: Synchronous PIF address error during LoadStore access", + "InstTLBMiss: Error during Instruction TLB refill", + "InstTLBMultiHit: Multiple instruction TLB entries matched", + "InstFetchPrivilege: An instruction fetch referenced a virtual address at a ring level less than CRING", + "reserved", + "InstFetchProhibited: An instruction fetch referenced a page mapped with an attribute that does not permit instruction fetch", + "reserved", + "reserved", + "reserved", + "LoadStoreTLBMiss: Error during TLB refill for a load or store", + "LoadStoreTLBMultiHit: Multiple TLB entries matched for a load or store", + "LoadStorePrivilege: A load or store referenced a virtual address at a ring level less than CRING", + "reserved", + "LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads", + "StoreProhibited: A store referenced a page mapped with an attribute that does not permit stores" +] + +PLATFORMS = { + "ESP8266": "lx106", + "ESP32": "esp32" +} + +EXCEPTION_REGEX = re.compile("^Exception \\((?P[0-9]*)\\):$") +COUNTER_REGEX = re.compile('^epc1=(?P0x[0-9a-f]+) epc2=(?P0x[0-9a-f]+) epc3=(?P0x[0-9a-f]+) ' + 'excvaddr=(?P0x[0-9a-f]+) depc=(?P0x[0-9a-f]+)$') +CTX_REGEX = re.compile("^ctx: (?P.+)$") +POINTER_REGEX = re.compile('^sp: (?P[0-9a-f]+) end: (?P[0-9a-f]+) offset: (?P[0-9a-f]+)$') +STACK_BEGIN = '>>>stack>>>' +STACK_END = '<<[0-9a-f]+):\W+(?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+)(\W.*)?$') + +StackLine = namedtuple("StackLine", ["offset", "content"]) + + +class ExceptionDataParser(object): + def __init__(self): + self.exception = None + + self.epc1 = None + self.epc2 = None + self.epc3 = None + self.excvaddr = None + self.depc = None + + self.ctx = None + + self.sp = None + self.end = None + self.offset = None + + self.stack = [] + + def _parse_exception(self, line): + match = EXCEPTION_REGEX.match(line) + if match is not None: + self.exception = int(match.group('exc')) + return self._parse_counters + return self._parse_exception + + def _parse_counters(self, line): + match = COUNTER_REGEX.match(line) + if match is not None: + self.epc1 = match.group("epc1") + self.epc2 = match.group("epc2") + self.epc3 = match.group("epc3") + self.excvaddr = match.group("excvaddr") + self.depc = match.group("depc") + return self._parse_ctx + return self._parse_counters + + def _parse_ctx(self, line): + match = CTX_REGEX.match(line) + if match is not None: + self.ctx = match.group("ctx") + return self._parse_pointers + return self._parse_ctx + + def _parse_pointers(self, line): + match = POINTER_REGEX.match(line) + if match is not None: + self.sp = match.group("sp") + self.end = match.group("end") + self.offset = match.group("offset") + return self._parse_stack_begin + return self._parse_pointers + + def _parse_stack_begin(self, line): + if line == STACK_BEGIN: + return self._parse_stack_line + return self._parse_stack_begin + + def _parse_stack_line(self, line): + if line != STACK_END: + match = STACK_REGEX.match(line) + if match is not None: + self.stack.append(StackLine(offset=match.group("off"), + content=(match.group("c1"), match.group("c2"), match.group("c3"), + match.group("c4")))) + return self._parse_stack_line + return None + + def parse_file(self, file, stack_only=False): + func = self._parse_exception + if stack_only: + func = self._parse_stack_begin + + for line in file: + func = func(line.strip()) + if func is None: + break + + if func is not None: + print("ERROR: Parser not complete!") + sys.exit(1) + + +class AddressResolver(object): + def __init__(self, tool_path, elf_path): + self._tool = tool_path + self._elf = elf_path + self._address_map = {} + + def _lookup(self, addresses): + cmd = [self._tool, "-aipfC", "-e", self._elf] + [addr for addr in addresses if addr is not None] + + if sys.version_info[0] < 3: + output = subprocess.check_output(cmd) + else: + output = subprocess.check_output(cmd, encoding="utf-8") + + line_regex = re.compile("^(?P[0-9a-fx]+): (?P.+)$") + + last = None + for line in output.splitlines(): + line = line.strip() + match = line_regex.match(line) + + if match is None: + if last is not None and line.startswith('(inlined by)'): + line = line [12:].strip() + self._address_map[last] += ("\n \-> inlined by: " + line) + continue + + if match.group("result") == '?? ??:0': + continue + + self._address_map[match.group("addr")] = match.group("result") + last = match.group("addr") + + def fill(self, parser): + addresses = [parser.epc1, parser.epc2, parser.epc3, parser.excvaddr, parser.sp, parser.end, parser.offset] + for line in parser.stack: + addresses.extend(line.content) + + self._lookup(addresses) + + def _sanitize_addr(self, addr): + if addr.startswith("0x"): + addr = addr[2:] + + fill = "0" * (8 - len(addr)) + return "0x" + fill + addr + + def resolve_addr(self, addr): + out = self._sanitize_addr(addr) + + if out in self._address_map: + out += ": " + self._address_map[out] + + return out + + def resolve_stack_addr(self, addr, full=True): + addr = self._sanitize_addr(addr) + if addr in self._address_map: + return addr + ": " + self._address_map[addr] + + if full: + return "[DATA (0x" + addr + ")]" + + return None + + +def print_addr(name, value, resolver): + print("{}:{} {}".format(name, " " * (8 - len(name)), resolver.resolve_addr(value))) + + +def print_stack_full(lines, resolver): + print("stack:") + for line in lines: + print(line.offset + ":") + for content in line.content: + print(" " + resolver.resolve_stack_addr(content)) + + +def print_stack(lines, resolver): + print("stack:") + for line in lines: + for content in line.content: + out = resolver.resolve_stack_addr(content, full=False) + if out is None: + continue + print(out) + + +def print_result(parser, resolver, full=True, stack_only=False): + if not stack_only: + print('Exception: {} ({})'.format(parser.exception, EXCEPTIONS[parser.exception])) + + print("") + print_addr("epc1", parser.epc1, resolver) + print_addr("epc2", parser.epc2, resolver) + print_addr("epc3", parser.epc3, resolver) + print_addr("excvaddr", parser.excvaddr, resolver) + print_addr("depc", parser.depc, resolver) + + print("") + print("ctx: " + parser.ctx) + + print("") + print_addr("sp", parser.sp, resolver) + print_addr("end", parser.end, resolver) + print_addr("offset", parser.offset, resolver) + + print("") + if full: + print_stack_full(parser.stack, resolver) + else: + print_stack(parser.stack, resolver) + + +def parse_args(): + parser = argparse.ArgumentParser(description="decode ESP Stacktraces.") + + parser.add_argument("-p", "--platform", help="The platform to decode from", choices=PLATFORMS.keys(), + default="ESP8266") + parser.add_argument("-t", "--tool", help="Path to the xtensa toolchain", + default="~/.platformio/packages/toolchain-xtensa/") + parser.add_argument("-e", "--elf", help="path to elf file", required=True) + parser.add_argument("-f", "--full", help="Print full stack dump", action="store_true") + parser.add_argument("-s", "--stack_only", help="Decode only a stractrace", action="store_true") + parser.add_argument("file", help="The file to read the exception data from ('-' for STDIN)", default="-") + + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + + if args.file == "-": + file = sys.stdin + else: + if not os.path.exists(args.file): + print("ERROR: file " + args.file + " not found") + sys.exit(1) + file = open(args.file, "r") + + addr2line = os.path.join(os.path.abspath(os.path.expanduser(args.tool)), + "bin/xtensa-" + PLATFORMS[args.platform] + "-elf-addr2line") + if not os.path.exists(addr2line): + print("ERROR: addr2line not found (" + addr2line + ")") + + elf_file = os.path.abspath(os.path.expanduser(args.elf)) + if not os.path.exists(elf_file): + print("ERROR: elf file not found (" + elf_file + ")") + + parser = ExceptionDataParser() + resolver = AddressResolver(addr2line, elf_file) + + parser.parse_file(file, args.stack_only) + resolver.fill(parser) + + print_result(parser, resolver, args.full, args.stack_only) \ No newline at end of file diff --git a/dump.txt b/dump.txt new file mode 100644 index 0000000..d0fdc7d --- /dev/null +++ b/dump.txt @@ -0,0 +1,312 @@ +User exception (panic/abort/assert) +Panic core_esp8266_main.cpp:121 __yield + +>>>stack>>> + +ctx: sys +sp: 3fffecb0 end: 3fffffb0 offset: 0000 +3fffecb0: 00000000 00000000 00000001 401002e0 +3fffecc0: 000000fe 00000000 00000000 00000000 +3fffecd0: 00000000 00000000 00000000 3fff0c60 +3fffece0: 3fff0c80 3fff0c80 3fff0c80 00000000 +3fffecf0: 00000000 00000002 3fff0070 4021a44e +3fffed00: 00000000 0080abbb 4021a52c 4021a4af +3fffed10: 4021a545 000001f4 00000000 40219d85 +3fffed20: 00000000 00000002 3fff0070 402029a8 +3fffed30: 01010300 3fff4bd4 3fff43ec 00000000 +3fffed40: 3fff0070 3fff44e4 3fff4254 40202a16 +3fffed50: 3fff0080 0000000e 3fff0af0 3fff4254 +3fffed60: 3fff0080 3fff44e4 3fff0af0 3fff4254 +3fffed70: 00000001 3fff44e4 3fff0af0 4020139d +3fffed80: 3fff4847 00000002 00000020 40100b9b +3fffed90: 00000021 00000001 3fff4518 00000002 +3fffeda0: 3fff4845 00000021 3fffedd0 00000001 +3fffedb0: 3fff4847 3fff44e4 4020124c 40209375 +3fffedc0: 3fff4847 00000002 3fff4540 402058fe +3fffedd0: 3fff4b00 0021002f 80000020 00000002 +3fffede0: 3fff4845 3fff351c 3fff44e4 40207674 +3fffedf0: 00000000 00000000 4bc6a7f0 00000000 +3fffee00: 35386534 2d373334 401003d8 000068ee +3fffee10: 3fff4540 00000000 3fff3b9c 4024da9d +3fffee20: 007953e0 0000042d 0000042d 00000000 +3fffee30: 3fff4404 3fff4644 00000000 40207721 +3fffee40: 3fff4404 3fff4644 3fff1dd9 40223e48 +3fffee50: 3fff42cc 00000001 3fff1dd9 4024f62b +3fffee60: 3ffeddd8 3ffefe94 00000000 3fff1df4 +3fffee70: 3fff42cc 3fff1dd8 3fff1dd9 40223e8c +3fffee80: 3fff42cc 3fff1dd8 3fff1dd9 40250b44 +3fffee90: 00002538 00000000 00000000 401004e4 +3fffeea0: 3fff2040 47b2a8c0 00000450 3fff2afc +3fffeeb0: 00000000 00000000 00000020 3fff20f0 +3fffeec0: 3fff2040 3fff4662 3fff4644 402566be +3fffeed0: 00000014 3fff1ff4 000001f5 3fff2afc +3fffeee0: 00000000 3fff2a74 00000020 40100b9b +3fffeef0: 402688e4 3fff3b9c 3fff2a74 3fff2afc +3fffef00: 00000008 3fff2040 3fff4644 4024d621 +3fffef10: 3fffdc90 3fff2a74 3fff3b9c 4024d444 +3fffef20: 40272dea 3fff2a74 3fff3b9c 40272dfb +3fffef30: 3fff4654 3fff4644 00000000 3fffdcc0 +3fffef40: 3ffea468 00000000 3fff3b9c 4026e62b +3fffef50: 40000f49 3fffdab0 3fffdab0 40000f49 +3fffef60: 40000e19 40001878 00000002 00000000 +3fffef70: 3fffff10 aa55aa55 000000c9 40104c31 +3fffef80: 40104c37 00000002 00000000 00540053 +3fffef90: 4010000d 00540053 004e0000 00540053 +3fffefa0: 00000000 3fffef3c 00000000 3ffffee8 +3fffefb0: 3fffffc0 00000000 00000000 feefeffe +3fffefc0: feefeffe feefeffe feefeffe feefeffe +3fffefd0: feefeffe feefeffe feefeffe feefeffe +3fffefe0: feefeffe feefeffe feefeffe feefeffe +3fffeff0: feefeffe feefeffe feefeffe feefeffe +3ffff000: feefeffe feefeffe feefeffe feefeffe +3ffff010: feefeffe feefeffe feefeffe feefeffe +3ffff020: feefeffe feefeffe feefeffe feefeffe +3ffff030: feefeffe feefeffe feefeffe feefeffe +3ffff040: feefeffe feefeffe feefeffe feefeffe +3ffff050: feefeffe feefeffe feefeffe feefeffe +3ffff060: feefeffe feefeffe feefeffe feefeffe +3ffff070: feefeffe feefeffe feefeffe feefeffe +3ffff080: feefeffe feefeffe feefeffe feefeffe +3ffff090: feefeffe feefeffe feefeffe feefeffe +3ffff0a0: feefeffe feefeffe feefeffe feefeffe +3ffff0b0: feefeffe feefeffe feefeffe feefeffe +3ffff0c0: feefeffe feefeffe feefeffe feefeffe +3ffff0d0: feefeffe feefeffe feefeffe feefeffe +3ffff0e0: feefeffe feefeffe feefeffe feefeffe +3ffff0f0: feefeffe feefeffe feefeffe feefeffe +3ffff100: feefeffe feefeffe feefeffe feefeffe +3ffff110: feefeffe feefeffe feefeffe feefeffe +3ffff120: feefeffe feefeffe feefeffe feefeffe +3ffff130: feefeffe feefeffe feefeffe feefeffe +3ffff140: feefeffe feefeffe feefeffe feefeffe +3ffff150: feefeffe feefeffe feefeffe feefeffe +3ffff160: feefeffe feefeffe feefeffe feefeffe +3ffff170: feefeffe feefeffe feefeffe feefeffe +3ffff180: feefeffe feefeffe feefeffe feefeffe +3ffff190: feefeffe feefeffe feefeffe feefeffe +3ffff1a0: feefeffe feefeffe feefeffe feefeffe +3ffff1b0: feefeffe feefeffe feefeffe feefeffe +3ffff1c0: feefeffe feefeffe feefeffe feefeffe +3ffff1d0: feefeffe feefeffe feefeffe feefeffe +3ffff1e0: feefeffe feefeffe feefeffe feefeffe +3ffff1f0: feefeffe feefeffe feefeffe feefeffe +3ffff200: feefeffe feefeffe feefeffe feefeffe +3ffff210: feefeffe feefeffe feefeffe feefeffe +3ffff220: feefeffe feefeffe feefeffe feefeffe +3ffff230: feefeffe feefeffe feefeffe feefeffe +3ffff240: feefeffe feefeffe feefeffe feefeffe +3ffff250: feefeffe feefeffe feefeffe feefeffe +3ffff260: feefeffe feefeffe feefeffe feefeffe +3ffff270: feefeffe feefeffe feefeffe feefeffe +3ffff280: feefeffe feefeffe feefeffe feefeffe +3ffff290: feefeffe feefeffe feefeffe feefeffe +3ffff2a0: feefeffe feefeffe feefeffe feefeffe +3ffff2b0: feefeffe feefeffe feefeffe feefeffe +3ffff2c0: feefeffe feefeffe feefeffe feefeffe +3ffff2d0: feefeffe feefeffe feefeffe feefeffe +3ffff2e0: feefeffe feefeffe feefeffe feefeffe +3ffff2f0: feefeffe feefeffe feefeffe feefeffe +3ffff300: feefeffe feefeffe feefeffe feefeffe +3ffff310: feefeffe feefeffe feefeffe feefeffe +3ffff320: feefeffe feefeffe feefeffe feefeffe +3ffff330: feefeffe feefeffe feefeffe feefeffe +3ffff340: feefeffe feefeffe feefeffe feefeffe +3ffff350: feefeffe feefeffe feefeffe feefeffe +3ffff360: feefeffe feefeffe feefeffe feefeffe +3ffff370: feefeffe feefeffe feefeffe feefeffe +3ffff380: feefeffe feefeffe feefeffe feefeffe +3ffff390: feefeffe feefeffe feefeffe feefeffe +3ffff3a0: feefeffe feefeffe feefeffe feefeffe +3ffff3b0: feefeffe feefeffe feefeffe feefeffe +3ffff3c0: feefeffe feefeffe feefeffe feefeffe +3ffff3d0: feefeffe feefeffe feefeffe feefeffe +3ffff3e0: feefeffe feefeffe feefeffe feefeffe +3ffff3f0: feefeffe feefeffe feefeffe feefeffe +3ffff400: feefeffe feefeffe feefeffe feefeffe +3ffff410: feefeffe feefeffe feefeffe feefeffe +3ffff420: feefeffe feefeffe feefeffe feefeffe +3ffff430: feefeffe feefeffe feefeffe feefeffe +3ffff440: feefeffe feefeffe feefeffe feefeffe +3ffff450: feefeffe feefeffe feefeffe feefeffe +3ffff460: feefeffe feefeffe feefeffe feefeffe +3ffff470: feefeffe feefeffe feefeffe feefeffe +3ffff480: feefeffe feefeffe feefeffe feefeffe +3ffff490: feefeffe feefeffe feefeffe feefeffe +3ffff4a0: feefeffe feefeffe feefeffe feefeffe +3ffff4b0: feefeffe feefeffe feefeffe feefeffe +3ffff4c0: feefeffe feefeffe feefeffe feefeffe +3ffff4d0: feefeffe feefeffe feefeffe feefeffe +3ffff4e0: feefeffe feefeffe feefeffe feefeffe +3ffff4f0: feefeffe feefeffe feefeffe feefeffe +3ffff500: feefeffe feefeffe feefeffe feefeffe +3ffff510: feefeffe feefeffe feefeffe feefeffe +3ffff520: feefeffe feefeffe feefeffe feefeffe +3ffff530: feefeffe feefeffe feefeffe feefeffe +3ffff540: feefeffe feefeffe feefeffe feefeffe +3ffff550: feefeffe feefeffe feefeffe feefeffe +3ffff560: feefeffe feefeffe feefeffe feefeffe +3ffff570: feefeffe feefeffe feefeffe feefeffe +3ffff580: feefeffe feefeffe feefeffe feefeffe +3ffff590: feefeffe feefeffe feefeffe feefeffe +3ffff5a0: feefeffe feefeffe feefeffe feefeffe +3ffff5b0: feefeffe feefeffe feefeffe feefeffe +3ffff5c0: feefeffe feefeffe feefeffe feefeffe +3ffff5d0: feefeffe feefeffe feefeffe feefeffe +3ffff5e0: feefeffe feefeffe feefeffe feefeffe +3ffff5f0: feefeffe feefeffe feefeffe feefeffe +3ffff600: feefeffe feefeffe feefeffe feefeffe +3ffff610: feefeffe feefeffe feefeffe feefeffe +3ffff620: feefeffe feefeffe feefeffe feefeffe +3ffff630: feefeffe feefeffe feefeffe feefeffe +3ffff640: feefeffe feefeffe feefeffe feefeffe +3ffff650: feefeffe feefeffe feefeffe feefeffe +3ffff660: feefeffe feefeffe feefeffe feefeffe +3ffff670: feefeffe feefeffe feefeffe feefeffe +3ffff680: feefeffe feefeffe feefeffe feefeffe +3ffff690: feefeffe feefeffe feefeffe feefeffe +3ffff6a0: feefeffe feefeffe feefeffe feefeffe +3ffff6b0: feefeffe feefeffe feefeffe feefeffe +3ffff6c0: feefeffe feefeffe feefeffe feefeffe +3ffff6d0: feefeffe feefeffe feefeffe feefeffe +3ffff6e0: feefeffe feefeffe feefeffe feefeffe +3ffff6f0: feefeffe feefeffe feefeffe feefeffe +3ffff700: feefeffe feefeffe feefeffe feefeffe +3ffff710: feefeffe feefeffe feefeffe feefeffe +3ffff720: feefeffe feefeffe feefeffe feefeffe +3ffff730: feefeffe feefeffe feefeffe feefeffe +3ffff740: feefeffe feefeffe feefeffe feefeffe +3ffff750: feefeffe feefeffe feefeffe feefeffe +3ffff760: feefeffe feefeffe feefeffe feefeffe +3ffff770: feefeffe feefeffe feefeffe feefeffe +3ffff780: feefeffe feefeffe feefeffe feefeffe +3ffff790: feefeffe feefeffe feefeffe feefeffe +3ffff7a0: feefeffe feefeffe feefeffe feefeffe +3ffff7b0: feefeffe feefeffe feefeffe feefeffe +3ffff7c0: feefeffe feefeffe feefeffe feefeffe +3ffff7d0: feefeffe feefeffe feefeffe feefeffe +3ffff7e0: feefeffe feefeffe feefeffe feefeffe +3ffff7f0: feefeffe feefeffe feefeffe feefeffe +3ffff800: feefeffe feefeffe feefeffe feefeffe +3ffff810: feefeffe feefeffe feefeffe feefeffe +3ffff820: feefeffe feefeffe feefeffe feefeffe +3ffff830: feefeffe feefeffe feefeffe feefeffe +3ffff840: feefeffe feefeffe feefeffe feefeffe +3ffff850: feefeffe feefeffe feefeffe feefeffe +3ffff860: feefeffe feefeffe feefeffe feefeffe +3ffff870: feefeffe feefeffe feefeffe feefeffe +3ffff880: feefeffe feefeffe feefeffe feefeffe +3ffff890: feefeffe feefeffe feefeffe feefeffe +3ffff8a0: feefeffe feefeffe feefeffe feefeffe +3ffff8b0: feefeffe feefeffe feefeffe feefeffe +3ffff8c0: feefeffe feefeffe feefeffe feefeffe +3ffff8d0: feefeffe feefeffe feefeffe feefeffe +3ffff8e0: feefeffe feefeffe feefeffe feefeffe +3ffff8f0: feefeffe feefeffe feefeffe feefeffe +3ffff900: feefeffe feefeffe feefeffe feefeffe +3ffff910: feefeffe feefeffe feefeffe feefeffe +3ffff920: feefeffe feefeffe feefeffe feefeffe +3ffff930: feefeffe feefeffe feefeffe feefeffe +3ffff940: feefeffe feefeffe feefeffe feefeffe +3ffff950: feefeffe feefeffe feefeffe feefeffe +3ffff960: feefeffe feefeffe feefeffe feefeffe +3ffff970: feefeffe feefeffe feefeffe feefeffe +3ffff980: feefeffe feefeffe feefeffe feefeffe +3ffff990: feefeffe feefeffe feefeffe feefeffe +3ffff9a0: feefeffe feefeffe feefeffe feefeffe +3ffff9b0: feefeffe feefeffe feefeffe feefeffe +3ffff9c0: feefeffe feefeffe feefeffe feefeffe +3ffff9d0: feefeffe feefeffe feefeffe feefeffe +3ffff9e0: feefeffe feefeffe feefeffe feefeffe +3ffff9f0: feefeffe feefeffe feefeffe feefeffe +3ffffa00: feefeffe feefeffe feefeffe feefeffe +3ffffa10: feefeffe feefeffe feefeffe feefeffe +3ffffa20: feefeffe feefeffe feefeffe feefeffe +3ffffa30: feefeffe feefeffe feefeffe feefeffe +3ffffa40: feefeffe feefeffe feefeffe feefeffe +3ffffa50: feefeffe feefeffe feefeffe feefeffe +3ffffa60: feefeffe feefeffe feefeffe feefeffe +3ffffa70: feefeffe feefeffe feefeffe feefeffe +3ffffa80: feefeffe feefeffe feefeffe feefeffe +3ffffa90: feefeffe feefeffe feefeffe feefeffe +3ffffaa0: feefeffe feefeffe feefeffe feefeffe +3ffffab0: feefeffe feefeffe feefeffe feefeffe +3ffffac0: feefeffe feefeffe feefeffe feefeffe +3ffffad0: feefeffe feefeffe feefeffe feefeffe +3ffffae0: feefeffe feefeffe feefeffe feefeffe +3ffffaf0: feefeffe feefeffe feefeffe feefeffe +3ffffb00: feefeffe feefeffe feefeffe feefeffe +3ffffb10: feefeffe feefeffe feefeffe feefeffe +3ffffb20: feefeffe feefeffe feefeffe feefeffe +3ffffb30: feefeffe feefeffe feefeffe feefeffe +3ffffb40: feefeffe feefeffe feefeffe feefeffe +3ffffb50: feefeffe feefeffe feefeffe feefeffe +3ffffb60: feefeffe feefeffe feefeffe feefeffe +3ffffb70: feefeffe feefeffe feefeffe feefeffe +3ffffb80: feefeffe feefeffe feefeffe feefeffe +3ffffb90: feefeffe feefeffe feefeffe feefeffe +3ffffba0: feefeffe feefeffe feefeffe feefeffe +3ffffbb0: feefeffe feefeffe feefeffe feefeffe +3ffffbc0: feefeffe feefeffe feefeffe feefeffe +3ffffbd0: feefeffe feefeffe feefeffe feefeffe +3ffffbe0: feefeffe feefeffe feefeffe feefeffe +3ffffbf0: feefeffe feefeffe feefeffe feefeffe +3ffffc00: feefeffe feefeffe feefeffe feefeffe +3ffffc10: feefeffe feefeffe feefeffe feefeffe +3ffffc20: feefeffe feefeffe feefeffe feefeffe +3ffffc30: feefeffe feefeffe feefeffe feefeffe +3ffffc40: feefeffe feefeffe feefeffe feefeffe +3ffffc50: feefeffe feefeffe feefeffe feefeffe +3ffffc60: feefeffe feefeffe feefeffe feefeffe +3ffffc70: feefeffe feefeffe feefeffe feefeffe +3ffffc80: feefeffe feefeffe feefeffe feefeffe +3ffffc90: feefeffe feefeffe feefeffe feefeffe +3ffffca0: feefeffe feefeffe feefeffe feefeffe +3ffffcb0: feefeffe feefeffe feefeffe feefeffe +3ffffcc0: feefeffe feefeffe feefeffe feefeffe +3ffffcd0: 00000000 00000000 00000020 401002e0 +3ffffce0: feefeffe feefeffe 00000000 40101878 +3ffffcf0: 000005e0 00000000 40103931 3ffee4f0 +3ffffd00: 00000002 00000000 00000020 401002e0 +3ffffd10: 40101ca9 00000000 00000002 40101878 +3ffffd20: 00000005 00000000 00000020 401002e0 +3ffffd30: 00000002 00000000 00000020 401002e0 +3ffffd40: 40101ca9 40104b2b 00000002 40101878 +3ffffd50: 3ffea372 40104b13 3ffedae0 40101878 +3ffffd60: 00000001 40103cee 3ffee538 401025f0 +3ffffd70: 000005e0 00000000 40103931 3ffee4f0 +3ffffd80: 0000003c 00000000 40102ab2 000000fd +3ffffd90: 0000001c 00000001 40104a79 3ffee4f0 +3ffffda0: 00000005 00000000 00000020 401002e0 +3ffffdb0: 40101ca9 00000001 00000005 40101878 +3ffffdc0: 3ffea375 40104b2b 3ffedd88 401002e0 +3ffffdd0: 00000005 00000000 00000020 401002e0 +3ffffde0: 00000005 00000000 00000005 00000100 +3ffffdf0: 00000054 00000001 40104a79 3ffee538 +3ffffe00: 00000005 00000000 00000020 401002e0 +3ffffe10: 00007fff 0199d6bd 00000005 40101878 +3ffffe20: 3ffea375 40104b2b 3ffedd88 401025f0 +3ffffe30: 4010240f 3ffedd88 3ffee538 00000100 +3ffffe40: 00007fff 0199df09 3ffee7d0 401025f0 +3ffffe50: 3ffeac08 00000000 00000000 00040000 +3ffffe60: 00007fff 0199df09 40102ab2 00000100 +3ffffe70: 3ffeac08 7fffffff 50512200 00000001 +3ffffe80: 00000001 00000108 00000022 01997d55 +3ffffe90: 3ffeac08 00000000 4000050c 0199df09 +3ffffea0: 3ffeac20 2c9f0300 4000050c 3fffc278 +3ffffeb0: 401027d4 3fffc200 00000022 ffffffff +3ffffec0: 40100f85 00000030 0000001b ffffffff +3ffffed0: 40100f85 00000000 00000001 00000001 +3ffffee0: 3fffdab0 00000000 3fffd9d0 3fff0c20 +3ffffef0: 00000000 00000000 00000001 3ffe8654 +3fffff00: 00000000 3fffdad0 3fff0c20 00000030 +3fffff10: 3fffdad0 3ffefe94 00000000 40201950 +3fffff20: 3fff2d44 47b2a8c0 402012f4 402014a8 +3fffff30: 3fff3400 001c001f 00000000 feefeffe +3fffff40: 3fff2d44 0000001c 40201284 4022ccd0 +3fffff50: 3fffdad0 3fff0084 3fff0084 40202d85 +3fffff60: 007a1200 8015bb95 feefef00 feefeffe +3fffff70: 00000000 feefeffe feefeffe feefeffe +3fffff80: 00000000 00000000 00000001 401002e0 +3fffff90: 3fffdad0 00000000 3fff0be0 40100301 +3fffffa0: 3fffdad0 00000000 3fff0be0 40219e65 +<< +#include + +#include +#include + +#include "html\html_ui.h" +#include "TareUtility.h" + +AsyncWebServer server(80); void DeviceManager::setup() {} + DeviceManager::DeviceManager() { } @@ -90,4 +99,67 @@ OperatingStates DeviceManager::GetOperatingState() return OperatingStates::Maintenance; } return OperatingStates::Operating; +} + +void DeviceManager::ServeWebui() +{ + WiFi.softAP("HiveMonitor", "123"); + if (WiFi.waitForConnectResult() != WL_CONNECTED) + { + Serial.printf("WiFi Failed!\n"); + return; + } + Serial.print("IP Address: "); + Serial.println(WiFi.localIP()); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Origin"), "*"); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Methods"), "*"); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); + + server.on("/tarestep0", HTTP_POST, [](AsyncWebServerRequest *request) + { + WeightProcessor *scaledevice = WeightProcessor::getInstance(GPIO_HX711_DT, GPIO_HX711_SCK); + if (scaledevice->DeviceReady()) + { + float offset = scaledevice->getWeight(0); + Serial.println("Offset"); + Serial.println(offset); + request->send(200); + } + else + { + Serial.println("Not available"); + request->send(500, "text" + "Scale not ready or connected!"); + } + + }); + + server.on( + "/tarestep1", HTTP_POST, [](AsyncWebServerRequest *request) {}, NULL, + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) + { + + // WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); + // if (scaledevice.DeviceReady()) + // { + + // float offset = scaledevice.getWeight(0); + // request->send(200); + // } + // else + // { + // request->send(500, "text" + // "Scale not ready or connected!"); + // } + }); + + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) + { + AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); + response->addHeader(F("Cache-Control"), "no-store,max-age=0"); + // Gzip content + response->addHeader(F("Content-Encoding"), "gzip"); + request->send(response); + }); + server.begin(); } \ No newline at end of file diff --git a/src/DeviceManager.h b/src/DeviceManager.h index ef7db8e..ca7a8e3 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -5,6 +5,7 @@ #define DeviceManager_h #include +#include "WeightProcessor.h" // The Memmory Adress for the state #define RTC_STATE 66 @@ -48,6 +49,8 @@ class DeviceManager byte GetCurrentState(); // Get the actual Operating State OperatingStates GetOperatingState(); + // Serves the Webui for configuration purpose + void ServeWebui(); private: OperatingStates operatingState; diff --git a/src/MeasureHandler.cpp b/src/MeasureHandler.cpp index f0e4625..d4af2b1 100644 --- a/src/MeasureHandler.cpp +++ b/src/MeasureHandler.cpp @@ -1,5 +1,6 @@ #include #include +#include "WeightProcessor.h" /* * Scale should be calibrated with a regulated input of 3.3V! @@ -14,10 +15,10 @@ HomieNode Nodebattery("battery", "volt", "switch"); HomieNode NodebatAlarm("battery", "alarm", "switch"); HomieNode Nodejson("data", "__json__", "switch"); //Hiveeyes.org compatibility format - - -MeasureHandler::MeasureHandler() +MeasureHandler::MeasureHandler(ConfigurationManager *configurationManager) { + this->configurationManager = configurationManager; + this->configurationManager->setup(); } void MeasureHandler::setupHandler() @@ -26,7 +27,26 @@ void MeasureHandler::setupHandler() void MeasureHandler::SetWeightValue(float weightValue) { - this->weight = weightValue; + Serial.println("DEBUG: Scale class initalized!"); + + WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); + Serial.println("DEBUG: Scale class initalized!"); + scaledevice.setup( + this->configurationManager->GetKilogramDivider(), + this->configurationManager->GetWeightOffset(), + this->configurationManager->GetCalibrationTemperatureSetting(), + this->configurationManager->GetCalibrationFactorSetting()); + if (scaledevice.DeviceReady()) + { + Serial.println("DEBUG: Try to get scale value!"); + this->weight = scaledevice.getWeight(0); + Serial.println("Got Weight value!"); + } + else + { + this->weight = -127; + Serial.println("Scale not ready!"); + } } void MeasureHandler::SetLowBattery(bool isLow) @@ -114,7 +134,7 @@ void MeasureHandler::SubmitData() Nodebattery.setProperty("volt").setRetained(true).send(String(voltage)); DynamicJsonDocument doc(200); -// JsonObject &root = jsonBuffer.createObject(); + // JsonObject &root = jsonBuffer.createObject(); doc["Weight"] = round2two(this->weight); doc["Temp1"] = round2two(temperature0); doc["Temp2"] = round2two(temperature1); diff --git a/src/MeasureHandler.h b/src/MeasureHandler.h index 784dd52..5c18437 100644 --- a/src/MeasureHandler.h +++ b/src/MeasureHandler.h @@ -5,6 +5,7 @@ #define MeasureHandler_h #include +#include "ConfigurationManager.h" //Workaround for https://github.com/bblanchon/ArduinoJson/issues/566 #define ARDUINOJSON_USE_DOUBLE 0 @@ -17,7 +18,7 @@ class MeasureHandler void setupHandler(); void AdvertiseNodes(); - MeasureHandler(); + MeasureHandler(ConfigurationManager *configurationManager); void SetWeightValue(float weightValue); void SetTemperatureValue(int index, float temperature); @@ -30,6 +31,7 @@ class MeasureHandler bool GetLowBattery(); private: + ConfigurationManager *configurationManager; int id; float weight; float voltage; diff --git a/src/html/html_settings.h b/src/html/html_settings.h new file mode 100644 index 0000000..95bd03f --- /dev/null +++ b/src/html/html_settings.h @@ -0,0 +1,25 @@ +/* + * More web UI HTML source arrays. + * This file is auto generated, please don't make any changes manually. + */ + + // Autogenerated from data/html/settings_tare.htm, do not edit!! + const char PAGE_settings_tare[] PROGMEM = R"=====(Tare Weight%CSS%%SCSS%

    Auto Tare Information

    +This procedure will guide you throught a small setup with two steps.



    +

    +1. Remove all weights from the scale and click on Start, wait until the led is blinking. +

    +2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait until the led is blinking +

    )====="; + + + // Autogenerated from data/html/settings_general.htm, do not edit!! + const char PAGE_settings_time[] PROGMEM = R"=====()====="; + + \ No newline at end of file diff --git a/src/html/html_ui.h b/src/html/html_ui.h new file mode 100644 index 0000000..5f0fbe0 --- /dev/null +++ b/src/html/html_ui.h @@ -0,0 +1,142 @@ +/* + * Binary array for the Web UI. + * gzip is used for smaller size and improved speeds. + */ + + // Autogenerated from data/html/index.htm, do not edit!! + const uint16_t PAGE_index_L = 2107; + const uint8_t PAGE_index[] PROGMEM = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x58, 0xef, 0x72, 0xdb, 0xb8, + 0x11, 0xff, 0xae, 0xa7, 0x80, 0x91, 0xc9, 0x95, 0x9c, 0xa1, 0x68, 0x49, 0x76, 0x9c, 0x84, 0xb2, + 0xd4, 0x49, 0x1c, 0x4f, 0xe3, 0x3b, 0x27, 0x71, 0x23, 0x5d, 0x9b, 0xfb, 0x08, 0x92, 0xa0, 0x88, + 0x33, 0x04, 0xf0, 0x00, 0xd0, 0xb2, 0x4e, 0xa3, 0x07, 0xe8, 0x87, 0x7e, 0xe8, 0x13, 0xf4, 0x15, + 0xfb, 0x08, 0x5d, 0x80, 0xa4, 0x44, 0x59, 0x92, 0x2f, 0x9d, 0x69, 0x66, 0x22, 0x09, 0x7f, 0x76, + 0xb1, 0xfb, 0xdb, 0xdf, 0x2e, 0x16, 0xbe, 0x3c, 0xf9, 0xf0, 0xe5, 0x6a, 0xfa, 0xcb, 0xdd, 0x35, + 0xca, 0xcd, 0x9c, 0x8f, 0xd1, 0xa5, 0xfd, 0x42, 0x9c, 0x88, 0xd9, 0x08, 0x53, 0x81, 0xed, 0x04, + 0x25, 0x29, 0x7c, 0xcd, 0xa9, 0x21, 0x48, 0x90, 0x39, 0x1d, 0xe1, 0x07, 0x46, 0x17, 0x85, 0x54, + 0x06, 0xa3, 0x4e, 0x22, 0x85, 0xa1, 0xc2, 0x8c, 0xf0, 0x82, 0xa5, 0x26, 0x1f, 0xa5, 0xf4, 0x81, + 0x25, 0xb4, 0xeb, 0x06, 0x01, 0x13, 0xcc, 0x30, 0xc2, 0xbb, 0x3a, 0x21, 0x9c, 0x8e, 0xfa, 0xc1, + 0x1c, 0x26, 0xe6, 0xe5, 0xbc, 0x19, 0xe3, 0x46, 0x69, 0x27, 0xc9, 0x89, 0xd2, 0x14, 0x94, 0x94, + 0x26, 0xeb, 0xbe, 0xc1, 0xbb, 0x87, 0x99, 0x9c, 0xce, 0x69, 0x37, 0x91, 0x5c, 0x2a, 0x8c, 0x36, + 0xc7, 0xbd, 0x18, 0xb8, 0x7f, 0x2d, 0x1d, 0xcd, 0xca, 0x92, 0x6a, 0x5c, 0x8b, 0x92, 0xa2, 0xe0, + 0xb4, 0x3b, 0x97, 0x31, 0x83, 0xaf, 0x05, 0x8d, 0xbb, 0x30, 0xd1, 0x4d, 0x48, 0x41, 0x62, 0x4e, + 0xad, 0xa4, 0x61, 0x86, 0xd3, 0xf1, 0x47, 0xf6, 0x40, 0xbb, 0x9f, 0x24, 0x18, 0x2b, 0xd5, 0xe5, + 0x69, 0x35, 0x87, 0x3a, 0x97, 0x3a, 0x51, 0xac, 0x30, 0xe3, 0xce, 0x03, 0x51, 0xc8, 0xb0, 0x39, + 0x95, 0xa5, 0x09, 0xde, 0x25, 0xa6, 0x24, 0xfc, 0x8e, 0xcc, 0x40, 0xf9, 0xcd, 0xe7, 0x0f, 0xd7, + 0xdf, 0x70, 0x90, 0x64, 0xb3, 0xd1, 0xca, 0xd9, 0x18, 0xad, 0x62, 0xa2, 0x69, 0x84, 0x53, 0xa2, + 0xee, 0x71, 0x10, 0xcf, 0xa2, 0x55, 0xa9, 0x78, 0x84, 0xf1, 0x3a, 0x20, 0xbc, 0xc8, 0x09, 0x2c, + 0xcf, 0xa2, 0xf0, 0x22, 0x30, 0x24, 0x8e, 0xc2, 0x37, 0xeb, 0xc0, 0x79, 0xe4, 0x26, 0x61, 0x8b, + 0x1d, 0xce, 0x8b, 0x68, 0xe5, 0x26, 0x75, 0xb4, 0x2a, 0x58, 0x72, 0x4f, 0x55, 0x74, 0xd2, 0x0b, + 0xd4, 0x2c, 0x8e, 0x4e, 0xfa, 0xc1, 0x6f, 0x25, 0xcc, 0xd8, 0x71, 0x4e, 0x1f, 0x61, 0xbc, 0x0e, + 0x38, 0x89, 0x29, 0xd7, 0x76, 0xa6, 0x48, 0xe6, 0xb1, 0x34, 0x76, 0x53, 0xc1, 0x52, 0x3b, 0xa1, + 0xe9, 0x8c, 0x53, 0x61, 0x27, 0x12, 0xed, 0x76, 0xe4, 0x29, 0x59, 0x6a, 0x2b, 0xb5, 0x0e, 0xd2, + 0x51, 0x2a, 0x93, 0x72, 0x0e, 0x48, 0x0d, 0xb3, 0x52, 0x24, 0x86, 0x49, 0x81, 0xa4, 0xb8, 0x95, + 0x24, 0xf5, 0xfc, 0x55, 0xce, 0x52, 0xfa, 0x8e, 0xf3, 0x2b, 0x80, 0x52, 0x49, 0xae, 0x3d, 0x3f, + 0x28, 0x6c, 0x60, 0xfe, 0x5a, 0x52, 0xb5, 0x84, 0x01, 0x84, 0xe8, 0xbd, 0x02, 0x32, 0x5c, 0xa9, + 0x72, 0x1e, 0xc3, 0xb8, 0xd1, 0x14, 0xce, 0xa8, 0xb9, 0xe6, 0xd4, 0xfe, 0x7c, 0xbf, 0xbc, 0x49, + 0x3d, 0x9c, 0x3c, 0x60, 0x3f, 0x04, 0x65, 0x29, 0x15, 0x23, 0x67, 0x8f, 0xb9, 0xa9, 0xa8, 0x60, + 0x91, 0xf3, 0xfc, 0xf5, 0xe6, 0xe4, 0xa7, 0x2b, 0x2b, 0xbd, 0x60, 0x26, 0xc9, 0xbd, 0x2d, 0xce, + 0xfe, 0x2a, 0x01, 0x50, 0x6b, 0xb0, 0x23, 0x23, 0x67, 0xe0, 0xda, 0x8d, 0x48, 0xe9, 0xa3, 0xe7, + 0x0f, 0x63, 0x30, 0xe6, 0x7e, 0xe8, 0xd6, 0xa7, 0xef, 0xbe, 0x5e, 0xdb, 0x65, 0x09, 0xcb, 0xef, + 0x4a, 0x23, 0xa7, 0x44, 0xd1, 0xfd, 0x1d, 0x7d, 0x1c, 0xc1, 0x89, 0x1f, 0x98, 0x2e, 0x38, 0x59, + 0x82, 0x99, 0x76, 0xd7, 0xc4, 0xd0, 0xa2, 0x8f, 0x03, 0x1c, 0x73, 0x99, 0xdc, 0xe3, 0x3d, 0x91, + 0xc1, 0x11, 0x91, 0xc1, 0x56, 0x64, 0xbd, 0xf5, 0xa7, 0x0d, 0xd7, 0xca, 0x12, 0x87, 0x8e, 0x04, + 0x5d, 0xa0, 0x9f, 0xbf, 0xde, 0x4e, 0x28, 0x51, 0x49, 0x7e, 0x47, 0x14, 0x99, 0x6b, 0x6f, 0x03, + 0x1c, 0x28, 0x20, 0x56, 0x30, 0xd4, 0x6e, 0xd9, 0x1f, 0x8a, 0x92, 0xf3, 0xd1, 0xa8, 0xe5, 0xff, + 0x88, 0x5a, 0x74, 0x3d, 0x5c, 0xc0, 0x6f, 0xec, 0xfb, 0x3f, 0xfc, 0xe0, 0xed, 0x73, 0xb0, 0x05, + 0xe8, 0x0e, 0x40, 0x07, 0xe2, 0xd9, 0xf6, 0x65, 0x41, 0x39, 0x90, 0x8e, 0x6e, 0x1d, 0xd9, 0x59, + 0x8d, 0x8d, 0x88, 0x89, 0x6a, 0x79, 0xb9, 0x39, 0x63, 0x4f, 0xeb, 0xea, 0x20, 0x42, 0x3d, 0x90, + 0x15, 0x52, 0xd0, 0x27, 0x7a, 0x77, 0x40, 0x7f, 0x6e, 0x7d, 0x70, 0x78, 0x7d, 0x6b, 0xf5, 0x81, + 0xc5, 0x8d, 0xd1, 0xd5, 0xda, 0x0e, 0xd1, 0x9a, 0x4d, 0x34, 0x30, 0xfe, 0xea, 0x18, 0x75, 0xa9, + 0x1f, 0x6a, 0xb3, 0xe4, 0x34, 0x4c, 0xab, 0xdd, 0x23, 0xd3, 0xc6, 0x76, 0x97, 0x5d, 0xab, 0x76, + 0x24, 0x1c, 0x01, 0x83, 0xe7, 0x01, 0xdf, 0x81, 0x66, 0x0f, 0x56, 0xd8, 0xd9, 0x82, 0xf4, 0xa0, + 0xa6, 0x9d, 0xec, 0x7b, 0x36, 0xab, 0xda, 0x3b, 0x6b, 0x22, 0x1e, 0xcd, 0xd6, 0x82, 0x03, 0xed, + 0xff, 0x20, 0xf1, 0x68, 0xc8, 0x84, 0xa0, 0x6a, 0x4a, 0x1f, 0xa1, 0xc2, 0x4e, 0x0c, 0x81, 0xda, + 0xbf, 0x9f, 0x7e, 0xed, 0x3c, 0x6b, 0x27, 0xd0, 0x8e, 0xb0, 0xc5, 0x00, 0x4d, 0xec, 0x0d, 0x80, + 0x5b, 0x89, 0x63, 0x9a, 0xa0, 0x3b, 0x36, 0x89, 0xf4, 0x03, 0x31, 0xc4, 0x5b, 0xad, 0x03, 0x6c, + 0x17, 0xb4, 0x63, 0x8b, 0x1f, 0x42, 0x95, 0x15, 0x1e, 0x1d, 0x8d, 0xf7, 0x80, 0x07, 0xaa, 0xec, + 0xa0, 0xb7, 0xf6, 0x43, 0xc8, 0x2b, 0x70, 0xc7, 0xf3, 0x61, 0xf7, 0xba, 0x0d, 0x8d, 0x35, 0xbd, + 0x0e, 0xdf, 0xc1, 0x73, 0x7a, 0xcf, 0x9d, 0xd3, 0xff, 0xfe, 0x73, 0x1a, 0xdd, 0x8e, 0x6d, 0x8a, + 0x9a, 0x52, 0x09, 0x64, 0x4b, 0xc1, 0x9d, 0x92, 0x73, 0xa6, 0xa9, 0xe7, 0x91, 0x40, 0x58, 0x21, + 0x1b, 0x1b, 0xed, 0x8a, 0xc4, 0xb7, 0x4f, 0xb7, 0x1f, 0x8d, 0x29, 0xbe, 0xd2, 0xdf, 0x4a, 0xb0, + 0x64, 0xa8, 0x43, 0x92, 0xa6, 0xd7, 0x0f, 0x10, 0xa5, 0x5b, 0x06, 0x86, 0x01, 0x7e, 0x1e, 0xe6, + 0x50, 0xa6, 0x71, 0xe0, 0x35, 0xa7, 0x58, 0x1f, 0x72, 0xb9, 0x98, 0x4a, 0xa2, 0xcd, 0x27, 0xaa, + 0xb5, 0xa5, 0x01, 0xfe, 0xf2, 0xd3, 0x09, 0x24, 0x05, 0xf1, 0x4c, 0xce, 0x74, 0x08, 0x3e, 0x15, + 0x52, 0x68, 0x6a, 0xa1, 0x07, 0x6b, 0x81, 0x34, 0x07, 0xb4, 0x52, 0xa5, 0xe0, 0x6a, 0x6d, 0xa9, + 0xa5, 0x07, 0xf4, 0x52, 0xc8, 0x0b, 0x92, 0xdc, 0x07, 0x27, 0x3d, 0x3f, 0x10, 0x5e, 0xad, 0x4b, + 0x16, 0x00, 0x14, 0xbe, 0xfb, 0x32, 0x99, 0x62, 0x70, 0x13, 0x26, 0x00, 0x9d, 0xda, 0xfe, 0x8f, + 0xc0, 0x3f, 0xab, 0xfc, 0xaa, 0xba, 0x96, 0xbb, 0xd3, 0x65, 0x61, 0x73, 0xd6, 0xde, 0xc8, 0xac, + 0xaa, 0x79, 0xa7, 0xbf, 0x6a, 0x29, 0x70, 0x25, 0x25, 0x52, 0xef, 0xc7, 0xc9, 0x97, 0xcf, 0x70, + 0x86, 0x62, 0x62, 0xc6, 0x32, 0xc8, 0x52, 0xdf, 0xdf, 0xc1, 0x73, 0xcf, 0x9e, 0xc0, 0x8c, 0x4e, + 0xfa, 0xfe, 0xca, 0x40, 0x45, 0x4c, 0xf7, 0x2f, 0x20, 0x29, 0x04, 0x13, 0x29, 0x6e, 0xb2, 0x39, + 0x06, 0xd3, 0x67, 0x4a, 0x96, 0x22, 0xbd, 0xb2, 0x17, 0x2c, 0xb4, 0x0f, 0x6f, 0xce, 0x80, 0x51, + 0x43, 0x8b, 0x3e, 0x19, 0xed, 0xcb, 0x1b, 0x7b, 0x14, 0xac, 0x93, 0x8a, 0xb9, 0x1f, 0xa7, 0x9f, + 0x6e, 0x47, 0x34, 0x20, 0x61, 0xc2, 0x89, 0xd6, 0x9f, 0x6d, 0x6f, 0x61, 0xfe, 0x5c, 0xe3, 0x16, + 0x61, 0x6b, 0x1b, 0xf4, 0x01, 0x1c, 0x4a, 0xf8, 0xb4, 0xea, 0x13, 0xbc, 0xba, 0x5f, 0x80, 0x38, + 0xd4, 0x06, 0x10, 0xe8, 0x7c, 0x9c, 0xd7, 0xa3, 0xaa, 0x34, 0x1d, 0x58, 0xb0, 0xa5, 0x3f, 0xa8, + 0x05, 0x47, 0x00, 0x64, 0xa3, 0xab, 0x1d, 0xee, 0xb6, 0x05, 0xad, 0xdf, 0x10, 0x67, 0xa8, 0x30, + 0x09, 0x44, 0xbf, 0xb2, 0x05, 0x43, 0x5d, 0xf1, 0x83, 0xc1, 0xdb, 0x5e, 0xcf, 0x5f, 0x77, 0x2e, + 0x4f, 0xeb, 0x4e, 0x06, 0x35, 0x2d, 0xcd, 0x06, 0xd5, 0x8c, 0xd2, 0xd4, 0x42, 0x03, 0x9a, 0xd7, + 0xed, 0x6d, 0xd6, 0xb2, 0x71, 0x27, 0x96, 0xe9, 0x72, 0x95, 0x41, 0xfc, 0xba, 0x19, 0x99, 0x33, + 0xbe, 0x8c, 0xfe, 0x46, 0x55, 0x4a, 0x04, 0x09, 0x34, 0x11, 0xba, 0xab, 0xa9, 0x62, 0xd9, 0x70, + 0x0b, 0x6c, 0xf4, 0x22, 0x3d, 0x4f, 0xcf, 0x5e, 0x27, 0xc3, 0xaa, 0xaf, 0x79, 0xd1, 0xeb, 0xf5, + 0x86, 0x9c, 0x09, 0xda, 0xcd, 0x29, 0x9b, 0xe5, 0x26, 0x1a, 0xf4, 0x7a, 0x2f, 0x87, 0x73, 0xa2, + 0x66, 0x4c, 0x44, 0xbd, 0x75, 0xae, 0x56, 0xb1, 0x54, 0xc0, 0x90, 0x6e, 0xbd, 0xfd, 0xe2, 0xe2, + 0x62, 0x1d, 0xda, 0x1e, 0x8e, 0x80, 0x8c, 0x5a, 0x15, 0x40, 0x53, 0x60, 0x42, 0xf4, 0xaa, 0x78, + 0x6c, 0x84, 0xec, 0xcf, 0x4a, 0xc6, 0x29, 0x47, 0x5a, 0x72, 0x96, 0xd6, 0x33, 0x5d, 0x45, 0x52, + 0x56, 0xea, 0x6a, 0x4f, 0xdb, 0xa4, 0x8b, 0xb7, 0x74, 0x40, 0x5b, 0x26, 0xad, 0x43, 0xb8, 0x22, + 0x82, 0xb8, 0x34, 0x46, 0x8a, 0xd5, 0xb3, 0x3b, 0x87, 0x7f, 0xe4, 0x79, 0x65, 0x4a, 0x78, 0x96, + 0xe4, 0x95, 0x29, 0xe8, 0xc5, 0xd9, 0xd9, 0xd9, 0xb0, 0xbe, 0x37, 0x22, 0x26, 0x9c, 0xf3, 0xae, + 0xca, 0x57, 0xaa, 0x34, 0xfb, 0x9d, 0x02, 0x0a, 0x5b, 0x87, 0xfa, 0x83, 0xe2, 0x11, 0xbd, 0xa9, + 0xfe, 0x0f, 0x1b, 0x87, 0xfb, 0x30, 0xbe, 0x80, 0x71, 0x52, 0x2a, 0x0d, 0x96, 0x14, 0x92, 0x41, + 0xfe, 0xa8, 0xa1, 0x81, 0x04, 0xee, 0xa6, 0x34, 0x91, 0xca, 0x91, 0x25, 0xb2, 0x24, 0x5a, 0xbf, + 0x70, 0x34, 0x5d, 0xc9, 0x82, 0x24, 0xcc, 0x2c, 0xa3, 0x5e, 0xcb, 0xf5, 0x06, 0xd6, 0xf3, 0xf3, + 0xf3, 0x43, 0x10, 0x49, 0xf0, 0x7f, 0x1e, 0x5d, 0x9c, 0xdb, 0x83, 0xaa, 0x8d, 0x59, 0x96, 0xb5, + 0xcc, 0xec, 0xbf, 0x6e, 0x9b, 0x64, 0xed, 0xa9, 0x0d, 0xe9, 0x52, 0x5b, 0x3b, 0xb4, 0x3b, 0x1f, + 0xe6, 0x34, 0x73, 0xd6, 0x64, 0xec, 0x91, 0xa6, 0x95, 0x8d, 0x84, 0xb3, 0x99, 0x88, 0x12, 0xea, + 0xac, 0xfe, 0xbd, 0xcb, 0x6c, 0x27, 0x12, 0xbd, 0x1a, 0x1a, 0x05, 0xc8, 0x65, 0x52, 0xcd, 0x23, + 0xf7, 0x8b, 0x13, 0x43, 0xbf, 0x79, 0xdd, 0x57, 0xbd, 0x97, 0x2f, 0x7d, 0x80, 0xe3, 0xb1, 0x7a, + 0x30, 0x44, 0x6f, 0x61, 0x3c, 0xe4, 0x34, 0x33, 0x91, 0x5d, 0xa9, 0xfd, 0x0b, 0x2d, 0xa7, 0x37, + 0x4e, 0xf6, 0x0f, 0x38, 0x39, 0xb8, 0x38, 0x1f, 0x6e, 0xf2, 0x28, 0xca, 0xa0, 0xf0, 0x30, 0x81, + 0xc2, 0x57, 0x3a, 0xd8, 0xfe, 0x44, 0x03, 0xfb, 0xa1, 0xc0, 0x7a, 0x68, 0xd0, 0x1a, 0xc5, 0x2e, + 0x81, 0x9f, 0xd5, 0x1c, 0x0f, 0xfa, 0x07, 0x35, 0xbb, 0xac, 0x72, 0x59, 0x82, 0x2e, 0x4f, 0xeb, + 0xf7, 0x91, 0x4d, 0x17, 0x68, 0xa5, 0x6d, 0x8d, 0x1e, 0xe1, 0xa6, 0xa5, 0xb6, 0xaf, 0x8c, 0x94, + 0x3d, 0x20, 0x06, 0x73, 0xd0, 0x15, 0x23, 0x97, 0xb2, 0xb0, 0x0c, 0x76, 0x00, 0x4b, 0xf0, 0xb8, + 0x63, 0xb7, 0x21, 0xfb, 0x02, 0x41, 0xf5, 0x0b, 0x04, 0xfd, 0x7c, 0x13, 0x86, 0xe1, 0xe5, 0x29, + 0x48, 0x81, 0xac, 0x90, 0x9b, 0xac, 0xb4, 0x6a, 0x9e, 0x88, 0x23, 0x67, 0x03, 0x8c, 0x1b, 0x17, + 0x40, 0xe1, 0x44, 0x2a, 0xb5, 0x0c, 0x76, 0x55, 0x0a, 0xc8, 0x73, 0x8d, 0x7e, 0x24, 0x0f, 0x64, + 0xe2, 0xb4, 0x9d, 0x34, 0xea, 0x4f, 0x9f, 0xe8, 0xb7, 0x66, 0xc6, 0x33, 0x3c, 0x6e, 0xd6, 0xe1, + 0xb3, 0xd3, 0x1c, 0xba, 0x49, 0x4e, 0xec, 0xb6, 0x35, 0x7d, 0x58, 0x63, 0x83, 0x23, 0xcf, 0xa2, + 0xca, 0xf5, 0xd7, 0xbd, 0x9e, 0x75, 0xbc, 0x18, 0x77, 0xa6, 0x39, 0x11, 0xf7, 0x68, 0x29, 0x4b, + 0x04, 0xc1, 0x47, 0x4c, 0xc0, 0x25, 0xc2, 0x21, 0x31, 0x66, 0x08, 0xee, 0x58, 0x67, 0xe3, 0xbc, + 0x36, 0x71, 0x22, 0x33, 0xb3, 0x80, 0x3b, 0x38, 0x44, 0xff, 0xf9, 0xf7, 0xbf, 0xfe, 0x79, 0x79, + 0x5a, 0x54, 0xf2, 0xbf, 0x80, 0x64, 0x4e, 0xc0, 0x15, 0x2a, 0xec, 0xa3, 0x2d, 0x75, 0x72, 0x13, + 0x6a, 0x0c, 0xe8, 0xd0, 0xe0, 0x5f, 0x0a, 0x02, 0x37, 0xd0, 0x3e, 0xc0, 0x65, 0x87, 0xfe, 0x4e, + 0x63, 0xc7, 0xd1, 0x0c, 0x2a, 0xa1, 0x3b, 0x72, 0xc1, 0x38, 0x47, 0x31, 0x45, 0x56, 0x12, 0xba, + 0x37, 0xdb, 0x17, 0xd9, 0x79, 0x65, 0x5f, 0x91, 0x19, 0x9b, 0xe9, 0xb0, 0x53, 0x9d, 0xb3, 0x75, + 0xf6, 0x80, 0xaf, 0x07, 0xdc, 0x8b, 0x25, 0x87, 0x84, 0xc2, 0x5b, 0x0b, 0x6d, 0x4b, 0x93, 0x53, + 0xf8, 0x00, 0xdb, 0xff, 0x01, 0xf5, 0xb3, 0x20, 0xc2, 0x61, 0x04, 0x9d, 0x15, 0x40, 0x69, 0x87, + 0xe3, 0x63, 0x27, 0x2d, 0x14, 0x5c, 0x89, 0x0d, 0xa6, 0x46, 0x16, 0xd8, 0x3e, 0x3d, 0xed, 0x7a, + 0x73, 0x2e, 0x87, 0xfc, 0x99, 0x29, 0x96, 0xe2, 0x5d, 0x39, 0x28, 0x63, 0x56, 0xb4, 0x92, 0xab, + 0xdb, 0x5e, 0x4b, 0x42, 0x57, 0xd9, 0x9a, 0x49, 0xdb, 0xe8, 0xc0, 0x1b, 0x5d, 0x8a, 0x04, 0x2e, + 0xdd, 0x7b, 0xab, 0x7f, 0xb7, 0x83, 0x75, 0x2e, 0x34, 0x1a, 0xe1, 0x5d, 0xda, 0x75, 0x8f, 0x4a, + 0x3c, 0xde, 0xf6, 0x68, 0xb5, 0xd9, 0x95, 0xda, 0xc6, 0x81, 0xce, 0xc6, 0x91, 0x96, 0x3f, 0x8e, + 0xe1, 0xdb, 0x06, 0xb7, 0xb1, 0xbf, 0xa9, 0x87, 0xee, 0xd6, 0xab, 0xb7, 0x76, 0xbe, 0x0b, 0xe5, + 0x2d, 0x89, 0x6e, 0xa9, 0xf9, 0x93, 0xae, 0x5a, 0x37, 0x1b, 0x46, 0x67, 0x9d, 0x8b, 0xa3, 0xfb, + 0x43, 0x42, 0x88, 0xee, 0xe0, 0xea, 0xd5, 0x14, 0xc1, 0x25, 0x8e, 0x08, 0xaa, 0xa4, 0x91, 0xcc, + 0x50, 0x1f, 0x79, 0x70, 0xa8, 0x8f, 0x7e, 0x62, 0x5c, 0xce, 0xe0, 0xdd, 0x15, 0x00, 0x17, 0x12, + 0x52, 0xc2, 0x4e, 0x47, 0x97, 0x86, 0x1d, 0x36, 0x39, 0x80, 0x58, 0x4c, 0x38, 0x6e, 0x39, 0xe5, + 0xb6, 0x11, 0xd4, 0x21, 0xea, 0x34, 0x34, 0xfc, 0x0a, 0x34, 0x05, 0x0e, 0x02, 0x75, 0x1b, 0xf5, + 0x19, 0xb4, 0x71, 0x6e, 0xbf, 0x33, 0x01, 0x11, 0x91, 0x22, 0x87, 0x31, 0xaa, 0x9b, 0xe3, 0xb0, + 0x12, 0xad, 0xc3, 0xd1, 0xd9, 0x89, 0x47, 0x2b, 0x1c, 0xad, 0xc7, 0xda, 0xb1, 0x58, 0xfc, 0x45, + 0xa2, 0xf7, 0x50, 0x97, 0x76, 0x03, 0xd1, 0x39, 0x1c, 0xe9, 0x8d, 0xe6, 0x56, 0x9b, 0x7b, 0x4c, + 0xaf, 0xb3, 0xd3, 0x69, 0xed, 0x3c, 0x8d, 0xef, 0xf1, 0xb8, 0xf6, 0xff, 0xaf, 0x71, 0xbd, 0xb3, + 0x3d, 0xcb, 0xb3, 0x21, 0x43, 0x52, 0x6c, 0x51, 0xde, 0xc5, 0xf4, 0x18, 0xc5, 0xb7, 0x0f, 0x89, + 0x63, 0x9e, 0x7f, 0x86, 0x7b, 0x0a, 0xd9, 0x3d, 0x07, 0xc9, 0x6d, 0xe1, 0x38, 0xe2, 0xfd, 0xe0, + 0x59, 0xef, 0xf7, 0x9d, 0xef, 0x3c, 0xe7, 0x3d, 0x34, 0xc6, 0xe0, 0xa1, 0x29, 0xb9, 0xbb, 0x5b, + 0xf4, 0x09, 0x9a, 0xe6, 0x75, 0xce, 0x21, 0x20, 0xa7, 0x90, 0x0b, 0x64, 0x9f, 0x70, 0x4b, 0x4b, + 0x78, 0xa0, 0x6c, 0x58, 0x47, 0xea, 0xd9, 0xa8, 0xff, 0xcf, 0x7c, 0xfa, 0x8e, 0xc8, 0xd7, 0x8d, + 0xf4, 0xf8, 0xe9, 0x42, 0xd5, 0x21, 0x6f, 0xa6, 0x4f, 0xed, 0xed, 0x37, 0x06, 0x7d, 0xee, 0x8f, + 0x88, 0xff, 0x05, 0x8f, 0x02, 0x71, 0x8f, 0x54, 0x14, 0x00, 0x00 + }; + \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f46dac0..f2125fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,7 +10,6 @@ #define FW_NAME "Development" #define FW_VERSION "0.10.0" - const char *__FLAGGED_FW_NAME = "\xbf\x84\xe4\x13\x54" FW_NAME "\x93\x44\x6b\xa7\x75"; const char *__FLAGGED_FW_VERSION = "\x6a\x3f\x3e\x0e\xe1" FW_VERSION "\xb0\x30\x48\xd4\x1a"; @@ -34,15 +33,12 @@ extern "C" int runtime_s = 0; Ticker timeout; -// Get weight -WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); +ConfigurationManager configurationManager; TemperatureProcessor temperatures(GPIO_ONEWIRE_BUS); BatteryProcessor batteryProcessor; -MeasureHandler measures; +MeasureHandler measures(&configurationManager); DeviceManager devicemanager; -ConfigurationManager configurationManager; -TareUtility procs(&scaledevice); void setupHandler() { @@ -91,17 +87,7 @@ void onHomieEvent(const HomieEvent &event) Homie.getLogger() << "DEBUG: No Temperature sensors attached!" << endl; } - if (scaledevice.DeviceReady()) - { - Homie.getLogger() << "DEBUG: Try to get scale value!" << endl; - float weight = scaledevice.getWeight(measures.GetTemperaturValue(1)); - measures.SetWeightValue(weight); - Homie.getLogger() << "DEBUG: Got Scale value: " << weight << endl; - } - else - { - Homie.getLogger() << "DEBUG: Scale not ready or disconnected!" << endl; - } + measures.SetVoltage(batteryProcessor.getVolt()); break; @@ -147,10 +133,19 @@ void loopHandler() void setup() { + + Serial.begin(115200); + if (devicemanager.GetOperatingState() == OperatingStates::Maintenance) + { + // Homie.getLogger() << "INFO: Device in Maintenance. Go to sleep" << endl; + devicemanager.ServeWebui(); + // devicemanager.GotToSleep(); + return; + } + Homie.disableResetTrigger(); Homie.disableLedFeedback(); // collides with Serial on ESP07 WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption - Serial.begin(115200); Homie.getLogger() << endl; Homie.getLogger() << "///////////////////////////////////////////" << endl; Homie.getLogger() << "GPIO_MAINTENANCE_PIN: " << GPIO_MAINTENANCE_PIN << endl; @@ -161,12 +156,6 @@ void setup() Homie.getLogger() << "FW_VERSION: " << FW_VERSION << endl; Homie.getLogger() << "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; Homie.getLogger() << "///////////////////////////////////////////" << endl; - if (devicemanager.GetOperatingState() == OperatingStates::Maintenance) - { - Homie.getLogger() << "INFO: Device in Maintenance. Go to sleep" << endl; - devicemanager.GotToSleep(); - return; - } Homie.getLogger() << "INFO: Device in normal mode." << endl; @@ -199,11 +188,7 @@ void setup() configurationManager.setup(); temperatures.setup(); - scaledevice.setup( - configurationManager.GetKilogramDivider(), - configurationManager.GetWeightOffset(), - configurationManager.GetCalibrationTemperatureSetting(), - configurationManager.GetCalibrationFactorSetting()); + Homie.getLogger() << "DEBUG: Turn on WIFI: " << millis() / 1000 << endl; WiFi.forceSleepWake(); @@ -220,5 +205,8 @@ void setup() void loop() { - Homie.loop(); + if (!devicemanager.GetOperatingState() == OperatingStates::Maintenance) + { + Homie.loop(); + } } \ No newline at end of file From 42462fe922f35ae0d2c0a8b4b5eaf1a3ff5f7b63 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:46:24 +0200 Subject: [PATCH 18/99] Refactored Settings class Storign data to spiff and removed homie reference --- src/ConfigurationManager.cpp | 160 +++++++++++++++++++++++++++++------ src/ConfigurationManager.h | 42 ++++++++- 2 files changed, 176 insertions(+), 26 deletions(-) diff --git a/src/ConfigurationManager.cpp b/src/ConfigurationManager.cpp index fa368ca..a75aca5 100644 --- a/src/ConfigurationManager.cpp +++ b/src/ConfigurationManager.cpp @@ -1,4 +1,15 @@ #include +#include // Reference for Memmory handling +#include +#include +#include // Include the SPIFFS library +#define CONFIG_FILE "/config.json" + +// Avoiding compile issues +ConfigurationManager *ConfigurationManager::instance = nullptr; + +#define JSON_DOCSIZE 1024 + const int DEFAULT_SLEEP_TIME = 20; /* Use sketch BeeScale-Calibration.ino to determine these calibration values. @@ -8,7 +19,6 @@ const long DEFAULT_WEIGHT_OFFSET = 666; // Load cell zero offs const float DEFAULT_KILOGRAM_DIVIDER = 21.59; // Load cell value per kilogram. const float DEFAULT_CALIBRATION_TEMPERATURE = 23.44; // Temperature at which the scale has been calibrated for Temperature compensation const float DEFAULT_CALIBRATION_FACTOR_GRAM_DEGREE = 0.0; // Calibration factor in gram per degree - /* * *Some* ESPs tend to have a too low reading on ESP.getVcc() * To get the maximum battery runtime you should check what ADC is reading and compare @@ -17,51 +27,151 @@ const float DEFAULT_CALIBRATION_FACTOR_GRAM_DEGREE = 0.0; // Calibration factor */ const float DEFAULT_VCC_ADJUST = 0.23; -HomieSetting sleepTimeSetting("sleepTime", "SleepTime in seconds (max. 3600s!), default is 60s"); -HomieSetting weightOffsetSetting("weightOffset", "Offset value to zero."); -HomieSetting kilogramDividerSetting("kilogramDivider", "Scale value per kilogram."); -HomieSetting calibrationTemperatureSetting("calibrationTemperature", "Outside Temperature at which the scale has been calibrated"); -HomieSetting calibrationFactorSetting("calibrationFactor", "Calibration Factor in gram per degree. 0.0 to disable adjustment"); -HomieSetting vccAdjustSetting("vccAdjust", "Calibration value for input voltage. See sketch for details."); - void ConfigurationManager::setup() { + this->SleepTime = DEFAULT_SLEEP_TIME; + this->WeightOffset = DEFAULT_WEIGHT_OFFSET; + this->KilogramDivider = DEFAULT_KILOGRAM_DIVIDER; + this->VccAdjustSetting = DEFAULT_VCC_ADJUST; + this->CalibrationFactorSetting = DEFAULT_CALIBRATION_TEMPERATURE; + this->CalibrationFactorSetting = DEFAULT_CALIBRATION_FACTOR_GRAM_DEGREE; +} - sleepTimeSetting.setDefaultValue(DEFAULT_SLEEP_TIME); - /* - * Can't set more than one value to default, see issue #323 - * https://github.com/marvinroger/homie-esp8266/issues/323 - */ - weightOffsetSetting.setDefaultValue(DEFAULT_WEIGHT_OFFSET); - kilogramDividerSetting.setDefaultValue(DEFAULT_KILOGRAM_DIVIDER); - vccAdjustSetting.setDefaultValue(DEFAULT_VCC_ADJUST); - calibrationTemperatureSetting.setDefaultValue(DEFAULT_CALIBRATION_TEMPERATURE); - calibrationFactorSetting.setDefaultValue(DEFAULT_CALIBRATION_FACTOR_GRAM_DEGREE); +ConfigurationManager::ConfigurationManager() +{ + //this->ReadSettings(); } long ConfigurationManager::GetSleepTime() { - return sleepTimeSetting.get(); + return this->SleepTime; } long ConfigurationManager::GetWeightOffset() { - return weightOffsetSetting.get(); + return this->WeightOffset; } double ConfigurationManager::GetKilogramDivider() { - return kilogramDividerSetting.get(); + return this->KilogramDivider; } double ConfigurationManager::GetCalibrationTemperatureSetting() { - return calibrationTemperatureSetting.get(); + return this->CalibrationTemperatureSetting; } double ConfigurationManager::GetCalibrationFactorSetting() { - return calibrationFactorSetting.get(); + return this->CalibrationFactorSetting; } double ConfigurationManager::GetVccAdjustSetting() { - return vccAdjustSetting.get(); -} \ No newline at end of file + return this->VccAdjustSetting; +} + +String ConfigurationManager::GetWifiSsid() { return this->WifiSsid; } +String ConfigurationManager::GetWifiPassword() { return this->WifiPassword; } +String ConfigurationManager::GetMqttServer() { return this->MqttServer; } +int ConfigurationManager::GetMqttPort() { return this->MqttPort; } +String ConfigurationManager::GetMqttUser() { return this->MqttUser; } +String ConfigurationManager::GetMqttPassword() { return this->MqttPassword; } + +String ConfigurationManager::GetJson() +{ + String values; + DynamicJsonDocument doc = this->GetJsonDocument(); + serializeJson(doc, values); + return values; +} + +DynamicJsonDocument ConfigurationManager::GetJsonDocument() +{ + DynamicJsonDocument doc(JSON_DOCSIZE); + doc["system"]["sleeptime"] = this->GetSleepTime(); + doc["system"]["vccadjustsetting"] = this->GetVccAdjustSetting(); + doc["scale"]["weightoffset"] = this->GetWeightOffset(); + doc["scale"]["kilogramdivider"] = this->GetKilogramDivider(); + doc["scale"]["calibrationtemperaturesetting"] = this->GetCalibrationTemperatureSetting(); + doc["scale"]["calibrationfactorsetting"] = this->GetCalibrationFactorSetting(); + doc["wireles"]["ssid"] = this->GetWifiSsid(); + doc["wireles"]["password"] = this->GetWifiPassword(); + doc["mqtt"]["server"] = this->GetMqttServer(); + doc["mqtt"]["port"] = this->GetMqttPort(); + doc["mqtt"]["user"] = this->GetMqttUser(); + doc["mqtt"]["password"] = this->GetMqttPassword(); + return doc; +} + +void ConfigurationManager::ApplyJsonInput(String json) +{ + DynamicJsonDocument jData(2048); + Serial.println(json); + deserializeJson(jData, json); + + this->WeightOffset = jData["scale"]["weightoffset"]; + this->KilogramDivider = jData["scale"]["kilogramdivider"]; + this->CalibrationTemperatureSetting = jData["scale"]["calibrationtemperaturesetting"]; + this->CalibrationFactorSetting = jData["scale"]["calibrationfactorsetting"]; + + this->SleepTime = jData["system"]["sleeptime"]; + this->VccAdjustSetting = jData["system"]["vccadjustsetting"]; + + this->MqttServer = jData["mqtt"]["server"].as(); + this->MqttUser = jData["mqtt"]["user"].as(); + this->MqttPassword = jData["mqtt"]["password"].as(); + this->MqttPort = jData["mqtt"]["port"]; + + this->WifiSsid = jData["wireles"]["ssid"].as(); + this->WifiPassword = jData["wireles"]["password"].as(); + + + if (jData.isNull()) + { + + } + + // else + // { + // Serial.println("is null"); + // } + // this->WifiPassword = jData["wireles"]["password"].as(); + // this->WifiSsid = jData["wireles"]["ssid"].as(); +} + +void ConfigurationManager::StoreSettings() +{ + String json = this->GetJson(); + if (SPIFFS.begin()) + { + SPIFFS.remove(CONFIG_FILE); + File configFile = SPIFFS.open(CONFIG_FILE, "w"); + if (configFile) + { + Serial.println("Saving content: "); + Serial.println(json); + configFile.println(json); + configFile.close(); + } + } +} + +void ConfigurationManager::ReadSettings() +{ + + if (SPIFFS.begin()) + { + if (SPIFFS.exists(CONFIG_FILE)) + { + + File configFile = SPIFFS.open(CONFIG_FILE, "r"); + if (configFile) + { + Serial.print("Read content:"); + String s = configFile.readString(); + this->ApplyJsonInput(s); + Serial.println("Done!✔"); + return; + } + } + } +} diff --git a/src/ConfigurationManager.h b/src/ConfigurationManager.h index 5ba775d..70ce486 100644 --- a/src/ConfigurationManager.h +++ b/src/ConfigurationManager.h @@ -10,16 +10,56 @@ class ConfigurationManager { public: + ConfigurationManager(); void setup(); - long GetSleepTime(); long GetWeightOffset(); double GetKilogramDivider(); double GetCalibrationTemperatureSetting(); double GetCalibrationFactorSetting(); double GetVccAdjustSetting(); + void ApplyJsonInput(String json); + + String GetWifiSsid(); + String GetWifiPassword(); + String GetMqttServer(); + int GetMqttPort(); + String GetMqttUser(); + String GetMqttPassword(); + + String GetJson(); + void StoreSettings(); + void ReadSettings(); + + // Get an Singelton instance + static ConfigurationManager *getInstance() + { + if (instance == nullptr) + { + instance = new ConfigurationManager(); + } + return instance; + } + private: + static ConfigurationManager *instance; + float VccAdjustSetting; int SleepTime; + String WifiSsid; + String WifiPassword; + + String MqttServer; + String MqttUser; + int MqttPort; + String MqttPassword; + + // weight + float WeightOffset; + float KilogramDivider; + float CalibrationTemperatureSetting; + float CalibrationFactorSetting; byte CurrentState; + + DynamicJsonDocument GetJsonDocument(); }; #endif \ No newline at end of file From 67eb295bc20d8969fa916d52c57e7d4bfbb5c607 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:49:04 +0200 Subject: [PATCH 19/99] Cleanup configuration class --- src/ConfigurationManager.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/ConfigurationManager.cpp b/src/ConfigurationManager.cpp index a75aca5..b821f9e 100644 --- a/src/ConfigurationManager.cpp +++ b/src/ConfigurationManager.cpp @@ -105,7 +105,6 @@ DynamicJsonDocument ConfigurationManager::GetJsonDocument() void ConfigurationManager::ApplyJsonInput(String json) { DynamicJsonDocument jData(2048); - Serial.println(json); deserializeJson(jData, json); this->WeightOffset = jData["scale"]["weightoffset"]; @@ -123,19 +122,6 @@ void ConfigurationManager::ApplyJsonInput(String json) this->WifiSsid = jData["wireles"]["ssid"].as(); this->WifiPassword = jData["wireles"]["password"].as(); - - - if (jData.isNull()) - { - - } - - // else - // { - // Serial.println("is null"); - // } - // this->WifiPassword = jData["wireles"]["password"].as(); - // this->WifiSsid = jData["wireles"]["ssid"].as(); } void ConfigurationManager::StoreSettings() @@ -147,8 +133,6 @@ void ConfigurationManager::StoreSettings() File configFile = SPIFFS.open(CONFIG_FILE, "w"); if (configFile) { - Serial.println("Saving content: "); - Serial.println(json); configFile.println(json); configFile.close(); } @@ -166,10 +150,8 @@ void ConfigurationManager::ReadSettings() File configFile = SPIFFS.open(CONFIG_FILE, "r"); if (configFile) { - Serial.print("Read content:"); String s = configFile.readString(); this->ApplyJsonInput(s); - Serial.println("Done!✔"); return; } } From eabd2adae9f531aadcfb9a8093c90317be3af03d Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:49:16 +0200 Subject: [PATCH 20/99] Added ardunino json reference --- platformio.ini | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index c8f330e..d68fb0b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,6 +16,7 @@ build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY lib_deps = https://github.com/homieiot/homie-esp8266/tree/fix/711-Espressif8266-v3.0.0 ;ArduinoJson@^5.13.4 + bblanchon/StreamUtils @ ^1.6.1 OneWire@^2.3.5 DallasTemperature@^3.9.1 bogde/HX711@^0.7.4 @@ -27,7 +28,7 @@ lib_compat_mode = strict platform = espressif8266 board = d1_mini framework = arduino -build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY +build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -fexceptions -D GPIO_HX711_DT=13 ;D7 -D GPIO_HX711_SCK=12 ;D6 -D GPIO_ONEWIRE_BUS=14 ;D5 @@ -35,9 +36,12 @@ build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY lib_deps = https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 ;ArduinoJson@^5.13.4 + bblanchon/StreamUtils @ ^1.6.1 OneWire@^2.3.5 DallasTemperature@^3.9.1 bogde/HX711@^0.7.4 RunningMedian@^0.3.0 monitor_speed = 115200 -lib_compat_mode = strict \ No newline at end of file +lib_compat_mode = strict + +build_type = debug From 4bcab19a4ccccc54c48774918cef7d0ac489a073 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:49:50 +0200 Subject: [PATCH 21/99] Added default config --- data/config.json | 22 +++++++++++++++++++ data/{homie/config.json => config_homie.json} | 0 2 files changed, 22 insertions(+) create mode 100644 data/config.json rename data/{homie/config.json => config_homie.json} (100%) diff --git a/data/config.json b/data/config.json new file mode 100644 index 0000000..06ad8bd --- /dev/null +++ b/data/config.json @@ -0,0 +1,22 @@ +{ + "system": { + "sleeptime": 20, + "vccadjustsetting": 0 + }, + "mqtt": { + "server": "192.168.178.201", + "port": 1886, + "user": "ulf", + "password": "hermes" + }, + "scale":{ + "weightoffset":0, + "kilogramdivider":0, + "calibrationtemperaturesetting":0, + "calibrationfactorSetting":0 + }, + "wireles": { + "password": "password", + "ssid": "myssid" + } +} \ No newline at end of file diff --git a/data/homie/config.json b/data/config_homie.json similarity index 100% rename from data/homie/config.json rename to data/config_homie.json From a60f5e939491963c834ec7ce2fb69ac75c125226 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:51:14 +0200 Subject: [PATCH 22/99] Movied html dor out of data dir Because it does not have to be into the SPIFFS --- {data/html => html}/404.htm | 0 {data/html => html}/index.css | 0 {data/html => html}/index.htm | 0 {data/html => html}/index.js | 0 {data/html => html}/settings_general.htm | 0 {data/html => html}/settings_tare.htm | 0 tools/cdata.js | 25 +++--------------------- 7 files changed, 3 insertions(+), 22 deletions(-) rename {data/html => html}/404.htm (100%) rename {data/html => html}/index.css (100%) rename {data/html => html}/index.htm (100%) rename {data/html => html}/index.js (100%) rename {data/html => html}/settings_general.htm (100%) rename {data/html => html}/settings_tare.htm (100%) diff --git a/data/html/404.htm b/html/404.htm similarity index 100% rename from data/html/404.htm rename to html/404.htm diff --git a/data/html/index.css b/html/index.css similarity index 100% rename from data/html/index.css rename to html/index.css diff --git a/data/html/index.htm b/html/index.htm similarity index 100% rename from data/html/index.htm rename to html/index.htm diff --git a/data/html/index.js b/html/index.js similarity index 100% rename from data/html/index.js rename to html/index.js diff --git a/data/html/settings_general.htm b/html/settings_general.htm similarity index 100% rename from data/html/settings_general.htm rename to html/settings_general.htm diff --git a/data/html/settings_tare.htm b/html/settings_tare.htm similarity index 100% rename from data/html/settings_tare.htm rename to html/settings_tare.htm diff --git a/tools/cdata.js b/tools/cdata.js index c95f27c..980e9eb 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -186,10 +186,10 @@ fs.writeFileSync(resultFile, src); } -writeHtmlGzipped("data/html/index.htm", "src/html/html_ui.h"); +writeHtmlGzipped("html/index.htm", "src/html/html_ui.h"); writeChunks( - "data/html", + "html", [ { file: "style.css", @@ -232,23 +232,4 @@ writeHtmlGzipped("data/html/index.htm", "src/html/html_ui.h"); ], "src/html/html_settings.h" ); - -// writeChunks( -// "data/html", -// [ -// { -// file: "404.htm", -// name: "PAGE_404", -// prepend: "=====(", -// append: ")=====", -// method: "plaintext", -// filter: "html-minify", -// }, -// { -// file: "favicon.ico", -// name: "favicon", -// method: "binary", -// }, -// ], -// "html_other.h" -// ); \ No newline at end of file + \ No newline at end of file From 8e6475975d312ae3fd3d88676e1d47d09ff1f993 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 10:51:24 +0200 Subject: [PATCH 23/99] Added some vscode configs --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fcb273a..ce16329 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,7 @@ "PLATFORMIO_CALLER": "vscode" }, "files.associations": { - "functional": "cpp" + "functional": "cpp", + "*.tcc": "cpp" } } \ No newline at end of file From 7f5428e1f2c0b8507ba96fe36f7f3f2f22ba3feb Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:03:33 +0200 Subject: [PATCH 24/99] Modified config --- data/config_homie.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/config_homie.json b/data/config_homie.json index c1b44e8..89dc4c4 100644 --- a/data/config_homie.json +++ b/data/config_homie.json @@ -1,14 +1,14 @@ { "wifi": { "ssid": "Ponyhof", - "password": "Tumalonga2411" + "password": "" }, "mqtt": { "host": "192.168.178.201", "port": 1886, "auth": true, "username": "sascha", - "password": "tumalonga2411" + "password": "" }, "name": "dev-device", "ota": { From d6fdb0da3736daeb35ead99fc2a7028c9be296c0 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:04:03 +0200 Subject: [PATCH 25/99] Added new Webserver implementation This will be served when the device is in maintainenance mode --- src/ConfigWebserver.cpp | 91 +++++++++++++++++++++++++++++++++++++++++ src/ConfigWebserver.h | 19 +++++++++ src/main.cpp | 34 +++++++-------- 3 files changed, 127 insertions(+), 17 deletions(-) create mode 100644 src/ConfigWebserver.cpp create mode 100644 src/ConfigWebserver.h diff --git a/src/ConfigWebserver.cpp b/src/ConfigWebserver.cpp new file mode 100644 index 0000000..df50584 --- /dev/null +++ b/src/ConfigWebserver.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include "Arduino.h" +#include "AsyncJson.h" +#include "ArduinoJson.h" + +#include "ConfigWebserver.h" +#include "ConfigurationManager.h" +#include "html\html_ui.h" + +#define AP_SSIDNAME "HiveMonitor" +#define AP_PASSWORD "B33$" + +AsyncWebServer server(80); +AsyncCallbackJsonWebHandler *storeConfigHandler = new AsyncCallbackJsonWebHandler("/store", [](AsyncWebServerRequest *request, JsonVariant &json) + { + Serial.print("Got Setting:"); + + String values; + serializeJson(json, values); + Serial.println(values); + ConfigurationManager::getInstance()->ApplyJsonInput(values); + ConfigurationManager::getInstance()->StoreSettings(); + ConfigurationManager::getInstance()->ReadSettings(); + request->send(200); + }); + +ConfigWebserver::ConfigWebserver() {} +ConfigWebserver::~ConfigWebserver() {} + +void ConfigWebserver::Serve() +{ + WiFi.softAP(AP_SSIDNAME, AP_PASSWORD); + if (WiFi.waitForConnectResult() != WL_CONNECTED) + { + Serial.printf("WiFi Failed!\n"); + return; + } + Serial.print("IP Address: "); + Serial.println(WiFi.localIP()); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Origin"), "*"); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Methods"), "*"); + DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); + server.addHandler(storeConfigHandler); + + // server.on("/tarestep0", HTTP_POST, [](AsyncWebServerRequest *request) + // { + // WeightProcessor *scaledevice = WeightProcessor::getInstance(GPIO_HX711_DT, GPIO_HX711_SCK); + // if (scaledevice->getWeight()) + // { + // float offset = scaledevice->getWeight(0); + // Serial.println("Offset"); + // Serial.println(offset); + // request->send(200); + // } + // else + // { + // Serial.println("Not available"); + // request->send(500, "text" + // "Scale not ready or connected!"); + // } + // }); + + // server.on( + // "/tarestep1", HTTP_POST, [](AsyncWebServerRequest *request) {}, NULL, + // [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { + + // }); + + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) + { + AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); + response->addHeader(F("Cache-Control"), "no-store,max-age=0"); + // Gzip content + response->addHeader(F("Content-Encoding"), "gzip"); + request->send(response); + }); + + server.on("/settings", HTTP_GET, [](AsyncWebServerRequest *request) + { + ConfigurationManager *scaledevice = ConfigurationManager::getInstance(); + ConfigurationManager::getInstance()->ReadSettings(); + String settings = scaledevice->GetJson(); + Serial.println("Settings: "); + Serial.println(settings); + request->send(200, "application/json", settings); + }); + + server.begin(); +} diff --git a/src/ConfigWebserver.h b/src/ConfigWebserver.h new file mode 100644 index 0000000..bc233d8 --- /dev/null +++ b/src/ConfigWebserver.h @@ -0,0 +1,19 @@ +#ifndef ConfigWebserver_H +#define ConfigWebserver_H + +#include "Arduino.h" +#include + + +class ConfigWebserver +{ + +public: + ConfigWebserver(); + ~ConfigWebserver(); + void Serve(); + + +}; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f2125fc..0533347 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,8 +5,9 @@ #include "BatteryProcessor.h" #include "MeasureHandler.h" #include "DeviceManager.h" -#include "ConfigurationManager.h" +// #include "ConfigurationManager.h" #include "TareUtility.h" +#include "ConfigWebserver.h" #define FW_NAME "Development" #define FW_VERSION "0.10.0" @@ -33,13 +34,11 @@ extern "C" int runtime_s = 0; Ticker timeout; -ConfigurationManager configurationManager; TemperatureProcessor temperatures(GPIO_ONEWIRE_BUS); BatteryProcessor batteryProcessor; -MeasureHandler measures(&configurationManager); +MeasureHandler measures; DeviceManager devicemanager; - void setupHandler() { measures.setup(); @@ -51,7 +50,7 @@ void max_run() if (runtime_s == RUNTIME_MAX) { Homie.getLogger() << "DEBUG: Max. runtime of " << RUNTIME_MAX << "s reached, shutting down!" << endl; - devicemanager.SetSleepTime(configurationManager.GetSleepTime()); + // devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); // Homie.getLogger() << "✔ Preparing for " << devicemanager.GetSleepTime() << " seconds sleep" << endl; Homie.prepareToSleep(); } @@ -87,8 +86,6 @@ void onHomieEvent(const HomieEvent &event) Homie.getLogger() << "DEBUG: No Temperature sensors attached!" << endl; } - - measures.SetVoltage(batteryProcessor.getVolt()); break; @@ -106,7 +103,7 @@ void onHomieEvent(const HomieEvent &event) } else { - devicemanager.SetSleepTime(configurationManager.GetSleepTime()); + // devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); } // Submitting the gathered data now. @@ -133,18 +130,22 @@ void loopHandler() void setup() { - Serial.begin(115200); - if (devicemanager.GetOperatingState() == OperatingStates::Maintenance) + // Get the settings + ConfigurationManager::getInstance()->ReadSettings(); + + Homie.disableResetTrigger(); + Homie.disableLedFeedback(); // collides with Serial on ESP07 + + switch (devicemanager.GetOperatingState()) { - // Homie.getLogger() << "INFO: Device in Maintenance. Go to sleep" << endl; - devicemanager.ServeWebui(); - // devicemanager.GotToSleep(); + case OperatingStates::Maintenance: + ConfigWebserver configServer; + configServer.Serve(); return; + } - Homie.disableResetTrigger(); - Homie.disableLedFeedback(); // collides with Serial on ESP07 WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption Homie.getLogger() << endl; Homie.getLogger() << "///////////////////////////////////////////" << endl; @@ -185,10 +186,9 @@ void setup() break; case STATE_CONNECT_WIFI: Homie.onEvent(onHomieEvent); - configurationManager.setup(); + // ConfigurationManager::getInstance()->setup(); temperatures.setup(); - Homie.getLogger() << "DEBUG: Turn on WIFI: " << millis() / 1000 << endl; WiFi.forceSleepWake(); From f5c1f7926f890b0dc7a93d534cfc06acd46f535e Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:04:39 +0200 Subject: [PATCH 26/99] Removed Webserver from DeviceManager Improving separation of concern --- src/DeviceManager.cpp | 70 ++----------------------------------------- src/DeviceManager.h | 3 +- 2 files changed, 3 insertions(+), 70 deletions(-) diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 2e696fd..dfcd201 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -1,13 +1,10 @@ #include -#include -#include -#include -#include "html\html_ui.h" + #include "TareUtility.h" +#include "ConfigurationManager.h" -AsyncWebServer server(80); void DeviceManager::setup() {} @@ -100,66 +97,3 @@ OperatingStates DeviceManager::GetOperatingState() } return OperatingStates::Operating; } - -void DeviceManager::ServeWebui() -{ - WiFi.softAP("HiveMonitor", "123"); - if (WiFi.waitForConnectResult() != WL_CONNECTED) - { - Serial.printf("WiFi Failed!\n"); - return; - } - Serial.print("IP Address: "); - Serial.println(WiFi.localIP()); - DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Origin"), "*"); - DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Methods"), "*"); - DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); - - server.on("/tarestep0", HTTP_POST, [](AsyncWebServerRequest *request) - { - WeightProcessor *scaledevice = WeightProcessor::getInstance(GPIO_HX711_DT, GPIO_HX711_SCK); - if (scaledevice->DeviceReady()) - { - float offset = scaledevice->getWeight(0); - Serial.println("Offset"); - Serial.println(offset); - request->send(200); - } - else - { - Serial.println("Not available"); - request->send(500, "text" - "Scale not ready or connected!"); - } - - }); - - server.on( - "/tarestep1", HTTP_POST, [](AsyncWebServerRequest *request) {}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) - { - - // WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); - // if (scaledevice.DeviceReady()) - // { - - // float offset = scaledevice.getWeight(0); - // request->send(200); - // } - // else - // { - // request->send(500, "text" - // "Scale not ready or connected!"); - // } - }); - - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) - { - AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); - response->addHeader(F("Cache-Control"), "no-store,max-age=0"); - // Gzip content - response->addHeader(F("Content-Encoding"), "gzip"); - request->send(response); - }); - server.begin(); -} \ No newline at end of file diff --git a/src/DeviceManager.h b/src/DeviceManager.h index ca7a8e3..37faf04 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -49,8 +49,7 @@ class DeviceManager byte GetCurrentState(); // Get the actual Operating State OperatingStates GetOperatingState(); - // Serves the Webui for configuration purpose - void ServeWebui(); + private: OperatingStates operatingState; From 32e10110473fb7aa7bc9038b5450221fca202cbe Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:05:20 +0200 Subject: [PATCH 27/99] Using singleton instance from conf manager --- src/MeasureHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MeasureHandler.cpp b/src/MeasureHandler.cpp index d4af2b1..281e396 100644 --- a/src/MeasureHandler.cpp +++ b/src/MeasureHandler.cpp @@ -15,9 +15,9 @@ HomieNode Nodebattery("battery", "volt", "switch"); HomieNode NodebatAlarm("battery", "alarm", "switch"); HomieNode Nodejson("data", "__json__", "switch"); //Hiveeyes.org compatibility format -MeasureHandler::MeasureHandler(ConfigurationManager *configurationManager) +MeasureHandler::MeasureHandler() { - this->configurationManager = configurationManager; + this->configurationManager = ConfigurationManager::getInstance(); this->configurationManager->setup(); } From 3d05e63b9a4e35038075d7515bd24a63a93cef6b Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:06:20 +0200 Subject: [PATCH 28/99] Reconfiguration of measuring speed --- src/MeasureHandler.h | 2 +- src/WeightProcessor.cpp | 35 +++++++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/MeasureHandler.h b/src/MeasureHandler.h index 5c18437..4934ca8 100644 --- a/src/MeasureHandler.h +++ b/src/MeasureHandler.h @@ -18,7 +18,7 @@ class MeasureHandler void setupHandler(); void AdvertiseNodes(); - MeasureHandler(ConfigurationManager *configurationManager); + MeasureHandler(); void SetWeightValue(float weightValue); void SetTemperatureValue(int index, float temperature); diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index 70505fc..87bb239 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -6,7 +6,7 @@ #include "HX711.h" #include // Avoiding compile issues -WeightProcessor* WeightProcessor::instance = nullptr; +WeightProcessor *WeightProcessor::instance = nullptr; int _dtPin; int _scPin; @@ -34,22 +34,21 @@ void WeightProcessor::setup(float kilogramDivider, float weightOffset, float cal float WeightProcessor::getWeight() { + RunningMedian WeightSamples = RunningMedian(3); scale.power_up(); - delay(100); scale.set_scale(this->_kilogramDivider); //initialize scale scale.set_offset(this->_weightOffset); //initialize scale for (int i = 0; i < 3; i++) { float WeightRaw = scale.get_units(3); WeightSamples.add(WeightRaw); - delay(500); - yield(); } scale.power_down(); - - float weight = WeightSamples.getMedian(); - return weight; + float median = WeightSamples.getMedian(); + Serial.print("Median:"); + Serial.println(median); + return median; } WeightProcessor::~WeightProcessor() @@ -63,18 +62,18 @@ bool WeightProcessor::DeviceReady() float WeightProcessor::getWeight(float temperatureForCompensation) { - if (scale.is_ready()) - { - float weight = this->getWeight(); - //temperature compensation - if (temperatureForCompensation < this->_calibrationTemperature) - weight = weight + (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); - if (temperatureForCompensation > this->_calibrationTemperature) - weight = weight - (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); + // if (scale.is_ready()) + // { + float weight = this->getWeight(); + //temperature compensation + if (temperatureForCompensation < this->_calibrationTemperature) + weight = weight + (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); + if (temperatureForCompensation > this->_calibrationTemperature) + weight = weight - (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); - return weight; - } - return 0; + return weight; + // } + // return 0; } float WeightProcessor::toKilogram(float getWeighMeasure) From 24363ce663f4e6ff6817870b8c3a3cf5bb3b831a Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 11:18:09 +0200 Subject: [PATCH 29/99] :pencil: Updated readme --- README.md | 80 ++++++++++++++++++++--------------------- data/homie/config_.json | 4 +-- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 1a13359..5d8067f 100644 --- a/README.md +++ b/README.md @@ -160,56 +160,52 @@ The Configuration is done with an json file. An example of it looks like this: ```json { - "wifi": { - "ssid": "SSID", - "password": "mysecret" - }, - "mqtt": { - "host": "192.168.178.55", - "port": 1886, - "base_topic": "", - "auth": true, - "username": "username", - "password": "password" - }, - "name":"hive-teststand", - "ota": { - "enabled":false - }, - "device_id":"hive-teststand", - "settings": { - "sleepTime": 3600, - "sendInterval": 320, - "weightOffset": 244017.00, - "kilogramDivider": 22.27 - } + "system": { + "sleeptime": 2, + "vccadjustsetting": 0 + }, + "scale": { + "weightoffset": 0, + "kilogramdivider": 0, + "calibrationtemperaturesetting": 0, + "calibrationfactorsetting": 0 + }, + "wifi": { + "ssid": "", + "password": "33" + }, + "mqtt": { + "server": "kjkhj", + "port": 0, + "user": "null", + "password": "null" + } + } + +You can set and read the configuration when you use the maintenance mode. + ``` The following table will give you more insights about the settings. - -|Setting|Description| -|-|-| -|wifi.sid|the wifis name.| -|wifi.password|The password for the wifi| -|mqtt.host|The host for the mqtt. This can be a dns name or a ip address.| -|mqtt.port|The Mqtt Port.| -|mqtt.base_topic|If there is a prefix required for a topic, then you can set here the basetopic.| -|mqtt.auth|__true__ when using authentication, or __false__ when not using it| -|mqtt.username|The username when authentication is configured.| -|mqtt.password|The password when authentication is configured.| -|name|This is the device name. This will shown up in the router later| -|ota.enabled|__true__ to enable _o_ver _t_he _a_ir update.| -|device_id|The device ID, possible the same as name.| -|settings.sleepTime|The Sleepingtime in seconds| -|settings.sendInterval|The intervall to send, the sleep time will be different. When you have a send intervall from 60 seconds and a weight intervall of 90 seconds it will take 2 rounds of wake up| -|settings.weightOffset|The weight offset. This is neccessary for the adjustment of the weightcell. Because there are some base weights.| -|settings.kilogramDivider|The divider to get the kilograms.| +|Group|Setting|Description| +|-|-|-| +|system|sleeptime|The Sleepingtime in seconds| +|system|vccadjustsetting|This setting adjusting the battery monitor.| +|wireles|ssid|The wifi SSID.| +|wireles|password|The password to authenticate.| +|scale|weightoffset|This is the offset to Tare the 0 value. When no weight is placed.| +|scale|kilogramdivider|This is the Raw value, to divide the kilogram value out.| +|scale|calibrationtemperaturesetting|This is the measured temperatur when the intial adjust was done. This will later be used, to compensate the weight differences due to the temparture.| +|scale|calibrationfactorsetting|This will be the calibarion factor. Calculated ba the autotare function.| +|mqtt|server|The host for the mqtt. This can be a dns name or a ip address.| +|mqtt|port|The Mqtt Port.| +|mqtt|user|The username when authentication is configured.| +|mqtt|password|The password when authentication is configured.| ## Upload_Configuration After you modified the configuration to your setting, you can upload this to your device. - ```bash make upload-config ``` diff --git a/data/homie/config_.json b/data/homie/config_.json index c1b44e8..89dc4c4 100644 --- a/data/homie/config_.json +++ b/data/homie/config_.json @@ -1,14 +1,14 @@ { "wifi": { "ssid": "Ponyhof", - "password": "Tumalonga2411" + "password": "" }, "mqtt": { "host": "192.168.178.201", "port": 1886, "auth": true, "username": "sascha", - "password": "tumalonga2411" + "password": "" }, "name": "dev-device", "ota": { From 865e35ea00f17c1776e892917463545ea06c044f Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 14:24:46 +0200 Subject: [PATCH 30/99] Added Settings page Using Customized Styles starting webserver when maintaining the devies --- html/index.css | 135 ++++++------- html/index.htm | 192 +++++++++++++----- html/index.js | 127 +++++++++--- src/html/html_settings.h | 4 +- src/html/html_ui.h | 409 ++++++++++++++++++++++++++------------- src/main.cpp | 6 +- 6 files changed, 592 insertions(+), 281 deletions(-) diff --git a/html/index.css b/html/index.css index 2bb41ad..6fa42a1 100644 --- a/html/index.css +++ b/html/index.css @@ -1,65 +1,70 @@ -body { - font-family: Verdana, sans-serif; - background: rgb(212, 211, 124); - color: rgb(0, 0, 0); - line-height: 200%; /* %% because of AsyncWebServer */ - margin: 0; - } - - hr { - border-color: #666; - } - - .container{ - padding: 5px; - margin: 5px; - border: black solid; - border-radius: 5px; - background: rgb(214, 158, 46); - color: rgb(0, 0, 0); - } - button, .btn { - background: rgb(214, 158, 46); - color: #000; - font-family: Verdana, sans-serif; - border: 0.3ch solid #333; - display: inline-block; - font-size: 20px; - margin: 12px 8px 8px; - padding: 1px 6px; - cursor: pointer; - text-decoration: none; - } - - - - - - #toast { - opacity: 0; - background-color: #444; - border-radius: 5px; - bottom: 64px; - color: #fff; - font-size: 17px; - padding: 16px; - pointer-events: none; - position: fixed; - text-align: center; - z-index: 5; - transform: translateX(-50%%); /* %% because of AsyncWebServer */ - max-width: 90%%; /* %% because of AsyncWebServer */ - left: 50%%; /* %% because of AsyncWebServer */ - } - - #toast.show { - opacity: 1; - background-color: #264; - animation: fadein 0.5s, fadein 0.5s 2.5s reverse; - } - - #toast.error { - opacity: 1; - background-color: #b21; - animation: fadein 0.5s; - } \ No newline at end of file + +.container +{ + +} +html { + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + line-height: 1.5; +} +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}template{display:none}[hidden]{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit} +.border-b-4{border-bottom-width:4px} +.px-4{padding-left:1rem;padding-right:1rem} +.py-2{padding-top:.5rem;padding-bottom:.5rem} +.m-1{margin:.25rem} +.mt-2{margin-top:.5rem} +.p-3{padding:.75rem} +.p-1{padding:.25rem} +.mt-1{margin-top:.25rem} +.px-1{padding-left:.25rem;padding-right:.25rem} +.py-1{padding-top:.25rem;padding-bottom:.25rem} +.px-6{padding-left:1.5rem;padding-right:1.5rem} +.py-8{padding-top:2rem;padding-bottom:2rem} +.lg\:text-base{font-size:1rem} + +.h-5{height:1.25rem} +.w-auto{width:auto} +.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))} + +.grid { + display: grid; +} +.grid-cols-1{ + grid-template-columns:repeat(1,minmax(0,1fr)) +} +.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))} + +.font-bold{font-weight:700} + +.text-sm{font-size:.875rem} + + +.inline-flex{ + display:inline-flex; + +} .items-center{align-items:center} + +.text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))} + + +.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))} +.rounded-lg{border-radius:.5rem} +.shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)} +.border{border-width:1px} +.border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))} + +.bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))} + +.rounded-lg{border-radius:.5rem} +.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)} +.md\:text-xl{font-size:1.25rem} +.bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))} +.col-span-2{grid-column:span 2/span 2} + + +.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))} +:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))} + +border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))} +.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem} \ No newline at end of file diff --git a/html/index.htm b/html/index.htm index 0cebc9d..94f7bb4 100644 --- a/html/index.htm +++ b/html/index.htm @@ -8,75 +8,161 @@ Hive-Monitor - - + +
    +
    + + -
    Load Hive Monitor UI...
    - -
    -
    -

    Thank you for installing the Hivemonitor Software. 👍

    -

    You have enabled the Settings Mode. In this Webinterface you will be able to set your configs.

    -
    +
    + +
    +
    +

    Thank you ❤ for installing the Hivemonitor Software. 👍

    +

    You have enabled the Settings Mode. In this Webinterface you will be able to set your configs. +

    +
    -
    -

    You are here 👉

    -
    -
    -
    -
    - + -
    -
    + - - +
    + Settings + + + System + Sleeptime (in sec.) + VCC adjustment + + + Wifi + SSID + Password + Scale + + Weight Offset + Kilogram Divider + Calibration Temperature + Calibration Factor + + MQTT + Server + User + Password + Port + +
     
    + + +
    + + + + + - - -
    -
    + + \ No newline at end of file diff --git a/html/index.js b/html/index.js index 56ad459..77b03b6 100644 --- a/html/index.js +++ b/html/index.js @@ -14,11 +14,34 @@ function onLoad() { hideAllControls(); parseQuery(); setBreadCrumb(); - document.getElementById("cv").hidden = true; setInitialPage(); + setDisplay("cv", "none"); + GetSettings(); + } +function GetSettings() { + read("settings").then((data) => { + setTextBoxValue("system_sleeptime", data.system.sleeptime); + setTextBoxValue("system_vccadjustsetting", data.system.vccadjustsetting); + + setTextBoxValue("mqtt_server", data.mqtt.server); + setTextBoxValue("mqtt_user", data.mqtt.user); + setTextBoxValue("mqtt_password", data.mqtt.password); + setTextBoxValue("mqtt_port", data.mqtt.port); + + setTextBoxValue("scale_weightoffset", data.scale.weightoffset); + setTextBoxValue("scale_kilogramdivider", data.scale.kilogramdivider); + setTextBoxValue("scale_calibrationtemperaturesetting", data.scale.calibrationtemperaturesetting); + setTextBoxValue("scale_calibrationfactorsetting", data.scale.calibrationfactorSetting); + + setTextBoxValue("wireles_password", data.wireles.password); + setTextBoxValue("wireles_ssid", data.wireles.ssid); + + + }); +} function setInitialPage() { switch (ActualPage) { case "INDEX": @@ -46,8 +69,7 @@ function parseQuery() { function toggleIndex() { hideAllControls(); setDisplay("welcome", "block"); - setDisplay("btnbar", "block"); - + setDisplay("cSettings", "block"); } @@ -55,17 +77,21 @@ function hideAllControls() { setDisplay("cTareStep0", "none"); setDisplay("cTareStep1", "none"); setDisplay("cTareStep2", "none"); + setDisplay("cSettings", "none"); setDisplay("welcome", "none"); - setDisplay("btnbar", "none"); - - - - + setDisplay("cv", "none"); } + function setDisplay(control, state) { + var ct = document.getElementById(control); - ct.style.display = state; + if (state === "block") { + ct.style.display = ""; + } else { + ct.style.display = state; + } } + function toogleAutoTare() { ActualPage = "TARE"; hideAllControls(); @@ -76,7 +102,6 @@ function setControls() { hideAllControls(); setBreadCrumb(); setInitialPage(); - } function setBreadCrumb() { var pl = document.getElementById("pl"); @@ -97,21 +122,21 @@ function tareStep2() { sendData({}, "tarestep1").then((data) => { ActualPage = "TARE2"; setControls(); - }).catch(()=>{}); + }).catch(() => { }); } function startTare() { sendData({}, "tarestep0").then((data) => { ActualPage = "TARE1"; setControls(); - }).catch(()=>{}); + }).catch(() => { }); } function sendData(json, uri) { var prom = new Promise((resolve, reject) => { var req = new XMLHttpRequest(); - req.addEventListener('load', function () { showToastMessage("OK!"); resolve(this.responseText); }); - req.addEventListener('error', function (e) { showToastMessage(e.stack, true); reject(); }); + req.addEventListener('load', function () { showToastMessage("Settings saved!"); resolve(this.responseText); }); + req.addEventListener('error', function (e) { showToastMessage("Error while saving Settings!", true); reject(); }); req.open("POST", uri); req.setRequestHeader('Content-Type', 'application/json'); req.send(JSON.stringify(json)); @@ -120,14 +145,72 @@ function sendData(json, uri) { } +function read(uri) { + var prom = new Promise((resolve, reject) => { + var req = new XMLHttpRequest(); + req.addEventListener('error', function (e) { showToastMessage("Error while getting Data ", true); reject(); }); + req.open("GET", uri); + req.onload = function (data) { + resolve(data); + } + }) + return prom; +} + + var timeout; -function showToastMessage(text, error = false) { - if (error) d.getElementById('connind').style.backgroundColor = "#831"; - var x = d.getElementById("toast"); - x.innerHTML = text; - x.className = error ? "error" : "show"; + +function showToastMessage(text, error = true) { + var x = d.getElementById(error ? "toastErrorText" : "toastSuccessText"); + var container = d.getElementById(error ? "toastError" : "toastSuccess"); + + x.innerText = text; clearTimeout(timeout); - x.style.animation = 'none'; - x.style.animation = null; - timeout = setTimeout(function () { x.className = x.className.replace("show", ""); }, 2900); + + container.style.display = 'block'; + timeout = setTimeout(function () { container.style.display = "hidden"; }, 2900); +} + +function getTextBoxValue(id) { + return d.getElementById(id).value; +} + + +function getTextBoxNumberValue(id) { + var n = d.getElementById(id).value; + return parseFloat(n); +} + + +function setTextBoxValue(id, value) { + d.getElementById(id).value = value; +} + +function saveSettings() { + var objectData = { + system: { + sleeptime: getTextBoxNumberValue('system_sleeptime'), + vccadjustsetting: getTextBoxNumberValue('system_vccadjustsetting') + }, + mqtt: { + server: getTextBoxValue('mqtt_server'), + port: getTextBoxNumberValue('mqtt_port'), + user: getTextBoxValue('mqtt_user'), + password: getTextBoxValue('mqtt_password') + }, + scale: { + weightoffset: getTextBoxNumberValue('scale_weightoffset'), + kilogramdivider: getTextBoxNumberValue('scale_kilogramdivider'), + calibrationtemperaturesetting: getTextBoxNumberValue('scale_calibrationtemperaturesetting'), + calibrationfactorSetting: getTextBoxNumberValue('scale_calibrationfactorsetting') + }, + wireles: { + password: getTextBoxValue('wireles_password'), + ssid: getTextBoxValue('wireles_ssid') + } + } + sendData(objectData, "store").then((data) => { + ActualPage = "TARE2"; + setControls(); + }).catch(() => { }); } \ No newline at end of file diff --git a/src/html/html_settings.h b/src/html/html_settings.h index 95bd03f..ee90eec 100644 --- a/src/html/html_settings.h +++ b/src/html/html_settings.h @@ -3,7 +3,7 @@ * This file is auto generated, please don't make any changes manually. */ - // Autogenerated from data/html/settings_tare.htm, do not edit!! + // Autogenerated from html/settings_tare.htm, do not edit!! const char PAGE_settings_tare[] PROGMEM = R"=====(Tare Weight \ No newline at end of file diff --git a/src/html/html_ui.h b/src/html/html_ui.h index bc5b39f..06c9c9f 100644 --- a/src/html/html_ui.h +++ b/src/html/html_ui.h @@ -4,280 +4,276 @@ */ // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4354; + const uint16_t PAGE_index_L = 4296; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xed, 0x3b, 0xed, 0x72, 0xdb, 0x48, - 0x72, 0xff, 0xf9, 0x14, 0x63, 0xb8, 0xb2, 0x47, 0xa6, 0x06, 0x10, 0x41, 0x51, 0x92, 0x05, 0x89, - 0x4a, 0xd9, 0xb2, 0x77, 0xed, 0x8b, 0xed, 0xf5, 0x59, 0xda, 0xdb, 0xbb, 0xba, 0x6c, 0x6d, 0x0d, - 0x81, 0x21, 0x89, 0x15, 0xbe, 0x16, 0x18, 0x88, 0xe2, 0xa2, 0xf8, 0x08, 0xf9, 0x91, 0x07, 0x48, - 0xe5, 0x4f, 0x9e, 0x2c, 0x4f, 0x90, 0x47, 0x48, 0xf7, 0xcc, 0xe0, 0x8b, 0x04, 0x68, 0x39, 0x76, - 0xb2, 0x55, 0xa9, 0xdc, 0x9e, 0x48, 0x62, 0xa6, 0xbb, 0xa7, 0xbf, 0xbb, 0x67, 0x06, 0xbe, 0x7c, - 0xf2, 0xf2, 0xfb, 0xeb, 0xdb, 0xbf, 0x7e, 0x78, 0x45, 0x56, 0x22, 0x0c, 0xae, 0xc8, 0x25, 0x7e, - 0x91, 0x80, 0x45, 0xcb, 0x99, 0xc1, 0x23, 0x03, 0x07, 0x38, 0xf3, 0xe0, 0x2b, 0xe4, 0x82, 0x91, - 0x88, 0x85, 0x7c, 0x66, 0xdc, 0xfb, 0x7c, 0x9d, 0xc4, 0xa9, 0x30, 0xc8, 0xc0, 0x8d, 0x23, 0xc1, - 0x23, 0x31, 0x33, 0xd6, 0xbe, 0x27, 0x56, 0x33, 0x8f, 0xdf, 0xfb, 0x2e, 0x37, 0xe5, 0x03, 0xf5, - 0x23, 0x5f, 0xf8, 0x2c, 0x30, 0x33, 0x97, 0x05, 0x7c, 0x66, 0xd3, 0x10, 0x06, 0xc2, 0x3c, 0x2c, - 0x9f, 0x8d, 0x92, 0xe8, 0xc0, 0x5d, 0xb1, 0x34, 0xe3, 0x40, 0x24, 0x17, 0x0b, 0xf3, 0x99, 0xd1, - 0x5e, 0x4c, 0xac, 0x78, 0xc8, 0x4d, 0x37, 0x0e, 0xe2, 0xd4, 0x20, 0xd5, 0x72, 0x4f, 0x27, 0xf2, - 0x7f, 0x0d, 0x1a, 0xe5, 0xcc, 0x86, 0x67, 0x86, 0x46, 0x65, 0x49, 0x12, 0x70, 0x33, 0x8c, 0xe7, - 0x3e, 0x7c, 0xad, 0xf9, 0xdc, 0x84, 0x01, 0xd3, 0x65, 0x09, 0x9b, 0x07, 0x1c, 0x31, 0x85, 0x2f, - 0x02, 0x7e, 0xf5, 0xda, 0xbf, 0xe7, 0xe6, 0xbb, 0x18, 0x98, 0x8d, 0xd3, 0xcb, 0x23, 0x35, 0x46, - 0x06, 0x97, 0x99, 0x9b, 0xfa, 0x89, 0xb8, 0x1a, 0xdc, 0xb3, 0x94, 0x08, 0x3f, 0xe4, 0x71, 0x2e, - 0xe8, 0x73, 0x57, 0xe4, 0x2c, 0xf8, 0xc0, 0x96, 0x40, 0xfc, 0xcd, 0xfb, 0x97, 0xaf, 0xfe, 0x62, - 0x50, 0x77, 0xb1, 0x9c, 0x15, 0x92, 0x47, 0xa7, 0x98, 0xb3, 0x8c, 0x3b, 0x86, 0xc7, 0xd2, 0x3b, - 0x83, 0xce, 0x97, 0x4e, 0x91, 0xa7, 0x81, 0x63, 0x18, 0x5b, 0xca, 0x82, 0x64, 0xc5, 0x60, 0x7a, - 0xe9, 0x58, 0xa7, 0x54, 0xb0, 0xb9, 0x63, 0x3d, 0xdb, 0x52, 0x29, 0x91, 0x1c, 0x04, 0x10, 0x7c, - 0x0c, 0x13, 0xa7, 0x90, 0x83, 0x99, 0x53, 0x24, 0xbe, 0x7b, 0xc7, 0x53, 0xe7, 0xc9, 0x98, 0xa6, - 0xcb, 0xb9, 0xf3, 0xc4, 0xa6, 0xbf, 0xe6, 0x30, 0x82, 0xcf, 0x2b, 0xfe, 0x00, 0xcf, 0x5b, 0x1a, - 0xb0, 0x39, 0x0f, 0x32, 0x1c, 0x49, 0xdc, 0x70, 0x1e, 0x0b, 0x04, 0x4a, 0x7c, 0x0f, 0x07, 0x32, - 0xbe, 0x0c, 0x78, 0x84, 0x03, 0x6e, 0x26, 0x21, 0x56, 0x1e, 0xdb, 0x64, 0x88, 0xb5, 0xa5, 0xde, - 0xcc, 0x8b, 0xdd, 0x3c, 0x04, 0x4d, 0x5d, 0x2c, 0xf2, 0xc8, 0x15, 0x7e, 0x1c, 0x91, 0x38, 0x7a, - 0x1b, 0x33, 0x6f, 0x38, 0x2a, 0x56, 0xbe, 0xc7, 0x9f, 0x07, 0xc1, 0x35, 0xa8, 0x32, 0x8d, 0x83, - 0x6c, 0x38, 0xa2, 0x09, 0x1a, 0xe6, 0x4f, 0x39, 0x4f, 0x37, 0xf0, 0x00, 0x26, 0x7a, 0x91, 0x82, - 0x33, 0x5c, 0xa7, 0x79, 0x38, 0x57, 0xcf, 0x6f, 0x94, 0x89, 0x51, 0x23, 0x6a, 0xe0, 0xa5, 0x9f, - 0x25, 0x01, 0xdb, 0x0c, 0x0d, 0xf7, 0xde, 0xa0, 0x46, 0x14, 0x47, 0xdc, 0x18, 0xd1, 0xef, 0xb8, - 0xb8, 0xe1, 0x42, 0xf8, 0xd1, 0x12, 0x68, 0x6e, 0xab, 0x75, 0x5b, 0xc3, 0x05, 0x52, 0x1e, 0x1a, - 0x99, 0x1e, 0x30, 0x46, 0x16, 0x28, 0x35, 0x1a, 0xf2, 0xd9, 0x55, 0x01, 0x63, 0xb7, 0xfc, 0x41, - 0xbc, 0x88, 0x1f, 0xfe, 0xcc, 0x82, 0x9c, 0x03, 0xd0, 0x26, 0x13, 0x3c, 0xfc, 0x39, 0x0b, 0x38, - 0x4f, 0xd0, 0x34, 0x06, 0xe5, 0x96, 0x1a, 0xb3, 0xaa, 0x31, 0xc9, 0x4d, 0x27, 0xda, 0xbd, 0xeb, - 0x32, 0xef, 0x97, 0x3c, 0x13, 0x7a, 0xad, 0x06, 0xf6, 0xee, 0x54, 0x07, 0x91, 0xf0, 0x57, 0x21, - 0x7e, 0xce, 0x78, 0x7a, 0xcf, 0x53, 0x44, 0xc4, 0x47, 0x4b, 0x3d, 0xf6, 0x01, 0xe7, 0x59, 0x03, - 0x14, 0x1f, 0xfa, 0x00, 0x13, 0x96, 0x65, 0xeb, 0x38, 0xf5, 0x2a, 0xe0, 0x72, 0xa0, 0x17, 0x01, - 0x63, 0xb0, 0x02, 0x86, 0x87, 0x2e, 0xa1, 0x31, 0xd8, 0x7e, 0x5e, 0x73, 0x7f, 0xb9, 0x12, 0xf1, - 0x62, 0x01, 0xf3, 0x52, 0x5e, 0x1c, 0xb5, 0x9a, 0xa3, 0xbd, 0xa8, 0x77, 0x7e, 0x10, 0x2f, 0x53, - 0x16, 0x7a, 0xfe, 0x3d, 0xb8, 0x47, 0x5a, 0x63, 0xef, 0x4c, 0xf4, 0x12, 0x80, 0x0f, 0x7f, 0x9e, - 0x32, 0x34, 0x39, 0xe8, 0x38, 0xe1, 0xf0, 0x33, 0x4f, 0x79, 0x53, 0xf9, 0x92, 0xdc, 0x41, 0xb0, - 0xc7, 0x10, 0x5f, 0x30, 0x17, 0x22, 0xf8, 0x10, 0x5d, 0x05, 0x71, 0xd3, 0x4b, 0x72, 0xed, 0xa7, - 0x3c, 0xe0, 0x59, 0xcb, 0x10, 0x7a, 0xec, 0x90, 0x2d, 0x4a, 0xb4, 0x2c, 0xf3, 0x5b, 0x28, 0xf8, - 0x3c, 0xda, 0x36, 0x1c, 0x7e, 0x37, 0x60, 0x8a, 0x6c, 0xed, 0x0b, 0x77, 0x35, 0xac, 0xd3, 0xca, - 0xa8, 0x70, 0x21, 0x87, 0xe8, 0xdc, 0xe2, 0x88, 0x78, 0x09, 0x91, 0xfc, 0x26, 0xf2, 0xf8, 0xc3, - 0x70, 0x74, 0x31, 0x87, 0x08, 0xb9, 0xbb, 0x90, 0xf3, 0xb7, 0xcf, 0x3f, 0xbe, 0xc2, 0xe9, 0x18, - 0xa6, 0x9f, 0xe7, 0x22, 0xbe, 0x65, 0x29, 0xdf, 0x87, 0xb0, 0x0d, 0xa7, 0x15, 0x91, 0x08, 0x75, - 0x23, 0x78, 0x62, 0x43, 0x64, 0xce, 0x83, 0xd8, 0xbd, 0x33, 0xf6, 0x50, 0x26, 0x3d, 0x28, 0x93, - 0x1a, 0x65, 0x5b, 0xcb, 0xd3, 0xcc, 0x0e, 0x05, 0xe6, 0x49, 0x3e, 0x8b, 0xf8, 0x9a, 0xfc, 0xf0, - 0xf1, 0xed, 0x0d, 0x67, 0xa9, 0xbb, 0xfa, 0xc0, 0xc0, 0x3d, 0xb2, 0x61, 0x99, 0x71, 0x2c, 0x20, - 0x20, 0xed, 0x00, 0x01, 0x83, 0xd3, 0xa3, 0x8b, 0x28, 0x0f, 0x82, 0xd9, 0xac, 0x21, 0xff, 0x8c, - 0x5b, 0x4b, 0x2e, 0x86, 0x46, 0x02, 0xbf, 0x8d, 0xd1, 0xe8, 0x9b, 0x6f, 0x86, 0xfb, 0x29, 0xb7, - 0xa1, 0xd0, 0x96, 0x82, 0x3a, 0xd2, 0x57, 0x53, 0x96, 0x35, 0x0f, 0x20, 0xc7, 0xf2, 0x5a, 0x90, - 0x76, 0xba, 0x2a, 0x33, 0x51, 0x43, 0xd0, 0x6a, 0x99, 0x3d, 0xc2, 0x45, 0xa7, 0x92, 0xc6, 0x75, - 0xc6, 0xeb, 0xd5, 0xfb, 0xa1, 0xf9, 0x49, 0xcf, 0x7c, 0x83, 0xb5, 0x8e, 0xe9, 0x5a, 0xae, 0x2e, - 0xdc, 0x3a, 0x0b, 0xb7, 0xdc, 0xb0, 0x04, 0xe0, 0x54, 0x28, 0xcb, 0x65, 0x55, 0x5d, 0x40, 0x03, - 0xbc, 0x0a, 0x38, 0xfe, 0x7c, 0xb1, 0x79, 0xe3, 0x0d, 0xf9, 0xe8, 0x02, 0x5c, 0x59, 0x6c, 0x20, - 0x94, 0x3c, 0x85, 0x35, 0xd3, 0x1a, 0x9a, 0xcd, 0x66, 0xe2, 0x1f, 0x0c, 0xf0, 0xc3, 0xa6, 0x41, - 0xda, 0x2e, 0x59, 0x34, 0xcd, 0x27, 0xbd, 0x96, 0x1e, 0xb6, 0x52, 0x4b, 0x99, 0x7b, 0x86, 0x00, - 0xc8, 0x86, 0x11, 0x3a, 0x29, 0x1d, 0xac, 0x50, 0x2d, 0x4a, 0x4d, 0x48, 0xed, 0xbd, 0x7d, 0x3a, - 0x30, 0x92, 0x00, 0x62, 0xe5, 0x13, 0xd1, 0xca, 0x2d, 0x3f, 0x8a, 0x78, 0x8a, 0xb9, 0x61, 0x66, - 0xdc, 0x08, 0x06, 0xb9, 0x79, 0x3f, 0x66, 0x9b, 0xc1, 0xd9, 0x8c, 0xba, 0x16, 0x32, 0xea, 0x80, - 0xdc, 0x60, 0xf6, 0x32, 0x1a, 0xd1, 0x26, 0x4a, 0x37, 0x91, 0xfe, 0x17, 0x79, 0x2f, 0x99, 0x60, - 0xc3, 0x62, 0x4b, 0x0d, 0x9c, 0xc8, 0xa4, 0x7f, 0x35, 0x8a, 0xe6, 0xae, 0xe2, 0xc1, 0xb9, 0x5a, - 0xda, 0xdb, 0x8e, 0x20, 0x33, 0xa2, 0x38, 0xc3, 0x11, 0x40, 0xb7, 0xb2, 0x14, 0xb2, 0xae, 0xcd, - 0xd7, 0xb9, 0xce, 0xf8, 0xd0, 0x3a, 0xf6, 0xe3, 0xd7, 0x29, 0x69, 0x4b, 0x27, 0x4c, 0x39, 0xa4, - 0xfb, 0x88, 0x60, 0xfe, 0xf8, 0x90, 0xc6, 0xa1, 0x9f, 0xf1, 0xe1, 0x30, 0xa3, 0x0c, 0x91, 0xd0, - 0x36, 0xb1, 0xcc, 0x2c, 0x7f, 0x79, 0xf7, 0xf6, 0xb5, 0x10, 0xc9, 0x47, 0xfe, 0x6b, 0x0e, 0x9c, - 0x5c, 0xc4, 0x16, 0xf3, 0xbc, 0x57, 0xf7, 0x60, 0xa5, 0xb7, 0x3e, 0x30, 0x06, 0xfa, 0x1b, 0x1a, - 0x01, 0xb4, 0x32, 0x06, 0x1d, 0x96, 0xab, 0xa0, 0x0c, 0xab, 0x78, 0x7d, 0x1b, 0xb3, 0x4c, 0xbc, - 0xe3, 0x59, 0x86, 0x6e, 0x60, 0x94, 0x01, 0x45, 0x32, 0x76, 0xcf, 0xbd, 0x27, 0x18, 0x33, 0x43, - 0xb1, 0xf2, 0x33, 0x0b, 0xe4, 0x4b, 0xe2, 0x28, 0xe3, 0x68, 0x06, 0xe0, 0x7c, 0x44, 0xbb, 0x56, - 0xe0, 0x69, 0x0a, 0xad, 0x68, 0x63, 0x09, 0xde, 0xb5, 0xc6, 0x2b, 0x84, 0x22, 0xeb, 0x15, 0xb4, - 0x9e, 0xb8, 0x0c, 0x2c, 0x47, 0xca, 0x65, 0x9f, 0x18, 0xf4, 0xc9, 0x78, 0x44, 0xd9, 0x50, 0x2f, - 0x11, 0x27, 0xa0, 0x4b, 0xe3, 0xc3, 0xf7, 0x37, 0xb7, 0x06, 0x68, 0x02, 0x06, 0x40, 0x81, 0x5a, - 0xc4, 0xd7, 0xe0, 0xa2, 0xb8, 0xe6, 0xb5, 0xea, 0x6e, 0xcd, 0xdb, 0x4d, 0x82, 0x91, 0x8e, 0x8d, - 0xad, 0xaf, 0x72, 0xe9, 0xd1, 0x2f, 0x59, 0x1c, 0x19, 0x0a, 0x2b, 0xf2, 0x86, 0x7f, 0xbc, 0xf9, - 0xfe, 0x3d, 0x44, 0x6b, 0x0a, 0xeb, 0xf8, 0x0b, 0x88, 0xef, 0x51, 0xab, 0x00, 0xc9, 0x1e, 0x8b, - 0x77, 0x2b, 0x5b, 0xd0, 0xac, 0x54, 0x36, 0xeb, 0x52, 0x36, 0xfb, 0x2a, 0xaa, 0x58, 0x2a, 0x1d, - 0x10, 0x34, 0x3c, 0x51, 0x7a, 0xc8, 0x94, 0x1e, 0x98, 0xd6, 0xc3, 0x77, 0xaf, 0x40, 0x0d, 0x5c, - 0x3e, 0x47, 0x68, 0xcc, 0x59, 0x93, 0xb8, 0x80, 0x8f, 0x6d, 0xcb, 0x89, 0x76, 0x57, 0x03, 0x67, - 0x9a, 0x01, 0xd5, 0x32, 0xa9, 0xed, 0x46, 0x32, 0x24, 0x2c, 0x81, 0xe0, 0x92, 0x27, 0x34, 0xb3, - 0xe1, 0xa8, 0x81, 0x9b, 0xdc, 0x75, 0x81, 0x84, 0x1c, 0x82, 0xc5, 0x3f, 0x81, 0xb9, 0x83, 0x85, - 0xc9, 0xa1, 0x11, 0xc0, 0x9c, 0xba, 0x01, 0x54, 0xb8, 0x5b, 0xb5, 0x6b, 0x18, 0xea, 0xdd, 0x03, - 0x8a, 0xd4, 0x99, 0x47, 0xa9, 0x06, 0x98, 0x61, 0x67, 0xa1, 0x71, 0x9a, 0x0e, 0xbc, 0x87, 0x06, - 0x89, 0xcf, 0x83, 0xbd, 0xd9, 0x76, 0x44, 0x27, 0xe7, 0xe3, 0x71, 0x43, 0x1b, 0xcb, 0x9d, 0xd6, - 0xa4, 0x36, 0xb5, 0xb7, 0x9f, 0xd6, 0xad, 0x7b, 0x84, 0xe9, 0x42, 0x7e, 0x0f, 0x39, 0x91, 0xa7, - 0x15, 0x09, 0xb9, 0x03, 0x9a, 0xf5, 0x52, 0xb8, 0xd0, 0x4b, 0xc8, 0x6e, 0xe0, 0x5b, 0x30, 0x19, - 0x48, 0xdc, 0xce, 0xb4, 0x6d, 0x9e, 0x30, 0xda, 0x7b, 0x89, 0xcd, 0x1a, 0xc5, 0x04, 0xa3, 0xb3, - 0xb1, 0x41, 0xa8, 0x73, 0x91, 0xea, 0xd6, 0x9d, 0xa2, 0x6a, 0xf6, 0x9d, 0x6e, 0xde, 0xf7, 0x37, - 0x0a, 0x23, 0xba, 0xdb, 0xe2, 0x7f, 0x02, 0x75, 0x6f, 0xb3, 0x30, 0xda, 0x52, 0x6c, 0xb7, 0x61, - 0x71, 0xd9, 0xf4, 0x3b, 0xcb, 0x43, 0x1b, 0x04, 0xd8, 0x40, 0x41, 0x57, 0xde, 0xb7, 0x44, 0xdd, - 0xc3, 0x8f, 0x28, 0xee, 0x0b, 0x7a, 0x68, 0xc9, 0xfd, 0x03, 0x6e, 0xc5, 0x54, 0x03, 0xda, 0x03, - 0x55, 0xf5, 0xac, 0xc0, 0xa0, 0x6c, 0x7c, 0x9d, 0xa2, 0xd9, 0xde, 0xf7, 0x8a, 0xb9, 0xbf, 0x3d, - 0x18, 0xd1, 0x9d, 0xce, 0xfe, 0x30, 0xee, 0xee, 0xfe, 0x60, 0x44, 0x0f, 0x76, 0xf2, 0x87, 0x89, - 0x1d, 0xde, 0x2b, 0xb4, 0x48, 0xb7, 0x9a, 0xf9, 0x47, 0x53, 0x6d, 0x6f, 0x12, 0x40, 0x57, 0xba, - 0x59, 0x87, 0x2d, 0x77, 0xaf, 0x7e, 0xf7, 0xb6, 0x05, 0x90, 0xb3, 0xa0, 0xb5, 0xef, 0x07, 0x94, - 0x1b, 0x01, 0xc8, 0x53, 0xd4, 0xc8, 0x60, 0x31, 0xfe, 0x45, 0x65, 0x79, 0x70, 0x79, 0xa4, 0x4f, - 0x22, 0xc8, 0xa5, 0x4c, 0x03, 0x57, 0x03, 0x3c, 0xa1, 0x29, 0x16, 0x80, 0x62, 0x2e, 0x58, 0xe8, - 0x07, 0x1b, 0x47, 0xf9, 0xaa, 0x99, 0xfb, 0xd4, 0x54, 0x47, 0x1e, 0x6a, 0x80, 0xbe, 0x08, 0xfc, - 0xe8, 0xee, 0x1d, 0x73, 0x6f, 0xe4, 0xe3, 0xb7, 0x80, 0x41, 0xa1, 0xf6, 0x2d, 0x63, 0x4e, 0x7e, - 0x78, 0x63, 0xd0, 0x8f, 0xf1, 0x3c, 0x16, 0x31, 0x35, 0x5e, 0xf3, 0xe0, 0x9e, 0x0b, 0x28, 0x27, - 0xe4, 0x3d, 0xcf, 0xa1, 0xba, 0x3c, 0x4f, 0xa1, 0x5f, 0xa2, 0xc6, 0x7b, 0x98, 0x24, 0x37, 0x2c, - 0x82, 0xb6, 0x33, 0x83, 0x4f, 0x13, 0xbc, 0xd0, 0x5f, 0x50, 0xe3, 0x39, 0x2e, 0x40, 0xae, 0xf1, - 0x9c, 0x82, 0xbc, 0x0a, 0xe3, 0x5f, 0x7c, 0xa3, 0xa6, 0xb9, 0x3f, 0x70, 0xb3, 0x09, 0xe7, 0x71, - 0x60, 0x68, 0x6a, 0x4d, 0xac, 0x0b, 0xe0, 0x8d, 0x9b, 0x2b, 0xe9, 0x78, 0x8e, 0x6d, 0x9d, 0x6c, - 0xe7, 0xb9, 0x10, 0x71, 0x44, 0xfd, 0x28, 0xc9, 0x05, 0x8d, 0x13, 0xb1, 0x4c, 0xe3, 0x3c, 0x01, - 0xe5, 0x04, 0xdc, 0x15, 0x54, 0x80, 0x9e, 0xa1, 0xfb, 0x60, 0x2d, 0xb1, 0xfd, 0x68, 0x05, 0x3c, - 0x89, 0x0b, 0x39, 0x96, 0xf9, 0xbf, 0x71, 0xc7, 0x1e, 0x8f, 0xff, 0x6e, 0x87, 0xb0, 0x7d, 0x72, - 0x11, 0xb2, 0x74, 0xe9, 0x47, 0xce, 0xb8, 0xb5, 0x44, 0x11, 0x43, 0x80, 0x2e, 0x82, 0x78, 0xed, - 0xdc, 0xfb, 0x99, 0x3f, 0x0f, 0x78, 0x39, 0xab, 0x56, 0x2c, 0x70, 0x45, 0x53, 0xa4, 0x20, 0xf9, - 0x22, 0x4e, 0x43, 0x07, 0x7b, 0xe8, 0xed, 0xdf, 0x04, 0x94, 0xdf, 0x99, 0x82, 0xfb, 0x89, 0xaa, - 0x27, 0xe9, 0x9d, 0xe5, 0x43, 0x96, 0xcf, 0x43, 0x1f, 0x9e, 0x14, 0x48, 0x81, 0x67, 0x4e, 0x77, - 0xbe, 0x40, 0xa3, 0x40, 0x39, 0x60, 0x91, 0xcb, 0x1d, 0x35, 0xd3, 0xa6, 0xe4, 0x38, 0x66, 0x18, - 0xff, 0x66, 0x2e, 0xa0, 0xf9, 0xcc, 0x4c, 0x59, 0x45, 0x5a, 0xb4, 0x7b, 0xa7, 0xf5, 0x6a, 0x1d, - 0xf3, 0x8a, 0xf0, 0xfe, 0x44, 0x31, 0x07, 0xf7, 0xe5, 0xa9, 0x29, 0x1d, 0x49, 0xca, 0x74, 0x91, - 0x40, 0x55, 0xc7, 0x00, 0x1a, 0xef, 0xf0, 0x54, 0xa3, 0x62, 0x2f, 0xd1, 0x66, 0xa8, 0x73, 0xae, - 0xe4, 0x66, 0x67, 0x52, 0xb3, 0xd2, 0x1e, 0x2d, 0xa0, 0xc4, 0xa1, 0x99, 0x1c, 0x3b, 0x79, 0x20, - 0x5e, 0x2c, 0x04, 0xf7, 0xc8, 0x0b, 0x09, 0x88, 0x01, 0xb5, 0x5d, 0xf8, 0x3c, 0xf0, 0x60, 0xa5, - 0xa2, 0x64, 0xce, 0x3a, 0x3e, 0xe1, 0x21, 0xb1, 0xce, 0xe4, 0xe7, 0xe9, 0x04, 0xbe, 0xb6, 0x01, - 0x5f, 0x42, 0x3d, 0x00, 0x81, 0x1e, 0xd0, 0xf4, 0x08, 0xa4, 0x65, 0x83, 0x91, 0x0b, 0x75, 0xb6, - 0x56, 0xfa, 0x87, 0xae, 0x9b, 0x8e, 0xc0, 0x73, 0x3f, 0xf0, 0x86, 0x07, 0x75, 0x3e, 0xa9, 0xbc, - 0xa5, 0x92, 0xff, 0x02, 0x1a, 0x14, 0x01, 0xa1, 0x93, 0x30, 0x17, 0x55, 0x93, 0x86, 0x2c, 0xd8, - 0x26, 0x29, 0xa4, 0x36, 0xa8, 0xef, 0x05, 0xf8, 0x0a, 0x46, 0x48, 0x60, 0x42, 0x26, 0x59, 0x46, - 0x0e, 0x1e, 0xf4, 0x21, 0xff, 0xdb, 0xca, 0x2f, 0x2b, 0x6f, 0x62, 0xb0, 0xf7, 0xd1, 0xaa, 0x74, - 0x57, 0xdc, 0xbd, 0x03, 0x76, 0x2a, 0x57, 0x61, 0x9e, 0x1f, 0xff, 0xd4, 0xc3, 0xf2, 0xae, 0x1d, - 0x22, 0x99, 0xc6, 0xd0, 0xb8, 0xda, 0x89, 0xa4, 0x01, 0x81, 0x3d, 0x3f, 0x32, 0xb5, 0xa7, 0xf6, - 0x00, 0x82, 0x6e, 0xdb, 0x80, 0x85, 0x0e, 0x86, 0x06, 0x6b, 0x6a, 0x03, 0xfe, 0x53, 0x97, 0x87, - 0xa2, 0x48, 0xd2, 0x00, 0x17, 0xda, 0x48, 0xa6, 0xae, 0x20, 0xe6, 0x24, 0x79, 0x68, 0xa3, 0xd7, - 0x6b, 0xaa, 0x01, 0xd3, 0xe3, 0x6e, 0xac, 0xf2, 0x6c, 0x17, 0x65, 0x19, 0x43, 0x35, 0xce, 0x02, - 0x4f, 0x65, 0xf3, 0x04, 0x7b, 0x3c, 0xf3, 0x53, 0x01, 0x23, 0x63, 0xbc, 0x34, 0xe8, 0xd6, 0xe3, - 0x82, 0xf9, 0x41, 0x56, 0x94, 0x86, 0x95, 0x6d, 0xd4, 0x36, 0xcb, 0x43, 0x88, 0xf4, 0x4d, 0x35, - 0x1a, 0x40, 0x9b, 0x6a, 0x82, 0x49, 0xc3, 0x2d, 0x96, 0x92, 0x80, 0x09, 0x5e, 0x4d, 0xa9, 0x68, - 0x56, 0x6d, 0xd4, 0x4f, 0xed, 0x51, 0x49, 0xeb, 0xd7, 0x3c, 0x16, 0x9c, 0x7a, 0x1e, 0xf5, 0x02, - 0xba, 0xf0, 0x97, 0x50, 0x82, 0xe8, 0xca, 0xa6, 0xab, 0x09, 0x5d, 0x1d, 0xd3, 0xd5, 0x94, 0xae, - 0x4e, 0xe8, 0xea, 0x94, 0xae, 0x52, 0x9a, 0xd0, 0x24, 0xe5, 0xc5, 0x4e, 0x7e, 0x29, 0xe6, 0xcc, - 0xbd, 0xc3, 0xec, 0x15, 0x79, 0xea, 0xd8, 0xda, 0x91, 0x69, 0x04, 0xda, 0x23, 0x3c, 0x75, 0x6d, - 0x4c, 0xfa, 0x21, 0x94, 0x01, 0xbd, 0xaa, 0x8a, 0x12, 0x19, 0x20, 0x1d, 0xc1, 0x51, 0x9a, 0xc2, - 0x39, 0x81, 0x21, 0x34, 0x23, 0xa9, 0x94, 0x28, 0x83, 0x1b, 0x63, 0x4a, 0xad, 0x55, 0xc7, 0x4e, - 0xc9, 0x55, 0xc3, 0xb3, 0xe2, 0x80, 0xe6, 0x41, 0x21, 0xf5, 0xd2, 0xc8, 0x00, 0x1d, 0x80, 0xff, - 0x37, 0x2b, 0xcc, 0xdf, 0x53, 0xc7, 0x61, 0x0b, 0x08, 0x0e, 0xf8, 0x9e, 0x73, 0x48, 0xeb, 0xbc, - 0x27, 0x16, 0xf5, 0x4f, 0x95, 0x25, 0xc6, 0x17, 0xad, 0xa4, 0x99, 0xc5, 0x81, 0xef, 0x95, 0x43, - 0xca, 0xbc, 0x4f, 0xf9, 0x84, 0x3f, 0x5b, 0x80, 0xd6, 0xaa, 0xfc, 0x2a, 0xe2, 0xa4, 0xcc, 0x31, - 0x10, 0x33, 0x7e, 0xb8, 0x2c, 0xf6, 0x69, 0xd4, 0xb9, 0x03, 0x32, 0x0c, 0x16, 0xaf, 0x32, 0xc7, - 0x6c, 0x65, 0x7d, 0x82, 0x8c, 0x89, 0x49, 0x1b, 0x7e, 0x99, 0xe0, 0x9c, 0x2e, 0x5f, 0xc5, 0x01, - 0x10, 0xa8, 0x0a, 0x61, 0xf7, 0x74, 0xa1, 0x19, 0x62, 0x63, 0xc6, 0xdd, 0xb1, 0x26, 0xf4, 0x29, - 0x4a, 0x9f, 0x43, 0xaa, 0x9b, 0x40, 0x3f, 0xda, 0xdf, 0xa0, 0xab, 0xa9, 0x2b, 0xa6, 0x8e, 0x0f, - 0x37, 0x4f, 0x33, 0x80, 0x49, 0x62, 0x1f, 0x9a, 0xbc, 0x74, 0x2b, 0xd3, 0x72, 0x51, 0x6b, 0x34, - 0x60, 0x49, 0xc6, 0x9d, 0xf2, 0xc7, 0x76, 0x2f, 0xf0, 0x8a, 0xba, 0xde, 0xb7, 0x3a, 0x00, 0xd5, - 0xc4, 0x56, 0x49, 0xc2, 0x2a, 0x0d, 0x6a, 0x4e, 0x8b, 0xca, 0xb6, 0xb0, 0x7e, 0xa8, 0x2d, 0x33, - 0x05, 0xcb, 0x58, 0xc9, 0x03, 0xcc, 0x6a, 0xbf, 0x37, 0x03, 0xbe, 0x00, 0x47, 0x49, 0x79, 0x58, - 0x46, 0x02, 0xc4, 0x95, 0xf4, 0x1d, 0x18, 0x02, 0xd0, 0x8d, 0x39, 0xa9, 0x40, 0xc1, 0xc0, 0x8e, - 0x75, 0xd2, 0x04, 0x55, 0xb4, 0xd5, 0xe0, 0xd6, 0x0a, 0x4d, 0xbb, 0x0c, 0x40, 0x6b, 0xa2, 0x87, - 0x04, 0xe0, 0xab, 0xb1, 0x1a, 0x1d, 0xc8, 0x9a, 0xc7, 0x75, 0x99, 0x3b, 0x2b, 0xc7, 0xec, 0x7a, - 0xac, 0x46, 0xb7, 0x5b, 0xe8, 0x7a, 0x1c, 0x24, 0xb0, 0xdb, 0x12, 0xa8, 0x99, 0x1d, 0x19, 0x2a, - 0xf0, 0x4d, 0x03, 0xbc, 0xa6, 0xb3, 0x27, 0x46, 0x4d, 0xfd, 0x74, 0x47, 0x3f, 0x56, 0x07, 0x75, - 0xdb, 0xaa, 0xa8, 0x3f, 0x6b, 0x51, 0x9f, 0x74, 0xd0, 0x9e, 0x48, 0xd0, 0x60, 0xf9, 0x4f, 0xb2, - 0xd4, 0x98, 0x58, 0x4b, 0x1b, 0x26, 0x55, 0xca, 0x5e, 0x99, 0x27, 0x45, 0x15, 0xb9, 0x9a, 0x97, - 0xb5, 0x89, 0x99, 0xaf, 0x50, 0xd6, 0x93, 0xb5, 0xcc, 0x92, 0x04, 0x60, 0xf3, 0xb1, 0x31, 0xa7, - 0xe3, 0x71, 0x61, 0x9a, 0xf2, 0x39, 0x86, 0x0a, 0xee, 0x8b, 0x8d, 0x63, 0xeb, 0x36, 0xe0, 0xa9, - 0x3b, 0xf7, 0x4e, 0xf8, 0x58, 0x3f, 0xa5, 0xcb, 0x39, 0x1b, 0x4e, 0xc6, 0xc7, 0x74, 0x62, 0xc3, - 0xdf, 0x64, 0x4a, 0x61, 0x77, 0x3b, 0x6c, 0x63, 0x8e, 0x46, 0x5b, 0x6b, 0x99, 0xfa, 0x5e, 0x55, - 0x18, 0xf0, 0x41, 0x0d, 0xa1, 0x7f, 0x66, 0xa0, 0x41, 0xf9, 0xbb, 0x2c, 0x2b, 0x38, 0x98, 0x87, - 0x51, 0xe6, 0xa4, 0x1c, 0xca, 0x96, 0x18, 0xca, 0x9b, 0x4e, 0x68, 0x33, 0x86, 0x63, 0x6a, 0x2f, - 0xd2, 0x92, 0x9a, 0x42, 0x9d, 0x1c, 0x46, 0x9d, 0xec, 0xa1, 0x4a, 0xcd, 0x40, 0x86, 0xf3, 0x8a, - 0xa6, 0x93, 0x9f, 0x8d, 0xc7, 0x5a, 0xfa, 0x2c, 0x6c, 0x28, 0xcf, 0x7a, 0xa6, 0x3d, 0xc8, 0x8f, - 0x64, 0xf2, 0x5b, 0x04, 0xfc, 0xa1, 0x92, 0xa2, 0x31, 0x06, 0x00, 0xc0, 0x41, 0x66, 0xba, 0x1c, - 0x23, 0xb0, 0x90, 0x4d, 0x8d, 0x2c, 0x95, 0x99, 0xa3, 0x86, 0x34, 0x71, 0xc1, 0xa1, 0xe5, 0x39, - 0xa4, 0xda, 0xe9, 0xc2, 0xb3, 0xdd, 0x93, 0xa6, 0x6a, 0xcf, 0xce, 0xe9, 0x64, 0x7c, 0x4e, 0xed, - 0xf3, 0xb3, 0x1e, 0xcd, 0xce, 0x97, 0xa6, 0xec, 0xb4, 0x80, 0x26, 0xfc, 0xac, 0x29, 0xee, 0x55, - 0xcd, 0xa7, 0x8b, 0xc5, 0x62, 0x7f, 0x54, 0xd9, 0xef, 0xe4, 0x84, 0x96, 0x7f, 0x6a, 0x95, 0x9a, - 0x14, 0xae, 0x21, 0x11, 0xb8, 0x67, 0x06, 0x55, 0xe2, 0xc5, 0xde, 0x2b, 0xcf, 0xca, 0xa0, 0xcb, - 0x56, 0xcc, 0x8b, 0xd7, 0xa8, 0x3b, 0x59, 0x00, 0xe4, 0x93, 0x33, 0x26, 0x58, 0x70, 0xa1, 0xc9, - 0x21, 0x63, 0x22, 0x57, 0x19, 0x53, 0xfc, 0xcf, 0x1a, 0x9f, 0x8c, 0xca, 0x64, 0x52, 0xb4, 0x2a, - 0x03, 0xe6, 0xf6, 0x32, 0xcb, 0x6c, 0x78, 0x00, 0xdd, 0x9f, 0x79, 0x26, 0x75, 0xa5, 0xc7, 0x1a, - 0xb2, 0xb5, 0xca, 0xc5, 0xfc, 0xec, 0xec, 0xdc, 0x5e, 0xb4, 0x07, 0xe5, 0x82, 0xf6, 0xb3, 0x63, - 0x6a, 0x4f, 0x6c, 0x7a, 0x6c, 0x97, 0x52, 0xb5, 0x08, 0x69, 0xed, 0xe9, 0xa5, 0x4e, 0xd5, 0x52, - 0x87, 0x55, 0xe8, 0x9d, 0x9e, 0x43, 0x71, 0xea, 0xd3, 0xa2, 0x3d, 0xa5, 0xf6, 0xc9, 0x33, 0x3a, - 0x3d, 0xfd, 0x12, 0x25, 0xca, 0xe9, 0xa6, 0x12, 0xc7, 0xa0, 0x41, 0x1b, 0x1b, 0x15, 0xf3, 0x18, - 0x3e, 0x9a, 0x9a, 0xb4, 0x47, 0x74, 0x4c, 0x20, 0xef, 0x92, 0x53, 0x9c, 0x9d, 0xec, 0xcc, 0x4a, - 0x3d, 0x87, 0x9e, 0x4e, 0x0b, 0x0f, 0x41, 0x33, 0x29, 0x94, 0x39, 0xa0, 0x16, 0xff, 0xf8, 0x31, - 0xe2, 0x2f, 0xd8, 0x62, 0xfc, 0xec, 0xbc, 0xd7, 0x89, 0xc6, 0x74, 0x32, 0x85, 0x40, 0x3b, 0x3e, - 0xeb, 0x94, 0x1f, 0x40, 0x71, 0x37, 0x10, 0x95, 0x31, 0xab, 0x42, 0xd5, 0xc1, 0x21, 0x32, 0x39, - 0x52, 0x5f, 0x92, 0xa3, 0x39, 0x6c, 0xfe, 0xcd, 0x93, 0xc7, 0xf0, 0x33, 0x9d, 0x9c, 0x9f, 0x73, - 0xbb, 0x87, 0x9f, 0xd3, 0x53, 0xb0, 0x06, 0xe6, 0xa4, 0x4e, 0x9f, 0x56, 0x5a, 0x29, 0x23, 0xa7, - 0x3b, 0x1a, 0x31, 0x60, 0x0e, 0x46, 0xc9, 0x4e, 0x2c, 0x96, 0x65, 0x11, 0xf9, 0x7f, 0x94, 0xe7, - 0x4e, 0xe6, 0xa7, 0xee, 0x7c, 0xdc, 0xe1, 0xb9, 0x53, 0x70, 0xdc, 0xf1, 0x33, 0x6a, 0x9f, 0x9d, - 0xf6, 0x7a, 0xae, 0x76, 0xa7, 0x5d, 0x5f, 0xd2, 0x86, 0x2d, 0x9d, 0x2d, 0xdc, 0x03, 0x38, 0x56, - 0x29, 0x0d, 0xcf, 0x41, 0xe4, 0xf1, 0x07, 0xb9, 0x3c, 0xd2, 0x6f, 0xa4, 0xcc, 0x63, 0x6f, 0x43, - 0xd4, 0x21, 0x31, 0x91, 0x73, 0x33, 0xa3, 0x23, 0x02, 0xce, 0xbd, 0xa9, 0x2b, 0xdf, 0x35, 0xf1, - 0xfc, 0x7b, 0x32, 0x70, 0x03, 0x96, 0x65, 0x33, 0x03, 0xdf, 0x16, 0x61, 0x90, 0x0d, 0x53, 0x12, - 0x3e, 0xc8, 0xb2, 0x42, 0xb0, 0xd2, 0x11, 0xac, 0x5f, 0x25, 0xa8, 0x86, 0x44, 0xd3, 0x93, 0x46, - 0xea, 0xaf, 0x28, 0xf9, 0xde, 0x0c, 0xaf, 0xd7, 0xca, 0x95, 0x9b, 0x9b, 0x08, 0xa3, 0x44, 0xc6, - 0x5d, 0x21, 0x0c, 0x1a, 0x57, 0xf8, 0x82, 0x05, 0xc1, 0x17, 0x4d, 0x88, 0x7e, 0xd1, 0x04, 0x5a, - 0x57, 0xcb, 0xb2, 0x2e, 0x8f, 0x80, 0x14, 0xbe, 0x6c, 0x12, 0xc5, 0xd5, 0x21, 0x4f, 0x63, 0xed, - 0x12, 0xbd, 0x5c, 0xa3, 0x32, 0x8b, 0x71, 0x35, 0xb8, 0x89, 0xd3, 0x74, 0x43, 0xdb, 0x34, 0x23, - 0xce, 0xbd, 0x8c, 0xfc, 0x91, 0xdd, 0xb3, 0x1b, 0x49, 0xed, 0x89, 0xa6, 0x7f, 0x79, 0xd4, 0x4d, - 0xbf, 0xd2, 0x82, 0x41, 0x06, 0x7a, 0x89, 0x66, 0x91, 0x99, 0xcb, 0x8e, 0x0e, 0x05, 0xce, 0x83, - 0x12, 0x05, 0xab, 0x07, 0xa9, 0xcb, 0x2e, 0x78, 0x3d, 0xd1, 0x65, 0x88, 0x04, 0xcb, 0xba, 0xa0, - 0x03, 0x83, 0xe4, 0x32, 0xf0, 0x4b, 0xac, 0x46, 0xe9, 0x21, 0xcd, 0xca, 0x83, 0xb4, 0x19, 0x59, - 0xa5, 0x7c, 0x31, 0x33, 0x8e, 0x8c, 0xab, 0xd7, 0x71, 0xc8, 0x2f, 0x8f, 0x18, 0x9e, 0x74, 0xdd, - 0x2f, 0x2b, 0x5b, 0x41, 0x2f, 0x40, 0x54, 0xed, 0x27, 0xad, 0x7a, 0x6f, 0x10, 0xd8, 0x41, 0x06, - 0x20, 0x45, 0x9e, 0xe2, 0xce, 0xea, 0x5a, 0xbd, 0x21, 0x84, 0xef, 0x26, 0xbd, 0x88, 0x1f, 0x66, - 0xc6, 0x18, 0xd2, 0xf8, 0x04, 0xff, 0x6f, 0x1c, 0xa1, 0x06, 0x02, 0xff, 0xf3, 0x59, 0x7a, 0x5a, - 0x19, 0xb2, 0x55, 0x0d, 0x0d, 0x65, 0xfc, 0x24, 0x30, 0xae, 0x14, 0xb7, 0x48, 0x1c, 0x3e, 0x73, - 0x7c, 0x7d, 0x4a, 0x6b, 0x1c, 0xb5, 0x8c, 0x40, 0xe5, 0xed, 0x6c, 0x25, 0x8d, 0xf4, 0xa7, 0xb2, - 0x06, 0x92, 0x3a, 0xc7, 0x92, 0xaa, 0x26, 0x11, 0x68, 0xff, 0x08, 0xb6, 0x7b, 0xc8, 0x4a, 0x52, - 0x29, 0xbe, 0xec, 0x03, 0x40, 0xb5, 0xb7, 0x2b, 0x16, 0xdd, 0x91, 0x4d, 0x9c, 0x93, 0xff, 0xf8, - 0xd7, 0x7f, 0x27, 0xb0, 0x91, 0x21, 0x7e, 0x94, 0x09, 0x16, 0x04, 0x78, 0xb3, 0x22, 0x56, 0x5c, - 0x7a, 0x45, 0xa8, 0x9d, 0xe2, 0x26, 0x5e, 0x88, 0x35, 0xf4, 0xe9, 0x16, 0xf9, 0xcf, 0x7f, 0xfb, - 0x97, 0x7f, 0xbe, 0x3c, 0x4a, 0x90, 0xea, 0xd5, 0xe0, 0xaf, 0x80, 0xbd, 0x62, 0xe0, 0x3c, 0x3c, - 0xc2, 0xfe, 0xdb, 0x93, 0x78, 0xd5, 0xc5, 0xd8, 0xbb, 0xd8, 0x03, 0x84, 0x37, 0x11, 0xc1, 0x6b, - 0x31, 0xf2, 0x23, 0x9f, 0xcb, 0x56, 0x7d, 0x01, 0x6d, 0xbe, 0x5c, 0x76, 0x0d, 0x8a, 0x27, 0x73, - 0x4e, 0x10, 0x93, 0x80, 0x5d, 0x60, 0xbf, 0x89, 0xe3, 0x29, 0xbe, 0x9f, 0x05, 0xfb, 0xe5, 0xcc, - 0x02, 0x97, 0x96, 0x0b, 0xed, 0x68, 0xa3, 0x71, 0xbb, 0xdb, 0x19, 0x37, 0x9f, 0xe5, 0x9e, 0x90, - 0xb1, 0x0c, 0x25, 0xcb, 0x5b, 0x2e, 0xfe, 0x90, 0xa9, 0x7b, 0x4b, 0xe4, 0x46, 0x5e, 0x9f, 0x4a, - 0x76, 0xd4, 0x1b, 0x20, 0xe4, 0x43, 0xc0, 0xc1, 0x27, 0xf1, 0x82, 0x83, 0x30, 0xa2, 0xb0, 0x49, - 0xbc, 0x20, 0x36, 0x19, 0xc2, 0xa2, 0x23, 0xf2, 0x8f, 0xfa, 0x04, 0x9b, 0x82, 0x48, 0x2e, 0xcb, - 0x01, 0x52, 0x4a, 0x5d, 0x0a, 0x89, 0x51, 0x05, 0xfa, 0xf1, 0x23, 0xa9, 0x22, 0x49, 0x1c, 0x6f, - 0x41, 0x6b, 0x21, 0x93, 0xab, 0x8f, 0xa0, 0x6d, 0x50, 0x25, 0x58, 0xa0, 0x24, 0xbf, 0x48, 0xe3, - 0x50, 0xc2, 0x4b, 0x16, 0x08, 0x8b, 0x3c, 0x90, 0xca, 0x77, 0xef, 0x88, 0xbe, 0x19, 0xb6, 0x14, - 0xaa, 0xda, 0x11, 0x29, 0x7f, 0x9a, 0x8b, 0x08, 0x89, 0x1b, 0x90, 0xd2, 0x24, 0x28, 0x78, 0x5d, - 0xf3, 0xf5, 0x86, 0x96, 0x37, 0xc0, 0x9e, 0xc9, 0x94, 0x6f, 0x80, 0x19, 0x57, 0xdf, 0xc5, 0xe4, - 0x05, 0x64, 0x3d, 0xad, 0x6f, 0x45, 0x10, 0x5d, 0x5d, 0x93, 0xee, 0xa6, 0xdc, 0xb8, 0xe3, 0xed, - 0xa3, 0x2b, 0xf9, 0x94, 0x54, 0x07, 0x15, 0xd9, 0xca, 0xa0, 0x7d, 0x76, 0xb5, 0x0f, 0xda, 0x75, - 0xb0, 0x6f, 0xd8, 0x83, 0x76, 0xfd, 0x80, 0xfb, 0xca, 0x83, 0x26, 0x23, 0x71, 0x54, 0x6b, 0xb9, - 0xad, 0xd3, 0x96, 0xe0, 0x83, 0x5a, 0xa7, 0xf5, 0x2d, 0x7a, 0x9f, 0xe4, 0xef, 0x21, 0xd8, 0x09, - 0xc2, 0xb4, 0x75, 0x4a, 0xaa, 0x6c, 0xdd, 0x27, 0xfd, 0xe4, 0x6b, 0x7a, 0xf5, 0x75, 0x1c, 0x2d, - 0xf1, 0xfa, 0x23, 0x90, 0xe7, 0x69, 0xd9, 0x13, 0x72, 0xbb, 0xd2, 0x2f, 0x05, 0x10, 0x70, 0xce, - 0x28, 0x5e, 0xcb, 0xdb, 0xdc, 0x0d, 0x3a, 0x3c, 0xb8, 0xac, 0xa5, 0x2d, 0x75, 0xd0, 0xea, 0x9f, - 0xed, 0x4f, 0x8f, 0xb0, 0x7c, 0xf5, 0x72, 0xca, 0x9e, 0x7c, 0x64, 0xa7, 0x74, 0xe2, 0xcb, 0x9a, - 0x83, 0x4b, 0xd9, 0x37, 0x95, 0x8e, 0xd0, 0xea, 0x66, 0x89, 0x2a, 0xfc, 0x98, 0xfa, 0x26, 0x90, - 0x03, 0x8f, 0xc9, 0x5e, 0x6b, 0xdd, 0x91, 0x2e, 0xe1, 0x57, 0x95, 0x19, 0x49, 0xe8, 0x95, 0xbd, - 0x23, 0xa9, 0x9b, 0x37, 0xac, 0x95, 0x9a, 0xc7, 0x4b, 0xd9, 0xb5, 0x61, 0x79, 0xe9, 0x66, 0xe2, - 0xf8, 0x7f, 0x94, 0x09, 0x79, 0x44, 0xd6, 0x66, 0x61, 0x37, 0xb7, 0xab, 0x02, 0x17, 0x02, 0x11, - 0xcc, 0xfe, 0x37, 0xe5, 0xb5, 0x25, 0x19, 0xfa, 0x78, 0x8f, 0xea, 0x5a, 0x23, 0x8d, 0x3e, 0xb8, - 0x94, 0xe7, 0x31, 0x25, 0x3e, 0x16, 0x8c, 0x06, 0x03, 0xf0, 0xa4, 0xa5, 0xa8, 0x59, 0x35, 0xa4, - 0xb5, 0xf6, 0xee, 0x43, 0x77, 0x75, 0xd1, 0xc3, 0xc9, 0x9f, 0xaf, 0xaf, 0x89, 0xba, 0x06, 0xc5, - 0x0b, 0x5b, 0xcd, 0x84, 0xe6, 0x61, 0xf0, 0xdf, 0x64, 0x62, 0xef, 0x66, 0xf5, 0x77, 0xb2, 0xcb, - 0x8f, 0xfe, 0xc2, 0xff, 0x2c, 0xab, 0xdc, 0xbc, 0x79, 0xf9, 0x85, 0x1a, 0x68, 0xdd, 0x13, 0x3e, - 0xd2, 0x04, 0x1f, 0xf4, 0xe5, 0xe3, 0x57, 0x5a, 0xba, 0xba, 0xcb, 0xfc, 0xbd, 0xa2, 0x01, 0x13, - 0xd9, 0xe7, 0xa8, 0xfd, 0x47, 0x55, 0x03, 0xbe, 0x97, 0x77, 0x11, 0x5f, 0xea, 0x81, 0xfb, 0x97, - 0xde, 0x8f, 0xb4, 0x42, 0x55, 0x77, 0x5e, 0xaa, 0xdb, 0xee, 0xaf, 0xc2, 0xc8, 0xee, 0x0d, 0xfa, - 0x23, 0x79, 0xb9, 0xae, 0x6f, 0xb5, 0xc9, 0x6d, 0x7d, 0x59, 0xfe, 0x05, 0x2c, 0x0d, 0x6a, 0x9e, - 0x0e, 0x5f, 0xc4, 0x3f, 0xce, 0x64, 0x83, 0x26, 0x87, 0xdf, 0xca, 0x8b, 0xf7, 0x36, 0x73, 0x5f, - 0xce, 0x5b, 0xfb, 0x3a, 0xbf, 0xaf, 0xf8, 0x57, 0x95, 0xa9, 0x74, 0x40, 0xd2, 0xd8, 0xb5, 0x93, - 0x15, 0x6e, 0xb3, 0x9c, 0x72, 0x64, 0x5a, 0xee, 0x68, 0x54, 0x83, 0x5e, 0xf3, 0x85, 0xe7, 0xbf, - 0xb8, 0x4b, 0x9c, 0x92, 0xfa, 0x60, 0x99, 0xec, 0xec, 0xa0, 0x4b, 0x5a, 0x8d, 0xd1, 0x93, 0x3a, - 0x46, 0x5a, 0x6d, 0xc8, 0xce, 0x8b, 0x92, 0x7d, 0xd5, 0xf8, 0xb9, 0x4c, 0x91, 0x44, 0x87, 0x4b, - 0xab, 0x1d, 0x19, 0xfc, 0x2e, 0x81, 0xfb, 0xee, 0x4f, 0xb7, 0xb7, 0x9f, 0x95, 0x2e, 0xe5, 0x9b, - 0x30, 0x5f, 0x18, 0x27, 0xcd, 0x77, 0x6a, 0x1e, 0x19, 0x1d, 0x3f, 0x64, 0x5f, 0x67, 0x55, 0xf9, - 0xf6, 0xcd, 0xff, 0x6e, 0x8e, 0x6e, 0xbf, 0xcf, 0xf3, 0xd8, 0xb5, 0xe3, 0x54, 0x7c, 0x95, 0x75, - 0xf1, 0x7d, 0xa4, 0xbd, 0x7e, 0xbd, 0x76, 0x80, 0x6f, 0xa2, 0x79, 0x96, 0x5c, 0x94, 0x6d, 0xe0, - 0xa1, 0x70, 0xeb, 0x8f, 0xb1, 0xb3, 0xc7, 0xc6, 0xd8, 0x5e, 0x7c, 0x69, 0x96, 0x9b, 0x2e, 0xd9, - 0x08, 0xaa, 0xf6, 0x0b, 0x63, 0xbd, 0x1b, 0x1b, 0xdc, 0xf5, 0xd6, 0x2d, 0xe1, 0x4e, 0x4c, 0x35, - 0xfa, 0xdb, 0x52, 0x10, 0xa8, 0x98, 0x90, 0x6c, 0x00, 0x09, 0xd8, 0x3b, 0x26, 0x49, 0x00, 0xec, - 0x25, 0xa9, 0x69, 0x8f, 0x09, 0x6c, 0x2b, 0xe5, 0xc5, 0x86, 0x7a, 0x5b, 0x40, 0x89, 0x94, 0x82, - 0x42, 0x91, 0x53, 0x90, 0x15, 0x7f, 0xda, 0xad, 0x48, 0xd3, 0x69, 0xac, 0xf1, 0x1e, 0x61, 0xf7, - 0xf1, 0x91, 0xbc, 0x35, 0x33, 0x20, 0xe4, 0x95, 0x2d, 0x12, 0xd2, 0xc6, 0x92, 0x2f, 0x29, 0x5e, - 0x0d, 0x9e, 0x93, 0xcc, 0x0f, 0xf1, 0xae, 0x54, 0x02, 0xc2, 0x7e, 0x55, 0xac, 0x24, 0x0f, 0x72, - 0xb7, 0xc9, 0x88, 0xbc, 0x9a, 0x21, 0x3e, 0xf4, 0xe3, 0x4a, 0xc8, 0x96, 0x17, 0xb1, 0x79, 0x16, - 0x07, 0x39, 0x28, 0xdf, 0x8f, 0x20, 0x7b, 0x9a, 0x1b, 0x73, 0xac, 0xe0, 0xe1, 0x7b, 0xef, 0x48, - 0x84, 0x84, 0xa9, 0x39, 0x35, 0x76, 0x4e, 0x65, 0xd6, 0xa0, 0x85, 0x15, 0xfc, 0xe1, 0x19, 0x8c, - 0xa9, 0x8f, 0x60, 0x3a, 0x4f, 0x5f, 0xae, 0x2e, 0x13, 0x06, 0x8c, 0x0d, 0x40, 0x82, 0x77, 0x53, - 0x6b, 0x72, 0x7e, 0x4c, 0xe4, 0x27, 0xb3, 0x61, 0x33, 0x37, 0x26, 0xb6, 0x6d, 0x4d, 0xed, 0x29, - 0xfc, 0x78, 0xcf, 0xde, 0xe3, 0x5f, 0xa0, 0xbf, 0xcb, 0xbf, 0x0a, 0x4c, 0xc1, 0xa9, 0xcf, 0x4f, - 0xc0, 0x9a, 0x5f, 0x11, 0x6a, 0xdc, 0x06, 0xfb, 0x4d, 0xba, 0xb7, 0x9f, 0x98, 0x69, 0x8e, 0x16, - 0xe2, 0xf7, 0x3c, 0x8a, 0x3d, 0x4f, 0x9d, 0x44, 0xed, 0x8c, 0x1d, 0x5d, 0x41, 0x38, 0xde, 0x2f, - 0xd1, 0xbb, 0x74, 0xb6, 0xfc, 0x02, 0xd7, 0x02, 0x6f, 0x5a, 0xa6, 0x9c, 0x47, 0x07, 0xfc, 0xa9, - 0x7c, 0x15, 0xf5, 0x73, 0x3d, 0xaa, 0xf9, 0xe2, 0xeb, 0xd5, 0xa0, 0xe1, 0x2a, 0xff, 0xef, 0x29, - 0xbf, 0xb7, 0xa7, 0xb4, 0xbe, 0xaa, 0x7f, 0x91, 0x58, 0xfe, 0x73, 0xbd, 0xc6, 0x8b, 0x81, 0x47, - 0x78, 0x14, 0x2e, 0x4f, 0xc6, 0xf1, 0xdf, 0x70, 0xfe, 0x17, 0xd9, 0x4e, 0xd6, 0x68, 0xd3, 0x39, - 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x92, 0xdb, 0x46, + 0x76, 0xef, 0xfc, 0x8a, 0x16, 0x54, 0x71, 0xc8, 0x54, 0x83, 0x43, 0x72, 0xee, 0x98, 0xe1, 0xa4, + 0xa4, 0x91, 0x6c, 0x69, 0x23, 0xc9, 0xb3, 0x9a, 0xf1, 0x7a, 0xb7, 0x36, 0x2e, 0x57, 0x13, 0x68, + 0x92, 0xf0, 0x00, 0x68, 0x18, 0x68, 0x0c, 0x87, 0x8b, 0xe2, 0x27, 0xe4, 0x21, 0x1f, 0x90, 0xca, + 0x4b, 0xbe, 0x2c, 0x5f, 0x90, 0x4f, 0xc8, 0x39, 0xdd, 0x8d, 0x1b, 0x09, 0x50, 0x23, 0x4b, 0x89, + 0x53, 0xb1, 0x2c, 0x92, 0x7d, 0x39, 0xa7, 0xcf, 0xfd, 0x9c, 0xbe, 0xe8, 0xf2, 0xd9, 0xab, 0xef, + 0xaf, 0xef, 0xfe, 0x72, 0xf3, 0x9a, 0x2c, 0x65, 0x18, 0x5c, 0x91, 0x4b, 0xfc, 0x22, 0x01, 0x8b, + 0x16, 0x53, 0x8b, 0x47, 0x16, 0x76, 0x70, 0xe6, 0xc1, 0x57, 0xc8, 0x25, 0x23, 0x11, 0x0b, 0xf9, + 0xd4, 0x7a, 0xf0, 0xf9, 0x2a, 0x16, 0x89, 0xb4, 0x48, 0xcf, 0x15, 0x91, 0xe4, 0x91, 0x9c, 0x5a, + 0x2b, 0xdf, 0x93, 0xcb, 0xa9, 0xc7, 0x1f, 0x7c, 0x97, 0xdb, 0xaa, 0x41, 0xfd, 0xc8, 0x97, 0x3e, + 0x0b, 0xec, 0xd4, 0x65, 0x01, 0x9f, 0x8e, 0x69, 0x08, 0x1d, 0x61, 0x16, 0x16, 0x6d, 0xab, 0x40, + 0xda, 0x73, 0x97, 0x2c, 0x49, 0x39, 0x20, 0xc9, 0xe4, 0xdc, 0x3e, 0xb3, 0x9a, 0x8b, 0xc9, 0x25, + 0x0f, 0xb9, 0xed, 0x8a, 0x40, 0x24, 0x16, 0x29, 0x97, 0x7b, 0x3e, 0x51, 0xff, 0xd5, 0x70, 0x14, + 0x23, 0x6b, 0x9e, 0x5a, 0x06, 0x94, 0xc5, 0x71, 0xc0, 0xed, 0x50, 0xcc, 0x7c, 0xf8, 0x5a, 0xf1, + 0x99, 0x0d, 0x1d, 0xb6, 0xcb, 0x62, 0x36, 0x0b, 0x38, 0x42, 0x4a, 0x5f, 0x06, 0xfc, 0xea, 0x8d, + 0xff, 0xc0, 0xed, 0xf7, 0x02, 0x88, 0x15, 0xc9, 0xe5, 0x81, 0xee, 0x23, 0xbd, 0xcb, 0xd4, 0x4d, + 0xfc, 0x58, 0x5e, 0xf5, 0x1e, 0x58, 0x42, 0xa4, 0x1f, 0x72, 0x91, 0x49, 0xfa, 0xc2, 0x95, 0x19, + 0x0b, 0x6e, 0xd8, 0x02, 0x90, 0xbf, 0xfd, 0xf0, 0xea, 0xf5, 0x9f, 0x2d, 0xea, 0xce, 0x17, 0xd3, + 0x5c, 0xd1, 0xe8, 0xe4, 0x33, 0x96, 0x72, 0xc7, 0xf2, 0x58, 0x72, 0x6f, 0xd1, 0xd9, 0xc2, 0xc9, + 0xb3, 0x24, 0x70, 0x2c, 0x6b, 0x43, 0x59, 0x10, 0x2f, 0x19, 0x0c, 0x2f, 0x9c, 0xe1, 0x09, 0x95, + 0x6c, 0xe6, 0x0c, 0xcf, 0x36, 0x54, 0x71, 0xa4, 0x3a, 0x61, 0x0a, 0x36, 0xc3, 0xd8, 0xc9, 0x55, + 0x67, 0xea, 0xe4, 0xb1, 0xef, 0xde, 0xf3, 0xc4, 0x79, 0x36, 0xa2, 0xc9, 0x62, 0xe6, 0x3c, 0x1b, + 0xd3, 0x5f, 0x33, 0xe8, 0xc1, 0xf6, 0x92, 0x3f, 0x42, 0x7b, 0x43, 0x03, 0x36, 0xe3, 0x41, 0x8a, + 0x3d, 0xb1, 0x1b, 0xce, 0x84, 0xc4, 0x49, 0xb1, 0xef, 0x61, 0x47, 0xca, 0x17, 0x01, 0x8f, 0xb0, + 0xc3, 0x4d, 0xd5, 0x8c, 0xa5, 0xc7, 0xd6, 0x29, 0x42, 0x6d, 0xa8, 0x37, 0xf5, 0x84, 0x9b, 0x85, + 0x20, 0xa9, 0x8b, 0x79, 0x16, 0xb9, 0xd2, 0x17, 0x11, 0x11, 0xd1, 0x3b, 0xc1, 0xbc, 0xfe, 0x20, + 0x5f, 0xfa, 0x1e, 0x7f, 0x11, 0x04, 0xd7, 0x20, 0xca, 0x44, 0x04, 0x69, 0x7f, 0x40, 0x63, 0x54, + 0xcc, 0x1f, 0x33, 0x9e, 0xac, 0xa1, 0x01, 0x2a, 0x7a, 0x99, 0x80, 0x31, 0x5c, 0x27, 0x59, 0x38, + 0xd3, 0xed, 0xb7, 0x5a, 0xc5, 0x28, 0x11, 0xdd, 0xf1, 0xca, 0x4f, 0xe3, 0x80, 0xad, 0xfb, 0x96, + 0xfb, 0x60, 0x51, 0x2b, 0x12, 0x11, 0xb7, 0x06, 0xf4, 0x3b, 0x2e, 0x6f, 0xb9, 0x94, 0x7e, 0xb4, + 0x00, 0x9c, 0x9b, 0x72, 0xdd, 0x46, 0x77, 0x8e, 0x98, 0xfb, 0x56, 0x6a, 0x3a, 0xac, 0xc1, 0x10, + 0x84, 0x1a, 0xf5, 0xf9, 0xf4, 0x2a, 0x87, 0xbe, 0x3b, 0xfe, 0x28, 0x5f, 0x8a, 0xc7, 0x3f, 0xb1, + 0x20, 0xe3, 0x30, 0x69, 0x9d, 0x4a, 0x1e, 0xfe, 0x9c, 0x06, 0x9c, 0xc7, 0xa8, 0x1a, 0x8b, 0xf2, + 0xa1, 0xee, 0x1b, 0x96, 0x7d, 0x8a, 0x9a, 0x56, 0xb0, 0x07, 0xd7, 0x65, 0xde, 0x2f, 0x59, 0x2a, + 0xcd, 0x5a, 0x35, 0xe8, 0xed, 0xa1, 0x16, 0x24, 0xe1, 0xaf, 0x52, 0xfe, 0x9c, 0xf2, 0xe4, 0x81, + 0x27, 0x08, 0x88, 0xcd, 0xa1, 0x6e, 0x76, 0x4d, 0xce, 0xd2, 0xda, 0x54, 0x6c, 0x74, 0x4d, 0x8c, + 0x59, 0x9a, 0xae, 0x44, 0xe2, 0x95, 0x93, 0x8b, 0x8e, 0x4e, 0x00, 0xf4, 0xc1, 0x72, 0x32, 0x34, + 0xda, 0x98, 0x46, 0x67, 0xfb, 0x79, 0xc5, 0xfd, 0xc5, 0x52, 0x8a, 0xf9, 0x1c, 0xc6, 0x15, 0xbf, + 0xd8, 0x3b, 0xac, 0xf7, 0x76, 0x82, 0xde, 0xfb, 0x81, 0x58, 0x24, 0x2c, 0xf4, 0xfc, 0x07, 0x30, + 0x8f, 0xa4, 0x82, 0xde, 0x1a, 0xe8, 0x44, 0x00, 0x1f, 0xfe, 0x2c, 0x61, 0xa8, 0x72, 0x90, 0x71, + 0xcc, 0xe1, 0x67, 0x96, 0xf0, 0xba, 0xf0, 0x15, 0xba, 0xbd, 0xd3, 0x9e, 0x82, 0x7c, 0xce, 0x5c, + 0xf0, 0xe0, 0x7d, 0x78, 0xf5, 0x8c, 0xdb, 0x4e, 0x94, 0x2b, 0x3f, 0xe1, 0x01, 0x4f, 0x1b, 0x8a, + 0x30, 0x7d, 0xfb, 0x74, 0x51, 0x80, 0xa5, 0xa9, 0xdf, 0x00, 0xc1, 0xf6, 0x60, 0x53, 0x33, 0xf8, + 0x6d, 0x87, 0xc9, 0xd3, 0x95, 0x2f, 0xdd, 0x65, 0xbf, 0x0a, 0x2b, 0x83, 0xdc, 0x85, 0x18, 0x62, + 0x62, 0x8b, 0x23, 0xc5, 0x02, 0x3c, 0xf9, 0x6d, 0xe4, 0xf1, 0xc7, 0xfe, 0xe0, 0x62, 0x06, 0x1e, + 0x72, 0x7f, 0xa1, 0xc6, 0xef, 0x5e, 0x7c, 0x7c, 0x8d, 0xc3, 0x02, 0x86, 0x5f, 0x64, 0x52, 0xdc, + 0xb1, 0x84, 0xef, 0xce, 0x18, 0x5b, 0x4e, 0xc3, 0x23, 0x71, 0xd6, 0xad, 0xe4, 0xf1, 0x18, 0x3c, + 0x73, 0x16, 0x08, 0xf7, 0xde, 0xda, 0x01, 0x99, 0x74, 0x80, 0x4c, 0x2a, 0x90, 0x4d, 0xc5, 0x4f, + 0x3d, 0x3a, 0xe4, 0x18, 0x27, 0xf9, 0x34, 0xe2, 0x2b, 0xf2, 0xc3, 0xc7, 0x77, 0xb7, 0x9c, 0x25, + 0xee, 0xf2, 0x86, 0x81, 0x79, 0xa4, 0xfd, 0x22, 0xe2, 0x0c, 0x01, 0x81, 0xd2, 0x03, 0x38, 0x0c, + 0x0e, 0x0f, 0x2e, 0xa2, 0x2c, 0x08, 0xa6, 0xd3, 0x1a, 0xff, 0x53, 0x3e, 0x5c, 0x70, 0xd9, 0xb7, + 0x62, 0xf8, 0x6d, 0x0d, 0x06, 0xdf, 0x7c, 0xd3, 0xdf, 0x0d, 0xb9, 0x35, 0x81, 0x36, 0x04, 0xd4, + 0x12, 0xbe, 0xea, 0xbc, 0xac, 0x78, 0x00, 0x31, 0x96, 0x57, 0x8c, 0x34, 0xc3, 0x55, 0x11, 0x89, + 0x6a, 0x8c, 0x96, 0xcb, 0xec, 0x20, 0xce, 0x5b, 0x85, 0x34, 0xaa, 0x22, 0x5e, 0xa7, 0xdc, 0xf7, + 0x8d, 0x4f, 0x3a, 0xc6, 0x6b, 0xa4, 0xb5, 0x0c, 0x57, 0x7c, 0xb5, 0xc1, 0x56, 0x51, 0xb8, 0x61, + 0x86, 0xc5, 0x04, 0x4e, 0xa5, 0xd6, 0x5c, 0x5a, 0xe6, 0x05, 0x54, 0xc0, 0xeb, 0x80, 0xe3, 0xcf, + 0x97, 0xeb, 0xb7, 0x5e, 0x9f, 0x0f, 0x2e, 0xc0, 0x94, 0xe5, 0x1a, 0x5c, 0xc9, 0xd3, 0x50, 0x53, + 0x23, 0xa1, 0xe9, 0x74, 0x2a, 0xff, 0xd1, 0x02, 0x3b, 0xac, 0x2b, 0xa4, 0x69, 0x92, 0x79, 0x5d, + 0x7d, 0xca, 0x6a, 0xe9, 0x7e, 0x2d, 0x35, 0x84, 0xb9, 0xa3, 0x08, 0x98, 0x59, 0x53, 0x42, 0x2b, + 0xa6, 0xbd, 0x19, 0xaa, 0x81, 0xa9, 0x3e, 0xd3, 0x58, 0x6f, 0x97, 0x0c, 0xac, 0x38, 0x00, 0x5f, + 0xf9, 0x84, 0xb7, 0xf2, 0xa1, 0x1f, 0x45, 0x3c, 0xc1, 0xd8, 0x30, 0xb5, 0x6e, 0x25, 0x83, 0xd8, + 0xbc, 0xeb, 0xb3, 0x75, 0xe7, 0xac, 0x7b, 0x5d, 0x03, 0x18, 0x65, 0x40, 0x6e, 0x31, 0x7a, 0x59, + 0x35, 0x6f, 0x93, 0x85, 0x99, 0x28, 0xfb, 0x8b, 0xbc, 0x57, 0x4c, 0xb2, 0x7e, 0xbe, 0xa1, 0x16, + 0x0e, 0xa4, 0xca, 0xbe, 0x6a, 0x49, 0x73, 0x5b, 0xf0, 0x60, 0x5c, 0x0d, 0xe9, 0x6d, 0x06, 0x10, + 0x19, 0x91, 0x9d, 0xfe, 0x00, 0x66, 0x37, 0xa2, 0x14, 0x92, 0x6e, 0xd4, 0xd7, 0xba, 0xce, 0x68, + 0xdf, 0x3a, 0xe3, 0xa7, 0xaf, 0x53, 0xe0, 0x56, 0x46, 0x98, 0x70, 0x08, 0xf7, 0x11, 0xc1, 0xf8, + 0x71, 0x93, 0x88, 0xd0, 0x4f, 0x79, 0xbf, 0x9f, 0x52, 0x86, 0x40, 0xa8, 0x1b, 0xa1, 0x22, 0xcb, + 0x9f, 0xdf, 0xbf, 0x7b, 0x23, 0x65, 0xfc, 0x91, 0xff, 0x9a, 0x01, 0x25, 0x17, 0x62, 0xc8, 0x3c, + 0xef, 0xf5, 0x03, 0x68, 0xe9, 0x9d, 0x0f, 0x84, 0x81, 0xfc, 0xfa, 0x56, 0x00, 0xa5, 0x8c, 0x45, + 0xfb, 0xc5, 0x2a, 0xc8, 0xc3, 0x52, 0xac, 0xee, 0x04, 0x4b, 0xe5, 0x7b, 0x9e, 0xa6, 0x68, 0x06, + 0x56, 0xe1, 0x50, 0x24, 0x65, 0x0f, 0xdc, 0x7b, 0x86, 0x3e, 0xd3, 0x97, 0x4b, 0x3f, 0x1d, 0x02, + 0x7f, 0xb1, 0x88, 0x52, 0x8e, 0x6a, 0x00, 0xca, 0x07, 0xb4, 0x6d, 0x05, 0x9e, 0x24, 0x50, 0x8a, + 0xd6, 0x96, 0xe0, 0x6d, 0x6b, 0xbc, 0xc6, 0x59, 0x64, 0xb5, 0x84, 0xd2, 0x13, 0x97, 0x81, 0xe5, + 0x48, 0xb1, 0xec, 0x33, 0x8b, 0x3e, 0x1b, 0x0d, 0x28, 0xeb, 0x9b, 0x25, 0x44, 0x0c, 0xb2, 0xb4, + 0x6e, 0xbe, 0xbf, 0xbd, 0xb3, 0x40, 0x12, 0xd0, 0x01, 0x02, 0x34, 0x2c, 0xbe, 0x01, 0x13, 0xc5, + 0x35, 0xaf, 0x75, 0x75, 0x6b, 0xdf, 0xad, 0x63, 0xf4, 0x74, 0x2c, 0x6c, 0x7d, 0x1d, 0x4b, 0x0f, + 0x7e, 0x49, 0x45, 0x64, 0x69, 0xa8, 0xc8, 0xeb, 0xff, 0xe1, 0xf6, 0xfb, 0x0f, 0xe0, 0xad, 0x09, + 0xac, 0xe3, 0xcf, 0xc1, 0xbf, 0x07, 0x8d, 0x04, 0xa4, 0x6a, 0x2c, 0xde, 0x2e, 0x6c, 0x49, 0xd3, + 0x42, 0xd8, 0xac, 0x4d, 0xd8, 0xec, 0xab, 0x88, 0x62, 0xa1, 0x65, 0x40, 0x50, 0xf1, 0x44, 0xcb, + 0x21, 0xd5, 0x72, 0x60, 0x46, 0x0e, 0xdf, 0xbd, 0x06, 0x31, 0x70, 0xd5, 0x8e, 0x50, 0x99, 0xd3, + 0x3a, 0x72, 0x09, 0x1f, 0x9b, 0x86, 0x11, 0x6d, 0xaf, 0x06, 0xc6, 0x34, 0x05, 0xac, 0x45, 0x50, + 0xdb, 0xf6, 0x64, 0x08, 0x58, 0x12, 0xa7, 0x2b, 0x9a, 0x50, 0xcd, 0x96, 0xa3, 0x3b, 0x6e, 0x33, + 0xd7, 0x05, 0x14, 0xaa, 0x0b, 0x16, 0xff, 0x04, 0xe4, 0x16, 0x14, 0x06, 0x87, 0x9a, 0x03, 0x73, + 0xea, 0x06, 0x90, 0xe1, 0xee, 0xf4, 0xae, 0xa1, 0x6f, 0x76, 0x0f, 0xc8, 0x52, 0x6b, 0x1c, 0xa5, + 0x66, 0xc2, 0x14, 0x2b, 0x0b, 0x03, 0x53, 0x37, 0xe0, 0x1d, 0x30, 0x08, 0x7c, 0x1e, 0xec, 0xcd, + 0x36, 0x03, 0x3a, 0x39, 0x1f, 0x8d, 0x6a, 0xd2, 0x58, 0x6c, 0x95, 0x26, 0x95, 0xaa, 0xbd, 0xdd, + 0xb0, 0x3e, 0x7c, 0xc0, 0x39, 0x6d, 0xc0, 0x1f, 0x20, 0x26, 0xf2, 0xa4, 0x44, 0xa1, 0x76, 0x40, + 0xd3, 0x4e, 0x0c, 0x17, 0x66, 0x09, 0x55, 0x0d, 0x7c, 0x0b, 0x2a, 0x03, 0x8e, 0x9b, 0x91, 0xb6, + 0x49, 0x13, 0x7a, 0x7b, 0x27, 0xb2, 0x69, 0x2d, 0x99, 0xa0, 0x77, 0xd6, 0x36, 0x08, 0x55, 0x2c, + 0xd2, 0xd5, 0xba, 0x93, 0x97, 0xc5, 0xbe, 0xd3, 0x4e, 0xfb, 0xee, 0x46, 0x61, 0x40, 0xb7, 0x4b, + 0xfc, 0x4f, 0x80, 0xee, 0x6c, 0x16, 0x06, 0x1b, 0x8a, 0xe5, 0x36, 0x2c, 0xae, 0x8a, 0x7e, 0x67, + 0xb1, 0x6f, 0x83, 0x00, 0x1b, 0x28, 0xa8, 0xca, 0xbb, 0x96, 0xa8, 0x6a, 0xf8, 0x01, 0xc5, 0x7d, + 0x41, 0x07, 0x2e, 0xb5, 0x7f, 0xc0, 0xad, 0x98, 0x2e, 0x40, 0x3b, 0x66, 0x95, 0x35, 0x2b, 0x10, + 0xa8, 0x0a, 0x5f, 0x27, 0xaf, 0x97, 0xf7, 0x9d, 0x6c, 0xee, 0x6e, 0x0f, 0x06, 0x74, 0xab, 0xb2, + 0xdf, 0x0f, 0xbb, 0xbd, 0x3f, 0x18, 0xd0, 0xbd, 0x95, 0xfc, 0x7e, 0x64, 0xfb, 0xf7, 0x0a, 0x0d, + 0xd4, 0x8d, 0x62, 0xfe, 0xc9, 0x58, 0x9b, 0x9b, 0x04, 0x90, 0x95, 0x29, 0xd6, 0x61, 0xcb, 0xdd, + 0x29, 0xdf, 0x9d, 0x6d, 0x01, 0xc4, 0x2c, 0x28, 0xed, 0xbb, 0x27, 0xaa, 0x8d, 0x00, 0xc4, 0x29, + 0x6a, 0xa5, 0xb0, 0x18, 0xff, 0xa2, 0xb4, 0xdc, 0xbb, 0x3c, 0x30, 0x27, 0x11, 0xe4, 0x52, 0x85, + 0x81, 0xab, 0x1e, 0x9e, 0xd0, 0xe4, 0x73, 0x00, 0xb1, 0xe7, 0x2c, 0xf4, 0x83, 0xb5, 0xa3, 0x6d, + 0xd5, 0xce, 0x7c, 0x6a, 0xeb, 0x23, 0x0f, 0xdd, 0x41, 0x5f, 0x06, 0x7e, 0x74, 0xff, 0x9e, 0xb9, + 0xb7, 0xaa, 0xf9, 0x2d, 0x40, 0x50, 0xc8, 0x7d, 0x0b, 0xc1, 0xc9, 0x0f, 0x6f, 0x2d, 0xfa, 0x51, + 0xcc, 0x84, 0x14, 0xd4, 0x7a, 0xc3, 0x83, 0x07, 0x2e, 0x21, 0x9d, 0x90, 0x0f, 0x3c, 0x83, 0xec, + 0xf2, 0x22, 0x81, 0x7a, 0x89, 0x5a, 0x1f, 0x60, 0x90, 0xdc, 0xb2, 0x08, 0xca, 0xce, 0x14, 0x3e, + 0x6d, 0xb0, 0x42, 0x7f, 0x4e, 0xad, 0x17, 0xb8, 0x00, 0xb9, 0xc6, 0x73, 0x0a, 0xf2, 0x3a, 0x14, + 0xbf, 0xf8, 0x56, 0x85, 0x73, 0xb7, 0xe3, 0x76, 0x1d, 0xce, 0x44, 0x60, 0x19, 0x6c, 0x75, 0xa8, + 0x0b, 0xa0, 0x8d, 0xdb, 0x4b, 0x65, 0x78, 0xce, 0x78, 0x78, 0xbc, 0x99, 0x65, 0x52, 0x8a, 0x88, + 0xfa, 0x51, 0x9c, 0x49, 0x2a, 0x62, 0xb9, 0x48, 0x44, 0x16, 0x83, 0x70, 0x02, 0xee, 0x4a, 0x2a, + 0x41, 0xce, 0x50, 0x7d, 0xb0, 0x06, 0xdb, 0x7e, 0xb4, 0x04, 0x9a, 0xe4, 0x85, 0xea, 0x4b, 0xfd, + 0xbf, 0x71, 0x67, 0x3c, 0x1a, 0xfd, 0xdd, 0x16, 0xe2, 0xf1, 0xf1, 0x45, 0xc8, 0x92, 0x85, 0x1f, + 0x39, 0xa3, 0xc6, 0x12, 0xb9, 0x00, 0x07, 0x9d, 0x07, 0x62, 0xe5, 0x3c, 0xf8, 0xa9, 0x3f, 0x0b, + 0x78, 0x31, 0xaa, 0x57, 0xcc, 0x71, 0x45, 0x5b, 0x26, 0xc0, 0xf9, 0x5c, 0x24, 0xa1, 0x83, 0x35, + 0xf4, 0xe6, 0xaf, 0x12, 0xd2, 0xef, 0x54, 0xcf, 0xfb, 0x89, 0xea, 0x96, 0xb2, 0xce, 0xa2, 0x91, + 0x66, 0xb3, 0xd0, 0x87, 0x96, 0x9e, 0x92, 0xe3, 0x99, 0xd3, 0xbd, 0x2f, 0x51, 0x29, 0x90, 0x0e, + 0x58, 0xe4, 0x72, 0x47, 0x8f, 0x34, 0x31, 0x39, 0x8e, 0x1d, 0x8a, 0xbf, 0xd9, 0x73, 0x28, 0x3e, + 0x53, 0x5b, 0x65, 0x91, 0x06, 0xee, 0xce, 0x61, 0xb3, 0x5a, 0xcb, 0xb8, 0x46, 0xbc, 0x3b, 0x90, + 0xcf, 0xc0, 0x7c, 0x79, 0x62, 0x2b, 0x43, 0x52, 0x3c, 0x5d, 0xc4, 0x90, 0xd5, 0xd1, 0x81, 0x46, + 0x5b, 0x34, 0x55, 0xa0, 0x58, 0x4b, 0x34, 0x09, 0x6a, 0x1d, 0x2b, 0xa8, 0xd9, 0x1a, 0x34, 0xa4, + 0x34, 0x7b, 0x73, 0x48, 0x71, 0xa8, 0x26, 0x67, 0x1c, 0x3f, 0x12, 0x4f, 0x48, 0xc9, 0x3d, 0xf2, + 0x52, 0x4d, 0x44, 0x87, 0xda, 0xcc, 0x7d, 0x1e, 0x78, 0xb0, 0x52, 0x5e, 0x10, 0x37, 0x3c, 0x3c, + 0xe6, 0x21, 0x19, 0x9e, 0xaa, 0xcf, 0x93, 0x09, 0x7c, 0x6d, 0x02, 0xbe, 0x80, 0x7c, 0x00, 0x0c, + 0x3d, 0xa2, 0xea, 0x71, 0x92, 0xe1, 0x0d, 0x7a, 0x2e, 0xf4, 0xd9, 0x5a, 0x61, 0x1f, 0x26, 0x6f, + 0x3a, 0x12, 0xcf, 0xfd, 0xc0, 0x1a, 0x1e, 0xf5, 0xf9, 0xa4, 0xb6, 0x96, 0x92, 0xff, 0x0b, 0x28, + 0x50, 0x24, 0xb8, 0x4e, 0xcc, 0x5c, 0x14, 0x4d, 0x12, 0xb2, 0x60, 0x13, 0x27, 0x10, 0xda, 0x20, + 0xbf, 0xe7, 0x60, 0x2b, 0xe8, 0x21, 0x81, 0x0d, 0x91, 0x64, 0x11, 0x39, 0x78, 0xd0, 0x87, 0xf4, + 0x6f, 0x4a, 0xbb, 0x2c, 0xad, 0x89, 0xc1, 0xde, 0xc7, 0x88, 0xd2, 0x5d, 0x72, 0xf7, 0x1e, 0xc8, + 0x29, 0x4d, 0x85, 0x79, 0xbe, 0xf8, 0xa9, 0x83, 0xe4, 0x6d, 0x3d, 0x44, 0x2a, 0x8c, 0xa1, 0x72, + 0x8d, 0x11, 0x29, 0x05, 0x02, 0x79, 0x7e, 0x64, 0x1b, 0x4b, 0xed, 0x98, 0x08, 0xb2, 0x6d, 0x4e, + 0xcc, 0x8d, 0x33, 0xd4, 0x48, 0xd3, 0x1b, 0xf0, 0x9f, 0xda, 0x2c, 0x14, 0x59, 0x52, 0x0a, 0xb8, + 0x30, 0x4a, 0xb2, 0x4d, 0x06, 0xb1, 0x27, 0xf1, 0x63, 0x13, 0xbc, 0x5a, 0x53, 0x77, 0xd8, 0x1e, + 0x77, 0x85, 0x8e, 0xb3, 0x6d, 0x98, 0x95, 0x0f, 0x55, 0x30, 0x73, 0x3c, 0x95, 0xcd, 0x62, 0xac, + 0xf1, 0xec, 0x4f, 0x39, 0x8c, 0xf2, 0xf1, 0x42, 0xa1, 0x1b, 0x8f, 0x4b, 0xe6, 0x07, 0x69, 0x5e, + 0x28, 0x56, 0x95, 0x51, 0x9b, 0x34, 0x0b, 0xc1, 0xd3, 0xd7, 0x65, 0x6f, 0x00, 0x65, 0xaa, 0x0d, + 0x2a, 0x0d, 0x37, 0x98, 0x4a, 0x02, 0x26, 0x79, 0x39, 0xa4, 0xbd, 0x59, 0x97, 0x51, 0x3f, 0x35, + 0x7b, 0x15, 0xae, 0x5f, 0x33, 0x21, 0x39, 0xf5, 0x3c, 0xea, 0x05, 0x74, 0xee, 0x2f, 0x20, 0x05, + 0xd1, 0xe5, 0x98, 0x2e, 0x27, 0x74, 0x79, 0x48, 0x97, 0x47, 0x74, 0x79, 0x4c, 0x97, 0x27, 0x74, + 0x99, 0xd0, 0x98, 0xc6, 0x09, 0xcf, 0xb7, 0xe2, 0x4b, 0x3e, 0x63, 0xee, 0x3d, 0x46, 0xaf, 0xc8, + 0xd3, 0xc7, 0xd6, 0x8e, 0x0a, 0x23, 0x50, 0x1e, 0xe1, 0xa9, 0x6b, 0x6d, 0xd0, 0x0f, 0x21, 0x0d, + 0x98, 0x55, 0xb5, 0x97, 0x28, 0x07, 0x69, 0x71, 0x8e, 0x42, 0x15, 0xce, 0x31, 0x74, 0xa1, 0x1a, + 0x49, 0x29, 0x44, 0xe5, 0xdc, 0xe8, 0x53, 0x7a, 0xad, 0xca, 0x77, 0x0a, 0xaa, 0x6a, 0x96, 0x25, + 0x02, 0x9a, 0x05, 0xb9, 0x92, 0x4b, 0x2d, 0x02, 0xb4, 0x4c, 0xfc, 0xff, 0x99, 0x61, 0xfe, 0x81, + 0x3a, 0x0e, 0x9b, 0x83, 0x73, 0xc0, 0xf7, 0x8c, 0x43, 0x58, 0xe7, 0x1d, 0xbe, 0x68, 0x7e, 0xea, + 0x28, 0x31, 0xba, 0x68, 0x04, 0xcd, 0x54, 0x04, 0xbe, 0x57, 0x74, 0x69, 0xf5, 0x3e, 0xe7, 0x13, + 0x7e, 0x36, 0x07, 0xa9, 0x95, 0xf1, 0x55, 0x8a, 0xb8, 0x88, 0x31, 0xe0, 0x33, 0x7e, 0xb8, 0xc8, + 0x77, 0x71, 0x54, 0xb1, 0x03, 0x22, 0x0c, 0x26, 0xaf, 0x22, 0xc6, 0x6c, 0x54, 0x7e, 0x82, 0x88, + 0x89, 0x41, 0x1b, 0x7e, 0xd9, 0x60, 0x9c, 0x2e, 0x5f, 0x8a, 0x00, 0x10, 0x94, 0x89, 0xb0, 0x7d, + 0x38, 0x37, 0x04, 0xb1, 0x11, 0xe3, 0xee, 0xc8, 0x20, 0xfa, 0x14, 0xa6, 0xcf, 0x41, 0xd5, 0x8e, + 0xa0, 0x1b, 0xec, 0xaf, 0x50, 0xd5, 0x54, 0x19, 0xd3, 0xf8, 0x87, 0x9b, 0x25, 0x29, 0xcc, 0x89, + 0x85, 0x0f, 0x45, 0x5e, 0xb2, 0x51, 0x61, 0x39, 0xaf, 0x24, 0x1a, 0xb0, 0x38, 0xe5, 0x4e, 0xf1, + 0x63, 0xb3, 0xe3, 0x78, 0x79, 0x95, 0xef, 0x1b, 0x15, 0x80, 0x2e, 0x62, 0xcb, 0x20, 0x31, 0x2c, + 0x14, 0x6a, 0x1f, 0xe5, 0xa5, 0x6e, 0x61, 0xfd, 0xd0, 0x68, 0xe6, 0x08, 0x34, 0x33, 0x8c, 0x1f, + 0x61, 0xd4, 0xd8, 0xbd, 0x1d, 0xf0, 0x39, 0x18, 0x4a, 0xc2, 0xc3, 0xc2, 0x13, 0xc0, 0xaf, 0x94, + 0xed, 0x40, 0x17, 0x4c, 0x5d, 0xdb, 0x93, 0x72, 0x2a, 0x28, 0xd8, 0x19, 0x1e, 0xd7, 0xa7, 0x6a, + 0xdc, 0xba, 0x73, 0x33, 0x0c, 0xed, 0x71, 0xe1, 0x80, 0xc3, 0x89, 0xe9, 0x92, 0x00, 0xaf, 0xfb, + 0x2a, 0x70, 0x40, 0x6b, 0x1f, 0x56, 0x69, 0xee, 0xb4, 0xe8, 0x1b, 0x57, 0x7d, 0x15, 0xf8, 0xb8, + 0x01, 0x6e, 0xfa, 0x81, 0x83, 0x71, 0x93, 0x03, 0x3d, 0xb2, 0xc5, 0x43, 0x39, 0x7d, 0x5d, 0x9b, + 0x5e, 0xe1, 0xd9, 0x61, 0xa3, 0xc2, 0x7e, 0xb2, 0x25, 0x9f, 0x61, 0x0b, 0xf6, 0xf1, 0xb0, 0xc4, + 0x7e, 0xd6, 0xc0, 0x3e, 0x69, 0xc1, 0x3d, 0x51, 0x53, 0x83, 0xc5, 0x3f, 0xab, 0x54, 0x63, 0x63, + 0x2e, 0xad, 0xa9, 0x54, 0x0b, 0x7b, 0x69, 0x1f, 0xe7, 0xa5, 0xe7, 0x1a, 0x5a, 0x56, 0x36, 0x46, + 0xbe, 0x5c, 0x6b, 0x4f, 0xe5, 0xb2, 0xa1, 0x42, 0x00, 0x9b, 0x8f, 0xb5, 0x7d, 0x34, 0x1a, 0xe5, + 0xb6, 0xad, 0xda, 0x02, 0x32, 0xb8, 0x2f, 0xd7, 0xce, 0xd8, 0x94, 0x01, 0xcf, 0xdd, 0x99, 0x77, + 0xcc, 0x47, 0xa6, 0x95, 0x2c, 0x66, 0xac, 0x3f, 0x19, 0x1d, 0xd2, 0xc9, 0x18, 0xfe, 0x4e, 0x8e, + 0x28, 0xec, 0x6e, 0xfb, 0x4d, 0xc8, 0xc1, 0x60, 0x33, 0x5c, 0x24, 0xbe, 0x57, 0x26, 0x06, 0x6c, + 0xe8, 0x2e, 0xb4, 0xcf, 0x14, 0x24, 0xa8, 0x7e, 0x17, 0x69, 0x05, 0x3b, 0xb3, 0x30, 0x4a, 0x9d, + 0x84, 0x43, 0xda, 0x92, 0x7d, 0x75, 0xd3, 0x09, 0x65, 0x46, 0x7f, 0x44, 0xc7, 0xf3, 0xa4, 0xc0, + 0xa6, 0x41, 0x27, 0xfb, 0x41, 0x27, 0x3b, 0xa0, 0x4a, 0x32, 0x10, 0xe1, 0xbc, 0xbc, 0x6e, 0xe4, + 0xa7, 0xa3, 0x91, 0xe1, 0x3e, 0x0d, 0x6b, 0xc2, 0x1b, 0x9e, 0x19, 0x0b, 0xf2, 0x23, 0x15, 0xfc, + 0xe6, 0x01, 0x7f, 0x2c, 0xb9, 0xa8, 0xf5, 0xc1, 0x04, 0xa0, 0x20, 0xb5, 0x5d, 0x8e, 0x1e, 0x98, + 0xab, 0xa2, 0x46, 0xa5, 0xca, 0xd4, 0xd1, 0x5d, 0x06, 0xb9, 0xe4, 0x50, 0xf2, 0xec, 0x13, 0xed, + 0xd1, 0xdc, 0x1b, 0xbb, 0xc7, 0x75, 0xd1, 0x9e, 0x9e, 0xd3, 0xc9, 0xe8, 0x9c, 0x8e, 0xcf, 0x4f, + 0x3b, 0x24, 0x3b, 0x5b, 0xd8, 0xaa, 0xd2, 0x02, 0x9c, 0xf0, 0xb3, 0xc2, 0xb8, 0x93, 0x35, 0x9f, + 0xcf, 0xe7, 0xf3, 0xdd, 0x5e, 0xad, 0xbf, 0xe3, 0x63, 0x5a, 0xfc, 0xd5, 0xab, 0x54, 0xa8, 0x70, + 0x0d, 0x05, 0xc0, 0x3d, 0x3b, 0x28, 0x03, 0x2f, 0xd6, 0x5e, 0x59, 0x5a, 0x38, 0x5d, 0xba, 0x64, + 0x9e, 0x58, 0xa1, 0xec, 0x54, 0x02, 0x50, 0x2d, 0x67, 0x44, 0x30, 0xe1, 0x42, 0x91, 0x43, 0x46, + 0x44, 0xad, 0x32, 0xa2, 0xf8, 0x67, 0x38, 0x3a, 0x1e, 0x14, 0xc1, 0x24, 0x6f, 0x64, 0x06, 0x8c, + 0xed, 0x45, 0x94, 0x59, 0xf3, 0x00, 0xaa, 0x3f, 0xfb, 0x54, 0xc9, 0xca, 0xf4, 0xd5, 0x78, 0x6b, + 0xa4, 0x8b, 0xd9, 0xe9, 0xe9, 0xf9, 0x78, 0xde, 0xec, 0x54, 0x0b, 0x8e, 0xcf, 0x0e, 0xe9, 0x78, + 0x32, 0xa6, 0x87, 0xe3, 0x82, 0xab, 0x06, 0x22, 0x23, 0x3d, 0xb3, 0xd4, 0x89, 0x5e, 0x6a, 0xbf, + 0x08, 0xbd, 0x93, 0x73, 0x48, 0x4e, 0x5d, 0x52, 0x1c, 0x1f, 0xd1, 0xf1, 0xf1, 0x19, 0x3d, 0x3a, + 0xf9, 0x12, 0x21, 0xaa, 0xe1, 0xba, 0x10, 0x47, 0x20, 0xc1, 0x31, 0x16, 0x2a, 0xf6, 0x21, 0x7c, + 0xd4, 0x25, 0x39, 0x1e, 0xd0, 0x11, 0x81, 0xb8, 0x4b, 0x4e, 0x70, 0x74, 0xb2, 0x35, 0xaa, 0xe4, + 0x1c, 0x7a, 0x26, 0x2c, 0x3c, 0x06, 0xf5, 0xa0, 0x50, 0xc4, 0x80, 0x8a, 0xfd, 0xc3, 0xa7, 0xb0, + 0x3f, 0x67, 0xf3, 0xd1, 0xd9, 0x79, 0xa7, 0x11, 0x8d, 0xe8, 0xe4, 0x08, 0x1c, 0xed, 0xf0, 0xb4, + 0x95, 0x7f, 0x98, 0x8a, 0xbb, 0x81, 0xa8, 0xf0, 0x59, 0xed, 0xaa, 0x0e, 0x76, 0x91, 0xc9, 0x81, + 0xfe, 0x52, 0x14, 0xcd, 0x60, 0xf3, 0x6f, 0x1f, 0x3f, 0x85, 0x9e, 0xa3, 0xc9, 0xf9, 0x39, 0x1f, + 0x77, 0xd0, 0x73, 0x72, 0x02, 0xda, 0xc0, 0x98, 0xd4, 0x6a, 0xd3, 0x5a, 0x2a, 0x85, 0xe7, 0xb4, + 0x7b, 0x23, 0x3a, 0xcc, 0x5e, 0x2f, 0xd9, 0xf2, 0xc5, 0x22, 0x2d, 0x22, 0xfd, 0x4f, 0xb2, 0xdc, + 0xc9, 0xec, 0xc4, 0x9d, 0x8d, 0x5a, 0x2c, 0xf7, 0x08, 0x0c, 0x77, 0x74, 0x46, 0xc7, 0xa7, 0x27, + 0x9d, 0x96, 0x6b, 0xcc, 0x69, 0xdb, 0x96, 0x8c, 0x62, 0x0b, 0x63, 0x0b, 0x77, 0x26, 0x1c, 0xea, + 0x90, 0x86, 0xe7, 0x20, 0xea, 0xf8, 0x83, 0x5c, 0x1e, 0x98, 0x17, 0x29, 0x33, 0xe1, 0xad, 0x89, + 0x39, 0x24, 0xb6, 0x8a, 0x47, 0x0c, 0x16, 0x51, 0xd3, 0xa6, 0x56, 0x8b, 0x33, 0x9c, 0x7b, 0x47, + 0xae, 0x7a, 0x76, 0xe2, 0xf9, 0x0f, 0xa4, 0xe7, 0x06, 0x2c, 0x4d, 0xa7, 0x16, 0x3e, 0x1c, 0x61, + 0x10, 0x18, 0x13, 0x12, 0x3e, 0xaa, 0x0c, 0x43, 0x30, 0xe9, 0x11, 0x4c, 0x65, 0xc5, 0x54, 0x33, + 0x13, 0xad, 0x80, 0xd4, 0xb2, 0x40, 0x89, 0xc9, 0x87, 0xf5, 0xdd, 0x87, 0x72, 0xe5, 0xfa, 0x7e, + 0xc2, 0x2a, 0x80, 0x71, 0x83, 0x08, 0x9d, 0xd6, 0x15, 0x92, 0x49, 0xf0, 0xcd, 0x09, 0x31, 0x6f, + 0x4e, 0xa0, 0x8a, 0x1d, 0x0e, 0x87, 0x97, 0x07, 0x80, 0x0a, 0xdf, 0x9d, 0x44, 0xa2, 0x3c, 0xef, + 0xa9, 0xad, 0x5d, 0x80, 0x17, 0x6b, 0x94, 0x1a, 0xb2, 0xae, 0x7a, 0xb7, 0x22, 0x49, 0xd6, 0xb4, + 0x89, 0x33, 0xe2, 0xdc, 0x4b, 0xc9, 0x1f, 0xd8, 0x03, 0xbb, 0x55, 0xd8, 0x9e, 0x19, 0xfc, 0x97, + 0x07, 0xed, 0xf8, 0x4b, 0x29, 0x58, 0xa4, 0x67, 0x96, 0xa8, 0xe7, 0x9b, 0x99, 0x2a, 0xee, 0x90, + 0xe1, 0x2c, 0x28, 0x40, 0x30, 0x91, 0x90, 0x2a, 0x03, 0x83, 0x03, 0x10, 0x93, 0x91, 0x48, 0xb0, + 0xa8, 0x72, 0x3b, 0x10, 0x48, 0x2e, 0x03, 0xbf, 0x80, 0xaa, 0x65, 0x21, 0x52, 0x4f, 0x42, 0x88, + 0x9b, 0x91, 0x65, 0xc2, 0xe7, 0x53, 0xeb, 0xc0, 0xba, 0x7a, 0x23, 0x42, 0x7e, 0x79, 0xc0, 0xf0, + 0xd0, 0xeb, 0x61, 0x51, 0xea, 0x0a, 0xca, 0x02, 0xa2, 0xcb, 0x00, 0xd2, 0x48, 0xfd, 0x16, 0x81, + 0xcd, 0x64, 0x00, 0x5c, 0x64, 0x09, 0x6e, 0xb2, 0xae, 0xf5, 0x63, 0x21, 0x7c, 0xa6, 0xf4, 0x52, + 0x3c, 0x4e, 0xad, 0x11, 0x44, 0xf4, 0x09, 0xfe, 0x6f, 0x1d, 0xa0, 0x04, 0x02, 0xff, 0xf3, 0x49, + 0x7a, 0x5e, 0x2a, 0xb2, 0x91, 0x18, 0x2d, 0xad, 0xfc, 0x38, 0xb0, 0xae, 0x34, 0xb5, 0x88, 0x1c, + 0x3e, 0x33, 0x7c, 0x49, 0x65, 0x24, 0x8e, 0x52, 0xc6, 0x49, 0xc5, 0x45, 0x6d, 0xc9, 0x8d, 0xb2, + 0xa7, 0x22, 0x1d, 0x92, 0x2a, 0xdc, 0x92, 0x32, 0x3d, 0x11, 0xa8, 0x04, 0x09, 0x56, 0x7e, 0x48, + 0x4a, 0x5c, 0x0a, 0xbe, 0x28, 0x09, 0x40, 0xb4, 0x77, 0x4b, 0x16, 0xdd, 0x93, 0xb5, 0xc8, 0xc8, + 0x7f, 0xfe, 0xdb, 0x7f, 0x10, 0xd8, 0xd3, 0x10, 0x3f, 0x4a, 0x25, 0x0b, 0x02, 0xbc, 0x64, 0x91, + 0x4b, 0xae, 0xac, 0x22, 0x34, 0x46, 0x71, 0x2b, 0xe6, 0x72, 0x05, 0x25, 0xfb, 0x90, 0xfc, 0xd7, + 0xbf, 0xff, 0xeb, 0xbf, 0x5c, 0x1e, 0xc4, 0x88, 0xf5, 0xaa, 0xf7, 0x17, 0x80, 0x5e, 0x32, 0x30, + 0x1e, 0x1e, 0x61, 0x29, 0xee, 0x29, 0xb8, 0xf2, 0x8e, 0xec, 0xbd, 0xf0, 0x00, 0xe0, 0x6d, 0x44, + 0xf0, 0x86, 0x8c, 0xfc, 0xc8, 0x67, 0xaa, 0x6a, 0x9f, 0x43, 0xc5, 0xaf, 0x96, 0x5d, 0x81, 0xe0, + 0xc9, 0x8c, 0x13, 0x84, 0x24, 0xa0, 0x17, 0xd8, 0x7a, 0x62, 0x7f, 0x82, 0x4f, 0xb5, 0x60, 0xeb, + 0x9c, 0x0e, 0xc1, 0xa4, 0xd5, 0x42, 0x5b, 0xd2, 0xa8, 0x5d, 0xf4, 0xb6, 0xfa, 0xcd, 0x67, 0x99, + 0x27, 0x04, 0x2f, 0x4b, 0xf3, 0xf2, 0x8e, 0xcb, 0xbf, 0x4f, 0xf5, 0x15, 0x26, 0x52, 0xa3, 0x6e, + 0x52, 0x15, 0x39, 0xfa, 0x31, 0x08, 0xb9, 0x09, 0x38, 0xd8, 0x24, 0xde, 0x75, 0x10, 0x46, 0x34, + 0x34, 0x11, 0x73, 0x32, 0x26, 0x7d, 0x58, 0x74, 0x40, 0xfe, 0xc9, 0x1c, 0x66, 0x53, 0x60, 0xc9, + 0x65, 0x19, 0xcc, 0x54, 0x5c, 0x17, 0x4c, 0xa2, 0x57, 0x81, 0x7c, 0xfc, 0x48, 0x89, 0x48, 0x21, + 0xc7, 0x0b, 0xd1, 0x8a, 0xc9, 0xf8, 0xea, 0x23, 0x48, 0x1b, 0x44, 0x09, 0x1a, 0x28, 0xd0, 0xcf, + 0x13, 0x11, 0xaa, 0xf9, 0x8a, 0x04, 0xc2, 0x22, 0x0f, 0xb8, 0xf2, 0xdd, 0x7b, 0x62, 0x2e, 0x89, + 0x87, 0x1a, 0x54, 0x6f, 0x8e, 0xb4, 0x3d, 0xcd, 0x64, 0x84, 0xc8, 0x2d, 0x88, 0x6e, 0x6a, 0x2a, + 0x58, 0x5d, 0xfd, 0xa5, 0x43, 0xc3, 0x1a, 0x60, 0xfb, 0x64, 0xab, 0xc7, 0x60, 0xd6, 0xd5, 0x77, + 0x82, 0xbc, 0x84, 0xa8, 0x67, 0xe4, 0xad, 0x11, 0xa2, 0xa9, 0x1b, 0xd4, 0xed, 0x98, 0x6b, 0xd7, + 0xbd, 0x5d, 0x78, 0x15, 0x9d, 0x0a, 0x6b, 0xaf, 0x44, 0x5b, 0x2a, 0xb4, 0x4b, 0xaf, 0xe3, 0xbd, + 0x7a, 0xed, 0xed, 0x2a, 0x76, 0xaf, 0x5e, 0x6f, 0x70, 0x8b, 0xb9, 0x57, 0x65, 0x44, 0x44, 0x95, + 0x94, 0x9b, 0x32, 0x6d, 0x30, 0xde, 0xab, 0x64, 0x5a, 0x5d, 0xa8, 0x77, 0x71, 0xfe, 0x01, 0x9c, + 0x9d, 0xe0, 0x9c, 0xa6, 0x4c, 0x49, 0x19, 0xad, 0xbb, 0xb8, 0x9f, 0x7c, 0x4d, 0xab, 0xbe, 0x16, + 0xd1, 0x02, 0x6f, 0x42, 0x02, 0x75, 0xb4, 0x96, 0x3e, 0x23, 0x77, 0x4b, 0xf3, 0x3e, 0x80, 0x80, + 0x71, 0x46, 0x62, 0xa5, 0x2e, 0x76, 0xd7, 0x68, 0xf0, 0x60, 0xb2, 0x43, 0xa3, 0xa9, 0xbd, 0x5a, + 0xff, 0x6c, 0x7b, 0x7a, 0x82, 0xe6, 0xcb, 0x77, 0x2a, 0x3b, 0xfc, 0x91, 0xad, 0xd4, 0x89, 0xef, + 0x36, 0x7b, 0x97, 0xaa, 0x84, 0x2a, 0x0c, 0xa1, 0x51, 0xd8, 0x12, 0x5d, 0x03, 0x60, 0xe8, 0x9b, + 0x40, 0x0c, 0x3c, 0x24, 0x3b, 0x55, 0x76, 0x4b, 0xb8, 0x84, 0x5f, 0x65, 0x64, 0x24, 0xa1, 0x57, + 0x94, 0x91, 0xa4, 0xaa, 0xe3, 0x30, 0x57, 0x1a, 0x1a, 0x2f, 0x55, 0x01, 0x87, 0xe9, 0xa5, 0x9d, + 0x88, 0xc3, 0xff, 0x51, 0x22, 0xd4, 0x69, 0x59, 0x93, 0x84, 0xed, 0xd8, 0xae, 0x13, 0x5c, 0x08, + 0x48, 0x30, 0xfa, 0xdf, 0x16, 0x37, 0x98, 0xa4, 0xef, 0xe3, 0x95, 0xaa, 0x3b, 0x1c, 0x18, 0xf0, + 0xde, 0xa5, 0x3a, 0x9a, 0x29, 0xe0, 0x31, 0x61, 0xd4, 0x08, 0x80, 0x96, 0xe1, 0xa2, 0x22, 0xd5, + 0x52, 0xda, 0xda, 0xb9, 0x1a, 0xdd, 0x96, 0x45, 0x07, 0x25, 0x7f, 0xba, 0xbe, 0x26, 0xfa, 0x46, + 0x14, 0xef, 0x6e, 0x0d, 0x11, 0x86, 0x86, 0xde, 0x6f, 0x24, 0x62, 0xe7, 0x92, 0xf5, 0x77, 0xd2, + 0xcb, 0x8f, 0xfe, 0xdc, 0xff, 0x2c, 0xad, 0xdc, 0xbe, 0x7d, 0xf5, 0x85, 0x12, 0x68, 0x5c, 0x19, + 0x3e, 0x51, 0x05, 0x37, 0xe6, 0x1e, 0xf2, 0x2b, 0x2d, 0x5d, 0x5e, 0x6b, 0xfe, 0x5e, 0xde, 0x80, + 0x81, 0xec, 0x73, 0xc4, 0xfe, 0xa3, 0xce, 0x01, 0xdf, 0xab, 0x6b, 0x89, 0x2f, 0xb5, 0xc0, 0xdd, + 0xfb, 0xef, 0x27, 0x6a, 0xa1, 0xcc, 0x3b, 0xaf, 0xf4, 0xc5, 0xf7, 0x57, 0x21, 0x64, 0xfb, 0x32, + 0xfd, 0x89, 0xb4, 0x5c, 0x57, 0x17, 0xdc, 0xe4, 0xae, 0xba, 0x37, 0xff, 0x02, 0x92, 0x7a, 0x15, + 0x4d, 0xfb, 0xef, 0xe4, 0x9f, 0xa6, 0xb2, 0x5e, 0x9d, 0xc2, 0x6f, 0xd5, 0x1d, 0x7c, 0x93, 0xb8, + 0x2f, 0xa7, 0xad, 0x79, 0xb3, 0xdf, 0x95, 0xfc, 0xcb, 0xcc, 0x54, 0x18, 0x20, 0xa9, 0x6d, 0xe0, + 0xc9, 0x12, 0xb7, 0x59, 0x4e, 0xd1, 0x73, 0x54, 0xec, 0x68, 0x74, 0x81, 0x5e, 0xd1, 0x85, 0x47, + 0xc1, 0xb8, 0x4b, 0x3c, 0x22, 0xd5, 0x19, 0x33, 0xd9, 0xda, 0x4c, 0x17, 0xb8, 0x6a, 0xbd, 0xc7, + 0x95, 0x8f, 0x34, 0xca, 0x90, 0xad, 0x37, 0x93, 0x5d, 0xd9, 0xf8, 0x85, 0x0a, 0x91, 0xc4, 0xb8, + 0x4b, 0xa3, 0x1c, 0xe9, 0xfd, 0x2e, 0x8e, 0xfb, 0xfe, 0x8f, 0x77, 0x77, 0xa5, 0xdf, 0xea, 0x5a, + 0xe0, 0x29, 0x41, 0x53, 0x3d, 0x8d, 0x29, 0xb4, 0x1f, 0x5f, 0x69, 0x56, 0xb0, 0xd5, 0x2b, 0x20, + 0x6b, 0xf3, 0xf0, 0x1f, 0x72, 0x10, 0xd8, 0xba, 0xbc, 0xbd, 0x29, 0x57, 0x52, 0x65, 0xc7, 0x6f, + 0x75, 0xb3, 0xfa, 0xeb, 0x9c, 0x27, 0x3a, 0xd7, 0x0f, 0xe9, 0x17, 0x3b, 0x77, 0xf5, 0x8e, 0xe7, + 0x7f, 0x37, 0xc4, 0x37, 0x5f, 0x06, 0x3d, 0x75, 0x6d, 0x91, 0xc8, 0xaf, 0xb2, 0x2e, 0xbe, 0x6c, + 0xda, 0x29, 0xf7, 0x2b, 0xfb, 0xf9, 0x26, 0x9a, 0xa5, 0xf1, 0x45, 0x51, 0x45, 0xee, 0xf3, 0xd6, + 0x6e, 0x17, 0x3d, 0x7d, 0xaa, 0x8b, 0xee, 0xb8, 0xa7, 0x21, 0xb9, 0x6e, 0xd1, 0x35, 0x9f, 0x6c, + 0x3e, 0x3d, 0xeb, 0xdc, 0x17, 0xe1, 0xa6, 0xb9, 0xaa, 0x28, 0xb7, 0x5c, 0xb2, 0x56, 0x1e, 0x17, + 0x8c, 0x40, 0xc2, 0x85, 0x58, 0x05, 0x40, 0x40, 0xde, 0x21, 0x89, 0x03, 0x20, 0x2f, 0x4e, 0xec, + 0xf1, 0x88, 0xc0, 0xae, 0x54, 0x5d, 0x91, 0xe8, 0x77, 0x07, 0x9a, 0xa5, 0x04, 0x04, 0x8a, 0x94, + 0x02, 0xaf, 0xf8, 0x73, 0xdc, 0x70, 0x54, 0x13, 0x05, 0x6b, 0x2f, 0x12, 0xdb, 0x4f, 0x9f, 0xd4, + 0xfd, 0x9b, 0x05, 0x11, 0x43, 0xeb, 0x22, 0x26, 0x4d, 0x28, 0xf5, 0xdc, 0xf1, 0xaa, 0xf7, 0x82, + 0xa4, 0x7e, 0x88, 0xb7, 0xae, 0x6a, 0x22, 0x6c, 0x77, 0xe5, 0x52, 0xd1, 0xa0, 0x36, 0xab, 0x8c, + 0xa8, 0x4b, 0x1e, 0xe2, 0x43, 0x39, 0x5f, 0x39, 0x6b, 0xc9, 0x13, 0x9b, 0xa5, 0x22, 0xc8, 0x40, + 0xf8, 0x7e, 0x04, 0xc1, 0xd7, 0x5e, 0xdb, 0x23, 0x3d, 0x1f, 0xbe, 0x77, 0x4e, 0x54, 0x48, 0x98, + 0xd8, 0x47, 0xd6, 0xd6, 0xa1, 0xce, 0x0a, 0xa4, 0xb0, 0x84, 0xbf, 0x78, 0x84, 0x63, 0x9b, 0x13, + 0x9c, 0xee, 0xc3, 0x9b, 0x7a, 0x10, 0xf8, 0x6d, 0xc2, 0x05, 0x79, 0x2e, 0x12, 0xce, 0xa3, 0x3d, + 0x12, 0x2d, 0x9e, 0x75, 0x7e, 0xae, 0x4c, 0xeb, 0x8f, 0x48, 0xaf, 0x7a, 0x35, 0x61, 0xfd, 0x5f, + 0x90, 0x55, 0xe3, 0x0b, 0xb7, 0x73, 0xc2, 0x5b, 0xab, 0xd3, 0x54, 0xfc, 0x77, 0x7f, 0xff, 0x0d, + 0x78, 0xe6, 0x68, 0x28, 0x07, 0x38, 0x00, 0x00 }; \ No newline at end of file From a14569dac96f8f44f7b8b1123b1d15982d0d6d40 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 14:45:17 +0200 Subject: [PATCH 32/99] :sparkles: Added new configuration webinterface At the moment you will be able to configure manually the wifi, mqtt, scale and system settings (sleeptime and so on). Thie will fullfil the feature #14 --- html/index.htm | 2 + html/index.js | 15 +- src/html/html_ui.h | 538 ++++++++++++++++++++++----------------------- 3 files changed, 274 insertions(+), 281 deletions(-) diff --git a/html/index.htm b/html/index.htm index 2a228ba..c079594 100644 --- a/html/index.htm +++ b/html/index.htm @@ -38,6 +38,8 @@

    Thank you ❤ for installing the Hivemonitor Software. 👍

    You have enabled the Settings Mode. In this Webinterface you will be able to set your configs.

    +

    For suggestions and Bugs please go to my Github project

    diff --git a/html/index.js b/html/index.js index 77b03b6..5cbb6cb 100644 --- a/html/index.js +++ b/html/index.js @@ -1,14 +1,5 @@ var ActualPage = "INDEX"; -var cfg = { - theme: { base: "dark", bg: { url: "" }, alpha: { bg: 0.6, tab: 0.8 }, color: { bg: "" } }, - comp: { - colors: { picker: true, rgb: false, quick: true, hex: false }, - labels: true, pcmbot: false, pid: true, seglen: false, css: true, hdays: false - } -}; - - var d = document; function onLoad() { hideAllControls(); @@ -17,10 +8,11 @@ function onLoad() { setInitialPage(); setDisplay("cv", "none"); GetSettings(); - } + function GetSettings() { read("settings").then((data) => { + console.debug(data); setTextBoxValue("system_sleeptime", data.system.sleeptime); setTextBoxValue("system_vccadjustsetting", data.system.vccadjustsetting); @@ -151,8 +143,9 @@ function read(uri) { req.addEventListener('error', function (e) { showToastMessage("Error while getting Data ", true); reject(); }); req.open("GET", uri); req.onload = function (data) { - resolve(data); + resolve(JSON.parse(req.response)); } + req.send(); }) return prom; } diff --git a/src/html/html_ui.h b/src/html/html_ui.h index 06c9c9f..c77624e 100644 --- a/src/html/html_ui.h +++ b/src/html/html_ui.h @@ -4,276 +4,274 @@ */ // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4296; + const uint16_t PAGE_index_L = 4271; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x92, 0xdb, 0x46, - 0x76, 0xef, 0xfc, 0x8a, 0x16, 0x54, 0x71, 0xc8, 0x54, 0x83, 0x43, 0x72, 0xee, 0x98, 0xe1, 0xa4, - 0xa4, 0x91, 0x6c, 0x69, 0x23, 0xc9, 0xb3, 0x9a, 0xf1, 0x7a, 0xb7, 0x36, 0x2e, 0x57, 0x13, 0x68, - 0x92, 0xf0, 0x00, 0x68, 0x18, 0x68, 0x0c, 0x87, 0x8b, 0xe2, 0x27, 0xe4, 0x21, 0x1f, 0x90, 0xca, - 0x4b, 0xbe, 0x2c, 0x5f, 0x90, 0x4f, 0xc8, 0x39, 0xdd, 0x8d, 0x1b, 0x09, 0x50, 0x23, 0x4b, 0x89, - 0x53, 0xb1, 0x2c, 0x92, 0x7d, 0x39, 0xa7, 0xcf, 0xfd, 0x9c, 0xbe, 0xe8, 0xf2, 0xd9, 0xab, 0xef, - 0xaf, 0xef, 0xfe, 0x72, 0xf3, 0x9a, 0x2c, 0x65, 0x18, 0x5c, 0x91, 0x4b, 0xfc, 0x22, 0x01, 0x8b, - 0x16, 0x53, 0x8b, 0x47, 0x16, 0x76, 0x70, 0xe6, 0xc1, 0x57, 0xc8, 0x25, 0x23, 0x11, 0x0b, 0xf9, - 0xd4, 0x7a, 0xf0, 0xf9, 0x2a, 0x16, 0x89, 0xb4, 0x48, 0xcf, 0x15, 0x91, 0xe4, 0x91, 0x9c, 0x5a, - 0x2b, 0xdf, 0x93, 0xcb, 0xa9, 0xc7, 0x1f, 0x7c, 0x97, 0xdb, 0xaa, 0x41, 0xfd, 0xc8, 0x97, 0x3e, - 0x0b, 0xec, 0xd4, 0x65, 0x01, 0x9f, 0x8e, 0x69, 0x08, 0x1d, 0x61, 0x16, 0x16, 0x6d, 0xab, 0x40, - 0xda, 0x73, 0x97, 0x2c, 0x49, 0x39, 0x20, 0xc9, 0xe4, 0xdc, 0x3e, 0xb3, 0x9a, 0x8b, 0xc9, 0x25, - 0x0f, 0xb9, 0xed, 0x8a, 0x40, 0x24, 0x16, 0x29, 0x97, 0x7b, 0x3e, 0x51, 0xff, 0xd5, 0x70, 0x14, - 0x23, 0x6b, 0x9e, 0x5a, 0x06, 0x94, 0xc5, 0x71, 0xc0, 0xed, 0x50, 0xcc, 0x7c, 0xf8, 0x5a, 0xf1, - 0x99, 0x0d, 0x1d, 0xb6, 0xcb, 0x62, 0x36, 0x0b, 0x38, 0x42, 0x4a, 0x5f, 0x06, 0xfc, 0xea, 0x8d, - 0xff, 0xc0, 0xed, 0xf7, 0x02, 0x88, 0x15, 0xc9, 0xe5, 0x81, 0xee, 0x23, 0xbd, 0xcb, 0xd4, 0x4d, - 0xfc, 0x58, 0x5e, 0xf5, 0x1e, 0x58, 0x42, 0xa4, 0x1f, 0x72, 0x91, 0x49, 0xfa, 0xc2, 0x95, 0x19, - 0x0b, 0x6e, 0xd8, 0x02, 0x90, 0xbf, 0xfd, 0xf0, 0xea, 0xf5, 0x9f, 0x2d, 0xea, 0xce, 0x17, 0xd3, - 0x5c, 0xd1, 0xe8, 0xe4, 0x33, 0x96, 0x72, 0xc7, 0xf2, 0x58, 0x72, 0x6f, 0xd1, 0xd9, 0xc2, 0xc9, - 0xb3, 0x24, 0x70, 0x2c, 0x6b, 0x43, 0x59, 0x10, 0x2f, 0x19, 0x0c, 0x2f, 0x9c, 0xe1, 0x09, 0x95, - 0x6c, 0xe6, 0x0c, 0xcf, 0x36, 0x54, 0x71, 0xa4, 0x3a, 0x61, 0x0a, 0x36, 0xc3, 0xd8, 0xc9, 0x55, - 0x67, 0xea, 0xe4, 0xb1, 0xef, 0xde, 0xf3, 0xc4, 0x79, 0x36, 0xa2, 0xc9, 0x62, 0xe6, 0x3c, 0x1b, - 0xd3, 0x5f, 0x33, 0xe8, 0xc1, 0xf6, 0x92, 0x3f, 0x42, 0x7b, 0x43, 0x03, 0x36, 0xe3, 0x41, 0x8a, - 0x3d, 0xb1, 0x1b, 0xce, 0x84, 0xc4, 0x49, 0xb1, 0xef, 0x61, 0x47, 0xca, 0x17, 0x01, 0x8f, 0xb0, - 0xc3, 0x4d, 0xd5, 0x8c, 0xa5, 0xc7, 0xd6, 0x29, 0x42, 0x6d, 0xa8, 0x37, 0xf5, 0x84, 0x9b, 0x85, - 0x20, 0xa9, 0x8b, 0x79, 0x16, 0xb9, 0xd2, 0x17, 0x11, 0x11, 0xd1, 0x3b, 0xc1, 0xbc, 0xfe, 0x20, - 0x5f, 0xfa, 0x1e, 0x7f, 0x11, 0x04, 0xd7, 0x20, 0xca, 0x44, 0x04, 0x69, 0x7f, 0x40, 0x63, 0x54, - 0xcc, 0x1f, 0x33, 0x9e, 0xac, 0xa1, 0x01, 0x2a, 0x7a, 0x99, 0x80, 0x31, 0x5c, 0x27, 0x59, 0x38, - 0xd3, 0xed, 0xb7, 0x5a, 0xc5, 0x28, 0x11, 0xdd, 0xf1, 0xca, 0x4f, 0xe3, 0x80, 0xad, 0xfb, 0x96, - 0xfb, 0x60, 0x51, 0x2b, 0x12, 0x11, 0xb7, 0x06, 0xf4, 0x3b, 0x2e, 0x6f, 0xb9, 0x94, 0x7e, 0xb4, - 0x00, 0x9c, 0x9b, 0x72, 0xdd, 0x46, 0x77, 0x8e, 0x98, 0xfb, 0x56, 0x6a, 0x3a, 0xac, 0xc1, 0x10, - 0x84, 0x1a, 0xf5, 0xf9, 0xf4, 0x2a, 0x87, 0xbe, 0x3b, 0xfe, 0x28, 0x5f, 0x8a, 0xc7, 0x3f, 0xb1, - 0x20, 0xe3, 0x30, 0x69, 0x9d, 0x4a, 0x1e, 0xfe, 0x9c, 0x06, 0x9c, 0xc7, 0xa8, 0x1a, 0x8b, 0xf2, - 0xa1, 0xee, 0x1b, 0x96, 0x7d, 0x8a, 0x9a, 0x56, 0xb0, 0x07, 0xd7, 0x65, 0xde, 0x2f, 0x59, 0x2a, - 0xcd, 0x5a, 0x35, 0xe8, 0xed, 0xa1, 0x16, 0x24, 0xe1, 0xaf, 0x52, 0xfe, 0x9c, 0xf2, 0xe4, 0x81, - 0x27, 0x08, 0x88, 0xcd, 0xa1, 0x6e, 0x76, 0x4d, 0xce, 0xd2, 0xda, 0x54, 0x6c, 0x74, 0x4d, 0x8c, - 0x59, 0x9a, 0xae, 0x44, 0xe2, 0x95, 0x93, 0x8b, 0x8e, 0x4e, 0x00, 0xf4, 0xc1, 0x72, 0x32, 0x34, - 0xda, 0x98, 0x46, 0x67, 0xfb, 0x79, 0xc5, 0xfd, 0xc5, 0x52, 0x8a, 0xf9, 0x1c, 0xc6, 0x15, 0xbf, - 0xd8, 0x3b, 0xac, 0xf7, 0x76, 0x82, 0xde, 0xfb, 0x81, 0x58, 0x24, 0x2c, 0xf4, 0xfc, 0x07, 0x30, - 0x8f, 0xa4, 0x82, 0xde, 0x1a, 0xe8, 0x44, 0x00, 0x1f, 0xfe, 0x2c, 0x61, 0xa8, 0x72, 0x90, 0x71, - 0xcc, 0xe1, 0x67, 0x96, 0xf0, 0xba, 0xf0, 0x15, 0xba, 0xbd, 0xd3, 0x9e, 0x82, 0x7c, 0xce, 0x5c, - 0xf0, 0xe0, 0x7d, 0x78, 0xf5, 0x8c, 0xdb, 0x4e, 0x94, 0x2b, 0x3f, 0xe1, 0x01, 0x4f, 0x1b, 0x8a, - 0x30, 0x7d, 0xfb, 0x74, 0x51, 0x80, 0xa5, 0xa9, 0xdf, 0x00, 0xc1, 0xf6, 0x60, 0x53, 0x33, 0xf8, - 0x6d, 0x87, 0xc9, 0xd3, 0x95, 0x2f, 0xdd, 0x65, 0xbf, 0x0a, 0x2b, 0x83, 0xdc, 0x85, 0x18, 0x62, - 0x62, 0x8b, 0x23, 0xc5, 0x02, 0x3c, 0xf9, 0x6d, 0xe4, 0xf1, 0xc7, 0xfe, 0xe0, 0x62, 0x06, 0x1e, - 0x72, 0x7f, 0xa1, 0xc6, 0xef, 0x5e, 0x7c, 0x7c, 0x8d, 0xc3, 0x02, 0x86, 0x5f, 0x64, 0x52, 0xdc, - 0xb1, 0x84, 0xef, 0xce, 0x18, 0x5b, 0x4e, 0xc3, 0x23, 0x71, 0xd6, 0xad, 0xe4, 0xf1, 0x18, 0x3c, - 0x73, 0x16, 0x08, 0xf7, 0xde, 0xda, 0x01, 0x99, 0x74, 0x80, 0x4c, 0x2a, 0x90, 0x4d, 0xc5, 0x4f, - 0x3d, 0x3a, 0xe4, 0x18, 0x27, 0xf9, 0x34, 0xe2, 0x2b, 0xf2, 0xc3, 0xc7, 0x77, 0xb7, 0x9c, 0x25, - 0xee, 0xf2, 0x86, 0x81, 0x79, 0xa4, 0xfd, 0x22, 0xe2, 0x0c, 0x01, 0x81, 0xd2, 0x03, 0x38, 0x0c, - 0x0e, 0x0f, 0x2e, 0xa2, 0x2c, 0x08, 0xa6, 0xd3, 0x1a, 0xff, 0x53, 0x3e, 0x5c, 0x70, 0xd9, 0xb7, - 0x62, 0xf8, 0x6d, 0x0d, 0x06, 0xdf, 0x7c, 0xd3, 0xdf, 0x0d, 0xb9, 0x35, 0x81, 0x36, 0x04, 0xd4, - 0x12, 0xbe, 0xea, 0xbc, 0xac, 0x78, 0x00, 0x31, 0x96, 0x57, 0x8c, 0x34, 0xc3, 0x55, 0x11, 0x89, - 0x6a, 0x8c, 0x96, 0xcb, 0xec, 0x20, 0xce, 0x5b, 0x85, 0x34, 0xaa, 0x22, 0x5e, 0xa7, 0xdc, 0xf7, - 0x8d, 0x4f, 0x3a, 0xc6, 0x6b, 0xa4, 0xb5, 0x0c, 0x57, 0x7c, 0xb5, 0xc1, 0x56, 0x51, 0xb8, 0x61, - 0x86, 0xc5, 0x04, 0x4e, 0xa5, 0xd6, 0x5c, 0x5a, 0xe6, 0x05, 0x54, 0xc0, 0xeb, 0x80, 0xe3, 0xcf, - 0x97, 0xeb, 0xb7, 0x5e, 0x9f, 0x0f, 0x2e, 0xc0, 0x94, 0xe5, 0x1a, 0x5c, 0xc9, 0xd3, 0x50, 0x53, - 0x23, 0xa1, 0xe9, 0x74, 0x2a, 0xff, 0xd1, 0x02, 0x3b, 0xac, 0x2b, 0xa4, 0x69, 0x92, 0x79, 0x5d, - 0x7d, 0xca, 0x6a, 0xe9, 0x7e, 0x2d, 0x35, 0x84, 0xb9, 0xa3, 0x08, 0x98, 0x59, 0x53, 0x42, 0x2b, - 0xa6, 0xbd, 0x19, 0xaa, 0x81, 0xa9, 0x3e, 0xd3, 0x58, 0x6f, 0x97, 0x0c, 0xac, 0x38, 0x00, 0x5f, - 0xf9, 0x84, 0xb7, 0xf2, 0xa1, 0x1f, 0x45, 0x3c, 0xc1, 0xd8, 0x30, 0xb5, 0x6e, 0x25, 0x83, 0xd8, - 0xbc, 0xeb, 0xb3, 0x75, 0xe7, 0xac, 0x7b, 0x5d, 0x03, 0x18, 0x65, 0x40, 0x6e, 0x31, 0x7a, 0x59, - 0x35, 0x6f, 0x93, 0x85, 0x99, 0x28, 0xfb, 0x8b, 0xbc, 0x57, 0x4c, 0xb2, 0x7e, 0xbe, 0xa1, 0x16, - 0x0e, 0xa4, 0xca, 0xbe, 0x6a, 0x49, 0x73, 0x5b, 0xf0, 0x60, 0x5c, 0x0d, 0xe9, 0x6d, 0x06, 0x10, - 0x19, 0x91, 0x9d, 0xfe, 0x00, 0x66, 0x37, 0xa2, 0x14, 0x92, 0x6e, 0xd4, 0xd7, 0xba, 0xce, 0x68, - 0xdf, 0x3a, 0xe3, 0xa7, 0xaf, 0x53, 0xe0, 0x56, 0x46, 0x98, 0x70, 0x08, 0xf7, 0x11, 0xc1, 0xf8, - 0x71, 0x93, 0x88, 0xd0, 0x4f, 0x79, 0xbf, 0x9f, 0x52, 0x86, 0x40, 0xa8, 0x1b, 0xa1, 0x22, 0xcb, - 0x9f, 0xdf, 0xbf, 0x7b, 0x23, 0x65, 0xfc, 0x91, 0xff, 0x9a, 0x01, 0x25, 0x17, 0x62, 0xc8, 0x3c, - 0xef, 0xf5, 0x03, 0x68, 0xe9, 0x9d, 0x0f, 0x84, 0x81, 0xfc, 0xfa, 0x56, 0x00, 0xa5, 0x8c, 0x45, - 0xfb, 0xc5, 0x2a, 0xc8, 0xc3, 0x52, 0xac, 0xee, 0x04, 0x4b, 0xe5, 0x7b, 0x9e, 0xa6, 0x68, 0x06, - 0x56, 0xe1, 0x50, 0x24, 0x65, 0x0f, 0xdc, 0x7b, 0x86, 0x3e, 0xd3, 0x97, 0x4b, 0x3f, 0x1d, 0x02, - 0x7f, 0xb1, 0x88, 0x52, 0x8e, 0x6a, 0x00, 0xca, 0x07, 0xb4, 0x6d, 0x05, 0x9e, 0x24, 0x50, 0x8a, - 0xd6, 0x96, 0xe0, 0x6d, 0x6b, 0xbc, 0xc6, 0x59, 0x64, 0xb5, 0x84, 0xd2, 0x13, 0x97, 0x81, 0xe5, - 0x48, 0xb1, 0xec, 0x33, 0x8b, 0x3e, 0x1b, 0x0d, 0x28, 0xeb, 0x9b, 0x25, 0x44, 0x0c, 0xb2, 0xb4, - 0x6e, 0xbe, 0xbf, 0xbd, 0xb3, 0x40, 0x12, 0xd0, 0x01, 0x02, 0x34, 0x2c, 0xbe, 0x01, 0x13, 0xc5, - 0x35, 0xaf, 0x75, 0x75, 0x6b, 0xdf, 0xad, 0x63, 0xf4, 0x74, 0x2c, 0x6c, 0x7d, 0x1d, 0x4b, 0x0f, - 0x7e, 0x49, 0x45, 0x64, 0x69, 0xa8, 0xc8, 0xeb, 0xff, 0xe1, 0xf6, 0xfb, 0x0f, 0xe0, 0xad, 0x09, - 0xac, 0xe3, 0xcf, 0xc1, 0xbf, 0x07, 0x8d, 0x04, 0xa4, 0x6a, 0x2c, 0xde, 0x2e, 0x6c, 0x49, 0xd3, - 0x42, 0xd8, 0xac, 0x4d, 0xd8, 0xec, 0xab, 0x88, 0x62, 0xa1, 0x65, 0x40, 0x50, 0xf1, 0x44, 0xcb, - 0x21, 0xd5, 0x72, 0x60, 0x46, 0x0e, 0xdf, 0xbd, 0x06, 0x31, 0x70, 0xd5, 0x8e, 0x50, 0x99, 0xd3, - 0x3a, 0x72, 0x09, 0x1f, 0x9b, 0x86, 0x11, 0x6d, 0xaf, 0x06, 0xc6, 0x34, 0x05, 0xac, 0x45, 0x50, - 0xdb, 0xf6, 0x64, 0x08, 0x58, 0x12, 0xa7, 0x2b, 0x9a, 0x50, 0xcd, 0x96, 0xa3, 0x3b, 0x6e, 0x33, - 0xd7, 0x05, 0x14, 0xaa, 0x0b, 0x16, 0xff, 0x04, 0xe4, 0x16, 0x14, 0x06, 0x87, 0x9a, 0x03, 0x73, - 0xea, 0x06, 0x90, 0xe1, 0xee, 0xf4, 0xae, 0xa1, 0x6f, 0x76, 0x0f, 0xc8, 0x52, 0x6b, 0x1c, 0xa5, - 0x66, 0xc2, 0x14, 0x2b, 0x0b, 0x03, 0x53, 0x37, 0xe0, 0x1d, 0x30, 0x08, 0x7c, 0x1e, 0xec, 0xcd, - 0x36, 0x03, 0x3a, 0x39, 0x1f, 0x8d, 0x6a, 0xd2, 0x58, 0x6c, 0x95, 0x26, 0x95, 0xaa, 0xbd, 0xdd, - 0xb0, 0x3e, 0x7c, 0xc0, 0x39, 0x6d, 0xc0, 0x1f, 0x20, 0x26, 0xf2, 0xa4, 0x44, 0xa1, 0x76, 0x40, - 0xd3, 0x4e, 0x0c, 0x17, 0x66, 0x09, 0x55, 0x0d, 0x7c, 0x0b, 0x2a, 0x03, 0x8e, 0x9b, 0x91, 0xb6, - 0x49, 0x13, 0x7a, 0x7b, 0x27, 0xb2, 0x69, 0x2d, 0x99, 0xa0, 0x77, 0xd6, 0x36, 0x08, 0x55, 0x2c, - 0xd2, 0xd5, 0xba, 0x93, 0x97, 0xc5, 0xbe, 0xd3, 0x4e, 0xfb, 0xee, 0x46, 0x61, 0x40, 0xb7, 0x4b, - 0xfc, 0x4f, 0x80, 0xee, 0x6c, 0x16, 0x06, 0x1b, 0x8a, 0xe5, 0x36, 0x2c, 0xae, 0x8a, 0x7e, 0x67, - 0xb1, 0x6f, 0x83, 0x00, 0x1b, 0x28, 0xa8, 0xca, 0xbb, 0x96, 0xa8, 0x6a, 0xf8, 0x01, 0xc5, 0x7d, - 0x41, 0x07, 0x2e, 0xb5, 0x7f, 0xc0, 0xad, 0x98, 0x2e, 0x40, 0x3b, 0x66, 0x95, 0x35, 0x2b, 0x10, - 0xa8, 0x0a, 0x5f, 0x27, 0xaf, 0x97, 0xf7, 0x9d, 0x6c, 0xee, 0x6e, 0x0f, 0x06, 0x74, 0xab, 0xb2, - 0xdf, 0x0f, 0xbb, 0xbd, 0x3f, 0x18, 0xd0, 0xbd, 0x95, 0xfc, 0x7e, 0x64, 0xfb, 0xf7, 0x0a, 0x0d, - 0xd4, 0x8d, 0x62, 0xfe, 0xc9, 0x58, 0x9b, 0x9b, 0x04, 0x90, 0x95, 0x29, 0xd6, 0x61, 0xcb, 0xdd, - 0x29, 0xdf, 0x9d, 0x6d, 0x01, 0xc4, 0x2c, 0x28, 0xed, 0xbb, 0x27, 0xaa, 0x8d, 0x00, 0xc4, 0x29, - 0x6a, 0xa5, 0xb0, 0x18, 0xff, 0xa2, 0xb4, 0xdc, 0xbb, 0x3c, 0x30, 0x27, 0x11, 0xe4, 0x52, 0x85, - 0x81, 0xab, 0x1e, 0x9e, 0xd0, 0xe4, 0x73, 0x00, 0xb1, 0xe7, 0x2c, 0xf4, 0x83, 0xb5, 0xa3, 0x6d, - 0xd5, 0xce, 0x7c, 0x6a, 0xeb, 0x23, 0x0f, 0xdd, 0x41, 0x5f, 0x06, 0x7e, 0x74, 0xff, 0x9e, 0xb9, - 0xb7, 0xaa, 0xf9, 0x2d, 0x40, 0x50, 0xc8, 0x7d, 0x0b, 0xc1, 0xc9, 0x0f, 0x6f, 0x2d, 0xfa, 0x51, - 0xcc, 0x84, 0x14, 0xd4, 0x7a, 0xc3, 0x83, 0x07, 0x2e, 0x21, 0x9d, 0x90, 0x0f, 0x3c, 0x83, 0xec, - 0xf2, 0x22, 0x81, 0x7a, 0x89, 0x5a, 0x1f, 0x60, 0x90, 0xdc, 0xb2, 0x08, 0xca, 0xce, 0x14, 0x3e, - 0x6d, 0xb0, 0x42, 0x7f, 0x4e, 0xad, 0x17, 0xb8, 0x00, 0xb9, 0xc6, 0x73, 0x0a, 0xf2, 0x3a, 0x14, - 0xbf, 0xf8, 0x56, 0x85, 0x73, 0xb7, 0xe3, 0x76, 0x1d, 0xce, 0x44, 0x60, 0x19, 0x6c, 0x75, 0xa8, - 0x0b, 0xa0, 0x8d, 0xdb, 0x4b, 0x65, 0x78, 0xce, 0x78, 0x78, 0xbc, 0x99, 0x65, 0x52, 0x8a, 0x88, - 0xfa, 0x51, 0x9c, 0x49, 0x2a, 0x62, 0xb9, 0x48, 0x44, 0x16, 0x83, 0x70, 0x02, 0xee, 0x4a, 0x2a, - 0x41, 0xce, 0x50, 0x7d, 0xb0, 0x06, 0xdb, 0x7e, 0xb4, 0x04, 0x9a, 0xe4, 0x85, 0xea, 0x4b, 0xfd, - 0xbf, 0x71, 0x67, 0x3c, 0x1a, 0xfd, 0xdd, 0x16, 0xe2, 0xf1, 0xf1, 0x45, 0xc8, 0x92, 0x85, 0x1f, - 0x39, 0xa3, 0xc6, 0x12, 0xb9, 0x00, 0x07, 0x9d, 0x07, 0x62, 0xe5, 0x3c, 0xf8, 0xa9, 0x3f, 0x0b, - 0x78, 0x31, 0xaa, 0x57, 0xcc, 0x71, 0x45, 0x5b, 0x26, 0xc0, 0xf9, 0x5c, 0x24, 0xa1, 0x83, 0x35, - 0xf4, 0xe6, 0xaf, 0x12, 0xd2, 0xef, 0x54, 0xcf, 0xfb, 0x89, 0xea, 0x96, 0xb2, 0xce, 0xa2, 0x91, - 0x66, 0xb3, 0xd0, 0x87, 0x96, 0x9e, 0x92, 0xe3, 0x99, 0xd3, 0xbd, 0x2f, 0x51, 0x29, 0x90, 0x0e, - 0x58, 0xe4, 0x72, 0x47, 0x8f, 0x34, 0x31, 0x39, 0x8e, 0x1d, 0x8a, 0xbf, 0xd9, 0x73, 0x28, 0x3e, - 0x53, 0x5b, 0x65, 0x91, 0x06, 0xee, 0xce, 0x61, 0xb3, 0x5a, 0xcb, 0xb8, 0x46, 0xbc, 0x3b, 0x90, - 0xcf, 0xc0, 0x7c, 0x79, 0x62, 0x2b, 0x43, 0x52, 0x3c, 0x5d, 0xc4, 0x90, 0xd5, 0xd1, 0x81, 0x46, - 0x5b, 0x34, 0x55, 0xa0, 0x58, 0x4b, 0x34, 0x09, 0x6a, 0x1d, 0x2b, 0xa8, 0xd9, 0x1a, 0x34, 0xa4, - 0x34, 0x7b, 0x73, 0x48, 0x71, 0xa8, 0x26, 0x67, 0x1c, 0x3f, 0x12, 0x4f, 0x48, 0xc9, 0x3d, 0xf2, - 0x52, 0x4d, 0x44, 0x87, 0xda, 0xcc, 0x7d, 0x1e, 0x78, 0xb0, 0x52, 0x5e, 0x10, 0x37, 0x3c, 0x3c, - 0xe6, 0x21, 0x19, 0x9e, 0xaa, 0xcf, 0x93, 0x09, 0x7c, 0x6d, 0x02, 0xbe, 0x80, 0x7c, 0x00, 0x0c, - 0x3d, 0xa2, 0xea, 0x71, 0x92, 0xe1, 0x0d, 0x7a, 0x2e, 0xf4, 0xd9, 0x5a, 0x61, 0x1f, 0x26, 0x6f, - 0x3a, 0x12, 0xcf, 0xfd, 0xc0, 0x1a, 0x1e, 0xf5, 0xf9, 0xa4, 0xb6, 0x96, 0x92, 0xff, 0x0b, 0x28, - 0x50, 0x24, 0xb8, 0x4e, 0xcc, 0x5c, 0x14, 0x4d, 0x12, 0xb2, 0x60, 0x13, 0x27, 0x10, 0xda, 0x20, - 0xbf, 0xe7, 0x60, 0x2b, 0xe8, 0x21, 0x81, 0x0d, 0x91, 0x64, 0x11, 0x39, 0x78, 0xd0, 0x87, 0xf4, - 0x6f, 0x4a, 0xbb, 0x2c, 0xad, 0x89, 0xc1, 0xde, 0xc7, 0x88, 0xd2, 0x5d, 0x72, 0xf7, 0x1e, 0xc8, - 0x29, 0x4d, 0x85, 0x79, 0xbe, 0xf8, 0xa9, 0x83, 0xe4, 0x6d, 0x3d, 0x44, 0x2a, 0x8c, 0xa1, 0x72, - 0x8d, 0x11, 0x29, 0x05, 0x02, 0x79, 0x7e, 0x64, 0x1b, 0x4b, 0xed, 0x98, 0x08, 0xb2, 0x6d, 0x4e, - 0xcc, 0x8d, 0x33, 0xd4, 0x48, 0xd3, 0x1b, 0xf0, 0x9f, 0xda, 0x2c, 0x14, 0x59, 0x52, 0x0a, 0xb8, - 0x30, 0x4a, 0xb2, 0x4d, 0x06, 0xb1, 0x27, 0xf1, 0x63, 0x13, 0xbc, 0x5a, 0x53, 0x77, 0xd8, 0x1e, - 0x77, 0x85, 0x8e, 0xb3, 0x6d, 0x98, 0x95, 0x0f, 0x55, 0x30, 0x73, 0x3c, 0x95, 0xcd, 0x62, 0xac, - 0xf1, 0xec, 0x4f, 0x39, 0x8c, 0xf2, 0xf1, 0x42, 0xa1, 0x1b, 0x8f, 0x4b, 0xe6, 0x07, 0x69, 0x5e, - 0x28, 0x56, 0x95, 0x51, 0x9b, 0x34, 0x0b, 0xc1, 0xd3, 0xd7, 0x65, 0x6f, 0x00, 0x65, 0xaa, 0x0d, - 0x2a, 0x0d, 0x37, 0x98, 0x4a, 0x02, 0x26, 0x79, 0x39, 0xa4, 0xbd, 0x59, 0x97, 0x51, 0x3f, 0x35, - 0x7b, 0x15, 0xae, 0x5f, 0x33, 0x21, 0x39, 0xf5, 0x3c, 0xea, 0x05, 0x74, 0xee, 0x2f, 0x20, 0x05, - 0xd1, 0xe5, 0x98, 0x2e, 0x27, 0x74, 0x79, 0x48, 0x97, 0x47, 0x74, 0x79, 0x4c, 0x97, 0x27, 0x74, - 0x99, 0xd0, 0x98, 0xc6, 0x09, 0xcf, 0xb7, 0xe2, 0x4b, 0x3e, 0x63, 0xee, 0x3d, 0x46, 0xaf, 0xc8, - 0xd3, 0xc7, 0xd6, 0x8e, 0x0a, 0x23, 0x50, 0x1e, 0xe1, 0xa9, 0x6b, 0x6d, 0xd0, 0x0f, 0x21, 0x0d, - 0x98, 0x55, 0xb5, 0x97, 0x28, 0x07, 0x69, 0x71, 0x8e, 0x42, 0x15, 0xce, 0x31, 0x74, 0xa1, 0x1a, - 0x49, 0x29, 0x44, 0xe5, 0xdc, 0xe8, 0x53, 0x7a, 0xad, 0xca, 0x77, 0x0a, 0xaa, 0x6a, 0x96, 0x25, - 0x02, 0x9a, 0x05, 0xb9, 0x92, 0x4b, 0x2d, 0x02, 0xb4, 0x4c, 0xfc, 0xff, 0x99, 0x61, 0xfe, 0x81, - 0x3a, 0x0e, 0x9b, 0x83, 0x73, 0xc0, 0xf7, 0x8c, 0x43, 0x58, 0xe7, 0x1d, 0xbe, 0x68, 0x7e, 0xea, - 0x28, 0x31, 0xba, 0x68, 0x04, 0xcd, 0x54, 0x04, 0xbe, 0x57, 0x74, 0x69, 0xf5, 0x3e, 0xe7, 0x13, - 0x7e, 0x36, 0x07, 0xa9, 0x95, 0xf1, 0x55, 0x8a, 0xb8, 0x88, 0x31, 0xe0, 0x33, 0x7e, 0xb8, 0xc8, - 0x77, 0x71, 0x54, 0xb1, 0x03, 0x22, 0x0c, 0x26, 0xaf, 0x22, 0xc6, 0x6c, 0x54, 0x7e, 0x82, 0x88, - 0x89, 0x41, 0x1b, 0x7e, 0xd9, 0x60, 0x9c, 0x2e, 0x5f, 0x8a, 0x00, 0x10, 0x94, 0x89, 0xb0, 0x7d, - 0x38, 0x37, 0x04, 0xb1, 0x11, 0xe3, 0xee, 0xc8, 0x20, 0xfa, 0x14, 0xa6, 0xcf, 0x41, 0xd5, 0x8e, - 0xa0, 0x1b, 0xec, 0xaf, 0x50, 0xd5, 0x54, 0x19, 0xd3, 0xf8, 0x87, 0x9b, 0x25, 0x29, 0xcc, 0x89, - 0x85, 0x0f, 0x45, 0x5e, 0xb2, 0x51, 0x61, 0x39, 0xaf, 0x24, 0x1a, 0xb0, 0x38, 0xe5, 0x4e, 0xf1, - 0x63, 0xb3, 0xe3, 0x78, 0x79, 0x95, 0xef, 0x1b, 0x15, 0x80, 0x2e, 0x62, 0xcb, 0x20, 0x31, 0x2c, - 0x14, 0x6a, 0x1f, 0xe5, 0xa5, 0x6e, 0x61, 0xfd, 0xd0, 0x68, 0xe6, 0x08, 0x34, 0x33, 0x8c, 0x1f, - 0x61, 0xd4, 0xd8, 0xbd, 0x1d, 0xf0, 0x39, 0x18, 0x4a, 0xc2, 0xc3, 0xc2, 0x13, 0xc0, 0xaf, 0x94, - 0xed, 0x40, 0x17, 0x4c, 0x5d, 0xdb, 0x93, 0x72, 0x2a, 0x28, 0xd8, 0x19, 0x1e, 0xd7, 0xa7, 0x6a, - 0xdc, 0xba, 0x73, 0x33, 0x0c, 0xed, 0x71, 0xe1, 0x80, 0xc3, 0x89, 0xe9, 0x92, 0x00, 0xaf, 0xfb, - 0x2a, 0x70, 0x40, 0x6b, 0x1f, 0x56, 0x69, 0xee, 0xb4, 0xe8, 0x1b, 0x57, 0x7d, 0x15, 0xf8, 0xb8, - 0x01, 0x6e, 0xfa, 0x81, 0x83, 0x71, 0x93, 0x03, 0x3d, 0xb2, 0xc5, 0x43, 0x39, 0x7d, 0x5d, 0x9b, - 0x5e, 0xe1, 0xd9, 0x61, 0xa3, 0xc2, 0x7e, 0xb2, 0x25, 0x9f, 0x61, 0x0b, 0xf6, 0xf1, 0xb0, 0xc4, - 0x7e, 0xd6, 0xc0, 0x3e, 0x69, 0xc1, 0x3d, 0x51, 0x53, 0x83, 0xc5, 0x3f, 0xab, 0x54, 0x63, 0x63, - 0x2e, 0xad, 0xa9, 0x54, 0x0b, 0x7b, 0x69, 0x1f, 0xe7, 0xa5, 0xe7, 0x1a, 0x5a, 0x56, 0x36, 0x46, - 0xbe, 0x5c, 0x6b, 0x4f, 0xe5, 0xb2, 0xa1, 0x42, 0x00, 0x9b, 0x8f, 0xb5, 0x7d, 0x34, 0x1a, 0xe5, - 0xb6, 0xad, 0xda, 0x02, 0x32, 0xb8, 0x2f, 0xd7, 0xce, 0xd8, 0x94, 0x01, 0xcf, 0xdd, 0x99, 0x77, - 0xcc, 0x47, 0xa6, 0x95, 0x2c, 0x66, 0xac, 0x3f, 0x19, 0x1d, 0xd2, 0xc9, 0x18, 0xfe, 0x4e, 0x8e, - 0x28, 0xec, 0x6e, 0xfb, 0x4d, 0xc8, 0xc1, 0x60, 0x33, 0x5c, 0x24, 0xbe, 0x57, 0x26, 0x06, 0x6c, - 0xe8, 0x2e, 0xb4, 0xcf, 0x14, 0x24, 0xa8, 0x7e, 0x17, 0x69, 0x05, 0x3b, 0xb3, 0x30, 0x4a, 0x9d, - 0x84, 0x43, 0xda, 0x92, 0x7d, 0x75, 0xd3, 0x09, 0x65, 0x46, 0x7f, 0x44, 0xc7, 0xf3, 0xa4, 0xc0, - 0xa6, 0x41, 0x27, 0xfb, 0x41, 0x27, 0x3b, 0xa0, 0x4a, 0x32, 0x10, 0xe1, 0xbc, 0xbc, 0x6e, 0xe4, - 0xa7, 0xa3, 0x91, 0xe1, 0x3e, 0x0d, 0x6b, 0xc2, 0x1b, 0x9e, 0x19, 0x0b, 0xf2, 0x23, 0x15, 0xfc, - 0xe6, 0x01, 0x7f, 0x2c, 0xb9, 0xa8, 0xf5, 0xc1, 0x04, 0xa0, 0x20, 0xb5, 0x5d, 0x8e, 0x1e, 0x98, - 0xab, 0xa2, 0x46, 0xa5, 0xca, 0xd4, 0xd1, 0x5d, 0x06, 0xb9, 0xe4, 0x50, 0xf2, 0xec, 0x13, 0xed, - 0xd1, 0xdc, 0x1b, 0xbb, 0xc7, 0x75, 0xd1, 0x9e, 0x9e, 0xd3, 0xc9, 0xe8, 0x9c, 0x8e, 0xcf, 0x4f, - 0x3b, 0x24, 0x3b, 0x5b, 0xd8, 0xaa, 0xd2, 0x02, 0x9c, 0xf0, 0xb3, 0xc2, 0xb8, 0x93, 0x35, 0x9f, - 0xcf, 0xe7, 0xf3, 0xdd, 0x5e, 0xad, 0xbf, 0xe3, 0x63, 0x5a, 0xfc, 0xd5, 0xab, 0x54, 0xa8, 0x70, - 0x0d, 0x05, 0xc0, 0x3d, 0x3b, 0x28, 0x03, 0x2f, 0xd6, 0x5e, 0x59, 0x5a, 0x38, 0x5d, 0xba, 0x64, - 0x9e, 0x58, 0xa1, 0xec, 0x54, 0x02, 0x50, 0x2d, 0x67, 0x44, 0x30, 0xe1, 0x42, 0x91, 0x43, 0x46, - 0x44, 0xad, 0x32, 0xa2, 0xf8, 0x67, 0x38, 0x3a, 0x1e, 0x14, 0xc1, 0x24, 0x6f, 0x64, 0x06, 0x8c, - 0xed, 0x45, 0x94, 0x59, 0xf3, 0x00, 0xaa, 0x3f, 0xfb, 0x54, 0xc9, 0xca, 0xf4, 0xd5, 0x78, 0x6b, - 0xa4, 0x8b, 0xd9, 0xe9, 0xe9, 0xf9, 0x78, 0xde, 0xec, 0x54, 0x0b, 0x8e, 0xcf, 0x0e, 0xe9, 0x78, - 0x32, 0xa6, 0x87, 0xe3, 0x82, 0xab, 0x06, 0x22, 0x23, 0x3d, 0xb3, 0xd4, 0x89, 0x5e, 0x6a, 0xbf, - 0x08, 0xbd, 0x93, 0x73, 0x48, 0x4e, 0x5d, 0x52, 0x1c, 0x1f, 0xd1, 0xf1, 0xf1, 0x19, 0x3d, 0x3a, - 0xf9, 0x12, 0x21, 0xaa, 0xe1, 0xba, 0x10, 0x47, 0x20, 0xc1, 0x31, 0x16, 0x2a, 0xf6, 0x21, 0x7c, - 0xd4, 0x25, 0x39, 0x1e, 0xd0, 0x11, 0x81, 0xb8, 0x4b, 0x4e, 0x70, 0x74, 0xb2, 0x35, 0xaa, 0xe4, - 0x1c, 0x7a, 0x26, 0x2c, 0x3c, 0x06, 0xf5, 0xa0, 0x50, 0xc4, 0x80, 0x8a, 0xfd, 0xc3, 0xa7, 0xb0, - 0x3f, 0x67, 0xf3, 0xd1, 0xd9, 0x79, 0xa7, 0x11, 0x8d, 0xe8, 0xe4, 0x08, 0x1c, 0xed, 0xf0, 0xb4, - 0x95, 0x7f, 0x98, 0x8a, 0xbb, 0x81, 0xa8, 0xf0, 0x59, 0xed, 0xaa, 0x0e, 0x76, 0x91, 0xc9, 0x81, - 0xfe, 0x52, 0x14, 0xcd, 0x60, 0xf3, 0x6f, 0x1f, 0x3f, 0x85, 0x9e, 0xa3, 0xc9, 0xf9, 0x39, 0x1f, - 0x77, 0xd0, 0x73, 0x72, 0x02, 0xda, 0xc0, 0x98, 0xd4, 0x6a, 0xd3, 0x5a, 0x2a, 0x85, 0xe7, 0xb4, - 0x7b, 0x23, 0x3a, 0xcc, 0x5e, 0x2f, 0xd9, 0xf2, 0xc5, 0x22, 0x2d, 0x22, 0xfd, 0x4f, 0xb2, 0xdc, - 0xc9, 0xec, 0xc4, 0x9d, 0x8d, 0x5a, 0x2c, 0xf7, 0x08, 0x0c, 0x77, 0x74, 0x46, 0xc7, 0xa7, 0x27, - 0x9d, 0x96, 0x6b, 0xcc, 0x69, 0xdb, 0x96, 0x8c, 0x62, 0x0b, 0x63, 0x0b, 0x77, 0x26, 0x1c, 0xea, - 0x90, 0x86, 0xe7, 0x20, 0xea, 0xf8, 0x83, 0x5c, 0x1e, 0x98, 0x17, 0x29, 0x33, 0xe1, 0xad, 0x89, - 0x39, 0x24, 0xb6, 0x8a, 0x47, 0x0c, 0x16, 0x51, 0xd3, 0xa6, 0x56, 0x8b, 0x33, 0x9c, 0x7b, 0x47, - 0xae, 0x7a, 0x76, 0xe2, 0xf9, 0x0f, 0xa4, 0xe7, 0x06, 0x2c, 0x4d, 0xa7, 0x16, 0x3e, 0x1c, 0x61, - 0x10, 0x18, 0x13, 0x12, 0x3e, 0xaa, 0x0c, 0x43, 0x30, 0xe9, 0x11, 0x4c, 0x65, 0xc5, 0x54, 0x33, - 0x13, 0xad, 0x80, 0xd4, 0xb2, 0x40, 0x89, 0xc9, 0x87, 0xf5, 0xdd, 0x87, 0x72, 0xe5, 0xfa, 0x7e, - 0xc2, 0x2a, 0x80, 0x71, 0x83, 0x08, 0x9d, 0xd6, 0x15, 0x92, 0x49, 0xf0, 0xcd, 0x09, 0x31, 0x6f, - 0x4e, 0xa0, 0x8a, 0x1d, 0x0e, 0x87, 0x97, 0x07, 0x80, 0x0a, 0xdf, 0x9d, 0x44, 0xa2, 0x3c, 0xef, - 0xa9, 0xad, 0x5d, 0x80, 0x17, 0x6b, 0x94, 0x1a, 0xb2, 0xae, 0x7a, 0xb7, 0x22, 0x49, 0xd6, 0xb4, - 0x89, 0x33, 0xe2, 0xdc, 0x4b, 0xc9, 0x1f, 0xd8, 0x03, 0xbb, 0x55, 0xd8, 0x9e, 0x19, 0xfc, 0x97, - 0x07, 0xed, 0xf8, 0x4b, 0x29, 0x58, 0xa4, 0x67, 0x96, 0xa8, 0xe7, 0x9b, 0x99, 0x2a, 0xee, 0x90, - 0xe1, 0x2c, 0x28, 0x40, 0x30, 0x91, 0x90, 0x2a, 0x03, 0x83, 0x03, 0x10, 0x93, 0x91, 0x48, 0xb0, - 0xa8, 0x72, 0x3b, 0x10, 0x48, 0x2e, 0x03, 0xbf, 0x80, 0xaa, 0x65, 0x21, 0x52, 0x4f, 0x42, 0x88, - 0x9b, 0x91, 0x65, 0xc2, 0xe7, 0x53, 0xeb, 0xc0, 0xba, 0x7a, 0x23, 0x42, 0x7e, 0x79, 0xc0, 0xf0, - 0xd0, 0xeb, 0x61, 0x51, 0xea, 0x0a, 0xca, 0x02, 0xa2, 0xcb, 0x00, 0xd2, 0x48, 0xfd, 0x16, 0x81, - 0xcd, 0x64, 0x00, 0x5c, 0x64, 0x09, 0x6e, 0xb2, 0xae, 0xf5, 0x63, 0x21, 0x7c, 0xa6, 0xf4, 0x52, - 0x3c, 0x4e, 0xad, 0x11, 0x44, 0xf4, 0x09, 0xfe, 0x6f, 0x1d, 0xa0, 0x04, 0x02, 0xff, 0xf3, 0x49, - 0x7a, 0x5e, 0x2a, 0xb2, 0x91, 0x18, 0x2d, 0xad, 0xfc, 0x38, 0xb0, 0xae, 0x34, 0xb5, 0x88, 0x1c, - 0x3e, 0x33, 0x7c, 0x49, 0x65, 0x24, 0x8e, 0x52, 0xc6, 0x49, 0xc5, 0x45, 0x6d, 0xc9, 0x8d, 0xb2, - 0xa7, 0x22, 0x1d, 0x92, 0x2a, 0xdc, 0x92, 0x32, 0x3d, 0x11, 0xa8, 0x04, 0x09, 0x56, 0x7e, 0x48, - 0x4a, 0x5c, 0x0a, 0xbe, 0x28, 0x09, 0x40, 0xb4, 0x77, 0x4b, 0x16, 0xdd, 0x93, 0xb5, 0xc8, 0xc8, - 0x7f, 0xfe, 0xdb, 0x7f, 0x10, 0xd8, 0xd3, 0x10, 0x3f, 0x4a, 0x25, 0x0b, 0x02, 0xbc, 0x64, 0x91, - 0x4b, 0xae, 0xac, 0x22, 0x34, 0x46, 0x71, 0x2b, 0xe6, 0x72, 0x05, 0x25, 0xfb, 0x90, 0xfc, 0xd7, - 0xbf, 0xff, 0xeb, 0xbf, 0x5c, 0x1e, 0xc4, 0x88, 0xf5, 0xaa, 0xf7, 0x17, 0x80, 0x5e, 0x32, 0x30, - 0x1e, 0x1e, 0x61, 0x29, 0xee, 0x29, 0xb8, 0xf2, 0x8e, 0xec, 0xbd, 0xf0, 0x00, 0xe0, 0x6d, 0x44, - 0xf0, 0x86, 0x8c, 0xfc, 0xc8, 0x67, 0xaa, 0x6a, 0x9f, 0x43, 0xc5, 0xaf, 0x96, 0x5d, 0x81, 0xe0, - 0xc9, 0x8c, 0x13, 0x84, 0x24, 0xa0, 0x17, 0xd8, 0x7a, 0x62, 0x7f, 0x82, 0x4f, 0xb5, 0x60, 0xeb, - 0x9c, 0x0e, 0xc1, 0xa4, 0xd5, 0x42, 0x5b, 0xd2, 0xa8, 0x5d, 0xf4, 0xb6, 0xfa, 0xcd, 0x67, 0x99, - 0x27, 0x04, 0x2f, 0x4b, 0xf3, 0xf2, 0x8e, 0xcb, 0xbf, 0x4f, 0xf5, 0x15, 0x26, 0x52, 0xa3, 0x6e, - 0x52, 0x15, 0x39, 0xfa, 0x31, 0x08, 0xb9, 0x09, 0x38, 0xd8, 0x24, 0xde, 0x75, 0x10, 0x46, 0x34, - 0x34, 0x11, 0x73, 0x32, 0x26, 0x7d, 0x58, 0x74, 0x40, 0xfe, 0xc9, 0x1c, 0x66, 0x53, 0x60, 0xc9, - 0x65, 0x19, 0xcc, 0x54, 0x5c, 0x17, 0x4c, 0xa2, 0x57, 0x81, 0x7c, 0xfc, 0x48, 0x89, 0x48, 0x21, - 0xc7, 0x0b, 0xd1, 0x8a, 0xc9, 0xf8, 0xea, 0x23, 0x48, 0x1b, 0x44, 0x09, 0x1a, 0x28, 0xd0, 0xcf, - 0x13, 0x11, 0xaa, 0xf9, 0x8a, 0x04, 0xc2, 0x22, 0x0f, 0xb8, 0xf2, 0xdd, 0x7b, 0x62, 0x2e, 0x89, - 0x87, 0x1a, 0x54, 0x6f, 0x8e, 0xb4, 0x3d, 0xcd, 0x64, 0x84, 0xc8, 0x2d, 0x88, 0x6e, 0x6a, 0x2a, - 0x58, 0x5d, 0xfd, 0xa5, 0x43, 0xc3, 0x1a, 0x60, 0xfb, 0x64, 0xab, 0xc7, 0x60, 0xd6, 0xd5, 0x77, - 0x82, 0xbc, 0x84, 0xa8, 0x67, 0xe4, 0xad, 0x11, 0xa2, 0xa9, 0x1b, 0xd4, 0xed, 0x98, 0x6b, 0xd7, - 0xbd, 0x5d, 0x78, 0x15, 0x9d, 0x0a, 0x6b, 0xaf, 0x44, 0x5b, 0x2a, 0xb4, 0x4b, 0xaf, 0xe3, 0xbd, - 0x7a, 0xed, 0xed, 0x2a, 0x76, 0xaf, 0x5e, 0x6f, 0x70, 0x8b, 0xb9, 0x57, 0x65, 0x44, 0x44, 0x95, - 0x94, 0x9b, 0x32, 0x6d, 0x30, 0xde, 0xab, 0x64, 0x5a, 0x5d, 0xa8, 0x77, 0x71, 0xfe, 0x01, 0x9c, - 0x9d, 0xe0, 0x9c, 0xa6, 0x4c, 0x49, 0x19, 0xad, 0xbb, 0xb8, 0x9f, 0x7c, 0x4d, 0xab, 0xbe, 0x16, - 0xd1, 0x02, 0x6f, 0x42, 0x02, 0x75, 0xb4, 0x96, 0x3e, 0x23, 0x77, 0x4b, 0xf3, 0x3e, 0x80, 0x80, - 0x71, 0x46, 0x62, 0xa5, 0x2e, 0x76, 0xd7, 0x68, 0xf0, 0x60, 0xb2, 0x43, 0xa3, 0xa9, 0xbd, 0x5a, - 0xff, 0x6c, 0x7b, 0x7a, 0x82, 0xe6, 0xcb, 0x77, 0x2a, 0x3b, 0xfc, 0x91, 0xad, 0xd4, 0x89, 0xef, - 0x36, 0x7b, 0x97, 0xaa, 0x84, 0x2a, 0x0c, 0xa1, 0x51, 0xd8, 0x12, 0x5d, 0x03, 0x60, 0xe8, 0x9b, - 0x40, 0x0c, 0x3c, 0x24, 0x3b, 0x55, 0x76, 0x4b, 0xb8, 0x84, 0x5f, 0x65, 0x64, 0x24, 0xa1, 0x57, - 0x94, 0x91, 0xa4, 0xaa, 0xe3, 0x30, 0x57, 0x1a, 0x1a, 0x2f, 0x55, 0x01, 0x87, 0xe9, 0xa5, 0x9d, - 0x88, 0xc3, 0xff, 0x51, 0x22, 0xd4, 0x69, 0x59, 0x93, 0x84, 0xed, 0xd8, 0xae, 0x13, 0x5c, 0x08, - 0x48, 0x30, 0xfa, 0xdf, 0x16, 0x37, 0x98, 0xa4, 0xef, 0xe3, 0x95, 0xaa, 0x3b, 0x1c, 0x18, 0xf0, - 0xde, 0xa5, 0x3a, 0x9a, 0x29, 0xe0, 0x31, 0x61, 0xd4, 0x08, 0x80, 0x96, 0xe1, 0xa2, 0x22, 0xd5, - 0x52, 0xda, 0xda, 0xb9, 0x1a, 0xdd, 0x96, 0x45, 0x07, 0x25, 0x7f, 0xba, 0xbe, 0x26, 0xfa, 0x46, - 0x14, 0xef, 0x6e, 0x0d, 0x11, 0x86, 0x86, 0xde, 0x6f, 0x24, 0x62, 0xe7, 0x92, 0xf5, 0x77, 0xd2, - 0xcb, 0x8f, 0xfe, 0xdc, 0xff, 0x2c, 0xad, 0xdc, 0xbe, 0x7d, 0xf5, 0x85, 0x12, 0x68, 0x5c, 0x19, - 0x3e, 0x51, 0x05, 0x37, 0xe6, 0x1e, 0xf2, 0x2b, 0x2d, 0x5d, 0x5e, 0x6b, 0xfe, 0x5e, 0xde, 0x80, - 0x81, 0xec, 0x73, 0xc4, 0xfe, 0xa3, 0xce, 0x01, 0xdf, 0xab, 0x6b, 0x89, 0x2f, 0xb5, 0xc0, 0xdd, - 0xfb, 0xef, 0x27, 0x6a, 0xa1, 0xcc, 0x3b, 0xaf, 0xf4, 0xc5, 0xf7, 0x57, 0x21, 0x64, 0xfb, 0x32, - 0xfd, 0x89, 0xb4, 0x5c, 0x57, 0x17, 0xdc, 0xe4, 0xae, 0xba, 0x37, 0xff, 0x02, 0x92, 0x7a, 0x15, - 0x4d, 0xfb, 0xef, 0xe4, 0x9f, 0xa6, 0xb2, 0x5e, 0x9d, 0xc2, 0x6f, 0xd5, 0x1d, 0x7c, 0x93, 0xb8, - 0x2f, 0xa7, 0xad, 0x79, 0xb3, 0xdf, 0x95, 0xfc, 0xcb, 0xcc, 0x54, 0x18, 0x20, 0xa9, 0x6d, 0xe0, - 0xc9, 0x12, 0xb7, 0x59, 0x4e, 0xd1, 0x73, 0x54, 0xec, 0x68, 0x74, 0x81, 0x5e, 0xd1, 0x85, 0x47, - 0xc1, 0xb8, 0x4b, 0x3c, 0x22, 0xd5, 0x19, 0x33, 0xd9, 0xda, 0x4c, 0x17, 0xb8, 0x6a, 0xbd, 0xc7, - 0x95, 0x8f, 0x34, 0xca, 0x90, 0xad, 0x37, 0x93, 0x5d, 0xd9, 0xf8, 0x85, 0x0a, 0x91, 0xc4, 0xb8, - 0x4b, 0xa3, 0x1c, 0xe9, 0xfd, 0x2e, 0x8e, 0xfb, 0xfe, 0x8f, 0x77, 0x77, 0xa5, 0xdf, 0xea, 0x5a, - 0xe0, 0x29, 0x41, 0x53, 0x3d, 0x8d, 0x29, 0xb4, 0x1f, 0x5f, 0x69, 0x56, 0xb0, 0xd5, 0x2b, 0x20, - 0x6b, 0xf3, 0xf0, 0x1f, 0x72, 0x10, 0xd8, 0xba, 0xbc, 0xbd, 0x29, 0x57, 0x52, 0x65, 0xc7, 0x6f, - 0x75, 0xb3, 0xfa, 0xeb, 0x9c, 0x27, 0x3a, 0xd7, 0x0f, 0xe9, 0x17, 0x3b, 0x77, 0xf5, 0x8e, 0xe7, - 0x7f, 0x37, 0xc4, 0x37, 0x5f, 0x06, 0x3d, 0x75, 0x6d, 0x91, 0xc8, 0xaf, 0xb2, 0x2e, 0xbe, 0x6c, - 0xda, 0x29, 0xf7, 0x2b, 0xfb, 0xf9, 0x26, 0x9a, 0xa5, 0xf1, 0x45, 0x51, 0x45, 0xee, 0xf3, 0xd6, - 0x6e, 0x17, 0x3d, 0x7d, 0xaa, 0x8b, 0xee, 0xb8, 0xa7, 0x21, 0xb9, 0x6e, 0xd1, 0x35, 0x9f, 0x6c, - 0x3e, 0x3d, 0xeb, 0xdc, 0x17, 0xe1, 0xa6, 0xb9, 0xaa, 0x28, 0xb7, 0x5c, 0xb2, 0x56, 0x1e, 0x17, - 0x8c, 0x40, 0xc2, 0x85, 0x58, 0x05, 0x40, 0x40, 0xde, 0x21, 0x89, 0x03, 0x20, 0x2f, 0x4e, 0xec, - 0xf1, 0x88, 0xc0, 0xae, 0x54, 0x5d, 0x91, 0xe8, 0x77, 0x07, 0x9a, 0xa5, 0x04, 0x04, 0x8a, 0x94, - 0x02, 0xaf, 0xf8, 0x73, 0xdc, 0x70, 0x54, 0x13, 0x05, 0x6b, 0x2f, 0x12, 0xdb, 0x4f, 0x9f, 0xd4, - 0xfd, 0x9b, 0x05, 0x11, 0x43, 0xeb, 0x22, 0x26, 0x4d, 0x28, 0xf5, 0xdc, 0xf1, 0xaa, 0xf7, 0x82, - 0xa4, 0x7e, 0x88, 0xb7, 0xae, 0x6a, 0x22, 0x6c, 0x77, 0xe5, 0x52, 0xd1, 0xa0, 0x36, 0xab, 0x8c, - 0xa8, 0x4b, 0x1e, 0xe2, 0x43, 0x39, 0x5f, 0x39, 0x6b, 0xc9, 0x13, 0x9b, 0xa5, 0x22, 0xc8, 0x40, - 0xf8, 0x7e, 0x04, 0xc1, 0xd7, 0x5e, 0xdb, 0x23, 0x3d, 0x1f, 0xbe, 0x77, 0x4e, 0x54, 0x48, 0x98, - 0xd8, 0x47, 0xd6, 0xd6, 0xa1, 0xce, 0x0a, 0xa4, 0xb0, 0x84, 0xbf, 0x78, 0x84, 0x63, 0x9b, 0x13, - 0x9c, 0xee, 0xc3, 0x9b, 0x7a, 0x10, 0xf8, 0x6d, 0xc2, 0x05, 0x79, 0x2e, 0x12, 0xce, 0xa3, 0x3d, - 0x12, 0x2d, 0x9e, 0x75, 0x7e, 0xae, 0x4c, 0xeb, 0x8f, 0x48, 0xaf, 0x7a, 0x35, 0x61, 0xfd, 0x5f, - 0x90, 0x55, 0xe3, 0x0b, 0xb7, 0x73, 0xc2, 0x5b, 0xab, 0xd3, 0x54, 0xfc, 0x77, 0x7f, 0xff, 0x0d, - 0x78, 0xe6, 0x68, 0x28, 0x07, 0x38, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x72, 0xdb, 0x48, + 0x76, 0xef, 0xfc, 0x8a, 0x36, 0x5c, 0x99, 0x90, 0x29, 0x80, 0x22, 0xa9, 0x9b, 0x45, 0x89, 0x4a, + 0xd9, 0xb2, 0x67, 0xec, 0x8d, 0xed, 0xd1, 0x9a, 0x9a, 0x9d, 0xdd, 0xda, 0x4c, 0x4d, 0x35, 0x81, + 0x26, 0x09, 0x0b, 0x40, 0x63, 0x80, 0x06, 0x29, 0x0e, 0x8a, 0x9f, 0xb0, 0x0f, 0xfb, 0x01, 0xa9, + 0xbc, 0xe4, 0xcb, 0xf2, 0x05, 0xf9, 0x84, 0x9c, 0xd3, 0x17, 0x5c, 0x48, 0x80, 0x96, 0xc7, 0x4e, + 0x26, 0x15, 0xdb, 0x12, 0x89, 0x46, 0x9f, 0xfb, 0xb5, 0x2f, 0xbe, 0x7a, 0xf2, 0xf2, 0xfb, 0x9b, + 0xbb, 0xbf, 0xdc, 0xbe, 0x22, 0x4b, 0x11, 0x06, 0xd7, 0xe4, 0x0a, 0x3f, 0x48, 0x40, 0xa3, 0xc5, + 0xc4, 0x62, 0x91, 0x85, 0x03, 0x8c, 0x7a, 0xf0, 0x11, 0x32, 0x41, 0x49, 0x44, 0x43, 0x36, 0xb1, + 0x56, 0x3e, 0x5b, 0xc7, 0x3c, 0x11, 0x16, 0xe9, 0xb8, 0x3c, 0x12, 0x2c, 0x12, 0x13, 0x6b, 0xed, + 0x7b, 0x62, 0x39, 0xf1, 0xd8, 0xca, 0x77, 0x99, 0x23, 0x1f, 0x6c, 0x3f, 0xf2, 0x85, 0x4f, 0x03, + 0x27, 0x75, 0x69, 0xc0, 0x26, 0x43, 0x3b, 0x84, 0x81, 0x30, 0x0b, 0xcd, 0xb3, 0x65, 0x90, 0x76, + 0xdc, 0x25, 0x4d, 0x52, 0x06, 0x48, 0x32, 0x31, 0x77, 0x9e, 0x59, 0x75, 0x62, 0x62, 0xc9, 0x42, + 0xe6, 0xb8, 0x3c, 0xe0, 0x89, 0x45, 0x0a, 0x72, 0x4f, 0x47, 0xf2, 0x4f, 0x05, 0x87, 0x79, 0xb3, + 0x61, 0xa9, 0xa5, 0x41, 0x69, 0x1c, 0x07, 0xcc, 0x09, 0xf9, 0xcc, 0x87, 0x8f, 0x35, 0x9b, 0x39, + 0x30, 0xe0, 0xb8, 0x34, 0xa6, 0xb3, 0x80, 0x21, 0xa4, 0xf0, 0x45, 0xc0, 0xae, 0x5f, 0xfb, 0x2b, + 0xe6, 0xbc, 0xe3, 0xc0, 0x2c, 0x4f, 0xae, 0x8e, 0xd4, 0x18, 0xe9, 0x5c, 0xa5, 0x6e, 0xe2, 0xc7, + 0xe2, 0xba, 0xb3, 0xa2, 0x09, 0x11, 0x7e, 0xc8, 0x78, 0x26, 0xec, 0xe7, 0xae, 0xc8, 0x68, 0x70, + 0x4b, 0x17, 0x80, 0xfc, 0xcd, 0xfb, 0x97, 0xaf, 0xfe, 0x6c, 0xd9, 0xde, 0xc4, 0xe3, 0x6e, 0x16, + 0x02, 0xe9, 0xcb, 0x79, 0x16, 0xb9, 0xc2, 0xe7, 0x11, 0xe1, 0xd1, 0x5b, 0x4e, 0xbd, 0x6e, 0x2f, + 0x5f, 0xfa, 0x1e, 0x7b, 0x1e, 0x04, 0x37, 0xc0, 0x5b, 0xc2, 0x83, 0xb4, 0xdb, 0xb3, 0x63, 0x94, + 0xf4, 0x8f, 0x19, 0x4b, 0x36, 0xf0, 0x00, 0x32, 0xbf, 0x48, 0x40, 0xbb, 0x37, 0x49, 0x16, 0xce, + 0xd4, 0xf3, 0x1b, 0xa5, 0x33, 0x24, 0xa1, 0x06, 0x5e, 0xfa, 0x69, 0x1c, 0xd0, 0x4d, 0xd7, 0x72, + 0x57, 0x96, 0x6d, 0x45, 0x3c, 0x62, 0x56, 0xcf, 0xfe, 0x8e, 0x89, 0x29, 0x13, 0xc2, 0x8f, 0x16, + 0x80, 0x73, 0x5b, 0xd0, 0xad, 0x0d, 0xe7, 0x88, 0xb9, 0x6b, 0xa5, 0x7a, 0xc0, 0xea, 0xf5, 0x41, + 0x93, 0x51, 0x97, 0x4d, 0xae, 0x73, 0xd0, 0x55, 0xca, 0x03, 0xd6, 0xf7, 0xd8, 0x2c, 0x5b, 0x74, + 0x99, 0xa4, 0x73, 0xc7, 0x1e, 0xc4, 0x0b, 0xfe, 0xf0, 0x27, 0x1a, 0x64, 0x0c, 0xa0, 0x36, 0xa9, + 0x60, 0xe1, 0xcf, 0x69, 0xc0, 0x58, 0x8c, 0xc2, 0x5b, 0x36, 0xeb, 0xab, 0xb1, 0x7e, 0x31, 0xd6, + 0x0e, 0xb6, 0x72, 0x5d, 0xea, 0x7d, 0xcc, 0x52, 0xa1, 0x89, 0x57, 0xa0, 0x77, 0x5f, 0x35, 0x20, + 0x09, 0x7f, 0x11, 0xe2, 0xe7, 0x94, 0x25, 0x2b, 0x96, 0x20, 0x20, 0x3e, 0xf6, 0xd5, 0x63, 0xdb, + 0xe4, 0x2c, 0xad, 0x4c, 0xc5, 0x87, 0xb6, 0x89, 0x31, 0x4d, 0xd3, 0x35, 0x4f, 0xbc, 0x62, 0xb2, + 0x19, 0x68, 0x05, 0x40, 0x2f, 0x2f, 0x26, 0xc3, 0x43, 0x93, 0xd0, 0xe8, 0xce, 0x3f, 0xaf, 0x99, + 0xbf, 0x58, 0x0a, 0x3e, 0x9f, 0xc3, 0x7b, 0x29, 0x2f, 0x8e, 0xf6, 0xab, 0xa3, 0xad, 0xa0, 0xf7, + 0x7e, 0xc0, 0x17, 0x09, 0x0d, 0x3d, 0x7f, 0x05, 0xfe, 0x92, 0x94, 0xd0, 0x3b, 0x2f, 0x5a, 0x11, + 0xc0, 0x2f, 0x7f, 0x96, 0x50, 0xf4, 0x01, 0xd0, 0x71, 0xcc, 0xe0, 0x6b, 0x96, 0xb0, 0xaa, 0xf2, + 0x25, 0xba, 0x83, 0xd3, 0x1e, 0x83, 0x7c, 0x4e, 0x5d, 0x88, 0x91, 0x43, 0x78, 0xd5, 0x8c, 0x69, + 0x2b, 0xca, 0xb5, 0x9f, 0xb0, 0x80, 0xa5, 0x35, 0x43, 0xe8, 0xb1, 0x43, 0xb6, 0x30, 0x60, 0x69, + 0xea, 0xd7, 0x40, 0xf0, 0xb9, 0xb7, 0xad, 0x44, 0xc0, 0x6e, 0x04, 0xe5, 0xe9, 0xda, 0x17, 0xee, + 0xb2, 0x5b, 0x06, 0x6e, 0x2f, 0x77, 0x69, 0xca, 0x74, 0xf4, 0x8e, 0x05, 0x5f, 0x2c, 0x02, 0xf6, + 0x26, 0xf2, 0xd8, 0x43, 0xb7, 0x77, 0x39, 0x83, 0x90, 0xb9, 0xbf, 0x94, 0xef, 0xef, 0x9e, 0x7f, + 0x78, 0x85, 0xaf, 0x39, 0xbc, 0x7e, 0x9e, 0x09, 0x7e, 0x47, 0x13, 0xb6, 0x3f, 0x63, 0x68, 0x8d, + 0x6b, 0x21, 0x8a, 0xb3, 0xa6, 0x82, 0xc5, 0x43, 0x08, 0xd5, 0x59, 0xc0, 0xdd, 0x7b, 0x6b, 0x0f, + 0x64, 0xd4, 0x02, 0x32, 0x2a, 0x41, 0xb6, 0xa5, 0x3c, 0xd5, 0x74, 0x91, 0x63, 0x26, 0x62, 0x93, + 0x88, 0xad, 0xc9, 0x0f, 0x1f, 0xde, 0x4e, 0x19, 0x4d, 0xdc, 0xe5, 0x2d, 0x05, 0xf7, 0x48, 0xbb, + 0x26, 0x05, 0xf5, 0x01, 0x81, 0xb4, 0x03, 0x04, 0x0c, 0xbe, 0xee, 0x5d, 0x46, 0x59, 0x10, 0x4c, + 0x26, 0x15, 0xf9, 0x27, 0xac, 0xbf, 0x60, 0xa2, 0x6b, 0xc5, 0xf0, 0xdd, 0xea, 0xf5, 0xbe, 0xf9, + 0xa6, 0xbb, 0x9f, 0xd4, 0x2a, 0x0a, 0xad, 0x29, 0xa8, 0x21, 0x9f, 0x55, 0x65, 0x59, 0xb3, 0xc0, + 0xe5, 0x98, 0x2b, 0x8c, 0x20, 0xf5, 0xfc, 0x65, 0x52, 0x53, 0x45, 0xd0, 0x82, 0xcc, 0x1e, 0xe2, + 0xbc, 0x51, 0x49, 0x83, 0x32, 0x05, 0xb6, 0xea, 0xfd, 0xd0, 0xfb, 0x51, 0xcb, 0xfb, 0x0a, 0x6b, + 0x0d, 0xaf, 0x4b, 0xb9, 0x9a, 0x60, 0xcb, 0xb4, 0x5c, 0x73, 0x43, 0x33, 0x81, 0xd9, 0x42, 0x59, + 0x2e, 0x2d, 0x0a, 0x05, 0x1a, 0xe0, 0x55, 0xc0, 0xf0, 0xeb, 0x8b, 0xcd, 0x1b, 0x0f, 0x12, 0xf0, + 0x25, 0xb8, 0xb2, 0xd8, 0x60, 0x46, 0x56, 0x50, 0x13, 0xad, 0xa1, 0xc9, 0x64, 0x22, 0xfe, 0xd9, + 0x02, 0x3f, 0xac, 0x1a, 0xa4, 0xee, 0x92, 0x79, 0xd5, 0x7c, 0xd2, 0x6b, 0xed, 0xc3, 0x56, 0xaa, + 0x29, 0x73, 0xcf, 0x10, 0x30, 0xb3, 0x62, 0x84, 0x46, 0x4c, 0x07, 0x4b, 0x56, 0x0d, 0x53, 0x75, + 0xa6, 0xf6, 0xde, 0x36, 0x1d, 0x58, 0x71, 0x00, 0xb1, 0xf2, 0x89, 0x68, 0x65, 0x7d, 0x3f, 0x8a, + 0x58, 0x82, 0xb9, 0x61, 0x62, 0x4d, 0x05, 0x85, 0xdc, 0xbc, 0x1f, 0xb3, 0xd5, 0xe0, 0xac, 0x46, + 0x5d, 0x0d, 0x18, 0x75, 0x40, 0xa6, 0x98, 0xbd, 0xac, 0x4a, 0xb4, 0x09, 0xe3, 0x26, 0xd2, 0xff, + 0x22, 0xef, 0x25, 0x15, 0xb4, 0x9b, 0x6f, 0x6d, 0x0b, 0x5f, 0xa4, 0xd2, 0xbf, 0x2a, 0x55, 0x74, + 0x57, 0xf1, 0xe0, 0x5c, 0x35, 0xed, 0x6d, 0x7b, 0x90, 0x19, 0x51, 0x9c, 0x6e, 0x0f, 0x66, 0xd7, + 0xb2, 0x14, 0xb2, 0xae, 0xcd, 0xd7, 0x48, 0x67, 0x70, 0x88, 0xce, 0xf0, 0xf1, 0x74, 0x0c, 0x6e, + 0xe9, 0x84, 0x09, 0x83, 0x74, 0x1f, 0x11, 0xcc, 0x1f, 0xb7, 0x09, 0x0f, 0xfd, 0x94, 0x75, 0xbb, + 0xa9, 0x4d, 0x11, 0x08, 0x6d, 0xc3, 0x65, 0x66, 0xf9, 0xf3, 0xbb, 0xb7, 0xaf, 0x85, 0x88, 0x3f, + 0xb0, 0x5f, 0x32, 0xe0, 0xe4, 0x92, 0xf7, 0xa9, 0xe7, 0xbd, 0x5a, 0x81, 0x95, 0xde, 0xfa, 0xc0, + 0x18, 0xe8, 0xaf, 0x6b, 0x05, 0xd0, 0xdb, 0x58, 0x76, 0xd7, 0x50, 0x41, 0x19, 0x96, 0x7c, 0x7d, + 0xc7, 0x69, 0x2a, 0xde, 0xb1, 0x34, 0x45, 0x37, 0xb0, 0x4c, 0x40, 0x91, 0x94, 0xae, 0x98, 0xf7, + 0x04, 0x63, 0xa6, 0x2b, 0x96, 0x7e, 0xda, 0x07, 0xf9, 0x62, 0xe8, 0x3e, 0x18, 0x9a, 0x01, 0x38, + 0xef, 0xd9, 0x4d, 0x14, 0x58, 0x92, 0x40, 0xb3, 0x57, 0x21, 0xc1, 0x9a, 0x68, 0xbc, 0xc2, 0x59, + 0x64, 0xbd, 0x84, 0xe6, 0x0e, 0xc9, 0x00, 0x39, 0x62, 0xc8, 0x3e, 0xb1, 0xec, 0x27, 0x83, 0x9e, + 0x4d, 0xbb, 0x9a, 0x04, 0x8f, 0x41, 0x97, 0xd6, 0xed, 0xf7, 0xd3, 0x3b, 0x0b, 0x34, 0x01, 0x03, + 0xa0, 0x40, 0x2d, 0xe2, 0x6b, 0x70, 0x51, 0xa4, 0x79, 0xa3, 0xfa, 0x47, 0xe7, 0x6e, 0x13, 0x63, + 0xa4, 0x63, 0xeb, 0xe8, 0xab, 0x5c, 0x7a, 0xf4, 0x31, 0xe5, 0x91, 0xa5, 0xa0, 0x22, 0xaf, 0xfb, + 0x87, 0xe9, 0xf7, 0xef, 0x21, 0x5a, 0x13, 0xa0, 0xe3, 0xcf, 0x21, 0xbe, 0x7b, 0xb5, 0x02, 0x24, + 0x9b, 0x2e, 0xd6, 0xac, 0x6c, 0x61, 0xa7, 0x46, 0xd9, 0xb4, 0x49, 0xd9, 0xf4, 0xab, 0xa8, 0x62, + 0xa1, 0x74, 0x40, 0xd0, 0xf0, 0x44, 0xe9, 0x21, 0x55, 0x7a, 0xa0, 0x5a, 0x0f, 0xdf, 0xbd, 0x02, + 0x35, 0x30, 0xf9, 0x1c, 0xa1, 0x31, 0x27, 0x55, 0xe4, 0xa2, 0x4b, 0x0b, 0x23, 0xf5, 0xb6, 0x30, + 0x47, 0x0a, 0x5d, 0x2f, 0xb2, 0xbb, 0xf4, 0xc1, 0xbd, 0x26, 0x40, 0xc7, 0xa4, 0xb9, 0xdd, 0xd8, + 0x86, 0x14, 0x26, 0x70, 0xba, 0xe4, 0x12, 0x0d, 0x6f, 0x8d, 0xd5, 0xc0, 0x34, 0x73, 0x5d, 0x40, + 0x21, 0x87, 0x80, 0x9d, 0x4f, 0x40, 0xee, 0x40, 0x61, 0xba, 0xa8, 0x84, 0x34, 0xb3, 0xdd, 0x00, + 0x6a, 0xde, 0x9d, 0xea, 0xd4, 0xbb, 0xba, 0x63, 0x47, 0x21, 0x1b, 0x33, 0xab, 0xad, 0x27, 0x4c, + 0xb0, 0xd7, 0xd0, 0x30, 0x55, 0x97, 0xde, 0x03, 0x83, 0x54, 0xe8, 0xc1, 0x7a, 0x68, 0xdb, 0xb3, + 0x47, 0x17, 0x83, 0x41, 0x45, 0x1b, 0x8b, 0x9d, 0x66, 0xa5, 0x34, 0xbe, 0xb7, 0x9f, 0xe8, 0xfb, + 0x2b, 0x9c, 0xd3, 0x04, 0xfc, 0x1e, 0xb2, 0x24, 0x4b, 0x0a, 0x14, 0x72, 0xd5, 0x31, 0x69, 0xc5, + 0x70, 0xa9, 0x49, 0xc8, 0xfe, 0xe0, 0x5b, 0x30, 0x22, 0x48, 0x5c, 0xcf, 0xbd, 0x75, 0x9e, 0x30, + 0xfe, 0x5b, 0x91, 0x4d, 0x2a, 0xe5, 0x05, 0xe3, 0xb5, 0xb2, 0x86, 0x28, 0xb3, 0x93, 0xea, 0xdf, + 0xc7, 0x79, 0xd1, 0xfe, 0x8f, 0x9b, 0x79, 0xdf, 0x5f, 0x3a, 0xf4, 0xec, 0xdd, 0xa6, 0xff, 0x13, + 0xa0, 0x7b, 0xcb, 0x07, 0xf0, 0x43, 0x6c, 0xc0, 0x81, 0xb8, 0x5c, 0x06, 0x8c, 0x17, 0x87, 0x96, + 0x0c, 0xb0, 0xc6, 0x82, 0x3e, 0xbd, 0x8d, 0x44, 0xd9, 0xd5, 0xf7, 0x6c, 0x5c, 0x29, 0xb4, 0xe0, + 0x92, 0x2b, 0x0a, 0x5c, 0xad, 0xa9, 0x96, 0xb4, 0x65, 0x56, 0xd1, 0xc5, 0x02, 0x83, 0xb2, 0x15, + 0x1e, 0xe7, 0xd5, 0x86, 0xbf, 0x55, 0xcc, 0xfd, 0x05, 0x43, 0xcf, 0xde, 0xe9, 0xf5, 0x0f, 0xc3, + 0xee, 0xae, 0x18, 0x7a, 0xf6, 0xc1, 0xde, 0xfe, 0x30, 0xb2, 0xc3, 0xab, 0x87, 0x1a, 0xea, 0x5a, + 0x7b, 0xff, 0x68, 0xac, 0xf5, 0x65, 0x03, 0xe8, 0x4a, 0xb7, 0xef, 0xe3, 0xbc, 0x5d, 0xbf, 0x7b, + 0x0b, 0x05, 0xc8, 0x62, 0xd0, 0xec, 0xb7, 0x4f, 0x94, 0x4b, 0x03, 0x68, 0x9d, 0x6d, 0x2b, 0x05, + 0x62, 0xec, 0x8b, 0x0a, 0x75, 0xe7, 0xea, 0x48, 0xaf, 0xfe, 0xc9, 0x95, 0x4c, 0x03, 0xd7, 0x1d, + 0xdc, 0x15, 0xc9, 0xe7, 0x00, 0xe2, 0xcc, 0x69, 0xe8, 0x07, 0x9b, 0xb1, 0xf2, 0x55, 0x27, 0xf3, + 0x6d, 0x47, 0x6d, 0x33, 0xa8, 0x01, 0xfb, 0x45, 0xe0, 0x47, 0xf7, 0xef, 0xa8, 0x3b, 0x95, 0x8f, + 0xdf, 0x02, 0x84, 0x0d, 0xd5, 0x70, 0xc1, 0x19, 0xf9, 0xe1, 0x8d, 0x65, 0x7f, 0xe0, 0x33, 0x2e, + 0xb8, 0x6d, 0xbd, 0x66, 0xc1, 0x8a, 0x09, 0x28, 0x30, 0xe4, 0x3d, 0xcb, 0xa0, 0xde, 0x3c, 0x4f, + 0xa0, 0x83, 0xb2, 0xad, 0xf7, 0xf0, 0x92, 0x4c, 0x69, 0x04, 0x8d, 0x68, 0x0a, 0xbf, 0x1d, 0xf0, + 0x42, 0x7f, 0x6e, 0x5b, 0xcf, 0x91, 0x00, 0xb9, 0xc1, 0x2d, 0x10, 0xf2, 0x2a, 0xe4, 0x1f, 0x7d, + 0xab, 0xc4, 0xb9, 0x3f, 0x30, 0xdd, 0x84, 0x33, 0x1e, 0x58, 0x1a, 0x5b, 0x15, 0xea, 0x12, 0x78, + 0x63, 0xce, 0x52, 0x3a, 0xde, 0x78, 0xd8, 0x3f, 0xdd, 0xce, 0x32, 0x21, 0x78, 0x64, 0xfb, 0x51, + 0x9c, 0x09, 0x9b, 0xc7, 0x62, 0x91, 0xf0, 0x2c, 0x06, 0xe5, 0x04, 0xcc, 0x15, 0xb6, 0x00, 0x3d, + 0x43, 0x3f, 0x42, 0x6b, 0x62, 0xfb, 0xd1, 0x12, 0x78, 0x12, 0x97, 0x72, 0x2c, 0xf5, 0x7f, 0x65, + 0xe3, 0xe1, 0x60, 0xf0, 0x0f, 0x3b, 0x88, 0x87, 0xa7, 0x97, 0x21, 0x4d, 0x16, 0x7e, 0x34, 0x1e, + 0xd4, 0x48, 0xe4, 0x1c, 0x02, 0x74, 0x1e, 0xf0, 0xf5, 0x78, 0xe5, 0xa7, 0xfe, 0x2c, 0x60, 0xe6, + 0xad, 0xa2, 0x98, 0x23, 0x45, 0x47, 0x24, 0x20, 0xf9, 0x9c, 0x27, 0xe1, 0x18, 0xbb, 0xea, 0xed, + 0x5f, 0x05, 0x14, 0xe4, 0x89, 0x9a, 0xf7, 0x93, 0xad, 0x9e, 0xa4, 0x77, 0x9a, 0x87, 0x34, 0x9b, + 0x85, 0x3e, 0x3c, 0xa9, 0x29, 0x39, 0xee, 0xf3, 0xdc, 0xfb, 0x02, 0x8d, 0x02, 0xe5, 0x80, 0x46, + 0x2e, 0x1b, 0xab, 0x37, 0x75, 0x4c, 0xe3, 0xb1, 0x13, 0xf2, 0x5f, 0x9d, 0x39, 0xb4, 0xa3, 0xa9, + 0x23, 0xab, 0x48, 0x0d, 0x77, 0xeb, 0x6b, 0x4d, 0xad, 0xe1, 0xbd, 0x42, 0xbc, 0xff, 0x22, 0x9f, + 0x81, 0xfb, 0xb2, 0xc4, 0x91, 0x8e, 0x24, 0x65, 0xba, 0x8c, 0xa1, 0xce, 0x63, 0x00, 0x0d, 0x76, + 0x78, 0x2a, 0x41, 0xb1, 0xbb, 0xa8, 0x33, 0xd4, 0xf8, 0xce, 0x70, 0xb3, 0xf3, 0x52, 0xb3, 0x52, + 0x1f, 0xcd, 0xa1, 0xc4, 0xa1, 0x99, 0xc6, 0xc3, 0xf8, 0x81, 0x78, 0x5c, 0x08, 0xe6, 0x91, 0x17, + 0x72, 0x22, 0x06, 0xd4, 0x76, 0xee, 0xb3, 0xc0, 0x03, 0x4a, 0xb9, 0x61, 0xae, 0x7f, 0x7c, 0xca, + 0x42, 0xd2, 0x3f, 0x97, 0xbf, 0xcf, 0x46, 0xf0, 0xb1, 0x0d, 0xd8, 0x02, 0xea, 0x01, 0x08, 0xf4, + 0x80, 0xa6, 0xc7, 0x49, 0x5a, 0x36, 0x18, 0xb9, 0x94, 0x3b, 0x74, 0x85, 0x7f, 0xe8, 0xba, 0x39, + 0x16, 0xb8, 0xd7, 0x06, 0xde, 0xf0, 0xa0, 0xf6, 0x04, 0x95, 0xb7, 0x14, 0xf2, 0x5f, 0x42, 0xcb, + 0x22, 0x20, 0x74, 0x62, 0xea, 0xa2, 0x6a, 0x92, 0x90, 0x06, 0xdb, 0x38, 0x81, 0xd4, 0x06, 0xf5, + 0x3d, 0x07, 0x5f, 0xc1, 0x08, 0x09, 0x1c, 0xc8, 0x24, 0x8b, 0x68, 0x3c, 0x83, 0x5e, 0x1e, 0xf9, + 0xdf, 0x16, 0x7e, 0x59, 0x78, 0x13, 0x85, 0xd5, 0x90, 0x56, 0xa5, 0xbb, 0x64, 0xee, 0x3d, 0xb0, + 0x53, 0xb8, 0x0a, 0xf5, 0x7c, 0xfe, 0x53, 0x0b, 0xcb, 0xbb, 0x76, 0x88, 0x64, 0x1a, 0x43, 0xe3, + 0x6a, 0x27, 0x92, 0x06, 0x04, 0xf6, 0xfc, 0xc8, 0xd1, 0x9e, 0xda, 0x32, 0x11, 0x74, 0x5b, 0x9f, + 0x98, 0xeb, 0x60, 0xa8, 0xb0, 0xa6, 0x96, 0xe4, 0x3f, 0x35, 0x79, 0x28, 0x8a, 0x24, 0x0d, 0x70, + 0xa9, 0x8d, 0xe4, 0xe8, 0x0a, 0xe2, 0x8c, 0xe2, 0x87, 0x3a, 0x78, 0x49, 0x53, 0x0d, 0x38, 0x1e, + 0x73, 0xb9, 0xca, 0xb3, 0x4d, 0x98, 0x65, 0x0c, 0x95, 0x30, 0x73, 0xdc, 0x09, 0xcd, 0x62, 0xec, + 0xfa, 0x9c, 0x4f, 0x05, 0x8c, 0x8c, 0x71, 0x63, 0xd0, 0xad, 0xc7, 0x04, 0xf5, 0x83, 0x34, 0x37, + 0x86, 0x95, 0x6d, 0xd4, 0x36, 0xcd, 0x42, 0x88, 0xf4, 0x4d, 0x31, 0x1a, 0x40, 0xe3, 0xea, 0x80, + 0x49, 0xc3, 0x2d, 0x96, 0x92, 0x80, 0x0a, 0x56, 0xbc, 0x52, 0xd1, 0xac, 0xda, 0xa8, 0x9f, 0xea, + 0xa3, 0x12, 0xd7, 0x2f, 0x19, 0x17, 0xcc, 0xf6, 0x3c, 0xdb, 0x0b, 0xec, 0xb9, 0xbf, 0x80, 0x12, + 0x64, 0x2f, 0x87, 0xf6, 0x72, 0x64, 0x2f, 0x8f, 0xed, 0xe5, 0x89, 0xbd, 0x3c, 0xb5, 0x97, 0x67, + 0xf6, 0x32, 0xb1, 0x63, 0x3b, 0x4e, 0x58, 0xbe, 0x93, 0x5f, 0xf2, 0x19, 0x75, 0xef, 0x31, 0x7b, + 0x45, 0x9e, 0xda, 0x2a, 0x1e, 0xcb, 0x34, 0x02, 0xed, 0x11, 0x6e, 0xcc, 0x56, 0x5e, 0xfa, 0x21, + 0x94, 0x01, 0x4d, 0x55, 0x45, 0x89, 0x0c, 0x90, 0x86, 0xe0, 0x30, 0xa6, 0x18, 0x9f, 0xc2, 0x10, + 0x9a, 0x91, 0x14, 0x4a, 0x94, 0xc1, 0x8d, 0x31, 0xa5, 0x68, 0x95, 0xb1, 0x63, 0xb8, 0xaa, 0x78, + 0x16, 0x0f, 0xec, 0x2c, 0xc8, 0xa5, 0x5e, 0x2a, 0x19, 0xa0, 0x61, 0xe2, 0xff, 0xcf, 0x0a, 0xf3, + 0x4f, 0xf6, 0x78, 0x4c, 0xe7, 0x10, 0x1c, 0xf0, 0x39, 0x63, 0x90, 0xd6, 0x59, 0x4b, 0x2c, 0xea, + 0xaf, 0x2a, 0x4b, 0x0c, 0x2e, 0x6b, 0x49, 0x33, 0xe5, 0x81, 0xef, 0x99, 0x21, 0x65, 0xde, 0xa7, + 0x6c, 0xc4, 0x9e, 0xcd, 0x41, 0x6b, 0x45, 0x7e, 0x15, 0x3c, 0x36, 0x39, 0x06, 0x62, 0xc6, 0x0f, + 0x17, 0xf9, 0x3e, 0x8e, 0x32, 0x77, 0x40, 0x86, 0xc1, 0xe2, 0x65, 0x72, 0xcc, 0x56, 0xd6, 0x27, + 0xc8, 0x98, 0x98, 0xb4, 0xe1, 0x9b, 0x03, 0xce, 0xe9, 0xb2, 0x25, 0x0f, 0x00, 0x41, 0x51, 0x08, + 0x9b, 0x5f, 0xe7, 0x9a, 0x21, 0x3a, 0xa0, 0xcc, 0x1d, 0x68, 0x44, 0x9f, 0xc2, 0xf4, 0x39, 0xa8, + 0x9a, 0x11, 0xb4, 0x83, 0xfd, 0x15, 0xba, 0x9a, 0xb2, 0x62, 0xea, 0xf8, 0x70, 0xb3, 0x24, 0x85, + 0x39, 0x31, 0xf7, 0xa1, 0xc9, 0x4b, 0xb6, 0x32, 0x2d, 0xe7, 0xa5, 0x46, 0x03, 0x1a, 0xa7, 0x6c, + 0x6c, 0xbe, 0x6c, 0xf7, 0x02, 0x2f, 0x2f, 0xeb, 0x7d, 0xad, 0x03, 0x50, 0x4d, 0x6c, 0x91, 0x24, + 0xfa, 0xc6, 0xa0, 0xce, 0x49, 0x5e, 0xd8, 0x16, 0xe8, 0x87, 0xda, 0x32, 0x27, 0x60, 0x99, 0x7e, + 0xfc, 0x00, 0x6f, 0xb5, 0xdf, 0x3b, 0x01, 0x9b, 0x83, 0xa3, 0x24, 0x2c, 0x34, 0x91, 0x00, 0x71, + 0x25, 0x7d, 0x07, 0x86, 0x60, 0xea, 0xc6, 0x19, 0x15, 0x53, 0xc1, 0xc0, 0xe3, 0xfe, 0x69, 0x75, + 0xaa, 0xc2, 0xad, 0x06, 0xb7, 0xfd, 0xd0, 0x19, 0x9a, 0x00, 0xec, 0x8f, 0xf4, 0x90, 0x00, 0x78, + 0x35, 0x56, 0x82, 0x03, 0x5a, 0xe7, 0xb8, 0x2c, 0x73, 0xe7, 0x66, 0x6c, 0x58, 0x8e, 0x95, 0xe0, + 0xc3, 0x1a, 0xb8, 0x1e, 0x07, 0x09, 0x86, 0x75, 0x09, 0xd4, 0x9b, 0x1d, 0x19, 0x8a, 0xe9, 0x9b, + 0xca, 0xf4, 0x12, 0xcf, 0x9e, 0x18, 0x25, 0xf6, 0xb3, 0x1d, 0xfd, 0xf4, 0x1b, 0xb0, 0x0f, 0xfb, + 0x05, 0xf6, 0x67, 0x35, 0xec, 0xa3, 0x06, 0xdc, 0x23, 0x39, 0x35, 0x58, 0xfc, 0xab, 0x2c, 0x35, + 0x0e, 0xd6, 0xd2, 0x8a, 0x49, 0x95, 0xb2, 0x97, 0xce, 0x69, 0x5e, 0x44, 0xae, 0xe6, 0x65, 0xed, + 0x60, 0xe6, 0xcb, 0x95, 0xf5, 0x64, 0x2d, 0xeb, 0x4b, 0x04, 0xb0, 0xf8, 0xd8, 0x38, 0x27, 0x83, + 0x41, 0xee, 0x38, 0xf2, 0x99, 0x43, 0x05, 0xf7, 0xc5, 0x66, 0x3c, 0xd4, 0x6d, 0xc0, 0x53, 0x77, + 0xe6, 0x9d, 0xb2, 0x81, 0x7e, 0x4a, 0x16, 0x33, 0xda, 0x1d, 0x0d, 0x8e, 0xed, 0xd1, 0x10, 0x7e, + 0x46, 0x27, 0x36, 0xac, 0x6e, 0xbb, 0x75, 0xc8, 0x5e, 0x6f, 0xdb, 0x5f, 0x24, 0xbe, 0x57, 0x14, + 0x06, 0x7c, 0x50, 0x43, 0xe8, 0x9f, 0x29, 0x68, 0x50, 0x7e, 0x37, 0x65, 0x05, 0x07, 0xb3, 0x30, + 0x4a, 0xc7, 0x09, 0x83, 0xb2, 0x25, 0xba, 0xf2, 0x74, 0x11, 0xda, 0x8c, 0xee, 0xc0, 0x1e, 0xce, + 0x13, 0x83, 0x4d, 0x81, 0x8e, 0x0e, 0x83, 0x8e, 0xf6, 0x40, 0xa5, 0x66, 0x20, 0xc3, 0x79, 0x79, + 0xd5, 0xc9, 0xcf, 0x07, 0x03, 0x2d, 0x7d, 0x1a, 0x56, 0x94, 0xd7, 0x7f, 0xa6, 0x3d, 0xc8, 0x8f, + 0x64, 0xf2, 0x9b, 0x07, 0xec, 0xa1, 0x90, 0xa2, 0x32, 0x06, 0x13, 0x80, 0x83, 0xd4, 0x71, 0x19, + 0x46, 0x60, 0x2e, 0x9b, 0x1a, 0x59, 0x2a, 0xd3, 0xb1, 0x1a, 0xd2, 0xc8, 0x05, 0x83, 0x96, 0xe7, + 0x90, 0x6a, 0x4f, 0xe6, 0xde, 0xd0, 0x3d, 0xad, 0xaa, 0xf6, 0xfc, 0xc2, 0x1e, 0x0d, 0x2e, 0xec, + 0xe1, 0xc5, 0x79, 0x8b, 0x66, 0x67, 0x0b, 0x47, 0x76, 0x5a, 0x80, 0x13, 0xbe, 0x96, 0x18, 0xf7, + 0xaa, 0xe6, 0xd3, 0xf9, 0x7c, 0xbe, 0x3f, 0xaa, 0xec, 0x77, 0x7a, 0x6a, 0x9b, 0x1f, 0x45, 0xa5, + 0x44, 0x85, 0x34, 0x24, 0x00, 0xf3, 0x9c, 0xa0, 0x48, 0xbc, 0xd8, 0x7b, 0x65, 0xa9, 0x09, 0xba, + 0x74, 0x49, 0x3d, 0xbe, 0x46, 0xdd, 0xc9, 0x02, 0x20, 0x9f, 0xc6, 0x03, 0x82, 0x05, 0x17, 0x9a, + 0x1c, 0x32, 0x20, 0x92, 0xca, 0xc0, 0xc6, 0xbf, 0xfd, 0xc1, 0x69, 0xcf, 0x24, 0x93, 0xbc, 0x56, + 0x19, 0x30, 0xb7, 0x9b, 0x2c, 0xb3, 0x61, 0x01, 0x74, 0x7f, 0xce, 0xb9, 0xd4, 0x95, 0x1e, 0xab, + 0xc8, 0x56, 0x2b, 0x17, 0xb3, 0xf3, 0xf3, 0x8b, 0xe1, 0xbc, 0x3e, 0x28, 0x09, 0x0e, 0x9f, 0x1d, + 0xdb, 0xc3, 0xd1, 0xd0, 0x3e, 0x1e, 0x1a, 0xa9, 0x6a, 0x88, 0xb4, 0xf6, 0x34, 0xa9, 0x33, 0x45, + 0xea, 0xb0, 0x0a, 0xbd, 0xb3, 0x0b, 0x28, 0x4e, 0x6d, 0x5a, 0x1c, 0x9e, 0xd8, 0xc3, 0xd3, 0x67, + 0xf6, 0xc9, 0xd9, 0x97, 0x28, 0x51, 0xbe, 0xae, 0x2a, 0x71, 0x00, 0x1a, 0x1c, 0x62, 0xa3, 0xe2, + 0x1c, 0xc3, 0xaf, 0xaa, 0x26, 0x87, 0x3d, 0x7b, 0x40, 0x20, 0xef, 0x92, 0x33, 0x7c, 0x3b, 0xda, + 0x79, 0x2b, 0xf5, 0x1c, 0x7a, 0x3a, 0x2d, 0x3c, 0x04, 0xd5, 0xa4, 0x60, 0x72, 0x40, 0x29, 0xfe, + 0xf1, 0x63, 0xc4, 0x9f, 0xd3, 0xf9, 0xe0, 0xd9, 0x45, 0xab, 0x13, 0x0d, 0xec, 0xd1, 0x09, 0x04, + 0xda, 0xf1, 0x79, 0xa3, 0xfc, 0x30, 0x15, 0x57, 0x03, 0x91, 0x89, 0x59, 0x15, 0xaa, 0x63, 0x1c, + 0x22, 0xa3, 0x23, 0xf5, 0x21, 0x39, 0x9a, 0xc1, 0xe2, 0xdf, 0x39, 0x7d, 0x0c, 0x3f, 0x27, 0xa3, + 0x8b, 0x0b, 0x36, 0x6c, 0xe1, 0xe7, 0xec, 0x0c, 0xac, 0x81, 0x39, 0xa9, 0xd1, 0xa7, 0x95, 0x56, + 0x4c, 0xe4, 0x34, 0x47, 0x23, 0x06, 0xcc, 0xc1, 0x28, 0xd9, 0x89, 0x45, 0x53, 0x16, 0x91, 0xff, + 0x47, 0x79, 0xee, 0x68, 0x76, 0xe6, 0xce, 0x06, 0x0d, 0x9e, 0x7b, 0x02, 0x8e, 0x3b, 0x78, 0x66, + 0x0f, 0xcf, 0xcf, 0x5a, 0x3d, 0x57, 0xbb, 0xd3, 0xae, 0x2f, 0x69, 0xc3, 0x1a, 0x67, 0x0b, 0xf7, + 0x26, 0x1c, 0xab, 0x94, 0x86, 0xfb, 0x20, 0x72, 0xfb, 0x83, 0x5c, 0x1d, 0xe9, 0x5b, 0x20, 0x33, + 0xee, 0x6d, 0x88, 0xde, 0x36, 0xb6, 0xcc, 0x3d, 0x07, 0x8b, 0xc8, 0x69, 0x13, 0xab, 0x21, 0x18, + 0x2e, 0xbc, 0x13, 0x57, 0x5e, 0xf5, 0xf0, 0xfc, 0x15, 0xe9, 0xb8, 0x01, 0x4d, 0xd3, 0x89, 0x85, + 0x97, 0x35, 0x28, 0x24, 0xc6, 0x84, 0x84, 0x0f, 0xb2, 0xc2, 0x10, 0x2c, 0x7a, 0x04, 0x4b, 0x99, + 0x99, 0xaa, 0x67, 0xa2, 0x17, 0x90, 0x4a, 0x15, 0x28, 0x30, 0xf9, 0x40, 0xdf, 0x5d, 0x15, 0x94, + 0xab, 0xeb, 0x09, 0xcb, 0x00, 0xe3, 0x02, 0x11, 0x06, 0xad, 0x6b, 0x64, 0x93, 0xe0, 0x3d, 0x0f, + 0xa2, 0xef, 0x79, 0x40, 0x17, 0xdb, 0xef, 0xf7, 0xaf, 0x8e, 0x00, 0x15, 0xde, 0xf5, 0x88, 0x78, + 0xb1, 0xdf, 0x53, 0xa1, 0x6d, 0xc0, 0x0d, 0x8d, 0xc2, 0x42, 0xd6, 0x75, 0x67, 0xca, 0x93, 0x64, + 0x63, 0xd7, 0x71, 0x46, 0x8c, 0x79, 0x29, 0xf9, 0x03, 0x5d, 0xd1, 0xa9, 0xc4, 0xf6, 0x44, 0xe3, + 0xbf, 0x3a, 0x6a, 0xc6, 0x5f, 0x68, 0xc1, 0x22, 0x1d, 0x4d, 0xa2, 0x5a, 0x6f, 0x66, 0xb2, 0xb9, + 0x43, 0x81, 0xb3, 0xc0, 0x80, 0x60, 0x21, 0x21, 0x65, 0x05, 0x86, 0x00, 0x20, 0xba, 0x22, 0x91, + 0x60, 0x51, 0xd6, 0x76, 0x60, 0x90, 0x5c, 0x05, 0xbe, 0x81, 0xaa, 0x54, 0x21, 0x52, 0x2d, 0x42, + 0x88, 0x9b, 0x92, 0x65, 0xc2, 0xe6, 0x13, 0xeb, 0xc8, 0xba, 0x7e, 0xcd, 0x43, 0x76, 0x75, 0x44, + 0x71, 0xd3, 0x6b, 0xb5, 0x28, 0x6c, 0x05, 0x6d, 0x01, 0x51, 0x6d, 0x00, 0xa9, 0x95, 0x7e, 0x8b, + 0xc0, 0x62, 0x32, 0x00, 0x29, 0xb2, 0x04, 0x17, 0x59, 0x37, 0xea, 0x82, 0x0e, 0x5e, 0x0d, 0x7a, + 0xc1, 0x1f, 0x26, 0xd6, 0x00, 0x32, 0xfa, 0x08, 0xff, 0x59, 0x47, 0xa8, 0x81, 0xc0, 0xff, 0x7c, + 0x96, 0x9e, 0x16, 0x86, 0xac, 0x15, 0x46, 0x4b, 0x19, 0x3f, 0x0e, 0xac, 0x6b, 0xc5, 0x2d, 0x22, + 0x87, 0xdf, 0x19, 0xde, 0x5e, 0xd2, 0x1a, 0x47, 0x2d, 0xe3, 0x24, 0x73, 0x74, 0x5b, 0x48, 0x23, + 0xfd, 0xc9, 0x94, 0x43, 0x52, 0xa6, 0x5b, 0x52, 0x94, 0x27, 0x02, 0x9d, 0x20, 0xc1, 0xce, 0x0f, + 0x59, 0x89, 0x0b, 0xc5, 0x9b, 0x96, 0x00, 0x54, 0x7b, 0xb7, 0xa4, 0xd1, 0x3d, 0xd9, 0xf0, 0x8c, + 0xfc, 0xe7, 0xbf, 0xfd, 0x07, 0x81, 0x35, 0x0d, 0xf1, 0xa3, 0x54, 0xd0, 0x20, 0xc0, 0x63, 0x17, + 0xb1, 0x64, 0xd2, 0x2b, 0x42, 0xed, 0x14, 0x53, 0x3e, 0x17, 0x6b, 0x68, 0xd9, 0xfb, 0xe4, 0xbf, + 0xfe, 0xfd, 0xef, 0x7f, 0xbb, 0x3a, 0x8a, 0x11, 0xeb, 0x75, 0xe7, 0x2f, 0x00, 0xbd, 0xa4, 0xe0, + 0x3c, 0x2c, 0xc2, 0x56, 0xdc, 0x93, 0x70, 0xc5, 0xa9, 0xd9, 0x3b, 0xee, 0x01, 0xc0, 0x9b, 0x88, + 0xe0, 0x99, 0x19, 0xf9, 0x91, 0xcd, 0x64, 0xd7, 0x3e, 0x87, 0x8e, 0x5f, 0x92, 0x5d, 0x83, 0xe2, + 0xc9, 0x8c, 0x11, 0x84, 0x24, 0x60, 0x17, 0x58, 0x7a, 0xe2, 0x78, 0x82, 0xd7, 0xa3, 0x60, 0xe9, + 0x9c, 0xf6, 0xc1, 0xa5, 0x35, 0xa1, 0x6f, 0x81, 0x85, 0x34, 0x5b, 0x2c, 0x58, 0x8a, 0x3b, 0x04, + 0x29, 0xa1, 0x11, 0xee, 0xfa, 0x00, 0x09, 0x58, 0xef, 0x81, 0xa3, 0x90, 0x05, 0x47, 0x04, 0xe1, + 0x06, 0xb5, 0xde, 0x51, 0x6a, 0x5f, 0x0a, 0x11, 0xa7, 0xe3, 0xa3, 0xa3, 0x85, 0x2f, 0x96, 0xd9, + 0x0c, 0x52, 0x72, 0x78, 0x34, 0x7d, 0x41, 0x3f, 0xf2, 0xc8, 0xfd, 0x95, 0xde, 0x1f, 0x2d, 0x4b, + 0xd9, 0xac, 0xeb, 0xef, 0xe4, 0x14, 0x12, 0x27, 0xfc, 0x23, 0x73, 0x05, 0x5a, 0x43, 0xd1, 0x35, + 0x71, 0x65, 0xcc, 0x50, 0x39, 0x73, 0x6e, 0x0c, 0xd8, 0xcf, 0x8a, 0x0b, 0xc8, 0x9a, 0x96, 0x52, + 0xe2, 0x5b, 0x26, 0xfe, 0x31, 0x55, 0xa7, 0xa9, 0x28, 0x85, 0x3c, 0xd4, 0x95, 0x7a, 0x50, 0xf7, + 0x52, 0xc8, 0xad, 0x96, 0x11, 0xd4, 0x43, 0x89, 0x82, 0x26, 0x7c, 0x4e, 0x86, 0xa4, 0x0b, 0x44, + 0x7b, 0xe4, 0x5f, 0xf4, 0x2e, 0xba, 0x0d, 0xba, 0x74, 0x69, 0x06, 0x33, 0xa5, 0xba, 0x8d, 0x76, + 0x31, 0x9c, 0xc1, 0x30, 0x7e, 0x24, 0x6d, 0x23, 0x91, 0xe3, 0xd9, 0x6c, 0x55, 0xbb, 0x1f, 0x40, + 0x15, 0x60, 0x43, 0x30, 0xbd, 0x41, 0x3f, 0x4f, 0x78, 0x28, 0xe7, 0x4b, 0x16, 0xa4, 0xba, 0xdd, + 0xc0, 0x77, 0xef, 0x89, 0x3e, 0xaf, 0xee, 0x2b, 0x50, 0xb5, 0x2a, 0x53, 0x8e, 0x3c, 0x13, 0x11, + 0x22, 0xb7, 0x20, 0xad, 0xca, 0xa9, 0xe0, 0xee, 0xd5, 0x4b, 0x17, 0x35, 0x37, 0x84, 0x75, 0x9b, + 0x13, 0xd0, 0x19, 0x03, 0xdf, 0xff, 0x8e, 0x93, 0x17, 0x90, 0x6e, 0xb5, 0xc2, 0x15, 0x42, 0x8c, + 0x31, 0x8d, 0xba, 0x19, 0x73, 0xe5, 0xe4, 0xb9, 0x0d, 0xaf, 0xe4, 0x53, 0x62, 0xed, 0x14, 0x68, + 0x8b, 0xb8, 0xda, 0x09, 0xaf, 0xca, 0xc5, 0x8b, 0x43, 0x76, 0xed, 0xec, 0x1b, 0xf6, 0xa0, 0x5d, + 0x6f, 0x71, 0x6d, 0x7b, 0xd0, 0x64, 0x84, 0x47, 0xa5, 0x96, 0xeb, 0x3a, 0xad, 0x09, 0xde, 0x29, + 0x75, 0x5a, 0x9e, 0xed, 0xb7, 0x49, 0xfe, 0x1e, 0xb2, 0x0c, 0xc1, 0x39, 0x75, 0x9d, 0x96, 0xee, + 0xdc, 0x26, 0xfd, 0xe8, 0x6b, 0x7a, 0xf5, 0x0d, 0x8f, 0x16, 0x78, 0x04, 0x13, 0xc8, 0x3d, 0xbd, + 0xf4, 0x09, 0xb9, 0x5b, 0xea, 0xab, 0x0a, 0x04, 0x9c, 0x33, 0xe2, 0x6b, 0x79, 0xc6, 0xbc, 0x41, + 0x87, 0x07, 0x97, 0xed, 0x6b, 0x4b, 0x1d, 0xb4, 0xfa, 0x67, 0xfb, 0xd3, 0x23, 0x2c, 0x5f, 0x5c, + 0x99, 0xd9, 0x93, 0x8f, 0xec, 0xd4, 0x6c, 0xbc, 0xa4, 0xd9, 0xb9, 0x92, 0xbd, 0x9b, 0x71, 0x84, + 0x5a, 0x47, 0x4d, 0x54, 0xf3, 0x81, 0x39, 0x77, 0x04, 0xc9, 0xf7, 0x98, 0xec, 0xb5, 0xf7, 0x0d, + 0x79, 0x1a, 0xbe, 0x15, 0x29, 0x99, 0x84, 0x9e, 0xe9, 0x5f, 0x49, 0xd9, 0x40, 0x62, 0x91, 0xd6, + 0x3c, 0x5e, 0xc9, 0xce, 0x11, 0xeb, 0x5a, 0x33, 0x13, 0xc7, 0xff, 0xa3, 0x4c, 0xc8, 0x6d, 0xba, + 0x3a, 0x0b, 0xbb, 0x45, 0x45, 0x55, 0xd6, 0x10, 0x90, 0x60, 0xd9, 0x99, 0x9a, 0xa3, 0x53, 0xd2, + 0xf5, 0xf1, 0x2c, 0xd7, 0xed, 0xf7, 0x34, 0x78, 0xe7, 0x4a, 0xee, 0x09, 0x19, 0x78, 0xac, 0x54, + 0x15, 0x06, 0xe0, 0x49, 0x4b, 0x51, 0xb2, 0x6a, 0x49, 0x6b, 0xed, 0x9d, 0xc9, 0xee, 0xea, 0xa2, + 0x85, 0x93, 0x3f, 0xdd, 0xdc, 0x10, 0x75, 0x14, 0x8b, 0x87, 0xc6, 0x9a, 0x09, 0xcd, 0x43, 0xe7, + 0x37, 0x32, 0xb1, 0x77, 0xba, 0xfb, 0x3b, 0xd9, 0xe5, 0x47, 0x7f, 0xee, 0x7f, 0x96, 0x55, 0xa6, + 0x6f, 0x5e, 0x7e, 0xa1, 0x06, 0x6a, 0x67, 0x95, 0x8f, 0x34, 0xc1, 0xad, 0x3e, 0x00, 0xfd, 0x4a, + 0xa4, 0x8b, 0xf3, 0xd4, 0xdf, 0x2b, 0x1a, 0x30, 0x91, 0x7d, 0x8e, 0xda, 0x7f, 0x54, 0x35, 0xe0, + 0x7b, 0x79, 0x1e, 0xf2, 0xa5, 0x1e, 0xb8, 0x7f, 0xf0, 0xfe, 0x48, 0x2b, 0x14, 0x75, 0xe7, 0xa5, + 0x3a, 0x71, 0xff, 0x2a, 0x8c, 0xec, 0x9e, 0xe2, 0x3f, 0x92, 0x97, 0x9b, 0xf2, 0x64, 0x9d, 0xdc, + 0x95, 0x07, 0xf6, 0x5f, 0xc0, 0x52, 0xa7, 0xe4, 0xe9, 0xf0, 0x65, 0x80, 0xc7, 0x99, 0xac, 0x53, + 0xe5, 0xf0, 0x5b, 0x79, 0xf8, 0x5f, 0x67, 0xee, 0xcb, 0x79, 0xab, 0x5f, 0x29, 0x68, 0x2b, 0xfe, + 0x45, 0x65, 0x32, 0x0e, 0x48, 0x2a, 0x3b, 0x07, 0x64, 0x89, 0xeb, 0xbb, 0xb1, 0x19, 0x39, 0x31, + 0x4b, 0x29, 0xb5, 0x32, 0x28, 0xf9, 0xc2, 0x3d, 0x68, 0x5c, 0x9e, 0x9e, 0x90, 0x72, 0x73, 0x9b, + 0xec, 0xac, 0xe2, 0x0d, 0xae, 0xca, 0xe8, 0x69, 0x19, 0x23, 0xb5, 0x36, 0x64, 0xe7, 0xfa, 0x66, + 0x5b, 0x35, 0x7e, 0x2e, 0x53, 0x24, 0xd1, 0xe1, 0x52, 0x6b, 0x47, 0x3a, 0xbf, 0x4b, 0xe0, 0xbe, + 0xfb, 0xe3, 0xdd, 0x5d, 0x11, 0xb7, 0xaa, 0x17, 0x78, 0x4c, 0xd2, 0x94, 0x77, 0x72, 0x8c, 0xf5, + 0x63, 0xbd, 0x3c, 0xc0, 0xa7, 0x8e, 0x81, 0xac, 0xcc, 0xc3, 0xff, 0xb5, 0x41, 0x60, 0xc1, 0xf2, + 0xe6, 0xb6, 0xa0, 0x24, 0xdb, 0x8e, 0xdf, 0x1a, 0x66, 0xd5, 0x6b, 0x41, 0x8f, 0x0c, 0xae, 0x1f, + 0xd2, 0x2f, 0x0e, 0xee, 0xf2, 0x02, 0xd1, 0xff, 0x6e, 0x8a, 0xaf, 0x5f, 0x49, 0x7a, 0x2c, 0x6d, + 0x9e, 0x88, 0xaf, 0x42, 0x17, 0xaf, 0x54, 0xed, 0xb5, 0xfb, 0xa5, 0xff, 0x7c, 0x13, 0xcd, 0xd2, + 0xf8, 0xd2, 0x74, 0x91, 0x87, 0xa2, 0xb5, 0x3d, 0x44, 0xcf, 0x1f, 0x1b, 0xa2, 0x7b, 0xe1, 0xa9, + 0x59, 0xae, 0x7a, 0x74, 0x25, 0x26, 0xeb, 0x77, 0xde, 0x5a, 0xd7, 0x45, 0xb8, 0x5a, 0x2f, 0x3b, + 0xca, 0x9d, 0x90, 0xac, 0xb4, 0xc7, 0x46, 0x10, 0x28, 0xb8, 0x90, 0xab, 0x00, 0x08, 0xd8, 0x3b, + 0x86, 0xf5, 0x36, 0xb0, 0x17, 0x27, 0xce, 0x70, 0x40, 0x60, 0x55, 0x2a, 0xcf, 0x66, 0xd4, 0x85, + 0x07, 0x25, 0x52, 0x02, 0x0a, 0x45, 0x4e, 0x41, 0x56, 0xfc, 0x3a, 0xac, 0x05, 0xaa, 0xce, 0x82, + 0x95, 0xab, 0x90, 0xcd, 0xdb, 0x5e, 0xf2, 0xe0, 0xcf, 0x82, 0x8c, 0xa1, 0x6c, 0x11, 0x93, 0x3a, + 0x94, 0xbc, 0x67, 0x79, 0xdd, 0x79, 0x4e, 0x52, 0x3f, 0xc4, 0xe3, 0x5e, 0x39, 0x11, 0x96, 0xbb, + 0x62, 0x29, 0x79, 0x90, 0x8b, 0x55, 0x4a, 0xe4, 0xe9, 0x12, 0xf1, 0xa1, 0x9d, 0x2f, 0x83, 0xb5, + 0x90, 0x89, 0xce, 0x52, 0x1e, 0x64, 0xa0, 0x7c, 0x3f, 0x82, 0xe4, 0xeb, 0x6c, 0x9c, 0x81, 0x9a, + 0x0f, 0x9f, 0x7b, 0x5b, 0x39, 0x24, 0x4c, 0x9c, 0x13, 0x6b, 0x67, 0x37, 0x69, 0x0d, 0x5a, 0x58, + 0xc2, 0x0f, 0xee, 0x1d, 0x39, 0x7a, 0xeb, 0xa8, 0x7d, 0xd7, 0xa8, 0x9a, 0x04, 0x7e, 0x9b, 0x72, + 0x41, 0x9f, 0x8b, 0x84, 0xb1, 0xe8, 0x80, 0x46, 0xcd, 0x7d, 0xd2, 0xcf, 0xd5, 0x69, 0xf5, 0xf6, + 0xea, 0x75, 0xa7, 0xa2, 0xac, 0xff, 0x0b, 0xba, 0xaa, 0x7d, 0xe0, 0x72, 0x8e, 0x7b, 0x1b, 0xb9, + 0x8d, 0x8b, 0xff, 0xc9, 0xef, 0xbf, 0x01, 0x02, 0xb8, 0x77, 0xc3, 0xf4, 0x37, 0x00, 0x00 }; \ No newline at end of file From 8f1dfaea106dacbbdc6e931f4402be8827a72428 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 14:48:59 +0200 Subject: [PATCH 33/99] FInalized preconfgi page --- html/index.js | 2 +- src/html/html_ui.h | 391 +++++++++++++++++++++++---------------------- 2 files changed, 197 insertions(+), 196 deletions(-) diff --git a/html/index.js b/html/index.js index 5cbb6cb..3914943 100644 --- a/html/index.js +++ b/html/index.js @@ -143,7 +143,7 @@ function read(uri) { req.addEventListener('error', function (e) { showToastMessage("Error while getting Data ", true); reject(); }); req.open("GET", uri); req.onload = function (data) { - resolve(JSON.parse(req.response)); + resolve(JSON.parse(req.responseText)); } req.send(); }) diff --git a/src/html/html_ui.h b/src/html/html_ui.h index c77624e..4a46932 100644 --- a/src/html/html_ui.h +++ b/src/html/html_ui.h @@ -4,7 +4,7 @@ */ // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4271; + const uint16_t PAGE_index_L = 4275; const uint8_t PAGE_index[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x72, 0xdb, 0x48, 0x76, 0xef, 0xfc, 0x8a, 0x36, 0x5c, 0x99, 0x90, 0x29, 0x80, 0x22, 0xa9, 0x9b, 0x45, 0x89, 0x4a, @@ -79,199 +79,200 @@ 0x87, 0xe9, 0xf7, 0xef, 0x21, 0x5a, 0x13, 0xa0, 0xe3, 0xcf, 0x21, 0xbe, 0x7b, 0xb5, 0x02, 0x24, 0x9b, 0x2e, 0xd6, 0xac, 0x6c, 0x61, 0xa7, 0x46, 0xd9, 0xb4, 0x49, 0xd9, 0xf4, 0xab, 0xa8, 0x62, 0xa1, 0x74, 0x40, 0xd0, 0xf0, 0x44, 0xe9, 0x21, 0x55, 0x7a, 0xa0, 0x5a, 0x0f, 0xdf, 0xbd, 0x02, - 0x35, 0x30, 0xf9, 0x1c, 0xa1, 0x31, 0x27, 0x55, 0xe4, 0xa2, 0x4b, 0x0b, 0x23, 0xf5, 0xb6, 0x30, - 0x47, 0x0a, 0x5d, 0x2f, 0xb2, 0xbb, 0xf4, 0xc1, 0xbd, 0x26, 0x40, 0xc7, 0xa4, 0xb9, 0xdd, 0xd8, - 0x86, 0x14, 0x26, 0x70, 0xba, 0xe4, 0x12, 0x0d, 0x6f, 0x8d, 0xd5, 0xc0, 0x34, 0x73, 0x5d, 0x40, - 0x21, 0x87, 0x80, 0x9d, 0x4f, 0x40, 0xee, 0x40, 0x61, 0xba, 0xa8, 0x84, 0x34, 0xb3, 0xdd, 0x00, - 0x6a, 0xde, 0x9d, 0xea, 0xd4, 0xbb, 0xba, 0x63, 0x47, 0x21, 0x1b, 0x33, 0xab, 0xad, 0x27, 0x4c, - 0xb0, 0xd7, 0xd0, 0x30, 0x55, 0x97, 0xde, 0x03, 0x83, 0x54, 0xe8, 0xc1, 0x7a, 0x68, 0xdb, 0xb3, - 0x47, 0x17, 0x83, 0x41, 0x45, 0x1b, 0x8b, 0x9d, 0x66, 0xa5, 0x34, 0xbe, 0xb7, 0x9f, 0xe8, 0xfb, - 0x2b, 0x9c, 0xd3, 0x04, 0xfc, 0x1e, 0xb2, 0x24, 0x4b, 0x0a, 0x14, 0x72, 0xd5, 0x31, 0x69, 0xc5, - 0x70, 0xa9, 0x49, 0xc8, 0xfe, 0xe0, 0x5b, 0x30, 0x22, 0x48, 0x5c, 0xcf, 0xbd, 0x75, 0x9e, 0x30, - 0xfe, 0x5b, 0x91, 0x4d, 0x2a, 0xe5, 0x05, 0xe3, 0xb5, 0xb2, 0x86, 0x28, 0xb3, 0x93, 0xea, 0xdf, - 0xc7, 0x79, 0xd1, 0xfe, 0x8f, 0x9b, 0x79, 0xdf, 0x5f, 0x3a, 0xf4, 0xec, 0xdd, 0xa6, 0xff, 0x13, - 0xa0, 0x7b, 0xcb, 0x07, 0xf0, 0x43, 0x6c, 0xc0, 0x81, 0xb8, 0x5c, 0x06, 0x8c, 0x17, 0x87, 0x96, - 0x0c, 0xb0, 0xc6, 0x82, 0x3e, 0xbd, 0x8d, 0x44, 0xd9, 0xd5, 0xf7, 0x6c, 0x5c, 0x29, 0xb4, 0xe0, - 0x92, 0x2b, 0x0a, 0x5c, 0xad, 0xa9, 0x96, 0xb4, 0x65, 0x56, 0xd1, 0xc5, 0x02, 0x83, 0xb2, 0x15, - 0x1e, 0xe7, 0xd5, 0x86, 0xbf, 0x55, 0xcc, 0xfd, 0x05, 0x43, 0xcf, 0xde, 0xe9, 0xf5, 0x0f, 0xc3, - 0xee, 0xae, 0x18, 0x7a, 0xf6, 0xc1, 0xde, 0xfe, 0x30, 0xb2, 0xc3, 0xab, 0x87, 0x1a, 0xea, 0x5a, - 0x7b, 0xff, 0x68, 0xac, 0xf5, 0x65, 0x03, 0xe8, 0x4a, 0xb7, 0xef, 0xe3, 0xbc, 0x5d, 0xbf, 0x7b, - 0x0b, 0x05, 0xc8, 0x62, 0xd0, 0xec, 0xb7, 0x4f, 0x94, 0x4b, 0x03, 0x68, 0x9d, 0x6d, 0x2b, 0x05, - 0x62, 0xec, 0x8b, 0x0a, 0x75, 0xe7, 0xea, 0x48, 0xaf, 0xfe, 0xc9, 0x95, 0x4c, 0x03, 0xd7, 0x1d, - 0xdc, 0x15, 0xc9, 0xe7, 0x00, 0xe2, 0xcc, 0x69, 0xe8, 0x07, 0x9b, 0xb1, 0xf2, 0x55, 0x27, 0xf3, - 0x6d, 0x47, 0x6d, 0x33, 0xa8, 0x01, 0xfb, 0x45, 0xe0, 0x47, 0xf7, 0xef, 0xa8, 0x3b, 0x95, 0x8f, - 0xdf, 0x02, 0x84, 0x0d, 0xd5, 0x70, 0xc1, 0x19, 0xf9, 0xe1, 0x8d, 0x65, 0x7f, 0xe0, 0x33, 0x2e, - 0xb8, 0x6d, 0xbd, 0x66, 0xc1, 0x8a, 0x09, 0x28, 0x30, 0xe4, 0x3d, 0xcb, 0xa0, 0xde, 0x3c, 0x4f, - 0xa0, 0x83, 0xb2, 0xad, 0xf7, 0xf0, 0x92, 0x4c, 0x69, 0x04, 0x8d, 0x68, 0x0a, 0xbf, 0x1d, 0xf0, - 0x42, 0x7f, 0x6e, 0x5b, 0xcf, 0x91, 0x00, 0xb9, 0xc1, 0x2d, 0x10, 0xf2, 0x2a, 0xe4, 0x1f, 0x7d, - 0xab, 0xc4, 0xb9, 0x3f, 0x30, 0xdd, 0x84, 0x33, 0x1e, 0x58, 0x1a, 0x5b, 0x15, 0xea, 0x12, 0x78, - 0x63, 0xce, 0x52, 0x3a, 0xde, 0x78, 0xd8, 0x3f, 0xdd, 0xce, 0x32, 0x21, 0x78, 0x64, 0xfb, 0x51, - 0x9c, 0x09, 0x9b, 0xc7, 0x62, 0x91, 0xf0, 0x2c, 0x06, 0xe5, 0x04, 0xcc, 0x15, 0xb6, 0x00, 0x3d, - 0x43, 0x3f, 0x42, 0x6b, 0x62, 0xfb, 0xd1, 0x12, 0x78, 0x12, 0x97, 0x72, 0x2c, 0xf5, 0x7f, 0x65, - 0xe3, 0xe1, 0x60, 0xf0, 0x0f, 0x3b, 0x88, 0x87, 0xa7, 0x97, 0x21, 0x4d, 0x16, 0x7e, 0x34, 0x1e, - 0xd4, 0x48, 0xe4, 0x1c, 0x02, 0x74, 0x1e, 0xf0, 0xf5, 0x78, 0xe5, 0xa7, 0xfe, 0x2c, 0x60, 0xe6, - 0xad, 0xa2, 0x98, 0x23, 0x45, 0x47, 0x24, 0x20, 0xf9, 0x9c, 0x27, 0xe1, 0x18, 0xbb, 0xea, 0xed, - 0x5f, 0x05, 0x14, 0xe4, 0x89, 0x9a, 0xf7, 0x93, 0xad, 0x9e, 0xa4, 0x77, 0x9a, 0x87, 0x34, 0x9b, - 0x85, 0x3e, 0x3c, 0xa9, 0x29, 0x39, 0xee, 0xf3, 0xdc, 0xfb, 0x02, 0x8d, 0x02, 0xe5, 0x80, 0x46, - 0x2e, 0x1b, 0xab, 0x37, 0x75, 0x4c, 0xe3, 0xb1, 0x13, 0xf2, 0x5f, 0x9d, 0x39, 0xb4, 0xa3, 0xa9, - 0x23, 0xab, 0x48, 0x0d, 0x77, 0xeb, 0x6b, 0x4d, 0xad, 0xe1, 0xbd, 0x42, 0xbc, 0xff, 0x22, 0x9f, - 0x81, 0xfb, 0xb2, 0xc4, 0x91, 0x8e, 0x24, 0x65, 0xba, 0x8c, 0xa1, 0xce, 0x63, 0x00, 0x0d, 0x76, - 0x78, 0x2a, 0x41, 0xb1, 0xbb, 0xa8, 0x33, 0xd4, 0xf8, 0xce, 0x70, 0xb3, 0xf3, 0x52, 0xb3, 0x52, - 0x1f, 0xcd, 0xa1, 0xc4, 0xa1, 0x99, 0xc6, 0xc3, 0xf8, 0x81, 0x78, 0x5c, 0x08, 0xe6, 0x91, 0x17, - 0x72, 0x22, 0x06, 0xd4, 0x76, 0xee, 0xb3, 0xc0, 0x03, 0x4a, 0xb9, 0x61, 0xae, 0x7f, 0x7c, 0xca, - 0x42, 0xd2, 0x3f, 0x97, 0xbf, 0xcf, 0x46, 0xf0, 0xb1, 0x0d, 0xd8, 0x02, 0xea, 0x01, 0x08, 0xf4, - 0x80, 0xa6, 0xc7, 0x49, 0x5a, 0x36, 0x18, 0xb9, 0x94, 0x3b, 0x74, 0x85, 0x7f, 0xe8, 0xba, 0x39, - 0x16, 0xb8, 0xd7, 0x06, 0xde, 0xf0, 0xa0, 0xf6, 0x04, 0x95, 0xb7, 0x14, 0xf2, 0x5f, 0x42, 0xcb, - 0x22, 0x20, 0x74, 0x62, 0xea, 0xa2, 0x6a, 0x92, 0x90, 0x06, 0xdb, 0x38, 0x81, 0xd4, 0x06, 0xf5, - 0x3d, 0x07, 0x5f, 0xc1, 0x08, 0x09, 0x1c, 0xc8, 0x24, 0x8b, 0x68, 0x3c, 0x83, 0x5e, 0x1e, 0xf9, - 0xdf, 0x16, 0x7e, 0x59, 0x78, 0x13, 0x85, 0xd5, 0x90, 0x56, 0xa5, 0xbb, 0x64, 0xee, 0x3d, 0xb0, - 0x53, 0xb8, 0x0a, 0xf5, 0x7c, 0xfe, 0x53, 0x0b, 0xcb, 0xbb, 0x76, 0x88, 0x64, 0x1a, 0x43, 0xe3, - 0x6a, 0x27, 0x92, 0x06, 0x04, 0xf6, 0xfc, 0xc8, 0xd1, 0x9e, 0xda, 0x32, 0x11, 0x74, 0x5b, 0x9f, - 0x98, 0xeb, 0x60, 0xa8, 0xb0, 0xa6, 0x96, 0xe4, 0x3f, 0x35, 0x79, 0x28, 0x8a, 0x24, 0x0d, 0x70, - 0xa9, 0x8d, 0xe4, 0xe8, 0x0a, 0xe2, 0x8c, 0xe2, 0x87, 0x3a, 0x78, 0x49, 0x53, 0x0d, 0x38, 0x1e, - 0x73, 0xb9, 0xca, 0xb3, 0x4d, 0x98, 0x65, 0x0c, 0x95, 0x30, 0x73, 0xdc, 0x09, 0xcd, 0x62, 0xec, - 0xfa, 0x9c, 0x4f, 0x05, 0x8c, 0x8c, 0x71, 0x63, 0xd0, 0xad, 0xc7, 0x04, 0xf5, 0x83, 0x34, 0x37, - 0x86, 0x95, 0x6d, 0xd4, 0x36, 0xcd, 0x42, 0x88, 0xf4, 0x4d, 0x31, 0x1a, 0x40, 0xe3, 0xea, 0x80, - 0x49, 0xc3, 0x2d, 0x96, 0x92, 0x80, 0x0a, 0x56, 0xbc, 0x52, 0xd1, 0xac, 0xda, 0xa8, 0x9f, 0xea, - 0xa3, 0x12, 0xd7, 0x2f, 0x19, 0x17, 0xcc, 0xf6, 0x3c, 0xdb, 0x0b, 0xec, 0xb9, 0xbf, 0x80, 0x12, - 0x64, 0x2f, 0x87, 0xf6, 0x72, 0x64, 0x2f, 0x8f, 0xed, 0xe5, 0x89, 0xbd, 0x3c, 0xb5, 0x97, 0x67, - 0xf6, 0x32, 0xb1, 0x63, 0x3b, 0x4e, 0x58, 0xbe, 0x93, 0x5f, 0xf2, 0x19, 0x75, 0xef, 0x31, 0x7b, - 0x45, 0x9e, 0xda, 0x2a, 0x1e, 0xcb, 0x34, 0x02, 0xed, 0x11, 0x6e, 0xcc, 0x56, 0x5e, 0xfa, 0x21, - 0x94, 0x01, 0x4d, 0x55, 0x45, 0x89, 0x0c, 0x90, 0x86, 0xe0, 0x30, 0xa6, 0x18, 0x9f, 0xc2, 0x10, - 0x9a, 0x91, 0x14, 0x4a, 0x94, 0xc1, 0x8d, 0x31, 0xa5, 0x68, 0x95, 0xb1, 0x63, 0xb8, 0xaa, 0x78, - 0x16, 0x0f, 0xec, 0x2c, 0xc8, 0xa5, 0x5e, 0x2a, 0x19, 0xa0, 0x61, 0xe2, 0xff, 0xcf, 0x0a, 0xf3, - 0x4f, 0xf6, 0x78, 0x4c, 0xe7, 0x10, 0x1c, 0xf0, 0x39, 0x63, 0x90, 0xd6, 0x59, 0x4b, 0x2c, 0xea, - 0xaf, 0x2a, 0x4b, 0x0c, 0x2e, 0x6b, 0x49, 0x33, 0xe5, 0x81, 0xef, 0x99, 0x21, 0x65, 0xde, 0xa7, - 0x6c, 0xc4, 0x9e, 0xcd, 0x41, 0x6b, 0x45, 0x7e, 0x15, 0x3c, 0x36, 0x39, 0x06, 0x62, 0xc6, 0x0f, - 0x17, 0xf9, 0x3e, 0x8e, 0x32, 0x77, 0x40, 0x86, 0xc1, 0xe2, 0x65, 0x72, 0xcc, 0x56, 0xd6, 0x27, - 0xc8, 0x98, 0x98, 0xb4, 0xe1, 0x9b, 0x03, 0xce, 0xe9, 0xb2, 0x25, 0x0f, 0x00, 0x41, 0x51, 0x08, - 0x9b, 0x5f, 0xe7, 0x9a, 0x21, 0x3a, 0xa0, 0xcc, 0x1d, 0x68, 0x44, 0x9f, 0xc2, 0xf4, 0x39, 0xa8, - 0x9a, 0x11, 0xb4, 0x83, 0xfd, 0x15, 0xba, 0x9a, 0xb2, 0x62, 0xea, 0xf8, 0x70, 0xb3, 0x24, 0x85, - 0x39, 0x31, 0xf7, 0xa1, 0xc9, 0x4b, 0xb6, 0x32, 0x2d, 0xe7, 0xa5, 0x46, 0x03, 0x1a, 0xa7, 0x6c, - 0x6c, 0xbe, 0x6c, 0xf7, 0x02, 0x2f, 0x2f, 0xeb, 0x7d, 0xad, 0x03, 0x50, 0x4d, 0x6c, 0x91, 0x24, - 0xfa, 0xc6, 0xa0, 0xce, 0x49, 0x5e, 0xd8, 0x16, 0xe8, 0x87, 0xda, 0x32, 0x27, 0x60, 0x99, 0x7e, - 0xfc, 0x00, 0x6f, 0xb5, 0xdf, 0x3b, 0x01, 0x9b, 0x83, 0xa3, 0x24, 0x2c, 0x34, 0x91, 0x00, 0x71, - 0x25, 0x7d, 0x07, 0x86, 0x60, 0xea, 0xc6, 0x19, 0x15, 0x53, 0xc1, 0xc0, 0xe3, 0xfe, 0x69, 0x75, - 0xaa, 0xc2, 0xad, 0x06, 0xb7, 0xfd, 0xd0, 0x19, 0x9a, 0x00, 0xec, 0x8f, 0xf4, 0x90, 0x00, 0x78, - 0x35, 0x56, 0x82, 0x03, 0x5a, 0xe7, 0xb8, 0x2c, 0x73, 0xe7, 0x66, 0x6c, 0x58, 0x8e, 0x95, 0xe0, - 0xc3, 0x1a, 0xb8, 0x1e, 0x07, 0x09, 0x86, 0x75, 0x09, 0xd4, 0x9b, 0x1d, 0x19, 0x8a, 0xe9, 0x9b, - 0xca, 0xf4, 0x12, 0xcf, 0x9e, 0x18, 0x25, 0xf6, 0xb3, 0x1d, 0xfd, 0xf4, 0x1b, 0xb0, 0x0f, 0xfb, - 0x05, 0xf6, 0x67, 0x35, 0xec, 0xa3, 0x06, 0xdc, 0x23, 0x39, 0x35, 0x58, 0xfc, 0xab, 0x2c, 0x35, - 0x0e, 0xd6, 0xd2, 0x8a, 0x49, 0x95, 0xb2, 0x97, 0xce, 0x69, 0x5e, 0x44, 0xae, 0xe6, 0x65, 0xed, - 0x60, 0xe6, 0xcb, 0x95, 0xf5, 0x64, 0x2d, 0xeb, 0x4b, 0x04, 0xb0, 0xf8, 0xd8, 0x38, 0x27, 0x83, - 0x41, 0xee, 0x38, 0xf2, 0x99, 0x43, 0x05, 0xf7, 0xc5, 0x66, 0x3c, 0xd4, 0x6d, 0xc0, 0x53, 0x77, - 0xe6, 0x9d, 0xb2, 0x81, 0x7e, 0x4a, 0x16, 0x33, 0xda, 0x1d, 0x0d, 0x8e, 0xed, 0xd1, 0x10, 0x7e, - 0x46, 0x27, 0x36, 0xac, 0x6e, 0xbb, 0x75, 0xc8, 0x5e, 0x6f, 0xdb, 0x5f, 0x24, 0xbe, 0x57, 0x14, - 0x06, 0x7c, 0x50, 0x43, 0xe8, 0x9f, 0x29, 0x68, 0x50, 0x7e, 0x37, 0x65, 0x05, 0x07, 0xb3, 0x30, - 0x4a, 0xc7, 0x09, 0x83, 0xb2, 0x25, 0xba, 0xf2, 0x74, 0x11, 0xda, 0x8c, 0xee, 0xc0, 0x1e, 0xce, - 0x13, 0x83, 0x4d, 0x81, 0x8e, 0x0e, 0x83, 0x8e, 0xf6, 0x40, 0xa5, 0x66, 0x20, 0xc3, 0x79, 0x79, - 0xd5, 0xc9, 0xcf, 0x07, 0x03, 0x2d, 0x7d, 0x1a, 0x56, 0x94, 0xd7, 0x7f, 0xa6, 0x3d, 0xc8, 0x8f, - 0x64, 0xf2, 0x9b, 0x07, 0xec, 0xa1, 0x90, 0xa2, 0x32, 0x06, 0x13, 0x80, 0x83, 0xd4, 0x71, 0x19, - 0x46, 0x60, 0x2e, 0x9b, 0x1a, 0x59, 0x2a, 0xd3, 0xb1, 0x1a, 0xd2, 0xc8, 0x05, 0x83, 0x96, 0xe7, - 0x90, 0x6a, 0x4f, 0xe6, 0xde, 0xd0, 0x3d, 0xad, 0xaa, 0xf6, 0xfc, 0xc2, 0x1e, 0x0d, 0x2e, 0xec, - 0xe1, 0xc5, 0x79, 0x8b, 0x66, 0x67, 0x0b, 0x47, 0x76, 0x5a, 0x80, 0x13, 0xbe, 0x96, 0x18, 0xf7, - 0xaa, 0xe6, 0xd3, 0xf9, 0x7c, 0xbe, 0x3f, 0xaa, 0xec, 0x77, 0x7a, 0x6a, 0x9b, 0x1f, 0x45, 0xa5, - 0x44, 0x85, 0x34, 0x24, 0x00, 0xf3, 0x9c, 0xa0, 0x48, 0xbc, 0xd8, 0x7b, 0x65, 0xa9, 0x09, 0xba, - 0x74, 0x49, 0x3d, 0xbe, 0x46, 0xdd, 0xc9, 0x02, 0x20, 0x9f, 0xc6, 0x03, 0x82, 0x05, 0x17, 0x9a, - 0x1c, 0x32, 0x20, 0x92, 0xca, 0xc0, 0xc6, 0xbf, 0xfd, 0xc1, 0x69, 0xcf, 0x24, 0x93, 0xbc, 0x56, - 0x19, 0x30, 0xb7, 0x9b, 0x2c, 0xb3, 0x61, 0x01, 0x74, 0x7f, 0xce, 0xb9, 0xd4, 0x95, 0x1e, 0xab, - 0xc8, 0x56, 0x2b, 0x17, 0xb3, 0xf3, 0xf3, 0x8b, 0xe1, 0xbc, 0x3e, 0x28, 0x09, 0x0e, 0x9f, 0x1d, - 0xdb, 0xc3, 0xd1, 0xd0, 0x3e, 0x1e, 0x1a, 0xa9, 0x6a, 0x88, 0xb4, 0xf6, 0x34, 0xa9, 0x33, 0x45, - 0xea, 0xb0, 0x0a, 0xbd, 0xb3, 0x0b, 0x28, 0x4e, 0x6d, 0x5a, 0x1c, 0x9e, 0xd8, 0xc3, 0xd3, 0x67, - 0xf6, 0xc9, 0xd9, 0x97, 0x28, 0x51, 0xbe, 0xae, 0x2a, 0x71, 0x00, 0x1a, 0x1c, 0x62, 0xa3, 0xe2, - 0x1c, 0xc3, 0xaf, 0xaa, 0x26, 0x87, 0x3d, 0x7b, 0x40, 0x20, 0xef, 0x92, 0x33, 0x7c, 0x3b, 0xda, - 0x79, 0x2b, 0xf5, 0x1c, 0x7a, 0x3a, 0x2d, 0x3c, 0x04, 0xd5, 0xa4, 0x60, 0x72, 0x40, 0x29, 0xfe, - 0xf1, 0x63, 0xc4, 0x9f, 0xd3, 0xf9, 0xe0, 0xd9, 0x45, 0xab, 0x13, 0x0d, 0xec, 0xd1, 0x09, 0x04, - 0xda, 0xf1, 0x79, 0xa3, 0xfc, 0x30, 0x15, 0x57, 0x03, 0x91, 0x89, 0x59, 0x15, 0xaa, 0x63, 0x1c, - 0x22, 0xa3, 0x23, 0xf5, 0x21, 0x39, 0x9a, 0xc1, 0xe2, 0xdf, 0x39, 0x7d, 0x0c, 0x3f, 0x27, 0xa3, - 0x8b, 0x0b, 0x36, 0x6c, 0xe1, 0xe7, 0xec, 0x0c, 0xac, 0x81, 0x39, 0xa9, 0xd1, 0xa7, 0x95, 0x56, - 0x4c, 0xe4, 0x34, 0x47, 0x23, 0x06, 0xcc, 0xc1, 0x28, 0xd9, 0x89, 0x45, 0x53, 0x16, 0x91, 0xff, - 0x47, 0x79, 0xee, 0x68, 0x76, 0xe6, 0xce, 0x06, 0x0d, 0x9e, 0x7b, 0x02, 0x8e, 0x3b, 0x78, 0x66, - 0x0f, 0xcf, 0xcf, 0x5a, 0x3d, 0x57, 0xbb, 0xd3, 0xae, 0x2f, 0x69, 0xc3, 0x1a, 0x67, 0x0b, 0xf7, - 0x26, 0x1c, 0xab, 0x94, 0x86, 0xfb, 0x20, 0x72, 0xfb, 0x83, 0x5c, 0x1d, 0xe9, 0x5b, 0x20, 0x33, - 0xee, 0x6d, 0x88, 0xde, 0x36, 0xb6, 0xcc, 0x3d, 0x07, 0x8b, 0xc8, 0x69, 0x13, 0xab, 0x21, 0x18, - 0x2e, 0xbc, 0x13, 0x57, 0x5e, 0xf5, 0xf0, 0xfc, 0x15, 0xe9, 0xb8, 0x01, 0x4d, 0xd3, 0x89, 0x85, - 0x97, 0x35, 0x28, 0x24, 0xc6, 0x84, 0x84, 0x0f, 0xb2, 0xc2, 0x10, 0x2c, 0x7a, 0x04, 0x4b, 0x99, - 0x99, 0xaa, 0x67, 0xa2, 0x17, 0x90, 0x4a, 0x15, 0x28, 0x30, 0xf9, 0x40, 0xdf, 0x5d, 0x15, 0x94, - 0xab, 0xeb, 0x09, 0xcb, 0x00, 0xe3, 0x02, 0x11, 0x06, 0xad, 0x6b, 0x64, 0x93, 0xe0, 0x3d, 0x0f, - 0xa2, 0xef, 0x79, 0x40, 0x17, 0xdb, 0xef, 0xf7, 0xaf, 0x8e, 0x00, 0x15, 0xde, 0xf5, 0x88, 0x78, - 0xb1, 0xdf, 0x53, 0xa1, 0x6d, 0xc0, 0x0d, 0x8d, 0xc2, 0x42, 0xd6, 0x75, 0x67, 0xca, 0x93, 0x64, - 0x63, 0xd7, 0x71, 0x46, 0x8c, 0x79, 0x29, 0xf9, 0x03, 0x5d, 0xd1, 0xa9, 0xc4, 0xf6, 0x44, 0xe3, - 0xbf, 0x3a, 0x6a, 0xc6, 0x5f, 0x68, 0xc1, 0x22, 0x1d, 0x4d, 0xa2, 0x5a, 0x6f, 0x66, 0xb2, 0xb9, - 0x43, 0x81, 0xb3, 0xc0, 0x80, 0x60, 0x21, 0x21, 0x65, 0x05, 0x86, 0x00, 0x20, 0xba, 0x22, 0x91, - 0x60, 0x51, 0xd6, 0x76, 0x60, 0x90, 0x5c, 0x05, 0xbe, 0x81, 0xaa, 0x54, 0x21, 0x52, 0x2d, 0x42, - 0x88, 0x9b, 0x92, 0x65, 0xc2, 0xe6, 0x13, 0xeb, 0xc8, 0xba, 0x7e, 0xcd, 0x43, 0x76, 0x75, 0x44, - 0x71, 0xd3, 0x6b, 0xb5, 0x28, 0x6c, 0x05, 0x6d, 0x01, 0x51, 0x6d, 0x00, 0xa9, 0x95, 0x7e, 0x8b, - 0xc0, 0x62, 0x32, 0x00, 0x29, 0xb2, 0x04, 0x17, 0x59, 0x37, 0xea, 0x82, 0x0e, 0x5e, 0x0d, 0x7a, - 0xc1, 0x1f, 0x26, 0xd6, 0x00, 0x32, 0xfa, 0x08, 0xff, 0x59, 0x47, 0xa8, 0x81, 0xc0, 0xff, 0x7c, - 0x96, 0x9e, 0x16, 0x86, 0xac, 0x15, 0x46, 0x4b, 0x19, 0x3f, 0x0e, 0xac, 0x6b, 0xc5, 0x2d, 0x22, - 0x87, 0xdf, 0x19, 0xde, 0x5e, 0xd2, 0x1a, 0x47, 0x2d, 0xe3, 0x24, 0x73, 0x74, 0x5b, 0x48, 0x23, - 0xfd, 0xc9, 0x94, 0x43, 0x52, 0xa6, 0x5b, 0x52, 0x94, 0x27, 0x02, 0x9d, 0x20, 0xc1, 0xce, 0x0f, - 0x59, 0x89, 0x0b, 0xc5, 0x9b, 0x96, 0x00, 0x54, 0x7b, 0xb7, 0xa4, 0xd1, 0x3d, 0xd9, 0xf0, 0x8c, - 0xfc, 0xe7, 0xbf, 0xfd, 0x07, 0x81, 0x35, 0x0d, 0xf1, 0xa3, 0x54, 0xd0, 0x20, 0xc0, 0x63, 0x17, - 0xb1, 0x64, 0xd2, 0x2b, 0x42, 0xed, 0x14, 0x53, 0x3e, 0x17, 0x6b, 0x68, 0xd9, 0xfb, 0xe4, 0xbf, - 0xfe, 0xfd, 0xef, 0x7f, 0xbb, 0x3a, 0x8a, 0x11, 0xeb, 0x75, 0xe7, 0x2f, 0x00, 0xbd, 0xa4, 0xe0, - 0x3c, 0x2c, 0xc2, 0x56, 0xdc, 0x93, 0x70, 0xc5, 0xa9, 0xd9, 0x3b, 0xee, 0x01, 0xc0, 0x9b, 0x88, - 0xe0, 0x99, 0x19, 0xf9, 0x91, 0xcd, 0x64, 0xd7, 0x3e, 0x87, 0x8e, 0x5f, 0x92, 0x5d, 0x83, 0xe2, - 0xc9, 0x8c, 0x11, 0x84, 0x24, 0x60, 0x17, 0x58, 0x7a, 0xe2, 0x78, 0x82, 0xd7, 0xa3, 0x60, 0xe9, - 0x9c, 0xf6, 0xc1, 0xa5, 0x35, 0xa1, 0x6f, 0x81, 0x85, 0x34, 0x5b, 0x2c, 0x58, 0x8a, 0x3b, 0x04, - 0x29, 0xa1, 0x11, 0xee, 0xfa, 0x00, 0x09, 0x58, 0xef, 0x81, 0xa3, 0x90, 0x05, 0x47, 0x04, 0xe1, - 0x06, 0xb5, 0xde, 0x51, 0x6a, 0x5f, 0x0a, 0x11, 0xa7, 0xe3, 0xa3, 0xa3, 0x85, 0x2f, 0x96, 0xd9, - 0x0c, 0x52, 0x72, 0x78, 0x34, 0x7d, 0x41, 0x3f, 0xf2, 0xc8, 0xfd, 0x95, 0xde, 0x1f, 0x2d, 0x4b, - 0xd9, 0xac, 0xeb, 0xef, 0xe4, 0x14, 0x12, 0x27, 0xfc, 0x23, 0x73, 0x05, 0x5a, 0x43, 0xd1, 0x35, - 0x71, 0x65, 0xcc, 0x50, 0x39, 0x73, 0x6e, 0x0c, 0xd8, 0xcf, 0x8a, 0x0b, 0xc8, 0x9a, 0x96, 0x52, - 0xe2, 0x5b, 0x26, 0xfe, 0x31, 0x55, 0xa7, 0xa9, 0x28, 0x85, 0x3c, 0xd4, 0x95, 0x7a, 0x50, 0xf7, - 0x52, 0xc8, 0xad, 0x96, 0x11, 0xd4, 0x43, 0x89, 0x82, 0x26, 0x7c, 0x4e, 0x86, 0xa4, 0x0b, 0x44, - 0x7b, 0xe4, 0x5f, 0xf4, 0x2e, 0xba, 0x0d, 0xba, 0x74, 0x69, 0x06, 0x33, 0xa5, 0xba, 0x8d, 0x76, - 0x31, 0x9c, 0xc1, 0x30, 0x7e, 0x24, 0x6d, 0x23, 0x91, 0xe3, 0xd9, 0x6c, 0x55, 0xbb, 0x1f, 0x40, - 0x15, 0x60, 0x43, 0x30, 0xbd, 0x41, 0x3f, 0x4f, 0x78, 0x28, 0xe7, 0x4b, 0x16, 0xa4, 0xba, 0xdd, - 0xc0, 0x77, 0xef, 0x89, 0x3e, 0xaf, 0xee, 0x2b, 0x50, 0xb5, 0x2a, 0x53, 0x8e, 0x3c, 0x13, 0x11, - 0x22, 0xb7, 0x20, 0xad, 0xca, 0xa9, 0xe0, 0xee, 0xd5, 0x4b, 0x17, 0x35, 0x37, 0x84, 0x75, 0x9b, - 0x13, 0xd0, 0x19, 0x03, 0xdf, 0xff, 0x8e, 0x93, 0x17, 0x90, 0x6e, 0xb5, 0xc2, 0x15, 0x42, 0x8c, - 0x31, 0x8d, 0xba, 0x19, 0x73, 0xe5, 0xe4, 0xb9, 0x0d, 0xaf, 0xe4, 0x53, 0x62, 0xed, 0x14, 0x68, - 0x8b, 0xb8, 0xda, 0x09, 0xaf, 0xca, 0xc5, 0x8b, 0x43, 0x76, 0xed, 0xec, 0x1b, 0xf6, 0xa0, 0x5d, - 0x6f, 0x71, 0x6d, 0x7b, 0xd0, 0x64, 0x84, 0x47, 0xa5, 0x96, 0xeb, 0x3a, 0xad, 0x09, 0xde, 0x29, - 0x75, 0x5a, 0x9e, 0xed, 0xb7, 0x49, 0xfe, 0x1e, 0xb2, 0x0c, 0xc1, 0x39, 0x75, 0x9d, 0x96, 0xee, - 0xdc, 0x26, 0xfd, 0xe8, 0x6b, 0x7a, 0xf5, 0x0d, 0x8f, 0x16, 0x78, 0x04, 0x13, 0xc8, 0x3d, 0xbd, - 0xf4, 0x09, 0xb9, 0x5b, 0xea, 0xab, 0x0a, 0x04, 0x9c, 0x33, 0xe2, 0x6b, 0x79, 0xc6, 0xbc, 0x41, - 0x87, 0x07, 0x97, 0xed, 0x6b, 0x4b, 0x1d, 0xb4, 0xfa, 0x67, 0xfb, 0xd3, 0x23, 0x2c, 0x5f, 0x5c, - 0x99, 0xd9, 0x93, 0x8f, 0xec, 0xd4, 0x6c, 0xbc, 0xa4, 0xd9, 0xb9, 0x92, 0xbd, 0x9b, 0x71, 0x84, - 0x5a, 0x47, 0x4d, 0x54, 0xf3, 0x81, 0x39, 0x77, 0x04, 0xc9, 0xf7, 0x98, 0xec, 0xb5, 0xf7, 0x0d, - 0x79, 0x1a, 0xbe, 0x15, 0x29, 0x99, 0x84, 0x9e, 0xe9, 0x5f, 0x49, 0xd9, 0x40, 0x62, 0x91, 0xd6, - 0x3c, 0x5e, 0xc9, 0xce, 0x11, 0xeb, 0x5a, 0x33, 0x13, 0xc7, 0xff, 0xa3, 0x4c, 0xc8, 0x6d, 0xba, - 0x3a, 0x0b, 0xbb, 0x45, 0x45, 0x55, 0xd6, 0x10, 0x90, 0x60, 0xd9, 0x99, 0x9a, 0xa3, 0x53, 0xd2, - 0xf5, 0xf1, 0x2c, 0xd7, 0xed, 0xf7, 0x34, 0x78, 0xe7, 0x4a, 0xee, 0x09, 0x19, 0x78, 0xac, 0x54, - 0x15, 0x06, 0xe0, 0x49, 0x4b, 0x51, 0xb2, 0x6a, 0x49, 0x6b, 0xed, 0x9d, 0xc9, 0xee, 0xea, 0xa2, - 0x85, 0x93, 0x3f, 0xdd, 0xdc, 0x10, 0x75, 0x14, 0x8b, 0x87, 0xc6, 0x9a, 0x09, 0xcd, 0x43, 0xe7, - 0x37, 0x32, 0xb1, 0x77, 0xba, 0xfb, 0x3b, 0xd9, 0xe5, 0x47, 0x7f, 0xee, 0x7f, 0x96, 0x55, 0xa6, - 0x6f, 0x5e, 0x7e, 0xa1, 0x06, 0x6a, 0x67, 0x95, 0x8f, 0x34, 0xc1, 0xad, 0x3e, 0x00, 0xfd, 0x4a, - 0xa4, 0x8b, 0xf3, 0xd4, 0xdf, 0x2b, 0x1a, 0x30, 0x91, 0x7d, 0x8e, 0xda, 0x7f, 0x54, 0x35, 0xe0, - 0x7b, 0x79, 0x1e, 0xf2, 0xa5, 0x1e, 0xb8, 0x7f, 0xf0, 0xfe, 0x48, 0x2b, 0x14, 0x75, 0xe7, 0xa5, - 0x3a, 0x71, 0xff, 0x2a, 0x8c, 0xec, 0x9e, 0xe2, 0x3f, 0x92, 0x97, 0x9b, 0xf2, 0x64, 0x9d, 0xdc, - 0x95, 0x07, 0xf6, 0x5f, 0xc0, 0x52, 0xa7, 0xe4, 0xe9, 0xf0, 0x65, 0x80, 0xc7, 0x99, 0xac, 0x53, - 0xe5, 0xf0, 0x5b, 0x79, 0xf8, 0x5f, 0x67, 0xee, 0xcb, 0x79, 0xab, 0x5f, 0x29, 0x68, 0x2b, 0xfe, - 0x45, 0x65, 0x32, 0x0e, 0x48, 0x2a, 0x3b, 0x07, 0x64, 0x89, 0xeb, 0xbb, 0xb1, 0x19, 0x39, 0x31, - 0x4b, 0x29, 0xb5, 0x32, 0x28, 0xf9, 0xc2, 0x3d, 0x68, 0x5c, 0x9e, 0x9e, 0x90, 0x72, 0x73, 0x9b, - 0xec, 0xac, 0xe2, 0x0d, 0xae, 0xca, 0xe8, 0x69, 0x19, 0x23, 0xb5, 0x36, 0x64, 0xe7, 0xfa, 0x66, - 0x5b, 0x35, 0x7e, 0x2e, 0x53, 0x24, 0xd1, 0xe1, 0x52, 0x6b, 0x47, 0x3a, 0xbf, 0x4b, 0xe0, 0xbe, - 0xfb, 0xe3, 0xdd, 0x5d, 0x11, 0xb7, 0xaa, 0x17, 0x78, 0x4c, 0xd2, 0x94, 0x77, 0x72, 0x8c, 0xf5, - 0x63, 0xbd, 0x3c, 0xc0, 0xa7, 0x8e, 0x81, 0xac, 0xcc, 0xc3, 0xff, 0xb5, 0x41, 0x60, 0xc1, 0xf2, - 0xe6, 0xb6, 0xa0, 0x24, 0xdb, 0x8e, 0xdf, 0x1a, 0x66, 0xd5, 0x6b, 0x41, 0x8f, 0x0c, 0xae, 0x1f, - 0xd2, 0x2f, 0x0e, 0xee, 0xf2, 0x02, 0xd1, 0xff, 0x6e, 0x8a, 0xaf, 0x5f, 0x49, 0x7a, 0x2c, 0x6d, - 0x9e, 0x88, 0xaf, 0x42, 0x17, 0xaf, 0x54, 0xed, 0xb5, 0xfb, 0xa5, 0xff, 0x7c, 0x13, 0xcd, 0xd2, - 0xf8, 0xd2, 0x74, 0x91, 0x87, 0xa2, 0xb5, 0x3d, 0x44, 0xcf, 0x1f, 0x1b, 0xa2, 0x7b, 0xe1, 0xa9, - 0x59, 0xae, 0x7a, 0x74, 0x25, 0x26, 0xeb, 0x77, 0xde, 0x5a, 0xd7, 0x45, 0xb8, 0x5a, 0x2f, 0x3b, - 0xca, 0x9d, 0x90, 0xac, 0xb4, 0xc7, 0x46, 0x10, 0x28, 0xb8, 0x90, 0xab, 0x00, 0x08, 0xd8, 0x3b, - 0x86, 0xf5, 0x36, 0xb0, 0x17, 0x27, 0xce, 0x70, 0x40, 0x60, 0x55, 0x2a, 0xcf, 0x66, 0xd4, 0x85, - 0x07, 0x25, 0x52, 0x02, 0x0a, 0x45, 0x4e, 0x41, 0x56, 0xfc, 0x3a, 0xac, 0x05, 0xaa, 0xce, 0x82, - 0x95, 0xab, 0x90, 0xcd, 0xdb, 0x5e, 0xf2, 0xe0, 0xcf, 0x82, 0x8c, 0xa1, 0x6c, 0x11, 0x93, 0x3a, - 0x94, 0xbc, 0x67, 0x79, 0xdd, 0x79, 0x4e, 0x52, 0x3f, 0xc4, 0xe3, 0x5e, 0x39, 0x11, 0x96, 0xbb, - 0x62, 0x29, 0x79, 0x90, 0x8b, 0x55, 0x4a, 0xe4, 0xe9, 0x12, 0xf1, 0xa1, 0x9d, 0x2f, 0x83, 0xb5, - 0x90, 0x89, 0xce, 0x52, 0x1e, 0x64, 0xa0, 0x7c, 0x3f, 0x82, 0xe4, 0xeb, 0x6c, 0x9c, 0x81, 0x9a, - 0x0f, 0x9f, 0x7b, 0x5b, 0x39, 0x24, 0x4c, 0x9c, 0x13, 0x6b, 0x67, 0x37, 0x69, 0x0d, 0x5a, 0x58, - 0xc2, 0x0f, 0xee, 0x1d, 0x39, 0x7a, 0xeb, 0xa8, 0x7d, 0xd7, 0xa8, 0x9a, 0x04, 0x7e, 0x9b, 0x72, - 0x41, 0x9f, 0x8b, 0x84, 0xb1, 0xe8, 0x80, 0x46, 0xcd, 0x7d, 0xd2, 0xcf, 0xd5, 0x69, 0xf5, 0xf6, - 0xea, 0x75, 0xa7, 0xa2, 0xac, 0xff, 0x0b, 0xba, 0xaa, 0x7d, 0xe0, 0x72, 0x8e, 0x7b, 0x1b, 0xb9, - 0x8d, 0x8b, 0xff, 0xc9, 0xef, 0xbf, 0x01, 0x02, 0xb8, 0x77, 0xc3, 0xf4, 0x37, 0x00, 0x00 + 0x35, 0x30, 0xf9, 0x1c, 0xa1, 0x31, 0x27, 0x55, 0xe4, 0x42, 0x09, 0x28, 0x0b, 0x4f, 0x97, 0xd6, + 0xed, 0xd5, 0xdb, 0x02, 0x8c, 0x54, 0x42, 0xbd, 0xe8, 0xee, 0xf2, 0x03, 0xee, 0x36, 0x01, 0xba, + 0x26, 0xed, 0xed, 0xc6, 0x3a, 0xa4, 0x34, 0x81, 0xd3, 0x25, 0xd7, 0x88, 0xd8, 0x1a, 0xab, 0x81, + 0x69, 0xe6, 0xba, 0x80, 0x42, 0x0e, 0x01, 0x7b, 0x9f, 0x80, 0xdc, 0x81, 0xc2, 0xf4, 0x51, 0x09, + 0x71, 0x66, 0xbb, 0x01, 0xd4, 0xc0, 0x3b, 0xd5, 0xb9, 0x77, 0x75, 0x07, 0x8f, 0x42, 0x37, 0x66, + 0x5a, 0x5b, 0x4f, 0x98, 0x60, 0xef, 0xa1, 0x61, 0xaa, 0x2e, 0xbe, 0x07, 0x06, 0xa9, 0xd1, 0x83, + 0xf5, 0xd1, 0xb6, 0x67, 0x8f, 0x2e, 0x06, 0x83, 0x8a, 0x36, 0x16, 0x3b, 0xcd, 0x4b, 0xe9, 0x0c, + 0xde, 0x7e, 0xe2, 0xef, 0xaf, 0x70, 0x4e, 0x13, 0xf0, 0x7b, 0xc8, 0x9a, 0x2c, 0x29, 0x50, 0xc8, + 0x55, 0xc8, 0xa4, 0x15, 0xc3, 0xa5, 0x26, 0x21, 0xcd, 0xf6, 0x2d, 0x18, 0x15, 0x24, 0xae, 0xe7, + 0xe2, 0x3a, 0x4f, 0x98, 0x0f, 0x5a, 0x91, 0x4d, 0x2a, 0xe5, 0x06, 0xe3, 0xb7, 0xb2, 0xa6, 0x28, + 0xb3, 0x95, 0xea, 0xe7, 0xc7, 0x79, 0xb1, 0x1c, 0x18, 0x37, 0xf3, 0xbe, 0xbf, 0x94, 0xe8, 0xd9, + 0xbb, 0x8b, 0x80, 0x4f, 0x80, 0xee, 0x2d, 0x27, 0xc0, 0x0f, 0xb1, 0x21, 0x07, 0xe2, 0x72, 0x59, + 0x30, 0x5e, 0x1c, 0x5a, 0x42, 0xc0, 0x9a, 0x0b, 0xfa, 0xf6, 0x36, 0x12, 0x65, 0x97, 0xdf, 0xb3, + 0x71, 0xe5, 0xd0, 0x82, 0x4b, 0xae, 0x30, 0x70, 0xf5, 0xa6, 0x5a, 0xd4, 0x96, 0x59, 0x45, 0x57, + 0x0b, 0x0c, 0xca, 0xd6, 0x78, 0x9c, 0x57, 0x17, 0x00, 0xad, 0x62, 0xee, 0x2f, 0x20, 0x7a, 0xf6, + 0x4e, 0xef, 0x7f, 0x18, 0x76, 0x77, 0x05, 0xd1, 0xb3, 0x0f, 0xf6, 0xfa, 0x87, 0x91, 0x1d, 0x5e, + 0x4d, 0xd4, 0x50, 0xd7, 0xda, 0xfd, 0x47, 0x63, 0xad, 0x2f, 0x23, 0x40, 0x57, 0xba, 0x9d, 0x1f, + 0xe7, 0xed, 0xfa, 0xdd, 0x5b, 0x38, 0x40, 0x56, 0x83, 0xe6, 0xbf, 0x7d, 0xa2, 0x5c, 0x2a, 0x40, + 0x2b, 0x6d, 0x5b, 0x29, 0x10, 0x63, 0x5f, 0x54, 0xb8, 0x3b, 0x57, 0x47, 0x7a, 0x37, 0x80, 0x5c, + 0xc9, 0x34, 0x70, 0xdd, 0xc1, 0x5d, 0x92, 0x7c, 0x0e, 0x20, 0xce, 0x9c, 0x86, 0x7e, 0xb0, 0x19, + 0x2b, 0x5f, 0x75, 0x32, 0xdf, 0x76, 0xd4, 0xb6, 0x83, 0x1a, 0xb0, 0x5f, 0x04, 0x7e, 0x74, 0xff, + 0x8e, 0xba, 0x53, 0xf9, 0xf8, 0x2d, 0x40, 0xd8, 0x50, 0x1d, 0x17, 0x9c, 0x91, 0x1f, 0xde, 0x58, + 0xf6, 0x07, 0x3e, 0xe3, 0x82, 0xdb, 0xd6, 0x6b, 0x16, 0xac, 0x98, 0x80, 0x82, 0x43, 0xde, 0xb3, + 0x0c, 0xea, 0xcf, 0xf3, 0x04, 0x3a, 0x2a, 0xdb, 0x7a, 0x0f, 0x2f, 0xc9, 0x94, 0x46, 0xd0, 0x98, + 0xa6, 0xf0, 0xdb, 0x01, 0x2f, 0xf4, 0xe7, 0xb6, 0xf5, 0x1c, 0x09, 0x90, 0x1b, 0xdc, 0x12, 0x21, + 0xaf, 0x42, 0xfe, 0xd1, 0xb7, 0x4a, 0x9c, 0xfb, 0x03, 0xd3, 0x4d, 0x38, 0xe3, 0x81, 0xa5, 0xb1, + 0x55, 0xa1, 0x2e, 0x81, 0x37, 0xe6, 0x2c, 0xa5, 0xe3, 0x8d, 0x87, 0xfd, 0xd3, 0xed, 0x2c, 0x13, + 0x82, 0x47, 0xb6, 0x1f, 0xc5, 0x99, 0xb0, 0x79, 0x2c, 0x16, 0x09, 0xcf, 0x62, 0x50, 0x4e, 0xc0, + 0x5c, 0x61, 0x0b, 0xd0, 0x33, 0xf4, 0x27, 0xb4, 0x26, 0xb6, 0x1f, 0x2d, 0x81, 0x27, 0x71, 0x29, + 0xc7, 0x52, 0xff, 0x57, 0x36, 0x1e, 0x0e, 0x06, 0xff, 0xb0, 0x83, 0x78, 0x78, 0x7a, 0x19, 0xd2, + 0x64, 0xe1, 0x47, 0xe3, 0x41, 0x8d, 0x44, 0xce, 0x21, 0x40, 0xe7, 0x01, 0x5f, 0x8f, 0x57, 0x7e, + 0xea, 0xcf, 0x02, 0x66, 0xde, 0x2a, 0x8a, 0x39, 0x52, 0x74, 0x44, 0x02, 0x92, 0xcf, 0x79, 0x12, + 0x8e, 0xb1, 0xcb, 0xde, 0xfe, 0x55, 0x40, 0x81, 0x9e, 0xa8, 0x79, 0x3f, 0xd9, 0xea, 0x49, 0x7a, + 0xa7, 0x79, 0x48, 0xb3, 0x59, 0xe8, 0xc3, 0x93, 0x9a, 0x92, 0xe3, 0xbe, 0xcf, 0xbd, 0x2f, 0xd0, + 0x28, 0x50, 0x0e, 0x68, 0xe4, 0xb2, 0xb1, 0x7a, 0x53, 0xc7, 0x34, 0x1e, 0x3b, 0x21, 0xff, 0xd5, + 0x99, 0x43, 0x7b, 0x9a, 0x3a, 0xb2, 0x8a, 0xd4, 0x70, 0xb7, 0xbe, 0xd6, 0xd4, 0x1a, 0xde, 0x2b, + 0xc4, 0xfb, 0x2f, 0xf2, 0x19, 0xb8, 0x2f, 0x4b, 0x1c, 0xe9, 0x48, 0x52, 0xa6, 0xcb, 0x18, 0xea, + 0x3e, 0x06, 0xd0, 0x60, 0x87, 0xa7, 0x12, 0x14, 0xbb, 0x8d, 0x3a, 0x43, 0x8d, 0xef, 0x0c, 0x37, + 0x3b, 0x2f, 0x35, 0x2b, 0xf5, 0xd1, 0x1c, 0x4a, 0x1c, 0x9a, 0x69, 0x3c, 0x8c, 0x1f, 0x88, 0xc7, + 0x85, 0x60, 0x1e, 0x79, 0x21, 0x27, 0x62, 0x40, 0x6d, 0xe7, 0x3e, 0x0b, 0x3c, 0xa0, 0x94, 0x1b, + 0xe6, 0xfa, 0xc7, 0xa7, 0x2c, 0x24, 0xfd, 0x73, 0xf9, 0xfb, 0x6c, 0x04, 0x1f, 0xdb, 0x80, 0x2d, + 0xa0, 0x1e, 0x80, 0x40, 0x0f, 0x68, 0x7a, 0x9c, 0xa4, 0x65, 0x83, 0x91, 0x4b, 0xb9, 0x63, 0x57, + 0xf8, 0x87, 0xae, 0x9b, 0x63, 0x81, 0x7b, 0x6f, 0xe0, 0x0d, 0x0f, 0x6a, 0x8f, 0x50, 0x79, 0x4b, + 0x21, 0xff, 0x25, 0xb4, 0x30, 0x02, 0x42, 0x27, 0xa6, 0x2e, 0xaa, 0x26, 0x09, 0x69, 0xb0, 0x8d, + 0x13, 0x48, 0x6d, 0x50, 0xdf, 0x73, 0xf0, 0x15, 0x8c, 0x90, 0xc0, 0x81, 0x4c, 0xb2, 0x88, 0xc6, + 0x33, 0xe8, 0xed, 0x91, 0xff, 0x6d, 0xe1, 0x97, 0x85, 0x37, 0x51, 0x58, 0x1d, 0x69, 0x55, 0xba, + 0x4b, 0xe6, 0xde, 0x03, 0x3b, 0x85, 0xab, 0x50, 0xcf, 0xe7, 0x3f, 0xb5, 0xb0, 0xbc, 0x6b, 0x87, + 0x48, 0xa6, 0x31, 0x34, 0xae, 0x76, 0x22, 0x69, 0x40, 0x60, 0xcf, 0x8f, 0x1c, 0xed, 0xa9, 0x2d, + 0x13, 0x41, 0xb7, 0xf5, 0x89, 0xb9, 0x0e, 0x86, 0x0a, 0x6b, 0x6a, 0x89, 0xfe, 0x53, 0x93, 0x87, + 0xa2, 0x48, 0xd2, 0x00, 0x97, 0xda, 0x48, 0x8e, 0xae, 0x20, 0xce, 0x28, 0x7e, 0xa8, 0x83, 0x97, + 0x34, 0xd5, 0x80, 0xe3, 0x31, 0x97, 0xab, 0x3c, 0xdb, 0x84, 0x59, 0xc6, 0x50, 0x09, 0x33, 0xc7, + 0x9d, 0xd1, 0x2c, 0xc6, 0x2e, 0xd0, 0xf9, 0x54, 0xc0, 0xc8, 0x18, 0x37, 0x06, 0xdd, 0x7a, 0x4c, + 0x50, 0x3f, 0x48, 0x73, 0x63, 0x58, 0xd9, 0x46, 0x6d, 0xd3, 0x2c, 0x84, 0x48, 0xdf, 0x14, 0xa3, + 0x01, 0x34, 0xb2, 0x0e, 0x98, 0x34, 0xdc, 0x62, 0x29, 0x09, 0xa8, 0x60, 0xc5, 0x2b, 0x15, 0xcd, + 0xaa, 0x8d, 0xfa, 0xa9, 0x3e, 0x2a, 0x71, 0xfd, 0x92, 0x71, 0xc1, 0x6c, 0xcf, 0xb3, 0xbd, 0xc0, + 0x9e, 0xfb, 0x0b, 0x28, 0x41, 0xf6, 0x72, 0x68, 0x2f, 0x47, 0xf6, 0xf2, 0xd8, 0x5e, 0x9e, 0xd8, + 0xcb, 0x53, 0x7b, 0x79, 0x66, 0x2f, 0x13, 0x3b, 0xb6, 0xe3, 0x84, 0xe5, 0x3b, 0xf9, 0x25, 0x9f, + 0x51, 0xf7, 0x1e, 0xb3, 0x57, 0xe4, 0xa9, 0xad, 0xe3, 0xb1, 0x4c, 0x23, 0xd0, 0x1e, 0xe1, 0x46, + 0x6d, 0xe5, 0xa5, 0x1f, 0x42, 0x19, 0xd0, 0x54, 0x55, 0x94, 0xc8, 0x00, 0x69, 0x08, 0x0e, 0x63, + 0x8a, 0xf1, 0x29, 0x0c, 0xa1, 0x19, 0x49, 0xa1, 0x44, 0x19, 0xdc, 0x18, 0x53, 0x8a, 0x56, 0x19, + 0x3b, 0x86, 0xab, 0x8a, 0x67, 0xf1, 0xc0, 0xce, 0x82, 0x5c, 0xea, 0xa5, 0x92, 0x01, 0x1a, 0x26, + 0xfe, 0xff, 0xac, 0x30, 0xff, 0x64, 0x8f, 0xc7, 0x74, 0x0e, 0xc1, 0x01, 0x9f, 0x33, 0x06, 0x69, + 0x9d, 0xb5, 0xc4, 0xa2, 0xfe, 0xaa, 0xb2, 0xc4, 0xe0, 0xb2, 0x96, 0x34, 0x53, 0x1e, 0xf8, 0x9e, + 0x19, 0x52, 0xe6, 0x7d, 0xca, 0x46, 0xec, 0xd9, 0x1c, 0xb4, 0x56, 0xe4, 0x57, 0xc1, 0x63, 0x93, + 0x63, 0x20, 0x66, 0xfc, 0x70, 0x91, 0xef, 0xe3, 0x28, 0x73, 0x07, 0x64, 0x18, 0x2c, 0x5e, 0x26, + 0xc7, 0x6c, 0x65, 0x7d, 0x82, 0x8c, 0x89, 0x49, 0x1b, 0xbe, 0x39, 0xe0, 0x9c, 0x2e, 0x5b, 0xf2, + 0x00, 0x10, 0x14, 0x85, 0xb0, 0xf9, 0x75, 0xae, 0x19, 0xa2, 0x03, 0xca, 0xdc, 0x81, 0x46, 0xf4, + 0x29, 0x4c, 0x9f, 0x83, 0xaa, 0x19, 0x41, 0x3b, 0xd8, 0x5f, 0xa1, 0xab, 0x29, 0x2b, 0xa6, 0x8e, + 0x0f, 0x37, 0x4b, 0x52, 0x98, 0x13, 0x73, 0x1f, 0x9a, 0xbc, 0x64, 0x2b, 0xd3, 0x72, 0x5e, 0x6a, + 0x34, 0xa0, 0x71, 0xca, 0xc6, 0xe6, 0xcb, 0x76, 0x2f, 0xf0, 0xf2, 0xb2, 0xde, 0xd7, 0x3a, 0x00, + 0xd5, 0xc4, 0x16, 0x49, 0xa2, 0x6f, 0x0c, 0xea, 0x9c, 0xe4, 0x85, 0x6d, 0x81, 0x7e, 0xa8, 0x2d, + 0x73, 0x02, 0x96, 0xe9, 0xc7, 0x0f, 0xf0, 0x56, 0xfb, 0xbd, 0x13, 0xb0, 0x39, 0x38, 0x4a, 0xc2, + 0x42, 0x13, 0x09, 0x10, 0x57, 0xd2, 0x77, 0x60, 0x08, 0xa6, 0x6e, 0x9c, 0x51, 0x31, 0x15, 0x0c, + 0x3c, 0xee, 0x9f, 0x56, 0xa7, 0x2a, 0xdc, 0x6a, 0x70, 0xdb, 0x0f, 0x9d, 0xa1, 0x09, 0xc0, 0xfe, + 0x48, 0x0f, 0x09, 0x80, 0x57, 0x63, 0x25, 0x38, 0xa0, 0x75, 0x8e, 0xcb, 0x32, 0x77, 0x6e, 0xc6, + 0x86, 0xe5, 0x58, 0x09, 0x3e, 0xac, 0x81, 0xeb, 0x71, 0x90, 0x60, 0x58, 0x97, 0x40, 0xbd, 0xd9, + 0x91, 0xa1, 0x98, 0xbe, 0xa9, 0x4c, 0x2f, 0xf1, 0xec, 0x89, 0x51, 0x62, 0x3f, 0xdb, 0xd1, 0x4f, + 0xbf, 0x01, 0xfb, 0xb0, 0x5f, 0x60, 0x7f, 0x56, 0xc3, 0x3e, 0x6a, 0xc0, 0x3d, 0x92, 0x53, 0x83, + 0xc5, 0xbf, 0xca, 0x52, 0xe3, 0x60, 0x2d, 0xad, 0x98, 0x54, 0x29, 0x7b, 0xe9, 0x9c, 0xe6, 0x45, + 0xe4, 0x6a, 0x5e, 0xd6, 0x0e, 0x66, 0xbe, 0x5c, 0x59, 0x4f, 0xd6, 0xb2, 0xbe, 0x44, 0x00, 0x8b, + 0x8f, 0x8d, 0x73, 0x32, 0x18, 0xe4, 0x8e, 0x23, 0x9f, 0x39, 0x54, 0x70, 0x5f, 0x6c, 0xc6, 0x43, + 0xdd, 0x06, 0x3c, 0x75, 0x67, 0xde, 0x29, 0x1b, 0xe8, 0xa7, 0x64, 0x31, 0xa3, 0xdd, 0xd1, 0xe0, + 0xd8, 0x1e, 0x0d, 0xe1, 0x67, 0x74, 0x62, 0xc3, 0xea, 0xb6, 0x5b, 0x87, 0xec, 0xf5, 0xb6, 0xfd, + 0x45, 0xe2, 0x7b, 0x45, 0x61, 0xc0, 0x07, 0x35, 0x84, 0xfe, 0x99, 0x82, 0x06, 0xe5, 0x77, 0x53, + 0x56, 0x70, 0x30, 0x0b, 0xa3, 0x74, 0x9c, 0x30, 0x28, 0x5b, 0xa2, 0x2b, 0x4f, 0x1b, 0xa1, 0xcd, + 0xe8, 0x0e, 0xec, 0xe1, 0x3c, 0x31, 0xd8, 0x14, 0xe8, 0xe8, 0x30, 0xe8, 0x68, 0x0f, 0x54, 0x6a, + 0x06, 0x32, 0x9c, 0x97, 0x57, 0x9d, 0xfc, 0x7c, 0x30, 0xd0, 0xd2, 0xa7, 0x61, 0x45, 0x79, 0xfd, + 0x67, 0xda, 0x83, 0xfc, 0x48, 0x26, 0xbf, 0x79, 0xc0, 0x1e, 0x0a, 0x29, 0x2a, 0x63, 0x30, 0x01, + 0x38, 0x48, 0x1d, 0x97, 0x61, 0x04, 0xe6, 0xb2, 0xa9, 0x91, 0xa5, 0x32, 0x1d, 0xab, 0x21, 0x8d, + 0x5c, 0x30, 0x68, 0x79, 0x0e, 0xa9, 0xf6, 0x64, 0xee, 0x0d, 0xdd, 0xd3, 0xaa, 0x6a, 0xcf, 0x2f, + 0xec, 0xd1, 0xe0, 0xc2, 0x1e, 0x5e, 0x9c, 0xb7, 0x68, 0x76, 0xb6, 0x70, 0x64, 0xa7, 0x05, 0x38, + 0xe1, 0x6b, 0x89, 0x71, 0xaf, 0x6a, 0x3e, 0x9d, 0xcf, 0xe7, 0xfb, 0xa3, 0xca, 0x7e, 0xa7, 0xa7, + 0xb6, 0xf9, 0x51, 0x54, 0x4a, 0x54, 0x48, 0x43, 0x02, 0x30, 0xcf, 0x09, 0x8a, 0xc4, 0x8b, 0xbd, + 0x57, 0x96, 0x9a, 0xa0, 0x4b, 0x97, 0xd4, 0xe3, 0x6b, 0xd4, 0x9d, 0x2c, 0x00, 0xf2, 0x69, 0x3c, + 0x20, 0x58, 0x70, 0xa1, 0xc9, 0x21, 0x03, 0x22, 0xa9, 0x0c, 0x6c, 0xfc, 0xdb, 0x1f, 0x9c, 0xf6, + 0x4c, 0x32, 0xc9, 0x6b, 0x95, 0x01, 0x73, 0xbb, 0xc9, 0x32, 0x1b, 0x16, 0x40, 0xf7, 0xe7, 0x9c, + 0x4b, 0x5d, 0xe9, 0xb1, 0x8a, 0x6c, 0xb5, 0x72, 0x31, 0x3b, 0x3f, 0xbf, 0x18, 0xce, 0xeb, 0x83, + 0x92, 0xe0, 0xf0, 0xd9, 0xb1, 0x3d, 0x1c, 0x0d, 0xed, 0xe3, 0xa1, 0x91, 0xaa, 0x86, 0x48, 0x6b, + 0x4f, 0x93, 0x3a, 0x53, 0xa4, 0x0e, 0xab, 0xd0, 0x3b, 0xbb, 0x80, 0xe2, 0xd4, 0xa6, 0xc5, 0xe1, + 0x89, 0x3d, 0x3c, 0x7d, 0x66, 0x9f, 0x9c, 0x7d, 0x89, 0x12, 0xe5, 0xeb, 0xaa, 0x12, 0x07, 0xa0, + 0xc1, 0x21, 0x36, 0x2a, 0xce, 0x31, 0xfc, 0xaa, 0x6a, 0x72, 0xd8, 0xb3, 0x07, 0x04, 0xf2, 0x2e, + 0x39, 0xc3, 0xb7, 0xa3, 0x9d, 0xb7, 0x52, 0xcf, 0xa1, 0xa7, 0xd3, 0xc2, 0x43, 0x50, 0x4d, 0x0a, + 0x26, 0x07, 0x94, 0xe2, 0x1f, 0x3f, 0x46, 0xfc, 0x39, 0x9d, 0x0f, 0x9e, 0x5d, 0xb4, 0x3a, 0xd1, + 0xc0, 0x1e, 0x9d, 0x40, 0xa0, 0x1d, 0x9f, 0x37, 0xca, 0x0f, 0x53, 0x71, 0x35, 0x10, 0x99, 0x98, + 0x55, 0xa1, 0x3a, 0xc6, 0x21, 0x32, 0x3a, 0x52, 0x1f, 0x92, 0xa3, 0x19, 0x2c, 0xfe, 0x9d, 0xd3, + 0xc7, 0xf0, 0x73, 0x32, 0xba, 0xb8, 0x60, 0xc3, 0x16, 0x7e, 0xce, 0xce, 0xc0, 0x1a, 0x98, 0x93, + 0x1a, 0x7d, 0x5a, 0x69, 0xc5, 0x44, 0x4e, 0x73, 0x34, 0x62, 0xc0, 0x1c, 0x8c, 0x92, 0x9d, 0x58, + 0x34, 0x65, 0x11, 0xf9, 0x7f, 0x94, 0xe7, 0x8e, 0x66, 0x67, 0xee, 0x6c, 0xd0, 0xe0, 0xb9, 0x27, + 0xe0, 0xb8, 0x83, 0x67, 0xf6, 0xf0, 0xfc, 0xac, 0xd5, 0x73, 0xb5, 0x3b, 0xed, 0xfa, 0x92, 0x36, + 0xac, 0x71, 0xb6, 0x70, 0x6f, 0xc2, 0xb1, 0x4a, 0x69, 0xb8, 0x0f, 0x22, 0xb7, 0x3f, 0xc8, 0xd5, + 0x91, 0xbe, 0x15, 0x32, 0xe3, 0xde, 0x86, 0xe8, 0x6d, 0x64, 0xcb, 0xdc, 0x7b, 0xb0, 0x88, 0x9c, + 0x36, 0xb1, 0x1a, 0x82, 0xe1, 0xc2, 0x3b, 0x71, 0xe5, 0xd5, 0x0f, 0xcf, 0x5f, 0x91, 0x8e, 0x1b, + 0xd0, 0x34, 0x9d, 0x58, 0x78, 0x79, 0x83, 0x42, 0x62, 0x4c, 0x48, 0xf8, 0x20, 0x2b, 0x0c, 0xc1, + 0xa2, 0x47, 0xb0, 0x94, 0x99, 0xa9, 0x7a, 0x26, 0x7a, 0x01, 0xa9, 0x54, 0x81, 0x02, 0x93, 0x0f, + 0xf4, 0xdd, 0x55, 0x41, 0xb9, 0xba, 0x9e, 0xb0, 0x0c, 0x30, 0x2e, 0x10, 0x61, 0xd0, 0xba, 0x46, + 0x36, 0x09, 0xde, 0xfb, 0x20, 0xfa, 0xde, 0x07, 0x74, 0xb1, 0xfd, 0x7e, 0xff, 0xea, 0x08, 0x50, + 0xe1, 0xdd, 0x8f, 0x88, 0x17, 0xfb, 0x3d, 0x15, 0xda, 0x06, 0xdc, 0xd0, 0x28, 0x2c, 0x64, 0x5d, + 0x77, 0xa6, 0x3c, 0x49, 0x36, 0x76, 0x1d, 0x67, 0xc4, 0x98, 0x97, 0x92, 0x3f, 0xd0, 0x15, 0x9d, + 0x4a, 0x6c, 0x4f, 0x34, 0xfe, 0xab, 0xa3, 0x66, 0xfc, 0x85, 0x16, 0x2c, 0xd2, 0xd1, 0x24, 0xaa, + 0xf5, 0x66, 0x26, 0x9b, 0x3b, 0x14, 0x38, 0x0b, 0x0c, 0x08, 0x16, 0x12, 0x52, 0x56, 0x60, 0x08, + 0x00, 0xa2, 0x2b, 0x12, 0x09, 0x16, 0x65, 0x6d, 0x07, 0x06, 0xc9, 0x55, 0xe0, 0x1b, 0xa8, 0x4a, + 0x15, 0x22, 0xd5, 0x22, 0x84, 0xb8, 0x29, 0x59, 0x26, 0x6c, 0x3e, 0xb1, 0x8e, 0xac, 0xeb, 0xd7, + 0x3c, 0x64, 0x57, 0x47, 0x14, 0x37, 0xbd, 0x56, 0x8b, 0xc2, 0x56, 0xd0, 0x16, 0x10, 0xd5, 0x06, + 0x90, 0x5a, 0xe9, 0xb7, 0x08, 0x2c, 0x26, 0x03, 0x90, 0x22, 0x4b, 0x70, 0x91, 0x75, 0xa3, 0x2e, + 0xec, 0xe0, 0x55, 0xa1, 0x17, 0xfc, 0x61, 0x62, 0x0d, 0x20, 0xa3, 0x8f, 0xf0, 0x9f, 0x75, 0x84, + 0x1a, 0x08, 0xfc, 0xcf, 0x67, 0xe9, 0x69, 0x61, 0xc8, 0x5a, 0x61, 0xb4, 0x94, 0xf1, 0xe3, 0xc0, + 0xba, 0x56, 0xdc, 0x22, 0x72, 0xf8, 0x9d, 0xe1, 0x6d, 0x26, 0xad, 0x71, 0xd4, 0x32, 0x4e, 0x32, + 0x47, 0xb9, 0x85, 0x34, 0xd2, 0x9f, 0x4c, 0x39, 0x24, 0x65, 0xba, 0x25, 0x45, 0x79, 0x22, 0xd0, + 0x09, 0x12, 0xec, 0xfc, 0x90, 0x95, 0xb8, 0x50, 0xbc, 0x69, 0x09, 0x40, 0xb5, 0x77, 0x4b, 0x1a, + 0xdd, 0x93, 0x0d, 0xcf, 0xc8, 0x7f, 0xfe, 0xdb, 0x7f, 0x10, 0x58, 0xd3, 0x10, 0x3f, 0x4a, 0x05, + 0x0d, 0x02, 0x3c, 0x86, 0x11, 0x4b, 0x26, 0xbd, 0x22, 0xd4, 0x4e, 0x31, 0xe5, 0x73, 0xb1, 0x86, + 0x96, 0xbd, 0x4f, 0xfe, 0xeb, 0xdf, 0xff, 0xfe, 0xb7, 0xab, 0xa3, 0x18, 0xb1, 0x5e, 0x77, 0xfe, + 0x02, 0xd0, 0x4b, 0x0a, 0xce, 0xc3, 0x22, 0x6c, 0xc5, 0x3d, 0x09, 0x57, 0x9c, 0xa2, 0xbd, 0xe3, + 0x1e, 0x00, 0xbc, 0x89, 0x08, 0x9e, 0xa1, 0x91, 0x1f, 0xd9, 0x4c, 0x76, 0xed, 0x73, 0xe8, 0xf8, + 0x25, 0xd9, 0x35, 0x28, 0x9e, 0xcc, 0x18, 0x41, 0x48, 0x02, 0x76, 0x81, 0xa5, 0x27, 0x8e, 0x27, + 0x78, 0x5d, 0x0a, 0x96, 0xce, 0x69, 0x1f, 0x5c, 0x5a, 0x13, 0xfa, 0x16, 0x58, 0x48, 0xb3, 0xc5, + 0x82, 0xa5, 0xb8, 0x43, 0x90, 0x12, 0x1a, 0xe1, 0xae, 0x0f, 0x90, 0x80, 0xf5, 0x1e, 0x38, 0x0a, + 0x59, 0x70, 0x44, 0x10, 0x6e, 0x50, 0xeb, 0x1d, 0xa5, 0xf6, 0xa5, 0x10, 0x71, 0x3a, 0x3e, 0x3a, + 0x5a, 0xf8, 0x62, 0x99, 0xcd, 0x20, 0x25, 0x87, 0x47, 0xd3, 0x17, 0xf4, 0x23, 0x8f, 0xdc, 0x5f, + 0xe9, 0xfd, 0xd1, 0xb2, 0x94, 0xcd, 0xba, 0xfe, 0x4e, 0x4e, 0x21, 0x71, 0xc2, 0x3f, 0x32, 0x57, + 0xa0, 0x35, 0x14, 0x5d, 0x13, 0x57, 0xc6, 0x0c, 0x95, 0x33, 0xe8, 0xc6, 0x80, 0xfd, 0xac, 0xb8, + 0x80, 0xac, 0x69, 0x29, 0x25, 0xbe, 0x65, 0xe2, 0x1f, 0x53, 0x75, 0xba, 0x8a, 0x52, 0xc8, 0x43, + 0x5e, 0xa9, 0x07, 0x75, 0x4f, 0x85, 0xdc, 0x6a, 0x19, 0x41, 0x3d, 0x94, 0x28, 0x68, 0xc2, 0xe7, + 0x64, 0x48, 0xba, 0x40, 0xb4, 0x47, 0xfe, 0x45, 0xef, 0xa2, 0xdb, 0xa0, 0x4b, 0x97, 0x66, 0x30, + 0x53, 0xaa, 0xdb, 0x68, 0x17, 0xc3, 0x19, 0x0c, 0xe3, 0x47, 0xd2, 0x36, 0x12, 0x39, 0x9e, 0xd5, + 0x56, 0xb5, 0xfb, 0x01, 0x54, 0x01, 0x36, 0x04, 0xd3, 0x1b, 0xf4, 0xf3, 0x84, 0x87, 0x72, 0xbe, + 0x64, 0x41, 0xaa, 0xdb, 0x0d, 0x7c, 0xf7, 0x9e, 0xe8, 0xf3, 0xeb, 0xbe, 0x02, 0x55, 0xab, 0x32, + 0xe5, 0xc8, 0x33, 0x11, 0x21, 0x72, 0x0b, 0xd2, 0xaa, 0x9c, 0x0a, 0xee, 0x5e, 0xbd, 0x84, 0x51, + 0x73, 0x43, 0x58, 0xb7, 0x39, 0x01, 0x9d, 0x31, 0xf0, 0xfd, 0xef, 0x38, 0x79, 0x01, 0xe9, 0x56, + 0x2b, 0x5c, 0x21, 0xc4, 0x18, 0xd3, 0xa8, 0x9b, 0x31, 0x57, 0x4e, 0xa2, 0xdb, 0xf0, 0x4a, 0x3e, + 0x25, 0xd6, 0x4e, 0x81, 0xb6, 0x88, 0xab, 0x9d, 0xf0, 0xaa, 0x5c, 0xc4, 0x38, 0x64, 0xd7, 0xce, + 0xbe, 0x61, 0x0f, 0xda, 0xf5, 0x16, 0xd7, 0xb6, 0x07, 0x4d, 0x46, 0x78, 0x54, 0x6a, 0xb9, 0xae, + 0xd3, 0x9a, 0xe0, 0x9d, 0x52, 0xa7, 0xe5, 0x59, 0x7f, 0x9b, 0xe4, 0xef, 0x21, 0xcb, 0x10, 0x9c, + 0x53, 0xd7, 0x69, 0xe9, 0xce, 0x6d, 0xd2, 0x8f, 0xbe, 0xa6, 0x57, 0xdf, 0xf0, 0x68, 0x81, 0x47, + 0x30, 0x81, 0xdc, 0xd3, 0x4b, 0x9f, 0x90, 0xbb, 0xa5, 0xbe, 0xba, 0x40, 0xc0, 0x39, 0x23, 0xbe, + 0x96, 0x67, 0xce, 0x1b, 0x74, 0x78, 0x70, 0xd9, 0xbe, 0xb6, 0xd4, 0x41, 0xab, 0x7f, 0xb6, 0x3f, + 0x3d, 0xc2, 0xf2, 0xc5, 0x15, 0x9a, 0x3d, 0xf9, 0xc8, 0x4e, 0xcd, 0xc6, 0x4b, 0x9b, 0x9d, 0x2b, + 0xd9, 0xbb, 0x19, 0x47, 0xa8, 0x75, 0xd4, 0x44, 0x35, 0x1f, 0x98, 0x73, 0x47, 0x90, 0x7c, 0x8f, + 0xc9, 0x5e, 0x7b, 0xdf, 0x90, 0xa7, 0xe1, 0x5b, 0x91, 0x92, 0x49, 0xe8, 0x99, 0xfe, 0x95, 0x94, + 0x0d, 0x24, 0x16, 0x69, 0xcd, 0xe3, 0x95, 0xec, 0x1c, 0xb1, 0xae, 0x35, 0x33, 0x71, 0xfc, 0x3f, + 0xca, 0x84, 0xdc, 0xa6, 0xab, 0xb3, 0xb0, 0x5b, 0x54, 0x54, 0x65, 0x0d, 0x01, 0x09, 0x96, 0x9d, + 0xa9, 0x39, 0x3a, 0x25, 0x5d, 0x1f, 0xcf, 0x72, 0xdd, 0x7e, 0x4f, 0x83, 0x77, 0xae, 0xe4, 0x9e, + 0x90, 0x81, 0xc7, 0x4a, 0x55, 0x61, 0x00, 0x9e, 0xb4, 0x14, 0x25, 0xab, 0x96, 0xb4, 0xd6, 0xde, + 0x99, 0xec, 0xae, 0x2e, 0x5a, 0x38, 0xf9, 0xd3, 0xcd, 0x0d, 0x51, 0x47, 0xb1, 0x78, 0x68, 0xac, + 0x99, 0xd0, 0x3c, 0x74, 0x7e, 0x23, 0x13, 0x7b, 0xa7, 0xbb, 0xbf, 0x93, 0x5d, 0x7e, 0xf4, 0xe7, + 0xfe, 0x67, 0x59, 0x65, 0xfa, 0xe6, 0xe5, 0x17, 0x6a, 0xa0, 0x76, 0x56, 0xf9, 0x48, 0x13, 0xdc, + 0xea, 0x03, 0xd0, 0xaf, 0x44, 0xba, 0x38, 0x4f, 0xfd, 0xbd, 0xa2, 0x01, 0x13, 0xd9, 0xe7, 0xa8, + 0xfd, 0x47, 0x55, 0x03, 0xbe, 0x97, 0xe7, 0x21, 0x5f, 0xea, 0x81, 0xfb, 0x07, 0xef, 0x8f, 0xb4, + 0x42, 0x51, 0x77, 0x5e, 0xaa, 0x13, 0xf7, 0xaf, 0xc2, 0xc8, 0xee, 0x29, 0xfe, 0x23, 0x79, 0xb9, + 0x29, 0x4f, 0xd6, 0xc9, 0x5d, 0x79, 0x60, 0xff, 0x05, 0x2c, 0x75, 0x4a, 0x9e, 0x0e, 0x5f, 0x06, + 0x78, 0x9c, 0xc9, 0x3a, 0x55, 0x0e, 0xbf, 0x95, 0x87, 0xff, 0x75, 0xe6, 0xbe, 0x9c, 0xb7, 0xfa, + 0x95, 0x82, 0xb6, 0xe2, 0x5f, 0x54, 0x26, 0xe3, 0x80, 0xa4, 0xb2, 0x73, 0x40, 0x96, 0xb8, 0xbe, + 0x1b, 0x9b, 0x91, 0x13, 0xb3, 0x94, 0x52, 0x2b, 0x83, 0x92, 0x2f, 0xdc, 0x83, 0xc6, 0xe5, 0xe9, + 0x09, 0x29, 0x37, 0xb7, 0xc9, 0xce, 0x2a, 0xde, 0xe0, 0xaa, 0x8c, 0x9e, 0x96, 0x31, 0x52, 0x6b, + 0x43, 0x76, 0xae, 0x73, 0xb6, 0x55, 0xe3, 0xe7, 0x32, 0x45, 0x12, 0x1d, 0x2e, 0xb5, 0x76, 0xa4, + 0xf3, 0xbb, 0x04, 0xee, 0xbb, 0x3f, 0xde, 0xdd, 0x15, 0x71, 0xab, 0x7a, 0x81, 0xc7, 0x24, 0x4d, + 0x79, 0x27, 0xc7, 0x58, 0x3f, 0xd6, 0xcb, 0x03, 0x7c, 0xea, 0x18, 0xc8, 0xca, 0x3c, 0xfc, 0x5f, + 0x1c, 0x04, 0x16, 0x2c, 0x6f, 0x6e, 0x0b, 0x4a, 0xb2, 0xed, 0xf8, 0xad, 0x61, 0x56, 0xbd, 0x16, + 0xf4, 0xc8, 0xe0, 0xfa, 0x21, 0xfd, 0xe2, 0xe0, 0x2e, 0x2f, 0x10, 0xfd, 0xef, 0xa6, 0xf8, 0xfa, + 0x95, 0xa4, 0xc7, 0xd2, 0xe6, 0x89, 0xf8, 0x2a, 0x74, 0xf1, 0x4a, 0xd5, 0x5e, 0xbb, 0x5f, 0xfa, + 0xcf, 0x37, 0xd1, 0x2c, 0x8d, 0x2f, 0x4d, 0x17, 0x79, 0x28, 0x5a, 0xdb, 0x43, 0xf4, 0xfc, 0xb1, + 0x21, 0xba, 0x17, 0x9e, 0x9a, 0xe5, 0xaa, 0x47, 0x57, 0x62, 0xb2, 0x7e, 0xe7, 0xad, 0x75, 0x5d, + 0x84, 0xab, 0xf5, 0xb2, 0xa3, 0xdc, 0x09, 0xc9, 0x4a, 0x7b, 0x6c, 0x04, 0x81, 0x82, 0x0b, 0xb9, + 0x0a, 0x80, 0x80, 0xbd, 0x63, 0x58, 0x6f, 0x03, 0x7b, 0x71, 0xe2, 0x0c, 0x07, 0x04, 0x56, 0xa5, + 0xf2, 0x6c, 0x46, 0x5d, 0x78, 0x50, 0x22, 0x25, 0xa0, 0x50, 0xe4, 0x14, 0x64, 0xc5, 0xaf, 0xc3, + 0x5a, 0xa0, 0xea, 0x2c, 0x58, 0xb9, 0x0a, 0xd9, 0xbc, 0xed, 0x25, 0x0f, 0xfe, 0x2c, 0xc8, 0x18, + 0xca, 0x16, 0x31, 0xa9, 0x43, 0xc9, 0x7b, 0x96, 0xd7, 0x9d, 0xe7, 0x24, 0xf5, 0x43, 0x3c, 0xee, + 0x95, 0x13, 0x61, 0xb9, 0x2b, 0x96, 0x92, 0x07, 0xb9, 0x58, 0xa5, 0x44, 0x9e, 0x2e, 0x11, 0x1f, + 0xda, 0xf9, 0x32, 0x58, 0x0b, 0x99, 0xe8, 0x2c, 0xe5, 0x41, 0x06, 0xca, 0xf7, 0x23, 0x48, 0xbe, + 0xce, 0xc6, 0x19, 0xa8, 0xf9, 0xf0, 0xb9, 0xb7, 0x95, 0x43, 0xc2, 0xc4, 0x39, 0xb1, 0x76, 0x76, + 0x93, 0xd6, 0xa0, 0x85, 0x25, 0xfc, 0xe0, 0xde, 0x91, 0xa3, 0xb7, 0x8e, 0xda, 0x77, 0x8d, 0xaa, + 0x49, 0xe0, 0xb7, 0x29, 0x17, 0xf4, 0xb9, 0x48, 0x18, 0x8b, 0x0e, 0x68, 0xd4, 0xdc, 0x27, 0xfd, + 0x5c, 0x9d, 0x56, 0x6f, 0xaf, 0x5e, 0x77, 0x2a, 0xca, 0xfa, 0xbf, 0xa0, 0xab, 0xda, 0x07, 0x2e, + 0xe7, 0xb8, 0xb7, 0x91, 0xdb, 0xb8, 0xf8, 0x9f, 0xfe, 0xfe, 0x1b, 0xf8, 0xa5, 0xfa, 0xc9, 0x04, + 0x38, 0x00, 0x00 }; \ No newline at end of file From 24ffed14ca43727cc3cd6d3e8b98652d5164e63c Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 14:50:03 +0200 Subject: [PATCH 34/99] :pencil2: Fixed some object typos --- html/index.js | 4 +- src/html/html_ui.h | 532 ++++++++++++++++++++++----------------------- 2 files changed, 268 insertions(+), 268 deletions(-) diff --git a/html/index.js b/html/index.js index 3914943..3e2b8f6 100644 --- a/html/index.js +++ b/html/index.js @@ -24,7 +24,7 @@ function GetSettings() { setTextBoxValue("scale_weightoffset", data.scale.weightoffset); setTextBoxValue("scale_kilogramdivider", data.scale.kilogramdivider); setTextBoxValue("scale_calibrationtemperaturesetting", data.scale.calibrationtemperaturesetting); - setTextBoxValue("scale_calibrationfactorsetting", data.scale.calibrationfactorSetting); + setTextBoxValue("scale_calibrationfactorsetting", data.scale.calibrationfactorsetting); setTextBoxValue("wireles_password", data.wireles.password); setTextBoxValue("wireles_ssid", data.wireles.ssid); @@ -195,7 +195,7 @@ function saveSettings() { weightoffset: getTextBoxNumberValue('scale_weightoffset'), kilogramdivider: getTextBoxNumberValue('scale_kilogramdivider'), calibrationtemperaturesetting: getTextBoxNumberValue('scale_calibrationtemperaturesetting'), - calibrationfactorSetting: getTextBoxNumberValue('scale_calibrationfactorsetting') + calibrationfactorsetting: getTextBoxNumberValue('scale_calibrationfactorsetting') }, wireles: { password: getTextBoxValue('wireles_password'), diff --git a/src/html/html_ui.h b/src/html/html_ui.h index 4a46932..0255756 100644 --- a/src/html/html_ui.h +++ b/src/html/html_ui.h @@ -4,275 +4,275 @@ */ // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4275; + const uint16_t PAGE_index_L = 4274; const uint8_t PAGE_index[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x72, 0xdb, 0x48, 0x76, 0xef, 0xfc, 0x8a, 0x36, 0x5c, 0x99, 0x90, 0x29, 0x80, 0x22, 0xa9, 0x9b, 0x45, 0x89, 0x4a, - 0xd9, 0xb2, 0x67, 0xec, 0x8d, 0xed, 0xd1, 0x9a, 0x9a, 0x9d, 0xdd, 0xda, 0x4c, 0x4d, 0x35, 0x81, - 0x26, 0x09, 0x0b, 0x40, 0x63, 0x80, 0x06, 0x29, 0x0e, 0x8a, 0x9f, 0xb0, 0x0f, 0xfb, 0x01, 0xa9, + 0xd9, 0xb2, 0x67, 0xec, 0x8d, 0xed, 0xd1, 0x5a, 0x9a, 0x9d, 0xdd, 0xda, 0x4c, 0x4d, 0x35, 0x81, + 0x26, 0x01, 0x0b, 0x40, 0x63, 0x80, 0x86, 0x28, 0x0e, 0x8a, 0x9f, 0xb0, 0x0f, 0xfb, 0x01, 0xa9, 0xbc, 0xe4, 0xcb, 0xf2, 0x05, 0xf9, 0x84, 0x9c, 0xd3, 0x17, 0x5c, 0x48, 0x80, 0x96, 0xc7, 0x4e, - 0x26, 0x15, 0xdb, 0x12, 0x89, 0x46, 0x9f, 0xfb, 0xb5, 0x2f, 0xbe, 0x7a, 0xf2, 0xf2, 0xfb, 0x9b, - 0xbb, 0xbf, 0xdc, 0xbe, 0x22, 0x4b, 0x11, 0x06, 0xd7, 0xe4, 0x0a, 0x3f, 0x48, 0x40, 0xa3, 0xc5, - 0xc4, 0x62, 0x91, 0x85, 0x03, 0x8c, 0x7a, 0xf0, 0x11, 0x32, 0x41, 0x49, 0x44, 0x43, 0x36, 0xb1, - 0x56, 0x3e, 0x5b, 0xc7, 0x3c, 0x11, 0x16, 0xe9, 0xb8, 0x3c, 0x12, 0x2c, 0x12, 0x13, 0x6b, 0xed, - 0x7b, 0x62, 0x39, 0xf1, 0xd8, 0xca, 0x77, 0x99, 0x23, 0x1f, 0x6c, 0x3f, 0xf2, 0x85, 0x4f, 0x03, - 0x27, 0x75, 0x69, 0xc0, 0x26, 0x43, 0x3b, 0x84, 0x81, 0x30, 0x0b, 0xcd, 0xb3, 0x65, 0x90, 0x76, - 0xdc, 0x25, 0x4d, 0x52, 0x06, 0x48, 0x32, 0x31, 0x77, 0x9e, 0x59, 0x75, 0x62, 0x62, 0xc9, 0x42, - 0xe6, 0xb8, 0x3c, 0xe0, 0x89, 0x45, 0x0a, 0x72, 0x4f, 0x47, 0xf2, 0x4f, 0x05, 0x87, 0x79, 0xb3, - 0x61, 0xa9, 0xa5, 0x41, 0x69, 0x1c, 0x07, 0xcc, 0x09, 0xf9, 0xcc, 0x87, 0x8f, 0x35, 0x9b, 0x39, - 0x30, 0xe0, 0xb8, 0x34, 0xa6, 0xb3, 0x80, 0x21, 0xa4, 0xf0, 0x45, 0xc0, 0xae, 0x5f, 0xfb, 0x2b, - 0xe6, 0xbc, 0xe3, 0xc0, 0x2c, 0x4f, 0xae, 0x8e, 0xd4, 0x18, 0xe9, 0x5c, 0xa5, 0x6e, 0xe2, 0xc7, - 0xe2, 0xba, 0xb3, 0xa2, 0x09, 0x11, 0x7e, 0xc8, 0x78, 0x26, 0xec, 0xe7, 0xae, 0xc8, 0x68, 0x70, - 0x4b, 0x17, 0x80, 0xfc, 0xcd, 0xfb, 0x97, 0xaf, 0xfe, 0x6c, 0xd9, 0xde, 0xc4, 0xe3, 0x6e, 0x16, - 0x02, 0xe9, 0xcb, 0x79, 0x16, 0xb9, 0xc2, 0xe7, 0x11, 0xe1, 0xd1, 0x5b, 0x4e, 0xbd, 0x6e, 0x2f, - 0x5f, 0xfa, 0x1e, 0x7b, 0x1e, 0x04, 0x37, 0xc0, 0x5b, 0xc2, 0x83, 0xb4, 0xdb, 0xb3, 0x63, 0x94, - 0xf4, 0x8f, 0x19, 0x4b, 0x36, 0xf0, 0x00, 0x32, 0xbf, 0x48, 0x40, 0xbb, 0x37, 0x49, 0x16, 0xce, - 0xd4, 0xf3, 0x1b, 0xa5, 0x33, 0x24, 0xa1, 0x06, 0x5e, 0xfa, 0x69, 0x1c, 0xd0, 0x4d, 0xd7, 0x72, - 0x57, 0x96, 0x6d, 0x45, 0x3c, 0x62, 0x56, 0xcf, 0xfe, 0x8e, 0x89, 0x29, 0x13, 0xc2, 0x8f, 0x16, - 0x80, 0x73, 0x5b, 0xd0, 0xad, 0x0d, 0xe7, 0x88, 0xb9, 0x6b, 0xa5, 0x7a, 0xc0, 0xea, 0xf5, 0x41, - 0x93, 0x51, 0x97, 0x4d, 0xae, 0x73, 0xd0, 0x55, 0xca, 0x03, 0xd6, 0xf7, 0xd8, 0x2c, 0x5b, 0x74, - 0x99, 0xa4, 0x73, 0xc7, 0x1e, 0xc4, 0x0b, 0xfe, 0xf0, 0x27, 0x1a, 0x64, 0x0c, 0xa0, 0x36, 0xa9, - 0x60, 0xe1, 0xcf, 0x69, 0xc0, 0x58, 0x8c, 0xc2, 0x5b, 0x36, 0xeb, 0xab, 0xb1, 0x7e, 0x31, 0xd6, - 0x0e, 0xb6, 0x72, 0x5d, 0xea, 0x7d, 0xcc, 0x52, 0xa1, 0x89, 0x57, 0xa0, 0x77, 0x5f, 0x35, 0x20, - 0x09, 0x7f, 0x11, 0xe2, 0xe7, 0x94, 0x25, 0x2b, 0x96, 0x20, 0x20, 0x3e, 0xf6, 0xd5, 0x63, 0xdb, - 0xe4, 0x2c, 0xad, 0x4c, 0xc5, 0x87, 0xb6, 0x89, 0x31, 0x4d, 0xd3, 0x35, 0x4f, 0xbc, 0x62, 0xb2, - 0x19, 0x68, 0x05, 0x40, 0x2f, 0x2f, 0x26, 0xc3, 0x43, 0x93, 0xd0, 0xe8, 0xce, 0x3f, 0xaf, 0x99, - 0xbf, 0x58, 0x0a, 0x3e, 0x9f, 0xc3, 0x7b, 0x29, 0x2f, 0x8e, 0xf6, 0xab, 0xa3, 0xad, 0xa0, 0xf7, - 0x7e, 0xc0, 0x17, 0x09, 0x0d, 0x3d, 0x7f, 0x05, 0xfe, 0x92, 0x94, 0xd0, 0x3b, 0x2f, 0x5a, 0x11, - 0xc0, 0x2f, 0x7f, 0x96, 0x50, 0xf4, 0x01, 0xd0, 0x71, 0xcc, 0xe0, 0x6b, 0x96, 0xb0, 0xaa, 0xf2, - 0x25, 0xba, 0x83, 0xd3, 0x1e, 0x83, 0x7c, 0x4e, 0x5d, 0x88, 0x91, 0x43, 0x78, 0xd5, 0x8c, 0x69, - 0x2b, 0xca, 0xb5, 0x9f, 0xb0, 0x80, 0xa5, 0x35, 0x43, 0xe8, 0xb1, 0x43, 0xb6, 0x30, 0x60, 0x69, - 0xea, 0xd7, 0x40, 0xf0, 0xb9, 0xb7, 0xad, 0x44, 0xc0, 0x6e, 0x04, 0xe5, 0xe9, 0xda, 0x17, 0xee, - 0xb2, 0x5b, 0x06, 0x6e, 0x2f, 0x77, 0x69, 0xca, 0x74, 0xf4, 0x8e, 0x05, 0x5f, 0x2c, 0x02, 0xf6, - 0x26, 0xf2, 0xd8, 0x43, 0xb7, 0x77, 0x39, 0x83, 0x90, 0xb9, 0xbf, 0x94, 0xef, 0xef, 0x9e, 0x7f, - 0x78, 0x85, 0xaf, 0x39, 0xbc, 0x7e, 0x9e, 0x09, 0x7e, 0x47, 0x13, 0xb6, 0x3f, 0x63, 0x68, 0x8d, - 0x6b, 0x21, 0x8a, 0xb3, 0xa6, 0x82, 0xc5, 0x43, 0x08, 0xd5, 0x59, 0xc0, 0xdd, 0x7b, 0x6b, 0x0f, - 0x64, 0xd4, 0x02, 0x32, 0x2a, 0x41, 0xb6, 0xa5, 0x3c, 0xd5, 0x74, 0x91, 0x63, 0x26, 0x62, 0x93, - 0x88, 0xad, 0xc9, 0x0f, 0x1f, 0xde, 0x4e, 0x19, 0x4d, 0xdc, 0xe5, 0x2d, 0x05, 0xf7, 0x48, 0xbb, - 0x26, 0x05, 0xf5, 0x01, 0x81, 0xb4, 0x03, 0x04, 0x0c, 0xbe, 0xee, 0x5d, 0x46, 0x59, 0x10, 0x4c, - 0x26, 0x15, 0xf9, 0x27, 0xac, 0xbf, 0x60, 0xa2, 0x6b, 0xc5, 0xf0, 0xdd, 0xea, 0xf5, 0xbe, 0xf9, - 0xa6, 0xbb, 0x9f, 0xd4, 0x2a, 0x0a, 0xad, 0x29, 0xa8, 0x21, 0x9f, 0x55, 0x65, 0x59, 0xb3, 0xc0, - 0xe5, 0x98, 0x2b, 0x8c, 0x20, 0xf5, 0xfc, 0x65, 0x52, 0x53, 0x45, 0xd0, 0x82, 0xcc, 0x1e, 0xe2, - 0xbc, 0x51, 0x49, 0x83, 0x32, 0x05, 0xb6, 0xea, 0xfd, 0xd0, 0xfb, 0x51, 0xcb, 0xfb, 0x0a, 0x6b, - 0x0d, 0xaf, 0x4b, 0xb9, 0x9a, 0x60, 0xcb, 0xb4, 0x5c, 0x73, 0x43, 0x33, 0x81, 0xd9, 0x42, 0x59, - 0x2e, 0x2d, 0x0a, 0x05, 0x1a, 0xe0, 0x55, 0xc0, 0xf0, 0xeb, 0x8b, 0xcd, 0x1b, 0x0f, 0x12, 0xf0, - 0x25, 0xb8, 0xb2, 0xd8, 0x60, 0x46, 0x56, 0x50, 0x13, 0xad, 0xa1, 0xc9, 0x64, 0x22, 0xfe, 0xd9, - 0x02, 0x3f, 0xac, 0x1a, 0xa4, 0xee, 0x92, 0x79, 0xd5, 0x7c, 0xd2, 0x6b, 0xed, 0xc3, 0x56, 0xaa, - 0x29, 0x73, 0xcf, 0x10, 0x30, 0xb3, 0x62, 0x84, 0x46, 0x4c, 0x07, 0x4b, 0x56, 0x0d, 0x53, 0x75, - 0xa6, 0xf6, 0xde, 0x36, 0x1d, 0x58, 0x71, 0x00, 0xb1, 0xf2, 0x89, 0x68, 0x65, 0x7d, 0x3f, 0x8a, - 0x58, 0x82, 0xb9, 0x61, 0x62, 0x4d, 0x05, 0x85, 0xdc, 0xbc, 0x1f, 0xb3, 0xd5, 0xe0, 0xac, 0x46, - 0x5d, 0x0d, 0x18, 0x75, 0x40, 0xa6, 0x98, 0xbd, 0xac, 0x4a, 0xb4, 0x09, 0xe3, 0x26, 0xd2, 0xff, - 0x22, 0xef, 0x25, 0x15, 0xb4, 0x9b, 0x6f, 0x6d, 0x0b, 0x5f, 0xa4, 0xd2, 0xbf, 0x2a, 0x55, 0x74, - 0x57, 0xf1, 0xe0, 0x5c, 0x35, 0xed, 0x6d, 0x7b, 0x90, 0x19, 0x51, 0x9c, 0x6e, 0x0f, 0x66, 0xd7, - 0xb2, 0x14, 0xb2, 0xae, 0xcd, 0xd7, 0x48, 0x67, 0x70, 0x88, 0xce, 0xf0, 0xf1, 0x74, 0x0c, 0x6e, - 0xe9, 0x84, 0x09, 0x83, 0x74, 0x1f, 0x11, 0xcc, 0x1f, 0xb7, 0x09, 0x0f, 0xfd, 0x94, 0x75, 0xbb, - 0xa9, 0x4d, 0x11, 0x08, 0x6d, 0xc3, 0x65, 0x66, 0xf9, 0xf3, 0xbb, 0xb7, 0xaf, 0x85, 0x88, 0x3f, - 0xb0, 0x5f, 0x32, 0xe0, 0xe4, 0x92, 0xf7, 0xa9, 0xe7, 0xbd, 0x5a, 0x81, 0x95, 0xde, 0xfa, 0xc0, - 0x18, 0xe8, 0xaf, 0x6b, 0x05, 0xd0, 0xdb, 0x58, 0x76, 0xd7, 0x50, 0x41, 0x19, 0x96, 0x7c, 0x7d, - 0xc7, 0x69, 0x2a, 0xde, 0xb1, 0x34, 0x45, 0x37, 0xb0, 0x4c, 0x40, 0x91, 0x94, 0xae, 0x98, 0xf7, - 0x04, 0x63, 0xa6, 0x2b, 0x96, 0x7e, 0xda, 0x07, 0xf9, 0x62, 0xe8, 0x3e, 0x18, 0x9a, 0x01, 0x38, - 0xef, 0xd9, 0x4d, 0x14, 0x58, 0x92, 0x40, 0xb3, 0x57, 0x21, 0xc1, 0x9a, 0x68, 0xbc, 0xc2, 0x59, - 0x64, 0xbd, 0x84, 0xe6, 0x0e, 0xc9, 0x00, 0x39, 0x62, 0xc8, 0x3e, 0xb1, 0xec, 0x27, 0x83, 0x9e, - 0x4d, 0xbb, 0x9a, 0x04, 0x8f, 0x41, 0x97, 0xd6, 0xed, 0xf7, 0xd3, 0x3b, 0x0b, 0x34, 0x01, 0x03, - 0xa0, 0x40, 0x2d, 0xe2, 0x6b, 0x70, 0x51, 0xa4, 0x79, 0xa3, 0xfa, 0x47, 0xe7, 0x6e, 0x13, 0x63, - 0xa4, 0x63, 0xeb, 0xe8, 0xab, 0x5c, 0x7a, 0xf4, 0x31, 0xe5, 0x91, 0xa5, 0xa0, 0x22, 0xaf, 0xfb, - 0x87, 0xe9, 0xf7, 0xef, 0x21, 0x5a, 0x13, 0xa0, 0xe3, 0xcf, 0x21, 0xbe, 0x7b, 0xb5, 0x02, 0x24, - 0x9b, 0x2e, 0xd6, 0xac, 0x6c, 0x61, 0xa7, 0x46, 0xd9, 0xb4, 0x49, 0xd9, 0xf4, 0xab, 0xa8, 0x62, - 0xa1, 0x74, 0x40, 0xd0, 0xf0, 0x44, 0xe9, 0x21, 0x55, 0x7a, 0xa0, 0x5a, 0x0f, 0xdf, 0xbd, 0x02, - 0x35, 0x30, 0xf9, 0x1c, 0xa1, 0x31, 0x27, 0x55, 0xe4, 0x42, 0x09, 0x28, 0x0b, 0x4f, 0x97, 0xd6, - 0xed, 0xd5, 0xdb, 0x02, 0x8c, 0x54, 0x42, 0xbd, 0xe8, 0xee, 0xf2, 0x03, 0xee, 0x36, 0x01, 0xba, - 0x26, 0xed, 0xed, 0xc6, 0x3a, 0xa4, 0x34, 0x81, 0xd3, 0x25, 0xd7, 0x88, 0xd8, 0x1a, 0xab, 0x81, - 0x69, 0xe6, 0xba, 0x80, 0x42, 0x0e, 0x01, 0x7b, 0x9f, 0x80, 0xdc, 0x81, 0xc2, 0xf4, 0x51, 0x09, - 0x71, 0x66, 0xbb, 0x01, 0xd4, 0xc0, 0x3b, 0xd5, 0xb9, 0x77, 0x75, 0x07, 0x8f, 0x42, 0x37, 0x66, - 0x5a, 0x5b, 0x4f, 0x98, 0x60, 0xef, 0xa1, 0x61, 0xaa, 0x2e, 0xbe, 0x07, 0x06, 0xa9, 0xd1, 0x83, - 0xf5, 0xd1, 0xb6, 0x67, 0x8f, 0x2e, 0x06, 0x83, 0x8a, 0x36, 0x16, 0x3b, 0xcd, 0x4b, 0xe9, 0x0c, - 0xde, 0x7e, 0xe2, 0xef, 0xaf, 0x70, 0x4e, 0x13, 0xf0, 0x7b, 0xc8, 0x9a, 0x2c, 0x29, 0x50, 0xc8, - 0x55, 0xc8, 0xa4, 0x15, 0xc3, 0xa5, 0x26, 0x21, 0xcd, 0xf6, 0x2d, 0x18, 0x15, 0x24, 0xae, 0xe7, - 0xe2, 0x3a, 0x4f, 0x98, 0x0f, 0x5a, 0x91, 0x4d, 0x2a, 0xe5, 0x06, 0xe3, 0xb7, 0xb2, 0xa6, 0x28, - 0xb3, 0x95, 0xea, 0xe7, 0xc7, 0x79, 0xb1, 0x1c, 0x18, 0x37, 0xf3, 0xbe, 0xbf, 0x94, 0xe8, 0xd9, - 0xbb, 0x8b, 0x80, 0x4f, 0x80, 0xee, 0x2d, 0x27, 0xc0, 0x0f, 0xb1, 0x21, 0x07, 0xe2, 0x72, 0x59, - 0x30, 0x5e, 0x1c, 0x5a, 0x42, 0xc0, 0x9a, 0x0b, 0xfa, 0xf6, 0x36, 0x12, 0x65, 0x97, 0xdf, 0xb3, - 0x71, 0xe5, 0xd0, 0x82, 0x4b, 0xae, 0x30, 0x70, 0xf5, 0xa6, 0x5a, 0xd4, 0x96, 0x59, 0x45, 0x57, - 0x0b, 0x0c, 0xca, 0xd6, 0x78, 0x9c, 0x57, 0x17, 0x00, 0xad, 0x62, 0xee, 0x2f, 0x20, 0x7a, 0xf6, - 0x4e, 0xef, 0x7f, 0x18, 0x76, 0x77, 0x05, 0xd1, 0xb3, 0x0f, 0xf6, 0xfa, 0x87, 0x91, 0x1d, 0x5e, - 0x4d, 0xd4, 0x50, 0xd7, 0xda, 0xfd, 0x47, 0x63, 0xad, 0x2f, 0x23, 0x40, 0x57, 0xba, 0x9d, 0x1f, - 0xe7, 0xed, 0xfa, 0xdd, 0x5b, 0x38, 0x40, 0x56, 0x83, 0xe6, 0xbf, 0x7d, 0xa2, 0x5c, 0x2a, 0x40, - 0x2b, 0x6d, 0x5b, 0x29, 0x10, 0x63, 0x5f, 0x54, 0xb8, 0x3b, 0x57, 0x47, 0x7a, 0x37, 0x80, 0x5c, - 0xc9, 0x34, 0x70, 0xdd, 0xc1, 0x5d, 0x92, 0x7c, 0x0e, 0x20, 0xce, 0x9c, 0x86, 0x7e, 0xb0, 0x19, - 0x2b, 0x5f, 0x75, 0x32, 0xdf, 0x76, 0xd4, 0xb6, 0x83, 0x1a, 0xb0, 0x5f, 0x04, 0x7e, 0x74, 0xff, - 0x8e, 0xba, 0x53, 0xf9, 0xf8, 0x2d, 0x40, 0xd8, 0x50, 0x1d, 0x17, 0x9c, 0x91, 0x1f, 0xde, 0x58, - 0xf6, 0x07, 0x3e, 0xe3, 0x82, 0xdb, 0xd6, 0x6b, 0x16, 0xac, 0x98, 0x80, 0x82, 0x43, 0xde, 0xb3, - 0x0c, 0xea, 0xcf, 0xf3, 0x04, 0x3a, 0x2a, 0xdb, 0x7a, 0x0f, 0x2f, 0xc9, 0x94, 0x46, 0xd0, 0x98, - 0xa6, 0xf0, 0xdb, 0x01, 0x2f, 0xf4, 0xe7, 0xb6, 0xf5, 0x1c, 0x09, 0x90, 0x1b, 0xdc, 0x12, 0x21, - 0xaf, 0x42, 0xfe, 0xd1, 0xb7, 0x4a, 0x9c, 0xfb, 0x03, 0xd3, 0x4d, 0x38, 0xe3, 0x81, 0xa5, 0xb1, - 0x55, 0xa1, 0x2e, 0x81, 0x37, 0xe6, 0x2c, 0xa5, 0xe3, 0x8d, 0x87, 0xfd, 0xd3, 0xed, 0x2c, 0x13, - 0x82, 0x47, 0xb6, 0x1f, 0xc5, 0x99, 0xb0, 0x79, 0x2c, 0x16, 0x09, 0xcf, 0x62, 0x50, 0x4e, 0xc0, - 0x5c, 0x61, 0x0b, 0xd0, 0x33, 0xf4, 0x27, 0xb4, 0x26, 0xb6, 0x1f, 0x2d, 0x81, 0x27, 0x71, 0x29, - 0xc7, 0x52, 0xff, 0x57, 0x36, 0x1e, 0x0e, 0x06, 0xff, 0xb0, 0x83, 0x78, 0x78, 0x7a, 0x19, 0xd2, - 0x64, 0xe1, 0x47, 0xe3, 0x41, 0x8d, 0x44, 0xce, 0x21, 0x40, 0xe7, 0x01, 0x5f, 0x8f, 0x57, 0x7e, - 0xea, 0xcf, 0x02, 0x66, 0xde, 0x2a, 0x8a, 0x39, 0x52, 0x74, 0x44, 0x02, 0x92, 0xcf, 0x79, 0x12, - 0x8e, 0xb1, 0xcb, 0xde, 0xfe, 0x55, 0x40, 0x81, 0x9e, 0xa8, 0x79, 0x3f, 0xd9, 0xea, 0x49, 0x7a, - 0xa7, 0x79, 0x48, 0xb3, 0x59, 0xe8, 0xc3, 0x93, 0x9a, 0x92, 0xe3, 0xbe, 0xcf, 0xbd, 0x2f, 0xd0, - 0x28, 0x50, 0x0e, 0x68, 0xe4, 0xb2, 0xb1, 0x7a, 0x53, 0xc7, 0x34, 0x1e, 0x3b, 0x21, 0xff, 0xd5, - 0x99, 0x43, 0x7b, 0x9a, 0x3a, 0xb2, 0x8a, 0xd4, 0x70, 0xb7, 0xbe, 0xd6, 0xd4, 0x1a, 0xde, 0x2b, - 0xc4, 0xfb, 0x2f, 0xf2, 0x19, 0xb8, 0x2f, 0x4b, 0x1c, 0xe9, 0x48, 0x52, 0xa6, 0xcb, 0x18, 0xea, - 0x3e, 0x06, 0xd0, 0x60, 0x87, 0xa7, 0x12, 0x14, 0xbb, 0x8d, 0x3a, 0x43, 0x8d, 0xef, 0x0c, 0x37, - 0x3b, 0x2f, 0x35, 0x2b, 0xf5, 0xd1, 0x1c, 0x4a, 0x1c, 0x9a, 0x69, 0x3c, 0x8c, 0x1f, 0x88, 0xc7, - 0x85, 0x60, 0x1e, 0x79, 0x21, 0x27, 0x62, 0x40, 0x6d, 0xe7, 0x3e, 0x0b, 0x3c, 0xa0, 0x94, 0x1b, - 0xe6, 0xfa, 0xc7, 0xa7, 0x2c, 0x24, 0xfd, 0x73, 0xf9, 0xfb, 0x6c, 0x04, 0x1f, 0xdb, 0x80, 0x2d, - 0xa0, 0x1e, 0x80, 0x40, 0x0f, 0x68, 0x7a, 0x9c, 0xa4, 0x65, 0x83, 0x91, 0x4b, 0xb9, 0x63, 0x57, - 0xf8, 0x87, 0xae, 0x9b, 0x63, 0x81, 0x7b, 0x6f, 0xe0, 0x0d, 0x0f, 0x6a, 0x8f, 0x50, 0x79, 0x4b, - 0x21, 0xff, 0x25, 0xb4, 0x30, 0x02, 0x42, 0x27, 0xa6, 0x2e, 0xaa, 0x26, 0x09, 0x69, 0xb0, 0x8d, - 0x13, 0x48, 0x6d, 0x50, 0xdf, 0x73, 0xf0, 0x15, 0x8c, 0x90, 0xc0, 0x81, 0x4c, 0xb2, 0x88, 0xc6, - 0x33, 0xe8, 0xed, 0x91, 0xff, 0x6d, 0xe1, 0x97, 0x85, 0x37, 0x51, 0x58, 0x1d, 0x69, 0x55, 0xba, - 0x4b, 0xe6, 0xde, 0x03, 0x3b, 0x85, 0xab, 0x50, 0xcf, 0xe7, 0x3f, 0xb5, 0xb0, 0xbc, 0x6b, 0x87, - 0x48, 0xa6, 0x31, 0x34, 0xae, 0x76, 0x22, 0x69, 0x40, 0x60, 0xcf, 0x8f, 0x1c, 0xed, 0xa9, 0x2d, - 0x13, 0x41, 0xb7, 0xf5, 0x89, 0xb9, 0x0e, 0x86, 0x0a, 0x6b, 0x6a, 0x89, 0xfe, 0x53, 0x93, 0x87, - 0xa2, 0x48, 0xd2, 0x00, 0x97, 0xda, 0x48, 0x8e, 0xae, 0x20, 0xce, 0x28, 0x7e, 0xa8, 0x83, 0x97, - 0x34, 0xd5, 0x80, 0xe3, 0x31, 0x97, 0xab, 0x3c, 0xdb, 0x84, 0x59, 0xc6, 0x50, 0x09, 0x33, 0xc7, - 0x9d, 0xd1, 0x2c, 0xc6, 0x2e, 0xd0, 0xf9, 0x54, 0xc0, 0xc8, 0x18, 0x37, 0x06, 0xdd, 0x7a, 0x4c, - 0x50, 0x3f, 0x48, 0x73, 0x63, 0x58, 0xd9, 0x46, 0x6d, 0xd3, 0x2c, 0x84, 0x48, 0xdf, 0x14, 0xa3, - 0x01, 0x34, 0xb2, 0x0e, 0x98, 0x34, 0xdc, 0x62, 0x29, 0x09, 0xa8, 0x60, 0xc5, 0x2b, 0x15, 0xcd, - 0xaa, 0x8d, 0xfa, 0xa9, 0x3e, 0x2a, 0x71, 0xfd, 0x92, 0x71, 0xc1, 0x6c, 0xcf, 0xb3, 0xbd, 0xc0, - 0x9e, 0xfb, 0x0b, 0x28, 0x41, 0xf6, 0x72, 0x68, 0x2f, 0x47, 0xf6, 0xf2, 0xd8, 0x5e, 0x9e, 0xd8, - 0xcb, 0x53, 0x7b, 0x79, 0x66, 0x2f, 0x13, 0x3b, 0xb6, 0xe3, 0x84, 0xe5, 0x3b, 0xf9, 0x25, 0x9f, - 0x51, 0xf7, 0x1e, 0xb3, 0x57, 0xe4, 0xa9, 0xad, 0xe3, 0xb1, 0x4c, 0x23, 0xd0, 0x1e, 0xe1, 0x46, - 0x6d, 0xe5, 0xa5, 0x1f, 0x42, 0x19, 0xd0, 0x54, 0x55, 0x94, 0xc8, 0x00, 0x69, 0x08, 0x0e, 0x63, - 0x8a, 0xf1, 0x29, 0x0c, 0xa1, 0x19, 0x49, 0xa1, 0x44, 0x19, 0xdc, 0x18, 0x53, 0x8a, 0x56, 0x19, - 0x3b, 0x86, 0xab, 0x8a, 0x67, 0xf1, 0xc0, 0xce, 0x82, 0x5c, 0xea, 0xa5, 0x92, 0x01, 0x1a, 0x26, - 0xfe, 0xff, 0xac, 0x30, 0xff, 0x64, 0x8f, 0xc7, 0x74, 0x0e, 0xc1, 0x01, 0x9f, 0x33, 0x06, 0x69, - 0x9d, 0xb5, 0xc4, 0xa2, 0xfe, 0xaa, 0xb2, 0xc4, 0xe0, 0xb2, 0x96, 0x34, 0x53, 0x1e, 0xf8, 0x9e, - 0x19, 0x52, 0xe6, 0x7d, 0xca, 0x46, 0xec, 0xd9, 0x1c, 0xb4, 0x56, 0xe4, 0x57, 0xc1, 0x63, 0x93, - 0x63, 0x20, 0x66, 0xfc, 0x70, 0x91, 0xef, 0xe3, 0x28, 0x73, 0x07, 0x64, 0x18, 0x2c, 0x5e, 0x26, - 0xc7, 0x6c, 0x65, 0x7d, 0x82, 0x8c, 0x89, 0x49, 0x1b, 0xbe, 0x39, 0xe0, 0x9c, 0x2e, 0x5b, 0xf2, - 0x00, 0x10, 0x14, 0x85, 0xb0, 0xf9, 0x75, 0xae, 0x19, 0xa2, 0x03, 0xca, 0xdc, 0x81, 0x46, 0xf4, - 0x29, 0x4c, 0x9f, 0x83, 0xaa, 0x19, 0x41, 0x3b, 0xd8, 0x5f, 0xa1, 0xab, 0x29, 0x2b, 0xa6, 0x8e, - 0x0f, 0x37, 0x4b, 0x52, 0x98, 0x13, 0x73, 0x1f, 0x9a, 0xbc, 0x64, 0x2b, 0xd3, 0x72, 0x5e, 0x6a, - 0x34, 0xa0, 0x71, 0xca, 0xc6, 0xe6, 0xcb, 0x76, 0x2f, 0xf0, 0xf2, 0xb2, 0xde, 0xd7, 0x3a, 0x00, - 0xd5, 0xc4, 0x16, 0x49, 0xa2, 0x6f, 0x0c, 0xea, 0x9c, 0xe4, 0x85, 0x6d, 0x81, 0x7e, 0xa8, 0x2d, - 0x73, 0x02, 0x96, 0xe9, 0xc7, 0x0f, 0xf0, 0x56, 0xfb, 0xbd, 0x13, 0xb0, 0x39, 0x38, 0x4a, 0xc2, - 0x42, 0x13, 0x09, 0x10, 0x57, 0xd2, 0x77, 0x60, 0x08, 0xa6, 0x6e, 0x9c, 0x51, 0x31, 0x15, 0x0c, - 0x3c, 0xee, 0x9f, 0x56, 0xa7, 0x2a, 0xdc, 0x6a, 0x70, 0xdb, 0x0f, 0x9d, 0xa1, 0x09, 0xc0, 0xfe, - 0x48, 0x0f, 0x09, 0x80, 0x57, 0x63, 0x25, 0x38, 0xa0, 0x75, 0x8e, 0xcb, 0x32, 0x77, 0x6e, 0xc6, - 0x86, 0xe5, 0x58, 0x09, 0x3e, 0xac, 0x81, 0xeb, 0x71, 0x90, 0x60, 0x58, 0x97, 0x40, 0xbd, 0xd9, - 0x91, 0xa1, 0x98, 0xbe, 0xa9, 0x4c, 0x2f, 0xf1, 0xec, 0x89, 0x51, 0x62, 0x3f, 0xdb, 0xd1, 0x4f, - 0xbf, 0x01, 0xfb, 0xb0, 0x5f, 0x60, 0x7f, 0x56, 0xc3, 0x3e, 0x6a, 0xc0, 0x3d, 0x92, 0x53, 0x83, - 0xc5, 0xbf, 0xca, 0x52, 0xe3, 0x60, 0x2d, 0xad, 0x98, 0x54, 0x29, 0x7b, 0xe9, 0x9c, 0xe6, 0x45, - 0xe4, 0x6a, 0x5e, 0xd6, 0x0e, 0x66, 0xbe, 0x5c, 0x59, 0x4f, 0xd6, 0xb2, 0xbe, 0x44, 0x00, 0x8b, - 0x8f, 0x8d, 0x73, 0x32, 0x18, 0xe4, 0x8e, 0x23, 0x9f, 0x39, 0x54, 0x70, 0x5f, 0x6c, 0xc6, 0x43, - 0xdd, 0x06, 0x3c, 0x75, 0x67, 0xde, 0x29, 0x1b, 0xe8, 0xa7, 0x64, 0x31, 0xa3, 0xdd, 0xd1, 0xe0, - 0xd8, 0x1e, 0x0d, 0xe1, 0x67, 0x74, 0x62, 0xc3, 0xea, 0xb6, 0x5b, 0x87, 0xec, 0xf5, 0xb6, 0xfd, - 0x45, 0xe2, 0x7b, 0x45, 0x61, 0xc0, 0x07, 0x35, 0x84, 0xfe, 0x99, 0x82, 0x06, 0xe5, 0x77, 0x53, - 0x56, 0x70, 0x30, 0x0b, 0xa3, 0x74, 0x9c, 0x30, 0x28, 0x5b, 0xa2, 0x2b, 0x4f, 0x1b, 0xa1, 0xcd, - 0xe8, 0x0e, 0xec, 0xe1, 0x3c, 0x31, 0xd8, 0x14, 0xe8, 0xe8, 0x30, 0xe8, 0x68, 0x0f, 0x54, 0x6a, - 0x06, 0x32, 0x9c, 0x97, 0x57, 0x9d, 0xfc, 0x7c, 0x30, 0xd0, 0xd2, 0xa7, 0x61, 0x45, 0x79, 0xfd, - 0x67, 0xda, 0x83, 0xfc, 0x48, 0x26, 0xbf, 0x79, 0xc0, 0x1e, 0x0a, 0x29, 0x2a, 0x63, 0x30, 0x01, - 0x38, 0x48, 0x1d, 0x97, 0x61, 0x04, 0xe6, 0xb2, 0xa9, 0x91, 0xa5, 0x32, 0x1d, 0xab, 0x21, 0x8d, - 0x5c, 0x30, 0x68, 0x79, 0x0e, 0xa9, 0xf6, 0x64, 0xee, 0x0d, 0xdd, 0xd3, 0xaa, 0x6a, 0xcf, 0x2f, - 0xec, 0xd1, 0xe0, 0xc2, 0x1e, 0x5e, 0x9c, 0xb7, 0x68, 0x76, 0xb6, 0x70, 0x64, 0xa7, 0x05, 0x38, - 0xe1, 0x6b, 0x89, 0x71, 0xaf, 0x6a, 0x3e, 0x9d, 0xcf, 0xe7, 0xfb, 0xa3, 0xca, 0x7e, 0xa7, 0xa7, - 0xb6, 0xf9, 0x51, 0x54, 0x4a, 0x54, 0x48, 0x43, 0x02, 0x30, 0xcf, 0x09, 0x8a, 0xc4, 0x8b, 0xbd, - 0x57, 0x96, 0x9a, 0xa0, 0x4b, 0x97, 0xd4, 0xe3, 0x6b, 0xd4, 0x9d, 0x2c, 0x00, 0xf2, 0x69, 0x3c, - 0x20, 0x58, 0x70, 0xa1, 0xc9, 0x21, 0x03, 0x22, 0xa9, 0x0c, 0x6c, 0xfc, 0xdb, 0x1f, 0x9c, 0xf6, - 0x4c, 0x32, 0xc9, 0x6b, 0x95, 0x01, 0x73, 0xbb, 0xc9, 0x32, 0x1b, 0x16, 0x40, 0xf7, 0xe7, 0x9c, - 0x4b, 0x5d, 0xe9, 0xb1, 0x8a, 0x6c, 0xb5, 0x72, 0x31, 0x3b, 0x3f, 0xbf, 0x18, 0xce, 0xeb, 0x83, - 0x92, 0xe0, 0xf0, 0xd9, 0xb1, 0x3d, 0x1c, 0x0d, 0xed, 0xe3, 0xa1, 0x91, 0xaa, 0x86, 0x48, 0x6b, - 0x4f, 0x93, 0x3a, 0x53, 0xa4, 0x0e, 0xab, 0xd0, 0x3b, 0xbb, 0x80, 0xe2, 0xd4, 0xa6, 0xc5, 0xe1, - 0x89, 0x3d, 0x3c, 0x7d, 0x66, 0x9f, 0x9c, 0x7d, 0x89, 0x12, 0xe5, 0xeb, 0xaa, 0x12, 0x07, 0xa0, - 0xc1, 0x21, 0x36, 0x2a, 0xce, 0x31, 0xfc, 0xaa, 0x6a, 0x72, 0xd8, 0xb3, 0x07, 0x04, 0xf2, 0x2e, - 0x39, 0xc3, 0xb7, 0xa3, 0x9d, 0xb7, 0x52, 0xcf, 0xa1, 0xa7, 0xd3, 0xc2, 0x43, 0x50, 0x4d, 0x0a, - 0x26, 0x07, 0x94, 0xe2, 0x1f, 0x3f, 0x46, 0xfc, 0x39, 0x9d, 0x0f, 0x9e, 0x5d, 0xb4, 0x3a, 0xd1, - 0xc0, 0x1e, 0x9d, 0x40, 0xa0, 0x1d, 0x9f, 0x37, 0xca, 0x0f, 0x53, 0x71, 0x35, 0x10, 0x99, 0x98, - 0x55, 0xa1, 0x3a, 0xc6, 0x21, 0x32, 0x3a, 0x52, 0x1f, 0x92, 0xa3, 0x19, 0x2c, 0xfe, 0x9d, 0xd3, - 0xc7, 0xf0, 0x73, 0x32, 0xba, 0xb8, 0x60, 0xc3, 0x16, 0x7e, 0xce, 0xce, 0xc0, 0x1a, 0x98, 0x93, - 0x1a, 0x7d, 0x5a, 0x69, 0xc5, 0x44, 0x4e, 0x73, 0x34, 0x62, 0xc0, 0x1c, 0x8c, 0x92, 0x9d, 0x58, - 0x34, 0x65, 0x11, 0xf9, 0x7f, 0x94, 0xe7, 0x8e, 0x66, 0x67, 0xee, 0x6c, 0xd0, 0xe0, 0xb9, 0x27, - 0xe0, 0xb8, 0x83, 0x67, 0xf6, 0xf0, 0xfc, 0xac, 0xd5, 0x73, 0xb5, 0x3b, 0xed, 0xfa, 0x92, 0x36, - 0xac, 0x71, 0xb6, 0x70, 0x6f, 0xc2, 0xb1, 0x4a, 0x69, 0xb8, 0x0f, 0x22, 0xb7, 0x3f, 0xc8, 0xd5, - 0x91, 0xbe, 0x15, 0x32, 0xe3, 0xde, 0x86, 0xe8, 0x6d, 0x64, 0xcb, 0xdc, 0x7b, 0xb0, 0x88, 0x9c, - 0x36, 0xb1, 0x1a, 0x82, 0xe1, 0xc2, 0x3b, 0x71, 0xe5, 0xd5, 0x0f, 0xcf, 0x5f, 0x91, 0x8e, 0x1b, - 0xd0, 0x34, 0x9d, 0x58, 0x78, 0x79, 0x83, 0x42, 0x62, 0x4c, 0x48, 0xf8, 0x20, 0x2b, 0x0c, 0xc1, - 0xa2, 0x47, 0xb0, 0x94, 0x99, 0xa9, 0x7a, 0x26, 0x7a, 0x01, 0xa9, 0x54, 0x81, 0x02, 0x93, 0x0f, - 0xf4, 0xdd, 0x55, 0x41, 0xb9, 0xba, 0x9e, 0xb0, 0x0c, 0x30, 0x2e, 0x10, 0x61, 0xd0, 0xba, 0x46, - 0x36, 0x09, 0xde, 0xfb, 0x20, 0xfa, 0xde, 0x07, 0x74, 0xb1, 0xfd, 0x7e, 0xff, 0xea, 0x08, 0x50, - 0xe1, 0xdd, 0x8f, 0x88, 0x17, 0xfb, 0x3d, 0x15, 0xda, 0x06, 0xdc, 0xd0, 0x28, 0x2c, 0x64, 0x5d, - 0x77, 0xa6, 0x3c, 0x49, 0x36, 0x76, 0x1d, 0x67, 0xc4, 0x98, 0x97, 0x92, 0x3f, 0xd0, 0x15, 0x9d, - 0x4a, 0x6c, 0x4f, 0x34, 0xfe, 0xab, 0xa3, 0x66, 0xfc, 0x85, 0x16, 0x2c, 0xd2, 0xd1, 0x24, 0xaa, - 0xf5, 0x66, 0x26, 0x9b, 0x3b, 0x14, 0x38, 0x0b, 0x0c, 0x08, 0x16, 0x12, 0x52, 0x56, 0x60, 0x08, - 0x00, 0xa2, 0x2b, 0x12, 0x09, 0x16, 0x65, 0x6d, 0x07, 0x06, 0xc9, 0x55, 0xe0, 0x1b, 0xa8, 0x4a, - 0x15, 0x22, 0xd5, 0x22, 0x84, 0xb8, 0x29, 0x59, 0x26, 0x6c, 0x3e, 0xb1, 0x8e, 0xac, 0xeb, 0xd7, - 0x3c, 0x64, 0x57, 0x47, 0x14, 0x37, 0xbd, 0x56, 0x8b, 0xc2, 0x56, 0xd0, 0x16, 0x10, 0xd5, 0x06, - 0x90, 0x5a, 0xe9, 0xb7, 0x08, 0x2c, 0x26, 0x03, 0x90, 0x22, 0x4b, 0x70, 0x91, 0x75, 0xa3, 0x2e, - 0xec, 0xe0, 0x55, 0xa1, 0x17, 0xfc, 0x61, 0x62, 0x0d, 0x20, 0xa3, 0x8f, 0xf0, 0x9f, 0x75, 0x84, - 0x1a, 0x08, 0xfc, 0xcf, 0x67, 0xe9, 0x69, 0x61, 0xc8, 0x5a, 0x61, 0xb4, 0x94, 0xf1, 0xe3, 0xc0, - 0xba, 0x56, 0xdc, 0x22, 0x72, 0xf8, 0x9d, 0xe1, 0x6d, 0x26, 0xad, 0x71, 0xd4, 0x32, 0x4e, 0x32, - 0x47, 0xb9, 0x85, 0x34, 0xd2, 0x9f, 0x4c, 0x39, 0x24, 0x65, 0xba, 0x25, 0x45, 0x79, 0x22, 0xd0, - 0x09, 0x12, 0xec, 0xfc, 0x90, 0x95, 0xb8, 0x50, 0xbc, 0x69, 0x09, 0x40, 0xb5, 0x77, 0x4b, 0x1a, - 0xdd, 0x93, 0x0d, 0xcf, 0xc8, 0x7f, 0xfe, 0xdb, 0x7f, 0x10, 0x58, 0xd3, 0x10, 0x3f, 0x4a, 0x05, - 0x0d, 0x02, 0x3c, 0x86, 0x11, 0x4b, 0x26, 0xbd, 0x22, 0xd4, 0x4e, 0x31, 0xe5, 0x73, 0xb1, 0x86, - 0x96, 0xbd, 0x4f, 0xfe, 0xeb, 0xdf, 0xff, 0xfe, 0xb7, 0xab, 0xa3, 0x18, 0xb1, 0x5e, 0x77, 0xfe, - 0x02, 0xd0, 0x4b, 0x0a, 0xce, 0xc3, 0x22, 0x6c, 0xc5, 0x3d, 0x09, 0x57, 0x9c, 0xa2, 0xbd, 0xe3, - 0x1e, 0x00, 0xbc, 0x89, 0x08, 0x9e, 0xa1, 0x91, 0x1f, 0xd9, 0x4c, 0x76, 0xed, 0x73, 0xe8, 0xf8, - 0x25, 0xd9, 0x35, 0x28, 0x9e, 0xcc, 0x18, 0x41, 0x48, 0x02, 0x76, 0x81, 0xa5, 0x27, 0x8e, 0x27, - 0x78, 0x5d, 0x0a, 0x96, 0xce, 0x69, 0x1f, 0x5c, 0x5a, 0x13, 0xfa, 0x16, 0x58, 0x48, 0xb3, 0xc5, - 0x82, 0xa5, 0xb8, 0x43, 0x90, 0x12, 0x1a, 0xe1, 0xae, 0x0f, 0x90, 0x80, 0xf5, 0x1e, 0x38, 0x0a, - 0x59, 0x70, 0x44, 0x10, 0x6e, 0x50, 0xeb, 0x1d, 0xa5, 0xf6, 0xa5, 0x10, 0x71, 0x3a, 0x3e, 0x3a, - 0x5a, 0xf8, 0x62, 0x99, 0xcd, 0x20, 0x25, 0x87, 0x47, 0xd3, 0x17, 0xf4, 0x23, 0x8f, 0xdc, 0x5f, - 0xe9, 0xfd, 0xd1, 0xb2, 0x94, 0xcd, 0xba, 0xfe, 0x4e, 0x4e, 0x21, 0x71, 0xc2, 0x3f, 0x32, 0x57, - 0xa0, 0x35, 0x14, 0x5d, 0x13, 0x57, 0xc6, 0x0c, 0x95, 0x33, 0xe8, 0xc6, 0x80, 0xfd, 0xac, 0xb8, - 0x80, 0xac, 0x69, 0x29, 0x25, 0xbe, 0x65, 0xe2, 0x1f, 0x53, 0x75, 0xba, 0x8a, 0x52, 0xc8, 0x43, - 0x5e, 0xa9, 0x07, 0x75, 0x4f, 0x85, 0xdc, 0x6a, 0x19, 0x41, 0x3d, 0x94, 0x28, 0x68, 0xc2, 0xe7, - 0x64, 0x48, 0xba, 0x40, 0xb4, 0x47, 0xfe, 0x45, 0xef, 0xa2, 0xdb, 0xa0, 0x4b, 0x97, 0x66, 0x30, - 0x53, 0xaa, 0xdb, 0x68, 0x17, 0xc3, 0x19, 0x0c, 0xe3, 0x47, 0xd2, 0x36, 0x12, 0x39, 0x9e, 0xd5, - 0x56, 0xb5, 0xfb, 0x01, 0x54, 0x01, 0x36, 0x04, 0xd3, 0x1b, 0xf4, 0xf3, 0x84, 0x87, 0x72, 0xbe, - 0x64, 0x41, 0xaa, 0xdb, 0x0d, 0x7c, 0xf7, 0x9e, 0xe8, 0xf3, 0xeb, 0xbe, 0x02, 0x55, 0xab, 0x32, - 0xe5, 0xc8, 0x33, 0x11, 0x21, 0x72, 0x0b, 0xd2, 0xaa, 0x9c, 0x0a, 0xee, 0x5e, 0xbd, 0x84, 0x51, - 0x73, 0x43, 0x58, 0xb7, 0x39, 0x01, 0x9d, 0x31, 0xf0, 0xfd, 0xef, 0x38, 0x79, 0x01, 0xe9, 0x56, - 0x2b, 0x5c, 0x21, 0xc4, 0x18, 0xd3, 0xa8, 0x9b, 0x31, 0x57, 0x4e, 0xa2, 0xdb, 0xf0, 0x4a, 0x3e, - 0x25, 0xd6, 0x4e, 0x81, 0xb6, 0x88, 0xab, 0x9d, 0xf0, 0xaa, 0x5c, 0xc4, 0x38, 0x64, 0xd7, 0xce, - 0xbe, 0x61, 0x0f, 0xda, 0xf5, 0x16, 0xd7, 0xb6, 0x07, 0x4d, 0x46, 0x78, 0x54, 0x6a, 0xb9, 0xae, - 0xd3, 0x9a, 0xe0, 0x9d, 0x52, 0xa7, 0xe5, 0x59, 0x7f, 0x9b, 0xe4, 0xef, 0x21, 0xcb, 0x10, 0x9c, - 0x53, 0xd7, 0x69, 0xe9, 0xce, 0x6d, 0xd2, 0x8f, 0xbe, 0xa6, 0x57, 0xdf, 0xf0, 0x68, 0x81, 0x47, - 0x30, 0x81, 0xdc, 0xd3, 0x4b, 0x9f, 0x90, 0xbb, 0xa5, 0xbe, 0xba, 0x40, 0xc0, 0x39, 0x23, 0xbe, - 0x96, 0x67, 0xce, 0x1b, 0x74, 0x78, 0x70, 0xd9, 0xbe, 0xb6, 0xd4, 0x41, 0xab, 0x7f, 0xb6, 0x3f, - 0x3d, 0xc2, 0xf2, 0xc5, 0x15, 0x9a, 0x3d, 0xf9, 0xc8, 0x4e, 0xcd, 0xc6, 0x4b, 0x9b, 0x9d, 0x2b, - 0xd9, 0xbb, 0x19, 0x47, 0xa8, 0x75, 0xd4, 0x44, 0x35, 0x1f, 0x98, 0x73, 0x47, 0x90, 0x7c, 0x8f, - 0xc9, 0x5e, 0x7b, 0xdf, 0x90, 0xa7, 0xe1, 0x5b, 0x91, 0x92, 0x49, 0xe8, 0x99, 0xfe, 0x95, 0x94, - 0x0d, 0x24, 0x16, 0x69, 0xcd, 0xe3, 0x95, 0xec, 0x1c, 0xb1, 0xae, 0x35, 0x33, 0x71, 0xfc, 0x3f, - 0xca, 0x84, 0xdc, 0xa6, 0xab, 0xb3, 0xb0, 0x5b, 0x54, 0x54, 0x65, 0x0d, 0x01, 0x09, 0x96, 0x9d, - 0xa9, 0x39, 0x3a, 0x25, 0x5d, 0x1f, 0xcf, 0x72, 0xdd, 0x7e, 0x4f, 0x83, 0x77, 0xae, 0xe4, 0x9e, - 0x90, 0x81, 0xc7, 0x4a, 0x55, 0x61, 0x00, 0x9e, 0xb4, 0x14, 0x25, 0xab, 0x96, 0xb4, 0xd6, 0xde, - 0x99, 0xec, 0xae, 0x2e, 0x5a, 0x38, 0xf9, 0xd3, 0xcd, 0x0d, 0x51, 0x47, 0xb1, 0x78, 0x68, 0xac, - 0x99, 0xd0, 0x3c, 0x74, 0x7e, 0x23, 0x13, 0x7b, 0xa7, 0xbb, 0xbf, 0x93, 0x5d, 0x7e, 0xf4, 0xe7, - 0xfe, 0x67, 0x59, 0x65, 0xfa, 0xe6, 0xe5, 0x17, 0x6a, 0xa0, 0x76, 0x56, 0xf9, 0x48, 0x13, 0xdc, - 0xea, 0x03, 0xd0, 0xaf, 0x44, 0xba, 0x38, 0x4f, 0xfd, 0xbd, 0xa2, 0x01, 0x13, 0xd9, 0xe7, 0xa8, - 0xfd, 0x47, 0x55, 0x03, 0xbe, 0x97, 0xe7, 0x21, 0x5f, 0xea, 0x81, 0xfb, 0x07, 0xef, 0x8f, 0xb4, - 0x42, 0x51, 0x77, 0x5e, 0xaa, 0x13, 0xf7, 0xaf, 0xc2, 0xc8, 0xee, 0x29, 0xfe, 0x23, 0x79, 0xb9, - 0x29, 0x4f, 0xd6, 0xc9, 0x5d, 0x79, 0x60, 0xff, 0x05, 0x2c, 0x75, 0x4a, 0x9e, 0x0e, 0x5f, 0x06, - 0x78, 0x9c, 0xc9, 0x3a, 0x55, 0x0e, 0xbf, 0x95, 0x87, 0xff, 0x75, 0xe6, 0xbe, 0x9c, 0xb7, 0xfa, - 0x95, 0x82, 0xb6, 0xe2, 0x5f, 0x54, 0x26, 0xe3, 0x80, 0xa4, 0xb2, 0x73, 0x40, 0x96, 0xb8, 0xbe, - 0x1b, 0x9b, 0x91, 0x13, 0xb3, 0x94, 0x52, 0x2b, 0x83, 0x92, 0x2f, 0xdc, 0x83, 0xc6, 0xe5, 0xe9, - 0x09, 0x29, 0x37, 0xb7, 0xc9, 0xce, 0x2a, 0xde, 0xe0, 0xaa, 0x8c, 0x9e, 0x96, 0x31, 0x52, 0x6b, - 0x43, 0x76, 0xae, 0x73, 0xb6, 0x55, 0xe3, 0xe7, 0x32, 0x45, 0x12, 0x1d, 0x2e, 0xb5, 0x76, 0xa4, - 0xf3, 0xbb, 0x04, 0xee, 0xbb, 0x3f, 0xde, 0xdd, 0x15, 0x71, 0xab, 0x7a, 0x81, 0xc7, 0x24, 0x4d, - 0x79, 0x27, 0xc7, 0x58, 0x3f, 0xd6, 0xcb, 0x03, 0x7c, 0xea, 0x18, 0xc8, 0xca, 0x3c, 0xfc, 0x5f, - 0x1c, 0x04, 0x16, 0x2c, 0x6f, 0x6e, 0x0b, 0x4a, 0xb2, 0xed, 0xf8, 0xad, 0x61, 0x56, 0xbd, 0x16, - 0xf4, 0xc8, 0xe0, 0xfa, 0x21, 0xfd, 0xe2, 0xe0, 0x2e, 0x2f, 0x10, 0xfd, 0xef, 0xa6, 0xf8, 0xfa, - 0x95, 0xa4, 0xc7, 0xd2, 0xe6, 0x89, 0xf8, 0x2a, 0x74, 0xf1, 0x4a, 0xd5, 0x5e, 0xbb, 0x5f, 0xfa, - 0xcf, 0x37, 0xd1, 0x2c, 0x8d, 0x2f, 0x4d, 0x17, 0x79, 0x28, 0x5a, 0xdb, 0x43, 0xf4, 0xfc, 0xb1, - 0x21, 0xba, 0x17, 0x9e, 0x9a, 0xe5, 0xaa, 0x47, 0x57, 0x62, 0xb2, 0x7e, 0xe7, 0xad, 0x75, 0x5d, - 0x84, 0xab, 0xf5, 0xb2, 0xa3, 0xdc, 0x09, 0xc9, 0x4a, 0x7b, 0x6c, 0x04, 0x81, 0x82, 0x0b, 0xb9, - 0x0a, 0x80, 0x80, 0xbd, 0x63, 0x58, 0x6f, 0x03, 0x7b, 0x71, 0xe2, 0x0c, 0x07, 0x04, 0x56, 0xa5, - 0xf2, 0x6c, 0x46, 0x5d, 0x78, 0x50, 0x22, 0x25, 0xa0, 0x50, 0xe4, 0x14, 0x64, 0xc5, 0xaf, 0xc3, - 0x5a, 0xa0, 0xea, 0x2c, 0x58, 0xb9, 0x0a, 0xd9, 0xbc, 0xed, 0x25, 0x0f, 0xfe, 0x2c, 0xc8, 0x18, - 0xca, 0x16, 0x31, 0xa9, 0x43, 0xc9, 0x7b, 0x96, 0xd7, 0x9d, 0xe7, 0x24, 0xf5, 0x43, 0x3c, 0xee, - 0x95, 0x13, 0x61, 0xb9, 0x2b, 0x96, 0x92, 0x07, 0xb9, 0x58, 0xa5, 0x44, 0x9e, 0x2e, 0x11, 0x1f, - 0xda, 0xf9, 0x32, 0x58, 0x0b, 0x99, 0xe8, 0x2c, 0xe5, 0x41, 0x06, 0xca, 0xf7, 0x23, 0x48, 0xbe, - 0xce, 0xc6, 0x19, 0xa8, 0xf9, 0xf0, 0xb9, 0xb7, 0x95, 0x43, 0xc2, 0xc4, 0x39, 0xb1, 0x76, 0x76, - 0x93, 0xd6, 0xa0, 0x85, 0x25, 0xfc, 0xe0, 0xde, 0x91, 0xa3, 0xb7, 0x8e, 0xda, 0x77, 0x8d, 0xaa, - 0x49, 0xe0, 0xb7, 0x29, 0x17, 0xf4, 0xb9, 0x48, 0x18, 0x8b, 0x0e, 0x68, 0xd4, 0xdc, 0x27, 0xfd, - 0x5c, 0x9d, 0x56, 0x6f, 0xaf, 0x5e, 0x77, 0x2a, 0xca, 0xfa, 0xbf, 0xa0, 0xab, 0xda, 0x07, 0x2e, - 0xe7, 0xb8, 0xb7, 0x91, 0xdb, 0xb8, 0xf8, 0x9f, 0xfe, 0xfe, 0x1b, 0xf8, 0xa5, 0xfa, 0xc9, 0x04, - 0x38, 0x00, 0x00 + 0x26, 0x15, 0xdb, 0x12, 0x89, 0x46, 0x9f, 0xfb, 0xb5, 0x2f, 0xbe, 0x78, 0xf2, 0xf2, 0xfb, 0xab, + 0xdb, 0xbf, 0x5c, 0xbf, 0x22, 0xbe, 0x88, 0xc2, 0x4b, 0x72, 0x81, 0x1f, 0x24, 0xa4, 0xf1, 0x72, + 0x66, 0xb1, 0xd8, 0xc2, 0x01, 0x46, 0x3d, 0xf8, 0x88, 0x98, 0xa0, 0x24, 0xa6, 0x11, 0x9b, 0x59, + 0xf7, 0x01, 0x5b, 0x25, 0x3c, 0x15, 0x16, 0xe9, 0xb9, 0x3c, 0x16, 0x2c, 0x16, 0x33, 0x6b, 0x15, + 0x78, 0xc2, 0x9f, 0x79, 0xec, 0x3e, 0x70, 0x99, 0x23, 0x1f, 0xec, 0x20, 0x0e, 0x44, 0x40, 0x43, + 0x27, 0x73, 0x69, 0xc8, 0x66, 0x63, 0x3b, 0x82, 0x81, 0x28, 0x8f, 0xcc, 0xb3, 0x65, 0x90, 0xf6, + 0x5c, 0x9f, 0xa6, 0x19, 0x03, 0x24, 0xb9, 0x58, 0x38, 0xcf, 0xac, 0x26, 0x31, 0xe1, 0xb3, 0x88, + 0x39, 0x2e, 0x0f, 0x79, 0x6a, 0x91, 0x92, 0xdc, 0xd3, 0x89, 0xfc, 0x53, 0xc3, 0x61, 0xde, 0xac, + 0x59, 0x66, 0x69, 0x50, 0x9a, 0x24, 0x21, 0x73, 0x22, 0x3e, 0x0f, 0xe0, 0x63, 0xc5, 0xe6, 0x0e, + 0x0c, 0x38, 0x2e, 0x4d, 0xe8, 0x3c, 0x64, 0x08, 0x29, 0x02, 0x11, 0xb2, 0xcb, 0xd7, 0xc1, 0x3d, + 0x73, 0xde, 0x71, 0x60, 0x96, 0xa7, 0x17, 0x07, 0x6a, 0x8c, 0xf4, 0x2e, 0x32, 0x37, 0x0d, 0x12, + 0x71, 0xd9, 0xbb, 0xa7, 0x29, 0x11, 0x41, 0xc4, 0x78, 0x2e, 0xec, 0xe7, 0xae, 0xc8, 0x69, 0x78, + 0x4d, 0x97, 0x80, 0xfc, 0xcd, 0xfb, 0x97, 0xaf, 0xfe, 0x6c, 0xd9, 0xde, 0xcc, 0xe3, 0x6e, 0x1e, + 0x01, 0xe9, 0xf3, 0x45, 0x1e, 0xbb, 0x22, 0xe0, 0x31, 0xe1, 0xf1, 0x5b, 0x4e, 0xbd, 0xfe, 0xa0, + 0xf0, 0x03, 0x8f, 0x3d, 0x0f, 0xc3, 0x2b, 0xe0, 0x2d, 0xe5, 0x61, 0xd6, 0x1f, 0xd8, 0x09, 0x4a, + 0xfa, 0xc7, 0x9c, 0xa5, 0x6b, 0x78, 0x00, 0x99, 0x5f, 0xa4, 0xa0, 0xdd, 0xab, 0x34, 0x8f, 0xe6, + 0xea, 0xf9, 0x8d, 0xd2, 0x19, 0x92, 0x50, 0x03, 0x2f, 0x83, 0x2c, 0x09, 0xe9, 0xba, 0x6f, 0xb9, + 0xf7, 0x96, 0x6d, 0xc5, 0x3c, 0x66, 0xd6, 0xc0, 0xfe, 0x8e, 0x89, 0x1b, 0x26, 0x44, 0x10, 0x2f, + 0x01, 0xe7, 0xa6, 0xa4, 0xdb, 0x18, 0x2e, 0x10, 0x73, 0xdf, 0xca, 0xf4, 0x80, 0x35, 0x18, 0x82, + 0x26, 0xe3, 0x3e, 0x9b, 0x5d, 0x16, 0xa0, 0xab, 0x8c, 0x87, 0x6c, 0xe8, 0xb1, 0x79, 0xbe, 0xec, + 0x33, 0x49, 0xe7, 0x96, 0x3d, 0x88, 0x17, 0xfc, 0xe1, 0x4f, 0x34, 0xcc, 0x19, 0x40, 0xad, 0x33, + 0xc1, 0xa2, 0x9f, 0xb3, 0x90, 0xb1, 0x04, 0x85, 0xb7, 0x6c, 0x36, 0x54, 0x63, 0xc3, 0x72, 0xac, + 0x1b, 0xec, 0xde, 0x75, 0xa9, 0xf7, 0x31, 0xcf, 0x84, 0x26, 0x5e, 0x83, 0xde, 0x7e, 0xd5, 0x82, + 0x24, 0xfa, 0x45, 0x88, 0x9f, 0x33, 0x96, 0xde, 0xb3, 0x14, 0x01, 0xf1, 0x71, 0xa8, 0x1e, 0xbb, + 0x26, 0xe7, 0x59, 0x6d, 0x2a, 0x3e, 0x74, 0x4d, 0x4c, 0x68, 0x96, 0xad, 0x78, 0xea, 0x95, 0x93, + 0xcd, 0x40, 0x27, 0x00, 0x7a, 0x79, 0x39, 0x19, 0x1e, 0xda, 0x84, 0x46, 0x77, 0xfe, 0x79, 0xc5, + 0x82, 0xa5, 0x2f, 0xf8, 0x62, 0x01, 0xef, 0xa5, 0xbc, 0x38, 0x3a, 0xac, 0x8f, 0x76, 0x82, 0xde, + 0x05, 0x21, 0x5f, 0xa6, 0x34, 0xf2, 0x82, 0x7b, 0xf0, 0x97, 0xb4, 0x82, 0xde, 0x7a, 0xd1, 0x89, + 0x00, 0x7e, 0x05, 0xf3, 0x94, 0xa2, 0x0f, 0x80, 0x8e, 0x13, 0x06, 0x5f, 0xf3, 0x94, 0xd5, 0x95, + 0x2f, 0xd1, 0xed, 0x9d, 0xf6, 0x18, 0xe4, 0x0b, 0xea, 0x42, 0x8c, 0xec, 0xc3, 0xdb, 0x98, 0xd1, + 0x82, 0x72, 0x15, 0xa4, 0x2c, 0x64, 0x59, 0xc3, 0x10, 0x7a, 0x6c, 0x9f, 0x2d, 0x0c, 0x58, 0x96, + 0x05, 0x0d, 0x10, 0x7c, 0x1e, 0x6c, 0x6a, 0x11, 0xb0, 0x1d, 0x41, 0x45, 0xb6, 0x0a, 0x84, 0xeb, + 0xf7, 0xab, 0xc0, 0x1d, 0x14, 0x2e, 0xcd, 0x98, 0x8e, 0xde, 0xa9, 0xe0, 0xcb, 0x65, 0xc8, 0xde, + 0xc4, 0x1e, 0x7b, 0xe8, 0x0f, 0xce, 0xe7, 0x10, 0x32, 0x77, 0xe7, 0xf2, 0xfd, 0xed, 0xf3, 0x0f, + 0xaf, 0xf0, 0x35, 0x87, 0xd7, 0xcf, 0x73, 0xc1, 0x6f, 0x69, 0xca, 0x76, 0x67, 0x8c, 0xad, 0x69, + 0x23, 0x44, 0x71, 0xd6, 0x8d, 0x60, 0xc9, 0x18, 0x42, 0x75, 0x1e, 0x72, 0xf7, 0xce, 0xda, 0x01, + 0x99, 0x74, 0x80, 0x4c, 0x2a, 0x90, 0x4d, 0x25, 0x4f, 0x3d, 0x5d, 0x14, 0x98, 0x89, 0xd8, 0x2c, + 0x66, 0x2b, 0xf2, 0xc3, 0x87, 0xb7, 0x37, 0x8c, 0xa6, 0xae, 0x7f, 0x4d, 0xc1, 0x3d, 0xb2, 0xbe, + 0x49, 0x41, 0x43, 0x40, 0x20, 0xed, 0x00, 0x01, 0x83, 0xaf, 0x07, 0xe7, 0x71, 0x1e, 0x86, 0xb3, + 0x59, 0x4d, 0xfe, 0x19, 0x1b, 0x2e, 0x99, 0xe8, 0x5b, 0x09, 0x7c, 0xb7, 0x06, 0x83, 0x6f, 0xbe, + 0xe9, 0xef, 0x26, 0xb5, 0x9a, 0x42, 0x1b, 0x0a, 0x6a, 0xc9, 0x67, 0x75, 0x59, 0x56, 0x2c, 0x74, + 0x39, 0xe6, 0x0a, 0x23, 0x48, 0x33, 0x7f, 0x99, 0xd4, 0x54, 0x13, 0xb4, 0x24, 0xb3, 0x83, 0xb8, + 0x68, 0x55, 0xd2, 0xa8, 0x4a, 0x81, 0x9d, 0x7a, 0xdf, 0xf7, 0x7e, 0xd2, 0xf1, 0xbe, 0xc6, 0x5a, + 0xcb, 0xeb, 0x4a, 0xae, 0x36, 0xd8, 0x2a, 0x2d, 0x37, 0xdc, 0xd0, 0x4c, 0x60, 0xb6, 0x50, 0x96, + 0xcb, 0xca, 0x42, 0x81, 0x06, 0x78, 0x15, 0x32, 0xfc, 0xfa, 0x62, 0xfd, 0xc6, 0x83, 0x04, 0x7c, + 0x0e, 0xae, 0x2c, 0xd6, 0x98, 0x91, 0x15, 0xd4, 0x4c, 0x6b, 0x68, 0x36, 0x9b, 0x89, 0x7f, 0xb6, + 0xc0, 0x0f, 0xeb, 0x06, 0x69, 0xba, 0x64, 0x51, 0x37, 0x9f, 0xf4, 0x5a, 0x7b, 0xbf, 0x95, 0x1a, + 0xca, 0xdc, 0x31, 0x04, 0xcc, 0xac, 0x19, 0xa1, 0x15, 0xd3, 0xde, 0x92, 0xd5, 0xc0, 0x54, 0x9f, + 0xa9, 0xbd, 0xb7, 0x4b, 0x07, 0x56, 0x12, 0x42, 0xac, 0x7c, 0x22, 0x5a, 0xd9, 0x30, 0x88, 0x63, + 0x96, 0x62, 0x6e, 0x98, 0x59, 0x37, 0x82, 0x42, 0x6e, 0xde, 0x8d, 0xd9, 0x7a, 0x70, 0xd6, 0xa3, + 0xae, 0x01, 0x8c, 0x3a, 0x20, 0x37, 0x98, 0xbd, 0xac, 0x5a, 0xb4, 0x09, 0xe3, 0x26, 0xd2, 0xff, + 0x62, 0xef, 0x25, 0x15, 0xb4, 0x5f, 0x6c, 0x6c, 0x0b, 0x5f, 0x64, 0xd2, 0xbf, 0x6a, 0x55, 0x74, + 0x5b, 0xf1, 0xe0, 0x5c, 0x0d, 0xed, 0x6d, 0x06, 0x90, 0x19, 0x51, 0x9c, 0xfe, 0x00, 0x66, 0x37, + 0xb2, 0x14, 0xb2, 0xae, 0xcd, 0xd7, 0x4a, 0x67, 0xb4, 0x8f, 0xce, 0xf8, 0xf1, 0x74, 0x0c, 0x6e, + 0xe9, 0x84, 0x29, 0x83, 0x74, 0x1f, 0x13, 0xcc, 0x1f, 0xd7, 0x29, 0x8f, 0x82, 0x8c, 0xf5, 0xfb, + 0x99, 0x4d, 0x11, 0x08, 0x6d, 0xc3, 0x65, 0x66, 0xf9, 0xf3, 0xbb, 0xb7, 0xaf, 0x85, 0x48, 0x3e, + 0xb0, 0x5f, 0x72, 0xe0, 0xe4, 0x9c, 0x0f, 0xa9, 0xe7, 0xbd, 0xba, 0x07, 0x2b, 0xbd, 0x0d, 0x80, + 0x31, 0xd0, 0x5f, 0xdf, 0x0a, 0xa1, 0xb7, 0xb1, 0xec, 0xbe, 0xa1, 0x82, 0x32, 0xf8, 0x7c, 0x75, + 0xcb, 0x69, 0x26, 0xde, 0xb1, 0x2c, 0x43, 0x37, 0xb0, 0x4c, 0x40, 0x91, 0x8c, 0xde, 0x33, 0xef, + 0x09, 0xc6, 0x4c, 0x5f, 0xf8, 0x41, 0x36, 0x04, 0xf9, 0x12, 0xe8, 0x3e, 0x18, 0x9a, 0x01, 0x38, + 0x1f, 0xd8, 0x6d, 0x14, 0x58, 0x9a, 0x42, 0xb3, 0x57, 0x23, 0xc1, 0xda, 0x68, 0xbc, 0xc2, 0x59, + 0x64, 0xe5, 0x43, 0x73, 0x87, 0x64, 0x80, 0x1c, 0x31, 0x64, 0x9f, 0x58, 0xf6, 0x93, 0xd1, 0xc0, + 0xa6, 0x7d, 0x4d, 0x82, 0x27, 0xa0, 0x4b, 0xeb, 0xfa, 0xfb, 0x9b, 0x5b, 0x0b, 0x34, 0x01, 0x03, + 0xa0, 0x40, 0x2d, 0xe2, 0x6b, 0x70, 0x51, 0xa4, 0x79, 0xa5, 0xfa, 0x47, 0xe7, 0x76, 0x9d, 0x60, + 0xa4, 0x63, 0xeb, 0x18, 0xa8, 0x5c, 0x7a, 0xf0, 0x31, 0xe3, 0xb1, 0xa5, 0xa0, 0x62, 0xaf, 0xff, + 0x87, 0x9b, 0xef, 0xdf, 0x43, 0xb4, 0xa6, 0x40, 0x27, 0x58, 0x40, 0x7c, 0x0f, 0x1a, 0x05, 0x48, + 0x36, 0x5d, 0xac, 0x5d, 0xd9, 0xc2, 0xce, 0x8c, 0xb2, 0x69, 0x9b, 0xb2, 0xe9, 0x57, 0x51, 0xc5, + 0x52, 0xe9, 0x80, 0xa0, 0xe1, 0x89, 0xd2, 0x43, 0xa6, 0xf4, 0x40, 0xb5, 0x1e, 0xbe, 0x7b, 0x05, + 0x6a, 0x60, 0xf2, 0x39, 0x46, 0x63, 0xce, 0xea, 0xc8, 0x85, 0x12, 0x50, 0x16, 0x9e, 0x3e, 0x6d, + 0xda, 0x6b, 0xb0, 0x01, 0x18, 0xa9, 0x84, 0x66, 0xd1, 0xdd, 0xe6, 0x07, 0xdc, 0x6d, 0x06, 0x74, + 0x4d, 0xda, 0xdb, 0x8e, 0x75, 0x48, 0x69, 0x02, 0xa7, 0x4b, 0xae, 0x11, 0xb1, 0x35, 0x55, 0x03, + 0x37, 0xb9, 0xeb, 0x02, 0x0a, 0x39, 0x04, 0xec, 0x7d, 0x02, 0x72, 0x0b, 0x0a, 0xd3, 0x47, 0x2d, + 0xc4, 0x99, 0xed, 0x86, 0x50, 0x03, 0x6f, 0x55, 0xe7, 0xde, 0xd7, 0x1d, 0x3c, 0x0a, 0xdd, 0x9a, + 0x69, 0x6d, 0x3d, 0x61, 0x86, 0xbd, 0x87, 0x86, 0xa9, 0xbb, 0xf8, 0x0e, 0x18, 0xa4, 0x46, 0x0f, + 0xd6, 0x47, 0x9b, 0x81, 0x3d, 0x39, 0x1b, 0x8d, 0x6a, 0xda, 0x58, 0x6e, 0x35, 0x2f, 0x95, 0x33, + 0x78, 0xbb, 0x89, 0x7f, 0x78, 0x8f, 0x73, 0xda, 0x80, 0xdf, 0x43, 0xd6, 0x64, 0x69, 0x89, 0x42, + 0xae, 0x42, 0x66, 0x9d, 0x18, 0xce, 0x35, 0x09, 0x69, 0xb6, 0x6f, 0xc1, 0xa8, 0x20, 0x71, 0x33, + 0x17, 0x37, 0x79, 0xc2, 0x7c, 0xd0, 0x89, 0x6c, 0x56, 0x2b, 0x37, 0x18, 0xbf, 0xb5, 0x35, 0x45, + 0x95, 0xad, 0x54, 0x3f, 0x3f, 0x2d, 0xca, 0xe5, 0xc0, 0xb4, 0x9d, 0xf7, 0xdd, 0xa5, 0xc4, 0xc0, + 0xde, 0x5e, 0x04, 0x7c, 0x02, 0x74, 0x67, 0x39, 0x01, 0x7e, 0x88, 0x0d, 0x39, 0x10, 0x97, 0xcb, + 0x82, 0xe9, 0x72, 0xdf, 0x12, 0x02, 0xd6, 0x5c, 0xd0, 0xb7, 0x77, 0x91, 0xa8, 0xba, 0xfc, 0x81, + 0x8d, 0x2b, 0x87, 0x0e, 0x5c, 0x72, 0x85, 0x81, 0xab, 0x37, 0xd5, 0xa2, 0x76, 0xcc, 0x2a, 0xbb, + 0x5a, 0x60, 0x50, 0xb6, 0xc6, 0xd3, 0xa2, 0xbe, 0x00, 0xe8, 0x14, 0x73, 0x77, 0x01, 0x31, 0xb0, + 0xb7, 0x7a, 0xff, 0xfd, 0xb0, 0xdb, 0x2b, 0x88, 0x81, 0xbd, 0xb7, 0xd7, 0xdf, 0x8f, 0x6c, 0xff, + 0x6a, 0xa2, 0x81, 0xba, 0xd1, 0xee, 0x3f, 0x1a, 0x6b, 0x73, 0x19, 0x01, 0xba, 0xd2, 0xed, 0xfc, + 0xb4, 0xe8, 0xd6, 0xef, 0xce, 0xc2, 0x01, 0xb2, 0x1a, 0x34, 0xff, 0xdd, 0x13, 0xe5, 0x52, 0x01, + 0x5a, 0x69, 0xdb, 0xca, 0x80, 0x18, 0xfb, 0xa2, 0xc2, 0xdd, 0xbb, 0x38, 0xd0, 0xbb, 0x01, 0xe4, + 0x42, 0xa6, 0x81, 0xcb, 0x1e, 0xee, 0x92, 0x14, 0x0b, 0x00, 0x71, 0x16, 0x34, 0x0a, 0xc2, 0xf5, + 0x54, 0xf9, 0xaa, 0x93, 0x07, 0xb6, 0xa3, 0xb6, 0x1d, 0xd4, 0x80, 0xfd, 0x22, 0x0c, 0xe2, 0xbb, + 0x77, 0xd4, 0xbd, 0x91, 0x8f, 0xdf, 0x02, 0x84, 0x0d, 0xd5, 0x71, 0xc9, 0x19, 0xf9, 0xe1, 0x8d, + 0x65, 0x7f, 0xe0, 0x73, 0x2e, 0xb8, 0x6d, 0xbd, 0x66, 0xe1, 0x3d, 0x13, 0x50, 0x70, 0xc8, 0x7b, + 0x96, 0x43, 0xfd, 0x79, 0x9e, 0x42, 0x47, 0x65, 0x5b, 0xef, 0xe1, 0x25, 0xb9, 0xa1, 0x31, 0x34, + 0xa6, 0x19, 0xfc, 0x76, 0xc0, 0x0b, 0x83, 0x85, 0x6d, 0x3d, 0x47, 0x02, 0xe4, 0x0a, 0xb7, 0x44, + 0xc8, 0xab, 0x88, 0x7f, 0x0c, 0xac, 0x0a, 0xe7, 0xee, 0xc0, 0xcd, 0x3a, 0x9a, 0xf3, 0xd0, 0xd2, + 0xd8, 0xea, 0x50, 0xe7, 0xc0, 0x1b, 0x73, 0x7c, 0xe9, 0x78, 0xd3, 0xf1, 0xf0, 0x78, 0x33, 0xcf, + 0x85, 0xe0, 0xb1, 0x1d, 0xc4, 0x49, 0x2e, 0x6c, 0x9e, 0x88, 0x65, 0xca, 0xf3, 0x04, 0x94, 0x13, + 0x32, 0x57, 0xd8, 0x02, 0xf4, 0x0c, 0xfd, 0x09, 0x6d, 0x88, 0x1d, 0xc4, 0x3e, 0xf0, 0x24, 0xce, + 0xe5, 0x58, 0x16, 0xfc, 0xca, 0xa6, 0xe3, 0xd1, 0xe8, 0x1f, 0xb6, 0x10, 0x8f, 0x8f, 0xcf, 0x23, + 0x9a, 0x2e, 0x83, 0x78, 0x3a, 0x6a, 0x90, 0x28, 0x38, 0x04, 0xe8, 0x22, 0xe4, 0xab, 0xe9, 0x7d, + 0x90, 0x05, 0xf3, 0x90, 0x99, 0xb7, 0x8a, 0x62, 0x81, 0x14, 0x1d, 0x91, 0x82, 0xe4, 0x0b, 0x9e, + 0x46, 0x53, 0xec, 0xb2, 0x37, 0x7f, 0x15, 0x50, 0xa0, 0x67, 0x6a, 0xde, 0x4f, 0xb6, 0x7a, 0x92, + 0xde, 0x69, 0x1e, 0xb2, 0x7c, 0x1e, 0x05, 0xf0, 0xa4, 0xa6, 0x14, 0xb8, 0xef, 0x73, 0x17, 0x08, + 0x34, 0x0a, 0x94, 0x03, 0x1a, 0xbb, 0x6c, 0xaa, 0xde, 0x34, 0x31, 0x4d, 0xa7, 0x4e, 0xc4, 0x7f, + 0x75, 0x16, 0xd0, 0x9e, 0x66, 0x8e, 0xac, 0x22, 0x0d, 0xdc, 0x9d, 0xaf, 0x35, 0xb5, 0x96, 0xf7, + 0x0a, 0xf1, 0xee, 0x8b, 0x62, 0x0e, 0xee, 0xcb, 0x52, 0x47, 0x3a, 0x92, 0x94, 0xe9, 0x3c, 0x81, + 0xba, 0x8f, 0x01, 0x34, 0xda, 0xe2, 0xa9, 0x02, 0xc5, 0x6e, 0xa3, 0xc9, 0x50, 0xeb, 0x3b, 0xc3, + 0xcd, 0xd6, 0x4b, 0xcd, 0x4a, 0x73, 0xb4, 0x80, 0x12, 0x87, 0x66, 0x9a, 0x8e, 0x93, 0x07, 0xe2, + 0x71, 0x21, 0x98, 0x47, 0x5e, 0xc8, 0x89, 0x18, 0x50, 0x9b, 0x45, 0xc0, 0x42, 0x0f, 0x28, 0x15, + 0x86, 0xb9, 0xe1, 0xe1, 0x31, 0x8b, 0xc8, 0xf0, 0x54, 0xfe, 0x3e, 0x99, 0xc0, 0xc7, 0x26, 0x64, + 0x4b, 0xa8, 0x07, 0x20, 0xd0, 0x03, 0x9a, 0x1e, 0x27, 0x69, 0xd9, 0x60, 0xe4, 0x5c, 0xee, 0xd8, + 0x95, 0xfe, 0xa1, 0xeb, 0xe6, 0x54, 0xe0, 0xde, 0x1b, 0x78, 0xc3, 0x83, 0xda, 0x23, 0x54, 0xde, + 0x52, 0xca, 0x7f, 0x0e, 0x2d, 0x8c, 0x80, 0xd0, 0x49, 0xa8, 0x8b, 0xaa, 0x49, 0x23, 0x1a, 0x6e, + 0x92, 0x14, 0x52, 0x1b, 0xd4, 0xf7, 0x02, 0x7c, 0x05, 0x23, 0x24, 0x74, 0x20, 0x93, 0x2c, 0xe3, + 0xe9, 0x1c, 0x7a, 0x7b, 0xe4, 0x7f, 0x53, 0xfa, 0x65, 0xe9, 0x4d, 0x14, 0x56, 0x47, 0x5a, 0x95, + 0xae, 0xcf, 0xdc, 0x3b, 0x60, 0xa7, 0x74, 0x15, 0xea, 0x05, 0xfc, 0xa7, 0x0e, 0x96, 0xb7, 0xed, + 0x10, 0xcb, 0x34, 0x86, 0xc6, 0xd5, 0x4e, 0x24, 0x0d, 0x08, 0xec, 0x05, 0xb1, 0xa3, 0x3d, 0xb5, + 0x63, 0x22, 0xe8, 0xb6, 0x39, 0xb1, 0xd0, 0xc1, 0x50, 0x63, 0x4d, 0x2d, 0xd1, 0x7f, 0x6a, 0xf3, + 0x50, 0x14, 0x49, 0x1a, 0xe0, 0x5c, 0x1b, 0xc9, 0xd1, 0x15, 0xc4, 0x99, 0x24, 0x0f, 0x4d, 0xf0, + 0x8a, 0xa6, 0x1a, 0x70, 0x3c, 0xe6, 0x72, 0x95, 0x67, 0xdb, 0x30, 0xcb, 0x18, 0xaa, 0x60, 0x16, + 0xb8, 0x33, 0x9a, 0x27, 0xd8, 0x05, 0x3a, 0x9f, 0x0a, 0x18, 0x19, 0xe3, 0xc6, 0xa0, 0x1b, 0x8f, + 0x09, 0x1a, 0x84, 0x59, 0x61, 0x0c, 0x2b, 0xdb, 0xa8, 0x4d, 0x96, 0x47, 0x10, 0xe9, 0xeb, 0x72, + 0x34, 0x84, 0x46, 0xd6, 0x01, 0x93, 0x46, 0x1b, 0x2c, 0x25, 0x21, 0x15, 0xac, 0x7c, 0xa5, 0xa2, + 0x59, 0xb5, 0x51, 0x3f, 0x35, 0x47, 0x25, 0xae, 0x5f, 0x72, 0x2e, 0x98, 0xed, 0x79, 0xb6, 0x17, + 0xda, 0x8b, 0x60, 0x09, 0x25, 0xc8, 0xf6, 0xc7, 0xb6, 0x3f, 0xb1, 0xfd, 0x43, 0xdb, 0x3f, 0xb2, + 0xfd, 0x63, 0xdb, 0x3f, 0xb1, 0xfd, 0xd4, 0x4e, 0xec, 0x24, 0x65, 0xc5, 0x56, 0x7e, 0x29, 0xe6, + 0xd4, 0xbd, 0xc3, 0xec, 0x15, 0x7b, 0x6a, 0xeb, 0x78, 0x2a, 0xd3, 0x08, 0xb4, 0x47, 0xb8, 0x51, + 0x5b, 0x7b, 0x19, 0x44, 0x50, 0x06, 0x34, 0x55, 0x15, 0x25, 0x32, 0x40, 0x5a, 0x82, 0xc3, 0x98, + 0x62, 0x7a, 0x0c, 0x43, 0x68, 0x46, 0x52, 0x2a, 0x51, 0x06, 0x37, 0xc6, 0x94, 0xa2, 0x55, 0xc5, + 0x8e, 0xe1, 0xaa, 0xe6, 0x59, 0x3c, 0xb4, 0xf3, 0xb0, 0x90, 0x7a, 0xa9, 0x65, 0x80, 0x96, 0x89, + 0xff, 0x3f, 0x2b, 0xcc, 0x3f, 0xd9, 0xd3, 0x29, 0x5d, 0x40, 0x70, 0xc0, 0xe7, 0x9c, 0x41, 0x5a, + 0x67, 0x1d, 0xb1, 0xa8, 0xbf, 0xaa, 0x2c, 0x31, 0x3a, 0x6f, 0x24, 0xcd, 0x8c, 0x87, 0x81, 0x67, + 0x86, 0x94, 0x79, 0x9f, 0xb2, 0x09, 0x7b, 0xb6, 0x00, 0xad, 0x95, 0xf9, 0x55, 0xf0, 0xc4, 0xe4, + 0x18, 0x88, 0x99, 0x20, 0x5a, 0x16, 0xbb, 0x38, 0xaa, 0xdc, 0x01, 0x19, 0x06, 0x8b, 0x97, 0xc9, + 0x31, 0x1b, 0x59, 0x9f, 0x20, 0x63, 0x62, 0xd2, 0x86, 0x6f, 0x0e, 0x38, 0xa7, 0xcb, 0x7c, 0x1e, + 0x02, 0x82, 0xb2, 0x10, 0xb6, 0xbf, 0x2e, 0x34, 0x43, 0x74, 0x44, 0x99, 0x3b, 0xd2, 0x88, 0x3e, + 0x85, 0xe9, 0x73, 0x50, 0xb5, 0x23, 0xe8, 0x06, 0xfb, 0x2b, 0x74, 0x35, 0x55, 0xc5, 0xd4, 0xf1, + 0xe1, 0xe6, 0x69, 0x06, 0x73, 0x12, 0x1e, 0x40, 0x93, 0x97, 0x6e, 0x64, 0x5a, 0x2e, 0x2a, 0x8d, + 0x86, 0x34, 0xc9, 0xd8, 0xd4, 0x7c, 0xd9, 0xec, 0x04, 0x5e, 0x51, 0xd5, 0xfb, 0x46, 0x07, 0xa0, + 0x9a, 0xd8, 0x32, 0x49, 0x0c, 0x8d, 0x41, 0x9d, 0xa3, 0xa2, 0xb4, 0x2d, 0xd0, 0x8f, 0xb4, 0x65, + 0x8e, 0xc0, 0x32, 0xc3, 0xe4, 0x01, 0xde, 0x6a, 0xbf, 0x77, 0x42, 0xb6, 0x00, 0x47, 0x49, 0x59, + 0x64, 0x22, 0x01, 0xe2, 0x4a, 0xfa, 0x0e, 0x0c, 0xc1, 0xd4, 0xb5, 0x33, 0x29, 0xa7, 0x82, 0x81, + 0xa7, 0xc3, 0xe3, 0xfa, 0x54, 0x85, 0x5b, 0x0d, 0x6e, 0x86, 0x91, 0x33, 0x36, 0x01, 0x38, 0x9c, + 0xe8, 0x21, 0x01, 0xf0, 0x6a, 0xac, 0x02, 0x07, 0xb4, 0xce, 0x61, 0x55, 0xe6, 0x4e, 0xcd, 0xd8, + 0xb8, 0x1a, 0xab, 0xc0, 0xc7, 0x0d, 0x70, 0x3d, 0x0e, 0x12, 0x8c, 0x9b, 0x12, 0xa8, 0x37, 0x5b, + 0x32, 0x94, 0xd3, 0xd7, 0xb5, 0xe9, 0x15, 0x9e, 0x1d, 0x31, 0x2a, 0xec, 0x27, 0x5b, 0xfa, 0x19, + 0xb6, 0x60, 0x1f, 0x0f, 0x4b, 0xec, 0xcf, 0x1a, 0xd8, 0x27, 0x2d, 0xb8, 0x27, 0x72, 0x6a, 0xb8, + 0xfc, 0x57, 0x59, 0x6a, 0x1c, 0xac, 0xa5, 0x35, 0x93, 0x2a, 0x65, 0xfb, 0xce, 0x71, 0x51, 0x46, + 0xae, 0xe6, 0x65, 0xe5, 0x60, 0xe6, 0x2b, 0x94, 0xf5, 0x64, 0x2d, 0x1b, 0x4a, 0x04, 0xb0, 0xf8, + 0x58, 0x3b, 0x47, 0xa3, 0x51, 0xe1, 0x38, 0xf2, 0x99, 0x43, 0x05, 0x0f, 0xc4, 0x7a, 0x3a, 0xd6, + 0x6d, 0xc0, 0x53, 0x77, 0xee, 0x1d, 0xb3, 0x91, 0x7e, 0x4a, 0x97, 0x73, 0xda, 0x9f, 0x8c, 0x0e, + 0xed, 0xc9, 0x18, 0x7e, 0x26, 0x47, 0x36, 0xac, 0x6e, 0xfb, 0x4d, 0xc8, 0xc1, 0x60, 0x33, 0x5c, + 0xa6, 0x81, 0x57, 0x16, 0x06, 0x7c, 0x50, 0x43, 0xe8, 0x9f, 0x19, 0x68, 0x50, 0x7e, 0x37, 0x65, + 0x05, 0x07, 0xf3, 0x28, 0xce, 0xa6, 0x29, 0x83, 0xb2, 0x25, 0xfa, 0xf2, 0xb4, 0x11, 0xda, 0x8c, + 0xfe, 0xc8, 0x1e, 0x2f, 0x52, 0x83, 0x4d, 0x81, 0x4e, 0xf6, 0x83, 0x4e, 0x76, 0x40, 0xa5, 0x66, + 0x20, 0xc3, 0x79, 0x45, 0xdd, 0xc9, 0x4f, 0x47, 0x23, 0x2d, 0x7d, 0x16, 0xd5, 0x94, 0x37, 0x7c, + 0xa6, 0x3d, 0x28, 0x88, 0x65, 0xf2, 0x5b, 0x84, 0xec, 0xa1, 0x94, 0xa2, 0x36, 0x06, 0x13, 0x80, + 0x83, 0xcc, 0x71, 0x19, 0x46, 0x60, 0x21, 0x9b, 0x1a, 0x59, 0x2a, 0xb3, 0xa9, 0x1a, 0xd2, 0xc8, + 0x05, 0x83, 0x96, 0x67, 0x9f, 0x6a, 0x8f, 0x16, 0xde, 0xd8, 0x3d, 0xae, 0xab, 0xf6, 0xf4, 0xcc, + 0x9e, 0x8c, 0xce, 0xec, 0xf1, 0xd9, 0x69, 0x87, 0x66, 0xe7, 0x4b, 0x47, 0x76, 0x5a, 0x80, 0x13, + 0xbe, 0x56, 0x18, 0x77, 0xaa, 0xe6, 0xd3, 0xc5, 0x62, 0xb1, 0x3b, 0xaa, 0xec, 0x77, 0x7c, 0x6c, + 0x9b, 0x1f, 0x45, 0xa5, 0x42, 0x85, 0x34, 0x24, 0x00, 0xf3, 0x9c, 0xb0, 0x4c, 0xbc, 0xd8, 0x7b, + 0xe5, 0x99, 0x09, 0xba, 0xcc, 0xa7, 0x1e, 0x5f, 0xa1, 0xee, 0x64, 0x01, 0x90, 0x4f, 0xd3, 0x11, + 0xc1, 0x82, 0x0b, 0x4d, 0x0e, 0x19, 0x11, 0x49, 0x65, 0x64, 0xe3, 0xdf, 0xe1, 0xe8, 0x78, 0x60, + 0x92, 0x49, 0xd1, 0xa8, 0x0c, 0x98, 0xdb, 0x4d, 0x96, 0x59, 0xb3, 0x10, 0xba, 0x3f, 0xe7, 0x54, + 0xea, 0x4a, 0x8f, 0xd5, 0x64, 0x6b, 0x94, 0x8b, 0xf9, 0xe9, 0xe9, 0xd9, 0x78, 0xd1, 0x1c, 0x94, + 0x04, 0xc7, 0xcf, 0x0e, 0xed, 0xf1, 0x64, 0x6c, 0x1f, 0x8e, 0x8d, 0x54, 0x0d, 0x44, 0x5a, 0x7b, + 0x9a, 0xd4, 0x89, 0x22, 0xb5, 0x5f, 0x85, 0xde, 0xc9, 0x19, 0x14, 0xa7, 0x2e, 0x2d, 0x8e, 0x8f, + 0xec, 0xf1, 0xf1, 0x33, 0xfb, 0xe8, 0xe4, 0x4b, 0x94, 0x28, 0x5f, 0xd7, 0x95, 0x38, 0x02, 0x0d, + 0x8e, 0xb1, 0x51, 0x71, 0x0e, 0xe1, 0x57, 0x5d, 0x93, 0xe3, 0x81, 0x3d, 0x22, 0x90, 0x77, 0xc9, + 0x09, 0xbe, 0x9d, 0x6c, 0xbd, 0x95, 0x7a, 0x8e, 0x3c, 0x9d, 0x16, 0x1e, 0xc2, 0x7a, 0x52, 0x30, + 0x39, 0xa0, 0x12, 0xff, 0xf0, 0x31, 0xe2, 0x2f, 0xe8, 0x62, 0xf4, 0xec, 0xac, 0xd3, 0x89, 0x46, + 0xf6, 0xe4, 0x08, 0x02, 0xed, 0xf0, 0xb4, 0x55, 0x7e, 0x98, 0x8a, 0xab, 0x81, 0xd8, 0xc4, 0xac, + 0x0a, 0xd5, 0x29, 0x0e, 0x91, 0xc9, 0x81, 0xfa, 0x90, 0x1c, 0xcd, 0x61, 0xf1, 0xef, 0x1c, 0x3f, + 0x86, 0x9f, 0xa3, 0xc9, 0xd9, 0x19, 0x1b, 0x77, 0xf0, 0x73, 0x72, 0x02, 0xd6, 0xc0, 0x9c, 0xd4, + 0xea, 0xd3, 0x4a, 0x2b, 0x26, 0x72, 0xda, 0xa3, 0x11, 0x03, 0x66, 0x6f, 0x94, 0x6c, 0xc5, 0xa2, + 0x29, 0x8b, 0xc8, 0xff, 0xa3, 0x3c, 0x77, 0x32, 0x3f, 0x71, 0xe7, 0xa3, 0x16, 0xcf, 0x3d, 0x02, + 0xc7, 0x1d, 0x3d, 0xb3, 0xc7, 0xa7, 0x27, 0x9d, 0x9e, 0xab, 0xdd, 0x69, 0xdb, 0x97, 0xb4, 0x61, + 0x8d, 0xb3, 0x45, 0x3b, 0x13, 0x0e, 0x55, 0x4a, 0xc3, 0x7d, 0x10, 0xb9, 0xfd, 0x41, 0x2e, 0x0e, + 0xf4, 0xad, 0x90, 0x39, 0xf7, 0xd6, 0x44, 0x6f, 0x23, 0x5b, 0xe6, 0xde, 0x83, 0x45, 0xe4, 0xb4, + 0x99, 0xd5, 0x12, 0x0c, 0x67, 0xde, 0x91, 0x2b, 0xaf, 0x7e, 0x78, 0xc1, 0x3d, 0xe9, 0xb9, 0x21, + 0xcd, 0xb2, 0x99, 0x85, 0x97, 0x37, 0x28, 0x24, 0xc6, 0x94, 0x44, 0x0f, 0xb2, 0xc2, 0x10, 0x2c, + 0x7a, 0x04, 0x4b, 0x99, 0x99, 0xaa, 0x67, 0xa2, 0x17, 0x90, 0x5a, 0x15, 0x28, 0x31, 0x05, 0x40, + 0xdf, 0xbd, 0x2f, 0x29, 0xd7, 0xd7, 0x13, 0x96, 0x01, 0xc6, 0x05, 0x22, 0x0c, 0x5a, 0x97, 0xc8, + 0x26, 0xc1, 0x7b, 0x1f, 0x44, 0xdf, 0xfb, 0x80, 0x2e, 0x76, 0x38, 0x1c, 0x5e, 0x1c, 0x00, 0x2a, + 0xbc, 0xfb, 0x11, 0xf3, 0x72, 0xbf, 0xa7, 0x46, 0xdb, 0x80, 0x1b, 0x1a, 0xa5, 0x85, 0xac, 0xcb, + 0xde, 0x0d, 0x4f, 0xd3, 0xb5, 0xdd, 0xc4, 0x19, 0x33, 0xe6, 0x65, 0xe4, 0x0f, 0xf4, 0x9e, 0xde, + 0x48, 0x6c, 0x4f, 0x34, 0xfe, 0x8b, 0x83, 0x76, 0xfc, 0xa5, 0x16, 0x2c, 0xd2, 0xd3, 0x24, 0xea, + 0xf5, 0x66, 0x2e, 0x9b, 0x3b, 0x14, 0x38, 0x0f, 0x0d, 0x08, 0x16, 0x12, 0x52, 0x55, 0x60, 0x08, + 0x00, 0xa2, 0x2b, 0x12, 0x09, 0x97, 0x55, 0x6d, 0x07, 0x06, 0xc9, 0x45, 0x18, 0x18, 0xa8, 0x5a, + 0x15, 0x22, 0xf5, 0x22, 0x84, 0xb8, 0x29, 0xf1, 0x53, 0xb6, 0x98, 0x59, 0x07, 0xd6, 0xe5, 0x6b, + 0x1e, 0xb1, 0x8b, 0x03, 0x8a, 0x9b, 0x5e, 0xf7, 0xcb, 0xd2, 0x56, 0xd0, 0x16, 0x10, 0xd5, 0x06, + 0x90, 0x46, 0xe9, 0xb7, 0x08, 0x2c, 0x26, 0x43, 0x90, 0x22, 0x4f, 0x71, 0x91, 0x75, 0xa5, 0x2e, + 0xec, 0xe0, 0x55, 0xa1, 0x17, 0xfc, 0x61, 0x66, 0x8d, 0x20, 0xa3, 0x4f, 0xf0, 0x9f, 0x75, 0x80, + 0x1a, 0x08, 0x83, 0xcf, 0x67, 0xe9, 0x69, 0x69, 0xc8, 0x46, 0x61, 0xb4, 0x94, 0xf1, 0x93, 0xd0, + 0xba, 0x54, 0xdc, 0x22, 0x72, 0xf8, 0x9d, 0xe3, 0x6d, 0x26, 0xad, 0x71, 0xd4, 0x32, 0x4e, 0x32, + 0x47, 0xb9, 0xa5, 0x34, 0xd2, 0x9f, 0x4c, 0x39, 0x24, 0x55, 0xba, 0x25, 0x65, 0x79, 0x22, 0xd0, + 0x09, 0x12, 0xec, 0xfc, 0x90, 0x95, 0xa4, 0x54, 0xbc, 0x69, 0x09, 0x40, 0xb5, 0xb7, 0x3e, 0x8d, + 0xef, 0xc8, 0x9a, 0xe7, 0xe4, 0x3f, 0xff, 0xed, 0x3f, 0x08, 0xac, 0x69, 0x48, 0x10, 0x67, 0x82, + 0x86, 0x21, 0x1e, 0xc3, 0x08, 0x9f, 0x49, 0xaf, 0x88, 0xb4, 0x53, 0xdc, 0xf0, 0x85, 0x58, 0x41, + 0xcb, 0x3e, 0x24, 0xff, 0xf5, 0xef, 0x7f, 0xff, 0xdb, 0xc5, 0x41, 0x82, 0x58, 0x2f, 0x7b, 0x7f, + 0x01, 0x68, 0x9f, 0x82, 0xf3, 0xb0, 0x18, 0x5b, 0x71, 0x4f, 0xc2, 0x95, 0xa7, 0x68, 0xef, 0xb8, + 0x07, 0x00, 0x6f, 0x62, 0x82, 0x67, 0x68, 0xe4, 0x47, 0x36, 0x97, 0x5d, 0xfb, 0x02, 0x3a, 0x7e, + 0x49, 0x76, 0x05, 0x8a, 0x27, 0x73, 0x46, 0x10, 0x92, 0x80, 0x5d, 0x60, 0xe9, 0x89, 0xe3, 0x29, + 0x5e, 0x97, 0x82, 0xa5, 0x73, 0x36, 0x04, 0x97, 0xd6, 0x84, 0xbe, 0x05, 0x16, 0xb2, 0x7c, 0xb9, + 0x64, 0x19, 0xee, 0x10, 0x64, 0x84, 0xc6, 0xb8, 0xeb, 0x03, 0x24, 0x60, 0xbd, 0x07, 0x8e, 0x42, + 0x96, 0x1c, 0x11, 0x44, 0x6b, 0xd4, 0x7a, 0x4f, 0xa9, 0xdd, 0x17, 0x22, 0xc9, 0xa6, 0x07, 0x07, + 0xcb, 0x40, 0xf8, 0xf9, 0x1c, 0x52, 0x72, 0x74, 0x70, 0xf3, 0x82, 0x7e, 0xe4, 0xb1, 0xfb, 0x2b, + 0xbd, 0x3b, 0xf0, 0x2b, 0xd9, 0xac, 0xcb, 0xef, 0xe4, 0x14, 0x92, 0xa4, 0xfc, 0x23, 0x73, 0x05, + 0x5a, 0x43, 0xd1, 0x35, 0x71, 0x65, 0xcc, 0x50, 0x3b, 0x83, 0x6e, 0x0d, 0xd8, 0xcf, 0x8a, 0x0b, + 0xc8, 0x9a, 0x96, 0x52, 0xe2, 0x5b, 0x26, 0xfe, 0x31, 0x53, 0xa7, 0xab, 0x28, 0x85, 0x3c, 0xe4, + 0x95, 0x7a, 0x50, 0xf7, 0x54, 0xc8, 0xb5, 0x96, 0x11, 0xd4, 0x43, 0x89, 0x82, 0x26, 0x7c, 0x41, + 0xc6, 0xa4, 0x0f, 0x44, 0x07, 0xe4, 0x5f, 0xf4, 0x2e, 0xba, 0x0d, 0xba, 0x74, 0x69, 0x0e, 0x33, + 0xa5, 0xba, 0x8d, 0x76, 0x31, 0x9c, 0xc1, 0x30, 0x41, 0x2c, 0x6d, 0x23, 0x91, 0xe3, 0x59, 0x6d, + 0x5d, 0xbb, 0x1f, 0x40, 0x15, 0x60, 0x43, 0x30, 0xbd, 0x41, 0xbf, 0x48, 0x79, 0x24, 0xe7, 0x4b, + 0x16, 0xa4, 0xba, 0xdd, 0x30, 0x70, 0xef, 0x88, 0x3e, 0xbf, 0x1e, 0x2a, 0x50, 0xb5, 0x2a, 0x53, + 0x8e, 0x3c, 0x17, 0x31, 0x22, 0xb7, 0x20, 0xad, 0xca, 0xa9, 0xe0, 0xee, 0xf5, 0x4b, 0x18, 0x0d, + 0x37, 0x84, 0x75, 0x9b, 0x13, 0xd2, 0x39, 0x03, 0xdf, 0xff, 0x8e, 0x93, 0x17, 0x90, 0x6e, 0xb5, + 0xc2, 0x15, 0x42, 0x8c, 0x31, 0x8d, 0xba, 0x1d, 0x73, 0xed, 0x24, 0xba, 0x0b, 0xaf, 0xe4, 0x53, + 0x62, 0xed, 0x95, 0x68, 0xcb, 0xb8, 0xda, 0x0a, 0xaf, 0xda, 0x45, 0x8c, 0x7d, 0x76, 0xed, 0xed, + 0x1a, 0x76, 0xaf, 0x5d, 0xaf, 0x71, 0x6d, 0xbb, 0xd7, 0x64, 0x84, 0xc7, 0x95, 0x96, 0x9b, 0x3a, + 0x6d, 0x08, 0xde, 0xab, 0x74, 0x5a, 0x9d, 0xf5, 0x77, 0x49, 0xfe, 0x1e, 0xb2, 0x0c, 0xc1, 0x39, + 0x4d, 0x9d, 0x56, 0xee, 0xdc, 0x25, 0xfd, 0xe4, 0x6b, 0x7a, 0xf5, 0x15, 0x8f, 0x97, 0x78, 0x04, + 0x13, 0xca, 0x3d, 0xbd, 0xec, 0x09, 0xb9, 0xf5, 0xf5, 0xd5, 0x05, 0x02, 0xce, 0x19, 0xf3, 0x95, + 0x3c, 0x73, 0x5e, 0xa3, 0xc3, 0x83, 0xcb, 0x0e, 0xb5, 0xa5, 0xf6, 0x5a, 0xfd, 0xb3, 0xfd, 0xe9, + 0x11, 0x96, 0x2f, 0xaf, 0xd0, 0xec, 0xc8, 0x47, 0xb6, 0x6a, 0x36, 0x5e, 0xda, 0xec, 0x5d, 0xc8, + 0xde, 0xcd, 0x38, 0x42, 0xa3, 0xa3, 0x26, 0xaa, 0xf9, 0xc0, 0x9c, 0x3b, 0x81, 0xe4, 0x7b, 0x48, + 0x76, 0xda, 0xfb, 0x96, 0x3c, 0x0d, 0xdf, 0xca, 0x94, 0x4c, 0x22, 0xcf, 0xf4, 0xaf, 0xa4, 0x6a, + 0x20, 0xb1, 0x48, 0x6b, 0x1e, 0x2f, 0x64, 0xe7, 0x88, 0x75, 0xad, 0x9d, 0x89, 0xc3, 0xff, 0x51, + 0x26, 0xe4, 0x36, 0x5d, 0x93, 0x85, 0xed, 0xa2, 0xa2, 0x2a, 0x6b, 0x04, 0x48, 0xb0, 0xec, 0xdc, + 0x98, 0xa3, 0x53, 0xd2, 0x0f, 0xf0, 0x2c, 0xd7, 0x1d, 0x0e, 0x34, 0x78, 0xef, 0x42, 0xee, 0x09, + 0x19, 0x78, 0xac, 0x54, 0x35, 0x06, 0xe0, 0x49, 0x4b, 0x51, 0xb1, 0x6a, 0x49, 0x6b, 0xed, 0x9c, + 0xc9, 0x6e, 0xeb, 0xa2, 0x83, 0x93, 0x3f, 0x5d, 0x5d, 0x11, 0x75, 0x14, 0x8b, 0x87, 0xc6, 0x9a, + 0x09, 0xcd, 0x43, 0xef, 0x37, 0x32, 0xb1, 0x73, 0xba, 0xfb, 0x3b, 0xd9, 0xe5, 0xc7, 0x60, 0x11, + 0x7c, 0x96, 0x55, 0x6e, 0xde, 0xbc, 0xfc, 0x42, 0x0d, 0x34, 0xce, 0x2a, 0x1f, 0x69, 0x82, 0x6b, + 0x7d, 0x00, 0xfa, 0x95, 0x48, 0x97, 0xe7, 0xa9, 0xbf, 0x57, 0x34, 0x60, 0x22, 0xfb, 0x1c, 0xb5, + 0xff, 0xa8, 0x6a, 0xc0, 0xf7, 0xf2, 0x3c, 0xe4, 0x4b, 0x3d, 0x70, 0xf7, 0xe0, 0xfd, 0x91, 0x56, + 0x28, 0xeb, 0xce, 0x4b, 0x75, 0xe2, 0xfe, 0x55, 0x18, 0xd9, 0x3e, 0xc5, 0x7f, 0x24, 0x2f, 0x57, + 0xd5, 0xc9, 0x3a, 0xb9, 0xad, 0x0e, 0xec, 0xbf, 0x80, 0xa5, 0x5e, 0xc5, 0xd3, 0xfe, 0xcb, 0x00, + 0x8f, 0x33, 0x59, 0xaf, 0xce, 0xe1, 0xb7, 0xf2, 0xf0, 0xbf, 0xc9, 0xdc, 0x97, 0xf3, 0xd6, 0xbc, + 0x52, 0xd0, 0x55, 0xfc, 0xcb, 0xca, 0x64, 0x1c, 0x90, 0xd4, 0x76, 0x0e, 0x88, 0x8f, 0xeb, 0xbb, + 0xa9, 0x19, 0x39, 0x32, 0x4b, 0x29, 0xb5, 0x32, 0xa8, 0xf8, 0xc2, 0x3d, 0x68, 0x5c, 0x9e, 0x1e, + 0x91, 0x6a, 0x73, 0x9b, 0x6c, 0xad, 0xe2, 0x0d, 0xae, 0xda, 0xe8, 0x71, 0x15, 0x23, 0x8d, 0x36, + 0x64, 0xeb, 0x3a, 0x67, 0x57, 0x35, 0x7e, 0x2e, 0x53, 0x24, 0xd1, 0xe1, 0xd2, 0x68, 0x47, 0x7a, + 0xbf, 0x4b, 0xe0, 0xbe, 0xfb, 0xe3, 0xed, 0x6d, 0x19, 0xb7, 0xaa, 0x17, 0x78, 0x4c, 0xd2, 0x94, + 0x77, 0x72, 0x8c, 0xf5, 0x13, 0xbd, 0x3c, 0xc0, 0xa7, 0x9e, 0x81, 0xac, 0xcd, 0xc3, 0xff, 0xc5, + 0x41, 0x60, 0xc1, 0xf2, 0xe6, 0xba, 0xa4, 0x24, 0xdb, 0x8e, 0xdf, 0x1a, 0x66, 0xf5, 0x6b, 0x41, + 0x8f, 0x0c, 0xae, 0x1f, 0xb2, 0x2f, 0x0e, 0xee, 0xea, 0x02, 0xd1, 0xff, 0x6e, 0x8a, 0x6f, 0x5e, + 0x49, 0x7a, 0x2c, 0x6d, 0x9e, 0x8a, 0xaf, 0x42, 0x17, 0xaf, 0x54, 0xed, 0xb4, 0xfb, 0x95, 0xff, + 0x7c, 0x13, 0xcf, 0xb3, 0xe4, 0xdc, 0x74, 0x91, 0xfb, 0xa2, 0xb5, 0x3b, 0x44, 0x4f, 0x1f, 0x1b, + 0xa2, 0x3b, 0xe1, 0xa9, 0x59, 0xae, 0x7b, 0x74, 0x2d, 0x26, 0x9b, 0x77, 0xde, 0x3a, 0xd7, 0x45, + 0xb8, 0x5a, 0xaf, 0x3a, 0xca, 0xad, 0x90, 0xac, 0xb5, 0xc7, 0x46, 0x10, 0x28, 0xb8, 0x90, 0xab, + 0x00, 0x08, 0xd8, 0x3b, 0x84, 0xf5, 0x36, 0xb0, 0x97, 0xa4, 0xce, 0x78, 0x44, 0x60, 0x55, 0x2a, + 0xcf, 0x66, 0xd4, 0x85, 0x07, 0x25, 0x52, 0x0a, 0x0a, 0x45, 0x4e, 0x41, 0x56, 0xfc, 0x3a, 0x6e, + 0x04, 0xaa, 0xce, 0x82, 0xb5, 0xab, 0x90, 0xed, 0xdb, 0x5e, 0xf2, 0xe0, 0xcf, 0x82, 0x8c, 0xa1, + 0x6c, 0x91, 0x90, 0x26, 0x94, 0xbc, 0x67, 0x79, 0xd9, 0x7b, 0x4e, 0xb2, 0x20, 0xc2, 0xe3, 0x5e, + 0x39, 0x11, 0x96, 0xbb, 0xc2, 0x97, 0x3c, 0xc8, 0xc5, 0x2a, 0x25, 0xf2, 0x74, 0x89, 0x04, 0xd0, + 0xce, 0x57, 0xc1, 0x5a, 0xca, 0x44, 0xe7, 0x19, 0x0f, 0x73, 0x50, 0x7e, 0x10, 0x43, 0xf2, 0x75, + 0xd6, 0xce, 0x48, 0xcd, 0x87, 0xcf, 0x9d, 0xad, 0x1c, 0x12, 0xa5, 0xce, 0x91, 0xb5, 0xb5, 0x9b, + 0xb4, 0x02, 0x2d, 0xf8, 0xf0, 0x83, 0x7b, 0x47, 0x8e, 0xde, 0x3a, 0xea, 0xde, 0x35, 0xaa, 0x27, + 0x81, 0xdf, 0xa6, 0x5c, 0xd0, 0xe7, 0x32, 0x65, 0x2c, 0xde, 0xa3, 0x51, 0x73, 0x9f, 0xf4, 0x73, + 0x75, 0x5a, 0xbf, 0xbd, 0x7a, 0xd9, 0xab, 0x29, 0xeb, 0xff, 0x82, 0xae, 0x1a, 0x1f, 0xb8, 0x9c, + 0xe3, 0xde, 0x5a, 0x6e, 0xe3, 0xe2, 0x7f, 0xfa, 0xfb, 0x6f, 0x84, 0x2b, 0x5b, 0xb0, 0x04, 0x38, + 0x00, 0x00 }; \ No newline at end of file From 97d04f601982999a943d2dce5dfaad9cd6bd6715 Mon Sep 17 00:00:00 2001 From: Sascha Bajonczak <18240989+SBajonczak@users.noreply.github.com> Date: Fri, 6 Aug 2021 15:02:33 +0200 Subject: [PATCH 35/99] Update the readme for the new webinterface Added small description about the interface. --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d8067f..86fdd0d 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,15 @@ The following table will give you more insights about the settings. |mqtt|password|The password when authentication is configured.| -## Upload_Configuration +## Modify Configuration +When you activated the maintenance mode, you will be able to connect to the device. +Since you have been connected, you can navigate to the device IP an it will show you the configuration Interface. + +![image](https://user-images.githubusercontent.com/18240989/128514097-10bd2ed1-f1f3-416f-a3c6-4e475e7a31b6.png) + + + +## Upload Predefined Configuration After you modified the configuration to your setting, you can upload this to your device. ```bash make upload-config From 56efae4707fa4c3c7123e07b6ca3f8dc33c4ee09 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 6 Aug 2021 22:32:13 +0200 Subject: [PATCH 36/99] :pencil: extending docs and setting static ip with custom ap name --- README.md | 10 ++++++++++ platformio.ini | 1 + src/ConfigWebserver.cpp | 14 ++++++++------ src/main.cpp | 4 ++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5d8067f..033b8f5 100644 --- a/README.md +++ b/README.md @@ -222,3 +222,13 @@ For future Releases I planning to improve some thing and extend it with the foll Feel free to suggest me more Features. + +# FAQ + +# My device does not start the AP mode +In this case you must erase the complete flash memmory of your device. +You can do it in platform io with: + +``` +pio run --target erase +``` \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index d68fb0b..d521ece 100644 --- a/platformio.ini +++ b/platformio.ini @@ -45,3 +45,4 @@ monitor_speed = 115200 lib_compat_mode = strict build_type = debug +board_build.flash_mode = qio \ No newline at end of file diff --git a/src/ConfigWebserver.cpp b/src/ConfigWebserver.cpp index df50584..cb42a8d 100644 --- a/src/ConfigWebserver.cpp +++ b/src/ConfigWebserver.cpp @@ -31,14 +31,16 @@ ConfigWebserver::~ConfigWebserver() {} void ConfigWebserver::Serve() { + const IPAddress apIP = IPAddress(192, 168, 4, 1); + static const byte DNS_PORT = 53; + DNSServer dnsServer; + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); WiFi.softAP(AP_SSIDNAME, AP_PASSWORD); - if (WiFi.waitForConnectResult() != WL_CONNECTED) - { - Serial.printf("WiFi Failed!\n"); - return; - } + dnsServer.start(DNS_PORT, "*", apIP); + Serial.print("IP Address: "); - Serial.println(WiFi.localIP()); + Serial.println(WiFi.softAPIP()); DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Origin"), "*"); DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Methods"), "*"); DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); diff --git a/src/main.cpp b/src/main.cpp index c121247..e80585a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -134,8 +134,8 @@ void setup() // Get the settings ConfigurationManager::getInstance()->ReadSettings(); - Homie.disableResetTrigger(); - Homie.disableLedFeedback(); // collides with Serial on ESP07 + // Homie.disableResetTrigger(); + // Homie.disableLedFeedback(); // collides with Serial on ESP07 switch (devicemanager.GetOperatingState()) { From e65c6fb3277e1ed9cb2e0b64157b238ad7b555db Mon Sep 17 00:00:00 2001 From: Sascha Bajonczak <18240989+SBajonczak@users.noreply.github.com> Date: Sat, 7 Aug 2021 07:22:58 +0200 Subject: [PATCH 37/99] Added code of conduct --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..9139af7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +Xbeejayx@hotmail.com . +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From a014a2211331edd0d2b3aa63ad86cee128560472 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 9 Aug 2021 10:43:56 +0200 Subject: [PATCH 38/99] :arrow_up: Added dependabot configuration --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..03ec545 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "nuget" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From bb5041c8ae0344d71634c5c8fa5f74879c4ca8f6 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 9 Aug 2021 21:20:24 +0200 Subject: [PATCH 39/99] :construction: Added MqttWrapper for communicating with the Messagebus # --- src/MqttWarpper.h | 19 +++++++++++++++++++ src/MqttWrapper.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/MqttWarpper.h create mode 100644 src/MqttWrapper.cpp diff --git a/src/MqttWarpper.h b/src/MqttWarpper.h new file mode 100644 index 0000000..8235015 --- /dev/null +++ b/src/MqttWarpper.h @@ -0,0 +1,19 @@ +#ifndef MqttWrapper_H +#define MqttWrapper_H +#include + +class MqttWrapper +{ + + const int delayBetweenSamplesInSeconds = 3; + const int amountWeightSamples = 10; + +public: + MqttWrapper(char *Topic); + ~MqttWrapper(); + uint16_t Send(char *message); +private: + char *Topic; +}; + +#endif \ No newline at end of file diff --git a/src/MqttWrapper.cpp b/src/MqttWrapper.cpp new file mode 100644 index 0000000..43d1b63 --- /dev/null +++ b/src/MqttWrapper.cpp @@ -0,0 +1,38 @@ +#include + +#include "MqttWarpper.h" +#include "ConfigurationManager.h" + +AsyncMqttClient mqttClient; + +MqttWrapper::MqttWrapper(char *Topic) +{ + if (Topic) + { + this->Topic = Topic; + } + else + { + this->Topic = "/"; + } + mqttClient.setServer(ConfigurationManager::getInstance()->GetMqttServer().c_str(), ConfigurationManager::getInstance()->GetMqttPort()); + if ( + ConfigurationManager::getInstance()->GetMqttUser().length() > 0 && + ConfigurationManager::getInstance()->GetMqttPassword().length() > 0) + { + mqttClient.setCredentials( + ConfigurationManager::getInstance()->GetMqttUser().c_str(), + ConfigurationManager::getInstance()->GetMqttPassword().c_str()); + } + mqttClient.connect(); +} + +MqttWrapper::~MqttWrapper() +{ + mqttClient.disconnect(); +} + +uint16_t MqttWrapper::Send(char *message) +{ + return mqttClient.publish(this->Topic, 1, true, message); +} \ No newline at end of file From 749ad733416cede735c138bfa84dd70565130dfe Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 9 Aug 2021 21:20:37 +0200 Subject: [PATCH 40/99] :pencil2: Fixed typo --- src/{MqttWarpper.h => MqttWrapper.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{MqttWarpper.h => MqttWrapper.h} (100%) diff --git a/src/MqttWarpper.h b/src/MqttWrapper.h similarity index 100% rename from src/MqttWarpper.h rename to src/MqttWrapper.h From 600a5b3f80a769e3eed9b9826b146061e40844fd Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Thu, 12 Aug 2021 22:11:31 +0200 Subject: [PATCH 41/99] :construction: Added mqttclient and Message class --- .vscode/settings.json | 40 ++++++++++++++++++- src/DeviceManager.cpp | 15 +++++-- src/DeviceManager.h | 2 +- src/MqttWrapper.cpp | 49 ++++++++++++++++------- src/MqttWrapper.h | 16 +++++--- src/main.cpp | 93 ++++++++++++++++++++++++------------------- src/message.cpp | 7 ++++ src/message.h | 16 ++++++++ 8 files changed, 172 insertions(+), 66 deletions(-) create mode 100644 src/message.cpp create mode 100644 src/message.h diff --git a/.vscode/settings.json b/.vscode/settings.json index ce16329..e5c4cd2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,44 @@ }, "files.associations": { "functional": "cpp", - "*.tcc": "cpp" + "*.tcc": "cpp", + "array": "cpp", + "atomic": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "numeric": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "regex": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "typeinfo": "cpp" } } \ No newline at end of file diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index dfcd201..76977ad 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -1,11 +1,8 @@ #include - - #include "TareUtility.h" #include "ConfigurationManager.h" - void DeviceManager::setup() {} DeviceManager::DeviceManager() @@ -87,7 +84,19 @@ byte DeviceManager::GetCurrentState() { return this->CurrentState; } +void DeviceManager::ConnectWifi() +{ + WiFi.mode(WIFI_STA); + WiFi.begin(ConfigurationManager::getInstance()->GetWifiSsid(), + ConfigurationManager::getInstance()->GetWifiPassword()); + while (WiFi.status() != WL_CONNECTED) + { + delay(500); + Serial.print("."); + } + Serial.println("Connected"); +} OperatingStates DeviceManager::GetOperatingState() { int result = digitalRead(GPIO_MAINTENANCE_PIN); diff --git a/src/DeviceManager.h b/src/DeviceManager.h index 37faf04..b67cc76 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -49,7 +49,7 @@ class DeviceManager byte GetCurrentState(); // Get the actual Operating State OperatingStates GetOperatingState(); - + void ConnectWifi(); private: OperatingStates operatingState; diff --git a/src/MqttWrapper.cpp b/src/MqttWrapper.cpp index 43d1b63..0501bc9 100644 --- a/src/MqttWrapper.cpp +++ b/src/MqttWrapper.cpp @@ -1,38 +1,59 @@ #include -#include "MqttWarpper.h" +#include "MqttWrapper.h" #include "ConfigurationManager.h" +#include "message.h" AsyncMqttClient mqttClient; -MqttWrapper::MqttWrapper(char *Topic) +std::vector MqttWrapper::messages; + +void MqttWrapper::onMqttConnect() { - if (Topic) - { - this->Topic = Topic; - } - else + // this->connected = true; + Serial.println("Connected, sending message"); + for (Message *msg : MqttWrapper::messages) { - this->Topic = "/"; + + Serial.println(msg->message); + Serial.println("_____"); + mqttClient.publish(msg->Topic, 0, true, msg->message); } - mqttClient.setServer(ConfigurationManager::getInstance()->GetMqttServer().c_str(), ConfigurationManager::getInstance()->GetMqttPort()); + mqttClient.disconnect(); +} + +void MqttWrapper::Queue(char *Topic, char *msg) +{ + MqttWrapper::messages.push_back(new Message(Topic, msg)); +} + +void MqttWrapper::Send() +{ + mqttClient.setServer("192.168.178.201", ConfigurationManager::getInstance()->GetMqttPort()); if ( ConfigurationManager::getInstance()->GetMqttUser().length() > 0 && ConfigurationManager::getInstance()->GetMqttPassword().length() > 0) { + mqttClient.setCredentials( ConfigurationManager::getInstance()->GetMqttUser().c_str(), ConfigurationManager::getInstance()->GetMqttPassword().c_str()); } + mqttClient.onConnect(std::bind(&MqttWrapper::onMqttConnect, this)); mqttClient.connect(); + + for (Message *msg : MqttWrapper::messages) + { + + Serial.println(msg->message); + Serial.println("_____"); + mqttClient.publish(msg->Topic, 0, true, msg->message); + } } -MqttWrapper::~MqttWrapper() +MqttWrapper::MqttWrapper() { - mqttClient.disconnect(); } - -uint16_t MqttWrapper::Send(char *message) +MqttWrapper::~MqttWrapper() { - return mqttClient.publish(this->Topic, 1, true, message); } \ No newline at end of file diff --git a/src/MqttWrapper.h b/src/MqttWrapper.h index 8235015..b7101c4 100644 --- a/src/MqttWrapper.h +++ b/src/MqttWrapper.h @@ -1,19 +1,23 @@ #ifndef MqttWrapper_H #define MqttWrapper_H #include +#include "message.h" class MqttWrapper { - const int delayBetweenSamplesInSeconds = 3; - const int amountWeightSamples = 10; - public: - MqttWrapper(char *Topic); + MqttWrapper(); ~MqttWrapper(); - uint16_t Send(char *message); + void onMqttConnect(); + void Queue(char* Topic, char* msg); + void Send(); + void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); private: - char *Topic; + char* message; + char* Topic; + bool connected; + static std::vector messages; }; #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e80585a..a188653 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,7 @@ // #include "ConfigurationManager.h" #include "TareUtility.h" #include "ConfigWebserver.h" +#include "MqttWrapper.h" #define FW_NAME "Development" #define FW_VERSION "0.10.0" @@ -38,6 +39,7 @@ TemperatureProcessor temperatures(GPIO_ONEWIRE_BUS); BatteryProcessor batteryProcessor; MeasureHandler measures; DeviceManager devicemanager; +ConfigWebserver configServer; void setupHandler() { @@ -140,11 +142,20 @@ void setup() switch (devicemanager.GetOperatingState()) { case OperatingStates::Maintenance: - ConfigWebserver configServer; + Serial.println("Maintenance mode"); configServer.Serve(); return; + break; + case OperatingStates::Operating: + Serial.println("Normal mode"); + break; } + devicemanager.ConnectWifi(); + MqttWrapper mqtt; + mqtt.Queue("/homie/msg", "{'a':122,'b':333}"); + mqtt.Send(); + WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption Homie.getLogger() << endl; Homie.getLogger() << "///////////////////////////////////////////" << endl; @@ -157,46 +168,46 @@ void setup() Homie.getLogger() << "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; Homie.getLogger() << "///////////////////////////////////////////" << endl; - Homie.getLogger() << "INFO: Device in normal mode." << endl; - - if (devicemanager.IsColdstart()) - { - Homie.getLogger() << "DEBUG: Is Coldstart set new initial State" << endl; - devicemanager.SetStateAndMagicNumberToMemory(); - devicemanager.SetStateToMemory(STATE_COLDSTART); - } - devicemanager.ReadStateFromMemory(); - switch (devicemanager.GetCurrentState()) - { - default: // Catch all unknown states - case STATE_SLEEP_WAKE: - // first run after power on - initializes - case STATE_COLDSTART: - // Prepare to setup the WIFI - - WiFi.forceSleepWake(); - WiFi.mode(WIFI_STA); - // one more sleep required to to wake with wifi on - devicemanager.SetStateToMemory(STATE_CONNECT_WIFI); - devicemanager.GotToSleep(WAKE_RFCAL); - - break; - case STATE_CONNECT_WIFI: - Homie.onEvent(onHomieEvent); - - temperatures.setup(); - - Homie.getLogger() << "DEBUG: Turn on WIFI: " << millis() / 1000 << endl; - WiFi.forceSleepWake(); - delay(500); - wifi_set_sleep_type(MODEM_SLEEP_T); - Homie_setFirmware(FW_NAME, FW_VERSION); - Homie.setSetupFunction(setupHandler).setLoopFunction(loopHandler); - measures.AdvertiseNodes(); - Homie.getLogger() << "DEBUG: Before setup(): " << millis() / 1000 << endl; - Homie.setup(); - break; - } + // Homie.getLogger() << "INFO: Device in normal mode." << endl; + + // if (devicemanager.IsColdstart()) + // { + // Homie.getLogger() << "DEBUG: Is Coldstart set new initial State" << endl; + // devicemanager.SetStateAndMagicNumberToMemory(); + // devicemanager.SetStateToMemory(STATE_COLDSTART); + // } + // devicemanager.ReadStateFromMemory(); + // switch (devicemanager.GetCurrentState()) + // { + // default: // Catch all unknown states + // case STATE_SLEEP_WAKE: + // // first run after power on - initializes + // case STATE_COLDSTART: + // // Prepare to setup the WIFI + + // WiFi.forceSleepWake(); + // WiFi.mode(WIFI_STA); + // // one more sleep required to to wake with wifi on + // devicemanager.SetStateToMemory(STATE_CONNECT_WIFI); + // devicemanager.GotToSleep(WAKE_RFCAL); + + // break; + // case STATE_CONNECT_WIFI: + // Homie.onEvent(onHomieEvent); + + // temperatures.setup(); + + // Homie.getLogger() << "DEBUG: Turn on WIFI: " << millis() / 1000 << endl; + // WiFi.forceSleepWake(); + // delay(500); + // wifi_set_sleep_type(MODEM_SLEEP_T); + // Homie_setFirmware(FW_NAME, FW_VERSION); + // Homie.setSetupFunction(setupHandler).setLoopFunction(loopHandler); + // measures.AdvertiseNodes(); + // Homie.getLogger() << "DEBUG: Before setup(): " << millis() / 1000 << endl; + // Homie.setup(); + // break; + // } } void loop() diff --git a/src/message.cpp b/src/message.cpp new file mode 100644 index 0000000..e0be4ee --- /dev/null +++ b/src/message.cpp @@ -0,0 +1,7 @@ +#include "message.h" + +Message::Message(char *Topic, char *message) +{ + this->Topic = Topic; + this->message = message; +} diff --git a/src/message.h b/src/message.h new file mode 100644 index 0000000..1d39850 --- /dev/null +++ b/src/message.h @@ -0,0 +1,16 @@ +#ifndef Message_H +#define Message_H + +class Message +{ + +public: + Message(char *Topic, char *message); + ~Message(); + char *message; + char *Topic; + +private: +}; + +#endif \ No newline at end of file From 3756a20f25b2fb043ea12ac5c8bb0bf2be634aeb Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Fri, 13 Aug 2021 21:45:42 +0200 Subject: [PATCH 42/99] :construction: Removed Homie as dependency --- src/DeviceManager.cpp | 27 ++++- src/DeviceManager.h | 3 + src/MeasureHandler.cpp | 5 + src/MeasureHandler.h | 3 +- src/MqttWrapper.cpp | 44 +++++--- src/MqttWrapper.h | 6 +- src/main.cpp | 235 +++++++++++++++++------------------------ 7 files changed, 170 insertions(+), 153 deletions(-) diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 76977ad..6daa486 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -5,6 +5,30 @@ void DeviceManager::setup() {} +char DeviceManager::_deviceId[]; // need to define the static variable + +#ifdef ESP32 +void DeviceManager::generateDeviceID() +{ + uint8_t mac[6]; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + snprintf(DeviceManager::_deviceId, 15 + 1, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); +} +#elif defined(ESP8266) +void DeviceManager::generateDeviceID() +{ + uint8_t mac[6]; + WiFi.macAddress(mac); + snprintf(DeviceManager::_deviceId, 15, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); +} +#endif // ESP32 + +char *DeviceManager::getDeviceID() +{ + this->generateDeviceID(); + return DeviceManager::_deviceId; +} + DeviceManager::DeviceManager() { } @@ -95,7 +119,8 @@ void DeviceManager::ConnectWifi() delay(500); Serial.print("."); } - Serial.println("Connected"); + Serial.print("Connected. Got IP: "); + Serial.println(WiFi.localIP()); } OperatingStates DeviceManager::GetOperatingState() { diff --git a/src/DeviceManager.h b/src/DeviceManager.h index b67cc76..1325c12 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -50,8 +50,11 @@ class DeviceManager // Get the actual Operating State OperatingStates GetOperatingState(); void ConnectWifi(); + char *getDeviceID(); private: + static char _deviceId[15]; + void generateDeviceID(); OperatingStates operatingState; int SleepTime; byte CurrentState; diff --git a/src/MeasureHandler.cpp b/src/MeasureHandler.cpp index 281e396..e2a7fdd 100644 --- a/src/MeasureHandler.cpp +++ b/src/MeasureHandler.cpp @@ -158,6 +158,11 @@ void MeasureHandler::SubmitData() } } +float MeasureHandler::GetWeightValue() +{ + return this->weight; +} + float MeasureHandler::GetVoltage() { return this->voltage; diff --git a/src/MeasureHandler.h b/src/MeasureHandler.h index 4934ca8..728693d 100644 --- a/src/MeasureHandler.h +++ b/src/MeasureHandler.h @@ -17,7 +17,7 @@ class MeasureHandler void setup(); void setupHandler(); void AdvertiseNodes(); - + MeasureHandler(); void SetWeightValue(float weightValue); @@ -29,6 +29,7 @@ class MeasureHandler void SubmitData(); void SetLowBattery(bool isLow); bool GetLowBattery(); + float GetWeightValue(); private: ConfigurationManager *configurationManager; diff --git a/src/MqttWrapper.cpp b/src/MqttWrapper.cpp index 0501bc9..fb30cfe 100644 --- a/src/MqttWrapper.cpp +++ b/src/MqttWrapper.cpp @@ -3,23 +3,35 @@ #include "MqttWrapper.h" #include "ConfigurationManager.h" #include "message.h" - AsyncMqttClient mqttClient; std::vector MqttWrapper::messages; void MqttWrapper::onMqttConnect() { - // this->connected = true; Serial.println("Connected, sending message"); for (Message *msg : MqttWrapper::messages) { - + char internalTopic[255]; + strcpy(internalTopic, "devices/"); + strcat(internalTopic, this->deviceID); + strcat(internalTopic, msg->Topic); + Serial.print("Topic:"); + Serial.println(internalTopic); + Serial.print("Message:"); Serial.println(msg->message); Serial.println("_____"); - mqttClient.publish(msg->Topic, 0, true, msg->message); + mqttClient.publish(internalTopic, 0, true, msg->message); } - mqttClient.disconnect(); + MqttWrapper::messages.empty(); +} + + +void MqttWrapper::Queue(char *Topic, float value) +{ + char result[8]; + dtostrf(value, 6, 2, result); + MqttWrapper::messages.push_back(new Message(Topic, result)); } void MqttWrapper::Queue(char *Topic, char *msg) @@ -27,33 +39,39 @@ void MqttWrapper::Queue(char *Topic, char *msg) MqttWrapper::messages.push_back(new Message(Topic, msg)); } +void MqttWrapper::onMqttDisconnect(AsyncMqttClientDisconnectReason reason) +{ + Serial.print("MQTT Disconnect Reason: "); + Serial.println((int)reason); +} + void MqttWrapper::Send() { + Serial.println("Setting up mqtt connection"); mqttClient.setServer("192.168.178.201", ConfigurationManager::getInstance()->GetMqttPort()); if ( ConfigurationManager::getInstance()->GetMqttUser().length() > 0 && ConfigurationManager::getInstance()->GetMqttPassword().length() > 0) { - mqttClient.setCredentials( ConfigurationManager::getInstance()->GetMqttUser().c_str(), ConfigurationManager::getInstance()->GetMqttPassword().c_str()); } mqttClient.onConnect(std::bind(&MqttWrapper::onMqttConnect, this)); + mqttClient.onDisconnect(std::bind(&MqttWrapper::onMqttDisconnect, this, std::placeholders::_1)); mqttClient.connect(); - - for (Message *msg : MqttWrapper::messages) + // Must be called to gain a connection... think this is a bug in the asyncmqtt lib. + while (!mqttClient.connected()) { - - Serial.println(msg->message); - Serial.println("_____"); - mqttClient.publish(msg->Topic, 0, true, msg->message); + delay(500); } } -MqttWrapper::MqttWrapper() +MqttWrapper::MqttWrapper(char *deviceID) { + this->deviceID = deviceID; } + MqttWrapper::~MqttWrapper() { } \ No newline at end of file diff --git a/src/MqttWrapper.h b/src/MqttWrapper.h index b7101c4..2f8b988 100644 --- a/src/MqttWrapper.h +++ b/src/MqttWrapper.h @@ -2,18 +2,20 @@ #define MqttWrapper_H #include #include "message.h" - +#include class MqttWrapper { public: - MqttWrapper(); + MqttWrapper(char* deviceID); ~MqttWrapper(); void onMqttConnect(); void Queue(char* Topic, char* msg); + void Queue(char* Topic, float value); void Send(); void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); private: + char* deviceID; char* message; char* Topic; bool connected; diff --git a/src/main.cpp b/src/main.cpp index a188653..b94ff60 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include +// #include #include #include "WeightProcessor.h" #include "TemperatureProcessor.h" @@ -40,6 +40,7 @@ BatteryProcessor batteryProcessor; MeasureHandler measures; DeviceManager devicemanager; ConfigWebserver configServer; +MqttWrapper mqtt(devicemanager.getDeviceID()); void setupHandler() { @@ -51,91 +52,20 @@ void max_run() ++runtime_s; if (runtime_s == RUNTIME_MAX) { - Homie.getLogger() << "DEBUG: Max. runtime of " << RUNTIME_MAX << "s reached, shutting down!" << endl; - // devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); - // Homie.getLogger() << "✔ Preparing for " << devicemanager.GetSleepTime() << " seconds sleep" << endl; - Homie.prepareToSleep(); - } -} - -void onHomieEvent(const HomieEvent &event) -{ - - switch (event.type) - { - case HomieEventType::STANDALONE_MODE: - case HomieEventType::CONFIGURATION_MODE: - case HomieEventType::OTA_STARTED: - case HomieEventType::OTA_PROGRESS: - case HomieEventType::OTA_SUCCESSFUL: - case HomieEventType::OTA_FAILED: - case HomieEventType::ABOUT_TO_RESET: - case HomieEventType::WIFI_CONNECTED: - case HomieEventType::MQTT_DISCONNECTED: - case HomieEventType::MQTT_PACKET_ACKNOWLEDGED: - case HomieEventType::SENDING_STATISTICS: - break; - case HomieEventType::NORMAL_MODE: - - //timeout.attach(1.0, max_run); - if (temperatures.getDeviceCount() > 0) - { - Homie.getLogger() << "DEBUG: " << temperatures.getDeviceCount() << " Temperature sensors attached" << endl; - measures.SetTemperatureValue(0, temperatures.getTemperature(0)); - } - else - { - Homie.getLogger() << "DEBUG: No Temperature sensors attached!" << endl; - } - - measures.SetVoltage(batteryProcessor.getVolt()); - break; - - case HomieEventType::WIFI_DISCONNECTED: - Homie.getLogger() << "Wifi disconnected" << endl; - break; - - case HomieEventType::MQTT_READY: - measures.SetLowBattery(batteryProcessor.IsLow()); - - // When the battery is low, it mus sleep forever - if (measures.GetLowBattery()) - { - devicemanager.SetSleepTime(0); - } - else - { - // devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); - } - - // Submitting the gathered data now. - measures.SubmitData(); - - Homie.getLogger() << "✔ Data is transmitted, waiting for package acks..." << endl; - //max_run(); - delay(100); - Homie.prepareToSleep(); - break; - - case HomieEventType::READY_TO_SLEEP: - - Homie.getLogger() << "DEBUG: Total runtime: " << millis() / 1000 << endl; + // Serial.println() << "DEBUG: Max. runtime of " << RUNTIME_MAX << "s reached, shutting down!" << endl; + devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); + //Serial.println() << "✔ Preparing for " << devicemanager.GetSleepTime() << " seconds sleep" << endl; devicemanager.GotToSleep(); - Homie.getLogger() << "Sleeping now!" << endl; - break; + // Homie.prepareToSleep(); } } -void loopHandler() -{ -} void setup() { Serial.begin(115200); // Get the settings ConfigurationManager::getInstance()->ReadSettings(); - // Homie.disableResetTrigger(); // Homie.disableLedFeedback(); // collides with Serial on ESP07 @@ -147,73 +77,106 @@ void setup() return; break; case OperatingStates::Operating: - Serial.println("Normal mode"); + + if (devicemanager.IsColdstart()) + { + // Serial.println() << "DEBUG: Is Coldstart set new initial State" << endl; + devicemanager.SetStateAndMagicNumberToMemory(); + devicemanager.SetStateToMemory(STATE_COLDSTART); + } + devicemanager.ReadStateFromMemory(); + switch (devicemanager.GetCurrentState()) + { + default: // Catch all unknown states + case STATE_SLEEP_WAKE: + // first run after power on - initializes + case STATE_COLDSTART: + // Prepare to setup the WIFI + + WiFi.forceSleepWake(); + WiFi.mode(WIFI_STA); + // one more sleep required to to wake with wifi on + devicemanager.SetStateToMemory(STATE_CONNECT_WIFI); + devicemanager.GotToSleep(WAKE_RFCAL); + + break; + case STATE_CONNECT_WIFI: + temperatures.setup(); + + WiFi.forceSleepWake(); + delay(500); + wifi_set_sleep_type(MODEM_SLEEP_T); + + devicemanager.ConnectWifi(); + // Measure Battery + measures.SetLowBattery(batteryProcessor.IsLow()); + measures.SetVoltage(batteryProcessor.getVolt()); + + // Get temperature + if (temperatures.getDeviceCount() > 0) + { + for (int i = 0; i < temperatures.getDeviceCount(); i++) + { + char internalTopic[155]; + strcpy(internalTopic, "/hive/Temperature/"); + strcat(internalTopic, String(i).c_str()); + strcat(internalTopic, "/value"); + mqtt.Queue(internalTopic, measures.GetTemperaturValue(0)); + measures.SetTemperatureValue(0, temperatures.getTemperature(0)); + } + } + else + { + Serial.println("No Temperature Sensors connected"); + } + + WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); + if (scaledevice.DeviceReady()) + { + mqtt.Queue("/hive/weight", scaledevice.getWeight()); + } + else + { + Serial.println("No Scaledevice connected"); + } + mqtt.Queue("/hive/battery/volt", measures.GetVoltage()); + mqtt.Queue("/hive/battery/islow", measures.GetLowBattery()); + mqtt.Queue("/hive/weight", measures.GetWeightValue()); + mqtt.Send(); + + // When the battery is low, it mus sleep forever + if (measures.GetLowBattery()) + { + devicemanager.SetSleepTime(0); + } + else + { + devicemanager.SetSleepTime(ConfigurationManager::getInstance()->GetSleepTime()); + } + + WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption + // Serial.println() << endl; + // Serial.println( "///////////////////////////////////////////" << endl; + // Serial.println( "GPIO_MAINTENANCE_PIN: " << GPIO_MAINTENANCE_PIN << endl; + // Serial.println( "GPIO_ONEWIRE_BUS: " << GPIO_ONEWIRE_BUS << endl; + // Serial.println("GPIO_HX711_SCK: " << GPIO_HX711_SCK << endl; + // Serial.println( "GPIO_HX711_DT: " << GPIO_HX711_DT << endl; + // Serial.println( "FW_NAME: " << FW_NAME << endl; + // Serial.println( "FW_VERSION: " << FW_VERSION << endl; + // Serial.println( "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; + // Serial.println( "///////////////////////////////////////////" << endl; + // Serial.println( "INFO: Device in normal mode." (;<< endl; + + break; + } break; } - - devicemanager.ConnectWifi(); - MqttWrapper mqtt; - mqtt.Queue("/homie/msg", "{'a':122,'b':333}"); - mqtt.Send(); - - WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption - Homie.getLogger() << endl; - Homie.getLogger() << "///////////////////////////////////////////" << endl; - Homie.getLogger() << "GPIO_MAINTENANCE_PIN: " << GPIO_MAINTENANCE_PIN << endl; - Homie.getLogger() << "GPIO_ONEWIRE_BUS: " << GPIO_ONEWIRE_BUS << endl; - Homie.getLogger() << "GPIO_HX711_SCK: " << GPIO_HX711_SCK << endl; - Homie.getLogger() << "GPIO_HX711_DT: " << GPIO_HX711_DT << endl; - Homie.getLogger() << "FW_NAME: " << FW_NAME << endl; - Homie.getLogger() << "FW_VERSION: " << FW_VERSION << endl; - Homie.getLogger() << "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; - Homie.getLogger() << "///////////////////////////////////////////" << endl; - - // Homie.getLogger() << "INFO: Device in normal mode." << endl; - - // if (devicemanager.IsColdstart()) - // { - // Homie.getLogger() << "DEBUG: Is Coldstart set new initial State" << endl; - // devicemanager.SetStateAndMagicNumberToMemory(); - // devicemanager.SetStateToMemory(STATE_COLDSTART); - // } - // devicemanager.ReadStateFromMemory(); - // switch (devicemanager.GetCurrentState()) - // { - // default: // Catch all unknown states - // case STATE_SLEEP_WAKE: - // // first run after power on - initializes - // case STATE_COLDSTART: - // // Prepare to setup the WIFI - - // WiFi.forceSleepWake(); - // WiFi.mode(WIFI_STA); - // // one more sleep required to to wake with wifi on - // devicemanager.SetStateToMemory(STATE_CONNECT_WIFI); - // devicemanager.GotToSleep(WAKE_RFCAL); - - // break; - // case STATE_CONNECT_WIFI: - // Homie.onEvent(onHomieEvent); - - // temperatures.setup(); - - // Homie.getLogger() << "DEBUG: Turn on WIFI: " << millis() / 1000 << endl; - // WiFi.forceSleepWake(); - // delay(500); - // wifi_set_sleep_type(MODEM_SLEEP_T); - // Homie_setFirmware(FW_NAME, FW_VERSION); - // Homie.setSetupFunction(setupHandler).setLoopFunction(loopHandler); - // measures.AdvertiseNodes(); - // Homie.getLogger() << "DEBUG: Before setup(): " << millis() / 1000 << endl; - // Homie.setup(); - // break; - // } } void loop() { if (!devicemanager.GetOperatingState() == OperatingStates::Maintenance) { - Homie.loop(); + } } \ No newline at end of file From 753c280d48ccb4e619a97d10446229d059ddce33 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 20:31:28 +0200 Subject: [PATCH 43/99] Start in config mode Adding configuration mode --- src/main.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b94ff60..30283af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,3 @@ -// #include #include #include "WeightProcessor.h" #include "TemperatureProcessor.h" @@ -60,10 +59,16 @@ void max_run() } } - void setup() { Serial.begin(115200); + if (!ConfigurationManager::getInstance()->HasValidConfiguration()) + { + + Serial.println("No valid configuration available. Starting configuration mode"); + configServer.Serve(); + return; + } // Get the settings ConfigurationManager::getInstance()->ReadSettings(); // Homie.disableResetTrigger(); @@ -72,11 +77,12 @@ void setup() switch (devicemanager.GetOperatingState()) { case OperatingStates::Maintenance: - Serial.println("Maintenance mode"); + Serial.println("Maintenance / Configuration mode"); configServer.Serve(); return; break; case OperatingStates::Operating: + Serial.println("Normal mode"); if (devicemanager.IsColdstart()) { @@ -101,8 +107,8 @@ void setup() break; case STATE_CONNECT_WIFI: - temperatures.setup(); + temperatures.setup(); WiFi.forceSleepWake(); delay(500); wifi_set_sleep_type(MODEM_SLEEP_T); @@ -177,6 +183,5 @@ void loop() { if (!devicemanager.GetOperatingState() == OperatingStates::Maintenance) { - } } \ No newline at end of file From 22e90d8dbc7d1e33912f15bfb4a304c8c055916d Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 20:31:42 +0200 Subject: [PATCH 44/99] Added check if there any valid configuration exists --- src/ConfigurationManager.cpp | 10 ++++++++++ src/ConfigurationManager.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/ConfigurationManager.cpp b/src/ConfigurationManager.cpp index b821f9e..2cd6ca0 100644 --- a/src/ConfigurationManager.cpp +++ b/src/ConfigurationManager.cpp @@ -84,6 +84,16 @@ String ConfigurationManager::GetJson() return values; } +bool ConfigurationManager::HasValidConfiguration() +{ + bool exists = false; + if (SPIFFS.begin()) + { + exists = SPIFFS.exists(CONFIG_FILE); + } + return exists; +} + DynamicJsonDocument ConfigurationManager::GetJsonDocument() { DynamicJsonDocument doc(JSON_DOCSIZE); diff --git a/src/ConfigurationManager.h b/src/ConfigurationManager.h index 70ce486..8144c9a 100644 --- a/src/ConfigurationManager.h +++ b/src/ConfigurationManager.h @@ -19,6 +19,7 @@ class ConfigurationManager double GetCalibrationFactorSetting(); double GetVccAdjustSetting(); void ApplyJsonInput(String json); + bool HasValidConfiguration(); String GetWifiSsid(); String GetWifiPassword(); From 5b47e62325cb4f28777d29e7c8c108ab961f00cb Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 20:32:09 +0200 Subject: [PATCH 45/99] Added more logging --- src/DeviceManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 6daa486..58759c5 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -113,6 +113,7 @@ void DeviceManager::ConnectWifi() WiFi.mode(WIFI_STA); WiFi.begin(ConfigurationManager::getInstance()->GetWifiSsid(), ConfigurationManager::getInstance()->GetWifiPassword()); + Serial.println("Conecting to wifi"); while (WiFi.status() != WL_CONNECTED) { From 163c99e05aa6ae3c0235c13214e6c36245ef3e94 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 21:37:34 +0200 Subject: [PATCH 46/99] Did some refactorings and added new scale methods --- platformio.ini | 68 +++++++++++++++++++++++++++++++++++++++++ src/WeightProcessor.cpp | 51 ++++++++++++++++++++++--------- src/WeightProcessor.h | 18 +++++++++-- 3 files changed, 120 insertions(+), 17 deletions(-) diff --git a/platformio.ini b/platformio.ini index d521ece..c193093 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,47 @@ [platformio] +; default_envs = espdev/complete default_envs = esp12e/complete +data_dir = ./data + +[common] + +arduino_core_2_6_3 = espressif8266@2.3.3 +arduino_core_2_7_4 = espressif8266@2.6.2 +arduino_core_3_0_0 = espressif8266@3.0.0 + +# Platform to use for ESP8266 +platform_hivemon_default = ${common.arduino_core_2_7_4} + + + +[env] +framework = arduino +board_build.flash_mode = dout +monitor_speed = 115200 +; upload_speed = 115200 +# fast upload speed (remove ';' when building for development use) +upload_speed = 921600 +monitor_filters =colorize, default, esp8266_exception_decoder, printable, send_on_enter, time +lib_compat_mode = strict + + +[esp8266] +build_flags = + -DESP8266 + -DFP_IN_IROM + ;-Wno-deprecated-declarations + ;-Wno-register +; NONOSDK22x_190703 = 2.2.2-dev(38a443e) + -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703 +; lwIP 2 - Higher Bandwidth no Features +; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH +; lwIP 1.4 - Higher Bandwidth (Aircoookie has) + -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +; VTABLES in Flash + -DVTABLES_IN_FLASH +; restrict to minimal mime-types + -DMIMETYPE_MINIMAL + [env:esp12e/minimal] platform = espressif8266 @@ -44,5 +86,31 @@ lib_deps = monitor_speed = 115200 lib_compat_mode = strict + + + +[env:espdev/complete] +platform = espressif8266 +board = d1_mini +framework = arduino +build_flags = + -D GPIO_HX711_DT=13 ;D7 + -D GPIO_HX711_SCK=12 ;D6 + -D GPIO_ONEWIRE_BUS=14 ;D5 + -D GPIO_MAINTENANCE_PIN=5 ;D1 +lib_deps = + ;https://github.com/homieiot/homie-esp8266/#fix/711-Espressif8266-v3.0.0 + ;ArduinoJson@^5.13.4 + bblanchon/StreamUtils @ ^1.6.1 + OneWire@^2.3.5 + DallasTemperature@^3.9.1 + bogde/HX711@^0.7.4 + RunningMedian@^0.3.0 +board_build.mcu = esp8266 + +; change MCU frequency +board_build.f_cpu = 80000000L +lib_compat_mode = strict + build_type = debug board_build.flash_mode = qio \ No newline at end of file diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index 87bb239..ba73c57 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -24,6 +24,22 @@ WeightProcessor::WeightProcessor(int dtPin, int scPin) scale.begin(_dtPin, _scPin); } + +void WeightProcessor::SetScale() +{ + scale.set_scale(); +} + +void WeightProcessor::Tare() +{ + scale.tare(); +} + +float WeightProcessor::GetUnits() +{ + scale.get_units(10); +} + void WeightProcessor::setup(float kilogramDivider, float weightOffset, float calibrationTemperature, float calibrationFactor) { this->_calibrationFactor = calibrationFactor; @@ -35,14 +51,17 @@ void WeightProcessor::setup(float kilogramDivider, float weightOffset, float cal float WeightProcessor::getWeight() { - RunningMedian WeightSamples = RunningMedian(3); scale.power_up(); + RunningMedian WeightSamples = RunningMedian(3); scale.set_scale(this->_kilogramDivider); //initialize scale scale.set_offset(this->_weightOffset); //initialize scale for (int i = 0; i < 3; i++) { - float WeightRaw = scale.get_units(3); + float WeightRaw = scale.read_average(20); + Serial.print("Weight RAW Value:"); + Serial.println(WeightRaw); WeightSamples.add(WeightRaw); + delay(250); } scale.power_down(); float median = WeightSamples.getMedian(); @@ -57,23 +76,25 @@ WeightProcessor::~WeightProcessor() bool WeightProcessor::DeviceReady() { - return scale.wait_ready_timeout(200); + // scale.power_up(); + + return scale.wait_ready_timeout(1000); } float WeightProcessor::getWeight(float temperatureForCompensation) { - // if (scale.is_ready()) - // { - float weight = this->getWeight(); - //temperature compensation - if (temperatureForCompensation < this->_calibrationTemperature) - weight = weight + (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); - if (temperatureForCompensation > this->_calibrationTemperature) - weight = weight - (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); - - return weight; - // } - // return 0; + if (scale.is_ready()) + { + float weight = this->getWeight(); + //temperature compensation + if (temperatureForCompensation < this->_calibrationTemperature) + weight = weight + (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); + if (temperatureForCompensation > this->_calibrationTemperature) + weight = weight - (fabs(temperatureForCompensation - this->_calibrationTemperature) * this->_calibrationFactor); + + return weight; + } + return -127; } float WeightProcessor::toKilogram(float getWeighMeasure) diff --git a/src/WeightProcessor.h b/src/WeightProcessor.h index 47a07db..ac1e25f 100644 --- a/src/WeightProcessor.h +++ b/src/WeightProcessor.h @@ -17,8 +17,22 @@ class WeightProcessor float getWeight(float temperatureForCompensation); float toKilogram(float getWeighMeasure); bool DeviceReady(); - // Performs an automatic tare for the first run - void AutoTare(); + +/* +To Autotare just following these steps + +1. Call SetScale(). +2 .Call Tare(). +3. Place a known weight on the scale and call get_units(10). + + +Divide the result in step 3 to your known weight. You should get about the parameter you need to pass to set_scale(). +Adjust the parameter in step 4 until you get an accurate reading. + +*/ + void SetScale(); + void Tare(); + float GetUnits(); // Get an Singelton instance static WeightProcessor *getInstance(int dtPin, int scPin) From 351dcc599ad05559fe8ffeb6d6f9c71b8709ee1a Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 21:38:05 +0200 Subject: [PATCH 47/99] now using Strings for messages modified mqtt wrapper calls to cast the values to string --- src/MqttWrapper.cpp | 26 +++++++++++++++++++------- src/MqttWrapper.h | 1 + src/message.cpp | 4 ++-- src/message.h | 6 +++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/MqttWrapper.cpp b/src/MqttWrapper.cpp index fb30cfe..95a298b 100644 --- a/src/MqttWrapper.cpp +++ b/src/MqttWrapper.cpp @@ -19,24 +19,36 @@ void MqttWrapper::onMqttConnect() Serial.print("Topic:"); Serial.println(internalTopic); Serial.print("Message:"); - Serial.println(msg->message); + Serial.println(msg->msg); Serial.println("_____"); - mqttClient.publish(internalTopic, 0, true, msg->message); + mqttClient.publish(internalTopic, 0, true, msg->msg.c_str()); } MqttWrapper::messages.empty(); } - void MqttWrapper::Queue(char *Topic, float value) { - char result[8]; - dtostrf(value, 6, 2, result); - MqttWrapper::messages.push_back(new Message(Topic, result)); + Serial.print("Queue value:"); + String result(value,2); + Message *m = new Message(Topic, result); + Serial.println(m->msg); + MqttWrapper::messages.push_back(m); +} + +void MqttWrapper::Queue(char *Topic, int value) +{ + Serial.print("Queue value:"); + String result(value); + Message *m = new Message(Topic, result); + Serial.println(m->msg); + MqttWrapper::messages.push_back(m); } void MqttWrapper::Queue(char *Topic, char *msg) { - MqttWrapper::messages.push_back(new Message(Topic, msg)); + Message *data = new Message(Topic, msg); + Serial.println(data->msg); + MqttWrapper::messages.push_back(data); } void MqttWrapper::onMqttDisconnect(AsyncMqttClientDisconnectReason reason) diff --git a/src/MqttWrapper.h b/src/MqttWrapper.h index 2f8b988..c5ff311 100644 --- a/src/MqttWrapper.h +++ b/src/MqttWrapper.h @@ -12,6 +12,7 @@ class MqttWrapper void onMqttConnect(); void Queue(char* Topic, char* msg); void Queue(char* Topic, float value); + void Queue(char *Topic, int value); void Send(); void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); private: diff --git a/src/message.cpp b/src/message.cpp index e0be4ee..cebc389 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -1,7 +1,7 @@ #include "message.h" -Message::Message(char *Topic, char *message) +Message::Message(char *Topic, String messageData) { this->Topic = Topic; - this->message = message; + this->msg = messageData; } diff --git a/src/message.h b/src/message.h index 1d39850..498e8aa 100644 --- a/src/message.h +++ b/src/message.h @@ -1,13 +1,13 @@ #ifndef Message_H #define Message_H - +#include class Message { public: - Message(char *Topic, char *message); + Message(char *Topic, String messageData); ~Message(); - char *message; + String msg; char *Topic; private: From a9f0aba691cb92d5bdb2eb92e666ba46db76432a Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 17 Aug 2021 21:38:16 +0200 Subject: [PATCH 48/99] implemented the configuration bootup --- src/main.cpp | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 30283af..70a6477 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -111,7 +111,7 @@ void setup() temperatures.setup(); WiFi.forceSleepWake(); delay(500); - wifi_set_sleep_type(MODEM_SLEEP_T); + devicemanager.ConnectWifi(); // Measure Battery @@ -130,24 +130,27 @@ void setup() mqtt.Queue(internalTopic, measures.GetTemperaturValue(0)); measures.SetTemperatureValue(0, temperatures.getTemperature(0)); } + mqtt.Queue("/hive/Temperature/connected", 1); } else { + mqtt.Queue("/hive/Temperature/connected", 0); Serial.println("No Temperature Sensors connected"); } WeightProcessor scaledevice(GPIO_HX711_DT, GPIO_HX711_SCK); if (scaledevice.DeviceReady()) { - mqtt.Queue("/hive/weight", scaledevice.getWeight()); + mqtt.Queue("/hive/weight/connected", 1); + mqtt.Queue("/hive/weight/value", scaledevice.getWeight()); } else { + mqtt.Queue("/hive/weight/connected", 0); Serial.println("No Scaledevice connected"); } - mqtt.Queue("/hive/battery/volt", measures.GetVoltage()); - mqtt.Queue("/hive/battery/islow", measures.GetLowBattery()); - mqtt.Queue("/hive/weight", measures.GetWeightValue()); + mqtt.Queue("/hive/battery/volt", batteryProcessor.getVolt()); + mqtt.Queue("/hive/battery/islow",1 ); mqtt.Send(); // When the battery is low, it mus sleep forever @@ -161,18 +164,8 @@ void setup() } WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption - // Serial.println() << endl; - // Serial.println( "///////////////////////////////////////////" << endl; - // Serial.println( "GPIO_MAINTENANCE_PIN: " << GPIO_MAINTENANCE_PIN << endl; - // Serial.println( "GPIO_ONEWIRE_BUS: " << GPIO_ONEWIRE_BUS << endl; - // Serial.println("GPIO_HX711_SCK: " << GPIO_HX711_SCK << endl; - // Serial.println( "GPIO_HX711_DT: " << GPIO_HX711_DT << endl; - // Serial.println( "FW_NAME: " << FW_NAME << endl; - // Serial.println( "FW_VERSION: " << FW_VERSION << endl; - // Serial.println( "Setup Maintenance pin: " << GPIO_MAINTENANCE_PIN << endl; - // Serial.println( "///////////////////////////////////////////" << endl; - // Serial.println( "INFO: Device in normal mode." (;<< endl; - + // Set modem to sleep + wifi_set_sleep_type(MODEM_SLEEP_T); break; } break; From 563967f05a36d59e1c60a277f55195df0ae4913f Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Wed, 18 Aug 2021 21:07:55 +0200 Subject: [PATCH 49/99] :construction: Config mode now identify the weight offset. --- html/index.htm | 50 ++-- html/index.js | 34 ++- src/ConfigWebserver.cpp | 27 +- src/DeviceManager.cpp | 10 +- src/WeightProcessor.cpp | 32 ++- src/WeightProcessor.h | 1 + src/html/html_ui.h | 545 ++++++++++++++++++++-------------------- src/main.cpp | 15 +- 8 files changed, 383 insertions(+), 331 deletions(-) diff --git a/html/index.htm b/html/index.htm index c079594..92a2a0d 100644 --- a/html/index.htm +++ b/html/index.htm @@ -45,37 +45,45 @@ - - + +
    diff --git a/html/index.js b/html/index.js index 3e2b8f6..9efac43 100644 --- a/html/index.js +++ b/html/index.js @@ -43,11 +43,9 @@ function setInitialPage() { toogleAutoTare(); break; case "TARE1": - setDisplay("cTareStep1", "block"); - break; - case "TARE2": - setDisplay("cTareStep2", "block"); + setDisplay("tareStep2", "block"); break; + } } function parseQuery() { @@ -67,8 +65,6 @@ function toggleIndex() { function hideAllControls() { setDisplay("cTareStep0", "none"); - setDisplay("cTareStep1", "none"); - setDisplay("cTareStep2", "none"); setDisplay("cSettings", "none"); setDisplay("welcome", "none"); setDisplay("cv", "none"); @@ -118,9 +114,23 @@ function tareStep2() { } function startTare() { - sendData({}, "tarestep0").then((data) => { - ActualPage = "TARE1"; - setControls(); + read(2"getWeightValue").then((data) => { + switch (ActualPage) { + case "TARE1": + setDisplay("zeroArea", "block"); + setLabel("zeroValue", "".concat("The measured kilogram divider is: ", data)); + setTextBoxValue("scale_kilogramdivider", data); + ActualPage = "TARE1"; + setControls(); + + default: + setDisplay("zeroArea", "block"); + setLabel("zeroValue", "".concat("The measured weight offset is: ", data)); + setTextBoxValue("scale_weightoffset", data); + ActualPage = "TARE1"; + setControls(); + break; + } }).catch(() => { }); } @@ -179,6 +189,12 @@ function setTextBoxValue(id, value) { d.getElementById(id).value = value; } + +function setLabel(id, value) { + d.getElementById(id).innerHTML = value; +} + + function saveSettings() { var objectData = { system: { diff --git a/src/ConfigWebserver.cpp b/src/ConfigWebserver.cpp index cb42a8d..0394950 100644 --- a/src/ConfigWebserver.cpp +++ b/src/ConfigWebserver.cpp @@ -5,6 +5,7 @@ #include "AsyncJson.h" #include "ArduinoJson.h" +#include "WeightProcessor.h" #include "ConfigWebserver.h" #include "ConfigurationManager.h" #include "html\html_ui.h" @@ -46,23 +47,15 @@ void ConfigWebserver::Serve() DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); server.addHandler(storeConfigHandler); - // server.on("/tarestep0", HTTP_POST, [](AsyncWebServerRequest *request) - // { - // WeightProcessor *scaledevice = WeightProcessor::getInstance(GPIO_HX711_DT, GPIO_HX711_SCK); - // if (scaledevice->getWeight()) - // { - // float offset = scaledevice->getWeight(0); - // Serial.println("Offset"); - // Serial.println(offset); - // request->send(200); - // } - // else - // { - // Serial.println("Not available"); - // request->send(500, "text" - // "Scale not ready or connected!"); - // } - // }); + server.on("/getWeightValue", HTTP_GET, [](AsyncWebServerRequest *request) + { + WeightProcessor *scaledevice = WeightProcessor::getInstance(GPIO_HX711_DT, GPIO_HX711_SCK); + + float offset = scaledevice->getRawWeight(); + Serial.println("Offset"); + Serial.println(offset); + request->send(200, "text", String(offset)); + }); // server.on( // "/tarestep1", HTTP_POST, [](AsyncWebServerRequest *request) {}, NULL, diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 58759c5..f95be9c 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -54,9 +54,17 @@ void DeviceManager::GotToSleep(WakeMode mode) void DeviceManager::GotToSleep() { + int seconds = this->GetSleepTime(); + if (seconds==0){ + // Preventing to go to sleep forever. + seconds=5; + } // Set the next state into the memory. this->SetStateToMemory(STATE_SLEEP_WAKE); - ESP.deepSleep(this->GetSleepTime() * 1000000); + Serial.print("Sleep now for "); + Serial.print(seconds * 1000000); + Serial.println(" seconds"); + ESP.deepSleep(seconds * 1000000); } void DeviceManager::SetStateToMemory(byte value) diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index ba73c57..2f569b2 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -24,7 +24,6 @@ WeightProcessor::WeightProcessor(int dtPin, int scPin) scale.begin(_dtPin, _scPin); } - void WeightProcessor::SetScale() { scale.set_scale(); @@ -51,19 +50,20 @@ void WeightProcessor::setup(float kilogramDivider, float weightOffset, float cal float WeightProcessor::getWeight() { - scale.power_up(); RunningMedian WeightSamples = RunningMedian(3); scale.set_scale(this->_kilogramDivider); //initialize scale scale.set_offset(this->_weightOffset); //initialize scale for (int i = 0; i < 3; i++) { - float WeightRaw = scale.read_average(20); + + scale.power_up(); + float WeightRaw = scale.read_average(3); + scale.power_down(); Serial.print("Weight RAW Value:"); Serial.println(WeightRaw); WeightSamples.add(WeightRaw); delay(250); } - scale.power_down(); float median = WeightSamples.getMedian(); Serial.print("Median:"); Serial.println(median); @@ -76,11 +76,33 @@ WeightProcessor::~WeightProcessor() bool WeightProcessor::DeviceReady() { - // scale.power_up(); return scale.wait_ready_timeout(1000); } + + + +float WeightProcessor::getRawWeight() +{ + + RunningMedian WeightSamples = RunningMedian(3); + for (int i = 0; i < 3; i++) + { + scale.power_up(); + float WeightRaw = scale.read_average(3); + scale.power_down(); + Serial.print("Weight RAW Value:"); + Serial.println(WeightRaw); + WeightSamples.add(WeightRaw); + delay(250); + } + float median = WeightSamples.getMedian(); + Serial.print("Median:"); + Serial.println(median); + return median; +} + float WeightProcessor::getWeight(float temperatureForCompensation) { if (scale.is_ready()) diff --git a/src/WeightProcessor.h b/src/WeightProcessor.h index ac1e25f..da3cb1d 100644 --- a/src/WeightProcessor.h +++ b/src/WeightProcessor.h @@ -15,6 +15,7 @@ class WeightProcessor void setup(float kilogramDivider, float weightOffset, float calibrationTemperature, float calibrationFactor); float getWeight(); float getWeight(float temperatureForCompensation); + float getRawWeight(); float toKilogram(float getWeighMeasure); bool DeviceReady(); diff --git a/src/html/html_ui.h b/src/html/html_ui.h index 0255756..e02d81a 100644 --- a/src/html/html_ui.h +++ b/src/html/html_ui.h @@ -4,275 +4,282 @@ */ // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4274; + const uint16_t PAGE_index_L = 4388; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x72, 0xdb, 0x48, - 0x76, 0xef, 0xfc, 0x8a, 0x36, 0x5c, 0x99, 0x90, 0x29, 0x80, 0x22, 0xa9, 0x9b, 0x45, 0x89, 0x4a, - 0xd9, 0xb2, 0x67, 0xec, 0x8d, 0xed, 0xd1, 0x5a, 0x9a, 0x9d, 0xdd, 0xda, 0x4c, 0x4d, 0x35, 0x81, - 0x26, 0x01, 0x0b, 0x40, 0x63, 0x80, 0x86, 0x28, 0x0e, 0x8a, 0x9f, 0xb0, 0x0f, 0xfb, 0x01, 0xa9, - 0xbc, 0xe4, 0xcb, 0xf2, 0x05, 0xf9, 0x84, 0x9c, 0xd3, 0x17, 0x5c, 0x48, 0x80, 0x96, 0xc7, 0x4e, - 0x26, 0x15, 0xdb, 0x12, 0x89, 0x46, 0x9f, 0xfb, 0xb5, 0x2f, 0xbe, 0x78, 0xf2, 0xf2, 0xfb, 0xab, - 0xdb, 0xbf, 0x5c, 0xbf, 0x22, 0xbe, 0x88, 0xc2, 0x4b, 0x72, 0x81, 0x1f, 0x24, 0xa4, 0xf1, 0x72, - 0x66, 0xb1, 0xd8, 0xc2, 0x01, 0x46, 0x3d, 0xf8, 0x88, 0x98, 0xa0, 0x24, 0xa6, 0x11, 0x9b, 0x59, - 0xf7, 0x01, 0x5b, 0x25, 0x3c, 0x15, 0x16, 0xe9, 0xb9, 0x3c, 0x16, 0x2c, 0x16, 0x33, 0x6b, 0x15, - 0x78, 0xc2, 0x9f, 0x79, 0xec, 0x3e, 0x70, 0x99, 0x23, 0x1f, 0xec, 0x20, 0x0e, 0x44, 0x40, 0x43, - 0x27, 0x73, 0x69, 0xc8, 0x66, 0x63, 0x3b, 0x82, 0x81, 0x28, 0x8f, 0xcc, 0xb3, 0x65, 0x90, 0xf6, - 0x5c, 0x9f, 0xa6, 0x19, 0x03, 0x24, 0xb9, 0x58, 0x38, 0xcf, 0xac, 0x26, 0x31, 0xe1, 0xb3, 0x88, - 0x39, 0x2e, 0x0f, 0x79, 0x6a, 0x91, 0x92, 0xdc, 0xd3, 0x89, 0xfc, 0x53, 0xc3, 0x61, 0xde, 0xac, - 0x59, 0x66, 0x69, 0x50, 0x9a, 0x24, 0x21, 0x73, 0x22, 0x3e, 0x0f, 0xe0, 0x63, 0xc5, 0xe6, 0x0e, - 0x0c, 0x38, 0x2e, 0x4d, 0xe8, 0x3c, 0x64, 0x08, 0x29, 0x02, 0x11, 0xb2, 0xcb, 0xd7, 0xc1, 0x3d, - 0x73, 0xde, 0x71, 0x60, 0x96, 0xa7, 0x17, 0x07, 0x6a, 0x8c, 0xf4, 0x2e, 0x32, 0x37, 0x0d, 0x12, - 0x71, 0xd9, 0xbb, 0xa7, 0x29, 0x11, 0x41, 0xc4, 0x78, 0x2e, 0xec, 0xe7, 0xae, 0xc8, 0x69, 0x78, - 0x4d, 0x97, 0x80, 0xfc, 0xcd, 0xfb, 0x97, 0xaf, 0xfe, 0x6c, 0xd9, 0xde, 0xcc, 0xe3, 0x6e, 0x1e, - 0x01, 0xe9, 0xf3, 0x45, 0x1e, 0xbb, 0x22, 0xe0, 0x31, 0xe1, 0xf1, 0x5b, 0x4e, 0xbd, 0xfe, 0xa0, - 0xf0, 0x03, 0x8f, 0x3d, 0x0f, 0xc3, 0x2b, 0xe0, 0x2d, 0xe5, 0x61, 0xd6, 0x1f, 0xd8, 0x09, 0x4a, - 0xfa, 0xc7, 0x9c, 0xa5, 0x6b, 0x78, 0x00, 0x99, 0x5f, 0xa4, 0xa0, 0xdd, 0xab, 0x34, 0x8f, 0xe6, - 0xea, 0xf9, 0x8d, 0xd2, 0x19, 0x92, 0x50, 0x03, 0x2f, 0x83, 0x2c, 0x09, 0xe9, 0xba, 0x6f, 0xb9, - 0xf7, 0x96, 0x6d, 0xc5, 0x3c, 0x66, 0xd6, 0xc0, 0xfe, 0x8e, 0x89, 0x1b, 0x26, 0x44, 0x10, 0x2f, - 0x01, 0xe7, 0xa6, 0xa4, 0xdb, 0x18, 0x2e, 0x10, 0x73, 0xdf, 0xca, 0xf4, 0x80, 0x35, 0x18, 0x82, - 0x26, 0xe3, 0x3e, 0x9b, 0x5d, 0x16, 0xa0, 0xab, 0x8c, 0x87, 0x6c, 0xe8, 0xb1, 0x79, 0xbe, 0xec, - 0x33, 0x49, 0xe7, 0x96, 0x3d, 0x88, 0x17, 0xfc, 0xe1, 0x4f, 0x34, 0xcc, 0x19, 0x40, 0xad, 0x33, - 0xc1, 0xa2, 0x9f, 0xb3, 0x90, 0xb1, 0x04, 0x85, 0xb7, 0x6c, 0x36, 0x54, 0x63, 0xc3, 0x72, 0xac, - 0x1b, 0xec, 0xde, 0x75, 0xa9, 0xf7, 0x31, 0xcf, 0x84, 0x26, 0x5e, 0x83, 0xde, 0x7e, 0xd5, 0x82, - 0x24, 0xfa, 0x45, 0x88, 0x9f, 0x33, 0x96, 0xde, 0xb3, 0x14, 0x01, 0xf1, 0x71, 0xa8, 0x1e, 0xbb, - 0x26, 0xe7, 0x59, 0x6d, 0x2a, 0x3e, 0x74, 0x4d, 0x4c, 0x68, 0x96, 0xad, 0x78, 0xea, 0x95, 0x93, - 0xcd, 0x40, 0x27, 0x00, 0x7a, 0x79, 0x39, 0x19, 0x1e, 0xda, 0x84, 0x46, 0x77, 0xfe, 0x79, 0xc5, - 0x82, 0xa5, 0x2f, 0xf8, 0x62, 0x01, 0xef, 0xa5, 0xbc, 0x38, 0x3a, 0xac, 0x8f, 0x76, 0x82, 0xde, - 0x05, 0x21, 0x5f, 0xa6, 0x34, 0xf2, 0x82, 0x7b, 0xf0, 0x97, 0xb4, 0x82, 0xde, 0x7a, 0xd1, 0x89, - 0x00, 0x7e, 0x05, 0xf3, 0x94, 0xa2, 0x0f, 0x80, 0x8e, 0x13, 0x06, 0x5f, 0xf3, 0x94, 0xd5, 0x95, - 0x2f, 0xd1, 0xed, 0x9d, 0xf6, 0x18, 0xe4, 0x0b, 0xea, 0x42, 0x8c, 0xec, 0xc3, 0xdb, 0x98, 0xd1, - 0x82, 0x72, 0x15, 0xa4, 0x2c, 0x64, 0x59, 0xc3, 0x10, 0x7a, 0x6c, 0x9f, 0x2d, 0x0c, 0x58, 0x96, - 0x05, 0x0d, 0x10, 0x7c, 0x1e, 0x6c, 0x6a, 0x11, 0xb0, 0x1d, 0x41, 0x45, 0xb6, 0x0a, 0x84, 0xeb, - 0xf7, 0xab, 0xc0, 0x1d, 0x14, 0x2e, 0xcd, 0x98, 0x8e, 0xde, 0xa9, 0xe0, 0xcb, 0x65, 0xc8, 0xde, - 0xc4, 0x1e, 0x7b, 0xe8, 0x0f, 0xce, 0xe7, 0x10, 0x32, 0x77, 0xe7, 0xf2, 0xfd, 0xed, 0xf3, 0x0f, - 0xaf, 0xf0, 0x35, 0x87, 0xd7, 0xcf, 0x73, 0xc1, 0x6f, 0x69, 0xca, 0x76, 0x67, 0x8c, 0xad, 0x69, - 0x23, 0x44, 0x71, 0xd6, 0x8d, 0x60, 0xc9, 0x18, 0x42, 0x75, 0x1e, 0x72, 0xf7, 0xce, 0xda, 0x01, - 0x99, 0x74, 0x80, 0x4c, 0x2a, 0x90, 0x4d, 0x25, 0x4f, 0x3d, 0x5d, 0x14, 0x98, 0x89, 0xd8, 0x2c, - 0x66, 0x2b, 0xf2, 0xc3, 0x87, 0xb7, 0x37, 0x8c, 0xa6, 0xae, 0x7f, 0x4d, 0xc1, 0x3d, 0xb2, 0xbe, - 0x49, 0x41, 0x43, 0x40, 0x20, 0xed, 0x00, 0x01, 0x83, 0xaf, 0x07, 0xe7, 0x71, 0x1e, 0x86, 0xb3, - 0x59, 0x4d, 0xfe, 0x19, 0x1b, 0x2e, 0x99, 0xe8, 0x5b, 0x09, 0x7c, 0xb7, 0x06, 0x83, 0x6f, 0xbe, - 0xe9, 0xef, 0x26, 0xb5, 0x9a, 0x42, 0x1b, 0x0a, 0x6a, 0xc9, 0x67, 0x75, 0x59, 0x56, 0x2c, 0x74, - 0x39, 0xe6, 0x0a, 0x23, 0x48, 0x33, 0x7f, 0x99, 0xd4, 0x54, 0x13, 0xb4, 0x24, 0xb3, 0x83, 0xb8, - 0x68, 0x55, 0xd2, 0xa8, 0x4a, 0x81, 0x9d, 0x7a, 0xdf, 0xf7, 0x7e, 0xd2, 0xf1, 0xbe, 0xc6, 0x5a, - 0xcb, 0xeb, 0x4a, 0xae, 0x36, 0xd8, 0x2a, 0x2d, 0x37, 0xdc, 0xd0, 0x4c, 0x60, 0xb6, 0x50, 0x96, - 0xcb, 0xca, 0x42, 0x81, 0x06, 0x78, 0x15, 0x32, 0xfc, 0xfa, 0x62, 0xfd, 0xc6, 0x83, 0x04, 0x7c, - 0x0e, 0xae, 0x2c, 0xd6, 0x98, 0x91, 0x15, 0xd4, 0x4c, 0x6b, 0x68, 0x36, 0x9b, 0x89, 0x7f, 0xb6, - 0xc0, 0x0f, 0xeb, 0x06, 0x69, 0xba, 0x64, 0x51, 0x37, 0x9f, 0xf4, 0x5a, 0x7b, 0xbf, 0x95, 0x1a, - 0xca, 0xdc, 0x31, 0x04, 0xcc, 0xac, 0x19, 0xa1, 0x15, 0xd3, 0xde, 0x92, 0xd5, 0xc0, 0x54, 0x9f, - 0xa9, 0xbd, 0xb7, 0x4b, 0x07, 0x56, 0x12, 0x42, 0xac, 0x7c, 0x22, 0x5a, 0xd9, 0x30, 0x88, 0x63, - 0x96, 0x62, 0x6e, 0x98, 0x59, 0x37, 0x82, 0x42, 0x6e, 0xde, 0x8d, 0xd9, 0x7a, 0x70, 0xd6, 0xa3, - 0xae, 0x01, 0x8c, 0x3a, 0x20, 0x37, 0x98, 0xbd, 0xac, 0x5a, 0xb4, 0x09, 0xe3, 0x26, 0xd2, 0xff, - 0x62, 0xef, 0x25, 0x15, 0xb4, 0x5f, 0x6c, 0x6c, 0x0b, 0x5f, 0x64, 0xd2, 0xbf, 0x6a, 0x55, 0x74, - 0x5b, 0xf1, 0xe0, 0x5c, 0x0d, 0xed, 0x6d, 0x06, 0x90, 0x19, 0x51, 0x9c, 0xfe, 0x00, 0x66, 0x37, - 0xb2, 0x14, 0xb2, 0xae, 0xcd, 0xd7, 0x4a, 0x67, 0xb4, 0x8f, 0xce, 0xf8, 0xf1, 0x74, 0x0c, 0x6e, - 0xe9, 0x84, 0x29, 0x83, 0x74, 0x1f, 0x13, 0xcc, 0x1f, 0xd7, 0x29, 0x8f, 0x82, 0x8c, 0xf5, 0xfb, - 0x99, 0x4d, 0x11, 0x08, 0x6d, 0xc3, 0x65, 0x66, 0xf9, 0xf3, 0xbb, 0xb7, 0xaf, 0x85, 0x48, 0x3e, - 0xb0, 0x5f, 0x72, 0xe0, 0xe4, 0x9c, 0x0f, 0xa9, 0xe7, 0xbd, 0xba, 0x07, 0x2b, 0xbd, 0x0d, 0x80, - 0x31, 0xd0, 0x5f, 0xdf, 0x0a, 0xa1, 0xb7, 0xb1, 0xec, 0xbe, 0xa1, 0x82, 0x32, 0xf8, 0x7c, 0x75, - 0xcb, 0x69, 0x26, 0xde, 0xb1, 0x2c, 0x43, 0x37, 0xb0, 0x4c, 0x40, 0x91, 0x8c, 0xde, 0x33, 0xef, - 0x09, 0xc6, 0x4c, 0x5f, 0xf8, 0x41, 0x36, 0x04, 0xf9, 0x12, 0xe8, 0x3e, 0x18, 0x9a, 0x01, 0x38, - 0x1f, 0xd8, 0x6d, 0x14, 0x58, 0x9a, 0x42, 0xb3, 0x57, 0x23, 0xc1, 0xda, 0x68, 0xbc, 0xc2, 0x59, - 0x64, 0xe5, 0x43, 0x73, 0x87, 0x64, 0x80, 0x1c, 0x31, 0x64, 0x9f, 0x58, 0xf6, 0x93, 0xd1, 0xc0, - 0xa6, 0x7d, 0x4d, 0x82, 0x27, 0xa0, 0x4b, 0xeb, 0xfa, 0xfb, 0x9b, 0x5b, 0x0b, 0x34, 0x01, 0x03, - 0xa0, 0x40, 0x2d, 0xe2, 0x6b, 0x70, 0x51, 0xa4, 0x79, 0xa5, 0xfa, 0x47, 0xe7, 0x76, 0x9d, 0x60, - 0xa4, 0x63, 0xeb, 0x18, 0xa8, 0x5c, 0x7a, 0xf0, 0x31, 0xe3, 0xb1, 0xa5, 0xa0, 0x62, 0xaf, 0xff, - 0x87, 0x9b, 0xef, 0xdf, 0x43, 0xb4, 0xa6, 0x40, 0x27, 0x58, 0x40, 0x7c, 0x0f, 0x1a, 0x05, 0x48, - 0x36, 0x5d, 0xac, 0x5d, 0xd9, 0xc2, 0xce, 0x8c, 0xb2, 0x69, 0x9b, 0xb2, 0xe9, 0x57, 0x51, 0xc5, - 0x52, 0xe9, 0x80, 0xa0, 0xe1, 0x89, 0xd2, 0x43, 0xa6, 0xf4, 0x40, 0xb5, 0x1e, 0xbe, 0x7b, 0x05, - 0x6a, 0x60, 0xf2, 0x39, 0x46, 0x63, 0xce, 0xea, 0xc8, 0x85, 0x12, 0x50, 0x16, 0x9e, 0x3e, 0x6d, - 0xda, 0x6b, 0xb0, 0x01, 0x18, 0xa9, 0x84, 0x66, 0xd1, 0xdd, 0xe6, 0x07, 0xdc, 0x6d, 0x06, 0x74, - 0x4d, 0xda, 0xdb, 0x8e, 0x75, 0x48, 0x69, 0x02, 0xa7, 0x4b, 0xae, 0x11, 0xb1, 0x35, 0x55, 0x03, - 0x37, 0xb9, 0xeb, 0x02, 0x0a, 0x39, 0x04, 0xec, 0x7d, 0x02, 0x72, 0x0b, 0x0a, 0xd3, 0x47, 0x2d, - 0xc4, 0x99, 0xed, 0x86, 0x50, 0x03, 0x6f, 0x55, 0xe7, 0xde, 0xd7, 0x1d, 0x3c, 0x0a, 0xdd, 0x9a, - 0x69, 0x6d, 0x3d, 0x61, 0x86, 0xbd, 0x87, 0x86, 0xa9, 0xbb, 0xf8, 0x0e, 0x18, 0xa4, 0x46, 0x0f, - 0xd6, 0x47, 0x9b, 0x81, 0x3d, 0x39, 0x1b, 0x8d, 0x6a, 0xda, 0x58, 0x6e, 0x35, 0x2f, 0x95, 0x33, - 0x78, 0xbb, 0x89, 0x7f, 0x78, 0x8f, 0x73, 0xda, 0x80, 0xdf, 0x43, 0xd6, 0x64, 0x69, 0x89, 0x42, - 0xae, 0x42, 0x66, 0x9d, 0x18, 0xce, 0x35, 0x09, 0x69, 0xb6, 0x6f, 0xc1, 0xa8, 0x20, 0x71, 0x33, - 0x17, 0x37, 0x79, 0xc2, 0x7c, 0xd0, 0x89, 0x6c, 0x56, 0x2b, 0x37, 0x18, 0xbf, 0xb5, 0x35, 0x45, - 0x95, 0xad, 0x54, 0x3f, 0x3f, 0x2d, 0xca, 0xe5, 0xc0, 0xb4, 0x9d, 0xf7, 0xdd, 0xa5, 0xc4, 0xc0, - 0xde, 0x5e, 0x04, 0x7c, 0x02, 0x74, 0x67, 0x39, 0x01, 0x7e, 0x88, 0x0d, 0x39, 0x10, 0x97, 0xcb, - 0x82, 0xe9, 0x72, 0xdf, 0x12, 0x02, 0xd6, 0x5c, 0xd0, 0xb7, 0x77, 0x91, 0xa8, 0xba, 0xfc, 0x81, - 0x8d, 0x2b, 0x87, 0x0e, 0x5c, 0x72, 0x85, 0x81, 0xab, 0x37, 0xd5, 0xa2, 0x76, 0xcc, 0x2a, 0xbb, - 0x5a, 0x60, 0x50, 0xb6, 0xc6, 0xd3, 0xa2, 0xbe, 0x00, 0xe8, 0x14, 0x73, 0x77, 0x01, 0x31, 0xb0, - 0xb7, 0x7a, 0xff, 0xfd, 0xb0, 0xdb, 0x2b, 0x88, 0x81, 0xbd, 0xb7, 0xd7, 0xdf, 0x8f, 0x6c, 0xff, - 0x6a, 0xa2, 0x81, 0xba, 0xd1, 0xee, 0x3f, 0x1a, 0x6b, 0x73, 0x19, 0x01, 0xba, 0xd2, 0xed, 0xfc, - 0xb4, 0xe8, 0xd6, 0xef, 0xce, 0xc2, 0x01, 0xb2, 0x1a, 0x34, 0xff, 0xdd, 0x13, 0xe5, 0x52, 0x01, - 0x5a, 0x69, 0xdb, 0xca, 0x80, 0x18, 0xfb, 0xa2, 0xc2, 0xdd, 0xbb, 0x38, 0xd0, 0xbb, 0x01, 0xe4, - 0x42, 0xa6, 0x81, 0xcb, 0x1e, 0xee, 0x92, 0x14, 0x0b, 0x00, 0x71, 0x16, 0x34, 0x0a, 0xc2, 0xf5, - 0x54, 0xf9, 0xaa, 0x93, 0x07, 0xb6, 0xa3, 0xb6, 0x1d, 0xd4, 0x80, 0xfd, 0x22, 0x0c, 0xe2, 0xbb, - 0x77, 0xd4, 0xbd, 0x91, 0x8f, 0xdf, 0x02, 0x84, 0x0d, 0xd5, 0x71, 0xc9, 0x19, 0xf9, 0xe1, 0x8d, - 0x65, 0x7f, 0xe0, 0x73, 0x2e, 0xb8, 0x6d, 0xbd, 0x66, 0xe1, 0x3d, 0x13, 0x50, 0x70, 0xc8, 0x7b, - 0x96, 0x43, 0xfd, 0x79, 0x9e, 0x42, 0x47, 0x65, 0x5b, 0xef, 0xe1, 0x25, 0xb9, 0xa1, 0x31, 0x34, - 0xa6, 0x19, 0xfc, 0x76, 0xc0, 0x0b, 0x83, 0x85, 0x6d, 0x3d, 0x47, 0x02, 0xe4, 0x0a, 0xb7, 0x44, - 0xc8, 0xab, 0x88, 0x7f, 0x0c, 0xac, 0x0a, 0xe7, 0xee, 0xc0, 0xcd, 0x3a, 0x9a, 0xf3, 0xd0, 0xd2, - 0xd8, 0xea, 0x50, 0xe7, 0xc0, 0x1b, 0x73, 0x7c, 0xe9, 0x78, 0xd3, 0xf1, 0xf0, 0x78, 0x33, 0xcf, - 0x85, 0xe0, 0xb1, 0x1d, 0xc4, 0x49, 0x2e, 0x6c, 0x9e, 0x88, 0x65, 0xca, 0xf3, 0x04, 0x94, 0x13, - 0x32, 0x57, 0xd8, 0x02, 0xf4, 0x0c, 0xfd, 0x09, 0x6d, 0x88, 0x1d, 0xc4, 0x3e, 0xf0, 0x24, 0xce, - 0xe5, 0x58, 0x16, 0xfc, 0xca, 0xa6, 0xe3, 0xd1, 0xe8, 0x1f, 0xb6, 0x10, 0x8f, 0x8f, 0xcf, 0x23, - 0x9a, 0x2e, 0x83, 0x78, 0x3a, 0x6a, 0x90, 0x28, 0x38, 0x04, 0xe8, 0x22, 0xe4, 0xab, 0xe9, 0x7d, - 0x90, 0x05, 0xf3, 0x90, 0x99, 0xb7, 0x8a, 0x62, 0x81, 0x14, 0x1d, 0x91, 0x82, 0xe4, 0x0b, 0x9e, - 0x46, 0x53, 0xec, 0xb2, 0x37, 0x7f, 0x15, 0x50, 0xa0, 0x67, 0x6a, 0xde, 0x4f, 0xb6, 0x7a, 0x92, - 0xde, 0x69, 0x1e, 0xb2, 0x7c, 0x1e, 0x05, 0xf0, 0xa4, 0xa6, 0x14, 0xb8, 0xef, 0x73, 0x17, 0x08, - 0x34, 0x0a, 0x94, 0x03, 0x1a, 0xbb, 0x6c, 0xaa, 0xde, 0x34, 0x31, 0x4d, 0xa7, 0x4e, 0xc4, 0x7f, - 0x75, 0x16, 0xd0, 0x9e, 0x66, 0x8e, 0xac, 0x22, 0x0d, 0xdc, 0x9d, 0xaf, 0x35, 0xb5, 0x96, 0xf7, - 0x0a, 0xf1, 0xee, 0x8b, 0x62, 0x0e, 0xee, 0xcb, 0x52, 0x47, 0x3a, 0x92, 0x94, 0xe9, 0x3c, 0x81, - 0xba, 0x8f, 0x01, 0x34, 0xda, 0xe2, 0xa9, 0x02, 0xc5, 0x6e, 0xa3, 0xc9, 0x50, 0xeb, 0x3b, 0xc3, - 0xcd, 0xd6, 0x4b, 0xcd, 0x4a, 0x73, 0xb4, 0x80, 0x12, 0x87, 0x66, 0x9a, 0x8e, 0x93, 0x07, 0xe2, - 0x71, 0x21, 0x98, 0x47, 0x5e, 0xc8, 0x89, 0x18, 0x50, 0x9b, 0x45, 0xc0, 0x42, 0x0f, 0x28, 0x15, - 0x86, 0xb9, 0xe1, 0xe1, 0x31, 0x8b, 0xc8, 0xf0, 0x54, 0xfe, 0x3e, 0x99, 0xc0, 0xc7, 0x26, 0x64, - 0x4b, 0xa8, 0x07, 0x20, 0xd0, 0x03, 0x9a, 0x1e, 0x27, 0x69, 0xd9, 0x60, 0xe4, 0x5c, 0xee, 0xd8, - 0x95, 0xfe, 0xa1, 0xeb, 0xe6, 0x54, 0xe0, 0xde, 0x1b, 0x78, 0xc3, 0x83, 0xda, 0x23, 0x54, 0xde, - 0x52, 0xca, 0x7f, 0x0e, 0x2d, 0x8c, 0x80, 0xd0, 0x49, 0xa8, 0x8b, 0xaa, 0x49, 0x23, 0x1a, 0x6e, - 0x92, 0x14, 0x52, 0x1b, 0xd4, 0xf7, 0x02, 0x7c, 0x05, 0x23, 0x24, 0x74, 0x20, 0x93, 0x2c, 0xe3, - 0xe9, 0x1c, 0x7a, 0x7b, 0xe4, 0x7f, 0x53, 0xfa, 0x65, 0xe9, 0x4d, 0x14, 0x56, 0x47, 0x5a, 0x95, - 0xae, 0xcf, 0xdc, 0x3b, 0x60, 0xa7, 0x74, 0x15, 0xea, 0x05, 0xfc, 0xa7, 0x0e, 0x96, 0xb7, 0xed, - 0x10, 0xcb, 0x34, 0x86, 0xc6, 0xd5, 0x4e, 0x24, 0x0d, 0x08, 0xec, 0x05, 0xb1, 0xa3, 0x3d, 0xb5, - 0x63, 0x22, 0xe8, 0xb6, 0x39, 0xb1, 0xd0, 0xc1, 0x50, 0x63, 0x4d, 0x2d, 0xd1, 0x7f, 0x6a, 0xf3, - 0x50, 0x14, 0x49, 0x1a, 0xe0, 0x5c, 0x1b, 0xc9, 0xd1, 0x15, 0xc4, 0x99, 0x24, 0x0f, 0x4d, 0xf0, - 0x8a, 0xa6, 0x1a, 0x70, 0x3c, 0xe6, 0x72, 0x95, 0x67, 0xdb, 0x30, 0xcb, 0x18, 0xaa, 0x60, 0x16, - 0xb8, 0x33, 0x9a, 0x27, 0xd8, 0x05, 0x3a, 0x9f, 0x0a, 0x18, 0x19, 0xe3, 0xc6, 0xa0, 0x1b, 0x8f, - 0x09, 0x1a, 0x84, 0x59, 0x61, 0x0c, 0x2b, 0xdb, 0xa8, 0x4d, 0x96, 0x47, 0x10, 0xe9, 0xeb, 0x72, - 0x34, 0x84, 0x46, 0xd6, 0x01, 0x93, 0x46, 0x1b, 0x2c, 0x25, 0x21, 0x15, 0xac, 0x7c, 0xa5, 0xa2, - 0x59, 0xb5, 0x51, 0x3f, 0x35, 0x47, 0x25, 0xae, 0x5f, 0x72, 0x2e, 0x98, 0xed, 0x79, 0xb6, 0x17, - 0xda, 0x8b, 0x60, 0x09, 0x25, 0xc8, 0xf6, 0xc7, 0xb6, 0x3f, 0xb1, 0xfd, 0x43, 0xdb, 0x3f, 0xb2, - 0xfd, 0x63, 0xdb, 0x3f, 0xb1, 0xfd, 0xd4, 0x4e, 0xec, 0x24, 0x65, 0xc5, 0x56, 0x7e, 0x29, 0xe6, - 0xd4, 0xbd, 0xc3, 0xec, 0x15, 0x7b, 0x6a, 0xeb, 0x78, 0x2a, 0xd3, 0x08, 0xb4, 0x47, 0xb8, 0x51, - 0x5b, 0x7b, 0x19, 0x44, 0x50, 0x06, 0x34, 0x55, 0x15, 0x25, 0x32, 0x40, 0x5a, 0x82, 0xc3, 0x98, - 0x62, 0x7a, 0x0c, 0x43, 0x68, 0x46, 0x52, 0x2a, 0x51, 0x06, 0x37, 0xc6, 0x94, 0xa2, 0x55, 0xc5, - 0x8e, 0xe1, 0xaa, 0xe6, 0x59, 0x3c, 0xb4, 0xf3, 0xb0, 0x90, 0x7a, 0xa9, 0x65, 0x80, 0x96, 0x89, - 0xff, 0x3f, 0x2b, 0xcc, 0x3f, 0xd9, 0xd3, 0x29, 0x5d, 0x40, 0x70, 0xc0, 0xe7, 0x9c, 0x41, 0x5a, - 0x67, 0x1d, 0xb1, 0xa8, 0xbf, 0xaa, 0x2c, 0x31, 0x3a, 0x6f, 0x24, 0xcd, 0x8c, 0x87, 0x81, 0x67, - 0x86, 0x94, 0x79, 0x9f, 0xb2, 0x09, 0x7b, 0xb6, 0x00, 0xad, 0x95, 0xf9, 0x55, 0xf0, 0xc4, 0xe4, - 0x18, 0x88, 0x99, 0x20, 0x5a, 0x16, 0xbb, 0x38, 0xaa, 0xdc, 0x01, 0x19, 0x06, 0x8b, 0x97, 0xc9, - 0x31, 0x1b, 0x59, 0x9f, 0x20, 0x63, 0x62, 0xd2, 0x86, 0x6f, 0x0e, 0x38, 0xa7, 0xcb, 0x7c, 0x1e, - 0x02, 0x82, 0xb2, 0x10, 0xb6, 0xbf, 0x2e, 0x34, 0x43, 0x74, 0x44, 0x99, 0x3b, 0xd2, 0x88, 0x3e, - 0x85, 0xe9, 0x73, 0x50, 0xb5, 0x23, 0xe8, 0x06, 0xfb, 0x2b, 0x74, 0x35, 0x55, 0xc5, 0xd4, 0xf1, - 0xe1, 0xe6, 0x69, 0x06, 0x73, 0x12, 0x1e, 0x40, 0x93, 0x97, 0x6e, 0x64, 0x5a, 0x2e, 0x2a, 0x8d, - 0x86, 0x34, 0xc9, 0xd8, 0xd4, 0x7c, 0xd9, 0xec, 0x04, 0x5e, 0x51, 0xd5, 0xfb, 0x46, 0x07, 0xa0, - 0x9a, 0xd8, 0x32, 0x49, 0x0c, 0x8d, 0x41, 0x9d, 0xa3, 0xa2, 0xb4, 0x2d, 0xd0, 0x8f, 0xb4, 0x65, - 0x8e, 0xc0, 0x32, 0xc3, 0xe4, 0x01, 0xde, 0x6a, 0xbf, 0x77, 0x42, 0xb6, 0x00, 0x47, 0x49, 0x59, - 0x64, 0x22, 0x01, 0xe2, 0x4a, 0xfa, 0x0e, 0x0c, 0xc1, 0xd4, 0xb5, 0x33, 0x29, 0xa7, 0x82, 0x81, - 0xa7, 0xc3, 0xe3, 0xfa, 0x54, 0x85, 0x5b, 0x0d, 0x6e, 0x86, 0x91, 0x33, 0x36, 0x01, 0x38, 0x9c, - 0xe8, 0x21, 0x01, 0xf0, 0x6a, 0xac, 0x02, 0x07, 0xb4, 0xce, 0x61, 0x55, 0xe6, 0x4e, 0xcd, 0xd8, - 0xb8, 0x1a, 0xab, 0xc0, 0xc7, 0x0d, 0x70, 0x3d, 0x0e, 0x12, 0x8c, 0x9b, 0x12, 0xa8, 0x37, 0x5b, - 0x32, 0x94, 0xd3, 0xd7, 0xb5, 0xe9, 0x15, 0x9e, 0x1d, 0x31, 0x2a, 0xec, 0x27, 0x5b, 0xfa, 0x19, - 0xb6, 0x60, 0x1f, 0x0f, 0x4b, 0xec, 0xcf, 0x1a, 0xd8, 0x27, 0x2d, 0xb8, 0x27, 0x72, 0x6a, 0xb8, - 0xfc, 0x57, 0x59, 0x6a, 0x1c, 0xac, 0xa5, 0x35, 0x93, 0x2a, 0x65, 0xfb, 0xce, 0x71, 0x51, 0x46, - 0xae, 0xe6, 0x65, 0xe5, 0x60, 0xe6, 0x2b, 0x94, 0xf5, 0x64, 0x2d, 0x1b, 0x4a, 0x04, 0xb0, 0xf8, - 0x58, 0x3b, 0x47, 0xa3, 0x51, 0xe1, 0x38, 0xf2, 0x99, 0x43, 0x05, 0x0f, 0xc4, 0x7a, 0x3a, 0xd6, - 0x6d, 0xc0, 0x53, 0x77, 0xee, 0x1d, 0xb3, 0x91, 0x7e, 0x4a, 0x97, 0x73, 0xda, 0x9f, 0x8c, 0x0e, - 0xed, 0xc9, 0x18, 0x7e, 0x26, 0x47, 0x36, 0xac, 0x6e, 0xfb, 0x4d, 0xc8, 0xc1, 0x60, 0x33, 0x5c, - 0xa6, 0x81, 0x57, 0x16, 0x06, 0x7c, 0x50, 0x43, 0xe8, 0x9f, 0x19, 0x68, 0x50, 0x7e, 0x37, 0x65, - 0x05, 0x07, 0xf3, 0x28, 0xce, 0xa6, 0x29, 0x83, 0xb2, 0x25, 0xfa, 0xf2, 0xb4, 0x11, 0xda, 0x8c, - 0xfe, 0xc8, 0x1e, 0x2f, 0x52, 0x83, 0x4d, 0x81, 0x4e, 0xf6, 0x83, 0x4e, 0x76, 0x40, 0xa5, 0x66, - 0x20, 0xc3, 0x79, 0x45, 0xdd, 0xc9, 0x4f, 0x47, 0x23, 0x2d, 0x7d, 0x16, 0xd5, 0x94, 0x37, 0x7c, - 0xa6, 0x3d, 0x28, 0x88, 0x65, 0xf2, 0x5b, 0x84, 0xec, 0xa1, 0x94, 0xa2, 0x36, 0x06, 0x13, 0x80, - 0x83, 0xcc, 0x71, 0x19, 0x46, 0x60, 0x21, 0x9b, 0x1a, 0x59, 0x2a, 0xb3, 0xa9, 0x1a, 0xd2, 0xc8, - 0x05, 0x83, 0x96, 0x67, 0x9f, 0x6a, 0x8f, 0x16, 0xde, 0xd8, 0x3d, 0xae, 0xab, 0xf6, 0xf4, 0xcc, - 0x9e, 0x8c, 0xce, 0xec, 0xf1, 0xd9, 0x69, 0x87, 0x66, 0xe7, 0x4b, 0x47, 0x76, 0x5a, 0x80, 0x13, - 0xbe, 0x56, 0x18, 0x77, 0xaa, 0xe6, 0xd3, 0xc5, 0x62, 0xb1, 0x3b, 0xaa, 0xec, 0x77, 0x7c, 0x6c, - 0x9b, 0x1f, 0x45, 0xa5, 0x42, 0x85, 0x34, 0x24, 0x00, 0xf3, 0x9c, 0xb0, 0x4c, 0xbc, 0xd8, 0x7b, - 0xe5, 0x99, 0x09, 0xba, 0xcc, 0xa7, 0x1e, 0x5f, 0xa1, 0xee, 0x64, 0x01, 0x90, 0x4f, 0xd3, 0x11, - 0xc1, 0x82, 0x0b, 0x4d, 0x0e, 0x19, 0x11, 0x49, 0x65, 0x64, 0xe3, 0xdf, 0xe1, 0xe8, 0x78, 0x60, - 0x92, 0x49, 0xd1, 0xa8, 0x0c, 0x98, 0xdb, 0x4d, 0x96, 0x59, 0xb3, 0x10, 0xba, 0x3f, 0xe7, 0x54, - 0xea, 0x4a, 0x8f, 0xd5, 0x64, 0x6b, 0x94, 0x8b, 0xf9, 0xe9, 0xe9, 0xd9, 0x78, 0xd1, 0x1c, 0x94, - 0x04, 0xc7, 0xcf, 0x0e, 0xed, 0xf1, 0x64, 0x6c, 0x1f, 0x8e, 0x8d, 0x54, 0x0d, 0x44, 0x5a, 0x7b, - 0x9a, 0xd4, 0x89, 0x22, 0xb5, 0x5f, 0x85, 0xde, 0xc9, 0x19, 0x14, 0xa7, 0x2e, 0x2d, 0x8e, 0x8f, - 0xec, 0xf1, 0xf1, 0x33, 0xfb, 0xe8, 0xe4, 0x4b, 0x94, 0x28, 0x5f, 0xd7, 0x95, 0x38, 0x02, 0x0d, - 0x8e, 0xb1, 0x51, 0x71, 0x0e, 0xe1, 0x57, 0x5d, 0x93, 0xe3, 0x81, 0x3d, 0x22, 0x90, 0x77, 0xc9, - 0x09, 0xbe, 0x9d, 0x6c, 0xbd, 0x95, 0x7a, 0x8e, 0x3c, 0x9d, 0x16, 0x1e, 0xc2, 0x7a, 0x52, 0x30, - 0x39, 0xa0, 0x12, 0xff, 0xf0, 0x31, 0xe2, 0x2f, 0xe8, 0x62, 0xf4, 0xec, 0xac, 0xd3, 0x89, 0x46, - 0xf6, 0xe4, 0x08, 0x02, 0xed, 0xf0, 0xb4, 0x55, 0x7e, 0x98, 0x8a, 0xab, 0x81, 0xd8, 0xc4, 0xac, - 0x0a, 0xd5, 0x29, 0x0e, 0x91, 0xc9, 0x81, 0xfa, 0x90, 0x1c, 0xcd, 0x61, 0xf1, 0xef, 0x1c, 0x3f, - 0x86, 0x9f, 0xa3, 0xc9, 0xd9, 0x19, 0x1b, 0x77, 0xf0, 0x73, 0x72, 0x02, 0xd6, 0xc0, 0x9c, 0xd4, - 0xea, 0xd3, 0x4a, 0x2b, 0x26, 0x72, 0xda, 0xa3, 0x11, 0x03, 0x66, 0x6f, 0x94, 0x6c, 0xc5, 0xa2, - 0x29, 0x8b, 0xc8, 0xff, 0xa3, 0x3c, 0x77, 0x32, 0x3f, 0x71, 0xe7, 0xa3, 0x16, 0xcf, 0x3d, 0x02, - 0xc7, 0x1d, 0x3d, 0xb3, 0xc7, 0xa7, 0x27, 0x9d, 0x9e, 0xab, 0xdd, 0x69, 0xdb, 0x97, 0xb4, 0x61, - 0x8d, 0xb3, 0x45, 0x3b, 0x13, 0x0e, 0x55, 0x4a, 0xc3, 0x7d, 0x10, 0xb9, 0xfd, 0x41, 0x2e, 0x0e, - 0xf4, 0xad, 0x90, 0x39, 0xf7, 0xd6, 0x44, 0x6f, 0x23, 0x5b, 0xe6, 0xde, 0x83, 0x45, 0xe4, 0xb4, - 0x99, 0xd5, 0x12, 0x0c, 0x67, 0xde, 0x91, 0x2b, 0xaf, 0x7e, 0x78, 0xc1, 0x3d, 0xe9, 0xb9, 0x21, - 0xcd, 0xb2, 0x99, 0x85, 0x97, 0x37, 0x28, 0x24, 0xc6, 0x94, 0x44, 0x0f, 0xb2, 0xc2, 0x10, 0x2c, - 0x7a, 0x04, 0x4b, 0x99, 0x99, 0xaa, 0x67, 0xa2, 0x17, 0x90, 0x5a, 0x15, 0x28, 0x31, 0x05, 0x40, - 0xdf, 0xbd, 0x2f, 0x29, 0xd7, 0xd7, 0x13, 0x96, 0x01, 0xc6, 0x05, 0x22, 0x0c, 0x5a, 0x97, 0xc8, - 0x26, 0xc1, 0x7b, 0x1f, 0x44, 0xdf, 0xfb, 0x80, 0x2e, 0x76, 0x38, 0x1c, 0x5e, 0x1c, 0x00, 0x2a, - 0xbc, 0xfb, 0x11, 0xf3, 0x72, 0xbf, 0xa7, 0x46, 0xdb, 0x80, 0x1b, 0x1a, 0xa5, 0x85, 0xac, 0xcb, - 0xde, 0x0d, 0x4f, 0xd3, 0xb5, 0xdd, 0xc4, 0x19, 0x33, 0xe6, 0x65, 0xe4, 0x0f, 0xf4, 0x9e, 0xde, - 0x48, 0x6c, 0x4f, 0x34, 0xfe, 0x8b, 0x83, 0x76, 0xfc, 0xa5, 0x16, 0x2c, 0xd2, 0xd3, 0x24, 0xea, - 0xf5, 0x66, 0x2e, 0x9b, 0x3b, 0x14, 0x38, 0x0f, 0x0d, 0x08, 0x16, 0x12, 0x52, 0x55, 0x60, 0x08, - 0x00, 0xa2, 0x2b, 0x12, 0x09, 0x97, 0x55, 0x6d, 0x07, 0x06, 0xc9, 0x45, 0x18, 0x18, 0xa8, 0x5a, - 0x15, 0x22, 0xf5, 0x22, 0x84, 0xb8, 0x29, 0xf1, 0x53, 0xb6, 0x98, 0x59, 0x07, 0xd6, 0xe5, 0x6b, - 0x1e, 0xb1, 0x8b, 0x03, 0x8a, 0x9b, 0x5e, 0xf7, 0xcb, 0xd2, 0x56, 0xd0, 0x16, 0x10, 0xd5, 0x06, - 0x90, 0x46, 0xe9, 0xb7, 0x08, 0x2c, 0x26, 0x43, 0x90, 0x22, 0x4f, 0x71, 0x91, 0x75, 0xa5, 0x2e, - 0xec, 0xe0, 0x55, 0xa1, 0x17, 0xfc, 0x61, 0x66, 0x8d, 0x20, 0xa3, 0x4f, 0xf0, 0x9f, 0x75, 0x80, - 0x1a, 0x08, 0x83, 0xcf, 0x67, 0xe9, 0x69, 0x69, 0xc8, 0x46, 0x61, 0xb4, 0x94, 0xf1, 0x93, 0xd0, - 0xba, 0x54, 0xdc, 0x22, 0x72, 0xf8, 0x9d, 0xe3, 0x6d, 0x26, 0xad, 0x71, 0xd4, 0x32, 0x4e, 0x32, - 0x47, 0xb9, 0xa5, 0x34, 0xd2, 0x9f, 0x4c, 0x39, 0x24, 0x55, 0xba, 0x25, 0x65, 0x79, 0x22, 0xd0, - 0x09, 0x12, 0xec, 0xfc, 0x90, 0x95, 0xa4, 0x54, 0xbc, 0x69, 0x09, 0x40, 0xb5, 0xb7, 0x3e, 0x8d, - 0xef, 0xc8, 0x9a, 0xe7, 0xe4, 0x3f, 0xff, 0xed, 0x3f, 0x08, 0xac, 0x69, 0x48, 0x10, 0x67, 0x82, - 0x86, 0x21, 0x1e, 0xc3, 0x08, 0x9f, 0x49, 0xaf, 0x88, 0xb4, 0x53, 0xdc, 0xf0, 0x85, 0x58, 0x41, - 0xcb, 0x3e, 0x24, 0xff, 0xf5, 0xef, 0x7f, 0xff, 0xdb, 0xc5, 0x41, 0x82, 0x58, 0x2f, 0x7b, 0x7f, - 0x01, 0x68, 0x9f, 0x82, 0xf3, 0xb0, 0x18, 0x5b, 0x71, 0x4f, 0xc2, 0x95, 0xa7, 0x68, 0xef, 0xb8, - 0x07, 0x00, 0x6f, 0x62, 0x82, 0x67, 0x68, 0xe4, 0x47, 0x36, 0x97, 0x5d, 0xfb, 0x02, 0x3a, 0x7e, - 0x49, 0x76, 0x05, 0x8a, 0x27, 0x73, 0x46, 0x10, 0x92, 0x80, 0x5d, 0x60, 0xe9, 0x89, 0xe3, 0x29, - 0x5e, 0x97, 0x82, 0xa5, 0x73, 0x36, 0x04, 0x97, 0xd6, 0x84, 0xbe, 0x05, 0x16, 0xb2, 0x7c, 0xb9, - 0x64, 0x19, 0xee, 0x10, 0x64, 0x84, 0xc6, 0xb8, 0xeb, 0x03, 0x24, 0x60, 0xbd, 0x07, 0x8e, 0x42, - 0x96, 0x1c, 0x11, 0x44, 0x6b, 0xd4, 0x7a, 0x4f, 0xa9, 0xdd, 0x17, 0x22, 0xc9, 0xa6, 0x07, 0x07, - 0xcb, 0x40, 0xf8, 0xf9, 0x1c, 0x52, 0x72, 0x74, 0x70, 0xf3, 0x82, 0x7e, 0xe4, 0xb1, 0xfb, 0x2b, - 0xbd, 0x3b, 0xf0, 0x2b, 0xd9, 0xac, 0xcb, 0xef, 0xe4, 0x14, 0x92, 0xa4, 0xfc, 0x23, 0x73, 0x05, - 0x5a, 0x43, 0xd1, 0x35, 0x71, 0x65, 0xcc, 0x50, 0x3b, 0x83, 0x6e, 0x0d, 0xd8, 0xcf, 0x8a, 0x0b, - 0xc8, 0x9a, 0x96, 0x52, 0xe2, 0x5b, 0x26, 0xfe, 0x31, 0x53, 0xa7, 0xab, 0x28, 0x85, 0x3c, 0xe4, - 0x95, 0x7a, 0x50, 0xf7, 0x54, 0xc8, 0xb5, 0x96, 0x11, 0xd4, 0x43, 0x89, 0x82, 0x26, 0x7c, 0x41, - 0xc6, 0xa4, 0x0f, 0x44, 0x07, 0xe4, 0x5f, 0xf4, 0x2e, 0xba, 0x0d, 0xba, 0x74, 0x69, 0x0e, 0x33, - 0xa5, 0xba, 0x8d, 0x76, 0x31, 0x9c, 0xc1, 0x30, 0x41, 0x2c, 0x6d, 0x23, 0x91, 0xe3, 0x59, 0x6d, - 0x5d, 0xbb, 0x1f, 0x40, 0x15, 0x60, 0x43, 0x30, 0xbd, 0x41, 0xbf, 0x48, 0x79, 0x24, 0xe7, 0x4b, - 0x16, 0xa4, 0xba, 0xdd, 0x30, 0x70, 0xef, 0x88, 0x3e, 0xbf, 0x1e, 0x2a, 0x50, 0xb5, 0x2a, 0x53, - 0x8e, 0x3c, 0x17, 0x31, 0x22, 0xb7, 0x20, 0xad, 0xca, 0xa9, 0xe0, 0xee, 0xf5, 0x4b, 0x18, 0x0d, - 0x37, 0x84, 0x75, 0x9b, 0x13, 0xd2, 0x39, 0x03, 0xdf, 0xff, 0x8e, 0x93, 0x17, 0x90, 0x6e, 0xb5, - 0xc2, 0x15, 0x42, 0x8c, 0x31, 0x8d, 0xba, 0x1d, 0x73, 0xed, 0x24, 0xba, 0x0b, 0xaf, 0xe4, 0x53, - 0x62, 0xed, 0x95, 0x68, 0xcb, 0xb8, 0xda, 0x0a, 0xaf, 0xda, 0x45, 0x8c, 0x7d, 0x76, 0xed, 0xed, - 0x1a, 0x76, 0xaf, 0x5d, 0xaf, 0x71, 0x6d, 0xbb, 0xd7, 0x64, 0x84, 0xc7, 0x95, 0x96, 0x9b, 0x3a, - 0x6d, 0x08, 0xde, 0xab, 0x74, 0x5a, 0x9d, 0xf5, 0x77, 0x49, 0xfe, 0x1e, 0xb2, 0x0c, 0xc1, 0x39, - 0x4d, 0x9d, 0x56, 0xee, 0xdc, 0x25, 0xfd, 0xe4, 0x6b, 0x7a, 0xf5, 0x15, 0x8f, 0x97, 0x78, 0x04, - 0x13, 0xca, 0x3d, 0xbd, 0xec, 0x09, 0xb9, 0xf5, 0xf5, 0xd5, 0x05, 0x02, 0xce, 0x19, 0xf3, 0x95, - 0x3c, 0x73, 0x5e, 0xa3, 0xc3, 0x83, 0xcb, 0x0e, 0xb5, 0xa5, 0xf6, 0x5a, 0xfd, 0xb3, 0xfd, 0xe9, - 0x11, 0x96, 0x2f, 0xaf, 0xd0, 0xec, 0xc8, 0x47, 0xb6, 0x6a, 0x36, 0x5e, 0xda, 0xec, 0x5d, 0xc8, - 0xde, 0xcd, 0x38, 0x42, 0xa3, 0xa3, 0x26, 0xaa, 0xf9, 0xc0, 0x9c, 0x3b, 0x81, 0xe4, 0x7b, 0x48, - 0x76, 0xda, 0xfb, 0x96, 0x3c, 0x0d, 0xdf, 0xca, 0x94, 0x4c, 0x22, 0xcf, 0xf4, 0xaf, 0xa4, 0x6a, - 0x20, 0xb1, 0x48, 0x6b, 0x1e, 0x2f, 0x64, 0xe7, 0x88, 0x75, 0xad, 0x9d, 0x89, 0xc3, 0xff, 0x51, - 0x26, 0xe4, 0x36, 0x5d, 0x93, 0x85, 0xed, 0xa2, 0xa2, 0x2a, 0x6b, 0x04, 0x48, 0xb0, 0xec, 0xdc, - 0x98, 0xa3, 0x53, 0xd2, 0x0f, 0xf0, 0x2c, 0xd7, 0x1d, 0x0e, 0x34, 0x78, 0xef, 0x42, 0xee, 0x09, - 0x19, 0x78, 0xac, 0x54, 0x35, 0x06, 0xe0, 0x49, 0x4b, 0x51, 0xb1, 0x6a, 0x49, 0x6b, 0xed, 0x9c, - 0xc9, 0x6e, 0xeb, 0xa2, 0x83, 0x93, 0x3f, 0x5d, 0x5d, 0x11, 0x75, 0x14, 0x8b, 0x87, 0xc6, 0x9a, - 0x09, 0xcd, 0x43, 0xef, 0x37, 0x32, 0xb1, 0x73, 0xba, 0xfb, 0x3b, 0xd9, 0xe5, 0xc7, 0x60, 0x11, - 0x7c, 0x96, 0x55, 0x6e, 0xde, 0xbc, 0xfc, 0x42, 0x0d, 0x34, 0xce, 0x2a, 0x1f, 0x69, 0x82, 0x6b, - 0x7d, 0x00, 0xfa, 0x95, 0x48, 0x97, 0xe7, 0xa9, 0xbf, 0x57, 0x34, 0x60, 0x22, 0xfb, 0x1c, 0xb5, - 0xff, 0xa8, 0x6a, 0xc0, 0xf7, 0xf2, 0x3c, 0xe4, 0x4b, 0x3d, 0x70, 0xf7, 0xe0, 0xfd, 0x91, 0x56, - 0x28, 0xeb, 0xce, 0x4b, 0x75, 0xe2, 0xfe, 0x55, 0x18, 0xd9, 0x3e, 0xc5, 0x7f, 0x24, 0x2f, 0x57, - 0xd5, 0xc9, 0x3a, 0xb9, 0xad, 0x0e, 0xec, 0xbf, 0x80, 0xa5, 0x5e, 0xc5, 0xd3, 0xfe, 0xcb, 0x00, - 0x8f, 0x33, 0x59, 0xaf, 0xce, 0xe1, 0xb7, 0xf2, 0xf0, 0xbf, 0xc9, 0xdc, 0x97, 0xf3, 0xd6, 0xbc, - 0x52, 0xd0, 0x55, 0xfc, 0xcb, 0xca, 0x64, 0x1c, 0x90, 0xd4, 0x76, 0x0e, 0x88, 0x8f, 0xeb, 0xbb, - 0xa9, 0x19, 0x39, 0x32, 0x4b, 0x29, 0xb5, 0x32, 0xa8, 0xf8, 0xc2, 0x3d, 0x68, 0x5c, 0x9e, 0x1e, - 0x91, 0x6a, 0x73, 0x9b, 0x6c, 0xad, 0xe2, 0x0d, 0xae, 0xda, 0xe8, 0x71, 0x15, 0x23, 0x8d, 0x36, - 0x64, 0xeb, 0x3a, 0x67, 0x57, 0x35, 0x7e, 0x2e, 0x53, 0x24, 0xd1, 0xe1, 0xd2, 0x68, 0x47, 0x7a, - 0xbf, 0x4b, 0xe0, 0xbe, 0xfb, 0xe3, 0xed, 0x6d, 0x19, 0xb7, 0xaa, 0x17, 0x78, 0x4c, 0xd2, 0x94, - 0x77, 0x72, 0x8c, 0xf5, 0x13, 0xbd, 0x3c, 0xc0, 0xa7, 0x9e, 0x81, 0xac, 0xcd, 0xc3, 0xff, 0xc5, - 0x41, 0x60, 0xc1, 0xf2, 0xe6, 0xba, 0xa4, 0x24, 0xdb, 0x8e, 0xdf, 0x1a, 0x66, 0xf5, 0x6b, 0x41, - 0x8f, 0x0c, 0xae, 0x1f, 0xb2, 0x2f, 0x0e, 0xee, 0xea, 0x02, 0xd1, 0xff, 0x6e, 0x8a, 0x6f, 0x5e, - 0x49, 0x7a, 0x2c, 0x6d, 0x9e, 0x8a, 0xaf, 0x42, 0x17, 0xaf, 0x54, 0xed, 0xb4, 0xfb, 0x95, 0xff, - 0x7c, 0x13, 0xcf, 0xb3, 0xe4, 0xdc, 0x74, 0x91, 0xfb, 0xa2, 0xb5, 0x3b, 0x44, 0x4f, 0x1f, 0x1b, - 0xa2, 0x3b, 0xe1, 0xa9, 0x59, 0xae, 0x7b, 0x74, 0x2d, 0x26, 0x9b, 0x77, 0xde, 0x3a, 0xd7, 0x45, - 0xb8, 0x5a, 0xaf, 0x3a, 0xca, 0xad, 0x90, 0xac, 0xb5, 0xc7, 0x46, 0x10, 0x28, 0xb8, 0x90, 0xab, - 0x00, 0x08, 0xd8, 0x3b, 0x84, 0xf5, 0x36, 0xb0, 0x97, 0xa4, 0xce, 0x78, 0x44, 0x60, 0x55, 0x2a, - 0xcf, 0x66, 0xd4, 0x85, 0x07, 0x25, 0x52, 0x0a, 0x0a, 0x45, 0x4e, 0x41, 0x56, 0xfc, 0x3a, 0x6e, - 0x04, 0xaa, 0xce, 0x82, 0xb5, 0xab, 0x90, 0xed, 0xdb, 0x5e, 0xf2, 0xe0, 0xcf, 0x82, 0x8c, 0xa1, - 0x6c, 0x91, 0x90, 0x26, 0x94, 0xbc, 0x67, 0x79, 0xd9, 0x7b, 0x4e, 0xb2, 0x20, 0xc2, 0xe3, 0x5e, - 0x39, 0x11, 0x96, 0xbb, 0xc2, 0x97, 0x3c, 0xc8, 0xc5, 0x2a, 0x25, 0xf2, 0x74, 0x89, 0x04, 0xd0, - 0xce, 0x57, 0xc1, 0x5a, 0xca, 0x44, 0xe7, 0x19, 0x0f, 0x73, 0x50, 0x7e, 0x10, 0x43, 0xf2, 0x75, - 0xd6, 0xce, 0x48, 0xcd, 0x87, 0xcf, 0x9d, 0xad, 0x1c, 0x12, 0xa5, 0xce, 0x91, 0xb5, 0xb5, 0x9b, - 0xb4, 0x02, 0x2d, 0xf8, 0xf0, 0x83, 0x7b, 0x47, 0x8e, 0xde, 0x3a, 0xea, 0xde, 0x35, 0xaa, 0x27, - 0x81, 0xdf, 0xa6, 0x5c, 0xd0, 0xe7, 0x32, 0x65, 0x2c, 0xde, 0xa3, 0x51, 0x73, 0x9f, 0xf4, 0x73, - 0x75, 0x5a, 0xbf, 0xbd, 0x7a, 0xd9, 0xab, 0x29, 0xeb, 0xff, 0x82, 0xae, 0x1a, 0x1f, 0xb8, 0x9c, - 0xe3, 0xde, 0x5a, 0x6e, 0xe3, 0xe2, 0x7f, 0xfa, 0xfb, 0x6f, 0x84, 0x2b, 0x5b, 0xb0, 0x04, 0x38, - 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3b, 0xdb, 0x72, 0xdb, 0xc8, + 0x95, 0xef, 0xfc, 0x8a, 0x36, 0x5c, 0x99, 0x90, 0x5b, 0x00, 0x45, 0x52, 0x37, 0x8b, 0x12, 0x95, + 0x92, 0x65, 0x7b, 0xec, 0xac, 0xe5, 0x51, 0x2c, 0x4d, 0x26, 0xa9, 0xec, 0xd4, 0x54, 0x13, 0x68, + 0x92, 0xb0, 0x00, 0x34, 0x06, 0x68, 0x88, 0xe2, 0xa0, 0xf8, 0x09, 0xfb, 0x90, 0x97, 0x3c, 0x6c, + 0xd5, 0x56, 0x5e, 0xf2, 0x65, 0xf9, 0x82, 0xfd, 0x84, 0x9c, 0xd3, 0x17, 0xdc, 0x48, 0xd0, 0xf2, + 0xd8, 0xd9, 0x49, 0xc5, 0xb6, 0x44, 0xa2, 0xd1, 0xe7, 0x7e, 0xed, 0x8b, 0xcf, 0x9e, 0xbc, 0xf8, + 0xe6, 0xf2, 0xf6, 0x8f, 0xd7, 0x2f, 0xc9, 0x42, 0x84, 0xc1, 0x39, 0x39, 0xc3, 0x0f, 0x12, 0xd0, + 0x68, 0x3e, 0xb1, 0x58, 0x64, 0xe1, 0x00, 0xa3, 0x1e, 0x7c, 0x84, 0x4c, 0x50, 0x12, 0xd1, 0x90, + 0x4d, 0xac, 0x7b, 0x9f, 0x2d, 0x63, 0x9e, 0x08, 0x8b, 0x74, 0x5c, 0x1e, 0x09, 0x16, 0x89, 0x89, + 0xb5, 0xf4, 0x3d, 0xb1, 0x98, 0x78, 0xec, 0xde, 0x77, 0x99, 0x23, 0x1f, 0x6c, 0x3f, 0xf2, 0x85, + 0x4f, 0x03, 0x27, 0x75, 0x69, 0xc0, 0x26, 0x43, 0x3b, 0x84, 0x81, 0x30, 0x0b, 0xcd, 0xb3, 0x65, + 0x90, 0x76, 0xdc, 0x05, 0x4d, 0x52, 0x06, 0x48, 0x32, 0x31, 0x73, 0x9e, 0x59, 0x75, 0x62, 0x62, + 0xc1, 0x42, 0xe6, 0xb8, 0x3c, 0xe0, 0x89, 0x45, 0x0a, 0x72, 0x4f, 0x47, 0xf2, 0x4f, 0x05, 0x87, + 0x79, 0xb3, 0x62, 0xa9, 0xa5, 0x41, 0x69, 0x1c, 0x07, 0xcc, 0x09, 0xf9, 0xd4, 0x87, 0x8f, 0x25, + 0x9b, 0x3a, 0x30, 0xe0, 0xb8, 0x34, 0xa6, 0xd3, 0x80, 0x21, 0xa4, 0xf0, 0x45, 0xc0, 0xce, 0x5f, + 0xfb, 0xf7, 0xcc, 0xb9, 0xe2, 0xc0, 0x2c, 0x4f, 0xce, 0xf6, 0xd4, 0x18, 0xe9, 0x9c, 0xa5, 0x6e, + 0xe2, 0xc7, 0xe2, 0xbc, 0x73, 0x4f, 0x13, 0x22, 0xfc, 0x90, 0xf1, 0x4c, 0xd8, 0x17, 0xae, 0xc8, + 0x68, 0x70, 0x4d, 0xe7, 0x80, 0xfc, 0xcd, 0xbb, 0x17, 0x2f, 0xff, 0x60, 0xd9, 0xde, 0xc4, 0xe3, + 0x6e, 0x16, 0x02, 0xe9, 0xd3, 0x59, 0x16, 0xb9, 0xc2, 0xe7, 0x11, 0xe1, 0xd1, 0x5b, 0x4e, 0xbd, + 0x6e, 0x2f, 0x5f, 0xf8, 0x1e, 0xbb, 0x08, 0x82, 0x4b, 0xe0, 0x2d, 0xe1, 0x41, 0xda, 0xed, 0xd9, + 0x31, 0x4a, 0xfa, 0xbb, 0x8c, 0x25, 0x2b, 0x78, 0x00, 0x99, 0x9f, 0x27, 0xa0, 0xdd, 0xcb, 0x24, + 0x0b, 0xa7, 0xea, 0xf9, 0x8d, 0xd2, 0x19, 0x92, 0x50, 0x03, 0x2f, 0xfc, 0x34, 0x0e, 0xe8, 0xaa, + 0x6b, 0xb9, 0xf7, 0x96, 0x6d, 0x45, 0x3c, 0x62, 0x56, 0xcf, 0xfe, 0x9a, 0x89, 0x1b, 0x26, 0x84, + 0x1f, 0xcd, 0x01, 0xe7, 0xba, 0xa0, 0x5b, 0x1b, 0xce, 0x11, 0x73, 0xd7, 0x4a, 0xf5, 0x80, 0xd5, + 0xeb, 0x83, 0x26, 0xa3, 0x2e, 0x9b, 0x9c, 0xe7, 0xa0, 0xab, 0x94, 0x07, 0xac, 0xef, 0xb1, 0x69, + 0x36, 0xef, 0x32, 0x49, 0xe7, 0x96, 0x3d, 0x88, 0xe7, 0xfc, 0xe1, 0xf7, 0x34, 0xc8, 0x18, 0x40, + 0xad, 0x52, 0xc1, 0xc2, 0x1f, 0xd2, 0x80, 0xb1, 0x18, 0x85, 0xb7, 0x6c, 0xd6, 0x57, 0x63, 0xfd, + 0x62, 0xac, 0x1d, 0xec, 0xde, 0x75, 0xa9, 0xf7, 0x21, 0x4b, 0x85, 0x26, 0x5e, 0x81, 0x6e, 0xbe, + 0xda, 0x82, 0x24, 0xfc, 0x51, 0x88, 0x1f, 0x52, 0x96, 0xdc, 0xb3, 0x04, 0x01, 0xf1, 0xb1, 0xaf, + 0x1e, 0xdb, 0x26, 0x67, 0x69, 0x65, 0x2a, 0x3e, 0xb4, 0x4d, 0x8c, 0x69, 0x9a, 0x2e, 0x79, 0xe2, + 0x15, 0x93, 0xcd, 0x40, 0x2b, 0x00, 0x7a, 0x79, 0x31, 0x19, 0x1e, 0xb6, 0x09, 0x8d, 0xee, 0xfc, + 0xc3, 0x92, 0xf9, 0xf3, 0x85, 0xe0, 0xb3, 0x19, 0xbc, 0x97, 0xf2, 0xe2, 0x68, 0xbf, 0x3a, 0xda, + 0x0a, 0x7a, 0xe7, 0x07, 0x7c, 0x9e, 0xd0, 0xd0, 0xf3, 0xef, 0xc1, 0x5f, 0x92, 0x12, 0xba, 0xf1, + 0xa2, 0x15, 0x01, 0xfc, 0xf2, 0xa7, 0x09, 0x45, 0x1f, 0x00, 0x1d, 0xc7, 0x0c, 0xbe, 0x66, 0x09, + 0xab, 0x2a, 0x5f, 0xa2, 0xdb, 0x39, 0xed, 0x31, 0xc8, 0x67, 0xd4, 0x85, 0x18, 0xd9, 0x85, 0xb7, + 0x36, 0x63, 0x0b, 0xca, 0xa5, 0x9f, 0xb0, 0x80, 0xa5, 0x35, 0x43, 0xe8, 0xb1, 0x5d, 0xb6, 0x30, + 0x60, 0x69, 0xea, 0xd7, 0x40, 0xf0, 0xb9, 0xb7, 0xae, 0x44, 0x40, 0x33, 0x82, 0xf2, 0x74, 0xe9, + 0x0b, 0x77, 0xd1, 0x2d, 0x03, 0xb7, 0x97, 0xbb, 0x34, 0x65, 0x3a, 0x7a, 0xc7, 0x82, 0xcf, 0xe7, + 0x01, 0x7b, 0x13, 0x79, 0xec, 0xa1, 0xdb, 0x3b, 0x9d, 0x42, 0xc8, 0xdc, 0x9d, 0xca, 0xf7, 0xb7, + 0x17, 0xef, 0x5f, 0xe2, 0x6b, 0x0e, 0xaf, 0x2f, 0x32, 0xc1, 0x6f, 0x69, 0xc2, 0x36, 0x67, 0x0c, + 0xad, 0x71, 0x35, 0x44, 0x05, 0x4c, 0xba, 0x11, 0x2c, 0x1e, 0x41, 0xa4, 0x4e, 0x03, 0xee, 0xde, + 0x59, 0xbd, 0x75, 0xc9, 0x5b, 0x35, 0xf4, 0x73, 0xcc, 0x2a, 0x6c, 0x12, 0xb1, 0x25, 0xf9, 0xf6, + 0xfd, 0xdb, 0x1b, 0x46, 0x13, 0x77, 0x71, 0x4d, 0xc1, 0xd4, 0x69, 0xd7, 0xa4, 0x93, 0x3e, 0x20, + 0x90, 0x3a, 0x05, 0xe7, 0xc7, 0xd7, 0xbd, 0xd3, 0x28, 0x0b, 0x82, 0xc9, 0xa4, 0x22, 0xcb, 0x84, + 0xf5, 0xe7, 0x4c, 0x74, 0xad, 0x18, 0xbe, 0x5b, 0xbd, 0xde, 0x57, 0x5f, 0x75, 0x37, 0x13, 0x54, + 0x45, 0x39, 0x35, 0x61, 0xb7, 0xe4, 0xa6, 0xaa, 0x28, 0x4b, 0x16, 0xb8, 0x1c, 0xe3, 0xde, 0x08, + 0x52, 0xcf, 0x45, 0x26, 0xcd, 0x54, 0x04, 0x2d, 0xc8, 0x6c, 0x20, 0xce, 0x6b, 0xa0, 0xb7, 0x5a, + 0x49, 0x83, 0x32, 0x9d, 0xb5, 0xa1, 0xde, 0xf2, 0xba, 0xe4, 0x6b, 0x1b, 0x6c, 0x99, 0x22, 0x6b, + 0x2e, 0x61, 0x26, 0x30, 0x5b, 0x28, 0xcd, 0xa7, 0x45, 0xd2, 0x46, 0x05, 0xbe, 0x0c, 0x18, 0x7e, + 0x7d, 0xbe, 0x7a, 0xe3, 0x41, 0x32, 0x3c, 0x05, 0xb7, 0x12, 0x2b, 0xcc, 0x8e, 0x0a, 0x6a, 0xa2, + 0x25, 0x9c, 0x4c, 0x26, 0xe2, 0x37, 0x16, 0xf8, 0x44, 0x55, 0xa1, 0x75, 0xf7, 0xc8, 0xab, 0xea, + 0x97, 0x1e, 0x64, 0xef, 0xd6, 0x72, 0x4d, 0x19, 0x1b, 0x8a, 0x84, 0x99, 0x15, 0x25, 0x6e, 0xc5, + 0xb4, 0xb3, 0x7c, 0xd4, 0x30, 0x55, 0x67, 0x6a, 0xef, 0x6b, 0xd3, 0x81, 0x15, 0x07, 0x16, 0xa8, + 0x61, 0x77, 0xe4, 0xb0, 0xbe, 0x1f, 0x45, 0x2c, 0xc1, 0x38, 0x9d, 0x58, 0x37, 0xe0, 0xf9, 0xc2, + 0xda, 0x8c, 0x9f, 0x6a, 0xa0, 0x14, 0xdf, 0x47, 0x0d, 0x60, 0xd4, 0x01, 0xb9, 0xc1, 0x4c, 0x62, + 0x55, 0xa2, 0xa5, 0x88, 0x25, 0xe9, 0x3f, 0x91, 0xf7, 0x82, 0x0a, 0xda, 0xcd, 0xd7, 0xb6, 0x0c, + 0x32, 0x28, 0x25, 0xf1, 0xb0, 0x5a, 0xd1, 0x9a, 0x8a, 0x87, 0x08, 0xac, 0x69, 0x6f, 0xdd, 0x83, + 0x2c, 0x85, 0xe2, 0x74, 0x7b, 0x30, 0xbb, 0x96, 0x31, 0x90, 0x75, 0x6d, 0x3e, 0x55, 0x31, 0x41, + 0x1b, 0xdf, 0xc9, 0xb4, 0x2d, 0x93, 0x4f, 0x95, 0x4a, 0x9b, 0x4a, 0xb6, 0xa4, 0x82, 0x9f, 0x58, + 0xc2, 0x2f, 0x00, 0x5f, 0x3d, 0x80, 0xde, 0xd2, 0x29, 0x0b, 0xd4, 0x4b, 0x85, 0xdc, 0xb6, 0xac, + 0x3e, 0x54, 0x63, 0xe0, 0xad, 0x6b, 0xdd, 0x2e, 0x18, 0x09, 0x19, 0x4d, 0x21, 0x27, 0x7b, 0xc4, + 0xa4, 0x7e, 0xa2, 0x73, 0x3f, 0xf1, 0xd3, 0x31, 0x81, 0xd4, 0xd7, 0xfb, 0x84, 0x2a, 0xd2, 0xb3, + 0x9b, 0x6a, 0x19, 0x36, 0xd4, 0x72, 0xea, 0xb1, 0x19, 0xcd, 0x02, 0xf1, 0x45, 0x59, 0x57, 0x35, + 0x8f, 0xa8, 0xa2, 0xf7, 0x71, 0xbe, 0x1b, 0x85, 0xf3, 0xe3, 0x4c, 0xaf, 0x77, 0x18, 0xd3, 0x38, + 0x8a, 0x8c, 0xf4, 0x84, 0x41, 0x7d, 0x8b, 0x08, 0x26, 0xd9, 0xeb, 0x84, 0x87, 0x7e, 0xca, 0xba, + 0xdd, 0xd4, 0xa6, 0x08, 0x84, 0x01, 0xc0, 0x65, 0xfa, 0xfd, 0xc3, 0xd5, 0xdb, 0xd7, 0x42, 0xc4, + 0xef, 0xd9, 0x8f, 0x19, 0xb8, 0xd5, 0x29, 0xef, 0x53, 0xcf, 0x7b, 0x79, 0x0f, 0xa1, 0xf0, 0xd6, + 0x07, 0x2f, 0x03, 0x27, 0xed, 0x5a, 0x01, 0x34, 0x73, 0x96, 0xdd, 0x35, 0x54, 0xd0, 0x21, 0x17, + 0x7c, 0x79, 0xcb, 0x69, 0x2a, 0xae, 0x58, 0x9a, 0x62, 0xac, 0x59, 0x26, 0x6b, 0x91, 0x94, 0xde, + 0x33, 0xef, 0x09, 0xea, 0xac, 0x2b, 0x16, 0x7e, 0xda, 0x07, 0x67, 0x8d, 0xa1, 0xdd, 0x62, 0x28, + 0x3a, 0xb8, 0x61, 0xcf, 0xde, 0x46, 0x81, 0x25, 0x09, 0x74, 0xb7, 0x15, 0x12, 0x6c, 0x1b, 0x8d, + 0x97, 0x38, 0x8b, 0x2c, 0x17, 0xd0, 0xcd, 0x22, 0x19, 0x20, 0x47, 0x0c, 0xd9, 0x27, 0x96, 0xfd, + 0x64, 0xd0, 0xb3, 0x69, 0x57, 0x93, 0xe0, 0x31, 0xb8, 0xac, 0x75, 0xfd, 0xcd, 0xcd, 0xad, 0x05, + 0x9a, 0x80, 0x01, 0xd0, 0xa0, 0x16, 0xf1, 0x35, 0x38, 0x39, 0xd2, 0xbc, 0x54, 0x0d, 0xb3, 0x73, + 0xbb, 0x8a, 0xd1, 0x98, 0xd8, 0x2b, 0xfb, 0xaa, 0xe0, 0xec, 0x7d, 0x48, 0x79, 0x64, 0x29, 0xa8, + 0xc8, 0xeb, 0xfe, 0xf6, 0xe6, 0x9b, 0x77, 0x90, 0x12, 0x13, 0xa0, 0xe3, 0xcf, 0x20, 0x89, 0xf6, + 0x6a, 0x15, 0x57, 0xc6, 0x0c, 0xdb, 0xae, 0x6c, 0x61, 0xa7, 0x46, 0xd9, 0x74, 0x9b, 0xb2, 0xe9, + 0x17, 0x51, 0xc5, 0x5c, 0xe9, 0x80, 0xa0, 0xe1, 0x89, 0xd2, 0x43, 0xaa, 0xf4, 0x40, 0xb5, 0x1e, + 0xbe, 0x7e, 0x79, 0x2b, 0x3d, 0x0b, 0x9e, 0x23, 0x34, 0xe6, 0xa4, 0x8a, 0x5c, 0x28, 0x01, 0x65, + 0x75, 0xee, 0xd2, 0xba, 0xbd, 0x7a, 0x6b, 0x80, 0x91, 0x4a, 0xa8, 0x77, 0x19, 0x4d, 0x7e, 0xc0, + 0xdd, 0x26, 0x40, 0xd7, 0xd4, 0x96, 0x66, 0x42, 0x85, 0xba, 0x21, 0x70, 0xba, 0xe4, 0x1a, 0x11, + 0x5b, 0x63, 0x35, 0x70, 0x93, 0xb9, 0x2e, 0xa0, 0x90, 0x43, 0xc0, 0xde, 0x47, 0x20, 0x1b, 0x50, + 0x98, 0xa3, 0x2b, 0x79, 0x94, 0xd9, 0x6e, 0x00, 0x8d, 0xc2, 0xad, 0x5a, 0xaa, 0x74, 0xf5, 0x92, + 0x05, 0x85, 0xde, 0x5a, 0xce, 0x6c, 0x3d, 0x61, 0x82, 0x61, 0xa9, 0x61, 0xaa, 0x2e, 0xbe, 0x01, + 0x06, 0xf5, 0xc7, 0x83, 0x05, 0xe1, 0xba, 0x67, 0x8f, 0x4e, 0x06, 0x83, 0x8a, 0x36, 0xe6, 0x8d, + 0xb8, 0x2e, 0x9d, 0xc1, 0xdb, 0xac, 0xae, 0xfd, 0x7b, 0x9c, 0xb3, 0x0d, 0xf8, 0x1d, 0x94, 0x26, + 0x96, 0x14, 0x28, 0xe4, 0xb2, 0x6b, 0xd2, 0x8a, 0xe1, 0x54, 0x93, 0x90, 0x66, 0x7b, 0x05, 0x46, + 0x05, 0x89, 0xeb, 0x05, 0xaf, 0xce, 0x13, 0xe6, 0x83, 0x56, 0x64, 0x13, 0x51, 0x83, 0x54, 0xa9, + 0xae, 0x15, 0x44, 0xaa, 0xfc, 0xf5, 0xed, 0xd5, 0xdb, 0x1a, 0x18, 0x84, 0x7d, 0x65, 0xed, 0x55, + 0x56, 0x2c, 0xb5, 0xee, 0x19, 0xe7, 0xc5, 0xb2, 0x69, 0xbc, 0x5d, 0xe4, 0xcd, 0x25, 0x57, 0xcf, + 0x6e, 0x2e, 0x96, 0x3e, 0x02, 0xba, 0xb1, 0xec, 0x02, 0xf7, 0xc5, 0x85, 0x0b, 0x10, 0x97, 0xcb, + 0xa7, 0xf1, 0x7c, 0xd7, 0x52, 0x0b, 0xd6, 0xa6, 0xb0, 0xbe, 0x69, 0x23, 0x51, 0xae, 0x86, 0x7a, + 0x36, 0xae, 0xb0, 0x5a, 0x70, 0xc9, 0x95, 0x18, 0xae, 0x72, 0x55, 0x2b, 0xdf, 0x32, 0xab, 0xe8, + 0xfe, 0x81, 0x41, 0x59, 0x04, 0xc6, 0x79, 0xb5, 0x0a, 0xb4, 0x8a, 0xb9, 0x59, 0x2f, 0x7a, 0x76, + 0xa3, 0xec, 0xed, 0x86, 0x6d, 0xd6, 0xc8, 0x9e, 0xbd, 0x73, 0x4d, 0xb4, 0x1b, 0xd9, 0xee, 0x55, + 0x57, 0x0d, 0x75, 0x6d, 0x59, 0xf4, 0x68, 0xac, 0xf5, 0xe5, 0x16, 0xe8, 0x4a, 0x2f, 0x7b, 0xc6, + 0x79, 0xbb, 0x7e, 0x37, 0x16, 0x58, 0x90, 0x0c, 0x61, 0x91, 0xd4, 0x3e, 0x51, 0x2e, 0xa9, 0xa0, + 0xa6, 0xda, 0x56, 0x0a, 0xc4, 0xd8, 0x67, 0x35, 0x55, 0x9d, 0xb3, 0x3d, 0xbd, 0x6b, 0x42, 0xce, + 0x64, 0xf6, 0x38, 0xef, 0xe0, 0x6e, 0x52, 0x3e, 0x03, 0x10, 0x67, 0x46, 0x43, 0x3f, 0x58, 0x8d, + 0x95, 0xaf, 0x3a, 0x99, 0x6f, 0x3b, 0x6a, 0x7b, 0x46, 0x0d, 0xd8, 0xcf, 0x03, 0x3f, 0xba, 0xbb, + 0xa2, 0xee, 0x8d, 0x7c, 0x7c, 0x05, 0x10, 0x36, 0x14, 0xd5, 0x39, 0x67, 0xe4, 0xdb, 0x37, 0x96, + 0xfd, 0x9e, 0x4f, 0xb9, 0xe0, 0xb6, 0xf5, 0x9a, 0x05, 0xf7, 0x4c, 0x40, 0x9d, 0x22, 0xef, 0x18, + 0xf6, 0x20, 0x17, 0x09, 0x74, 0xbb, 0xb6, 0xf5, 0x0e, 0x5e, 0x92, 0x1b, 0x1a, 0xc1, 0xa2, 0x21, + 0x85, 0xdf, 0x0e, 0x78, 0xa1, 0x3f, 0xb3, 0xad, 0x0b, 0x24, 0x40, 0x2e, 0x71, 0xeb, 0x88, 0xbc, + 0x0c, 0xf9, 0x07, 0xdf, 0x2a, 0x71, 0x6e, 0x0e, 0xdc, 0xac, 0xc2, 0x29, 0x0f, 0x2c, 0x8d, 0xad, + 0x0a, 0x75, 0x0a, 0xbc, 0x31, 0x67, 0x21, 0x1d, 0x6f, 0x3c, 0xec, 0x1f, 0xae, 0xa7, 0x99, 0x10, + 0x3c, 0xb2, 0xfd, 0x28, 0xce, 0x84, 0xcd, 0x63, 0x31, 0x4f, 0x78, 0x16, 0x83, 0x72, 0x02, 0xe6, + 0x0a, 0x5b, 0x80, 0x9e, 0xa1, 0x9f, 0xa4, 0x35, 0xb1, 0xfd, 0x68, 0x01, 0x3c, 0x89, 0x53, 0x39, + 0x96, 0xfa, 0x3f, 0xb1, 0xf1, 0x70, 0x30, 0xf8, 0x55, 0x03, 0xf1, 0xf0, 0xf0, 0x34, 0xa4, 0xc9, + 0xdc, 0x8f, 0xc6, 0x83, 0x1a, 0x89, 0x9c, 0x43, 0x80, 0xce, 0x02, 0xbe, 0x1c, 0xdf, 0xfb, 0xa9, + 0x3f, 0x0d, 0x98, 0x79, 0xab, 0x28, 0xe6, 0x48, 0xd1, 0x11, 0x09, 0x48, 0x3e, 0xe3, 0x49, 0x38, + 0xc6, 0x15, 0xd0, 0xfa, 0x4f, 0x02, 0xea, 0xfa, 0x44, 0xcd, 0xfb, 0xde, 0x56, 0x4f, 0xd2, 0x3b, + 0xcd, 0x43, 0x9a, 0x4d, 0x43, 0x1f, 0x9e, 0xd4, 0x94, 0x1c, 0xf7, 0xc7, 0xee, 0x7c, 0x81, 0x46, + 0x81, 0x2a, 0x42, 0x23, 0x97, 0x8d, 0xd5, 0x9b, 0x3a, 0xa6, 0xf1, 0xd8, 0x09, 0xf9, 0x4f, 0xce, + 0x0c, 0x96, 0x0e, 0xa9, 0x23, 0x33, 0x61, 0x0d, 0x77, 0xeb, 0x6b, 0x4d, 0x6d, 0xcb, 0x7b, 0x85, + 0x78, 0xf3, 0x45, 0x3e, 0x05, 0xf7, 0x65, 0x89, 0x23, 0x1d, 0x49, 0xca, 0x74, 0x1a, 0x43, 0xbb, + 0x80, 0x01, 0x34, 0x68, 0xf0, 0x54, 0x82, 0x62, 0x93, 0x52, 0x67, 0x68, 0xeb, 0x3b, 0xc3, 0x4d, + 0xe3, 0xa5, 0x66, 0xa5, 0x3e, 0x9a, 0x43, 0x65, 0x44, 0x33, 0x8d, 0x87, 0xf1, 0x03, 0xf1, 0xb8, + 0x10, 0xd0, 0xe2, 0x3e, 0x97, 0x13, 0x31, 0xa0, 0xd6, 0x33, 0x9f, 0x05, 0x1e, 0x50, 0xca, 0x0d, + 0x73, 0xfd, 0xfd, 0x43, 0x16, 0x92, 0xfe, 0xb1, 0xfc, 0x7d, 0x34, 0x82, 0x8f, 0x75, 0xc0, 0xe6, + 0x50, 0x0f, 0x40, 0xa0, 0x07, 0x34, 0x3d, 0x4e, 0xd2, 0xb2, 0xc1, 0xc8, 0xa9, 0xdc, 0xd9, 0x2c, + 0xfc, 0x43, 0x97, 0xdb, 0xb1, 0xc0, 0x3d, 0x4a, 0xf0, 0x86, 0x07, 0xb5, 0x97, 0xaa, 0xbc, 0xa5, + 0x90, 0xff, 0x14, 0x3a, 0x1f, 0x01, 0xa1, 0x13, 0x53, 0x17, 0x55, 0x93, 0x84, 0x34, 0x58, 0xc7, + 0x09, 0xa4, 0x36, 0x68, 0x0b, 0x72, 0xf0, 0x15, 0x8c, 0x90, 0xc0, 0x81, 0x4c, 0x32, 0x8f, 0xc6, + 0x53, 0x58, 0xa1, 0x20, 0xff, 0xeb, 0xc2, 0x2f, 0x0b, 0x6f, 0xa2, 0xb0, 0x72, 0xd5, 0xaa, 0x74, + 0x17, 0xcc, 0xbd, 0x03, 0x76, 0x0a, 0x57, 0xa1, 0x9e, 0xcf, 0xbf, 0x6f, 0x61, 0xb9, 0x69, 0x87, + 0x48, 0xa6, 0x31, 0x34, 0xae, 0x76, 0x22, 0x69, 0x40, 0x60, 0xcf, 0x8f, 0x1c, 0xed, 0xa9, 0x2d, + 0x13, 0x41, 0xb7, 0xf5, 0x89, 0xb9, 0x0e, 0x86, 0x0a, 0x6b, 0x6a, 0xfb, 0xe3, 0xfb, 0x6d, 0x1e, + 0x8a, 0x22, 0x49, 0x03, 0x9c, 0x6a, 0x23, 0x39, 0xba, 0x82, 0x38, 0xa3, 0xf8, 0xa1, 0x0e, 0x5e, + 0xd2, 0x54, 0x03, 0x8e, 0xc7, 0x5c, 0xae, 0xf2, 0xec, 0x36, 0xcc, 0x32, 0x86, 0x4a, 0x98, 0x19, + 0xee, 0x20, 0x67, 0x31, 0x36, 0x8f, 0xce, 0xc7, 0x02, 0x46, 0xc6, 0xb8, 0x31, 0xe8, 0xda, 0x63, + 0x82, 0xfa, 0x41, 0x9a, 0x1b, 0xc3, 0xca, 0xee, 0x6b, 0x9d, 0x66, 0x21, 0x44, 0xfa, 0xaa, 0x18, + 0x0d, 0xa0, 0xff, 0x75, 0xc0, 0xa4, 0xe1, 0x1a, 0x4b, 0x49, 0x40, 0x05, 0x2b, 0x5e, 0xa9, 0x68, + 0x56, 0xdd, 0xd7, 0xf7, 0xf5, 0x51, 0x89, 0xeb, 0xc7, 0x8c, 0x0b, 0x66, 0x7b, 0x9e, 0xed, 0x05, + 0xf6, 0xcc, 0x9f, 0x43, 0x09, 0xb2, 0x17, 0x43, 0x7b, 0x31, 0xb2, 0x17, 0xfb, 0xf6, 0xe2, 0xc0, + 0x5e, 0x1c, 0xda, 0x8b, 0x23, 0x7b, 0x91, 0xd8, 0xb1, 0x1d, 0x27, 0x2c, 0x6f, 0xe4, 0x97, 0x7c, + 0x4a, 0xdd, 0x3b, 0xcc, 0x5e, 0x91, 0xa7, 0xb6, 0xd8, 0xc7, 0x32, 0x8d, 0x40, 0x57, 0x85, 0x1b, + 0xda, 0x95, 0x97, 0x7e, 0x08, 0x65, 0x40, 0x53, 0x55, 0x51, 0x22, 0x03, 0x64, 0x4b, 0x70, 0x18, + 0x53, 0x8c, 0x0f, 0x61, 0x08, 0xcd, 0x48, 0x0a, 0x25, 0xca, 0xe0, 0xc6, 0x98, 0x52, 0xb4, 0xca, + 0xd8, 0x31, 0x5c, 0x55, 0x3c, 0x8b, 0x07, 0x76, 0x16, 0xe4, 0x52, 0x2f, 0x95, 0x0c, 0xb0, 0x65, + 0xe2, 0xbf, 0x67, 0x85, 0xf9, 0x0f, 0x7b, 0x3c, 0xa6, 0x33, 0x08, 0x0e, 0xf8, 0x9c, 0x32, 0x48, + 0xeb, 0xac, 0x25, 0x16, 0xf5, 0x57, 0x95, 0x25, 0x06, 0xa7, 0xb5, 0xa4, 0x99, 0xf2, 0xc0, 0xf7, + 0xcc, 0x90, 0x32, 0xef, 0x53, 0x36, 0x62, 0xcf, 0x66, 0xa0, 0xb5, 0x22, 0xbf, 0x0a, 0x1e, 0x9b, + 0x1c, 0x03, 0x31, 0xe3, 0x87, 0xf3, 0x7c, 0x13, 0x47, 0x99, 0x3b, 0x20, 0xc3, 0x60, 0xf1, 0x32, + 0x39, 0x66, 0x2d, 0xeb, 0x13, 0x64, 0x4c, 0x4c, 0xda, 0xf0, 0xcd, 0x01, 0xe7, 0x74, 0xd9, 0x82, + 0x07, 0x80, 0xa0, 0x28, 0x84, 0xdb, 0x5f, 0xe7, 0x9a, 0x21, 0x3a, 0xa0, 0xcc, 0x1d, 0x68, 0x44, + 0x1f, 0xc3, 0xf4, 0x29, 0xa8, 0xb6, 0x23, 0x68, 0x07, 0xfb, 0x13, 0x74, 0x35, 0x65, 0xc5, 0xd4, + 0xf1, 0xe1, 0x66, 0x49, 0x0a, 0x73, 0x62, 0xee, 0x43, 0x93, 0x97, 0xac, 0x65, 0x5a, 0xce, 0x4b, + 0x8d, 0x06, 0x34, 0x4e, 0xd9, 0xd8, 0x7c, 0x59, 0x6f, 0x04, 0x5e, 0x5e, 0xd6, 0xfb, 0x5a, 0x07, + 0xa0, 0x9a, 0xd8, 0x22, 0x49, 0xf4, 0x8d, 0x41, 0x9d, 0x83, 0xbc, 0xb0, 0x2d, 0xd0, 0x0f, 0xb5, + 0x65, 0x0e, 0xc0, 0x32, 0xfd, 0xf8, 0x01, 0xde, 0x6a, 0xbf, 0x77, 0x02, 0x36, 0x03, 0x47, 0x49, + 0x58, 0x68, 0x22, 0x01, 0xe2, 0x4a, 0xfa, 0x0e, 0x0c, 0xc1, 0xd4, 0x95, 0x33, 0x2a, 0xa6, 0x82, + 0x81, 0xc7, 0xfd, 0xc3, 0xea, 0x54, 0x85, 0x5b, 0x0d, 0xae, 0xfb, 0xa1, 0x33, 0x34, 0x01, 0xd8, + 0x1f, 0xe9, 0x21, 0x01, 0xf0, 0x6a, 0xac, 0x04, 0x07, 0xb4, 0xce, 0x7e, 0x59, 0xe6, 0x8e, 0xcd, + 0xd8, 0xb0, 0x1c, 0x2b, 0xc1, 0x87, 0x35, 0x70, 0x3d, 0x0e, 0x12, 0x0c, 0xeb, 0x12, 0xa8, 0x37, + 0x0d, 0x19, 0x8a, 0xe9, 0xab, 0xca, 0xf4, 0x12, 0xcf, 0x86, 0x18, 0x25, 0xf6, 0xa3, 0x86, 0x7e, + 0xfa, 0x5b, 0xb0, 0x0f, 0xfb, 0x05, 0xf6, 0x67, 0x35, 0xec, 0xa3, 0x2d, 0xb8, 0x47, 0x72, 0x6a, + 0x30, 0xff, 0x2f, 0x59, 0x6a, 0x1c, 0xac, 0xa5, 0x15, 0x93, 0x2a, 0x65, 0x2f, 0x9c, 0xc3, 0xbc, + 0x88, 0x5c, 0xcd, 0xcb, 0xd2, 0xc1, 0xcc, 0x97, 0x2b, 0xeb, 0xc9, 0x5a, 0xd6, 0x97, 0x08, 0x60, + 0xf1, 0xb1, 0x72, 0x0e, 0x06, 0x83, 0xdc, 0x71, 0xe4, 0x33, 0x87, 0x0a, 0xee, 0x8b, 0xd5, 0x78, + 0xa8, 0xdb, 0x80, 0xa7, 0xee, 0xd4, 0x3b, 0x64, 0x03, 0xfd, 0x94, 0xcc, 0xa7, 0xb4, 0x3b, 0x1a, + 0xec, 0xdb, 0xa3, 0x21, 0xfc, 0x8c, 0x0e, 0x6c, 0x58, 0x14, 0x77, 0xeb, 0x90, 0xbd, 0xde, 0xba, + 0x3f, 0x4f, 0x7c, 0xaf, 0x28, 0x0c, 0xf8, 0xa0, 0x86, 0xd0, 0x3f, 0x53, 0xd0, 0xa0, 0xfc, 0x6e, + 0xca, 0x0a, 0x0e, 0x66, 0x61, 0x94, 0x8e, 0x13, 0x06, 0x65, 0x4b, 0x74, 0xe5, 0xa9, 0x2c, 0xb4, + 0x19, 0xdd, 0x81, 0x3d, 0x9c, 0x25, 0x06, 0x9b, 0x02, 0x1d, 0xed, 0x06, 0x1d, 0x6d, 0x80, 0x4a, + 0xcd, 0x40, 0x86, 0xf3, 0xf2, 0xaa, 0x93, 0x1f, 0x0f, 0x06, 0x5a, 0xfa, 0x34, 0xac, 0x28, 0xaf, + 0xff, 0x4c, 0x7b, 0x90, 0x1f, 0xc9, 0xe4, 0x37, 0x0b, 0xd8, 0x43, 0x21, 0x45, 0x65, 0x0c, 0x26, + 0x00, 0x07, 0xa9, 0xe3, 0x32, 0x8c, 0xc0, 0x5c, 0x36, 0x35, 0xb2, 0x54, 0xa6, 0x63, 0x35, 0xa4, + 0x91, 0x0b, 0x06, 0x2d, 0xcf, 0x2e, 0xd5, 0x1e, 0xcc, 0xbc, 0xa1, 0x7b, 0x58, 0x55, 0xed, 0xf1, + 0x89, 0x3d, 0x1a, 0x9c, 0xd8, 0xc3, 0x93, 0xe3, 0x16, 0xcd, 0x4e, 0xe7, 0x8e, 0xec, 0xb4, 0x00, + 0x27, 0x7c, 0x2d, 0x31, 0x6e, 0x54, 0xcd, 0xa7, 0xb3, 0xd9, 0x6c, 0x73, 0x54, 0xd9, 0xef, 0xf0, + 0xd0, 0x36, 0x3f, 0x8a, 0x4a, 0x89, 0x0a, 0x69, 0x48, 0x00, 0xe6, 0x39, 0x41, 0x91, 0x78, 0xb1, + 0xf7, 0xca, 0x52, 0x13, 0x74, 0xe9, 0x82, 0x7a, 0x7c, 0x89, 0xba, 0x93, 0x05, 0x40, 0x3e, 0x8d, + 0x07, 0x04, 0x0b, 0x2e, 0x34, 0x39, 0x64, 0x40, 0x24, 0x95, 0x81, 0x8d, 0x7f, 0xfb, 0x83, 0xc3, + 0x9e, 0x49, 0x26, 0x79, 0xad, 0x32, 0x60, 0x6e, 0x37, 0x59, 0x66, 0xc5, 0x02, 0xe8, 0xfe, 0x9c, + 0x63, 0xa9, 0x2b, 0x3d, 0x56, 0x91, 0xad, 0x56, 0x2e, 0xa6, 0xc7, 0xc7, 0x27, 0xc3, 0x59, 0x7d, + 0x50, 0x12, 0x1c, 0x3e, 0xdb, 0xb7, 0x87, 0xa3, 0xa1, 0xbd, 0x3f, 0x34, 0x52, 0xd5, 0x10, 0x69, + 0xed, 0x69, 0x52, 0x47, 0x8a, 0xd4, 0x6e, 0x15, 0x7a, 0x47, 0x27, 0x50, 0x9c, 0xda, 0xb4, 0x38, + 0x3c, 0xb0, 0x87, 0x87, 0xcf, 0xec, 0x83, 0xa3, 0xcf, 0x51, 0xa2, 0x7c, 0x5d, 0x55, 0xe2, 0x00, + 0x34, 0x38, 0xc4, 0x46, 0xc5, 0xd9, 0x87, 0x5f, 0x55, 0x4d, 0x0e, 0x7b, 0xf6, 0x80, 0x40, 0xde, + 0x25, 0x47, 0xf8, 0x76, 0xd4, 0x78, 0x2b, 0xf5, 0x1c, 0x7a, 0x3a, 0x2d, 0x3c, 0x04, 0xd5, 0xa4, + 0x60, 0x72, 0x40, 0x29, 0xfe, 0xfe, 0x63, 0xc4, 0x9f, 0xd1, 0xd9, 0xe0, 0xd9, 0x49, 0xab, 0x13, + 0x0d, 0xec, 0xd1, 0x01, 0x04, 0xda, 0xfe, 0xf1, 0x56, 0xf9, 0x61, 0x2a, 0xae, 0x06, 0x22, 0x13, + 0xb3, 0x2a, 0x54, 0xc7, 0x38, 0x44, 0x46, 0x7b, 0xea, 0x43, 0x72, 0x34, 0x85, 0xc5, 0xbf, 0x73, + 0xf8, 0x18, 0x7e, 0x0e, 0x46, 0x27, 0x27, 0x6c, 0xd8, 0xc2, 0xcf, 0xd1, 0x11, 0x58, 0x03, 0x73, + 0xd2, 0x56, 0x9f, 0x56, 0x5a, 0x31, 0x91, 0xb3, 0x3d, 0x1a, 0x31, 0x60, 0x76, 0x46, 0x49, 0x23, + 0x16, 0x4d, 0x59, 0x44, 0xfe, 0x1f, 0xe5, 0xb9, 0xa3, 0xe9, 0x91, 0x3b, 0x1d, 0x6c, 0xf1, 0xdc, + 0x03, 0x70, 0xdc, 0xc1, 0x33, 0x7b, 0x78, 0x7c, 0xd4, 0xea, 0xb9, 0xda, 0x9d, 0x9a, 0xbe, 0xa4, + 0x0d, 0x6b, 0x9c, 0x2d, 0xdc, 0x98, 0xb0, 0xaf, 0x52, 0x1a, 0xee, 0x83, 0xc8, 0xed, 0x0f, 0x72, + 0xb6, 0xa7, 0x6f, 0xcf, 0x4c, 0xb9, 0xb7, 0x22, 0x7a, 0xf7, 0xd9, 0x32, 0xf7, 0x43, 0x2c, 0x22, + 0xa7, 0x4d, 0xac, 0x2d, 0xc1, 0x70, 0xe2, 0x1d, 0xb8, 0xf2, 0x8a, 0x8c, 0xe7, 0xdf, 0x93, 0x8e, + 0x1b, 0xd0, 0x34, 0x9d, 0x58, 0x78, 0xc9, 0x85, 0x42, 0x62, 0x4c, 0x48, 0xf8, 0x20, 0x2b, 0x0c, + 0xc1, 0xa2, 0x47, 0xb0, 0x94, 0x99, 0xa9, 0x7a, 0x26, 0x7a, 0x01, 0xa9, 0x54, 0x81, 0x02, 0x93, + 0x0f, 0xf4, 0xdd, 0xfb, 0x82, 0x72, 0x75, 0x3d, 0x61, 0x19, 0x60, 0x5c, 0x20, 0xc2, 0xa0, 0x75, + 0x8e, 0x6c, 0x12, 0xbc, 0x1f, 0x43, 0xf4, 0xfd, 0x18, 0xe8, 0x62, 0xfb, 0xfd, 0xfe, 0xd9, 0x1e, + 0xa0, 0xc2, 0x3b, 0x32, 0x11, 0x2f, 0xf6, 0x7b, 0x2a, 0xb4, 0x0d, 0xb8, 0xa1, 0x51, 0x58, 0xc8, + 0x3a, 0xef, 0xdc, 0xf0, 0x24, 0x59, 0xd9, 0x75, 0x9c, 0x11, 0x63, 0x5e, 0x4a, 0x7e, 0x4b, 0xef, + 0xe9, 0x8d, 0xc4, 0xf6, 0x44, 0xe3, 0x3f, 0xdb, 0xdb, 0x8e, 0xbf, 0xd0, 0x82, 0x45, 0x3a, 0x9a, + 0x44, 0xb5, 0xde, 0x4c, 0x65, 0x73, 0x87, 0x02, 0x67, 0x81, 0x01, 0xc1, 0x42, 0x42, 0xca, 0x0a, + 0x0c, 0x01, 0x40, 0x74, 0x45, 0x22, 0xc1, 0xbc, 0xac, 0xed, 0xc0, 0x20, 0x39, 0x0b, 0x7c, 0x03, + 0x55, 0xa9, 0x42, 0xa4, 0x5a, 0x84, 0x10, 0x37, 0x25, 0x8b, 0x84, 0xcd, 0x26, 0xd6, 0x9e, 0x75, + 0xfe, 0x9a, 0x87, 0xec, 0x6c, 0x8f, 0xe2, 0xa6, 0xd7, 0xfd, 0xbc, 0xb0, 0x15, 0xb4, 0x05, 0x44, + 0xb5, 0x01, 0xa4, 0x56, 0xfa, 0x2d, 0x02, 0x8b, 0xc9, 0x00, 0xa4, 0xc8, 0x12, 0x5c, 0x64, 0x5d, + 0xaa, 0x8b, 0x4d, 0x78, 0xa5, 0xea, 0x39, 0x7f, 0x98, 0x58, 0x03, 0xc8, 0xe8, 0x23, 0xfc, 0x67, + 0xed, 0xa1, 0x06, 0x02, 0xff, 0xd3, 0x59, 0x7a, 0x5a, 0x18, 0xb2, 0x56, 0x18, 0x2d, 0x65, 0xfc, + 0x38, 0xb0, 0xce, 0x15, 0xb7, 0x88, 0x1c, 0x7e, 0x67, 0x78, 0xeb, 0x4b, 0x6b, 0x1c, 0xb5, 0x8c, + 0x93, 0xcc, 0x31, 0x7b, 0x21, 0x8d, 0xf4, 0x27, 0x53, 0x0e, 0x49, 0x99, 0x6e, 0x49, 0x51, 0x9e, + 0x08, 0x74, 0x82, 0x04, 0x3b, 0x3f, 0x64, 0x25, 0x2e, 0x14, 0x6f, 0x5a, 0x02, 0x50, 0xed, 0xed, + 0x82, 0x46, 0x77, 0x64, 0xc5, 0x33, 0xf2, 0xf7, 0xff, 0xfd, 0x1b, 0x81, 0x35, 0x0d, 0xf1, 0xa3, + 0x54, 0xd0, 0x20, 0xc0, 0xd3, 0x1b, 0xb1, 0x60, 0xd2, 0x2b, 0x42, 0xed, 0x14, 0x37, 0x7c, 0x26, + 0x96, 0xd0, 0xb2, 0xf7, 0xc9, 0xff, 0xfd, 0xf5, 0xcf, 0xff, 0x7d, 0xb6, 0x17, 0x23, 0xd6, 0xf3, + 0xce, 0x1f, 0x01, 0x7a, 0x41, 0xc1, 0x79, 0x58, 0x84, 0xad, 0xb8, 0x27, 0xe1, 0x8a, 0xc3, 0xb7, + 0x2b, 0xee, 0x01, 0xc0, 0x9b, 0x88, 0xe0, 0xd1, 0x1b, 0xf9, 0x8e, 0x4d, 0x65, 0xd7, 0x3e, 0x83, + 0x8e, 0x5f, 0x92, 0x5d, 0x82, 0xe2, 0xc9, 0x94, 0x11, 0x84, 0x24, 0x60, 0x17, 0x3c, 0x9f, 0x84, + 0xf1, 0x04, 0xaf, 0x95, 0xc1, 0xd2, 0x39, 0xed, 0x83, 0x4b, 0x6b, 0x42, 0xaf, 0x80, 0x85, 0x34, + 0x9b, 0xcf, 0x59, 0x8a, 0x3b, 0x04, 0x29, 0xa1, 0x11, 0xee, 0xfa, 0x00, 0x09, 0x58, 0xef, 0x81, + 0xa3, 0x90, 0x39, 0x47, 0x04, 0xe1, 0x0a, 0xb5, 0xde, 0x51, 0x6a, 0x5f, 0x08, 0x11, 0xa7, 0xe3, + 0xbd, 0xbd, 0xb9, 0x2f, 0x16, 0xd9, 0x14, 0x52, 0x72, 0xb8, 0x77, 0xf3, 0x9c, 0x7e, 0xe0, 0x91, + 0xfb, 0x13, 0xbd, 0xdb, 0x5b, 0x94, 0xb2, 0x59, 0xe7, 0x5f, 0xcb, 0x29, 0x24, 0x4e, 0xf8, 0x07, + 0xe6, 0x0a, 0xb4, 0x86, 0xa2, 0x6b, 0xe2, 0xca, 0x98, 0xa1, 0x72, 0x3f, 0x60, 0x6b, 0xc0, 0x7e, + 0x52, 0x5c, 0x40, 0xd6, 0xb4, 0xfe, 0xd9, 0x26, 0x7e, 0xcb, 0xc4, 0xaf, 0x53, 0x75, 0xa6, 0x8e, + 0xfa, 0x51, 0xc7, 0x11, 0xd2, 0x46, 0x72, 0x77, 0x9b, 0xa8, 0xfb, 0x81, 0xe4, 0xef, 0xff, 0xf3, + 0x17, 0x69, 0x7f, 0x34, 0x4a, 0xcd, 0xb4, 0xc6, 0x42, 0xf3, 0xcc, 0xf7, 0xa4, 0x71, 0x81, 0x0d, + 0x3c, 0x4c, 0xde, 0x27, 0x78, 0xe4, 0x9f, 0xf6, 0xd5, 0xe4, 0x69, 0x52, 0x91, 0xc3, 0x5c, 0x14, + 0x50, 0x4c, 0x9d, 0x77, 0x5e, 0xf9, 0x09, 0x90, 0xc4, 0x11, 0xf2, 0x1e, 0x34, 0x0e, 0xae, 0x02, + 0x1e, 0x66, 0x0e, 0xa5, 0x67, 0x09, 0x0f, 0x2b, 0xec, 0xa0, 0x55, 0xdd, 0xc0, 0x77, 0xef, 0x88, + 0xbe, 0xc2, 0xd0, 0xaf, 0xda, 0xa1, 0x4c, 0x98, 0xc5, 0x91, 0x78, 0x9b, 0x15, 0x64, 0x85, 0x35, + 0x33, 0xd5, 0xf9, 0xf8, 0x79, 0xe7, 0x4a, 0x9e, 0x88, 0xa3, 0x73, 0xe3, 0x28, 0x91, 0xc3, 0x4f, + 0xc8, 0xb5, 0x72, 0xa0, 0x25, 0xf5, 0x85, 0x4c, 0xa5, 0x08, 0x5a, 0x92, 0xdc, 0x2a, 0xda, 0xa8, + 0x34, 0x68, 0x93, 0x30, 0x08, 0x7c, 0x8d, 0x2b, 0x5a, 0x42, 0xcb, 0x73, 0x77, 0x32, 0x24, 0x5d, + 0x78, 0xdd, 0x23, 0xff, 0x69, 0x2e, 0x11, 0xc8, 0xbb, 0x2a, 0x9b, 0x66, 0x28, 0xc5, 0x87, 0x09, + 0x5a, 0x03, 0x9d, 0x0d, 0x0d, 0xf8, 0xb2, 0x62, 0x31, 0x83, 0x2c, 0xdc, 0xa1, 0x08, 0xa5, 0x87, + 0x8e, 0x82, 0x30, 0x00, 0x5a, 0x1d, 0x57, 0x46, 0x19, 0x30, 0xb3, 0xe4, 0xec, 0x31, 0x4a, 0xe9, + 0x18, 0x6e, 0x62, 0x1d, 0x26, 0x6a, 0x6d, 0x2e, 0x19, 0x9b, 0x8a, 0x08, 0x63, 0xc4, 0x02, 0xac, + 0x52, 0x12, 0x50, 0x5a, 0xf5, 0x96, 0x93, 0x72, 0x54, 0xe3, 0xe1, 0xb0, 0x7a, 0x77, 0x02, 0x3c, + 0xdc, 0x83, 0x08, 0xe4, 0xe4, 0x39, 0x14, 0x5d, 0x2d, 0xac, 0x42, 0xd8, 0x82, 0xd9, 0x40, 0x57, + 0xba, 0x27, 0xb2, 0xc0, 0x1a, 0x37, 0x36, 0x23, 0xc7, 0xa6, 0x9c, 0xa8, 0xd0, 0x29, 0x02, 0x02, + 0x0b, 0xf3, 0x08, 0x4b, 0xf4, 0x01, 0x51, 0x8d, 0x02, 0x69, 0x74, 0x31, 0x26, 0xca, 0x48, 0xd9, + 0xbf, 0x01, 0xbd, 0x42, 0x94, 0xca, 0xdd, 0x94, 0x5a, 0xc4, 0x55, 0xe4, 0x90, 0x46, 0x6b, 0x4a, + 0x61, 0xca, 0x67, 0x33, 0x9b, 0x14, 0x57, 0xab, 0x36, 0x32, 0x06, 0x69, 0xf4, 0x0b, 0xa3, 0xc2, + 0xa9, 0x2b, 0xd2, 0x97, 0xcd, 0xbc, 0x11, 0x07, 0xf7, 0x09, 0x20, 0x29, 0xec, 0x93, 0x8d, 0x95, + 0xc5, 0x96, 0xfc, 0x01, 0xdf, 0x4a, 0xcd, 0x84, 0x9e, 0x69, 0x9d, 0xab, 0xb2, 0x43, 0x7f, 0xa0, + 0x59, 0x2c, 0x5c, 0xa0, 0x85, 0x89, 0xfd, 0x7f, 0x2a, 0x13, 0x72, 0x87, 0xb0, 0xce, 0x42, 0x33, + 0xd9, 0x29, 0x83, 0x87, 0x80, 0x04, 0xd3, 0xe1, 0x8d, 0x39, 0xb5, 0x25, 0x5d, 0x1f, 0xcf, 0x90, + 0xdd, 0x7e, 0x4f, 0x83, 0x77, 0xce, 0xe4, 0x76, 0x94, 0x81, 0xc7, 0x0c, 0x5a, 0x61, 0x00, 0x9e, + 0xb4, 0x14, 0x25, 0xab, 0x96, 0x34, 0xd6, 0xc6, 0x71, 0x70, 0x53, 0x17, 0x2d, 0x9c, 0xfc, 0xfe, + 0xf2, 0x52, 0xa7, 0x5d, 0x3c, 0xb3, 0xd6, 0x4c, 0x68, 0x1e, 0x3a, 0x3f, 0x93, 0x89, 0x8d, 0x83, + 0xe5, 0x5f, 0xc8, 0x2e, 0xdf, 0xf9, 0x33, 0xff, 0x93, 0xac, 0x72, 0xf3, 0xe6, 0xc5, 0x67, 0x6a, + 0xa0, 0x76, 0x4c, 0xfa, 0x48, 0x13, 0x5c, 0xeb, 0xb3, 0xd7, 0x2f, 0x44, 0xba, 0x38, 0xca, 0xfd, + 0xa5, 0xa2, 0x01, 0x4b, 0xc6, 0xa7, 0xa8, 0x5d, 0xdd, 0x9e, 0x23, 0xdf, 0xc8, 0xa3, 0x98, 0xcf, + 0xf5, 0xc0, 0xcd, 0x33, 0xff, 0x47, 0x5a, 0xa1, 0x28, 0x31, 0x2f, 0xd4, 0x61, 0xff, 0x17, 0x61, + 0xa4, 0x79, 0x81, 0xe0, 0x91, 0xbc, 0x5c, 0x96, 0x87, 0xfa, 0xe4, 0xb6, 0xbc, 0x2b, 0xf0, 0x19, + 0x2c, 0x75, 0x4a, 0x9e, 0x76, 0xdf, 0x43, 0x78, 0x9c, 0xc9, 0x3a, 0x55, 0x0e, 0x5f, 0xc9, 0x7b, + 0x07, 0x75, 0xe6, 0x3e, 0x9f, 0xb7, 0xfa, 0x6d, 0x86, 0x8f, 0xd4, 0xda, 0xd2, 0x01, 0x49, 0x7b, + 0xd9, 0x3d, 0x78, 0x6c, 0xd9, 0xc5, 0x7d, 0xf5, 0x8d, 0xd2, 0xab, 0x71, 0x55, 0x46, 0x0f, 0xcb, + 0x18, 0xa9, 0x56, 0xe1, 0xe6, 0x2d, 0xdf, 0xb6, 0x52, 0x7c, 0xa1, 0x9a, 0x5d, 0x1d, 0x2e, 0xb5, + 0x8a, 0xdc, 0xf9, 0x45, 0x02, 0xf7, 0xea, 0x77, 0xb7, 0xb7, 0x45, 0xdc, 0xaa, 0x96, 0xe0, 0x31, + 0x49, 0x53, 0x5e, 0x07, 0x32, 0xd6, 0x37, 0x2d, 0x17, 0x3e, 0x75, 0x0c, 0x64, 0x65, 0x1e, 0xfe, + 0x47, 0x1b, 0x02, 0x9d, 0xfc, 0x9b, 0xeb, 0x7a, 0xd3, 0xf6, 0x73, 0xc3, 0xac, 0x7a, 0x23, 0xe9, + 0x91, 0xc1, 0xf5, 0x6d, 0xfa, 0xd9, 0xc1, 0x5d, 0xde, 0x5d, 0xfa, 0xff, 0x4d, 0xf1, 0xf5, 0xdb, + 0x50, 0x8f, 0xa5, 0xcd, 0x13, 0xf1, 0x45, 0xe8, 0xe2, 0x6d, 0xae, 0x8d, 0x0d, 0xa6, 0xd2, 0x7f, + 0xbe, 0x8a, 0xa6, 0x69, 0x7c, 0x5a, 0x2c, 0x4c, 0xfe, 0xb5, 0x3a, 0xe3, 0xda, 0x75, 0xbb, 0xd6, + 0xe6, 0x18, 0x37, 0x0a, 0xca, 0x8e, 0xb2, 0x11, 0x92, 0xd5, 0x45, 0x9e, 0x86, 0x85, 0x82, 0x0b, + 0xb9, 0x0a, 0x80, 0x80, 0xbd, 0x7d, 0x58, 0xea, 0x03, 0x7b, 0x71, 0xe2, 0x0c, 0x07, 0x04, 0x96, + 0x27, 0xf2, 0x58, 0x48, 0xdd, 0xb5, 0x50, 0x22, 0x25, 0xa0, 0x50, 0xe4, 0x14, 0x64, 0xc5, 0xaf, + 0xc3, 0x5a, 0xa0, 0xea, 0x2c, 0x58, 0xb9, 0xbc, 0xb9, 0x7d, 0xc7, 0x4d, 0x9e, 0x39, 0x5a, 0x90, + 0x31, 0x94, 0x2d, 0x62, 0x52, 0x87, 0x92, 0x37, 0x43, 0xcf, 0x3b, 0x17, 0x24, 0xf5, 0x43, 0x3c, + 0x69, 0x96, 0x13, 0x61, 0x95, 0x2c, 0x16, 0x92, 0x07, 0xb9, 0x82, 0xa3, 0x44, 0x1e, 0x6c, 0x11, + 0x1f, 0xba, 0xf9, 0x32, 0x58, 0x0b, 0x99, 0xe8, 0x34, 0xe5, 0x41, 0x06, 0xca, 0xf7, 0x23, 0x48, + 0xbe, 0xce, 0xca, 0x19, 0xa8, 0xf9, 0xf0, 0xb9, 0xb1, 0x8b, 0x44, 0xc2, 0xc4, 0x39, 0xb0, 0x1a, + 0x1b, 0x59, 0x4b, 0xd0, 0xc2, 0x02, 0x7e, 0x70, 0xdb, 0xca, 0xd1, 0xbb, 0x56, 0xed, 0x1b, 0x56, + 0xf5, 0xe5, 0xec, 0xcf, 0x51, 0x2e, 0xe8, 0x73, 0x9e, 0x30, 0x16, 0xed, 0xd0, 0xa8, 0xb9, 0x01, + 0xfb, 0xa9, 0x3a, 0xad, 0xde, 0xb7, 0x3d, 0xef, 0x54, 0x94, 0xf5, 0xaf, 0xa0, 0xab, 0xc6, 0xaa, + 0x6d, 0x0f, 0xb7, 0x8c, 0xe5, 0x0e, 0x32, 0xfe, 0xbf, 0xcc, 0x7f, 0x00, 0xcb, 0xa8, 0x84, 0xb9, + 0xa7, 0x39, 0x00, 0x00 }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 70a6477..655acc1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,10 +9,6 @@ #include "ConfigWebserver.h" #include "MqttWrapper.h" -#define FW_NAME "Development" -#define FW_VERSION "0.10.0" -const char *__FLAGGED_FW_NAME = "\xbf\x84\xe4\x13\x54" FW_NAME "\x93\x44\x6b\xa7\x75"; -const char *__FLAGGED_FW_VERSION = "\x6a\x3f\x3e\x0e\xe1" FW_VERSION "\xb0\x30\x48\xd4\x1a"; // Set the Mode for the BAttery measuring ADC_MODE(ADC_VCC); @@ -62,7 +58,7 @@ void max_run() void setup() { Serial.begin(115200); - if (!ConfigurationManager::getInstance()->HasValidConfiguration()) + if (ConfigurationManager::getInstance()->HasValidConfiguration()) { Serial.println("No valid configuration available. Starting configuration mode"); @@ -111,7 +107,8 @@ void setup() temperatures.setup(); WiFi.forceSleepWake(); delay(500); - + // Set modem to sleep + wifi_set_sleep_type(MODEM_SLEEP_T); devicemanager.ConnectWifi(); // Measure Battery @@ -150,7 +147,7 @@ void setup() Serial.println("No Scaledevice connected"); } mqtt.Queue("/hive/battery/volt", batteryProcessor.getVolt()); - mqtt.Queue("/hive/battery/islow",1 ); + mqtt.Queue("/hive/battery/islow", 1); mqtt.Send(); // When the battery is low, it mus sleep forever @@ -164,8 +161,8 @@ void setup() } WiFi.forceSleepBegin(); // send wifi directly to sleep to reduce power consumption - // Set modem to sleep - wifi_set_sleep_type(MODEM_SLEEP_T); + + devicemanager.GotToSleep(); break; } break; From 56788993e671efe8e9c031b620544ca79761fc2b Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Wed, 18 Aug 2021 21:08:39 +0200 Subject: [PATCH 50/99] :rewind: Reverted debug configmode --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 655acc1..f56c502 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,7 +58,7 @@ void max_run() void setup() { Serial.begin(115200); - if (ConfigurationManager::getInstance()->HasValidConfiguration()) + if (!ConfigurationManager::getInstance()->HasValidConfiguration()) { Serial.println("No valid configuration available. Starting configuration mode"); From 2df1d0c05e8773d139a7104db75f56ea7eccbe6f Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Mon, 23 Aug 2021 21:13:33 +0200 Subject: [PATCH 51/99] :sparkles: Added new adjusting scale Wizard This wizard will allow you to recalibarate the scale device. So avoid using the tare method. This will identify the weight tollerances and set it into the configuration file. --- html/index.htm | 9 +- html/index.js | 57 +++-- src/WeightProcessor.cpp | 2 +- src/html/html_ui.h | 550 ++++++++++++++++++++-------------------- 4 files changed, 307 insertions(+), 311 deletions(-) diff --git a/html/index.htm b/html/index.htm index 92a2a0d..301e297 100644 --- a/html/index.htm +++ b/html/index.htm @@ -45,8 +45,6 @@ - - + +
    @@ -88,46 +88,87 @@ System - Sleeptime (in sec.) - VCC adjustment +
    + Sleeptime (in sec.) +

    + The sleep time in seconds. +
    + + +
    + VCC adjustment +

    + The device measures the voltage. Sometimes it requires some adjustments to + gain the perfect measure. +
    + Wifi - SSID - Password +
    + SSID +

    + The SSID for connecting. +
    + +
    + Password

    + The Password to login onto the wifi network. +
    + Scale +
    + Weight Offset

    + The "zero value" for the weight device. +
    + +
    + Kilogram Divider

    + The value for "one Kilogram". +
    + +
    + Calibration Temperature

    + This is the measured temperature during the calibration process. +
    + +
    + Calibration Factor

    + This is the calibartion factor for the scale device. + - Weight Offset - Kilogram Divider - Calibration Temperature - Calibration Factor - + MQTT
    Server

    Servername or IP -
    - User - Password - Port +
    + +
    + User

    + Optional the user to authenticate +
    + +
    + Password

    + Optional the password to authenticate +
    + +
    + Port

    + The port of the mqtt server +
    +
     

    Auto Tare Information

    +This procedure will guide you throught a small setup with two steps.



    +

    +1. Remove all weights from the scale and click on Start, wait until the led is blinking. +

    +2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait until the led is blinking +

    )====="; + + + // Autogenerated from html/settings_general.htm, do not edit!! + const char PAGE_settings_time[] PROGMEM = R"=====()====="; + + \ No newline at end of file diff --git a/tools/cdata.js b/tools/cdata.js index 980e9eb..2035453 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -186,7 +186,7 @@ fs.writeFileSync(resultFile, src); } -writeHtmlGzipped("html/index.htm", "src/html/html_ui.h"); +writeHtmlGzipped("html/index.htm", "src/html.h"); writeChunks( "html", @@ -230,6 +230,6 @@ writeHtmlGzipped("html/index.htm", "src/html/html_ui.h"); .replace(/function GetV().*\<\/script\>/gms, "function GetV() {\n"), } ], - "src/html/html_settings.h" + "src/html_settings.h" ); \ No newline at end of file From 911bb427cc83e668601e4382a0117dd81b9c6442 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 24 Aug 2021 15:58:11 +0200 Subject: [PATCH 58/99] :bug: Fixed compilation error --- src/WeightProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WeightProcessor.cpp b/src/WeightProcessor.cpp index ff4c977..6e43414 100644 --- a/src/WeightProcessor.cpp +++ b/src/WeightProcessor.cpp @@ -36,7 +36,7 @@ void WeightProcessor::Tare() float WeightProcessor::GetUnits() { - scale.get_units(10); + return scale.get_units(10); } void WeightProcessor::setup(float kilogramDivider, float weightOffset, float calibrationTemperature, float calibrationFactor) From f9382cada631c651eacde567771f3d6c2577e127 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 24 Aug 2021 15:59:04 +0200 Subject: [PATCH 59/99] :pencil2: try to modifiy circle ci --- .circleci/config.yml | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6f98693..1503b82 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,13 +1,20 @@ -# Use the latest 2.1 version of CircleCI pipeline process engine. See: https://circleci.com/docs/2.0/configuration-reference version: 2.1 -# Use a package of configuration called an orb. orbs: - # Declare a dependency on the welcome-orb - welcome: circleci/welcome-orb@0.4.1 -# Orchestrate or schedule a set of jobs + python: circleci/python@1.4.0 + +jobs: + build: + executor: python/default + steps: + - checkout # checkout source code to working directory + - run: + name: Install PlatformIO + command: pip install --upgrade platformio + - run: + name: Compile Project + command: pio run -e esp12e/complete + workflows: - # Name the workflow "welcome" - welcome: - # Run the welcome/run job in its own container + main: jobs: - - welcome/run + - build \ No newline at end of file From f2c2b8f3d7828ae3538d97c98b4ce6a554dc1663 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 24 Aug 2021 20:24:24 +0200 Subject: [PATCH 60/99] :pencil2: circle ci test --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1503b82..78a5962 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ jobs: command: pip install --upgrade platformio - run: name: Compile Project - command: pio run -e esp12e/complete + command: pio run workflows: main: From 31ee5f578868eb22432aa4754b25163514dc2783 Mon Sep 17 00:00:00 2001 From: Sascha Peter Bajonczak Date: Tue, 24 Aug 2021 20:33:31 +0200 Subject: [PATCH 61/99] :recycle: cleaned up --- html/404.htm | 46 ------ html/settings_general.htm | 0 html/settings_tare.htm | 41 ----- src/html/html_settings.h | 25 --- src/html/html_ui.h | 310 -------------------------------------- src/html_settings.h | 20 --- tools/cdata.js | 44 ------ 7 files changed, 486 deletions(-) delete mode 100644 html/404.htm delete mode 100644 html/settings_general.htm delete mode 100644 html/settings_tare.htm delete mode 100644 src/html/html_settings.h delete mode 100644 src/html/html_ui.h diff --git a/html/404.htm b/html/404.htm deleted file mode 100644 index 6e5241d..0000000 --- a/html/404.htm +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - Not found - - - - -

    404 Not Found

    - - - \ No newline at end of file diff --git a/html/settings_general.htm b/html/settings_general.htm deleted file mode 100644 index e69de29..0000000 diff --git a/html/settings_tare.htm b/html/settings_tare.htm deleted file mode 100644 index b1f880a..0000000 --- a/html/settings_tare.htm +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - Tare Weight - - - - - -
    -
    - -

    Auto Tare Information

    -

    This procedure will guide you throught a small setup with two steps.

    -
    -
    -
    -

    1. Remove all weights from the scale and click on Start, wait until the led is blinking.

    -

    2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait - until the led is blinking

    - - - -
    - - - \ No newline at end of file diff --git a/src/html/html_settings.h b/src/html/html_settings.h deleted file mode 100644 index ee90eec..0000000 --- a/src/html/html_settings.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * More web UI HTML source arrays. - * This file is auto generated, please don't make any changes manually. - */ - - // Autogenerated from html/settings_tare.htm, do not edit!! - const char PAGE_settings_tare[] PROGMEM = R"=====(Tare Weight%CSS%%SCSS%

    Auto Tare Information

    -This procedure will guide you throught a small setup with two steps.



    -

    -1. Remove all weights from the scale and click on Start, wait until the led is blinking. -

    -2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait until the led is blinking -

    )====="; - - - // Autogenerated from html/settings_general.htm, do not edit!! - const char PAGE_settings_time[] PROGMEM = R"=====()====="; - - \ No newline at end of file diff --git a/src/html/html_ui.h b/src/html/html_ui.h deleted file mode 100644 index 828c324..0000000 --- a/src/html/html_ui.h +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Binary array for the Web UI. - * gzip is used for smaller size and improved speeds. - */ - - // Autogenerated from html/index.htm, do not edit!! - const uint16_t PAGE_index_L = 4798; - const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3c, 0xdb, 0x72, 0xe3, 0x46, - 0x76, 0xef, 0xfc, 0x8a, 0x1e, 0x4c, 0xc5, 0x4b, 0x26, 0x00, 0x44, 0x52, 0xb7, 0x11, 0x25, 0x6a, - 0x6b, 0xae, 0x1e, 0x6d, 0xe6, 0xa2, 0x1d, 0xca, 0xeb, 0xdd, 0xda, 0xb8, 0x5c, 0x20, 0xd0, 0x24, - 0x31, 0x02, 0xd0, 0x30, 0xba, 0x21, 0x89, 0x66, 0xf1, 0x13, 0xf2, 0x90, 0x97, 0x3c, 0xa4, 0x2a, - 0x95, 0x97, 0x7c, 0xd9, 0x7e, 0x41, 0x3e, 0x21, 0xe7, 0xf4, 0x05, 0x37, 0x02, 0x1a, 0xc9, 0x3b, - 0x2e, 0xa7, 0x62, 0x5b, 0x22, 0xd1, 0xdd, 0xe7, 0xf4, 0xb9, 0x5f, 0xd0, 0x2d, 0x9f, 0x3d, 0x79, - 0xf5, 0xf1, 0xe5, 0xd5, 0x5f, 0x2e, 0x5f, 0x93, 0x95, 0x88, 0xa3, 0x73, 0x72, 0x86, 0x1f, 0x24, - 0xf2, 0x92, 0xe5, 0xd4, 0xa2, 0x89, 0x85, 0x03, 0xd4, 0x0b, 0xe0, 0x23, 0xa6, 0xc2, 0x23, 0x89, - 0x17, 0xd3, 0xa9, 0x75, 0x13, 0xd2, 0xdb, 0x94, 0x65, 0xc2, 0x22, 0x3d, 0x9f, 0x25, 0x82, 0x26, - 0x62, 0x6a, 0xdd, 0x86, 0x81, 0x58, 0x4d, 0x03, 0x7a, 0x13, 0xfa, 0xd4, 0x91, 0x0f, 0x76, 0x98, - 0x84, 0x22, 0xf4, 0x22, 0x87, 0xfb, 0x5e, 0x44, 0xa7, 0x23, 0x3b, 0x86, 0x81, 0x38, 0x8f, 0xcd, - 0xb3, 0x65, 0x90, 0xf6, 0xfc, 0x95, 0x97, 0x71, 0x0a, 0x48, 0x72, 0xb1, 0x70, 0x9e, 0x59, 0xf5, - 0xcd, 0xc4, 0x8a, 0xc6, 0xd4, 0xf1, 0x59, 0xc4, 0x32, 0x8b, 0x14, 0xdb, 0x3d, 0x1d, 0xcb, 0x7f, - 0x2a, 0x38, 0xcc, 0xcc, 0x9a, 0x72, 0x4b, 0x83, 0x7a, 0x69, 0x1a, 0x51, 0x27, 0x66, 0xf3, 0x10, - 0x3e, 0x6e, 0xe9, 0xdc, 0x81, 0x01, 0xc7, 0xf7, 0x52, 0x6f, 0x1e, 0x51, 0x84, 0x14, 0xa1, 0x88, - 0xe8, 0xf9, 0xdb, 0xf0, 0x86, 0x3a, 0xef, 0x19, 0x10, 0xcb, 0xb2, 0xb3, 0x3d, 0x35, 0x46, 0x7a, - 0x67, 0xdc, 0xcf, 0xc2, 0x54, 0x9c, 0xf7, 0x6e, 0xbc, 0x8c, 0x88, 0x30, 0xa6, 0x2c, 0x17, 0xf6, - 0x73, 0x5f, 0xe4, 0x5e, 0x74, 0xe9, 0x2d, 0x01, 0xf9, 0xc5, 0x87, 0x57, 0xaf, 0xff, 0x6c, 0xd9, - 0x33, 0x64, 0xe6, 0x25, 0x4b, 0x12, 0xea, 0x0b, 0x1a, 0x4c, 0x9f, 0x8c, 0xec, 0x60, 0x1a, 0x30, - 0x3f, 0x8f, 0x81, 0x98, 0xd3, 0x45, 0x9e, 0xf8, 0x22, 0x64, 0x09, 0x61, 0xc9, 0x3b, 0xe6, 0x05, - 0xfd, 0xc1, 0x66, 0x15, 0x06, 0xf4, 0x79, 0x14, 0x01, 0x80, 0xc8, 0x58, 0xc4, 0xfb, 0x03, 0x3b, - 0x45, 0xde, 0xff, 0x98, 0xd3, 0x6c, 0x0d, 0x0f, 0x20, 0x85, 0x17, 0x19, 0xc8, 0xfb, 0x65, 0x96, - 0xc7, 0x73, 0xf5, 0x7c, 0xa1, 0xa4, 0x88, 0x9b, 0xaa, 0x81, 0x57, 0x21, 0x4f, 0x23, 0x6f, 0xdd, - 0xb7, 0xfc, 0x1b, 0xcb, 0xb6, 0x12, 0x96, 0x50, 0x6b, 0x60, 0x7f, 0x4b, 0xc5, 0x8c, 0x0a, 0x11, - 0x26, 0x4b, 0xc0, 0xb9, 0x2d, 0xf6, 0x0d, 0x42, 0x8e, 0xcc, 0x4a, 0x22, 0xcb, 0xf9, 0x0d, 0x08, - 0x8b, 0xb3, 0x88, 0xba, 0x11, 0x5b, 0xf6, 0x2d, 0xb5, 0x06, 0x66, 0x88, 0x54, 0x8c, 0x94, 0x31, - 0xd2, 0x66, 0xd5, 0x77, 0x93, 0x93, 0x1f, 0x98, 0x28, 0x78, 0x85, 0xcd, 0xe7, 0x11, 0xf3, 0xaf, - 0x1b, 0xeb, 0xe6, 0x22, 0x99, 0x09, 0x2f, 0x13, 0x57, 0x5e, 0x46, 0x4b, 0xfa, 0x60, 0x85, 0xe6, - 0x19, 0x26, 0x05, 0xd5, 0xe8, 0x7e, 0x84, 0x5f, 0xe1, 0x3c, 0xf3, 0x90, 0xd6, 0x85, 0xe7, 0x83, - 0x02, 0xb8, 0x22, 0xd2, 0xb2, 0x9f, 0x0c, 0x1f, 0x02, 0x24, 0x68, 0x9c, 0x52, 0xf8, 0x9a, 0x67, - 0xf4, 0x21, 0x90, 0xd7, 0x21, 0x70, 0x9c, 0x79, 0x71, 0x10, 0xde, 0x80, 0x1e, 0xb2, 0x7b, 0xd7, - 0xde, 0xd2, 0x70, 0xb9, 0x12, 0x6c, 0xb1, 0x80, 0x79, 0xb9, 0xb0, 0x94, 0x6a, 0x4d, 0xd8, 0x1b, - 0xd4, 0x57, 0xdf, 0x0a, 0x93, 0x05, 0xb3, 0x06, 0x2e, 0x58, 0x6b, 0xd2, 0xa7, 0xd3, 0xf3, 0x9a, - 0x88, 0xe9, 0xa0, 0x69, 0x26, 0xd4, 0xe5, 0x14, 0xe6, 0x33, 0xee, 0xca, 0xcd, 0x5c, 0xdf, 0xcc, - 0x7c, 0x51, 0xe4, 0x5a, 0x9e, 0x75, 0x7c, 0xbf, 0xaf, 0x29, 0x74, 0x66, 0xd4, 0xa8, 0x81, 0x06, - 0x93, 0x76, 0x33, 0xd8, 0x0e, 0x6c, 0x45, 0xbb, 0x16, 0x1d, 0x6f, 0xa3, 0x3f, 0xa0, 0xf3, 0x5c, - 0x72, 0x00, 0x8b, 0xae, 0xe8, 0x9d, 0x78, 0xc1, 0xee, 0xfe, 0xe4, 0x45, 0x39, 0x8a, 0x69, 0xcd, - 0x41, 0xfc, 0x3f, 0xf2, 0x88, 0xd2, 0x14, 0x1d, 0xc4, 0xb2, 0x81, 0x2b, 0x39, 0xe6, 0x16, 0x63, - 0xdd, 0x60, 0x37, 0xbe, 0xef, 0x05, 0x9f, 0x73, 0x2e, 0x0a, 0xbd, 0x15, 0xd0, 0xcd, 0xa9, 0x16, - 0x24, 0xf1, 0x4f, 0x42, 0xfc, 0xc8, 0x69, 0x76, 0x83, 0x4a, 0xa4, 0x2e, 0x3e, 0xba, 0xea, 0xb1, - 0x6b, 0x71, 0xce, 0x2b, 0x4b, 0xf1, 0xa1, 0x6b, 0x61, 0xea, 0x71, 0x7e, 0xcb, 0xb2, 0xa0, 0x58, - 0x6c, 0x06, 0x3a, 0x01, 0x30, 0x12, 0x16, 0x8b, 0xe1, 0xa1, 0x8d, 0xe9, 0x16, 0x93, 0xa2, 0x5a, - 0xf7, 0xd5, 0xd1, 0x4e, 0xd0, 0x1d, 0xcb, 0x35, 0xd0, 0x8d, 0x89, 0x4e, 0x04, 0x5f, 0x70, 0x1a, - 0x83, 0xee, 0xde, 0x65, 0x0f, 0x41, 0xde, 0x70, 0xe3, 0x16, 0xbc, 0xb5, 0x15, 0x2d, 0x28, 0x6f, - 0xc3, 0x8c, 0x46, 0x94, 0xd7, 0x14, 0xa1, 0xc7, 0xee, 0xd3, 0x85, 0x01, 0xe3, 0x3c, 0xac, 0x81, - 0xe0, 0x33, 0x98, 0x7a, 0xe9, 0xbd, 0xcd, 0x98, 0xba, 0xe1, 0xb7, 0xa1, 0xf0, 0x57, 0xfd, 0x32, - 0xb8, 0x43, 0x80, 0xf4, 0x38, 0xd5, 0x11, 0x7e, 0x22, 0xd8, 0x72, 0x19, 0xd1, 0x8b, 0x24, 0xa0, - 0x77, 0xfd, 0xc1, 0xe9, 0x1c, 0x5c, 0xe6, 0xfa, 0x54, 0xce, 0x5f, 0x3d, 0xff, 0xf4, 0xfa, 0xc7, - 0x19, 0xfc, 0xbe, 0xc2, 0x45, 0x0c, 0x16, 0x3d, 0xcf, 0x05, 0xc3, 0xb8, 0x07, 0xbe, 0x55, 0xee, - 0x57, 0x0d, 0xf0, 0x1b, 0xcc, 0x26, 0x74, 0x9a, 0xd0, 0x5b, 0xf2, 0xdd, 0xa7, 0x77, 0x33, 0xea, - 0x65, 0xfe, 0xea, 0xd2, 0x03, 0xf5, 0xf1, 0xbe, 0x49, 0x1a, 0xe0, 0xc3, 0xbe, 0x94, 0x13, 0x18, - 0x34, 0x4e, 0x0f, 0x4e, 0x93, 0x3c, 0x8a, 0xa6, 0xd3, 0x0a, 0x7d, 0x10, 0x3e, 0x96, 0x54, 0xf4, - 0xad, 0x14, 0xbe, 0x5b, 0x83, 0xc1, 0x37, 0xdf, 0xf4, 0x77, 0x13, 0x53, 0x85, 0xe1, 0x1a, 0x03, - 0x2d, 0x19, 0xa8, 0x1a, 0x72, 0x6e, 0x69, 0xe4, 0x33, 0xf4, 0xe5, 0xd6, 0xd8, 0xee, 0x9b, 0xe0, - 0x51, 0xce, 0x97, 0xdb, 0xec, 0x20, 0xde, 0xd4, 0x40, 0x51, 0x2e, 0x33, 0x41, 0xd3, 0x61, 0x2d, - 0x29, 0xb4, 0xa2, 0x6e, 0x99, 0x2e, 0xe9, 0x6a, 0x83, 0x2d, 0x13, 0x61, 0x4d, 0xcd, 0x66, 0x01, - 0xb5, 0x85, 0x92, 0x3c, 0x2f, 0x52, 0x33, 0x0a, 0xf0, 0x75, 0x44, 0xf1, 0xeb, 0x8b, 0xf5, 0x45, - 0x00, 0x01, 0xee, 0x14, 0x4c, 0x45, 0xac, 0x31, 0xe2, 0x29, 0xa8, 0xa9, 0xe6, 0x70, 0x3a, 0x9d, - 0x8a, 0xdf, 0x5b, 0xa0, 0xe1, 0x1a, 0xea, 0x19, 0x2e, 0x55, 0x88, 0xbb, 0x51, 0x2a, 0x84, 0xd3, - 0x3a, 0x64, 0x2d, 0xd7, 0x3c, 0x94, 0x32, 0x1d, 0xc0, 0x03, 0x24, 0xc5, 0x7c, 0xb7, 0x26, 0x96, - 0x55, 0x55, 0x72, 0xdd, 0x00, 0x37, 0x55, 0x93, 0xa8, 0x58, 0xaa, 0x7d, 0xbf, 0xfe, 0x6b, 0x6a, - 0xda, 0x51, 0x71, 0x49, 0x3e, 0xef, 0xb2, 0xa4, 0x7b, 0xcb, 0x97, 0x1a, 0xa6, 0xea, 0x4a, 0xed, - 0x17, 0x5d, 0x32, 0xb0, 0xd2, 0xc8, 0x02, 0x31, 0xdc, 0xef, 0xa7, 0xd4, 0x0d, 0x21, 0xe3, 0x65, - 0x18, 0x15, 0xa6, 0x96, 0x2c, 0x41, 0xac, 0xa6, 0xb7, 0x5a, 0x93, 0xd2, 0x71, 0xdf, 0x5c, 0x7c, - 0xb8, 0x98, 0xbd, 0x6d, 0x80, 0x21, 0xf7, 0x44, 0xa6, 0x49, 0xab, 0xe2, 0xc1, 0xdc, 0xd4, 0x33, - 0x65, 0xb0, 0x00, 0xfa, 0xdf, 0x79, 0x73, 0x1a, 0x41, 0x0e, 0xa0, 0x1e, 0xcf, 0x33, 0xb0, 0xdc, - 0xf7, 0x94, 0x73, 0x74, 0x48, 0xdb, 0x7a, 0x6f, 0x86, 0x9e, 0x90, 0xcb, 0x08, 0xbe, 0x53, 0xf2, - 0xbd, 0x17, 0x0a, 0xd7, 0x75, 0x49, 0xc3, 0x70, 0x0b, 0xd8, 0x8a, 0xbf, 0xd5, 0x52, 0xb9, 0xe2, - 0x95, 0x20, 0xb3, 0x13, 0xeb, 0x9f, 0x2a, 0x9c, 0x37, 0x4b, 0xae, 0x7a, 0xb5, 0xb5, 0x23, 0x22, - 0x6d, 0x00, 0xaf, 0x2f, 0xc7, 0xd6, 0x44, 0xe5, 0x7c, 0x90, 0xf0, 0xf7, 0x32, 0xf1, 0xc8, 0xf0, - 0x59, 0xcd, 0xfc, 0xed, 0x98, 0x2b, 0xe1, 0xe0, 0x61, 0xf9, 0x69, 0xd0, 0x56, 0x2d, 0xd7, 0x0c, - 0x68, 0x3b, 0x80, 0xb4, 0x80, 0xc2, 0xec, 0x0f, 0x60, 0xdb, 0x6d, 0x67, 0x6c, 0xfd, 0xbb, 0x09, - 0x6e, 0x95, 0x77, 0x4b, 0x1c, 0x11, 0xda, 0xf6, 0xc7, 0x75, 0xf0, 0x6e, 0x45, 0x5b, 0x58, 0xb8, - 0x01, 0x0f, 0x7d, 0xeb, 0x6a, 0x45, 0x89, 0x5a, 0x40, 0x03, 0xa2, 0x32, 0x3a, 0x51, 0x29, 0x9d, - 0x84, 0x7c, 0x42, 0x50, 0x1e, 0x0f, 0x2d, 0x0b, 0xea, 0x82, 0xab, 0x68, 0xae, 0x2e, 0xbd, 0x2f, - 0x1a, 0xd2, 0x17, 0xdd, 0xba, 0x21, 0xfe, 0xaa, 0xc1, 0xd3, 0x24, 0x78, 0xe5, 0x09, 0x4f, 0xc5, - 0xa7, 0x8c, 0x42, 0x0d, 0x90, 0x10, 0x4c, 0x5a, 0x97, 0x19, 0x8b, 0x43, 0x4e, 0xfb, 0x7d, 0x6e, - 0x7b, 0x08, 0x85, 0x6e, 0xcb, 0x64, 0x3a, 0xfb, 0xf3, 0xfb, 0x77, 0x6f, 0x85, 0x48, 0x3f, 0xd1, - 0x9f, 0x72, 0xca, 0xc5, 0x29, 0x73, 0xbd, 0x20, 0x78, 0x7d, 0x03, 0x0e, 0xfc, 0x2e, 0x84, 0xa2, - 0x0e, 0x1c, 0xac, 0x6f, 0x45, 0xd0, 0x02, 0x59, 0x76, 0xdf, 0xec, 0x82, 0xce, 0xb4, 0x62, 0xb7, - 0x57, 0xcc, 0xe3, 0x42, 0x8b, 0x14, 0x6a, 0x57, 0x9d, 0x05, 0x08, 0xf7, 0x6e, 0x68, 0xf0, 0x04, - 0xd9, 0xe8, 0x8b, 0x55, 0xc8, 0x5d, 0x28, 0x42, 0x52, 0xf0, 0x0c, 0x8a, 0x02, 0x04, 0xd2, 0x07, - 0x76, 0xdb, 0x0e, 0x34, 0xcb, 0xa0, 0x4b, 0xac, 0x6c, 0x41, 0xdb, 0xf6, 0x78, 0x8d, 0xab, 0xc8, - 0xed, 0x0a, 0xba, 0x42, 0xdc, 0x06, 0x3b, 0x1f, 0xb3, 0xed, 0x13, 0xd5, 0x12, 0x78, 0x7d, 0xbd, - 0x05, 0x4b, 0xc1, 0xc6, 0xac, 0xcb, 0x8f, 0x33, 0x08, 0x9c, 0x02, 0x07, 0x40, 0xa8, 0x9a, 0xc5, - 0xb7, 0x60, 0x95, 0xb8, 0xe7, 0x4b, 0xd5, 0x78, 0x3a, 0x57, 0xeb, 0x14, 0x4d, 0x02, 0x7b, 0xce, - 0x50, 0x25, 0xf0, 0xbd, 0xcf, 0x9c, 0x25, 0x96, 0x82, 0x4a, 0x82, 0xfe, 0x1f, 0x66, 0x1f, 0x3f, - 0x40, 0x46, 0x40, 0x2d, 0x85, 0x0b, 0x48, 0x4a, 0x83, 0x5a, 0x55, 0x22, 0x8d, 0x9c, 0xb6, 0x0b, - 0x5b, 0xd8, 0xdc, 0x08, 0xdb, 0x6b, 0x13, 0xb6, 0xf7, 0x55, 0x44, 0xb1, 0x54, 0x32, 0x20, 0xa8, - 0x78, 0xa2, 0x5b, 0x23, 0x25, 0x07, 0x4f, 0xcb, 0xe1, 0xdb, 0xd7, 0x57, 0xd2, 0x3e, 0xe1, 0x39, - 0x41, 0x65, 0x4e, 0xab, 0xc8, 0x85, 0x62, 0x50, 0x56, 0x3b, 0x7d, 0xaf, 0xae, 0xaf, 0xc1, 0x16, - 0x60, 0xa4, 0x10, 0xea, 0x95, 0x58, 0x93, 0x1e, 0x30, 0xb7, 0x29, 0xec, 0x6b, 0x32, 0x62, 0x33, - 0x0d, 0x40, 0xf2, 0x13, 0xb8, 0x5c, 0x52, 0x8d, 0x88, 0x21, 0x05, 0xca, 0x81, 0x59, 0xee, 0xfb, - 0x80, 0x42, 0x0e, 0x01, 0x79, 0x5f, 0x80, 0x6c, 0x40, 0x61, 0x66, 0xa9, 0xe4, 0x00, 0x6a, 0xfb, - 0x10, 0xb3, 0xb3, 0x2b, 0xd5, 0xf2, 0xf7, 0x75, 0xeb, 0x8f, 0x4c, 0xb7, 0x96, 0x07, 0xb6, 0x5e, - 0x30, 0x45, 0xe7, 0xd6, 0x30, 0x55, 0x13, 0xdf, 0x01, 0x83, 0xac, 0x19, 0xd0, 0xc4, 0x82, 0xe6, - 0x6b, 0x7c, 0x32, 0xac, 0x76, 0x95, 0xcb, 0x46, 0x74, 0x28, 0x8d, 0x21, 0x68, 0x29, 0x2d, 0x6e, - 0x70, 0x4d, 0x1b, 0xf0, 0x07, 0x48, 0xa8, 0x34, 0x2b, 0x50, 0xc8, 0xd7, 0x17, 0xd3, 0x4e, 0x0c, - 0xa7, 0x7a, 0x0b, 0xa9, 0xb6, 0x37, 0xa0, 0x54, 0xe0, 0xb8, 0x9e, 0xa6, 0xeb, 0x34, 0xc9, 0x82, - 0xa7, 0x0b, 0x59, 0xa3, 0xd2, 0x51, 0x71, 0xb3, 0x13, 0x44, 0x8a, 0xfc, 0xed, 0xd5, 0xfb, 0x77, - 0x35, 0x30, 0x70, 0xfb, 0x4a, 0x6f, 0x5d, 0x04, 0xa2, 0x8d, 0xea, 0x0d, 0x27, 0x9b, 0xa2, 0xb5, - 0x9c, 0xb4, 0xb3, 0xbc, 0xdb, 0x96, 0x0e, 0xec, 0x66, 0x43, 0xf9, 0x05, 0xd0, 0x9d, 0xd6, 0x14, - 0xcc, 0x17, 0x9b, 0x3b, 0xd8, 0x5c, 0xb6, 0x98, 0x93, 0xe5, 0x7d, 0xed, 0xe8, 0xc0, 0xc6, 0x1e, - 0xb0, 0x6b, 0x8b, 0xb2, 0x63, 0x1c, 0xd8, 0xd8, 0x85, 0x76, 0xe0, 0x92, 0xdd, 0x2a, 0xbe, 0x1b, - 0x52, 0xed, 0x4e, 0xc7, 0xaa, 0xa2, 0x43, 0x02, 0x02, 0x65, 0x2a, 0x99, 0x6c, 0xaa, 0xb9, 0xa4, - 0x93, 0xcd, 0xdd, 0xac, 0x33, 0xb0, 0x1b, 0x09, 0xfc, 0x7e, 0xd8, 0x66, 0xb6, 0x87, 0xaa, 0xe5, - 0xbe, 0xbe, 0xf1, 0x7e, 0x64, 0xf7, 0x77, 0xa6, 0x35, 0xd4, 0xb5, 0xd6, 0xf1, 0xc1, 0x58, 0xeb, - 0x2d, 0x29, 0xc8, 0x4a, 0xb7, 0x86, 0x93, 0x4d, 0xb7, 0x7c, 0x77, 0x9a, 0x50, 0x08, 0x86, 0xd0, - 0x48, 0x76, 0x2f, 0x94, 0x6d, 0x27, 0xe4, 0x50, 0xdb, 0xe2, 0xb0, 0x59, 0xad, 0x3e, 0x69, 0xa6, - 0xf3, 0xf1, 0x17, 0xea, 0xa0, 0x6d, 0xef, 0x6c, 0x4f, 0xbf, 0x7d, 0x24, 0x67, 0x32, 0x7a, 0x9c, - 0xf7, 0xf0, 0xad, 0xec, 0x66, 0x01, 0x20, 0xce, 0xc2, 0x8b, 0xc3, 0x68, 0x3d, 0x51, 0xb6, 0xea, - 0xe4, 0xa1, 0xed, 0xa8, 0xd7, 0x9c, 0x6a, 0xc0, 0x7e, 0x11, 0x85, 0xc9, 0xf5, 0x7b, 0xcf, 0x9f, - 0xc9, 0xc7, 0x37, 0x00, 0x61, 0x43, 0x52, 0x5d, 0x32, 0x4a, 0xbe, 0xbb, 0xb0, 0xec, 0x4f, 0x6c, - 0xce, 0x04, 0xb3, 0xad, 0xb7, 0x34, 0xba, 0xa1, 0x02, 0xf2, 0x14, 0xf9, 0x40, 0xa1, 0x98, 0xb2, - 0x9f, 0x67, 0x50, 0xa3, 0xdb, 0xd6, 0x07, 0x98, 0x24, 0x33, 0x2f, 0x81, 0x26, 0x8c, 0xc3, 0x6f, - 0x07, 0xac, 0x30, 0x5c, 0xd8, 0xd6, 0x73, 0xdc, 0x80, 0xbc, 0xc4, 0x57, 0xb0, 0xe4, 0x75, 0xcc, - 0x3e, 0x87, 0x56, 0x89, 0x73, 0x77, 0x60, 0xb6, 0x8e, 0xe7, 0x2c, 0xb2, 0x34, 0xb6, 0x2a, 0xd4, - 0x29, 0xd0, 0x46, 0x9d, 0x95, 0x34, 0xbc, 0xc9, 0xc8, 0x3d, 0xdc, 0xce, 0x73, 0x21, 0x58, 0x62, - 0x87, 0x49, 0x9a, 0x0b, 0x9b, 0xa5, 0x62, 0x99, 0xb1, 0x3c, 0x05, 0xe1, 0x44, 0xd4, 0x17, 0xb6, - 0x00, 0x39, 0x43, 0xd5, 0xe2, 0xd5, 0xd8, 0x0e, 0x93, 0x15, 0xd0, 0x24, 0x4e, 0xe5, 0x18, 0x0f, - 0x7f, 0xa6, 0x93, 0xd1, 0x70, 0xf8, 0x0f, 0x0d, 0xc4, 0xa3, 0xc3, 0xd3, 0xd8, 0xcb, 0x96, 0x61, - 0x32, 0x19, 0xd6, 0xb6, 0xd8, 0x30, 0x70, 0xd0, 0x45, 0xc4, 0x6e, 0x27, 0x37, 0x21, 0x0f, 0xa1, - 0x87, 0x32, 0xb3, 0x6a, 0xc7, 0x0d, 0xee, 0xe8, 0x88, 0x0c, 0x38, 0x5f, 0xb0, 0x2c, 0x9e, 0x60, - 0x85, 0xb8, 0xfd, 0xab, 0x80, 0xbc, 0x3e, 0x55, 0xeb, 0x7e, 0xb0, 0xd5, 0x93, 0xb4, 0x4e, 0xf3, - 0xc0, 0xf3, 0x79, 0x1c, 0xc2, 0x93, 0x5a, 0xb2, 0xc1, 0xf7, 0xcc, 0xd7, 0xa1, 0x40, 0xa5, 0x40, - 0x16, 0xf1, 0x12, 0x9f, 0x4e, 0xd4, 0x4c, 0x1d, 0xd3, 0x64, 0xe2, 0xc4, 0xec, 0x67, 0x67, 0x01, - 0x0d, 0x0f, 0x77, 0x64, 0x24, 0xac, 0xe1, 0xee, 0x9c, 0xd6, 0xbb, 0xb5, 0xcc, 0x2b, 0xc4, 0xbb, - 0x13, 0x9b, 0x39, 0x98, 0x2f, 0xcd, 0x1c, 0x69, 0x48, 0x92, 0xa7, 0xd3, 0x14, 0xca, 0x05, 0x74, - 0xa0, 0x61, 0x83, 0xa6, 0x12, 0x14, 0x8b, 0x94, 0x3a, 0x41, 0xad, 0x73, 0x86, 0x9a, 0xc6, 0xa4, - 0x26, 0xa5, 0x3e, 0xba, 0x81, 0xcc, 0x88, 0x6a, 0x9a, 0x8c, 0xd2, 0x3b, 0x12, 0x30, 0x21, 0xa0, - 0x50, 0x7e, 0x21, 0x17, 0xa2, 0x43, 0x6d, 0x17, 0x21, 0x8d, 0x02, 0xd8, 0x69, 0x63, 0x88, 0x73, - 0xf7, 0x0f, 0x69, 0x4c, 0xdc, 0x63, 0xf9, 0xfb, 0x68, 0x0c, 0x1f, 0xdb, 0x88, 0x2e, 0x21, 0x1f, - 0x00, 0x43, 0x77, 0xa8, 0x7a, 0x5c, 0xa4, 0x79, 0x83, 0x91, 0x53, 0x79, 0x42, 0x50, 0xd8, 0x87, - 0x4e, 0xb7, 0x13, 0x81, 0xad, 0x32, 0x58, 0xc3, 0x9d, 0x3a, 0x93, 0x50, 0xd6, 0x52, 0xf0, 0x7f, - 0x0a, 0x95, 0x8f, 0x00, 0xd7, 0x49, 0x3d, 0x1f, 0x45, 0x93, 0xc5, 0x5e, 0xb4, 0x4d, 0x33, 0x08, - 0x6d, 0x50, 0x16, 0x6c, 0xc0, 0x56, 0xd0, 0x43, 0x22, 0x07, 0x22, 0xc9, 0x32, 0x99, 0xcc, 0xa1, - 0x2d, 0x41, 0xfa, 0xb7, 0x85, 0x5d, 0x16, 0xd6, 0xe4, 0x41, 0xd7, 0xad, 0x45, 0xe9, 0xaf, 0xa8, - 0x7f, 0x0d, 0xe4, 0x14, 0xa6, 0xe2, 0x05, 0x21, 0xfb, 0xa1, 0x83, 0xe4, 0xa6, 0x1e, 0x12, 0x19, - 0xc6, 0x50, 0xb9, 0xda, 0x88, 0xa4, 0x02, 0x81, 0xbc, 0x30, 0x71, 0xb4, 0xa5, 0x76, 0x2c, 0x04, - 0xd9, 0xd6, 0x17, 0x6e, 0xb4, 0x33, 0x54, 0x48, 0x53, 0xaf, 0x93, 0x7e, 0x68, 0xb3, 0x50, 0x64, - 0x49, 0x2a, 0xe0, 0x54, 0x2b, 0xc9, 0xd1, 0x19, 0xc4, 0x19, 0xa7, 0x77, 0x75, 0xf0, 0x72, 0x4f, - 0x35, 0xe0, 0x04, 0xd4, 0x67, 0x2a, 0xce, 0xb6, 0x61, 0x96, 0x3e, 0x54, 0xc2, 0x2c, 0xf0, 0x24, - 0x26, 0x4f, 0xb1, 0x78, 0x74, 0xbe, 0xe4, 0x30, 0xd2, 0xc7, 0x8d, 0x42, 0xb7, 0x01, 0x15, 0x5e, - 0x18, 0xf1, 0x8d, 0x51, 0xac, 0xac, 0xbe, 0xb6, 0x3c, 0x8f, 0xc1, 0xd3, 0xd7, 0xc5, 0x68, 0x04, - 0xf5, 0xaf, 0x03, 0x2a, 0x8d, 0xb7, 0x98, 0x4a, 0x22, 0x4f, 0xd0, 0x62, 0x4a, 0x79, 0xb3, 0xaa, - 0xbe, 0x7e, 0xa8, 0x8f, 0x4a, 0x5c, 0x3f, 0xe5, 0x4c, 0x50, 0x3b, 0x08, 0xec, 0x20, 0xb2, 0x17, - 0xe1, 0x12, 0x52, 0x90, 0xbd, 0x1a, 0xd9, 0xab, 0xb1, 0xbd, 0xda, 0xb7, 0x57, 0x07, 0xf6, 0xea, - 0xd0, 0x5e, 0x1d, 0xd9, 0xab, 0xcc, 0x4e, 0xed, 0x34, 0xa3, 0x9b, 0x46, 0x7c, 0xd9, 0xcc, 0x3d, - 0xff, 0x1a, 0xa3, 0x57, 0x12, 0xa8, 0xa3, 0xaa, 0x89, 0x0c, 0x23, 0x50, 0x55, 0xe1, 0x31, 0x50, - 0x65, 0x32, 0x8c, 0xb1, 0x95, 0x57, 0xbb, 0x2a, 0x2f, 0x91, 0x0e, 0xd2, 0xe2, 0x1c, 0x46, 0x15, - 0x93, 0x43, 0x18, 0x42, 0x35, 0x92, 0x42, 0x88, 0xd2, 0xb9, 0xd1, 0xa7, 0xd4, 0x5e, 0xa5, 0xef, - 0x18, 0xaa, 0x2a, 0x96, 0xc5, 0x22, 0x3b, 0x8f, 0x36, 0x52, 0x2e, 0x95, 0x08, 0xd0, 0xb2, 0xf0, - 0xff, 0x67, 0x86, 0xf9, 0x47, 0x7b, 0x32, 0xf1, 0x16, 0xe0, 0x1c, 0xf0, 0x39, 0xa7, 0x10, 0xd6, - 0x69, 0x87, 0x2f, 0xea, 0xaf, 0x2a, 0x4a, 0x0c, 0x4f, 0x6b, 0x41, 0x93, 0xb3, 0x28, 0x0c, 0xcc, - 0x90, 0x52, 0xef, 0x53, 0x3a, 0xa6, 0xcf, 0x16, 0x20, 0xb5, 0x22, 0xbe, 0x0a, 0x96, 0x9a, 0x18, - 0x03, 0x3e, 0x13, 0xc6, 0xcb, 0xcd, 0x2e, 0x8e, 0x32, 0x76, 0x40, 0x84, 0xc1, 0xe4, 0x65, 0x62, - 0xcc, 0x56, 0xe6, 0x27, 0x88, 0x98, 0x18, 0xb4, 0xe1, 0x9b, 0x03, 0xc6, 0xe9, 0xd3, 0x15, 0x8b, - 0x00, 0x41, 0x91, 0x08, 0xdb, 0xa7, 0x37, 0x9a, 0x20, 0x6f, 0xe8, 0x51, 0x7f, 0xa8, 0x11, 0x7d, - 0x09, 0xd3, 0x63, 0x50, 0xb5, 0x23, 0xe8, 0x06, 0xfb, 0x2b, 0x54, 0x35, 0x65, 0xc6, 0xd4, 0xfe, - 0xe1, 0xe7, 0x19, 0x87, 0x35, 0x29, 0x0b, 0xa1, 0xc8, 0xcb, 0xb6, 0x32, 0x2c, 0x6f, 0x4a, 0x89, - 0x46, 0x5e, 0xca, 0xe9, 0xc4, 0x7c, 0xd9, 0xee, 0x38, 0xde, 0xa6, 0xcc, 0xf7, 0xb5, 0x0a, 0x40, - 0x15, 0xb1, 0x45, 0x90, 0x70, 0x8d, 0x42, 0x9d, 0x83, 0x4d, 0xa1, 0x5b, 0xd8, 0x3f, 0xd6, 0x9a, - 0x39, 0x00, 0xcd, 0xb8, 0xe9, 0x1d, 0xcc, 0x6a, 0xbb, 0x77, 0x22, 0xba, 0x00, 0x43, 0xc9, 0x68, - 0x6c, 0x3c, 0x01, 0xfc, 0x4a, 0xda, 0x0e, 0x0c, 0xc1, 0xd2, 0xb5, 0x33, 0x2e, 0x96, 0x82, 0x82, - 0x27, 0xee, 0x61, 0x75, 0xa9, 0xc2, 0xad, 0x06, 0xb7, 0x6e, 0xec, 0x8c, 0x8c, 0x03, 0xba, 0x63, - 0x3d, 0x24, 0x00, 0x5e, 0x8d, 0x95, 0xe0, 0x80, 0xd6, 0xd9, 0x2f, 0xd3, 0xdc, 0xb1, 0x19, 0x1b, - 0x95, 0x63, 0x25, 0xf8, 0xa8, 0x06, 0xae, 0xc7, 0x81, 0x83, 0x51, 0x9d, 0x03, 0x35, 0xd3, 0xe0, - 0xa1, 0x58, 0xbe, 0xae, 0x2c, 0x2f, 0xf1, 0xec, 0xb0, 0x51, 0x62, 0x3f, 0x6a, 0xc8, 0xc7, 0x6d, - 0xc1, 0x3e, 0x72, 0x0b, 0xec, 0xcf, 0x6a, 0xd8, 0xc7, 0x2d, 0xb8, 0xc7, 0x72, 0x69, 0xb4, 0xfc, - 0x17, 0x99, 0x6a, 0x1c, 0xcc, 0xa5, 0x15, 0x95, 0x2a, 0x61, 0xaf, 0x9c, 0xc3, 0x4d, 0xe1, 0xb9, - 0x9a, 0x96, 0x5b, 0x07, 0x23, 0xdf, 0x46, 0x69, 0x4f, 0xe6, 0x32, 0x57, 0x22, 0x80, 0xe6, 0x63, - 0xed, 0x1c, 0x0c, 0x87, 0x1b, 0xc7, 0x91, 0xcf, 0x0c, 0x32, 0x78, 0x28, 0xd6, 0x93, 0x91, 0x2e, - 0x03, 0x9e, 0xfa, 0xf3, 0xe0, 0x90, 0x0e, 0xf5, 0x53, 0xb6, 0x9c, 0x7b, 0xfd, 0xf1, 0x70, 0xdf, - 0x1e, 0x8f, 0xe0, 0x67, 0x7c, 0x60, 0x43, 0x53, 0xdc, 0xaf, 0x43, 0x0e, 0x06, 0x5b, 0x77, 0x99, - 0x85, 0x41, 0x91, 0x18, 0xf0, 0x41, 0x0d, 0xa1, 0x7d, 0x72, 0x90, 0xa0, 0xfc, 0x6e, 0xd2, 0x0a, - 0x0e, 0xe6, 0x71, 0xc2, 0x27, 0x19, 0x85, 0xb4, 0x25, 0xfa, 0xf2, 0x76, 0x03, 0x94, 0x19, 0xfd, - 0xa1, 0x3d, 0x5a, 0x64, 0x06, 0x9b, 0x02, 0x1d, 0xdf, 0x0f, 0x3a, 0xde, 0x01, 0x95, 0x92, 0x81, - 0x08, 0x17, 0x6c, 0xaa, 0x46, 0x7e, 0x3c, 0x1c, 0x6a, 0xee, 0x79, 0x5c, 0x11, 0x9e, 0xfb, 0x4c, - 0x5b, 0x50, 0x98, 0xc8, 0xe0, 0xb7, 0x88, 0xe8, 0x5d, 0xc1, 0x45, 0x65, 0x0c, 0x16, 0x00, 0x05, - 0xdc, 0xf1, 0x29, 0x7a, 0xe0, 0x46, 0x16, 0x35, 0x32, 0x55, 0xf2, 0x89, 0x1a, 0xd2, 0xc8, 0x05, - 0x85, 0x92, 0xe7, 0x3e, 0xd1, 0x1e, 0x2c, 0x82, 0x91, 0x7f, 0x58, 0x15, 0xed, 0xf1, 0x89, 0x3d, - 0x1e, 0x9e, 0xd8, 0xa3, 0x93, 0xe3, 0x0e, 0xc9, 0xce, 0x97, 0x8e, 0xac, 0xb4, 0x00, 0x27, 0x7c, - 0x2d, 0x31, 0xee, 0x64, 0xcd, 0xa7, 0x8b, 0xc5, 0x62, 0x77, 0x54, 0xe9, 0xef, 0xf0, 0xd0, 0x36, - 0x3f, 0x6a, 0x97, 0x12, 0x15, 0xee, 0x21, 0x01, 0x68, 0xe0, 0x44, 0x45, 0xe0, 0xc5, 0xda, 0x2b, - 0xe7, 0xc6, 0xe9, 0xf8, 0xca, 0x0b, 0xd8, 0x2d, 0xca, 0x4e, 0x26, 0x00, 0xf9, 0x34, 0x19, 0x12, - 0x4c, 0xb8, 0x50, 0xe4, 0x90, 0x21, 0x91, 0xbb, 0x0c, 0x6d, 0xfc, 0xd7, 0x1d, 0x1e, 0x0e, 0x4c, - 0x30, 0xd9, 0xd4, 0x32, 0x03, 0xc6, 0x76, 0x13, 0x65, 0xd6, 0x34, 0x82, 0xea, 0xcf, 0x39, 0x96, - 0xb2, 0xd2, 0x63, 0x15, 0xde, 0x6a, 0xe9, 0x62, 0x7e, 0x7c, 0x7c, 0x32, 0x5a, 0xd4, 0x07, 0xe5, - 0x86, 0xa3, 0x67, 0xfb, 0xf6, 0x68, 0x3c, 0xb2, 0xf7, 0x47, 0x86, 0xab, 0x1a, 0x22, 0x2d, 0x3d, - 0xbd, 0xd5, 0x91, 0xda, 0xea, 0x7e, 0x11, 0x06, 0x47, 0x27, 0x90, 0x9c, 0xba, 0xa4, 0x38, 0x3a, - 0xb0, 0x47, 0x87, 0xcf, 0xec, 0x83, 0xa3, 0xbf, 0x47, 0x88, 0x72, 0xba, 0x2a, 0xc4, 0x21, 0x48, - 0x70, 0x84, 0x85, 0x8a, 0xb3, 0x0f, 0xbf, 0xaa, 0x92, 0x1c, 0x0d, 0xec, 0x21, 0x81, 0xb8, 0x4b, - 0x8e, 0x70, 0x76, 0xdc, 0x98, 0x95, 0x72, 0x8e, 0x03, 0x1d, 0x16, 0xee, 0xa2, 0x6a, 0x50, 0x30, - 0x31, 0xa0, 0x64, 0x7f, 0xff, 0x21, 0xec, 0x2f, 0xbc, 0xc5, 0xf0, 0xd9, 0x49, 0xa7, 0x11, 0x0d, - 0xed, 0xf1, 0x01, 0x38, 0xda, 0xfe, 0x71, 0x2b, 0xff, 0xb0, 0x14, 0xbb, 0x81, 0xc4, 0xf8, 0xac, - 0x72, 0xd5, 0x09, 0x0e, 0x91, 0xf1, 0x9e, 0xfa, 0x90, 0x14, 0xcd, 0xa1, 0xf9, 0x77, 0x0e, 0x1f, - 0x42, 0xcf, 0xc1, 0xf8, 0xe4, 0x84, 0x8e, 0x3a, 0xe8, 0x39, 0x3a, 0x02, 0x6d, 0x60, 0x4c, 0x6a, - 0xb5, 0x69, 0x25, 0x15, 0xe3, 0x39, 0xed, 0xde, 0x88, 0x0e, 0x73, 0xaf, 0x97, 0x34, 0x7c, 0xd1, - 0xa4, 0x45, 0xa4, 0xff, 0x41, 0x96, 0x3b, 0x9e, 0x1f, 0xf9, 0xf3, 0x61, 0x8b, 0xe5, 0x1e, 0x80, - 0xe1, 0x0e, 0x9f, 0xd9, 0xa3, 0xe3, 0xa3, 0x4e, 0xcb, 0xd5, 0xe6, 0xd4, 0xb4, 0x25, 0xad, 0x58, - 0x63, 0x6c, 0xf1, 0xce, 0x82, 0x7d, 0x15, 0xd2, 0xf0, 0x3d, 0x88, 0x7c, 0xfd, 0x41, 0xce, 0xf6, - 0xf4, 0x2d, 0xb4, 0x39, 0x0b, 0xd6, 0x44, 0xbf, 0x7d, 0xb6, 0xcc, 0xad, 0x2a, 0x8b, 0xa8, 0x83, - 0x56, 0xab, 0xc5, 0x19, 0x4e, 0x82, 0x03, 0x5f, 0x5e, 0x35, 0x0b, 0xc2, 0x1b, 0xd2, 0xf3, 0x23, - 0x8f, 0xf3, 0xa9, 0x85, 0x57, 0x9c, 0x3c, 0x08, 0x8c, 0x19, 0x89, 0xef, 0x64, 0x86, 0x21, 0x98, - 0xf4, 0x08, 0xa6, 0x32, 0xb3, 0x54, 0xaf, 0x44, 0x2b, 0x20, 0x95, 0x2c, 0x50, 0x60, 0x0a, 0x61, - 0x7f, 0xff, 0xa6, 0xd8, 0xb9, 0xda, 0x4f, 0x58, 0x06, 0x18, 0x1b, 0x44, 0x18, 0xb4, 0xce, 0x91, - 0x4c, 0x82, 0xf7, 0xcc, 0x88, 0xbe, 0x67, 0x06, 0x55, 0xac, 0xeb, 0xba, 0x67, 0x7b, 0x80, 0x0a, - 0xef, 0x9a, 0x25, 0xac, 0x78, 0xdf, 0x53, 0xd9, 0xdb, 0x80, 0x9b, 0x3d, 0x0a, 0x0d, 0x59, 0xe7, - 0xbd, 0x19, 0xcb, 0xb2, 0xb5, 0x5d, 0xc7, 0x99, 0x50, 0x1a, 0x70, 0xf2, 0x07, 0xef, 0xc6, 0x9b, - 0x49, 0x6c, 0x4f, 0x34, 0xfe, 0xb3, 0xbd, 0x76, 0xfc, 0x85, 0x14, 0x2c, 0xd2, 0xd3, 0x5b, 0x54, - 0xf3, 0xcd, 0x5c, 0x16, 0x77, 0xc8, 0x70, 0x1e, 0x19, 0x10, 0x4c, 0x24, 0xa4, 0xcc, 0xc0, 0xe0, - 0x00, 0x44, 0x67, 0x24, 0x12, 0x2d, 0xcb, 0xdc, 0x0e, 0x04, 0x92, 0xb3, 0x28, 0x34, 0x50, 0x95, - 0x2c, 0x44, 0xaa, 0x49, 0x08, 0x71, 0x7b, 0x64, 0x95, 0xd1, 0xc5, 0xd4, 0xda, 0xb3, 0xce, 0xdf, - 0xb2, 0x98, 0x9e, 0xed, 0x79, 0xf8, 0xd2, 0xeb, 0x66, 0x59, 0xe8, 0x0a, 0xca, 0x02, 0xa2, 0xca, - 0x00, 0x52, 0x4b, 0xfd, 0x16, 0x81, 0x66, 0x32, 0x02, 0x2e, 0xf2, 0x0c, 0x9b, 0xac, 0x97, 0xea, - 0x82, 0x20, 0x5e, 0x4d, 0x7c, 0xc1, 0xee, 0xa6, 0xd6, 0x10, 0x22, 0xfa, 0x18, 0xff, 0xb3, 0xf6, - 0x50, 0x02, 0x51, 0xf8, 0x78, 0x92, 0x9e, 0x16, 0x8a, 0xac, 0x25, 0x46, 0x4b, 0x29, 0x3f, 0x8d, - 0xac, 0x73, 0x45, 0x2d, 0x22, 0x87, 0xdf, 0x39, 0xde, 0x9e, 0xd4, 0x12, 0x47, 0x29, 0xe3, 0x22, - 0x73, 0x6d, 0xa1, 0xe0, 0x46, 0xda, 0x93, 0x49, 0x87, 0xa4, 0x0c, 0xb7, 0xa4, 0x48, 0x4f, 0x04, - 0x2a, 0x41, 0x82, 0x95, 0x1f, 0x92, 0x92, 0x16, 0x82, 0x37, 0x25, 0x01, 0x88, 0xf6, 0x6a, 0xe5, - 0x25, 0xd7, 0x64, 0xcd, 0x72, 0xf2, 0xb7, 0xff, 0xfc, 0x6f, 0x02, 0x3d, 0x0d, 0x09, 0x13, 0x2e, - 0xbc, 0x48, 0xde, 0xe1, 0x13, 0x2b, 0x2a, 0xad, 0x22, 0xd6, 0x46, 0x31, 0x63, 0x0b, 0x71, 0x0b, - 0x25, 0xbb, 0x4b, 0xfe, 0xe7, 0xbf, 0xfe, 0xed, 0x5f, 0xcf, 0xf6, 0x52, 0xc4, 0x7a, 0xde, 0xfb, - 0x0b, 0x40, 0xaf, 0x3c, 0x30, 0x1e, 0x9a, 0xc8, 0xcb, 0x04, 0x12, 0xae, 0x38, 0x7c, 0x7b, 0xcf, - 0x02, 0x00, 0xb8, 0x48, 0x08, 0x1e, 0xbd, 0x91, 0xef, 0xe9, 0x5c, 0x56, 0xed, 0x0b, 0xa8, 0xf8, - 0xe5, 0xb6, 0xb7, 0x20, 0x78, 0x32, 0xa7, 0x04, 0x21, 0x09, 0xe8, 0x05, 0x4f, 0x39, 0x61, 0x3c, - 0xc3, 0x3b, 0x67, 0xd0, 0x3a, 0x73, 0x17, 0x4c, 0x5a, 0x6f, 0xf4, 0x06, 0x48, 0xe0, 0xf9, 0x72, - 0x49, 0x39, 0xbe, 0x21, 0xe0, 0xc4, 0x4b, 0xf0, 0xad, 0x0f, 0x6c, 0x91, 0xaa, 0x83, 0xf1, 0x25, - 0x43, 0x04, 0xf1, 0x1a, 0xa5, 0xde, 0x53, 0x62, 0x5f, 0x09, 0x91, 0xf2, 0xc9, 0xde, 0xde, 0x32, - 0x14, 0xab, 0x7c, 0x0e, 0x21, 0x39, 0xde, 0x9b, 0xbd, 0xf0, 0x3e, 0xb3, 0xc4, 0xff, 0xd9, 0xbb, - 0xde, 0x5b, 0x95, 0xbc, 0x59, 0xe7, 0xdf, 0xca, 0x25, 0x24, 0xcd, 0xd8, 0x67, 0xea, 0x0b, 0xd4, - 0x86, 0xda, 0xd7, 0xf8, 0x95, 0x51, 0x43, 0xe5, 0xf8, 0xb3, 0xd5, 0x61, 0x1f, 0xe5, 0x17, 0x10, - 0x35, 0xad, 0x5f, 0x5b, 0xc5, 0xef, 0xa8, 0xf8, 0x1d, 0x57, 0xf7, 0x0e, 0x50, 0x3e, 0xea, 0x38, - 0x42, 0xea, 0x48, 0xdd, 0xd1, 0x54, 0xf7, 0x6c, 0xc9, 0xdf, 0xfe, 0xe3, 0xdf, 0xa5, 0xfe, 0x51, - 0x29, 0x35, 0xd5, 0x1a, 0x0d, 0x2d, 0xf3, 0x30, 0x90, 0xca, 0x05, 0x32, 0xf0, 0x48, 0x7a, 0x1f, - 0x70, 0xd2, 0x94, 0xbb, 0x6a, 0xf1, 0x3c, 0xab, 0xf0, 0x61, 0x0e, 0xbf, 0x15, 0x51, 0xe7, 0xbd, - 0x37, 0x61, 0x06, 0x5b, 0xe2, 0x08, 0xf9, 0x04, 0x12, 0x07, 0x53, 0x01, 0x0b, 0x33, 0x47, 0xdb, - 0x8b, 0x8c, 0xc5, 0x15, 0x72, 0x50, 0xab, 0x7e, 0x14, 0xfa, 0xd7, 0x44, 0x5f, 0xbc, 0x70, 0xab, - 0x7a, 0x28, 0x03, 0x66, 0x79, 0x4c, 0xdd, 0xa5, 0x06, 0x99, 0x62, 0x6b, 0x4b, 0xcd, 0x69, 0xfb, - 0x79, 0x6f, 0xf7, 0x5a, 0xc5, 0xad, 0xba, 0x56, 0x71, 0x26, 0x33, 0x73, 0xb9, 0x5f, 0x2b, 0x5f, - 0xe3, 0x52, 0x9b, 0xcd, 0x4d, 0x81, 0xdb, 0x4b, 0x6c, 0x67, 0x89, 0x57, 0x1e, 0xdd, 0x93, 0x11, - 0xe9, 0xc3, 0xf4, 0x80, 0xfc, 0xb3, 0x3e, 0xeb, 0x20, 0xf2, 0x92, 0xcd, 0xae, 0x0e, 0x4a, 0xde, - 0x61, 0x81, 0x66, 0xbf, 0x57, 0x63, 0x5f, 0x7f, 0xa4, 0xda, 0x38, 0x55, 0x47, 0x2c, 0x69, 0x33, - 0xb7, 0x15, 0x00, 0x54, 0xa2, 0x00, 0x6a, 0xab, 0x77, 0xb5, 0x94, 0x79, 0x18, 0xbb, 0x82, 0x9e, - 0xd9, 0x89, 0xf0, 0x48, 0x0d, 0xec, 0x9e, 0x91, 0x17, 0x90, 0xea, 0xf4, 0x2e, 0x0a, 0x61, 0x07, - 0x66, 0x03, 0x5d, 0xa9, 0x59, 0xc8, 0x0a, 0x33, 0xcb, 0xc4, 0x8c, 0x1c, 0x9b, 0x20, 0xae, 0x0c, - 0xb6, 0x30, 0x43, 0x4c, 0x87, 0x63, 0x4c, 0x8c, 0x07, 0x44, 0xa5, 0x67, 0xd2, 0xa8, 0x1d, 0x8c, - 0x6d, 0x93, 0xb2, 0x6a, 0x82, 0xfd, 0x0a, 0x56, 0x2a, 0xb7, 0x66, 0x6a, 0x76, 0x5e, 0xe1, 0x43, - 0x4a, 0xab, 0xc9, 0x45, 0x4d, 0x6a, 0x15, 0x1f, 0x2e, 0x2e, 0x88, 0xed, 0xf8, 0x29, 0x69, 0x64, - 0xe9, 0x71, 0x61, 0x49, 0x15, 0xee, 0xcb, 0x12, 0xda, 0xb0, 0x83, 0xdd, 0x39, 0xb8, 0xe2, 0x3e, - 0xd9, 0xa9, 0xe7, 0x5b, 0xbc, 0x16, 0xbe, 0x95, 0x92, 0x89, 0x03, 0x53, 0xb0, 0x56, 0x79, 0x87, - 0xac, 0xac, 0x49, 0x2c, 0x0c, 0xb2, 0x83, 0x88, 0xfd, 0x5f, 0x95, 0x08, 0xf9, 0x5e, 0xae, 0x20, - 0x41, 0x49, 0x53, 0x12, 0xd2, 0x0c, 0x34, 0x4a, 0xed, 0x31, 0xa0, 0xc2, 0x50, 0x34, 0x33, 0x27, - 0xa6, 0xa4, 0x1f, 0xe2, 0xf9, 0xad, 0xef, 0x0e, 0x7a, 0x05, 0x16, 0x63, 0xbc, 0x55, 0x3c, 0x12, - 0x0a, 0x2f, 0xbe, 0xc8, 0xb3, 0x56, 0x79, 0x49, 0x9e, 0x28, 0x48, 0x96, 0x04, 0xbc, 0xe9, 0x95, - 0xbd, 0x33, 0xf9, 0x3e, 0xc9, 0x00, 0x63, 0x08, 0xac, 0xf0, 0x02, 0x4f, 0x5a, 0x20, 0x25, 0xd7, - 0x96, 0xd4, 0xfb, 0xce, 0x79, 0xae, 0xe1, 0xa9, 0xf7, 0x10, 0xa6, 0xfe, 0xf4, 0xf2, 0xa5, 0x8e, - 0x9e, 0x78, 0xf4, 0xdc, 0xce, 0x4e, 0xaf, 0xca, 0x4f, 0x0f, 0x19, 0xd2, 0xae, 0xad, 0x2f, 0xf4, - 0x70, 0xe9, 0xf4, 0x37, 0x2c, 0x12, 0x10, 0x87, 0x5c, 0xc8, 0xa8, 0x31, 0x45, 0x42, 0x38, 0x14, - 0x0e, 0x24, 0xa3, 0x3f, 0xe5, 0x21, 0x2e, 0xe1, 0x30, 0x5a, 0xd9, 0x89, 0x63, 0xac, 0x58, 0x82, - 0x75, 0x4a, 0xd8, 0x14, 0x92, 0x27, 0x24, 0x28, 0x83, 0xd0, 0xed, 0x35, 0x23, 0xd6, 0xe3, 0x45, - 0xd3, 0xab, 0xc8, 0x66, 0xe7, 0xc0, 0xfa, 0x37, 0xb2, 0xbc, 0xef, 0xc3, 0x45, 0xf8, 0x0b, 0xec, - 0x6e, 0x76, 0xf1, 0xea, 0x01, 0x8a, 0x41, 0xbd, 0xe0, 0x52, 0x99, 0xf0, 0xf4, 0xe5, 0x76, 0xe0, - 0xd5, 0x6d, 0x17, 0x65, 0xef, 0xb1, 0x66, 0x56, 0x3b, 0xc7, 0xad, 0x93, 0xdf, 0xbb, 0x9f, 0xfe, - 0x4b, 0x7d, 0x44, 0xac, 0x09, 0xe9, 0x76, 0x15, 0x69, 0x5a, 0x66, 0x35, 0xda, 0x07, 0x24, 0x96, - 0x10, 0xff, 0x36, 0x44, 0xa7, 0x95, 0x5b, 0x10, 0x1f, 0x14, 0xf1, 0x02, 0xa6, 0xaf, 0xbf, 0x36, - 0x5b, 0xc5, 0x39, 0xf6, 0x6f, 0x15, 0x94, 0x30, 0x65, 0x3e, 0xde, 0x36, 0xd4, 0x8d, 0x3f, 0xf2, - 0x51, 0x9e, 0x46, 0x95, 0x02, 0xee, 0xdd, 0x13, 0x8c, 0xac, 0x9f, 0x69, 0xc6, 0x88, 0xbc, 0x8f, - 0x62, 0x49, 0x5b, 0x91, 0xa2, 0x55, 0x78, 0x94, 0x5f, 0x7f, 0xb5, 0xc8, 0xb4, 0x7b, 0x8f, 0x42, - 0x27, 0xac, 0x87, 0x31, 0x57, 0x54, 0x16, 0xaf, 0xd4, 0x35, 0x8a, 0x56, 0x03, 0xda, 0xf1, 0x01, - 0xc9, 0x99, 0x64, 0x0c, 0xfa, 0x5f, 0x5a, 0x94, 0x27, 0xd6, 0xd7, 0xb2, 0x98, 0xf6, 0x1b, 0x1e, - 0x8f, 0x0a, 0xba, 0x2f, 0xcb, 0xbb, 0x17, 0xe4, 0xaa, 0xbc, 0xd2, 0xf1, 0x10, 0xfe, 0xa0, 0xdd, - 0x08, 0x55, 0xbc, 0x2d, 0x6e, 0x53, 0x56, 0x2e, 0x85, 0x90, 0x40, 0xd6, 0x7f, 0x72, 0xbe, 0x72, - 0xc1, 0x03, 0x1b, 0x00, 0xbc, 0xc9, 0xf5, 0xf5, 0xe2, 0xea, 0x03, 0x2e, 0xa6, 0x3c, 0x2a, 0x46, - 0x54, 0x25, 0xf2, 0x46, 0x5e, 0x47, 0x79, 0x9c, 0x30, 0x24, 0x29, 0x50, 0x2b, 0x21, 0xbc, 0xba, - 0xce, 0x52, 0x98, 0x76, 0xb5, 0x18, 0xfd, 0x1a, 0x96, 0xdd, 0x2e, 0x80, 0xfa, 0x1d, 0x9a, 0x07, - 0x71, 0x5d, 0x2b, 0x0b, 0x5b, 0x5f, 0x93, 0x94, 0x5b, 0xd5, 0xfe, 0xc8, 0x09, 0xcd, 0x1c, 0x74, - 0x0d, 0xac, 0x27, 0xcc, 0xa4, 0xe2, 0xe2, 0xaf, 0x99, 0x9e, 0x14, 0x2c, 0xea, 0x6a, 0xb7, 0xa7, - 0xcb, 0xdd, 0xf2, 0x8f, 0xce, 0x2a, 0xaf, 0x79, 0x0c, 0x01, 0xa4, 0xbb, 0xfc, 0x3d, 0x78, 0x68, - 0xf9, 0x8b, 0xa7, 0x4a, 0x3b, 0x25, 0xb0, 0xc6, 0x55, 0x19, 0x3d, 0x2c, 0x83, 0x64, 0xb5, 0x1a, - 0x6e, 0xde, 0xcf, 0xef, 0x2a, 0x89, 0x9f, 0xab, 0x56, 0x4f, 0xc7, 0xcb, 0x5a, 0x65, 0xdc, 0xfb, - 0x4d, 0x22, 0xf7, 0xfb, 0x3f, 0x5e, 0x5d, 0xfd, 0x82, 0xa4, 0x2e, 0x2f, 0xc3, 0xb5, 0x19, 0x79, - 0xaf, 0x16, 0xb1, 0xd5, 0x3a, 0xfc, 0x73, 0x4d, 0x02, 0xf6, 0x7c, 0x71, 0xf9, 0x95, 0x82, 0x58, - 0xf5, 0x42, 0xde, 0xa3, 0x1c, 0xf5, 0x3b, 0xde, 0x11, 0x87, 0x6b, 0x89, 0xfc, 0x63, 0x8a, 0x3e, - 0xe1, 0x45, 0xd2, 0x01, 0xf1, 0xae, 0x9e, 0x6c, 0xd2, 0x73, 0xbc, 0xf1, 0x85, 0xc7, 0xb9, 0x82, - 0x7e, 0x4d, 0x36, 0xe4, 0x5d, 0xc0, 0x5f, 0xa9, 0x22, 0xa9, 0x31, 0x92, 0x56, 0x4a, 0x93, 0x5f, - 0x8b, 0x99, 0x6a, 0x1d, 0xf2, 0x08, 0x86, 0x58, 0x26, 0x1e, 0x56, 0x5e, 0xe1, 0xd5, 0x4a, 0xec, - 0xde, 0x65, 0x06, 0x81, 0x0d, 0x09, 0xaf, 0x1a, 0xe2, 0xd7, 0x61, 0x01, 0x6f, 0x6f, 0xee, 0xbc, - 0x50, 0x2e, 0x3d, 0xe6, 0x9b, 0x64, 0xce, 0xd3, 0xd3, 0xe2, 0x5d, 0xc4, 0xff, 0xad, 0x9e, 0xbc, - 0x76, 0xbd, 0xb6, 0xb3, 0x2d, 0xc7, 0x17, 0x83, 0x65, 0x2f, 0xdb, 0x08, 0x42, 0xd5, 0x97, 0x3a, - 0x1a, 0x16, 0x6a, 0x4c, 0xc8, 0x12, 0x00, 0x04, 0xe4, 0xed, 0x93, 0x34, 0x02, 0xf2, 0xd2, 0xcc, - 0x19, 0x0d, 0x49, 0x44, 0x3d, 0x79, 0x0c, 0xac, 0xee, 0x56, 0x29, 0x96, 0x20, 0xa7, 0x4b, 0x4a, - 0x81, 0x57, 0xfc, 0x3a, 0xaa, 0x85, 0x26, 0x9d, 0x14, 0x2a, 0x97, 0xb5, 0xdb, 0x53, 0x87, 0xbc, - 0x63, 0x60, 0x41, 0x8c, 0x54, 0xba, 0x48, 0x49, 0x1d, 0x4a, 0xde, 0x04, 0x57, 0x86, 0x52, 0xaf, - 0x58, 0xbc, 0x39, 0x67, 0x51, 0x2e, 0xb0, 0x51, 0x85, 0x64, 0xe6, 0xac, 0x1d, 0xd8, 0x1c, 0xeb, - 0x37, 0xf8, 0xdc, 0x79, 0x17, 0x4c, 0xe2, 0xcc, 0x39, 0xb0, 0x1a, 0xaf, 0xa3, 0x6f, 0x81, 0xb7, - 0x15, 0xfc, 0xe0, 0xcb, 0x67, 0x47, 0xbf, 0x7b, 0xee, 0x7e, 0xed, 0x5c, 0xb7, 0xba, 0x5f, 0x22, - 0x32, 0x90, 0xd2, 0x32, 0xa3, 0x34, 0xb9, 0x47, 0x4e, 0xe6, 0x1e, 0xfb, 0x63, 0x25, 0x55, 0xbd, - 0x35, 0xdf, 0x56, 0x52, 0xff, 0xa6, 0xb2, 0x6a, 0xbc, 0x05, 0xda, 0xc3, 0x83, 0x1f, 0x79, 0x0e, - 0x84, 0xff, 0x97, 0x82, 0xff, 0x05, 0x8d, 0x5f, 0x4b, 0x04, 0xb5, 0x40, 0x00, 0x00 - }; - \ No newline at end of file diff --git a/src/html_settings.h b/src/html_settings.h index ee90eec..008f4e7 100644 --- a/src/html_settings.h +++ b/src/html_settings.h @@ -2,24 +2,4 @@ * More web UI HTML source arrays. * This file is auto generated, please don't make any changes manually. */ - - // Autogenerated from html/settings_tare.htm, do not edit!! - const char PAGE_settings_tare[] PROGMEM = R"=====(Tare Weight%CSS%%SCSS%

    Auto Tare Information

    -This procedure will guide you throught a small setup with two steps.



    -

    -1. Remove all weights from the scale and click on Start, wait until the led is blinking. -

    -2. Take a weight with a measure of 1 (one) Kilogram and place it on the Scale and click on Start. Wait until the led is blinking -

    )====="; - - - // Autogenerated from html/settings_general.htm, do not edit!! - const char PAGE_settings_time[] PROGMEM = R"=====()====="; - \ No newline at end of file diff --git a/tools/cdata.js b/tools/cdata.js index 2035453..de09d97 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -188,48 +188,4 @@ writeHtmlGzipped("html/index.htm", "src/html.h"); - writeChunks( - "html", - [ - { - file: "style.css", - name: "PAGE_settingsCss", - prepend: "=====()=====", - method: "plaintext", - filter: "css-minify", - }, - - { - file: "settings_tare.htm", - name: "PAGE_settings_tare", - prepend: "=====(", - append: ")=====", - method: "plaintext", - filter: "html-minify", - mangle: (str) => - str - .replace(/\/gms, "") - .replace(/\.*\<\/style\>/gms, "%CSS%%SCSS%") - .replace( - /function GetV().*\<\/script\>/gms, - "function GetV() {var d=document;\n" - ), - }, - { - file: "settings_general.htm", - name: "PAGE_settings_time", - prepend: "=====(", - append: ")=====", - method: "plaintext", - filter: "html-minify", - mangle: (str) => - str - .replace(/\/gms, "") - .replace(/\.*\<\/style\>/gms, "%CSS%%SCSS%") - .replace(/function GetV().*\<\/script\>/gms, "function GetV() {\n"), - } - ], - "src/html_settings.h" - ); \ No newline at end of file From 681bbe954d73ad2fc6914e2e9f963e0bba9456be Mon Sep 17 00:00:00 2001 From: sascha bajonczak Date: Thu, 3 Mar 2022 14:21:34 +0100 Subject: [PATCH 62/99] Removed mqtt Settings --- html/index.htm | 4 ++-- html/index.js | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/html/index.htm b/html/index.htm index 9afb052..4ad2ed6 100644 --- a/html/index.htm +++ b/html/index.htm @@ -148,7 +148,7 @@

    Adjust Scale

    - MQTT
    Server

    @@ -169,7 +169,7 @@ Port

    The port of the mqtt server
    - + -->
     
    -