From b51be31d8a20d42d060367946a258e188f1c82fe Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Thu, 8 Nov 2018 23:57:50 +0100 Subject: [PATCH 01/33] added initial PlatformIO config. still needs work --- .gitignore | 4 +++ .travis.yml | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/README | 39 +++++++++++++++++++++++++++++ lib/README | 46 ++++++++++++++++++++++++++++++++++ platformio.ini | 30 ++++++++++++++++++++++ test/README | 11 +++++++++ 6 files changed, 197 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 include/README create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..04451df40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.pio +.pioenvs +.piolibdeps +.vscode diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..7c486f183 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to be used as a library with examples. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/include/README b/include/README new file mode 100644 index 000000000..194dcd432 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/README b/lib/README new file mode 100644 index 000000000..6debab1e8 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 000000000..d7c56ff74 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,30 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +src_dir = wled00 + +[env:esp01] +platform = espressif8266 +board = esp01 +framework = arduino +monitor_speed = 115200 +; lib_ldf_mode = chain+ # for overwriting MQTT_MAX_PACKET_SIZE in MqttJsonClient.h, see: http://docs.platformio.org/en/latest/librarymanager/ldf.html#ldf-mode +; build_flags = -DMQTT_MAX_PACKET_SIZE +lib_deps = + Blynk + PubSubClient + E131 + Time + Timezone + webserver + WS2812FX + NeoPixelBus + FastLED diff --git a/test/README b/test/README new file mode 100644 index 000000000..df5066e64 --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html From 67013bd58f83eeb27cbc2bdf1884ca8ace899003 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Sun, 11 Nov 2018 19:34:19 +0100 Subject: [PATCH 02/33] Changed platformio.ini. A few boards are building now --- .travis.yml | 58 +++++++------------------------ platformio.ini | 92 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 92 insertions(+), 58 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7c486f183..fc9b883ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,49 +19,15 @@ # Travis CI documentation (see above). # - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# - platformio update -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to be used as a library with examples. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# - platformio update -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N +language: python +python: + - "2.7" +sudo: false +cache: + directories: + - "~/.platformio" +install: + - pip install -U platformio + - platformio update +script: + - platformio run diff --git a/platformio.ini b/platformio.ini index d7c56ff74..eb2662ece 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,21 +10,89 @@ [platformio] src_dir = wled00 +; env_default = nodemcuv2 + + +[common_env_data] +build_flags = + -D VERSION=0.8.1 + -D DEBUG=1 +framework = arduino +lib_deps_builtin = +lib_deps_external = + # TODO replace libs in /lib with managed libs in here if possible + #Blynk@0.5.4 + #E131@1.0.0 + #webserver + FastLED@3.2.1 + NeoPixelBus@2.3.4 + #PubSubClient@2.7 + #Time@1.5 + #Timezone@1.2.1 + #WS2812FX@1.1.2 + + +# see: http://docs.platformio.org/en/latest/platforms/espressif8266.html +[env:nodemcuv2] +platform = espressif8266 +board = nodemcuv2 +monitor_speed = 115200 +framework = ${common_env_data.framework} +build_flags = + ${common_env_data.build_flags} +lib_deps = + ${common_env_data.lib_deps_builtin} + ${common_env_data.lib_deps_external} + +[env:d1_mini] +platform = espressif8266 +board = d1_mini +monitor_speed = 115200 +framework = ${common_env_data.framework} +build_flags = + ${common_env_data.build_flags} +lib_deps = + ${common_env_data.lib_deps_builtin} + ${common_env_data.lib_deps_external} + +[env:esp01_1m] +platform = espressif8266 +board = esp01_1m +monitor_speed = 115200 +framework = ${common_env_data.framework} +build_flags = + ${common_env_data.build_flags} +lib_deps = + ${common_env_data.lib_deps_builtin} + ${common_env_data.lib_deps_external} [env:esp01] platform = espressif8266 board = esp01 -framework = arduino monitor_speed = 115200 -; lib_ldf_mode = chain+ # for overwriting MQTT_MAX_PACKET_SIZE in MqttJsonClient.h, see: http://docs.platformio.org/en/latest/librarymanager/ldf.html#ldf-mode -; build_flags = -DMQTT_MAX_PACKET_SIZE +framework = ${common_env_data.framework} +build_flags = + ${common_env_data.build_flags} + -DWLED_DISABLE_MOBILE_UI + -DWLED_DISABLE_OTA + -DWLED_DISABLE_ALEXA + -DWLED_DISABLE_BLYNK + -DWLED_DISABLE_CRONIXIE + -DWLED_DISABLE_HUESYNC lib_deps = - Blynk - PubSubClient - E131 - Time - Timezone - webserver - WS2812FX - NeoPixelBus - FastLED + ${common_env_data.lib_deps_builtin} + ${common_env_data.lib_deps_external} + +# see: http://docs.platformio.org/en/latest/platforms/espressif32.html +[env:esp32dev] +platform = espressif32 +board = esp32dev +monitor_speed = 115200 +framework = ${common_env_data.framework} +build_flags = + ${common_env_data.build_flags} + ARDUINO_ARCH_ESP32 +lib_deps = + ${common_env_data.lib_deps_builtin} + ${common_env_data.lib_deps_external} + \ No newline at end of file From a84859c211eb382463125ba278bc47c1830c483f Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Sun, 11 Nov 2018 19:40:08 +0100 Subject: [PATCH 03/33] Changed platformio.ini. A few boards are building now --- platformio.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index eb2662ece..578629a31 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,6 @@ src_dir = wled00 ; env_default = nodemcuv2 - [common_env_data] build_flags = -D VERSION=0.8.1 From 478fa3132c3510f61cd07993c5a38854f03458bc Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Tue, 13 Nov 2018 00:18:49 +0100 Subject: [PATCH 04/33] Minor fixes for PIO support --- .travis.yml | 2 +- platformio.ini | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index fc9b883ec..10e2a9ef4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,4 +30,4 @@ install: - pip install -U platformio - platformio update script: - - platformio run + - platformio ci --board=nodemcuv2 --board=d1_mini --board=esp01_1m diff --git a/platformio.ini b/platformio.ini index 578629a31..f62ecf075 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ [platformio] src_dir = wled00 -; env_default = nodemcuv2 +env_default = esp32dev [common_env_data] build_flags = @@ -72,12 +72,12 @@ monitor_speed = 115200 framework = ${common_env_data.framework} build_flags = ${common_env_data.build_flags} - -DWLED_DISABLE_MOBILE_UI - -DWLED_DISABLE_OTA - -DWLED_DISABLE_ALEXA - -DWLED_DISABLE_BLYNK - -DWLED_DISABLE_CRONIXIE - -DWLED_DISABLE_HUESYNC + -D WLED_DISABLE_MOBILE_UI + -D WLED_DISABLE_OTA + -D WLED_DISABLE_ALEXA + -D WLED_DISABLE_BLYNK + -D WLED_DISABLE_CRONIXIE + -D WLED_DISABLE_HUESYNC lib_deps = ${common_env_data.lib_deps_builtin} ${common_env_data.lib_deps_external} @@ -90,7 +90,8 @@ monitor_speed = 115200 framework = ${common_env_data.framework} build_flags = ${common_env_data.build_flags} - ARDUINO_ARCH_ESP32 + -D ARDUINO_ARCH_ESP32 + -D WORKAROUND_ESP32_BITBANG lib_deps = ${common_env_data.lib_deps_builtin} ${common_env_data.lib_deps_external} From 5a5064e070026b11f2336c010fe452c7f8406e27 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Tue, 13 Nov 2018 00:32:35 +0100 Subject: [PATCH 05/33] fixed travisci build --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10e2a9ef4..57053ea4f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,11 @@ sudo: false cache: directories: - "~/.platformio" +env: + - PLATFORMIO_CI_SRC=wled00 + - PLATFORMIO_BUILD_FLAGS="-D DEBUG=false" install: - pip install -U platformio - platformio update script: - - platformio ci --board=nodemcuv2 --board=d1_mini --board=esp01_1m + - platformio ci --project-conf=./platformio.ini From f2a63c04a866bb7c9293a7981b029e13a77a9eb3 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Tue, 13 Nov 2018 00:33:51 +0100 Subject: [PATCH 06/33] fixed travisci build again... --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 57053ea4f..377c69c06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,8 +27,7 @@ cache: directories: - "~/.platformio" env: - - PLATFORMIO_CI_SRC=wled00 - - PLATFORMIO_BUILD_FLAGS="-D DEBUG=false" + - PLATFORMIO_CI_SRC=wled00 PLATFORMIO_BUILD_FLAGS="-D DEBUG=false" install: - pip install -U platformio - platformio update From e5cef6b8777274e6f67692f4a2d4284e759732f6 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Tue, 13 Nov 2018 00:37:12 +0100 Subject: [PATCH 07/33] fixed DEBUG constant for travis build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 377c69c06..5649c37f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ cache: directories: - "~/.platformio" env: - - PLATFORMIO_CI_SRC=wled00 PLATFORMIO_BUILD_FLAGS="-D DEBUG=false" + - PLATFORMIO_CI_SRC=wled00 PLATFORMIO_BUILD_FLAGS="-D DEBUG=0" install: - pip install -U platformio - platformio update From 612d6f85bdb5700fc2f9240ad2a8baae19f64b84 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Wed, 14 Nov 2018 00:05:06 +0100 Subject: [PATCH 08/33] Pio support of esp32 --- platformio.ini | 131 ++++++++++++------ .../dependencies/ws2812fx}/NpbWrapper.h | 0 .../dependencies/ws2812fx}/WS2812FX.cpp | 0 .../dependencies/ws2812fx}/WS2812FX.h | 6 +- .../dependencies/ws2812fx}/palettes.h | 0 wled00/wled00.ino | 2 +- 6 files changed, 89 insertions(+), 50 deletions(-) rename wled00/{ => src/dependencies/ws2812fx}/NpbWrapper.h (100%) rename wled00/{ => src/dependencies/ws2812fx}/WS2812FX.cpp (100%) rename wled00/{ => src/dependencies/ws2812fx}/WS2812FX.h (99%) rename wled00/{ => src/dependencies/ws2812fx}/palettes.h (100%) diff --git a/platformio.ini b/platformio.ini index f62ecf075..2a3653caa 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,23 +1,25 @@ ; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html +; Please visit documentation: https://docs.platformio.org/page/projectconf.html [platformio] -src_dir = wled00 -env_default = esp32dev +src_dir = ./wled00 +data_dir = ./wled00/data +lib_extra_dirs = ./wled00/src +; env_default = nodemcuv2 +env_default = esp01 +; env_default = esp01_1m +; env_default = d1_mini +; env_default = esp32dev -[common_env_data] +[common] build_flags = - -D VERSION=0.8.1 + -D VERSION=0.9.0-dev -D DEBUG=1 framework = arduino -lib_deps_builtin = +monitor_speed = 115200 +board_build.flash_mode = dout +upload_speed = 921600 +upload_resetmethod = nodemcu lib_deps_external = # TODO replace libs in /lib with managed libs in here if possible #Blynk@0.5.4 @@ -30,69 +32,106 @@ lib_deps_external = #Timezone@1.2.1 #WS2812FX@1.1.2 +[common] +build_flags = + -D VERSION=0.9.0-dev + -D DEBUG=1 +framework = arduino +monitor_speed = 115200 +board_build.flash_mode = dout +upload_speed = 921600 +upload_resetmethod = nodemcu +# TODO replace libs in /lib with managed libs in here if possible. +# If they are not changed it's just a metter of setting the correfct version and change the import statement +lib_deps_external = + #Blynk@0.5.4 + #E131@1.0.0 + #webserver + FastLED@3.2.1 + NeoPixelBus@2.3.4 + #PubSubClient@2.7 + #Time@1.5 + #Timezone@1.2.1 + #WS2812FX@1.1.2 + +[common:esp32] +build_flags = + -DARDUINO_ARCH_ESP32 + -DWORKAROUND_ESP32_BITBANG + +[common:512k] +build_flags = + -DWLED_DISABLE_MOBILE_UI + -DWLED_DISABLE_OTA + -DWLED_DISABLE_ALEXA + -DWLED_DISABLE_BLYNK + -DWLED_DISABLE_CRONIXIE + -DWLED_DISABLE_HUESYNC + # see: http://docs.platformio.org/en/latest/platforms/espressif8266.html [env:nodemcuv2] platform = espressif8266 board = nodemcuv2 -monitor_speed = 115200 -framework = ${common_env_data.framework} +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_resetmethod = ${common.upload_resetmethod} +framework = ${common.framework} build_flags = - ${common_env_data.build_flags} + ${common.build_flags} + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH + -Teagle.flash.4m.ld lib_deps = - ${common_env_data.lib_deps_builtin} - ${common_env_data.lib_deps_external} + ${common.lib_deps_external} [env:d1_mini] platform = espressif8266 board = d1_mini -monitor_speed = 115200 -framework = ${common_env_data.framework} +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_resetmethod = ${common.upload_resetmethod} +framework = ${common.framework} build_flags = - ${common_env_data.build_flags} + ${common.build_flags} lib_deps = - ${common_env_data.lib_deps_builtin} - ${common_env_data.lib_deps_external} + ${common.lib_deps_external} [env:esp01_1m] platform = espressif8266 board = esp01_1m -monitor_speed = 115200 -framework = ${common_env_data.framework} +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_resetmethod = ${common.upload_resetmethod} +framework = ${common.framework} build_flags = - ${common_env_data.build_flags} + ${common.build_flags} lib_deps = - ${common_env_data.lib_deps_builtin} - ${common_env_data.lib_deps_external} + ${common.lib_deps_external} [env:esp01] platform = espressif8266 board = esp01 -monitor_speed = 115200 -framework = ${common_env_data.framework} +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_resetmethod = ${common.upload_resetmethod} +framework = ${common.framework} build_flags = - ${common_env_data.build_flags} - -D WLED_DISABLE_MOBILE_UI - -D WLED_DISABLE_OTA - -D WLED_DISABLE_ALEXA - -D WLED_DISABLE_BLYNK - -D WLED_DISABLE_CRONIXIE - -D WLED_DISABLE_HUESYNC + ${common.build_flags} + ${common:512k.build_flags} lib_deps = - ${common_env_data.lib_deps_builtin} - ${common_env_data.lib_deps_external} + ${common.lib_deps_external} # see: http://docs.platformio.org/en/latest/platforms/espressif32.html [env:esp32dev] platform = espressif32 board = esp32dev -monitor_speed = 115200 -framework = ${common_env_data.framework} +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_resetmethod = ${common.upload_resetmethod} +framework = ${common.framework} build_flags = - ${common_env_data.build_flags} - -D ARDUINO_ARCH_ESP32 - -D WORKAROUND_ESP32_BITBANG + ${common.build_flags} + ${common:esp32.build_flags} lib_deps = - ${common_env_data.lib_deps_builtin} - ${common_env_data.lib_deps_external} + ${common.lib_deps_external} \ No newline at end of file diff --git a/wled00/NpbWrapper.h b/wled00/src/dependencies/ws2812fx/NpbWrapper.h similarity index 100% rename from wled00/NpbWrapper.h rename to wled00/src/dependencies/ws2812fx/NpbWrapper.h diff --git a/wled00/WS2812FX.cpp b/wled00/src/dependencies/ws2812fx/WS2812FX.cpp similarity index 100% rename from wled00/WS2812FX.cpp rename to wled00/src/dependencies/ws2812fx/WS2812FX.cpp diff --git a/wled00/WS2812FX.h b/wled00/src/dependencies/ws2812fx/WS2812FX.h similarity index 99% rename from wled00/WS2812FX.h rename to wled00/src/dependencies/ws2812fx/WS2812FX.h index 33e274ebf..4ab1e837a 100644 --- a/wled00/WS2812FX.h +++ b/wled00/src/dependencies/ws2812fx/WS2812FX.h @@ -173,7 +173,7 @@ class WS2812FX { typedef struct Segment { // 21 bytes uint16_t start; uint16_t stop; - uint8_t speed; + uint16_t speed; uint8_t intensity; uint8_t palette; uint8_t mode; @@ -481,8 +481,8 @@ class WS2812FX { uint8_t _segment_index_palette_last = 99; uint8_t _num_segments = 1; segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 20 bytes per element - // start, stop, speed, intensity, mode, options, color[] - { 0, 7, DEFAULT_SPEED, 128, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} + // start, stop, speed, intensity, palette, mode, options, color[] + {0, 7, DEFAULT_SPEED, 128, 0, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} }; segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 17 bytes per element }; diff --git a/wled00/palettes.h b/wled00/src/dependencies/ws2812fx/palettes.h similarity index 100% rename from wled00/palettes.h rename to wled00/src/dependencies/ws2812fx/palettes.h diff --git a/wled00/wled00.ino b/wled00/wled00.ino index a04e0f461..c23ab2d72 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -59,7 +59,7 @@ #include "htmls00.h" #include "htmls01.h" #include "htmls02.h" -#include "WS2812FX.h" +#include "src/dependencies/ws2812fx/WS2812FX.h" //version code in format yymmddb (b = daily build) From 5c794f428a5846f08bc3f8e177c2c6c02a7ebfe3 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Wed, 14 Nov 2018 00:18:08 +0100 Subject: [PATCH 09/33] added verbose flag to travisci.yml for debugging --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5649c37f5..b2fe6c5f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,4 +32,4 @@ install: - pip install -U platformio - platformio update script: - - platformio ci --project-conf=./platformio.ini + - platformio ci --project-conf=./platformio.ini -v From 868cedeed23e2268dfed78e19dbd52f746a5d754 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Wed, 14 Nov 2018 20:21:36 +0100 Subject: [PATCH 10/33] pio support for esp01 512k --- .travis.yml | 2 +- platformio.ini | 78 ++++++++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 48 deletions(-) diff --git a/.travis.yml b/.travis.yml index b2fe6c5f0..c4408c4cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ cache: directories: - "~/.platformio" env: - - PLATFORMIO_CI_SRC=wled00 PLATFORMIO_BUILD_FLAGS="-D DEBUG=0" + - PLATFORMIO_CI_SRC=wled00 install: - pip install -U platformio - platformio update diff --git a/platformio.ini b/platformio.ini index 2a3653caa..4f44fb610 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,36 +11,15 @@ env_default = esp01 ; env_default = d1_mini ; env_default = esp32dev -[common] -build_flags = - -D VERSION=0.9.0-dev - -D DEBUG=1 -framework = arduino -monitor_speed = 115200 -board_build.flash_mode = dout -upload_speed = 921600 -upload_resetmethod = nodemcu -lib_deps_external = - # TODO replace libs in /lib with managed libs in here if possible - #Blynk@0.5.4 - #E131@1.0.0 - #webserver - FastLED@3.2.1 - NeoPixelBus@2.3.4 - #PubSubClient@2.7 - #Time@1.5 - #Timezone@1.2.1 - #WS2812FX@1.1.2 [common] -build_flags = - -D VERSION=0.9.0-dev - -D DEBUG=1 framework = arduino monitor_speed = 115200 board_build.flash_mode = dout upload_speed = 921600 -upload_resetmethod = nodemcu +build_flags = + ; -D VERSION=0.9.0-dev + ; -D DEBUG # TODO replace libs in /lib with managed libs in here if possible. # If they are not changed it's just a metter of setting the correfct version and change the import statement lib_deps_external = @@ -54,80 +33,85 @@ lib_deps_external = #Timezone@1.2.1 #WS2812FX@1.1.2 -[common:esp32] +[common:esp8266] +platform = espressif8266@1.8.0 build_flags = - -DARDUINO_ARCH_ESP32 - -DWORKAROUND_ESP32_BITBANG + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH -[common:512k] +[common:esp8266_512k] +platform = espressif8266@1.7.0 build_flags = - -DWLED_DISABLE_MOBILE_UI - -DWLED_DISABLE_OTA - -DWLED_DISABLE_ALEXA - -DWLED_DISABLE_BLYNK - -DWLED_DISABLE_CRONIXIE - -DWLED_DISABLE_HUESYNC + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH + -D WLED_DISABLE_MOBILE_UI + -D WLED_DISABLE_OTA + -D WLED_DISABLE_ALEXA + ; -D WLED_DISABLE_BLYNK + ; -D WLED_DISABLE_CRONIXIE + ; -D WLED_DISABLE_HUESYNC + +[common:esp32] +platform = espressif32@1.5.0 +build_flags = + -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH + -D ARDUINO_ARCH_ESP32 + -D WORKAROUND_ESP32_BITBANG # see: http://docs.platformio.org/en/latest/platforms/espressif8266.html [env:nodemcuv2] -platform = espressif8266 board = nodemcuv2 +platform = ${common:esp8266.platform} monitor_speed = ${common.monitor_speed} upload_speed = ${common.upload_speed} -upload_resetmethod = ${common.upload_resetmethod} framework = ${common.framework} build_flags = ${common.build_flags} - -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH - -Teagle.flash.4m.ld + ${common:esp8266.build_flags} lib_deps = ${common.lib_deps_external} [env:d1_mini] -platform = espressif8266 board = d1_mini +platform = ${common:esp8266.platform} monitor_speed = ${common.monitor_speed} upload_speed = ${common.upload_speed} -upload_resetmethod = ${common.upload_resetmethod} framework = ${common.framework} build_flags = ${common.build_flags} + ${common:esp8266.build_flags} lib_deps = ${common.lib_deps_external} [env:esp01_1m] -platform = espressif8266 board = esp01_1m +platform = ${common:esp8266.platform} monitor_speed = ${common.monitor_speed} upload_speed = ${common.upload_speed} -upload_resetmethod = ${common.upload_resetmethod} framework = ${common.framework} build_flags = ${common.build_flags} + ${common:esp8266.build_flags} lib_deps = ${common.lib_deps_external} [env:esp01] -platform = espressif8266 board = esp01 +platform = ${common:esp8266_512k.platform} monitor_speed = ${common.monitor_speed} upload_speed = ${common.upload_speed} -upload_resetmethod = ${common.upload_resetmethod} framework = ${common.framework} build_flags = ${common.build_flags} - ${common:512k.build_flags} + ${common:esp8266_512k.build_flags} lib_deps = ${common.lib_deps_external} # see: http://docs.platformio.org/en/latest/platforms/espressif32.html [env:esp32dev] -platform = espressif32 board = esp32dev +platform = ${common:esp32.platform} monitor_speed = ${common.monitor_speed} upload_speed = ${common.upload_speed} -upload_resetmethod = ${common.upload_resetmethod} framework = ${common.framework} build_flags = ${common.build_flags} From 93eb4d21bf5ba6f2297f3e89b5e8207a08016279 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Wed, 14 Nov 2018 21:11:21 +0100 Subject: [PATCH 11/33] Added PIO recommendation when opening in vscode --- .gitignore | 1 + .vscode/extensions.json | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.gitignore b/.gitignore index 04451df40..2edd94122 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .pioenvs .piolibdeps .vscode +!.vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..8281e64cc --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} \ No newline at end of file From 8a2b34adb44cb249adc1771c5cec0c605d3ae7f0 Mon Sep 17 00:00:00 2001 From: Daniel Wiesendorf Date: Fri, 16 Nov 2018 15:02:09 +0100 Subject: [PATCH 12/33] moved ws2812fx sources back --- wled00/{src/dependencies/ws2812fx => }/NpbWrapper.h | 0 wled00/{src/dependencies/ws2812fx => }/WS2812FX.cpp | 0 wled00/{src/dependencies/ws2812fx => }/WS2812FX.h | 0 wled00/{src/dependencies/ws2812fx => }/palettes.h | 0 wled00/wled00.ino | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) rename wled00/{src/dependencies/ws2812fx => }/NpbWrapper.h (100%) rename wled00/{src/dependencies/ws2812fx => }/WS2812FX.cpp (100%) rename wled00/{src/dependencies/ws2812fx => }/WS2812FX.h (100%) rename wled00/{src/dependencies/ws2812fx => }/palettes.h (100%) diff --git a/wled00/src/dependencies/ws2812fx/NpbWrapper.h b/wled00/NpbWrapper.h similarity index 100% rename from wled00/src/dependencies/ws2812fx/NpbWrapper.h rename to wled00/NpbWrapper.h diff --git a/wled00/src/dependencies/ws2812fx/WS2812FX.cpp b/wled00/WS2812FX.cpp similarity index 100% rename from wled00/src/dependencies/ws2812fx/WS2812FX.cpp rename to wled00/WS2812FX.cpp diff --git a/wled00/src/dependencies/ws2812fx/WS2812FX.h b/wled00/WS2812FX.h similarity index 100% rename from wled00/src/dependencies/ws2812fx/WS2812FX.h rename to wled00/WS2812FX.h diff --git a/wled00/src/dependencies/ws2812fx/palettes.h b/wled00/palettes.h similarity index 100% rename from wled00/src/dependencies/ws2812fx/palettes.h rename to wled00/palettes.h diff --git a/wled00/wled00.ino b/wled00/wled00.ino index c23ab2d72..a04e0f461 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -59,7 +59,7 @@ #include "htmls00.h" #include "htmls01.h" #include "htmls02.h" -#include "src/dependencies/ws2812fx/WS2812FX.h" +#include "WS2812FX.h" //version code in format yymmddb (b = daily build) From 071ebe6ef2f417c369f315cb98b1979fb03e7fc3 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Fri, 16 Nov 2018 19:59:00 +0100 Subject: [PATCH 13/33] Gzipped UIs, improving speed and flash usage --- platformio.ini | 6 +- readme.md | 2 +- wled00/WS2812FX.cpp | 2 - wled00/WS2812FX.h | 10 +- wled00/data/index.htm | 29 +- wled00/data/index_mobile.htm | 2 +- wled00/data/settings_sec.htm | Bin 9120 -> 9120 bytes wled00/data/settings_ui.htm | Bin 7836 -> 7832 bytes wled00/html_classic.h | 710 ++++++++++++++ wled00/html_mobile.h | 1284 +++++++++++++++++++++++++ wled00/{htmls02.h => html_other.h} | 0 wled00/{htmls01.h => html_settings.h} | 4 +- wled00/htmls00.h | 157 --- wled00/wled00.ino | 21 +- wled00/wled02_xml.ino | 51 +- wled00/wled03_set.ino | 7 +- wled00/wled05_init.ino | 1 - wled00/wled17_mqtt.ino | 2 +- wled00/wled18_server.ino | 132 ++- 19 files changed, 2146 insertions(+), 274 deletions(-) create mode 100644 wled00/html_classic.h create mode 100644 wled00/html_mobile.h rename wled00/{htmls02.h => html_other.h} (100%) rename wled00/{htmls01.h => html_settings.h} (99%) delete mode 100644 wled00/htmls00.h diff --git a/platformio.ini b/platformio.ini index 4f44fb610..2ecc28ff9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,7 +18,7 @@ monitor_speed = 115200 board_build.flash_mode = dout upload_speed = 921600 build_flags = - ; -D VERSION=0.9.0-dev + ; -D VERSION=0.8.2-dev ; -D DEBUG # TODO replace libs in /lib with managed libs in here if possible. # If they are not changed it's just a metter of setting the correfct version and change the import statement @@ -42,12 +42,12 @@ build_flags = platform = espressif8266@1.7.0 build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH - -D WLED_DISABLE_MOBILE_UI + ; -D WLED_DISABLE_MOBILE_UI -D WLED_DISABLE_OTA -D WLED_DISABLE_ALEXA ; -D WLED_DISABLE_BLYNK ; -D WLED_DISABLE_CRONIXIE - ; -D WLED_DISABLE_HUESYNC + -D WLED_DISABLE_HUESYNC [common:esp32] platform = espressif32@1.5.0 diff --git a/readme.md b/readme.md index 7eaffcdde..cde8801e4 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ ![WLED logo](https://raw.githubusercontent.com/Aircoookie/WLED/development/wled_logo.png) -## Welcome to my project WLED! (v0.8.1) +## Welcome to my project WLED! (v0.8.2-dev) A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B) LEDs! diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index 065079b64..8a2635612 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -2430,8 +2430,6 @@ uint16_t WS2812FX::mode_noise16_2(void) uint16_t shift_y = SEGMENT_RUNTIME.counter_mode_step/42; uint32_t real_x = (i + shift_x) * scale; // calculate the coordinates within the noise field - uint32_t real_y = (i + shift_y) * scale; // based on the precalculated positions - uint32_t real_z = 4223; uint8_t noise = inoise16(real_x, 0, 4223) >> 8; // get the noise data and scale it down diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index 4ab1e837a..fd76fafa4 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -44,9 +44,9 @@ #define FASTLED_INTERNAL //remove annoying pragma messages #include "FastLED.h" -#define DEFAULT_BRIGHTNESS (uint8_t)50 +#define DEFAULT_BRIGHTNESS (uint8_t)127 #define DEFAULT_MODE (uint8_t)0 -#define DEFAULT_SPEED (uint16_t)1000 +#define DEFAULT_SPEED (uint8_t)128 #define DEFAULT_COLOR (uint32_t)0xFF0000 #define min(a,b) ((a)<(b)?(a):(b)) @@ -173,7 +173,7 @@ class WS2812FX { typedef struct Segment { // 21 bytes uint16_t start; uint16_t stop; - uint16_t speed; + uint8_t speed; uint8_t intensity; uint8_t palette; uint8_t mode; @@ -480,9 +480,9 @@ class WS2812FX { uint8_t _segment_index = 0; uint8_t _segment_index_palette_last = 99; uint8_t _num_segments = 1; - segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 20 bytes per element + segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 21 bytes per element // start, stop, speed, intensity, palette, mode, options, color[] - {0, 7, DEFAULT_SPEED, 128, 0, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} + { 0, 7, DEFAULT_SPEED, 128, 0, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} }; segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 17 bytes per element }; diff --git a/wled00/data/index.htm b/wled00/data/index.htm index 954c19018..9f9bff9bb 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -2,7 +2,7 @@ - WLED 0.8.1 + WLED 0.8.2 -)====="; -#else -const char PAGE_indexM[] PROGMEM = R"=====( -Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". -)====="; -#endif - - -/* - * Classic UI Index html - */ -//head0 (js) -const char PAGE_index0[] PROGMEM = R"=====( -WLED 0.8.1 - -)====="; - -//head1 (css) -const char PAGE_index1[] PROGMEM = R"=====( -.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} - - -Loading... -)====="; - -//body0 (svg defs) -const char PAGE_index2[] PROGMEM = R"=====( - - -//Linearicons.com/free - - - - - - - - - - - - - - - -)====="; - -//body1 (html) -const char PAGE_index3[] PROGMEM = R"=====( -
- - - - - - -
-
-
-
-
-
-
-
-
-Effect Panel

- - - -

-

-Set secondary color to - - - - - -or
-
FastLED Palette

-
-
-
-Favorite Presets

- - - - -


-Click checkmark to apply brightness, color and effects.

-Cycle through presets to , keep each for ms:

-
-Timed Light

-

-Gradually dim down
-1st slider sets duration (1-255min), 2nd sets target brightness.
-
-
-
- -)====="; diff --git a/wled00/wled00.ino b/wled00/wled00.ino index a04e0f461..ec6608a2b 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -3,7 +3,7 @@ */ /* * @title WLED project sketch - * @version 0.8.1 + * @version 0.8.2-dev * @author Christian Schwinne */ @@ -11,11 +11,9 @@ //ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.3.0 and the setting 512K(64K SPIFFS). //ESP8266-01 (black) has 1MB flash and can thus fit the whole program. Use 1M(64K SPIFFS). -//If you want the OTA update function though, you need to make sure the sketch is smaller than 479kB. //Uncomment some of the following lines to disable features to compile for ESP8266-01 (max flash size 434kB): -//You are required to disable these two features: -//#define WLED_DISABLE_MOBILE_UI +//You are required to disable over-the-air updates: //#define WLED_DISABLE_OTA //You need to choose 1-2 of these features to disable: @@ -23,6 +21,7 @@ //#define WLED_DISABLE_BLYNK //#define WLED_DISABLE_CRONIXIE //#define WLED_DISABLE_HUESYNC +//#define WLED_DISABLE_MOBILE_UI //to toggle usb serial debug (un)comment following line(s) //#define DEBUG @@ -56,15 +55,16 @@ #endif #include "src/dependencies/e131/E131.h" #include "src/dependencies/pubsubclient/PubSubClient.h" -#include "htmls00.h" -#include "htmls01.h" -#include "htmls02.h" +#include "html_classic.h" +#include "html_mobile.h" +#include "html_settings.h" +#include "html_other.h" #include "WS2812FX.h" //version code in format yymmddb (b = daily build) -#define VERSION 1811091 -char versionString[] = "0.8.1"; +#define VERSION 1811162 +char versionString[] = "0.8.2-dev"; //AP and OTA default passwords (for maximum change them!) @@ -287,7 +287,6 @@ bool udpConnected = false, udpRgbConnected = false; //ui style char cssCol[6][9]={"","","","","",""}; -String cssColorString=""; bool showWelcomePage = false; //hue @@ -376,7 +375,7 @@ unsigned int ntpLocalPort = 2390; #define NTP_PACKET_SIZE 48 //string temp buffer -#define OMAX 1750 +#define OMAX 2000 char obuf[OMAX]; uint16_t olen = 0; diff --git a/wled00/wled02_xml.ino b/wled00/wled02_xml.ino index 8c6307ef5..09694fbc9 100644 --- a/wled00/wled02_xml.ino +++ b/wled00/wled02_xml.ino @@ -3,7 +3,7 @@ */ //build XML response to HTTP /win API request -void XML_response(bool isHTTP) +void XML_response(bool isHTTP, bool includeTheme) { olen = 0; oappend(""); @@ -47,7 +47,28 @@ void XML_response(bool isHTTP) oappendi(useHSB); oappend(""); oappend(serverDescription); - oappend(""); + oappend(""); + if (includeTheme) + { + char cs[6][9]; + getThemeColors(cs); + oappend("#"); + oappend(cs[0]); + oappend("#"); + oappend(cs[1]); + oappend("#"); + oappend(cs[2]); + oappend("#"); + oappend(cs[3]); + oappend("#"); + oappend(cs[4]); + oappend("#"); + oappend(cs[5]); + oappend(""); + oappend(cssFont); + oappend(""); + } + oappend(""); if (isHTTP) server.send(200, "text/xml", obuf); } @@ -320,3 +341,29 @@ void getSettingsJS(byte subPage) } oappend("}"); } + + +//get colors from current theme as c strings +void getThemeColors(char o[][9]) +{ + switch (currentTheme) + { + // accent color (aCol) background (bCol) panel (cCol) controls (dCol) shadows (sCol) text (tCol) + default: strcpy(o[0], "D9B310"); strcpy(o[1], "0B3C5D"); strcpy(o[2], "1D2731"); strcpy(o[3], "328CC1"); strcpy(o[4], "000"); strcpy(o[5], "328CC1"); break; //night + case 1: strcpy(o[0], "eee"); strcpy(o[1], "ddd"); strcpy(o[2], "b9b9b9"); strcpy(o[3], "049"); strcpy(o[4], "777"); strcpy(o[5], "049"); break; //modern + case 2: strcpy(o[0], "abc"); strcpy(o[1], "fff"); strcpy(o[2], "ddd"); strcpy(o[3], "000"); strcpy(o[4], "0004"); strcpy(o[5], "000"); break; //bright + case 3: strcpy(o[0], "c09f80"); strcpy(o[1], "d7cec7"); strcpy(o[2], "76323f"); strcpy(o[3], "888"); strcpy(o[4], "3334"); strcpy(o[5], "888"); break; //wine + case 4: strcpy(o[0], "3cc47c"); strcpy(o[1], "828081"); strcpy(o[2], "d9a803"); strcpy(o[3], "1e392a"); strcpy(o[4], "000a"); strcpy(o[5], "1e392a"); break; //electric + case 5: strcpy(o[0], "57bc90"); strcpy(o[1], "a5a5af"); strcpy(o[2], "015249"); strcpy(o[3], "88c9d4"); strcpy(o[4], "0004"); strcpy(o[5], "88c9d4"); break; //mint + case 6: strcpy(o[0], "f7c331"); strcpy(o[1], "dcc7aa"); strcpy(o[2], "6b7a8f"); strcpy(o[3], "f7882f"); strcpy(o[4], "0007"); strcpy(o[5], "f7882f"); break; //amber + case 7: strcpy(o[0], "fc3"); strcpy(o[1], "124"); strcpy(o[2], "334"); strcpy(o[3], "f1d"); strcpy(o[4], "f00"); strcpy(o[5], "f1d"); break; //club + case 8: strcpy(o[0], "0ac"); strcpy(o[1], "124"); strcpy(o[2], "224"); strcpy(o[3], "003eff"); strcpy(o[4], "003eff"); strcpy(o[5], "003eff"); break; //air + case 9: strcpy(o[0], "f70"); strcpy(o[1], "421"); strcpy(o[2], "221"); strcpy(o[3], "a50"); strcpy(o[4], "f70"); strcpy(o[5], "f70"); break; //nixie + case 10: strcpy(o[0], "2d2"); strcpy(o[1], "010"); strcpy(o[2], "121"); strcpy(o[3], "060"); strcpy(o[4], "040"); strcpy(o[5], "3f3"); break; //terminal + case 11: strcpy(o[0], "867ADE"); strcpy(o[1], "4033A3"); strcpy(o[2], "483AAA"); strcpy(o[3], "483AAA"); strcpy(o[4], ""); strcpy(o[5], "867ADE"); break; //c64 + case 12: strcpy(o[0], "fbe8a6"); strcpy(o[1], "d2fdff"); strcpy(o[2], "b4dfe5"); strcpy(o[3], "f4976c"); strcpy(o[4], ""); strcpy(o[5], "303c6c"); break; //easter + case 13: strcpy(o[0], "d4af37"); strcpy(o[1], "173305"); strcpy(o[2], "308505"); strcpy(o[3], "f21313"); strcpy(o[4], "f002"); strcpy(o[5], "d4af37"); break; //christmas + case 14: strcpy(o[0], "fc7"); strcpy(o[1], "49274a"); strcpy(o[2], "94618e"); strcpy(o[3], "f4decb"); strcpy(o[4], "0008"); strcpy(o[5], "f4decb"); break; //end + case 15: for (int i=0;i<6;i++) strcpy(o[i], cssCol[i]); //custom + } +} diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index 4b52a4c1c..6875942fe 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -138,7 +138,6 @@ void handleSettingsSet(byte subPage) strcpy(cssCol[i],server.arg(k).c_str()); } strcpy(cssFont,server.arg("CF").c_str()); - buildCssColorString(); } //SYNC @@ -280,7 +279,7 @@ void handleSettingsSet(byte subPage) if (server.hasArg("RS")) //complete factory reset { clearEEPROM(); - serveMessage(200, "All Settings erased.", "Connect to WLED-AP to setup again...",255); + serveMessage(200, "All Settings erased.", "Connect to WLED-AP to setup again",255); reset(); } @@ -331,7 +330,7 @@ bool handleSet(String req) } pos = req.indexOf("IN"); - if (pos < 1) XML_response(true); + if (pos < 1) XML_response(true, false); return true; //if you save a macro in one request, other commands in that request are ignored due to unwanted behavior otherwise } @@ -744,7 +743,7 @@ bool handleSet(String req) //internal call, does not send XML response pos = req.indexOf("IN"); - if (pos < 1) XML_response(true); + if (pos < 1) XML_response(true, (req.indexOf("IT") > 0)); //include theme if firstload //do not send UDP notifications this time pos = req.indexOf("NN"); if (pos > 0) diff --git a/wled00/wled05_init.ino b/wled00/wled05_init.ino index 04d4dd211..12c38ce1e 100644 --- a/wled00/wled05_init.ino +++ b/wled00/wled05_init.ino @@ -24,7 +24,6 @@ void wledInit() if (!initLedsLast) initStrip(); DEBUG_PRINT("CSSID: "); DEBUG_PRINT(clientSSID); - buildCssColorString(); userBeginPreConnection(); if (strcmp(clientSSID,"Your_Network") == 0) showWelcomePage = true; diff --git a/wled00/wled17_mqtt.ino b/wled00/wled17_mqtt.ino index 986183e66..c98833f75 100644 --- a/wled00/wled17_mqtt.ino +++ b/wled00/wled17_mqtt.ino @@ -60,7 +60,7 @@ void publishMQTT() //if you want to use this, increase the MQTT buffer in PubSubClient.h to 350+ //it will publish the API response to MQTT - /*XML_response(false); + /*XML_response(false, false); strcpy(subuf, mqttDeviceTopic); strcat(subuf, "/v"); mqtt->publish(subuf, obuf);*/ diff --git a/wled00/wled18_server.ino b/wled00/wled18_server.ino index 23f56a215..387b97f77 100644 --- a/wled00/wled18_server.ino +++ b/wled00/wled18_server.ino @@ -103,7 +103,7 @@ void initServer() server.on("/power", HTTP_GET, [](){ String val = (String)(int)strip.getPowerEstimate(ledCount,strip.getColor(),strip.getBrightness()); val += "mA currently"; - serveMessage(200,val,"This is just an estimate (does not take into account several factors like effects and wire resistance). It is NOT an accurate measurement!",254); + serveMessage(200,val,"This is just an estimate (does not account for factors like effects and wire resistance). It is NOT a measurement!",254); }); server.on("/u", HTTP_GET, [](){ @@ -136,7 +136,7 @@ void initServer() httpUpdater.setup(&server); #else server.on("/update", HTTP_GET, [](){ - serveMessage(500, "Not implemented", "OTA updates are not supported in this build.", 254); + serveMessage(500, "Not implemented", "OTA updates are unsupported in this build.", 254); }); #endif } else @@ -185,43 +185,6 @@ void initServer() #endif } -void buildCssColorString() -{ - String cs[]={"","","","","",""}; - switch (currentTheme) - { - default: cs[0]="D9B310"; cs[1]="0B3C5D"; cs[2]="1D2731"; cs[3]="328CC1"; cs[4]="000"; cs[5]="328CC1"; break; //night - case 1: cs[0]="eee"; cs[1]="ddd"; cs[2]="b9b9b9"; cs[3]="049"; cs[4]="777"; cs[5]="049"; break; //modern - case 2: cs[0]="abc"; cs[1]="fff"; cs[2]="ddd"; cs[3]="000"; cs[4]="0004"; cs[5]="000"; break; //bright - case 3: cs[0]="c09f80"; cs[1]="d7cec7"; cs[2]="76323f"; cs[3]="888"; cs[4]="3334"; cs[5]="888"; break; //wine - case 4: cs[0]="3cc47c"; cs[1]="828081"; cs[2]="d9a803"; cs[3]="1e392a"; cs[4]="000a"; cs[5]="1e392a"; break; //electric - case 5: cs[0]="57bc90"; cs[1]="a5a5af"; cs[2]="015249"; cs[3]="88c9d4"; cs[4]="0004"; cs[5]="88c9d4"; break; //mint - case 6: cs[0]="f7c331"; cs[1]="dcc7aa"; cs[2]="6b7a8f"; cs[3]="f7882f"; cs[4]="0007"; cs[5]="f7882f"; break; //amber - case 7: cs[0]="fc3"; cs[1]="124"; cs[2]="334"; cs[3]="f1d"; cs[4]="f00"; cs[5]="f1d"; break;//club - case 8: cs[0]="0ac"; cs[1]="124"; cs[2]="224"; cs[3]="003eff"; cs[4]="003eff"; cs[5]="003eff"; break;//air - case 9: cs[0]="f70"; cs[1]="421"; cs[2]="221"; cs[3]="a50"; cs[4]="f70"; cs[5]="f70"; break;//nixie - case 10: cs[0]="2d2"; cs[1]="010"; cs[2]="121"; cs[3]="060"; cs[4]="040"; cs[5]="3f3"; break; //terminal - case 11: cs[0]="867ADE"; cs[1]="4033A3"; cs[2]="483AAA"; cs[3]="483AAA"; cs[4]=""; cs[5]="867ADE"; break; //c64 - case 12: cs[0]="fbe8a6"; cs[1]="d2fdff"; cs[2]="b4dfe5"; cs[3]="f4976c"; cs[4]=""; cs[5]="303c6c"; break; //c64 - case 14: cs[0]="fc7"; cs[1]="49274a"; cs[2]="94618e"; cs[3]="f4decb"; cs[4]="0008"; cs[5]="f4decb"; break; //end - case 15: for (int i=0;i<6;i++)cs[i]=cssCol[i];//custom - } - cssColorString="
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
-)====="; -#else -const char PAGE_indexM[] PROGMEM = R"=====( -Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". -)====="; -#endif - - -/* - * Classic UI Index html - */ -//head0 (js) -const char PAGE_index0[] PROGMEM = R"=====( -WLED 0.8.1 - -)====="; - -//head1 (css) -const char PAGE_index1[] PROGMEM = R"=====( -.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} - - -Loading... -)====="; - -//body0 (svg defs) -const char PAGE_index2[] PROGMEM = R"=====( - - -//Linearicons.com/free - - - - - - - - - - - - - - - -)====="; - -//body1 (html) -const char PAGE_index3[] PROGMEM = R"=====( -
- - - - - - -
-
-
-
-
-
-
-
-
-Effect Panel

- - - -

-

-Set secondary color to - - - - - -or
-
FastLED Palette

-
-
-
-Favorite Presets

- - - - -


-Click checkmark to apply brightness, color and effects.

-Cycle through presets to , keep each for ms:

-
-Timed Light

-

-Gradually dim down
-1st slider sets duration (1-255min), 2nd sets target brightness.
-
-
-
- -)====="; +/* + * Mobile UI by StormPie html +*/ +#ifndef WLED_DISABLE_MOBILE_UI +const char PAGE_indexM[] PROGMEM = R"=====( +WLED 0.8.1
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  • Meteor
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
+)====="; +#else +const char PAGE_indexM[] PROGMEM = R"=====( +Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". +)====="; +#endif + + +/* + * Classic UI Index html + */ +//head0 (js) +const char PAGE_index0[] PROGMEM = R"=====( +WLED 0.8.1 + +)====="; + +//head1 (css) +const char PAGE_index1[] PROGMEM = R"=====( +.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} + + +Loading... +)====="; + +//body0 (svg defs) +const char PAGE_index2[] PROGMEM = R"=====( + + +//Linearicons.com/free + + + + + + + + + + + + + + + +)====="; + +//body1 (html) +const char PAGE_index3[] PROGMEM = R"=====( +
+ + + + + + +
+
+
+
+
+
+
+
+
+Effect Panel

+ + + +

+

+Set secondary color to + + + + + +or
+
FastLED Palette

+
+
+
+Favorite Presets

+ + + + +


+Click checkmark to apply brightness, color and effects.

+Cycle through presets to , keep each for ms:

+
+Timed Light

+

+Gradually dim down
+1st slider sets duration (1-255min), 2nd sets target brightness.
+
+
+
+ +)====="; From 296065a976d6d603d38c104bdf16a695dcb1c9f4 Mon Sep 17 00:00:00 2001 From: viknet365 Date: Tue, 20 Nov 2018 20:59:13 +0100 Subject: [PATCH 18/33] Revert "add meteor effect" This reverts commit 0b0f600f97e00cd4d0f8549975b6461e0bfad20a. --- wled00/htmls00.h | 314 +++++++++++++++++++++++------------------------ 1 file changed, 157 insertions(+), 157 deletions(-) diff --git a/wled00/htmls00.h b/wled00/htmls00.h index 5a27609dc..80ca6bb46 100644 --- a/wled00/htmls00.h +++ b/wled00/htmls00.h @@ -1,157 +1,157 @@ -/* - * Mobile UI by StormPie html -*/ -#ifndef WLED_DISABLE_MOBILE_UI -const char PAGE_indexM[] PROGMEM = R"=====( -WLED 0.8.1
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  • Meteor
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
-)====="; -#else -const char PAGE_indexM[] PROGMEM = R"=====( -Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". -)====="; -#endif - - -/* - * Classic UI Index html - */ -//head0 (js) -const char PAGE_index0[] PROGMEM = R"=====( -WLED 0.8.1 - -)====="; - -//head1 (css) -const char PAGE_index1[] PROGMEM = R"=====( -.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} - - -Loading... -)====="; - -//body0 (svg defs) -const char PAGE_index2[] PROGMEM = R"=====( - - -//Linearicons.com/free - - - - - - - - - - - - - - - -)====="; - -//body1 (html) -const char PAGE_index3[] PROGMEM = R"=====( -
- - - - - - -
-
-
-
-
-
-
-
-
-Effect Panel

- - - -

-

-Set secondary color to - - - - - -or
-
FastLED Palette

-
-
-
-Favorite Presets

- - - - -


-Click checkmark to apply brightness, color and effects.

-Cycle through presets to , keep each for ms:

-
-Timed Light

-

-Gradually dim down
-1st slider sets duration (1-255min), 2nd sets target brightness.
-
-
-
- -)====="; +/* + * Mobile UI by StormPie html +*/ +#ifndef WLED_DISABLE_MOBILE_UI +const char PAGE_indexM[] PROGMEM = R"=====( +WLED 0.8.1
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
+)====="; +#else +const char PAGE_indexM[] PROGMEM = R"=====( +Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". +)====="; +#endif + + +/* + * Classic UI Index html + */ +//head0 (js) +const char PAGE_index0[] PROGMEM = R"=====( +WLED 0.8.1 + +)====="; + +//head1 (css) +const char PAGE_index1[] PROGMEM = R"=====( +.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} + + +Loading... +)====="; + +//body0 (svg defs) +const char PAGE_index2[] PROGMEM = R"=====( + + +//Linearicons.com/free + + + + + + + + + + + + + + + +)====="; + +//body1 (html) +const char PAGE_index3[] PROGMEM = R"=====( +
+ + + + + + +
+
+
+
+
+
+
+
+
+Effect Panel

+ + + +

+

+Set secondary color to + + + + + +or
+
FastLED Palette

+
+
+
+Favorite Presets

+ + + + +


+Click checkmark to apply brightness, color and effects.

+Cycle through presets to , keep each for ms:

+
+Timed Light

+

+Gradually dim down
+1st slider sets duration (1-255min), 2nd sets target brightness.
+
+
+
+ +)====="; From 17ce6b9507275337379634227ec3b218782524ba Mon Sep 17 00:00:00 2001 From: viknet365 Date: Tue, 20 Nov 2018 21:09:06 +0100 Subject: [PATCH 19/33] Revert "Add files via upload" This reverts commit f1371d67373532d3d59b2236ba470c1f3845c810. --- wled00/WS2812FX.h | 983 +++++++++++++++++++++++----------------------- 1 file changed, 490 insertions(+), 493 deletions(-) diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index f8b03e631..33e274ebf 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -1,493 +1,490 @@ -//pixelmethod now in NpbWrapper.h - -/* - WS2812FX.h - Library for WS2812 LED effects. - Harm Aldick - 2016 - www.aldick.org - FEATURES - * A lot of blinken modes and counting - * WS2812FX can be used as drop-in replacement for Adafruit NeoPixel Library - NOTES - * Uses the Adafruit NeoPixel library. Get it here: - https://github.com/adafruit/Adafruit_NeoPixel - LICENSE - The MIT License (MIT) - Copyright (c) 2016 Harm Aldick - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - CHANGELOG - 2016-05-28 Initial beta release - 2016-06-03 Code cleanup, minor improvements, new modes - 2016-06-04 2 new fx, fixed setColor (now also resets _mode_color) - 2017-02-02 added external trigger functionality (e.g. for sound-to-light) - Modified for WLED -*/ - -#ifndef WS2812FX_h -#define WS2812FX_h - -#include "NpbWrapper.h" -#include "FastLED.h" - -#define DEFAULT_BRIGHTNESS (uint8_t)50 -#define DEFAULT_MODE (uint8_t)0 -#define DEFAULT_SPEED (uint16_t)1000 -#define DEFAULT_COLOR (uint32_t)0xFF0000 - -#define min(a,b) ((a)<(b)?(a):(b)) -#define max(a,b) ((a)>(b)?(a):(b)) - -/* each segment uses 38 bytes of SRAM memory, so if you're application fails because of - insufficient memory, decreasing MAX_NUM_SEGMENTS may help */ -#define MAX_NUM_SEGMENTS 10 -#define NUM_COLORS 3 /* number of colors per segment */ -#define SEGMENT _segments[_segment_index] -#define SEGMENT_RUNTIME _segment_runtimes[_segment_index] -#define SEGMENT_LENGTH (SEGMENT.stop - SEGMENT.start + 1) -#define SPEED_FORMULA_L 5 + (50*(255 - SEGMENT.speed))/SEGMENT_LENGTH -#define RESET_RUNTIME memset(_segment_runtimes, 0, sizeof(_segment_runtimes)) - -// some common colors -#define RED (uint32_t)0xFF0000 -#define GREEN (uint32_t)0x00FF00 -#define BLUE (uint32_t)0x0000FF -#define WHITE (uint32_t)0xFFFFFF -#define BLACK (uint32_t)0x000000 -#define YELLOW (uint32_t)0xFFFF00 -#define CYAN (uint32_t)0x00FFFF -#define MAGENTA (uint32_t)0xFF00FF -#define PURPLE (uint32_t)0x400080 -#define ORANGE (uint32_t)0xFF3000 -#define PINK (uint32_t)0xFF1493 -#define ULTRAWHITE (uint32_t)0xFFFFFFFF - -// options -// bit 8: reverse animation -// bits 5-7: fade rate (0-7) -// bit 4: gamma correction -// bits 1-3: TBD -#define NO_OPTIONS (uint8_t)0x00 -#define REVERSE (uint8_t)0x80 -#define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE) - -#define MODE_COUNT 77 - -#define FX_MODE_STATIC 0 -#define FX_MODE_BLINK 1 -#define FX_MODE_BREATH 2 -#define FX_MODE_COLOR_WIPE 3 -#define FX_MODE_COLOR_WIPE_RANDOM 4 -#define FX_MODE_RANDOM_COLOR 5 -#define FX_MODE_COLOR_SWEEP 6 -#define FX_MODE_DYNAMIC 7 -#define FX_MODE_RAINBOW 8 -#define FX_MODE_RAINBOW_CYCLE 9 -#define FX_MODE_SCAN 10 -#define FX_MODE_DUAL_SCAN 11 -#define FX_MODE_FADE 12 -#define FX_MODE_THEATER_CHASE 13 -#define FX_MODE_THEATER_CHASE_RAINBOW 14 -#define FX_MODE_RUNNING_LIGHTS 15 -#define FX_MODE_TWINKLE 16 -#define FX_MODE_TWINKLE_RANDOM 17 -#define FX_MODE_TWINKLE_FADE 18 -#define FX_MODE_TWINKLE_FADE_RANDOM 19 -#define FX_MODE_SPARKLE 20 -#define FX_MODE_FLASH_SPARKLE 21 -#define FX_MODE_HYPER_SPARKLE 22 -#define FX_MODE_STROBE 23 -#define FX_MODE_STROBE_RAINBOW 24 -#define FX_MODE_MULTI_STROBE 25 -#define FX_MODE_BLINK_RAINBOW 26 -#define FX_MODE_ANDROID 27 -#define FX_MODE_CHASE_COLOR 28 -#define FX_MODE_CHASE_RANDOM 29 -#define FX_MODE_CHASE_RAINBOW 30 -#define FX_MODE_CHASE_FLASH 31 -#define FX_MODE_CHASE_FLASH_RANDOM 32 -#define FX_MODE_CHASE_RAINBOW_WHITE 33 -#define FX_MODE_COLORFUL 34 -#define FX_MODE_TRAFFIC_LIGHT 35 -#define FX_MODE_COLOR_SWEEP_RANDOM 36 -#define FX_MODE_RUNNING_COLOR 37 -#define FX_MODE_RUNNING_RED_BLUE 38 -#define FX_MODE_RUNNING_RANDOM 39 -#define FX_MODE_LARSON_SCANNER 40 -#define FX_MODE_COMET 41 -#define FX_MODE_FIREWORKS 42 -#define FX_MODE_FIREWORKS_RANDOM 43 -#define FX_MODE_MERRY_CHRISTMAS 44 -#define FX_MODE_FIRE_FLICKER 45 -#define FX_MODE_GRADIENT 46 -#define FX_MODE_LOADING 47 -#define FX_MODE_DUAL_COLOR_WIPE_IN_OUT 48 -#define FX_MODE_DUAL_COLOR_WIPE_IN_IN 49 -#define FX_MODE_DUAL_COLOR_WIPE_OUT_OUT 50 -#define FX_MODE_DUAL_COLOR_WIPE_OUT_IN 51 -#define FX_MODE_CIRCUS_COMBUSTUS 52 -#define FX_MODE_HALLOWEEN 53 -#define FX_MODE_TRICOLOR_CHASE 54 -#define FX_MODE_TRICOLOR_WIPE 55 -#define FX_MODE_TRICOLOR_FADE 56 -#define FX_MODE_LIGHTNING 57 -#define FX_MODE_ICU 58 -#define FX_MODE_MULTI_COMET 59 -#define FX_MODE_DUAL_LARSON_SCANNER 60 -#define FX_MODE_RANDOM_CHASE 61 -#define FX_MODE_OSCILLATE 62 -//Modes that use FastLED --> -#define FX_MODE_PRIDE_2015 63 -#define FX_MODE_JUGGLE 64 -#define FX_MODE_PALETTE 65 -#define FX_MODE_FIRE_2012 66 -#define FX_MODE_COLORWAVES 67 -#define FX_MODE_BPM 68 -#define FX_MODE_FILLNOISE8 69 -#define FX_MODE_NOISE16_1 70 -#define FX_MODE_NOISE16_2 71 -#define FX_MODE_NOISE16_3 72 -#define FX_MODE_NOISE16_4 73 -#define FX_MODE_COLORTWINKLE 74 -#define FX_MODE_LAKE 75 -#define FX_MODE_METEOR 76 - - -class WS2812FX { - typedef uint16_t (WS2812FX::*mode_ptr)(void); - - // segment parameters - public: - typedef struct Segment { // 21 bytes - uint16_t start; - uint16_t stop; - uint8_t speed; - uint8_t intensity; - uint8_t palette; - uint8_t mode; - uint8_t options; - uint32_t colors[NUM_COLORS]; - } segment; - - // segment runtime parameters - typedef struct Segment_runtime { // 17 bytes - unsigned long next_time; - uint32_t counter_mode_step; - uint32_t counter_mode_call; - uint16_t aux_param; - uint16_t aux_param2; - uint8_t trans_act; - } segment_runtime; - - WS2812FX() { - _mode[FX_MODE_STATIC] = &WS2812FX::mode_static; - _mode[FX_MODE_BLINK] = &WS2812FX::mode_blink; - _mode[FX_MODE_COLOR_WIPE] = &WS2812FX::mode_color_wipe; - _mode[FX_MODE_COLOR_WIPE_RANDOM] = &WS2812FX::mode_color_wipe_random; - _mode[FX_MODE_RANDOM_COLOR] = &WS2812FX::mode_random_color; - _mode[FX_MODE_COLOR_SWEEP] = &WS2812FX::mode_color_sweep; - _mode[FX_MODE_DYNAMIC] = &WS2812FX::mode_dynamic; - _mode[FX_MODE_RAINBOW] = &WS2812FX::mode_rainbow; - _mode[FX_MODE_RAINBOW_CYCLE] = &WS2812FX::mode_rainbow_cycle; - _mode[FX_MODE_SCAN] = &WS2812FX::mode_scan; - _mode[FX_MODE_DUAL_SCAN] = &WS2812FX::mode_dual_scan; - _mode[FX_MODE_FADE] = &WS2812FX::mode_fade; - _mode[FX_MODE_THEATER_CHASE] = &WS2812FX::mode_theater_chase; - _mode[FX_MODE_THEATER_CHASE_RAINBOW] = &WS2812FX::mode_theater_chase_rainbow; - _mode[FX_MODE_TWINKLE] = &WS2812FX::mode_twinkle; - _mode[FX_MODE_TWINKLE_RANDOM] = &WS2812FX::mode_twinkle_random; - _mode[FX_MODE_TWINKLE_FADE] = &WS2812FX::mode_twinkle_fade; - _mode[FX_MODE_TWINKLE_FADE_RANDOM] = &WS2812FX::mode_twinkle_fade_random; - _mode[FX_MODE_SPARKLE] = &WS2812FX::mode_sparkle; - _mode[FX_MODE_FLASH_SPARKLE] = &WS2812FX::mode_flash_sparkle; - _mode[FX_MODE_HYPER_SPARKLE] = &WS2812FX::mode_hyper_sparkle; - _mode[FX_MODE_STROBE] = &WS2812FX::mode_strobe; - _mode[FX_MODE_STROBE_RAINBOW] = &WS2812FX::mode_strobe_rainbow; - _mode[FX_MODE_MULTI_STROBE] = &WS2812FX::mode_multi_strobe; - _mode[FX_MODE_BLINK_RAINBOW] = &WS2812FX::mode_blink_rainbow; - _mode[FX_MODE_ANDROID] = &WS2812FX::mode_android; - _mode[FX_MODE_CHASE_COLOR] = &WS2812FX::mode_chase_color; - _mode[FX_MODE_CHASE_RANDOM] = &WS2812FX::mode_chase_random; - _mode[FX_MODE_CHASE_RAINBOW] = &WS2812FX::mode_chase_rainbow; - _mode[FX_MODE_CHASE_FLASH] = &WS2812FX::mode_chase_flash; - _mode[FX_MODE_CHASE_FLASH_RANDOM] = &WS2812FX::mode_chase_flash_random; - _mode[FX_MODE_CHASE_RAINBOW_WHITE] = &WS2812FX::mode_chase_rainbow_white; - _mode[FX_MODE_COLORFUL] = &WS2812FX::mode_colorful; - _mode[FX_MODE_TRAFFIC_LIGHT] = &WS2812FX::mode_traffic_light; - _mode[FX_MODE_COLOR_SWEEP_RANDOM] = &WS2812FX::mode_color_sweep_random; - _mode[FX_MODE_RUNNING_COLOR] = &WS2812FX::mode_running_color; - _mode[FX_MODE_RUNNING_RED_BLUE] = &WS2812FX::mode_running_red_blue; - _mode[FX_MODE_RUNNING_RANDOM] = &WS2812FX::mode_running_random; - _mode[FX_MODE_LARSON_SCANNER] = &WS2812FX::mode_larson_scanner; - _mode[FX_MODE_COMET] = &WS2812FX::mode_comet; - _mode[FX_MODE_FIREWORKS] = &WS2812FX::mode_fireworks; - _mode[FX_MODE_FIREWORKS_RANDOM] = &WS2812FX::mode_fireworks_random; - _mode[FX_MODE_MERRY_CHRISTMAS] = &WS2812FX::mode_merry_christmas; - _mode[FX_MODE_FIRE_FLICKER] = &WS2812FX::mode_fire_flicker; - _mode[FX_MODE_GRADIENT] = &WS2812FX::mode_gradient; - _mode[FX_MODE_LOADING] = &WS2812FX::mode_loading; - _mode[FX_MODE_DUAL_COLOR_WIPE_IN_OUT] = &WS2812FX::mode_dual_color_wipe_in_out; - _mode[FX_MODE_DUAL_COLOR_WIPE_IN_IN] = &WS2812FX::mode_dual_color_wipe_in_in; - _mode[FX_MODE_DUAL_COLOR_WIPE_OUT_OUT] = &WS2812FX::mode_dual_color_wipe_out_out; - _mode[FX_MODE_DUAL_COLOR_WIPE_OUT_IN] = &WS2812FX::mode_dual_color_wipe_out_in; - _mode[FX_MODE_CIRCUS_COMBUSTUS] = &WS2812FX::mode_circus_combustus; - _mode[FX_MODE_HALLOWEEN] = &WS2812FX::mode_halloween; - _mode[FX_MODE_TRICOLOR_CHASE] = &WS2812FX::mode_tricolor_chase; - _mode[FX_MODE_TRICOLOR_WIPE] = &WS2812FX::mode_tricolor_wipe; - _mode[FX_MODE_TRICOLOR_FADE] = &WS2812FX::mode_tricolor_fade; - _mode[FX_MODE_BREATH] = &WS2812FX::mode_breath; - _mode[FX_MODE_RUNNING_LIGHTS] = &WS2812FX::mode_running_lights; - _mode[FX_MODE_LIGHTNING] = &WS2812FX::mode_lightning; - _mode[FX_MODE_ICU] = &WS2812FX::mode_icu; - _mode[FX_MODE_MULTI_COMET] = &WS2812FX::mode_multi_comet; - _mode[FX_MODE_DUAL_LARSON_SCANNER] = &WS2812FX::mode_dual_larson_scanner; - _mode[FX_MODE_RANDOM_CHASE] = &WS2812FX::mode_random_chase; - _mode[FX_MODE_OSCILLATE] = &WS2812FX::mode_oscillate; - _mode[FX_MODE_FIRE_2012] = &WS2812FX::mode_fire_2012; - _mode[FX_MODE_PRIDE_2015] = &WS2812FX::mode_pride_2015; - _mode[FX_MODE_BPM] = &WS2812FX::mode_bpm; - _mode[FX_MODE_JUGGLE] = &WS2812FX::mode_juggle; - _mode[FX_MODE_PALETTE] = &WS2812FX::mode_palette; - _mode[FX_MODE_COLORWAVES] = &WS2812FX::mode_colorwaves; - _mode[FX_MODE_FILLNOISE8] = &WS2812FX::mode_fillnoise8; - _mode[FX_MODE_NOISE16_1] = &WS2812FX::mode_noise16_1; - _mode[FX_MODE_NOISE16_2] = &WS2812FX::mode_noise16_2; - _mode[FX_MODE_NOISE16_3] = &WS2812FX::mode_noise16_3; - _mode[FX_MODE_NOISE16_4] = &WS2812FX::mode_noise16_4; - _mode[FX_MODE_COLORTWINKLE] = &WS2812FX::mode_colortwinkle; - _mode[FX_MODE_LAKE] = &WS2812FX::mode_lake; - _mode[FX_MODE_METEOR] = &WS2812FX::mode_meteor; - - - _brightness = DEFAULT_BRIGHTNESS; - _running = false; - _num_segments = 1; - _segments[0].mode = DEFAULT_MODE; - _segments[0].colors[0] = DEFAULT_COLOR; - _segments[0].start = 0; - _segments[0].speed = DEFAULT_SPEED; - _reverseMode = false; - _skipFirstMode = false; - paletteFade = 0; - paletteBlend = 0; - _locked = NULL; - _cronixieDigits = new byte[6]; - bus = new NeoPixelWrapper(); - RESET_RUNTIME; - } - - void - init(bool supportWhite, uint16_t countPixels, bool skipFirst), - service(void), - clear(void), - strip_off(void), - fade_out(uint8_t r), - setMode(uint8_t m), - setSpeed(uint8_t s), - setIntensity(uint8_t i), - setPalette(uint8_t p), - setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), - setSecondaryColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), - setColor(uint32_t c), - setSecondaryColor(uint32_t c), - setBrightness(uint8_t b), - setReverseMode(bool b), - driverModeCronixie(bool b), - setCronixieDigits(byte* d), - setCronixieBacklight(bool b), - setIndividual(uint16_t i, uint32_t col), - setRange(uint16_t i, uint16_t i2, uint32_t col), - lock(uint16_t i), - lockRange(uint16_t i, uint16_t i2), - unlock(uint16_t i), - unlockRange(uint16_t i, uint16_t i2), - unlockAll(void), - setTransitionMode(bool t), - trigger(void), - setNumSegments(uint8_t n), - setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint8_t speed, uint8_t intensity, bool reverse), - setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint8_t speed, uint8_t intensity, bool reverse), - setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint8_t speed, uint8_t intensity, uint8_t options), - resetSegments(), - setPixelColor(uint16_t n, uint32_t c), - setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), - show(void); - - uint8_t - paletteFade, - paletteBlend, - getBrightness(void), - getMode(void), - getSpeed(void), - getNumSegments(void), - get_random_wheel_index(uint8_t); - - uint32_t - color_wheel(uint8_t), - color_from_palette(uint16_t, bool, bool, uint8_t, uint8_t pbri = 255), - color_blend(uint32_t,uint32_t,uint8_t), - getPixelColor(uint16_t), - getColor(void); - - double - getPowerEstimate(uint16_t leds, uint32_t c, byte b), - getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b); - - WS2812FX::Segment - getSegment(void); - - WS2812FX::Segment_runtime - getSegmentRuntime(void); - - WS2812FX::Segment* - getSegments(void); - - // mode helper functions - uint16_t - blink(uint32_t, uint32_t, bool strobe, bool), - color_wipe(uint32_t, uint32_t, bool , bool), - scan(bool), - theater_chase(uint32_t, uint32_t, bool), - twinkle(uint32_t), - twinkle_fade(uint32_t), - chase(uint32_t, uint32_t, uint32_t, uint8_t), - running(uint32_t, uint32_t), - fireworks(uint32_t), - tricolor_chase(uint32_t, uint32_t, uint32_t); - - // builtin modes - uint16_t - mode_static(void), - mode_blink(void), - mode_blink_rainbow(void), - mode_strobe(void), - mode_strobe_rainbow(void), - mode_color_wipe(void), - mode_color_sweep(void), - mode_color_wipe_random(void), - mode_color_sweep_random(void), - mode_random_color(void), - mode_dynamic(void), - mode_breath(void), - mode_fade(void), - mode_scan(void), - mode_dual_scan(void), - mode_theater_chase(void), - mode_theater_chase_rainbow(void), - mode_rainbow(void), - mode_rainbow_cycle(void), - mode_running_lights(void), - mode_twinkle(void), - mode_twinkle_random(void), - mode_twinkle_fade(void), - mode_twinkle_fade_random(void), - mode_sparkle(void), - mode_flash_sparkle(void), - mode_hyper_sparkle(void), - mode_multi_strobe(void), - mode_android(void), - mode_chase_color(void), - mode_chase_random(void), - mode_chase_rainbow(void), - mode_chase_flash(void), - mode_chase_flash_random(void), - mode_chase_rainbow_white(void), - mode_colorful(void), - mode_traffic_light(void), - mode_running_color(void), - mode_running_red_blue(void), - mode_running_random(void), - mode_larson_scanner(void), - mode_comet(void), - mode_fireworks(void), - mode_fireworks_random(void), - mode_merry_christmas(void), - mode_halloween(void), - mode_fire_flicker(void), - mode_gradient(void), - mode_loading(void), - mode_dual_color_wipe_in_out(void), - mode_dual_color_wipe_in_in(void), - mode_dual_color_wipe_out_out(void), - mode_dual_color_wipe_out_in(void), - mode_circus_combustus(void), - mode_bicolor_chase(void), - mode_tricolor_chase(void), - mode_tricolor_wipe(void), - mode_tricolor_fade(void), - mode_icu(void), - mode_multi_comet(void), - mode_dual_larson_scanner(void), - mode_random_chase(void), - mode_oscillate(void), - mode_fire_2012(void), - mode_pride_2015(void), - mode_bpm(void), - mode_juggle(void), - mode_palette(void), - mode_colorwaves(void), - mode_fillnoise8(void), - mode_noise16_1(void), - mode_noise16_2(void), - mode_noise16_3(void), - mode_noise16_4(void), - mode_colortwinkle(void), - mode_lake(void), - mode_meteor(void), - mode_lightning(void); - - private: - NeoPixelWrapper *bus; - - CRGB fastled_from_col(uint32_t); - - uint16_t _length; - uint16_t _rand16seed; - uint8_t _brightness; - - void handle_palette(void); - bool modeUsesLock(uint8_t); - - double - _cronixieSecMultiplier; - - boolean - _running, - _rgbwMode, - _reverseMode, - _cronixieMode, - _cronixieBacklightEnabled, - _skipFirstMode, - _triggered; - - byte* _locked; - byte* _cronixieDigits; - - mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element - - - uint32_t _lastPaletteChange = 0; - - uint8_t _segment_index = 0; - uint8_t _segment_index_palette_last = 99; - uint8_t _num_segments = 1; - segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 20 bytes per element - // start, stop, speed, intensity, mode, options, color[] - { 0, 7, DEFAULT_SPEED, 128, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} - }; - segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 17 bytes per element -}; - -#endif +//pixelmethod now in NpbWrapper.h + +/* + WS2812FX.h - Library for WS2812 LED effects. + Harm Aldick - 2016 + www.aldick.org + FEATURES + * A lot of blinken modes and counting + * WS2812FX can be used as drop-in replacement for Adafruit NeoPixel Library + NOTES + * Uses the Adafruit NeoPixel library. Get it here: + https://github.com/adafruit/Adafruit_NeoPixel + LICENSE + The MIT License (MIT) + Copyright (c) 2016 Harm Aldick + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + CHANGELOG + 2016-05-28 Initial beta release + 2016-06-03 Code cleanup, minor improvements, new modes + 2016-06-04 2 new fx, fixed setColor (now also resets _mode_color) + 2017-02-02 added external trigger functionality (e.g. for sound-to-light) + Modified for WLED +*/ + +#ifndef WS2812FX_h +#define WS2812FX_h + +#include "NpbWrapper.h" + +#define FASTLED_INTERNAL //remove annoying pragma messages +#include "FastLED.h" + +#define DEFAULT_BRIGHTNESS (uint8_t)50 +#define DEFAULT_MODE (uint8_t)0 +#define DEFAULT_SPEED (uint16_t)1000 +#define DEFAULT_COLOR (uint32_t)0xFF0000 + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) + +/* each segment uses 38 bytes of SRAM memory, so if you're application fails because of + insufficient memory, decreasing MAX_NUM_SEGMENTS may help */ +#define MAX_NUM_SEGMENTS 10 +#define NUM_COLORS 3 /* number of colors per segment */ +#define SEGMENT _segments[_segment_index] +#define SEGMENT_RUNTIME _segment_runtimes[_segment_index] +#define SEGMENT_LENGTH (SEGMENT.stop - SEGMENT.start + 1) +#define SPEED_FORMULA_L 5 + (50*(255 - SEGMENT.speed))/SEGMENT_LENGTH +#define RESET_RUNTIME memset(_segment_runtimes, 0, sizeof(_segment_runtimes)) + +// some common colors +#define RED (uint32_t)0xFF0000 +#define GREEN (uint32_t)0x00FF00 +#define BLUE (uint32_t)0x0000FF +#define WHITE (uint32_t)0xFFFFFF +#define BLACK (uint32_t)0x000000 +#define YELLOW (uint32_t)0xFFFF00 +#define CYAN (uint32_t)0x00FFFF +#define MAGENTA (uint32_t)0xFF00FF +#define PURPLE (uint32_t)0x400080 +#define ORANGE (uint32_t)0xFF3000 +#define PINK (uint32_t)0xFF1493 +#define ULTRAWHITE (uint32_t)0xFFFFFFFF + +// options +// bit 8: reverse animation +// bits 5-7: fade rate (0-7) +// bit 4: gamma correction +// bits 1-3: TBD +#define NO_OPTIONS (uint8_t)0x00 +#define REVERSE (uint8_t)0x80 +#define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE) + +#define MODE_COUNT 76 + +#define FX_MODE_STATIC 0 +#define FX_MODE_BLINK 1 +#define FX_MODE_BREATH 2 +#define FX_MODE_COLOR_WIPE 3 +#define FX_MODE_COLOR_WIPE_RANDOM 4 +#define FX_MODE_RANDOM_COLOR 5 +#define FX_MODE_COLOR_SWEEP 6 +#define FX_MODE_DYNAMIC 7 +#define FX_MODE_RAINBOW 8 +#define FX_MODE_RAINBOW_CYCLE 9 +#define FX_MODE_SCAN 10 +#define FX_MODE_DUAL_SCAN 11 +#define FX_MODE_FADE 12 +#define FX_MODE_THEATER_CHASE 13 +#define FX_MODE_THEATER_CHASE_RAINBOW 14 +#define FX_MODE_RUNNING_LIGHTS 15 +#define FX_MODE_TWINKLE 16 +#define FX_MODE_TWINKLE_RANDOM 17 +#define FX_MODE_TWINKLE_FADE 18 +#define FX_MODE_TWINKLE_FADE_RANDOM 19 +#define FX_MODE_SPARKLE 20 +#define FX_MODE_FLASH_SPARKLE 21 +#define FX_MODE_HYPER_SPARKLE 22 +#define FX_MODE_STROBE 23 +#define FX_MODE_STROBE_RAINBOW 24 +#define FX_MODE_MULTI_STROBE 25 +#define FX_MODE_BLINK_RAINBOW 26 +#define FX_MODE_ANDROID 27 +#define FX_MODE_CHASE_COLOR 28 +#define FX_MODE_CHASE_RANDOM 29 +#define FX_MODE_CHASE_RAINBOW 30 +#define FX_MODE_CHASE_FLASH 31 +#define FX_MODE_CHASE_FLASH_RANDOM 32 +#define FX_MODE_CHASE_RAINBOW_WHITE 33 +#define FX_MODE_COLORFUL 34 +#define FX_MODE_TRAFFIC_LIGHT 35 +#define FX_MODE_COLOR_SWEEP_RANDOM 36 +#define FX_MODE_RUNNING_COLOR 37 +#define FX_MODE_RUNNING_RED_BLUE 38 +#define FX_MODE_RUNNING_RANDOM 39 +#define FX_MODE_LARSON_SCANNER 40 +#define FX_MODE_COMET 41 +#define FX_MODE_FIREWORKS 42 +#define FX_MODE_FIREWORKS_RANDOM 43 +#define FX_MODE_MERRY_CHRISTMAS 44 +#define FX_MODE_FIRE_FLICKER 45 +#define FX_MODE_GRADIENT 46 +#define FX_MODE_LOADING 47 +#define FX_MODE_DUAL_COLOR_WIPE_IN_OUT 48 +#define FX_MODE_DUAL_COLOR_WIPE_IN_IN 49 +#define FX_MODE_DUAL_COLOR_WIPE_OUT_OUT 50 +#define FX_MODE_DUAL_COLOR_WIPE_OUT_IN 51 +#define FX_MODE_CIRCUS_COMBUSTUS 52 +#define FX_MODE_HALLOWEEN 53 +#define FX_MODE_TRICOLOR_CHASE 54 +#define FX_MODE_TRICOLOR_WIPE 55 +#define FX_MODE_TRICOLOR_FADE 56 +#define FX_MODE_LIGHTNING 57 +#define FX_MODE_ICU 58 +#define FX_MODE_MULTI_COMET 59 +#define FX_MODE_DUAL_LARSON_SCANNER 60 +#define FX_MODE_RANDOM_CHASE 61 +#define FX_MODE_OSCILLATE 62 +//Modes that use FastLED --> +#define FX_MODE_PRIDE_2015 63 +#define FX_MODE_JUGGLE 64 +#define FX_MODE_PALETTE 65 +#define FX_MODE_FIRE_2012 66 +#define FX_MODE_COLORWAVES 67 +#define FX_MODE_BPM 68 +#define FX_MODE_FILLNOISE8 69 +#define FX_MODE_NOISE16_1 70 +#define FX_MODE_NOISE16_2 71 +#define FX_MODE_NOISE16_3 72 +#define FX_MODE_NOISE16_4 73 +#define FX_MODE_COLORTWINKLE 74 +#define FX_MODE_LAKE 75 + +class WS2812FX { + typedef uint16_t (WS2812FX::*mode_ptr)(void); + + // segment parameters + public: + typedef struct Segment { // 21 bytes + uint16_t start; + uint16_t stop; + uint8_t speed; + uint8_t intensity; + uint8_t palette; + uint8_t mode; + uint8_t options; + uint32_t colors[NUM_COLORS]; + } segment; + + // segment runtime parameters + typedef struct Segment_runtime { // 17 bytes + unsigned long next_time; + uint32_t counter_mode_step; + uint32_t counter_mode_call; + uint16_t aux_param; + uint16_t aux_param2; + uint8_t trans_act; + } segment_runtime; + + WS2812FX() { + _mode[FX_MODE_STATIC] = &WS2812FX::mode_static; + _mode[FX_MODE_BLINK] = &WS2812FX::mode_blink; + _mode[FX_MODE_COLOR_WIPE] = &WS2812FX::mode_color_wipe; + _mode[FX_MODE_COLOR_WIPE_RANDOM] = &WS2812FX::mode_color_wipe_random; + _mode[FX_MODE_RANDOM_COLOR] = &WS2812FX::mode_random_color; + _mode[FX_MODE_COLOR_SWEEP] = &WS2812FX::mode_color_sweep; + _mode[FX_MODE_DYNAMIC] = &WS2812FX::mode_dynamic; + _mode[FX_MODE_RAINBOW] = &WS2812FX::mode_rainbow; + _mode[FX_MODE_RAINBOW_CYCLE] = &WS2812FX::mode_rainbow_cycle; + _mode[FX_MODE_SCAN] = &WS2812FX::mode_scan; + _mode[FX_MODE_DUAL_SCAN] = &WS2812FX::mode_dual_scan; + _mode[FX_MODE_FADE] = &WS2812FX::mode_fade; + _mode[FX_MODE_THEATER_CHASE] = &WS2812FX::mode_theater_chase; + _mode[FX_MODE_THEATER_CHASE_RAINBOW] = &WS2812FX::mode_theater_chase_rainbow; + _mode[FX_MODE_TWINKLE] = &WS2812FX::mode_twinkle; + _mode[FX_MODE_TWINKLE_RANDOM] = &WS2812FX::mode_twinkle_random; + _mode[FX_MODE_TWINKLE_FADE] = &WS2812FX::mode_twinkle_fade; + _mode[FX_MODE_TWINKLE_FADE_RANDOM] = &WS2812FX::mode_twinkle_fade_random; + _mode[FX_MODE_SPARKLE] = &WS2812FX::mode_sparkle; + _mode[FX_MODE_FLASH_SPARKLE] = &WS2812FX::mode_flash_sparkle; + _mode[FX_MODE_HYPER_SPARKLE] = &WS2812FX::mode_hyper_sparkle; + _mode[FX_MODE_STROBE] = &WS2812FX::mode_strobe; + _mode[FX_MODE_STROBE_RAINBOW] = &WS2812FX::mode_strobe_rainbow; + _mode[FX_MODE_MULTI_STROBE] = &WS2812FX::mode_multi_strobe; + _mode[FX_MODE_BLINK_RAINBOW] = &WS2812FX::mode_blink_rainbow; + _mode[FX_MODE_ANDROID] = &WS2812FX::mode_android; + _mode[FX_MODE_CHASE_COLOR] = &WS2812FX::mode_chase_color; + _mode[FX_MODE_CHASE_RANDOM] = &WS2812FX::mode_chase_random; + _mode[FX_MODE_CHASE_RAINBOW] = &WS2812FX::mode_chase_rainbow; + _mode[FX_MODE_CHASE_FLASH] = &WS2812FX::mode_chase_flash; + _mode[FX_MODE_CHASE_FLASH_RANDOM] = &WS2812FX::mode_chase_flash_random; + _mode[FX_MODE_CHASE_RAINBOW_WHITE] = &WS2812FX::mode_chase_rainbow_white; + _mode[FX_MODE_COLORFUL] = &WS2812FX::mode_colorful; + _mode[FX_MODE_TRAFFIC_LIGHT] = &WS2812FX::mode_traffic_light; + _mode[FX_MODE_COLOR_SWEEP_RANDOM] = &WS2812FX::mode_color_sweep_random; + _mode[FX_MODE_RUNNING_COLOR] = &WS2812FX::mode_running_color; + _mode[FX_MODE_RUNNING_RED_BLUE] = &WS2812FX::mode_running_red_blue; + _mode[FX_MODE_RUNNING_RANDOM] = &WS2812FX::mode_running_random; + _mode[FX_MODE_LARSON_SCANNER] = &WS2812FX::mode_larson_scanner; + _mode[FX_MODE_COMET] = &WS2812FX::mode_comet; + _mode[FX_MODE_FIREWORKS] = &WS2812FX::mode_fireworks; + _mode[FX_MODE_FIREWORKS_RANDOM] = &WS2812FX::mode_fireworks_random; + _mode[FX_MODE_MERRY_CHRISTMAS] = &WS2812FX::mode_merry_christmas; + _mode[FX_MODE_FIRE_FLICKER] = &WS2812FX::mode_fire_flicker; + _mode[FX_MODE_GRADIENT] = &WS2812FX::mode_gradient; + _mode[FX_MODE_LOADING] = &WS2812FX::mode_loading; + _mode[FX_MODE_DUAL_COLOR_WIPE_IN_OUT] = &WS2812FX::mode_dual_color_wipe_in_out; + _mode[FX_MODE_DUAL_COLOR_WIPE_IN_IN] = &WS2812FX::mode_dual_color_wipe_in_in; + _mode[FX_MODE_DUAL_COLOR_WIPE_OUT_OUT] = &WS2812FX::mode_dual_color_wipe_out_out; + _mode[FX_MODE_DUAL_COLOR_WIPE_OUT_IN] = &WS2812FX::mode_dual_color_wipe_out_in; + _mode[FX_MODE_CIRCUS_COMBUSTUS] = &WS2812FX::mode_circus_combustus; + _mode[FX_MODE_HALLOWEEN] = &WS2812FX::mode_halloween; + _mode[FX_MODE_TRICOLOR_CHASE] = &WS2812FX::mode_tricolor_chase; + _mode[FX_MODE_TRICOLOR_WIPE] = &WS2812FX::mode_tricolor_wipe; + _mode[FX_MODE_TRICOLOR_FADE] = &WS2812FX::mode_tricolor_fade; + _mode[FX_MODE_BREATH] = &WS2812FX::mode_breath; + _mode[FX_MODE_RUNNING_LIGHTS] = &WS2812FX::mode_running_lights; + _mode[FX_MODE_LIGHTNING] = &WS2812FX::mode_lightning; + _mode[FX_MODE_ICU] = &WS2812FX::mode_icu; + _mode[FX_MODE_MULTI_COMET] = &WS2812FX::mode_multi_comet; + _mode[FX_MODE_DUAL_LARSON_SCANNER] = &WS2812FX::mode_dual_larson_scanner; + _mode[FX_MODE_RANDOM_CHASE] = &WS2812FX::mode_random_chase; + _mode[FX_MODE_OSCILLATE] = &WS2812FX::mode_oscillate; + _mode[FX_MODE_FIRE_2012] = &WS2812FX::mode_fire_2012; + _mode[FX_MODE_PRIDE_2015] = &WS2812FX::mode_pride_2015; + _mode[FX_MODE_BPM] = &WS2812FX::mode_bpm; + _mode[FX_MODE_JUGGLE] = &WS2812FX::mode_juggle; + _mode[FX_MODE_PALETTE] = &WS2812FX::mode_palette; + _mode[FX_MODE_COLORWAVES] = &WS2812FX::mode_colorwaves; + _mode[FX_MODE_FILLNOISE8] = &WS2812FX::mode_fillnoise8; + _mode[FX_MODE_NOISE16_1] = &WS2812FX::mode_noise16_1; + _mode[FX_MODE_NOISE16_2] = &WS2812FX::mode_noise16_2; + _mode[FX_MODE_NOISE16_3] = &WS2812FX::mode_noise16_3; + _mode[FX_MODE_NOISE16_4] = &WS2812FX::mode_noise16_4; + _mode[FX_MODE_COLORTWINKLE] = &WS2812FX::mode_colortwinkle; + _mode[FX_MODE_LAKE] = &WS2812FX::mode_lake; + + _brightness = DEFAULT_BRIGHTNESS; + _running = false; + _num_segments = 1; + _segments[0].mode = DEFAULT_MODE; + _segments[0].colors[0] = DEFAULT_COLOR; + _segments[0].start = 0; + _segments[0].speed = DEFAULT_SPEED; + _reverseMode = false; + _skipFirstMode = false; + paletteFade = 0; + paletteBlend = 0; + _locked = NULL; + _cronixieDigits = new byte[6]; + bus = new NeoPixelWrapper(); + RESET_RUNTIME; + } + + void + init(bool supportWhite, uint16_t countPixels, bool skipFirst), + service(void), + clear(void), + strip_off(void), + fade_out(uint8_t r), + setMode(uint8_t m), + setSpeed(uint8_t s), + setIntensity(uint8_t i), + setPalette(uint8_t p), + setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), + setSecondaryColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), + setColor(uint32_t c), + setSecondaryColor(uint32_t c), + setBrightness(uint8_t b), + setReverseMode(bool b), + driverModeCronixie(bool b), + setCronixieDigits(byte* d), + setCronixieBacklight(bool b), + setIndividual(uint16_t i, uint32_t col), + setRange(uint16_t i, uint16_t i2, uint32_t col), + lock(uint16_t i), + lockRange(uint16_t i, uint16_t i2), + unlock(uint16_t i), + unlockRange(uint16_t i, uint16_t i2), + unlockAll(void), + setTransitionMode(bool t), + trigger(void), + setNumSegments(uint8_t n), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint8_t speed, uint8_t intensity, bool reverse), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint8_t speed, uint8_t intensity, bool reverse), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint8_t speed, uint8_t intensity, uint8_t options), + resetSegments(), + setPixelColor(uint16_t n, uint32_t c), + setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), + show(void); + + uint8_t + paletteFade, + paletteBlend, + getBrightness(void), + getMode(void), + getSpeed(void), + getNumSegments(void), + get_random_wheel_index(uint8_t); + + uint32_t + color_wheel(uint8_t), + color_from_palette(uint16_t, bool, bool, uint8_t, uint8_t pbri = 255), + color_blend(uint32_t,uint32_t,uint8_t), + getPixelColor(uint16_t), + getColor(void); + + double + getPowerEstimate(uint16_t leds, uint32_t c, byte b), + getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b); + + WS2812FX::Segment + getSegment(void); + + WS2812FX::Segment_runtime + getSegmentRuntime(void); + + WS2812FX::Segment* + getSegments(void); + + // mode helper functions + uint16_t + blink(uint32_t, uint32_t, bool strobe, bool), + color_wipe(uint32_t, uint32_t, bool , bool), + scan(bool), + theater_chase(uint32_t, uint32_t, bool), + twinkle(uint32_t), + twinkle_fade(uint32_t), + chase(uint32_t, uint32_t, uint32_t, uint8_t), + running(uint32_t, uint32_t), + fireworks(uint32_t), + tricolor_chase(uint32_t, uint32_t, uint32_t); + + // builtin modes + uint16_t + mode_static(void), + mode_blink(void), + mode_blink_rainbow(void), + mode_strobe(void), + mode_strobe_rainbow(void), + mode_color_wipe(void), + mode_color_sweep(void), + mode_color_wipe_random(void), + mode_color_sweep_random(void), + mode_random_color(void), + mode_dynamic(void), + mode_breath(void), + mode_fade(void), + mode_scan(void), + mode_dual_scan(void), + mode_theater_chase(void), + mode_theater_chase_rainbow(void), + mode_rainbow(void), + mode_rainbow_cycle(void), + mode_running_lights(void), + mode_twinkle(void), + mode_twinkle_random(void), + mode_twinkle_fade(void), + mode_twinkle_fade_random(void), + mode_sparkle(void), + mode_flash_sparkle(void), + mode_hyper_sparkle(void), + mode_multi_strobe(void), + mode_android(void), + mode_chase_color(void), + mode_chase_random(void), + mode_chase_rainbow(void), + mode_chase_flash(void), + mode_chase_flash_random(void), + mode_chase_rainbow_white(void), + mode_colorful(void), + mode_traffic_light(void), + mode_running_color(void), + mode_running_red_blue(void), + mode_running_random(void), + mode_larson_scanner(void), + mode_comet(void), + mode_fireworks(void), + mode_fireworks_random(void), + mode_merry_christmas(void), + mode_halloween(void), + mode_fire_flicker(void), + mode_gradient(void), + mode_loading(void), + mode_dual_color_wipe_in_out(void), + mode_dual_color_wipe_in_in(void), + mode_dual_color_wipe_out_out(void), + mode_dual_color_wipe_out_in(void), + mode_circus_combustus(void), + mode_bicolor_chase(void), + mode_tricolor_chase(void), + mode_tricolor_wipe(void), + mode_tricolor_fade(void), + mode_icu(void), + mode_multi_comet(void), + mode_dual_larson_scanner(void), + mode_random_chase(void), + mode_oscillate(void), + mode_fire_2012(void), + mode_pride_2015(void), + mode_bpm(void), + mode_juggle(void), + mode_palette(void), + mode_colorwaves(void), + mode_fillnoise8(void), + mode_noise16_1(void), + mode_noise16_2(void), + mode_noise16_3(void), + mode_noise16_4(void), + mode_colortwinkle(void), + mode_lake(void), + mode_lightning(void); + + private: + NeoPixelWrapper *bus; + + CRGB fastled_from_col(uint32_t); + + uint16_t _length; + uint16_t _rand16seed; + uint8_t _brightness; + + void handle_palette(void); + bool modeUsesLock(uint8_t); + + double + _cronixieSecMultiplier; + + boolean + _running, + _rgbwMode, + _reverseMode, + _cronixieMode, + _cronixieBacklightEnabled, + _skipFirstMode, + _triggered; + + byte* _locked; + byte* _cronixieDigits; + + mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element + + + uint32_t _lastPaletteChange = 0; + + uint8_t _segment_index = 0; + uint8_t _segment_index_palette_last = 99; + uint8_t _num_segments = 1; + segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 20 bytes per element + // start, stop, speed, intensity, mode, options, color[] + { 0, 7, DEFAULT_SPEED, 128, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} + }; + segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 17 bytes per element +}; + +#endif From 9d8d2c0aa1544261df3c998a347163392de5dc54 Mon Sep 17 00:00:00 2001 From: viknet365 Date: Tue, 20 Nov 2018 21:31:07 +0100 Subject: [PATCH 20/33] add meteor effect This reverts commit f1371d67373532d3d59b2236ba470c1f3845c810. --- wled00/WS2812FX.h | 6 +++++- wled00/htmls00.h | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index 33e274ebf..979e16de0 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -85,7 +85,7 @@ #define REVERSE (uint8_t)0x80 #define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE) -#define MODE_COUNT 76 +#define MODE_COUNT 77 #define FX_MODE_STATIC 0 #define FX_MODE_BLINK 1 @@ -164,6 +164,8 @@ #define FX_MODE_NOISE16_4 73 #define FX_MODE_COLORTWINKLE 74 #define FX_MODE_LAKE 75 +#define FX_MODE_METEOR 76 + class WS2812FX { typedef uint16_t (WS2812FX::*mode_ptr)(void); @@ -268,6 +270,7 @@ class WS2812FX { _mode[FX_MODE_NOISE16_4] = &WS2812FX::mode_noise16_4; _mode[FX_MODE_COLORTWINKLE] = &WS2812FX::mode_colortwinkle; _mode[FX_MODE_LAKE] = &WS2812FX::mode_lake; + _mode[FX_MODE_METEOR] = &WS2812FX::mode_meteor; _brightness = DEFAULT_BRIGHTNESS; _running = false; @@ -443,6 +446,7 @@ class WS2812FX { mode_noise16_4(void), mode_colortwinkle(void), mode_lake(void), + mode_meteor(void), mode_lightning(void); private: diff --git a/wled00/htmls00.h b/wled00/htmls00.h index 80ca6bb46..56726909c 100644 --- a/wled00/htmls00.h +++ b/wled00/htmls00.h @@ -3,7 +3,7 @@ */ #ifndef WLED_DISABLE_MOBILE_UI const char PAGE_indexM[] PROGMEM = R"=====( -WLED 0.8.1
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
+ )====="; //head1 (css) @@ -123,7 +123,7 @@ Effect Panel



-

Set secondary color to From 54d7a81f16938ff25ed239280e50bcced231cc7f Mon Sep 17 00:00:00 2001 From: cschwinne Date: Wed, 21 Nov 2018 23:28:20 +0100 Subject: [PATCH 21/33] Incomplete commit for Nightlight Fixes Interim state (Reason: Local Working Copy Data Corruption) Affected files: (local changes will be re-implemented in next commit) settings_sync.html (already recovered) html_settings.h (already recovered) wled03_set.ino wled08_led.ino wled09_button.ino wled19_ir.ino --- wled00/data/settings_sync.htm | Bin 10148 -> 10488 bytes wled00/html_settings.h | 4 +- wled00/wled00.ino | 29 +++++++----- wled00/wled01_eeprom.ino | 33 +++++++++----- wled00/wled02_xml.ino | 3 +- wled00/wled05_init.ino | 6 +-- wled00/wled07_notify.ino | 83 +++++++++++++++++++--------------- 7 files changed, 93 insertions(+), 65 deletions(-) diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index aacc4311680b9873bca5faebee61c712b706ad84..ac62cae79d7da258e57ce3091dc0d391fe266906 100644 GIT binary patch delta 110 zcmZ4D|08h2Kc30Ygai~l8S)s?7>XDYfjE^Rg+T#KCj;4;3}ryFX!3F%e`ZgHpvi@j n;*+0AC&;7g&}DFD$OoEI0@Rt$kTcm)L=~c5N_jIM?=&d@p|Biq delta 16 YcmewnxWs?MKc2}UJOZ1O_@+q#07K#i%>V!Z diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 4e5527eec..86aae39de 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -224,7 +224,9 @@ const char PAGE_settings_sync1[] PROGMEM = R"=====(

Sync setup

Button setup

-On/Off button enabled: +On/Off button enabled:
+Infrared receiver enabled:
+IR info

WLED Broadcast

UDP Port:
Receive Brightness, Color, and Effects
diff --git a/wled00/wled00.ino b/wled00/wled00.ino index e00b12d56..b116de090 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -21,10 +21,12 @@ //#define WLED_DISABLE_BLYNK //#define WLED_DISABLE_CRONIXIE //#define WLED_DISABLE_HUESYNC +//#define WLED_DISABLE_INFRARED //#define WLED_DISABLE_MOBILE_UI //to toggle usb serial debug (un)comment following line(s) -//#define WLED_DEBUG +#define WLED_DEBUG + //library inclusions #include @@ -33,15 +35,19 @@ #include #include "src/dependencies/webserver/WebServer.h" #include - #include + /*#ifndef WLED_DISABLE_INFRARED + #include + #endif*/ //there are issues with ESP32 infrared, so it is disabled for now #else #include #include #include #include - #include - #include - #include + #ifndef WLED_DISABLE_INFRARED + #include + #include + #include + #endif #endif #include @@ -68,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811172 +#define VERSION 1811201 char versionString[] = "0.8.2-dev"; @@ -148,8 +154,8 @@ bool useHSBDefault = useHSB; //Sync CONFIG -bool buttonEnabled = true; -bool irEnabled = true; //Infrared receiver +bool buttonEnabled = true; +bool irEnabled = false; //Infrared receiver uint16_t udpPort = 21324; //WLED notifier default port uint16_t udpRgbPort = 19446; //Hyperion port @@ -158,7 +164,7 @@ bool receiveNotificationBrightness = true; //apply brightness from incoming n bool receiveNotificationColor = true; //apply color bool receiveNotificationEffects = true; //apply effects setup bool notifyDirect = true; //send notification if change via UI or HTTP API -bool notifyButton = true; +bool notifyButton = true; //send if updated by button or infrared remote bool notifyAlexa = false; //send notification if updated via Alexa bool notifyMacro = false; //send notification for macro bool notifyHue = true; //send notification if Hue light changes @@ -259,6 +265,7 @@ float tperLast = 0; //crossfade transition progress, 0 bool nightlightActive = false; bool nightlightActiveOld = false; uint32_t nightlightDelayMs = 10; +uint8_t nightlightDelayMinsDefault = nightlightDelayMins; unsigned long nightlightStartTime; byte briNlT = 0; //current nightlight brightness @@ -407,7 +414,7 @@ E131* e131; WS2812FX strip = WS2812FX(); //debug macros -#ifdef DEBUG +#ifdef WLED_DEBUG #define DEBUG_PRINT(x) Serial.print (x) #define DEBUG_PRINTLN(x) Serial.println (x) #define DEBUG_PRINTF(x) Serial.printf (x) @@ -524,7 +531,7 @@ void loop() { } //DEBUG serial logging - #ifdef DEBUG + #ifdef WLED_DEBUG if (millis() - debugTime > 5000) { DEBUG_PRINTLN("---MODULE DEBUG INFO---"); diff --git a/wled00/wled01_eeprom.ino b/wled00/wled01_eeprom.ino index 06dee8cfc..56a0bc138 100644 --- a/wled00/wled01_eeprom.ino +++ b/wled00/wled01_eeprom.ino @@ -66,7 +66,7 @@ void saveSettingsToEEPROM() writeStringToEEPROM(128, apSSID, 32); writeStringToEEPROM(160, apPass, 64); - EEPROM.write(224, nightlightDelayMins); + EEPROM.write(224, nightlightDelayMinsDefault); EEPROM.write(225, nightlightFade); EEPROM.write(226, notifyDirectDefault); EEPROM.write(227, apChannel); @@ -138,6 +138,8 @@ void saveSettingsToEEPROM() EEPROM.write(380, colSecS[2]); EEPROM.write(381, whiteSecS); EEPROM.write(382, strip.paletteBlend); + + EEPROM.write(385, irEnabled); EEPROM.write(389, bootPreset); EEPROM.write(390, aOtaEnabled); @@ -256,7 +258,9 @@ void loadSettingsFromEEPROM(bool first) { if (EEPROM.read(233) != 233) //first boot/reset to default { + DEBUG_PRINT("Settings invalid, restoring defaults..."); saveSettingsToEEPROM(); + DEBUG_PRINTLN("done"); return; } int lastEEPROMversion = EEPROM.read(377); //last EEPROM version before update @@ -268,7 +272,8 @@ void loadSettingsFromEEPROM(bool first) readStringFromEEPROM(128, apSSID, 32); readStringFromEEPROM(160, apPass, 64); - nightlightDelayMins = EEPROM.read(224); + nightlightDelayMinsDefault = EEPROM.read(224); + nightlightDelayMins = nightlightDelayMinsDefault; nightlightFade = EEPROM.read(225); notifyDirectDefault = EEPROM.read(226); notifyDirect = notifyDirectDefault; @@ -343,6 +348,8 @@ void loadSettingsFromEEPROM(bool first) effectPaletteDefault = EEPROM.read(373); effectPalette = effectPaletteDefault; //374 - strip.paletteFade + irEnabled = EEPROM.read(385); + if (lastEEPROMversion > 0) { apWaitTimeSecs = EEPROM.read(375); recoveryAPDisabled = EEPROM.read(376); @@ -607,14 +614,16 @@ void saveMacro(byte index, String mc, bool sing=true) //only commit on single sa void commit() { - #ifdef ARDUINO_ARCH_ESP32 - delay(1); - portDISABLE_INTERRUPTS(); - #endif - - EEPROM.commit(); - - #ifdef ARDUINO_ARCH_ESP32 - portENABLE_INTERRUPTS(); - #endif + DEBUG_PRINT("s"); + /*#ifdef ARDUINO_ARCH_ESP32 + portMUX_TYPE mMux = portMUX_INITIALIZER_UNLOCKED; + portENTER_CRITICAL(&mMux); + #endif*/ + + EEPROM.commit(); + + /*#ifdef ARDUINO_ARCH_ESP32 + portEXIT_CRITICAL(&mMux); + #endif*/ + DEBUG_PRINT("."); } diff --git a/wled00/wled02_xml.ino b/wled00/wled02_xml.ino index 09694fbc9..1730a6ef8 100644 --- a/wled00/wled02_xml.ino +++ b/wled00/wled02_xml.ino @@ -216,7 +216,7 @@ void getSettingsJS(byte subPage) sappend('c',"T2",enableSecTransition); sappend('v',"BF",briMultiplier); sappend('v',"TB",nightlightTargetBri); - sappend('v',"TL",nightlightDelayMins); + sappend('v',"TL",nightlightDelayMinsDefault); sappend('c',"TW",nightlightFade); sappend('i',"PB",strip.paletteBlend); sappend('c',"RV",reverseMode); @@ -242,6 +242,7 @@ void getSettingsJS(byte subPage) if (subPage == 4) { sappend('c',"BT",buttonEnabled); + sappend('c',"IR",irEnabled); sappend('v',"UP",udpPort); sappend('c',"RB",receiveNotificationBrightness); sappend('c',"RC",receiveNotificationColor); diff --git a/wled00/wled05_init.ino b/wled00/wled05_init.ino index e93bc3587..d6b2f7327 100644 --- a/wled00/wled05_init.ino +++ b/wled00/wled05_init.ino @@ -251,7 +251,7 @@ void getBuildInfo() #else oappend("\r\nspiffs: false\r\n"); #endif - #ifdef DEBUG + #ifdef WLED_DEBUG oappend("debug: true\r\n"); #else oappend("debug: false\r\n"); @@ -260,8 +260,8 @@ void getBuildInfo() oappendi(BTNPIN); oappend("\r\nstrip-pin: gpio"); oappendi(LEDPIN); - oappend("\r\nbrand: wled\r\n"); - oappend("\r\nbuild-type: src\r\n"); + oappend("\r\nbrand: wled"); + oappend("\r\nbuild-type: dev\r\n"); } diff --git a/wled00/wled07_notify.ino b/wled00/wled07_notify.ino index faa524d81..4e1e01f89 100644 --- a/wled00/wled07_notify.ino +++ b/wled00/wled07_notify.ino @@ -150,56 +150,65 @@ void handleNotifications() olen = 0; notifierUdp.read(obuf, packetSize); char* udpIn = obuf; - - if (udpIn[0] == 0 && !realtimeActive && receiveNotifications) //wled notifier, block if realtime packets active + + //wled notifier, block if realtime packets active + if (udpIn[0] == 0 && !realtimeActive && receiveNotifications) { + //apply colors from notification if (receiveNotificationColor) { - col[0] = udpIn[3]; - col[1] = udpIn[4]; - col[2] = udpIn[5]; - } - if (udpIn[11] > 0 && receiveNotificationColor) //check if sending modules white val is inteded - { - white = udpIn[10]; - if (udpIn[11] > 1 ) + col[0] = udpIn[3]; + col[1] = udpIn[4]; + col[2] = udpIn[5]; + if (udpIn[11] > 0) //check if sending modules white val is inteded { - colSec[0] = udpIn[12]; - colSec[1] = udpIn[13]; - colSec[2] = udpIn[14]; - whiteSec = udpIn[15]; + white = udpIn[10]; + if (udpIn[11] > 1) + { + colSec[0] = udpIn[12]; + colSec[1] = udpIn[13]; + colSec[2] = udpIn[14]; + whiteSec = udpIn[15]; + } } } - if (udpIn[8] != effectCurrent && receiveNotificationEffects) + + //apply effects from notification + if (receiveNotificationEffects) { - effectCurrent = udpIn[8]; - strip.setMode(effectCurrent); - } - if (udpIn[9] != effectSpeed && receiveNotificationEffects) - { - effectSpeed = udpIn[9]; - strip.setSpeed(effectSpeed); - } - if (udpIn[11] > 2 && udpIn[16] != effectIntensity && receiveNotificationEffects) - { - effectIntensity = udpIn[16]; - strip.setIntensity(effectIntensity); + if (udpIn[8] != effectCurrent) + { + effectCurrent = udpIn[8]; + strip.setMode(effectCurrent); + } + if (udpIn[9] != effectSpeed) + { + effectSpeed = udpIn[9]; + strip.setSpeed(effectSpeed); + } + if (udpIn[11] > 2 && udpIn[16] != effectIntensity) + { + effectIntensity = udpIn[16]; + strip.setIntensity(effectIntensity); + } + if (udpIn[11] > 4 && udpIn[19] != effectPalette) + { + effectPalette = udpIn[19]; + strip.setPalette(effectPalette); + } } + if (udpIn[11] > 3) { transitionDelayTemp = ((udpIn[17] << 0) & 0xFF) + ((udpIn[18] << 8) & 0xFF00); } - if (udpIn[11] > 4 && udpIn[19] != effectPalette && receiveNotificationEffects) - { - effectPalette = udpIn[19]; - strip.setPalette(effectPalette); - } + nightlightActive = udpIn[6]; - if (!nightlightActive) - { - if (receiveNotificationBrightness) bri = udpIn[2]; - colorUpdated(3); - } + if (nightlightActive) nightlightDelayMins = udpIn[7]; + + if (receiveNotificationBrightness) bri = udpIn[2]; + colorUpdated(3); + } else if (udpIn[0] > 0 && udpIn[0] < 4 && receiveDirect) //1 warls //2 drgb //3 drgbw { realtimeIP = notifierUdp.remoteIP(); From cd234673ea86b532eb6691358d08517ac4c66871 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Thu, 22 Nov 2018 00:09:30 +0100 Subject: [PATCH 22/33] Fixed nightlight issues Added custom infrared method --- wled00/ir_codes.h | 8 ++++++- wled00/wled00.ino | 2 +- wled00/wled03_set.ino | 12 +++-------- wled00/wled08_led.ino | 17 ++++++++++++++- wled00/wled09_button.ino | 9 +------- wled00/wled17_mqtt.ino | 2 +- wled00/wled19_ir.ino | 46 +++++++++++++++++++++++++++++++++------- 7 files changed, 67 insertions(+), 29 deletions(-) diff --git a/wled00/ir_codes.h b/wled00/ir_codes.h index 0f07c226d..e9043bd9f 100644 --- a/wled00/ir_codes.h +++ b/wled00/ir_codes.h @@ -1,4 +1,10 @@ -//Infrared codes from http://woodsgood.ca/projects/2015/02/13/rgb-led-strip-controllers-ir-codes/ +//Infrared codes + +//Add your custom codes here +#define IRCUSTOM_ONOFF 0xA55AEA15 //Pioneer RC-975R "+FAV" button (example) +#define IRCUSTOM_MACRO1 0xFFFFFFFF //placeholder, will never be checked for + +//Infrared codes for 24-key remote from http://woodsgood.ca/projects/2015/02/13/rgb-led-strip-controllers-ir-codes/ #define IR24_BRIGHTER 0xF700FF #define IR24_DARKER 0xF7807F #define IR24_OFF 0xF740BF diff --git a/wled00/wled00.ino b/wled00/wled00.ino index b116de090..649fbcce4 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -74,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811201 +#define VERSION 1811221 char versionString[] = "0.8.2-dev"; diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index 6875942fe..0c24fa208 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -109,7 +109,7 @@ void handleSettingsSet(byte subPage) nightlightTargetBri = server.arg("TB").toInt(); t = server.arg("TL").toInt(); - if (t > 0) nightlightDelayMins = t; + if (t > 0) nightlightDelayMinsDefault = t; nightlightFade = server.hasArg("TW"); t = server.arg("PB").toInt(); @@ -144,6 +144,7 @@ void handleSettingsSet(byte subPage) if (subPage == 4) { buttonEnabled = server.hasArg("BT"); + irEnabled = server.hasArg("IR"); int t = server.arg("UP").toInt(); if (t > 0) udpPort = t; receiveNotificationBrightness = server.hasArg("RB"); @@ -633,14 +634,7 @@ bool handleSet(String req) { case 0: if (bri != 0){briLast = bri; bri = 0;} break; //off case 1: bri = briLast; break; //on - default: if (bri == 0) //toggle - { - bri = briLast; - } else - { - briLast = bri; - bri = 0; - } + default: toggleOnOff(); //toggle } } diff --git a/wled00/wled08_led.ino b/wled00/wled08_led.ino index de1d3a1f1..d7ebfb49a 100644 --- a/wled00/wled08_led.ino +++ b/wled00/wled08_led.ino @@ -2,6 +2,18 @@ * LED methods */ +void toggleOnOff() +{ + if (bri == 0) + { + bri = briLast; + } else + { + briLast = bri; + bri = 0; + } +} + void setAllLeds() { if (!realtimeActive || !arlsForceMaxBri) { @@ -73,6 +85,10 @@ void colorUpdated(int callMode) //call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (NN)6: fx changed 7: hue 8: preset cycle 9: blynk if (!colorChanged()) { + if (nightlightActive && !nightlightActiveOld && callMode != 3 && callMode != 5) + { + notify(4); return; + } if (callMode == 2) notify(2); else if (callMode == 6) notify(6); return; //no change @@ -188,7 +204,6 @@ void handleNightlight() if (!nightlightActiveOld) //init { nightlightStartTime = millis(); - notify(4); nightlightDelayMs = (int)(nightlightDelayMins*60000); nightlightActiveOld = true; briNlT = bri; diff --git a/wled00/wled09_button.ino b/wled00/wled09_button.ino index 0c6e3a27f..839049277 100644 --- a/wled00/wled09_button.ino +++ b/wled00/wled09_button.ino @@ -25,14 +25,7 @@ void handleButton() else { if (macroButton == 0) { - if (bri == 0) - { - bri = briLast; - } else - { - briLast = bri; - bri = 0; - } + toggleOnOff(); colorUpdated(2); } else { applyMacro(macroButton); diff --git a/wled00/wled17_mqtt.ino b/wled00/wled17_mqtt.ino index c98833f75..1a1fd8ee3 100644 --- a/wled00/wled17_mqtt.ino +++ b/wled00/wled17_mqtt.ino @@ -5,7 +5,7 @@ void parseMQTTBriPayload(char* payload) { if (strcmp(payload, "ON") == 0) {bri = briLast; colorUpdated(1);} - else if (strcmp(payload, "T" ) == 0) {handleSet("win&T=2");} + else if (strcmp(payload, "T" ) == 0) {toggleOnOff(); colorUpdated(1);} else { uint8_t in = strtoul(payload, NULL, 10); if (in == 0 && bri > 0) briLast = bri; diff --git a/wled00/wled19_ir.ino b/wled00/wled19_ir.ino index a1e2f727d..f59dd63a7 100644 --- a/wled00/wled19_ir.ino +++ b/wled00/wled19_ir.ino @@ -2,6 +2,10 @@ * Infrared sensor support for generic 24 key RGB remote */ +#if defined(WLED_DISABLE_INFRARED) || defined(ARDUINO_ARCH_ESP32) +void handleIR(){} +#else + IRrecv* irrecv; //change pin in NpbWrapper.h @@ -12,6 +16,23 @@ uint32_t lastValidCode = 0; uint16_t irTimesRepeated = 0; +//Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control +//IR codes themselves can be defined directly after "case" or in "ir_codes.h" +bool decodeIRCustom(uint32_t code) +{ + switch (code) + { + //just examples, feel free to modify or remove + case IRCUSTOM_ONOFF : toggleOnOff(); break; + case IRCUSTOM_MACRO1 : applyMacro(1); break; + + default: return false; + } + if (code != IRCUSTOM_MACRO1) colorUpdated(2); //don't update color again if we apply macro, it already does it + return true; +} + + //relatively change brightness, minumum A=5 void relativeChange(byte* property, int8_t amount, byte lowerBoundary =0) { @@ -21,34 +42,38 @@ void relativeChange(byte* property, int8_t amount, byte lowerBoundary =0) *property = new_val; } -void decodeIr(uint32_t code) + +void decodeIR(uint32_t code) { if (code == 0xFFFFFFFF) //repeated code, continue brightness up/down { irTimesRepeated++; if (lastValidCode == IR24_BRIGHTER) { - relativeChange(&bri, 10); return; + relativeChange(&bri, 10); colorUpdated(2); } else if (lastValidCode == IR24_DARKER) { - relativeChange(&bri, -10, 5); return; + relativeChange(&bri, -10, 5); colorUpdated(2); } else if (lastValidCode == IR24_ON && irTimesRepeated > 7) { nightlightActive = true; nightlightStartTime = millis(); + colorUpdated(2); } return; } lastValidCode = 0; irTimesRepeated = 0; - + + if (decodeIRCustom(code)) return; if (code > 0xFFFFFF) return; //invalid code else if (code > 0xFF0000) decodeIR44(code); //is in 44-key remote range else if (code > 0xF70000 && code < 0xF80000) decodeIR24(code); //is in 24-key remote range //code <= 0xF70000 also invalid } + void decodeIR24(uint32_t code) { switch (code) { @@ -82,11 +107,13 @@ void decodeIR24(uint32_t code) colorUpdated(2); //for notifier, IR is considered a button input } + void decodeIR44(uint32_t code) { //not implemented for now } + void initIR() { if (irEnabled) @@ -94,9 +121,9 @@ void initIR() irrecv = new IRrecv(IR_PIN); irrecv->enableIRIn(); } - //irrecv.disableIRIn(); } + void handleIR() { if (irEnabled && millis() - irCheckedTime > 120) @@ -111,16 +138,19 @@ void handleIR() if (irrecv->decode(&results)) { - DEBUG_PRINTLN("IR recv"); - #ifdef DEBUG + DEBUG_PRINT("IR recv\r\n0x"); + #ifdef WLED_DEBUG Serial.println((uint32_t)results.value, HEX); #endif - decodeIr(results.value); + decodeIR(results.value); irrecv->resume(); } } else if (irrecv != NULL) { + irrecv->disableIRIn(); delete irrecv; irrecv = NULL; } } } + +#endif From 686f2c4aa601cb7896b12be180d7c4718338cd43 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Thu, 22 Nov 2018 22:43:44 +0100 Subject: [PATCH 23/33] IR codes will now also be printed without debug enabled --- wled00/wled19_ir.ino | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/wled00/wled19_ir.ino b/wled00/wled19_ir.ino index f59dd63a7..88d1bdffc 100644 --- a/wled00/wled19_ir.ino +++ b/wled00/wled19_ir.ino @@ -138,10 +138,9 @@ void handleIR() if (irrecv->decode(&results)) { - DEBUG_PRINT("IR recv\r\n0x"); - #ifdef WLED_DEBUG + Serial.print("IR recv\r\n0x"); Serial.println((uint32_t)results.value, HEX); - #endif + Serial.println(); decodeIR(results.value); irrecv->resume(); } From 0998fd32cd0db5f90302cef3970aa44f02aba9c2 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Fri, 23 Nov 2018 00:03:44 +0100 Subject: [PATCH 24/33] Moved About section to Github wiki --- wled00/data/settings_sec.htm | Bin 9120 -> 6752 bytes wled00/html_settings.h | 19 +++---------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/wled00/data/settings_sec.htm b/wled00/data/settings_sec.htm index 64b12c80f038d9636e3677e28d6542d18756bd0c..8ea856106eb912ede5d8703d790caaa81e4be3ef 100644 GIT binary patch delta 268 zcmZ`zI|{-;6r7yEB4{dcwNMZx2$nXBiU^j1rNkr{NlYZ>gV%5`;1L85V&efkinH5W zJec1b=CS%tpZAvfG`ABMHBN|mF6PLPqCie|KuMGlUol3XC#hv9mFx`m|B@pJ1PF2A zr3R(&*%q=zz%!a4*1py~B-9H;#*699xWiLc+iplY5my|UWkz)!d#x7<@`{(^X7*~g iW>Py5^~AIXWM}i~Ga0hKFl>hnmRKn1ykEm!W&Hp(%{K`E delta 1554 zcma)+>uwTJ6oq$V{M{y|1!9^GA;b~`NTD}VNm@j$L5rbH^_O9Q3gH^281N-boEPv7 zG|`vvXWzhA@D2R-L9PR8CNp!+K4;cid(GbGXX^9Qub(z<*^+jDZ3I>xx~pq}{eoOe zTe{Meyws#3mK^a;%eK5AZZmF}=rcJdl4JcsP9@_0@CQTZQk9~#q)v3e?jCQ4w*^{H zN~{Lm8-Kvv^M4N=ftBW42Q-Hr4Ulbki`>fVi0au&W~G3V1KE*1uDA^6N#>Ruv$qU# z4Nhgr@a#&({jwIgZB)BA>xcIpc@JKTT~*dwj0fPn33&j=C3)JoS-~UK+LgB`XvsTeOD zTBtcE)@1x)SP`mbe=g=xvjlC{g@{cp4dAGoD~{u%d32`62g-SPGG1Nse@$(bP}!6Y zHB&MUdosN{sx$2bt?vpsX7M^H3FEYmV>+A4YNn3Hb?rs^AE)c^w#h}$2JK+&unu)# zn`*Gpt!#Mj`h54!@@A!Ao|(}KnN2(x_Lvv--&)RAvv8_cs--VQ&Hr>R=3zQUT^E&Y zb7|e_$+xJ&IOjHp{if%h#ZLW7E9=k6K;MNnHCz1?!_#cEBWCtCRncy4;f{#|CG_a` z+EL|c>^mJIT{6?EoManual OTA Update
Enable ArduinoOTA:

About

-WLED version 0.8.2-dev

-Contributors:
-StormPie (Mobile HTML UI)

-Thank you so much!

+WLED version 0.8.2

+Contributors, dependencies and special thanks
+A huge thank you to everyone who helped me create WLED!

(c) 2016-2018 Christian Schwinne
Licensed under the MIT license

-Uses libraries:
-ESP8266/ESP32 Arduino Core
-NeoPixelBus by Makuna (svenihoney fork)
-FastLED library
-(ESP32) WebServer_tng by bbx10
-WS2812FX by kitesurfer1404 (modified)
-Timezone library by JChristensen
-Blynk library (compacted)
-E1.31 library by forkineye (modified)
-PubSubClient by knolleary (modified)
-Espalexa by Aircoookie (modified)

-UI icons by Linearicons created by Perxis! (CC-BY-SA 4.0)

Server message: Response error!
From ee55a574de5e4d61b58a7a68ffc841063b815e75 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Fri, 23 Nov 2018 00:03:44 +0100 Subject: [PATCH 25/33] Moved About section to Github wiki Updated readme --- readme.md | 5 +++-- wled00/data/settings_sec.htm | Bin 9120 -> 6752 bytes wled00/html_settings.h | 19 +++---------------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/readme.md b/readme.md index cde8801e4..144412dba 100644 --- a/readme.md +++ b/readme.md @@ -28,6 +28,7 @@ A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control - Sync to Philips hue lights - Adalight (PC ambilight via serial) - Sync color of multiple WLED devices (UDP notifier) +- Infrared remotes (24-key RGB, receiver required) - Simple timers/schedules (time from NTP, timezones/DST supported) ### Quick start guide and documentation: @@ -37,13 +38,13 @@ See the [wiki](https://github.com/Aircoookie/WLED/wiki)! ### Other Licensed under the MIT license -Credits in About page! +Credits [here](https://github.com/Aircoookie/WLED/wiki/Contributors-&-About)! Uses Linearicons by Perxis! Join the Discord [server](https://discord.gg/KuqP7NE) to discuss everything about WLED! You can also send me mails to [dev.aircoookie@gmail.com](mailto:dev.aircoookie@gmail.com). -If you insist that you just love WLED too much, you can [send me a gift](https://paypal.me/aircoookie)! +If WLED really brightens up your every day, you can [send me a small gift](https://paypal.me/aircoookie)! diff --git a/wled00/data/settings_sec.htm b/wled00/data/settings_sec.htm index 64b12c80f038d9636e3677e28d6542d18756bd0c..8ea856106eb912ede5d8703d790caaa81e4be3ef 100644 GIT binary patch delta 268 zcmZ`zI|{-;6r7yEB4{dcwNMZx2$nXBiU^j1rNkr{NlYZ>gV%5`;1L85V&efkinH5W zJec1b=CS%tpZAvfG`ABMHBN|mF6PLPqCie|KuMGlUol3XC#hv9mFx`m|B@pJ1PF2A zr3R(&*%q=zz%!a4*1py~B-9H;#*699xWiLc+iplY5my|UWkz)!d#x7<@`{(^X7*~g iW>Py5^~AIXWM}i~Ga0hKFl>hnmRKn1ykEm!W&Hp(%{K`E delta 1554 zcma)+>uwTJ6oq$V{M{y|1!9^GA;b~`NTD}VNm@j$L5rbH^_O9Q3gH^281N-boEPv7 zG|`vvXWzhA@D2R-L9PR8CNp!+K4;cid(GbGXX^9Qub(z<*^+jDZ3I>xx~pq}{eoOe zTe{Meyws#3mK^a;%eK5AZZmF}=rcJdl4JcsP9@_0@CQTZQk9~#q)v3e?jCQ4w*^{H zN~{Lm8-Kvv^M4N=ftBW42Q-Hr4Ulbki`>fVi0au&W~G3V1KE*1uDA^6N#>Ruv$qU# z4Nhgr@a#&({jwIgZB)BA>xcIpc@JKTT~*dwj0fPn33&j=C3)JoS-~UK+LgB`XvsTeOD zTBtcE)@1x)SP`mbe=g=xvjlC{g@{cp4dAGoD~{u%d32`62g-SPGG1Nse@$(bP}!6Y zHB&MUdosN{sx$2bt?vpsX7M^H3FEYmV>+A4YNn3Hb?rs^AE)c^w#h}$2JK+&unu)# zn`*Gpt!#Mj`h54!@@A!Ao|(}KnN2(x_Lvv--&)RAvv8_cs--VQ&Hr>R=3zQUT^E&Y zb7|e_$+xJ&IOjHp{if%h#ZLW7E9=k6K;MNnHCz1?!_#cEBWCtCRncy4;f{#|CG_a` z+EL|c>^mJIT{6?EoManual OTA Update
Enable ArduinoOTA:

About

-WLED version 0.8.2-dev

-Contributors:
-StormPie (Mobile HTML UI)

-Thank you so much!

+WLED version 0.8.2

+Contributors, dependencies and special thanks
+A huge thank you to everyone who helped me create WLED!

(c) 2016-2018 Christian Schwinne
Licensed under the MIT license

-Uses libraries:
-ESP8266/ESP32 Arduino Core
-NeoPixelBus by Makuna (svenihoney fork)
-FastLED library
-(ESP32) WebServer_tng by bbx10
-WS2812FX by kitesurfer1404 (modified)
-Timezone library by JChristensen
-Blynk library (compacted)
-E1.31 library by forkineye (modified)
-PubSubClient by knolleary (modified)
-Espalexa by Aircoookie (modified)

-UI icons by Linearicons created by Perxis! (CC-BY-SA 4.0)

Server message: Response error!
From eb1ccb600b0e854b3428e5c89bdf073f4ce11328 Mon Sep 17 00:00:00 2001 From: Aircoookie Date: Fri, 23 Nov 2018 00:20:26 +0100 Subject: [PATCH 26/33] Delete htmls00.h 0.8.2 will use the new gzip system with different files. HTML changes will be manually added --- wled00/htmls00.h | 157 ----------------------------------------------- 1 file changed, 157 deletions(-) delete mode 100644 wled00/htmls00.h diff --git a/wled00/htmls00.h b/wled00/htmls00.h deleted file mode 100644 index 56726909c..000000000 --- a/wled00/htmls00.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Mobile UI by StormPie html -*/ -#ifndef WLED_DISABLE_MOBILE_UI -const char PAGE_indexM[] PROGMEM = R"=====( -WLED 0.8.1
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Sweep
  • Dynamic
  • Colorloop
  • Rainbow
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  • Halloween
  • Tri Chase
  • Tri Wipe
  • Tri Fade
  • Lightning
  • ICU
  • Multi Comet
  • Dual Scanner
  • Random Chase
  • Oscillate
  • Pride 2015
  • Juggle
  • Palette
  • Fire 2012
  • Colorwaves
  • BPM
  • Fill Noise 8
  • Noise 16 1
  • Noise 16 2
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • Lake
  • Meteor
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • Random Cycle
  • Primary Color Only
  • Based on Primary
  • Set Colors Only
  • Based on Set Colors
  • Party
  • Cloud
  • Lava
  • Ocean
  • Forest
  • Rainbow
  • Rainbow Stripe
  • Sunset
  • Rivendell
  • Breeze
  • Red & Blue
  • Yellowout
  • Analogous
  • Splash
  • Pastel
  • Sunset2
  • Beech
  • Vintage
  • Departure
  • Landscape
  • Beach
  • Sherbet
  • Hult
  • Hult64
  • Drywet
  • Jul
  • Grintage
  • Rewhi
  • Tertiary
  • Fire
  • Icefire
  • Cyane
  • Light Pink
  • Autumn
  • Magenta
  • Magred
  • Yelmag
  • Yelblu
  • Orange & Teal
  • Tiamat
  • April Night
  •  
  • Go to top
-)====="; -#else -const char PAGE_indexM[] PROGMEM = R"=====( -Mobile UI is unsupported (limited storage). Go to /settings/ui and change UI mode to "Classic". -)====="; -#endif - - -/* - * Classic UI Index html - */ -//head0 (js) -const char PAGE_index0[] PROGMEM = R"=====( -WLED 0.8.1 - -)====="; - -//head1 (css) -const char PAGE_index1[] PROGMEM = R"=====( -.ctrl_box{margin:auto;width:80vw;background-color:var(--cCol);position:absolute;top:55%;left:50%;transform:translate(-50%,-50%);filter:drop-shadow(-5px -5px 5px var(--sCol))}.sds{width:100%;height:12vh;margin-top:2vh}.sl{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slA{margin-top:0vh;background:linear-gradient(to right,black,yellow)}#slR{background:linear-gradient(to right,black,red)}#slG{background:linear-gradient(to right,black,green)}#slB{background:linear-gradient(to right,black,blue)}#slW{background:linear-gradient(to right,black,white)}#slH{background:linear-gradient(to right,red,orange,yellow,green,cyan,blue,violet,red)}#slS{background:linear-gradient(to right,grey,green)}#slN{background:linear-gradient(to right,black,turquoise)}#slT{background:linear-gradient(to right,black,yellow)}.tools{margin-left:auto;margin-right:auto;margin-top:2vh;width:77vw}#slX{background:linear-gradient(to right,black,white)}#slI{background:linear-gradient(to right,black,red)}body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment:fixed;color:var(--tCol)}html{height:100%}iframe{display:none;border:0;filter:drop-shadow(-5px -5px 5px var(--sCol));margin:auto;width:80vw;height:60vh;position:absolute;top:55%;left:50%;transform:translate(-50%,-50%)}svg{fill:var(--dCol);width:12vw;height:10vmin;filter:drop-shadow(-5px -5px 5px var(--sCol))}input{filter:drop-shadow(-5px -5px 5px var(--sCol));}button{background:var(--bCol);color:var(--tCol);border:.5ch solid var(--bCol);margin-bottom:1vh;font-family:var(--cFn),sans-serif;filter:drop-shadow(-5px -5px 5px var(--sCol))}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);font-family:var(--cFn),sans-serif;width:3em}input[type=range]{-webkit-appearance:none;margin:-4px 0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-webkit-slider-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;-webkit-appearance:none;margin-top:1vh}input[type=range]::-moz-range-track{width:100%;height:12vh;cursor:pointer;background:var(--bCol)}input[type=range]::-moz-range-thumb{filter:drop-shadow(-5px -5px 5px var(--sCol));height:10vh;width:10vh;background:var(--aCol);cursor:pointer;margin-top:1vh}input[type=range]::-ms-track{width:100%;height:12vh;cursor:pointer;background:transparent;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#var(--bCol)}input[type=range]::-ms-fill-upper{background:#var(--bCol)}input[type=range]::-ms-thumb{width:10vh;background:var(--aCol);cursor:pointer;height:10vh} - - -Loading... -)====="; - -//body0 (svg defs) -const char PAGE_index2[] PROGMEM = R"=====( - - -//Linearicons.com/free - - - - - - - - - - - - - - - -)====="; - -//body1 (html) -const char PAGE_index3[] PROGMEM = R"=====( -
- - - - - - -
-
-
-
-
-
-
-
-
-Effect Panel

- - - -

-

-Set secondary color to - - - - - -or
-
FastLED Palette

-
-
-
-Favorite Presets

- - - - -


-Click checkmark to apply brightness, color and effects.

-Cycle through presets to , keep each for ms:

-
-Timed Light

-

-Gradually dim down
-1st slider sets duration (1-255min), 2nd sets target brightness.
-
-
-
- -)====="; From 6359a8a8a253f407ebffbd41fc75beda6dc5c66a Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sat, 24 Nov 2018 11:52:23 +0100 Subject: [PATCH 27/33] Improved effect updating internals --- wled00/WS2812FX.cpp | 21 ++++++++++++++++++++- wled00/WS2812FX.h | 5 +++++ wled00/wled00.ino | 2 +- wled00/wled01_eeprom.ino | 20 +++++++++++--------- wled00/wled03_set.ino | 28 ++++------------------------ wled00/wled05_init.ino | 3 +++ wled00/wled07_notify.ino | 36 +++++++++++++----------------------- wled00/wled08_led.ino | 14 +++++++++++--- wled00/wled16_blynk.ino | 9 +++------ 9 files changed, 71 insertions(+), 67 deletions(-) diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index 8a2635612..6465d0fb5 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -110,6 +110,14 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) if (_locked[i] && !modeUsesLock(SEGMENT.mode)) return; if (_reverseMode) i = _length - 1 -i; if (IS_REVERSE) i = SEGMENT.stop - (i - SEGMENT.start); //reverse just individual segment + byte tmpg = g; + switch (colorOrder) //0 = Grb, default + { + case 0: break; //0 = Grb, default + case 1: g = r; r = tmpg; break; //1 = Rgb, common for WS2811 + case 2: g = b; b = tmpg; break; //2 = Brg + case 3: g = b; b = r; r = tmpg; //3 = Rbg + } if (!_cronixieMode) { if (_skipFirstMode) {i++;if(i==1)bus->SetPixelColor(i, RgbwColor(0,0,0,0));} @@ -185,7 +193,8 @@ void WS2812FX::trigger() { void WS2812FX::setMode(uint8_t m) { RESET_RUNTIME; bool ua = modeUsesLock(_segments[0].mode) && !modeUsesLock(m); - _segments[0].mode = constrain(m, 0, MODE_COUNT - 1); + if (m > MODE_COUNT - 1) m = MODE_COUNT - 1; + _segments[0].mode = m; if (ua) unlockAll(); setBrightness(_brightness); } @@ -204,6 +213,16 @@ void WS2812FX::setPalette(uint8_t p) { _segments[0].palette = p; } +bool WS2812FX::setEffectConfig(uint8_t m, uint8_t s, uint8_t i, uint8_t p) { + bool changed = false; + m = constrain(m, 0, MODE_COUNT - 1); + if (m != _segments[0].mode) { setMode(m); changed = true; } + if (s != _segments[0].speed) { setSpeed(s); changed = true; } + if (i != _segments[0].intensity) { setIntensity(i); changed = true; } + if (p != _segments[0].palette) { setPalette(p); changed = true; } + return changed; +} + void WS2812FX::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { setColor(((uint32_t)w << 24) |((uint32_t)r << 16) | ((uint32_t)g << 8) | b); } diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index fd76fafa4..0a2cd2bcb 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -278,6 +278,7 @@ class WS2812FX { _segments[0].speed = DEFAULT_SPEED; _reverseMode = false; _skipFirstMode = false; + colorOrder = 0; paletteFade = 0; paletteBlend = 0; _locked = NULL; @@ -323,9 +324,13 @@ class WS2812FX { setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), show(void); + bool + setEffectConfig(uint8_t m, uint8_t s, uint8_t i, uint8_t p); + uint8_t paletteFade, paletteBlend, + colorOrder, getBrightness(void), getMode(void), getSpeed(void), diff --git a/wled00/wled00.ino b/wled00/wled00.ino index 649fbcce4..1e986d48c 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -74,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811221 +#define VERSION 1811241 char versionString[] = "0.8.2-dev"; diff --git a/wled00/wled01_eeprom.ino b/wled00/wled01_eeprom.ino index 56a0bc138..3edcf2e06 100644 --- a/wled00/wled01_eeprom.ino +++ b/wled00/wled01_eeprom.ino @@ -18,6 +18,7 @@ //8 -> 0.8.0-a and up //9 -> 0.8.0 + /* * Erase all configuration data */ @@ -30,6 +31,7 @@ void clearEEPROM() EEPROM.commit(); } + void writeStringToEEPROM(uint16_t pos, char* str, uint16_t len) { for (int i = 0; i < len; ++i) @@ -39,6 +41,7 @@ void writeStringToEEPROM(uint16_t pos, char* str, uint16_t len) } } + void readStringFromEEPROM(uint16_t pos, char* str, uint16_t len) { for (int i = 0; i < len; ++i) @@ -49,6 +52,7 @@ void readStringFromEEPROM(uint16_t pos, char* str, uint16_t len) str[len] = 0; //make sure every string is properly terminated. str must be at least len +1 big. } + /* * Write configuration to flash */ @@ -251,6 +255,7 @@ void saveSettingsToEEPROM() commit(); } + /* * Read all configuration from flash */ @@ -498,13 +503,10 @@ void loadSettingsFromEEPROM(bool first) useHSB = useHSBDefault; - strip.setMode(effectCurrent); - strip.setSpeed(effectSpeed); - strip.setIntensity(effectIntensity); - strip.setPalette(effectPalette); overlayCurrent = overlayDefault; } + //PRESET PROTOCOL 20 bytes //0: preset purpose byte 0:invalid 1:valid preset 1.0 //1:a 2:r 3:g 4:b 5:w 6:er 7:eg 8:eb 9:ew 10:fx 11:sx | custom chase 12:numP 13:numS 14:(0:fs 1:both 2:fe) 15:step 16:ix 17: fp 18-19:Zeros @@ -533,15 +535,10 @@ bool applyPreset(byte index, bool loadBri = true, bool loadCol = true, bool load } if (loadFX) { - byte lastfx = effectCurrent; effectCurrent = EEPROM.read(i+10); effectSpeed = EEPROM.read(i+11); effectIntensity = EEPROM.read(i+16); effectPalette = EEPROM.read(i+17); - if (lastfx != effectCurrent) strip.setMode(effectCurrent); - strip.setSpeed(effectSpeed); - strip.setIntensity(effectIntensity); - strip.setPalette(effectPalette); } return true; } @@ -569,6 +566,7 @@ void savePreset(byte index) commit(); } + String loadMacro(byte index) { index-=1; @@ -582,6 +580,7 @@ String loadMacro(byte index) return m; } + void applyMacro(byte index) { index-=1; @@ -600,6 +599,7 @@ void applyMacro(byte index) handleSet(mc); } + void saveMacro(byte index, String mc, bool sing=true) //only commit on single save, not in settings { index-=1; @@ -612,9 +612,11 @@ void saveMacro(byte index, String mc, bool sing=true) //only commit on single sa if (sing) commit(); } + void commit() { DEBUG_PRINT("s"); + //this is to support IR on ESP32, needs work /*#ifdef ARDUINO_ARCH_ESP32 portMUX_TYPE mMux = portMUX_INITIALIZER_UNLOCKED; portENTER_CRITICAL(&mMux); diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index 0c24fa208..48c54508e 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -311,7 +311,6 @@ void handleSettingsSet(byte subPage) bool handleSet(String req) { - bool effectUpdated = false; if (!(req.indexOf("win") >= 0)) return false; int pos = 0; @@ -464,8 +463,6 @@ bool handleSet(String req) if (effectCurrent != req.substring(pos + 3).toInt()) { effectCurrent = req.substring(pos + 3).toInt(); - strip.setMode(effectCurrent); - effectUpdated = true; } } //set effect speed @@ -474,8 +471,6 @@ bool handleSet(String req) if (effectSpeed != req.substring(pos + 3).toInt()) { effectSpeed = req.substring(pos + 3).toInt(); - strip.setSpeed(effectSpeed); - effectUpdated = true; } } //set effect intensity @@ -484,8 +479,6 @@ bool handleSet(String req) if (effectIntensity != req.substring(pos + 3).toInt()) { effectIntensity = req.substring(pos + 3).toInt(); - strip.setIntensity(effectIntensity); - effectUpdated = true; } } //set effect palette (only for FastLED effects) @@ -494,8 +487,6 @@ bool handleSet(String req) if (effectPalette != req.substring(pos + 3).toInt()) { effectPalette = req.substring(pos + 3).toInt(); - strip.setPalette(effectPalette); - effectUpdated = true; } } @@ -697,7 +688,6 @@ bool handleSet(String req) pos = req.indexOf("PL="); //applies entire preset if (pos > 0) { applyPreset(req.substring(pos + 3).toInt(), presetApplyBri, presetApplyCol, presetApplyFx); - if (presetApplyFx) effectUpdated = true; } //cronixie @@ -738,19 +728,9 @@ bool handleSet(String req) //internal call, does not send XML response pos = req.indexOf("IN"); if (pos < 1) XML_response(true, (req.indexOf("IT") > 0)); //include theme if firstload - //do not send UDP notifications this time - pos = req.indexOf("NN"); - if (pos > 0) - { - colorUpdated(5); - return true; - } - if (effectUpdated) - { - colorUpdated(6); - } else - { - colorUpdated(1); - } + + pos = req.indexOf("NN"); //do not send UDP notifications this time + colorUpdated((pos > 0) ? 5:1); + return true; } diff --git a/wled00/wled05_init.ino b/wled00/wled05_init.ino index d6b2f7327..cdf02c811 100644 --- a/wled00/wled05_init.ino +++ b/wled00/wled05_init.ino @@ -125,6 +125,7 @@ void wledInit() Serial.println("Ada"); } + void initStrip() { // Initialize NeoPixel Strip and button @@ -142,6 +143,7 @@ void initStrip() if(digitalRead(BTNPIN) == LOW) buttonEnabled = false; } + void initAP(){ bool set = apSSID[0]; if (!set) strcpy(apSSID,"WLED-AP"); @@ -149,6 +151,7 @@ void initAP(){ if (!set) apSSID[0] = 0; } + void initCon() { WiFi.disconnect(); //close old connections diff --git a/wled00/wled07_notify.ino b/wled00/wled07_notify.ino index 4e1e01f89..958f8a593 100644 --- a/wled00/wled07_notify.ino +++ b/wled00/wled07_notify.ino @@ -5,6 +5,7 @@ #define WLEDPACKETSIZE 24 #define UDP_IN_MAXSIZE 1472 + void notify(byte callMode, bool followUp=false) { if (!udpConnected) return; @@ -53,6 +54,7 @@ void notify(byte callMode, bool followUp=false) notificationTwoRequired = (followUp)? false:notifyTwice; } + void arlsLock(uint32_t timeoutMs) { if (!realtimeActive){ @@ -60,13 +62,14 @@ void arlsLock(uint32_t timeoutMs) { strip.setPixelColor(i,0,0,0,0); } - strip.setMode(0); + strip.unlockAll(); } realtimeActive = true; realtimeTimeout = millis() + timeoutMs; if (arlsForceMaxBri) strip.setBrightness(255); } + void initE131(){ if (WiFi.status() == WL_CONNECTED && e131Enabled) { @@ -77,6 +80,7 @@ void initE131(){ } } + void handleE131(){ //E1.31 protocol support if(e131Enabled) { @@ -98,6 +102,7 @@ void handleE131(){ } } + void handleNotifications() { //send second notification if enabled @@ -110,10 +115,10 @@ void handleNotifications() //unlock strip when realtime UDP times out if (realtimeActive && millis() > realtimeTimeout) { - strip.unlockAll(); + //strip.unlockAll(); strip.setBrightness(bri); realtimeActive = false; - strip.setMode(effectCurrent); + //strip.setMode(effectCurrent); realtimeIP[0] = 0; } @@ -176,26 +181,10 @@ void handleNotifications() //apply effects from notification if (receiveNotificationEffects) { - if (udpIn[8] != effectCurrent) - { - effectCurrent = udpIn[8]; - strip.setMode(effectCurrent); - } - if (udpIn[9] != effectSpeed) - { - effectSpeed = udpIn[9]; - strip.setSpeed(effectSpeed); - } - if (udpIn[11] > 2 && udpIn[16] != effectIntensity) - { - effectIntensity = udpIn[16]; - strip.setIntensity(effectIntensity); - } - if (udpIn[11] > 4 && udpIn[19] != effectPalette) - { - effectPalette = udpIn[19]; - strip.setPalette(effectPalette); - } + effectCurrent = udpIn[8]; + effectSpeed = udpIn[9]; + if (udpIn[11] > 2) effectIntensity = udpIn[16]; + if (udpIn[11] > 4) effectPalette = udpIn[19]; } if (udpIn[11] > 3) @@ -261,6 +250,7 @@ void handleNotifications() } } + void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w) { uint16_t pix = i + arlsOffset; diff --git a/wled00/wled08_led.ino b/wled00/wled08_led.ino index d7ebfb49a..ffda2762e 100644 --- a/wled00/wled08_led.ino +++ b/wled00/wled08_led.ino @@ -14,6 +14,7 @@ void toggleOnOff() } } + void setAllLeds() { if (!realtimeActive || !arlsForceMaxBri) { @@ -50,6 +51,7 @@ void setAllLeds() { } } + void setLedsStandard() { for (byte i = 0; i<3; i++) @@ -68,6 +70,7 @@ void setLedsStandard() setAllLeds(); } + bool colorChanged() { for (int i = 0; i < 3; i++) @@ -80,17 +83,19 @@ bool colorChanged() return false; } + void colorUpdated(int callMode) { - //call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (NN)6: fx changed 7: hue 8: preset cycle 9: blynk + //call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (No notification) + // 6: fx changed 7: hue 8: preset cycle 9: blynk + bool fxChanged = strip.setEffectConfig(effectCurrent, effectSpeed, effectIntensity, effectPalette); if (!colorChanged()) { if (nightlightActive && !nightlightActiveOld && callMode != 3 && callMode != 5) { notify(4); return; } - if (callMode == 2) notify(2); - else if (callMode == 6) notify(6); + else if (fxChanged) notify(6); return; //no change } if (callMode != 5 && nightlightActive && nightlightFade) @@ -150,6 +155,7 @@ void colorUpdated(int callMode) updateInterfaces(callMode); } + void updateInterfaces(uint8_t callMode) { if (callMode != 9 && callMode != 5) updateBlynk(); @@ -157,6 +163,7 @@ void updateInterfaces(uint8_t callMode) lastInterfaceUpdate = millis(); } + void handleTransitions() { //handle still pending interface update @@ -197,6 +204,7 @@ void handleTransitions() } } + void handleNightlight() { if (nightlightActive) diff --git a/wled00/wled16_blynk.ino b/wled00/wled16_blynk.ino index da9641805..df070d097 100644 --- a/wled00/wled16_blynk.ino +++ b/wled00/wled16_blynk.ino @@ -66,22 +66,19 @@ BLYNK_WRITE(V3) BLYNK_WRITE(V4) { effectCurrent = param.asInt()-1;//fx - strip.setMode(effectCurrent); - colorUpdated(6); + colorUpdated(9); } BLYNK_WRITE(V5) { effectSpeed = param.asInt();//sx - strip.setSpeed(effectSpeed); - colorUpdated(6); + colorUpdated(9); } BLYNK_WRITE(V6) { effectIntensity = param.asInt();//ix - strip.setIntensity(effectIntensity); - colorUpdated(6); + colorUpdated(9); } BLYNK_WRITE(V7) From c4c2494dd1d81ed226701facedc861235b70a53c Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sun, 25 Nov 2018 00:00:02 +0100 Subject: [PATCH 28/33] Improved binary size --- wled00/wled03_set.ino | 93 +++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index 48c54508e..c0a662a78 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -309,6 +309,15 @@ void handleSettingsSet(byte subPage) if (subPage == 2) strip.init(useRGBW,ledCount,skipFirstLed); } + +//helper to get int value at a position in string +int getNumVal(String* req, uint16_t pos) +{ + return req->substring(pos + 3).toInt(); +} + + +//HTTP API request parser bool handleSet(String req) { if (!(req.indexOf("win") >= 0)) return false; @@ -338,17 +347,17 @@ bool handleSet(String req) //set brigthness pos = req.indexOf("&A="); if (pos > 0) { - bri = req.substring(pos + 3).toInt(); + bri = getNumVal(&req, pos); } //set hue pos = req.indexOf("HU="); if (pos > 0) { - uint16_t temphue = req.substring(pos + 3).toInt(); + uint16_t temphue = getNumVal(&req, pos); byte tempsat = 255; pos = req.indexOf("SA="); if (pos > 0) { - tempsat = req.substring(pos + 3).toInt(); + tempsat = getNumVal(&req, pos); } colorHStoRGB(temphue,tempsat,(req.indexOf("H2")>0)? colSec:col); } @@ -356,43 +365,43 @@ bool handleSet(String req) //set red value pos = req.indexOf("&R="); if (pos > 0) { - col[0] = req.substring(pos + 3).toInt(); + col[0] = getNumVal(&req, pos); } //set green value pos = req.indexOf("&G="); if (pos > 0) { - col[1] = req.substring(pos + 3).toInt(); + col[1] = getNumVal(&req, pos); } //set blue value pos = req.indexOf("&B="); if (pos > 0) { - col[2] = req.substring(pos + 3).toInt(); + col[2] = getNumVal(&req, pos); } //set white value pos = req.indexOf("&W="); if (pos > 0) { - white = req.substring(pos + 3).toInt(); + white = getNumVal(&req, pos); } //set 2nd red value pos = req.indexOf("R2="); if (pos > 0) { - colSec[0] = req.substring(pos + 3).toInt(); + colSec[0] = getNumVal(&req, pos); } //set 2nd green value pos = req.indexOf("G2="); if (pos > 0) { - colSec[1] = req.substring(pos + 3).toInt(); + colSec[1] = getNumVal(&req, pos); } //set 2nd blue value pos = req.indexOf("B2="); if (pos > 0) { - colSec[2] = req.substring(pos + 3).toInt(); + colSec[2] = getNumVal(&req, pos); } //set 2nd white value pos = req.indexOf("W2="); if (pos > 0) { - whiteSec = req.substring(pos + 3).toInt(); + whiteSec = getNumVal(&req, pos); } //set color from HEX or 32bit DEC @@ -432,7 +441,7 @@ bool handleSet(String req) //set to random hue SR=0->1st SR=1->2nd pos = req.indexOf("SR"); if (pos > 0) { - _setRandomColor(req.substring(pos + 3).toInt()); + _setRandomColor(getNumVal(&req, pos)); } //set 2nd to 1st pos = req.indexOf("SP"); @@ -460,40 +469,28 @@ bool handleSet(String req) //set current effect index pos = req.indexOf("FX="); if (pos > 0) { - if (effectCurrent != req.substring(pos + 3).toInt()) - { - effectCurrent = req.substring(pos + 3).toInt(); - } + effectCurrent = getNumVal(&req, pos); } //set effect speed pos = req.indexOf("SX="); if (pos > 0) { - if (effectSpeed != req.substring(pos + 3).toInt()) - { - effectSpeed = req.substring(pos + 3).toInt(); - } + effectSpeed = getNumVal(&req, pos); } //set effect intensity pos = req.indexOf("IX="); if (pos > 0) { - if (effectIntensity != req.substring(pos + 3).toInt()) - { - effectIntensity = req.substring(pos + 3).toInt(); - } + effectIntensity = req.substring(pos + 3).toInt(); } //set effect palette (only for FastLED effects) pos = req.indexOf("FP="); if (pos > 0) { - if (effectPalette != req.substring(pos + 3).toInt()) - { - effectPalette = req.substring(pos + 3).toInt(); - } + effectPalette = req.substring(pos + 3).toInt(); } //set hue polling light: 0 -off pos = req.indexOf("HP="); if (pos > 0) { - int id = req.substring(pos + 3).toInt(); + int id = getNumVal(&req, pos); if (id > 0) { if (id < 100) huePollLightId = id; @@ -506,21 +503,21 @@ bool handleSet(String req) //set default control mode (0 - RGB, 1 - HSB) pos = req.indexOf("MD="); if (pos > 0) { - useHSB = req.substring(pos + 3).toInt(); + useHSB = getNumVal(&req, pos); } //set advanced overlay pos = req.indexOf("OL="); if (pos > 0) { - overlayCurrent = req.substring(pos + 3).toInt(); + overlayCurrent = getNumVal(&req, pos); strip.unlockAll(); } //(un)lock pixel (ranges) pos = req.indexOf("&L="); if (pos > 0){ - int index = req.substring(pos + 3).toInt(); + int index = getNumVal(&req, pos); pos = req.indexOf("L2="); if (pos > 0){ - int index2 = req.substring(pos + 3).toInt(); + int index2 = getNumVal(&req, pos); if (req.indexOf("UL") > 0) { strip.unlockRange(index, index2); @@ -543,7 +540,7 @@ bool handleSet(String req) //apply macro pos = req.indexOf("&M="); if (pos > 0) { - applyMacro(req.substring(pos + 3).toInt()); + applyMacro(getNumVal(&req, pos)); } //toggle send UDP direct notifications if (req.indexOf("SN=") > 0) @@ -577,7 +574,7 @@ bool handleSet(String req) bri = briT; } else { nightlightActive = true; - if (!aNlDef) nightlightDelayMins = req.substring(pos + 3).toInt(); + if (!aNlDef) nightlightDelayMins = getNumVal(&req, pos); nightlightStartTime = millis(); } } else if (aNlDef) @@ -589,7 +586,7 @@ bool handleSet(String req) //set nightlight target brightness pos = req.indexOf("NT="); if (pos > 0) { - nightlightTargetBri = req.substring(pos + 3).toInt(); + nightlightTargetBri = getNumVal(&req, pos); nightlightActiveOld = false; //re-init } @@ -608,20 +605,20 @@ bool handleSet(String req) //toggle general purpose output pos = req.indexOf("AX="); if (pos > 0) { - auxTime = req.substring(pos + 3).toInt(); + auxTime = getNumVal(&req, pos); auxActive = true; if (auxTime == 0) auxActive = false; } pos = req.indexOf("TT="); if (pos > 0) { - transitionDelay = req.substring(pos + 3).toInt(); + transitionDelay = getNumVal(&req, pos); } //main toggle on/off pos = req.indexOf("&T="); if (pos > 0) { nightlightActive = false; //always disable nightlight when toggling - switch (req.substring(pos + 3).toInt()) + switch (getNumVal(&req, pos)) { case 0: if (bri != 0){briLast = bri; bri = 0;} break; //off case 1: bri = briLast; break; //on @@ -634,22 +631,22 @@ bool handleSet(String req) //set time (unix timestamp) pos = req.indexOf("ST="); if (pos > 0) { - setTime(req.substring(pos+3).toInt()); + setTime(getNumVal(&req, pos)); } //set countdown goal (unix timestamp) pos = req.indexOf("CT="); if (pos > 0) { - countdownTime = req.substring(pos+3).toInt(); + countdownTime = getNumVal(&req, pos); if (countdownTime - now() > 0) countdownOverTriggered = false; } //set presets pos = req.indexOf("P1="); //sets first preset for cycle - if (pos > 0) presetCycleMin = req.substring(pos + 3).toInt(); + if (pos > 0) presetCycleMin = getNumVal(&req, pos); pos = req.indexOf("P2="); //sets last preset for cycle - if (pos > 0) presetCycleMax = req.substring(pos + 3).toInt(); + if (pos > 0) presetCycleMax = getNumVal(&req, pos); if (req.indexOf("CY=") > 0) //preset cycle { @@ -662,7 +659,7 @@ bool handleSet(String req) } pos = req.indexOf("PT="); //sets cycle time in ms if (pos > 0) { - int v = req.substring(pos + 3).toInt(); + int v = getNumVal(&req, pos); if (v > 49) presetCycleTime = v; } if (req.indexOf("PA=") > 0) //apply brightness from preset @@ -683,11 +680,11 @@ bool handleSet(String req) pos = req.indexOf("PS="); //saves current in preset if (pos > 0) { - savePreset(req.substring(pos + 3).toInt()); + savePreset(getNumVal(&req, pos)); } pos = req.indexOf("PL="); //applies entire preset if (pos > 0) { - applyPreset(req.substring(pos + 3).toInt(), presetApplyBri, presetApplyCol, presetApplyFx); + applyPreset(getNumVal(&req, pos), presetApplyBri, presetApplyCol, presetApplyFx); } //cronixie @@ -717,11 +714,11 @@ bool handleSet(String req) pos = req.indexOf("U0="); //user var 0 if (pos > 0) { - userVar0 = req.substring(pos + 3).toInt(); + userVar0 = getNumVal(&req, pos); } pos = req.indexOf("U1="); //user var 1 if (pos > 0) { - userVar1 = req.substring(pos + 3).toInt(); + userVar1 = getNumVal(&req, pos); } //you can add more if you need From a20d577f6c97d20b03c8715a65d5902d1aa8ee2d Mon Sep 17 00:00:00 2001 From: cschwinne Date: Wed, 28 Nov 2018 12:24:32 +0100 Subject: [PATCH 29/33] WS2812b Color Order changeable in settings Meteor effect can now use palettes --- wled00/NpbWrapper.h | 16 +++------- wled00/WS2812FX.cpp | 56 +++++++++++++++++++++++++--------- wled00/WS2812FX.h | 2 ++ wled00/data/settings_leds.htm | Bin 9734 -> 10124 bytes wled00/html_settings.h | 7 +++++ wled00/wled00.ino | 2 +- wled00/wled01_eeprom.ino | 2 ++ wled00/wled02_xml.ino | 1 + wled00/wled03_set.ino | 1 + 9 files changed, 60 insertions(+), 27 deletions(-) diff --git a/wled00/NpbWrapper.h b/wled00/NpbWrapper.h index 1bbe6d667..794f7ceb7 100644 --- a/wled00/NpbWrapper.h +++ b/wled00/NpbWrapper.h @@ -12,9 +12,6 @@ #define AUXPIN 15 //unused auxiliary output pin -//uncomment this if red and green are swapped -//#define SWAPRG - //automatically uses the right driver method for each platform #ifdef ARDUINO_ARCH_ESP32 @@ -36,14 +33,11 @@ #endif #endif -//handle swapping Red and Green automatically -#ifdef SWAPRG - #define PIXELFEATURE3 NeoRgbFeature - #define PIXELFEATURE4 NeoRgbwFeature -#else - #define PIXELFEATURE3 NeoGrbFeature - #define PIXELFEATURE4 NeoGrbwFeature -#endif + +//you can now change the color order in the web settings +#define PIXELFEATURE3 NeoGrbFeature +#define PIXELFEATURE4 NeoGrbwFeature + #include diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index 531f6d041..a04167732 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -93,7 +93,7 @@ void WS2812FX::clear() bool WS2812FX::modeUsesLock(uint8_t m) { - if (m == FX_MODE_FIRE_2012 || m == FX_MODE_COLORTWINKLE) return true; + if (m == FX_MODE_FIRE_2012 || m == FX_MODE_COLORTWINKLE || m == FX_MODE_METEOR) return true; return false; } @@ -241,6 +241,7 @@ void WS2812FX::setSecondaryColor(uint32_t c) { } void WS2812FX::setBrightness(uint8_t b) { + if (_brightness == b) return; _brightness = b; bus->SetBrightness(_brightness); show(); @@ -294,7 +295,15 @@ uint32_t WS2812FX::getPixelColor(uint16_t i) } } RgbwColor lColor = bus->GetPixelColorRgbw(i); - return lColor.W*16777216 + lColor.R*65536 + lColor.G*256 + lColor.B; + byte r = lColor.R, g = lColor.G, b = lColor.B; + switch (colorOrder) + { + case 0: break; //0 = Grb + case 1: r = lColor.G; g = lColor.R; break; //1 = Rgb, common for WS2811 + case 2: g = lColor.B; b = lColor.G; break; //2 = Brg + case 3: r = lColor.B; g = lColor.R; b = lColor.G; //3 = Rbg + } + return ( (lColor.W << 24) | (r << 16) | (g << 8) | (b) ); } WS2812FX::Segment WS2812FX::getSegment(void) { @@ -2157,8 +2166,11 @@ void WS2812FX::handle_palette(void) { bool singleSegmentMode = (_segment_index == _segment_index_palette_last); _segment_index_palette_last = _segment_index; + + byte paletteIndex = SEGMENT.palette; + if (SEGMENT.mode == FX_MODE_METEOR && SEGMENT.palette == 0) paletteIndex = 4; - switch (SEGMENT.palette) + switch (paletteIndex) { case 0: {//default palette. Differs depending on effect switch (SEGMENT.mode) @@ -2566,30 +2578,44 @@ uint16_t WS2812FX::mode_lake() { return 33; } -// meteor effect -// send a meteor from begining to to the end of the strip with a trail that randomly decay. -// adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain +// meteor effect +// send a meteor from begining to to the end of the strip with a trail that randomly decays. +// adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain uint16_t WS2812FX::mode_meteor() { - byte meteorSize=1+(256-SEGMENT.intensity)/16; - uint32_t led_offset = SEGMENT_RUNTIME.counter_mode_step; - uint16_t i = SEGMENT.start + led_offset; - byte meteorTrailDecay=SEGMENT.intensity; + byte meteorSize= 1+ SEGMENT_LENGTH / 10; + uint16_t in = SEGMENT.start + SEGMENT_RUNTIME.counter_mode_step; + + byte decayProb = 255 - SEGMENT.intensity; // fade all leds to colors[1] in LEDs one step for (uint16_t i = SEGMENT.start; i <= SEGMENT.stop; i++) { - if (random(10)>5) { - setPixelColor(i,color_blend(getPixelColor(i),SEGMENT.colors[1],meteorTrailDecay)); + if (random8() <= decayProb) + { + byte meteorTrailDecay = 128 + random8(127); + _locked[i] = scale8(_locked[i], meteorTrailDecay); + setPixelColor(i, color_from_palette(_locked[i], false, true, 255)); } } // draw meteor - for(int j = 0; j < meteorSize; j++) { - if( ( SEGMENT.start + j < SEGMENT.stop) ) { - setPixelColor(i+j, SEGMENT.colors[0]); + for(int j = 0; j < meteorSize; j++) { + uint16_t index = in + j; + if(in + j > SEGMENT.stop) { + index = SEGMENT.start + (in + j - SEGMENT.stop) -1; } + + _locked[index] = 240; + setPixelColor(index, color_from_palette(_locked[index], false, true, 255)); } SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) % (SEGMENT_LENGTH); return SPEED_FORMULA_L; } + +//smooth +//front ramping (maybe from get color +//50fps +//fade each led by a certain range (even ramp possible for sparkling) +//maybe dim to color[1] at end? +//_locked 0-15 bg-last 15-240 last-first 240-255 first-bg diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index a15652ce8..76e48e321 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -165,6 +165,8 @@ #define FX_MODE_COLORTWINKLE 74 #define FX_MODE_LAKE 75 #define FX_MODE_METEOR 76 +#define FX_MODE_SMOOTH_METEOR 77 +#define FX_MODE_RAILROAD_X 78 class WS2812FX { diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index 0573c494522ffdebe82f5558aac6f449c139ca15..a91ea5a9789b741970571eed0448b6763037a5a5 100644 GIT binary patch delta 114 zcmZqk>G9tn!Y}H~kk60<#6=7WU^0avm7!?zd_{FuX9j-;rO6AGw7Cr!lo;$7+!=xx uoF-3HvgS4f^MimQAig836Hvw-EMp9naRT$DC)X(}O}--~uvvxwkr)8M7#e~A delta 12 TcmeD2Z}Zt8!oPWzz$Y;PAYcUM diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 2ccebbf23..19437e2c1 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -96,6 +96,13 @@ const char PAGE_settings_leds1[] PROGMEM = R"=====(

LED setup

LED count:
LEDs are 4-channel type (RGBW):
+Color order: +

Apply preset at boot (0 uses defaults)
Turn on after power up/reset:
diff --git a/wled00/wled00.ino b/wled00/wled00.ino index 1e986d48c..202688375 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -74,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811241 +#define VERSION 1811253 char versionString[] = "0.8.2-dev"; diff --git a/wled00/wled01_eeprom.ino b/wled00/wled01_eeprom.ino index 3edcf2e06..66a127c5e 100644 --- a/wled00/wled01_eeprom.ino +++ b/wled00/wled01_eeprom.ino @@ -142,6 +142,7 @@ void saveSettingsToEEPROM() EEPROM.write(380, colSecS[2]); EEPROM.write(381, whiteSecS); EEPROM.write(382, strip.paletteBlend); + EEPROM.write(383, strip.colorOrder); EEPROM.write(385, irEnabled); @@ -452,6 +453,7 @@ void loadSettingsFromEEPROM(bool first) readStringFromEEPROM(2300, mqttServer, 32); readStringFromEEPROM(2333, mqttDeviceTopic, 32); readStringFromEEPROM(2366, mqttGroupTopic, 32); + strip.colorOrder = EEPROM.read(383); } receiveDirect = !EEPROM.read(2200); diff --git a/wled00/wled02_xml.ino b/wled00/wled02_xml.ino index 1730a6ef8..2fef1d72c 100644 --- a/wled00/wled02_xml.ino +++ b/wled00/wled02_xml.ino @@ -196,6 +196,7 @@ void getSettingsJS(byte subPage) sappend('v',"CB",colS[2]); sappend('v',"CA",briS); sappend('c',"EW",useRGBW); + sappend('i',"CO",strip.colorOrder); sappend('c',"AW",autoRGBtoRGBW); sappend('v',"CW",whiteS); sappend('v',"SR",colSecS[0]); diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index c0a662a78..0967aed73 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -60,6 +60,7 @@ void handleSettingsSet(byte subPage) if (ledCount > 600) ledCount = 600; #endif useRGBW = server.hasArg("EW"); + strip.colorOrder = server.arg("CO").toInt(); autoRGBtoRGBW = server.hasArg("AW"); //ignore settings and save current brightness, colors and fx as default From f6f8151150b1b3b87c6dc63d5b4d1d5f64bbf7f6 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Thu, 29 Nov 2018 21:46:05 +0100 Subject: [PATCH 30/33] Added meteor FX to web UI --- wled00/data/index.htm | 5 +- wled00/data/index_mobile.htm | 3 +- wled00/html_classic.h | 692 ++++++++++++------------- wled00/html_mobile.h | 942 +++++++++++++++++------------------ wled00/wled00.ino | 2 +- 5 files changed, 823 insertions(+), 821 deletions(-) diff --git a/wled00/data/index.htm b/wled00/data/index.htm index 9f9bff9bb..b40d90afe 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -204,10 +204,10 @@ function SwFX(s) { var n=Cf.TX.selectedIndex+s; - if (n==-1||n==76) return; + if (n==-1||n==77) return; Cf.TX.selectedIndex =n; if (n < 0) Cf.TX.selectedIndex = 0; - if (n > 75) Cf.TX.selectedIndex = 65; + if (n > 76) Cf.TX.selectedIndex = 65; GX(); } function TgHSB() @@ -673,6 +673,7 @@ +

Set secondary color to diff --git a/wled00/data/index_mobile.htm b/wled00/data/index_mobile.htm index 06200e8df..091d56668 100644 --- a/wled00/data/index_mobile.htm +++ b/wled00/data/index_mobile.htm @@ -434,7 +434,8 @@
  • Noise 16 3
  • Noise 16 4
  • Colortwinkle
  • -
  • Lake
  •   +
  • Lake
  • +
  • Meteor
  •  
  • Go to top
  •  

    FastLED Palette (Effects 56-73)

  • Default
  • diff --git a/wled00/html_classic.h b/wled00/html_classic.h index 4c94358f7..0146becb2 100644 --- a/wled00/html_classic.h +++ b/wled00/html_classic.h @@ -10,11 +10,11 @@ * 4. update length value */ -const uint16_t PAGE_index0_L = 11090; +const uint16_t PAGE_index0_L = 11102; const char PAGE_index0[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x08, 0x07, 0xb7, 0xee, 0x5b, 0x00, 0x03, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x20, 0x28, 0x35, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0xcc, 0x5a, + 0x1f, 0x8b, 0x08, 0x08, 0x64, 0x4e, 0x00, 0x5c, 0x00, 0x03, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x28, 0x36, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0xcc, 0x5a, 0x09, 0x6f, 0xdb, 0xc6, 0xb6, 0xfe, 0x2b, 0xac, 0x82, 0xb6, 0x52, 0x2d, 0xd2, 0xe4, 0x70, 0x97, 0x4c, 0x17, 0x89, 0xdb, 0x2c, 0x40, 0xe2, 0x1a, 0xb1, 0x6f, 0x9b, 0xa2, 0x28, 0x02, 0x8a, 0xa4, 0x2c, 0xc6, 0x14, 0xa9, 0x4b, 0x52, 0x5e, 0xea, 0xfa, 0xbf, 0xbf, 0xef, 0xcc, 0x0c, 0x25, 0x52, @@ -118,8 +118,8 @@ const char PAGE_index0[] PROGMEM = { 0x99, 0x97, 0xcf, 0xad, 0x3e, 0x30, 0xee, 0xc5, 0xd5, 0xd9, 0xf9, 0x99, 0x78, 0x09, 0xd5, 0x15, 0x7d, 0x55, 0x0f, 0xce, 0x02, 0xbd, 0x37, 0x6e, 0xbf, 0x5a, 0xd2, 0xc5, 0xab, 0x86, 0x35, 0x9d, 0xf5, 0x1e, 0x6c, 0x11, 0x4e, 0xaf, 0x5e, 0x7f, 0xea, 0xaf, 0x22, 0xf5, 0x01, 0x61, 0xf6, 0x42, - 0xca, 0xa2, 0x93, 0x20, 0x50, 0x8d, 0xbf, 0xff, 0xc6, 0x87, 0xeb, 0x34, 0xa1, 0xf7, 0xe0, 0xdb, - 0x8b, 0x09, 0x5f, 0x7d, 0x00, 0xd1, 0x1e, 0xa2, 0xea, 0x77, 0x44, 0x3d, 0x74, 0xed, 0x87, 0xc9, + 0xca, 0xa2, 0x93, 0x20, 0x50, 0x8d, 0xbf, 0xff, 0xc6, 0x87, 0xeb, 0x36, 0xa1, 0xf7, 0xe0, 0xdb, + 0x8b, 0x09, 0x5f, 0x7d, 0x00, 0xd1, 0x1e, 0xa2, 0xea, 0x77, 0x44, 0x3d, 0x74, 0x9d, 0x87, 0xc9, 0x8e, 0x7d, 0x47, 0x2d, 0x4b, 0x5b, 0xed, 0xb7, 0xa7, 0xaf, 0x84, 0xe2, 0xd1, 0x25, 0x25, 0x72, 0x7c, 0x0c, 0x7e, 0xe4, 0x6f, 0x09, 0x47, 0x78, 0x22, 0x3b, 0x70, 0x2d, 0xf1, 0x35, 0x9b, 0xa3, 0xd3, 0x6b, 0x69, 0x45, 0x51, 0x70, 0x72, 0x4a, 0x9a, 0xf1, 0x30, 0x7b, 0xfd, 0x5a, 0xda, 0x65, @@ -344,367 +344,367 @@ const char PAGE_index0[] PROGMEM = { 0x3a, 0x62, 0x82, 0x94, 0xbb, 0x83, 0xc2, 0xcd, 0x61, 0x49, 0x96, 0x12, 0x00, 0x61, 0x00, 0x85, 0x5b, 0xc3, 0xe6, 0x52, 0xf3, 0x4b, 0x88, 0xee, 0x32, 0x39, 0x90, 0x78, 0xea, 0x8a, 0xb0, 0x84, 0xb4, 0x40, 0xd7, 0x11, 0xc4, 0x77, 0x57, 0x76, 0x57, 0xc2, 0x02, 0x2a, 0xe3, 0xcc, 0xa4, 0x05, - 0x84, 0x39, 0xb8, 0x01, 0xfe, 0xa7, 0xb4, 0xab, 0xed, 0x6d, 0x1b, 0x57, 0xd6, 0x7f, 0x85, 0x38, - 0x17, 0x38, 0xc8, 0xe2, 0xae, 0x52, 0x91, 0x14, 0x29, 0x69, 0xd1, 0x35, 0xd0, 0x64, 0x6f, 0x5f, - 0x0e, 0xb6, 0x6d, 0x90, 0xe4, 0x9e, 0xed, 0xf9, 0x74, 0xa1, 0x28, 0x4a, 0x62, 0x54, 0xb1, 0x03, - 0xcb, 0x49, 0x9b, 0xfe, 0xfa, 0x3b, 0xcf, 0x0c, 0x65, 0x4b, 0x8a, 0x99, 0x7a, 0xdb, 0x0f, 0xb1, - 0x23, 0x8b, 0x1a, 0x92, 0x33, 0x9c, 0xe1, 0xcc, 0x33, 0x23, 0xc9, 0x2a, 0x66, 0x47, 0x26, 0x0c, - 0x50, 0x81, 0x1b, 0x61, 0x34, 0x61, 0x6c, 0xcc, 0x00, 0xc5, 0xdc, 0x08, 0x0b, 0x3c, 0x57, 0x23, - 0x76, 0xa8, 0x7e, 0x39, 0x24, 0xbd, 0x36, 0x88, 0x72, 0x24, 0xa3, 0xd3, 0x79, 0xcd, 0xf3, 0x0f, - 0xba, 0xa1, 0x82, 0x3a, 0x04, 0x6e, 0x8c, 0x7b, 0x14, 0x06, 0x88, 0x72, 0x08, 0x03, 0xb2, 0x64, - 0xc8, 0x80, 0x70, 0xd0, 0x2f, 0x07, 0x99, 0xb3, 0x1a, 0x32, 0x23, 0x7c, 0x8a, 0x09, 0x4b, 0xcb, - 0x44, 0xd4, 0x21, 0x30, 0x43, 0xd4, 0x21, 0xf0, 0x52, 0xe6, 0x1f, 0x94, 0x23, 0x30, 0x40, 0x94, - 0x43, 0x8d, 0x65, 0x23, 0x0c, 0x10, 0xe5, 0x50, 0x23, 0x75, 0xe8, 0xe7, 0x1f, 0x0e, 0x77, 0xc5, - 0xf8, 0xb0, 0x20, 0xde, 0x53, 0x40, 0x53, 0x7f, 0x7f, 0x11, 0x77, 0x71, 0x25, 0x8f, 0xcc, 0x33, - 0xba, 0x0e, 0xc4, 0x74, 0x65, 0x10, 0x47, 0xfd, 0x7d, 0x8b, 0xdf, 0xc5, 0x76, 0xeb, 0xfa, 0xbb, - 0x1e, 0x57, 0x17, 0x75, 0x97, 0xf7, 0x08, 0x20, 0x6e, 0x9a, 0x6a, 0xb5, 0x0f, 0x9c, 0x39, 0x02, - 0xe5, 0xb1, 0xb5, 0x32, 0x9c, 0x7e, 0xe8, 0x68, 0x4b, 0xd1, 0xbc, 0x46, 0xb0, 0x37, 0x01, 0x16, - 0x46, 0x04, 0x4d, 0x0d, 0x0a, 0xf2, 0xa6, 0xcd, 0x21, 0x36, 0x40, 0x20, 0xca, 0x05, 0xed, 0x08, + 0x84, 0x39, 0xb8, 0x01, 0xfe, 0xa7, 0xb4, 0xab, 0xed, 0x8d, 0x1b, 0xd7, 0xd5, 0x7f, 0x45, 0x38, + 0x17, 0x38, 0xc8, 0xe2, 0xae, 0x53, 0x4b, 0xb2, 0x64, 0x7b, 0xd1, 0x35, 0xd0, 0x64, 0x6f, 0x77, + 0x7b, 0xb0, 0x6d, 0x83, 0x24, 0xf7, 0x6c, 0xcf, 0xa7, 0x0b, 0xc7, 0x71, 0xd2, 0x41, 0x9d, 0x99, + 0x60, 0x3c, 0xe9, 0xdb, 0xaf, 0xbf, 0x7c, 0x48, 0x79, 0xc6, 0x76, 0x46, 0xe9, 0x6c, 0xfb, 0x21, + 0x33, 0xf1, 0x58, 0xa6, 0x24, 0x52, 0xa4, 0xc8, 0x87, 0xb4, 0x6d, 0x15, 0xb3, 0x23, 0x13, 0x06, + 0xa8, 0xc0, 0x8d, 0x30, 0x9a, 0x30, 0x36, 0x66, 0x80, 0x62, 0x6e, 0x84, 0x05, 0x9e, 0xab, 0x09, + 0x3b, 0xd4, 0xb0, 0x1c, 0x92, 0x41, 0x1b, 0x44, 0x39, 0x92, 0xc9, 0xe9, 0xbc, 0xe1, 0xf9, 0x07, + 0xdd, 0x50, 0x41, 0x1d, 0x02, 0x37, 0xa6, 0x3d, 0x0a, 0x03, 0x44, 0x39, 0x84, 0x01, 0x59, 0x32, + 0x66, 0x40, 0x38, 0x18, 0x96, 0x83, 0xcc, 0x59, 0x8d, 0x99, 0x11, 0x3e, 0xc5, 0x84, 0xa5, 0x65, + 0x22, 0xea, 0x10, 0x98, 0x21, 0xea, 0x10, 0x78, 0x29, 0xf3, 0x0f, 0xca, 0x11, 0x18, 0x20, 0xca, + 0xa1, 0xa6, 0xb2, 0x11, 0x06, 0x88, 0x72, 0xa8, 0x89, 0x3a, 0x0c, 0xf3, 0x0f, 0x87, 0xfb, 0x62, + 0x7c, 0x58, 0x10, 0xef, 0x29, 0xa0, 0x69, 0xbe, 0xbd, 0x88, 0xfb, 0xb8, 0x92, 0x47, 0xe6, 0x19, + 0x5d, 0x07, 0x62, 0xba, 0x32, 0x88, 0xa3, 0xf9, 0xb6, 0xc5, 0xef, 0x63, 0xbb, 0x75, 0xf3, 0x4d, + 0x8f, 0xab, 0x8f, 0xba, 0xcb, 0x07, 0x04, 0x10, 0xef, 0xdb, 0x7a, 0x7d, 0x08, 0x9c, 0x39, 0x01, + 0xe5, 0xb1, 0xb5, 0x32, 0x9c, 0x7e, 0xec, 0x68, 0x4b, 0xd1, 0xbc, 0x46, 0xb0, 0x37, 0x01, 0x16, + 0x46, 0x04, 0x4d, 0x0d, 0x0a, 0xf2, 0xa6, 0xcd, 0x31, 0x36, 0x40, 0x20, 0xca, 0x05, 0xed, 0x08, 0x82, 0x9b, 0x1b, 0x12, 0x97, 0x36, 0x70, 0x6a, 0x35, 0xc5, 0x1b, 0xcc, 0x3d, 0x9f, 0x91, 0x1b, 0x4c, 0x9b, 0x2b, 0x36, 0x4b, 0x04, 0xb6, 0xf8, 0xa6, 0x5d, 0xca, 0x23, 0xa0, 0x30, 0x0c, 0xf8, - 0xeb, 0x62, 0x63, 0x45, 0x2c, 0x85, 0xa5, 0x05, 0xed, 0x06, 0x74, 0x4d, 0xee, 0x10, 0xc7, 0x73, - 0xb0, 0x44, 0xfb, 0x42, 0x7f, 0x68, 0x2c, 0x8d, 0xaa, 0x60, 0x56, 0x67, 0xb2, 0x07, 0x68, 0x8a, + 0xeb, 0x62, 0x6b, 0x45, 0x2c, 0x85, 0xa5, 0x05, 0xed, 0x06, 0x74, 0x4d, 0xee, 0x10, 0xc7, 0x73, + 0xb0, 0x44, 0xfb, 0xc2, 0x70, 0x68, 0x2c, 0x8d, 0xaa, 0x60, 0x56, 0x67, 0xb2, 0x07, 0x68, 0x8a, 0x99, 0x1d, 0x22, 0x4c, 0xea, 0x0b, 0x4e, 0x07, 0x7d, 0x86, 0xff, 0xb1, 0x0c, 0x49, 0x0d, 0x31, 0x65, 0xcb, 0x60, 0x21, 0x14, 0x03, 0x5b, 0xbd, 0x43, 0x0c, 0xaa, 0xa1, 0x20, 0x25, 0x39, 0x5d, 0xb4, 0xab, 0x1a, 0xa7, 0xd9, 0x97, 0xc8, 0x59, 0x4f, 0x33, 0x32, 0x14, 0x19, 0x1c, 0x14, 0x8b, - 0x10, 0xde, 0x91, 0xaf, 0x49, 0xdb, 0x9a, 0x4f, 0xfb, 0x9d, 0x00, 0x08, 0x8c, 0x23, 0x97, 0x90, + 0x10, 0xde, 0x91, 0xaf, 0x49, 0xdb, 0x9a, 0x4f, 0x87, 0x9d, 0x00, 0x08, 0x8c, 0x23, 0x97, 0x90, 0x22, 0xd9, 0x60, 0xd2, 0x3d, 0x42, 0x80, 0x1c, 0x99, 0x82, 0xd0, 0x30, 0xf3, 0x82, 0x9b, 0x90, - 0x52, 0x64, 0xb9, 0xa2, 0xd0, 0xb9, 0x20, 0x7f, 0x3f, 0x74, 0x27, 0xbd, 0xa7, 0x9b, 0xc3, 0x30, - 0x8d, 0x54, 0x86, 0xde, 0x4f, 0x47, 0x0d, 0xa6, 0x43, 0xe7, 0x48, 0x5f, 0x10, 0x7b, 0xa2, 0x67, + 0x52, 0x64, 0xb9, 0xa2, 0xd0, 0xb9, 0x20, 0x7f, 0x3f, 0x74, 0x27, 0xbd, 0xa7, 0xdb, 0xc3, 0x30, + 0x8d, 0x54, 0x86, 0x3e, 0x4c, 0x47, 0x8d, 0xa6, 0x43, 0xe7, 0x48, 0x5f, 0x10, 0x7b, 0xa2, 0x67, 0x18, 0x01, 0x57, 0xb0, 0xeb, 0x2c, 0x3c, 0x51, 0x81, 0x27, 0x08, 0xfd, 0x91, 0xef, 0xf0, 0xa4, - 0xd5, 0x8e, 0xfc, 0x7e, 0xf8, 0x16, 0x70, 0x9d, 0x49, 0xb2, 0x99, 0xef, 0x99, 0xad, 0x7a, 0x66, + 0xd5, 0x8e, 0xfc, 0x7e, 0xf8, 0x16, 0x70, 0x9d, 0x49, 0xb2, 0x99, 0x1f, 0x98, 0xad, 0x06, 0x66, 0x6b, 0x58, 0x02, 0xb8, 0x6c, 0x29, 0x69, 0x29, 0xa7, 0x25, 0x52, 0x76, 0x1d, 0x80, 0x9e, 0xe7, - 0x30, 0x6b, 0x22, 0x49, 0xd5, 0x4b, 0xd2, 0xc2, 0xdf, 0x21, 0xdb, 0x8f, 0x58, 0x51, 0xa2, 0x08, - 0x5e, 0x0a, 0xb2, 0x2e, 0xe4, 0xe0, 0xdb, 0xfb, 0x30, 0x05, 0xe8, 0x47, 0xcd, 0x4b, 0xa3, 0x2c, + 0x30, 0x6b, 0x22, 0x49, 0x35, 0x48, 0xd2, 0xc2, 0xdf, 0x21, 0xdb, 0x8f, 0x58, 0x51, 0xa2, 0x08, + 0x5e, 0x0a, 0xb2, 0x2e, 0xe4, 0xe0, 0xeb, 0xeb, 0x30, 0x05, 0xe8, 0x47, 0xc3, 0x4b, 0xa3, 0x2c, 0xa0, 0x8e, 0x06, 0x0e, 0x1a, 0xfc, 0x37, 0xaf, 0xb3, 0x70, 0x20, 0x9f, 0xb0, 0x2f, 0x0e, 0x0b, 0x87, 0xa7, 0x6d, 0xc9, 0x49, 0x30, 0x70, 0x24, 0x68, 0xbf, 0x32, 0x48, 0x33, 0xd0, 0xef, 0x96, 0x86, 0x6b, 0x69, 0xca, 0x70, 0xdc, 0x28, 0x9a, 0x2e, 0x34, 0x87, 0xee, 0x64, 0x5d, 0x00, 0x06, - 0x91, 0x41, 0x3c, 0xf4, 0x8e, 0xb8, 0x44, 0x1e, 0x06, 0xfb, 0xe3, 0xc4, 0x17, 0x78, 0x79, 0x64, - 0x2b, 0x1d, 0x14, 0xa6, 0x3c, 0xb4, 0x05, 0x48, 0x5b, 0x40, 0x22, 0x40, 0xea, 0xc0, 0xbc, 0xd0, - 0x38, 0xe9, 0x1b, 0x53, 0xd8, 0x0c, 0x17, 0x1d, 0x71, 0xbd, 0x01, 0x7c, 0x2c, 0x1d, 0xd3, 0xfc, - 0x11, 0x05, 0x64, 0x9b, 0xe3, 0x7e, 0x20, 0x69, 0x3f, 0xaf, 0x84, 0xe7, 0xe3, 0x65, 0x3e, 0xa3, + 0x91, 0x41, 0x3c, 0xf6, 0x8e, 0xb8, 0x44, 0x1e, 0x06, 0xfb, 0xe3, 0xc4, 0x17, 0x78, 0x79, 0x64, + 0x2b, 0x1d, 0x14, 0xa6, 0x3c, 0xb6, 0x05, 0x48, 0x5b, 0x40, 0x22, 0x40, 0xea, 0xc0, 0xbc, 0xd0, + 0x38, 0x19, 0x1a, 0x53, 0xd8, 0x0c, 0x17, 0x1d, 0x71, 0xbd, 0x01, 0x7c, 0x2c, 0x1d, 0xd3, 0xfc, + 0x11, 0x05, 0x64, 0xdb, 0xe3, 0x61, 0x20, 0xe9, 0x30, 0xaf, 0x84, 0xe7, 0xe3, 0x65, 0x3e, 0x93, 0xcf, 0x22, 0x47, 0x06, 0x86, 0x37, 0x4c, 0xb2, 0x6f, 0xce, 0x23, 0x11, 0x92, 0x03, 0xd0, 0x2a, 0xad, 0xb0, 0xd8, 0x12, 0xeb, 0x4b, 0xb0, 0x14, 0x50, 0x1f, 0x39, 0x49, 0x00, 0x1e, 0x69, 0x54, 0x48, 0xab, 0x10, 0x01, 0x07, 0x20, 0x23, 0x13, 0xd8, 0x86, 0x8f, 0x28, 0xa0, 0x4c, 0x11, 0x68, - 0xc0, 0x53, 0x75, 0x3a, 0x9c, 0x4b, 0xe4, 0x5c, 0x8d, 0x7c, 0x4c, 0xe6, 0x3c, 0x12, 0x5a, 0x96, - 0x36, 0x5d, 0xe0, 0x31, 0x1a, 0x7d, 0x85, 0x3e, 0x42, 0x9f, 0xfd, 0xf1, 0x1e, 0x26, 0xa3, 0x5b, - 0x57, 0xab, 0x3d, 0x2c, 0x46, 0x4e, 0x84, 0x91, 0xa1, 0xd9, 0xda, 0x8c, 0xd4, 0xb1, 0xcd, 0x40, - 0xb8, 0xa7, 0x39, 0xb1, 0x44, 0x6b, 0xc3, 0x38, 0xf2, 0x2e, 0x11, 0x8e, 0xb4, 0xa4, 0x93, 0x25, - 0x7b, 0xaf, 0x48, 0x50, 0x95, 0xda, 0xf4, 0xc7, 0x2a, 0x1c, 0xc3, 0xa5, 0x01, 0xbd, 0x8c, 0x77, + 0xc0, 0x53, 0x75, 0x3a, 0x9c, 0x4b, 0xe4, 0x5c, 0x83, 0x7c, 0x4c, 0xe6, 0x3c, 0x12, 0x5a, 0x96, + 0x36, 0x5d, 0xe0, 0x31, 0x1a, 0x7d, 0x85, 0x3e, 0x42, 0x9f, 0xc3, 0xf1, 0x01, 0x26, 0xa3, 0xdf, + 0xd4, 0xeb, 0x03, 0x2c, 0x46, 0x4e, 0x84, 0x91, 0xa1, 0xd9, 0xd9, 0x8c, 0xd4, 0xb1, 0xcd, 0x40, + 0xb8, 0xa7, 0x39, 0xb1, 0x44, 0x6b, 0xc3, 0x38, 0xf2, 0x2e, 0x11, 0x8e, 0x74, 0xa4, 0x93, 0x25, + 0x7b, 0xaf, 0x48, 0x50, 0x95, 0xda, 0x0c, 0xc7, 0x2a, 0x1c, 0xc3, 0xa5, 0x01, 0xbd, 0x8c, 0x77, 0x7b, 0x62, 0xb1, 0xd6, 0x9c, 0x7e, 0x42, 0xc2, 0x22, 0x07, 0x7a, 0x42, 0x44, 0xbd, 0x06, 0x16, - 0x51, 0xd2, 0x2e, 0x45, 0x8b, 0x26, 0x67, 0xef, 0x3b, 0x45, 0x6f, 0xee, 0x10, 0x74, 0x89, 0x8f, - 0xc0, 0x27, 0x1c, 0x5d, 0x53, 0xb6, 0xa4, 0x95, 0x9c, 0xdb, 0x2a, 0x31, 0x30, 0xb0, 0x81, 0xda, - 0x50, 0xd0, 0x27, 0xdf, 0xae, 0xa6, 0xc8, 0x27, 0x27, 0x32, 0xf2, 0x59, 0xf2, 0x86, 0xa3, 0x71, - 0x00, 0x9c, 0xc4, 0xe4, 0xac, 0xe2, 0xa5, 0xce, 0x3a, 0x0d, 0xdb, 0x63, 0x04, 0x61, 0x33, 0x0c, - 0xce, 0x71, 0xc6, 0x2b, 0xb3, 0x45, 0x0b, 0xca, 0x98, 0x0e, 0x3a, 0x72, 0x50, 0x5b, 0x83, 0x93, - 0x26, 0x63, 0xe8, 0xb0, 0xce, 0xd8, 0xc9, 0x2e, 0x18, 0xd3, 0x83, 0x64, 0x19, 0x11, 0x86, 0xad, - 0x21, 0x66, 0x61, 0x2a, 0x7c, 0xd4, 0x69, 0x58, 0x58, 0x43, 0xae, 0x09, 0xd4, 0x56, 0x4e, 0x29, - 0x39, 0xd5, 0x0a, 0x3d, 0x15, 0xe8, 0xa9, 0xd0, 0x9b, 0x92, 0xde, 0xea, 0x52, 0x82, 0x38, 0x72, - 0xb2, 0x79, 0x8d, 0x98, 0x0c, 0x91, 0xbd, 0x85, 0x6f, 0x86, 0x21, 0x8a, 0x73, 0x5d, 0x74, 0x02, - 0x73, 0x81, 0x95, 0xd6, 0xca, 0xbc, 0x94, 0xcc, 0xab, 0xed, 0xf9, 0xa1, 0x02, 0x3f, 0x94, 0xb0, - 0x4b, 0x05, 0x76, 0xd5, 0x60, 0x35, 0x90, 0x2b, 0x00, 0x75, 0xac, 0xdf, 0x50, 0x25, 0x78, 0x76, + 0x51, 0xd2, 0x2e, 0x45, 0x8b, 0x26, 0x67, 0xef, 0x3b, 0x45, 0x6f, 0xee, 0x18, 0x74, 0x89, 0x8f, + 0xc0, 0x27, 0x1c, 0x5d, 0x53, 0x76, 0xa4, 0x95, 0x9c, 0xdb, 0x2a, 0x31, 0x30, 0xb0, 0x81, 0xda, + 0x50, 0xd0, 0x27, 0xdf, 0xae, 0xa1, 0xc8, 0x27, 0x27, 0x32, 0xf2, 0x59, 0xf2, 0x86, 0xa3, 0x71, + 0x00, 0x9c, 0xc4, 0xe4, 0xac, 0xe2, 0xa5, 0xce, 0x7a, 0x0d, 0xdb, 0x63, 0x04, 0x61, 0x33, 0x0c, + 0xce, 0x71, 0xc6, 0x2b, 0xb3, 0x45, 0x07, 0xca, 0x98, 0x0e, 0x3a, 0x72, 0x50, 0x5b, 0x83, 0x93, + 0x26, 0x63, 0xe8, 0xb0, 0xc9, 0xd8, 0xc9, 0x2e, 0x18, 0xd3, 0x83, 0x64, 0x19, 0x11, 0x86, 0xad, + 0x21, 0x66, 0x61, 0x2a, 0x7c, 0xd4, 0x6b, 0x58, 0x58, 0x43, 0xae, 0x09, 0xd4, 0x56, 0x4e, 0x29, + 0x39, 0xd5, 0x09, 0x3d, 0x15, 0xe8, 0xa9, 0xd0, 0x9b, 0x92, 0xde, 0x9a, 0x52, 0x82, 0x38, 0x72, + 0xb2, 0x79, 0x8d, 0x98, 0x0c, 0x91, 0xbd, 0x85, 0x6f, 0x86, 0x21, 0x8a, 0x73, 0x5d, 0xf4, 0x02, + 0x73, 0x81, 0x95, 0xd6, 0xca, 0xbc, 0x94, 0xcc, 0xab, 0x1b, 0xf8, 0xa1, 0x02, 0x3f, 0x94, 0xb0, + 0x4b, 0x05, 0x76, 0x35, 0x60, 0x35, 0x90, 0x2b, 0x00, 0x75, 0xac, 0xdf, 0x50, 0x25, 0x78, 0x76, 0xcc, 0x63, 0x25, 0x3c, 0x26, 0x99, 0x67, 0x1a, 0x71, 0xb8, 0x66, 0x94, 0xc1, 0x53, 0x80, 0x42, 0xa6, 0xc4, 0x32, 0x44, 0x42, 0x6a, 0xc7, 0xff, 0xcb, 0x2e, 0x09, 0x4c, 0x1c, 0x21, 0x08, 0x92, 0x37, 0x05, 0xfc, 0x7e, 0x1a, 0x3a, 0xab, 0x1e, 0x16, 0x08, 0x53, 0xa0, 0x05, 0x02, 0x83, 0x93, 0x01, 0xb9, 0x34, 0x58, 0x43, 0x1e, 0x48, 0x80, 0x73, 0x90, 0x84, 0x43, 0x9c, 0x43, 0xe6, 0xe4, - 0xd0, 0x4a, 0xf0, 0x45, 0x4d, 0x60, 0x2a, 0x20, 0x30, 0xec, 0x9c, 0x39, 0x22, 0x3a, 0xe2, 0x16, - 0x05, 0x52, 0xad, 0x86, 0xfd, 0xe5, 0x14, 0xa0, 0x7c, 0x1b, 0x18, 0x4a, 0xab, 0x81, 0x33, 0xd3, + 0xd8, 0x4a, 0xf0, 0x45, 0x4d, 0x60, 0x2a, 0x20, 0x30, 0xec, 0x9c, 0x39, 0x22, 0x3a, 0xe2, 0x16, + 0x05, 0x52, 0x9d, 0x86, 0xfd, 0xe5, 0x14, 0xa0, 0x7c, 0x1b, 0x18, 0x4a, 0xab, 0x81, 0x33, 0xd3, 0x42, 0xc1, 0x12, 0x4b, 0x8b, 0x14, 0x94, 0x32, 0x06, 0x63, 0xe1, 0x6f, 0x12, 0x91, 0x9c, 0x3d, - 0x68, 0x0f, 0xef, 0x1a, 0x21, 0x63, 0xcb, 0x80, 0x21, 0xad, 0x77, 0x52, 0xad, 0x14, 0xcb, 0xba, - 0x3f, 0x56, 0xe1, 0x18, 0xe1, 0x8d, 0xe7, 0x9e, 0x2d, 0xfa, 0x4a, 0xc1, 0x2c, 0x8e, 0xab, 0x0b, - 0xa1, 0xa3, 0x7a, 0x3a, 0xa1, 0x7b, 0x25, 0xdd, 0x2b, 0x19, 0x55, 0x16, 0xbe, 0x7d, 0xed, 0x82, + 0x68, 0x0f, 0xef, 0x1a, 0x21, 0x63, 0xc7, 0x80, 0x21, 0xad, 0x77, 0x52, 0xad, 0x14, 0xcb, 0x7a, + 0x38, 0x56, 0xe1, 0x18, 0xe1, 0x8d, 0xe7, 0x9e, 0x2d, 0xfa, 0x4a, 0xc1, 0x2c, 0x8e, 0xab, 0x0b, + 0xa1, 0xa3, 0x06, 0x3a, 0xa1, 0x7b, 0x25, 0xdd, 0x2b, 0x19, 0x55, 0x16, 0xbe, 0x7d, 0xe3, 0x82, 0x63, 0x0a, 0xbc, 0x96, 0x56, 0x02, 0x39, 0x95, 0x2c, 0x7c, 0xc7, 0x53, 0x52, 0x61, 0x4a, 0x81, - 0x0f, 0x2a, 0xf0, 0x41, 0x09, 0x9b, 0x80, 0x11, 0x30, 0x9b, 0x6a, 0xea, 0xca, 0x20, 0x76, 0x4f, - 0x0b, 0x10, 0x41, 0x50, 0xcd, 0xec, 0x0c, 0xbc, 0x95, 0x83, 0x7d, 0x90, 0xc6, 0xd5, 0xb2, 0xeb, - 0xf6, 0xc9, 0x17, 0x64, 0xe2, 0x9e, 0x3a, 0x4b, 0x96, 0xae, 0x35, 0x05, 0xad, 0x9b, 0x12, 0x68, + 0x0f, 0x2a, 0xf0, 0x41, 0x09, 0x9b, 0x80, 0x11, 0x30, 0x9b, 0x1a, 0xea, 0xca, 0x20, 0x76, 0x4f, + 0x0b, 0x10, 0x41, 0x50, 0xcd, 0xec, 0x0c, 0xbc, 0x95, 0x83, 0x43, 0x90, 0xc6, 0xf5, 0xaa, 0xef, + 0x0f, 0xc9, 0x17, 0x64, 0xe2, 0x9e, 0x3a, 0x4b, 0x96, 0xae, 0x33, 0x05, 0xad, 0x9b, 0x12, 0x68, 0x2e, 0xbe, 0xb1, 0x2e, 0x81, 0x15, 0xf3, 0xa7, 0x92, 0xff, 0xe1, 0xda, 0xa5, 0xd8, 0x03, 0xac, - 0x67, 0x56, 0x96, 0x8c, 0x1e, 0xcb, 0xa7, 0x9c, 0x0b, 0x07, 0x7c, 0x9e, 0x36, 0xeb, 0x36, 0x10, - 0x03, 0xfe, 0x3d, 0x22, 0xde, 0xff, 0x5e, 0x27, 0xdb, 0x5e, 0x76, 0xd1, 0x80, 0x15, 0xe2, 0x43, - 0x35, 0x68, 0xa7, 0xfa, 0x71, 0x28, 0x69, 0xd3, 0x8e, 0x3b, 0x29, 0xa6, 0x9d, 0xd6, 0x03, 0x12, - 0xf9, 0x4e, 0x12, 0xc4, 0x02, 0x5a, 0xe2, 0x98, 0xa8, 0x26, 0x3d, 0x84, 0xcc, 0xb2, 0x92, 0xb3, - 0x0a, 0x58, 0x28, 0x7c, 0xd0, 0x69, 0x2b, 0xab, 0x88, 0xb3, 0xde, 0x72, 0x26, 0xc1, 0x99, 0xb2, - 0x1d, 0xf7, 0x5a, 0xa8, 0x69, 0xef, 0x42, 0x78, 0x4b, 0x9e, 0x5c, 0x90, 0x01, 0x7d, 0x1d, 0xa5, - 0xaf, 0x85, 0x7e, 0x3d, 0x9c, 0xf9, 0x2e, 0x39, 0xd8, 0x76, 0xc2, 0xd5, 0x62, 0x8f, 0x25, 0x52, - 0xad, 0x56, 0xcb, 0x2f, 0x5c, 0x24, 0x9c, 0xd4, 0xf3, 0x55, 0xdd, 0x36, 0x7b, 0x2c, 0x97, 0x80, - 0x9d, 0x73, 0xca, 0x83, 0x54, 0xa6, 0x1e, 0x60, 0xe8, 0xc8, 0x70, 0x8c, 0xc1, 0x73, 0x15, 0xc0, - 0xf3, 0xfe, 0xb8, 0x0b, 0x80, 0xbc, 0x62, 0x40, 0xde, 0x85, 0xd3, 0x28, 0x2f, 0x90, 0xe6, 0xfd, - 0xb7, 0x90, 0xd9, 0x1e, 0xf7, 0xc0, 0x7d, 0xb8, 0x4c, 0xa8, 0x94, 0x4f, 0x7a, 0x19, 0x5f, 0x66, - 0x92, 0x31, 0x79, 0x93, 0xf4, 0xd7, 0x8d, 0xd2, 0x01, 0xc5, 0x26, 0x1d, 0xb0, 0x69, 0x36, 0x9a, - 0x84, 0xd9, 0x64, 0x00, 0xc2, 0x65, 0xfd, 0x1c, 0x26, 0xbd, 0x7c, 0x1b, 0xb9, 0xdc, 0x21, 0x93, - 0x94, 0x4a, 0xe2, 0x28, 0x19, 0x66, 0x94, 0x12, 0xfe, 0xec, 0xc2, 0x6f, 0xc9, 0xe0, 0x37, 0xf9, - 0x24, 0x07, 0x20, 0x5c, 0x2c, 0xc7, 0x6a, 0xd8, 0x50, 0x48, 0x74, 0xb1, 0x0c, 0xd5, 0xae, 0x70, - 0x4a, 0xd3, 0xb0, 0x18, 0x3d, 0xd5, 0x0c, 0x01, 0xb6, 0x86, 0xfc, 0x43, 0xe2, 0x15, 0x3e, 0x79, - 0x59, 0xb9, 0xa0, 0xde, 0x03, 0xc5, 0x2b, 0x7a, 0x8d, 0x48, 0xd5, 0x56, 0xf5, 0xc3, 0xc2, 0x9b, - 0x6a, 0x0d, 0x19, 0x57, 0xe4, 0x79, 0xe0, 0x98, 0x7a, 0xe4, 0x0b, 0xfd, 0x8d, 0x33, 0x9c, 0x41, - 0xaa, 0xfb, 0xba, 0x80, 0x67, 0x4b, 0x0e, 0xa6, 0x05, 0x46, 0x37, 0x49, 0xb8, 0xbc, 0x0d, 0xe4, - 0x54, 0x20, 0x5f, 0x6f, 0x47, 0xe2, 0x76, 0x8f, 0x24, 0xc9, 0x78, 0x94, 0xfc, 0x99, 0xb0, 0x92, - 0xe5, 0xac, 0x57, 0x1e, 0x46, 0x1c, 0xca, 0xc8, 0x07, 0x5d, 0x32, 0xd4, 0xb2, 0x70, 0x2a, 0xc9, - 0x99, 0x35, 0xc9, 0x90, 0x37, 0xb4, 0x0f, 0x04, 0x2b, 0x44, 0xff, 0x70, 0x57, 0x46, 0xb4, 0x4d, - 0xff, 0x0d, 0xe5, 0xe2, 0x92, 0xf7, 0xfd, 0xb5, 0xab, 0x80, 0xcf, 0x8e, 0x78, 0x20, 0x68, 0x57, - 0x32, 0x52, 0xaf, 0x58, 0x6e, 0x6a, 0xa3, 0x5e, 0xc9, 0x58, 0xbf, 0x26, 0x0a, 0x90, 0x25, 0x13, - 0xfd, 0x9a, 0x28, 0x90, 0x57, 0x63, 0xfd, 0x9a, 0xa8, 0x5f, 0x31, 0x51, 0x4b, 0x33, 0x51, 0x5f, - 0xa3, 0xc6, 0xfa, 0x35, 0x51, 0x7e, 0xa3, 0x26, 0xfa, 0x35, 0x51, 0xa0, 0x22, 0x19, 0xeb, 0x57, - 0xf2, 0xac, 0x7e, 0x4d, 0x74, 0x64, 0x87, 0x32, 0x75, 0x4f, 0xd5, 0x26, 0xe8, 0xd7, 0x58, 0x37, - 0x77, 0x64, 0x7b, 0xbb, 0x1d, 0xfa, 0x1a, 0xd7, 0xaf, 0xbc, 0xf0, 0xbc, 0xba, 0x7a, 0xfd, 0x1a, - 0x2f, 0xa2, 0x81, 0x86, 0x0d, 0xb7, 0xb6, 0x62, 0xb3, 0x3d, 0x0e, 0x36, 0xd7, 0x3c, 0xd9, 0xad, - 0x61, 0x53, 0x05, 0xeb, 0x55, 0x64, 0x52, 0x7a, 0xa3, 0x06, 0xe5, 0x40, 0xdb, 0xb2, 0x84, 0x61, - 0x49, 0x8d, 0x68, 0x58, 0xaf, 0x60, 0xc9, 0x54, 0xc3, 0x06, 0x43, 0x71, 0xbb, 0x87, 0xa2, 0x06, - 0x2a, 0xa6, 0x86, 0x2a, 0xa6, 0x46, 0x2a, 0x36, 0xdd, 0xc7, 0xb6, 0x1a, 0x36, 0xe4, 0x4d, 0xaf, - 0x5f, 0xea, 0x87, 0xf4, 0x6b, 0xb5, 0xac, 0x3f, 0x37, 0xfb, 0x20, 0x21, 0x1e, 0x71, 0xa0, 0x92, - 0xe2, 0xc6, 0x24, 0xa7, 0x35, 0xc6, 0x05, 0x11, 0x48, 0x06, 0xb8, 0x9c, 0xb3, 0x8c, 0x9a, 0x33, - 0x44, 0x45, 0xb7, 0x3d, 0x54, 0xe1, 0x27, 0x7c, 0x2b, 0xf9, 0x59, 0xf5, 0x3f, 0x6f, 0x0f, 0xfb, - 0x16, 0xdf, 0x42, 0x17, 0x5c, 0x12, 0x34, 0x2a, 0x4a, 0x79, 0x52, 0x78, 0xd3, 0x4d, 0xcb, 0x6d, - 0x9e, 0xa9, 0x41, 0x79, 0x52, 0xbb, 0xc4, 0x1f, 0xbb, 0x56, 0x20, 0xa4, 0x8a, 0x64, 0x14, 0xd7, - 0x7c, 0x78, 0x2e, 0xb7, 0x4b, 0x39, 0xfc, 0xe4, 0xda, 0x09, 0xc4, 0x58, 0xec, 0x4b, 0x78, 0xf1, - 0x25, 0x10, 0x74, 0x52, 0x20, 0x25, 0x9f, 0x14, 0x05, 0x38, 0x27, 0x91, 0xa7, 0xa1, 0x18, 0xac, - 0x74, 0xec, 0x80, 0x91, 0xe7, 0x99, 0x17, 0x1c, 0x49, 0x19, 0xa4, 0x10, 0xb2, 0x82, 0x97, 0x08, - 0x08, 0x59, 0x23, 0x25, 0x7f, 0x06, 0x45, 0x89, 0xb0, 0x30, 0xfd, 0x71, 0x7e, 0x58, 0x00, 0x62, - 0x42, 0xe6, 0xa7, 0x44, 0x4d, 0x05, 0xca, 0x4d, 0x00, 0x72, 0x38, 0xef, 0x95, 0x75, 0x52, 0x22, - 0x92, 0x33, 0x0c, 0xd5, 0x7f, 0x91, 0x63, 0xad, 0xc9, 0xf1, 0xc9, 0xb8, 0x4c, 0xd3, 0xd2, 0x8a, - 0xa1, 0x95, 0x5a, 0x4a, 0x15, 0xa8, 0xa4, 0x52, 0x72, 0x8e, 0xba, 0x13, 0xe0, 0x1d, 0x1a, 0xe9, - 0x3b, 0xb2, 0x0b, 0x05, 0x05, 0x87, 0xd6, 0x48, 0x2d, 0x0e, 0x2a, 0x51, 0x0a, 0x5e, 0x65, 0x05, - 0xca, 0x01, 0x39, 0x8d, 0x41, 0xae, 0xb7, 0xc6, 0xff, 0x48, 0x14, 0xd0, 0x04, 0x50, 0xce, 0x80, - 0xff, 0xbf, 0xbd, 0x37, 0x19, 0x8a, 0x44, 0x10, 0xb8, 0x53, 0x7f, 0x0e, 0x41, 0xb6, 0xc3, 0x77, - 0xc8, 0xea, 0x97, 0x92, 0x66, 0xcd, 0x12, 0x52, 0x65, 0x53, 0x18, 0x94, 0x8b, 0x18, 0xcb, 0xa9, - 0x5b, 0x24, 0x3d, 0x32, 0x0a, 0x2f, 0x18, 0xf1, 0x32, 0x88, 0xfd, 0x52, 0x89, 0x20, 0x48, 0xe2, - 0x8e, 0xb3, 0x1e, 0x88, 0xf5, 0x72, 0xe0, 0x8c, 0xd6, 0x71, 0x56, 0x14, 0x91, 0x1f, 0x00, 0x0a, - 0x04, 0x34, 0xf0, 0xf0, 0xc1, 0x0c, 0x8f, 0xf0, 0x81, 0x62, 0x1d, 0xcb, 0xde, 0xac, 0xcb, 0xc0, - 0xd2, 0xc4, 0xe6, 0x0c, 0x60, 0xe7, 0x29, 0x63, 0x6f, 0xde, 0x73, 0xe4, 0x48, 0xec, 0xc8, 0x91, - 0x3c, 0xcc, 0xa4, 0x10, 0x54, 0xd0, 0x34, 0x1a, 0x7a, 0x0e, 0x49, 0x5a, 0x36, 0xe9, 0x87, 0xbe, - 0x30, 0x82, 0x84, 0x50, 0x07, 0x24, 0x15, 0x98, 0x4a, 0xc4, 0x0c, 0xbe, 0xff, 0x42, 0x52, 0x09, - 0xf8, 0x4f, 0x0a, 0xf5, 0x44, 0xd6, 0x07, 0xd9, 0x21, 0x3e, 0x88, 0xd7, 0xf3, 0x21, 0x95, 0x8d, - 0x7a, 0xd3, 0x4c, 0x8c, 0x09, 0xcd, 0xd5, 0x79, 0x30, 0xc5, 0x01, 0x22, 0xa4, 0xc3, 0x92, 0x42, - 0x56, 0x1a, 0x22, 0x22, 0xf5, 0xc2, 0xb0, 0xd2, 0x5a, 0x2f, 0x59, 0x6e, 0x9a, 0x0d, 0x03, 0xf0, - 0x05, 0xc3, 0xd0, 0x46, 0xe3, 0xd2, 0x42, 0x84, 0x55, 0x70, 0x7c, 0xc9, 0x11, 0xb3, 0x11, 0xd7, - 0x34, 0xe5, 0xb2, 0x53, 0x83, 0x10, 0x18, 0xa1, 0x3c, 0x27, 0x42, 0x50, 0x98, 0x5b, 0x50, 0x74, - 0x08, 0x68, 0x8d, 0xce, 0xa1, 0x2a, 0x34, 0x41, 0x5d, 0x08, 0x8a, 0x46, 0x53, 0xae, 0x0d, 0x46, - 0x62, 0x0c, 0x51, 0x35, 0xc9, 0x08, 0x45, 0x01, 0x08, 0xc1, 0xa4, 0x24, 0x98, 0xcb, 0xbd, 0x10, - 0x38, 0xfb, 0xb0, 0x9f, 0x01, 0x09, 0xe2, 0x8a, 0x97, 0x94, 0x83, 0x37, 0x20, 0x64, 0x9e, 0xd7, - 0x32, 0xf0, 0x33, 0x32, 0x71, 0x00, 0xc2, 0x14, 0x86, 0x5c, 0x62, 0x61, 0xa5, 0x16, 0x75, 0x31, - 0x0c, 0x32, 0x21, 0x7b, 0x03, 0x2d, 0xe2, 0xb4, 0x21, 0x92, 0xf1, 0x08, 0xb6, 0x30, 0xd0, 0x42, - 0x23, 0x2c, 0x04, 0x60, 0x0c, 0xbc, 0x9e, 0x2b, 0x18, 0x38, 0xc9, 0xcb, 0xb3, 0x2c, 0x0f, 0x73, - 0x07, 0xaf, 0x1e, 0x90, 0x10, 0x92, 0x89, 0xa5, 0x09, 0x07, 0x34, 0x25, 0xc1, 0x29, 0x6d, 0x40, - 0xd4, 0xa5, 0xd8, 0x36, 0xf5, 0xd0, 0x3b, 0x84, 0xdf, 0x29, 0x42, 0x7c, 0x14, 0x72, 0x64, 0x0c, - 0xaa, 0x6b, 0x01, 0x88, 0x4a, 0x66, 0x72, 0x86, 0x48, 0x3c, 0x47, 0x6a, 0x92, 0xed, 0x07, 0x63, - 0x27, 0x19, 0x92, 0x3c, 0xb9, 0xa4, 0x26, 0x0d, 0x57, 0x40, 0x69, 0x27, 0x1a, 0x49, 0x8a, 0xc8, - 0x98, 0x98, 0xe7, 0x70, 0x3c, 0xe3, 0xf5, 0xae, 0x68, 0xe2, 0x80, 0xe6, 0x69, 0x91, 0x72, 0x4a, - 0x8b, 0x86, 0x46, 0x6b, 0x1d, 0xdc, 0x41, 0x89, 0xad, 0xe1, 0x14, 0x62, 0xf8, 0x42, 0x5d, 0x18, - 0x05, 0xb4, 0xc0, 0x08, 0x6d, 0xdf, 0xc4, 0xc8, 0x15, 0x5c, 0x26, 0x9d, 0x71, 0xf1, 0x14, 0x12, - 0xa4, 0xd8, 0x35, 0x90, 0xfe, 0xe6, 0xb2, 0x5e, 0xe9, 0xd6, 0x84, 0x51, 0x68, 0x4e, 0x89, 0x48, - 0x49, 0x45, 0x4e, 0x26, 0x84, 0x46, 0xef, 0x0b, 0x8f, 0xb9, 0x70, 0x16, 0x20, 0x47, 0x16, 0x00, - 0x13, 0xb3, 0x48, 0x8b, 0x17, 0xa4, 0x20, 0xfc, 0x89, 0xc5, 0x81, 0xe2, 0x2c, 0xe0, 0x24, 0x28, - 0x88, 0xa3, 0x21, 0x87, 0x14, 0x4e, 0x8a, 0x1d, 0xc6, 0x21, 0x63, 0x5a, 0x70, 0xc2, 0x34, 0xcf, - 0x39, 0xf3, 0x68, 0xb9, 0x9c, 0x2a, 0x47, 0xb7, 0x72, 0x24, 0x10, 0x66, 0xaa, 0x44, 0x41, 0x48, - 0x91, 0x72, 0xde, 0x95, 0x32, 0xae, 0x52, 0xc8, 0x53, 0x46, 0x31, 0x91, 0x4d, 0xa3, 0x21, 0x96, - 0xaa, 0x60, 0xb0, 0x27, 0x03, 0x24, 0xbd, 0x11, 0x79, 0xbf, 0x04, 0x32, 0xcf, 0x08, 0xb5, 0xcd, - 0xd9, 0xdf, 0x21, 0x3d, 0xf5, 0xb0, 0x96, 0x4e, 0xb2, 0x1d, 0x61, 0x31, 0xc9, 0xe2, 0xe2, 0xfc, - 0x1f, 0x2d, 0xf4, 0xcc, 0x01, 0x25, 0x07, 0xcc, 0x82, 0xca, 0x8f, 0x32, 0xc5, 0xd2, 0xec, 0x57, - 0xa8, 0x2c, 0x58, 0x2b, 0x11, 0x3b, 0xd0, 0x28, 0x54, 0xb9, 0x92, 0x7c, 0x91, 0x3b, 0xa7, 0xd8, - 0x0c, 0x10, 0x8b, 0xac, 0x79, 0x23, 0x79, 0x51, 0x9f, 0xb1, 0x79, 0x70, 0x39, 0x4b, 0x0b, 0x38, - 0x2e, 0x16, 0x07, 0xf0, 0x00, 0x80, 0x29, 0xa2, 0x4a, 0x76, 0xa3, 0x5a, 0xa4, 0x28, 0x18, 0x2b, - 0x0c, 0x91, 0x87, 0xad, 0xf2, 0x5c, 0xef, 0x6e, 0x40, 0x99, 0xe4, 0x13, 0x0e, 0x83, 0xce, 0x3e, - 0x48, 0xb1, 0xad, 0x94, 0x18, 0xbe, 0xd7, 0xae, 0xe4, 0x60, 0x96, 0x6c, 0x3d, 0x2c, 0x6b, 0x4d, - 0x91, 0x3f, 0xea, 0xc4, 0x60, 0x81, 0xc4, 0x64, 0x15, 0x19, 0x83, 0xa8, 0xec, 0x03, 0xa6, 0xb9, - 0xa0, 0x12, 0x30, 0x89, 0x96, 0x13, 0x8d, 0x86, 0x26, 0xef, 0x24, 0x97, 0x03, 0x4c, 0x1d, 0xf8, - 0x87, 0xd6, 0x0c, 0xee, 0x39, 0xcf, 0xb6, 0x5c, 0x13, 0x53, 0x1c, 0x2d, 0x1b, 0x57, 0x72, 0xdd, - 0x99, 0x15, 0xe4, 0x06, 0xec, 0xf3, 0x0c, 0x64, 0x15, 0x34, 0x7f, 0xd4, 0x8a, 0x5b, 0x86, 0xda, - 0x7d, 0x8e, 0x6c, 0xb1, 0x41, 0xf1, 0x95, 0x2a, 0x88, 0x05, 0xb4, 0xdd, 0xd4, 0x34, 0x89, 0x9c, - 0x5c, 0x3e, 0x08, 0xc9, 0x81, 0x49, 0xec, 0x88, 0x68, 0xde, 0x17, 0x71, 0x85, 0x16, 0x02, 0xa8, - 0x1d, 0xa0, 0xf1, 0xe0, 0x96, 0x00, 0x2e, 0x8d, 0x87, 0x66, 0x70, 0x0a, 0xdc, 0x8a, 0x2a, 0x60, - 0x18, 0xd8, 0xa9, 0x89, 0xc9, 0x25, 0x57, 0x14, 0x01, 0x52, 0x2e, 0xb8, 0x10, 0x08, 0x95, 0x8c, - 0x16, 0x4c, 0x46, 0xb1, 0x70, 0xc9, 0xb3, 0x03, 0xa0, 0x8f, 0xd9, 0x5a, 0xed, 0xbe, 0xbd, 0xcf, - 0x73, 0x2e, 0xae, 0x52, 0x0e, 0x33, 0x04, 0x30, 0x04, 0xf8, 0x95, 0x8c, 0x22, 0xf9, 0xe3, 0x25, - 0x74, 0x00, 0x98, 0x22, 0xaf, 0x09, 0xc7, 0xdb, 0x1f, 0x30, 0x65, 0x28, 0x5a, 0x7f, 0x9c, 0x32, - 0x7f, 0x91, 0x35, 0x22, 0xf9, 0x6a, 0xe8, 0xb7, 0x85, 0xbd, 0x42, 0x61, 0x01, 0x17, 0x02, 0x32, - 0x84, 0x9d, 0xc3, 0x75, 0xb0, 0x2c, 0x53, 0xd2, 0x65, 0x58, 0x73, 0x9a, 0x8c, 0xd7, 0x05, 0x10, - 0x5f, 0xa4, 0x99, 0x1d, 0x67, 0x69, 0x88, 0x31, 0xe8, 0x80, 0x3f, 0x51, 0xa9, 0x84, 0xd6, 0xa4, - 0x15, 0xb2, 0xab, 0xa0, 0x01, 0xb7, 0xe6, 0x9d, 0xa0, 0x04, 0xba, 0x8f, 0x62, 0x7f, 0xd7, 0xf7, - 0x42, 0x7d, 0xe6, 0x44, 0x6a, 0x7b, 0x84, 0xda, 0xad, 0x54, 0x60, 0x4f, 0x44, 0xe9, 0x61, 0x81, - 0x79, 0xce, 0x17, 0xcb, 0xe0, 0xf3, 0xc1, 0x64, 0x0c, 0xe7, 0xd3, 0x35, 0x76, 0x33, 0xe8, 0x27, - 0x59, 0x03, 0x87, 0x82, 0x2a, 0x20, 0xf9, 0xa8, 0x2f, 0xa2, 0x1d, 0xa3, 0x80, 0xa3, 0x9e, 0x1a, - 0xd6, 0x6f, 0xc7, 0xb8, 0x26, 0x6f, 0xac, 0xe4, 0xa3, 0x64, 0xd8, 0xa4, 0x69, 0x77, 0x17, 0x18, - 0x4e, 0xda, 0x6c, 0xae, 0xd9, 0x07, 0xad, 0x7e, 0x5c, 0xd4, 0xdf, 0xf1, 0xea, 0xa8, 0x25, 0x3f, - 0x7c, 0x49, 0xc2, 0x5b, 0x0a, 0x25, 0xd8, 0x24, 0x67, 0x60, 0x66, 0x19, 0x5c, 0xee, 0xef, 0x20, - 0x52, 0x24, 0xfd, 0xc2, 0xf2, 0x6a, 0xa6, 0x2f, 0x94, 0xd7, 0x21, 0x79, 0x95, 0x02, 0x39, 0xe5, - 0x8d, 0xa8, 0xc4, 0x6d, 0x06, 0x29, 0x8a, 0xba, 0x38, 0x37, 0x40, 0x0b, 0x96, 0x56, 0x11, 0xe9, - 0x0e, 0xe7, 0xe0, 0x69, 0x2b, 0x92, 0x2f, 0xf2, 0x9b, 0x8a, 0x54, 0x72, 0x26, 0x9c, 0x6a, 0x62, - 0xe4, 0x05, 0x84, 0xe4, 0x08, 0x7a, 0x6b, 0x78, 0x3b, 0x85, 0x19, 0x26, 0x9e, 0xc0, 0xac, 0x20, - 0x63, 0xee, 0xe1, 0x22, 0x02, 0x7b, 0x2c, 0xb8, 0x82, 0xd3, 0x4b, 0x26, 0x2a, 0x84, 0xa3, 0x87, - 0x72, 0xd7, 0x09, 0x2a, 0xd7, 0x60, 0xe4, 0x3c, 0xd7, 0x92, 0xb8, 0x32, 0x97, 0x06, 0x85, 0x92, - 0xd6, 0x7d, 0x0b, 0xb4, 0x96, 0xf3, 0x49, 0x68, 0x0d, 0xe2, 0x18, 0x42, 0x0e, 0x58, 0x98, 0xef, - 0x3c, 0x61, 0xcf, 0x00, 0x43, 0xf0, 0xb8, 0xc9, 0x85, 0x93, 0x31, 0x9b, 0x63, 0x5d, 0x4a, 0x44, - 0x87, 0x02, 0x4c, 0x23, 0x65, 0x65, 0xd8, 0x1c, 0xd9, 0x67, 0x93, 0x9a, 0x54, 0x0b, 0x5b, 0xae, - 0x4b, 0x66, 0x99, 0xa3, 0xa9, 0xca, 0xd7, 0x1e, 0x4c, 0x1e, 0x81, 0x86, 0xbb, 0x82, 0x09, 0xd7, - 0x0e, 0xb3, 0xa6, 0x3f, 0x09, 0x90, 0xb5, 0x83, 0x2c, 0x6a, 0x0c, 0x2c, 0x73, 0x1b, 0xb0, 0x6c, - 0xea, 0x07, 0x85, 0x05, 0x65, 0x24, 0x06, 0xf7, 0x5c, 0xbc, 0x4c, 0x96, 0x94, 0xd3, 0xa5, 0x5c, - 0xe3, 0x07, 0xef, 0x18, 0x9c, 0xb7, 0xb0, 0x26, 0x41, 0x4c, 0x88, 0x4c, 0x45, 0x32, 0xcc, 0x79, - 0x38, 0x1b, 0x16, 0x01, 0x01, 0xb3, 0x1e, 0x6b, 0x83, 0x59, 0xaf, 0x84, 0xd5, 0x28, 0xd4, 0x95, - 0x3c, 0x58, 0x7f, 0x2c, 0xac, 0x67, 0x00, 0xcf, 0x49, 0x07, 0x81, 0xf5, 0x49, 0x60, 0x7d, 0xc2, - 0xac, 0x37, 0xba, 0x15, 0x96, 0xab, 0xc0, 0x79, 0xf2, 0x1f, 0x07, 0x00, 0x65, 0x39, 0x04, 0x28, - 0xcb, 0x38, 0x40, 0x59, 0x0f, 0x71, 0xcf, 0xa1, 0xd4, 0x06, 0x00, 0xe2, 0x90, 0x85, 0xdf, 0x87, - 0x64, 0xdb, 0x61, 0x36, 0x7c, 0x0f, 0x74, 0xb5, 0x0b, 0xc7, 0x65, 0xef, 0x3d, 0x0a, 0x15, 0x56, - 0xc1, 0xa0, 0x8f, 0x35, 0xf4, 0x50, 0x89, 0x1e, 0xf2, 0x3e, 0x57, 0xa2, 0x94, 0x80, 0xf5, 0xd0, - 0xa8, 0xa0, 0x88, 0x4a, 0x14, 0x91, 0xef, 0x2b, 0xe2, 0x4a, 0xf3, 0x5c, 0xb6, 0x5a, 0xd6, 0xc4, - 0x4c, 0x89, 0xee, 0x29, 0xd1, 0x44, 0xd3, 0x1f, 0xf6, 0xaa, 0xa8, 0x44, 0x15, 0x13, 0xd1, 0x44, - 0x15, 0x34, 0x31, 0x09, 0x9a, 0xc8, 0xba, 0x55, 0x88, 0xb8, 0x35, 0x74, 0x0b, 0xf7, 0x46, 0x89, - 0xb8, 0x45, 0xc2, 0x2c, 0xef, 0x7d, 0x62, 0x53, 0x7e, 0x7e, 0xcb, 0x6d, 0xb5, 0xfa, 0xbc, 0x3f, - 0xf2, 0x23, 0xe0, 0x46, 0x28, 0xdb, 0xdf, 0xaf, 0x80, 0x39, 0xeb, 0x26, 0x45, 0xcb, 0xd9, 0x04, - 0x18, 0xf2, 0x28, 0xdd, 0x67, 0x5a, 0xb6, 0x47, 0x84, 0xc6, 0xe0, 0xe5, 0xa6, 0x61, 0x27, 0x04, - 0xec, 0x14, 0x11, 0xea, 0x8f, 0xeb, 0xcd, 0x90, 0xd4, 0xf3, 0x10, 0x6e, 0xb7, 0x17, 0x84, 0x9b, - 0xa9, 0x31, 0xc8, 0xb3, 0x39, 0xdd, 0x03, 0x5e, 0x4a, 0x6a, 0xb2, 0x27, 0x44, 0xa6, 0x78, 0xd6, - 0xb7, 0x2d, 0xd7, 0xb0, 0x04, 0x7f, 0x1c, 0x36, 0x8d, 0xa2, 0xb4, 0x51, 0x90, 0x76, 0x57, 0x24, - 0x05, 0xdf, 0x23, 0xcf, 0x78, 0x28, 0x9e, 0xe3, 0x9c, 0xf4, 0x09, 0xd4, 0xb8, 0x4d, 0x18, 0x0c, - 0x8b, 0x58, 0xc6, 0xd6, 0x74, 0xa7, 0x76, 0xee, 0x48, 0x7d, 0x24, 0x13, 0x4d, 0x42, 0x61, 0x0d, - 0x1b, 0xcc, 0xf0, 0x6d, 0x43, 0x39, 0x83, 0x7c, 0x17, 0xf5, 0x53, 0xdd, 0x1c, 0x52, 0x18, 0x63, - 0xbd, 0xc5, 0x4e, 0x84, 0xd5, 0xb5, 0x6c, 0x9b, 0xb2, 0xfe, 0x56, 0xab, 0x90, 0x2f, 0x49, 0x06, - 0xf9, 0x92, 0x64, 0x98, 0x2f, 0xd9, 0x1b, 0x25, 0xbd, 0x5c, 0x7e, 0x59, 0xfc, 0x5d, 0x90, 0xd4, - 0x53, 0xc8, 0x89, 0x1b, 0x01, 0x8b, 0x49, 0x0a, 0x62, 0x52, 0xc7, 0x3f, 0x59, 0x3b, 0x45, 0x97, - 0x8c, 0x35, 0x61, 0xaa, 0x32, 0x31, 0x55, 0xda, 0xaa, 0x5a, 0x00, 0x47, 0x47, 0x10, 0x6b, 0x31, - 0x81, 0x58, 0xcd, 0x04, 0x62, 0x35, 0x63, 0x88, 0x35, 0x9b, 0x40, 0xac, 0x66, 0x02, 0xb1, 0xfa, - 0x27, 0xbf, 0x8f, 0x21, 0xd6, 0x7c, 0x0c, 0xb1, 0x6e, 0x52, 0x15, 0x48, 0xce, 0xd2, 0x6a, 0xe6, - 0x54, 0x1e, 0xe9, 0xfe, 0xe8, 0x76, 0x96, 0xa7, 0x40, 0x68, 0x17, 0xc3, 0x3f, 0xeb, 0xfe, 0x4e, - 0x98, 0x28, 0x0e, 0xda, 0x45, 0xd5, 0x63, 0x67, 0x41, 0x57, 0x9a, 0xf1, 0x86, 0x54, 0x58, 0x2e, - 0x12, 0x7b, 0x92, 0x81, 0x90, 0x75, 0xed, 0x76, 0x27, 0xb6, 0x06, 0x5a, 0x11, 0x41, 0x50, 0x9f, - 0x00, 0x99, 0x0f, 0x1b, 0x80, 0xb4, 0xbf, 0x0f, 0xfa, 0xc9, 0x9d, 0x92, 0x72, 0x6b, 0xe2, 0x00, - 0x36, 0x1d, 0xdc, 0xa0, 0xf8, 0x30, 0x02, 0x48, 0x35, 0x97, 0x2c, 0x31, 0xfd, 0x7d, 0xd0, 0xdc, - 0x61, 0x0e, 0x22, 0x20, 0xa3, 0x0c, 0x93, 0x26, 0x43, 0x98, 0xb4, 0x0b, 0x1b, 0xb4, 0x0d, 0xba, - 0xc2, 0xfb, 0x0d, 0x9f, 0x11, 0xde, 0xa8, 0x2d, 0x6f, 0xe0, 0x5e, 0xa8, 0x80, 0x8e, 0x6a, 0xd6, - 0x43, 0x8d, 0xbb, 0x68, 0x77, 0xaa, 0xd6, 0x0b, 0xb9, 0x09, 0xfd, 0x25, 0xdf, 0x92, 0xfe, 0xf2, - 0x72, 0xfe, 0x00, 0x2d, 0x5b, 0x5f, 0x1c, 0x85, 0xdb, 0xe4, 0xf1, 0x68, 0x20, 0x3c, 0x4c, 0x2b, - 0xdc, 0x19, 0x8f, 0x73, 0xd7, 0x17, 0x6a, 0xb9, 0xa8, 0xdb, 0x79, 0xfd, 0xf9, 0x77, 0x7e, 0xb6, - 0xe7, 0xec, 0xe5, 0x7d, 0xd7, 0xa8, 0xaf, 0x78, 0x0b, 0xd3, 0x6f, 0xfc, 0x7e, 0xa5, 0xff, 0x9a, - 0xde, 0xaf, 0x4e, 0xfd, 0x51, 0x93, 0xd9, 0xcb, 0x70, 0xdb, 0x7b, 0x20, 0x74, 0x7b, 0x39, 0x24, - 0xc4, 0x4f, 0xcb, 0xdc, 0x4d, 0x0a, 0x37, 0xe3, 0xee, 0x26, 0x71, 0xd7, 0x6d, 0x49, 0x1c, 0xff, - 0xfb, 0xc0, 0x44, 0x08, 0x70, 0xfd, 0xdb, 0x6e, 0x0a, 0x57, 0x5f, 0x47, 0x14, 0x6c, 0x84, 0x02, - 0xca, 0x61, 0x76, 0x13, 0x58, 0xb4, 0x23, 0x02, 0x59, 0x84, 0x00, 0x6e, 0xc4, 0x8b, 0x10, 0xe8, - 0x86, 0x6c, 0xf8, 0x10, 0x63, 0x02, 0x42, 0x9c, 0xdd, 0x04, 0xba, 0xf5, 0x90, 0xc0, 0x59, 0x8c, - 0x40, 0xbd, 0xbc, 0x1e, 0x5d, 0x4f, 0x92, 0x9f, 0x3f, 0x6c, 0x24, 0x5e, 0x5f, 0xf6, 0x12, 0xef, - 0x1f, 0x9f, 0x36, 0x7b, 0x89, 0x47, 0xfe, 0x30, 0x8f, 0xe8, 0xfb, 0xff, 0x6a, 0x79, 0x0b, 0xd7, - 0xf1, 0x15, 0x75, 0x7c, 0xb1, 0xda, 0x5c, 0xd7, 0xb5, 0xaf, 0xc2, 0x75, 0x1d, 0x56, 0x13, 0x3f, - 0x2d, 0x42, 0x6d, 0x9f, 0x16, 0xa1, 0xf8, 0x45, 0x5a, 0xbf, 0x1f, 0x71, 0x4a, 0x6b, 0xd1, 0x74, - 0x5d, 0xdf, 0xf8, 0xb2, 0x13, 0x7a, 0x67, 0xaf, 0x54, 0x78, 0xea, 0xab, 0xba, 0x9d, 0x2f, 0xf0, - 0x59, 0x7d, 0xc5, 0xd3, 0xd4, 0x55, 0xb7, 0x6e, 0xee, 0x7e, 0xd7, 0x98, 0x98, 0xbc, 0xd0, 0x08, - 0x4f, 0x14, 0x9f, 0x8c, 0x19, 0x8f, 0xae, 0x1e, 0x0c, 0xe4, 0x74, 0x8f, 0x81, 0xfc, 0xe3, 0xb4, - 0xb9, 0x54, 0xfc, 0xda, 0x81, 0x7f, 0x3c, 0x19, 0xc9, 0xe9, 0x4f, 0x8c, 0xa4, 0x7d, 0xb3, 0x4f, - 0xe7, 0x6f, 0xf0, 0x80, 0xaf, 0x58, 0xf7, 0x6f, 0x7e, 0xa6, 0xfb, 0xa3, 0x7d, 0xba, 0x3f, 0x22, - 0xf2, 0xb1, 0xde, 0x8f, 0x7e, 0xa0, 0xf7, 0xf1, 0x18, 0x6e, 0xba, 0xc1, 0x78, 0xde, 0xee, 0x31, - 0x9e, 0xb7, 0x34, 0x9a, 0xe9, 0x30, 0xde, 0xee, 0x18, 0x86, 0x96, 0x41, 0xa4, 0x87, 0xa9, 0x71, - 0x83, 0x81, 0x84, 0x87, 0xf6, 0x3f, 0x61, 0xc5, 0xd9, 0x1e, 0x5d, 0x9f, 0x55, 0xeb, 0xfb, 0x55, - 0xc5, 0xcf, 0x30, 0x9c, 0x8e, 0xe0, 0xec, 0x87, 0x47, 0x30, 0x19, 0xc7, 0x5f, 0xfb, 0x88, 0xe4, - 0x2f, 0x3c, 0x07, 0x2d, 0x26, 0x93, 0xbf, 0x7e, 0x7c, 0x45, 0xac, 0xdb, 0x4f, 0x03, 0x03, 0x4e, - 0xf6, 0xfd, 0x7f, 0xae, 0xae, 0x9a, 0x7a, 0xad, 0x4e, 0xaa, 0x45, 0xd3, 0xb2, 0xfe, 0xd2, 0xdf, - 0xd6, 0x08, 0xde, 0xae, 0x36, 0x16, 0x84, 0x9f, 0xaa, 0x9c, 0x94, 0x65, 0xcc, 0x8a, 0xa0, 0x42, - 0x28, 0x62, 0x4a, 0x97, 0x53, 0x2a, 0x3a, 0x42, 0xe4, 0x49, 0x0d, 0x49, 0x84, 0xe0, 0xed, 0xd5, - 0x98, 0xe0, 0xf3, 0xf4, 0x86, 0x69, 0xf3, 0xd8, 0x08, 0x27, 0x04, 0xa3, 0xd3, 0x94, 0x44, 0xe1, - 0xd8, 0x5e, 0x6e, 0xb9, 0xc6, 0x8f, 0xe3, 0x12, 0x21, 0x9d, 0x7f, 0x1a, 0xc8, 0xe1, 0x13, 0xe4, - 0xb0, 0xbc, 0xe3, 0x75, 0xd5, 0x8b, 0xae, 0x7f, 0x4c, 0xf4, 0xec, 0x8c, 0x1f, 0x6f, 0x75, 0x90, - 0xfe, 0xf2, 0xf2, 0x85, 0x34, 0x99, 0x34, 0xd5, 0xb3, 0x23, 0x7e, 0x91, 0x21, 0xcd, 0x32, 0xd2, - 0xc2, 0xcc, 0x8e, 0x56, 0x0d, 0xfc, 0x23, 0xda, 0xe8, 0x22, 0x4d, 0xec, 0xec, 0xaf, 0xf9, 0x5d, - 0xa3, 0x68, 0x1f, 0x8b, 0x34, 0xc8, 0xa4, 0xc1, 0x29, 0xbf, 0x5f, 0x4e, 0xd1, 0x76, 0x15, 0x69, - 0xe7, 0x66, 0xc7, 0xfc, 0xa6, 0xc5, 0x53, 0x75, 0xe0, 0x62, 0x6d, 0xfc, 0xec, 0xec, 0x4b, 0xd3, - 0xdc, 0xa9, 0x03, 0x1f, 0x6b, 0x91, 0xcf, 0xfe, 0x78, 0x24, 0x36, 0xcd, 0x6b, 0x75, 0x90, 0xc7, - 0xda, 0x14, 0xd2, 0x53, 0xbb, 0x5c, 0x12, 0xa5, 0x22, 0xd6, 0xaa, 0x9c, 0x9d, 0x56, 0xf3, 0xc5, - 0xc5, 0xf2, 0x8b, 0x3a, 0x28, 0xa3, 0x1c, 0x4c, 0x67, 0x67, 0x75, 0xb5, 0x20, 0x0e, 0xc6, 0x99, - 0xac, 0xa5, 0xc9, 0x57, 0x43, 0xad, 0xa2, 0x8c, 0xd6, 0x66, 0xf6, 0xba, 0xba, 0x24, 0x36, 0xea, - 0x28, 0xa3, 0xb5, 0x9d, 0x1d, 0xdf, 0xe0, 0x81, 0xad, 0x07, 0x3a, 0xca, 0x6b, 0x9d, 0x85, 0x36, - 0xc7, 0x2d, 0x35, 0x8b, 0xb2, 0x5a, 0xbb, 0xd9, 0xe9, 0xfd, 0x62, 0x31, 0x5f, 0x5c, 0x53, 0xab, - 0x28, 0xb3, 0xb5, 0x9f, 0x9d, 0x7f, 0xa1, 0xf5, 0xd1, 0xa2, 0xcb, 0x28, 0xc3, 0x75, 0xbe, 0x69, - 0x45, 0x92, 0xd3, 0x51, 0xa6, 0xeb, 0x62, 0xd3, 0x2e, 0xcc, 0x34, 0xca, 0x79, 0x5d, 0x6e, 0x49, - 0xbe, 0xa6, 0x86, 0x51, 0xf6, 0x1b, 0x62, 0xff, 0x5d, 0xb5, 0xe2, 0x11, 0x9a, 0xa8, 0x04, 0x8c, - 0xde, 0xb4, 0x7a, 0xb7, 0x78, 0xa0, 0x96, 0xf1, 0xe5, 0x6e, 0x86, 0x2d, 0xff, 0x9b, 0x9a, 0x46, - 0xa5, 0x61, 0xec, 0xec, 0x6c, 0xbd, 0x5a, 0x5e, 0xa0, 0xe7, 0xa8, 0x38, 0x4c, 0xd6, 0x37, 0x82, - 0x3c, 0x4c, 0x54, 0x1e, 0xc6, 0xf5, 0xed, 0xd0, 0x67, 0x54, 0x20, 0xc6, 0x07, 0x85, 0x65, 0x6a, - 0x51, 0x89, 0x98, 0x7c, 0xf6, 0x6a, 0x71, 0xb9, 0x5a, 0x42, 0xf7, 0x4d, 0x54, 0x1e, 0xa6, 0xe8, - 0x97, 0x93, 0x89, 0x0a, 0xc2, 0x94, 0xa1, 0x0d, 0x49, 0xd6, 0x44, 0xa5, 0x60, 0xd3, 0xbe, 0x55, - 0xaf, 0x2f, 0x36, 0x2a, 0x0b, 0xab, 0x43, 0xdb, 0xd7, 0xb4, 0x55, 0x90, 0x59, 0xb1, 0x51, 0x59, - 0x58, 0xd3, 0x53, 0xa5, 0x25, 0x60, 0xe3, 0xe6, 0xc7, 0x6e, 0x57, 0x3c, 0x4b, 0xd7, 0x46, 0xa5, - 0x61, 0x33, 0xd1, 0xfb, 0xab, 0x7b, 0x62, 0x9f, 0x8d, 0x0a, 0xc3, 0xba, 0xd9, 0xf9, 0xaa, 0xba, - 0xba, 0x22, 0x13, 0xf2, 0x27, 0xec, 0x3b, 0xb5, 0x8d, 0x4a, 0xc4, 0xf6, 0x06, 0xe9, 0xf4, 0xc0, - 0x46, 0xe5, 0x61, 0xf3, 0x8d, 0xb6, 0x91, 0x0d, 0xb0, 0x51, 0x89, 0xd8, 0x62, 0x46, 0xbe, 0xe2, - 0x0b, 0xf6, 0x99, 0x0e, 0x6c, 0x54, 0x28, 0xb6, 0xdc, 0x90, 0x23, 0xb1, 0xd8, 0xa8, 0x58, 0x32, - 0xb1, 0x4d, 0x8b, 0x66, 0x45, 0x46, 0x37, 0x2a, 0x90, 0x4c, 0xcf, 0x78, 0x96, 0x37, 0x4b, 0x6c, - 0x4a, 0x07, 0x59, 0x54, 0x1e, 0x19, 0x59, 0xa8, 0xf9, 0xaa, 0xf9, 0xb2, 0x5c, 0x7d, 0xee, 0xa8, - 0x5d, 0x54, 0x20, 0x99, 0x1d, 0xb4, 0xa3, 0x01, 0x66, 0xf1, 0x8d, 0x01, 0xc6, 0x6a, 0x45, 0x91, - 0xd6, 0x6d, 0x05, 0x8a, 0x51, 0x81, 0x64, 0x8e, 0x29, 0xd2, 0x92, 0xa1, 0x5d, 0x94, 0x67, 0x13, - 0x95, 0x47, 0xe6, 0x67, 0x6f, 0xc2, 0x73, 0x55, 0xa9, 0x59, 0x54, 0x22, 0x59, 0xde, 0x3f, 0x87, - 0x8d, 0x5a, 0x45, 0xe5, 0x91, 0x15, 0xb2, 0x73, 0xbd, 0xfb, 0x48, 0xad, 0xa2, 0xe2, 0xc8, 0xca, - 0xd0, 0xea, 0x1d, 0xb5, 0x8a, 0x0a, 0xc3, 0xa5, 0xd2, 0xea, 0x23, 0xd1, 0x72, 0x51, 0x61, 0x38, - 0x1d, 0x5a, 0x11, 0x2d, 0x17, 0x95, 0x84, 0x23, 0xcd, 0x20, 0x97, 0xe3, 0x9e, 0x98, 0xe6, 0xa2, - 0x62, 0x70, 0x76, 0xf6, 0xb6, 0xc2, 0xc3, 0x76, 0xe1, 0xff, 0x1f, 0xb8, 0xa8, 0x10, 0x5c, 0x46, - 0xab, 0x7d, 0x2e, 0xef, 0x38, 0x0e, 0xf6, 0xc0, 0xc5, 0xb7, 0x68, 0xb7, 0x6d, 0x2c, 0xbb, 0xbe, - 0x8b, 0x8a, 0xc2, 0xf9, 0x6d, 0x5b, 0x31, 0xf8, 0x2e, 0x2a, 0x0f, 0x97, 0xcb, 0x22, 0x64, 0x81, - 0xb8, 0xa8, 0x40, 0x5c, 0x31, 0x7b, 0x77, 0xfc, 0xbf, 0xd4, 0x22, 0x2a, 0x0c, 0x57, 0xce, 0xde, - 0xdf, 0xb7, 0xeb, 0xb9, 0x3a, 0x5e, 0xde, 0x36, 0xb4, 0x04, 0x5c, 0x54, 0x20, 0x7e, 0xab, 0x1d, - 0xd8, 0x99, 0x7d, 0x54, 0x26, 0x5e, 0xcf, 0x82, 0xeb, 0x12, 0xd8, 0xe3, 0xa3, 0x82, 0xf1, 0x66, - 0xf6, 0xb1, 0xab, 0xe7, 0x2d, 0x1e, 0x57, 0x4b, 0xed, 0xa2, 0xb2, 0xf1, 0x76, 0x76, 0xb2, 0x9a, - 0x13, 0x4b, 0x4c, 0xaa, 0x1d, 0x35, 0x8c, 0x0a, 0xc7, 0x67, 0xb3, 0x7f, 0xdd, 0x5f, 0x5f, 0x63, - 0x7b, 0xf3, 0x51, 0xa1, 0x78, 0x37, 0x3b, 0xa9, 0xda, 0x66, 0xcd, 0x7d, 0xc6, 0x3d, 0x27, 0x2f, - 0x4a, 0x44, 0x5d, 0x62, 0xba, 0x51, 0x51, 0xf8, 0x5c, 0x8c, 0xe4, 0x97, 0xea, 0xa1, 0xa1, 0x05, - 0xe6, 0xa3, 0xc2, 0xf0, 0xc5, 0xec, 0xe8, 0xe4, 0x3d, 0xb5, 0x88, 0x0a, 0xc3, 0x97, 0xd4, 0x65, - 0xdb, 0xaa, 0x0f, 0x78, 0x54, 0xb4, 0x2a, 0xa8, 0x69, 0x54, 0x1a, 0x79, 0x3a, 0x93, 0x56, 0xc0, - 0x14, 0xc9, 0x73, 0x8b, 0x4a, 0x23, 0xd7, 0xdb, 0x86, 0x34, 0x8f, 0x3c, 0x2a, 0x8b, 0xdc, 0x6c, - 0x1b, 0x5a, 0x6a, 0x18, 0x15, 0x46, 0x6e, 0xb7, 0x0d, 0x33, 0x6a, 0x18, 0x15, 0x46, 0x1e, 0xb6, - 0x8f, 0x75, 0xef, 0x13, 0xe5, 0x51, 0x91, 0xe4, 0x6e, 0xf6, 0x67, 0xf5, 0x19, 0x4d, 0x06, 0xf2, - 0x00, 0xe0, 0xc5, 0x9e, 0xf9, 0xd6, 0xaf, 0x3f, 0xa3, 0x35, 0xda, 0x35, 0xf5, 0x72, 0x71, 0x59, - 0xad, 0x1e, 0x95, 0xe8, 0xca, 0x7a, 0xa9, 0x5e, 0xca, 0xd3, 0x82, 0x25, 0x78, 0x0b, 0xff, 0x6f, - 0x00, 0x9f, 0x33, 0xf2, 0xe7, 0x67, 0x1c, 0xc4, 0xbd, 0x7c, 0x21, 0xe7, 0x66, 0xdf, 0xbb, 0x80, - 0x82, 0x98, 0x23, 0x3c, 0x58, 0x7a, 0xef, 0x0b, 0xcc, 0x2f, 0x61, 0xcd, 0xef, 0x7d, 0x85, 0xfd, - 0x05, 0x4b, 0xfa, 0x96, 0xa6, 0xb1, 0xf7, 0x25, 0xd9, 0x2f, 0xb4, 0x77, 0x56, 0x77, 0xea, 0xe4, - 0xc5, 0xd9, 0xf6, 0x1a, 0x62, 0xc0, 0x77, 0x2e, 0x73, 0x74, 0x19, 0xb1, 0x2d, 0xf4, 0x06, 0x76, - 0x4d, 0x86, 0xda, 0x07, 0xa4, 0x57, 0x77, 0x9f, 0x04, 0x38, 0x7a, 0x5d, 0x75, 0x6b, 0xbc, 0x68, - 0x3d, 0x68, 0xc9, 0xee, 0xa8, 0xea, 0xf5, 0xc9, 0x20, 0xaa, 0x3a, 0x79, 0x2e, 0xaa, 0xfa, 0xa3, - 0xb9, 0xaa, 0xc8, 0xc6, 0x44, 0x63, 0xaa, 0xde, 0x5a, 0x3c, 0x52, 0x50, 0x18, 0x0d, 0xab, 0xfa, - 0xe1, 0x4b, 0xc8, 0xf3, 0x71, 0xd1, 0x3e, 0x46, 0xc3, 0xab, 0x23, 0xb2, 0x3a, 0x97, 0x0a, 0x2f, - 0xa6, 0xe9, 0x19, 0xbc, 0x7b, 0x1f, 0x62, 0xb6, 0x30, 0xbd, 0xee, 0x39, 0x82, 0x6e, 0x4b, 0x70, - 0x7b, 0x41, 0x34, 0xdc, 0x3a, 0xa9, 0x56, 0xeb, 0x18, 0x25, 0xb2, 0x14, 0xed, 0xf2, 0xfe, 0x32, - 0x1a, 0x64, 0xfd, 0x59, 0x3d, 0x54, 0xd1, 0xd8, 0xea, 0x63, 0xdd, 0x54, 0x8b, 0x78, 0x54, 0xf5, - 0x7a, 0xb9, 0x6a, 0xba, 0x28, 0x8f, 0x75, 0x1f, 0x9a, 0xc5, 0xa3, 0xa9, 0xde, 0x17, 0xc5, 0x4b, - 0xd2, 0xee, 0x62, 0x72, 0xa0, 0x90, 0xea, 0xec, 0x7e, 0xd1, 0x35, 0xd1, 0x8e, 0xb2, 0xd9, 0xe9, - 0xfc, 0xa1, 0x59, 0x5c, 0x36, 0x6d, 0x1b, 0x0f, 0xa5, 0x28, 0x44, 0x6e, 0xbe, 0x45, 0xbb, 0xf0, - 0x70, 0xea, 0xd4, 0x3f, 0x15, 0xdc, 0xba, 0x78, 0x08, 0xf5, 0x1f, 0x7e, 0x30, 0xfe, 0xf2, 0x3e, - 0x3a, 0x92, 0x82, 0x7c, 0xfa, 0xaa, 0x5d, 0x5e, 0x93, 0x9b, 0x16, 0x8f, 0x9a, 0xce, 0xee, 0xe0, - 0x55, 0xc7, 0x83, 0xa5, 0x13, 0xd2, 0x84, 0x26, 0x36, 0x13, 0x84, 0x49, 0xcc, 0x0c, 0x13, 0x8f, - 0x8e, 0x8e, 0x9a, 0xa6, 0x8e, 0xd2, 0xb7, 0xb3, 0x7f, 0xcf, 0x17, 0xeb, 0xea, 0x3a, 0xba, 0xea, - 0x33, 0xd2, 0x9d, 0x3b, 0x3c, 0x35, 0x77, 0x15, 0x6d, 0x02, 0xc3, 0xb9, 0xb8, 0xec, 0xea, 0x2a, - 0x2a, 0x33, 0x04, 0x41, 0x4d, 0x15, 0x1f, 0x45, 0x3e, 0x3b, 0xbb, 0x69, 0x56, 0x17, 0x51, 0x99, - 0x52, 0xdc, 0xf3, 0x36, 0xae, 0xbe, 0x14, 0xf1, 0xe0, 0xac, 0xcf, 0xe2, 0xb1, 0xce, 0x1f, 0xab, - 0xc7, 0x2f, 0x51, 0xea, 0x14, 0xdf, 0xfc, 0xeb, 0x3e, 0xc6, 0x61, 0x0a, 0x69, 0xde, 0xac, 0x9e, - 0x65, 0x11, 0x45, 0x33, 0xa7, 0xcd, 0x97, 0x9b, 0x79, 0x3c, 0x82, 0x39, 0x6f, 0x56, 0xeb, 0x79, - 0xdc, 0x0a, 0x58, 0xf1, 0x95, 0xe3, 0xe1, 0xca, 0xbb, 0xba, 0xb9, 0x7a, 0xa6, 0x01, 0xe9, 0xf4, - 0x63, 0xb5, 0x88, 0x9e, 0x2e, 0xc4, 0x4f, 0x53, 0x27, 0xb4, 0x05, 0xc6, 0xc3, 0x93, 0x57, 0xf7, - 0xeb, 0xfb, 0xdb, 0x98, 0x72, 0x53, 0x58, 0xf2, 0x9e, 0x18, 0x40, 0x5c, 0x88, 0x47, 0x24, 0xd4, - 0x60, 0xd5, 0xc4, 0x0c, 0x0b, 0x05, 0x22, 0xa4, 0x2d, 0xb7, 0xd5, 0x75, 0x3c, 0x00, 0xa1, 0xf3, - 0x17, 0xed, 0x7d, 0x3c, 0xec, 0xf8, 0x28, 0x88, 0xe8, 0x3f, 0xd5, 0x79, 0x53, 0xc5, 0x84, 0x45, - 0x64, 0xce, 0xe7, 0xd5, 0x6d, 0x15, 0x93, 0x34, 0x91, 0x79, 0x75, 0xb7, 0x9a, 0x93, 0x7b, 0x03, - 0x8e, 0xec, 0xda, 0xe5, 0x27, 0xe8, 0xec, 0xa7, 0x7d, 0xd0, 0xd9, 0x00, 0x9a, 0x9e, 0xdd, 0x35, - 0xcd, 0xe5, 0x53, 0x78, 0xf6, 0xd3, 0xbe, 0xf0, 0xec, 0xa7, 0x1d, 0x28, 0xf5, 0xbb, 0xbf, 0xd1, - 0xff, 0xbb, 0xc5, 0xba, 0x59, 0x74, 0xf3, 0xf5, 0xe3, 0x93, 0x31, 0xbc, 0xfb, 0x91, 0x31, 0x4c, - 0x80, 0xe2, 0x93, 0x31, 0x50, 0xfc, 0xba, 0x7a, 0x58, 0xae, 0x00, 0x4a, 0x9f, 0x90, 0xcd, 0x6f, - 0xd6, 0xdd, 0x13, 0xb0, 0xf8, 0xae, 0x6b, 0x37, 0x1e, 0x00, 0xbf, 0x9d, 0x8d, 0xdf, 0x4b, 0x16, - 0x83, 0x8b, 0x27, 0x45, 0x2d, 0xb1, 0x34, 0xde, 0xdd, 0x00, 0x97, 0x0d, 0xef, 0xbf, 0xfb, 0x59, - 0xf4, 0xf8, 0xae, 0x5b, 0x3c, 0x25, 0xfa, 0xb3, 0x08, 0xf2, 0x5d, 0xd7, 0x8d, 0x27, 0xcf, 0x2f, - 0x59, 0x7e, 0x8e, 0xe6, 0xa0, 0x4c, 0x61, 0x42, 0x12, 0x8c, 0x15, 0xc9, 0x33, 0xe1, 0x77, 0xc1, - 0xf5, 0x79, 0xad, 0x06, 0xaf, 0x52, 0xe8, 0x77, 0x13, 0x16, 0xaf, 0x0e, 0xe2, 0x0d, 0xd2, 0xdd, - 0x7a, 0xae, 0xc7, 0x18, 0x8f, 0xda, 0xf0, 0x1a, 0x6e, 0x58, 0x75, 0x77, 0xd7, 0x3e, 0x8e, 0x56, - 0x16, 0x9f, 0xbe, 0x58, 0x7e, 0x55, 0xe1, 0x45, 0x51, 0xfc, 0x76, 0x3b, 0xe9, 0xf3, 0xe8, 0x78, - 0xa6, 0x2e, 0x36, 0x29, 0xba, 0x5f, 0xf7, 0xbd, 0xec, 0x98, 0x2e, 0x13, 0x37, 0x99, 0x76, 0x89, - 0x7d, 0x2f, 0x7a, 0x4d, 0x17, 0x35, 0xbc, 0xae, 0xbb, 0xc3, 0xed, 0x04, 0xe0, 0x9e, 0xa9, 0xf5, - 0xcd, 0x6a, 0x79, 0x7f, 0x7d, 0xa3, 0xee, 0x64, 0xe5, 0xa9, 0x2d, 0x77, 0xea, 0x47, 0x2d, 0x57, - 0x9f, 0xe8, 0xbd, 0xb9, 0xc3, 0xbe, 0xfb, 0x80, 0x82, 0x09, 0x14, 0xcc, 0x0e, 0x0a, 0x6e, 0x27, - 0x85, 0x5f, 0xd5, 0x67, 0xa0, 0x49, 0xd8, 0xdf, 0x14, 0x92, 0x1b, 0x43, 0x6a, 0xe7, 0x81, 0xda, - 0xf9, 0xae, 0xf1, 0x18, 0x27, 0xfa, 0xe8, 0x44, 0x21, 0xbd, 0x43, 0xae, 0x3e, 0x10, 0xbd, 0xed, - 0x7e, 0xdb, 0xcd, 0x2a, 0x61, 0xe9, 0x7f, 0x36, 0xcb, 0x8b, 0x5f, 0xf5, 0x35, 0xc8, 0x3a, 0x3c, - 0xe3, 0x88, 0x9f, 0x52, 0xc3, 0x57, 0x2c, 0xf0, 0x8b, 0xe5, 0x72, 0x4d, 0x32, 0x59, 0x5c, 0xcd, - 0xaf, 0xb7, 0x2e, 0x38, 0x48, 0x4c, 0x94, 0xfe, 0xc3, 0x58, 0xe9, 0xcf, 0xe7, 0xb7, 0xe4, 0x16, - 0xf1, 0x6e, 0xf2, 0x44, 0xdf, 0x17, 0xa3, 0xf4, 0x32, 0xde, 0xf8, 0xf7, 0x37, 0x13, 0xfe, 0x1b, - 0x8a, 0x00, 0x83, 0xee, 0xab, 0x96, 0x86, 0x79, 0x39, 0xbf, 0x55, 0x50, 0x8c, 0x7d, 0x17, 0xcd, - 0x87, 0x63, 0xa1, 0xa0, 0x3b, 0x0a, 0xd1, 0xf8, 0x3d, 0x19, 0x8a, 0x57, 0xc8, 0x65, 0x9f, 0xc5, - 0x3b, 0x40, 0x99, 0x86, 0x23, 0x9e, 0xff, 0xf2, 0xab, 0x32, 0xb4, 0x18, 0xf9, 0xec, 0xba, 0x5a, - 0x5d, 0x93, 0x53, 0xbd, 0x5d, 0xd9, 0x87, 0x5b, 0xfb, 0xfb, 0x61, 0x0f, 0xfb, 0xfb, 0x47, 0x2c, - 0x47, 0xf8, 0x61, 0x03, 0x5b, 0x8c, 0xd6, 0xcd, 0x56, 0x31, 0x27, 0xc6, 0xfe, 0x7c, 0x1f, 0x63, - 0x7f, 0x2e, 0xa3, 0xdd, 0xa6, 0xca, 0x9f, 0xee, 0x38, 0xe7, 0xcf, 0x5a, 0xfb, 0x91, 0x7d, 0x17, - 0xf3, 0xf2, 0x02, 0xa9, 0xfb, 0xcd, 0x2f, 0xf2, 0x62, 0x21, 0x29, 0x19, 0xb8, 0x52, 0x78, 0x0b, - 0x65, 0x75, 0x41, 0x4e, 0xee, 0x6f, 0x17, 0x6d, 0xb5, 0xf8, 0x4c, 0xad, 0xe4, 0x3c, 0xfd, 0x83, - 0x37, 0x2b, 0xe0, 0x35, 0x0b, 0xeb, 0xdb, 0x76, 0xf6, 0xff, 0x0c, 0x32, 0x5d, 0x3f, 0xb1, 0x8b, - 0x00, 0x00, + 0x67, 0x56, 0x96, 0x8c, 0x1e, 0xcb, 0xa7, 0x9c, 0x0b, 0x07, 0x7c, 0x9e, 0x36, 0xeb, 0x2e, 0x10, + 0x03, 0xfe, 0x3d, 0x21, 0x3e, 0xfc, 0xde, 0x24, 0xbb, 0x5e, 0xf6, 0xd1, 0x80, 0x15, 0xe2, 0x43, + 0x35, 0x6a, 0xa7, 0x86, 0x71, 0x28, 0x69, 0xd3, 0x4d, 0x3b, 0x29, 0xe6, 0x9d, 0x36, 0x23, 0x12, + 0xf9, 0x5e, 0x12, 0xc4, 0x02, 0x5a, 0xe2, 0x98, 0xa8, 0x26, 0x3d, 0x84, 0xcc, 0xb2, 0x92, 0xb3, + 0x0a, 0x58, 0x28, 0x7c, 0xd0, 0x6b, 0x2b, 0xab, 0x88, 0xb3, 0xde, 0x72, 0x26, 0xc1, 0x99, 0xb2, + 0x9b, 0xf6, 0x5a, 0xa8, 0x79, 0xef, 0x42, 0x78, 0x47, 0x9e, 0x5c, 0x90, 0x11, 0x7d, 0x1d, 0xa5, + 0xaf, 0x85, 0x7e, 0x33, 0x9e, 0xf9, 0x3e, 0x39, 0xd8, 0x6e, 0xc6, 0xd5, 0xe2, 0x80, 0x25, 0x52, + 0xaf, 0xd7, 0xab, 0x4f, 0x5c, 0x24, 0x9c, 0x34, 0x8b, 0x75, 0xd3, 0xb5, 0x07, 0x2c, 0x97, 0x80, + 0x9d, 0x73, 0xca, 0x83, 0x54, 0xa6, 0x19, 0x61, 0xe8, 0xc8, 0x70, 0x4c, 0xc1, 0x73, 0x15, 0xc0, + 0xf3, 0xe1, 0xb8, 0x0f, 0x80, 0xbc, 0x62, 0x40, 0xde, 0x85, 0xd3, 0x28, 0x2f, 0x90, 0xe6, 0xc3, + 0xb7, 0x90, 0xd9, 0x1d, 0x0f, 0xc0, 0x7d, 0xb8, 0x4c, 0xa8, 0x94, 0x8f, 0x7a, 0x99, 0x5e, 0x66, + 0x92, 0x29, 0x79, 0x93, 0x0c, 0xd7, 0x4d, 0xd2, 0x01, 0xc5, 0x36, 0x1d, 0xb0, 0x6d, 0x36, 0x99, + 0x84, 0xd9, 0x66, 0x00, 0xc2, 0x65, 0xc3, 0x1c, 0x66, 0xbd, 0x7c, 0x9d, 0xb8, 0xdc, 0x21, 0x93, + 0x94, 0x4a, 0xe2, 0x28, 0x19, 0x67, 0x94, 0x12, 0xfe, 0xec, 0xc3, 0x6f, 0xc9, 0xe8, 0x37, 0xf9, + 0x24, 0x07, 0x20, 0x5c, 0x2c, 0xc7, 0x6a, 0xdc, 0x50, 0x48, 0xf4, 0xb1, 0x0c, 0xd5, 0xbe, 0x70, + 0x4a, 0xd3, 0xb0, 0x18, 0x3d, 0xd5, 0x0c, 0x01, 0x76, 0x86, 0xfc, 0x43, 0xe2, 0x15, 0x3e, 0x79, + 0x59, 0xb9, 0xa0, 0xde, 0x23, 0xc5, 0x2b, 0x06, 0x8d, 0x48, 0xd5, 0x4e, 0xf5, 0xc3, 0xc2, 0x9b, + 0x6b, 0x0d, 0x19, 0x57, 0xe4, 0x79, 0xe0, 0x98, 0x7a, 0xe4, 0x0b, 0xfd, 0x7b, 0x67, 0x38, 0x83, + 0xd4, 0x0c, 0x75, 0x01, 0x4f, 0x96, 0x1c, 0xcc, 0x0b, 0x8c, 0xde, 0x27, 0xe1, 0xf2, 0x2e, 0x90, + 0x53, 0x81, 0x7c, 0xb3, 0x1b, 0x89, 0xdb, 0x3f, 0x92, 0x24, 0xe3, 0x51, 0xf2, 0x67, 0xc2, 0x4a, + 0x96, 0xb3, 0x5e, 0x79, 0x18, 0x71, 0x28, 0x23, 0x1f, 0xf4, 0xc9, 0x58, 0xcb, 0xc2, 0xa9, 0x24, + 0x67, 0xd6, 0x24, 0x63, 0xde, 0xd0, 0x3e, 0x10, 0xac, 0x10, 0xfd, 0xc3, 0x5d, 0x19, 0xd1, 0x36, + 0xfd, 0x37, 0x94, 0x8b, 0x4b, 0xde, 0x0f, 0xd7, 0xae, 0x02, 0x3e, 0x3b, 0xe2, 0x81, 0xa0, 0x5d, + 0xc9, 0x44, 0xbd, 0x62, 0xb9, 0xa9, 0xad, 0x7a, 0x25, 0x53, 0xfd, 0x9a, 0x29, 0x40, 0x96, 0xcc, + 0xf4, 0x6b, 0xa6, 0x40, 0x5e, 0x4d, 0xf5, 0x6b, 0xa6, 0x7e, 0xc5, 0x4c, 0x2d, 0xcd, 0x4c, 0x7d, + 0x8d, 0x9a, 0xea, 0xd7, 0x4c, 0xf9, 0x8d, 0x9a, 0xe9, 0xd7, 0x4c, 0x81, 0x8a, 0x64, 0xaa, 0x5f, + 0xc9, 0x93, 0xfa, 0x35, 0xd3, 0x91, 0x3d, 0xca, 0xd4, 0x3f, 0x56, 0x9b, 0xa0, 0x5f, 0x53, 0xdd, + 0xdc, 0x93, 0xed, 0xed, 0xf7, 0xe8, 0x6b, 0x5c, 0xbf, 0xf2, 0xc2, 0xf3, 0xea, 0x1a, 0xf4, 0x6b, + 0xba, 0x88, 0x46, 0x1a, 0x36, 0xde, 0xda, 0x8a, 0xed, 0xf6, 0x38, 0xda, 0x5c, 0xf3, 0x64, 0xbf, + 0x86, 0xcd, 0x15, 0x6c, 0x50, 0x91, 0x59, 0xe9, 0x8d, 0x1a, 0x95, 0x03, 0xed, 0xca, 0x12, 0xc6, + 0x25, 0x35, 0xa2, 0x61, 0x83, 0x82, 0x25, 0x73, 0x0d, 0x1b, 0x0d, 0xc5, 0xed, 0x1f, 0x8a, 0x1a, + 0xa9, 0x98, 0x1a, 0xab, 0x98, 0x9a, 0xa8, 0xd8, 0x7c, 0x1f, 0xdb, 0x69, 0xd8, 0x98, 0x37, 0x83, + 0x7e, 0xa9, 0xef, 0xd2, 0xaf, 0xf5, 0xaa, 0xf9, 0xd0, 0x1e, 0x82, 0x84, 0x78, 0xc4, 0x81, 0x4a, + 0x8a, 0x1b, 0x93, 0x9c, 0xd6, 0x18, 0x17, 0x44, 0x20, 0x19, 0xe0, 0x72, 0xce, 0x32, 0x6a, 0xce, + 0x10, 0x15, 0xfd, 0xee, 0x50, 0x85, 0x9f, 0xf0, 0xad, 0xe4, 0x67, 0x35, 0xfc, 0xbc, 0x3b, 0x1c, + 0x5a, 0x7c, 0x0d, 0x5d, 0x70, 0x49, 0xd0, 0xa4, 0x28, 0xe5, 0x51, 0xe1, 0x4d, 0x3f, 0x2f, 0xb7, + 0x79, 0xa2, 0x06, 0xe5, 0x51, 0xed, 0x12, 0x7f, 0xec, 0x5b, 0x81, 0x90, 0x2a, 0x92, 0x51, 0x5c, + 0xf3, 0xe1, 0xb9, 0xdc, 0x2e, 0xe5, 0xf0, 0x93, 0x6b, 0x27, 0x10, 0x63, 0xb1, 0x2f, 0xe1, 0xc5, + 0x97, 0x40, 0xd0, 0x49, 0x81, 0x94, 0x7c, 0x52, 0x14, 0xe0, 0x9c, 0x44, 0x9e, 0x86, 0x62, 0xb0, + 0xd2, 0xb1, 0x03, 0x46, 0x9e, 0x67, 0x5e, 0x70, 0x24, 0x65, 0x90, 0x42, 0xc8, 0x0a, 0x5e, 0x22, + 0x20, 0x64, 0x8d, 0x94, 0xfc, 0x19, 0x14, 0x25, 0xc2, 0xc2, 0x0c, 0xc7, 0xf9, 0x71, 0x01, 0x88, + 0x09, 0x99, 0x9f, 0x12, 0x35, 0x15, 0x28, 0x37, 0x01, 0xc8, 0xe1, 0xbc, 0x57, 0xd6, 0x49, 0x89, + 0x48, 0xce, 0x30, 0xd4, 0xf0, 0x45, 0x8e, 0xb5, 0x26, 0xc7, 0x27, 0xe3, 0x32, 0x4d, 0x4b, 0x2b, + 0x86, 0x56, 0x6a, 0x29, 0x55, 0xa0, 0x92, 0x4a, 0xc9, 0x39, 0xea, 0x4e, 0x80, 0x77, 0x68, 0xa4, + 0xef, 0xc8, 0x2e, 0x14, 0x14, 0x1c, 0x5a, 0x23, 0xb5, 0x38, 0xa8, 0x44, 0x29, 0x78, 0x95, 0x15, + 0x28, 0x07, 0xe4, 0x34, 0x06, 0xb9, 0xde, 0x1a, 0xff, 0x23, 0x51, 0x40, 0x13, 0x40, 0x39, 0x03, + 0xfe, 0xff, 0xfa, 0xda, 0x64, 0x28, 0x12, 0x41, 0xe0, 0x4e, 0xfd, 0x39, 0x04, 0xd9, 0x0e, 0xdf, + 0x21, 0xab, 0x5f, 0x4a, 0x9a, 0x35, 0x4b, 0x48, 0x95, 0x4d, 0x61, 0x50, 0x2e, 0x62, 0x2c, 0xa7, + 0x6e, 0x91, 0xf4, 0xc8, 0x28, 0xbc, 0x60, 0xc4, 0xcb, 0x20, 0xf6, 0x4b, 0x25, 0x82, 0x20, 0x89, + 0x3b, 0xce, 0x7a, 0x20, 0xd6, 0xcb, 0x81, 0x33, 0x5a, 0xc7, 0x59, 0x51, 0x44, 0x7e, 0x00, 0x28, + 0x10, 0xd0, 0xc0, 0xc3, 0x07, 0x33, 0x3c, 0xc2, 0x07, 0x8a, 0x75, 0x2c, 0x7b, 0xb3, 0x2e, 0x03, + 0x4b, 0x13, 0x9b, 0x33, 0x80, 0x9d, 0xa7, 0x8c, 0xbd, 0x79, 0xcf, 0x91, 0x23, 0xb1, 0x23, 0x47, + 0xf2, 0x30, 0x93, 0x42, 0x50, 0x41, 0xd3, 0x68, 0xe8, 0x39, 0x24, 0x69, 0xd9, 0xa4, 0x1f, 0xfb, + 0xc2, 0x08, 0x12, 0x42, 0x1d, 0x90, 0x54, 0x60, 0x2a, 0x11, 0x33, 0xf8, 0xe1, 0x0b, 0x49, 0x25, + 0xe0, 0x3f, 0x29, 0xd4, 0x13, 0x59, 0x1f, 0x64, 0x87, 0xf8, 0x20, 0x5e, 0xcf, 0x87, 0x54, 0x36, + 0xea, 0x4d, 0x33, 0x31, 0x26, 0x34, 0x57, 0xe7, 0xc1, 0x14, 0x07, 0x88, 0x90, 0x0e, 0x4b, 0x0a, + 0x59, 0x69, 0x88, 0x88, 0xd4, 0x0b, 0xc3, 0x4a, 0x6b, 0xbd, 0x64, 0xb9, 0x69, 0x36, 0x0c, 0xc0, + 0x17, 0x0c, 0x43, 0x1b, 0x8d, 0x4b, 0x0b, 0x11, 0x56, 0xc1, 0xf1, 0x25, 0x47, 0xcc, 0x46, 0x5c, + 0xd3, 0x94, 0xcb, 0x4e, 0x0d, 0x42, 0x60, 0x84, 0xf2, 0x9c, 0x08, 0x41, 0x61, 0x6e, 0x41, 0xd1, + 0x21, 0xa0, 0x35, 0x3a, 0x87, 0xaa, 0xd0, 0x04, 0x75, 0x21, 0x28, 0x1a, 0x4d, 0xb9, 0x36, 0x18, + 0x89, 0x31, 0x44, 0xd5, 0x24, 0x23, 0x14, 0x05, 0x20, 0x04, 0x93, 0x92, 0x60, 0x2e, 0xf7, 0x42, + 0xe0, 0xec, 0xc3, 0x7e, 0x06, 0x24, 0x88, 0x2b, 0x5e, 0x52, 0x0e, 0xde, 0x80, 0x90, 0x79, 0x5e, + 0xcb, 0xc0, 0xcf, 0xc8, 0xc4, 0x01, 0x08, 0x53, 0x18, 0x72, 0x89, 0x85, 0x95, 0x5a, 0xd4, 0xc5, + 0x30, 0xc8, 0x84, 0xec, 0x0d, 0xb4, 0x88, 0xd3, 0x86, 0x48, 0xc6, 0x23, 0xd8, 0xc2, 0x40, 0x0b, + 0x8d, 0xb0, 0x10, 0x80, 0x31, 0xf0, 0x7a, 0xae, 0x60, 0xe0, 0x24, 0x2f, 0xcf, 0xb2, 0x3c, 0xce, + 0x1d, 0xbc, 0x7a, 0x40, 0x42, 0x48, 0x26, 0x96, 0x26, 0x1c, 0xd0, 0x94, 0x04, 0xa7, 0xb4, 0x01, + 0x51, 0x97, 0x62, 0xdb, 0xd4, 0x43, 0xef, 0x10, 0x7e, 0xa7, 0x08, 0xf1, 0x51, 0xc8, 0x91, 0x31, + 0xa8, 0xae, 0x05, 0x20, 0x2a, 0x99, 0xc9, 0x19, 0x22, 0xf1, 0x1c, 0xa9, 0x49, 0xb6, 0x1f, 0x8c, + 0x9d, 0x64, 0x48, 0xf2, 0xe4, 0x92, 0x9a, 0x34, 0x5c, 0x01, 0xa5, 0x9d, 0x68, 0x24, 0x29, 0x22, + 0x63, 0x62, 0x9e, 0xc3, 0xf1, 0x8c, 0xd7, 0xbb, 0xa2, 0x89, 0x03, 0x9a, 0xa7, 0x45, 0xca, 0x29, + 0x2d, 0x1a, 0x1a, 0xad, 0x75, 0x70, 0x07, 0x25, 0xb6, 0x86, 0x53, 0x88, 0xe1, 0x0b, 0x75, 0x61, + 0x14, 0xd0, 0x02, 0x23, 0xb4, 0x43, 0x13, 0x23, 0x57, 0x70, 0x99, 0x74, 0xc6, 0xc5, 0x53, 0x48, + 0x90, 0x62, 0xd7, 0x40, 0xfa, 0x9b, 0xcb, 0x7a, 0xa5, 0x5b, 0x13, 0x46, 0xa1, 0x39, 0x25, 0x22, + 0x25, 0x15, 0x39, 0x99, 0x10, 0x1a, 0xbd, 0x2f, 0x3c, 0xe6, 0xc2, 0x59, 0x80, 0x1c, 0x59, 0x00, + 0x4c, 0xcc, 0x22, 0x2d, 0x5e, 0x90, 0x82, 0xf0, 0x27, 0x16, 0x07, 0x8a, 0xb3, 0x80, 0x93, 0xa0, + 0x20, 0x8e, 0x86, 0x1c, 0x52, 0x38, 0x29, 0x76, 0x18, 0x87, 0x8c, 0x69, 0xc1, 0x09, 0xd3, 0x3c, + 0xe7, 0xcc, 0xa3, 0xe5, 0x72, 0xaa, 0x1c, 0xdd, 0xca, 0x91, 0x40, 0x98, 0xa9, 0x12, 0x05, 0x21, + 0x45, 0xca, 0x79, 0x57, 0xca, 0xb8, 0x4a, 0x21, 0x4f, 0x19, 0xc5, 0x44, 0x36, 0x8d, 0x86, 0x58, + 0xaa, 0x82, 0xc1, 0x9e, 0x0c, 0x90, 0xf4, 0x56, 0xe4, 0xc3, 0x12, 0xc8, 0x3c, 0x23, 0xd4, 0x36, + 0x67, 0x7f, 0x87, 0xf4, 0xd4, 0xc3, 0x5a, 0x3a, 0xc9, 0x76, 0x84, 0xc5, 0x24, 0x8b, 0x8b, 0xf3, + 0x7f, 0xb4, 0xd0, 0x33, 0x07, 0x94, 0x1c, 0x30, 0x0b, 0x2a, 0x3f, 0xca, 0x14, 0x4b, 0x73, 0x58, + 0xa1, 0xb2, 0x60, 0xad, 0x44, 0xec, 0x40, 0xa3, 0x50, 0xe5, 0x4a, 0xf2, 0x45, 0xee, 0x9c, 0x62, + 0x33, 0x40, 0x2c, 0xb2, 0xe6, 0x8d, 0xe4, 0x45, 0x7d, 0xc6, 0xe6, 0xc1, 0xe5, 0x2c, 0x2d, 0xe0, + 0xb8, 0x58, 0x1c, 0xc0, 0x03, 0x00, 0xa6, 0x88, 0x2a, 0xd9, 0xad, 0x6a, 0x91, 0xa2, 0x60, 0xac, + 0x30, 0x44, 0x1e, 0xb6, 0xca, 0x73, 0xbd, 0xbb, 0x01, 0x65, 0x92, 0x4f, 0x38, 0x0c, 0x3a, 0xfb, + 0x51, 0x8a, 0x6d, 0xa5, 0xc4, 0xf0, 0xb5, 0x76, 0x25, 0x07, 0xb3, 0x64, 0xeb, 0x61, 0x59, 0x1b, + 0x8a, 0xfc, 0x51, 0x27, 0x06, 0x0b, 0x24, 0x26, 0xab, 0xc8, 0x18, 0x44, 0x65, 0x1f, 0x30, 0xcd, + 0x05, 0x95, 0x80, 0x49, 0xb4, 0x9c, 0x68, 0x34, 0x34, 0x79, 0x27, 0xb9, 0x1c, 0x60, 0xea, 0xc0, + 0x3f, 0xb4, 0x66, 0x70, 0xcf, 0x79, 0xb6, 0xe5, 0x9a, 0x98, 0xe2, 0x68, 0xd9, 0xb8, 0x92, 0xeb, + 0xce, 0xac, 0x20, 0x37, 0x60, 0x9f, 0x67, 0x20, 0xab, 0xa0, 0xf9, 0xa3, 0x56, 0xdc, 0x32, 0xd4, + 0xee, 0x73, 0x64, 0x8b, 0x0d, 0x8a, 0xaf, 0x54, 0x41, 0x2c, 0xa0, 0xed, 0xa6, 0xa1, 0x49, 0xe4, + 0xe4, 0xf2, 0x41, 0x48, 0x0e, 0x4c, 0x62, 0x47, 0x44, 0xf3, 0xbe, 0x88, 0x2b, 0xb4, 0x10, 0x40, + 0xed, 0x00, 0x8d, 0x07, 0xb7, 0x04, 0x70, 0x69, 0x3c, 0x34, 0x83, 0x53, 0xe0, 0x56, 0x54, 0x01, + 0xc3, 0xc0, 0x4e, 0x4d, 0x4c, 0x2e, 0xb9, 0xa2, 0x08, 0x90, 0x72, 0xc1, 0x85, 0x40, 0xa8, 0x64, + 0xb4, 0x60, 0x32, 0x8a, 0x85, 0x4b, 0x9e, 0x1d, 0x00, 0x7d, 0xcc, 0xd6, 0x6a, 0xf7, 0xf5, 0x75, + 0x9e, 0x73, 0x71, 0x95, 0x72, 0x98, 0x21, 0x80, 0x21, 0xc0, 0xaf, 0x64, 0x14, 0xc9, 0x1f, 0x2f, + 0xa1, 0x03, 0xc0, 0x14, 0x79, 0x4d, 0x38, 0xde, 0xfe, 0x80, 0x29, 0x43, 0xd1, 0x86, 0xe3, 0x94, + 0xf9, 0x8b, 0xac, 0x11, 0xc9, 0x57, 0x43, 0xbf, 0x2d, 0xec, 0x15, 0x0a, 0x0b, 0xb8, 0x10, 0x90, + 0x21, 0xec, 0x1c, 0xae, 0x83, 0x65, 0x99, 0x92, 0x2e, 0xc3, 0x9a, 0xd3, 0x64, 0xbc, 0x2e, 0x80, + 0xf8, 0x22, 0xcd, 0xec, 0x38, 0x4b, 0x43, 0x8c, 0x41, 0x07, 0xfc, 0x89, 0x4a, 0x25, 0xb4, 0x26, + 0xad, 0x90, 0x5d, 0x05, 0x0d, 0xb8, 0x35, 0xef, 0x04, 0x25, 0xd0, 0x7d, 0x14, 0xfb, 0xbb, 0xa1, + 0x17, 0xea, 0x33, 0x27, 0x52, 0xbb, 0x23, 0xd4, 0x6e, 0xa5, 0x02, 0x7b, 0x22, 0x4a, 0x0f, 0x0b, + 0xcc, 0x73, 0xbe, 0x58, 0x06, 0x9f, 0x8f, 0x26, 0x63, 0x38, 0x9f, 0xae, 0xb1, 0x9b, 0x41, 0x3f, + 0xc9, 0x1a, 0x38, 0x14, 0x54, 0x01, 0xc9, 0x47, 0x7d, 0x11, 0xed, 0x18, 0x05, 0x1c, 0xf5, 0xd4, + 0xb0, 0x7e, 0x3b, 0xc6, 0x35, 0x79, 0x63, 0x25, 0x1f, 0x25, 0xc3, 0x26, 0x4d, 0xbb, 0xbb, 0xc0, + 0x70, 0xd2, 0x66, 0x7b, 0xcd, 0x21, 0x68, 0xf5, 0x97, 0x65, 0xf3, 0x0d, 0xaf, 0x8e, 0x5a, 0xf2, + 0xc3, 0x97, 0x24, 0xbc, 0xa5, 0x50, 0x82, 0x4d, 0x72, 0x06, 0x66, 0x96, 0xc1, 0xe5, 0xfe, 0x06, + 0x22, 0x45, 0xd2, 0x2f, 0x2c, 0xaf, 0x66, 0xfa, 0x42, 0x79, 0x1d, 0x92, 0x57, 0x29, 0x90, 0x53, + 0xde, 0x88, 0x4a, 0xdc, 0x66, 0x90, 0xa2, 0xa8, 0x8b, 0x73, 0x03, 0xb4, 0x60, 0x69, 0x15, 0x91, + 0xee, 0x70, 0x0e, 0x9e, 0xb6, 0x22, 0xf9, 0x22, 0xbf, 0xa9, 0x48, 0x25, 0x67, 0xc2, 0xa9, 0x26, + 0x46, 0x5e, 0x40, 0x48, 0x8e, 0xa0, 0xb7, 0x86, 0xb7, 0x53, 0x98, 0x61, 0xe2, 0x09, 0xcc, 0x0a, + 0x32, 0xe6, 0x1e, 0x2e, 0x22, 0xb0, 0xc7, 0x82, 0x2b, 0x38, 0xbd, 0x64, 0xa2, 0x42, 0x38, 0x7a, + 0x2c, 0x77, 0x9d, 0xa0, 0x72, 0x0d, 0x46, 0xce, 0x73, 0x2d, 0x89, 0x2b, 0x73, 0x69, 0x50, 0x28, + 0x69, 0x3d, 0xb4, 0x40, 0x6b, 0x39, 0x9f, 0x84, 0xd6, 0x20, 0x8e, 0x21, 0xe4, 0x80, 0x85, 0xf9, + 0xce, 0x13, 0xf6, 0x0c, 0x30, 0x04, 0x8f, 0x9b, 0x5c, 0x38, 0x19, 0xb3, 0x3d, 0xd6, 0xa5, 0x44, + 0x74, 0x28, 0xc0, 0x34, 0x52, 0x56, 0x86, 0xcd, 0x91, 0x7d, 0x36, 0xa9, 0x49, 0xb5, 0xb0, 0xe5, + 0xba, 0x64, 0x96, 0x39, 0x9a, 0xaa, 0x7c, 0x1d, 0xc0, 0xe4, 0x09, 0x68, 0xb8, 0x2f, 0x98, 0x70, + 0xdd, 0x38, 0x6b, 0xfa, 0x83, 0x00, 0x59, 0x37, 0xca, 0xa2, 0xc6, 0xc0, 0x32, 0xb7, 0x05, 0xcb, + 0xe6, 0x7e, 0x50, 0x58, 0x50, 0x46, 0x62, 0x70, 0xcf, 0xc5, 0xcb, 0x64, 0x49, 0x39, 0x5d, 0xca, + 0x35, 0x7e, 0xf0, 0x8e, 0xc1, 0x79, 0x0b, 0x6b, 0x12, 0xc4, 0x84, 0xc8, 0x54, 0x24, 0xc3, 0x9c, + 0x87, 0xb3, 0x61, 0x11, 0x10, 0x30, 0xeb, 0xb1, 0x36, 0x98, 0xf5, 0x4a, 0x58, 0x8d, 0x42, 0x5d, + 0xc9, 0x83, 0x0d, 0xc7, 0xc2, 0x7a, 0x06, 0xf0, 0x9c, 0x74, 0x10, 0x58, 0x9f, 0x04, 0xd6, 0x27, + 0xcc, 0x7a, 0xa3, 0x3b, 0x61, 0xb9, 0x0a, 0x9c, 0x27, 0xff, 0x71, 0x04, 0x50, 0x96, 0x63, 0x80, + 0xb2, 0x8c, 0x03, 0x94, 0xcd, 0x18, 0xf7, 0x1c, 0x4b, 0x6d, 0x04, 0x20, 0x8e, 0x59, 0xf8, 0x6d, + 0x48, 0xb6, 0x1b, 0x67, 0xc3, 0x0f, 0x40, 0x57, 0xfb, 0x70, 0x5c, 0x0e, 0xde, 0xa3, 0x50, 0x61, + 0x15, 0x0c, 0xfa, 0xd8, 0x40, 0x0f, 0x95, 0xe8, 0x21, 0xef, 0x73, 0x25, 0x4a, 0x09, 0x58, 0x0f, + 0x8d, 0x0a, 0x8a, 0xa8, 0x44, 0x11, 0xf9, 0xbe, 0x22, 0xae, 0x34, 0xcf, 0x65, 0xab, 0x65, 0x4d, + 0xcc, 0x94, 0xe8, 0x9e, 0x12, 0x4d, 0x34, 0xc3, 0xe1, 0xa0, 0x8a, 0x4a, 0x54, 0x31, 0x11, 0x4d, + 0x54, 0x41, 0x13, 0x93, 0xa0, 0x89, 0xac, 0x5b, 0x85, 0x88, 0x5b, 0x43, 0xb7, 0x70, 0x6f, 0x94, + 0x88, 0x5b, 0x24, 0xcc, 0xf2, 0x3e, 0x24, 0x36, 0xe5, 0xe7, 0xb7, 0xdc, 0xd5, 0xeb, 0x0f, 0x87, + 0x23, 0x3f, 0x02, 0x6e, 0x84, 0xb2, 0xfd, 0xc3, 0x0a, 0x98, 0xb3, 0x7e, 0x56, 0xb4, 0x9c, 0xcd, + 0x80, 0x21, 0x8f, 0xd2, 0x7d, 0xa6, 0x65, 0x07, 0x44, 0x68, 0x0a, 0x5e, 0x6e, 0x1b, 0xf6, 0x42, + 0xc0, 0xce, 0x11, 0xa1, 0xe1, 0xb8, 0xd9, 0x0e, 0x49, 0x3d, 0x0d, 0xe1, 0xf6, 0x07, 0x41, 0xb8, + 0x99, 0x9a, 0x82, 0x3c, 0xdb, 0xd3, 0x03, 0xe0, 0xa5, 0xa4, 0x26, 0x7b, 0x46, 0x64, 0x8e, 0x67, + 0x7d, 0xdd, 0x71, 0x0d, 0x4b, 0xf0, 0xfb, 0x61, 0xd3, 0x28, 0x4a, 0x1b, 0x05, 0x69, 0xf7, 0x45, + 0x52, 0xf0, 0x3d, 0xf2, 0x8c, 0x87, 0xe2, 0x39, 0xce, 0x49, 0x1f, 0x41, 0x8d, 0xbb, 0x84, 0xc1, + 0xb8, 0x88, 0x65, 0x6a, 0x4d, 0xf7, 0x6a, 0xe7, 0x9e, 0xd4, 0x47, 0x32, 0xd3, 0x24, 0x14, 0xd6, + 0xb0, 0xc1, 0x0c, 0xdf, 0x36, 0x94, 0x33, 0xc8, 0x77, 0xd1, 0x3c, 0xd6, 0xcd, 0x31, 0x85, 0x29, + 0xd6, 0x5b, 0xec, 0x45, 0x58, 0x5d, 0xc7, 0xb6, 0x29, 0x1b, 0x6e, 0xb5, 0x0a, 0xf9, 0x92, 0x64, + 0x94, 0x2f, 0x49, 0xc6, 0xf9, 0x92, 0x83, 0x51, 0xd2, 0xeb, 0xd5, 0xa7, 0xe5, 0xdf, 0x05, 0x49, + 0x3d, 0x85, 0x9c, 0xb8, 0x11, 0xb0, 0x98, 0xa5, 0x20, 0x66, 0x75, 0xfc, 0xb3, 0xb5, 0x53, 0xf4, + 0xc9, 0x54, 0x13, 0xe6, 0x2a, 0x13, 0x53, 0xa5, 0x9d, 0xaa, 0x05, 0x70, 0x74, 0x02, 0xb1, 0x16, + 0x33, 0x88, 0xd5, 0xcc, 0x20, 0x56, 0x33, 0x85, 0x58, 0xb3, 0x19, 0xc4, 0x6a, 0x66, 0x10, 0xab, + 0x7f, 0xf4, 0xfb, 0x14, 0x62, 0xcd, 0xa7, 0x10, 0xeb, 0x36, 0x55, 0x81, 0xe4, 0x2c, 0xad, 0x66, + 0x4e, 0xe5, 0x91, 0xee, 0x4f, 0x6e, 0x67, 0x79, 0x0c, 0x84, 0xf6, 0x31, 0xfc, 0xb3, 0x19, 0xee, + 0x84, 0x89, 0xe2, 0xa0, 0x7d, 0x54, 0x3d, 0xf6, 0x16, 0x74, 0xa5, 0x19, 0x6f, 0x48, 0x85, 0xe5, + 0x22, 0xb1, 0x47, 0x19, 0x08, 0x59, 0xd7, 0x6e, 0x7f, 0x62, 0x6b, 0xa4, 0x15, 0x11, 0x04, 0xf5, + 0x11, 0x90, 0xf9, 0x71, 0x0b, 0x90, 0x0e, 0xf7, 0x41, 0x3f, 0xba, 0x53, 0x52, 0x6e, 0x4d, 0x1c, + 0xc1, 0xa6, 0xa3, 0x1b, 0x14, 0x3f, 0x4e, 0x00, 0x52, 0xcd, 0x25, 0x4b, 0x4c, 0xff, 0x10, 0x34, + 0x77, 0x9c, 0x83, 0x08, 0xc8, 0x28, 0xc3, 0xa4, 0xc9, 0x18, 0x26, 0xed, 0xc3, 0x06, 0x6d, 0x83, + 0xae, 0xf0, 0x7e, 0xc3, 0x67, 0x84, 0x37, 0x6a, 0xc7, 0x1b, 0xb8, 0x17, 0x2a, 0xa0, 0xa3, 0x9a, + 0xf5, 0x50, 0xe3, 0x2e, 0xda, 0xbd, 0xaa, 0xf5, 0x4c, 0x6e, 0x42, 0x7f, 0xce, 0xb7, 0xa4, 0x3f, + 0xbf, 0x5e, 0x7c, 0x84, 0x96, 0x6d, 0xae, 0x4e, 0xc2, 0x6d, 0xf2, 0x78, 0x34, 0x10, 0x1e, 0xa6, + 0x15, 0xee, 0x8c, 0xc7, 0xb9, 0xdb, 0x2b, 0xb5, 0x5a, 0x36, 0xdd, 0xa2, 0xf9, 0xf0, 0x2b, 0x3f, + 0xdb, 0xb3, 0x7a, 0xfe, 0xd0, 0xb7, 0xea, 0x33, 0xde, 0xc2, 0xf4, 0x0b, 0xbf, 0x5f, 0xe9, 0xbf, + 0xe6, 0xf7, 0xab, 0x53, 0x7f, 0xd4, 0xa4, 0x7a, 0x1e, 0x6e, 0x7b, 0x0f, 0x84, 0xee, 0xae, 0xc7, + 0x84, 0xf8, 0x69, 0x99, 0xfb, 0x49, 0xe1, 0x66, 0xdc, 0xfd, 0x24, 0xee, 0xfb, 0x1d, 0x89, 0xd3, + 0x7f, 0x1f, 0x99, 0x08, 0x01, 0xae, 0x7f, 0xdb, 0x4f, 0xe1, 0xe6, 0xf3, 0x84, 0x82, 0x8d, 0x50, + 0x40, 0x39, 0xcc, 0x7e, 0x02, 0xcb, 0x6e, 0x42, 0x20, 0x8b, 0x10, 0xc0, 0x8d, 0x78, 0x11, 0x02, + 0xfd, 0x98, 0x0d, 0x6f, 0x62, 0x4c, 0x40, 0x88, 0xb3, 0x9f, 0x40, 0xbf, 0x19, 0x13, 0xb8, 0x88, + 0x11, 0x68, 0x56, 0xb7, 0x93, 0xeb, 0x49, 0xf2, 0x8b, 0x8f, 0x5b, 0x89, 0x37, 0xd7, 0x83, 0xc4, + 0x87, 0xc7, 0xa7, 0x55, 0xcf, 0xf1, 0xc8, 0x1f, 0xe6, 0x11, 0x7d, 0xff, 0x5f, 0x23, 0x6f, 0xe1, + 0x3a, 0xbd, 0xa1, 0x8e, 0xaf, 0xd6, 0xdb, 0xeb, 0xfa, 0xee, 0x45, 0xb8, 0xae, 0xc7, 0x6a, 0xe2, + 0xa7, 0x45, 0xa8, 0xdd, 0xd3, 0x22, 0x14, 0xbf, 0x48, 0xeb, 0xd7, 0x13, 0x4e, 0x69, 0x2d, 0xdb, + 0xbe, 0x1f, 0x1a, 0x5f, 0xf7, 0x42, 0xef, 0xe2, 0x85, 0x0a, 0x4f, 0x7d, 0x55, 0x77, 0x8b, 0x25, + 0x3e, 0xeb, 0xcf, 0x78, 0x9a, 0xba, 0xea, 0x37, 0xed, 0xfd, 0xaf, 0x1a, 0x13, 0x93, 0x17, 0x1a, + 0xe1, 0x89, 0xe2, 0xb3, 0x31, 0xe3, 0xd1, 0xd5, 0xa3, 0x81, 0x9c, 0x1f, 0x30, 0x90, 0x7f, 0x9c, + 0xb7, 0xd7, 0x8a, 0x5f, 0x3b, 0xf0, 0x8f, 0x47, 0x23, 0x39, 0xff, 0x81, 0x91, 0x74, 0xbf, 0x1f, + 0xd2, 0xf9, 0xef, 0x78, 0xc0, 0x57, 0xac, 0xfb, 0xdf, 0x7f, 0xa4, 0xfb, 0x93, 0x43, 0xba, 0x3f, + 0x21, 0xf2, 0xb1, 0xde, 0x4f, 0xbe, 0xa3, 0xf7, 0xe9, 0x18, 0xde, 0xf7, 0xa3, 0xf1, 0xfc, 0x71, + 0xc0, 0x78, 0xfe, 0xa0, 0xd1, 0xcc, 0x87, 0xf1, 0xc7, 0x9e, 0x61, 0x68, 0x19, 0x44, 0x7a, 0x9c, + 0x1a, 0x37, 0x1a, 0x48, 0x78, 0x68, 0xff, 0x23, 0x56, 0x5c, 0x1c, 0xd0, 0xf5, 0x45, 0xbd, 0x79, + 0x58, 0xd7, 0xfc, 0x0c, 0xc3, 0xf9, 0x08, 0x2e, 0xbe, 0x7b, 0x04, 0xb3, 0x71, 0xfc, 0x75, 0x88, + 0x48, 0xfe, 0xc2, 0x73, 0xd0, 0x62, 0x32, 0xf9, 0xeb, 0xfb, 0x57, 0xc4, 0xa6, 0x7b, 0x37, 0x32, + 0xe0, 0x64, 0xdf, 0xff, 0xe7, 0xe6, 0xa6, 0x6d, 0x36, 0xea, 0xac, 0x5e, 0xb6, 0x1d, 0xeb, 0x2f, + 0xfd, 0xed, 0x8c, 0xe0, 0xdd, 0x7a, 0x6b, 0x41, 0xf8, 0xa9, 0xca, 0x49, 0x59, 0xc6, 0xac, 0x08, + 0x2a, 0x84, 0x22, 0xa6, 0x74, 0x35, 0xa7, 0xa2, 0x23, 0x44, 0x1e, 0xd5, 0x90, 0x44, 0x08, 0xde, + 0xdd, 0x4c, 0x09, 0x3e, 0x4d, 0x6f, 0x9c, 0x36, 0x8f, 0x8d, 0x70, 0x46, 0x30, 0x3a, 0x4d, 0x49, + 0x14, 0x4e, 0xed, 0xe5, 0x8e, 0x6b, 0xfc, 0x38, 0x2e, 0x11, 0xd2, 0xe5, 0xbb, 0x91, 0x1c, 0xde, + 0x41, 0x0e, 0xab, 0x7b, 0x5e, 0x57, 0x83, 0xe8, 0x86, 0xc7, 0x44, 0x57, 0x17, 0xfc, 0x78, 0xab, + 0xa3, 0xf4, 0xa7, 0xe7, 0xcf, 0xa4, 0xc9, 0xac, 0xa9, 0xae, 0x4e, 0xf8, 0x45, 0x86, 0x34, 0xcb, + 0x48, 0x0b, 0x53, 0x9d, 0xac, 0x5b, 0xf8, 0x47, 0xb4, 0xd1, 0x45, 0x9a, 0xd8, 0xea, 0xaf, 0xc5, + 0x7d, 0xab, 0x68, 0x1f, 0x8b, 0x34, 0xc8, 0xa4, 0xc1, 0x39, 0xbf, 0x5f, 0x4e, 0xd1, 0x76, 0x15, + 0x69, 0xe7, 0xaa, 0x53, 0x7e, 0xd3, 0xe2, 0xb9, 0x3a, 0x72, 0xb1, 0x36, 0xbe, 0xba, 0xf8, 0xd4, + 0xb6, 0xf7, 0xea, 0xc8, 0xc7, 0x5a, 0xe4, 0xd5, 0x6f, 0x5f, 0x88, 0x4d, 0x8b, 0x46, 0x1d, 0xe5, + 0xb1, 0x36, 0x85, 0xf4, 0xd4, 0xad, 0x56, 0x44, 0xa9, 0x88, 0xb5, 0x2a, 0xab, 0xf3, 0x7a, 0xb1, + 0xbc, 0x5a, 0x7d, 0x52, 0x47, 0x65, 0x94, 0x83, 0x69, 0x75, 0xd1, 0xd4, 0x4b, 0xe2, 0x60, 0x9c, + 0xc9, 0x5a, 0x9a, 0x7c, 0x36, 0xd4, 0x2a, 0xca, 0x68, 0x6d, 0xaa, 0x97, 0xf5, 0x35, 0xb1, 0x51, + 0x47, 0x19, 0xad, 0x6d, 0x75, 0xfa, 0x1e, 0x0f, 0x6c, 0x3d, 0xd2, 0x51, 0x5e, 0xeb, 0x2c, 0xb4, + 0x39, 0xed, 0xa8, 0x59, 0x94, 0xd5, 0xda, 0x55, 0xe7, 0x0f, 0xcb, 0xe5, 0x62, 0x79, 0x4b, 0xad, + 0xa2, 0xcc, 0xd6, 0xbe, 0xba, 0xfc, 0x44, 0xeb, 0xa3, 0x43, 0x97, 0x51, 0x86, 0xeb, 0x7c, 0xdb, + 0x8a, 0x24, 0xa7, 0xa3, 0x4c, 0xd7, 0xc5, 0xb6, 0x5d, 0x98, 0x69, 0x94, 0xf3, 0xba, 0xdc, 0x91, + 0x7c, 0x49, 0x0d, 0xa3, 0xec, 0x37, 0xc4, 0xfe, 0xfb, 0x7a, 0xcd, 0x23, 0x34, 0x51, 0x09, 0x18, + 0xbd, 0x6d, 0xf5, 0x6a, 0xf9, 0x91, 0x5a, 0xc6, 0x97, 0xbb, 0x19, 0xb7, 0xfc, 0x6f, 0x6a, 0x1a, + 0x95, 0x86, 0xb1, 0xd5, 0xc5, 0x66, 0xbd, 0xba, 0x42, 0xcf, 0x51, 0x71, 0x98, 0x6c, 0x68, 0x04, + 0x79, 0x98, 0xa8, 0x3c, 0x8c, 0x1b, 0xda, 0xa1, 0xcf, 0xa8, 0x40, 0x8c, 0x0f, 0x0a, 0xcb, 0xd4, + 0xa2, 0x12, 0x31, 0x79, 0xf5, 0x62, 0x79, 0xbd, 0x5e, 0x41, 0xf7, 0x4d, 0x54, 0x1e, 0xa6, 0x18, + 0x96, 0x93, 0x89, 0x0a, 0xc2, 0x94, 0xa1, 0x0d, 0x49, 0xd6, 0x44, 0xa5, 0x60, 0xd3, 0xa1, 0xd5, + 0xa0, 0x2f, 0x36, 0x2a, 0x0b, 0xab, 0x43, 0xdb, 0x97, 0xb4, 0x55, 0x90, 0x59, 0xb1, 0x51, 0x59, + 0x58, 0x33, 0x50, 0xa5, 0x25, 0x60, 0xe3, 0xe6, 0xc7, 0xee, 0x56, 0x3c, 0x4b, 0xd7, 0x46, 0xa5, + 0x61, 0x33, 0xd1, 0xfb, 0x9b, 0x07, 0x62, 0x9f, 0x8d, 0x0a, 0xc3, 0xba, 0xea, 0x72, 0x5d, 0xdf, + 0xdc, 0x90, 0x09, 0xf9, 0x13, 0xf6, 0x9d, 0xda, 0x46, 0x25, 0x62, 0x07, 0x83, 0x74, 0x7e, 0x64, + 0xa3, 0xf2, 0xb0, 0xf9, 0x56, 0xdb, 0xc8, 0x06, 0xd8, 0xa8, 0x44, 0x6c, 0x51, 0x91, 0xaf, 0xf8, + 0x8c, 0x7d, 0xa6, 0x23, 0x1b, 0x15, 0x8a, 0x2d, 0xb7, 0xe4, 0x48, 0x2c, 0x36, 0x2a, 0x96, 0x4c, + 0x6c, 0xd3, 0xb2, 0x5d, 0x93, 0xd1, 0x8d, 0x0a, 0x24, 0xd3, 0x15, 0xcf, 0xf2, 0xfd, 0x0a, 0x9b, + 0xd2, 0x51, 0x16, 0x95, 0x47, 0x46, 0x16, 0x6a, 0xb1, 0x6e, 0x3f, 0xad, 0xd6, 0x1f, 0x7a, 0x6a, + 0x17, 0x15, 0x48, 0x66, 0x47, 0xed, 0x68, 0x80, 0x59, 0x7c, 0x63, 0x80, 0xb1, 0x5a, 0x53, 0xa4, + 0x75, 0x57, 0x83, 0x62, 0x54, 0x20, 0x99, 0x63, 0x8a, 0xb4, 0x64, 0x68, 0x17, 0xe5, 0xd9, 0x44, + 0xe5, 0x91, 0xf9, 0xea, 0xf7, 0xf0, 0x5c, 0x55, 0x6a, 0x16, 0x95, 0x48, 0x96, 0x0f, 0xcf, 0x61, + 0xa3, 0x56, 0x51, 0x79, 0x64, 0x85, 0xec, 0x5c, 0xaf, 0xde, 0x52, 0xab, 0xa8, 0x38, 0xb2, 0x32, + 0xb4, 0x7a, 0x45, 0xad, 0xa2, 0xc2, 0x70, 0xa9, 0xb4, 0x7a, 0x4b, 0xb4, 0x5c, 0x54, 0x18, 0x4e, + 0x87, 0x56, 0x44, 0xcb, 0x45, 0x25, 0xe1, 0x48, 0x33, 0xc8, 0xe5, 0x78, 0x20, 0xa6, 0xb9, 0xa8, + 0x18, 0x9c, 0xad, 0xfe, 0xa8, 0xf1, 0xb0, 0x5d, 0xf8, 0xff, 0x47, 0x2e, 0x2a, 0x04, 0x97, 0xd1, + 0x6a, 0x5f, 0xc8, 0x3b, 0x8e, 0x83, 0x3d, 0x70, 0xf1, 0x2d, 0xda, 0xed, 0x1a, 0xcb, 0xae, 0xef, + 0xa2, 0xa2, 0x70, 0x7e, 0xd7, 0x56, 0x0c, 0xbe, 0x8b, 0xca, 0xc3, 0xe5, 0xb2, 0x08, 0x59, 0x20, + 0x2e, 0x2a, 0x10, 0x57, 0x54, 0xaf, 0x4e, 0xff, 0x97, 0x5a, 0x44, 0x85, 0xe1, 0xca, 0xea, 0xf5, + 0x43, 0xb7, 0x59, 0xa8, 0xd3, 0xd5, 0x5d, 0x4b, 0x4b, 0xc0, 0x45, 0x05, 0xe2, 0x77, 0xda, 0x81, + 0x9d, 0xd9, 0x47, 0x65, 0xe2, 0x75, 0x15, 0x5c, 0x97, 0xc0, 0x1e, 0x1f, 0x15, 0x8c, 0x37, 0xd5, + 0xdb, 0xbe, 0x59, 0x74, 0x78, 0x5c, 0x2d, 0xb5, 0x8b, 0xca, 0xc6, 0xdb, 0xea, 0x6c, 0xbd, 0x20, + 0x96, 0x98, 0x54, 0x3b, 0x6a, 0x18, 0x15, 0x8e, 0xcf, 0xaa, 0x7f, 0x3d, 0xdc, 0xde, 0x62, 0x7b, + 0xf3, 0x51, 0xa1, 0x78, 0x57, 0x9d, 0xd5, 0x5d, 0xbb, 0xe1, 0x3e, 0xe3, 0x9e, 0x93, 0x17, 0x25, + 0xa2, 0x2e, 0x31, 0xdd, 0xa8, 0x28, 0x7c, 0x2e, 0x46, 0xf2, 0x53, 0xfd, 0xb1, 0xa5, 0x05, 0xe6, + 0xa3, 0xc2, 0xf0, 0x45, 0x75, 0x72, 0xf6, 0x9a, 0x5a, 0x44, 0x85, 0xe1, 0x4b, 0xea, 0xb2, 0xeb, + 0xd4, 0x1b, 0x3c, 0x2a, 0x5a, 0x15, 0xd4, 0x34, 0x2a, 0x8d, 0x3c, 0xad, 0xa4, 0x15, 0x30, 0x45, + 0xf2, 0xdc, 0xa2, 0xd2, 0xc8, 0xf5, 0xae, 0x21, 0xcd, 0x23, 0x8f, 0xca, 0x22, 0x37, 0xbb, 0x86, + 0x96, 0x1a, 0x46, 0x85, 0x91, 0xdb, 0x5d, 0xc3, 0x8c, 0x1a, 0x46, 0x85, 0x91, 0x87, 0xed, 0x63, + 0x33, 0xf8, 0x44, 0x79, 0x54, 0x24, 0xb9, 0xab, 0xfe, 0xac, 0x3f, 0xa0, 0x49, 0x54, 0x1e, 0xb9, + 0xaf, 0x5e, 0xb7, 0x9b, 0x96, 0x94, 0xe3, 0x28, 0x1f, 0x09, 0x03, 0xa8, 0x18, 0xbb, 0xef, 0x3b, + 0xe7, 0xff, 0x82, 0x16, 0x72, 0xdf, 0x36, 0xab, 0xe5, 0x75, 0xbd, 0xfe, 0xa2, 0x44, 0xa1, 0x36, + 0x2b, 0xf5, 0x5c, 0x1e, 0x29, 0x2c, 0x11, 0x5e, 0xf8, 0x7f, 0x8b, 0x0a, 0x5d, 0x90, 0xd3, 0x5f, + 0x71, 0xa4, 0xf7, 0xfc, 0x99, 0x9c, 0xab, 0xbe, 0x75, 0x01, 0x45, 0x3a, 0x27, 0x78, 0xfa, 0xf4, + 0xc1, 0x17, 0x98, 0x9f, 0x82, 0x62, 0x1c, 0x7c, 0x85, 0xfd, 0x09, 0xeb, 0xfe, 0x8e, 0xa6, 0x71, + 0xf0, 0x25, 0xd9, 0x4f, 0xb4, 0xc1, 0xd6, 0xf7, 0xea, 0xec, 0xd9, 0xc5, 0xee, 0x1a, 0x62, 0xc0, + 0x37, 0x2e, 0x73, 0x74, 0x19, 0xb1, 0x2d, 0xf4, 0x06, 0x76, 0xcd, 0x86, 0x3a, 0x44, 0xad, 0x37, + 0xf7, 0xef, 0x04, 0x5d, 0x7a, 0x59, 0xf7, 0x1b, 0xbc, 0x8d, 0x3d, 0xa8, 0xd2, 0xfe, 0xd0, 0xeb, + 0xe5, 0xd9, 0x28, 0xf4, 0x3a, 0x7b, 0x2a, 0xf4, 0xfa, 0xad, 0xbd, 0xa9, 0xc9, 0x10, 0x45, 0x03, + 0xaf, 0xc1, 0xa4, 0x7c, 0xa1, 0xc8, 0x31, 0x1a, 0x7b, 0x0d, 0xc3, 0x97, 0xb8, 0xe8, 0xed, 0xb2, + 0xfb, 0x12, 0x8d, 0xc1, 0x4e, 0xc8, 0x34, 0x5d, 0x2b, 0xbc, 0xbd, 0x66, 0x60, 0xf0, 0xfe, 0xcd, + 0x8a, 0xd9, 0xc2, 0xf4, 0xfa, 0xa7, 0x08, 0xba, 0x1d, 0xc1, 0xdd, 0x05, 0xd1, 0x98, 0xec, 0xac, + 0x5e, 0x6f, 0x62, 0x94, 0xc8, 0x9c, 0x74, 0xab, 0x87, 0xeb, 0x68, 0x24, 0xf6, 0x67, 0xfd, 0xb1, + 0x8e, 0x06, 0x60, 0x6f, 0x9b, 0xb6, 0x5e, 0xc6, 0x43, 0xaf, 0x97, 0xab, 0x75, 0xdb, 0x47, 0x79, + 0xac, 0x87, 0xf8, 0x2d, 0x1e, 0x72, 0x0d, 0x0e, 0x2b, 0xde, 0xa4, 0x76, 0x1f, 0x93, 0x03, 0xc5, + 0x5d, 0x17, 0x0f, 0xcb, 0xbe, 0x8d, 0x76, 0x94, 0x55, 0xe7, 0x8b, 0x8f, 0xed, 0xf2, 0xba, 0xed, + 0xba, 0x78, 0xbc, 0x45, 0x71, 0x74, 0xfb, 0x35, 0xda, 0x85, 0x87, 0xe7, 0xa7, 0xfe, 0xa9, 0xe0, + 0xfb, 0xc5, 0xe3, 0xac, 0xff, 0xf0, 0xd3, 0xf3, 0x57, 0x0f, 0xd1, 0x91, 0x14, 0xe4, 0xf8, 0xd7, + 0xdd, 0xea, 0x96, 0x7c, 0xb9, 0x78, 0x68, 0x75, 0x71, 0x0f, 0xd7, 0x3b, 0x1e, 0x51, 0x9d, 0x91, + 0x26, 0xb4, 0xb1, 0x99, 0x20, 0x96, 0x62, 0x66, 0x98, 0x78, 0x08, 0x75, 0xd2, 0xb6, 0x4d, 0x94, + 0xbe, 0xad, 0xfe, 0xbd, 0x58, 0x6e, 0xea, 0xdb, 0xe8, 0xaa, 0xcf, 0x48, 0x77, 0xee, 0xf1, 0x68, + 0xdd, 0x75, 0xb4, 0x09, 0xac, 0xeb, 0xf2, 0xba, 0x6f, 0xea, 0xa8, 0xcc, 0x10, 0x29, 0xb5, 0x75, + 0x7c, 0x14, 0x79, 0x75, 0xf1, 0xbe, 0x5d, 0x5f, 0x45, 0x65, 0x4a, 0xc1, 0xd1, 0x1f, 0x71, 0xf5, + 0xa5, 0xb0, 0x08, 0x67, 0x7d, 0x16, 0x0f, 0x88, 0x7e, 0x5b, 0x7f, 0xf9, 0x14, 0xa5, 0x4e, 0x41, + 0xd0, 0xbf, 0x1e, 0x62, 0x1c, 0xa6, 0xb8, 0xe7, 0xf7, 0xf5, 0x93, 0x2c, 0xa2, 0x90, 0xe7, 0xbc, + 0xfd, 0xf4, 0x7e, 0x11, 0x0f, 0x73, 0x2e, 0xdb, 0xf5, 0x66, 0x11, 0xb7, 0x02, 0x56, 0x1c, 0xea, + 0x78, 0x4c, 0xf3, 0xaa, 0x69, 0x6f, 0x9e, 0x68, 0x40, 0x3a, 0xfd, 0xa5, 0x5e, 0x46, 0x4f, 0x17, + 0xe2, 0xcc, 0xa9, 0x33, 0xda, 0x27, 0xe3, 0x31, 0xcc, 0x8b, 0x87, 0xcd, 0xc3, 0x5d, 0x4c, 0xb9, + 0x29, 0x76, 0x79, 0x4d, 0x0c, 0x20, 0x2e, 0xc4, 0xc3, 0x16, 0x6a, 0xb0, 0x6e, 0x63, 0x86, 0x85, + 0xa2, 0x15, 0xd2, 0x96, 0xbb, 0xfa, 0x36, 0x1e, 0xa5, 0xd0, 0xf9, 0xab, 0xee, 0x21, 0x1e, 0x9b, + 0xbc, 0x15, 0xd8, 0xf4, 0x9f, 0xea, 0xb2, 0xad, 0x63, 0xc2, 0x22, 0x32, 0x97, 0x8b, 0xfa, 0xae, + 0x8e, 0x49, 0x9a, 0xc8, 0xbc, 0xb8, 0x5f, 0x2f, 0xc8, 0x07, 0x02, 0x47, 0xf6, 0xed, 0xf2, 0x33, + 0x08, 0xf7, 0xdd, 0x21, 0x10, 0x6e, 0x40, 0x56, 0x2f, 0xee, 0xdb, 0xf6, 0xfa, 0x31, 0x86, 0xfb, + 0xee, 0x50, 0x0c, 0xf7, 0xdd, 0x1e, 0x28, 0xfb, 0xd5, 0xdf, 0xe8, 0xff, 0xd5, 0x72, 0xd3, 0x2e, + 0xfb, 0xc5, 0xe6, 0xcb, 0xa3, 0x31, 0xbc, 0xfa, 0x9e, 0x31, 0xcc, 0xd0, 0xe4, 0xb3, 0x29, 0x9a, + 0xfc, 0xb2, 0xfe, 0xb8, 0x5a, 0x03, 0xb9, 0x3e, 0x23, 0x9b, 0xdf, 0x6e, 0xfa, 0x47, 0x88, 0xf2, + 0x7d, 0xdf, 0x6d, 0x3d, 0x00, 0x7e, 0x85, 0x1b, 0xbf, 0xbc, 0x2c, 0x86, 0x29, 0xcf, 0x2a, 0x5f, + 0x62, 0xb9, 0xbe, 0xfb, 0x11, 0x78, 0x1b, 0x5e, 0x92, 0xf7, 0xa3, 0x10, 0xf3, 0x7d, 0xbf, 0x7c, + 0x4c, 0xf4, 0x47, 0x61, 0xe6, 0xfb, 0xbe, 0x9f, 0x4e, 0x9e, 0xdf, 0xc4, 0xfc, 0x14, 0xcd, 0x51, + 0x2d, 0xc3, 0x8c, 0x24, 0x18, 0x2b, 0x92, 0x67, 0xc2, 0xaf, 0x82, 0xeb, 0xf3, 0x52, 0x8d, 0xde, + 0xb7, 0x30, 0xec, 0x26, 0x2c, 0x5e, 0x1d, 0xc4, 0x1b, 0xa4, 0xbb, 0xf3, 0x5c, 0x4f, 0x31, 0x1e, + 0xb5, 0xe5, 0x35, 0xdc, 0xb0, 0xfa, 0xfe, 0xbe, 0xfb, 0x32, 0x59, 0x59, 0x7c, 0xfa, 0x6a, 0xf5, + 0x59, 0x85, 0xb7, 0x49, 0xf1, 0x2b, 0xf0, 0xa4, 0xcf, 0x93, 0xd3, 0x4a, 0x5d, 0x6d, 0xf3, 0x78, + 0x3f, 0x1f, 0x7a, 0xd9, 0x29, 0x5d, 0x26, 0x6e, 0x32, 0xed, 0x12, 0x87, 0x5e, 0xf4, 0x92, 0x2e, + 0x6a, 0x79, 0x5d, 0xf7, 0xc7, 0xbb, 0x09, 0xc0, 0x3d, 0x53, 0x9b, 0xf7, 0xeb, 0xd5, 0xc3, 0xed, + 0x7b, 0x75, 0x2f, 0x2b, 0x4f, 0xed, 0xb8, 0xd3, 0x7c, 0xd1, 0x72, 0xf5, 0x99, 0x3e, 0x98, 0x3b, + 0xec, 0xbb, 0x8f, 0x28, 0x98, 0x40, 0xc1, 0xec, 0xa1, 0xe0, 0xf6, 0x52, 0xf8, 0x59, 0x7d, 0x00, + 0xe4, 0x84, 0xfd, 0x4d, 0x21, 0x03, 0x32, 0xa6, 0x76, 0x19, 0xa8, 0x5d, 0xee, 0x1b, 0x8f, 0x71, + 0xa2, 0x8f, 0x4e, 0x14, 0xd2, 0x3b, 0x24, 0xf4, 0x03, 0xd1, 0xbb, 0xfe, 0x97, 0xfd, 0xac, 0x12, + 0x96, 0xfe, 0x67, 0xbb, 0xbc, 0xf8, 0x7d, 0x60, 0xa3, 0xd4, 0xc4, 0x13, 0x8e, 0xf8, 0x39, 0x35, + 0x7c, 0xc1, 0x02, 0xbf, 0x5a, 0xad, 0x36, 0x24, 0x93, 0xe5, 0xcd, 0xe2, 0x76, 0xe7, 0x82, 0x83, + 0xc4, 0x4c, 0xe9, 0xdf, 0x4c, 0x95, 0xfe, 0x72, 0x71, 0x47, 0x6e, 0x11, 0xef, 0x26, 0x8f, 0xf4, + 0x7d, 0x39, 0xc9, 0x41, 0xe3, 0xb5, 0x80, 0x7f, 0xb3, 0x2a, 0x60, 0x4b, 0x11, 0x88, 0xd1, 0x43, + 0xdd, 0xd1, 0x30, 0xaf, 0x17, 0x77, 0x0a, 0x8a, 0x71, 0xe8, 0xa2, 0x79, 0x73, 0x2a, 0x14, 0x74, + 0x4f, 0x21, 0x1a, 0xbf, 0x4c, 0x43, 0xf1, 0x0a, 0xb9, 0x1e, 0x52, 0x7d, 0x47, 0xa8, 0xe5, 0x70, + 0xc4, 0xf3, 0x9f, 0x7e, 0x56, 0x86, 0x16, 0x23, 0x9f, 0xdd, 0xd4, 0xeb, 0x5b, 0x72, 0xaa, 0x77, + 0x2b, 0xfb, 0x78, 0x67, 0x7f, 0xdf, 0x1c, 0x60, 0x7f, 0x7f, 0x8b, 0x25, 0x12, 0xdf, 0x6c, 0xb1, + 0x8d, 0xc9, 0xba, 0xd9, 0x29, 0xe6, 0xcc, 0xd8, 0x5f, 0x1e, 0x62, 0xec, 0x2f, 0x65, 0xb4, 0xbb, + 0x7c, 0xfa, 0xe3, 0x1d, 0xe7, 0xf2, 0x49, 0x6b, 0x3f, 0xb1, 0xef, 0x62, 0x5e, 0x9e, 0x21, 0xbf, + 0xbf, 0xfd, 0x45, 0xde, 0x3e, 0x24, 0x75, 0x05, 0x37, 0x0a, 0xaf, 0xaa, 0xac, 0xaf, 0xc8, 0xc9, + 0xfd, 0xe5, 0xaa, 0xab, 0x97, 0x1f, 0xa8, 0x95, 0x9c, 0xa7, 0x7f, 0xf0, 0xfa, 0x05, 0xbc, 0x8b, + 0x61, 0x73, 0xd7, 0x55, 0xff, 0x0f, 0xc9, 0x6c, 0x8d, 0x51, 0xd6, 0x8b, 0x00, 0x00, }; diff --git a/wled00/html_mobile.h b/wled00/html_mobile.h index ea0c71a16..ea462ed7e 100644 --- a/wled00/html_mobile.h +++ b/wled00/html_mobile.h @@ -17,11 +17,11 @@ const char PAGE_indexM[] PROGMEM = R"=====( Mobile UI is unsupported in this build. Go to /settings/ui and change UI mode to "Classic". )====="; #else WLED_DISABLE_MOBILE_UI -const uint16_t PAGE_indexM_L = 20118; //length of the binary payload +const uint16_t PAGE_indexM_L = 20126; //length of the binary payload const char PAGE_indexM[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x08, 0xb6, 0x6a, 0xec, 0x5b, 0x00, 0x03, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x20, 0x28, 0x33, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0xed, 0xbd, + 0x1f, 0x8b, 0x08, 0x08, 0x0c, 0x4f, 0x00, 0x5c, 0x00, 0x03, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x28, 0x37, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0xed, 0xbd, 0x69, 0x7b, 0xe2, 0xc8, 0xb2, 0x2e, 0xfa, 0x7d, 0xfd, 0x0a, 0x37, 0xeb, 0x59, 0xdd, 0x50, 0xc2, 0x96, 0xc4, 0x0c, 0x2e, 0xaa, 0x2e, 0x08, 0x01, 0x62, 0x06, 0x31, 0xd7, 0xaa, 0xd3, 0x8f, 0x66, 0x09, 0x8d, 0x68, 0x62, 0x70, 0xfb, 0xbf, 0xdf, 0x48, 0x09, 0x30, 0xb6, 0x71, 0x55, 0xf5, 0x3e, @@ -810,474 +810,474 @@ const char PAGE_indexM[] PROGMEM = { 0x58, 0x1b, 0xc6, 0xdd, 0xc0, 0xd6, 0xc0, 0x5d, 0x95, 0x6e, 0x21, 0x02, 0xd0, 0x5f, 0x5c, 0x0b, 0xd9, 0x01, 0x79, 0x8b, 0x80, 0xbc, 0x22, 0xb8, 0x25, 0x5f, 0x31, 0x73, 0x45, 0x90, 0xbd, 0x45, 0x90, 0xbd, 0x22, 0xc8, 0xdd, 0x22, 0x38, 0x3b, 0x42, 0xff, 0xc3, 0x58, 0x5c, 0x04, 0x15, 0xf6, - 0x38, 0x3d, 0xae, 0x3a, 0xed, 0x3c, 0x21, 0xa2, 0xf3, 0x5b, 0x3e, 0xbf, 0xb4, 0xec, 0x3b, 0x1f, - 0xfd, 0xef, 0xc4, 0xd7, 0x1c, 0x5e, 0xa8, 0xde, 0x00, 0xca, 0x97, 0x9f, 0xee, 0x00, 0xc8, 0xe1, - 0xf9, 0xe8, 0x95, 0xa7, 0xa7, 0xa9, 0xb9, 0x4b, 0x9e, 0x92, 0x88, 0xbb, 0x7c, 0xe1, 0x1e, 0x64, - 0x8e, 0x20, 0xe6, 0x95, 0x10, 0x23, 0x84, 0x04, 0x1b, 0x92, 0xcc, 0x81, 0x3d, 0xbe, 0x93, 0x70, - 0x94, 0xbc, 0x32, 0x32, 0x94, 0x20, 0xdd, 0xa0, 0xc8, 0x44, 0x36, 0x04, 0x72, 0x1c, 0x62, 0xec, - 0x76, 0x37, 0xb4, 0x8c, 0xc3, 0x0d, 0x3a, 0x50, 0x57, 0x1d, 0xcc, 0x54, 0x84, 0xa2, 0xbb, 0x53, - 0x83, 0x1b, 0x54, 0x28, 0x50, 0x43, 0xca, 0x11, 0xa3, 0xc0, 0x8f, 0x58, 0xe5, 0xaf, 0x58, 0xbd, - 0x50, 0xdf, 0x20, 0x2c, 0x20, 0x0b, 0x75, 0xfd, 0x5b, 0x3c, 0x90, 0xf9, 0x19, 0x76, 0xf0, 0x3e, - 0x44, 0x8f, 0x10, 0x62, 0xec, 0x71, 0x21, 0x77, 0xa3, 0x06, 0x0c, 0x6f, 0x28, 0x48, 0x37, 0xd0, - 0xde, 0x28, 0x82, 0x8a, 0x4d, 0x1b, 0x12, 0xa6, 0x9b, 0x5a, 0x24, 0x3f, 0x46, 0x99, 0xa3, 0x08, - 0x28, 0x9e, 0xc3, 0x2a, 0x20, 0x8f, 0x5b, 0xce, 0x68, 0x14, 0x41, 0x46, 0x36, 0xb0, 0xbc, 0x1b, - 0xee, 0x62, 0x14, 0x61, 0xc6, 0x89, 0x16, 0x4a, 0x96, 0x28, 0x19, 0xef, 0x83, 0xee, 0x28, 0xc2, - 0x8b, 0x80, 0xdb, 0xa5, 0xe3, 0x4d, 0xce, 0x85, 0x1f, 0x86, 0xca, 0x51, 0x84, 0x18, 0x57, 0xd1, - 0x6b, 0x95, 0xed, 0x1b, 0x0e, 0x7c, 0x14, 0x81, 0xc5, 0x9a, 0xc5, 0x19, 0xb6, 0x62, 0xdf, 0x70, - 0xd3, 0xa3, 0x08, 0x29, 0xb2, 0xce, 0x4d, 0xec, 0x31, 0x8a, 0xc0, 0xe1, 0x08, 0x5d, 0x67, 0xb8, - 0x25, 0x37, 0xc2, 0x86, 0xf1, 0xa0, 0xdf, 0x2f, 0xd1, 0x51, 0x04, 0x0b, 0xeb, 0x92, 0x24, 0xdc, - 0x64, 0x0b, 0xea, 0x9a, 0x6b, 0x96, 0xcf, 0x29, 0x37, 0x6d, 0x36, 0x87, 0x6c, 0x1e, 0xc0, 0xa4, - 0x1f, 0xb8, 0x37, 0xeb, 0xa3, 0x75, 0x69, 0x89, 0x9e, 0xc0, 0xdd, 0x9c, 0x8c, 0x08, 0x06, 0x4a, - 0xdc, 0xed, 0x9e, 0x41, 0x5b, 0xac, 0x2a, 0xb9, 0xfc, 0xcd, 0x99, 0x42, 0xf0, 0xaf, 0x7d, 0x7b, - 0xa9, 0x21, 0xe0, 0x87, 0xaa, 0x0a, 0xef, 0x9d, 0xc9, 0x28, 0x46, 0x7b, 0xee, 0x61, 0x77, 0x93, - 0x29, 0x42, 0x78, 0x9d, 0x1b, 0x68, 0x6b, 0x14, 0x21, 0xbb, 0x96, 0xfb, 0xa1, 0x1e, 0x22, 0x40, - 0x27, 0xed, 0x54, 0xed, 0x56, 0x1d, 0x0a, 0x9e, 0x92, 0xeb, 0x6b, 0xb7, 0x17, 0x6a, 0xf6, 0x04, - 0x36, 0x6e, 0x55, 0x81, 0x76, 0x18, 0x41, 0x92, 0x3f, 0xa8, 0x45, 0x2b, 0xef, 0xc0, 0x59, 0x37, - 0xeb, 0x4a, 0xa7, 0x90, 0x7a, 0x37, 0xba, 0x95, 0x7f, 0x8e, 0x22, 0xd4, 0x56, 0x0b, 0xfc, 0xc0, - 0xbc, 0xb5, 0x04, 0x11, 0x56, 0xeb, 0xc3, 0x40, 0x61, 0xb4, 0xb7, 0x6a, 0xc9, 0xa8, 0xd6, 0x95, - 0x6e, 0x2d, 0x79, 0x84, 0xd3, 0xc0, 0xc4, 0x4d, 0xee, 0x7d, 0x20, 0x1f, 0x45, 0x20, 0x0d, 0x2a, - 0x79, 0x23, 0xb8, 0x55, 0x09, 0x6a, 0x1a, 0xc6, 0x29, 0xf9, 0xef, 0x77, 0x53, 0x89, 0xbb, 0x35, - 0x0b, 0x08, 0x98, 0x4d, 0x35, 0xce, 0xe4, 0x6e, 0x4d, 0x1e, 0x82, 0x64, 0x35, 0xc7, 0xd5, 0x20, - 0x9c, 0x5d, 0xe0, 0xf0, 0xdd, 0xaf, 0xc5, 0x82, 0x38, 0xf3, 0xbf, 0xfb, 0xac, 0x45, 0xbf, 0xd7, - 0x15, 0x6d, 0x4d, 0xf8, 0x32, 0xb0, 0x36, 0x00, 0xc2, 0x55, 0xcf, 0x3f, 0xde, 0x95, 0x4c, 0x9d, - 0x42, 0xc5, 0xf5, 0xaf, 0x86, 0x40, 0xd3, 0xb8, 0x11, 0xda, 0x1a, 0x43, 0x2f, 0xe1, 0x46, 0xbb, - 0x76, 0x02, 0xb8, 0x1e, 0xff, 0x0b, 0xfe, 0xe9, 0xb7, 0x7f, 0x7c, 0xba, 0xd3, 0x5c, 0xfb, 0x61, - 0xe3, 0xdd, 0x85, 0xd9, 0x87, 0xec, 0x03, 0x01, 0xe7, 0x10, 0xc5, 0x0b, 0xf7, 0xf0, 0xa7, 0x74, - 0xd7, 0x89, 0x7e, 0x1a, 0xac, 0xc1, 0x59, 0x9a, 0x64, 0x40, 0xc5, 0x44, 0x32, 0xa4, 0xc8, 0x17, - 0x07, 0x16, 0x7a, 0x17, 0xbf, 0xaf, 0x4a, 0x77, 0x7d, 0x66, 0x7a, 0x07, 0x83, 0x93, 0x60, 0xdd, - 0x02, 0x81, 0xa2, 0xf9, 0x6a, 0xc0, 0x3f, 0x08, 0xb6, 0x89, 0x6f, 0x38, 0xd4, 0x16, 0x8f, 0x79, - 0xff, 0xe3, 0x13, 0xfe, 0x8f, 0xdf, 0xe4, 0xc0, 0x8a, 0xb6, 0xe5, 0x92, 0x7e, 0x5a, 0x4a, 0x3d, - 0x25, 0x6c, 0x7e, 0x03, 0xa1, 0x2a, 0x51, 0xad, 0xa2, 0x8d, 0x0e, 0x5b, 0xbe, 0x93, 0xf6, 0xe8, - 0x37, 0xfb, 0xbc, 0xdf, 0x7f, 0x7f, 0x57, 0x63, 0xda, 0x62, 0x60, 0x48, 0x5f, 0xe3, 0xaf, 0x87, - 0x13, 0x5d, 0x55, 0x4a, 0xa6, 0x2a, 0x89, 0x33, 0xcf, 0x17, 0x62, 0x11, 0x6c, 0xd1, 0x92, 0x7e, - 0xff, 0x3d, 0xfe, 0x7e, 0xe0, 0x4c, 0xf1, 0x6b, 0x7c, 0x98, 0xfc, 0xf6, 0x1d, 0xfa, 0xad, 0x7c, - 0xd4, 0xef, 0xd7, 0xd3, 0xf7, 0x03, 0x48, 0x1c, 0xf1, 0xf6, 0xcf, 0x47, 0xcf, 0x49, 0x5f, 0xd5, - 0xbc, 0xf4, 0x45, 0xfc, 0xd4, 0x93, 0x2b, 0x81, 0x2f, 0xb1, 0xee, 0x5e, 0x06, 0x94, 0x7a, 0x3a, - 0x1f, 0xdf, 0x49, 0x49, 0x2f, 0xf5, 0xa4, 0xc9, 0x49, 0xf7, 0x9b, 0xf7, 0x3d, 0x75, 0x22, 0x44, - 0xc7, 0x67, 0xb9, 0x1f, 0x43, 0xce, 0xbd, 0xb3, 0xaa, 0xa8, 0xa8, 0xfa, 0xa4, 0x55, 0xbc, 0xb4, - 0x51, 0xf9, 0x8d, 0x4c, 0x9f, 0x2a, 0x2b, 0x4f, 0xcf, 0xcf, 0x8f, 0xa7, 0x46, 0x3e, 0x6a, 0x24, - 0x00, 0xe2, 0x4d, 0x5a, 0xe7, 0xb6, 0x69, 0x2b, 0xfd, 0x72, 0x2c, 0xa5, 0xe0, 0xc4, 0xa8, 0xfe, - 0x46, 0xbc, 0x94, 0x3d, 0x23, 0xde, 0x6e, 0xf5, 0xe9, 0xc2, 0x43, 0x7a, 0x30, 0xab, 0xa0, 0xed, - 0x07, 0xa1, 0xea, 0xc2, 0x5f, 0xad, 0x7a, 0x2d, 0xf1, 0xb9, 0x9b, 0x67, 0xa8, 0x11, 0xaf, 0x6a, - 0xd2, 0x6e, 0x1a, 0x46, 0x20, 0x3d, 0xd8, 0xe8, 0x30, 0xf5, 0xd7, 0x5f, 0xc3, 0x48, 0x5f, 0x0f, - 0xb1, 0x12, 0x47, 0xae, 0xed, 0x80, 0x9f, 0x38, 0x44, 0x64, 0xe8, 0x67, 0x5b, 0x64, 0x4d, 0x09, - 0x5c, 0xf4, 0x52, 0xfd, 0x68, 0x14, 0x56, 0x60, 0x4a, 0xa7, 0x33, 0x22, 0xad, 0x48, 0x7e, 0xc5, - 0x7b, 0x4e, 0x21, 0xfe, 0xd6, 0xab, 0x9e, 0x63, 0x29, 0xfd, 0xdf, 0x7f, 0xf7, 0x1f, 0xfc, 0xaf, - 0xef, 0xd5, 0x1a, 0xf5, 0x85, 0x20, 0xca, 0x73, 0xe5, 0x46, 0xe5, 0xd5, 0xd8, 0xc4, 0xa4, 0x9b, - 0x4e, 0x70, 0x09, 0x90, 0x32, 0xed, 0xa2, 0x5e, 0xec, 0xea, 0x6b, 0x13, 0x3b, 0x11, 0x9e, 0x06, - 0xe0, 0xb8, 0xb6, 0x6f, 0xa3, 0x39, 0x7f, 0x00, 0x04, 0x3d, 0xdc, 0x59, 0xe7, 0xa1, 0xc4, 0x3a, - 0x46, 0x0d, 0x10, 0x0f, 0xa7, 0x9a, 0x48, 0xa4, 0xa5, 0xa4, 0xf4, 0xe0, 0x55, 0x73, 0x30, 0xf3, - 0xdf, 0xae, 0x39, 0x42, 0x47, 0x4f, 0x09, 0xc8, 0xfd, 0x60, 0x8d, 0xb9, 0x1a, 0x98, 0xd0, 0xe3, - 0x65, 0xd2, 0xbd, 0xf3, 0xb0, 0x24, 0xa4, 0x3d, 0x98, 0x26, 0x2d, 0x6d, 0xa7, 0xb9, 0xb4, 0x9a, - 0x16, 0xaa, 0xfe, 0x83, 0x8a, 0x67, 0x0b, 0x44, 0x3a, 0x80, 0x23, 0x0f, 0x27, 0x09, 0x22, 0x6d, - 0xc0, 0x51, 0x88, 0x8e, 0x1e, 0xbd, 0x9d, 0xe6, 0x0b, 0x6a, 0xd2, 0xaa, 0xea, 0xc9, 0xc2, 0x27, - 0x21, 0x95, 0xd6, 0xaa, 0xf0, 0x75, 0x6f, 0xa5, 0xed, 0xaa, 0xf1, 0x29, 0x49, 0xde, 0x07, 0xa9, - 0x34, 0x17, 0x1f, 0x69, 0x9f, 0xe0, 0x58, 0x8d, 0x8f, 0xd1, 0x69, 0x0a, 0x9d, 0x5b, 0xff, 0x2a, - 0xa4, 0x9e, 0xd0, 0x0f, 0xc1, 0xdd, 0x11, 0x15, 0xa9, 0x6a, 0xa4, 0xdd, 0xaa, 0x9a, 0xf6, 0xaa, - 0xf6, 0x23, 0xef, 0x4a, 0x9c, 0xfe, 0x18, 0x55, 0x90, 0x50, 0xc1, 0x41, 0x85, 0xf1, 0xb6, 0x22, - 0x03, 0x15, 0xf6, 0xa9, 0x42, 0xbd, 0xae, 0xc8, 0x9e, 0x2a, 0x38, 0xa8, 0x30, 0xae, 0x2b, 0x72, - 0x50, 0xa1, 0x42, 0x85, 0xfd, 0xb6, 0x22, 0x7f, 0xea, 0x1c, 0x55, 0x70, 0xcf, 0xb1, 0xce, 0x9f, - 0xdc, 0xca, 0x0e, 0xfd, 0x5e, 0xc5, 0x27, 0x30, 0x52, 0xe5, 0x74, 0x08, 0xb3, 0xc4, 0x9f, 0x0e, - 0xbd, 0xd4, 0xf3, 0xf3, 0x45, 0x77, 0xd6, 0x95, 0xee, 0x40, 0x33, 0x2e, 0x8e, 0x7e, 0xdf, 0xc2, - 0x83, 0x23, 0x25, 0x3a, 0xb2, 0xe0, 0x88, 0x8f, 0x8e, 0xb4, 0x6a, 0x9f, 0xf3, 0xd5, 0x07, 0x93, - 0xdb, 0x27, 0x23, 0x25, 0xa7, 0x40, 0x4f, 0x71, 0x89, 0x66, 0x9d, 0x4b, 0xb8, 0xaa, 0x76, 0x6f, - 0x9f, 0xf5, 0xaa, 0x9d, 0xd4, 0x63, 0x83, 0x84, 0xc4, 0xb5, 0xc8, 0x2e, 0x14, 0x24, 0xbd, 0x7b, - 0x2b, 0x85, 0x73, 0x58, 0xd2, 0xfb, 0x6c, 0x7d, 0x2d, 0x54, 0x88, 0xd4, 0x35, 0x81, 0x87, 0x08, - 0xac, 0x7b, 0x17, 0x11, 0x64, 0xae, 0x2b, 0x2c, 0x54, 0xe1, 0xde, 0x7b, 0xa8, 0x22, 0xf7, 0x7c, - 0xb6, 0x44, 0xbc, 0x5a, 0x48, 0x3f, 0xa9, 0x30, 0x38, 0x98, 0x68, 0x34, 0x64, 0x0f, 0x0e, 0x89, - 0x6a, 0x55, 0xfb, 0x4a, 0x54, 0x38, 0x5c, 0xfb, 0x04, 0x53, 0x9d, 0x4a, 0x87, 0x50, 0x06, 0x07, - 0x9f, 0xb4, 0xeb, 0xb1, 0x6b, 0x97, 0xb1, 0x5f, 0xac, 0xc3, 0x3d, 0x5b, 0x07, 0xe8, 0xe0, 0x01, - 0xb4, 0xf6, 0x29, 0x99, 0xb9, 0x97, 0x52, 0x17, 0xa3, 0xaf, 0xba, 0x9f, 0x24, 0x1c, 0x4c, 0x20, - 0x1a, 0x38, 0xc7, 0x7b, 0xc9, 0xcc, 0x27, 0xef, 0x9e, 0x4c, 0xa5, 0x50, 0xff, 0x60, 0x6a, 0x51, - 0xd7, 0xa8, 0x1b, 0x09, 0x56, 0x2e, 0x98, 0xda, 0xe9, 0xec, 0x95, 0xc2, 0xed, 0xdb, 0x9d, 0x1a, - 0x91, 0x49, 0x9e, 0x3d, 0xd6, 0xa7, 0x6a, 0x26, 0x2d, 0x7d, 0xaa, 0xba, 0x9f, 0xab, 0xe4, 0x57, - 0xb7, 0x92, 0xb9, 0x77, 0xaf, 0x3b, 0xc8, 0x20, 0x19, 0x5c, 0x4c, 0x4a, 0xbd, 0x0c, 0x2d, 0x3a, - 0xc5, 0x33, 0x51, 0xc1, 0x55, 0x5f, 0xdc, 0x8b, 0xa7, 0x49, 0xb8, 0x0a, 0x9f, 0xc0, 0x92, 0xfe, - 0x03, 0xf7, 0x15, 0x16, 0x6d, 0x25, 0x91, 0x48, 0x61, 0x89, 0x64, 0x02, 0x83, 0x19, 0xc7, 0x12, - 0xe9, 0x3b, 0x74, 0xa0, 0x9c, 0x0f, 0xf8, 0x13, 0x59, 0x7c, 0xc6, 0xc5, 0xb4, 0xa9, 0xc4, 0x0b, - 0x5b, 0xf5, 0x8a, 0xad, 0xea, 0x19, 0x37, 0xd9, 0xaa, 0x67, 0x6e, 0x1e, 0x96, 0xf8, 0x57, 0x7c, - 0x64, 0xc0, 0x51, 0xe2, 0x67, 0xbc, 0x85, 0x6b, 0xf5, 0xb8, 0x91, 0x6a, 0x94, 0xc8, 0x1e, 0x79, - 0xb0, 0x45, 0xe9, 0x5f, 0x64, 0xb1, 0x5a, 0x25, 0x7e, 0xff, 0xdd, 0x3d, 0x1f, 0x78, 0xf1, 0x01, - 0x58, 0xa7, 0xf5, 0x95, 0x2c, 0x56, 0x48, 0x30, 0x4a, 0xeb, 0x6b, 0xae, 0x52, 0x02, 0x53, 0x44, - 0xdf, 0x45, 0x58, 0xb6, 0x12, 0xae, 0x7d, 0xfe, 0x9c, 0xf9, 0x64, 0xff, 0xe5, 0xa2, 0x03, 0xfb, - 0x2f, 0x88, 0x8a, 0xe0, 0x18, 0xd4, 0x07, 0xdf, 0x46, 0x19, 0x80, 0xa5, 0x20, 0x54, 0x7e, 0x52, - 0x7c, 0xe2, 0x9f, 0x09, 0xcc, 0x92, 0x76, 0x77, 0x35, 0xd7, 0xe5, 0x0e, 0x49, 0xee, 0x5e, 0x78, - 0x30, 0x24, 0x4b, 0xf1, 0xd5, 0xd4, 0xc3, 0xc6, 0x06, 0x2b, 0x4f, 0x10, 0x20, 0xad, 0xf0, 0x22, - 0x6b, 0x10, 0x3b, 0xba, 0x93, 0x43, 0x85, 0xa5, 0x81, 0xcc, 0x1e, 0x4f, 0xfe, 0x9b, 0xc5, 0x52, - 0xff, 0x4e, 0x26, 0xff, 0x2d, 0x62, 0xa9, 0xe4, 0xbf, 0xbe, 0xa6, 0x92, 0x5f, 0x2b, 0xff, 0x6e, - 0x60, 0xf0, 0xfd, 0xd3, 0x82, 0xaf, 0xc9, 0x6f, 0xc4, 0x7d, 0xf9, 0xdf, 0x0f, 0xdf, 0xd1, 0xf1, - 0xbf, 0x53, 0xb8, 0x06, 0xb6, 0x5c, 0x75, 0xd0, 0x6f, 0xf0, 0x32, 0x96, 0x0f, 0x21, 0x2d, 0xf3, - 0x1d, 0xdc, 0xce, 0x75, 0x41, 0xee, 0x3b, 0xf2, 0x5a, 0x57, 0x05, 0x85, 0xef, 0xe7, 0xa1, 0x7c, - 0x73, 0xbf, 0x91, 0xdf, 0xd3, 0xa0, 0xf0, 0x2a, 0x04, 0xbb, 0xec, 0xf7, 0xaf, 0x91, 0xa5, 0x7d, - 0x92, 0xbe, 0x11, 0xdf, 0x21, 0xe8, 0x9d, 0x8a, 0xf3, 0xdf, 0xbf, 0x5a, 0xa7, 0x62, 0xf2, 0x7b, - 0xc5, 0x3a, 0x17, 0x17, 0xbf, 0x7f, 0xd5, 0x4e, 0xc5, 0x99, 0xef, 0x15, 0x2d, 0x1d, 0xf1, 0x6f, - 0xa2, 0x0b, 0xab, 0xd0, 0x43, 0xe9, 0x3b, 0x98, 0x76, 0x68, 0x6b, 0xe2, 0x1d, 0xf1, 0xfd, 0x45, - 0x13, 0xc6, 0xcb, 0xac, 0x21, 0xa5, 0x7c, 0xbb, 0xfa, 0xb1, 0x9c, 0x8b, 0x44, 0xe0, 0x95, 0x50, - 0x3f, 0xe0, 0x91, 0x10, 0x5f, 0xf0, 0x46, 0x12, 0xc8, 0x75, 0x65, 0xac, 0xf2, 0x1b, 0x1e, 0xc8, - 0x6d, 0xa3, 0xd5, 0x01, 0xff, 0x5e, 0x78, 0xa8, 0x71, 0x63, 0x2f, 0x6a, 0x0c, 0x0b, 0x4c, 0x02, - 0x1d, 0x5c, 0xf1, 0x08, 0x11, 0x0f, 0x1f, 0x59, 0x8e, 0x04, 0x00, 0x4c, 0x90, 0x92, 0x30, 0xa3, - 0x69, 0xb0, 0xb1, 0xc7, 0x98, 0xef, 0x45, 0x53, 0x09, 0x62, 0x0f, 0xf6, 0x07, 0x81, 0xab, 0x9a, - 0xad, 0xa2, 0xc5, 0x17, 0xcd, 0x32, 0x28, 0xdb, 0xfd, 0x4a, 0xe6, 0x2b, 0xb1, 0xdf, 0x73, 0x23, - 0x33, 0xd2, 0x50, 0x11, 0xd8, 0xd5, 0xcb, 0x18, 0x92, 0xd2, 0x97, 0x2f, 0x99, 0x4f, 0xd6, 0xef, - 0x5e, 0xea, 0x93, 0x06, 0x63, 0x41, 0xa7, 0xa7, 0x13, 0x1e, 0x4e, 0xa2, 0xa3, 0x2b, 0x81, 0x9c, - 0xeb, 0x58, 0x7f, 0xa7, 0x59, 0x9e, 0x8f, 0x7e, 0x86, 0x09, 0x70, 0xcf, 0xfe, 0xab, 0x5f, 0x41, - 0xa6, 0xb6, 0x07, 0x82, 0x17, 0x72, 0xf1, 0x1c, 0xe8, 0xce, 0x4d, 0x3e, 0x57, 0xa5, 0xaf, 0x52, - 0xc5, 0xff, 0x02, 0x62, 0xb8, 0x15, 0xff, 0x85, 0x50, 0xb9, 0x36, 0x3d, 0x40, 0x1c, 0xb2, 0xed, - 0x26, 0xd1, 0x09, 0xfa, 0x91, 0x9c, 0x3b, 0x3f, 0x15, 0xe1, 0x1b, 0x09, 0xfe, 0xfc, 0x56, 0x45, - 0x40, 0xe6, 0xe2, 0x57, 0x5e, 0x18, 0xfc, 0x79, 0xee, 0x29, 0x6a, 0x55, 0x45, 0x72, 0x3e, 0x80, - 0x8b, 0x40, 0xf6, 0x95, 0x94, 0xa2, 0xc3, 0x4b, 0xa3, 0x2a, 0x44, 0x7a, 0x64, 0x0f, 0x7f, 0xfd, - 0xf5, 0x90, 0x8f, 0x7e, 0x98, 0x2a, 0x1d, 0x0b, 0x0e, 0xca, 0xd0, 0x93, 0x1e, 0x38, 0x10, 0x80, - 0x48, 0xe0, 0x94, 0x1f, 0xdc, 0x14, 0x8a, 0x32, 0x4a, 0x54, 0xa8, 0xa0, 0x42, 0x05, 0x0a, 0x95, - 0x54, 0x1c, 0x7a, 0x50, 0x21, 0x8f, 0x0a, 0x79, 0x28, 0xe4, 0x51, 0xe1, 0xf3, 0xd5, 0xb8, 0xcd, - 0xeb, 0xe1, 0x20, 0x59, 0xd0, 0x5c, 0x3c, 0xa8, 0x5e, 0x78, 0x16, 0xc2, 0x7b, 0x08, 0x41, 0x0c, - 0xf8, 0x8b, 0x49, 0xe9, 0xc8, 0x24, 0x60, 0xee, 0x50, 0x7d, 0xd5, 0x4b, 0x5f, 0x0d, 0xea, 0xf0, - 0xcb, 0x6c, 0xee, 0x6f, 0xb0, 0x41, 0xcd, 0xf8, 0xea, 0x0d, 0x50, 0xcb, 0x1e, 0x4c, 0xde, 0x36, - 0x00, 0x1a, 0x7b, 0xd1, 0xc1, 0xdb, 0x8a, 0x07, 0xcd, 0x07, 0xd8, 0xe5, 0xdb, 0xee, 0xd7, 0x5b, - 0x00, 0x2f, 0xa6, 0xbc, 0x46, 0x53, 0x57, 0x95, 0xc0, 0xf3, 0xe3, 0xee, 0x7c, 0x40, 0xf2, 0x60, - 0x30, 0x6e, 0x20, 0x00, 0xef, 0x6a, 0xb5, 0x7a, 0x29, 0xff, 0xed, 0x7c, 0xfc, 0x82, 0xaa, 0xbe, - 0x9e, 0x65, 0xab, 0x5c, 0x3a, 0x4c, 0xef, 0xe2, 0xf8, 0x1c, 0xdd, 0x7a, 0x95, 0xd6, 0xe3, 0x13, - 0xd9, 0xb0, 0x6d, 0x37, 0xbd, 0x7f, 0x05, 0x08, 0x11, 0xbe, 0x7e, 0x90, 0xaa, 0x80, 0x20, 0xa3, - 0xa3, 0xa0, 0x0a, 0xab, 0x2c, 0x5e, 0xe1, 0xb0, 0xce, 0x4e, 0x07, 0xe1, 0xe9, 0xe0, 0x39, 0x8d, - 0x80, 0x23, 0x22, 0xf3, 0x24, 0x1f, 0x99, 0xee, 0xe3, 0x1e, 0x00, 0xc0, 0xbe, 0xfa, 0x67, 0x7a, - 0xff, 0x60, 0xa0, 0xa4, 0x4a, 0xb2, 0xaa, 0x26, 0x1c, 0x8b, 0x9c, 0xab, 0xc3, 0xe1, 0x01, 0x0e, - 0x41, 0xbd, 0x99, 0x89, 0xc2, 0x83, 0x8a, 0xf7, 0xc8, 0xac, 0x32, 0x6d, 0x50, 0xb7, 0x75, 0x2a, - 0x6f, 0x7b, 0x46, 0x55, 0x8b, 0x8e, 0x8d, 0xa8, 0xdc, 0x3e, 0x1d, 0x83, 0x67, 0x06, 0xb8, 0x13, - 0xd3, 0xa3, 0x63, 0xee, 0xdc, 0x56, 0xda, 0x57, 0x05, 0x38, 0x8e, 0x16, 0x32, 0x9c, 0xa0, 0xba, - 0xf0, 0x72, 0xee, 0x19, 0xe8, 0x5c, 0x3e, 0x9f, 0x43, 0xa7, 0xe8, 0xdc, 0x40, 0xe7, 0x67, 0x3d, - 0x55, 0x9f, 0xae, 0x74, 0x5a, 0xd9, 0xa7, 0x61, 0x14, 0xaf, 0x26, 0xe6, 0x25, 0x3f, 0x49, 0xc6, - 0x03, 0x06, 0xbd, 0xfb, 0x5f, 0x13, 0x28, 0xe3, 0x42, 0x00, 0x5c, 0x4c, 0x54, 0x78, 0x20, 0x4b, - 0x7d, 0x7d, 0xbb, 0x96, 0x91, 0x46, 0x90, 0x1d, 0x45, 0xc3, 0xaa, 0x24, 0xdc, 0x04, 0x5a, 0x86, - 0x71, 0x31, 0xc8, 0x5d, 0xf5, 0x2b, 0x89, 0xf0, 0xaa, 0x08, 0x51, 0x42, 0x91, 0x11, 0x15, 0xfd, - 0xfe, 0x7b, 0xf2, 0x54, 0x08, 0xd0, 0x14, 0x32, 0x24, 0x2f, 0x8a, 0x4a, 0x2f, 0xe6, 0x80, 0x08, - 0xf0, 0xff, 0x05, 0x5c, 0xf0, 0x07, 0x5f, 0xf2, 0x90, 0xd2, 0x2f, 0x7c, 0xe3, 0x00, 0x06, 0xac, - 0xf0, 0xff, 0x05, 0xad, 0xdf, 0xd4, 0xab, 0x91, 0x3a, 0xce, 0xf5, 0xff, 0x44, 0xa1, 0xa5, 0x76, - 0xdf, 0xe4, 0xee, 0xe5, 0xef, 0x17, 0xc2, 0x4b, 0xd7, 0x91, 0x26, 0x23, 0xd2, 0x14, 0xe0, 0x70, - 0x50, 0xca, 0xe9, 0x9e, 0xd7, 0xca, 0x5b, 0x00, 0x1e, 0x7b, 0x0b, 0xd4, 0xe8, 0x9b, 0xff, 0xfd, - 0xd1, 0xfb, 0x26, 0x7d, 0x87, 0xdc, 0xe6, 0x74, 0x5a, 0xf5, 0x9e, 0xd3, 0x82, 0x01, 0x29, 0xef, - 0x8d, 0xc4, 0xe1, 0xe4, 0xea, 0x80, 0x10, 0xf8, 0x43, 0x82, 0x8a, 0x7e, 0x6d, 0xae, 0x72, 0x33, - 0x5f, 0x90, 0xaa, 0xd2, 0x5f, 0x7f, 0x01, 0xac, 0x08, 0x13, 0x69, 0x25, 0x6a, 0x00, 0x7d, 0xa4, - 0xd1, 0x5a, 0x86, 0x6f, 0x68, 0x0b, 0xc6, 0xf6, 0xa6, 0xdd, 0x45, 0xa3, 0x7f, 0xc6, 0x99, 0x22, - 0x2a, 0x44, 0xe7, 0xcf, 0xe9, 0x93, 0x41, 0xbe, 0x9a, 0x60, 0xf3, 0x44, 0x04, 0xac, 0x62, 0x1b, - 0x7d, 0x55, 0x7b, 0xb8, 0xd4, 0x3e, 0xa7, 0x6f, 0x65, 0x5e, 0x9a, 0xe4, 0x25, 0xaf, 0xac, 0x09, - 0x50, 0x19, 0xcc, 0xf6, 0x93, 0x72, 0x6d, 0x44, 0xb1, 0x8e, 0xfc, 0x6a, 0xbc, 0x96, 0x5e, 0xe2, - 0x56, 0x8c, 0xde, 0x00, 0x0f, 0xc1, 0x5a, 0x02, 0x8c, 0xf9, 0xfc, 0xfc, 0xce, 0xf6, 0x20, 0x6d, - 0x8d, 0x97, 0xe2, 0x05, 0x00, 0xc5, 0x2c, 0xce, 0xbe, 0x1d, 0xfd, 0xfc, 0xde, 0x9d, 0x94, 0xf2, - 0xdf, 0x64, 0x50, 0x49, 0x94, 0x26, 0x26, 0xfd, 0x6f, 0x2e, 0xf2, 0xf8, 0xee, 0xf7, 0x38, 0xd6, - 0x79, 0x55, 0x25, 0x29, 0xc1, 0x38, 0x1e, 0x4f, 0x4b, 0xda, 0x4f, 0x83, 0xd7, 0x53, 0xff, 0xfa, - 0x0b, 0xd6, 0x2d, 0xfa, 0x13, 0xa6, 0x4e, 0xab, 0x58, 0x8a, 0x07, 0x0c, 0xb3, 0x22, 0x19, 0x00, - 0xb0, 0xcf, 0xd4, 0x20, 0x1d, 0x98, 0xd7, 0xbb, 0x91, 0x9d, 0xbd, 0x68, 0x2c, 0x67, 0x90, 0x7a, - 0x3f, 0x86, 0xcb, 0x64, 0xa0, 0x33, 0xe0, 0x02, 0x46, 0xf8, 0x11, 0x17, 0xed, 0x17, 0xb8, 0xd8, - 0x31, 0x97, 0x8b, 0xa9, 0x7f, 0xc4, 0x8b, 0x4b, 0x9e, 0x97, 0xc4, 0x47, 0xdc, 0xd0, 0x2a, 0x34, - 0x4e, 0x32, 0x9d, 0xad, 0xfd, 0x23, 0x6e, 0xc2, 0x2f, 0x71, 0x0b, 0x2f, 0x23, 0xfc, 0x31, 0x37, - 0xf5, 0xb2, 0xbc, 0x3f, 0x1e, 0xa9, 0x51, 0x7d, 0xe5, 0xc3, 0x22, 0xce, 0xcf, 0xa9, 0xb4, 0x7f, - 0xd9, 0x6e, 0xd9, 0x3f, 0xa7, 0xdf, 0x2e, 0xc5, 0x57, 0xb9, 0x70, 0x3c, 0xe7, 0xef, 0x8c, 0x50, - 0xb4, 0x85, 0x00, 0xdd, 0x73, 0xf5, 0x20, 0xa0, 0x5b, 0x49, 0x24, 0xda, 0x90, 0xd0, 0x59, 0x32, - 0x11, 0x6d, 0x53, 0x01, 0x2c, 0xba, 0xd4, 0xa3, 0x9f, 0x8a, 0x7b, 0x40, 0xbf, 0x13, 0x69, 0x89, - 0x94, 0xaa, 0x19, 0x22, 0x8a, 0x9d, 0xfe, 0xab, 0x82, 0x37, 0xac, 0xa6, 0xd2, 0xde, 0x1f, 0xd8, - 0x22, 0x20, 0xac, 0x04, 0xa4, 0x3f, 0x71, 0x44, 0x88, 0xef, 0xf2, 0x7b, 0xbc, 0x24, 0x37, 0xaa, - 0x24, 0xf9, 0xb1, 0x01, 0x46, 0x87, 0x55, 0x29, 0xa6, 0x73, 0x03, 0x43, 0xf2, 0xaa, 0x52, 0xfc, - 0xfd, 0xd7, 0x5f, 0xd2, 0x83, 0xe0, 0x79, 0x13, 0x74, 0x1c, 0x57, 0x9b, 0x9c, 0x53, 0x45, 0x1b, - 0x31, 0xde, 0x47, 0x5e, 0xdb, 0x43, 0x5a, 0x44, 0x0d, 0x7e, 0xe0, 0x9d, 0xe2, 0x1e, 0x01, 0xcd, - 0x78, 0xe7, 0x6e, 0xbc, 0x97, 0x6e, 0xb4, 0xea, 0xb9, 0xa3, 0x47, 0x58, 0x73, 0x12, 0x12, 0xe5, - 0x04, 0x17, 0xf1, 0xe4, 0xb7, 0xda, 0xfd, 0xfa, 0x7b, 0x0a, 0x57, 0xd2, 0xef, 0xc3, 0x75, 0xe2, - 0x1e, 0xe5, 0x2c, 0xbe, 0xdd, 0xb3, 0x77, 0x92, 0x4b, 0x41, 0x3e, 0x9a, 0x04, 0x0c, 0x93, 0xd6, - 0xde, 0x2e, 0x47, 0x70, 0xa1, 0x1a, 0x78, 0x43, 0x14, 0x20, 0x2f, 0x65, 0x48, 0xba, 0x47, 0xb4, - 0xc2, 0x22, 0x11, 0x21, 0x47, 0x39, 0x43, 0x4e, 0xae, 0x2a, 0x61, 0x89, 0x0a, 0x24, 0x43, 0xee, - 0xa3, 0xef, 0x1e, 0x9e, 0xbc, 0x07, 0x08, 0x2b, 0xd0, 0x02, 0xc9, 0x99, 0xf4, 0xb1, 0xc4, 0xdd, - 0x53, 0x02, 0xe3, 0xb0, 0xc4, 0xe3, 0x73, 0x22, 0x6d, 0xa7, 0x9e, 0x85, 0x28, 0xc1, 0x00, 0xf7, - 0xe0, 0x3d, 0x70, 0xa2, 0x18, 0xd3, 0xa4, 0x39, 0x54, 0x03, 0x2e, 0x8a, 0x33, 0x8c, 0xc3, 0xd3, - 0x07, 0xe3, 0x45, 0xce, 0xd9, 0xfa, 0x66, 0x7f, 0x8f, 0xa7, 0x08, 0x4c, 0xeb, 0x63, 0xef, 0xe6, - 0x5d, 0x7b, 0x37, 0x29, 0xfa, 0xc1, 0x46, 0xf1, 0x03, 0xcb, 0xfe, 0xed, 0x45, 0xd1, 0x0f, 0xa2, - 0xe6, 0x45, 0xa4, 0x1f, 0x58, 0xf8, 0x6b, 0xa2, 0xea, 0x6f, 0xc8, 0xc1, 0x80, 0x78, 0xc8, 0x88, - 0x7e, 0xe4, 0x3e, 0x61, 0x86, 0xd2, 0x52, 0xf5, 0xdb, 0xf7, 0xd7, 0x2e, 0xd0, 0x4f, 0x49, 0x0f, - 0x4e, 0xe0, 0xa9, 0x49, 0xf7, 0x65, 0xde, 0xd2, 0xff, 0x5e, 0xc0, 0x9c, 0x25, 0xd2, 0xff, 0xb6, - 0x50, 0x42, 0x79, 0xf7, 0xf4, 0x6f, 0xeb, 0xdf, 0x3e, 0xcc, 0x16, 0xf8, 0xc3, 0x87, 0x53, 0x3f, - 0x2f, 0xb4, 0x8f, 0x31, 0xed, 0x63, 0x44, 0x03, 0xd4, 0xff, 0xb6, 0x9e, 0x13, 0x2f, 0x29, 0xfe, - 0x29, 0xd5, 0x43, 0x8c, 0x62, 0x21, 0x7f, 0x2e, 0xe0, 0x15, 0xfe, 0x3e, 0x09, 0x78, 0xb6, 0x44, - 0xe8, 0xff, 0x11, 0x39, 0xe5, 0x6b, 0x12, 0xab, 0x4a, 0x3c, 0x5a, 0x9f, 0xbd, 0x93, 0x05, 0x3c, - 0x5a, 0x18, 0x16, 0x93, 0x6b, 0x55, 0xef, 0x9b, 0x15, 0x93, 0x7f, 0xd3, 0x20, 0x98, 0x3e, 0x28, - 0x2f, 0x06, 0x14, 0xdd, 0xd6, 0x99, 0x44, 0x9b, 0x17, 0x67, 0x31, 0xdf, 0xf8, 0x07, 0xef, 0xef, - 0xf9, 0x87, 0x57, 0x79, 0xab, 0x92, 0x7c, 0x92, 0x2b, 0x09, 0xcd, 0xb5, 0xff, 0xfc, 0xd3, 0x44, - 0x21, 0xd1, 0x4d, 0x3c, 0x83, 0x3a, 0x1e, 0xfe, 0x8c, 0x7e, 0x88, 0x16, 0xd6, 0x46, 0xfa, 0x4d, - 0xf5, 0x9f, 0x7f, 0x46, 0x3f, 0xf4, 0x9a, 0x48, 0xcb, 0x9a, 0x61, 0x54, 0x12, 0x68, 0x93, 0x3b, - 0x91, 0xd6, 0x2b, 0xf9, 0x74, 0xbf, 0x92, 0x40, 0x8f, 0x33, 0x40, 0xf3, 0xf4, 0x0f, 0x9b, 0x6b, - 0xe8, 0x3a, 0xfb, 0xdb, 0xe6, 0x99, 0xa8, 0xb9, 0x2c, 0xcb, 0xa8, 0x79, 0xa4, 0x5c, 0xa5, 0xea, - 0xfe, 0xd0, 0x0b, 0x98, 0x76, 0xf8, 0x16, 0x43, 0xc4, 0xed, 0x1e, 0xd8, 0x64, 0x22, 0xfa, 0xbd, - 0x4c, 0x74, 0x31, 0x3e, 0x91, 0xfe, 0x06, 0x55, 0xdf, 0xd1, 0x64, 0xfe, 0xba, 0xba, 0x5e, 0x6f, - 0x2d, 0xbe, 0xa0, 0x75, 0xb4, 0x65, 0x0a, 0x16, 0x7b, 0xda, 0x21, 0x85, 0x84, 0xec, 0xd5, 0x46, - 0x5a, 0xcc, 0xe8, 0x92, 0x8a, 0xc1, 0x3c, 0x7b, 0x9f, 0xa5, 0xf3, 0x3c, 0x7b, 0x30, 0xcf, 0x3e, - 0x5a, 0xb7, 0x34, 0xfa, 0xad, 0xce, 0x9e, 0xe6, 0x01, 0x32, 0x91, 0xdc, 0x24, 0x4a, 0xd2, 0xa0, - 0xd5, 0xab, 0x4d, 0xa9, 0x5f, 0xe0, 0xe3, 0x4a, 0x68, 0xf4, 0x3f, 0x61, 0x15, 0x6d, 0x35, 0x5d, - 0xfc, 0x36, 0xb8, 0x6d, 0xf1, 0xc0, 0xfa, 0xa0, 0x92, 0x6a, 0xd5, 0xfc, 0xea, 0x27, 0x53, 0x15, - 0xeb, 0xe2, 0xd4, 0xd3, 0xdf, 0xfe, 0xfc, 0x7e, 0xd1, 0xc8, 0x9d, 0x04, 0x90, 0xe2, 0x83, 0x76, - 0x08, 0x31, 0x26, 0xc1, 0xe9, 0xbd, 0x6e, 0x29, 0xa5, 0x50, 0x36, 0x87, 0x84, 0xe5, 0xaa, 0x6e, - 0xb2, 0x88, 0x36, 0x4b, 0xbd, 0x24, 0x97, 0x4a, 0x0b, 0x70, 0x96, 0x4f, 0xa5, 0x03, 0x38, 0x13, - 0x52, 0x69, 0x03, 0xce, 0x0a, 0xa9, 0xb4, 0x0c, 0x67, 0x46, 0x2a, 0x1d, 0xc2, 0x19, 0xa4, 0x5f, - 0x0e, 0x9c, 0x85, 0xa9, 0xb4, 0x08, 0x67, 0x90, 0x58, 0x2a, 0x70, 0x26, 0xa6, 0xd2, 0x7f, 0x56, - 0x13, 0x51, 0xaf, 0x1e, 0xea, 0x55, 0x50, 0xd1, 0x25, 0x9f, 0x44, 0xda, 0xac, 0x26, 0x10, 0x70, - 0x34, 0x24, 0x34, 0xa7, 0x87, 0xdb, 0xb6, 0x0c, 0xd3, 0xff, 0x18, 0x01, 0xc8, 0xa7, 0xe7, 0xd8, - 0x86, 0xa8, 0xea, 0xf9, 0x68, 0x7a, 0x49, 0x70, 0x6a, 0x97, 0x23, 0x58, 0xdd, 0xd5, 0x28, 0xfc, - 0xa0, 0x28, 0x14, 0xf9, 0x46, 0xef, 0xbc, 0xb9, 0x91, 0xb6, 0x93, 0xd7, 0x0e, 0xef, 0x61, 0x13, - 0xef, 0x51, 0x43, 0xc2, 0x73, 0xf8, 0xc8, 0x22, 0x0f, 0xe9, 0x4d, 0xe5, 0x43, 0xa9, 0xfc, 0xea, - 0x7b, 0x60, 0xff, 0xf5, 0xa2, 0xe3, 0x6d, 0x20, 0xb9, 0x07, 0x36, 0xfa, 0x01, 0x7a, 0x1b, 0x45, - 0xff, 0x8a, 0x7f, 0x5a, 0xb1, 0xd2, 0x43, 0xf4, 0x4c, 0xdb, 0x5f, 0x7f, 0x5d, 0xb6, 0x2e, 0xfc, - 0xb8, 0x04, 0x30, 0x5f, 0x36, 0x83, 0xf6, 0xbd, 0xa4, 0x87, 0xf8, 0xf6, 0xe9, 0x57, 0x24, 0x71, - 0xd1, 0x89, 0xc6, 0x06, 0x9a, 0xd3, 0x6d, 0xc9, 0x58, 0xe6, 0xaf, 0xbf, 0x0a, 0x28, 0xe8, 0x3c, - 0xc4, 0x3f, 0x7a, 0xbc, 0x88, 0x99, 0x13, 0x30, 0x53, 0xd2, 0x43, 0xbc, 0x3c, 0x27, 0xd1, 0xcf, - 0x20, 0xff, 0xf5, 0x57, 0x09, 0xe6, 0x0b, 0x94, 0x12, 0xdd, 0x68, 0xde, 0x8f, 0x6e, 0x7d, 0xf8, - 0xeb, 0xaf, 0x4c, 0x0e, 0xa6, 0xed, 0x5c, 0xd8, 0x3e, 0x75, 0x9b, 0xf9, 0x24, 0x60, 0x99, 0x4f, - 0x36, 0xfc, 0xe3, 0x60, 0x1a, 0x2f, 0x5b, 0xc2, 0xda, 0x7d, 0x78, 0x6f, 0x00, 0xb0, 0x84, 0xc9, - 0x14, 0xf1, 0xcc, 0x3d, 0x07, 0xf3, 0x97, 0xf4, 0xee, 0xc5, 0x14, 0x9e, 0x81, 0xc9, 0x7b, 0x72, - 0x2b, 0xc2, 0x73, 0x9a, 0xaf, 0x3e, 0xed, 0x2a, 0x5c, 0x3a, 0x7e, 0x2a, 0xe8, 0x2c, 0x52, 0x74, - 0x87, 0x01, 0x64, 0x00, 0xb1, 0x2b, 0x88, 0xe1, 0x83, 0x04, 0x99, 0xd1, 0x09, 0x63, 0x84, 0x4a, - 0x15, 0xe5, 0x12, 0xf2, 0xf9, 0x2a, 0x05, 0x28, 0x1a, 0x02, 0x1c, 0xba, 0x88, 0x12, 0x5f, 0x73, - 0x3b, 0xf9, 0x8e, 0x40, 0xab, 0x7e, 0x43, 0x74, 0xea, 0x0b, 0xdd, 0xa9, 0x79, 0xfa, 0x49, 0x58, - 0x56, 0x4c, 0x0c, 0x64, 0x4a, 0x0b, 0xab, 0x0a, 0xfa, 0x72, 0x2b, 0x7f, 0xa6, 0x61, 0x88, 0xfb, - 0xca, 0x9f, 0xf7, 0x49, 0x01, 0xb3, 0x53, 0xe9, 0x58, 0x11, 0x30, 0x9f, 0xa7, 0x1f, 0xa3, 0xe6, - 0xe3, 0x4c, 0x02, 0x3d, 0x96, 0x57, 0x39, 0x67, 0x85, 0x30, 0x31, 0x10, 0xd3, 0x8c, 0xde, 0xb9, - 0x02, 0x59, 0xd0, 0xeb, 0x92, 0x34, 0x67, 0xf9, 0x1a, 0xe4, 0x43, 0x82, 0xbe, 0xd3, 0x3c, 0x09, - 0xc6, 0xf7, 0xea, 0xfc, 0x39, 0xde, 0x45, 0x09, 0x6e, 0xc8, 0x17, 0xab, 0x77, 0x8a, 0x7e, 0xd0, - 0x1b, 0xb2, 0xc6, 0xf4, 0x1e, 0xa4, 0xe5, 0xd2, 0x87, 0x8a, 0x88, 0x19, 0xe9, 0x5d, 0x45, 0xbc, - 0x47, 0x7a, 0x86, 0x04, 0x3d, 0xfa, 0x76, 0x2b, 0x61, 0xac, 0xdb, 0xb7, 0x12, 0x3f, 0xa7, 0xbe, - 0x5f, 0x81, 0xb2, 0x18, 0x7e, 0xa1, 0xfe, 0x94, 0x73, 0x7f, 0xa7, 0x05, 0x80, 0x94, 0x1d, 0x55, - 0x38, 0x37, 0x2a, 0x1e, 0x4e, 0x29, 0x48, 0xfb, 0x81, 0xd7, 0x2c, 0x31, 0xce, 0xde, 0xae, 0xab, - 0xd1, 0x16, 0x80, 0x14, 0x1f, 0xa3, 0xe1, 0x9f, 0x18, 0x44, 0xb1, 0xea, 0x3c, 0x81, 0x27, 0x7a, - 0x58, 0x10, 0x09, 0xf8, 0x06, 0xe3, 0x3e, 0x54, 0xa2, 0x45, 0x4d, 0x9d, 0x16, 0xf5, 0x2b, 0x94, - 0x85, 0x86, 0xff, 0x10, 0x38, 0x22, 0xd4, 0xcf, 0x5c, 0x03, 0xb9, 0x5e, 0xa4, 0xa5, 0x8b, 0x66, - 0xc0, 0x0c, 0xd2, 0xdf, 0x12, 0x26, 0xba, 0xff, 0x4f, 0xb4, 0x77, 0x56, 0x22, 0x9d, 0xf0, 0xed, - 0x40, 0x50, 0x81, 0x9f, 0xeb, 0x27, 0xe2, 0xe1, 0x02, 0xc2, 0x6e, 0xbf, 0x59, 0x83, 0x97, 0xc8, - 0x8c, 0x76, 0x05, 0xcf, 0x79, 0x44, 0xfa, 0x84, 0x12, 0x61, 0xe9, 0xa7, 0xe3, 0x78, 0x7c, 0xb2, - 0x9a, 0xeb, 0xa8, 0x7c, 0x2a, 0x82, 0xa0, 0x7c, 0x12, 0x2a, 0x62, 0x78, 0x89, 0xe3, 0x1a, 0x0a, - 0xf5, 0x5e, 0xea, 0x84, 0xe8, 0x3c, 0x88, 0xd9, 0x97, 0x2a, 0x0e, 0x55, 0xd9, 0xa9, 0x37, 0x13, - 0xf0, 0x70, 0x82, 0xad, 0x49, 0x0d, 0x40, 0x1b, 0xf8, 0xe9, 0xd8, 0x19, 0xa1, 0xdc, 0xed, 0xe4, - 0x95, 0x88, 0x58, 0x59, 0x92, 0xa9, 0x01, 0x44, 0x8f, 0x57, 0xc5, 0xd9, 0xf9, 0xa1, 0x9e, 0x5f, - 0xbc, 0x17, 0x0c, 0xd3, 0xb6, 0x3e, 0xf4, 0x35, 0x0f, 0xd4, 0x63, 0xd2, 0x05, 0xc8, 0x07, 0x9c, - 0xd1, 0x17, 0xe0, 0xa7, 0x54, 0x2a, 0x06, 0x4c, 0xe8, 0x22, 0x9b, 0x2d, 0xcb, 0x3f, 0x68, 0x89, - 0xb2, 0x7a, 0xf7, 0xf7, 0xdf, 0x61, 0x2a, 0x1c, 0x74, 0x5d, 0x19, 0x20, 0x56, 0xf4, 0x6b, 0xd4, - 0x43, 0x80, 0xc9, 0xa9, 0x34, 0xea, 0x17, 0x09, 0xf7, 0x0a, 0xdf, 0x9d, 0xc7, 0x7c, 0xb2, 0x15, - 0x2a, 0xed, 0x56, 0x21, 0x12, 0xa1, 0xde, 0xa1, 0x5f, 0xb4, 0x83, 0x05, 0xa8, 0x15, 0x0a, 0x12, - 0x9f, 0x12, 0x71, 0x11, 0xba, 0x4e, 0xe5, 0x2a, 0x91, 0xdb, 0x3b, 0x63, 0x20, 0x98, 0x82, 0x78, - 0xc7, 0xdd, 0xfb, 0x42, 0x7e, 0xf5, 0xee, 0xc9, 0x0a, 0x81, 0xb6, 0xb5, 0xc9, 0x47, 0xed, 0xb3, - 0xf7, 0xa8, 0xc1, 0x44, 0x58, 0xdf, 0xb4, 0x7b, 0xf2, 0xfb, 0x4b, 0xb3, 0x6b, 0x55, 0xdb, 0x30, - 0x7b, 0xf6, 0x67, 0xf7, 0x3c, 0x6f, 0x36, 0x90, 0xbb, 0x08, 0xe9, 0x42, 0xea, 0x62, 0x1c, 0x92, - 0x56, 0x60, 0x18, 0x69, 0x0b, 0xc4, 0x06, 0x35, 0x8a, 0x46, 0x1c, 0x2f, 0x5f, 0x49, 0x7f, 0xce, - 0x55, 0x22, 0x4b, 0x92, 0xbc, 0xaf, 0x90, 0xde, 0x44, 0x1a, 0x17, 0xa7, 0x71, 0x01, 0xda, 0x2f, - 0xf7, 0xd3, 0x27, 0xed, 0xc4, 0x36, 0x88, 0x70, 0x59, 0x1d, 0xed, 0xa9, 0x81, 0x1d, 0x51, 0x06, - 0xba, 0xbd, 0x73, 0x02, 0x6e, 0x3b, 0x89, 0x06, 0x06, 0x8b, 0x21, 0x2a, 0x58, 0xde, 0x23, 0x81, - 0x64, 0x3f, 0x72, 0xbd, 0x71, 0xd1, 0x0a, 0x8a, 0x7c, 0xdb, 0x39, 0x5f, 0x1c, 0x83, 0x1e, 0x61, - 0x7d, 0xc7, 0x57, 0xc8, 0xae, 0x4c, 0xba, 0x12, 0x9d, 0x5f, 0x99, 0x75, 0xe5, 0x62, 0x52, 0x30, - 0x4e, 0xee, 0xad, 0x95, 0x72, 0x67, 0xec, 0xa8, 0x56, 0xcf, 0xc6, 0xca, 0x7d, 0x7f, 0x54, 0x1f, - 0xa2, 0x87, 0x95, 0xda, 0x60, 0x45, 0x1e, 0x24, 0x07, 0xe7, 0x4d, 0x9e, 0x69, 0x15, 0x14, 0x7d, - 0x15, 0xb7, 0xe3, 0x6e, 0x11, 0x8c, 0x38, 0xaf, 0xa4, 0xd3, 0x71, 0x54, 0x1e, 0x38, 0xe7, 0x52, - 0xc8, 0x00, 0xcf, 0xab, 0xeb, 0xda, 0x3e, 0xa3, 0x67, 0x27, 0x2a, 0xb1, 0x94, 0xaf, 0xbc, 0x42, - 0xb4, 0xb9, 0x15, 0x75, 0xf8, 0x10, 0xd1, 0x44, 0x42, 0xa4, 0x9e, 0x5f, 0x2e, 0xe3, 0x5d, 0x75, - 0x7c, 0x35, 0xde, 0xf8, 0xfc, 0x67, 0x7c, 0x1e, 0xdf, 0xb2, 0x01, 0x39, 0xaf, 0x98, 0x20, 0x59, - 0x2b, 0x6f, 0xc2, 0xfd, 0xb5, 0xb8, 0xa8, 0xfe, 0x35, 0x7a, 0xf9, 0x0f, 0x68, 0x21, 0x5e, 0xb8, - 0x53, 0x84, 0x06, 0x1d, 0x37, 0xfa, 0xe5, 0xf5, 0xd3, 0x4d, 0x7d, 0xc9, 0xd7, 0x20, 0xf3, 0xf0, - 0x9f, 0x06, 0x32, 0x4f, 0x37, 0x2d, 0x24, 0xb3, 0x68, 0x5d, 0x78, 0xc9, 0xe8, 0xda, 0x6b, 0x84, - 0x9e, 0x38, 0x38, 0xb3, 0x11, 0xdc, 0x8a, 0xd0, 0x93, 0x00, 0x67, 0x6a, 0xea, 0xf1, 0x45, 0x82, - 0xa7, 0x28, 0x98, 0x56, 0xb8, 0x8b, 0x6f, 0x8f, 0xce, 0x47, 0xd1, 0x2d, 0xcb, 0x15, 0xed, 0x52, - 0xca, 0x5e, 0x5c, 0x54, 0x45, 0xb8, 0x14, 0x86, 0x92, 0xeb, 0xa1, 0x5f, 0x9b, 0x4f, 0x44, 0xf7, - 0xa5, 0x24, 0x9e, 0xff, 0xd3, 0x07, 0x93, 0xf9, 0x70, 0x30, 0xb7, 0xdc, 0x13, 0x4a, 0x24, 0x22, - 0x38, 0x84, 0x2e, 0x03, 0x3e, 0xa8, 0xd1, 0xca, 0xda, 0x47, 0x48, 0xe6, 0x80, 0xae, 0xf1, 0x9d, - 0xc0, 0xc3, 0xc3, 0xee, 0x11, 0x08, 0xd1, 0x02, 0xae, 0x3e, 0x01, 0x08, 0xa9, 0xd8, 0x98, 0x0b, - 0xb1, 0x71, 0x0f, 0xdf, 0xde, 0xbd, 0x0b, 0xd1, 0xd3, 0x83, 0xa8, 0x19, 0xdd, 0xac, 0xf0, 0x12, - 0x63, 0xab, 0xd7, 0x27, 0x10, 0xb6, 0x20, 0xe2, 0x46, 0xf3, 0x1b, 0xe1, 0xbb, 0x44, 0x5c, 0x75, - 0x2a, 0x1a, 0x55, 0xa5, 0x08, 0x96, 0x01, 0xac, 0xc5, 0x54, 0x00, 0x0e, 0xc1, 0xeb, 0xe4, 0xe9, - 0x44, 0xfb, 0x8c, 0x90, 0x6e, 0xf0, 0x30, 0x49, 0x02, 0x86, 0x05, 0xcd, 0xa4, 0xdf, 0xd4, 0xff, - 0xf9, 0x67, 0xf4, 0x3c, 0x51, 0x22, 0xed, 0xee, 0x2b, 0x42, 0x1a, 0xe2, 0xa1, 0x00, 0x11, 0xde, - 0xbe, 0x47, 0xfc, 0x0e, 0x15, 0x2e, 0xfa, 0x8e, 0x5f, 0x63, 0xe0, 0x61, 0x6a, 0xfa, 0xf4, 0x64, - 0x9c, 0x05, 0x87, 0x7a, 0x45, 0x85, 0x0c, 0xe9, 0x32, 0xd0, 0x68, 0x8d, 0x40, 0x9e, 0x66, 0xa0, - 0xa8, 0x72, 0xbe, 0xcf, 0x3c, 0x99, 0x40, 0x39, 0x15, 0x48, 0xfb, 0x30, 0x4c, 0x26, 0x0c, 0x48, - 0xec, 0x39, 0x10, 0xfd, 0x89, 0xa8, 0x3c, 0xc5, 0xc1, 0xe4, 0x94, 0x9d, 0xa1, 0xeb, 0x1e, 0x2f, - 0x45, 0x11, 0xcc, 0x7a, 0x3e, 0xef, 0xe1, 0x30, 0x55, 0xe3, 0x61, 0x78, 0xde, 0x87, 0x41, 0x98, - 0x22, 0x02, 0x07, 0x17, 0x53, 0x49, 0x06, 0xe9, 0x33, 0x4e, 0x04, 0x24, 0xac, 0x7e, 0x84, 0x84, - 0xd5, 0x74, 0x1c, 0x30, 0x3f, 0x0e, 0x34, 0xa3, 0xe8, 0xca, 0x4c, 0x34, 0x53, 0xd1, 0x3d, 0x06, - 0xb0, 0xd8, 0xc1, 0x1a, 0x2e, 0x86, 0x7a, 0xbe, 0x38, 0x90, 0x7c, 0x52, 0x2b, 0x56, 0xb4, 0x71, - 0x6a, 0x45, 0x1b, 0xa7, 0x20, 0x39, 0x8c, 0x59, 0x93, 0x93, 0x30, 0x4d, 0x55, 0x60, 0xf0, 0x32, - 0x73, 0xe0, 0xe5, 0x00, 0x8b, 0xa8, 0x11, 0x90, 0x3f, 0x6f, 0x6e, 0x32, 0x10, 0x7c, 0x6d, 0xc7, - 0xfb, 0x46, 0x7e, 0x7f, 0x58, 0x24, 0x9f, 0x7a, 0x15, 0x74, 0xb1, 0x3a, 0x99, 0xc0, 0xb4, 0xe8, - 0xe2, 0x34, 0xfa, 0x8e, 0xae, 0x4d, 0xa3, 0x03, 0x74, 0x69, 0x3a, 0x85, 0x66, 0x4e, 0x7a, 0x08, - 0x53, 0xa9, 0xcb, 0x26, 0x4d, 0x7c, 0x9f, 0xc8, 0x95, 0x36, 0x1e, 0x90, 0x73, 0x48, 0x7a, 0x08, - 0xe0, 0x62, 0xf6, 0x27, 0x0f, 0xac, 0xd1, 0x7d, 0x38, 0x60, 0xe0, 0xab, 0xf0, 0x0c, 0x5a, 0xfb, - 0xb1, 0x93, 0xf9, 0xc5, 0x41, 0x5f, 0x6e, 0xa7, 0xb8, 0x40, 0x66, 0x80, 0xb2, 0xa8, 0x20, 0x95, - 0x8e, 0x3a, 0x48, 0xdd, 0x47, 0x5f, 0xe7, 0x1d, 0xe4, 0xb0, 0xf2, 0x72, 0x35, 0x07, 0xdd, 0x55, - 0x80, 0x43, 0xef, 0x9f, 0xac, 0x68, 0x8f, 0xe2, 0xe4, 0xed, 0x7f, 0xd0, 0xf1, 0xe5, 0xae, 0xa6, - 0x2f, 0xee, 0xc3, 0x1e, 0xb4, 0x03, 0x01, 0x73, 0x0f, 0x62, 0xef, 0x7e, 0xff, 0x5d, 0x82, 0x92, - 0x03, 0x7c, 0x7d, 0x3e, 0x0d, 0xe4, 0x95, 0x07, 0x53, 0x7f, 0x69, 0x57, 0x81, 0x80, 0xc1, 0x20, - 0x23, 0x8f, 0x1e, 0xf5, 0x4c, 0xa0, 0x34, 0x1e, 0xea, 0x6d, 0x3d, 0xca, 0xea, 0x4f, 0x87, 0xf7, - 0x91, 0x49, 0x9f, 0x53, 0xfe, 0xd8, 0x48, 0x5b, 0x95, 0x84, 0xed, 0x70, 0x82, 0xe6, 0x1f, 0x12, - 0xe9, 0x25, 0x1c, 0xcb, 0x32, 0x58, 0x72, 0x22, 0xdd, 0x43, 0x6d, 0x6c, 0x27, 0x7e, 0x57, 0x40, - 0x22, 0xbd, 0x3a, 0x9d, 0x9e, 0x49, 0x41, 0xc9, 0xd5, 0xa7, 0x4b, 0x72, 0x0f, 0x95, 0x92, 0x3f, - 0x7d, 0x49, 0xf5, 0x3d, 0xf4, 0x4a, 0xe5, 0xa8, 0x90, 0x45, 0x47, 0xb0, 0xc8, 0x6c, 0xff, 0x4c, - 0x36, 0x89, 0x0e, 0x81, 0x81, 0x5d, 0xdd, 0x01, 0xa8, 0xb1, 0x77, 0x0f, 0x16, 0x17, 0x6a, 0x0a, - 0xba, 0x70, 0xf7, 0x00, 0x83, 0x72, 0x6b, 0xe8, 0x76, 0xc6, 0xd7, 0xdb, 0x7b, 0xe0, 0x5f, 0x70, - 0xd3, 0xd3, 0xa4, 0xbf, 0x7c, 0x74, 0xeb, 0xbe, 0xe5, 0xff, 0x25, 0x89, 0x8a, 0x74, 0xba, 0x7a, - 0x12, 0x79, 0x2a, 0xfc, 0x7f, 0x25, 0x93, 0x5f, 0x7f, 0x13, 0x54, 0xd7, 0x36, 0xa5, 0xbf, 0xb8, - 0xf8, 0x49, 0xa4, 0xd4, 0x43, 0xea, 0x93, 0xc7, 0xc9, 0x9c, 0xab, 0xe1, 0xda, 0x85, 0x54, 0xa8, - 0xbe, 0x56, 0x64, 0xfa, 0x04, 0x1c, 0xad, 0x0f, 0xb6, 0x68, 0x07, 0x2c, 0x00, 0x66, 0xdf, 0x77, - 0x2a, 0x38, 0xbe, 0xdb, 0xed, 0x1e, 0x76, 0xd9, 0x07, 0xdb, 0x55, 0xf0, 0x0c, 0x81, 0xe6, 0x3d, - 0x54, 0xd0, 0x4d, 0x57, 0x97, 0xcc, 0xc8, 0x8a, 0x97, 0xeb, 0x22, 0x09, 0xf1, 0x19, 0x96, 0x80, - 0x64, 0xc0, 0x1a, 0x48, 0xbd, 0xda, 0xba, 0xb5, 0x4e, 0x8b, 0x7b, 0x76, 0xce, 0xa2, 0x1a, 0x97, - 0xac, 0x78, 0x5e, 0xfd, 0xed, 0x37, 0xeb, 0x21, 0xd2, 0x27, 0x20, 0x0d, 0x48, 0xef, 0xaf, 0x4e, - 0x1e, 0xd0, 0xeb, 0x86, 0x01, 0xcd, 0x3f, 0x3f, 0x0a, 0x1f, 0x2d, 0x74, 0x21, 0x3d, 0xb9, 0x7d, - 0x15, 0x07, 0x79, 0x8d, 0xd3, 0x36, 0xfa, 0x2c, 0x7d, 0xb9, 0x2c, 0xf3, 0x9c, 0x56, 0x6e, 0x5e, - 0x06, 0x45, 0x64, 0xe0, 0x2f, 0x61, 0x5c, 0xe8, 0xba, 0x4c, 0xb3, 0xf2, 0x56, 0x57, 0xe8, 0x96, - 0xae, 0xcb, 0xaa, 0xbc, 0xf7, 0x3e, 0x57, 0xc9, 0x12, 0xf1, 0x95, 0xa8, 0x90, 0x8f, 0xde, 0xa7, - 0x78, 0x19, 0x8d, 0x18, 0x1c, 0x8a, 0xd2, 0xd6, 0xab, 0xd3, 0xc7, 0x18, 0x37, 0xf9, 0x98, 0xfb, - 0x29, 0x2a, 0x15, 0xec, 0x28, 0xda, 0x40, 0xb4, 0x38, 0x97, 0x78, 0xb0, 0xe8, 0x2c, 0x34, 0x39, - 0xaf, 0x68, 0x3c, 0xb4, 0x63, 0xf1, 0x8a, 0xc6, 0xbb, 0x6c, 0x0f, 0x6a, 0x55, 0x2d, 0xda, 0x5c, - 0x00, 0x8f, 0x58, 0xfd, 0x96, 0xe8, 0x27, 0xa2, 0xdb, 0xcc, 0x12, 0x35, 0x98, 0x10, 0xf8, 0x0f, - 0x52, 0x6d, 0xf8, 0x27, 0xa4, 0x83, 0xef, 0xa7, 0x4d, 0xc4, 0xbb, 0x33, 0x32, 0x82, 0xc1, 0x39, - 0x1c, 0x5a, 0x00, 0x1a, 0x8c, 0xef, 0xcf, 0x77, 0xe3, 0x7b, 0xb9, 0xb2, 0x52, 0xf5, 0x22, 0xf6, - 0x80, 0x81, 0xf6, 0x55, 0xe4, 0x0e, 0x84, 0x43, 0x55, 0x82, 0x2f, 0xf7, 0x74, 0x95, 0x0d, 0x31, - 0x12, 0x34, 0x57, 0x40, 0xa6, 0x8d, 0x92, 0x1d, 0xf6, 0x8d, 0xf6, 0xc1, 0x33, 0x72, 0xa9, 0x93, - 0x39, 0x3c, 0x5d, 0x26, 0xb2, 0xe2, 0x47, 0x37, 0xe5, 0x9c, 0xb7, 0x36, 0xd3, 0x77, 0xa7, 0x9b, - 0x6e, 0xae, 0xb6, 0xa4, 0x23, 0x25, 0xc7, 0xce, 0xa2, 0xf1, 0x68, 0x01, 0x7c, 0xff, 0x0a, 0x9e, - 0x1f, 0xbe, 0x2a, 0xc9, 0x93, 0x0b, 0x99, 0x21, 0xe4, 0x1b, 0x9b, 0x28, 0x3b, 0x6f, 0x4d, 0xcf, - 0xac, 0x61, 0x8d, 0x20, 0xb2, 0xb3, 0x78, 0xf3, 0x93, 0xdd, 0x31, 0xbe, 0x64, 0x26, 0xdd, 0x14, - 0xc2, 0xc4, 0xe8, 0x4a, 0xe9, 0x9d, 0xf6, 0x15, 0xed, 0x41, 0x23, 0x24, 0x8d, 0x6e, 0xab, 0x8c, - 0xb1, 0xb9, 0x8b, 0x0c, 0xe2, 0x39, 0xbd, 0xb8, 0x9d, 0x4d, 0x5c, 0xed, 0xa3, 0x42, 0xf0, 0x47, - 0x67, 0xd6, 0x57, 0xeb, 0x9b, 0xf4, 0xbd, 0x22, 0x9d, 0x0d, 0x1f, 0x05, 0xbe, 0x9a, 0x0f, 0x2b, - 0x93, 0x0f, 0x20, 0x35, 0x03, 0x01, 0xbe, 0xc5, 0xbb, 0x7c, 0x57, 0xf1, 0xf0, 0xa6, 0x47, 0x44, - 0xf7, 0x67, 0x22, 0x91, 0x25, 0x04, 0xe4, 0x21, 0xcf, 0x4c, 0x22, 0xaf, 0xbf, 0x45, 0x25, 0xb1, - 0x9d, 0x22, 0xee, 0xc3, 0xf3, 0xb5, 0x8a, 0x05, 0x8c, 0xe2, 0xf9, 0x39, 0xb2, 0xa4, 0xa0, 0xfa, - 0xd6, 0x17, 0xc6, 0x0b, 0xf8, 0xdb, 0x77, 0x74, 0x41, 0xe1, 0x61, 0x00, 0x73, 0x23, 0x61, 0x89, - 0x73, 0xd7, 0x10, 0x77, 0x35, 0x31, 0x0a, 0xfc, 0x97, 0x12, 0xcc, 0xc3, 0xb0, 0xe7, 0x97, 0xfc, - 0xd1, 0x46, 0x83, 0x3a, 0x71, 0xe1, 0xaa, 0x28, 0x69, 0x79, 0xb4, 0xe2, 0x34, 0x4d, 0x43, 0xd3, - 0x8c, 0xbc, 0x1e, 0x30, 0x59, 0x02, 0x76, 0x49, 0xfc, 0x0b, 0xb9, 0x45, 0x2e, 0x8e, 0xf9, 0xe0, - 0x11, 0x2f, 0x57, 0xa6, 0xb9, 0x87, 0xd6, 0x57, 0x12, 0x2a, 0x5a, 0x10, 0xbf, 0x9f, 0xcf, 0xfe, - 0x40, 0x43, 0x79, 0xf2, 0x29, 0xf5, 0x84, 0xe8, 0x77, 0xf6, 0x0f, 0xdb, 0xe8, 0xa2, 0x4a, 0x70, - 0x75, 0x23, 0x66, 0x3c, 0xfc, 0x1b, 0x77, 0xa5, 0x26, 0x02, 0x17, 0xc5, 0xc9, 0xa4, 0xfa, 0xd5, - 0xff, 0xeb, 0xaf, 0x93, 0xaf, 0x34, 0x6c, 0x21, 0x7a, 0x32, 0xfd, 0x01, 0xdd, 0x22, 0x1d, 0xdf, - 0xb6, 0xf5, 0xcf, 0x04, 0x76, 0x9e, 0x0a, 0x4d, 0x8c, 0x0c, 0x2a, 0xd2, 0x93, 0x71, 0xc3, 0xd5, - 0x09, 0xa7, 0xdb, 0x3c, 0xcf, 0x0a, 0x06, 0x6f, 0x90, 0x88, 0xfc, 0xd8, 0x53, 0x8c, 0x75, 0xa4, - 0x33, 0xd2, 0x01, 0x6a, 0x04, 0x46, 0x2b, 0x89, 0xf3, 0x2d, 0xd4, 0x20, 0x06, 0x2c, 0x89, 0x04, - 0x8f, 0xf6, 0x4d, 0x12, 0xa9, 0xf3, 0xd6, 0xf0, 0xa0, 0x7a, 0x5e, 0x0d, 0x00, 0x18, 0xbc, 0xf3, - 0x2a, 0xab, 0xc3, 0x5c, 0x3c, 0x3f, 0x5e, 0xdd, 0x15, 0x51, 0x3d, 0x5d, 0xe5, 0x88, 0xed, 0x36, - 0x79, 0xe5, 0xc6, 0x00, 0xa3, 0x5d, 0x69, 0xe2, 0xfa, 0x3e, 0x0b, 0xe3, 0x55, 0xcd, 0xf0, 0x26, - 0x18, 0x8d, 0x76, 0x6e, 0x5e, 0xae, 0x36, 0x3f, 0x5e, 0xfb, 0xb1, 0xfa, 0xe9, 0xda, 0x44, 0x74, - 0x57, 0xec, 0x35, 0xab, 0x97, 0x8d, 0x8d, 0x57, 0x2a, 0x87, 0x25, 0xab, 0xa6, 0xde, 0x24, 0xd1, - 0x75, 0xc8, 0x38, 0x89, 0x47, 0xf7, 0x65, 0xd3, 0xd7, 0x85, 0x44, 0xef, 0xd5, 0x2d, 0x3e, 0xe8, - 0x2a, 0xc1, 0xc3, 0xf6, 0x6c, 0x82, 0x60, 0xd2, 0x56, 0x7c, 0xc7, 0x0f, 0x94, 0x9e, 0xac, 0xda, - 0x07, 0xb3, 0x8e, 0x88, 0xd0, 0x8a, 0x5b, 0x24, 0xad, 0xd7, 0xb9, 0x89, 0xf1, 0x4b, 0x91, 0x3d, - 0x02, 0xe9, 0xd6, 0x0d, 0x0b, 0xb9, 0x8d, 0xec, 0x91, 0xe7, 0xd4, 0xce, 0x1e, 0xf8, 0x7c, 0x7b, - 0xa8, 0xb7, 0x75, 0x7d, 0x88, 0xa3, 0xe7, 0x3b, 0x26, 0xc1, 0xfd, 0x5e, 0xdd, 0x95, 0x22, 0xbc, - 0x51, 0xef, 0x19, 0x66, 0x5f, 0x43, 0xf0, 0x68, 0x57, 0x2d, 0x96, 0x08, 0xa5, 0x01, 0xc2, 0x2a, - 0x4e, 0xb4, 0x97, 0xd1, 0xde, 0xa7, 0x1b, 0x25, 0x02, 0x31, 0x26, 0x86, 0x5e, 0x5e, 0xe1, 0xf1, - 0xb8, 0x21, 0xac, 0x38, 0xee, 0xe1, 0x4f, 0x48, 0x1e, 0xdd, 0xb4, 0x86, 0xd9, 0x0f, 0x3b, 0xc0, - 0xd7, 0xaf, 0x29, 0xfe, 0xfc, 0x33, 0x6e, 0x7e, 0x46, 0x27, 0x11, 0x22, 0x06, 0x14, 0x63, 0x9f, - 0xd6, 0x9b, 0x0e, 0x47, 0xbb, 0xab, 0x75, 0xab, 0xc2, 0xb2, 0x7b, 0xdb, 0xcb, 0x9f, 0x7f, 0xaa, - 0x41, 0x84, 0x77, 0xb4, 0xeb, 0xab, 0x1a, 0xcf, 0x28, 0xb4, 0x10, 0x8f, 0xc2, 0xe7, 0x6c, 0x01, - 0xfe, 0xc2, 0x14, 0xaa, 0x0f, 0xcd, 0x58, 0x10, 0xb4, 0xf9, 0x98, 0x16, 0x30, 0xf2, 0x21, 0x9f, - 0x7e, 0xea, 0x9f, 0x71, 0x69, 0xf2, 0xcd, 0x16, 0xe1, 0x57, 0x68, 0x76, 0x2f, 0x54, 0x04, 0x58, - 0x6a, 0x08, 0xb2, 0xff, 0x2b, 0x9d, 0x27, 0x22, 0x90, 0xfa, 0x32, 0x9e, 0x77, 0x23, 0xf1, 0x38, - 0xff, 0xf4, 0x06, 0x09, 0xa0, 0xfb, 0x30, 0x33, 0x40, 0x65, 0x9c, 0xf1, 0x3a, 0x33, 0x88, 0xd2, - 0x80, 0xf7, 0x99, 0x01, 0xa0, 0x34, 0xe2, 0x25, 0x3b, 0x58, 0x57, 0x3f, 0xee, 0xfa, 0xb2, 0x45, - 0x1a, 0xb7, 0x49, 0xbd, 0x4b, 0x22, 0xac, 0x4b, 0x12, 0xc1, 0x5d, 0x27, 0x11, 0x3f, 0xc0, 0x16, - 0xbf, 0x92, 0x44, 0x44, 0xa9, 0x42, 0x74, 0x19, 0xf7, 0x21, 0x44, 0xfb, 0x56, 0x17, 0x31, 0x4e, - 0x39, 0xc0, 0x1a, 0x45, 0xc2, 0x56, 0x25, 0x49, 0x02, 0x9a, 0x8e, 0xe0, 0x7c, 0x0a, 0x20, 0x5e, - 0x53, 0xdb, 0x4b, 0x22, 0xd8, 0x76, 0x04, 0xf8, 0x4f, 0x39, 0xc3, 0x69, 0x29, 0x25, 0xdd, 0x1b, - 0x93, 0xe0, 0x3d, 0x40, 0x3a, 0xf6, 0xa0, 0xa6, 0x3e, 0x25, 0x35, 0x04, 0x2c, 0x50, 0xc6, 0xea, - 0xc5, 0xf7, 0xee, 0x7e, 0x02, 0x3c, 0xdf, 0xe7, 0xf6, 0xef, 0x73, 0x04, 0xc8, 0xd0, 0x96, 0x90, - 0x22, 0x5c, 0x03, 0x0f, 0x28, 0x5a, 0x9d, 0x8b, 0x62, 0xe4, 0xf1, 0xeb, 0x39, 0x03, 0xf4, 0x81, - 0xee, 0x49, 0x04, 0xa6, 0xf7, 0x68, 0x35, 0x21, 0x56, 0xf7, 0x12, 0x58, 0x57, 0xbc, 0xac, 0x7c, - 0xce, 0xca, 0x80, 0x56, 0x2d, 0x04, 0x5c, 0xd4, 0xa4, 0xf0, 0x29, 0x09, 0x42, 0xe2, 0x5a, 0x2a, - 0x85, 0x21, 0x50, 0x64, 0xbc, 0xec, 0xc9, 0xdb, 0x49, 0xeb, 0x93, 0x85, 0x71, 0x9f, 0x38, 0x08, - 0xcc, 0x17, 0xaf, 0x15, 0x54, 0x6f, 0x0d, 0x39, 0xa8, 0x04, 0xe8, 0x9e, 0xe3, 0x00, 0x52, 0x2f, - 0x35, 0x4e, 0x37, 0x3e, 0x19, 0xbf, 0x98, 0x6c, 0xa0, 0x1d, 0xbe, 0xa4, 0x7f, 0x8f, 0x84, 0x45, - 0xde, 0x83, 0x4b, 0x4a, 0xe8, 0x78, 0x75, 0xe9, 0xd0, 0x4e, 0x7a, 0x9f, 0x3c, 0x0c, 0x24, 0x49, - 0x41, 0xd2, 0xe1, 0xbe, 0x72, 0x4b, 0xc2, 0x33, 0x84, 0xf0, 0xd4, 0xe3, 0x67, 0xfc, 0xf4, 0x84, - 0xcc, 0xe5, 0x51, 0x19, 0xc4, 0x5f, 0xbc, 0x60, 0xe5, 0xc8, 0x19, 0xc8, 0x30, 0xf9, 0x6e, 0x10, - 0x67, 0xe4, 0x90, 0x69, 0x87, 0x55, 0x32, 0x7e, 0xb8, 0xc3, 0xe0, 0xaa, 0x32, 0x07, 0xb8, 0x26, - 0x0e, 0x46, 0xbc, 0xab, 0xa1, 0x37, 0xe3, 0xbd, 0xec, 0x4f, 0xbc, 0x3c, 0xac, 0x73, 0xda, 0xfc, - 0x13, 0xc1, 0x7d, 0x88, 0x87, 0x47, 0xb4, 0x51, 0x07, 0xf9, 0x0b, 0xba, 0x9a, 0x76, 0xba, 0xba, - 0x06, 0x6b, 0xe6, 0x44, 0xcb, 0x59, 0x9a, 0x89, 0x6e, 0x22, 0x45, 0x71, 0x57, 0x7a, 0x88, 0x33, - 0x95, 0xe8, 0xd2, 0x09, 0x32, 0xbc, 0xdf, 0x64, 0x2f, 0x75, 0xdd, 0x98, 0x13, 0xc5, 0x77, 0x2d, - 0x41, 0xd6, 0x58, 0xa6, 0xe7, 0x7f, 0x88, 0xc8, 0x41, 0x9f, 0x50, 0x7e, 0xfd, 0xc0, 0x88, 0xc9, - 0x3f, 0xbc, 0xbd, 0xf7, 0x47, 0xea, 0xc1, 0xb6, 0xe2, 0x9d, 0xc7, 0xb7, 0x37, 0x71, 0x78, 0x10, - 0x8c, 0xab, 0xf1, 0x1b, 0x68, 0xd8, 0x65, 0xf5, 0x8f, 0x38, 0xe4, 0x46, 0x5b, 0x08, 0x8f, 0x34, - 0x95, 0x44, 0xb5, 0xa9, 0x9b, 0x5c, 0xb5, 0x1f, 0x72, 0xd5, 0x5e, 0xb8, 0x32, 0xef, 0xb9, 0x6a, - 0x1f, 0x72, 0x45, 0x2f, 0x22, 0xfc, 0x01, 0x5b, 0xfe, 0x85, 0x6d, 0xed, 0x1d, 0x57, 0xfe, 0x43, - 0xae, 0xe8, 0x65, 0x8a, 0x3f, 0xe0, 0xba, 0x7b, 0xe1, 0xba, 0x78, 0xc7, 0x75, 0xf7, 0x21, 0xd7, - 0xf8, 0xb5, 0x39, 0x3f, 0xe0, 0x0b, 0x3c, 0xaa, 0x57, 0xcc, 0x22, 0x90, 0x77, 0xe9, 0x69, 0x34, - 0x85, 0xae, 0xa0, 0x22, 0x0e, 0x85, 0x12, 0x78, 0x26, 0xd1, 0xab, 0x9a, 0x5e, 0x06, 0xd6, 0x91, - 0x07, 0x71, 0x00, 0xfa, 0x84, 0xce, 0xa3, 0xbe, 0xdf, 0xf7, 0x1c, 0xbf, 0xed, 0x07, 0x7a, 0x8e, - 0xae, 0x74, 0xb7, 0xa7, 0xfd, 0x5e, 0xf5, 0x8f, 0x37, 0x6f, 0xf8, 0xb9, 0x4b, 0xfe, 0x81, 0x9d, - 0xb8, 0x62, 0x7f, 0xa4, 0xfe, 0xf8, 0x68, 0x00, 0xfe, 0xdf, 0x94, 0xff, 0xa6, 0xa0, 0xaf, 0x07, - 0x36, 0x3d, 0x0f, 0xec, 0x7d, 0x87, 0xd4, 0x7b, 0xb1, 0xdf, 0xbe, 0x15, 0xe8, 0xad, 0xdc, 0x67, - 0x25, 0x3c, 0xff, 0x23, 0xda, 0x19, 0x73, 0xd0, 0x93, 0x76, 0xd1, 0x96, 0x91, 0x6b, 0x3f, 0x5c, - 0xed, 0x36, 0x26, 0x13, 0xff, 0x14, 0x1c, 0xe1, 0x82, 0xf7, 0x32, 0xe0, 0x97, 0xce, 0x6f, 0x7d, - 0x82, 0xc3, 0xd7, 0x17, 0xce, 0x2a, 0xd1, 0x52, 0x41, 0x11, 0xf7, 0x72, 0xa3, 0x7d, 0x3d, 0x99, - 0xfa, 0x07, 0x42, 0x4a, 0x1f, 0x1a, 0x64, 0xa4, 0x81, 0x2f, 0x04, 0x50, 0xbd, 0x27, 0x71, 0x76, - 0x2e, 0x50, 0x44, 0xb8, 0xf2, 0x01, 0xa2, 0xa0, 0x0f, 0xf1, 0x28, 0xc1, 0x5f, 0x5e, 0xb4, 0x99, - 0xcc, 0x12, 0x28, 0xac, 0x3e, 0x46, 0x37, 0xc0, 0xfd, 0x07, 0x9a, 0x93, 0xa7, 0xe6, 0xff, 0x00, - 0xf1, 0xc0, 0xf7, 0xdc, 0x94, 0xc0, 0xb7, 0x8c, 0xff, 0x1d, 0x09, 0x7e, 0xd2, 0xfc, 0x2c, 0xc1, - 0xf3, 0x3f, 0x2e, 0x0a, 0x5b, 0x26, 0x01, 0xb5, 0x83, 0x28, 0x30, 0x3b, 0x89, 0x68, 0xd2, 0x9b, - 0xcb, 0x6a, 0x02, 0x43, 0x65, 0x8f, 0x57, 0x54, 0xa3, 0x77, 0x54, 0xa3, 0x1b, 0x54, 0xe8, 0x1d, - 0x68, 0xb7, 0x75, 0x7f, 0x7e, 0xdd, 0x19, 0x08, 0x17, 0x85, 0x05, 0xe9, 0xc4, 0xec, 0x0f, 0xc4, - 0x8b, 0x5a, 0xa1, 0x37, 0x65, 0xc5, 0x83, 0xba, 0x2e, 0x24, 0x50, 0xe1, 0x35, 0xfb, 0xf3, 0xeb, - 0x63, 0x7f, 0xd4, 0x87, 0x75, 0xb3, 0x0b, 0x76, 0x70, 0xa3, 0x0b, 0x28, 0x7c, 0xdb, 0xc5, 0x79, - 0x31, 0x98, 0x00, 0x81, 0xb4, 0x53, 0xa4, 0x87, 0x02, 0x48, 0x1b, 0xbd, 0xab, 0xbb, 0xa2, 0x4f, - 0xd5, 0x78, 0x01, 0xbd, 0x91, 0x33, 0xf5, 0x6a, 0x35, 0x25, 0x4f, 0x75, 0xff, 0x8a, 0xeb, 0x50, - 0xe0, 0xbf, 0xc2, 0x11, 0xc4, 0x25, 0xb2, 0x9d, 0x98, 0x62, 0x89, 0x28, 0x6d, 0x89, 0x1b, 0x7f, - 0x26, 0x89, 0xaf, 0x7f, 0x10, 0x7f, 0x54, 0xfe, 0xf8, 0x23, 0x75, 0x5e, 0x38, 0xa0, 0xdd, 0x53, - 0x56, 0x75, 0x7e, 0x80, 0xf4, 0x8d, 0xcb, 0x8f, 0x76, 0x35, 0xd9, 0xf8, 0x35, 0x6a, 0x5e, 0xf5, - 0x5a, 0x29, 0x5e, 0xfd, 0x40, 0xa1, 0x48, 0x33, 0xe0, 0x4c, 0x09, 0x01, 0xb9, 0x97, 0x97, 0xc1, - 0x25, 0x5e, 0x10, 0xea, 0x1e, 0x40, 0xe7, 0xfe, 0xf3, 0x6b, 0x2e, 0xe7, 0x4c, 0x62, 0x7f, 0xbe, - 0x64, 0x14, 0x57, 0x7b, 0xd5, 0xd7, 0x64, 0xdf, 0xf6, 0xdf, 0x5f, 0xf7, 0x36, 0xe5, 0x94, 0xb8, - 0xaf, 0x08, 0xa7, 0x5c, 0x75, 0x72, 0x80, 0x4e, 0x0e, 0xa7, 0x4e, 0x2e, 0xdc, 0x0f, 0x88, 0x3b, - 0xcc, 0xe3, 0xa9, 0xf8, 0xdb, 0xe1, 0x7b, 0x0c, 0xe2, 0xab, 0xd5, 0x58, 0xd6, 0x44, 0xea, 0xe9, - 0xaa, 0xca, 0xb6, 0x22, 0xa6, 0x55, 0xe8, 0x70, 0x0e, 0x4b, 0xfe, 0xf1, 0x7d, 0x55, 0x12, 0x4d, - 0xe4, 0xf3, 0x3f, 0x5a, 0xcc, 0x10, 0x8e, 0x22, 0xe7, 0x12, 0x5d, 0x4a, 0x7e, 0x7d, 0x6d, 0xf4, - 0xa2, 0xbd, 0x18, 0xaf, 0xc7, 0xc5, 0xa7, 0x69, 0x16, 0xdc, 0x6a, 0x7c, 0x35, 0xc9, 0x55, 0xf8, - 0x07, 0x37, 0xde, 0xbd, 0x57, 0xae, 0x8a, 0x94, 0xb8, 0x88, 0xbf, 0x2a, 0xe2, 0xe3, 0x22, 0xe4, - 0x30, 0x13, 0x89, 0xc7, 0xc8, 0x28, 0x5f, 0xdf, 0x9e, 0xf1, 0xc7, 0xc3, 0xe9, 0x15, 0x82, 0x57, - 0x46, 0xf9, 0x14, 0xd3, 0x47, 0xab, 0x68, 0x92, 0x81, 0x55, 0x24, 0xb8, 0x58, 0xe2, 0xf7, 0x56, - 0x74, 0xa4, 0xc0, 0x51, 0x3d, 0x3a, 0xe2, 0x4f, 0xb6, 0x7a, 0x4d, 0x7c, 0xa1, 0xbd, 0x90, 0x9e, - 0x28, 0x91, 0x43, 0x41, 0xb8, 0x26, 0x05, 0x96, 0x2d, 0xc4, 0x3e, 0xf6, 0x46, 0xac, 0x49, 0x08, - 0x61, 0xe2, 0xec, 0x1b, 0x4e, 0x7b, 0xa4, 0x30, 0x31, 0x57, 0xc6, 0x1f, 0xe9, 0xee, 0x1f, 0x4f, - 0x16, 0xe4, 0xef, 0x20, 0x6c, 0x35, 0xf1, 0xfb, 0xe5, 0x08, 0x8b, 0x13, 0xb1, 0xe8, 0x9d, 0x13, - 0xc9, 0xe8, 0x61, 0x32, 0xf4, 0x39, 0xe1, 0x29, 0x18, 0xb2, 0x17, 0xdf, 0x32, 0xb0, 0xec, 0xf7, - 0xda, 0xbe, 0xef, 0x4c, 0xe2, 0xa2, 0x24, 0x32, 0xf6, 0xe8, 0x08, 0x66, 0xe2, 0xed, 0x4d, 0x3a, - 0x57, 0x86, 0xfc, 0x8f, 0xcb, 0xed, 0xcc, 0xd7, 0xf7, 0x0f, 0xe5, 0xce, 0x0f, 0x0f, 0xc0, 0x69, - 0xe0, 0x55, 0xab, 0x19, 0x82, 0x38, 0x95, 0x40, 0x74, 0x74, 0xc0, 0xfe, 0x24, 0xe8, 0xed, 0xb7, - 0x2a, 0xba, 0x6c, 0x8b, 0x52, 0x4d, 0x00, 0x75, 0xc4, 0x8d, 0x21, 0x23, 0x9f, 0x9f, 0x38, 0xf9, - 0xfc, 0xea, 0xdb, 0xd6, 0xb7, 0xcd, 0xf7, 0x0f, 0x4e, 0xf8, 0x23, 0xf5, 0x8d, 0xf8, 0x0e, 0x13, - 0xa6, 0x19, 0x22, 0xba, 0x71, 0x15, 0x5d, 0xda, 0x7d, 0xb0, 0xe0, 0x60, 0x7e, 0x09, 0x9e, 0xae, - 0xfb, 0xab, 0xdc, 0x04, 0xe3, 0x17, 0xb8, 0x29, 0x7f, 0x8b, 0x1b, 0xf9, 0x13, 0x6e, 0xfc, 0xdf, - 0xe2, 0x96, 0xf9, 0x98, 0x5b, 0xbc, 0x8c, 0x2e, 0xf6, 0x8e, 0xee, 0xc5, 0x71, 0xdd, 0xb4, 0x52, - 0x71, 0x95, 0x34, 0x5f, 0x71, 0xf9, 0x78, 0x13, 0x67, 0x17, 0xfe, 0x6a, 0x77, 0xbb, 0xf0, 0xc7, - 0xaa, 0x00, 0x33, 0xd8, 0x85, 0x5f, 0xaa, 0x44, 0xea, 0x7d, 0x60, 0x4b, 0x20, 0xdc, 0x77, 0x99, - 0xc8, 0x5d, 0x78, 0x5a, 0x1d, 0x1f, 0xfb, 0xbb, 0x9d, 0x0a, 0xe4, 0x88, 0x7d, 0x6c, 0xef, 0xa7, - 0x3d, 0xa2, 0x6a, 0x9c, 0x6d, 0x83, 0xd1, 0x23, 0xec, 0x9f, 0xfc, 0x45, 0xb9, 0xad, 0xd3, 0x14, - 0x5e, 0xb0, 0x4e, 0xea, 0xb7, 0x2a, 0xf1, 0x15, 0x65, 0x14, 0x31, 0xfe, 0xb8, 0x01, 0x8f, 0x62, - 0x34, 0xf9, 0xb7, 0xcc, 0xce, 0xdb, 0xff, 0x58, 0x3b, 0x1f, 0xe1, 0xf6, 0xbf, 0xd5, 0x89, 0xf6, - 0xb7, 0x3b, 0x79, 0x17, 0x55, 0x7f, 0x5d, 0x6d, 0xde, 0x0f, 0xfb, 0xaa, 0x46, 0x39, 0xd9, 0x6b, - 0x3f, 0xf5, 0x7a, 0x0e, 0xa1, 0x85, 0x90, 0x78, 0xad, 0xf9, 0x5f, 0x1d, 0xa7, 0xe8, 0xbd, 0x99, - 0xb2, 0xc7, 0x53, 0xde, 0x87, 0xf0, 0x21, 0x8a, 0xf8, 0x17, 0xcf, 0xe4, 0x48, 0x10, 0x25, 0x5a, - 0xf4, 0x34, 0x91, 0x4e, 0x80, 0x93, 0x4d, 0x60, 0x27, 0x9f, 0x97, 0x8e, 0x85, 0x3b, 0x93, 0x79, - 0x92, 0x25, 0x46, 0xb7, 0x88, 0xbc, 0xc2, 0x3b, 0xe0, 0x6e, 0x25, 0xe4, 0x6e, 0x9f, 0x22, 0xae, - 0x37, 0xac, 0xc0, 0x97, 0x11, 0x1a, 0x73, 0x85, 0x2a, 0x22, 0xbb, 0x6e, 0xe9, 0x50, 0x28, 0x04, - 0xc5, 0x81, 0xc7, 0x11, 0xaa, 0x17, 0x08, 0x7c, 0xfd, 0xb8, 0x52, 0x44, 0xf1, 0x78, 0x0a, 0x4d, - 0x8e, 0xf0, 0x12, 0x93, 0xe0, 0xf8, 0x12, 0x8c, 0xe0, 0x98, 0xff, 0xc5, 0xc8, 0x73, 0x52, 0x78, - 0x9c, 0x80, 0x2b, 0xfc, 0x2f, 0x46, 0xa1, 0x7f, 0xfc, 0x2a, 0xf3, 0x68, 0x29, 0xdc, 0xe2, 0xfe, - 0x71, 0xd8, 0x02, 0xfd, 0xc5, 0xa4, 0xaf, 0x51, 0xe4, 0x08, 0xc0, 0xcd, 0x4b, 0x6e, 0xfe, 0x6b, - 0x58, 0x3e, 0xca, 0xde, 0x7f, 0x4c, 0x77, 0x63, 0x82, 0xae, 0xab, 0x21, 0x7e, 0x5c, 0x5e, 0xe0, - 0x3a, 0x8d, 0x81, 0xe1, 0x47, 0x28, 0xfb, 0x55, 0x33, 0xd4, 0xf3, 0x75, 0x4b, 0xf2, 0x2d, 0x6a, - 0x1d, 0x9c, 0x86, 0x13, 0x6d, 0x41, 0x5c, 0x08, 0x07, 0x8d, 0x3f, 0x5e, 0x8d, 0xda, 0xf1, 0x92, - 0x8e, 0x37, 0x08, 0xcc, 0x13, 0xb8, 0xfd, 0x40, 0xe1, 0xf7, 0x8e, 0xf7, 0x81, 0xce, 0x5f, 0x14, - 0x3e, 0xea, 0x81, 0x7e, 0x23, 0x5e, 0x3f, 0x99, 0xbd, 0x37, 0xcc, 0x5e, 0xac, 0xe3, 0x8a, 0x17, - 0x7b, 0xc5, 0xeb, 0x25, 0x81, 0x7b, 0x79, 0xb8, 0x34, 0xc6, 0x63, 0x27, 0x34, 0xea, 0x9c, 0xa2, - 0x22, 0x7a, 0x64, 0xcb, 0x8a, 0x9e, 0xf9, 0x78, 0xbc, 0xe0, 0x47, 0xaf, 0xea, 0xb8, 0x3f, 0xc1, - 0x8b, 0x11, 0x2d, 0x59, 0xbd, 0x7a, 0x88, 0x38, 0x6e, 0x89, 0x16, 0x72, 0xa4, 0xeb, 0x13, 0x49, - 0xe6, 0x06, 0x09, 0x79, 0x21, 0x41, 0x98, 0x92, 0xfc, 0xe2, 0x65, 0x4e, 0x77, 0xdf, 0x9b, 0x4e, - 0xd5, 0xcb, 0x3c, 0x42, 0x1b, 0x8f, 0x7c, 0x04, 0xe6, 0x70, 0x7e, 0x4a, 0x40, 0x4f, 0x21, 0xe1, - 0x24, 0xcf, 0x3b, 0xe9, 0xde, 0x62, 0xe7, 0xf8, 0x75, 0xc9, 0x91, 0x3b, 0x7a, 0x7c, 0xdd, 0xf4, - 0xca, 0x3b, 0x79, 0x24, 0x96, 0xb8, 0xbb, 0xbf, 0x4b, 0x60, 0xd0, 0xe5, 0x69, 0xbf, 0xe7, 0xe5, - 0xa5, 0xc0, 0x24, 0x24, 0xd3, 0x40, 0xf0, 0xc7, 0xef, 0xa3, 0x0c, 0x3a, 0xca, 0x80, 0x22, 0x2f, - 0xbb, 0x57, 0x9f, 0x71, 0xb4, 0xb3, 0x04, 0x5f, 0xaa, 0x6f, 0x1a, 0x5f, 0xfe, 0x6f, 0x67, 0xf6, - 0x71, 0xf5, 0x6f, 0xb5, 0x00, 0x00, + 0x38, 0xfd, 0x66, 0x55, 0x01, 0x2d, 0x79, 0x5f, 0x3a, 0x25, 0x0b, 0xa7, 0x6d, 0x29, 0x44, 0x76, + 0x7e, 0x05, 0xe8, 0x97, 0x96, 0x7d, 0xe7, 0xa3, 0xff, 0x9d, 0xf8, 0x82, 0xc4, 0x0b, 0xd5, 0x1b, + 0xb4, 0xf9, 0xf2, 0xbb, 0x1e, 0x80, 0x47, 0x3c, 0x1f, 0xbd, 0x0f, 0xf5, 0x34, 0x6f, 0x77, 0xc9, + 0x53, 0x86, 0x71, 0x97, 0x2f, 0xdc, 0xc3, 0x80, 0x22, 0xfc, 0x79, 0x25, 0xc6, 0x08, 0xc1, 0xc4, + 0x86, 0x24, 0x73, 0x60, 0xac, 0xef, 0x64, 0x1c, 0x25, 0xaf, 0x2c, 0x10, 0x65, 0x4f, 0x37, 0x28, + 0x32, 0x91, 0x81, 0x81, 0x1c, 0x87, 0x18, 0xd8, 0xdd, 0x0d, 0x2d, 0xe3, 0x70, 0x83, 0x0e, 0x74, + 0x59, 0x07, 0x1b, 0x16, 0xa1, 0xe8, 0xee, 0xd4, 0xe0, 0x06, 0x15, 0x8a, 0xe2, 0x90, 0x8f, 0xc4, + 0x10, 0xf1, 0x23, 0x56, 0xf9, 0x2b, 0x56, 0x2f, 0xd4, 0x37, 0x08, 0x0b, 0xc8, 0x7c, 0x5d, 0xff, + 0x16, 0x0f, 0x64, 0x9b, 0x86, 0x1d, 0xbc, 0x8f, 0xdf, 0x23, 0x04, 0x27, 0x7b, 0x5c, 0xc8, 0xdd, + 0xa8, 0x01, 0xab, 0x1c, 0x0a, 0xd2, 0x0d, 0x28, 0x38, 0x8a, 0x70, 0x64, 0xd3, 0x86, 0x6c, 0xea, + 0xa6, 0x16, 0xc9, 0x8f, 0x21, 0xe8, 0x28, 0x42, 0x91, 0xe7, 0x98, 0x0b, 0xb0, 0xe4, 0x96, 0xa7, + 0x1a, 0x45, 0x78, 0x92, 0x0d, 0x2c, 0xef, 0x86, 0x2f, 0x19, 0x45, 0x80, 0x72, 0xa2, 0x85, 0x92, + 0x25, 0x4a, 0xc6, 0xfb, 0x88, 0x3c, 0x8a, 0xc0, 0x24, 0x80, 0x7a, 0xe9, 0x78, 0x93, 0x73, 0xe1, + 0x87, 0x71, 0x74, 0x14, 0xc1, 0xc9, 0x55, 0xf4, 0xce, 0x65, 0xfb, 0x86, 0x77, 0x1f, 0x45, 0x48, + 0xb2, 0x66, 0x71, 0x86, 0xad, 0xd8, 0x37, 0x7c, 0xf8, 0x28, 0x82, 0x91, 0xac, 0x73, 0x13, 0x98, + 0x8c, 0x22, 0xe4, 0x38, 0x42, 0x17, 0x21, 0x6e, 0xc9, 0x8d, 0x80, 0x63, 0x3c, 0xe8, 0xf7, 0xeb, + 0x77, 0x14, 0x61, 0xc6, 0xba, 0x24, 0x09, 0x37, 0xd9, 0x82, 0xba, 0xe6, 0x9a, 0xe5, 0x73, 0xca, + 0x4d, 0x9b, 0xcd, 0x21, 0x9b, 0x07, 0xa4, 0xe9, 0x07, 0xee, 0xcd, 0xfa, 0x68, 0xd1, 0x5a, 0xa2, + 0x27, 0x70, 0x37, 0x27, 0x23, 0xc2, 0x88, 0x12, 0x77, 0xbb, 0x67, 0xd0, 0x16, 0xab, 0x4a, 0x2e, + 0x7f, 0x73, 0xa6, 0x10, 0x36, 0x6c, 0xdf, 0x5e, 0x6a, 0x08, 0x15, 0xa2, 0xaa, 0xc2, 0x7b, 0x4f, + 0x33, 0x8a, 0xa1, 0xa0, 0x7b, 0xd8, 0xdd, 0x64, 0x8a, 0xe0, 0x5f, 0xe7, 0x06, 0x14, 0x1b, 0x45, + 0xb0, 0xaf, 0xe5, 0x7e, 0xa8, 0x87, 0x08, 0xed, 0x49, 0x3b, 0x55, 0xbb, 0x55, 0x87, 0x22, 0xab, + 0xe4, 0xfa, 0xda, 0xed, 0x85, 0x9a, 0x3d, 0x21, 0x91, 0x5b, 0x55, 0xa0, 0x1d, 0x46, 0x90, 0xe4, + 0x0f, 0x6a, 0xd1, 0xca, 0x3b, 0x70, 0xd6, 0xcd, 0xba, 0xd2, 0x29, 0xde, 0xde, 0x8d, 0x6e, 0x25, + 0xa7, 0xa3, 0x08, 0xd2, 0xd5, 0x02, 0x3f, 0x30, 0x6f, 0x2d, 0x41, 0x04, 0xe4, 0xfa, 0x30, 0x50, + 0x18, 0xed, 0xad, 0x5a, 0x32, 0xaa, 0x75, 0xa5, 0x5b, 0x4b, 0x1e, 0x81, 0x38, 0x30, 0x71, 0x93, + 0x7b, 0x1f, 0xe5, 0x47, 0x11, 0x82, 0x83, 0x4a, 0xde, 0x08, 0x6e, 0x55, 0x82, 0x9a, 0x86, 0x71, + 0xbe, 0xfe, 0xfb, 0xdd, 0x54, 0xe2, 0x6e, 0xcd, 0x02, 0x42, 0x6d, 0x53, 0x8d, 0x33, 0xb9, 0x5b, + 0x93, 0x87, 0xf0, 0x5a, 0xcd, 0x71, 0x35, 0x88, 0x75, 0x17, 0xac, 0x7c, 0xf7, 0x6b, 0xb1, 0x20, + 0xde, 0x16, 0xb8, 0xfb, 0xac, 0x45, 0x3f, 0xe6, 0x15, 0xed, 0x5b, 0xf8, 0x32, 0xb0, 0x36, 0x00, + 0xdf, 0x55, 0xcf, 0xbf, 0xec, 0x95, 0x4c, 0x9d, 0x42, 0xc5, 0xf5, 0x4f, 0x8a, 0x40, 0xd3, 0xb8, + 0x11, 0xda, 0x37, 0x43, 0x6f, 0xe8, 0x46, 0x5b, 0x7a, 0x02, 0xb8, 0x1e, 0xff, 0x0b, 0xfe, 0xe9, + 0xb7, 0x7f, 0x7c, 0xba, 0xd3, 0x5c, 0xfb, 0x61, 0xe3, 0xdd, 0x85, 0xd9, 0x87, 0xec, 0x03, 0x01, + 0xe7, 0x10, 0xe2, 0x0b, 0xf7, 0xf0, 0xa7, 0x74, 0xd7, 0x89, 0x7e, 0x37, 0xac, 0xc1, 0x59, 0x9a, + 0x64, 0x40, 0xc5, 0x44, 0x32, 0xa4, 0xc8, 0x17, 0x07, 0x16, 0x7a, 0x51, 0xbf, 0xaf, 0x4a, 0x77, + 0x7d, 0x66, 0x7a, 0x07, 0x83, 0x93, 0x60, 0xdd, 0x02, 0x81, 0xa2, 0xf9, 0x6a, 0xc0, 0x3f, 0x08, + 0xb6, 0x89, 0x6f, 0x38, 0xd4, 0x16, 0x8f, 0x79, 0xff, 0xe3, 0x13, 0xfe, 0x8f, 0xdf, 0xe4, 0xc0, + 0x8a, 0xf6, 0xec, 0x92, 0x7e, 0x5a, 0x4a, 0x3d, 0x25, 0x6c, 0x7e, 0x03, 0xa1, 0x2a, 0x51, 0xad, + 0xa2, 0x5d, 0x10, 0x5b, 0xbe, 0x93, 0xf6, 0xe8, 0x07, 0xfd, 0xbc, 0xdf, 0x7f, 0x7f, 0x57, 0x63, + 0xda, 0x62, 0x60, 0x48, 0x5f, 0xe3, 0xaf, 0x87, 0x13, 0x5d, 0x55, 0x4a, 0xa6, 0x2a, 0x89, 0x33, + 0xcf, 0x17, 0x62, 0x11, 0x6c, 0xd1, 0x92, 0x7e, 0xff, 0x3d, 0xfe, 0x7e, 0xe0, 0x4c, 0xf1, 0x6b, + 0x7c, 0x98, 0xfc, 0xf6, 0x1d, 0xfa, 0xad, 0x7c, 0xd4, 0xef, 0xd7, 0xd3, 0xf7, 0x03, 0x48, 0x1c, + 0xf1, 0xf6, 0xcf, 0x47, 0xcf, 0x49, 0x5f, 0xd5, 0xbc, 0xf4, 0x45, 0xfc, 0xd4, 0x93, 0x2b, 0x81, + 0x2f, 0xb1, 0xee, 0x5e, 0x06, 0x94, 0x7a, 0x3a, 0x1f, 0xdf, 0x49, 0x49, 0x2f, 0xf5, 0xa4, 0xc9, + 0x49, 0xf7, 0x9b, 0xf7, 0x3d, 0x75, 0x22, 0x44, 0xc7, 0x67, 0xb9, 0x1f, 0x43, 0xce, 0xbd, 0xb3, + 0xaa, 0xa8, 0xa8, 0xfa, 0xa4, 0x55, 0xbc, 0xb4, 0x51, 0xf9, 0x8d, 0x4c, 0x9f, 0x2a, 0x2b, 0x4f, + 0xcf, 0xcf, 0x8f, 0xa7, 0x46, 0x3e, 0x6a, 0x24, 0x00, 0x1c, 0x4e, 0x5a, 0xe7, 0xb6, 0x69, 0x2b, + 0xfd, 0x72, 0x2c, 0xa5, 0xe0, 0xc4, 0xa8, 0xfe, 0x46, 0xbc, 0x94, 0x3d, 0x23, 0xde, 0x6e, 0xf5, + 0xe9, 0xc2, 0x43, 0x7a, 0x30, 0xab, 0xa0, 0xed, 0x07, 0xa1, 0xea, 0xc2, 0x5f, 0xad, 0x7a, 0x2d, + 0xf1, 0xb9, 0x9b, 0x67, 0xa8, 0x11, 0xaf, 0x6a, 0xd2, 0x6e, 0x1a, 0x46, 0x20, 0x3d, 0xd8, 0xe8, + 0x30, 0xf5, 0xd7, 0x5f, 0xc3, 0x48, 0x5f, 0x0f, 0xb1, 0x12, 0x47, 0xae, 0xed, 0x80, 0x9f, 0x38, + 0x44, 0x64, 0xe8, 0x37, 0x5d, 0x64, 0x4d, 0x09, 0x5c, 0xf4, 0xc6, 0xfd, 0x68, 0x14, 0x56, 0x60, + 0x4a, 0xa7, 0x33, 0x22, 0xad, 0x48, 0x7e, 0xc5, 0x7b, 0x4e, 0x21, 0xfe, 0xd6, 0xab, 0x9e, 0x63, + 0x29, 0xfd, 0xdf, 0x7f, 0xf7, 0x1f, 0xfc, 0xaf, 0xef, 0xd5, 0x1a, 0xf5, 0x85, 0x20, 0xca, 0x73, + 0xe5, 0x46, 0xe5, 0xd5, 0xd8, 0xc4, 0xa4, 0x9b, 0x4e, 0x70, 0x09, 0x90, 0x32, 0xed, 0xa2, 0x5e, + 0xec, 0xea, 0x6b, 0x13, 0x3b, 0x11, 0x9e, 0x06, 0xe0, 0xb8, 0xb6, 0x6f, 0xa3, 0x39, 0x7f, 0x00, + 0x78, 0x3d, 0xdc, 0x59, 0xe7, 0xa1, 0xc4, 0x3a, 0x46, 0x0d, 0x10, 0x0f, 0xa7, 0x9a, 0x48, 0xa4, + 0xa5, 0xa4, 0xf4, 0xe0, 0x55, 0x73, 0x30, 0xf3, 0xdf, 0xae, 0x39, 0x42, 0x47, 0x4f, 0x09, 0x48, + 0x0c, 0x61, 0x8d, 0xb9, 0x1a, 0x98, 0xd0, 0xe3, 0x65, 0xd2, 0xbd, 0xf3, 0xb0, 0x24, 0xa4, 0x3d, + 0x98, 0x26, 0x2d, 0x6d, 0xa7, 0xb9, 0xb4, 0x9a, 0x16, 0xaa, 0xfe, 0x83, 0x8a, 0x67, 0x0b, 0x44, + 0x3a, 0x80, 0x23, 0x0f, 0x27, 0x09, 0x22, 0x6d, 0xc0, 0x51, 0x88, 0x8e, 0x1e, 0xbd, 0x9d, 0xe6, + 0x0b, 0x6a, 0xd2, 0xaa, 0xea, 0xc9, 0xc2, 0x27, 0x21, 0x95, 0xd6, 0xaa, 0xf0, 0x75, 0x6f, 0xa5, + 0xed, 0xaa, 0xf1, 0x29, 0x49, 0xde, 0x07, 0xa9, 0x34, 0x17, 0x1f, 0x69, 0x9f, 0xe0, 0x58, 0x8d, + 0x8f, 0xd1, 0x69, 0x0a, 0x9d, 0x5b, 0xff, 0x2a, 0xa4, 0x9e, 0xd0, 0xaf, 0xc4, 0xdd, 0x11, 0x15, + 0xa9, 0x6a, 0xa4, 0xdd, 0xaa, 0x9a, 0xf6, 0xaa, 0xf6, 0x23, 0xef, 0x4a, 0x9c, 0xfe, 0x18, 0x55, + 0x90, 0x50, 0xc1, 0x41, 0x85, 0xf1, 0xb6, 0x22, 0x03, 0x15, 0xf6, 0xa9, 0x42, 0xbd, 0xae, 0xc8, + 0x9e, 0x2a, 0x38, 0xa8, 0x30, 0xae, 0x2b, 0x72, 0x50, 0xa1, 0x42, 0x85, 0xfd, 0xb6, 0x22, 0x7f, + 0xea, 0x1c, 0x55, 0x70, 0xcf, 0xb1, 0xce, 0x9f, 0xdc, 0xca, 0x0e, 0xfd, 0x98, 0xc5, 0x27, 0x30, + 0x52, 0xe5, 0x74, 0x08, 0xb3, 0xc4, 0x9f, 0x0e, 0xbd, 0xd4, 0xf3, 0xf3, 0x45, 0x77, 0xd6, 0x95, + 0xee, 0x40, 0x33, 0x2e, 0x8e, 0x7e, 0xfc, 0xc2, 0x83, 0x23, 0x25, 0x3a, 0xb2, 0xe0, 0x88, 0x8f, + 0x8e, 0xb4, 0x6a, 0x9f, 0xf3, 0xd5, 0x07, 0x93, 0xdb, 0x27, 0x23, 0x25, 0xa7, 0x40, 0x4f, 0x71, + 0x89, 0x66, 0x9d, 0x4b, 0xb8, 0xaa, 0x76, 0x6f, 0x9f, 0xf5, 0xaa, 0x9d, 0xd4, 0x63, 0x83, 0x84, + 0xc4, 0xb5, 0xc8, 0x2e, 0x14, 0x24, 0xbd, 0x7b, 0x2b, 0x85, 0x73, 0x58, 0xd2, 0xfb, 0x6c, 0x7d, + 0x2d, 0x54, 0x88, 0xd4, 0x35, 0x81, 0x87, 0x08, 0xac, 0x7b, 0x17, 0x11, 0x64, 0xae, 0x2b, 0x2c, + 0x54, 0xe1, 0xde, 0x7b, 0xa8, 0x22, 0xf7, 0x7c, 0xb6, 0x44, 0xbc, 0x5a, 0x48, 0x3f, 0xa9, 0x30, + 0x38, 0x98, 0x68, 0x34, 0x64, 0x0f, 0x0e, 0x89, 0x6a, 0x55, 0xfb, 0x4a, 0x54, 0x38, 0x5c, 0xfb, + 0x04, 0x53, 0x9d, 0x4a, 0x87, 0x50, 0x06, 0x07, 0x9f, 0xb4, 0xeb, 0xb1, 0x6b, 0x97, 0xb1, 0x5f, + 0xac, 0xc3, 0x3d, 0x5b, 0x07, 0xe8, 0xe0, 0x01, 0xb4, 0xf6, 0x29, 0x99, 0xb9, 0x97, 0x52, 0x17, + 0xa3, 0xaf, 0xba, 0x9f, 0x24, 0x1c, 0x4c, 0x20, 0x1a, 0x38, 0xc7, 0x7b, 0xc9, 0xcc, 0x27, 0xef, + 0x9e, 0x4c, 0xa5, 0x50, 0xff, 0x60, 0x6a, 0x51, 0xd7, 0xa8, 0x1b, 0x09, 0x56, 0x2e, 0x98, 0xda, + 0xe9, 0xec, 0x95, 0xc2, 0xed, 0xdb, 0x9d, 0x1a, 0x91, 0x49, 0x9e, 0x3d, 0xd6, 0xa7, 0x6a, 0x26, + 0x2d, 0x7d, 0xaa, 0xba, 0x9f, 0xab, 0xe4, 0x57, 0xb7, 0x92, 0xb9, 0x77, 0xaf, 0x3b, 0xc8, 0x20, + 0x19, 0x5c, 0x4c, 0x4a, 0xbd, 0x0c, 0x2d, 0x3a, 0xc5, 0x33, 0x51, 0xc1, 0x55, 0x5f, 0xdc, 0x8b, + 0xa7, 0x49, 0xb8, 0x0a, 0x9f, 0xc0, 0x92, 0xfe, 0x03, 0xf7, 0x15, 0x16, 0x6d, 0x25, 0x91, 0x48, + 0x61, 0x89, 0x64, 0x02, 0x83, 0x19, 0xc7, 0x12, 0xe9, 0x3b, 0x74, 0xa0, 0x9c, 0x0f, 0xf8, 0x13, + 0x59, 0x7c, 0xc6, 0xc5, 0xb4, 0xa9, 0xc4, 0x0b, 0x5b, 0xf5, 0x8a, 0xad, 0xea, 0x19, 0x37, 0xd9, + 0xaa, 0x67, 0x6e, 0x1e, 0x96, 0xf8, 0x57, 0x7c, 0x64, 0xc0, 0x51, 0xe2, 0x67, 0xbc, 0x85, 0x6b, + 0xf5, 0xb8, 0x91, 0x6a, 0x94, 0xc8, 0x1e, 0x79, 0xb0, 0x45, 0xe9, 0x5f, 0x64, 0xb1, 0x5a, 0x25, + 0x7e, 0xff, 0xdd, 0x3d, 0x1f, 0x78, 0xf1, 0x01, 0x58, 0xa7, 0xf5, 0x95, 0x2c, 0x56, 0x48, 0x30, + 0x4a, 0xeb, 0x6b, 0xae, 0x52, 0x02, 0x53, 0x44, 0xdf, 0x45, 0x58, 0xb6, 0x12, 0xae, 0x7d, 0xfe, + 0x9c, 0xf9, 0x64, 0xff, 0xe5, 0xa2, 0x03, 0xfb, 0x2f, 0x88, 0x8a, 0xe0, 0x18, 0xd4, 0x07, 0xdf, + 0x46, 0x19, 0x80, 0xa5, 0x20, 0x54, 0x7e, 0x52, 0x7c, 0xe2, 0x9f, 0x09, 0xcc, 0x92, 0x76, 0x77, + 0x35, 0xd7, 0xe5, 0x0e, 0x49, 0xee, 0x5e, 0x78, 0x30, 0x24, 0x4b, 0xf1, 0xd5, 0xd4, 0xc3, 0xc6, + 0x06, 0x2b, 0x4f, 0x10, 0x20, 0xad, 0xf0, 0x22, 0x6b, 0x10, 0x3b, 0xba, 0x93, 0x43, 0x85, 0xa5, + 0x81, 0xcc, 0x1e, 0x4f, 0xfe, 0x9b, 0xc5, 0x52, 0xff, 0x4e, 0x26, 0xff, 0x2d, 0x62, 0xa9, 0xe4, + 0xbf, 0xbe, 0xa6, 0x92, 0x5f, 0x2b, 0xff, 0x6e, 0x60, 0xf0, 0xfd, 0xd3, 0x82, 0xaf, 0xc9, 0x6f, + 0xc4, 0x7d, 0xf9, 0xdf, 0x0f, 0xdf, 0xd1, 0xf1, 0xbf, 0x53, 0xb8, 0x06, 0xb6, 0x5c, 0x75, 0xd0, + 0x0f, 0xf4, 0x32, 0x96, 0x0f, 0x21, 0x2d, 0xf3, 0x1d, 0xdc, 0xce, 0x75, 0x41, 0xee, 0x3b, 0xf2, + 0x5a, 0x57, 0x05, 0x85, 0xef, 0xe7, 0xa1, 0x7c, 0x73, 0xbf, 0x91, 0xdf, 0xd3, 0xa0, 0xf0, 0x2a, + 0x04, 0xbb, 0xec, 0xf7, 0xaf, 0x91, 0xa5, 0x7d, 0x92, 0xbe, 0x11, 0xdf, 0x21, 0xe8, 0x9d, 0x8a, + 0xf3, 0xdf, 0xbf, 0x5a, 0xa7, 0x62, 0xf2, 0x7b, 0xc5, 0x3a, 0x17, 0x17, 0xbf, 0x7f, 0xd5, 0x4e, + 0xc5, 0x99, 0xef, 0x15, 0x2d, 0x1d, 0xf1, 0x6f, 0xa2, 0xab, 0xae, 0xd0, 0x43, 0xe9, 0x3b, 0x98, + 0x76, 0x68, 0x6b, 0xe2, 0x1d, 0xf1, 0xfd, 0x45, 0x13, 0xc6, 0xcb, 0xac, 0x21, 0xa5, 0x7c, 0xbb, + 0xfa, 0x25, 0x9d, 0x8b, 0x44, 0xe0, 0x95, 0x50, 0x3f, 0xe0, 0x91, 0x10, 0x5f, 0xf0, 0x46, 0x12, + 0xc8, 0x75, 0x65, 0xac, 0xf2, 0x1b, 0x1e, 0xc8, 0x6d, 0xa3, 0xd5, 0x01, 0xff, 0x5e, 0x78, 0xa8, + 0x71, 0x63, 0x2f, 0x6a, 0x0c, 0x0b, 0x4c, 0x02, 0x1d, 0x5c, 0xf1, 0x08, 0x11, 0x0f, 0x1f, 0x59, + 0x8e, 0x04, 0x00, 0x4c, 0x90, 0x92, 0x30, 0xa3, 0x69, 0xb0, 0xb1, 0xc7, 0x98, 0xef, 0x45, 0x53, + 0x09, 0x62, 0x0f, 0xf6, 0x07, 0x81, 0xab, 0x9a, 0xad, 0xa2, 0xc5, 0x17, 0xcd, 0x32, 0x28, 0xdb, + 0xfd, 0x4a, 0xe6, 0x2b, 0xb1, 0xdf, 0x73, 0x23, 0x33, 0xd2, 0x50, 0x11, 0xd8, 0xd5, 0xcb, 0x18, + 0x92, 0xd2, 0x97, 0x2f, 0x99, 0x4f, 0xd6, 0xef, 0x5e, 0xea, 0x93, 0x06, 0x63, 0x41, 0xa7, 0xa7, + 0x13, 0x1e, 0x4e, 0xa2, 0xa3, 0x2b, 0x81, 0x9c, 0xeb, 0x58, 0x7f, 0xa7, 0x59, 0x9e, 0x8f, 0x7e, + 0xa3, 0x09, 0x70, 0xcf, 0xfe, 0xab, 0x5f, 0x41, 0xa6, 0xb6, 0x07, 0x82, 0x17, 0x72, 0xf1, 0x1c, + 0xe8, 0xce, 0x4d, 0x3e, 0x57, 0xa5, 0xaf, 0x52, 0xc5, 0xff, 0x02, 0x62, 0xb8, 0x15, 0xff, 0x85, + 0x50, 0xb9, 0x36, 0x3d, 0x40, 0x1c, 0xb2, 0xed, 0x26, 0xd1, 0x09, 0xfa, 0x05, 0x9d, 0x3b, 0x3f, + 0x15, 0xe1, 0x1b, 0x09, 0xfe, 0xfc, 0x56, 0x45, 0x40, 0xe6, 0xe2, 0x57, 0x5e, 0x18, 0xfc, 0x79, + 0xee, 0x29, 0x6a, 0x55, 0x45, 0x72, 0x3e, 0x80, 0x8b, 0x40, 0xf6, 0x95, 0x94, 0xa2, 0xc3, 0x4b, + 0xa3, 0x2a, 0x44, 0x7a, 0x64, 0x0f, 0x7f, 0xfd, 0xf5, 0x90, 0x8f, 0x7e, 0xb5, 0x2a, 0x1d, 0x0b, + 0x0e, 0xca, 0xd0, 0x93, 0x1e, 0x38, 0x10, 0x80, 0x48, 0xe0, 0x94, 0x1f, 0xdc, 0x14, 0x8a, 0x32, + 0x4a, 0x54, 0xa8, 0xa0, 0x42, 0x05, 0x0a, 0x95, 0x54, 0x1c, 0x7a, 0x50, 0x21, 0x8f, 0x0a, 0x79, + 0x28, 0xe4, 0x51, 0xe1, 0xf3, 0xd5, 0xb8, 0xcd, 0xeb, 0xe1, 0x20, 0x59, 0xd0, 0x5c, 0x3c, 0xa8, + 0x5e, 0x78, 0x16, 0xc2, 0x7b, 0x08, 0x41, 0x0c, 0xf8, 0x8b, 0x49, 0xe9, 0xc8, 0x24, 0x60, 0xee, + 0x50, 0x7d, 0xd5, 0x4b, 0x5f, 0x0d, 0xea, 0xf0, 0xcb, 0x6c, 0xee, 0x6f, 0xb0, 0x41, 0xcd, 0xf8, + 0xea, 0x0d, 0x50, 0xcb, 0x1e, 0x4c, 0xde, 0x36, 0x00, 0x1a, 0x7b, 0xd1, 0xc1, 0xdb, 0x8a, 0x07, + 0xcd, 0x07, 0xd8, 0xe5, 0xdb, 0xee, 0xd7, 0x5b, 0x00, 0x2f, 0xa6, 0xbc, 0x46, 0x53, 0x57, 0x95, + 0xc0, 0xf3, 0xe3, 0xee, 0x7c, 0x40, 0xf2, 0x60, 0x30, 0x6e, 0x20, 0x00, 0xef, 0x6a, 0xb5, 0x7a, + 0x29, 0xff, 0xed, 0x7c, 0xfc, 0x82, 0xaa, 0xbe, 0x9e, 0x65, 0xab, 0x5c, 0x3a, 0x4c, 0xef, 0xe2, + 0xf8, 0x1c, 0xdd, 0x97, 0x95, 0xd6, 0xe3, 0x13, 0xd9, 0xb0, 0x6d, 0x37, 0xbd, 0x7f, 0x05, 0x08, + 0x11, 0xbe, 0x7e, 0x90, 0xaa, 0x80, 0x20, 0xa3, 0xa3, 0xa0, 0x0a, 0xab, 0x2c, 0x5e, 0xe1, 0xb0, + 0xce, 0x4e, 0x07, 0xe1, 0xe9, 0xe0, 0x39, 0x8d, 0x80, 0x23, 0x22, 0xf3, 0x24, 0x1f, 0x99, 0xee, + 0xe3, 0x1e, 0x00, 0xc0, 0xbe, 0xfa, 0x67, 0x7a, 0xff, 0x60, 0xa0, 0xa4, 0x4a, 0xb2, 0xaa, 0x26, + 0x1c, 0x8b, 0x9c, 0xab, 0xc3, 0xe1, 0x01, 0x0e, 0x41, 0xbd, 0x99, 0x89, 0xc2, 0x83, 0x8a, 0xf7, + 0xc8, 0xac, 0x32, 0x6d, 0x50, 0xb7, 0x75, 0x2a, 0x6f, 0x7b, 0x46, 0x55, 0x8b, 0x8e, 0x8d, 0xa8, + 0xdc, 0x3e, 0x1d, 0x83, 0x67, 0x06, 0xb8, 0x13, 0xd3, 0xa3, 0x63, 0xee, 0xdc, 0x56, 0xda, 0x57, + 0x05, 0x38, 0x8e, 0x16, 0x32, 0x9c, 0xa0, 0xba, 0xf0, 0x72, 0xee, 0x19, 0xe8, 0x5c, 0x3e, 0x9f, + 0x43, 0xa7, 0xe8, 0xdc, 0x40, 0xe7, 0x67, 0x3d, 0x55, 0x9f, 0xae, 0x74, 0x5a, 0xd9, 0xa7, 0x61, + 0x14, 0xaf, 0x26, 0xe6, 0x25, 0x3f, 0x49, 0xc6, 0x03, 0x06, 0xbd, 0xfb, 0x5f, 0x13, 0x28, 0xe3, + 0x42, 0x00, 0x5c, 0x4c, 0x54, 0x78, 0x20, 0x4b, 0x7d, 0x7d, 0xbb, 0x96, 0x91, 0x46, 0x90, 0x1d, + 0x45, 0xc3, 0xaa, 0x24, 0xdc, 0x04, 0x5a, 0x86, 0x71, 0x31, 0xc8, 0x5d, 0xf5, 0x2b, 0x89, 0xf0, + 0xaa, 0x08, 0x51, 0x42, 0x91, 0x11, 0x15, 0xfd, 0xfe, 0x7b, 0xf2, 0x54, 0x08, 0xd0, 0x14, 0x32, + 0x24, 0x2f, 0x8a, 0x4a, 0x2f, 0xe6, 0x80, 0x08, 0xf0, 0xff, 0x05, 0x5c, 0xf0, 0x07, 0x5f, 0xf2, + 0x90, 0xd2, 0x2f, 0x7c, 0xe3, 0x00, 0x06, 0xac, 0xf0, 0xff, 0x05, 0xad, 0xdf, 0xd4, 0xab, 0x91, + 0x3a, 0xce, 0xf5, 0xff, 0x44, 0xa1, 0xa5, 0x76, 0xdf, 0xe4, 0xee, 0xe5, 0xef, 0x17, 0xc2, 0x4b, + 0xd7, 0x91, 0x26, 0x23, 0xd2, 0x14, 0xe0, 0x70, 0x50, 0xca, 0xe9, 0x86, 0xd8, 0xca, 0x5b, 0x00, + 0x1e, 0x7b, 0x0b, 0xd4, 0xe8, 0x9b, 0xff, 0xfd, 0xd1, 0xfb, 0x26, 0x7d, 0x87, 0xdc, 0xe6, 0x74, + 0x5a, 0xf5, 0x9e, 0xd3, 0x82, 0x01, 0x29, 0xef, 0x8d, 0xc4, 0xe1, 0xe4, 0xea, 0x80, 0x10, 0xf8, + 0x43, 0x82, 0x8a, 0x7e, 0x8a, 0xae, 0x72, 0x33, 0x5f, 0x90, 0xaa, 0xd2, 0x5f, 0x7f, 0x01, 0xac, + 0x08, 0x13, 0x69, 0x25, 0x6a, 0x00, 0x7d, 0xa4, 0xd1, 0x5a, 0x86, 0x6f, 0x68, 0x0b, 0xc6, 0xf6, + 0xa6, 0xdd, 0x45, 0xa3, 0x7f, 0xc6, 0x99, 0x22, 0x2a, 0x44, 0xe7, 0xcf, 0xe9, 0x93, 0x41, 0xbe, + 0x9a, 0x60, 0xf3, 0x44, 0x04, 0xac, 0x62, 0x1b, 0x7d, 0x55, 0x7b, 0xb8, 0xd4, 0x3e, 0xa7, 0x6f, + 0x65, 0x5e, 0x9a, 0xe4, 0x25, 0xaf, 0xac, 0x09, 0x50, 0x19, 0xcc, 0xf6, 0x93, 0x72, 0x6d, 0x44, + 0xb1, 0x8e, 0xfc, 0x6a, 0xbc, 0x96, 0x5e, 0xe2, 0x56, 0x8c, 0xde, 0x00, 0x0f, 0xc1, 0x5a, 0x02, + 0x8c, 0xf9, 0xfc, 0xfc, 0xce, 0xf6, 0x20, 0x6d, 0x8d, 0x97, 0xe2, 0x05, 0x00, 0xc5, 0x2c, 0xce, + 0xbe, 0x1d, 0xfd, 0x36, 0xdf, 0x9d, 0x94, 0xf2, 0xdf, 0x64, 0x50, 0x49, 0x94, 0x26, 0x26, 0xfd, + 0x6f, 0x2e, 0xf2, 0xf8, 0xee, 0xf7, 0x38, 0xd6, 0x79, 0x55, 0x25, 0x29, 0xc1, 0x38, 0x1e, 0x4f, + 0x4b, 0xda, 0x4f, 0x83, 0xd7, 0x53, 0xff, 0xfa, 0x0b, 0xd6, 0x2d, 0xfa, 0x13, 0xa6, 0x4e, 0xab, + 0x58, 0x8a, 0x07, 0x0c, 0xb3, 0x22, 0x19, 0x00, 0xb0, 0xcf, 0xd4, 0x20, 0x1d, 0x98, 0xd7, 0xbb, + 0x91, 0x9d, 0xbd, 0x68, 0x2c, 0x67, 0x90, 0x7a, 0x3f, 0x86, 0xcb, 0x64, 0xa0, 0x33, 0xe0, 0x02, + 0x46, 0xf8, 0x11, 0x17, 0xed, 0x17, 0xb8, 0xd8, 0x31, 0x97, 0x8b, 0xa9, 0x7f, 0xc4, 0x8b, 0x4b, + 0x9e, 0x97, 0xc4, 0x47, 0xdc, 0xd0, 0x2a, 0x34, 0x4e, 0x32, 0x9d, 0xad, 0xfd, 0x23, 0x6e, 0xc2, + 0x2f, 0x71, 0x0b, 0x2f, 0x23, 0xfc, 0x31, 0x37, 0xf5, 0xb2, 0xbc, 0x3f, 0x1e, 0xa9, 0x51, 0x7d, + 0xe5, 0xc3, 0x22, 0xce, 0xcf, 0xa9, 0xb4, 0x7f, 0xd9, 0x6e, 0xd9, 0x3f, 0xa7, 0xdf, 0x2e, 0xc5, + 0x57, 0xb9, 0x70, 0x3c, 0xe7, 0xef, 0x8c, 0x50, 0xb4, 0x85, 0x00, 0xdd, 0x90, 0xf5, 0x20, 0xa0, + 0xfb, 0x4c, 0x24, 0xda, 0x90, 0xd0, 0x59, 0x32, 0x11, 0x6d, 0x53, 0x01, 0x2c, 0xba, 0xd4, 0xa3, + 0xdf, 0x91, 0x7b, 0x40, 0x3f, 0x22, 0x69, 0x89, 0x94, 0xaa, 0x19, 0x22, 0x8a, 0x9d, 0xfe, 0xab, + 0x82, 0x37, 0xac, 0xa6, 0xd2, 0xde, 0x1f, 0xd8, 0x22, 0x20, 0xac, 0x04, 0xa4, 0x3f, 0x71, 0x44, + 0x88, 0x6f, 0x01, 0x7c, 0xbc, 0x24, 0x37, 0xaa, 0x24, 0xf9, 0xb1, 0x01, 0x46, 0x87, 0x55, 0x29, + 0xa6, 0x73, 0x03, 0x43, 0xf2, 0xaa, 0x52, 0xfc, 0xfd, 0xd7, 0x5f, 0xd2, 0x83, 0xe0, 0x79, 0x13, + 0x74, 0x1c, 0x57, 0x9b, 0x9c, 0x53, 0x45, 0x1b, 0x31, 0xde, 0x47, 0x5e, 0xdb, 0x43, 0x5a, 0x44, + 0x0d, 0x7e, 0xe0, 0x9d, 0xe2, 0x1e, 0x01, 0xcd, 0x78, 0xe7, 0x6e, 0xbc, 0x97, 0x6e, 0xb4, 0xea, + 0xb9, 0xa3, 0x47, 0x58, 0x73, 0x12, 0x12, 0xe5, 0x04, 0x17, 0xf1, 0xe4, 0xb7, 0xda, 0xfd, 0xfa, + 0x7b, 0x0a, 0x57, 0xd2, 0xef, 0xc3, 0x75, 0xe2, 0x1e, 0xe5, 0x2c, 0xbe, 0xdd, 0xb3, 0x77, 0x92, + 0x4b, 0x41, 0x3e, 0x9a, 0x04, 0x0c, 0x93, 0xd6, 0xde, 0x2e, 0x47, 0x70, 0xa1, 0x1a, 0x78, 0x43, + 0x14, 0x20, 0x2f, 0x65, 0x48, 0xba, 0x47, 0xb4, 0xc2, 0x22, 0x11, 0x21, 0x47, 0x39, 0x43, 0x4e, + 0xae, 0x2a, 0x61, 0x89, 0x0a, 0x24, 0x43, 0xee, 0xa3, 0xef, 0x1e, 0x9e, 0xbc, 0x07, 0x08, 0x2b, + 0xd0, 0x02, 0xc9, 0x99, 0xf4, 0xb1, 0xc4, 0xdd, 0x53, 0x02, 0xe3, 0xb0, 0xc4, 0xe3, 0x73, 0x22, + 0x6d, 0xa7, 0x9e, 0x85, 0x28, 0xc1, 0x00, 0xf7, 0xe0, 0x3d, 0x70, 0xa2, 0x18, 0xd3, 0xa4, 0x39, + 0x54, 0x03, 0x2e, 0x8a, 0x33, 0x8c, 0xc3, 0xd3, 0x07, 0xe3, 0x45, 0xce, 0xd9, 0xfa, 0x66, 0x7f, + 0x8f, 0xa7, 0x08, 0x4c, 0xeb, 0x63, 0xef, 0xe6, 0x5d, 0x7b, 0x37, 0x29, 0xfa, 0x35, 0x47, 0xf1, + 0x03, 0xcb, 0xfe, 0xed, 0x45, 0xd1, 0x0f, 0xa2, 0xe6, 0x45, 0xa4, 0x1f, 0x58, 0xf8, 0x6b, 0xa2, + 0xea, 0x6f, 0xc8, 0xc1, 0x80, 0x78, 0xc8, 0x88, 0x7e, 0xe4, 0x3e, 0x61, 0x86, 0xd2, 0x52, 0xf5, + 0xdb, 0xf7, 0xd7, 0x2e, 0xd0, 0x4f, 0x49, 0x0f, 0x4e, 0xe0, 0xa9, 0x49, 0xf7, 0x65, 0xde, 0xd2, + 0xff, 0x5e, 0xc0, 0x9c, 0x25, 0xd2, 0xff, 0xb6, 0x50, 0x42, 0x79, 0xf7, 0xf4, 0x6f, 0xeb, 0xdf, + 0x3e, 0xcc, 0x16, 0xf8, 0xc3, 0x87, 0x53, 0x3f, 0x2f, 0xb4, 0x8f, 0x31, 0xed, 0x63, 0x44, 0x03, + 0xd4, 0xff, 0xb6, 0x9e, 0x13, 0x2f, 0x29, 0xfe, 0x29, 0xd5, 0x43, 0x8c, 0x62, 0x21, 0x7f, 0x2e, + 0xe0, 0x15, 0xfe, 0x3e, 0x09, 0x78, 0xb6, 0x44, 0xe8, 0xff, 0x11, 0x39, 0xe5, 0x6b, 0x12, 0xab, + 0x4a, 0x3c, 0x5a, 0x9f, 0xbd, 0x93, 0x05, 0x3c, 0x5a, 0x18, 0x16, 0x93, 0x6b, 0x55, 0xef, 0x9b, + 0x15, 0x93, 0x7f, 0xd3, 0x20, 0x98, 0x3e, 0x28, 0x2f, 0x06, 0x14, 0xdd, 0xf3, 0x99, 0x44, 0x9b, + 0x17, 0x67, 0x31, 0xdf, 0xf8, 0x07, 0xef, 0xef, 0xf9, 0x87, 0x57, 0x79, 0xab, 0x92, 0x7c, 0x92, + 0x2b, 0x09, 0xcd, 0xb5, 0xff, 0xfc, 0xd3, 0x44, 0x21, 0xd1, 0x4d, 0x3c, 0x83, 0x3a, 0x1e, 0xfe, + 0x8c, 0x7e, 0xa5, 0x16, 0xd6, 0x46, 0xfa, 0x4d, 0xf5, 0x9f, 0x7f, 0x46, 0xbf, 0x02, 0x9b, 0x48, + 0xcb, 0x9a, 0x61, 0x54, 0x12, 0x68, 0x93, 0x3b, 0x91, 0xd6, 0x2b, 0xf9, 0x74, 0xbf, 0x92, 0x40, + 0xcf, 0x3a, 0x40, 0xf3, 0xf4, 0x0f, 0x9b, 0x6b, 0xe8, 0x22, 0xfc, 0xdb, 0xe6, 0x99, 0xa8, 0xb9, + 0x2c, 0xcb, 0xa8, 0x79, 0xa4, 0x5c, 0xa5, 0xea, 0xfe, 0xd0, 0x0b, 0x98, 0x76, 0xf8, 0x16, 0x43, + 0xc4, 0xed, 0x1e, 0xd8, 0x64, 0x22, 0xfa, 0x31, 0x4d, 0x74, 0xa5, 0x3e, 0x91, 0xfe, 0x06, 0x55, + 0xdf, 0xd1, 0x64, 0xfe, 0xba, 0xba, 0x5e, 0x6f, 0x2d, 0xbe, 0xa0, 0x75, 0xb4, 0x65, 0x0a, 0x16, + 0x7b, 0xda, 0x21, 0x85, 0x84, 0xec, 0xd5, 0x46, 0x5a, 0xcc, 0xe8, 0x92, 0x8a, 0xc1, 0x3c, 0x7b, + 0x9f, 0xa5, 0xf3, 0x3c, 0x7b, 0x30, 0xcf, 0x3e, 0x5a, 0xb7, 0x34, 0xfa, 0x21, 0xcf, 0x9e, 0xe6, + 0x01, 0x32, 0x91, 0xdc, 0x24, 0x4a, 0xd2, 0xa0, 0xd5, 0xab, 0x4d, 0xa9, 0x5f, 0xe0, 0xe3, 0x4a, + 0x68, 0xf4, 0x3f, 0x61, 0x15, 0x6d, 0x35, 0x5d, 0xfc, 0x36, 0xb8, 0x6d, 0xf1, 0xc0, 0xfa, 0xa0, + 0x92, 0x6a, 0xd5, 0xfc, 0xea, 0x27, 0x53, 0x15, 0xeb, 0xe2, 0xd4, 0xd3, 0xdf, 0xfe, 0xfc, 0x7e, + 0xd1, 0xc8, 0x9d, 0x04, 0x90, 0xe2, 0x83, 0x76, 0x08, 0x31, 0x26, 0xc1, 0xe9, 0xbd, 0x6e, 0x29, + 0xa5, 0x50, 0x36, 0x87, 0x84, 0xe5, 0xaa, 0x6e, 0xb2, 0x88, 0x36, 0x4b, 0xbd, 0x24, 0x97, 0x4a, + 0x0b, 0x70, 0x96, 0x4f, 0xa5, 0x03, 0x38, 0x13, 0x52, 0x69, 0x03, 0xce, 0x0a, 0xa9, 0xb4, 0x0c, + 0x67, 0x46, 0x2a, 0x1d, 0xc2, 0x19, 0xa4, 0x5f, 0x0e, 0x9c, 0x85, 0xa9, 0xb4, 0x08, 0x67, 0x90, + 0x58, 0x2a, 0x70, 0x26, 0xa6, 0xd2, 0x7f, 0x56, 0x13, 0x51, 0xaf, 0x1e, 0xea, 0x55, 0x50, 0xd1, + 0x25, 0x9f, 0x44, 0xda, 0xac, 0x26, 0x10, 0x70, 0x34, 0x24, 0x34, 0xa7, 0x87, 0xdb, 0xb6, 0x0c, + 0xd3, 0xff, 0x18, 0x01, 0xc8, 0xa7, 0xe7, 0xd8, 0x86, 0xa8, 0xea, 0xf9, 0x68, 0x7a, 0x49, 0x70, + 0x6a, 0x97, 0x23, 0x58, 0xdd, 0xd5, 0x28, 0xfc, 0xa0, 0x28, 0x14, 0xf9, 0x46, 0xef, 0xbc, 0xb9, + 0x91, 0xb6, 0x93, 0xd7, 0x0e, 0xef, 0x61, 0x13, 0xef, 0x51, 0x43, 0xc2, 0x73, 0xf8, 0xc8, 0x22, + 0x0f, 0xe9, 0x4d, 0xe5, 0x43, 0xa9, 0xfc, 0xea, 0x7b, 0x60, 0xff, 0xf5, 0xa2, 0xe3, 0x6d, 0x20, + 0xb9, 0x07, 0x36, 0xfa, 0x75, 0x7a, 0x1b, 0x45, 0xff, 0x8a, 0x7f, 0x5a, 0xb1, 0xd2, 0x43, 0xf4, + 0xc0, 0xdb, 0x5f, 0x7f, 0x5d, 0xb6, 0x2e, 0xfc, 0xb8, 0x04, 0x30, 0x5f, 0x36, 0x83, 0xf6, 0xbd, + 0xa4, 0x87, 0xf8, 0xde, 0xea, 0x57, 0x24, 0x71, 0xd1, 0x89, 0xc6, 0x06, 0x9a, 0xd3, 0x3d, 0xcb, + 0x58, 0xe6, 0xaf, 0xbf, 0x0a, 0x28, 0xe8, 0x3c, 0xc4, 0xbf, 0x88, 0xbc, 0x88, 0x99, 0x13, 0x30, + 0x53, 0xd2, 0x43, 0xbc, 0x3c, 0x27, 0xd1, 0x6f, 0x24, 0xff, 0xf5, 0x57, 0x09, 0xe6, 0x0b, 0x94, + 0x12, 0xdd, 0x85, 0xde, 0x8f, 0x6e, 0x7d, 0xf8, 0xeb, 0xaf, 0x4c, 0x0e, 0xa6, 0xed, 0x5c, 0xd8, + 0x3e, 0x75, 0x9b, 0xf9, 0x24, 0x60, 0x99, 0x4f, 0x36, 0xfc, 0xe3, 0x60, 0x1a, 0x2f, 0x5b, 0xc2, + 0xda, 0x7d, 0x78, 0x6f, 0x00, 0xb0, 0x84, 0xc9, 0x14, 0xf1, 0xcc, 0x3d, 0x07, 0xf3, 0x97, 0xf4, + 0xee, 0xc5, 0x14, 0x9e, 0x81, 0xc9, 0x7b, 0x72, 0x2b, 0xc2, 0x73, 0x9a, 0xaf, 0x3e, 0xed, 0x2a, + 0x5c, 0x3a, 0x7e, 0x64, 0xe8, 0x2c, 0x52, 0x74, 0x87, 0x01, 0x64, 0x00, 0xb1, 0x2b, 0x88, 0xe1, + 0x83, 0x04, 0x99, 0xd1, 0x09, 0x63, 0x84, 0x4a, 0x15, 0xe5, 0x12, 0xf2, 0xf9, 0x2a, 0x05, 0x28, + 0x1a, 0x02, 0x1c, 0xba, 0x88, 0x12, 0x5f, 0x73, 0x3b, 0xf9, 0x8e, 0x40, 0xab, 0x7e, 0x43, 0x74, + 0xea, 0x0b, 0xdd, 0xa9, 0x79, 0xfa, 0x49, 0x58, 0x56, 0x4c, 0x0c, 0x64, 0x4a, 0x0b, 0xab, 0x0a, + 0xfa, 0x72, 0x2b, 0x7f, 0xa6, 0x61, 0x88, 0xfb, 0xca, 0x9f, 0xf7, 0x49, 0x01, 0xb3, 0x53, 0xe9, + 0x58, 0x11, 0x30, 0x9f, 0xa7, 0x5f, 0xaa, 0xe6, 0xe3, 0x4c, 0x02, 0x3d, 0xb3, 0x57, 0x39, 0x67, + 0x85, 0x30, 0x31, 0x10, 0xd3, 0x8c, 0xde, 0xb9, 0x02, 0x59, 0xd0, 0xeb, 0x92, 0x34, 0x67, 0xf9, + 0x1a, 0xe4, 0x43, 0x82, 0xbe, 0xd3, 0x3c, 0x09, 0xc6, 0xf7, 0xea, 0xfc, 0x39, 0xde, 0x45, 0x09, + 0x6e, 0xc8, 0x17, 0xab, 0x77, 0x8a, 0x7e, 0xed, 0x1b, 0xb2, 0xc6, 0xf4, 0x1e, 0xa4, 0xe5, 0xd2, + 0x87, 0x8a, 0x88, 0x19, 0xe9, 0x5d, 0x45, 0xbc, 0x47, 0x7a, 0x86, 0x04, 0x3d, 0xfa, 0x76, 0x2b, + 0x61, 0xac, 0xdb, 0xb7, 0x12, 0x3f, 0xa7, 0xbe, 0x5f, 0x81, 0xb2, 0x18, 0x7e, 0xa1, 0xfe, 0x94, + 0x73, 0x7f, 0xa7, 0x05, 0x80, 0x94, 0x1d, 0x55, 0x38, 0x37, 0x2a, 0x1e, 0x4e, 0x29, 0x48, 0xfb, + 0x81, 0xd7, 0x2c, 0x31, 0xce, 0xde, 0xae, 0xab, 0xd1, 0x16, 0x80, 0x14, 0x1f, 0xa3, 0xe1, 0x9f, + 0x18, 0x44, 0xb1, 0xea, 0x3c, 0x81, 0x27, 0x7a, 0x58, 0x10, 0x09, 0xf8, 0x06, 0xe3, 0x3e, 0x54, + 0xa2, 0x45, 0x4d, 0x9d, 0x16, 0xf5, 0x2b, 0x94, 0x85, 0x86, 0xff, 0x10, 0x38, 0x22, 0xd4, 0xcf, + 0x5c, 0x03, 0xb9, 0x5e, 0xa4, 0xa5, 0x8b, 0x66, 0xc0, 0x0c, 0xd2, 0xdf, 0x12, 0x26, 0xba, 0x39, + 0x50, 0xb4, 0x77, 0x56, 0x22, 0x9d, 0xf0, 0xed, 0x40, 0x50, 0x81, 0x9f, 0xeb, 0x27, 0xe2, 0xe1, + 0x02, 0xc2, 0x6e, 0xbf, 0x59, 0x83, 0x97, 0xc8, 0x8c, 0x76, 0x05, 0xcf, 0x79, 0x44, 0xfa, 0x84, + 0x12, 0x61, 0xe9, 0xa7, 0xe3, 0x78, 0x7c, 0xb2, 0x9a, 0xeb, 0xa8, 0x7c, 0x2a, 0x82, 0xa0, 0x7c, + 0x12, 0x2a, 0x62, 0x78, 0x89, 0xe3, 0x1a, 0x0a, 0xf5, 0x5e, 0xea, 0x84, 0xe8, 0x3c, 0x88, 0xd9, + 0x97, 0x2a, 0x0e, 0x55, 0xd9, 0xa9, 0x37, 0x13, 0xf0, 0x70, 0x82, 0xad, 0x49, 0x0d, 0x40, 0x1b, + 0xf8, 0xe9, 0xd8, 0x19, 0xa1, 0xdc, 0xed, 0xe4, 0x95, 0x88, 0x58, 0x59, 0x92, 0xa9, 0x01, 0x44, + 0x8f, 0x57, 0xc5, 0xd9, 0xf9, 0xa1, 0x9e, 0x5f, 0xbc, 0x17, 0x0c, 0xd3, 0xb6, 0x3e, 0xf4, 0x35, + 0x0f, 0xd4, 0x63, 0xd2, 0x05, 0xc8, 0x07, 0x9c, 0xd1, 0x17, 0xe0, 0xa7, 0x54, 0x2a, 0x06, 0x4c, + 0xe8, 0x22, 0x9b, 0x2d, 0xcb, 0x3f, 0x68, 0x89, 0xb2, 0x7a, 0xf7, 0xf7, 0xdf, 0x61, 0x2a, 0x1c, + 0x74, 0x5d, 0x19, 0x20, 0x56, 0xf4, 0x53, 0xd5, 0x43, 0x80, 0xc9, 0xa9, 0x34, 0xea, 0x17, 0x09, + 0xf7, 0x0a, 0xdf, 0x9d, 0xc7, 0x7c, 0xb2, 0x15, 0x2a, 0xed, 0x56, 0x21, 0x12, 0xa1, 0xde, 0xa1, + 0x5f, 0xb4, 0x83, 0x05, 0xa8, 0x15, 0x0a, 0x12, 0x9f, 0x12, 0x71, 0x11, 0xba, 0x4e, 0xe5, 0x2a, + 0x91, 0xdb, 0x3b, 0x63, 0x20, 0x98, 0x82, 0x78, 0xc7, 0xdd, 0xfb, 0x42, 0x7e, 0xf5, 0xee, 0xc9, + 0x0a, 0x81, 0xb6, 0xb5, 0xc9, 0x47, 0xed, 0xb3, 0xf7, 0xa8, 0xc1, 0x44, 0x58, 0xdf, 0xb4, 0x7b, + 0xf2, 0xfb, 0x4b, 0xb3, 0x6b, 0x55, 0xdb, 0x30, 0x7b, 0xf6, 0x67, 0xf7, 0x3c, 0x6f, 0x36, 0x90, + 0xbb, 0x08, 0xe9, 0x42, 0xea, 0x62, 0x1c, 0x92, 0x56, 0x60, 0x18, 0x69, 0x0b, 0xc4, 0x06, 0x35, + 0x8a, 0x46, 0x1c, 0x2f, 0x5f, 0x49, 0x7f, 0xce, 0x55, 0x22, 0x4b, 0x92, 0xbc, 0xaf, 0x90, 0xde, + 0x44, 0x1a, 0x17, 0xa7, 0x71, 0x01, 0xda, 0x2f, 0xf7, 0xd3, 0x27, 0xed, 0xc4, 0x36, 0x88, 0x70, + 0x59, 0x1d, 0xed, 0xa9, 0x81, 0x1d, 0x51, 0x06, 0xba, 0xf7, 0x73, 0x02, 0x6e, 0x3b, 0x89, 0x06, + 0x06, 0x8b, 0x21, 0x2a, 0x58, 0xde, 0x23, 0x81, 0x64, 0x3f, 0x72, 0xbd, 0x71, 0xd1, 0x0a, 0x8a, + 0x7c, 0xdb, 0x39, 0x5f, 0x1c, 0x83, 0x1e, 0x61, 0x7d, 0xc7, 0x57, 0xc8, 0xae, 0x4c, 0xba, 0x12, + 0x9d, 0x5f, 0x99, 0x75, 0xe5, 0x62, 0x52, 0x30, 0x4e, 0xee, 0xad, 0x95, 0x72, 0x67, 0xec, 0xa8, + 0x56, 0xcf, 0xc6, 0xca, 0x7d, 0x7f, 0x54, 0x1f, 0xa2, 0x27, 0x99, 0xda, 0x60, 0x45, 0x1e, 0x24, + 0x07, 0xe7, 0x4d, 0x9e, 0x69, 0x15, 0x14, 0x7d, 0x15, 0xb7, 0xe3, 0x6e, 0x11, 0x8c, 0x38, 0xaf, + 0xa4, 0xd3, 0x71, 0x54, 0x1e, 0x38, 0xe7, 0x52, 0xc8, 0x00, 0xcf, 0xab, 0xeb, 0xda, 0x3e, 0xa3, + 0x07, 0x2b, 0x2a, 0xb1, 0x94, 0xaf, 0xbc, 0x42, 0xb4, 0xb9, 0x15, 0x75, 0xf8, 0x10, 0xd1, 0x44, + 0x42, 0xa4, 0x9e, 0x5f, 0x2e, 0xe3, 0x5d, 0x75, 0x7c, 0x35, 0xde, 0xf8, 0xfc, 0x67, 0x7c, 0x1e, + 0xdf, 0xb2, 0x01, 0x39, 0xaf, 0x98, 0x20, 0x59, 0x2b, 0x6f, 0xc2, 0xfd, 0xb5, 0xb8, 0xa8, 0xfe, + 0x35, 0x7a, 0xf9, 0x0f, 0x68, 0x21, 0x5e, 0xb8, 0x53, 0x84, 0x06, 0x1d, 0x37, 0xfa, 0x59, 0xf6, + 0xd3, 0x4d, 0x7d, 0xc9, 0xd7, 0x20, 0xf3, 0xf0, 0x9f, 0x06, 0x32, 0x4f, 0x37, 0x2d, 0x24, 0xb3, + 0x68, 0x5d, 0x78, 0xc9, 0xe8, 0xda, 0x6b, 0x84, 0x9e, 0x38, 0x38, 0xb3, 0x11, 0xdc, 0x8a, 0xd0, + 0x93, 0x00, 0x67, 0x6a, 0xea, 0xf1, 0x45, 0x82, 0xa7, 0x28, 0x98, 0x56, 0xb8, 0x8b, 0x6f, 0x8f, + 0xce, 0x47, 0xd1, 0xfd, 0xcc, 0x15, 0xed, 0x52, 0xca, 0x5e, 0x5c, 0x54, 0x45, 0xb8, 0x14, 0x86, + 0x92, 0xeb, 0xa1, 0x9f, 0xa2, 0x4f, 0x44, 0xf7, 0xa5, 0x24, 0x9e, 0xff, 0xd3, 0x07, 0x93, 0xf9, + 0x70, 0x30, 0xb7, 0xdc, 0x13, 0x4a, 0x24, 0x22, 0x38, 0x84, 0x2e, 0x03, 0x3e, 0xa8, 0xd1, 0xca, + 0xda, 0x47, 0x48, 0xe6, 0x80, 0xae, 0xf1, 0x9d, 0xc0, 0xc3, 0xc3, 0xee, 0x11, 0x08, 0xd1, 0x02, + 0xae, 0x3e, 0x01, 0x08, 0xa9, 0xd8, 0x98, 0x0b, 0xb1, 0x71, 0x0f, 0xdf, 0xde, 0xbd, 0x0b, 0xd1, + 0xd3, 0x83, 0xa8, 0x19, 0xdd, 0xac, 0xf0, 0x12, 0x63, 0xab, 0xd7, 0x27, 0x10, 0xb6, 0x20, 0xe2, + 0x46, 0xf3, 0x1b, 0xe1, 0xbb, 0x44, 0x5c, 0x75, 0x2a, 0x1a, 0x55, 0xa5, 0x08, 0x96, 0x01, 0xac, + 0xc5, 0x54, 0x00, 0x0e, 0xc1, 0xeb, 0xe4, 0xe9, 0x44, 0xfb, 0x8c, 0x90, 0x6e, 0xf0, 0x30, 0x49, + 0x02, 0x86, 0x05, 0xcd, 0xa4, 0xdf, 0xd4, 0xff, 0xf9, 0x67, 0xf4, 0xb0, 0x51, 0x22, 0xed, 0xee, + 0x2b, 0x42, 0x1a, 0xe2, 0xa1, 0x00, 0x11, 0xde, 0xbe, 0x47, 0xfc, 0x0e, 0x15, 0x2e, 0xfa, 0x8e, + 0xdf, 0x71, 0xe0, 0x61, 0x6a, 0xfa, 0xf4, 0xd8, 0x9c, 0x05, 0x87, 0x7a, 0x45, 0x85, 0x0c, 0xe9, + 0x32, 0xd0, 0x68, 0x8d, 0x40, 0x9e, 0x66, 0xa0, 0xa8, 0x72, 0xbe, 0x09, 0x3d, 0x99, 0x40, 0x39, + 0x15, 0x48, 0xfb, 0x30, 0x4c, 0x26, 0x0c, 0x48, 0xec, 0x39, 0x10, 0xfd, 0x89, 0xa8, 0x3c, 0xc5, + 0xc1, 0xe4, 0x94, 0x9d, 0xa1, 0xeb, 0x1e, 0x2f, 0x45, 0x11, 0xcc, 0x7a, 0x3e, 0xef, 0xe1, 0x30, + 0x55, 0xe3, 0x61, 0x78, 0xde, 0x87, 0x41, 0x98, 0x22, 0x02, 0x07, 0x17, 0x53, 0x49, 0x06, 0xe9, + 0x33, 0x4e, 0x04, 0x24, 0xac, 0x7e, 0x84, 0x84, 0xd5, 0x74, 0x1c, 0x30, 0x3f, 0x0e, 0x34, 0xa3, + 0xe8, 0xca, 0x4c, 0x34, 0x53, 0xd1, 0x3d, 0x06, 0xb0, 0xd8, 0xc1, 0x1a, 0x2e, 0x86, 0x7a, 0xbe, + 0x38, 0x90, 0x7c, 0x52, 0x2b, 0x56, 0xb4, 0x71, 0x6a, 0x45, 0x1b, 0xa7, 0x20, 0x39, 0x8c, 0x59, + 0x93, 0x93, 0x30, 0x4d, 0x55, 0x60, 0xf0, 0x32, 0x73, 0xe0, 0xe5, 0x00, 0x8b, 0xa8, 0x11, 0x90, + 0x3f, 0x6f, 0x6e, 0x32, 0x10, 0x7c, 0x6d, 0xc7, 0xfb, 0x46, 0x7e, 0x7f, 0x58, 0x24, 0x9f, 0x7a, + 0x15, 0x74, 0xb1, 0x3a, 0x99, 0xc0, 0xb4, 0xe8, 0xe2, 0x34, 0xfa, 0x8e, 0xae, 0x4d, 0xa3, 0x03, + 0x74, 0x69, 0x3a, 0x85, 0x66, 0x4e, 0x7a, 0x08, 0x53, 0xa9, 0xcb, 0x26, 0x4d, 0x7c, 0x9f, 0xc8, + 0x95, 0x36, 0x1e, 0x90, 0x73, 0x48, 0x7a, 0x08, 0xe0, 0x62, 0xf6, 0x27, 0x0f, 0xac, 0xd1, 0x7d, + 0x38, 0x60, 0xe0, 0xab, 0xf0, 0x0c, 0x5a, 0xfb, 0xb1, 0x93, 0xf9, 0xc5, 0x41, 0x5f, 0x6e, 0xa7, + 0xb8, 0x40, 0x66, 0x80, 0xb2, 0xa8, 0x20, 0x95, 0x8e, 0x3a, 0x48, 0xdd, 0x47, 0x5f, 0xe7, 0x1d, + 0xe4, 0xb0, 0xf2, 0x72, 0x35, 0x07, 0xdd, 0x55, 0x80, 0x43, 0xef, 0x9f, 0xac, 0x68, 0x8f, 0xe2, + 0xe4, 0xed, 0x7f, 0xd0, 0xf1, 0xe5, 0xae, 0xa6, 0x2f, 0xee, 0xc3, 0x1e, 0xb4, 0x03, 0x01, 0x73, + 0x0f, 0x62, 0xef, 0x7e, 0xff, 0x5d, 0x82, 0x92, 0x03, 0x7c, 0x7d, 0x3e, 0x0d, 0xe4, 0x95, 0x07, + 0x53, 0x7f, 0x69, 0x57, 0x81, 0x80, 0xc1, 0x20, 0x23, 0x8f, 0x9e, 0x03, 0x4d, 0xa0, 0x34, 0x1e, + 0xea, 0x6d, 0x3d, 0xca, 0xea, 0x4f, 0x87, 0xf7, 0x91, 0x49, 0x9f, 0x53, 0xfe, 0xd8, 0x48, 0x5b, + 0x95, 0x84, 0xed, 0x70, 0x82, 0xe6, 0x1f, 0x12, 0xe9, 0x25, 0x1c, 0xcb, 0x32, 0x58, 0x72, 0x22, + 0xdd, 0x43, 0x6d, 0x6c, 0x27, 0x7e, 0x91, 0x40, 0x22, 0xbd, 0x3a, 0x9d, 0x9e, 0x49, 0x41, 0xc9, + 0xd5, 0xa7, 0x4b, 0x72, 0x0f, 0x95, 0x92, 0x3f, 0x7d, 0x49, 0xf5, 0x3d, 0xf4, 0xbe, 0xe5, 0xa8, + 0x90, 0x45, 0x47, 0xb0, 0xc8, 0x6c, 0xff, 0x4c, 0x36, 0x89, 0x0e, 0x81, 0x81, 0x5d, 0xdd, 0x01, + 0xa8, 0xb1, 0x77, 0x0f, 0x16, 0x17, 0x6a, 0x0a, 0xba, 0x70, 0xf7, 0x00, 0x83, 0x72, 0x6b, 0xe8, + 0x76, 0xc6, 0xd7, 0xdb, 0x7b, 0xe0, 0x5f, 0x70, 0xd3, 0xd3, 0xa4, 0xbf, 0x7c, 0x74, 0x5f, 0xbf, + 0xe5, 0xff, 0x25, 0x89, 0x8a, 0x74, 0xba, 0x7a, 0x12, 0x79, 0x2a, 0xfc, 0x7f, 0x25, 0x93, 0x5f, + 0x7f, 0x13, 0x54, 0xd7, 0x36, 0xa5, 0xbf, 0xb8, 0xf8, 0x31, 0xa5, 0xd4, 0x43, 0xea, 0x93, 0xc7, + 0xc9, 0x9c, 0xab, 0xe1, 0xda, 0x85, 0x54, 0xa8, 0xbe, 0x56, 0x64, 0xfa, 0x04, 0x1c, 0xad, 0x0f, + 0xb6, 0x68, 0x07, 0x2c, 0x00, 0x66, 0xdf, 0x77, 0x2a, 0x38, 0xbe, 0xdb, 0xed, 0x1e, 0x76, 0xd9, + 0x07, 0xdb, 0x55, 0xf0, 0x0c, 0x81, 0xe6, 0x3d, 0x54, 0xd0, 0x4d, 0x57, 0x97, 0xcc, 0xc8, 0x8a, + 0x97, 0xeb, 0x22, 0x09, 0xf1, 0x19, 0x96, 0x80, 0x64, 0xc0, 0x1a, 0x48, 0xbd, 0xda, 0xba, 0xb5, + 0x4e, 0x8b, 0x7b, 0x76, 0xce, 0xa2, 0x1a, 0x97, 0xac, 0x78, 0x5e, 0xfd, 0xed, 0x37, 0xeb, 0x21, + 0xd2, 0x27, 0x20, 0x0d, 0x48, 0xef, 0xaf, 0x4e, 0x1e, 0xd0, 0xbb, 0x88, 0x01, 0xcd, 0x3f, 0x3f, + 0x0a, 0x1f, 0x2d, 0x74, 0x21, 0x3d, 0xb9, 0x7d, 0x15, 0x07, 0x79, 0x8d, 0xd3, 0x36, 0xfa, 0x2c, + 0x7d, 0xb9, 0x2c, 0xf3, 0x9c, 0x56, 0x6e, 0x5e, 0x06, 0x45, 0x64, 0xe0, 0x2f, 0x61, 0x5c, 0xe8, + 0xba, 0x4c, 0xb3, 0xf2, 0x56, 0x57, 0xe8, 0x96, 0xae, 0xcb, 0xaa, 0xbc, 0xf7, 0x3e, 0x57, 0xc9, + 0x12, 0xf1, 0x95, 0xa8, 0x90, 0x8f, 0xde, 0xa7, 0x78, 0x19, 0x8d, 0x18, 0x1c, 0x8a, 0xd2, 0xd6, + 0xab, 0xd3, 0xc7, 0x18, 0x37, 0xf9, 0x98, 0xfb, 0x29, 0x2a, 0x15, 0xec, 0x28, 0xda, 0x40, 0xb4, + 0x38, 0x97, 0x78, 0xb0, 0xe8, 0x2c, 0x34, 0x39, 0xaf, 0x68, 0x3c, 0xb4, 0x63, 0xf1, 0x8a, 0xc6, + 0xbb, 0x6c, 0x0f, 0x6a, 0x55, 0x2d, 0xda, 0x5c, 0x00, 0x8f, 0x58, 0xfd, 0x96, 0xe8, 0x27, 0xa2, + 0xdb, 0xcc, 0x12, 0x35, 0x98, 0x10, 0xf8, 0x0f, 0x52, 0x6d, 0xf8, 0x27, 0xa4, 0x83, 0xef, 0xa7, + 0x4d, 0xc4, 0xbb, 0x33, 0x32, 0x82, 0xc1, 0x39, 0x1c, 0x5a, 0x00, 0x1a, 0x8c, 0xef, 0xcf, 0x77, + 0xe3, 0x7b, 0xb9, 0xb2, 0x52, 0xf5, 0x22, 0xf6, 0x80, 0x81, 0xf6, 0x55, 0xe4, 0x0e, 0x84, 0x43, + 0x55, 0x82, 0x2f, 0xf7, 0x74, 0x95, 0x0d, 0x31, 0x12, 0x34, 0x57, 0x40, 0xa6, 0x8d, 0x92, 0x1d, + 0xf6, 0x8d, 0xf6, 0xc1, 0x33, 0x72, 0xa9, 0x93, 0x39, 0x3c, 0x5d, 0x26, 0xb2, 0xe2, 0x47, 0x37, + 0xe5, 0x9c, 0xb7, 0x36, 0xd3, 0x77, 0xa7, 0x9b, 0x6e, 0xae, 0xb6, 0xa4, 0x23, 0x25, 0xc7, 0xce, + 0xa2, 0xf1, 0x68, 0x01, 0x7c, 0xff, 0x0a, 0x9e, 0x1f, 0xbe, 0x2a, 0xc9, 0x93, 0x0b, 0x99, 0x21, + 0xe4, 0x1b, 0x9b, 0x28, 0x3b, 0x6f, 0x4d, 0xcf, 0xac, 0x61, 0x8d, 0x20, 0xb2, 0xb3, 0x78, 0xf3, + 0x93, 0xdd, 0x31, 0xbe, 0x64, 0x26, 0xdd, 0x14, 0xc2, 0xc4, 0xe8, 0x4a, 0xe9, 0x9d, 0xf6, 0x15, + 0xed, 0x41, 0x23, 0x24, 0x8d, 0x6e, 0xab, 0x8c, 0xb1, 0xb9, 0x8b, 0x0c, 0xe2, 0x39, 0xbd, 0xb8, + 0x9d, 0x4d, 0x5c, 0xed, 0xa3, 0x42, 0xf0, 0x47, 0x67, 0xd6, 0x57, 0xeb, 0x9b, 0xf4, 0xbd, 0x22, + 0x9d, 0x0d, 0x1f, 0x05, 0xbe, 0x9a, 0x0f, 0x2b, 0x93, 0x0f, 0x20, 0x35, 0x03, 0x01, 0xbe, 0xc5, + 0xbb, 0x7c, 0x57, 0xf1, 0xf0, 0xa6, 0x47, 0x44, 0xf7, 0x67, 0x22, 0x91, 0x25, 0x04, 0xe4, 0x21, + 0xcf, 0x4c, 0x22, 0xaf, 0xbf, 0x45, 0x25, 0xb1, 0x9d, 0x22, 0xee, 0xc3, 0xf3, 0xb5, 0x8a, 0x05, + 0x8c, 0xe2, 0xf9, 0x39, 0xb2, 0xa4, 0xa0, 0xfa, 0xd6, 0x17, 0xc6, 0x0b, 0xf8, 0xdb, 0x77, 0x74, + 0x41, 0xe1, 0x61, 0x00, 0x73, 0x23, 0x61, 0x89, 0x73, 0xd7, 0x10, 0x77, 0x35, 0x31, 0x0a, 0xfc, + 0x97, 0x12, 0xcc, 0xc3, 0xb0, 0xe7, 0x97, 0xfc, 0xd1, 0x46, 0x83, 0x3a, 0x71, 0xe1, 0xaa, 0x28, + 0x69, 0x79, 0xb4, 0xe2, 0x34, 0x4d, 0x43, 0xd3, 0x8c, 0xbc, 0x1e, 0x30, 0x59, 0x02, 0x76, 0x49, + 0xfc, 0x0b, 0xb9, 0x45, 0x2e, 0x8e, 0xf9, 0xe0, 0x11, 0x2f, 0x57, 0xa6, 0xb9, 0x87, 0xd6, 0x57, + 0x12, 0x2a, 0x5a, 0x10, 0xbf, 0x9f, 0xcf, 0xfe, 0x40, 0x43, 0x79, 0xf2, 0x29, 0xf5, 0x84, 0xe8, + 0x77, 0xf6, 0x0f, 0xdb, 0xe8, 0xa2, 0x4a, 0x70, 0x75, 0x23, 0x66, 0x3c, 0xfc, 0x1b, 0x77, 0xa5, + 0x26, 0x02, 0x17, 0xc5, 0xc9, 0xa4, 0xfa, 0xd5, 0xff, 0xeb, 0xaf, 0x93, 0xaf, 0x34, 0x6c, 0x21, + 0x7a, 0x6c, 0xfd, 0x01, 0xdd, 0x22, 0x1d, 0xdf, 0xb6, 0xf5, 0xcf, 0x04, 0x76, 0x9e, 0x0a, 0x4d, + 0x8c, 0x0c, 0x2a, 0xd2, 0x93, 0x71, 0xc3, 0xd5, 0x09, 0xa7, 0xdb, 0x3c, 0xcf, 0x0a, 0x06, 0x6f, + 0x90, 0x88, 0xfc, 0xd8, 0x53, 0x8c, 0x75, 0xa4, 0x33, 0xd2, 0x01, 0x6a, 0x04, 0x46, 0x2b, 0x89, + 0xf3, 0x2d, 0xd4, 0x20, 0x06, 0x2c, 0x89, 0x04, 0x8f, 0xf6, 0x4d, 0x12, 0xa9, 0xf3, 0xd6, 0xf0, + 0xa0, 0x7a, 0x5e, 0x0d, 0x00, 0x18, 0xbc, 0xf3, 0x2a, 0xab, 0xc3, 0x5c, 0x3c, 0x3f, 0x5e, 0xdd, + 0x15, 0x51, 0x3d, 0x5d, 0xe5, 0x88, 0xed, 0x36, 0x79, 0xe5, 0xc6, 0x00, 0xa3, 0x5d, 0x69, 0xe2, + 0xfa, 0x3e, 0x0b, 0xe3, 0x55, 0xcd, 0xf0, 0x26, 0x18, 0x8d, 0x76, 0x6e, 0x5e, 0xae, 0x36, 0x3f, + 0x5e, 0xfb, 0xb1, 0xfa, 0xe9, 0xda, 0x44, 0x74, 0x57, 0xec, 0x35, 0xab, 0x97, 0x8d, 0x8d, 0x57, + 0x2a, 0x87, 0x25, 0xab, 0xa6, 0xde, 0x24, 0xd1, 0x75, 0xc8, 0x38, 0x89, 0x47, 0xf7, 0x65, 0xd3, + 0xd7, 0x85, 0x44, 0xef, 0xd5, 0x2d, 0x3e, 0xe8, 0x2a, 0xc1, 0xc3, 0xf6, 0x6c, 0x82, 0x60, 0xd2, + 0x56, 0x7c, 0xc7, 0x0f, 0x94, 0x9e, 0xac, 0xda, 0x07, 0xb3, 0x8e, 0x88, 0xd0, 0x8a, 0x5b, 0x24, + 0xad, 0xd7, 0xb9, 0x89, 0xf1, 0x4b, 0x91, 0x3d, 0x02, 0xe9, 0xd6, 0x0d, 0x0b, 0xb9, 0x8d, 0xec, + 0x91, 0xe7, 0xd4, 0xce, 0x1e, 0xf8, 0x7c, 0x7b, 0xa8, 0xb7, 0x75, 0x7d, 0x88, 0xa3, 0xe7, 0x3b, + 0x26, 0xc1, 0xfd, 0x5e, 0xdd, 0x95, 0x22, 0xbc, 0x51, 0xef, 0x19, 0x66, 0x5f, 0x43, 0xf0, 0x68, + 0x57, 0x2d, 0x96, 0x08, 0xa5, 0x01, 0xc2, 0x2a, 0x4e, 0xb4, 0x97, 0xd1, 0xde, 0xa7, 0x1b, 0x25, + 0x02, 0x31, 0x26, 0x86, 0x5e, 0x5e, 0xe1, 0xf1, 0xb8, 0x21, 0xac, 0x38, 0xee, 0xe1, 0x4f, 0x48, + 0x1e, 0xdd, 0xb4, 0x86, 0xd9, 0x0f, 0x3b, 0xc0, 0xd7, 0xaf, 0x29, 0xfe, 0xfc, 0x33, 0x6e, 0x7e, + 0x46, 0x27, 0x11, 0x22, 0x06, 0x14, 0x63, 0x9f, 0xd6, 0x9b, 0x0e, 0x47, 0xbb, 0xab, 0x75, 0xab, + 0xc2, 0xb2, 0x7b, 0xdb, 0xcb, 0x9f, 0x7f, 0xaa, 0x41, 0x84, 0x77, 0xb4, 0xeb, 0xab, 0x1a, 0xcf, + 0x28, 0xb4, 0x10, 0x8f, 0xc2, 0xe7, 0x6c, 0x01, 0xfe, 0xc2, 0x14, 0xaa, 0x0f, 0xcd, 0x58, 0x10, + 0xb4, 0xf9, 0x98, 0x16, 0x30, 0xf2, 0x21, 0x9f, 0x7e, 0xea, 0x9f, 0x71, 0x69, 0xf2, 0xcd, 0x16, + 0xe1, 0x57, 0x68, 0x76, 0x2f, 0x54, 0x04, 0x58, 0x6a, 0x08, 0xb2, 0xff, 0x2b, 0x9d, 0x27, 0x22, + 0x90, 0xfa, 0x32, 0x9e, 0x77, 0x23, 0xf1, 0x38, 0xff, 0xf4, 0x7a, 0x09, 0xa0, 0xfb, 0x30, 0x33, + 0x40, 0x65, 0x9c, 0xf1, 0x3a, 0x33, 0x88, 0xd2, 0x80, 0xf7, 0x99, 0x01, 0xa0, 0x34, 0xe2, 0x25, + 0x3b, 0x58, 0x57, 0x3f, 0xee, 0xfa, 0xb2, 0x45, 0x1a, 0xb7, 0x49, 0xbd, 0x4b, 0x22, 0xac, 0x4b, + 0x12, 0xc1, 0x5d, 0x27, 0x11, 0x3f, 0xc0, 0x16, 0xbf, 0x92, 0x44, 0x44, 0xa9, 0x42, 0x74, 0x19, + 0xf7, 0x21, 0x44, 0xfb, 0x56, 0x17, 0x31, 0x4e, 0x39, 0xc0, 0x1a, 0x45, 0xc2, 0x56, 0x25, 0x49, + 0x02, 0x9a, 0x8e, 0xe0, 0x7c, 0x0a, 0x20, 0x5e, 0x53, 0xdb, 0x4b, 0x22, 0xd8, 0x76, 0x04, 0xf8, + 0x4f, 0x39, 0xc3, 0x69, 0x29, 0x25, 0xdd, 0x1b, 0x93, 0xe0, 0x3d, 0x40, 0x3a, 0xf6, 0xa0, 0xa6, + 0x3e, 0x25, 0x35, 0x04, 0x2c, 0x50, 0xc6, 0xea, 0xc5, 0xf7, 0xee, 0x7e, 0x02, 0x3c, 0xdf, 0xe7, + 0xf6, 0xef, 0x73, 0x04, 0xc8, 0xd0, 0x96, 0x90, 0x22, 0x5c, 0x03, 0x0f, 0x28, 0x5a, 0x9d, 0x8b, + 0x62, 0xe4, 0xf1, 0xeb, 0x39, 0x03, 0xf4, 0x81, 0xee, 0x49, 0x04, 0xa6, 0xf7, 0x68, 0x35, 0x21, + 0x56, 0xf7, 0x12, 0x58, 0x57, 0xbc, 0xac, 0x7c, 0xce, 0xca, 0x80, 0x56, 0x2d, 0x04, 0x5c, 0xd4, + 0xa4, 0xf0, 0x29, 0x09, 0x42, 0xe2, 0x5a, 0x2a, 0x85, 0x21, 0x50, 0x64, 0xbc, 0xec, 0xc9, 0xdb, + 0x49, 0xeb, 0x93, 0x85, 0x71, 0x9f, 0x38, 0x08, 0xcc, 0x17, 0xaf, 0x15, 0x54, 0x6f, 0x0d, 0x39, + 0xa8, 0x04, 0xe8, 0x9e, 0xe3, 0x00, 0x52, 0x2f, 0x35, 0x4e, 0x37, 0x3e, 0x19, 0xbf, 0x98, 0x6c, + 0xa0, 0x1d, 0xbe, 0xa4, 0x7f, 0x8f, 0x84, 0x45, 0xde, 0x83, 0x4b, 0x4a, 0xe8, 0x78, 0x75, 0xe9, + 0xd0, 0x4e, 0x7a, 0x9f, 0x3c, 0x0c, 0x24, 0x49, 0x41, 0xd2, 0xe1, 0xbe, 0x72, 0x4b, 0xc2, 0x33, + 0x84, 0xf0, 0xd4, 0xe3, 0x67, 0xfc, 0xf4, 0x84, 0xcc, 0xe5, 0x51, 0x19, 0xc4, 0x5f, 0xbc, 0x60, + 0xe5, 0xc8, 0x19, 0xc8, 0x30, 0xf9, 0x6e, 0x10, 0x67, 0xe4, 0x90, 0x69, 0x87, 0x55, 0x32, 0x7e, + 0xb8, 0xc3, 0xe0, 0xaa, 0x32, 0x07, 0xb8, 0x26, 0x0e, 0x46, 0xbc, 0xab, 0xa1, 0xd7, 0xe6, 0xbd, + 0xec, 0x4f, 0xbc, 0x3c, 0xac, 0x73, 0xda, 0xfc, 0x13, 0xc1, 0x7d, 0x88, 0x87, 0x47, 0xb4, 0x51, + 0x07, 0xf9, 0x0b, 0xba, 0x9a, 0x76, 0xba, 0xba, 0x06, 0x6b, 0xe6, 0x44, 0xcb, 0x59, 0x9a, 0x89, + 0x6e, 0x22, 0x45, 0x71, 0x57, 0x7a, 0x88, 0x33, 0x95, 0xe8, 0xd2, 0x09, 0x32, 0xbc, 0xdf, 0x64, + 0x2f, 0x75, 0xdd, 0x98, 0x13, 0xc5, 0x77, 0x2d, 0x41, 0xd6, 0x58, 0xa6, 0xe7, 0x7f, 0x88, 0xc8, + 0x41, 0x9f, 0x50, 0x7e, 0xfd, 0xc0, 0x88, 0xc9, 0x3f, 0xbc, 0xbd, 0xf7, 0x47, 0xea, 0xc1, 0xb6, + 0xe2, 0x9d, 0xc7, 0xb7, 0x37, 0x71, 0x78, 0x10, 0x8c, 0xab, 0xf1, 0xeb, 0x69, 0xd8, 0x65, 0xf5, + 0x8f, 0x38, 0xe4, 0x46, 0x5b, 0x08, 0x8f, 0x34, 0x95, 0x44, 0xb5, 0xa9, 0x9b, 0x5c, 0xb5, 0x1f, + 0x72, 0xd5, 0x5e, 0xb8, 0x32, 0xef, 0xb9, 0x6a, 0x1f, 0x72, 0x45, 0x6f, 0x29, 0xfc, 0x01, 0x5b, + 0xfe, 0x85, 0x6d, 0xed, 0x1d, 0x57, 0xfe, 0x43, 0xae, 0xe8, 0x4d, 0x8b, 0x3f, 0xe0, 0xba, 0x7b, + 0xe1, 0xba, 0x78, 0xc7, 0x75, 0xf7, 0x21, 0xd7, 0xf8, 0x9d, 0x3a, 0x3f, 0xe0, 0x0b, 0x3c, 0xaa, + 0x57, 0xcc, 0x22, 0x90, 0x77, 0xe9, 0x69, 0x34, 0x85, 0xae, 0xa0, 0x22, 0x0e, 0x85, 0x12, 0x78, + 0x26, 0xd1, 0xab, 0x9a, 0x5e, 0x06, 0xd6, 0x91, 0x07, 0x71, 0x00, 0xfa, 0x84, 0xce, 0xa3, 0xbe, + 0xdf, 0xf7, 0x1c, 0xbf, 0x0a, 0x08, 0x7a, 0x8e, 0xae, 0x74, 0xb7, 0xa7, 0xfd, 0x5e, 0xf5, 0x8f, + 0x37, 0xaf, 0xff, 0xb9, 0x4b, 0xfe, 0x81, 0x9d, 0xb8, 0x62, 0x7f, 0xa4, 0xfe, 0xf8, 0x68, 0x00, + 0xfe, 0xdf, 0x94, 0xff, 0xa6, 0xa0, 0xaf, 0x07, 0x36, 0x3d, 0x0f, 0xec, 0x7d, 0x87, 0xd4, 0x7b, + 0xb1, 0xdf, 0xbe, 0x32, 0xe8, 0xad, 0xdc, 0x67, 0x25, 0x3c, 0xff, 0x23, 0xda, 0x19, 0x73, 0xd0, + 0x93, 0x76, 0xd1, 0x96, 0x91, 0x6b, 0x3f, 0x5c, 0xed, 0x36, 0x26, 0x13, 0xff, 0x14, 0x1c, 0xe1, + 0x82, 0xf7, 0x32, 0xe0, 0x97, 0xce, 0xaf, 0x84, 0x82, 0xc3, 0xd7, 0x17, 0xce, 0x2a, 0xd1, 0x52, + 0x41, 0x11, 0xf7, 0x72, 0xa3, 0x7d, 0x3d, 0x99, 0xfa, 0x07, 0x42, 0x4a, 0x1f, 0x1a, 0x64, 0xa4, + 0x81, 0x2f, 0x04, 0x50, 0xbd, 0x27, 0x71, 0x76, 0x2e, 0x50, 0x44, 0xb8, 0xf2, 0x01, 0xa2, 0xa0, + 0x0f, 0xf1, 0x28, 0xc1, 0x5f, 0xde, 0xc2, 0x99, 0xcc, 0x12, 0x28, 0xac, 0x3e, 0x46, 0x37, 0xc0, + 0xfd, 0x07, 0x9a, 0x93, 0xa7, 0xe6, 0xff, 0x00, 0xf1, 0xc0, 0xf7, 0xdc, 0x94, 0xc0, 0xb7, 0x8c, + 0xff, 0x1d, 0x09, 0x7e, 0xd2, 0xfc, 0x2c, 0xc1, 0xf3, 0x3f, 0x2e, 0x0a, 0x5b, 0x26, 0x01, 0xb5, + 0x83, 0x28, 0x30, 0x3b, 0x89, 0x68, 0xd2, 0x9b, 0xcb, 0x6a, 0x02, 0x43, 0x65, 0x8f, 0x57, 0x54, + 0xa3, 0x77, 0x54, 0xa3, 0x1b, 0x54, 0xe8, 0x05, 0x69, 0xb7, 0x75, 0x7f, 0x7e, 0x17, 0x1a, 0x08, + 0x17, 0x85, 0x05, 0xe9, 0xc4, 0xec, 0x0f, 0xc4, 0x8b, 0x5a, 0xa1, 0xd7, 0x68, 0xc5, 0x83, 0xba, + 0x2e, 0x24, 0x50, 0xe1, 0x35, 0xfb, 0xf3, 0xbb, 0x65, 0x7f, 0xd4, 0x87, 0x75, 0xb3, 0x0b, 0x76, + 0x70, 0xa3, 0x0b, 0x28, 0x7c, 0xdb, 0xc5, 0x79, 0x31, 0x98, 0x00, 0x81, 0xb4, 0x53, 0xa4, 0x87, + 0x02, 0x48, 0x1b, 0xbd, 0xab, 0xbb, 0xa2, 0x4f, 0xd5, 0x78, 0x01, 0xbd, 0xae, 0x33, 0xf5, 0x6a, + 0x35, 0x25, 0x4f, 0x75, 0xff, 0x8a, 0xeb, 0x50, 0xe0, 0xbf, 0xc2, 0x11, 0xc4, 0x25, 0xb2, 0x9d, + 0x98, 0x62, 0x89, 0x28, 0x6d, 0x89, 0x1b, 0x7f, 0x26, 0x89, 0xaf, 0x7f, 0x10, 0x7f, 0x54, 0xfe, + 0xf8, 0x23, 0x75, 0x5e, 0x38, 0xa0, 0xdd, 0x53, 0x56, 0x75, 0x7e, 0x80, 0xf4, 0x8d, 0xcb, 0x8f, + 0x76, 0x35, 0xd9, 0xf8, 0x1d, 0x6b, 0x5e, 0xf5, 0x5a, 0x29, 0x5e, 0xfd, 0x40, 0xa1, 0x48, 0x33, + 0xe0, 0x4c, 0x09, 0x01, 0xb9, 0x97, 0x37, 0xc5, 0x25, 0x5e, 0x10, 0xea, 0x1e, 0x40, 0xe7, 0xfe, + 0xf3, 0x6b, 0x2e, 0xe7, 0x4c, 0x62, 0x7f, 0xbe, 0x64, 0x14, 0x57, 0x7b, 0xd5, 0xd7, 0x64, 0xdf, + 0xf6, 0xdf, 0x5f, 0xf7, 0x36, 0xe5, 0x94, 0xb8, 0xaf, 0x08, 0xa7, 0x5c, 0x75, 0x72, 0x80, 0x4e, + 0x0e, 0xa7, 0x4e, 0x2e, 0xdc, 0x0f, 0x88, 0x3b, 0xcc, 0xe3, 0xa9, 0xf8, 0xdb, 0xe1, 0x7b, 0x0c, + 0xe2, 0xab, 0xd5, 0x58, 0xd6, 0x44, 0xea, 0xe9, 0xaa, 0xca, 0xb6, 0x22, 0xa6, 0x55, 0xe8, 0x70, + 0x0e, 0x4b, 0xfe, 0xf1, 0x7d, 0x55, 0x12, 0x4d, 0xe4, 0xf3, 0x3f, 0x5a, 0xcc, 0x10, 0x8e, 0x22, + 0xe7, 0x12, 0x5d, 0x4a, 0x7e, 0x7d, 0x6d, 0xf4, 0xa2, 0xbd, 0x18, 0xaf, 0xc7, 0xc5, 0xa7, 0x69, + 0x16, 0xdc, 0x6a, 0x7c, 0x35, 0xc9, 0x55, 0xf8, 0x07, 0x37, 0xde, 0xbd, 0x57, 0xae, 0x8a, 0x94, + 0xb8, 0x88, 0xbf, 0x2a, 0xe2, 0xe3, 0x22, 0xe4, 0x30, 0x13, 0x89, 0xc7, 0xc8, 0x28, 0x5f, 0xdf, + 0x9e, 0xf1, 0xc7, 0xc3, 0xe9, 0xfd, 0x82, 0x57, 0x46, 0xf9, 0x14, 0xd3, 0x47, 0xab, 0x68, 0x92, + 0x81, 0x55, 0x24, 0xb8, 0x58, 0xe2, 0xf7, 0x56, 0x74, 0xa4, 0xc0, 0x51, 0x3d, 0x3a, 0xe2, 0x4f, + 0xb6, 0x7a, 0x4d, 0x7c, 0xa1, 0xbd, 0x90, 0x9e, 0x28, 0x91, 0x43, 0x41, 0xb8, 0x26, 0x05, 0x96, + 0x2d, 0xc4, 0x3e, 0xf6, 0x46, 0xac, 0x49, 0x08, 0x61, 0xe2, 0xec, 0x1b, 0x4e, 0x7b, 0xa4, 0x30, + 0x31, 0x57, 0xc6, 0x1f, 0xe9, 0xee, 0x1f, 0x4f, 0x16, 0xe4, 0xef, 0x20, 0x6c, 0x35, 0xf1, 0xfb, + 0xe5, 0x08, 0x8b, 0x13, 0xb1, 0xe8, 0x9d, 0x13, 0xc9, 0xe8, 0x61, 0x32, 0xf4, 0x39, 0xe1, 0x29, + 0x18, 0xb2, 0x17, 0xdf, 0x32, 0xb0, 0xec, 0xf7, 0xda, 0xbe, 0xef, 0x4c, 0xe2, 0xa2, 0x24, 0x32, + 0xf6, 0xe8, 0x08, 0x66, 0xe2, 0xed, 0x4d, 0x3a, 0x57, 0x86, 0xfc, 0x8f, 0xcb, 0xed, 0xcc, 0xd7, + 0xf7, 0x0f, 0xe5, 0xce, 0x0f, 0x0f, 0xc0, 0x69, 0xe0, 0x55, 0xab, 0x19, 0x82, 0x38, 0x95, 0x40, + 0x74, 0x74, 0xc0, 0xfe, 0x24, 0xe8, 0xed, 0xb7, 0x2a, 0xba, 0x6c, 0x8b, 0x52, 0x4d, 0x00, 0x75, + 0xc4, 0x8d, 0x21, 0x23, 0x9f, 0x9f, 0x38, 0xf9, 0xfc, 0xea, 0xdb, 0xd6, 0xb7, 0xcd, 0xf7, 0x0f, + 0x4e, 0xf8, 0x23, 0xf5, 0x8d, 0xf8, 0x0e, 0x13, 0xa6, 0x19, 0x22, 0xba, 0x71, 0x15, 0x5d, 0xda, + 0x7d, 0xb0, 0xe0, 0x60, 0x7e, 0x09, 0x9e, 0xae, 0xfb, 0xab, 0xdc, 0x04, 0xe3, 0x17, 0xb8, 0x29, + 0x7f, 0x8b, 0x1b, 0xf9, 0x13, 0x6e, 0xfc, 0xdf, 0xe2, 0x96, 0xf9, 0x98, 0x5b, 0xbc, 0x8c, 0x2e, + 0xf6, 0x8e, 0xee, 0xc5, 0x71, 0xdd, 0xb4, 0x52, 0x71, 0x95, 0x34, 0x5f, 0x71, 0xf9, 0x78, 0x13, + 0x67, 0x17, 0xfe, 0x6a, 0x77, 0xbb, 0xf0, 0xc7, 0xaa, 0x00, 0x33, 0xd8, 0x85, 0x5f, 0xaa, 0x44, + 0xea, 0x7d, 0x60, 0x4b, 0x20, 0xdc, 0x77, 0x99, 0xc8, 0x5d, 0x78, 0x5a, 0x1d, 0x1f, 0xfb, 0xbb, + 0x9d, 0x0a, 0xe4, 0x88, 0x7d, 0x6c, 0xef, 0xa7, 0x3d, 0xa2, 0x6a, 0x9c, 0x6d, 0x83, 0xd1, 0x23, + 0xec, 0x9f, 0xfc, 0x45, 0xb9, 0xad, 0xd3, 0x14, 0x5e, 0xb0, 0x4e, 0xea, 0xb7, 0x2a, 0xf1, 0x15, + 0x65, 0x14, 0x31, 0xfe, 0xb8, 0x01, 0x8f, 0x62, 0x34, 0xf9, 0xb7, 0xcc, 0xce, 0xdb, 0xff, 0x58, + 0x3b, 0x1f, 0xe1, 0xf6, 0xbf, 0xd5, 0x89, 0xf6, 0xb7, 0x3b, 0x79, 0x17, 0x55, 0x7f, 0x5d, 0x6d, + 0xde, 0x0f, 0xfb, 0xaa, 0x46, 0x39, 0xd9, 0x6b, 0x3f, 0xf5, 0x7a, 0x0e, 0xa1, 0x85, 0x90, 0x78, + 0xad, 0xf9, 0x5f, 0x1d, 0xa7, 0xe8, 0xbd, 0x99, 0xb2, 0xc7, 0x53, 0xde, 0x87, 0xf0, 0x21, 0x8a, + 0xf8, 0x17, 0xcf, 0xe4, 0x48, 0x10, 0x25, 0x5a, 0xf4, 0x34, 0x91, 0x4e, 0x80, 0x93, 0x4d, 0x60, + 0x27, 0x9f, 0x97, 0x8e, 0x85, 0x3b, 0x93, 0x79, 0x92, 0x25, 0x46, 0xb7, 0x88, 0xbc, 0xc2, 0x3b, + 0xe0, 0x6e, 0x25, 0xe4, 0x6e, 0x9f, 0x22, 0xae, 0x37, 0xac, 0xc0, 0x97, 0x11, 0x1a, 0x73, 0x85, + 0x2a, 0x22, 0xbb, 0x6e, 0xe9, 0x50, 0x28, 0x04, 0xc5, 0x81, 0xc7, 0x11, 0xaa, 0x17, 0x08, 0x7c, + 0xfd, 0xb8, 0x52, 0x44, 0xf1, 0x78, 0x0a, 0x4d, 0x8e, 0xf0, 0x12, 0x93, 0xe0, 0xf8, 0x12, 0x8c, + 0xe0, 0x98, 0xff, 0xc5, 0xc8, 0x73, 0x52, 0x78, 0x9c, 0x80, 0x2b, 0xfc, 0x2f, 0x46, 0xa1, 0x7f, + 0xfc, 0x2a, 0xf3, 0x68, 0x29, 0xdc, 0xe2, 0xfe, 0x71, 0xd8, 0x02, 0xfd, 0xc5, 0xa4, 0xaf, 0x51, + 0xe4, 0x08, 0xc0, 0xcd, 0x4b, 0x6e, 0xfe, 0x6b, 0x58, 0x3e, 0xca, 0xde, 0x7f, 0x4c, 0x77, 0x63, + 0x82, 0xae, 0xab, 0x21, 0x7e, 0x5c, 0xde, 0xee, 0x3a, 0x8d, 0x81, 0xe1, 0x47, 0x28, 0xfb, 0x55, + 0x33, 0xd4, 0xf3, 0x75, 0x4b, 0xf2, 0x2d, 0x6a, 0x1d, 0x9c, 0x86, 0x13, 0x6d, 0x41, 0x5c, 0x08, + 0x07, 0x8d, 0x3f, 0x5e, 0x8d, 0xda, 0xf1, 0x92, 0x8e, 0x37, 0x08, 0xcc, 0x13, 0xb8, 0xfd, 0x40, + 0xe1, 0xf7, 0x8e, 0xf7, 0x81, 0xce, 0x5f, 0x14, 0x3e, 0xea, 0x81, 0x7e, 0x23, 0x5e, 0x3f, 0x99, + 0xbd, 0x37, 0xcc, 0x5e, 0xac, 0xe3, 0x8a, 0x17, 0x7b, 0xc5, 0xeb, 0x25, 0x81, 0x7b, 0x79, 0xb8, + 0x34, 0xc6, 0x63, 0x27, 0x34, 0xea, 0x9c, 0xa2, 0x22, 0x7a, 0x64, 0xcb, 0x8a, 0x9e, 0xf9, 0x78, + 0xbc, 0xe0, 0x47, 0xaf, 0xea, 0xb8, 0x3f, 0xc1, 0x8b, 0x11, 0x2d, 0x59, 0xbd, 0x7a, 0x88, 0x38, + 0x6e, 0x89, 0x16, 0x72, 0xa4, 0xeb, 0x13, 0x49, 0xe6, 0x06, 0x09, 0x79, 0x21, 0x41, 0x98, 0x92, + 0xfc, 0xe2, 0x65, 0x4e, 0x77, 0xdf, 0x9b, 0x4e, 0xd5, 0xcb, 0x3c, 0x42, 0x1b, 0x8f, 0x7c, 0x04, + 0xe6, 0x70, 0x7e, 0x4a, 0x40, 0x4f, 0x21, 0xe1, 0x24, 0xcf, 0x3b, 0xe9, 0xde, 0x62, 0xe7, 0xf8, + 0x5d, 0xca, 0x91, 0x3b, 0x7a, 0x7c, 0xdd, 0xf4, 0xca, 0x3b, 0x79, 0x24, 0x96, 0xb8, 0xbb, 0xbf, + 0x4b, 0x60, 0xd0, 0xe5, 0x69, 0xbf, 0xe7, 0xe5, 0x8d, 0xc1, 0x24, 0x24, 0xd3, 0x40, 0xf0, 0xc7, + 0xef, 0xa3, 0x0c, 0x3a, 0xca, 0x80, 0x22, 0x2f, 0xbb, 0x57, 0x9f, 0x71, 0xb4, 0xb3, 0x04, 0x5f, + 0xaa, 0x6f, 0x1a, 0x5f, 0xfe, 0x6f, 0xb0, 0x33, 0xdf, 0x06, 0x8c, 0xb5, 0x00, 0x00, }; diff --git a/wled00/wled00.ino b/wled00/wled00.ino index 202688375..595a753cb 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -74,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811253 +#define VERSION 1811291 char versionString[] = "0.8.2-dev"; From 5489c7498645a3073b1c2a203ff54b0dd68bf64e Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sun, 2 Dec 2018 02:49:05 +0100 Subject: [PATCH 31/33] Added Smooth meteor and Railway effects --- wled00/WS2812FX.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++-- wled00/WS2812FX.h | 11 +++++-- wled00/wled00.ino | 2 +- 3 files changed, 82 insertions(+), 6 deletions(-) diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index a04167732..c2500cf06 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -93,7 +93,7 @@ void WS2812FX::clear() bool WS2812FX::modeUsesLock(uint8_t m) { - if (m == FX_MODE_FIRE_2012 || m == FX_MODE_COLORTWINKLE || m == FX_MODE_METEOR) return true; + if (m == FX_MODE_FIRE_2012 || m == FX_MODE_COLORTWINKLE || m == FX_MODE_METEOR || m == FX_MODE_METEOR_SMOOTH) return true; return false; } @@ -2271,7 +2271,7 @@ uint16_t WS2812FX::mode_palette(void) setPixelColor(i, color_from_palette(colorIndex, false, true, 255)); } - SEGMENT_RUNTIME.counter_mode_step += SEGMENT.speed *2; + SEGMENT_RUNTIME.counter_mode_step += SEGMENT.speed; if (SEGMENT.speed == 0) SEGMENT_RUNTIME.counter_mode_step = 0; return 20; } @@ -2619,3 +2619,74 @@ uint16_t WS2812FX::mode_meteor() { //fade each led by a certain range (even ramp possible for sparkling) //maybe dim to color[1] at end? //_locked 0-15 bg-last 15-240 last-first 240-255 first-bg + + +#define IS_PART_OF_METEOR 245 +// smooth meteor effect +// send a meteor from begining to to the end of the strip with a trail that randomly decays. +// adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain +uint16_t WS2812FX::mode_meteor_smooth() { + byte meteorSize= 1+ SEGMENT_LENGTH / 10; + uint16_t in = map((SEGMENT_RUNTIME.counter_mode_step >> 6 & 0xFF), 0, 255, SEGMENT.start, SEGMENT.stop); + + byte decayProb = SEGMENT.intensity; + + // fade all leds to colors[1] in LEDs one step + for (uint16_t i = SEGMENT.start; i <= SEGMENT.stop; i++) { + if (_locked[i] != IS_PART_OF_METEOR && _locked[i] != 0 && random8() <= decayProb) + { + int change = 3 - random8(12); //change each time between -8 and +3 + _locked[i] += change; + if (_locked[i] > 245) _locked[i] = 0; + if (_locked[i] > 240) _locked[i] = 240; + setPixelColor(i, color_from_palette(_locked[i], false, true, 255)); + } + } + + // draw meteor + for(int j = 0; j < meteorSize; j++) { + uint16_t index = in + j; + if(in + j > SEGMENT.stop) { + index = SEGMENT.start + (in + j - SEGMENT.stop) -1; + } + + _locked[index] = IS_PART_OF_METEOR; + setPixelColor(index, color_blend(getPixelColor(index), color_from_palette(240, false, true, 255), 48)); + + if (j == 0) _locked[index] = 240;//last pixel of meteor + } + + SEGMENT_RUNTIME.counter_mode_step += SEGMENT.speed +1; + return 20; +} + + +//Railway Crossing / Christmas Fairy lights +uint16_t WS2812FX::mode_railway() +{ + uint16_t dur = 40 + (255 - SEGMENT.speed) * 10; + uint16_t rampdur = (dur * SEGMENT.intensity) >> 8; + if (SEGMENT_RUNTIME.counter_mode_step > dur) + { + //reverse direction + SEGMENT_RUNTIME.counter_mode_step = 0; + SEGMENT_RUNTIME.aux_param = !SEGMENT_RUNTIME.aux_param; + } + uint8_t pos = 255; + if (rampdur != 0) + { + uint16_t p0 = (SEGMENT_RUNTIME.counter_mode_step * 255) / rampdur; + if (p0 < 255) pos = p0; + } + if (SEGMENT_RUNTIME.aux_param) pos = 255 - pos; + for (uint16_t i = SEGMENT.start; i <= SEGMENT.stop; i += 2) + { + setPixelColor(i, color_from_palette(255 - pos, false, false, 255)); + if (i != SEGMENT.stop) + { + setPixelColor(i + 1, color_from_palette(pos, false, false, 255)); + } + } + SEGMENT_RUNTIME.counter_mode_step += 20; + return 20; +} diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index 76e48e321..8c5df9c2f 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -85,7 +85,7 @@ #define REVERSE (uint8_t)0x80 #define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE) -#define MODE_COUNT 77 +#define MODE_COUNT 79 #define FX_MODE_STATIC 0 #define FX_MODE_BLINK 1 @@ -165,8 +165,8 @@ #define FX_MODE_COLORTWINKLE 74 #define FX_MODE_LAKE 75 #define FX_MODE_METEOR 76 -#define FX_MODE_SMOOTH_METEOR 77 -#define FX_MODE_RAILROAD_X 78 +#define FX_MODE_METEOR_SMOOTH 77 +#define FX_MODE_RAILWAY 78 class WS2812FX { @@ -273,6 +273,9 @@ class WS2812FX { _mode[FX_MODE_COLORTWINKLE] = &WS2812FX::mode_colortwinkle; _mode[FX_MODE_LAKE] = &WS2812FX::mode_lake; _mode[FX_MODE_METEOR] = &WS2812FX::mode_meteor; + _mode[FX_MODE_METEOR_SMOOTH] = &WS2812FX::mode_meteor_smooth; + _mode[FX_MODE_RAILWAY] = &WS2812FX::mode_railway; + _brightness = DEFAULT_BRIGHTNESS; _running = false; @@ -454,6 +457,8 @@ class WS2812FX { mode_colortwinkle(void), mode_lake(void), mode_meteor(void), + mode_meteor_smooth(void), + mode_railway(void), mode_lightning(void); private: diff --git a/wled00/wled00.ino b/wled00/wled00.ino index 595a753cb..a5bd823cd 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -74,7 +74,7 @@ //version code in format yymmddb (b = daily build) -#define VERSION 1811291 +#define VERSION 1812012 char versionString[] = "0.8.2-dev"; From ff46e6ea86fea147d1b39aa4d8439244f2754dfd Mon Sep 17 00:00:00 2001 From: cschwinne Date: Tue, 4 Dec 2018 00:58:06 +0100 Subject: [PATCH 32/33] Added Auto Brightness Limiter and power calculation --- wled00/WS2812FX.cpp | 107 +++++++++++++++++++++++----------- wled00/WS2812FX.h | 11 ++-- wled00/data/settings_leds.htm | Bin 10124 -> 12626 bytes wled00/html_settings.h | 50 ++++++++++------ wled00/wled00.ino | 7 ++- wled00/wled01_eeprom.ino | 49 ++++++++++------ wled00/wled02_xml.ino | 8 +++ wled00/wled03_set.ino | 1 + wled00/wled05_init.ino | 3 +- wled00/wled18_server.ino | 15 +++-- 10 files changed, 164 insertions(+), 87 deletions(-) diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index c2500cf06..7a2314fd9 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -59,7 +59,6 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst) _segments[0].stop = _length -1; unlockAll(); setBrightness(_brightness); - show(); _running = true; } @@ -127,13 +126,13 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) byte o = 10*i; if (_cronixieBacklightEnabled && _cronixieDigits[i] <11) { - byte rCorr = (int)(((double)((_segments[0].colors[1]>>16) & 0xFF))*_cronixieSecMultiplier); - byte gCorr = (int)(((double)((_segments[0].colors[1]>>8) & 0xFF))*_cronixieSecMultiplier); - byte bCorr = (int)(((double)((_segments[0].colors[1]) & 0xFF))*_cronixieSecMultiplier); - byte wCorr = (int)(((double)((_segments[0].colors[1]>>24) & 0xFF))*_cronixieSecMultiplier); + byte r2 = (_segments[0].colors[1] >>16) & 0xFF; + byte g2 = (_segments[0].colors[1] >> 8) & 0xFF; + byte b2 = (_segments[0].colors[1] ) & 0xFF; + byte w2 = (_segments[0].colors[1] >>24) & 0xFF; for (int j=o; j< o+19; j++) { - bus->SetPixelColor((_skipFirstMode)?j+1:j,RgbwColor(rCorr,gCorr,bCorr,wCorr)); + bus->SetPixelColor((_skipFirstMode)?j+1:j,RgbwColor(r2,g2,b2,w2)); } } else { @@ -182,7 +181,75 @@ void WS2812FX::setCronixieDigits(byte d[]) } } + +//DISCLAIMER +//The following function attemps to calculate the current LED power usage, +//and will limit the brightness to stay below a set amperage threshold. +//It is NOT a measurement and NOT guaranteed to stay within the ablMilliampsMax margin. +//Stay safe with high amperage and have a reasonable safety margin! +//I am NOT to be held liable for burned down garages! + +//fine tune power estimation constants for your setup +#define PU_PER_MA 3600 //power units per milliamperere for accurate power estimation + //formula: 195075 divided by mA per fully lit LED, here ~54mA) + //lowering the value increases the estimated usage and therefore makes the ABL more aggressive + +#define MA_FOR_ESP 100 //how much mA does the ESP use (Wemos D1 about 80mA, ESP32 about 120mA) + //you can set it to 0 if the ESP is powered by USB and the LEDs by external + void WS2812FX::show(void) { + //power limit calculation + //each LED can draw up 195075 "power units" (approx. 53mA) + //one PU is the power it takes to have 1 channel 1 step brighter per brightness step + //so A=2,R=255,G=0,B=0 would use 510 PU per LED (1mA is about 3700 PU) + + if (ablMilliampsMax > 149 && ablMilliampsMax < 65000) //lower numbers and 65000 turn off calculation + { + uint32_t powerBudget = (ablMilliampsMax - MA_FOR_ESP) * PU_PER_MA; //100mA for ESP power + if (powerBudget > PU_PER_MA * _length) //each LED uses about 1mA in standby, exclude that from power budget + { + powerBudget -= PU_PER_MA * _length; + } else + { + powerBudget = 0; + } + + uint32_t powerSum = 0; + + for (uint16_t i = 0; i < _length; i++) //sum up the usage of each LED + { + RgbwColor c = bus->GetPixelColorRgbw(i); + powerSum += (c.R + c.G + c.B + c.W); + } + + if (_rgbwMode) //RGBW led total output with white LEDs enabled is still 50mA, so each channel uses less + { + powerSum *= 3; + powerSum >> 2; //same as /= 4 + } + + uint32_t powerSum0 = powerSum; + powerSum *= _brightness; + + if (powerSum > powerBudget) //scale brightness down to stay in current limit + { + float scale = (float)powerBudget / (float)powerSum; + uint16_t scaleI = scale * 255; + uint8_t scaleB = (scaleI > 255) ? 255 : scaleI; + uint8_t newBri = scale8(_brightness, scaleB); + bus->SetBrightness(newBri); + currentMilliamps = (powerSum0 * newBri) / PU_PER_MA; + } else + { + currentMilliamps = powerSum / PU_PER_MA; + bus->SetBrightness(_brightness); + } + currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate + currentMilliamps += _length; //add standby power back to estimate + } else { + currentMilliamps = 0; + } + bus->Show(); } @@ -237,7 +304,6 @@ void WS2812FX::setColor(uint32_t c) { void WS2812FX::setSecondaryColor(uint32_t c) { _segments[0].colors[1] = c; - if (_cronixieMode) _cronixieSecMultiplier = getSafePowerMultiplier(900, 100, c, _brightness); } void WS2812FX::setBrightness(uint8_t b) { @@ -442,33 +508,6 @@ uint32_t WS2812FX::color_blend(uint32_t color1, uint32_t color2, uint8_t blend) } -double WS2812FX::getPowerEstimate(uint16_t leds, uint32_t c, byte b) -{ - double _mARequired = 100; //ESP power - double _mul = (double)b/255; - double _sum = ((c & 0xFF000000) >> 24) + ((c & 0x00FF0000) >> 16) + ((c & 0x0000FF00) >> 8) + ((c & 0x000000FF) >> 0); - _sum /= (_rgbwMode)?1024:768; - double _mAPerLed = 50*(_mul*_sum); - _mARequired += leds*_mAPerLed; - return _mARequired; -} - -//DISCLAIMER -//This is just a helper function for huge amounts of LEDs. -//It is NOT guaranteed to stay within the safeAmps margin. -//Stay safe with high amperage and have a reasonable safety margin! -//I am NOT to be held liable for burned down garages! -double WS2812FX::getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b) -{ - double _mARequired = getPowerEstimate(leds,c,b); - if (_mARequired > safeMilliAmps) - { - return safeMilliAmps/_mARequired; - } - return 1.0; -} - - /* ##################################################### # # Color and Blinken Functions diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index 8c5df9c2f..679ee7312 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -289,6 +289,8 @@ class WS2812FX { colorOrder = 0; paletteFade = 0; paletteBlend = 0; + ablMilliampsMax = 750; + currentMilliamps = 0; _locked = NULL; _cronixieDigits = new byte[6]; bus = new NeoPixelWrapper(); @@ -352,10 +354,6 @@ class WS2812FX { getPixelColor(uint16_t), getColor(void); - double - getPowerEstimate(uint16_t leds, uint32_t c, byte b), - getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b); - WS2812FX::Segment getSegment(void); @@ -367,6 +365,8 @@ class WS2812FX { // mode helper functions uint16_t + ablMilliampsMax, + currentMilliamps, blink(uint32_t, uint32_t, bool strobe, bool), color_wipe(uint32_t, uint32_t, bool , bool), scan(bool), @@ -473,9 +473,6 @@ class WS2812FX { void handle_palette(void); bool modeUsesLock(uint8_t); - double - _cronixieSecMultiplier; - boolean _running, _rgbwMode, diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index a91ea5a9789b741970571eed0448b6763037a5a5..248448f274d93848265431b71c5defdc5c4d0bc7 100644 GIT binary patch delta 2422 zcma)8+inwA6y1|hRW6q#o&*hY%8(i`s~wwzzq7X zl9E|@B43LqTXIXK3vyGI!>66+&nNpKn)l8Te_IOD5LYVFlFPVX#9Eh{tjR;{c~XUo zj68tkL9Zow+{;*N*sozH2dNClGthd3-5G>FAqV9PN$9T}`n3KtYFm{}SQq7j9Q50Y z8|u!5t5Rr^g@UWn0`BEdN=q6cT;vxANrdo!hV~r*X~KO=LuHUm3344$0ed#VR69jK z&T$i2ZOK(Ni*_%;WEslLuL0Dn$dMUlkZDn?a39xo1+)a`GYD3N2VOl$^H^0RW+mj? zPIt#X`&y)UJ8B2-QR%MZndM?o53X76l$@3meN2XuY~LD|1%N6mPs1n->R6V6%l za{rG`K5!1)>l-I#n%9xb7L3AE$P`At@)q!BQEq5PHGr@%*2CQD$nB8^wVjG95uFsP z093+I7PTIndG@-f-S$Ai1#rA%oPpuo0tR;xGS7hm(C}1Q2bv^gRym2cOR67fQ2SJ9 zg*fywMan;hWd#-$__&OF13x_^&Fisa{nsUD{uxY9&FO3x3fDp*_6G=-^gKk7R3wI|vdG;7F%^KBWy(}GfL zn?XLT*J7K_*P!7ce^+C=Ku|?Z*yLzV>@>!GU>`Sqyp9ORgQuhgASEr_4aiJ{P%MaE zLpi+%&a#ev3$_mx63a?ZO+?`Lf-u=Q-$M_24O{25oPeVJblH5gdf01duGZn+igfe{ z{jw8RL4`OXjHn6vnsWiTR`mrBpD5F~R5WG_`4#1dhfU=u>H)K!2DS+SGm}*iSqDb|WdL*lR +body{font-family:var(--cFn),sans-serif;text-align:center;background:var(--cCol);color:var(--tCol);line-height:200%;margin:0;background-attachment:fixed}hr{border-color:var(--dCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:20px;margin:8px;margin-top:12px}.helpB{text-align:left;position:absolute;width:60px}input{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{width:4em}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:0.5ch solid var(--bCol);filter:drop-shadow( -5px -5px 5px var(--sCol) );} )====="; @@ -84,50 +84,62 @@ AP IP: Not active
    const char PAGE_settings_leds0[] PROGMEM = R"=====( -LED Settings )====="; @@ -27,12 +27,12 @@ button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-seri #ifndef WLED_DISABLE_MOBILE_UI const char PAGE_welcome0[] PROGMEM = R"=====( - + WLED Welcome! )====="; const char PAGE_welcome1[] PROGMEM = R"=====( -body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment: fixed;color: var(--tCol);}svg {fill: var(--dCol);} +body{font-family:var(--cFn),sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);margin:0;background-attachment: fixed;color: var(--tCol);}svg {fill: var(--dCol);} diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 2a48dd970..a83552d43 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -34,7 +34,7 @@ body{text-align:center;background:var(--cCol);height:100%;margin:0;background-at //wifi settings const char PAGE_settings_wifi0[] PROGMEM = R"=====( - + WiFi Settings