From ff33522b92e0aa1f94a919c0daa5a993a218d941 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Sun, 6 May 2018 09:53:00 -0700 Subject: [PATCH 01/23] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 64c4148c..b5b960cb 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ This is a replacement for a Milight/LimitlessLED remote/gateway hosted on an ESP [Milight bulbs](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LPRQ4BK/r) are cheap smart bulbs that are controllable with an undocumented 2.4 GHz protocol. In order to control them, you either need a [remote](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LCSALV6/r?th=1) ($13), which allows you to control them directly, or a [WiFi gateway](https://www.amazon.com/BTF-LIGHTING-Mi-Light-WiFi-Bridge-Controller/dp/B01H87DYR8/ref=sr_1_7?ie=UTF8&qid=1485715984&sr=8-7&keywords=milight) ($30), which allows you to control them with a mobile app or a [UDP protocol](http://www.limitlessled.com/dev/). +This project is a replacement for the wifi gateway. + [This guide](http://blog.christophermullins.com/2017/02/11/milight-wifi-gateway-emulator-on-an-esp8266/) on my blog details setting one of these up. ## Why this is useful From f16438696c4dc5fe8101aab8a2bcfd094f861fb7 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Sun, 6 May 2018 09:54:52 -0700 Subject: [PATCH 02/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5b960cb..826b4956 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is a replacement for a Milight/LimitlessLED remote/gateway hosted on an ESP8266. Leverages [Henryk Plötz's awesome reverse-engineering work](https://hackaday.io/project/5888-reverse-engineering-the-milight-on-air-protocol). -[Milight bulbs](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LPRQ4BK/r) are cheap smart bulbs that are controllable with an undocumented 2.4 GHz protocol. In order to control them, you either need a [remote](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LCSALV6/r?th=1) ($13), which allows you to control them directly, or a [WiFi gateway](https://www.amazon.com/BTF-LIGHTING-Mi-Light-WiFi-Bridge-Controller/dp/B01H87DYR8/ref=sr_1_7?ie=UTF8&qid=1485715984&sr=8-7&keywords=milight) ($30), which allows you to control them with a mobile app or a [UDP protocol](http://www.limitlessled.com/dev/). +[Milight bulbs](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LPRQ4BK/r) are cheap smart bulbs that are controllable with an undocumented 2.4 GHz protocol. In order to control them, you either need a [remote](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LCSALV6/r?th=1) ($13), which allows you to control them directly, or a [WiFi gateway](http://futlight.com/productlist.aspx?typeid=125) ($30), which allows you to control them with a mobile app or a [UDP protocol](http://www.limitlessled.com/dev/). This project is a replacement for the wifi gateway. From 19843908d86b2123260aafb86adf00e49dfe1488 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Sat, 12 May 2018 12:21:27 -0700 Subject: [PATCH 03/23] Fix #277: restart ESP after config portal times out (#278) --- src/main.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index eb64a87c..80aff751 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -283,10 +283,16 @@ void setup() { // set LED mode for successful operation ledStatus->continuous(settings.ledModeOperating); Serial.println(F("Wifi connected succesfully\n")); + + // if the config portal was started, make sure to turn off the config AP + WiFi.mode(WIFI_STA); } else { // set LED mode for Wifi failed ledStatus->continuous(settings.ledModeWifiFailed); - Serial.println(F("Wifi failed. Oh well.\n")); + Serial.println(F("Wifi failed. Restarting in 10 seconds.\n")); + + delay(10000); + ESP.restart(); } From b4084c24ec70f961630ff53d27a93bf90571cf76 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 13 May 2018 21:06:33 -0700 Subject: [PATCH 04/23] Add support for FUT091/B2/T2 (v2 CCT remote) --- lib/MiLight/FUT091PacketFormatter.cpp | 56 +++++++++++++++++++++++++++ lib/MiLight/FUT091PacketFormatter.h | 25 ++++++++++++ lib/MiLight/MiLightRemoteConfig.cpp | 23 ++++++++--- lib/MiLight/MiLightRemoteConfig.h | 6 ++- lib/MiLight/V2PacketFormatter.cpp | 8 ++++ lib/MiLight/V2PacketFormatter.h | 10 +++++ lib/Radio/MiLightConstants.h | 3 +- lib/Types/MiLightConstants.h | 3 +- lib/Udp/V5MiLightUdpServer.cpp | 4 +- lib/Udp/V6CctCommandHandler.h | 2 +- 10 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 lib/MiLight/FUT091PacketFormatter.cpp create mode 100644 lib/MiLight/FUT091PacketFormatter.h diff --git a/lib/MiLight/FUT091PacketFormatter.cpp b/lib/MiLight/FUT091PacketFormatter.cpp new file mode 100644 index 00000000..cc574348 --- /dev/null +++ b/lib/MiLight/FUT091PacketFormatter.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +void FUT091PacketFormatter::updateBrightness(uint8_t value) { + command(static_cast(FUT091Command::BRIGHTNESS), V2PacketFormatter::tov2scale(value, 0x97, 2)); +} + +void FUT091PacketFormatter::updateTemperature(uint8_t value) { + command(static_cast(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, 0xCD, 2)); +} + +void FUT091PacketFormatter::enableNightMode() { + uint8_t arg = groupCommandArg(OFF, groupId); + command(static_cast(FUT091Command::ON_OFF) | 0x80, arg); +} + +BulbId FUT091PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& result) { + uint8_t packetCopy[V2_PACKET_LEN]; + memcpy(packetCopy, packet, V2_PACKET_LEN); + V2RFEncoding::decodeV2Packet(packetCopy); + + BulbId bulbId( + (packetCopy[2] << 8) | packetCopy[3], + packetCopy[7], + REMOTE_TYPE_FUT091 + ); + + uint8_t command = (packetCopy[V2_COMMAND_INDEX] & 0x7F); + uint8_t arg = packetCopy[V2_ARGUMENT_INDEX]; + + if (command == (uint8_t)FUT091Command::ON_OFF) { + if ((packetCopy[V2_COMMAND_INDEX] & 0x80) == 0x80) { + result["command"] = "night_mode"; + } else if (arg < 5) { // Group is not reliably encoded in group byte. Extract from arg byte + result["state"] = "ON"; + bulbId.groupId = arg; + } else { + result["state"] = "OFF"; + bulbId.groupId = arg-5; + } + } else if (command == (uint8_t)FUT091Command::BRIGHTNESS) { + uint8_t level = V2PacketFormatter::fromv2scale(arg, 0x97, 2); + result["brightness"] = Units::rescale(level, 255, 100); + // saturation == kelvin. arg ranges are the same, so can't distinguish + // without using state + } else if (command == (uint8_t)FUT091Command::KELVIN) { + uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2); + result["color_temp"] = Units::whiteValToMireds(kelvin, 100); + } else { + result["button_id"] = command; + result["argument"] = arg; + } + + return bulbId; +} diff --git a/lib/MiLight/FUT091PacketFormatter.h b/lib/MiLight/FUT091PacketFormatter.h new file mode 100644 index 00000000..d71a9a7e --- /dev/null +++ b/lib/MiLight/FUT091PacketFormatter.h @@ -0,0 +1,25 @@ +#include + +#ifndef _FUT091_PACKET_FORMATTER_H +#define _FUT091_PACKET_FORMATTER_H + +enum class FUT091Command { + ON_OFF = 0x01, + BRIGHTNESS = 0x2, + KELVIN = 0x03 +}; + +class FUT091PacketFormatter : public V2PacketFormatter { +public: + FUT091PacketFormatter() + : V2PacketFormatter(0x21, 4) // protocol is 0x21, and there are 4 groups + { } + + virtual void updateBrightness(uint8_t value); + virtual void updateTemperature(uint8_t value); + virtual void enableNightMode(); + + virtual BulbId parsePacket(const uint8_t* packet, JsonObject& result); +}; + +#endif diff --git a/lib/MiLight/MiLightRemoteConfig.cpp b/lib/MiLight/MiLightRemoteConfig.cpp index a8ad9e87..85b9a516 100644 --- a/lib/MiLight/MiLightRemoteConfig.cpp +++ b/lib/MiLight/MiLightRemoteConfig.cpp @@ -5,10 +5,11 @@ */ const MiLightRemoteConfig* MiLightRemoteConfig::ALL_REMOTES[] = { &FUT096Config, // rgbw - &FUT091Config, // cct + &FUT007Config, // cct &FUT092Config, // rgb+cct &FUT098Config, // rgb - &FUT089Config // 8-group rgb+cct (b8, fut089) + &FUT089Config, // 8-group rgb+cct (b8, fut089) + &FUT091Config }; const MiLightRemoteConfig* MiLightRemoteConfig::fromType(const String& type) { @@ -16,8 +17,8 @@ const MiLightRemoteConfig* MiLightRemoteConfig::fromType(const String& type) { return &FUT096Config; } - if (type.equalsIgnoreCase("cct") || type.equalsIgnoreCase("fut091")) { - return &FUT091Config; + if (type.equalsIgnoreCase("cct") || type.equalsIgnoreCase("fut007")) { + return &FUT007Config; } if (type.equalsIgnoreCase("rgb_cct") || type.equalsIgnoreCase("fut092")) { @@ -32,6 +33,10 @@ const MiLightRemoteConfig* MiLightRemoteConfig::fromType(const String& type) { return &FUT098Config; } + if (type.equalsIgnoreCase("v2_cct") || type.equalsIgnoreCase("fut091")) { + return &FUT091Config; + } + Serial.print(F("MiLightRemoteConfig::fromType: ERROR - tried to fetch remote config for type: ")); Serial.println(type); @@ -77,7 +82,7 @@ const MiLightRemoteConfig FUT096Config( //rgbw 4 ); -const MiLightRemoteConfig FUT091Config( //cct +const MiLightRemoteConfig FUT007Config( //cct new CctPacketFormatter(), MiLightRadioConfig::ALL_CONFIGS[1], REMOTE_TYPE_CCT, @@ -85,6 +90,14 @@ const MiLightRemoteConfig FUT091Config( //cct 4 ); +const MiLightRemoteConfig FUT091Config( //v2 cct + new FUT091PacketFormatter(), + MiLightRadioConfig::ALL_CONFIGS[2], + REMOTE_TYPE_FUT091, + "fut091", + 4 +); + const MiLightRemoteConfig FUT092Config( //rgb+cct new RgbCctPacketFormatter(), MiLightRadioConfig::ALL_CONFIGS[2], diff --git a/lib/MiLight/MiLightRemoteConfig.h b/lib/MiLight/MiLightRemoteConfig.h index 45ccbbb3..2fa6b51d 100644 --- a/lib/MiLight/MiLightRemoteConfig.h +++ b/lib/MiLight/MiLightRemoteConfig.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #ifndef _MILIGHT_REMOTE_CONFIG_H @@ -36,14 +37,15 @@ class MiLightRemoteConfig { static const MiLightRemoteConfig* fromType(const String& type); static const MiLightRemoteConfig* fromReceivedPacket(const MiLightRadioConfig& radioConfig, const uint8_t* packet, const size_t len); - static const size_t NUM_REMOTES = 5; + static const size_t NUM_REMOTES = 6; static const MiLightRemoteConfig* ALL_REMOTES[NUM_REMOTES]; }; extern const MiLightRemoteConfig FUT096Config; //rgbw -extern const MiLightRemoteConfig FUT091Config; //cct +extern const MiLightRemoteConfig FUT007Config; //cct extern const MiLightRemoteConfig FUT092Config; //rgb+cct extern const MiLightRemoteConfig FUT089Config; //rgb+cct B8 / FUT089 extern const MiLightRemoteConfig FUT098Config; //rgb +extern const MiLightRemoteConfig FUT091Config; //v2 cct #endif diff --git a/lib/MiLight/V2PacketFormatter.cpp b/lib/MiLight/V2PacketFormatter.cpp index ff8e7c29..01172332 100644 --- a/lib/MiLight/V2PacketFormatter.cpp +++ b/lib/MiLight/V2PacketFormatter.cpp @@ -103,3 +103,11 @@ void V2PacketFormatter::switchMode(GroupState currentState, BulbMode desiredMode } } + +uint8_t V2PacketFormatter::tov2scale(uint8_t value, uint8_t endValue, uint8_t interval) { + return ((100 - value) * interval) + endValue; +} + +uint8_t V2PacketFormatter::fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval) { + return 100 - (((value + (0x100 - endValue))%0x100) / 2); +} \ No newline at end of file diff --git a/lib/MiLight/V2PacketFormatter.h b/lib/MiLight/V2PacketFormatter.h index 2a0cf061..a556728e 100644 --- a/lib/MiLight/V2PacketFormatter.h +++ b/lib/MiLight/V2PacketFormatter.h @@ -26,6 +26,16 @@ class V2PacketFormatter : public PacketFormatter { uint8_t groupCommandArg(MiLightStatus status, uint8_t groupId); + /* + * Some protocols have scales which have the following characteristics: + * Start at some value X, goes down to 0, then up to Y. + * eg: + * 0x8F, 0x8D, ..., 0, 0x2, ..., 0x20 + * This is a parameterized method to convert from [0, 100] TO this scale + */ + static uint8_t tov2scale(uint8_t value, uint8_t endValue, uint8_t interval); + static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval); + protected: const uint8_t protocolId; const uint8_t numGroups; diff --git a/lib/Radio/MiLightConstants.h b/lib/Radio/MiLightConstants.h index 68e0172c..bd4fdc47 100644 --- a/lib/Radio/MiLightConstants.h +++ b/lib/Radio/MiLightConstants.h @@ -7,7 +7,8 @@ enum MiLightRemoteType { REMOTE_TYPE_CCT = 1, REMOTE_TYPE_RGB_CCT = 2, REMOTE_TYPE_RGB = 3, - REMOTE_TYPE_FUT089 = 4 + REMOTE_TYPE_FUT089 = 4, + REMOTE_TYPE_FUT091 = 5 }; enum MiLightStatus { diff --git a/lib/Types/MiLightConstants.h b/lib/Types/MiLightConstants.h index 68e0172c..bd4fdc47 100644 --- a/lib/Types/MiLightConstants.h +++ b/lib/Types/MiLightConstants.h @@ -7,7 +7,8 @@ enum MiLightRemoteType { REMOTE_TYPE_CCT = 1, REMOTE_TYPE_RGB_CCT = 2, REMOTE_TYPE_RGB = 3, - REMOTE_TYPE_FUT089 = 4 + REMOTE_TYPE_FUT089 = 4, + REMOTE_TYPE_FUT091 = 5 }; enum MiLightStatus { diff --git a/lib/Udp/V5MiLightUdpServer.cpp b/lib/Udp/V5MiLightUdpServer.cpp index 2912178d..2ce35678 100644 --- a/lib/Udp/V5MiLightUdpServer.cpp +++ b/lib/Udp/V5MiLightUdpServer.cpp @@ -85,7 +85,7 @@ void V5MiLightUdpServer::handleCommand(uint8_t command, uint8_t commandArg) { uint8_t onOffGroup = CctPacketFormatter::cctCommandIdToGroup(command); if (onOffGroup != 255) { - client->prepare(&FUT091Config, deviceId, onOffGroup); + client->prepare(&FUT007Config, deviceId, onOffGroup); // Night mode commands are same as off commands with MSB set if ((command & 0x80) == 0x80) { client->enableNightMode(); @@ -95,7 +95,7 @@ void V5MiLightUdpServer::handleCommand(uint8_t command, uint8_t commandArg) { return; } - client->prepare(&FUT091Config, deviceId, lastGroup); + client->prepare(&FUT007Config, deviceId, lastGroup); switch(command) { case UDP_CCT_BRIGHTNESS_DOWN: diff --git a/lib/Udp/V6CctCommandHandler.h b/lib/Udp/V6CctCommandHandler.h index 36b375cc..2f2e742c 100644 --- a/lib/Udp/V6CctCommandHandler.h +++ b/lib/Udp/V6CctCommandHandler.h @@ -18,7 +18,7 @@ enum CctCommandIds { class V6CctCommandHandler : public V6CommandHandler { public: V6CctCommandHandler() - : V6CommandHandler(0x0100, FUT091Config) + : V6CommandHandler(0x0100, FUT007Config) { } virtual bool handleCommand( From 041d06fa4c8d80aacf25cc801c637cdbc7dad9a2 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 13 May 2018 21:34:03 -0700 Subject: [PATCH 05/23] add fut091 to modes, make modes a dropdown --- dist/index.html.gz.h | 4 ++-- web/src/css/style.css | 1 + web/src/index.html | 35 ++++++++++++++++++++++++++++++++--- web/src/js/script.js | 16 +++++++++++++--- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/dist/index.html.gz.h b/dist/index.html.gz.h index 74c75e5c..df93941f 100644 --- a/dist/index.html.gz.h +++ b/dist/index.html.gz.h @@ -1,2 +1,2 @@ -#define index_html_gz_len 9507 -static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,221,125,107,91,219,72,147,232,247,243,43,26,101,222,32,13,146,108,32,16,98,35,103,51,129,76,114,54,23,54,144,153,221,135,229,240,180,237,54,86,34,75,90,73,230,178,140,255,251,169,170,238,214,221,216,185,204,236,236,59,23,144,212,173,170,234,234,234,186,117,169,57,220,24,71,163,236,46,22,108,154,205,130,193,33,254,100,1,15,175,60,67,132,6,220,11,62,30,28,206,68,198,217,104,202,147,84,100,158,49,207,38,206,1,180,101,126,22,136,193,59,255,173,127,53,205,216,235,249,240,176,35,31,29,6,126,248,133,37,34,240,140,52,187,11,68,58,21,34,51,216,52,17,19,207,152,102,89,156,246,58,157,25,191,29,141,67,119,24,69,89,154,37,60,198,155,81,52,235,228,15,58,187,238,174,251,180,51,74,211,226,153,59,243,161,87,154,26,10,71,21,228,149,159,33,20,248,53,157,15,93,63,42,222,115,178,232,234,42,16,157,29,23,254,173,130,84,77,57,228,6,221,173,168,0,207,231,212,29,5,209,124,60,9,120,34,136,116,254,153,223,118,2,127,88,134,158,6,254,88,36,157,103,238,83,183,91,67,44,155,126,44,226,84,4,98,148,249,255,45,220,207,105,167,235,110,239,184,79,8,107,241,60,199,191,251,167,13,153,112,117,182,11,236,245,182,135,48,147,172,133,124,38,60,227,218,23,55,113,148,128,232,140,162,48,19,33,200,222,141,63,206,166,222,88,92,251,35,225,208,141,237,135,126,230,243,192,73,71,60,16,222,54,128,216,112,156,115,127,194,130,140,189,57,102,207,46,6,255,135,193,63,135,233,40,241,227,140,165,201,104,237,49,225,106,216,75,167,254,53,200,226,83,119,183,184,7,238,2,158,142,4,137,240,15,55,206,69,56,246,39,23,142,51,56,164,241,12,92,92,59,34,113,146,232,230,126,24,37,120,57,140,178,44,154,245,182,227,91,150,70,48,251,236,209,104,52,90,4,124,40,130,251,177,159,198,1,191,235,13,131,104,244,101,225,38,124,236,71,78,20,103,126,20,222,199,124,60,246,195,171,94,151,237,197,183,253,209,60,73,163,164,23,71,62,48,37,89,32,205,51,30,142,157,225,28,160,135,233,125,224,167,153,67,52,244,194,40,20,253,25,79,174,252,176,215,237,231,96,26,239,176,192,207,9,240,67,152,124,225,16,29,234,93,39,193,37,222,219,22,179,126,116,45,146,73,16,221,244,248,60,139,22,238,36,74,102,14,204,76,114,119,175,209,176,46,219,233,194,8,187,229,86,38,175,113,30,147,40,184,167,153,235,237,116,197,172,210,169,202,137,50,33,146,73,48,158,204,116,69,146,68,137,197,228,111,199,15,39,81,254,10,142,119,81,110,24,69,1,176,42,17,227,254,4,80,59,41,172,128,158,251,20,209,22,157,122,67,1,52,136,123,37,100,189,77,115,179,210,204,39,192,230,162,213,130,86,53,181,195,44,212,195,198,33,47,220,43,158,137,27,126,231,0,163,169,17,56,197,179,30,113,111,241,72,65,96,238,56,137,226,113,116,3,243,26,165,62,78,112,79,201,112,141,187,205,55,156,153,8,231,229,201,146,204,121,4,107,107,50,241,71,78,26,250,147,73,149,27,143,232,153,24,59,170,15,16,124,235,76,5,77,232,94,183,52,163,206,157,154,211,144,95,15,121,114,63,228,163,47,87,73,52,7,41,81,92,188,26,114,243,201,182,141,255,237,217,238,51,107,195,159,225,242,228,97,214,87,2,142,82,59,79,81,192,36,16,103,152,128,148,217,149,187,222,20,49,170,153,121,52,153,76,22,46,176,10,52,3,140,118,204,65,144,26,136,177,147,194,80,95,59,174,20,146,118,153,113,111,166,126,38,156,76,204,98,39,246,71,95,0,171,26,248,14,140,187,64,211,195,119,128,188,43,36,31,248,109,102,17,163,57,179,31,241,253,241,246,100,194,186,54,210,192,246,186,255,192,11,222,237,118,217,118,183,251,15,171,223,186,104,244,58,219,149,171,96,58,23,45,232,229,18,64,40,253,218,210,47,250,131,252,133,109,111,129,166,27,153,248,42,115,216,174,152,45,33,163,170,39,214,26,47,44,20,57,86,24,223,190,187,191,191,255,20,6,220,133,187,93,48,198,240,15,221,41,62,116,187,19,182,159,119,154,192,221,129,238,132,96,136,63,114,48,215,60,128,159,138,198,251,230,68,2,59,181,162,9,196,36,235,185,123,249,72,113,204,165,225,183,79,115,28,204,83,7,76,10,252,196,1,198,247,149,101,84,230,244,40,128,113,247,64,13,79,235,76,175,195,96,82,51,246,38,126,2,218,52,154,56,232,36,85,245,184,212,138,185,204,235,53,144,69,113,189,69,170,1,28,219,186,104,3,190,20,43,130,105,69,90,109,88,133,200,37,95,77,195,86,60,66,129,213,32,213,218,131,85,166,159,72,155,66,147,150,203,56,24,36,166,255,127,10,198,41,55,54,106,214,118,159,192,67,154,44,245,96,219,125,242,236,1,134,76,124,17,140,161,111,16,183,27,164,66,141,111,187,59,40,39,117,193,1,37,28,220,197,83,31,180,137,155,198,176,128,128,202,123,30,250,51,78,154,22,31,177,237,148,129,102,71,165,43,152,92,11,125,231,70,12,191,248,153,83,237,185,211,210,117,129,94,64,161,186,193,131,129,254,215,96,102,129,10,61,70,144,181,197,48,26,107,163,168,13,255,78,23,173,196,4,188,161,210,170,166,103,255,50,19,99,159,179,40,12,238,24,120,21,66,132,12,84,37,51,17,40,205,13,235,237,162,137,177,238,219,192,238,33,136,117,96,60,57,88,10,163,187,46,140,167,251,7,75,96,108,239,29,172,9,227,217,179,157,101,48,182,247,17,134,59,139,198,224,211,97,7,230,166,232,186,70,161,83,145,216,166,47,37,132,208,98,169,91,93,80,26,202,2,178,66,46,28,210,67,74,190,247,39,251,45,61,82,88,80,185,137,218,223,95,204,3,151,75,34,150,121,89,37,231,170,218,115,153,111,213,210,143,252,27,165,114,70,83,63,24,91,247,13,241,254,151,47,226,110,146,128,127,156,50,148,208,251,73,18,205,238,193,182,135,41,58,82,61,242,130,205,109,139,37,81,6,206,136,217,181,22,89,244,64,251,238,126,119,44,174,44,152,53,189,2,170,240,119,36,2,221,88,0,170,192,95,218,156,131,7,103,153,188,226,195,142,12,41,113,102,7,173,62,57,186,223,238,85,20,65,80,198,99,63,173,185,228,159,255,107,46,146,59,240,199,33,188,80,55,20,77,84,28,242,86,184,235,6,156,159,235,241,230,106,208,235,6,158,159,151,196,157,171,49,172,8,84,192,168,139,36,29,129,23,139,113,223,182,123,0,193,74,241,204,249,33,56,150,196,180,173,241,236,119,35,107,139,99,225,42,5,103,19,244,2,172,183,82,143,31,61,186,74,248,250,121,73,244,218,138,80,38,78,50,113,155,117,62,243,107,46,159,26,131,201,60,164,149,206,192,131,62,139,94,167,129,201,109,97,39,214,61,239,120,59,123,123,182,144,191,18,250,213,191,230,9,75,237,204,30,121,239,120,54,117,65,108,85,119,123,170,158,248,161,126,18,122,230,104,107,106,117,118,250,254,196,28,121,222,212,74,189,204,235,246,69,144,138,123,4,52,244,70,206,180,159,222,128,128,78,205,204,11,7,238,222,243,97,199,220,113,224,177,213,131,43,124,221,30,89,247,35,158,10,198,123,169,103,10,39,177,58,195,45,83,28,38,207,247,123,93,171,63,76,4,7,111,18,59,8,236,144,56,28,59,236,148,27,18,108,224,142,192,134,39,139,180,227,237,47,18,145,205,147,240,126,218,75,237,180,151,217,16,188,45,22,57,39,62,254,250,75,22,189,62,253,77,115,98,219,243,60,208,116,115,136,111,178,212,13,68,120,149,77,31,63,54,133,199,221,43,59,129,159,67,155,195,207,196,210,236,105,48,103,212,96,206,212,3,45,10,44,234,2,236,236,121,183,55,237,100,246,208,203,58,200,100,205,17,53,240,17,144,223,45,143,7,57,1,140,216,154,254,156,243,193,198,81,253,60,173,179,3,184,177,181,243,243,180,165,21,121,2,44,217,122,146,183,86,121,18,218,215,189,33,105,198,181,164,8,7,254,233,253,155,179,203,147,23,31,95,188,59,245,238,97,168,239,124,112,181,83,48,188,187,54,176,66,221,237,62,237,226,221,47,228,132,134,34,77,193,65,216,91,216,159,222,92,158,189,248,229,212,59,191,207,248,85,207,200,248,16,172,241,196,55,236,73,2,65,192,56,184,235,25,191,227,253,194,46,58,164,64,111,92,238,113,74,15,202,93,2,49,46,119,120,123,124,84,105,166,60,70,185,195,71,122,80,238,50,251,175,44,43,247,120,247,111,103,103,198,226,2,9,126,245,230,248,237,81,78,50,31,195,144,47,231,169,72,48,63,84,126,229,5,182,176,162,5,253,199,158,241,73,221,51,176,72,44,0,117,11,246,25,188,57,136,118,178,169,159,50,176,89,49,191,130,222,232,100,247,12,88,226,208,14,119,124,88,226,142,38,84,226,142,121,154,222,128,255,81,198,125,146,63,147,88,245,253,143,192,58,18,151,96,131,203,216,94,30,179,14,59,249,215,51,70,207,21,70,24,59,172,169,227,211,147,131,157,253,125,100,131,68,190,249,242,120,147,153,120,245,254,227,171,157,39,111,187,219,140,66,193,9,31,9,139,97,7,0,164,122,108,158,188,5,215,235,105,231,237,217,193,179,110,119,179,212,113,41,165,105,69,22,70,105,216,160,245,244,253,122,100,158,190,223,92,19,75,34,224,190,142,231,227,241,233,241,122,12,161,158,235,226,2,201,174,99,2,233,174,227,129,121,5,248,4,30,91,193,66,101,243,148,41,135,143,153,93,15,46,249,16,96,89,125,22,138,43,138,21,128,187,16,161,166,232,98,249,87,33,15,152,153,8,204,200,1,22,230,236,16,44,244,11,35,14,82,4,64,215,157,130,24,34,124,224,78,34,98,193,179,180,42,163,216,194,242,22,73,254,217,84,176,112,62,27,10,64,55,97,153,143,62,31,166,2,168,23,251,248,138,73,128,64,37,38,161,160,101,56,15,134,233,82,98,146,202,202,70,187,171,72,185,4,57,202,162,164,76,208,235,179,179,19,141,72,183,74,162,222,205,131,204,143,3,127,36,57,37,27,113,54,171,163,35,38,37,2,28,192,52,195,16,13,243,103,25,76,243,240,14,150,153,96,4,255,197,201,27,151,125,58,162,11,6,68,3,204,0,98,18,224,181,0,208,48,73,115,137,71,232,129,218,16,74,176,25,120,76,154,83,44,157,70,243,0,160,138,66,136,16,244,154,58,99,158,69,64,47,136,68,2,50,43,18,63,170,40,142,23,208,236,168,102,166,155,37,19,176,9,195,80,77,176,236,131,3,147,169,111,38,64,126,238,74,147,135,145,125,70,46,187,24,1,9,98,12,3,7,169,236,18,197,90,2,215,20,35,232,62,194,12,202,221,37,37,223,75,20,31,233,22,38,91,148,154,5,14,227,61,74,8,70,69,16,239,41,172,186,179,18,35,136,200,217,145,152,112,152,97,18,52,28,79,138,250,153,222,38,6,195,244,233,13,37,57,82,152,147,39,7,7,207,158,233,241,192,107,106,56,235,205,1,26,151,75,176,3,64,72,221,198,48,253,88,14,227,8,56,142,122,35,97,111,78,24,4,115,192,245,20,89,75,93,135,73,244,5,124,91,246,129,18,242,52,43,146,213,119,140,75,242,193,161,152,50,83,220,242,89,28,128,118,157,221,225,123,234,181,17,6,170,7,7,79,150,146,76,38,176,66,50,196,159,254,8,236,77,6,106,56,108,80,78,173,44,111,213,134,135,110,137,249,69,175,180,52,45,56,1,199,146,194,30,60,3,46,167,157,158,228,243,165,63,206,47,145,200,78,143,210,68,240,216,101,167,66,176,143,199,47,142,222,29,19,236,201,60,129,153,131,9,22,25,247,131,229,250,160,57,168,121,60,134,213,182,98,108,178,211,195,67,132,33,197,243,33,140,106,202,74,239,164,46,59,81,162,150,77,65,177,112,90,200,180,216,97,233,66,24,203,34,69,184,146,44,76,75,196,245,55,72,217,81,111,178,215,106,193,221,248,65,128,11,17,100,151,161,171,33,17,130,98,64,235,142,175,124,5,27,208,70,172,226,2,245,249,154,121,46,243,68,191,236,178,223,167,152,125,97,50,229,55,154,130,103,137,74,2,155,109,90,126,147,57,12,235,75,24,221,132,234,37,52,4,240,92,190,64,131,6,221,167,224,2,23,181,23,83,35,108,125,9,104,113,222,228,12,66,3,171,59,111,244,128,228,55,66,23,10,175,42,11,119,109,180,109,126,27,65,138,151,57,111,57,210,111,193,73,150,240,50,119,161,104,65,53,124,224,194,197,98,178,93,82,0,65,39,251,245,245,127,51,130,1,198,104,44,2,80,59,152,75,147,211,39,249,239,79,216,93,52,167,153,195,139,77,144,219,48,66,29,138,226,200,195,220,225,219,208,4,183,147,180,196,118,75,117,209,230,72,188,149,138,164,230,72,188,9,71,16,246,16,110,73,157,188,71,119,2,100,137,207,162,57,44,41,229,98,160,222,132,59,137,2,223,64,49,86,139,16,85,13,153,145,178,158,47,186,230,214,131,1,142,93,119,61,3,32,23,219,36,152,167,83,57,252,107,30,84,34,26,18,123,106,103,69,187,242,69,192,175,152,205,103,21,59,27,0,57,180,85,133,139,63,187,193,236,38,189,76,122,64,173,59,120,194,211,105,251,104,96,62,193,47,68,205,227,207,40,81,154,9,152,91,48,255,41,12,179,6,97,77,131,93,82,42,9,254,8,252,153,223,136,168,20,104,236,192,84,135,175,26,100,89,207,98,39,244,5,21,76,115,92,50,234,123,221,238,114,127,181,178,74,42,14,221,101,54,77,162,44,11,4,94,8,112,187,130,241,82,7,150,233,190,172,212,87,14,230,165,220,96,78,217,20,22,70,92,241,122,73,185,235,55,193,170,229,182,130,20,62,153,239,0,77,62,9,169,30,53,200,47,218,1,30,74,193,166,157,44,102,130,42,42,243,200,146,138,114,196,49,16,168,33,69,175,185,132,150,225,46,46,224,126,23,17,49,85,184,4,5,150,138,30,221,60,134,158,101,135,105,167,219,157,173,235,127,47,225,46,12,22,55,46,174,253,236,110,13,254,86,122,127,53,135,95,131,135,1,18,69,131,75,43,236,105,242,5,172,13,174,9,100,15,248,252,176,224,147,170,88,117,109,54,227,183,36,168,146,89,219,221,46,60,235,234,117,149,46,23,186,135,248,50,147,194,191,156,21,121,135,150,209,79,120,162,71,128,171,127,4,179,57,22,82,243,145,226,43,86,148,4,38,10,111,163,50,182,221,117,105,151,46,153,210,104,184,81,86,209,205,191,146,205,150,75,82,183,74,170,79,41,111,153,178,155,169,63,154,170,182,82,104,3,234,58,152,143,129,58,95,45,115,9,67,47,118,156,23,8,156,207,208,253,137,163,16,213,58,234,236,66,1,104,234,219,200,107,95,250,34,196,57,187,228,58,204,185,68,59,119,41,147,114,196,128,98,84,199,212,149,229,93,201,36,178,82,87,57,196,87,64,209,199,95,127,249,253,119,25,164,50,83,154,66,120,180,245,242,229,25,122,245,175,62,157,117,15,158,89,54,147,200,211,18,200,28,90,190,238,17,9,218,49,70,155,77,56,73,124,50,1,30,230,62,20,58,66,98,6,106,27,194,125,144,122,228,81,138,151,180,119,8,140,70,111,27,157,205,27,80,18,204,7,253,66,204,70,27,13,238,197,23,205,177,149,124,88,102,160,197,88,118,69,83,119,9,74,104,226,95,213,243,20,196,167,241,28,5,138,97,55,166,187,73,134,229,93,136,214,82,104,73,246,155,189,24,141,80,25,158,96,241,128,234,199,65,19,160,133,143,20,36,28,55,101,12,213,96,52,81,37,170,49,232,108,167,121,2,161,67,35,115,88,34,136,40,150,157,20,198,16,216,191,146,248,41,79,155,111,233,88,147,96,134,48,195,165,25,88,151,232,136,166,186,38,155,85,50,74,93,214,98,113,58,39,30,163,11,14,49,254,156,118,170,191,150,44,169,79,90,105,202,83,38,233,58,244,164,88,190,6,179,75,89,21,12,153,240,38,127,255,91,136,2,177,156,135,21,210,94,161,79,195,70,210,27,108,80,247,190,158,137,2,250,144,98,178,138,228,14,73,186,181,10,69,99,67,171,177,196,182,134,254,36,250,46,236,95,63,126,248,116,114,121,122,246,226,236,248,242,95,143,255,227,212,59,55,148,230,50,100,194,14,46,134,121,190,28,110,2,113,45,192,13,52,166,115,234,147,175,108,184,161,93,97,248,45,57,97,124,17,193,181,159,63,191,68,165,128,192,64,9,41,94,65,195,44,158,131,242,191,212,111,10,82,37,112,145,135,222,112,173,195,237,226,49,185,232,23,54,240,224,242,221,135,163,99,36,250,195,100,2,237,167,1,24,31,185,125,8,119,175,192,90,22,119,212,6,209,90,172,91,244,117,64,21,69,112,245,33,4,160,159,142,78,46,79,62,126,56,251,240,242,195,219,203,223,142,63,158,190,249,240,30,16,236,217,251,23,246,209,241,171,23,159,222,158,93,22,125,242,46,222,158,157,239,187,217,180,105,14,236,246,54,182,113,251,201,48,54,188,32,26,17,155,220,105,148,102,24,188,89,180,11,117,35,134,167,17,206,154,23,138,27,246,187,190,51,141,27,220,153,51,182,26,175,109,25,189,131,109,195,234,231,47,186,81,8,50,145,242,43,225,233,61,36,19,128,3,90,77,133,196,148,121,194,5,171,197,251,63,153,70,189,242,205,176,220,24,13,113,56,54,141,67,184,26,24,91,217,150,113,216,161,75,107,177,88,16,128,232,181,184,173,224,144,123,54,70,247,214,216,18,110,22,157,146,136,153,219,251,22,220,124,138,97,205,191,4,123,111,90,11,27,183,243,175,197,167,36,40,94,151,68,9,15,169,145,179,250,102,204,100,81,103,79,50,18,228,211,114,193,163,49,45,59,163,110,36,7,208,203,149,224,64,81,128,240,64,31,28,149,105,144,239,99,88,54,247,174,68,246,114,158,36,224,187,190,3,49,51,45,57,5,158,39,44,116,73,110,140,119,115,152,124,129,1,141,94,229,111,142,12,236,148,35,81,213,165,57,108,48,234,112,157,198,129,15,51,99,195,165,242,11,82,147,91,127,252,97,102,94,215,178,13,220,85,6,118,3,217,158,135,2,138,203,181,137,81,166,15,16,161,226,94,71,85,70,166,48,219,48,187,240,147,211,207,108,97,87,7,82,230,157,124,151,253,100,110,18,19,206,101,85,48,173,170,139,222,104,42,64,48,198,155,53,206,44,108,233,182,144,51,228,93,186,218,195,52,203,83,138,229,170,63,185,184,249,107,222,207,147,160,151,207,28,204,194,76,100,211,104,12,110,224,167,51,195,70,208,189,255,123,250,225,189,43,53,139,63,185,131,247,109,85,151,121,70,58,135,199,42,91,29,133,157,207,41,170,8,165,216,123,101,148,160,168,198,129,160,96,243,19,17,8,15,23,11,107,1,47,202,125,72,30,136,36,131,139,197,194,222,22,187,150,141,10,249,165,172,210,93,54,12,53,4,163,147,222,129,195,12,62,234,125,78,252,135,211,111,165,30,104,146,4,168,25,59,165,188,199,199,232,166,180,40,236,204,230,82,180,125,207,56,204,146,1,8,214,22,94,141,7,134,13,87,155,135,52,97,170,140,91,11,126,122,126,97,176,17,40,242,212,51,202,213,192,134,244,232,61,99,19,68,99,211,232,12,54,109,130,214,209,224,150,1,198,188,235,26,64,179,149,64,199,254,181,134,129,165,168,36,189,6,67,246,169,42,13,120,46,139,116,140,193,102,31,208,152,56,246,208,235,246,195,195,86,77,170,118,176,251,225,214,150,228,83,228,181,246,59,15,47,236,212,227,158,23,253,241,71,228,121,15,104,222,199,143,55,218,49,149,22,105,159,6,67,149,210,165,225,176,74,117,237,230,150,153,62,55,152,148,120,163,103,24,22,112,71,50,71,51,23,151,181,39,19,70,134,174,196,199,244,4,12,31,153,141,206,42,154,180,64,100,208,18,129,69,146,156,202,249,29,1,68,38,241,168,69,42,241,24,3,102,108,69,106,26,136,202,129,161,118,196,153,124,8,243,48,104,159,33,201,254,250,168,198,232,139,163,195,50,139,174,133,163,139,175,85,166,46,31,148,126,43,175,238,98,69,157,151,124,21,75,57,252,92,66,36,46,77,67,137,156,14,74,250,194,14,34,62,62,21,25,122,122,105,89,93,129,98,85,5,34,242,151,131,187,82,168,81,233,78,86,244,130,130,105,181,147,143,31,255,228,130,34,196,197,138,235,89,65,7,231,169,106,236,62,12,63,35,252,47,226,46,133,39,88,58,127,204,65,125,228,189,50,41,109,28,44,201,230,35,13,133,149,181,167,92,14,23,155,86,159,43,33,29,116,31,63,54,213,116,99,21,134,203,179,44,49,13,242,62,172,231,220,157,248,1,168,116,115,243,188,88,165,231,217,133,4,226,142,208,173,48,173,30,39,27,134,13,150,181,176,108,48,194,218,181,73,1,122,81,171,67,5,184,114,19,37,53,171,253,154,163,129,49,23,111,242,241,88,190,103,222,99,105,68,143,12,53,170,51,34,171,39,22,136,183,232,158,136,9,166,134,114,84,136,171,25,159,106,167,1,216,37,95,85,92,106,137,100,145,101,89,117,46,13,74,21,182,194,93,192,100,9,183,45,76,91,134,178,53,164,123,0,105,43,236,54,180,50,28,90,15,173,138,202,214,70,171,96,215,208,230,129,208,74,164,69,200,180,14,202,2,110,13,161,12,9,86,98,83,193,210,58,168,20,196,133,94,77,224,50,85,180,139,35,25,158,194,242,198,114,96,240,188,172,190,208,159,127,168,217,0,201,111,60,106,21,114,88,114,49,185,165,117,147,107,42,33,63,239,94,128,252,158,111,95,192,143,29,90,97,104,165,83,126,45,126,149,111,188,148,208,219,29,79,140,131,230,227,88,235,71,160,25,92,77,240,217,161,77,58,151,54,168,18,169,8,95,162,166,52,13,250,248,197,144,181,86,164,75,202,26,164,108,206,47,54,241,221,25,143,75,227,41,92,131,159,192,38,73,223,182,175,213,124,250,158,191,55,125,235,57,120,147,27,93,155,58,192,194,174,162,181,67,136,136,173,158,15,235,217,175,35,215,38,255,207,70,28,34,226,138,11,126,222,176,132,173,52,100,37,183,53,171,251,166,228,164,111,64,23,237,66,68,222,57,58,0,221,126,122,168,213,113,63,5,159,33,58,79,47,188,115,14,63,109,31,127,132,240,227,162,95,248,123,185,125,200,61,62,154,199,21,126,105,155,63,120,95,19,208,94,68,194,181,176,245,52,31,35,111,42,1,145,120,110,22,241,140,227,143,29,178,229,70,27,67,91,250,149,191,219,210,171,71,88,86,175,29,100,155,88,106,23,31,195,5,165,223,155,130,223,8,143,0,62,22,149,139,34,234,169,204,28,154,111,76,197,175,14,134,132,245,92,119,77,167,176,70,145,116,121,91,33,86,121,88,48,66,31,241,227,130,141,241,3,218,223,164,0,85,56,170,35,215,25,5,3,29,243,63,199,91,214,127,186,229,95,166,99,186,63,91,214,243,142,150,232,251,25,255,28,37,189,12,149,194,204,15,233,114,231,2,80,0,4,184,220,189,176,19,96,38,98,130,187,61,108,128,133,211,59,167,254,212,147,250,96,211,5,76,54,44,15,113,35,146,38,109,118,238,81,148,137,71,179,235,87,159,100,249,82,227,46,225,26,248,242,247,194,150,161,207,75,116,5,95,69,137,140,126,90,102,12,23,31,40,38,250,197,203,205,176,102,240,225,134,135,94,18,72,201,72,206,171,163,150,98,46,68,174,122,176,101,48,19,99,117,0,235,243,16,66,124,75,45,237,13,47,147,16,2,164,32,7,192,92,148,69,172,123,7,80,162,162,156,53,109,217,121,85,58,168,239,133,141,186,177,252,56,78,162,24,212,38,207,5,4,31,96,57,106,33,35,74,222,23,154,34,24,147,34,141,28,200,6,105,42,61,85,152,25,187,217,75,175,37,41,142,82,107,247,185,87,157,84,51,115,51,126,117,137,90,204,206,89,101,61,55,160,15,211,216,248,53,216,115,204,72,111,128,199,254,31,114,91,57,146,153,194,25,56,170,148,25,12,51,221,221,53,136,22,77,68,58,135,96,53,185,211,164,114,73,136,239,101,46,172,7,220,220,85,142,100,217,89,85,34,147,185,72,22,76,195,88,220,126,64,203,174,166,206,218,240,156,109,212,154,37,87,21,81,78,252,100,118,195,19,225,224,103,202,134,98,179,129,159,43,131,167,14,198,210,29,38,209,13,24,234,75,220,78,66,119,253,18,162,124,84,106,126,77,180,65,233,165,81,0,118,63,186,82,145,113,126,11,198,191,223,34,109,246,138,25,42,197,27,250,235,35,214,30,120,144,127,170,34,15,235,33,78,62,60,233,82,189,216,185,109,224,195,8,77,193,125,35,9,1,195,5,65,182,57,166,170,208,111,155,39,130,76,157,126,51,255,254,34,246,245,151,12,88,34,159,136,56,74,59,169,63,142,166,29,145,198,88,80,121,57,243,169,120,232,18,250,64,123,64,91,253,29,73,94,27,102,204,184,120,162,129,89,107,134,82,82,164,158,220,19,196,93,90,247,21,55,64,241,28,35,16,57,247,58,208,180,141,15,239,49,9,38,223,179,138,175,61,206,40,142,55,193,123,129,219,8,121,91,111,194,8,129,50,180,90,31,231,213,250,234,185,155,232,30,238,85,126,53,196,92,92,94,205,254,112,207,126,125,20,69,90,25,71,34,191,159,192,32,50,251,141,28,6,123,187,219,253,153,187,169,165,12,222,9,170,116,113,243,18,193,225,151,53,63,103,238,148,250,128,55,171,126,7,202,53,46,146,209,218,39,194,246,74,131,83,42,38,119,243,90,114,171,99,86,158,235,170,242,37,189,235,67,42,237,137,45,25,147,175,40,44,210,237,146,194,208,43,63,251,25,63,111,237,212,40,41,42,218,27,120,101,190,190,29,99,136,43,191,201,193,70,62,43,163,36,39,224,133,41,133,75,238,237,117,105,225,53,191,97,5,233,25,129,141,47,125,169,76,16,123,198,20,164,133,18,156,54,229,150,255,97,83,158,243,31,22,101,213,240,155,178,83,157,51,111,245,212,41,97,13,6,164,148,89,71,2,252,166,135,94,253,82,173,226,123,85,63,115,147,186,35,141,121,72,64,164,66,57,165,114,82,77,139,65,180,193,147,175,37,174,187,146,56,197,172,54,226,36,221,173,196,69,113,137,54,82,125,149,239,219,115,75,135,10,186,154,127,169,28,155,96,232,244,68,139,147,23,131,32,152,13,229,177,209,69,31,93,14,25,88,159,181,58,105,88,189,255,239,142,6,20,77,38,32,105,0,10,191,208,3,85,144,117,204,237,159,117,35,125,237,136,185,7,95,126,156,66,162,66,43,23,172,99,203,154,246,173,114,246,218,188,7,193,35,69,217,215,82,88,254,44,28,61,216,8,139,102,193,198,21,67,228,168,229,97,102,50,23,107,135,137,14,144,237,133,234,59,143,205,170,61,216,216,214,77,96,53,150,182,225,220,86,81,60,126,92,71,64,43,69,46,62,35,95,133,242,105,194,111,28,57,46,156,18,218,64,111,186,88,247,11,224,183,156,138,97,116,11,58,92,51,177,146,142,210,15,125,144,37,189,5,96,20,222,149,140,249,196,121,245,93,42,43,180,46,192,248,149,185,43,52,209,249,89,24,89,171,200,84,102,68,245,237,85,253,62,245,212,160,192,92,50,130,50,242,203,64,150,114,251,107,131,212,235,175,14,13,3,50,18,103,112,82,84,173,16,176,93,47,210,231,101,165,3,161,74,101,157,155,26,116,101,121,57,163,32,74,69,43,217,21,88,173,11,83,7,59,216,136,159,120,194,35,120,213,32,80,160,20,31,225,193,24,42,131,130,188,177,87,12,163,236,144,25,83,95,105,131,165,169,152,101,105,20,3,80,27,150,30,45,109,32,229,130,216,136,37,151,209,238,182,167,153,237,22,237,66,28,76,33,112,204,146,60,134,69,174,228,91,7,28,66,126,126,248,172,207,33,214,207,3,83,125,200,71,49,144,205,195,192,31,28,114,117,16,207,35,149,104,167,206,121,50,150,83,254,30,205,204,97,135,131,55,9,111,24,20,237,182,13,161,130,135,5,62,227,213,41,80,254,120,69,228,241,157,154,112,22,20,24,50,219,219,152,56,212,29,118,235,198,157,93,126,36,21,53,56,114,118,190,61,186,217,84,17,249,142,157,206,144,151,247,235,86,110,178,233,61,54,104,95,148,83,196,149,77,217,60,77,15,13,176,36,19,172,214,234,129,26,77,163,36,123,133,41,221,30,125,144,103,216,81,40,197,228,197,120,220,171,198,18,153,43,231,132,194,226,55,120,170,134,124,0,214,85,194,123,69,241,79,175,133,223,121,228,255,255,204,238,237,57,119,38,47,156,87,93,231,217,197,253,182,253,100,241,199,185,186,220,91,88,63,117,172,231,102,142,0,34,150,238,33,70,144,226,208,219,223,219,219,221,123,110,86,178,54,230,198,182,133,54,173,87,123,44,119,106,135,88,181,68,37,175,184,135,162,11,159,186,183,93,60,221,4,235,153,186,183,175,224,31,3,39,211,250,17,48,170,220,207,175,48,94,203,111,84,204,184,121,56,207,183,176,66,126,205,224,127,39,227,195,212,96,254,216,51,168,250,245,12,111,7,155,118,232,233,84,75,95,125,225,216,154,99,149,91,99,121,108,182,185,21,226,186,41,214,214,38,110,238,243,43,220,186,170,236,251,1,86,92,94,194,213,101,44,229,117,134,200,13,76,83,74,224,37,112,141,156,107,11,212,79,71,39,57,40,189,247,52,15,90,246,36,17,152,74,237,85,70,204,176,238,100,229,160,107,128,192,217,194,175,170,198,130,73,30,16,71,139,209,75,248,70,241,241,101,235,38,19,120,240,152,78,24,98,164,5,239,233,28,81,5,89,113,174,19,110,154,114,28,30,238,239,25,54,47,118,41,161,15,109,73,229,200,225,178,204,104,181,75,8,222,12,214,8,61,126,108,242,218,136,138,227,66,20,135,241,210,193,165,42,225,226,45,77,52,237,45,66,156,205,243,141,70,208,135,173,69,241,248,181,176,139,87,207,235,200,74,123,195,200,180,214,183,151,236,26,175,216,149,213,251,177,131,182,45,88,196,21,38,147,157,39,122,55,182,29,113,203,190,172,50,18,33,126,12,96,176,206,128,209,149,102,235,10,154,150,19,19,100,248,141,232,183,82,35,191,48,37,114,42,223,156,230,100,201,169,106,45,39,205,167,70,10,130,84,27,121,190,165,180,163,195,202,91,176,108,233,166,30,155,201,175,13,5,136,125,189,70,172,125,171,6,197,71,90,173,1,5,122,135,29,125,183,208,194,37,81,131,21,46,85,204,125,23,225,229,5,82,148,131,253,0,250,240,126,85,9,106,78,249,67,75,97,21,144,63,105,85,40,180,117,100,146,107,43,105,90,46,162,89,2,158,13,10,168,44,62,254,238,5,163,106,212,127,60,161,19,30,164,146,210,35,137,162,190,136,170,53,29,228,194,180,87,203,212,37,13,11,102,202,186,18,76,9,95,72,83,167,159,105,195,183,142,129,105,216,67,105,241,154,222,124,234,208,201,63,172,116,0,80,201,133,150,41,130,10,21,149,107,138,147,244,230,88,81,238,231,91,245,150,116,62,156,249,153,217,72,55,54,28,217,246,13,84,119,202,211,218,62,143,213,220,142,197,80,84,31,196,33,139,251,202,20,136,196,231,1,184,60,47,146,132,223,153,56,198,241,124,36,106,123,137,210,174,138,115,153,33,191,200,247,88,158,211,91,16,6,203,183,57,22,106,196,243,116,154,59,157,189,252,29,239,156,219,234,233,69,233,169,122,100,139,133,125,191,192,13,241,162,18,195,187,164,189,49,138,99,181,99,166,37,133,185,58,185,210,22,56,252,132,85,41,181,61,79,172,107,116,65,240,112,34,238,155,58,184,119,126,1,145,127,41,129,253,3,55,55,51,244,254,115,210,10,246,75,25,163,4,10,252,198,200,18,35,66,29,180,52,2,76,92,41,237,50,163,96,183,77,125,91,84,180,84,220,151,146,82,58,15,109,233,230,20,116,59,244,105,31,161,61,213,86,218,117,160,207,229,105,139,193,191,194,56,51,139,34,180,127,230,125,28,128,233,198,195,87,32,206,137,98,112,184,240,168,173,90,212,151,187,86,134,172,33,228,126,8,225,140,140,51,23,24,114,170,156,139,140,93,117,122,229,145,250,140,164,146,11,105,221,18,180,42,149,85,166,213,220,230,197,24,186,56,46,5,3,131,34,70,24,98,14,89,30,51,169,78,87,0,125,92,82,77,57,197,213,199,234,21,121,160,39,52,169,66,51,169,47,229,141,81,235,171,106,173,171,54,109,20,5,1,143,211,252,49,79,174,240,172,100,125,242,101,222,60,56,196,116,103,110,249,19,7,143,73,51,6,114,15,2,7,224,95,145,84,195,48,161,223,128,85,186,211,28,2,56,58,122,232,251,155,243,82,55,6,129,75,117,140,116,82,167,62,178,185,99,84,79,121,230,202,188,84,217,43,7,200,154,3,110,132,114,216,14,191,232,152,225,82,204,148,47,252,42,103,229,2,169,178,181,190,146,7,90,106,242,128,170,6,154,210,83,50,120,164,203,193,195,101,129,148,183,166,37,37,89,56,168,102,204,115,254,21,200,52,180,60,137,83,194,78,103,199,24,245,30,237,114,148,191,207,64,217,150,68,16,55,68,29,176,58,113,20,207,99,237,161,208,67,113,11,180,140,197,88,123,3,3,121,24,78,101,234,71,60,161,195,149,75,116,23,179,82,57,92,182,62,41,68,187,35,79,170,91,107,102,42,47,232,233,121,33,111,43,12,147,227,75,69,204,19,142,231,127,228,228,248,215,190,92,139,205,121,164,140,175,202,37,171,100,64,89,189,172,65,158,238,174,8,35,21,68,159,179,41,37,180,68,128,114,148,235,98,112,242,61,106,133,73,194,103,175,212,227,37,120,112,71,169,81,123,220,138,70,246,116,234,11,225,23,122,92,64,199,140,66,249,74,150,216,202,159,176,6,151,168,72,226,108,158,114,40,247,193,66,255,250,194,119,210,153,179,155,123,243,20,211,231,121,53,233,255,214,234,122,6,71,234,139,132,113,85,76,75,149,65,133,172,42,135,86,133,76,5,56,4,78,102,11,191,255,21,128,243,152,62,61,152,206,135,248,225,193,32,143,115,90,117,21,146,252,164,58,144,114,113,16,161,169,124,36,33,185,79,99,27,141,50,59,185,26,222,224,143,75,188,153,204,179,238,193,179,42,3,212,103,28,198,128,178,168,249,40,150,135,80,250,133,63,33,84,170,230,90,87,21,112,111,195,74,148,27,43,94,190,51,54,96,219,223,21,4,125,29,5,59,128,111,231,47,196,7,178,203,118,255,66,124,32,120,108,221,44,12,171,136,101,33,132,185,204,125,55,53,123,64,205,222,223,134,154,125,160,102,255,111,67,205,83,160,230,233,223,134,154,3,160,230,224,47,148,211,46,224,123,17,4,213,156,66,229,103,187,82,45,169,65,74,126,13,208,133,95,67,5,82,231,63,77,255,73,232,43,134,140,122,189,85,255,225,183,229,63,128,245,107,17,1,54,5,48,190,124,121,246,87,33,84,134,76,14,115,235,175,69,44,145,254,85,8,245,98,84,167,1,172,39,218,203,124,158,237,157,7,60,136,66,1,84,124,5,248,93,248,11,235,226,152,238,13,94,207,97,5,193,239,175,165,113,191,22,113,22,85,36,75,27,84,121,73,123,16,217,172,133,42,60,53,245,171,193,202,37,36,47,103,87,213,171,250,10,46,157,230,21,117,223,204,44,41,95,58,62,167,50,22,86,42,96,97,141,210,61,73,186,236,137,39,45,163,222,172,62,227,183,224,85,117,107,79,181,183,5,207,191,141,79,74,154,190,153,87,84,114,196,206,138,130,189,111,102,89,233,105,227,47,110,172,205,209,114,229,224,159,195,210,175,91,215,192,139,162,222,240,155,88,67,96,214,27,188,44,95,252,209,195,254,42,97,160,114,163,239,24,104,145,79,168,253,109,33,149,81,40,235,237,188,202,75,175,38,89,206,155,227,41,241,167,186,109,174,50,38,77,251,44,67,220,246,69,195,228,169,251,75,85,114,17,190,249,15,231,255,154,94,71,185,116,76,130,87,79,168,72,225,146,86,131,49,248,29,127,229,201,54,21,141,19,115,215,197,136,33,241,67,200,66,42,199,150,206,214,123,188,174,97,91,123,100,178,116,251,33,84,49,247,147,213,233,179,121,170,210,103,39,208,253,27,137,81,95,247,62,64,203,60,92,135,154,242,55,190,236,19,189,82,159,12,76,141,196,240,59,126,88,142,191,70,190,148,60,149,94,169,255,9,150,21,217,230,156,13,234,204,59,188,86,39,74,61,52,61,88,79,26,205,83,37,12,21,219,221,198,28,162,167,45,35,92,126,145,118,3,180,27,175,156,130,239,39,157,209,199,192,19,255,182,33,205,226,54,91,151,126,45,106,85,242,43,74,74,99,169,89,131,98,21,254,0,181,81,2,81,202,0,47,249,106,93,113,165,145,8,174,242,178,61,45,76,147,240,112,114,87,243,96,73,134,151,85,139,13,171,137,193,111,99,202,178,116,216,255,128,252,203,189,243,88,136,241,165,26,222,143,92,1,167,8,248,7,46,129,7,168,39,254,252,21,210,223,200,11,227,219,148,145,108,221,169,44,9,5,15,104,159,95,111,85,140,125,30,68,87,13,53,201,3,103,121,75,107,142,89,54,173,181,37,39,107,149,37,23,33,32,153,249,249,251,198,224,49,157,35,213,47,216,50,221,169,98,80,147,170,118,110,153,172,23,70,23,104,167,125,17,232,122,132,149,78,17,43,59,70,184,123,220,194,79,185,171,60,56,204,232,120,187,162,126,2,41,58,204,228,31,201,201,18,188,204,179,229,71,135,29,184,195,39,120,228,246,73,148,100,249,131,147,36,194,184,55,96,234,107,191,188,161,216,217,171,219,248,218,223,42,148,41,152,90,125,246,218,118,94,110,56,32,62,60,36,3,175,228,0,232,15,56,181,12,94,215,108,99,87,249,167,128,58,52,118,248,141,124,89,21,69,230,179,51,120,28,14,211,184,95,147,220,218,166,200,63,159,200,22,219,157,107,201,106,147,75,235,120,244,36,184,114,35,143,138,207,203,156,173,37,98,100,105,196,50,119,50,47,87,58,149,221,190,118,146,53,88,58,34,137,209,79,231,134,39,244,109,165,188,163,63,168,165,42,141,42,95,36,172,53,21,141,215,212,39,16,45,211,241,100,112,38,59,50,117,184,24,51,233,248,88,172,117,214,71,141,91,48,43,79,74,194,88,59,133,108,217,32,139,205,204,250,222,225,63,159,252,54,54,67,191,74,229,182,200,129,129,254,251,145,250,218,151,105,254,177,161,31,242,196,199,3,75,229,121,238,130,229,91,173,165,191,221,165,63,117,93,253,145,43,24,11,63,123,61,31,50,253,128,225,215,96,168,252,92,86,108,37,115,22,150,62,170,30,66,152,136,69,47,116,186,162,252,152,218,104,108,59,27,234,15,63,186,20,131,192,127,195,193,59,254,69,176,116,158,200,179,100,105,36,119,250,172,239,121,140,227,164,147,61,57,69,107,49,29,121,137,0,161,71,194,232,79,135,108,192,52,12,114,30,203,19,142,253,16,59,243,204,31,210,233,190,234,128,160,17,29,78,170,202,149,24,125,24,235,178,55,19,121,54,241,148,10,122,82,27,198,44,79,97,36,114,232,111,147,16,200,79,167,191,72,170,229,252,85,180,70,71,207,132,193,100,45,23,158,224,145,130,162,16,225,72,10,151,44,192,229,73,70,42,193,65,169,170,233,150,137,31,228,121,18,186,70,254,104,133,22,183,235,33,149,86,120,88,43,213,212,80,67,240,228,223,105,252,58,47,117,201,186,120,137,107,166,20,116,62,160,235,202,53,13,255,220,203,127,221,85,143,28,169,127,26,175,223,155,38,164,148,213,81,31,133,247,83,86,192,245,243,34,234,220,174,126,87,111,16,192,183,244,172,9,79,39,242,100,194,234,97,72,186,144,65,110,49,228,160,154,219,96,249,241,19,146,171,112,133,158,160,60,171,33,199,33,95,251,40,245,14,59,34,254,173,7,42,255,235,13,151,60,91,2,238,125,68,165,47,10,94,156,136,135,224,169,169,161,115,51,201,187,40,124,204,90,119,252,188,214,147,231,50,148,222,199,26,94,60,144,193,24,252,230,131,158,4,65,147,74,181,90,88,214,10,21,153,92,61,252,161,80,250,213,202,154,213,222,196,255,244,34,111,47,224,249,95,188,216,87,187,161,135,211,221,124,5,149,255,166,171,46,91,98,37,191,118,183,168,138,234,148,42,3,213,108,23,158,168,75,229,191,245,153,138,19,95,234,137,6,224,170,140,45,37,232,35,44,100,60,163,191,74,81,213,184,21,100,125,149,113,139,87,218,55,229,3,124,143,101,139,91,157,236,191,145,248,183,213,9,254,47,22,254,37,150,78,214,98,230,229,143,171,13,94,145,180,171,254,117,224,234,246,68,123,166,156,68,96,198,74,223,158,215,210,75,234,15,137,73,233,230,201,3,187,4,223,136,128,178,77,149,19,12,65,44,224,17,157,19,207,100,109,124,91,238,253,111,35,157,29,149,140,64,27,53,248,255,216,161,8,12,29,135,0,0}; \ No newline at end of file +#define index_html_gz_len 9620 +static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,221,125,107,91,219,72,147,232,247,243,43,26,101,222,96,13,178,108,32,144,196,198,206,102,18,50,201,217,92,216,64,102,118,31,150,195,211,182,219,88,137,44,105,37,153,203,50,254,239,167,170,250,162,214,197,224,92,102,118,246,157,11,72,234,86,85,117,117,221,187,213,28,108,76,226,113,126,147,8,54,203,231,225,240,0,127,178,144,71,23,3,71,68,14,220,11,62,25,30,204,69,206,217,120,198,211,76,228,3,103,145,79,219,79,160,45,15,242,80,12,223,5,111,131,139,89,206,94,47,70,7,29,249,232,32,12,162,47,44,21,225,192,201,242,155,80,100,51,33,114,135,205,82,49,29,56,179,60,79,178,94,167,51,231,215,227,73,228,143,226,56,207,242,148,39,120,51,142,231,29,243,160,179,235,239,250,143,59,227,44,43,158,249,243,0,122,101,153,163,112,148,65,94,4,57,66,129,95,179,197,200,15,226,226,189,118,30,95,92,132,162,179,227,195,191,101,144,170,201,64,174,209,221,136,10,240,124,206,252,113,24,47,38,211,144,167,130,72,231,159,249,117,39,12,70,54,244,44,12,38,34,237,60,245,31,251,221,10,98,217,244,99,17,103,34,20,227,60,248,111,225,127,206,58,93,127,123,199,127,68,88,139,231,6,255,238,159,54,100,194,213,217,46,176,87,219,238,194,76,178,22,241,185,24,56,151,129,184,74,226,20,68,103,28,71,185,136,64,246,174,130,73,62,27,76,196,101,48,22,109,186,241,130,40,200,3,30,182,179,49,15,197,96,27,64,108,180,219,167,193,148,133,57,123,115,200,158,158,13,255,15,131,127,14,178,113,26,36,57,203,210,241,218,99,66,109,216,203,102,193,37,200,226,99,127,183,184,7,238,2,158,142,4,137,240,15,54,78,69,52,9,166,103,237,246,240,128,198,51,244,81,119,68,218,78,227,171,219,81,156,226,229,40,206,243,120,222,219,78,174,89,22,195,236,179,7,227,241,120,25,242,145,8,111,39,65,150,132,252,166,55,10,227,241,151,165,159,242,73,16,183,227,36,15,226,232,54,225,147,73,16,93,244,186,108,47,185,238,143,23,105,22,167,189,36,14,128,41,233,18,105,158,243,104,210,30,45,0,122,148,221,134,65,150,183,137,134,94,20,71,162,63,231,233,69,16,245,186,125,3,166,246,14,11,3,67,64,16,193,228,139,54,209,161,222,109,167,168,226,189,109,49,239,199,151,34,157,134,241,85,143,47,242,120,233,79,227,116,222,134,153,73,111,110,53,26,214,101,59,93,24,97,215,110,101,242,26,231,49,141,195,91,154,185,222,78,87,204,75,157,202,156,176,9,145,76,130,241,228,45,95,164,105,156,186,76,254,110,7,209,52,54,175,224,120,151,118,195,56,14,129,85,169,152,244,167,128,186,157,129,6,244,252,199,136,182,232,212,27,9,160,65,220,42,33,235,109,182,54,75,205,124,10,108,46,90,93,104,85,83,59,202,35,61,108,28,242,210,191,224,185,184,226,55,109,96,52,53,2,167,120,222,35,238,45,31,40,8,204,159,164,113,50,137,175,96,94,227,44,192,9,238,41,25,174,112,183,254,70,123,46,162,133,61,89,146,57,15,64,183,166,211,96,220,206,162,96,58,45,115,227,1,61,19,147,182,234,3,4,95,183,103,130,38,116,175,107,205,104,251,70,205,169,70,118,215,116,248,17,191,28,241,244,118,196,199,95,46,210,120,1,162,164,88,125,49,226,173,71,219,30,254,183,231,249,79,221,141,96,142,58,204,163,188,175,180,0,69,123,145,161,20,74,32,237,81,10,162,232,149,238,122,51,36,75,77,223,131,233,116,186,244,129,159,96,62,128,37,19,14,210,86,67,140,157,20,134,170,130,249,146,244,21,35,185,154,5,185,104,231,98,158,180,147,96,252,5,176,42,238,236,0,115,10,52,61,124,7,200,187,64,242,97,82,90,121,204,104,98,189,7,124,127,178,61,157,178,174,135,52,176,189,238,63,240,130,119,187,93,182,221,237,254,195,237,55,106,150,86,198,93,169,42,179,133,104,64,47,245,4,161,244,43,246,161,232,15,66,26,53,189,5,230,112,220,194,87,89,155,237,138,249,10,50,202,198,100,173,241,130,54,201,177,194,248,246,253,253,253,253,199,48,224,46,220,237,130,199,134,127,232,78,241,161,219,157,178,125,211,105,10,119,79,116,39,4,67,252,145,131,185,228,33,252,84,52,222,214,39,18,216,169,173,81,40,166,121,207,223,51,35,197,49,91,195,111,158,230,36,92,100,109,240,59,240,19,7,152,220,150,116,205,230,244,56,132,113,247,192,86,207,170,76,175,194,96,210,124,246,166,65,10,38,55,158,182,49,146,42,27,123,105,58,141,204,107,29,200,227,164,218,34,109,5,142,109,93,180,33,95,137,21,193,52,34,45,55,220,135,200,167,128,78,195,86,60,66,129,213,32,149,238,129,150,233,39,210,241,208,164,25,25,7,175,197,244,255,143,193,131,25,143,164,102,109,247,17,60,164,201,82,15,182,253,71,79,239,96,200,52,16,225,4,250,134,73,179,215,42,108,253,182,191,131,114,82,21,28,176,212,225,77,50,11,192,154,248,89,2,10,4,84,222,242,40,152,115,50,199,248,136,109,103,12,204,63,90,102,193,164,46,244,219,87,98,244,37,200,219,229,158,59,13,93,151,24,42,20,246,29,194,28,232,127,9,190,24,168,208,99,4,89,91,142,226,137,246,156,58,58,216,233,162,43,153,66,200,100,105,53,61,251,151,185,152,4,156,197,81,120,195,32,244,16,34,98,96,42,89,11,129,210,220,176,222,46,250,33,247,182,9,236,30,130,88,7,198,163,39,43,97,116,215,133,241,120,255,201,10,24,219,123,79,214,132,241,244,233,206,42,24,219,251,8,195,159,199,19,8,252,176,3,243,51,140,111,227,168,93,146,216,122,192,37,132,208,98,169,91,125,48,26,202,77,178,66,46,218,100,135,148,124,239,79,247,27,122,100,160,80,198,69,237,239,47,23,161,207,37,17,171,66,49,43,2,43,247,92,21,128,53,244,163,32,72,153,156,241,44,8,39,238,109,77,188,255,229,139,184,153,166,16,68,103,12,37,244,118,154,198,243,91,8,0,162,12,163,173,30,133,202,173,109,151,165,113,14,17,75,171,235,46,243,248,142,246,221,253,238,68,92,184,48,107,90,3,202,240,119,36,2,221,88,0,42,193,95,217,108,192,67,68,77,161,243,65,71,230,157,56,179,195,198,192,29,99,116,255,34,142,33,115,227,73,144,85,226,246,207,255,181,16,233,13,4,237,144,131,168,27,74,57,74,81,123,35,220,117,179,210,207,213,164,244,126,208,235,102,167,159,87,36,167,247,99,184,39,155,1,167,46,210,108,12,161,46,38,135,219,254,19,200,104,138,103,237,31,130,99,69,226,219,152,244,126,55,178,166,100,23,174,50,8,54,193,46,128,190,89,61,126,244,232,74,57,238,231,21,41,110,35,66,89,93,201,197,117,222,249,204,47,185,124,234,12,167,139,136,52,157,65,4,125,18,191,206,194,22,247,132,151,186,183,188,51,216,217,219,243,132,252,149,210,175,254,37,79,89,230,229,222,120,240,142,231,51,31,196,86,117,247,102,234,73,16,233,39,209,160,53,222,154,185,157,157,126,48,109,141,7,131,153,155,13,242,65,183,47,194,76,220,34,160,209,96,220,158,245,179,43,16,208,89,43,31,68,67,127,239,217,168,211,218,105,195,99,183,7,87,248,186,55,118,111,199,60,19,140,247,178,65,75,180,83,183,51,218,106,137,131,244,217,126,175,235,246,71,169,224,16,77,98,7,129,29,210,54,199,14,59,118,67,138,13,188,45,176,225,209,50,235,12,246,151,169,200,23,105,116,59,235,101,94,214,203,61,200,240,150,75,195,137,143,191,254,146,199,175,143,127,211,156,216,30,12,6,96,233,22,144,4,229,153,31,138,232,34,159,61,124,216,18,3,238,95,120,41,252,28,121,28,126,166,174,102,79,141,57,227,26,115,102,3,176,162,192,162,46,192,206,159,117,123,179,78,238,141,6,121,7,153,172,57,162,6,62,6,242,187,246,120,144,19,192,136,173,217,207,134,15,30,142,234,231,89,149,29,192,141,173,157,159,103,13,173,200,19,96,201,214,35,211,90,230,73,228,93,246,70,100,25,215,146,34,28,248,167,247,111,78,206,143,158,127,124,254,238,120,112,11,67,125,23,64,168,157,129,227,221,245,128,21,234,110,247,113,23,239,126,161,32,52,18,89,6,1,194,222,210,251,244,230,252,228,249,47,199,131,211,219,156,95,244,156,156,143,192,27,79,3,199,155,166,144,4,76,194,155,158,243,59,222,47,189,162,67,6,244,38,118,143,99,122,96,119,9,197,196,238,240,246,240,101,169,153,138,29,118,135,143,244,192,238,50,255,175,60,183,123,188,251,183,147,19,103,121,134,4,191,122,115,248,246,165,33,153,79,96,200,231,139,76,164,88,68,178,95,121,142,45,172,104,193,248,177,231,124,82,247,12,60,18,11,193,220,130,127,134,104,14,178,157,124,22,100,12,124,86,194,47,160,55,6,217,61,7,84,28,218,225,142,143,44,238,104,66,37,238,132,103,217,21,196,31,54,238,35,243,76,98,213,247,63,2,235,88,156,131,15,182,177,189,56,100,29,118,244,175,39,140,158,43,140,48,118,208,169,195,227,163,39,59,251,251,200,6,137,124,243,197,225,38,107,225,213,251,143,175,118,30,189,237,110,51,74,5,167,124,44,92,134,29,0,144,234,177,121,244,22,66,175,199,157,183,39,79,158,118,187,155,86,199,149,148,102,37,89,24,103,81,141,214,227,247,235,145,121,252,126,115,77,44,169,128,251,42,158,143,135,199,135,235,49,132,122,174,139,11,36,187,138,9,164,187,138,7,230,21,224,19,120,108,5,15,149,47,50,166,2,62,214,234,14,224,146,143,0,150,219,103,145,184,160,92,1,184,11,25,106,134,33,86,112,17,241,144,181,82,129,101,59,192,194,218,59,4,11,227,194,152,131,20,1,208,117,167,32,129,12,31,184,147,138,68,240,60,43,203,40,182,48,211,34,201,63,153,9,22,45,230,35,1,232,166,44,15,48,230,195,82,0,245,98,31,95,49,9,16,168,196,74,21,180,140,22,225,40,91,73,76,90,210,108,244,187,138,148,115,144,163,60,78,109,130,94,159,156,28,105,68,186,85,18,245,110,17,230,65,18,6,99,201,41,217,136,179,89,30,29,49,41,21,16,0,102,57,166,104,88,100,203,97,154,71,55,160,102,130,17,252,231,71,111,124,246,233,37,93,48,32,26,96,134,144,147,0,175,5,128,134,73,90,72,60,66,15,212,131,84,130,205,33,98,210,156,98,217,44,94,132,0,85,20,66,132,160,215,180,25,139,60,6,122,65,36,82,144,89,145,6,113,201,112,60,135,230,182,106,102,186,89,50,1,155,48,13,213,4,203,62,56,48,89,31,103,2,228,231,198,154,60,204,236,115,10,217,197,24,72,16,19,24,56,72,101,151,40,214,18,184,166,24,65,247,49,86,80,110,206,169,66,111,81,252,82,183,48,217,162,204,44,112,24,239,81,66,48,43,130,124,79,97,213,157,149,24,65,70,206,94,138,41,135,25,38,65,195,241,100,104,159,233,109,98,48,76,159,94,117,146,35,133,57,121,244,228,201,211,167,122,60,240,154,26,206,122,115,128,206,229,28,252,0,16,82,245,49,76,63,150,195,120,9,28,71,187,145,178,55,71,12,146,57,224,122,134,172,165,174,163,52,254,2,177,45,251,64,85,123,154,21,201,234,27,198,37,249,16,80,204,88,75,92,243,121,18,130,117,157,223,224,123,234,181,49,38,170,79,158,60,90,73,50,185,192,18,201,144,127,6,99,240,55,57,152,225,168,70,57,181,50,211,170,29,15,221,18,243,139,94,153,53,45,56,1,135,146,194,30,60,3,46,103,157,158,228,243,121,48,49,151,72,100,167,71,101,34,120,236,179,99,33,216,199,195,231,47,223,29,18,236,233,34,133,153,131,9,22,57,15,194,213,246,160,62,168,69,50,1,109,187,103,108,178,211,221,67,132,33,37,139,17,140,106,198,172,119,50,159,29,41,81,203,103,96,88,56,41,50,41,59,168,46,164,177,44,86,132,43,201,194,178,68,82,125,131,140,29,245,38,127,173,20,238,42,8,67,84,68,144,93,134,161,134,68,8,134,1,189,59,190,242,21,108,64,31,113,31,23,168,207,215,204,179,205,19,253,178,207,126,159,97,245,133,201,146,223,120,6,145,37,26,9,108,246,72,253,166,11,24,214,151,8,151,4,228,75,232,8,224,185,124,129,6,13,182,79,193,5,46,234,40,166,66,216,250,18,208,16,188,201,25,132,6,86,13,222,232,1,201,111,140,33,20,94,149,20,119,109,180,77,113,27,65,74,86,5,111,6,233,183,224,36,79,120,110,66,40,82,168,90,12,92,132,88,76,182,75,10,32,233,100,191,190,254,111,70,48,192,25,77,68,8,102,7,107,105,114,250,36,255,131,41,187,137,23,52,115,120,177,9,114,27,197,104,67,81,28,121,100,2,190,13,77,112,51,73,43,124,183,52,23,77,129,196,91,105,72,42,129,196,155,104,12,105,15,225,150,212,201,123,12,39,64,150,248,60,94,128,74,169,16,3,237,38,220,73,20,248,6,138,177,82,66,52,53,228,70,108,59,95,116,53,222,131,1,142,93,127,61,7,32,149,109,26,46,178,153,28,254,37,15,75,25,13,137,61,181,179,162,93,197,34,16,87,204,23,243,146,159,13,129,28,90,170,66,229,207,175,176,186,73,47,147,29,80,122,7,79,120,54,107,30,13,204,39,196,133,104,121,130,57,21,74,115,1,115,11,238,63,131,97,86,32,172,233,176,45,163,146,226,143,48,152,7,181,140,74,129,198,14,76,117,248,170,65,218,118,22,59,97,44,168,96,182,38,150,83,223,235,118,87,199,171,37,45,41,5,116,231,249,44,141,243,60,20,120,33,32,236,10,39,43,3,88,166,251,50,171,175,28,204,11,185,10,157,177,25,40,70,82,138,122,201,184,235,55,193,171,25,95,65,6,159,220,119,136,46,159,132,84,143,26,228,23,253,0,143,164,96,211,74,22,107,129,41,178,121,228,74,67,57,230,152,8,84,144,98,212,108,161,101,184,250,10,184,223,197,68,76,25,46,65,1,85,209,163,91,36,208,211,14,152,118,186,221,249,186,241,247,10,238,194,96,113,225,226,50,200,111,214,224,111,169,247,87,115,248,53,68,24,32,81,52,184,172,196,158,58,95,192,219,160,78,208,226,244,148,131,194,167,101,177,234,122,108,206,175,73,80,37,179,182,187,93,120,214,213,122,149,173,22,186,187,248,50,151,194,191,154,21,166,67,195,232,167,60,213,35,64,237,31,195,108,78,132,180,124,100,248,10,141,146,192,68,17,109,148,198,182,187,46,237,50,36,83,22,13,23,202,74,182,249,87,242,217,82,37,117,171,164,250,152,234,150,25,187,154,5,227,153,106,179,82,27,48,215,225,98,2,212,5,74,205,37,12,173,236,56,47,144,56,159,96,248,147,196,17,154,117,180,217,133,1,208,212,55,145,215,172,250,34,194,57,59,231,58,205,57,71,63,119,46,139,114,196,128,98,84,135,212,149,153,174,228,18,153,213,85,14,241,21,80,244,241,215,95,126,255,93,38,169,172,37,93,33,60,218,122,241,226,4,163,250,87,159,78,186,79,158,186,30,147,200,51,11,164,129,102,244,30,145,160,31,99,180,216,132,147,196,167,83,224,161,137,161,48,16,18,115,48,219,144,238,131,212,35,143,50,188,164,181,67,96,52,70,219,24,108,94,129,145,96,1,216,23,98,54,250,104,8,47,190,104,142,221,203,135,85,14,90,76,100,87,116,117,231,96,132,166,193,69,181,78,65,124,154,44,80,160,24,118,99,186,155,100,152,233,66,180,90,169,37,249,111,246,124,60,70,99,120,132,155,7,84,63,14,150,0,61,124,172,32,225,184,169,98,168,6,163,137,178,168,198,164,179,153,230,41,164,14,181,202,161,69,16,81,44,59,41,140,17,176,255,94,226,103,60,171,191,165,115,77,130,25,193,12,91,51,176,46,209,49,77,117,69,54,203,100,88,93,214,98,113,182,32,30,99,8,14,57,254,130,86,170,191,150,44,105,79,26,105,50,37,147,108,29,122,50,220,227,6,179,75,85,21,76,153,240,198,188,255,45,68,129,88,46,162,18,105,175,48,166,97,99,25,13,214,168,123,95,173,68,1,125,72,49,121,69,10,135,36,221,218,132,162,179,33,109,180,216,86,179,159,68,223,153,247,235,199,15,159,142,206,143,79,158,159,28,158,255,235,225,127,28,15,78,29,101,185,28,89,176,131,139,145,169,151,195,77,40,46,5,132,129,206,108,65,125,140,102,195,13,173,10,195,111,201,9,231,139,8,47,3,243,252,28,141,2,2,3,35,164,120,5,13,243,100,1,198,255,92,191,41,200,148,192,133,73,189,225,90,167,219,197,99,10,209,207,60,224,193,249,187,15,47,15,145,232,15,211,41,180,31,135,224,124,228,242,33,220,189,2,111,89,220,81,27,100,107,137,110,209,215,33,237,40,130,171,15,17,0,253,244,242,232,252,232,227,135,147,15,47,62,188,61,255,237,240,227,241,155,15,239,1,193,158,183,127,230,189,60,124,245,252,211,219,147,243,162,143,233,50,216,243,204,186,155,71,139,230,192,238,193,198,54,46,63,57,206,198,32,140,199,196,38,127,22,103,57,38,111,46,173,66,93,137,209,113,140,179,54,136,196,21,251,93,223,181,156,43,92,153,115,182,106,175,109,57,189,39,219,142,219,55,47,250,113,4,50,145,241,11,49,208,107,72,45,0,14,104,53,21,18,83,62,16,62,120,45,222,255,169,229,84,183,199,57,174,159,160,35,142,38,45,231,0,174,134,206,86,190,229,28,116,232,210,93,46,151,4,32,126,45,174,75,56,228,154,141,211,189,118,182,132,159,199,199,36,98,173,237,125,23,110,62,37,160,243,47,192,223,183,220,165,135,203,249,151,226,83,26,22,175,75,162,196,0,169,145,179,250,102,194,228,206,207,158,100,36,200,167,235,67,68,211,114,189,156,186,145,28,64,47,95,130,3,67,1,194,3,125,112,84,45,135,98,31,199,245,248,224,66,228,47,22,105,10,177,235,59,16,179,150,43,167,96,48,16,46,134,36,87,206,187,5,76,190,192,132,70,107,249,155,151,14,118,50,72,212,22,84,3,27,156,58,92,103,73,24,192,204,120,112,169,226,130,172,197,221,63,254,104,229,131,174,235,57,184,170,12,236,6,178,7,3,20,80,84,215,58,70,89,62,64,132,138,123,29,181,125,50,131,217,134,217,133,159,156,126,230,75,175,60,16,155,119,242,93,134,4,147,217,10,3,197,148,42,59,150,158,140,85,40,2,26,156,251,58,172,108,217,243,136,27,89,127,242,113,197,183,117,187,72,195,158,153,46,96,253,92,228,179,120,2,177,223,167,19,199,67,208,189,255,123,252,225,189,47,205,73,48,189,129,247,61,181,99,243,132,12,13,79,84,137,58,142,58,159,51,180,11,202,154,247,108,148,96,157,38,161,160,12,243,19,17,8,15,151,75,119,9,47,202,197,71,30,138,52,135,139,229,210,219,22,187,174,135,86,248,133,220,191,187,106,24,106,8,78,39,187,129,40,25,2,211,91,67,252,135,227,111,165,30,104,146,4,168,105,58,166,98,199,199,248,202,210,4,47,247,184,148,231,96,224,28,228,233,16,164,105,11,175,38,67,199,131,171,205,3,18,85,181,193,91,75,123,118,122,230,176,49,88,239,108,224,216,251,132,29,25,198,15,156,77,144,135,77,167,51,220,244,8,90,71,131,91,5,24,139,173,107,0,205,239,5,58,9,46,53,12,220,127,74,34,235,48,100,159,218,154,1,207,229,206,28,103,184,217,7,52,45,28,123,52,232,246,163,131,70,243,169,150,173,251,209,214,150,228,83,60,104,236,119,26,157,121,217,128,15,6,241,31,127,196,131,193,29,230,246,225,195,141,102,76,150,102,246,105,48,180,159,215,26,14,43,109,169,221,220,106,101,207,28,166,148,167,231,56,46,112,71,50,71,51,23,117,121,32,171,68,142,222,163,143,53,9,24,62,50,27,35,84,244,99,161,200,161,37,6,55,36,57,101,248,29,3,68,38,241,140,103,2,76,246,68,226,113,134,204,217,138,213,52,16,149,67,71,45,131,51,249,16,230,97,216,60,67,146,253,213,81,77,48,0,199,40,101,30,95,138,182,222,150,173,202,115,102,80,250,45,179,165,139,21,155,187,228,171,184,127,35,48,18,34,113,105,26,44,114,58,40,233,75,47,140,249,228,88,228,24,222,101,182,141,2,227,164,118,133,200,95,109,92,138,66,51,74,119,114,27,47,24,152,70,231,248,240,225,79,62,88,63,84,86,212,103,5,29,34,166,178,135,251,48,250,140,240,191,136,155,12,158,224,166,250,67,14,230,195,244,202,165,180,113,112,31,155,15,52,20,233,55,78,229,76,74,117,56,219,116,251,92,9,233,176,251,240,97,75,77,55,110,189,240,121,158,167,45,135,66,14,247,25,247,167,65,8,118,188,181,121,90,104,233,105,126,38,129,248,99,140,37,90,110,143,147,227,194,6,215,93,186,30,120,94,29,207,100,0,189,216,160,67,187,110,229,202,73,214,42,247,171,143,6,198,92,188,201,39,19,249,94,235,22,247,67,244,200,59,163,57,35,178,122,98,137,120,139,238,169,152,98,61,200,160,66,92,245,164,84,71,10,192,46,249,170,226,82,67,250,138,44,203,203,115,233,80,125,176,17,238,18,38,75,248,77,185,217,42,148,141,121,220,29,72,27,97,55,161,149,57,208,122,104,85,42,182,54,90,5,187,130,214,100,63,247,34,45,242,164,117,80,22,112,43,8,101,30,112,47,54,149,33,173,131,74,65,92,106,109,130,56,169,100,93,218,146,225,25,168,55,238,1,134,112,203,237,11,253,97,136,154,13,144,252,218,163,70,33,7,149,75,40,22,173,186,220,150,18,242,211,238,25,200,239,233,246,25,252,216,33,13,67,47,157,241,75,241,171,124,227,133,132,222,28,109,98,242,179,152,36,218,62,2,205,16,95,66,160,14,109,50,162,244,192,148,72,67,248,2,45,101,203,161,207,98,28,185,193,138,108,137,109,65,108,119,126,182,137,239,206,121,98,141,167,8,13,126,2,159,36,3,218,190,54,243,217,123,254,190,21,184,207,32,132,220,232,122,212,1,20,187,140,214,139,32,13,118,123,1,232,115,80,69,174,93,254,159,141,56,66,196,165,184,251,180,230,9,27,105,200,173,88,53,175,198,166,20,153,111,64,23,29,66,196,131,83,12,0,186,253,236,64,155,227,126,6,49,67,124,154,157,13,78,57,252,244,2,252,17,193,143,179,126,17,239,25,255,96,34,62,154,199,123,226,210,166,120,240,182,34,160,189,152,132,107,233,233,105,62,68,222,148,178,32,241,172,85,36,49,237,96,210,38,95,238,52,49,180,161,159,253,69,151,214,30,225,186,189,102,144,77,98,169,67,124,204,17,148,125,175,11,126,53,39,162,148,106,83,39,15,167,229,136,5,195,206,51,198,55,21,57,46,170,134,164,192,211,25,135,131,190,46,206,68,6,9,145,249,118,202,113,213,27,57,13,21,119,170,139,34,149,42,73,6,134,7,88,223,191,63,195,18,238,51,221,53,155,129,13,64,214,200,219,18,51,76,250,51,11,112,124,104,16,18,252,116,247,55,41,160,165,25,211,233,240,156,146,141,78,235,63,39,91,238,127,250,246,175,86,187,229,255,236,186,207,58,90,99,110,231,252,115,156,246,114,52,58,243,32,162,203,157,51,64,1,16,224,114,247,204,75,97,178,16,19,220,237,97,3,40,102,239,148,250,83,79,234,131,77,103,32,76,160,126,226,74,164,117,218,60,19,177,216,196,163,91,15,202,79,114,163,202,220,39,92,195,64,254,94,122,50,181,122,129,161,230,171,56,149,217,85,131,68,160,114,131,20,208,47,110,55,131,78,226,195,141,1,70,97,48,221,99,41,55,109,165,234,70,72,125,245,96,203,97,45,44,0,0,216,128,71,249,150,227,42,211,177,49,200,37,132,16,41,48,0,152,143,178,142,155,233,1,148,40,25,127,77,91,126,90,150,14,234,123,230,161,237,181,31,39,32,119,96,150,185,17,16,124,128,123,92,11,25,81,250,180,212,20,193,152,20,105,20,160,214,72,83,53,175,194,141,121,245,94,90,87,165,56,74,175,208,231,131,242,164,182,114,63,231,23,231,104,37,61,195,42,247,153,3,125,152,198,198,47,33,94,192,50,247,6,100,4,255,33,215,170,99,89,126,156,67,32,76,229,198,40,215,221,125,169,125,154,136,108,1,201,112,122,163,73,229,146,144,96,144,251,160,15,184,98,172,2,85,59,24,86,34,147,251,72,22,76,195,68,92,127,192,200,65,77,157,187,49,104,111,163,85,182,66,97,68,57,13,210,249,21,79,69,27,63,144,118,20,155,29,252,80,26,50,1,112,198,254,40,141,175,32,16,56,71,35,128,233,192,249,34,13,209,104,6,21,209,6,163,154,197,33,196,21,241,133,202,188,205,45,4,23,253,6,105,243,238,153,33,43,159,209,159,52,177,230,196,134,226,95,149,217,184,119,113,242,238,73,151,230,197,51,190,135,143,98,116,53,183,181,34,7,12,23,4,217,227,88,255,194,184,112,145,10,114,165,250,77,243,81,71,18,232,207,35,112,223,125,42,146,56,235,100,193,36,158,117,68,150,224,46,205,243,121,64,59,146,206,161,15,180,135,180,127,160,35,201,107,194,140,21,157,129,168,97,214,150,193,42,186,84,43,134,130,184,75,122,95,10,51,20,207,49,195,145,115,175,19,89,207,249,240,30,43,107,242,61,183,248,132,228,132,234,4,45,136,142,224,54,70,222,86,155,48,3,161,178,175,182,199,230,19,0,245,220,79,117,15,255,194,92,141,176,192,103,182,200,223,221,179,95,29,69,81,171,198,145,200,143,50,48,73,205,127,163,128,196,219,238,118,127,230,126,230,42,135,122,132,38,93,92,189,64,112,248,185,206,207,185,63,163,62,16,45,171,223,161,10,189,139,10,183,142,185,176,189,212,208,182,118,168,251,102,131,186,219,105,149,158,235,173,234,43,122,87,135,100,45,180,173,24,83,160,40,44,106,248,146,194,104,96,63,251,25,191,153,237,84,40,41,182,201,215,240,202,69,128,102,140,17,106,126,157,131,181,122,89,78,149,83,192,11,83,10,151,124,176,215,149,97,67,237,195,88,12,54,192,199,91,159,63,19,196,158,51,3,105,161,170,169,71,5,235,127,120,84,60,253,135,75,85,59,252,80,237,88,23,226,27,51,1,170,130,131,3,177,202,245,72,64,80,207,0,202,159,191,149,98,187,242,183,115,210,118,100,9,143,8,136,52,40,199,180,71,85,211,226,16,109,240,228,107,137,235,222,75,156,98,86,19,113,146,238,70,226,226,196,162,141,76,95,233,203,122,227,233,208,64,151,235,59,165,3,27,28,93,254,104,8,242,18,16,132,86,205,120,108,116,49,7,144,67,6,214,231,141,65,26,126,18,240,239,109,13,40,158,78,65,210,0,20,126,246,7,166,32,239,180,182,127,214,141,244,9,37,214,54,2,249,197,11,137,10,105,46,120,199,6,157,14,92,187,58,222,186,5,193,35,67,217,215,82,104,127,107,142,17,108,140,59,113,193,199,21,67,228,104,229,97,102,114,31,55,36,19,29,32,219,75,213,119,145,180,202,254,96,99,91,55,129,215,88,217,134,115,91,70,241,240,97,21,1,105,138,84,62,199,104,161,124,154,242,171,182,28,23,78,9,173,202,215,67,172,219,37,240,91,78,197,40,190,6,27,174,153,88,42,119,233,135,1,200,82,79,207,91,17,93,201,156,82,156,150,223,165,189,138,238,25,56,63,155,187,66,19,109,78,225,200,27,69,166,52,35,170,111,175,28,247,169,167,14,37,254,146,17,84,241,95,5,210,90,59,88,27,164,214,191,42,52,76,248,72,156,33,72,81,27,144,128,237,90,73,159,217,70,7,82,149,146,158,183,52,232,146,122,181,41,143,106,36,187,4,171,81,49,117,178,131,141,248,221,40,60,130,87,29,2,5,70,241,1,30,201,161,42,52,200,27,239,158,97,216,1,153,51,11,148,53,88,89,234,89,85,166,113,0,181,227,234,209,170,28,115,93,86,98,174,25,96,168,171,44,7,199,112,16,148,186,57,221,51,253,10,155,103,154,106,105,177,63,130,144,87,246,191,131,105,126,115,253,220,107,48,107,38,5,206,83,147,156,35,100,179,38,194,7,221,62,63,120,218,231,91,91,174,201,136,139,116,89,115,112,243,32,12,134,7,92,157,61,244,64,173,32,80,103,147,148,115,90,152,64,255,118,208,225,16,198,194,27,14,101,230,77,67,40,225,1,230,51,94,158,123,149,8,148,116,13,223,169,104,69,65,129,35,203,216,181,217,66,163,229,85,130,3,170,15,156,121,246,35,233,33,32,130,244,204,98,239,102,221,54,153,165,72,93,250,183,23,34,239,93,61,212,139,135,208,190,180,107,223,165,37,102,179,254,0,13,96,11,82,220,123,214,3,251,157,197,105,254,10,107,213,61,250,188,208,241,226,72,10,205,243,201,164,87,78,98,114,95,206,9,229,227,111,240,140,16,249,0,220,186,132,247,138,18,175,94,3,191,77,201,225,255,181,186,215,167,188,61,125,222,126,213,109,63,61,187,221,246,30,45,255,56,85,151,123,75,247,167,142,251,172,101,16,64,170,212,61,192,212,85,28,12,246,247,246,118,247,158,181,74,229,168,214,198,182,139,206,180,87,121,44,215,157,71,184,7,139,54,240,226,226,144,222,198,213,189,238,226,89,45,184,59,171,123,253,10,254,113,112,50,221,31,1,163,204,125,115,133,137,162,185,81,201,234,230,193,194,172,205,69,252,146,193,255,237,156,143,50,135,5,147,129,67,123,121,79,240,118,184,233,69,3,173,217,125,245,189,102,99,241,88,174,249,153,164,112,115,43,66,189,41,116,107,19,183,42,240,11,92,147,43,45,104,2,86,84,47,225,235,77,57,182,158,33,114,7,235,175,18,184,5,174,86,76,110,128,250,233,229,145,1,165,23,213,22,97,195,98,43,2,83,53,203,210,136,25,238,162,185,119,208,21,64,16,229,225,55,98,96,123,37,15,136,163,197,232,37,124,167,248,148,180,113,245,12,82,7,172,99,140,48,197,131,247,116,113,170,132,172,56,202,10,87,131,57,14,15,23,46,29,143,23,203,175,208,135,214,218,12,114,184,180,25,173,150,63,33,140,194,29,79,15,31,182,120,101,68,197,225,39,138,195,120,217,70,85,149,112,241,150,38,154,22,77,33,193,231,102,5,21,236,97,227,22,127,252,246,217,199,171,103,85,100,214,162,55,50,173,241,237,21,203,225,247,44,55,235,133,230,97,211,218,50,226,138,210,233,206,35,189,204,220,140,184,97,193,89,57,137,8,63,109,112,88,103,200,232,74,179,245,30,154,86,19,19,230,248,197,235,183,82,35,191,151,37,114,74,95,208,26,178,228,84,53,110,142,53,83,35,5,65,154,13,83,232,177,150,170,152,189,182,204,86,174,86,178,185,252,118,82,128,216,87,119,188,53,175,65,161,248,72,175,53,164,12,243,160,163,239,150,90,184,36,106,240,194,214,254,191,239,34,220,86,144,98,115,219,15,160,15,239,239,219,80,107,40,191,75,21,238,3,242,39,105,133,66,91,69,38,185,118,47,77,171,69,52,79,33,178,65,1,149,91,169,191,91,97,212,142,251,31,79,232,148,135,153,164,244,165,68,81,85,162,242,102,21,10,97,154,183,1,85,37,13,119,2,217,182,18,92,9,95,74,87,167,159,105,199,183,142,131,169,249,67,233,241,234,105,68,214,166,115,140,152,117,156,145,21,66,171,133,39,155,138,210,53,37,104,122,213,175,216,188,24,184,213,150,108,49,154,7,121,171,86,231,108,74,59,26,86,134,253,25,207,42,105,133,91,95,103,198,28,88,31,43,34,183,42,218,20,136,52,224,33,132,60,207,211,148,223,180,112,140,147,197,88,84,22,73,165,95,21,167,178,52,127,102,22,119,158,209,91,144,127,203,183,57,238,64,73,22,217,204,4,157,61,243,206,224,148,123,234,233,153,245,84,61,242,196,210,187,93,226,74,127,177,197,100,112,78,139,114,148,64,235,192,76,75,10,243,117,85,167,41,113,248,9,183,219,84,22,115,113,73,209,7,193,195,137,184,173,219,224,222,233,217,210,203,173,202,249,15,92,181,205,49,250,183,246,68,106,208,82,198,168,114,3,191,49,165,197,149,75,157,180,212,50,91,212,148,102,153,81,176,155,166,190,41,43,90,41,238,43,73,177,78,119,91,185,42,6,221,14,2,90,192,104,174,241,89,203,29,244,241,63,173,109,4,23,152,103,230,113,140,254,175,117,155,132,224,186,241,40,25,200,115,226,4,2,46,60,56,172,146,245,153,208,202,145,155,35,121,16,65,58,35,243,204,37,166,156,42,227,150,185,171,174,235,60,80,31,197,148,138,48,141,107,145,110,105,203,88,171,33,81,199,28,186,56,252,5,19,131,34,71,24,97,241,90,30,154,169,206,138,0,123,108,153,38,67,113,249,177,122,69,158,97,10,77,106,7,157,180,151,242,198,169,244,85,59,199,203,62,109,28,135,33,79,50,243,152,167,23,120,60,180,62,199,211,52,15,15,176,206,106,60,127,218,198,67,223,156,161,92,252,192,1,4,23,36,213,48,76,232,55,100,165,238,52,135,0,142,14,82,250,254,102,179,135,143,65,226,82,30,35,157,59,170,79,169,238,56,229,131,173,185,114,47,101,246,202,1,178,250,128,107,169,28,182,195,47,58,89,217,202,153,140,226,151,57,43,21,164,204,214,170,38,15,181,212,152,132,170,2,154,234,98,50,121,164,203,225,221,251,29,169,96,78,42,37,89,56,44,151,234,13,255,10,100,26,154,41,226,88,216,233,36,28,167,218,163,89,142,204,251,12,140,173,37,130,184,18,219,6,175,147,196,201,34,209,17,10,61,20,215,64,203,68,76,116,52,48,148,71,251,148,166,126,204,83,58,79,218,162,187,152,149,210,121,186,213,73,33,218,219,242,220,189,181,102,166,244,130,158,158,231,242,182,196,48,57,190,76,36,60,229,120,154,137,33,39,184,12,164,46,214,231,145,74,205,170,136,173,138,1,182,121,89,131,60,221,93,17,70,38,136,62,206,83,70,104,133,0,25,148,235,98,104,155,197,113,133,73,194,103,175,212,227,21,120,112,41,171,182,169,186,17,141,236,217,174,42,194,47,244,184,128,142,21,5,251,74,238,29,150,63,65,7,87,152,72,226,172,41,57,216,125,240,179,133,170,226,183,179,121,123,215,68,243,148,211,155,186,154,140,127,43,27,150,134,47,213,247,21,147,178,152,90,91,158,10,89,85,1,173,74,153,10,112,8,156,220,22,126,205,44,0,231,33,125,72,49,91,140,240,51,138,161,201,115,26,109,21,146,252,168,60,16,123,87,18,161,41,125,242,33,185,79,99,27,143,115,47,189,24,93,225,143,115,188,153,46,242,238,147,167,101,6,168,143,82,156,33,85,81,205,40,86,167,80,250,133,63,33,85,42,215,90,239,219,153,190,13,154,40,87,116,6,102,73,110,200,182,191,43,9,250,58,10,118,0,223,206,95,136,15,100,151,237,254,133,248,64,240,216,186,85,24,86,18,203,66,8,141,204,125,55,53,123,64,205,222,223,134,154,125,160,102,255,111,67,205,99,160,230,241,223,134,154,39,64,205,147,191,80,78,187,128,239,121,24,150,107,10,165,159,205,70,213,50,131,84,252,26,126,132,244,29,124,31,166,110,77,150,208,138,153,86,124,192,162,14,49,169,133,78,229,48,189,57,144,82,244,12,49,143,40,188,201,29,193,145,10,138,87,70,72,100,174,229,192,48,142,177,57,134,110,193,142,252,96,232,191,254,242,123,41,236,177,187,131,243,40,247,126,241,226,100,101,103,229,109,76,156,100,44,126,25,219,214,61,48,106,47,172,236,108,4,215,234,47,143,4,96,29,246,203,147,59,223,123,186,93,127,239,233,54,190,183,83,141,77,238,18,170,85,209,198,246,206,29,190,187,80,189,146,151,134,223,133,167,94,23,199,108,111,248,122,1,98,3,191,191,150,198,253,74,174,87,108,28,89,217,160,118,148,52,167,111,245,237,79,133,200,170,95,53,86,174,32,121,53,187,202,241,204,87,112,233,216,108,162,251,102,102,73,123,165,51,99,218,185,194,172,61,43,172,182,91,79,146,46,123,226,137,205,104,177,202,207,248,53,196,51,221,202,83,29,231,192,243,111,227,147,146,38,139,87,158,145,249,175,96,25,109,54,98,39,197,86,189,111,230,156,245,180,246,7,60,214,102,172,189,103,240,207,225,236,215,169,55,240,162,216,105,248,77,172,33,48,235,13,94,110,92,252,209,195,254,42,97,160,141,70,223,49,208,194,93,85,254,158,145,74,233,237,112,192,236,239,98,165,141,188,6,143,197,159,242,186,181,242,187,245,4,65,90,244,102,221,97,242,16,255,149,150,185,200,159,130,187,11,112,245,152,203,222,52,38,193,171,39,180,75,224,156,180,193,25,254,142,191,10,199,46,157,15,49,119,93,140,152,147,222,133,44,162,141,216,50,40,120,143,215,21,108,107,143,76,110,218,190,11,85,194,131,244,254,250,213,34,83,245,171,35,232,254,141,196,168,239,134,239,160,101,17,173,67,141,253,245,48,251,68,175,84,39,3,35,129,4,126,39,119,203,241,215,200,151,146,39,235,149,234,95,116,185,167,220,91,141,62,241,90,29,80,117,215,244,224,78,210,120,145,41,97,40,185,240,38,230,16,61,77,37,89,251,69,42,199,59,42,132,85,177,193,247,147,206,232,51,227,105,112,93,147,102,113,157,175,75,191,22,181,74,240,108,27,41,141,165,226,13,10,45,252,1,102,227,175,75,39,112,18,238,174,174,222,147,64,176,242,110,191,114,28,252,109,76,89,85,143,250,31,144,127,185,120,157,8,49,57,87,195,251,145,26,112,140,128,127,160,10,220,65,61,241,231,175,144,254,90,26,132,111,83,73,176,113,169,208,18,10,30,210,66,187,94,43,152,4,60,140,47,106,102,146,135,237,213,45,141,69,94,217,180,214,154,152,220,165,44,185,8,121,201,60,48,239,59,195,135,116,44,85,191,96,203,108,167,140,65,77,170,90,58,101,114,167,48,134,64,59,205,74,160,55,4,220,27,20,49,59,48,194,229,219,6,126,202,101,221,225,65,78,167,229,21,27,24,144,162,131,92,254,205,157,60,197,75,83,174,126,121,208,129,59,124,130,39,120,31,197,105,110,30,28,165,49,214,82,66,166,190,243,51,13,197,210,90,213,199,87,254,62,162,172,43,84,118,102,175,237,231,101,86,141,248,240,248,13,188,146,3,160,191,7,213,48,120,189,91,27,187,202,191,44,212,161,177,195,111,228,203,125,201,164,153,157,225,195,104,148,37,253,138,228,86,86,37,254,249,68,182,88,111,92,75,86,235,92,90,39,162,39,193,149,43,105,180,251,219,230,108,165,190,39,247,38,172,10,39,205,126,161,99,217,237,107,39,217,148,156,240,240,37,70,63,219,87,60,165,175,42,229,29,253,125,46,181,213,167,244,45,194,90,83,81,123,77,125,252,208,48,29,143,134,39,178,35,83,103,149,177,22,157,70,139,155,141,245,201,229,46,204,202,35,75,24,43,135,154,173,26,100,177,154,88,93,188,251,231,147,223,218,106,228,87,153,220,6,57,112,48,126,127,169,190,243,101,154,127,108,20,68,60,13,240,252,83,121,60,188,96,166,42,104,253,41,48,253,145,235,253,159,183,130,179,8,242,215,139,17,211,15,24,126,7,134,198,207,103,197,90,46,103,145,245,57,245,8,210,68,220,117,66,135,53,202,207,168,157,218,186,175,163,254,142,164,79,57,8,252,55,26,190,227,95,4,203,22,169,60,154,150,70,114,163,143,14,95,36,56,78,58,40,148,83,182,150,208,9,154,8,16,122,164,140,254,18,201,6,76,195,208,240,88,30,152,28,68,216,153,231,193,136,14,11,86,71,15,141,233,172,83,181,95,136,209,39,177,62,123,51,149,71,29,207,104,71,77,230,193,152,229,161,142,68,14,253,169,19,2,249,233,248,23,73,181,156,191,146,213,232,232,153,112,152,220,76,133,103,131,100,96,40,68,52,150,194,37,119,192,242,52,39,147,208,70,169,170,216,150,105,16,154,58,9,93,35,127,180,65,75,154,237,144,42,43,220,109,149,42,102,168,38,120,242,207,62,126,93,148,186,66,47,94,160,206,88,73,231,29,182,206,222,84,240,207,173,254,235,106,61,114,164,250,81,188,126,111,150,146,81,86,135,136,20,209,143,109,128,171,39,69,84,185,93,254,162,222,33,128,111,233,89,29,158,46,228,201,130,213,221,144,244,78,2,185,230,99,64,213,23,160,204,193,19,146,171,112,133,145,160,60,165,193,224,144,175,125,148,118,135,189,36,254,173,7,202,252,49,136,115,158,175,0,247,62,166,189,39,10,94,146,138,187,224,169,169,161,99,56,41,186,40,98,204,74,119,252,176,118,32,79,100,176,222,199,77,180,120,20,131,51,252,45,0,59,9,130,38,141,106,121,103,87,35,84,100,114,249,216,135,194,232,151,183,182,220,31,77,252,79,43,121,243,14,154,255,197,202,126,127,24,122,48,219,53,26,100,255,137,88,189,111,136,89,113,237,110,177,128,215,177,182,230,169,217,46,34,81,159,246,223,86,103,42,73,3,105,39,106,128,203,50,182,146,160,143,160,200,120,228,127,153,162,178,115,43,200,250,42,231,150,220,235,223,84,12,240,61,158,45,105,12,178,255,70,226,223,180,81,239,127,177,240,175,240,116,114,51,164,217,127,120,191,195,43,138,118,229,63,54,92,94,158,104,174,148,147,8,204,153,245,213,121,165,188,164,254,46,153,148,110,158,222,177,74,240,141,8,168,218,84,58,27,17,196,2,30,209,177,243,76,110,78,111,170,189,255,109,164,179,163,138,17,232,163,134,255,31,42,221,98,66,145,135,0,0}; \ No newline at end of file diff --git a/web/src/css/style.css b/web/src/css/style.css index fd39d9f0..591a55ee 100644 --- a/web/src/css/style.css +++ b/web/src/css/style.css @@ -16,6 +16,7 @@ label:not(.error) .error-info { display: none; } #content .dropdown-menu li { display: block; } #traffic-sniff { display: none; } #sniffed-traffic { max-height: 50em; overflow-y: auto; } +.dropdown label { display: inline-block; } .navbar { background-color: rgba(41,41,45,.9) !important; border-radius: 0 } .navbar-brand, .navbar-brand:hover { color: white; } .btn-secondary { diff --git a/web/src/index.html b/web/src/index.html index 472178a2..fd388731 100644 --- a/web/src/index.html +++ b/web/src/index.html @@ -113,9 +113,9 @@
- + -
+ +
@@ -171,7 +200,7 @@
Saturation
-
+
Color Temperature
diff --git a/web/src/js/script.js b/web/src/js/script.js index ce1bcf03..33476d96 100644 --- a/web/src/js/script.js +++ b/web/src/js/script.js @@ -288,7 +288,7 @@ var activeUrl = function() { } var getCurrentMode = function() { - return $('input[name="mode"]:checked').data('value'); + return $('#mode li.active').data('value'); }; var updateGroup = _.throttle( @@ -476,7 +476,10 @@ var deviceIdError = function(v) { }; var updateModeOptions = function() { - var currentMode = getCurrentMode(); + var currentMode = getCurrentMode() + , modeLabel = $('#mode li[data-value="' + currentMode + '"] a').html(); + + $('label', $('#mode').closest('.dropdown')).html(modeLabel); $('.mode-option').map(function() { if ($(this).data('for').split(',').includes(currentMode)) { @@ -720,7 +723,14 @@ $(function() { $('#gateway-server-configs').append(gatewayServerRow('', '')); }); - $('#mode').change(updateModeOptions); + $('#mode li').click(function(e) { + e.preventDefault(); + + $('li', $(this).parent()).removeClass('active'); + $(this).addClass('active'); + + updateModeOptions.bind(this)(); + }); $('body').on('click', '.remove-gateway-server', function() { $(this).closest('tr').remove(); From 34e10e9c621f0733cace42d347f92fbe833fe213 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Wed, 23 May 2018 19:24:51 -0700 Subject: [PATCH 06/23] make groups visible for FUT091 --- web/src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/index.html b/web/src/index.html index fd388731..da870181 100644 --- a/web/src/index.html +++ b/web/src/index.html @@ -77,7 +77,7 @@
-
+
From b780999d426b78a2c748d421ec3aee07dc538c93 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Thu, 24 May 2018 13:16:25 -0700 Subject: [PATCH 07/23] Add generated webpage --- dist/index.html.gz.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.html.gz.h b/dist/index.html.gz.h index df93941f..5a0d10cc 100644 --- a/dist/index.html.gz.h +++ b/dist/index.html.gz.h @@ -1,2 +1,2 @@ -#define index_html_gz_len 9620 -static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,221,125,107,91,219,72,147,232,247,243,43,26,101,222,96,13,178,108,32,144,196,198,206,102,18,50,201,217,92,216,64,102,118,31,150,195,211,182,219,88,137,44,105,37,153,203,50,254,239,167,170,250,162,214,197,224,92,102,118,246,157,11,72,234,86,85,117,117,221,187,213,28,108,76,226,113,126,147,8,54,203,231,225,240,0,127,178,144,71,23,3,71,68,14,220,11,62,25,30,204,69,206,217,120,198,211,76,228,3,103,145,79,219,79,160,45,15,242,80,12,223,5,111,131,139,89,206,94,47,70,7,29,249,232,32,12,162,47,44,21,225,192,201,242,155,80,100,51,33,114,135,205,82,49,29,56,179,60,79,178,94,167,51,231,215,227,73,228,143,226,56,207,242,148,39,120,51,142,231,29,243,160,179,235,239,250,143,59,227,44,43,158,249,243,0,122,101,153,163,112,148,65,94,4,57,66,129,95,179,197,200,15,226,226,189,118,30,95,92,132,162,179,227,195,191,101,144,170,201,64,174,209,221,136,10,240,124,206,252,113,24,47,38,211,144,167,130,72,231,159,249,117,39,12,70,54,244,44,12,38,34,237,60,245,31,251,221,10,98,217,244,99,17,103,34,20,227,60,248,111,225,127,206,58,93,127,123,199,127,68,88,139,231,6,255,238,159,54,100,194,213,217,46,176,87,219,238,194,76,178,22,241,185,24,56,151,129,184,74,226,20,68,103,28,71,185,136,64,246,174,130,73,62,27,76,196,101,48,22,109,186,241,130,40,200,3,30,182,179,49,15,197,96,27,64,108,180,219,167,193,148,133,57,123,115,200,158,158,13,255,15,131,127,14,178,113,26,36,57,203,210,241,218,99,66,109,216,203,102,193,37,200,226,99,127,183,184,7,238,2,158,142,4,137,240,15,54,78,69,52,9,166,103,237,246,240,128,198,51,244,81,119,68,218,78,227,171,219,81,156,226,229,40,206,243,120,222,219,78,174,89,22,195,236,179,7,227,241,120,25,242,145,8,111,39,65,150,132,252,166,55,10,227,241,151,165,159,242,73,16,183,227,36,15,226,232,54,225,147,73,16,93,244,186,108,47,185,238,143,23,105,22,167,189,36,14,128,41,233,18,105,158,243,104,210,30,45,0,122,148,221,134,65,150,183,137,134,94,20,71,162,63,231,233,69,16,245,186,125,3,166,246,14,11,3,67,64,16,193,228,139,54,209,161,222,109,167,168,226,189,109,49,239,199,151,34,157,134,241,85,143,47,242,120,233,79,227,116,222,134,153,73,111,110,53,26,214,101,59,93,24,97,215,110,101,242,26,231,49,141,195,91,154,185,222,78,87,204,75,157,202,156,176,9,145,76,130,241,228,45,95,164,105,156,186,76,254,110,7,209,52,54,175,224,120,151,118,195,56,14,129,85,169,152,244,167,128,186,157,129,6,244,252,199,136,182,232,212,27,9,160,65,220,42,33,235,109,182,54,75,205,124,10,108,46,90,93,104,85,83,59,202,35,61,108,28,242,210,191,224,185,184,226,55,109,96,52,53,2,167,120,222,35,238,45,31,40,8,204,159,164,113,50,137,175,96,94,227,44,192,9,238,41,25,174,112,183,254,70,123,46,162,133,61,89,146,57,15,64,183,166,211,96,220,206,162,96,58,45,115,227,1,61,19,147,182,234,3,4,95,183,103,130,38,116,175,107,205,104,251,70,205,169,70,118,215,116,248,17,191,28,241,244,118,196,199,95,46,210,120,1,162,164,88,125,49,226,173,71,219,30,254,183,231,249,79,221,141,96,142,58,204,163,188,175,180,0,69,123,145,161,20,74,32,237,81,10,162,232,149,238,122,51,36,75,77,223,131,233,116,186,244,129,159,96,62,128,37,19,14,210,86,67,140,157,20,134,170,130,249,146,244,21,35,185,154,5,185,104,231,98,158,180,147,96,252,5,176,42,238,236,0,115,10,52,61,124,7,200,187,64,242,97,82,90,121,204,104,98,189,7,124,127,178,61,157,178,174,135,52,176,189,238,63,240,130,119,187,93,182,221,237,254,195,237,55,106,150,86,198,93,169,42,179,133,104,64,47,245,4,161,244,43,246,161,232,15,66,26,53,189,5,230,112,220,194,87,89,155,237,138,249,10,50,202,198,100,173,241,130,54,201,177,194,248,246,253,253,253,253,199,48,224,46,220,237,130,199,134,127,232,78,241,161,219,157,178,125,211,105,10,119,79,116,39,4,67,252,145,131,185,228,33,252,84,52,222,214,39,18,216,169,173,81,40,166,121,207,223,51,35,197,49,91,195,111,158,230,36,92,100,109,240,59,240,19,7,152,220,150,116,205,230,244,56,132,113,247,192,86,207,170,76,175,194,96,210,124,246,166,65,10,38,55,158,182,49,146,42,27,123,105,58,141,204,107,29,200,227,164,218,34,109,5,142,109,93,180,33,95,137,21,193,52,34,45,55,220,135,200,167,128,78,195,86,60,66,129,213,32,149,238,129,150,233,39,210,241,208,164,25,25,7,175,197,244,255,143,193,131,25,143,164,102,109,247,17,60,164,201,82,15,182,253,71,79,239,96,200,52,16,225,4,250,134,73,179,215,42,108,253,182,191,131,114,82,21,28,176,212,225,77,50,11,192,154,248,89,2,10,4,84,222,242,40,152,115,50,199,248,136,109,103,12,204,63,90,102,193,164,46,244,219,87,98,244,37,200,219,229,158,59,13,93,151,24,42,20,246,29,194,28,232,127,9,190,24,168,208,99,4,89,91,142,226,137,246,156,58,58,216,233,162,43,153,66,200,100,105,53,61,251,151,185,152,4,156,197,81,120,195,32,244,16,34,98,96,42,89,11,129,210,220,176,222,46,250,33,247,182,9,236,30,130,88,7,198,163,39,43,97,116,215,133,241,120,255,201,10,24,219,123,79,214,132,241,244,233,206,42,24,219,251,8,195,159,199,19,8,252,176,3,243,51,140,111,227,168,93,146,216,122,192,37,132,208,98,169,91,125,48,26,202,77,178,66,46,218,100,135,148,124,239,79,247,27,122,100,160,80,198,69,237,239,47,23,161,207,37,17,171,66,49,43,2,43,247,92,21,128,53,244,163,32,72,153,156,241,44,8,39,238,109,77,188,255,229,139,184,153,166,16,68,103,12,37,244,118,154,198,243,91,8,0,162,12,163,173,30,133,202,173,109,151,165,113,14,17,75,171,235,46,243,248,142,246,221,253,238,68,92,184,48,107,90,3,202,240,119,36,2,221,88,0,42,193,95,217,108,192,67,68,77,161,243,65,71,230,157,56,179,195,198,192,29,99,116,255,34,142,33,115,227,73,144,85,226,246,207,255,181,16,233,13,4,237,144,131,168,27,74,57,74,81,123,35,220,117,179,210,207,213,164,244,126,208,235,102,167,159,87,36,167,247,99,184,39,155,1,167,46,210,108,12,161,46,38,135,219,254,19,200,104,138,103,237,31,130,99,69,226,219,152,244,126,55,178,166,100,23,174,50,8,54,193,46,128,190,89,61,126,244,232,74,57,238,231,21,41,110,35,66,89,93,201,197,117,222,249,204,47,185,124,234,12,167,139,136,52,157,65,4,125,18,191,206,194,22,247,132,151,186,183,188,51,216,217,219,243,132,252,149,210,175,254,37,79,89,230,229,222,120,240,142,231,51,31,196,86,117,247,102,234,73,16,233,39,209,160,53,222,154,185,157,157,126,48,109,141,7,131,153,155,13,242,65,183,47,194,76,220,34,160,209,96,220,158,245,179,43,16,208,89,43,31,68,67,127,239,217,168,211,218,105,195,99,183,7,87,248,186,55,118,111,199,60,19,140,247,178,65,75,180,83,183,51,218,106,137,131,244,217,126,175,235,246,71,169,224,16,77,98,7,129,29,210,54,199,14,59,118,67,138,13,188,45,176,225,209,50,235,12,246,151,169,200,23,105,116,59,235,101,94,214,203,61,200,240,150,75,195,137,143,191,254,146,199,175,143,127,211,156,216,30,12,6,96,233,22,144,4,229,153,31,138,232,34,159,61,124,216,18,3,238,95,120,41,252,28,121,28,126,166,174,102,79,141,57,227,26,115,102,3,176,162,192,162,46,192,206,159,117,123,179,78,238,141,6,121,7,153,172,57,162,6,62,6,242,187,246,120,144,19,192,136,173,217,207,134,15,30,142,234,231,89,149,29,192,141,173,157,159,103,13,173,200,19,96,201,214,35,211,90,230,73,228,93,246,70,100,25,215,146,34,28,248,167,247,111,78,206,143,158,127,124,254,238,120,112,11,67,125,23,64,168,157,129,227,221,245,128,21,234,110,247,113,23,239,126,161,32,52,18,89,6,1,194,222,210,251,244,230,252,228,249,47,199,131,211,219,156,95,244,156,156,143,192,27,79,3,199,155,166,144,4,76,194,155,158,243,59,222,47,189,162,67,6,244,38,118,143,99,122,96,119,9,197,196,238,240,246,240,101,169,153,138,29,118,135,143,244,192,238,50,255,175,60,183,123,188,251,183,147,19,103,121,134,4,191,122,115,248,246,165,33,153,79,96,200,231,139,76,164,88,68,178,95,121,142,45,172,104,193,248,177,231,124,82,247,12,60,18,11,193,220,130,127,134,104,14,178,157,124,22,100,12,124,86,194,47,160,55,6,217,61,7,84,28,218,225,142,143,44,238,104,66,37,238,132,103,217,21,196,31,54,238,35,243,76,98,213,247,63,2,235,88,156,131,15,182,177,189,56,100,29,118,244,175,39,140,158,43,140,48,118,208,169,195,227,163,39,59,251,251,200,6,137,124,243,197,225,38,107,225,213,251,143,175,118,30,189,237,110,51,74,5,167,124,44,92,134,29,0,144,234,177,121,244,22,66,175,199,157,183,39,79,158,118,187,155,86,199,149,148,102,37,89,24,103,81,141,214,227,247,235,145,121,252,126,115,77,44,169,128,251,42,158,143,135,199,135,235,49,132,122,174,139,11,36,187,138,9,164,187,138,7,230,21,224,19,120,108,5,15,149,47,50,166,2,62,214,234,14,224,146,143,0,150,219,103,145,184,160,92,1,184,11,25,106,134,33,86,112,17,241,144,181,82,129,101,59,192,194,218,59,4,11,227,194,152,131,20,1,208,117,167,32,129,12,31,184,147,138,68,240,60,43,203,40,182,48,211,34,201,63,153,9,22,45,230,35,1,232,166,44,15,48,230,195,82,0,245,98,31,95,49,9,16,168,196,74,21,180,140,22,225,40,91,73,76,90,210,108,244,187,138,148,115,144,163,60,78,109,130,94,159,156,28,105,68,186,85,18,245,110,17,230,65,18,6,99,201,41,217,136,179,89,30,29,49,41,21,16,0,102,57,166,104,88,100,203,97,154,71,55,160,102,130,17,252,231,71,111,124,246,233,37,93,48,32,26,96,134,144,147,0,175,5,128,134,73,90,72,60,66,15,212,131,84,130,205,33,98,210,156,98,217,44,94,132,0,85,20,66,132,160,215,180,25,139,60,6,122,65,36,82,144,89,145,6,113,201,112,60,135,230,182,106,102,186,89,50,1,155,48,13,213,4,203,62,56,48,89,31,103,2,228,231,198,154,60,204,236,115,10,217,197,24,72,16,19,24,56,72,101,151,40,214,18,184,166,24,65,247,49,86,80,110,206,169,66,111,81,252,82,183,48,217,162,204,44,112,24,239,81,66,48,43,130,124,79,97,213,157,149,24,65,70,206,94,138,41,135,25,38,65,195,241,100,104,159,233,109,98,48,76,159,94,117,146,35,133,57,121,244,228,201,211,167,122,60,240,154,26,206,122,115,128,206,229,28,252,0,16,82,245,49,76,63,150,195,120,9,28,71,187,145,178,55,71,12,146,57,224,122,134,172,165,174,163,52,254,2,177,45,251,64,85,123,154,21,201,234,27,198,37,249,16,80,204,88,75,92,243,121,18,130,117,157,223,224,123,234,181,49,38,170,79,158,60,90,73,50,185,192,18,201,144,127,6,99,240,55,57,152,225,168,70,57,181,50,211,170,29,15,221,18,243,139,94,153,53,45,56,1,135,146,194,30,60,3,46,103,157,158,228,243,121,48,49,151,72,100,167,71,101,34,120,236,179,99,33,216,199,195,231,47,223,29,18,236,233,34,133,153,131,9,22,57,15,194,213,246,160,62,168,69,50,1,109,187,103,108,178,211,221,67,132,33,37,139,17,140,106,198,172,119,50,159,29,41,81,203,103,96,88,56,41,50,41,59,168,46,164,177,44,86,132,43,201,194,178,68,82,125,131,140,29,245,38,127,173,20,238,42,8,67,84,68,144,93,134,161,134,68,8,134,1,189,59,190,242,21,108,64,31,113,31,23,168,207,215,204,179,205,19,253,178,207,126,159,97,245,133,201,146,223,120,6,145,37,26,9,108,246,72,253,166,11,24,214,151,8,151,4,228,75,232,8,224,185,124,129,6,13,182,79,193,5,46,234,40,166,66,216,250,18,208,16,188,201,25,132,6,86,13,222,232,1,201,111,140,33,20,94,149,20,119,109,180,77,113,27,65,74,86,5,111,6,233,183,224,36,79,120,110,66,40,82,168,90,12,92,132,88,76,182,75,10,32,233,100,191,190,254,111,70,48,192,25,77,68,8,102,7,107,105,114,250,36,255,131,41,187,137,23,52,115,120,177,9,114,27,197,104,67,81,28,121,100,2,190,13,77,112,51,73,43,124,183,52,23,77,129,196,91,105,72,42,129,196,155,104,12,105,15,225,150,212,201,123,12,39,64,150,248,60,94,128,74,169,16,3,237,38,220,73,20,248,6,138,177,82,66,52,53,228,70,108,59,95,116,53,222,131,1,142,93,127,61,7,32,149,109,26,46,178,153,28,254,37,15,75,25,13,137,61,181,179,162,93,197,34,16,87,204,23,243,146,159,13,129,28,90,170,66,229,207,175,176,186,73,47,147,29,80,122,7,79,120,54,107,30,13,204,39,196,133,104,121,130,57,21,74,115,1,115,11,238,63,131,97,86,32,172,233,176,45,163,146,226,143,48,152,7,181,140,74,129,198,14,76,117,248,170,65,218,118,22,59,97,44,168,96,182,38,150,83,223,235,118,87,199,171,37,45,41,5,116,231,249,44,141,243,60,20,120,33,32,236,10,39,43,3,88,166,251,50,171,175,28,204,11,185,10,157,177,25,40,70,82,138,122,201,184,235,55,193,171,25,95,65,6,159,220,119,136,46,159,132,84,143,26,228,23,253,0,143,164,96,211,74,22,107,129,41,178,121,228,74,67,57,230,152,8,84,144,98,212,108,161,101,184,250,10,184,223,197,68,76,25,46,65,1,85,209,163,91,36,208,211,14,152,118,186,221,249,186,241,247,10,238,194,96,113,225,226,50,200,111,214,224,111,169,247,87,115,248,53,68,24,32,81,52,184,172,196,158,58,95,192,219,160,78,208,226,244,148,131,194,167,101,177,234,122,108,206,175,73,80,37,179,182,187,93,120,214,213,122,149,173,22,186,187,248,50,151,194,191,154,21,166,67,195,232,167,60,213,35,64,237,31,195,108,78,132,180,124,100,248,10,141,146,192,68,17,109,148,198,182,187,46,237,50,36,83,22,13,23,202,74,182,249,87,242,217,82,37,117,171,164,250,152,234,150,25,187,154,5,227,153,106,179,82,27,48,215,225,98,2,212,5,74,205,37,12,173,236,56,47,144,56,159,96,248,147,196,17,154,117,180,217,133,1,208,212,55,145,215,172,250,34,194,57,59,231,58,205,57,71,63,119,46,139,114,196,128,98,84,135,212,149,153,174,228,18,153,213,85,14,241,21,80,244,241,215,95,126,255,93,38,169,172,37,93,33,60,218,122,241,226,4,163,250,87,159,78,186,79,158,186,30,147,200,51,11,164,129,102,244,30,145,160,31,99,180,216,132,147,196,167,83,224,161,137,161,48,16,18,115,48,219,144,238,131,212,35,143,50,188,164,181,67,96,52,70,219,24,108,94,129,145,96,1,216,23,98,54,250,104,8,47,190,104,142,221,203,135,85,14,90,76,100,87,116,117,231,96,132,166,193,69,181,78,65,124,154,44,80,160,24,118,99,186,155,100,152,233,66,180,90,169,37,249,111,246,124,60,70,99,120,132,155,7,84,63,14,150,0,61,124,172,32,225,184,169,98,168,6,163,137,178,168,198,164,179,153,230,41,164,14,181,202,161,69,16,81,44,59,41,140,17,176,255,94,226,103,60,171,191,165,115,77,130,25,193,12,91,51,176,46,209,49,77,117,69,54,203,100,88,93,214,98,113,182,32,30,99,8,14,57,254,130,86,170,191,150,44,105,79,26,105,50,37,147,108,29,122,50,220,227,6,179,75,85,21,76,153,240,198,188,255,45,68,129,88,46,162,18,105,175,48,166,97,99,25,13,214,168,123,95,173,68,1,125,72,49,121,69,10,135,36,221,218,132,162,179,33,109,180,216,86,179,159,68,223,153,247,235,199,15,159,142,206,143,79,158,159,28,158,255,235,225,127,28,15,78,29,101,185,28,89,176,131,139,145,169,151,195,77,40,46,5,132,129,206,108,65,125,140,102,195,13,173,10,195,111,201,9,231,139,8,47,3,243,252,28,141,2,2,3,35,164,120,5,13,243,100,1,198,255,92,191,41,200,148,192,133,73,189,225,90,167,219,197,99,10,209,207,60,224,193,249,187,15,47,15,145,232,15,211,41,180,31,135,224,124,228,242,33,220,189,2,111,89,220,81,27,100,107,137,110,209,215,33,237,40,130,171,15,17,0,253,244,242,232,252,232,227,135,147,15,47,62,188,61,255,237,240,227,241,155,15,239,1,193,158,183,127,230,189,60,124,245,252,211,219,147,243,162,143,233,50,216,243,204,186,155,71,139,230,192,238,193,198,54,46,63,57,206,198,32,140,199,196,38,127,22,103,57,38,111,46,173,66,93,137,209,113,140,179,54,136,196,21,251,93,223,181,156,43,92,153,115,182,106,175,109,57,189,39,219,142,219,55,47,250,113,4,50,145,241,11,49,208,107,72,45,0,14,104,53,21,18,83,62,16,62,120,45,222,255,169,229,84,183,199,57,174,159,160,35,142,38,45,231,0,174,134,206,86,190,229,28,116,232,210,93,46,151,4,32,126,45,174,75,56,228,154,141,211,189,118,182,132,159,199,199,36,98,173,237,125,23,110,62,37,160,243,47,192,223,183,220,165,135,203,249,151,226,83,26,22,175,75,162,196,0,169,145,179,250,102,194,228,206,207,158,100,36,200,167,235,67,68,211,114,189,156,186,145,28,64,47,95,130,3,67,1,194,3,125,112,84,45,135,98,31,199,245,248,224,66,228,47,22,105,10,177,235,59,16,179,150,43,167,96,48,16,46,134,36,87,206,187,5,76,190,192,132,70,107,249,155,151,14,118,50,72,212,22,84,3,27,156,58,92,103,73,24,192,204,120,112,169,226,130,172,197,221,63,254,104,229,131,174,235,57,184,170,12,236,6,178,7,3,20,80,84,215,58,70,89,62,64,132,138,123,29,181,125,50,131,217,134,217,133,159,156,126,230,75,175,60,16,155,119,242,93,134,4,147,217,10,3,197,148,42,59,150,158,140,85,40,2,26,156,251,58,172,108,217,243,136,27,89,127,242,113,197,183,117,187,72,195,158,153,46,96,253,92,228,179,120,2,177,223,167,19,199,67,208,189,255,123,252,225,189,47,205,73,48,189,129,247,61,181,99,243,132,12,13,79,84,137,58,142,58,159,51,180,11,202,154,247,108,148,96,157,38,161,160,12,243,19,17,8,15,151,75,119,9,47,202,197,71,30,138,52,135,139,229,210,219,22,187,174,135,86,248,133,220,191,187,106,24,106,8,78,39,187,129,40,25,2,211,91,67,252,135,227,111,165,30,104,146,4,168,105,58,166,98,199,199,248,202,210,4,47,247,184,148,231,96,224,28,228,233,16,164,105,11,175,38,67,199,131,171,205,3,18,85,181,193,91,75,123,118,122,230,176,49,88,239,108,224,216,251,132,29,25,198,15,156,77,144,135,77,167,51,220,244,8,90,71,131,91,5,24,139,173,107,0,205,239,5,58,9,46,53,12,220,127,74,34,235,48,100,159,218,154,1,207,229,206,28,103,184,217,7,52,45,28,123,52,232,246,163,131,70,243,169,150,173,251,209,214,150,228,83,60,104,236,119,26,157,121,217,128,15,6,241,31,127,196,131,193,29,230,246,225,195,141,102,76,150,102,246,105,48,180,159,215,26,14,43,109,169,221,220,106,101,207,28,166,148,167,231,56,46,112,71,50,71,51,23,117,121,32,171,68,142,222,163,143,53,9,24,62,50,27,35,84,244,99,161,200,161,37,6,55,36,57,101,248,29,3,68,38,241,140,103,2,76,246,68,226,113,134,204,217,138,213,52,16,149,67,71,45,131,51,249,16,230,97,216,60,67,146,253,213,81,77,48,0,199,40,101,30,95,138,182,222,150,173,202,115,102,80,250,45,179,165,139,21,155,187,228,171,184,127,35,48,18,34,113,105,26,44,114,58,40,233,75,47,140,249,228,88,228,24,222,101,182,141,2,227,164,118,133,200,95,109,92,138,66,51,74,119,114,27,47,24,152,70,231,248,240,225,79,62,88,63,84,86,212,103,5,29,34,166,178,135,251,48,250,140,240,191,136,155,12,158,224,166,250,67,14,230,195,244,202,165,180,113,112,31,155,15,52,20,233,55,78,229,76,74,117,56,219,116,251,92,9,233,176,251,240,97,75,77,55,110,189,240,121,158,167,45,135,66,14,247,25,247,167,65,8,118,188,181,121,90,104,233,105,126,38,129,248,99,140,37,90,110,143,147,227,194,6,215,93,186,30,120,94,29,207,100,0,189,216,160,67,187,110,229,202,73,214,42,247,171,143,6,198,92,188,201,39,19,249,94,235,22,247,67,244,200,59,163,57,35,178,122,98,137,120,139,238,169,152,98,61,200,160,66,92,245,164,84,71,10,192,46,249,170,226,82,67,250,138,44,203,203,115,233,80,125,176,17,238,18,38,75,248,77,185,217,42,148,141,121,220,29,72,27,97,55,161,149,57,208,122,104,85,42,182,54,90,5,187,130,214,100,63,247,34,45,242,164,117,80,22,112,43,8,101,30,112,47,54,149,33,173,131,74,65,92,106,109,130,56,169,100,93,218,146,225,25,168,55,238,1,134,112,203,237,11,253,97,136,154,13,144,252,218,163,70,33,7,149,75,40,22,173,186,220,150,18,242,211,238,25,200,239,233,246,25,252,216,33,13,67,47,157,241,75,241,171,124,227,133,132,222,28,109,98,242,179,152,36,218,62,2,205,16,95,66,160,14,109,50,162,244,192,148,72,67,248,2,45,101,203,161,207,98,28,185,193,138,108,137,109,65,108,119,126,182,137,239,206,121,98,141,167,8,13,126,2,159,36,3,218,190,54,243,217,123,254,190,21,184,207,32,132,220,232,122,212,1,20,187,140,214,139,32,13,118,123,1,232,115,80,69,174,93,254,159,141,56,66,196,165,184,251,180,230,9,27,105,200,173,88,53,175,198,166,20,153,111,64,23,29,66,196,131,83,12,0,186,253,236,64,155,227,126,6,49,67,124,154,157,13,78,57,252,244,2,252,17,193,143,179,126,17,239,25,255,96,34,62,154,199,123,226,210,166,120,240,182,34,160,189,152,132,107,233,233,105,62,68,222,148,178,32,241,172,85,36,49,237,96,210,38,95,238,52,49,180,161,159,253,69,151,214,30,225,186,189,102,144,77,98,169,67,124,204,17,148,125,175,11,126,53,39,162,148,106,83,39,15,167,229,136,5,195,206,51,198,55,21,57,46,170,134,164,192,211,25,135,131,190,46,206,68,6,9,145,249,118,202,113,213,27,57,13,21,119,170,139,34,149,42,73,6,134,7,88,223,191,63,195,18,238,51,221,53,155,129,13,64,214,200,219,18,51,76,250,51,11,112,124,104,16,18,252,116,247,55,41,160,165,25,211,233,240,156,146,141,78,235,63,39,91,238,127,250,246,175,86,187,229,255,236,186,207,58,90,99,110,231,252,115,156,246,114,52,58,243,32,162,203,157,51,64,1,16,224,114,247,204,75,97,178,16,19,220,237,97,3,40,102,239,148,250,83,79,234,131,77,103,32,76,160,126,226,74,164,117,218,60,19,177,216,196,163,91,15,202,79,114,163,202,220,39,92,195,64,254,94,122,50,181,122,129,161,230,171,56,149,217,85,131,68,160,114,131,20,208,47,110,55,131,78,226,195,141,1,70,97,48,221,99,41,55,109,165,234,70,72,125,245,96,203,97,45,44,0,0,216,128,71,249,150,227,42,211,177,49,200,37,132,16,41,48,0,152,143,178,142,155,233,1,148,40,25,127,77,91,126,90,150,14,234,123,230,161,237,181,31,39,32,119,96,150,185,17,16,124,128,123,92,11,25,81,250,180,212,20,193,152,20,105,20,160,214,72,83,53,175,194,141,121,245,94,90,87,165,56,74,175,208,231,131,242,164,182,114,63,231,23,231,104,37,61,195,42,247,153,3,125,152,198,198,47,33,94,192,50,247,6,100,4,255,33,215,170,99,89,126,156,67,32,76,229,198,40,215,221,125,169,125,154,136,108,1,201,112,122,163,73,229,146,144,96,144,251,160,15,184,98,172,2,85,59,24,86,34,147,251,72,22,76,195,68,92,127,192,200,65,77,157,187,49,104,111,163,85,182,66,97,68,57,13,210,249,21,79,69,27,63,144,118,20,155,29,252,80,26,50,1,112,198,254,40,141,175,32,16,56,71,35,128,233,192,249,34,13,209,104,6,21,209,6,163,154,197,33,196,21,241,133,202,188,205,45,4,23,253,6,105,243,238,153,33,43,159,209,159,52,177,230,196,134,226,95,149,217,184,119,113,242,238,73,151,230,197,51,190,135,143,98,116,53,183,181,34,7,12,23,4,217,227,88,255,194,184,112,145,10,114,165,250,77,243,81,71,18,232,207,35,112,223,125,42,146,56,235,100,193,36,158,117,68,150,224,46,205,243,121,64,59,146,206,161,15,180,135,180,127,160,35,201,107,194,140,21,157,129,168,97,214,150,193,42,186,84,43,134,130,184,75,122,95,10,51,20,207,49,195,145,115,175,19,89,207,249,240,30,43,107,242,61,183,248,132,228,132,234,4,45,136,142,224,54,70,222,86,155,48,3,161,178,175,182,199,230,19,0,245,220,79,117,15,255,194,92,141,176,192,103,182,200,223,221,179,95,29,69,81,171,198,145,200,143,50,48,73,205,127,163,128,196,219,238,118,127,230,126,230,42,135,122,132,38,93,92,189,64,112,248,185,206,207,185,63,163,62,16,45,171,223,161,10,189,139,10,183,142,185,176,189,212,208,182,118,168,251,102,131,186,219,105,149,158,235,173,234,43,122,87,135,100,45,180,173,24,83,160,40,44,106,248,146,194,104,96,63,251,25,191,153,237,84,40,41,182,201,215,240,202,69,128,102,140,17,106,126,157,131,181,122,89,78,149,83,192,11,83,10,151,124,176,215,149,97,67,237,195,88,12,54,192,199,91,159,63,19,196,158,51,3,105,161,170,169,71,5,235,127,120,84,60,253,135,75,85,59,252,80,237,88,23,226,27,51,1,170,130,131,3,177,202,245,72,64,80,207,0,202,159,191,149,98,187,242,183,115,210,118,100,9,143,8,136,52,40,199,180,71,85,211,226,16,109,240,228,107,137,235,222,75,156,98,86,19,113,146,238,70,226,226,196,162,141,76,95,233,203,122,227,233,208,64,151,235,59,165,3,27,28,93,254,104,8,242,18,16,132,86,205,120,108,116,49,7,144,67,6,214,231,141,65,26,126,18,240,239,109,13,40,158,78,65,210,0,20,126,246,7,166,32,239,180,182,127,214,141,244,9,37,214,54,2,249,197,11,137,10,105,46,120,199,6,157,14,92,187,58,222,186,5,193,35,67,217,215,82,104,127,107,142,17,108,140,59,113,193,199,21,67,228,104,229,97,102,114,31,55,36,19,29,32,219,75,213,119,145,180,202,254,96,99,91,55,129,215,88,217,134,115,91,70,241,240,97,21,1,105,138,84,62,199,104,161,124,154,242,171,182,28,23,78,9,173,202,215,67,172,219,37,240,91,78,197,40,190,6,27,174,153,88,42,119,233,135,1,200,82,79,207,91,17,93,201,156,82,156,150,223,165,189,138,238,25,56,63,155,187,66,19,109,78,225,200,27,69,166,52,35,170,111,175,28,247,169,167,14,37,254,146,17,84,241,95,5,210,90,59,88,27,164,214,191,42,52,76,248,72,156,33,72,81,27,144,128,237,90,73,159,217,70,7,82,149,146,158,183,52,232,146,122,181,41,143,106,36,187,4,171,81,49,117,178,131,141,248,221,40,60,130,87,29,2,5,70,241,1,30,201,161,42,52,200,27,239,158,97,216,1,153,51,11,148,53,88,89,234,89,85,166,113,0,181,227,234,209,170,28,115,93,86,98,174,25,96,168,171,44,7,199,112,16,148,186,57,221,51,253,10,155,103,154,106,105,177,63,130,144,87,246,191,131,105,126,115,253,220,107,48,107,38,5,206,83,147,156,35,100,179,38,194,7,221,62,63,120,218,231,91,91,174,201,136,139,116,89,115,112,243,32,12,134,7,92,157,61,244,64,173,32,80,103,147,148,115,90,152,64,255,118,208,225,16,198,194,27,14,101,230,77,67,40,225,1,230,51,94,158,123,149,8,148,116,13,223,169,104,69,65,129,35,203,216,181,217,66,163,229,85,130,3,170,15,156,121,246,35,233,33,32,130,244,204,98,239,102,221,54,153,165,72,93,250,183,23,34,239,93,61,212,139,135,208,190,180,107,223,165,37,102,179,254,0,13,96,11,82,220,123,214,3,251,157,197,105,254,10,107,213,61,250,188,208,241,226,72,10,205,243,201,164,87,78,98,114,95,206,9,229,227,111,240,140,16,249,0,220,186,132,247,138,18,175,94,3,191,77,201,225,255,181,186,215,167,188,61,125,222,126,213,109,63,61,187,221,246,30,45,255,56,85,151,123,75,247,167,142,251,172,101,16,64,170,212,61,192,212,85,28,12,246,247,246,118,247,158,181,74,229,168,214,198,182,139,206,180,87,121,44,215,157,71,184,7,139,54,240,226,226,144,222,198,213,189,238,226,89,45,184,59,171,123,253,10,254,113,112,50,221,31,1,163,204,125,115,133,137,162,185,81,201,234,230,193,194,172,205,69,252,146,193,255,237,156,143,50,135,5,147,129,67,123,121,79,240,118,184,233,69,3,173,217,125,245,189,102,99,241,88,174,249,153,164,112,115,43,66,189,41,116,107,19,183,42,240,11,92,147,43,45,104,2,86,84,47,225,235,77,57,182,158,33,114,7,235,175,18,184,5,174,86,76,110,128,250,233,229,145,1,165,23,213,22,97,195,98,43,2,83,53,203,210,136,25,238,162,185,119,208,21,64,16,229,225,55,98,96,123,37,15,136,163,197,232,37,124,167,248,148,180,113,245,12,82,7,172,99,140,48,197,131,247,116,113,170,132,172,56,202,10,87,131,57,14,15,23,46,29,143,23,203,175,208,135,214,218,12,114,184,180,25,173,150,63,33,140,194,29,79,15,31,182,120,101,68,197,225,39,138,195,120,217,70,85,149,112,241,150,38,154,22,77,33,193,231,102,5,21,236,97,227,22,127,252,246,217,199,171,103,85,100,214,162,55,50,173,241,237,21,203,225,247,44,55,235,133,230,97,211,218,50,226,138,210,233,206,35,189,204,220,140,184,97,193,89,57,137,8,63,109,112,88,103,200,232,74,179,245,30,154,86,19,19,230,248,197,235,183,82,35,191,151,37,114,74,95,208,26,178,228,84,53,110,142,53,83,35,5,65,154,13,83,232,177,150,170,152,189,182,204,86,174,86,178,185,252,118,82,128,216,87,119,188,53,175,65,161,248,72,175,53,164,12,243,160,163,239,150,90,184,36,106,240,194,214,254,191,239,34,220,86,144,98,115,219,15,160,15,239,239,219,80,107,40,191,75,21,238,3,242,39,105,133,66,91,69,38,185,118,47,77,171,69,52,79,33,178,65,1,149,91,169,191,91,97,212,142,251,31,79,232,148,135,153,164,244,165,68,81,85,162,242,102,21,10,97,154,183,1,85,37,13,119,2,217,182,18,92,9,95,74,87,167,159,105,199,183,142,131,169,249,67,233,241,234,105,68,214,166,115,140,152,117,156,145,21,66,171,133,39,155,138,210,53,37,104,122,213,175,216,188,24,184,213,150,108,49,154,7,121,171,86,231,108,74,59,26,86,134,253,25,207,42,105,133,91,95,103,198,28,88,31,43,34,183,42,218,20,136,52,224,33,132,60,207,211,148,223,180,112,140,147,197,88,84,22,73,165,95,21,167,178,52,127,102,22,119,158,209,91,144,127,203,183,57,238,64,73,22,217,204,4,157,61,243,206,224,148,123,234,233,153,245,84,61,242,196,210,187,93,226,74,127,177,197,100,112,78,139,114,148,64,235,192,76,75,10,243,117,85,167,41,113,248,9,183,219,84,22,115,113,73,209,7,193,195,137,184,173,219,224,222,233,217,210,203,173,202,249,15,92,181,205,49,250,183,246,68,106,208,82,198,168,114,3,191,49,165,197,149,75,157,180,212,50,91,212,148,102,153,81,176,155,166,190,41,43,90,41,238,43,73,177,78,119,91,185,42,6,221,14,2,90,192,104,174,241,89,203,29,244,241,63,173,109,4,23,152,103,230,113,140,254,175,117,155,132,224,186,241,40,25,200,115,226,4,2,46,60,56,172,146,245,153,208,202,145,155,35,121,16,65,58,35,243,204,37,166,156,42,227,150,185,171,174,235,60,80,31,197,148,138,48,141,107,145,110,105,203,88,171,33,81,199,28,186,56,252,5,19,131,34,71,24,97,241,90,30,154,169,206,138,0,123,108,153,38,67,113,249,177,122,69,158,97,10,77,106,7,157,180,151,242,198,169,244,85,59,199,203,62,109,28,135,33,79,50,243,152,167,23,120,60,180,62,199,211,52,15,15,176,206,106,60,127,218,198,67,223,156,161,92,252,192,1,4,23,36,213,48,76,232,55,100,165,238,52,135,0,142,14,82,250,254,102,179,135,143,65,226,82,30,35,157,59,170,79,169,238,56,229,131,173,185,114,47,101,246,202,1,178,250,128,107,169,28,182,195,47,58,89,217,202,153,140,226,151,57,43,21,164,204,214,170,38,15,181,212,152,132,170,2,154,234,98,50,121,164,203,225,221,251,29,169,96,78,42,37,89,56,44,151,234,13,255,10,100,26,154,41,226,88,216,233,36,28,167,218,163,89,142,204,251,12,140,173,37,130,184,18,219,6,175,147,196,201,34,209,17,10,61,20,215,64,203,68,76,116,52,48,148,71,251,148,166,126,204,83,58,79,218,162,187,152,149,210,121,186,213,73,33,218,219,242,220,189,181,102,166,244,130,158,158,231,242,182,196,48,57,190,76,36,60,229,120,154,137,33,39,184,12,164,46,214,231,145,74,205,170,136,173,138,1,182,121,89,131,60,221,93,17,70,38,136,62,206,83,70,104,133,0,25,148,235,98,104,155,197,113,133,73,194,103,175,212,227,21,120,112,41,171,182,169,186,17,141,236,217,174,42,194,47,244,184,128,142,21,5,251,74,238,29,150,63,65,7,87,152,72,226,172,41,57,216,125,240,179,133,170,226,183,179,121,123,215,68,243,148,211,155,186,154,140,127,43,27,150,134,47,213,247,21,147,178,152,90,91,158,10,89,85,1,173,74,153,10,112,8,156,220,22,126,205,44,0,231,33,125,72,49,91,140,240,51,138,161,201,115,26,109,21,146,252,168,60,16,123,87,18,161,41,125,242,33,185,79,99,27,143,115,47,189,24,93,225,143,115,188,153,46,242,238,147,167,101,6,168,143,82,156,33,85,81,205,40,86,167,80,250,133,63,33,85,42,215,90,239,219,153,190,13,154,40,87,116,6,102,73,110,200,182,191,43,9,250,58,10,118,0,223,206,95,136,15,100,151,237,254,133,248,64,240,216,186,85,24,86,18,203,66,8,141,204,125,55,53,123,64,205,222,223,134,154,125,160,102,255,111,67,205,99,160,230,241,223,134,154,39,64,205,147,191,80,78,187,128,239,121,24,150,107,10,165,159,205,70,213,50,131,84,252,26,126,132,244,29,124,31,166,110,77,150,208,138,153,86,124,192,162,14,49,169,133,78,229,48,189,57,144,82,244,12,49,143,40,188,201,29,193,145,10,138,87,70,72,100,174,229,192,48,142,177,57,134,110,193,142,252,96,232,191,254,242,123,41,236,177,187,131,243,40,247,126,241,226,100,101,103,229,109,76,156,100,44,126,25,219,214,61,48,106,47,172,236,108,4,215,234,47,143,4,96,29,246,203,147,59,223,123,186,93,127,239,233,54,190,183,83,141,77,238,18,170,85,209,198,246,206,29,190,187,80,189,146,151,134,223,133,167,94,23,199,108,111,248,122,1,98,3,191,191,150,198,253,74,174,87,108,28,89,217,160,118,148,52,167,111,245,237,79,133,200,170,95,53,86,174,32,121,53,187,202,241,204,87,112,233,216,108,162,251,102,102,73,123,165,51,99,218,185,194,172,61,43,172,182,91,79,146,46,123,226,137,205,104,177,202,207,248,53,196,51,221,202,83,29,231,192,243,111,227,147,146,38,139,87,158,145,249,175,96,25,109,54,98,39,197,86,189,111,230,156,245,180,246,7,60,214,102,172,189,103,240,207,225,236,215,169,55,240,162,216,105,248,77,172,33,48,235,13,94,110,92,252,209,195,254,42,97,160,141,70,223,49,208,194,93,85,254,158,145,74,233,237,112,192,236,239,98,165,141,188,6,143,197,159,242,186,181,242,187,245,4,65,90,244,102,221,97,242,16,255,149,150,185,200,159,130,187,11,112,245,152,203,222,52,38,193,171,39,180,75,224,156,180,193,25,254,142,191,10,199,46,157,15,49,119,93,140,152,147,222,133,44,162,141,216,50,40,120,143,215,21,108,107,143,76,110,218,190,11,85,194,131,244,254,250,213,34,83,245,171,35,232,254,141,196,168,239,134,239,160,101,17,173,67,141,253,245,48,251,68,175,84,39,3,35,129,4,126,39,119,203,241,215,200,151,146,39,235,149,234,95,116,185,167,220,91,141,62,241,90,29,80,117,215,244,224,78,210,120,145,41,97,40,185,240,38,230,16,61,77,37,89,251,69,42,199,59,42,132,85,177,193,247,147,206,232,51,227,105,112,93,147,102,113,157,175,75,191,22,181,74,240,108,27,41,141,165,226,13,10,45,252,1,102,227,175,75,39,112,18,238,174,174,222,147,64,176,242,110,191,114,28,252,109,76,89,85,143,250,31,144,127,185,120,157,8,49,57,87,195,251,145,26,112,140,128,127,160,10,220,65,61,241,231,175,144,254,90,26,132,111,83,73,176,113,169,208,18,10,30,210,66,187,94,43,152,4,60,140,47,106,102,146,135,237,213,45,141,69,94,217,180,214,154,152,220,165,44,185,8,121,201,60,48,239,59,195,135,116,44,85,191,96,203,108,167,140,65,77,170,90,58,101,114,167,48,134,64,59,205,74,160,55,4,220,27,20,49,59,48,194,229,219,6,126,202,101,221,225,65,78,167,229,21,27,24,144,162,131,92,254,205,157,60,197,75,83,174,126,121,208,129,59,124,130,39,120,31,197,105,110,30,28,165,49,214,82,66,166,190,243,51,13,197,210,90,213,199,87,254,62,162,172,43,84,118,102,175,237,231,101,86,141,248,240,248,13,188,146,3,160,191,7,213,48,120,189,91,27,187,202,191,44,212,161,177,195,111,228,203,125,201,164,153,157,225,195,104,148,37,253,138,228,86,86,37,254,249,68,182,88,111,92,75,86,235,92,90,39,162,39,193,149,43,105,180,251,219,230,108,165,190,39,247,38,172,10,39,205,126,161,99,217,237,107,39,217,148,156,240,240,37,70,63,219,87,60,165,175,42,229,29,253,125,46,181,213,167,244,45,194,90,83,81,123,77,125,252,208,48,29,143,134,39,178,35,83,103,149,177,22,157,70,139,155,141,245,201,229,46,204,202,35,75,24,43,135,154,173,26,100,177,154,88,93,188,251,231,147,223,218,106,228,87,153,220,6,57,112,48,126,127,169,190,243,101,154,127,108,20,68,60,13,240,252,83,121,60,188,96,166,42,104,253,41,48,253,145,235,253,159,183,130,179,8,242,215,139,17,211,15,24,126,7,134,198,207,103,197,90,46,103,145,245,57,245,8,210,68,220,117,66,135,53,202,207,168,157,218,186,175,163,254,142,164,79,57,8,252,55,26,190,227,95,4,203,22,169,60,154,150,70,114,163,143,14,95,36,56,78,58,40,148,83,182,150,208,9,154,8,16,122,164,140,254,18,201,6,76,195,208,240,88,30,152,28,68,216,153,231,193,136,14,11,86,71,15,141,233,172,83,181,95,136,209,39,177,62,123,51,149,71,29,207,104,71,77,230,193,152,229,161,142,68,14,253,169,19,2,249,233,248,23,73,181,156,191,146,213,232,232,153,112,152,220,76,133,103,131,100,96,40,68,52,150,194,37,119,192,242,52,39,147,208,70,169,170,216,150,105,16,154,58,9,93,35,127,180,65,75,154,237,144,42,43,220,109,149,42,102,168,38,120,242,207,62,126,93,148,186,66,47,94,160,206,88,73,231,29,182,206,222,84,240,207,173,254,235,106,61,114,164,250,81,188,126,111,150,146,81,86,135,136,20,209,143,109,128,171,39,69,84,185,93,254,162,222,33,128,111,233,89,29,158,46,228,201,130,213,221,144,244,78,2,185,230,99,64,213,23,160,204,193,19,146,171,112,133,145,160,60,165,193,224,144,175,125,148,118,135,189,36,254,173,7,202,252,49,136,115,158,175,0,247,62,166,189,39,10,94,146,138,187,224,169,169,161,99,56,41,186,40,98,204,74,119,252,176,118,32,79,100,176,222,199,77,180,120,20,131,51,252,45,0,59,9,130,38,141,106,121,103,87,35,84,100,114,249,216,135,194,232,151,183,182,220,31,77,252,79,43,121,243,14,154,255,197,202,126,127,24,122,48,219,53,26,100,255,137,88,189,111,136,89,113,237,110,177,128,215,177,182,230,169,217,46,34,81,159,246,223,86,103,42,73,3,105,39,106,128,203,50,182,146,160,143,160,200,120,228,127,153,162,178,115,43,200,250,42,231,150,220,235,223,84,12,240,61,158,45,105,12,178,255,70,226,223,180,81,239,127,177,240,175,240,116,114,51,164,217,127,120,191,195,43,138,118,229,63,54,92,94,158,104,174,148,147,8,204,153,245,213,121,165,188,164,254,46,153,148,110,158,222,177,74,240,141,8,168,218,84,58,27,17,196,2,30,209,177,243,76,110,78,111,170,189,255,109,164,179,163,138,17,232,163,134,255,31,42,221,98,66,145,135,0,0}; \ No newline at end of file +#define index_html_gz_len 9623 +static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,221,125,107,123,219,54,147,232,247,243,43,96,166,111,44,214,20,37,219,177,227,72,166,178,105,226,180,57,155,139,55,118,218,221,199,235,227,7,146,32,139,9,69,114,73,202,151,117,245,223,207,204,224,66,144,162,108,37,77,187,221,183,23,155,36,192,153,193,96,238,0,225,195,141,113,50,42,110,83,193,166,197,44,26,28,226,79,22,241,248,50,112,68,236,192,189,224,227,193,225,76,20,156,141,166,60,203,69,17,56,243,98,210,62,128,182,34,44,34,49,120,23,190,13,47,167,5,251,101,62,60,236,200,71,135,81,24,127,97,153,136,2,39,47,110,35,145,79,133,40,28,54,205,196,36,112,166,69,145,230,189,78,103,198,111,70,227,216,31,38,73,145,23,25,79,241,102,148,204,58,230,65,103,215,223,245,159,118,70,121,94,62,243,103,33,244,202,115,71,225,168,130,188,12,11,132,2,191,166,243,161,31,38,229,123,237,34,185,188,140,68,103,199,135,127,171,32,85,147,129,188,68,119,35,42,192,243,57,247,71,81,50,31,79,34,158,9,34,157,127,230,55,157,40,28,218,208,243,40,28,139,172,243,204,127,234,119,107,136,101,211,247,69,156,139,72,140,138,240,191,133,255,57,239,116,253,237,29,255,9,97,45,159,27,252,187,127,218,144,9,87,103,187,196,94,111,187,15,51,201,90,204,103,34,112,174,66,113,157,38,25,136,206,40,137,11,17,131,236,93,135,227,98,26,140,197,85,56,18,109,186,241,194,56,44,66,30,181,243,17,143,68,176,13,32,54,218,237,179,112,194,162,130,189,57,98,207,206,7,255,135,193,63,135,249,40,11,211,130,229,217,104,237,49,161,54,236,229,211,240,10,100,241,169,191,91,222,3,119,1,79,71,130,68,248,135,27,103,34,30,135,147,243,118,123,112,72,227,25,248,168,59,34,107,103,201,245,221,48,201,240,114,152,20,69,50,235,109,167,55,44,79,96,246,217,163,209,104,180,136,248,80,68,119,227,48,79,35,126,219,27,70,201,232,203,194,207,248,56,76,218,73,90,132,73,124,151,242,241,56,140,47,123,93,182,151,222,244,71,243,44,79,178,94,154,132,192,148,108,129,52,207,120,60,110,15,231,0,61,206,239,162,48,47,218,68,67,47,78,98,209,159,241,236,50,140,123,221,190,1,179,244,14,139,66,67,64,24,195,228,139,54,209,161,222,109,103,168,226,189,109,49,235,39,87,34,155,68,201,117,143,207,139,100,225,79,146,108,214,134,153,201,110,239,52,26,214,101,59,93,24,97,215,110,101,242,26,231,49,75,162,59,154,185,222,78,87,204,42,157,170,156,176,9,145,76,130,241,20,45,95,100,89,146,185,76,254,110,135,241,36,49,175,224,120,23,118,195,40,137,128,85,153,24,247,39,128,186,157,131,6,244,252,167,136,182,236,212,27,10,160,65,220,41,33,235,109,182,54,43,205,124,2,108,46,91,93,104,85,83,59,44,98,61,108,28,242,194,191,228,133,184,230,183,109,96,52,53,2,167,120,209,35,238,45,30,41,8,204,31,103,73,58,78,174,97,94,147,60,196,9,238,41,25,174,113,119,249,141,246,76,196,115,123,178,36,115,30,129,110,77,38,225,168,157,199,225,100,82,229,198,35,122,38,198,109,213,7,8,190,105,79,5,77,232,94,215,154,209,246,173,154,83,141,236,190,233,240,99,126,53,228,217,221,144,143,190,92,102,201,28,68,73,177,250,114,200,91,79,182,61,252,111,207,243,159,185,27,225,12,117,152,199,69,95,105,1,138,246,60,71,41,148,64,218,195,12,68,209,171,220,245,166,72,150,154,190,71,147,201,100,225,3,63,193,124,0,75,198,28,164,109,9,49,118,82,24,234,10,230,75,210,87,140,228,122,26,22,162,93,136,89,218,78,195,209,23,192,170,184,179,3,204,41,209,244,240,29,32,239,18,201,135,73,105,21,9,163,137,245,30,241,253,241,246,100,194,186,30,210,192,246,186,255,192,11,222,237,118,217,118,183,251,15,183,223,168,89,90,25,119,165,170,76,231,162,1,189,212,19,132,210,175,217,135,178,63,8,105,220,244,22,152,195,81,11,95,101,109,182,43,102,43,200,168,26,147,181,198,11,218,36,199,10,227,219,247,247,247,247,159,194,128,187,112,183,11,30,27,254,161,59,197,135,110,119,194,246,77,167,9,220,29,232,78,8,134,248,35,7,115,197,35,248,169,104,188,91,158,72,96,167,182,70,145,152,20,61,127,207,140,20,199,108,13,191,121,154,211,104,158,183,193,239,192,79,28,96,122,87,209,53,155,211,163,8,198,221,3,91,61,173,51,189,14,131,73,243,217,155,132,25,152,220,100,210,198,72,170,106,236,165,233,52,50,175,117,160,72,210,122,139,180,21,56,182,117,209,70,124,37,86,4,211,136,180,218,240,16,34,159,2,58,13,91,241,8,5,86,131,84,186,7,90,166,159,72,199,67,147,102,100,28,188,22,211,255,63,5,15,102,60,146,154,181,221,39,240,144,38,75,61,216,246,159,60,187,135,33,147,80,68,99,232,27,165,205,94,171,180,245,219,254,14,202,73,93,112,192,82,71,183,233,52,4,107,226,231,41,40,16,80,121,199,227,112,198,201,28,227,35,182,157,51,48,255,104,153,5,147,186,208,111,95,139,225,151,176,104,87,123,238,52,116,93,96,168,80,218,119,8,115,160,255,21,248,98,160,66,143,17,100,109,49,76,198,218,115,234,232,96,167,139,174,100,2,33,147,165,213,244,236,95,102,98,28,114,150,196,209,45,131,208,67,136,152,129,169,100,45,4,74,115,195,122,187,232,135,220,187,38,176,123,8,98,29,24,79,14,86,194,232,174,11,227,233,254,193,10,24,219,123,7,107,194,120,246,108,103,21,140,237,125,132,225,207,146,49,4,126,216,129,249,57,198,183,73,220,174,72,236,114,192,37,132,208,98,169,91,125,48,26,202,77,178,82,46,218,100,135,148,124,239,79,246,27,122,228,160,80,198,69,237,239,47,230,145,207,37,17,171,66,49,43,2,171,246,92,21,128,53,244,163,32,72,153,156,209,52,140,198,238,221,146,120,255,203,23,113,59,201,32,136,206,25,74,232,221,36,75,102,119,16,0,196,57,70,91,61,10,149,91,219,46,203,146,2,34,150,86,215,93,20,201,61,237,187,251,221,177,184,116,97,214,180,6,84,225,239,72,4,186,177,4,84,129,191,178,217,128,135,136,154,66,231,195,142,204,59,113,102,7,141,129,59,198,232,254,101,146,64,230,198,211,48,175,197,237,159,255,107,46,178,91,8,218,33,7,81,55,148,114,84,162,246,70,184,235,102,165,159,235,73,233,195,160,215,205,78,63,175,72,78,31,198,240,64,54,3,78,93,100,249,8,66,93,76,14,183,253,3,200,104,202,103,237,239,130,99,69,226,219,152,244,254,97,100,77,201,46,92,229,16,108,130,93,0,125,179,122,124,239,209,85,114,220,207,43,82,220,70,132,178,186,82,136,155,162,243,153,95,113,249,212,25,76,230,49,105,58,131,8,250,52,249,37,143,90,220,19,94,230,222,241,78,176,179,183,231,9,249,43,163,95,253,43,158,177,220,43,188,81,240,142,23,83,31,196,86,117,247,166,234,73,24,235,39,113,208,26,109,77,221,206,78,63,156,180,70,65,48,117,243,160,8,186,125,17,229,226,14,1,13,131,81,123,218,207,175,65,64,167,173,34,136,7,254,222,243,97,167,181,211,134,199,110,15,174,240,117,111,228,222,141,120,46,24,239,229,65,75,180,51,183,51,220,106,137,195,236,249,126,175,235,246,135,153,224,16,77,98,7,129,29,178,54,199,14,59,118,67,134,13,188,45,176,225,201,34,239,4,251,139,76,20,243,44,190,155,246,114,47,239,21,30,100,120,139,133,225,196,199,159,127,42,146,95,78,126,213,156,216,14,130,0,44,221,28,146,160,34,247,35,17,95,22,211,199,143,91,34,224,254,165,151,193,207,161,199,225,103,230,106,246,44,49,103,180,196,156,105,0,86,20,88,212,5,216,197,243,110,111,218,41,188,97,80,116,144,201,154,35,106,224,35,32,191,107,143,7,57,1,140,216,154,254,104,248,224,225,168,126,156,214,217,1,220,216,218,249,113,218,208,138,60,1,150,108,61,49,173,85,158,196,222,85,111,72,150,113,45,41,194,129,127,122,255,230,244,226,248,197,199,23,239,78,130,59,24,234,187,16,66,237,28,28,239,174,7,172,80,119,187,79,187,120,247,19,5,161,177,200,115,8,16,246,22,222,167,55,23,167,47,126,58,9,206,238,10,126,217,115,10,62,4,111,60,9,29,111,146,65,18,48,142,110,123,206,111,120,191,240,202,14,57,208,155,218,61,78,232,129,221,37,18,99,187,195,219,163,87,149,102,42,118,216,29,62,210,3,187,203,236,191,138,194,238,241,238,223,78,79,157,197,57,18,252,250,205,209,219,87,134,100,62,134,33,95,204,115,145,97,17,201,126,229,5,182,176,178,5,227,199,158,243,73,221,51,240,72,44,2,115,11,254,25,162,57,200,118,138,105,152,51,240,89,41,191,132,222,24,100,247,28,80,113,104,135,59,62,180,184,163,9,149,184,83,158,231,215,16,127,216,184,143,205,51,137,85,223,127,15,172,35,113,1,62,216,198,246,242,136,117,216,241,191,158,50,122,174,48,194,216,65,167,142,78,142,15,118,246,247,145,13,18,249,230,203,163,77,214,194,171,247,31,95,239,60,121,219,221,102,148,10,78,248,72,184,12,59,0,32,213,99,243,248,45,132,94,79,59,111,79,15,158,117,187,155,86,199,149,148,230,21,89,24,229,241,18,173,39,239,215,35,243,228,253,230,154,88,50,1,247,117,60,31,143,78,142,214,99,8,245,92,23,23,72,118,29,19,72,119,29,15,204,43,192,39,240,216,10,30,170,152,231,76,5,124,172,213,13,224,146,15,1,150,219,103,177,184,164,92,1,184,11,25,106,142,33,86,120,25,243,136,181,50,129,101,59,192,194,218,59,4,11,227,194,132,131,20,1,208,117,167,32,133,12,31,184,147,137,84,240,34,175,202,40,182,48,211,34,201,63,157,10,22,207,103,67,1,232,38,172,8,49,230,195,82,0,245,98,31,95,51,9,16,168,196,74,21,180,12,231,209,48,95,73,76,86,209,108,244,187,138,148,11,144,163,34,201,108,130,126,57,61,61,214,136,116,171,36,234,221,60,42,194,52,10,71,146,83,178,17,103,179,58,58,98,82,38,32,0,204,11,76,209,176,200,86,192,52,15,111,65,205,4,35,248,47,142,223,248,236,211,43,186,96,64,52,192,140,32,39,1,94,11,0,13,147,52,151,120,132,30,168,7,169,4,155,65,196,164,57,197,242,105,50,143,0,170,40,133,8,65,175,105,51,230,69,2,244,130,72,100,32,179,34,11,147,138,225,120,1,205,109,213,204,116,179,100,2,54,97,26,170,9,150,125,112,96,178,62,206,4,200,207,173,53,121,152,217,23,20,178,139,17,144,32,198,48,112,144,202,46,81,172,37,112,77,49,130,238,35,172,160,220,94,80,133,222,162,248,149,110,97,178,69,153,89,224,48,222,163,132,96,86,4,249,158,194,170,59,43,49,130,140,156,189,18,19,14,51,76,130,134,227,201,209,62,211,219,196,96,152,62,189,234,36,71,10,115,242,228,224,224,217,51,61,30,120,77,13,103,189,57,64,231,114,1,126,0,8,169,251,24,166,31,203,97,188,2,142,163,221,200,216,155,99,6,201,28,112,61,71,214,82,215,97,150,124,129,216,150,125,160,170,61,205,138,100,245,45,227,146,124,8,40,166,172,37,110,248,44,141,192,186,206,110,241,61,245,218,8,19,213,131,131,39,43,73,38,23,88,33,25,242,207,112,4,254,166,0,51,28,47,81,78,173,204,180,106,199,67,183,196,252,178,87,110,77,11,78,192,145,164,176,7,207,128,203,121,167,39,249,124,17,142,205,37,18,217,233,81,153,8,30,251,236,68,8,246,241,232,197,171,119,71,4,123,50,207,96,230,96,130,69,193,195,104,181,61,88,30,212,60,29,131,182,61,48,54,217,233,254,33,194,144,210,249,16,70,53,101,214,59,185,207,142,149,168,21,83,48,44,156,20,153,148,29,84,23,210,88,150,40,194,149,100,97,89,34,173,191,65,198,142,122,147,191,86,10,119,29,70,17,42,34,200,46,195,80,67,34,4,195,128,222,29,95,249,10,54,160,143,120,136,11,212,231,107,230,217,230,137,126,217,103,191,77,177,250,194,100,201,111,52,133,200,18,141,4,54,123,164,126,147,57,12,235,75,140,75,2,242,37,116,4,240,92,190,64,131,6,219,167,224,2,23,117,20,83,35,108,125,9,104,8,222,228,12,66,3,171,7,111,244,128,228,55,193,16,10,175,42,138,187,54,218,166,184,141,32,165,171,130,55,131,244,91,112,146,39,188,48,33,20,41,212,82,12,92,134,88,76,182,75,10,32,233,100,63,255,242,223,140,96,128,51,26,139,8,204,14,214,210,228,244,73,254,135,19,118,155,204,105,230,240,98,19,228,54,78,208,134,162,56,242,216,4,124,27,154,224,102,146,86,248,110,105,46,154,2,137,183,210,144,212,2,137,55,241,8,210,30,194,45,169,147,247,24,78,128,44,241,89,50,7,149,82,33,6,218,77,184,147,40,240,13,20,99,165,132,104,106,200,141,216,118,190,236,106,188,7,3,28,187,254,122,14,64,42,219,36,154,231,83,57,252,43,30,85,50,26,18,123,106,103,101,187,138,69,32,174,152,205,103,21,63,27,1,57,180,84,133,202,95,92,99,117,147,94,38,59,160,244,14,158,240,124,218,60,26,152,79,136,11,209,242,132,51,42,148,22,2,230,22,220,127,14,195,172,65,88,211,97,91,70,37,195,31,81,56,11,151,50,42,5,26,59,48,213,225,171,6,105,219,89,236,132,177,160,130,217,26,91,78,125,175,219,93,29,175,86,180,164,18,208,93,20,211,44,41,138,72,224,133,128,176,43,26,175,12,96,153,238,203,172,190,114,48,47,229,42,116,206,166,160,24,105,37,234,37,227,174,223,4,175,102,124,5,25,124,114,223,17,186,124,18,82,61,106,144,95,244,3,60,150,130,77,43,89,172,5,166,200,230,145,43,13,229,136,99,34,80,67,138,81,179,133,150,225,234,43,224,126,151,16,49,85,184,4,5,84,69,143,110,158,66,79,59,96,218,233,118,103,235,198,223,43,184,11,131,197,133,139,171,176,184,93,131,191,149,222,95,205,225,95,32,194,0,137,162,193,229,21,246,44,243,5,188,13,234,4,45,78,79,56,40,124,86,21,171,174,199,102,252,134,4,85,50,107,187,219,133,103,93,173,87,249,106,161,187,143,47,51,41,252,171,89,97,58,52,140,126,194,51,61,2,212,254,17,204,230,88,72,203,71,134,175,212,40,9,76,148,209,70,101,108,187,235,210,46,67,50,101,209,112,161,172,98,155,127,38,159,45,85,82,183,74,170,79,168,110,153,179,235,105,56,154,170,54,43,181,1,115,29,205,199,64,93,168,212,92,194,208,202,142,243,2,137,243,41,134,63,105,18,163,89,71,155,93,26,0,77,125,19,121,205,170,47,98,156,179,11,174,211,156,11,244,115,23,178,40,71,12,40,71,117,68,93,153,233,74,46,145,89,93,229,16,95,3,69,31,127,254,233,183,223,100,146,202,90,210,21,194,163,173,151,47,79,49,170,127,253,233,180,123,240,204,245,152,68,158,91,32,13,52,163,247,136,4,253,24,163,197,38,156,36,62,153,0,15,77,12,133,129,144,152,129,217,134,116,31,164,30,121,148,227,37,173,29,2,163,49,218,198,96,243,26,140,4,11,193,190,16,179,209,71,67,120,241,69,115,236,65,62,172,114,208,98,44,187,162,171,187,0,35,52,9,47,235,117,10,226,211,120,142,2,197,176,27,211,221,36,195,76,23,162,213,74,45,201,127,179,23,163,17,26,195,99,220,60,160,250,113,176,4,232,225,19,5,9,199,77,21,67,53,24,77,148,69,53,38,157,205,52,79,32,117,88,170,28,90,4,17,197,178,147,194,24,3,251,31,36,126,202,243,229,183,116,174,73,48,99,152,97,107,6,214,37,58,161,169,174,201,102,149,12,171,203,90,44,206,231,196,99,12,193,33,199,159,211,74,245,215,146,37,237,73,35,77,166,100,146,175,67,79,142,123,220,96,118,169,170,130,41,19,222,152,247,191,133,40,16,203,121,92,33,237,53,198,52,108,36,163,193,37,234,222,215,43,81,64,31,82,76,94,145,194,33,73,183,54,161,232,108,72,27,45,182,45,217,79,162,239,220,251,249,227,135,79,199,23,39,167,47,78,143,46,254,245,232,63,78,130,51,71,89,46,71,22,236,224,98,104,234,229,112,19,137,43,1,97,160,51,157,83,31,163,217,112,67,171,194,240,91,114,194,249,34,162,171,208,60,191,64,163,128,192,192,8,41,94,65,195,44,157,131,241,191,208,111,10,50,37,112,97,82,111,184,214,233,118,249,152,66,244,115,15,120,112,241,238,195,171,35,36,250,195,100,2,237,39,17,56,31,185,124,8,119,175,193,91,150,119,212,6,217,90,170,91,244,117,68,59,138,224,234,67,12,64,63,189,58,190,56,254,248,225,244,195,203,15,111,47,126,61,250,120,242,230,195,123,64,176,231,237,159,123,175,142,94,191,248,244,246,244,162,236,99,186,4,123,158,89,119,243,104,209,28,216,29,108,108,227,242,147,227,108,4,81,50,34,54,249,211,36,47,48,121,115,105,21,234,90,12,79,18,156,181,32,22,215,236,55,125,215,114,174,113,101,206,217,90,122,109,203,233,29,108,59,110,223,188,232,39,49,200,68,206,47,69,160,215,144,90,0,28,208,106,42,36,166,34,16,62,120,45,222,255,161,229,212,183,199,57,174,159,162,35,142,199,45,231,16,174,6,206,86,177,229,28,118,232,210,93,44,22,4,32,249,69,220,84,112,200,53,27,167,123,227,108,9,191,72,78,72,196,90,219,251,46,220,124,74,65,231,95,130,191,111,185,11,15,151,243,175,196,167,44,42,95,151,68,137,0,169,145,179,250,102,204,228,206,207,158,100,36,200,167,235,67,68,211,114,189,130,186,145,28,64,47,95,130,3,67,1,194,3,125,112,84,45,135,98,31,199,245,120,112,41,138,151,243,44,131,216,245,29,136,89,203,149,83,16,4,194,197,144,228,218,121,55,135,201,23,152,208,104,45,127,243,202,193,78,6,137,218,130,106,96,131,83,135,235,60,141,66,152,25,15,46,85,92,144,183,184,251,251,239,173,34,232,186,158,131,171,202,192,110,32,59,8,80,64,81,93,151,49,202,242,1,34,84,220,235,168,237,147,57,204,54,204,46,252,228,244,179,88,120,213,129,216,188,147,239,50,36,152,204,86,20,42,166,212,217,177,240,100,172,66,17,80,112,225,235,176,178,101,207,35,110,100,253,193,199,21,223,214,221,60,139,122,102,186,128,245,51,81,76,147,49,196,126,159,78,29,15,65,247,254,239,201,135,247,190,52,39,225,228,22,222,247,212,142,205,83,50,52,60,85,37,234,36,238,124,206,209,46,40,107,222,179,81,130,117,26,71,130,50,204,79,68,32,60,92,44,220,5,188,40,23,31,121,36,178,2,46,22,11,111,91,236,186,30,90,225,151,114,255,238,170,97,168,33,56,157,252,22,162,100,8,76,239,12,241,31,78,190,149,122,160,73,18,160,166,233,132,138,29,31,147,107,75,19,188,194,227,82,158,195,192,57,44,178,1,72,211,22,94,141,7,142,7,87,155,135,36,170,106,131,183,150,246,252,236,220,97,35,176,222,121,224,216,251,132,29,25,198,7,206,38,200,195,166,211,25,108,122,4,173,163,193,173,2,140,197,214,53,128,22,15,2,29,135,87,26,6,238,63,37,145,117,24,178,79,109,205,128,231,114,103,142,51,216,236,3,154,22,142,61,14,186,253,248,176,209,124,170,101,235,126,188,181,37,249,148,4,141,253,206,226,115,47,15,120,16,36,191,255,158,4,193,61,230,246,241,227,141,102,76,150,102,246,105,48,180,159,215,26,14,171,108,169,221,220,106,229,207,29,166,148,167,231,56,46,112,71,50,71,51,23,117,57,144,85,34,71,239,209,199,154,4,12,31,153,141,17,42,250,177,72,20,208,146,128,27,146,156,50,252,78,0,34,147,120,70,83,1,38,123,44,241,56,3,230,108,37,106,26,136,202,129,163,150,193,153,124,8,243,48,104,158,33,201,254,250,168,198,24,128,99,148,50,75,174,68,91,111,203,86,229,57,51,40,253,150,217,210,197,202,205,93,242,85,220,191,17,26,9,145,184,52,13,22,57,29,148,244,133,23,37,124,124,34,10,12,239,114,219,70,129,113,82,187,66,228,175,54,46,69,161,25,165,59,185,141,23,12,76,163,115,124,252,248,7,31,172,31,42,43,234,179,130,14,17,83,213,195,125,24,126,70,248,95,196,109,14,79,112,83,253,17,7,243,97,122,21,82,218,56,184,143,205,71,26,138,244,27,103,114,38,165,58,156,111,186,125,174,132,116,208,125,252,184,165,166,27,183,94,248,188,40,178,150,67,33,135,251,156,251,147,48,2,59,222,218,60,43,181,244,172,56,151,64,252,17,198,18,45,183,199,201,113,97,131,235,46,92,15,60,175,142,103,114,128,94,110,208,161,93,183,114,229,36,111,85,251,45,143,6,198,92,190,201,199,99,249,94,235,14,247,67,244,200,59,163,57,35,178,122,98,129,120,203,238,153,152,96,61,200,160,66,92,203,73,169,142,20,128,93,242,85,197,165,134,244,21,89,86,84,231,210,161,250,96,35,220,5,76,150,240,155,114,179,85,40,27,243,184,123,144,54,194,110,66,43,115,160,245,208,170,84,108,109,180,10,118,13,173,201,126,30,68,90,230,73,235,160,44,225,214,16,202,60,224,65,108,42,67,90,7,149,130,184,208,218,4,113,82,197,186,180,37,195,115,80,111,220,3,12,225,150,219,23,250,195,16,53,27,32,249,75,143,26,133,28,84,46,165,88,180,238,114,91,74,200,207,186,231,32,191,103,219,231,240,99,135,52,12,189,116,206,175,196,207,242,141,151,18,122,115,180,137,201,207,124,156,106,251,8,52,67,124,9,129,58,180,201,136,210,3,83,34,13,225,75,180,148,45,135,62,139,113,228,6,43,178,37,182,5,177,221,249,249,38,190,59,227,169,53,158,50,52,248,1,124,146,12,104,251,218,204,231,239,249,251,86,232,62,135,16,114,163,235,81,7,80,236,42,90,47,134,52,216,237,133,160,207,97,29,185,118,249,127,54,226,24,17,87,226,238,179,37,79,216,72,67,97,197,170,69,61,54,165,200,124,3,186,232,16,34,9,206,48,0,232,246,243,67,109,142,251,57,196,12,201,89,126,30,156,113,248,233,133,248,35,134,31,231,253,50,222,51,254,193,68,124,52,143,15,196,165,77,241,224,93,77,64,123,9,9,215,194,211,211,124,132,188,169,100,65,226,121,171,76,98,218,225,184,77,190,220,105,98,104,67,63,251,139,46,173,61,194,117,123,205,32,155,196,82,135,248,152,35,40,251,190,44,248,245,156,136,82,170,77,157,60,156,85,35,22,12,59,207,25,223,84,228,184,168,26,146,2,79,103,28,14,250,186,36,23,57,36,68,230,219,41,199,85,111,20,52,84,220,169,46,202,84,170,34,25,24,30,96,125,255,225,12,75,184,207,117,215,124,10,54,0,89,35,111,43,204,48,233,207,52,196,241,161,65,72,241,211,221,95,165,128,86,102,76,167,195,51,74,54,58,173,255,28,111,185,255,233,219,191,90,237,150,255,163,235,62,239,104,141,185,155,241,207,73,214,43,208,232,204,194,152,46,119,206,1,5,64,128,203,221,115,47,131,201,66,76,112,183,135,13,160,152,189,51,234,79,61,169,15,54,157,131,48,129,250,137,107,145,45,211,230,153,136,197,38,30,221,122,88,125,82,24,85,230,62,225,26,132,242,247,194,147,169,213,75,12,53,95,39,153,204,174,26,36,2,149,27,164,128,126,113,187,25,116,18,31,110,4,24,133,193,116,143,164,220,180,149,170,27,33,245,213,131,45,135,181,176,0,0,96,67,30,23,91,142,171,76,199,70,80,72,8,17,82,96,0,48,31,101,29,55,211,3,40,81,49,254,154,182,226,172,42,29,212,247,220,67,219,107,63,78,65,238,192,44,115,35,32,248,0,247,184,150,50,162,244,105,161,41,130,49,41,210,40,64,93,34,77,213,188,74,55,230,45,247,210,186,42,197,81,122,133,62,15,170,147,218,42,252,130,95,94,160,149,244,12,171,220,231,14,244,97,26,27,191,130,120,1,203,220,27,144,17,252,135,92,171,78,100,249,113,6,129,48,149,27,227,66,119,247,165,246,105,34,242,57,36,195,217,173,38,149,75,66,194,160,240,65,31,112,197,88,5,170,118,48,172,68,166,240,145,44,152,134,177,184,249,128,145,131,154,58,119,35,104,111,163,85,182,66,97,68,57,9,179,217,53,207,68,27,63,144,118,20,155,29,252,80,26,50,1,112,198,254,48,75,174,33,16,184,64,35,128,233,192,197,60,139,208,104,134,53,209,6,163,154,39,17,196,21,201,165,202,188,205,45,4,23,253,6,105,243,30,152,33,43,159,209,159,52,177,230,196,134,226,95,149,217,184,247,113,242,254,73,151,230,197,51,190,135,15,19,116,53,119,75,69,14,24,46,8,178,199,177,254,133,113,225,60,19,228,74,245,155,230,163,142,52,212,159,71,224,190,251,76,164,73,222,201,195,113,50,237,136,60,197,93,154,23,179,144,118,36,93,64,31,104,143,104,255,64,71,146,215,132,25,43,58,129,88,194,172,45,131,85,116,169,87,12,5,113,151,244,190,18,102,40,158,99,134,35,231,94,39,178,158,243,225,61,86,214,228,123,110,249,9,201,41,213,9,90,16,29,193,109,130,188,173,55,97,6,66,101,95,109,143,205,39,0,234,185,159,233,30,254,165,185,26,98,129,207,108,145,191,191,103,191,62,138,178,86,141,35,145,31,101,96,146,90,252,74,1,137,183,221,237,254,200,253,220,85,14,245,24,77,186,184,126,137,224,240,115,157,31,11,127,74,125,32,90,86,191,35,21,122,151,21,110,29,115,97,123,165,161,109,237,80,247,205,6,117,183,211,170,60,215,91,213,87,244,174,15,201,90,104,91,49,166,80,81,88,214,240,37,133,113,96,63,251,17,191,153,237,212,40,41,183,201,47,225,149,139,0,205,24,99,212,252,101,14,46,213,203,10,170,156,2,94,152,82,184,228,193,94,87,134,13,75,31,198,98,176,1,62,222,250,252,153,32,246,156,41,72,11,85,77,61,42,88,255,195,163,226,233,63,92,170,218,225,135,106,39,186,16,223,152,9,80,21,28,28,136,85,174,71,2,194,229,12,160,250,249,91,37,182,171,126,59,39,109,71,158,242,152,128,72,131,114,66,123,84,53,45,14,209,6,79,190,150,184,238,131,196,41,102,53,17,39,233,110,36,46,73,45,218,200,244,85,190,172,55,158,14,13,116,181,190,83,57,176,193,209,229,143,134,32,47,5,65,104,45,25,143,141,46,230,0,114,200,192,250,162,49,72,195,79,2,254,189,173,1,37,147,9,72,26,128,194,207,254,192,20,20,157,214,246,143,186,145,62,161,196,218,70,40,191,120,33,81,33,205,5,239,216,160,211,161,107,87,199,91,119,32,120,100,40,251,90,10,237,111,205,49,130,77,112,39,46,248,184,114,136,28,173,60,204,76,225,227,134,100,162,3,100,123,161,250,206,211,86,213,31,108,108,235,38,240,26,43,219,112,110,171,40,30,63,174,35,32,77,145,202,231,24,45,148,79,51,126,221,150,227,194,41,161,85,249,229,16,235,110,1,252,150,83,49,76,110,192,134,107,38,86,202,93,250,97,8,178,212,211,243,86,70,87,50,167,20,103,213,119,105,175,162,123,14,206,207,230,174,208,68,155,83,56,138,70,145,169,204,136,234,219,171,198,125,234,169,67,137,191,100,4,85,252,87,129,180,214,14,214,6,169,245,175,14,13,19,62,18,103,8,82,212,6,36,96,187,86,210,231,182,209,129,84,165,162,231,45,13,186,162,94,109,202,163,26,201,174,192,106,84,76,157,236,96,35,126,55,10,143,224,85,135,64,129,81,124,132,71,114,168,10,13,242,198,123,96,24,118,64,230,76,67,101,13,86,150,122,86,149,105,28,64,237,184,122,180,42,199,92,151,149,152,107,134,24,234,42,203,193,49,28,4,165,110,78,247,76,191,210,230,153,166,165,180,216,31,66,200,43,251,223,195,52,191,185,126,238,53,152,53,147,2,23,153,73,206,17,178,89,19,225,65,183,207,15,159,245,249,214,150,107,50,226,50,93,214,28,220,60,140,194,193,33,87,103,15,61,82,43,8,212,217,36,229,156,22,38,208,191,29,118,56,132,177,240,134,67,153,121,211,16,42,120,128,249,140,87,231,94,37,2,21,93,195,119,106,90,81,82,224,200,50,246,210,108,161,209,242,106,193,1,213,7,206,61,251,145,244,16,16,65,122,102,177,119,115,217,54,153,165,72,93,250,183,23,34,31,92,61,212,139,135,208,190,176,107,223,149,37,102,179,254,0,13,96,11,50,220,123,214,3,251,157,39,89,241,26,107,213,61,250,188,208,241,146,88,10,205,139,241,184,87,77,98,10,95,206,9,229,227,111,240,140,16,249,0,220,186,132,247,154,18,175,94,3,191,77,201,225,255,181,186,55,103,188,61,121,209,126,221,109,63,59,191,219,246,158,44,126,63,83,151,123,11,247,135,142,251,188,101,16,64,170,212,61,196,212,85,28,6,251,123,123,187,123,207,91,149,114,84,107,99,219,69,103,218,171,61,150,235,206,67,220,131,69,27,120,113,113,72,111,227,234,222,116,241,172,22,220,157,213,189,121,13,255,56,56,153,238,247,128,81,229,190,185,194,68,209,220,168,100,117,243,112,110,214,230,98,126,197,224,255,118,193,135,185,195,194,113,224,208,94,222,83,188,29,108,122,113,160,53,187,175,190,215,108,44,30,203,53,63,147,20,110,110,197,168,55,165,110,109,226,86,5,126,137,107,114,149,5,77,192,138,234,37,124,189,41,199,214,51,68,238,96,253,85,2,183,192,45,21,147,27,160,126,122,117,108,64,233,69,181,121,212,176,216,138,192,84,205,178,50,98,134,187,104,30,28,116,13,16,68,121,248,141,24,216,94,201,3,226,104,57,122,9,223,41,63,37,109,92,61,131,212,1,235,24,67,76,241,224,61,93,156,170,32,43,143,178,194,213,96,142,195,195,133,75,199,227,229,242,43,244,161,181,54,131,28,46,109,70,171,229,79,8,163,112,199,211,227,199,45,94,27,81,121,248,137,226,48,94,182,81,85,37,92,188,165,137,166,69,83,72,240,185,89,65,5,123,216,184,197,31,191,125,246,241,234,121,29,153,181,232,141,76,107,124,123,197,114,248,3,203,205,122,161,121,208,180,182,140,184,226,108,178,243,68,47,51,55,35,110,88,112,86,78,34,198,79,27,28,214,25,48,186,210,108,125,128,166,213,196,68,5,126,241,250,173,212,200,239,101,137,156,202,23,180,134,44,57,85,141,155,99,205,212,72,65,144,102,195,20,122,172,165,42,102,175,45,179,149,171,149,108,38,191,157,20,32,246,245,29,111,205,107,80,40,62,210,107,13,40,195,60,236,232,187,133,22,46,137,26,188,176,181,255,239,15,17,110,43,72,185,185,237,59,208,135,247,15,109,168,53,148,223,167,10,15,1,249,147,180,66,161,173,35,147,92,123,144,166,213,34,90,100,16,217,160,128,202,173,212,127,88,97,212,142,251,239,79,232,132,71,185,164,244,149,68,81,87,162,234,102,21,10,97,154,183,1,213,37,13,119,2,217,182,18,92,9,95,72,87,167,159,105,199,183,142,131,89,242,135,210,227,45,167,17,121,155,206,49,98,214,113,70,86,8,173,22,158,108,42,42,215,148,160,233,85,191,114,243,98,232,214,91,242,249,112,22,22,173,165,58,103,83,218,209,176,50,236,79,121,94,75,43,220,229,117,102,204,129,245,177,34,114,171,162,77,129,200,66,30,65,200,243,34,203,248,109,11,199,56,158,143,68,109,145,84,250,85,113,38,75,243,231,102,113,231,57,189,5,249,183,124,155,227,14,148,116,158,79,77,208,217,51,239,4,103,220,83,79,207,173,167,234,145,39,22,222,221,2,87,250,203,45,38,193,5,45,202,81,2,173,3,51,45,41,204,215,85,157,166,196,225,7,220,110,83,91,204,197,37,69,31,4,15,39,226,110,217,6,247,206,206,23,94,97,85,206,191,227,170,109,129,209,191,181,39,82,131,150,50,70,149,27,248,141,41,45,174,92,234,164,101,41,179,69,77,105,150,25,5,187,105,234,155,178,162,149,226,190,146,20,235,116,183,149,171,98,208,237,48,164,5,140,230,26,159,181,220,65,31,255,211,218,70,120,137,121,102,145,36,232,255,90,119,105,4,174,27,143,146,129,60,39,73,33,224,194,131,195,106,89,159,9,173,28,185,57,146,135,49,164,51,50,207,92,96,202,169,50,110,153,187,234,186,206,35,245,81,76,165,8,211,184,22,233,86,182,140,181,26,18,117,204,161,203,195,95,48,49,40,115,132,33,22,175,229,161,153,234,172,8,176,199,150,105,50,20,87,31,171,87,228,25,166,208,164,118,208,73,123,41,111,156,90,95,181,115,188,234,211,70,73,20,241,52,55,143,121,118,137,199,67,235,115,60,77,243,224,16,235,172,198,243,103,109,60,244,205,25,200,197,15,28,64,120,73,82,13,195,132,126,3,86,233,78,115,8,224,232,32,165,63,222,108,246,240,49,72,92,170,99,164,115,71,245,41,213,29,167,122,176,53,87,238,165,202,94,57,64,182,60,224,165,84,14,219,225,23,157,172,108,229,76,70,241,171,156,149,10,82,101,107,93,147,7,90,106,76,66,85,3,77,117,49,153,60,210,229,224,254,253,142,84,48,39,149,146,44,28,84,75,245,134,127,37,50,13,205,20,113,44,236,116,18,142,83,239,209,44,71,230,125,6,198,214,18,65,92,137,109,131,215,73,147,116,158,234,8,133,30,138,27,160,101,44,198,58,26,24,200,163,125,42,83,63,226,25,157,39,109,209,93,206,74,229,60,221,250,164,16,237,109,121,238,222,90,51,83,121,65,79,207,11,121,91,97,152,28,95,46,82,158,113,60,205,196,144,19,94,133,82,23,151,231,145,74,205,170,136,173,138,1,182,121,89,131,60,221,93,17,70,38,136,62,206,83,70,104,133,0,25,148,235,98,104,155,197,113,133,73,194,103,175,213,227,21,120,112,41,107,105,83,117,35,26,217,179,93,87,132,159,232,113,9,29,43,10,246,149,220,59,44,127,130,14,174,48,145,196,89,83,114,176,251,224,103,11,117,197,111,231,179,246,174,137,230,41,167,55,117,53,25,255,214,54,44,13,94,169,239,43,198,85,49,181,182,60,149,178,170,2,90,149,50,149,224,16,56,185,45,252,154,89,0,206,35,250,144,98,58,31,226,103,20,3,147,231,52,218,42,36,249,73,117,32,246,174,36,66,83,249,228,67,114,159,198,54,26,21,94,118,57,188,198,31,23,120,51,153,23,221,131,103,244,235,217,118,149,15,234,219,20,103,64,197,84,51,152,213,153,148,126,225,79,200,152,170,37,215,135,54,168,111,131,66,202,133,157,192,172,204,13,216,246,31,202,133,190,142,130,29,192,183,243,23,226,3,17,102,187,127,33,62,144,63,182,110,49,134,85,164,179,148,69,41,122,223,131,154,61,160,102,239,111,67,205,62,80,179,255,183,161,230,41,80,243,244,111,67,205,1,80,115,240,23,202,105,23,240,189,136,162,106,105,161,242,179,217,182,90,102,144,106,96,131,143,144,197,131,11,196,12,174,201,18,90,161,211,138,239,88,212,89,38,75,17,84,53,90,111,142,167,20,61,3,76,39,74,167,114,79,140,164,98,227,149,129,18,153,107,57,48,12,103,108,142,161,119,176,3,64,24,250,207,63,253,86,137,126,236,238,224,67,170,189,95,190,60,93,217,89,57,29,19,46,25,139,95,197,182,245,0,140,165,23,86,118,54,130,107,245,151,39,3,176,14,251,233,224,222,247,200,29,214,222,123,182,141,239,237,212,67,148,251,132,106,85,208,177,189,115,143,11,47,85,175,226,172,225,183,103,134,180,46,142,233,222,224,151,57,136,13,252,254,90,26,247,107,41,95,185,127,100,101,131,218,88,210,156,197,45,239,130,42,69,86,253,90,98,229,10,146,87,179,203,10,107,190,142,75,39,102,47,221,55,51,75,218,43,157,32,211,6,22,102,109,93,97,75,155,246,36,233,178,39,30,220,140,22,171,250,140,223,64,60,211,173,61,213,113,14,60,255,54,62,41,105,106,12,1,191,130,101,180,231,136,157,150,59,246,190,153,115,214,211,165,191,227,177,54,99,237,173,131,127,14,103,191,78,189,129,23,229,134,195,111,98,13,129,89,111,240,114,255,226,247,30,246,87,9,3,237,55,250,3,3,45,221,85,237,207,26,169,204,222,14,7,204,54,47,86,217,207,107,240,88,252,169,46,95,43,191,187,156,32,72,139,222,172,59,76,158,229,191,210,50,27,123,131,32,238,171,195,45,199,92,246,222,49,9,94,61,161,205,2,23,164,13,206,224,55,252,85,58,118,233,124,136,185,235,98,196,212,244,62,100,49,237,199,150,65,193,123,188,174,97,91,123,100,114,239,246,125,168,82,30,102,15,151,177,230,185,42,99,29,67,247,111,36,70,125,62,124,15,45,243,120,29,106,236,143,136,217,39,122,165,62,25,24,9,164,240,59,189,95,142,191,70,190,148,60,89,175,212,255,176,203,3,85,223,122,244,137,215,234,156,170,251,166,7,55,148,38,243,92,9,67,197,133,55,49,135,232,105,170,204,218,47,82,85,222,81,33,172,138,13,254,56,233,140,190,54,158,132,55,75,210,44,110,138,117,233,215,162,86,11,158,109,35,165,177,212,188,65,169,133,223,193,108,252,117,233,4,78,194,253,69,214,7,18,8,86,221,244,87,141,131,191,141,41,77,101,169,255,33,249,151,107,216,169,16,227,11,53,188,239,169,1,39,8,248,59,170,192,61,212,19,127,254,10,233,95,74,131,240,109,42,9,54,174,24,90,66,193,35,90,111,215,75,6,227,144,71,201,229,146,153,228,81,123,117,75,99,173,87,54,173,181,52,38,55,43,75,46,66,94,50,11,205,251,206,224,49,157,78,213,47,217,50,221,169,98,80,147,170,86,80,153,220,48,140,33,208,78,179,18,232,125,1,15,6,69,204,14,140,112,21,183,129,159,114,117,119,112,88,208,161,121,229,62,6,164,232,176,144,127,122,167,200,240,210,84,173,95,29,118,224,14,159,224,65,222,199,73,86,152,7,199,89,130,181,148,136,169,207,253,76,67,185,194,86,247,241,181,63,147,40,235,10,181,13,218,107,251,121,153,85,35,62,60,133,3,175,228,0,232,207,66,53,12,94,111,218,198,174,242,15,12,117,104,236,240,27,249,242,80,50,105,102,103,240,56,30,230,105,191,38,185,181,197,137,127,62,145,45,151,29,215,146,213,101,46,173,19,209,147,224,202,5,53,218,4,110,115,182,86,223,147,91,20,86,133,147,102,219,208,137,236,246,181,147,108,74,78,120,6,19,163,159,237,107,158,209,199,149,242,142,254,76,151,218,241,83,249,36,97,173,169,88,122,77,125,3,209,48,29,79,6,167,178,35,83,71,150,177,22,29,74,139,123,142,245,1,230,46,204,202,19,75,24,107,103,155,173,26,100,185,168,88,95,195,251,231,147,223,165,69,201,175,50,185,13,114,224,96,252,254,74,125,238,203,52,255,216,48,140,121,22,226,49,168,242,148,120,193,76,85,208,250,139,96,250,91,215,135,191,114,5,103,17,22,191,204,135,76,63,96,248,57,24,26,63,159,149,75,186,156,197,214,87,213,67,72,19,113,243,9,157,217,40,191,166,118,150,150,127,29,245,231,36,125,202,65,224,191,225,224,29,255,34,88,62,207,228,9,181,52,146,91,125,130,248,60,197,113,210,121,161,156,178,181,148,14,210,68,128,208,35,99,244,7,73,54,96,26,6,134,199,242,220,228,48,198,206,188,8,135,116,102,176,58,129,104,68,71,158,170,109,67,140,190,140,245,217,155,137,60,241,120,74,27,107,114,15,198,44,207,118,36,114,232,47,158,16,200,79,39,63,73,170,229,252,85,172,70,71,207,132,195,228,158,42,60,34,36,7,67,33,226,145,20,46,185,17,150,103,5,153,132,54,74,85,205,182,76,194,200,212,73,232,26,249,163,13,90,218,108,135,84,89,225,126,171,84,51,67,75,130,39,255,250,227,215,69,169,43,244,226,37,234,140,149,116,222,99,235,236,189,5,255,220,234,191,174,214,35,71,234,223,198,235,247,166,25,25,101,117,150,72,25,253,216,6,184,126,96,68,157,219,213,15,235,29,2,248,150,158,45,195,211,133,60,89,176,186,31,146,222,80,32,215,124,12,168,229,5,40,115,254,132,228,42,92,97,36,40,15,107,48,56,228,107,31,165,221,97,175,136,127,235,129,50,127,19,226,130,23,43,192,189,79,104,11,138,130,151,102,226,62,120,106,106,232,52,78,138,46,202,24,179,214,29,191,175,13,228,193,12,214,251,184,151,22,79,100,112,6,191,134,96,39,65,208,164,81,173,110,240,106,132,138,76,174,158,254,80,26,253,234,14,151,135,163,137,255,105,37,111,222,72,243,191,88,217,31,14,67,15,167,187,70,131,236,191,20,171,183,15,49,43,174,221,45,23,240,58,214,14,61,53,219,101,36,234,211,54,220,250,76,165,89,40,237,196,18,224,170,140,173,36,232,35,40,50,158,252,95,165,168,234,220,74,178,190,202,185,165,15,250,55,21,3,252,17,207,150,54,6,217,127,35,241,111,218,175,247,191,88,248,87,120,58,185,39,210,108,67,124,216,225,149,69,187,234,223,28,174,46,79,52,87,202,73,4,102,204,250,248,188,86,94,82,127,158,76,74,55,207,238,89,37,248,70,4,84,109,170,28,145,8,98,1,143,232,244,121,38,247,168,55,213,222,255,54,210,217,81,197,8,244,81,131,255,15,187,172,205,17,152,135,0,0}; \ No newline at end of file From e82539f41f4f891faf5aa3d9a0613d5e7552d7d8 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Fri, 25 May 2018 00:50:43 -0700 Subject: [PATCH 08/23] fix reversed range for color temp --- lib/MiLight/FUT091PacketFormatter.cpp | 6 ++---- lib/MiLight/V2PacketFormatter.cpp | 16 ++++++++++++---- lib/MiLight/V2PacketFormatter.h | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/MiLight/FUT091PacketFormatter.cpp b/lib/MiLight/FUT091PacketFormatter.cpp index cc574348..f428379b 100644 --- a/lib/MiLight/FUT091PacketFormatter.cpp +++ b/lib/MiLight/FUT091PacketFormatter.cpp @@ -7,7 +7,7 @@ void FUT091PacketFormatter::updateBrightness(uint8_t value) { } void FUT091PacketFormatter::updateTemperature(uint8_t value) { - command(static_cast(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, 0xCD, 2)); + command(static_cast(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, 0xCD, 2, false)); } void FUT091PacketFormatter::enableNightMode() { @@ -42,10 +42,8 @@ BulbId FUT091PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& res } else if (command == (uint8_t)FUT091Command::BRIGHTNESS) { uint8_t level = V2PacketFormatter::fromv2scale(arg, 0x97, 2); result["brightness"] = Units::rescale(level, 255, 100); - // saturation == kelvin. arg ranges are the same, so can't distinguish - // without using state } else if (command == (uint8_t)FUT091Command::KELVIN) { - uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2); + uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2, false); result["color_temp"] = Units::whiteValToMireds(kelvin, 100); } else { result["button_id"] = command; diff --git a/lib/MiLight/V2PacketFormatter.cpp b/lib/MiLight/V2PacketFormatter.cpp index 01172332..41cb84fa 100644 --- a/lib/MiLight/V2PacketFormatter.cpp +++ b/lib/MiLight/V2PacketFormatter.cpp @@ -104,10 +104,18 @@ void V2PacketFormatter::switchMode(GroupState currentState, BulbMode desiredMode } -uint8_t V2PacketFormatter::tov2scale(uint8_t value, uint8_t endValue, uint8_t interval) { - return ((100 - value) * interval) + endValue; +uint8_t V2PacketFormatter::tov2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse) { + if (reverse) { + value = 100 - value; + } + + return (value * interval) + endValue; } -uint8_t V2PacketFormatter::fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval) { - return 100 - (((value + (0x100 - endValue))%0x100) / 2); +uint8_t V2PacketFormatter::fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse) { + value = (((value + (0x100 - endValue))%0x100) / interval); + if (reverse) { + value = 100 - value; + } + return value; } \ No newline at end of file diff --git a/lib/MiLight/V2PacketFormatter.h b/lib/MiLight/V2PacketFormatter.h index a556728e..1e231d90 100644 --- a/lib/MiLight/V2PacketFormatter.h +++ b/lib/MiLight/V2PacketFormatter.h @@ -33,8 +33,8 @@ class V2PacketFormatter : public PacketFormatter { * 0x8F, 0x8D, ..., 0, 0x2, ..., 0x20 * This is a parameterized method to convert from [0, 100] TO this scale */ - static uint8_t tov2scale(uint8_t value, uint8_t endValue, uint8_t interval); - static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval); + static uint8_t tov2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true); + static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true); protected: const uint8_t protocolId; From 69a27650653a56d82de08dfdeed34ed45b5468a1 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sat, 26 May 2018 00:58:32 -0700 Subject: [PATCH 09/23] add buffer --- lib/MiLight/FUT091PacketFormatter.cpp | 11 +++++++---- lib/MiLight/V2PacketFormatter.cpp | 11 ++++++++++- lib/MiLight/V2PacketFormatter.h | 9 ++++++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/MiLight/FUT091PacketFormatter.cpp b/lib/MiLight/FUT091PacketFormatter.cpp index f428379b..dda92f7e 100644 --- a/lib/MiLight/FUT091PacketFormatter.cpp +++ b/lib/MiLight/FUT091PacketFormatter.cpp @@ -2,12 +2,15 @@ #include #include +static const uint8_t BRIGHTNESS_SCALE_MAX = 0x97; +static const uint8_t KELVIN_SCALE_MAX = 0xCD; + void FUT091PacketFormatter::updateBrightness(uint8_t value) { - command(static_cast(FUT091Command::BRIGHTNESS), V2PacketFormatter::tov2scale(value, 0x97, 2)); + command(static_cast(FUT091Command::BRIGHTNESS), V2PacketFormatter::tov2scale(value, BRIGHTNESS_SCALE_MAX, 2)); } void FUT091PacketFormatter::updateTemperature(uint8_t value) { - command(static_cast(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, 0xCD, 2, false)); + command(static_cast(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, KELVIN_SCALE_MAX, 2, false)); } void FUT091PacketFormatter::enableNightMode() { @@ -40,10 +43,10 @@ BulbId FUT091PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& res bulbId.groupId = arg-5; } } else if (command == (uint8_t)FUT091Command::BRIGHTNESS) { - uint8_t level = V2PacketFormatter::fromv2scale(arg, 0x97, 2); + uint8_t level = V2PacketFormatter::fromv2scale(arg, BRIGHTNESS_SCALE_MAX, 2, true, 0x13); result["brightness"] = Units::rescale(level, 255, 100); } else if (command == (uint8_t)FUT091Command::KELVIN) { - uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2, false); + uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, KELVIN_SCALE_MAX, 2, false, 0x13); result["color_temp"] = Units::whiteValToMireds(kelvin, 100); } else { result["button_id"] = command; diff --git a/lib/MiLight/V2PacketFormatter.cpp b/lib/MiLight/V2PacketFormatter.cpp index 41cb84fa..b3737185 100644 --- a/lib/MiLight/V2PacketFormatter.cpp +++ b/lib/MiLight/V2PacketFormatter.cpp @@ -112,10 +112,19 @@ uint8_t V2PacketFormatter::tov2scale(uint8_t value, uint8_t endValue, uint8_t in return (value * interval) + endValue; } -uint8_t V2PacketFormatter::fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse) { +uint8_t V2PacketFormatter::fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse, uint8_t buffer) { value = (((value + (0x100 - endValue))%0x100) / interval); if (reverse) { value = 100 - value; } + if (value > 100) { + // overflow + if (value <= (100 + buffer)) { + value = 100; + // underflow (value is unsigned) + } else { + value = 0; + } + } return value; } \ No newline at end of file diff --git a/lib/MiLight/V2PacketFormatter.h b/lib/MiLight/V2PacketFormatter.h index 1e231d90..531cc1ef 100644 --- a/lib/MiLight/V2PacketFormatter.h +++ b/lib/MiLight/V2PacketFormatter.h @@ -34,7 +34,14 @@ class V2PacketFormatter : public PacketFormatter { * This is a parameterized method to convert from [0, 100] TO this scale */ static uint8_t tov2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true); - static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true); + + /* + * Method to convert FROM the scale described above to [0, 100]. + * + * An extra parameter is exposed: `buffer`, which allows for a range of values before/after the + * max that will be mapped to 0 and 100, respectively. + */ + static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true, uint8_t buffer = 0); protected: const uint8_t protocolId; From 83efc2acfcd67a358ded8c09fe513947015a3166 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Mon, 28 May 2018 12:11:23 -0700 Subject: [PATCH 10/23] correct range --- lib/MiLight/FUT091PacketFormatter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/MiLight/FUT091PacketFormatter.cpp b/lib/MiLight/FUT091PacketFormatter.cpp index dda92f7e..e511010a 100644 --- a/lib/MiLight/FUT091PacketFormatter.cpp +++ b/lib/MiLight/FUT091PacketFormatter.cpp @@ -3,7 +3,7 @@ #include static const uint8_t BRIGHTNESS_SCALE_MAX = 0x97; -static const uint8_t KELVIN_SCALE_MAX = 0xCD; +static const uint8_t KELVIN_SCALE_MAX = 0xC5; void FUT091PacketFormatter::updateBrightness(uint8_t value) { command(static_cast(FUT091Command::BRIGHTNESS), V2PacketFormatter::tov2scale(value, BRIGHTNESS_SCALE_MAX, 2)); From 0f7c2578890e7b8456a4e69ef705f7ed9f570e8e Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Wed, 30 May 2018 12:53:36 -0700 Subject: [PATCH 11/23] Add LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..35e397f0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Chris Mullins + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 80c84de66beab465116b8583c2793ab37f1f8897 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Wed, 30 May 2018 23:27:50 -0700 Subject: [PATCH 12/23] Apply patched updates to individual groups when updating group 0 (fixes #284) (#287) * Set up unit tests * Add method to patch state with set fields from another state * add methods to help with test * Patch member state with virtual "all groups" state instead of clobbering it * Don't persist group 0 state, except for devices that don't have groups * Stateful brightness for RGB --- lib/MiLight/RgbPacketFormatter.cpp | 10 +- lib/MiLightState/GroupState.cpp | 49 ++++++ lib/MiLightState/GroupState.h | 15 +- lib/MiLightState/GroupStateStore.cpp | 21 ++- src/main.cpp | 4 + test/d1_mini/test_state.cpp | 252 +++++++++++++++++++++++++++ 6 files changed, 345 insertions(+), 6 deletions(-) create mode 100644 test/d1_mini/test_state.cpp diff --git a/lib/MiLight/RgbPacketFormatter.cpp b/lib/MiLight/RgbPacketFormatter.cpp index 55b81b59..d5708135 100644 --- a/lib/MiLight/RgbPacketFormatter.cpp +++ b/lib/MiLight/RgbPacketFormatter.cpp @@ -47,11 +47,15 @@ void RgbPacketFormatter::updateColorRaw(uint8_t value) { } void RgbPacketFormatter::updateBrightness(uint8_t value) { + const GroupState& state = this->stateStore->get(deviceId, groupId, MiLightRemoteType::REMOTE_TYPE_RGB); + int8_t knownValue = state.isSetBrightness() ? state.getBrightness() : -1; + valueByStepFunction( &PacketFormatter::increaseBrightness, &PacketFormatter::decreaseBrightness, RGB_INTERVALS, - value / RGB_INTERVALS + value / RGB_INTERVALS, + knownValue / RGB_INTERVALS ); } @@ -104,6 +108,10 @@ BulbId RgbPacketFormatter::parsePacket(const uint8_t* packet, JsonObject& result result["command"] = "mode_speed_down"; } else if (command == RGB_SPEED_UP) { result["command"] = "mode_speed_up"; + } else if (command == RGB_BRIGHTNESS_DOWN) { + result["command"] = "brightness_down"; + } else if (command == RGB_BRIGHTNESS_UP) { + result["command"] = "brightness_up"; } else { result["button_id"] = command; } diff --git a/lib/MiLightState/GroupState.cpp b/lib/MiLightState/GroupState.cpp index a95bb46f..1f26de25 100644 --- a/lib/MiLightState/GroupState.cpp +++ b/lib/MiLightState/GroupState.cpp @@ -4,6 +4,15 @@ #include const BulbId DEFAULT_BULB_ID; +static const GroupStateField ALL_PHYSICAL_FIELDS[] = { + GroupStateField::BRIGHTNESS, + GroupStateField::BULB_MODE, + GroupStateField::HUE, + GroupStateField::KELVIN, + GroupStateField::MODE, + GroupStateField::SATURATION, + GroupStateField::STATE +}; // Number of units each increment command counts for static const uint8_t INCREMENT_COMMAND_VALUE = 10; @@ -89,6 +98,36 @@ GroupState::GroupState() { scratchpad.fields._kelvinScratch = 0; } +GroupState& GroupState::operator=(const GroupState& other) { + memcpy(state.rawData, other.state.rawData, DATA_LONGS * sizeof(uint32_t)); + scratchpad.rawData = other.scratchpad.rawData; +} + +GroupState::GroupState(const GroupState& other) { + memcpy(state.rawData, other.state.rawData, DATA_LONGS * sizeof(uint32_t)); + scratchpad.rawData = other.scratchpad.rawData; +} + +bool GroupState::operator==(const GroupState& other) const { + return memcmp(state.rawData, other.state.rawData, DATA_LONGS * sizeof(uint32_t)) == 0; +} + +bool GroupState::isEqualIgnoreDirty(const GroupState& other) const { + GroupState meCopy = *this; + GroupState otherCopy = other; + + meCopy.clearDirty(); + meCopy.clearMqttDirty(); + otherCopy.clearDirty(); + otherCopy.clearMqttDirty(); + + return meCopy == otherCopy; +} + +void GroupState::print(Stream& stream) const { + stream.printf("State: %08X %08X\n", state.rawData[0], state.rawData[1]); +} + bool GroupState::isSetField(GroupStateField field) const { switch (field) { case GroupStateField::COMPUTED_COLOR: @@ -492,6 +531,16 @@ bool GroupState::applyIncrementCommand(GroupStateField field, IncrementDirection return false; } +bool GroupState::patch(const GroupState& other) { + for (size_t i = 0; i < size(ALL_PHYSICAL_FIELDS); ++i) { + GroupStateField field = ALL_PHYSICAL_FIELDS[i]; + + if (other.isSetField(field)) { + setFieldValue(field, other.getFieldValue(field)); + } + } +} + /* Update group state to reflect a packet state diff --git a/lib/MiLightState/GroupState.h b/lib/MiLightState/GroupState.h index 02020b26..6ade659f 100644 --- a/lib/MiLightState/GroupState.h +++ b/lib/MiLightState/GroupState.h @@ -46,6 +46,13 @@ class GroupState { public: GroupState(); + GroupState(const GroupState& other); + GroupState& operator=(const GroupState& other); + + bool operator==(const GroupState& other) const; + bool isEqualIgnoreDirty(const GroupState& other) const; + void print(Stream& stream) const; + bool isSetField(GroupStateField field) const; uint16_t getFieldValue(GroupStateField field) const; @@ -108,6 +115,12 @@ class GroupState { inline bool setMqttDirty(); bool clearMqttDirty(); + // Patches this state with ONLY the set fields in the other. Returns + // true if there were any changes. + bool patch(const GroupState& other); + + // Patches this state with the fields defined in the JSON state. Returns + // true if there were any changes. bool patch(const JsonObject& state); // It's a little weird to need to pass in a BulbId here. The purpose is to @@ -141,7 +154,7 @@ class GroupState { static const GroupState& defaultState(MiLightRemoteType remoteType); private: - static const size_t DATA_LONGS = 3; + static const size_t DATA_LONGS = 2; union StateData { uint32_t rawData[DATA_LONGS]; struct Fields { diff --git a/lib/MiLightState/GroupStateStore.cpp b/lib/MiLightState/GroupStateStore.cpp index d5b40f51..ec04459a 100644 --- a/lib/MiLightState/GroupStateStore.cpp +++ b/lib/MiLightState/GroupStateStore.cpp @@ -13,9 +13,20 @@ GroupState& GroupStateStore::get(const BulbId& id) { if (state == NULL) { trackEviction(); GroupState loadedState = GroupState::defaultState(id.deviceType); - persistence.get(id, loadedState); - state = cache.set(id, loadedState); + // For device types with groups, group 0 is a "virtual" group. All devices paired with the same ID will respond + // to group 0. So it doesn't make sense to store group 0 state by itself. + // + // For devices that don't have groups, we made the unfortunate decision to represent state using the fake group + // ID 0, so we can't always ignore group 0. + const MiLightRemoteConfig* remoteConfig = MiLightRemoteConfig::fromType(id.deviceType); + + if (id.groupId != 0 || remoteConfig == NULL || remoteConfig->numGroups == 0) { + persistence.get(id, loadedState); + state = cache.set(id, loadedState); + } else { + state = &loadedState; + } } return *state; @@ -26,7 +37,7 @@ GroupState& GroupStateStore::get(const uint16_t deviceId, const uint8_t groupId, return get(bulbId); } -// save state for a bulb. If id.groupId == 0, will iternate across all groups +// save state for a bulb. If id.groupId == 0, will iterate across all groups // and individually save each group (recursively) GroupState& GroupStateStore::set(const BulbId &id, const GroupState& state) { GroupState& storedState = get(id); @@ -38,7 +49,9 @@ GroupState& GroupStateStore::set(const BulbId &id, const GroupState& state) { for (size_t i = 1; i <= remote->numGroups; i++) { individualBulb.groupId = i; - set(individualBulb, state); + + GroupState& individualState = get(individualBulb); + individualState.patch(state); } } diff --git a/src/main.cpp b/src/main.cpp index 80aff751..01cf3052 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,3 +1,5 @@ +#ifndef UNIT_TEST + #include #include #include @@ -344,3 +346,5 @@ void loop() { ESP.restart(); } } + +#endif \ No newline at end of file diff --git a/test/d1_mini/test_state.cpp b/test/d1_mini/test_state.cpp new file mode 100644 index 00000000..e765029d --- /dev/null +++ b/test/d1_mini/test_state.cpp @@ -0,0 +1,252 @@ +// #if defined(ARDUINO) && defined(UNIT_TEST) + +#include +#include +#include "unity.h" + +#include +#include +#include +#include + +GroupState color() { + GroupState s; + + s.setState(MiLightStatus::ON); + s.setBulbMode(BulbMode::BULB_MODE_COLOR); + s.setBrightness(100); + s.setHue(1); + s.setSaturation(10); + + return s; +} + +void test_init_state() { + GroupState s; + + TEST_ASSERT_EQUAL(s.getBulbMode(), BulbMode::BULB_MODE_WHITE); + TEST_ASSERT_EQUAL(s.isSetBrightness(), false); +} + +void test_state_updates() { + GroupState s = color(); + + // Make sure values are packed and unpacked correctly + TEST_ASSERT_EQUAL(s.getBulbMode(), BulbMode::BULB_MODE_COLOR); + TEST_ASSERT_EQUAL(s.getBrightness(), 100); + TEST_ASSERT_EQUAL(s.getHue(), 1); + TEST_ASSERT_EQUAL(s.getSaturation(), 10); + + // Make sure brightnesses are tied to mode + s.setBulbMode(BulbMode::BULB_MODE_WHITE); + s.setBrightness(0); + + TEST_ASSERT_EQUAL(s.getBulbMode(), BulbMode::BULB_MODE_WHITE); + TEST_ASSERT_EQUAL(s.getBrightness(), 0); + + s.setBulbMode(BulbMode::BULB_MODE_COLOR); + + TEST_ASSERT_EQUAL(s.getBrightness(), 100); +} + +void test_cache() { + BulbId id1(1, 1, REMOTE_TYPE_FUT089); + BulbId id2(1, 2, REMOTE_TYPE_FUT089); + + GroupState s = color(); + s.clearDirty(); + s.clearMqttDirty(); + + GroupStateCache cache(1); + GroupState* storedState = cache.get(id2); + + TEST_ASSERT_NULL_MESSAGE(storedState, "Should not retrieve value which hasn't been stored"); + + cache.set(id1, s); + storedState = cache.get(id1); + + TEST_ASSERT_NOT_NULL_MESSAGE(storedState, "Should retrieve a value"); + TEST_ASSERT_TRUE_MESSAGE(s == *storedState, "State should be the same when retrieved"); + + cache.set(id2, s); + storedState = cache.get(id2); + + TEST_ASSERT_NOT_NULL_MESSAGE(storedState, "Should retrieve a value"); + TEST_ASSERT_TRUE_MESSAGE(s == *storedState, "State should be the same when retrieved"); + + storedState = cache.get(id1); + + TEST_ASSERT_NULL_MESSAGE(storedState, "Should evict old entry from cache"); +} + +void test_persistence() { + BulbId id1(1, 1, REMOTE_TYPE_FUT089); + BulbId id2(1, 2, REMOTE_TYPE_FUT089); + + GroupStatePersistence persistence; + + persistence.clear(id1); + persistence.clear(id2); + + GroupState storedState; + GroupState s = color(); + s.clearDirty(); + s.clearMqttDirty(); + + GroupState defaultState = GroupState::defaultState(REMOTE_TYPE_FUT089); + + persistence.get(id1, storedState); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(defaultState), "Should start with clean state"); + persistence.get(id2, storedState); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(defaultState), "Should start with clean state"); + + persistence.set(id1, s); + + persistence.get(id2, storedState); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(defaultState), "Should return default for state that hasn't been stored"); + + persistence.get(id1, storedState); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(s), "Should retrieve state from flash without modification"); + + GroupState newState = s; + newState.setBulbMode(BulbMode::BULB_MODE_WHITE); + newState.setBrightness(255); + persistence.set(id2, newState); + + persistence.get(id1, storedState); + + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(s), "Should retrieve unmodified state"); + + persistence.get(id2, storedState); + + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(newState), "Should retrieve modified state"); +} + +void test_store() { + BulbId id1(1, 1, REMOTE_TYPE_FUT089); + BulbId id2(1, 2, REMOTE_TYPE_FUT089); + + // cache 1 item, flush immediately + GroupStateStore store(1, 0); + GroupStatePersistence persistence; + + persistence.clear(id1); + persistence.clear(id2); + + GroupState initState = color(); + GroupState initState2 = color(); + GroupState defaultState = GroupState::defaultState(REMOTE_TYPE_FUT089); + initState2.setBrightness(255); + + GroupState* storedState; + + storedState = &store.get(id2); + TEST_ASSERT_TRUE_MESSAGE(*storedState == defaultState, "Should return default for state that hasn't been stored"); + + store.set(id1, initState); + storedState = &store.get(id1); + + TEST_ASSERT_TRUE_MESSAGE(*storedState == initState, "Should return cached state"); + + store.flush(); + storedState = &store.get(id1); + TEST_ASSERT_FALSE_MESSAGE(storedState->isDirty(), "Should not be dirty after flushing"); + TEST_ASSERT_TRUE_MESSAGE(storedState->isEqualIgnoreDirty(initState), "Should return cached state after flushing"); + + store.set(id2, defaultState); + storedState = &store.get(id2); + TEST_ASSERT_TRUE_MESSAGE(storedState->isEqualIgnoreDirty(defaultState), "Should return cached state"); + + storedState = &store.get(id1); + TEST_ASSERT_TRUE_MESSAGE(storedState->isEqualIgnoreDirty(initState), "Should return persisted state"); +} + +void test_group_0() { + BulbId group0Id(1, 0, REMOTE_TYPE_FUT089); + BulbId id1(1, 1, REMOTE_TYPE_FUT089); + BulbId id2(1, 2, REMOTE_TYPE_FUT089); + + // cache 1 item, flush immediately + GroupStateStore store(10, 0); + GroupStatePersistence persistence; + + persistence.clear(id1); + persistence.clear(id2); + + GroupState initState = color(); + GroupState initState2 = color(); + GroupState defaultState = GroupState::defaultState(REMOTE_TYPE_FUT089); + GroupState storedState; + GroupState expectedState; + GroupState group0State; + + initState2.setBrightness(255); + group0State.setHue(100); + + store.set(id1, initState); + store.set(id2, initState2); + + TEST_ASSERT_FALSE_MESSAGE(group0State.isEqualIgnoreDirty(initState), "group0 state should be different than initState"); + TEST_ASSERT_FALSE_MESSAGE(group0State.isEqualIgnoreDirty(initState2), "group0 state should be different than initState2"); + + storedState = store.get(id1); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(initState), "Should fetch persisted state"); + + storedState = store.get(id2); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(initState2), "Should fetch persisted state"); + + store.set(group0Id, group0State); + + storedState = store.get(id1); + expectedState = initState; + expectedState.setHue(group0State.getHue()); + + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(expectedState), "Saving group 0 should only update changed field"); + + storedState = store.get(id2); + expectedState = initState2; + expectedState.setHue(group0State.getHue()); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(expectedState), "Saving group 0 should only update changed field"); + + // Test that state for group 0 is not persisted + storedState = store.get(group0Id); + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(defaultState), "Group 0 state should not be stored -- should return default state"); + + // Should persist group 0 for device types with 0 groups + BulbId rgbId(1, 0, REMOTE_TYPE_RGB); + GroupState rgbState = GroupState::defaultState(REMOTE_TYPE_RGB); + rgbState.setHue(100); + rgbState.setBrightness(100); + + store.set(rgbId, rgbState); + store.flush(); + + storedState = store.get(rgbId); + + TEST_ASSERT_TRUE_MESSAGE(storedState.isEqualIgnoreDirty(rgbState), "Should persist group 0 for device type with no groups"); +} + +// setup connects serial, runs test cases (upcoming) +void setup() { + delay(2000); + SPIFFS.begin(); + Serial.begin(9600); + + UNITY_BEGIN(); + + RUN_TEST(test_init_state); + RUN_TEST(test_state_updates); + RUN_TEST(test_cache); + RUN_TEST(test_persistence); + RUN_TEST(test_store); + RUN_TEST(test_group_0); + + UNITY_END(); +} + +void loop() { + // nothing to be done here. +} + + +// #endif \ No newline at end of file From 758e1d05422a35ee8d1dd528e7fda4fca65da8c9 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Thu, 31 May 2018 00:18:16 -0700 Subject: [PATCH 13/23] Update README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 826b4956..8ffd1cb4 100644 --- a/README.md +++ b/README.md @@ -264,3 +264,15 @@ You can select between versions 5 and 6 of the UDP protocol (documented [here](h [info-license]: https://github.com/sidoh/esp8266_milight_hub/blob/master/LICENSE [shield-license]: https://img.shields.io/badge/license-MIT-blue.svg + +## Donating + +If the project brings you happiness or utility, it's more than enough for me to hear those words. + +If you're feeling especially generous, and are open to a charitable donation, that'd make me very happy. Here are some whose mission I support (in no particular order): + +* [Water.org](https://www.water.org) +* [Brain & Behavior Research Foundation](https://www.bbrfoundation.org/) +* [Electronic Frontier Foundation](https://www.eff.org/) +* [Girls Who Code](https://girlswhocode.com/) +* [San Francisco Animal Care & Control](http://www.sfanimalcare.org/make-a-donation/) From bf1963a2f094f99a16e841065aa93fea89a14a18 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Sat, 23 Jun 2018 11:23:38 -0700 Subject: [PATCH 14/23] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8ffd1cb4..8aa63a13 100644 --- a/README.md +++ b/README.md @@ -160,14 +160,14 @@ If you'd like to control bulbs in all groups paired with a particular device ID, Turn on group 2 for device ID 0xCD86, set hue to 100, and brightness to 50%: ``` -$ curl --data-binary '{"status":"on","hue":100,"level":50}' -X PUT http://esp8266/gateways/0xCD86/rgbw/2 +$ curl -X PUT -H 'Content-Type: applicaiton/json' -d '{"status":"on","hue":100,"level":50}' http://esp8266/gateways/0xCD86/rgbw/2 true% ``` Set color to white (disable RGB): ``` -$ curl --data-binary '{"command":"set_white"}' -X PUT http://esp8266/gateways/0xCD86/rgbw/2 +$ curl -X PUT -H 'Content-Type: applicaiton/json' -d '{"command":"set_white"}' -X PUT http://esp8266/gateways/0xCD86/rgbw/2 true% ``` From 6d8ea35bec1558557c3328f2e3ff9042b62cc41b Mon Sep 17 00:00:00 2001 From: Ben Krajancic Date: Mon, 25 Jun 2018 08:11:29 +1000 Subject: [PATCH 15/23] Use archive for limitlessled.com/dev as it's offline --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8aa63a13..b0ef6c8a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is a replacement for a Milight/LimitlessLED remote/gateway hosted on an ESP8266. Leverages [Henryk Plötz's awesome reverse-engineering work](https://hackaday.io/project/5888-reverse-engineering-the-milight-on-air-protocol). -[Milight bulbs](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LPRQ4BK/r) are cheap smart bulbs that are controllable with an undocumented 2.4 GHz protocol. In order to control them, you either need a [remote](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LCSALV6/r?th=1) ($13), which allows you to control them directly, or a [WiFi gateway](http://futlight.com/productlist.aspx?typeid=125) ($30), which allows you to control them with a mobile app or a [UDP protocol](http://www.limitlessled.com/dev/). +[Milight bulbs](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LPRQ4BK/r) are cheap smart bulbs that are controllable with an undocumented 2.4 GHz protocol. In order to control them, you either need a [remote](https://www.amazon.com/Mi-light-Dimmable-RGBWW-Spotlight-Smart/dp/B01LCSALV6/r?th=1) ($13), which allows you to control them directly, or a [WiFi gateway](http://futlight.com/productlist.aspx?typeid=125) ($30), which allows you to control them with a mobile app or a [UDP protocol](https://github.com/Fantasmos/LimitlessLED-DevAPI). This project is a replacement for the wifi gateway. From 9f133081dfde8b7ec2a2cd81c2e127c39fc23bf3 Mon Sep 17 00:00:00 2001 From: Adrian Ebeling Date: Tue, 17 Jul 2018 21:11:54 +0200 Subject: [PATCH 16/23] Forward parameters in overloaded MiLightClient::prepare() --- lib/MiLight/MiLightClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/MiLight/MiLightClient.cpp b/lib/MiLight/MiLightClient.cpp index 34afe886..e68733d1 100644 --- a/lib/MiLight/MiLightClient.cpp +++ b/lib/MiLight/MiLightClient.cpp @@ -86,7 +86,7 @@ void MiLightClient::prepare(const MiLightRemoteType type, const uint16_t deviceId, const uint8_t groupId ) { - prepare(MiLightRemoteConfig::fromType(type)); + prepare(MiLightRemoteConfig::fromType(type), deviceId, groupId); } void MiLightClient::setResendCount(const unsigned int resendCount) { From a4eb74ad2e0b15649dcd042dab6e48992e553343 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 22 Jul 2018 11:41:15 -0700 Subject: [PATCH 17/23] Fix #297 --- lib/MiLight/FUT089PacketFormatter.cpp | 6 ++++++ src/main.cpp | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/MiLight/FUT089PacketFormatter.cpp b/lib/MiLight/FUT089PacketFormatter.cpp index 7003fedf..2a20ef47 100644 --- a/lib/MiLight/FUT089PacketFormatter.cpp +++ b/lib/MiLight/FUT089PacketFormatter.cpp @@ -84,6 +84,12 @@ void FUT089PacketFormatter::enableNightMode() { } BulbId FUT089PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& result) { + if (stateStore == NULL) { + Serial.println(F("ERROR: stateStore not set. Prepare was not called! **THIS IS A BUG**")); + BulbId fakeId(0, 0, REMOTE_TYPE_FUT089); + return fakeId; + } + uint8_t packetCopy[V2_PACKET_LEN]; memcpy(packetCopy, packet, V2_PACKET_LEN); V2RFEncoding::decodeV2Packet(packetCopy); diff --git a/src/main.cpp b/src/main.cpp index 01cf3052..5ed71f10 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -89,8 +89,17 @@ void initMilightUdpServers() { void onPacketSentHandler(uint8_t* packet, const MiLightRemoteConfig& config) { StaticJsonBuffer<200> buffer; JsonObject& result = buffer.createObject(); - BulbId bulbId = config.packetFormatter->parsePacket(packet, result); + // This is gross. But if a packet is received for a remote type before one is + // sent, prepare() won't have been called, meaning stateStore and settings will + // not have been initialized. Both of these things should either be passed in + // as constructor parameters, or as prameters to the methods that require them. + // + // But for now, just hackily call prepare. At least fixes a bug. The deviceId + // and groupId won't matter. + config.packetFormatter->prepare(0, 0, stateStore, &settings); + + BulbId bulbId = config.packetFormatter->parsePacket(packet, result); // set LED mode for a packet movement ledStatus->oneshot(settings.ledModePacket, settings.ledModePacketCount); From f5443ace17ec024920dfc3ef04e899273bcee366 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 22 Jul 2018 22:10:21 -0700 Subject: [PATCH 18/23] Use V2 range helpers --- lib/MiLight/FUT091PacketFormatter.cpp | 4 ++-- lib/MiLight/RgbCctPacketFormatter.cpp | 23 +++-------------------- lib/MiLight/V2PacketFormatter.h | 5 ++++- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/lib/MiLight/FUT091PacketFormatter.cpp b/lib/MiLight/FUT091PacketFormatter.cpp index e511010a..17c92947 100644 --- a/lib/MiLight/FUT091PacketFormatter.cpp +++ b/lib/MiLight/FUT091PacketFormatter.cpp @@ -43,10 +43,10 @@ BulbId FUT091PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& res bulbId.groupId = arg-5; } } else if (command == (uint8_t)FUT091Command::BRIGHTNESS) { - uint8_t level = V2PacketFormatter::fromv2scale(arg, BRIGHTNESS_SCALE_MAX, 2, true, 0x13); + uint8_t level = V2PacketFormatter::fromv2scale(arg, BRIGHTNESS_SCALE_MAX, 2, true); result["brightness"] = Units::rescale(level, 255, 100); } else if (command == (uint8_t)FUT091Command::KELVIN) { - uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, KELVIN_SCALE_MAX, 2, false, 0x13); + uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, KELVIN_SCALE_MAX, 2, false); result["color_temp"] = Units::whiteValToMireds(kelvin, 100); } else { result["button_id"] = command; diff --git a/lib/MiLight/RgbCctPacketFormatter.cpp b/lib/MiLight/RgbCctPacketFormatter.cpp index a7954a9f..f579a74e 100644 --- a/lib/MiLight/RgbCctPacketFormatter.cpp +++ b/lib/MiLight/RgbCctPacketFormatter.cpp @@ -40,11 +40,7 @@ void RgbCctPacketFormatter::updateColorRaw(uint8_t value) { void RgbCctPacketFormatter::updateTemperature(uint8_t value) { // Packet scale is [0x94, 0x92, .. 0, .., 0xCE, 0xCC]. Increments of 2. // From coolest to warmest. - // To convert from [0, 100] scale: - // * Multiply by 2 - // * Reverse direction (increasing values should be cool -> warm) - // * Start scale at 0xCC - uint8_t cmdValue = ((100 - value) * 2) + RGB_CCT_KELVIN_REMOTE_END; + uint8_t cmdValue = V2PacketFormatter::tov2scale(value, RGB_CCT_KELVIN_REMOTE_END, 2); // when updating temperature, the bulb switches to white. If we are not already // in white mode, that makes changing temperature annoying because the current hue/mode @@ -87,7 +83,7 @@ void RgbCctPacketFormatter::updateColorWhite() { // there is no direct white command, so let's look up our prior temperature and set that, which // causes the bulb to go white GroupState ourState = this->stateStore->get(this->deviceId, this->groupId, REMOTE_TYPE_RGB_CCT); - uint8_t value = ((100 - ourState.getKelvin()) * 2) + RGB_CCT_KELVIN_REMOTE_END; + uint8_t value = V2PacketFormatter::tov2scale(ourState.getKelvin(), RGB_CCT_KELVIN_REMOTE_END, 2); // issue command to set kelvin to prior value, which will drive to white command(RGB_CCT_KELVIN, value); @@ -131,20 +127,7 @@ BulbId RgbCctPacketFormatter::parsePacket(const uint8_t *packet, JsonObject& res uint16_t hue = Units::rescale(rescaledColor, 360, 255.0); result["hue"] = hue; } else if (command == RGB_CCT_KELVIN) { - // Packet range is [0x94, 0x92, ..., 0xCC]. Remote sends values outside this - // range, so normalize. - uint8_t temperature = arg; - if (arg < 0xCC && arg >= 0xB0) { - temperature = 0xCC; - } else if (arg > 0x94 && arg <= 0xAF) { - temperature = 0x94; - } - - temperature = (temperature + (0x100 - RGB_CCT_KELVIN_REMOTE_END)) % 0x100; - temperature /= 2; - temperature = (100 - temperature); - temperature = constrain(temperature, 0, 100); - + uint8_t temperature = V2PacketFormatter::fromv2scale(arg, RGB_CCT_KELVIN_REMOTE_END, 2); result["color_temp"] = Units::whiteValToMireds(temperature, 100); // brightness == saturation } else if (command == RGB_CCT_BRIGHTNESS && arg >= (RGB_CCT_BRIGHTNESS_OFFSET - 15)) { diff --git a/lib/MiLight/V2PacketFormatter.h b/lib/MiLight/V2PacketFormatter.h index 531cc1ef..5120f9a8 100644 --- a/lib/MiLight/V2PacketFormatter.h +++ b/lib/MiLight/V2PacketFormatter.h @@ -10,6 +10,9 @@ #define V2_COMMAND_INDEX 4 #define V2_ARGUMENT_INDEX 5 +// Default number of values to allow before and after strictly defined range for V2 scales +#define V2_DEFAULT_RANGE_BUFFER 0x13 + class V2PacketFormatter : public PacketFormatter { public: V2PacketFormatter(uint8_t protocolId, uint8_t numGroups); @@ -41,7 +44,7 @@ class V2PacketFormatter : public PacketFormatter { * An extra parameter is exposed: `buffer`, which allows for a range of values before/after the * max that will be mapped to 0 and 100, respectively. */ - static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true, uint8_t buffer = 0); + static uint8_t fromv2scale(uint8_t value, uint8_t endValue, uint8_t interval, bool reverse = true, uint8_t buffer = V2_DEFAULT_RANGE_BUFFER); protected: const uint8_t protocolId; From 21decdbbe4ffb6c45a077b1546c3c6683594d032 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sat, 28 Jul 2018 22:37:19 -0700 Subject: [PATCH 19/23] add test for packet formatters --- test/d1_mini/{test_state.cpp => test.cpp} | 100 +++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) rename test/d1_mini/{test_state.cpp => test.cpp} (70%) diff --git a/test/d1_mini/test_state.cpp b/test/d1_mini/test.cpp similarity index 70% rename from test/d1_mini/test_state.cpp rename to test/d1_mini/test.cpp index e765029d..5f095bda 100644 --- a/test/d1_mini/test_state.cpp +++ b/test/d1_mini/test.cpp @@ -2,13 +2,107 @@ #include #include -#include "unity.h" #include #include #include #include +#include +#include +#include + +#include "unity.h" + +//================================================================================ +// Packet formatter +//================================================================================ + +template +void run_packet_test(uint8_t* packet, PacketFormatter* packetFormatter, const BulbId& expectedBulbId, const String& expectedKey, const T expectedValue) { + GroupStateStore stateStore(10, 0); + Settings settings; + RgbCctPacketFormatter formatter; + DynamicJsonBuffer jsonBuffer; + JsonObject& result = jsonBuffer.createObject(); + + packetFormatter->prepare(0, 0, &stateStore, &settings); + BulbId bulbId = packetFormatter->parsePacket(packet, result); + + TEST_ASSERT_EQUAL_INT_MESSAGE(expectedBulbId.deviceId, bulbId.deviceId, "Should get the expected device ID"); + TEST_ASSERT_EQUAL_INT_MESSAGE(expectedBulbId.groupId, bulbId.groupId, "Should get the expected group ID"); + TEST_ASSERT_EQUAL_INT_MESSAGE(expectedBulbId.deviceType, bulbId.deviceType, "Should get the expected remote type"); + + TEST_ASSERT_TRUE_MESSAGE(result.containsKey(expectedKey), "Parsed packet should be for expected command type"); + TEST_ASSERT_TRUE_MESSAGE(result[expectedKey] == expectedValue, "Parsed packet should have expected value"); +} + +void test_fut092_packet_formatter() { + RgbCctPacketFormatter packetFormatter; + + uint8_t onPacket[] = {0x00, 0xDB, 0xE1, 0x24, 0x66, 0xCA, 0x54, 0x66, 0xD2}; + run_packet_test( + onPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_RGB_CCT), + "state", + "OFF" + ); + + uint8_t minColorTempPacket[] = {0x00, 0xDB, 0xE1, 0x24, 0x64, 0x3C, 0x47, 0x66, 0x31}; + run_packet_test( + minColorTempPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_RGB_CCT), + "color_temp", + COLOR_TEMP_MIN_MIREDS + ); + + uint8_t maxColorTempPacket[] = {0x00, 0xDB, 0xE1, 0x24, 0x64, 0x94, 0x62, 0x66, 0x88}; + run_packet_test( + maxColorTempPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_RGB_CCT), + "color_temp", + COLOR_TEMP_MAX_MIREDS + ); +} + +void test_fut091_packet_formatter() { + FUT091PacketFormatter packetFormatter; + + uint8_t onPacket[] = {0x00, 0xDC, 0xE1, 0x24, 0x66, 0xCA, 0xBA, 0x66, 0xB5}; + run_packet_test( + onPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_FUT091), + "state", + "OFF" + ); + + uint8_t minColorTempPacket[] = {0x00, 0xDC, 0xE1, 0x24, 0x64, 0x8D, 0xB9, 0x66, 0x71}; + run_packet_test( + minColorTempPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_FUT091), + "color_temp", + COLOR_TEMP_MIN_MIREDS + ); + + uint8_t maxColorTempPacket[] = {0x00, 0xDC, 0xE1, 0x24, 0x64, 0x55, 0xB7, 0x66, 0x27}; + run_packet_test( + maxColorTempPacket, + &packetFormatter, + BulbId(1, 1, REMOTE_TYPE_FUT091), + "color_temp", + COLOR_TEMP_MAX_MIREDS + ); +} + +//================================================================================ +// Group State +//================================================================================ + GroupState color() { GroupState s; @@ -241,6 +335,9 @@ void setup() { RUN_TEST(test_store); RUN_TEST(test_group_0); + RUN_TEST(test_fut091_packet_formatter); + RUN_TEST(test_fut092_packet_formatter); + UNITY_END(); } @@ -248,5 +345,4 @@ void loop() { // nothing to be done here. } - // #endif \ No newline at end of file From 59ab8e51ada017eed1f189bd402514a4f621f0c8 Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sat, 28 Jul 2018 23:45:24 -0700 Subject: [PATCH 20/23] Update remote list --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8aa63a13..840af497 100644 --- a/README.md +++ b/README.md @@ -16,16 +16,22 @@ This project is a replacement for the wifi gateway. 4. Official hubs connect to remote servers to enable WAN access, and this behavior is not disableable. 5. This project is capable of passively listening for Milight packets sent from other devices (like remotes). It can publish data from intercepted packets to MQTT. This could, for example, allow the use of Milight remotes while keeping your home automation platform's state in sync. See the MQTT section for more detail. -## Supported bulbs +## Supported remotes + +The following remotes can be emulated: Support has been added for the following [bulb types](http://futlight.com/productlist.aspx?typeid=101): -1. RGBW bulbs: FUT014, FUT016, FUT103 -1. Dual-White (CCT) bulbs: FUT019 -1. RGB LED strips: FUT025 -1. RGB + Dual White (RGB+CCT) bulbs: FUT015, FUT105 +Model #|Name|Compatible Bulbs +-------|-----------|---------------- +|FUT096|RGB/W|
  1. FUT014
  2. FUT016
  3. FUT103
  4. | +|FUT005, FUT006,FUT007
|CCT|
  1. FUT011
  2. FUT017
  3. FUT019
| +|FUT098|RGB|Most RGB LED Strip Controlers| +|FUT092|RGB/CCT|
  1. FUT012
  2. FUT013
  3. FUT014
  4. FUT015
  5. FUT103
  6. FUT104
  7. FUT105
  8. Many RGB/CCT LED Strip Controllers
| +|FUT091|CCT v2|Most newer dual white bulbs and controllers| +|FUT089|8-zone RGB/CCT|Most newer rgb + dual white bulbs and controllers| -Other bulb types might work, but have not been tested. It is also relatively easy to add support for new bulb types. +Other remotes or bulbs, but have not been tested. ## What you'll need From bd9227630ed4615669418b35a436062acc9a52bb Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 29 Jul 2018 10:03:49 -0700 Subject: [PATCH 21/23] Correct command when checking for tag --- .prepare_release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prepare_release b/.prepare_release index 24245156..855f8de9 100755 --- a/.prepare_release +++ b/.prepare_release @@ -6,7 +6,7 @@ prepare_log() { echo "[prepare release] -- $@" } -if [ -z "$(git tag -l --points-at HEAD)" ]; then +if ! git describe --exact-match HEAD 2>/dev/null; then prepare_log "Skipping non-tagged commit." exit 0 fi From 7a15e2345efecb4092eb35fcad6c87d9f28c293a Mon Sep 17 00:00:00 2001 From: Christopher Mullins Date: Sun, 5 Aug 2018 10:24:27 -0700 Subject: [PATCH 22/23] Fix #312 -- multiple commands in same JSON would cause commands after 1st to get blank state --- lib/MiLight/MiLightClient.cpp | 10 +++++++++- lib/MiLight/PacketFormatter.cpp | 9 ++++++--- lib/MiLight/PacketFormatter.h | 9 ++++++++- src/main.cpp | 9 --------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/MiLight/MiLightClient.cpp b/lib/MiLight/MiLightClient.cpp index e68733d1..b7e484af 100644 --- a/lib/MiLight/MiLightClient.cpp +++ b/lib/MiLight/MiLightClient.cpp @@ -33,6 +33,14 @@ void MiLightClient::begin() { } switchRadio(static_cast(0)); + + // Little gross to do this here as it's relying on global state. A better alternative + // would be to statically construct remote config factories which take in a stateStore + // and settings pointer. The objects could then be initialized by calling the factory + // in main. + for (size_t i = 0; i < MiLightRemoteConfig::NUM_REMOTES; i++) { + MiLightRemoteConfig::ALL_REMOTES[i]->packetFormatter->initialize(stateStore, settings); + } } void MiLightClient::setHeld(bool held) { @@ -78,7 +86,7 @@ void MiLightClient::prepare(const MiLightRemoteConfig* config, this->currentRemote = config; if (deviceId >= 0 && groupId >= 0) { - currentRemote->packetFormatter->prepare(deviceId, groupId, stateStore, settings); + currentRemote->packetFormatter->prepare(deviceId, groupId); } } diff --git a/lib/MiLight/PacketFormatter.cpp b/lib/MiLight/PacketFormatter.cpp index 19c59304..70458d4a 100644 --- a/lib/MiLight/PacketFormatter.cpp +++ b/lib/MiLight/PacketFormatter.cpp @@ -28,6 +28,11 @@ PacketFormatter::PacketFormatter(const size_t packetLength, const size_t maxPack packetStream.packetLength = packetLength; } +void PacketFormatter::initialize(GroupStateStore* stateStore, const Settings* settings) { + this->stateStore = stateStore; + this->settings = settings; +} + bool PacketFormatter::canHandle(const uint8_t *packet, const size_t len) { return len == packetLength; } @@ -116,11 +121,9 @@ void PacketFormatter::valueByStepFunction(StepFunction increase, StepFunction de } } -void PacketFormatter::prepare(uint16_t deviceId, uint8_t groupId, GroupStateStore* stateStore, const Settings* settings) { +void PacketFormatter::prepare(uint16_t deviceId, uint8_t groupId) { this->deviceId = deviceId; this->groupId = groupId; - this->stateStore = stateStore; - this->settings = settings; reset(); } diff --git a/lib/MiLight/PacketFormatter.h b/lib/MiLight/PacketFormatter.h index 5ea83e2e..f6e1bafe 100644 --- a/lib/MiLight/PacketFormatter.h +++ b/lib/MiLight/PacketFormatter.h @@ -31,6 +31,13 @@ class PacketFormatter { public: PacketFormatter(const size_t packetLength, const size_t maxPackets = 1); + // Ideally these would be constructor parameters. We could accomplish this by + // wrapping PacketFormaters in a factory, as Settings and StateStore are not + // available at construction time. + // + // For now, just rely on the user calling this method. + void initialize(GroupStateStore* stateStore, const Settings* settings); + typedef void (PacketFormatter::*StepFunction)(); virtual bool canHandle(const uint8_t* packet, const size_t len); @@ -72,7 +79,7 @@ class PacketFormatter { virtual void reset(); virtual PacketStream& buildPackets(); - virtual void prepare(uint16_t deviceId, uint8_t groupId, GroupStateStore* stateStore, const Settings* settings); + virtual void prepare(uint16_t deviceId, uint8_t groupId); virtual void format(uint8_t const* packet, char* buffer); virtual BulbId parsePacket(const uint8_t* packet, JsonObject& result); diff --git a/src/main.cpp b/src/main.cpp index 5ed71f10..bfe9fe65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -90,15 +90,6 @@ void onPacketSentHandler(uint8_t* packet, const MiLightRemoteConfig& config) { StaticJsonBuffer<200> buffer; JsonObject& result = buffer.createObject(); - // This is gross. But if a packet is received for a remote type before one is - // sent, prepare() won't have been called, meaning stateStore and settings will - // not have been initialized. Both of these things should either be passed in - // as constructor parameters, or as prameters to the methods that require them. - // - // But for now, just hackily call prepare. At least fixes a bug. The deviceId - // and groupId won't matter. - config.packetFormatter->prepare(0, 0, stateStore, &settings); - BulbId bulbId = config.packetFormatter->parsePacket(packet, result); // set LED mode for a packet movement From 4cd87ed48eadea09c898780f554eb3421e4c9d26 Mon Sep 17 00:00:00 2001 From: Nils Bernhardt Date: Thu, 9 Aug 2018 14:19:31 +0200 Subject: [PATCH 23/23] Re-compiled web ui --- dist/index.html.gz.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.html.gz.h b/dist/index.html.gz.h index 508f762c..ce5a39a5 100644 --- a/dist/index.html.gz.h +++ b/dist/index.html.gz.h @@ -1,2 +1,2 @@ -#define index_html_gz_len 9565 -static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,10,237,125,107,119,219,184,146,224,247,61,103,255,3,204,244,141,201,54,73,201,118,236,36,146,165,76,58,113,58,217,201,195,27,59,221,59,199,227,241,129,36,200,98,66,145,28,146,242,99,220,250,239,91,85,0,72,240,33,91,121,116,207,157,123,110,63,108,146,0,171,10,133,66,189,80,132,15,54,38,241,56,191,73,4,155,229,243,112,120,128,63,89,200,163,139,129,37,34,11,238,5,159,12,15,230,34,231,108,60,227,105,38,242,129,181,200,167,222,19,104,203,131,60,20,195,87,191,248,239,130,183,193,197,44,247,94,47,70,7,29,249,244,32,12,162,47,44,21,225,192,202,242,155,80,100,51,33,114,139,205,82,49,29,88,179,60,79,178,94,167,51,231,215,227,73,228,143,226,56,207,242,148,39,120,51,142,231,157,226,65,103,215,223,245,31,119,198,89,86,62,243,231,1,244,202,50,75,225,168,130,188,8,114,132,2,191,102,139,145,31,196,229,123,94,30,95,92,132,162,179,227,195,191,85,144,170,169,128,220,160,187,21,21,224,249,156,249,227,48,94,76,166,33,79,5,145,206,63,243,235,78,24,140,76,232,89,24,76,68,218,121,234,63,246,187,53,196,178,233,199,34,206,68,40,198,121,240,95,194,255,156,117,186,254,246,142,255,136,176,150,207,11,252,187,127,218,144,9,87,103,187,196,94,111,187,11,51,137,91,196,231,98,96,93,6,226,42,137,83,16,157,113,28,229,34,2,241,187,10,38,249,108,48,17,151,193,88,120,116,227,6,81,144,7,60,244,178,49,15,197,96,27,64,108,120,222,105,48,101,97,206,222,28,178,167,103,195,255,253,191,24,252,115,144,141,211,32,201,89,150,142,215,30,20,174,136,189,108,22,92,130,48,62,246,119,203,123,96,47,32,234,72,144,132,224,96,227,84,68,147,96,122,230,121,195,3,26,209,208,199,5,36,82,47,141,175,110,71,113,138,151,163,56,207,227,121,111,59,185,102,89,12,243,207,30,140,199,227,101,200,71,34,188,157,4,89,18,242,155,222,40,140,199,95,150,126,202,39,65,236,197,73,30,196,209,109,194,39,147,32,186,232,117,217,94,114,221,31,47,210,44,78,123,73,28,0,91,210,37,18,61,231,209,196,27,45,0,122,148,221,134,65,150,123,68,67,47,138,35,209,159,243,244,34,136,122,221,126,1,166,241,14,11,131,130,128,32,130,233,23,30,209,161,222,245,82,92,228,189,109,49,239,199,151,34,157,134,241,85,143,47,242,120,233,79,227,116,238,193,220,164,55,183,26,13,235,178,157,46,140,176,107,182,50,121,141,51,153,198,225,45,205,93,111,167,43,230,149,78,85,78,152,132,72,38,193,120,114,219,23,105,26,167,14,147,191,189,32,154,198,197,43,56,222,165,217,48,142,67,96,85,42,38,253,41,160,246,50,88,3,61,255,49,162,45,59,245,70,2,104,16,183,74,204,122,155,246,102,165,153,79,129,205,101,171,3,173,106,106,71,121,164,135,141,67,94,250,23,60,23,87,252,198,3,70,83,35,112,138,231,61,226,222,242,129,130,192,252,73,26,39,147,248,10,230,53,206,2,156,224,158,146,226,26,119,155,111,120,115,17,45,204,201,146,204,121,0,171,107,58,13,198,94,22,5,211,105,149,27,15,232,153,152,120,170,15,16,124,237,205,4,77,232,94,215,152,81,239,70,205,105,196,47,71,60,189,29,241,241,151,139,52,94,128,148,40,46,94,140,184,253,104,219,197,255,246,92,255,169,179,17,204,113,129,242,40,239,43,1,71,169,93,100,40,96,18,136,55,74,65,202,220,202,93,111,134,24,213,204,60,152,78,167,75,31,88,5,186,1,70,59,225,32,72,13,196,216,73,97,168,175,29,95,10,73,187,204,248,87,179,32,23,94,46,230,137,151,4,227,47,128,85,13,124,7,198,93,162,233,225,59,64,222,5,146,15,252,182,243,152,209,156,185,15,248,254,100,123,58,101,93,23,105,96,123,221,191,225,5,239,118,187,108,187,219,253,155,211,111,93,52,122,157,237,202,85,48,91,136,22,244,114,9,32,148,126,109,233,151,253,65,254,162,182,183,64,215,141,109,124,149,121,108,87,204,87,144,81,213,19,107,141,23,22,138,28,43,140,111,223,223,223,223,127,12,3,238,194,221,46,152,99,248,135,238,20,31,186,221,41,219,47,58,77,225,238,137,238,132,96,136,63,114,48,151,60,132,159,138,198,219,230,68,2,59,181,162,9,197,52,239,249,123,197,72,113,204,198,240,219,167,57,9,23,153,7,70,5,126,226,0,147,219,202,50,50,57,61,14,97,220,61,80,195,179,58,211,235,48,152,212,140,189,105,144,130,54,141,167,30,122,74,85,61,46,181,98,33,243,122,13,228,113,82,111,145,106,0,199,182,46,218,144,175,196,138,96,90,145,86,27,238,67,228,147,183,166,97,43,30,161,192,106,144,106,237,193,42,211,79,164,77,161,73,43,100,28,12,18,211,255,63,6,227,84,24,27,53,107,187,143,224,33,77,150,122,176,237,63,122,122,7,67,166,129,8,39,208,55,76,218,13,82,169,198,183,253,29,148,147,186,224,128,18,14,111,146,89,0,218,196,207,18,88,64,64,229,45,143,130,57,39,77,139,143,216,118,198,64,179,163,210,21,76,174,133,190,119,37,70,95,130,220,171,246,220,105,233,186,68,55,160,84,221,224,195,64,255,75,48,179,64,133,30,35,200,218,114,20,79,180,81,212,134,127,167,139,86,98,10,254,144,177,170,233,217,191,204,197,36,224,44,142,194,27,6,110,133,16,17,3,85,201,108,4,74,115,195,122,187,104,98,156,219,54,176,123,8,98,29,24,143,158,172,132,209,93,23,198,227,253,39,43,96,108,239,61,89,19,198,211,167,59,171,96,108,239,35,12,127,30,79,192,171,195,14,204,207,208,121,141,35,175,34,177,77,95,74,8,161,197,82,183,250,160,52,148,5,100,165,92,120,164,135,148,124,239,79,247,91,122,100,176,160,10,19,181,191,191,92,132,62,151,68,172,242,178,12,231,170,218,115,149,111,213,210,143,252,27,165,114,198,179,32,156,56,183,13,241,254,151,47,226,102,154,130,135,156,49,148,208,219,105,26,207,111,193,182,71,25,58,82,61,242,131,237,109,135,165,113,14,206,136,221,117,150,121,124,71,251,238,126,119,34,46,28,152,53,189,2,170,240,119,36,2,221,88,2,170,192,95,217,92,128,7,111,153,188,226,131,142,140,43,113,102,135,173,78,57,250,223,254,69,28,67,88,198,147,32,171,249,228,159,255,115,33,210,27,112,200,33,192,80,55,20,79,84,60,242,86,184,235,134,156,159,235,17,231,253,160,215,13,61,63,175,136,60,239,199,112,79,164,2,70,93,164,217,24,188,88,140,252,182,253,39,16,173,148,207,188,31,130,99,69,84,219,26,209,126,55,178,182,72,22,174,50,112,54,65,47,192,122,51,122,252,232,209,85,2,216,207,43,226,215,86,132,50,123,146,139,235,188,243,153,95,114,249,212,26,78,23,17,173,116,6,30,244,73,252,58,11,109,238,10,55,117,110,121,103,176,179,183,231,10,249,43,165,95,253,75,158,178,204,205,221,241,224,29,207,103,62,136,173,234,238,206,212,147,32,210,79,162,129,61,222,154,57,157,157,126,48,181,199,131,193,204,201,6,249,160,219,23,97,38,110,17,208,104,48,246,102,253,236,10,4,116,102,231,131,104,232,239,61,27,117,236,29,15,30,59,61,184,194,215,221,177,115,59,230,153,96,188,151,13,108,225,165,78,103,180,101,139,131,244,217,126,175,235,244,71,169,224,224,77,98,7,129,29,82,143,99,135,29,179,33,197,6,238,9,108,120,180,204,58,131,253,101,42,242,69,26,221,206,122,153,155,245,114,23,130,183,229,178,224,196,199,95,127,201,227,215,199,191,105,78,108,15,6,3,208,116,11,136,111,242,204,15,69,116,145,207,30,62,180,197,128,251,23,110,10,63,71,46,135,159,169,163,217,211,96,206,184,193,156,217,0,180,40,176,168,11,176,243,103,221,222,172,147,187,163,65,222,65,38,107,142,168,129,143,129,252,174,57,30,228,4,48,98,107,246,115,193,7,23,71,245,243,172,206,14,224,198,214,206,207,179,150,86,228,9,176,100,235,81,209,90,229,73,228,94,246,70,164,25,215,146,34,28,248,167,247,111,78,206,143,158,127,124,254,238,120,112,11,67,125,23,128,171,157,129,225,221,117,129,21,234,110,247,113,23,239,126,33,39,52,18,89,6,14,194,222,210,253,244,230,252,228,249,47,199,131,211,219,156,95,244,172,156,143,192,26,79,3,203,157,166,16,4,76,194,155,158,245,59,222,47,221,178,67,6,244,38,102,143,99,122,96,118,9,197,196,236,240,246,240,101,165,153,242,24,102,135,143,244,192,236,50,255,207,60,55,123,188,251,191,39,39,214,242,12,9,126,245,230,240,237,203,130,100,62,129,33,159,47,50,145,98,134,200,124,229,57,182,176,178,5,253,199,158,245,73,221,51,176,72,44,4,117,11,246,25,188,57,136,118,242,89,144,49,176,89,9,191,128,222,232,100,247,44,88,226,208,14,119,124,100,112,71,19,42,113,39,60,203,174,192,255,48,113,31,21,207,36,86,125,255,35,176,142,197,57,216,96,19,219,139,67,214,97,71,255,122,194,232,185,194,8,99,135,53,117,120,124,244,100,103,127,31,217,32,145,111,190,56,220,100,54,94,189,255,248,106,231,209,219,238,54,163,80,112,202,199,194,97,216,1,0,169,30,155,71,111,193,245,122,220,121,123,242,228,105,183,187,105,116,92,73,105,86,145,133,113,22,53,104,61,126,191,30,153,199,239,55,215,196,146,10,184,175,227,249,120,120,124,184,30,67,168,231,186,184,64,178,235,152,64,186,235,120,96,94,1,62,129,199,86,176,80,249,34,99,202,225,99,118,119,0,151,124,4,176,156,62,139,196,5,197,10,192,93,136,80,51,116,177,130,139,136,135,204,78,5,102,228,0,11,243,118,8,22,250,133,49,7,41,2,160,235,78,65,2,17,62,112,39,21,137,224,121,86,149,81,108,97,69,139,36,255,100,38,88,180,152,143,4,160,155,178,60,64,159,15,83,1,212,139,125,124,197,36,64,160,18,147,80,208,50,90,132,163,108,37,49,105,101,101,163,221,85,164,156,131,28,229,113,106,18,244,250,228,228,72,35,210,173,146,168,119,139,48,15,146,48,24,75,78,201,70,156,205,234,232,136,73,169,0,7,48,203,49,68,195,252,89,14,211,60,186,129,101,38,24,193,127,126,244,198,103,159,94,210,5,3,162,1,102,8,49,9,240,90,0,104,152,164,133,196,35,244,64,93,8,37,216,28,60,38,205,41,150,205,226,69,8,80,69,41,68,8,122,77,157,177,200,99,160,23,68,34,5,153,21,105,16,87,20,199,115,104,246,84,51,211,205,146,9,216,132,97,168,38,88,246,193,129,201,228,55,19,32,63,55,198,228,97,100,159,147,203,46,198,64,130,152,192,192,65,42,187,68,177,150,192,53,197,8,186,143,49,131,114,115,78,233,119,131,226,151,186,133,201,22,165,102,129,195,120,143,18,130,81,17,196,123,10,171,238,172,196,8,34,114,246,82,76,57,204,48,9,26,142,39,67,253,76,111,19,131,97,250,212,150,146,26,41,204,201,163,39,79,158,62,213,227,129,215,212,112,214,155,3,52,46,231,96,7,128,144,186,141,97,250,177,28,198,75,224,56,234,141,148,189,57,98,16,204,1,215,51,100,45,117,29,165,241,23,240,109,217,7,74,200,211,172,72,86,223,48,46,201,7,135,98,198,108,113,205,231,73,8,218,117,126,131,239,169,215,198,24,168,62,121,242,104,37,201,100,2,43,36,67,252,25,140,193,222,228,160,134,163,6,229,212,202,138,86,109,120,232,150,152,95,246,202,140,105,193,9,56,148,20,246,224,25,112,57,235,244,36,159,207,131,73,113,137,68,118,122,148,38,130,199,62,59,22,130,125,60,124,254,242,221,33,193,158,46,82,152,57,152,96,145,243,32,92,173,15,154,131,90,36,19,88,109,247,140,77,118,186,123,136,48,164,100,49,130,81,205,152,241,78,230,179,35,37,106,249,12,20,11,167,133,76,139,29,150,46,132,177,44,86,132,43,201,194,180,68,82,127,131,148,29,245,38,123,173,22,220,85,16,134,184,16,65,118,25,186,26,18,33,40,6,180,238,248,202,87,176,1,109,196,125,92,160,62,95,51,207,38,79,244,203,62,251,125,134,217,23,38,83,126,227,25,120,150,168,36,176,217,165,229,55,93,192,176,190,68,241,85,164,94,66,67,0,207,229,11,52,104,208,125,10,46,112,81,123,49,53,194,214,151,128,22,231,77,206,32,52,176,186,243,70,15,72,126,99,116,161,240,170,178,112,215,70,219,230,183,17,164,100,149,243,86,32,253,22,156,100,9,207,11,23,138,22,84,195,7,46,93,44,38,219,37,5,16,116,178,95,95,255,23,35,24,96,140,38,34,4,181,131,185,52,57,125,146,255,193,148,221,196,11,154,57,188,216,4,185,141,98,212,161,40,142,60,42,28,190,13,77,112,59,73,43,108,183,84,23,109,142,196,91,169,72,106,142,196,155,104,12,97,15,225,150,212,201,123,116,39,64,150,248,60,94,192,146,82,46,6,234,77,184,147,40,240,13,20,99,181,8,81,213,144,25,49,245,124,217,181,176,30,12,112,236,250,235,25,0,185,216,166,225,34,155,201,225,95,242,176,18,209,144,216,83,59,43,219,149,47,2,126,197,124,49,175,216,217,16,200,161,173,42,92,252,249,21,102,55,233,101,210,3,106,221,193,19,158,205,218,71,3,243,9,126,33,106,158,96,78,137,210,92,192,220,130,249,207,96,152,53,8,107,26,108,67,169,164,248,35,12,230,65,35,162,82,160,177,3,83,29,190,106,144,166,158,197,78,232,11,42,152,246,196,48,234,123,221,238,106,127,181,178,74,42,14,221,121,62,75,227,60,15,5,94,8,112,187,194,201,74,7,150,233,190,204,232,43,7,243,66,110,48,103,108,6,11,35,169,120,189,164,220,245,155,96,213,10,91,65,10,159,204,119,136,38,159,132,84,143,26,228,23,237,0,143,164,96,211,78,22,179,65,21,153,60,114,164,162,28,115,12,4,106,72,209,107,54,208,50,220,197,5,220,239,98,34,166,10,151,160,192,82,209,163,91,36,208,211,116,152,118,186,221,249,186,254,247,10,238,194,96,113,227,226,50,200,111,214,224,111,165,247,87,115,248,53,120,24,32,81,52,184,172,194,158,38,95,192,218,224,154,64,246,128,207,15,11,62,173,138,85,215,101,115,126,77,130,42,153,181,221,237,194,179,174,94,87,217,106,161,187,139,47,115,41,252,171,89,81,116,104,25,253,148,167,122,4,184,250,199,48,155,19,33,53,31,41,190,114,69,73,96,162,244,54,42,99,219,93,151,118,233,146,41,141,134,27,101,21,221,252,43,217,108,185,36,117,171,164,250,152,242,150,25,187,154,5,227,153,106,51,66,27,80,215,225,98,2,212,5,106,153,75,24,122,177,227,188,64,224,124,130,238,79,18,71,168,214,81,103,151,10,64,83,223,70,94,251,210,23,17,206,217,57,215,97,206,57,218,185,115,153,148,35,6,148,163,58,164,174,172,232,74,38,145,25,93,229,16,95,1,69,31,127,253,229,247,223,101,144,202,108,105,10,225,209,214,139,23,39,232,213,191,250,116,210,125,242,212,113,153,68,158,25,32,11,104,197,186,71,36,104,199,24,109,54,225,36,241,233,20,120,88,248,80,232,8,137,57,168,109,8,247,65,234,145,71,25,94,210,222,33,48,26,189,109,116,54,175,64,73,176,0,244,11,49,27,109,52,184,23,95,52,199,238,229,195,42,3,45,38,178,43,154,186,115,80,66,211,224,162,158,167,32,62,77,22,40,80,12,187,49,221,77,50,172,232,66,180,26,161,37,217,111,246,124,60,70,101,120,132,197,3,170,31,7,77,128,22,62,86,144,112,220,148,49,84,131,209,68,25,84,99,208,217,78,243,20,66,135,70,230,208,32,136,40,150,157,20,198,8,216,127,47,241,51,158,53,223,210,177,38,193,140,96,134,141,25,88,151,232,152,166,186,38,155,85,50,140,46,107,177,56,91,16,143,209,5,135,24,127,65,59,213,95,75,150,212,39,173,52,21,41,147,108,29,122,50,44,95,131,217,165,172,10,134,76,120,83,188,255,45,68,129,88,46,162,10,105,175,208,167,97,99,233,13,54,168,123,95,207,68,1,125,72,49,89,69,114,135,36,221,90,133,162,177,161,213,104,176,173,161,63,137,190,51,247,215,143,31,62,29,157,31,159,60,63,57,60,255,215,195,127,59,30,156,90,74,115,89,50,97,7,23,163,34,95,14,55,161,184,20,224,6,90,179,5,245,41,86,54,220,208,174,48,252,150,156,176,190,136,240,50,40,158,159,163,82,64,96,160,132,20,175,160,97,158,44,64,249,159,235,55,5,169,18,184,40,66,111,184,214,225,118,249,152,92,244,51,23,120,112,254,238,195,203,67,36,250,195,116,10,237,199,33,24,31,185,125,8,119,175,192,90,150,119,212,6,209,90,162,91,244,117,72,21,69,112,245,33,2,160,159,94,30,157,31,125,252,112,242,225,197,135,183,231,191,29,126,60,126,243,225,61,32,216,115,247,207,220,151,135,175,158,127,122,123,114,94,246,41,186,12,246,220,98,223,205,165,77,115,96,247,96,99,27,183,159,44,107,99,16,198,99,98,147,63,139,179,28,131,55,135,118,161,174,196,232,56,198,89,27,68,226,138,253,174,239,108,235,10,119,230,172,173,198,107,91,86,239,201,182,229,244,139,23,253,56,2,153,200,248,133,24,232,61,36,27,128,3,90,77,133,196,148,15,132,15,86,139,247,127,178,173,122,229,155,229,248,9,26,226,104,98,91,7,112,53,180,182,242,45,235,160,67,151,206,114,185,36,0,241,107,113,93,193,33,247,108,172,238,181,181,37,252,60,62,38,17,179,183,247,29,184,249,148,192,154,127,1,246,222,118,150,46,110,231,95,138,79,105,88,190,46,137,18,3,164,70,206,234,155,9,147,69,157,61,201,72,144,79,199,7,143,198,118,220,156,186,145,28,64,47,95,130,3,69,1,194,3,125,112,84,182,69,190,143,229,184,124,112,33,242,23,139,52,5,223,245,29,136,153,237,200,41,24,12,132,131,46,201,149,245,110,1,147,47,48,160,209,171,252,205,75,11,59,21,72,84,117,105,1,27,140,58,92,103,73,24,192,204,184,112,169,252,130,204,230,206,31,127,216,249,160,235,184,22,238,42,3,187,129,236,193,0,5,20,151,107,19,163,76,31,32,66,197,189,142,170,140,204,96,182,97,118,225,39,167,159,249,210,173,14,196,228,157,124,151,253,100,111,18,19,78,101,93,48,173,170,179,222,120,38,64,48,38,155,53,206,44,93,233,182,144,51,52,56,247,181,135,105,155,83,138,229,170,63,249,184,249,107,223,46,210,176,87,204,28,204,194,92,228,179,120,2,110,224,167,19,203,69,208,189,255,115,252,225,189,47,53,75,48,189,129,247,93,85,151,121,66,58,135,39,42,91,29,71,157,207,25,170,8,165,216,123,38,74,80,84,147,80,80,176,249,137,8,132,135,203,165,179,132,23,229,62,36,15,69,154,195,197,114,233,110,139,93,199,69,133,252,66,86,233,174,26,134,26,130,213,201,110,192,97,6,31,245,182,32,254,195,241,183,82,15,52,73,2,212,140,29,83,222,227,99,124,101,44,10,55,119,185,20,237,96,96,29,228,233,16,4,107,11,175,38,67,203,133,171,205,3,154,48,85,200,173,5,63,59,61,179,216,24,20,121,54,176,204,106,96,75,122,244,3,107,19,68,99,211,234,12,55,93,130,214,209,224,86,1,198,188,235,26,64,243,123,129,78,130,75,13,3,75,81,73,122,45,134,236,83,85,26,240,92,22,233,88,195,205,62,160,177,113,236,209,160,219,143,14,90,53,169,218,193,238,71,91,91,146,79,241,160,181,223,105,116,134,187,219,131,65,252,199,31,241,96,112,135,230,125,248,112,163,29,147,177,72,251,52,24,170,148,54,134,195,42,213,181,155,91,118,250,204,98,82,226,173,158,101,57,192,29,201,28,205,92,92,214,3,153,48,178,116,45,62,166,39,96,248,200,108,116,86,209,164,133,34,135,150,24,44,146,228,84,193,239,24,32,50,137,71,45,82,137,199,26,50,107,43,86,211,64,84,14,45,181,35,206,228,67,152,135,97,251,12,73,246,215,71,53,65,95,28,29,150,121,124,41,60,93,124,173,50,117,197,160,244,91,69,117,23,43,235,188,228,171,88,202,17,20,18,34,113,105,26,12,114,58,40,233,75,55,140,249,228,88,228,232,233,101,166,186,2,197,170,10,68,228,47,15,119,165,80,163,210,157,172,232,5,5,211,106,39,31,62,252,201,7,69,136,139,21,215,179,130,14,206,83,213,216,125,24,125,70,248,95,196,77,6,79,176,116,254,144,131,250,40,122,229,82,218,56,88,146,205,7,26,10,51,181,167,92,14,103,155,78,159,43,33,29,118,31,62,180,213,116,99,21,134,207,243,60,181,45,242,62,156,103,220,159,6,33,168,116,123,243,180,92,165,167,249,153,4,226,143,209,173,176,157,30,39,27,134,13,142,179,116,92,48,194,218,181,201,0,122,89,171,67,5,184,114,19,37,179,171,253,154,163,129,49,151,111,242,201,68,190,103,223,98,105,68,143,12,53,170,51,34,171,39,150,136,183,236,158,138,41,166,134,10,84,136,171,25,159,106,167,1,216,37,95,85,92,106,137,100,145,101,121,117,46,45,74,21,182,194,93,194,100,9,191,45,76,91,133,178,53,164,187,3,105,43,236,54,180,50,28,90,15,173,138,202,214,70,171,96,215,208,22,129,208,189,72,203,144,105,29,148,37,220,26,66,25,18,220,139,77,5,75,235,160,82,16,151,122,53,129,203,84,209,46,158,100,120,6,203,27,203,129,193,243,114,250,66,127,254,161,102,3,36,191,241,168,85,200,97,201,37,228,150,214,77,174,173,132,252,180,123,6,242,123,186,125,6,63,118,104,133,161,149,206,248,165,248,85,190,241,66,66,111,119,60,49,14,90,76,18,173,31,129,102,112,53,193,103,135,54,233,92,186,160,74,164,34,124,129,154,210,182,232,227,23,75,214,90,145,46,49,53,136,105,206,207,54,241,221,57,79,140,241,148,174,193,79,96,147,164,111,219,215,106,62,123,207,223,219,129,243,12,188,201,141,174,75,29,96,97,87,209,186,17,68,196,78,47,128,245,28,212,145,107,147,255,103,35,142,16,113,197,5,63,109,88,194,86,26,114,195,109,205,235,190,41,57,233,27,208,69,187,16,241,224,20,29,128,110,63,61,208,234,184,159,130,207,16,159,166,103,131,83,14,63,221,0,127,68,240,227,172,95,250,123,133,125,40,60,62,154,199,123,252,210,54,127,240,182,38,160,189,152,132,107,233,234,105,62,68,222,84,2,34,241,204,46,227,25,47,152,120,100,203,173,54,134,182,244,51,191,219,210,171,71,56,78,175,29,100,155,88,106,23,31,195,5,165,223,155,130,223,8,143,0,62,22,149,139,50,234,169,204,28,154,111,76,197,223,31,12,9,231,153,238,154,205,96,141,34,233,242,182,66,172,242,176,96,132,1,226,199,5,155,224,87,180,191,73,1,170,112,84,71,174,115,10,6,58,246,191,79,182,156,127,247,205,95,182,103,251,63,59,206,179,142,150,232,219,57,255,28,167,189,28,149,194,60,136,232,114,231,12,80,0,4,184,220,5,177,2,102,34,38,184,219,195,6,88,56,189,83,234,79,61,169,15,54,157,193,100,195,242,16,87,34,109,210,230,22,30,133,73,60,154,221,160,250,36,47,150,26,247,9,215,48,144,191,151,174,12,125,94,160,43,248,42,78,101,244,211,50,99,184,248,64,49,209,47,110,54,195,154,193,135,27,3,244,146,64,74,198,114,94,61,181,20,11,33,242,213,131,45,139,217,24,171,3,216,128,71,16,226,59,106,105,111,12,114,9,33,68,10,10,0,204,71,89,196,186,119,0,37,42,202,89,211,150,159,86,165,131,250,158,185,168,27,205,199,73,26,39,160,54,121,33,32,248,0,203,81,75,25,81,242,190,212,20,193,152,20,105,228,64,54,72,83,233,169,210,204,184,205,94,122,45,73,113,148,90,187,207,7,213,73,181,115,63,231,23,231,168,197,220,130,85,206,51,11,250,48,141,141,95,130,61,199,140,244,6,120,236,255,38,183,149,99,153,41,156,131,163,74,153,193,40,215,221,125,139,104,209,68,100,11,8,86,211,27,77,42,151,132,4,131,220,135,245,128,155,187,202,145,52,157,85,37,50,185,143,100,193,52,76,196,245,7,180,236,106,234,156,141,129,183,141,90,211,112,85,17,229,52,72,231,87,60,21,30,126,168,108,41,54,91,248,193,50,120,234,96,44,253,81,26,95,129,161,62,199,237,36,116,215,207,33,202,71,165,22,212,68,27,148,94,22,135,96,247,227,11,21,25,23,183,96,252,251,45,210,230,222,51,67,70,188,161,191,62,98,237,129,7,249,167,42,242,112,238,226,228,221,147,46,213,139,91,216,6,62,138,209,20,220,54,146,16,48,92,16,100,151,99,170,10,253,182,69,42,200,212,233,55,139,239,47,146,64,127,201,128,37,242,169,72,98,172,129,159,143,40,152,235,136,44,193,162,202,243,121,64,5,68,231,208,15,250,132,180,221,223,145,36,182,97,199,172,203,64,52,176,107,237,96,36,70,234,9,62,65,28,166,181,95,113,5,20,223,49,10,145,243,175,131,77,215,250,240,30,19,97,242,61,167,252,226,227,132,98,121,27,60,24,184,141,145,191,245,38,140,18,40,75,171,117,114,81,177,175,158,251,169,238,225,95,20,87,35,204,199,21,21,237,119,247,236,215,71,81,166,150,113,36,242,27,10,12,36,243,223,200,105,112,183,187,221,159,185,159,57,202,232,29,161,90,23,87,47,16,28,126,93,243,115,238,207,168,15,120,180,234,119,168,220,227,50,33,173,253,34,108,175,52,120,70,65,185,95,212,147,59,29,187,242,92,87,150,175,232,93,31,146,177,47,182,98,76,129,162,176,76,185,75,10,163,129,249,236,103,252,196,181,83,163,164,172,106,111,224,149,57,251,118,140,17,174,254,38,7,27,57,173,156,18,157,128,23,166,20,46,249,96,175,75,139,175,249,29,43,72,207,24,236,188,241,181,50,65,236,89,51,144,22,74,114,186,148,95,254,155,75,185,206,191,57,148,89,195,239,202,142,117,222,188,213,91,167,164,53,24,17,35,187,142,4,4,77,47,189,250,181,90,197,255,170,126,234,38,245,71,150,240,136,128,72,165,114,76,37,165,154,22,139,104,131,39,95,75,92,247,94,226,20,179,218,136,147,116,183,18,23,39,6,109,164,254,42,223,184,23,214,14,149,116,53,7,83,57,58,193,210,41,138,22,71,47,1,65,176,27,202,99,163,139,126,186,28,50,176,62,111,117,212,176,130,255,255,121,26,80,60,157,130,164,1,40,252,74,15,84,65,222,177,183,127,214,141,244,197,35,230,31,2,249,129,10,137,10,173,92,176,144,45,107,58,112,204,12,182,125,11,130,71,138,178,175,165,208,252,52,28,189,216,24,11,103,193,206,149,67,228,168,233,97,102,114,31,235,135,137,14,144,237,165,234,187,72,236,170,77,216,216,214,77,96,57,86,182,225,220,86,81,60,124,88,71,64,43,69,46,62,171,88,133,242,105,202,175,60,57,46,156,18,218,68,111,186,89,183,75,224,183,156,138,81,124,13,58,92,51,177,146,146,210,15,3,144,37,189,13,96,149,30,150,140,251,196,105,245,93,42,45,116,206,192,0,154,220,21,154,232,226,60,140,188,85,100,42,51,162,250,246,170,190,159,122,106,81,112,46,25,65,89,249,85,32,141,252,254,218,32,245,250,171,67,195,160,140,196,25,28,21,85,47,4,108,215,139,244,153,169,116,32,92,169,172,115,91,131,174,44,47,111,28,198,153,104,37,187,2,171,117,97,234,128,7,27,241,51,79,120,4,175,90,4,10,148,226,3,60,28,67,101,81,144,55,238,61,195,48,157,50,107,22,40,109,176,50,29,179,42,149,98,1,106,203,209,163,165,77,164,66,16,27,241,228,42,218,253,246,84,179,219,162,93,136,131,25,4,143,121,90,196,177,200,149,98,251,128,67,216,207,15,158,246,57,196,251,69,112,170,15,250,40,7,178,121,16,6,195,3,174,142,227,121,160,146,237,212,185,72,200,114,202,225,163,153,57,232,112,240,40,225,13,139,34,222,182,33,84,240,176,48,96,188,58,5,202,39,175,136,60,190,83,19,206,146,2,75,102,124,27,19,135,186,195,109,221,188,115,205,71,82,81,131,35,231,22,91,164,155,77,21,81,236,218,233,44,185,185,103,119,239,70,155,222,103,131,246,165,153,38,174,108,204,22,169,122,104,128,37,153,98,197,86,15,212,104,22,167,249,43,76,235,246,232,163,60,203,141,35,41,38,207,39,147,94,53,158,200,125,57,39,20,26,191,193,147,53,228,3,176,174,18,222,43,138,129,122,45,252,46,162,255,255,176,187,215,167,220,155,62,247,94,117,189,167,103,183,219,238,163,229,31,167,234,114,111,233,252,212,113,158,217,5,2,136,90,186,7,24,69,138,131,193,254,222,222,238,222,51,187,146,185,177,55,182,29,180,105,189,218,99,185,91,59,194,202,37,42,123,197,125,20,93,252,212,189,238,226,9,39,88,211,212,189,126,5,255,88,56,153,206,143,128,81,229,126,113,133,49,91,113,163,226,198,205,131,69,177,141,21,241,75,6,255,123,57,31,101,22,11,38,3,139,42,96,79,240,118,184,233,70,3,157,110,233,171,175,28,91,243,172,114,123,172,136,207,54,183,34,92,55,229,218,218,196,13,126,126,129,219,87,149,189,63,192,138,203,75,248,186,148,197,92,103,136,220,194,84,165,4,110,128,107,228,93,91,160,126,122,121,84,128,210,251,79,139,176,101,95,18,129,169,244,94,101,196,12,107,79,238,29,116,13,16,56,91,248,101,213,68,48,201,3,226,104,57,122,9,223,42,63,192,108,221,104,2,15,30,83,10,35,140,180,224,61,157,39,170,32,43,207,118,194,141,83,142,195,195,61,62,203,229,229,78,37,244,161,109,169,2,57,92,154,140,86,59,133,224,205,96,157,208,195,135,54,175,141,168,60,50,68,113,24,47,61,92,170,18,46,222,210,68,211,254,34,196,218,188,216,108,4,125,216,90,24,143,95,12,251,120,245,172,142,204,216,31,70,166,181,190,189,98,231,248,158,157,89,189,39,59,108,219,134,69,92,81,58,221,121,164,119,100,219,17,183,236,205,42,35,17,225,7,1,22,235,12,25,93,105,182,222,67,211,106,98,194,28,191,19,253,86,106,228,87,166,68,78,229,187,211,130,44,57,85,173,37,165,197,212,72,65,144,106,163,200,185,24,187,58,204,220,134,101,43,55,246,216,92,126,113,40,64,236,235,117,98,237,219,53,40,62,210,106,13,41,208,59,232,232,187,165,22,46,137,26,172,176,81,53,247,93,132,155,11,164,44,9,251,1,244,225,253,125,101,168,5,229,119,45,133,251,128,252,73,171,66,161,173,35,147,92,187,151,166,213,34,154,167,224,217,160,128,202,2,228,239,94,48,170,78,253,199,19,58,229,97,38,41,125,41,81,212,23,81,181,174,131,92,152,246,138,153,186,164,97,209,140,169,43,193,148,240,165,52,117,250,153,54,124,235,24,152,134,61,148,22,175,233,205,103,30,157,254,195,140,67,128,12,23,90,166,8,42,84,84,174,41,78,210,27,100,101,201,95,224,212,91,178,197,104,30,228,118,35,221,216,112,100,219,55,81,253,25,207,106,123,61,78,115,75,22,67,81,125,24,135,44,240,51,41,16,105,192,67,112,121,158,167,41,191,177,113,140,147,197,88,212,246,19,165,93,21,167,50,75,126,86,236,179,60,163,183,32,12,150,111,115,44,214,72,22,217,172,112,58,123,197,59,131,83,238,170,167,103,198,83,245,200,21,75,247,118,137,155,226,101,53,198,224,156,246,199,40,142,213,142,153,150,20,230,235,228,74,91,224,240,19,86,166,212,246,61,177,182,209,7,193,195,137,184,109,234,224,222,233,25,68,254,70,18,251,7,110,112,230,232,253,23,164,149,236,151,50,70,9,20,248,141,145,37,70,132,58,104,105,4,152,184,82,218,101,70,193,110,155,250,182,168,104,165,184,175,36,197,56,19,109,229,6,21,116,59,8,104,47,161,61,213,102,236,60,208,39,243,180,205,16,92,96,156,153,199,49,218,63,251,54,9,193,116,227,1,44,16,231,196,9,56,92,120,220,86,45,234,43,92,43,75,214,17,242,32,130,112,70,198,153,75,12,57,85,206,69,198,174,58,189,242,64,125,74,82,201,133,180,110,11,58,149,234,42,219,105,110,245,98,12,93,30,153,130,129,65,25,35,140,48,135,44,143,154,84,39,44,128,62,54,84,83,65,113,245,177,122,69,30,234,9,77,170,216,76,234,75,121,99,213,250,170,122,235,170,77,27,199,97,200,147,172,120,204,211,11,60,52,89,159,126,89,52,15,15,48,221,89,88,254,212,195,163,210,172,161,220,131,192,1,4,23,36,213,48,76,232,55,100,149,238,52,135,0,142,142,31,250,254,230,162,220,141,65,224,82,29,35,157,214,169,15,110,238,88,141,227,158,185,178,48,85,14,203,49,178,230,152,27,209,28,182,195,47,58,111,216,8,155,138,181,95,101,174,92,35,85,206,214,23,243,80,11,78,17,83,213,64,83,134,74,198,143,116,57,188,187,58,144,82,215,180,170,36,23,135,213,164,121,193,194,18,153,134,86,228,113,12,236,116,132,140,85,239,209,46,74,197,251,12,244,173,33,133,184,47,234,129,225,73,226,100,145,104,39,133,30,138,107,160,101,34,38,218,33,24,202,51,113,42,179,63,230,41,157,178,108,208,93,206,74,229,140,217,250,164,16,237,158,60,176,110,173,153,169,188,160,167,231,185,188,173,48,76,142,47,19,9,79,57,30,3,82,144,19,92,6,114,57,54,231,145,146,190,42,157,172,242,1,166,134,89,131,60,221,93,17,70,90,136,190,106,83,122,104,133,0,21,40,215,197,224,21,91,213,10,147,132,207,94,169,199,43,240,224,166,82,163,4,185,21,141,236,233,213,23,194,47,244,184,132,142,73,5,243,74,86,218,202,159,176,6,87,104,73,226,108,145,117,48,251,96,189,127,125,225,123,217,220,219,45,28,122,10,235,139,212,154,116,129,107,229,61,195,151,234,195,132,73,85,76,141,2,161,82,86,149,79,171,162,166,18,28,2,39,203,133,159,1,11,192,121,72,95,32,204,22,35,252,254,96,88,132,58,173,186,10,73,126,84,29,136,89,35,68,104,42,223,74,72,238,211,216,198,227,220,77,47,70,87,248,227,28,111,166,139,188,251,228,105,149,1,234,107,14,107,72,137,212,98,20,171,163,40,253,194,159,16,45,85,211,173,247,213,113,111,195,74,148,123,43,131,98,115,108,200,182,191,43,14,250,58,10,118,0,223,206,95,136,15,100,151,237,254,133,248,64,240,216,186,137,24,86,17,203,82,8,11,153,251,110,106,246,128,154,189,191,27,106,246,129,154,253,191,27,106,30,3,53,143,255,110,168,121,2,212,60,249,11,229,180,11,248,158,135,97,53,173,80,249,217,174,84,13,53,72,249,175,33,122,241,107,168,64,234,252,167,233,63,9,253,158,33,163,94,111,213,127,248,137,249,15,96,253,90,68,128,77,1,140,47,94,156,252,85,8,149,33,147,195,220,250,107,17,75,164,127,21,66,189,24,213,161,0,235,137,246,42,159,103,123,231,14,15,162,84,0,21,95,1,126,151,254,194,186,56,102,123,195,215,11,88,65,240,251,107,105,220,175,5,157,101,33,201,202,6,85,97,210,30,71,54,203,161,74,79,77,253,106,176,114,5,201,171,217,85,245,170,190,130,75,199,69,81,221,55,51,75,202,151,14,209,169,146,133,25,53,44,172,81,189,39,73,151,61,241,192,101,212,155,213,103,252,26,188,170,110,237,169,246,182,224,249,183,241,73,73,211,55,243,138,170,142,216,73,89,179,247,205,44,51,158,54,254,240,198,218,28,53,139,7,255,28,150,126,221,186,6,94,148,37,135,223,196,26,2,179,222,224,101,5,227,143,30,246,87,9,3,85,28,125,199,64,203,124,66,237,79,12,169,140,130,169,183,139,66,47,189,154,100,69,111,129,199,224,79,117,231,92,101,76,154,246,89,134,184,237,139,134,201,195,247,87,170,228,50,124,11,238,78,1,54,189,14,179,122,76,130,87,79,168,78,225,156,86,131,53,252,29,127,21,249,54,21,141,19,115,215,197,136,33,241,93,200,34,170,200,150,206,214,123,188,174,97,91,123,100,178,122,251,46,84,9,15,210,251,211,103,139,76,165,207,142,160,251,55,18,163,62,242,189,131,150,69,180,14,53,230,167,190,236,19,189,82,159,12,76,141,36,240,59,185,91,142,191,70,190,148,60,25,175,212,255,18,203,61,9,231,130,13,234,232,59,188,86,7,75,221,53,61,88,82,26,47,50,37,12,21,219,221,198,28,162,167,45,41,108,190,72,27,2,218,141,87,78,193,247,147,206,232,155,224,105,112,221,144,102,113,157,175,75,191,22,181,42,249,21,37,165,177,212,172,65,185,10,127,128,218,48,64,24,25,224,21,31,175,43,174,52,18,193,85,94,182,167,133,105,18,238,78,238,106,30,172,200,240,178,106,189,97,53,49,248,109,76,89,149,14,251,111,144,127,185,125,158,8,49,57,87,195,251,145,43,224,24,1,255,192,37,112,7,245,196,159,191,66,250,27,121,97,124,155,50,146,173,155,149,134,80,240,144,182,250,245,86,197,36,224,97,124,209,80,147,60,244,86,183,180,230,152,101,211,90,187,114,178,92,89,114,17,2,146,121,80,188,111,13,31,210,113,82,253,146,45,179,157,42,6,53,169,106,243,150,201,146,97,116,129,118,218,23,129,46,73,184,215,41,98,166,99,132,27,200,45,252,148,27,203,195,131,156,78,185,43,75,40,144,162,131,92,254,173,156,60,197,203,34,91,254,242,160,3,119,248,4,79,222,62,138,211,188,120,112,148,198,24,247,134,76,125,244,87,52,148,155,123,117,27,95,251,147,133,50,5,83,43,209,94,219,206,203,13,7,196,135,103,101,224,149,28,0,253,29,167,150,193,235,178,109,236,42,255,34,80,135,198,14,191,145,47,247,69,145,197,236,12,31,70,163,44,233,215,36,183,182,41,242,143,39,178,229,118,231,90,178,218,228,210,58,30,61,9,174,220,200,163,250,115,147,179,181,68,140,172,142,88,229,78,22,21,75,199,178,219,215,78,178,6,75,39,37,49,250,233,93,241,148,62,177,148,119,244,119,181,84,177,81,229,163,132,181,166,162,241,154,250,10,162,101,58,30,13,79,100,71,166,206,24,99,54,157,34,139,229,206,250,196,113,7,102,229,145,33,140,181,195,200,86,13,178,220,204,172,239,29,254,227,201,111,99,51,244,171,84,110,139,28,88,232,191,191,84,31,253,50,205,63,54,10,34,158,6,120,110,169,60,214,93,176,98,171,213,248,19,94,250,139,215,245,190,117,5,131,17,228,175,23,35,166,31,48,252,40,12,21,160,207,202,237,100,206,34,227,251,234,17,132,138,88,251,66,7,45,202,239,170,173,198,214,179,165,254,6,164,79,113,8,252,55,26,190,227,95,4,203,22,169,60,86,150,70,115,163,143,253,94,36,56,86,58,228,147,83,196,150,208,233,151,8,16,122,164,140,254,138,200,6,76,197,176,224,179,60,236,56,136,176,51,207,131,17,29,244,171,206,10,26,211,57,165,170,106,137,209,247,177,62,123,51,149,199,20,207,168,174,39,115,97,204,242,64,70,34,135,254,76,9,129,252,116,252,139,65,245,17,241,133,37,241,21,122,59,55,227,80,24,253,233,143,234,202,99,29,213,161,162,0,152,78,82,197,51,101,145,36,117,218,75,28,17,241,4,86,138,70,69,33,117,244,36,91,76,86,138,225,25,33,25,232,32,17,141,165,220,202,242,94,158,230,164,109,60,20,216,154,218,154,6,97,145,130,161,107,28,128,214,149,73,187,138,83,25,139,187,21,94,77,195,53,100,90,254,37,200,175,115,128,87,44,185,23,184,28,141,120,246,14,53,106,150,75,252,99,107,150,117,21,10,114,164,254,241,189,126,111,150,146,190,87,135,137,148,142,149,169,219,235,39,82,212,185,93,253,114,223,34,128,111,233,89,19,158,206,17,202,92,216,221,144,116,141,132,220,189,40,64,53,119,216,138,3,46,36,87,225,10,157,76,121,26,68,129,67,190,246,81,170,51,246,146,248,183,30,168,226,239,67,156,243,124,5,184,247,49,85,213,40,120,73,42,238,130,167,166,134,78,230,36,199,165,116,95,107,221,241,227,221,129,60,249,193,120,31,43,132,241,200,7,107,248,91,0,234,23,4,77,234,234,106,205,90,43,84,100,114,245,120,137,210,158,84,139,118,238,119,84,254,187,23,121,123,109,208,255,224,197,126,191,135,123,48,219,45,86,144,249,87,99,117,69,20,51,92,230,221,178,224,170,99,20,29,170,217,46,157,92,159,138,139,235,51,149,164,129,212,19,13,192,85,25,91,73,208,71,88,200,248,87,0,170,20,85,141,91,73,214,87,25,183,228,94,251,166,140,244,247,88,182,164,213,127,255,59,18,255,182,18,196,255,193,194,191,194,210,201,50,207,162,178,242,126,131,87,230,3,171,127,127,184,186,243,209,158,132,39,17,152,51,227,203,246,90,230,74,253,169,50,41,221,60,189,99,3,226,27,17,80,34,171,114,70,34,136,5,60,162,147,232,153,172,188,111,75,235,255,83,58,255,41,157,255,148,206,123,165,179,163,178,112,232,65,13,255,63,84,3,88,120,34,138,0,0}; \ No newline at end of file +#define index_html_gz_len 9681 +static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,10,237,125,107,119,219,184,146,224,247,61,103,255,3,204,244,141,197,54,73,201,118,236,36,146,169,76,30,78,39,59,121,120,99,167,123,231,120,60,62,144,4,89,76,40,146,67,82,126,140,91,255,125,171,10,0,9,62,100,43,233,116,207,157,123,110,63,108,146,0,171,10,133,66,189,80,132,15,54,38,241,56,191,73,4,155,229,243,112,120,128,63,89,200,163,11,223,18,145,5,247,130,79,134,7,115,145,115,54,158,241,52,19,185,111,45,242,169,251,4,218,242,32,15,197,240,245,11,239,125,240,46,184,152,229,238,155,197,232,160,43,159,30,132,65,244,149,165,34,244,173,44,191,9,69,54,19,34,183,216,44,21,83,223,154,229,121,146,245,187,221,57,191,30,79,34,111,20,199,121,150,167,60,193,155,113,60,239,22,15,186,187,222,174,247,184,59,206,178,242,153,55,15,160,87,150,89,10,71,21,228,69,144,35,20,248,53,91,140,188,32,46,223,115,243,248,226,34,20,221,29,15,254,173,130,84,77,5,228,6,221,173,168,0,207,151,204,27,135,241,98,50,13,121,42,136,116,254,133,95,119,195,96,100,66,207,194,96,34,210,238,83,239,177,215,171,33,150,77,63,22,113,38,66,49,206,131,255,18,222,151,172,219,243,182,119,188,71,132,181,124,94,224,223,253,211,134,76,184,186,219,37,246,122,219,93,152,73,220,34,62,23,190,117,25,136,171,36,78,65,116,198,113,148,139,8,196,239,42,152,228,51,127,34,46,131,177,112,233,198,9,162,32,15,120,232,102,99,30,10,127,27,64,108,184,238,105,48,101,97,206,222,30,178,167,103,195,255,253,191,24,252,115,144,141,211,32,201,89,150,142,215,30,20,174,136,189,108,22,92,130,48,62,246,118,203,123,96,47,32,234,74,144,132,224,96,227,84,68,147,96,122,230,186,195,3,26,209,208,195,5,36,82,55,141,175,110,71,113,138,151,163,56,207,227,121,127,59,185,102,89,12,243,207,30,140,199,227,101,200,71,34,188,157,4,89,18,242,155,254,40,140,199,95,151,94,202,39,65,236,198,73,30,196,209,109,194,39,147,32,186,232,247,216,94,114,61,24,47,210,44,78,251,73,28,0,91,210,37,18,61,231,209,196,29,45,0,122,148,221,134,65,150,187,68,67,63,138,35,49,152,243,244,34,136,250,189,65,1,166,241,14,11,131,130,128,32,130,233,23,46,209,161,222,117,83,92,228,253,109,49,31,196,151,34,157,134,241,85,159,47,242,120,233,77,227,116,238,194,220,164,55,183,26,13,235,177,157,30,140,176,103,182,50,121,141,51,153,198,225,45,205,93,127,167,39,230,149,78,85,78,152,132,72,38,193,120,242,142,39,210,52,78,109,38,127,187,65,52,141,139,87,112,188,75,179,97,28,135,192,170,84,76,6,83,64,237,102,176,6,250,222,99,68,91,118,234,143,4,208,32,110,149,152,245,55,59,155,149,102,62,5,54,151,173,54,180,170,169,29,229,145,30,54,14,121,233,93,240,92,92,241,27,23,24,77,141,192,41,158,247,137,123,203,7,10,2,243,38,105,156,76,226,43,152,215,56,11,112,130,251,74,138,107,220,109,190,225,206,69,180,48,39,75,50,231,1,172,174,233,52,24,187,89,20,76,167,85,110,60,160,103,98,226,170,62,64,240,181,59,19,52,161,123,61,99,70,221,27,53,167,26,217,93,211,225,69,252,114,196,211,219,17,31,127,189,72,227,5,136,146,98,245,197,136,119,30,109,59,248,223,158,227,61,181,55,130,57,174,98,30,229,3,181,10,80,180,23,25,74,161,4,226,142,82,16,69,167,114,215,159,33,89,106,250,30,76,167,211,165,7,252,4,5,2,44,153,112,144,182,6,98,236,164,48,212,23,152,39,73,95,49,146,171,89,144,11,55,23,243,196,77,130,241,87,192,170,184,179,3,204,41,209,244,241,29,32,239,2,201,135,73,233,228,49,163,137,117,30,240,253,201,246,116,202,122,14,210,192,246,122,127,195,11,222,235,245,216,118,175,247,55,123,208,186,178,244,98,220,149,75,101,182,16,45,232,229,58,65,40,131,154,126,40,251,131,144,70,109,111,129,66,28,119,240,85,230,178,93,49,95,65,70,85,153,172,53,94,88,77,114,172,48,190,125,111,127,127,255,49,12,184,7,119,187,96,179,225,31,186,83,124,232,245,166,108,191,232,52,133,187,39,186,19,130,33,254,200,193,92,242,16,126,42,26,111,155,19,9,236,212,218,40,20,211,188,239,237,21,35,197,49,27,195,111,159,230,36,92,100,46,88,30,248,137,3,76,110,43,107,205,228,244,56,132,113,247,65,87,207,234,76,175,195,96,82,125,246,167,65,10,42,55,158,186,232,78,85,149,189,84,157,133,204,235,53,144,199,73,189,69,234,10,28,219,186,104,67,190,18,43,130,105,69,90,109,184,15,145,71,46,157,134,173,120,132,2,171,65,170,181,7,171,76,63,145,134,135,38,173,144,113,176,90,76,255,255,24,44,88,97,145,212,172,237,62,130,135,52,89,234,193,182,247,232,233,29,12,153,6,34,156,64,223,48,105,183,90,165,174,223,246,118,80,78,234,130,3,154,58,188,73,102,1,104,19,47,75,96,1,1,149,183,60,10,230,156,212,49,62,98,219,25,3,245,143,154,89,48,185,22,6,238,149,24,125,13,114,183,218,115,167,165,235,18,125,133,82,191,131,163,3,253,47,193,22,3,21,122,140,32,107,203,81,60,209,150,83,123,7,59,61,52,37,83,112,154,140,85,77,207,254,101,46,38,1,103,113,20,222,48,240,61,132,136,24,168,74,214,65,160,52,55,172,191,139,118,200,190,109,3,187,135,32,214,129,241,232,201,74,24,189,117,97,60,222,127,178,2,198,246,222,147,53,97,60,125,186,179,10,198,246,62,194,240,230,241,4,92,63,236,192,188,12,61,220,56,114,43,18,219,116,184,132,16,90,44,117,171,7,74,67,153,73,86,202,133,75,122,72,201,247,254,116,191,165,71,6,11,170,48,81,251,251,203,69,232,113,73,196,42,87,204,240,192,170,61,87,57,96,45,253,200,9,82,42,103,60,11,194,137,125,219,16,239,127,249,42,110,166,41,184,209,25,67,9,189,157,166,241,252,22,28,128,40,67,111,171,79,206,114,103,219,102,105,156,131,199,210,233,217,203,60,190,163,125,119,191,55,17,23,54,204,154,94,1,85,248,59,18,129,110,44,1,85,224,175,108,46,192,131,75,77,174,243,65,87,6,159,56,179,195,86,207,29,157,116,239,34,142,33,118,227,73,144,213,28,247,47,255,185,16,233,13,120,237,16,133,168,27,10,58,42,110,123,43,220,117,227,210,47,245,176,244,126,208,235,198,167,95,86,132,167,247,99,184,39,156,1,163,46,210,108,12,174,46,134,135,219,222,19,8,105,202,103,238,15,193,177,34,244,109,13,123,255,48,178,182,112,23,174,50,112,54,65,47,192,122,51,122,252,232,209,85,162,220,47,43,130,220,86,132,50,197,146,139,235,188,251,133,95,114,249,212,26,78,23,17,173,116,6,30,244,73,252,38,11,59,220,17,78,106,223,242,174,191,179,183,231,8,249,43,165,95,131,75,158,178,204,201,157,177,255,158,231,51,15,196,86,117,119,102,234,73,16,233,39,145,223,25,111,205,236,238,206,32,152,118,198,190,63,179,51,63,247,123,3,17,102,226,22,1,141,252,177,59,27,100,87,32,160,179,78,238,71,67,111,239,217,168,219,217,113,225,177,221,135,43,124,221,25,219,183,99,158,9,198,251,153,223,17,110,106,119,71,91,29,113,144,62,219,239,247,236,193,40,21,28,188,73,236,32,176,67,234,114,236,176,99,54,164,216,192,93,129,13,143,150,89,215,223,95,166,34,95,164,209,237,172,159,57,89,63,119,32,194,91,46,11,78,124,250,229,69,30,191,57,254,85,115,98,219,247,125,208,116,11,8,130,242,204,11,69,116,145,207,30,62,236,8,159,123,23,78,10,63,71,14,135,159,169,173,217,211,96,206,184,193,156,153,15,90,20,88,212,3,216,249,179,94,127,214,205,157,145,159,119,145,201,154,35,106,224,99,32,191,103,142,7,57,1,140,216,154,253,92,240,193,193,81,253,60,171,179,3,184,177,181,243,243,172,165,21,121,2,44,217,122,84,180,86,121,18,57,151,253,17,105,198,181,164,8,7,254,249,195,219,147,243,163,231,159,158,191,63,246,111,97,168,239,3,112,181,51,48,188,187,14,176,66,221,237,62,238,225,221,11,114,66,35,145,101,224,32,236,45,157,207,111,207,79,158,191,56,246,79,111,115,126,209,183,114,62,2,107,60,13,44,103,154,66,16,48,9,111,250,214,111,120,191,116,202,14,25,208,155,152,61,142,233,129,217,37,20,19,179,195,187,195,87,149,102,74,118,152,29,62,209,3,179,203,252,63,243,220,236,241,254,255,158,156,88,203,51,36,248,245,219,195,119,175,10,146,249,4,134,124,190,200,68,138,105,36,243,149,231,216,194,202,22,244,31,251,214,103,117,207,192,34,177,16,212,45,216,103,240,230,32,218,201,103,65,198,192,102,37,252,2,122,163,147,221,183,96,137,67,59,220,241,145,193,29,77,168,196,157,240,44,187,2,255,195,196,125,84,60,147,88,245,253,143,192,58,22,231,96,131,77,108,47,15,89,151,29,253,235,9,163,231,10,35,140,29,214,212,225,241,209,147,157,253,125,100,131,68,190,249,242,112,147,117,240,234,195,167,215,59,143,222,245,182,25,133,130,83,62,22,54,195,14,0,72,245,216,60,122,7,174,215,227,238,187,147,39,79,123,189,77,163,227,74,74,179,138,44,140,179,168,65,235,241,135,245,200,60,254,176,185,38,150,84,192,125,29,207,167,195,227,195,245,24,66,61,215,197,5,146,93,199,4,210,93,199,3,243,10,240,9,60,182,130,133,202,23,25,83,14,31,235,244,124,184,228,35,128,101,15,88,36,46,40,86,0,238,66,132,154,161,139,21,92,68,60,100,157,84,96,218,14,176,48,119,135,96,161,95,24,115,144,34,0,186,238,20,36,16,225,3,119,82,145,8,158,103,85,25,197,22,86,180,72,242,79,102,130,69,139,249,72,0,186,41,203,3,244,249,48,21,64,189,216,167,215,76,2,4,42,49,83,5,45,163,69,56,202,86,18,147,86,86,54,218,93,69,202,57,200,81,30,167,38,65,111,78,78,142,52,34,221,42,137,122,191,8,243,32,9,131,177,228,148,108,196,217,172,142,142,152,148,10,112,0,179,28,67,52,76,178,229,48,205,163,27,88,102,130,17,252,231,71,111,61,246,249,21,93,48,32,26,96,134,16,147,0,175,5,128,134,73,90,72,60,66,15,212,129,80,130,205,193,99,210,156,98,217,44,94,132,0,85,148,66,132,160,215,212,25,139,60,6,122,65,36,82,144,89,145,6,113,69,113,60,135,102,87,53,51,221,44,153,128,77,24,134,106,130,101,31,28,152,204,144,51,1,242,115,99,76,30,70,246,57,185,236,98,12,36,136,9,12,28,164,178,71,20,107,9,92,83,140,160,251,24,51,40,55,231,148,163,55,40,126,165,91,152,108,81,106,22,56,140,247,40,33,24,21,65,188,167,176,234,206,74,140,32,34,103,175,196,148,195,12,147,160,225,120,50,212,207,244,54,49,24,166,79,237,59,169,145,194,156,60,122,242,228,233,83,61,30,120,77,13,103,189,57,64,227,114,14,118,0,8,169,219,24,166,31,203,97,188,2,142,163,222,72,217,219,35,6,193,28,112,61,67,214,82,215,81,26,127,5,223,150,125,164,172,61,205,138,100,245,13,227,146,124,112,40,102,172,35,174,249,60,9,65,187,206,111,240,61,245,218,24,3,213,39,79,30,173,36,153,76,96,133,100,136,63,131,49,216,155,28,212,112,212,160,156,90,89,209,170,13,15,221,18,243,203,94,153,49,45,56,1,135,146,194,62,60,3,46,103,221,190,228,243,121,48,41,46,145,200,110,159,210,68,240,216,99,199,66,176,79,135,207,95,189,63,36,216,211,69,10,51,7,19,44,114,30,132,171,245,65,115,80,139,100,2,171,237,158,177,201,78,119,15,17,134,148,44,70,48,170,25,51,222,201,60,118,164,68,45,159,129,98,225,180,144,105,177,195,210,133,48,150,197,138,112,37,89,152,150,72,234,111,144,178,163,222,100,175,213,130,187,10,194,16,23,34,200,46,67,87,67,34,4,197,128,214,29,95,249,6,54,160,141,184,143,11,212,231,91,230,217,228,137,126,217,99,191,205,48,251,194,100,202,111,60,3,207,18,149,4,54,59,180,252,166,11,24,214,215,8,183,4,228,75,104,8,224,185,124,129,6,13,186,79,193,5,46,106,47,166,70,216,250,18,208,226,188,201,25,132,6,86,119,222,232,1,201,111,140,46,20,94,85,22,238,218,104,219,252,54,130,148,172,114,222,10,164,223,131,147,44,225,121,225,66,209,130,106,248,192,165,139,197,100,187,164,0,130,78,246,203,155,255,98,4,3,140,209,68,132,160,118,48,151,38,167,79,242,63,152,178,155,120,65,51,135,23,155,32,183,81,140,58,20,197,145,71,133,195,183,161,9,110,39,105,133,237,150,234,162,205,145,120,39,21,73,205,145,120,27,141,33,236,33,220,146,58,121,143,238,4,200,18,159,199,11,88,82,202,197,64,189,9,119,18,5,190,129,98,172,22,33,170,26,50,35,166,158,47,187,22,214,131,1,142,93,111,61,3,32,23,219,52,92,100,51,57,252,75,30,86,34,26,18,123,106,103,101,187,242,69,192,175,152,47,230,21,59,27,2,57,180,85,133,139,63,191,194,236,38,189,76,122,64,173,59,120,194,179,89,251,104,96,62,193,47,68,205,19,204,41,81,154,11,152,91,48,255,25,12,179,6,97,77,131,109,40,149,20,127,132,193,60,104,68,84,10,52,118,96,170,195,55,13,210,212,179,216,9,125,65,5,179,51,49,140,250,94,175,183,218,95,173,172,146,138,67,119,158,207,210,56,207,67,129,23,2,220,174,112,178,210,129,101,186,47,51,250,202,193,188,148,187,208,25,155,193,194,72,42,94,47,41,119,253,38,88,181,194,86,144,194,39,243,29,162,201,39,33,213,163,6,249,69,59,192,35,41,216,180,147,197,58,160,138,76,30,217,82,81,142,57,6,2,53,164,232,53,27,104,25,238,190,2,238,247,49,17,83,133,75,80,96,169,232,209,45,18,232,105,58,76,59,189,222,124,93,255,123,5,119,97,176,184,113,113,25,228,55,107,240,183,210,251,155,57,252,6,60,12,144,40,26,92,86,97,79,147,47,96,109,112,77,208,230,244,148,195,130,79,171,98,213,115,216,156,95,147,160,74,102,109,247,122,240,172,167,215,85,182,90,232,238,226,203,92,10,255,106,86,20,29,90,70,63,229,169,30,1,174,254,49,204,230,68,72,205,71,138,175,92,81,18,152,40,189,141,202,216,118,215,165,93,186,100,74,163,225,70,89,69,55,255,66,54,91,46,73,221,42,169,62,166,188,101,198,174,102,193,120,166,218,140,208,6,212,117,184,152,0,117,129,90,230,18,134,94,236,56,47,16,56,159,160,251,147,196,17,170,117,212,217,165,2,208,212,183,145,215,190,244,69,132,115,118,206,117,152,115,142,118,238,92,38,229,136,1,229,168,14,169,43,43,186,146,73,100,70,87,57,196,215,64,209,167,95,94,252,246,155,12,82,89,71,154,66,120,180,245,242,229,9,122,245,175,63,159,244,158,60,181,29,38,145,103,6,200,2,90,177,238,17,9,218,49,70,155,77,56,73,124,58,5,30,22,62,20,58,66,98,14,106,27,194,125,144,122,228,81,134,151,180,119,8,140,70,111,27,157,205,43,80,18,44,0,253,66,204,70,27,13,238,197,87,205,177,123,249,176,202,64,139,137,236,138,166,238,28,148,208,52,184,168,231,41,136,79,147,5,10,20,195,110,76,119,147,12,43,186,16,173,70,104,73,246,155,61,31,143,81,25,30,97,241,128,234,199,65,19,160,133,143,21,36,28,55,101,12,213,96,52,81,6,213,24,116,182,211,60,133,208,161,145,57,52,8,34,138,101,39,133,49,2,246,223,75,252,140,103,205,183,116,172,73,48,35,152,97,99,6,214,37,58,166,169,174,201,102,149,12,163,203,90,44,206,22,196,99,116,193,33,198,95,208,78,245,183,146,37,245,73,43,77,69,202,36,91,135,158,12,107,220,96,118,41,171,130,33,19,222,20,239,127,15,81,32,150,139,168,66,218,107,244,105,216,88,122,131,13,234,62,212,51,81,64,31,82,76,86,145,220,33,73,183,86,161,104,108,104,53,26,108,107,232,79,162,239,204,249,229,211,199,207,71,231,199,39,207,79,14,207,255,245,240,223,142,253,83,75,105,46,75,38,236,224,98,84,228,203,225,38,20,151,2,220,64,107,182,160,62,197,202,134,27,218,21,134,223,146,19,214,87,17,94,6,197,243,115,84,10,8,12,148,144,226,21,52,204,147,5,40,255,115,253,166,32,85,2,23,69,232,13,215,58,220,46,31,147,139,126,230,0,15,206,223,127,124,117,136,68,127,156,78,161,253,56,4,227,35,183,15,225,238,53,88,203,242,142,218,32,90,75,116,139,190,14,169,162,8,174,62,70,0,244,243,171,163,243,163,79,31,79,62,190,252,248,238,252,215,195,79,199,111,63,126,0,4,123,206,254,153,243,234,240,245,243,207,239,78,206,203,62,69,23,127,207,41,246,221,28,218,52,7,118,251,27,219,184,253,100,89,27,126,24,143,137,77,222,44,206,114,12,222,108,218,133,186,18,163,227,24,103,205,143,196,21,251,77,223,117,172,43,220,153,179,182,26,175,109,89,253,39,219,150,61,40,94,244,226,8,100,34,227,23,194,215,123,72,29,0,14,104,53,21,18,83,238,11,15,172,22,31,252,212,177,234,229,113,150,237,37,104,136,163,73,199,58,128,171,161,181,149,111,89,7,93,186,180,151,203,37,1,136,223,136,235,10,14,185,103,99,245,174,173,45,225,229,241,49,137,88,103,123,223,134,155,207,9,172,249,151,96,239,59,246,210,193,237,252,75,241,57,13,203,215,37,81,194,71,106,228,172,190,157,48,89,249,217,151,140,4,249,180,61,240,104,58,182,147,83,55,146,3,232,229,73,112,160,40,64,120,160,15,142,170,99,145,239,99,217,14,247,47,68,254,114,145,166,224,187,190,7,49,235,216,114,10,124,95,216,232,146,92,89,239,23,48,249,2,3,26,189,202,223,190,178,176,83,129,68,149,160,22,176,193,168,195,117,150,132,1,204,140,3,151,202,47,200,58,220,254,253,247,78,238,247,108,199,194,93,101,96,55,144,237,251,40,160,184,92,155,24,101,250,0,17,42,238,117,85,249,100,6,179,13,179,11,63,57,253,204,151,78,117,32,38,239,228,187,12,9,38,181,21,6,138,41,117,118,44,29,233,171,144,7,228,159,123,218,173,236,152,243,136,133,172,63,121,184,227,219,185,93,164,97,191,152,46,96,253,92,228,179,120,2,190,223,231,19,203,65,208,253,255,115,252,241,131,39,213,73,48,189,129,247,29,85,177,121,66,138,134,39,42,69,29,71,221,47,25,234,5,165,205,251,38,74,208,78,147,80,80,132,249,153,8,132,135,203,165,189,132,23,229,230,35,15,69,154,195,197,114,233,108,139,93,219,65,45,252,82,214,239,174,26,134,26,130,213,205,110,192,75,6,199,244,182,32,254,227,241,247,82,15,52,73,2,212,52,29,83,178,227,83,124,101,172,4,39,119,184,148,231,192,183,14,242,116,8,210,180,133,87,147,161,229,192,213,230,1,137,170,42,241,214,210,158,157,158,89,108,12,218,59,243,45,179,78,216,146,110,188,111,109,130,60,108,90,221,225,166,67,208,186,26,220,42,192,152,108,93,3,104,126,47,208,73,112,169,97,96,253,41,137,172,197,144,125,170,52,3,158,203,202,28,107,184,57,0,52,29,28,123,228,247,6,209,65,171,250,84,219,214,131,104,107,75,242,41,246,91,251,157,70,103,78,230,115,223,143,127,255,61,246,253,59,212,237,195,135,27,237,152,140,149,57,160,193,80,61,175,49,28,86,41,169,221,220,234,100,207,44,166,22,79,223,178,108,224,142,100,142,102,46,174,101,95,102,137,44,93,165,143,57,9,24,62,50,27,61,84,180,99,161,200,161,37,6,51,36,57,85,240,59,6,136,76,226,25,207,4,168,236,137,196,99,13,153,181,21,171,105,32,42,135,150,218,6,103,242,33,204,195,176,125,134,36,251,235,163,154,160,3,142,94,202,60,190,20,174,46,203,86,233,185,98,80,250,173,162,164,139,149,197,93,242,85,172,223,8,10,9,145,184,52,13,6,57,93,148,244,165,19,198,124,114,44,114,116,239,50,83,71,129,114,82,85,33,242,151,139,91,81,168,70,233,78,150,241,130,130,105,53,142,15,31,254,228,129,246,195,197,138,235,89,65,7,143,169,106,225,62,142,190,32,252,175,226,38,131,39,88,84,127,200,65,125,20,189,114,41,109,28,204,199,230,3,13,69,218,141,83,57,147,114,57,156,109,218,3,174,132,116,216,123,248,176,163,166,27,75,47,60,158,231,105,199,34,151,195,126,198,189,105,16,130,30,239,108,158,150,171,244,52,63,147,64,188,49,250,18,29,187,207,201,112,97,131,109,47,109,7,44,175,246,103,50,128,94,22,232,80,213,173,220,57,201,58,213,126,205,209,192,152,203,55,249,100,34,223,235,220,98,61,68,159,172,51,170,51,34,171,47,150,136,183,236,158,138,41,230,131,10,84,136,171,25,148,106,79,1,216,37,95,85,92,106,9,95,145,101,121,117,46,45,202,15,182,194,93,194,100,9,175,45,54,91,133,178,53,142,187,3,105,43,236,54,180,50,6,90,15,173,10,197,214,70,171,96,215,208,22,209,207,189,72,203,56,105,29,148,37,220,26,66,25,7,220,139,77,69,72,235,160,82,16,151,122,53,129,159,84,209,46,174,100,120,6,203,27,107,128,193,221,178,7,66,127,24,162,102,3,36,191,241,168,85,200,97,201,37,228,139,214,77,110,71,9,249,105,239,12,228,247,116,251,12,126,236,208,10,67,43,157,241,75,241,139,124,227,165,132,222,238,109,98,240,179,152,36,90,63,2,205,224,95,130,163,14,109,210,163,116,64,149,72,69,248,18,53,101,199,162,207,98,44,89,96,69,186,196,212,32,166,57,63,219,196,119,231,60,49,198,83,186,6,63,129,77,146,14,237,64,171,249,236,3,255,208,9,236,103,224,66,110,244,28,234,0,11,187,138,214,137,32,12,182,251,1,172,231,160,142,92,155,252,63,27,113,132,136,43,126,247,105,195,18,182,210,144,27,190,106,94,247,77,201,51,223,128,46,218,133,136,253,83,116,0,122,131,236,64,171,227,65,6,62,67,124,154,157,249,167,28,126,58,1,254,136,224,199,217,160,244,247,10,251,80,120,124,52,143,247,248,165,109,254,224,109,77,64,251,49,9,215,210,209,211,124,136,188,169,68,65,226,89,167,12,98,220,96,226,146,45,183,218,24,218,210,207,252,162,75,175,30,97,219,253,118,144,109,98,169,93,124,140,17,148,126,111,10,126,61,38,162,144,106,83,7,15,167,85,143,5,221,206,51,198,55,21,57,54,46,13,73,129,163,35,14,11,109,93,156,137,12,2,162,226,219,41,203,86,111,228,52,84,172,84,23,101,40,85,145,12,116,15,48,191,127,127,132,37,236,103,186,107,54,3,29,128,172,145,183,21,102,20,225,207,44,192,241,161,66,72,240,251,221,95,165,128,86,102,76,135,195,115,10,54,186,157,127,159,108,217,255,238,153,191,58,110,199,251,217,182,159,117,245,138,185,157,243,47,113,218,207,81,233,204,131,136,46,119,206,0,5,64,128,203,221,51,39,133,201,66,76,112,183,135,13,176,48,251,167,212,159,122,82,31,108,58,3,97,130,229,39,174,68,218,164,205,41,60,22,147,120,52,235,65,245,73,94,44,101,238,17,174,97,32,127,47,29,25,90,189,68,87,243,117,156,202,232,170,69,34,112,113,131,20,208,47,110,54,195,154,196,135,27,62,122,97,48,221,99,41,55,174,90,234,133,144,122,234,193,150,197,58,152,0,0,176,1,143,242,45,203,86,170,99,195,207,37,132,16,41,40,0,48,15,101,29,139,233,1,148,168,40,127,77,91,126,90,149,14,234,123,230,160,238,53,31,39,32,119,160,150,121,33,32,248,0,107,92,75,25,81,235,105,169,41,130,49,41,210,200,65,109,144,166,114,94,165,25,115,154,189,244,90,149,226,40,173,194,128,251,213,73,237,228,94,206,47,206,81,75,58,5,171,236,103,22,244,97,26,27,191,4,127,1,211,220,27,16,17,252,155,220,171,142,101,250,113,14,142,48,165,27,163,92,119,247,228,234,211,68,100,11,8,134,211,27,77,42,151,132,4,126,238,193,122,192,29,99,229,168,154,206,176,18,153,220,67,178,96,26,38,226,250,35,122,14,106,234,236,13,223,221,70,173,108,184,194,136,114,26,164,243,43,158,10,23,63,145,182,20,155,45,252,84,26,34,1,48,198,222,40,141,175,192,17,56,71,37,128,225,192,249,34,13,81,105,6,53,209,6,165,154,197,33,248,21,241,133,138,188,139,91,112,46,6,45,210,230,220,51,67,70,60,163,63,105,98,237,129,13,249,191,42,178,177,239,226,228,221,147,46,213,139,83,216,30,62,138,209,212,220,54,146,28,48,92,16,100,135,99,254,11,253,194,69,42,200,148,234,55,139,143,58,146,64,127,30,129,117,247,169,72,98,44,172,159,143,40,88,236,138,44,193,74,205,243,121,64,85,73,231,208,15,250,132,84,67,208,149,36,182,97,199,172,142,47,26,216,181,118,48,18,47,245,172,161,32,14,211,218,175,184,26,138,239,24,229,200,249,215,193,172,99,125,252,128,217,53,249,158,93,126,70,114,66,185,130,14,120,72,112,27,35,127,235,77,24,133,80,234,87,235,228,226,51,0,245,220,75,117,15,239,162,184,26,97,146,175,40,147,191,187,231,160,62,138,50,95,141,35,145,31,102,96,160,154,255,74,78,137,179,221,235,253,204,189,204,86,70,245,8,213,186,184,122,137,224,240,147,157,159,115,111,70,125,192,99,86,191,67,229,126,151,89,110,237,119,97,123,165,193,53,170,212,189,162,72,221,238,118,42,207,117,185,250,138,222,245,33,25,155,109,43,198,20,40,10,203,60,190,164,48,242,205,103,63,227,119,179,221,26,37,101,169,124,3,175,220,8,104,199,24,225,234,111,114,176,145,51,203,41,123,10,120,97,74,225,146,251,123,61,233,58,52,62,142,69,135,3,236,188,241,9,52,65,236,91,51,144,22,202,156,58,148,180,254,155,67,9,212,191,217,148,185,195,143,213,142,117,50,190,53,26,160,76,56,24,17,35,101,143,4,4,205,40,160,250,9,92,197,191,171,126,63,39,245,71,150,240,136,128,72,165,114,76,117,170,154,22,139,104,131,39,223,74,92,239,94,226,20,179,218,136,147,116,183,18,23,39,6,109,164,254,42,95,215,23,214,14,149,116,53,199,83,57,180,193,210,41,144,22,71,47,1,65,232,52,148,199,70,15,227,0,57,100,96,125,222,234,168,225,103,1,255,207,213,128,226,233,20,36,13,64,225,167,127,160,10,242,110,103,251,103,221,72,159,81,98,126,35,144,95,189,144,168,208,202,5,11,217,178,166,3,219,204,144,119,110,65,240,72,81,14,180,20,154,223,155,163,23,27,99,53,46,216,185,114,136,28,53,61,204,76,238,97,81,50,209,1,178,189,84,125,23,73,167,106,19,54,182,117,19,88,142,149,109,56,183,85,20,15,31,214,17,208,74,145,139,207,42,86,161,124,154,242,43,87,142,11,167,132,118,230,155,110,214,237,18,248,45,167,98,20,95,131,14,215,76,172,164,188,244,195,0,100,169,175,231,173,244,176,100,92,41,78,171,239,82,189,162,125,6,6,208,228,174,208,68,23,39,113,228,173,34,83,153,17,213,183,95,245,253,212,83,139,130,127,201,8,202,250,175,2,105,236,31,172,13,82,175,191,58,52,12,250,72,156,193,81,81,69,72,192,118,189,72,159,153,74,7,194,149,202,58,239,104,208,149,229,229,82,44,213,74,118,5,86,235,194,212,1,15,54,226,183,163,240,8,94,181,8,20,40,197,7,120,44,135,202,210,32,111,156,123,134,97,58,101,214,44,80,218,96,101,186,103,85,170,198,2,212,150,173,71,171,226,204,117,89,137,241,102,128,238,174,210,28,28,93,66,88,212,237,33,95,209,175,212,121,69,83,35,52,246,70,224,246,202,254,119,48,205,107,207,161,59,45,106,173,8,131,243,180,8,208,17,114,177,47,194,253,222,128,31,60,29,240,173,45,187,136,138,203,144,89,115,112,243,32,12,134,7,92,157,64,244,64,237,34,80,231,34,48,231,180,57,129,246,237,160,203,193,149,133,55,44,138,206,219,134,80,193,3,204,103,188,58,247,42,24,168,172,53,124,167,182,42,74,10,44,153,202,110,204,22,42,45,167,230,28,80,142,224,204,49,31,73,11,1,30,164,83,108,248,110,54,117,83,177,29,169,211,255,230,102,228,189,59,136,122,3,17,218,151,102,254,187,178,205,92,236,65,64,3,232,130,20,235,207,250,160,191,179,56,205,95,99,190,186,79,159,24,90,78,28,73,161,121,62,153,244,171,129,76,238,201,57,161,152,252,45,158,19,34,31,128,89,151,240,94,83,240,213,111,225,119,145,118,248,143,78,239,250,148,187,211,231,238,235,158,251,244,236,118,219,121,180,252,253,84,93,238,45,237,159,186,246,179,78,129,0,194,165,222,1,134,175,226,192,223,223,219,219,221,123,214,169,164,164,58,27,219,54,26,211,126,237,177,220,123,30,97,29,22,21,241,226,6,145,46,229,234,93,247,240,188,22,172,208,234,93,191,134,127,44,156,76,251,71,192,168,114,191,184,194,96,177,184,81,1,235,230,193,162,216,159,139,248,37,131,255,221,156,143,50,139,5,19,223,162,122,222,19,188,29,110,58,145,175,87,246,64,125,179,217,154,64,150,251,126,69,96,184,185,21,225,186,41,215,214,38,150,43,240,11,220,151,171,108,106,2,86,92,94,194,211,133,57,230,58,67,228,22,230,96,37,112,3,92,35,161,220,2,245,243,171,163,2,148,222,88,91,132,45,27,174,8,76,229,45,43,35,102,88,73,115,239,160,107,128,192,203,195,239,196,64,247,74,30,16,71,203,209,75,248,86,249,57,105,235,14,26,132,14,152,203,24,97,136,7,239,233,4,85,5,89,121,156,21,238,8,115,28,30,110,94,90,14,47,183,96,161,15,237,183,21,200,225,210,100,180,218,2,5,55,10,171,158,30,62,236,240,218,136,202,3,80,20,135,241,210,197,165,42,225,226,45,77,52,109,156,66,144,207,139,93,84,208,135,173,101,254,248,253,179,135,87,207,234,200,140,141,111,100,90,235,219,43,182,196,239,217,114,214,155,205,195,182,253,101,196,21,165,211,157,71,122,171,185,29,113,203,166,179,50,18,17,126,222,96,177,238,144,209,149,102,235,61,52,173,38,38,204,241,171,215,239,165,70,126,51,75,228,84,190,162,45,200,146,83,213,90,32,91,76,141,20,4,169,54,138,100,143,177,93,197,204,253,101,182,114,199,146,205,229,247,147,2,196,190,94,245,214,190,15,133,226,35,173,214,144,34,204,131,174,190,91,106,225,146,168,193,10,27,53,128,127,136,112,115,129,148,5,110,63,128,62,188,191,175,168,182,160,252,174,165,112,31,144,63,105,85,40,180,117,100,146,107,247,210,180,90,68,243,20,60,27,20,80,89,78,253,135,23,140,170,186,255,241,132,78,121,152,73,74,95,73,20,245,69,84,45,88,33,23,166,189,20,168,46,105,88,13,100,234,74,48,37,124,41,77,157,126,166,13,223,58,6,166,97,15,165,197,107,134,17,153,75,103,25,49,227,72,35,195,133,86,155,79,38,21,149,107,10,208,244,206,95,89,192,24,216,245,150,108,49,154,7,121,167,145,231,108,11,59,90,118,135,189,25,207,106,97,133,221,220,107,198,24,88,31,45,34,203,21,77,10,68,26,240,16,92,158,231,105,202,111,58,56,198,201,98,44,106,27,165,210,174,138,83,153,158,63,43,54,120,158,209,91,16,127,203,183,57,86,161,36,139,108,86,56,157,253,226,29,255,148,59,234,233,153,241,84,61,114,196,210,185,93,226,110,127,89,102,226,159,211,198,28,5,208,218,49,211,146,194,60,157,213,105,11,28,126,194,146,155,218,134,46,110,43,122,32,120,56,17,183,77,29,220,63,61,91,58,185,145,61,255,129,59,183,57,122,255,70,93,164,6,45,101,140,50,55,240,27,67,90,220,189,212,65,75,35,178,197,149,210,46,51,10,118,219,212,183,69,69,43,197,125,37,41,198,9,111,43,119,198,160,219,65,64,155,24,237,57,62,99,203,131,14,0,160,253,141,224,2,227,204,60,142,209,254,117,110,147,16,76,55,30,39,3,113,78,156,128,195,133,135,135,213,162,190,194,181,178,100,129,36,15,34,8,103,100,156,185,196,144,83,69,220,50,118,213,121,157,7,234,195,152,74,18,166,117,63,210,174,148,141,117,90,2,117,140,161,203,3,96,48,48,40,99,132,17,38,175,229,193,153,234,188,8,208,199,134,106,42,40,174,62,86,175,200,115,76,161,73,85,209,73,125,41,111,172,90,95,85,61,94,181,105,227,56,12,121,146,21,143,121,122,129,231,68,235,179,60,139,230,225,1,230,89,11,203,159,186,120,240,155,53,148,155,31,56,128,224,130,164,26,134,9,253,134,172,210,157,230,16,192,209,97,74,127,188,185,168,227,99,16,184,84,199,72,103,143,234,179,170,187,86,227,132,107,174,44,76,149,195,114,140,172,57,230,70,52,135,237,240,139,142,88,54,194,166,98,237,87,153,43,215,72,149,179,245,197,60,212,130,83,196,84,53,208,148,26,147,241,35,93,14,239,46,123,164,156,57,173,42,201,197,97,53,91,95,176,176,68,166,161,21,121,28,3,59,29,136,99,213,123,180,139,82,241,62,3,125,107,72,33,110,200,186,96,120,146,56,89,36,218,73,161,135,226,26,104,153,136,137,118,8,134,242,132,159,202,236,143,121,74,7,75,27,116,151,179,82,57,86,183,62,41,68,187,43,143,223,91,107,102,42,47,232,233,121,46,111,43,12,147,227,203,68,194,83,142,135,154,20,228,4,151,129,92,142,205,121,164,108,179,202,99,171,124,128,169,97,214,32,79,119,87,132,145,22,162,111,244,148,30,90,33,64,5,202,117,49,184,197,30,185,194,36,225,179,215,234,241,10,60,184,155,213,168,173,110,69,35,123,186,245,133,240,130,30,151,208,49,169,96,94,201,18,98,249,19,214,224,10,45,73,156,45,178,14,102,31,252,122,161,190,240,221,108,238,238,22,14,61,133,245,69,106,77,186,192,181,186,165,225,43,245,153,197,164,42,166,70,229,83,41,171,202,167,85,81,83,9,14,129,147,229,194,143,154,5,224,60,164,239,41,102,139,17,126,77,49,44,66,157,86,93,133,36,63,170,14,196,44,78,34,52,149,47,63,36,247,105,108,227,113,238,164,23,163,43,252,113,142,55,211,69,222,123,242,148,126,61,221,174,242,65,125,162,98,13,41,159,90,12,102,117,48,165,95,248,19,130,166,106,214,245,190,58,245,109,88,144,114,111,199,47,54,231,134,108,251,15,133,67,223,70,193,14,224,219,249,11,241,129,8,179,221,191,16,31,200,31,91,55,31,195,42,210,89,202,162,20,189,31,65,205,30,80,179,247,119,67,205,62,80,179,255,119,67,205,99,160,230,241,223,13,53,79,128,154,39,127,161,156,246,0,223,243,48,172,102,23,42,63,219,117,171,161,6,41,13,54,252,4,129,60,152,64,12,226,218,52,161,225,58,173,248,156,69,29,105,210,240,160,170,14,123,187,63,165,232,25,98,68,81,26,149,59,124,36,229,30,175,116,148,72,93,203,129,161,59,99,114,12,173,131,233,0,194,208,127,121,241,91,197,251,49,187,131,13,169,246,126,249,242,100,101,103,101,116,10,119,169,208,248,85,108,91,247,192,104,188,176,178,115,33,184,70,127,121,64,0,235,178,23,79,238,124,143,204,97,237,189,167,219,248,222,78,221,69,185,75,168,86,57,29,219,59,119,152,240,114,233,85,140,53,252,118,138,33,173,139,99,182,55,124,179,0,177,129,223,223,74,227,126,45,234,43,75,72,86,54,168,218,146,246,64,174,89,8,85,138,172,250,213,96,229,10,146,87,179,203,112,107,190,141,75,199,69,57,221,119,51,75,234,43,29,35,83,13,11,51,170,87,88,163,110,79,146,46,123,226,249,205,168,177,170,207,248,53,248,51,189,218,83,237,231,192,243,239,227,147,146,166,86,23,240,27,88,70,101,71,236,164,44,218,251,110,206,25,79,27,127,206,99,109,198,154,213,131,127,14,103,191,109,121,3,47,202,154,195,239,98,13,129,89,111,240,178,132,241,71,15,251,155,132,129,74,142,254,192,64,75,115,85,251,235,70,42,178,55,221,129,162,210,139,85,74,122,11,60,6,127,170,59,216,202,238,54,3,4,169,209,219,215,14,147,71,250,175,212,204,133,190,65,16,119,165,226,154,62,151,89,62,38,193,171,39,84,47,112,78,171,193,26,254,134,191,74,195,46,141,15,49,119,93,140,24,154,222,133,44,162,146,108,233,20,124,192,235,26,182,181,71,38,203,183,239,66,149,240,32,189,63,141,181,200,84,26,235,8,186,127,39,49,234,43,226,59,104,89,68,235,80,99,126,75,204,62,211,43,245,201,64,79,32,129,223,201,221,114,252,45,242,165,228,201,120,165,254,247,93,238,73,252,214,189,79,188,86,199,85,221,53,61,88,83,26,47,50,37,12,21,19,222,198,28,162,167,45,57,107,190,72,137,121,75,185,176,202,55,248,227,164,51,250,232,120,26,92,55,164,89,92,231,235,210,175,69,173,230,60,155,74,74,99,169,89,131,114,21,254,0,181,241,215,133,19,56,9,119,39,89,239,9,32,88,181,238,175,234,7,127,31,83,218,210,82,255,77,242,47,183,177,19,33,38,231,106,120,63,114,5,28,35,224,31,184,4,238,160,158,248,243,87,72,127,35,12,194,183,41,37,216,186,105,104,8,5,15,105,203,93,111,25,76,2,30,198,23,13,53,201,67,119,117,75,107,174,87,54,173,181,59,38,235,149,37,23,33,46,153,7,197,251,214,240,33,29,82,53,40,217,50,219,169,98,80,147,170,54,81,153,172,25,70,23,104,167,125,17,232,210,128,123,157,34,102,58,70,184,145,219,194,79,185,193,59,60,200,233,236,188,178,148,1,41,58,200,229,95,224,201,83,188,44,178,214,175,14,186,112,135,79,240,60,239,163,56,205,139,7,71,105,140,185,148,144,169,175,254,138,134,114,147,173,110,227,107,127,45,81,230,21,106,53,218,107,219,121,25,85,35,62,60,140,3,175,228,0,232,175,67,181,12,94,215,109,99,87,249,119,134,186,52,118,248,141,124,185,47,152,44,102,103,248,48,26,101,201,160,38,185,181,205,137,127,60,145,45,183,29,215,146,213,38,151,214,241,232,73,112,229,134,26,213,129,155,156,173,229,247,100,149,194,42,119,178,168,28,58,150,221,190,117,146,139,148,19,30,197,196,232,167,123,197,83,250,198,82,222,209,95,235,82,69,63,149,175,18,214,154,138,198,107,234,51,136,150,233,120,52,60,145,29,153,58,185,140,117,232,108,90,44,59,214,231,152,219,48,43,143,12,97,172,29,113,182,106,144,229,166,98,125,15,239,31,79,126,27,155,146,223,164,114,91,228,192,66,255,253,149,250,234,151,105,254,177,81,16,241,52,192,211,80,229,97,241,130,21,89,65,227,15,131,233,79,94,215,251,216,21,12,70,144,191,89,140,152,126,192,240,171,48,84,128,30,43,183,117,57,139,140,15,172,71,16,42,98,13,10,29,223,40,63,172,182,26,91,192,150,250,203,146,30,197,33,240,223,104,248,158,127,21,44,91,164,242,176,90,26,205,141,62,76,124,145,224,88,233,232,80,78,17,91,66,103,106,34,64,232,145,50,250,219,36,27,48,21,195,130,207,242,8,229,32,194,206,60,15,70,116,124,176,58,140,104,76,167,159,170,234,33,70,31,200,122,236,237,84,30,126,60,163,250,154,204,129,49,203,99,30,137,28,250,227,39,4,242,243,241,11,131,234,35,226,11,75,226,43,244,118,110,198,161,48,250,211,223,243,149,135,69,170,163,74,1,48,157,207,138,39,213,34,73,234,56,153,56,34,226,9,172,20,141,138,66,234,234,73,182,152,172,216,194,67,72,50,208,65,34,26,75,185,149,101,182,60,205,73,219,184,40,176,53,181,53,13,194,34,5,67,215,56,0,173,43,147,118,21,167,50,22,119,43,188,154,134,107,200,180,252,251,146,223,230,0,175,88,114,47,113,57,26,241,236,29,106,212,44,91,248,199,214,44,235,42,20,228,72,253,235,123,253,222,44,37,125,175,78,43,41,29,43,83,183,215,143,164,168,115,187,250,233,190,69,0,223,209,179,38,60,157,35,148,185,176,187,33,233,90,5,185,157,84,128,106,238,109,21,39,92,72,174,194,21,58,153,242,56,136,2,135,124,237,147,84,103,236,21,241,111,61,80,197,95,157,56,231,249,10,112,31,98,170,110,81,240,146,84,220,5,79,77,13,157,247,73,142,75,233,190,214,186,227,215,187,190,60,250,193,120,31,43,117,241,204,7,107,248,107,0,234,23,4,77,234,234,106,237,88,43,84,100,114,245,124,137,210,158,84,139,103,238,119,84,254,187,23,121,123,141,206,255,224,197,126,191,135,123,48,219,45,86,144,249,183,104,117,101,18,51,92,230,221,114,111,176,107,20,255,169,217,46,157,92,143,138,124,235,51,149,164,129,212,19,13,192,85,25,91,73,208,39,88,200,248,183,5,170,20,85,141,91,73,214,55,25,183,228,94,251,166,140,244,31,177,108,73,171,255,254,119,36,254,109,165,128,255,131,133,127,133,165,147,229,150,69,133,227,253,6,175,204,7,86,255,170,113,117,231,163,61,9,79,34,48,103,198,167,237,181,204,149,250,3,104,82,186,121,122,199,6,196,119,34,160,68,86,229,16,70,16,11,120,68,231,219,51,89,1,223,150,214,255,167,116,254,83,58,255,41,157,247,74,103,87,101,225,208,131,26,254,127,82,76,228,161,157,138,0,0}; \ No newline at end of file