diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 34a9089..4f8a302 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -327,6 +327,10 @@ void setup() { } #endif +#if defined(POWER_SUPPLY) + pinMode(POWER_SUPPLY, OUTPUT); // output to control external power supply +#endif + // start ticker with 0.5 because we start in AP mode and try to connect ticker.attach(0.5, tick); @@ -561,7 +565,7 @@ void setup() { #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver #endif - fx_speed_actual = segState.speed[State.segment]; + fx_speed = segState.speed[State.segment]; brightness_trans = State.brightness; initStrip(); strip->setBrightness(0); @@ -652,11 +656,19 @@ void loop() { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); #endif + #if defined(POWER_SUPPLY) + digitalWrite(POWER_SUPPLY, LOW); // power off -> external power supply + #endif if (Config.transEffect) { brightness_trans = 0; } } } +#if defined(POWER_SUPPLY) + if (State.mode != OFF) { + if (prevmode != State.mode) {digitalWrite(POWER_SUPPLY, HIGH); } // power on -> external power supply + } +#endif if (State.mode == SET) { State.mode = HOLD; @@ -665,7 +677,7 @@ void loop() { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", State.segment); #endif - prevsegment = State.segment; + //prevsegment = State.segment; } // Mode if (segState.mode[State.segment] != fx_mode) { @@ -679,9 +691,10 @@ void loop() { //strip->setSpeed(State.segment, segState.speed[State.segment]); //strip->setColors(State.segment, segState.colors[State.segment]); strip->setMode(State.segment, segState.mode[State.segment]); + //strip->trigger; } //Color - /*if (memcmp(segmentState.colors[State.segment)], strip->getColors(State.segment), sizeof(segmentState.colors[State.segment)])) != 0) { + /*if (memcmp(segmentState.colors[prevsegment)], strip->getColors(prevsegment), sizeof(segmentState.colors[prevsegment)])) != 0) { convertColors(); }*/ // Brightness @@ -692,13 +705,12 @@ void loop() { brightness_trans = State.brightness; } // Speed - if (fx_speed_actual != segState.speed[State.segment]) { + if (fx_speed != segState.speed[State.segment]) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[State.segment]); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[prevsegment]); #endif } prevmode = SET; - //strip->trigger(); } if ((State.mode == HOLD) || ((State.mode == OFF) && (strip->getBrightness() > 0) && Config.transEffect)) { @@ -710,14 +722,16 @@ void loop() { } if (prevmode != State.mode) { - convertColors(); - if (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0) { - DBG_OUTPUT_PORT.println("Color changed!"); - trans_cnt_max = convertColorsFade(prevsegment); - trans_cnt = 1; - memcpy(segState.colors[prevsegment], hexcolors_trans, sizeof(hexcolors_trans)); + if (segState.mode[prevsegment] != FX_MODE_CUSTOM_0) { + convertColors(); + if (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0) { + DBG_OUTPUT_PORT.println("Color changed!"); + trans_cnt_max = convertColorsFade(prevsegment); + trans_cnt = 1; + memcpy(segState.colors[prevsegment], hexcolors_trans, sizeof(hexcolors_trans)); + } + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); } - strip->setSpeed(State.segment, convertSpeed(fx_speed_actual)); //strip->setBrightness(brightness_actual); #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 @@ -739,7 +753,7 @@ void loop() { (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println("State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); } if (updateSegState) { - (writeSegmentStateFS(updateSegState, State.segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); + (writeSegmentStateFS(updateSegState, prevsegment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); } if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); @@ -772,25 +786,27 @@ void loop() { } } // Async speed transition - if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed_actual != segState.speed[prevsegment])) { - //if (Config.transEffect) { - if (true == false) { // disabled for the moment + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed != segState.speed[prevsegment])) { + if (Config.transEffect) { + //if (true == false) { // disabled for the moment if (speedFadeDelay <= millis()) { - DBG_OUTPUT_PORT.println("Speed actual: "); - DBG_OUTPUT_PORT.println(fx_speed_actual); - if (fx_speed_actual < segState.speed[prevsegment]) { - fx_speed_actual++; + //DBG_OUTPUT_PORT.print("Speed trans actual: "); + if (fx_speed < segState.speed[prevsegment]) { + fx_speed++; } - if (fx_speed_actual > segState.speed[prevsegment]) { - fx_speed_actual--; + if (fx_speed > segState.speed[prevsegment]) { + fx_speed--; } + //DBG_OUTPUT_PORT.println(fx_speed); speedFadeDelay = millis() + TRANS_DELAY; - strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); if (State.mode == HOLD) strip->trigger(); } } else { - fx_speed_actual = segState.speed[State.segment]; - strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); + fx_speed = segState.speed[prevsegment]; + //DBG_OUTPUT_PORT.print("Speed actual: "); + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); + //DBG_OUTPUT_PORT.println(fx_speed); if (State.mode == HOLD) strip->trigger(); } } @@ -806,23 +822,29 @@ void loop() { strip->decreaseBrightness(1); } brightnessFadeDelay = millis() + TRANS_DELAY; - //if (State.mode == HOLD) strip->trigger(); - strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } else { brightness_trans = State.brightness; strip->setBrightness(brightness_trans); - if (State.mode == HOLD) strip->trigger(); } } -/* // Segment change only if color and speed transitions are finished, because they are segment specific + // Segment change only if color and speed transitions are finished, because they are segment specific if (prevsegment != State.segment) { - if ((memcmp(hexcolors_trans, strip->getColors(State.segment), sizeof(hexcolors_trans)) == 0) && (fx_speed_actual == segState.speed[State.segment])) { - State.segment = prevsegment; + DBG_OUTPUT_PORT.println("Segment not equal"); + if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + fx_speed = segState.speed[State.segment]; + DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i", prevsegment, State.segment); + prevsegment = State.segment; + } else if ((memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) == 0) && (fx_speed == segState.speed[prevsegment])) { + memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + fx_speed = segState.speed[State.segment]; + DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i\r\n", prevsegment, State.segment); + prevsegment = State.segment; } } -*/ + #if defined(ENABLE_REMOTE) handleRemote(); diff --git a/Arduino/McLighting/WS2812FX.cpp b/Arduino/McLighting/WS2812FX.cpp index 2a665c1..b9a4631 100644 --- a/Arduino/McLighting/WS2812FX.cpp +++ b/Arduino/McLighting/WS2812FX.cpp @@ -340,6 +340,10 @@ uint32_t* WS2812FX::getColors(uint8_t seg) { return _segments[seg].colors; } +uint8_t WS2812FX::getSegmentIndex(void) { + return _segment_index; +} + WS2812FX::Segment* WS2812FX::getSegment(void) { return &_segments[_segment_index]; } diff --git a/Arduino/McLighting/WS2812FX.h b/Arduino/McLighting/WS2812FX.h index e4d4932..115fee9 100644 --- a/Arduino/McLighting/WS2812FX.h +++ b/Arduino/McLighting/WS2812FX.h @@ -500,7 +500,8 @@ class WS2812FX : public Adafruit_NeoPixel { getNumSegments(void), get_random_wheel_index(uint8_t), getOptions(uint8_t), - getNumBytesPerPixel(void); + getNumBytesPerPixel(void), + getSegmentIndex(void); uint16_t random16(void), diff --git a/Arduino/McLighting/data/index.htm b/Arduino/McLighting/data/index.htm index 15dee02..23b9d91 100644 --- a/Arduino/McLighting/data/index.htm +++ b/Arduino/McLighting/data/index.htm @@ -1929,9 +1929,9 @@ function initSettings() { redrawColorPicker(); }); var settransitionEffects = document.getElementById("set-transitionEffects"); - settransitionEffects.checked = config.transitionEffects; + settransitionEffects.checked = config.ws_trans; settransitionEffects.addEventListener('change', ()=>{ - config.transitionEffects = settransitionEffects.checked; + config.ws_trans = settransitionEffects.checked; if (settransitionEffects.checked) { document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; ws_send("Ce1"); diff --git a/Arduino/McLighting/data/index.htm.gz b/Arduino/McLighting/data/index.htm.gz index e149892..7a3f8ff 100644 Binary files a/Arduino/McLighting/data/index.htm.gz and b/Arduino/McLighting/data/index.htm.gz differ diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index baaa99a..b6f474e 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -12,7 +12,7 @@ #define FX_OPTIONS 48 // ws2812fx Options 48 = SIZE_SMALL + FADE_MEDIUM is configurable just for the start; for WS2812FX setSegment OPTIONS, see: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md //#define LED_TYPE_WS2811 // Uncomment, if LED type uses 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #define LED_BUILTIN 2 // ESP-12F has the built in LED on GPIO2, see https://github.com/esp8266/Arduino/issues/2192 - +//#define POWER_SUPPLY 12 // PIN (12 / D6) If defined, enable output to control external power supply char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just for the start. Hostname should not contain spaces as this can break Home Assistant discovery if used. #define ENABLE_OTA 1 // If defined, enable Arduino OTA code. If set to 0 enable Arduino OTA code, if set to 1 enable ESP8266HTTPUpdateServer OTA code. @@ -183,7 +183,7 @@ struct { bool transEffect = false; } Config; -uint8_t fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t fx_speed = 196; // Global variable for storing the speed for effects while fading --> smaller == slower uint8_t fx_mode = 0; uint8_t brightness_trans = 0; // Global variable for storing the brightness before change uint32_t hexcolors_trans[3] = {}; // Color array of colors of WS2812FX before fading diff --git a/Arduino/McLighting/helper_functions.h b/Arduino/McLighting/helper_functions.h index e265b4e..9b60bc2 100644 --- a/Arduino/McLighting/helper_functions.h +++ b/Arduino/McLighting/helper_functions.h @@ -208,8 +208,9 @@ void initStrip(uint16_t _stripSize = Config.stripSize, uint8_t _num_segments = C (readSegmentStateFS(State.segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); strip->setSegment(State.segment, segState.start, segState.stop , segState.mode[State.segment], hexcolors_trans, convertSpeed(segState.speed[State.segment]), segState.options); - fx_speed_actual = segState.speed[State.segment]; + fx_speed = segState.speed[State.segment]; fx_mode = segState.mode[State.segment]; + brightness_trans = State.brightness; prevsegment = State.segment; strip->setCustomMode(0, F("Autoplay"), handleAuto); strip->setCustomMode(1, F("Custom WS"), handleCustomWS); @@ -244,11 +245,12 @@ void initStrip(uint16_t _stripSize = Config.stripSize, uint8_t _num_segments = C } void getSegmentParams(uint8_t _seg) { - segState.start = strip->getSegment(_seg)->start;; - segState.stop = strip->getSegment(_seg)->stop;; + segState.start = strip->getSegment(_seg)->start;; + segState.stop = strip->getSegment(_seg)->stop;; //segState.mode[_seg] = strip->getMode(_seg); //segState.speed[_seg] = unconvertSpeed(strip->getSpeed(_seg)); - fx_speed_actual = segState.speed[_seg]; + //fx_mode = segState.mode[_seg]; + //fx_speed = segState.speed[_seg]; main_color.white = ((segState.colors[_seg][0] >> 24) & 0xFF); main_color.red = ((segState.colors[_seg][0] >> 16) & 0xFF); main_color.green = ((segState.colors[_seg][0] >> 8) & 0xFF); diff --git a/Arduino/McLighting/htm_index_gz.h b/Arduino/McLighting/htm_index_gz.h index 3ed7ca7..a69ce8f 100644 --- a/Arduino/McLighting/htm_index_gz.h +++ b/Arduino/McLighting/htm_index_gz.h @@ -1,8 +1,7 @@ #include - -#define index_htm_gz_len 20709 +#define index_htm_gz_len 20708 static const char index_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0x1e, 0x16, 0x9a, 0x5d, 0x04, 0x00, 0x69, 0x6e, + 0x1f, 0x8b, 0x08, 0x08, 0x48, 0xb8, 0x9c, 0x5d, 0x04, 0x00, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0x5b, 0x77, 0x1b, 0x49, 0x11, 0x7e, 0xe7, 0x1c, 0xfe, 0xc3, 0x44, 0x81, 0x44, 0x62, 0x25, 0x59, 0x17, 0xdb, 0x38, 0x72, 0xe4, 0xc5, 0xc9, 0x3a, 0xd9, 0x40, @@ -1277,455 +1276,455 @@ static const char index_htm_gz[] PROGMEM ={ 0x15, 0xde, 0x68, 0xe9, 0xd5, 0xcb, 0x1b, 0xf0, 0x6c, 0xd6, 0x02, 0x4e, 0x2d, 0x14, 0xcc, 0xb2, 0xe2, 0xfd, 0x03, 0xc1, 0xb5, 0x9f, 0xf3, 0x92, 0x05, 0xc9, 0x9c, 0xce, 0x6e, 0xd1, 0x31, 0x92, 0x0f, 0xce, 0xcf, 0xe3, - 0x59, 0xdd, 0x4a, 0x56, 0xde, 0x77, 0x10, 0xa4, 0xb8, 0xbc, 0xd4, 0x24, - 0xc7, 0xca, 0x6f, 0x77, 0x40, 0x4a, 0xb1, 0xdb, 0xac, 0x77, 0x79, 0xaa, - 0x53, 0xc9, 0x97, 0x75, 0x5a, 0xac, 0x0a, 0x34, 0xfc, 0x22, 0x89, 0x8f, - 0xca, 0xf4, 0x82, 0xd4, 0xa5, 0xd3, 0x6d, 0x7e, 0x0c, 0xdd, 0x9d, 0x8e, - 0xc4, 0x43, 0x10, 0x3a, 0xdb, 0xd6, 0x9f, 0x7d, 0x40, 0x68, 0xcb, 0xf5, - 0xee, 0x74, 0xca, 0xeb, 0xb9, 0xfb, 0x90, 0xf5, 0xd4, 0xea, 0xe5, 0x9d, - 0x99, 0x2e, 0xae, 0x26, 0xc9, 0xb2, 0xf6, 0x64, 0x45, 0x1f, 0xa1, 0xa4, - 0xce, 0x4b, 0x2c, 0xd7, 0x6e, 0x6a, 0xef, 0xa4, 0xe8, 0xa0, 0x8d, 0xd6, - 0xd4, 0x7c, 0xc4, 0xa0, 0x0c, 0xad, 0x4c, 0x67, 0xaf, 0xfc, 0x32, 0xbe, - 0x21, 0xb0, 0x2a, 0x56, 0x14, 0xf4, 0x6d, 0xf2, 0x13, 0x1a, 0x97, 0x88, - 0xce, 0x58, 0x3f, 0x81, 0x01, 0x59, 0xa2, 0x8b, 0xa3, 0x71, 0xd1, 0xb0, - 0x37, 0xea, 0xf6, 0x86, 0x07, 0xdd, 0x57, 0x47, 0x6f, 0xbe, 0xd9, 0x7d, - 0xad, 0x1c, 0x6e, 0x4f, 0xc2, 0xed, 0xbf, 0xf1, 0x7a, 0x15, 0xdc, 0xbe, - 0x84, 0x1b, 0x0e, 0x1f, 0x77, 0xbb, 0x3b, 0x43, 0x38, 0xf9, 0x15, 0x12, - 0x18, 0x3b, 0x5f, 0xad, 0x16, 0xd3, 0x49, 0x83, 0xce, 0x43, 0x85, 0x86, - 0x50, 0x3e, 0x5f, 0xad, 0xf2, 0x78, 0x1b, 0x84, 0x6d, 0x96, 0x65, 0xab, - 0x44, 0x20, 0x73, 0x8a, 0x3f, 0x3c, 0xda, 0x47, 0x2b, 0xfe, 0xe8, 0xc5, - 0xe1, 0x70, 0xf8, 0x88, 0x1d, 0xc2, 0x97, 0x0f, 0x3e, 0xf8, 0xe0, 0x51, - 0x08, 0x65, 0x62, 0x79, 0x7b, 0x84, 0xe9, 0x66, 0x4b, 0x3b, 0xea, 0x76, - 0x7f, 0xc2, 0x17, 0x84, 0xea, 0xfb, 0x13, 0x42, 0xc9, 0xfe, 0x24, 0xb1, - 0xca, 0xfa, 0x13, 0xe6, 0xe9, 0x90, 0x8d, 0x16, 0x7d, 0x5c, 0x5a, 0xc0, - 0x9d, 0x59, 0x62, 0x88, 0x98, 0xe8, 0x28, 0xae, 0x2d, 0x20, 0x1f, 0xf1, - 0x12, 0xa9, 0xa0, 0x8e, 0xd5, 0x4b, 0x05, 0xa1, 0xa4, 0x54, 0x24, 0x56, - 0x99, 0x54, 0x30, 0xcf, 0x84, 0x6c, 0x2f, 0x15, 0xce, 0x9d, 0xa4, 0x13, - 0x2e, 0x15, 0x71, 0xe4, 0xbe, 0x49, 0x5f, 0x42, 0x80, 0x10, 0xd2, 0xf2, - 0x2c, 0xce, 0xc3, 0x53, 0x2e, 0x76, 0xe6, 0xb6, 0x45, 0x1a, 0x97, 0xc6, - 0xb7, 0x45, 0x9b, 0x4f, 0x17, 0xb6, 0x48, 0x1d, 0x66, 0x1f, 0x5b, 0x93, - 0xb9, 0x9c, 0xcc, 0x6c, 0x91, 0x3e, 0xcc, 0x8d, 0xda, 0xb3, 0x2f, 0xce, - 0x37, 0xe6, 0xf1, 0x4d, 0xbe, 0x43, 0xb7, 0xfe, 0x78, 0x3f, 0x9f, 0xc7, - 0x6b, 0x7e, 0x3a, 0x9d, 0x41, 0x92, 0xa2, 0xc9, 0x30, 0x66, 0x3b, 0x86, - 0xed, 0x0c, 0x1d, 0x8c, 0x11, 0xf5, 0x9f, 0x3d, 0x16, 0xcb, 0xe0, 0xfa, - 0x59, 0xc8, 0x81, 0x59, 0x75, 0x25, 0x52, 0x4d, 0xe5, 0xfd, 0x87, 0x65, - 0x39, 0x4d, 0xf7, 0xc0, 0xac, 0xfa, 0xe3, 0x10, 0x70, 0x4e, 0xb6, 0x6e, - 0x04, 0x1a, 0x8d, 0x46, 0xde, 0xf1, 0xed, 0x3e, 0x58, 0x49, 0x4e, 0xe2, - 0x0b, 0x78, 0x32, 0xa0, 0xdd, 0x58, 0x07, 0x7f, 0x01, 0x27, 0xeb, 0xb6, - 0x43, 0x9e, 0x07, 0x41, 0xdc, 0x02, 0x61, 0x3a, 0x5c, 0xbb, 0x1d, 0xd2, - 0x78, 0xe4, 0x76, 0x3b, 0x94, 0xf1, 0x20, 0xee, 0x96, 0x48, 0xf3, 0x10, - 0x74, 0xdb, 0xa1, 0x9d, 0xad, 0xe3, 0x6d, 0x35, 0xa3, 0x34, 0x36, 0xed, - 0x48, 0x3b, 0xfe, 0x4a, 0x1e, 0x30, 0x29, 0x02, 0x20, 0xc3, 0x5b, 0xc9, - 0x4b, 0xa7, 0x44, 0x90, 0xa5, 0xc3, 0x3d, 0xc7, 0x7c, 0x88, 0x18, 0x13, - 0x54, 0xc2, 0x1d, 0x15, 0x49, 0xa4, 0x0f, 0xeb, 0x35, 0x4d, 0xc6, 0x87, - 0x7c, 0x19, 0x42, 0x9d, 0xaf, 0xd3, 0xd4, 0x4f, 0x7a, 0x5d, 0xea, 0x8d, - 0x56, 0x22, 0x1e, 0x78, 0x0a, 0x5e, 0xc9, 0x0d, 0xb7, 0x95, 0xcf, 0x26, - 0xb3, 0x3c, 0x81, 0x95, 0x40, 0x7e, 0x97, 0x3f, 0xea, 0x96, 0x2b, 0x4b, - 0x16, 0xa4, 0x2d, 0x40, 0xd5, 0x52, 0x98, 0xac, 0x42, 0x63, 0x00, 0xda, - 0x80, 0x6d, 0xb2, 0x32, 0xe4, 0xa5, 0x06, 0xa5, 0x18, 0xa5, 0x36, 0xae, - 0xaf, 0x70, 0x10, 0xe8, 0xf1, 0xc5, 0xf3, 0xc9, 0x2c, 0x16, 0x8f, 0xb0, - 0x34, 0x89, 0xcc, 0x2b, 0xe6, 0xf1, 0xe5, 0x01, 0x21, 0xd5, 0x24, 0xa7, - 0x1a, 0x04, 0x1b, 0xb4, 0x0e, 0x24, 0x5f, 0xd6, 0x43, 0x64, 0x5e, 0x10, - 0xba, 0xa7, 0x17, 0xd6, 0xa5, 0xf8, 0x03, 0xd2, 0x9e, 0xb6, 0xa1, 0xa8, - 0x05, 0xb2, 0x69, 0x1e, 0xd6, 0xc9, 0x90, 0xb7, 0xb9, 0xc7, 0xf5, 0xfc, - 0x39, 0x78, 0x93, 0x54, 0x68, 0xbf, 0xba, 0x0a, 0x43, 0xb7, 0xad, 0x60, - 0x67, 0x82, 0x75, 0xec, 0x6b, 0xd5, 0x00, 0x5c, 0x5c, 0xef, 0x92, 0x41, - 0x14, 0xba, 0xee, 0x4d, 0x2b, 0xfa, 0x33, 0x69, 0xb2, 0xd7, 0xc6, 0x2a, - 0x9c, 0x81, 0x73, 0x89, 0x14, 0x33, 0x62, 0x1e, 0x40, 0x1b, 0xae, 0x99, - 0xc5, 0x19, 0x5d, 0xa4, 0x91, 0x8f, 0x77, 0x32, 0xae, 0x7f, 0x99, 0x86, - 0x64, 0x5e, 0x8e, 0xbd, 0x9a, 0xac, 0x9d, 0x8b, 0xb1, 0xea, 0xcf, 0xbe, - 0x1f, 0xe6, 0xf0, 0x59, 0x63, 0xd0, 0xe4, 0xe5, 0x30, 0x3d, 0x6a, 0x4d, - 0x58, 0xbd, 0x2c, 0x4f, 0xcc, 0xe8, 0x3b, 0xcf, 0xe7, 0x1f, 0xea, 0x3e, - 0x62, 0x39, 0x5b, 0x82, 0xab, 0xa6, 0xc1, 0x8f, 0xcc, 0x76, 0x23, 0xdd, - 0xf0, 0x5f, 0x93, 0x12, 0xd5, 0x16, 0x57, 0xa4, 0x3a, 0x5d, 0xa7, 0x59, - 0xe9, 0x42, 0xa4, 0xdd, 0xac, 0x93, 0xc5, 0xe2, 0xaf, 0x6a, 0x51, 0x94, - 0x2b, 0x97, 0x0e, 0x1b, 0x37, 0x69, 0xde, 0x23, 0x3f, 0x39, 0x02, 0x30, - 0x65, 0x43, 0x49, 0xed, 0xc4, 0xf3, 0x77, 0x6a, 0xc7, 0xd8, 0x97, 0xef, - 0xaf, 0x45, 0x75, 0x25, 0xee, 0xdd, 0x05, 0xe5, 0xda, 0xb0, 0x1d, 0x86, - 0xf7, 0xd1, 0xc4, 0x54, 0xfa, 0x36, 0xe4, 0xaa, 0x6c, 0x9e, 0xda, 0xd3, - 0x83, 0x52, 0xac, 0x21, 0xce, 0xba, 0xcd, 0xfb, 0xc0, 0xb3, 0xbe, 0x30, - 0x55, 0x0e, 0x51, 0xe3, 0x06, 0x5a, 0x1b, 0x66, 0x94, 0xf4, 0x16, 0x7b, - 0xc0, 0x89, 0x6a, 0x13, 0x36, 0x34, 0x16, 0xd4, 0xb7, 0x00, 0xc7, 0x52, - 0x8d, 0x61, 0xd5, 0x65, 0xdc, 0x3b, 0x97, 0x70, 0xcd, 0x9b, 0xd9, 0x57, - 0x19, 0xe8, 0xf2, 0xf5, 0xe5, 0x6d, 0x8f, 0xe1, 0x23, 0xf6, 0x50, 0xa7, - 0xda, 0xbb, 0xb1, 0xa2, 0x7c, 0x41, 0xa0, 0x68, 0xea, 0x1b, 0x63, 0xd7, - 0x1d, 0xc8, 0xca, 0xf4, 0x52, 0x2f, 0x33, 0x82, 0x62, 0x71, 0xbc, 0x94, - 0x37, 0xbf, 0x69, 0x17, 0xf3, 0xc5, 0xc9, 0x7c, 0xf4, 0xfa, 0xe8, 0x75, - 0xda, 0xc6, 0x7c, 0xf1, 0xf1, 0x6c, 0x72, 0xbe, 0xbf, 0xdb, 0x51, 0x2e, - 0xd6, 0xbb, 0xcb, 0xe4, 0x6a, 0x42, 0x95, 0x48, 0x32, 0x62, 0x78, 0xce, - 0x63, 0xbb, 0x90, 0x08, 0xe8, 0xe6, 0x55, 0x84, 0x17, 0xe4, 0xf9, 0x1d, - 0x72, 0x06, 0xa5, 0x0c, 0xf1, 0x4b, 0xd7, 0x77, 0xdd, 0xb5, 0x83, 0x62, - 0x80, 0xfd, 0x70, 0x22, 0xc3, 0x4b, 0xf0, 0xbf, 0x1a, 0x72, 0x17, 0x70, - 0x4f, 0xd6, 0x20, 0xc6, 0x6d, 0x03, 0xbb, 0x17, 0x22, 0x55, 0x21, 0xbc, - 0xd9, 0xb7, 0xf1, 0xf4, 0x64, 0x05, 0x1e, 0x7b, 0x4e, 0x07, 0x17, 0x28, - 0x6c, 0xf7, 0x22, 0xa6, 0xa7, 0xfa, 0xc5, 0x06, 0x38, 0x90, 0xbf, 0xb3, - 0xdf, 0x10, 0x17, 0x1c, 0x1d, 0xb2, 0x21, 0xd6, 0x8c, 0xe7, 0xc2, 0xc9, - 0xc0, 0xaf, 0xe2, 0x3c, 0x4d, 0xf0, 0xd9, 0xf1, 0x91, 0x48, 0x4b, 0x63, - 0x85, 0xf3, 0x7e, 0xbc, 0x98, 0xdc, 0x7e, 0x94, 0xae, 0xae, 0x3f, 0x9c, - 0xe0, 0x33, 0xd9, 0x0a, 0x68, 0x1e, 0x4f, 0x37, 0x17, 0xfc, 0x3d, 0x73, - 0x60, 0xeb, 0xc8, 0x7c, 0xa9, 0x58, 0xe0, 0xbf, 0xbb, 0x58, 0x98, 0xa1, - 0x04, 0xcc, 0xab, 0xa3, 0xc7, 0x8b, 0x15, 0x8c, 0x93, 0xeb, 0x55, 0x0e, - 0xba, 0x90, 0xc0, 0x00, 0x76, 0xcb, 0xd0, 0xcd, 0xd3, 0x18, 0xce, 0xb4, - 0xdb, 0xdc, 0xde, 0xe7, 0xcc, 0x55, 0x08, 0x8f, 0x08, 0x13, 0x9d, 0x20, - 0xec, 0x90, 0x06, 0x32, 0x86, 0x52, 0x22, 0xaa, 0x32, 0xeb, 0x7c, 0x36, - 0x59, 0x6e, 0xa8, 0x24, 0x4a, 0x9d, 0x1f, 0x1e, 0x56, 0x30, 0x4b, 0xd1, - 0x08, 0xee, 0x7e, 0x8c, 0xe3, 0xf5, 0x31, 0x01, 0xf3, 0xca, 0xde, 0x6b, - 0x0e, 0x7b, 0x2d, 0x7b, 0xd0, 0x0a, 0xa7, 0x67, 0x3a, 0x58, 0xf9, 0xc3, - 0xec, 0x68, 0x1f, 0x8c, 0x19, 0x4f, 0xe5, 0xdc, 0x58, 0xd1, 0xe8, 0x03, - 0x24, 0x75, 0x1d, 0xd3, 0xf5, 0x84, 0xd4, 0x32, 0xd7, 0xb3, 0xb1, 0xdb, - 0x09, 0xb4, 0x6a, 0x4c, 0x83, 0x79, 0x57, 0x58, 0xd4, 0xaa, 0xb4, 0xe9, - 0xab, 0x15, 0x04, 0x68, 0x2a, 0x0d, 0x21, 0x30, 0x0a, 0x7e, 0x0f, 0x73, - 0x2c, 0xb1, 0x15, 0xbf, 0x49, 0xa1, 0xb3, 0xd2, 0x00, 0xc4, 0xe1, 0x40, - 0xf1, 0xf9, 0xcf, 0x92, 0xd3, 0x25, 0xb2, 0xf6, 0x47, 0xb2, 0xf6, 0x1c, - 0x5a, 0xa9, 0x0e, 0x5e, 0x1c, 0xb4, 0x55, 0x07, 0xd3, 0xc4, 0xe5, 0xcb, - 0x01, 0x74, 0x8f, 0x2b, 0x27, 0x16, 0x92, 0x0a, 0x3c, 0xeb, 0x86, 0xf4, - 0x00, 0x8e, 0x48, 0x08, 0x62, 0x92, 0xf6, 0x95, 0xec, 0x4f, 0xc0, 0x59, - 0xd1, 0x71, 0x71, 0x2d, 0xcf, 0x8a, 0x34, 0x72, 0xf8, 0xc6, 0x10, 0x03, - 0x75, 0x4d, 0xd2, 0xf9, 0x26, 0x59, 0xae, 0xe0, 0xab, 0xea, 0xce, 0x50, - 0x7a, 0x79, 0xd0, 0x90, 0xe3, 0x82, 0x3a, 0x0a, 0x4a, 0xa9, 0x06, 0xd5, - 0x13, 0xc8, 0x20, 0x7d, 0x9d, 0x40, 0xb5, 0xd2, 0x8a, 0x30, 0xd8, 0x98, - 0xc0, 0x91, 0x9c, 0x92, 0x31, 0x9c, 0x1e, 0xf5, 0xd4, 0xb1, 0xfd, 0xee, - 0x41, 0x35, 0x83, 0xf1, 0x3c, 0x9c, 0xbf, 0x80, 0x1e, 0xf3, 0xda, 0x6b, - 0x16, 0xce, 0xf3, 0xf5, 0x1d, 0x8b, 0x7b, 0xdd, 0x52, 0x3b, 0xbf, 0x3b, - 0x1d, 0x3f, 0x92, 0x19, 0xc9, 0xed, 0x35, 0x68, 0xdc, 0xba, 0x4a, 0xd8, - 0x7e, 0xc4, 0x91, 0x57, 0xda, 0x64, 0xad, 0x82, 0xc5, 0xfd, 0x3e, 0xf4, - 0xaf, 0xad, 0x48, 0xbc, 0xdf, 0xdf, 0xaa, 0xc4, 0x9f, 0x57, 0x78, 0xb2, - 0x6b, 0xd6, 0x59, 0xda, 0xb7, 0xc6, 0x4c, 0x19, 0x38, 0x0f, 0x23, 0xa1, - 0xd1, 0x53, 0xef, 0x83, 0xda, 0x8e, 0x5c, 0x92, 0xe0, 0xb6, 0xfb, 0x80, - 0xa0, 0x57, 0xcb, 0xc0, 0x46, 0xbb, 0x0f, 0x88, 0x6e, 0x03, 0x56, 0xa4, - 0x18, 0xd1, 0xf5, 0xf1, 0x97, 0xc4, 0xa4, 0xe4, 0x32, 0x50, 0x40, 0xb2, - 0x14, 0xc0, 0x2c, 0x92, 0xc2, 0xc7, 0x26, 0x45, 0xb2, 0x7f, 0x3e, 0x49, - 0x16, 0xb1, 0x88, 0x71, 0x52, 0x2d, 0x5b, 0x60, 0xd8, 0x64, 0xd9, 0x61, - 0xd8, 0x64, 0xb7, 0xda, 0xb6, 0x02, 0xfe, 0x26, 0x5d, 0x94, 0xd8, 0xd2, - 0xda, 0xa9, 0xd4, 0xbf, 0x3b, 0x0a, 0xbd, 0x15, 0x19, 0x89, 0xe2, 0x34, - 0x82, 0x64, 0x32, 0x90, 0x8c, 0x3e, 0xb4, 0x7e, 0x7b, 0x19, 0x2f, 0xf9, - 0xa0, 0xaa, 0x44, 0x9a, 0x64, 0xe4, 0x81, 0xf5, 0xe8, 0xa5, 0x19, 0x8a, - 0x05, 0x41, 0x52, 0x17, 0xc3, 0x2f, 0xa4, 0xa6, 0x3f, 0xc7, 0xa9, 0xaf, - 0x35, 0xd4, 0x88, 0xe0, 0x3e, 0xe9, 0xe2, 0xea, 0x78, 0xd1, 0x4e, 0x54, - 0x9a, 0x3b, 0xc5, 0x4b, 0x8a, 0xd6, 0x8f, 0xe7, 0x6e, 0x80, 0x34, 0x02, - 0x49, 0xe3, 0xf3, 0x34, 0xce, 0x2e, 0x9f, 0xd1, 0x2a, 0x29, 0x4c, 0x42, - 0xf9, 0xd0, 0xff, 0x44, 0xfc, 0x8a, 0xa8, 0xaf, 0xa9, 0xe3, 0x5e, 0x2f, - 0x75, 0xba, 0x3d, 0x72, 0x7a, 0x77, 0xb1, 0xac, 0x06, 0x86, 0x4b, 0x79, - 0x2a, 0x42, 0x8b, 0x1b, 0x58, 0x89, 0xb0, 0x5e, 0x22, 0xe8, 0xb6, 0x1a, - 0x78, 0x76, 0x76, 0xca, 0x1e, 0x27, 0x54, 0x35, 0x17, 0xf3, 0x87, 0x11, - 0xd6, 0xbd, 0x19, 0xea, 0xb1, 0x40, 0xdd, 0x6b, 0x8e, 0xfa, 0x9b, 0x40, - 0x7d, 0x8c, 0xa8, 0x41, 0x9b, 0x1b, 0xa5, 0x3d, 0x0e, 0x5a, 0xed, 0xe5, - 0x4e, 0x33, 0x12, 0xe1, 0xdd, 0x0e, 0x88, 0x53, 0xbf, 0x0b, 0xe2, 0xb1, - 0x6d, 0xdf, 0xc3, 0xf8, 0xa5, 0xb7, 0xd2, 0x51, 0xde, 0x6a, 0x0f, 0x24, - 0x2f, 0xa1, 0x69, 0x17, 0xe4, 0x13, 0xa1, 0xda, 0x4e, 0x68, 0x47, 0x78, - 0xa3, 0xe7, 0x33, 0x8b, 0xfe, 0xe6, 0xed, 0x93, 0x5d, 0x5f, 0xa5, 0x3f, - 0x5d, 0x5d, 0x30, 0x1a, 0x11, 0xb3, 0xb2, 0x5a, 0x50, 0xae, 0x5e, 0x0b, - 0x4a, 0xf0, 0x56, 0x85, 0x72, 0xf4, 0xca, 0xc8, 0xc0, 0x6f, 0xf4, 0xd9, - 0xb4, 0x4a, 0xe8, 0x3a, 0xb8, 0x63, 0x62, 0x9e, 0xde, 0x1e, 0xd3, 0xd5, - 0xc2, 0xb7, 0xc7, 0xda, 0x18, 0x32, 0x50, 0xf3, 0x66, 0xe2, 0xac, 0xa1, - 0x43, 0xe4, 0xda, 0x15, 0xf5, 0x57, 0xef, 0x6c, 0xb6, 0xb2, 0x2c, 0x41, - 0xd6, 0x45, 0x5a, 0xb1, 0xc6, 0x15, 0xb2, 0xc6, 0xfc, 0x36, 0x65, 0x77, - 0xda, 0x84, 0xfd, 0x13, 0xe5, 0x92, 0xd7, 0x34, 0x64, 0xaf, 0xf9, 0x5b, - 0x08, 0xd2, 0x43, 0xf0, 0x47, 0x5a, 0xe4, 0xc0, 0xa1, 0x1b, 0x3a, 0xd0, - 0xaf, 0xcb, 0xe2, 0x38, 0x06, 0x0f, 0x01, 0x1b, 0xd0, 0x47, 0x8b, 0xe8, - 0x49, 0x41, 0xb1, 0x8f, 0x95, 0x66, 0x23, 0x79, 0x41, 0x9a, 0xc7, 0x40, - 0x1e, 0x20, 0x6d, 0x9d, 0x43, 0x50, 0xd4, 0xb0, 0xd7, 0x5c, 0x0a, 0xcc, - 0x9d, 0x9d, 0xa0, 0x45, 0xd1, 0x47, 0x64, 0xf9, 0x1e, 0xc9, 0x4d, 0x5e, - 0xf1, 0x8a, 0x21, 0x36, 0xd9, 0x12, 0x7a, 0xab, 0xbb, 0xed, 0x64, 0x56, - 0x01, 0xca, 0x07, 0x76, 0xe1, 0xdf, 0xe7, 0x78, 0x44, 0x46, 0x46, 0xd9, - 0x70, 0x5f, 0xf1, 0x30, 0xa3, 0x17, 0x8c, 0x75, 0xe8, 0x23, 0x16, 0x74, - 0x3a, 0xcf, 0x1f, 0x06, 0x21, 0xe0, 0x35, 0x0e, 0x5c, 0x2b, 0x2e, 0xe7, - 0x88, 0x72, 0xc7, 0x05, 0x60, 0x08, 0x41, 0xf5, 0x46, 0x73, 0xf0, 0x73, - 0x25, 0xee, 0xeb, 0xd3, 0x16, 0x25, 0x4b, 0xe6, 0xaa, 0x91, 0x28, 0xa0, - 0x1b, 0x3b, 0x56, 0xaf, 0xbf, 0x62, 0xd4, 0x37, 0x0f, 0xb0, 0xf5, 0x48, - 0x76, 0x48, 0x01, 0x6e, 0x4d, 0x69, 0x4f, 0x5b, 0xb4, 0xe1, 0x09, 0x3d, - 0xdd, 0xc7, 0x2f, 0x36, 0x67, 0x14, 0x65, 0xac, 0x56, 0x30, 0x04, 0xeb, - 0xc8, 0x04, 0xe0, 0xee, 0xac, 0xdb, 0xf1, 0x63, 0x05, 0x7e, 0x14, 0x12, - 0x1b, 0xc0, 0x7f, 0xbf, 0x3f, 0xa8, 0xf5, 0xf1, 0x92, 0xb5, 0xcb, 0x92, - 0xcd, 0x13, 0xc0, 0x8c, 0x0b, 0xf0, 0xa3, 0x80, 0x1b, 0xfa, 0xfe, 0x7b, - 0xf6, 0x21, 0x0c, 0x9d, 0xdf, 0x3c, 0x2b, 0xd3, 0x48, 0xa0, 0xe5, 0x28, - 0x25, 0x80, 0x87, 0xea, 0x25, 0x9d, 0x27, 0x0a, 0x56, 0x49, 0xe7, 0x59, - 0x6e, 0x45, 0xa3, 0x46, 0x19, 0x2b, 0xf5, 0xd0, 0x7e, 0x2e, 0x5c, 0x51, - 0x0d, 0xd3, 0x40, 0xab, 0x4e, 0x74, 0xa6, 0x22, 0xb8, 0x4e, 0xee, 0x23, - 0x28, 0x8a, 0x08, 0x3c, 0x71, 0x77, 0x14, 0x84, 0x95, 0x1a, 0x58, 0xc3, - 0x40, 0xac, 0x0b, 0x03, 0x6b, 0x14, 0x88, 0x35, 0x35, 0xb0, 0xf6, 0x02, - 0xb1, 0xe0, 0x1c, 0x27, 0x8f, 0xd1, 0xf1, 0x74, 0xf5, 0x71, 0x7c, 0x13, - 0x9d, 0xea, 0x75, 0xec, 0x19, 0xbc, 0xf7, 0x0c, 0x9e, 0x7a, 0x46, 0x59, - 0x67, 0xdd, 0xb0, 0xd2, 0xae, 0x47, 0x06, 0x93, 0x8f, 0x03, 0x99, 0x4c, - 0x4d, 0xb4, 0xfd, 0x40, 0xb4, 0x0b, 0x13, 0xed, 0x20, 0x10, 0x6d, 0x6a, - 0xa2, 0xbd, 0x1e, 0x88, 0x06, 0x92, 0x1c, 0x95, 0x88, 0xf2, 0xb1, 0x21, - 0xae, 0x7d, 0xe3, 0xd7, 0x01, 0xfe, 0x52, 0x85, 0x85, 0x8b, 0x72, 0xcf, - 0xe0, 0xf2, 0x8d, 0x40, 0x2e, 0x53, 0x13, 0xed, 0xcd, 0x40, 0xb4, 0x0b, - 0x13, 0x6d, 0x18, 0xda, 0x01, 0xa6, 0x16, 0x5e, 0x68, 0x17, 0x00, 0x61, - 0xee, 0x95, 0x08, 0xf3, 0x0d, 0x43, 0x60, 0x6f, 0x9a, 0x5a, 0x6a, 0x29, - 0xed, 0x10, 0xc4, 0xf9, 0x10, 0xc3, 0x21, 0x5a, 0x12, 0x3b, 0xbe, 0xf0, - 0xb8, 0x6a, 0x45, 0x91, 0x55, 0xc6, 0xa7, 0x1d, 0xa4, 0x25, 0x4c, 0xb1, - 0xea, 0x98, 0xb4, 0xd0, 0x0e, 0x65, 0x88, 0xd5, 0x71, 0x68, 0x07, 0xd3, - 0x52, 0xbc, 0xea, 0xd8, 0xb3, 0x83, 0x6b, 0x81, 0x18, 0x60, 0x6e, 0x2b, - 0x04, 0x35, 0x6a, 0x2d, 0xa8, 0x51, 0x6b, 0x49, 0x8d, 0xda, 0x8a, 0x6a, - 0xd4, 0x5a, 0x56, 0xa3, 0x46, 0xc2, 0x2a, 0x91, 0xd5, 0x5e, 0x6b, 0x59, - 0xed, 0xb5, 0x96, 0xd5, 0x5e, 0x5b, 0x59, 0xed, 0xb5, 0x96, 0xd5, 0x5e, - 0xb8, 0xac, 0xfc, 0xce, 0x25, 0x7f, 0x71, 0xb3, 0x91, 0x53, 0x59, 0xf1, - 0x30, 0xe5, 0x9d, 0x13, 0x85, 0xd5, 0x7e, 0x9b, 0x32, 0x24, 0x54, 0x6c, - 0x49, 0x6c, 0xd8, 0x20, 0x97, 0xab, 0xe2, 0x69, 0xcb, 0xbb, 0xfa, 0xc7, - 0x2d, 0x83, 0x42, 0xbb, 0x96, 0x85, 0x72, 0x0d, 0xf2, 0x7e, 0x65, 0xe4, - 0xd1, 0x5a, 0xfe, 0x3c, 0xef, 0x63, 0xd6, 0xf2, 0x07, 0x30, 0x5e, 0xfe, - 0x28, 0x2b, 0xcc, 0x3b, 0xaf, 0x78, 0x60, 0xf3, 0xae, 0xfe, 0x89, 0xcd, - 0xa0, 0x70, 0xa9, 0xa5, 0xe1, 0x51, 0x83, 0xf9, 0xf3, 0xbf, 0xd1, 0x79, - 0x57, 0xff, 0x4a, 0x27, 0x0b, 0x09, 0x6c, 0x5a, 0x1a, 0xc8, 0x34, 0x84, - 0xbf, 0x8a, 0x67, 0x3e, 0xef, 0x2a, 0x1e, 0xfa, 0x0c, 0x99, 0x72, 0xcf, - 0x96, 0x56, 0xe3, 0x2a, 0x5a, 0x81, 0x9c, 0x01, 0x85, 0x5a, 0xce, 0xcc, - 0xb7, 0x42, 0x03, 0x16, 0x03, 0x66, 0xab, 0x4d, 0x09, 0x63, 0xb3, 0xb0, - 0xe5, 0x80, 0xbf, 0xec, 0xad, 0xd1, 0xb0, 0x8b, 0x81, 0x56, 0x3d, 0xfe, - 0x82, 0xf7, 0x4b, 0x19, 0x0b, 0x7f, 0x29, 0x33, 0xac, 0x42, 0xd7, 0x0d, - 0x9e, 0xcd, 0xa4, 0x3f, 0xf3, 0x04, 0xee, 0x76, 0x0a, 0xd5, 0x96, 0x48, - 0xc3, 0x06, 0xbb, 0x5d, 0x09, 0x1a, 0xe0, 0xea, 0x5e, 0x37, 0x85, 0x1f, - 0x35, 0x45, 0xd8, 0xab, 0x42, 0x00, 0x2d, 0x0f, 0x1a, 0x71, 0xc3, 0xdf, - 0xa5, 0xbd, 0xab, 0x78, 0x99, 0xb6, 0xb6, 0x4f, 0x02, 0x8c, 0x57, 0x93, - 0x21, 0x3d, 0xb0, 0x47, 0x96, 0xbd, 0x6b, 0x7b, 0x57, 0xf7, 0xb2, 0x6d, - 0xe3, 0x48, 0x25, 0x2e, 0x9b, 0x44, 0x29, 0xd4, 0xda, 0x52, 0xf8, 0x9c, - 0x70, 0xd3, 0xe1, 0x09, 0xf2, 0x63, 0x50, 0x3a, 0x6a, 0x76, 0x16, 0xdf, - 0xba, 0xf7, 0x1b, 0x1c, 0xe0, 0xae, 0x39, 0x7d, 0xbc, 0xf9, 0x5b, 0x5b, - 0xc0, 0x70, 0xd4, 0xbe, 0x00, 0x71, 0xf7, 0x37, 0x30, 0xe4, 0x56, 0x73, - 0xfa, 0x70, 0xf7, 0xb7, 0xb6, 0x02, 0x07, 0xb0, 0xfb, 0x19, 0xd4, 0x8f, - 0xf0, 0x8d, 0x39, 0x30, 0x30, 0x8d, 0x56, 0x43, 0x61, 0x2d, 0x26, 0x58, - 0x4d, 0x00, 0x5e, 0x1d, 0x73, 0xc3, 0x17, 0x76, 0xec, 0x13, 0x28, 0x6e, - 0x49, 0x04, 0x36, 0x00, 0x3f, 0x95, 0x5e, 0xb2, 0x2a, 0x7e, 0x88, 0xe3, - 0xca, 0xec, 0x6d, 0xb6, 0xeb, 0x2f, 0xcd, 0x7f, 0xe3, 0x80, 0x4e, 0x92, - 0xdd, 0x31, 0x7a, 0x7e, 0xed, 0x50, 0x51, 0xeb, 0xb1, 0x64, 0xce, 0x7f, - 0x12, 0x9c, 0x3a, 0x4a, 0x19, 0x38, 0x09, 0xa0, 0xe4, 0x80, 0x93, 0xff, - 0xf6, 0xd4, 0x9e, 0x79, 0x66, 0xf5, 0xee, 0xc3, 0x27, 0x2e, 0x80, 0xff, - 0x31, 0x95, 0xb2, 0x92, 0xe8, 0x2e, 0x16, 0xfb, 0x8a, 0xfe, 0x05, 0x92, - 0x16, 0x64, 0xf9, 0x13, 0x2c, 0x55, 0x9c, 0x67, 0xf4, 0x84, 0x49, 0xba, - 0x5a, 0x64, 0xe5, 0x80, 0x72, 0x63, 0x86, 0x10, 0x5c, 0x38, 0x99, 0x2f, - 0xaa, 0x40, 0xaf, 0xa1, 0x1e, 0xd5, 0x9c, 0x46, 0x32, 0x50, 0xd8, 0x39, - 0x14, 0x93, 0x5d, 0xc6, 0xf3, 0x17, 0x8c, 0xf1, 0x3f, 0xe8, 0x76, 0x5b, - 0x69, 0x09, 0x3e, 0xac, 0x8a, 0x82, 0xa0, 0x81, 0x4b, 0x49, 0x91, 0xde, - 0xa1, 0x24, 0x68, 0x83, 0xac, 0xf8, 0xe5, 0xdb, 0x77, 0x2a, 0x32, 0x99, - 0x7c, 0x17, 0xb6, 0xf6, 0x60, 0xd6, 0x13, 0x80, 0x4e, 0x26, 0x8b, 0xe4, - 0x17, 0xd8, 0x3d, 0x1c, 0x0c, 0x06, 0x0e, 0x67, 0xea, 0xea, 0x9e, 0x7a, - 0xa0, 0x88, 0x94, 0x9b, 0xd7, 0xc9, 0x07, 0x5c, 0x66, 0x6d, 0x8c, 0xf5, - 0xfa, 0x26, 0x77, 0x2b, 0xa1, 0x60, 0x97, 0x2b, 0x75, 0xd2, 0xfa, 0x53, - 0xf1, 0x7c, 0x26, 0xd8, 0x1c, 0x9f, 0x5a, 0xaa, 0x63, 0x1d, 0xfc, 0xfc, - 0x4c, 0xd3, 0x1b, 0x5d, 0xcd, 0xf6, 0x09, 0x6b, 0xa9, 0x15, 0x71, 0x3f, - 0x7c, 0x14, 0xbd, 0xc7, 0xf1, 0xe8, 0xb0, 0x7e, 0x69, 0xff, 0xe5, 0xd2, - 0x2a, 0xef, 0xe0, 0x33, 0xb5, 0xf8, 0xe7, 0x05, 0x52, 0x1a, 0x25, 0xcf, - 0x0e, 0x54, 0x5d, 0x01, 0x9b, 0xe1, 0x65, 0x47, 0x46, 0x7b, 0xbb, 0x6a, - 0xeb, 0xd8, 0x3d, 0xe5, 0x46, 0xe7, 0x65, 0xc4, 0x9e, 0x30, 0xe9, 0xa0, - 0xbb, 0x05, 0x7c, 0xc2, 0x10, 0x88, 0x74, 0x5a, 0x02, 0x1e, 0xf9, 0x77, - 0x97, 0x0d, 0x62, 0xea, 0xa0, 0xb7, 0x4c, 0x7a, 0x61, 0x0c, 0xc7, 0x81, - 0xa8, 0x90, 0x90, 0x43, 0xc0, 0x95, 0x07, 0xeb, 0xcb, 0xb8, 0xd4, 0x4f, - 0x2d, 0xe6, 0x2b, 0xe2, 0x19, 0xd1, 0x07, 0x9b, 0x74, 0xe1, 0x39, 0x0f, - 0xe0, 0x72, 0xac, 0x8c, 0xbb, 0xf7, 0x64, 0xb9, 0xbc, 0xbc, 0xf8, 0x8c, - 0xaf, 0x92, 0x61, 0x3f, 0xa3, 0xf4, 0x28, 0xa3, 0x4d, 0x45, 0xdf, 0xf3, - 0x6f, 0x1c, 0x83, 0xf6, 0xa1, 0x38, 0x10, 0x10, 0xae, 0x0b, 0x81, 0x00, - 0xe3, 0x7b, 0x1b, 0x34, 0xb0, 0xe5, 0x2d, 0x31, 0xdb, 0xa0, 0xd1, 0x22, - 0x5e, 0x6b, 0xc4, 0x96, 0xbc, 0xe2, 0xfa, 0x5f, 0x5b, 0xbc, 0x96, 0x45, - 0xe2, 0x64, 0xaa, 0x55, 0x99, 0x84, 0x58, 0x5d, 0x28, 0x74, 0x0e, 0x5b, - 0x75, 0xee, 0xed, 0x4e, 0xea, 0x1f, 0xd6, 0x24, 0xf8, 0x34, 0x0f, 0xbb, - 0xd1, 0x06, 0x70, 0x66, 0xa8, 0x53, 0x75, 0x1f, 0x0c, 0x68, 0x94, 0x5f, - 0x07, 0x83, 0x4c, 0xba, 0x09, 0xd6, 0x60, 0x10, 0x90, 0x3d, 0xc7, 0xac, - 0x62, 0x2c, 0xcf, 0x2b, 0xb0, 0x21, 0xfb, 0xf5, 0x57, 0x23, 0x6d, 0x0c, - 0x69, 0xe8, 0xec, 0xc1, 0xb0, 0x63, 0x42, 0xee, 0xbf, 0xde, 0x05, 0x5e, - 0xf8, 0x00, 0xf2, 0xf5, 0xc9, 0xd3, 0x2f, 0x3e, 0x63, 0xd0, 0xcd, 0x3f, - 0xfb, 0xe2, 0xfd, 0x0f, 0xac, 0x57, 0xb6, 0x2a, 0xaf, 0x0b, 0x8a, 0xde, - 0xed, 0xbf, 0x21, 0x2d, 0xf0, 0x1f, 0xfc, 0x92, 0x34, 0x27, 0xdb, 0xe8, - 0xce, 0x5c, 0xd8, 0x7b, 0x2b, 0x1c, 0x06, 0x98, 0x73, 0x11, 0x8d, 0x65, - 0x02, 0x99, 0xd8, 0xe8, 0x0e, 0xab, 0xbf, 0xc9, 0xde, 0xe6, 0x7b, 0x4b, - 0xf5, 0x27, 0x14, 0x1f, 0xc8, 0x6d, 0x80, 0xe2, 0x25, 0x29, 0xa5, 0x20, - 0xfb, 0x07, 0xc0, 0x02, 0xdd, 0x9b, 0xfb, 0xfa, 0xe9, 0x17, 0x5f, 0x7e, - 0xfa, 0xee, 0xf7, 0xa6, 0xbc, 0xa5, 0x5d, 0x46, 0x70, 0x71, 0x0b, 0x39, - 0xa2, 0x21, 0xd2, 0xb2, 0xfa, 0xa5, 0x06, 0x1c, 0x7c, 0xb0, 0x52, 0x58, - 0x7e, 0xd8, 0x44, 0x01, 0x57, 0x53, 0xa6, 0x33, 0x01, 0x65, 0x94, 0xd5, - 0xda, 0x90, 0xbf, 0x96, 0xaf, 0xf3, 0x5a, 0x72, 0x6d, 0x7f, 0xf6, 0xed, - 0x09, 0x47, 0x7b, 0x3e, 0x65, 0xf7, 0xe9, 0xa3, 0xd4, 0xfc, 0x66, 0xfa, - 0xa1, 0x34, 0xae, 0x9d, 0xa6, 0x9a, 0x5d, 0x4f, 0x80, 0xd4, 0x76, 0xbe, - 0x56, 0x1d, 0x50, 0xeb, 0x18, 0x01, 0xdd, 0x90, 0xda, 0xe5, 0xbf, 0xa9, - 0x51, 0x6f, 0x70, 0x8d, 0x7a, 0xfa, 0xcd, 0xbf, 0xa6, 0x7a, 0x08, 0x1c, - 0x5e, 0xbf, 0x37, 0xc5, 0x08, 0xf1, 0xc1, 0x70, 0xb0, 0x37, 0xfc, 0xd7, - 0xd4, 0xb1, 0x49, 0x13, 0x1e, 0xec, 0x8a, 0x2a, 0x7e, 0x98, 0xa4, 0xf1, - 0x68, 0x77, 0x38, 0xfa, 0xd7, 0xd4, 0x92, 0x03, 0xd7, 0x3e, 0xcb, 0xfd, - 0xdc, 0x35, 0x40, 0xe0, 0xbf, 0xac, 0x0a, 0xce, 0x23, 0xd5, 0x66, 0x6b, - 0xed, 0x36, 0xba, 0xef, 0xdf, 0x59, 0x9d, 0x9f, 0x37, 0x8a, 0x5e, 0xa4, - 0x86, 0xca, 0x56, 0x12, 0x6c, 0xaa, 0x07, 0xae, 0x20, 0x1b, 0x20, 0x54, - 0x28, 0xbd, 0xeb, 0xe6, 0xba, 0xa5, 0xb8, 0x53, 0xab, 0x80, 0x88, 0x66, - 0x6d, 0x1c, 0x75, 0x8e, 0x59, 0xea, 0xa9, 0xbb, 0x8c, 0xaa, 0xda, 0xb5, - 0xe0, 0x13, 0xf0, 0xda, 0x4d, 0xb8, 0x08, 0xb1, 0x29, 0x97, 0x9a, 0x46, - 0x78, 0x27, 0xa9, 0x57, 0xc6, 0x4d, 0x64, 0x37, 0xa2, 0x05, 0x98, 0x1d, - 0xd4, 0xf1, 0x90, 0x07, 0xe1, 0xf1, 0xc9, 0xf7, 0x30, 0x47, 0x51, 0x62, - 0xb8, 0xf5, 0xa8, 0x08, 0xf5, 0x10, 0xe7, 0x54, 0x19, 0x42, 0x7e, 0x86, - 0xc5, 0xdd, 0x29, 0x6f, 0x15, 0xa4, 0x32, 0x8d, 0xc1, 0x3b, 0xc8, 0xf0, - 0x42, 0xc8, 0x45, 0x9c, 0x16, 0x40, 0x3a, 0x3b, 0xe6, 0xc1, 0xe8, 0xa1, - 0xe9, 0x41, 0x1b, 0x79, 0x02, 0x1b, 0x20, 0xfc, 0x46, 0x0b, 0xdc, 0xd0, - 0x0f, 0xa1, 0x7f, 0xc2, 0x4a, 0xb2, 0x58, 0x63, 0xcb, 0x0c, 0xef, 0x55, - 0x96, 0x8e, 0xe6, 0x80, 0x3a, 0xb8, 0xe2, 0xc2, 0xe5, 0x63, 0xd7, 0xb5, - 0x2d, 0xf0, 0x51, 0xbb, 0x9e, 0x59, 0x5c, 0x75, 0xa2, 0x0b, 0xdc, 0xa2, - 0x40, 0x92, 0x9a, 0x25, 0x33, 0xd2, 0x1a, 0x9c, 0x2f, 0x5a, 0x78, 0xef, - 0x00, 0x9e, 0x79, 0x54, 0xd6, 0x8b, 0xae, 0x0e, 0x5a, 0x7b, 0x68, 0xbc, - 0x0c, 0x34, 0x9c, 0x23, 0xe0, 0x3e, 0x2a, 0x64, 0x6a, 0x38, 0x81, 0xe0, - 0x13, 0x6c, 0x45, 0x29, 0x2f, 0x62, 0x29, 0xea, 0xf0, 0x9d, 0xbd, 0xa1, - 0xd8, 0x73, 0x8e, 0x1e, 0x39, 0x29, 0x17, 0x4e, 0xca, 0xf4, 0xac, 0xab, - 0x59, 0xa2, 0xe0, 0xc3, 0x62, 0x8a, 0xa7, 0x1a, 0xa6, 0x46, 0x2e, 0x57, - 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0x1d, 0x85, 0x32, 0xb6, 0x57, 0xc2, 0x58, - 0x1d, 0x67, 0x7b, 0x2e, 0x67, 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0xdd, 0x33, - 0x38, 0xbb, 0xc7, 0x4f, 0x1e, 0x0b, 0xc4, 0x78, 0x2a, 0xff, 0x58, 0x46, - 0x03, 0xa1, 0x3b, 0x3b, 0x93, 0xe5, 0xcf, 0x93, 0xaa, 0x69, 0xc2, 0x23, - 0x5e, 0x27, 0x7a, 0xe4, 0xe1, 0x19, 0x87, 0xa6, 0x18, 0x72, 0xe2, 0xc2, - 0x0f, 0xc6, 0xa8, 0x05, 0x6c, 0x9e, 0x81, 0xb8, 0xc7, 0x3c, 0x2d, 0x7a, - 0x34, 0x9a, 0x13, 0x9c, 0x11, 0xf3, 0xe1, 0x6a, 0xbd, 0x5a, 0x02, 0x61, - 0x5e, 0xef, 0x59, 0x21, 0x9e, 0x34, 0xce, 0x37, 0xe9, 0x92, 0x45, 0x9d, - 0x5d, 0x14, 0x0c, 0xb7, 0x14, 0x90, 0x3d, 0xc8, 0x57, 0x27, 0x79, 0x0a, - 0x36, 0x2d, 0x82, 0x40, 0xb1, 0x30, 0x02, 0x2f, 0x12, 0x98, 0xfa, 0xf4, - 0x47, 0x98, 0xfe, 0xf5, 0x7a, 0x0d, 0x1b, 0x2d, 0x93, 0x2c, 0x8e, 0x1c, - 0x33, 0xa4, 0x04, 0x0b, 0x5f, 0x9c, 0x22, 0x14, 0x0f, 0x12, 0x04, 0x36, - 0xcb, 0xba, 0x50, 0xaa, 0x27, 0x63, 0x58, 0x96, 0x31, 0x2a, 0xcb, 0x80, - 0x06, 0x70, 0xf9, 0x59, 0x2d, 0x4f, 0xc8, 0x4c, 0x50, 0x1b, 0xf0, 0xb0, - 0x76, 0x46, 0x37, 0x7b, 0xc1, 0xb3, 0x14, 0x69, 0x84, 0xc6, 0x59, 0xaf, - 0xa4, 0xd1, 0x25, 0xe4, 0xc1, 0x3a, 0xa5, 0xcf, 0xf7, 0xe3, 0xf3, 0xc9, - 0x66, 0x91, 0x93, 0x04, 0x14, 0x35, 0x0e, 0xa2, 0x5e, 0x15, 0xc9, 0x57, - 0x9b, 0xd9, 0x25, 0xbe, 0x7f, 0xaa, 0x4c, 0x9c, 0xa4, 0x4b, 0x81, 0x08, - 0x05, 0xfc, 0x24, 0x85, 0xb6, 0x53, 0x76, 0x0e, 0xcb, 0x84, 0x4c, 0xcb, - 0x4d, 0xba, 0x39, 0x64, 0x9f, 0x4d, 0xf2, 0xcb, 0x01, 0x39, 0x40, 0x91, - 0x8e, 0xf9, 0x14, 0x4b, 0xa1, 0x8d, 0xc7, 0xc1, 0x1a, 0x26, 0xb7, 0xdf, - 0xb1, 0x3e, 0x50, 0x1f, 0x80, 0x61, 0x05, 0xd3, 0xf2, 0x69, 0x7c, 0x9e, - 0x77, 0x7b, 0x26, 0xa5, 0xdb, 0x50, 0x4a, 0xdf, 0x2b, 0x4a, 0x98, 0xb7, - 0xee, 0x6a, 0xa6, 0x58, 0xaa, 0x7a, 0x79, 0xe5, 0x29, 0x9c, 0x15, 0x56, - 0xbc, 0x45, 0xc5, 0x78, 0x91, 0xdf, 0x85, 0x70, 0xce, 0x41, 0xbf, 0xf7, - 0xf3, 0xa6, 0xda, 0x51, 0x04, 0x42, 0x15, 0xdd, 0x86, 0x7a, 0xda, 0x93, - 0x2b, 0xa8, 0xe3, 0xfb, 0xd0, 0xfe, 0x11, 0xf0, 0x35, 0xb8, 0xe9, 0x31, - 0xfc, 0xb8, 0x85, 0xbb, 0x65, 0xf0, 0x5f, 0x97, 0x2e, 0x61, 0x21, 0x21, - 0x15, 0xd1, 0xf9, 0x99, 0xa0, 0xa1, 0x94, 0x9c, 0x12, 0xac, 0x38, 0x98, - 0x64, 0x80, 0xfc, 0xf6, 0x9b, 0xc2, 0x1e, 0x61, 0xbc, 0x23, 0x33, 0x93, - 0xe3, 0x5b, 0x06, 0xe5, 0xb4, 0x03, 0x25, 0x42, 0x8f, 0x14, 0x24, 0xcf, - 0xd8, 0x58, 0xb1, 0x50, 0x82, 0x90, 0x9a, 0xe0, 0xea, 0xf6, 0x83, 0x17, - 0xfa, 0xc2, 0x07, 0x3d, 0x2c, 0x83, 0x9e, 0xfa, 0xa0, 0x47, 0x65, 0xd0, - 0xd7, 0x1a, 0xb4, 0x1a, 0xc3, 0xd5, 0x79, 0x58, 0x93, 0x3b, 0xeb, 0xc8, - 0xab, 0xcb, 0x8c, 0x3a, 0xd5, 0xea, 0x16, 0xed, 0x9e, 0xe5, 0x71, 0xb7, - 0x52, 0xb1, 0x85, 0x2a, 0xb7, 0x89, 0xfd, 0x1b, 0xbe, 0xde, 0xad, 0x67, - 0x6b, 0xc3, 0xc3, 0x7d, 0x6e, 0xc7, 0x30, 0x2f, 0x42, 0xdb, 0x8c, 0x4e, - 0x20, 0x35, 0x90, 0x6e, 0xe8, 0x7e, 0x85, 0x21, 0x14, 0x76, 0x7b, 0x0c, - 0xfe, 0x13, 0x66, 0xfc, 0x3a, 0x99, 0xe7, 0x97, 0xc5, 0xaf, 0xcb, 0x18, - 0xfd, 0x06, 0x6d, 0x60, 0x91, 0xb4, 0x43, 0x1e, 0x33, 0xd2, 0x4b, 0x25, - 0x36, 0x29, 0x1d, 0xaa, 0xe1, 0x3a, 0x6e, 0x0a, 0xe8, 0x5b, 0x1c, 0x6c, - 0x22, 0xad, 0xc4, 0xa2, 0xd0, 0x9d, 0x57, 0x5f, 0x15, 0xa0, 0xaf, 0xb2, - 0xf7, 0x01, 0x32, 0x13, 0x9d, 0x0a, 0x47, 0x09, 0x99, 0xb1, 0xa3, 0x64, - 0xa3, 0x51, 0x33, 0x2c, 0xea, 0x2c, 0x86, 0xfa, 0xa7, 0xdf, 0xb1, 0xb1, - 0x51, 0x63, 0xb6, 0xc3, 0x46, 0x47, 0x36, 0xd0, 0xf7, 0x00, 0x64, 0x08, - 0x42, 0x42, 0xb9, 0xf7, 0x18, 0x05, 0xd5, 0x9e, 0xc4, 0x0c, 0x92, 0x27, - 0x96, 0x44, 0xd7, 0xc4, 0xbf, 0x82, 0x8d, 0xd7, 0x4d, 0xe6, 0xb2, 0xf4, - 0x78, 0xb0, 0xaf, 0x81, 0xc2, 0xce, 0xab, 0x06, 0x1a, 0x19, 0xb0, 0x7d, - 0x36, 0xdc, 0xed, 0x9a, 0xec, 0x11, 0x38, 0x9b, 0xae, 0x52, 0x50, 0x38, - 0x4c, 0x54, 0x4d, 0x3f, 0x8d, 0x2f, 0x92, 0xe5, 0x97, 0x60, 0xc9, 0xa2, - 0xae, 0x0d, 0xce, 0xdb, 0xce, 0x04, 0x9f, 0xa4, 0x33, 0xb7, 0x7e, 0x3a, - 0x37, 0xa4, 0x3f, 0x23, 0x68, 0x16, 0xb2, 0x8e, 0x5f, 0x3e, 0xe9, 0xf1, - 0xfd, 0x4f, 0x45, 0x9c, 0xda, 0x02, 0x6f, 0xbf, 0x1a, 0x4c, 0x1d, 0xb2, - 0x08, 0xcc, 0x60, 0x46, 0x99, 0x4b, 0x36, 0x21, 0xab, 0x8a, 0x40, 0x82, - 0x89, 0x17, 0xba, 0x26, 0x1b, 0x8b, 0x64, 0x19, 0x7f, 0x4b, 0x95, 0x1d, - 0xb3, 0xc7, 0x47, 0x66, 0x1e, 0xbf, 0xbd, 0x7f, 0x82, 0xf3, 0x74, 0xc8, - 0xed, 0xbc, 0xb8, 0x4b, 0x7f, 0x1d, 0x2f, 0x54, 0xd4, 0xb5, 0x92, 0xe9, - 0x8a, 0x7b, 0x21, 0x8e, 0x82, 0xe7, 0xf3, 0x64, 0xb1, 0xe0, 0x41, 0xdf, - 0xa6, 0xf1, 0x64, 0x93, 0x27, 0xe7, 0x9b, 0x85, 0x8c, 0xb5, 0x2b, 0x41, - 0xf2, 0xc9, 0x8f, 0xf1, 0x92, 0xee, 0xde, 0xd2, 0xd9, 0x9c, 0x43, 0x76, - 0x99, 0xe7, 0x6b, 0x88, 0xda, 0x94, 0xe5, 0xb0, 0x56, 0x00, 0xe3, 0x6e, - 0x7a, 0xbe, 0x58, 0x5d, 0x83, 0x55, 0xba, 0xda, 0xf9, 0x69, 0x13, 0x67, - 0xb4, 0x71, 0xba, 0x33, 0x7c, 0x63, 0x74, 0xb0, 0xff, 0xc6, 0xee, 0xe3, - 0x9d, 0xe9, 0x26, 0x59, 0xe0, 0x7e, 0x7b, 0x7f, 0xd2, 0x27, 0xb2, 0x7d, - 0xf2, 0xb3, 0xfa, 0xc9, 0xb2, 0x7f, 0x99, 0x5f, 0x2d, 0xf6, 0xad, 0x77, - 0xef, 0xc0, 0x38, 0x2c, 0xb8, 0x89, 0x11, 0x5f, 0xdf, 0x02, 0x27, 0xf3, - 0xa0, 0xf8, 0xf5, 0x9a, 0xe5, 0x9f, 0xab, 0x67, 0x90, 0xdf, 0x15, 0x88, - 0x11, 0x07, 0xec, 0x83, 0xcf, 0xac, 0x5a, 0x0a, 0x34, 0x66, 0xf8, 0x86, - 0x1d, 0x7d, 0x1f, 0x3c, 0x55, 0x89, 0x44, 0x38, 0xa5, 0xe0, 0x7e, 0x8d, - 0x72, 0x73, 0xd1, 0x05, 0x79, 0xba, 0x72, 0x74, 0x48, 0x82, 0xda, 0xba, - 0x66, 0x0e, 0xba, 0x12, 0xcb, 0x4d, 0x05, 0x12, 0x66, 0xaa, 0xae, 0x93, - 0x56, 0x8e, 0x12, 0x85, 0x95, 0x01, 0x95, 0xf5, 0x25, 0x93, 0x02, 0xab, - 0x24, 0xc5, 0xaa, 0x5f, 0x6d, 0xdc, 0x5c, 0xd4, 0x9e, 0x42, 0x1f, 0x2f, - 0xb3, 0x45, 0x04, 0x63, 0x92, 0x6c, 0x2b, 0xdc, 0xf7, 0xc6, 0xc0, 0x15, - 0x78, 0x20, 0xe1, 0xe5, 0x6e, 0xa7, 0x04, 0x3b, 0x0a, 0x2b, 0xf4, 0x5e, - 0xa9, 0x2c, 0x1a, 0x93, 0x26, 0x5d, 0x3e, 0xbf, 0x4c, 0xb2, 0x41, 0x75, - 0x2f, 0x4f, 0xb9, 0x30, 0x75, 0xf9, 0x29, 0x91, 0x01, 0xf5, 0x0d, 0xc2, - 0x1d, 0x2f, 0xe0, 0x12, 0xfa, 0x75, 0x82, 0x3d, 0x3e, 0xc4, 0x72, 0x00, - 0x97, 0xe1, 0x96, 0x03, 0x25, 0x81, 0x46, 0x41, 0xa0, 0x2b, 0x6b, 0x78, - 0x75, 0xfb, 0xec, 0x02, 0xb9, 0x83, 0x64, 0xe5, 0x57, 0x89, 0x67, 0x1e, - 0x3f, 0x05, 0x53, 0x31, 0x49, 0x3f, 0xe2, 0xd9, 0x72, 0x80, 0x1b, 0xbe, - 0x8e, 0x9f, 0x92, 0xb4, 0x42, 0xa7, 0x97, 0x7c, 0xf8, 0xd5, 0xae, 0x7c, - 0xb5, 0x46, 0x60, 0xd8, 0x8f, 0xc6, 0x47, 0x70, 0x6a, 0x41, 0xc1, 0x53, - 0x93, 0xfb, 0xcf, 0x64, 0x38, 0x4a, 0xda, 0x5f, 0x27, 0x70, 0x54, 0x0a, - 0x25, 0x49, 0x01, 0x84, 0x57, 0x13, 0x1c, 0x5b, 0x2a, 0x5a, 0x1b, 0xcd, - 0x62, 0xb9, 0xa1, 0x1c, 0x6d, 0xcf, 0x50, 0xd6, 0x0e, 0xcc, 0xdc, 0x8c, - 0xfb, 0x87, 0x66, 0xe5, 0x0d, 0x48, 0xa3, 0xb5, 0x88, 0x73, 0xa1, 0x6d, - 0xbe, 0xa1, 0x59, 0xc1, 0x24, 0xe8, 0x36, 0x3b, 0x2d, 0xae, 0x9c, 0x69, - 0xd0, 0xa6, 0x42, 0x6b, 0xd5, 0xf7, 0xae, 0xa2, 0x40, 0xee, 0x2f, 0x10, - 0x20, 0x42, 0xd2, 0xcf, 0xd6, 0xac, 0x2d, 0x82, 0xdc, 0x40, 0x7e, 0x9f, - 0x63, 0x1e, 0xc1, 0x8f, 0xb7, 0x58, 0xf1, 0xdd, 0xdc, 0x7f, 0x57, 0x18, - 0xb7, 0x3a, 0xc6, 0xad, 0x86, 0x71, 0x6b, 0x61, 0x48, 0x2e, 0x4e, 0x53, - 0xf0, 0xf8, 0x2f, 0x13, 0x74, 0x50, 0x6f, 0x6e, 0x47, 0xeb, 0xd5, 0x62, - 0x92, 0x46, 0x30, 0x09, 0xb8, 0x45, 0x4e, 0x3d, 0x91, 0x10, 0xd8, 0xdb, - 0x82, 0xa2, 0x22, 0x66, 0x45, 0x7d, 0xfe, 0x31, 0x59, 0x53, 0x98, 0x67, - 0xa0, 0x72, 0xdb, 0x05, 0xf1, 0x80, 0x15, 0x48, 0x96, 0x20, 0x9a, 0x0c, - 0x94, 0x65, 0x92, 0xc3, 0xf8, 0x4a, 0xa3, 0x6f, 0x96, 0xcc, 0xe1, 0xf3, - 0x5c, 0x1b, 0x67, 0xbd, 0x07, 0xdb, 0xc0, 0xb5, 0xdb, 0x78, 0x0e, 0x30, - 0xb9, 0xd5, 0x98, 0xd3, 0x1d, 0x0f, 0x60, 0x6d, 0x04, 0xdf, 0x22, 0xa8, - 0x90, 0xc3, 0x3f, 0xad, 0xc7, 0x25, 0x17, 0x1b, 0x5e, 0x3e, 0x15, 0x4c, - 0xd6, 0x04, 0x8f, 0x9a, 0xd1, 0x22, 0x25, 0x67, 0x27, 0xc9, 0xd8, 0x3a, - 0xb9, 0x89, 0x17, 0x90, 0x46, 0x30, 0xd4, 0x3c, 0xbc, 0xad, 0x28, 0x20, - 0xcf, 0xc0, 0x2d, 0x3b, 0x5d, 0x5d, 0x7f, 0xca, 0xcf, 0x9d, 0x8e, 0xb5, - 0xa6, 0x3e, 0x72, 0x01, 0x27, 0xf3, 0x1f, 0x36, 0x59, 0x1e, 0xcf, 0xc1, - 0xeb, 0x83, 0xd6, 0x7c, 0x4d, 0x02, 0x0a, 0x27, 0x0e, 0xc6, 0x69, 0x68, - 0x71, 0x3e, 0x8c, 0x9f, 0xf6, 0xf7, 0x29, 0xa8, 0xeb, 0x19, 0x86, 0xd4, - 0x39, 0xdd, 0x45, 0x3b, 0x0d, 0xdf, 0x23, 0x60, 0x48, 0x97, 0x28, 0x70, - 0xec, 0xe5, 0xb1, 0x5b, 0x5e, 0x34, 0xfa, 0x92, 0xb7, 0xfe, 0xa2, 0x6f, - 0xb7, 0x54, 0x34, 0x89, 0x53, 0x79, 0x4c, 0x58, 0x64, 0x0c, 0xcb, 0xc8, - 0x42, 0xcc, 0x69, 0xfc, 0xd3, 0x26, 0x49, 0x81, 0xe0, 0x63, 0x96, 0x2d, - 0x56, 0x79, 0x26, 0xe5, 0xae, 0x48, 0xba, 0x14, 0xa9, 0xb9, 0xc8, 0x97, - 0x90, 0x02, 0x85, 0x1a, 0x45, 0xaa, 0x8a, 0xaf, 0xaa, 0x26, 0xe9, 0xa2, - 0x97, 0xa1, 0x38, 0x38, 0xf2, 0xe9, 0xce, 0x25, 0x4d, 0x9a, 0x40, 0x6f, - 0x3c, 0x4d, 0x96, 0x4d, 0x60, 0xd1, 0x66, 0x22, 0x22, 0xb9, 0xa5, 0x6c, - 0xa7, 0xbc, 0x71, 0xe5, 0xe4, 0x6b, 0x38, 0xd8, 0xf5, 0x96, 0x72, 0x0a, - 0x93, 0xa4, 0x1e, 0x9f, 0xe1, 0xf5, 0x68, 0x2e, 0x47, 0x93, 0xd9, 0xec, - 0xe7, 0x11, 0xcc, 0xa3, 0x23, 0x60, 0xa1, 0xa7, 0x95, 0xd5, 0xe3, 0xd4, - 0xba, 0x3e, 0x1d, 0x5a, 0xac, 0x2f, 0x27, 0xa8, 0x68, 0xfb, 0xfb, 0x76, - 0x31, 0x24, 0xb3, 0x53, 0x12, 0x0e, 0xd2, 0x86, 0xf2, 0x8e, 0xca, 0xf2, - 0x41, 0x5e, 0x43, 0x80, 0xe1, 0xec, 0x54, 0x41, 0x8d, 0x00, 0x8a, 0xb8, - 0xad, 0x02, 0xda, 0x03, 0x20, 0xce, 0x58, 0xd9, 0x32, 0xb5, 0x39, 0xc6, - 0xaf, 0x37, 0xda, 0xaa, 0x03, 0x69, 0x10, 0x8d, 0x8c, 0xbb, 0xd6, 0xa2, - 0xb0, 0x69, 0x90, 0x4c, 0x0b, 0x0d, 0x05, 0xd2, 0x58, 0x9d, 0xfd, 0x94, - 0xe6, 0xd1, 0x0d, 0xb4, 0x31, 0xf2, 0x71, 0x0b, 0x9f, 0xb7, 0xba, 0x89, - 0x05, 0x3b, 0x20, 0x01, 0xa1, 0xa8, 0xe5, 0x28, 0x82, 0x75, 0x8d, 0x1b, - 0x02, 0x50, 0xeb, 0x71, 0xd2, 0x00, 0x5a, 0x65, 0x4b, 0x53, 0x02, 0x9f, - 0x7a, 0x30, 0x60, 0xf8, 0x09, 0xea, 0x07, 0x9d, 0xe4, 0x8f, 0xdf, 0x7b, - 0xec, 0x8f, 0xdf, 0xcf, 0x20, 0x01, 0xa6, 0xcb, 0x32, 0x5b, 0xd2, 0x04, - 0x44, 0x10, 0x2c, 0x01, 0x42, 0xbd, 0xc0, 0x3f, 0x56, 0x70, 0xaa, 0xe0, - 0x08, 0x69, 0x03, 0xd7, 0xc2, 0xe7, 0xc0, 0x69, 0x53, 0xa4, 0xf9, 0x20, - 0xa4, 0xb9, 0x80, 0x6a, 0xf1, 0x55, 0xad, 0x31, 0x86, 0x90, 0x66, 0x97, - 0xd0, 0x9f, 0x41, 0x57, 0x78, 0x16, 0x50, 0x53, 0xe0, 0x9a, 0x8c, 0x80, - 0xd0, 0x10, 0x60, 0xe0, 0x03, 0x18, 0x80, 0xe2, 0x54, 0x0e, 0x74, 0x31, - 0x41, 0x03, 0x70, 0xa3, 0x21, 0xeb, 0x0b, 0x49, 0x4e, 0xb3, 0x28, 0x22, - 0xac, 0x97, 0xd1, 0x89, 0xef, 0x83, 0xc7, 0xaf, 0xcb, 0x3c, 0x1d, 0x82, - 0x96, 0xc3, 0xff, 0xd3, 0xa1, 0xb1, 0x28, 0x48, 0x08, 0x6f, 0xc3, 0xc4, - 0x01, 0xce, 0x70, 0x51, 0x99, 0x6e, 0x7c, 0xcb, 0xe8, 0x54, 0xe1, 0xa2, - 0x46, 0x9d, 0xf2, 0xc2, 0xa1, 0xc9, 0x40, 0x37, 0xce, 0xcc, 0xf9, 0xba, - 0x41, 0x73, 0xa8, 0xd3, 0x1c, 0x55, 0xd3, 0x04, 0x5a, 0x82, 0x6c, 0x35, - 0xcd, 0x91, 0x4e, 0x73, 0xaf, 0x9a, 0xe6, 0xae, 0xa2, 0x79, 0x53, 0x45, - 0x73, 0x4f, 0xa7, 0xf9, 0xb8, 0x96, 0x66, 0xc1, 0x6a, 0x15, 0xcd, 0xc7, - 0x3a, 0xcd, 0xfd, 0xda, 0xba, 0xef, 0x86, 0xd0, 0xdc, 0xd7, 0x69, 0x1e, - 0x84, 0xb5, 0xd1, 0xae, 0xaa, 0x3b, 0x75, 0x7a, 0xa5, 0x10, 0x57, 0x85, - 0x06, 0xf6, 0x45, 0xd9, 0x04, 0xa5, 0xdc, 0x8f, 0x0b, 0x20, 0x46, 0xb4, - 0x28, 0x36, 0xd6, 0x15, 0x24, 0x88, 0xcf, 0x29, 0x7d, 0x9e, 0x69, 0x5e, - 0xa7, 0xbc, 0xb6, 0x90, 0xf6, 0x2e, 0x7a, 0x53, 0xa2, 0x2a, 0x63, 0x5a, - 0x81, 0xc0, 0x86, 0x72, 0xc8, 0x02, 0xdb, 0x78, 0x66, 0xf6, 0x71, 0x48, - 0x01, 0x1d, 0x86, 0xb2, 0xf8, 0x97, 0x0b, 0xf1, 0x05, 0xca, 0x75, 0xd6, - 0xca, 0xe9, 0x3e, 0xd4, 0x02, 0xc6, 0xb8, 0x08, 0x03, 0x9a, 0xea, 0xeb, - 0x58, 0x94, 0x30, 0xc0, 0x7f, 0x9e, 0xca, 0x45, 0x26, 0x6a, 0x51, 0x4a, - 0xa6, 0xf1, 0x2a, 0x59, 0x16, 0x21, 0xbc, 0x06, 0x66, 0x4c, 0x7f, 0x05, - 0x54, 0x1e, 0x87, 0xef, 0xb4, 0x80, 0x39, 0x93, 0x72, 0xac, 0x2a, 0x9b, - 0xb4, 0xbe, 0x48, 0xa6, 0x83, 0x4b, 0x74, 0xe3, 0xe6, 0xe4, 0xf8, 0xab, - 0x27, 0x5f, 0x3e, 0xc5, 0x75, 0xaf, 0xea, 0x00, 0xff, 0x84, 0x3a, 0xc3, - 0x17, 0xe0, 0xf1, 0xfa, 0x60, 0x75, 0xa8, 0x7f, 0x25, 0x14, 0x0b, 0x0b, - 0x0e, 0x7d, 0xfa, 0xce, 0x3d, 0x90, 0x50, 0xe5, 0x7e, 0x8e, 0xfb, 0xc8, - 0x43, 0xe7, 0xfd, 0x2f, 0x3e, 0xa3, 0x5d, 0x1a, 0x48, 0x5b, 0x4d, 0xe6, - 0xf1, 0x1c, 0x66, 0xa2, 0xb2, 0x01, 0x8a, 0xed, 0x09, 0xd5, 0xe6, 0x50, - 0x10, 0xb6, 0x6c, 0xba, 0x59, 0xb2, 0x2c, 0x59, 0xce, 0x62, 0x06, 0xe8, - 0x18, 0x83, 0x70, 0x41, 0xb8, 0xf4, 0xb0, 0x48, 0x8a, 0xe1, 0x0b, 0xc5, - 0x22, 0x6a, 0x9c, 0xd3, 0x75, 0x25, 0x39, 0x6f, 0xa0, 0x3c, 0x79, 0xae, - 0xbe, 0x22, 0x68, 0xac, 0x19, 0x8e, 0x52, 0x96, 0x6e, 0x04, 0x9a, 0x2c, - 0x0a, 0xe0, 0x37, 0xf9, 0x25, 0xa6, 0x39, 0x4f, 0x80, 0x3e, 0x29, 0x5f, - 0x12, 0x34, 0xd7, 0xdb, 0x54, 0x4e, 0xe9, 0x0b, 0xe5, 0xc6, 0x75, 0xa1, - 0xb7, 0x76, 0xb2, 0x59, 0x9a, 0xac, 0xf3, 0xb7, 0x21, 0x89, 0x7e, 0x4e, - 0x57, 0xf3, 0x5b, 0xf8, 0xf1, 0xd6, 0x0e, 0xae, 0xcc, 0xc0, 0x97, 0x3f, - 0x01, 0xcc, 0x51, 0xfd, 0x86, 0x46, 0xa5, 0x01, 0x00 + 0x59, 0xdd, 0x4a, 0x56, 0xde, 0x77, 0x10, 0xa4, 0xb8, 0xbc, 0xd4, 0x94, + 0xdc, 0xed, 0x5b, 0x2a, 0xa5, 0x48, 0x2d, 0x97, 0xb9, 0xc4, 0xd5, 0x97, + 0x4a, 0x2e, 0xac, 0xb3, 0x61, 0x55, 0xa0, 0xe1, 0xd7, 0x46, 0x7c, 0x54, + 0xa6, 0x17, 0xa4, 0x1c, 0x9d, 0x6e, 0xf3, 0x43, 0xe7, 0xee, 0xe4, 0x23, + 0x1e, 0x82, 0x88, 0xd9, 0xb6, 0xfe, 0xec, 0xe3, 0x40, 0x5b, 0xae, 0x77, + 0xa7, 0x53, 0x5e, 0xcf, 0xdd, 0x87, 0xac, 0xa7, 0x56, 0x2f, 0xef, 0x3c, + 0x74, 0x71, 0x35, 0x49, 0x96, 0xb5, 0xe7, 0x28, 0xfa, 0x08, 0x25, 0x35, + 0x5c, 0x62, 0xb9, 0x56, 0x52, 0x7b, 0x15, 0x45, 0x07, 0x6d, 0xb4, 0x82, + 0xe6, 0x23, 0x06, 0x65, 0x68, 0x65, 0x3a, 0x3b, 0xe3, 0x97, 0xf1, 0x0d, + 0x81, 0x55, 0xb1, 0xa2, 0xa0, 0x6f, 0x93, 0x9f, 0xd0, 0x94, 0x44, 0x74, + 0xa2, 0xfa, 0x09, 0x0c, 0xbf, 0x12, 0x5d, 0x1c, 0x84, 0x8b, 0x86, 0xbd, + 0x51, 0xb7, 0x37, 0x3c, 0xe8, 0xbe, 0x3a, 0x7a, 0xf3, 0xcd, 0xee, 0x6b, + 0xe5, 0x70, 0x7b, 0x12, 0x6e, 0xff, 0x8d, 0xd7, 0xab, 0xe0, 0xf6, 0x25, + 0xdc, 0x70, 0xf8, 0xb8, 0xdb, 0xdd, 0x19, 0xc2, 0x39, 0xaf, 0x90, 0x30, + 0xd8, 0xf9, 0x6a, 0xb5, 0x98, 0x4e, 0x1a, 0x74, 0x1e, 0x2a, 0x34, 0x84, + 0xf2, 0xf9, 0x6a, 0x95, 0xc7, 0xdb, 0x20, 0x6c, 0xb3, 0x2c, 0x5b, 0x25, + 0x02, 0x99, 0x53, 0xb4, 0xe1, 0xd1, 0x3e, 0xda, 0xec, 0x47, 0x2f, 0x0e, + 0x87, 0xc3, 0x47, 0xec, 0x10, 0xbe, 0x7c, 0xf0, 0xc1, 0x07, 0x8f, 0x42, + 0x28, 0x13, 0xcb, 0xdb, 0x23, 0x4c, 0xf7, 0x58, 0xda, 0x51, 0xb7, 0xfb, + 0x13, 0xbe, 0x17, 0x54, 0xdf, 0x9f, 0x10, 0x4a, 0xf6, 0x27, 0x89, 0x55, + 0xd6, 0x9f, 0x30, 0x4f, 0x87, 0x6c, 0xb4, 0xc4, 0xe3, 0xd2, 0x02, 0xee, + 0xcc, 0x12, 0x43, 0xc4, 0x44, 0x07, 0x6f, 0x6d, 0x01, 0xf9, 0x88, 0x97, + 0x48, 0x05, 0x75, 0xac, 0x5e, 0x2a, 0x08, 0x25, 0xa5, 0x22, 0xb1, 0xca, + 0xa4, 0x82, 0x79, 0x26, 0x64, 0x7b, 0xa9, 0x70, 0xee, 0x24, 0x9d, 0x70, + 0xa9, 0x88, 0x03, 0xf6, 0x4d, 0xfa, 0x12, 0x02, 0x84, 0x90, 0x96, 0x27, + 0x6f, 0x1e, 0x9e, 0x72, 0xb1, 0x0f, 0xb7, 0x2d, 0xd2, 0xb8, 0x10, 0xbe, + 0x2d, 0xda, 0x7c, 0x72, 0xb0, 0x45, 0xea, 0x30, 0xd7, 0xd8, 0x9a, 0xcc, + 0xe5, 0xd4, 0x65, 0x8b, 0xf4, 0x61, 0x26, 0xd4, 0x9e, 0x7d, 0x71, 0x9a, + 0x31, 0x8f, 0x6f, 0xf2, 0x1d, 0xba, 0xe3, 0xc7, 0xfb, 0xf9, 0x3c, 0x5e, + 0xf3, 0xb3, 0xe8, 0x0c, 0x92, 0x14, 0x4d, 0x86, 0x11, 0xda, 0x31, 0x48, + 0x67, 0xe8, 0x60, 0x8c, 0xa8, 0xff, 0xec, 0xb1, 0x58, 0x86, 0xd2, 0xcf, + 0x42, 0x8e, 0xc7, 0xaa, 0x0b, 0x90, 0x6a, 0xe2, 0xee, 0x3f, 0x1a, 0xcb, + 0x69, 0xba, 0xc7, 0x63, 0xd5, 0x1f, 0x87, 0x80, 0x53, 0xb1, 0x75, 0x23, + 0xd0, 0x68, 0x34, 0xf2, 0x8e, 0x6f, 0xf7, 0xc1, 0x4a, 0x72, 0x12, 0x5f, + 0xc0, 0x03, 0x01, 0xed, 0xc6, 0x3a, 0xf8, 0x0b, 0x38, 0x47, 0xb7, 0x1d, + 0xf2, 0x3c, 0xe4, 0xe1, 0x16, 0x08, 0xd3, 0x51, 0xda, 0xed, 0x90, 0xc6, + 0x03, 0xb6, 0xdb, 0xa1, 0x8c, 0xc7, 0x6e, 0xb7, 0x44, 0x9a, 0x07, 0x9c, + 0xdb, 0x0e, 0xed, 0x6c, 0x1d, 0x6f, 0xab, 0x19, 0xa5, 0xb1, 0x69, 0x47, + 0xda, 0xf1, 0x57, 0xf2, 0x80, 0x49, 0x11, 0x00, 0x19, 0xde, 0x4a, 0x5e, + 0x3a, 0x25, 0x82, 0x2c, 0x1d, 0xee, 0x39, 0xe6, 0x43, 0xc4, 0x98, 0xa0, + 0x12, 0xee, 0xa8, 0x48, 0x22, 0x7d, 0x58, 0x9d, 0x69, 0x32, 0x3e, 0xe4, + 0xcb, 0x10, 0xea, 0x7c, 0x55, 0xa6, 0x7e, 0xd2, 0xeb, 0x52, 0x6f, 0xb4, + 0x12, 0xf1, 0xc0, 0x53, 0xf0, 0x4a, 0x6e, 0xb8, 0xad, 0x7c, 0x36, 0x99, + 0xe5, 0x09, 0xac, 0xfb, 0xf1, 0x9b, 0xfb, 0x51, 0xb7, 0x5c, 0x59, 0xb2, + 0x20, 0x6d, 0x01, 0xaa, 0x96, 0xc2, 0x64, 0x15, 0x1a, 0x03, 0xd0, 0x06, + 0x6c, 0x93, 0x05, 0x21, 0x2f, 0x35, 0x28, 0xc5, 0x28, 0xb5, 0x71, 0x7d, + 0x85, 0x83, 0x40, 0x4f, 0x2d, 0x9e, 0x4f, 0x66, 0xb1, 0x78, 0x72, 0xa5, + 0x49, 0x1c, 0x5e, 0x31, 0x8f, 0x2f, 0x0f, 0xff, 0xa8, 0x26, 0x39, 0xd5, + 0x20, 0xd8, 0xa0, 0x75, 0x20, 0xf9, 0xb2, 0x1e, 0x22, 0xf3, 0x82, 0xd0, + 0xad, 0xbc, 0xb0, 0x2e, 0xc5, 0x9f, 0x8b, 0xf6, 0xb4, 0x0d, 0xc5, 0x28, + 0x90, 0x4d, 0xf3, 0xb0, 0x4e, 0x86, 0xbc, 0xbb, 0x3d, 0xae, 0xe7, 0xcf, + 0xc1, 0x9b, 0xa4, 0x42, 0xfb, 0xd5, 0xc5, 0x17, 0xba, 0x5b, 0x05, 0xfb, + 0x10, 0xac, 0x63, 0x5f, 0xa2, 0x06, 0xe0, 0xe2, 0x32, 0x97, 0x0c, 0x99, + 0xd0, 0x75, 0xef, 0x55, 0xd1, 0x9f, 0x49, 0x93, 0xbd, 0x36, 0x56, 0xc1, + 0x0b, 0x9c, 0x2b, 0xa3, 0x98, 0x11, 0xf3, 0x70, 0xd9, 0x70, 0xa9, 0x2c, + 0xce, 0xe8, 0xda, 0x8c, 0x7c, 0xaa, 0x93, 0x71, 0xfd, 0xcb, 0x34, 0x24, + 0xf3, 0x2a, 0xec, 0xd5, 0x64, 0xed, 0x5c, 0x83, 0x55, 0x7f, 0xf6, 0x6d, + 0x30, 0x87, 0xcf, 0x1a, 0x83, 0x26, 0xaf, 0x82, 0xe9, 0x31, 0x6a, 0xc2, + 0xea, 0x65, 0x79, 0x62, 0x46, 0xdf, 0x79, 0x3e, 0xff, 0x50, 0xf7, 0x11, + 0xcb, 0xd9, 0x12, 0x5c, 0x35, 0x0d, 0x75, 0x64, 0xb6, 0x1b, 0xe9, 0x86, + 0xff, 0x52, 0x94, 0xa8, 0xb6, 0xb8, 0x10, 0xd5, 0xe9, 0x3a, 0xcd, 0x4a, + 0xd7, 0x1f, 0xed, 0x66, 0x9d, 0x2c, 0x16, 0x7f, 0x55, 0x8b, 0xa2, 0x5c, + 0xb9, 0x74, 0xd8, 0xb8, 0x49, 0xf3, 0x1e, 0xf9, 0xc9, 0x11, 0x80, 0x29, + 0x1b, 0x4a, 0x6a, 0x27, 0x9e, 0xbf, 0x53, 0x3b, 0xc6, 0xbe, 0x7c, 0x7f, + 0x2d, 0xaa, 0x2b, 0x71, 0xef, 0x2e, 0x28, 0xd7, 0x06, 0xe9, 0x30, 0xbc, + 0x8f, 0x26, 0xa6, 0xd2, 0xb7, 0xfd, 0x56, 0x65, 0xf3, 0xd4, 0x0e, 0x1e, + 0x94, 0x62, 0x0d, 0x71, 0xd6, 0xdd, 0xdd, 0x07, 0x9e, 0xf5, 0x85, 0xa9, + 0x72, 0x88, 0x1a, 0x37, 0xd0, 0xda, 0x30, 0xa3, 0xa4, 0xb7, 0xd8, 0x03, + 0x4e, 0x54, 0x9b, 0xb0, 0xa1, 0xb1, 0xa0, 0xbe, 0x05, 0x38, 0x96, 0x6a, + 0x0c, 0xab, 0x2e, 0xe3, 0xde, 0xb9, 0x72, 0x6b, 0xde, 0xc3, 0xbe, 0xca, + 0x40, 0x97, 0xaf, 0x2f, 0x6f, 0x7b, 0x0c, 0x9f, 0xac, 0x87, 0x3a, 0xd5, + 0xde, 0x84, 0x15, 0xe5, 0x0b, 0x02, 0x45, 0x53, 0xdf, 0x18, 0x7b, 0xec, + 0x40, 0x56, 0xa6, 0x97, 0x7a, 0x99, 0x11, 0x14, 0x8b, 0xe3, 0xa5, 0xbc, + 0xe7, 0x4d, 0x7b, 0x96, 0x2f, 0x4e, 0xe6, 0xa3, 0xd7, 0x47, 0xaf, 0xd3, + 0xa6, 0xe5, 0x8b, 0x8f, 0x67, 0x93, 0xf3, 0xfd, 0xdd, 0x8e, 0x72, 0xb1, + 0xde, 0x5d, 0x26, 0x57, 0x13, 0xaa, 0x44, 0x92, 0x11, 0xc3, 0x73, 0x1e, + 0xc9, 0x85, 0x44, 0x40, 0xf7, 0xac, 0x22, 0xbc, 0x0e, 0xcf, 0x6f, 0x8c, + 0x33, 0x28, 0x65, 0x88, 0x5f, 0xba, 0xbe, 0xcb, 0xad, 0x1d, 0x14, 0x03, + 0xec, 0x7e, 0x13, 0x19, 0x5e, 0x82, 0xff, 0x8d, 0x90, 0xbb, 0x80, 0x5b, + 0xb1, 0x06, 0x31, 0x6e, 0x1b, 0xd8, 0xbd, 0x10, 0xa9, 0x0a, 0xd8, 0xcd, + 0xbe, 0x8d, 0xa7, 0x27, 0x2b, 0xf0, 0xd8, 0x73, 0x3a, 0xa6, 0x40, 0x41, + 0xba, 0x17, 0x31, 0x3d, 0xcc, 0x2f, 0xb6, 0xbb, 0x81, 0xfc, 0x9d, 0xfd, + 0x62, 0xb8, 0xe0, 0xe8, 0x90, 0x0d, 0xb1, 0x66, 0x3c, 0x17, 0xce, 0x01, + 0x7e, 0x15, 0xe7, 0x69, 0x82, 0x8f, 0x8c, 0x8f, 0x44, 0x5a, 0x1a, 0x2b, + 0x9c, 0xf7, 0xe3, 0xc5, 0xe4, 0xf6, 0xa3, 0x74, 0x75, 0xfd, 0xe1, 0x04, + 0x1f, 0xc5, 0x56, 0x40, 0xf3, 0x78, 0xba, 0xb9, 0xe0, 0xaf, 0x97, 0x03, + 0x5b, 0x47, 0xe6, 0xbb, 0xc4, 0x02, 0xff, 0xdd, 0xc5, 0xc2, 0x0c, 0x1c, + 0x60, 0x5e, 0x14, 0x3d, 0x5e, 0xac, 0x60, 0x9c, 0x5c, 0xaf, 0x72, 0xd0, + 0x85, 0x04, 0x06, 0xb0, 0x5b, 0x86, 0x6e, 0x9e, 0xc6, 0x70, 0xa6, 0xdd, + 0xdd, 0xf6, 0x3e, 0x5e, 0xae, 0x02, 0x76, 0x44, 0x98, 0xe8, 0x84, 0x5c, + 0x87, 0x34, 0x90, 0x31, 0x94, 0x12, 0x51, 0x95, 0x59, 0xe7, 0xb3, 0xc9, + 0x72, 0x43, 0x25, 0x51, 0xea, 0xfc, 0xf0, 0xb0, 0x82, 0x59, 0x8a, 0x3d, + 0x70, 0xf7, 0x63, 0x1c, 0xaf, 0x8f, 0x09, 0x98, 0x57, 0xf6, 0x5e, 0x73, + 0xd8, 0x6b, 0xd9, 0x83, 0x56, 0x38, 0x3d, 0xd3, 0xc1, 0xca, 0x9f, 0x61, + 0x47, 0xfb, 0x60, 0xcc, 0x78, 0x2a, 0xe7, 0xc6, 0x8a, 0x46, 0x1f, 0x20, + 0xa9, 0xeb, 0x98, 0xae, 0x27, 0xa4, 0x96, 0xb9, 0x9e, 0x8d, 0xdd, 0x4e, + 0xa0, 0x55, 0x63, 0x1a, 0xcc, 0x9b, 0xc1, 0xa2, 0x56, 0xa5, 0x4d, 0x5f, + 0xad, 0x20, 0x40, 0x53, 0x69, 0x08, 0x81, 0x51, 0xa8, 0x7b, 0x98, 0x63, + 0x89, 0x1d, 0xf8, 0x4d, 0x0a, 0x9d, 0x95, 0x06, 0x20, 0x0e, 0x07, 0x8a, + 0xcf, 0x7f, 0x96, 0x9c, 0x25, 0x91, 0xb5, 0x3f, 0x92, 0xb5, 0xe7, 0xd0, + 0x4a, 0x75, 0xf0, 0x9a, 0xa0, 0xad, 0x3a, 0x98, 0x26, 0xae, 0x5a, 0x0e, + 0xa0, 0x7b, 0x5c, 0x39, 0x91, 0x8f, 0x54, 0x98, 0x59, 0x37, 0x80, 0x07, + 0x70, 0x44, 0x42, 0x10, 0x93, 0xb4, 0xaf, 0x64, 0x7f, 0x02, 0xce, 0x8a, + 0x8e, 0x8b, 0x6b, 0x79, 0x56, 0x5c, 0x91, 0xc3, 0x37, 0x86, 0x18, 0x96, + 0x6b, 0x92, 0xce, 0x37, 0xc9, 0x72, 0x05, 0x5f, 0x55, 0x77, 0x86, 0xd2, + 0xcb, 0x43, 0x84, 0x1c, 0x17, 0xd4, 0x51, 0x50, 0x4a, 0x35, 0xa8, 0x9e, + 0x40, 0x06, 0xe9, 0xeb, 0x04, 0xaa, 0x95, 0x56, 0x04, 0xbd, 0xc6, 0x04, + 0x8e, 0xe4, 0x94, 0x8c, 0xc1, 0xf3, 0xa8, 0xa7, 0x8e, 0xed, 0x57, 0x0e, + 0xaa, 0x19, 0x8c, 0xe7, 0xe1, 0xfc, 0x05, 0xf4, 0x98, 0xd7, 0x5e, 0xb3, + 0x70, 0x9e, 0xaf, 0xef, 0x58, 0xdc, 0xeb, 0x96, 0xda, 0xf9, 0xdd, 0xe9, + 0xf8, 0x91, 0xcc, 0xb8, 0x6d, 0xaf, 0x41, 0xe3, 0xd6, 0x55, 0xc2, 0xf6, + 0x23, 0x8e, 0xbc, 0xd2, 0x26, 0x6b, 0x15, 0x2c, 0xee, 0xf7, 0xa1, 0x7f, + 0x6d, 0x45, 0xe2, 0xfd, 0xfe, 0x56, 0x25, 0xfe, 0xbc, 0xc2, 0x93, 0x5d, + 0xb3, 0xce, 0xd2, 0xbe, 0x35, 0x66, 0xca, 0xc0, 0x79, 0x18, 0x09, 0x8d, + 0x95, 0x7a, 0x1f, 0xd4, 0x76, 0xe4, 0x92, 0x04, 0xb7, 0xdd, 0x07, 0x04, + 0xbd, 0x5a, 0x06, 0x36, 0xda, 0x7d, 0x40, 0x2c, 0x1b, 0xb0, 0x22, 0xc5, + 0x88, 0xae, 0x8f, 0xbf, 0x24, 0x26, 0x25, 0x97, 0x81, 0x02, 0x92, 0xa5, + 0x00, 0x66, 0x91, 0x14, 0x3e, 0x36, 0x29, 0x92, 0xfd, 0xf3, 0x49, 0xb2, + 0x88, 0x45, 0x44, 0x93, 0x6a, 0xd9, 0x02, 0xc3, 0x26, 0xcb, 0x0e, 0xc3, + 0x26, 0xbb, 0xd5, 0xb6, 0x15, 0xf0, 0x37, 0xe9, 0xa2, 0xc4, 0x96, 0xd6, + 0x4e, 0xa5, 0xfe, 0xdd, 0x31, 0xe7, 0xad, 0x38, 0x48, 0x14, 0x95, 0x11, + 0x24, 0x93, 0x81, 0x64, 0xf4, 0xa1, 0xf5, 0xdb, 0xcb, 0x78, 0xc9, 0x07, + 0x55, 0x25, 0xd2, 0x24, 0x23, 0x0f, 0xac, 0x47, 0xef, 0xca, 0x50, 0xe4, + 0x07, 0x92, 0xba, 0x18, 0x7e, 0x21, 0x35, 0xfd, 0x39, 0x4e, 0x7d, 0xad, + 0xa1, 0x46, 0x04, 0xf7, 0x01, 0x17, 0x57, 0xc7, 0x8b, 0x76, 0xa2, 0xd2, + 0xdc, 0x29, 0x5e, 0x52, 0xb4, 0x7e, 0x3c, 0x77, 0xc3, 0xa1, 0x11, 0x48, + 0x1a, 0x9f, 0xa7, 0x71, 0x76, 0xf9, 0x8c, 0x56, 0x49, 0x61, 0x12, 0xca, + 0x87, 0xfe, 0x27, 0xe2, 0x57, 0x44, 0x7d, 0x4d, 0x1d, 0xf7, 0x7a, 0xa9, + 0xd3, 0xed, 0x91, 0xd3, 0xbb, 0x8b, 0x65, 0x35, 0x30, 0x5c, 0xca, 0x53, + 0x11, 0x5a, 0xdc, 0xc0, 0x4a, 0x84, 0xf5, 0x12, 0x41, 0xb7, 0xd5, 0xc0, + 0xb3, 0xb3, 0x53, 0xf6, 0x14, 0xa1, 0xaa, 0xb9, 0x98, 0x3f, 0x8c, 0xb0, + 0xee, 0xcd, 0x50, 0x8f, 0x05, 0xea, 0x5e, 0x73, 0xd4, 0xdf, 0x04, 0xea, + 0x63, 0x44, 0x0d, 0xda, 0xdc, 0x28, 0xed, 0x71, 0xd0, 0x6a, 0x2f, 0x77, + 0x9a, 0x91, 0x08, 0xef, 0x76, 0x40, 0x9c, 0xfa, 0x5d, 0x10, 0x8f, 0x6d, + 0xfb, 0x1e, 0x46, 0x2b, 0xbd, 0x95, 0x8e, 0xf2, 0x56, 0x7b, 0x20, 0x79, + 0x09, 0x4d, 0xbb, 0x20, 0x9f, 0x08, 0xd5, 0x76, 0x42, 0x3b, 0x9e, 0x1b, + 0x3d, 0x96, 0x59, 0xf4, 0x37, 0x6f, 0x9f, 0xec, 0xfa, 0x2a, 0xfd, 0xe9, + 0xea, 0x82, 0xd1, 0x88, 0x98, 0x95, 0xd5, 0x82, 0x72, 0xf5, 0x5a, 0x50, + 0x82, 0xb7, 0x2a, 0x94, 0xa3, 0x57, 0x46, 0x86, 0x79, 0xa3, 0xcf, 0xa6, + 0x55, 0x42, 0xd7, 0xc1, 0x1d, 0x13, 0xf3, 0xf4, 0xf6, 0x98, 0x2e, 0x12, + 0xbe, 0x3d, 0xd6, 0xc6, 0x90, 0x81, 0x9a, 0x37, 0x13, 0x67, 0x0d, 0x1d, + 0x22, 0xd7, 0xae, 0xa8, 0xbf, 0x7a, 0x67, 0xb3, 0x95, 0x65, 0x09, 0xb2, + 0x2e, 0xd2, 0x8a, 0x35, 0xae, 0x90, 0x35, 0xe6, 0xb7, 0x29, 0xbb, 0xd3, + 0x26, 0xc8, 0x9f, 0x28, 0x97, 0xbc, 0xa6, 0x21, 0x7b, 0xcd, 0xdf, 0x42, + 0x90, 0x1e, 0x82, 0x3f, 0xd2, 0xe2, 0x04, 0x0e, 0xdd, 0x40, 0x81, 0x7e, + 0x5d, 0x16, 0xc7, 0x31, 0x78, 0xc0, 0xd7, 0x80, 0x3e, 0x5a, 0xc4, 0x4a, + 0x0a, 0x8a, 0x74, 0xac, 0x34, 0x1b, 0xc9, 0x0b, 0xd2, 0x3c, 0xe2, 0xf1, + 0x00, 0x69, 0xeb, 0x1c, 0x82, 0xa2, 0x86, 0xbd, 0xdd, 0x52, 0x60, 0xee, + 0xec, 0x04, 0x2d, 0x8a, 0x3e, 0x22, 0xcb, 0xf7, 0x48, 0x6e, 0xf2, 0x8a, + 0x37, 0x0b, 0xb1, 0xc9, 0x96, 0xd0, 0x5b, 0xdd, 0x6d, 0x27, 0xb3, 0x0a, + 0x50, 0x3e, 0xb0, 0x0b, 0xff, 0x3e, 0xc7, 0x93, 0x31, 0x32, 0xa6, 0x86, + 0xfb, 0x66, 0x87, 0x19, 0xab, 0x60, 0xac, 0x43, 0x1f, 0xb1, 0xa0, 0xd3, + 0x79, 0xfe, 0xa0, 0x07, 0x01, 0x6f, 0x6f, 0xe0, 0x5a, 0x71, 0x39, 0x47, + 0x94, 0x3b, 0x2e, 0x00, 0x43, 0x08, 0xaa, 0x17, 0x99, 0x83, 0x1f, 0x27, + 0x71, 0xdf, 0x9a, 0xb6, 0x28, 0x59, 0x32, 0x57, 0x8d, 0x44, 0xe1, 0xdb, + 0xd8, 0xb1, 0x7a, 0xeb, 0x15, 0x63, 0xbc, 0x79, 0x80, 0xad, 0x27, 0xb1, + 0x43, 0x0a, 0x70, 0x6b, 0x4a, 0x7b, 0xda, 0xa2, 0x0d, 0x4f, 0xe8, 0xa1, + 0x3e, 0x7e, 0x8d, 0x39, 0xa3, 0x98, 0x62, 0xb5, 0x82, 0x21, 0x58, 0x47, + 0x26, 0x00, 0x77, 0x67, 0xdd, 0x85, 0x1f, 0x2b, 0xf0, 0xa3, 0x90, 0x48, + 0x00, 0xfe, 0xdb, 0xfc, 0x41, 0xad, 0x8f, 0x57, 0xaa, 0x5d, 0x96, 0x6c, + 0x9e, 0x00, 0x66, 0x5c, 0x80, 0x1f, 0x05, 0xdc, 0xc7, 0xf7, 0xdf, 0xaa, + 0x0f, 0x61, 0xe8, 0xfc, 0xe6, 0x59, 0x99, 0x46, 0x02, 0x2d, 0x47, 0x29, + 0x01, 0x3c, 0x54, 0x2f, 0xe9, 0x3c, 0x51, 0xb0, 0x4a, 0x3a, 0x8f, 0x70, + 0x2b, 0x1a, 0x35, 0xca, 0x58, 0xa9, 0x87, 0xf6, 0xe3, 0xe0, 0x8a, 0x6a, + 0x98, 0x06, 0x5a, 0x75, 0xa2, 0x33, 0x15, 0xc1, 0x75, 0x72, 0x9f, 0x3c, + 0x51, 0x44, 0xe0, 0x41, 0xbb, 0xa3, 0x20, 0xac, 0xd4, 0xc0, 0x1a, 0x06, + 0x62, 0x5d, 0x18, 0x58, 0xa3, 0x40, 0xac, 0xa9, 0x81, 0xb5, 0x17, 0x88, + 0x05, 0xe7, 0x38, 0x79, 0x44, 0x8e, 0xa7, 0xab, 0x8f, 0xe3, 0x9b, 0xe8, + 0x54, 0xaf, 0x63, 0xcf, 0xe0, 0xbd, 0x67, 0xf0, 0xd4, 0x33, 0xca, 0x3a, + 0xeb, 0x86, 0x95, 0x76, 0x3d, 0x32, 0x98, 0x7c, 0x1c, 0xc8, 0x64, 0x6a, + 0xa2, 0xed, 0x07, 0xa2, 0x5d, 0x98, 0x68, 0x07, 0x81, 0x68, 0x53, 0x13, + 0xed, 0xf5, 0x40, 0x34, 0x90, 0xe4, 0xa8, 0x44, 0x94, 0x8f, 0x0d, 0x71, + 0xed, 0x1b, 0xbf, 0x0e, 0xf0, 0x97, 0x2a, 0x2c, 0x5c, 0x94, 0x7b, 0x06, + 0x97, 0x6f, 0x04, 0x72, 0x99, 0x9a, 0x68, 0x6f, 0x06, 0xa2, 0x5d, 0x98, + 0x68, 0xc3, 0xd0, 0x0e, 0x30, 0xb5, 0xf0, 0x42, 0xbb, 0x00, 0x08, 0x73, + 0xaf, 0x44, 0x98, 0x6f, 0x18, 0x02, 0x7b, 0xd3, 0xd4, 0x52, 0x4b, 0x69, + 0x87, 0x20, 0xce, 0x87, 0x18, 0x0e, 0xd1, 0x92, 0xd8, 0xd1, 0x84, 0xc7, + 0x55, 0x2b, 0x8a, 0xac, 0x32, 0x1a, 0xed, 0x20, 0x2d, 0x61, 0x8a, 0x55, + 0x47, 0xa0, 0x85, 0x76, 0x28, 0x43, 0xac, 0x8e, 0x3a, 0x3b, 0x98, 0x96, + 0xe2, 0x55, 0x47, 0x9a, 0x1d, 0x5c, 0x0b, 0xc4, 0x00, 0x73, 0x5b, 0x21, + 0xa8, 0x51, 0x6b, 0x41, 0x8d, 0x5a, 0x4b, 0x6a, 0xd4, 0x56, 0x54, 0xa3, + 0xd6, 0xb2, 0x1a, 0x35, 0x12, 0x56, 0x89, 0xac, 0xf6, 0x5a, 0xcb, 0x6a, + 0xaf, 0xb5, 0xac, 0xf6, 0xda, 0xca, 0x6a, 0xaf, 0xb5, 0xac, 0xf6, 0xc2, + 0x65, 0xe5, 0x77, 0x2e, 0xf9, 0xfb, 0x9a, 0x8d, 0x9c, 0xca, 0x8a, 0x67, + 0x28, 0xef, 0x9c, 0x98, 0xab, 0xf6, 0x4b, 0x94, 0x21, 0x81, 0x61, 0x4b, + 0x22, 0xc1, 0x06, 0xb9, 0x5c, 0x15, 0x0f, 0x59, 0xde, 0xd5, 0x3f, 0x65, + 0x19, 0x14, 0xc8, 0xb5, 0x2c, 0x70, 0x6b, 0x90, 0xf7, 0x2b, 0xe3, 0x8c, + 0xd6, 0xf2, 0xe7, 0x79, 0x0d, 0xb3, 0x96, 0x3f, 0x80, 0xf1, 0xf2, 0x47, + 0x59, 0x61, 0xde, 0x79, 0xc5, 0x73, 0x9a, 0x77, 0xf5, 0x0f, 0x6a, 0x06, + 0x05, 0x47, 0x2d, 0x0d, 0x86, 0x1a, 0xcc, 0x9f, 0xff, 0x45, 0xce, 0xbb, + 0xfa, 0x37, 0x39, 0x59, 0x48, 0x18, 0xd3, 0xd2, 0xb0, 0xa5, 0x21, 0xfc, + 0x55, 0x3c, 0xea, 0x79, 0x57, 0xf1, 0xac, 0x67, 0xc8, 0x94, 0x7b, 0xb6, + 0xb4, 0x1a, 0x57, 0xd1, 0x0a, 0xe4, 0x0c, 0x28, 0xd4, 0x72, 0x66, 0xbe, + 0x0c, 0x1a, 0xb0, 0x18, 0x30, 0x5b, 0x6d, 0x4a, 0x18, 0x9b, 0x85, 0x2d, + 0x07, 0xfc, 0x65, 0x2f, 0x8b, 0x86, 0x5d, 0x0c, 0xb4, 0xea, 0xf1, 0x17, + 0xbc, 0x56, 0xca, 0x58, 0xf8, 0xbb, 0x98, 0x61, 0x15, 0xba, 0x6e, 0xf0, + 0x48, 0x26, 0xfd, 0x99, 0x27, 0x70, 0xb7, 0x53, 0xa8, 0xb6, 0x44, 0x1a, + 0x36, 0xd8, 0xed, 0x4a, 0xd0, 0x00, 0x57, 0xf7, 0xba, 0x29, 0xfc, 0xa8, + 0x29, 0xc2, 0x5e, 0x15, 0x02, 0x68, 0x79, 0xd0, 0x88, 0x1b, 0xfe, 0x0a, + 0xed, 0x5d, 0xc5, 0x3b, 0xb4, 0xb5, 0x7d, 0x12, 0x60, 0xbc, 0x9a, 0x0c, + 0xe9, 0x81, 0x3d, 0xb2, 0xec, 0x15, 0xdb, 0xbb, 0xba, 0x77, 0x6c, 0x1b, + 0xc7, 0x25, 0x71, 0xd9, 0x24, 0x4a, 0xa1, 0xd6, 0x96, 0x82, 0xe5, 0x84, + 0x9b, 0x0e, 0x4f, 0x48, 0x1f, 0x83, 0xd2, 0x51, 0xb3, 0xb3, 0xf8, 0xd6, + 0xbd, 0xdf, 0xe0, 0x70, 0x76, 0xcd, 0xe9, 0xe3, 0xcd, 0xdf, 0xda, 0x02, + 0x86, 0xa3, 0xf6, 0x05, 0x88, 0xbb, 0xbf, 0x81, 0x01, 0xb6, 0x9a, 0xd3, + 0x87, 0xbb, 0xbf, 0xb5, 0x15, 0x38, 0x80, 0xdd, 0xcf, 0xa0, 0x7e, 0x84, + 0x2f, 0xca, 0x81, 0x81, 0x69, 0xb4, 0x1a, 0x0a, 0x6b, 0x31, 0xc1, 0x6a, + 0x02, 0xf0, 0xea, 0x98, 0x1b, 0xbe, 0xa7, 0x63, 0x9f, 0x40, 0x71, 0x4b, + 0x22, 0xb0, 0x01, 0xf8, 0xa9, 0xf4, 0x6e, 0x55, 0xf1, 0x43, 0x1c, 0x57, + 0x66, 0x6f, 0xb3, 0x5d, 0x7f, 0x69, 0xfe, 0x1b, 0x07, 0x74, 0x92, 0xec, + 0x8e, 0xd1, 0x63, 0x6b, 0x87, 0x8a, 0x5a, 0x8f, 0x25, 0x73, 0xfe, 0x93, + 0xe0, 0xd4, 0x51, 0xca, 0xc0, 0x49, 0x00, 0x25, 0x07, 0x9c, 0xfc, 0xb7, + 0xa7, 0xf6, 0xcc, 0x33, 0xab, 0x77, 0x9f, 0x39, 0x71, 0x01, 0xfc, 0x4f, + 0xa7, 0x94, 0x95, 0x44, 0x77, 0xb1, 0xd8, 0x57, 0xf4, 0x2f, 0x90, 0xb4, + 0x20, 0xcb, 0x1f, 0x5c, 0xa9, 0xe2, 0x3c, 0xa3, 0x07, 0x4b, 0xd2, 0xd5, + 0x22, 0x2b, 0x07, 0x94, 0x1b, 0x33, 0x84, 0xe0, 0xc2, 0xc9, 0x7c, 0x51, + 0x05, 0x7a, 0xfb, 0xf4, 0xa8, 0xe6, 0x34, 0x92, 0x81, 0xc2, 0xce, 0xa1, + 0x98, 0xec, 0x32, 0x9e, 0xbf, 0x60, 0x8c, 0xff, 0x41, 0xb7, 0xdb, 0x4a, + 0x4b, 0xf0, 0x61, 0x55, 0x14, 0x04, 0x0d, 0x5c, 0x4a, 0x8a, 0xf4, 0x0e, + 0x25, 0x41, 0x1b, 0x64, 0xc5, 0x2f, 0xdf, 0xbe, 0x53, 0x91, 0xc9, 0xe4, + 0x2b, 0xb0, 0xb5, 0x07, 0xb3, 0x9e, 0x00, 0x74, 0x32, 0x59, 0x24, 0xbf, + 0xc0, 0xee, 0xe1, 0x60, 0x30, 0x70, 0x38, 0x53, 0x57, 0xf7, 0xd4, 0x73, + 0x44, 0xa4, 0xdc, 0xbc, 0x4e, 0x3e, 0xe0, 0x32, 0x6b, 0x63, 0xac, 0xd7, + 0x37, 0xb9, 0x5b, 0x09, 0x05, 0xbb, 0x5c, 0xa9, 0x93, 0xd6, 0x9f, 0x8a, + 0xc7, 0x32, 0xc1, 0xe6, 0xf8, 0xd4, 0x52, 0x1d, 0xeb, 0xe0, 0xe7, 0x67, + 0x9a, 0xde, 0xe8, 0x6a, 0xb6, 0x4f, 0x58, 0x4b, 0xad, 0x88, 0xfb, 0xe1, + 0xa3, 0xe8, 0x3d, 0x8e, 0x47, 0x87, 0xf5, 0x4b, 0xfb, 0x2f, 0x97, 0x56, + 0x79, 0x07, 0x9f, 0xa9, 0xc5, 0x3f, 0x2f, 0x90, 0xd2, 0x28, 0x79, 0x76, + 0xa0, 0xea, 0x0a, 0xd8, 0x0c, 0x2f, 0x3b, 0x32, 0xda, 0xdb, 0x55, 0x5b, + 0xc7, 0xee, 0x29, 0x37, 0x3a, 0x2f, 0x23, 0xf6, 0x84, 0x49, 0x07, 0xdd, + 0x2d, 0xe0, 0x13, 0x86, 0x40, 0xa4, 0xd3, 0x12, 0xf0, 0xc8, 0xbf, 0xbb, + 0x6c, 0x10, 0x53, 0x07, 0xbd, 0x65, 0xd2, 0x0b, 0x63, 0x38, 0x0e, 0x44, + 0x85, 0x84, 0x1c, 0x02, 0xae, 0x3c, 0x58, 0x5f, 0xc6, 0xa5, 0x7e, 0x6a, + 0x31, 0x5f, 0x11, 0xcf, 0x88, 0x3e, 0xd8, 0xa4, 0x0b, 0xcf, 0x79, 0x00, + 0x97, 0x63, 0x65, 0xdc, 0xbd, 0x27, 0xcb, 0xe5, 0xe5, 0xc5, 0x67, 0x7c, + 0x95, 0x0c, 0xfb, 0x19, 0xa5, 0x47, 0x19, 0x6d, 0x2a, 0xfa, 0x1e, 0x7b, + 0xe3, 0x18, 0xb4, 0x0f, 0xc5, 0x81, 0x80, 0x70, 0x5d, 0x08, 0x04, 0x18, + 0xdf, 0xdb, 0xa0, 0x81, 0x2d, 0x6f, 0x89, 0xd9, 0x06, 0x8d, 0x16, 0xf1, + 0x5a, 0x23, 0xb6, 0xe4, 0x15, 0xd7, 0xff, 0xda, 0xe2, 0xb5, 0x2c, 0x12, + 0x27, 0x53, 0xad, 0xca, 0x24, 0xc4, 0xea, 0x42, 0xa1, 0x73, 0xd8, 0xaa, + 0x73, 0x6f, 0x77, 0x52, 0xff, 0xb0, 0x26, 0xc1, 0xa7, 0x79, 0xd8, 0x8d, + 0x36, 0x80, 0x33, 0x03, 0x9b, 0xaa, 0xfb, 0x60, 0x40, 0xa3, 0xfc, 0x3a, + 0x18, 0x64, 0xd2, 0x4d, 0xb0, 0x06, 0x83, 0x80, 0xec, 0x39, 0x66, 0x15, + 0x63, 0x79, 0x5e, 0x81, 0x0d, 0xd9, 0xaf, 0xbf, 0x1a, 0x69, 0x63, 0x48, + 0x43, 0x67, 0x0f, 0x86, 0x1d, 0x13, 0x72, 0xff, 0xf5, 0x2e, 0xf0, 0xc2, + 0x07, 0x90, 0xaf, 0x4f, 0x9e, 0x7e, 0xf1, 0x19, 0x83, 0x6e, 0xfe, 0xd9, + 0x17, 0xef, 0x7f, 0x60, 0xbd, 0xa9, 0x55, 0x79, 0x5d, 0x50, 0xf4, 0x6e, + 0xff, 0x0d, 0x69, 0x81, 0xff, 0xe0, 0x97, 0xa4, 0x39, 0xd9, 0x46, 0x77, + 0xe6, 0xc2, 0x5e, 0x57, 0xe1, 0x30, 0xc0, 0x9c, 0x8b, 0x68, 0x2c, 0x13, + 0xc8, 0xc4, 0x46, 0x77, 0x58, 0xfd, 0x4d, 0xf6, 0x36, 0xdf, 0x5b, 0xaa, + 0x3f, 0xa1, 0xf8, 0x40, 0x6e, 0x03, 0x14, 0x2f, 0x49, 0x29, 0x05, 0xd9, + 0x3f, 0x00, 0x16, 0xe8, 0xde, 0xdc, 0xd7, 0x4f, 0xbf, 0xf8, 0xf2, 0xd3, + 0x77, 0xbf, 0x37, 0xe5, 0x2d, 0xed, 0x32, 0x82, 0x8b, 0x5b, 0xc8, 0x11, + 0x0d, 0x91, 0x96, 0xd5, 0x2f, 0x35, 0xe0, 0xe0, 0x83, 0x95, 0xc2, 0xf2, + 0xc3, 0x26, 0x0a, 0xb8, 0x9a, 0x32, 0x9d, 0x09, 0x28, 0xa3, 0xac, 0xd6, + 0x86, 0xfc, 0xb5, 0x7c, 0x9d, 0xd7, 0x92, 0x6b, 0xfb, 0xb3, 0x6f, 0x4f, + 0x38, 0xda, 0xf3, 0x29, 0xbb, 0x4f, 0x1f, 0xa5, 0xe6, 0x37, 0xd3, 0x0f, + 0xa5, 0x71, 0xed, 0x34, 0xd5, 0xec, 0x7a, 0x02, 0xa4, 0xb6, 0xf3, 0xb5, + 0xea, 0x80, 0x5a, 0xc7, 0x08, 0xe8, 0x86, 0xd4, 0x2e, 0xff, 0x4d, 0x8d, + 0x7a, 0x83, 0x6b, 0xd4, 0xd3, 0x6f, 0xfe, 0x35, 0xd5, 0x43, 0xe0, 0xf0, + 0xfa, 0xbd, 0x29, 0x46, 0x88, 0x0f, 0x86, 0x83, 0xbd, 0xe1, 0xbf, 0xa6, + 0x8e, 0x4d, 0x9a, 0xf0, 0x60, 0x57, 0x54, 0xf1, 0xc3, 0x24, 0x8d, 0x47, + 0xbb, 0xc3, 0xd1, 0xbf, 0xa6, 0x96, 0x1c, 0xb8, 0xf6, 0x11, 0xee, 0xe7, + 0xae, 0x01, 0x02, 0xff, 0x65, 0x55, 0x70, 0x9e, 0xa4, 0x36, 0x5b, 0x6b, + 0xb7, 0xd1, 0x7d, 0xff, 0xce, 0xea, 0xfc, 0xbc, 0x51, 0xf4, 0x22, 0x35, + 0x54, 0xb6, 0x92, 0x60, 0x53, 0x3d, 0x70, 0x05, 0xd9, 0x00, 0xa1, 0x42, + 0xe9, 0x5d, 0x37, 0xd7, 0x2d, 0xc5, 0x9d, 0x5a, 0x05, 0x44, 0x34, 0x6b, + 0xe3, 0xa8, 0x73, 0xcc, 0x52, 0x4f, 0xdd, 0x65, 0x54, 0xd5, 0xae, 0x05, + 0x9f, 0x80, 0xd7, 0x6e, 0xc2, 0x45, 0x88, 0x4d, 0xb9, 0xd4, 0x34, 0xc2, + 0x3b, 0x49, 0xbd, 0x32, 0x6e, 0x22, 0xbb, 0x11, 0x2d, 0xc0, 0xec, 0xa0, + 0x8e, 0x87, 0x3c, 0xff, 0x8e, 0x0f, 0xbc, 0x87, 0x39, 0x8a, 0x12, 0xc3, + 0xad, 0x47, 0x45, 0xa8, 0x87, 0x38, 0xa7, 0xca, 0x10, 0xf2, 0x33, 0x2c, + 0xee, 0x4e, 0x79, 0xab, 0x20, 0x95, 0x69, 0x0c, 0xde, 0x41, 0x86, 0x17, + 0x42, 0x2e, 0xe2, 0xb4, 0x00, 0xd2, 0xd9, 0x31, 0x0f, 0x46, 0x0f, 0x4d, + 0x0f, 0xda, 0xc8, 0x13, 0xd8, 0x00, 0xe1, 0x37, 0x5a, 0xe0, 0x86, 0x7e, + 0x08, 0xfd, 0x13, 0x56, 0x92, 0xc5, 0x1a, 0x5b, 0x66, 0x78, 0xaf, 0xb2, + 0x74, 0x34, 0x07, 0xd4, 0xc1, 0x15, 0x17, 0x2e, 0x1f, 0xbb, 0xae, 0x6d, + 0x81, 0x8f, 0xda, 0xf5, 0xcc, 0xe2, 0xaa, 0x13, 0x5d, 0xe0, 0x16, 0x05, + 0x92, 0xd4, 0x2c, 0x99, 0x91, 0xd6, 0xe0, 0x7c, 0xd1, 0xc2, 0x7b, 0x07, + 0xf0, 0xcc, 0xa3, 0xb2, 0x5e, 0x74, 0x75, 0xd0, 0xda, 0x43, 0xe3, 0x65, + 0xa0, 0xe1, 0x1c, 0x01, 0xf7, 0x51, 0x21, 0x53, 0xc3, 0x09, 0x04, 0x9f, + 0x60, 0x2b, 0x4a, 0x79, 0x11, 0x4b, 0x51, 0x87, 0xef, 0xec, 0x0d, 0xc5, + 0x9e, 0x73, 0xf4, 0xc8, 0x49, 0xb9, 0x70, 0x52, 0xa6, 0x67, 0x5d, 0xcd, + 0x12, 0x05, 0x1f, 0x16, 0x53, 0x3c, 0xd5, 0x30, 0x35, 0x72, 0xb9, 0x72, + 0x93, 0x2e, 0xdc, 0xa4, 0xe9, 0x28, 0x94, 0xb1, 0xbd, 0x12, 0xc6, 0xea, + 0x38, 0xdb, 0x73, 0x39, 0x73, 0x93, 0x2e, 0xdc, 0xa4, 0xe9, 0x9e, 0xc1, + 0xd9, 0x3d, 0x7e, 0xf2, 0x58, 0x20, 0xc6, 0xc3, 0xf8, 0xc7, 0x32, 0x1a, + 0x08, 0xdd, 0xd9, 0x99, 0x2c, 0x7f, 0x9e, 0x54, 0x4d, 0x13, 0x1e, 0xf1, + 0x3a, 0xd1, 0x93, 0x0e, 0xcf, 0x38, 0x34, 0xc5, 0x90, 0x13, 0x17, 0x7e, + 0x30, 0x46, 0x2d, 0x60, 0xf3, 0x0c, 0xc4, 0x3d, 0xe6, 0x69, 0xd1, 0xa3, + 0xd1, 0x9c, 0xe0, 0x8c, 0x98, 0x0f, 0x57, 0xeb, 0xd5, 0x12, 0x08, 0xf3, + 0x7a, 0xcf, 0x0a, 0xf1, 0xa4, 0x71, 0xbe, 0x49, 0x97, 0x2c, 0xea, 0xec, + 0xa2, 0x60, 0xb8, 0xa5, 0x80, 0xec, 0x41, 0xbe, 0x3a, 0xc9, 0x53, 0xb0, + 0x69, 0x11, 0x04, 0x8a, 0x85, 0x11, 0x78, 0x91, 0xc0, 0xd4, 0xa7, 0x3f, + 0xc2, 0xf4, 0xaf, 0xd7, 0x6b, 0xd8, 0x68, 0x99, 0x64, 0x71, 0xe4, 0x98, + 0x21, 0x25, 0x58, 0xf8, 0xe2, 0x14, 0xa1, 0x78, 0x90, 0x20, 0xb0, 0x59, + 0xd6, 0x85, 0x52, 0x3d, 0x19, 0xc3, 0xb2, 0x8c, 0x51, 0x59, 0x06, 0x34, + 0x80, 0xcb, 0xcf, 0x6a, 0x79, 0x42, 0x66, 0x82, 0xda, 0x80, 0x87, 0xb5, + 0x33, 0xba, 0xd9, 0x0b, 0x9e, 0xa5, 0x48, 0x23, 0x34, 0xce, 0x7a, 0x25, + 0x8d, 0x2e, 0x21, 0x0f, 0xd6, 0x29, 0x7d, 0xbe, 0x1f, 0x9f, 0x4f, 0x36, + 0x8b, 0x9c, 0x24, 0xa0, 0xa8, 0x71, 0x10, 0xf5, 0x86, 0x48, 0xbe, 0xda, + 0xcc, 0x2e, 0xf1, 0xb5, 0x53, 0x65, 0xe2, 0x24, 0x5d, 0x0a, 0x44, 0x28, + 0xe0, 0x27, 0x29, 0xb4, 0x9d, 0xb2, 0x73, 0x58, 0x26, 0x64, 0x5a, 0x6e, + 0xd2, 0xcd, 0x21, 0xfb, 0x6c, 0x92, 0x5f, 0x0e, 0xc8, 0x01, 0x8a, 0x74, + 0xcc, 0xa7, 0x58, 0x0a, 0x6d, 0x3c, 0x0e, 0xd6, 0x30, 0xb9, 0xfd, 0x8e, + 0xf5, 0x81, 0xfa, 0x00, 0x0c, 0x2b, 0x98, 0x96, 0x4f, 0xe3, 0xf3, 0xbc, + 0xdb, 0x33, 0x29, 0xdd, 0x86, 0x52, 0xfa, 0x5e, 0x51, 0xc2, 0xbc, 0x75, + 0x57, 0x33, 0xc5, 0x52, 0xd5, 0xcb, 0x2b, 0x4f, 0xe1, 0xac, 0xb0, 0xe2, + 0x2d, 0x2a, 0xc6, 0x8b, 0xfc, 0x2e, 0x84, 0x73, 0x0e, 0xfa, 0xbd, 0x9f, + 0x37, 0xd5, 0x8e, 0x22, 0x10, 0xaa, 0xe8, 0x36, 0xd4, 0xd3, 0x9e, 0x5c, + 0x41, 0x1d, 0xdf, 0x87, 0xf6, 0x8f, 0x80, 0xaf, 0xc1, 0x4d, 0x8f, 0xe1, + 0xc7, 0x2d, 0xdc, 0x2d, 0x83, 0xff, 0xba, 0x74, 0x09, 0x0b, 0x09, 0xa9, + 0x88, 0xce, 0xcf, 0x04, 0x0d, 0xa5, 0xe4, 0x94, 0x60, 0xc5, 0xc1, 0x24, + 0x03, 0xe4, 0xb7, 0xdf, 0x14, 0xf6, 0x08, 0xe3, 0x1d, 0x99, 0x99, 0x1c, + 0xdf, 0x32, 0x28, 0xa7, 0x1d, 0x28, 0x11, 0x7a, 0xa4, 0x20, 0x79, 0xc6, + 0xc6, 0x8a, 0x85, 0x12, 0x84, 0xd4, 0x04, 0x57, 0xb7, 0x1f, 0xbc, 0xd0, + 0x17, 0x3e, 0xe8, 0x61, 0x19, 0xf4, 0xd4, 0x07, 0x3d, 0x2a, 0x83, 0xbe, + 0xd6, 0xa0, 0xd5, 0x18, 0xae, 0xce, 0xc3, 0x9a, 0xdc, 0x59, 0x47, 0x5e, + 0x5d, 0x66, 0xd4, 0xa9, 0x56, 0xb7, 0x68, 0xf7, 0x2c, 0x8f, 0xbb, 0x95, + 0x8a, 0x2d, 0x54, 0xb9, 0x4d, 0xec, 0xdf, 0xf0, 0xf5, 0x6e, 0x3d, 0x5b, + 0x1b, 0x1e, 0xee, 0xe3, 0x3a, 0x86, 0x79, 0x11, 0xda, 0x66, 0x74, 0x02, + 0xa9, 0x81, 0x74, 0x43, 0xf7, 0x2b, 0x0c, 0xa1, 0xb0, 0xdb, 0x63, 0xf0, + 0x9f, 0x30, 0xe3, 0xd7, 0xc9, 0x3c, 0xbf, 0x2c, 0x7e, 0x5d, 0xc6, 0xe8, + 0x37, 0x68, 0x03, 0x8b, 0xa4, 0x1d, 0xf2, 0x74, 0x91, 0x5e, 0x2a, 0xb1, + 0x49, 0xe9, 0x50, 0x0d, 0xd7, 0x71, 0x53, 0x40, 0xdf, 0xe2, 0x60, 0x13, + 0x69, 0x25, 0x16, 0x85, 0xee, 0xbc, 0xfa, 0xaa, 0x00, 0x7d, 0x95, 0xbd, + 0x0f, 0x90, 0x99, 0xe8, 0x54, 0x38, 0x4a, 0xc8, 0x8c, 0x1d, 0x25, 0x1b, + 0x8d, 0x9a, 0x61, 0x51, 0x67, 0x31, 0xd4, 0x3f, 0xfd, 0x8e, 0x8d, 0x8d, + 0x1a, 0xb3, 0x1d, 0x36, 0x3a, 0xb2, 0x81, 0xbe, 0x07, 0x20, 0x43, 0x10, + 0x12, 0xca, 0xbd, 0xc7, 0x28, 0xa8, 0xf6, 0x24, 0x66, 0x90, 0x3c, 0xb1, + 0x24, 0xba, 0x26, 0xfe, 0x15, 0x6c, 0xbc, 0x6e, 0x32, 0x97, 0xa5, 0xc7, + 0x83, 0x7d, 0x0d, 0x14, 0x76, 0x5e, 0x35, 0xd0, 0xc8, 0x80, 0xed, 0xb3, + 0xe1, 0x6e, 0xd7, 0x64, 0x8f, 0xc0, 0xd9, 0x74, 0x95, 0x82, 0xc2, 0x61, + 0xa2, 0x6a, 0xfa, 0x69, 0x7c, 0x91, 0x2c, 0xbf, 0x04, 0x4b, 0x16, 0x75, + 0x6d, 0x70, 0xde, 0x76, 0x26, 0xf8, 0x24, 0x9d, 0xb9, 0xf5, 0xd3, 0xb9, + 0x21, 0xfd, 0x19, 0x41, 0xb3, 0x90, 0x75, 0xfc, 0xf2, 0x49, 0x8f, 0xef, + 0x7f, 0x2a, 0xe2, 0xd4, 0x16, 0x78, 0xfb, 0xd5, 0x60, 0xea, 0x90, 0x45, + 0x60, 0x06, 0x33, 0xca, 0x5c, 0xb2, 0x09, 0x59, 0x55, 0x04, 0x12, 0x4c, + 0xbc, 0xd0, 0x35, 0xd9, 0x58, 0x24, 0xcb, 0xf8, 0x5b, 0xaa, 0xec, 0x98, + 0x3d, 0x3e, 0x32, 0xf3, 0xf8, 0xed, 0xfd, 0x13, 0x9c, 0xa7, 0x43, 0x6e, + 0xe7, 0xc5, 0x5d, 0xfa, 0xeb, 0x78, 0xa1, 0xa2, 0xae, 0x95, 0x4c, 0x57, + 0xdc, 0x0b, 0x71, 0x14, 0x3c, 0x9f, 0x27, 0x8b, 0x05, 0x0f, 0xfa, 0x36, + 0x8d, 0x27, 0x9b, 0x3c, 0x39, 0xdf, 0x2c, 0x64, 0xac, 0x5d, 0x09, 0x92, + 0x4f, 0x7e, 0x8c, 0x97, 0x74, 0xf7, 0x96, 0xce, 0xe6, 0x1c, 0xb2, 0xcb, + 0x3c, 0x5f, 0x43, 0xd4, 0xa6, 0x2c, 0x87, 0xb5, 0x02, 0x18, 0x77, 0xd3, + 0xf3, 0xc5, 0xea, 0x1a, 0xac, 0xd2, 0xd5, 0xce, 0x4f, 0x9b, 0x38, 0xa3, + 0x8d, 0xd3, 0x9d, 0xe1, 0x1b, 0xa3, 0x83, 0xfd, 0x37, 0x76, 0x1f, 0xef, + 0x4c, 0x37, 0xc9, 0x02, 0xf7, 0xdb, 0xfb, 0x93, 0x3e, 0x91, 0xed, 0x93, + 0x9f, 0xd5, 0x4f, 0x96, 0xfd, 0xcb, 0xfc, 0x6a, 0xb1, 0x6f, 0xbd, 0x72, + 0x07, 0xc6, 0x61, 0xc1, 0x4d, 0x8c, 0xf8, 0xfa, 0x16, 0x38, 0x99, 0x07, + 0xc5, 0xaf, 0xd7, 0x2c, 0xff, 0x5c, 0x3d, 0x7a, 0xfc, 0xae, 0x40, 0x8c, + 0x38, 0x60, 0x1f, 0x7c, 0x66, 0xd5, 0x52, 0xa0, 0x31, 0xc3, 0x37, 0xec, + 0xe8, 0xfb, 0xe0, 0xa9, 0x4a, 0x24, 0xc2, 0x29, 0x05, 0xf7, 0x6b, 0x94, + 0x9b, 0x8b, 0x2e, 0xc8, 0xd3, 0x95, 0xa3, 0x43, 0x12, 0xd4, 0xd6, 0x35, + 0x73, 0xd0, 0x95, 0x58, 0x6e, 0x2a, 0x90, 0x30, 0x53, 0x75, 0x9d, 0xb4, + 0x72, 0x94, 0x28, 0xac, 0x0c, 0xa8, 0xac, 0x2f, 0x99, 0x14, 0x58, 0x25, + 0x29, 0x56, 0xfd, 0x6a, 0xe3, 0xe6, 0xa2, 0xf6, 0x14, 0xfa, 0x78, 0x99, + 0x2d, 0x22, 0x18, 0x93, 0x64, 0x5b, 0xe1, 0xbe, 0x37, 0x06, 0xae, 0xc0, + 0x03, 0x09, 0x2f, 0x77, 0x3b, 0x25, 0xd8, 0x51, 0x58, 0xa1, 0xf7, 0x4a, + 0x65, 0xd1, 0x98, 0x34, 0xe9, 0xf2, 0xf9, 0x65, 0x92, 0x0d, 0xaa, 0x7b, + 0x79, 0xca, 0x85, 0xa9, 0xcb, 0x4f, 0x89, 0x0c, 0xa8, 0x6f, 0x10, 0xee, + 0x78, 0x01, 0x97, 0xd0, 0xaf, 0x13, 0xec, 0xf1, 0x21, 0x96, 0x03, 0xb8, + 0x0c, 0xb7, 0x1c, 0x28, 0x09, 0x34, 0x0a, 0x02, 0x5d, 0x59, 0xc3, 0xab, + 0xdb, 0x67, 0x17, 0xc8, 0x1d, 0x24, 0x2b, 0xbf, 0x4a, 0x3c, 0xea, 0xf8, + 0x29, 0x98, 0x8a, 0x49, 0xfa, 0x11, 0xcf, 0x96, 0x03, 0xdc, 0xf0, 0x75, + 0xfc, 0x94, 0xa4, 0x15, 0x3a, 0xbd, 0xe4, 0xc3, 0xaf, 0x76, 0xe5, 0xab, + 0x35, 0x02, 0xc3, 0x7e, 0x34, 0x3e, 0x82, 0x53, 0x0b, 0x0a, 0x9e, 0x9a, + 0xdc, 0x7f, 0x26, 0xc3, 0x51, 0xd2, 0xfe, 0x3a, 0x81, 0xa3, 0x52, 0x28, + 0x49, 0x0a, 0x20, 0xbc, 0x9a, 0xe0, 0xd8, 0x52, 0xd1, 0xda, 0x68, 0x16, + 0xcb, 0x0d, 0xe5, 0x68, 0x7b, 0x86, 0xb2, 0x76, 0x60, 0xe6, 0x66, 0xdc, + 0x3f, 0x34, 0x2b, 0x6f, 0x40, 0x1a, 0xad, 0x45, 0x9c, 0x0b, 0x6d, 0xf3, + 0x0d, 0xcd, 0x0a, 0x26, 0x41, 0xb7, 0xd9, 0x69, 0x71, 0xe5, 0x4c, 0x83, + 0x36, 0x15, 0x5a, 0xab, 0xbe, 0x77, 0x15, 0x05, 0x72, 0x7f, 0x81, 0x00, + 0x11, 0x92, 0x7e, 0xb6, 0x66, 0x6d, 0x11, 0xe4, 0x06, 0xf2, 0xfb, 0x1c, + 0xf3, 0x08, 0x7e, 0xbc, 0xc5, 0x8a, 0xef, 0xe6, 0xfe, 0xbb, 0xc2, 0xb8, + 0xd5, 0x31, 0x6e, 0x35, 0x8c, 0x5b, 0x0b, 0x43, 0x72, 0x71, 0x9a, 0x82, + 0xc7, 0x7f, 0x99, 0xa0, 0x83, 0x7a, 0x73, 0x3b, 0x5a, 0xaf, 0x16, 0x93, + 0x34, 0x82, 0x49, 0xc0, 0x2d, 0x72, 0xea, 0x89, 0x84, 0xc0, 0xde, 0x16, + 0x14, 0x15, 0x31, 0x2b, 0xea, 0xf3, 0x8f, 0xc9, 0x9a, 0xc2, 0x3c, 0x03, + 0x95, 0xdb, 0x2e, 0x88, 0x07, 0xac, 0x40, 0xb2, 0x04, 0xd1, 0x64, 0xa0, + 0x2c, 0x93, 0x1c, 0xc6, 0x57, 0x1a, 0x7d, 0xb3, 0x64, 0x0e, 0x9f, 0xe7, + 0xda, 0x38, 0xeb, 0x3d, 0xd8, 0x06, 0xae, 0xdd, 0xc6, 0x73, 0x80, 0xc9, + 0xad, 0xc6, 0x9c, 0xee, 0x78, 0x00, 0x6b, 0x23, 0xf8, 0x16, 0x41, 0x85, + 0x1c, 0xfe, 0x69, 0x3d, 0x2e, 0xb9, 0xd8, 0xf0, 0xf2, 0xa9, 0x60, 0xb2, + 0x26, 0x78, 0xd4, 0x8c, 0x16, 0x29, 0x39, 0x3b, 0x49, 0xc6, 0xd6, 0xc9, + 0x4d, 0xbc, 0x80, 0x34, 0x82, 0xa1, 0xe6, 0xe1, 0x6d, 0x45, 0x01, 0x79, + 0x06, 0x6e, 0xd9, 0xe9, 0xea, 0xfa, 0x53, 0x7e, 0xee, 0x74, 0xac, 0x35, + 0xf5, 0x91, 0x0b, 0x38, 0x99, 0xff, 0xb0, 0xc9, 0xf2, 0x78, 0x0e, 0x5e, + 0x1f, 0xb4, 0xe6, 0x6b, 0x12, 0x50, 0x38, 0x71, 0x30, 0x4e, 0x43, 0x8b, + 0xf3, 0x61, 0xfc, 0xb4, 0xbf, 0x4f, 0x41, 0x5d, 0xcf, 0x30, 0xa4, 0xce, + 0xe9, 0x2e, 0xda, 0x69, 0xf8, 0x1e, 0x01, 0x43, 0xba, 0x44, 0x81, 0x63, + 0x2f, 0x8f, 0xdd, 0xf2, 0xa2, 0xd1, 0x97, 0xbc, 0xf5, 0x17, 0x7d, 0xbb, + 0xa5, 0xa2, 0x49, 0x9c, 0xca, 0x63, 0xc2, 0x22, 0x63, 0x58, 0x46, 0x16, + 0x62, 0x4e, 0xe3, 0x9f, 0x36, 0x49, 0x0a, 0x04, 0x1f, 0xb3, 0x6c, 0xb1, + 0xca, 0x33, 0x29, 0x77, 0x45, 0xd2, 0xa5, 0x48, 0xcd, 0x45, 0xbe, 0x84, + 0x14, 0x28, 0xd4, 0x28, 0x52, 0x55, 0x7c, 0x55, 0x35, 0x49, 0x17, 0xbd, + 0x0c, 0xc5, 0xc1, 0x91, 0x4f, 0x77, 0x2e, 0x69, 0xd2, 0x04, 0x7a, 0xe3, + 0x69, 0xb2, 0x6c, 0x02, 0x8b, 0x36, 0x13, 0x11, 0xc9, 0x2d, 0x65, 0x3b, + 0xe5, 0x8d, 0x2b, 0x27, 0x5f, 0xc3, 0xc1, 0xae, 0xb7, 0x94, 0x53, 0x98, + 0x24, 0xf5, 0xf8, 0x0c, 0xaf, 0x47, 0x73, 0x39, 0x9a, 0xcc, 0x66, 0x3f, + 0x8f, 0x60, 0x1e, 0x1d, 0x01, 0x0b, 0x3d, 0xad, 0xac, 0x1e, 0xa7, 0xd6, + 0xf5, 0xe9, 0xd0, 0x62, 0x7d, 0x39, 0x41, 0x45, 0xdb, 0xdf, 0xb7, 0x8b, + 0x21, 0x99, 0x9d, 0x92, 0x70, 0x90, 0x36, 0x94, 0x77, 0x54, 0x96, 0x0f, + 0xf2, 0x1a, 0x02, 0x0c, 0x67, 0xa7, 0x0a, 0x6a, 0x04, 0x50, 0xc4, 0x6d, + 0x15, 0xd0, 0x1e, 0x00, 0x71, 0xc6, 0xca, 0x96, 0xa9, 0xcd, 0x31, 0x7e, + 0xbd, 0xd1, 0x56, 0x1d, 0x48, 0x83, 0x68, 0x64, 0xdc, 0xb5, 0x16, 0x85, + 0x4d, 0x83, 0x64, 0x5a, 0x68, 0x28, 0x90, 0xc6, 0xea, 0xec, 0xa7, 0x34, + 0x8f, 0x6e, 0xa0, 0x8d, 0x91, 0x8f, 0x5b, 0xf8, 0xbc, 0xd5, 0x4d, 0x2c, + 0xd8, 0x01, 0x09, 0x08, 0x45, 0x2d, 0x47, 0x11, 0xac, 0x6b, 0xdc, 0x10, + 0x80, 0x5a, 0x8f, 0x93, 0x06, 0xd0, 0x2a, 0x5b, 0x9a, 0x12, 0xf8, 0xd4, + 0x83, 0x01, 0xc3, 0x4f, 0x50, 0x3f, 0xe8, 0x24, 0x7f, 0xfc, 0xde, 0x63, + 0x7f, 0xfc, 0x7e, 0x06, 0x09, 0x30, 0x5d, 0x96, 0xd9, 0x92, 0x26, 0x20, + 0x82, 0x60, 0x09, 0x10, 0xea, 0x05, 0xfe, 0xb1, 0x82, 0x53, 0x05, 0x47, + 0x48, 0x1b, 0xb8, 0x16, 0x3e, 0x07, 0x4e, 0x9b, 0x22, 0xcd, 0x07, 0x21, + 0xcd, 0x05, 0x54, 0x8b, 0xaf, 0x6a, 0x8d, 0x31, 0x84, 0x34, 0xbb, 0x84, + 0xfe, 0x0c, 0xba, 0xc2, 0xb3, 0x80, 0x9a, 0x02, 0xd7, 0x64, 0x04, 0x84, + 0x86, 0x00, 0x03, 0x1f, 0xc0, 0x00, 0x14, 0xa7, 0x72, 0xa0, 0x8b, 0x09, + 0x1a, 0x80, 0x1b, 0x0d, 0x59, 0x5f, 0x48, 0x72, 0x9a, 0x45, 0x11, 0x61, + 0xbd, 0x8c, 0x4e, 0x7c, 0x1f, 0x3c, 0x7e, 0x5d, 0xe6, 0xe9, 0x10, 0xb4, + 0x1c, 0xfe, 0x9f, 0x0e, 0x8d, 0x45, 0x41, 0x42, 0x78, 0x1b, 0x26, 0x0e, + 0x70, 0x86, 0x8b, 0xca, 0x74, 0xe3, 0x5b, 0x46, 0xa7, 0x0a, 0x17, 0x35, + 0xea, 0x94, 0x17, 0x0e, 0x4d, 0x06, 0xba, 0x71, 0x66, 0xce, 0xd7, 0x0d, + 0x9a, 0x43, 0x9d, 0xe6, 0xa8, 0x9a, 0x26, 0xd0, 0x12, 0x64, 0xab, 0x69, + 0x8e, 0x74, 0x9a, 0x7b, 0xd5, 0x34, 0x77, 0x15, 0xcd, 0x9b, 0x2a, 0x9a, + 0x7b, 0x3a, 0xcd, 0xc7, 0xb5, 0x34, 0x0b, 0x56, 0xab, 0x68, 0x3e, 0xd6, + 0x69, 0xee, 0xd7, 0xd6, 0x7d, 0x37, 0x84, 0xe6, 0xbe, 0x4e, 0xf3, 0x20, + 0xac, 0x8d, 0x76, 0x55, 0xdd, 0xa9, 0xd3, 0x2b, 0x85, 0xb8, 0x2a, 0x34, + 0xb0, 0x2f, 0xca, 0x26, 0x28, 0xe5, 0x7e, 0x5c, 0x00, 0x31, 0xa2, 0x45, + 0xb1, 0xb1, 0xae, 0x20, 0x41, 0x7c, 0x4e, 0xe9, 0xf3, 0x4c, 0xf3, 0x3a, + 0xe5, 0xb5, 0x85, 0xb4, 0x77, 0xd1, 0x9b, 0x12, 0x55, 0x19, 0xd3, 0x0a, + 0x04, 0x36, 0x94, 0x43, 0x16, 0xd8, 0xc6, 0x33, 0xb3, 0x8f, 0x43, 0x0a, + 0xe8, 0x30, 0x94, 0xc5, 0xbf, 0x5c, 0x88, 0x2f, 0x50, 0xae, 0xb3, 0x56, + 0x4e, 0xf7, 0xa1, 0x16, 0x30, 0xc6, 0x45, 0x18, 0xd0, 0x54, 0x5f, 0xc7, + 0xa2, 0x84, 0x01, 0xfe, 0xf3, 0x54, 0x2e, 0x32, 0x51, 0x8b, 0x52, 0x32, + 0x8d, 0x57, 0xc9, 0xb2, 0x08, 0xe1, 0x35, 0x30, 0x63, 0xfa, 0x2b, 0xa0, + 0xf2, 0x38, 0x7c, 0xa7, 0x05, 0xcc, 0x99, 0x94, 0x63, 0x55, 0xd9, 0xa4, + 0xf5, 0x45, 0x32, 0x1d, 0x5c, 0xa2, 0x1b, 0x37, 0x27, 0xc7, 0x5f, 0x3d, + 0xf9, 0xf2, 0x29, 0xae, 0x7b, 0x55, 0x07, 0xf8, 0x27, 0xd4, 0x19, 0xbe, + 0xf7, 0x8e, 0xd7, 0x07, 0xab, 0x43, 0xfd, 0x2b, 0xa1, 0x58, 0x58, 0x70, + 0xe8, 0xd3, 0x77, 0xee, 0x81, 0x84, 0x2a, 0xf7, 0x73, 0xdc, 0x47, 0x1e, + 0x3a, 0xef, 0x7f, 0xf1, 0x19, 0xed, 0xd2, 0x40, 0xda, 0x6a, 0x32, 0x8f, + 0xe7, 0x30, 0x13, 0x95, 0x0d, 0x50, 0x6c, 0x4f, 0xa8, 0x36, 0x87, 0x82, + 0xb0, 0x65, 0xd3, 0xcd, 0x92, 0x65, 0xc9, 0x72, 0x16, 0x33, 0x40, 0xc7, + 0x18, 0x84, 0x0b, 0xc2, 0xa5, 0x87, 0x45, 0x52, 0x0c, 0x5f, 0x28, 0x16, + 0x51, 0xe3, 0x9c, 0xae, 0x2b, 0xc9, 0x79, 0x03, 0xe5, 0xc9, 0x73, 0xf5, + 0x15, 0x41, 0x63, 0xcd, 0x70, 0x94, 0xb2, 0x74, 0x23, 0xd0, 0x64, 0x51, + 0x00, 0xbf, 0xc9, 0x2f, 0x31, 0xcd, 0x79, 0x02, 0xf4, 0x49, 0xf9, 0x92, + 0xa0, 0xb9, 0xde, 0xa6, 0x72, 0x4a, 0xdf, 0x23, 0x37, 0xae, 0x0b, 0xbd, + 0xb5, 0x93, 0xcd, 0xd2, 0x64, 0x9d, 0xbf, 0x0d, 0x49, 0xf4, 0x73, 0xba, + 0x9a, 0xdf, 0xc2, 0x8f, 0xb7, 0x76, 0x70, 0x65, 0x06, 0xbe, 0xfc, 0x09, + 0x2a, 0x25, 0x72, 0xf5, 0x34, 0xa5, 0x01, 0x00 }; diff --git a/Arduino/McLighting/json_functions.h b/Arduino/McLighting/json_functions.h index 632717f..9967a02 100644 --- a/Arduino/McLighting/json_functions.h +++ b/Arduino/McLighting/json_functions.h @@ -10,13 +10,12 @@ char * listStateJSONfull() { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(19) + 250; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = State.segment; - root["start"] = segState.start; - root["stop"] = segState.stop; - root["mode"] = (uint8_t) State.mode; - //getSegmentParams(segment); - root["fx_mode"] = segState.mode[State.segment]; - root["speed"] = segState.speed[State.segment]; + root["segment"] = State.segment; + root["start"] = segState.start; + root["stop"] = segState.stop; + root["mode"] = (uint8_t) State.mode; + root["fx_mode"] = segState.mode[State.segment]; + root["speed"] = segState.speed[State.segment]; root["brightness"] = State.brightness; JsonArray color = root.createNestedArray("color"); color.add(main_color.white); @@ -43,7 +42,7 @@ char * listStateJSONfull() { root["ws_cnt"] = Config.stripSize; root["ws_rgbo"] = Config.RGBOrder; root["ws_pin"] = Config.pin; - root["ws_trans"] = Config.transEffect; + root["ws_trans"] = Config.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -69,32 +68,25 @@ char * listSegmentStateJSON(uint8_t _seg) { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 100; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - if (_seg == State.segment) { - root["start"] = segState.start; - root["stop"] = segState.stop; - } else { - root["start"] = strip->getSegment(_seg)->start; - root["stop"] = strip->getSegment(_seg)->stop; - } - //getSegmentParams(seg); - //root["fx_mode"] = strip->getMode(_seg); - root["fx_mode"] = segState.mode[_seg]; - root["speed"] = segState.speed[_seg]; - JsonArray color = root.createNestedArray("color"); - //color.add((strip->getColors(_seg)[0] >> 24) & 0xFF); - color.add((segState.colors[_seg][0] >> 24) & 0xFF); - color.add((segState.colors[_seg][0] >> 16) & 0xFF); - color.add((segState.colors[_seg][0] >> 8) & 0xFF); - color.add((segState.colors[_seg][0]) & 0xFF); - color.add((segState.colors[_seg][1] >> 24) & 0xFF); - color.add((segState.colors[_seg][1] >> 16) & 0xFF); - color.add((segState.colors[_seg][1] >> 8) & 0xFF); - color.add((segState.colors[_seg][1]) & 0xFF); - color.add((segState.colors[_seg][2] >> 24) & 0xFF); - color.add((segState.colors[_seg][2] >> 16) & 0xFF); - color.add((segState.colors[_seg][2] >> 8) & 0xFF); - color.add((segState.colors[_seg][2]) & 0xFF); - root["ws_fxopt"] = segState.options; + root["start"] = strip->getSegment(_seg)->start; + root["stop"] = strip->getSegment(_seg)->stop; + root["fx_mode"] = segState.mode[_seg]; + root["speed"] = segState.speed[_seg]; + JsonArray color = root.createNestedArray("color"); + //color.add((strip->getColors(_seg)[0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 16) & 0xFF); + color.add((segState.colors[_seg][0] >> 8) & 0xFF); + color.add((segState.colors[_seg][0]) & 0xFF); + color.add((segState.colors[_seg][1] >> 24) & 0xFF); + color.add((segState.colors[_seg][1] >> 16) & 0xFF); + color.add((segState.colors[_seg][1] >> 8) & 0xFF); + color.add((segState.colors[_seg][1]) & 0xFF); + color.add((segState.colors[_seg][2] >> 24) & 0xFF); + color.add((segState.colors[_seg][2] >> 16) & 0xFF); + color.add((segState.colors[_seg][2] >> 8) & 0xFF); + color.add((segState.colors[_seg][2]) & 0xFF); + root["ws_fxopt"] = strip->getOptions(_seg); uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index 07f0d38..50350aa 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -9,14 +9,14 @@ as a custom effect More info on how to create custom aniamtions for WS2812FX: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md#custom-effects */ -// *************************************************************************** -// Functions and variables for automatic cycling -// *************************************************************************** uint16_t handleSegmentOFF(void) { WS2812FX::Segment* _seg = strip->getSegment(); return _seg->speed; } +// *************************************************************************** +// Function for automatic cycling +// *************************************************************************** void handleAutoPlay(uint8_t _seg) { //WS2812FX::Segment* _seg = strip->getSegment(); if (autoDelay[_seg] <= millis()) { @@ -37,21 +37,28 @@ void handleAutoPlay(uint8_t _seg) { } } +uint16_t handleAuto() { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; +} + +uint16_t handleCustomWS(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; +} #if defined(CUSTOM_WS2812FX_ANIMATIONS) // *************************************************************************** - // TV mode + // TV mode to be reviewed // *************************************************************************** - uint8_t dipInterval = 10; - uint16_t darkTime = 250; - unsigned long currentDipTime; - unsigned long dipStartTime; - unsigned long currentMillis; - uint8_t ledState = LOW; - unsigned long previousMillis = 0; - uint16_t interv = 2000; - uint8_t twitch = 50; - uint8_t dipCount = 0; - boolean timeToDip = false; + uint16_t darkTime[10] = {250,250,250,250,250,250,250,250,250,250}; + uint8_t dipInterval[10] = {10,10,10,10,10,10,10,10,10,10}; + unsigned long dipStartTime[10] = {}; + uint8_t ledState[10] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW}; + unsigned long previousMillis[10]= {0,0,0,0,0,0,0,0,0,0}; + uint16_t interv[10] = {2000,2000,2000,2000,2000,2000,2000,2000,2000,2000}; + uint8_t twitch[10]= {50,50,50,50,50,50,50,50,50,50}; + uint8_t dipCount[10] = {0,0,0,0,0,0,0,0,0,0}; + bool timeToDip[10] = {false,false,false,false,false,false,false,false,false,false}; void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { @@ -63,6 +70,95 @@ void handleAutoPlay(uint8_t _seg) { strip->setPixelColor(led, temp[n + 2], temp[n + 1], temp[n], 0); } + + uint16_t handleTV(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + uint8_t _seg_num = strip->getSegmentIndex(); + if (timeToDip[_seg_num] == false) { + if((millis() - previousMillis[_seg_num]) > interv[_seg_num]) { + DBG_OUTPUT_PORT.println("Segment:"); + DBG_OUTPUT_PORT.println(_seg_num); + previousMillis[_seg_num] = millis(); + //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes + interv[_seg_num] = random(800-(512 - (_seg->speed/64)),6001-(2731 - (_seg->speed/24))); + twitch[_seg_num] = random(40,100);// Twitch provides motion effect but can be a bit much if too high + dipCount[_seg_num]++; + } + if((millis() - previousMillis[_seg_num]) < twitch[_seg_num]) { + uint16_t led=random(_seg->start, _seg->stop); + ledState[_seg_num] = ledState[_seg_num] == LOW ? HIGH : LOW; // if the LED is off turn it on and vice-versa: + ledstates[led] = ((ledState[_seg_num]) ? 255 : 0); + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } + if (dipCount[_seg_num] > dipInterval[_seg_num]) { + timeToDip[_seg_num] = true; + dipCount[_seg_num] = 0; + dipStartTime[_seg_num] = millis(); + darkTime[_seg_num] = random(50,150); + dipInterval[_seg_num] = random(5,250);// cycles of flicker + } + } + } else { + DBG_OUTPUT_PORT.println("Dip Time"); + if (millis() - dipStartTime[_seg_num] < darkTime[_seg_num]) { + for (uint16_t i=(_seg->start + 3); i<= _seg->stop; i++) { + ledstates[i] = 0; + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } + } + } else { + timeToDip[_seg_num] = false; + } + } + return _seg->speed; + } + // *************************************************************************** + // TV mode + // *************************************************************************** + uint16_t handleE131(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + if (!e131->isEmpty()) { + e131_packet_t packet; + e131->pull(&packet); // Pull packet from ring buffer + + uint16_t universe = htons(packet.universe); + uint8_t *data = packet.property_values + 1; + + if (universe < START_UNIVERSE || universe > END_UNIVERSE) return _seg->speed; //async will take care about filling the buffer + + // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", + // htons(packet.universe), // The Universe for this packet + // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data + // e131.stats.num_packets, // Packet counter + // e131.stats.packet_errors, // Packet error counter + // packet.property_values[1]); // Dimmer data for Channel 1 + /* #if defined(RGBW) + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe + if (NUMLEDS <= multipacketOffset) return; + uint16_t len = (128 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 128; + #else*/ + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe + if (Config.stripSize <= multipacketOffset) return _seg->speed; + uint16_t len = (170 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 170; + /* #endif */ + for (uint16_t i = 0; i < len; i++){ + if ((i >= _seg->start) && (i <= _seg->stop)) { + uint16_t j = i * 3; + /* #if defined(RGBW) + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); + #else */ + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); + /* #endif */ + } + } + } + return _seg->speed; + } + /* * paste in the Fire2012 code with a small edit at the end which uses the * setPixelColor() function to copy the color data to the ws2812fx instance. @@ -106,152 +202,52 @@ void handleAutoPlay(uint8_t _seg) { // Default 120, suggested range 50-200. #define SPARKING 120 -#endif - -uint16_t handleAuto() { - WS2812FX::Segment* _seg = strip->getSegment(); - return _seg->speed; -} - -uint16_t handleCustomWS(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - return _seg->speed; -} -#if defined(CUSTOM_WS2812FX_ANIMATIONS) -uint16_t handleTV(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - if (timeToDip == false) { - currentMillis = millis(); - if(currentMillis-previousMillis > interv) { - previousMillis = currentMillis; - //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes - interv = random(1000-(_seg->speed/128),5001-(_seg->speed/32)); - twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high - dipCount = dipCount++; + uint16_t handleFire2012(void) { + // Array of temperature readings at each simulation cell + WS2812FX::Segment* _seg = strip->getSegment(); + + // Step 1. Cool down every cell a little + for( uint16_t i = _seg->start; i <= _seg->stop; i++) { + ledstates[i] = qsub8(ledstates[i], random8(0, ((COOLING * 10) / (_seg->stop - _seg->start)+1) + 2)); } - if(currentMillis-previousMillisstart, _seg->stop); - ledState = ledState == LOW ? HIGH : LOW; // if the LED is off turn it on and vice-versa: - ledstates[led] = ((ledState) ? 255 : 0); - for (uint16_t j=_seg->start; j<=_seg->stop; j++) { - uint16_t index = (j%3 == 0) ? 400 : random(0,767); - hsb2rgbAN1(index, 200, ledstates[j], j); - } - if (dipCount > dipInterval) { - DBG_OUTPUT_PORT.println("dip"); - timeToDip = true; - dipCount = 0; - dipStartTime = millis(); - darkTime = random(50,150); - dipInterval = random(5,250);// cycles of flicker - } - } - } else { - DBG_OUTPUT_PORT.println("Dip Time"); - currentDipTime = millis(); - if (currentDipTime - dipStartTime < darkTime) { - for (uint16_t i=(_seg->start + 3); i<= _seg->stop; i++) { - ledstates[i] = State.brightness; - for (uint16_t j=_seg->start; j<=_seg->stop; j++) { - uint16_t index = (j%3 == 0) ? 400 : random(0,767); - hsb2rgbAN1(index, 200, ledstates[j], j); - } - } - } else { - timeToDip = false; - } - } - return _seg->speed; -} - -uint16_t handleE131(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - if (!e131->isEmpty()) { - e131_packet_t packet; - e131->pull(&packet); // Pull packet from ring buffer - - uint16_t universe = htons(packet.universe); - uint8_t *data = packet.property_values + 1; - - if (universe < START_UNIVERSE || universe > END_UNIVERSE) return _seg->speed; //async will take care about filling the buffer - - // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", - // htons(packet.universe), // The Universe for this packet - // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data - // e131.stats.num_packets, // Packet counter - // e131.stats.packet_errors, // Packet error counter - // packet.property_values[1]); // Dimmer data for Channel 1 -/* #if defined(RGBW) - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe - if (NUMLEDS <= multipacketOffset) return; - uint16_t len = (128 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 128; - #else*/ - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe - if (Config.stripSize <= multipacketOffset) return _seg->speed; - uint16_t len = (170 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 170; -/* #endif */ - for (uint16_t i = 0; i < len; i++){ - if ((i >= _seg->start) && (i <= _seg->stop)) { - uint16_t j = i * 3; - /* #if defined(RGBW) - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); - #else */ - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); - /* #endif */ - } - } - } - return _seg->speed; -} - -uint16_t handleFire2012(void) { -// Array of temperature readings at each simulation cell - WS2812FX::Segment* _seg = strip->getSegment(); - - // Step 1. Cool down every cell a little - for( uint16_t i = _seg->start; i <= _seg->stop; i++) { - ledstates[i] = qsub8(ledstates[i], random8(0, ((COOLING * 10) / (_seg->stop - _seg->start)+1) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for( uint16_t k= _seg->stop; k >= (_seg->start + 2); k--) { - ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; - } - - // Step 3. Randomly ignite new 'sparks' of heat near the bottom - if( random8() < SPARKING ) { - uint8_t y = random8(7) + _seg->start; - ledstates[y] = qadd8(ledstates[y], random8(160,255) ); - } - - // Step 4. Map from heat cells to LED colors - // 98 143 - for( uint16_t j = _seg->start; j <= _seg->stop; j++) { - CRGB color = HeatColor(ledstates[j]); - uint16_t pixel; - if ((_seg->options & 128) > 0) { - pixel = _seg->stop + (_seg->start - j); - } else { - pixel = j; + // Step 2. Heat from each cell drifts 'up' and diffuses a little + for( uint16_t k= _seg->stop; k >= (_seg->start + 2); k--) { + ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; } - strip->setPixelColor(pixel, color.red, color.green, color.blue, 0); - } - return _seg->speed; -} - -uint16_t handleGradient() { - WS2812FX::Segment* _seg = strip->getSegment(); - for(uint16_t j = 0; j <= (_seg->stop - _seg->start); j++) { - uint16_t pixel; - if ((_seg->options & 128) > 0) { - pixel = _seg->stop - j; - } else { - pixel = _seg->start + j; + + // Step 3. Randomly ignite new 'sparks' of heat near the bottom + if( random8() < SPARKING ) { + uint8_t y = random8(7) + _seg->start; + ledstates[y] = qadd8(ledstates[y], random8(160,255) ); } - uint32_t color = trans(_seg->colors[1], _seg->colors[0], j, (_seg->stop - _seg->start)); - strip->setPixelColor(pixel, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + + // Step 4. Map from heat cells to LED colors + for( uint16_t j = _seg->start; j <= _seg->stop; j++) { + CRGB color = HeatColor(ledstates[j]); + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop + (_seg->start - j); + } else { + pixel = j; + } + strip->setPixelColor(pixel, color.red, color.green, color.blue, 0); + } + return _seg->speed; + } + + uint16_t handleGradient() { + WS2812FX::Segment* _seg = strip->getSegment(); + for(uint16_t j = 0; j <= (_seg->stop - _seg->start); j++) { + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop - j; + } else { + pixel = _seg->start + j; + } + uint32_t color = trans(_seg->colors[1], _seg->colors[0], j, (_seg->stop - _seg->start)); + strip->setPixelColor(pixel, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + } + return _seg->speed; } - return _seg->speed; -} #endif diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 8d2f7f5..49339a7 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -267,14 +267,13 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set active segment if (_payload[0] == 'S') { if (_payload[1] == 's') { - uint8_t seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - State.segment = constrain(seg, 0, Config.segments - 1); - if (prevsegment != State.segment) { + uint8_t _seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); + _seg = constrain(_seg, 0, Config.segments - 1); + if (prevsegment != _seg) { prevsegment = State.segment; + State.segment = _seg; getSegmentParams(State.segment); - //convertColors(); - //memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); - memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + //memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); _updateState = true; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", State.segment); @@ -283,7 +282,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set segment first LED if (_payload[1] == '[') { uint16_t _seg_start = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(State.segment); _seg_start = constrain(_seg_start, 0, Config.stripSize - 1); if (_seg_start != segState.start) { segState.start = _seg_start; @@ -296,7 +294,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set segment last LED if (_payload[1] == ']') { uint16_t _seg_stop = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(State.segment); _seg_stop = constrain(_seg_stop, segState.start, Config.stripSize - 1); if (_seg_stop != segState.stop) { segState.stop = _seg_stop; @@ -439,6 +436,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if(!save_state.active()) save_state.once(3, tickerSaveState); } if (_updateSegState) { + State.mode = SET; DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); @@ -761,6 +759,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght } bool processJson(char* message) { + bool _updateState = false; + bool _updateSegState = false; const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(12) + 500; DynamicJsonDocument jsonBuffer(bufferSize); DeserializationError error = deserializeJson(jsonBuffer, message); @@ -777,14 +777,25 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght const char* state_in = root["state"]; if (strcmp(state_in, on_cmd) == 0) { State.mode = SET; + _updateState = true; } else if (strcmp(state_in, off_cmd) == 0) { State.mode = OFF; + _updateState = true; jsonBuffer.clear(); return true; } } - + if (root.containsKey("segment")) { + uint8_t json_segment = constrain((uint8_t) root["segment"], 0, Config.segments - 1); + if (prevsegment != json_segment) { + prevsegment = State.segment; + State.segment = json_segment; + getSegmentParams(State.segment); + State.mode = SET; + _updateState = true; + } + } if (root.containsKey("color")) { JsonObject color = root["color"]; main_color.red = (uint8_t) color["r"]; @@ -799,14 +810,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght xtra_color.green = (uint8_t) color["g3"]; xtra_color.blue = (uint8_t) color["b3"]; xtra_color.white = (uint8_t) color["w3"]; - State.mode = SET; + _updateSegState = true; } if (root.containsKey("white_value")) { uint8_t json_white_value = constrain((uint8_t) root["white_value"], 0, 255); if (json_white_value != main_color.white) { main_color.white = json_white_value; - State.mode = SET; + _updateSegState = true; } } @@ -814,7 +825,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght uint8_t _fx_speed = constrain((uint8_t) root["speed"], 0, 255); if (_fx_speed != segState.speed[State.segment]) { segState.speed[State.segment] = _fx_speed; - State.mode = SET; + _updateSegState = true; } } @@ -823,7 +834,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color_temp = (uint16_t) root["color_temp"]; uint16_t kelvin = 1000000 / color_temp; main_color = temp2rgb(kelvin); - State.mode = SET; + _updateSegState = true; } if (root.containsKey("brightness")) { @@ -831,6 +842,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (json_brightness != State.brightness) { State.brightness = json_brightness; State.mode = SET; + _updateState = true; } } @@ -839,16 +851,32 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #if defined(ENABLE_HOMEASSISTANT) if(effectString == "OFF"){ State.mode = OFF; + _updateState = true; } #endif for (uint8_t i = 0; i < strip->getModeCount(); i++) { if(String(strip->getModeName(i)) == effectString) { State.mode = SET; fx_mode = i; + _updateState = true; + _updateSegState = true; break; } } } + #if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + State.mode = SET; + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + } + #endif + _updateState = false; + _updateSegState = false; jsonBuffer.clear(); return true; } @@ -1196,6 +1224,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght // *************************************************************************** void handleRemote() { uint8_t chng = 1; + bool _updateState = false; + bool _updateSegState = false; if (irrecv.decode(&results)) { DBG_OUTPUT_PORT.print("IR Code: 0x"); DBG_OUTPUT_PORT.print(uint64ToString(results.value, HEX)); @@ -1208,8 +1238,10 @@ void handleRemote() { last_remote_cmd = 0; if (State.mode == OFF) { State.mode = SET; + _updateState = true; } else { State.mode = OFF; + _updateState = true;; } } if (State.mode == HOLD) { @@ -1217,14 +1249,14 @@ void handleRemote() { last_remote_cmd = results.value; if (State.brightness + chng <= 255) { State.brightness = State.brightness + chng; - State.mode = SET; + _updateState = true; } } if (results.value == rmt_commands[BRIGHTNESS_DOWN]) { //Brightness down last_remote_cmd = results.value; if (State.brightness - chng >= 0) { State.brightness = State.brightness - chng; - State.mode = SET; + _updateState = true; } } if ((segState.mode[State.segment] < FX_MODE_CUSTOM_0) || (segState.mode[State.segment] > FX_MODE_CUSTOM_1)) { @@ -1232,14 +1264,14 @@ void handleRemote() { last_remote_cmd = results.value; if (segState.speed[State.segment] + chng <= 65535) { segState.speed[State.segment] = segState.speed[State.segment] + chng; - State.mode = SET; + _updateSegState = true; } } if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down last_remote_cmd = results.value; if (segState.speed[State.segment] - chng >= 0) { segState.speed[State.segment] = segState.speed[State.segment] - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1249,19 +1281,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red + chng <= 255) { main_color.red = main_color.red + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.red + chng <= 255) { back_color.red = back_color.red + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.red + chng <= 255) { xtra_color.red = xtra_color.red + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1270,19 +1302,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red - chng >= 0) { main_color.red = main_color.red - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.red - chng >= 0) { back_color.red = back_color.red - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.red - chng >= 0) { xtra_color.red = xtra_color.red - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1291,19 +1323,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green + chng <= 255) { main_color.green = main_color.green + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.green + chng <= 255) { back_color.green = back_color.green + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.green + chng <= 255) { xtra_color.green = xtra_color.green + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1312,19 +1344,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green - chng >= 0) { main_color.green = main_color.green - chng;; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.green - chng >= 0) { back_color.green = back_color.green - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.green - chng >= 0) { xtra_color.green = xtra_color.green - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1333,19 +1365,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue + chng <= 255) { main_color.blue = main_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.blue + chng <= 255) { back_color.blue = back_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.blue + chng <= 255) { xtra_color.blue = xtra_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1354,19 +1386,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue - chng >= 0) { main_color.blue = main_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.blue - chng >= 0) { back_color.blue = back_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.blue - chng >= 0) { xtra_color.blue = xtra_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1375,19 +1407,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white + chng <= 255) { main_color.white = main_color.white + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.white + chng <= 255) { back_color.white = back_color.white + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.white + chng <= 255) { xtra_color.white = xtra_color.white + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1396,19 +1428,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white - chng >= 0) { main_color.white = main_color.white - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.white - chng >= 0) { back_color.white = back_color.white - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.white - chng >= 0) { xtra_color.white = xtra_color.white - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1431,48 +1463,61 @@ void handleRemote() { if ((segState.mode[State.segment] < strip->getModeCount()-1) && (State.mode == HOLD)) { fx_mode = segState.mode[State.segment] + 1; } - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[MODE_DOWN]) { //Mode down last_remote_cmd = results.value; if ((segState.mode[State.segment] > 0) && (State.mode == HOLD)) { fx_mode = segState.mode[State.segment] - 1; } - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[AUTOMODE]) { // Toggle Automode last_remote_cmd = 0; fx_mode = 56; - State.mode = SET; + _updateSegState = true; } #if defined(CUSTOM_WS2812FX_ANIMATIONS) if (results.value == rmt_commands[CUST_1]) { // Select TV Mode last_remote_cmd = 0; fx_mode = 57; - State.mode = SET; + _updateSegState = true; } #endif if (results.value == rmt_commands[CUST_2]) { // Select Custom Mode 2 last_remote_cmd = 0; fx_mode = 12; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_3]) { // Select Custom Mode 3 last_remote_cmd = 0; fx_mode = 48; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_4]) { // Select Custom Mode 4 last_remote_cmd = 0; fx_mode = 21; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_5]) { // Select Custom Mode 5 last_remote_cmd = 0; fx_mode = 46; - State.mode = SET; + _updateSegState = true; } irrecv.resume(); // Receive the next value } + #if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + State.mode = SET; + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + } + #endif + _updateState = false; + _updateSegState = false; } #endif diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index db1352a..a6703cd 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -306,12 +306,13 @@ server.on("/set", []() { boolean _updateState = false; boolean _updateSegState = false; // Segment - if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { - State.segment = server.arg("seg").toInt(); - if (prevsegment != State.segment) { + if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() < Config.segments)) { + uint8_t _seg = server.arg("seg").toInt(); + if (prevsegment != _seg) { prevsegment = State.segment; + State.segment = _seg; getSegmentParams(State.segment); - memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + //memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); State.mode = SET; _updateState = true; } @@ -350,18 +351,23 @@ server.on("/set", []() { main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r") != "") && (server.arg("r").toInt() >= 0) && (server.arg("r").toInt() <= 255)) { main_color.red = server.arg("r").toInt(); + _updateSegState = true; } if ((server.arg("g") != "") && (server.arg("g").toInt() >= 0) && (server.arg("g").toInt() <= 255)) { main_color.green = server.arg("g").toInt(); + _updateSegState = true; } if ((server.arg("b") != "") && (server.arg("b").toInt() >= 0) && (server.arg("b").toInt() <= 255)) { main_color.blue = server.arg("b").toInt(); + _updateSegState = true; } if ((server.arg("w") != "") && (server.arg("w").toInt() >= 0) && (server.arg("w").toInt() <= 255)){ main_color.white = server.arg("w").toInt(); + _updateSegState = true; } } if (server.arg("rgb2") != "") { @@ -370,18 +376,23 @@ server.on("/set", []() { back_color.red = ((rgb2 >> 16) & 0xFF); back_color.green = ((rgb2 >> 8) & 0xFF); back_color.blue = ((rgb2 >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r2") != "") && (server.arg("r2").toInt() >= 0) && (server.arg("r2").toInt() <= 255)) { back_color.red = server.arg("r2").toInt(); + _updateSegState = true; } if ((server.arg("g2") != "") && (server.arg("g2").toInt() >= 0) && (server.arg("g2").toInt() <= 255)) { back_color.green = server.arg("g2").toInt(); + _updateSegState = true; } if ((server.arg("b2") != "") && (server.arg("b2").toInt() >= 0) && (server.arg("b2").toInt() <= 255)) { back_color.blue = server.arg("b2").toInt(); + _updateSegState = true; } if ((server.arg("w2") != "") && (server.arg("w2").toInt() >= 0) && (server.arg("w2").toInt() <= 255)){ back_color.white = server.arg("w2").toInt(); + _updateSegState = true; } } if (server.arg("rgb3") != "") { @@ -390,18 +401,23 @@ server.on("/set", []() { xtra_color.red = ((rgb3 >> 16) & 0xFF); xtra_color.green = ((rgb3 >> 8) & 0xFF); xtra_color.blue = ((rgb3 >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r3") != "") && (server.arg("r3").toInt() >= 0) && (server.arg("r3").toInt() <= 255)) { xtra_color.red = server.arg("r3").toInt(); + _updateSegState = true; } if ((server.arg("g3") != "") && (server.arg("g3").toInt() >= 0) && (server.arg("g3").toInt() <= 255)) { xtra_color.green = server.arg("g3").toInt(); + _updateSegState = true; } if ((server.arg("b3") != "") && (server.arg("b3").toInt() >= 0) && (server.arg("b3").toInt() <= 255)) { xtra_color.blue = server.arg("b3").toInt(); + _updateSegState = true; } if ((server.arg("w3") != "") && (server.arg("w3").toInt() >= 0) && (server.arg("w3").toInt() <= 255)){ xtra_color.white = server.arg("w3").toInt(); + _updateSegState = true; } } main_color.red = constrain(main_color.red, 0, 255); @@ -421,14 +437,12 @@ server.on("/set", []() { // Speed if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { segState.speed[State.segment] = constrain(server.arg("s").toInt(), 0, 255); - State.mode = SET; _updateSegState = true; } //Mode if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); if (fx_mode != segState.mode[State.segment]) { - State.mode = SET; _updateSegState = true; } } @@ -453,6 +467,7 @@ server.on("/set", []() { } if (_updateSegState) { DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + State.mode = SET; if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); } #endif diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index ed730ee..5ae212f 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "3.1.0.BETA1" +#define SKETCH_VERSION "3.1.0.BETA2" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 30905f8..17782ae 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -207,6 +207,13 @@ * further integration of multi segments * known problem: as always: AUTOPLAY (as it is not multi segment capable yet) * + * 07 October * Version Bump to 3.1.0.BETA1 * bugfixes + * adressed issue: #39 uncooment //#define ENABLE_MQTT_INCLUDE_IP in defninitions.h + * + * 09 October + * Version Bump to 3.1.0.BETA2 + * bugfixes + * implemented https://github.com/FabLab-Luenen/McLighting/commit/589806d0fda737011426754a6d84c88535ded688 */ diff --git a/clients/web/index.htm b/clients/web/index.htm index 15dee02..23b9d91 100644 --- a/clients/web/index.htm +++ b/clients/web/index.htm @@ -1929,9 +1929,9 @@ function initSettings() { redrawColorPicker(); }); var settransitionEffects = document.getElementById("set-transitionEffects"); - settransitionEffects.checked = config.transitionEffects; + settransitionEffects.checked = config.ws_trans; settransitionEffects.addEventListener('change', ()=>{ - config.transitionEffects = settransitionEffects.checked; + config.ws_trans = settransitionEffects.checked; if (settransitionEffects.checked) { document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; ws_send("Ce1"); diff --git a/clients/web/index.htm.gz b/clients/web/index.htm.gz index e149892..7a3f8ff 100644 Binary files a/clients/web/index.htm.gz and b/clients/web/index.htm.gz differ