diff --git a/usermods/Animated_Staircase/Animated_Staircase.h b/usermods/Animated_Staircase/Animated_Staircase.h index 3886949f..20c240c7 100644 --- a/usermods/Animated_Staircase/Animated_Staircase.h +++ b/usermods/Animated_Staircase/Animated_Staircase.h @@ -92,12 +92,14 @@ class Animated_Staircase : public Usermod { static const char _bottomEchoCm[]; void publishMqtt(bool bottom, const char* state) { +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED){ char subuf[64]; sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)bottom); mqtt->publish(subuf, 0, false, state); } +#endif } void updateSegments() { @@ -345,6 +347,7 @@ class Animated_Staircase : public Usermod { uint16_t getId() { return USERMOD_ID_ANIMATED_STAIRCASE; } +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -382,6 +385,7 @@ class Animated_Staircase : public Usermod { mqtt->subscribe(subuf, 0); } } +#endif void addToJsonState(JsonObject& root) { JsonObject staircase = root[FPSTR(_name)]; diff --git a/usermods/BH1750_v2/usermod_bh1750.h b/usermods/BH1750_v2/usermod_bh1750.h index efd6135e..1304747f 100644 --- a/usermods/BH1750_v2/usermod_bh1750.h +++ b/usermods/BH1750_v2/usermod_bh1750.h @@ -1,6 +1,10 @@ // force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-) // #warning **** Included USERMOD_BH1750 **** +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include // WLEDMM: make sure that I2C drivers have the "right" Wire Object @@ -179,6 +183,7 @@ public: { lastLux = lux; lastSend = millis(); +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { if (!mqttInitialized) @@ -193,6 +198,7 @@ public: { DEBUG_PRINTLN(F("Missing MQTT connection. Not publishing data")); } +#endif } } diff --git a/usermods/BME280_v2/usermod_bme280.h b/usermods/BME280_v2/usermod_bme280.h index 6eb61f43..f2b6022d 100644 --- a/usermods/BME280_v2/usermod_bme280.h +++ b/usermods/BME280_v2/usermod_bme280.h @@ -1,6 +1,10 @@ // force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-) // #warning **** Included USERMOD_BME280 version 2.0 **** +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/Battery/usermod_v2_Battery.h b/usermods/Battery/usermod_v2_Battery.h index 0b419b64..98aeda43 100644 --- a/usermods/Battery/usermod_v2_Battery.h +++ b/usermods/Battery/usermod_v2_Battery.h @@ -224,6 +224,7 @@ class UsermodBattery : public Usermod if (autoOffEnabled && (autoOffThreshold >= batteryLevel)) turnOff(); +#ifndef WLED_DISABLE_MQTT // SmartHome stuff // still don't know much about MQTT and/or HA if (WLED_MQTT_CONNECTED) { @@ -231,6 +232,7 @@ class UsermodBattery : public Usermod snprintf_P(buf, 63, PSTR("%s/voltage"), mqttDeviceTopic); mqtt->publish(buf, 0, false, String(voltage).c_str()); } +#endif } diff --git a/usermods/DHT/usermod_dht.h b/usermods/DHT/usermod_dht.h index 6253b85f..b6142f43 100644 --- a/usermods/DHT/usermod_dht.h +++ b/usermods/DHT/usermod_dht.h @@ -1,6 +1,10 @@ #pragma once #include "wled.h" +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include diff --git a/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp b/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp index 0a2662aa..1ca16050 100644 --- a/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp +++ b/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include "wled.h" #include #include // from https://github.com/olikraus/u8g2/ diff --git a/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp b/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp index 88d49790..d5fd4a0c 100644 --- a/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp +++ b/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include "wled.h" #include #include // from https://github.com/olikraus/u8g2/ diff --git a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h index cbdbc87a..2928c75f 100644 --- a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h +++ b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h @@ -159,6 +159,7 @@ private: void publishMqtt(const char* state) { + #ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED) { char subuf[64]; @@ -166,11 +167,13 @@ private: strcat_P(subuf, PSTR("/motion")); mqtt->publish(subuf, 0, false, state); } + #endif } // Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop. void publishHomeAssistantAutodiscovery() { + #ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { StaticJsonDocument<600> doc; char uid[24], json_str[1024], buf[128]; @@ -200,6 +203,7 @@ private: mqtt->publish(buf, 0, true, json_str, payload_size); // do we really need to retain? } + #endif } /** diff --git a/usermods/SN_Photoresistor/usermod_sn_photoresistor.h b/usermods/SN_Photoresistor/usermod_sn_photoresistor.h index 9c3be7cc..60861e4c 100644 --- a/usermods/SN_Photoresistor/usermod_sn_photoresistor.h +++ b/usermods/SN_Photoresistor/usermod_sn_photoresistor.h @@ -109,6 +109,7 @@ public: { lastLDRValue = currentLDRValue; +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { char subuf[45]; @@ -121,6 +122,7 @@ public: DEBUG_PRINTLN("Missing MQTT connection. Not publishing data"); } } +#endif } uint16_t getLastLDRValue() diff --git a/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h b/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h index 71c22da1..4a42a7d5 100644 --- a/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h +++ b/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once // this is remixed from usermod_v2_SensorsToMqtt.h (sensors_to_mqtt usermod) diff --git a/usermods/Temperature/usermod_temperature.h b/usermods/Temperature/usermod_temperature.h index cf582844..1c3cf1bc 100644 --- a/usermods/Temperature/usermod_temperature.h +++ b/usermods/Temperature/usermod_temperature.h @@ -134,6 +134,7 @@ class UsermodTemperature : public Usermod { return false; } +#ifndef WLED_DISABLE_MQTT void publishHomeAssistantAutodiscovery() { if (!WLED_MQTT_CONNECTED) return; @@ -155,6 +156,7 @@ class UsermodTemperature : public Usermod { mqtt->publish(buf, 0, true, json_str, payload_size); HApublished = true; } +#endif public: @@ -213,6 +215,7 @@ class UsermodTemperature : public Usermod { } errorCount = 0; +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { char subuf[64]; strcpy(subuf, mqttDeviceTopic); @@ -228,6 +231,7 @@ class UsermodTemperature : public Usermod { // publish something else to indicate status? } } +#endif } } @@ -237,6 +241,7 @@ class UsermodTemperature : public Usermod { */ //void connected() {} +#ifndef WLED_DISABLE_MQTT /** * subscribe to MQTT topic if needed */ @@ -247,6 +252,7 @@ class UsermodTemperature : public Usermod { publishHomeAssistantAutodiscovery(); } } +#endif /* * API calls te enable data exchange between WLED modules diff --git a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp index c7eb8ee0..78cc32a8 100644 --- a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp +++ b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp @@ -101,6 +101,7 @@ void userLoop() { if (temptimer - lastMeasure > 60000) { lastMeasure = temptimer; +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (mqtt != nullptr) { @@ -116,6 +117,7 @@ void userLoop() { t += "/temperature"; mqtt->publish(t.c_str(), 0, true, String(board_temperature).c_str()); } + #endif } // Check if we time interval for redrawing passes. diff --git a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp index 05d4e77a..c9d9a527 100644 --- a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp +++ b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp @@ -103,6 +103,7 @@ void userLoop() { { lastMeasure = tempTimer; +#ifndef WLED_DISABLE_MQTT // Check if MQTT Connected, otherwise it will crash the 8266 if (mqtt != nullptr) { @@ -122,6 +123,7 @@ void userLoop() { h += "/humidity"; mqtt->publish(h.c_str(), 0, true, String(board_humidity).c_str()); } + #endif } // Check if we time interval for redrawing passes. diff --git a/usermods/boblight/boblight.h b/usermods/boblight/boblight.h index f46aa5ed..b36f301c 100644 --- a/usermods/boblight/boblight.h +++ b/usermods/boblight/boblight.h @@ -219,6 +219,7 @@ class BobLightUsermod : public Usermod { void enable(bool en) { enabled = en; } +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -249,6 +250,7 @@ class BobLightUsermod : public Usermod { // mqtt->subscribe(subuf, 0); //} } +#endif void addToJsonInfo(JsonObject& root) { diff --git a/usermods/multi_relay/usermod_multi_relay.h b/usermods/multi_relay/usermod_multi_relay.h index f8ae2bd3..7d0a7a7d 100644 --- a/usermods/multi_relay/usermod_multi_relay.h +++ b/usermods/multi_relay/usermod_multi_relay.h @@ -66,12 +66,14 @@ class MultiRelay : public Usermod { static const char _HAautodiscovery[]; void publishMqtt(int relay) { +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED){ char subuf[64]; sprintf_P(subuf, PSTR("%s/relay/%d"), mqttDeviceTopic, relay); mqtt->publish(subuf, 0, false, _relay[relay].state ? "on" : "off"); } +#endif } /** @@ -232,6 +234,7 @@ class MultiRelay : public Usermod { //Functions called by WLED +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -313,6 +316,7 @@ class MultiRelay : public Usermod { mqtt->publish(buf, 0, true, json_str, payload_size); } } +#endif /** * setup() is called once at boot. WiFi is not yet connected at this point. diff --git a/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h b/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h index dd7aedc1..972e2c86 100644 --- a/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h +++ b/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/seven_segment_display/usermod_v2_seven_segment_display.h b/usermods/seven_segment_display/usermod_v2_seven_segment_display.h index 5c0022e0..e5b726e5 100644 --- a/usermods/seven_segment_display/usermod_v2_seven_segment_display.h +++ b/usermods/seven_segment_display/usermod_v2_seven_segment_display.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h index b1a271a6..27977405 100644 --- a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h +++ b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/sht/usermod_sht.h b/usermods/sht/usermod_sht.h index 721cb7f0..4637d7a3 100644 --- a/usermods/sht/usermod_sht.h +++ b/usermods/sht/usermod_sht.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "SHT85.h" diff --git a/usermods/smartnest/usermod_smartnest.h b/usermods/smartnest/usermod_smartnest.h index 82673578..8d2b04ff 100644 --- a/usermods/smartnest/usermod_smartnest.h +++ b/usermods/smartnest/usermod_smartnest.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 2dd19c54..5a5ccac0 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -4837,7 +4837,7 @@ static const char _data_FX_MODE_2DFRIZZLES[] PROGMEM = "Frizzles@X frequency,Y f /////////////////////////////////////////// typedef struct ColorCount { CRGB color; - int8_t count; + int8_t count; } colorCount; uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color @@ -4846,20 +4846,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled + const uint16_t crcBufferLen = (SEGMENT.width() + SEGMENT.height())*2; // roughly sqrt(2)/2 for better repetition detection (Ewowi) - //array of patterns. Needed to identify repeating patterns. A pattern is one iteration of leds, without the color (on/off only) - const int patternsSize = (cols + rows) * 2; //seems to be a good value to catch also repetition in moving patterns - if (!SEGENV.allocateData(dataSize + sizeof(unsigned long) + sizeof(uint16_t) * patternsSize)) return mode_static(); //allocation failed + if (!SEGENV.allocateData(dataSize + sizeof(uint16_t)*crcBufferLen)) return mode_static(); //allocation failed CRGB *prevLeds = reinterpret_cast(SEGENV.data); - unsigned long *resetMillis = reinterpret_cast(SEGENV.data + dataSize); // triggers reset - uint16_t* patterns = reinterpret_cast(SEGENV.data + dataSize + sizeof(unsigned long)); //WLEDMM we need patterns!!! + uint16_t *crcBuffer = reinterpret_cast(SEGENV.data + dataSize); CRGB backgroundColor = SEGCOLOR(1); - if (SEGENV.call == 0 || strip.now - *resetMillis > 5000) { - *resetMillis = strip.now; - - random16_set_seed(strip.now); //seed the random generator + if (SEGENV.call == 0 || strip.now - SEGMENT.step > 5000) { + SEGENV.step = strip.now; + SEGENV.aux0 = 0; + random16_set_seed(millis()>>2); //seed the random generator //give the leds random state and colors (based on intensity, colors from palette or all posible colors are chosen) for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { @@ -4867,18 +4865,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: if (state == 0) SEGMENT.setPixelColorXY(x,y, backgroundColor); else - SEGMENT.setPixelColorXY(x,y, !SEGMENT.check1?SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0): random(32)); //WLEDMM support all colors + SEGMENT.setPixelColorXY(x,y, !SEGMENT.check1?SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0): random16()*random16()); //WLEDMM support all colors } for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) prevLeds[XY(x,y)] = CRGB::Black; - - //WLEDMM back to 0.13 style!!! - //init patterns - SEGENV.aux0 = 0; //ewowi20210629: pka static! patternsize: round robin index of next slot to add pattern - for (int i=0; i 3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation else if ((col == bgc) && (neighbors == 3)) { // Reproduction - //find dominantcolor and assign to cell + //find dominant color and assign to cell colorCount dominantColorCount = {backgroundColor, 0}; for (int i=0; i<9 && colorsCount[i].count != 0; i++) if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i]; @@ -4922,28 +4920,17 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: } //x,y // calculate CRC16 of leds - uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize-1); //ewowi: prevLeds instead of leds work as well, tbd: compare more patterns, see SR! - - // WLEDMM: this is work in progress in case we are not happy with crc16 - // byte index=0; - // for (int x = 0; x < cols; x+=MAX(cols/8,1)) for (int y = 0; y < rows; y+=MAX(rows/8,1)) { - // if (SEGMENT.getPixelColorXY(x,y) != (uint32_t)backgroundColor) crc = crc|crc << index; - // index ++; - // } - - //WLEDMM back to 0.13 style!!! - //check if repetition of patterns occurs + uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize); + // check if we had same CRC and reset if needed bool repetition = false; - for (int i=0; i>1)); // update only when appropriate time passes (in 42 FPS slots) + return FRAMETIME; } // mode_2Dgameoflife() static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,,,,,All colors=0;!,!;!;2"; //WLEDMM support all colors diff --git a/wled00/button.cpp b/wled00/button.cpp index 1be3e6df..fce21424 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -24,12 +24,14 @@ void shortPressAction(uint8_t b) applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "short"); } +#endif } void longPressAction(uint8_t b) @@ -43,12 +45,14 @@ void longPressAction(uint8_t b) applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "long"); } +#endif } void doublePressAction(uint8_t b) @@ -62,12 +66,14 @@ void doublePressAction(uint8_t b) applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "double"); } +#endif } bool isButtonPressed(uint8_t i) @@ -119,6 +125,7 @@ void handleSwitch(uint8_t b) } } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; @@ -126,6 +133,7 @@ void handleSwitch(uint8_t b) else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, !buttonPressedBefore[b] ? "off" : "on"); } +#endif buttonLongPressed[b] = buttonPressedBefore[b]; //save the last "long term" switch state } diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 8e4d6dc8..2aa73652 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -408,6 +408,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(e131SkipOutOfSequence, if_live_dmx[F("seqskip")]); CJSON(DMXAddress, if_live_dmx[F("addr")]); if (!DMXAddress || DMXAddress > 510) DMXAddress = 1; + CJSON(DMXSegmentSpacing, if_live_dmx[F("dss")]); + if (DMXSegmentSpacing > 150) DMXSegmentSpacing = 0; CJSON(DMXMode, if_live_dmx["mode"]); tdd = if_live[F("timeout")] | -1; @@ -870,6 +872,7 @@ void serializeConfig() { if_live_dmx[F("uni")] = e131Universe; if_live_dmx[F("seqskip")] = e131SkipOutOfSequence; if_live_dmx[F("addr")] = DMXAddress; + if_live_dmx[F("dss")] = DMXSegmentSpacing; if_live_dmx["mode"] = DMXMode; if_live[F("timeout")] = realtimeTimeoutMs / 100; diff --git a/wled00/const.h b/wled00/const.h index 5619cee2..e85c474d 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -173,10 +173,14 @@ #define DMX_MODE_DISABLED 0 //not used #define DMX_MODE_SINGLE_RGB 1 //all LEDs same RGB color (3 channels) #define DMX_MODE_SINGLE_DRGB 2 //all LEDs same RGB color and master dimmer (4 channels) -#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (11 channels) +#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (15 channels) +#define DMX_MODE_EFFECT_W 7 //trigger standalone effects of WLED (18 channels) #define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels) #define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels) #define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels) +#define DMX_MODE_EFFECT_SEGMENT 8 //trigger standalone effects of WLED (15 channels per segement) +#define DMX_MODE_EFFECT_SEGMENT_W 9 //trigger standalone effects of WLED (18 channels per segement) +#define DMX_MODE_PRESET 10 //apply presets (1 channel) //Light capability byte (unused) 0bRCCCTTTT //bits 0/1/2/3: specifies a type of LED driver. A single "driver" may have different chip models but must have the same protocol/behavior diff --git a/wled00/data/index.js b/wled00/data/index.js index f3a9599e..5dcace93 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -2551,7 +2551,8 @@ function rSegs() //WLEDMM generate presets.json file function genPresets() { - var result = '{"0":{}'; + var result = ""; + var sep = "{"; var effects = eJson; var playlistPS = JSON.parse("{}"); @@ -2603,7 +2604,8 @@ function genPresets() if (!defaultString.includes("rY")) defaultString += ',"rY":false'; if (!defaultString.includes("mY")) defaultString += ',"mY":false'; } - result += `\n,"${ef.id}":{"n":"${ef.name}","mainseg":0,"seg":[{"id":0,"fx":${ef.id}${defaultString}}]}`; + result += `${sep}"${ef.id}":{"n":"${ef.name}","mainseg":0,"seg":[{"id":0,"fx":${ef.id}${defaultString}}]}`; + sep = "\n,"; addToPlaylist(m, ef.id); addToPlaylist("All", ef.id); if (m.includes("1")) addToPlaylist("All1", ef.id); diff --git a/wled00/data/settings.htm b/wled00/data/settings.htm index 6837e5a2..099d25da 100644 --- a/wled00/data/settings.htm +++ b/wled00/data/settings.htm @@ -96,11 +96,11 @@ - +
Loading...
- + diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index 34107a85..25746341 100644 --- a/wled00/data/settings_sync.htm +++ b/wled00/data/settings_sync.htm @@ -150,15 +150,20 @@ Start universe:
Reboot required. Check out LedFx!
Skip out-of-sequence packets:
DMX start address:
+DMX segment spacing:
DMX mode:
E1.31 info
Timeout: ms
diff --git a/wled00/e131.cpp b/wled00/e131.cpp index fd68759a..e4c3fabb 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -132,7 +132,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; // nothing to do break; - case DMX_MODE_SINGLE_RGB: // RGB only + case DMX_MODE_SINGLE_RGB: // 3 channel: [R,G,B] if (uni != e131Universe) return; if (availDMXLen < 3) return; @@ -145,7 +145,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; - case DMX_MODE_SINGLE_DRGB: // Dimmer + RGB + case DMX_MODE_SINGLE_DRGB: // 4 channel: [Dimmer,R,G,B] if (uni != e131Universe) return; if (availDMXLen < 4) return; @@ -162,38 +162,77 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); break; - case DMX_MODE_EFFECT: // Length 1: Apply Preset ID, length 11-13: apply effect config - if (uni != e131Universe) return; - if (availDMXLen < 11) { - if (availDMXLen > 1) return; - applyPreset(e131_data[dataOffset+0], CALL_MODE_NOTIFICATION); - return; + case DMX_MODE_PRESET: // 2 channel: [Dimmer,Preset] + if (uni != e131Universe || availDMXLen < 2) return; + applyPreset(e131_data[dataOffset+1], CALL_MODE_NOTIFICATION); + if (bri != e131_data[dataOffset]) { + bri = e131_data[dataOffset]; + strip.setBrightness(bri, true); } - - if (bri != e131_data[dataOffset+0]) { - bri = e131_data[dataOffset+0]; - } - if (e131_data[dataOffset+1] < strip.getModeCount()) - effectCurrent = e131_data[dataOffset+ 1]; - effectSpeed = e131_data[dataOffset+ 2]; // flickers - effectIntensity = e131_data[dataOffset+ 3]; - effectPalette = e131_data[dataOffset+ 4]; - col[0] = e131_data[dataOffset+ 5]; - col[1] = e131_data[dataOffset+ 6]; - col[2] = e131_data[dataOffset+ 7]; - colSec[0] = e131_data[dataOffset+ 8]; - colSec[1] = e131_data[dataOffset+ 9]; - colSec[2] = e131_data[dataOffset+10]; - if (availDMXLen > 11) - { - col[3] = e131_data[dataOffset+11]; //white - colSec[3] = e131_data[dataOffset+12]; - } - transitionDelayTemp = 0; // act fast - colorUpdated(CALL_MODE_NOTIFICATION); // don't send UDP - return; // don't activate realtime live mode + return; break; + case DMX_MODE_EFFECT: // 15 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3] + case DMX_MODE_EFFECT_W: // 18 channels, same as above but with extra +3 white channels [..,W,W2,W3] + case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; + case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; + { + if (uni != e131Universe) return; + bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; + uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 15 : 18; + for (uint8_t id = 0; id < strip.getSegmentsNum(); id++) { + Segment& seg = strip.getSegment(id); + if (isSegmentMode) + dataOffset = DMXAddress + id * (dmxEffectChannels + DMXSegmentSpacing); + else + dataOffset = DMXAddress; + // Modify address for Art-Net data + if (protocol == P_ARTNET && dataOffset > 0) + dataOffset--; + // Skip out of universe addresses + if (dataOffset > dmxChannels - dmxEffectChannels + 1) + return; + + if (e131_data[dataOffset+1] < strip.getModeCount()) + if (e131_data[dataOffset+1] != seg.mode) seg.setMode( e131_data[dataOffset+1]); + if (e131_data[dataOffset+2] != seg.speed) seg.speed = e131_data[dataOffset+2]; + if (e131_data[dataOffset+3] != seg.intensity) seg.intensity = e131_data[dataOffset+3]; + if (e131_data[dataOffset+4] != seg.palette) seg.setPalette(e131_data[dataOffset+4]); + + uint8_t segOption = (uint8_t)floor(e131_data[dataOffset+5]/64.0); + if (segOption == 0 && (seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, false);} + if (segOption == 1 && (seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, true);} + if (segOption == 2 && (!seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, false);} + if (segOption == 3 && (!seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, true);} + + uint32_t colors[3]; + byte whites[3] = {0,0,0}; + if (dmxEffectChannels == 18) { + whites[0] = e131_data[dataOffset+15]; + whites[1] = e131_data[dataOffset+16]; + whites[2] = e131_data[dataOffset+17]; + } + colors[0] = RGBW32(e131_data[dataOffset+ 6], e131_data[dataOffset+ 7], e131_data[dataOffset+ 8], whites[0]); + colors[1] = RGBW32(e131_data[dataOffset+ 9], e131_data[dataOffset+10], e131_data[dataOffset+11], whites[1]); + colors[2] = RGBW32(e131_data[dataOffset+12], e131_data[dataOffset+13], e131_data[dataOffset+14], whites[2]); + if (colors[0] != seg.colors[0]) seg.setColor(0, colors[0]); + if (colors[1] != seg.colors[1]) seg.setColor(1, colors[1]); + if (colors[2] != seg.colors[2]) seg.setColor(2, colors[2]); + + // Set segment opacity or global brightness + if (isSegmentMode) { + if (e131_data[dataOffset] != seg.opacity) seg.setOpacity(e131_data[dataOffset]); + } else if ( id == strip.getSegmentsNum()-1 ) { + if (bri != e131_data[dataOffset]) { + bri = e131_data[dataOffset]; + strip.setBrightness(bri, true); + } + } + } + return; + break; + } + case DMX_MODE_MULTIPLE_DRGB: case DMX_MODE_MULTIPLE_RGB: case DMX_MODE_MULTIPLE_RGBW: @@ -279,7 +318,11 @@ void handleArtnetPollReply(IPAddress ipAddress) { case DMX_MODE_SINGLE_RGB: case DMX_MODE_SINGLE_DRGB: + case DMX_MODE_PRESET: case DMX_MODE_EFFECT: + case DMX_MODE_EFFECT_W: + case DMX_MODE_EFFECT_SEGMENT: + case DMX_MODE_EFFECT_SEGMENT_W: break; // 1 universe is enough case DMX_MODE_MULTIPLE_DRGB: diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 250b5327..036be27b 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -1,18 +1,17 @@ #ifndef WLED_FCN_DECLARE_H #define WLED_FCN_DECLARE_H -#include -#include "src/dependencies/espalexa/EspalexaDevice.h" -#include "src/dependencies/e131/ESPAsyncE131.h" /* * All globally accessible functions are declared here */ //alexa.cpp +#ifndef WLED_DISABLE_ALEXA void onAlexaChange(EspalexaDevice* dev); void alexaInit(); void handleAlexa(); void onAlexaChange(EspalexaDevice* dev); +#endif //blynk.cpp #ifndef WLED_DISABLE_BLYNK diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 20bbd328..1466c03c 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -65,86 +65,86 @@ const uint8_t PAGE_settingsCss[] PROGMEM = { // Autogenerated from wled00/data/settings.htm, do not edit!! -const uint16_t PAGE_settings_length = 1234; +const uint16_t PAGE_settings_length = 1239; const uint8_t PAGE_settings[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0xef, 0x6f, 0xdb, 0x36, - 0x10, 0xfd, 0xee, 0xbf, 0x82, 0x61, 0xb7, 0x44, 0x42, 0x65, 0xd9, 0x49, 0x86, 0x61, 0x93, 0x2d, + 0x10, 0xfd, 0xee, 0xbf, 0x82, 0x61, 0xb7, 0x44, 0x42, 0x65, 0xd9, 0x71, 0x87, 0x61, 0x93, 0x2d, 0x17, 0x6d, 0x92, 0xb6, 0x19, 0x12, 0x24, 0x40, 0x92, 0x76, 0xc3, 0x36, 0xa0, 0xb4, 0x78, 0xb2, - 0xd9, 0x48, 0xa4, 0x40, 0x9e, 0x9c, 0x78, 0xae, 0xff, 0xf7, 0x1d, 0x69, 0xe7, 0x57, 0x1b, 0x64, - 0xc5, 0xda, 0x2f, 0x51, 0x78, 0x22, 0x1f, 0xef, 0xde, 0x7b, 0x77, 0xf2, 0x70, 0x63, 0xff, 0x64, - 0xef, 0xfc, 0x8f, 0xd3, 0x03, 0x36, 0xc5, 0xba, 0x1a, 0x0d, 0xfd, 0x5f, 0x56, 0x09, 0x3d, 0xc9, - 0x39, 0x68, 0x4e, 0x6b, 0x10, 0x72, 0x34, 0xac, 0x01, 0x05, 0x2b, 0xa6, 0xc2, 0x3a, 0xc0, 0x9c, - 0x5f, 0x9c, 0xbf, 0xee, 0xfe, 0xc2, 0xd7, 0xd1, 0x4e, 0x61, 0x34, 0x82, 0xa6, 0xf0, 0x95, 0x92, - 0x38, 0xcd, 0x25, 0xcc, 0x54, 0x01, 0xdd, 0xb0, 0x48, 0x94, 0x56, 0xa8, 0x44, 0xd5, 0x75, 0x85, - 0xa8, 0x20, 0xdf, 0x4e, 0x6a, 0x71, 0xad, 0xea, 0xb6, 0xbe, 0x5d, 0xb7, 0x0e, 0x6c, 0x58, 0x88, - 0x31, 0xad, 0xb5, 0xe1, 0xac, 0xa3, 0x45, 0x0d, 0x39, 0x9f, 0x29, 0xb8, 0x6a, 0x8c, 0x45, 0xba, - 0x05, 0x15, 0x56, 0x30, 0x7a, 0x7f, 0x74, 0xb0, 0xcf, 0xce, 0x00, 0x51, 0xe9, 0x89, 0x1b, 0xf6, - 0x56, 0xc1, 0xa1, 0x2b, 0xac, 0x6a, 0x70, 0xd4, 0x99, 0x09, 0xcb, 0x2a, 0x53, 0xa8, 0x26, 0x91, - 0xb9, 0x34, 0x45, 0x5b, 0x53, 0x42, 0x09, 0x05, 0xf2, 0x8d, 0xed, 0x41, 0xd9, 0xea, 0x02, 0x95, - 0xd1, 0x6c, 0x72, 0x28, 0x23, 0x8c, 0x17, 0x16, 0xb0, 0xb5, 0x9a, 0xc9, 0x74, 0x02, 0x78, 0x50, - 0x81, 0xdf, 0xfa, 0x6a, 0x1e, 0x5e, 0x2d, 0x6f, 0xb7, 0x56, 0x46, 0xc8, 0xdf, 0xce, 0x22, 0x4c, - 0x20, 0xdf, 0xe8, 0xc7, 0x8b, 0x0a, 0x90, 0x99, 0x5c, 0xa6, 0x85, 0x05, 0x81, 0xb0, 0x3e, 0x14, - 0xf1, 0xd5, 0xed, 0x3c, 0x1e, 0x98, 0x94, 0x78, 0x79, 0x89, 0x68, 0xd5, 0xb8, 0x45, 0xa0, 0x17, - 0xb6, 0xe0, 0x09, 0xc6, 0xc9, 0xe7, 0x71, 0x9c, 0x37, 0xc0, 0x13, 0x8e, 0x70, 0x8d, 0xbd, 0x8f, - 0x62, 0x26, 0x6e, 0x00, 0xbe, 0xd8, 0x28, 0xdc, 0x5c, 0x13, 0x04, 0xc4, 0x89, 0x4c, 0xc7, 0x46, - 0xce, 0x53, 0xd1, 0x34, 0xa0, 0xe5, 0xde, 0x54, 0x55, 0x32, 0x32, 0x7e, 0xbf, 0x90, 0xf2, 0x60, - 0x46, 0x59, 0x1c, 0x29, 0x47, 0xec, 0x83, 0x8d, 0xb8, 0xcf, 0x99, 0x27, 0x51, 0x9c, 0x8f, 0x16, - 0x6f, 0x00, 0xdf, 0x45, 0xf1, 0xf2, 0xf1, 0x7d, 0x60, 0xad, 0xb1, 0x94, 0x1e, 0xed, 0x23, 0xe9, - 0x9c, 0xa9, 0x20, 0xad, 0xcc, 0x24, 0xe2, 0x07, 0x3e, 0xce, 0xd6, 0xc5, 0x13, 0xcb, 0xac, 0x54, - 0x15, 0x84, 0x32, 0x48, 0x2b, 0x4b, 0xe5, 0x1e, 0xad, 0xe3, 0xa6, 0x64, 0x74, 0xb0, 0x54, 0x93, - 0xd6, 0x8a, 0xc0, 0xd6, 0xaa, 0x0c, 0x56, 0x0a, 0x3a, 0x20, 0xd3, 0xbf, 0xf4, 0xa1, 0x2e, 0x4c, - 0xdd, 0x10, 0x69, 0xc0, 0x1a, 0x31, 0x01, 0x26, 0x05, 0x8a, 0x0d, 0x4e, 0xf9, 0xdc, 0x11, 0xac, - 0xdc, 0xc9, 0x3d, 0x2d, 0x70, 0x73, 0x93, 0x9b, 0xf1, 0x47, 0x28, 0x90, 0xe7, 0xb9, 0x27, 0x89, - 0xae, 0xa0, 0xd8, 0xc6, 0x4b, 0x6b, 0xc5, 0x3c, 0x55, 0x2e, 0x3c, 0x1f, 0x0a, 0x24, 0xcf, 0xa2, - 0x78, 0x51, 0x02, 0x16, 0xd3, 0x28, 0x22, 0xa1, 0x5f, 0xf0, 0x29, 0x62, 0x93, 0xf5, 0x7a, 0xfc, - 0x79, 0xf0, 0x41, 0xc6, 0x79, 0xfc, 0x9c, 0xf7, 0x8a, 0x72, 0x92, 0x7e, 0x74, 0x46, 0xf3, 0x64, - 0x41, 0x66, 0x9d, 0x1a, 0x99, 0x71, 0x52, 0x9d, 0x2f, 0xe3, 0x14, 0xa7, 0xa0, 0x23, 0xe2, 0x20, - 0xc2, 0xd4, 0x5c, 0x7e, 0xfa, 0x14, 0x79, 0x73, 0xf0, 0x8a, 0xec, 0x68, 0x79, 0x9c, 0x3a, 0x9c, - 0x13, 0x2b, 0x52, 0xb9, 0xa6, 0x12, 0xf3, 0x9c, 0x2b, 0x5d, 0x29, 0x0d, 0x24, 0x13, 0x06, 0xb0, - 0x28, 0x8e, 0xef, 0xce, 0x2f, 0x54, 0x19, 0xb5, 0xf5, 0x5e, 0x39, 0xc9, 0x31, 0x6d, 0xeb, 0xa4, - 0xb5, 0xe6, 0xca, 0xe5, 0x9c, 0x27, 0xbe, 0xc0, 0x10, 0x8f, 0xe3, 0xd2, 0xd8, 0xc8, 0x33, 0x8d, - 0x7f, 0x92, 0x9f, 0xfe, 0xa6, 0xd2, 0x4e, 0x42, 0xa9, 0x29, 0xa9, 0x62, 0x15, 0xb8, 0x9b, 0x6d, - 0xe1, 0xe8, 0xf3, 0xfc, 0xc3, 0x90, 0x2c, 0x80, 0x54, 0xa2, 0xe7, 0x21, 0xe7, 0xae, 0x1d, 0xd7, - 0x0a, 0x39, 0xe9, 0x52, 0x54, 0xaa, 0xb8, 0xf4, 0x5d, 0xa6, 0xa5, 0xb9, 0x22, 0xc9, 0x8a, 0x40, - 0x7e, 0xbe, 0x95, 0xf6, 0xdc, 0xba, 0x2d, 0x7a, 0x6d, 0xfd, 0xa2, 0xad, 0xf3, 0x1f, 0x16, 0xb8, - 0xdc, 0xe2, 0x23, 0xff, 0x60, 0xd1, 0xc5, 0x71, 0x3c, 0xec, 0xad, 0x10, 0x47, 0x1f, 0x06, 0xa1, - 0xca, 0x95, 0x78, 0xc7, 0xa0, 0x5b, 0x2a, 0x55, 0x69, 0x32, 0xc5, 0xdb, 0xf3, 0xe3, 0xa3, 0x3c, - 0xdc, 0x9f, 0xac, 0x9d, 0xff, 0x04, 0xa7, 0xb7, 0xb7, 0x39, 0x62, 0xe3, 0x45, 0x93, 0xf7, 0x79, - 0xb2, 0xb1, 0x4d, 0xe2, 0xa6, 0x94, 0x10, 0xa9, 0xe1, 0x39, 0xf9, 0x0a, 0x32, 0x93, 0xfb, 0xde, - 0xc3, 0x07, 0xde, 0xf0, 0xca, 0x72, 0x6f, 0xbe, 0x8c, 0xdc, 0xf0, 0x59, 0xb9, 0x69, 0x63, 0x0d, - 0x9a, 0xc2, 0x54, 0x9b, 0x9b, 0x51, 0xe8, 0xef, 0x7e, 0x12, 0x85, 0xe4, 0x72, 0xbf, 0xa3, 0x3a, - 0x43, 0x63, 0xc9, 0x71, 0xbe, 0xb5, 0x0f, 0x11, 0x6a, 0xdf, 0x14, 0xc5, 0x61, 0xc3, 0xe3, 0x98, - 0x14, 0x5e, 0x6d, 0xa3, 0xf3, 0x75, 0x43, 0x66, 0x7e, 0x4d, 0xf8, 0xec, 0xd8, 0x48, 0x48, 0xd9, - 0x69, 0x05, 0xc2, 0x01, 0x23, 0x39, 0xc0, 0xb2, 0x30, 0x67, 0x0e, 0x4f, 0xc9, 0xae, 0xc9, 0x03, - 0x44, 0xf7, 0x10, 0x31, 0x09, 0x68, 0x64, 0x84, 0x24, 0x38, 0x71, 0xd9, 0x19, 0xf6, 0xd6, 0xb3, - 0x68, 0x18, 0xea, 0x1d, 0x75, 0x7c, 0xdb, 0x2e, 0x7c, 0xa7, 0x77, 0x45, 0xa5, 0x26, 0x3a, 0x2b, - 0x02, 0xfe, 0x60, 0x2c, 0x8a, 0xcb, 0x89, 0x35, 0xad, 0x96, 0xd9, 0xb3, 0x9d, 0x9d, 0x9d, 0xc1, - 0x14, 0xd4, 0x64, 0x8a, 0xd9, 0x76, 0xbf, 0xdf, 0x5c, 0x0f, 0x6a, 0x61, 0x27, 0x4a, 0x67, 0xfd, - 0xa5, 0x9f, 0xc2, 0x8b, 0x6e, 0x77, 0x9a, 0xfd, 0x3a, 0x9b, 0x2e, 0x57, 0xea, 0x2d, 0xee, 0x9f, - 0xdc, 0xdd, 0xdd, 0x1d, 0x10, 0x09, 0xc6, 0x66, 0xcf, 0xca, 0xb2, 0x1c, 0x94, 0x34, 0x82, 0xbb, - 0xa5, 0xa8, 0x55, 0x35, 0xcf, 0xde, 0x81, 0x95, 0x42, 0x8b, 0xe4, 0x2d, 0x54, 0x33, 0x40, 0x55, - 0x88, 0xc4, 0x09, 0xed, 0xba, 0x24, 0x86, 0x2a, 0x07, 0x6b, 0x15, 0xb2, 0x31, 0xa5, 0x7f, 0x39, - 0x18, 0x1b, 0x2b, 0xc1, 0x66, 0xdb, 0xcd, 0x35, 0x23, 0x29, 0x94, 0x64, 0x01, 0x77, 0x15, 0xed, - 0x5a, 0x6a, 0xf6, 0xd6, 0x65, 0x34, 0x59, 0x23, 0x4a, 0x24, 0x5e, 0xdd, 0xe1, 0xd4, 0x3f, 0x90, - 0xfd, 0x3c, 0xab, 0x95, 0x1e, 0x84, 0x01, 0x9f, 0x11, 0x43, 0x45, 0x44, 0xc9, 0xff, 0xc8, 0xba, - 0xec, 0x27, 0x2a, 0x21, 0xbe, 0xa9, 0x61, 0x67, 0x36, 0x65, 0xa2, 0x45, 0xc3, 0xfa, 0x83, 0xa2, - 0xb5, 0x8e, 0x32, 0x6d, 0x8c, 0xf2, 0x0c, 0x04, 0xaa, 0x02, 0x45, 0xc3, 0xde, 0xea, 0xe3, 0xe2, - 0x99, 0x22, 0x7f, 0x7b, 0xe7, 0xe5, 0x9c, 0xc8, 0xa4, 0x99, 0xff, 0x68, 0x0b, 0x28, 0x7a, 0x3d, - 0xa6, 0x2f, 0xc4, 0x4d, 0x2b, 0x6c, 0x7d, 0xde, 0x0a, 0xbc, 0xc7, 0xb7, 0x46, 0xaf, 0x88, 0xa6, - 0x5b, 0xc7, 0xb3, 0xc7, 0x91, 0x9e, 0x80, 0xb8, 0xd7, 0x4d, 0x57, 0xaa, 0x54, 0x04, 0xf8, 0x5e, - 0xbd, 0x56, 0xfe, 0xcb, 0xd3, 0x36, 0x5f, 0xc2, 0x76, 0x1e, 0x6f, 0xd2, 0x27, 0x61, 0x69, 0x46, - 0x3a, 0x82, 0xf5, 0x3e, 0x3b, 0xb5, 0x50, 0x82, 0x05, 0x5d, 0x80, 0xeb, 0xfc, 0x57, 0xce, 0x5f, - 0x85, 0xbd, 0xb3, 0x4f, 0xc8, 0x9d, 0x9d, 0x7d, 0xb6, 0x77, 0x7f, 0x40, 0xdf, 0x42, 0x0f, 0xa5, - 0x9a, 0x05, 0x1a, 0xef, 0x8d, 0x80, 0xd1, 0x7a, 0xac, 0xa7, 0x69, 0x3a, 0xec, 0xd1, 0xfb, 0xd1, - 0xb7, 0xd4, 0xd6, 0xd6, 0x74, 0xff, 0x05, 0x79, 0xad, 0x36, 0xd2, 0xb1, 0xa8, 0x51, 0xda, 0xdd, - 0x8d, 0x9f, 0xce, 0xb7, 0x54, 0xd6, 0xaa, 0x35, 0x32, 0x3b, 0xf4, 0x2e, 0x2a, 0x45, 0x01, 0x8f, - 0x50, 0xe6, 0x6b, 0x93, 0xf5, 0xf5, 0x18, 0x35, 0x67, 0xc1, 0x64, 0xb4, 0x5c, 0x5b, 0x5e, 0x1b, - 0x9a, 0x3a, 0xff, 0xcb, 0x07, 0x04, 0x48, 0x77, 0xef, 0x1f, 0xff, 0xce, 0x4e, 0x5a, 0x6c, 0x5a, - 0xfc, 0x3e, 0x36, 0x08, 0x5f, 0xf8, 0xad, 0xd1, 0x19, 0x3d, 0xee, 0x4a, 0xfa, 0x4e, 0x36, 0x40, - 0x55, 0x83, 0x37, 0xc2, 0x39, 0x3d, 0xd9, 0x26, 0x3b, 0x16, 0x85, 0x35, 0xee, 0xfb, 0x34, 0x85, - 0x83, 0x90, 0x35, 0x50, 0x53, 0x2b, 0x9c, 0x13, 0xf8, 0x45, 0x43, 0x9f, 0x77, 0xb8, 0x43, 0xa7, - 0x7f, 0xa8, 0x9f, 0x47, 0x54, 0x48, 0xf8, 0x41, 0xf9, 0x2f, 0xa3, 0xca, 0xca, 0x42, 0x60, 0x0a, - 0x00, 0x00 + 0xd9, 0x48, 0xa4, 0x40, 0x9e, 0x9c, 0x78, 0xae, 0xff, 0xf7, 0x1d, 0x69, 0xe7, 0x57, 0x1b, 0x14, + 0x43, 0x97, 0x2f, 0x51, 0x48, 0x91, 0xef, 0xee, 0xde, 0x7b, 0x77, 0xf2, 0x68, 0x6b, 0xff, 0x64, + 0xef, 0xfc, 0x8f, 0xd3, 0x03, 0x36, 0xc3, 0xba, 0x1a, 0x8f, 0xfc, 0x5f, 0x56, 0x09, 0x3d, 0xcd, + 0x39, 0x68, 0x4e, 0x6b, 0x10, 0x72, 0x3c, 0xaa, 0x01, 0x05, 0x2b, 0x66, 0xc2, 0x3a, 0xc0, 0x9c, + 0x5f, 0x9c, 0xbf, 0xe9, 0xfe, 0xc2, 0x37, 0xbb, 0x9d, 0xc2, 0x68, 0x04, 0x4d, 0xdb, 0x57, 0x4a, + 0xe2, 0x2c, 0x97, 0x30, 0x57, 0x05, 0x74, 0xc3, 0x22, 0x51, 0x5a, 0xa1, 0x12, 0x55, 0xd7, 0x15, + 0xa2, 0x82, 0x7c, 0x37, 0xa9, 0xc5, 0xb5, 0xaa, 0xdb, 0xfa, 0x76, 0xdd, 0x3a, 0xb0, 0x61, 0x21, + 0x26, 0xb4, 0xd6, 0x86, 0xb3, 0x8e, 0x16, 0x35, 0xe4, 0x7c, 0xae, 0xe0, 0xaa, 0x31, 0x16, 0x29, + 0x0a, 0x2a, 0xac, 0x60, 0xfc, 0xe1, 0xe8, 0x60, 0x9f, 0x9d, 0x01, 0xa2, 0xd2, 0x53, 0x37, 0xea, + 0xad, 0x37, 0x47, 0xae, 0xb0, 0xaa, 0xc1, 0x71, 0x67, 0x2e, 0x2c, 0xab, 0x4c, 0xa1, 0x9a, 0x44, + 0xe6, 0xd2, 0x14, 0x6d, 0x4d, 0x09, 0x25, 0xb4, 0x91, 0x6f, 0xed, 0x0e, 0xcb, 0x56, 0x17, 0xa8, + 0x8c, 0x66, 0xd3, 0x43, 0x19, 0x61, 0xbc, 0xb4, 0x80, 0xad, 0xd5, 0x4c, 0xa6, 0x53, 0xc0, 0x83, + 0x0a, 0xfc, 0xd1, 0xd7, 0x8b, 0xf0, 0x6a, 0x75, 0x7b, 0xb4, 0x32, 0x42, 0xfe, 0x76, 0x16, 0x61, + 0x02, 0xf9, 0x56, 0x3f, 0x5e, 0x56, 0x80, 0xcc, 0xe4, 0x32, 0x2d, 0x2c, 0x08, 0x84, 0xcd, 0xa5, + 0x88, 0xaf, 0xa3, 0xf3, 0x78, 0x68, 0x52, 0xe2, 0xe5, 0x15, 0xa2, 0x55, 0x93, 0x16, 0x81, 0x5e, + 0xd8, 0x82, 0x27, 0x18, 0x27, 0x5f, 0xee, 0xe3, 0xa2, 0x01, 0x9e, 0x70, 0x84, 0x6b, 0xec, 0x7d, + 0x12, 0x73, 0x71, 0x03, 0xf0, 0xd5, 0x41, 0xe1, 0x16, 0x9a, 0x20, 0x20, 0x4e, 0x64, 0x3a, 0x31, + 0x72, 0x91, 0x8a, 0xa6, 0x01, 0x2d, 0xf7, 0x66, 0xaa, 0x92, 0x91, 0xf1, 0xe7, 0x85, 0x94, 0x07, + 0x73, 0xca, 0xe2, 0x48, 0x39, 0x62, 0x1f, 0x6c, 0xc4, 0x7d, 0xce, 0x3c, 0x89, 0xe2, 0x7c, 0xbc, + 0x7c, 0x0b, 0xf8, 0x3e, 0x8a, 0x57, 0x8f, 0x9f, 0x03, 0x6b, 0x8d, 0xa5, 0xf4, 0xe8, 0x1c, 0x49, + 0xe7, 0x4c, 0x05, 0x69, 0x65, 0xa6, 0x11, 0x3f, 0xf0, 0xfb, 0x6c, 0x53, 0x3c, 0xb1, 0xcc, 0x4a, + 0x55, 0x41, 0x28, 0x83, 0xb4, 0xb2, 0x54, 0xee, 0xd1, 0x66, 0xdf, 0x94, 0x8c, 0x2e, 0x96, 0x6a, + 0xda, 0x5a, 0x11, 0xd8, 0x5a, 0x97, 0xc1, 0x4a, 0x41, 0x17, 0x64, 0xfa, 0x97, 0x3e, 0xd4, 0x85, + 0xa9, 0x1b, 0x22, 0x0d, 0x58, 0x23, 0xa6, 0xc0, 0xa4, 0x40, 0xb1, 0xc5, 0x29, 0x9f, 0x3b, 0x82, + 0x95, 0x3b, 0xb9, 0xa7, 0x05, 0x6e, 0x6f, 0x73, 0x33, 0xf9, 0x04, 0x05, 0xf2, 0x3c, 0xf7, 0x24, + 0x51, 0x08, 0xda, 0xdb, 0x7a, 0x65, 0xad, 0x58, 0xa4, 0xca, 0x85, 0xe7, 0x43, 0x81, 0xe4, 0x59, + 0x14, 0x2f, 0x4b, 0xc0, 0x62, 0x16, 0x45, 0x24, 0xf4, 0x4b, 0x3e, 0x43, 0x6c, 0xb2, 0x5e, 0x8f, + 0x3f, 0x0f, 0x3e, 0xc8, 0x38, 0x8f, 0x9f, 0xf3, 0x5e, 0x51, 0x4e, 0xd3, 0x4f, 0xce, 0x68, 0x9e, + 0x2c, 0xc9, 0xac, 0x33, 0x23, 0x33, 0x4e, 0xaa, 0xf3, 0x55, 0x9c, 0xe2, 0x0c, 0x74, 0x44, 0x1c, + 0x44, 0x98, 0x9a, 0xcb, 0xcf, 0x9f, 0x23, 0x6f, 0x0e, 0x5e, 0x91, 0x1d, 0x2d, 0x8f, 0x53, 0x87, + 0x0b, 0x62, 0x45, 0x2a, 0xd7, 0x54, 0x62, 0x91, 0x73, 0xa5, 0x2b, 0xa5, 0x81, 0x64, 0xc2, 0x00, + 0x16, 0xc5, 0xf1, 0xdd, 0xfd, 0xa5, 0x2a, 0xa3, 0xb6, 0xde, 0x2b, 0xa7, 0x39, 0xa6, 0x6d, 0x9d, + 0xb4, 0xd6, 0x5c, 0xb9, 0x9c, 0xf3, 0xc4, 0x17, 0x18, 0xf6, 0xe3, 0xb8, 0x34, 0x36, 0xf2, 0x4c, + 0xe3, 0x9f, 0xe4, 0xa7, 0xbf, 0xa9, 0xb4, 0x93, 0x50, 0x6a, 0x4a, 0xaa, 0x58, 0x05, 0xee, 0xe6, + 0x58, 0xb8, 0xfa, 0x3c, 0xff, 0x38, 0x22, 0x0b, 0x20, 0x95, 0xe8, 0x79, 0xc8, 0xb9, 0x6b, 0x27, + 0xb5, 0x42, 0x4e, 0xba, 0x14, 0x95, 0x2a, 0x2e, 0x7d, 0x97, 0x69, 0x69, 0xae, 0x48, 0xb2, 0x22, + 0x90, 0x9f, 0xef, 0xa4, 0x3d, 0xb7, 0x69, 0x8b, 0x5e, 0x5b, 0xbf, 0x6c, 0xeb, 0xfc, 0x87, 0x25, + 0xae, 0x76, 0xf8, 0xd8, 0x3f, 0x58, 0x74, 0x71, 0x1c, 0x8f, 0x7a, 0x6b, 0xc4, 0xf1, 0xc7, 0x61, + 0xa8, 0x72, 0x2d, 0xde, 0x31, 0xe8, 0x96, 0x4a, 0x55, 0x9a, 0x4c, 0xf1, 0xee, 0xfc, 0xf8, 0x28, + 0x0f, 0xf1, 0x93, 0x8d, 0xf3, 0xbf, 0xc1, 0xe9, 0x6d, 0x34, 0x47, 0x6c, 0xbc, 0x6c, 0xf2, 0x3e, + 0x4f, 0xb6, 0x76, 0x49, 0xdc, 0x94, 0x12, 0x22, 0x35, 0x3c, 0x27, 0xff, 0x81, 0xcc, 0xe4, 0xbe, + 0xf7, 0xf0, 0x81, 0x37, 0xbc, 0xb2, 0xdc, 0x9b, 0x2f, 0x23, 0x37, 0x7c, 0x51, 0x6e, 0xda, 0x58, + 0x83, 0xa6, 0x30, 0xd5, 0xf6, 0x76, 0x14, 0xfa, 0xbb, 0x9f, 0x44, 0x21, 0xb9, 0xdc, 0x9f, 0xa8, + 0xce, 0xd0, 0x58, 0x72, 0x9c, 0x6f, 0xed, 0x43, 0x84, 0xda, 0x37, 0x45, 0x71, 0xd8, 0xf0, 0x38, + 0x26, 0x85, 0xd7, 0xc7, 0xe8, 0x7e, 0xdd, 0x90, 0x99, 0xdf, 0x10, 0x3e, 0x3b, 0x36, 0x12, 0x52, + 0x76, 0x5a, 0x81, 0x70, 0xc0, 0x48, 0x0e, 0xb0, 0x2c, 0xcc, 0x99, 0xc3, 0x53, 0xb2, 0x6b, 0xf2, + 0x00, 0xd1, 0x3d, 0x44, 0x4c, 0x02, 0x1a, 0x19, 0x21, 0x09, 0x4e, 0x5c, 0x75, 0x46, 0xbd, 0xcd, + 0x2c, 0x1a, 0x85, 0x7a, 0xc7, 0x1d, 0xdf, 0xb6, 0x4b, 0xdf, 0xe9, 0x5d, 0x51, 0xa9, 0xa9, 0xce, + 0x8a, 0x80, 0x3f, 0x9c, 0x88, 0xe2, 0x72, 0x6a, 0x4d, 0xab, 0x65, 0xf6, 0x6c, 0x30, 0x18, 0x0c, + 0x67, 0xa0, 0xa6, 0x33, 0xcc, 0x76, 0xfb, 0xfd, 0xe6, 0x7a, 0x58, 0x0b, 0x3b, 0x55, 0x3a, 0xeb, + 0xaf, 0xfc, 0x14, 0x5e, 0x76, 0xbb, 0xb3, 0xec, 0xd7, 0xf9, 0x6c, 0xb5, 0x56, 0x6f, 0x79, 0xff, + 0xe6, 0x8b, 0x17, 0x2f, 0x86, 0x44, 0x82, 0xb1, 0xd9, 0xb3, 0xb2, 0x2c, 0x87, 0x25, 0x8d, 0xe0, + 0x6e, 0x29, 0x6a, 0x55, 0x2d, 0xb2, 0xf7, 0x60, 0xa5, 0xd0, 0x22, 0x79, 0x07, 0xd5, 0x1c, 0x50, + 0x15, 0x22, 0x71, 0x42, 0xbb, 0x2e, 0x89, 0xa1, 0xca, 0xe1, 0x46, 0x85, 0x6c, 0x42, 0xe9, 0x5f, + 0x0e, 0x27, 0xc6, 0x4a, 0xb0, 0xd9, 0x6e, 0x73, 0xcd, 0x48, 0x0a, 0x25, 0x59, 0xc0, 0x5d, 0xef, + 0x76, 0x2d, 0x35, 0x7b, 0xeb, 0x32, 0x9a, 0xac, 0x11, 0x25, 0x12, 0xaf, 0x63, 0x38, 0xf5, 0x0f, + 0x64, 0x3f, 0xcf, 0x6b, 0xa5, 0x87, 0x61, 0xc0, 0x67, 0xc4, 0x50, 0x11, 0x51, 0xf2, 0x3f, 0xb2, + 0x2e, 0xfb, 0x89, 0x4a, 0x88, 0x6f, 0x6a, 0x18, 0xcc, 0x67, 0x4c, 0xb4, 0x68, 0x58, 0x7f, 0x58, + 0xb4, 0xd6, 0x51, 0xa6, 0x8d, 0x51, 0x9e, 0x81, 0x40, 0x55, 0xa0, 0x68, 0xd4, 0x5b, 0x7f, 0x5c, + 0x3c, 0x53, 0xe4, 0x6f, 0xef, 0xbc, 0x9c, 0x13, 0x99, 0x34, 0xf3, 0x1f, 0x6d, 0x01, 0x45, 0xaf, + 0x27, 0xf4, 0x85, 0xb8, 0x69, 0x85, 0x9d, 0x2f, 0x5b, 0x81, 0xf7, 0xf8, 0xce, 0xf8, 0x35, 0xd1, + 0x74, 0xeb, 0x78, 0xf6, 0x38, 0xd2, 0x37, 0x20, 0xee, 0x75, 0xd3, 0x95, 0x2a, 0x15, 0x01, 0x7e, + 0x50, 0x6f, 0x94, 0xff, 0xf2, 0xb4, 0xcd, 0xd7, 0xb0, 0x9d, 0xc7, 0x9b, 0xf4, 0x9b, 0xb0, 0x34, + 0x23, 0x1d, 0xc1, 0x7a, 0x9f, 0x9d, 0x5a, 0x28, 0xc1, 0x82, 0x2e, 0xc0, 0x75, 0xbe, 0x06, 0xf7, + 0xf5, 0x0e, 0xe4, 0x04, 0x35, 0x67, 0x81, 0xb0, 0x9c, 0xdf, 0xc8, 0xa7, 0x0d, 0x75, 0xd0, 0x77, + 0xd5, 0x34, 0xd8, 0xa7, 0xd0, 0x83, 0x7d, 0xb6, 0x77, 0x7f, 0x80, 0xdf, 0x86, 0x1e, 0x49, 0x35, + 0x67, 0x1d, 0x1f, 0xf7, 0xde, 0x8c, 0x18, 0x6f, 0xe6, 0x7e, 0x9a, 0xa6, 0xa3, 0x1e, 0x1d, 0x18, + 0xff, 0x1f, 0x4e, 0xdb, 0x9a, 0xe2, 0x5f, 0x90, 0x19, 0x6b, 0x23, 0x1d, 0x8b, 0x1a, 0xa5, 0x5d, + 0xfc, 0x34, 0xb4, 0xb6, 0x6a, 0x83, 0xcc, 0x0e, 0xbd, 0xcd, 0x4a, 0x51, 0xc0, 0x1d, 0x70, 0xe7, + 0x3e, 0xa7, 0xb2, 0xbe, 0x7e, 0x5a, 0x52, 0x09, 0x90, 0x62, 0xef, 0x1f, 0xff, 0xce, 0x4e, 0x5a, + 0x6c, 0x5a, 0x7c, 0x9a, 0x82, 0xc2, 0x4f, 0x80, 0x9d, 0xf1, 0x19, 0x3d, 0xee, 0x4a, 0x7a, 0xcc, + 0x27, 0xdf, 0x81, 0x8d, 0xaa, 0x06, 0xc2, 0xee, 0x9c, 0xd3, 0x93, 0x6d, 0xb3, 0x63, 0x51, 0x58, + 0xe3, 0x9e, 0xa6, 0x6b, 0x1c, 0x84, 0xac, 0x81, 0xba, 0x5e, 0xe1, 0x82, 0xc0, 0x2f, 0x1a, 0xfa, + 0xfe, 0xc3, 0x1d, 0x3a, 0xfd, 0x43, 0x0d, 0x3f, 0xa6, 0x42, 0xc2, 0x2f, 0xce, 0x7f, 0x01, 0x1b, + 0xc3, 0x83, 0xbe, 0x81, 0x0a, 0x00, 0x00 }; @@ -1078,223 +1078,227 @@ const uint8_t PAGE_settings_ui[] PROGMEM = { // Autogenerated from wled00/data/settings_sync.htm, do not edit!! -const uint16_t PAGE_settings_sync_length = 3429; +const uint16_t PAGE_settings_sync_length = 3489; const uint8_t PAGE_settings_sync[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x1a, 0x6b, 0x73, 0xe2, 0x38, - 0xf2, 0xbb, 0x7f, 0x85, 0xc6, 0x5b, 0x35, 0x07, 0x1b, 0xc2, 0x23, 0x84, 0x4c, 0x26, 0xc1, 0x9e, - 0x0b, 0x21, 0x93, 0x70, 0x9b, 0x07, 0x03, 0xc9, 0x3e, 0xaa, 0xae, 0x6a, 0x4b, 0xd8, 0x02, 0x9c, - 0xd8, 0x96, 0xd7, 0x92, 0xf3, 0xa8, 0xd9, 0xf9, 0xef, 0xd7, 0x2d, 0xd9, 0x06, 0xcc, 0x33, 0x57, - 0xfb, 0x21, 0x8e, 0x2d, 0x77, 0xb7, 0x5a, 0xfd, 0xee, 0x36, 0xed, 0x0f, 0xdd, 0xbb, 0xf3, 0xfb, - 0x3f, 0xfa, 0x17, 0x64, 0x2a, 0x03, 0xdf, 0x6e, 0xe3, 0x95, 0xf8, 0x34, 0x9c, 0x58, 0x26, 0x0b, - 0x4d, 0x78, 0x66, 0xd4, 0xb5, 0xdb, 0x01, 0x93, 0x94, 0x84, 0x34, 0x60, 0x96, 0xf9, 0xec, 0xb1, - 0x97, 0x88, 0xc7, 0xd2, 0x24, 0x0e, 0x0f, 0x25, 0x0b, 0xa5, 0x65, 0xbe, 0x78, 0xae, 0x9c, 0x5a, - 0xad, 0x7a, 0xdd, 0xb4, 0x0d, 0x0d, 0x6a, 0x14, 0xde, 0xb9, 0xec, 0xd9, 0x73, 0xd8, 0xbe, 0x7a, - 0xa8, 0x78, 0xa1, 0x27, 0x3d, 0xea, 0xef, 0x0b, 0x87, 0xfa, 0xcc, 0x6a, 0x54, 0x02, 0xfa, 0xea, - 0x05, 0x49, 0x90, 0x3f, 0x27, 0x82, 0xc5, 0xea, 0x81, 0x8e, 0xe0, 0x39, 0xe4, 0x26, 0x31, 0x0a, - 0x5b, 0xa7, 0x0c, 0x39, 0x53, 0x1a, 0x0b, 0x06, 0x9b, 0x24, 0x72, 0xbc, 0x7f, 0x0c, 0xab, 0xd2, - 0x93, 0x3e, 0xb3, 0x87, 0x6f, 0xa1, 0x43, 0x86, 0x4c, 0x4a, 0x2f, 0x9c, 0x88, 0x76, 0x4d, 0x2f, - 0xb6, 0x85, 0x13, 0x7b, 0x91, 0xb4, 0x8d, 0x67, 0x1a, 0x13, 0x9f, 0x3b, 0x5e, 0x54, 0x71, 0x2d, - 0x97, 0x3b, 0x49, 0x00, 0x6c, 0x56, 0x60, 0xc1, 0xfa, 0xd0, 0x38, 0x1d, 0x27, 0xa1, 0x23, 0x3d, - 0x1e, 0x92, 0x49, 0xcf, 0x2d, 0xb1, 0xf2, 0xf7, 0x98, 0xc9, 0x24, 0x0e, 0x89, 0x5b, 0x9d, 0x30, - 0x79, 0xe1, 0x33, 0x04, 0xed, 0xbc, 0xa9, 0x57, 0x3f, 0x72, 0x50, 0xc9, 0x27, 0x13, 0x9f, 0x21, - 0xb4, 0x46, 0xaa, 0x3a, 0x3e, 0x15, 0xe2, 0xda, 0x13, 0xb2, 0x9a, 0xbe, 0x32, 0xa7, 0x9e, 0xcb, - 0xcc, 0x72, 0x05, 0xdf, 0x9b, 0xb7, 0xdc, 0xdc, 0xdb, 0x00, 0x34, 0xa3, 0x8b, 0xcf, 0xb7, 0xbc, - 0x7b, 0xf3, 0x7b, 0x49, 0x53, 0x36, 0xdd, 0xe0, 0xf5, 0x2e, 0xbc, 0x1b, 0x8f, 0x0f, 0xcc, 0x72, - 0x55, 0xc8, 0x37, 0x9f, 0x55, 0x5d, 0x4f, 0x44, 0x3e, 0x7d, 0xb3, 0xcc, 0x90, 0x87, 0xcc, 0x2c, - 0xa2, 0x5e, 0xdf, 0xe5, 0xa8, 0x3e, 0xdf, 0x15, 0xf5, 0x0a, 0x50, 0x5e, 0xbc, 0xd0, 0xe5, 0x2f, - 0x55, 0x1e, 0xb1, 0x10, 0xd8, 0x92, 0x32, 0x12, 0x27, 0xb5, 0x5a, 0x10, 0x54, 0x9f, 0x42, 0x5e, - 0x7d, 0xf1, 0x19, 0x4a, 0xa3, 0xe6, 0x81, 0x7a, 0xe3, 0x31, 0x75, 0x98, 0xa8, 0x25, 0x6e, 0xb4, - 0x1f, 0x72, 0xe9, 0x8d, 0x3d, 0x16, 0xd7, 0xe6, 0x4f, 0xd0, 0x29, 0xd2, 0xaa, 0x89, 0x54, 0x29, - 0x66, 0xc5, 0xfc, 0x53, 0x30, 0x7f, 0x3c, 0x0f, 0x4d, 0xdd, 0x47, 0x80, 0x3f, 0x3a, 0x6c, 0x1d, - 0x5a, 0x96, 0x5b, 0x1d, 0x8e, 0xab, 0xdd, 0x5e, 0xf5, 0x99, 0xfa, 0x09, 0xfb, 0xd2, 0x48, 0x17, - 0x2e, 0x1e, 0xf4, 0xc2, 0xc7, 0x8f, 0xa5, 0x85, 0x67, 0xab, 0x5e, 0x3e, 0x69, 0xb5, 0x8e, 0x8e, - 0x0b, 0x78, 0x00, 0x56, 0xcf, 0x96, 0xce, 0x16, 0x31, 0xb3, 0x67, 0xab, 0x51, 0xae, 0xd4, 0xb7, - 0x51, 0x6f, 0x94, 0xe7, 0xb8, 0xf4, 0x39, 0x75, 0xff, 0x33, 0x2c, 0xb1, 0x8a, 0xb4, 0x3e, 0xd4, - 0xcb, 0xdf, 0x7d, 0x26, 0x09, 0x07, 0x7c, 0x27, 0x66, 0x54, 0xb2, 0xd4, 0x44, 0x4a, 0xa6, 0xb6, - 0x35, 0xb3, 0x7c, 0xca, 0xab, 0x70, 0xe4, 0x33, 0x29, 0x63, 0x6f, 0x94, 0x48, 0x50, 0xb2, 0x88, - 0x1d, 0xb3, 0xc2, 0xca, 0x95, 0xe2, 0xba, 0x7c, 0x8b, 0x18, 0x08, 0x45, 0xb2, 0x57, 0x59, 0x7b, - 0xa4, 0xcf, 0x34, 0x23, 0xb0, 0x04, 0x48, 0x05, 0x18, 0xb7, 0x59, 0x91, 0xe5, 0x8a, 0x5b, 0x1d, - 0x71, 0xf7, 0xad, 0x4a, 0x23, 0x10, 0xad, 0x7b, 0x3e, 0xf5, 0x7c, 0xb7, 0xc4, 0x11, 0x9e, 0xba, - 0xee, 0xc5, 0x33, 0x70, 0x81, 0xc6, 0xc5, 0x42, 0x16, 0xa3, 0xf6, 0xa9, 0x6b, 0x56, 0x4a, 0x65, - 0xcb, 0xfe, 0x7e, 0xc9, 0xe4, 0xaf, 0xa5, 0x72, 0x05, 0x9c, 0xe3, 0x57, 0xea, 0x97, 0xca, 0x3f, - 0x56, 0x23, 0xb0, 0x38, 0xe6, 0x31, 0xf0, 0x09, 0x08, 0xe0, 0xc7, 0x82, 0x83, 0xbd, 0xf8, 0x7c, - 0x52, 0x32, 0x2f, 0x70, 0x9d, 0xa4, 0x52, 0x00, 0x3d, 0x92, 0xb1, 0xe7, 0x33, 0x75, 0x1e, 0x70, - 0xdc, 0x18, 0xce, 0x7d, 0x9d, 0xae, 0xf3, 0x31, 0x06, 0x87, 0xb1, 0x37, 0x49, 0x62, 0xaa, 0xc4, - 0xa6, 0xcf, 0x43, 0xc6, 0xd4, 0x43, 0xfb, 0xf9, 0x6f, 0xd8, 0x0b, 0x1d, 0x1e, 0x44, 0x20, 0x3d, - 0x46, 0x22, 0x3a, 0x61, 0xc4, 0xa5, 0x92, 0x7e, 0x00, 0x6b, 0x98, 0x93, 0xf4, 0xd7, 0x73, 0x30, - 0x87, 0x31, 0x8f, 0x4b, 0x8f, 0x56, 0xfd, 0xf4, 0xb1, 0x7d, 0x7c, 0xfa, 0xb8, 0xb7, 0x57, 0x56, - 0xd6, 0x7c, 0x69, 0xee, 0x95, 0x1e, 0xf7, 0x40, 0x2d, 0x55, 0x67, 0xca, 0x9c, 0x27, 0xe6, 0x5a, - 0x7a, 0x79, 0x08, 0xd6, 0xad, 0x54, 0x66, 0xdb, 0x8f, 0x1f, 0x1b, 0xda, 0xdd, 0x06, 0x6b, 0x60, - 0x07, 0x0b, 0xb0, 0xb3, 0x5d, 0x2f, 0x71, 0x57, 0x0c, 0x11, 0x60, 0x55, 0xa0, 0xe3, 0x7a, 0x85, - 0x5b, 0x10, 0x16, 0x0a, 0x5c, 0xb0, 0x3d, 0x6b, 0x35, 0x23, 0x3f, 0xf3, 0x8a, 0x4c, 0xdf, 0x0d, - 0x56, 0xbc, 0xe3, 0x3f, 0x5b, 0x07, 0xa7, 0x05, 0x5e, 0x2d, 0x56, 0x29, 0x70, 0x64, 0xc9, 0x19, - 0x3b, 0xc3, 0x7e, 0xce, 0xce, 0x82, 0x6d, 0x6b, 0x2a, 0xaf, 0xd1, 0x92, 0x3f, 0x33, 0xbb, 0xfe, - 0x45, 0xfb, 0xf4, 0x89, 0x39, 0x82, 0xa8, 0xf6, 0x04, 0xea, 0xb1, 0xeb, 0xb9, 0x4d, 0xf7, 0xb3, - 0x4d, 0xe7, 0x04, 0x9d, 0x19, 0xc3, 0x77, 0xf1, 0xe2, 0x49, 0x67, 0x5a, 0x8a, 0x30, 0xa8, 0xf6, - 0xc0, 0x8c, 0x17, 0x50, 0xca, 0xe5, 0xef, 0x0e, 0x15, 0x8c, 0xa0, 0xa3, 0x9d, 0x2c, 0xf0, 0x62, - 0xe1, 0xd2, 0xe9, 0x08, 0x3c, 0xe0, 0xe9, 0x54, 0x81, 0xa0, 0x0f, 0x17, 0x40, 0x70, 0x69, 0x1e, - 0xe4, 0xb0, 0x7e, 0x58, 0xa4, 0x82, 0x4b, 0x3f, 0xf0, 0xbc, 0x15, 0xd4, 0xfc, 0x1c, 0x7b, 0xc0, - 0x99, 0x89, 0x86, 0x76, 0x62, 0x5a, 0x56, 0x1a, 0x4e, 0xe0, 0x60, 0xca, 0xae, 0xaa, 0x51, 0xcc, - 0x25, 0x77, 0xb8, 0x0f, 0x07, 0x54, 0x21, 0xbc, 0x5e, 0x29, 0xa9, 0xd8, 0x6e, 0x21, 0x84, 0x3f, - 0x94, 0x3c, 0x06, 0xeb, 0xc2, 0xe8, 0xdd, 0x93, 0x2c, 0x40, 0x4f, 0x70, 0x7a, 0x20, 0xb3, 0xf2, - 0xdf, 0x7f, 0xa7, 0x60, 0x80, 0x1f, 0x44, 0x60, 0xb8, 0x5f, 0x81, 0x3e, 0xb9, 0xe1, 0x2e, 0xab, - 0x92, 0xbe, 0xcf, 0x90, 0x43, 0x86, 0x01, 0x8e, 0xfc, 0x76, 0x7d, 0xd1, 0x25, 0xbd, 0x3e, 0x98, - 0x66, 0x65, 0x81, 0xa2, 0x58, 0xa4, 0x58, 0x51, 0xd4, 0xca, 0x65, 0x84, 0x52, 0xf1, 0x01, 0xc9, - 0x7f, 0x51, 0xb1, 0x13, 0x42, 0xa7, 0xb9, 0xa7, 0x5e, 0x9f, 0x98, 0x66, 0x79, 0x6f, 0x16, 0x03, - 0x6b, 0xa2, 0xfa, 0x28, 0xbe, 0x44, 0xd6, 0xa1, 0x59, 0xf9, 0xd0, 0x28, 0xff, 0x30, 0xda, 0xb5, - 0x34, 0x43, 0xb5, 0x95, 0x46, 0xed, 0x7f, 0x7b, 0x01, 0xe6, 0x3a, 0x92, 0xc4, 0x3e, 0xc4, 0x0d, - 0xa5, 0x64, 0x47, 0x08, 0x88, 0x29, 0x00, 0xa8, 0x00, 0xda, 0x35, 0x9d, 0x9b, 0x31, 0x0c, 0x80, - 0x53, 0xe2, 0xce, 0x96, 0x09, 0xd2, 0x82, 0x3c, 0x08, 0x06, 0x1b, 0x18, 0xc4, 0x83, 0x67, 0xbc, - 0xfb, 0x53, 0x98, 0x69, 0xee, 0x1e, 0x8e, 0x4d, 0x02, 0x99, 0x73, 0xca, 0xe1, 0x4d, 0xc4, 0x05, - 0xe4, 0x70, 0x70, 0xef, 0x64, 0x14, 0x78, 0x90, 0x43, 0xd1, 0xf2, 0x01, 0xd5, 0xf5, 0x9e, 0x89, - 0x4a, 0x4e, 0x96, 0x29, 0x39, 0x88, 0xe7, 0x25, 0x5d, 0x33, 0xd2, 0xc5, 0x29, 0xf3, 0xa3, 0x0e, - 0xac, 0x41, 0x38, 0x92, 0x98, 0xfd, 0x20, 0x70, 0x59, 0xa6, 0x7e, 0x40, 0x6a, 0x8e, 0xef, 0x39, - 0x4f, 0x96, 0x79, 0x85, 0xb4, 0xbe, 0xb4, 0x6b, 0xfa, 0x05, 0xb0, 0x0a, 0x24, 0x72, 0x1c, 0x63, - 0x0d, 0x52, 0x07, 0x91, 0x3a, 0xd4, 0x79, 0x9a, 0xe1, 0x2d, 0xec, 0xa2, 0x39, 0x35, 0xed, 0x21, - 0x7d, 0x66, 0x33, 0x90, 0x69, 0x0c, 0x45, 0x87, 0xa6, 0x3f, 0x3d, 0xd0, 0xb9, 0x1f, 0x44, 0x9c, - 0x44, 0x20, 0x9e, 0x03, 0x58, 0x6a, 0xda, 0x4a, 0x87, 0x9d, 0x18, 0xc4, 0x03, 0xa6, 0x27, 0x61, - 0xb9, 0x69, 0x3f, 0x74, 0xfb, 0xa4, 0x0f, 0xc2, 0x3d, 0x21, 0x6d, 0x2f, 0x8c, 0x12, 0x99, 0x8a, - 0xe7, 0xa1, 0x6f, 0x66, 0xcc, 0x85, 0x49, 0x30, 0x62, 0x31, 0x48, 0xcb, 0x0b, 0x2d, 0xb3, 0x01, - 0xff, 0xe9, 0xab, 0x65, 0x1e, 0xb5, 0x5a, 0xcd, 0x96, 0x99, 0x89, 0xc7, 0x85, 0xdb, 0x98, 0xfd, - 0x95, 0x78, 0x31, 0x43, 0x2d, 0xc4, 0xf6, 0x41, 0xe8, 0x2e, 0x52, 0x4d, 0xcb, 0x96, 0x87, 0x03, - 0x93, 0xfc, 0xff, 0x54, 0xf1, 0x08, 0x86, 0x3a, 0xd6, 0x24, 0xe6, 0x49, 0x24, 0xd4, 0x01, 0x16, - 0xd8, 0x86, 0x60, 0xa2, 0x74, 0x8d, 0xff, 0x17, 0xf7, 0x51, 0x86, 0x02, 0x34, 0x75, 0x70, 0x38, - 0x51, 0x71, 0xc1, 0x26, 0xc6, 0x22, 0xf6, 0x20, 0xc5, 0x1e, 0xec, 0x84, 0xdd, 0x96, 0x58, 0x95, - 0x11, 0x23, 0x7d, 0x19, 0xd0, 0x78, 0xe2, 0x85, 0x27, 0x75, 0x42, 0x13, 0xc9, 0xf1, 0x2d, 0x30, - 0x2c, 0x81, 0xf1, 0x1a, 0x5e, 0xe0, 0xaf, 0x91, 0xdf, 0x1d, 0xe4, 0x77, 0xcd, 0xfc, 0xee, 0x30, - 0xbf, 0x6b, 0x19, 0xf9, 0xed, 0x51, 0x7e, 0xf7, 0x29, 0xbf, 0x3b, 0xd6, 0x77, 0x35, 0x45, 0x5e, - 0x6f, 0x31, 0x84, 0xb4, 0x77, 0x92, 0x03, 0x64, 0x12, 0xd7, 0x27, 0x50, 0x21, 0x77, 0xc4, 0x5f, - 0xd3, 0x93, 0x35, 0x32, 0xfb, 0x87, 0x3b, 0xbb, 0x88, 0xb2, 0x12, 0xe3, 0x20, 0xaf, 0x39, 0xe1, - 0x76, 0x37, 0x94, 0x66, 0xbe, 0x49, 0x73, 0x19, 0x63, 0x35, 0x5f, 0x87, 0x39, 0xca, 0xe1, 0x8e, - 0x9b, 0xb4, 0x66, 0x7c, 0xb5, 0x76, 0x44, 0x39, 0xca, 0x37, 0x39, 0xda, 0x95, 0xaf, 0x4f, 0x39, - 0xca, 0xa7, 0x1d, 0x37, 0x39, 0x9e, 0xf1, 0x75, 0x9c, 0xa1, 0xcc, 0x2b, 0x6b, 0xc0, 0x1c, 0xe6, - 0x3d, 0xb3, 0x93, 0x5d, 0x88, 0x0d, 0x1a, 0x39, 0xb1, 0xc1, 0x8e, 0xfa, 0x1a, 0x1c, 0x64, 0x1c, - 0x0f, 0x0e, 0x76, 0x3c, 0xe4, 0x20, 0xd7, 0xd7, 0xa0, 0xb9, 0xe3, 0x26, 0x87, 0x33, 0xbe, 0x76, - 0xd4, 0xd7, 0xa0, 0x95, 0x6f, 0xd2, 0xda, 0x95, 0xaf, 0x5c, 0x5f, 0x83, 0xa3, 0x1d, 0x37, 0xf9, - 0x34, 0xe3, 0x6b, 0x47, 0x7d, 0x0d, 0x8e, 0xf3, 0x4d, 0x16, 0xd5, 0x55, 0x53, 0xde, 0x0d, 0x01, - 0x15, 0x02, 0x4f, 0xae, 0xb3, 0x90, 0xbf, 0xc4, 0x34, 0x5a, 0x47, 0x2f, 0xa5, 0x03, 0x39, 0xa1, - 0x13, 0x7b, 0x93, 0xa9, 0x0c, 0x99, 0x10, 0x95, 0x76, 0x2d, 0x45, 0x32, 0x76, 0xc3, 0x3e, 0x37, - 0xed, 0x73, 0xee, 0xf3, 0x78, 0x86, 0x98, 0xe1, 0x51, 0x08, 0xaa, 0xeb, 0xe4, 0x95, 0x22, 0xff, - 0x6e, 0xda, 0x17, 0xe3, 0x31, 0x73, 0xa4, 0x98, 0x61, 0x63, 0xe0, 0xdc, 0xb4, 0xe3, 0xf0, 0x0e, - 0x7a, 0x55, 0x28, 0x7d, 0x26, 0x58, 0xb0, 0x13, 0x1e, 0x61, 0x35, 0x21, 0x2a, 0x64, 0x33, 0xce, - 0x25, 0x04, 0xcf, 0x11, 0x4f, 0x42, 0x57, 0x20, 0x7d, 0x03, 0x23, 0x10, 0xd1, 0x9d, 0x8f, 0x2e, - 0x47, 0x04, 0xd6, 0xc6, 0x2e, 0x44, 0x6e, 0x47, 0x62, 0x6f, 0x1a, 0x4e, 0xd8, 0xc9, 0x16, 0x8a, - 0x5d, 0xd3, 0xde, 0x40, 0x2a, 0xcd, 0x7e, 0x51, 0x0c, 0x22, 0x25, 0x50, 0x79, 0xf7, 0x06, 0xdb, - 0xe8, 0x75, 0xe6, 0xe9, 0x9d, 0xf9, 0xec, 0x95, 0x2e, 0x52, 0xdd, 0x86, 0x7f, 0x36, 0x8f, 0xdf, - 0x87, 0xa6, 0xc2, 0x8b, 0x04, 0xb9, 0x4a, 0x58, 0x7a, 0x9c, 0xf7, 0x11, 0xbb, 0x9a, 0x27, 0x76, - 0x43, 0x9d, 0x98, 0xbf, 0x0f, 0xff, 0x26, 0xc5, 0xc7, 0x6c, 0x1d, 0x41, 0x59, 0x00, 0xbd, 0x16, - 0x34, 0xe4, 0x31, 0x0d, 0x45, 0xe0, 0x09, 0xb1, 0x40, 0x21, 0x4d, 0xb4, 0x83, 0x95, 0x89, 0xb6, - 0x9e, 0x26, 0xda, 0x26, 0xdc, 0x18, 0x6b, 0xd3, 0xac, 0xb2, 0x18, 0x30, 0xfa, 0x11, 0xe7, 0x32, - 0x7f, 0x05, 0xdd, 0x3d, 0x81, 0x0e, 0xcb, 0x7f, 0x4b, 0x05, 0x20, 0xaa, 0xed, 0x9a, 0x87, 0x35, - 0x47, 0x4e, 0x48, 0x04, 0xbe, 0xa9, 0x72, 0x74, 0x2f, 0x14, 0x92, 0x86, 0x0e, 0x23, 0xd8, 0x47, - 0xa9, 0x24, 0x7d, 0x11, 0xaa, 0x54, 0xe9, 0x65, 0x2f, 0x7c, 0x78, 0xb1, 0xf6, 0xcc, 0xa9, 0x07, - 0xdf, 0x5e, 0xeb, 0x43, 0xdf, 0xd0, 0x27, 0x46, 0xe4, 0xd4, 0x13, 0x33, 0x74, 0xc8, 0xc3, 0x0e, - 0x7f, 0x66, 0x31, 0x12, 0xdd, 0x22, 0xba, 0xdb, 0x0e, 0x4e, 0x62, 0x80, 0xcb, 0x22, 0x93, 0x03, - 0x46, 0x7d, 0xe9, 0x05, 0x4c, 0xf1, 0x97, 0x3a, 0x38, 0x41, 0xf9, 0xc6, 0xe9, 0x8b, 0x6d, 0xfc, - 0x0d, 0x52, 0x8b, 0x7d, 0x80, 0x12, 0x39, 0xa0, 0x1e, 0x74, 0x76, 0x99, 0x0b, 0x85, 0xfe, 0xdb, - 0x16, 0xae, 0x6e, 0xee, 0xcc, 0x5c, 0xd4, 0x50, 0x83, 0xd8, 0xb7, 0x4c, 0xbe, 0xf0, 0xf8, 0x89, - 0x74, 0x6f, 0x7e, 0x27, 0x0a, 0x4f, 0xc9, 0x16, 0x5e, 0xde, 0x03, 0x3a, 0xd0, 0x12, 0xcc, 0x47, - 0x4f, 0xd2, 0xc8, 0xdd, 0x9e, 0xaa, 0x14, 0x95, 0x16, 0xc0, 0x36, 0xb0, 0x4f, 0x50, 0x13, 0x03, - 0x3c, 0xa8, 0x76, 0x5f, 0xa2, 0xfb, 0x08, 0x13, 0xdb, 0x11, 0x88, 0x08, 0x8d, 0x6a, 0xb3, 0x41, - 0x4a, 0xe2, 0xec, 0xfc, 0xb6, 0xdc, 0xae, 0x69, 0x08, 0xbb, 0x00, 0x89, 0x5d, 0x89, 0x69, 0x9f, - 0xc5, 0x72, 0x1f, 0x58, 0xc9, 0x81, 0x8a, 0xf4, 0xc0, 0x6a, 0x34, 0x27, 0xd0, 0x3c, 0x9a, 0xd9, - 0x1d, 0xc4, 0xab, 0x44, 0x48, 0x1e, 0x10, 0xac, 0xd1, 0x67, 0xf4, 0x6b, 0xfa, 0xbd, 0x3e, 0xa6, - 0x2a, 0x9b, 0x31, 0xdc, 0x42, 0x9f, 0x66, 0xaf, 0x28, 0x37, 0x2f, 0xfa, 0xbb, 0xd4, 0x85, 0xf3, - 0xa7, 0xda, 0x60, 0xbe, 0xaa, 0x02, 0xbe, 0x49, 0x40, 0x89, 0x58, 0xe5, 0x6e, 0xd1, 0xc4, 0x45, - 0xe6, 0x5a, 0x43, 0x49, 0xb1, 0xc5, 0x08, 0xc1, 0x0c, 0xa0, 0xe9, 0x2b, 0xf2, 0xf7, 0xb0, 0xd1, - 0x9d, 0x8e, 0x9a, 0x9f, 0x3f, 0x7f, 0x2e, 0xb0, 0x61, 0x2c, 0xbb, 0x90, 0xf2, 0x18, 0x72, 0x8e, - 0x1c, 0x10, 0x0e, 0xb4, 0xdb, 0x94, 0x4c, 0x63, 0x36, 0xb6, 0xf2, 0xc9, 0xd2, 0xc4, 0x93, 0xd3, - 0x64, 0x54, 0x75, 0x78, 0x50, 0xbb, 0x66, 0xee, 0xd7, 0x57, 0x7d, 0xc5, 0x4a, 0x1c, 0x6a, 0x4b, - 0x9c, 0xee, 0xfd, 0x39, 0xf2, 0x69, 0xf8, 0x64, 0xda, 0x6a, 0xbd, 0x5d, 0xa3, 0xf6, 0x07, 0xdc, - 0x6a, 0xf8, 0xe4, 0x45, 0x48, 0x70, 0x9f, 0x8f, 0xf7, 0x05, 0xec, 0xc5, 0xd0, 0x47, 0x74, 0x98, - 0x98, 0xc5, 0x85, 0x35, 0x29, 0xe3, 0x62, 0xa8, 0xcf, 0x8f, 0x96, 0x27, 0x94, 0x08, 0xa8, 0xeb, - 0x62, 0x94, 0x2d, 0x48, 0xa0, 0x7b, 0x56, 0x94, 0x80, 0xb1, 0xa0, 0xa2, 0x56, 0xa3, 0x5e, 0x10, - 0x00, 0x52, 0x0c, 0xa0, 0x8f, 0x5c, 0x32, 0x5f, 0x94, 0x78, 0xd1, 0xae, 0x6c, 0xa3, 0xeb, 0x09, - 0x74, 0x67, 0x77, 0x9d, 0x85, 0x42, 0xfd, 0x33, 0x84, 0x66, 0x11, 0xa2, 0xc8, 0xe0, 0xb2, 0xb3, - 0x0e, 0x08, 0x4a, 0x1e, 0x23, 0x85, 0xea, 0x6e, 0x00, 0x6b, 0x66, 0x69, 0x72, 0x1d, 0x00, 0xf8, - 0x82, 0x32, 0x20, 0xdc, 0xcb, 0x58, 0x07, 0x04, 0x75, 0x4c, 0xd7, 0x0b, 0x02, 0xe8, 0x8d, 0xf7, - 0x48, 0x0e, 0xbd, 0xd6, 0xc1, 0x80, 0xb3, 0x1c, 0xe8, 0xb7, 0x35, 0x6e, 0x42, 0x89, 0xb1, 0x68, - 0x10, 0xeb, 0x47, 0x8d, 0x0c, 0x9d, 0x7a, 0xdf, 0x0d, 0x5e, 0x6b, 0xa0, 0x97, 0x82, 0x75, 0x68, - 0x87, 0xf7, 0xc2, 0x31, 0x37, 0xd0, 0x46, 0x54, 0x1c, 0x81, 0x80, 0x06, 0x16, 0x52, 0x34, 0xeb, - 0xfb, 0x2d, 0x6e, 0x57, 0xaf, 0xcf, 0x6b, 0x95, 0x04, 0x42, 0x95, 0x43, 0x5f, 0x79, 0xec, 0x60, - 0xcc, 0x7b, 0x25, 0xa3, 0xbc, 0xce, 0xd9, 0xe2, 0x66, 0x5f, 0xb3, 0x74, 0x9c, 0xaa, 0x39, 0x8f, - 0xb2, 0x64, 0x42, 0x83, 0x80, 0x12, 0x87, 0xc7, 0x58, 0x2b, 0x80, 0x48, 0xb6, 0x10, 0x1a, 0x5c, - 0xa6, 0x84, 0xb2, 0xf8, 0x4d, 0xb0, 0xa7, 0xe5, 0xe3, 0x31, 0x74, 0xba, 0x85, 0xd3, 0xfd, 0x76, - 0xb7, 0xf2, 0x74, 0xfb, 0x07, 0xad, 0x56, 0x7a, 0x40, 0x75, 0x67, 0xcc, 0xac, 0x16, 0xc3, 0x14, - 0x46, 0xa9, 0xd9, 0x7c, 0x59, 0xeb, 0x85, 0x05, 0x59, 0x07, 0xe8, 0x60, 0x69, 0x76, 0xf2, 0xd3, - 0x78, 0x7c, 0xec, 0xa8, 0x19, 0xff, 0x3d, 0xe6, 0xa5, 0xb1, 0x17, 0x07, 0x2f, 0x34, 0x66, 0x50, - 0xa5, 0x78, 0xbe, 0x4b, 0x5c, 0xce, 0x04, 0xa6, 0x77, 0xd0, 0x80, 0xe3, 0x27, 0x2e, 0x53, 0x51, - 0x1d, 0x84, 0x8f, 0x9c, 0x89, 0x24, 0xc2, 0x30, 0x59, 0xd5, 0x81, 0x8a, 0x05, 0xd9, 0x3c, 0x60, - 0x55, 0x1a, 0xd5, 0x45, 0xcb, 0xaf, 0xdc, 0x03, 0x61, 0x9f, 0x41, 0x96, 0xc7, 0xe4, 0xa7, 0xd3, - 0x69, 0xce, 0xe8, 0x2d, 0x57, 0x40, 0x79, 0xcb, 0xac, 0x26, 0xe7, 0x8a, 0x5f, 0xa3, 0xc0, 0x30, - 0x05, 0x6e, 0x77, 0x62, 0x56, 0xef, 0xba, 0xc4, 0xa7, 0x31, 0x0b, 0xad, 0xf9, 0xee, 0x7a, 0x6f, - 0xfb, 0x22, 0x48, 0x7c, 0x2a, 0x33, 0x4c, 0xfd, 0x7d, 0x63, 0x5b, 0xf2, 0x3c, 0x4b, 0x93, 0xbb, - 0xc6, 0xf1, 0xc2, 0xe7, 0x74, 0x8c, 0xa5, 0x54, 0x57, 0x40, 0xc6, 0x51, 0x70, 0xa6, 0xfe, 0xb3, - 0x1e, 0x06, 0x1e, 0xfa, 0xea, 0xb3, 0x70, 0x22, 0xa7, 0xe0, 0xc9, 0x07, 0x19, 0x1d, 0xc1, 0x09, - 0x4b, 0x19, 0xd1, 0x2c, 0x08, 0xac, 0x58, 0x1c, 0xea, 0xfb, 0x50, 0x3c, 0x30, 0x3c, 0xb6, 0x90, - 0x8b, 0xf6, 0x71, 0xb6, 0x3c, 0xe3, 0xc8, 0x54, 0x50, 0x88, 0xef, 0xf3, 0xb1, 0x5d, 0xd5, 0xa0, - 0x10, 0x58, 0xf3, 0x4a, 0x69, 0x8d, 0x02, 0x51, 0x48, 0x2b, 0x74, 0xf0, 0xf1, 0xa7, 0xcf, 0xc7, - 0xc7, 0xc7, 0xa7, 0xa4, 0x3d, 0xb2, 0x8d, 0x8e, 0xff, 0x16, 0x3e, 0x55, 0xc8, 0xcd, 0xb7, 0xfb, - 0x7b, 0x82, 0xc5, 0x3d, 0x56, 0x97, 0x38, 0xd4, 0x26, 0xc8, 0xb4, 0xc3, 0xc3, 0x10, 0x83, 0x26, - 0x1c, 0x02, 0xce, 0xcf, 0xe2, 0x90, 0xfa, 0x64, 0xca, 0x85, 0x14, 0x2a, 0xe4, 0x6b, 0xc3, 0x0b, - 0xe8, 0x1b, 0xf1, 0x02, 0x88, 0xf4, 0x52, 0x9d, 0x11, 0x18, 0x8b, 0xa0, 0x14, 0x84, 0x0c, 0x16, - 0xaa, 0x32, 0x79, 0xac, 0x86, 0x76, 0x90, 0x75, 0x46, 0x73, 0x9c, 0x1a, 0xe0, 0xbd, 0x64, 0xc4, - 0x04, 0xa6, 0x25, 0x01, 0x01, 0x09, 0x4a, 0x7d, 0x2c, 0x58, 0x48, 0x02, 0x65, 0x0c, 0x0f, 0x19, - 0x62, 0x01, 0x2d, 0x78, 0x10, 0x2c, 0xd6, 0x62, 0xa4, 0x90, 0x13, 0x08, 0xba, 0x9a, 0xb2, 0x06, - 0xa3, 0x04, 0x7e, 0x87, 0xec, 0x48, 0xd8, 0xc7, 0x7f, 0xab, 0xe4, 0x8c, 0x82, 0xd1, 0x30, 0xb8, - 0x77, 0xc9, 0xc5, 0xb0, 0x8f, 0x5c, 0x03, 0x95, 0x40, 0x1d, 0x0b, 0x29, 0x23, 0x7b, 0x58, 0x5c, - 0xe1, 0xf1, 0xca, 0x2b, 0xad, 0x5d, 0x09, 0xa3, 0x68, 0xdd, 0x6a, 0x71, 0x85, 0x75, 0xaf, 0x10, - 0xec, 0x6e, 0xae, 0xa8, 0x08, 0xae, 0xf5, 0xc2, 0xbc, 0x4c, 0xd1, 0xfb, 0xda, 0x57, 0x7c, 0xa9, - 0x7e, 0x98, 0x37, 0xc6, 0xce, 0x95, 0xb2, 0x8f, 0x79, 0x5b, 0x5c, 0x39, 0xf5, 0xea, 0xbc, 0xa7, - 0xba, 0x39, 0xae, 0xcf, 0x0f, 0xc0, 0xd2, 0xa0, 0xa9, 0x0c, 0x9a, 0x9c, 0x25, 0x72, 0x0a, 0x92, - 0x7d, 0x62, 0x61, 0x21, 0xd2, 0x75, 0x7e, 0x59, 0x64, 0xa4, 0x69, 0x66, 0x45, 0xbc, 0x71, 0xee, - 0x33, 0x1a, 0x2b, 0xf1, 0x2b, 0x44, 0x10, 0x10, 0xf3, 0x55, 0x2d, 0xef, 0xea, 0x40, 0x5c, 0x25, - 0xaa, 0xd4, 0x7c, 0x47, 0xe6, 0x19, 0xa1, 0x6c, 0x56, 0x64, 0x9d, 0x21, 0x8e, 0x1a, 0x55, 0xd6, - 0xc1, 0xa4, 0x93, 0x0f, 0x22, 0x9b, 0x36, 0xda, 0x77, 0x51, 0xb1, 0xb8, 0xf6, 0x4f, 0xea, 0x55, - 0xf9, 0xd0, 0x26, 0xb5, 0xe2, 0xb6, 0x6a, 0x53, 0xdb, 0x48, 0x9b, 0x11, 0x7c, 0xda, 0x56, 0xa6, - 0x7f, 0xd3, 0x82, 0xec, 0xc4, 0x20, 0xbb, 0x78, 0xa5, 0x25, 0xa4, 0x2a, 0xbe, 0x19, 0x6e, 0x31, - 0x85, 0x8c, 0x60, 0xff, 0x6e, 0xb0, 0x36, 0xe9, 0x1a, 0xab, 0x87, 0xa0, 0x69, 0xa7, 0x80, 0x92, - 0x48, 0x0f, 0xea, 0x40, 0x20, 0x82, 0x4e, 0xc3, 0xa3, 0x3e, 0x78, 0x67, 0x8c, 0xae, 0x8a, 0x6d, - 0x07, 0x14, 0xae, 0xe0, 0x6f, 0x50, 0xc2, 0x82, 0x1f, 0x26, 0xd8, 0xb1, 0xa5, 0x9e, 0x89, 0x5f, - 0x07, 0x94, 0x19, 0xdd, 0x32, 0x04, 0xc9, 0xdc, 0x51, 0x51, 0x8a, 0x60, 0x13, 0xe8, 0x3c, 0x5c, - 0x32, 0xe6, 0x88, 0xcc, 0xe1, 0x45, 0x9c, 0x79, 0xfe, 0x87, 0x2c, 0x70, 0x40, 0x87, 0x13, 0x2f, - 0xc4, 0x65, 0x63, 0xd9, 0x17, 0x6e, 0xbe, 0x3d, 0x0c, 0x2f, 0x06, 0x0b, 0x42, 0x38, 0xac, 0x6b, - 0xd6, 0xfb, 0xe9, 0x1e, 0x05, 0xf9, 0x65, 0x5b, 0xcf, 0x64, 0xf8, 0xad, 0x7f, 0x36, 0x5c, 0x94, - 0xe3, 0xd1, 0xa1, 0x26, 0x71, 0xee, 0x7b, 0x78, 0xc4, 0x5e, 0x77, 0x83, 0x37, 0xde, 0x7c, 0x3b, - 0xef, 0x75, 0x17, 0xb3, 0x43, 0xc6, 0x41, 0xea, 0x3f, 0xf7, 0x3c, 0xf2, 0x9c, 0x4d, 0x14, 0xba, - 0x4b, 0x4a, 0x54, 0x69, 0xef, 0x12, 0xa7, 0xcd, 0xdb, 0xb1, 0x2f, 0x97, 0xb0, 0x95, 0xd4, 0xfb, - 0xc9, 0x08, 0xda, 0xdd, 0x69, 0x71, 0x8a, 0xb1, 0xc5, 0xf4, 0x3a, 0x37, 0x33, 0x1f, 0xde, 0xda, - 0x89, 0xbf, 0xdb, 0x87, 0x83, 0xbf, 0xa4, 0x5c, 0xe1, 0xc2, 0xca, 0x24, 0x56, 0x78, 0xf0, 0xdc, - 0xf8, 0xa3, 0xe8, 0xc8, 0xb0, 0xf4, 0x4f, 0xfa, 0xf1, 0xfc, 0xa0, 0x65, 0x6b, 0x94, 0xc6, 0xbd, - 0x95, 0x80, 0xfe, 0xe0, 0x09, 0x64, 0x7a, 0x0c, 0x6e, 0x90, 0x6e, 0xd0, 0xb6, 0xa1, 0x2e, 0x75, - 0x27, 0x8c, 0xf4, 0xfa, 0x2a, 0x01, 0xe1, 0x8a, 0x8f, 0x85, 0x2a, 0xd1, 0x1e, 0x07, 0xbb, 0xa9, - 0xb5, 0x7f, 0x9d, 0x8d, 0xa0, 0x2c, 0xfb, 0x17, 0xe6, 0x2d, 0x55, 0x7b, 0xe8, 0xd4, 0x47, 0xa6, - 0xb0, 0x37, 0xc8, 0xb7, 0x6a, 0x64, 0x4d, 0x78, 0x9f, 0x43, 0x3e, 0x46, 0x8e, 0x34, 0x91, 0x05, - 0x8f, 0xbe, 0xba, 0xde, 0x18, 0xdb, 0xa1, 0x2d, 0xb4, 0x09, 0xba, 0xdd, 0x5b, 0xe1, 0x5b, 0xc3, - 0x55, 0x6f, 0x35, 0x5e, 0xbd, 0xbe, 0x50, 0x7c, 0x63, 0xcd, 0xbd, 0xad, 0x85, 0xbb, 0xea, 0x6b, - 0x53, 0x81, 0xf0, 0x10, 0x56, 0xc0, 0x4a, 0xf4, 0x28, 0x63, 0xa3, 0x75, 0x5d, 0xa9, 0x99, 0xdf, - 0x5d, 0x58, 0x83, 0x22, 0x77, 0xcb, 0xa8, 0xef, 0x0a, 0x2a, 0x77, 0x32, 0x37, 0xcf, 0x24, 0xdb, - 0xc7, 0x90, 0x57, 0xe7, 0x80, 0xa2, 0x86, 0x98, 0xc8, 0x16, 0x0a, 0xae, 0x93, 0xe9, 0xe3, 0x64, - 0x6e, 0x1c, 0x99, 0x02, 0xd7, 0x77, 0xad, 0xc2, 0xb0, 0x5a, 0xb7, 0x49, 0xb5, 0x20, 0xff, 0xc6, - 0x52, 0x5f, 0xfa, 0x2e, 0xf4, 0xa5, 0x0f, 0x52, 0xcb, 0xd8, 0xc6, 0x06, 0xf4, 0xe6, 0x76, 0xf4, - 0x19, 0x76, 0x16, 0xc7, 0xfb, 0x6a, 0x8a, 0x89, 0xa6, 0x16, 0x25, 0x62, 0xea, 0x7b, 0x50, 0x91, - 0xa4, 0x91, 0x81, 0x87, 0x73, 0xe6, 0x0b, 0xa2, 0x1e, 0xe3, 0x97, 0x57, 0x39, 0x85, 0x0a, 0x4c, - 0xd0, 0xe7, 0x74, 0x0a, 0x86, 0xbf, 0x12, 0xc8, 0x43, 0xb3, 0x51, 0x7a, 0x99, 0xaa, 0xac, 0x8e, - 0xd5, 0x6d, 0x16, 0xef, 0xc3, 0x49, 0x79, 0x56, 0xef, 0x29, 0x4f, 0x92, 0x54, 0x26, 0x68, 0x47, - 0x22, 0x02, 0x2f, 0xc9, 0x58, 0xf4, 0xa2, 0xb9, 0xb6, 0x5b, 0xfb, 0x04, 0x90, 0x57, 0x8e, 0x09, - 0x6d, 0x29, 0x40, 0xce, 0xfc, 0x7c, 0xf6, 0xab, 0x99, 0x7f, 0xa4, 0x21, 0xba, 0xe6, 0xaf, 0x58, - 0x6a, 0x5e, 0xa3, 0x51, 0xe1, 0x8f, 0x24, 0xd6, 0x76, 0x45, 0xf8, 0xbd, 0x8f, 0xc5, 0x90, 0xe7, - 0x54, 0xd8, 0xe9, 0xd0, 0xc4, 0x25, 0x31, 0x54, 0xf8, 0xc5, 0x91, 0x42, 0xa7, 0xbb, 0x34, 0x52, - 0x68, 0x34, 0x5a, 0xc0, 0x2c, 0x5e, 0xeb, 0xf5, 0xb5, 0xf3, 0xac, 0x83, 0x66, 0x1d, 0x12, 0x0c, - 0x5e, 0xe7, 0x80, 0x8a, 0xa3, 0x80, 0xa3, 0xfa, 0xb1, 0x69, 0xe3, 0x75, 0x05, 0x8c, 0x91, 0x8d, - 0x02, 0x94, 0xaf, 0xe2, 0x75, 0x3d, 0xa1, 0xd6, 0xa7, 0x23, 0x84, 0x81, 0xeb, 0x06, 0x42, 0x9f, - 0x0f, 0x1a, 0x47, 0xa6, 0x8d, 0xd7, 0xf5, 0x84, 0x1a, 0x75, 0xb5, 0x9b, 0xfa, 0xb7, 0x81, 0x54, - 0x43, 0x33, 0xd5, 0x28, 0x72, 0xb5, 0x30, 0x71, 0x80, 0xe0, 0xf9, 0x0b, 0x63, 0x11, 0xd6, 0xf8, - 0x5a, 0x56, 0x98, 0x5c, 0xb0, 0x42, 0xe8, 0x05, 0x51, 0xcc, 0x9f, 0xab, 0x64, 0xc8, 0xa1, 0xc5, - 0x1e, 0x71, 0x1a, 0xbb, 0xba, 0xdd, 0x40, 0x35, 0xa6, 0xea, 0x22, 0x53, 0xd0, 0x9f, 0xd2, 0x47, - 0x3e, 0x0b, 0xc6, 0x7c, 0xb9, 0xf1, 0x6b, 0xf8, 0x7b, 0x3e, 0x6c, 0x1b, 0x73, 0x1f, 0xcd, 0xf1, - 0xe3, 0x3d, 0xfc, 0xc3, 0x0f, 0xfc, 0xf8, 0xb5, 0x1f, 0x7f, 0x9f, 0xf7, 0x3f, 0xfc, 0x66, 0x28, - 0xe8, 0xaf, 0x27, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x1a, 0x6b, 0x73, 0x9b, 0x48, + 0xf2, 0x3b, 0xbf, 0x62, 0xc2, 0x56, 0xe5, 0xa4, 0xb5, 0xac, 0xa7, 0xe5, 0x38, 0xb6, 0x20, 0x67, + 0x59, 0x8e, 0xad, 0x5b, 0x3f, 0x14, 0x29, 0xd9, 0x64, 0xab, 0xae, 0x6a, 0x6b, 0x04, 0x23, 0x09, + 0x1b, 0x18, 0x96, 0x19, 0xfc, 0xa8, 0x6c, 0xfe, 0xfb, 0x75, 0xcf, 0x00, 0x92, 0xd0, 0x33, 0x57, + 0xfb, 0xc1, 0x18, 0x86, 0xee, 0x9e, 0x9e, 0x7e, 0x77, 0xa3, 0xce, 0x9b, 0xde, 0xfd, 0xc5, 0xe7, + 0x3f, 0x06, 0x97, 0x64, 0x26, 0x03, 0xdf, 0xee, 0xe0, 0x95, 0xf8, 0x34, 0x9c, 0x5a, 0x26, 0x0b, + 0x4d, 0x78, 0x66, 0xd4, 0xb5, 0x3b, 0x01, 0x93, 0x94, 0x84, 0x34, 0x60, 0x96, 0xf9, 0xe4, 0xb1, + 0xe7, 0x88, 0xc7, 0xd2, 0x24, 0x0e, 0x0f, 0x25, 0x0b, 0xa5, 0x65, 0x3e, 0x7b, 0xae, 0x9c, 0x59, + 0xed, 0x7a, 0xdd, 0xb4, 0x0d, 0x0d, 0x6a, 0x14, 0xde, 0xb9, 0xec, 0xc9, 0x73, 0xd8, 0xa1, 0x7a, + 0xa8, 0x78, 0xa1, 0x27, 0x3d, 0xea, 0x1f, 0x0a, 0x87, 0xfa, 0xcc, 0x6a, 0x54, 0x02, 0xfa, 0xe2, + 0x05, 0x49, 0x90, 0x3f, 0x27, 0x82, 0xc5, 0xea, 0x81, 0x8e, 0xe1, 0x39, 0xe4, 0x26, 0x31, 0x0a, + 0x5b, 0xa7, 0x0c, 0x39, 0x33, 0x1a, 0x0b, 0x06, 0x9b, 0x24, 0x72, 0x72, 0x78, 0x02, 0xab, 0xd2, + 0x93, 0x3e, 0xb3, 0x47, 0xaf, 0xa1, 0x43, 0x46, 0x4c, 0x4a, 0x2f, 0x9c, 0x8a, 0x4e, 0x4d, 0x2f, + 0x76, 0x84, 0x13, 0x7b, 0x91, 0xb4, 0x8d, 0x27, 0x1a, 0x13, 0x9f, 0x3b, 0x5e, 0x54, 0x71, 0x2d, + 0x97, 0x3b, 0x49, 0x00, 0x6c, 0x56, 0x60, 0xc1, 0x7a, 0xd3, 0x38, 0x9b, 0x24, 0xa1, 0x23, 0x3d, + 0x1e, 0x92, 0x69, 0xdf, 0x2d, 0xb1, 0xf2, 0xf7, 0x98, 0xc9, 0x24, 0x0e, 0x89, 0x5b, 0x9d, 0x32, + 0x79, 0xe9, 0x33, 0x04, 0xed, 0xbe, 0xaa, 0x57, 0x3f, 0x72, 0x50, 0xc9, 0xa7, 0x53, 0x9f, 0x21, + 0xb4, 0x46, 0xaa, 0x3a, 0x3e, 0x15, 0xe2, 0xc6, 0x13, 0xb2, 0x9a, 0xbe, 0x32, 0x67, 0x9e, 0xcb, + 0xcc, 0x72, 0x05, 0xdf, 0x9b, 0x77, 0xdc, 0x3c, 0xd8, 0x02, 0x34, 0xa7, 0x8b, 0xcf, 0x77, 0xbc, + 0x77, 0xfb, 0xad, 0xa4, 0x29, 0x9b, 0x6e, 0xf0, 0x72, 0x1f, 0xde, 0x4f, 0x26, 0x4d, 0xb3, 0x5c, + 0x15, 0xf2, 0xd5, 0x67, 0x55, 0xd7, 0x13, 0x91, 0x4f, 0x5f, 0x2d, 0x33, 0xe4, 0x21, 0x33, 0x8b, + 0xa8, 0x37, 0xf7, 0x39, 0xaa, 0xcf, 0xf7, 0x45, 0xbd, 0x06, 0x94, 0x67, 0x2f, 0x74, 0xf9, 0x73, + 0x95, 0x47, 0x2c, 0x04, 0xb6, 0xa4, 0x8c, 0xc4, 0x69, 0xad, 0x16, 0x04, 0xd5, 0xc7, 0x90, 0x57, + 0x9f, 0x7d, 0x86, 0xd2, 0xa8, 0x79, 0xa0, 0xde, 0x78, 0x42, 0x1d, 0x26, 0x6a, 0x89, 0x1b, 0x1d, + 0x86, 0x5c, 0x7a, 0x13, 0x8f, 0xc5, 0xb5, 0xc5, 0x13, 0x74, 0x8b, 0xb4, 0x6a, 0x22, 0x55, 0x8a, + 0x59, 0x31, 0xff, 0x14, 0xcc, 0x9f, 0x2c, 0x42, 0x53, 0xf7, 0x01, 0xe0, 0x8f, 0x8f, 0xda, 0x47, + 0x96, 0xe5, 0x56, 0x47, 0x93, 0x6a, 0xaf, 0x5f, 0x7d, 0xa2, 0x7e, 0xc2, 0x3e, 0x34, 0xd2, 0x85, + 0xcb, 0x2f, 0x7a, 0xe1, 0xed, 0xdb, 0xd2, 0xd2, 0xb3, 0x55, 0x2f, 0x9f, 0xb6, 0xdb, 0xc7, 0x27, + 0x05, 0x3c, 0x00, 0xab, 0x67, 0x4b, 0xe7, 0xcb, 0x98, 0xd9, 0xb3, 0xd5, 0x28, 0x57, 0xea, 0xbb, + 0xa8, 0x37, 0xca, 0x0b, 0x5c, 0xfa, 0x9c, 0xba, 0xff, 0x19, 0x95, 0x58, 0x45, 0x5a, 0x6f, 0xea, + 0xe5, 0xef, 0x3e, 0x93, 0x84, 0x03, 0xbe, 0x13, 0x33, 0x2a, 0x59, 0x6a, 0x22, 0x25, 0x53, 0xdb, + 0x9a, 0x59, 0x3e, 0xe3, 0x55, 0x38, 0xf2, 0xb9, 0x94, 0xb1, 0x37, 0x4e, 0x24, 0x28, 0x59, 0xc4, + 0x8e, 0x59, 0x61, 0xe5, 0x4a, 0x71, 0x5d, 0xbe, 0x46, 0x0c, 0x84, 0x22, 0xd9, 0x8b, 0xac, 0x3d, + 0xd0, 0x27, 0x9a, 0x11, 0x58, 0x01, 0xa4, 0x02, 0x8c, 0xdb, 0xac, 0xc8, 0x72, 0xc5, 0xad, 0x8e, + 0xb9, 0xfb, 0x5a, 0xa5, 0x11, 0x88, 0xd6, 0xbd, 0x98, 0x79, 0xbe, 0x5b, 0xe2, 0x08, 0x4f, 0x5d, + 0xf7, 0xf2, 0x09, 0xb8, 0x40, 0xe3, 0x62, 0x21, 0x8b, 0x51, 0xfb, 0xd4, 0x35, 0x2b, 0xa5, 0xb2, + 0x65, 0x7f, 0xbf, 0x62, 0xf2, 0xf7, 0x52, 0xb9, 0x02, 0xce, 0xf1, 0x3b, 0xf5, 0x4b, 0xe5, 0x1f, + 0xeb, 0x11, 0x58, 0x1c, 0xf3, 0x18, 0xf8, 0x04, 0x04, 0xf0, 0x63, 0xc1, 0xc1, 0x5e, 0x7c, 0x3e, + 0x2d, 0x99, 0x97, 0xb8, 0x4e, 0x52, 0x29, 0x80, 0x1e, 0xc9, 0xc4, 0xf3, 0x99, 0x3a, 0x0f, 0x38, + 0x6e, 0x0c, 0xe7, 0xbe, 0x49, 0xd7, 0xf9, 0x04, 0x83, 0xc3, 0xc4, 0x9b, 0x26, 0x31, 0x55, 0x62, + 0xd3, 0xe7, 0x21, 0x13, 0xea, 0xa1, 0xfd, 0xfc, 0x37, 0xec, 0x87, 0x0e, 0x0f, 0x22, 0x90, 0x1e, + 0x23, 0x11, 0x9d, 0x32, 0xe2, 0x52, 0x49, 0xdf, 0x80, 0x35, 0x2c, 0x48, 0xfa, 0xe3, 0x05, 0x98, + 0xc3, 0x84, 0xc7, 0xa5, 0x07, 0xab, 0x7e, 0xf6, 0xd0, 0x39, 0x39, 0x7b, 0x38, 0x38, 0x28, 0x2b, + 0x6b, 0xbe, 0x32, 0x0f, 0x4a, 0x0f, 0x07, 0xa0, 0x96, 0xaa, 0x33, 0x63, 0xce, 0x23, 0x73, 0x2d, + 0xbd, 0x3c, 0x02, 0xeb, 0x56, 0x2a, 0xb3, 0xed, 0x87, 0xb7, 0x0d, 0xed, 0x6e, 0xc3, 0x0d, 0xb0, + 0xc3, 0x25, 0xd8, 0xf9, 0xae, 0x57, 0xb8, 0x2b, 0x86, 0x08, 0xb0, 0x2a, 0xd0, 0x71, 0xbd, 0xc2, + 0x2d, 0x08, 0x0b, 0x05, 0x2e, 0xd8, 0x81, 0xb5, 0x9e, 0x91, 0x5f, 0x79, 0x45, 0xa6, 0xef, 0x86, + 0x6b, 0xde, 0xf1, 0x5f, 0xad, 0xe6, 0x59, 0x81, 0x57, 0x8b, 0x55, 0x0a, 0x1c, 0x59, 0x72, 0xce, + 0xce, 0x68, 0x90, 0xb3, 0xb3, 0x64, 0xdb, 0x9a, 0xca, 0x4b, 0xb4, 0xe2, 0xcf, 0xcc, 0xae, 0x7f, + 0xd0, 0x3e, 0x7d, 0x6a, 0x8e, 0x21, 0xaa, 0x3d, 0x82, 0x7a, 0xec, 0x7a, 0x6e, 0xd3, 0x83, 0x6c, + 0xd3, 0x05, 0x41, 0x67, 0xc6, 0xf0, 0x5d, 0x3c, 0x7b, 0xd2, 0x99, 0x95, 0x22, 0x0c, 0xaa, 0x7d, + 0x30, 0xe3, 0x25, 0x94, 0x72, 0xf9, 0xbb, 0x43, 0x05, 0x23, 0xe8, 0x68, 0xa7, 0x4b, 0xbc, 0x58, + 0xb8, 0x74, 0x36, 0x06, 0x0f, 0x78, 0x3c, 0x53, 0x20, 0xe8, 0xc3, 0x05, 0x10, 0x5c, 0x5a, 0x04, + 0x39, 0xaa, 0x1f, 0x15, 0xa9, 0xe0, 0xd2, 0x0f, 0x3c, 0x6f, 0x05, 0x35, 0xbf, 0xc0, 0x1e, 0x70, + 0x66, 0xa2, 0xa1, 0x9d, 0x9a, 0x96, 0x95, 0x86, 0x13, 0x38, 0x98, 0xb2, 0xab, 0x6a, 0x14, 0x73, + 0xc9, 0x1d, 0xee, 0xc3, 0x01, 0x55, 0x08, 0xaf, 0x57, 0x4a, 0x2a, 0xb6, 0x5b, 0x08, 0xe1, 0x8f, + 0x24, 0x8f, 0xc1, 0xba, 0x30, 0x7a, 0xf7, 0x25, 0x0b, 0xd0, 0x13, 0x9c, 0x3e, 0xc8, 0xac, 0xfc, + 0xf7, 0xdf, 0x29, 0x18, 0xe0, 0x07, 0x11, 0x18, 0xee, 0x47, 0xa0, 0x4f, 0x6e, 0xb9, 0xcb, 0xaa, + 0x64, 0xe0, 0x33, 0xe4, 0x90, 0x61, 0x80, 0x23, 0x5f, 0x6f, 0x2e, 0x7b, 0xa4, 0x3f, 0x00, 0xd3, + 0xac, 0x2c, 0x51, 0x14, 0xcb, 0x14, 0x2b, 0x8a, 0x5a, 0xb9, 0x8c, 0x50, 0x2a, 0x3e, 0x20, 0xf9, + 0x0f, 0x2a, 0x76, 0x42, 0xe8, 0x34, 0x0f, 0xd4, 0xeb, 0x53, 0xd3, 0x2c, 0x1f, 0xcc, 0x63, 0x60, + 0x4d, 0x54, 0x1f, 0xc4, 0x87, 0xc8, 0x3a, 0x32, 0x2b, 0x6f, 0x1a, 0xe5, 0x1f, 0x46, 0xa7, 0x96, + 0x66, 0xa8, 0x8e, 0xd2, 0xa8, 0xfd, 0x6f, 0x2f, 0xc0, 0x5c, 0x47, 0x92, 0xd8, 0x87, 0xb8, 0xa1, + 0x94, 0xec, 0x08, 0x01, 0x31, 0x05, 0x00, 0x15, 0x40, 0xa7, 0xa6, 0x73, 0x33, 0x86, 0x01, 0x70, + 0x4a, 0xdc, 0xd9, 0x32, 0x41, 0x5a, 0x90, 0x07, 0xc1, 0x60, 0x03, 0x83, 0x78, 0xf0, 0x8c, 0x77, + 0x7f, 0x0a, 0x33, 0xcd, 0xdd, 0xa3, 0x89, 0x49, 0x20, 0x73, 0xce, 0x38, 0xbc, 0x89, 0xb8, 0x80, + 0x1c, 0x0e, 0xee, 0x9d, 0x8c, 0x03, 0x0f, 0x72, 0x28, 0x5a, 0x3e, 0xa0, 0xba, 0xde, 0x13, 0x51, + 0xc9, 0xc9, 0x32, 0x25, 0x07, 0xf1, 0x3c, 0xa7, 0x6b, 0x46, 0xba, 0x38, 0x63, 0x7e, 0xd4, 0x85, + 0x35, 0x08, 0x47, 0x12, 0xb3, 0x1f, 0x04, 0x2e, 0xcb, 0xd4, 0x0f, 0x48, 0xcd, 0xf1, 0x3d, 0xe7, + 0xd1, 0x32, 0xaf, 0x91, 0xd6, 0x87, 0x4e, 0x4d, 0xbf, 0x00, 0x56, 0x81, 0x44, 0x8e, 0x63, 0x6c, + 0x40, 0xea, 0x22, 0x52, 0x97, 0x3a, 0x8f, 0x73, 0xbc, 0xa5, 0x5d, 0x34, 0xa7, 0xa6, 0x3d, 0xa2, + 0x4f, 0x6c, 0x0e, 0x32, 0x8b, 0xa1, 0xe8, 0xd0, 0xf4, 0x67, 0x4d, 0x9d, 0xfb, 0x41, 0xc4, 0x49, + 0x04, 0xe2, 0x69, 0xc2, 0x52, 0xcb, 0x56, 0x3a, 0xec, 0xc6, 0x20, 0x1e, 0x30, 0x3d, 0x09, 0xcb, + 0x2d, 0xfb, 0x4b, 0x6f, 0x40, 0x06, 0x20, 0xdc, 0x53, 0xd2, 0xf1, 0xc2, 0x28, 0x91, 0xa9, 0x78, + 0xbe, 0x0c, 0xcc, 0x8c, 0xb9, 0x30, 0x09, 0xc6, 0x2c, 0x06, 0x69, 0x79, 0xa1, 0x65, 0x36, 0xe0, + 0x3f, 0x7d, 0xb1, 0xcc, 0xe3, 0x76, 0xbb, 0xd5, 0x36, 0x33, 0xf1, 0xb8, 0x70, 0x1b, 0xb3, 0xbf, + 0x12, 0x2f, 0x66, 0xa8, 0x85, 0xd8, 0x6e, 0x86, 0xee, 0x32, 0xd5, 0xb4, 0x6c, 0xf9, 0xd2, 0x34, + 0xc9, 0xff, 0x4f, 0x15, 0x8f, 0x60, 0xa8, 0x63, 0x4d, 0x63, 0x9e, 0x44, 0x42, 0x1d, 0x60, 0x89, + 0x6d, 0x08, 0x26, 0x4a, 0xd7, 0xf8, 0x7f, 0x79, 0x1f, 0x65, 0x28, 0x40, 0x53, 0x07, 0x87, 0x53, + 0x15, 0x17, 0x6c, 0x62, 0x2c, 0x63, 0x0f, 0x53, 0xec, 0xe1, 0x5e, 0xd8, 0x1d, 0x89, 0x55, 0x19, + 0x31, 0xd2, 0x97, 0x01, 0x8d, 0xa7, 0x5e, 0x78, 0x5a, 0x27, 0x34, 0x91, 0x1c, 0xdf, 0x02, 0xc3, + 0x12, 0x18, 0xaf, 0xe1, 0x05, 0xfe, 0x1a, 0xf9, 0x5d, 0x33, 0xbf, 0x6b, 0xe5, 0x77, 0x47, 0xf9, + 0x5d, 0xdb, 0xc8, 0x6f, 0x8f, 0xf3, 0xbb, 0x77, 0xf9, 0xdd, 0x89, 0xbe, 0xab, 0x29, 0xf2, 0x7a, + 0x8b, 0x11, 0xa4, 0xbd, 0xd3, 0x1c, 0x20, 0x93, 0xb8, 0x3e, 0x81, 0x0a, 0xb9, 0x63, 0xfe, 0x92, + 0x9e, 0xac, 0x91, 0xd9, 0x3f, 0xdc, 0xd9, 0x45, 0x94, 0xb5, 0x18, 0xcd, 0xbc, 0xe6, 0x84, 0xdb, + 0xfd, 0x50, 0x5a, 0xf9, 0x26, 0xad, 0x55, 0x8c, 0xf5, 0x7c, 0x1d, 0xe5, 0x28, 0x47, 0x7b, 0x6e, + 0xd2, 0x9e, 0xf3, 0xd5, 0xde, 0x13, 0xe5, 0x38, 0xdf, 0xe4, 0x78, 0x5f, 0xbe, 0xde, 0xe5, 0x28, + 0xef, 0xf6, 0xdc, 0xe4, 0x64, 0xce, 0xd7, 0x49, 0x86, 0xb2, 0xa8, 0xac, 0x21, 0x73, 0x98, 0xf7, + 0xc4, 0x4e, 0xf7, 0x21, 0x36, 0x6c, 0xe4, 0xc4, 0x86, 0x7b, 0xea, 0x6b, 0xd8, 0xcc, 0x38, 0x1e, + 0x36, 0xf7, 0x3c, 0xe4, 0x30, 0xd7, 0xd7, 0xb0, 0xb5, 0xe7, 0x26, 0x47, 0x73, 0xbe, 0xf6, 0xd4, + 0xd7, 0xb0, 0x9d, 0x6f, 0xd2, 0xde, 0x97, 0xaf, 0x5c, 0x5f, 0xc3, 0xe3, 0x3d, 0x37, 0x79, 0x37, + 0xe7, 0x6b, 0x4f, 0x7d, 0x0d, 0x4f, 0xf2, 0x4d, 0x96, 0xd5, 0x55, 0x53, 0xde, 0x0d, 0x01, 0x15, + 0x02, 0x4f, 0xae, 0xb3, 0x90, 0x3f, 0xc7, 0x34, 0xda, 0x44, 0x2f, 0xa5, 0x03, 0x39, 0xa1, 0x1b, + 0x7b, 0xd3, 0x99, 0x0c, 0x99, 0x10, 0x95, 0x4e, 0x2d, 0x45, 0x32, 0xf6, 0xc3, 0xbe, 0x30, 0xed, + 0x0b, 0xee, 0xf3, 0x78, 0x8e, 0x98, 0xe1, 0x51, 0x08, 0xaa, 0x9b, 0xe4, 0x95, 0x22, 0x7f, 0x33, + 0xed, 0xcb, 0xc9, 0x84, 0x39, 0x52, 0xcc, 0xb1, 0x31, 0x70, 0x6e, 0xdb, 0x71, 0x74, 0x0f, 0xbd, + 0x2a, 0x94, 0x3e, 0x53, 0x2c, 0xd8, 0x09, 0x8f, 0xb0, 0x9a, 0x10, 0x15, 0xb2, 0x1d, 0xe7, 0x0a, + 0x82, 0xe7, 0x98, 0x27, 0xa1, 0x2b, 0x90, 0xbe, 0x81, 0x11, 0x88, 0xe8, 0xce, 0x47, 0x97, 0x23, + 0x02, 0x6b, 0x63, 0x17, 0x22, 0xb7, 0x23, 0xb1, 0x37, 0x0d, 0xa7, 0xec, 0x74, 0x07, 0xc5, 0x9e, + 0x69, 0x6f, 0x21, 0x95, 0x66, 0xbf, 0x28, 0x06, 0x91, 0x12, 0xa8, 0xbc, 0xfb, 0xc3, 0x5d, 0xf4, + 0xba, 0x8b, 0xf4, 0xce, 0x7d, 0xf6, 0x42, 0x97, 0xa9, 0xee, 0xc2, 0x3f, 0x5f, 0xc4, 0x1f, 0x40, + 0x53, 0xe1, 0x45, 0x82, 0x5c, 0x27, 0x2c, 0x3d, 0xce, 0xcf, 0x11, 0xbb, 0x5e, 0x24, 0x76, 0x4b, + 0x9d, 0x98, 0xff, 0x1c, 0xfe, 0x6d, 0x8a, 0x8f, 0xd9, 0x3a, 0x82, 0xb2, 0x00, 0x7a, 0x2d, 0x68, + 0xc8, 0x63, 0x1a, 0x8a, 0xc0, 0x13, 0x62, 0x89, 0x42, 0x9a, 0x68, 0x87, 0x6b, 0x13, 0x6d, 0x3d, + 0x4d, 0xb4, 0x2d, 0xb8, 0x31, 0x36, 0xa6, 0x59, 0x65, 0x31, 0x60, 0xf4, 0x63, 0xce, 0x65, 0xfe, + 0x0a, 0xba, 0x7b, 0x02, 0x1d, 0x96, 0xff, 0x9a, 0x0a, 0x40, 0x54, 0x3b, 0x35, 0x0f, 0x6b, 0x8e, + 0x9c, 0x90, 0x08, 0x7c, 0x53, 0xe5, 0xe8, 0x7e, 0x28, 0x24, 0x0d, 0x1d, 0x46, 0xb0, 0x8f, 0x52, + 0x49, 0xfa, 0x32, 0x54, 0xa9, 0xd2, 0xcb, 0x5e, 0xf8, 0xf0, 0x62, 0xe3, 0x99, 0x53, 0x0f, 0xbe, + 0xbb, 0xd1, 0x87, 0xbe, 0xa5, 0x8f, 0x8c, 0xc8, 0x99, 0x27, 0xe6, 0xe8, 0x90, 0x87, 0x1d, 0xfe, + 0xc4, 0x62, 0x24, 0xba, 0x43, 0x74, 0x77, 0x5d, 0x9c, 0xc4, 0x00, 0x97, 0x45, 0x26, 0x87, 0x8c, + 0xfa, 0xd2, 0x0b, 0x98, 0xe2, 0x2f, 0x75, 0x70, 0x82, 0xf2, 0x8d, 0xd3, 0x17, 0xbb, 0xf8, 0x1b, + 0xa6, 0x16, 0xfb, 0x05, 0x4a, 0xe4, 0x80, 0x7a, 0xd0, 0xd9, 0x65, 0x2e, 0x14, 0xfa, 0xaf, 0x3b, + 0xb8, 0xba, 0xbd, 0x37, 0x73, 0x51, 0x43, 0x0d, 0x62, 0xdf, 0x31, 0xf9, 0xcc, 0xe3, 0x47, 0xd2, + 0xbb, 0xfd, 0x46, 0x14, 0x9e, 0x92, 0x2d, 0xbc, 0xfc, 0x0c, 0xe8, 0x40, 0x4b, 0x30, 0x1f, 0x3d, + 0x49, 0x23, 0xf7, 0xfa, 0xaa, 0x52, 0x54, 0x5a, 0x00, 0xdb, 0xc0, 0x3e, 0x41, 0x4d, 0x0c, 0xf0, + 0xa0, 0xda, 0x7d, 0x89, 0xee, 0x23, 0x4c, 0x6c, 0x47, 0x20, 0x22, 0x34, 0xaa, 0xad, 0x06, 0x29, + 0x89, 0xf3, 0x8b, 0xbb, 0x72, 0xa7, 0xa6, 0x21, 0xec, 0x02, 0x24, 0x76, 0x25, 0xa6, 0x7d, 0x1e, + 0xcb, 0x43, 0x60, 0x25, 0x07, 0x2a, 0xd2, 0x03, 0xab, 0xd1, 0x9c, 0x40, 0xf3, 0x68, 0x66, 0x77, + 0x10, 0xaf, 0x12, 0x21, 0x79, 0x40, 0xb0, 0x46, 0x9f, 0xd3, 0xaf, 0xe9, 0xf7, 0xfa, 0x98, 0xaa, + 0x6c, 0xc6, 0x70, 0x0b, 0x7d, 0x9a, 0xbd, 0xa6, 0xdc, 0xbc, 0x1c, 0xec, 0x53, 0x17, 0x2e, 0x9e, + 0x6a, 0x8b, 0xf9, 0xaa, 0x0a, 0xf8, 0x36, 0x01, 0x25, 0x62, 0x95, 0xbb, 0x43, 0x13, 0x97, 0x99, + 0x6b, 0x8d, 0x24, 0xc5, 0x16, 0x23, 0x04, 0x33, 0x80, 0xa6, 0xaf, 0xc8, 0xdf, 0x97, 0xad, 0xee, + 0x74, 0xdc, 0x7a, 0xff, 0xfe, 0x7d, 0x81, 0x0d, 0x63, 0xd5, 0x85, 0x94, 0xc7, 0x90, 0x0b, 0xe4, + 0x80, 0x70, 0xa0, 0xdd, 0xa1, 0x64, 0x16, 0xb3, 0x89, 0x95, 0x4f, 0x96, 0xa6, 0x9e, 0x9c, 0x25, + 0xe3, 0xaa, 0xc3, 0x83, 0xda, 0x0d, 0x73, 0x3f, 0xbe, 0xe8, 0x2b, 0x56, 0xe2, 0x50, 0x5b, 0xe2, + 0x74, 0xef, 0xcf, 0xb1, 0x4f, 0xc3, 0x47, 0xd3, 0x56, 0xeb, 0x9d, 0x1a, 0xb5, 0xdf, 0xe0, 0x56, + 0xa3, 0x47, 0x2f, 0x42, 0x82, 0x87, 0x7c, 0x72, 0x28, 0x60, 0x2f, 0x86, 0x3e, 0xa2, 0xc3, 0xc4, + 0x3c, 0x2e, 0x6c, 0x48, 0x19, 0x97, 0x23, 0x7d, 0x7e, 0xb4, 0x3c, 0xa1, 0x44, 0x40, 0x5d, 0x17, + 0xa3, 0x6c, 0x41, 0x02, 0xbd, 0xf3, 0xa2, 0x04, 0x8c, 0x25, 0x15, 0xb5, 0x1b, 0xf5, 0x82, 0x00, + 0x14, 0xc5, 0xd4, 0x25, 0x04, 0x70, 0x03, 0x9d, 0x5e, 0x81, 0xe6, 0xb7, 0x6f, 0xeb, 0x9b, 0x8c, + 0x4c, 0xac, 0x8d, 0xf6, 0x3a, 0x9a, 0x01, 0xf4, 0xa6, 0x2b, 0x2e, 0x81, 0x5a, 0xd4, 0x96, 0x67, + 0xcc, 0x8d, 0xd5, 0xee, 0x79, 0x02, 0x43, 0x84, 0xbb, 0xc9, 0xea, 0xa1, 0xa6, 0x1a, 0x01, 0x5b, + 0x10, 0x99, 0x86, 0x57, 0xdd, 0x15, 0x20, 0x23, 0x85, 0x6a, 0xe6, 0x50, 0xbd, 0x75, 0x60, 0x29, + 0x54, 0x2b, 0x4b, 0xbd, 0x1b, 0xe9, 0xbc, 0xcb, 0x20, 0xc8, 0x01, 0xf9, 0x3a, 0xf3, 0x24, 0xdb, + 0x44, 0xea, 0x24, 0x07, 0x4c, 0xb3, 0xf2, 0x46, 0x87, 0x7c, 0x5f, 0x84, 0xdc, 0x45, 0x1a, 0x9c, + 0x5c, 0x79, 0x06, 0x1e, 0xd8, 0xd8, 0x04, 0xd4, 0x46, 0xc9, 0x05, 0x01, 0x34, 0xfd, 0x07, 0x24, + 0x87, 0xde, 0x18, 0x39, 0x20, 0xec, 0xe4, 0x40, 0x5f, 0x37, 0x4a, 0x1a, 0xb4, 0x31, 0x00, 0xb3, + 0x62, 0x9b, 0x22, 0x04, 0x25, 0xc6, 0xb2, 0x2f, 0x6c, 0x9e, 0xb2, 0x32, 0x8c, 0x67, 0x87, 0x6e, + 0xf0, 0x52, 0x03, 0x93, 0x2c, 0x38, 0x86, 0x8e, 0x75, 0x5e, 0x38, 0xe1, 0x06, 0xba, 0x87, 0x0a, + 0xa1, 0x10, 0xcb, 0xc1, 0x39, 0x8a, 0x1e, 0xfd, 0x79, 0x47, 0xc4, 0xa9, 0xd7, 0x17, 0x8d, 0x8f, + 0x04, 0x42, 0x55, 0x82, 0x1f, 0x79, 0xec, 0x60, 0xb8, 0x7f, 0x21, 0xe3, 0xbc, 0xc4, 0xdb, 0x11, + 0x61, 0x3e, 0x66, 0x95, 0x48, 0x6a, 0x8d, 0x79, 0x82, 0x21, 0x53, 0x1a, 0x04, 0x94, 0x38, 0x3c, + 0xc6, 0x32, 0x09, 0x44, 0xb2, 0x83, 0xd0, 0xf0, 0x2a, 0x25, 0x94, 0xa5, 0x2e, 0x82, 0xed, 0x3c, + 0x9f, 0x4c, 0x40, 0xaa, 0x85, 0xd3, 0x7d, 0xbd, 0x5f, 0x7b, 0xba, 0xc3, 0x66, 0xbb, 0x9d, 0x1e, + 0x50, 0xdd, 0x19, 0x73, 0xe7, 0xc2, 0x08, 0x8d, 0x01, 0x7a, 0x3e, 0x5a, 0xd7, 0x7a, 0x61, 0x41, + 0xd6, 0xfc, 0x3a, 0x58, 0x95, 0x9e, 0xfe, 0x32, 0x99, 0x9c, 0x38, 0xea, 0xf3, 0xc6, 0x67, 0x4c, + 0xc9, 0x13, 0x2f, 0x0e, 0x9e, 0x69, 0xcc, 0xa0, 0x40, 0xf3, 0x7c, 0x97, 0xb8, 0x9c, 0x09, 0xac, + 0x6c, 0x40, 0x03, 0x8e, 0x9f, 0xb8, 0x4c, 0x25, 0x34, 0x10, 0x3e, 0x72, 0x26, 0x92, 0x08, 0x33, + 0x44, 0x55, 0xc7, 0x68, 0x16, 0x64, 0xa3, 0x90, 0x75, 0x15, 0x84, 0xae, 0xd7, 0x7e, 0xe7, 0x1e, + 0x08, 0xfb, 0x1c, 0x0a, 0x1c, 0xcc, 0xfb, 0xba, 0x92, 0xc8, 0x19, 0xbd, 0xe3, 0x0a, 0x28, 0x9f, + 0x16, 0xa8, 0x8f, 0x06, 0x8a, 0x5f, 0xa3, 0xc0, 0x30, 0x05, 0x6e, 0xf7, 0x62, 0x56, 0xef, 0xba, + 0xc2, 0xa7, 0x31, 0xcf, 0x2a, 0xf9, 0xee, 0x7a, 0x6f, 0xfb, 0x32, 0x48, 0x7c, 0x2a, 0x33, 0x4c, + 0xfd, 0x69, 0x67, 0x57, 0xdd, 0x70, 0x9e, 0xd6, 0x35, 0x1a, 0xc7, 0x0b, 0x9f, 0xd2, 0x09, 0x9e, + 0x52, 0x5d, 0x01, 0x19, 0xa7, 0xe0, 0x99, 0xfa, 0xcf, 0xfb, 0x18, 0x73, 0xe9, 0x8b, 0xcf, 0xc2, + 0xa9, 0x9c, 0x41, 0xc0, 0x69, 0x66, 0x74, 0x04, 0x27, 0x2c, 0x65, 0x44, 0xb3, 0x20, 0xb0, 0x58, + 0x73, 0xa8, 0xef, 0x43, 0xdd, 0xc4, 0xf0, 0xd8, 0x42, 0x2e, 0xdb, 0xc7, 0xf9, 0xea, 0x78, 0x27, + 0x53, 0x41, 0x21, 0x06, 0x2f, 0xa6, 0x35, 0x55, 0x7e, 0x43, 0x4e, 0xc9, 0x8b, 0xc4, 0x0d, 0x0a, + 0x44, 0x21, 0xad, 0xd1, 0xc1, 0xdb, 0x5f, 0xde, 0x9f, 0x9c, 0x9c, 0x9c, 0x91, 0xce, 0xd8, 0x36, + 0xba, 0xfe, 0x6b, 0xf8, 0x58, 0x21, 0xb7, 0x9f, 0x3e, 0x7f, 0x26, 0xd8, 0xd7, 0x60, 0x61, 0x8d, + 0xf3, 0x7c, 0x82, 0x4c, 0x3b, 0x3c, 0x0c, 0x31, 0xa6, 0xc1, 0x21, 0xe0, 0xfc, 0x2c, 0x0e, 0xa9, + 0x4f, 0x66, 0x5c, 0x48, 0xa1, 0xb2, 0x9d, 0x36, 0xbc, 0x80, 0xbe, 0x12, 0x2f, 0x80, 0xb4, 0x22, + 0xd5, 0x19, 0x81, 0xb1, 0x08, 0xaa, 0x60, 0x48, 0xde, 0xa1, 0xea, 0x10, 0x26, 0x6a, 0x5e, 0x09, + 0x09, 0x77, 0xbc, 0xc0, 0xa9, 0x01, 0xde, 0x4b, 0xc6, 0x4c, 0x60, 0x46, 0x16, 0x10, 0xb2, 0xa0, + 0xcb, 0xc1, 0x5a, 0x8d, 0x24, 0x50, 0xc1, 0xf1, 0x90, 0x21, 0x16, 0xd0, 0x82, 0x07, 0xc1, 0x62, + 0x2d, 0x46, 0x0a, 0xe9, 0x90, 0xa0, 0xab, 0x29, 0x6b, 0x30, 0x4a, 0xe0, 0x77, 0xc8, 0x8e, 0x84, + 0x7d, 0xfc, 0xd7, 0x4a, 0xce, 0x28, 0x18, 0x0d, 0x83, 0x7b, 0x97, 0x5c, 0x8e, 0x06, 0xc8, 0x35, + 0x50, 0x09, 0xd4, 0xb1, 0x90, 0x32, 0xb2, 0x87, 0x75, 0x25, 0x1e, 0xaf, 0xbc, 0xd6, 0xda, 0x95, + 0x30, 0x8a, 0xd6, 0xad, 0x16, 0xd7, 0x58, 0xf7, 0x1a, 0xc1, 0xee, 0xe7, 0x8a, 0x8a, 0xe0, 0x46, + 0x2f, 0xcc, 0x2b, 0x34, 0xbd, 0xaf, 0x7d, 0xcd, 0x57, 0x4a, 0xa7, 0x45, 0x63, 0xec, 0x5e, 0x2b, + 0xfb, 0x58, 0xb4, 0xc5, 0xb5, 0x03, 0xbf, 0xee, 0xcf, 0x14, 0x76, 0x27, 0xf5, 0xc5, 0xd9, 0x5f, + 0x1a, 0x34, 0x95, 0x41, 0x93, 0xf3, 0x44, 0xce, 0x40, 0xb2, 0x8f, 0x2c, 0x2c, 0x44, 0xba, 0xee, + 0x6f, 0xcb, 0x8c, 0xb4, 0xcc, 0xac, 0x7f, 0x31, 0x2e, 0x7c, 0x46, 0x63, 0x25, 0x7e, 0x85, 0x08, + 0x02, 0x62, 0xbe, 0x6a, 0x63, 0x5c, 0x1d, 0x88, 0xab, 0x44, 0x55, 0xd9, 0x3f, 0x91, 0x79, 0xc6, + 0x28, 0x9b, 0x35, 0x59, 0x67, 0x84, 0x53, 0x56, 0x95, 0x75, 0x30, 0xe9, 0xe4, 0x33, 0xd8, 0x96, + 0x8d, 0xf6, 0x5d, 0x54, 0x2c, 0xae, 0xfd, 0x93, 0x7a, 0x55, 0x3e, 0xb4, 0x4d, 0xad, 0xb8, 0xad, + 0xda, 0xd4, 0x36, 0xd2, 0x3e, 0x0c, 0x9f, 0x76, 0x75, 0x28, 0x9f, 0xb4, 0x20, 0xbb, 0x31, 0xc8, + 0x2e, 0x5e, 0x6b, 0x09, 0xa9, 0x8a, 0x6f, 0x47, 0x3b, 0x4c, 0x21, 0x23, 0x38, 0xb8, 0x1f, 0x6e, + 0x4c, 0xba, 0xc6, 0xfa, 0xf9, 0x6f, 0xda, 0x24, 0xa1, 0x24, 0xd2, 0x83, 0x3a, 0x10, 0x88, 0xa0, + 0xce, 0xf1, 0xa8, 0x0f, 0xde, 0x19, 0xa3, 0xab, 0x62, 0xc7, 0x05, 0x35, 0x3b, 0xf8, 0x1b, 0x54, + 0xef, 0xe0, 0x87, 0x09, 0x36, 0xab, 0xa9, 0x67, 0xe2, 0x87, 0x11, 0x65, 0x46, 0x77, 0x0c, 0x41, + 0x32, 0x77, 0x54, 0x94, 0x22, 0xd8, 0x04, 0x9a, 0x2e, 0x97, 0x4c, 0x38, 0x22, 0x73, 0x78, 0x11, + 0x67, 0x9e, 0xff, 0x26, 0x0b, 0x1c, 0xd0, 0xdc, 0xc5, 0x4b, 0x71, 0xd9, 0x58, 0xf5, 0x85, 0xdb, + 0x4f, 0x5f, 0x46, 0x97, 0xc3, 0x25, 0x21, 0x1c, 0xd5, 0x35, 0xeb, 0x83, 0x74, 0x8f, 0x82, 0xfc, + 0xb2, 0xad, 0xe7, 0x32, 0xfc, 0x34, 0x38, 0x1f, 0x2d, 0xcb, 0xf1, 0xf8, 0x48, 0x93, 0xb8, 0xf0, + 0x3d, 0x3c, 0x62, 0xbf, 0xb7, 0xc5, 0x1b, 0x6f, 0x3f, 0x5d, 0xf4, 0x7b, 0xcb, 0xd9, 0x21, 0xe3, + 0x20, 0xf5, 0x9f, 0xcf, 0x3c, 0xf2, 0x9c, 0x6d, 0x14, 0x7a, 0x2b, 0x4a, 0x54, 0x69, 0xef, 0x0a, + 0x07, 0xed, 0xbb, 0xb1, 0xaf, 0x56, 0xb0, 0x95, 0xd4, 0x07, 0xc9, 0x18, 0x3a, 0xfd, 0x59, 0x71, + 0x80, 0xb3, 0xc3, 0xf4, 0xba, 0xb7, 0x73, 0x1f, 0xde, 0x39, 0x84, 0xf8, 0x69, 0x1f, 0x0e, 0xfe, + 0x92, 0x72, 0x8d, 0x0b, 0x2b, 0x93, 0x58, 0xe3, 0xc1, 0x0b, 0x93, 0x9f, 0xa2, 0x23, 0xc3, 0xd2, + 0x3f, 0xe9, 0xc7, 0x8b, 0x33, 0xa6, 0x9d, 0x51, 0x1a, 0xf7, 0x56, 0x02, 0xfa, 0x83, 0x27, 0x90, + 0xe9, 0x31, 0xb8, 0x41, 0xba, 0x41, 0xdb, 0x86, 0xba, 0xd4, 0x9d, 0x32, 0xd2, 0x1f, 0xa8, 0x04, + 0x84, 0x2b, 0x3e, 0x16, 0xaa, 0x44, 0x7b, 0x1c, 0xec, 0xa6, 0xd6, 0xfe, 0x75, 0x3e, 0x86, 0xb2, + 0xec, 0x5f, 0x98, 0xb7, 0x54, 0xed, 0xa1, 0x53, 0x1f, 0x99, 0xc1, 0xde, 0x20, 0xdf, 0xaa, 0x91, + 0xcd, 0x1f, 0x06, 0x1c, 0xf2, 0x31, 0x72, 0xa4, 0x89, 0x2c, 0x79, 0xf4, 0xf5, 0xcd, 0xd6, 0xd8, + 0x0e, 0x1d, 0xb1, 0x4d, 0xd0, 0xed, 0x5e, 0x0b, 0x9f, 0x59, 0xae, 0xfb, 0xeb, 0xf1, 0xea, 0xf5, + 0xa5, 0xe2, 0x1b, 0x6b, 0xee, 0x5d, 0xdd, 0xeb, 0xf5, 0x40, 0x9b, 0x0a, 0x84, 0x87, 0xb0, 0x02, + 0x56, 0xa2, 0xa7, 0x38, 0x5b, 0xad, 0xeb, 0x5a, 0x8d, 0x3b, 0xef, 0xc3, 0x1a, 0x14, 0xb9, 0x3b, + 0xa6, 0x9c, 0xd7, 0x50, 0xb9, 0x93, 0x85, 0x51, 0x2e, 0xd9, 0x3d, 0x81, 0xbd, 0xbe, 0x00, 0x14, + 0x35, 0xbf, 0x45, 0xb6, 0x50, 0x70, 0xdd, 0x4c, 0x1f, 0xa7, 0x0b, 0x93, 0xd8, 0x14, 0xb8, 0xbe, + 0x6f, 0x15, 0x86, 0xd5, 0xba, 0x4d, 0xaa, 0x05, 0xf9, 0x37, 0x56, 0x5a, 0xf2, 0x9f, 0x42, 0x5f, + 0xf9, 0x16, 0xb7, 0x8a, 0x6d, 0x6c, 0x41, 0x6f, 0xed, 0x46, 0x9f, 0x63, 0x67, 0x71, 0x7c, 0xa0, + 0x06, 0xb8, 0x68, 0x6a, 0x51, 0x22, 0x66, 0xbe, 0x07, 0x15, 0x49, 0x1a, 0x19, 0x78, 0xb8, 0x60, + 0xbe, 0x20, 0xea, 0x09, 0x7e, 0x74, 0x96, 0x33, 0xa8, 0xc0, 0x04, 0x7d, 0x4a, 0x07, 0x80, 0xf8, + 0x03, 0x89, 0x3c, 0x34, 0x1b, 0xa5, 0xe7, 0x99, 0xca, 0xea, 0x58, 0xdd, 0x66, 0xf1, 0x3e, 0x9c, + 0x96, 0xe7, 0xf5, 0x9e, 0xf2, 0x24, 0x49, 0x65, 0x82, 0x76, 0x24, 0x22, 0xf0, 0x92, 0x8c, 0x45, + 0x2f, 0x32, 0xf3, 0x7e, 0xcc, 0xd5, 0x3e, 0x01, 0xe4, 0x95, 0x63, 0x42, 0x5b, 0x0a, 0x90, 0x73, + 0x3f, 0x9f, 0xff, 0x60, 0xe8, 0x1f, 0x69, 0x88, 0x6e, 0xf8, 0x0b, 0x96, 0x9a, 0x37, 0x68, 0x54, + 0xf8, 0xfb, 0x90, 0x8d, 0x5d, 0x11, 0x7e, 0xea, 0x64, 0x31, 0xe4, 0x39, 0x15, 0x76, 0xba, 0x34, + 0x71, 0x49, 0x0c, 0x15, 0x7e, 0x71, 0xf2, 0xd1, 0xed, 0x99, 0x2b, 0xbd, 0x76, 0xa3, 0x0d, 0xcc, + 0xe2, 0xb5, 0x5e, 0xdf, 0x38, 0x39, 0x68, 0xb6, 0xea, 0x90, 0x60, 0xf0, 0xba, 0x00, 0x54, 0x1c, + 0x16, 0x1c, 0xd7, 0x4f, 0x4c, 0x1b, 0xaf, 0x6b, 0x60, 0xb2, 0xa9, 0x86, 0xf6, 0x55, 0xbc, 0x6e, + 0x26, 0xd4, 0x7e, 0x77, 0x8c, 0x30, 0x70, 0xdd, 0x42, 0xe8, 0x7d, 0xb3, 0x71, 0x6c, 0xda, 0x78, + 0xdd, 0x4c, 0xa8, 0x51, 0x57, 0xbb, 0xa9, 0x7f, 0x5b, 0x48, 0x35, 0x34, 0x53, 0x8d, 0x22, 0x57, + 0x4b, 0x13, 0x07, 0x08, 0x9e, 0xbf, 0x31, 0x16, 0x61, 0x8d, 0xaf, 0x65, 0x85, 0xc9, 0x05, 0x2b, + 0x84, 0x7e, 0x10, 0xc5, 0xfc, 0xa9, 0x4a, 0x46, 0x1c, 0x5a, 0xec, 0x31, 0xa7, 0xb1, 0xab, 0xdb, + 0x0d, 0x54, 0x63, 0xaa, 0x2e, 0x32, 0x03, 0xfd, 0x29, 0x7d, 0xe4, 0x63, 0x70, 0xcc, 0x97, 0x5b, + 0x7f, 0x08, 0xf0, 0x33, 0xdf, 0xf4, 0x8d, 0x85, 0xdf, 0x0b, 0xe0, 0xef, 0x16, 0xe0, 0x1f, 0xfe, + 0xb6, 0x01, 0x7f, 0xe8, 0x80, 0x3f, 0x4d, 0xfc, 0x1f, 0x61, 0x45, 0x94, 0xf0, 0xaa, 0x28, 0x00, + 0x00 }; diff --git a/wled00/led.cpp b/wled00/led.cpp index e9e108e4..3c878b35 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -180,7 +180,9 @@ void handleTransitions() { //handle still pending interface update if (interfaceUpdateCallMode && millis() - lastInterfaceUpdate > INTERFACE_UPDATE_COOLDOWN) updateInterfaces(interfaceUpdateCallMode); +#ifndef WLED_DISABLE_MQTT if (doPublishMqtt) publishMqtt(); +#endif if (transitionActive && transitionDelayTemp > 0) { diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index 1690341b..eca9fccf 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -177,8 +177,4 @@ bool initMqtt() mqtt->connect(); return true; } - -#else -bool initMqtt(){return false;} -void publishMqtt(){} #endif diff --git a/wled00/set.cpp b/wled00/set.cpp index 8755b7dd..43f28d11 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -287,8 +287,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (t >= 0 && t <= 63999) e131Universe = t; t = request->arg(F("DA")).toInt(); if (t >= 0 && t <= 510) DMXAddress = t; + t = request->arg(F("XX")).toInt(); + if (t >= 0 && t <= 150) DMXSegmentSpacing = t; t = request->arg(F("DM")).toInt(); - if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_MULTIPLE_RGBW) DMXMode = t; + if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_PRESET) DMXMode = t; t = request->arg(F("ET")).toInt(); if (t > 99 && t <= 65000) realtimeTimeoutMs = t; arlsForceMaxBri = request->hasArg(F("FB")); @@ -712,7 +714,9 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) lastEditTime = millis(); if (subPage != 2 && !doReboot) doSerializeConfig = true; //serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init) + #ifndef WLED_DISABLE_ALEXA if (subPage == 4) alexaInit(); + #endif } diff --git a/wled00/wled.cpp b/wled00/wled.cpp index beb9b2ff..23427146 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -47,7 +47,9 @@ void WLED::loop() #endif handleTime(); + #ifndef WLED_DISABLE_INFRARED handleIR(); // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too + #endif handleConnection(); handleSerial(); handleNotifications(); @@ -69,7 +71,9 @@ void WLED::loop() yield(); handleIO(); + #ifndef WLED_DISABLE_INFRARED handleIR(); + #endif #ifndef WLED_DISABLE_ALEXA handleAlexa(); #endif @@ -140,7 +144,9 @@ void WLED::loop() } if (millis() - lastMqttReconnectAttempt > 30000 || lastMqttReconnectAttempt == 0) { // lastMqttReconnectAttempt==0 forces immediate broadcast lastMqttReconnectAttempt = millis(); + #ifndef WLED_DISABLE_MQTT initMqtt(); + #endif yield(); // refresh WLED nodes list refreshNodeList(); @@ -497,8 +503,10 @@ void WLED::setup() // fill in unique mdns default if (strcmp(cmDNS, "x") == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6); +#ifndef WLED_DISABLE_MQTT if (mqttDeviceTopic[0] == 0) sprintf_P(mqttDeviceTopic, PSTR("wled/%*s"), 6, escapedMac.c_str() + 6); if (mqttClientID[0] == 0) sprintf_P(mqttClientID, PSTR("WLED-%*s"), 6, escapedMac.c_str() + 6); +#endif #ifdef WLED_ENABLE_ADALIGHT if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); @@ -798,9 +806,11 @@ void WLED::initInterfaces() } #endif +#ifndef WLED_DISABLE_ALEXA // init Alexa hue emulation if (alexaEnabled) alexaInit(); +#endif #ifndef WLED_DISABLE_OTA if (aOtaEnabled) @@ -846,7 +856,9 @@ void WLED::initInterfaces() e131.begin(e131Multicast, e131Port, e131Universe, E131_MAX_UNIVERSE_COUNT); ddp.begin(false, DDP_DEFAULT_PORT); reconnectHue(); +#ifndef WLED_DISABLE_MQTT initMqtt(); +#endif interfacesInited = true; wasConnected = true; } diff --git a/wled00/wled.h b/wled00/wled.h index 3d3a3d46..405af084 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -121,6 +121,7 @@ #define ESPALEXA_MAXDEVICES 10 // #define ESPALEXA_DEBUG #include "src/dependencies/espalexa/Espalexa.h" + #include "src/dependencies/espalexa/EspalexaDevice.h" #endif #ifndef WLED_DISABLE_BLYNK #include "src/dependencies/blynk/BlynkSimpleEsp.h" @@ -135,7 +136,9 @@ #endif #include "src/dependencies/e131/ESPAsyncE131.h" +#ifdef WLED_ENABLE_MQTT #include "src/dependencies/async-mqtt-client/AsyncMqttClient.h" +#endif #define ARDUINOJSON_DECODE_UNICODE 0 #include "src/dependencies/json/AsyncJson-v6.h" @@ -403,12 +406,18 @@ WLED_GLOBAL uint16_t e131Universe _INIT(1); // settings fo WLED_GLOBAL uint16_t e131Port _INIT(5568); // DMX in port. E1.31 default is 5568, Art-Net is 6454 WLED_GLOBAL byte DMXMode _INIT(DMX_MODE_MULTIPLE_RGB); // DMX mode (s.a.) WLED_GLOBAL uint16_t DMXAddress _INIT(1); // DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol] +WLED_GLOBAL uint16_t DMXSegmentSpacing _INIT(0); // Number of void/unused channels between each segments DMX channels WLED_GLOBAL byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT]; // to detect packet loss WLED_GLOBAL bool e131Multicast _INIT(false); // multicast or unicast WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering WLED_GLOBAL uint16_t pollReplyCount _INIT(0); // count number of replies for ArtPoll node report +// mqtt +WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); // used for other periodic tasks too +#ifndef WLED_DISABLE_MQTT +WLED_GLOBAL AsyncMqttClient *mqtt _INIT(NULL); WLED_GLOBAL bool mqttEnabled _INIT(false); +WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices) WLED_GLOBAL char mqttServer[33] _INIT(""); // both domains and IPs should work (no SSL) @@ -416,6 +425,10 @@ WLED_GLOBAL char mqttUser[41] _INIT(""); // optional: username WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID WLED_GLOBAL uint16_t mqttPort _INIT(1883); +#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) +#else +#define WLED_MQTT_CONNECTED false +#endif #ifndef WLED_DISABLE_HUESYNC WLED_GLOBAL bool huePollingEnabled _INIT(false); // poll hue bridge for light state @@ -595,11 +608,8 @@ WLED_GLOBAL uint8_t tpmPacketCount _INIT(0); WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0); WLED_GLOBAL bool useMainSegmentOnly _INIT(false); -// mqtt -WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); WLED_GLOBAL unsigned long lastInterfaceUpdate _INIT(0); WLED_GLOBAL byte interfaceUpdateCallMode _INIT(CALL_MODE_INIT); -WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers // alexa udp WLED_GLOBAL String escapedMac; @@ -660,8 +670,7 @@ WLED_GLOBAL AsyncWebServer server _INIT_N(((80))); #ifdef WLED_ENABLE_WEBSOCKETS WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws"))); #endif -WLED_GLOBAL AsyncClient* hueClient _INIT(NULL); -WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL); +WLED_GLOBAL AsyncClient *hueClient _INIT(NULL); WLED_GLOBAL AsyncWebHandler *editHandler _INIT(nullptr); // udp interface objects @@ -792,7 +801,6 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0); #define WLED_CONNECTED (WiFi.status() == WL_CONNECTED) #endif #define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0) -#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) #ifndef WLED_AP_SSID_UNIQUE #define WLED_SET_AP_SSID() do { \ diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 80bff059..141e6bc2 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -605,10 +605,14 @@ void serveSettings(AsyncWebServerRequest* request, bool post) case 4: response = request->beginResponse_P(200, "text/html", PAGE_settings_sync, PAGE_settings_sync_length); break; case 5: response = request->beginResponse_P(200, "text/html", PAGE_settings_time, PAGE_settings_time_length); break; case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break; +#ifdef WLED_ENABLE_DMX case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break; +#endif case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break; case 9: response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length); break; +#ifndef WLED_DISABLE_2D case 10: response = request->beginResponse_P(200, "text/html", PAGE_settings_2D, PAGE_settings_2D_length); break; +#endif case 251: { correctPIN = !strlen(settingsPIN); // lock if a pin is set createEditHandler(correctPIN); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 72acc673..b0674cf6 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -288,6 +288,9 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W if (subPage == 0) { + #ifndef WLED_DISABLE_2D // include only if 2D is compiled in + oappend(PSTR("gId('2dbtn').style.display='';")); + #endif #ifdef WLED_ENABLE_DMX // include only if DMX is enabled oappend(PSTR("gId('dmxbtn').style.display='';")); #endif @@ -512,6 +515,7 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W oappend(SET_F("hideNoDMX();")); // hide "not compiled in" message #endif sappend('v',SET_F("DA"),DMXAddress); + sappend('v',SET_F("XX"),DMXSegmentSpacing); sappend('v',SET_F("DM"),DMXMode); sappend('v',SET_F("ET"),realtimeTimeoutMs); sappend('c',SET_F("FB"),arlsForceMaxBri);