From d1b0e6b5fe11d0e77e20432c11f8f68b421ac841 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:41:48 +1200 Subject: [PATCH 001/164] Bump version to 2024.8.0-dev --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 543b1d00cc..faf6ce19fa 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0-dev" +__version__ = "2024.8.0-dev" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From fb6c2aef59d5b3ca1463705eba01d0eb3de19535 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:58:54 +0200 Subject: [PATCH 002/164] helpers.cpp: Fix GLIBCXX_RELEASE check < 8 (#7062) --- esphome/core/helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 7f040f855f..e75b06ccd3 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -78,7 +78,7 @@ static const uint16_t CRC16_1021_BE_LUT_H[] = {0x0000, 0x1231, 0x2462, 0x3653, 0 // STL backports -#if _GLIBCXX_RELEASE < 7 +#if _GLIBCXX_RELEASE < 8 std::string to_string(int value) { return str_snprintf("%d", 32, value); } // NOLINT std::string to_string(long value) { return str_snprintf("%ld", 32, value); } // NOLINT std::string to_string(long long value) { return str_snprintf("%lld", 32, value); } // NOLINT From fa4fbf9d7384e1962e2982ab2ad0db449d33e4c6 Mon Sep 17 00:00:00 2001 From: Z3LIFF Date: Thu, 11 Jul 2024 00:01:14 -0400 Subject: [PATCH 003/164] Fix pmsa003i cold boot marked as failed on ESP32 et al (#7064) --- esphome/components/pmsa003i/pmsa003i.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/components/pmsa003i/pmsa003i.cpp b/esphome/components/pmsa003i/pmsa003i.cpp index ca3d28367a..a9665c6a5a 100644 --- a/esphome/components/pmsa003i/pmsa003i.cpp +++ b/esphome/components/pmsa003i/pmsa003i.cpp @@ -13,6 +13,15 @@ void PMSA003IComponent::setup() { PM25AQIData data; bool successful_read = this->read_data_(&data); + if (!successful_read) { + for (int i = 0; i < 3; i++) { + successful_read = this->read_data_(&data); + if (successful_read) { + break; + } + } + } + if (!successful_read) { this->mark_failed(); return; From dea1e9a1e05ea1b01c3a70d6789d02569498becf Mon Sep 17 00:00:00 2001 From: guillempages Date: Thu, 11 Jul 2024 06:08:51 +0200 Subject: [PATCH 004/164] [http_request] Fix follow_redirects on arduino (#7054) --- esphome/components/http_request/http_request_arduino.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp index 248a85a439..95b1cdc38e 100644 --- a/esphome/components/http_request/http_request_arduino.cpp +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -32,6 +32,13 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); + if (this->follow_redirects_) { + container->client_.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); + container->client_.setRedirectLimit(this->redirect_limit_); + } else { + container->client_.setFollowRedirects(HTTPC_DISABLE_FOLLOW_REDIRECTS); + } + #if defined(USE_ESP8266) std::unique_ptr stream_ptr; #ifdef USE_HTTP_REQUEST_ESP8266_HTTPS @@ -59,8 +66,6 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s "in your YAML, or use HTTPS"); } #endif // USE_ARDUINO_VERSION_CODE - - container->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); bool status = container->client_.begin(*stream_ptr, url.c_str()); #elif defined(USE_RP2040) From ee4d5178d6fa54dcc8069b86bfdd63571d8a4f9e Mon Sep 17 00:00:00 2001 From: Jimmy Hedman Date: Thu, 11 Jul 2024 06:09:51 +0200 Subject: [PATCH 005/164] [ethernet] Fix compile warning for IPv6 (#7048) --- esphome/components/ethernet/ethernet_component.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 6b34157b9d..962a864a29 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -394,7 +394,7 @@ void EthernetComponent::got_ip_event_handler(void *arg, esp_event_base_t event_b const esp_netif_ip_info_t *ip_info = &event->ip_info; ESP_LOGV(TAG, "[Ethernet event] ETH Got IP " IPSTR, IP2STR(&ip_info->ip)); global_eth_component->got_ipv4_address_ = true; -#if USE_NETWORK_IPV6 +#if USE_NETWORK_IPV6 && (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT; #else global_eth_component->connected_ = true; @@ -407,8 +407,12 @@ void EthernetComponent::got_ip6_event_handler(void *arg, esp_event_base_t event_ ip_event_got_ip6_t *event = (ip_event_got_ip6_t *) event_data; ESP_LOGV(TAG, "[Ethernet event] ETH Got IPv6: " IPV6STR, IPV62STR(event->ip6_info.ip)); global_eth_component->ipv6_count_ += 1; +#if (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->got_ipv4_address_ && (global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT); +#else + global_eth_component->connected_ = global_eth_component->got_ipv4_address_; +#endif } #endif /* USE_NETWORK_IPV6 */ From 1b57d8511be329fac18c039d22ac06679e616b8f Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 11 Jul 2024 16:10:18 +1200 Subject: [PATCH 006/164] Update webserver local assets to 20240704-081526 (#7041) --- .../components/web_server/server_index_v2.h | 83 +- .../components/web_server/server_index_v3.h | 735 +++++++++--------- 2 files changed, 410 insertions(+), 408 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index c942cda592..c9932624ba 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -68,7 +68,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe3, 0x9b, 0x82, 0xde, 0xc5, 0x0e, 0x21, 0xa9, 0x64, 0x54, 0x44, 0x2c, 0x97, 0x29, 0x21, 0x29, 0xc2, 0x3f, 0x90, 0x45, 0x68, 0xd6, 0x13, 0xec, 0x34, 0x30, 0x9c, 0xcb, 0x40, 0x71, 0x17, 0x3c, 0xe0, 0xc9, 0x9c, 0xa6, 0x82, 0xa6, 0xc1, 0x5f, 0x71, 0x4a, 0x87, 0x31, 0x40, 0xb1, 0xd3, 0xc4, 0xe3, 0x30, 0x3b, 0x1f, 0x87, 0xc9, 0x88, 0x46, 0xc1, - 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xeb, 0xd0, 0x5b, + 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xe6, 0xd0, 0x5b, 0x41, 0x93, 0x28, 0x73, 0x9e, 0xbf, 0x7b, 0xf9, 0x42, 0xef, 0x63, 0x45, 0x40, 0xa0, 0x45, 0x36, 0x9b, 0xd2, 0xd4, 0x43, 0x58, 0x0b, 0x88, 0x67, 0x4c, 0x32, 0xc7, 0x97, 0xe1, 0x54, 0x95, 0xb0, 0xec, 0xfd, 0x34, 0x0a, 0x05, 0x7d, 0x43, 0x93, 0x88, 0x25, 0x23, 0xb2, 0xd3, 0x54, 0xe5, 0xe3, 0x50, 0x57, 0x44, 0x45, 0xd1, 0xe5, 0xee, 0xb3, 0x58, @@ -150,19 +150,19 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xa6, 0x57, 0xfd, 0xcf, 0xf9, 0x64, 0x0a, 0xda, 0xd8, 0x0a, 0x49, 0x8f, 0xa8, 0x9e, 0xb0, 0xac, 0xcf, 0x37, 0x94, 0x55, 0xfa, 0xc8, 0xf3, 0x58, 0xa1, 0xa6, 0xc2, 0x5e, 0xde, 0x69, 0xe4, 0xb3, 0xa2, 0xa8, 0x60, 0x1c, 0x9b, 0x9c, 0x2a, 0xe7, 0xab, 0x2e, 0x19, 0x53, 0xf1, 0xda, 0x63, 0x8a, 0x0f, 0x33, 0xe0, 0x75, 0x16, 0xfb, 0x31, 0xe4, 0x6e, - 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0xb7, 0xca, 0xc8, 0xc6, 0xb7, 0xdb, 0xad, 0xe1, - 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0xbe, 0x5d, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, - 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x36, 0x07, 0xef, 0xd7, 0xd7, + 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0x67, 0xca, 0xc8, 0xc6, 0x67, 0xdb, 0xad, 0xe1, + 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0x3e, 0x5b, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, + 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x2c, 0x07, 0xef, 0xd7, 0xd7, 0xeb, 0x8e, 0xd7, 0xef, 0x69, 0x9a, 0x49, 0x45, 0xb4, 0xd0, 0x69, 0xbf, 0x2e, 0xc5, 0xd2, 0xd7, 0xc1, 0xd6, 0xf6, 0xa5, 0x09, 0xe2, 0x36, 0xfd, 0x63, 0xff, 0xc0, 0x45, 0xd2, 0x2d, 0xfc, 0x93, 0x3e, 0xf0, 0x1f, 0x8c, 0x5b, 0xf8, 0x19, 0xf9, 0x50, 0xf5, 0x0a, 0x47, 0x82, 0x3c, 0xeb, 0x3e, 0x33, 0x16, 0x33, 0x8f, 0xd9, 0xe0, 0xce, 0x73, 0x63, 0x26, 0xea, 0x10, 0x7a, 0x73, 0xf1, 0x42, 0x55, 0x80, 0x4b, 0x51, 0xba, 0xb3, 0x73, 0x63, 0xeb, 0x61, 0x21, 0x88, 0xbb, 0x1b, 0x33, 0xb1, 0xeb, 0xe2, 0x09, 0xb9, 0x82, 0x1f, 0xbb, 0x0b, 0xef, 0x65, 0x28, 0xc6, 0x7e, 0x1a, 0x26, - 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x4c, 0x10, 0xb7, - 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x33, 0x91, 0x77, 0xae, 0xf0, 0x59, 0xe1, 0xb1, 0xc7, - 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x4c, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, - 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0xad, - 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x5b, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, + 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x56, 0x10, 0xb7, + 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x5b, 0x91, 0x77, 0xae, 0xf0, 0x6d, 0xe1, 0xb1, 0xc7, + 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x56, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, + 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0x99, + 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x33, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, 0x69, 0x4f, 0x79, 0x18, 0x7c, 0x26, 0x68, 0x1a, 0x0a, 0x9e, 0xf6, 0x91, 0xad, 0x7e, 0xe0, 0xbf, 0x91, 0xab, 0x9e, 0xf3, 0x9f, 0xbe, 0xf8, 0x79, 0xf8, 0x73, 0xda, 0xbf, 0xc2, 0xaf, 0xc9, 0xfe, 0xa9, 0xd7, 0x0d, 0xbc, 0x9d, 0x7a, 0x7d, 0xf9, 0xf3, 0x7e, 0xef, 0x1f, 0x61, 0xfd, 0xd7, 0xb3, 0xfa, 0x4f, 0x7d, 0xb4, 0xf4, 0x7e, 0xde, 0xef, 0xf6, @@ -177,7 +177,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf2, 0x03, 0x64, 0x81, 0xc0, 0xf3, 0x30, 0x9e, 0xd1, 0x2c, 0xa0, 0x39, 0xc2, 0x03, 0x72, 0x21, 0xbc, 0x26, 0xc2, 0xcf, 0x05, 0xfc, 0x68, 0x21, 0x7c, 0xa1, 0x03, 0x98, 0x70, 0x90, 0x15, 0x51, 0x25, 0x5c, 0x69, 0x2c, 0x2e, 0xc2, 0xd3, 0x0d, 0x95, 0x62, 0x0c, 0xde, 0x05, 0x84, 0x87, 0x95, 0x70, 0x27, 0xbe, 0x21, 0x86, 0x24, 0xde, 0xa5, 0x94, - 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0x9d, 0xe1, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, + 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0xdd, 0xe2, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, 0xaa, 0x73, 0xa1, 0x62, 0x04, 0x20, 0x64, 0xab, 0xbe, 0x18, 0xd8, 0xf1, 0x9d, 0x74, 0xcd, 0x61, 0x95, 0x86, 0x37, 0x2e, 0xaa, 0xc6, 0x45, 0x59, 0x32, 0x0f, 0x63, 0x16, 0x39, 0x82, 0x4e, 0xa6, 0x71, 0x28, 0xa8, 0xa3, 0xd7, 0xeb, 0x84, 0x30, 0x90, 0x5b, 0xa8, 0x0c, 0x91, 0x65, 0x70, 0x46, 0x26, 0xe0, 0x04, 0x67, 0xc5, 0x83, 0xe8, 0x94, 0x56, @@ -220,10 +220,10 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x73, 0xd4, 0x69, 0xa0, 0x45, 0xa5, 0xad, 0xd4, 0x99, 0xaa, 0x71, 0xf4, 0x82, 0x4f, 0xcf, 0x49, 0xa3, 0x3d, 0x3f, 0x1d, 0xb5, 0xe7, 0xb5, 0x1a, 0xca, 0x0c, 0x69, 0xcd, 0x7a, 0xf3, 0x3e, 0x7e, 0x03, 0x4e, 0x3d, 0x9b, 0x96, 0x70, 0x65, 0x79, 0x2d, 0xbd, 0xbc, 0x5a, 0x2d, 0xc9, 0x51, 0xdb, 0xea, 0x3a, 0x52, 0x5d, 0xf3, 0x5c, 0xe1, 0x64, 0x95, - 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0x99, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, + 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0xad, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, 0xc0, 0x3e, 0x95, 0x94, 0xf0, 0x00, 0x0b, 0xd0, 0xb5, 0xf0, 0x04, 0x4f, 0xf0, 0xac, 0xd6, 0x94, 0x64, 0x5e, 0x6f, 0xb6, 0xab, 0x63, 0x3d, 0x2a, 0xc7, 0xc2, 0xb3, 0x1a, 0x99, 0x14, 0x58, 0xca, 0x93, 0x5a, 0x2d, 0xaf, 0x06, 0x3b, - 0xcd, 0xc9, 0xad, 0x04, 0x20, 0xce, 0x56, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, + 0xcd, 0xc9, 0xad, 0x04, 0x20, 0x6e, 0x57, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, 0xa4, 0x28, 0x11, 0x98, 0xe5, 0x79, 0x29, 0xd9, 0x41, 0x8c, 0x62, 0x4a, 0x52, 0xe0, 0x3c, 0xd2, 0xee, 0xc2, 0x09, 0xe6, 0x78, 0x2c, 0xf9, 0x06, 0x21, 0xe4, 0xc2, 0xa4, 0xb3, 0x08, 0xc9, 0x83, 0x62, 0xc2, 0x2c, 0x99, 0x94, 0x11, 0xea, 0x5f, 0xee, 0x9e, 0xf3, 0x7b, 0x6d, 0xb2, 0x1e, 0xeb, 0x07, 0xb2, 0x59, 0xac, 0x39, 0x57, 0x48, 0xde, 0x7b, @@ -238,14 +238,14 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x13, 0xf3, 0xec, 0xa5, 0x5f, 0xd6, 0xca, 0xc6, 0x97, 0xbb, 0x67, 0xef, 0x37, 0x35, 0x83, 0xf2, 0x7c, 0x56, 0xda, 0xf8, 0x12, 0xbe, 0x05, 0x8d, 0x83, 0x85, 0x16, 0x0e, 0x01, 0xcb, 0xb1, 0x14, 0x48, 0x41, 0x96, 0x17, 0xae, 0x91, 0xa7, 0x38, 0x21, 0x32, 0x0c, 0x54, 0xdd, 0x35, 0xad, 0xe6, 0x31, 0x9e, 0x5c, 0x0c, 0xf8, 0x94, 0x6e, 0x89, 0x0d, - 0x9d, 0x21, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, + 0xdd, 0x22, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, 0x2b, 0xb2, 0x05, 0x8f, 0x49, 0x03, 0xc7, 0xa4, 0x81, 0x43, 0x92, 0xf5, 0x1a, 0x4a, 0x40, 0xb4, 0xc3, 0x62, 0x5c, 0x25, 0x66, 0x20, 0x2b, 0x4c, 0x9f, 0x56, 0x25, 0x80, 0xa3, 0x76, 0x28, 0x7d, 0x8f, 0x52, 0xa6, 0x47, 0x92, 0x2c, 0xde, 0x7a, 0x1c, 0x73, 0x39, 0xf0, 0x05, 0xbb, 0x8e, 0x21, 0xb1, 0x04, 0x56, 0x85, 0x05, 0x0a, 0x8a, 0xa6, 0x4d, 0xdd, 0x34, 0xf4, 0xe5, 0x3e, 0x71, 0x1c, 0xfa, 0xc0, 0xb9, 0x71, 0xa8, 0xf3, 0x70, 0xb2, 0xf5, 0x2e, 0xc7, 0x7b, 0x7b, 0x9e, 0xea, 0xf4, 0x8b, 0xf0, 0xb8, 0xa9, 0x2f, 0x23, 0x77, 0xdf, 0x2b, 0x5e, 0x11, 0x21, 0x09, 0x7f, 0xad, 0x16, 0xf7, 0x73, 0x08, 0x43, 0x7b, 0x61, 0x15, 0x83, 0x06, 0x78, 0xa9, 0xeb, 0x55, 0x97, 0x5f, 0xab, 0x15, 0x51, - 0xda, 0x2a, 0xb6, 0xce, 0x70, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, + 0xda, 0x2a, 0xb6, 0x6e, 0x71, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, 0x59, 0x66, 0x16, 0x63, 0x1d, 0x09, 0x06, 0xed, 0xbe, 0xd1, 0x59, 0x0b, 0x58, 0x66, 0x57, 0xe9, 0x46, 0x86, 0x9d, 0xb5, 0x50, 0x60, 0x1a, 0x41, 0x54, 0x0a, 0x1a, 0xd5, 0x72, 0x4d, 0xde, 0x6f, 0xd7, 0x73, 0x2e, 0x71, 0x86, 0xb4, 0x93, 0x4b, 0x42, 0x21, 0x91, 0xd5, 0x2a, 0x90, 0xf2, 0x9c, 0x4c, 0xb7, 0x93, 0xfc, 0x99, 0x45, 0xf2, 0x4f, 0x08, @@ -268,7 +268,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x36, 0x44, 0x4d, 0xa5, 0xd4, 0x91, 0x2d, 0x50, 0xd1, 0xc1, 0x9f, 0x7b, 0x4c, 0x2b, 0x6e, 0x26, 0x6e, 0x06, 0x0c, 0xf8, 0x89, 0xf0, 0x54, 0x30, 0x0a, 0x64, 0x06, 0xf7, 0x67, 0x5e, 0x65, 0xea, 0x36, 0x97, 0xdd, 0xb0, 0x46, 0xdc, 0xd8, 0x46, 0x13, 0x97, 0x71, 0xbd, 0xf3, 0x92, 0x97, 0x0e, 0x55, 0x06, 0xb5, 0x30, 0x5c, 0xb0, 0x4c, 0x24, 0xb1, - 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0x6e, 0x85, + 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0xce, 0x84, 0xb5, 0xa3, 0xc6, 0x89, 0x2d, 0xe7, 0xb4, 0xa4, 0xfe, 0x5b, 0x48, 0x75, 0x59, 0x3d, 0xf3, 0xcf, 0xa5, 0x2c, 0x64, 0x38, 0xab, 0x30, 0xf6, 0x44, 0x32, 0x76, 0x04, 0x7a, 0x9a, 0x49, 0xfc, 0xee, 0xea, 0x8c, 0x17, 0xa6, 0xa5, 0x9c, 0x26, 0xb1, 0x37, 0x45, 0xb4, 0xdc, 0xfa, 0xbd, 0xb2, 0x1b, 0x01, 0x23, 0x90, 0x05, 0x84, 0x35, 0x67, 0x4f, 0x10, @@ -312,7 +312,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf1, 0xb5, 0x7b, 0x78, 0x63, 0x02, 0x1e, 0xb4, 0x87, 0x4d, 0x61, 0x19, 0xdb, 0x99, 0xba, 0x07, 0x64, 0x8f, 0x4f, 0xb8, 0xd1, 0xdd, 0xaa, 0x56, 0xc6, 0x1b, 0xb0, 0xff, 0x11, 0x1e, 0x9b, 0xcb, 0x71, 0x54, 0x73, 0x60, 0x1a, 0x2c, 0xf2, 0xc2, 0x29, 0xc0, 0x95, 0xf2, 0x96, 0x22, 0xcc, 0x73, 0x19, 0xe0, 0xfe, 0x16, 0x7f, 0xa7, 0x59, 0xe2, 0xb0, - 0xe0, 0x38, 0xb7, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, + 0xe0, 0x38, 0x67, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, 0xeb, 0x85, 0x6c, 0x4d, 0x4b, 0xc5, 0xb4, 0x48, 0xa9, 0x91, 0xd3, 0x6c, 0xc8, 0xe3, 0x34, 0x56, 0xb6, 0x28, 0x4e, 0x55, 0x65, 0x5e, 0xb4, 0x05, 0x8b, 0x65, 0x68, 0x71, 0xb9, 0xf4, 0xaa, 0xa8, 0x26, 0xcc, 0x8a, 0x64, 0x20, 0xcc, 0xac, 0x8c, 0x8a, 0x8a, 0x66, 0xad, 0xfa, 0x78, 0x68, 0x35, 0xa1, 0xc8, 0xe8, 0xe6, 0x15, 0x38, 0x6c, 0x17, 0x82, @@ -612,31 +612,32 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xde, 0x0b, 0x3e, 0xda, 0x3c, 0x56, 0xcc, 0x47, 0x5d, 0x79, 0x05, 0x42, 0xdd, 0xb5, 0x35, 0xca, 0x2f, 0x8f, 0xdd, 0xce, 0xa9, 0x56, 0x06, 0x1c, 0x19, 0x0e, 0x77, 0x8f, 0x1a, 0xe6, 0x56, 0x45, 0xcc, 0x47, 0x70, 0x20, 0x55, 0x17, 0x6b, 0x92, 0x8a, 0xc7, 0x7d, 0xdc, 0xec, 0x9c, 0x86, 0x8e, 0xe4, 0x2d, 0x92, 0x79, 0x64, 0xc1, 0x3e, 0x74, 0x1e, - 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xbc, - 0x9c, 0x09, 0x7e, 0x86, 0x2b, 0x8b, 0x94, 0x2c, 0x3c, 0xd7, 0xbe, 0x73, 0xb0, 0x55, 0x80, 0x84, 0x5c, 0x47, 0x71, - 0x78, 0xe3, 0x63, 0xd7, 0xb2, 0x37, 0x77, 0x3b, 0xff, 0xfa, 0x3f, 0xfe, 0x97, 0x76, 0x9b, 0x9f, 0xee, 0x8f, 0x9b, - 0x66, 0xac, 0x15, 0x44, 0xe7, 0xa7, 0x70, 0x11, 0xb1, 0x8c, 0xf3, 0xd2, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, - 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x41, 0xf6, 0x0d, 0x24, 0x0d, 0x75, 0xb5, 0x08, 0x48, 0xf0, 0x37, 0xdd, 0xa1, 0x31, - 0x57, 0x31, 0xe4, 0x69, 0xb5, 0x6f, 0xd4, 0x94, 0x07, 0xaa, 0x72, 0xab, 0x26, 0xd5, 0x5f, 0xaf, 0xd2, 0x4c, 0x2d, - 0xad, 0x5c, 0xa6, 0xc9, 0x5d, 0xa7, 0x88, 0x53, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0xf0, 0xd3, - 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0x0b, 0x18, 0x3a, 0x44, 0x25, 0xf9, 0x84, 0x53, 0xc6, - 0xa7, 0x14, 0xc3, 0x70, 0x20, 0x47, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xeb, 0x35, 0x17, 0x72, 0x42, 0x79, 0xd8, - 0x34, 0x74, 0xf2, 0xd0, 0xe6, 0x25, 0x8d, 0x54, 0x50, 0x2e, 0x69, 0x31, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0x46, - 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x38, 0x65, 0xa1, 0x24, 0x2f, 0xcb, 0x1d, 0x08, 0x97, 0x2c, 0xe0, 0x31, 0x68, 0x59, - 0xc5, 0x72, 0xf7, 0x2a, 0x7d, 0xda, 0x1f, 0x66, 0x99, 0x60, 0x43, 0x40, 0xb9, 0x72, 0xfd, 0xca, 0xc8, 0x74, 0x1d, - 0xd4, 0xbf, 0xf8, 0x2e, 0x97, 0xa3, 0x28, 0xdb, 0xfa, 0xf0, 0xe4, 0x4f, 0xf9, 0x5f, 0x26, 0xa0, 0x64, 0x39, 0xde, - 0x24, 0xbc, 0xd5, 0x16, 0xf7, 0x71, 0xa3, 0x31, 0xbd, 0x45, 0x8b, 0x72, 0x06, 0xbc, 0x6d, 0x32, 0xe9, 0x2e, 0xb6, - 0x07, 0x94, 0x21, 0xed, 0xc2, 0x33, 0xdd, 0x70, 0xc0, 0xbd, 0xed, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x1c, 0x65, - 0xbf, 0x42, 0xe8, 0x59, 0xfb, 0x91, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0x17, - 0xed, 0xec, 0xd0, 0xb9, 0x1d, 0xf4, 0x3e, 0x84, 0x30, 0xf6, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, - 0x62, 0xc7, 0xca, 0x69, 0x48, 0x07, 0x74, 0x68, 0xfc, 0xef, 0xba, 0x5e, 0xc5, 0xc1, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, - 0x34, 0x48, 0x32, 0x46, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, - 0x47, 0xdc, 0x43, 0x60, 0x33, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x13, 0x5e, 0xbd, 0x0e, 0x99, 0xfb, 0xb2, - 0xbb, 0x3d, 0x94, 0x72, 0xa4, 0x7d, 0xaf, 0x03, 0xd9, 0xaf, 0x2a, 0x1e, 0x28, 0x2d, 0x63, 0x5a, 0x68, 0x73, 0xbd, - 0x12, 0xd5, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, - 0x15, 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0xe5, 0x15, 0xb8, 0x87, 0xcc, 0xd2, 0x50, 0x49, 0x11, - 0xba, 0x91, 0x3e, 0x0a, 0xea, 0x97, 0x4e, 0x97, 0x80, 0xcf, 0x9a, 0x75, 0xfe, 0x1f, 0xd6, 0xb2, 0x30, 0xa4, 0x67, - 0x88, 0x00, 0x00}; + 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xdc, + 0x78, 0xc4, 0xf5, 0x9d, 0xa3, 0x56, 0xe9, 0x6e, 0x3b, 0x04, 0x9b, 0xc7, 0xb8, 0xe6, 0xa4, 0x4f, 0xce, 0x02, 0x8b, + 0x77, 0x4e, 0xf7, 0xc3, 0x15, 0x8c, 0x48, 0x7e, 0x9f, 0x6b, 0x47, 0x3b, 0x18, 0x36, 0x40, 0x6f, 0xae, 0xa3, 0xc4, + 0x81, 0x71, 0xc8, 0x6b, 0x41, 0x9d, 0xbb, 0x9d, 0x7f, 0xfd, 0x1f, 0xff, 0x4b, 0xfb, 0xd8, 0x4f, 0xf7, 0xc7, 0x4d, + 0x33, 0xd6, 0xca, 0xae, 0xe4, 0xa7, 0x70, 0x6b, 0xb1, 0x0c, 0x0a, 0xd3, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, + 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x9b, 0xf6, 0x75, 0x25, 0x0d, 0x75, 0xb5, 0x08, 0xe8, 0xf5, 0x37, 0x5d, 0xb8, 0x31, + 0xf7, 0x36, 0xe4, 0xd1, 0xb6, 0xaf, 0xdf, 0x94, 0xa7, 0xaf, 0x72, 0x05, 0x27, 0xd5, 0x9f, 0xba, 0xd2, 0x1c, 0x30, + 0xad, 0xdc, 0xbc, 0xc9, 0x5d, 0xa7, 0x08, 0x6a, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0x58, 0xd5, + 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0xdb, 0x1a, 0x3a, 0x9e, 0x25, 0x99, 0x8a, 0x53, 0x06, + 0xb3, 0x14, 0x77, 0x71, 0x20, 0xa1, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xbb, 0x38, 0x17, 0x72, 0x42, 0x79, 0x32, + 0x35, 0x74, 0xf2, 0x84, 0xe7, 0x25, 0x41, 0x55, 0x50, 0x2e, 0x09, 0x37, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0xfa, + 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x90, 0x09, 0x94, 0xe4, 0x65, 0xb9, 0x03, 0xb1, 0x95, 0x05, 0x3c, 0x06, 0x2d, 0xab, + 0x58, 0xee, 0x5e, 0xa5, 0x4f, 0xfb, 0xc3, 0x2c, 0x13, 0x6c, 0x08, 0x28, 0x57, 0x7e, 0x62, 0x19, 0xc6, 0xae, 0x83, + 0xae, 0x18, 0xdf, 0xe5, 0x72, 0x14, 0x45, 0xa0, 0x87, 0x27, 0x7f, 0xca, 0xff, 0x32, 0x01, 0x8d, 0xcc, 0xf1, 0x26, + 0xe1, 0xad, 0x36, 0xcf, 0x8f, 0x1b, 0x8d, 0xe9, 0x2d, 0x5a, 0x94, 0x33, 0xe0, 0x6d, 0x93, 0x49, 0x3a, 0xb6, 0x07, + 0x94, 0xf1, 0xef, 0xc2, 0x8d, 0xdd, 0x70, 0xc0, 0x17, 0xee, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x49, 0x65, 0xbf, + 0x42, 0x9c, 0x5a, 0x3b, 0x9d, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0xb7, 0xf2, + 0xec, 0x38, 0xbb, 0x1d, 0x21, 0x3f, 0x84, 0x98, 0xf7, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, 0x62, + 0x07, 0xd6, 0x69, 0x48, 0x07, 0x74, 0x68, 0x9c, 0xf5, 0xba, 0x5e, 0x05, 0xcd, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, 0x34, + 0x48, 0x32, 0xa0, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, 0x87, + 0xe7, 0x43, 0xe0, 0x49, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x6d, 0x5e, 0xbd, 0x3b, 0x99, 0xfb, 0xb2, 0xbb, + 0x3d, 0x94, 0xf2, 0xba, 0x7d, 0xaf, 0xa3, 0xde, 0xaf, 0x2a, 0xee, 0x2a, 0x2d, 0x90, 0x5a, 0x68, 0x73, 0xbd, 0x92, + 0xeb, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, 0xc9, + 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0x4d, 0x17, 0xb8, 0x87, 0x4c, 0xe9, 0x50, 0x19, 0x14, 0xba, + 0x91, 0x3e, 0x0a, 0xea, 0x97, 0xce, 0xad, 0x80, 0x6f, 0xa0, 0x75, 0xfe, 0x1f, 0xa2, 0x48, 0xf6, 0xdd, 0x94, 0x88, + 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index bde1ce1fb5..0c16ea9f37 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,373 +3632,374 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0x93, 0x2e, 0xb7, 0x6d, 0x24, 0xfd, 0x3f, 0x4f, 0x01, 0xc3, 0x5e, 0x87, 0xb0, 0x01, 0x08, 0x00, 0x45, 0x89, - 0x26, 0x45, 0x69, 0x13, 0x1f, 0xb5, 0x4e, 0x29, 0x71, 0xca, 0x56, 0x5c, 0xbb, 0x51, 0x54, 0x22, 0x48, 0x0e, 0x49, - 0xac, 0x41, 0x80, 0x05, 0x80, 0x3a, 0x42, 0x63, 0x9f, 0x65, 0x9f, 0x65, 0x9f, 0xec, 0xab, 0xee, 0x9e, 0x19, 0x0c, - 0x0e, 0x1e, 0x8a, 0x9d, 0xdd, 0xaf, 0x12, 0xdb, 0xc4, 0xdc, 0xd3, 0x33, 0xd3, 0xd3, 0xd3, 0xa7, 0x3f, 0xe3, 0xbc, - 0x17, 0xb3, 0xc5, 0xf6, 0xeb, 0xee, 0xf3, 0x67, 0x66, 0xe3, 0x96, 0x04, 0x82, 0xcf, 0xce, 0xe2, 0xd9, 0x2c, 0x64, - 0x2d, 0x5d, 0x04, 0x0f, 0xd1, 0x4d, 0xd9, 0xcd, 0xd9, 0x23, 0x47, 0x78, 0xec, 0x34, 0xf2, 0x4d, 0x47, 0x4b, 0xcc, - 0x98, 0x49, 0x97, 0x76, 0x44, 0xb9, 0x22, 0x6f, 0xf6, 0x06, 0xc5, 0x1b, 0x7c, 0x5d, 0x8a, 0xa3, 0x6b, 0x4d, 0xe2, - 0xd5, 0x28, 0x64, 0x16, 0x6e, 0x77, 0xe8, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x10, 0xa5, 0xe5, 0x91, 0x63, 0x82, 0xdf, - 0x99, 0x38, 0xc5, 0xf7, 0x60, 0x6e, 0xf4, 0x61, 0x52, 0x76, 0x56, 0x1d, 0x3e, 0xe8, 0x8a, 0x00, 0xab, 0x87, 0x3a, - 0xc8, 0xe0, 0xed, 0xd7, 0x70, 0x6a, 0x07, 0xfa, 0x07, 0xd8, 0x7d, 0xa9, 0xde, 0x6f, 0x3a, 0xfa, 0x83, 0x4b, 0xfd, - 0x03, 0xc2, 0x18, 0xa3, 0x17, 0xbf, 0xa4, 0xdd, 0xab, 0x9b, 0x3a, 0x09, 0xbd, 0x57, 0x18, 0xc7, 0x00, 0x98, 0xbe, - 0xaf, 0x02, 0x7f, 0x16, 0xc5, 0x69, 0x16, 0x8c, 0xf5, 0xab, 0xfe, 0xdb, 0xa0, 0x75, 0xb9, 0xc8, 0x5a, 0xc6, 0x95, - 0x39, 0xce, 0xd4, 0x10, 0x28, 0x02, 0x61, 0x62, 0x04, 0x94, 0x4d, 0x85, 0xd4, 0x13, 0xb4, 0xb5, 0xa0, 0x40, 0xcd, - 0x58, 0x68, 0x9c, 0x0d, 0xa0, 0x5c, 0x25, 0x9e, 0x0a, 0x06, 0x86, 0xd2, 0xb1, 0xa6, 0xd1, 0xa7, 0x97, 0xca, 0xcb, - 0xd5, 0x1a, 0xaf, 0xf2, 0xac, 0xb8, 0x2d, 0xd1, 0x07, 0xb0, 0x30, 0x9c, 0xa1, 0xef, 0x47, 0xaa, 0xd2, 0x67, 0xe9, - 0xde, 0x1d, 0x7e, 0x57, 0xa6, 0x0b, 0xe0, 0xfe, 0x06, 0x8d, 0x8b, 0x28, 0xce, 0x34, 0x70, 0x6c, 0x03, 0x3d, 0x0e, - 0xab, 0x4a, 0x62, 0xbc, 0xd5, 0x96, 0x91, 0x73, 0x64, 0xf0, 0x3d, 0x5e, 0x7e, 0x2d, 0xee, 0xde, 0xac, 0xe4, 0xc1, - 0x82, 0x1e, 0x0b, 0x11, 0x2c, 0x60, 0x16, 0x9f, 0xc7, 0xb7, 0x55, 0x39, 0xc8, 0xcb, 0xe1, 0xee, 0xbb, 0xb7, 0x25, - 0xc8, 0x64, 0x11, 0xd5, 0xaf, 0xc5, 0x03, 0x93, 0x0a, 0x42, 0xa7, 0x72, 0xa6, 0x50, 0xf1, 0x43, 0xd0, 0x30, 0x19, - 0xe8, 0x89, 0xe1, 0x5d, 0x00, 0x28, 0x89, 0x5f, 0xd3, 0xc3, 0xfc, 0x5a, 0x84, 0x4e, 0x16, 0x81, 0x8b, 0x95, 0xcb, - 0x19, 0xb0, 0x6b, 0xb4, 0x5c, 0x65, 0xe8, 0x6a, 0x17, 0x06, 0xc0, 0x72, 0x5d, 0x43, 0xd7, 0x9d, 0x80, 0xa5, 0x0b, - 0x32, 0x31, 0xd7, 0xb5, 0x60, 0x52, 0x4f, 0xe3, 0x44, 0x2f, 0x20, 0x2f, 0xc4, 0xef, 0xc8, 0xa8, 0x82, 0xcf, 0x84, - 0x4f, 0x63, 0x6c, 0x16, 0x7e, 0xea, 0x5b, 0x63, 0x14, 0xe8, 0x34, 0x60, 0x86, 0x31, 0xb5, 0xd3, 0x6f, 0x85, 0x8d, - 0x93, 0x05, 0xf7, 0x9b, 0xa5, 0x69, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, 0xd6, 0xbe, - 0xd4, 0x15, 0xd0, 0x2f, 0x74, 0x52, 0x14, 0x18, 0x22, 0x18, 0x86, 0xf9, 0x75, 0x61, 0xb9, 0x53, 0xcc, 0x17, 0x76, - 0x19, 0xa5, 0x6b, 0x28, 0xba, 0x1f, 0x70, 0x01, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xf2, 0x7c, 0x53, 0x15, - 0xfa, 0x1b, 0xba, 0x46, 0x88, 0x9e, 0x00, 0x40, 0x38, 0x5f, 0xd7, 0xfe, 0x2a, 0xd3, 0x18, 0x9f, 0xad, 0x14, 0x6a, - 0x42, 0x5f, 0xd7, 0xfa, 0x73, 0x66, 0x4f, 0x58, 0xe6, 0x07, 0x21, 0x55, 0xe9, 0x8b, 0x68, 0xf5, 0xb5, 0xe9, 0xa5, - 0xe5, 0xe9, 0x45, 0xe5, 0xfd, 0x83, 0x93, 0xa1, 0x2b, 0x80, 0xc6, 0x8d, 0x33, 0xc3, 0x28, 0x56, 0xcd, 0x2b, 0x4a, - 0x79, 0xff, 0xd5, 0xe5, 0x60, 0xb0, 0x1c, 0x11, 0x2c, 0x07, 0x8b, 0xc6, 0xf1, 0x84, 0xfd, 0xf2, 0xfe, 0xad, 0x0c, - 0x9b, 0x05, 0x1c, 0xa0, 0x21, 0xdf, 0x98, 0x29, 0xd2, 0x0f, 0x09, 0xd2, 0x0e, 0x14, 0xe0, 0x4a, 0x93, 0x5b, 0x28, - 0xc9, 0x75, 0xed, 0x8c, 0xc6, 0xce, 0x26, 0x34, 0xea, 0x41, 0x8c, 0xb5, 0x92, 0xfc, 0xe4, 0x80, 0x4a, 0xd3, 0x6d, - 0x47, 0x85, 0x00, 0x0c, 0x09, 0xcc, 0xb0, 0x80, 0x02, 0x44, 0xf8, 0x1c, 0xb8, 0xc5, 0x83, 0xc2, 0x5e, 0x20, 0x9f, - 0xdd, 0x3d, 0x2b, 0x93, 0x2a, 0x58, 0x4b, 0x3f, 0x3d, 0xc1, 0x98, 0x5d, 0x70, 0x5f, 0x83, 0x97, 0x8f, 0x93, 0x03, - 0xfa, 0xd4, 0x2a, 0x27, 0xa2, 0x68, 0x44, 0x3c, 0xed, 0x7a, 0xbc, 0x81, 0x07, 0x1d, 0x15, 0x08, 0x11, 0x0f, 0xa9, - 0x7e, 0xae, 0x6b, 0x0b, 0x4e, 0x1a, 0x71, 0x77, 0x42, 0xe0, 0x6b, 0xc0, 0x81, 0xb3, 0xab, 0x6b, 0x0b, 0xff, 0x0e, - 0x67, 0x2e, 0x72, 0xfc, 0xbb, 0x96, 0xcb, 0xb3, 0x8a, 0xb3, 0x96, 0x96, 0xcf, 0xda, 0x98, 0x2f, 0x2e, 0x18, 0x12, - 0xc8, 0x97, 0xf5, 0x1c, 0x05, 0xb4, 0x0d, 0x8b, 0x3b, 0x17, 0x8b, 0x3b, 0xd9, 0xb0, 0xb8, 0x93, 0x2d, 0x8b, 0x1b, - 0xf2, 0x85, 0xd4, 0x24, 0xe8, 0x12, 0x34, 0x0e, 0x93, 0xc0, 0xe3, 0x84, 0x46, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, - 0x86, 0xa0, 0x1c, 0xb5, 0x01, 0x56, 0x4d, 0x70, 0x51, 0x00, 0x51, 0x9f, 0xb8, 0x3c, 0x75, 0x62, 0xde, 0x10, 0x83, - 0xb3, 0x15, 0x56, 0xe7, 0x0b, 0xbb, 0x94, 0xe2, 0x8b, 0xb7, 0xe6, 0x1b, 0x66, 0x3a, 0xdf, 0x32, 0xd3, 0x71, 0xe9, - 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x14, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, - 0xab, 0xec, 0xa8, 0xa5, 0x9f, 0xa6, 0xb7, 0x71, 0x02, 0x12, 0x17, 0x68, 0xe6, 0x61, 0x5b, 0x6a, 0x11, 0x44, 0xdc, - 0x99, 0xcb, 0xc6, 0xcd, 0x54, 0xe4, 0xab, 0x5b, 0xca, 0xeb, 0x74, 0xa8, 0xc4, 0xd2, 0xcf, 0x32, 0x96, 0x20, 0xd0, - 0x7d, 0xf0, 0xfa, 0xfd, 0xff, 0x64, 0x9b, 0x35, 0xe0, 0x90, 0x50, 0xc1, 0xea, 0x88, 0xa1, 0x97, 0x40, 0x5b, 0x25, - 0xe2, 0x22, 0x56, 0x1c, 0xc3, 0x25, 0x12, 0xf0, 0x3f, 0xe1, 0x71, 0x6d, 0x25, 0x8a, 0xe9, 0x92, 0x7b, 0x64, 0xd8, - 0x4b, 0x7f, 0xf2, 0x01, 0x04, 0x7b, 0x2d, 0xcf, 0x04, 0x25, 0x5d, 0xd5, 0x0d, 0x5c, 0x42, 0xc4, 0xde, 0xb8, 0x40, - 0x92, 0x88, 0x25, 0xb9, 0x0a, 0x14, 0x58, 0x4f, 0xfa, 0xd6, 0xf4, 0x6a, 0xed, 0xe5, 0x07, 0xb3, 0xc0, 0xa8, 0x61, - 0x4d, 0x40, 0x6d, 0xe1, 0xe0, 0x54, 0xbe, 0xb9, 0x42, 0xd3, 0x3d, 0x32, 0x80, 0xf3, 0x7b, 0x09, 0xf1, 0x4c, 0x1d, - 0xf1, 0xa0, 0x1d, 0x26, 0x70, 0x6b, 0x5d, 0x3a, 0x57, 0xf9, 0xd3, 0x19, 0xfe, 0x72, 0xaf, 0xf2, 0xa7, 0x23, 0xfc, - 0xe5, 0x5d, 0x61, 0xe4, 0xba, 0x86, 0x87, 0xbc, 0x32, 0x67, 0xfd, 0xb4, 0xb4, 0x9f, 0x48, 0xff, 0xec, 0x01, 0xdb, - 0x86, 0x2f, 0xf0, 0xe3, 0x27, 0xeb, 0x14, 0x2c, 0x2e, 0xd5, 0x39, 0x44, 0x76, 0x62, 0xe4, 0x8d, 0xe9, 0xb3, 0x0d, - 0xe9, 0x23, 0xe3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0xcc, 0x86, 0xb8, 0x1e, 0x05, 0x91, 0x9f, - 0xdc, 0x5f, 0xd3, 0xf3, 0xa2, 0x25, 0x68, 0x77, 0xc9, 0x5e, 0x21, 0xf2, 0xb2, 0x2c, 0xee, 0xca, 0x14, 0x06, 0xef, - 0x3d, 0xbf, 0xe8, 0x07, 0x7f, 0x4f, 0x14, 0xb2, 0xad, 0xf4, 0x00, 0xe5, 0x0b, 0x52, 0xea, 0xe8, 0xfa, 0xc9, 0xba, - 0xc5, 0xea, 0xcd, 0x54, 0x66, 0x5b, 0xa1, 0x0b, 0x61, 0x79, 0xf0, 0x31, 0xbb, 0x98, 0x04, 0x3d, 0x94, 0x67, 0x8d, - 0xe2, 0x3b, 0xeb, 0xc9, 0x3a, 0x3b, 0xd3, 0x17, 0x7e, 0xf2, 0x89, 0x4d, 0xac, 0x71, 0x90, 0x8c, 0x43, 0xa6, 0xf7, - 0xf4, 0x51, 0xe8, 0x47, 0x9f, 0xf8, 0xa7, 0x15, 0xaf, 0x32, 0x94, 0x50, 0xef, 0x7c, 0xfb, 0x0a, 0x98, 0x10, 0xcb, - 0x0e, 0x89, 0xd5, 0x06, 0x28, 0x68, 0x2f, 0x25, 0xc3, 0xab, 0x20, 0x14, 0x8b, 0x52, 0x26, 0x28, 0x58, 0x82, 0xd0, - 0x1c, 0x2c, 0x56, 0x4d, 0x1d, 0xd7, 0x4b, 0x37, 0xd5, 0xa9, 0x12, 0xb3, 0x52, 0x86, 0x5c, 0xbc, 0xc6, 0x16, 0xfe, - 0x78, 0x77, 0x14, 0x0c, 0x7b, 0xff, 0xee, 0x64, 0x2b, 0x5f, 0x36, 0x43, 0x48, 0xb5, 0xc8, 0x52, 0xe2, 0x01, 0x9d, - 0x73, 0x02, 0x73, 0x73, 0xd7, 0x6a, 0x65, 0x3f, 0x4d, 0x57, 0x0b, 0x36, 0x21, 0xc9, 0xe0, 0x59, 0x31, 0xa8, 0xf2, - 0xcb, 0x42, 0x1d, 0xd8, 0x6f, 0x2b, 0xef, 0xf8, 0xf0, 0x25, 0x68, 0x2c, 0x00, 0x41, 0x19, 0x4f, 0xa7, 0x7a, 0xf1, - 0xc6, 0xdf, 0x51, 0xcd, 0x3d, 0xfc, 0x6d, 0xf5, 0xe6, 0xb5, 0xf3, 0x46, 0x56, 0x8e, 0x80, 0x30, 0x16, 0xe2, 0x57, - 0x4e, 0x17, 0x2b, 0xe3, 0x15, 0x33, 0x9a, 0xfa, 0xd1, 0xe6, 0xe9, 0x5c, 0x96, 0xb6, 0xf8, 0x92, 0xb1, 0x09, 0x10, - 0xdc, 0x66, 0x2d, 0xf5, 0x3a, 0x64, 0x37, 0x4c, 0x8a, 0x76, 0xeb, 0x9d, 0x35, 0xd4, 0x40, 0xdf, 0x73, 0x5c, 0x64, - 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x43, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x68, 0xea, 0xca, 0x00, - 0x36, 0x8e, 0xec, 0x6c, 0x43, 0x7a, 0x0f, 0x03, 0x4f, 0x37, 0x8f, 0xcd, 0x74, 0x8d, 0x1e, 0xf8, 0xea, 0xe6, 0x70, - 0x0a, 0xe1, 0xe4, 0xb5, 0x0a, 0x76, 0xc8, 0x26, 0x88, 0x35, 0x31, 0xc9, 0x74, 0xe2, 0xbe, 0x08, 0x6d, 0x47, 0x54, - 0xfb, 0x15, 0x7c, 0xa8, 0xc6, 0xb5, 0xd1, 0xca, 0x33, 0x1f, 0x61, 0x40, 0xd7, 0x88, 0xa5, 0xe9, 0x46, 0x80, 0xc9, - 0x45, 0x37, 0xf5, 0xa2, 0x74, 0x19, 0x1e, 0x45, 0xba, 0xe9, 0x98, 0x40, 0x12, 0xe0, 0x04, 0xab, 0x7d, 0xe1, 0xf5, - 0x72, 0xbd, 0xe0, 0xfa, 0x2a, 0xc9, 0x6c, 0xa4, 0x73, 0x5d, 0x82, 0x4d, 0xf9, 0xb7, 0x3a, 0x1f, 0x54, 0xe9, 0x9a, - 0x6e, 0x1c, 0x5a, 0xab, 0x84, 0x7a, 0x6b, 0xec, 0x22, 0x6c, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x74, 0xca, 0xc6, - 0x59, 0x6a, 0x08, 0xe6, 0x91, 0xf4, 0x1e, 0x0b, 0x56, 0x43, 0x8f, 0x06, 0xfa, 0x4f, 0x60, 0x43, 0x2f, 0x9c, 0x2c, - 0xf1, 0x01, 0x89, 0x37, 0x53, 0x33, 0x98, 0xa8, 0xc5, 0x32, 0x88, 0x78, 0x2f, 0x10, 0x1c, 0xbc, 0x21, 0x1d, 0x87, - 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0x52, 0xab, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xee, 0x9b, 0x8e, 0xeb, - 0xe4, 0xba, 0x09, 0xb6, 0x5b, 0x9f, 0xf6, 0x3d, 0xf4, 0x58, 0xab, 0x0d, 0xb5, 0x56, 0xd1, 0x43, 0xea, 0x79, 0xee, - 0x0b, 0x57, 0x37, 0x49, 0x65, 0x4e, 0xc1, 0x6d, 0xe3, 0xf8, 0x86, 0x25, 0x5f, 0x3c, 0x95, 0x72, 0xe3, 0xfb, 0x8d, - 0xe7, 0xc8, 0x75, 0x00, 0x09, 0x67, 0xf1, 0xf2, 0x01, 0x53, 0x68, 0xeb, 0xa6, 0x3e, 0x0e, 0xe3, 0x94, 0xa9, 0x73, - 0x20, 0x26, 0xc8, 0x17, 0x4e, 0xe2, 0xe7, 0xf7, 0xaf, 0x3f, 0x7c, 0xd0, 0x4d, 0x8c, 0x04, 0x9a, 0xaa, 0xad, 0xf3, - 0x0d, 0xb5, 0x03, 0xfb, 0x37, 0xee, 0x3b, 0xba, 0x61, 0xe8, 0x51, 0x5b, 0xde, 0x73, 0x94, 0x56, 0xdb, 0x72, 0xfc, - 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, 0x35, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x29, 0x65, 0x11, 0x44, 0xd7, - 0x0d, 0xa9, 0xfe, 0x5d, 0x43, 0x2a, 0x3c, 0xe5, 0x6a, 0xb8, 0x6a, 0x15, 0x2f, 0x14, 0xd2, 0x00, 0x02, 0x39, 0xef, - 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x82, 0x41, 0x73, 0x4f, 0xee, 0xd5, 0x51, 0x37, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, - 0x38, 0x04, 0x85, 0x3f, 0xa6, 0x4a, 0xe5, 0xca, 0x64, 0xa3, 0x54, 0xd7, 0x55, 0x1a, 0x21, 0xf2, 0xf6, 0x3a, 0x63, - 0x8b, 0x25, 0x4b, 0xfc, 0x6c, 0x95, 0xb0, 0xeb, 0x30, 0xbe, 0x7d, 0x54, 0xa8, 0xd3, 0xef, 0x28, 0x3c, 0x0f, 0x66, - 0x73, 0x59, 0xfa, 0xac, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x76, 0x90, 0xff, 0xe7, 0xdf, 0xb6, 0xfd, 0x9f, 0x7f, 0xef, - 0x2c, 0x0a, 0xcd, 0xe7, 0x43, 0x33, 0x1b, 0xec, 0xb1, 0x2f, 0x9a, 0x7b, 0x2a, 0xc3, 0xbc, 0xb9, 0x4c, 0x6d, 0x11, - 0x20, 0xbf, 0xb6, 0x04, 0xb5, 0xc4, 0xf2, 0xbe, 0x79, 0xd0, 0xc0, 0x60, 0x5e, 0x3b, 0x47, 0x06, 0x85, 0xbe, 0x68, - 0x68, 0x43, 0xa3, 0xb7, 0xd7, 0x8a, 0xfc, 0x71, 0x08, 0xef, 0x9a, 0xc3, 0x17, 0x0e, 0x9f, 0xf3, 0x25, 0x5f, 0x0e, - 0x87, 0x32, 0xb6, 0x9c, 0x5a, 0x15, 0x54, 0xfc, 0xcf, 0x6a, 0x29, 0xfc, 0xf2, 0xec, 0x39, 0x06, 0xd9, 0xde, 0x0f, - 0x5e, 0x0e, 0x51, 0x19, 0xed, 0x64, 0x94, 0x14, 0xc4, 0xca, 0x46, 0xd4, 0x46, 0xca, 0xe4, 0xb5, 0x46, 0x6b, 0x78, - 0x0d, 0x52, 0x31, 0xe0, 0x58, 0x3e, 0x34, 0xcc, 0x97, 0x43, 0xce, 0x58, 0xe2, 0xfa, 0xaf, 0xbd, 0xea, 0xd6, 0xe6, - 0x6c, 0xd9, 0x12, 0xd0, 0x4d, 0x8d, 0xe4, 0x3f, 0x58, 0x98, 0x15, 0x7c, 0x3c, 0x64, 0xf0, 0x03, 0x47, 0x61, 0x98, - 0x63, 0xbc, 0x93, 0x77, 0x9b, 0x74, 0xc4, 0x7e, 0xde, 0xad, 0x23, 0x76, 0xb1, 0x97, 0x8e, 0xd8, 0xcf, 0x5f, 0x5d, - 0x47, 0xec, 0x9d, 0xaa, 0x23, 0x06, 0x8b, 0xf8, 0x9a, 0xed, 0xa5, 0xb8, 0x25, 0xb4, 0x36, 0xe2, 0xdb, 0x74, 0xe0, - 0x72, 0x92, 0x36, 0x1d, 0xcf, 0x19, 0xf0, 0x08, 0xf8, 0xaa, 0x84, 0xf1, 0x0c, 0x94, 0xb8, 0xfe, 0x7c, 0x75, 0xab, - 0x30, 0x9e, 0xa9, 0xca, 0x56, 0x11, 0xf7, 0xf8, 0x5a, 0x78, 0x71, 0x22, 0x05, 0x27, 0xc7, 0x14, 0x3e, 0x9f, 0xac, - 0x43, 0x43, 0x89, 0x6a, 0x2d, 0xb5, 0xd7, 0x3c, 0xa1, 0x02, 0xd5, 0x43, 0xed, 0x29, 0x59, 0xd1, 0x7b, 0x2e, 0x7c, - 0x5b, 0xa8, 0x2d, 0x48, 0x2d, 0x61, 0xf2, 0x13, 0xb1, 0xd6, 0x7f, 0xbb, 0x73, 0xbf, 0xbf, 0x74, 0xfb, 0x6d, 0x17, - 0x8c, 0xb3, 0xe1, 0x85, 0x89, 0x09, 0x4e, 0xbf, 0xdd, 0x86, 0x84, 0x5b, 0x25, 0xc1, 0x83, 0x84, 0x40, 0x49, 0xe8, - 0x40, 0xc2, 0x58, 0x49, 0x38, 0x82, 0x84, 0x89, 0x92, 0x70, 0x0c, 0x09, 0x37, 0x7a, 0x7e, 0x19, 0xc9, 0xe1, 0x1e, - 0x1b, 0x57, 0x26, 0x3d, 0x2a, 0x44, 0xda, 0xb1, 0xe9, 0x82, 0xd6, 0x94, 0x3f, 0xeb, 0xc5, 0x26, 0x71, 0x17, 0x7b, - 0x89, 0x79, 0x3b, 0x67, 0xe4, 0x28, 0xfa, 0x15, 0xde, 0x39, 0x76, 0x16, 0x83, 0xde, 0xb4, 0x70, 0xc0, 0x20, 0xe0, - 0xa0, 0xe9, 0x06, 0x30, 0x8c, 0xfa, 0x72, 0xe5, 0x84, 0x13, 0x0b, 0x65, 0x2d, 0x8b, 0x3c, 0xea, 0xce, 0x92, 0x5b, - 0xa0, 0xd0, 0x38, 0x69, 0xa9, 0x5c, 0xc9, 0xaf, 0xa1, 0x77, 0xf0, 0x8a, 0x8d, 0x56, 0x33, 0xed, 0x3c, 0x9e, 0xed, - 0x54, 0x21, 0x50, 0xb3, 0x60, 0x94, 0x3a, 0x89, 0x5f, 0x2c, 0xb1, 0x2d, 0x79, 0x5f, 0xf4, 0x99, 0x97, 0xcb, 0x67, - 0x30, 0x36, 0x2d, 0x23, 0x05, 0x16, 0xe8, 0x07, 0x60, 0xa4, 0xc8, 0xf0, 0xcf, 0x01, 0xce, 0xca, 0xf7, 0x85, 0xaf, - 0x8c, 0xe7, 0xf4, 0x47, 0x96, 0xa6, 0xfe, 0x4c, 0x94, 0xaf, 0x8f, 0x13, 0x94, 0x76, 0xe4, 0xfb, 0x0b, 0x01, 0x08, - 0x9c, 0xbc, 0xa0, 0xa6, 0x9b, 0x91, 0xc4, 0xb7, 0x1a, 0x68, 0xff, 0xc0, 0x86, 0x2a, 0xf4, 0x14, 0x02, 0x1b, 0x96, - 0xb0, 0xac, 0x51, 0x00, 0x87, 0xff, 0x86, 0x85, 0xd5, 0xc4, 0xcc, 0x9f, 0x55, 0x93, 0x68, 0x1f, 0xe4, 0xea, 0xd8, - 0xa4, 0x40, 0xbf, 0x94, 0xf8, 0x25, 0x12, 0xea, 0x30, 0x9e, 0xfd, 0xa9, 0xe2, 0xe9, 0x2d, 0x6a, 0x05, 0x1f, 0x22, - 0x33, 0xc8, 0x86, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xbd, 0x28, 0x9b, 0x5b, 0x68, 0x5a, 0xd6, 0xf2, 0x22, 0xc3, - 0xb4, 0x71, 0x6d, 0xd7, 0x55, 0x83, 0xda, 0x5e, 0x32, 0x1b, 0xf9, 0x2d, 0xd7, 0x3b, 0x36, 0xc5, 0x1f, 0xdb, 0xe9, - 0x18, 0x39, 0xb6, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, 0xbe, 0xb7, 0x88, - 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x1e, 0xd4, 0x7d, 0x74, 0xd5, 0xc0, 0xad, 0x05, 0x5d, 0xdb, 0x4b, 0xd8, - 0x82, 0x6a, 0x4b, 0x4f, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xbc, 0xfb, 0x52, 0x61, 0x2a, 0x8a, 0x5b, 0x8e, 0x6a, 0x00, - 0x45, 0xca, 0xdd, 0x3c, 0x80, 0x73, 0xa3, 0xfe, 0xd2, 0x9f, 0xa0, 0x67, 0x42, 0xdb, 0xeb, 0x24, 0x6c, 0xa1, 0xd9, - 0x9d, 0x8d, 0x8d, 0x27, 0xf1, 0xed, 0x29, 0x8c, 0x16, 0x2b, 0x5b, 0x29, 0x0b, 0xa7, 0x98, 0x63, 0xa1, 0x65, 0x89, - 0x68, 0xc7, 0xc2, 0x87, 0x38, 0xb4, 0xc6, 0x16, 0x7d, 0xc8, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, 0x91, 0x45, 0xd3, - 0x39, 0x76, 0x96, 0x4a, 0x5b, 0x2a, 0xfc, 0x8c, 0x35, 0x16, 0x77, 0x35, 0xa7, 0x0f, 0x8f, 0xb5, 0x69, 0x18, 0xdf, - 0xf6, 0xe6, 0xc1, 0x64, 0xc2, 0xa2, 0x3e, 0x8e, 0x59, 0x26, 0xb2, 0x30, 0x0c, 0x96, 0x69, 0x90, 0xf6, 0x17, 0xfe, - 0x1d, 0x6f, 0xf5, 0x70, 0x53, 0xab, 0x6d, 0xde, 0x6a, 0x7b, 0xef, 0x56, 0x95, 0x66, 0xc0, 0x8a, 0x85, 0xda, 0xe1, - 0x43, 0xeb, 0x68, 0x4e, 0x65, 0x9e, 0x7b, 0xb7, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, 0x39, 0xb9, - 0x7d, 0xb3, 0xa6, 0x8d, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x7c, 0x39, 0x93, 0x49, 0x6e, 0x8f, 0xc5, 0xd7, - 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0x22, 0xa1, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, 0x12, 0xb9, - 0xcd, 0xf8, 0x57, 0xc2, 0x26, 0x7d, 0xdc, 0x48, 0xa4, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x31, 0xc0, 0x65, 0x09, - 0x37, 0x21, 0xaf, 0xe7, 0x6a, 0xbd, 0x77, 0x49, 0xad, 0xe8, 0x6e, 0x3c, 0x6e, 0x2c, 0x37, 0xf1, 0x93, 0x4f, 0x57, - 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x62, 0x6b, 0x01, 0x06, 0xeb, 0xae, 0x07, 0x2e, 0xbb, 0xfa, 0xa3, 0x38, 0x81, 0x33, - 0x9b, 0xf8, 0x93, 0x60, 0x95, 0xf6, 0x5c, 0x6f, 0x79, 0x27, 0x92, 0xf8, 0x5e, 0x2f, 0x12, 0xf0, 0xec, 0xf5, 0xd2, - 0x38, 0x0c, 0x26, 0x22, 0x69, 0xd3, 0x59, 0x72, 0x3d, 0xa3, 0x8f, 0x06, 0xeb, 0x01, 0xba, 0x5d, 0xf0, 0xc3, 0x50, - 0xb3, 0xdb, 0xa9, 0xc6, 0xfc, 0x14, 0xf9, 0xcb, 0x9a, 0x93, 0x12, 0x5c, 0xd0, 0x38, 0xdd, 0x3d, 0x5c, 0xde, 0xc9, - 0x3d, 0xef, 0x1e, 0x2d, 0xef, 0xf2, 0xbf, 0x2e, 0xd8, 0x24, 0xf0, 0xb5, 0x56, 0xb1, 0x9b, 0x5c, 0x07, 0x78, 0xd0, - 0xc6, 0x7a, 0xc3, 0x36, 0x15, 0xc7, 0x02, 0x5c, 0x1b, 0x3e, 0x0a, 0x16, 0xcb, 0x38, 0xc9, 0xfc, 0x28, 0xcb, 0xf3, - 0xe1, 0x55, 0x9e, 0xf7, 0x2f, 0x82, 0xd6, 0xe5, 0x3f, 0x5a, 0x74, 0x4f, 0x93, 0xcc, 0x26, 0x37, 0xae, 0xcc, 0xd7, - 0x4c, 0xd5, 0x19, 0x81, 0x6b, 0x0c, 0xf5, 0x45, 0xd4, 0xc2, 0x74, 0x4b, 0xd6, 0x0b, 0x13, 0x90, 0x65, 0x71, 0xd2, - 0x41, 0x29, 0x17, 0xc1, 0x1b, 0x08, 0x0a, 0xbc, 0x66, 0x83, 0x0b, 0x45, 0xff, 0x04, 0x88, 0x15, 0x2c, 0x4c, 0x76, - 0x05, 0x4f, 0x36, 0xd1, 0x8c, 0xdf, 0xed, 0xa6, 0x19, 0x7f, 0xcd, 0xf6, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, - 0x93, 0xba, 0x5d, 0xc1, 0xdb, 0x78, 0xa0, 0x4b, 0x09, 0x03, 0x5c, 0x4d, 0x09, 0x79, 0xec, 0x79, 0xfb, 0x87, 0xcd, - 0x00, 0x44, 0x6b, 0x14, 0x83, 0x8e, 0x6e, 0x6e, 0xe0, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xef, 0xe9, 0x74, - 0xf0, 0x2a, 0x56, 0x12, 0xe4, 0x17, 0x57, 0xbe, 0x28, 0x79, 0x57, 0xa0, 0x1c, 0xa1, 0x85, 0x89, 0xf1, 0x27, 0xc0, - 0x38, 0x9b, 0xb4, 0x8e, 0x27, 0x52, 0xfb, 0xac, 0x5f, 0x1e, 0x42, 0x4b, 0xaa, 0x7c, 0x0a, 0x13, 0x9c, 0x1a, 0x2b, - 0x71, 0xc6, 0x32, 0x6e, 0x33, 0xfb, 0xfd, 0xfd, 0xdb, 0x49, 0xeb, 0x6d, 0x6c, 0xe4, 0x41, 0xfa, 0xae, 0x6a, 0x00, - 0xc3, 0x65, 0x3f, 0x03, 0x75, 0x3a, 0x39, 0xd7, 0x20, 0x53, 0x03, 0x4c, 0x43, 0x36, 0x55, 0x3f, 0x2b, 0xcd, 0xb4, - 0xa7, 0x56, 0xe4, 0x81, 0xae, 0x6a, 0x97, 0x31, 0xb7, 0x3e, 0x58, 0x73, 0x0a, 0x10, 0x63, 0x77, 0xa1, 0xdd, 0xf0, - 0x84, 0xaa, 0x07, 0x93, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76, 0x11, 0x71, 0xe9, 0xad, 0xd4, 0x69, - 0xe0, 0x12, 0x42, 0x12, 0xff, 0xbd, 0x05, 0x81, 0x3a, 0x17, 0x16, 0x72, 0x98, 0xe9, 0x1a, 0x81, 0x8f, 0x14, 0x2d, - 0x94, 0x09, 0x81, 0x04, 0x58, 0xc2, 0x5f, 0x64, 0x89, 0x84, 0xba, 0x0e, 0x27, 0x01, 0x07, 0x35, 0x02, 0xc0, 0xca, - 0x5f, 0xf0, 0xb5, 0x09, 0xed, 0xf0, 0x32, 0xf8, 0x91, 0xeb, 0x92, 0xf6, 0xc3, 0xed, 0x77, 0x7a, 0x72, 0x00, 0x15, - 0x4e, 0x2b, 0x8a, 0x03, 0x3b, 0x34, 0x14, 0x81, 0x94, 0x48, 0x6f, 0x4d, 0x3b, 0xbd, 0xd5, 0x9e, 0xad, 0x85, 0x87, - 0x8c, 0xcc, 0x5f, 0x5a, 0xf0, 0xc4, 0x47, 0xdc, 0xcb, 0x31, 0x9e, 0xe2, 0x8c, 0xa3, 0xbf, 0x4a, 0x01, 0x37, 0xe2, - 0x43, 0x15, 0xf1, 0x4f, 0x7f, 0xbc, 0x4a, 0xd2, 0x38, 0xe9, 0x2d, 0xe3, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0x2e, - 0x11, 0x3e, 0x02, 0x3c, 0x57, 0xeb, 0x78, 0xe9, 0x8f, 0x83, 0xec, 0xbe, 0xe7, 0x70, 0x92, 0xc2, 0xe9, 0x73, 0xea, - 0xc0, 0x69, 0x2c, 0xdf, 0xe3, 0xd0, 0x7c, 0x8e, 0x84, 0x5f, 0x52, 0x27, 0x67, 0xd4, 0x6d, 0xde, 0x57, 0x72, 0xc9, - 0x47, 0x08, 0x90, 0x1f, 0x7e, 0x62, 0xcd, 0x00, 0xcb, 0xc3, 0x52, 0x3b, 0x13, 0x36, 0x33, 0x11, 0x6b, 0x03, 0x5f, - 0x5e, 0xfc, 0xb1, 0x3b, 0x86, 0xe6, 0x34, 0x27, 0x03, 0xc5, 0x63, 0xec, 0x33, 0xb2, 0x9e, 0x0f, 0x11, 0xb5, 0xcc, - 0x7d, 0x4a, 0x8e, 0xd8, 0x34, 0x4e, 0x18, 0xf9, 0x93, 0x75, 0xbb, 0xcb, 0xbb, 0xfd, 0x9b, 0xdf, 0x3e, 0xfd, 0xe6, - 0x76, 0xa2, 0x38, 0x6b, 0x89, 0xc6, 0x8c, 0x1d, 0xad, 0xd5, 0xef, 0x33, 0x20, 0x0d, 0x09, 0xf2, 0x63, 0x72, 0xdd, - 0xd5, 0xd3, 0xf5, 0x7e, 0xa3, 0xdb, 0xae, 0x65, 0xcc, 0xef, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, 0x9a, 0xb1, - 0x7d, 0xb4, 0xbc, 0x13, 0x6b, 0x8c, 0x17, 0xde, 0x03, 0x16, 0xa9, 0x32, 0x14, 0xb1, 0x48, 0xd5, 0x64, 0x5c, 0xa4, - 0x7e, 0x6d, 0x36, 0xc2, 0x93, 0x45, 0xe5, 0xa6, 0xef, 0x2c, 0xef, 0xd4, 0x2b, 0xba, 0xa8, 0x26, 0x6f, 0xea, 0xaa, - 0x0b, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x2d, 0x74, 0x79, 0x2d, 0x15, 0xe0, 0x48, 0x38, 0xf8, 0xa3, 0x34, - 0x0e, 0x57, 0x19, 0x6b, 0x06, 0x17, 0x01, 0xc7, 0x73, 0x0a, 0xe0, 0xe0, 0xef, 0xf2, 0x58, 0x3b, 0x40, 0x6e, 0xc3, - 0x36, 0x71, 0xfa, 0xe0, 0x71, 0xd8, 0x6a, 0x97, 0x87, 0x0e, 0x59, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0xb8, 0x96, - 0x08, 0x7b, 0x6b, 0xb6, 0xcb, 0xd3, 0xa4, 0xd7, 0x55, 0x99, 0x94, 0x97, 0x27, 0xf3, 0xe7, 0x9c, 0xb1, 0x17, 0xcd, - 0x67, 0xec, 0x85, 0x38, 0x63, 0xdb, 0x77, 0xe6, 0xe3, 0xa9, 0x0b, 0xff, 0xf5, 0x8b, 0x09, 0xf5, 0x1c, 0xad, 0xbd, - 0xbc, 0xd3, 0xdc, 0xe5, 0x9d, 0x66, 0x79, 0xcb, 0x3b, 0x0d, 0x9b, 0x46, 0x7d, 0x10, 0xd3, 0xf6, 0x0c, 0xd3, 0xd1, - 0x20, 0x11, 0xfe, 0x38, 0xa5, 0x2c, 0xf7, 0x10, 0xf2, 0xa0, 0x56, 0xa7, 0x9e, 0xe7, 0x6d, 0x3f, 0xea, 0x74, 0x96, - 0x04, 0xd2, 0x36, 0xec, 0xcc, 0x1f, 0x8d, 0xd8, 0xa4, 0x37, 0x8d, 0xc7, 0xab, 0xf4, 0x5f, 0x7c, 0xfc, 0x1c, 0x88, - 0x5b, 0x11, 0x41, 0xa5, 0x1d, 0x51, 0x15, 0x04, 0x25, 0x37, 0x4c, 0xb4, 0xb0, 0x96, 0xeb, 0xd4, 0x23, 0xf7, 0xc8, - 0x9e, 0x7d, 0xd8, 0xb0, 0xc9, 0x9b, 0x01, 0xfd, 0xa7, 0xad, 0xd2, 0x66, 0x14, 0xf3, 0x05, 0x60, 0xd9, 0x0a, 0x8e, - 0x87, 0x43, 0x83, 0xaf, 0xa6, 0xd3, 0x6d, 0x1e, 0xee, 0xa5, 0xe8, 0xe9, 0x4a, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x86, - 0x29, 0xdb, 0x5b, 0xdd, 0xb4, 0x47, 0x6a, 0xad, 0x6e, 0xb9, 0x10, 0x8a, 0xb2, 0x7b, 0x62, 0xf9, 0xc7, 0x2f, 0x0e, - 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xcd, 0x9a, 0x08, 0xf5, 0xb7, 0x65, 0x4d, 0x70, 0x22, 0x95, 0x90, 0x10, 0xdf, 0xbf, - 0xfc, 0x74, 0xfa, 0xb0, 0x0a, 0x7b, 0x97, 0x26, 0x55, 0xaa, 0x6a, 0xe9, 0xef, 0xe3, 0x18, 0x42, 0x77, 0xd6, 0x8b, - 0x0b, 0xf0, 0x90, 0xb2, 0x7b, 0x36, 0x80, 0x4a, 0xe2, 0x1d, 0x41, 0x52, 0x7c, 0x1d, 0xeb, 0xd0, 0x53, 0xe2, 0xf5, - 0xa6, 0xa7, 0xc4, 0xab, 0xdd, 0x4f, 0x89, 0x1f, 0xf6, 0x7a, 0x4a, 0xbc, 0xfa, 0xea, 0x4f, 0x89, 0xd7, 0xf5, 0xa7, - 0xc4, 0x45, 0x2c, 0xf4, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x09, 0xe5, 0xce, 0xe3, 0x41, 0xc7, 0x21, 0x97, - 0xc7, 0x17, 0x7f, 0xf8, 0x61, 0x81, 0x1b, 0xf1, 0x3d, 0xaa, 0x93, 0x15, 0x4f, 0x0b, 0x8e, 0xd9, 0xb1, 0x1f, 0x25, - 0x39, 0x8c, 0xa3, 0xd9, 0xcf, 0x20, 0x94, 0x05, 0x76, 0x60, 0xa2, 0x64, 0x04, 0xe9, 0xcf, 0xf1, 0x72, 0xb5, 0x7c, - 0x0b, 0x6d, 0x7d, 0x0c, 0xd2, 0x60, 0x14, 0x32, 0x69, 0x89, 0x4c, 0xea, 0x6f, 0x9c, 0x27, 0x0e, 0x1a, 0xa7, 0xe2, - 0xa7, 0x7f, 0x27, 0x7e, 0xa2, 0x4e, 0x2a, 0xff, 0x4d, 0x7a, 0x75, 0x7a, 0xf3, 0x43, 0x44, 0x08, 0x01, 0x95, 0x41, - 0x3f, 0xfc, 0x31, 0x72, 0x11, 0x1b, 0x0d, 0xb3, 0x14, 0xfa, 0x0e, 0x1b, 0xdb, 0x61, 0xb5, 0x47, 0xcd, 0xca, 0x30, - 0xa5, 0x0b, 0xae, 0x3a, 0x1b, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x91, 0x01, 0x48, - 0x38, 0x65, 0x1d, 0x0c, 0x1e, 0xf9, 0x01, 0x09, 0xe5, 0x38, 0x69, 0xe9, 0x10, 0xbb, 0x74, 0xb5, 0xb4, 0x48, 0xd4, - 0x6c, 0xe1, 0x14, 0x75, 0x19, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0x56, 0x53, 0xa8, 0x6a, 0xc4, 0x36, 0xe7, - 0x0a, 0xa7, 0xad, 0x48, 0x30, 0x17, 0x85, 0x1f, 0x8c, 0x86, 0x85, 0xe3, 0x39, 0x64, 0xba, 0x5a, 0xe4, 0x82, 0x17, - 0x91, 0x7c, 0xc5, 0xd7, 0x83, 0x7b, 0x85, 0xa0, 0xcf, 0x97, 0x0a, 0x18, 0xdf, 0xdd, 0xb0, 0x24, 0xf4, 0xef, 0x5b, - 0x46, 0x1e, 0x47, 0x3f, 0x02, 0x00, 0x5e, 0xc5, 0xb7, 0x91, 0x5a, 0x00, 0x83, 0xb5, 0x34, 0xec, 0xa5, 0x46, 0xff, - 0x25, 0x60, 0xb8, 0xa2, 0x8c, 0x00, 0xc2, 0xe4, 0xce, 0xd8, 0xdf, 0x4d, 0xfa, 0xf7, 0x1f, 0x46, 0x6e, 0x9e, 0xc7, - 0xb2, 0xa3, 0x5f, 0x96, 0x7b, 0x74, 0xf3, 0xf4, 0xe9, 0xa3, 0xcd, 0xd3, 0x2e, 0x87, 0x67, 0x6f, 0xa8, 0x6d, 0x6c, - 0x3c, 0x05, 0x30, 0x8a, 0x8b, 0x78, 0x35, 0x9e, 0xa3, 0xa2, 0xeb, 0xd7, 0x9b, 0x6f, 0x06, 0x6d, 0x62, 0x94, 0x52, - 0x39, 0xf5, 0x4a, 0x52, 0x01, 0x05, 0xec, 0xff, 0x35, 0x38, 0xe0, 0xfc, 0x1f, 0x82, 0xa1, 0xbe, 0x6b, 0xf8, 0x2b, - 0x3e, 0x78, 0xd8, 0xe6, 0xed, 0x43, 0x30, 0x4d, 0xee, 0xda, 0x42, 0x08, 0xd7, 0x9a, 0x91, 0x4c, 0x5e, 0x05, 0x9a, - 0xea, 0x46, 0x6e, 0x93, 0x87, 0x3c, 0xd1, 0x0b, 0xb3, 0xe9, 0x99, 0xce, 0x0d, 0x0d, 0x4c, 0xc6, 0xb1, 0x55, 0x05, - 0xc9, 0x70, 0x95, 0x07, 0x86, 0xe8, 0xab, 0x9a, 0xb7, 0x08, 0x22, 0x13, 0xbd, 0xc0, 0xd7, 0x73, 0xfc, 0x3b, 0xf0, - 0x83, 0x0c, 0xc8, 0xad, 0x9a, 0x05, 0x89, 0xa6, 0x6a, 0x37, 0x07, 0xa1, 0x9e, 0xf4, 0x46, 0x48, 0x08, 0x29, 0xde, - 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0xf9, 0x8c, 0xd0, 0xe4, 0x3b, 0x02, 0xd3, 0xf1, 0x39, 0x00, 0xd2, 0x92, 0x7c, 0x79, - 0x47, 0x29, 0xf0, 0x32, 0x40, 0x99, 0xac, 0x48, 0xe0, 0xae, 0xfe, 0x3a, 0x8e, 0x48, 0x10, 0x0f, 0x7a, 0x70, 0xd3, - 0xe6, 0x27, 0xe0, 0x11, 0xb8, 0xa7, 0xe1, 0x83, 0x1d, 0x73, 0x39, 0x27, 0x58, 0x73, 0xe8, 0x73, 0xd8, 0x67, 0xcd, - 0x3e, 0xe1, 0x22, 0x05, 0x0b, 0x82, 0xd4, 0xa1, 0xe2, 0xe2, 0xd9, 0x64, 0x0d, 0xb8, 0x11, 0xdf, 0x45, 0x77, 0xd9, - 0x82, 0x45, 0x2b, 0x1d, 0x63, 0x42, 0xa1, 0x8f, 0x3e, 0x28, 0xf3, 0x8a, 0x88, 0x2d, 0xc0, 0x36, 0xcd, 0x35, 0xe7, - 0x74, 0x17, 0xa6, 0x1c, 0xa5, 0xfa, 0xe6, 0x98, 0x0b, 0x36, 0x53, 0x8e, 0xdb, 0xaa, 0x37, 0x04, 0x5f, 0xd2, 0xb8, - 0x6a, 0xc8, 0x45, 0x9a, 0xd0, 0xd0, 0x06, 0x79, 0xc7, 0xe0, 0xec, 0x22, 0x01, 0xf6, 0x96, 0x5f, 0x5d, 0x34, 0x29, - 0x91, 0xf1, 0x2b, 0x8c, 0xa2, 0xc4, 0xa8, 0x37, 0xc3, 0xc7, 0x09, 0x8e, 0x89, 0x36, 0xb6, 0x33, 0xae, 0xb5, 0xb3, - 0x61, 0xd2, 0x9f, 0xd8, 0x3d, 0x5d, 0x24, 0x04, 0xaa, 0x4f, 0xec, 0x1e, 0x74, 0xff, 0x5e, 0x03, 0x37, 0x45, 0xdf, - 0x82, 0xae, 0x4d, 0x70, 0xf5, 0x3f, 0x06, 0x67, 0x55, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x88, - 0xea, 0x2c, 0x0e, 0x31, 0x57, 0xf1, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x33, 0xd7, 0x71, 0x0e, 0x6a, - 0xe5, 0x81, 0x91, 0xdd, 0x54, 0xda, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x33, 0xdb, 0xeb, 0xd7, 0xee, 0x68, 0xc5, - 0x97, 0xe4, 0x10, 0xd9, 0x5f, 0xa7, 0x4f, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x2a, 0xf3, 0x38, 0xb6, 0x9c, 0xf3, - 0xbf, 0x86, 0xf5, 0xab, 0x9f, 0x3c, 0x59, 0x52, 0x5c, 0x93, 0x21, 0x78, 0x43, 0x6e, 0xc1, 0x31, 0xfa, 0x8b, 0xf6, - 0x5c, 0x6b, 0xd1, 0xf1, 0x31, 0x8c, 0xa1, 0x0c, 0x97, 0x2d, 0x6c, 0xca, 0xd4, 0x06, 0x2a, 0x3d, 0xa6, 0x55, 0x0c, - 0xc7, 0xfd, 0xae, 0xb2, 0x42, 0xa2, 0xb7, 0x95, 0x5a, 0xc0, 0xf6, 0x37, 0x5c, 0x9f, 0xf6, 0x08, 0xfc, 0x12, 0x40, - 0x09, 0xf0, 0x9d, 0xbe, 0xb3, 0xc1, 0xd5, 0xb2, 0xdc, 0x5c, 0xf9, 0x92, 0xdc, 0xbf, 0x31, 0xbc, 0x74, 0x50, 0x86, - 0x26, 0xdb, 0x6b, 0xbe, 0xee, 0x1e, 0xd8, 0x24, 0x8b, 0x26, 0xe5, 0x06, 0x2b, 0xf7, 0xd7, 0xfe, 0xcd, 0x95, 0x30, - 0x0a, 0x04, 0x15, 0x88, 0x1b, 0x30, 0x4a, 0x1e, 0x47, 0xb8, 0xf9, 0xe9, 0xb8, 0x05, 0x7b, 0x51, 0x31, 0x58, 0x81, - 0x3c, 0x82, 0xc9, 0x6a, 0x0a, 0x53, 0x1c, 0x3c, 0x57, 0xa3, 0x59, 0x70, 0x4b, 0x10, 0xa2, 0x1b, 0x77, 0x62, 0x26, - 0x74, 0x0a, 0x8b, 0x3a, 0x01, 0xf7, 0x45, 0xb9, 0x2f, 0xd7, 0x3a, 0xd8, 0xcd, 0xb5, 0xce, 0x76, 0x71, 0xad, 0xc9, - 0x9c, 0xea, 0x36, 0xf1, 0x97, 0x8a, 0x45, 0x9e, 0x20, 0xce, 0x55, 0xc3, 0xbc, 0x12, 0xab, 0x1b, 0xad, 0xaf, 0x44, - 0xad, 0x5a, 0x6b, 0xa4, 0x25, 0x88, 0xec, 0x6f, 0xe5, 0x81, 0x22, 0x04, 0xea, 0x2a, 0x6f, 0xfc, 0xa2, 0xe0, 0x8d, - 0xd3, 0xab, 0xa6, 0x30, 0xa4, 0x11, 0xd4, 0xbf, 0x62, 0xa4, 0x26, 0x5f, 0x07, 0x85, 0xb1, 0x5a, 0x31, 0x52, 0xc5, - 0xfc, 0xaa, 0x78, 0x68, 0x28, 0x46, 0x7d, 0xe2, 0x95, 0x51, 0xb6, 0xed, 0x2b, 0x17, 0x2d, 0xac, 0xaf, 0x8a, 0x74, - 0xe0, 0xba, 0xe3, 0x90, 0x65, 0xb2, 0xba, 0x6d, 0xca, 0xe6, 0x37, 0x6a, 0xb6, 0xb2, 0x49, 0xa4, 0x9d, 0x0c, 0x01, - 0x58, 0xb0, 0xe9, 0x2b, 0x72, 0x6d, 0xa9, 0x03, 0x81, 0x83, 0x6c, 0x30, 0xeb, 0xdb, 0xcd, 0x9d, 0xa7, 0x78, 0x09, - 0x85, 0x14, 0x5e, 0xe5, 0x41, 0x20, 0x7c, 0xaf, 0xd6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xfc, 0x7e, 0x07, 0xf6, 0xa2, - 0xe6, 0xa8, 0x82, 0x7c, 0x3c, 0x99, 0x16, 0xa9, 0xe7, 0x62, 0xd1, 0x7a, 0xa3, 0xc4, 0xc4, 0x59, 0x73, 0xcb, 0x98, - 0x32, 0x8f, 0x9e, 0x97, 0xe8, 0x89, 0x7e, 0xf9, 0xd6, 0x49, 0x56, 0x11, 0xfa, 0xb6, 0xb7, 0xb2, 0xc4, 0x1f, 0x7f, - 0x52, 0x86, 0x2c, 0xf8, 0x9c, 0xc0, 0x03, 0x2e, 0x4b, 0x0a, 0xfa, 0x3e, 0xba, 0x82, 0x64, 0x3d, 0xdb, 0x4b, 0x15, - 0xee, 0x4b, 0xef, 0xb1, 0xd3, 0xf6, 0x5f, 0x4c, 0x0f, 0x2b, 0x4c, 0x51, 0xaf, 0x53, 0x66, 0x99, 0x6f, 0x18, 0x47, - 0x36, 0x5f, 0x2d, 0x46, 0x6b, 0x95, 0xb7, 0xaa, 0xb0, 0x5c, 0xeb, 0x6c, 0x56, 0xb5, 0xdb, 0xe9, 0x74, 0x5a, 0x66, - 0x34, 0x3a, 0xda, 0x21, 0x32, 0x0b, 0x1f, 0x3b, 0x8e, 0x53, 0x1d, 0xfb, 0x76, 0xb0, 0x5b, 0xc8, 0xb7, 0xed, 0x36, - 0x8e, 0x18, 0x61, 0xbb, 0x0b, 0x7e, 0x75, 0x70, 0xe4, 0x76, 0x71, 0xb2, 0x4b, 0x6a, 0x11, 0x7d, 0x52, 0x86, 0x08, - 0x32, 0xb6, 0x48, 0x7b, 0x63, 0x86, 0x32, 0x18, 0x5b, 0x39, 0xd0, 0xa8, 0x38, 0x60, 0xcd, 0x40, 0x55, 0xc4, 0x15, - 0xbb, 0xc2, 0xd1, 0x90, 0x1f, 0x5e, 0x63, 0xde, 0x8b, 0x4e, 0xf0, 0xa0, 0xac, 0xeb, 0x3c, 0x6d, 0x9c, 0x56, 0xc7, - 0xf9, 0x4b, 0xa9, 0x9c, 0x06, 0x17, 0xe0, 0x5a, 0x08, 0xb4, 0x89, 0x3f, 0x8b, 0x7f, 0x4b, 0xfe, 0xff, 0x8b, 0xe5, - 0x5d, 0x59, 0x7f, 0xa4, 0x0b, 0x1c, 0xed, 0xe2, 0xb4, 0xd0, 0xa8, 0x9b, 0xf6, 0x80, 0xd4, 0x32, 0x98, 0xaa, 0x02, - 0x74, 0x10, 0xd2, 0x97, 0x02, 0x80, 0x34, 0xb0, 0xdf, 0x91, 0x62, 0x86, 0x25, 0x2e, 0x58, 0x88, 0x45, 0xf8, 0x3a, - 0x98, 0x83, 0xf9, 0xbc, 0x8b, 0xf2, 0x83, 0xd2, 0x9e, 0x00, 0x69, 0x7c, 0x6d, 0x6e, 0x7b, 0xb1, 0xfb, 0xab, 0x72, - 0x2d, 0xd1, 0x30, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x8a, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28, 0x65, 0xae, 0x2a, 0x67, - 0x13, 0x03, 0xc3, 0xe6, 0x9a, 0x8b, 0x50, 0xdb, 0x42, 0x5a, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0xbf, 0x2d, 0x58, 0x62, - 0x75, 0x3f, 0xba, 0xb8, 0xe4, 0xb8, 0x7f, 0x2d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0xc8, 0x5f, 0xfc, 0xa1, 0x91, 0xa1, - 0x77, 0x51, 0xe2, 0xd0, 0x71, 0x6d, 0x71, 0xcf, 0xd8, 0xab, 0xf4, 0x22, 0x88, 0xf6, 0x2f, 0xeb, 0xdf, 0xed, 0x5d, - 0x16, 0x2e, 0x8c, 0xbd, 0x0b, 0xc3, 0x8d, 0x43, 0x9a, 0x0b, 0xd9, 0xe0, 0x07, 0x85, 0xa1, 0xa8, 0x5a, 0x1d, 0xeb, - 0x58, 0x8b, 0xa8, 0xfc, 0x8b, 0xd5, 0x60, 0x78, 0x72, 0x76, 0xb7, 0x08, 0xb5, 0x1b, 0x96, 0x40, 0x68, 0x9f, 0x81, - 0xee, 0xda, 0x8e, 0xae, 0xa1, 0x0d, 0x6d, 0x10, 0xcd, 0x06, 0xfa, 0x2f, 0x17, 0x6f, 0xac, 0xae, 0x7e, 0x06, 0x22, - 0xda, 0x9b, 0x19, 0x5e, 0x7b, 0xe7, 0xfe, 0x3d, 0x4b, 0xae, 0x3d, 0x5d, 0xc3, 0x08, 0x3e, 0x74, 0xe1, 0x61, 0x9a, - 0xe6, 0xe9, 0x7b, 0x04, 0x8a, 0xd0, 0x44, 0xac, 0x37, 0x1d, 0x50, 0x8e, 0xeb, 0x75, 0x35, 0xd7, 0x3b, 0xb4, 0x8f, - 0xba, 0xfa, 0xe9, 0x37, 0x9a, 0x76, 0x32, 0x61, 0xd3, 0xf4, 0x14, 0x9f, 0x68, 0x27, 0x78, 0x47, 0xd0, 0x6f, 0x4d, - 0xb3, 0xc7, 0x61, 0x6a, 0xb9, 0xda, 0x9a, 0x7f, 0x6a, 0xda, 0x34, 0x08, 0xc3, 0x9e, 0xf6, 0x78, 0xea, 0x4d, 0x0f, - 0xa7, 0x2f, 0xfa, 0x3c, 0x39, 0xff, 0xa6, 0x54, 0xdc, 0xa4, 0x7f, 0x3d, 0xa5, 0x5a, 0x9a, 0x25, 0xf1, 0x27, 0xc6, - 0xd5, 0x4e, 0x34, 0xf9, 0x78, 0xac, 0x56, 0xf5, 0xea, 0x3d, 0xb9, 0xdd, 0xd1, 0x78, 0xea, 0x15, 0xc5, 0x71, 0x8c, - 0x07, 0x72, 0x90, 0x27, 0x07, 0x62, 0xe8, 0x27, 0x2a, 0x98, 0x5c, 0xab, 0x09, 0x50, 0xae, 0xce, 0xe7, 0x38, 0x13, - 0xf3, 0x3b, 0x01, 0x3f, 0x8c, 0xd2, 0x5c, 0x17, 0x46, 0xa0, 0x6b, 0x93, 0x81, 0xfe, 0xa3, 0xeb, 0x75, 0x4d, 0xd7, - 0x3d, 0xb2, 0x8f, 0xba, 0x63, 0xc7, 0x3c, 0xb4, 0x0f, 0xad, 0xb6, 0x7d, 0x64, 0x76, 0xad, 0xae, 0xd9, 0xfd, 0x5b, - 0x77, 0x6c, 0x1d, 0xda, 0x87, 0xa6, 0x63, 0x75, 0x21, 0xd1, 0xea, 0x5a, 0xdd, 0x1b, 0xeb, 0xb0, 0x3b, 0x76, 0x30, - 0xd5, 0xb3, 0x3b, 0x1d, 0xcb, 0x75, 0xec, 0x4e, 0xc7, 0xec, 0xd8, 0x47, 0x47, 0x96, 0xdb, 0xb6, 0x8f, 0x8e, 0xce, - 0x3b, 0x5d, 0xbb, 0x0d, 0x79, 0xed, 0xf6, 0xb8, 0x6d, 0xbb, 0xae, 0x05, 0x7f, 0x99, 0x5d, 0xdb, 0xa3, 0x1f, 0xae, - 0x6b, 0xb7, 0x5d, 0xd3, 0x09, 0x3b, 0x9e, 0x7d, 0xf4, 0xc2, 0xc4, 0xbf, 0xb1, 0x98, 0x89, 0x7f, 0x41, 0x33, 0xe6, - 0x0b, 0xdb, 0x3b, 0xa2, 0x5f, 0xd8, 0xe0, 0xcd, 0x61, 0xf7, 0x57, 0xfd, 0x60, 0xe3, 0x1c, 0x5c, 0x9a, 0x43, 0xb7, - 0x63, 0xb7, 0xdb, 0xe6, 0xa1, 0x6b, 0x77, 0xdb, 0x73, 0xeb, 0xd0, 0xb3, 0x8f, 0x8e, 0xc7, 0x96, 0x6b, 0x1f, 0x1f, - 0x9b, 0x8e, 0xd5, 0xb6, 0x3d, 0xd3, 0xb5, 0x0f, 0xdb, 0xf8, 0xa3, 0x6d, 0x7b, 0x37, 0xc7, 0x2f, 0xec, 0xa3, 0xce, - 0xfc, 0xc8, 0x3e, 0xfc, 0x78, 0xd8, 0xb5, 0xbd, 0xf6, 0xbc, 0x7d, 0x64, 0x7b, 0xc7, 0x37, 0x47, 0xf6, 0xe1, 0xdc, - 0xf2, 0x8e, 0xb6, 0xd6, 0x74, 0x3d, 0x1b, 0x60, 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0x33, 0xc7, 0xba, 0xff, - 0xc5, 0x66, 0xd2, 0x7a, 0xd5, 0x17, 0x76, 0xf7, 0x78, 0x4c, 0xc5, 0x21, 0xc1, 0x12, 0x25, 0xa0, 0xca, 0x8d, 0x45, - 0xdd, 0x62, 0x73, 0x96, 0x68, 0x48, 0xfc, 0xe1, 0x9d, 0xdd, 0x58, 0xd0, 0x31, 0xf5, 0xfb, 0x3f, 0x6d, 0x47, 0x2e, - 0x39, 0x44, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x41, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x41, 0xc5, 0xfb, 0xdd, 0x82, 0x8a, - 0x37, 0xab, 0x7d, 0x04, 0x15, 0xef, 0xbf, 0xba, 0xa0, 0xe2, 0xbc, 0xaa, 0x27, 0xff, 0xbe, 0xea, 0x9b, 0xfe, 0xd7, - 0x75, 0xf5, 0x19, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x78, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, 0x4a, 0x4a, - 0x60, 0x31, 0xe0, 0xd8, 0xf7, 0x31, 0xe1, 0xd8, 0xdf, 0x57, 0x03, 0xd0, 0x3c, 0xe1, 0x74, 0x49, 0x30, 0xb1, 0xe6, - 0x7e, 0x38, 0x95, 0x34, 0x0d, 0xa4, 0xf4, 0x31, 0x19, 0xac, 0x12, 0xe0, 0xba, 0x06, 0x71, 0xd8, 0x6a, 0x11, 0xa5, - 0xbd, 0x23, 0x07, 0x2e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xca, 0xb6, 0xf0, 0x47, 0x75, 0xcd, 0xad, 0x26, 0x36, 0xe6, - 0xa3, 0x52, 0x60, 0x73, 0xeb, 0x6e, 0xbd, 0x5d, 0x0d, 0xb4, 0x6d, 0x84, 0xd2, 0x24, 0x90, 0x73, 0x4d, 0xf9, 0x65, - 0xd5, 0xbc, 0x8a, 0x32, 0xe6, 0xe6, 0x91, 0xc2, 0x48, 0xaa, 0xf5, 0xdd, 0xb2, 0x6a, 0xdf, 0xae, 0x69, 0x36, 0x74, - 0x5f, 0xaa, 0xbe, 0x45, 0xaf, 0x50, 0x36, 0x5c, 0x05, 0x55, 0x25, 0xb2, 0x5a, 0x23, 0x40, 0x0a, 0xea, 0xbe, 0x50, - 0x3e, 0x2c, 0x48, 0x4b, 0x47, 0x43, 0x7a, 0xc7, 0x51, 0xf2, 0x4a, 0x6d, 0xaa, 0x0a, 0x8b, 0xcf, 0xd6, 0x48, 0x71, - 0x07, 0xbf, 0x03, 0xe9, 0xc8, 0x29, 0x9e, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xb4, 0x4b, 0x8f, 0x99, 0x7c, 0xee, 0xae, - 0xeb, 0xc4, 0xe3, 0x46, 0x55, 0x65, 0x97, 0x2d, 0x04, 0x15, 0x84, 0xdd, 0x93, 0x62, 0x70, 0x4e, 0xca, 0xdb, 0xa8, - 0xfb, 0xbc, 0xad, 0x31, 0x51, 0xee, 0x31, 0x6c, 0x62, 0x93, 0x7f, 0xa8, 0x7e, 0x01, 0xd6, 0x53, 0x88, 0x82, 0xdd, - 0x43, 0x32, 0x4d, 0xa1, 0x51, 0x3d, 0xd4, 0x62, 0xee, 0x6f, 0x51, 0xb0, 0x51, 0x1b, 0xe6, 0x8d, 0xa0, 0x36, 0xf4, - 0x36, 0x9d, 0x1c, 0x69, 0x3c, 0xb2, 0x2e, 0x89, 0xa8, 0xdd, 0xce, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xc7, 0xc8, - 0xc5, 0x81, 0x53, 0x9b, 0x2c, 0x01, 0x04, 0x94, 0xa2, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x3f, 0xcc, 0x81, 0x3e, - 0x2e, 0xbf, 0x2a, 0xfe, 0xb9, 0x4a, 0x33, 0x98, 0xa3, 0x20, 0x7a, 0x51, 0x21, 0xdc, 0x1a, 0xb1, 0xec, 0x96, 0xb1, - 0x68, 0x83, 0xb0, 0xbc, 0xaa, 0x5f, 0xfe, 0xe7, 0x69, 0xdb, 0xe6, 0xa4, 0xc9, 0x32, 0xca, 0x22, 0xbe, 0x3f, 0x84, - 0x32, 0x74, 0x3e, 0x34, 0x7f, 0xda, 0x84, 0x70, 0xff, 0xb9, 0x1b, 0xe1, 0x66, 0x6c, 0x1f, 0x84, 0xfb, 0xcf, 0xaf, - 0x8e, 0x70, 0x7f, 0x52, 0x11, 0x6e, 0xc9, 0x16, 0xa8, 0xe0, 0x3a, 0x7f, 0xc0, 0xef, 0x16, 0x38, 0x75, 0x7e, 0xae, - 0x1f, 0x10, 0x01, 0xaf, 0x2b, 0xc1, 0x76, 0x3f, 0x96, 0xa2, 0x07, 0x21, 0x53, 0x04, 0x9d, 0xd0, 0x52, 0xa4, 0x12, - 0x08, 0x44, 0x2b, 0x43, 0xaa, 0x43, 0x9b, 0x6f, 0xa3, 0x2c, 0xb4, 0xdf, 0xf3, 0x87, 0x1f, 0x08, 0x79, 0xde, 0xc4, - 0xc9, 0xc2, 0x47, 0x07, 0x7c, 0x3a, 0x46, 0x1d, 0x84, 0x0f, 0x07, 0xec, 0xcf, 0xc6, 0x71, 0x34, 0x91, 0x92, 0x0a, - 0x36, 0xb8, 0x24, 0x8a, 0x5b, 0xbf, 0x67, 0x7e, 0xa2, 0x9b, 0x94, 0x0d, 0x8b, 0xfb, 0xac, 0xed, 0x3c, 0xf3, 0x0e, - 0x9f, 0x1d, 0x39, 0xf0, 0xbf, 0xcb, 0xda, 0xb9, 0xc9, 0x0b, 0x2e, 0xe2, 0x08, 0x02, 0x9f, 0x88, 0x92, 0x9b, 0x8a, - 0xdd, 0x32, 0xf6, 0xa9, 0x28, 0x75, 0xdc, 0x5c, 0x68, 0xe2, 0xdf, 0x17, 0x65, 0x1a, 0x4b, 0xcc, 0xe3, 0x95, 0x32, - 0xac, 0x86, 0xd1, 0x04, 0xd1, 0x0a, 0x78, 0x6f, 0x4a, 0x09, 0x35, 0x9b, 0x4f, 0xb7, 0x98, 0x17, 0x6b, 0xe7, 0x57, - 0x45, 0x74, 0x25, 0x11, 0xe5, 0x65, 0x27, 0x04, 0xb9, 0xd8, 0xc2, 0x41, 0xdf, 0xec, 0x18, 0x5f, 0x48, 0x83, 0xd8, - 0x86, 0x62, 0x81, 0x7c, 0x5a, 0xa0, 0x2c, 0x59, 0x45, 0xe3, 0x16, 0xfe, 0xf4, 0x47, 0x69, 0x2b, 0x38, 0x00, 0xef, - 0xac, 0xd8, 0xb1, 0x81, 0xab, 0xe6, 0x9f, 0x3a, 0x45, 0x28, 0x8a, 0x54, 0xac, 0x8a, 0xff, 0x2c, 0x33, 0x13, 0x0a, - 0x60, 0x8b, 0x4b, 0x6b, 0x0d, 0xfc, 0x67, 0xb2, 0xe2, 0xb3, 0xcc, 0x84, 0x20, 0xb2, 0xb0, 0xdc, 0x4f, 0x9f, 0x52, - 0x29, 0x08, 0xeb, 0x48, 0xd3, 0x3a, 0x1b, 0x17, 0xee, 0xdd, 0x34, 0x7f, 0x16, 0x93, 0x87, 0xb7, 0xde, 0xd8, 0x8c, - 0x9f, 0x3f, 0x3f, 0x1d, 0xb8, 0x06, 0x0f, 0x4a, 0x5a, 0x8a, 0xa0, 0x75, 0xbe, 0x9f, 0xf2, 0x81, 0xd1, 0x68, 0x16, - 0xb7, 0x84, 0x37, 0x93, 0x23, 0x54, 0x94, 0x39, 0xf6, 0x82, 0x88, 0x16, 0x24, 0x64, 0xf4, 0x85, 0x12, 0x80, 0x28, - 0x23, 0x5f, 0x5d, 0x6d, 0xdb, 0xb1, 0x1d, 0x5d, 0x56, 0x9c, 0x06, 0xb3, 0xc1, 0x3a, 0xce, 0x7c, 0x88, 0x0d, 0x14, - 0xc6, 0x33, 0xb0, 0xad, 0xc9, 0x82, 0x2c, 0x84, 0x40, 0x33, 0x60, 0x64, 0xb3, 0xa0, 0x77, 0x79, 0xce, 0x35, 0x9e, - 0xfd, 0xe4, 0x13, 0x06, 0x1b, 0x14, 0x66, 0x75, 0xe8, 0x71, 0xe8, 0x47, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x42, 0x5d, - 0xb2, 0x24, 0xb5, 0x54, 0x0b, 0x82, 0x9e, 0x06, 0x75, 0x20, 0x0c, 0x3d, 0x36, 0x30, 0x4d, 0xfc, 0x05, 0xf8, 0x64, - 0x5f, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xe2, 0xc8, 0xd4, 0x3c, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, - 0x7a, 0x6e, 0xae, 0xf3, 0xab, 0xfe, 0x2e, 0x21, 0x28, 0xe1, 0x97, 0xc7, 0x34, 0x0f, 0x12, 0x7f, 0x72, 0xf6, 0x72, - 0x46, 0x0e, 0x24, 0x5b, 0x8a, 0xb7, 0xf4, 0x80, 0x04, 0x21, 0x17, 0xec, 0x2e, 0x33, 0x30, 0x10, 0x0b, 0x2f, 0x12, - 0x18, 0x6b, 0x34, 0xfe, 0x0b, 0x22, 0x2d, 0xf8, 0xfc, 0xb9, 0x15, 0x80, 0x81, 0xc3, 0x40, 0x81, 0x0f, 0x7c, 0x1b, - 0x25, 0x80, 0x05, 0x85, 0xe8, 0x0e, 0x81, 0x05, 0xd6, 0x47, 0xf0, 0x6f, 0x91, 0x2c, 0x7e, 0x70, 0xd1, 0xa9, 0x1d, - 0xfa, 0xd1, 0x0c, 0x50, 0x9a, 0x1f, 0xcd, 0x6a, 0x2a, 0x1a, 0x64, 0xbf, 0x58, 0x49, 0x2d, 0x9a, 0x2a, 0xd4, 0x27, - 0xd2, 0xef, 0xef, 0x2f, 0x28, 0xd0, 0x14, 0x04, 0x35, 0xf7, 0x27, 0x68, 0x6c, 0x57, 0x48, 0x77, 0x9e, 0x0f, 0xbe, - 0x3d, 0x59, 0xb0, 0xcc, 0x27, 0xd6, 0x30, 0x3c, 0x7e, 0x81, 0x1c, 0xd0, 0xc6, 0x22, 0x48, 0x2c, 0x05, 0x93, 0x9f, - 0xb0, 0x9b, 0x60, 0xcc, 0xdf, 0xa5, 0xa6, 0xc6, 0xef, 0x29, 0x0b, 0xb5, 0xc0, 0x06, 0xae, 0x49, 0x4a, 0xc8, 0x63, - 0x1f, 0xdd, 0x4c, 0x0e, 0xa2, 0x58, 0x3f, 0xfd, 0x56, 0xda, 0x6b, 0x6d, 0x5a, 0x04, 0x88, 0xf6, 0x78, 0x99, 0xb0, - 0xf0, 0x5f, 0x83, 0x6f, 0xe1, 0xe2, 0xfe, 0xf6, 0x4a, 0x37, 0xfa, 0x99, 0x3d, 0x4f, 0xd8, 0x74, 0xf0, 0x6d, 0x43, - 0xd4, 0x43, 0x7c, 0xde, 0xd3, 0x58, 0xf4, 0xb6, 0x57, 0x38, 0x07, 0x6a, 0xef, 0xf5, 0xa8, 0x3f, 0xe5, 0xaf, 0x75, - 0x78, 0x01, 0xae, 0x4b, 0x6f, 0x6c, 0xb7, 0x8f, 0xef, 0xe7, 0x51, 0xe8, 0x8f, 0x3f, 0xf5, 0x29, 0xa7, 0xf4, 0x61, - 0xc1, 0x6d, 0x3d, 0xf6, 0x97, 0x3d, 0xbc, 0x5e, 0xd5, 0x44, 0x30, 0xd7, 0xa4, 0x54, 0x49, 0xd9, 0x35, 0xee, 0x65, - 0xdc, 0xca, 0x6b, 0xec, 0x19, 0xbb, 0xba, 0x9d, 0x07, 0x19, 0x13, 0x5d, 0xe1, 0x47, 0x9e, 0x8b, 0x87, 0x3a, 0x3d, - 0x51, 0xf1, 0x61, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, 0x74, 0xbb, - 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, 0x3f, 0xba, - 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xb5, 0xe0, 0x01, 0x44, 0xef, 0x9d, 0x6f, 0x4b, 0x58, 0x40, 0xf9, - 0x2d, 0xe5, 0x34, 0x66, 0xe9, 0x7a, 0x6b, 0x90, 0xf5, 0x00, 0xca, 0xd0, 0x4d, 0xe1, 0x04, 0x32, 0xea, 0xb7, 0x20, - 0x0c, 0x3b, 0x06, 0x10, 0x10, 0x2a, 0x2f, 0xc2, 0x2e, 0x55, 0xb8, 0xd2, 0x6f, 0x3c, 0x46, 0xbc, 0x4e, 0xb3, 0xc3, - 0x75, 0x11, 0x99, 0x8a, 0x84, 0x43, 0xbf, 0x2c, 0xd1, 0x89, 0x91, 0x70, 0x11, 0xaf, 0x60, 0xa5, 0x22, 0x3a, 0x62, - 0xbe, 0x7b, 0xe0, 0x68, 0x99, 0xcb, 0x64, 0x74, 0x9e, 0xaf, 0xda, 0x36, 0x17, 0x18, 0xc9, 0xd6, 0xff, 0x68, 0x3b, - 0x18, 0x94, 0x96, 0xda, 0x11, 0xde, 0x5c, 0x27, 0x41, 0x22, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0xd9, 0x53, 0xbd, 0x01, - 0x61, 0x4c, 0xde, 0x02, 0x95, 0x7c, 0xe3, 0x87, 0x8a, 0x72, 0x8b, 0x52, 0xf3, 0x91, 0xc4, 0xfc, 0x4f, 0x9f, 0x16, - 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x71, 0x3b, 0x70, 0xed, 0x76, 0x58, 0x7b, 0xab, 0x9e, 0xd5, 0x6e, 0x77, 0xc0, 0x85, - 0xbb, 0x50, 0xa1, 0x4b, 0x21, 0xa4, 0xb8, 0x1b, 0x95, 0xbd, 0x6a, 0x32, 0x5c, 0x70, 0xa4, 0x5c, 0x79, 0xea, 0xe8, - 0x46, 0x3f, 0x12, 0x22, 0xc9, 0x68, 0x8b, 0x0b, 0x64, 0xfe, 0x16, 0xd3, 0x01, 0x34, 0x5b, 0xe6, 0xb1, 0xc3, 0x68, - 0xf4, 0x7f, 0x3d, 0x09, 0x34, 0xe0, 0x02, 0x19, 0x6a, 0xe5, 0xb4, 0x96, 0x0c, 0x7a, 0xe4, 0xbd, 0x4a, 0x17, 0x2a, - 0x4b, 0xcf, 0x74, 0x48, 0x82, 0xf8, 0x56, 0x18, 0xd2, 0x4e, 0x2a, 0x90, 0xc9, 0xdb, 0xa2, 0x48, 0x30, 0x03, 0xf0, - 0x01, 0xde, 0x12, 0xc6, 0x64, 0xc6, 0xd3, 0xa7, 0x1b, 0x2f, 0x21, 0x12, 0xd8, 0xab, 0x91, 0x3d, 0x75, 0x15, 0xbf, - 0xe9, 0x2a, 0x8a, 0x91, 0xed, 0x22, 0xd6, 0x10, 0x7a, 0x6f, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0xf9, 0x99, 0xcd, 0x25, - 0x4d, 0x2d, 0xe5, 0x72, 0x37, 0x5d, 0xd6, 0x06, 0x8d, 0x37, 0xee, 0xeb, 0x8c, 0xfb, 0x12, 0x7c, 0xb2, 0xfe, 0xb8, - 0xe2, 0x96, 0xde, 0xd0, 0xc6, 0x67, 0xa7, 0x70, 0x4f, 0xf3, 0x2e, 0xf3, 0xc9, 0x87, 0x89, 0x7a, 0xe5, 0xc6, 0x99, - 0x2f, 0xe2, 0xc8, 0x00, 0x5d, 0xde, 0x6f, 0x14, 0xc9, 0x2a, 0xd6, 0xe0, 0xa7, 0xef, 0x2e, 0xbe, 0xd3, 0xf8, 0xfe, - 0x27, 0x09, 0x22, 0x3e, 0x64, 0x28, 0xea, 0xc1, 0x80, 0xa2, 0x1e, 0x68, 0x3c, 0x8c, 0x08, 0xc4, 0x0e, 0xc8, 0x0f, - 0x08, 0x82, 0xc8, 0x80, 0x26, 0xb9, 0xea, 0x62, 0x15, 0x66, 0xc1, 0xd2, 0x4f, 0xb2, 0x03, 0xa8, 0x6a, 0x01, 0x92, - 0xd3, 0x37, 0xd9, 0x88, 0x93, 0x68, 0x56, 0xb8, 0xd8, 0xcb, 0x22, 0x21, 0x9b, 0x9d, 0x06, 0xa1, 0x14, 0xcd, 0x8a, - 0x0e, 0xfc, 0xf1, 0x98, 0x2d, 0xb3, 0x81, 0xee, 0x2f, 0x21, 0xfa, 0x05, 0xfa, 0xb3, 0x3e, 0x88, 0xc7, 0x19, 0xcb, - 0xac, 0x34, 0x4b, 0x98, 0xbf, 0xd0, 0xa5, 0x2b, 0xd7, 0x7a, 0x7b, 0xe9, 0x6a, 0xb4, 0x08, 0x32, 0xe9, 0x0b, 0x91, - 0x26, 0x08, 0x42, 0x52, 0x18, 0xe2, 0xe9, 0x30, 0xe7, 0x20, 0x3c, 0x8f, 0x67, 0x95, 0x1d, 0x55, 0x50, 0x2e, 0x67, - 0xe8, 0x69, 0x97, 0x47, 0x3c, 0x98, 0xa0, 0xcd, 0xd3, 0x35, 0xb7, 0x6b, 0x97, 0x2e, 0x1b, 0xf5, 0xd3, 0x13, 0xfe, - 0xbc, 0xd5, 0xd0, 0x15, 0x83, 0xde, 0x71, 0xc0, 0x97, 0xf0, 0x26, 0x8b, 0xf7, 0x03, 0x5e, 0x18, 0xae, 0x26, 0x6a, - 0x19, 0xfd, 0xbc, 0xd3, 0x58, 0x2e, 0x80, 0x10, 0x2a, 0x09, 0xd1, 0xe7, 0xee, 0xa9, 0x34, 0xb1, 0xc2, 0x51, 0x21, - 0xad, 0xf4, 0xf9, 0xf3, 0xcb, 0xe1, 0x7f, 0xfe, 0x0d, 0xce, 0xe8, 0xe7, 0xae, 0xb0, 0x33, 0xbf, 0x54, 0x4b, 0x71, - 0xea, 0xd3, 0x1c, 0xa2, 0x02, 0x05, 0x9b, 0x08, 0xc7, 0x2b, 0x62, 0x6b, 0xe5, 0xc3, 0x2b, 0xe1, 0x4c, 0x0b, 0x02, - 0x4e, 0x18, 0xc2, 0x1a, 0x7e, 0x08, 0xcb, 0x3b, 0x14, 0x4e, 0x18, 0xb4, 0xdf, 0xee, 0xbe, 0x3f, 0x06, 0x67, 0xcb, - 0xb5, 0x38, 0x10, 0xca, 0x00, 0x71, 0x0f, 0x9d, 0x9e, 0xf8, 0x1a, 0x12, 0x2d, 0x48, 0x7e, 0xa4, 0xbd, 0x03, 0x98, - 0xe6, 0x3c, 0x5e, 0x30, 0x3b, 0x88, 0x0f, 0x6e, 0xd9, 0xc8, 0xf2, 0x97, 0x01, 0xc9, 0xea, 0x91, 0xef, 0xa6, 0x11, - 0xe5, 0x27, 0x45, 0xe0, 0x44, 0x5f, 0xe7, 0x05, 0x28, 0xe3, 0x02, 0x50, 0xf0, 0xd3, 0x3f, 0x2d, 0xfb, 0x67, 0xb4, - 0x45, 0x84, 0x80, 0x32, 0x96, 0x3f, 0x23, 0x37, 0x8b, 0xc2, 0xa3, 0x62, 0xf1, 0x61, 0xc5, 0xd3, 0xa9, 0xea, 0x53, - 0xd1, 0x2e, 0xf7, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x49, 0x3d, 0xd5, 0xbb, 0x90, 0x3f, 0x21, 0x3a, 0x32, 0x77, - 0xbf, 0x09, 0xe7, 0xb9, 0xe6, 0x9b, 0x51, 0x82, 0xe4, 0x31, 0x15, 0xe2, 0x88, 0xa2, 0xea, 0x09, 0x7c, 0x03, 0x69, - 0xf2, 0x68, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0x68, 0x09, 0x30, 0xd9, 0x0c, 0x2a, 0x5a, 0x64, - 0x23, 0x87, 0x95, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x17, 0xfb, 0xab, 0xb4, 0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, - 0x04, 0x2e, 0xda, 0xa9, 0xe0, 0x71, 0xed, 0xaf, 0x84, 0xb2, 0xad, 0xd0, 0xbf, 0x8f, 0x15, 0xdd, 0x05, 0xee, 0xc6, - 0xe0, 0x1c, 0x53, 0x2f, 0x84, 0xf9, 0x60, 0xed, 0x24, 0x49, 0x8f, 0xf3, 0xf5, 0xd3, 0xa4, 0xba, 0x88, 0xdf, 0x75, - 0x98, 0xd4, 0xb2, 0xe5, 0xc9, 0x20, 0x76, 0xcc, 0x8b, 0x83, 0x56, 0xca, 0xc4, 0x73, 0x9f, 0x9f, 0x1c, 0xc0, 0xfc, - 0xc0, 0xf5, 0x42, 0x89, 0x32, 0x0a, 0x0c, 0xf0, 0xef, 0xe0, 0xa7, 0xa4, 0x7f, 0xf1, 0x76, 0x22, 0x88, 0x3a, 0x7c, - 0x39, 0x4a, 0xe7, 0xaf, 0xa5, 0x22, 0x75, 0x62, 0xc5, 0x69, 0xa6, 0xf2, 0x76, 0x47, 0x68, 0xf8, 0x7d, 0x85, 0xe1, - 0x19, 0xf2, 0x7e, 0xc6, 0x84, 0x65, 0xf3, 0x79, 0xb6, 0xc1, 0xf8, 0x79, 0x53, 0x11, 0x22, 0x58, 0xb7, 0x14, 0x28, - 0xf6, 0xf1, 0xb6, 0x52, 0x05, 0x69, 0x24, 0x8b, 0x2d, 0xfd, 0x96, 0xfe, 0x18, 0x77, 0x7c, 0xad, 0x34, 0xa6, 0x42, - 0xb9, 0xf3, 0x6c, 0x00, 0x45, 0x05, 0xb3, 0xdd, 0x5f, 0x2e, 0xa9, 0xb0, 0xd1, 0x3f, 0x39, 0xa0, 0x77, 0xe7, 0x29, - 0xed, 0xb0, 0xd3, 0x13, 0xd0, 0xdf, 0xa4, 0x45, 0xf7, 0x97, 0x4b, 0xbe, 0xa4, 0xf4, 0x8b, 0x72, 0x0e, 0xe6, 0xd9, - 0x22, 0x3c, 0xfd, 0x3f, 0x1d, 0xdb, 0x6f, 0x83, 0x01, 0x5c, 0x03, 0x00}; + 0xdc, 0xb3, 0x37, 0xb7, 0x6d, 0x23, 0xff, 0x7f, 0x3f, 0x05, 0xc3, 0xe4, 0x52, 0x31, 0x21, 0x69, 0x92, 0xb2, 0x6c, + 0x45, 0xb2, 0xec, 0x6b, 0xf3, 0x98, 0x4b, 0xc7, 0x6d, 0x3a, 0x89, 0x9b, 0xb9, 0xab, 0xeb, 0xb1, 0x28, 0x09, 0x92, + 0x78, 0xa1, 0x48, 0x0d, 0x49, 0xf9, 0x51, 0x85, 0xf7, 0x59, 0xee, 0xb3, 0xdc, 0x27, 0xfb, 0xcd, 0xee, 0x02, 0x20, + 0xf8, 0xd0, 0xc3, 0x4d, 0x7a, 0xf7, 0x9b, 0x36, 0x89, 0x08, 0x02, 0x4b, 0x60, 0x01, 0x2c, 0x16, 0xfb, 0xf4, 0x67, + 0x5c, 0xf6, 0x62, 0xb6, 0xd8, 0x7e, 0x9f, 0xfb, 0xfc, 0x99, 0xd9, 0xb8, 0x24, 0x81, 0xe1, 0xb3, 0xb3, 0x78, 0x36, + 0x0b, 0x59, 0x4b, 0x17, 0xc9, 0x43, 0x74, 0x53, 0x7e, 0xe6, 0xec, 0x91, 0x23, 0x22, 0x76, 0x1a, 0xf9, 0xa6, 0xad, + 0x25, 0x46, 0xcc, 0x64, 0x48, 0x3b, 0xe2, 0x5c, 0x51, 0x36, 0x7b, 0x83, 0xea, 0x0d, 0x3e, 0x2f, 0xc5, 0xd6, 0xb5, + 0x26, 0xf1, 0x6a, 0x14, 0x32, 0x0b, 0x97, 0x3b, 0x7c, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x90, 0xa5, 0xe5, 0x91, 0x63, + 0x42, 0xdc, 0x99, 0x38, 0xc5, 0xfb, 0x60, 0x6e, 0xf4, 0x61, 0x50, 0x76, 0x56, 0xed, 0x3e, 0xd8, 0x8a, 0x80, 0xa8, + 0x87, 0x3e, 0x90, 0xc1, 0xdd, 0xaf, 0x61, 0xd7, 0x0e, 0xf4, 0x0f, 0xb0, 0xfa, 0x52, 0xbd, 0xdf, 0xb4, 0xf5, 0x07, + 0x97, 0xfa, 0x07, 0xc4, 0x31, 0x66, 0x2f, 0x7e, 0x49, 0xab, 0x57, 0x37, 0x75, 0x52, 0x7a, 0xaf, 0x30, 0x8f, 0x01, + 0x08, 0x7d, 0x5f, 0x05, 0xfe, 0x2c, 0x8a, 0xd3, 0x2c, 0x18, 0xeb, 0x57, 0xfd, 0xb7, 0x41, 0xeb, 0x72, 0x91, 0xb5, + 0x8c, 0x2b, 0x73, 0x9c, 0xa9, 0x29, 0x50, 0x04, 0xc1, 0xc4, 0x0c, 0x28, 0x9b, 0x2a, 0xa9, 0x3b, 0x68, 0x6b, 0x45, + 0x41, 0x9a, 0xb1, 0xd2, 0x38, 0x1b, 0x40, 0xbd, 0x4a, 0x3e, 0x15, 0x4c, 0x0c, 0xa5, 0x63, 0x4b, 0xa3, 0x4f, 0x37, + 0x95, 0x97, 0xab, 0x35, 0x1e, 0xe5, 0x59, 0x71, 0x5a, 0x62, 0x0c, 0x60, 0xe1, 0x38, 0x43, 0xcf, 0x8f, 0x54, 0xa3, + 0xcf, 0xd2, 0xb9, 0x3b, 0xfc, 0xae, 0xcc, 0x17, 0xc0, 0xf9, 0x0d, 0x16, 0x17, 0x51, 0x9c, 0x69, 0x10, 0xd8, 0x06, + 0xbe, 0x38, 0xac, 0x1a, 0x89, 0x71, 0xa8, 0x2d, 0x23, 0xe7, 0xc4, 0xe0, 0x7b, 0x3c, 0xfc, 0x5a, 0x3c, 0xbc, 0x59, + 0x29, 0x82, 0x05, 0x5d, 0x16, 0x22, 0x98, 0xc0, 0x2c, 0x3e, 0x8f, 0x6f, 0xab, 0x7a, 0x90, 0x97, 0xc3, 0xdd, 0x67, + 0x6f, 0x4b, 0xb0, 0xc9, 0x22, 0xab, 0x5f, 0x8b, 0x27, 0x26, 0x15, 0x8c, 0x4e, 0x65, 0x4f, 0xa1, 0xe1, 0x87, 0xe0, + 0x61, 0x32, 0xb0, 0x13, 0xc3, 0xb3, 0x00, 0x48, 0x12, 0x3f, 0xa6, 0x87, 0xf9, 0xb5, 0x48, 0x9d, 0x2c, 0x12, 0x17, + 0x2b, 0x87, 0x33, 0x50, 0xd7, 0x68, 0xb9, 0xca, 0x30, 0xd4, 0x2e, 0x74, 0x80, 0xe5, 0xba, 0x86, 0xa1, 0x3b, 0x81, + 0x4a, 0x17, 0x6c, 0x62, 0xae, 0x6b, 0xc1, 0xa4, 0x5e, 0xc6, 0x99, 0x5e, 0x20, 0x5e, 0x48, 0xdf, 0x51, 0x50, 0x05, + 0x8f, 0x09, 0x1f, 0xc6, 0xd8, 0x2c, 0xe2, 0xd4, 0xb7, 0xc6, 0xa8, 0xd0, 0x69, 0xa0, 0x0c, 0x63, 0x82, 0xd3, 0x6f, + 0x85, 0x8d, 0x83, 0x85, 0xf0, 0x9b, 0xa5, 0x61, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, + 0xd6, 0xbe, 0xb4, 0x15, 0xd0, 0x2f, 0x74, 0x32, 0x14, 0x18, 0x22, 0x1a, 0x86, 0xf9, 0x75, 0xe1, 0xb9, 0x53, 0x8c, + 0x17, 0x56, 0x19, 0x95, 0x6b, 0xa8, 0xba, 0x1f, 0x70, 0x05, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xfa, 0x7c, + 0x53, 0x55, 0xfa, 0x1b, 0xba, 0x46, 0x84, 0x9e, 0x10, 0x40, 0x34, 0x5f, 0xd7, 0xfe, 0x2a, 0xcb, 0x18, 0x1f, 0xad, + 0x54, 0x6a, 0xc2, 0xb7, 0xae, 0xf5, 0xe7, 0xcc, 0x9e, 0xb0, 0xcc, 0x0f, 0x42, 0x6a, 0xd2, 0x17, 0xd9, 0xea, 0x6b, + 0xc3, 0x4b, 0xcb, 0xc3, 0x8b, 0xca, 0xeb, 0x07, 0x07, 0x43, 0x47, 0x00, 0xf5, 0x1b, 0x47, 0x86, 0x59, 0xac, 0x9a, + 0x67, 0x94, 0xde, 0xfd, 0x57, 0xa7, 0x83, 0xc1, 0x74, 0x44, 0x30, 0x1d, 0x2c, 0x1a, 0xc7, 0x13, 0xf6, 0xcb, 0xfb, + 0xb7, 0x32, 0x6d, 0x16, 0x48, 0x80, 0x86, 0x7c, 0x61, 0xa6, 0xc8, 0x3f, 0x24, 0xc8, 0x3b, 0x50, 0x82, 0x2b, 0x4d, + 0x2e, 0xa1, 0x24, 0xd7, 0xb5, 0x33, 0xea, 0x3b, 0x9b, 0x50, 0xaf, 0x07, 0x31, 0xb6, 0x4a, 0xf2, 0x93, 0x03, 0xaa, + 0x4d, 0xa7, 0x1d, 0x55, 0x02, 0x34, 0x24, 0x30, 0xc2, 0x02, 0x0b, 0x90, 0xe1, 0x73, 0xe0, 0x16, 0x17, 0x0a, 0x7b, + 0x81, 0x72, 0x76, 0xf7, 0xac, 0xcc, 0xaa, 0x60, 0x2b, 0xfd, 0xf4, 0x04, 0x73, 0x76, 0xc1, 0x79, 0x0d, 0x51, 0x3e, + 0x4e, 0x0e, 0xe8, 0x51, 0xab, 0xec, 0x88, 0x02, 0x88, 0xb8, 0xda, 0xf5, 0x38, 0x80, 0x07, 0x6d, 0x15, 0x48, 0x11, + 0x0f, 0xa5, 0x7e, 0xae, 0x6b, 0x0b, 0xce, 0x1a, 0xf1, 0x70, 0x42, 0x10, 0x6b, 0xc0, 0x81, 0xbd, 0xab, 0x6b, 0x0b, + 0xff, 0x0e, 0x47, 0x2e, 0xde, 0xf8, 0x77, 0x2d, 0x97, 0xbf, 0x2a, 0xf6, 0x5a, 0x5a, 0xde, 0x6b, 0x63, 0x3e, 0xb9, + 0xe0, 0x48, 0x20, 0x6f, 0xd6, 0x73, 0x54, 0xd0, 0x36, 0x4c, 0xee, 0x5c, 0x4c, 0xee, 0x64, 0xc3, 0xe4, 0x4e, 0xb6, + 0x4c, 0x6e, 0xc8, 0x27, 0x52, 0x93, 0xa8, 0x4b, 0xd0, 0x39, 0x4c, 0x22, 0x8f, 0x33, 0x1a, 0x3d, 0xbe, 0xcf, 0x10, + 0x4f, 0x56, 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x5c, 0x35, 0xe1, 0x45, 0x41, 0x44, 0x7d, 0xe0, 0x72, 0xd7, 0x89, 0x71, + 0x43, 0x0e, 0xce, 0x56, 0x58, 0x1d, 0x2f, 0xac, 0x52, 0xca, 0x2f, 0xde, 0x9a, 0x6f, 0x18, 0xe9, 0x7c, 0xcb, 0x48, + 0xc7, 0xa5, 0xad, 0xcb, 0x87, 0x4d, 0x9b, 0x50, 0x1d, 0x14, 0xac, 0x41, 0x30, 0x18, 0xc5, 0x25, 0x53, 0x5e, 0x87, + 0x9b, 0x69, 0xac, 0xb2, 0xa2, 0x96, 0x7e, 0x9a, 0xde, 0xc6, 0x09, 0x68, 0x5c, 0x00, 0xcc, 0xc3, 0x96, 0xd4, 0x22, + 0x88, 0x78, 0x30, 0x97, 0x8d, 0x8b, 0xa9, 0x78, 0xaf, 0x2e, 0x29, 0xaf, 0xd3, 0xa1, 0x1a, 0x4b, 0x3f, 0xcb, 0x58, + 0x82, 0x48, 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x65, 0xd6, 0x40, 0x43, 0x42, 0x85, 0xaa, 0x23, 0x85, 0x5e, 0x02, + 0x6f, 0x95, 0x88, 0x83, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc4, 0xff, 0x84, 0xdb, 0xb5, 0x95, 0x28, 0xae, 0x4b, 0xee, + 0x91, 0x61, 0x2f, 0xfd, 0xc9, 0x07, 0x50, 0xec, 0xb5, 0x3c, 0x13, 0x8c, 0x74, 0xd5, 0x30, 0x70, 0x09, 0x31, 0x7b, + 0xe3, 0x82, 0x48, 0x22, 0x95, 0xe4, 0x26, 0x50, 0xe0, 0x3d, 0xe9, 0x5b, 0xd3, 0xab, 0xb5, 0x97, 0x1f, 0xcc, 0x02, + 0xa3, 0x46, 0x35, 0x81, 0xb4, 0x85, 0x83, 0x53, 0x79, 0xe7, 0x0a, 0x4d, 0xf7, 0xc8, 0x00, 0xc9, 0xef, 0x25, 0xe4, + 0x33, 0x75, 0xc4, 0x85, 0x76, 0x98, 0xc0, 0xa9, 0x75, 0xe9, 0x5c, 0xe5, 0x4f, 0x67, 0xf8, 0xcb, 0xbd, 0xca, 0x9f, + 0x8e, 0xf0, 0x97, 0x77, 0x85, 0x99, 0xeb, 0x1a, 0x2e, 0xf2, 0xca, 0x98, 0xf5, 0xd3, 0xd2, 0x7a, 0x22, 0xfb, 0xb3, + 0x07, 0x2c, 0x1b, 0x3e, 0xc1, 0x8f, 0x9f, 0xac, 0x53, 0xf0, 0xb8, 0x54, 0xc7, 0x10, 0xd9, 0x89, 0x91, 0x37, 0x96, + 0xcf, 0x36, 0x94, 0x8f, 0x8c, 0xff, 0xf2, 0xc1, 0x8f, 0xab, 0x24, 0x2e, 0xce, 0x94, 0xb2, 0x18, 0xe2, 0x7a, 0x14, + 0x44, 0x7e, 0x72, 0x7f, 0x4d, 0xd7, 0x8b, 0x96, 0xe0, 0xdd, 0xa5, 0x78, 0x85, 0xd8, 0xcb, 0xb2, 0xba, 0x2b, 0x53, + 0x04, 0xbc, 0xf7, 0xfc, 0xa0, 0x1f, 0xfc, 0x3d, 0x51, 0xd8, 0xb6, 0xd2, 0x05, 0x94, 0x4f, 0x48, 0xe9, 0x43, 0xd7, + 0x4f, 0xd6, 0x2d, 0x56, 0x07, 0x53, 0x19, 0x6d, 0x85, 0x2f, 0x84, 0xe9, 0xc1, 0xcb, 0xec, 0x62, 0x12, 0xf4, 0x50, + 0x9f, 0x35, 0x8a, 0xef, 0xac, 0x27, 0xeb, 0xec, 0x4c, 0x5f, 0xf8, 0xc9, 0x27, 0x36, 0xb1, 0xc6, 0x41, 0x32, 0x0e, + 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x1f, 0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xca, 0x50, 0x43, 0xbd, 0xf3, 0xee, 0x2b, 0x70, + 0x42, 0x22, 0x3b, 0x64, 0x56, 0x1b, 0xb0, 0xa0, 0xbd, 0x94, 0x02, 0xaf, 0x82, 0x51, 0x2c, 0x6a, 0x99, 0x60, 0x60, + 0x09, 0x4a, 0x73, 0xf0, 0x58, 0x35, 0x75, 0x9c, 0x2f, 0xdd, 0x54, 0x87, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x1a, + 0x21, 0xfc, 0xf1, 0xcf, 0x51, 0x32, 0xec, 0xfd, 0x3f, 0x27, 0xa1, 0x7c, 0xd9, 0x08, 0xa1, 0xd4, 0x22, 0x4f, 0x89, + 0x07, 0x7c, 0x9c, 0x33, 0x98, 0x9b, 0x3f, 0xad, 0x36, 0xf6, 0xd3, 0x74, 0xb5, 0x60, 0x13, 0xd2, 0x0c, 0x9e, 0x15, + 0x9d, 0x2a, 0xdf, 0x2c, 0xd4, 0x8e, 0xfd, 0xb6, 0xf2, 0x8e, 0x0f, 0x5f, 0x82, 0xc5, 0x02, 0x30, 0x94, 0xf1, 0x74, + 0xaa, 0x17, 0x77, 0xfc, 0x1d, 0xcd, 0xdc, 0xc3, 0xdf, 0x56, 0x6f, 0x5e, 0x3b, 0x6f, 0x64, 0xe3, 0x08, 0x18, 0x63, + 0xa1, 0x7e, 0xe5, 0x7c, 0xb1, 0xd2, 0x5f, 0x31, 0xa2, 0xa9, 0x1f, 0x6d, 0x1e, 0xce, 0x65, 0x69, 0x89, 0x2f, 0x19, + 0x9b, 0x00, 0xc3, 0x6d, 0xd6, 0x4a, 0xaf, 0x43, 0x76, 0xc3, 0xa4, 0x6a, 0xb7, 0xfe, 0xb1, 0x86, 0x16, 0x18, 0x7b, + 0x8e, 0xab, 0x8c, 0x39, 0x57, 0xa7, 0x0c, 0x69, 0x88, 0x63, 0xe0, 0x23, 0x57, 0xb7, 0x58, 0x65, 0x4b, 0x0d, 0x4d, + 0x5d, 0xe9, 0xc0, 0xc6, 0x9e, 0x9d, 0x6d, 0x28, 0xef, 0x61, 0xe2, 0xe9, 0xe6, 0xbe, 0x99, 0xae, 0xd1, 0x83, 0x58, + 0xdd, 0x1c, 0x4f, 0x21, 0xec, 0xbc, 0x56, 0x21, 0x0e, 0xd9, 0x84, 0xb1, 0x26, 0x21, 0x99, 0x4e, 0xd2, 0x17, 0x61, + 0xed, 0x88, 0x66, 0xbf, 0x42, 0x0e, 0xd5, 0x38, 0x37, 0x5a, 0x79, 0xe4, 0x23, 0x4c, 0xe8, 0x1a, 0xb1, 0x34, 0xdd, + 0x88, 0x30, 0x39, 0xe9, 0xa6, 0x5e, 0xd4, 0x2e, 0xe3, 0xa3, 0x28, 0x37, 0x1d, 0x13, 0x58, 0x02, 0x1c, 0x60, 0xf5, + 0x5b, 0x78, 0xbc, 0x5c, 0x2f, 0xb8, 0xbd, 0x4a, 0x32, 0x1b, 0xe9, 0xdc, 0x96, 0x60, 0xd3, 0xfb, 0x5b, 0x9d, 0x77, + 0xaa, 0x74, 0x4c, 0x37, 0x76, 0xad, 0x55, 0x22, 0xbd, 0x35, 0x71, 0x11, 0x02, 0x10, 0x7d, 0xaa, 0xd0, 0x57, 0x36, + 0x9d, 0xb2, 0x71, 0x96, 0x1a, 0x42, 0x78, 0x24, 0xa3, 0xc7, 0x82, 0xd7, 0xd0, 0xa3, 0x81, 0xfe, 0x13, 0xf8, 0xd0, + 0x8b, 0x20, 0x4b, 0xbc, 0x43, 0xe2, 0xce, 0xd4, 0x8c, 0x26, 0x82, 0x58, 0x46, 0x11, 0xff, 0x0a, 0x24, 0x07, 0x6f, + 0x28, 0xc7, 0xae, 0xf1, 0xf3, 0xa7, 0x58, 0x17, 0xb1, 0xb4, 0x6a, 0xd9, 0x4e, 0x8a, 0xb6, 0x6d, 0xdf, 0xb5, 0xfb, + 0xa6, 0xe3, 0x3a, 0xb9, 0x6e, 0x82, 0xef, 0xd6, 0xa7, 0x7d, 0x37, 0x3d, 0xb6, 0x6a, 0x43, 0xab, 0x55, 0xf4, 0x90, + 0x76, 0x9e, 0xfb, 0xc2, 0xd5, 0x4d, 0x32, 0x99, 0x53, 0x68, 0xdb, 0x38, 0xbe, 0x61, 0xc9, 0x17, 0x0f, 0xa5, 0x0c, + 0x7c, 0xbf, 0xfe, 0x1c, 0xb9, 0x0e, 0x10, 0xe1, 0x2c, 0x5e, 0x3e, 0x60, 0x08, 0x6d, 0xdd, 0xd4, 0xc7, 0x61, 0x9c, + 0x32, 0x75, 0x0c, 0x24, 0x04, 0xf9, 0xc2, 0x41, 0xfc, 0xfc, 0xfe, 0xf5, 0x87, 0x0f, 0xba, 0x89, 0x99, 0x40, 0x53, + 0x15, 0x3a, 0x5f, 0x50, 0x3b, 0xa8, 0x7f, 0xe3, 0xba, 0xa3, 0x13, 0x86, 0x2e, 0xb5, 0xe5, 0x35, 0x47, 0x65, 0xb5, + 0x25, 0xc7, 0x4f, 0x1e, 0xfe, 0x65, 0xba, 0x89, 0xee, 0x35, 0xae, 0x06, 0xda, 0xb0, 0xfd, 0x78, 0x2b, 0x95, 0x2c, + 0x82, 0xe8, 0xba, 0xa1, 0xd4, 0xbf, 0x6b, 0x28, 0x85, 0xab, 0x5c, 0x8d, 0x56, 0xad, 0xe2, 0x85, 0xc2, 0x1a, 0x40, + 0x22, 0xe7, 0x5d, 0xe8, 0x52, 0xee, 0x53, 0x5f, 0xd0, 0x69, 0x1e, 0xc9, 0xbd, 0xda, 0xeb, 0x86, 0x62, 0x7e, 0x09, + 0x92, 0xb8, 0x1d, 0x87, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6d, 0x94, 0xe6, 0xba, 0x0a, 0x10, 0x62, 0x6f, + 0xaf, 0x33, 0xb6, 0x58, 0xb2, 0xc4, 0xcf, 0x56, 0x09, 0xbb, 0x0e, 0xe3, 0xdb, 0x47, 0x85, 0x39, 0xfd, 0x8e, 0xca, + 0xf3, 0x60, 0x36, 0x97, 0xb5, 0xcf, 0x5a, 0x6c, 0x20, 0x27, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0xb6, 0xff, + 0xf3, 0xef, 0x9d, 0x55, 0x01, 0x7c, 0x3e, 0x34, 0xb3, 0xc1, 0x1e, 0xeb, 0xa2, 0xf9, 0x4b, 0x65, 0x9c, 0x37, 0xd7, + 0xa9, 0x4d, 0x02, 0xbc, 0xaf, 0x4d, 0x41, 0xad, 0xb0, 0xbc, 0x6e, 0x1e, 0xd4, 0x31, 0x18, 0xd7, 0xce, 0x9e, 0x41, + 0xa5, 0x2f, 0xea, 0xda, 0xd0, 0xe8, 0xed, 0x35, 0x23, 0x7f, 0x1c, 0xc3, 0xbb, 0xc6, 0xf0, 0x85, 0xdd, 0xe7, 0x72, + 0xc9, 0x97, 0xc3, 0xa1, 0xcc, 0x2d, 0xa7, 0x36, 0x05, 0x13, 0xff, 0xb3, 0x5a, 0x09, 0x3f, 0x3c, 0x7b, 0x8e, 0x41, + 0xbe, 0xf7, 0x83, 0x97, 0x43, 0x34, 0x46, 0x3b, 0x19, 0x25, 0x05, 0xb3, 0xb2, 0x91, 0xb4, 0x91, 0x31, 0x79, 0x0d, + 0x68, 0x8d, 0xae, 0x41, 0x29, 0x26, 0x1c, 0xcb, 0x87, 0x86, 0xf9, 0x72, 0xc8, 0x05, 0x4b, 0xdc, 0xfe, 0xb5, 0x57, + 0x5d, 0xda, 0x5c, 0x2c, 0x5b, 0x42, 0xba, 0xa9, 0x91, 0xfe, 0x07, 0x2b, 0xb3, 0x42, 0x8e, 0x87, 0x02, 0x7e, 0x90, + 0x28, 0x0c, 0x73, 0xcc, 0x77, 0xf2, 0x6e, 0x93, 0x8d, 0xd8, 0xcf, 0xbb, 0x6d, 0xc4, 0x2e, 0xf6, 0xb2, 0x11, 0xfb, + 0xf9, 0xab, 0xdb, 0x88, 0xbd, 0x53, 0x6d, 0xc4, 0x60, 0x12, 0x5f, 0xb3, 0xbd, 0x0c, 0xb7, 0x84, 0xd5, 0x46, 0x7c, + 0x9b, 0x0e, 0x5c, 0xce, 0xd2, 0xa6, 0xe3, 0x39, 0x03, 0x19, 0x01, 0x9f, 0x95, 0x30, 0x9e, 0x81, 0x11, 0xd7, 0x9f, + 0x6f, 0x6e, 0x15, 0xc6, 0x33, 0xd5, 0xd8, 0x2a, 0xe2, 0x11, 0x5f, 0x8b, 0x28, 0x4e, 0x64, 0xe0, 0xe4, 0x98, 0x22, + 0xe6, 0x93, 0x75, 0x68, 0x28, 0x59, 0xad, 0xa5, 0xf5, 0x9a, 0x27, 0x4c, 0xa0, 0x7a, 0x68, 0x3d, 0x25, 0x1b, 0x7a, + 0xcf, 0x45, 0x6c, 0x0b, 0x15, 0x82, 0xb4, 0x12, 0xa6, 0x38, 0x11, 0x6b, 0xfd, 0xb7, 0x3b, 0xf7, 0xfb, 0x4b, 0xb7, + 0xdf, 0x76, 0xc1, 0x39, 0x1b, 0x6e, 0x98, 0x58, 0xe0, 0xf4, 0xdb, 0x6d, 0x28, 0xb8, 0x55, 0x0a, 0x3c, 0x28, 0x08, + 0x94, 0x82, 0x0e, 0x14, 0x8c, 0x95, 0x82, 0x23, 0x28, 0x98, 0x28, 0x05, 0xc7, 0x50, 0x70, 0xa3, 0xe7, 0x97, 0x91, + 0xec, 0xee, 0xb1, 0x71, 0x65, 0xd2, 0xa5, 0x42, 0x94, 0x1d, 0x9b, 0x2e, 0x58, 0x4d, 0xf9, 0xb3, 0x5e, 0x6c, 0x92, + 0x74, 0xb1, 0x97, 0x98, 0xb7, 0x73, 0x46, 0x81, 0xa2, 0x5f, 0xe1, 0x99, 0x63, 0x67, 0x31, 0xd8, 0x4d, 0x8b, 0x00, + 0x0c, 0x02, 0x0f, 0x9a, 0x6e, 0x80, 0xc0, 0xa8, 0x2f, 0x67, 0x4e, 0x04, 0xb1, 0x50, 0xe6, 0xb2, 0x78, 0x47, 0x9f, + 0xb3, 0xe4, 0x12, 0x28, 0x2c, 0x4e, 0x5a, 0xaa, 0x54, 0xf2, 0x6b, 0xd8, 0x1d, 0xbc, 0x62, 0xa3, 0xd5, 0x4c, 0x3b, + 0x8f, 0x67, 0x3b, 0x4d, 0x08, 0xd4, 0x57, 0xd0, 0x4b, 0x9d, 0xd4, 0x2f, 0x96, 0x58, 0x96, 0xfc, 0x5b, 0xf4, 0x98, + 0x97, 0xeb, 0x67, 0xd0, 0x37, 0x2d, 0x23, 0x03, 0x16, 0xf8, 0x0e, 0xe0, 0x48, 0xd1, 0xe1, 0x9f, 0x03, 0x9e, 0x95, + 0xe7, 0x0b, 0x5f, 0xe9, 0xcf, 0xe9, 0x8f, 0x2c, 0x4d, 0xfd, 0x99, 0xa8, 0x5f, 0xef, 0x27, 0x18, 0xed, 0xc8, 0xfb, + 0x17, 0x22, 0x10, 0x24, 0x79, 0x41, 0xcd, 0x36, 0x23, 0x89, 0x6f, 0x35, 0xb0, 0xfe, 0x81, 0x05, 0x55, 0xd8, 0x29, + 0x04, 0x36, 0x4c, 0x61, 0xd9, 0xa2, 0x00, 0x36, 0xff, 0x0d, 0x0b, 0xab, 0x85, 0x99, 0x3f, 0xab, 0x16, 0xd1, 0x3a, + 0xc8, 0xd5, 0xbe, 0x49, 0x85, 0x7e, 0xa9, 0xf0, 0x4b, 0x34, 0xd4, 0x61, 0x3c, 0xfb, 0x53, 0xd5, 0xd3, 0x5b, 0xcc, + 0x0a, 0x3e, 0x44, 0x66, 0x90, 0x0d, 0x6d, 0xc4, 0xb1, 0x66, 0x03, 0x0a, 0x7b, 0x51, 0x36, 0xb7, 0xd0, 0xb5, 0xac, + 0xe5, 0x45, 0x86, 0x69, 0xe3, 0xdc, 0xae, 0xab, 0x0e, 0xb5, 0xbd, 0x64, 0x36, 0xf2, 0x5b, 0xae, 0x77, 0x6c, 0x8a, + 0x3f, 0xb6, 0xd3, 0x31, 0x72, 0x84, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, + 0xbe, 0xb7, 0x88, 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x2e, 0xd4, 0x7d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x5d, + 0xdb, 0x4b, 0xd8, 0x82, 0x5a, 0xcb, 0x48, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0x97, + 0x1c, 0xb5, 0x00, 0x8e, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xfd, 0xa5, 0x3f, 0xc1, 0xc8, 0x84, 0xb6, 0xd7, 0x49, + 0xd8, 0x42, 0xb3, 0x3b, 0x1b, 0x81, 0x27, 0xf1, 0xed, 0x29, 0xf4, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0xa7, 0xf8, 0xc6, + 0x42, 0xcf, 0x12, 0x01, 0xc7, 0xc2, 0x8b, 0x38, 0x40, 0x63, 0x8b, 0x3e, 0xbc, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, + 0x91, 0x45, 0xc3, 0x39, 0x76, 0x96, 0x0a, 0x2c, 0x15, 0x7f, 0xc6, 0x1a, 0xab, 0xbb, 0x9a, 0xd3, 0x87, 0xcb, 0xda, + 0x34, 0x8c, 0x6f, 0x7b, 0xf3, 0x60, 0x32, 0x61, 0x51, 0x1f, 0xfb, 0x2c, 0x0b, 0x59, 0x18, 0x06, 0xcb, 0x34, 0x48, + 0xfb, 0x0b, 0xff, 0x8e, 0x43, 0x3d, 0xdc, 0x04, 0xb5, 0xcd, 0xa1, 0xb6, 0xf7, 0x86, 0xaa, 0x80, 0x01, 0x2f, 0x16, + 0x82, 0xc3, 0xbb, 0xd6, 0xd1, 0x9c, 0xca, 0x38, 0xf7, 0x86, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, + 0x39, 0xb9, 0x7d, 0xb3, 0xa6, 0x85, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x3c, 0x39, 0x93, 0x49, 0x6e, 0x8f, + 0xc5, 0xd3, 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0xa2, 0xa0, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, + 0x1a, 0xb9, 0xcd, 0xf8, 0x53, 0xc2, 0x26, 0x7d, 0x5c, 0x48, 0x64, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x29, 0xc0, + 0x65, 0x89, 0x36, 0xa1, 0xac, 0xe7, 0x6a, 0xbd, 0x77, 0x4d, 0xad, 0xf8, 0xdc, 0x78, 0xdc, 0x58, 0x6f, 0xe2, 0x27, + 0x9f, 0xae, 0x34, 0x65, 0x14, 0xbe, 0x4f, 0xd5, 0xd6, 0x02, 0x0d, 0xd6, 0x5d, 0x0f, 0x42, 0x76, 0xf5, 0x47, 0x71, + 0x02, 0x7b, 0x36, 0xf1, 0x27, 0xc1, 0x2a, 0xed, 0xb9, 0xde, 0xf2, 0x4e, 0x14, 0xf1, 0xb5, 0x5e, 0x14, 0xe0, 0xde, + 0xeb, 0xa5, 0x71, 0x18, 0x4c, 0x44, 0xd1, 0xa6, 0xbd, 0xe4, 0x7a, 0x46, 0x1f, 0x1d, 0xd6, 0x03, 0x0c, 0xbb, 0xe0, + 0x87, 0xa1, 0x66, 0xb7, 0x53, 0x8d, 0xf9, 0x29, 0xca, 0x97, 0x35, 0x27, 0x25, 0xbc, 0xa0, 0x73, 0xba, 0x7b, 0xb8, + 0xbc, 0x93, 0x6b, 0xde, 0x3d, 0x5a, 0xde, 0xe5, 0x7f, 0x5d, 0xb0, 0x49, 0xe0, 0x6b, 0xad, 0x62, 0x35, 0xb9, 0x0e, + 0xc8, 0xa0, 0x8d, 0xf5, 0x86, 0x65, 0x2a, 0xb6, 0x05, 0x84, 0x36, 0x7c, 0x14, 0x2c, 0x96, 0x71, 0x92, 0xf9, 0x51, + 0x96, 0xe7, 0xc3, 0xab, 0x3c, 0xef, 0x5f, 0x04, 0xad, 0xcb, 0x7f, 0xb4, 0xe8, 0x9c, 0x26, 0x9d, 0x4d, 0x6e, 0x5c, + 0x99, 0xaf, 0x99, 0x6a, 0x33, 0x02, 0xc7, 0x18, 0xda, 0x8b, 0xa8, 0x95, 0xe9, 0x94, 0xac, 0x57, 0x26, 0x24, 0xcb, + 0xea, 0x64, 0x83, 0x52, 0xae, 0x82, 0x27, 0x10, 0x54, 0x78, 0xcd, 0x06, 0x17, 0x8a, 0xfd, 0x09, 0x30, 0x2b, 0x58, + 0x99, 0xfc, 0x0a, 0x9e, 0x6c, 0xe2, 0x19, 0xbf, 0xdb, 0xcd, 0x33, 0xfe, 0x9a, 0xed, 0xc3, 0x33, 0x7e, 0xf7, 0xd5, + 0x79, 0xc6, 0x27, 0x75, 0xbf, 0x82, 0xb7, 0xf1, 0x40, 0x97, 0x1a, 0x06, 0x38, 0x9a, 0x12, 0x8a, 0xd8, 0xf3, 0xf6, + 0x0f, 0xbb, 0x01, 0x08, 0x68, 0x94, 0x83, 0x8e, 0x4e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xe7, + 0xe9, 0x74, 0xf0, 0x2a, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, + 0x4f, 0x80, 0x73, 0x36, 0x59, 0x1d, 0x4f, 0xa4, 0xf5, 0x59, 0xbf, 0xdc, 0x85, 0x96, 0x34, 0xf9, 0x14, 0x2e, 0x38, + 0x35, 0x51, 0xe2, 0x8c, 0x65, 0xdc, 0x67, 0xf6, 0xfb, 0xfb, 0xb7, 0x93, 0xd6, 0xdb, 0xd8, 0xc8, 0x83, 0xf4, 0x5d, + 0xd5, 0x01, 0x86, 0xeb, 0x7e, 0x06, 0xea, 0x70, 0x72, 0x6e, 0x41, 0xa6, 0x26, 0x98, 0x86, 0xd7, 0xd4, 0xfc, 0xac, + 0x34, 0xd2, 0x9e, 0xda, 0x90, 0x27, 0xba, 0xaa, 0x1d, 0xc6, 0xdc, 0xfb, 0x60, 0xcd, 0x39, 0x40, 0xcc, 0xdd, 0x85, + 0x7e, 0xc3, 0x13, 0x6a, 0x1e, 0x4c, 0xf2, 0xdc, 0xe8, 0x0b, 0x44, 0x28, 0x07, 0x2d, 0xdb, 0xc5, 0xc4, 0xa5, 0xb7, + 0xd2, 0xa6, 0x81, 0x6b, 0x08, 0x49, 0xfd, 0xf7, 0x16, 0x14, 0xea, 0x5c, 0x59, 0xc8, 0x71, 0xa6, 0x6b, 0x84, 0x3e, + 0x32, 0xb4, 0x50, 0x06, 0x04, 0x1a, 0x60, 0x89, 0x7f, 0xf1, 0x4a, 0x14, 0xd4, 0x6d, 0x38, 0x09, 0x39, 0x68, 0x11, + 0x00, 0x5e, 0xfe, 0x42, 0xae, 0x4d, 0x64, 0x87, 0xd7, 0xc1, 0x87, 0x5c, 0x97, 0xbc, 0x1f, 0x2e, 0xbf, 0xd3, 0x93, + 0x03, 0x68, 0x70, 0x5a, 0x31, 0x1c, 0xd8, 0x61, 0xa1, 0x08, 0xac, 0x44, 0x7a, 0x6b, 0xda, 0xe9, 0xad, 0xf6, 0x6c, + 0x2d, 0x22, 0x64, 0x64, 0xfe, 0xd2, 0x82, 0x2b, 0x3e, 0xd2, 0x5e, 0x4e, 0xf1, 0x94, 0x60, 0x1c, 0xfd, 0x55, 0x0a, + 0xb4, 0x11, 0x2f, 0xaa, 0x48, 0x7f, 0xfa, 0xe3, 0x55, 0x92, 0xc6, 0x49, 0x6f, 0x19, 0x07, 0x51, 0xc6, 0x92, 0x1c, + 0x51, 0x75, 0x89, 0xf8, 0x11, 0xe8, 0xb9, 0x5a, 0xc7, 0x4b, 0x7f, 0x1c, 0x64, 0xf7, 0x3d, 0x87, 0xb3, 0x14, 0x4e, + 0x9f, 0x73, 0x07, 0x4e, 0x63, 0xfd, 0x1e, 0xc7, 0xe6, 0x73, 0x64, 0xfc, 0x92, 0x3a, 0x3b, 0xa3, 0x2e, 0xf3, 0xbe, + 0xf2, 0x96, 0x62, 0x84, 0x00, 0xfb, 0xe1, 0x27, 0xd6, 0x0c, 0xa8, 0x3c, 0x4c, 0xb5, 0x33, 0x61, 0x33, 0x13, 0xa9, + 0x36, 0xc8, 0xe5, 0xc5, 0x1f, 0xbb, 0x63, 0x68, 0x4e, 0x73, 0x31, 0x70, 0x3c, 0xc6, 0x3e, 0x3d, 0xeb, 0xf9, 0x90, + 0x51, 0xcb, 0xdc, 0xa7, 0xe6, 0x88, 0x4d, 0xe3, 0x84, 0x51, 0x3c, 0x59, 0xb7, 0xbb, 0xbc, 0xdb, 0x1f, 0xfc, 0xf6, + 0xe1, 0x37, 0xc3, 0x89, 0xe2, 0xac, 0x25, 0x80, 0x19, 0x3b, 0xa0, 0xd5, 0xcf, 0x33, 0x60, 0x0d, 0x09, 0xf3, 0x63, + 0x0a, 0xdd, 0xd5, 0xd3, 0xf5, 0x7e, 0x63, 0xd8, 0xae, 0x65, 0xcc, 0xcf, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, + 0x9e, 0xb1, 0x7d, 0xb4, 0xbc, 0x13, 0x73, 0x8c, 0x07, 0xde, 0x03, 0x26, 0xa9, 0xd2, 0x15, 0x31, 0x49, 0xd5, 0x62, + 0x9c, 0xa4, 0x7e, 0x6d, 0x34, 0x22, 0x92, 0x45, 0xe5, 0xa4, 0xef, 0x2c, 0xef, 0xd4, 0x23, 0xba, 0x68, 0x26, 0x4f, + 0xea, 0x6a, 0x08, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x4d, 0x74, 0x79, 0x2e, 0x15, 0xe4, 0x48, 0x3c, 0xf8, + 0xa3, 0x34, 0x0e, 0x57, 0x19, 0x6b, 0x46, 0x17, 0x21, 0xc7, 0x73, 0x0a, 0xe4, 0xe0, 0xef, 0x72, 0x5f, 0x3b, 0xc0, + 0x6e, 0xc3, 0x32, 0x71, 0xfa, 0x10, 0x71, 0xd8, 0x6a, 0x97, 0xbb, 0x0e, 0xaf, 0x64, 0xa7, 0xcd, 0x86, 0x81, 0x98, + 0x70, 0x2c, 0x11, 0xf5, 0xd6, 0x6c, 0x97, 0x97, 0xc9, 0xa8, 0xab, 0xb2, 0x28, 0x2f, 0x0f, 0xe6, 0xcf, 0xd9, 0x63, + 0x2f, 0x9a, 0xf7, 0xd8, 0x0b, 0xb1, 0xc7, 0xb6, 0xaf, 0xcc, 0xc7, 0x53, 0x17, 0xfe, 0xeb, 0x17, 0x03, 0xea, 0x39, + 0x5a, 0x7b, 0x79, 0xa7, 0xb9, 0xcb, 0x3b, 0xcd, 0xf2, 0x96, 0x77, 0x1a, 0x82, 0x46, 0x7b, 0x10, 0xd3, 0xf6, 0x0c, + 0xd3, 0xd1, 0xa0, 0x10, 0xfe, 0x38, 0xa5, 0x57, 0xee, 0x21, 0xbc, 0x83, 0x56, 0x9d, 0xfa, 0x3b, 0x6f, 0xfb, 0x56, + 0xa7, 0xbd, 0x24, 0x88, 0xb6, 0x61, 0x67, 0xfe, 0x68, 0xc4, 0x26, 0xbd, 0x69, 0x3c, 0x5e, 0xa5, 0xff, 0xe2, 0xfd, + 0xe7, 0x48, 0xdc, 0x4a, 0x08, 0x2a, 0x70, 0x44, 0x53, 0x50, 0x94, 0xdc, 0x30, 0x01, 0x61, 0x2d, 0xe7, 0xa9, 0x47, + 0xe1, 0x91, 0x3d, 0xfb, 0xb0, 0x61, 0x91, 0x37, 0x23, 0xfa, 0x4f, 0x9b, 0xa5, 0xcd, 0x24, 0xe6, 0x0b, 0xd0, 0xb2, + 0x15, 0x1d, 0x0f, 0xc7, 0x06, 0x9f, 0x4d, 0xa7, 0xdb, 0xdc, 0xdd, 0x4b, 0xf1, 0xa5, 0x2b, 0x71, 0xa8, 0xf0, 0x73, + 0x8b, 0x3b, 0xa6, 0x6c, 0x87, 0xba, 0x69, 0x8d, 0xd4, 0xa0, 0x6e, 0x39, 0x10, 0x8a, 0xba, 0x7b, 0x52, 0xf9, 0xc7, + 0x2f, 0x0e, 0xe1, 0x3f, 0xe2, 0xea, 0x7f, 0xcd, 0x9a, 0x18, 0xf5, 0xb7, 0x65, 0x4b, 0x70, 0x62, 0x95, 0x90, 0x11, + 0xdf, 0xbf, 0xfe, 0x74, 0xfa, 0xb0, 0x06, 0x7b, 0xd7, 0x26, 0x53, 0xaa, 0x6a, 0xed, 0xef, 0xe3, 0x18, 0x52, 0x77, + 0xd6, 0xab, 0x0b, 0xf4, 0x90, 0xb1, 0x7b, 0x36, 0x80, 0x46, 0xe2, 0x1e, 0x41, 0x5a, 0x7c, 0x1d, 0xdb, 0xd0, 0x55, + 0xe2, 0xf5, 0xa6, 0xab, 0xc4, 0xab, 0xdd, 0x57, 0x89, 0x1f, 0xf6, 0xba, 0x4a, 0xbc, 0xfa, 0xea, 0x57, 0x89, 0xd7, + 0xf5, 0xab, 0xc4, 0x45, 0x2c, 0xec, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0xce, 0xe3, 0x41, 0xc7, + 0xa1, 0x90, 0xc7, 0x17, 0x7f, 0xf8, 0x62, 0x81, 0x0b, 0xf1, 0x3d, 0x9a, 0x93, 0x15, 0x57, 0x0b, 0x4e, 0xd9, 0xf1, + 0x3b, 0x4a, 0x71, 0x18, 0x47, 0xb3, 0x9f, 0x41, 0x29, 0x0b, 0xe2, 0xc0, 0x44, 0x79, 0x11, 0xa4, 0x3f, 0xc7, 0xcb, + 0xd5, 0xf2, 0x2d, 0xc0, 0xfa, 0x18, 0xa4, 0xc1, 0x28, 0x64, 0xd2, 0x13, 0x99, 0xcc, 0xdf, 0xb8, 0x4c, 0x1c, 0x2c, + 0x4e, 0xc5, 0x4f, 0xff, 0x4e, 0xfc, 0x44, 0x9b, 0x54, 0xfe, 0x9b, 0xec, 0xea, 0xf4, 0xe6, 0x8b, 0x88, 0x50, 0x02, + 0x2a, 0x9d, 0x7e, 0xf8, 0x65, 0xe4, 0x22, 0x36, 0x1a, 0x46, 0x29, 0xec, 0x1d, 0x36, 0xc2, 0x61, 0xb5, 0x4b, 0xcd, + 0xca, 0x30, 0x65, 0x08, 0xae, 0xba, 0x18, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x93, + 0x01, 0x68, 0x38, 0x65, 0x1b, 0x4c, 0x1e, 0xf9, 0x01, 0x19, 0xe5, 0x38, 0x69, 0xe9, 0x90, 0xbb, 0x74, 0xb5, 0xb4, + 0x48, 0xd5, 0x6c, 0xe1, 0x10, 0x75, 0x99, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0xd6, 0x52, 0x98, 0x6a, 0xc4, + 0x36, 0x97, 0x0a, 0xa7, 0xad, 0x48, 0x08, 0x17, 0x45, 0x1c, 0x8c, 0x86, 0x89, 0xe3, 0x6f, 0xc8, 0x75, 0xb5, 0x78, + 0x0b, 0x51, 0x44, 0xf2, 0x15, 0x9f, 0x0f, 0x1e, 0x15, 0x82, 0x1e, 0x5f, 0x2a, 0x68, 0x7c, 0x77, 0xc3, 0x92, 0xd0, + 0xbf, 0x6f, 0x19, 0x79, 0x1c, 0xfd, 0x08, 0x08, 0x78, 0x15, 0xdf, 0x46, 0x6a, 0x05, 0x4c, 0xd6, 0xd2, 0xb0, 0x96, + 0x1a, 0xe3, 0x97, 0x80, 0xe3, 0x8a, 0xd2, 0x03, 0x48, 0x93, 0x3b, 0x63, 0x7f, 0x37, 0xe9, 0xdf, 0x7f, 0x18, 0xb9, + 0x79, 0x1e, 0xcb, 0x0f, 0xfd, 0xb2, 0xdc, 0xe3, 0x33, 0x4f, 0x9f, 0x3e, 0xda, 0x3c, 0xec, 0x72, 0x7a, 0xf6, 0x86, + 0xd6, 0xc6, 0xc6, 0x5d, 0x00, 0xbd, 0xb8, 0x88, 0x57, 0xe3, 0x39, 0x1a, 0xba, 0x7e, 0xbd, 0xf1, 0x66, 0x00, 0x13, + 0xb3, 0x94, 0xca, 0xa1, 0x57, 0x8a, 0x0a, 0x2c, 0xe0, 0xf7, 0x5f, 0x43, 0x00, 0xce, 0xff, 0x21, 0x1a, 0xea, 0xab, + 0x86, 0xdf, 0xe2, 0x83, 0x87, 0x2d, 0xde, 0x3e, 0x24, 0xd3, 0xe4, 0xa1, 0x2d, 0x84, 0x72, 0xad, 0x99, 0xc8, 0xe4, + 0x55, 0xa4, 0xa9, 0x61, 0xe4, 0x36, 0x45, 0xc8, 0x13, 0x5f, 0x61, 0x36, 0x5d, 0xd3, 0xb9, 0xa3, 0x81, 0xc9, 0x38, + 0xb5, 0xaa, 0x10, 0x19, 0x6e, 0xf2, 0xc0, 0x90, 0x7c, 0x55, 0xdf, 0x2d, 0x82, 0xc8, 0xc4, 0x28, 0xf0, 0xf5, 0x37, + 0xfe, 0x1d, 0xc4, 0x41, 0x06, 0xe2, 0x56, 0x7d, 0x05, 0x85, 0xa6, 0xea, 0x37, 0x07, 0xa9, 0x9e, 0xf4, 0x46, 0x4c, + 0x08, 0x2d, 0xde, 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0x79, 0x8d, 0xd0, 0xe4, 0x3d, 0x02, 0xcb, 0xf1, 0x3a, 0x00, 0xda, + 0x92, 0x7c, 0x79, 0x47, 0x25, 0x70, 0x33, 0x40, 0x9d, 0xac, 0x28, 0xe0, 0xa1, 0xfe, 0x3a, 0x8e, 0x28, 0x10, 0x17, + 0x7a, 0x08, 0xd3, 0xe6, 0x27, 0x10, 0x11, 0xb8, 0xa7, 0xe1, 0x85, 0x1d, 0xdf, 0x72, 0x49, 0xb0, 0xe6, 0xd0, 0xe3, + 0xb0, 0xcf, 0x9a, 0x63, 0xc2, 0x45, 0x0a, 0x15, 0x04, 0xad, 0x43, 0x25, 0xc4, 0xb3, 0xc9, 0x1a, 0x68, 0x23, 0xde, + 0x8b, 0xee, 0xb2, 0x05, 0x8b, 0x56, 0x3a, 0xe6, 0x84, 0xc2, 0x18, 0x7d, 0x50, 0xe7, 0x15, 0x31, 0x5b, 0x40, 0x6d, + 0x9a, 0x5b, 0xce, 0xe9, 0x2c, 0x4c, 0x39, 0x49, 0xf5, 0xcd, 0x31, 0x57, 0x6c, 0xa6, 0x9c, 0xb6, 0x55, 0x4f, 0x08, + 0x3e, 0xa5, 0x71, 0xd5, 0x91, 0x8b, 0x2c, 0xa1, 0x01, 0x06, 0x45, 0xc7, 0xe0, 0xe2, 0x22, 0x81, 0xf6, 0x96, 0x5f, + 0x9d, 0x34, 0xa9, 0x91, 0xf1, 0x2b, 0x82, 0xa2, 0xc4, 0xa8, 0x83, 0xe1, 0xfd, 0x84, 0xc0, 0x44, 0x1b, 0xe1, 0x8c, + 0x6b, 0x70, 0x36, 0x0c, 0xfa, 0x13, 0xbb, 0xa7, 0x83, 0x84, 0x50, 0xf5, 0x89, 0xdd, 0x83, 0xed, 0xdf, 0x6b, 0x90, + 0xa6, 0xe8, 0x5b, 0xc8, 0xb5, 0x09, 0xa1, 0xfe, 0xc7, 0x10, 0xac, 0x6a, 0xcb, 0x06, 0x72, 0xf2, 0x2d, 0x54, 0x1c, + 0x51, 0x0c, 0x59, 0x9d, 0xc5, 0x26, 0xe6, 0x26, 0xfe, 0xad, 0x46, 0x1c, 0x5b, 0x0d, 0x5b, 0xc3, 0x78, 0xe6, 0x3a, + 0xce, 0x41, 0xad, 0x3e, 0x08, 0xb2, 0x9b, 0x6a, 0x1b, 0x66, 0x36, 0x70, 0x1d, 0x2b, 0x78, 0x66, 0x7b, 0xfd, 0xda, + 0x19, 0xad, 0xc4, 0x92, 0x1c, 0xa2, 0xf8, 0xeb, 0xf4, 0xc9, 0xba, 0x55, 0xdb, 0x90, 0x46, 0xd5, 0x64, 0x1e, 0xfb, + 0x96, 0x73, 0xf9, 0xd7, 0xb0, 0x7e, 0xf4, 0x53, 0x24, 0x4b, 0xca, 0x6b, 0x32, 0x84, 0x68, 0xc8, 0x2d, 0xd8, 0x46, + 0x7f, 0xd1, 0x9e, 0x6b, 0x2d, 0xda, 0x3e, 0x86, 0x31, 0x94, 0xe9, 0xb2, 0x85, 0x4f, 0x99, 0x0a, 0xa0, 0xf2, 0xc5, + 0xb4, 0x4a, 0xe1, 0x78, 0xdc, 0x55, 0x56, 0x68, 0xf4, 0xb6, 0x72, 0x0b, 0x08, 0x7f, 0xc3, 0xf1, 0x69, 0x8f, 0x20, + 0x2e, 0x01, 0xd4, 0x80, 0xd8, 0xe9, 0x3b, 0x01, 0xae, 0x96, 0x65, 0x70, 0xe5, 0x43, 0x72, 0x7f, 0x60, 0x78, 0xe8, + 0xa0, 0x0e, 0x4d, 0xc2, 0x6b, 0x3e, 0xee, 0x1e, 0x08, 0x92, 0x45, 0x93, 0x32, 0xc0, 0xca, 0xf9, 0xb5, 0x3f, 0xb8, + 0x12, 0x45, 0x81, 0xa4, 0x02, 0x71, 0x03, 0x45, 0xc9, 0xe3, 0x08, 0x17, 0x3f, 0x6d, 0xb7, 0x60, 0x2f, 0x2e, 0x06, + 0x1b, 0x50, 0x44, 0x30, 0xd9, 0x4c, 0x11, 0x8a, 0x43, 0xe4, 0x6a, 0x74, 0x0b, 0x6e, 0x09, 0x46, 0x74, 0xe3, 0x4a, + 0xcc, 0x84, 0x4d, 0x61, 0xd1, 0x26, 0xe0, 0xb1, 0x28, 0xf7, 0x95, 0x5a, 0x07, 0xbb, 0xa5, 0xd6, 0xd9, 0x2e, 0xa9, + 0x35, 0xb9, 0x53, 0xdd, 0x26, 0xfe, 0x52, 0xf1, 0xc8, 0x13, 0xcc, 0xb9, 0xea, 0x98, 0x57, 0x12, 0x75, 0xa3, 0xf7, + 0x95, 0x68, 0x55, 0x83, 0x46, 0x56, 0x82, 0x28, 0xfe, 0x56, 0x2e, 0x28, 0x42, 0xa1, 0xae, 0xca, 0xc6, 0x2f, 0x0a, + 0xd9, 0x38, 0xdd, 0x6a, 0x0a, 0x47, 0x1a, 0xc1, 0xfd, 0x2b, 0x4e, 0x6a, 0xf2, 0x76, 0x50, 0x38, 0xab, 0x15, 0x3d, + 0x55, 0xdc, 0xaf, 0x8a, 0x8b, 0x86, 0xe2, 0xd4, 0x27, 0x6e, 0x19, 0x65, 0xdf, 0xbe, 0x72, 0xd5, 0xc2, 0xfb, 0xaa, + 0x28, 0x07, 0xa9, 0x3b, 0x76, 0x59, 0x16, 0xab, 0xcb, 0xa6, 0xec, 0x7e, 0xa3, 0xbe, 0x56, 0x16, 0x89, 0xf4, 0x93, + 0x21, 0x04, 0x0b, 0x31, 0x7d, 0x45, 0xaf, 0x2d, 0x6d, 0x20, 0xb0, 0x93, 0x0d, 0x6e, 0x7d, 0xbb, 0xa5, 0xf3, 0x94, + 0x2f, 0xa1, 0xd0, 0xc2, 0xab, 0x32, 0x08, 0xc4, 0xef, 0xd5, 0xba, 0xe1, 0x94, 0xc7, 0x43, 0x9e, 0x9f, 0xef, 0x20, + 0x5e, 0xd4, 0x1c, 0x55, 0x91, 0x8f, 0x3b, 0xd3, 0x22, 0xf3, 0x5c, 0xac, 0x5a, 0x07, 0x4a, 0x42, 0x9c, 0x35, 0xf7, + 0x8c, 0x29, 0xcb, 0xe8, 0x79, 0x8d, 0x9e, 0xf8, 0x2e, 0x5f, 0x3a, 0xc9, 0x2a, 0xc2, 0xd8, 0xf6, 0x56, 0x96, 0xf8, + 0xe3, 0x4f, 0x4a, 0x97, 0x85, 0x9c, 0x13, 0x64, 0xc0, 0x65, 0x4d, 0x41, 0xdf, 0xc7, 0x50, 0x90, 0xac, 0x67, 0x7b, + 0xa9, 0x22, 0x7d, 0xe9, 0x3d, 0x76, 0xda, 0xfe, 0x8b, 0xe9, 0x61, 0x45, 0x28, 0xea, 0x75, 0xca, 0x22, 0xf3, 0x0d, + 0xfd, 0xc8, 0xe6, 0xab, 0xc5, 0x68, 0xad, 0xca, 0x56, 0x15, 0x91, 0x6b, 0x5d, 0xcc, 0xaa, 0x7e, 0x76, 0x3a, 0x9d, + 0x96, 0x05, 0x8d, 0x8e, 0x76, 0x88, 0xc2, 0xc2, 0xc7, 0x8e, 0xe3, 0x54, 0xfb, 0xbe, 0x1d, 0xed, 0x16, 0xca, 0x6d, + 0xbb, 0x8d, 0x3d, 0x46, 0xdc, 0xee, 0xc2, 0x5f, 0x1d, 0x1d, 0xb9, 0x5d, 0xec, 0xec, 0x92, 0x59, 0x44, 0x9f, 0x8c, + 0x21, 0x82, 0x8c, 0x2d, 0xd2, 0xde, 0x98, 0xa1, 0x0e, 0xc6, 0x56, 0x36, 0x34, 0x1a, 0x0e, 0x58, 0x33, 0x30, 0x15, + 0x71, 0xc5, 0xaa, 0x70, 0x34, 0x94, 0x87, 0xd7, 0x84, 0xf7, 0xe2, 0x23, 0xb8, 0x51, 0xd6, 0x75, 0x99, 0x36, 0x0e, + 0xab, 0xe3, 0xfc, 0xa5, 0x54, 0x4f, 0x83, 0x03, 0x70, 0x2d, 0x14, 0xda, 0x24, 0x9f, 0xc5, 0xbf, 0xa5, 0xfc, 0xff, + 0xc5, 0xf2, 0xae, 0x6c, 0x3f, 0xd2, 0x05, 0x89, 0x76, 0xb1, 0x5b, 0xa8, 0xd7, 0x4d, 0x6b, 0x40, 0x5a, 0x19, 0x4c, + 0x55, 0x05, 0x3a, 0x28, 0xe9, 0x4b, 0x09, 0x40, 0x1a, 0xc4, 0xef, 0xc8, 0x31, 0xc3, 0x14, 0x17, 0x22, 0xc4, 0x22, + 0x7d, 0x1d, 0x8c, 0xc1, 0x7c, 0xde, 0x45, 0xfd, 0x41, 0x69, 0x4d, 0x80, 0x36, 0xbe, 0x36, 0xb6, 0xbd, 0xc4, 0xfd, + 0x55, 0xbd, 0x96, 0x00, 0x0c, 0x28, 0x73, 0x61, 0x13, 0xa2, 0x21, 0x81, 0x56, 0x59, 0xdc, 0xd4, 0x4b, 0xf9, 0x56, + 0xd5, 0xb3, 0x89, 0x8e, 0x21, 0xb8, 0xe6, 0x2a, 0x04, 0x5b, 0x68, 0x0b, 0x60, 0xb0, 0x7c, 0xf9, 0xe1, 0xb3, 0x05, + 0x53, 0xac, 0xae, 0x47, 0x17, 0xa7, 0x1c, 0xd7, 0xaf, 0x85, 0x67, 0x67, 0x4a, 0xfb, 0x1f, 0xe5, 0x8b, 0x3f, 0x34, + 0x0a, 0xf4, 0x2e, 0x4a, 0x12, 0x3a, 0x6e, 0x2d, 0xee, 0x19, 0x7b, 0xd5, 0x5e, 0x04, 0xd1, 0xfe, 0x75, 0xfd, 0xbb, + 0xbd, 0xeb, 0xc2, 0x81, 0xb1, 0x77, 0x65, 0x38, 0x71, 0xc8, 0x72, 0x21, 0x1b, 0xfc, 0xa0, 0x08, 0x14, 0x55, 0xaf, + 0x63, 0x1d, 0x5b, 0x11, 0x97, 0x7f, 0xb1, 0x1a, 0x0c, 0x4f, 0xce, 0xee, 0x16, 0xa1, 0x76, 0xc3, 0x12, 0x48, 0xed, + 0x33, 0xd0, 0x5d, 0xdb, 0xd1, 0x35, 0xf4, 0xa1, 0x0d, 0xa2, 0xd9, 0x40, 0xff, 0xe5, 0xe2, 0x8d, 0xd5, 0xd5, 0xcf, + 0x40, 0x45, 0x7b, 0x33, 0xc3, 0x63, 0xef, 0xdc, 0xbf, 0x67, 0xc9, 0xb5, 0xa7, 0x6b, 0x98, 0xc1, 0x87, 0x0e, 0x3c, + 0x2c, 0xd3, 0x3c, 0x7d, 0x8f, 0x44, 0x11, 0x9a, 0xc8, 0xf5, 0xa6, 0x03, 0xc9, 0x71, 0xbd, 0xae, 0xe6, 0x7a, 0x87, + 0xf6, 0x51, 0x57, 0x3f, 0xfd, 0x46, 0xd3, 0x4e, 0x26, 0x6c, 0x9a, 0x9e, 0xe2, 0x15, 0xed, 0x04, 0xcf, 0x08, 0xfa, + 0xad, 0x69, 0xf6, 0x38, 0x4c, 0x2d, 0x57, 0x5b, 0xf3, 0x47, 0x4d, 0x9b, 0x06, 0x61, 0xd8, 0xd3, 0x1e, 0x4f, 0xbd, + 0xe9, 0xe1, 0xf4, 0x45, 0x9f, 0x17, 0xe7, 0xdf, 0x94, 0xaa, 0x9b, 0xf4, 0xaf, 0xa7, 0x34, 0x4b, 0xb3, 0x24, 0xfe, + 0xc4, 0xb8, 0xd9, 0x89, 0x26, 0x2f, 0x8f, 0xd5, 0xa6, 0x5e, 0xfd, 0x4b, 0x6e, 0x77, 0x34, 0x9e, 0x7a, 0x45, 0x75, + 0xec, 0xe3, 0x81, 0xec, 0xe4, 0xc9, 0x81, 0xe8, 0xfa, 0x89, 0x8a, 0x26, 0xd7, 0x6a, 0x42, 0x94, 0xab, 0xf3, 0x31, + 0xce, 0xc4, 0xf8, 0x4e, 0x20, 0x0e, 0xa3, 0x74, 0xd7, 0x85, 0x1e, 0xe8, 0xda, 0x64, 0xa0, 0xff, 0xe8, 0x7a, 0x5d, + 0xd3, 0x75, 0x8f, 0xec, 0xa3, 0xee, 0xd8, 0x31, 0x0f, 0xed, 0x43, 0xab, 0x6d, 0x1f, 0x99, 0x5d, 0xab, 0x6b, 0x76, + 0xff, 0xd6, 0x1d, 0x5b, 0x87, 0xf6, 0xa1, 0xe9, 0x58, 0x5d, 0x28, 0xb4, 0xba, 0x56, 0xf7, 0xc6, 0x3a, 0xec, 0x8e, + 0x1d, 0x2c, 0xf5, 0xec, 0x4e, 0xc7, 0x72, 0x1d, 0xbb, 0xd3, 0x31, 0x3b, 0xf6, 0xd1, 0x91, 0xe5, 0xb6, 0xed, 0xa3, + 0xa3, 0xf3, 0x4e, 0xd7, 0x6e, 0xc3, 0xbb, 0x76, 0x7b, 0xdc, 0xb6, 0x5d, 0xd7, 0x82, 0xbf, 0xcc, 0xae, 0xed, 0xd1, + 0x0f, 0xd7, 0xb5, 0xdb, 0xae, 0xe9, 0x84, 0x1d, 0xcf, 0x3e, 0x7a, 0x61, 0xe2, 0xdf, 0x58, 0xcd, 0xc4, 0xbf, 0x00, + 0x8c, 0xf9, 0xc2, 0xf6, 0x8e, 0xe8, 0x17, 0x02, 0xbc, 0x39, 0xec, 0xfe, 0xaa, 0x1f, 0x6c, 0x1c, 0x83, 0x4b, 0x63, + 0xe8, 0x76, 0xec, 0x76, 0xdb, 0x3c, 0x74, 0xed, 0x6e, 0x7b, 0x6e, 0x1d, 0x7a, 0xf6, 0xd1, 0xf1, 0xd8, 0x72, 0xed, + 0xe3, 0x63, 0xd3, 0xb1, 0xda, 0xb6, 0x67, 0xba, 0xf6, 0x61, 0x1b, 0x7f, 0xb4, 0x6d, 0xef, 0xe6, 0xf8, 0x85, 0x7d, + 0xd4, 0x99, 0x1f, 0xd9, 0x87, 0x1f, 0x0f, 0xbb, 0xb6, 0xd7, 0x9e, 0xb7, 0x8f, 0x6c, 0xef, 0xf8, 0xe6, 0xc8, 0x3e, + 0x9c, 0x5b, 0xde, 0xd1, 0xd6, 0x96, 0xae, 0x67, 0x03, 0x8e, 0xf0, 0x35, 0xbc, 0x30, 0xf9, 0x0b, 0xf8, 0x33, 0xc7, + 0xb6, 0xff, 0x45, 0x30, 0x69, 0xbd, 0xe9, 0x0b, 0xbb, 0x7b, 0x3c, 0xa6, 0xea, 0x50, 0x60, 0x89, 0x1a, 0xd0, 0xe4, + 0xc6, 0xa2, 0xcf, 0x22, 0x38, 0x4b, 0x00, 0x12, 0x7f, 0xf8, 0xc7, 0x6e, 0x2c, 0xf8, 0x30, 0x7d, 0xf7, 0x7f, 0x0a, + 0x47, 0x4e, 0x39, 0x64, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x49, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x45, 0xc5, 0xfb, 0xdd, + 0x8a, 0x8a, 0x37, 0xab, 0x7d, 0x14, 0x15, 0xef, 0xbf, 0xba, 0xa2, 0xe2, 0xbc, 0x6a, 0x27, 0xff, 0xbe, 0x1a, 0x9b, + 0xfe, 0xd7, 0x75, 0xf5, 0x1a, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x44, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, + 0x4a, 0x46, 0x60, 0x31, 0xd0, 0xd8, 0xf7, 0x31, 0xd1, 0xd8, 0xdf, 0x57, 0x03, 0xb0, 0x3c, 0xe1, 0x7c, 0x49, 0x30, + 0xb1, 0xe6, 0x7e, 0x38, 0x95, 0x3c, 0x0d, 0x94, 0xf4, 0xb1, 0x18, 0xbc, 0x12, 0xe0, 0xb8, 0x06, 0x75, 0xd8, 0x6a, + 0x11, 0xa5, 0xbd, 0x23, 0x07, 0x0e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xc6, 0xb6, 0x88, 0x47, 0x75, 0xcd, 0xbd, 0x26, + 0x36, 0xbe, 0x47, 0xa3, 0xc0, 0x66, 0xe8, 0x6e, 0x1d, 0xae, 0x06, 0xd6, 0x36, 0xc2, 0x68, 0x12, 0xd8, 0xb9, 0xa6, + 0xf7, 0x65, 0xd3, 0xbc, 0x8a, 0x31, 0xe6, 0xe6, 0x9e, 0x42, 0x4f, 0xaa, 0xed, 0xdd, 0xb2, 0x69, 0xdf, 0xae, 0x61, + 0x36, 0x7c, 0xbe, 0xd4, 0x7c, 0x8b, 0x5d, 0xa1, 0x04, 0x5c, 0x45, 0x55, 0x25, 0xb3, 0x5a, 0x23, 0x42, 0x0a, 0xee, + 0xbe, 0x30, 0x3e, 0x2c, 0x58, 0x4b, 0x47, 0x43, 0x7e, 0xc7, 0x51, 0xde, 0x95, 0x60, 0xaa, 0x06, 0x8b, 0xcf, 0xd6, + 0xc8, 0x71, 0x07, 0xbf, 0x03, 0xeb, 0xc8, 0x39, 0x9e, 0x51, 0xac, 0xe2, 0x79, 0xad, 0xc0, 0xa5, 0xcb, 0x4c, 0x3e, + 0x77, 0xd7, 0x75, 0xe6, 0x71, 0xa3, 0xa9, 0xb2, 0xcb, 0x16, 0x82, 0x0b, 0xc2, 0xcf, 0x93, 0x61, 0x70, 0x4e, 0xc6, + 0xdb, 0x68, 0xfb, 0xbc, 0x0d, 0x98, 0xa8, 0xf7, 0x18, 0x16, 0xb1, 0xc9, 0x1f, 0xd4, 0xb8, 0x00, 0xeb, 0x29, 0x64, + 0xc1, 0xee, 0x21, 0x9b, 0xa6, 0xf0, 0xa8, 0x1e, 0x5a, 0x31, 0xf7, 0xb7, 0x18, 0xd8, 0xa8, 0x80, 0x39, 0x10, 0xb4, + 0x86, 0xde, 0x66, 0x93, 0x23, 0x9d, 0x47, 0xd6, 0x25, 0x15, 0xb5, 0xdb, 0x39, 0x36, 0xdd, 0x23, 0xd3, 0x3e, 0xee, + 0x18, 0xb9, 0xd8, 0x70, 0x2a, 0xc8, 0x12, 0x42, 0xc0, 0x28, 0x5a, 0x76, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc3, 0x1c, + 0xf8, 0xe3, 0xf2, 0xad, 0xe2, 0x9f, 0xab, 0x34, 0x83, 0x31, 0x0a, 0xa6, 0x17, 0x0d, 0xc2, 0xad, 0x11, 0xcb, 0x6e, + 0x19, 0x8b, 0x36, 0x28, 0xcb, 0xab, 0xf6, 0xe5, 0x7f, 0x9e, 0xb5, 0x6d, 0x4e, 0x96, 0x2c, 0xa3, 0x2c, 0xe2, 0xeb, + 0x43, 0x18, 0x43, 0xe7, 0x43, 0xf3, 0xa7, 0x4d, 0x04, 0xf7, 0x9f, 0xbb, 0x09, 0x6e, 0xc6, 0xf6, 0x21, 0xb8, 0xff, + 0xfc, 0xea, 0x04, 0xf7, 0x27, 0x95, 0xe0, 0x96, 0x7c, 0x81, 0x0a, 0xa9, 0xf3, 0x07, 0x7c, 0x6e, 0x41, 0x50, 0xe7, + 0xe7, 0xfa, 0x01, 0x31, 0xf0, 0xba, 0x92, 0x6c, 0xf7, 0x63, 0x29, 0x7b, 0x10, 0x0a, 0x45, 0x30, 0x08, 0x2d, 0x65, + 0x2a, 0x81, 0x44, 0xb4, 0x32, 0xa5, 0x3a, 0xc0, 0x7c, 0x1b, 0x65, 0xa1, 0xfd, 0x9e, 0x5f, 0xfc, 0x40, 0xc9, 0xf3, + 0x26, 0x4e, 0x16, 0x3e, 0x06, 0xe0, 0xd3, 0x31, 0xeb, 0x20, 0x3c, 0x38, 0xe0, 0x7f, 0x36, 0x8e, 0xa3, 0x89, 0xd4, + 0x54, 0xb0, 0xc1, 0x25, 0x71, 0xdc, 0xfa, 0x3d, 0xf3, 0x13, 0xdd, 0xa4, 0xd7, 0x30, 0xb9, 0xcf, 0xda, 0xce, 0x33, + 0xef, 0xf0, 0xd9, 0x91, 0x03, 0xff, 0xbb, 0xac, 0x9d, 0x9b, 0xbc, 0xe2, 0x22, 0x8e, 0x20, 0xf1, 0x89, 0xa8, 0xb9, + 0xa9, 0xda, 0x2d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd, 0x95, 0x26, 0xfe, 0x7d, 0x51, 0xa7, 0xb1, 0xc6, 0x3c, 0x5e, + 0x29, 0xdd, 0x6a, 0xe8, 0x4d, 0x10, 0xad, 0x40, 0xf6, 0xa6, 0xd4, 0x50, 0x5f, 0xf3, 0xe1, 0x16, 0xe3, 0x62, 0xed, + 0xfc, 0xaa, 0xc8, 0xae, 0x24, 0xb2, 0xbc, 0xec, 0xc4, 0x20, 0x57, 0x5b, 0x38, 0x18, 0x9b, 0x1d, 0xf3, 0x0b, 0x69, + 0x90, 0xdb, 0x50, 0x4c, 0x90, 0x4f, 0x13, 0x94, 0x25, 0xab, 0x68, 0xdc, 0xc2, 0x9f, 0xfe, 0x28, 0x6d, 0x05, 0x07, + 0x10, 0x9d, 0x15, 0x3f, 0x6c, 0xe0, 0xac, 0xf9, 0xa7, 0x4e, 0x91, 0x8a, 0x22, 0x15, 0xb3, 0xe2, 0x3f, 0xcb, 0xcc, + 0x84, 0x12, 0xd8, 0xe2, 0xd4, 0x5a, 0x03, 0xff, 0x99, 0x6c, 0xf8, 0x2c, 0x33, 0x21, 0x89, 0x2c, 0x4c, 0xf7, 0xd3, + 0xa7, 0x54, 0x0b, 0xd2, 0x3a, 0xd2, 0xb0, 0xce, 0xc6, 0x45, 0x78, 0x37, 0xcd, 0x9f, 0xc5, 0x14, 0xe1, 0xad, 0x37, + 0x36, 0xe3, 0xe7, 0xcf, 0x4f, 0x07, 0xae, 0xc1, 0x93, 0x92, 0x96, 0x32, 0x68, 0x9d, 0xef, 0x67, 0x7c, 0x60, 0x34, + 0xba, 0xc5, 0x2d, 0xe1, 0xce, 0xe4, 0x08, 0x13, 0x65, 0x4e, 0xbd, 0x20, 0xa3, 0x05, 0x29, 0x19, 0x7d, 0x61, 0x04, + 0x20, 0xea, 0xc8, 0x5b, 0x57, 0xdb, 0x76, 0x6c, 0x47, 0x97, 0x0d, 0xa7, 0xc1, 0x6c, 0xb0, 0x8e, 0x33, 0x1f, 0x72, + 0x03, 0x85, 0xf1, 0x0c, 0x7c, 0x6b, 0xb2, 0x20, 0x0b, 0x21, 0xd1, 0x0c, 0x38, 0xd9, 0x2c, 0xe8, 0x5e, 0x9e, 0x73, + 0x8b, 0x67, 0x3f, 0xf9, 0x84, 0xc9, 0x06, 0x85, 0x5b, 0x1d, 0x46, 0x1c, 0xfa, 0x11, 0x0e, 0xc3, 0x96, 0xde, 0x82, + 0x54, 0x97, 0x2c, 0x49, 0x2d, 0xd5, 0x83, 0xa0, 0xa7, 0x41, 0x1b, 0x48, 0x43, 0x8f, 0x00, 0xa6, 0x89, 0xbf, 0x80, + 0x98, 0xec, 0xeb, 0xdc, 0xe4, 0x94, 0x56, 0xe7, 0xa4, 0x56, 0x73, 0x5f, 0x1c, 0x99, 0x9a, 0xe7, 0x9a, 0x9a, 0x03, + 0xe4, 0x56, 0xcf, 0xcd, 0x75, 0x7e, 0xd5, 0xdf, 0xa5, 0x04, 0x25, 0xfa, 0xf2, 0x98, 0xc6, 0x41, 0xea, 0x4f, 0x2e, + 0x5e, 0xce, 0x28, 0x80, 0x64, 0x4b, 0x89, 0x96, 0x1e, 0x90, 0x22, 0xe4, 0x82, 0xdd, 0x65, 0x06, 0x26, 0x62, 0xe1, + 0x55, 0x02, 0x63, 0x8d, 0xce, 0x7f, 0x41, 0xa4, 0x05, 0x9f, 0x3f, 0xb7, 0x02, 0x70, 0x70, 0x18, 0x28, 0xf8, 0x81, + 0x67, 0xa3, 0x84, 0xb0, 0xa0, 0x50, 0xdd, 0x21, 0xb2, 0xc0, 0xfb, 0x08, 0xfe, 0x2d, 0x8a, 0xc5, 0x0f, 0xae, 0x3a, + 0xb5, 0x43, 0x3f, 0x9a, 0x01, 0x49, 0xf3, 0xa3, 0x59, 0xcd, 0x44, 0x83, 0xfc, 0x17, 0x2b, 0xa5, 0x05, 0xa8, 0xc2, + 0x7c, 0x22, 0xfd, 0xfe, 0xfe, 0x82, 0x12, 0x4d, 0x41, 0x52, 0x73, 0x7f, 0x82, 0xce, 0x76, 0x85, 0x76, 0xe7, 0xf9, + 0xe0, 0xdb, 0x93, 0x05, 0xcb, 0x7c, 0x12, 0x0d, 0xc3, 0xe5, 0x17, 0xd8, 0x01, 0x6d, 0x2c, 0x92, 0xc4, 0x52, 0x32, + 0xf9, 0x09, 0xbb, 0x09, 0xc6, 0xfc, 0x5e, 0x6a, 0x6a, 0xfc, 0x9c, 0xb2, 0xd0, 0x0a, 0x6c, 0xe0, 0x9a, 0x64, 0x84, + 0x3c, 0xf6, 0x31, 0xcc, 0xe4, 0x20, 0x8a, 0xf5, 0xd3, 0x6f, 0xa5, 0xbf, 0xd6, 0xa6, 0x49, 0x80, 0x6c, 0x8f, 0x97, + 0x09, 0x0b, 0xff, 0x35, 0xf8, 0x16, 0x0e, 0xee, 0x6f, 0xaf, 0x74, 0xa3, 0x9f, 0xd9, 0xf3, 0x84, 0x4d, 0x07, 0xdf, + 0x36, 0x64, 0x3d, 0xc4, 0xeb, 0x3d, 0xf5, 0x45, 0x6f, 0x7b, 0x45, 0x70, 0xa0, 0xf6, 0x5e, 0x97, 0xfa, 0x53, 0x7e, + 0x5b, 0x87, 0x1b, 0xe0, 0xba, 0x74, 0xc7, 0x76, 0xfb, 0x78, 0x7f, 0x1e, 0x85, 0xfe, 0xf8, 0x53, 0x9f, 0xde, 0x94, + 0x1e, 0x2c, 0x38, 0xad, 0xc7, 0xfe, 0xb2, 0x87, 0xc7, 0xab, 0x5a, 0x08, 0xee, 0x9a, 0x54, 0x2a, 0x39, 0xbb, 0xc6, + 0xb5, 0x8c, 0x4b, 0x79, 0x8d, 0x5f, 0xc6, 0x4f, 0xdd, 0xce, 0x83, 0x8c, 0x89, 0x4f, 0xe1, 0x43, 0x9e, 0x8b, 0x8b, + 0x3a, 0x5d, 0x51, 0xf1, 0x62, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, + 0x74, 0xbb, 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, + 0x3f, 0xba, 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xad, 0xe0, 0x02, 0x44, 0xf7, 0x9d, 0x6f, 0x4b, 0x54, + 0x40, 0xf9, 0x2d, 0xf5, 0x34, 0x66, 0xe9, 0x78, 0x6b, 0xd0, 0xf5, 0x00, 0xc9, 0xd0, 0x4d, 0x11, 0x04, 0x32, 0xea, + 0xb7, 0x20, 0x0d, 0x3b, 0x26, 0x10, 0x10, 0x26, 0x2f, 0xc2, 0x2f, 0x55, 0x84, 0xd2, 0x6f, 0xdc, 0x46, 0xbc, 0x4d, + 0x73, 0xc0, 0x75, 0x91, 0x99, 0x8a, 0x94, 0x43, 0xbf, 0x2c, 0x31, 0x88, 0x91, 0x08, 0x11, 0xaf, 0x50, 0xa5, 0x22, + 0x3b, 0x62, 0xbe, 0xbb, 0xe3, 0xe8, 0x99, 0xcb, 0x64, 0x76, 0x9e, 0xaf, 0x0a, 0x9b, 0x2b, 0x8c, 0x24, 0xf4, 0x3f, + 0x0a, 0x07, 0x93, 0xd2, 0x12, 0x1c, 0x11, 0xcd, 0x75, 0x12, 0x24, 0xb2, 0x7b, 0x0a, 0x89, 0x76, 0x9b, 0x23, 0xd5, + 0x1b, 0x90, 0xc6, 0xe4, 0x2d, 0x70, 0xc9, 0x37, 0x7e, 0xa8, 0x18, 0xb7, 0x28, 0x2d, 0x1f, 0x49, 0xca, 0xff, 0xf4, + 0x69, 0xd1, 0x39, 0xab, 0xd2, 0xef, 0x13, 0xb7, 0x03, 0xc7, 0x6e, 0x87, 0xb5, 0xb7, 0xda, 0x59, 0xed, 0x0e, 0x07, + 0x5c, 0x84, 0x0b, 0x15, 0xb6, 0x14, 0x42, 0x8b, 0xbb, 0xd1, 0xd8, 0xab, 0xa6, 0xc3, 0x85, 0x40, 0xca, 0x95, 0xab, + 0x8e, 0x6e, 0xf4, 0x23, 0xa1, 0x92, 0x8c, 0xb6, 0x84, 0x40, 0xe6, 0x77, 0x31, 0x1d, 0x50, 0xb3, 0x65, 0x1c, 0x3b, + 0x9c, 0x46, 0xff, 0xd7, 0x83, 0x40, 0x07, 0x2e, 0xd0, 0xa1, 0x56, 0x76, 0x6b, 0xc9, 0xa1, 0x47, 0x9e, 0xab, 0x74, + 0xa0, 0xb2, 0xf4, 0x4c, 0x87, 0x22, 0xc8, 0x6f, 0x85, 0x29, 0xed, 0xa4, 0x01, 0x99, 0x3c, 0x2d, 0x8a, 0x02, 0x33, + 0x80, 0x18, 0xe0, 0x2d, 0xe1, 0x4c, 0x66, 0x3c, 0x7d, 0xba, 0xf1, 0x10, 0x22, 0x85, 0xbd, 0x9a, 0xd9, 0x53, 0x57, + 0xe9, 0x9b, 0xae, 0x92, 0x18, 0x09, 0x17, 0xa9, 0x86, 0xb0, 0x7b, 0xa3, 0xb5, 0x87, 0x3f, 0x47, 0xcc, 0xcf, 0x6c, + 0xae, 0x69, 0x6a, 0x29, 0x87, 0xbb, 0xe9, 0xb2, 0x36, 0x58, 0xbc, 0xf1, 0x58, 0x67, 0x3c, 0x96, 0xe0, 0x93, 0xf5, + 0xc7, 0x15, 0xf7, 0xf4, 0x06, 0x18, 0x9f, 0x9d, 0x22, 0x3c, 0xcd, 0xbb, 0xcc, 0xa7, 0x18, 0x26, 0xea, 0x91, 0x1b, + 0x67, 0xbe, 0xc8, 0x23, 0x03, 0x7c, 0x79, 0xbf, 0x51, 0x25, 0xab, 0x78, 0x83, 0x9f, 0xbe, 0xbb, 0xf8, 0x4e, 0xe3, + 0xeb, 0x9f, 0x34, 0x88, 0x78, 0x91, 0xa1, 0xac, 0x07, 0x03, 0xca, 0x7a, 0xa0, 0xf1, 0x34, 0x22, 0x90, 0x3b, 0x20, + 0x3f, 0x20, 0x0c, 0xa2, 0x00, 0x9a, 0xf4, 0xaa, 0x8b, 0x55, 0x98, 0x05, 0x4b, 0x3f, 0xc9, 0x0e, 0xa0, 0xa9, 0x05, + 0x44, 0x4e, 0xdf, 0xe4, 0x23, 0x4e, 0xaa, 0x59, 0x11, 0x62, 0x2f, 0x8b, 0x84, 0x6e, 0x76, 0x1a, 0x84, 0x52, 0x35, + 0x2b, 0x3e, 0xe0, 0x8f, 0xc7, 0x6c, 0x99, 0x0d, 0x74, 0x7f, 0x09, 0xd9, 0x2f, 0x30, 0x9e, 0xf5, 0x41, 0x3c, 0xce, + 0x58, 0x66, 0xa5, 0x59, 0xc2, 0xfc, 0x85, 0x2e, 0x43, 0xb9, 0xd6, 0xe1, 0xa5, 0xab, 0xd1, 0x22, 0xc8, 0x64, 0x2c, + 0x44, 0x1a, 0x20, 0x28, 0x49, 0xa1, 0x8b, 0xa7, 0xc3, 0x9c, 0xa3, 0xf0, 0x3c, 0x9e, 0x55, 0x56, 0x54, 0xc1, 0xb9, + 0x9c, 0x61, 0xa4, 0x5d, 0x9e, 0xf1, 0x60, 0x82, 0x3e, 0x4f, 0xd7, 0xdc, 0xaf, 0x5d, 0x86, 0x6c, 0xd4, 0x4f, 0x4f, + 0xf8, 0xf5, 0x56, 0xc3, 0x50, 0x0c, 0x7a, 0xc7, 0x81, 0x58, 0xc2, 0x9b, 0x3c, 0xde, 0x0f, 0x78, 0x65, 0x38, 0x9a, + 0x08, 0x32, 0xc6, 0x79, 0xa7, 0xbe, 0x5c, 0x00, 0x23, 0x54, 0x52, 0xa2, 0xcf, 0xdd, 0x53, 0xe9, 0x62, 0x85, 0xbd, + 0x42, 0x5e, 0xe9, 0xf3, 0xe7, 0x97, 0xc3, 0xff, 0xfc, 0x1b, 0x82, 0xd1, 0xcf, 0x5d, 0xe1, 0x67, 0x7e, 0xa9, 0xd6, + 0xe2, 0xdc, 0xa7, 0x39, 0x44, 0x03, 0x0a, 0x36, 0x11, 0x81, 0x57, 0xc4, 0xd2, 0xca, 0x87, 0x57, 0x22, 0x98, 0x16, + 0x24, 0x9c, 0x30, 0x84, 0x37, 0xfc, 0x10, 0xa6, 0x77, 0x28, 0x82, 0x30, 0x68, 0xbf, 0xdd, 0x7d, 0x7f, 0x0c, 0xc1, + 0x96, 0x6b, 0x79, 0x20, 0x94, 0x0e, 0xe2, 0x1a, 0x3a, 0x3d, 0xf1, 0x35, 0x64, 0x5a, 0x90, 0xfd, 0x48, 0x7b, 0x07, + 0x30, 0xcc, 0x79, 0xbc, 0x60, 0x76, 0x10, 0x1f, 0xdc, 0xb2, 0x91, 0xe5, 0x2f, 0x03, 0xd2, 0xd5, 0xa3, 0xdc, 0x4d, + 0x23, 0xce, 0x4f, 0xaa, 0xc0, 0x89, 0xbf, 0xce, 0x0b, 0x54, 0xc6, 0xe5, 0xe8, 0x69, 0x1d, 0xaf, 0x50, 0xdc, 0x81, + 0x4f, 0xb3, 0x82, 0xc7, 0xf8, 0xf4, 0xe4, 0xc0, 0x3f, 0x2d, 0x87, 0x6f, 0xb4, 0x45, 0x02, 0x81, 0xf2, 0x21, 0x70, + 0x46, 0x51, 0x18, 0x45, 0xc0, 0xc5, 0xe2, 0xc1, 0x8a, 0xa7, 0x53, 0x35, 0xe4, 0xa2, 0x5d, 0xee, 0x9e, 0x44, 0x5a, + 0xb1, 0xa4, 0xe3, 0x25, 0x7d, 0xa9, 0xfe, 0x09, 0xf9, 0x13, 0x92, 0x27, 0xf3, 0xe8, 0x9c, 0xb0, 0xdd, 0x6b, 0xa1, + 0x1b, 0x25, 0xc6, 0x1e, 0x53, 0x25, 0x4e, 0x47, 0xaa, 0x81, 0xc2, 0x37, 0x70, 0x2e, 0x8f, 0x06, 0x03, 0x22, 0x73, + 0x55, 0x6a, 0x07, 0x48, 0x6c, 0x48, 0xa6, 0x00, 0x83, 0xcd, 0xa0, 0xa1, 0x45, 0x2e, 0x74, 0xd8, 0xa8, 0x3a, 0x9c, + 0x7a, 0x1f, 0x0f, 0x7c, 0xb1, 0xfc, 0x4a, 0x0b, 0x14, 0x16, 0x1e, 0x9f, 0x77, 0xa0, 0xef, 0x02, 0x4e, 0x85, 0xcc, + 0x6b, 0x7f, 0x25, 0x8a, 0x6e, 0x85, 0xfe, 0x7d, 0xac, 0x98, 0x36, 0xf0, 0x28, 0x07, 0xe7, 0x58, 0x7a, 0x21, 0xbc, + 0x0b, 0x6b, 0x1b, 0x4d, 0x06, 0xa4, 0xaf, 0x6f, 0x36, 0x35, 0x82, 0xfc, 0xae, 0xbd, 0xa6, 0xd6, 0x2d, 0x0f, 0x06, + 0x89, 0x67, 0x5e, 0xec, 0xc3, 0xd2, 0x4b, 0x24, 0x0b, 0xf9, 0xc9, 0x01, 0x8c, 0x0f, 0x22, 0x33, 0x94, 0x18, 0xa7, + 0xc0, 0x80, 0xf0, 0x0f, 0x7e, 0x4a, 0xe6, 0x19, 0x6f, 0x27, 0x82, 0xe7, 0xc3, 0x8b, 0xa5, 0x8c, 0x0d, 0x5b, 0xaa, + 0x52, 0xe7, 0x65, 0x9c, 0x66, 0x26, 0x70, 0x77, 0x02, 0x87, 0xdf, 0x57, 0x98, 0xbd, 0x21, 0xef, 0x67, 0x4c, 0x38, + 0x3e, 0x9f, 0x67, 0x1b, 0x7c, 0xa3, 0x37, 0x55, 0x21, 0x7e, 0x76, 0x4b, 0x85, 0x62, 0x1d, 0x6f, 0xab, 0x55, 0x70, + 0x4e, 0xb2, 0xda, 0xd2, 0x6f, 0xe9, 0x8f, 0x71, 0xc5, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0x3b, 0xcf, 0x06, 0x50, 0x55, + 0xc8, 0xe2, 0xfd, 0xe5, 0x92, 0x2a, 0x1b, 0xfd, 0x93, 0x03, 0xba, 0x96, 0x9e, 0xd2, 0x0a, 0x3b, 0x3d, 0x01, 0xf3, + 0x4e, 0x9a, 0x74, 0x7f, 0xb9, 0xe4, 0x53, 0x4a, 0xbf, 0xe8, 0xcd, 0xc1, 0x3c, 0x5b, 0x84, 0xa7, 0xff, 0x07, 0xc0, + 0xb1, 0x34, 0x8b, 0x20, 0x5c, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 08b8ab837a2b6da234691cbd750625eea9fe38c0 Mon Sep 17 00:00:00 2001 From: Colm Date: Thu, 11 Jul 2024 05:10:58 +0100 Subject: [PATCH 007/164] Add braces to if statement to avoid compiler warning. (#7036) --- esphome/components/aht10/aht10.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/aht10/aht10.cpp b/esphome/components/aht10/aht10.cpp index 332218b9e9..441c1ac9df 100644 --- a/esphome/components/aht10/aht10.cpp +++ b/esphome/components/aht10/aht10.cpp @@ -93,8 +93,9 @@ void AHT10Component::restart_read_() { void AHT10Component::read_data_() { uint8_t data[6]; - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Read attempt %d at %ums", this->read_count_, (unsigned) (millis() - this->start_time_)); + } if (this->read(data, 6) != i2c::ERROR_OK) { this->status_set_warning("AHT10 read failed, retrying soon"); this->restart_read_(); @@ -119,8 +120,9 @@ void AHT10Component::read_data_() { return; } } - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Success at %ums", (unsigned) (millis() - this->start_time_)); + } uint32_t raw_temperature = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]; uint32_t raw_humidity = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4; From 6e624ff7974311bc22058466f0688d554a340b1f Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 10 Jul 2024 23:21:24 -0500 Subject: [PATCH 008/164] [wifi] Fix EAP for IDF 5.1+, add test (#7061) --- esphome/components/wifi/wifi_component.h | 4 ++ .../wifi/wifi_component_esp_idf.cpp | 48 ++++++++++++++++--- tests/components/wifi/common-eap.yaml | 7 +++ tests/components/wifi/test-eap.esp32-ard.yaml | 8 +--- tests/components/wifi/test-eap.esp32-idf.yaml | 1 + 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 tests/components/wifi/common-eap.yaml create mode 100644 tests/components/wifi/test-eap.esp32-idf.yaml diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 0b077819ae..d79cde0b18 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -20,8 +20,12 @@ #endif #if defined(USE_ESP_IDF) && defined(USE_WIFI_WPA2_EAP) +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) +#include +#else #include #endif +#endif #ifdef USE_ESP8266 #include diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index 96fa837767..a8d67ed44d 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -15,8 +15,12 @@ #include #include #ifdef USE_WIFI_WPA2_EAP +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) +#include +#else #include #endif +#endif #ifdef USE_WIFI_AP #include "dhcpserver/dhcpserver.h" @@ -364,48 +368,78 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { if (ap.get_eap().has_value()) { // note: all certificates and keys have to be null terminated. Lengths are appended by +1 to include \0. EAPAuth eap = ap.get_eap().value(); +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_identity((uint8_t *) eap.identity.c_str(), eap.identity.length()); +#else err = esp_wifi_sta_wpa2_ent_set_identity((uint8_t *) eap.identity.c_str(), eap.identity.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_identity failed! %d", err); + ESP_LOGV(TAG, "set_identity failed %d", err); } int ca_cert_len = strlen(eap.ca_cert); int client_cert_len = strlen(eap.client_cert); int client_key_len = strlen(eap.client_key); if (ca_cert_len) { +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_ca_cert((uint8_t *) eap.ca_cert, ca_cert_len + 1); +#else err = esp_wifi_sta_wpa2_ent_set_ca_cert((uint8_t *) eap.ca_cert, ca_cert_len + 1); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_ca_cert failed! %d", err); + ESP_LOGV(TAG, "set_ca_cert failed %d", err); } } // workout what type of EAP this is // validation is not required as the config tool has already validated it if (client_cert_len && client_key_len) { // if we have certs, this must be EAP-TLS +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_certificate_and_key((uint8_t *) eap.client_cert, client_cert_len + 1, + (uint8_t *) eap.client_key, client_key_len + 1, + (uint8_t *) eap.password.c_str(), strlen(eap.password.c_str())); +#else err = esp_wifi_sta_wpa2_ent_set_cert_key((uint8_t *) eap.client_cert, client_cert_len + 1, (uint8_t *) eap.client_key, client_key_len + 1, (uint8_t *) eap.password.c_str(), strlen(eap.password.c_str())); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_cert_key failed! %d", err); + ESP_LOGV(TAG, "set_cert_key failed %d", err); } } else { // in the absence of certs, assume this is username/password based +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_username((uint8_t *) eap.username.c_str(), eap.username.length()); +#else err = esp_wifi_sta_wpa2_ent_set_username((uint8_t *) eap.username.c_str(), eap.username.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_username failed! %d", err); + ESP_LOGV(TAG, "set_username failed %d", err); } +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_password((uint8_t *) eap.password.c_str(), eap.password.length()); +#else err = esp_wifi_sta_wpa2_ent_set_password((uint8_t *) eap.password.c_str(), eap.password.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_password failed! %d", err); + ESP_LOGV(TAG, "set_password failed %d", err); } // set TTLS Phase 2, defaults to MSCHAPV2 +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_ttls_phase2_method(eap.ttls_phase_2); +#else err = esp_wifi_sta_wpa2_ent_set_ttls_phase2_method(eap.ttls_phase_2); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_ttls_phase2_method failed! %d", err); + ESP_LOGV(TAG, "set_ttls_phase2_method failed %d", err); } } +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_wifi_sta_enterprise_enable(); +#else err = esp_wifi_sta_wpa2_ent_enable(); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_enable failed! %d", err); + ESP_LOGV(TAG, "enterprise_enable failed %d", err); } } #endif // USE_WIFI_WPA2_EAP diff --git a/tests/components/wifi/common-eap.yaml b/tests/components/wifi/common-eap.yaml new file mode 100644 index 0000000000..779cd6b49a --- /dev/null +++ b/tests/components/wifi/common-eap.yaml @@ -0,0 +1,7 @@ +wifi: + networks: + - ssid: MySSID + eap: + username: username + password: password + identity: identity diff --git a/tests/components/wifi/test-eap.esp32-ard.yaml b/tests/components/wifi/test-eap.esp32-ard.yaml index 779cd6b49a..9177e5de10 100644 --- a/tests/components/wifi/test-eap.esp32-ard.yaml +++ b/tests/components/wifi/test-eap.esp32-ard.yaml @@ -1,7 +1 @@ -wifi: - networks: - - ssid: MySSID - eap: - username: username - password: password - identity: identity +<<: !include common-eap.yaml diff --git a/tests/components/wifi/test-eap.esp32-idf.yaml b/tests/components/wifi/test-eap.esp32-idf.yaml new file mode 100644 index 0000000000..9177e5de10 --- /dev/null +++ b/tests/components/wifi/test-eap.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-eap.yaml From 5ac875545fe14fa1d818336efb392f48f61b3fc1 Mon Sep 17 00:00:00 2001 From: ttaborda <80131527+ttaborda@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:26:37 +0100 Subject: [PATCH 009/164] Update mitsubishi.cpp (#6909) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/mitsubishi/mitsubishi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/mitsubishi/mitsubishi.cpp b/esphome/components/mitsubishi/mitsubishi.cpp index fd57adc586..a02aabf14d 100644 --- a/esphome/components/mitsubishi/mitsubishi.cpp +++ b/esphome/components/mitsubishi/mitsubishi.cpp @@ -52,6 +52,7 @@ const uint8_t MITSUBISHI_BYTE16 = 0X00; climate::ClimateTraits MitsubishiClimate::traits() { auto traits = climate::ClimateTraits(); + traits.set_supports_current_temperature(this->sensor_ != nullptr); traits.set_supports_action(false); traits.set_visual_min_temperature(MITSUBISHI_TEMP_MIN); traits.set_visual_max_temperature(MITSUBISHI_TEMP_MAX); From 66b36afe90431b89b8e7c26c782be2431f2e7890 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:23:29 +0300 Subject: [PATCH 010/164] [climate] fix dump output of unsupported features (#7005) --- esphome/components/climate/climate.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/esphome/components/climate/climate.cpp b/esphome/components/climate/climate.cpp index 1822707152..bc8d932089 100644 --- a/esphome/components/climate/climate.cpp +++ b/esphome/components/climate/climate.cpp @@ -574,21 +574,25 @@ void Climate::dump_traits_(const char *tag) { ESP_LOGCONFIG(tag, " - Max temperature: %.1f", traits.get_visual_max_temperature()); ESP_LOGCONFIG(tag, " - Temperature step:"); ESP_LOGCONFIG(tag, " Target: %.1f", traits.get_visual_target_temperature_step()); - ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); - ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); - ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); if (traits.get_supports_current_temperature()) { - ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); } - if (traits.get_supports_current_humidity()) { - ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + if (traits.get_supports_target_humidity() || traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); + ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); } if (traits.get_supports_two_point_target_temperature()) { ESP_LOGCONFIG(tag, " [x] Supports two-point target temperature"); } + if (traits.get_supports_current_temperature()) { + ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + } if (traits.get_supports_target_humidity()) { ESP_LOGCONFIG(tag, " [x] Supports target humidity"); } + if (traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + } if (traits.get_supports_action()) { ESP_LOGCONFIG(tag, " [x] Supports action"); } From d071b05249fc4d4310fda64ed8227896bb3f51d6 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:24:36 +0300 Subject: [PATCH 011/164] [climate-traits] improved performance (#7006) --- esphome/components/climate/climate_traits.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/components/climate/climate_traits.h b/esphome/components/climate/climate_traits.h index fd5b025a03..58d7b586d7 100644 --- a/esphome/components/climate/climate_traits.h +++ b/esphome/components/climate/climate_traits.h @@ -73,7 +73,7 @@ class ClimateTraits { ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20") void set_supports_dry_mode(bool supports_dry_mode) { set_mode_support_(CLIMATE_MODE_DRY, supports_dry_mode); } bool supports_mode(ClimateMode mode) const { return supported_modes_.count(mode); } - std::set get_supported_modes() const { return supported_modes_; } + const std::set &get_supported_modes() const { return supported_modes_; } void set_supports_action(bool supports_action) { supports_action_ = supports_action; } bool get_supports_action() const { return supports_action_; } @@ -101,7 +101,7 @@ class ClimateTraits { void set_supports_fan_mode_diffuse(bool supported) { set_fan_mode_support_(CLIMATE_FAN_DIFFUSE, supported); } bool supports_fan_mode(ClimateFanMode fan_mode) const { return supported_fan_modes_.count(fan_mode); } bool get_supports_fan_modes() const { return !supported_fan_modes_.empty() || !supported_custom_fan_modes_.empty(); } - std::set get_supported_fan_modes() const { return supported_fan_modes_; } + const std::set &get_supported_fan_modes() const { return supported_fan_modes_; } void set_supported_custom_fan_modes(std::set supported_custom_fan_modes) { supported_custom_fan_modes_ = std::move(supported_custom_fan_modes); @@ -140,7 +140,7 @@ class ClimateTraits { } bool supports_swing_mode(ClimateSwingMode swing_mode) const { return supported_swing_modes_.count(swing_mode); } bool get_supports_swing_modes() const { return !supported_swing_modes_.empty(); } - std::set get_supported_swing_modes() const { return supported_swing_modes_; } + const std::set &get_supported_swing_modes() const { return supported_swing_modes_; } float get_visual_min_temperature() const { return visual_min_temperature_; } void set_visual_min_temperature(float visual_min_temperature) { visual_min_temperature_ = visual_min_temperature; } From d209a2b45acff1e975d7ab68af5b75959624284e Mon Sep 17 00:00:00 2001 From: leejoow Date: Thu, 11 Jul 2024 22:20:58 +0200 Subject: [PATCH 012/164] Add default icon to restart button (#7076) Co-authored-by: Leo Schelvis --- esphome/components/restart/button/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/restart/button/__init__.py b/esphome/components/restart/button/__init__.py index 1b2c991261..6aff8cb351 100644 --- a/esphome/components/restart/button/__init__.py +++ b/esphome/components/restart/button/__init__.py @@ -5,6 +5,7 @@ from esphome.const import ( CONF_ID, DEVICE_CLASS_RESTART, ENTITY_CATEGORY_CONFIG, + ICON_RESTART, ) restart_ns = cg.esphome_ns.namespace("restart") @@ -12,6 +13,7 @@ RestartButton = restart_ns.class_("RestartButton", button.Button, cg.Component) CONFIG_SCHEMA = button.button_schema( RestartButton, + icon=ICON_RESTART, device_class=DEVICE_CLASS_RESTART, entity_category=ENTITY_CATEGORY_CONFIG, ).extend(cv.COMPONENT_SCHEMA) From 2e8a2fdbd4677b9075ae9bb572b4d66b8fc67794 Mon Sep 17 00:00:00 2001 From: Tomi Junnila Date: Thu, 11 Jul 2024 23:32:38 +0300 Subject: [PATCH 013/164] Add support for the Gree YAC1FB9 in climate_ir (#7056) --- esphome/components/gree/climate.py | 1 + esphome/components/gree/gree.cpp | 14 +++++++++++--- esphome/components/gree/gree.h | 6 +++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/esphome/components/gree/climate.py b/esphome/components/gree/climate.py index 02ce7b12d4..c88a428391 100644 --- a/esphome/components/gree/climate.py +++ b/esphome/components/gree/climate.py @@ -16,6 +16,7 @@ MODELS = { "yan": Model.GREE_YAN, "yaa": Model.GREE_YAA, "yac": Model.GREE_YAC, + "yac1fb9": Model.GREE_YAC1FB9, } CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend( diff --git a/esphome/components/gree/gree.cpp b/esphome/components/gree/gree.cpp index 1bbb443fce..cce2a8ffee 100644 --- a/esphome/components/gree/gree.cpp +++ b/esphome/components/gree/gree.cpp @@ -24,7 +24,7 @@ void GreeClimate::transmit_state() { remote_state[4] |= (this->horizontal_swing_() << 4); } - if (this->model_ == GREE_YAA || this->model_ == GREE_YAC) { + if (this->model_ == GREE_YAA || this->model_ == GREE_YAC || this->model_ == GREE_YAC1FB9) { remote_state[2] = 0x20; // bits 0..3 always 0000, bits 4..7 TURBO,LIGHT,HEALTH,X-FAN remote_state[3] = 0x50; // bits 4..7 always 0101 remote_state[6] = 0x20; // YAA1FB, FAA1FB1, YB1F2 bits 4..7 always 0010 @@ -53,7 +53,11 @@ void GreeClimate::transmit_state() { data->set_carrier_frequency(GREE_IR_FREQUENCY); data->mark(GREE_HEADER_MARK); - data->space(GREE_HEADER_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_HEADER_SPACE); + } else { + data->space(GREE_HEADER_SPACE); + } for (int i = 0; i < 4; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask @@ -71,7 +75,11 @@ void GreeClimate::transmit_state() { data->space(GREE_ZERO_SPACE); data->mark(GREE_BIT_MARK); - data->space(GREE_MESSAGE_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_MESSAGE_SPACE); + } else { + data->space(GREE_MESSAGE_SPACE); + } for (int i = 4; i < 8; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask diff --git a/esphome/components/gree/gree.h b/esphome/components/gree/gree.h index e7131a2b89..524a95aebd 100644 --- a/esphome/components/gree/gree.h +++ b/esphome/components/gree/gree.h @@ -41,6 +41,10 @@ const uint32_t GREE_YAC_HEADER_MARK = 6000; const uint32_t GREE_YAC_HEADER_SPACE = 3000; const uint32_t GREE_YAC_BIT_MARK = 650; +// Timing specific to YAC1FB9 +const uint32_t GREE_YAC1FB9_HEADER_SPACE = 4500; +const uint32_t GREE_YAC1FB9_MESSAGE_SPACE = 19980; + // State Frame size const uint8_t GREE_STATE_FRAME_SIZE = 8; @@ -67,7 +71,7 @@ const uint8_t GREE_HDIR_MRIGHT = 0x05; const uint8_t GREE_HDIR_RIGHT = 0x06; // Model codes -enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC }; +enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC, GREE_YAC1FB9 }; class GreeClimate : public climate_ir::ClimateIR { public: From 99cba0ae7fa0e9897c7f0dfb764a329ba6d431f4 Mon Sep 17 00:00:00 2001 From: Eugen Date: Thu, 11 Jul 2024 23:26:04 +0200 Subject: [PATCH 014/164] add ESP32-C6 support to esp32_can (#7063) --- esphome/components/esp32_can/canbus.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/esp32_can/canbus.py b/esphome/components/esp32_can/canbus.py index 74f331f30b..f4ba032009 100644 --- a/esphome/components/esp32_can/canbus.py +++ b/esphome/components/esp32_can/canbus.py @@ -11,6 +11,7 @@ from esphome.components.esp32.const import ( VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_ESP32C3, + VARIANT_ESP32C6, VARIANT_ESP32H2, ) @@ -47,6 +48,7 @@ CAN_SPEEDS_ESP32_S2 = { CAN_SPEEDS_ESP32_S3 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_C3 = {**CAN_SPEEDS_ESP32_S2} +CAN_SPEEDS_ESP32_C6 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_H2 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS = { @@ -54,6 +56,7 @@ CAN_SPEEDS = { VARIANT_ESP32S2: CAN_SPEEDS_ESP32_S2, VARIANT_ESP32S3: CAN_SPEEDS_ESP32_S3, VARIANT_ESP32C3: CAN_SPEEDS_ESP32_C3, + VARIANT_ESP32C6: CAN_SPEEDS_ESP32_C6, VARIANT_ESP32H2: CAN_SPEEDS_ESP32_H2, } From 7f83bcfdd91aba4fed05d0c1918c2899dac1682e Mon Sep 17 00:00:00 2001 From: soeffi Date: Thu, 11 Jul 2024 23:30:45 +0200 Subject: [PATCH 015/164] jsn_sr04t component: AJ_SR04M compatibility mode in checksum calculation (#7044) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/jsn_sr04t/jsn_sr04t.cpp | 19 ++++++++++++++++++- esphome/components/jsn_sr04t/jsn_sr04t.h | 8 +++++++- esphome/components/jsn_sr04t/sensor.py | 13 +++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/esphome/components/jsn_sr04t/jsn_sr04t.cpp b/esphome/components/jsn_sr04t/jsn_sr04t.cpp index b96bf8f762..077d4e58ea 100644 --- a/esphome/components/jsn_sr04t/jsn_sr04t.cpp +++ b/esphome/components/jsn_sr04t/jsn_sr04t.cpp @@ -31,7 +31,16 @@ void Jsnsr04tComponent::loop() { } void Jsnsr04tComponent::check_buffer_() { - uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2]; + uint8_t checksum = 0; + switch (this->model_) { + case JSN_SR04T: + checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2]; + break; + case AJ_SR04M: + checksum = this->buffer_[1] + this->buffer_[2]; + break; + } + if (this->buffer_[3] == checksum) { uint16_t distance = encode_uint16(this->buffer_[1], this->buffer_[2]); if (distance > 250) { @@ -49,6 +58,14 @@ void Jsnsr04tComponent::check_buffer_() { void Jsnsr04tComponent::dump_config() { LOG_SENSOR("", "JST_SR04T Sensor", this); + switch (this->model_) { + case JSN_SR04T: + ESP_LOGCONFIG(TAG, " sensor model: jsn_sr04t"); + break; + case AJ_SR04M: + ESP_LOGCONFIG(TAG, " sensor model: aj_sr04m"); + break; + } LOG_UPDATE_INTERVAL(this); } diff --git a/esphome/components/jsn_sr04t/jsn_sr04t.h b/esphome/components/jsn_sr04t/jsn_sr04t.h index bd43252be8..2a22ff92ec 100644 --- a/esphome/components/jsn_sr04t/jsn_sr04t.h +++ b/esphome/components/jsn_sr04t/jsn_sr04t.h @@ -9,9 +9,14 @@ namespace esphome { namespace jsn_sr04t { +enum Model { + JSN_SR04T, + AJ_SR04M, +}; + class Jsnsr04tComponent : public sensor::Sensor, public PollingComponent, public uart::UARTDevice { public: - // Nothing really public. + void set_model(Model model) { this->model_ = model; } // ========== INTERNAL METHODS ========== void update() override; @@ -20,6 +25,7 @@ class Jsnsr04tComponent : public sensor::Sensor, public PollingComponent, public protected: void check_buffer_(); + Model model_; std::vector buffer_; }; diff --git a/esphome/components/jsn_sr04t/sensor.py b/esphome/components/jsn_sr04t/sensor.py index 4b062e81e9..682cf06570 100644 --- a/esphome/components/jsn_sr04t/sensor.py +++ b/esphome/components/jsn_sr04t/sensor.py @@ -5,6 +5,7 @@ from esphome.const import ( STATE_CLASS_MEASUREMENT, UNIT_METER, ICON_ARROW_EXPAND_VERTICAL, + CONF_MODEL, ) CODEOWNERS = ["@Mafus1"] @@ -14,6 +15,11 @@ jsn_sr04t_ns = cg.esphome_ns.namespace("jsn_sr04t") Jsnsr04tComponent = jsn_sr04t_ns.class_( "Jsnsr04tComponent", sensor.Sensor, cg.PollingComponent, uart.UARTDevice ) +Model = jsn_sr04t_ns.enum("Model") +MODEL = { + "jsn_sr04t": Model.JSN_SR04T, + "aj_sr04m": Model.AJ_SR04M, +} CONFIG_SCHEMA = ( sensor.sensor_schema( @@ -25,6 +31,11 @@ CONFIG_SCHEMA = ( ) .extend(cv.polling_component_schema("60s")) .extend(uart.UART_DEVICE_SCHEMA) + .extend( + { + cv.Optional(CONF_MODEL, default="jsn_sr04t"): cv.enum(MODEL, upper=False), + } + ) ) FINAL_VALIDATE_SCHEMA = uart.final_validate_device_schema( @@ -42,3 +53,5 @@ async def to_code(config): var = await sensor.new_sensor(config) await cg.register_component(var, config) await uart.register_uart_device(var, config) + + cg.add(var.set_model(config[CONF_MODEL])) From 4a80a09db3c3a871f2825a2b7b7f1621ffab0f8b Mon Sep 17 00:00:00 2001 From: kevdliu <1766838+kevdliu@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:32:31 -0400 Subject: [PATCH 016/164] Fix voice assistant crash when no speaker configured (#7075) --- esphome/components/voice_assistant/voice_assistant.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 8a8a9e92aa..e4f388db68 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -684,7 +684,9 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) { this->defer([this, text]() { this->tts_start_trigger_->trigger(text); #ifdef USE_SPEAKER - this->speaker_->start(); + if (this->speaker_ != nullptr) { + this->speaker_->start(); + } #endif }); break; From 8a3f0e3b93878a24a6cc9cdbe9babb846243c522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 12 Jul 2024 23:19:33 +0200 Subject: [PATCH 017/164] Bump HeatpumpIR, add protocols, remove IRremoteESP8266 (#6996) --- esphome/components/heatpumpir/climate.py | 11 ++++++----- esphome/components/heatpumpir/heatpumpir.cpp | 5 +++++ esphome/components/heatpumpir/heatpumpir.h | 5 +++++ platformio.ini | 6 +++--- .../heatpumpir/test.bk72xx-ard.yaml | 19 +++++++++++++++++++ 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 tests/components/heatpumpir/test.bk72xx-ard.yaml diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index b86d405b7e..80900d7db9 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -8,7 +8,6 @@ from esphome.const import ( CONF_PROTOCOL, CONF_VISUAL, ) -from esphome.core import CORE CODEOWNERS = ["@rob-deutsch"] @@ -67,6 +66,11 @@ PROTOCOLS = { "carrier_qlima_2": Protocol.PROTOCOL_QLIMA_2, "samsung_aqv12msan": Protocol.PROTOCOL_SAMSUNG_AQV12MSAN, "zhjg01": Protocol.PROTOCOL_ZHJG01, + "airway": Protocol.PROTOCOL_AIRWAY, + "bgh_aud": Protocol.PROTOCOL_BGH_AUD, + "panasonic_altdke": Protocol.PROTOCOL_PANASONIC_ALTDKE, + "vaillantvai8": Protocol.PROTOCOL_VAILLANTVAI8, + "r51m": Protocol.PROTOCOL_R51M, } CONF_HORIZONTAL_DEFAULT = "horizontal_default" @@ -122,7 +126,4 @@ def to_code(config): cg.add(var.set_max_temperature(config[CONF_MAX_TEMPERATURE])) cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) - cg.add_library("tonia/HeatpumpIR", "1.0.26") - - if CORE.is_esp8266 or CORE.is_esp32: - cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.6") + cg.add_library("tonia/HeatpumpIR", "1.0.27") diff --git a/esphome/components/heatpumpir/heatpumpir.cpp b/esphome/components/heatpumpir/heatpumpir.cpp index 22a5779c8d..144dcc9bfa 100644 --- a/esphome/components/heatpumpir/heatpumpir.cpp +++ b/esphome/components/heatpumpir/heatpumpir.cpp @@ -61,6 +61,11 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_QLIMA_2, []() { return new Qlima2HeatpumpIR(); }}, // NOLINT {PROTOCOL_SAMSUNG_AQV12MSAN, []() { return new SamsungAQV12MSANHeatpumpIR(); }}, // NOLINT {PROTOCOL_ZHJG01, []() { return new ZHJG01HeatpumpIR(); }}, // NOLINT + {PROTOCOL_AIRWAY, []() { return new AIRWAYHeatpumpIR(); }}, // NOLINT + {PROTOCOL_BGH_AUD, []() { return new BGHHeatpumpIR(); }}, // NOLINT + {PROTOCOL_PANASONIC_ALTDKE, []() { return new PanasonicAltDKEHeatpumpIR(); }}, // NOLINT + {PROTOCOL_VAILLANTVAI8, []() { return new VaillantHeatpumpIR(); }}, // NOLINT + {PROTOCOL_R51M, []() { return new R51MHeatpumpIR(); }}, // NOLINT }; void HeatpumpIRClimate::setup() { diff --git a/esphome/components/heatpumpir/heatpumpir.h b/esphome/components/heatpumpir/heatpumpir.h index 0e6ea2218f..f6e7ff3cd6 100644 --- a/esphome/components/heatpumpir/heatpumpir.h +++ b/esphome/components/heatpumpir/heatpumpir.h @@ -61,6 +61,11 @@ enum Protocol { PROTOCOL_QLIMA_2, PROTOCOL_SAMSUNG_AQV12MSAN, PROTOCOL_ZHJG01, + PROTOCOL_AIRWAY, + PROTOCOL_BGH_AUD, + PROTOCOL_PANASONIC_ALTDKE, + PROTOCOL_VAILLANTVAI8, + PROTOCOL_R51M, }; // Simple enum to represent horizontal directios diff --git a/platformio.ini b/platformio.ini index f07889526f..fc7f35b6c3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -65,7 +65,7 @@ lib_deps = glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr dudanov/MideaUART@1.1.9 ; midea - tonia/HeatpumpIR@1.0.26 ; heatpumpir + tonia/HeatpumpIR@1.0.27 ; heatpumpir build_flags = ${common.build_flags} -DUSE_ARDUINO @@ -93,8 +93,8 @@ lib_deps = ESP8266HTTPClient ; http_request (Arduino built-in) ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -Wno-nonnull-compare @@ -123,8 +123,8 @@ lib_deps = ESPmDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -DUSE_ESP32 diff --git a/tests/components/heatpumpir/test.bk72xx-ard.yaml b/tests/components/heatpumpir/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..90259f1244 --- /dev/null +++ b/tests/components/heatpumpir/test.bk72xx-ard.yaml @@ -0,0 +1,19 @@ +remote_transmitter: + pin: 6 + carrier_duty_percent: 50% + +climate: + - platform: heatpumpir + protocol: daikin + horizontal_default: mleft + vertical_default: mup + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 + - platform: heatpumpir + protocol: panasonic_altdke + horizontal_default: mright + vertical_default: mdown + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 From feae794787ca3ad0cc1b20be9496a73117e6844f Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Fri, 12 Jul 2024 21:42:41 +0000 Subject: [PATCH 018/164] LTR390 separate ALS and UV gain and resolution (#7026) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 2 +- esphome/components/ltr390/ltr390.cpp | 73 +++++++++++-------- esphome/components/ltr390/ltr390.h | 14 ++-- esphome/components/ltr390/sensor.py | 40 ++++++++-- tests/components/ltr390/test.esp32-ard.yaml | 18 +++++ tests/components/ltr390/test.esp8266-ard.yaml | 4 +- 6 files changed, 110 insertions(+), 41 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 5c14d30371..210c567f78 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -214,7 +214,7 @@ esphome/components/lightwaverf/* @max246 esphome/components/lilygo_t5_47/touchscreen/* @jesserockz esphome/components/lock/* @esphome/core esphome/components/logger/* @esphome/core -esphome/components/ltr390/* @sjtrny +esphome/components/ltr390/* @latonita @sjtrny esphome/components/ltr_als_ps/* @latonita esphome/components/matrix_keypad/* @ssieb esphome/components/max31865/* @DAVe3283 diff --git a/esphome/components/ltr390/ltr390.cpp b/esphome/components/ltr390/ltr390.cpp index 4eb1ff2c46..198d15ebd8 100644 --- a/esphome/components/ltr390/ltr390.cpp +++ b/esphome/components/ltr390/ltr390.cpp @@ -19,6 +19,7 @@ static const uint8_t LTR390_MAIN_STATUS = 0x07; static const float GAINVALUES[5] = {1.0, 3.0, 6.0, 9.0, 18.0}; static const float RESOLUTIONVALUE[6] = {4.0, 2.0, 1.0, 0.5, 0.25, 0.125}; +static const uint8_t RESOLUTION_BITS[6] = {20, 19, 18, 17, 16, 13}; // Request fastest measurement rate - will be slowed by device if conversion rate is slower. static const float RESOLUTION_SETTING[6] = {0x00, 0x10, 0x20, 0x30, 0x40, 0x50}; @@ -74,7 +75,7 @@ void LTR390Component::read_als_() { uint32_t als = *val; if (this->light_sensor_ != nullptr) { - float lux = ((0.6 * als) / (GAINVALUES[this->gain_] * RESOLUTIONVALUE[this->res_])) * this->wfac_; + float lux = ((0.6 * als) / (GAINVALUES[this->gain_als_] * RESOLUTIONVALUE[this->res_als_])) * this->wfac_; this->light_sensor_->publish_state(lux); } @@ -90,7 +91,7 @@ void LTR390Component::read_uvs_() { uint32_t uv = *val; if (this->uvi_sensor_ != nullptr) { - this->uvi_sensor_->publish_state((uv / this->sensitivity_) * this->wfac_); + this->uvi_sensor_->publish_state((uv / this->sensitivity_uv_) * this->wfac_); } if (this->uv_sensor_ != nullptr) { @@ -107,24 +108,38 @@ void LTR390Component::read_mode_(int mode_index) { ctrl[LTR390_CTRL_EN] = true; this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - // After the sensor integration time do the following - this->set_timeout(((uint32_t) RESOLUTIONVALUE[this->res_]) * 100 + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, - [this, mode_index]() { - // Read from the sensor - std::get<1>(this->mode_funcs_[mode_index])(); + uint32_t int_time{0}; + // Set gain, resolution and measurement rate + switch (mode) { + case LTR390_MODE_ALS: + this->reg(LTR390_GAIN) = this->gain_als_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_als_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_als_]) * 100; + break; + case LTR390_MODE_UVS: + this->reg(LTR390_GAIN) = this->gain_uv_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_uv_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_uv_]) * 100; + break; + } - // If there are more modes to read then begin the next - // otherwise stop - if (mode_index + 1 < (int) this->mode_funcs_.size()) { - this->read_mode_(mode_index + 1); - } else { - // put sensor in standby - std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); - ctrl[LTR390_CTRL_EN] = false; - this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - this->reading_ = false; - } - }); + // After the sensor integration time do the following + this->set_timeout(int_time + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, [this, mode_index]() { + // Read from the sensor + std::get<1>(this->mode_funcs_[mode_index])(); + + // If there are more modes to read then begin the next + // otherwise stop + if (mode_index + 1 < (int) this->mode_funcs_.size()) { + this->read_mode_(mode_index + 1); + } else { + // put sensor in standby + std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); + ctrl[LTR390_CTRL_EN] = false; + this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); + this->reading_ = false; + } + }); } void LTR390Component::setup() { @@ -151,16 +166,10 @@ void LTR390Component::setup() { return; } - // Set gain - this->reg(LTR390_GAIN) = gain_; - - // Set resolution and measurement rate - this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_]; - // Set sensitivity by linearly scaling against known value in the datasheet - float gain_scale = GAINVALUES[this->gain_] / GAIN_MAX; - float intg_scale = (RESOLUTIONVALUE[this->res_] * 100) / INTG_MAX; - this->sensitivity_ = SENSITIVITY_MAX * gain_scale * intg_scale; + float gain_scale_uv = GAINVALUES[this->gain_uv_] / GAIN_MAX; + float intg_scale_uv = (RESOLUTIONVALUE[this->res_uv_] * 100) / INTG_MAX; + this->sensitivity_uv_ = SENSITIVITY_MAX * gain_scale_uv * intg_scale_uv; // Set sensor read state this->reading_ = false; @@ -176,7 +185,13 @@ void LTR390Component::setup() { } } -void LTR390Component::dump_config() { LOG_I2C_DEVICE(this); } +void LTR390Component::dump_config() { + LOG_I2C_DEVICE(this); + ESP_LOGCONFIG(TAG, " ALS Gain: X%.0f", GAINVALUES[this->gain_als_]); + ESP_LOGCONFIG(TAG, " ALS Resolution: %u-bit", RESOLUTION_BITS[this->res_als_]); + ESP_LOGCONFIG(TAG, " UV Gain: X%.0f", GAINVALUES[this->gain_uv_]); + ESP_LOGCONFIG(TAG, " UV Resolution: %u-bit", RESOLUTION_BITS[this->res_uv_]); +} void LTR390Component::update() { if (!this->reading_ && !mode_funcs_.empty()) { diff --git a/esphome/components/ltr390/ltr390.h b/esphome/components/ltr390/ltr390.h index bc98518fe9..24afd3c411 100644 --- a/esphome/components/ltr390/ltr390.h +++ b/esphome/components/ltr390/ltr390.h @@ -49,8 +49,10 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { void dump_config() override; void update() override; - void set_gain_value(LTR390GAIN gain) { this->gain_ = gain; } - void set_res_value(LTR390RESOLUTION res) { this->res_ = res; } + void set_als_gain_value(LTR390GAIN gain) { this->gain_als_ = gain; } + void set_uv_gain_value(LTR390GAIN gain) { this->gain_uv_ = gain; } + void set_als_res_value(LTR390RESOLUTION res) { this->res_als_ = res; } + void set_uv_res_value(LTR390RESOLUTION res) { this->res_uv_ = res; } void set_wfac_value(float wfac) { this->wfac_ = wfac; } void set_light_sensor(sensor::Sensor *light_sensor) { this->light_sensor_ = light_sensor; } @@ -71,9 +73,11 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { // a list of modes and corresponding read functions std::vector>> mode_funcs_; - LTR390GAIN gain_; - LTR390RESOLUTION res_; - float sensitivity_; + LTR390GAIN gain_als_; + LTR390GAIN gain_uv_; + LTR390RESOLUTION res_als_; + LTR390RESOLUTION res_uv_; + float sensitivity_uv_; float wfac_; sensor::Sensor *light_sensor_{nullptr}; diff --git a/esphome/components/ltr390/sensor.py b/esphome/components/ltr390/sensor.py index 8b2676599c..62c3edf8cb 100644 --- a/esphome/components/ltr390/sensor.py +++ b/esphome/components/ltr390/sensor.py @@ -13,7 +13,7 @@ from esphome.const import ( UNIT_LUX, ) -CODEOWNERS = ["@sjtrny"] +CODEOWNERS = ["@sjtrny", "@latonita"] DEPENDENCIES = ["i2c"] ltr390_ns = cg.esphome_ns.namespace("ltr390") @@ -76,8 +76,24 @@ CONFIG_SCHEMA = cv.All( accuracy_decimals=1, device_class=DEVICE_CLASS_EMPTY, ), - cv.Optional(CONF_GAIN, default="X18"): cv.enum(GAIN_OPTIONS), - cv.Optional(CONF_RESOLUTION, default=20): cv.enum(RES_OPTIONS), + cv.Optional(CONF_GAIN, default="X18"): cv.Any( + cv.enum(GAIN_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(GAIN_OPTIONS), + cv.Required(CONF_UV): cv.enum(GAIN_OPTIONS), + } + ), + ), + cv.Optional(CONF_RESOLUTION, default=20): cv.Any( + cv.enum(RES_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(RES_OPTIONS), + cv.Required(CONF_UV): cv.enum(RES_OPTIONS), + } + ), + ), cv.Optional(CONF_WINDOW_CORRECTION_FACTOR, default=1.0): cv.float_range( min=1.0 ), @@ -101,11 +117,25 @@ async def to_code(config): await cg.register_component(var, config) await i2c.register_i2c_device(var, config) - cg.add(var.set_gain_value(config[CONF_GAIN])) - cg.add(var.set_res_value(config[CONF_RESOLUTION])) cg.add(var.set_wfac_value(config[CONF_WINDOW_CORRECTION_FACTOR])) for key, funcName in TYPES.items(): if key in config: sens = await sensor.new_sensor(config[key]) cg.add(getattr(var, funcName)(sens)) + + gain_value = config[CONF_GAIN] + if isinstance(gain_value, dict): + cg.add(var.set_als_gain_value(gain_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_gain_value(gain_value[CONF_UV])) + else: + cg.add(var.set_als_gain_value(gain_value)) + cg.add(var.set_uv_gain_value(gain_value)) + + res_value = config[CONF_RESOLUTION] + if isinstance(res_value, dict): + cg.add(var.set_als_res_value(res_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_res_value(res_value[CONF_UV])) + else: + cg.add(var.set_als_res_value(res_value)) + cg.add(var.set_uv_res_value(res_value)) diff --git a/tests/components/ltr390/test.esp32-ard.yaml b/tests/components/ltr390/test.esp32-ard.yaml index 9786c7dac3..bdfe349b77 100644 --- a/tests/components/ltr390/test.esp32-ard.yaml +++ b/tests/components/ltr390/test.esp32-ard.yaml @@ -18,3 +18,21 @@ sensor: window_correction_factor: 1.0 address: 0x53 update_interval: 60s + - platform: ltr390 + uv: + name: LTR390 UV + uv_index: + name: LTR390 UVI + light: + name: LTR390 Light + ambient_light: + name: LTR390 ALS + gain: + ambient_light: X9 + uv: X3 + resolution: + ambient_light: 18 + uv: 13 + window_correction_factor: 1.0 + address: 0x53 + update_interval: 60s diff --git a/tests/components/ltr390/test.esp8266-ard.yaml b/tests/components/ltr390/test.esp8266-ard.yaml index fee0f37ce1..149f46f9c8 100644 --- a/tests/components/ltr390/test.esp8266-ard.yaml +++ b/tests/components/ltr390/test.esp8266-ard.yaml @@ -13,7 +13,9 @@ sensor: name: LTR390 Light ambient_light: name: LTR390 ALS - gain: X3 + gain: + ambient_light: X9 + uv: X3 resolution: 18 window_correction_factor: 1.0 address: 0x53 From 44d609b205c1549ae4c2ab7be31d81b0f67e8755 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Sun, 14 Jul 2024 22:05:02 +0200 Subject: [PATCH 019/164] [CI] compile entire web_server during tests (#7084) --- tests/components/web_server/common.yaml | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/components/web_server/common.yaml b/tests/components/web_server/common.yaml index 94388726c3..338d9e97d2 100644 --- a/tests/components/web_server/common.yaml +++ b/tests/components/web_server/common.yaml @@ -5,3 +5,38 @@ wifi: web_server: port: 8080 version: 2 + +binary_sensor: +cover: +fan: +light: +sensor: +switch: +button: +text_sensor: +climate: +number: +text: +select: +lock: +valve: +alarm_control_panel: +api: +time: + - platform: homeassistant + id: homeassistant_time +datetime: + - platform: template + id: my_datetime_date + type: date + optimistic: yes + - platform: template + id: my_datetime_time + type: time + optimistic: yes + - platform: template + id: my_datetime + type: datetime + optimistic: yes +event: +update: From 896af84acc967aca74bc3cf832fb4e7da47ad032 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 14 Jul 2024 15:06:10 -0500 Subject: [PATCH 020/164] [improv_serial] Fix linker error created in #6998 (#7082) --- esphome/components/improv_serial/improv_serial_component.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/improv_serial/improv_serial_component.cpp b/esphome/components/improv_serial/improv_serial_component.cpp index 02ffa9f31c..12809e38cb 100644 --- a/esphome/components/improv_serial/improv_serial_component.cpp +++ b/esphome/components/improv_serial/improv_serial_component.cpp @@ -57,7 +57,7 @@ optional ImprovSerialComponent::read_byte_() { } } break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) if (esp_usb_console_available_for_read()) { @@ -99,7 +99,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 uart_write_bytes(this->uart_num_, data.data(), data.size()); break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: { const char *msg = (char *) data.data(); esp_usb_console_write_buf(msg, data.size()); @@ -109,6 +109,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #ifdef USE_LOGGER_USB_SERIAL_JTAG case logger::UART_SELECTION_USB_SERIAL_JTAG: usb_serial_jtag_write_bytes((char *) data.data(), data.size(), 20 / portTICK_PERIOD_MS); + delay(10); usb_serial_jtag_ll_txfifo_flush(); // fixes for issue in IDF 4.4.7 break; #endif // USE_LOGGER_USB_SERIAL_JTAG From 07b78fea760e78e5be5c0dbbf506f2fca490cff0 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 14 Jul 2024 15:32:10 -0500 Subject: [PATCH 021/164] [CI] Add more ``improv_serial`` tests (#7081) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../improv_serial/{common.yaml => common-uart0.yaml} | 3 +++ tests/components/improv_serial/common-usb_cdc.yaml | 8 ++++++++ .../components/improv_serial/common-usb_serial_jtag.yaml | 8 ++++++++ tests/components/improv_serial/test-uart0.esp32-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-c3-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-c3-idf.yaml | 1 + tests/components/improv_serial/test-uart0.esp32-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s2-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s2-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s3-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s3-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp8266-ard.yaml | 1 + tests/components/improv_serial/test-uart0.rp2040-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-c3-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s2-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s2-idf.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s3-ard.yaml | 1 + .../components/improv_serial/test-usb_cdc.rp2040-ard.yaml | 1 + .../improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml | 1 + .../improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml | 1 + tests/components/improv_serial/test.esp32-ard.yaml | 1 - tests/components/improv_serial/test.esp32-c3-ard.yaml | 1 - tests/components/improv_serial/test.esp32-c3-idf.yaml | 1 - tests/components/improv_serial/test.esp32-idf.yaml | 1 - tests/components/improv_serial/test.esp8266-ard.yaml | 1 - tests/components/improv_serial/test.rp2040-ard.yaml | 1 - 26 files changed, 36 insertions(+), 6 deletions(-) rename tests/components/improv_serial/{common.yaml => common-uart0.yaml} (64%) create mode 100644 tests/components/improv_serial/common-usb_cdc.yaml create mode 100644 tests/components/improv_serial/common-usb_serial_jtag.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp8266-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.rp2040-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml create mode 100644 tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp32-ard.yaml delete mode 100644 tests/components/improv_serial/test.esp32-c3-ard.yaml delete mode 100644 tests/components/improv_serial/test.esp32-c3-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp32-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp8266-ard.yaml delete mode 100644 tests/components/improv_serial/test.rp2040-ard.yaml diff --git a/tests/components/improv_serial/common.yaml b/tests/components/improv_serial/common-uart0.yaml similarity index 64% rename from tests/components/improv_serial/common.yaml rename to tests/components/improv_serial/common-uart0.yaml index b36fe5a4a7..7b7730fd46 100644 --- a/tests/components/improv_serial/common.yaml +++ b/tests/components/improv_serial/common-uart0.yaml @@ -2,4 +2,7 @@ wifi: ssid: MySSID password: password1 +logger: + hardware_uart: UART0 + improv_serial: diff --git a/tests/components/improv_serial/common-usb_cdc.yaml b/tests/components/improv_serial/common-usb_cdc.yaml new file mode 100644 index 0000000000..fc72b6aa7e --- /dev/null +++ b/tests/components/improv_serial/common-usb_cdc.yaml @@ -0,0 +1,8 @@ +wifi: + ssid: MySSID + password: password1 + +logger: + hardware_uart: USB_CDC + +improv_serial: diff --git a/tests/components/improv_serial/common-usb_serial_jtag.yaml b/tests/components/improv_serial/common-usb_serial_jtag.yaml new file mode 100644 index 0000000000..0abcc07168 --- /dev/null +++ b/tests/components/improv_serial/common-usb_serial_jtag.yaml @@ -0,0 +1,8 @@ +wifi: + ssid: MySSID + password: password1 + +logger: + hardware_uart: USB_SERIAL_JTAG + +improv_serial: diff --git a/tests/components/improv_serial/test-uart0.esp32-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp8266-ard.yaml b/tests/components/improv_serial/test-uart0.esp8266-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.rp2040-ard.yaml b/tests/components/improv_serial/test-uart0.rp2040-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml b/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml b/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml b/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/improv_serial/test.esp32-ard.yaml b/tests/components/improv_serial/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-c3-ard.yaml b/tests/components/improv_serial/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-c3-idf.yaml b/tests/components/improv_serial/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-idf.yaml b/tests/components/improv_serial/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp8266-ard.yaml b/tests/components/improv_serial/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.rp2040-ard.yaml b/tests/components/improv_serial/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml From f1d19416be8753ff189562f5719b3e96a783414f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:28:41 +1200 Subject: [PATCH 022/164] [i2s_audio] Allow config for primary/secondary i2s mode (#7092) --- esphome/components/i2s_audio/__init__.py | 10 ++++++++++ esphome/components/i2s_audio/microphone/__init__.py | 7 +++++++ .../i2s_audio/microphone/i2s_audio_microphone.cpp | 5 ++--- .../i2s_audio/microphone/i2s_audio_microphone.h | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/esphome/components/i2s_audio/__init__.py b/esphome/components/i2s_audio/__init__.py index d72e13630f..05e44696d8 100644 --- a/esphome/components/i2s_audio/__init__.py +++ b/esphome/components/i2s_audio/__init__.py @@ -25,6 +25,10 @@ CONF_I2S_LRCLK_PIN = "i2s_lrclk_pin" CONF_I2S_AUDIO = "i2s_audio" CONF_I2S_AUDIO_ID = "i2s_audio_id" +CONF_I2S_MODE = "i2s_mode" +CONF_PRIMARY = "primary" +CONF_SECONDARY = "secondary" + i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", cg.Parented.template(I2SAudioComponent)) @@ -32,6 +36,12 @@ I2SAudioOut = i2s_audio_ns.class_( "I2SAudioOut", cg.Parented.template(I2SAudioComponent) ) +i2s_mode_t = cg.global_ns.enum("i2s_mode_t") +I2S_MODE_OPTIONS = { + CONF_PRIMARY: i2s_mode_t.I2S_MODE_MASTER, # NOLINT + CONF_SECONDARY: i2s_mode_t.I2S_MODE_SLAVE, # NOLINT +} + # https://github.com/espressif/esp-idf/blob/master/components/soc/{variant}/include/soc/soc_caps.h I2S_PORTS = { VARIANT_ESP32: 2, diff --git a/esphome/components/i2s_audio/microphone/__init__.py b/esphome/components/i2s_audio/microphone/__init__.py index d9c31e8e7b..844f176bea 100644 --- a/esphome/components/i2s_audio/microphone/__init__.py +++ b/esphome/components/i2s_audio/microphone/__init__.py @@ -7,6 +7,9 @@ from esphome.components import microphone, esp32 from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin from .. import ( + CONF_I2S_MODE, + CONF_PRIMARY, + I2S_MODE_OPTIONS, i2s_audio_ns, I2SAudioComponent, I2SAudioIn, @@ -68,6 +71,9 @@ BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( _validate_bits, cv.enum(BITS_PER_SAMPLE) ), cv.Optional(CONF_USE_APLL, default=False): cv.boolean, + cv.Optional(CONF_I2S_MODE, default=CONF_PRIMARY): cv.enum( + I2S_MODE_OPTIONS, lower=True + ), } ).extend(cv.COMPONENT_SCHEMA) @@ -107,6 +113,7 @@ async def to_code(config): cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) cg.add(var.set_pdm(config[CONF_PDM])) + cg.add(var.set_i2s_mode(config[CONF_I2S_MODE])) cg.add(var.set_channel(config[CONF_CHANNEL])) cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE])) cg.add(var.set_bits_per_sample(config[CONF_BITS_PER_SAMPLE])) diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp index a672348d85..009fecdf90 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp @@ -46,7 +46,7 @@ void I2SAudioMicrophone::start_() { return; // Waiting for another i2s to return lock } i2s_driver_config_t config = { - .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_RX), + .mode = (i2s_mode_t) (this->i2s_mode_ | I2S_MODE_RX), .sample_rate = this->sample_rate_, .bits_per_sample = this->bits_per_sample_, .channel_format = this->channel_, @@ -174,8 +174,7 @@ size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) { size_t samples_read = bytes_read / sizeof(int32_t); samples.resize(samples_read); for (size_t i = 0; i < samples_read; i++) { - int32_t temp = reinterpret_cast(buf)[i] >> 14; - samples[i] = clamp(temp, INT16_MIN, INT16_MAX); + samples[i] = reinterpret_cast(buf)[i] >> 16; } memcpy(buf, samples.data(), samples_read * sizeof(int16_t)); return samples_read * sizeof(int16_t); diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h index 68b9a94fbd..07ca0528aa 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h @@ -30,6 +30,8 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub } #endif + void set_i2s_mode(i2s_mode_t mode) { this->i2s_mode_ = mode; } + void set_channel(i2s_channel_fmt_t channel) { this->channel_ = channel; } void set_sample_rate(uint32_t sample_rate) { this->sample_rate_ = sample_rate; } void set_bits_per_sample(i2s_bits_per_sample_t bits_per_sample) { this->bits_per_sample_ = bits_per_sample; } @@ -46,6 +48,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub bool adc_{false}; #endif bool pdm_{false}; + i2s_mode_t i2s_mode_{}; i2s_channel_fmt_t channel_; uint32_t sample_rate_; i2s_bits_per_sample_t bits_per_sample_; From c910fdf7e52354e8d4945bdeac44cd2000448d4c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:29:45 +1200 Subject: [PATCH 023/164] [micro_wake_word] Allow simpler model config (#7094) --- esphome/components/micro_wake_word/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index 3d3459ccab..c2faca25f4 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -357,7 +357,9 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(MicroWakeWord), cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone), - cv.Required(CONF_MODELS): cv.ensure_list(MODEL_SCHEMA), + cv.Required(CONF_MODELS): cv.ensure_list( + cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL) + ), cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation( single=True ), From 0b3fe73b74b44f0be4f282a4cbe74252ba51453c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:13:02 +1200 Subject: [PATCH 024/164] Bump docker/build-push-action from 6.3.0 to 6.4.0 in /.github/actions/build-image (#7089) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d5baf339aa..ac9a6ae53a 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . file: ./docker/Dockerfile From 8980996b1aa84316e71b8ba5dea26c38c7b3f364 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Tue, 16 Jul 2024 07:14:33 +0200 Subject: [PATCH 025/164] [CI] add web_server v1 test (#7090) --- tests/components/web_server/common.yaml | 4 ---- tests/components/web_server/common_v1.yaml | 5 +++++ tests/components/web_server/common_v2.yaml | 5 +++++ tests/components/web_server/test.esp32-ard.yaml | 2 +- tests/components/web_server/test.esp32-c3-ard.yaml | 2 +- tests/components/web_server/test.esp32-c3-idf.yaml | 2 +- tests/components/web_server/test.esp32-idf.yaml | 2 +- tests/components/web_server/test.esp8266-ard.yaml | 2 +- tests/components/web_server/test_v1.esp32-ard.yaml | 1 + 9 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 tests/components/web_server/common_v1.yaml create mode 100644 tests/components/web_server/common_v2.yaml create mode 100644 tests/components/web_server/test_v1.esp32-ard.yaml diff --git a/tests/components/web_server/common.yaml b/tests/components/web_server/common.yaml index 338d9e97d2..eb768eeb91 100644 --- a/tests/components/web_server/common.yaml +++ b/tests/components/web_server/common.yaml @@ -2,10 +2,6 @@ wifi: ssid: MySSID password: password1 -web_server: - port: 8080 - version: 2 - binary_sensor: cover: fan: diff --git a/tests/components/web_server/common_v1.yaml b/tests/components/web_server/common_v1.yaml new file mode 100644 index 0000000000..bf5aab4ce6 --- /dev/null +++ b/tests/components/web_server/common_v1.yaml @@ -0,0 +1,5 @@ +<<: !include common.yaml + +web_server: + port: 8080 + version: 1 diff --git a/tests/components/web_server/common_v2.yaml b/tests/components/web_server/common_v2.yaml new file mode 100644 index 0000000000..564c43e553 --- /dev/null +++ b/tests/components/web_server/common_v2.yaml @@ -0,0 +1,5 @@ +<<: !include common.yaml + +web_server: + port: 8080 + version: 2 diff --git a/tests/components/web_server/test.esp32-ard.yaml b/tests/components/web_server/test.esp32-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-ard.yaml +++ b/tests/components/web_server/test.esp32-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-c3-ard.yaml b/tests/components/web_server/test.esp32-c3-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-c3-ard.yaml +++ b/tests/components/web_server/test.esp32-c3-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-c3-idf.yaml b/tests/components/web_server/test.esp32-c3-idf.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-c3-idf.yaml +++ b/tests/components/web_server/test.esp32-c3-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-idf.yaml b/tests/components/web_server/test.esp32-idf.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-idf.yaml +++ b/tests/components/web_server/test.esp32-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp8266-ard.yaml b/tests/components/web_server/test.esp8266-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp8266-ard.yaml +++ b/tests/components/web_server/test.esp8266-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test_v1.esp32-ard.yaml b/tests/components/web_server/test_v1.esp32-ard.yaml new file mode 100644 index 0000000000..389a930284 --- /dev/null +++ b/tests/components/web_server/test_v1.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common_v1.yaml From 659fdefccb851fa9e76d560b7574e5589b890d24 Mon Sep 17 00:00:00 2001 From: NewoPL <27411874+NewoPL@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:28:23 +0200 Subject: [PATCH 026/164] [wifi] Hostname may not be set as expected on Arduino platform (#7050) * bug #6014: workaround for not setting hostname on arduino plarform * moving handle initailisation to ESPHOME_EVENT_ID_WIFI_STA_START callback --- esphome/components/wifi/wifi_component_esp32_arduino.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index fc954a2333..71548b7a3e 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -82,8 +82,8 @@ bool WiFiComponent::wifi_mode_(optional sta, optional ap) { // WiFiClass::mode above calls esp_netif_create_default_wifi_sta() and // esp_netif_create_default_wifi_ap(), which creates the interfaces. - if (set_sta) - s_sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); + // s_sta_netif handle is set during ESPHOME_EVENT_ID_WIFI_STA_START event + #ifdef USE_WIFI_AP if (set_ap) s_ap_netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); @@ -495,6 +495,7 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_ case ESPHOME_EVENT_ID_WIFI_STA_START: { ESP_LOGV(TAG, "Event: WiFi STA start"); // apply hostname + s_sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); esp_err_t err = esp_netif_set_hostname(s_sta_netif, App.get_name().c_str()); if (err != ERR_OK) { ESP_LOGW(TAG, "esp_netif_set_hostname failed: %s", esp_err_to_name(err)); From 193db50668d7f343e5ae22bcf6e3a5b1e2309adf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:18:43 +1200 Subject: [PATCH 027/164] [ota] Print Arduino update errors (#7096) --- .../ota/ota_backend_arduino_esp32.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_esp8266.cpp | 31 ++++++++++++++----- .../ota/ota_backend_arduino_libretiny.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_rp2040.cpp | 29 ++++++++++++----- 4 files changed, 89 insertions(+), 29 deletions(-) diff --git a/esphome/components/ota/ota_backend_arduino_esp32.cpp b/esphome/components/ota/ota_backend_arduino_esp32.cpp index 62c6a72388..15dfc98a6c 100644 --- a/esphome/components/ota/ota_backend_arduino_esp32.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp32.cpp @@ -1,14 +1,17 @@ #ifdef USE_ESP32_FRAMEWORK_ARDUINO #include "esphome/core/defines.h" +#include "esphome/core/log.h" -#include "ota_backend_arduino_esp32.h" #include "ota_backend.h" +#include "ota_backend_arduino_esp32.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp32"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoESP32OTABackend::set_update_md5(const char *md5) { Update.setMD5(md5 OTAResponseTypes ArduinoESP32OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP32OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP32OTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_esp8266.cpp b/esphome/components/ota/ota_backend_arduino_esp8266.cpp index b317075bd0..42edbf5d2b 100644 --- a/esphome/components/ota/ota_backend_arduino_esp8266.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp8266.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_ESP8266 -#include "ota_backend.h" #include "ota_backend_arduino_esp8266.h" +#include "ota_backend.h" -#include "esphome/core/defines.h" #include "esphome/components/esp8266/preferences.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp8266"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_ESP8266_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoESP8266OTABackend::set_update_md5(const char *md5) { Update.setMD5(m OTAResponseTypes ArduinoESP8266OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP8266OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP8266OTABackend::abort() { diff --git a/esphome/components/ota/ota_backend_arduino_libretiny.cpp b/esphome/components/ota/ota_backend_arduino_libretiny.cpp index df4e774ebc..6b2cf80684 100644 --- a/esphome/components/ota/ota_backend_arduino_libretiny.cpp +++ b/esphome/components/ota/ota_backend_arduino_libretiny.cpp @@ -1,14 +1,17 @@ #ifdef USE_LIBRETINY -#include "ota_backend.h" #include "ota_backend_arduino_libretiny.h" +#include "ota_backend.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_libretiny"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoLibreTinyOTABackend::set_update_md5(const char *md5) { Update.setMD5 OTAResponseTypes ArduinoLibreTinyOTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoLibreTinyOTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoLibreTinyOTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_rp2040.cpp b/esphome/components/ota/ota_backend_arduino_rp2040.cpp index 4448b0c95e..ffeab2e93f 100644 --- a/esphome/components/ota/ota_backend_arduino_rp2040.cpp +++ b/esphome/components/ota/ota_backend_arduino_rp2040.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_RP2040 -#include "ota_backend.h" #include "ota_backend_arduino_rp2040.h" +#include "ota_backend.h" #include "esphome/components/rp2040/preferences.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_rp2040"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_RP2040_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoRP2040OTABackend::set_update_md5(const char *md5) { Update.setMD5(md OTAResponseTypes ArduinoRP2040OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoRP2040OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoRP2040OTABackend::abort() { From 10205e06cb1de3b65e81dfcdc5a20fe890155162 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:06:27 +1000 Subject: [PATCH 028/164] Add host uart support for MacOS (#7095) --- esphome/components/uart/uart_component_host.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/uart/uart_component_host.cpp b/esphome/components/uart/uart_component_host.cpp index d8d2fd75b8..40d3e91ab2 100644 --- a/esphome/components/uart/uart_component_host.cpp +++ b/esphome/components/uart/uart_component_host.cpp @@ -5,8 +5,8 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -#ifndef __linux__ -#error This HostUartComponent implementation is only for Linux +#if !(defined(__linux__) || defined(__APPLE__)) +#error This HostUartComponent implementation is not supported on this host OS #endif #include @@ -24,6 +24,9 @@ namespace { speed_t get_baud(int baud) { +#ifdef __APPLE__ + return baud; +#else switch (baud) { case 50: return B50; @@ -88,6 +91,7 @@ speed_t get_baud(int baud) { default: return B0; } +#endif } } // namespace From dd20c5eab0ca2441e7911ae85638a5a8237534cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:33:30 +1200 Subject: [PATCH 029/164] Bump docker/build-push-action from 6.4.0 to 6.4.1 in /.github/actions/build-image (#7102) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index ac9a6ae53a..e2febdad1b 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.4.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.4.1 with: context: . file: ./docker/Dockerfile From b32078a5fe8b05f6f3bf4234b24ec8b3a6871d02 Mon Sep 17 00:00:00 2001 From: Alex Cortelyou <1689668+acortelyou@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:04:11 -0700 Subject: [PATCH 030/164] Prevent rename from deleting new config (#7104) --- esphome/__main__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 5ff1a28ec7..b13f96daf7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -695,7 +695,8 @@ def command_rename(args, config): os.remove(new_path) return 1 - os.remove(CORE.config_path) + if CORE.config_path != new_path: + os.remove(CORE.config_path) print(color(Fore.BOLD_GREEN, "SUCCESS")) print() From 0fb89d186964bc31b28b9873d3245981d19ce8df Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:26:21 +1200 Subject: [PATCH 031/164] [code-quality] Add some ruff configuration (#7103) --- pyproject.toml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index fe558f695f..cfc279845f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,3 +105,33 @@ disable = [ [tool.pylint.FORMAT] expected-line-ending-format = "LF" + +[tool.ruff] +required-version = ">=0.5.0" + +[tool.ruff.lint] +select = [ + "E", # pycodestyle + "F", # pyflakes/autoflake + "I", # isort + "PL", # pylint + "UP", # pyupgrade +] + +ignore = [ + "E501", # line too long + "PLR0911", # Too many return statements ({returns} > {max_returns}) + "PLR0912", # Too many branches ({branches} > {max_branches}) + "PLR0913", # Too many arguments to function call ({c_args} > {max_args}) + "PLR0915", # Too many statements ({statements} > {max_statements}) + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target +] + +[tool.ruff.lint.isort] +force-sort-within-sections = true +known-first-party = [ + "esphome", +] +combine-as-imports = true +split-on-trailing-comma = false From c5b77f45902c7a3497278ecbadc6c4b799927d11 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Fri, 19 Jul 2024 06:35:41 +0200 Subject: [PATCH 032/164] [web_server] move v1 code to separate file (#7091) --- esphome/components/web_server/web_server.cpp | 209 ----------------- .../components/web_server/web_server_v1.cpp | 217 ++++++++++++++++++ 2 files changed, 217 insertions(+), 209 deletions(-) create mode 100644 esphome/components/web_server/web_server_v1.cpp diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 9a1641e86f..6fb04f558a 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -46,29 +46,6 @@ static const char *const HEADER_CORS_REQ_PNA = "Access-Control-Request-Private-N static const char *const HEADER_CORS_ALLOW_PNA = "Access-Control-Allow-Private-Network"; #endif -#if USE_WEBSERVER_VERSION == 1 -void write_row(AsyncResponseStream *stream, EntityBase *obj, const std::string &klass, const std::string &action, - const std::function &action_func = nullptr) { - stream->print("print(klass.c_str()); - if (obj->is_internal()) - stream->print(" internal"); - stream->print("\" id=\""); - stream->print(klass.c_str()); - stream->print("-"); - stream->print(obj->get_object_id().c_str()); - stream->print("\">"); - stream->print(obj->get_name().c_str()); - stream->print(""); - stream->print(action.c_str()); - if (action_func) { - action_func(*stream, obj); - } - stream->print(""); - stream->print(""); -} -#endif - UrlMatch match_url(const std::string &url, bool only_domain = false) { UrlMatch match; match.valid = false; @@ -102,11 +79,6 @@ WebServer::WebServer(web_server_base::WebServerBase *base) #endif } -#if USE_WEBSERVER_VERSION == 1 -void WebServer::set_css_url(const char *css_url) { this->css_url_ = css_url; } -void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; } -#endif - #ifdef USE_WEBSERVER_CSS_INCLUDE void WebServer::set_css_include(const char *css_include) { this->css_include_ = css_include; } #endif @@ -181,187 +153,6 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) { response->addHeader("Content-Encoding", "gzip"); request->send(response); } -#elif USE_WEBSERVER_VERSION == 1 -void WebServer::handle_index_request(AsyncWebServerRequest *request) { - AsyncResponseStream *stream = request->beginResponseStream("text/html"); - const std::string &title = App.get_name(); - stream->print(F("")); - stream->print(title.c_str()); - stream->print(F("")); -#ifdef USE_WEBSERVER_CSS_INCLUDE - stream->print(F("")); -#endif - if (strlen(this->css_url_) > 0) { - stream->print(F(R"(print(this->css_url_); - stream->print(F("\">")); - } - stream->print(F("")); - stream->print(F("

")); - stream->print(title.c_str()); - stream->print(F("

")); - stream->print(F("

States

")); - -#ifdef USE_SENSOR - for (auto *obj : App.get_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "sensor", ""); - } -#endif - -#ifdef USE_SWITCH - for (auto *obj : App.get_switches()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "switch", ""); - } -#endif - -#ifdef USE_BUTTON - for (auto *obj : App.get_buttons()) - write_row(stream, obj, "button", ""); -#endif - -#ifdef USE_BINARY_SENSOR - for (auto *obj : App.get_binary_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "binary_sensor", ""); - } -#endif - -#ifdef USE_FAN - for (auto *obj : App.get_fans()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "fan", ""); - } -#endif - -#ifdef USE_LIGHT - for (auto *obj : App.get_lights()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "light", ""); - } -#endif - -#ifdef USE_TEXT_SENSOR - for (auto *obj : App.get_text_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "text_sensor", ""); - } -#endif - -#ifdef USE_COVER - for (auto *obj : App.get_covers()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "cover", ""); - } -#endif - -#ifdef USE_NUMBER - for (auto *obj : App.get_numbers()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) { - number::Number *number = (number::Number *) obj; - stream.print(R"(traits.get_min_value()); - stream.print(R"(" max=")"); - stream.print(number->traits.get_max_value()); - stream.print(R"(" step=")"); - stream.print(number->traits.get_step()); - stream.print(R"(" value=")"); - stream.print(number->state); - stream.print(R"("/>)"); - }); - } - } -#endif - -#ifdef USE_TEXT - for (auto *obj : App.get_texts()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "text", "", [](AsyncResponseStream &stream, EntityBase *obj) { - text::Text *text = (text::Text *) obj; - auto mode = (int) text->traits.get_mode(); - stream.print(R"(traits.get_min_length()); - stream.print(R"(" maxlength=")"); - stream.print(text->traits.get_max_length()); - stream.print(R"(" pattern=")"); - stream.print(text->traits.get_pattern().c_str()); - stream.print(R"(" value=")"); - stream.print(text->state.c_str()); - stream.print(R"("/>)"); - }); - } - } -#endif - -#ifdef USE_SELECT - for (auto *obj : App.get_selects()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, EntityBase *obj) { - select::Select *select = (select::Select *) obj; - stream.print(""); - }); - } - } -#endif - -#ifdef USE_LOCK - for (auto *obj : App.get_locks()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "lock", "", [](AsyncResponseStream &stream, EntityBase *obj) { - lock::Lock *lock = (lock::Lock *) obj; - stream.print(""); - if (lock->traits.get_supports_open()) { - stream.print(""); - } - }); - } - } -#endif - -#ifdef USE_CLIMATE - for (auto *obj : App.get_climates()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "climate", ""); - } -#endif - - stream->print(F("
NameStateActions

See ESPHome Web API for " - "REST API documentation.

")); - if (this->allow_ota_) { - stream->print( - F("

OTA Update

")); - } - stream->print(F("

Debug Log

"));
-#ifdef USE_WEBSERVER_JS_INCLUDE
-  if (this->js_include_ != nullptr) {
-    stream->print(F(""));
-  }
-#endif
-  if (strlen(this->js_url_) > 0) {
-    stream->print(F(""));
-  }
-  stream->print(F("
")); - request->send(stream); -} #elif USE_WEBSERVER_VERSION >= 2 void WebServer::handle_index_request(AsyncWebServerRequest *request) { AsyncWebServerResponse *response = diff --git a/esphome/components/web_server/web_server_v1.cpp b/esphome/components/web_server/web_server_v1.cpp new file mode 100644 index 0000000000..c9b38a2dc4 --- /dev/null +++ b/esphome/components/web_server/web_server_v1.cpp @@ -0,0 +1,217 @@ +#include "web_server.h" +#include "esphome/core/application.h" + +#if USE_WEBSERVER_VERSION == 1 + +namespace esphome { +namespace web_server { + +void write_row(AsyncResponseStream *stream, EntityBase *obj, const std::string &klass, const std::string &action, + const std::function &action_func = nullptr) { + stream->print("print(klass.c_str()); + if (obj->is_internal()) + stream->print(" internal"); + stream->print("\" id=\""); + stream->print(klass.c_str()); + stream->print("-"); + stream->print(obj->get_object_id().c_str()); + stream->print("\">"); + stream->print(obj->get_name().c_str()); + stream->print(""); + stream->print(action.c_str()); + if (action_func) { + action_func(*stream, obj); + } + stream->print(""); + stream->print(""); +} + +void WebServer::set_css_url(const char *css_url) { this->css_url_ = css_url; } + +void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; } + +void WebServer::handle_index_request(AsyncWebServerRequest *request) { + AsyncResponseStream *stream = request->beginResponseStream("text/html"); + const std::string &title = App.get_name(); + stream->print(F("")); + stream->print(title.c_str()); + stream->print(F("")); +#ifdef USE_WEBSERVER_CSS_INCLUDE + stream->print(F("")); +#endif + if (strlen(this->css_url_) > 0) { + stream->print(F(R"(print(this->css_url_); + stream->print(F("\">")); + } + stream->print(F("")); + stream->print(F("

")); + stream->print(title.c_str()); + stream->print(F("

")); + stream->print(F("

States

")); + +#ifdef USE_SENSOR + for (auto *obj : App.get_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "sensor", ""); + } +#endif + +#ifdef USE_SWITCH + for (auto *obj : App.get_switches()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "switch", ""); + } +#endif + +#ifdef USE_BUTTON + for (auto *obj : App.get_buttons()) + write_row(stream, obj, "button", ""); +#endif + +#ifdef USE_BINARY_SENSOR + for (auto *obj : App.get_binary_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "binary_sensor", ""); + } +#endif + +#ifdef USE_FAN + for (auto *obj : App.get_fans()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "fan", ""); + } +#endif + +#ifdef USE_LIGHT + for (auto *obj : App.get_lights()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "light", ""); + } +#endif + +#ifdef USE_TEXT_SENSOR + for (auto *obj : App.get_text_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "text_sensor", ""); + } +#endif + +#ifdef USE_COVER + for (auto *obj : App.get_covers()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "cover", ""); + } +#endif + +#ifdef USE_NUMBER + for (auto *obj : App.get_numbers()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) { + number::Number *number = (number::Number *) obj; + stream.print(R"(traits.get_min_value()); + stream.print(R"(" max=")"); + stream.print(number->traits.get_max_value()); + stream.print(R"(" step=")"); + stream.print(number->traits.get_step()); + stream.print(R"(" value=")"); + stream.print(number->state); + stream.print(R"("/>)"); + }); + } + } +#endif + +#ifdef USE_TEXT + for (auto *obj : App.get_texts()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "text", "", [](AsyncResponseStream &stream, EntityBase *obj) { + text::Text *text = (text::Text *) obj; + auto mode = (int) text->traits.get_mode(); + stream.print(R"(traits.get_min_length()); + stream.print(R"(" maxlength=")"); + stream.print(text->traits.get_max_length()); + stream.print(R"(" pattern=")"); + stream.print(text->traits.get_pattern().c_str()); + stream.print(R"(" value=")"); + stream.print(text->state.c_str()); + stream.print(R"("/>)"); + }); + } + } +#endif + +#ifdef USE_SELECT + for (auto *obj : App.get_selects()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, EntityBase *obj) { + select::Select *select = (select::Select *) obj; + stream.print(""); + }); + } + } +#endif + +#ifdef USE_LOCK + for (auto *obj : App.get_locks()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "lock", "", [](AsyncResponseStream &stream, EntityBase *obj) { + lock::Lock *lock = (lock::Lock *) obj; + stream.print(""); + if (lock->traits.get_supports_open()) { + stream.print(""); + } + }); + } + } +#endif + +#ifdef USE_CLIMATE + for (auto *obj : App.get_climates()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "climate", ""); + } +#endif + + stream->print(F("
NameStateActions

See ESPHome Web API for " + "REST API documentation.

")); + if (this->allow_ota_) { + stream->print( + F("

OTA Update

")); + } + stream->print(F("

Debug Log

"));
+#ifdef USE_WEBSERVER_JS_INCLUDE
+  if (this->js_include_ != nullptr) {
+    stream->print(F(""));
+  }
+#endif
+  if (strlen(this->js_url_) > 0) {
+    stream->print(F(""));
+  }
+  stream->print(F("
")); + request->send(stream); +} + +} // namespace web_server +} // namespace esphome +#endif From 32b927de7e319a4a1357a047959d365ccb85e919 Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Fri, 19 Jul 2024 15:15:11 -0400 Subject: [PATCH 033/164] revert bit shift to match previous behavior (#7109) --- .../components/i2s_audio/microphone/i2s_audio_microphone.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp index 009fecdf90..cb49a744fc 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp @@ -174,7 +174,8 @@ size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) { size_t samples_read = bytes_read / sizeof(int32_t); samples.resize(samples_read); for (size_t i = 0; i < samples_read; i++) { - samples[i] = reinterpret_cast(buf)[i] >> 16; + int32_t temp = reinterpret_cast(buf)[i] >> 14; + samples[i] = clamp(temp, INT16_MIN, INT16_MAX); } memcpy(buf, samples.data(), samples_read * sizeof(int16_t)); return samples_read * sizeof(int16_t); From 43b818f2b1ca949ccc1ec216db9b5682e051541c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 22 Jul 2024 07:54:16 +1200 Subject: [PATCH 034/164] [validation] Add ``host`` to ``require_framework_version`` (#7107) --- esphome/config_validation.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 7259e3c062..3ef92ad460 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -829,7 +829,6 @@ def time_of_day(value): def date_time(date: bool, time: bool): - pattern_str = r"^" # Start of string if date: pattern_str += r"\d{4}-\d{1,2}-\d{1,2}" @@ -2031,6 +2030,7 @@ def require_framework_version( esp32_arduino=None, esp8266_arduino=None, rp2040_arduino=None, + host=None, max_version=False, extra_message=None, ): @@ -2065,6 +2065,13 @@ def require_framework_version( msg += f". {extra_message}" raise Invalid(msg) required = rp2040_arduino + elif CORE.is_host and framework == "host": + if host is None: + msg = "This feature is incompatible with host platform" + if extra_message: + msg += f". {extra_message}" + raise Invalid(msg) + required = host else: raise Invalid( f""" From cfb20abb9f0e7fc0b25b4cc792a560b4d91eb748 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 22 Jul 2024 08:09:06 +1200 Subject: [PATCH 035/164] [code-quality] Tidy up some duplicate CONFIG_SCHEMA assignments (#7106) --- esphome/components/ade7953/sensor.py | 2 +- esphome/components/bmp3xx/sensor.py | 2 +- esphome/components/ens160/sensor.py | 2 +- esphome/components/kalman_combinator/sensor.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/components/ade7953/sensor.py b/esphome/components/ade7953/sensor.py index 0caa2ef454..fc79888129 100644 --- a/esphome/components/ade7953/sensor.py +++ b/esphome/components/ade7953/sensor.py @@ -1,5 +1,5 @@ import esphome.config_validation as cv -CONFIG_SCHEMA = CONFIG_SCHEMA = cv.invalid( +CONFIG_SCHEMA = cv.invalid( "The ade7953 sensor component has been renamed to ade7953_i2c." ) diff --git a/esphome/components/bmp3xx/sensor.py b/esphome/components/bmp3xx/sensor.py index 89753768c3..3c7927f1a8 100644 --- a/esphome/components/bmp3xx/sensor.py +++ b/esphome/components/bmp3xx/sensor.py @@ -2,6 +2,6 @@ import esphome.config_validation as cv CODEOWNERS = ["@latonita"] -CONFIG_SCHEMA = CONFIG_SCHEMA = cv.invalid( +CONFIG_SCHEMA = cv.invalid( "The bmp3xx sensor component has been renamed to bmp3xx_i2c." ) diff --git a/esphome/components/ens160/sensor.py b/esphome/components/ens160/sensor.py index f666b530b3..441671fb7b 100644 --- a/esphome/components/ens160/sensor.py +++ b/esphome/components/ens160/sensor.py @@ -2,6 +2,6 @@ import esphome.config_validation as cv CODEOWNERS = ["@latonita"] -CONFIG_SCHEMA = CONFIG_SCHEMA = cv.invalid( +CONFIG_SCHEMA = cv.invalid( "The ens160 sensor component has been renamed to ens160_i2c." ) diff --git a/esphome/components/kalman_combinator/sensor.py b/esphome/components/kalman_combinator/sensor.py index eca1ba7b85..c19a17462d 100644 --- a/esphome/components/kalman_combinator/sensor.py +++ b/esphome/components/kalman_combinator/sensor.py @@ -1,6 +1,6 @@ import esphome.config_validation as cv -CONFIG_SCHEMA = CONFIG_SCHEMA = cv.invalid( +CONFIG_SCHEMA = cv.invalid( "The kalman_combinator sensor has moved.\nPlease use the combination platform instead with type: kalman.\n" "See https://esphome.io/components/sensor/combination.html" ) From fbc830176f612a341b5ace5418ab4f76cd4a578c Mon Sep 17 00:00:00 2001 From: Lucio Tarantino Date: Sun, 21 Jul 2024 23:16:51 +0200 Subject: [PATCH 036/164] [heatpumpir] Fix BK72XX Compile error with IRremoteESP8266 (#6955) --- esphome/components/heatpumpir/climate.py | 3 +++ tests/components/heatpumpir/test.bk72xx-ard.yaml | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index 80900d7db9..9d31668deb 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_PROTOCOL, CONF_VISUAL, ) +from esphome.core import CORE CODEOWNERS = ["@rob-deutsch"] @@ -127,3 +128,5 @@ def to_code(config): cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) cg.add_library("tonia/HeatpumpIR", "1.0.27") + if CORE.is_libretiny: + CORE.add_platformio_option("lib_ignore", "IRremoteESP8266") diff --git a/tests/components/heatpumpir/test.bk72xx-ard.yaml b/tests/components/heatpumpir/test.bk72xx-ard.yaml index 90259f1244..b616f9157c 100644 --- a/tests/components/heatpumpir/test.bk72xx-ard.yaml +++ b/tests/components/heatpumpir/test.bk72xx-ard.yaml @@ -3,6 +3,13 @@ remote_transmitter: carrier_duty_percent: 50% climate: + - platform: heatpumpir + protocol: mitsubishi_heavy_zm + horizontal_default: left + vertical_default: up + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 - platform: heatpumpir protocol: daikin horizontal_default: mleft From 368662969ed4c4df267499c720497d195acbed06 Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Sun, 21 Jul 2024 23:36:46 +0200 Subject: [PATCH 037/164] Move MQTT ip discovery to deticated config option. (#6673) --- esphome/components/mqtt/__init__.py | 8 ++++++++ esphome/components/mqtt/mqtt_client.cpp | 18 +++++++++++++++--- esphome/components/mqtt/mqtt_client.h | 6 +++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py index 96a02cb60e..f4bd34bfd3 100644 --- a/esphome/components/mqtt/__init__.py +++ b/esphome/components/mqtt/__init__.py @@ -61,6 +61,7 @@ def AUTO_LOAD(): return ["json"] +CONF_DISCOVER_IP = "discover_ip" CONF_IDF_SEND_ASYNC = "idf_send_async" CONF_SKIP_CERT_CN_CHECK = "skip_cert_cn_check" @@ -225,6 +226,7 @@ CONFIG_SCHEMA = cv.All( cv.boolean, cv.one_of("CLEAN", upper=True) ), cv.Optional(CONF_DISCOVERY_RETAIN, default=True): cv.boolean, + cv.Optional(CONF_DISCOVER_IP, default=True): cv.boolean, cv.Optional( CONF_DISCOVERY_PREFIX, default="homeassistant" ): cv.publish_topic, @@ -328,8 +330,12 @@ async def to_code(config): discovery_prefix = config[CONF_DISCOVERY_PREFIX] discovery_unique_id_generator = config[CONF_DISCOVERY_UNIQUE_ID_GENERATOR] discovery_object_id_generator = config[CONF_DISCOVERY_OBJECT_ID_GENERATOR] + discover_ip = config[CONF_DISCOVER_IP] if not discovery: + discovery_prefix = "" + + if not discovery and not discover_ip: cg.add(var.disable_discovery()) elif discovery == "CLEAN": cg.add( @@ -338,6 +344,7 @@ async def to_code(config): discovery_unique_id_generator, discovery_object_id_generator, discovery_retain, + discover_ip, True, ) ) @@ -348,6 +355,7 @@ async def to_code(config): discovery_unique_id_generator, discovery_object_id_generator, discovery_retain, + discover_ip, ) ) diff --git a/esphome/components/mqtt/mqtt_client.cpp b/esphome/components/mqtt/mqtt_client.cpp index d70b9cbd30..876367aaea 100644 --- a/esphome/components/mqtt/mqtt_client.cpp +++ b/esphome/components/mqtt/mqtt_client.cpp @@ -66,7 +66,7 @@ void MQTTClientComponent::setup() { } #endif - if (this->is_discovery_enabled()) { + if (this->is_discovery_ip_enabled()) { this->subscribe( "esphome/discover", [this](const std::string &topic, const std::string &payload) { this->send_device_info_(); }, 2); @@ -82,7 +82,7 @@ void MQTTClientComponent::setup() { } void MQTTClientComponent::send_device_info_() { - if (!this->is_connected() or !this->is_discovery_enabled()) { + if (!this->is_connected() or !this->is_discovery_ip_enabled()) { return; } std::string topic = "esphome/discover/"; @@ -99,6 +99,9 @@ void MQTTClientComponent::send_device_info_() { } } root["name"] = App.get_name(); + if (!App.get_friendly_name().empty()) { + root["friendly_name"] = App.get_friendly_name(); + } #ifdef USE_API root["port"] = api::global_api_server->get_port(); #endif @@ -130,6 +133,10 @@ void MQTTClientComponent::send_device_info_() { #ifdef USE_DASHBOARD_IMPORT root["package_import_url"] = dashboard_import::get_package_import_url(); #endif + +#ifdef USE_API_NOISE + root["api_encryption"] = "Noise_NNpsk0_25519_ChaChaPoly_SHA256"; +#endif }, 2, this->discovery_info_.retain); } @@ -140,6 +147,9 @@ void MQTTClientComponent::dump_config() { this->ip_.str().c_str()); ESP_LOGCONFIG(TAG, " Username: " LOG_SECRET("'%s'"), this->credentials_.username.c_str()); ESP_LOGCONFIG(TAG, " Client ID: " LOG_SECRET("'%s'"), this->credentials_.client_id.c_str()); + if (this->is_discovery_ip_enabled()) { + ESP_LOGCONFIG(TAG, " Discovery IP enabled"); + } if (!this->discovery_info_.prefix.empty()) { ESP_LOGCONFIG(TAG, " Discovery prefix: '%s'", this->discovery_info_.prefix.c_str()); ESP_LOGCONFIG(TAG, " Discovery retain: %s", YESNO(this->discovery_info_.retain)); @@ -581,6 +591,7 @@ void MQTTClientComponent::disable_shutdown_message() { this->recalculate_availability_(); } bool MQTTClientComponent::is_discovery_enabled() const { return !this->discovery_info_.prefix.empty(); } +bool MQTTClientComponent::is_discovery_ip_enabled() const { return this->discovery_info_.discover_ip; } const Availability &MQTTClientComponent::get_availability() { return this->availability_; } void MQTTClientComponent::recalculate_availability_() { if (this->birth_message_.topic.empty() || this->birth_message_.topic != this->last_will_.topic) { @@ -606,8 +617,9 @@ void MQTTClientComponent::set_shutdown_message(MQTTMessage &&message) { this->sh void MQTTClientComponent::set_discovery_info(std::string &&prefix, MQTTDiscoveryUniqueIdGenerator unique_id_generator, MQTTDiscoveryObjectIdGenerator object_id_generator, bool retain, - bool clean) { + bool discover_ip, bool clean) { this->discovery_info_.prefix = std::move(prefix); + this->discovery_info_.discover_ip = discover_ip; this->discovery_info_.unique_id_generator = unique_id_generator; this->discovery_info_.object_id_generator = object_id_generator; this->discovery_info_.retain = retain; diff --git a/esphome/components/mqtt/mqtt_client.h b/esphome/components/mqtt/mqtt_client.h index 454316aa87..b0d3bbe66d 100644 --- a/esphome/components/mqtt/mqtt_client.h +++ b/esphome/components/mqtt/mqtt_client.h @@ -79,6 +79,7 @@ enum MQTTDiscoveryObjectIdGenerator { struct MQTTDiscoveryInfo { std::string prefix; ///< The Home Assistant discovery prefix. Empty means disabled. bool retain; ///< Whether to retain discovery messages. + bool discover_ip; ///< Enable the Home Assistant device discovery. bool clean; MQTTDiscoveryUniqueIdGenerator unique_id_generator; MQTTDiscoveryObjectIdGenerator object_id_generator; @@ -122,12 +123,14 @@ class MQTTClientComponent : public Component { * @param retain Whether to retain discovery messages. */ void set_discovery_info(std::string &&prefix, MQTTDiscoveryUniqueIdGenerator unique_id_generator, - MQTTDiscoveryObjectIdGenerator object_id_generator, bool retain, bool clean = false); + MQTTDiscoveryObjectIdGenerator object_id_generator, bool retain, bool discover_ip, + bool clean = false); /// Get Home Assistant discovery info. const MQTTDiscoveryInfo &get_discovery_info() const; /// Globally disable Home Assistant discovery. void disable_discovery(); bool is_discovery_enabled() const; + bool is_discovery_ip_enabled() const; #if ASYNC_TCP_SSL_ENABLED /** Add a SSL fingerprint to use for TCP SSL connections to the MQTT broker. @@ -290,6 +293,7 @@ class MQTTClientComponent : public Component { MQTTDiscoveryInfo discovery_info_{ .prefix = "homeassistant", .retain = true, + .discover_ip = true, .clean = false, .unique_id_generator = MQTT_LEGACY_UNIQUE_ID_GENERATOR, .object_id_generator = MQTT_NONE_OBJECT_ID_GENERATOR, From 40e79299d55cd61e2f81b9f694e37ac3598c3d56 Mon Sep 17 00:00:00 2001 From: rnauber <7414650+rnauber@users.noreply.github.com> Date: Sun, 21 Jul 2024 23:57:59 +0200 Subject: [PATCH 038/164] Feature/m5angle8: Add support for m5angle8 input device (#6799) Co-authored-by: Richard Nauber Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 1 + esphome/components/m5stack_8angle/__init__.py | 33 +++++++++ .../m5stack_8angle/binary_sensor/__init__.py | 30 ++++++++ .../m5stack_8angle_binary_sensor.cpp | 17 +++++ .../m5stack_8angle_binary_sensor.h | 19 +++++ .../m5stack_8angle/light/__init__.py | 31 ++++++++ .../light/m5stack_8angle_light.cpp | 45 +++++++++++ .../light/m5stack_8angle_light.h | 37 ++++++++++ .../m5stack_8angle/m5stack_8angle.cpp | 74 +++++++++++++++++++ .../m5stack_8angle/m5stack_8angle.h | 34 +++++++++ .../m5stack_8angle/sensor/__init__.py | 66 +++++++++++++++++ .../sensor/m5stack_8angle_sensor.cpp | 24 ++++++ .../sensor/m5stack_8angle_sensor.h | 27 +++++++ tests/components/m5stack_8angle/common.yaml | 30 ++++++++ .../m5stack_8angle/test.esp32-ard.yaml | 1 + .../m5stack_8angle/test.esp32-c3-ard.yaml | 1 + .../m5stack_8angle/test.esp32-c3-idf.yaml | 1 + .../m5stack_8angle/test.esp32-idf.yaml | 1 + .../m5stack_8angle/test.esp8266-ard.yaml | 1 + .../m5stack_8angle/test.rp2040-ard.yaml | 1 + 20 files changed, 474 insertions(+) create mode 100644 esphome/components/m5stack_8angle/__init__.py create mode 100644 esphome/components/m5stack_8angle/binary_sensor/__init__.py create mode 100644 esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp create mode 100644 esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.h create mode 100644 esphome/components/m5stack_8angle/light/__init__.py create mode 100644 esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp create mode 100644 esphome/components/m5stack_8angle/light/m5stack_8angle_light.h create mode 100644 esphome/components/m5stack_8angle/m5stack_8angle.cpp create mode 100644 esphome/components/m5stack_8angle/m5stack_8angle.h create mode 100644 esphome/components/m5stack_8angle/sensor/__init__.py create mode 100644 esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp create mode 100644 esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.h create mode 100644 tests/components/m5stack_8angle/common.yaml create mode 100644 tests/components/m5stack_8angle/test.esp32-ard.yaml create mode 100644 tests/components/m5stack_8angle/test.esp32-c3-ard.yaml create mode 100644 tests/components/m5stack_8angle/test.esp32-c3-idf.yaml create mode 100644 tests/components/m5stack_8angle/test.esp32-idf.yaml create mode 100644 tests/components/m5stack_8angle/test.esp8266-ard.yaml create mode 100644 tests/components/m5stack_8angle/test.rp2040-ard.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 210c567f78..ee76a072fc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -216,6 +216,7 @@ esphome/components/lock/* @esphome/core esphome/components/logger/* @esphome/core esphome/components/ltr390/* @latonita @sjtrny esphome/components/ltr_als_ps/* @latonita +esphome/components/m5stack_8angle/* @rnauber esphome/components/matrix_keypad/* @ssieb esphome/components/max31865/* @DAVe3283 esphome/components/max44009/* @berfenger diff --git a/esphome/components/m5stack_8angle/__init__.py b/esphome/components/m5stack_8angle/__init__.py new file mode 100644 index 0000000000..1aaa86a6fd --- /dev/null +++ b/esphome/components/m5stack_8angle/__init__.py @@ -0,0 +1,33 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import i2c +from esphome.const import CONF_ID + + +DEPENDENCIES = ["i2c"] +CODEOWNERS = ["@rnauber"] +MULTI_CONF = True + +CONF_M5STACK_8ANGLE_ID = "m5stack_8angle_id" + +m5stack_8angle_ns = cg.esphome_ns.namespace("m5stack_8angle") +M5Stack8AngleComponent = m5stack_8angle_ns.class_( + "M5Stack8AngleComponent", + i2c.I2CDevice, + cg.Component, +) + +AnalogBits = m5stack_8angle_ns.enum("AnalogBits") + + +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.declare_id(M5Stack8AngleComponent), + } +).extend(i2c.i2c_device_schema(0x43)) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + await i2c.register_i2c_device(var, config) diff --git a/esphome/components/m5stack_8angle/binary_sensor/__init__.py b/esphome/components/m5stack_8angle/binary_sensor/__init__.py new file mode 100644 index 0000000000..a8b2690083 --- /dev/null +++ b/esphome/components/m5stack_8angle/binary_sensor/__init__.py @@ -0,0 +1,30 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import binary_sensor + +from .. import M5Stack8AngleComponent, m5stack_8angle_ns, CONF_M5STACK_8ANGLE_ID + + +M5Stack8AngleSwitchBinarySensor = m5stack_8angle_ns.class_( + "M5Stack8AngleSwitchBinarySensor", + binary_sensor.BinarySensor, + cg.PollingComponent, +) + + +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(CONF_M5STACK_8ANGLE_ID): cv.use_id(M5Stack8AngleComponent), + } + ) + .extend(binary_sensor.binary_sensor_schema(M5Stack8AngleSwitchBinarySensor)) + .extend(cv.polling_component_schema("10s")) +) + + +async def to_code(config): + hub = await cg.get_variable(config[CONF_M5STACK_8ANGLE_ID]) + sens = await binary_sensor.new_binary_sensor(config) + cg.add(sens.set_parent(hub)) + await cg.register_component(sens, config) diff --git a/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp b/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp new file mode 100644 index 0000000000..2f68d9f254 --- /dev/null +++ b/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp @@ -0,0 +1,17 @@ +#include "m5stack_8angle_binary_sensor.h" + +namespace esphome { +namespace m5stack_8angle { + +void M5Stack8AngleSwitchBinarySensor::update() { + int8_t out = this->parent_->read_switch(); + if (out == -1) { + this->status_set_warning("Could not read binary sensor state from M5Stack 8Angle."); + return; + } + this->publish_state(out != 0); + this->status_clear_warning(); +} + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.h b/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.h new file mode 100644 index 0000000000..b8bb601525 --- /dev/null +++ b/esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.h @@ -0,0 +1,19 @@ +#pragma once + +#include "esphome/components/binary_sensor/binary_sensor.h" +#include "esphome/core/component.h" + +#include "../m5stack_8angle.h" + +namespace esphome { +namespace m5stack_8angle { + +class M5Stack8AngleSwitchBinarySensor : public binary_sensor::BinarySensor, + public PollingComponent, + public Parented { + public: + void update() override; +}; + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/light/__init__.py b/esphome/components/m5stack_8angle/light/__init__.py new file mode 100644 index 0000000000..07384ecd61 --- /dev/null +++ b/esphome/components/m5stack_8angle/light/__init__.py @@ -0,0 +1,31 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import light + +from esphome.const import CONF_OUTPUT_ID + +from .. import M5Stack8AngleComponent, m5stack_8angle_ns, CONF_M5STACK_8ANGLE_ID + + +M5Stack8AngleLightsComponent = m5stack_8angle_ns.class_( + "M5Stack8AngleLightOutput", + light.AddressableLight, +) + + +CONFIG_SCHEMA = cv.All( + light.ADDRESSABLE_LIGHT_SCHEMA.extend( + { + cv.GenerateID(CONF_M5STACK_8ANGLE_ID): cv.use_id(M5Stack8AngleComponent), + cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(M5Stack8AngleLightsComponent), + } + ) +) + + +async def to_code(config): + hub = await cg.get_variable(config[CONF_M5STACK_8ANGLE_ID]) + lights = cg.new_Pvariable(config[CONF_OUTPUT_ID]) + await light.register_light(lights, config) + await cg.register_component(lights, config) + cg.add(lights.set_parent(hub)) diff --git a/esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp b/esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp new file mode 100644 index 0000000000..95fd8cb98f --- /dev/null +++ b/esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp @@ -0,0 +1,45 @@ +#include "m5stack_8angle_light.h" + +#include "esphome/core/log.h" + +namespace esphome { +namespace m5stack_8angle { + +static const char *const TAG = "m5stack_8angle.light"; + +void M5Stack8AngleLightOutput::setup() { + ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); + this->buf_ = allocator.allocate(M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED); + if (this->buf_ == nullptr) { + ESP_LOGE(TAG, "Failed to allocate buffer of size %u", M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED); + this->mark_failed(); + return; + }; + memset(this->buf_, 0xFF, M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED); + + this->effect_data_ = allocator.allocate(M5STACK_8ANGLE_NUM_LEDS); + if (this->effect_data_ == nullptr) { + ESP_LOGE(TAG, "Failed to allocate effect data of size %u", M5STACK_8ANGLE_NUM_LEDS); + this->mark_failed(); + return; + }; + memset(this->effect_data_, 0x00, M5STACK_8ANGLE_NUM_LEDS); +} + +void M5Stack8AngleLightOutput::write_state(light::LightState *state) { + for (int i = 0; i < M5STACK_8ANGLE_NUM_LEDS; + i++) { // write one LED at a time, otherwise the message will be truncated + this->parent_->write_register(M5STACK_8ANGLE_REGISTER_RGB_24B + i * M5STACK_8ANGLE_BYTES_PER_LED, + this->buf_ + i * M5STACK_8ANGLE_BYTES_PER_LED, M5STACK_8ANGLE_BYTES_PER_LED); + } +} + +light::ESPColorView M5Stack8AngleLightOutput::get_view_internal(int32_t index) const { + size_t pos = index * M5STACK_8ANGLE_BYTES_PER_LED; + // red, green, blue, white, effect_data, color_correction + return {this->buf_ + pos, this->buf_ + pos + 1, this->buf_ + pos + 2, + nullptr, this->effect_data_ + index, &this->correction_}; +} + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/light/m5stack_8angle_light.h b/esphome/components/m5stack_8angle/light/m5stack_8angle_light.h new file mode 100644 index 0000000000..204f2c04c7 --- /dev/null +++ b/esphome/components/m5stack_8angle/light/m5stack_8angle_light.h @@ -0,0 +1,37 @@ +#pragma once + +#include "esphome/components/light/addressable_light.h" +#include "esphome/components/light/light_output.h" + +#include "../m5stack_8angle.h" + +namespace esphome { +namespace m5stack_8angle { + +static const uint8_t M5STACK_8ANGLE_NUM_LEDS = 9; +static const uint8_t M5STACK_8ANGLE_BYTES_PER_LED = 4; + +class M5Stack8AngleLightOutput : public light::AddressableLight, public Parented { + public: + void setup() override; + + void write_state(light::LightState *state) override; + + int32_t size() const override { return M5STACK_8ANGLE_NUM_LEDS; } + light::LightTraits get_traits() override { + auto traits = light::LightTraits(); + traits.set_supported_color_modes({light::ColorMode::RGB}); + return traits; + }; + + void clear_effect_data() override { memset(this->effect_data_, 0x00, M5STACK_8ANGLE_NUM_LEDS); }; + + protected: + light::ESPColorView get_view_internal(int32_t index) const override; + + uint8_t *buf_{nullptr}; + uint8_t *effect_data_{nullptr}; +}; + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/m5stack_8angle.cpp b/esphome/components/m5stack_8angle/m5stack_8angle.cpp new file mode 100644 index 0000000000..6a584eddbc --- /dev/null +++ b/esphome/components/m5stack_8angle/m5stack_8angle.cpp @@ -0,0 +1,74 @@ +#include "m5stack_8angle.h" +#include "esphome/core/hal.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace m5stack_8angle { + +static const char *const TAG = "m5stack_8angle"; + +void M5Stack8AngleComponent::setup() { + ESP_LOGCONFIG(TAG, "Setting up M5STACK_8ANGLE..."); + i2c::ErrorCode err; + + err = this->read(nullptr, 0); + if (err != i2c::NO_ERROR) { + ESP_LOGE(TAG, "I2C error %02X...", err); + this->mark_failed(); + return; + }; + + err = this->read_register(M5STACK_8ANGLE_REGISTER_FW_VERSION, &this->fw_version_, 1); + if (err != i2c::NO_ERROR) { + ESP_LOGE(TAG, "I2C error %02X...", err); + this->mark_failed(); + return; + }; +} + +void M5Stack8AngleComponent::dump_config() { + ESP_LOGCONFIG(TAG, "M5STACK_8ANGLE:"); + LOG_I2C_DEVICE(this); + ESP_LOGCONFIG(TAG, " Firmware version: %d ", this->fw_version_); +} + +float M5Stack8AngleComponent::read_knob_pos(uint8_t channel, AnalogBits bits) { + int32_t raw_pos = this->read_knob_pos_raw(channel, bits); + if (raw_pos == -1) { + return NAN; + } + return (float) raw_pos / ((1 << bits) - 1); +} + +int32_t M5Stack8AngleComponent::read_knob_pos_raw(uint8_t channel, AnalogBits bits) { + uint16_t knob_pos = 0; + i2c::ErrorCode err; + if (bits == BITS_8) { + err = this->read_register(M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_8B + channel, (uint8_t *) &knob_pos, 1); + } else if (bits == BITS_12) { + err = this->read_register(M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_12B + (channel * 2), (uint8_t *) &knob_pos, 2); + } else { + ESP_LOGE(TAG, "Invalid number of bits: %d", bits); + return -1; + } + if (err == i2c::NO_ERROR) { + return knob_pos; + } else { + return -1; + } +} + +int8_t M5Stack8AngleComponent::read_switch() { + uint8_t out; + i2c::ErrorCode err = this->read_register(M5STACK_8ANGLE_REGISTER_DIGITAL_INPUT, (uint8_t *) &out, 1); + if (err == i2c::NO_ERROR) { + return out ? 1 : 0; + } else { + return -1; + } +} + +float M5Stack8AngleComponent::get_setup_priority() const { return setup_priority::DATA; } + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/m5stack_8angle.h b/esphome/components/m5stack_8angle/m5stack_8angle.h new file mode 100644 index 0000000000..831b1422fd --- /dev/null +++ b/esphome/components/m5stack_8angle/m5stack_8angle.h @@ -0,0 +1,34 @@ +#pragma once + +#include "esphome/components/i2c/i2c.h" +#include "esphome/core/component.h" + +namespace esphome { +namespace m5stack_8angle { + +static const uint8_t M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_12B = 0x00; +static const uint8_t M5STACK_8ANGLE_REGISTER_ANALOG_INPUT_8B = 0x10; +static const uint8_t M5STACK_8ANGLE_REGISTER_DIGITAL_INPUT = 0x20; +static const uint8_t M5STACK_8ANGLE_REGISTER_RGB_24B = 0x30; +static const uint8_t M5STACK_8ANGLE_REGISTER_FW_VERSION = 0xFE; + +enum AnalogBits : uint8_t { + BITS_8 = 8, + BITS_12 = 12, +}; + +class M5Stack8AngleComponent : public i2c::I2CDevice, public Component { + public: + void setup() override; + void dump_config() override; + float get_setup_priority() const override; + float read_knob_pos(uint8_t channel, AnalogBits bits = AnalogBits::BITS_8); + int32_t read_knob_pos_raw(uint8_t channel, AnalogBits bits = AnalogBits::BITS_8); + int8_t read_switch(); + + protected: + uint8_t fw_version_; +}; + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/sensor/__init__.py b/esphome/components/m5stack_8angle/sensor/__init__.py new file mode 100644 index 0000000000..70744a59e6 --- /dev/null +++ b/esphome/components/m5stack_8angle/sensor/__init__.py @@ -0,0 +1,66 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import sensor + +from esphome.const import ( + CONF_BIT_DEPTH, + CONF_CHANNEL, + CONF_RAW, + ICON_ROTATE_RIGHT, + STATE_CLASS_MEASUREMENT, +) + +from .. import ( + AnalogBits, + M5Stack8AngleComponent, + m5stack_8angle_ns, + CONF_M5STACK_8ANGLE_ID, +) + + +M5Stack8AngleKnobSensor = m5stack_8angle_ns.class_( + "M5Stack8AngleKnobSensor", + sensor.Sensor, + cg.PollingComponent, +) + + +BIT_DEPTHS = { + 8: AnalogBits.BITS_8, + 12: AnalogBits.BITS_12, +} + +_validate_bits = cv.float_with_unit("bits", "bit") + + +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(M5Stack8AngleKnobSensor), + cv.GenerateID(CONF_M5STACK_8ANGLE_ID): cv.use_id(M5Stack8AngleComponent), + cv.Required(CONF_CHANNEL): cv.int_range(min=1, max=8), + cv.Optional(CONF_BIT_DEPTH, default="8bit"): cv.All( + _validate_bits, cv.enum(BIT_DEPTHS) + ), + cv.Optional(CONF_RAW, default=False): cv.boolean, + } + ) + .extend( + sensor.sensor_schema( + M5Stack8AngleKnobSensor, + accuracy_decimals=2, + icon=ICON_ROTATE_RIGHT, + state_class=STATE_CLASS_MEASUREMENT, + ) + ) + .extend(cv.polling_component_schema("10s")) +) + + +async def to_code(config): + var = await sensor.new_sensor(config) + await cg.register_component(var, config) + await cg.register_parented(var, config[CONF_M5STACK_8ANGLE_ID]) + cg.add(var.set_channel(config[CONF_CHANNEL] - 1)) + cg.add(var.set_bit_depth(BIT_DEPTHS[config[CONF_BIT_DEPTH]])) + cg.add(var.set_raw(config[CONF_RAW])) diff --git a/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp b/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp new file mode 100644 index 0000000000..5e034f1dd3 --- /dev/null +++ b/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp @@ -0,0 +1,24 @@ +#include "m5stack_8angle_sensor.h" + +namespace esphome { +namespace m5stack_8angle { + +void M5Stack8AngleKnobSensor::update() { + if (this->parent_ != nullptr) { + int32_t raw_pos = this->parent_->read_knob_pos_raw(this->channel_, this->bits_); + if (raw_pos == -1) { + this->status_set_warning("Could not read knob position from M5Stack 8Angle."); + return; + } + if (this->raw_) { + this->publish_state(raw_pos); + } else { + float knob_pos = (float) raw_pos / ((1 << this->bits_) - 1); + this->publish_state(knob_pos); + } + this->status_clear_warning(); + }; +} + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.h b/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.h new file mode 100644 index 0000000000..4848f8f80f --- /dev/null +++ b/esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.h @@ -0,0 +1,27 @@ +#pragma once + +#include "esphome/components/sensor/sensor.h" +#include "esphome/core/component.h" + +#include "../m5stack_8angle.h" + +namespace esphome { +namespace m5stack_8angle { + +class M5Stack8AngleKnobSensor : public sensor::Sensor, + public PollingComponent, + public Parented { + public: + void update() override; + void set_channel(uint8_t channel) { this->channel_ = channel; }; + void set_bit_depth(AnalogBits bits) { this->bits_ = bits; }; + void set_raw(bool raw) { this->raw_ = raw; }; + + protected: + uint8_t channel_; + AnalogBits bits_; + bool raw_; +}; + +} // namespace m5stack_8angle +} // namespace esphome diff --git a/tests/components/m5stack_8angle/common.yaml b/tests/components/m5stack_8angle/common.yaml new file mode 100644 index 0000000000..d7f988ed3a --- /dev/null +++ b/tests/components/m5stack_8angle/common.yaml @@ -0,0 +1,30 @@ +i2c: + sda: 0 + scl: 1 + id: bus_external + +m5stack_8angle: + i2c_id: bus_external + id: m5stack_8angle_base + +light: + - platform: m5stack_8angle + m5stack_8angle_id: m5stack_8angle_base + id: m8_angle_leds + name: Lights + effects: + - addressable_scan: + +sensor: + - platform: m5stack_8angle + m5stack_8angle_id: m5stack_8angle_base + channel: 1 + name: Knob 1 + - platform: m5stack_8angle + m5stack_8angle_id: m5stack_8angle_base + channel: 2 + name: Knob 2 +binary_sensor: + - platform: m5stack_8angle + m5stack_8angle_id: m5stack_8angle_base + name: Switch diff --git a/tests/components/m5stack_8angle/test.esp32-ard.yaml b/tests/components/m5stack_8angle/test.esp32-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/m5stack_8angle/test.esp32-c3-ard.yaml b/tests/components/m5stack_8angle/test.esp32-c3-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/m5stack_8angle/test.esp32-c3-idf.yaml b/tests/components/m5stack_8angle/test.esp32-c3-idf.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/m5stack_8angle/test.esp32-idf.yaml b/tests/components/m5stack_8angle/test.esp32-idf.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/m5stack_8angle/test.esp8266-ard.yaml b/tests/components/m5stack_8angle/test.esp8266-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/m5stack_8angle/test.rp2040-ard.yaml b/tests/components/m5stack_8angle/test.rp2040-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/m5stack_8angle/test.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From 1f4829598a62424170fdd3fcc58dcc4bd2224162 Mon Sep 17 00:00:00 2001 From: Olivier ARCHER Date: Mon, 22 Jul 2024 01:29:09 +0200 Subject: [PATCH 039/164] [http_request] allow basic auth for idf (#7086) --- esphome/components/http_request/http_request_idf.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index d6fac7a133..68e0639b99 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -52,6 +52,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin config.timeout_ms = this->timeout_; config.disable_auto_redirect = !this->follow_redirects_; config.max_redirection_count = this->redirect_limit_; + config.auth_type = HTTP_AUTH_TYPE_BASIC; #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE if (secure) { config.crt_bundle_attach = esp_crt_bundle_attach; From f322ec8f3d1f70543578f0ec179d0049681c48c8 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Mon, 22 Jul 2024 01:33:26 +0200 Subject: [PATCH 040/164] use cache to build tests for compoenents (#7059) --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45fe336d77..a8e93248bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -468,6 +468,8 @@ jobs: - name: Compile config run: | . venv/bin/activate + mkdir build_cache + export PLATFORMIO_BUILD_CACHE_DIR=$PWD/build_cache for component in ${{ matrix.components }}; do ./script/test_build_components -e compile -c $component done From a464e46d4d5630f6fe18d5bcffe7026739fd8254 Mon Sep 17 00:00:00 2001 From: irgendwienet Date: Mon, 22 Jul 2024 01:42:09 +0200 Subject: [PATCH 041/164] Fixes sml parser to process extended length lists with a number of items that is dividable by 16 (#6148) --- esphome/components/sml/sml_parser.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/sml/sml_parser.cpp b/esphome/components/sml/sml_parser.cpp index 3b23522b21..c782c0fc5e 100644 --- a/esphome/components/sml/sml_parser.cpp +++ b/esphome/components/sml/sml_parser.cpp @@ -27,7 +27,7 @@ bool SmlFile::setup_node(SmlNode *node) { uint8_t parse_length = length; if (has_extended_length) { length = (length << 4) + (this->buffer_[this->pos_ + 1] & 0x0f); - parse_length = length - 1; + parse_length = length; this->pos_ += 1; } @@ -37,7 +37,9 @@ bool SmlFile::setup_node(SmlNode *node) { node->type = type & 0x07; node->nodes.clear(); node->value_bytes.clear(); - if (this->buffer_[this->pos_] == 0x00) { // end of message + + // if the list is a has_extended_length list with e.g. 16 elements this is a 0x00 byte but not the end of message + if (!has_extended_length && this->buffer_[this->pos_] == 0x00) { // end of message this->pos_ += 1; } else if (is_list) { // list this->pos_ += 1; From 0a7d8836339ffc59c37d3363414a827ff4cf42ec Mon Sep 17 00:00:00 2001 From: leejoow Date: Mon, 22 Jul 2024 03:33:11 +0200 Subject: [PATCH 042/164] [modbus_controller] Add on_command_sent trigger (#7078) Co-authored-by: Leo Schelvis --- .../components/modbus_controller/__init__.py | 28 +++++++++++++++++-- .../components/modbus_controller/automation.h | 19 +++++++++++++ esphome/components/modbus_controller/const.py | 1 + .../modbus_controller/modbus_controller.cpp | 8 ++++++ .../modbus_controller/modbus_controller.h | 3 ++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 esphome/components/modbus_controller/automation.h diff --git a/esphome/components/modbus_controller/__init__.py b/esphome/components/modbus_controller/__init__.py index b8ab48fcc6..1d0f406783 100644 --- a/esphome/components/modbus_controller/__init__.py +++ b/esphome/components/modbus_controller/__init__.py @@ -1,8 +1,16 @@ import binascii import esphome.codegen as cg import esphome.config_validation as cv +from esphome import automation from esphome.components import modbus -from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_LAMBDA, CONF_OFFSET +from esphome.const import ( + CONF_ADDRESS, + CONF_ID, + CONF_NAME, + CONF_LAMBDA, + CONF_OFFSET, + CONF_TRIGGER_ID, +) from esphome.cpp_helpers import logging from .const import ( CONF_BITMASK, @@ -12,6 +20,7 @@ from .const import ( CONF_CUSTOM_COMMAND, CONF_FORCE_NEW_RANGE, CONF_MODBUS_CONTROLLER_ID, + CONF_ON_COMMAND_SENT, CONF_REGISTER_COUNT, CONF_REGISTER_TYPE, CONF_RESPONSE_SIZE, @@ -97,6 +106,10 @@ TYPE_REGISTER_MAP = { "FP32_R": 2, } +ModbusCommandSentTrigger = modbus_controller_ns.class_( + "ModbusCommandSentTrigger", automation.Trigger.template(cg.int_, cg.int_) +) + _LOGGER = logging.getLogger(__name__) ModbusServerRegisterSchema = cv.Schema( @@ -120,13 +133,19 @@ CONFIG_SCHEMA = cv.All( cv.Optional( CONF_SERVER_REGISTERS, ): cv.ensure_list(ModbusServerRegisterSchema), + cv.Optional(CONF_ON_COMMAND_SENT): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( + ModbusCommandSentTrigger + ), + } + ), } ) .extend(cv.polling_component_schema("60s")) .extend(modbus.modbus_device_schema(0x01)) ) - ModbusItemBaseSchema = cv.Schema( { cv.GenerateID(CONF_MODBUS_CONTROLLER_ID): cv.use_id(ModbusController), @@ -254,6 +273,11 @@ async def to_code(config): ) ) await register_modbus_device(var, config) + for conf in config.get(CONF_ON_COMMAND_SENT, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation( + trigger, [(int, "function_code"), (int, "address")], conf + ) async def register_modbus_device(var, config): diff --git a/esphome/components/modbus_controller/automation.h b/esphome/components/modbus_controller/automation.h new file mode 100644 index 0000000000..ad8de4b05d --- /dev/null +++ b/esphome/components/modbus_controller/automation.h @@ -0,0 +1,19 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/automation.h" +#include "esphome/components/modbus_controller/modbus_controller.h" + +namespace esphome { +namespace modbus_controller { + +class ModbusCommandSentTrigger : public Trigger { + public: + ModbusCommandSentTrigger(ModbusController *a_modbuscontroller) { + a_modbuscontroller->add_on_command_sent_callback( + [this](int function_code, int address) { this->trigger(function_code, address); }); + } +}; + +} // namespace modbus_controller +} // namespace esphome diff --git a/esphome/components/modbus_controller/const.py b/esphome/components/modbus_controller/const.py index 1a23640e17..1f5c39895c 100644 --- a/esphome/components/modbus_controller/const.py +++ b/esphome/components/modbus_controller/const.py @@ -6,6 +6,7 @@ CONF_CUSTOM_COMMAND = "custom_command" CONF_FORCE_NEW_RANGE = "force_new_range" CONF_MODBUS_CONTROLLER_ID = "modbus_controller_id" CONF_MODBUS_FUNCTIONCODE = "modbus_functioncode" +CONF_ON_COMMAND_SENT = "on_command_sent" CONF_RAW_ENCODE = "raw_encode" CONF_REGISTER_COUNT = "register_count" CONF_REGISTER_TYPE = "register_type" diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index 29d3137603..378e5c06c0 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -43,7 +43,11 @@ bool ModbusController::send_next_command_() { ESP_LOGV(TAG, "Sending next modbus command to device %d register 0x%02X count %d", this->address_, command->register_address, command->register_count); command->send(); + this->last_command_timestamp_ = millis(); + + this->command_sent_callback_.call((int) command->function_code, command->register_address); + // remove from queue if no handler is defined if (!command->on_data_func) { command_queue_.pop_front(); @@ -659,5 +663,9 @@ int64_t payload_to_number(const std::vector &data, SensorValueType sens return value; } +void ModbusController::add_on_command_sent_callback(std::function &&callback) { + this->command_sent_callback_.add(std::move(callback)); +} + } // namespace modbus_controller } // namespace esphome diff --git a/esphome/components/modbus_controller/modbus_controller.h b/esphome/components/modbus_controller/modbus_controller.h index 9b7d59c93f..3bc11da879 100644 --- a/esphome/components/modbus_controller/modbus_controller.h +++ b/esphome/components/modbus_controller/modbus_controller.h @@ -456,6 +456,8 @@ class ModbusController : public PollingComponent, public modbus::ModbusDevice { size_t get_command_queue_length() { return command_queue_.size(); } /// get if the module is offline, didn't respond the last command bool get_module_offline() { return module_offline_; } + /// Set callback for commands + void add_on_command_sent_callback(std::function &&callback); protected: /// parse sensormap_ and create range of sequential addresses @@ -488,6 +490,7 @@ class ModbusController : public PollingComponent, public modbus::ModbusDevice { bool module_offline_; /// how many updates to skip if module is offline uint16_t offline_skip_updates_; + CallbackManager command_sent_callback_{}; }; /** Convert vector response payload to float. From 8fc42694f69743561ee5d4474d768aeb2be9d35b Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:42:25 +1000 Subject: [PATCH 043/164] [ili9xxx] Rework delay handling (#7115) --- esphome/components/ili9xxx/ili9xxx_defines.h | 4 ++- .../components/ili9xxx/ili9xxx_display.cpp | 31 ++++++------------- esphome/components/ili9xxx/ili9xxx_display.h | 12 +++---- esphome/components/ili9xxx/ili9xxx_init.h | 8 ++--- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/esphome/components/ili9xxx/ili9xxx_defines.h b/esphome/components/ili9xxx/ili9xxx_defines.h index 744013db3d..f4c5aad957 100644 --- a/esphome/components/ili9xxx/ili9xxx_defines.h +++ b/esphome/components/ili9xxx/ili9xxx_defines.h @@ -92,7 +92,9 @@ static const uint8_t ILI9XXX_GMCTRN1 = 0xE1; static const uint8_t ILI9XXX_CSCON = 0xF0; static const uint8_t ILI9XXX_ADJCTL3 = 0xF7; -static const uint8_t ILI9XXX_DELAY = 0xFF; // followed by one byte of delay time in ms +static const uint8_t ILI9XXX_DELAY_FLAG = 0xFF; +// special marker for delay - command byte reprents ms, length byte is an impossible value +#define ILI9XXX_DELAY(ms) ((uint8_t) ((ms) | 0x80)), ILI9XXX_DELAY_FLAG } // namespace ili9xxx } // namespace esphome diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index de03df5d41..4f035edbb0 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -34,8 +34,8 @@ void ILI9XXXDisplay::setup() { ESP_LOGD(TAG, "Setting up ILI9xxx"); this->setup_pins_(); - this->init_lcd(this->init_sequence_); - this->init_lcd(this->extra_init_sequence_.data()); + this->init_lcd_(this->init_sequence_); + this->init_lcd_(this->extra_init_sequence_.data()); switch (this->pixel_mode_) { case PIXEL_MODE_16: if (this->is_18bitdisplay_) { @@ -405,42 +405,29 @@ void ILI9XXXDisplay::reset_() { } } -void ILI9XXXDisplay::init_lcd(const uint8_t *addr) { +void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { if (addr == nullptr) return; uint8_t cmd, x, num_args; while ((cmd = *addr++) != 0) { x = *addr++; - if (cmd == ILI9XXX_DELAY) { - ESP_LOGD(TAG, "Delay %dms", x); - delay(x); + if (x == ILI9XXX_DELAY_FLAG) { + cmd &= 0x7F; + ESP_LOGV(TAG, "Delay %dms", cmd); + delay(cmd); } else { num_args = x & 0x7F; - ESP_LOGD(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, *addr); + ESP_LOGV(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, *addr); this->send_command(cmd, addr, num_args); addr += num_args; if (x & 0x80) { - ESP_LOGD(TAG, "Delay 150ms"); + ESP_LOGV(TAG, "Delay 150ms"); delay(150); // NOLINT } } } } -void ILI9XXXGC9A01A::init_lcd(const uint8_t *addr) { - if (addr == nullptr) - return; - uint8_t cmd, x, num_args; - while ((cmd = *addr++) != 0) { - x = *addr++; - num_args = x & 0x7F; - this->send_command(cmd, addr, num_args); - addr += num_args; - if (x & 0x80) - delay(150); // NOLINT - } -} - // Tell the display controller where we want to draw pixels. void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { x1 += this->offset_x_; diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index b60047a8c3..6121488d15 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -33,7 +33,9 @@ class ILI9XXXDisplay : public display::DisplayBuffer, uint8_t cmd, num_args, bits; const uint8_t *addr = init_sequence; while ((cmd = *addr++) != 0) { - num_args = *addr++ & 0x7F; + num_args = *addr++; + if (num_args == ILI9XXX_DELAY_FLAG) + continue; bits = *addr; switch (cmd) { case ILI9XXX_MADCTL: { @@ -50,13 +52,10 @@ class ILI9XXXDisplay : public display::DisplayBuffer, break; } - case ILI9XXX_DELAY: - continue; // no args to skip - default: break; } - addr += num_args; + addr += (num_args & 0x7F); } } @@ -109,7 +108,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer, virtual void set_madctl(); void display_(); - virtual void init_lcd(const uint8_t *addr); + void init_lcd_(const uint8_t *addr); void set_addr_window_(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2); void reset_(); @@ -269,7 +268,6 @@ class ILI9XXXS3BoxLite : public ILI9XXXDisplay { class ILI9XXXGC9A01A : public ILI9XXXDisplay { public: ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} - void init_lcd(const uint8_t *addr) override; }; //----------- ILI9XXX_24_TFT display -------------- diff --git a/esphome/components/ili9xxx/ili9xxx_init.h b/esphome/components/ili9xxx/ili9xxx_init.h index 260bde4c80..5a67812bc1 100644 --- a/esphome/components/ili9xxx/ili9xxx_init.h +++ b/esphome/components/ili9xxx/ili9xxx_init.h @@ -372,9 +372,9 @@ static const uint8_t PROGMEM INITCMD_GC9A01A[] = { static const uint8_t PROGMEM INITCMD_ST7735[] = { ILI9XXX_SWRESET, 0, // Soft reset, then delay 10ms - ILI9XXX_DELAY, 10, + ILI9XXX_DELAY(10), ILI9XXX_SLPOUT , 0, // Exit Sleep, delay - ILI9XXX_DELAY, 10, + ILI9XXX_DELAY(10), ILI9XXX_PIXFMT , 1, 0x05, ILI9XXX_FRMCTR1, 3, // 4: Frame rate control, 3 args + delay: 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) @@ -415,9 +415,9 @@ static const uint8_t PROGMEM INITCMD_ST7735[] = { 0x00, 0x00, 0x02, 0x10, ILI9XXX_MADCTL , 1, 0x00, // Memory Access Control, BGR ILI9XXX_NORON , 0, - ILI9XXX_DELAY, 10, + ILI9XXX_DELAY(10), ILI9XXX_DISPON , 0, // Display on - ILI9XXX_DELAY, 10, + ILI9XXX_DELAY(10), 00, // endo of list }; From 5d5f3276e9ec73f8463554137ee67f02aa4d91e5 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Mon, 22 Jul 2024 06:20:09 +0200 Subject: [PATCH 044/164] Inherit `esp32_ble_beacon` from `esp32_ble` (#6908) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/esp32_ble/__init__.py | 19 ++- esphome/components/esp32_ble/ble.cpp | 10 +- esphome/components/esp32_ble/ble.h | 9 + .../components/esp32_ble/ble_advertising.cpp | 51 +++++- .../components/esp32_ble/ble_advertising.h | 22 ++- .../components/esp32_ble_beacon/__init__.py | 18 +- .../esp32_ble_beacon/esp32_ble_beacon.cpp | 160 +++++------------- .../esp32_ble_beacon/esp32_ble_beacon.h | 36 ++-- .../components/esp32_ble_server/__init__.py | 1 - esphome/components/esp32_improv/__init__.py | 1 - 10 files changed, 176 insertions(+), 151 deletions(-) diff --git a/esphome/components/esp32_ble/__init__.py b/esphome/components/esp32_ble/__init__.py index d88161e3e0..472669a381 100644 --- a/esphome/components/esp32_ble/__init__.py +++ b/esphome/components/esp32_ble/__init__.py @@ -7,10 +7,10 @@ from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant DEPENDENCIES = ["esp32"] CODEOWNERS = ["@jesserockz", "@Rapsssito"] -CONFLICTS_WITH = ["esp32_ble_beacon"] CONF_BLE_ID = "ble_id" CONF_IO_CAPABILITY = "io_capability" +CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time" NO_BLUETOOTH_VARIANTS = [const.VARIANT_ESP32S2] @@ -34,6 +34,19 @@ IO_CAPABILITY = { "display_yes_no": IoCapability.IO_CAP_IO, } +esp_power_level_t = cg.global_ns.enum("esp_power_level_t") + +TX_POWER_LEVELS = { + -12: esp_power_level_t.ESP_PWR_LVL_N12, + -9: esp_power_level_t.ESP_PWR_LVL_N9, + -6: esp_power_level_t.ESP_PWR_LVL_N6, + -3: esp_power_level_t.ESP_PWR_LVL_N3, + 0: esp_power_level_t.ESP_PWR_LVL_N0, + 3: esp_power_level_t.ESP_PWR_LVL_P3, + 6: esp_power_level_t.ESP_PWR_LVL_P6, + 9: esp_power_level_t.ESP_PWR_LVL_P9, +} + CONFIG_SCHEMA = cv.Schema( { cv.GenerateID(): cv.declare_id(ESP32BLE), @@ -41,6 +54,9 @@ CONFIG_SCHEMA = cv.Schema( IO_CAPABILITY, lower=True ), cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean, + cv.Optional( + CONF_ADVERTISING_CYCLE_TIME, default="10s" + ): cv.positive_time_period_milliseconds, } ).extend(cv.COMPONENT_SCHEMA) @@ -58,6 +74,7 @@ async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) cg.add(var.set_enable_on_boot(config[CONF_ENABLE_ON_BOOT])) cg.add(var.set_io_capability(config[CONF_IO_CAPABILITY])) + cg.add(var.set_advertising_cycle_time(config[CONF_ADVERTISING_CYCLE_TIME])) await cg.register_component(var, config) if CORE.using_esp_idf: diff --git a/esphome/components/esp32_ble/ble.cpp b/esphome/components/esp32_ble/ble.cpp index ceb6516a02..5d08b6e973 100644 --- a/esphome/components/esp32_ble/ble.cpp +++ b/esphome/components/esp32_ble/ble.cpp @@ -78,6 +78,11 @@ void ESP32BLE::advertising_set_manufacturer_data(const std::vector &dat this->advertising_start(); } +void ESP32BLE::advertising_register_raw_advertisement_callback(std::function &&callback) { + this->advertising_init_(); + this->advertising_->register_raw_advertisement_callback(std::move(callback)); +} + void ESP32BLE::advertising_add_service_uuid(ESPBTUUID uuid) { this->advertising_init_(); this->advertising_->add_service_uuid(uuid); @@ -102,7 +107,7 @@ bool ESP32BLE::ble_pre_setup_() { void ESP32BLE::advertising_init_() { if (this->advertising_ != nullptr) return; - this->advertising_ = new BLEAdvertising(); // NOLINT(cppcoreguidelines-owning-memory) + this->advertising_ = new BLEAdvertising(this->advertising_cycle_time_); // NOLINT(cppcoreguidelines-owning-memory) this->advertising_->set_scan_response(true); this->advertising_->set_min_preferred_interval(0x06); @@ -312,6 +317,9 @@ void ESP32BLE::loop() { delete ble_event; // NOLINT(cppcoreguidelines-owning-memory) ble_event = this->ble_events_.pop(); } + if (this->advertising_ != nullptr) { + this->advertising_->loop(); + } } void ESP32BLE::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { diff --git a/esphome/components/esp32_ble/ble.h b/esphome/components/esp32_ble/ble.h index 023960d6e4..7c55583852 100644 --- a/esphome/components/esp32_ble/ble.h +++ b/esphome/components/esp32_ble/ble.h @@ -3,6 +3,8 @@ #include "ble_advertising.h" #include "ble_uuid.h" +#include + #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/defines.h" @@ -76,6 +78,11 @@ class ESP32BLE : public Component { public: void set_io_capability(IoCapability io_capability) { this->io_cap_ = (esp_ble_io_cap_t) io_capability; } + void set_advertising_cycle_time(uint32_t advertising_cycle_time) { + this->advertising_cycle_time_ = advertising_cycle_time; + } + uint32_t get_advertising_cycle_time() const { return this->advertising_cycle_time_; } + void enable(); void disable(); bool is_active(); @@ -89,6 +96,7 @@ class ESP32BLE : public Component { void advertising_set_manufacturer_data(const std::vector &data); void advertising_add_service_uuid(ESPBTUUID uuid); void advertising_remove_service_uuid(ESPBTUUID uuid); + void advertising_register_raw_advertisement_callback(std::function &&callback); void register_gap_event_handler(GAPEventHandler *handler) { this->gap_event_handlers_.push_back(handler); } void register_gattc_event_handler(GATTcEventHandler *handler) { this->gattc_event_handlers_.push_back(handler); } @@ -121,6 +129,7 @@ class ESP32BLE : public Component { Queue ble_events_; BLEAdvertising *advertising_; esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE}; + uint32_t advertising_cycle_time_; bool enable_on_boot_; }; diff --git a/esphome/components/esp32_ble/ble_advertising.cpp b/esphome/components/esp32_ble/ble_advertising.cpp index 59d2398829..1d340c76d9 100644 --- a/esphome/components/esp32_ble/ble_advertising.cpp +++ b/esphome/components/esp32_ble/ble_advertising.cpp @@ -10,9 +10,9 @@ namespace esphome { namespace esp32_ble { -static const char *const TAG = "esp32_ble"; +static const char *const TAG = "esp32_ble.advertising"; -BLEAdvertising::BLEAdvertising() { +BLEAdvertising::BLEAdvertising(uint32_t advertising_cycle_time) : advertising_cycle_time_(advertising_cycle_time) { this->advertising_data_.set_scan_rsp = false; this->advertising_data_.include_name = true; this->advertising_data_.include_txpower = true; @@ -64,7 +64,7 @@ void BLEAdvertising::set_manufacturer_data(const std::vector &data) { } } -void BLEAdvertising::start() { +esp_err_t BLEAdvertising::services_advertisement_() { int num_services = this->advertising_uuids_.size(); if (num_services == 0) { this->advertising_data_.service_uuid_len = 0; @@ -87,8 +87,8 @@ void BLEAdvertising::start() { this->advertising_data_.include_txpower = !this->scan_response_; err = esp_ble_gap_config_adv_data(&this->advertising_data_); if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_config_adv_data failed (Advertising): %d", err); - return; + ESP_LOGE(TAG, "esp_ble_gap_config_adv_data failed (Advertising): %s", esp_err_to_name(err)); + return err; } if (this->scan_response_) { @@ -101,8 +101,8 @@ void BLEAdvertising::start() { this->scan_response_data_.flag = 0; err = esp_ble_gap_config_adv_data(&this->scan_response_data_); if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_config_adv_data failed (Scan response): %d", err); - return; + ESP_LOGE(TAG, "esp_ble_gap_config_adv_data failed (Scan response): %s", esp_err_to_name(err)); + return err; } } @@ -113,8 +113,18 @@ void BLEAdvertising::start() { err = esp_ble_gap_start_advertising(&this->advertising_params_); if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_start_advertising failed: %d", err); - return; + ESP_LOGE(TAG, "esp_ble_gap_start_advertising failed: %s", esp_err_to_name(err)); + return err; + } + + return ESP_OK; +} + +void BLEAdvertising::start() { + if (this->current_adv_index_ == -1) { + this->services_advertisement_(); + } else { + this->raw_advertisements_callbacks_[this->current_adv_index_](true); } } @@ -124,6 +134,29 @@ void BLEAdvertising::stop() { ESP_LOGE(TAG, "esp_ble_gap_stop_advertising failed: %d", err); return; } + if (this->current_adv_index_ != -1) { + this->raw_advertisements_callbacks_[this->current_adv_index_](false); + } +} + +void BLEAdvertising::loop() { + if (this->raw_advertisements_callbacks_.empty()) { + return; + } + const uint32_t now = millis(); + if (now - this->last_advertisement_time_ > this->advertising_cycle_time_) { + this->stop(); + this->current_adv_index_ += 1; + if (this->current_adv_index_ >= this->raw_advertisements_callbacks_.size()) { + this->current_adv_index_ = -1; + } + this->start(); + this->last_advertisement_time_ = now; + } +} + +void BLEAdvertising::register_raw_advertisement_callback(std::function &&callback) { + this->raw_advertisements_callbacks_.push_back(std::move(callback)); } } // namespace esp32_ble diff --git a/esphome/components/esp32_ble/ble_advertising.h b/esphome/components/esp32_ble/ble_advertising.h index 16a7dd1d8e..946e414c1d 100644 --- a/esphome/components/esp32_ble/ble_advertising.h +++ b/esphome/components/esp32_ble/ble_advertising.h @@ -1,20 +1,31 @@ #pragma once +#include +#include #include #ifdef USE_ESP32 +#include #include #include namespace esphome { namespace esp32_ble { +using raw_adv_data_t = struct { + uint8_t *data; + size_t length; + esp_power_level_t power_level; +}; + class ESPBTUUID; class BLEAdvertising { public: - BLEAdvertising(); + BLEAdvertising(uint32_t advertising_cycle_time); + + void loop(); void add_service_uuid(ESPBTUUID uuid); void remove_service_uuid(ESPBTUUID uuid); @@ -22,16 +33,25 @@ class BLEAdvertising { void set_min_preferred_interval(uint16_t interval) { this->advertising_data_.min_interval = interval; } void set_manufacturer_data(const std::vector &data); void set_service_data(const std::vector &data); + void register_raw_advertisement_callback(std::function &&callback); void start(); void stop(); protected: + esp_err_t services_advertisement_(); + bool scan_response_; esp_ble_adv_data_t advertising_data_; esp_ble_adv_data_t scan_response_data_; esp_ble_adv_params_t advertising_params_; std::vector advertising_uuids_; + + std::vector> raw_advertisements_callbacks_; + + const uint32_t advertising_cycle_time_; + uint32_t last_advertisement_time_{0}; + int8_t current_adv_index_{-1}; // -1 means standard scan response }; } // namespace esp32_ble diff --git a/esphome/components/esp32_ble_beacon/__init__.py b/esphome/components/esp32_ble_beacon/__init__.py index 9aac48cbb2..d063209478 100644 --- a/esphome/components/esp32_ble_beacon/__init__.py +++ b/esphome/components/esp32_ble_beacon/__init__.py @@ -1,16 +1,21 @@ import esphome.codegen as cg import esphome.config_validation as cv +from esphome.components.esp32_ble import CONF_BLE_ID from esphome.const import CONF_ID, CONF_TYPE, CONF_UUID, CONF_TX_POWER from esphome.core import CORE, TimePeriod from esphome.components.esp32 import add_idf_sdkconfig_option from esphome.components import esp32_ble +AUTO_LOAD = ["esp32_ble"] DEPENDENCIES = ["esp32"] -CONFLICTS_WITH = ["esp32_ble_tracker"] esp32_ble_beacon_ns = cg.esphome_ns.namespace("esp32_ble_beacon") -ESP32BLEBeacon = esp32_ble_beacon_ns.class_("ESP32BLEBeacon", cg.Component) - +ESP32BLEBeacon = esp32_ble_beacon_ns.class_( + "ESP32BLEBeacon", + cg.Component, + esp32_ble.GAPEventHandler, + cg.Parented.template(esp32_ble.ESP32BLE), +) CONF_MAJOR = "major" CONF_MINOR = "minor" CONF_MIN_INTERVAL = "min_interval" @@ -28,6 +33,7 @@ CONFIG_SCHEMA = cv.All( cv.Schema( { cv.GenerateID(): cv.declare_id(ESP32BLEBeacon), + cv.GenerateID(CONF_BLE_ID): cv.use_id(esp32_ble.ESP32BLE), cv.Required(CONF_TYPE): cv.one_of("IBEACON", upper=True), cv.Required(CONF_UUID): cv.uuid, cv.Optional(CONF_MAJOR, default=10167): cv.uint16_t, @@ -48,7 +54,7 @@ CONFIG_SCHEMA = cv.All( min=-128, max=0 ), cv.Optional(CONF_TX_POWER, default="3dBm"): cv.All( - cv.decibel, cv.one_of(-12, -9, -6, -3, 0, 3, 6, 9, int=True) + cv.decibel, cv.enum(esp32_ble.TX_POWER_LEVELS, int=True) ), } ).extend(cv.COMPONENT_SCHEMA), @@ -62,6 +68,10 @@ async def to_code(config): uuid = config[CONF_UUID].hex uuid_arr = [cg.RawExpression(f"0x{uuid[i:i + 2]}") for i in range(0, len(uuid), 2)] var = cg.new_Pvariable(config[CONF_ID], uuid_arr) + + parent = await cg.get_variable(config[esp32_ble.CONF_BLE_ID]) + cg.add(parent.register_gap_event_handler(var)) + await cg.register_component(var, config) cg.add(var.set_major(config[CONF_MAJOR])) cg.add(var.set_minor(config[CONF_MINOR])) diff --git a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp index 589fcc1e82..423fe61592 100644 --- a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +++ b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp @@ -3,14 +3,16 @@ #ifdef USE_ESP32 -#include -#include -#include #include -#include +#include #include +#include +#include +#include #include + #include "esphome/core/hal.h" +#include "esphome/core/helpers.h" #ifdef USE_ARDUINO #include @@ -21,20 +23,6 @@ namespace esp32_ble_beacon { static const char *const TAG = "esp32_ble_beacon"; -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -static esp_ble_adv_params_t ble_adv_params = { - .adv_int_min = 0x20, - .adv_int_max = 0x40, - .adv_type = ADV_TYPE_NONCONN_IND, - .own_addr_type = BLE_ADDR_TYPE_PUBLIC, - .peer_addr = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - .peer_addr_type = BLE_ADDR_TYPE_PUBLIC, - .channel_map = ADV_CHNL_ALL, - .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, -}; - -#define ENDIAN_CHANGE_U16(x) ((((x) &0xFF00) >> 8) + (((x) &0xFF) << 8)) - static const esp_ble_ibeacon_head_t IBEACON_COMMON_HEAD = { .flags = {0x02, 0x01, 0x06}, .length = 0x1A, .type = 0xFF, .company_id = {0x4C, 0x00}, .beacon_type = {0x02, 0x15}}; @@ -53,117 +41,62 @@ void ESP32BLEBeacon::dump_config() { " UUID: %s, Major: %u, Minor: %u, Min Interval: %ums, Max Interval: %ums, Measured Power: %d" ", TX Power: %ddBm", uuid, this->major_, this->minor_, this->min_interval_, this->max_interval_, this->measured_power_, - this->tx_power_); + (this->tx_power_ * 3) - 12); } +float ESP32BLEBeacon::get_setup_priority() const { return setup_priority::AFTER_BLUETOOTH; } + void ESP32BLEBeacon::setup() { - ESP_LOGCONFIG(TAG, "Setting up ESP32 BLE beacon..."); - global_esp32_ble_beacon = this; + this->ble_adv_params_ = { + .adv_int_min = static_cast(this->min_interval_ / 0.625f), + .adv_int_max = static_cast(this->max_interval_ / 0.625f), + .adv_type = ADV_TYPE_NONCONN_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .peer_addr = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + .peer_addr_type = BLE_ADDR_TYPE_PUBLIC, + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, + }; - xTaskCreatePinnedToCore(ESP32BLEBeacon::ble_core_task, - "ble_task", // name - 10000, // stack size (in words) - nullptr, // input params - 1, // priority - nullptr, // Handle, not needed - 0 // core - ); + global_ble->advertising_register_raw_advertisement_callback([this](bool advertise) { + this->advertising_ = advertise; + if (advertise) { + this->on_advertise_(); + } + }); } -float ESP32BLEBeacon::get_setup_priority() const { return setup_priority::BLUETOOTH; } -void ESP32BLEBeacon::ble_core_task(void *params) { - ble_setup(); - - while (true) { - delay(1000); // NOLINT - } -} - -void ESP32BLEBeacon::ble_setup() { - ble_adv_params.adv_int_min = static_cast(global_esp32_ble_beacon->min_interval_ / 0.625f); - ble_adv_params.adv_int_max = static_cast(global_esp32_ble_beacon->max_interval_ / 0.625f); - - // Initialize non-volatile storage for the bluetooth controller - esp_err_t err = nvs_flash_init(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "nvs_flash_init failed: %d", err); - return; - } - -#ifdef USE_ARDUINO - if (!btStart()) { - ESP_LOGE(TAG, "btStart failed: %d", esp_bt_controller_get_status()); - return; - } -#else - if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { - // start bt controller - if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) { - esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); - err = esp_bt_controller_init(&cfg); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_bt_controller_init failed: %s", esp_err_to_name(err)); - return; - } - while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) - ; - } - if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) { - err = esp_bt_controller_enable(ESP_BT_MODE_BLE); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err)); - return; - } - } - if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { - ESP_LOGE(TAG, "esp bt controller enable failed"); - return; - } - } -#endif - - esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); - - err = esp_bluedroid_init(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_bluedroid_init failed: %d", err); - return; - } - err = esp_bluedroid_enable(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_bluedroid_enable failed: %d", err); - return; - } - err = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV, - static_cast((global_esp32_ble_beacon->tx_power_ + 12) / 3)); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_tx_power_set failed: %s", esp_err_to_name(err)); - return; - } - err = esp_ble_gap_register_callback(ESP32BLEBeacon::gap_event_handler); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_register_callback failed: %d", err); - return; - } - +void ESP32BLEBeacon::on_advertise_() { esp_ble_ibeacon_t ibeacon_adv_data; memcpy(&ibeacon_adv_data.ibeacon_head, &IBEACON_COMMON_HEAD, sizeof(esp_ble_ibeacon_head_t)); - memcpy(&ibeacon_adv_data.ibeacon_vendor.proximity_uuid, global_esp32_ble_beacon->uuid_.data(), + memcpy(&ibeacon_adv_data.ibeacon_vendor.proximity_uuid, this->uuid_.data(), sizeof(ibeacon_adv_data.ibeacon_vendor.proximity_uuid)); - ibeacon_adv_data.ibeacon_vendor.minor = ENDIAN_CHANGE_U16(global_esp32_ble_beacon->minor_); - ibeacon_adv_data.ibeacon_vendor.major = ENDIAN_CHANGE_U16(global_esp32_ble_beacon->major_); - ibeacon_adv_data.ibeacon_vendor.measured_power = static_cast(global_esp32_ble_beacon->measured_power_); + ibeacon_adv_data.ibeacon_vendor.minor = byteswap(this->minor_); + ibeacon_adv_data.ibeacon_vendor.major = byteswap(this->major_); + ibeacon_adv_data.ibeacon_vendor.measured_power = static_cast(this->measured_power_); - esp_ble_gap_config_adv_data_raw((uint8_t *) &ibeacon_adv_data, sizeof(ibeacon_adv_data)); + ESP_LOGD(TAG, "Setting BLE TX power"); + esp_err_t err = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV, this->tx_power_); + if (err != ESP_OK) { + ESP_LOGW(TAG, "esp_ble_tx_power_set failed: %s", esp_err_to_name(err)); + } + err = esp_ble_gap_config_adv_data_raw((uint8_t *) &ibeacon_adv_data, sizeof(ibeacon_adv_data)); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_ble_gap_config_adv_data_raw failed: %s", esp_err_to_name(err)); + return; + } } void ESP32BLEBeacon::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { + if (!this->advertising_) + return; + esp_err_t err; switch (event) { case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: { - err = esp_ble_gap_start_advertising(&ble_adv_params); + err = esp_ble_gap_start_advertising(&this->ble_adv_params_); if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_start_advertising failed: %d", err); + ESP_LOGE(TAG, "esp_ble_gap_start_advertising failed: %s", esp_err_to_name(err)); } break; } @@ -181,6 +114,7 @@ void ESP32BLEBeacon::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap } else { ESP_LOGD(TAG, "BLE stopped advertising successfully"); } + // this->advertising_ = false; break; } default: @@ -188,8 +122,6 @@ void ESP32BLEBeacon::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap } } -ESP32BLEBeacon *global_esp32_ble_beacon = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - } // namespace esp32_ble_beacon } // namespace esphome diff --git a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.h b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.h index 5208b67ea3..e37edf6cde 100644 --- a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.h +++ b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.h @@ -1,39 +1,39 @@ #pragma once +#include "esphome/components/esp32_ble/ble.h" #include "esphome/core/component.h" #ifdef USE_ESP32 -#include #include +#include namespace esphome { namespace esp32_ble_beacon { -// NOLINTNEXTLINE(modernize-use-using) -typedef struct { +using esp_ble_ibeacon_head_t = struct { uint8_t flags[3]; uint8_t length; uint8_t type; uint8_t company_id[2]; uint8_t beacon_type[2]; -} __attribute__((packed)) esp_ble_ibeacon_head_t; +} __attribute__((packed)); -// NOLINTNEXTLINE(modernize-use-using) -typedef struct { +using esp_ble_ibeacon_vendor_t = struct { uint8_t proximity_uuid[16]; uint16_t major; uint16_t minor; uint8_t measured_power; -} __attribute__((packed)) esp_ble_ibeacon_vendor_t; +} __attribute__((packed)); -// NOLINTNEXTLINE(modernize-use-using) -typedef struct { +using esp_ble_ibeacon_t = struct { esp_ble_ibeacon_head_t ibeacon_head; esp_ble_ibeacon_vendor_t ibeacon_vendor; -} __attribute__((packed)) esp_ble_ibeacon_t; +} __attribute__((packed)); -class ESP32BLEBeacon : public Component { +using namespace esp32_ble; + +class ESP32BLEBeacon : public Component, public GAPEventHandler, public Parented { public: explicit ESP32BLEBeacon(const std::array &uuid) : uuid_(uuid) {} @@ -46,12 +46,11 @@ class ESP32BLEBeacon : public Component { void set_min_interval(uint16_t val) { this->min_interval_ = val; } void set_max_interval(uint16_t val) { this->max_interval_ = val; } void set_measured_power(int8_t val) { this->measured_power_ = val; } - void set_tx_power(int8_t val) { this->tx_power_ = val; } + void set_tx_power(esp_power_level_t val) { this->tx_power_ = val; } + void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override; protected: - static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); - static void ble_core_task(void *params); - static void ble_setup(); + void on_advertise_(); std::array uuid_; uint16_t major_{}; @@ -59,12 +58,11 @@ class ESP32BLEBeacon : public Component { uint16_t min_interval_{}; uint16_t max_interval_{}; int8_t measured_power_{}; - int8_t tx_power_{}; + esp_power_level_t tx_power_{}; + esp_ble_adv_params_t ble_adv_params_; + bool advertising_{false}; }; -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -extern ESP32BLEBeacon *global_esp32_ble_beacon; - } // namespace esp32_ble_beacon } // namespace esphome diff --git a/esphome/components/esp32_ble_server/__init__.py b/esphome/components/esp32_ble_server/__init__.py index f53c9450f4..ce9fdc2cf3 100644 --- a/esphome/components/esp32_ble_server/__init__.py +++ b/esphome/components/esp32_ble_server/__init__.py @@ -7,7 +7,6 @@ from esphome.components.esp32 import add_idf_sdkconfig_option AUTO_LOAD = ["esp32_ble"] CODEOWNERS = ["@jesserockz", "@clydebarrow", "@Rapsssito"] -CONFLICTS_WITH = ["esp32_ble_beacon"] DEPENDENCIES = ["esp32"] CONF_MANUFACTURER = "manufacturer" diff --git a/esphome/components/esp32_improv/__init__.py b/esphome/components/esp32_improv/__init__.py index 49d95d89e5..62d9cd376c 100644 --- a/esphome/components/esp32_improv/__init__.py +++ b/esphome/components/esp32_improv/__init__.py @@ -6,7 +6,6 @@ from esphome.const import CONF_ID AUTO_LOAD = ["esp32_ble_server"] CODEOWNERS = ["@jesserockz"] -CONFLICTS_WITH = ["esp32_ble_beacon"] DEPENDENCIES = ["wifi", "esp32"] CONF_AUTHORIZED_DURATION = "authorized_duration" From f1aa254e4810999d7bb70619ba9c09bb9be5cf98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aodren=20Auffr=C3=A9dou-Heinicke?= <54121510+aodrenah@users.noreply.github.com> Date: Sun, 21 Jul 2024 22:29:54 -0700 Subject: [PATCH 045/164] APDS9306 Ambient Light Sensor (#6709) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: Keith Burzinski Co-authored-by: Mat931 <49403702+Mat931@users.noreply.github.com> --- CODEOWNERS | 1 + esphome/components/apds9306/__init__.py | 4 + esphome/components/apds9306/apds9306.cpp | 151 ++++++++++++++++++ esphome/components/apds9306/apds9306.h | 66 ++++++++ esphome/components/apds9306/sensor.py | 95 +++++++++++ tests/components/apds9306/common.yaml | 12 ++ tests/components/apds9306/test.esp32-ard.yaml | 5 + .../apds9306/test.esp32-c3-ard.yaml | 5 + .../apds9306/test.esp32-c3-idf.yaml | 5 + tests/components/apds9306/test.esp32-idf.yaml | 5 + .../components/apds9306/test.esp8266-ard.yaml | 5 + .../components/apds9306/test.rp2040-ard.yaml | 5 + 12 files changed, 359 insertions(+) create mode 100644 esphome/components/apds9306/__init__.py create mode 100644 esphome/components/apds9306/apds9306.cpp create mode 100644 esphome/components/apds9306/apds9306.h create mode 100644 esphome/components/apds9306/sensor.py create mode 100644 tests/components/apds9306/common.yaml create mode 100644 tests/components/apds9306/test.esp32-ard.yaml create mode 100644 tests/components/apds9306/test.esp32-c3-ard.yaml create mode 100644 tests/components/apds9306/test.esp32-c3-idf.yaml create mode 100644 tests/components/apds9306/test.esp32-idf.yaml create mode 100644 tests/components/apds9306/test.esp8266-ard.yaml create mode 100644 tests/components/apds9306/test.rp2040-ard.yaml diff --git a/CODEOWNERS b/CODEOWNERS index ee76a072fc..c5e144bdfa 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -37,6 +37,7 @@ esphome/components/am43/sensor/* @buxtronix esphome/components/analog_threshold/* @ianchi esphome/components/animation/* @syndlex esphome/components/anova/* @buxtronix +esphome/components/apds9306/* @aodrenah esphome/components/api/* @OttoWinter esphome/components/as5600/* @ammmze esphome/components/as5600/sensor/* @ammmze diff --git a/esphome/components/apds9306/__init__.py b/esphome/components/apds9306/__init__.py new file mode 100644 index 0000000000..3dc8fcf5ff --- /dev/null +++ b/esphome/components/apds9306/__init__.py @@ -0,0 +1,4 @@ +# Based on this datasheet: +# https://www.mouser.ca/datasheet/2/678/AVGO_S_A0002854364_1-2574547.pdf + +CODEOWNERS = ["@aodrenah"] diff --git a/esphome/components/apds9306/apds9306.cpp b/esphome/components/apds9306/apds9306.cpp new file mode 100644 index 0000000000..7b79b0964c --- /dev/null +++ b/esphome/components/apds9306/apds9306.cpp @@ -0,0 +1,151 @@ +// Based on this datasheet: +// https://www.mouser.ca/datasheet/2/678/AVGO_S_A0002854364_1-2574547.pdf + +#include "apds9306.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace apds9306 { + +static const char *const TAG = "apds9306"; + +enum { // APDS9306 registers + APDS9306_MAIN_CTRL = 0x00, + APDS9306_ALS_MEAS_RATE = 0x04, + APDS9306_ALS_GAIN = 0x05, + APDS9306_PART_ID = 0x06, + APDS9306_MAIN_STATUS = 0x07, + APDS9306_CLEAR_DATA_0 = 0x0A, // LSB + APDS9306_CLEAR_DATA_1 = 0x0B, + APDS9306_CLEAR_DATA_2 = 0x0C, // MSB + APDS9306_ALS_DATA_0 = 0x0D, // LSB + APDS9306_ALS_DATA_1 = 0x0E, + APDS9306_ALS_DATA_2 = 0x0F, // MSB + APDS9306_INT_CFG = 0x19, + APDS9306_INT_PERSISTENCE = 0x1A, + APDS9306_ALS_THRES_UP_0 = 0x21, // LSB + APDS9306_ALS_THRES_UP_1 = 0x22, + APDS9306_ALS_THRES_UP_2 = 0x23, // MSB + APDS9306_ALS_THRES_LOW_0 = 0x24, // LSB + APDS9306_ALS_THRES_LOW_1 = 0x25, + APDS9306_ALS_THRES_LOW_2 = 0x26, // MSB + APDS9306_ALS_THRES_VAR = 0x27 +}; + +#define APDS9306_ERROR_CHECK(func, error) \ + if (!(func)) { \ + ESP_LOGE(TAG, error); \ + this->mark_failed(); \ + return; \ + } +#define APDS9306_WARNING_CHECK(func, warning) \ + if (!(func)) { \ + ESP_LOGW(TAG, warning); \ + this->status_set_warning(); \ + return; \ + } +#define APDS9306_WRITE_BYTE(reg, value) \ + ESP_LOGV(TAG, "Writing 0x%02x to 0x%02x", value, reg); \ + if (!this->write_byte(reg, value)) { \ + ESP_LOGE(TAG, "Failed writing 0x%02x to 0x%02x", value, reg); \ + this->mark_failed(); \ + return; \ + } + +void APDS9306::setup() { + ESP_LOGCONFIG(TAG, "Setting up APDS9306..."); + + uint8_t id; + if (!this->read_byte(APDS9306_PART_ID, &id)) { // Part ID register + this->error_code_ = COMMUNICATION_FAILED; + this->mark_failed(); + return; + } + + if (id != 0xB1 && id != 0xB3) { // 0xB1 for APDS9306 0xB3 for APDS9306-065 + this->error_code_ = WRONG_ID; + this->mark_failed(); + return; + } + + // ALS resolution and measurement, see datasheet or init.py for options + uint8_t als_meas_rate = ((this->bit_width_ & 0x07) << 4) | (this->measurement_rate_ & 0x07); + APDS9306_WRITE_BYTE(APDS9306_ALS_MEAS_RATE, als_meas_rate); + + // ALS gain, see datasheet or init.py for options + uint8_t als_gain = (this->gain_ & 0x07); + APDS9306_WRITE_BYTE(APDS9306_ALS_GAIN, als_gain); + + // Set to standby mode + APDS9306_WRITE_BYTE(APDS9306_MAIN_CTRL, 0x00); + + // Check for data, clear main status + uint8_t status; + APDS9306_WARNING_CHECK(this->read_byte(APDS9306_MAIN_STATUS, &status), "Reading MAIN STATUS failed."); + + // Set to active mode + APDS9306_WRITE_BYTE(APDS9306_MAIN_CTRL, 0x02); + + ESP_LOGCONFIG(TAG, "APDS9306 setup complete"); +} + +void APDS9306::dump_config() { + LOG_SENSOR("", "APDS9306", this); + LOG_I2C_DEVICE(this); + + if (this->is_failed()) { + switch (this->error_code_) { + case COMMUNICATION_FAILED: + ESP_LOGE(TAG, "Communication with APDS9306 failed!"); + break; + case WRONG_ID: + ESP_LOGE(TAG, "APDS9306 has invalid id!"); + break; + default: + ESP_LOGE(TAG, "Setting up APDS9306 registers failed!"); + break; + } + } + + ESP_LOGCONFIG(TAG, " Gain: %u", AMBIENT_LIGHT_GAIN_VALUES[this->gain_]); + ESP_LOGCONFIG(TAG, " Measurement rate: %u", MEASUREMENT_RATE_VALUES[this->measurement_rate_]); + ESP_LOGCONFIG(TAG, " Measurement Resolution/Bit width: %d", MEASUREMENT_BIT_WIDTH_VALUES[this->bit_width_]); + + LOG_UPDATE_INTERVAL(this); +} + +void APDS9306::update() { + // Check for new data + uint8_t status; + APDS9306_WARNING_CHECK(this->read_byte(APDS9306_MAIN_STATUS, &status), "Reading MAIN STATUS failed."); + + this->status_clear_warning(); + + if (!(status &= 0b00001000)) { // No new data + return; + } + + // Set to standby mode + APDS9306_WRITE_BYTE(APDS9306_MAIN_CTRL, 0x00); + + // Clear MAIN STATUS + APDS9306_WARNING_CHECK(this->read_byte(APDS9306_MAIN_STATUS, &status), "Reading MAIN STATUS failed."); + + uint8_t als_data[3]; + APDS9306_WARNING_CHECK(this->read_bytes(APDS9306_ALS_DATA_0, als_data, 3), "Reading ALS data has failed."); + + // Set to active mode + APDS9306_WRITE_BYTE(APDS9306_MAIN_CTRL, 0x02); + + uint32_t light_level = 0x00 | encode_uint24(als_data[2], als_data[1], als_data[0]); + + float lux = ((float) light_level / AMBIENT_LIGHT_GAIN_VALUES[this->gain_]) * + (100.0f / MEASUREMENT_RATE_VALUES[this->measurement_rate_]); + + ESP_LOGD(TAG, "Got illuminance=%.1flx from", lux); + this->publish_state(lux); +} + +} // namespace apds9306 +} // namespace esphome diff --git a/esphome/components/apds9306/apds9306.h b/esphome/components/apds9306/apds9306.h new file mode 100644 index 0000000000..44362908c8 --- /dev/null +++ b/esphome/components/apds9306/apds9306.h @@ -0,0 +1,66 @@ +// Based on this datasheet: +// https://www.mouser.ca/datasheet/2/678/AVGO_S_A0002854364_1-2574547.pdf + +#pragma once + +#include "esphome/components/i2c/i2c.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/core/component.h" + +namespace esphome { +namespace apds9306 { + +enum MeasurementBitWidth : uint8_t { + MEASUREMENT_BIT_WIDTH_20 = 0, + MEASUREMENT_BIT_WIDTH_19 = 1, + MEASUREMENT_BIT_WIDTH_18 = 2, + MEASUREMENT_BIT_WIDTH_17 = 3, + MEASUREMENT_BIT_WIDTH_16 = 4, + MEASUREMENT_BIT_WIDTH_13 = 5, +}; +static const uint8_t MEASUREMENT_BIT_WIDTH_VALUES[] = {20, 19, 18, 17, 16, 13}; + +enum MeasurementRate : uint8_t { + MEASUREMENT_RATE_25 = 0, + MEASUREMENT_RATE_50 = 1, + MEASUREMENT_RATE_100 = 2, + MEASUREMENT_RATE_200 = 3, + MEASUREMENT_RATE_500 = 4, + MEASUREMENT_RATE_1000 = 5, + MEASUREMENT_RATE_2000 = 6, +}; +static const uint16_t MEASUREMENT_RATE_VALUES[] = {25, 50, 100, 200, 500, 1000, 2000}; + +enum AmbientLightGain : uint8_t { + AMBIENT_LIGHT_GAIN_1 = 0, + AMBIENT_LIGHT_GAIN_3 = 1, + AMBIENT_LIGHT_GAIN_6 = 2, + AMBIENT_LIGHT_GAIN_9 = 3, + AMBIENT_LIGHT_GAIN_18 = 4, +}; +static const uint8_t AMBIENT_LIGHT_GAIN_VALUES[] = {1, 3, 6, 9, 18}; + +class APDS9306 : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice { + public: + void setup() override; + float get_setup_priority() const override { return setup_priority::BUS; } + void dump_config() override; + void update() override; + void set_bit_width(MeasurementBitWidth bit_width) { this->bit_width_ = bit_width; } + void set_measurement_rate(MeasurementRate measurement_rate) { this->measurement_rate_ = measurement_rate; } + void set_ambient_light_gain(AmbientLightGain gain) { this->gain_ = gain; } + + protected: + enum ErrorCode { + NONE = 0, + COMMUNICATION_FAILED, + WRONG_ID, + } error_code_{NONE}; + + MeasurementBitWidth bit_width_; + MeasurementRate measurement_rate_; + AmbientLightGain gain_; +}; + +} // namespace apds9306 +} // namespace esphome diff --git a/esphome/components/apds9306/sensor.py b/esphome/components/apds9306/sensor.py new file mode 100644 index 0000000000..25b301444f --- /dev/null +++ b/esphome/components/apds9306/sensor.py @@ -0,0 +1,95 @@ +# Based on this datasheet: +# https://www.mouser.ca/datasheet/2/678/AVGO_S_A0002854364_1-2574547.pdf + +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import i2c, sensor +from esphome.const import ( + CONF_GAIN, + DEVICE_CLASS_ILLUMINANCE, + ICON_LIGHTBULB, + STATE_CLASS_MEASUREMENT, + UNIT_LUX, +) + +DEPENDENCIES = ["i2c"] + +CONF_APDS9306_ID = "apds9306_id" +CONF_BIT_WIDTH = "bit_width" +CONF_MEASUREMENT_RATE = "measurement_rate" + +apds9306_ns = cg.esphome_ns.namespace("apds9306") +APDS9306 = apds9306_ns.class_( + "APDS9306", sensor.Sensor, cg.PollingComponent, i2c.I2CDevice +) + +MeasurementBitWidth = apds9306_ns.enum("MeasurementBitWidth") +MeasurementRate = apds9306_ns.enum("MeasurementRate") +AmbientLightGain = apds9306_ns.enum("AmbientLightGain") + +MEASUREMENT_BIT_WIDTHS = { + 20: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_20, + 19: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_19, + 18: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_18, + 17: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_17, + 16: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_16, + 13: MeasurementBitWidth.MEASUREMENT_BIT_WIDTH_13, +} + +MEASUREMENT_RATES = { + 25: MeasurementRate.MEASUREMENT_RATE_25, + 50: MeasurementRate.MEASUREMENT_RATE_50, + 100: MeasurementRate.MEASUREMENT_RATE_100, + 200: MeasurementRate.MEASUREMENT_RATE_200, + 500: MeasurementRate.MEASUREMENT_RATE_500, + 1000: MeasurementRate.MEASUREMENT_RATE_1000, + 2000: MeasurementRate.MEASUREMENT_RATE_2000, +} + +AMBIENT_LIGHT_GAINS = { + 1: AmbientLightGain.AMBIENT_LIGHT_GAIN_1, + 3: AmbientLightGain.AMBIENT_LIGHT_GAIN_3, + 6: AmbientLightGain.AMBIENT_LIGHT_GAIN_6, + 9: AmbientLightGain.AMBIENT_LIGHT_GAIN_9, + 18: AmbientLightGain.AMBIENT_LIGHT_GAIN_18, +} + + +def _validate_measurement_rate(value): + value = cv.positive_time_period_milliseconds(value) + return cv.enum(MEASUREMENT_RATES, int=True)(value.total_milliseconds) + + +CONFIG_SCHEMA = ( + sensor.sensor_schema( + APDS9306, + unit_of_measurement=UNIT_LUX, + accuracy_decimals=1, + device_class=DEVICE_CLASS_ILLUMINANCE, + state_class=STATE_CLASS_MEASUREMENT, + icon=ICON_LIGHTBULB, + ) + .extend( + { + cv.Optional(CONF_GAIN, default="1"): cv.enum(AMBIENT_LIGHT_GAINS, int=True), + cv.Optional(CONF_BIT_WIDTH, default="18"): cv.enum( + MEASUREMENT_BIT_WIDTHS, int=True + ), + cv.Optional( + CONF_MEASUREMENT_RATE, default="100ms" + ): _validate_measurement_rate, + } + ) + .extend(cv.polling_component_schema("60s")) + .extend(i2c.i2c_device_schema(0x52)) +) + + +async def to_code(config): + var = await sensor.new_sensor(config) + await cg.register_component(var, config) + await i2c.register_i2c_device(var, config) + + cg.add(var.set_bit_width(config[CONF_BIT_WIDTH])) + cg.add(var.set_measurement_rate(config[CONF_MEASUREMENT_RATE])) + cg.add(var.set_ambient_light_gain(config[CONF_GAIN])) diff --git a/tests/components/apds9306/common.yaml b/tests/components/apds9306/common.yaml new file mode 100644 index 0000000000..b3828e62ff --- /dev/null +++ b/tests/components/apds9306/common.yaml @@ -0,0 +1,12 @@ +i2c: + - id: i2c_apds9306 + scl: ${scl_pin} + sda: ${sda_pin} + +sensor: + - platform: apds9306 + name: "APDS9306 Light Level" + gain: 3 + bit_width: 16 + measurement_rate: 2000ms + update_interval: 60s diff --git a/tests/components/apds9306/test.esp32-ard.yaml b/tests/components/apds9306/test.esp32-ard.yaml new file mode 100644 index 0000000000..3b761d3fc1 --- /dev/null +++ b/tests/components/apds9306/test.esp32-ard.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO22 + sda_pin: GPIO21 + +<<: !include common.yaml diff --git a/tests/components/apds9306/test.esp32-c3-ard.yaml b/tests/components/apds9306/test.esp32-c3-ard.yaml new file mode 100644 index 0000000000..ee2c29ca4e --- /dev/null +++ b/tests/components/apds9306/test.esp32-c3-ard.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO5 + sda_pin: GPIO4 + +<<: !include common.yaml diff --git a/tests/components/apds9306/test.esp32-c3-idf.yaml b/tests/components/apds9306/test.esp32-c3-idf.yaml new file mode 100644 index 0000000000..ee2c29ca4e --- /dev/null +++ b/tests/components/apds9306/test.esp32-c3-idf.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO5 + sda_pin: GPIO4 + +<<: !include common.yaml diff --git a/tests/components/apds9306/test.esp32-idf.yaml b/tests/components/apds9306/test.esp32-idf.yaml new file mode 100644 index 0000000000..3b761d3fc1 --- /dev/null +++ b/tests/components/apds9306/test.esp32-idf.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO22 + sda_pin: GPIO21 + +<<: !include common.yaml diff --git a/tests/components/apds9306/test.esp8266-ard.yaml b/tests/components/apds9306/test.esp8266-ard.yaml new file mode 100644 index 0000000000..ee2c29ca4e --- /dev/null +++ b/tests/components/apds9306/test.esp8266-ard.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO5 + sda_pin: GPIO4 + +<<: !include common.yaml diff --git a/tests/components/apds9306/test.rp2040-ard.yaml b/tests/components/apds9306/test.rp2040-ard.yaml new file mode 100644 index 0000000000..ee2c29ca4e --- /dev/null +++ b/tests/components/apds9306/test.rp2040-ard.yaml @@ -0,0 +1,5 @@ +substitutions: + scl_pin: GPIO5 + sda_pin: GPIO4 + +<<: !include common.yaml From dc24eefe08fb44491ef7623e7db551c319c11521 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:01:45 +1200 Subject: [PATCH 046/164] Bump docker/build-push-action from 6.4.1 to 6.5.0 in /.github/actions/build-image (#7119) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index e2febdad1b..bd9ceb8072 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.4.1 + uses: docker/build-push-action@v6.5.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.4.1 + uses: docker/build-push-action@v6.5.0 with: context: . file: ./docker/Dockerfile From ae476bb400f14d51c0e569a3807264a7abcd01e1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:51:32 +1200 Subject: [PATCH 047/164] [http_request] Change default timeout to 4.5s (#7123) --- esphome/components/http_request/__init__.py | 2 +- esphome/components/http_request/http_request.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index ade7024bed..ef387553fe 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -99,7 +99,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_FOLLOW_REDIRECTS, True): cv.boolean, cv.Optional(CONF_REDIRECT_LIMIT, 3): cv.int_, cv.Optional( - CONF_TIMEOUT, default="5s" + CONF_TIMEOUT, default="4.5s" ): cv.positive_time_period_milliseconds, cv.SplitDefault(CONF_ESP8266_DISABLE_SSL_SUPPORT, esp8266=False): cv.All( cv.only_on_esp8266, cv.boolean diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 82b7392648..c01baf8644 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -80,7 +80,7 @@ class HttpRequestComponent : public Component { const char *useragent_{nullptr}; bool follow_redirects_; uint16_t redirect_limit_; - uint16_t timeout_{5000}; + uint16_t timeout_{4500}; uint32_t watchdog_timeout_{0}; }; From 2b2a83273fdad8c105acf5a7aedd1d63042891ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:20:44 +1200 Subject: [PATCH 048/164] Bump docker/setup-qemu-action from 3.1.0 to 3.2.0 (#7120) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 147efe089e..999a2f03d2 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -48,7 +48,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU - uses: docker/setup-qemu-action@v3.1.0 + uses: docker/setup-qemu-action@v3.2.0 - name: Set TAG run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f66c504bda..2fdac00589 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -93,7 +93,7 @@ jobs: uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU if: matrix.platform != 'linux/amd64' - uses: docker/setup-qemu-action@v3.1.0 + uses: docker/setup-qemu-action@v3.2.0 - name: Log in to docker hub uses: docker/login-action@v3.2.0 From f0d4b5f74051b596752f3df0e3332720ef79f089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:20:54 +1200 Subject: [PATCH 049/164] Bump docker/login-action from 3.2.0 to 3.3.0 (#7121) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2fdac00589..c1488d8b89 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,12 +96,12 @@ jobs: uses: docker/setup-qemu-action@v3.2.0 - name: Log in to docker hub - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Log in to the GitHub container registry - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -188,13 +188,13 @@ jobs: - name: Log in to docker hub if: matrix.registry == 'dockerhub' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Log in to the GitHub container registry if: matrix.registry == 'ghcr' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} From e88e32bf232080d9f7ab0cbb47e22d59557b9860 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:21:03 +1200 Subject: [PATCH 050/164] Bump docker/setup-buildx-action from 3.4.0 to 3.5.0 (#7122) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 999a2f03d2..2b4539105b 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -46,7 +46,7 @@ jobs: with: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.4.0 + uses: docker/setup-buildx-action@v3.5.0 - name: Set up QEMU uses: docker/setup-qemu-action@v3.2.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c1488d8b89..efec556059 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,7 @@ jobs: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.4.0 + uses: docker/setup-buildx-action@v3.5.0 - name: Set up QEMU if: matrix.platform != 'linux/amd64' uses: docker/setup-qemu-action@v3.2.0 @@ -184,7 +184,7 @@ jobs: merge-multiple: true - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.4.0 + uses: docker/setup-buildx-action@v3.5.0 - name: Log in to docker hub if: matrix.registry == 'dockerhub' From 19a787c2352bca62c3e642ed421a4e2a0185cfaa Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 Jul 2024 04:53:31 +0200 Subject: [PATCH 051/164] [fan] fix initial FanCall to properly set speed (#7113) Speed settings were ignored for the first FanCall, if no speed has been restored before. This commit changes the behaviour to: set speed to 100%, iff current speed AND new speed are not set. --- esphome/components/fan/fan.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/fan/fan.cpp b/esphome/components/fan/fan.cpp index 95e3ae0758..1d560d2fc6 100644 --- a/esphome/components/fan/fan.cpp +++ b/esphome/components/fan/fan.cpp @@ -45,8 +45,8 @@ void FanCall::validate_() { this->speed_ = clamp(*this->speed_, 1, traits.supported_speed_count()); if (this->binary_state_.has_value() && *this->binary_state_) { - // when turning on, if current speed is zero, set speed to 100% - if (traits.supports_speed() && !this->parent_.state && this->parent_.speed == 0) { + // when turning on, if neither current nor new speed available, set speed to 100% + if (traits.supports_speed() && !this->parent_.state && this->parent_.speed == 0 && !this->speed_.has_value()) { this->speed_ = traits.supported_speed_count(); } } From 2cc14055cfa4080dfb3c0612cefa96ee0a76df9b Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:12:23 +1000 Subject: [PATCH 052/164] Added ruff to pre-commit hooks (#7124) --- .pre-commit-config.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 74acfa1c1d..aeb434167a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,6 +2,15 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.5.4 + hooks: + # Run the linter. + - id: ruff + args: [--fix] + # Run the formatter. + - id: ruff-format - repo: https://github.com/psf/black-pre-commit-mirror rev: 24.4.2 hooks: From 39de179e213f79f8016a1ae764c87fe77333d5dc Mon Sep 17 00:00:00 2001 From: dentra Date: Wed, 24 Jul 2024 03:12:59 +0300 Subject: [PATCH 053/164] [http_request] Fix ESP-IDF follow redirect (#7101) --- esphome/components/http_request/__init__.py | 14 ++-- .../http_request/http_request_idf.cpp | 66 +++++++++++++++---- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index ef387553fe..161486fbb2 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -1,17 +1,17 @@ -import esphome.codegen as cg -import esphome.config_validation as cv from esphome import automation +import esphome.codegen as cg +from esphome.components import esp32 +import esphome.config_validation as cv from esphome.const import ( - __version__, + CONF_ESP8266_DISABLE_SSL_SUPPORT, CONF_ID, - CONF_TIMEOUT, CONF_METHOD, + CONF_TIMEOUT, CONF_TRIGGER_ID, CONF_URL, - CONF_ESP8266_DISABLE_SSL_SUPPORT, + __version__, ) -from esphome.core import Lambda, CORE -from esphome.components import esp32 +from esphome.core import CORE, Lambda DEPENDENCIES = ["network"] AUTO_LOAD = ["json"] diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 68e0639b99..1f03b5f3bf 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -77,7 +77,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin esp_http_client_set_header(client, header.name, header.value); } - int body_len = body.length(); + const int body_len = body.length(); esp_err_t err = esp_http_client_open(client, body_len); if (err != ESP_OK) { @@ -109,18 +109,62 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin return nullptr; } - container->content_length = esp_http_client_fetch_headers(client); - const auto status_code = esp_http_client_get_status_code(client); - container->status_code = status_code; + auto is_ok = [](int code) { return code >= HttpStatus_Ok && code < HttpStatus_MultipleChoices; }; - if (status_code < 200 || status_code >= 300) { - ESP_LOGE(TAG, "HTTP Request failed; URL: %s; Code: %d", url.c_str(), status_code); - this->status_momentary_error("failed", 1000); - esp_http_client_cleanup(client); - return nullptr; + container->content_length = esp_http_client_fetch_headers(client); + container->status_code = esp_http_client_get_status_code(client); + if (is_ok(container->status_code)) { + container->duration_ms = millis() - start; + return container; } - container->duration_ms = millis() - start; - return container; + + if (this->follow_redirects_) { + auto is_redirect = [](int code) { + return code == HttpStatus_MovedPermanently || code == HttpStatus_Found || code == HttpStatus_SeeOther || + code == HttpStatus_TemporaryRedirect || code == HttpStatus_PermanentRedirect; + }; + auto num_redirects = this->redirect_limit_; + while (is_redirect(container->status_code) && num_redirects > 0) { + err = esp_http_client_set_redirection(client); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_http_client_set_redirection failed: %s", esp_err_to_name(err)); + this->status_momentary_error("failed", 1000); + esp_http_client_cleanup(client); + return nullptr; + } +#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE + char url[256]{}; + if (esp_http_client_get_url(client, url, sizeof(url) - 1) == ESP_OK) { + ESP_LOGV(TAG, "redirecting to url: %s", url); + } +#endif + err = esp_http_client_open(client, 0); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_http_client_open failed: %s", esp_err_to_name(err)); + this->status_momentary_error("failed", 1000); + esp_http_client_cleanup(client); + return nullptr; + } + + container->content_length = esp_http_client_fetch_headers(client); + container->status_code = esp_http_client_get_status_code(client); + if (is_ok(container->status_code)) { + container->duration_ms = millis() - start; + return container; + } + + num_redirects--; + } + + if (num_redirects == 0) { + ESP_LOGW(TAG, "Reach redirect limit count=%d", this->redirect_limit_); + } + } + + ESP_LOGE(TAG, "HTTP Request failed; URL: %s; Code: %d", url.c_str(), container->status_code); + this->status_momentary_error("failed", 1000); + esp_http_client_cleanup(client); + return nullptr; } int HttpContainerIDF::read(uint8_t *buf, size_t max_len) { From da10de9ea8c0129394cb98ccd3b79fcdcb78dfb0 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Wed, 24 Jul 2024 13:57:02 +1200 Subject: [PATCH 054/164] Update webserver local assets to 20240724-013115 (#7126) --- .../components/web_server/server_index_v3.h | 7218 +++++++++-------- 1 file changed, 3615 insertions(+), 3603 deletions(-) diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index 0c16ea9f37..0f3f743a73 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -397,3609 +397,3621 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xa5, 0x01, 0xe6, 0xde, 0x48, 0xc3, 0x50, 0xf1, 0xe6, 0x90, 0xe9, 0x1b, 0xc6, 0xc4, 0xb7, 0x07, 0x71, 0x99, 0x4a, 0x91, 0xdf, 0xd9, 0xcf, 0x65, 0xd8, 0x25, 0x5d, 0x68, 0xb9, 0x4e, 0x86, 0x5c, 0xd0, 0xe2, 0xee, 0x5a, 0x31, 0xa1, 0x64, 0x71, 0x2d, 0xc7, 0xe3, 0xe5, 0xb7, 0x48, 0xcb, 0x7d, 0xb4, 0x4e, 0x14, 0x17, 0x93, 0x9c, 0x59, 0xa2, 0x64, - 0x10, 0xc1, 0x11, 0x73, 0xdb, 0xae, 0x69, 0xb2, 0x36, 0xe8, 0x70, 0xe7, 0x99, 0x76, 0x07, 0x69, 0xda, 0xbc, 0x61, - 0xc3, 0xcf, 0x5c, 0x5b, 0x3c, 0x6b, 0xaa, 0x1b, 0xf0, 0x78, 0x31, 0xcb, 0x30, 0x67, 0xc5, 0xd2, 0xd3, 0xf0, 0x56, - 0x8d, 0xea, 0x5c, 0x09, 0x73, 0x7a, 0x68, 0x3a, 0x6c, 0x42, 0xfc, 0x2f, 0x56, 0x94, 0x7b, 0x8c, 0x0b, 0x83, 0x31, - 0x06, 0x40, 0x9b, 0xbb, 0x24, 0x3c, 0x03, 0x4e, 0x5a, 0x2d, 0x7f, 0x3e, 0x34, 0x6d, 0x9d, 0xb4, 0x9d, 0x9c, 0xb2, - 0xd9, 0xae, 0xfd, 0x59, 0x27, 0x46, 0xed, 0xce, 0xfc, 0x76, 0xcf, 0xfc, 0xd3, 0xda, 0x6b, 0x6d, 0x13, 0x9f, 0x6d, - 0x38, 0x1d, 0x23, 0xbf, 0xb2, 0x5a, 0xce, 0xd3, 0x36, 0x9b, 0x75, 0x17, 0x0a, 0x0e, 0x1a, 0x43, 0x1b, 0xcd, 0x01, - 0xb6, 0x36, 0x33, 0x81, 0x75, 0xa4, 0x5c, 0x00, 0x5d, 0xb7, 0x67, 0x1b, 0xf4, 0xa1, 0x24, 0x18, 0x62, 0xef, 0x6c, - 0xb4, 0x3e, 0xac, 0xd6, 0x5e, 0x35, 0x30, 0xf8, 0x67, 0xfd, 0x57, 0xc5, 0x19, 0xbe, 0x60, 0x01, 0x67, 0xce, 0x1b, - 0xc9, 0xe9, 0xaa, 0xe5, 0xb8, 0xf1, 0x91, 0xae, 0x84, 0x04, 0xe3, 0xcb, 0x30, 0xa3, 0xb7, 0xd6, 0xa9, 0x61, 0xc6, - 0x05, 0x98, 0x4c, 0x21, 0xac, 0x03, 0xe3, 0xf2, 0x69, 0xd8, 0xd0, 0x48, 0xc7, 0xd0, 0xf0, 0x61, 0x27, 0x39, 0x3d, - 0x45, 0xb8, 0x85, 0x3b, 0xa7, 0xa7, 0x81, 0x34, 0x30, 0xd6, 0xbb, 0x8a, 0xee, 0x2a, 0xa9, 0x76, 0x94, 0x3c, 0x32, - 0x8d, 0x1e, 0xb5, 0x5b, 0x2d, 0x6c, 0x1c, 0xb7, 0xcb, 0xc2, 0x5c, 0xed, 0x68, 0xb6, 0xdd, 0x6a, 0x41, 0xb3, 0xf0, - 0xc7, 0xcd, 0xeb, 0x17, 0xb2, 0x6c, 0xa5, 0x2d, 0xdc, 0x4e, 0xdb, 0xb8, 0x93, 0x76, 0xf0, 0x71, 0x7a, 0x8c, 0x4f, - 0xd2, 0x13, 0x7c, 0x9a, 0x9e, 0xe2, 0xb3, 0xf4, 0x0c, 0xdf, 0x4f, 0xef, 0xe3, 0xf3, 0xf4, 0x1c, 0x3f, 0x48, 0x1f, - 0xe0, 0x87, 0x69, 0xbb, 0x85, 0x1f, 0xa5, 0xed, 0x36, 0x7e, 0x9c, 0xb6, 0x3b, 0xf8, 0x49, 0xda, 0x3e, 0xc6, 0x4f, - 0xd3, 0xf6, 0x09, 0x7e, 0x96, 0xb6, 0x4f, 0x31, 0x85, 0xdc, 0x21, 0xe4, 0x66, 0x90, 0x3b, 0x82, 0x5c, 0x06, 0xb9, - 0xe3, 0xb4, 0x7d, 0xba, 0xc6, 0xca, 0x06, 0x7b, 0x88, 0x5a, 0xed, 0xce, 0xf1, 0xc9, 0xe9, 0xd9, 0xfd, 0xf3, 0x07, - 0x0f, 0x1f, 0x3d, 0x7e, 0xf2, 0xf4, 0x59, 0x34, 0xc0, 0x43, 0xe3, 0x73, 0xa1, 0x44, 0x9f, 0x1f, 0xb4, 0x4f, 0x07, - 0xf8, 0xda, 0x7f, 0xc6, 0xfc, 0xa0, 0x73, 0xd2, 0x42, 0x97, 0x97, 0x27, 0x83, 0x46, 0x99, 0xfb, 0xde, 0xb8, 0x7a, - 0x54, 0x59, 0x84, 0x90, 0x18, 0x72, 0x10, 0xbe, 0x33, 0xf5, 0xde, 0xb3, 0x98, 0x27, 0x05, 0x3a, 0x38, 0x30, 0x3f, - 0x26, 0xfe, 0xc7, 0xd0, 0xff, 0xa0, 0xc1, 0x22, 0xdd, 0xd2, 0xd8, 0xf9, 0xfa, 0xea, 0xd2, 0xd2, 0xbe, 0x34, 0x62, - 0xd9, 0xe3, 0xce, 0x9c, 0xfc, 0xbf, 0x22, 0x6b, 0x2e, 0x42, 0x4e, 0xac, 0x4a, 0xe6, 0xb4, 0xc7, 0xc8, 0xb2, 0x48, - 0x3b, 0xa7, 0xa7, 0x07, 0xbf, 0xf4, 0x79, 0xbf, 0x3d, 0x18, 0x1c, 0xb6, 0xef, 0xe3, 0x49, 0x99, 0xd0, 0xb1, 0x09, - 0xc3, 0x32, 0xe1, 0xd8, 0x26, 0xd0, 0xd4, 0xd6, 0x86, 0xa4, 0x13, 0x93, 0x04, 0x25, 0xd6, 0xa9, 0x69, 0xfb, 0xbe, - 0x6d, 0xfb, 0x01, 0xd8, 0x31, 0x99, 0xe6, 0x5d, 0xd3, 0x17, 0x17, 0x27, 0x2b, 0xd7, 0x28, 0x9e, 0xa4, 0xae, 0x35, - 0x9f, 0x78, 0x32, 0x18, 0xe0, 0xa1, 0x49, 0x3c, 0xad, 0x12, 0xcf, 0x06, 0x03, 0xd7, 0xd5, 0x03, 0xd3, 0xd5, 0xfd, - 0x2a, 0xeb, 0x7c, 0x30, 0x30, 0x5d, 0x22, 0xe7, 0xb5, 0xae, 0xf4, 0xde, 0x97, 0x52, 0x73, 0xc0, 0x2f, 0x3a, 0xa7, - 0xa7, 0x3d, 0xc0, 0x30, 0x63, 0x8d, 0xea, 0x61, 0x74, 0x13, 0xc0, 0xe8, 0x0e, 0x7e, 0xf7, 0x86, 0x34, 0xbd, 0xa6, - 0x25, 0x90, 0x7a, 0xd1, 0x7f, 0x45, 0x0d, 0x6d, 0x60, 0x6e, 0xfe, 0x4c, 0xec, 0x9f, 0x21, 0x6a, 0x7c, 0xa1, 0x00, - 0x6e, 0xd0, 0x85, 0x78, 0x65, 0xa6, 0xe9, 0xf1, 0x33, 0x05, 0xe7, 0x92, 0xa9, 0xca, 0x69, 0x6f, 0x35, 0xbd, 0x19, - 0xae, 0xa6, 0xea, 0x0b, 0xfa, 0x33, 0xfe, 0x53, 0x1d, 0xc6, 0xfd, 0x66, 0x23, 0x61, 0x7f, 0x8e, 0xc0, 0x8b, 0xa5, - 0x97, 0x8e, 0xd8, 0x04, 0xf5, 0xfa, 0x7f, 0x2a, 0x3c, 0x68, 0x04, 0x19, 0x3f, 0x6c, 0xa7, 0x80, 0x8f, 0xcb, 0x66, - 0x62, 0xfc, 0x03, 0xea, 0xa1, 0xde, 0x9f, 0xea, 0xf0, 0x4f, 0x74, 0xef, 0xa8, 0x9a, 0xcb, 0xef, 0xd2, 0x6d, 0xe1, - 0x2a, 0xf0, 0xcd, 0x61, 0xb9, 0x85, 0x19, 0x6e, 0x37, 0x19, 0x84, 0x09, 0x03, 0x27, 0x68, 0x12, 0xcb, 0x06, 0x3f, - 0x3a, 0x6e, 0xa1, 0x1f, 0xda, 0x1d, 0x10, 0xeb, 0x9b, 0xe2, 0x70, 0x7b, 0xd3, 0x17, 0xcd, 0x63, 0xfc, 0xa0, 0x59, - 0xe0, 0x36, 0xc2, 0xcd, 0xb6, 0xd7, 0xb7, 0xf6, 0x55, 0xdc, 0x42, 0x58, 0xc5, 0xe7, 0xf0, 0xcf, 0x09, 0x1a, 0x54, - 0x1b, 0xf2, 0x8a, 0x6e, 0xf6, 0x0e, 0x1e, 0x9b, 0x24, 0x56, 0x0d, 0x7e, 0x74, 0xd6, 0x42, 0x3f, 0x9c, 0x99, 0x8e, - 0xd8, 0xa1, 0xde, 0xd1, 0x95, 0xc4, 0x27, 0x4d, 0x09, 0x1d, 0xb5, 0xca, 0x7e, 0x44, 0x7c, 0x8a, 0xb0, 0x88, 0x8f, - 0xe1, 0x9f, 0x76, 0xd8, 0xcf, 0xaf, 0x5b, 0xfd, 0x98, 0x79, 0xb7, 0x71, 0x72, 0x6a, 0x1d, 0x40, 0x95, 0xbd, 0x8d, - 0x6d, 0xb0, 0xcb, 0xb6, 0xb9, 0x46, 0x6a, 0x1f, 0xc1, 0x07, 0xc2, 0xfa, 0x90, 0x28, 0xcc, 0x0e, 0xc1, 0x73, 0x14, - 0x0c, 0x26, 0xd4, 0xc5, 0x71, 0x57, 0x35, 0x1a, 0x48, 0xf4, 0xd5, 0xe0, 0x90, 0xb4, 0x9b, 0xba, 0xc9, 0x30, 0xfc, - 0x6e, 0x90, 0x32, 0x1c, 0x99, 0xa8, 0x7a, 0x7d, 0xec, 0x7a, 0xb5, 0x77, 0xce, 0x1e, 0x3b, 0x08, 0x21, 0xaa, 0x17, - 0xeb, 0x26, 0x43, 0x47, 0xa2, 0x11, 0xeb, 0x0b, 0xd6, 0x3b, 0x4b, 0x5b, 0xc8, 0x60, 0xa7, 0xea, 0xc5, 0xac, 0xc9, - 0x21, 0xbd, 0x93, 0xc6, 0xbc, 0xa9, 0xe1, 0xd7, 0x49, 0x30, 0x0b, 0x01, 0x78, 0x57, 0xf9, 0xc1, 0x14, 0x47, 0x9d, - 0xd3, 0x53, 0x2c, 0x08, 0x4f, 0x26, 0xe6, 0x97, 0x22, 0x3c, 0x19, 0x9a, 0x5f, 0x92, 0x94, 0xf0, 0xb2, 0xbd, 0xe3, - 0x82, 0x04, 0xab, 0x6a, 0x52, 0x28, 0x2c, 0x68, 0x81, 0x8e, 0x3a, 0xfe, 0x42, 0x1a, 0x4f, 0xfd, 0x1c, 0x40, 0x00, - 0x2f, 0x8c, 0x2d, 0xa2, 0x6c, 0x16, 0x38, 0x27, 0xf4, 0x32, 0x39, 0xed, 0x4d, 0x8f, 0xe2, 0x4e, 0x53, 0x36, 0x0b, - 0x94, 0x4e, 0x8f, 0x4c, 0x4d, 0x9c, 0x91, 0xc7, 0xd4, 0xb6, 0x86, 0xa7, 0x70, 0x8b, 0x98, 0x91, 0xec, 0xf0, 0xac, - 0xd5, 0x48, 0x4e, 0x11, 0xee, 0x67, 0xab, 0x16, 0xce, 0x57, 0xab, 0x16, 0xa6, 0xc1, 0x32, 0x3c, 0x16, 0x1e, 0x20, - 0xa5, 0x8e, 0x68, 0x33, 0x2a, 0x4c, 0x8f, 0xc7, 0x1a, 0x6e, 0xc4, 0x35, 0xf8, 0x99, 0x68, 0xf0, 0x80, 0x49, 0xb9, - 0xbb, 0x8a, 0x42, 0x26, 0x2e, 0xde, 0x38, 0xd4, 0x1a, 0xbd, 0x16, 0x7e, 0x5d, 0xbd, 0x4d, 0xa3, 0x88, 0x7f, 0x97, - 0xd8, 0xa6, 0x05, 0xc5, 0xe8, 0x76, 0xb1, 0x5f, 0xe9, 0x56, 0xb1, 0x37, 0x3b, 0x8a, 0x5d, 0x6d, 0x17, 0xfb, 0x28, - 0x03, 0x1d, 0x17, 0xff, 0xe1, 0xf8, 0xac, 0xd5, 0x38, 0x06, 0x64, 0x3d, 0x3e, 0x6b, 0x55, 0x85, 0xee, 0xd1, 0x6a, - 0xad, 0x34, 0xf9, 0x4c, 0xad, 0x95, 0x3f, 0xf7, 0xee, 0xc6, 0x66, 0xe1, 0xac, 0xb3, 0x73, 0xe9, 0xd9, 0xdc, 0x3f, - 0x05, 0x2b, 0x0a, 0x61, 0xa8, 0x9d, 0xee, 0x9f, 0x0d, 0x7a, 0x53, 0x16, 0x37, 0x20, 0x15, 0xa5, 0x63, 0xed, 0x7e, - 0xa1, 0xf2, 0x32, 0xf5, 0xa3, 0x84, 0xa4, 0xce, 0x00, 0x61, 0x49, 0x1a, 0xba, 0x7f, 0x3c, 0x30, 0xe7, 0x5d, 0x01, - 0xbf, 0x4f, 0xcc, 0xef, 0x52, 0x95, 0xe1, 0x5c, 0x01, 0xa6, 0x37, 0xc3, 0xa8, 0x27, 0xc8, 0x6b, 0x1a, 0x1b, 0xeb, - 0x6e, 0x94, 0x96, 0x19, 0xea, 0x0b, 0x64, 0xbc, 0x29, 0x33, 0x04, 0x79, 0x2d, 0xdc, 0x6f, 0xbc, 0x2c, 0x52, 0xb0, - 0xf4, 0xc0, 0x93, 0x14, 0xac, 0x3c, 0xf0, 0x30, 0x15, 0xe0, 0x89, 0x40, 0x53, 0x16, 0xd8, 0x8f, 0x3f, 0x74, 0xba, - 0x23, 0x73, 0xdf, 0x49, 0x0c, 0x96, 0x76, 0x19, 0x9c, 0x14, 0x1f, 0x65, 0x0c, 0x7f, 0x1b, 0x1a, 0x61, 0x06, 0x6d, - 0x32, 0x84, 0x79, 0x52, 0x10, 0x48, 0xc3, 0x3c, 0x99, 0x10, 0x06, 0x4d, 0xf2, 0x64, 0x48, 0x58, 0xbf, 0x13, 0xa0, - 0xc9, 0x53, 0x03, 0x3b, 0x00, 0x0e, 0xaf, 0x5f, 0x21, 0x6b, 0xdb, 0x38, 0xdc, 0x4d, 0x43, 0x13, 0x82, 0x70, 0x15, - 0xc3, 0x2c, 0x60, 0x73, 0x9a, 0x9f, 0x9d, 0x2a, 0xf0, 0x22, 0x4f, 0xa8, 0xa1, 0xde, 0x7f, 0x01, 0x59, 0x8d, 0xef, - 0x2d, 0xd9, 0x1a, 0xef, 0xdd, 0x5b, 0x8a, 0xf5, 0x0f, 0xf0, 0x47, 0xb9, 0x3f, 0xda, 0x9c, 0x7e, 0x6b, 0xf4, 0x57, - 0x0a, 0xc5, 0x76, 0x94, 0x42, 0x7f, 0x79, 0x47, 0x34, 0x45, 0x96, 0xb7, 0x69, 0x34, 0xa2, 0xc5, 0xe7, 0x08, 0x7f, - 0x4a, 0xa3, 0x1c, 0x18, 0xc1, 0x08, 0x7f, 0x4c, 0xa3, 0x82, 0x45, 0xf8, 0x8f, 0x34, 0x1a, 0xe6, 0x8b, 0x08, 0x7f, - 0x48, 0xa3, 0x49, 0x11, 0xe1, 0xf7, 0xa0, 0x26, 0x1c, 0xf1, 0xc5, 0x2c, 0xc2, 0xbf, 0xa7, 0x91, 0x32, 0x76, 0xf8, - 0xf8, 0x61, 0x1a, 0x31, 0x16, 0xe1, 0x77, 0x69, 0x24, 0xf3, 0x08, 0x5f, 0xa5, 0x91, 0x2c, 0x22, 0xfc, 0x28, 0x8d, - 0x0a, 0x1a, 0xe1, 0xc7, 0x69, 0x04, 0x85, 0x26, 0x11, 0x7e, 0x92, 0x46, 0xd0, 0xb2, 0x8a, 0xf0, 0xdb, 0x34, 0xe2, - 0x22, 0xc2, 0xbf, 0xa5, 0x91, 0x5e, 0x14, 0xff, 0x2c, 0x24, 0x57, 0x11, 0x7e, 0x9a, 0x46, 0x53, 0x1e, 0xe1, 0x37, - 0x69, 0x54, 0xc8, 0x08, 0xbf, 0x4e, 0x23, 0x9a, 0x47, 0xf8, 0x55, 0x1a, 0xe5, 0x2c, 0xc2, 0xbf, 0xa6, 0xd1, 0x88, - 0x45, 0xf8, 0x65, 0x1a, 0xdd, 0xb1, 0x3c, 0x97, 0x11, 0x7e, 0x96, 0x46, 0x4c, 0x44, 0xf8, 0x97, 0x34, 0xca, 0xa6, - 0x11, 0xfe, 0x29, 0x8d, 0x68, 0xf1, 0x59, 0x45, 0xf8, 0x79, 0x1a, 0x31, 0x1a, 0xe1, 0x17, 0xb6, 0xa3, 0x49, 0x84, - 0x7f, 0x4e, 0xa3, 0x9b, 0x69, 0xb4, 0xc6, 0x4a, 0x91, 0xe5, 0x6b, 0x9e, 0xb1, 0x3f, 0x58, 0x1a, 0x8d, 0x5b, 0xe3, - 0xf3, 0xf1, 0x38, 0xc2, 0x54, 0x68, 0xfe, 0xcf, 0x82, 0xdd, 0x3c, 0xd5, 0x90, 0x48, 0xd9, 0x70, 0x74, 0x3f, 0xc2, - 0xf4, 0x9f, 0x05, 0x4d, 0xa3, 0xf1, 0xd8, 0x14, 0xf8, 0x67, 0x41, 0x67, 0xb4, 0x78, 0xcb, 0xd2, 0xe8, 0xfe, 0x78, - 0x3c, 0x1e, 0x9d, 0x44, 0x98, 0x7e, 0x5d, 0x7c, 0x34, 0x2d, 0x98, 0x02, 0x43, 0xc6, 0x27, 0x50, 0xf7, 0x74, 0x7c, - 0x3a, 0xca, 0x22, 0x3c, 0xe4, 0xea, 0x9f, 0x05, 0x7c, 0x8f, 0xd9, 0x49, 0x76, 0x12, 0xe1, 0x61, 0x4e, 0xb3, 0xcf, - 0x69, 0xd4, 0x32, 0xbf, 0xc4, 0x2f, 0x6c, 0xf4, 0x7a, 0x26, 0x8d, 0x12, 0x7d, 0xcc, 0x86, 0xd9, 0x28, 0xc2, 0x66, - 0x30, 0x63, 0xf8, 0xfb, 0x85, 0xbf, 0x63, 0x3a, 0x8d, 0xce, 0x69, 0x67, 0xc8, 0x3a, 0x11, 0x1e, 0xbe, 0xb9, 0x11, - 0x69, 0x44, 0x4f, 0x3b, 0xb4, 0x43, 0x23, 0x3c, 0x5c, 0x14, 0xf9, 0xdd, 0x8d, 0x94, 0x23, 0x00, 0xc2, 0xf0, 0xfc, - 0xfc, 0x7e, 0x84, 0x33, 0xfa, 0xab, 0x86, 0xda, 0xa7, 0xe3, 0x07, 0x8c, 0xb6, 0x22, 0xfc, 0x0b, 0x2d, 0xf4, 0xc7, - 0x85, 0x72, 0x03, 0x6d, 0x41, 0x8a, 0xcc, 0xde, 0x81, 0x82, 0x39, 0x1a, 0x75, 0xce, 0x1e, 0xb4, 0x59, 0x84, 0xb3, - 0xab, 0xd7, 0xd0, 0xdb, 0xfd, 0xf1, 0x69, 0x0b, 0x3e, 0x04, 0x48, 0x6a, 0xac, 0x80, 0x46, 0xce, 0x4e, 0x1e, 0x9c, - 0xb2, 0x91, 0x49, 0x54, 0x3c, 0xff, 0x6c, 0x66, 0x7f, 0x0e, 0xf3, 0xc9, 0x0a, 0x3e, 0x53, 0x52, 0xa4, 0xd1, 0x28, - 0x6b, 0x9f, 0x1c, 0x43, 0xc2, 0x1d, 0x15, 0x1e, 0x38, 0xb7, 0x50, 0xf5, 0x7c, 0x18, 0xe1, 0x5b, 0x9b, 0x7a, 0x3e, - 0x34, 0x1f, 0x93, 0x77, 0xbf, 0x8a, 0x37, 0xa3, 0x34, 0x1a, 0x9e, 0x9f, 0x9f, 0xb5, 0x20, 0xe1, 0x03, 0xbd, 0x4b, - 0x23, 0xfa, 0x00, 0xfe, 0x83, 0xec, 0x8f, 0xcf, 0xa0, 0x43, 0x18, 0xe1, 0xed, 0xe4, 0x63, 0x98, 0xf3, 0x79, 0x4a, - 0x3f, 0xf3, 0x34, 0x1a, 0x8e, 0x86, 0xf7, 0xcf, 0xa0, 0xde, 0x8c, 0x4e, 0x9e, 0x69, 0x0a, 0xed, 0xb6, 0x5a, 0xa6, - 0xe5, 0x77, 0xfc, 0x0b, 0x33, 0xd5, 0x4f, 0x4f, 0xcf, 0x86, 0x1d, 0x18, 0xc1, 0x15, 0xa8, 0x18, 0x60, 0x3c, 0xe7, - 0x99, 0x69, 0xf0, 0x2a, 0x7b, 0x3a, 0x4a, 0xa3, 0x07, 0x0f, 0x8e, 0x3b, 0x59, 0x16, 0xe1, 0xdb, 0x8f, 0x23, 0x5b, - 0xdb, 0xe4, 0x29, 0x80, 0x7d, 0x1a, 0xb1, 0x07, 0x0f, 0xce, 0xee, 0x53, 0xf8, 0x7e, 0x6e, 0xda, 0x3a, 0x1f, 0x0f, - 0xb3, 0x73, 0x68, 0xeb, 0x77, 0x98, 0xce, 0xc9, 0xf9, 0xf1, 0xc8, 0xf4, 0xf5, 0xbb, 0x19, 0x75, 0x67, 0x7c, 0x32, - 0x3e, 0x31, 0x99, 0x66, 0xa8, 0xe5, 0xe7, 0x6f, 0x2c, 0x8d, 0x32, 0x36, 0x6a, 0x47, 0xf8, 0xd6, 0x2d, 0xdc, 0x83, - 0x93, 0x56, 0x6b, 0x74, 0x1c, 0xe1, 0xd1, 0xc3, 0xf9, 0xfc, 0xad, 0x81, 0x60, 0xfb, 0xe4, 0x81, 0xfd, 0x56, 0x9f, - 0xef, 0xa0, 0xe9, 0xa1, 0x01, 0xda, 0x88, 0xcf, 0x4c, 0xcb, 0x67, 0x0f, 0xe0, 0x3f, 0xf3, 0x6d, 0x9a, 0x2e, 0xbf, - 0xe5, 0x68, 0x62, 0x17, 0xa5, 0xcd, 0x1e, 0xb4, 0xa0, 0xc6, 0x98, 0x7f, 0x1c, 0x16, 0x1c, 0xd0, 0x68, 0xd8, 0x81, - 0xff, 0x8b, 0xf0, 0x38, 0xbf, 0x7a, 0xed, 0x70, 0x76, 0x3c, 0xa6, 0xe3, 0x56, 0x84, 0xc7, 0xf2, 0xa3, 0xd2, 0x1f, - 0x1e, 0x8a, 0x34, 0xea, 0x74, 0xce, 0x87, 0xa6, 0xcc, 0xe2, 0x17, 0xc5, 0x0d, 0x1e, 0xb7, 0x4c, 0x2b, 0x13, 0xfa, - 0x56, 0x0d, 0xaf, 0x24, 0xac, 0x24, 0xfc, 0x17, 0xe1, 0x09, 0xe8, 0xa5, 0x5c, 0x2b, 0xe7, 0x76, 0x3b, 0x4c, 0xde, - 0x19, 0xd4, 0x1c, 0xdd, 0x07, 0x78, 0xf9, 0x65, 0x1c, 0x51, 0x7a, 0xda, 0x69, 0x45, 0xd8, 0x8c, 0xfa, 0xbc, 0x05, - 0xff, 0x45, 0xd8, 0x42, 0xce, 0xc0, 0x75, 0xf2, 0xf1, 0xd9, 0xcb, 0x9b, 0x34, 0xa2, 0xa3, 0xf1, 0x18, 0x96, 0xc4, - 0x4c, 0xc6, 0x17, 0x9b, 0x4a, 0xc1, 0xee, 0x7e, 0xbd, 0x71, 0xdb, 0xc5, 0x24, 0x68, 0x07, 0x9d, 0xb3, 0x07, 0xc3, - 0x93, 0x08, 0xbf, 0x1d, 0x71, 0x2a, 0x60, 0x95, 0xb2, 0xd1, 0x69, 0x76, 0x9a, 0x99, 0x84, 0x89, 0x4c, 0xa3, 0x13, - 0x58, 0xf2, 0x4e, 0x84, 0xf9, 0x97, 0xab, 0x3b, 0x8b, 0x6e, 0x50, 0xdb, 0x21, 0xc8, 0xb8, 0xc5, 0xce, 0xce, 0xb3, - 0x08, 0xe7, 0xf4, 0xcb, 0xb3, 0x5f, 0x8b, 0x34, 0x62, 0x67, 0xec, 0x6c, 0x4c, 0xfd, 0xf7, 0x1f, 0x6a, 0x6a, 0x6a, - 0xb4, 0xc6, 0xa7, 0x90, 0x74, 0x23, 0xcc, 0x58, 0xef, 0x67, 0x63, 0x83, 0x21, 0xaf, 0x66, 0x52, 0x64, 0x4f, 0xc7, - 0x63, 0x69, 0xb1, 0x98, 0xc2, 0x26, 0xfc, 0x04, 0xd0, 0xa6, 0xa3, 0xd1, 0x39, 0x3b, 0x8b, 0xf0, 0x27, 0xbb, 0x4b, - 0xdc, 0x04, 0x3e, 0x59, 0xcc, 0x66, 0x6e, 0xb7, 0x7f, 0xb2, 0x40, 0x81, 0xf9, 0x8e, 0xe9, 0x98, 0x8e, 0x3a, 0x11, - 0xfe, 0x64, 0xe0, 0x32, 0x3a, 0x86, 0xff, 0xa0, 0x00, 0x74, 0xf6, 0xa0, 0xc5, 0xd8, 0x83, 0x96, 0xf9, 0x0a, 0xf3, - 0xdc, 0xcc, 0x87, 0x67, 0x59, 0x3b, 0xc2, 0x9f, 0x1c, 0x3a, 0x8e, 0xc7, 0xb4, 0x05, 0xe8, 0xf8, 0xc9, 0xa1, 0x63, - 0xa7, 0x35, 0xec, 0x50, 0xf3, 0x6d, 0xb1, 0xe6, 0xfc, 0x7e, 0xc6, 0x60, 0x72, 0x9f, 0x2c, 0x42, 0xde, 0xbf, 0x7f, - 0x7e, 0xfe, 0xe0, 0x01, 0x7c, 0x9a, 0xb6, 0xcb, 0x4f, 0xa5, 0x1f, 0xe6, 0x06, 0xc9, 0x5a, 0xd9, 0x09, 0xd0, 0xc9, - 0x4f, 0x66, 0x8c, 0xe3, 0xf1, 0x98, 0xb5, 0x22, 0x9c, 0xf3, 0x19, 0xb3, 0x98, 0x60, 0x7f, 0x9b, 0x8e, 0x8e, 0x3b, - 0xd9, 0xe8, 0xb8, 0x13, 0xe1, 0xfc, 0xed, 0x33, 0x33, 0x9b, 0x16, 0xcc, 0xde, 0x6f, 0x39, 0x8f, 0x35, 0x33, 0xfa, - 0x06, 0x06, 0x09, 0x2b, 0x0d, 0x95, 0xdf, 0x07, 0xf4, 0xf0, 0xec, 0x2c, 0x1b, 0xc1, 0x40, 0xdf, 0x43, 0xb7, 0x00, - 0xc6, 0xf7, 0x76, 0xf3, 0x0d, 0xe9, 0xe9, 0x29, 0x4c, 0xf7, 0xfd, 0x7c, 0x51, 0xcc, 0x5f, 0xa5, 0xd1, 0x83, 0xe3, - 0xfb, 0xad, 0xd1, 0x30, 0xc2, 0xef, 0xdd, 0x04, 0x8f, 0xb3, 0xe1, 0xf1, 0xfd, 0x76, 0x84, 0xdf, 0x9b, 0xfd, 0x76, - 0x7f, 0x78, 0x76, 0x0e, 0xe7, 0xc6, 0x7b, 0x35, 0x2f, 0xde, 0x4e, 0x4c, 0x81, 0x31, 0x7d, 0x00, 0xcd, 0xfe, 0x66, - 0x76, 0xe3, 0xa8, 0x0d, 0x1b, 0xf9, 0xbd, 0xd9, 0x64, 0x06, 0x4f, 0xee, 0xb7, 0x4f, 0xcf, 0x4f, 0x23, 0x3c, 0xe3, - 0x23, 0x01, 0x04, 0xde, 0x6c, 0x94, 0x07, 0xed, 0x07, 0xf7, 0x5b, 0x11, 0x9e, 0xbd, 0xd5, 0xd9, 0x47, 0x3a, 0x33, - 0xd4, 0x78, 0x0c, 0x30, 0x9b, 0x71, 0xa5, 0xef, 0xde, 0x28, 0x47, 0x8f, 0x59, 0x3b, 0xc2, 0x33, 0x99, 0x65, 0x54, - 0xbd, 0xb5, 0x09, 0xc3, 0xd3, 0x08, 0x0b, 0xfa, 0x85, 0xfe, 0x2d, 0xfd, 0x66, 0x1a, 0x31, 0x3a, 0x32, 0x69, 0x06, - 0x87, 0x23, 0xfc, 0x6e, 0x04, 0xd7, 0x60, 0x69, 0x34, 0x1e, 0x8d, 0x4f, 0x01, 0x3c, 0x40, 0x80, 0x2c, 0x76, 0x03, - 0x34, 0xe0, 0x6b, 0xf4, 0x68, 0x98, 0x46, 0x67, 0xc3, 0x73, 0xd6, 0x39, 0x8e, 0x70, 0x49, 0x8d, 0xe8, 0x29, 0xe4, - 0x9b, 0xcf, 0x8f, 0x66, 0x4b, 0x9d, 0xd8, 0x04, 0x03, 0xa0, 0x11, 0xbd, 0xdf, 0x1a, 0x9d, 0x45, 0x78, 0xfe, 0x9a, - 0xf9, 0x3d, 0xc6, 0x18, 0x3b, 0x07, 0x58, 0x42, 0x92, 0x41, 0xa0, 0xf3, 0xf1, 0xf0, 0xc1, 0xb9, 0xf9, 0x06, 0x30, - 0xd0, 0x31, 0x63, 0x00, 0xa4, 0xf9, 0x6b, 0x56, 0x02, 0x62, 0x34, 0xbc, 0xdf, 0x02, 0xfa, 0x32, 0xa7, 0x73, 0x7a, - 0x47, 0x6f, 0x9e, 0xce, 0xcd, 0x9c, 0xc6, 0xa3, 0xd3, 0x08, 0xcf, 0x9f, 0xff, 0x32, 0x5f, 0x8c, 0xc7, 0x66, 0x42, - 0x74, 0xf8, 0x20, 0xc2, 0x73, 0x56, 0x2c, 0x60, 0x8d, 0xce, 0x4f, 0x8f, 0xc7, 0x11, 0x76, 0x68, 0x98, 0xb5, 0xb2, - 0x21, 0xdc, 0xf3, 0x2d, 0x66, 0x69, 0x34, 0x1a, 0xd1, 0xd6, 0x08, 0x6e, 0xfd, 0xe4, 0xcd, 0xaf, 0x85, 0x45, 0x23, - 0x66, 0xf0, 0xc1, 0xad, 0x21, 0xcc, 0x17, 0xe0, 0xf1, 0x71, 0xc8, 0xb2, 0x8c, 0xba, 0xc4, 0xb3, 0xb3, 0xe3, 0x63, - 0xc0, 0x3d, 0x3b, 0x43, 0x8b, 0x20, 0x6f, 0xd4, 0xdd, 0xb0, 0x90, 0x70, 0x74, 0x01, 0x51, 0x05, 0xb2, 0xfa, 0xe6, - 0xee, 0xb5, 0xa1, 0xab, 0xed, 0xb3, 0x07, 0xb0, 0x00, 0x8a, 0x8e, 0x46, 0xaf, 0xec, 0xe1, 0x76, 0x3e, 0x3c, 0x39, - 0x6d, 0x1f, 0x47, 0xd8, 0x6f, 0x04, 0x7a, 0xde, 0xba, 0xdf, 0x81, 0x12, 0x62, 0x74, 0x67, 0x4b, 0x8c, 0x4f, 0xe8, - 0xc9, 0x59, 0x2b, 0xc2, 0x7e, 0x6b, 0xb0, 0xf3, 0xe1, 0xe9, 0x7d, 0xf8, 0x54, 0x53, 0x96, 0xe7, 0x06, 0xbf, 0x4f, - 0x01, 0x2e, 0x8a, 0x3f, 0x13, 0x34, 0x8d, 0x68, 0xeb, 0xb4, 0xd3, 0x19, 0xc1, 0x67, 0xfe, 0x85, 0x15, 0x69, 0x94, - 0xb5, 0xe0, 0xbf, 0x08, 0x07, 0x3b, 0x89, 0x0d, 0x23, 0x6c, 0xf0, 0xee, 0x8c, 0x9e, 0x9a, 0xbd, 0xef, 0x76, 0x55, - 0xeb, 0xbc, 0x05, 0x1b, 0xd6, 0x6d, 0x2a, 0xf7, 0xa5, 0x84, 0xbc, 0x71, 0x24, 0x96, 0x46, 0x38, 0x40, 0xd0, 0xf1, - 0xfd, 0x71, 0x84, 0xfd, 0x8e, 0x3b, 0x39, 0x3b, 0xef, 0x00, 0x29, 0xd3, 0x40, 0x28, 0x46, 0x9d, 0xe1, 0x09, 0x90, - 0x26, 0xcd, 0x5e, 0x5b, 0x3c, 0x89, 0xb0, 0x7e, 0xaa, 0xf4, 0xab, 0x34, 0x1a, 0x9d, 0x0f, 0xc7, 0xa3, 0xf3, 0x08, - 0x6b, 0x39, 0xa3, 0x5a, 0x1a, 0x0a, 0x78, 0x7c, 0x72, 0x3f, 0xc2, 0x06, 0xcd, 0x5b, 0xac, 0x35, 0x6a, 0x45, 0xd8, - 0x1d, 0x25, 0x8c, 0x9d, 0x77, 0x60, 0x5a, 0x3f, 0x3f, 0xd7, 0x80, 0xcb, 0x23, 0x36, 0x3c, 0x8e, 0x70, 0x49, 0xef, - 0x0d, 0x21, 0x82, 0x2f, 0x35, 0x93, 0x9f, 0x1d, 0xeb, 0x01, 0xa4, 0xce, 0x6f, 0x78, 0x58, 0x86, 0x97, 0x37, 0x16, - 0x8d, 0xa8, 0xd9, 0xe2, 0xc1, 0x3d, 0xe8, 0x13, 0x1a, 0x7b, 0xb6, 0x9d, 0x93, 0xe5, 0x1a, 0x97, 0xe1, 0x45, 0x3f, - 0xb3, 0x3b, 0x15, 0x2b, 0x65, 0x38, 0xd9, 0x20, 0x05, 0x5c, 0x00, 0x9c, 0x41, 0xbd, 0xf3, 0x99, 0x04, 0x41, 0x52, - 0x90, 0x56, 0x57, 0x5c, 0x78, 0x3f, 0xce, 0xae, 0x80, 0xa0, 0x03, 0x90, 0x5e, 0x10, 0x4a, 0x34, 0xc4, 0x66, 0xb1, - 0xc2, 0xa4, 0x37, 0x6f, 0x37, 0x32, 0xa5, 0xb4, 0x06, 0xf3, 0x94, 0x50, 0x1f, 0x95, 0x1d, 0x2e, 0x69, 0x21, 0x6e, - 0x11, 0xea, 0x4a, 0x62, 0x62, 0x2c, 0xbf, 0x10, 0x3a, 0x56, 0xaa, 0x5f, 0x0c, 0x70, 0xfb, 0x0c, 0x61, 0x88, 0x5e, - 0x40, 0xfa, 0xf2, 0xf2, 0xb2, 0x7d, 0x76, 0x60, 0x84, 0xbe, 0xcb, 0xcb, 0x73, 0xfb, 0x03, 0xfe, 0x1d, 0x54, 0x11, - 0xa3, 0x61, 0x7c, 0x8f, 0x58, 0xa0, 0xd1, 0x33, 0xfc, 0xf5, 0x23, 0xb6, 0x5a, 0xc5, 0x8f, 0x18, 0x81, 0x19, 0xe3, - 0x47, 0x2c, 0x31, 0xb7, 0x06, 0xd6, 0x37, 0x85, 0xf4, 0x41, 0x73, 0xd6, 0xc2, 0x10, 0xc7, 0xdc, 0x73, 0xde, 0x8f, - 0x58, 0x9f, 0xd7, 0xfd, 0x9a, 0xab, 0xe0, 0xc1, 0x07, 0x07, 0xcb, 0x22, 0xd5, 0x56, 0x4c, 0xd0, 0x56, 0x4c, 0xd0, - 0x56, 0x4c, 0xd0, 0x55, 0xf8, 0xf6, 0x93, 0x1e, 0x48, 0x29, 0x46, 0xd9, 0xe2, 0x78, 0xea, 0x77, 0xa0, 0xf6, 0x00, - 0xed, 0x64, 0xaf, 0x52, 0x76, 0x94, 0xba, 0x8a, 0x9d, 0x0a, 0x8c, 0x9d, 0x89, 0x4e, 0xdb, 0x71, 0xf4, 0xef, 0xa8, - 0x3b, 0x5e, 0xd6, 0xc4, 0xb2, 0x77, 0x3b, 0xc5, 0x32, 0x58, 0x49, 0x23, 0x9a, 0xed, 0xdb, 0x48, 0x18, 0xba, 0x7f, - 0xdf, 0x08, 0x66, 0x55, 0x78, 0xb6, 0x06, 0x24, 0x75, 0x41, 0x0a, 0x39, 0x37, 0x52, 0x5a, 0x81, 0xd2, 0x91, 0x8e, - 0x0b, 0xd0, 0x50, 0x7a, 0x05, 0x65, 0x19, 0x45, 0xb4, 0x61, 0x00, 0xa2, 0xac, 0x8c, 0x66, 0x65, 0xb5, 0x53, 0x10, - 0x5d, 0x40, 0x13, 0x66, 0x24, 0x16, 0x68, 0x40, 0x98, 0x06, 0x84, 0xab, 0x0c, 0xe2, 0x8c, 0xcb, 0x3e, 0x31, 0xd9, - 0xca, 0x64, 0xab, 0x32, 0x5b, 0xfa, 0x6c, 0x2b, 0x24, 0x4a, 0x93, 0x2d, 0xcb, 0x6c, 0x90, 0xd9, 0xf0, 0x24, 0x55, - 0x78, 0x98, 0x4a, 0x2b, 0xaa, 0x55, 0xb2, 0xd5, 0x5b, 0x1a, 0x6a, 0x73, 0x0f, 0x0e, 0xe2, 0x52, 0x4e, 0x32, 0x6a, - 0xe2, 0x7b, 0x4b, 0x9e, 0x14, 0x46, 0x06, 0xe2, 0xc9, 0xc4, 0xfd, 0x1d, 0xae, 0x37, 0x65, 0xa5, 0x62, 0x32, 0xfc, - 0x46, 0x49, 0xf4, 0x97, 0x57, 0xa2, 0x3e, 0xe2, 0x26, 0xfe, 0xcc, 0x05, 0x49, 0x5a, 0xad, 0xe3, 0xf6, 0x71, 0xeb, - 0xbc, 0xc7, 0x0f, 0xdb, 0x9d, 0xe4, 0x41, 0x27, 0x35, 0x8a, 0x88, 0xb9, 0xbc, 0x01, 0x05, 0xcc, 0x51, 0x27, 0x39, - 0x41, 0x87, 0xed, 0xa4, 0x75, 0x7a, 0xda, 0x84, 0x7f, 0xf0, 0x7b, 0x5d, 0x56, 0x3b, 0x69, 0x9d, 0x9c, 0xf6, 0xf8, - 0xd1, 0x46, 0xa5, 0x98, 0x37, 0xa0, 0x20, 0x3a, 0x32, 0x95, 0x30, 0xd4, 0xaf, 0x96, 0xf7, 0xd9, 0x96, 0x9e, 0xe7, - 0xbd, 0x8e, 0x95, 0x55, 0xc5, 0x01, 0x54, 0xfd, 0xd7, 0xc4, 0x00, 0xd1, 0x7f, 0x0d, 0xcb, 0x18, 0xb1, 0xcb, 0x02, - 0x44, 0xed, 0x47, 0x3c, 0x16, 0x0d, 0x76, 0x18, 0xdb, 0x7c, 0x0d, 0x75, 0x9b, 0x10, 0xb7, 0x0d, 0x4f, 0x5c, 0xae, - 0x0a, 0x73, 0x27, 0x08, 0x35, 0x15, 0xe4, 0x0e, 0x5d, 0xae, 0x0c, 0x73, 0x87, 0x08, 0x35, 0x25, 0xe4, 0xd2, 0x94, - 0x27, 0x14, 0x72, 0x74, 0x42, 0x9b, 0x06, 0x92, 0xd5, 0xa2, 0x3c, 0x67, 0x7e, 0xd8, 0x7c, 0x0c, 0xcb, 0x63, 0x08, - 0x8a, 0x13, 0xa4, 0x05, 0xbc, 0xed, 0x51, 0x6a, 0x73, 0x5a, 0xb8, 0x54, 0xe3, 0x40, 0x46, 0x03, 0xfe, 0x39, 0x64, - 0xe6, 0xc1, 0x87, 0x56, 0xef, 0xf8, 0xac, 0x95, 0xb6, 0xc1, 0x49, 0x19, 0x64, 0x6d, 0x61, 0x65, 0x6d, 0xe1, 0x65, - 0x6d, 0xe1, 0x65, 0x6d, 0x10, 0xe0, 0x83, 0xbe, 0xff, 0x91, 0x35, 0xc3, 0x0f, 0x5e, 0x5a, 0x91, 0x58, 0x33, 0x81, - 0x58, 0xaf, 0x56, 0xcb, 0x35, 0xd8, 0xf8, 0x94, 0x35, 0xa4, 0xaa, 0xd4, 0x9f, 0xcb, 0x22, 0x6d, 0xe1, 0x49, 0x0a, - 0x5a, 0xee, 0x16, 0xa6, 0x66, 0x73, 0x7b, 0xaa, 0xb0, 0x19, 0x3f, 0xa6, 0xe7, 0xd5, 0xc9, 0x97, 0xe4, 0xd8, 0x68, - 0x8f, 0x97, 0x45, 0xca, 0x2d, 0xcd, 0xe0, 0x96, 0x66, 0x70, 0x4b, 0x33, 0xa0, 0x11, 0x5c, 0x16, 0x36, 0x65, 0x13, - 0x4a, 0xe0, 0x4a, 0xa0, 0x7f, 0x3c, 0x80, 0xf0, 0x79, 0xb1, 0x26, 0x66, 0xd4, 0x1b, 0x9d, 0xb7, 0x21, 0x5c, 0x98, - 0x2d, 0xa9, 0x13, 0x6a, 0xbc, 0xa6, 0xcb, 0x31, 0x7f, 0xad, 0xa1, 0x7d, 0x02, 0x6f, 0xb9, 0x3c, 0xd4, 0x71, 0x0b, - 0x8c, 0x26, 0xa2, 0x22, 0xea, 0x19, 0xb2, 0x90, 0x1a, 0x9d, 0x8d, 0x33, 0x86, 0xfe, 0xbc, 0xe1, 0x83, 0x6a, 0x29, - 0x41, 0xf8, 0x82, 0xc1, 0x67, 0x56, 0x39, 0xc5, 0x97, 0xb6, 0x9e, 0xce, 0x50, 0xcb, 0x1e, 0x09, 0x5d, 0x30, 0xd8, - 0xf6, 0xd1, 0x96, 0x7a, 0x82, 0x48, 0x65, 0xdc, 0x05, 0x49, 0x15, 0x2f, 0x18, 0xdc, 0x67, 0xc9, 0x2d, 0x35, 0xce, - 0x24, 0x2f, 0xec, 0x9f, 0xaf, 0x34, 0xf0, 0xb6, 0x2b, 0x26, 0x43, 0xef, 0xa4, 0x7a, 0x6d, 0xa2, 0xea, 0x90, 0xfd, - 0x7d, 0x6b, 0x4b, 0x6d, 0xbe, 0x36, 0x8d, 0xa9, 0x4d, 0xa2, 0xc9, 0x86, 0x1d, 0xea, 0xd7, 0xe8, 0x1f, 0xef, 0x2b, - 0x56, 0x4c, 0x86, 0x28, 0xa0, 0xd9, 0x06, 0xac, 0xaa, 0x02, 0x96, 0x72, 0xf5, 0x4a, 0x17, 0x42, 0xe8, 0xdd, 0x8c, - 0x79, 0x5d, 0x4c, 0x86, 0x3b, 0x1f, 0xfd, 0xb0, 0x3d, 0xf6, 0xde, 0xd2, 0xa0, 0x07, 0xaf, 0xda, 0x9e, 0xb2, 0xdb, - 0xef, 0xd5, 0xb9, 0xd9, 0x59, 0x47, 0xe5, 0xdf, 0xab, 0xf3, 0x74, 0x57, 0x9d, 0x19, 0xbf, 0x8d, 0xfd, 0xde, 0xd1, - 0x81, 0x1a, 0xdb, 0x18, 0xe8, 0x4c, 0x86, 0x10, 0xa5, 0x1d, 0xfe, 0xda, 0x58, 0x2a, 0x5d, 0x4f, 0xc2, 0x61, 0x15, - 0x64, 0x2f, 0x39, 0x4d, 0x19, 0xa6, 0xa4, 0x73, 0x58, 0x98, 0x68, 0x2a, 0x22, 0xa1, 0x4d, 0x95, 0x50, 0x9c, 0x93, - 0x38, 0xa6, 0x87, 0x19, 0xc4, 0x84, 0x69, 0xf7, 0x68, 0x1a, 0xd3, 0x46, 0x86, 0x8e, 0xe2, 0x76, 0x83, 0x1e, 0x66, - 0x08, 0x35, 0xda, 0xa0, 0x33, 0x95, 0xa4, 0xdd, 0xcc, 0x21, 0x4a, 0xa4, 0x21, 0xc5, 0xf9, 0xa1, 0x48, 0x8a, 0x86, - 0x3c, 0x54, 0x49, 0xd1, 0x48, 0x4e, 0xb1, 0x48, 0x26, 0x65, 0xf2, 0xc4, 0x24, 0x4f, 0x6c, 0xf2, 0xb0, 0x4c, 0x1e, - 0x9a, 0xe4, 0xa1, 0x4d, 0xa6, 0xa4, 0x38, 0x14, 0x09, 0x6d, 0xc4, 0xed, 0x66, 0x81, 0x0e, 0x61, 0x04, 0x7e, 0xf4, - 0x44, 0x84, 0xc1, 0xb9, 0xd7, 0xc6, 0xba, 0x65, 0x2e, 0x73, 0x17, 0x2e, 0xb3, 0x02, 0x52, 0xe9, 0x72, 0x04, 0x75, - 0x9e, 0x05, 0x60, 0xc2, 0xda, 0xfe, 0xf1, 0xc1, 0xe0, 0xd6, 0x59, 0x2e, 0x45, 0xe0, 0x52, 0x05, 0x56, 0xe0, 0x9f, - 0x9d, 0x23, 0x09, 0x40, 0x75, 0x4d, 0xf3, 0xf9, 0x94, 0x6e, 0xf9, 0xad, 0x16, 0x93, 0xa1, 0xdb, 0x59, 0x65, 0x33, - 0x8c, 0x16, 0x36, 0xc8, 0x72, 0xdd, 0xc3, 0x10, 0x40, 0xed, 0xbd, 0x1a, 0x13, 0x6a, 0x94, 0xe4, 0xb6, 0xc6, 0xa4, - 0x60, 0x77, 0x2a, 0xa3, 0x39, 0x8b, 0xab, 0x03, 0xb8, 0x1a, 0x26, 0x23, 0x2f, 0xc0, 0x16, 0xbd, 0x38, 0x4c, 0x8e, - 0x1b, 0x3a, 0x99, 0x1c, 0x26, 0xa7, 0x0f, 0x1a, 0x3a, 0x19, 0x1e, 0x26, 0xed, 0x76, 0x85, 0xb3, 0x49, 0x41, 0x74, - 0x32, 0x21, 0x1a, 0x34, 0x86, 0xb6, 0x51, 0x39, 0xa7, 0x60, 0x5c, 0xf5, 0x6f, 0x0c, 0xa3, 0xe1, 0x86, 0x21, 0xd8, - 0xc4, 0xc6, 0x9b, 0xdc, 0x1a, 0x43, 0xd8, 0x4d, 0xe7, 0xf4, 0xb4, 0xa9, 0x93, 0x02, 0x6b, 0xbb, 0x92, 0x4d, 0x9d, - 0x4c, 0xb0, 0xb6, 0xcb, 0xd7, 0xd4, 0xc9, 0xd0, 0x36, 0x65, 0x74, 0x80, 0x4c, 0x04, 0xc0, 0x7a, 0xce, 0x02, 0xc8, - 0x77, 0xbc, 0x7b, 0xc8, 0x1a, 0xb4, 0x86, 0xdf, 0x2b, 0xd7, 0xf4, 0x05, 0x15, 0xd5, 0x60, 0x64, 0xc3, 0xbe, 0x55, - 0xb4, 0x5d, 0x35, 0xc9, 0xfe, 0x75, 0xd9, 0xb2, 0xd9, 0x42, 0xea, 0x7a, 0xc1, 0x87, 0x35, 0x0c, 0x71, 0xa5, 0xdc, - 0xc1, 0xfd, 0x8a, 0x92, 0x18, 0xa2, 0xca, 0x99, 0x53, 0x88, 0x13, 0xaf, 0x47, 0x86, 0x24, 0xde, 0x68, 0xac, 0x51, - 0x1c, 0x9c, 0xb7, 0x4f, 0x43, 0xaa, 0xba, 0x15, 0x6a, 0x8e, 0x90, 0x68, 0x21, 0xac, 0x31, 0xe2, 0x28, 0x0a, 0x58, - 0x10, 0xa7, 0xdd, 0xad, 0x1d, 0x10, 0x07, 0x07, 0x9b, 0xe7, 0x85, 0x0f, 0xfa, 0xbf, 0x15, 0xe8, 0xbf, 0xb2, 0x64, - 0xf3, 0x4f, 0x11, 0x59, 0x1b, 0x57, 0x1e, 0x20, 0x8a, 0x0f, 0xfa, 0x74, 0xdf, 0x50, 0xf8, 0x7e, 0x15, 0xf1, 0xce, - 0xe5, 0x34, 0xcf, 0x4c, 0x86, 0xe9, 0x6b, 0x10, 0x8c, 0xed, 0x4d, 0x38, 0xa1, 0xd2, 0x4a, 0xef, 0x5f, 0x76, 0x1c, - 0x74, 0xe2, 0x9e, 0x4a, 0x09, 0x1b, 0xfd, 0x3b, 0xb4, 0x89, 0xad, 0x60, 0xe3, 0xbc, 0xa1, 0x57, 0xab, 0xda, 0xc3, - 0x38, 0xf6, 0xf9, 0x15, 0x74, 0x70, 0xc0, 0xd5, 0x33, 0x30, 0xe3, 0x65, 0x71, 0x23, 0x3c, 0x7c, 0xff, 0xa9, 0x9d, - 0xd6, 0x7f, 0x9b, 0x73, 0x35, 0x0d, 0x0e, 0xba, 0x87, 0xb5, 0xfc, 0x9d, 0x2b, 0xd1, 0xd3, 0x29, 0x77, 0x6b, 0xfd, - 0x77, 0x65, 0x24, 0xbd, 0xf5, 0x44, 0xd3, 0xc1, 0x01, 0xaf, 0x02, 0x25, 0x45, 0x3f, 0x44, 0xa8, 0x67, 0x64, 0x90, - 0x67, 0xb9, 0xa4, 0x70, 0x23, 0x0a, 0x57, 0x0c, 0x69, 0x83, 0x1f, 0x69, 0xfc, 0x87, 0xfc, 0xff, 0xd4, 0xc8, 0xa1, - 0x4e, 0x1b, 0x3c, 0x10, 0xc0, 0x42, 0x56, 0xa8, 0x0a, 0x51, 0x68, 0x20, 0x1d, 0xda, 0x3c, 0xa3, 0xf2, 0x30, 0xa7, - 0xf3, 0x79, 0x7e, 0x67, 0x5e, 0xa9, 0x0a, 0x38, 0xaa, 0xea, 0xa2, 0xc9, 0xc5, 0x87, 0xc3, 0x05, 0xf0, 0xf4, 0x80, - 0x7b, 0xc8, 0xf8, 0x77, 0x96, 0x97, 0xdb, 0x02, 0x81, 0x64, 0xa6, 0x88, 0x6c, 0xb6, 0xbb, 0xea, 0x12, 0xe4, 0xb2, - 0x66, 0x13, 0x69, 0x17, 0x36, 0x1b, 0x73, 0x90, 0xc9, 0x94, 0xf5, 0xe1, 0xdc, 0xb3, 0x05, 0x41, 0x72, 0x93, 0x46, - 0x64, 0xdb, 0x5d, 0x8a, 0x8f, 0x63, 0x40, 0x23, 0x64, 0x05, 0xbe, 0x50, 0x58, 0xe4, 0xc0, 0x75, 0x16, 0xbe, 0xe3, - 0x6f, 0xb4, 0x54, 0xf4, 0xd5, 0x60, 0x80, 0x0b, 0xf3, 0x30, 0x43, 0x39, 0x9f, 0x42, 0x05, 0x0f, 0xfd, 0x04, 0x22, - 0x0a, 0x5f, 0xad, 0xf6, 0xe1, 0x1d, 0x1d, 0xd7, 0x26, 0x38, 0x7d, 0xba, 0x9f, 0xd5, 0x9b, 0x19, 0x30, 0x0e, 0x46, - 0x5a, 0xe6, 0xa2, 0xd0, 0xc9, 0x9b, 0xec, 0x42, 0x74, 0x1b, 0x0d, 0x66, 0x42, 0x1c, 0x11, 0x88, 0x67, 0x06, 0x1e, - 0x79, 0xf0, 0xc7, 0x46, 0x2d, 0x52, 0xcc, 0xc6, 0x7e, 0x83, 0xa0, 0xd4, 0xb5, 0x84, 0xd5, 0x4a, 0xd9, 0xd8, 0x22, - 0x26, 0xc7, 0x46, 0x19, 0x29, 0xfb, 0x29, 0x83, 0x98, 0x56, 0x66, 0x1c, 0xdc, 0x6d, 0xf5, 0xb7, 0xd5, 0x7e, 0xde, - 0xe3, 0xf6, 0x1a, 0x8f, 0x1b, 0x8f, 0x7d, 0x03, 0xa8, 0xe5, 0xc6, 0x06, 0xb7, 0x16, 0xe6, 0xb1, 0x35, 0x87, 0x65, - 0x9b, 0x10, 0x14, 0xa5, 0x87, 0xba, 0xbd, 0xb9, 0xf5, 0x11, 0xfb, 0x94, 0x99, 0x93, 0x42, 0xba, 0x0f, 0x72, 0xf4, - 0x80, 0x40, 0xe7, 0xf6, 0x67, 0x45, 0x17, 0x2a, 0x99, 0xb8, 0x1c, 0xe3, 0x2f, 0xc1, 0x6d, 0x5e, 0x3f, 0xba, 0xbe, - 0x36, 0x9b, 0xfc, 0xfa, 0x3a, 0xc2, 0xa1, 0x59, 0x77, 0x14, 0xf0, 0x82, 0xd1, 0xa0, 0x0c, 0xea, 0x64, 0x36, 0x7e, - 0xb3, 0x5d, 0x35, 0xf6, 0x9e, 0x56, 0x78, 0x07, 0xcb, 0x63, 0x1a, 0xdf, 0x72, 0x83, 0xec, 0x73, 0x80, 0x37, 0xeb, - 0xf3, 0x41, 0xf7, 0x4d, 0xac, 0xd0, 0xc1, 0xc1, 0x9b, 0x58, 0xa2, 0xde, 0x15, 0x33, 0x77, 0x6e, 0xe0, 0x07, 0xdd, - 0xe7, 0x66, 0xf8, 0x32, 0x40, 0x80, 0x2b, 0xb6, 0x29, 0xd9, 0xbc, 0x35, 0x51, 0x27, 0x52, 0x88, 0x6a, 0x0d, 0xb1, - 0x75, 0x1d, 0x48, 0xa0, 0xd7, 0x37, 0x21, 0xb4, 0xbb, 0x8c, 0x30, 0x60, 0xe1, 0x4b, 0x2f, 0x35, 0x96, 0xcc, 0x58, - 0x31, 0x61, 0xc5, 0x6a, 0xf5, 0x9e, 0x5a, 0xcf, 0xb3, 0x8d, 0x20, 0x89, 0xaa, 0xdb, 0x68, 0x50, 0x33, 0x7e, 0x10, - 0x1f, 0xe8, 0x00, 0xef, 0xbf, 0x89, 0x0b, 0x84, 0xc0, 0xc2, 0x88, 0x8b, 0x85, 0xf7, 0xb2, 0xca, 0x6a, 0xeb, 0x52, - 0xa0, 0xb2, 0x91, 0x9c, 0xb4, 0xf0, 0x94, 0x64, 0xe5, 0x1a, 0x5d, 0x4c, 0xbb, 0x8d, 0x46, 0x8e, 0x64, 0x9c, 0xf5, - 0xf3, 0x01, 0xe6, 0xb8, 0x80, 0xcb, 0xd4, 0xed, 0x75, 0x98, 0xb3, 0x1a, 0xe5, 0x72, 0xf3, 0x5d, 0xda, 0xb1, 0xa6, - 0x8f, 0xe8, 0x3a, 0x00, 0xc6, 0x23, 0x1a, 0x10, 0x89, 0x5d, 0x40, 0x16, 0x16, 0xc8, 0xca, 0x03, 0x59, 0x18, 0x20, - 0x2b, 0xd4, 0x9b, 0x43, 0xb8, 0x20, 0x85, 0xd2, 0x2d, 0x8a, 0x5e, 0x0f, 0x6c, 0xe9, 0x9c, 0x26, 0x30, 0x37, 0xb1, - 0x15, 0xdc, 0x72, 0x80, 0x03, 0x85, 0xf3, 0xc3, 0x53, 0x64, 0x19, 0x45, 0x26, 0xc6, 0x2b, 0xbe, 0x35, 0x7f, 0x92, - 0x5b, 0x7c, 0x67, 0x7f, 0xdc, 0x05, 0xca, 0xa4, 0xe7, 0x35, 0x6d, 0x03, 0x77, 0x11, 0xd1, 0xa2, 0x24, 0x02, 0xb4, - 0x76, 0xe1, 0xfd, 0x44, 0xfd, 0xc5, 0x33, 0x65, 0x03, 0x31, 0x88, 0x06, 0x51, 0x58, 0x04, 0xa4, 0xf3, 0xcf, 0x3f, - 0x23, 0xd4, 0x13, 0x10, 0x47, 0xc7, 0x9d, 0x6c, 0xcd, 0x36, 0x6a, 0x44, 0x49, 0x94, 0xc6, 0x3e, 0x4c, 0x03, 0xec, - 0x8c, 0x28, 0x0a, 0x5e, 0x3b, 0x29, 0x87, 0xf1, 0xa1, 0x36, 0x0c, 0x33, 0xa8, 0x2a, 0xf0, 0xc4, 0xe5, 0x72, 0x33, - 0xcc, 0x8f, 0x81, 0xaa, 0x30, 0x31, 0x56, 0x90, 0x7d, 0x02, 0x8c, 0x11, 0x76, 0x70, 0xc0, 0xfa, 0x62, 0x10, 0xbc, - 0xe9, 0x55, 0x5d, 0x87, 0xeb, 0x70, 0xe1, 0x62, 0x0a, 0x71, 0xd6, 0x57, 0x2b, 0xfb, 0x97, 0x7c, 0x30, 0xd2, 0x0c, - 0x3c, 0xce, 0x16, 0x9c, 0xb1, 0x62, 0xb7, 0x2c, 0x96, 0x68, 0xf9, 0x3b, 0x98, 0xed, 0xb9, 0xa8, 0x79, 0xdc, 0x4d, - 0xb5, 0xed, 0xa1, 0x3e, 0x37, 0x1a, 0x85, 0x20, 0x66, 0x6d, 0x75, 0xa4, 0xe1, 0xb9, 0x0e, 0xf3, 0x6a, 0xb1, 0x67, - 0x33, 0x55, 0x86, 0x10, 0x85, 0x23, 0x25, 0x01, 0xbb, 0x6d, 0x43, 0x27, 0xe1, 0x47, 0x9d, 0x4a, 0x3a, 0x16, 0x12, - 0xa0, 0xc0, 0x91, 0xb9, 0x9c, 0x37, 0x21, 0xe2, 0x19, 0xda, 0x41, 0xe4, 0x02, 0x13, 0x9a, 0xba, 0x6c, 0xe9, 0x62, - 0x39, 0x45, 0x33, 0xb9, 0x50, 0x6c, 0x31, 0x87, 0xf3, 0xbd, 0x4c, 0xcb, 0x72, 0x9e, 0x7d, 0xae, 0xa7, 0x80, 0xfd, - 0xe5, 0xad, 0x9e, 0x31, 0xb1, 0x88, 0xdc, 0x3c, 0xbf, 0x5a, 0x71, 0xff, 0xcd, 0x0b, 0xfc, 0x88, 0x74, 0x0e, 0xbf, - 0xe2, 0x8f, 0x94, 0x3c, 0x6a, 0x7c, 0xc5, 0x13, 0x4e, 0x2c, 0x6f, 0x90, 0xbc, 0x79, 0x7d, 0xf5, 0xe2, 0xdd, 0x8b, - 0xf7, 0x4f, 0xaf, 0x5f, 0xbc, 0x7a, 0xf6, 0xe2, 0xd5, 0x8b, 0x77, 0x1f, 0xf1, 0x3f, 0x94, 0x7c, 0x3d, 0x6a, 0x9f, - 0xb7, 0xf0, 0x07, 0xf2, 0xf5, 0xa8, 0x83, 0x6f, 0x35, 0xf9, 0x7a, 0x74, 0x82, 0x73, 0x45, 0xbe, 0x1e, 0x76, 0x8e, - 0x8e, 0xf1, 0x42, 0xdb, 0x26, 0x73, 0x39, 0x69, 0xb7, 0xf0, 0x3f, 0xee, 0x0b, 0xc4, 0xfb, 0x6a, 0x16, 0x13, 0xb6, - 0x61, 0xfc, 0x60, 0xca, 0xd0, 0xa1, 0x32, 0x86, 0x28, 0x17, 0x01, 0x3a, 0x4d, 0x55, 0x88, 0x4e, 0x36, 0x88, 0x31, - 0xd8, 0x30, 0x02, 0x5a, 0x71, 0xe2, 0xda, 0xe1, 0x47, 0x6d, 0x76, 0x0c, 0xf4, 0x89, 0x97, 0xc2, 0x71, 0xa9, 0xc2, - 0x69, 0x3b, 0x2d, 0xc6, 0x38, 0x97, 0xb2, 0x88, 0x17, 0xc0, 0x08, 0x18, 0xad, 0x05, 0x3f, 0x2a, 0xa3, 0x25, 0x89, - 0x0b, 0xd2, 0xee, 0xb5, 0x53, 0x71, 0x41, 0x3a, 0xbd, 0x0e, 0xfc, 0x39, 0xed, 0x9d, 0xa6, 0xed, 0x16, 0x3a, 0x0c, - 0xc6, 0xf1, 0x47, 0x0d, 0xad, 0xfb, 0x03, 0xec, 0xba, 0x50, 0xff, 0x14, 0xda, 0xab, 0xf4, 0x84, 0x53, 0xc7, 0xb6, - 0xbb, 0xe2, 0x82, 0x19, 0x3d, 0x2c, 0xff, 0x01, 0x50, 0xdb, 0x38, 0x74, 0x94, 0x1b, 0xc7, 0xfd, 0xe2, 0x47, 0x02, - 0xd5, 0x42, 0xb2, 0xc4, 0x6c, 0xd5, 0x42, 0xc0, 0x34, 0x9a, 0x6c, 0x30, 0x07, 0x4a, 0x94, 0x2c, 0xb4, 0x0f, 0x2b, - 0xaf, 0x9a, 0x12, 0x25, 0x73, 0x39, 0x8f, 0x6b, 0xaa, 0x86, 0x5f, 0x03, 0x33, 0xc7, 0x7d, 0xae, 0x5e, 0xd1, 0x57, - 0x71, 0x8d, 0xe7, 0x09, 0x59, 0xbb, 0x70, 0x5b, 0xfc, 0xe2, 0xac, 0x28, 0x6a, 0xe0, 0x2a, 0x01, 0xeb, 0x47, 0xd5, - 0xd4, 0x17, 0xf0, 0x7e, 0x1e, 0x6b, 0xe8, 0x4b, 0x12, 0x50, 0xcf, 0x9f, 0x4a, 0x33, 0xae, 0x52, 0x19, 0xed, 0x15, - 0xd1, 0xc6, 0x2c, 0xc8, 0x2b, 0xa2, 0x2f, 0x94, 0x01, 0x82, 0x24, 0xbc, 0x2f, 0x06, 0x70, 0xe0, 0xdb, 0x01, 0x4a, - 0x43, 0xe7, 0x40, 0xad, 0x54, 0x99, 0x09, 0x99, 0x4f, 0x13, 0x1c, 0x00, 0x34, 0x4f, 0x95, 0x0a, 0xca, 0x7c, 0x62, - 0x89, 0x82, 0xa1, 0xff, 0x16, 0x6e, 0x80, 0xc3, 0xd8, 0xa0, 0x62, 0x90, 0x7d, 0x4f, 0xd4, 0xf3, 0xdb, 0xe7, 0xad, - 0xa3, 0xaf, 0x41, 0xfe, 0x48, 0x79, 0x7b, 0x8f, 0xbf, 0x03, 0x4a, 0x6e, 0xc3, 0x59, 0xb5, 0xb1, 0x8f, 0x44, 0xd6, - 0x0d, 0x01, 0x72, 0xa8, 0xd1, 0x91, 0x79, 0x4a, 0xb0, 0x8b, 0xf4, 0x21, 0x69, 0xb7, 0x20, 0x7c, 0xd8, 0x0e, 0xca, - 0xf7, 0xd3, 0x06, 0x4c, 0x75, 0x72, 0xdb, 0x04, 0x5a, 0x0d, 0xaf, 0x0b, 0xdd, 0x35, 0x79, 0x72, 0x87, 0x55, 0x80, - 0x33, 0xec, 0x90, 0x35, 0xc4, 0xa1, 0x40, 0x2e, 0xec, 0xaa, 0xdd, 0x00, 0x9a, 0x8a, 0x8e, 0x7d, 0xe5, 0xce, 0x1b, - 0x47, 0x5d, 0x34, 0x93, 0xd3, 0xc3, 0xaf, 0x07, 0x07, 0xb1, 0x6c, 0x90, 0x47, 0x08, 0x2f, 0x29, 0x58, 0x31, 0x83, - 0xd7, 0x17, 0xb7, 0x4c, 0x7c, 0xaa, 0x02, 0xea, 0xb8, 0x50, 0xb5, 0x63, 0xad, 0xea, 0xac, 0xdc, 0x0d, 0x7e, 0x4c, - 0x1d, 0xd4, 0x08, 0xd2, 0xec, 0xe8, 0x3a, 0x35, 0x28, 0xd7, 0x5c, 0xb4, 0x60, 0x5b, 0x36, 0x3e, 0x52, 0xf4, 0xc3, - 0xa3, 0xe6, 0xd7, 0x60, 0xc2, 0x35, 0xd3, 0xa4, 0x47, 0x8d, 0x47, 0xe8, 0x87, 0x47, 0x81, 0x93, 0x1d, 0xaf, 0xd8, - 0x13, 0xcf, 0x8d, 0xfc, 0x64, 0xb9, 0xd2, 0x9f, 0x40, 0xb2, 0x2f, 0xc8, 0x4f, 0x80, 0xe5, 0x94, 0xfc, 0x14, 0xcb, - 0x26, 0x04, 0x1f, 0x24, 0x3f, 0xc5, 0x05, 0xfc, 0xc8, 0xc9, 0x4f, 0x31, 0x60, 0x3b, 0x9e, 0x9a, 0x1f, 0x45, 0x09, - 0x0c, 0x70, 0xec, 0x92, 0xd6, 0xbf, 0xab, 0x58, 0xad, 0xc4, 0xc1, 0x81, 0xb4, 0xbf, 0xe8, 0x65, 0x76, 0x70, 0x90, - 0x5f, 0x4c, 0xab, 0xbe, 0x99, 0xde, 0x45, 0x5f, 0x0c, 0x42, 0xe1, 0xc0, 0x34, 0x8d, 0x87, 0x33, 0xfe, 0x14, 0x52, - 0x56, 0xd3, 0x40, 0xf3, 0xb8, 0x73, 0xff, 0xec, 0x1c, 0xc3, 0xbf, 0xf7, 0x83, 0x82, 0x3f, 0x97, 0x7c, 0x17, 0x69, - 0xb3, 0xe6, 0x59, 0x85, 0x6c, 0x97, 0x01, 0x3e, 0x63, 0x86, 0x9a, 0xe2, 0xe0, 0x80, 0x5f, 0x04, 0xb8, 0x8c, 0x19, - 0x6a, 0x04, 0x16, 0x7b, 0x0f, 0x4b, 0x7b, 0x32, 0xc3, 0x35, 0xc1, 0xb3, 0xb2, 0xbc, 0x5f, 0x0c, 0x2e, 0xb4, 0xa3, - 0x26, 0x61, 0xf0, 0x69, 0x45, 0x5a, 0x6e, 0x93, 0x75, 0x45, 0x53, 0x5d, 0xb6, 0xbb, 0x48, 0x12, 0xd5, 0x10, 0x97, - 0x97, 0x6d, 0x0c, 0x2a, 0xf9, 0x9e, 0x22, 0x32, 0x15, 0xc4, 0x3b, 0xc8, 0x2d, 0x73, 0x99, 0x2a, 0x3c, 0xe5, 0xa9, - 0xf0, 0x72, 0xf6, 0x6b, 0x6f, 0x3d, 0x6d, 0x5c, 0x16, 0x4d, 0xcf, 0x0c, 0x8b, 0x9e, 0x2a, 0x5d, 0xed, 0x60, 0x93, - 0xaa, 0x01, 0xbc, 0xda, 0x57, 0x62, 0x1e, 0xb3, 0xfe, 0x65, 0x0c, 0xa2, 0x22, 0xab, 0x46, 0x1b, 0x32, 0xe1, 0x73, - 0x9d, 0x2a, 0x18, 0xa8, 0x29, 0x7c, 0x01, 0x64, 0x2a, 0xab, 0x0c, 0xb3, 0x7d, 0xc3, 0x50, 0x40, 0x40, 0x81, 0x4b, - 0xc2, 0x02, 0x09, 0x1e, 0x6e, 0x3f, 0x02, 0xc2, 0x51, 0x27, 0x17, 0x76, 0x72, 0x17, 0x0a, 0xba, 0x13, 0x83, 0x0b, - 0xdd, 0x45, 0xa2, 0xd1, 0x70, 0xdc, 0xf6, 0xa5, 0x30, 0x83, 0x68, 0xb6, 0x07, 0x97, 0xac, 0x8b, 0x54, 0xb3, 0x59, - 0x1a, 0x40, 0x5e, 0xb6, 0x56, 0x2b, 0x75, 0xe1, 0x1b, 0xe9, 0xf9, 0x73, 0xdc, 0xf0, 0x5d, 0x5e, 0xf0, 0xfc, 0x4d, - 0x92, 0x7e, 0x04, 0x54, 0x15, 0xf8, 0x6c, 0x39, 0x8f, 0x70, 0x64, 0x1e, 0x74, 0x83, 0xbf, 0xe6, 0x21, 0xae, 0x08, - 0x47, 0xee, 0x8d, 0xb7, 0x68, 0x50, 0x0d, 0x96, 0x67, 0x65, 0x78, 0x72, 0x9e, 0x5c, 0x03, 0xe3, 0xa0, 0xff, 0x56, - 0x68, 0x59, 0xfd, 0x4e, 0x72, 0x17, 0xa8, 0x43, 0xf9, 0x67, 0xc7, 0xdc, 0xa8, 0xd6, 0xbb, 0x5d, 0x23, 0x39, 0x8e, - 0x7c, 0x55, 0x08, 0xdf, 0xff, 0x9d, 0x77, 0x0f, 0xdb, 0xee, 0xb9, 0xed, 0x65, 0xd9, 0x03, 0x70, 0xde, 0xeb, 0x35, - 0xc2, 0xbf, 0xc9, 0x9d, 0x6f, 0xef, 0x46, 0xd7, 0x52, 0x3c, 0xa1, 0x9a, 0x46, 0x8d, 0x37, 0xc6, 0xf0, 0xcd, 0xca, - 0x59, 0xdd, 0x6f, 0x8d, 0x83, 0xfd, 0x5b, 0xdd, 0x43, 0xe8, 0x84, 0xda, 0x33, 0x41, 0x56, 0xf6, 0x35, 0x01, 0x33, - 0x64, 0x60, 0xfa, 0xb6, 0x03, 0x1e, 0x7e, 0x8c, 0x14, 0x1c, 0x7a, 0x2d, 0x9f, 0x44, 0x21, 0x26, 0x69, 0xcd, 0x8d, - 0x18, 0x52, 0x6c, 0x1f, 0xc6, 0xe5, 0x74, 0x8d, 0x42, 0xae, 0x7b, 0xac, 0xea, 0xc4, 0xb4, 0xea, 0xc6, 0x48, 0x1d, - 0x6c, 0x93, 0x05, 0x67, 0x55, 0xef, 0x46, 0x42, 0xa9, 0x5e, 0x54, 0x33, 0xaf, 0x62, 0x36, 0xdb, 0xe6, 0x99, 0x61, - 0xfb, 0xee, 0x9a, 0x02, 0x43, 0xde, 0xfd, 0x32, 0x5c, 0xd4, 0x25, 0x1c, 0xbb, 0x71, 0x00, 0x59, 0x49, 0x2e, 0x97, - 0xee, 0x4d, 0x34, 0xde, 0x97, 0x83, 0x75, 0xf9, 0x42, 0x5a, 0x80, 0x07, 0xd5, 0x48, 0x45, 0x16, 0x72, 0x06, 0xfe, - 0x79, 0xc1, 0x9a, 0x7e, 0x88, 0x7f, 0x85, 0x03, 0xbe, 0x42, 0xd2, 0xd4, 0xaa, 0x9f, 0xe0, 0xe5, 0x22, 0x50, 0x78, - 0xdb, 0xba, 0x9f, 0x64, 0xe8, 0x22, 0x5a, 0xd7, 0xa9, 0x58, 0x2f, 0xcc, 0xba, 0x62, 0xa5, 0x2c, 0x1c, 0x1c, 0x77, - 0x31, 0x5a, 0xa7, 0xce, 0x63, 0xd3, 0x3d, 0x77, 0xf4, 0x50, 0xf0, 0x99, 0x71, 0xa4, 0x7b, 0x56, 0x40, 0xfc, 0xaa, - 0x50, 0x9f, 0xf6, 0xb3, 0x0c, 0xdf, 0xf3, 0xed, 0xc3, 0x3d, 0x61, 0xc9, 0x73, 0x96, 0x6f, 0x50, 0xc3, 0x02, 0x29, - 0xa0, 0x50, 0x0a, 0x8b, 0xd5, 0x2a, 0x16, 0x26, 0xaa, 0x81, 0x0b, 0x6a, 0xeb, 0x5e, 0xaf, 0x30, 0xfa, 0x3b, 0xa8, - 0x8b, 0xbd, 0x7a, 0xc4, 0x98, 0xb0, 0xa2, 0xf0, 0xd2, 0x49, 0x65, 0x41, 0x5f, 0xbb, 0xfa, 0x10, 0xd5, 0x94, 0x7b, - 0xb1, 0xd1, 0xf7, 0xbe, 0xe3, 0x33, 0x26, 0x17, 0xf0, 0x6c, 0x10, 0x66, 0x44, 0x31, 0xed, 0xbf, 0x81, 0x82, 0xc0, - 0xdb, 0x33, 0x3c, 0xc4, 0x47, 0xe0, 0xab, 0x3c, 0xad, 0x93, 0x99, 0x7f, 0x8c, 0x22, 0x32, 0xc1, 0x22, 0xa3, 0x5e, - 0x04, 0x5e, 0x43, 0x20, 0x42, 0x11, 0x12, 0x31, 0x31, 0x8a, 0x7a, 0x91, 0x71, 0x52, 0x8a, 0xc0, 0x6a, 0x0c, 0x94, - 0xdc, 0x11, 0x9e, 0xab, 0x8a, 0x88, 0x85, 0x35, 0x75, 0x50, 0x89, 0xa5, 0xc6, 0x4c, 0xfb, 0xa8, 0x53, 0x81, 0xb0, - 0xc8, 0x36, 0x05, 0x65, 0xbd, 0xa1, 0x2e, 0xc0, 0x92, 0x18, 0xd3, 0x5b, 0x9e, 0x5c, 0x03, 0x37, 0xc7, 0x46, 0xae, - 0xe8, 0x92, 0x5f, 0x81, 0x7a, 0x3a, 0x2d, 0xf0, 0xb5, 0x61, 0xd8, 0x46, 0x29, 0x5d, 0x13, 0x8e, 0x33, 0x52, 0x24, - 0xf4, 0x16, 0xa2, 0x3a, 0xcc, 0xb8, 0x48, 0x73, 0x3c, 0xa3, 0xb7, 0xe9, 0x14, 0xcf, 0xb8, 0x78, 0x62, 0x97, 0x3d, - 0x1d, 0x41, 0x92, 0xff, 0x58, 0xac, 0x89, 0x79, 0x94, 0xea, 0x77, 0xc5, 0x8a, 0x47, 0xc0, 0xab, 0xa8, 0x18, 0x75, - 0x47, 0xc6, 0xa6, 0x9c, 0xe9, 0xca, 0x78, 0xfd, 0xb5, 0x8e, 0x29, 0xce, 0x70, 0x8e, 0x92, 0x5c, 0x62, 0xd6, 0x13, - 0xe9, 0x6b, 0x88, 0xe8, 0x9c, 0x61, 0xfb, 0xa0, 0x15, 0xbf, 0x65, 0xf9, 0x33, 0x59, 0xbc, 0x37, 0x5b, 0x3e, 0x47, - 0x50, 0x08, 0x5c, 0x54, 0x44, 0x13, 0x6e, 0xf7, 0x16, 0x3d, 0x59, 0x35, 0x45, 0x6f, 0x6d, 0x53, 0x6e, 0x88, 0x53, - 0x08, 0x85, 0x9b, 0x4c, 0x79, 0xa3, 0x8d, 0x59, 0xaf, 0xf5, 0x9d, 0x46, 0xa7, 0xa8, 0x2c, 0x89, 0x30, 0xac, 0x55, - 0x53, 0xa5, 0x92, 0x88, 0xa6, 0x72, 0x12, 0xde, 0xd2, 0x00, 0x3b, 0x55, 0x38, 0x93, 0x0b, 0xa1, 0x53, 0x19, 0xe0, - 0x0d, 0xad, 0x36, 0xd7, 0xf2, 0xd6, 0x42, 0x4c, 0xe3, 0x3b, 0xfb, 0x83, 0xe1, 0x6b, 0xa3, 0xe2, 0x7f, 0x0b, 0x86, - 0x3d, 0x2a, 0x15, 0x00, 0x3f, 0x30, 0x9c, 0x05, 0xc8, 0x59, 0x7e, 0xf2, 0x16, 0xc0, 0x67, 0x59, 0xc8, 0x3b, 0x48, - 0x65, 0x26, 0xf5, 0x0e, 0x52, 0x19, 0xa4, 0x1a, 0x5f, 0xee, 0x7d, 0x51, 0x29, 0x8b, 0xc2, 0x06, 0x89, 0xc2, 0xa5, - 0x3a, 0x58, 0x12, 0x91, 0x40, 0xbb, 0x46, 0x94, 0x9b, 0x71, 0x01, 0x41, 0xfd, 0xa0, 0x71, 0xfb, 0x4d, 0x6f, 0xe1, - 0xfb, 0xce, 0xe6, 0x33, 0x9f, 0x7f, 0x67, 0xf3, 0x4d, 0x47, 0x1e, 0xe3, 0xeb, 0xb7, 0x9d, 0xc6, 0x32, 0x5e, 0x3a, - 0xac, 0xfd, 0x50, 0x3e, 0xa1, 0xd2, 0x32, 0x4f, 0x55, 0x93, 0x36, 0x9e, 0x04, 0x48, 0xd9, 0xac, 0x78, 0xb8, 0x0e, - 0x6e, 0xb7, 0x0e, 0x63, 0xde, 0x24, 0x6d, 0x84, 0x0e, 0x9d, 0x70, 0x25, 0x62, 0x23, 0x39, 0x1d, 0x3e, 0x3a, 0x82, - 0xbb, 0x97, 0x99, 0xda, 0xf0, 0x95, 0xb2, 0xd5, 0x9a, 0xed, 0xd6, 0x21, 0xdf, 0x59, 0xa5, 0xd1, 0xc6, 0x33, 0x46, - 0x96, 0xe0, 0x5c, 0x46, 0x0b, 0xab, 0x6a, 0x00, 0x27, 0xce, 0x17, 0xe2, 0xb7, 0x05, 0x1d, 0x99, 0xef, 0x43, 0x9b, - 0xf2, 0x7a, 0xa1, 0x7d, 0x52, 0x93, 0xc3, 0x20, 0x3a, 0xc8, 0x95, 0x0c, 0x72, 0x62, 0x7e, 0x44, 0x92, 0x53, 0x74, - 0xd1, 0xee, 0x25, 0xa7, 0x87, 0xfc, 0x90, 0xa7, 0xc0, 0xc3, 0xc6, 0x4d, 0x5f, 0xa1, 0xd9, 0xf6, 0x75, 0x1e, 0x2f, - 0x86, 0x3c, 0x73, 0xcd, 0x57, 0x1d, 0x94, 0xa9, 0x76, 0x8e, 0x90, 0x05, 0x28, 0xe6, 0x7b, 0x09, 0xb2, 0xeb, 0xdd, - 0x1c, 0xf2, 0x14, 0xfa, 0x81, 0x5a, 0x1d, 0x5b, 0xab, 0x1c, 0xdc, 0x6f, 0x0b, 0x40, 0x30, 0xdf, 0x51, 0x6d, 0x2e, - 0x36, 0xbd, 0x19, 0x57, 0x9d, 0x1d, 0xf2, 0x6a, 0x84, 0x61, 0x99, 0xed, 0xfe, 0xfc, 0xd4, 0xaa, 0x2e, 0x0f, 0x03, - 0x88, 0xfc, 0xb6, 0xe0, 0x22, 0xec, 0x34, 0xec, 0xd6, 0xe5, 0x84, 0x9d, 0xd6, 0x67, 0x19, 0x14, 0xd9, 0xee, 0x75, - 0x6b, 0xa6, 0xf5, 0xd9, 0x5e, 0x81, 0x8f, 0x20, 0x4c, 0xca, 0xac, 0x74, 0x06, 0x57, 0xe8, 0x87, 0x1f, 0x90, 0x6b, - 0xfd, 0xf5, 0x42, 0xfb, 0xfc, 0x12, 0x11, 0x20, 0xbb, 0xea, 0xba, 0xac, 0x0e, 0x7d, 0x94, 0x4d, 0x7c, 0x3d, 0xe4, - 0xc1, 0xca, 0x3d, 0xbd, 0x9d, 0xcb, 0xd4, 0xe3, 0x6b, 0xaf, 0x95, 0x6e, 0x21, 0x27, 0x10, 0x0f, 0xd7, 0x5d, 0x58, - 0x16, 0xe4, 0xec, 0xe6, 0x16, 0x4a, 0x86, 0x13, 0xf7, 0xa5, 0x3f, 0x30, 0x7b, 0xdd, 0xc0, 0x2f, 0x92, 0x53, 0x98, - 0xfa, 0x66, 0x0f, 0x87, 0x1d, 0xe8, 0xc3, 0xc0, 0x61, 0xb3, 0x41, 0x9f, 0x59, 0x41, 0xe4, 0x31, 0x2f, 0x2c, 0x9e, - 0x5d, 0x92, 0x76, 0x8f, 0xa7, 0x6e, 0x33, 0x19, 0xd1, 0xa8, 0xdd, 0xe4, 0xc1, 0xcc, 0x00, 0xbf, 0x5c, 0xd9, 0xb0, - 0x88, 0x5f, 0xa7, 0x00, 0x4a, 0xbe, 0x58, 0xb5, 0x3e, 0x15, 0xbc, 0xea, 0x0d, 0xa7, 0x9b, 0xe9, 0x7e, 0xdd, 0xe0, - 0x76, 0xd7, 0xc3, 0x13, 0x9e, 0x40, 0xb1, 0x68, 0xed, 0x27, 0x3e, 0x01, 0x0e, 0x28, 0x69, 0xdd, 0x3f, 0x05, 0x17, - 0xca, 0x12, 0x96, 0xdb, 0xe5, 0x66, 0x5b, 0xe5, 0x2c, 0x1c, 0x6d, 0xc9, 0x80, 0x3b, 0xd8, 0x84, 0x28, 0x74, 0x70, - 0xd8, 0xc1, 0x49, 0xbb, 0xdd, 0x39, 0xc5, 0xc9, 0xc9, 0x29, 0x0c, 0xb4, 0x91, 0x9c, 0x1e, 0xce, 0x94, 0x05, 0x60, - 0x90, 0xb3, 0x76, 0xed, 0x3e, 0x82, 0x70, 0x49, 0xa1, 0x78, 0xcd, 0x0f, 0xe3, 0xb8, 0x9d, 0xdc, 0x6f, 0xb5, 0x4f, - 0xcf, 0x1b, 0x00, 0xa0, 0xa6, 0xfb, 0x70, 0x35, 0x5e, 0x2f, 0x74, 0xbd, 0x4a, 0x89, 0xf0, 0xf5, 0x6a, 0x0d, 0x5f, - 0xad, 0xd1, 0x5e, 0x57, 0x53, 0xf0, 0x55, 0x9d, 0x70, 0x6e, 0x8b, 0x78, 0xa5, 0x4d, 0xb8, 0x2d, 0x62, 0x3b, 0x90, - 0x18, 0xa4, 0xf3, 0xe4, 0xb4, 0x73, 0x8a, 0xec, 0x58, 0xb4, 0xc3, 0x8f, 0x72, 0x9f, 0x6c, 0x15, 0x69, 0x68, 0x40, - 0x92, 0x72, 0x76, 0x72, 0x01, 0x12, 0x35, 0x27, 0x97, 0xed, 0xe6, 0x8c, 0x25, 0x7e, 0x02, 0x26, 0x15, 0x96, 0xb3, - 0x5c, 0x05, 0x97, 0x14, 0x00, 0xe2, 0x02, 0x8c, 0x8b, 0xee, 0x9f, 0xf6, 0xee, 0x27, 0xa7, 0x67, 0x1d, 0x4b, 0xf4, - 0xf8, 0x45, 0xa7, 0x96, 0x66, 0xa6, 0x9e, 0x9c, 0x9a, 0x34, 0xe8, 0x3a, 0xb9, 0x7f, 0x0a, 0x65, 0x5c, 0x4a, 0x58, - 0x0a, 0xc2, 0x3c, 0x54, 0xc5, 0x20, 0xb6, 0x43, 0x5a, 0xcb, 0x3d, 0xab, 0x65, 0x9f, 0x9f, 0x1c, 0xdf, 0x3f, 0x0d, - 0xa1, 0x56, 0xce, 0xc2, 0x2c, 0xb4, 0x9b, 0x88, 0x9f, 0x1d, 0x2c, 0x2d, 0x3a, 0x4c, 0x4e, 0xd3, 0xad, 0x09, 0xda, - 0x4d, 0x73, 0x68, 0x70, 0x20, 0x50, 0x38, 0x3e, 0x15, 0x4e, 0x5f, 0x12, 0xdc, 0x8f, 0x55, 0x86, 0x26, 0xa1, 0xc2, - 0xd9, 0xdf, 0x53, 0x06, 0x2f, 0x39, 0x86, 0x57, 0x95, 0x8f, 0xa9, 0xf8, 0x42, 0xd5, 0x1b, 0x0a, 0xb1, 0x2b, 0xc4, - 0x20, 0x72, 0x91, 0xb5, 0xeb, 0xb9, 0x3f, 0x81, 0x8b, 0x30, 0x13, 0x70, 0xa1, 0xe9, 0x95, 0xa0, 0x15, 0x2f, 0x30, - 0x0c, 0x1d, 0x6a, 0xcd, 0xb0, 0x7a, 0x3c, 0x75, 0x26, 0x05, 0xa1, 0x6e, 0xeb, 0x39, 0xff, 0x5e, 0xb9, 0xa4, 0xbc, - 0xca, 0x4e, 0x4e, 0x51, 0xe2, 0x2e, 0xcb, 0x93, 0x36, 0x4a, 0x02, 0x13, 0x12, 0x77, 0x24, 0x67, 0x19, 0xe9, 0x47, - 0xb7, 0x11, 0x8e, 0xee, 0x22, 0x1c, 0x59, 0x1f, 0xe6, 0x0f, 0xe0, 0x3c, 0x1f, 0xe1, 0xc8, 0xba, 0x32, 0x47, 0x38, - 0xd2, 0x4c, 0x40, 0x48, 0xab, 0x68, 0x80, 0x73, 0x28, 0x6d, 0x3c, 0xab, 0xcb, 0xd2, 0x8f, 0xfd, 0x57, 0xe9, 0x7a, - 0x6d, 0x53, 0x02, 0x29, 0x73, 0x6a, 0x76, 0xa8, 0x7d, 0x92, 0x39, 0xa2, 0x9e, 0x59, 0x8f, 0x30, 0x08, 0x20, 0xf4, - 0xce, 0x3f, 0xe9, 0x56, 0x45, 0xc3, 0x60, 0xc7, 0xb0, 0xd2, 0xe0, 0x67, 0x1e, 0x85, 0x67, 0x58, 0x84, 0xc7, 0xc2, - 0x17, 0x06, 0xb1, 0xc2, 0xff, 0xce, 0xa5, 0x9c, 0xfb, 0xdf, 0x5a, 0x96, 0xbf, 0xe0, 0x21, 0x10, 0x67, 0xd1, 0x02, - 0x96, 0x5b, 0x36, 0xf8, 0xce, 0x90, 0xd5, 0x47, 0x70, 0x3d, 0x76, 0x01, 0xd2, 0x40, 0x22, 0xbc, 0x36, 0x02, 0x95, - 0x97, 0x0f, 0xaf, 0x6d, 0xb0, 0x1e, 0xf3, 0x09, 0xd1, 0xba, 0x20, 0x20, 0xaf, 0x84, 0x0b, 0x8d, 0x49, 0xc1, 0x94, - 0x8a, 0x6c, 0x14, 0xbb, 0x48, 0x0a, 0xff, 0x2c, 0xa1, 0x4f, 0x19, 0x8b, 0xc8, 0x74, 0x58, 0x9f, 0xad, 0x15, 0x87, - 0x73, 0x59, 0xa8, 0xd4, 0xbe, 0x51, 0xe2, 0xc1, 0x58, 0x3d, 0x55, 0x9f, 0xe6, 0xd9, 0x1a, 0xdb, 0x3b, 0xec, 0xb2, - 0x90, 0xbb, 0xd2, 0x0e, 0x4b, 0x65, 0xd9, 0xfa, 0x5b, 0x13, 0x52, 0xb5, 0x19, 0x05, 0x13, 0xad, 0x06, 0x54, 0x85, - 0xb2, 0x80, 0xc2, 0x36, 0x1c, 0x4a, 0xba, 0x2c, 0x4b, 0xa6, 0xcb, 0x72, 0x19, 0x4e, 0x5a, 0xad, 0xf5, 0x1a, 0x17, - 0xcc, 0x84, 0x65, 0xd9, 0x59, 0x02, 0xf2, 0xd5, 0x54, 0xde, 0x04, 0xb9, 0x2a, 0x2d, 0x67, 0x69, 0x96, 0x28, 0x0a, - 0x8c, 0x60, 0xa3, 0x35, 0xfe, 0xc2, 0x15, 0x07, 0x78, 0xba, 0xd9, 0x0d, 0xa5, 0xcc, 0x19, 0x85, 0xe8, 0x5d, 0x41, - 0x93, 0x6b, 0x3c, 0xe5, 0x23, 0xb6, 0xbb, 0x4d, 0x30, 0x63, 0xfe, 0xf7, 0x5a, 0xf4, 0x08, 0x64, 0xd9, 0x3d, 0x83, - 0x3a, 0xb0, 0x88, 0x2b, 0xe8, 0x20, 0x94, 0xc1, 0x47, 0x21, 0x6e, 0xe6, 0xf4, 0x4e, 0x2e, 0x34, 0xc0, 0x65, 0xa1, - 0xe5, 0x1b, 0x17, 0xeb, 0x60, 0xbf, 0x85, 0x7d, 0xd8, 0x83, 0x25, 0x84, 0x0c, 0x68, 0x61, 0x1b, 0x23, 0xa2, 0x85, - 0x87, 0x52, 0x6b, 0x39, 0x4b, 0x5b, 0xd8, 0x04, 0x6c, 0x68, 0xad, 0xcb, 0xa8, 0x5a, 0xd7, 0xe5, 0x63, 0x8e, 0xd5, - 0x26, 0x58, 0x38, 0xe9, 0x50, 0x13, 0x1d, 0xdc, 0x1e, 0x32, 0xc2, 0x1b, 0x3f, 0x5f, 0xbd, 0x7e, 0xe5, 0x62, 0x26, - 0xf3, 0x31, 0xb8, 0x6c, 0x3a, 0xd5, 0xd8, 0xb5, 0x79, 0x05, 0x29, 0xae, 0x14, 0xa5, 0x56, 0x38, 0x85, 0x96, 0x5f, - 0x08, 0x9d, 0x27, 0xf6, 0xf2, 0xe2, 0x99, 0x2c, 0x66, 0xd4, 0xde, 0x18, 0xe1, 0x6b, 0xe5, 0x9e, 0x3d, 0x37, 0x2f, - 0xab, 0x54, 0x93, 0x7c, 0xb7, 0x79, 0x15, 0xb1, 0xc8, 0x8c, 0xfc, 0x0a, 0xda, 0x00, 0x53, 0xb9, 0x7c, 0xb5, 0xb6, - 0x20, 0x2e, 0xf2, 0x7c, 0x40, 0x5e, 0xde, 0x5a, 0xea, 0x12, 0x45, 0x0d, 0x6e, 0xf0, 0x93, 0x15, 0x3c, 0x0b, 0xae, - 0x0b, 0x0d, 0x7b, 0xe4, 0xc4, 0x8b, 0xa8, 0x15, 0xd5, 0x5f, 0x7d, 0x35, 0xaa, 0x04, 0x1f, 0xb5, 0x34, 0xc9, 0x25, - 0x88, 0x1e, 0xe5, 0x03, 0x73, 0x1c, 0x44, 0x13, 0x7f, 0xf7, 0x7c, 0xd9, 0xf6, 0x74, 0x36, 0xaf, 0xd4, 0x89, 0xe5, - 0x95, 0x09, 0x78, 0x38, 0xda, 0x27, 0x5c, 0x10, 0x0e, 0x12, 0x59, 0xa9, 0x3d, 0xf4, 0xb9, 0xa8, 0x1b, 0xe7, 0x17, - 0x6d, 0xd6, 0x3c, 0x59, 0xad, 0xf2, 0xcb, 0x36, 0x6b, 0x9f, 0xda, 0x07, 0xdf, 0x22, 0x95, 0x01, 0xcd, 0xe5, 0x63, - 0x9e, 0x45, 0xa0, 0x9d, 0x1d, 0x67, 0x26, 0x9c, 0x82, 0x0f, 0x51, 0x4c, 0x16, 0xba, 0xea, 0x4b, 0x82, 0x71, 0x29, - 0xb1, 0x7a, 0xfc, 0x02, 0xf5, 0xda, 0xe9, 0xb6, 0xab, 0x74, 0xb3, 0x7d, 0x18, 0x5c, 0xb8, 0x14, 0x08, 0x77, 0x20, - 0xe4, 0x01, 0xe8, 0x77, 0x97, 0x02, 0x4c, 0x83, 0x00, 0x95, 0x15, 0x88, 0xb4, 0x7c, 0xb6, 0x98, 0x3d, 0x2b, 0xa8, - 0x59, 0x86, 0x27, 0x7c, 0xc2, 0xb5, 0x4a, 0x29, 0x48, 0xb7, 0xbb, 0xd2, 0xd7, 0xbb, 0x25, 0xa8, 0xac, 0x16, 0xf9, - 0x35, 0xd1, 0x3c, 0xfb, 0xac, 0xdc, 0xc2, 0x21, 0x6c, 0x56, 0x56, 0xe0, 0x0c, 0xad, 0x71, 0x2e, 0x27, 0xb4, 0xe0, - 0x7a, 0x3a, 0xfb, 0xb7, 0x56, 0x87, 0xf5, 0xf5, 0xc0, 0x5c, 0x58, 0x01, 0x48, 0xa8, 0x18, 0xad, 0x56, 0xfc, 0xe8, - 0xfb, 0xf7, 0x49, 0xde, 0x27, 0xbc, 0x8d, 0x3b, 0xf8, 0x18, 0x9f, 0xe2, 0x76, 0x0b, 0xb7, 0x4f, 0xe1, 0xea, 0x3e, - 0xcb, 0x17, 0x23, 0xa6, 0x62, 0x78, 0xf9, 0x4b, 0x5f, 0x26, 0xe7, 0x87, 0x65, 0xbc, 0x7b, 0x5d, 0x24, 0x0e, 0x5d, - 0x82, 0xb0, 0xeb, 0x2e, 0x5e, 0x5d, 0x14, 0x85, 0xc1, 0xd2, 0xc6, 0xa1, 0xea, 0xa4, 0xd4, 0x2f, 0x5c, 0x1e, 0xf7, - 0xc0, 0x9e, 0xdb, 0xae, 0x6c, 0x13, 0xcc, 0xbe, 0xed, 0xcf, 0xb4, 0xfa, 0xd9, 0xd4, 0x25, 0x62, 0x78, 0xe8, 0x55, - 0xe8, 0x81, 0x2e, 0x49, 0xfb, 0xe0, 0x00, 0xac, 0x8e, 0x82, 0xd9, 0x70, 0x1b, 0xfd, 0x80, 0x37, 0x6b, 0x69, 0x10, - 0xac, 0x00, 0x8c, 0x3b, 0xdf, 0x70, 0xb2, 0xb4, 0xb0, 0xd5, 0x40, 0x85, 0x75, 0x11, 0x46, 0x74, 0x0b, 0x49, 0x85, - 0x11, 0xa2, 0xe1, 0x08, 0x73, 0x91, 0x4e, 0xf6, 0x5b, 0x58, 0x8e, 0xc7, 0x8a, 0x69, 0x38, 0x3a, 0x0a, 0xf6, 0x85, - 0x15, 0xca, 0x9c, 0x22, 0x43, 0x36, 0xe1, 0xe2, 0xa1, 0xfe, 0xc4, 0x0a, 0x69, 0x3e, 0x8d, 0x06, 0x23, 0x8d, 0xcc, - 0x2a, 0x46, 0x38, 0xcb, 0xf9, 0x1c, 0xaa, 0x4e, 0x0a, 0x70, 0xfa, 0x81, 0xbf, 0x7c, 0x94, 0x86, 0x6d, 0x02, 0xf9, - 0xfa, 0x60, 0x83, 0xd9, 0xe0, 0x51, 0x41, 0x6f, 0x5e, 0x8b, 0xc7, 0xb0, 0xa3, 0x1e, 0x16, 0x8c, 0x42, 0x36, 0x24, - 0xbd, 0x83, 0xa6, 0xe0, 0x03, 0xda, 0x7c, 0x69, 0x00, 0x97, 0x9e, 0x9b, 0x0f, 0x5b, 0xd1, 0x47, 0x0d, 0x4c, 0xca, - 0xb6, 0x4c, 0xa6, 0x39, 0xa5, 0xab, 0x4c, 0x1b, 0x97, 0xa9, 0x9c, 0xc2, 0x1a, 0xbb, 0xa8, 0x27, 0xe1, 0x60, 0x46, - 0x54, 0x4d, 0xd3, 0xfe, 0xc0, 0xfc, 0x7d, 0x6d, 0x4b, 0xb6, 0xb0, 0x0b, 0xb5, 0xb3, 0xc6, 0xe6, 0xc9, 0xce, 0xa0, - 0x7c, 0x1b, 0xc3, 0x3d, 0x2c, 0xbc, 0x1b, 0x59, 0x23, 0x9f, 0x27, 0x9e, 0x6c, 0x9e, 0xac, 0xd7, 0x66, 0x20, 0x2a, - 0x05, 0x3d, 0xd0, 0x5b, 0xbf, 0x6d, 0x5a, 0xb0, 0x3d, 0xca, 0xaf, 0xd3, 0x16, 0x9e, 0x71, 0x78, 0x06, 0xd3, 0xb7, - 0x77, 0xa5, 0x0b, 0xf9, 0xd9, 0x81, 0xa4, 0x15, 0xa4, 0xd8, 0xe9, 0x04, 0x9d, 0x1d, 0xe3, 0x60, 0xe4, 0x40, 0xcf, - 0xaf, 0x3e, 0x5b, 0x58, 0xfb, 0xdf, 0x6f, 0xca, 0x82, 0x39, 0x1d, 0xb2, 0xbc, 0x9c, 0x50, 0xe6, 0xcf, 0xcf, 0x37, - 0x3c, 0xa9, 0x50, 0xc1, 0xbd, 0x1f, 0x05, 0x7b, 0xda, 0x86, 0x98, 0x9c, 0xd1, 0xbf, 0xed, 0x0f, 0x1b, 0x11, 0xa8, - 0xd4, 0xb2, 0x65, 0x85, 0x54, 0xea, 0xa1, 0x4d, 0xb3, 0x47, 0x0f, 0x1c, 0x91, 0x2f, 0xa1, 0x0b, 0xe0, 0xf5, 0x47, - 0x85, 0x9c, 0x1b, 0x44, 0x70, 0xbf, 0xdd, 0xb8, 0x8d, 0xaf, 0x00, 0x78, 0x3b, 0xec, 0x55, 0xff, 0xb4, 0x80, 0xfd, - 0x8d, 0xca, 0x92, 0x7e, 0xbc, 0x1d, 0x7b, 0xfc, 0x17, 0x12, 0xe2, 0x95, 0x5b, 0x3c, 0x4c, 0x1c, 0x3a, 0x95, 0xac, - 0x59, 0xf9, 0x73, 0xab, 0x24, 0x60, 0x58, 0xbd, 0x60, 0xc8, 0xc6, 0x6d, 0x15, 0xb7, 0x99, 0xff, 0x41, 0x05, 0x83, - 0x05, 0xdf, 0x1a, 0x49, 0xc5, 0xb2, 0xf8, 0xed, 0x53, 0xe7, 0xbf, 0xea, 0x1c, 0xd7, 0xbe, 0xae, 0xbd, 0x51, 0x39, - 0x34, 0xf1, 0x81, 0x23, 0x74, 0x70, 0xb0, 0x91, 0x41, 0xc7, 0x00, 0x78, 0xe4, 0xd8, 0x2f, 0xbf, 0x7c, 0x9e, 0x1d, - 0x33, 0x9a, 0xc7, 0x22, 0x0a, 0x99, 0x3b, 0xcf, 0xcd, 0xd9, 0x89, 0x3c, 0xa1, 0x6a, 0xea, 0x0b, 0x03, 0x1c, 0x1f, - 0x6d, 0xa5, 0x02, 0xbe, 0x47, 0xeb, 0x1d, 0x13, 0xd8, 0xe0, 0xb7, 0xec, 0xa4, 0x76, 0x15, 0xf4, 0x0b, 0xb4, 0xdc, - 0xc5, 0x54, 0x6e, 0x2c, 0x70, 0xb4, 0x39, 0x91, 0x9d, 0x43, 0xdf, 0xa8, 0x53, 0xb2, 0x1e, 0x4f, 0x76, 0x1b, 0x7d, - 0x49, 0xb1, 0x2b, 0xb9, 0xa2, 0x6d, 0x43, 0x56, 0xbd, 0x53, 0xab, 0x2b, 0x53, 0xa7, 0xea, 0x9a, 0xb7, 0xb2, 0xb4, - 0x29, 0xed, 0x92, 0xec, 0xdd, 0x16, 0x0b, 0xaf, 0xc2, 0x1b, 0x8d, 0xf2, 0x22, 0x14, 0xec, 0xb1, 0xc4, 0xa0, 0xcb, - 0x09, 0x5c, 0x2f, 0xac, 0x56, 0x31, 0xfc, 0xd9, 0x35, 0x86, 0x5d, 0xa6, 0x4b, 0x1f, 0xf8, 0x06, 0xbf, 0x12, 0x84, - 0xca, 0x75, 0x76, 0x90, 0x60, 0xdd, 0xe5, 0x06, 0x0d, 0xc7, 0x89, 0xff, 0x82, 0x87, 0x9a, 0xb5, 0x77, 0x39, 0x98, - 0x64, 0xdf, 0x78, 0xdc, 0xad, 0x64, 0x2d, 0x6b, 0x71, 0xd6, 0x37, 0x24, 0x18, 0x62, 0x37, 0xa5, 0x73, 0xdc, 0x4a, - 0xda, 0x28, 0x72, 0xc5, 0x2a, 0xf4, 0xff, 0x56, 0x91, 0xcc, 0x66, 0xfe, 0xd7, 0xd9, 0xd9, 0x99, 0x4b, 0x71, 0x36, - 0x7f, 0xca, 0x78, 0xc0, 0x99, 0x04, 0xf6, 0x85, 0x67, 0xcc, 0xe8, 0x90, 0xdf, 0xc2, 0x50, 0x88, 0x20, 0x97, 0xc2, - 0xb1, 0x4b, 0xf0, 0xce, 0x20, 0x50, 0x1e, 0x60, 0xff, 0x9e, 0x6c, 0x94, 0xf3, 0x0f, 0x15, 0xf9, 0x40, 0xbe, 0x65, - 0x83, 0xec, 0x8b, 0xf9, 0xec, 0x5b, 0x33, 0x19, 0x88, 0xcd, 0x1f, 0x61, 0xfb, 0xdb, 0xb0, 0xb4, 0xce, 0x52, 0x06, - 0x47, 0x5a, 0x2e, 0xb2, 0xa9, 0xd5, 0xfc, 0xbb, 0x0f, 0x53, 0xd6, 0x3d, 0x72, 0x03, 0x41, 0xb9, 0xc8, 0xd2, 0xc5, - 0xa3, 0x8c, 0x7e, 0x2c, 0x43, 0x4f, 0xee, 0xbd, 0x62, 0x0b, 0xf6, 0x23, 0xde, 0xab, 0x52, 0xe0, 0xe3, 0x61, 0xc1, - 0x69, 0xfe, 0x23, 0xde, 0xab, 0x42, 0x50, 0x82, 0x2b, 0xa4, 0x89, 0xe2, 0x88, 0xcd, 0x83, 0xce, 0x69, 0x24, 0x80, - 0x82, 0xe6, 0x91, 0x39, 0xc8, 0x9e, 0xbb, 0xa8, 0x85, 0x49, 0x07, 0xbb, 0xb8, 0x5f, 0x36, 0x16, 0xa9, 0x0d, 0xe1, - 0x0d, 0x91, 0xdc, 0xca, 0xd9, 0x98, 0xaf, 0x47, 0x1b, 0x0b, 0x62, 0x94, 0xc9, 0xe4, 0xf2, 0x39, 0x8f, 0xb7, 0x16, - 0x0b, 0x85, 0xd5, 0x82, 0x05, 0xaa, 0x55, 0xa9, 0xd2, 0xc3, 0xe2, 0xdb, 0x05, 0xb3, 0xa0, 0x88, 0xd9, 0x7a, 0x0f, - 0x6f, 0xb9, 0x22, 0x20, 0x25, 0xbb, 0x24, 0x78, 0x93, 0xdb, 0x60, 0xaa, 0x7f, 0x82, 0x1d, 0x08, 0x3d, 0x53, 0x3a, - 0xc2, 0x26, 0x4f, 0x41, 0x24, 0xb1, 0xfd, 0x16, 0x76, 0xac, 0xd1, 0x0b, 0xe1, 0x85, 0x14, 0x38, 0x57, 0x4d, 0x13, - 0x33, 0xca, 0x4d, 0x74, 0xb1, 0x87, 0x6a, 0xce, 0x32, 0x6d, 0x11, 0x60, 0xdf, 0xa1, 0xa1, 0x14, 0xcf, 0x0d, 0x28, - 0xcc, 0x63, 0xd2, 0x2e, 0xe5, 0x31, 0x2c, 0x5e, 0x90, 0x02, 0x44, 0x8d, 0x8b, 0x49, 0x59, 0x67, 0x9e, 0x2f, 0x26, - 0x5c, 0x54, 0xc8, 0x50, 0x30, 0x35, 0x97, 0x02, 0xde, 0x72, 0x28, 0x8b, 0x18, 0x3a, 0x54, 0xc3, 0x77, 0x4b, 0xc2, - 0xca, 0x3a, 0xe6, 0x98, 0xe2, 0xa2, 0xaa, 0x01, 0xcc, 0xc5, 0xc3, 0xf0, 0xd1, 0x77, 0xf5, 0x5a, 0xbc, 0x93, 0xf3, - 0x2a, 0xdf, 0xd3, 0x38, 0x1f, 0x32, 0xdd, 0xd9, 0x0d, 0xa3, 0xb5, 0x79, 0x6e, 0x29, 0xd8, 0xbe, 0x1f, 0x78, 0xf5, - 0x04, 0xd9, 0xda, 0x3c, 0xd8, 0x54, 0x66, 0x0d, 0x59, 0xf9, 0x3a, 0x41, 0xd5, 0x5e, 0xbd, 0xaa, 0x14, 0xb6, 0x22, - 0x40, 0xa5, 0xe0, 0xa3, 0xad, 0xfc, 0x27, 0xda, 0xe6, 0xdb, 0x73, 0xa8, 0x0c, 0x0f, 0xe4, 0xc9, 0x50, 0xd5, 0x03, - 0x2e, 0xca, 0x0f, 0x01, 0x2c, 0x7e, 0x64, 0x22, 0xd7, 0xee, 0xba, 0x40, 0xe6, 0x4c, 0xc5, 0x12, 0x2f, 0xfb, 0x74, - 0x90, 0x5a, 0x79, 0x28, 0x95, 0x60, 0xdb, 0x73, 0x53, 0x70, 0xed, 0x43, 0xe4, 0xe2, 0x3e, 0x1b, 0xa4, 0xcb, 0x7a, - 0x18, 0x5d, 0x1b, 0xc8, 0xd7, 0x9b, 0x73, 0x9a, 0xb8, 0xb3, 0x74, 0x80, 0x73, 0x02, 0xb6, 0xc7, 0x9e, 0x3d, 0x7d, - 0x13, 0x67, 0xa8, 0x57, 0xe7, 0xf0, 0x97, 0x6b, 0x9c, 0xe3, 0x0c, 0xa5, 0x0f, 0x63, 0xb8, 0xc0, 0x5a, 0x63, 0x00, - 0x5f, 0x66, 0x49, 0x15, 0x78, 0xa4, 0x66, 0x46, 0x62, 0x75, 0x17, 0x81, 0x68, 0xa9, 0xc3, 0xdb, 0x71, 0xe6, 0x03, - 0x51, 0x1b, 0xee, 0xf5, 0x99, 0x11, 0x0e, 0x27, 0x59, 0x5c, 0x3b, 0x67, 0x38, 0xb9, 0xdc, 0xe7, 0xb5, 0x13, 0x13, - 0xac, 0xbd, 0xc3, 0x53, 0x05, 0xf4, 0x68, 0x70, 0xaa, 0x58, 0x1a, 0x02, 0x31, 0x13, 0xc0, 0x9b, 0x39, 0x3c, 0xda, - 0x02, 0x9c, 0x8f, 0xd6, 0x38, 0xf8, 0x4a, 0x6b, 0x5d, 0x6d, 0x2a, 0x51, 0xd6, 0x6b, 0xdc, 0x9f, 0x66, 0x78, 0x94, - 0xe1, 0x79, 0x36, 0x08, 0x8e, 0x9b, 0x59, 0x16, 0x9a, 0x74, 0xad, 0x56, 0x4f, 0x9d, 0x19, 0x21, 0xb2, 0x3f, 0x2d, - 0xfd, 0x41, 0x3d, 0x40, 0xf8, 0x14, 0xb2, 0x80, 0x96, 0xf4, 0xdc, 0xdf, 0x86, 0x7d, 0xa7, 0x1a, 0x35, 0x62, 0x9e, - 0x58, 0x32, 0xd2, 0xf3, 0x3f, 0xca, 0x2c, 0xdb, 0x5a, 0x23, 0x9a, 0xdf, 0xee, 0x45, 0x0d, 0xdf, 0x5e, 0xa0, 0x65, - 0x2b, 0xcd, 0x76, 0x00, 0x51, 0xac, 0x71, 0x92, 0x0e, 0xd6, 0x48, 0xae, 0x56, 0xb1, 0x4d, 0x21, 0x3c, 0x99, 0x31, - 0xaa, 0x16, 0x85, 0x79, 0xba, 0x2d, 0x56, 0x28, 0x31, 0xfc, 0x2e, 0x76, 0x36, 0xa2, 0xf0, 0x52, 0x9a, 0x04, 0xc3, - 0x8d, 0x58, 0x10, 0x59, 0x13, 0xb9, 0x87, 0x59, 0x65, 0x19, 0x24, 0x88, 0x30, 0x22, 0xbf, 0xbd, 0x2e, 0x15, 0xf6, - 0x71, 0x38, 0xfb, 0xc7, 0xf8, 0x02, 0xc2, 0xcd, 0xdb, 0x84, 0x16, 0x43, 0x3a, 0x01, 0x36, 0x16, 0xe2, 0x10, 0x6e, - 0x25, 0xac, 0x56, 0xfd, 0x41, 0x57, 0x18, 0xf2, 0xec, 0x9e, 0xae, 0x2b, 0x1b, 0xda, 0xdd, 0x00, 0x5c, 0x75, 0x5b, - 0x6a, 0xae, 0x8d, 0xee, 0x87, 0x9a, 0xd7, 0xb5, 0xb8, 0x4b, 0x72, 0x0f, 0x64, 0x54, 0x6f, 0x60, 0xd7, 0x2c, 0xc0, - 0x4d, 0xe8, 0x2a, 0x3c, 0xc2, 0x0b, 0x6b, 0xc3, 0x69, 0x9e, 0x52, 0xa2, 0xe6, 0x05, 0x25, 0x78, 0xb8, 0x99, 0xb0, - 0x7e, 0x36, 0xc0, 0x23, 0x1f, 0x68, 0x7b, 0xff, 0x6d, 0x3c, 0x42, 0xa8, 0x20, 0x06, 0xa6, 0xd6, 0x65, 0x7b, 0x54, - 0xd9, 0xed, 0x9b, 0x4c, 0xc3, 0x30, 0x18, 0x23, 0xe6, 0x51, 0x68, 0xc4, 0x9c, 0x37, 0x1a, 0x68, 0x41, 0x46, 0x60, - 0xc4, 0xbc, 0x08, 0x5a, 0x5b, 0xd8, 0x67, 0x36, 0x83, 0xf6, 0x16, 0x08, 0x75, 0x39, 0xd0, 0x34, 0x0d, 0x0f, 0x6a, - 0x54, 0x0f, 0x9a, 0xfb, 0xe7, 0x9d, 0x8e, 0x3a, 0xa0, 0x48, 0x18, 0x5f, 0xfa, 0x49, 0x58, 0xd7, 0x70, 0x3b, 0xee, - 0xb1, 0x19, 0xb7, 0xb3, 0x6d, 0x50, 0x7d, 0xd9, 0xcf, 0x06, 0x83, 0xae, 0xf4, 0x56, 0x12, 0x2d, 0x3c, 0xae, 0x9e, - 0xe0, 0xa8, 0x16, 0xef, 0x8b, 0xde, 0xbc, 0xf2, 0xe6, 0xfe, 0x65, 0xcf, 0xcd, 0xf3, 0x18, 0x38, 0xa0, 0x7d, 0xb8, - 0x1f, 0xaa, 0xe2, 0x83, 0x1d, 0x75, 0x20, 0x0a, 0x5a, 0xda, 0xaa, 0x09, 0xa4, 0xd6, 0xcc, 0x2e, 0xd6, 0x4d, 0x85, - 0x0e, 0x05, 0x84, 0x21, 0x53, 0x55, 0x77, 0x77, 0x2a, 0x50, 0x0d, 0x71, 0x38, 0xf5, 0x1f, 0x5b, 0x23, 0xd6, 0x38, - 0xea, 0x8c, 0x22, 0x63, 0x24, 0x69, 0x97, 0x0f, 0x5e, 0xdd, 0x01, 0x2b, 0x01, 0x1f, 0xfd, 0xd8, 0x24, 0x19, 0x43, - 0x82, 0xb7, 0x2c, 0xd3, 0x86, 0x0f, 0xe1, 0x0e, 0x41, 0x79, 0x62, 0x63, 0x6d, 0xba, 0x4a, 0x16, 0x72, 0x55, 0x97, - 0xd7, 0x01, 0x7a, 0xde, 0x95, 0xbf, 0xb1, 0xe1, 0xc8, 0x82, 0x81, 0x65, 0x5b, 0xfb, 0x04, 0x3c, 0xf2, 0x71, 0x85, - 0x20, 0x7e, 0x29, 0x74, 0x62, 0x22, 0x45, 0x5f, 0xc1, 0x06, 0xc5, 0x73, 0x70, 0x10, 0x74, 0x12, 0x1c, 0x06, 0xef, - 0x32, 0xab, 0x49, 0x36, 0xb8, 0x35, 0x23, 0xf1, 0x7c, 0xb5, 0x6a, 0xa1, 0xc3, 0x7f, 0xcc, 0x63, 0xc8, 0xe3, 0x52, - 0xe1, 0x3e, 0xae, 0x14, 0xee, 0x60, 0x09, 0x48, 0xc6, 0x81, 0xae, 0x1d, 0xcb, 0x50, 0x8d, 0x0e, 0x71, 0xba, 0x5f, - 0x40, 0xd4, 0x66, 0x77, 0x2c, 0x81, 0x9e, 0x7d, 0xab, 0x80, 0xd5, 0xb5, 0x97, 0x25, 0x90, 0x11, 0xdc, 0xfd, 0x26, - 0x30, 0x2a, 0x44, 0xe3, 0xf3, 0x67, 0xde, 0x53, 0xe0, 0x89, 0xf3, 0xe7, 0x9a, 0x19, 0xd6, 0xbd, 0xa0, 0x37, 0xa6, - 0xf9, 0x78, 0x8c, 0x9b, 0x63, 0x0b, 0xce, 0xa3, 0x0e, 0xfc, 0xb4, 0x10, 0x3d, 0xea, 0x60, 0x97, 0x8a, 0xc7, 0x25, - 0x90, 0x43, 0xf4, 0x74, 0x06, 0x52, 0xc0, 0x4a, 0xc7, 0x56, 0x8b, 0x34, 0x41, 0xab, 0xd5, 0xe4, 0x82, 0xb4, 0x10, - 0x5a, 0xaa, 0x1b, 0xae, 0xb3, 0x29, 0xf8, 0x48, 0x83, 0x62, 0xe0, 0x0d, 0xd5, 0xd3, 0x18, 0xe1, 0x31, 0x5a, 0x8e, - 0xd8, 0x98, 0x2e, 0x72, 0x9d, 0xaa, 0x1e, 0x4f, 0x6c, 0x28, 0x5b, 0x66, 0x23, 0xc1, 0x1d, 0x75, 0xf0, 0xc4, 0xf0, - 0x97, 0x8f, 0x8c, 0x39, 0x48, 0x91, 0x99, 0xe4, 0x89, 0x49, 0xc0, 0x3c, 0xc9, 0x72, 0xa9, 0x98, 0x6d, 0xa6, 0x6b, - 0x6d, 0xcb, 0x21, 0x18, 0x76, 0xa4, 0x0b, 0x6e, 0xac, 0x28, 0xa3, 0x74, 0x4a, 0x54, 0x4f, 0x1d, 0x75, 0xd2, 0x09, - 0xe6, 0x09, 0x70, 0x7a, 0xef, 0x64, 0xcc, 0x1a, 0xe5, 0xad, 0xe8, 0x0c, 0x1d, 0x4e, 0xb1, 0xa8, 0x2e, 0x51, 0x67, - 0xe8, 0x70, 0x82, 0xf0, 0xac, 0x41, 0x72, 0x05, 0x1e, 0xc3, 0x5c, 0xfc, 0x1f, 0x29, 0xff, 0xcd, 0x61, 0x43, 0xd0, - 0xe5, 0xb7, 0xb0, 0x53, 0xd8, 0x28, 0x4a, 0x73, 0x02, 0x5e, 0x8b, 0xed, 0x33, 0x9c, 0x91, 0x49, 0x33, 0xf7, 0x01, - 0xf7, 0x4c, 0x2b, 0x8d, 0x5b, 0x8d, 0x0e, 0x33, 0x3c, 0xda, 0x4c, 0x8a, 0xcd, 0x5c, 0x9b, 0x79, 0x9a, 0xc1, 0xf9, - 0x5e, 0x8d, 0xc2, 0x95, 0x5f, 0x6c, 0x26, 0x85, 0xe5, 0x1d, 0x70, 0x9b, 0x23, 0x2c, 0x9a, 0x14, 0xe7, 0x78, 0xd6, - 0xfc, 0x8a, 0x67, 0xcd, 0x0f, 0x65, 0x46, 0x63, 0x81, 0x05, 0x04, 0xef, 0x83, 0x44, 0x3c, 0xab, 0x92, 0x47, 0x58, - 0x34, 0x4c, 0x79, 0x3c, 0x6b, 0x54, 0xa5, 0x9b, 0x0b, 0x2c, 0x1a, 0xa6, 0x74, 0xe3, 0x03, 0x9e, 0x35, 0xbe, 0xfe, - 0x8b, 0x49, 0x47, 0x29, 0xa0, 0xcb, 0x1c, 0x2d, 0x33, 0x3b, 0xc4, 0xab, 0xdf, 0xde, 0xbe, 0x6b, 0x5f, 0x77, 0x0e, - 0x27, 0xd8, 0xaf, 0x5f, 0x66, 0x70, 0x2c, 0xd3, 0x31, 0x6b, 0x02, 0x44, 0x33, 0xdc, 0x39, 0x9c, 0xe2, 0xce, 0x61, - 0xe6, 0x9a, 0x5a, 0xcf, 0x1a, 0xe4, 0x56, 0x87, 0x50, 0xd4, 0x51, 0x1a, 0xc2, 0xc7, 0x4f, 0x36, 0x9d, 0xa0, 0x1a, - 0x28, 0xd1, 0xe1, 0xa4, 0x06, 0x2a, 0xf8, 0x5e, 0xd4, 0xbe, 0xab, 0x7a, 0x15, 0x06, 0x59, 0x28, 0xa1, 0x70, 0xcd, - 0x0d, 0x78, 0x6a, 0x29, 0x06, 0x32, 0x61, 0x8a, 0x05, 0xca, 0x77, 0x40, 0x61, 0x94, 0x27, 0x66, 0xe8, 0xc1, 0x74, - 0x4c, 0xe2, 0xff, 0xcf, 0x93, 0x29, 0x87, 0x5e, 0x6e, 0x99, 0xad, 0xe9, 0xb9, 0xc9, 0x84, 0xc3, 0x07, 0x1e, 0xeb, - 0xff, 0xda, 0x81, 0x62, 0x03, 0x52, 0xfc, 0x7f, 0xe9, 0xe8, 0x42, 0x30, 0x42, 0x56, 0x94, 0x16, 0x0e, 0xf1, 0xbf, - 0x3f, 0xac, 0xa0, 0xfb, 0x62, 0xab, 0xfb, 0xc2, 0x74, 0x1f, 0x36, 0x6d, 0x54, 0x39, 0x69, 0x55, 0xc9, 0x92, 0xff, - 0x3a, 0xdd, 0xda, 0x02, 0x8d, 0xa8, 0xd1, 0xb3, 0x49, 0xd8, 0xe0, 0x7e, 0x3b, 0xdd, 0x81, 0xcc, 0x6b, 0x6e, 0xdf, - 0xe6, 0x84, 0xc3, 0x37, 0xb8, 0x53, 0xbd, 0x6c, 0x81, 0xf7, 0xa6, 0x32, 0xfa, 0xca, 0x38, 0xb4, 0x1c, 0x2c, 0x36, - 0x4d, 0xb9, 0x8d, 0xb1, 0x74, 0x72, 0x8a, 0x8d, 0x2b, 0x22, 0x54, 0xba, 0xbd, 0x04, 0xa5, 0xf8, 0x58, 0x37, 0x99, - 0xf9, 0xba, 0xd0, 0x89, 0xb9, 0x84, 0x6a, 0x98, 0xcf, 0xbb, 0x4b, 0x9d, 0x68, 0x39, 0xb7, 0x79, 0x77, 0x17, 0xd0, - 0x27, 0x68, 0x58, 0x1b, 0x81, 0xdd, 0x3e, 0x2b, 0x9c, 0x7e, 0xa7, 0x3a, 0x04, 0xc3, 0x03, 0xc8, 0x91, 0x16, 0xdb, - 0x07, 0x36, 0xad, 0x61, 0xd7, 0x45, 0xb3, 0x4c, 0xb4, 0xad, 0x36, 0x4d, 0xae, 0xdd, 0xc3, 0x7c, 0x1e, 0xf2, 0x14, - 0xbc, 0xb0, 0xfa, 0xf1, 0x1d, 0xec, 0xc6, 0x6d, 0x8d, 0x91, 0xa8, 0x2b, 0x99, 0x4a, 0xe8, 0x27, 0xb7, 0x98, 0x25, - 0x77, 0xc6, 0x8b, 0x51, 0x19, 0x7f, 0x1f, 0x13, 0xa9, 0x3e, 0xaa, 0x24, 0x39, 0xb0, 0xec, 0x6f, 0xb0, 0xe4, 0x16, - 0xcc, 0x13, 0xcb, 0x6a, 0x12, 0xeb, 0xe4, 0x2e, 0x58, 0x44, 0x69, 0x1a, 0x59, 0x1b, 0x06, 0xd4, 0x34, 0x63, 0xd5, - 0x83, 0xfb, 0x10, 0xe8, 0xa1, 0x57, 0x96, 0xd2, 0xae, 0xb3, 0xb4, 0xd6, 0xbd, 0x36, 0xdd, 0x6f, 0x0e, 0x28, 0xe0, - 0x0b, 0x03, 0xae, 0xe9, 0x5f, 0x4d, 0x22, 0x19, 0xb2, 0xaf, 0x9c, 0x15, 0x8f, 0x17, 0x85, 0xc1, 0x34, 0xd1, 0xd3, - 0x49, 0x36, 0x6f, 0x83, 0xa9, 0x5e, 0x36, 0xef, 0xdc, 0x62, 0xf7, 0x7d, 0x67, 0xbf, 0xef, 0xb0, 0xe8, 0x31, 0x93, - 0x91, 0x32, 0x53, 0xcc, 0x7f, 0xdf, 0xd9, 0xef, 0x3b, 0xbc, 0x3d, 0x98, 0x1b, 0x7f, 0xa1, 0x58, 0xb2, 0x33, 0x5c, - 0x82, 0x09, 0x79, 0xc0, 0xdd, 0xd4, 0xb2, 0x4c, 0x10, 0xd8, 0x5a, 0x02, 0xc4, 0xf9, 0x7c, 0x1a, 0x57, 0xbc, 0x1a, - 0x02, 0xee, 0xd3, 0xbb, 0xb6, 0x57, 0xa9, 0xc0, 0x63, 0x82, 0x46, 0xc4, 0xc4, 0xb6, 0x31, 0xef, 0x6a, 0x01, 0x97, - 0x47, 0x74, 0xa9, 0x27, 0x49, 0x80, 0x57, 0x35, 0x2a, 0x6f, 0x53, 0xa4, 0xfc, 0x22, 0x41, 0x8e, 0x2f, 0xf6, 0x88, - 0x2a, 0x06, 0xb0, 0x2a, 0x4b, 0xfa, 0x04, 0x52, 0xcf, 0x0f, 0x26, 0xfa, 0x79, 0x13, 0x79, 0xec, 0x0b, 0xb3, 0x9f, - 0x99, 0x9e, 0x16, 0x72, 0x31, 0x99, 0x82, 0x0f, 0x2d, 0xb0, 0x0c, 0x85, 0xa9, 0x57, 0xd9, 0xfa, 0xd7, 0x24, 0x37, - 0x01, 0x14, 0x4e, 0x37, 0x65, 0x42, 0x33, 0xbd, 0xa0, 0xb9, 0xb1, 0x24, 0xe5, 0x62, 0xf2, 0x48, 0xde, 0xbe, 0x04, - 0xec, 0xa6, 0x44, 0x37, 0x76, 0xe4, 0xbd, 0x85, 0x1d, 0x80, 0x33, 0xc2, 0x76, 0x55, 0x7c, 0xa8, 0x40, 0xe7, 0x8f, - 0x73, 0xc2, 0x76, 0x55, 0x7d, 0xc2, 0x6c, 0xf6, 0x94, 0x6c, 0x0c, 0xb7, 0x17, 0x67, 0x8d, 0x1c, 0x1d, 0x75, 0xd2, - 0xbc, 0xeb, 0x89, 0x81, 0x05, 0x68, 0x00, 0xdc, 0xad, 0xed, 0x59, 0xde, 0xdd, 0x10, 0xd0, 0xbb, 0x64, 0xd2, 0x5e, - 0x97, 0x9b, 0x94, 0xd5, 0xaa, 0x53, 0x51, 0xc1, 0x02, 0x4f, 0x83, 0xbd, 0x40, 0xed, 0xd7, 0x0e, 0x8a, 0x73, 0x95, - 0x6d, 0x9a, 0x9e, 0x97, 0x7d, 0x77, 0x77, 0x2c, 0x32, 0xb6, 0x69, 0x6f, 0x77, 0x10, 0x09, 0xcb, 0x09, 0xeb, 0x80, - 0x13, 0xae, 0x6a, 0x07, 0x04, 0xe8, 0x3a, 0x10, 0xb9, 0xb1, 0x24, 0xcb, 0x75, 0x65, 0x74, 0x1f, 0xf8, 0xdd, 0x52, - 0x22, 0xdd, 0x68, 0x4b, 0x82, 0xe9, 0x13, 0x8c, 0x9a, 0xce, 0x3c, 0x8a, 0x5c, 0x7b, 0xef, 0x77, 0x53, 0xb4, 0xf5, - 0xaf, 0x0f, 0x63, 0xb3, 0x3d, 0x4c, 0x0c, 0x65, 0x10, 0x03, 0xbd, 0x8f, 0x78, 0xb7, 0xd1, 0xc8, 0x10, 0x28, 0x64, - 0xb2, 0x01, 0x96, 0x89, 0xd7, 0xa2, 0x1f, 0x1c, 0x18, 0x78, 0x54, 0x09, 0x08, 0x53, 0x10, 0x42, 0xc2, 0xae, 0x0d, - 0xc2, 0x86, 0xcb, 0x55, 0xcb, 0x85, 0x8d, 0x54, 0x1b, 0x3a, 0xf8, 0x7f, 0x85, 0xcb, 0x56, 0xcf, 0x2c, 0x17, 0xc5, - 0xe0, 0x66, 0x6e, 0xc0, 0x22, 0x41, 0x7a, 0xb4, 0xd9, 0x1e, 0x8a, 0xbb, 0x73, 0xb1, 0xd9, 0x10, 0x90, 0x98, 0xc3, - 0x04, 0x45, 0xc3, 0xb9, 0x31, 0xc6, 0x2a, 0xa9, 0xb4, 0xac, 0x35, 0x89, 0x39, 0xf0, 0xa5, 0x0b, 0xd7, 0x7d, 0x79, - 0x9b, 0x32, 0x7c, 0x97, 0x0a, 0x7c, 0x03, 0x9e, 0x34, 0xa9, 0xc4, 0xee, 0xf1, 0x82, 0x62, 0x4d, 0x74, 0xd7, 0xb3, - 0xb7, 0x05, 0xac, 0xb3, 0xd9, 0x23, 0x22, 0xf8, 0x5d, 0xfd, 0x6a, 0x83, 0xef, 0x16, 0xfe, 0x0a, 0xd6, 0xcf, 0xc1, - 0x49, 0x8a, 0x45, 0x43, 0x36, 0x0b, 0x77, 0x64, 0x40, 0xb9, 0x8a, 0x5f, 0x0e, 0x53, 0xb7, 0x8a, 0xe1, 0xda, 0xc7, - 0x57, 0xfc, 0x61, 0xa3, 0xdd, 0x86, 0x2a, 0x8b, 0xdb, 0xbd, 0x29, 0x1a, 0xb2, 0x6a, 0x7a, 0x47, 0xe6, 0x46, 0x4a, - 0xfd, 0xeb, 0x03, 0x6e, 0x6d, 0xb5, 0xef, 0xa7, 0xf9, 0xd6, 0xa3, 0x73, 0xd5, 0xb4, 0x4f, 0xad, 0x15, 0xc1, 0xc1, - 0xcf, 0x16, 0x6e, 0x6e, 0x0d, 0x38, 0x80, 0x9f, 0xbf, 0xa3, 0x79, 0x9c, 0x41, 0x74, 0x7a, 0xab, 0x19, 0x5f, 0xc5, - 0x7f, 0x8e, 0x1a, 0x71, 0x2f, 0xfd, 0x33, 0xf9, 0x73, 0xd4, 0x40, 0x3d, 0x14, 0xcf, 0x6f, 0x57, 0x6c, 0xb6, 0x82, - 0x60, 0x6b, 0xf7, 0x8e, 0xf0, 0xeb, 0xb0, 0x24, 0xd7, 0x34, 0xe7, 0xd9, 0xca, 0x3d, 0x45, 0xb7, 0x72, 0xef, 0xf4, - 0xac, 0xcc, 0xeb, 0x4a, 0xab, 0x58, 0x0e, 0x73, 0x08, 0x2c, 0x1c, 0xef, 0x35, 0x7b, 0xfd, 0x56, 0xf3, 0xc1, 0xc0, - 0xfe, 0x6b, 0x22, 0xdc, 0xa3, 0x5a, 0xc4, 0xb6, 0x37, 0x1b, 0x5b, 0x3f, 0x06, 0xc3, 0x0e, 0x08, 0x05, 0x0e, 0x72, - 0xe9, 0xe3, 0x0c, 0x59, 0xdf, 0x93, 0xd5, 0x8a, 0xb9, 0x68, 0xd6, 0x4e, 0x83, 0x5f, 0xc6, 0x66, 0x3a, 0x6c, 0x27, - 0x9d, 0xae, 0x17, 0x63, 0x49, 0x03, 0x22, 0x4d, 0x63, 0x06, 0x81, 0xa4, 0x96, 0x86, 0xc3, 0x9a, 0xdf, 0x46, 0x69, - 0x75, 0x7f, 0x04, 0x29, 0x3f, 0x44, 0x29, 0x3f, 0x22, 0x10, 0x40, 0xdb, 0x32, 0x47, 0x65, 0x43, 0xde, 0x77, 0xe9, - 0x9e, 0x71, 0x66, 0x68, 0xf0, 0xd5, 0xaa, 0x55, 0x0d, 0x53, 0x14, 0xf5, 0x61, 0x2e, 0xd7, 0x58, 0x90, 0x37, 0xa0, - 0x6b, 0x56, 0x44, 0xf4, 0x42, 0x57, 0x79, 0x78, 0x89, 0x17, 0x4b, 0x02, 0x4e, 0xfa, 0x3d, 0xd1, 0x2b, 0xc8, 0xe5, - 0xc3, 0x18, 0x7c, 0xcc, 0x30, 0xef, 0xeb, 0x7e, 0x31, 0x18, 0xa0, 0xd4, 0x39, 0x9d, 0xa5, 0x26, 0xe2, 0x4a, 0xe0, - 0x97, 0x5c, 0x80, 0x5f, 0xb2, 0x42, 0xac, 0x5f, 0x0c, 0xc8, 0xbd, 0x2c, 0x96, 0xe0, 0x94, 0xbf, 0xc3, 0xe7, 0xf1, - 0x61, 0x68, 0x60, 0x6a, 0x86, 0x65, 0x2e, 0xb2, 0xc1, 0x62, 0xce, 0x5a, 0x02, 0xc1, 0xcd, 0x80, 0xbb, 0xd4, 0x86, - 0x44, 0x63, 0x0d, 0x14, 0xdd, 0x46, 0xa1, 0x99, 0xd1, 0xd3, 0xad, 0x36, 0xfa, 0x91, 0xc3, 0x0b, 0x73, 0x0d, 0x63, - 0x11, 0xc8, 0x5c, 0xae, 0x7a, 0xec, 0x2f, 0x3f, 0x6c, 0x56, 0x18, 0xbc, 0xc2, 0x98, 0xec, 0x94, 0x56, 0x89, 0x66, - 0x7c, 0x95, 0x27, 0x8e, 0x21, 0xc8, 0xc4, 0x52, 0xe9, 0x86, 0x63, 0xe2, 0x4a, 0xfa, 0x4c, 0x0c, 0xd9, 0x6e, 0x78, - 0x66, 0x2e, 0x74, 0xb3, 0xfd, 0xc3, 0xb9, 0x9d, 0x73, 0xc2, 0x8d, 0x56, 0xd2, 0x68, 0xa3, 0x9e, 0x19, 0xaa, 0xea, - 0x82, 0xf9, 0x3d, 0x74, 0x5a, 0x5a, 0xec, 0x5c, 0xbd, 0xbb, 0xe1, 0xbb, 0x70, 0x65, 0xfc, 0x2d, 0x56, 0x85, 0x56, - 0x64, 0xb8, 0xdd, 0x42, 0xde, 0x9c, 0xe9, 0xa1, 0x57, 0xe4, 0x42, 0x75, 0xf8, 0x8b, 0xba, 0xc2, 0x3c, 0x15, 0x19, - 0x35, 0x84, 0x47, 0xbf, 0xd7, 0x19, 0x28, 0xff, 0x60, 0x62, 0x32, 0x67, 0xc9, 0x0d, 0x2d, 0x44, 0xfc, 0xe3, 0x0b, - 0x61, 0x62, 0x55, 0xed, 0xc1, 0x40, 0xf6, 0x4c, 0xc5, 0x3d, 0xb8, 0x35, 0xe1, 0x63, 0xce, 0x46, 0xe9, 0x5e, 0xf4, - 0x63, 0x43, 0x34, 0x7e, 0x8c, 0x7e, 0x04, 0x77, 0x67, 0xf7, 0x2e, 0x61, 0x19, 0x17, 0xc2, 0xdf, 0x63, 0x3d, 0x2c, - 0x55, 0xca, 0x58, 0x7b, 0xdd, 0x72, 0x78, 0x21, 0xf5, 0x26, 0x8b, 0x1f, 0x3a, 0x62, 0x6d, 0x53, 0xb0, 0x0e, 0x29, - 0x29, 0x3c, 0xbb, 0x62, 0x6e, 0xb5, 0x98, 0xbb, 0xd4, 0x12, 0xfe, 0xfa, 0xea, 0x61, 0xa9, 0x82, 0x86, 0x83, 0xd0, - 0x95, 0xb6, 0x90, 0x00, 0x03, 0x97, 0xd2, 0xa7, 0xd3, 0x9d, 0x49, 0x64, 0x96, 0xc5, 0xf0, 0xee, 0x41, 0x05, 0xf3, - 0xdf, 0xd9, 0x46, 0x58, 0x15, 0xb8, 0x5c, 0xa9, 0xa2, 0x5e, 0x4a, 0x02, 0x01, 0xe8, 0x4b, 0xef, 0x41, 0x79, 0x51, - 0x74, 0x1b, 0x0d, 0x09, 0x5a, 0x58, 0x6a, 0xae, 0x55, 0x31, 0xdd, 0x0f, 0xdf, 0xd3, 0x0b, 0x3e, 0xbc, 0x43, 0xda, - 0xc6, 0xa3, 0x96, 0x94, 0x50, 0xbb, 0x83, 0xf6, 0xc1, 0x2a, 0x3b, 0x28, 0xff, 0x36, 0xa6, 0xc8, 0xe6, 0xf7, 0xd9, - 0x0f, 0xd4, 0x75, 0x38, 0x70, 0x05, 0xab, 0x5e, 0xca, 0x28, 0x18, 0xc2, 0x3e, 0x60, 0x1f, 0x8b, 0x24, 0xa3, 0xd9, - 0x94, 0x81, 0xba, 0xdf, 0x16, 0xad, 0xe6, 0xf6, 0xa4, 0xee, 0x37, 0x64, 0x9c, 0x7d, 0x84, 0x71, 0xf6, 0x51, 0xe0, - 0xc5, 0x22, 0xc9, 0x1f, 0x32, 0xd6, 0x38, 0x56, 0x4d, 0x81, 0x8e, 0x3a, 0xc0, 0x9d, 0x81, 0x03, 0x0f, 0xd8, 0xa2, - 0x1c, 0x1c, 0x50, 0x67, 0x71, 0x4f, 0x1b, 0x99, 0xf7, 0xf6, 0x84, 0xda, 0x45, 0x2c, 0x70, 0xb3, 0x66, 0xa6, 0x05, - 0xad, 0x15, 0xc6, 0x79, 0x3c, 0xe0, 0x6d, 0x9e, 0xd5, 0xe2, 0x27, 0x6c, 0x58, 0x53, 0xd5, 0x6f, 0xa0, 0x39, 0xaa, - 0x05, 0xb9, 0x79, 0x62, 0xbc, 0x55, 0x49, 0x3f, 0x8a, 0x06, 0x96, 0x53, 0x21, 0x86, 0x64, 0xf4, 0x5b, 0x83, 0xe0, - 0x56, 0x7b, 0xb5, 0xe2, 0x1e, 0xf1, 0x45, 0xcd, 0x5b, 0xcd, 0xdc, 0x02, 0xd0, 0x22, 0x8e, 0xca, 0x7b, 0x93, 0x08, - 0xbc, 0x6f, 0xcb, 0x08, 0x69, 0xcb, 0xbe, 0x7d, 0x34, 0xb1, 0x54, 0x6c, 0xbe, 0xa3, 0x93, 0x41, 0x1a, 0xd9, 0x11, - 0x45, 0xf8, 0xba, 0x84, 0x24, 0x5c, 0x25, 0x5d, 0xab, 0x4c, 0xce, 0x99, 0x4a, 0x39, 0xbe, 0x2e, 0xa4, 0xd4, 0x57, - 0xf6, 0x4b, 0xe2, 0xea, 0x4e, 0x46, 0xe0, 0xeb, 0x09, 0xd3, 0xef, 0x68, 0x31, 0x61, 0xe0, 0x57, 0xe4, 0x6f, 0xc7, - 0x52, 0x4a, 0x2e, 0x9f, 0x88, 0xb8, 0x4f, 0x31, 0xbc, 0xf8, 0x39, 0xc0, 0xda, 0x84, 0x40, 0x29, 0x71, 0x11, 0x2e, - 0x88, 0xde, 0x14, 0xf2, 0xf6, 0x2e, 0x2e, 0xb0, 0x73, 0x00, 0x2c, 0x9d, 0x26, 0x01, 0xfe, 0xe5, 0x63, 0x3e, 0x56, - 0x63, 0x4e, 0x8d, 0xae, 0xdf, 0xfd, 0x4e, 0xae, 0x81, 0xde, 0x96, 0x8e, 0x82, 0xfd, 0xd6, 0x00, 0x72, 0xe1, 0x2e, - 0x0c, 0x2e, 0xbe, 0xc2, 0xda, 0xb2, 0x30, 0xde, 0x58, 0x00, 0xbd, 0xbf, 0x33, 0xb0, 0x60, 0xc3, 0x1c, 0x53, 0x78, - 0x2e, 0x75, 0xc2, 0x74, 0x10, 0x15, 0xe4, 0x49, 0xf9, 0x20, 0x66, 0xad, 0xf6, 0x5b, 0x36, 0x86, 0x3b, 0x8c, 0xe4, - 0xdb, 0x85, 0x13, 0x07, 0x1e, 0x90, 0x69, 0x32, 0xdb, 0xec, 0x1b, 0x1f, 0x79, 0xe4, 0xf5, 0x38, 0xde, 0xd5, 0x52, - 0x98, 0x6f, 0x56, 0x74, 0x8d, 0x21, 0x14, 0x45, 0xd8, 0xef, 0x17, 0x15, 0x53, 0x54, 0x19, 0xb4, 0x41, 0xc3, 0xf2, - 0x46, 0xfc, 0x02, 0x67, 0x0c, 0xad, 0x17, 0xb2, 0x77, 0x74, 0xd6, 0xe1, 0xcc, 0x61, 0xc6, 0x94, 0xc0, 0xa8, 0xb4, - 0x2c, 0xe8, 0x04, 0x1c, 0x9d, 0xab, 0x0f, 0xa2, 0xe2, 0xea, 0x58, 0x01, 0x78, 0x92, 0x29, 0xfc, 0x93, 0x6f, 0x82, - 0x75, 0xbf, 0x55, 0x33, 0x4c, 0xfd, 0x45, 0x6f, 0xbb, 0x96, 0x2f, 0x43, 0x1c, 0x69, 0x63, 0x08, 0xad, 0x73, 0x7b, - 0x07, 0x28, 0xe2, 0x82, 0x5e, 0xa4, 0x1a, 0x5f, 0xab, 0xc5, 0xd0, 0xac, 0xaf, 0x71, 0x1d, 0xd3, 0x06, 0x51, 0xac, - 0xbb, 0x26, 0xbe, 0xae, 0xde, 0x1f, 0x55, 0xa9, 0x82, 0x33, 0x48, 0x20, 0xac, 0xca, 0xcb, 0x86, 0x54, 0x92, 0x4b, - 0xd3, 0xa9, 0x34, 0x9d, 0x56, 0x08, 0xe5, 0xd2, 0x93, 0xf2, 0xfe, 0x15, 0x42, 0x18, 0x98, 0x32, 0x3b, 0xb0, 0x4a, - 0x6d, 0x61, 0x15, 0xbc, 0x7a, 0xb1, 0x81, 0x55, 0x12, 0x8e, 0xe7, 0x12, 0x8d, 0x8a, 0x0a, 0x87, 0x0c, 0xe9, 0x0b, - 0xb1, 0x08, 0x12, 0x00, 0x8b, 0xde, 0x65, 0x2e, 0xef, 0x7b, 0x38, 0x14, 0xf6, 0x24, 0x93, 0x70, 0xba, 0x09, 0xcd, - 0xe1, 0x61, 0x5a, 0xd5, 0xf3, 0x08, 0x01, 0x4b, 0xcf, 0x31, 0x3c, 0x48, 0xfc, 0xfd, 0x87, 0x50, 0x9d, 0x05, 0x79, - 0xfa, 0x2f, 0x51, 0x12, 0x1a, 0xfb, 0xcf, 0xf1, 0xd0, 0x21, 0x61, 0x38, 0xf0, 0xcd, 0x11, 0x56, 0x38, 0xb8, 0x55, - 0xc4, 0x67, 0x70, 0x87, 0x8f, 0x75, 0xe8, 0x01, 0x60, 0x09, 0xc5, 0x21, 0xc8, 0x37, 0x50, 0xcc, 0xe0, 0x80, 0x26, - 0xcb, 0xf0, 0x02, 0x17, 0xac, 0x16, 0xca, 0xfb, 0xdb, 0x96, 0x97, 0xd2, 0x6a, 0x97, 0xbc, 0xc6, 0x1c, 0xa8, 0xfc, - 0x0c, 0x2f, 0x7c, 0x85, 0x79, 0x29, 0xd9, 0x7d, 0xe1, 0x6b, 0x07, 0xf4, 0x14, 0x02, 0x46, 0xba, 0xdf, 0x6b, 0xc2, - 0x3d, 0x45, 0x2f, 0x73, 0x71, 0xd8, 0x76, 0xd0, 0xbd, 0xc0, 0x5c, 0x5d, 0x55, 0x59, 0x73, 0x30, 0x85, 0x06, 0x07, - 0x55, 0x38, 0x23, 0x30, 0x57, 0x2f, 0xca, 0x82, 0x73, 0x10, 0xef, 0x7b, 0xc2, 0xe4, 0x94, 0xd1, 0x00, 0x5e, 0x64, - 0xe5, 0xa3, 0x53, 0x3d, 0x0e, 0x2e, 0xe3, 0x86, 0x4d, 0x7c, 0x21, 0x7c, 0x2a, 0xb0, 0x92, 0xd6, 0x38, 0x34, 0xa2, - 0x23, 0x3a, 0x07, 0xb3, 0x0d, 0xa0, 0xe0, 0xee, 0x7c, 0xd8, 0x58, 0xa8, 0xe0, 0x31, 0xd8, 0xda, 0xdb, 0xcd, 0x84, - 0x38, 0x93, 0xa6, 0xe0, 0x6e, 0xdb, 0x20, 0x83, 0x37, 0xbf, 0xfd, 0xb7, 0xc2, 0x22, 0xc1, 0x80, 0x4a, 0x4d, 0x12, - 0x84, 0x27, 0x28, 0x8d, 0x74, 0x2b, 0x37, 0x13, 0x48, 0x27, 0xa2, 0x66, 0xd4, 0xbd, 0x71, 0xbe, 0x3a, 0x6a, 0x20, - 0x2a, 0x6a, 0xa0, 0x02, 0x6a, 0x20, 0xeb, 0xdb, 0xbf, 0x80, 0x85, 0xb0, 0x11, 0xaa, 0x44, 0x10, 0x10, 0x61, 0xae, - 0x0d, 0x1f, 0x50, 0x24, 0x21, 0xe4, 0x0d, 0xa0, 0x62, 0x4a, 0x5e, 0x82, 0xd1, 0x38, 0xbc, 0xde, 0x03, 0xee, 0x97, - 0x96, 0x61, 0xf0, 0x9c, 0x82, 0xc9, 0x7f, 0xeb, 0xf3, 0xa1, 0x7a, 0xb9, 0x3a, 0x08, 0xe1, 0x17, 0x10, 0x2b, 0xc2, - 0xf1, 0x17, 0xbf, 0x00, 0xd9, 0x54, 0x58, 0x1e, 0x1c, 0x48, 0x10, 0xf8, 0x21, 0x8a, 0x70, 0xc0, 0x33, 0xbc, 0xcc, - 0x36, 0x88, 0x9e, 0x9f, 0x95, 0xaa, 0x66, 0x25, 0x83, 0x59, 0x15, 0x9e, 0xc6, 0xd1, 0x35, 0x61, 0x20, 0xb8, 0x50, - 0xbb, 0x6f, 0x10, 0x02, 0x65, 0xcb, 0x8d, 0xa1, 0x4b, 0x4f, 0xc1, 0x7c, 0x34, 0x8e, 0xde, 0x32, 0x78, 0xd2, 0xd6, - 0x98, 0xfc, 0x33, 0x6d, 0x1e, 0xb8, 0x4f, 0xf7, 0xa2, 0x46, 0xe0, 0xa4, 0x4e, 0x51, 0xf2, 0xb7, 0xe4, 0x22, 0x8e, - 0x9a, 0x97, 0x11, 0x6a, 0xc0, 0xbf, 0x0d, 0x8e, 0xba, 0x34, 0xa1, 0xa3, 0x91, 0x0f, 0x7e, 0x93, 0x11, 0xb3, 0xc9, - 0x56, 0x2b, 0x51, 0x11, 0xf4, 0xc4, 0x6e, 0x30, 0x60, 0x25, 0x5e, 0x00, 0xfb, 0x60, 0x39, 0x58, 0xf2, 0x4e, 0xc4, - 0xca, 0x9f, 0x52, 0x18, 0xac, 0x9e, 0x33, 0x84, 0x70, 0x16, 0xc4, 0x6c, 0xfc, 0xcf, 0x67, 0x1a, 0xae, 0x9f, 0x9f, - 0xaf, 0x63, 0x44, 0xa4, 0x0f, 0x22, 0x57, 0x63, 0x47, 0x44, 0x10, 0xb6, 0x4c, 0xf7, 0x5d, 0x99, 0x1f, 0xbc, 0x75, - 0xf5, 0xc0, 0x86, 0x8b, 0x03, 0x03, 0x6a, 0x14, 0x18, 0xad, 0xe0, 0x9c, 0x94, 0x03, 0x07, 0x25, 0x84, 0x66, 0x45, - 0x3c, 0x25, 0x97, 0x10, 0x09, 0x2f, 0x43, 0x5d, 0x30, 0x2c, 0x08, 0x24, 0xa8, 0x29, 0x48, 0x50, 0x99, 0xaf, 0x3d, - 0x82, 0x59, 0xe7, 0x66, 0xb6, 0x53, 0xd4, 0x75, 0x41, 0x7e, 0x7e, 0xd1, 0xf1, 0x08, 0x58, 0xda, 0x83, 0x83, 0x02, - 0x22, 0x88, 0x01, 0x05, 0x2f, 0x25, 0xc0, 0x40, 0x03, 0x5e, 0x6c, 0x68, 0xc0, 0xe7, 0xda, 0x78, 0x1d, 0x18, 0x5b, - 0x9f, 0x32, 0xc8, 0xc5, 0xb3, 0x6a, 0x4f, 0x13, 0x42, 0xf6, 0x5b, 0x3d, 0x9d, 0x6e, 0x47, 0x48, 0xec, 0x7d, 0xd4, - 0x26, 0xd0, 0x98, 0x23, 0xdd, 0xd5, 0xc6, 0xfc, 0x5a, 0xd3, 0x23, 0x56, 0x93, 0x90, 0x2e, 0x48, 0x97, 0xe7, 0xd3, - 0x9e, 0xc1, 0x15, 0xab, 0x34, 0x72, 0x70, 0x01, 0xfa, 0x6c, 0x40, 0x80, 0x02, 0x95, 0xa6, 0x12, 0x45, 0x11, 0x17, - 0x49, 0xc9, 0x86, 0x61, 0x06, 0x61, 0x0a, 0xab, 0x95, 0xa0, 0x1b, 0x6b, 0x00, 0xbc, 0x33, 0xb3, 0x7f, 0x4a, 0x1f, - 0x6c, 0xba, 0xf6, 0xe6, 0x11, 0x40, 0x40, 0xf6, 0xdb, 0x25, 0xbb, 0x2e, 0x36, 0x2a, 0xb3, 0xb0, 0x96, 0xb1, 0x95, - 0xdb, 0xf6, 0x18, 0x7b, 0x27, 0xb6, 0xf9, 0x04, 0x08, 0x51, 0x5b, 0x32, 0x8d, 0x10, 0x21, 0xb1, 0x88, 0x75, 0x6d, - 0xc8, 0x46, 0x1b, 0xda, 0x37, 0x4f, 0xc2, 0x43, 0xec, 0x03, 0x50, 0xbc, 0x39, 0x2e, 0xc1, 0x21, 0xbc, 0xf0, 0x08, - 0x7f, 0x0b, 0x2c, 0x52, 0x81, 0x19, 0x96, 0xab, 0x15, 0xd4, 0xf3, 0x78, 0x9f, 0x6d, 0x06, 0x27, 0x95, 0x1b, 0x63, - 0x97, 0x76, 0xe2, 0x71, 0xd9, 0x84, 0xc4, 0x19, 0xf4, 0xeb, 0x2b, 0xa2, 0xde, 0x7e, 0x3b, 0x7d, 0xe2, 0xdf, 0x2b, - 0x73, 0x3b, 0x10, 0x1b, 0xd6, 0x1b, 0xac, 0x3e, 0x80, 0x96, 0xbf, 0xca, 0xfc, 0x43, 0x65, 0xc1, 0x4d, 0x82, 0xda, - 0x5c, 0xc4, 0x2e, 0xeb, 0x22, 0x46, 0x6a, 0x8b, 0xbb, 0x43, 0x88, 0x7f, 0xb5, 0x15, 0xc5, 0x80, 0x27, 0x15, 0xff, - 0x1c, 0xa3, 0x2e, 0x84, 0xa2, 0xb6, 0x1e, 0x36, 0x40, 0x69, 0x97, 0xeb, 0x4a, 0x8c, 0x0c, 0x09, 0xe4, 0x5b, 0x17, - 0x5e, 0xd0, 0x9c, 0x44, 0x0a, 0xe4, 0xe4, 0x20, 0x2a, 0x69, 0xb6, 0x21, 0xcc, 0x75, 0xb7, 0x70, 0xcc, 0x5c, 0x6d, - 0xd0, 0x22, 0x7e, 0x01, 0xec, 0x0c, 0x37, 0x92, 0xa5, 0x03, 0x9f, 0xaa, 0x81, 0xcf, 0xaf, 0xb9, 0xa1, 0x28, 0x0a, - 0xf5, 0xde, 0xd9, 0x47, 0xe6, 0xe0, 0x77, 0x1a, 0x88, 0x8f, 0xd4, 0xe9, 0x48, 0x36, 0x42, 0xad, 0x39, 0x3b, 0x5e, - 0xb6, 0x19, 0x61, 0x50, 0xd8, 0xe8, 0x7d, 0x15, 0xb2, 0x8a, 0x9d, 0x9d, 0x8a, 0x60, 0x4e, 0x5f, 0x54, 0xe5, 0x9c, - 0xca, 0x2d, 0xa3, 0x5a, 0x6a, 0x1a, 0x20, 0xc2, 0x95, 0x4f, 0x24, 0xef, 0x33, 0x13, 0xfe, 0xc1, 0x60, 0x5c, 0x3d, - 0x52, 0xf8, 0xfb, 0x5d, 0xb1, 0x43, 0xb6, 0xa3, 0xc3, 0x6d, 0x04, 0xcd, 0x0b, 0x15, 0x3c, 0xe0, 0xa8, 0x64, 0x09, - 0x91, 0x22, 0x97, 0xfb, 0xaa, 0x66, 0xca, 0x76, 0x1d, 0x21, 0x84, 0xb4, 0xc7, 0x59, 0x37, 0xb4, 0x7a, 0xe8, 0x91, - 0x2a, 0xca, 0xe1, 0x16, 0xcd, 0x75, 0x01, 0x2a, 0x8c, 0x40, 0xba, 0xfc, 0xcc, 0xee, 0x52, 0x09, 0xd1, 0xcb, 0xd7, - 0x2e, 0x84, 0xb1, 0xb3, 0xb2, 0xc4, 0x85, 0x19, 0xb5, 0x0d, 0xa3, 0xeb, 0x36, 0x86, 0xb3, 0x81, 0x31, 0xd3, 0xa0, - 0xa4, 0x05, 0xa1, 0xae, 0xbb, 0xf4, 0x22, 0x33, 0x81, 0x1e, 0x73, 0x42, 0x1b, 0x0c, 0x4f, 0x89, 0x06, 0xcb, 0xa6, - 0x02, 0x2c, 0xf8, 0x96, 0x45, 0x6a, 0x6d, 0x36, 0x59, 0xfc, 0x51, 0xc7, 0xe6, 0x69, 0xbf, 0xbc, 0x62, 0x9e, 0x0b, - 0x47, 0xdd, 0x9e, 0x67, 0x3e, 0x1e, 0xdd, 0xd3, 0x37, 0x57, 0x2f, 0x5e, 0xbe, 0x7e, 0xb5, 0x5a, 0xb5, 0x59, 0xb3, - 0x7d, 0x82, 0x7f, 0xd2, 0x65, 0x3c, 0xd8, 0x32, 0x0a, 0xd0, 0xc1, 0xc1, 0x3e, 0x37, 0x2e, 0x3c, 0x9f, 0xf9, 0x1c, - 0xe2, 0x06, 0xe9, 0x01, 0xce, 0x8a, 0x32, 0x26, 0xc8, 0x6d, 0xd4, 0x8b, 0xee, 0x22, 0x50, 0x42, 0x55, 0xe4, 0xef, - 0xc3, 0xe6, 0xec, 0xf7, 0x20, 0x30, 0x11, 0xd4, 0x87, 0x08, 0x20, 0x10, 0xaf, 0x14, 0x17, 0x84, 0xf9, 0x04, 0x88, - 0xe2, 0xbd, 0x00, 0xce, 0xd4, 0x44, 0xad, 0x5a, 0xa8, 0xb8, 0x00, 0x92, 0x68, 0xc3, 0x51, 0xd2, 0x23, 0x13, 0xc0, - 0x1b, 0x82, 0x52, 0xda, 0x5f, 0xdd, 0xdc, 0xb9, 0x4b, 0xe5, 0xa8, 0xd7, 0x4a, 0x73, 0x3c, 0x75, 0x9f, 0x53, 0xf8, - 0x9c, 0x76, 0xfd, 0xe9, 0x20, 0x0e, 0x73, 0xbc, 0x20, 0xe2, 0xd0, 0x3f, 0x8b, 0xb8, 0x9c, 0x17, 0xec, 0x0b, 0x97, - 0x0b, 0x95, 0x2e, 0x6f, 0x53, 0x99, 0xdc, 0x36, 0x47, 0x87, 0x71, 0x91, 0xdc, 0x36, 0x55, 0x72, 0x8b, 0xf0, 0x5d, - 0x2a, 0x93, 0x3b, 0x9b, 0x72, 0xd7, 0x54, 0x70, 0xf3, 0x85, 0x05, 0x1c, 0x8a, 0xb6, 0x68, 0x63, 0xb1, 0x59, 0xd4, - 0xa6, 0xb8, 0xa2, 0x01, 0x06, 0xff, 0xbe, 0x63, 0xe3, 0x87, 0xe1, 0x4b, 0x70, 0x69, 0xd2, 0x44, 0x7e, 0x02, 0xe9, - 0xa7, 0x55, 0x19, 0xb8, 0x4f, 0x49, 0xab, 0x3b, 0xbd, 0x10, 0xcd, 0x76, 0xb7, 0xd1, 0x98, 0xc2, 0xde, 0xcd, 0x48, - 0xee, 0x8b, 0x4d, 0x1b, 0x26, 0xbe, 0xce, 0x7e, 0xb6, 0x5a, 0xed, 0xe7, 0xc8, 0x6c, 0xb8, 0x09, 0x8b, 0x75, 0x7f, - 0x3a, 0xc0, 0x2d, 0xfc, 0x3c, 0x43, 0x68, 0xc9, 0xfa, 0xd3, 0x01, 0x61, 0xfd, 0x69, 0xa3, 0x3d, 0xb0, 0x86, 0x76, - 0x66, 0x2b, 0xae, 0x21, 0x84, 0xe6, 0x74, 0x70, 0x64, 0x4a, 0x4a, 0x97, 0x6f, 0xbf, 0x68, 0x15, 0xd0, 0x4f, 0xd5, - 0x82, 0x97, 0x49, 0xdc, 0x81, 0xbe, 0xe8, 0x85, 0x7d, 0xba, 0xb5, 0x20, 0xc7, 0x47, 0x95, 0xab, 0x3d, 0x45, 0xd8, - 0xf4, 0xa4, 0x0e, 0x8b, 0x43, 0xd3, 0x8c, 0xeb, 0x52, 0xba, 0xef, 0x50, 0x33, 0xf2, 0xd1, 0xc1, 0x02, 0x10, 0xa4, - 0x82, 0x47, 0x56, 0xb8, 0x70, 0x4a, 0x21, 0x5c, 0x1c, 0x54, 0xb6, 0x60, 0x92, 0x93, 0x56, 0x37, 0x37, 0x96, 0xfe, - 0xb9, 0x8b, 0x68, 0x4a, 0x31, 0x25, 0x99, 0x2f, 0x99, 0x1b, 0xb0, 0xd0, 0x4d, 0xca, 0x33, 0x05, 0xbd, 0xd2, 0x00, - 0x8f, 0x08, 0xc4, 0x43, 0xea, 0x16, 0xc6, 0xc0, 0x2b, 0x9e, 0x36, 0x8b, 0x3e, 0x1b, 0xa0, 0xa3, 0x63, 0x4c, 0xfb, - 0x7f, 0x65, 0xf3, 0x36, 0x3c, 0x16, 0xf8, 0xd7, 0x80, 0x4c, 0x9b, 0xb2, 0x4c, 0x10, 0x90, 0x30, 0x6a, 0xca, 0x43, - 0xd8, 0x4b, 0x08, 0x67, 0xb6, 0x62, 0xd6, 0x67, 0x83, 0xe6, 0xb4, 0xac, 0xd8, 0xf1, 0x15, 0x1b, 0xb2, 0x4c, 0xb0, - 0x15, 0x1b, 0xae, 0x62, 0xf8, 0x3a, 0x83, 0x01, 0x41, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x28, 0x88, 0xe6, 0x8b, 0x15, - 0xf1, 0x9b, 0xdd, 0xde, 0xe3, 0xb7, 0xc0, 0x02, 0xad, 0xb6, 0xff, 0x77, 0xa1, 0x0c, 0xd8, 0x53, 0x16, 0x26, 0x66, - 0x6e, 0x61, 0x55, 0x74, 0x00, 0x95, 0x12, 0x61, 0x0a, 0x03, 0x99, 0xfd, 0xcc, 0x40, 0x2d, 0xd0, 0x1a, 0xe4, 0x7d, - 0x3d, 0x68, 0x66, 0x70, 0xc4, 0xc0, 0x3b, 0x34, 0x64, 0x6a, 0x8c, 0x09, 0xe3, 0x1c, 0xa6, 0x98, 0x19, 0xf0, 0x4c, - 0xd3, 0xd6, 0x5a, 0x1a, 0x59, 0xae, 0x97, 0xf7, 0xfe, 0xd1, 0xb1, 0xea, 0x17, 0xcd, 0xf6, 0x00, 0xed, 0x13, 0x62, - 0x3f, 0x06, 0xb0, 0xc9, 0x5c, 0x6a, 0xc3, 0x7c, 0x1f, 0x75, 0x52, 0xfb, 0x09, 0x7f, 0x06, 0x6b, 0xb3, 0x03, 0x40, - 0x47, 0x86, 0xcd, 0xfa, 0xcb, 0x9a, 0xca, 0xeb, 0xe3, 0xce, 0x28, 0x95, 0xbb, 0xde, 0x9d, 0x0e, 0x34, 0xc5, 0xa1, - 0xb7, 0x1e, 0x2e, 0x1f, 0xea, 0x21, 0x60, 0xc6, 0x60, 0x6e, 0x99, 0xd1, 0xf7, 0x42, 0x24, 0x17, 0x44, 0x62, 0x69, - 0xb0, 0x86, 0xc1, 0xde, 0x3a, 0x38, 0x30, 0xd5, 0x58, 0x03, 0x9e, 0x27, 0x45, 0x20, 0x18, 0xf8, 0x08, 0xca, 0x80, - 0x26, 0xca, 0xdc, 0x86, 0x93, 0x8f, 0xcc, 0xfd, 0xc2, 0xe5, 0xed, 0x63, 0xe1, 0xb4, 0xad, 0xe6, 0x7a, 0xbc, 0x2c, - 0x70, 0x57, 0xde, 0x4b, 0x5a, 0x05, 0x37, 0xb2, 0x37, 0x79, 0xca, 0xdc, 0xad, 0xfb, 0x52, 0x9d, 0xdd, 0xcd, 0x74, - 0xca, 0x66, 0x3a, 0xdb, 0xcd, 0x84, 0x9a, 0x99, 0x6f, 0x59, 0x45, 0x9a, 0x93, 0x35, 0x51, 0x73, 0x2a, 0x7e, 0xa2, - 0x73, 0xd0, 0x8e, 0x72, 0x7b, 0xaf, 0x0a, 0x27, 0x57, 0x4e, 0x2e, 0xf7, 0x73, 0x43, 0x5c, 0x91, 0xb9, 0x50, 0x87, - 0x00, 0x2f, 0x2f, 0xca, 0xc7, 0x07, 0xb8, 0x14, 0xbf, 0xca, 0x91, 0x8b, 0x72, 0x2a, 0xa4, 0x96, 0x82, 0x45, 0xc8, - 0xa0, 0xaa, 0x8b, 0x81, 0xbd, 0xb4, 0x7b, 0x4f, 0xf4, 0x78, 0xbf, 0x8a, 0x98, 0x37, 0x30, 0xcf, 0x7d, 0x7c, 0x4f, - 0x53, 0xec, 0xd4, 0xc4, 0x19, 0xf9, 0x90, 0xc5, 0x39, 0xc8, 0x66, 0xfd, 0xea, 0xb5, 0xdf, 0x46, 0x1b, 0x17, 0xcd, - 0x58, 0xf4, 0xcc, 0x13, 0x27, 0x3f, 0x14, 0xc6, 0x38, 0xc0, 0x3a, 0xfa, 0x23, 0x4c, 0x2d, 0xd8, 0xb3, 0xc4, 0x53, - 0xe8, 0xe4, 0xd6, 0xa6, 0xdd, 0x85, 0x69, 0x77, 0x26, 0xad, 0x03, 0xe5, 0x80, 0x34, 0xbb, 0x32, 0x9d, 0x3b, 0xff, - 0x7d, 0x07, 0x2f, 0xdd, 0xae, 0x21, 0x12, 0xf7, 0xfc, 0x91, 0x31, 0x86, 0x78, 0x03, 0x36, 0xa2, 0xea, 0xe0, 0xe0, - 0x0f, 0xe7, 0x7d, 0x5b, 0xc9, 0x7d, 0xdf, 0x0a, 0x07, 0xb6, 0xc1, 0x54, 0xba, 0xbc, 0x91, 0xcc, 0x16, 0x60, 0xd7, - 0xb9, 0xff, 0x8d, 0x78, 0xf8, 0x22, 0x64, 0x5a, 0xac, 0xab, 0xf8, 0x2b, 0x39, 0x2a, 0x3d, 0x44, 0x35, 0x44, 0x20, - 0xad, 0xac, 0x4b, 0x43, 0xd3, 0xd1, 0xab, 0x29, 0x1d, 0xc9, 0x9b, 0xb7, 0x52, 0xea, 0x81, 0x7d, 0x91, 0x5b, 0x27, - 0xf0, 0x68, 0x61, 0x8d, 0xa1, 0xb9, 0x2b, 0xbd, 0x93, 0x6c, 0x40, 0xd4, 0xfa, 0xb8, 0x43, 0x49, 0x24, 0x16, 0xd5, - 0x5d, 0x08, 0x87, 0xbb, 0x10, 0xcc, 0xcb, 0xa0, 0x6d, 0x10, 0xbb, 0xdd, 0x05, 0x6d, 0x03, 0xa7, 0x6e, 0x1b, 0xb8, - 0x3d, 0x18, 0x2c, 0xec, 0x7d, 0x78, 0x39, 0x96, 0x63, 0xe1, 0xaf, 0xc9, 0xec, 0x03, 0x40, 0xa0, 0xf6, 0x61, 0xc5, - 0x13, 0x07, 0x82, 0xc4, 0x19, 0x8e, 0xbe, 0xe7, 0xec, 0xc6, 0x5a, 0x0e, 0xcf, 0xe6, 0x0b, 0xcd, 0x46, 0xe6, 0x8e, - 0x1a, 0x54, 0x7c, 0x75, 0x3f, 0xaf, 0x9f, 0xb2, 0x9a, 0x6e, 0xfc, 0x1e, 0x84, 0x91, 0x70, 0xca, 0x0e, 0xa3, 0x90, - 0xb0, 0xc1, 0xac, 0xca, 0x78, 0x6d, 0xbf, 0x41, 0xbc, 0x07, 0x6d, 0xc2, 0x09, 0x16, 0xb5, 0x0b, 0xaa, 0x08, 0xdb, - 0x78, 0x63, 0x41, 0x94, 0x87, 0x37, 0x5b, 0x46, 0xd3, 0xcb, 0x35, 0x04, 0x3a, 0xee, 0x45, 0xcd, 0xa8, 0xc1, 0x52, - 0x17, 0x94, 0xd9, 0x47, 0x18, 0x57, 0x17, 0x27, 0x26, 0x4e, 0x7b, 0xa9, 0x57, 0xff, 0x2d, 0x03, 0x03, 0x7c, 0x01, - 0x5e, 0x62, 0x61, 0x74, 0xd7, 0xbe, 0x6e, 0x40, 0x7d, 0xd9, 0x60, 0x03, 0xb4, 0x5a, 0xb5, 0xca, 0x67, 0xa0, 0xdc, - 0x35, 0x97, 0xb0, 0xd7, 0x5c, 0xc2, 0x5d, 0x73, 0x09, 0x7f, 0xcd, 0x25, 0xcc, 0x35, 0x97, 0xf0, 0xd7, 0x5c, 0x1e, - 0x84, 0x9f, 0x82, 0x38, 0x8e, 0x31, 0x87, 0xb8, 0x8a, 0xda, 0x46, 0xc6, 0x83, 0x0b, 0xcf, 0x7d, 0x96, 0xa8, 0x72, - 0xf9, 0xc3, 0x18, 0x72, 0x5b, 0xb6, 0x12, 0xc6, 0x6d, 0x8a, 0x29, 0x88, 0x9c, 0x7e, 0x70, 0x50, 0xba, 0x3b, 0x83, - 0x8f, 0x7a, 0xca, 0xf1, 0xd2, 0x3a, 0xd1, 0xfe, 0x01, 0x3a, 0x79, 0xf3, 0xeb, 0x63, 0x2a, 0xd7, 0x44, 0x38, 0x93, - 0xfb, 0xfd, 0xb6, 0xa7, 0x14, 0x9f, 0x32, 0x13, 0x9e, 0x9c, 0x27, 0xda, 0x88, 0x20, 0x08, 0x51, 0xa2, 0x70, 0x46, - 0xa4, 0xdd, 0xef, 0xde, 0x15, 0xde, 0xa8, 0xa2, 0xbc, 0x59, 0xc9, 0xe3, 0x1c, 0x9c, 0xd8, 0x8d, 0x15, 0x06, 0xea, - 0x82, 0x0b, 0x41, 0x66, 0x12, 0xfe, 0x68, 0xe6, 0x96, 0x9c, 0x65, 0x65, 0xd2, 0xc7, 0x66, 0x6e, 0x08, 0x58, 0x41, - 0xf6, 0x3d, 0xcc, 0x96, 0xb7, 0x29, 0xc5, 0x77, 0x69, 0x86, 0x87, 0xf2, 0x36, 0x2d, 0x42, 0x5b, 0x10, 0x7f, 0xf1, - 0x37, 0x8e, 0x23, 0x41, 0xc1, 0xdf, 0x27, 0xe2, 0x62, 0x8f, 0x6f, 0x78, 0x01, 0x2e, 0x33, 0x63, 0x51, 0x9d, 0x32, - 0xfc, 0x0d, 0x4b, 0x78, 0x08, 0x4e, 0xa6, 0xb1, 0x22, 0xf7, 0x38, 0xb0, 0x13, 0x92, 0x80, 0xc3, 0xd5, 0xed, 0x15, - 0xff, 0x0a, 0x17, 0x5f, 0xa5, 0xb3, 0x65, 0x73, 0x28, 0x6f, 0x23, 0x5c, 0x90, 0x37, 0xf0, 0xfa, 0xd6, 0xff, 0xcb, - 0xde, 0xdb, 0x36, 0xb7, 0x6d, 0x64, 0xeb, 0xa2, 0x7f, 0x45, 0x62, 0xd9, 0x0c, 0x60, 0x36, 0x29, 0xca, 0xe7, 0xcc, - 0x54, 0x5d, 0x50, 0x6d, 0x96, 0x63, 0xc7, 0x13, 0x67, 0x22, 0xdb, 0x63, 0x79, 0x32, 0xc9, 0xb0, 0x78, 0x19, 0x08, - 0x68, 0x0a, 0x70, 0x40, 0x80, 0x01, 0x40, 0x89, 0x34, 0x89, 0xff, 0x7e, 0x6a, 0xad, 0xd5, 0xaf, 0x20, 0x28, 0x7b, - 0xf6, 0x3e, 0xfb, 0xd3, 0xbd, 0x5f, 0x6c, 0xb1, 0xd1, 0x68, 0xf4, 0x7b, 0xaf, 0x5e, 0x2f, 0xcf, 0xd3, 0x93, 0xb1, - 0xba, 0x3d, 0x70, 0xd6, 0xa5, 0x14, 0x1d, 0x6f, 0x8a, 0xc3, 0xdb, 0xf3, 0xd9, 0x7e, 0x1b, 0x44, 0x6c, 0x17, 0x64, - 0x58, 0xeb, 0xa4, 0xe1, 0x3f, 0xd1, 0xd6, 0xc1, 0x62, 0x84, 0xfd, 0x5f, 0xd6, 0x03, 0x2f, 0x21, 0x35, 0x14, 0xb8, - 0x18, 0x6c, 0x38, 0x5a, 0xdb, 0x65, 0x1a, 0xb8, 0xa9, 0x41, 0xaf, 0xef, 0x29, 0x44, 0x79, 0xc9, 0x68, 0x6e, 0x04, - 0xeb, 0xc6, 0x90, 0x8b, 0xc3, 0x71, 0xb3, 0x1c, 0xf2, 0x92, 0xa6, 0xd3, 0x20, 0x94, 0xee, 0x2c, 0x6b, 0x48, 0xa2, - 0xec, 0x83, 0x50, 0xbb, 0xb6, 0xec, 0xb7, 0x81, 0xed, 0xcb, 0x1f, 0x0d, 0x63, 0xff, 0x62, 0xf9, 0x4c, 0x48, 0x17, - 0xf1, 0x1c, 0x04, 0x51, 0xfb, 0x79, 0x36, 0xdc, 0xf8, 0x17, 0xeb, 0x67, 0x42, 0xf9, 0x8d, 0xe7, 0xb6, 0x1c, 0x52, - 0x67, 0x2d, 0x7c, 0x61, 0x3c, 0x3c, 0xb8, 0x32, 0xb4, 0x1d, 0x0e, 0x42, 0xff, 0x6d, 0xd6, 0x08, 0x6e, 0x6c, 0x68, - 0x9f, 0x2f, 0x7c, 0xd8, 0xda, 0x68, 0xac, 0x29, 0xa6, 0x5b, 0xe8, 0xdf, 0x64, 0xb6, 0xb4, 0xa7, 0x51, 0xc9, 0x8b, - 0x53, 0xd3, 0x88, 0x85, 0x30, 0x60, 0xe8, 0x27, 0xf3, 0x01, 0x54, 0x73, 0xc7, 0x23, 0x90, 0xc9, 0x07, 0x7a, 0xb0, - 0x26, 0xb5, 0xea, 0xaf, 0x61, 0x26, 0xff, 0x8f, 0x54, 0x58, 0x8c, 0xee, 0xb6, 0x61, 0xa6, 0xfe, 0x88, 0xe4, 0x1f, - 0x2c, 0xe7, 0xbb, 0xd4, 0x0b, 0xb5, 0x1f, 0x0b, 0x2b, 0x30, 0x28, 0x51, 0x35, 0xa0, 0x07, 0x22, 0xa8, 0xca, 0x20, - 0xcd, 0xb0, 0x3a, 0x07, 0xfd, 0xee, 0x69, 0xd5, 0x91, 0x1c, 0xd2, 0x5a, 0x0d, 0xa9, 0x60, 0xaa, 0xd4, 0x20, 0x3f, - 0x1c, 0xee, 0x52, 0xa6, 0xcb, 0x80, 0x4b, 0xfa, 0x5d, 0xaa, 0x94, 0xc2, 0x7f, 0x22, 0x00, 0x9d, 0x83, 0x7b, 0x7c, - 0x39, 0x06, 0xd2, 0x0c, 0x0b, 0xbf, 0x35, 0x3b, 0xbe, 0x26, 0xe1, 0x36, 0x09, 0x2e, 0x06, 0x38, 0x47, 0x57, 0x61, - 0x79, 0x97, 0x42, 0x04, 0x55, 0x09, 0xf5, 0xad, 0x4c, 0x83, 0xd2, 0x56, 0x83, 0xb0, 0x26, 0xa1, 0xce, 0x24, 0x1b, - 0x95, 0xb6, 0x1b, 0x85, 0xd9, 0x22, 0xae, 0x67, 0x84, 0x35, 0x67, 0x33, 0xd5, 0xc0, 0xa4, 0xe1, 0xb8, 0x69, 0xb4, - 0x16, 0x15, 0x6a, 0x0a, 0xf3, 0x1a, 0x57, 0x95, 0xaa, 0xee, 0xe6, 0xd4, 0x52, 0x5a, 0xb6, 0x57, 0xdd, 0x24, 0x1b, - 0x72, 0x19, 0xca, 0x30, 0xd8, 0xc8, 0x11, 0x4c, 0x20, 0x49, 0xce, 0xfc, 0x8d, 0xfc, 0x43, 0x6d, 0xba, 0x16, 0x30, - 0xc7, 0x98, 0x65, 0xc3, 0x82, 0x5e, 0x81, 0x7b, 0xa0, 0x95, 0x9e, 0x4f, 0xb3, 0x8b, 0x3c, 0x48, 0x86, 0x85, 0x5e, - 0x36, 0x19, 0xff, 0x53, 0x18, 0x69, 0x32, 0x63, 0x25, 0x8b, 0x6c, 0x57, 0xa7, 0xc4, 0x79, 0x9c, 0xc0, 0xf6, 0x68, - 0x7a, 0xcb, 0xf7, 0x19, 0x44, 0x05, 0x81, 0x82, 0x19, 0xf3, 0x65, 0x17, 0xcf, 0x7d, 0x9f, 0x59, 0xa6, 0xee, 0xc3, - 0xc1, 0x98, 0xb1, 0xfd, 0x7e, 0x3f, 0xef, 0xf7, 0xd5, 0x7c, 0xeb, 0xf7, 0x93, 0x17, 0xe6, 0x6f, 0x0f, 0x18, 0x14, - 0xe4, 0x44, 0x34, 0x15, 0x22, 0xf8, 0x87, 0xe4, 0x19, 0x92, 0xd1, 0x1d, 0xf7, 0xb9, 0xe5, 0x6c, 0x59, 0x1d, 0x81, - 0x60, 0x1e, 0x0e, 0x97, 0x0a, 0xec, 0x5a, 0xa2, 0x48, 0xc8, 0xf2, 0x9f, 0x81, 0xf1, 0xcc, 0x7d, 0x80, 0x25, 0x03, - 0x10, 0xb6, 0xca, 0xd3, 0xf5, 0x9e, 0xaf, 0x82, 0x77, 0x3a, 0xde, 0x35, 0x56, 0x64, 0x20, 0x6e, 0x81, 0x8d, 0x58, - 0x6b, 0x0f, 0xc8, 0x99, 0x02, 0x1c, 0x2f, 0x0e, 0x87, 0x73, 0xf9, 0x4b, 0x37, 0x5b, 0x27, 0x50, 0x29, 0x70, 0x7b, - 0x74, 0x72, 0xf0, 0xdf, 0x81, 0x66, 0x50, 0x0e, 0xf3, 0x7a, 0xfb, 0x3b, 0x73, 0xf2, 0xd3, 0x53, 0xfc, 0x13, 0x1e, - 0xa2, 0xd3, 0x6f, 0xf7, 0xe6, 0x0f, 0x8a, 0xca, 0xc3, 0x41, 0x2d, 0xfe, 0x73, 0xce, 0x2b, 0xf8, 0x85, 0x6f, 0x02, - 0xb3, 0xc9, 0xd4, 0x3b, 0xf9, 0x26, 0xcf, 0x99, 0x7a, 0x8d, 0x57, 0x4c, 0xbe, 0xc3, 0xe1, 0x5c, 0x8c, 0xea, 0xed, - 0xc8, 0x89, 0x76, 0xca, 0x31, 0x0e, 0x06, 0xff, 0x45, 0xb4, 0x4d, 0x08, 0x30, 0xa4, 0x6e, 0x49, 0x33, 0x1b, 0x57, - 0x96, 0x78, 0x96, 0xce, 0x2f, 0x27, 0x75, 0xb9, 0xd3, 0x8a, 0xa7, 0x3d, 0xb0, 0xb8, 0xad, 0xc1, 0x0b, 0xe0, 0xde, - 0x62, 0xeb, 0x4a, 0xc1, 0xe1, 0x02, 0xe2, 0x14, 0x27, 0x20, 0x82, 0xf6, 0xfb, 0x12, 0xef, 0x15, 0xf4, 0x49, 0x3f, - 0x40, 0x30, 0xe4, 0xcf, 0x12, 0x70, 0xd7, 0xeb, 0xd5, 0x18, 0xdf, 0x4b, 0x21, 0xb8, 0x3e, 0xd3, 0x00, 0xb4, 0xe0, - 0x77, 0xf9, 0x58, 0x4e, 0xbf, 0x89, 0xc0, 0xb3, 0x65, 0x6f, 0xa2, 0xdc, 0x6d, 0x78, 0xda, 0x3f, 0x5a, 0x08, 0xc0, - 0x52, 0x3c, 0x53, 0x82, 0x05, 0x39, 0xc5, 0x5c, 0xfc, 0xbf, 0xe0, 0x23, 0xe6, 0x7b, 0xd2, 0x45, 0x6c, 0xbd, 0x7d, - 0x72, 0x61, 0x20, 0x81, 0xa6, 0x03, 0xf0, 0xe3, 0x55, 0x40, 0x57, 0xc6, 0xcf, 0xcf, 0xb2, 0x1e, 0xeb, 0xe3, 0x3f, - 0x05, 0xf7, 0xe9, 0x67, 0x0a, 0x1f, 0x1d, 0x8e, 0xab, 0x74, 0xb4, 0xa3, 0x14, 0x44, 0x47, 0xb7, 0xcf, 0xa7, 0x3c, - 0xfb, 0xa6, 0x02, 0x72, 0xcb, 0x51, 0x7b, 0x2a, 0x00, 0x8b, 0x2d, 0x1d, 0x81, 0x4f, 0xb3, 0x7c, 0x42, 0xbe, 0xd7, - 0x53, 0x71, 0x75, 0xa9, 0xd3, 0xc5, 0x8b, 0xf1, 0x14, 0xfe, 0x07, 0x62, 0x0f, 0xcb, 0x14, 0xd9, 0xb1, 0xeb, 0xe2, - 0x07, 0xf1, 0xb6, 0xb6, 0xa3, 0x3f, 0x76, 0x10, 0xe9, 0xb8, 0x27, 0x17, 0xea, 0x4b, 0x48, 0x25, 0x17, 0xea, 0x06, - 0x62, 0x17, 0x6a, 0xbc, 0xe3, 0x22, 0xd6, 0xfa, 0x75, 0x8d, 0x82, 0x95, 0x80, 0x33, 0xed, 0x1a, 0x0c, 0x36, 0xb0, - 0x6e, 0x59, 0x06, 0x7f, 0xc3, 0x35, 0x4d, 0xe0, 0x86, 0x45, 0xd6, 0x7b, 0x83, 0xad, 0x74, 0x0d, 0x8e, 0x96, 0x89, - 0x73, 0x29, 0xc9, 0xca, 0x16, 0x19, 0x57, 0x8f, 0x42, 0xaa, 0xa6, 0xfb, 0x5b, 0x51, 0x3f, 0x08, 0x91, 0x07, 0xab, - 0x94, 0x45, 0xc5, 0x0a, 0x64, 0xf6, 0xe0, 0x1f, 0x21, 0x23, 0x47, 0x39, 0x70, 0x14, 0xfa, 0x5b, 0x13, 0xe8, 0x3c, - 0x3f, 0x85, 0x3a, 0x8f, 0x04, 0x5b, 0xa9, 0x87, 0xc2, 0xca, 0x0b, 0x88, 0x0e, 0xb6, 0x30, 0x56, 0x79, 0x12, 0x2a, - 0x36, 0x65, 0x22, 0x8f, 0x83, 0x5a, 0x02, 0xc6, 0x0a, 0x82, 0x39, 0xcb, 0xa5, 0x0b, 0x52, 0xd5, 0xe8, 0x61, 0x91, - 0xb9, 0x9f, 0x0a, 0xca, 0xff, 0x54, 0xe5, 0x84, 0xeb, 0xcb, 0x10, 0xe0, 0x68, 0x9f, 0x82, 0x28, 0x31, 0xd6, 0x2f, - 0x5a, 0xbc, 0x93, 0x99, 0xb3, 0xa9, 0xed, 0x25, 0xc8, 0xd8, 0x0e, 0xbf, 0x42, 0x68, 0xb5, 0x50, 0x64, 0xd1, 0x70, - 0xc1, 0x74, 0x7b, 0x4a, 0xab, 0xee, 0x61, 0xc3, 0xb3, 0xd2, 0x43, 0xa5, 0xbe, 0x8d, 0x09, 0x2c, 0xab, 0x94, 0xe1, - 0xdb, 0x09, 0x55, 0x27, 0x06, 0x15, 0xeb, 0x86, 0x2d, 0xe1, 0x10, 0x8b, 0x49, 0x63, 0x9d, 0x0d, 0x78, 0xc4, 0x12, - 0xf8, 0x67, 0xc3, 0xc7, 0x6c, 0xc9, 0xa3, 0xc9, 0xe6, 0x6a, 0xd9, 0xef, 0x97, 0x5e, 0xe8, 0xd5, 0xb3, 0xec, 0x69, - 0x34, 0x9f, 0xe5, 0x73, 0x1f, 0x15, 0x17, 0x93, 0xc1, 0x60, 0xe3, 0x67, 0xc3, 0x21, 0x4b, 0x86, 0xc3, 0x49, 0xf6, - 0x14, 0x5e, 0x7b, 0xca, 0x23, 0xb5, 0xa4, 0x92, 0xab, 0x0c, 0xf6, 0xf7, 0x01, 0x8f, 0x7c, 0xd6, 0xf9, 0x69, 0xd9, - 0x74, 0xe9, 0x7e, 0x66, 0xc7, 0x5d, 0xe8, 0x0e, 0xb0, 0xf1, 0xb6, 0x41, 0x47, 0xfe, 0xf5, 0x0e, 0x29, 0x75, 0x93, - 0x01, 0xd8, 0x8d, 0x06, 0x38, 0x64, 0xaa, 0x97, 0x22, 0xab, 0x97, 0x32, 0xd5, 0x4b, 0xb2, 0x72, 0x09, 0x16, 0x12, - 0x53, 0xe5, 0x36, 0xb2, 0x72, 0xcb, 0x86, 0xeb, 0xe1, 0x60, 0x6b, 0xc5, 0x65, 0x73, 0x07, 0xf7, 0x85, 0x15, 0x05, - 0xfe, 0xdf, 0xb2, 0x05, 0xbb, 0x97, 0xc7, 0xc0, 0x35, 0x3a, 0x26, 0xc1, 0x05, 0xe2, 0x9e, 0xdd, 0x82, 0x1d, 0x16, - 0xfe, 0x82, 0xeb, 0xe4, 0x98, 0xed, 0xf0, 0x51, 0xe8, 0x15, 0xec, 0xd6, 0x27, 0xa0, 0x5d, 0xb0, 0x35, 0x40, 0x36, - 0xb6, 0xc5, 0x47, 0x77, 0x87, 0xc3, 0xb5, 0xe7, 0xb3, 0x07, 0xfc, 0x71, 0x7e, 0x77, 0x38, 0xec, 0x3c, 0xa3, 0xde, - 0xbb, 0xe1, 0x09, 0x7b, 0xcf, 0x93, 0xc9, 0xcd, 0x15, 0x8f, 0x27, 0x83, 0xc1, 0x8d, 0xbf, 0xe0, 0xf5, 0xec, 0x06, - 0xb4, 0x03, 0xe7, 0x0b, 0xa9, 0x6b, 0xf6, 0x6e, 0x79, 0xe6, 0x2d, 0x70, 0x6c, 0x6e, 0xe1, 0xe8, 0xed, 0xf7, 0xbd, - 0x3b, 0x1e, 0x79, 0xb7, 0xa4, 0x62, 0x5a, 0x71, 0xc5, 0xf1, 0xb6, 0xc5, 0xfd, 0x74, 0xc5, 0x43, 0x78, 0x84, 0x55, - 0x99, 0xde, 0x04, 0xef, 0x7d, 0xb6, 0xd2, 0x2c, 0x70, 0x0f, 0x98, 0x63, 0x4d, 0x76, 0x42, 0x33, 0xf1, 0x57, 0xd8, - 0x3f, 0x37, 0xaa, 0x7f, 0x68, 0xfe, 0x97, 0xba, 0x9f, 0xc0, 0xed, 0x8b, 0x2c, 0x48, 0xec, 0x3d, 0xbf, 0x61, 0xf7, - 0xdc, 0xb0, 0xcd, 0x9e, 0x99, 0xb2, 0x4f, 0x94, 0x1a, 0x3f, 0x52, 0xea, 0xda, 0x32, 0xac, 0x64, 0xee, 0xbe, 0x8c, - 0xc0, 0xe1, 0x80, 0xfc, 0x74, 0x87, 0x38, 0x08, 0xad, 0x9b, 0xac, 0xe6, 0x8a, 0x72, 0x2e, 0xb4, 0x65, 0xe6, 0xe5, - 0xc0, 0x62, 0x96, 0x52, 0x68, 0x2c, 0x00, 0x10, 0x4c, 0x0a, 0xad, 0xbd, 0x97, 0x01, 0xe4, 0x04, 0x0d, 0x7f, 0x6c, - 0xae, 0x8a, 0xb2, 0x96, 0x2d, 0x09, 0x51, 0xb6, 0xeb, 0xe1, 0x25, 0x42, 0xa6, 0xf5, 0xfb, 0xe7, 0x44, 0xb2, 0x36, - 0xa9, 0xae, 0x6a, 0xb4, 0x04, 0x54, 0x64, 0x09, 0x98, 0xf8, 0x95, 0xe6, 0x13, 0x80, 0x27, 0x1d, 0x0f, 0xaa, 0xa7, - 0xbc, 0x66, 0x82, 0xc8, 0x36, 0x2a, 0x7f, 0x52, 0xbc, 0x40, 0x32, 0x82, 0xe2, 0x69, 0xad, 0x32, 0x16, 0x86, 0x79, - 0xa0, 0x80, 0xbc, 0x7b, 0x77, 0xea, 0x5b, 0xfb, 0x63, 0xc7, 0x9e, 0xad, 0x55, 0xa8, 0x85, 0x9a, 0xc2, 0x25, 0x87, - 0xe8, 0x0a, 0x32, 0x50, 0xc8, 0x78, 0xf2, 0x7a, 0x70, 0x39, 0x89, 0xae, 0xb8, 0x40, 0x67, 0x7c, 0x7d, 0xd3, 0x4d, - 0x67, 0xd1, 0xd3, 0x6a, 0x3e, 0x21, 0x25, 0xd9, 0xe1, 0x90, 0x8d, 0xaa, 0xba, 0x58, 0x4f, 0x43, 0xf9, 0xd3, 0x43, - 0xf0, 0xf5, 0x82, 0x7a, 0x4d, 0x56, 0xa9, 0x7e, 0x4a, 0x95, 0xf2, 0xa2, 0xe1, 0xa5, 0xff, 0xb4, 0x92, 0xfb, 0x1e, - 0x90, 0xd6, 0xf2, 0x92, 0xcb, 0xf7, 0x23, 0xc4, 0x18, 0xf1, 0x03, 0xaf, 0xe4, 0x11, 0x0b, 0xd5, 0x14, 0xae, 0x79, - 0x84, 0x20, 0x6f, 0x99, 0x0e, 0xfe, 0xd6, 0x13, 0xa7, 0xfb, 0x13, 0xa5, 0x5d, 0x7c, 0x61, 0x51, 0xf7, 0x64, 0x6d, - 0xdd, 0x80, 0x1c, 0x6c, 0x98, 0x2e, 0x0a, 0xb2, 0x4d, 0x69, 0x04, 0x6d, 0xb4, 0x1c, 0xd8, 0x70, 0x2a, 0xb5, 0xe1, - 0xcc, 0x35, 0x04, 0xf7, 0xf9, 0x79, 0x3a, 0x5a, 0xc0, 0x87, 0x54, 0xb7, 0x97, 0xf8, 0xf9, 0xb0, 0xe1, 0x11, 0x90, - 0xd9, 0x11, 0x9f, 0xd9, 0x44, 0xd2, 0x49, 0x9d, 0x2b, 0x60, 0xb7, 0xb3, 0x6b, 0x90, 0x23, 0x66, 0xee, 0x2b, 0x54, - 0xdf, 0xa2, 0x01, 0x57, 0xc6, 0xda, 0xd7, 0x24, 0x63, 0xe1, 0x55, 0x39, 0x0d, 0x07, 0x00, 0x43, 0x97, 0xd1, 0xd7, - 0x96, 0x9b, 0x2c, 0xfb, 0xb9, 0x80, 0x20, 0x88, 0x92, 0x78, 0x7c, 0xc0, 0xfb, 0xb2, 0x1a, 0x6a, 0x94, 0x7c, 0x2c, - 0x1b, 0xa9, 0xf4, 0x4a, 0xf4, 0x77, 0x63, 0x2e, 0x31, 0xe0, 0x75, 0xd5, 0x16, 0x14, 0xce, 0xf3, 0xc3, 0xe1, 0x3c, - 0x1f, 0x19, 0xcf, 0x32, 0x50, 0xad, 0x4c, 0xeb, 0x20, 0x36, 0xf3, 0xc5, 0xc2, 0x5f, 0xec, 0x9c, 0x44, 0x44, 0x41, - 0x60, 0x47, 0xc2, 0x83, 0x48, 0xfd, 0xaa, 0xf2, 0x74, 0xa7, 0xfa, 0x6c, 0xbf, 0xb0, 0x89, 0xf4, 0x82, 0x92, 0xc9, - 0x27, 0xc1, 0x5e, 0xf5, 0x77, 0x10, 0x36, 0x84, 0x37, 0xaf, 0x7a, 0x9d, 0x65, 0x6a, 0x56, 0x82, 0x84, 0x19, 0x73, - 0x04, 0x8f, 0xc3, 0x4e, 0x63, 0x1b, 0x1e, 0x5b, 0x70, 0x74, 0xde, 0x9a, 0xdd, 0xb1, 0x15, 0xbb, 0x55, 0x75, 0x5a, - 0xf0, 0x70, 0x3a, 0xbc, 0x0c, 0x70, 0xf5, 0xad, 0xcf, 0x39, 0xbf, 0xa3, 0x13, 0x6c, 0x3d, 0xe0, 0xd1, 0x44, 0xcc, - 0xd6, 0x4f, 0x23, 0xb5, 0x78, 0xd6, 0x43, 0xbe, 0xa0, 0xf5, 0x27, 0x66, 0x77, 0x26, 0xf9, 0x6e, 0xc0, 0x17, 0x93, - 0xf5, 0xd3, 0x08, 0x5e, 0x7d, 0x0a, 0x56, 0x8c, 0xcc, 0x99, 0x65, 0xeb, 0xa7, 0x11, 0x8e, 0xd9, 0xdd, 0xd3, 0x88, - 0x46, 0x6d, 0x25, 0xf7, 0xa5, 0xdb, 0x06, 0x84, 0x95, 0x5b, 0x16, 0xc3, 0x6b, 0x20, 0x9e, 0x69, 0x23, 0xe9, 0x5a, - 0x1a, 0x7a, 0x63, 0x1e, 0x4e, 0xe3, 0x60, 0x4d, 0xad, 0x90, 0x67, 0x86, 0x98, 0xc5, 0x4f, 0xa3, 0x39, 0x5b, 0x61, - 0x45, 0x36, 0x3c, 0x1e, 0x5c, 0x4e, 0x36, 0x57, 0x7c, 0x0d, 0xe4, 0x67, 0x93, 0x8d, 0xd9, 0xa2, 0x6e, 0xb9, 0x98, - 0x6d, 0x9e, 0x46, 0xf3, 0xc9, 0x0a, 0x7a, 0xd6, 0x1e, 0x30, 0xef, 0x0d, 0x88, 0x50, 0x12, 0x52, 0x53, 0x6e, 0x7a, - 0x3d, 0xb6, 0x1e, 0x07, 0x77, 0x6c, 0x7d, 0x19, 0xdc, 0xb2, 0xf5, 0x18, 0x88, 0x38, 0xa8, 0xdf, 0xbd, 0x0d, 0x2c, - 0xbe, 0x88, 0xad, 0x2f, 0x4d, 0xda, 0xe6, 0x69, 0xc4, 0xdc, 0xc1, 0x69, 0xe0, 0x82, 0xb5, 0xc9, 0xbc, 0x15, 0x83, - 0x4b, 0xc8, 0xd2, 0x8b, 0xd9, 0x66, 0x78, 0xc9, 0xd6, 0x23, 0x9c, 0xea, 0x89, 0xcf, 0xee, 0xf8, 0x2d, 0x4b, 0xf8, - 0xaa, 0x89, 0xaf, 0x36, 0xa0, 0x11, 0x3d, 0xca, 0xa0, 0xaf, 0xa0, 0x66, 0xe6, 0xbc, 0xb2, 0x30, 0x2a, 0xf7, 0x2d, - 0x38, 0xa0, 0x20, 0x6d, 0x03, 0x04, 0x49, 0x3c, 0xbb, 0x57, 0xe1, 0xfa, 0x46, 0x0a, 0x03, 0x6e, 0x02, 0x33, 0x60, - 0x60, 0xfa, 0x19, 0xfc, 0xb0, 0xd2, 0x25, 0x42, 0x9c, 0xfd, 0x94, 0x92, 0x64, 0x9e, 0x9f, 0x8a, 0x34, 0x77, 0x0b, - 0xd7, 0x29, 0xcc, 0x8a, 0x02, 0xd5, 0x4f, 0x49, 0x69, 0x60, 0xa1, 0x12, 0x99, 0x4a, 0xc1, 0x2f, 0x9b, 0xf3, 0x28, - 0x3b, 0x46, 0xe7, 0x3a, 0xbf, 0x9c, 0x38, 0xa7, 0x93, 0xbe, 0xff, 0xc0, 0x31, 0x6c, 0x21, 0x03, 0x17, 0xfe, 0xd4, - 0x13, 0xc6, 0xa9, 0x15, 0x88, 0xa9, 0xe4, 0xd9, 0x53, 0xf8, 0x4c, 0x68, 0x75, 0x74, 0xe1, 0xfb, 0x41, 0xa1, 0x4d, - 0xd2, 0x2d, 0x48, 0x52, 0xf0, 0x14, 0x3d, 0xe7, 0xbc, 0x0d, 0x54, 0x8a, 0x11, 0x2d, 0x88, 0xb4, 0xb5, 0xcc, 0x1c, - 0xa4, 0x2d, 0xcd, 0x77, 0x4d, 0xfc, 0x1c, 0x16, 0x70, 0x11, 0x2d, 0x6c, 0x0d, 0x8f, 0xaa, 0x58, 0xb9, 0x37, 0x79, - 0x8e, 0x70, 0x46, 0x97, 0x32, 0x01, 0x70, 0xbd, 0x5f, 0x87, 0xb5, 0xc2, 0x2b, 0x6a, 0x16, 0x79, 0x51, 0xd3, 0x27, - 0x5b, 0xe0, 0x3e, 0x16, 0x25, 0x0a, 0x9c, 0xb5, 0x60, 0xc0, 0x56, 0x58, 0xb2, 0x93, 0xc2, 0xa6, 0x68, 0x09, 0xbd, - 0x3d, 0x7e, 0x3a, 0xa8, 0x99, 0x0c, 0xa0, 0x09, 0xa0, 0xf1, 0xf8, 0x17, 0x80, 0x9a, 0xde, 0xd4, 0x62, 0x5d, 0x05, - 0xa5, 0x52, 0x6e, 0xc2, 0xcf, 0xc0, 0x30, 0xc3, 0x0f, 0x85, 0xdc, 0x26, 0x4a, 0xe4, 0xfc, 0x58, 0x94, 0x62, 0x59, - 0x8a, 0x2a, 0x69, 0x37, 0x14, 0x3c, 0x22, 0xdc, 0x06, 0x8d, 0x99, 0xdb, 0x13, 0x5d, 0xb4, 0x22, 0x94, 0x63, 0xb3, - 0x8e, 0x91, 0x46, 0x99, 0x9d, 0xec, 0x3a, 0x59, 0x68, 0xbf, 0xaf, 0x72, 0xc8, 0x3a, 0x60, 0x8d, 0xe4, 0xeb, 0x35, - 0x87, 0x6e, 0x1b, 0xe5, 0xc5, 0x83, 0xe7, 0x2b, 0x38, 0xcd, 0xf1, 0xc4, 0xee, 0x7a, 0xdd, 0x29, 0x12, 0xf1, 0x0a, - 0x27, 0x55, 0x3e, 0x92, 0x85, 0xe3, 0xce, 0x9d, 0xd6, 0x62, 0x55, 0xb9, 0xac, 0xa7, 0x16, 0x47, 0x04, 0x3e, 0x95, - 0x47, 0x7b, 0xa1, 0x6d, 0x51, 0x2c, 0x84, 0xd1, 0xa3, 0x13, 0x7e, 0x52, 0x02, 0xeb, 0xeb, 0x70, 0x58, 0xfa, 0x11, - 0x47, 0xbf, 0xd3, 0x68, 0xb4, 0x20, 0xa4, 0xe1, 0xa9, 0x17, 0x8d, 0x16, 0x75, 0x51, 0x87, 0xd9, 0x8b, 0x5c, 0x0f, - 0x14, 0x86, 0x11, 0xa8, 0x1f, 0x5c, 0x65, 0xf0, 0x59, 0x84, 0xa8, 0x79, 0x60, 0x9a, 0x0d, 0xe1, 0xa8, 0x0b, 0x3c, - 0xb4, 0x82, 0x16, 0x33, 0xf3, 0x51, 0x88, 0xe1, 0x43, 0xba, 0x38, 0x7f, 0x42, 0x56, 0x3e, 0xc0, 0xee, 0xd0, 0x5d, - 0x28, 0xe7, 0x4c, 0xc5, 0x00, 0x3f, 0x0a, 0xc8, 0x47, 0x09, 0xb8, 0x19, 0x20, 0x7b, 0x64, 0x09, 0x20, 0x56, 0x8c, - 0x8e, 0x26, 0x9f, 0xfb, 0x5e, 0xa4, 0xe0, 0x9d, 0x7d, 0x96, 0xab, 0x09, 0x43, 0xe1, 0x13, 0x03, 0xdd, 0xfc, 0xc6, - 0x6f, 0xcf, 0x5b, 0x30, 0xb2, 0x4b, 0x52, 0xbc, 0xd6, 0x0c, 0xf7, 0x1b, 0x70, 0x3b, 0x02, 0xca, 0x9a, 0xea, 0x98, - 0x64, 0x9b, 0x86, 0x48, 0x06, 0xcc, 0x88, 0x11, 0x41, 0x65, 0xb9, 0xf0, 0xbf, 0x7b, 0x59, 0x14, 0x38, 0x80, 0xab, - 0x99, 0x0c, 0x5e, 0xbb, 0x30, 0x2a, 0x00, 0xce, 0x69, 0xe8, 0x94, 0xf6, 0xaa, 0xea, 0x90, 0xac, 0x9a, 0x1f, 0xcc, - 0xe6, 0x4d, 0xc3, 0xc4, 0x88, 0x20, 0xba, 0x08, 0x27, 0x98, 0x5e, 0x91, 0xbe, 0x56, 0x72, 0x3a, 0x5a, 0x75, 0xb4, - 0x96, 0x98, 0x98, 0x2b, 0x8a, 0xbf, 0x06, 0x3c, 0x6e, 0xf0, 0xea, 0x24, 0x4d, 0x27, 0xaa, 0x47, 0x8f, 0x5f, 0xa7, - 0xe9, 0xa4, 0xc4, 0x5d, 0xe1, 0x37, 0xe0, 0xa2, 0xd9, 0xe6, 0x43, 0x3f, 0x7e, 0x41, 0x11, 0x17, 0x35, 0xb8, 0xf2, - 0x4e, 0xf5, 0x95, 0xea, 0x23, 0xa8, 0x85, 0x27, 0x46, 0xd6, 0xc2, 0x93, 0x4b, 0xd6, 0x5a, 0x10, 0xcc, 0x6c, 0x0e, - 0x5c, 0xc8, 0xaf, 0x94, 0x22, 0xde, 0x44, 0x42, 0x2d, 0x06, 0xad, 0xc7, 0xcc, 0x59, 0x35, 0x5a, 0xa8, 0xcc, 0x08, - 0xed, 0xdb, 0x5a, 0x74, 0x7e, 0x23, 0x3f, 0xe5, 0xa9, 0x7d, 0xd9, 0x1e, 0xe7, 0xe3, 0x3d, 0xba, 0xab, 0xce, 0x32, - 0x93, 0x32, 0x3e, 0x99, 0x25, 0x28, 0xdc, 0x25, 0xd8, 0x80, 0x24, 0xfb, 0xb5, 0x0e, 0x90, 0x51, 0x7b, 0xed, 0x77, - 0x9d, 0xe5, 0xab, 0x9b, 0xad, 0xa1, 0xa8, 0xd4, 0x4a, 0x52, 0x1c, 0x64, 0xb8, 0x6e, 0x2b, 0x1f, 0x2e, 0x2e, 0xa0, - 0x67, 0x8c, 0x44, 0xe6, 0xf9, 0x13, 0xf9, 0x12, 0x9c, 0x33, 0xce, 0x0a, 0x81, 0x09, 0x63, 0xf5, 0xae, 0xb5, 0x54, - 0x1a, 0x52, 0x8c, 0x1d, 0x8d, 0xb2, 0xac, 0xb2, 0x74, 0x99, 0xad, 0x25, 0x6c, 0x59, 0x4e, 0x6e, 0x61, 0xcb, 0x4c, - 0x56, 0xf3, 0x7d, 0xc5, 0x1d, 0x94, 0x6f, 0xb6, 0xce, 0xf8, 0x5e, 0x22, 0x7b, 0xb7, 0x81, 0x12, 0x5e, 0x8c, 0xfe, - 0x82, 0xf4, 0xdb, 0x0c, 0xe3, 0x94, 0xdb, 0x4a, 0x5a, 0x80, 0xd3, 0x3f, 0x1c, 0xde, 0x57, 0x18, 0x34, 0x38, 0xc2, - 0x38, 0xb2, 0x7e, 0xff, 0xb6, 0xf2, 0x6a, 0x4c, 0xd4, 0xf1, 0x59, 0xfd, 0x7e, 0x45, 0x0f, 0xa7, 0xd5, 0x68, 0x95, - 0x6e, 0x91, 0x9d, 0xd0, 0xc6, 0xca, 0x0f, 0x6a, 0x05, 0xcc, 0xde, 0xfa, 0x7c, 0x3a, 0x00, 0x1d, 0x0b, 0x90, 0x68, - 0x36, 0x13, 0x89, 0x39, 0xe9, 0x9e, 0x84, 0xc7, 0x07, 0x16, 0x38, 0xc0, 0x54, 0xfc, 0x9f, 0xc2, 0x9b, 0x81, 0x0d, - 0x1a, 0x25, 0xfa, 0x1a, 0x5d, 0xd5, 0xe6, 0x46, 0xc7, 0x4b, 0x4f, 0x21, 0x91, 0x15, 0xac, 0x9a, 0xfb, 0x72, 0x03, - 0xa7, 0x3d, 0xd4, 0x1c, 0x2a, 0x4b, 0xf0, 0xb7, 0x5f, 0xe6, 0x87, 0xc3, 0x3a, 0x83, 0xc2, 0x76, 0x6b, 0xa1, 0xbd, - 0x31, 0x4b, 0x35, 0x54, 0x84, 0x83, 0xce, 0x57, 0x62, 0x56, 0x8f, 0xe8, 0xef, 0xf9, 0xe1, 0xb0, 0x22, 0x30, 0xe0, - 0xb0, 0x94, 0x99, 0x68, 0xa1, 0x58, 0x5a, 0x67, 0x33, 0xaa, 0x03, 0x0f, 0x4c, 0xcc, 0x59, 0xb8, 0x03, 0xd0, 0x26, - 0xb5, 0x0a, 0xf4, 0x2a, 0xa2, 0x9f, 0xb8, 0x5f, 0xdb, 0xaf, 0xd7, 0x23, 0xb3, 0x74, 0xe4, 0xc6, 0x58, 0x00, 0x70, - 0xe0, 0x79, 0x4d, 0xf2, 0x9c, 0x7c, 0x0d, 0xed, 0x9e, 0x5c, 0xc8, 0x9f, 0xa0, 0x6c, 0xe1, 0xb9, 0x6a, 0x5a, 0x59, - 0xac, 0xb8, 0xaa, 0x5e, 0x5d, 0xf0, 0xca, 0x64, 0x5a, 0xa5, 0x95, 0xa8, 0x94, 0x60, 0x40, 0x5d, 0xe2, 0xb5, 0xa6, - 0x19, 0xa5, 0x36, 0xea, 0x4c, 0xd4, 0x80, 0x0d, 0xf6, 0x53, 0xb5, 0xd1, 0xc9, 0xb9, 0x7c, 0x7e, 0x69, 0x1c, 0x3e, - 0xed, 0xea, 0xcd, 0x4c, 0xe5, 0xc0, 0x5f, 0x2b, 0x1f, 0x5a, 0x3d, 0x06, 0x3a, 0x20, 0xa7, 0x3f, 0x86, 0xc5, 0xc4, - 0xee, 0xd0, 0xbc, 0xdd, 0x5d, 0x56, 0x17, 0xe9, 0x9d, 0xa6, 0x64, 0x56, 0x6f, 0xf9, 0xcc, 0xea, 0xd1, 0x01, 0x2f, - 0x1e, 0xeb, 0xbd, 0xc2, 0x4c, 0x22, 0xb8, 0x18, 0xaa, 0x49, 0x64, 0x77, 0xa0, 0x35, 0x8f, 0x2a, 0x26, 0xc0, 0x0f, - 0x4a, 0xad, 0xe9, 0xbd, 0xdd, 0x15, 0xea, 0x94, 0xc2, 0xe3, 0xd6, 0x92, 0x1f, 0x98, 0x3b, 0xed, 0x5a, 0xe7, 0xe3, - 0xf9, 0xa5, 0xef, 0x37, 0xf2, 0x84, 0x36, 0x3b, 0x93, 0xd3, 0x3f, 0x79, 0xab, 0x7f, 0x98, 0xea, 0x5b, 0xe8, 0x4e, - 0xd0, 0x67, 0xe8, 0xaa, 0xea, 0xae, 0xc4, 0x16, 0x86, 0x7a, 0x62, 0x91, 0x17, 0xf2, 0xa4, 0x35, 0x76, 0x1c, 0xec, - 0x0d, 0x70, 0xe2, 0x97, 0x87, 0x83, 0xb8, 0xca, 0x7d, 0x76, 0xde, 0x35, 0xb2, 0x72, 0x00, 0x2b, 0x88, 0x82, 0x71, - 0x6b, 0x3e, 0xb6, 0x41, 0xba, 0xc4, 0xd5, 0xf8, 0xf8, 0x0d, 0xc5, 0x32, 0xd9, 0x44, 0x5c, 0x5c, 0xe4, 0x4f, 0x9f, - 0x03, 0x69, 0x59, 0xbf, 0x1f, 0xbd, 0xb8, 0x9c, 0x3e, 0x1f, 0x46, 0x01, 0x38, 0x76, 0xd9, 0xcb, 0xcb, 0x98, 0xaf, - 0x2e, 0x99, 0x65, 0x0a, 0x8b, 0x7c, 0x33, 0xa0, 0xba, 0x64, 0xb5, 0x74, 0xbd, 0x02, 0x2c, 0x5d, 0x7e, 0xf3, 0x10, - 0xa6, 0x06, 0x34, 0xb2, 0xe6, 0xee, 0x34, 0xd7, 0x02, 0xa5, 0x9e, 0xf7, 0x33, 0x43, 0xbe, 0x2e, 0x83, 0xae, 0x20, - 0xdd, 0xf3, 0x88, 0xf4, 0x72, 0x2f, 0x9d, 0xee, 0xf7, 0xa5, 0x00, 0x4b, 0x7d, 0x29, 0x3e, 0x83, 0xc2, 0xa2, 0xf1, - 0x8d, 0x00, 0x6d, 0x0d, 0xd5, 0xb4, 0x57, 0x8a, 0xaa, 0x17, 0xf4, 0x4a, 0xf1, 0xb9, 0xa7, 0x87, 0xca, 0x7c, 0x59, - 0x3a, 0xfa, 0x9f, 0x50, 0x73, 0xc1, 0x09, 0x31, 0x13, 0x73, 0x00, 0x95, 0xa0, 0x8d, 0x6f, 0x75, 0xb4, 0xf1, 0xa9, - 0x5e, 0xc5, 0x4d, 0x9f, 0xd7, 0xd6, 0x32, 0x27, 0x84, 0x4d, 0xf7, 0x12, 0xa0, 0x22, 0xaf, 0x84, 0x47, 0xb0, 0xfc, - 0xf2, 0x87, 0x3c, 0x5d, 0x21, 0x5a, 0xc7, 0x3d, 0xcb, 0x5c, 0x1a, 0xfb, 0x37, 0x06, 0xd3, 0xd7, 0xb7, 0xdb, 0x22, - 0x3f, 0x35, 0x31, 0x61, 0x3d, 0x56, 0xf4, 0xcd, 0xbb, 0x70, 0x25, 0x50, 0xe0, 0x50, 0x22, 0xb1, 0x4d, 0x15, 0x8a, - 0x78, 0x90, 0xf4, 0xe9, 0xa2, 0xf5, 0x69, 0x80, 0xa9, 0xb5, 0x1c, 0x98, 0x43, 0xb8, 0x8a, 0x0b, 0x1f, 0x3d, 0x7d, - 0x8b, 0x59, 0x38, 0x9f, 0x78, 0x1f, 0xbd, 0x62, 0x64, 0x3e, 0xee, 0xa3, 0x52, 0x49, 0xff, 0x3c, 0x1c, 0x66, 0xd5, - 0xdc, 0x77, 0xe8, 0x23, 0x3d, 0x54, 0xb9, 0xa0, 0xec, 0x8d, 0x31, 0x89, 0x40, 0x69, 0x8c, 0xf7, 0x71, 0x70, 0x9c, - 0xf7, 0x69, 0x00, 0xa9, 0x7d, 0xe2, 0x3d, 0x29, 0x39, 0x3c, 0xe7, 0x98, 0x13, 0x4a, 0x2b, 0xc2, 0x2a, 0xbe, 0xc8, - 0x50, 0xae, 0x3b, 0xa5, 0x60, 0x92, 0x43, 0x82, 0xe1, 0xaf, 0x9a, 0x37, 0xb1, 0x02, 0x61, 0xd7, 0xcc, 0xab, 0xd1, - 0x93, 0x2a, 0x09, 0x4b, 0x01, 0x47, 0x65, 0xe6, 0x19, 0xf6, 0x86, 0x27, 0x86, 0x91, 0x83, 0xe5, 0xfe, 0xa8, 0x4e, - 0x44, 0xee, 0xd1, 0x05, 0x46, 0x65, 0xe1, 0x79, 0x43, 0x57, 0x1a, 0x54, 0x92, 0x1d, 0x7f, 0xc5, 0x35, 0xa0, 0xb6, - 0xc6, 0x88, 0xa1, 0x80, 0x51, 0xf0, 0xda, 0xfe, 0x10, 0xb2, 0x28, 0x5b, 0xbf, 0xc1, 0x31, 0x9f, 0x95, 0xdc, 0xf5, - 0x0e, 0x67, 0xa1, 0x25, 0xe4, 0xc9, 0x1d, 0x83, 0x34, 0x8d, 0xa5, 0x11, 0x70, 0x22, 0x92, 0x6d, 0x2c, 0x85, 0x23, - 0x80, 0x80, 0x40, 0x37, 0x65, 0x86, 0x31, 0x1d, 0x8c, 0x3c, 0x4f, 0x7a, 0xc6, 0x7b, 0x15, 0x9e, 0x42, 0x9a, 0x6c, - 0x5f, 0xcf, 0xdf, 0x1b, 0x41, 0x56, 0x6e, 0x39, 0xc7, 0xc3, 0xe2, 0x1b, 0x67, 0x5f, 0xe5, 0xe4, 0x29, 0x66, 0x19, - 0xe9, 0x9d, 0x62, 0x5e, 0xc0, 0x9f, 0xca, 0x52, 0x9f, 0xa3, 0xf4, 0x96, 0xf9, 0x64, 0x15, 0x49, 0x97, 0xde, 0xa6, - 0xdf, 0x8f, 0x47, 0xea, 0x50, 0xf3, 0xf7, 0xf1, 0x48, 0x9e, 0x61, 0x1b, 0x96, 0xb0, 0xd0, 0x2a, 0x18, 0x03, 0x48, - 0x62, 0x23, 0xa2, 0xc1, 0x68, 0x6f, 0x0e, 0x87, 0xf3, 0x8d, 0x39, 0x4b, 0xf6, 0xe0, 0xfa, 0xca, 0x13, 0xf3, 0x0e, - 0x7c, 0x99, 0xc7, 0x04, 0x11, 0x9b, 0x79, 0x1b, 0x56, 0x83, 0x07, 0x3b, 0xb8, 0x3e, 0x62, 0x8b, 0x62, 0xad, 0x63, - 0xa9, 0xac, 0x83, 0xd3, 0x3a, 0x36, 0xcd, 0x48, 0x29, 0xb2, 0xcf, 0xb1, 0xbf, 0x77, 0x83, 0xab, 0x6b, 0x63, 0x50, - 0x6b, 0xdc, 0x61, 0xee, 0x9c, 0x0a, 0xa8, 0xc7, 0x74, 0x05, 0xd5, 0xb3, 0x9c, 0x7c, 0xf9, 0xad, 0x9d, 0x03, 0x82, - 0x46, 0x20, 0x70, 0xd1, 0x40, 0xab, 0x76, 0x29, 0xe7, 0x5d, 0x40, 0x88, 0x6f, 0x52, 0xd0, 0xa7, 0x33, 0xd8, 0xc4, - 0xe6, 0x13, 0x88, 0x45, 0xd3, 0x7d, 0xae, 0x35, 0xf3, 0xc5, 0x88, 0x76, 0x66, 0xdd, 0x2d, 0x72, 0xab, 0x85, 0x48, - 0x46, 0xcf, 0x36, 0x13, 0x2e, 0x3a, 0x94, 0x33, 0x12, 0x30, 0x41, 0x6b, 0x2b, 0x25, 0x9f, 0xeb, 0x5e, 0x27, 0x68, - 0x0f, 0x24, 0xad, 0xfb, 0x37, 0x8b, 0xce, 0x28, 0x39, 0xb9, 0xde, 0xe4, 0x0c, 0x52, 0xb0, 0x60, 0x7b, 0x99, 0x13, - 0x6e, 0x80, 0x4f, 0x6c, 0x96, 0x9c, 0xa6, 0x41, 0x1e, 0x0b, 0xe3, 0x91, 0xd7, 0xe6, 0x97, 0x05, 0x74, 0x28, 0x59, - 0x34, 0x42, 0x3c, 0xc0, 0xce, 0x21, 0xb9, 0x2a, 0x50, 0x37, 0x0d, 0x74, 0xe5, 0xca, 0x99, 0x62, 0x0a, 0x5c, 0x08, - 0x05, 0x51, 0x3b, 0x3a, 0x89, 0xca, 0x79, 0x9f, 0x54, 0x97, 0xf9, 0xb4, 0x90, 0xa6, 0x81, 0x7c, 0x5a, 0x39, 0xe6, - 0x81, 0x9d, 0x6d, 0x5c, 0x13, 0x18, 0xe8, 0xd4, 0xbe, 0x16, 0xe5, 0x1c, 0xab, 0x88, 0xde, 0xe7, 0x1f, 0x2a, 0x7b, - 0xfa, 0x20, 0xc2, 0x46, 0x05, 0x1a, 0x4b, 0x89, 0xb1, 0x91, 0xe3, 0xdf, 0x12, 0x65, 0x43, 0x86, 0x80, 0x10, 0xd2, - 0x46, 0x4e, 0x3f, 0xac, 0x2f, 0x6f, 0x33, 0xed, 0xff, 0x49, 0xe2, 0xb7, 0xc1, 0x5e, 0x4e, 0xfd, 0xa9, 0x47, 0x3c, - 0x5e, 0x6b, 0xf4, 0x98, 0x92, 0x6e, 0x83, 0x3c, 0x55, 0x9e, 0x82, 0x64, 0xc2, 0x58, 0x42, 0xb0, 0x28, 0x17, 0x3c, - 0xe7, 0x15, 0x97, 0x70, 0x1f, 0xb5, 0xac, 0x88, 0x50, 0x95, 0xc8, 0xe9, 0xf3, 0x15, 0xf0, 0x4c, 0x40, 0xa0, 0x63, - 0x8c, 0x34, 0xaa, 0xe0, 0x4b, 0x60, 0xac, 0x03, 0x65, 0xa7, 0x19, 0x09, 0x2e, 0xbb, 0x37, 0x48, 0x94, 0xfa, 0x9a, - 0x94, 0xa4, 0xd7, 0xa2, 0xc6, 0x2b, 0xb1, 0x8a, 0x48, 0x20, 0x43, 0x0d, 0x11, 0xab, 0xea, 0xa9, 0x7b, 0x55, 0x4c, - 0x06, 0x83, 0xca, 0x97, 0xd3, 0x13, 0x6f, 0x68, 0xa8, 0xbc, 0xeb, 0x8a, 0x76, 0x7a, 0xa2, 0x95, 0xf2, 0x16, 0xd2, - 0x12, 0x34, 0x0d, 0x23, 0xcd, 0xa1, 0xd4, 0x95, 0x74, 0x37, 0x06, 0xf1, 0x25, 0x13, 0x3d, 0xdb, 0xa9, 0x1d, 0xa5, - 0x2d, 0x69, 0x0f, 0x21, 0x3d, 0x77, 0xc9, 0xc7, 0x2c, 0xe4, 0xea, 0x4e, 0x39, 0x29, 0xaf, 0x42, 0x74, 0x72, 0xdf, - 0x63, 0x48, 0x04, 0xfa, 0x9c, 0x63, 0x58, 0x17, 0x0d, 0x75, 0x0e, 0x2b, 0xc4, 0x6c, 0xa1, 0x84, 0xf9, 0x92, 0xf1, - 0x54, 0x32, 0x68, 0x00, 0x64, 0xc0, 0x67, 0x2f, 0x03, 0xcb, 0x5f, 0x41, 0xfc, 0x68, 0xe3, 0xc3, 0xe1, 0xcf, 0x9a, - 0x42, 0x6c, 0xff, 0x84, 0xcd, 0x10, 0x1e, 0xd5, 0x03, 0x9e, 0xf9, 0x26, 0x4e, 0xd0, 0x0a, 0x48, 0xca, 0xec, 0x68, - 0x22, 0x7b, 0xd5, 0x43, 0x38, 0x95, 0x15, 0xa8, 0xa3, 0xac, 0xb3, 0x12, 0x7e, 0x84, 0xa9, 0x6e, 0x25, 0xd6, 0x02, - 0x6d, 0xae, 0x56, 0xac, 0x05, 0x70, 0xe0, 0xe7, 0x10, 0x3c, 0x91, 0xcf, 0xc1, 0xc5, 0xa0, 0x00, 0x9f, 0x03, 0xe0, - 0x45, 0xee, 0xc2, 0x83, 0x79, 0x64, 0x59, 0x8d, 0x30, 0x1c, 0x55, 0xc4, 0xfa, 0x35, 0xdb, 0x91, 0x0f, 0xdc, 0x8e, - 0xf1, 0xb9, 0xf6, 0x58, 0xb2, 0x1c, 0x8c, 0x32, 0xf7, 0x6a, 0x89, 0x9e, 0x37, 0x69, 0xdc, 0x8c, 0x9e, 0xec, 0x6b, - 0xf9, 0xbf, 0xa0, 0x97, 0x41, 0x7f, 0x0b, 0xb7, 0xbc, 0xe6, 0x77, 0x0b, 0x22, 0xcd, 0xf4, 0x0a, 0x22, 0x65, 0xd4, - 0x88, 0x8c, 0x21, 0x6c, 0x52, 0xdd, 0xdc, 0x26, 0xd5, 0x85, 0x80, 0xa7, 0x23, 0x52, 0x5d, 0x0b, 0x69, 0x23, 0x9f, - 0xd6, 0x81, 0x8c, 0x45, 0x7a, 0xf7, 0xc3, 0xdf, 0x5e, 0x7e, 0x7a, 0xfb, 0xcb, 0x0f, 0x8b, 0xb7, 0xef, 0xde, 0xbc, - 0x7d, 0xf7, 0xf6, 0xd3, 0x6f, 0x04, 0xe1, 0x31, 0x15, 0x2a, 0xc3, 0x87, 0xf7, 0x37, 0x6f, 0x9d, 0x0c, 0xb6, 0x37, - 0x43, 0xd6, 0xbe, 0x91, 0x83, 0x21, 0x10, 0xd9, 0x20, 0x64, 0x90, 0x9d, 0xda, 0xf6, 0x67, 0x62, 0x8e, 0xb1, 0x77, - 0x02, 0x93, 0x2d, 0xe0, 0x1c, 0xcb, 0xbc, 0x64, 0x44, 0xae, 0x0a, 0xad, 0x1f, 0xd0, 0x82, 0x6b, 0x70, 0x91, 0x49, - 0xf3, 0xbb, 0x5f, 0x08, 0x62, 0x9f, 0x56, 0x52, 0xee, 0xab, 0x6d, 0xcd, 0xf3, 0xed, 0xfd, 0x5e, 0xc2, 0xf9, 0xcf, - 0xa5, 0x11, 0xb5, 0x00, 0x07, 0xe0, 0x73, 0xf8, 0xe3, 0x4a, 0x5b, 0xd2, 0x64, 0x16, 0xed, 0x67, 0x0c, 0x41, 0x97, - 0x06, 0x1f, 0xc4, 0x1e, 0x79, 0xa9, 0x4f, 0x16, 0x12, 0xb8, 0x23, 0x86, 0x4f, 0x2b, 0x82, 0x5e, 0x31, 0xa2, 0xb8, - 0xe4, 0x0a, 0x95, 0x52, 0xf2, 0x6f, 0x94, 0x5d, 0x54, 0xc8, 0x59, 0xc1, 0xee, 0x15, 0x39, 0x32, 0x7e, 0x10, 0x4c, - 0x7c, 0x39, 0xb8, 0xff, 0x12, 0xef, 0x70, 0xa6, 0x38, 0x92, 0x13, 0xfe, 0x90, 0x61, 0x60, 0x7f, 0x0e, 0x3e, 0xaf, - 0x0e, 0xf3, 0xf2, 0x46, 0x9f, 0x72, 0x4b, 0x3e, 0x9e, 0x2c, 0xaf, 0xc0, 0x60, 0xbf, 0x54, 0xcd, 0x5d, 0xf3, 0x7a, - 0xb6, 0x9c, 0xb3, 0xfd, 0x2c, 0x9a, 0x07, 0x77, 0x6c, 0x96, 0xcd, 0x83, 0x55, 0xc3, 0xd7, 0xec, 0x96, 0xaf, 0xad, - 0xaa, 0xad, 0xed, 0xaa, 0x4d, 0x36, 0xfc, 0x16, 0x24, 0x84, 0x9b, 0xcc, 0x03, 0xde, 0xe3, 0x3b, 0x9f, 0x6d, 0x40, - 0xa2, 0x5d, 0xb1, 0x0d, 0x5c, 0xc4, 0xd6, 0xfc, 0x87, 0xca, 0xdb, 0xb0, 0x92, 0x9d, 0x8f, 0x59, 0x8e, 0xf3, 0xcf, - 0x87, 0x07, 0xb4, 0x17, 0xea, 0x67, 0x97, 0xea, 0xd9, 0x44, 0xd9, 0xcd, 0x36, 0xa3, 0xc5, 0x7d, 0x5a, 0x6d, 0xc2, - 0x0c, 0x3d, 0xcb, 0xe1, 0xa3, 0xad, 0x14, 0xfc, 0xf4, 0x02, 0xbf, 0x64, 0x47, 0x6d, 0xa5, 0x6d, 0xbb, 0x2a, 0xb1, - 0x15, 0xb4, 0x28, 0xb2, 0x5a, 0xe1, 0x81, 0x39, 0x7f, 0x01, 0x0b, 0x18, 0x7b, 0x8e, 0x73, 0x5e, 0xfb, 0x23, 0x64, - 0xbc, 0x77, 0x00, 0xd0, 0x32, 0xc7, 0x01, 0x1e, 0xb1, 0x62, 0x14, 0x0d, 0xde, 0xf9, 0xa5, 0xb2, 0x5a, 0x69, 0x4e, - 0x42, 0xdb, 0x88, 0x55, 0xcb, 0x91, 0xaa, 0x19, 0x91, 0x3e, 0x48, 0xcf, 0xfb, 0x1e, 0x51, 0x0d, 0xf6, 0x64, 0x5e, - 0x07, 0xf6, 0xe9, 0x55, 0x6b, 0x55, 0x77, 0x7e, 0x4f, 0x95, 0x2e, 0x39, 0xb2, 0xe5, 0xa7, 0xcb, 0xf0, 0x41, 0xfd, - 0x29, 0xb9, 0x3e, 0x14, 0x38, 0xc2, 0x63, 0x15, 0x70, 0xbe, 0x5e, 0x89, 0x76, 0x27, 0xc2, 0xae, 0x5c, 0x02, 0x42, - 0x7c, 0x49, 0xd3, 0x1c, 0x8f, 0x23, 0x9a, 0x88, 0xb0, 0x89, 0xd1, 0x5f, 0xd8, 0x7d, 0x28, 0xb1, 0x9c, 0xe7, 0x1a, - 0x94, 0x5c, 0x32, 0x78, 0x4f, 0xda, 0x6b, 0xd0, 0x2c, 0xaf, 0x4a, 0x4d, 0x26, 0x72, 0x50, 0x3e, 0x1c, 0x0a, 0xd8, - 0x4b, 0x8d, 0x9f, 0x26, 0xfc, 0x84, 0xe5, 0xad, 0xbd, 0x35, 0xa5, 0xa8, 0xa4, 0x01, 0x2a, 0xf0, 0x31, 0x83, 0xff, - 0xdd, 0x19, 0x62, 0xc1, 0x14, 0x1d, 0x3f, 0x9c, 0x89, 0xb9, 0xf5, 0xdc, 0x2a, 0xeb, 0x28, 0x5b, 0xa3, 0x9c, 0x80, - 0x7f, 0x4b, 0x75, 0x9c, 0x24, 0xc2, 0xa9, 0xf7, 0x88, 0x8b, 0xba, 0x97, 0x43, 0xd4, 0x0d, 0x7b, 0x5b, 0xe9, 0x60, - 0xcb, 0x69, 0x1a, 0x1c, 0x89, 0x5f, 0xa9, 0xcf, 0xde, 0x67, 0x16, 0x8f, 0x3a, 0xb2, 0x11, 0x25, 0x69, 0x1c, 0x8b, - 0x1c, 0xb6, 0xf7, 0x85, 0xdc, 0xff, 0xfb, 0x7d, 0x08, 0x27, 0xad, 0x82, 0xa4, 0xf4, 0x04, 0x22, 0xc2, 0xd1, 0xe1, - 0x47, 0x84, 0x27, 0x52, 0x55, 0xf8, 0xa4, 0x3e, 0x71, 0x63, 0x76, 0x2f, 0xcc, 0x51, 0xbd, 0x05, 0x18, 0xc6, 0x7a, - 0x6b, 0x11, 0x92, 0x68, 0xa5, 0x19, 0x6d, 0x3d, 0x20, 0x46, 0xbc, 0x5f, 0x5b, 0x64, 0x30, 0xd6, 0x96, 0x44, 0x02, - 0xf8, 0x1d, 0x09, 0x19, 0xda, 0x36, 0x02, 0x33, 0x86, 0xb7, 0xb3, 0xe2, 0xd2, 0x75, 0xd8, 0xe6, 0x1c, 0xbe, 0x90, - 0x85, 0x66, 0x1d, 0x51, 0x9a, 0x20, 0xe4, 0x1f, 0x70, 0xb2, 0x50, 0x18, 0xcd, 0xeb, 0xa3, 0x74, 0x92, 0x58, 0xdf, - 0x77, 0x95, 0x0a, 0x36, 0x9b, 0x1b, 0xd4, 0x97, 0x1d, 0x25, 0xbf, 0x02, 0x27, 0x1d, 0x27, 0x59, 0xe4, 0x20, 0x6a, - 0x51, 0x39, 0x37, 0x49, 0x58, 0xda, 0xd5, 0xa9, 0x36, 0xeb, 0x75, 0x51, 0xd6, 0xd5, 0x6b, 0x11, 0x29, 0x7a, 0x1f, - 0xf5, 0xe8, 0x89, 0x84, 0x54, 0x68, 0x55, 0x6a, 0x97, 0x47, 0xe0, 0xb6, 0xa9, 0x15, 0xdb, 0x72, 0x09, 0x4b, 0xd4, - 0xf8, 0x4f, 0xd0, 0x47, 0xb9, 0x78, 0x90, 0x01, 0x1a, 0x1d, 0x4f, 0xcd, 0x5b, 0x8f, 0xbc, 0x72, 0x94, 0x5f, 0x5a, - 0x6d, 0xd2, 0x2f, 0x80, 0xcc, 0x68, 0xff, 0x68, 0x29, 0x81, 0xcc, 0xc0, 0x4c, 0x5a, 0x1a, 0x12, 0x39, 0x8a, 0x59, - 0x9a, 0xff, 0x81, 0x2b, 0xb6, 0x42, 0xa4, 0x61, 0x35, 0xf7, 0xf8, 0xcb, 0xca, 0xab, 0xe5, 0x5a, 0x66, 0x9a, 0x9b, - 0x25, 0x8e, 0x15, 0x8b, 0x8b, 0x7a, 0x5d, 0x89, 0x2c, 0x10, 0xe2, 0x08, 0xd3, 0x58, 0x4f, 0xbd, 0x51, 0x5a, 0x7d, - 0x40, 0x42, 0x99, 0x1f, 0xb0, 0xb7, 0x63, 0xaf, 0x07, 0x59, 0x88, 0x63, 0xcb, 0xc1, 0x66, 0xeb, 0x7d, 0x2a, 0x53, - 0x11, 0x9f, 0xd5, 0xc5, 0xd9, 0xa6, 0x12, 0x67, 0x75, 0x22, 0xce, 0xbe, 0x83, 0x9c, 0xdf, 0x9d, 0x51, 0xd1, 0x67, - 0x0f, 0x69, 0x9d, 0x14, 0x9b, 0x9a, 0x9e, 0xbc, 0xc1, 0x32, 0xbe, 0x3b, 0x23, 0xae, 0x9a, 0x33, 0x1a, 0xc9, 0x78, - 0x74, 0xf6, 0x21, 0x03, 0x92, 0xd7, 0xb3, 0x74, 0x05, 0x83, 0x77, 0x16, 0xe6, 0xf1, 0x59, 0x29, 0xee, 0xc0, 0xe2, - 0x54, 0x76, 0xbe, 0x07, 0x19, 0x56, 0xe1, 0x1f, 0xe2, 0x0c, 0xa0, 0x5d, 0xcf, 0xd2, 0xfa, 0x2c, 0xad, 0xce, 0xf2, - 0xa2, 0x3e, 0x53, 0x52, 0x38, 0x84, 0xf1, 0xc3, 0x7b, 0xfa, 0xca, 0x2e, 0x6f, 0xb3, 0xb8, 0xcb, 0x22, 0x7f, 0x8a, - 0x5e, 0x45, 0xc4, 0xa4, 0x51, 0x09, 0xaf, 0xdd, 0xdf, 0x36, 0xf7, 0x0f, 0xaf, 0x1b, 0xbb, 0x9f, 0xdd, 0x31, 0xa2, - 0x0b, 0xea, 0xf1, 0x4a, 0x52, 0x2a, 0x28, 0x20, 0x70, 0xa2, 0x59, 0xe3, 0xc1, 0x1d, 0x07, 0xbc, 0x1a, 0xd8, 0x92, - 0xad, 0x7d, 0xfe, 0x22, 0x96, 0x61, 0xda, 0x9b, 0x00, 0xff, 0x2a, 0x7b, 0xd3, 0x75, 0xb0, 0xc4, 0xfb, 0x16, 0xb2, - 0x0d, 0xbd, 0x7d, 0xcd, 0x5f, 0x7a, 0xb9, 0xfa, 0x9b, 0xfd, 0x13, 0x80, 0x30, 0x20, 0x66, 0xd5, 0x47, 0x13, 0xf7, - 0xce, 0xca, 0xb2, 0x73, 0xb2, 0xec, 0x7a, 0xe8, 0xd7, 0x24, 0x46, 0xa5, 0x95, 0xa5, 0x74, 0xb2, 0x94, 0x90, 0x05, - 0x7c, 0x62, 0x34, 0xb5, 0x11, 0x40, 0xd8, 0x8e, 0x52, 0xf9, 0x42, 0xe5, 0x45, 0x14, 0xce, 0x09, 0x9e, 0x27, 0x62, - 0x74, 0x6f, 0x25, 0x03, 0x86, 0x43, 0x08, 0xe6, 0xa0, 0x2d, 0xf6, 0x86, 0x6e, 0x22, 0xfe, 0x7a, 0x53, 0x94, 0x6f, - 0x63, 0xf2, 0x29, 0xd8, 0x9d, 0x7c, 0x5c, 0xc2, 0xe3, 0xf2, 0xe4, 0xe3, 0x10, 0x3d, 0x12, 0x4e, 0x3e, 0x06, 0xdf, - 0x23, 0x39, 0xaf, 0xbb, 0x1e, 0x27, 0xc8, 0x2d, 0xa4, 0xfb, 0xdb, 0x31, 0x09, 0xd0, 0xbc, 0x86, 0xe5, 0xa8, 0xa9, - 0xb8, 0x66, 0x66, 0x8c, 0xe7, 0x8d, 0xde, 0x1f, 0x3b, 0xde, 0x32, 0x85, 0x62, 0x16, 0xf3, 0x1a, 0x7e, 0xcf, 0xaa, - 0x40, 0xdd, 0xf5, 0x36, 0xc9, 0x2d, 0xb3, 0x7a, 0x8e, 0x76, 0xdf, 0xf7, 0x75, 0x22, 0xa8, 0xfd, 0x1d, 0xf6, 0x3c, - 0xb3, 0xde, 0x55, 0x31, 0x70, 0xa9, 0x92, 0x1d, 0x32, 0x55, 0x4d, 0x0f, 0x54, 0x4a, 0x83, 0xa7, 0x97, 0xd6, 0xe5, - 0x4b, 0xa5, 0x8d, 0x3c, 0xd3, 0xfc, 0x06, 0xf0, 0x62, 0xea, 0xb2, 0xd8, 0x7d, 0x75, 0x5f, 0xc1, 0x6d, 0xbc, 0xdf, - 0x5f, 0x56, 0x9e, 0xf9, 0x89, 0x0b, 0xc0, 0xde, 0x54, 0x68, 0x9d, 0x40, 0xa9, 0x61, 0x1d, 0xbe, 0x4a, 0x44, 0xf4, - 0x47, 0xbb, 0x5c, 0x67, 0xae, 0x03, 0x46, 0x14, 0xf1, 0xdb, 0x78, 0xf4, 0x07, 0x28, 0xae, 0x8d, 0x3d, 0x20, 0xac, - 0x43, 0x42, 0x9f, 0x11, 0x80, 0xd4, 0x63, 0x8e, 0x12, 0xd0, 0xac, 0x68, 0xee, 0x98, 0xfc, 0x5c, 0x5f, 0x29, 0xfd, - 0xfd, 0xb2, 0xf2, 0xc8, 0x9c, 0xd2, 0x36, 0xd3, 0x58, 0xad, 0xa9, 0x04, 0xc2, 0x2b, 0x2a, 0x59, 0x85, 0xcf, 0xe6, - 0x8d, 0xe8, 0xf7, 0xe5, 0x11, 0x9e, 0x56, 0x3f, 0x6c, 0x31, 0xbe, 0x15, 0x10, 0x8d, 0x04, 0x40, 0x3f, 0x01, 0xcc, - 0x8b, 0x6c, 0x66, 0xf7, 0x71, 0x40, 0x95, 0x12, 0x4d, 0xe3, 0x6c, 0x9e, 0xdf, 0xd2, 0x9b, 0xb2, 0x83, 0x4e, 0x9d, - 0x2a, 0x70, 0xc1, 0x55, 0xc9, 0x78, 0x65, 0x3d, 0x91, 0xcf, 0x6f, 0x6e, 0x37, 0x69, 0x16, 0xbf, 0x2f, 0xff, 0x89, - 0x63, 0xab, 0xeb, 0xf0, 0xc8, 0xd4, 0xe9, 0xda, 0x79, 0xa4, 0xb5, 0x17, 0x02, 0x22, 0xda, 0x35, 0xd4, 0x7a, 0x61, - 0xa1, 0x47, 0x7a, 0x22, 0x9c, 0x93, 0x44, 0x4d, 0x3b, 0xd0, 0xd2, 0x08, 0x7d, 0x7d, 0xcd, 0xe9, 0x2f, 0x0c, 0xd6, - 0x3e, 0x1f, 0x33, 0x20, 0x2b, 0xd1, 0x8f, 0xd5, 0x43, 0x63, 0x33, 0x87, 0x9e, 0xb5, 0x2a, 0xcf, 0xbc, 0xea, 0x70, - 0x40, 0x7c, 0x18, 0xfd, 0x25, 0xbf, 0xdf, 0x7f, 0x4d, 0xf3, 0x8f, 0x09, 0x35, 0x7e, 0xb6, 0x19, 0xa0, 0x6b, 0xdf, - 0x95, 0x07, 0xa2, 0x9e, 0x6b, 0x95, 0x20, 0xc4, 0x1b, 0xc4, 0x44, 0x33, 0x62, 0x0e, 0x4e, 0x3b, 0xd4, 0xfc, 0x93, - 0xd4, 0x80, 0x10, 0x25, 0x5e, 0xc7, 0x94, 0x05, 0x39, 0x6d, 0xe2, 0x48, 0x3f, 0x0a, 0x27, 0xf2, 0xa3, 0xa8, 0x8a, - 0xec, 0x1e, 0x2e, 0x18, 0x4c, 0xbd, 0xa7, 0xfd, 0x12, 0xfd, 0x96, 0x70, 0xe4, 0x1c, 0xad, 0x0a, 0x41, 0xe4, 0x84, - 0xb0, 0xd6, 0x10, 0x26, 0x88, 0x0d, 0xe2, 0x65, 0xdf, 0x25, 0x19, 0x8e, 0x14, 0x5c, 0xd6, 0xb1, 0x63, 0xcc, 0xd5, - 0x51, 0xf5, 0x1a, 0xc0, 0x78, 0xe5, 0x08, 0x9a, 0x8d, 0x22, 0xbb, 0x84, 0xa8, 0x22, 0xc7, 0x13, 0x50, 0x3b, 0x28, - 0x8d, 0xcd, 0xf4, 0x7c, 0x1c, 0xe4, 0xa3, 0x45, 0x85, 0x3a, 0x27, 0x96, 0xf1, 0x1a, 0x80, 0xb5, 0x73, 0xd5, 0xcf, - 0xb3, 0x1a, 0x3c, 0x69, 0x88, 0xcf, 0xc7, 0x68, 0x7b, 0x65, 0x73, 0x50, 0x6d, 0xa7, 0xb3, 0xf2, 0x8a, 0xe9, 0x72, - 0x60, 0xdc, 0x37, 0xbc, 0xa2, 0x38, 0xc3, 0x8f, 0x1e, 0x6c, 0x71, 0xfe, 0x74, 0x43, 0xed, 0xc7, 0xdc, 0xa8, 0x87, - 0x81, 0xd6, 0x82, 0x37, 0x05, 0xb1, 0xfe, 0x7e, 0xe8, 0xc8, 0xf6, 0x5e, 0x8b, 0x8c, 0x26, 0x9f, 0xfd, 0xfc, 0x43, - 0x99, 0xae, 0x52, 0xb8, 0x2f, 0x39, 0x59, 0x34, 0xf3, 0x10, 0xd8, 0x1b, 0x62, 0xb8, 0x3e, 0x2a, 0x3c, 0xa2, 0xac, - 0xdf, 0x87, 0xdf, 0x57, 0x19, 0x98, 0x62, 0xe0, 0xba, 0x42, 0x30, 0x1e, 0x02, 0x41, 0x3c, 0x4c, 0xa3, 0x93, 0x41, - 0x0d, 0xda, 0xf0, 0x0d, 0x40, 0x66, 0x80, 0x47, 0xe6, 0xd2, 0x23, 0xe0, 0x2e, 0x70, 0xed, 0xc9, 0x78, 0xec, 0x4f, - 0x4c, 0x43, 0xa3, 0xa6, 0x34, 0xd3, 0x73, 0xe3, 0x37, 0x1d, 0xd5, 0x72, 0xed, 0xfc, 0xc7, 0x97, 0xfc, 0x06, 0xbd, - 0xa0, 0xe5, 0xe5, 0x3e, 0x52, 0x97, 0xfb, 0x8c, 0xe2, 0x32, 0x91, 0x1c, 0x16, 0xc4, 0xb2, 0x84, 0x03, 0x8f, 0x51, - 0xc9, 0x62, 0x4b, 0x8f, 0x55, 0xd1, 0xf2, 0x45, 0xb9, 0x41, 0x3a, 0x74, 0x42, 0xb0, 0x44, 0x05, 0xc1, 0x12, 0x18, - 0x17, 0xb1, 0xe6, 0x9b, 0x41, 0xce, 0xe2, 0xd9, 0x66, 0xce, 0x91, 0xb0, 0x2e, 0x39, 0x1c, 0x0a, 0x09, 0x36, 0x93, - 0xcd, 0xd6, 0x73, 0xb6, 0xf6, 0x19, 0x28, 0x01, 0x4a, 0x99, 0x26, 0x28, 0x4d, 0x2b, 0xb6, 0xe2, 0xa6, 0x35, 0x58, - 0xad, 0xa6, 0x6c, 0x55, 0x53, 0x76, 0x4e, 0x53, 0x8e, 0x2a, 0x28, 0x39, 0xa1, 0x14, 0x65, 0x18, 0xc0, 0x88, 0x4d, - 0xa2, 0xab, 0x0c, 0x7d, 0xbc, 0x13, 0x1e, 0x41, 0x15, 0x11, 0xf9, 0x84, 0x21, 0x04, 0x26, 0xa2, 0xb8, 0x50, 0x85, - 0x62, 0x80, 0x8c, 0x48, 0x20, 0x98, 0xa8, 0xd4, 0x29, 0x30, 0x1f, 0x4d, 0x15, 0xc3, 0xa6, 0x3d, 0x51, 0xbe, 0xa5, - 0x8e, 0x7b, 0x94, 0x6d, 0xfe, 0x2e, 0x76, 0x41, 0x88, 0xdc, 0x8d, 0x3b, 0xf5, 0x33, 0xe2, 0xbd, 0xdd, 0x11, 0xc6, - 0x4f, 0x76, 0xdc, 0x22, 0x5c, 0x11, 0x6c, 0xa9, 0xe6, 0x10, 0x8b, 0x79, 0x35, 0x49, 0x50, 0xcb, 0x92, 0xf8, 0x1b, - 0x9e, 0x0c, 0x72, 0xb6, 0x04, 0x0f, 0xda, 0x39, 0xcb, 0x00, 0x7f, 0xc5, 0x6a, 0xd1, 0x6f, 0xb5, 0xb7, 0x04, 0xf9, - 0x69, 0x63, 0x37, 0x0a, 0x13, 0x23, 0x48, 0xd4, 0xed, 0xca, 0x40, 0x7e, 0xf8, 0x80, 0xd3, 0xf1, 0xd8, 0x53, 0xc6, - 0xdc, 0xca, 0xf4, 0x32, 0x9d, 0x2b, 0xf9, 0x46, 0xee, 0xa5, 0x8f, 0xbd, 0x04, 0x3b, 0x07, 0xbc, 0x81, 0xb4, 0x81, - 0x37, 0xb0, 0x5d, 0x78, 0x6d, 0x90, 0x30, 0x23, 0xc0, 0x16, 0xc7, 0xc7, 0x48, 0x09, 0x0c, 0xe1, 0x38, 0x4b, 0x01, - 0x98, 0x46, 0x5f, 0x66, 0x2b, 0xfb, 0x32, 0xab, 0x35, 0x5b, 0x2a, 0xa7, 0x7b, 0xe7, 0xd6, 0xed, 0x7c, 0x22, 0x01, - 0xc0, 0xa4, 0xce, 0x81, 0x38, 0x33, 0xc1, 0x2e, 0x4d, 0x22, 0xcb, 0xc7, 0x30, 0xbf, 0x13, 0x6f, 0xca, 0x62, 0xa5, - 0xba, 0xa2, 0xed, 0x33, 0x93, 0xcf, 0x48, 0x27, 0xa1, 0x02, 0x0a, 0x0a, 0xb9, 0xd6, 0xa7, 0xef, 0xc2, 0x77, 0x41, - 0xa1, 0x81, 0xd9, 0x2a, 0xdc, 0xd3, 0x64, 0x8d, 0xd4, 0x1b, 0x55, 0xbf, 0x4f, 0xae, 0x81, 0x54, 0x67, 0x0e, 0x2d, - 0x7b, 0x52, 0x61, 0x80, 0xd8, 0x51, 0x9f, 0x91, 0x50, 0x07, 0x52, 0x0f, 0x18, 0x42, 0xb4, 0x4d, 0x1f, 0x7f, 0x32, - 0x24, 0xba, 0x00, 0x5b, 0x88, 0x36, 0xf0, 0xe3, 0x4f, 0xb0, 0xcf, 0x82, 0xf0, 0x98, 0xe6, 0xd7, 0x90, 0x74, 0x6c, - 0xe0, 0xb4, 0xfa, 0x14, 0x7c, 0x90, 0xe4, 0x60, 0xa2, 0x0e, 0x5e, 0xee, 0x2f, 0xfd, 0x3e, 0x6c, 0xd9, 0xb9, 0x94, - 0xea, 0x58, 0xa9, 0xb7, 0x6d, 0xed, 0x07, 0xd1, 0x16, 0x1c, 0x59, 0xc4, 0xdf, 0x67, 0x88, 0x08, 0x66, 0x06, 0x11, - 0x76, 0x2d, 0xd4, 0xdd, 0x9e, 0x52, 0xcb, 0xa2, 0xde, 0xf6, 0x94, 0x52, 0xb7, 0x61, 0xf8, 0x6e, 0x82, 0x99, 0xe2, - 0x86, 0xff, 0x91, 0x79, 0xa1, 0xde, 0x78, 0x2c, 0x0a, 0x74, 0xcf, 0xdf, 0x2f, 0x79, 0x35, 0xdb, 0x28, 0x13, 0xe6, - 0x1d, 0x5f, 0xce, 0x42, 0xd9, 0xd5, 0xd2, 0xb8, 0xf3, 0xd9, 0x5b, 0xaa, 0xf9, 0xe0, 0x1f, 0x0e, 0x09, 0xc4, 0x1b, - 0xc5, 0x57, 0x77, 0x8d, 0xdc, 0xba, 0x26, 0x9b, 0xab, 0x12, 0x50, 0xbf, 0xcf, 0xd7, 0xb8, 0xdf, 0x62, 0xfd, 0xbb, - 0xa7, 0x41, 0xc6, 0x6a, 0x86, 0x2b, 0xa6, 0xf0, 0x29, 0x00, 0x0c, 0x0e, 0xa7, 0x82, 0xb4, 0xc0, 0x1b, 0x5e, 0x0e, - 0x2f, 0x27, 0x1b, 0x32, 0xe9, 0x6e, 0x7c, 0xe4, 0xce, 0x02, 0x55, 0xef, 0x37, 0x14, 0x27, 0x0d, 0x12, 0x8d, 0xbd, - 0x06, 0x5f, 0x66, 0x19, 0xe5, 0xa2, 0x89, 0xfb, 0x98, 0x7c, 0xa5, 0x07, 0x30, 0x57, 0xa1, 0x04, 0x88, 0x7e, 0x63, - 0x59, 0x6c, 0x44, 0xdb, 0x62, 0x03, 0x4b, 0xa9, 0x9a, 0xeb, 0xd5, 0xf4, 0xd9, 0x2b, 0xd1, 0xbc, 0x8f, 0x66, 0x9c, - 0xd2, 0x68, 0xc0, 0x71, 0x1a, 0x85, 0xdb, 0xf7, 0xf7, 0xa2, 0x5c, 0x66, 0x60, 0xc9, 0x56, 0xe1, 0x14, 0x97, 0x8d, - 0x3a, 0x23, 0x5e, 0xe6, 0xb1, 0x02, 0xe8, 0x78, 0x4c, 0x00, 0x54, 0x17, 0x04, 0x54, 0x44, 0x4b, 0xe9, 0xad, 0xd0, - 0x62, 0xa1, 0xde, 0x70, 0x94, 0xc2, 0x1f, 0xe9, 0xcf, 0x83, 0x7c, 0x0a, 0x40, 0xec, 0xfa, 0x38, 0x7a, 0x53, 0x94, - 0xf4, 0xa9, 0x62, 0x96, 0xcb, 0xc1, 0x04, 0x76, 0x75, 0x22, 0x43, 0xad, 0x20, 0x6f, 0xd5, 0x95, 0xb7, 0x32, 0x79, - 0x1b, 0xe3, 0x94, 0xfc, 0xc8, 0x4d, 0xc7, 0x1a, 0x31, 0xf0, 0xca, 0xd3, 0x3a, 0x4d, 0x90, 0x26, 0x17, 0xc0, 0x30, - 0xc4, 0xb7, 0x99, 0xf7, 0xd2, 0x73, 0xa4, 0x2a, 0x48, 0x66, 0xbb, 0xcc, 0x53, 0x17, 0x51, 0x7d, 0xe5, 0xd4, 0xd2, - 0x99, 0xd3, 0x8f, 0x00, 0xde, 0x63, 0x6a, 0xd2, 0x90, 0x8f, 0x70, 0x5b, 0x8a, 0xaf, 0xb7, 0xea, 0x1a, 0x2f, 0x8d, - 0xce, 0xdd, 0xcb, 0x97, 0xee, 0x34, 0xe8, 0xa7, 0x20, 0x28, 0xe7, 0xcb, 0x52, 0xc0, 0x9e, 0x32, 0x9b, 0xeb, 0xd5, - 0xaa, 0x15, 0x5a, 0x87, 0xc3, 0x58, 0x3b, 0x0a, 0x69, 0x75, 0x16, 0xb0, 0xd5, 0x48, 0xa7, 0x04, 0x08, 0xc1, 0x71, - 0x1a, 0x76, 0x82, 0x71, 0x97, 0x4e, 0x23, 0xb2, 0x5e, 0x29, 0x49, 0x17, 0x66, 0x90, 0xfc, 0x93, 0xbc, 0x9e, 0x01, - 0x2d, 0x01, 0x1c, 0x8a, 0x58, 0xc2, 0xc3, 0x49, 0x72, 0x05, 0xd0, 0xe9, 0x70, 0x50, 0x69, 0x68, 0xce, 0x6a, 0x96, - 0xcc, 0x27, 0xb1, 0x54, 0x55, 0x1e, 0x0e, 0x9e, 0x72, 0x33, 0xe8, 0xf7, 0xb3, 0x69, 0xa9, 0x5c, 0x00, 0x82, 0x58, - 0x17, 0x06, 0x88, 0x47, 0x5a, 0x78, 0xb2, 0xe8, 0x53, 0x12, 0xbf, 0x9c, 0x25, 0x73, 0x93, 0x0d, 0xef, 0xc0, 0x08, - 0x36, 0xe3, 0xba, 0xa4, 0x4c, 0x7b, 0x54, 0x7e, 0xcf, 0xe8, 0xa9, 0xed, 0x6b, 0xad, 0xb6, 0x88, 0x75, 0x1d, 0x5c, - 0x95, 0xa8, 0xa7, 0xf8, 0xa0, 0x24, 0xc1, 0xfb, 0xb5, 0x73, 0x33, 0x52, 0xbe, 0x16, 0xb9, 0x1f, 0xb4, 0x33, 0xb5, - 0x72, 0xe0, 0x08, 0xe4, 0x58, 0x45, 0x25, 0xaf, 0x77, 0x1d, 0x82, 0x47, 0x77, 0xa5, 0x02, 0xe5, 0xe0, 0x17, 0x20, - 0x46, 0xd7, 0x57, 0x9d, 0x35, 0xd4, 0x4c, 0xa3, 0xca, 0x23, 0xe8, 0xd4, 0x01, 0x3c, 0x29, 0x78, 0xa9, 0xd5, 0x8f, - 0x87, 0x83, 0x67, 0x7e, 0xf0, 0x57, 0x99, 0xbe, 0x85, 0x98, 0x28, 0xa7, 0x1a, 0x21, 0x71, 0xa5, 0x24, 0x11, 0x1f, - 0x2f, 0x5a, 0x56, 0x8c, 0xca, 0xf0, 0x81, 0x57, 0xaa, 0x7c, 0x75, 0xaa, 0xf2, 0x62, 0xa4, 0x6d, 0x09, 0xbc, 0x26, - 0xff, 0x10, 0xb9, 0xe6, 0xad, 0xaf, 0xbb, 0xca, 0xd0, 0x6b, 0x59, 0x81, 0x8e, 0x60, 0x2b, 0x4b, 0xc9, 0x01, 0x9f, - 0x54, 0x77, 0xd5, 0xaa, 0xf5, 0x39, 0x65, 0x1b, 0xe1, 0x26, 0xbf, 0x8e, 0x1d, 0x1c, 0x29, 0xbf, 0xc1, 0x73, 0x01, - 0xec, 0x35, 0x60, 0x6f, 0xce, 0x59, 0xd1, 0x3c, 0x3a, 0xa4, 0x6d, 0x81, 0x46, 0x66, 0x6e, 0xe7, 0xea, 0xbe, 0x2d, - 0x8f, 0xd2, 0x18, 0x22, 0xd3, 0x1e, 0x99, 0x0e, 0x36, 0xa3, 0xfc, 0xb7, 0x94, 0xdf, 0x2a, 0x1c, 0x03, 0xdf, 0x4e, - 0xbd, 0x03, 0xa8, 0x7a, 0xda, 0x20, 0x63, 0xcd, 0x30, 0xb4, 0xb2, 0xcb, 0xa5, 0xd0, 0x12, 0xb4, 0xd4, 0x4d, 0x10, - 0x9c, 0x1f, 0x11, 0xe5, 0x08, 0x40, 0x17, 0x29, 0x60, 0x82, 0x9f, 0xd2, 0x76, 0xf7, 0xfb, 0xeb, 0xd4, 0x23, 0xf7, - 0xae, 0x50, 0xa3, 0x84, 0x12, 0x8c, 0xfd, 0x44, 0x63, 0x06, 0x1d, 0x5d, 0x91, 0x13, 0x9e, 0xb5, 0x3a, 0xac, 0xeb, - 0xa6, 0x0c, 0xca, 0xe2, 0x98, 0x57, 0xd3, 0xd9, 0xef, 0x4f, 0xf6, 0x75, 0x83, 0x2c, 0xe4, 0xbf, 0xb3, 0x1e, 0x92, - 0x41, 0xf7, 0x20, 0x14, 0xa2, 0x37, 0x0f, 0x66, 0xf8, 0x1f, 0xdb, 0xf0, 0xec, 0x1b, 0x6e, 0xd4, 0x09, 0x60, 0x8e, - 0xb8, 0x5e, 0x7a, 0x8a, 0xb6, 0x1e, 0x6e, 0x81, 0x6c, 0x8d, 0x97, 0xb7, 0xf6, 0x1a, 0xc8, 0x29, 0x8e, 0xff, 0x8e, - 0x67, 0x6a, 0x65, 0x83, 0x9f, 0x9e, 0xb2, 0x1d, 0x78, 0x78, 0x11, 0x02, 0x8a, 0x61, 0xd9, 0xf8, 0x3b, 0xcb, 0x71, - 0x46, 0xff, 0xcd, 0x23, 0x86, 0xc1, 0x22, 0xf2, 0xe3, 0xcb, 0x52, 0x88, 0x2f, 0xc2, 0x7b, 0x5b, 0x79, 0x77, 0xe4, - 0x94, 0x79, 0xa7, 0x87, 0xd1, 0x75, 0x49, 0xfa, 0x26, 0xf9, 0xd8, 0x1a, 0xb6, 0xdf, 0xb5, 0xfb, 0xcd, 0x10, 0x41, - 0x08, 0xe5, 0xf8, 0x39, 0xa3, 0x13, 0x1a, 0x1f, 0x56, 0xb3, 0xd3, 0xeb, 0xf7, 0xce, 0xf1, 0x82, 0xad, 0xd1, 0x00, - 0x8f, 0x87, 0x2e, 0xe6, 0x89, 0x1a, 0x3a, 0x5d, 0xd7, 0xce, 0xc1, 0x03, 0x83, 0x2c, 0x4f, 0xbe, 0x61, 0x58, 0x62, - 0x7f, 0x12, 0xf1, 0xa4, 0xad, 0xda, 0xd8, 0x1c, 0xa9, 0x36, 0x6a, 0x06, 0x7e, 0xf0, 0x0a, 0x0a, 0x8c, 0x2e, 0x48, - 0x2b, 0x30, 0x0e, 0x47, 0x00, 0xb2, 0x62, 0x1c, 0x8f, 0x0c, 0x26, 0x30, 0xa4, 0x1b, 0x8a, 0x02, 0xf0, 0xf0, 0x38, - 0x1e, 0x84, 0x0c, 0x20, 0x5d, 0xf0, 0xd0, 0xb0, 0x4d, 0x42, 0xca, 0xcf, 0xf3, 0xbc, 0x56, 0x43, 0xe8, 0x3b, 0x0b, - 0xd5, 0xb1, 0x1f, 0x69, 0xaf, 0x58, 0xd7, 0xaa, 0x74, 0x64, 0xab, 0x03, 0xf4, 0x0d, 0x19, 0xf8, 0xd6, 0xb1, 0x05, - 0x40, 0xb4, 0xc4, 0x6f, 0xa9, 0x57, 0xfb, 0x32, 0x66, 0x85, 0x7a, 0x7d, 0x61, 0xda, 0xf5, 0x5a, 0x5a, 0x14, 0x50, - 0x71, 0xdb, 0xaa, 0xed, 0x91, 0x9c, 0xff, 0xf8, 0xae, 0xa3, 0x1d, 0x9f, 0x9d, 0x1a, 0x5b, 0x42, 0x99, 0x5b, 0x3c, - 0x91, 0xd5, 0xd1, 0x96, 0xea, 0x54, 0x1f, 0x70, 0xa9, 0x49, 0x75, 0x66, 0x60, 0x78, 0x8d, 0x00, 0xe5, 0x16, 0x22, - 0x69, 0x1c, 0xf6, 0xce, 0x27, 0x83, 0x82, 0xb9, 0x45, 0x02, 0x12, 0xd8, 0xc6, 0xd6, 0x2e, 0x9a, 0xeb, 0xd7, 0x6f, - 0xa9, 0x57, 0xb5, 0xa9, 0xea, 0xc1, 0x1b, 0x2f, 0x70, 0xf6, 0x4e, 0x6b, 0x01, 0x01, 0x14, 0xb6, 0x96, 0xe5, 0xe0, - 0xdc, 0xed, 0xaa, 0x96, 0x8a, 0x32, 0xea, 0xf7, 0xcf, 0x7f, 0x4b, 0x51, 0x11, 0x7b, 0xaa, 0x38, 0x65, 0xfd, 0x76, - 0xcb, 0x5c, 0x54, 0x96, 0xbc, 0x41, 0x15, 0xad, 0xd5, 0x51, 0x53, 0xb9, 0x6e, 0xae, 0x5a, 0x32, 0x41, 0x8c, 0xee, - 0xd3, 0xb5, 0xce, 0x9d, 0x7a, 0xef, 0x55, 0x1c, 0x31, 0x10, 0xdc, 0x74, 0x8f, 0x0f, 0x0e, 0x42, 0xa3, 0xa2, 0x5c, - 0x70, 0xa3, 0xb4, 0xaa, 0xa4, 0x14, 0xf2, 0x56, 0x45, 0x73, 0xa6, 0x8f, 0x00, 0x88, 0x00, 0xab, 0x44, 0xfd, 0x1f, - 0xbe, 0x34, 0xc6, 0x83, 0x07, 0xbe, 0x26, 0xd7, 0xb1, 0xf5, 0xfe, 0x69, 0x8d, 0xb4, 0xda, 0x38, 0x26, 0xb5, 0xea, - 0x65, 0xab, 0x78, 0xd9, 0xbd, 0x4e, 0xc5, 0xe0, 0xf9, 0xff, 0xdc, 0x07, 0xa8, 0x11, 0x2d, 0x65, 0x70, 0xeb, 0x6a, - 0x80, 0xc6, 0x87, 0x63, 0xe1, 0x1b, 0x3f, 0x64, 0x9c, 0x0f, 0x66, 0xe8, 0xa8, 0x36, 0x07, 0x07, 0x04, 0x47, 0x75, - 0x8f, 0xc6, 0x84, 0x59, 0x38, 0xf7, 0x20, 0x50, 0x7d, 0xe2, 0x3e, 0xe3, 0xda, 0x0b, 0xda, 0x04, 0x3e, 0x59, 0xd7, - 0x35, 0x45, 0x80, 0x8b, 0xd8, 0x98, 0x88, 0x21, 0x2e, 0x9b, 0x44, 0xea, 0x9b, 0x31, 0x28, 0x00, 0x8a, 0x17, 0x15, - 0xc9, 0xa5, 0x8b, 0x34, 0xaf, 0x44, 0x59, 0xeb, 0x66, 0x54, 0xac, 0x18, 0x02, 0xc0, 0x43, 0x50, 0x5c, 0x55, 0x66, - 0x42, 0x23, 0x36, 0x90, 0xca, 0x52, 0xb0, 0x6a, 0x58, 0xf8, 0x4d, 0xfb, 0x4d, 0x72, 0xd2, 0x3b, 0x1f, 0xb7, 0xce, - 0x1d, 0xfb, 0xde, 0x51, 0x48, 0x69, 0x0f, 0xc5, 0x04, 0x41, 0xf0, 0xd3, 0x3a, 0x9c, 0x3f, 0xe3, 0x2f, 0x08, 0x4c, - 0x45, 0x36, 0x63, 0xc0, 0x41, 0x88, 0xc8, 0x8c, 0xdf, 0x73, 0xf8, 0x82, 0x97, 0x93, 0x70, 0x38, 0xf4, 0x41, 0x1f, - 0xca, 0xb3, 0x59, 0x38, 0x14, 0x73, 0xe9, 0xbd, 0x0e, 0xd6, 0xba, 0x90, 0xd7, 0x93, 0x10, 0xd1, 0x42, 0x43, 0x1f, - 0x9c, 0xd7, 0x5d, 0x73, 0x84, 0x25, 0x00, 0x4d, 0x1c, 0x7d, 0x59, 0xbf, 0x1f, 0x79, 0xda, 0xd0, 0x22, 0xc5, 0x45, - 0xa3, 0xcc, 0x66, 0xb9, 0xec, 0x84, 0x8d, 0x6b, 0xb7, 0x40, 0x28, 0x1e, 0xa6, 0x2d, 0x54, 0xad, 0xa7, 0x7a, 0x3d, - 0x37, 0xed, 0xbe, 0x7b, 0x54, 0xad, 0x72, 0xa4, 0xb3, 0x36, 0x5d, 0xa9, 0xd5, 0x2d, 0xa3, 0x6a, 0x9d, 0xa5, 0x11, - 0x55, 0x6e, 0x92, 0xbb, 0x46, 0x2d, 0xf8, 0x64, 0x43, 0x97, 0x29, 0x3b, 0x5b, 0x83, 0x13, 0x47, 0x9e, 0x4b, 0x6e, - 0xf9, 0xee, 0xbc, 0xa2, 0xbb, 0x53, 0xed, 0x5b, 0x80, 0x7b, 0x33, 0x6c, 0xc8, 0x9c, 0xd7, 0xd8, 0x69, 0x10, 0x26, - 0x81, 0x1f, 0xb1, 0x8f, 0x19, 0xb2, 0xc1, 0x80, 0x8e, 0x42, 0xfa, 0x5f, 0x5b, 0xe6, 0x48, 0xc0, 0xe4, 0xaf, 0xe7, - 0x7e, 0xb3, 0x28, 0x72, 0x58, 0x8c, 0x1f, 0x36, 0x18, 0x69, 0xac, 0xd6, 0x60, 0x58, 0xde, 0x21, 0xf2, 0xa7, 0x76, - 0xc7, 0x34, 0xd5, 0xf1, 0x66, 0xbd, 0xd6, 0xfc, 0xea, 0xe9, 0x53, 0x5d, 0x9f, 0xff, 0xf6, 0xfd, 0x65, 0x58, 0x33, - 0xfb, 0x43, 0x10, 0x4a, 0xbb, 0x77, 0x8b, 0x73, 0x47, 0xa2, 0x77, 0xac, 0x34, 0xb3, 0x4b, 0xbb, 0x64, 0x97, 0xa6, - 0xb4, 0x1b, 0x72, 0xbd, 0xfa, 0x4a, 0x79, 0x63, 0xe7, 0x15, 0xd3, 0xfd, 0x7b, 0xa1, 0x77, 0x94, 0x53, 0x35, 0x81, - 0x88, 0x26, 0xed, 0x48, 0xdc, 0xee, 0x95, 0xe1, 0xf3, 0x49, 0xde, 0x2e, 0xe1, 0xa8, 0x6b, 0x58, 0x6e, 0xbe, 0xfd, - 0xcf, 0xbc, 0xea, 0xac, 0x70, 0xfb, 0xa5, 0x31, 0x6b, 0x7f, 0x0a, 0xe2, 0xaa, 0xfe, 0xf0, 0x9e, 0xd4, 0x4c, 0xc9, - 0xff, 0x55, 0x8f, 0x81, 0xab, 0x9f, 0x4c, 0x3b, 0xba, 0xa7, 0x10, 0x36, 0x98, 0xfd, 0xfc, 0xf8, 0xa1, 0x05, 0xab, - 0xea, 0x02, 0x45, 0x72, 0x00, 0x9d, 0xbb, 0x64, 0x84, 0xf7, 0x3b, 0xc6, 0xb9, 0x7f, 0xf5, 0xbd, 0x9a, 0x1c, 0x21, - 0xa2, 0x5d, 0x84, 0x03, 0x80, 0xb8, 0xd3, 0x54, 0xd6, 0xa1, 0x06, 0xe8, 0x03, 0x02, 0xeb, 0xd0, 0xb7, 0x19, 0xc0, - 0x41, 0x1f, 0x6d, 0x9e, 0x45, 0x20, 0xaf, 0x7b, 0xf7, 0xec, 0x9a, 0xed, 0x7c, 0xfe, 0x62, 0x95, 0x7a, 0xf7, 0xe8, - 0x10, 0x7c, 0x3e, 0xf6, 0xa7, 0x97, 0x81, 0xc1, 0x85, 0x66, 0xd7, 0xcf, 0x04, 0xdb, 0xb1, 0xdd, 0x33, 0x44, 0x2a, - 0xea, 0xce, 0x3f, 0xbc, 0x34, 0xd1, 0xf3, 0xce, 0x0b, 0x77, 0x7c, 0x09, 0xe0, 0x81, 0x2c, 0x06, 0x14, 0x9f, 0xa5, - 0xf7, 0x2f, 0x96, 0x80, 0x9a, 0xfc, 0x96, 0xaf, 0xbd, 0x2f, 0x94, 0xba, 0x80, 0x3f, 0x07, 0x94, 0x3e, 0xc9, 0xb9, - 0x77, 0x37, 0xbc, 0xf5, 0x2f, 0x9e, 0x83, 0xf3, 0xc4, 0x6a, 0xb8, 0x80, 0xbf, 0x0a, 0x3e, 0xf4, 0xee, 0x06, 0x98, - 0x58, 0xf2, 0xa1, 0xb7, 0x1a, 0x40, 0xaa, 0xc2, 0x85, 0xc4, 0xd8, 0x87, 0x5f, 0x83, 0x9c, 0xe1, 0x1f, 0xbf, 0x69, - 0x0c, 0xd6, 0x5f, 0x83, 0x42, 0xa3, 0xb1, 0x96, 0x2a, 0x64, 0x29, 0x16, 0x67, 0x02, 0x6c, 0xc2, 0x71, 0xb7, 0x2f, - 0x56, 0xb5, 0x59, 0x0b, 0xfa, 0xf3, 0x11, 0xdf, 0xa3, 0xb1, 0xba, 0x2a, 0xe7, 0xa2, 0xfc, 0x88, 0xf4, 0xa9, 0x8e, - 0x8f, 0x51, 0xb1, 0xa9, 0xbb, 0xd3, 0xa9, 0x56, 0x1d, 0x69, 0xbf, 0x29, 0xd7, 0x60, 0xc7, 0xeb, 0xe4, 0xc8, 0x52, - 0x78, 0xd6, 0x61, 0xe7, 0xa5, 0x53, 0xa2, 0xc3, 0x30, 0xde, 0x6d, 0xd5, 0x33, 0x86, 0xf2, 0xdc, 0x60, 0x4c, 0x17, - 0x3c, 0xe2, 0x2f, 0x06, 0xb9, 0x0c, 0x8d, 0xf9, 0x80, 0x6c, 0x18, 0xca, 0x87, 0x16, 0x19, 0x12, 0x22, 0xde, 0x43, - 0x25, 0x60, 0xdb, 0x82, 0x32, 0x29, 0xe0, 0x2c, 0x1a, 0xfc, 0x56, 0x7b, 0x39, 0xf0, 0x1e, 0x44, 0x7e, 0x23, 0x5d, - 0xca, 0x25, 0x36, 0x3a, 0x71, 0x2c, 0x0b, 0xed, 0x3c, 0xae, 0xbf, 0x8e, 0x41, 0xfd, 0x5e, 0xe9, 0x37, 0x28, 0x67, - 0x7f, 0x94, 0xac, 0xd3, 0xc6, 0x13, 0xe3, 0x1f, 0xae, 0xf2, 0x4f, 0xd1, 0x52, 0x0f, 0xff, 0x9f, 0x31, 0x85, 0xd2, - 0xbf, 0x4a, 0xcb, 0x68, 0xb3, 0x5a, 0x8a, 0x52, 0xe4, 0x91, 0x38, 0xf9, 0x5a, 0x64, 0xe7, 0xf2, 0x9d, 0x4f, 0xa1, - 0x5f, 0x00, 0x5a, 0xf6, 0x09, 0x32, 0xfa, 0x7b, 0x26, 0xf8, 0xf0, 0x7b, 0xed, 0x5c, 0x9b, 0xf3, 0xf1, 0x24, 0xbf, - 0xb2, 0xf6, 0x6e, 0xc7, 0x8b, 0xc4, 0x28, 0xc6, 0x72, 0x5f, 0x75, 0xb3, 0x72, 0xa2, 0x92, 0x03, 0x23, 0x5d, 0x93, - 0xbd, 0x5c, 0xc9, 0xba, 0x9d, 0x6e, 0x25, 0x10, 0x51, 0x05, 0xde, 0x63, 0x5c, 0xc5, 0x3e, 0x82, 0xe9, 0xba, 0xe3, - 0x32, 0xda, 0xf1, 0x9e, 0xf1, 0xea, 0x44, 0x59, 0xc1, 0xed, 0x46, 0xb4, 0x27, 0x74, 0xf4, 0xd3, 0xa4, 0xb6, 0x2c, - 0x1c, 0x80, 0xdc, 0x25, 0x8c, 0x65, 0x43, 0xb0, 0x62, 0x50, 0xfa, 0x7a, 0x4d, 0xc9, 0xb2, 0x00, 0x8b, 0xce, 0x2e, - 0x23, 0x10, 0xc3, 0xba, 0x69, 0x4e, 0xe8, 0x78, 0xe9, 0xe2, 0xbc, 0xd7, 0x2a, 0x52, 0xf0, 0x8c, 0x16, 0x1d, 0x73, - 0xd3, 0x91, 0x6e, 0x8c, 0xf6, 0xf6, 0x7b, 0x83, 0x90, 0xe2, 0xf9, 0x03, 0x5b, 0xad, 0x8b, 0x8b, 0xc4, 0x2b, 0x64, - 0xa2, 0x05, 0xb1, 0x14, 0x81, 0x19, 0x2f, 0x34, 0x8d, 0x30, 0x41, 0x99, 0x12, 0x2c, 0x5a, 0xa3, 0x43, 0xfb, 0xc3, - 0x12, 0x76, 0x8f, 0x31, 0x02, 0x04, 0xaa, 0x4c, 0x9f, 0xc3, 0xd6, 0x84, 0xd9, 0xd4, 0xc5, 0x06, 0x68, 0xab, 0x18, - 0x1a, 0x84, 0xb5, 0x21, 0xe6, 0x63, 0x9a, 0xdf, 0xfd, 0x0b, 0x8b, 0xb1, 0x3d, 0x81, 0xd8, 0xde, 0xed, 0x9a, 0x84, - 0xe9, 0x5e, 0x8b, 0x1b, 0xeb, 0xe5, 0xf6, 0x94, 0x63, 0x6a, 0xc7, 0xda, 0xa8, 0x1d, 0x6b, 0xa9, 0x77, 0xac, 0xb5, - 0xde, 0xb1, 0xee, 0x1a, 0xfe, 0x21, 0xf3, 0x62, 0x96, 0x80, 0x7e, 0x77, 0xc5, 0x55, 0x83, 0xa0, 0x19, 0x1b, 0x76, - 0x0b, 0xbf, 0x25, 0xd6, 0x6e, 0xe9, 0x5f, 0x2c, 0xd9, 0xc2, 0xf4, 0x81, 0x6e, 0x1d, 0x60, 0x19, 0x51, 0x93, 0xef, - 0x91, 0x77, 0xd3, 0x59, 0x51, 0xb8, 0x3d, 0xb1, 0x85, 0xcf, 0xae, 0xcd, 0x9b, 0xf7, 0xcf, 0x22, 0xc8, 0xbd, 0xe3, - 0xde, 0xfd, 0xf0, 0xda, 0xbf, 0xd0, 0x2d, 0x90, 0x93, 0x59, 0xce, 0x40, 0xea, 0x88, 0x4f, 0x10, 0xad, 0xec, 0x29, - 0xdf, 0x09, 0xb9, 0xb3, 0xad, 0x9f, 0xdd, 0xbb, 0xdb, 0xda, 0xdd, 0xb3, 0x7b, 0x56, 0x8d, 0x28, 0x56, 0x9c, 0xa6, - 0x48, 0x98, 0x45, 0x1b, 0xe0, 0xa9, 0x97, 0xef, 0x77, 0xec, 0x98, 0xc3, 0xdd, 0xb3, 0x8e, 0x8e, 0x97, 0x73, 0xc0, - 0xee, 0xfe, 0xa3, 0x4d, 0xd8, 0x58, 0xe9, 0x5a, 0x85, 0x0e, 0x77, 0xcf, 0x32, 0x8d, 0xe7, 0x70, 0x24, 0x9f, 0x8e, - 0x35, 0x36, 0x08, 0xea, 0xfa, 0x9c, 0x41, 0xed, 0xd8, 0x7d, 0x4d, 0xd8, 0x65, 0xc7, 0xbc, 0xd6, 0x35, 0x6f, 0xaf, - 0x3c, 0x15, 0x1b, 0x02, 0x3a, 0x7c, 0xad, 0x6e, 0x90, 0x7f, 0x09, 0x9c, 0x22, 0x00, 0xe4, 0x70, 0xbc, 0xe4, 0xb1, - 0xef, 0xd3, 0x2c, 0xad, 0x77, 0xa8, 0xb5, 0xa8, 0x2c, 0xcb, 0xb0, 0xf6, 0x7e, 0xd0, 0x8a, 0x61, 0xa9, 0xe9, 0x9f, - 0x8e, 0x03, 0xb7, 0xb3, 0xdd, 0xca, 0xd8, 0x65, 0x3c, 0x2b, 0x2e, 0xbe, 0x3f, 0x2d, 0x94, 0x6b, 0x37, 0x6f, 0xe3, - 0x37, 0xad, 0x96, 0x2c, 0xad, 0xf5, 0x90, 0x97, 0x96, 0x45, 0x04, 0x02, 0x18, 0x8e, 0x94, 0x5d, 0x2c, 0xe1, 0x1e, - 0x61, 0x75, 0x0f, 0x42, 0xc9, 0xbc, 0x70, 0xf1, 0x9c, 0xc5, 0x90, 0x08, 0xb0, 0xdd, 0xa1, 0x62, 0x5b, 0xb8, 0x78, - 0xce, 0x36, 0xbc, 0xe8, 0xf7, 0x33, 0xd5, 0x29, 0x64, 0xdd, 0x59, 0xf2, 0x8d, 0x6a, 0x8e, 0x35, 0xd4, 0x6c, 0x6d, - 0x92, 0xad, 0x71, 0x6e, 0x2b, 0x3e, 0xee, 0xda, 0x8a, 0x8f, 0x95, 0xb5, 0x2e, 0xdd, 0xeb, 0x3d, 0xaa, 0x0b, 0x60, - 0xeb, 0xbf, 0x3d, 0x5e, 0xb9, 0x9e, 0xcf, 0x08, 0xe0, 0x6b, 0xc1, 0xc7, 0x93, 0x05, 0x7a, 0x95, 0x2c, 0xfc, 0xdb, - 0x81, 0x1a, 0x7f, 0xa7, 0x73, 0x17, 0x00, 0x5d, 0x49, 0x79, 0x05, 0xe4, 0x1d, 0xe4, 0x98, 0x5b, 0x76, 0xe5, 0xfd, - 0xc9, 0x77, 0xd8, 0x35, 0xaf, 0x67, 0x8b, 0x39, 0xdb, 0x81, 0x53, 0x41, 0x32, 0xb0, 0x97, 0x15, 0xdb, 0x05, 0xb1, - 0x9d, 0xf0, 0x1b, 0x01, 0x53, 0xbe, 0x84, 0x20, 0xae, 0xe0, 0x16, 0xe2, 0xf0, 0xe4, 0x9f, 0x83, 0xfb, 0xd6, 0x66, - 0x7d, 0xcf, 0xac, 0xce, 0x09, 0xd6, 0xcc, 0xea, 0xc1, 0x60, 0xd9, 0x4c, 0x56, 0xfd, 0xbe, 0xb7, 0xd3, 0x8e, 0x4f, - 0x77, 0x52, 0x27, 0x76, 0x5a, 0xab, 0xb5, 0x60, 0xd7, 0x52, 0xeb, 0x62, 0x0c, 0x3d, 0x40, 0xfc, 0x74, 0x3b, 0xe0, - 0xf7, 0x1d, 0x6b, 0xcb, 0xbb, 0x66, 0x0b, 0xb6, 0x83, 0x4b, 0x50, 0xd3, 0x5e, 0xf6, 0x27, 0x95, 0x0b, 0xda, 0xb1, - 0x4b, 0xe2, 0xe1, 0x8c, 0x59, 0xa5, 0xcc, 0xac, 0x93, 0xea, 0x4a, 0x74, 0xc6, 0x74, 0xd6, 0x7a, 0x3e, 0x57, 0xf3, - 0x49, 0xa1, 0x41, 0xfd, 0xce, 0x89, 0x8f, 0xa8, 0xe8, 0x3c, 0x81, 0xad, 0x65, 0x05, 0xb1, 0xda, 0xe7, 0x60, 0xad, - 0xd5, 0x2e, 0xfd, 0x5e, 0x3e, 0xe0, 0x36, 0xe5, 0xb0, 0x0e, 0x0c, 0x6a, 0x4e, 0xac, 0xa8, 0xc7, 0x6c, 0xc7, 0xb8, - 0xf9, 0xe9, 0xe5, 0x0f, 0x4e, 0x58, 0xb2, 0x62, 0xb5, 0x3f, 0xfd, 0xfe, 0x99, 0xa7, 0xbf, 0x53, 0xfb, 0x17, 0xc2, - 0x0f, 0xc6, 0xff, 0xa9, 0xdd, 0xd7, 0x5a, 0x8c, 0xca, 0x56, 0x39, 0x42, 0xe3, 0x6e, 0x25, 0x4d, 0x96, 0x9f, 0x84, - 0x27, 0xac, 0x05, 0xcf, 0x72, 0xbd, 0x44, 0xb3, 0x02, 0x56, 0x58, 0xcb, 0x24, 0x5c, 0x61, 0xac, 0x96, 0xb6, 0xfa, - 0x16, 0x4d, 0x73, 0x7c, 0x38, 0xd7, 0x06, 0x65, 0xca, 0xd9, 0x19, 0xb1, 0x1a, 0x2e, 0xc3, 0xd2, 0x84, 0x22, 0x64, - 0xf7, 0x76, 0x70, 0x63, 0xa7, 0x2c, 0xa5, 0x0c, 0xe7, 0x18, 0x4c, 0x78, 0x24, 0x46, 0x55, 0xbe, 0xbf, 0x2f, 0x29, - 0x72, 0xda, 0x96, 0x83, 0x2a, 0x84, 0x7d, 0x24, 0x51, 0x02, 0xb7, 0x22, 0x2d, 0x14, 0x29, 0x8b, 0xbf, 0x1d, 0xa0, - 0x0b, 0xbc, 0x80, 0xba, 0x1a, 0x75, 0xfb, 0xc3, 0x11, 0x0f, 0x1f, 0x99, 0xfa, 0xc0, 0x88, 0x25, 0x81, 0xda, 0x5e, - 0x66, 0xe9, 0x1d, 0xa8, 0xf0, 0x7b, 0xb8, 0x9a, 0x88, 0xfd, 0xdc, 0x92, 0xa2, 0x22, 0x1b, 0xe9, 0x0d, 0xad, 0xc1, - 0x23, 0xb4, 0xa6, 0x7c, 0xef, 0xa4, 0xda, 0xa4, 0xf3, 0x8e, 0x90, 0x63, 0xf5, 0xad, 0x25, 0x8c, 0x76, 0x45, 0x2f, - 0xee, 0x1d, 0xbd, 0xe7, 0xe9, 0xaa, 0xe7, 0xfe, 0xc4, 0x15, 0xf3, 0xe4, 0x36, 0x02, 0x75, 0x2b, 0xa8, 0x6e, 0xef, - 0x55, 0x82, 0x05, 0x4b, 0xda, 0x7d, 0xfc, 0x76, 0xd6, 0x0e, 0x44, 0x65, 0xac, 0xd2, 0xd7, 0x24, 0x61, 0x4f, 0x0c, - 0x3a, 0x85, 0xaa, 0xdc, 0xee, 0x8e, 0xb6, 0xc0, 0x75, 0xcc, 0x52, 0xf4, 0xd2, 0x16, 0xb9, 0x5b, 0xfe, 0xdd, 0x73, - 0x45, 0xce, 0x7e, 0x09, 0x08, 0x4e, 0xcd, 0x57, 0xc4, 0x97, 0x23, 0x3c, 0xaa, 0x6e, 0x81, 0xe3, 0xf4, 0x1d, 0xc0, - 0x3f, 0x1c, 0x2e, 0x41, 0x13, 0x10, 0x0b, 0xd6, 0x4b, 0xe3, 0x1e, 0xeb, 0xc5, 0xc5, 0xe6, 0x2e, 0xc9, 0x37, 0xe0, - 0xcc, 0x40, 0xa9, 0x96, 0x7e, 0xe0, 0x58, 0x2d, 0xa0, 0xc2, 0xc1, 0xec, 0xa4, 0x5e, 0x58, 0x46, 0x3d, 0xa6, 0xcf, - 0xcf, 0x60, 0xef, 0x08, 0x09, 0x80, 0xfb, 0x65, 0x1f, 0x90, 0x80, 0x87, 0xce, 0xec, 0x80, 0x70, 0xc2, 0x2c, 0xaa, - 0x02, 0x89, 0xe4, 0x48, 0x3f, 0x7b, 0xcc, 0x44, 0xf2, 0x07, 0xb3, 0x9e, 0x73, 0x4a, 0xf4, 0x58, 0x4f, 0x1d, 0x21, - 0x3d, 0xd6, 0xb3, 0x8e, 0x88, 0x1e, 0xeb, 0x59, 0xc7, 0x47, 0x8f, 0xf5, 0xcc, 0xb1, 0xd3, 0x83, 0xc0, 0x04, 0x88, - 0x3c, 0x60, 0x3d, 0x9a, 0x4c, 0x3d, 0xc5, 0x3d, 0x40, 0x34, 0x08, 0xac, 0x27, 0x85, 0xf3, 0x1e, 0x20, 0x8f, 0x91, - 0x58, 0x1d, 0xf4, 0xfe, 0x32, 0x7e, 0xda, 0x33, 0x32, 0xf2, 0xb8, 0x75, 0x58, 0xfd, 0xaf, 0xbf, 0x42, 0x00, 0x1c, - 0x9e, 0x4d, 0xbd, 0xcb, 0x31, 0x64, 0x95, 0x65, 0x04, 0x92, 0x9f, 0x18, 0x7c, 0xf9, 0x02, 0xa0, 0xea, 0x33, 0x5d, - 0xab, 0xc9, 0x51, 0x7b, 0xcc, 0xa1, 0x2b, 0x06, 0x80, 0x6d, 0x58, 0xa2, 0xaa, 0x16, 0x36, 0x61, 0x71, 0xfb, 0x19, - 0x46, 0x73, 0xd9, 0xf4, 0x82, 0x06, 0xea, 0x11, 0x82, 0x5f, 0x5a, 0x0f, 0xad, 0xb5, 0x4c, 0x39, 0x74, 0x6d, 0x14, - 0x55, 0x36, 0xd4, 0x25, 0xac, 0xd6, 0x22, 0xaa, 0x89, 0x22, 0xe5, 0x92, 0x51, 0x14, 0x4b, 0x15, 0xec, 0x33, 0x71, - 0x07, 0x51, 0xf3, 0xb4, 0xd5, 0x56, 0xc1, 0xfe, 0x0e, 0x10, 0xd6, 0xc2, 0x5a, 0x48, 0x67, 0x50, 0x7b, 0xa7, 0x1f, - 0x29, 0x7f, 0x79, 0x21, 0xb7, 0x73, 0x0b, 0x45, 0xb8, 0x3d, 0x07, 0xe5, 0x4d, 0x5d, 0x95, 0x8a, 0x68, 0xb4, 0x04, - 0x4a, 0x99, 0x13, 0x44, 0x16, 0x20, 0x80, 0xe3, 0x06, 0x02, 0x9f, 0xd7, 0xf8, 0x04, 0x1a, 0x85, 0x40, 0x7e, 0x60, - 0x15, 0xae, 0x3d, 0xa4, 0xa5, 0xd6, 0x88, 0x28, 0x11, 0x3f, 0xba, 0x7a, 0x8e, 0xed, 0xab, 0xa7, 0xb1, 0xb6, 0x94, - 0x26, 0x88, 0x9f, 0x58, 0x6c, 0x21, 0x26, 0x88, 0xea, 0x10, 0x1d, 0xc1, 0x72, 0x42, 0x88, 0xc2, 0x1f, 0x42, 0x3f, - 0x35, 0xf0, 0x97, 0x6c, 0x59, 0xe4, 0x35, 0xc1, 0x62, 0x56, 0x0c, 0xd0, 0xaa, 0x08, 0x3c, 0xd3, 0xd9, 0x52, 0x99, - 0xd3, 0x3c, 0x3a, 0xb2, 0x83, 0xf3, 0xae, 0x83, 0xbd, 0xf4, 0x65, 0xec, 0x64, 0xd9, 0x34, 0x6a, 0x63, 0x43, 0x24, - 0xbc, 0x22, 0x7f, 0x95, 0xa5, 0xc6, 0x39, 0x32, 0x97, 0xeb, 0xbb, 0x2e, 0xee, 0xee, 0x68, 0x9b, 0xb0, 0x0a, 0x11, - 0xea, 0xb6, 0xa1, 0x72, 0x29, 0xcc, 0xc6, 0xa6, 0x69, 0x80, 0x2f, 0x14, 0x95, 0x4a, 0x55, 0x6a, 0x2b, 0x95, 0x9c, - 0xf0, 0xae, 0xaf, 0x6a, 0x91, 0xba, 0x22, 0xd8, 0xc6, 0x0c, 0xf5, 0x50, 0x6e, 0xd4, 0xd8, 0xd7, 0x1d, 0xab, 0xf4, - 0x0e, 0x13, 0xe4, 0x8c, 0xbc, 0xc8, 0xc1, 0x45, 0x49, 0x41, 0xe6, 0x6a, 0x08, 0xf3, 0x47, 0x0d, 0x9f, 0x16, 0x96, - 0x7b, 0x28, 0x01, 0xb3, 0xa3, 0x86, 0x97, 0x11, 0x02, 0x11, 0x97, 0xca, 0xbe, 0x62, 0xe2, 0xf7, 0x14, 0xcc, 0x92, - 0x09, 0xdd, 0x8b, 0x58, 0x18, 0xa1, 0x8d, 0x4f, 0x92, 0x64, 0xea, 0x69, 0x0a, 0x6e, 0xe4, 0x32, 0xcc, 0xd1, 0x08, - 0x2d, 0xf9, 0xc8, 0x81, 0xf4, 0xb5, 0x9c, 0x4a, 0xf0, 0x11, 0x75, 0x0a, 0x38, 0x9e, 0x9f, 0x17, 0xd6, 0x4f, 0x96, - 0x4b, 0xcc, 0x65, 0x6d, 0xfe, 0xcb, 0x8e, 0x8e, 0xc1, 0x2e, 0x4f, 0x13, 0xc7, 0xd5, 0x7f, 0x54, 0x25, 0xc5, 0xc3, - 0xcf, 0x69, 0x0e, 0x28, 0x82, 0x99, 0x3d, 0xc5, 0xf8, 0xd8, 0x67, 0x99, 0x02, 0xfe, 0x76, 0xbd, 0xb5, 0x64, 0x62, - 0x97, 0xb4, 0x9b, 0x2b, 0xe3, 0x97, 0xda, 0xb0, 0xe3, 0xe0, 0xdc, 0x00, 0x14, 0x67, 0x8d, 0x0e, 0xcb, 0x6b, 0xdd, - 0xb6, 0x2a, 0x54, 0xa0, 0xd6, 0xff, 0xd9, 0x2d, 0x4c, 0x79, 0x9b, 0x97, 0xca, 0xdb, 0x3c, 0x34, 0x01, 0x02, 0x91, - 0x19, 0xf2, 0xac, 0xe9, 0x98, 0x24, 0xee, 0x1d, 0x29, 0x69, 0xdf, 0x91, 0xe2, 0x47, 0xef, 0x48, 0xc8, 0xb7, 0x84, - 0x8e, 0xec, 0x4b, 0x4e, 0x4e, 0xa0, 0xcc, 0x60, 0x2f, 0xaf, 0x99, 0xec, 0x1f, 0xd0, 0x5e, 0x38, 0x97, 0xe5, 0x15, - 0xbf, 0x16, 0xde, 0xda, 0x9f, 0xae, 0x4f, 0xbb, 0xaa, 0xde, 0x7e, 0x65, 0x66, 0x1e, 0x0e, 0xc5, 0xe1, 0x50, 0x99, - 0xa0, 0xdd, 0x05, 0x17, 0x83, 0x9c, 0xdd, 0xbb, 0xf1, 0xf1, 0xd7, 0x1c, 0x45, 0x6c, 0xa5, 0x3c, 0x92, 0x2e, 0x54, - 0x62, 0x78, 0x69, 0xe0, 0x61, 0x76, 0x7c, 0x3c, 0xd9, 0x5d, 0xdd, 0x4f, 0x06, 0x83, 0x9d, 0xea, 0xdb, 0x2d, 0xaf, - 0x67, 0xbb, 0x39, 0x7b, 0xe0, 0xb7, 0xd3, 0x6d, 0xb0, 0x6f, 0x60, 0xdb, 0xdd, 0x5d, 0x89, 0xc3, 0x61, 0xf7, 0x82, - 0x2f, 0xfc, 0xfd, 0x03, 0x02, 0x3a, 0xf3, 0xf3, 0x71, 0x1b, 0xe3, 0xe7, 0xa6, 0xed, 0xaa, 0xb5, 0x03, 0x78, 0xfa, - 0x1f, 0xbc, 0x9b, 0xd9, 0x72, 0xee, 0xb3, 0x27, 0xfc, 0x01, 0xfc, 0xf3, 0x71, 0x93, 0x44, 0xea, 0x13, 0xed, 0x32, - 0x79, 0x03, 0x0e, 0xe4, 0x3b, 0x9f, 0xbd, 0xe5, 0x0f, 0xb3, 0xe5, 0x9c, 0x17, 0x87, 0xc3, 0xfb, 0x69, 0x88, 0x64, - 0x4d, 0x61, 0x45, 0x2c, 0x29, 0x9e, 0x1f, 0x84, 0xc7, 0xef, 0x45, 0x64, 0x88, 0xb4, 0xdc, 0xbb, 0x43, 0x76, 0xc3, - 0x22, 0x3f, 0x80, 0x0f, 0xb2, 0x9d, 0x3f, 0x91, 0x35, 0xa5, 0xfb, 0xc5, 0x13, 0xff, 0x70, 0xa0, 0xbf, 0xde, 0xfa, - 0x87, 0xc3, 0x7b, 0xf6, 0x80, 0xe0, 0xe8, 0x7c, 0x07, 0xfd, 0xa3, 0x6f, 0x1d, 0x50, 0x95, 0xe1, 0xf5, 0x6c, 0x33, - 0xf7, 0x5f, 0xac, 0xd8, 0x1d, 0x70, 0xa1, 0x28, 0x2f, 0xb4, 0x1b, 0xf6, 0x80, 0x5e, 0x67, 0xe4, 0x44, 0x34, 0xdb, - 0xcd, 0x7d, 0x16, 0xe3, 0x73, 0x75, 0x5f, 0x4c, 0xbe, 0x7a, 0x5f, 0xdc, 0xb1, 0x6d, 0xf7, 0x7d, 0x51, 0xbe, 0xe9, - 0xae, 0x9f, 0x2d, 0xdb, 0xb1, 0x07, 0x98, 0x61, 0xd7, 0xfc, 0xa6, 0x39, 0x76, 0x8c, 0xfd, 0xea, 0x8d, 0x11, 0x40, - 0x99, 0x2d, 0x58, 0x2c, 0x38, 0x28, 0xd5, 0xaa, 0x6d, 0x49, 0xe4, 0x95, 0x0e, 0x54, 0x9b, 0x11, 0xdc, 0x57, 0x0b, - 0x39, 0xf3, 0xcc, 0x40, 0xdf, 0x56, 0x88, 0x16, 0x0e, 0x1b, 0xf0, 0x57, 0xda, 0x3a, 0xc6, 0x30, 0xcd, 0x6a, 0xa6, - 0x6d, 0x51, 0x97, 0xdf, 0xf6, 0x9e, 0xc9, 0x6f, 0x64, 0x60, 0x0b, 0x91, 0x14, 0x8e, 0xe3, 0x8b, 0xe7, 0x27, 0xfc, - 0x57, 0x2d, 0x8f, 0x5a, 0xed, 0x17, 0x4a, 0x7d, 0xfa, 0x8a, 0x8e, 0x68, 0xe2, 0x5e, 0xb4, 0x65, 0x58, 0xa3, 0xac, - 0xa9, 0xa5, 0xc3, 0x30, 0xae, 0x61, 0x5f, 0x1e, 0x38, 0xf4, 0x1d, 0x10, 0x68, 0xab, 0x54, 0x0a, 0xb4, 0x70, 0x0c, - 0xa3, 0x30, 0x0b, 0x29, 0x8f, 0x0b, 0xb3, 0x94, 0xf7, 0x58, 0xa0, 0xc5, 0xad, 0xba, 0xc7, 0xd4, 0x76, 0x0b, 0x22, - 0xac, 0xde, 0x32, 0xce, 0x2f, 0x1b, 0x55, 0xb8, 0x2d, 0x40, 0x51, 0x04, 0x65, 0xb0, 0x27, 0xb9, 0x6d, 0xa1, 0xa4, - 0xd9, 0x28, 0xac, 0xc5, 0x5d, 0x51, 0xee, 0x7a, 0x0d, 0x5b, 0xe0, 0x05, 0x55, 0x3f, 0x21, 0x6c, 0xcb, 0x9e, 0x75, - 0x28, 0x17, 0xe9, 0x7f, 0x64, 0xe9, 0xf9, 0x76, 0x6b, 0xce, 0xff, 0xf4, 0x15, 0x7d, 0x54, 0xfe, 0xe7, 0x97, 0xf4, - 0x93, 0xc1, 0x32, 0x72, 0x4a, 0x7d, 0x1f, 0x8d, 0x6e, 0xd3, 0x9c, 0x30, 0xb6, 0x7c, 0xfd, 0xf4, 0x1b, 0x64, 0x0a, - 0x92, 0x43, 0x29, 0x55, 0x39, 0xd9, 0x43, 0x5f, 0x78, 0xdd, 0x87, 0x99, 0x60, 0x00, 0xc2, 0x6b, 0xb4, 0xa9, 0x26, - 0x4c, 0xe2, 0xd1, 0x15, 0xfc, 0xdf, 0x08, 0x62, 0xd0, 0x3e, 0x51, 0xd4, 0xb1, 0x6d, 0xa4, 0xeb, 0xb6, 0x73, 0x90, - 0xdc, 0xa9, 0x2b, 0x7f, 0x54, 0x4e, 0xfe, 0x13, 0x0d, 0x91, 0x57, 0x5c, 0x21, 0x56, 0x16, 0x5c, 0x62, 0x31, 0x54, - 0xa4, 0x00, 0xd7, 0x10, 0x44, 0xca, 0xa2, 0xa4, 0x70, 0xcb, 0x41, 0x55, 0x04, 0x60, 0x5c, 0xad, 0x8e, 0x3a, 0x11, - 0x3e, 0x6e, 0xad, 0x45, 0x08, 0x56, 0x34, 0x6a, 0x65, 0xad, 0xc0, 0x17, 0xa4, 0x2f, 0x1d, 0x0a, 0x62, 0x7a, 0x14, - 0x52, 0x55, 0x3a, 0x14, 0x48, 0x73, 0xa8, 0xf8, 0xc6, 0x60, 0xa3, 0xa8, 0x48, 0xcf, 0x5f, 0x9a, 0x94, 0x5c, 0x1a, - 0x33, 0x3e, 0x88, 0x32, 0x12, 0x79, 0x1d, 0xde, 0x89, 0x69, 0x81, 0x7c, 0xa3, 0xc7, 0x0f, 0x82, 0x4b, 0x78, 0x37, - 0xe4, 0x5e, 0x01, 0xb6, 0x04, 0xec, 0x00, 0xf7, 0xca, 0x8c, 0x72, 0x9d, 0xd6, 0xf5, 0x5b, 0xeb, 0xa1, 0x18, 0x86, - 0xcf, 0x2c, 0x81, 0xed, 0x68, 0x1d, 0x1d, 0xe9, 0xe1, 0xc3, 0xff, 0xba, 0xaa, 0x39, 0xea, 0x54, 0x2e, 0x67, 0xc7, - 0x13, 0x96, 0x22, 0x66, 0xd0, 0xfd, 0x75, 0xfb, 0x4a, 0x00, 0xdd, 0x2e, 0x8b, 0x79, 0x36, 0xda, 0xc9, 0xbf, 0xa5, - 0x1b, 0x2b, 0x4a, 0x9b, 0x78, 0x97, 0xf5, 0xc6, 0xfe, 0x70, 0xf4, 0x97, 0x67, 0x5f, 0x26, 0x84, 0xaa, 0xb3, 0x61, - 0x6b, 0x1d, 0xe7, 0xf2, 0xbf, 0xfe, 0x3a, 0x26, 0x2b, 0x08, 0x0a, 0xc2, 0xb2, 0x53, 0x4c, 0x54, 0x30, 0x8a, 0x14, - 0x6b, 0x3e, 0x9e, 0xac, 0x51, 0x27, 0xbc, 0xf6, 0x97, 0x5a, 0x27, 0x4c, 0x8c, 0xac, 0x54, 0xfe, 0x9a, 0x55, 0xec, - 0x4e, 0x65, 0x16, 0x90, 0x79, 0x90, 0x4f, 0xd6, 0x46, 0x83, 0xb9, 0xe2, 0xf5, 0x6c, 0x3d, 0x97, 0xca, 0x67, 0x30, - 0xe5, 0x2c, 0x07, 0x27, 0x4b, 0x61, 0xf7, 0x24, 0x50, 0xb4, 0x66, 0xe8, 0xda, 0x9f, 0x62, 0xab, 0x5e, 0xa7, 0x55, - 0x0d, 0xf0, 0x80, 0x10, 0x03, 0x43, 0xed, 0xd5, 0xc2, 0x43, 0x6b, 0x01, 0xac, 0xfd, 0x51, 0xe9, 0x07, 0xe3, 0xc9, - 0x92, 0x2f, 0x90, 0x7f, 0x39, 0x72, 0xd4, 0xee, 0xfd, 0xbe, 0x77, 0x0f, 0x52, 0x70, 0xe4, 0x5a, 0x28, 0x90, 0x08, - 0x68, 0xc1, 0x37, 0xbe, 0xf2, 0xc1, 0xb8, 0x46, 0x6d, 0x35, 0x28, 0xa8, 0x1d, 0xdd, 0xf2, 0xd8, 0xd1, 0x3b, 0xdf, - 0x9f, 0xd0, 0x57, 0x2f, 0xb4, 0x70, 0xfc, 0x95, 0x33, 0x72, 0xcd, 0x56, 0x1d, 0x72, 0x44, 0x33, 0xe9, 0x10, 0x22, - 0x56, 0x6c, 0xcd, 0xae, 0x49, 0xe5, 0xdc, 0x39, 0x64, 0xa7, 0x8f, 0x50, 0xa5, 0xd7, 0x7a, 0x7c, 0x3b, 0x51, 0xba, - 0xdb, 0xe3, 0xdd, 0xe4, 0x5b, 0x36, 0x11, 0x31, 0x18, 0xd0, 0x06, 0xe1, 0x8c, 0xac, 0x43, 0xa4, 0xd2, 0x01, 0x42, - 0xe0, 0x98, 0x80, 0xa6, 0xff, 0xf8, 0x9a, 0x44, 0x01, 0x47, 0xda, 0x08, 0x59, 0xcb, 0x0e, 0x87, 0x1c, 0x34, 0xca, - 0xcd, 0x1f, 0x5e, 0xa1, 0x4e, 0x73, 0x60, 0x9e, 0x2e, 0x61, 0xcf, 0xc1, 0x23, 0xbd, 0x38, 0x3e, 0xd2, 0xff, 0x3b, - 0x9a, 0xa8, 0xf1, 0x7f, 0xae, 0x89, 0x52, 0x5a, 0x24, 0x47, 0xb5, 0xf4, 0x4d, 0xea, 0x28, 0xb8, 0xc8, 0x3b, 0x6a, - 0x21, 0x7b, 0x96, 0x8d, 0x1b, 0xd5, 0xbc, 0xff, 0x5f, 0x2b, 0xf3, 0xff, 0x35, 0xad, 0x0c, 0x53, 0xb2, 0x63, 0xa9, - 0x66, 0x1e, 0x68, 0x15, 0xc3, 0xec, 0x67, 0x92, 0x10, 0x19, 0x2e, 0x0d, 0xf8, 0x51, 0x05, 0xfb, 0x38, 0xad, 0xd6, - 0x59, 0xb8, 0x43, 0x25, 0xea, 0xad, 0xb8, 0x4b, 0xf3, 0x97, 0xf5, 0xbf, 0x45, 0x59, 0xc0, 0xd4, 0xbe, 0x2b, 0xd3, - 0x38, 0x20, 0x0b, 0x7f, 0x16, 0x96, 0x38, 0xb9, 0xb1, 0x8d, 0x3f, 0xcb, 0xf1, 0xb4, 0x5f, 0x75, 0x66, 0x1e, 0x48, - 0xa0, 0x06, 0xe2, 0x8f, 0x9c, 0xcb, 0xca, 0xe2, 0x01, 0xa1, 0x9b, 0x7f, 0x28, 0xcb, 0xa2, 0xf4, 0x7a, 0x9f, 0x92, - 0xb4, 0x3a, 0x5b, 0x89, 0x3a, 0x29, 0x62, 0x05, 0x65, 0x93, 0x02, 0x8c, 0x3e, 0xac, 0x3c, 0x11, 0x07, 0x67, 0x08, - 0xd4, 0x70, 0x56, 0x27, 0x21, 0x00, 0x0d, 0x2b, 0x84, 0xfd, 0x33, 0x68, 0xe1, 0x59, 0x18, 0x87, 0x6b, 0x80, 0xc9, - 0x49, 0xab, 0xb3, 0x75, 0x59, 0xdc, 0xa7, 0xb1, 0x88, 0x47, 0x3d, 0x45, 0xc9, 0xf2, 0x26, 0x77, 0xe5, 0x5c, 0x7f, - 0xff, 0x07, 0x05, 0xb0, 0x1b, 0x30, 0xdb, 0x16, 0xd8, 0x01, 0x40, 0x82, 0x02, 0xd9, 0x42, 0x9d, 0x46, 0x67, 0x6a, - 0xa9, 0xc0, 0x7b, 0xae, 0x07, 0xf8, 0x9b, 0x1c, 0xb0, 0x8c, 0xeb, 0x42, 0x06, 0x8c, 0x20, 0x80, 0x11, 0x38, 0x28, - 0x01, 0x43, 0x67, 0x88, 0xdb, 0xaa, 0x9c, 0xb5, 0xd0, 0x5c, 0xe9, 0xb6, 0xe4, 0xa6, 0x51, 0xce, 0x56, 0x22, 0x80, - 0xbe, 0xba, 0x29, 0x71, 0xba, 0x5c, 0xb6, 0x92, 0xb0, 0x6f, 0xdf, 0xb7, 0x53, 0x45, 0x1e, 0x1f, 0xa5, 0x21, 0xaf, - 0xc0, 0x93, 0x8c, 0x23, 0x49, 0x94, 0x08, 0xde, 0xe4, 0x8d, 0x19, 0x87, 0x97, 0x6d, 0xca, 0xa9, 0xbd, 0x59, 0x2f, - 0x00, 0xe7, 0x09, 0xda, 0x32, 0xc0, 0x58, 0xc0, 0xe0, 0x5c, 0x88, 0x25, 0x4f, 0x11, 0xfc, 0xd2, 0x89, 0x14, 0xc6, - 0x5d, 0x0e, 0xc3, 0x3c, 0x28, 0x7a, 0x97, 0xd4, 0x1f, 0xfd, 0x3e, 0x6a, 0x93, 0xc1, 0x10, 0x54, 0x02, 0xa8, 0xac, - 0x1b, 0x24, 0x06, 0x56, 0xa5, 0x85, 0xc4, 0x25, 0xc4, 0xcb, 0x7c, 0x35, 0xad, 0xa3, 0xe0, 0x7d, 0x3d, 0x21, 0x84, - 0x13, 0x8c, 0x0f, 0x71, 0x03, 0x04, 0x0c, 0x56, 0x71, 0x81, 0x41, 0xf2, 0x5c, 0xa2, 0xfb, 0xe3, 0xf9, 0x8e, 0x01, - 0xae, 0x9c, 0xf7, 0x54, 0xbb, 0x7a, 0x60, 0x2f, 0x57, 0xe9, 0x92, 0x11, 0xc2, 0x8a, 0xff, 0x8b, 0xc8, 0xfb, 0x76, - 0x98, 0x80, 0xda, 0x46, 0xfe, 0x18, 0x24, 0xe6, 0x32, 0x51, 0x04, 0xf1, 0x28, 0x2b, 0x58, 0x92, 0x06, 0x9b, 0x51, - 0x92, 0x82, 0x46, 0x13, 0x63, 0xc8, 0x54, 0x68, 0x87, 0xa4, 0xd1, 0x6c, 0x4c, 0xf6, 0x31, 0xe4, 0x35, 0x5c, 0x2c, - 0x16, 0x78, 0xdf, 0xcf, 0x42, 0x75, 0xb0, 0x2d, 0xcd, 0x21, 0xe0, 0x24, 0xc1, 0x9e, 0xba, 0x22, 0x25, 0x61, 0x36, - 0xfa, 0x14, 0x72, 0x6e, 0x40, 0xc7, 0x49, 0x63, 0xa8, 0x3e, 0x30, 0x09, 0xaf, 0x22, 0x74, 0x52, 0x56, 0x08, 0x0b, - 0xb8, 0x6f, 0x64, 0x34, 0x5a, 0x49, 0x83, 0xc0, 0xdb, 0x0c, 0x5b, 0x81, 0x4d, 0x68, 0xf8, 0xcb, 0xcc, 0xc3, 0xb4, - 0x9a, 0x95, 0x60, 0xce, 0x37, 0x50, 0x89, 0xf1, 0x64, 0x79, 0xc5, 0x37, 0x2e, 0x56, 0x62, 0x32, 0x5b, 0xce, 0x27, - 0x6b, 0x49, 0x35, 0x97, 0x7b, 0x6b, 0x96, 0xb1, 0x25, 0xec, 0x1f, 0x06, 0x86, 0xd2, 0x81, 0x1d, 0x4d, 0x35, 0x6d, - 0x12, 0x60, 0x32, 0x9d, 0x73, 0x3e, 0xbc, 0x44, 0x34, 0x59, 0x9d, 0xba, 0x93, 0xa9, 0x6a, 0x07, 0xd7, 0xe4, 0x4c, - 0x4e, 0x8f, 0xd4, 0x53, 0xad, 0x7b, 0xc9, 0x47, 0xdb, 0x61, 0x35, 0xda, 0xfa, 0x01, 0xb8, 0x75, 0x0a, 0x3b, 0x7d, - 0x37, 0xac, 0x46, 0x3b, 0x5f, 0xc3, 0xee, 0x92, 0x42, 0xa0, 0xfa, 0xb3, 0xac, 0xc9, 0x5c, 0xbc, 0x2e, 0x1e, 0xbc, - 0x82, 0x3d, 0xf7, 0x07, 0xfa, 0x57, 0xc9, 0x9e, 0xfb, 0x36, 0x93, 0xeb, 0x9f, 0x69, 0xd7, 0x68, 0xcc, 0x74, 0xbc, - 0x76, 0x05, 0x56, 0x68, 0x80, 0xfc, 0x82, 0x1d, 0xed, 0x6d, 0x0e, 0x02, 0x01, 0xba, 0x97, 0xe0, 0x28, 0x0a, 0x88, - 0x9a, 0x56, 0x95, 0x47, 0xa7, 0x7b, 0x7f, 0x8f, 0x6f, 0x94, 0x80, 0x4d, 0x9e, 0x5a, 0xf7, 0x96, 0xb1, 0x7f, 0x38, - 0x40, 0x08, 0xbd, 0x9c, 0x7e, 0xa3, 0x2d, 0xab, 0x47, 0x3b, 0x96, 0xfb, 0x86, 0x51, 0x4f, 0xc1, 0x18, 0x86, 0x2e, - 0xac, 0x62, 0x24, 0xcf, 0x80, 0xac, 0xf1, 0x1b, 0x44, 0x17, 0xb0, 0xe8, 0xf5, 0x5e, 0x1f, 0xd1, 0x20, 0x02, 0x2a, - 0xbd, 0xe6, 0x2f, 0x45, 0x3e, 0x57, 0x85, 0xe8, 0xbd, 0xb7, 0x76, 0xde, 0xcc, 0x48, 0x96, 0x49, 0x23, 0xd5, 0x6e, - 0x65, 0xb1, 0xae, 0xbc, 0xd9, 0x09, 0xe9, 0x62, 0x8e, 0xa1, 0x32, 0x78, 0x1c, 0x80, 0xd2, 0xf3, 0x6f, 0xa1, 0x57, - 0x32, 0x64, 0x9a, 0x25, 0x9a, 0xd9, 0x5d, 0xe3, 0x4f, 0x56, 0xa9, 0x17, 0x23, 0x62, 0x36, 0xb0, 0x85, 0xb8, 0x2d, - 0x2a, 0xdd, 0x16, 0x85, 0xb2, 0x45, 0x91, 0x3e, 0xd4, 0xce, 0x74, 0x67, 0x16, 0x3e, 0xab, 0x4c, 0xfb, 0xde, 0x66, - 0x66, 0x6c, 0x80, 0xb6, 0x8b, 0xf0, 0x0d, 0x74, 0xa0, 0x42, 0xc8, 0x7f, 0x40, 0x44, 0x24, 0x02, 0x76, 0x39, 0x75, - 0x27, 0x36, 0x1d, 0x92, 0x79, 0x88, 0x59, 0xa1, 0x46, 0x79, 0xc9, 0x93, 0xa3, 0x01, 0xa9, 0x08, 0x75, 0xbb, 0xdf, - 0x3f, 0x5f, 0xba, 0xa0, 0xf6, 0x6b, 0x8a, 0x1d, 0xa3, 0x9b, 0x02, 0xce, 0x05, 0x8f, 0xf2, 0x9e, 0x7b, 0xe7, 0x80, - 0xe6, 0xd8, 0x9e, 0x22, 0x6b, 0xc0, 0xe9, 0x6d, 0x17, 0x02, 0x6c, 0x9f, 0x35, 0x5b, 0xfb, 0x93, 0xd5, 0x55, 0x34, - 0xf5, 0x4a, 0x3e, 0xd3, 0x5d, 0x94, 0xb8, 0x5d, 0x14, 0xcb, 0x2e, 0xda, 0x34, 0x10, 0xec, 0xb8, 0xf2, 0x03, 0xe0, - 0x0d, 0x8d, 0xfa, 0xfd, 0xb2, 0xd5, 0xb3, 0x27, 0x5f, 0x3b, 0xee, 0xd9, 0xcc, 0x67, 0xa5, 0xe9, 0xd9, 0x5f, 0x53, - 0xb7, 0x67, 0xe5, 0x64, 0x2f, 0x3a, 0x27, 0xfb, 0x74, 0x36, 0x0f, 0x04, 0x97, 0x3b, 0xf7, 0x79, 0x3e, 0xd5, 0xd3, - 0xae, 0xf2, 0x83, 0xd6, 0x10, 0x99, 0x2f, 0x7c, 0xaa, 0xba, 0xd7, 0x15, 0x2c, 0x60, 0x09, 0xee, 0xd6, 0x4b, 0xf3, - 0x5f, 0xb1, 0xfb, 0x7b, 0x41, 0x2f, 0xcd, 0x7f, 0xa3, 0x3f, 0x29, 0x80, 0x03, 0xd0, 0x98, 0xda, 0x2d, 0xf0, 0x10, - 0x43, 0x05, 0x85, 0xbb, 0x59, 0x39, 0xf7, 0x6a, 0x80, 0xc3, 0x24, 0x7d, 0x43, 0xab, 0x57, 0x5a, 0xec, 0x7a, 0x99, - 0xec, 0x15, 0xe0, 0xa1, 0x0a, 0x79, 0x78, 0x38, 0x44, 0x1d, 0xc3, 0x0e, 0xea, 0x08, 0x18, 0xf6, 0x10, 0x1a, 0x5b, - 0xe0, 0xf9, 0xf8, 0x29, 0xe3, 0x7b, 0x01, 0x6a, 0x23, 0x84, 0xc7, 0xab, 0x45, 0x19, 0x62, 0xcb, 0xde, 0x22, 0x95, - 0xd4, 0xcf, 0x02, 0x51, 0x46, 0xab, 0x80, 0xb6, 0xda, 0x63, 0x96, 0xc6, 0x1b, 0x08, 0x15, 0x4b, 0x7d, 0x0c, 0xa1, - 0x81, 0xc3, 0xef, 0x70, 0x00, 0x09, 0xbe, 0xe4, 0x9a, 0x6c, 0xee, 0x6d, 0x7e, 0x4f, 0xfb, 0xfc, 0xe1, 0x70, 0x7e, - 0x89, 0xa0, 0x74, 0x29, 0x7c, 0xa4, 0x12, 0x51, 0x3d, 0xc5, 0x4d, 0x09, 0xd9, 0x2c, 0x59, 0xe9, 0x07, 0xbf, 0xaa, - 0x5f, 0x00, 0x20, 0x0b, 0x81, 0x36, 0x91, 0xd9, 0x9f, 0xce, 0x54, 0x74, 0x01, 0x70, 0x88, 0x3f, 0x7e, 0x82, 0xe8, - 0x1b, 0x5a, 0xa6, 0xe5, 0xe3, 0x84, 0x87, 0xa0, 0xb5, 0x25, 0x9d, 0x44, 0xac, 0x14, 0xd8, 0x10, 0x09, 0xdf, 0xef, - 0x9f, 0xc7, 0x92, 0x0e, 0x34, 0x6a, 0x75, 0x6f, 0xdc, 0xea, 0x5e, 0xf9, 0xba, 0xee, 0xe4, 0xc6, 0x07, 0x45, 0xfb, - 0x6c, 0xde, 0xa8, 0x7c, 0xdf, 0xd6, 0x39, 0xbb, 0xd3, 0xbd, 0x23, 0xe7, 0xc4, 0xb7, 0xf7, 0x10, 0x8a, 0x1e, 0x9a, - 0x22, 0xcb, 0x92, 0x30, 0xa0, 0xb5, 0x76, 0xed, 0x59, 0x46, 0x07, 0xaf, 0x7d, 0x43, 0x88, 0xc8, 0x53, 0x7c, 0x12, - 0x72, 0x8b, 0xe3, 0x83, 0x02, 0xfd, 0x33, 0xe3, 0xcf, 0x9c, 0xf8, 0x61, 0xab, 0x5f, 0x00, 0xe7, 0xa6, 0x7b, 0xef, - 0x4e, 0xcc, 0x7a, 0x0c, 0xa5, 0x6c, 0xfc, 0xdf, 0xef, 0x13, 0x59, 0xa0, 0xd3, 0x11, 0x0d, 0x03, 0xc1, 0x5d, 0x54, - 0xff, 0xf7, 0x8a, 0xd7, 0x3d, 0x6b, 0x75, 0xbe, 0xfc, 0xd4, 0xe9, 0x49, 0xaf, 0x5e, 0xc6, 0x3d, 0xa0, 0x42, 0x07, - 0x08, 0xe7, 0x75, 0xbf, 0x61, 0xbb, 0x6f, 0x7e, 0x79, 0x77, 0xf4, 0x32, 0xb0, 0x49, 0x91, 0xd8, 0x56, 0xf2, 0x59, - 0x0f, 0x14, 0x7e, 0x3d, 0xd6, 0xab, 0x8b, 0x75, 0x8f, 0xf5, 0x50, 0x0b, 0x88, 0x1e, 0x16, 0xa0, 0xfe, 0xeb, 0xd9, - 0xa7, 0xa1, 0x70, 0x90, 0x8d, 0x53, 0x05, 0x8a, 0x2c, 0xf8, 0x0b, 0x31, 0x5a, 0x17, 0x04, 0x88, 0x6c, 0x09, 0x69, - 0xd5, 0xc9, 0xec, 0x71, 0xa9, 0x25, 0x19, 0x7c, 0x13, 0x90, 0xd9, 0x81, 0x95, 0x13, 0x94, 0x8e, 0x5b, 0x03, 0xae, - 0x6c, 0xf1, 0x68, 0xb7, 0x3f, 0x0d, 0xb2, 0xb3, 0xe6, 0xa4, 0xd1, 0x3e, 0xec, 0xd3, 0x3c, 0x40, 0x20, 0x92, 0xa9, - 0x08, 0x72, 0xcd, 0xbd, 0x25, 0x7d, 0x74, 0x38, 0xe7, 0x85, 0xfc, 0x73, 0x2a, 0x75, 0x88, 0x43, 0x89, 0x35, 0x10, - 0xa8, 0x3c, 0x43, 0x95, 0xc3, 0x06, 0x39, 0xfe, 0xd9, 0x91, 0xcc, 0x24, 0x26, 0x8b, 0xdc, 0xad, 0x99, 0x0a, 0x3f, - 0x10, 0x7c, 0xcc, 0x72, 0x0e, 0x5c, 0x60, 0xb3, 0xb9, 0xaf, 0xa6, 0xb8, 0xb8, 0x02, 0x7f, 0x4c, 0xe1, 0x57, 0x3c, - 0x85, 0x9d, 0x76, 0xbf, 0x2e, 0xaa, 0x14, 0x75, 0x1b, 0x85, 0x45, 0x25, 0x0b, 0xa6, 0x35, 0xa4, 0x89, 0x0e, 0xa3, - 0x3f, 0xc8, 0x19, 0x28, 0x08, 0xf9, 0x65, 0xd3, 0x00, 0x23, 0x95, 0x5c, 0x1e, 0x54, 0x49, 0xe0, 0x05, 0xd8, 0x06, - 0x15, 0x5b, 0x17, 0x10, 0x64, 0x9b, 0x14, 0x65, 0xfa, 0xa5, 0xc8, 0xeb, 0x30, 0x0b, 0xaa, 0x51, 0x5a, 0xfd, 0xa8, - 0x7f, 0x02, 0xf3, 0x36, 0x15, 0xa3, 0x5a, 0xc5, 0xe4, 0x37, 0xfa, 0xfd, 0x62, 0xd0, 0xfa, 0x90, 0xc1, 0x47, 0xaf, - 0x4d, 0x83, 0x3f, 0x3a, 0x0d, 0x76, 0x98, 0x68, 0x04, 0x40, 0x32, 0xa7, 0x96, 0x3c, 0x14, 0xfd, 0x11, 0xe4, 0x58, - 0xa3, 0xca, 0x29, 0x18, 0xac, 0xff, 0x78, 0xb4, 0x03, 0x53, 0x2f, 0x8e, 0xb6, 0x64, 0x07, 0xad, 0x7c, 0x03, 0xdc, - 0xaf, 0x91, 0x2d, 0x66, 0x39, 0x40, 0xb3, 0xd7, 0x88, 0x8c, 0x4f, 0x5e, 0x00, 0x63, 0xb6, 0xce, 0xc2, 0x48, 0xc4, - 0xc1, 0x58, 0x35, 0x66, 0xcc, 0xc0, 0xc0, 0x05, 0xba, 0x96, 0x49, 0x49, 0x1a, 0xd2, 0xc1, 0x80, 0x95, 0xb2, 0x85, - 0x03, 0x5e, 0x34, 0xc7, 0xed, 0x78, 0xd3, 0xa2, 0xf1, 0xc0, 0x76, 0xb1, 0xfd, 0xfd, 0xf7, 0xc5, 0xf6, 0x3a, 0xdc, - 0x92, 0x5e, 0x21, 0x67, 0x09, 0xfd, 0xfc, 0x51, 0xf6, 0x59, 0xc3, 0xc9, 0xa9, 0xd0, 0x0c, 0x2d, 0x45, 0x42, 0x29, - 0xde, 0xe9, 0x49, 0x81, 0xb1, 0x8c, 0x85, 0xbf, 0x07, 0xce, 0xe9, 0x42, 0x11, 0xb9, 0x03, 0xc7, 0xf1, 0x0d, 0x54, - 0x30, 0x6a, 0x38, 0x78, 0x19, 0xc3, 0xb6, 0x28, 0x66, 0x21, 0xe1, 0x14, 0xc2, 0xc5, 0x2a, 0xeb, 0xf7, 0xe5, 0x2f, - 0xea, 0xa2, 0x8b, 0x4c, 0xd6, 0x7d, 0x12, 0x8e, 0xcc, 0x58, 0x4e, 0xbd, 0x90, 0x3c, 0xef, 0x79, 0x32, 0x4d, 0x9e, - 0xe5, 0x41, 0x04, 0x90, 0xcf, 0xe1, 0x7d, 0x98, 0x66, 0x60, 0x95, 0x26, 0xe5, 0x47, 0x28, 0x7d, 0xf1, 0x79, 0xe5, - 0x07, 0x3a, 0x7b, 0x6e, 0x92, 0xe1, 0xcd, 0xaa, 0xf5, 0x26, 0xb5, 0xae, 0x8b, 0x07, 0xfc, 0x8b, 0x33, 0xd8, 0x38, - 0xd7, 0x99, 0xe0, 0xc0, 0x8b, 0xa4, 0xd6, 0x6b, 0xc6, 0x5f, 0x64, 0xb8, 0x2e, 0x55, 0x1b, 0x7d, 0x14, 0xa2, 0x73, - 0xc8, 0x54, 0x80, 0x42, 0x91, 0xf6, 0x0f, 0x4a, 0xad, 0x4c, 0x2a, 0x6d, 0x24, 0x80, 0xee, 0x61, 0xd2, 0x60, 0x8b, - 0xa1, 0x8c, 0xa5, 0x49, 0x94, 0x3b, 0x0d, 0xe2, 0xca, 0xfe, 0x5c, 0x49, 0x1c, 0x5a, 0x16, 0xc9, 0xbf, 0x77, 0x3d, - 0x7d, 0x85, 0xd4, 0x9d, 0x2c, 0x90, 0x19, 0xe3, 0x65, 0x1e, 0x7f, 0x02, 0xc2, 0x6c, 0xd0, 0x46, 0x45, 0x21, 0x84, - 0x6c, 0x10, 0x83, 0xc6, 0xcb, 0x3c, 0xfe, 0x5e, 0xd1, 0x78, 0xc8, 0x47, 0x91, 0xaf, 0xfe, 0x2a, 0xf5, 0x5f, 0xa1, - 0xcf, 0x4c, 0xf0, 0x08, 0xd5, 0x44, 0xff, 0xee, 0xf9, 0xec, 0x1e, 0xd4, 0x86, 0x51, 0x98, 0x99, 0xf2, 0x2b, 0xdf, - 0x14, 0x67, 0xaf, 0xbf, 0xa2, 0xab, 0x6c, 0xeb, 0x7e, 0xf4, 0xf1, 0x88, 0xc0, 0xda, 0x18, 0x5d, 0x71, 0x63, 0x00, - 0x39, 0x4c, 0xde, 0xaf, 0x28, 0x2d, 0x87, 0x34, 0x08, 0x1d, 0x34, 0x04, 0xbd, 0x92, 0xe8, 0x03, 0x89, 0x45, 0x8c, - 0xe1, 0x85, 0x78, 0x46, 0x6a, 0x32, 0xd1, 0x10, 0xaf, 0x88, 0xfd, 0x10, 0x2d, 0x39, 0x35, 0xd1, 0x8d, 0x30, 0xc5, - 0x40, 0x62, 0x67, 0x90, 0x9c, 0x24, 0xb5, 0xf2, 0x8b, 0x67, 0x92, 0xb0, 0xc4, 0xce, 0x43, 0x0c, 0x26, 0xb5, 0x74, - 0xa7, 0x37, 0x55, 0x7a, 0x77, 0xa4, 0xe5, 0xa0, 0x7d, 0x00, 0x76, 0x29, 0xe9, 0xfd, 0x93, 0x42, 0x11, 0x1f, 0xc2, - 0x38, 0x86, 0xf0, 0x2d, 0xa2, 0xba, 0x02, 0xe7, 0x5a, 0x81, 0xc6, 0x6a, 0xe0, 0xa1, 0x99, 0x55, 0xf3, 0x21, 0xa7, - 0x9f, 0x4a, 0xcb, 0x1f, 0x23, 0x1a, 0x1b, 0xad, 0x9b, 0xc3, 0x61, 0x4f, 0xab, 0x5e, 0x3a, 0x07, 0x5d, 0x36, 0x93, - 0x98, 0xb8, 0x81, 0x74, 0xfd, 0xe8, 0x37, 0x13, 0xf6, 0x22, 0x2a, 0xe4, 0x52, 0x08, 0x0a, 0x5a, 0x1d, 0x08, 0x1c, - 0x0a, 0x6f, 0x51, 0xe6, 0x8b, 0x98, 0x36, 0x10, 0x06, 0x9f, 0x1f, 0xc8, 0xcf, 0x37, 0x05, 0xa9, 0xd8, 0xb1, 0xae, - 0xfd, 0xfe, 0xa6, 0xf4, 0x00, 0x4f, 0xce, 0x24, 0x79, 0xda, 0x0c, 0x61, 0x45, 0x00, 0x8d, 0x59, 0x4d, 0x16, 0x27, - 0x5c, 0x99, 0xc3, 0x8f, 0x95, 0x57, 0xb2, 0x94, 0xa9, 0xf3, 0x54, 0x2f, 0x80, 0xa8, 0xe3, 0x0d, 0x5a, 0x91, 0xfa, - 0x15, 0x3a, 0x7b, 0xcd, 0x4a, 0xc8, 0x78, 0x78, 0xce, 0x79, 0x3a, 0x7a, 0x60, 0x09, 0x8f, 0xf0, 0xaf, 0x64, 0xa2, - 0x0f, 0xbf, 0x07, 0x0e, 0x37, 0xe3, 0x84, 0x47, 0x6e, 0xb3, 0xf7, 0x55, 0xb8, 0x82, 0x9b, 0x69, 0x01, 0x48, 0x6e, - 0x41, 0xd2, 0x04, 0x94, 0x90, 0xc8, 0x84, 0xcc, 0x9a, 0x92, 0x9f, 0x5b, 0xda, 0x06, 0x6b, 0x98, 0x74, 0x1e, 0xf0, - 0xa2, 0xd5, 0x47, 0xab, 0x89, 0x76, 0x99, 0xe5, 0xf3, 0x21, 0xce, 0x50, 0xcd, 0x71, 0x77, 0x06, 0x3f, 0x07, 0xbc, - 0x62, 0x55, 0x93, 0x8e, 0x76, 0x03, 0x2e, 0x3c, 0xb9, 0xce, 0xd3, 0xd1, 0x16, 0x7f, 0xc9, 0xfd, 0x01, 0xa0, 0x83, - 0xa9, 0x4b, 0xe0, 0x4f, 0xd5, 0x56, 0x53, 0xa9, 0x5f, 0x5a, 0xfb, 0x75, 0xdd, 0x59, 0xad, 0xdc, 0xb3, 0x2e, 0x43, - 0x7b, 0x64, 0xc8, 0x19, 0x33, 0xe0, 0xcf, 0x19, 0x4b, 0xfe, 0x9c, 0xb1, 0xe2, 0xcf, 0x19, 0x37, 0x46, 0x06, 0x50, - 0x82, 0x7b, 0xc9, 0x5f, 0xec, 0x11, 0x33, 0xc4, 0x6a, 0x50, 0x09, 0xac, 0x2c, 0xe5, 0xdc, 0x47, 0x4e, 0x31, 0xe5, - 0x94, 0xe1, 0xa5, 0xd3, 0x99, 0x3b, 0x90, 0xf3, 0x60, 0xe6, 0x0e, 0x93, 0xb3, 0x3e, 0xc5, 0xb1, 0x34, 0x26, 0x45, - 0x05, 0xe9, 0x9c, 0x0e, 0x37, 0xaf, 0x8e, 0xf3, 0x84, 0x65, 0x7c, 0xdc, 0x3e, 0x53, 0x20, 0xc4, 0x16, 0xcf, 0x90, - 0x48, 0xa9, 0x9a, 0xe5, 0x36, 0x7f, 0x38, 0xd4, 0xa3, 0x07, 0xbd, 0xd3, 0xc3, 0xaf, 0x84, 0xfd, 0x92, 0x79, 0xf6, - 0x09, 0x02, 0x98, 0x24, 0xf2, 0x4c, 0xc2, 0xd1, 0x8f, 0xe5, 0xe8, 0x6f, 0x1a, 0xfe, 0x2e, 0x43, 0x75, 0x77, 0x08, - 0x4c, 0x6c, 0xd9, 0x81, 0x43, 0x70, 0xba, 0xaa, 0x44, 0x02, 0x0e, 0x36, 0x1b, 0x16, 0xe9, 0x3d, 0x1e, 0xe2, 0x7c, - 0x50, 0xf8, 0x08, 0x0d, 0x33, 0x7a, 0xbf, 0xbf, 0x11, 0x5e, 0x25, 0x5b, 0x79, 0x38, 0x24, 0xd6, 0x5d, 0xd8, 0xd1, - 0xc7, 0xd1, 0x1e, 0x25, 0xd4, 0x7e, 0x54, 0xeb, 0x4d, 0xa5, 0x1e, 0xe4, 0x66, 0x17, 0x12, 0x83, 0x8a, 0xa5, 0xfa, - 0xf4, 0x4a, 0xf5, 0xa1, 0x66, 0x9d, 0xdf, 0xd5, 0x71, 0x9f, 0x8a, 0xd1, 0x5a, 0x4e, 0x08, 0x70, 0x1d, 0x24, 0x1a, - 0x1d, 0x00, 0xe3, 0x6c, 0xb3, 0xe5, 0xa5, 0xb6, 0x4e, 0x94, 0x8e, 0xe3, 0x5c, 0x1f, 0xc7, 0x87, 0x83, 0x14, 0x33, - 0x2e, 0x8f, 0xc4, 0x8c, 0xcb, 0x06, 0xe0, 0xcd, 0x3a, 0x0f, 0xea, 0xc3, 0xe1, 0x92, 0x2e, 0x45, 0xa6, 0xb3, 0x8d, - 0xf2, 0xb3, 0x1e, 0x3d, 0x3c, 0x4b, 0xd0, 0xdc, 0x5b, 0x61, 0xef, 0x45, 0xb2, 0x3d, 0x93, 0x75, 0xea, 0x65, 0xe4, - 0xd3, 0x0b, 0xf7, 0xec, 0x92, 0xab, 0x1f, 0x56, 0x5f, 0x4f, 0x7f, 0x15, 0x5e, 0xc4, 0x2a, 0xda, 0xad, 0x4b, 0x26, - 0xec, 0x2d, 0xa5, 0x92, 0x56, 0x79, 0xf9, 0x74, 0xe3, 0x07, 0x98, 0x99, 0xf6, 0xf4, 0x41, 0x36, 0xa2, 0xfa, 0xb3, - 0x12, 0xb5, 0x32, 0x4c, 0x16, 0xce, 0x4b, 0xa6, 0x9e, 0x0c, 0x78, 0xcc, 0x4a, 0x1e, 0xc9, 0x4e, 0x6f, 0x0c, 0x82, - 0x00, 0xd6, 0x39, 0x69, 0xd5, 0x19, 0x47, 0xa3, 0x55, 0xe5, 0xe2, 0x74, 0x95, 0x0b, 0x0c, 0xb7, 0x5b, 0xb3, 0x8d, - 0xaa, 0xb3, 0xdc, 0xd4, 0x2a, 0xe5, 0x3b, 0x80, 0x8f, 0x65, 0x95, 0x0b, 0x3a, 0xa6, 0x4c, 0x9d, 0x37, 0x10, 0x8c, - 0xad, 0x6a, 0x5c, 0x38, 0x35, 0x2e, 0x78, 0x44, 0xed, 0x6e, 0x9a, 0x7a, 0xb4, 0x05, 0x96, 0xd2, 0xd1, 0x8e, 0x97, - 0xa8, 0x52, 0xf8, 0xbb, 0xe0, 0xfb, 0x30, 0x8e, 0xbf, 0x2f, 0xb6, 0xea, 0x40, 0xbc, 0x2d, 0xb6, 0x48, 0xfb, 0x22, - 0xff, 0x42, 0x1c, 0xf0, 0x5a, 0xd7, 0x94, 0xd7, 0xd6, 0x9c, 0x06, 0xb6, 0x86, 0x91, 0x92, 0xc2, 0xb9, 0xf9, 0xf3, - 0x70, 0xa0, 0x95, 0x5d, 0xab, 0xbb, 0x42, 0xad, 0xc7, 0x1c, 0x36, 0xec, 0x45, 0x16, 0xee, 0x44, 0x09, 0x8e, 0x5c, - 0xf2, 0xaf, 0xc3, 0x41, 0xab, 0x2c, 0xd5, 0x91, 0x3e, 0xdb, 0x7f, 0x09, 0xc6, 0x0c, 0x5d, 0x9a, 0x80, 0x65, 0x63, - 0x24, 0xff, 0x6a, 0x9a, 0x79, 0xc3, 0x64, 0xcd, 0x14, 0x8e, 0x43, 0xc3, 0x08, 0x69, 0x40, 0xb7, 0x41, 0x6d, 0x78, - 0x32, 0xdf, 0x54, 0xe5, 0x57, 0x77, 0xa4, 0xda, 0x0f, 0x86, 0x97, 0x13, 0x71, 0x4e, 0x97, 0x24, 0xf5, 0x54, 0x42, - 0x49, 0x08, 0x76, 0xe9, 0x03, 0x39, 0xb1, 0x02, 0xb2, 0x96, 0xb1, 0xfc, 0x56, 0x0f, 0x08, 0xfd, 0xa7, 0xdd, 0x7a, - 0xa1, 0xff, 0x34, 0xcd, 0x16, 0xea, 0xfa, 0xc3, 0xe4, 0xbe, 0xa3, 0xd7, 0x1f, 0x1c, 0xde, 0xa9, 0xab, 0x8a, 0xab, - 0x78, 0x58, 0x1b, 0x26, 0xb9, 0x51, 0x16, 0xee, 0x8a, 0x4d, 0xad, 0x96, 0xa7, 0xe3, 0x30, 0x02, 0x33, 0x82, 0x02, - 0x64, 0x5d, 0xb7, 0x11, 0x31, 0xac, 0xe4, 0x32, 0x21, 0x9f, 0x10, 0x90, 0x45, 0xa9, 0x71, 0x3e, 0x6e, 0x81, 0x4a, - 0x04, 0x83, 0xd3, 0xd0, 0x5a, 0x75, 0x93, 0x1f, 0x55, 0x36, 0x76, 0x07, 0xe4, 0x90, 0x64, 0xb2, 0xb8, 0x1b, 0xdd, - 0x8a, 0x65, 0x51, 0x8a, 0x9f, 0xb1, 0x1e, 0xae, 0xd9, 0xc2, 0x7d, 0x06, 0x84, 0xf6, 0x13, 0xa5, 0xbd, 0x89, 0x34, - 0x41, 0xf7, 0x1d, 0x5b, 0x01, 0xc8, 0x00, 0x8a, 0xba, 0xda, 0xad, 0xcf, 0xf9, 0x39, 0x92, 0x66, 0x38, 0x8c, 0x6e, - 0x9f, 0xde, 0x05, 0x77, 0x83, 0x4b, 0xd4, 0x4a, 0x5f, 0xb2, 0xb8, 0x85, 0x41, 0xb5, 0x37, 0x4b, 0x38, 0xa8, 0x99, - 0xb5, 0x36, 0x02, 0xc1, 0x64, 0x0f, 0x05, 0x15, 0x73, 0x05, 0xfb, 0xa0, 0x60, 0x2d, 0x79, 0x1d, 0x1c, 0x6e, 0xed, - 0xcb, 0x4a, 0x71, 0xf1, 0xfc, 0x22, 0x69, 0x5d, 0x58, 0xca, 0x8b, 0xe7, 0x0d, 0x18, 0x5c, 0x8e, 0xb0, 0xa9, 0x2a, - 0x7f, 0xb2, 0x01, 0xd0, 0xad, 0x90, 0x22, 0x5e, 0x94, 0xc2, 0xb6, 0x95, 0xcf, 0x9c, 0xb0, 0xc1, 0x86, 0x3d, 0xc0, - 0xbd, 0x32, 0x28, 0x19, 0x5c, 0x88, 0x71, 0xbb, 0xd9, 0x05, 0xb8, 0x82, 0xa1, 0x30, 0xb6, 0xe6, 0x6f, 0x32, 0x2f, - 0x52, 0x02, 0x6e, 0x86, 0x28, 0x5f, 0x1b, 0x38, 0x99, 0xf4, 0xe4, 0x5a, 0xb2, 0x18, 0xb0, 0xa0, 0xc1, 0x77, 0xd4, - 0xfa, 0x3b, 0x93, 0x7f, 0xe3, 0xe9, 0xa1, 0x1f, 0x7c, 0xce, 0xbc, 0xa5, 0xcf, 0xde, 0x54, 0x32, 0x5a, 0x93, 0x44, - 0x79, 0xf5, 0x70, 0x09, 0x72, 0xc3, 0x72, 0xf4, 0xc0, 0x96, 0x20, 0x4e, 0x2c, 0x47, 0x09, 0x65, 0x74, 0x85, 0x7b, - 0x95, 0xd9, 0x32, 0x11, 0x48, 0x71, 0x60, 0x29, 0xe5, 0xde, 0x62, 0x1d, 0x2c, 0x71, 0x7f, 0x22, 0xb9, 0x80, 0x92, - 0x07, 0x50, 0xae, 0x14, 0x10, 0xf0, 0xe9, 0x00, 0xca, 0x97, 0xf2, 0x22, 0xfc, 0x89, 0x13, 0x35, 0x58, 0x8e, 0x1e, - 0x1a, 0xf6, 0xa3, 0x17, 0x5a, 0xf6, 0x87, 0x3b, 0xad, 0x69, 0x58, 0xf1, 0x3b, 0x98, 0x16, 0x13, 0xb7, 0x2f, 0x57, - 0x76, 0x55, 0x7c, 0xb6, 0x52, 0x67, 0x37, 0x35, 0x24, 0x61, 0x5f, 0x91, 0x55, 0x80, 0x83, 0x55, 0x11, 0xf7, 0x2c, - 0xcb, 0x7d, 0x18, 0xfd, 0xb9, 0x49, 0x4b, 0x61, 0xa1, 0x4a, 0xfa, 0xfb, 0xa6, 0x14, 0x48, 0x65, 0xa2, 0x13, 0x2d, - 0x04, 0x57, 0x60, 0x10, 0xb8, 0x17, 0x79, 0x0d, 0x80, 0x31, 0xe0, 0x52, 0xa0, 0x2c, 0xdb, 0x12, 0x42, 0xaa, 0xfb, - 0x19, 0xa8, 0xed, 0xc4, 0x7d, 0x1a, 0x91, 0xb5, 0x10, 0x7d, 0x15, 0x8c, 0x99, 0xf3, 0x52, 0xba, 0xc5, 0xa6, 0xab, - 0xcd, 0xea, 0x06, 0x9d, 0x4b, 0x5b, 0x6e, 0x7e, 0xc2, 0x16, 0x6b, 0x05, 0xca, 0x26, 0x24, 0x6d, 0xe7, 0x3c, 0x47, - 0xd9, 0x84, 0x96, 0xf6, 0x9e, 0x7a, 0x54, 0xa8, 0x4e, 0xb6, 0x5e, 0xaa, 0xa6, 0x16, 0x61, 0xb5, 0xb8, 0xa8, 0xfc, - 0x00, 0x74, 0x53, 0x69, 0xf5, 0xb2, 0xae, 0xd1, 0x14, 0x6a, 0xb5, 0x70, 0xdc, 0x68, 0x67, 0xd3, 0x65, 0x7a, 0x87, - 0x38, 0xab, 0xd2, 0x0e, 0xfd, 0x7d, 0xa6, 0x5d, 0x2f, 0x3b, 0xfa, 0xcd, 0xb8, 0xba, 0xc0, 0x85, 0xd8, 0x80, 0xcf, - 0xb9, 0xbf, 0xbc, 0xde, 0xf3, 0xb8, 0xe7, 0x1f, 0x0e, 0xc8, 0x9e, 0xd4, 0xfe, 0x50, 0x7d, 0xec, 0x0a, 0x86, 0x2c, - 0x8c, 0x52, 0x7f, 0x91, 0xf2, 0xde, 0x13, 0x1c, 0xf7, 0xcf, 0x55, 0x8f, 0xfd, 0x98, 0xf1, 0x7d, 0x5d, 0x6c, 0xa2, - 0x84, 0xa2, 0x1a, 0x7a, 0xab, 0x62, 0x53, 0x89, 0xb8, 0x78, 0xc8, 0x7b, 0x0c, 0x93, 0x61, 0x2c, 0x64, 0x2a, 0xfc, - 0x29, 0x53, 0xc1, 0x23, 0x84, 0x12, 0x37, 0xeb, 0x1e, 0x69, 0x37, 0x21, 0x4e, 0xa9, 0x16, 0xa5, 0x4c, 0xc6, 0xbf, - 0xf5, 0x13, 0x28, 0xcf, 0x29, 0x5a, 0xa6, 0x1f, 0x15, 0x2e, 0xd3, 0x37, 0xeb, 0xe3, 0xd2, 0x33, 0x11, 0xea, 0xcc, - 0xc5, 0xa6, 0xd6, 0xe9, 0x18, 0x3b, 0xa5, 0x53, 0x1b, 0xf6, 0xa5, 0x52, 0x5c, 0x56, 0x14, 0xfe, 0x8d, 0x44, 0x56, - 0x3d, 0x23, 0x8e, 0xff, 0x2b, 0x6b, 0x9f, 0x61, 0x15, 0xf8, 0x65, 0x20, 0xef, 0x17, 0x00, 0x1f, 0xd7, 0x75, 0x99, - 0xde, 0x6e, 0x80, 0x36, 0x84, 0x86, 0xbf, 0xe7, 0x23, 0x03, 0xa6, 0xfb, 0x08, 0x67, 0x48, 0x0f, 0x75, 0xce, 0xe9, - 0xac, 0x4c, 0xe7, 0x5c, 0x85, 0xb5, 0x04, 0x7b, 0x39, 0x69, 0x72, 0xb9, 0x2e, 0x41, 0xcd, 0x04, 0x6e, 0x1f, 0xda, - 0x23, 0x42, 0xa8, 0x4d, 0x59, 0x4d, 0x2f, 0xa1, 0xe6, 0x9d, 0x9c, 0x76, 0x34, 0x29, 0xc1, 0x55, 0x43, 0x67, 0xe5, - 0xfa, 0xaf, 0xc3, 0xa1, 0x77, 0x9b, 0x15, 0xd1, 0x1f, 0x3d, 0xf4, 0x77, 0xdc, 0xde, 0xa4, 0x5f, 0x20, 0x5a, 0xc6, - 0xfa, 0x1b, 0x32, 0xa0, 0xe3, 0xc9, 0xf0, 0xb6, 0xd8, 0xf6, 0xd8, 0x17, 0xd4, 0x60, 0xe9, 0xeb, 0xc7, 0x1f, 0x20, - 0xa1, 0xea, 0xda, 0x17, 0x16, 0x4f, 0x98, 0xa7, 0x44, 0xdb, 0xc2, 0x87, 0xb0, 0xd0, 0x2f, 0x10, 0x19, 0x09, 0xe1, - 0xa6, 0xb2, 0x7b, 0x94, 0xb4, 0x0b, 0x7d, 0xe9, 0x6b, 0xd9, 0x57, 0xbe, 0x73, 0x01, 0xb0, 0xb2, 0xcf, 0x6d, 0xb8, - 0x27, 0xfd, 0x29, 0xd5, 0x87, 0xed, 0x6f, 0xc9, 0x02, 0x0a, 0x2d, 0xac, 0xa7, 0x72, 0x76, 0xae, 0x4b, 0x9e, 0x66, - 0xd3, 0xfd, 0x1a, 0xf6, 0xa8, 0x7b, 0xf4, 0x9a, 0x0a, 0xce, 0x2f, 0xcd, 0xe8, 0xfd, 0xd3, 0x50, 0xa8, 0x8e, 0x3a, - 0x77, 0x90, 0x75, 0x69, 0x5d, 0x72, 0x7e, 0xb3, 0x72, 0x47, 0x61, 0x7e, 0x1f, 0x82, 0x67, 0x58, 0xf7, 0xee, 0xe2, - 0xbc, 0xf7, 0x67, 0x6b, 0x8e, 0xfc, 0x98, 0xcd, 0x52, 0xc4, 0x22, 0x99, 0x83, 0xd5, 0x0f, 0xfd, 0x3c, 0xf6, 0xdb, - 0x20, 0x87, 0xe3, 0xa6, 0x01, 0x1d, 0x36, 0x64, 0xd6, 0xbe, 0x44, 0xe0, 0x54, 0x23, 0x48, 0x53, 0x13, 0xd4, 0x2c, - 0x0f, 0x91, 0xd8, 0x2e, 0x65, 0xdb, 0x20, 0xd7, 0x5d, 0x30, 0xcd, 0x91, 0xf6, 0x0c, 0xde, 0x37, 0x69, 0x92, 0x0a, - 0xcd, 0x22, 0x6d, 0x95, 0x8c, 0x7f, 0x47, 0xda, 0x4c, 0xc9, 0x1e, 0x5b, 0x03, 0xef, 0x25, 0x28, 0x27, 0xc3, 0x14, - 0xc3, 0x77, 0x7c, 0xbd, 0xf3, 0x98, 0x7b, 0xce, 0x31, 0xdb, 0xa4, 0xec, 0x08, 0x26, 0xc9, 0xc6, 0x37, 0x14, 0x6f, - 0xf8, 0xfe, 0xb6, 0x12, 0x25, 0x80, 0x5e, 0x16, 0xfc, 0x85, 0xb4, 0xb9, 0x42, 0xb7, 0xbb, 0x77, 0x94, 0xc2, 0x2f, - 0x79, 0x79, 0x38, 0x6c, 0x53, 0x2f, 0x84, 0xce, 0x17, 0xf1, 0x3b, 0x30, 0x87, 0x31, 0xc4, 0x66, 0x04, 0x08, 0x73, - 0x7c, 0x40, 0x1d, 0xac, 0x1f, 0x01, 0x68, 0x9c, 0x40, 0x01, 0x46, 0x5f, 0x6d, 0x0b, 0xfa, 0x96, 0x17, 0x17, 0x11, - 0xa2, 0x46, 0x01, 0x26, 0x4a, 0x9a, 0xc5, 0x30, 0x1c, 0xe8, 0xfc, 0xbe, 0xb9, 0xad, 0x4b, 0x81, 0x43, 0xef, 0x58, - 0x86, 0xff, 0xfe, 0x3f, 0xd6, 0x96, 0x56, 0x95, 0xed, 0xd6, 0x38, 0xcd, 0xfc, 0x6f, 0xb7, 0x85, 0xbe, 0xff, 0x4a, - 0x28, 0x9e, 0x77, 0xbc, 0x6e, 0xbf, 0x83, 0xe8, 0x7d, 0xdd, 0xca, 0xbb, 0x52, 0xbb, 0x61, 0xa6, 0xfc, 0x21, 0xcd, - 0xe3, 0xe2, 0x61, 0x14, 0xb7, 0x8e, 0xbc, 0x49, 0x7a, 0xce, 0xf9, 0xbb, 0xaa, 0xdf, 0xf7, 0xde, 0x01, 0x19, 0xef, - 0x2b, 0x61, 0x1c, 0x31, 0x89, 0x83, 0x6f, 0x2f, 0x46, 0xd1, 0xa6, 0x84, 0x0d, 0xb9, 0x7d, 0x5a, 0x82, 0x66, 0xa6, - 0xdf, 0x47, 0x89, 0xd2, 0x9a, 0xef, 0x7f, 0x93, 0xf3, 0xfd, 0x95, 0x90, 0x37, 0x2b, 0xf9, 0xe1, 0xa3, 0x15, 0x06, - 0xbe, 0xc7, 0xe9, 0x17, 0xd1, 0x63, 0x77, 0xa5, 0x0f, 0xdf, 0x95, 0x96, 0x3e, 0xab, 0xa8, 0x7f, 0xa0, 0xa2, 0xe6, - 0x95, 0x18, 0x11, 0xf1, 0x20, 0x68, 0x67, 0xdb, 0xa5, 0x76, 0x2d, 0x41, 0xbb, 0x60, 0x53, 0xd8, 0xbf, 0x1f, 0x1d, - 0xf2, 0x7e, 0xff, 0x63, 0xee, 0xb5, 0x78, 0xdd, 0x75, 0x68, 0xca, 0x4f, 0x85, 0x87, 0x10, 0xc0, 0x5a, 0x06, 0xca, - 0x38, 0xc2, 0xa4, 0x8b, 0xbc, 0x46, 0xd9, 0x74, 0x22, 0xf0, 0x31, 0xcb, 0xae, 0x9c, 0x64, 0x1a, 0x60, 0x46, 0x35, - 0x85, 0x99, 0x00, 0x23, 0xf5, 0x11, 0xeb, 0xa6, 0xa7, 0x55, 0x68, 0xf9, 0x1a, 0x82, 0x75, 0x91, 0x65, 0x1c, 0xc5, - 0x4c, 0x00, 0xb0, 0xf9, 0x08, 0xf2, 0x15, 0x5d, 0x1d, 0x92, 0x56, 0xaa, 0xbc, 0x5f, 0x67, 0x44, 0x46, 0x93, 0x10, - 0xcd, 0x6f, 0xe1, 0x81, 0x7d, 0xdb, 0xcc, 0xa8, 0x52, 0xcf, 0xa8, 0xca, 0x67, 0x38, 0x2c, 0x85, 0x63, 0xc4, 0xff, - 0x7b, 0xaa, 0x7a, 0x44, 0xa0, 0x57, 0x65, 0x5a, 0x45, 0x45, 0x9e, 0x8b, 0x08, 0x11, 0xaa, 0xa5, 0x73, 0x38, 0xf4, - 0x63, 0xbf, 0x8f, 0x03, 0x61, 0x5e, 0xfc, 0xe9, 0xb1, 0xae, 0xfc, 0xa9, 0xc0, 0xb5, 0x92, 0x02, 0xa7, 0xa2, 0x46, - 0x88, 0x10, 0xde, 0x9f, 0xc0, 0xb3, 0x9a, 0xfa, 0x7e, 0x63, 0x99, 0xe8, 0xfe, 0x99, 0x01, 0xe5, 0x0f, 0xc8, 0xd7, - 0x95, 0x14, 0x67, 0xea, 0xe4, 0x31, 0x71, 0xc6, 0x01, 0x88, 0xf9, 0xba, 0x44, 0xa3, 0xb1, 0xff, 0x01, 0x09, 0x86, - 0xea, 0x07, 0x3b, 0xdd, 0xd4, 0xfb, 0x57, 0x26, 0x71, 0x14, 0x7d, 0xda, 0x26, 0x8f, 0x25, 0x4b, 0xa3, 0x85, 0xa3, - 0xf7, 0x88, 0x61, 0x1c, 0x4e, 0xe7, 0x63, 0x92, 0x6d, 0x4c, 0x56, 0x01, 0xa4, 0x93, 0x99, 0x3a, 0xa6, 0xd4, 0xd1, - 0x38, 0xd7, 0x0b, 0xaa, 0xd0, 0x63, 0x5d, 0xf2, 0x1c, 0xac, 0x27, 0x3f, 0x78, 0xa5, 0x3f, 0x15, 0x72, 0x0e, 0x1b, - 0x89, 0xa0, 0xf0, 0x03, 0x5c, 0x0d, 0x56, 0x0a, 0x18, 0x4c, 0x7d, 0x0b, 0x5f, 0x13, 0xcf, 0x51, 0xf0, 0x28, 0xec, - 0x62, 0x6c, 0xad, 0x7c, 0xe7, 0x93, 0x82, 0x72, 0xcf, 0x8a, 0x39, 0xaf, 0x80, 0x73, 0x19, 0x14, 0xc2, 0x74, 0x3c, - 0xcb, 0xff, 0x99, 0xe4, 0xf5, 0xc4, 0x86, 0x00, 0x19, 0xfc, 0x29, 0x71, 0x5a, 0xba, 0x43, 0x77, 0x1e, 0x7a, 0x16, - 0x71, 0xd8, 0xe8, 0xc9, 0xba, 0x2c, 0xb6, 0x29, 0xea, 0x25, 0xcc, 0x0f, 0xe4, 0xe7, 0x2d, 0xf9, 0x3e, 0x44, 0xf1, - 0x36, 0xf8, 0x35, 0x63, 0xb1, 0xc0, 0xbf, 0xfe, 0x9e, 0x31, 0x9a, 0x68, 0xc1, 0xbf, 0xb3, 0x06, 0x89, 0x8a, 0x7f, - 0xca, 0x26, 0x00, 0xeb, 0xc8, 0xd5, 0x87, 0x4f, 0x89, 0xf1, 0xd6, 0x6c, 0x78, 0xe4, 0x9b, 0x15, 0xe8, 0xd4, 0xe7, - 0xee, 0xca, 0xf6, 0x54, 0x35, 0xfe, 0x9e, 0xea, 0x6a, 0xa4, 0xaa, 0x1a, 0x7f, 0x4f, 0xa9, 0x1a, 0xbf, 0x65, 0x14, - 0xbf, 0x53, 0xf9, 0x0c, 0x99, 0x93, 0x4d, 0x4c, 0xd2, 0xe9, 0x7b, 0xc3, 0x89, 0x5d, 0xf6, 0xab, 0xb7, 0x89, 0xcc, - 0x44, 0x0a, 0xb9, 0x37, 0x00, 0x6d, 0xbf, 0xcb, 0x0d, 0xa7, 0xc4, 0xf9, 0xb9, 0x87, 0x2b, 0x36, 0xad, 0x5e, 0xd1, - 0x82, 0x05, 0x36, 0x2f, 0xb3, 0x3c, 0x45, 0x02, 0xdb, 0xa6, 0xcc, 0xfa, 0x73, 0xee, 0x01, 0x04, 0x33, 0xa9, 0x09, - 0x00, 0x69, 0x21, 0x2a, 0x85, 0xc8, 0x5f, 0xe1, 0xac, 0x3e, 0xe7, 0xbd, 0x4d, 0x1e, 0x13, 0x69, 0x75, 0xaf, 0xdf, - 0x4f, 0xcf, 0xd2, 0x9c, 0x82, 0x1a, 0x8e, 0xb3, 0x4e, 0xbf, 0xcf, 0x82, 0x3a, 0x91, 0xab, 0xf4, 0x1f, 0x6e, 0x90, - 0x97, 0xf1, 0x7d, 0xdd, 0xf6, 0xfc, 0x89, 0xfa, 0x7b, 0x67, 0xfd, 0x6d, 0x81, 0xe0, 0x4e, 0x8e, 0xfd, 0x64, 0x55, - 0xca, 0x13, 0xe3, 0xd2, 0xde, 0xf3, 0x9b, 0xba, 0x28, 0xb2, 0x3a, 0x5d, 0x7f, 0x90, 0x7a, 0x1a, 0xdd, 0x17, 0x7b, - 0x30, 0x06, 0xef, 0x00, 0xf0, 0x4c, 0x87, 0x06, 0x48, 0xdf, 0x33, 0xf2, 0x70, 0x9f, 0x5b, 0xf2, 0x93, 0xca, 0xda, - 0x24, 0x61, 0x45, 0xb1, 0x19, 0xc6, 0x08, 0x25, 0xe3, 0x34, 0xb6, 0x7e, 0xbf, 0xaf, 0xfe, 0xde, 0x61, 0x14, 0x15, - 0x15, 0x77, 0x8c, 0x46, 0x65, 0x55, 0x8f, 0xb6, 0x83, 0xc3, 0xe1, 0x3c, 0xb7, 0x71, 0xb4, 0xf5, 0x0a, 0xd8, 0x5b, - 0xa1, 0x52, 0xf6, 0x4a, 0x84, 0xe5, 0x87, 0x2b, 0xbf, 0xdf, 0x87, 0x7f, 0x65, 0xa4, 0x85, 0xe7, 0x4f, 0xf1, 0xd7, - 0xa2, 0x2e, 0x30, 0x3c, 0x83, 0xd6, 0x68, 0x05, 0xc1, 0x04, 0xff, 0xe8, 0x40, 0xbd, 0xb4, 0xd2, 0x3e, 0x82, 0x6e, - 0x05, 0x7a, 0x50, 0x0f, 0x7d, 0x9a, 0xb4, 0x2f, 0x24, 0xea, 0xf6, 0x56, 0xa7, 0xd1, 0x1f, 0x15, 0x5c, 0x4e, 0x61, - 0x72, 0xb8, 0xa1, 0x4f, 0xab, 0x70, 0xfb, 0x09, 0x9e, 0xfe, 0x0c, 0x94, 0x5b, 0x87, 0x43, 0x0e, 0x62, 0x0b, 0xb8, - 0x79, 0xac, 0xc2, 0xcf, 0x45, 0x29, 0x23, 0xea, 0xe3, 0x69, 0x01, 0xda, 0xbb, 0x00, 0x1d, 0xb0, 0x34, 0x88, 0x57, - 0x48, 0x9e, 0xb3, 0x11, 0xc0, 0xb2, 0x03, 0xcb, 0x59, 0xc6, 0x29, 0xcc, 0xb3, 0x7c, 0xa1, 0x56, 0xda, 0x59, 0x99, - 0x78, 0x35, 0xcb, 0xc0, 0x59, 0xe0, 0xa2, 0xf2, 0x59, 0xa6, 0x55, 0x4f, 0x55, 0x82, 0x3e, 0xaf, 0xe4, 0x04, 0x57, - 0x82, 0x93, 0x0d, 0xc8, 0x2f, 0x40, 0x92, 0xa6, 0x94, 0x35, 0xe5, 0x8b, 0x4b, 0xba, 0x21, 0xa3, 0xe7, 0xbc, 0xe7, - 0x45, 0xc3, 0xd0, 0xbf, 0xf0, 0x4a, 0x08, 0xdf, 0xc4, 0x6d, 0x1b, 0xa5, 0xb0, 0xbf, 0x09, 0x2c, 0x3e, 0x61, 0x3f, - 0x78, 0x4b, 0x7f, 0x3a, 0x0e, 0xc2, 0x21, 0x72, 0x43, 0xc5, 0x1c, 0xd8, 0xd3, 0x80, 0xc5, 0x26, 0xbe, 0xda, 0x4c, - 0xe2, 0xc1, 0xc0, 0xd7, 0x19, 0x8b, 0x59, 0x0c, 0x34, 0xc8, 0xf1, 0xe0, 0x72, 0xae, 0x4f, 0x08, 0xfd, 0x30, 0xa2, - 0x72, 0x54, 0xa0, 0x73, 0x10, 0x0d, 0x96, 0x80, 0xa7, 0xde, 0xca, 0x06, 0x49, 0xc6, 0x24, 0x93, 0xb8, 0xd6, 0x24, - 0xd5, 0xe1, 0x84, 0xd6, 0x81, 0x8e, 0xab, 0x0b, 0xe8, 0x7c, 0x5c, 0xf7, 0x3e, 0x5e, 0x0d, 0x17, 0x54, 0xfa, 0x85, - 0x18, 0x78, 0xf5, 0x74, 0x1c, 0x5c, 0xd2, 0xad, 0x70, 0xb1, 0x0a, 0xb7, 0x3f, 0xcb, 0x07, 0x8e, 0x3b, 0x2a, 0x69, - 0x08, 0x0c, 0xde, 0x1e, 0xba, 0x9b, 0x19, 0x1a, 0xea, 0xa4, 0x7d, 0x18, 0x87, 0x72, 0x88, 0x55, 0x2b, 0x2e, 0xa4, - 0x37, 0x82, 0x6f, 0x17, 0x8a, 0xb1, 0x6c, 0xec, 0xd2, 0x50, 0x14, 0xfe, 0x0a, 0x60, 0x87, 0xda, 0x5f, 0xa9, 0xe4, - 0x63, 0x64, 0x54, 0xd3, 0x40, 0xc7, 0x00, 0x2c, 0x59, 0x9a, 0x48, 0xaa, 0x48, 0x23, 0xf1, 0x47, 0x66, 0xac, 0xa3, - 0xa6, 0xeb, 0x0b, 0xa6, 0xaa, 0x45, 0xd2, 0xed, 0x4c, 0x62, 0x39, 0x91, 0xa4, 0xb6, 0xfb, 0x88, 0x18, 0x0c, 0x7c, - 0xb0, 0x11, 0xd3, 0x4c, 0x84, 0x23, 0x1e, 0x95, 0xc8, 0xa2, 0xcb, 0x6f, 0xa3, 0x4c, 0xda, 0xbe, 0xac, 0xc8, 0x16, - 0x04, 0xd3, 0x93, 0xe8, 0x83, 0x24, 0xe5, 0x54, 0x24, 0xd2, 0x8c, 0x10, 0xe0, 0xc7, 0x93, 0xf2, 0x4a, 0x7f, 0x0e, - 0x9a, 0x56, 0x82, 0x97, 0x0c, 0x92, 0x47, 0xe2, 0x67, 0x52, 0x30, 0x8b, 0xb1, 0x6a, 0x30, 0xc0, 0x72, 0xaa, 0x67, - 0x8e, 0x49, 0xfa, 0x6f, 0x9d, 0x4e, 0xd8, 0x2f, 0xbd, 0xdc, 0xd6, 0xf2, 0xa6, 0xb9, 0xf7, 0xd2, 0xab, 0x58, 0xaa, - 0x61, 0x19, 0xf4, 0x5f, 0x13, 0xed, 0x82, 0xad, 0x2d, 0x63, 0xc2, 0xaa, 0x1f, 0x40, 0xda, 0x23, 0x5d, 0x5e, 0x35, - 0xcc, 0x99, 0xe0, 0xd1, 0x85, 0x35, 0x0f, 0xa2, 0x0b, 0xe1, 0x23, 0x97, 0xdd, 0x24, 0xb9, 0x1a, 0x4f, 0xfc, 0x70, - 0x30, 0x50, 0x00, 0xb4, 0xb4, 0x4e, 0x8a, 0x41, 0xf8, 0x4c, 0xc8, 0x81, 0x34, 0x3a, 0xaa, 0x02, 0x2c, 0x96, 0xd9, - 0x55, 0x39, 0xc9, 0x06, 0x03, 0x1f, 0xc4, 0xc6, 0xc4, 0x6e, 0x68, 0x36, 0xf7, 0xd9, 0x89, 0x82, 0xac, 0x36, 0x87, - 0xad, 0x99, 0x6e, 0x81, 0x01, 0xc0, 0x20, 0x22, 0x58, 0xee, 0x73, 0x23, 0x1f, 0x51, 0xa7, 0xa7, 0x30, 0x02, 0x82, - 0x5f, 0x4e, 0x04, 0x22, 0x17, 0x09, 0xd4, 0x03, 0xcc, 0x04, 0x98, 0x51, 0xc5, 0xf0, 0x12, 0xd8, 0xc5, 0x73, 0xf3, - 0x8a, 0x41, 0xff, 0xa2, 0x49, 0x96, 0x68, 0x2a, 0x71, 0x34, 0x46, 0x4e, 0xa5, 0x31, 0x32, 0x20, 0x76, 0x71, 0xfc, - 0x7b, 0x4a, 0x8f, 0x82, 0x94, 0x7d, 0xae, 0x0c, 0x71, 0x38, 0x8a, 0xaf, 0x60, 0xd5, 0x38, 0x1c, 0x6a, 0xf3, 0x7a, - 0x3a, 0xab, 0xe7, 0x03, 0x11, 0xc0, 0x7f, 0x43, 0xc1, 0x7e, 0xd1, 0x54, 0xe4, 0x06, 0xa9, 0xf3, 0x70, 0x48, 0x41, - 0x3e, 0xd5, 0x4d, 0xfe, 0xbe, 0x72, 0xf7, 0xd3, 0xd9, 0xdc, 0x9a, 0xa3, 0x17, 0x35, 0xae, 0x5b, 0xab, 0x1b, 0x0a, - 0x89, 0xd6, 0x34, 0x29, 0xae, 0xaa, 0x49, 0x31, 0xe0, 0xb9, 0x2f, 0x54, 0x17, 0x5b, 0x23, 0x58, 0xf8, 0x73, 0x0b, - 0x84, 0xc9, 0xb8, 0x17, 0x1f, 0x2d, 0xe4, 0x94, 0x76, 0x6d, 0xb5, 0xdb, 0x56, 0x36, 0xa4, 0x68, 0x3e, 0xbc, 0x84, - 0x5d, 0x3a, 0x45, 0xb4, 0xed, 0x92, 0xe0, 0x0b, 0xd0, 0xb2, 0xba, 0x10, 0x79, 0x4c, 0xbf, 0x42, 0x7e, 0x29, 0x86, - 0x7f, 0x95, 0xee, 0xcd, 0xa9, 0x0d, 0x72, 0x00, 0xdb, 0xbd, 0x87, 0xdb, 0x31, 0x7a, 0x20, 0x83, 0x37, 0x42, 0xce, - 0x39, 0xbf, 0x9c, 0x5a, 0x33, 0x26, 0x1a, 0x16, 0xac, 0x1c, 0x46, 0x7e, 0x80, 0x8c, 0x97, 0x53, 0x60, 0x65, 0x3f, - 0x2a, 0xe2, 0xd2, 0x1f, 0x46, 0xfe, 0xc5, 0xf3, 0x20, 0xe3, 0x5e, 0x34, 0xec, 0xf8, 0x02, 0xec, 0xd5, 0x17, 0xcf, - 0x59, 0x34, 0xe0, 0xd5, 0x55, 0x3d, 0xcd, 0x82, 0x61, 0xc6, 0xa2, 0xab, 0x62, 0x08, 0x3e, 0xb4, 0x2f, 0xca, 0x41, - 0xe8, 0xfb, 0x66, 0xe7, 0xd0, 0xdd, 0x90, 0xc8, 0x23, 0xec, 0x47, 0x70, 0xdb, 0xd5, 0x12, 0x33, 0x98, 0x6c, 0xee, - 0x22, 0x66, 0xb0, 0xe5, 0x2f, 0x9e, 0x1b, 0x2e, 0xa1, 0xea, 0x85, 0xd4, 0x6c, 0x14, 0x68, 0x4e, 0xae, 0xd0, 0x9c, - 0xac, 0x84, 0x5a, 0xf2, 0x49, 0x85, 0x13, 0x76, 0x3e, 0xc9, 0x95, 0xdd, 0x68, 0x8c, 0x81, 0x8b, 0xf6, 0xdc, 0x16, - 0x46, 0x66, 0x3a, 0x4b, 0xd1, 0x80, 0x85, 0x67, 0xe2, 0x94, 0xc6, 0x80, 0xf6, 0xe5, 0xc0, 0xd2, 0x86, 0xfc, 0x28, - 0x67, 0x06, 0xda, 0x86, 0x94, 0x46, 0xcd, 0xc0, 0x9f, 0xa9, 0x09, 0xf3, 0x2b, 0x58, 0x89, 0x20, 0xaa, 0x0b, 0x30, - 0x49, 0x72, 0x32, 0x1a, 0x29, 0x2b, 0x91, 0x9c, 0x03, 0xde, 0x47, 0xf0, 0x64, 0x11, 0xdb, 0xda, 0x9f, 0xd2, 0xff, - 0xea, 0xf0, 0xb9, 0xf4, 0x9f, 0x09, 0x60, 0x21, 0x97, 0x06, 0x91, 0x81, 0xc2, 0x21, 0x35, 0x95, 0x88, 0x13, 0xc7, - 0x33, 0xf0, 0x0d, 0x5c, 0xa0, 0x29, 0xa0, 0x3f, 0xa8, 0x19, 0x45, 0x64, 0xe1, 0xaf, 0x9e, 0xdd, 0xd4, 0x8d, 0x9e, - 0x67, 0xce, 0x6b, 0xd0, 0xcc, 0x40, 0x48, 0x8f, 0x53, 0xf5, 0x36, 0x24, 0x3a, 0x2f, 0x2f, 0xf5, 0xcb, 0x84, 0x48, - 0x56, 0x44, 0x9e, 0xbe, 0xcf, 0xc1, 0x3c, 0xa2, 0x08, 0x1d, 0x5c, 0x99, 0x87, 0xc3, 0xb9, 0xa0, 0xf0, 0x1d, 0xe5, - 0xf9, 0x80, 0xd3, 0x2c, 0x4a, 0x40, 0x1b, 0xc8, 0x72, 0x53, 0xe6, 0x3a, 0x69, 0x99, 0xba, 0xf7, 0x60, 0x25, 0xa8, - 0xd0, 0xcd, 0x29, 0x28, 0x94, 0x91, 0xa0, 0x94, 0x56, 0x83, 0x50, 0xaa, 0xc3, 0x22, 0x88, 0x1c, 0xb2, 0x10, 0x70, - 0x33, 0x15, 0x8d, 0x96, 0x34, 0x3c, 0xc2, 0xb9, 0x81, 0x42, 0x00, 0x12, 0x7b, 0xaa, 0x28, 0xe3, 0x72, 0x08, 0xf8, - 0x28, 0xe1, 0x10, 0x67, 0x4d, 0xda, 0xf2, 0x1c, 0xc4, 0xb1, 0x5c, 0xf2, 0x75, 0x85, 0x60, 0x10, 0xa1, 0xcf, 0x90, - 0x3f, 0x59, 0xce, 0xbf, 0x5b, 0x87, 0x69, 0x47, 0xf8, 0xb0, 0xab, 0x2d, 0xb8, 0x98, 0xdd, 0xce, 0x27, 0x10, 0xdf, - 0x72, 0x3b, 0x3f, 0xc6, 0x10, 0x59, 0xf8, 0x83, 0xbb, 0xa1, 0xe4, 0x8a, 0x42, 0x97, 0xf5, 0x88, 0x14, 0xd9, 0xd3, - 0x35, 0x47, 0x10, 0x1c, 0x68, 0xd5, 0x20, 0x43, 0x23, 0xf1, 0xc5, 0x73, 0xc8, 0x1a, 0xac, 0xf9, 0xe7, 0x8a, 0x9c, - 0xd5, 0xfd, 0xc9, 0x06, 0xaa, 0x49, 0x26, 0x6b, 0x45, 0xe5, 0xfc, 0xf5, 0xaa, 0x2c, 0x4f, 0x56, 0x65, 0xb8, 0x1a, - 0x74, 0x55, 0x65, 0xc9, 0x91, 0xda, 0x00, 0xad, 0xe9, 0x0a, 0x31, 0x14, 0xb2, 0x06, 0x4b, 0xab, 0x2a, 0x6b, 0xea, - 0x13, 0x08, 0xf4, 0x01, 0x96, 0x51, 0xb3, 0x9f, 0x0e, 0xff, 0x15, 0xfc, 0x4b, 0x85, 0x2c, 0xd5, 0x69, 0x9d, 0x89, - 0x5f, 0x83, 0x25, 0xc3, 0x3f, 0x7e, 0x0b, 0xd6, 0x80, 0x25, 0x40, 0x96, 0xbb, 0x8d, 0x8d, 0xd6, 0x2b, 0xaf, 0x10, - 0x5f, 0x6a, 0x7d, 0xd1, 0x6f, 0xdd, 0x26, 0x6a, 0x05, 0x18, 0xa1, 0xd0, 0x22, 0xc0, 0x56, 0x0f, 0xdc, 0x53, 0xf0, - 0x03, 0x31, 0x9c, 0x6b, 0xd2, 0x9a, 0x3a, 0xe1, 0x75, 0x36, 0x8e, 0x44, 0x54, 0x6f, 0xe1, 0xe2, 0x5e, 0x6f, 0x2d, - 0xfe, 0x46, 0x05, 0x02, 0x20, 0x8b, 0x29, 0xd6, 0xce, 0x1b, 0xd2, 0x2b, 0xc3, 0x4e, 0x42, 0xef, 0x0d, 0x3b, 0x81, - 0xbc, 0x38, 0xec, 0x14, 0xba, 0x44, 0xdb, 0x29, 0x52, 0x13, 0x6d, 0x27, 0x2d, 0x56, 0x61, 0x09, 0xc1, 0xaf, 0xda, - 0x5b, 0x47, 0xd9, 0xbe, 0xc8, 0x12, 0xa6, 0x2d, 0x60, 0x94, 0x5b, 0xf5, 0x99, 0x53, 0xc4, 0x4a, 0xd9, 0x3b, 0x9d, - 0x54, 0xb9, 0x8b, 0x7c, 0x6a, 0x35, 0x45, 0x26, 0x7f, 0x7f, 0xdc, 0x22, 0xf9, 0xe4, 0xe7, 0x76, 0xc3, 0x64, 0xfa, - 0xc7, 0xa3, 0x2f, 0xa0, 0x2b, 0xb2, 0xd3, 0x27, 0x10, 0x90, 0xa9, 0xa0, 0x5a, 0xdd, 0x2a, 0xa6, 0x79, 0xbb, 0xca, - 0x6e, 0x2f, 0x94, 0x18, 0x4e, 0x67, 0x27, 0xe1, 0xd1, 0x66, 0xc8, 0xc0, 0x21, 0x08, 0x14, 0x42, 0x45, 0x31, 0x3c, - 0x02, 0xb5, 0x46, 0xf2, 0x01, 0x7e, 0xb4, 0x3b, 0x15, 0x44, 0x6a, 0x37, 0x15, 0x37, 0x4e, 0x6e, 0xba, 0x5e, 0x0a, - 0xd4, 0x3a, 0x25, 0x2b, 0x80, 0x12, 0xa2, 0xfe, 0x24, 0xb6, 0xf5, 0x2b, 0xb8, 0x62, 0xf3, 0x7d, 0xa3, 0xe8, 0xc9, - 0xf5, 0x29, 0xea, 0x56, 0x5c, 0x9d, 0xa6, 0xad, 0xe6, 0xd8, 0x71, 0x86, 0x1c, 0x3c, 0x2b, 0x08, 0xb6, 0xa3, 0x12, - 0xe5, 0x75, 0xbb, 0xe9, 0x98, 0xd8, 0xea, 0x9f, 0x45, 0xb5, 0xb9, 0x83, 0x8a, 0x88, 0xf8, 0x28, 0xbb, 0x79, 0xd2, - 0x7e, 0x07, 0x7b, 0xac, 0xd5, 0x20, 0xb2, 0xcf, 0xe0, 0x2a, 0xd7, 0x69, 0x91, 0xdb, 0x32, 0x38, 0xff, 0xf0, 0x6a, - 0x57, 0x61, 0x93, 0x63, 0x5d, 0x5d, 0xcd, 0x54, 0x27, 0x15, 0x1b, 0x18, 0x6b, 0x5a, 0x4b, 0x35, 0x8f, 0x21, 0xe9, - 0xae, 0x2c, 0xce, 0xaa, 0xa4, 0x9b, 0x9e, 0x1b, 0x67, 0x0a, 0x31, 0x70, 0xb6, 0x1a, 0x2d, 0x67, 0x18, 0xa2, 0xeb, - 0xc3, 0x2c, 0xf1, 0x5b, 0x3d, 0xe5, 0x3e, 0x0f, 0xb7, 0x7e, 0x57, 0x2f, 0x38, 0x99, 0xec, 0x27, 0xc7, 0xb9, 0xdb, - 0x45, 0xda, 0x4f, 0x7c, 0x1b, 0xe6, 0x5f, 0xdf, 0x20, 0xee, 0x44, 0xfd, 0xcf, 0x0a, 0x80, 0x06, 0x37, 0x79, 0x2c, - 0x51, 0xea, 0xf7, 0xaa, 0xfa, 0x41, 0xcd, 0x54, 0x4d, 0x03, 0xc1, 0x9c, 0x4a, 0x01, 0x7f, 0xb8, 0x5d, 0xb8, 0xe2, - 0x11, 0x37, 0x2c, 0x8c, 0x7f, 0x7a, 0x35, 0x3b, 0x15, 0x54, 0x06, 0x6e, 0xc6, 0x7f, 0x7a, 0x82, 0x9d, 0xc2, 0x5a, - 0x01, 0x59, 0xe1, 0x4f, 0x2f, 0x7f, 0xe4, 0xfd, 0x8a, 0xff, 0xe9, 0x55, 0x8f, 0xbc, 0x8f, 0x38, 0x2f, 0x7f, 0x22, - 0xa9, 0x13, 0xa2, 0xba, 0xfc, 0x49, 0x98, 0x62, 0xab, 0x34, 0x7f, 0x4d, 0x0a, 0x9f, 0xe0, 0x33, 0xf0, 0x1d, 0xae, - 0xc2, 0xad, 0xf9, 0x0d, 0x1e, 0x3b, 0x16, 0xdb, 0x2e, 0xf5, 0x05, 0x94, 0x23, 0xb0, 0x88, 0xdc, 0x7e, 0xbb, 0xb2, - 0x5f, 0x2d, 0x8c, 0x32, 0xc6, 0xee, 0x4b, 0x56, 0xa2, 0x74, 0xd6, 0xef, 0x17, 0x52, 0x30, 0xb2, 0x0b, 0x6b, 0xb4, - 0x47, 0xa9, 0x7a, 0xf5, 0x3a, 0xac, 0xa3, 0x24, 0xcd, 0xef, 0x64, 0xf4, 0x91, 0x0c, 0x3b, 0xd2, 0x57, 0x52, 0xa2, - 0xbd, 0x56, 0x61, 0x39, 0x9a, 0xfd, 0xba, 0xe4, 0x40, 0x79, 0xdd, 0x0a, 0xca, 0x57, 0x4d, 0x00, 0xbd, 0x52, 0xed, - 0x33, 0xd0, 0x0a, 0x0a, 0x4b, 0xe5, 0xc1, 0x4a, 0x9c, 0x8b, 0x3e, 0x2b, 0x0e, 0x07, 0x75, 0x31, 0x24, 0x14, 0xa8, - 0x12, 0x27, 0xa1, 0x11, 0xcf, 0xe1, 0x42, 0x28, 0x5e, 0xe4, 0x18, 0x5b, 0x91, 0x03, 0x07, 0x32, 0xfc, 0x80, 0xc0, - 0x7b, 0xd9, 0xbf, 0x82, 0xc1, 0x30, 0xc1, 0x8d, 0x8c, 0x3a, 0x39, 0x67, 0x7f, 0x62, 0x60, 0x06, 0xf5, 0xa4, 0x76, - 0x9f, 0xdd, 0xab, 0xc0, 0x5e, 0x38, 0x03, 0xda, 0xbb, 0x31, 0xfa, 0x59, 0x15, 0x6b, 0x27, 0xfd, 0x53, 0xb1, 0x86, - 0x64, 0x3a, 0x2c, 0x8e, 0xb6, 0x69, 0x78, 0x24, 0x4f, 0x8e, 0xe3, 0x4d, 0xff, 0x70, 0x18, 0xe3, 0xc7, 0x51, 0x7e, - 0x6d, 0x01, 0xaf, 0xe2, 0x16, 0xd2, 0x58, 0xa4, 0xe8, 0x1d, 0x88, 0x39, 0x14, 0xbd, 0x64, 0xbf, 0x65, 0xbc, 0x9c, - 0x08, 0x4a, 0x49, 0x62, 0xc3, 0x3b, 0xd2, 0xd3, 0xb4, 0x1e, 0x6d, 0x65, 0xc0, 0x7e, 0x3d, 0xda, 0xd1, 0x5f, 0xa0, - 0x78, 0xb4, 0xf0, 0x97, 0xf4, 0x77, 0x71, 0x37, 0xf7, 0x9c, 0x6f, 0x1a, 0xdf, 0x11, 0x17, 0x28, 0xd6, 0xec, 0xfe, - 0x9a, 0x96, 0xce, 0x3a, 0x10, 0x1c, 0xf0, 0x16, 0xbb, 0x68, 0xdf, 0x6f, 0x5c, 0xa7, 0xa7, 0xfd, 0xb7, 0x6e, 0x8d, - 0xf2, 0xbd, 0x7f, 0x4a, 0x94, 0x83, 0xfd, 0x6b, 0x17, 0xcd, 0xdf, 0x7e, 0xca, 0x90, 0x54, 0x68, 0x6e, 0xb0, 0x9d, - 0x6c, 0x11, 0xd6, 0xc6, 0x38, 0xa8, 0xd8, 0x5d, 0x19, 0x46, 0xc0, 0xa0, 0x8e, 0xfd, 0x8f, 0x3e, 0x9b, 0x36, 0x64, - 0x1f, 0x00, 0x2a, 0x57, 0x21, 0x60, 0x0f, 0xc0, 0x89, 0x46, 0xb8, 0x01, 0x6e, 0x35, 0x5a, 0xd2, 0x41, 0xdd, 0x16, - 0x0c, 0x44, 0x4b, 0xd8, 0xc8, 0xdb, 0xae, 0x4e, 0x5f, 0x11, 0x3e, 0xd4, 0x4e, 0x4a, 0x87, 0xf2, 0x57, 0xcf, 0xd9, - 0xff, 0xec, 0xb0, 0xa6, 0xa6, 0xdc, 0x00, 0x66, 0xce, 0x4a, 0xe4, 0x15, 0x42, 0xa7, 0xc8, 0xef, 0x55, 0x5d, 0x89, - 0xe1, 0xb2, 0x16, 0x65, 0x67, 0x76, 0xeb, 0x44, 0xef, 0x9c, 0x82, 0x5a, 0x2a, 0x1b, 0xe4, 0x24, 0xd5, 0xe6, 0x23, - 0x6b, 0x05, 0x25, 0xea, 0x1a, 0x05, 0x8e, 0x4f, 0xb9, 0x76, 0xff, 0xef, 0x9c, 0x09, 0x6a, 0xb6, 0x51, 0xdd, 0x5f, - 0xeb, 0xa7, 0xaa, 0x26, 0xb1, 0x00, 0x97, 0x93, 0x34, 0xef, 0x78, 0x84, 0xd5, 0x3f, 0x4e, 0x96, 0x22, 0xd0, 0xeb, - 0x88, 0x76, 0x25, 0x20, 0x41, 0x3b, 0x39, 0x0b, 0x15, 0x81, 0x02, 0x7d, 0xfd, 0xfb, 0x4d, 0x9a, 0xc5, 0x72, 0x35, - 0xdb, 0xc3, 0x44, 0x59, 0xac, 0x87, 0x08, 0x72, 0x66, 0xea, 0x60, 0xbf, 0xa7, 0x19, 0xcd, 0xc2, 0x2b, 0x53, 0x82, - 0x4b, 0x71, 0x15, 0x15, 0x39, 0xf8, 0x1c, 0xe2, 0x0b, 0x9f, 0x0a, 0xb9, 0x41, 0x44, 0xd3, 0xef, 0x25, 0xaa, 0x1d, - 0x29, 0x90, 0x43, 0xc9, 0x4f, 0x88, 0xbf, 0x64, 0x6d, 0x8c, 0xfb, 0xa5, 0x53, 0xed, 0x57, 0x0a, 0xc1, 0xfd, 0x67, - 0x5b, 0x6c, 0x54, 0x79, 0xa2, 0x47, 0x9f, 0x62, 0xfd, 0x4f, 0x16, 0x50, 0xaa, 0xfb, 0x36, 0x38, 0x15, 0x8f, 0xc2, - 0x4d, 0x5d, 0xdc, 0x20, 0xb4, 0x40, 0x39, 0xaa, 0x8a, 0x4d, 0x19, 0x11, 0x27, 0xec, 0xa6, 0x2e, 0x7a, 0x9a, 0x03, - 0x9d, 0x3a, 0x2c, 0x4d, 0xe4, 0x89, 0xd0, 0x6e, 0x41, 0xf7, 0x34, 0xc7, 0x4a, 0xbc, 0x94, 0xa5, 0x83, 0xac, 0x13, - 0x69, 0x42, 0xe5, 0xae, 0xae, 0x3a, 0x2a, 0x95, 0xba, 0xe1, 0x4d, 0xaa, 0x19, 0x7f, 0x97, 0xe6, 0x4f, 0x2c, 0xfb, - 0x4d, 0xeb, 0xb7, 0x5a, 0xed, 0x8d, 0xd5, 0xa3, 0x92, 0x35, 0xc7, 0xd9, 0x84, 0xa4, 0xf4, 0x09, 0xdb, 0xcd, 0xa4, - 0x6b, 0x1d, 0x78, 0x12, 0x5c, 0x0e, 0x3d, 0x01, 0x15, 0x83, 0x26, 0xde, 0xee, 0x02, 0xf5, 0x08, 0x3c, 0x03, 0xe5, - 0x13, 0xb5, 0x0e, 0xf8, 0x79, 0xad, 0xe5, 0x29, 0x23, 0x0c, 0xab, 0x9d, 0x45, 0xcb, 0xc1, 0x79, 0xa7, 0x08, 0x5c, - 0xbb, 0x12, 0x78, 0x3e, 0x54, 0xef, 0x85, 0x80, 0xe1, 0xfe, 0xa9, 0x50, 0xd9, 0xec, 0x66, 0x38, 0x8f, 0x1a, 0xa7, - 0x07, 0xda, 0xdb, 0xae, 0xf5, 0x50, 0xef, 0xba, 0x9d, 0xdb, 0x4a, 0xf7, 0x7e, 0xed, 0x64, 0xd2, 0x05, 0xb4, 0x36, - 0x9f, 0x7d, 0x67, 0x57, 0x5a, 0x37, 0x3d, 0x67, 0x0f, 0xb6, 0x6e, 0x89, 0xce, 0x05, 0xd1, 0xe4, 0xf7, 0x03, 0xcf, - 0xda, 0x76, 0xf4, 0xdb, 0xb4, 0x63, 0x9b, 0x7b, 0xa8, 0x7b, 0x05, 0xb5, 0xde, 0xd0, 0xbc, 0x7f, 0xe6, 0xda, 0x76, - 0x7c, 0xf5, 0xeb, 0xba, 0xc3, 0x75, 0xde, 0x04, 0xc7, 0x4d, 0xd7, 0xb6, 0xda, 0xd9, 0xcf, 0xdd, 0xbd, 0xb5, 0x88, - 0xc2, 0x2c, 0xfb, 0xb1, 0x28, 0xfe, 0xa8, 0xf4, 0x1d, 0x81, 0x8e, 0xee, 0xbc, 0xa8, 0xd3, 0xe5, 0xee, 0x03, 0x61, - 0x3c, 0x79, 0xf5, 0x11, 0xd1, 0xad, 0xef, 0x33, 0xf7, 0x2b, 0xc0, 0x8d, 0xe0, 0x0e, 0xa2, 0xbd, 0x5b, 0xea, 0x93, - 0x5a, 0x7d, 0xad, 0xd7, 0xce, 0xd3, 0xf3, 0x9b, 0xce, 0xed, 0x77, 0xdf, 0x1c, 0x6d, 0xbd, 0xc7, 0x85, 0xb5, 0xb2, - 0xf4, 0x54, 0x15, 0xec, 0xcd, 0xf2, 0x54, 0x15, 0x4c, 0x1e, 0x78, 0xcd, 0x7e, 0x41, 0x83, 0x2b, 0x1d, 0x6d, 0xbc, - 0x27, 0x6a, 0xe0, 0x16, 0x85, 0xa5, 0xc3, 0x2f, 0xb9, 0x99, 0xbc, 0xc2, 0xfd, 0xa5, 0x22, 0x17, 0xfb, 0xce, 0x19, - 0xdd, 0x99, 0x59, 0xf7, 0xaa, 0xc2, 0xd5, 0x82, 0x5c, 0x1d, 0xd8, 0x5a, 0x76, 0x71, 0xb8, 0x61, 0x11, 0x05, 0x08, - 0xc4, 0xf4, 0x4a, 0xad, 0xfd, 0x11, 0x0d, 0x42, 0x3e, 0x18, 0xf8, 0x05, 0x06, 0xab, 0x02, 0x85, 0x0f, 0x14, 0xc9, - 0x5f, 0x7b, 0x02, 0x76, 0xf1, 0x0c, 0xd0, 0xad, 0xd8, 0xac, 0x18, 0x21, 0x42, 0x26, 0xcb, 0x59, 0x4d, 0x67, 0x90, - 0x4f, 0x7d, 0xf1, 0x8d, 0xad, 0x3a, 0x9d, 0xb7, 0x35, 0x55, 0x4e, 0x1d, 0x0a, 0xdd, 0xdd, 0xd4, 0x9d, 0x5b, 0x17, - 0x79, 0xea, 0x10, 0x72, 0xa5, 0x62, 0x25, 0xa6, 0xa1, 0xe6, 0x49, 0x9a, 0x51, 0x7f, 0xb1, 0xf7, 0x7b, 0x8d, 0xc2, - 0x29, 0x7f, 0x3a, 0x06, 0x55, 0xb8, 0xaa, 0x21, 0x8e, 0xa5, 0x2a, 0x1e, 0xd9, 0x20, 0xd0, 0xbc, 0xba, 0x55, 0x49, - 0x13, 0x32, 0xb9, 0x11, 0x3e, 0x35, 0x29, 0xe5, 0x69, 0xda, 0xa4, 0x95, 0x22, 0x75, 0xf0, 0x41, 0x9d, 0x6a, 0x3c, - 0x37, 0xab, 0x17, 0x00, 0x66, 0x9c, 0x5f, 0xf1, 0x4b, 0xc5, 0x65, 0xd4, 0x56, 0x66, 0xd2, 0xfe, 0xe4, 0x68, 0x6c, - 0xd4, 0xe5, 0xb4, 0x51, 0x46, 0x58, 0x29, 0xcd, 0x49, 0xb1, 0x1c, 0xcf, 0x3f, 0x60, 0xb0, 0xe6, 0x09, 0xec, 0x60, - 0xa2, 0x52, 0xde, 0x47, 0x40, 0x7c, 0x9d, 0xa4, 0x77, 0x09, 0xa4, 0x48, 0xff, 0xd2, 0x25, 0x77, 0x19, 0x1b, 0x88, - 0x31, 0x2b, 0x66, 0x46, 0xff, 0x83, 0xbb, 0xa4, 0x3f, 0x09, 0x01, 0x70, 0x13, 0x4d, 0xa1, 0x53, 0xe7, 0xc9, 0x45, - 0x1e, 0x2c, 0x2f, 0x3c, 0xb4, 0x62, 0xc4, 0x83, 0xbf, 0xbe, 0x08, 0x11, 0xc4, 0x1c, 0x53, 0x3c, 0xfd, 0xc2, 0xe8, - 0x2f, 0xc1, 0x25, 0x46, 0x10, 0xba, 0x7b, 0xe7, 0x30, 0x84, 0x9b, 0x3d, 0xc8, 0xa0, 0xfe, 0x50, 0x87, 0x44, 0x0d, - 0x7f, 0xac, 0x3c, 0xe8, 0xff, 0x3a, 0x13, 0x96, 0xda, 0x4f, 0x4f, 0x07, 0x50, 0xc1, 0xfb, 0x8a, 0xb7, 0x11, 0xf1, - 0x7d, 0xe2, 0x67, 0xf1, 0x60, 0xf3, 0x6c, 0x03, 0xd6, 0xba, 0x27, 0xb9, 0xb1, 0xae, 0x12, 0x36, 0x10, 0xf0, 0x35, - 0x8a, 0xda, 0xf3, 0xda, 0xed, 0x1e, 0xfc, 0xd5, 0xbf, 0x08, 0x19, 0x30, 0x71, 0xfa, 0x3e, 0x73, 0xb2, 0x46, 0x17, - 0x99, 0x4c, 0x1f, 0x3a, 0xe9, 0x1b, 0x9d, 0xee, 0x3b, 0xe1, 0x1f, 0x15, 0xb3, 0xf8, 0x70, 0x4b, 0x5f, 0x69, 0x52, - 0xdc, 0x01, 0x2b, 0x9b, 0x47, 0x05, 0xa1, 0xce, 0x45, 0xf4, 0x95, 0x29, 0xdf, 0x12, 0x6a, 0xf6, 0x8d, 0x25, 0xa5, - 0x74, 0xaf, 0xa1, 0x37, 0x69, 0xad, 0xdf, 0x46, 0x09, 0xc6, 0x44, 0xc7, 0x93, 0x97, 0xf1, 0x58, 0x79, 0x1f, 0x8f, - 0x1b, 0xa9, 0x90, 0x07, 0x20, 0x02, 0x15, 0xe3, 0x4f, 0x57, 0x9e, 0x9c, 0xf4, 0xc2, 0x78, 0x15, 0x4a, 0x41, 0x61, - 0x40, 0x57, 0x20, 0x05, 0x3c, 0x6a, 0x4f, 0x74, 0x16, 0x76, 0x09, 0xf7, 0xe8, 0x26, 0x60, 0xac, 0xcf, 0x3f, 0x02, - 0x9a, 0xbb, 0x70, 0x87, 0x17, 0x03, 0xd4, 0xa6, 0x5e, 0xdd, 0x7d, 0x5c, 0xab, 0x73, 0x38, 0x04, 0x07, 0xab, 0x41, - 0x04, 0xa7, 0xf3, 0xa9, 0xa3, 0x59, 0x16, 0xa0, 0x72, 0xb2, 0xdc, 0xc8, 0x9b, 0x47, 0x8b, 0x5e, 0xdd, 0xf7, 0x96, - 0x69, 0x59, 0xd5, 0x41, 0xc6, 0xb2, 0xb0, 0x02, 0x5c, 0x1d, 0x5a, 0x3f, 0x08, 0x97, 0x85, 0xf3, 0x07, 0x42, 0x10, - 0xbb, 0x57, 0xdb, 0x92, 0xe7, 0x6a, 0x0e, 0x3f, 0x7b, 0xce, 0xd6, 0x5c, 0xa2, 0x4e, 0x3a, 0x13, 0x01, 0x88, 0x3d, - 0x35, 0xab, 0xe8, 0x1a, 0x48, 0xea, 0x34, 0xab, 0xe8, 0x9a, 0x9a, 0x6d, 0x8c, 0x03, 0xf9, 0x68, 0x95, 0x02, 0xf6, - 0xdd, 0x74, 0x1c, 0xac, 0x9e, 0xc5, 0xf2, 0x3a, 0x74, 0xf7, 0x6c, 0xa3, 0x7c, 0x06, 0x75, 0xab, 0x8d, 0x31, 0xb1, - 0xdd, 0x7c, 0x39, 0xd7, 0x6f, 0x07, 0x4b, 0xdf, 0x0e, 0x9a, 0x73, 0xca, 0xbe, 0xd3, 0x65, 0xaf, 0xec, 0xb2, 0xa9, - 0xe7, 0x8e, 0x8a, 0x56, 0x63, 0x40, 0x6f, 0x60, 0xc1, 0xfa, 0x5c, 0xa4, 0xd9, 0xaa, 0x54, 0x25, 0xe0, 0x85, 0xb1, - 0x62, 0x77, 0x7e, 0x23, 0x33, 0x24, 0x61, 0x1e, 0x67, 0xe2, 0x9a, 0xee, 0xb5, 0x30, 0x39, 0x8e, 0x45, 0x32, 0x25, - 0x74, 0x4a, 0x77, 0xb6, 0xa1, 0x73, 0x15, 0x46, 0x11, 0xad, 0x95, 0x54, 0x1a, 0x09, 0x4c, 0xcd, 0x00, 0x25, 0x73, - 0x05, 0x4e, 0xe9, 0x72, 0xff, 0x3b, 0x12, 0xe3, 0xcc, 0x17, 0x25, 0x33, 0xa0, 0x5b, 0x7e, 0x5d, 0xac, 0x5b, 0x29, - 0x32, 0xc2, 0xbc, 0x39, 0x6e, 0xaf, 0xeb, 0x43, 0x20, 0x57, 0xcb, 0x1e, 0x45, 0xe3, 0xa0, 0xd0, 0xe1, 0x52, 0x25, - 0xc0, 0xbe, 0x48, 0xfc, 0x8c, 0xb0, 0xa5, 0x3d, 0x90, 0xdb, 0xa3, 0x33, 0x61, 0xce, 0x39, 0x29, 0xcb, 0xce, 0xa5, - 0x19, 0x5c, 0x4e, 0x5c, 0x09, 0x2e, 0xd2, 0xdb, 0xf6, 0x34, 0x69, 0x69, 0xfb, 0xd8, 0x70, 0x8e, 0x86, 0xb6, 0x41, - 0x77, 0xec, 0x0f, 0xcd, 0xc5, 0x22, 0xb6, 0x2e, 0x16, 0xc3, 0xce, 0xec, 0x47, 0x8b, 0x05, 0xc8, 0x01, 0xe0, 0xa8, - 0xdb, 0xf0, 0x31, 0x5b, 0x02, 0xa7, 0xd5, 0x34, 0x9b, 0x7a, 0x1b, 0x5e, 0x3d, 0x53, 0x3d, 0xbd, 0xe4, 0xf9, 0x33, - 0x61, 0xc6, 0x62, 0xc3, 0xf3, 0x67, 0xd6, 0x91, 0x53, 0x3d, 0x13, 0x4a, 0xb4, 0x2e, 0xa0, 0x19, 0x78, 0x4d, 0x01, - 0x23, 0x96, 0x4c, 0xa6, 0x54, 0x91, 0xc7, 0xbd, 0xe9, 0x46, 0x0d, 0x5e, 0x50, 0x38, 0x04, 0x52, 0x3a, 0xfd, 0xe2, - 0x39, 0xd3, 0xef, 0x5d, 0x3c, 0xef, 0x90, 0xb5, 0x0d, 0xd3, 0xe5, 0x66, 0x98, 0x0c, 0x4a, 0xff, 0x99, 0x99, 0x18, - 0x17, 0xd6, 0x24, 0x01, 0xc4, 0xbf, 0xb1, 0xdf, 0x21, 0x85, 0x9b, 0xf7, 0x97, 0xc3, 0xf8, 0x91, 0xf7, 0x63, 0x64, - 0x4f, 0xd2, 0x0c, 0xb1, 0x66, 0x52, 0x21, 0x77, 0x5f, 0xad, 0x7f, 0x4c, 0xec, 0x26, 0x7b, 0x60, 0x01, 0x88, 0xad, - 0x69, 0xab, 0x5b, 0xde, 0xef, 0x7b, 0xa6, 0x08, 0xf0, 0x83, 0xf2, 0x8f, 0xee, 0x0c, 0xc9, 0xa0, 0xec, 0xba, 0x21, - 0xc4, 0x83, 0xb2, 0x69, 0xda, 0xeb, 0x6d, 0xef, 0xcc, 0x63, 0x75, 0x9d, 0x76, 0x16, 0x57, 0x8b, 0x0c, 0xd2, 0xea, - 0x43, 0x76, 0x9c, 0xd9, 0x67, 0x47, 0x4b, 0xa5, 0xfb, 0x7d, 0x88, 0x88, 0x3b, 0xca, 0xda, 0x7e, 0xbb, 0x05, 0xd7, - 0x70, 0x34, 0x08, 0x5d, 0xd9, 0xdb, 0x65, 0xb4, 0x71, 0x21, 0x8e, 0x7b, 0xa6, 0xf3, 0x05, 0x5f, 0x1e, 0xa5, 0x9d, - 0x07, 0xa7, 0x7a, 0xa2, 0xcf, 0x4d, 0x77, 0x95, 0xc9, 0xb5, 0x0e, 0xab, 0x31, 0xa8, 0xcd, 0xc2, 0x16, 0xee, 0xc2, - 0x36, 0x3a, 0x68, 0xed, 0xcb, 0x82, 0x7f, 0xca, 0x00, 0x7c, 0xe9, 0xd9, 0xb2, 0xed, 0x35, 0x69, 0xf5, 0x46, 0x46, - 0x21, 0xb6, 0xb4, 0xbd, 0xfa, 0x74, 0x94, 0x8f, 0x9b, 0x13, 0x8a, 0x0b, 0x39, 0xca, 0x8f, 0x5e, 0x43, 0xd4, 0xb5, - 0xae, 0xe3, 0x62, 0xd1, 0xe1, 0xc6, 0x55, 0xb7, 0xdd, 0xb8, 0x7e, 0x40, 0xbc, 0x35, 0xda, 0xa4, 0x50, 0x2b, 0x63, - 0x47, 0xf0, 0xb2, 0x7c, 0x38, 0x64, 0x62, 0x38, 0x94, 0x90, 0xa9, 0x8f, 0xdd, 0x1b, 0x9a, 0xf6, 0xf9, 0x69, 0xeb, - 0x47, 0x2c, 0x35, 0x8e, 0x62, 0xc3, 0x3b, 0x7d, 0xe7, 0xb1, 0x35, 0xae, 0xe4, 0xcb, 0x60, 0xb6, 0x2b, 0xa8, 0xb6, - 0xc6, 0x1b, 0xf6, 0x72, 0xfe, 0x7d, 0x25, 0x95, 0xfc, 0xed, 0xcf, 0x70, 0x0d, 0x6f, 0x6d, 0xe9, 0xa0, 0xa9, 0x66, - 0x39, 0xcb, 0xf5, 0xbd, 0xe0, 0xf8, 0xe3, 0xee, 0x15, 0xc1, 0xe0, 0xf7, 0x74, 0x14, 0xe4, 0x62, 0xa9, 0xd6, 0x80, - 0x82, 0x74, 0x64, 0xc7, 0x54, 0x16, 0x18, 0x06, 0xf0, 0x86, 0x0c, 0x90, 0xc7, 0x14, 0xee, 0x86, 0x0a, 0x2f, 0xfc, - 0xa5, 0x22, 0xbb, 0x04, 0xb6, 0x35, 0xe3, 0x63, 0x86, 0x3b, 0x08, 0xf9, 0x47, 0xb0, 0x3b, 0xb6, 0x62, 0xb7, 0x6c, - 0xc1, 0x90, 0x6c, 0x1c, 0x87, 0x31, 0xe6, 0xe3, 0x49, 0x7c, 0x25, 0x26, 0xf1, 0x80, 0x47, 0xe8, 0x18, 0xb1, 0xe6, - 0xf5, 0x2c, 0x96, 0x03, 0xc8, 0xee, 0xb8, 0xd2, 0x01, 0x21, 0x34, 0x36, 0xb4, 0xe4, 0x4d, 0x61, 0x70, 0xb1, 0x63, - 0x9f, 0x91, 0x48, 0xc6, 0x21, 0x58, 0xb4, 0xaa, 0x81, 0x85, 0x89, 0xdd, 0xf2, 0x62, 0xb6, 0x9a, 0xe3, 0x3f, 0x87, - 0x03, 0x02, 0x60, 0x07, 0xfb, 0x86, 0xdd, 0x45, 0x88, 0xf4, 0xb6, 0xe0, 0x77, 0x96, 0xa7, 0x0b, 0xbb, 0xe7, 0xd7, - 0x7c, 0xcc, 0xce, 0x7f, 0xf0, 0x20, 0x72, 0xf6, 0xfc, 0x23, 0xa0, 0x21, 0xde, 0xf3, 0xdb, 0xd4, 0xab, 0xd8, 0x2d, - 0x51, 0x10, 0xde, 0x82, 0x33, 0xd0, 0x3d, 0x44, 0xc0, 0x5e, 0xf3, 0x05, 0xc6, 0x8a, 0x9d, 0xa5, 0x4b, 0x0f, 0x33, - 0x42, 0xed, 0xe9, 0x7c, 0x59, 0xab, 0x49, 0xb8, 0xb9, 0x5a, 0x4e, 0x06, 0x83, 0x8d, 0xbf, 0xe3, 0x6b, 0xe0, 0x83, - 0x39, 0xff, 0xc1, 0xdb, 0x51, 0xb9, 0xf0, 0x9f, 0xd7, 0x59, 0xf2, 0xce, 0x67, 0xd7, 0x03, 0xbe, 0x00, 0xbc, 0x25, - 0x74, 0xe0, 0xba, 0xf7, 0x99, 0xc4, 0x6b, 0xbb, 0xd6, 0xd7, 0x08, 0x24, 0xf2, 0x05, 0x60, 0xc4, 0xc4, 0xfc, 0xbe, - 0x86, 0x08, 0x8c, 0x04, 0x7c, 0x5b, 0xb5, 0x47, 0xfc, 0x96, 0x1b, 0xc0, 0xaf, 0xcc, 0x67, 0x0f, 0x3c, 0xd4, 0x3f, - 0x13, 0x9f, 0xdd, 0xf0, 0xf7, 0xfc, 0x85, 0x27, 0x25, 0xe9, 0x72, 0xf6, 0x7e, 0x0e, 0xd7, 0x43, 0x29, 0x4f, 0x87, - 0xf4, 0xb3, 0x31, 0x18, 0x40, 0x28, 0x64, 0xde, 0x78, 0xc0, 0x9a, 0x14, 0xe2, 0x5f, 0xc0, 0xb7, 0xa3, 0x84, 0xcd, - 0x1b, 0x6f, 0xeb, 0x6b, 0x79, 0xf3, 0xc6, 0x7b, 0xf0, 0x29, 0x0a, 0xb0, 0x0a, 0x4a, 0x59, 0x60, 0x15, 0x84, 0x8d, - 0x36, 0xc2, 0x18, 0xb8, 0x7a, 0xd7, 0x18, 0xea, 0x7a, 0x8e, 0xd8, 0xb6, 0xd2, 0x77, 0xe1, 0x3b, 0xc8, 0x80, 0x0f, - 0xde, 0x14, 0x25, 0xd1, 0xe7, 0xd4, 0x14, 0x49, 0xeb, 0x9e, 0xfb, 0xad, 0x75, 0x47, 0x6b, 0x4a, 0x7d, 0xe4, 0x6a, - 0x7c, 0x38, 0xd4, 0x2f, 0x84, 0x16, 0x09, 0xa6, 0xa0, 0x71, 0x0d, 0xda, 0x02, 0x04, 0x7d, 0x1e, 0x20, 0x6b, 0x49, - 0xb1, 0xe0, 0xdb, 0x5f, 0x21, 0x06, 0xaf, 0x4c, 0xef, 0x5c, 0xae, 0x32, 0x12, 0xb6, 0x17, 0x7e, 0x39, 0xac, 0xfd, - 0x89, 0x53, 0x0b, 0x4b, 0xab, 0x39, 0xa8, 0x9f, 0xd9, 0x72, 0x9c, 0xaa, 0xda, 0xbf, 0x25, 0x49, 0xb5, 0xab, 0xb4, - 0x9c, 0xde, 0xdb, 0x37, 0x5d, 0x26, 0xd8, 0xd8, 0x0f, 0xa8, 0x3a, 0xb2, 0x1a, 0x76, 0x5f, 0xa8, 0x2f, 0x7a, 0x4a, - 0x26, 0x34, 0x1f, 0x55, 0x34, 0xcf, 0xee, 0x37, 0x3b, 0xea, 0x3f, 0xbd, 0x1c, 0x8a, 0x00, 0xc9, 0x2a, 0x2d, 0x96, - 0x22, 0x67, 0x63, 0x3f, 0x1e, 0x26, 0x99, 0x0a, 0x2f, 0x48, 0x47, 0x77, 0xbf, 0x71, 0x7f, 0xcb, 0x0d, 0x64, 0x85, - 0x56, 0x6d, 0x30, 0x56, 0x8a, 0x96, 0xc1, 0xfa, 0x6a, 0xdc, 0xef, 0x8b, 0xab, 0xf1, 0x54, 0x04, 0x35, 0x10, 0x17, - 0x89, 0x17, 0xe3, 0x69, 0x4d, 0x2c, 0xa9, 0x5d, 0x81, 0x31, 0x7a, 0x5c, 0x15, 0xb5, 0x4f, 0xfd, 0x02, 0x42, 0x91, - 0x6a, 0xcd, 0x1c, 0x6b, 0xdc, 0x18, 0x11, 0x77, 0x58, 0xb9, 0x76, 0x6a, 0xaf, 0x03, 0xb0, 0xbc, 0x1a, 0x17, 0x84, - 0x4d, 0x72, 0xec, 0x5c, 0xc0, 0x6a, 0x34, 0xa4, 0xda, 0x0d, 0xb7, 0x5e, 0x76, 0x7e, 0xf3, 0x38, 0xb1, 0xb5, 0x11, - 0x6e, 0x29, 0xa0, 0x8c, 0xf2, 0x1b, 0xcb, 0x09, 0xbb, 0x53, 0xbd, 0x23, 0x55, 0x3b, 0xe2, 0xc4, 0x05, 0x2c, 0x37, - 0x3c, 0xb5, 0xfa, 0x26, 0x06, 0x27, 0x42, 0xd5, 0x4a, 0xc7, 0x6b, 0x3f, 0xe2, 0x7e, 0x75, 0x5f, 0xf7, 0x4a, 0xf0, - 0x93, 0x90, 0xd7, 0x6f, 0x79, 0x07, 0x80, 0x15, 0x1f, 0xf2, 0x62, 0x5a, 0x38, 0x5a, 0x97, 0x41, 0x19, 0x20, 0x42, - 0x33, 0x00, 0x3a, 0xb9, 0x3a, 0x88, 0xd2, 0xc0, 0x15, 0x77, 0x88, 0xf0, 0xd3, 0xe8, 0x59, 0xfe, 0x22, 0x7c, 0x56, - 0x4d, 0xc3, 0x8b, 0x3c, 0x88, 0x2e, 0xaa, 0x20, 0x7a, 0x56, 0x5d, 0x85, 0xcf, 0xf2, 0x69, 0x74, 0x91, 0x07, 0xe1, - 0x45, 0xd5, 0xd8, 0x77, 0xed, 0xee, 0x9e, 0x90, 0xb7, 0x5d, 0xfd, 0x91, 0x73, 0x65, 0x4f, 0x99, 0x9e, 0x9f, 0xd7, - 0x7a, 0xa5, 0x76, 0x9b, 0xeb, 0x35, 0x6a, 0xa6, 0x3e, 0xca, 0xfe, 0x66, 0x1b, 0x0b, 0x8f, 0xe6, 0x10, 0xfa, 0x8c, - 0xb4, 0x98, 0x7b, 0x9c, 0xeb, 0xcd, 0x9e, 0x14, 0x06, 0x46, 0x4c, 0x2a, 0x19, 0x39, 0xbd, 0xc0, 0x45, 0xa8, 0x42, - 0x0c, 0x6b, 0xe9, 0x6a, 0x9f, 0x75, 0xe9, 0x0d, 0xd4, 0x35, 0xc5, 0xbe, 0x86, 0x0c, 0xbc, 0x68, 0x7a, 0x19, 0x8c, - 0x01, 0x39, 0x02, 0xef, 0xf8, 0x6c, 0x09, 0x07, 0xe6, 0x1a, 0xa0, 0x6f, 0x1e, 0xf5, 0x75, 0xb9, 0xe3, 0x6b, 0xd5, - 0x37, 0xd3, 0xf5, 0x48, 0x29, 0x3f, 0x56, 0xfc, 0xee, 0xe2, 0x39, 0xbb, 0xe5, 0x1a, 0x15, 0xe5, 0x17, 0xbd, 0x58, - 0xef, 0x81, 0xab, 0xee, 0x17, 0xb8, 0xcd, 0xe2, 0xb1, 0x2b, 0x0f, 0x58, 0xb6, 0x65, 0x0f, 0xec, 0x86, 0xbd, 0x67, - 0x4f, 0xd8, 0x5b, 0xf6, 0x8e, 0xfd, 0x84, 0xaa, 0x0d, 0x25, 0xe4, 0xf9, 0x0b, 0x7e, 0x2b, 0x4d, 0x8f, 0x12, 0x95, - 0xec, 0xc1, 0x36, 0xd3, 0x0c, 0x37, 0xec, 0x3d, 0x5f, 0x0c, 0x57, 0xec, 0x2d, 0x64, 0x43, 0x99, 0x78, 0xb0, 0x62, - 0x3f, 0x71, 0x05, 0x62, 0xa6, 0xcf, 0xc2, 0xd2, 0x12, 0x15, 0x4d, 0x99, 0x28, 0x43, 0xbf, 0xe5, 0xf8, 0x22, 0xfb, - 0x09, 0x8b, 0x90, 0x9f, 0x19, 0xae, 0xd8, 0x03, 0x5f, 0x0c, 0x56, 0xec, 0xbd, 0x36, 0x10, 0x0d, 0x36, 0x6e, 0x69, - 0x84, 0x64, 0xa5, 0xcb, 0x92, 0xd2, 0xf4, 0xd6, 0xbe, 0x06, 0x6e, 0xd8, 0x0d, 0xd6, 0xee, 0x09, 0x16, 0x8d, 0x02, - 0xff, 0x60, 0xc5, 0xde, 0x71, 0x09, 0xa0, 0xe6, 0x96, 0x27, 0xbd, 0x42, 0x75, 0x81, 0x74, 0x3f, 0x78, 0xc2, 0xe9, - 0x45, 0xf6, 0x0e, 0xcb, 0xa0, 0xaf, 0x0c, 0x57, 0x6c, 0x8b, 0xb5, 0xbb, 0x31, 0x96, 0x2d, 0xab, 0x7a, 0x12, 0x11, - 0x18, 0x05, 0x95, 0xd2, 0xf2, 0x6f, 0xc4, 0xb2, 0xa9, 0x9b, 0x06, 0xb5, 0xa1, 0x3f, 0x1f, 0x8c, 0xfe, 0xe2, 0xeb, - 0x77, 0x3f, 0x78, 0xa5, 0xbe, 0xf6, 0xfe, 0xe2, 0xb8, 0x56, 0x96, 0xe8, 0x5a, 0xf9, 0x2b, 0x2f, 0x67, 0xbf, 0xcc, - 0x27, 0xba, 0x96, 0xb4, 0xc3, 0x90, 0xaf, 0xe9, 0xec, 0x97, 0x0e, 0x67, 0xcb, 0x5f, 0x7d, 0xbf, 0x31, 0x5d, 0xac, - 0x3e, 0xab, 0x7b, 0xf7, 0x61, 0xb0, 0x69, 0x9c, 0x7a, 0xef, 0x4e, 0xd7, 0x1b, 0x9b, 0x59, 0x6b, 0xcf, 0xcc, 0xff, - 0xe1, 0x4a, 0x6f, 0x71, 0xe8, 0x6e, 0xf8, 0x76, 0xb8, 0xb1, 0x47, 0x41, 0x7e, 0x5f, 0x2a, 0x8d, 0xb3, 0x9a, 0xbf, - 0xf4, 0x3a, 0xa5, 0x58, 0x40, 0x34, 0xfa, 0x64, 0x24, 0xa1, 0x4b, 0x66, 0xe2, 0x19, 0xe2, 0x8b, 0x0c, 0x90, 0xb9, - 0x40, 0x34, 0xbb, 0xe7, 0xe3, 0xc9, 0xfd, 0x55, 0x3c, 0xb9, 0x1f, 0xf0, 0x4f, 0xa6, 0x05, 0xed, 0xc5, 0x76, 0xef, - 0xb3, 0x5f, 0x79, 0x61, 0x2f, 0xc7, 0x5f, 0x7c, 0xf6, 0x45, 0xb8, 0x2b, 0xf4, 0x17, 0x9f, 0xbd, 0x13, 0xfc, 0xd7, - 0x91, 0x26, 0xca, 0x60, 0xef, 0x6a, 0xfe, 0xeb, 0x08, 0x19, 0x3f, 0xd8, 0x67, 0xc1, 0xbf, 0x80, 0xef, 0x77, 0x95, - 0xa0, 0x55, 0xfc, 0x73, 0xad, 0x7e, 0xbe, 0x97, 0x71, 0x39, 0xf0, 0x26, 0xb4, 0x82, 0xde, 0xbc, 0xad, 0xe5, 0x4f, - 0xe2, 0xe1, 0x48, 0xd5, 0x53, 0xc3, 0x3f, 0x8b, 0xc5, 0x2c, 0xea, 0xa3, 0x74, 0x2a, 0x6f, 0x72, 0xcd, 0x33, 0x69, - 0x5d, 0xbe, 0x87, 0x50, 0xe0, 0x6b, 0x1b, 0xa2, 0x60, 0xc7, 0x71, 0x23, 0xb8, 0x66, 0xef, 0x84, 0xcf, 0xb2, 0xe9, - 0x96, 0xdf, 0xf0, 0x27, 0xfc, 0x1d, 0xdf, 0x05, 0x0f, 0xfc, 0x3d, 0x7f, 0xcb, 0x7f, 0xe2, 0x3b, 0xb6, 0x94, 0x68, - 0xa7, 0xf5, 0xf6, 0x32, 0xd8, 0xb2, 0x7a, 0x77, 0x19, 0x3c, 0xb0, 0x7a, 0xfb, 0x3c, 0xb8, 0x61, 0xf5, 0xee, 0x79, - 0xf0, 0x9e, 0x6d, 0x2f, 0x83, 0x27, 0x6c, 0x77, 0x19, 0xbc, 0x65, 0xdb, 0xe7, 0xc1, 0x3b, 0xb6, 0x7b, 0x1e, 0xfc, - 0x24, 0x31, 0x1e, 0xde, 0x09, 0xc9, 0x71, 0xf2, 0xae, 0x66, 0x86, 0x4f, 0x37, 0xf8, 0x2c, 0xac, 0x5f, 0x54, 0xc7, - 0xe0, 0x73, 0xcd, 0x74, 0x8b, 0x03, 0x21, 0x98, 0x6e, 0x6f, 0x70, 0x4b, 0x4f, 0x4c, 0xab, 0x82, 0x54, 0xb0, 0xae, - 0x76, 0x06, 0x8b, 0xba, 0x69, 0x9d, 0xc9, 0x8e, 0x5f, 0x62, 0xdc, 0xe1, 0x97, 0xb8, 0x60, 0xcb, 0xa6, 0xd3, 0x49, - 0xe7, 0xf4, 0x49, 0xa0, 0x37, 0x7f, 0xbd, 0xeb, 0x57, 0xd2, 0x77, 0xa6, 0x68, 0x78, 0xae, 0xb4, 0xc6, 0xad, 0x9d, - 0x3e, 0xb4, 0x76, 0x7a, 0x26, 0x55, 0x68, 0x11, 0x8b, 0xca, 0xa2, 0xaa, 0x90, 0x49, 0x3c, 0xc8, 0xb4, 0x3e, 0x2d, - 0x61, 0xa4, 0xc8, 0x04, 0x34, 0xfa, 0x82, 0x8e, 0x81, 0x9c, 0x2c, 0x0a, 0x6c, 0xc9, 0x37, 0x83, 0x84, 0xad, 0x79, - 0x3c, 0x1d, 0x26, 0xc1, 0x92, 0xdd, 0xf1, 0x61, 0xb7, 0x40, 0xb0, 0x52, 0x01, 0x4c, 0xfa, 0xe2, 0xd4, 0xde, 0xd7, - 0x79, 0x6f, 0x95, 0xc6, 0x71, 0x26, 0x50, 0xd9, 0x56, 0xe9, 0x0d, 0x7e, 0xeb, 0xec, 0xe7, 0x6b, 0xb5, 0xbf, 0x83, - 0xa4, 0xf0, 0x2b, 0x30, 0xec, 0x10, 0xe1, 0x1d, 0x54, 0x18, 0x79, 0x96, 0xcc, 0xa2, 0xaf, 0xec, 0x2d, 0x7d, 0x6b, - 0xb6, 0xe9, 0xff, 0xb4, 0x08, 0xda, 0xc7, 0x65, 0xe7, 0x7f, 0x32, 0xaf, 0xfe, 0xd6, 0xf1, 0xea, 0xc6, 0x9f, 0x3c, - 0xf0, 0x4f, 0x18, 0x96, 0x80, 0x89, 0x6c, 0xc7, 0x3f, 0x8d, 0xb6, 0x8d, 0x53, 0x9e, 0xdc, 0xc7, 0xff, 0xaf, 0x14, - 0x68, 0xef, 0xe4, 0x95, 0xbd, 0x23, 0x6e, 0x79, 0xc7, 0x3e, 0xbe, 0xb4, 0x36, 0x44, 0x03, 0x4d, 0xf2, 0x89, 0xbb, - 0xd1, 0xd0, 0xb0, 0x21, 0xfe, 0xc2, 0xab, 0xd9, 0xa7, 0xf9, 0x64, 0xcb, 0x8f, 0xb7, 0xc3, 0x4f, 0x1d, 0xdb, 0xe1, - 0x2f, 0xfe, 0x60, 0xd9, 0x7c, 0xad, 0x57, 0x3b, 0xb7, 0x71, 0xa7, 0xd2, 0x3b, 0x7e, 0xbc, 0x89, 0x0f, 0xff, 0xe3, - 0x4a, 0xef, 0xbe, 0xb9, 0xd2, 0x76, 0x95, 0xbb, 0x3b, 0xdf, 0x74, 0x7c, 0x23, 0x6b, 0x8d, 0x71, 0x66, 0x46, 0xb3, - 0xf8, 0x13, 0xcd, 0xd2, 0x20, 0xb2, 0x14, 0x8a, 0x3f, 0x99, 0x69, 0xa7, 0xee, 0x54, 0x59, 0xdd, 0x2d, 0xdf, 0xe2, - 0x1e, 0x7f, 0xcb, 0xc7, 0x6c, 0x61, 0x3c, 0x35, 0x6f, 0xaf, 0x16, 0x93, 0xc1, 0xe0, 0xd6, 0xdf, 0xdf, 0xf3, 0x70, - 0x76, 0x3b, 0x67, 0xd7, 0xfc, 0x9e, 0x16, 0xd3, 0x44, 0x35, 0xbd, 0x78, 0x4c, 0xf0, 0xba, 0xf5, 0xfd, 0x89, 0xc5, - 0xff, 0x6a, 0x5f, 0x34, 0x6f, 0xfd, 0x81, 0xb4, 0x46, 0xcb, 0x5d, 0xfd, 0xfd, 0xe3, 0x8a, 0x89, 0x5b, 0x10, 0x2f, - 0xde, 0xdb, 0x9a, 0x86, 0xb7, 0xfc, 0xa3, 0x77, 0xed, 0x4f, 0xaf, 0x75, 0xcc, 0xcd, 0x44, 0x1d, 0x49, 0x6f, 0x2f, - 0x9e, 0xb3, 0x5f, 0xf9, 0x27, 0x79, 0x9c, 0x7c, 0x11, 0x72, 0xd2, 0xde, 0x20, 0x77, 0x13, 0x9d, 0x12, 0xef, 0xdc, - 0x44, 0xc2, 0x82, 0x40, 0x18, 0x8e, 0x9a, 0x3f, 0x4c, 0xca, 0xa9, 0xb7, 0x03, 0x6e, 0x57, 0x6e, 0xeb, 0x9f, 0x6f, - 0x39, 0xe7, 0x8b, 0xe1, 0xe5, 0xf4, 0x5d, 0xb7, 0x4b, 0x8f, 0x8a, 0x66, 0x53, 0x81, 0x6e, 0xb7, 0x18, 0x7b, 0x75, - 0x32, 0xb3, 0xcc, 0x25, 0x5f, 0x7a, 0x57, 0x9b, 0x99, 0xc7, 0xf4, 0x7e, 0x33, 0xcd, 0x90, 0xc8, 0x17, 0x08, 0x99, - 0x0e, 0x87, 0xbb, 0x73, 0x2c, 0x8f, 0x0f, 0xdf, 0x3e, 0x7b, 0x32, 0x78, 0x82, 0x91, 0x5b, 0x56, 0x34, 0xc8, 0x3b, - 0x3e, 0xcc, 0xea, 0xd6, 0x6d, 0xe3, 0xe2, 0xf9, 0xf0, 0x17, 0xc8, 0x1b, 0x74, 0x3d, 0x34, 0x45, 0xb4, 0xca, 0xef, - 0x28, 0xfa, 0x44, 0xc9, 0x41, 0xc7, 0x13, 0xa8, 0x1d, 0x52, 0xe0, 0xbe, 0x7b, 0xc6, 0x41, 0xbf, 0x81, 0xa5, 0xf6, - 0xfb, 0xe7, 0x9f, 0x88, 0x47, 0x1a, 0xc6, 0xfb, 0xfb, 0x30, 0xfa, 0x23, 0x2e, 0x8b, 0x35, 0x9c, 0xae, 0x03, 0xf8, - 0xdc, 0x33, 0x7d, 0xfb, 0xba, 0xf3, 0x7d, 0x3f, 0xf0, 0xb6, 0xfc, 0x86, 0xbd, 0xe3, 0xde, 0xe5, 0xf0, 0xad, 0xff, - 0xec, 0x09, 0x88, 0x4e, 0x30, 0x2e, 0x9f, 0x31, 0x12, 0xb6, 0xa3, 0x18, 0xb5, 0x0a, 0x3f, 0xd7, 0x10, 0xa2, 0xf5, - 0x09, 0x19, 0xbb, 0x20, 0xfd, 0x83, 0x02, 0xf4, 0x13, 0x02, 0xab, 0x49, 0x6a, 0x14, 0x98, 0xc4, 0xb7, 0x35, 0x24, - 0x90, 0x82, 0x05, 0x42, 0x6f, 0xa0, 0xf8, 0x54, 0xf0, 0x77, 0xc3, 0xcf, 0x24, 0xf9, 0x2d, 0x6a, 0x3e, 0x86, 0xbf, - 0x61, 0x68, 0x26, 0xd5, 0x43, 0x5a, 0x47, 0x89, 0xf7, 0x93, 0xbf, 0x8f, 0xc2, 0x4a, 0xa8, 0x63, 0x21, 0x48, 0xc5, - 0x90, 0x0b, 0x71, 0xf1, 0x7c, 0x72, 0x5b, 0x8a, 0xf0, 0x8f, 0x09, 0x3e, 0x93, 0x0b, 0x4d, 0x3e, 0xa3, 0x27, 0x8d, - 0x7c, 0xff, 0x41, 0xbe, 0x2f, 0x3b, 0x35, 0x58, 0xd4, 0x43, 0x7e, 0x5b, 0xbb, 0xef, 0xcb, 0x29, 0x41, 0x8f, 0xec, - 0x07, 0x34, 0x05, 0x03, 0x35, 0x01, 0x29, 0x43, 0x70, 0x0b, 0x57, 0x7d, 0x4f, 0x15, 0xe4, 0xcb, 0xef, 0x7d, 0x16, - 0x32, 0x5c, 0x65, 0x41, 0x48, 0x72, 0xa9, 0x90, 0xc2, 0xc6, 0x6d, 0x3d, 0xf8, 0xac, 0x31, 0x49, 0x24, 0xe4, 0x94, - 0x80, 0x24, 0x69, 0x6f, 0x20, 0x49, 0xc4, 0xf4, 0x1f, 0xae, 0x93, 0xa6, 0x59, 0x49, 0xe9, 0x86, 0x38, 0x55, 0xaf, - 0x91, 0xe6, 0x2c, 0x78, 0xcf, 0x60, 0xe9, 0x48, 0xb1, 0xe2, 0x9d, 0x31, 0x18, 0xeb, 0x60, 0xa1, 0x3b, 0x59, 0xdc, - 0xaf, 0x92, 0x30, 0x8d, 0x44, 0x95, 0x2f, 0x42, 0xfe, 0xfc, 0x97, 0x12, 0x7f, 0xf4, 0x96, 0x06, 0x22, 0x10, 0xfc, - 0x00, 0xad, 0x07, 0xac, 0xf1, 0xe0, 0x27, 0x56, 0x97, 0x61, 0x5e, 0x65, 0x54, 0xde, 0x6c, 0xc7, 0xb6, 0x73, 0xa6, - 0xaa, 0x16, 0x7c, 0x16, 0x86, 0x16, 0xed, 0x6c, 0xd5, 0x9c, 0xdc, 0xe6, 0x0d, 0xbe, 0x33, 0x49, 0x22, 0xb5, 0x94, - 0x44, 0xda, 0xea, 0xfa, 0x74, 0xe9, 0x75, 0x8b, 0x0a, 0x1a, 0x23, 0x40, 0x2f, 0x49, 0x77, 0x95, 0x4f, 0x28, 0x5e, - 0x59, 0x0d, 0xab, 0xe1, 0xa5, 0x43, 0x11, 0xc6, 0xda, 0x9b, 0x2b, 0x79, 0x76, 0x07, 0xd6, 0x23, 0xb4, 0x76, 0x55, - 0xea, 0x10, 0xb6, 0x9f, 0xe8, 0x3d, 0xa7, 0x52, 0x7f, 0x03, 0xaa, 0xc0, 0xa9, 0xa3, 0xa1, 0x3e, 0x6a, 0xa7, 0x90, - 0xed, 0xdc, 0x5b, 0x12, 0x54, 0xae, 0xe4, 0xa6, 0x4a, 0x8b, 0x52, 0xca, 0x94, 0xaf, 0x65, 0xb6, 0xb2, 0xfb, 0x64, - 0x00, 0xf1, 0x6c, 0x50, 0x20, 0xb9, 0xa8, 0xad, 0xe6, 0x20, 0x7d, 0x34, 0x4b, 0x1c, 0x6b, 0x07, 0x85, 0x97, 0x55, - 0x60, 0xe6, 0x32, 0x97, 0xcb, 0x41, 0xc1, 0x72, 0xbd, 0xd5, 0x4c, 0x33, 0xd5, 0x17, 0xb9, 0xbd, 0xcd, 0x78, 0x99, - 0xfe, 0x9b, 0x25, 0x03, 0x1e, 0x5d, 0x3c, 0xf7, 0x03, 0x48, 0x93, 0xbc, 0x0e, 0x90, 0x04, 0x9b, 0x83, 0x5d, 0xec, - 0x30, 0x6c, 0x15, 0x2b, 0x7b, 0xf2, 0x74, 0xb9, 0x43, 0x53, 0x2e, 0x61, 0x24, 0x27, 0xe6, 0x52, 0xea, 0xfb, 0x92, - 0xea, 0x86, 0x82, 0x93, 0x4d, 0x13, 0x50, 0x0a, 0x68, 0xb7, 0xe0, 0xbf, 0xf0, 0xa9, 0xa1, 0xd3, 0x02, 0x2c, 0xb5, - 0xdd, 0x80, 0xff, 0x42, 0xbf, 0xd8, 0x3e, 0xa2, 0x7e, 0x60, 0x1e, 0xec, 0xcd, 0xda, 0xca, 0x18, 0x10, 0x91, 0xb8, - 0x82, 0x3c, 0x12, 0xfc, 0xa0, 0xd8, 0xd3, 0x65, 0xe2, 0xc0, 0x99, 0xe2, 0x62, 0x29, 0xb5, 0x99, 0x79, 0xed, 0xb7, - 0xd4, 0xc4, 0x9b, 0x28, 0x89, 0x0a, 0xdb, 0x21, 0x8d, 0x5e, 0x52, 0xc6, 0x54, 0xc1, 0x86, 0xe8, 0xbe, 0x6e, 0x82, - 0x29, 0xf0, 0xa6, 0xaa, 0x02, 0x22, 0xd4, 0x5e, 0x64, 0x79, 0x7e, 0xd3, 0x05, 0x56, 0x17, 0x7c, 0x6c, 0x4c, 0xb3, - 0x0b, 0x56, 0x72, 0x35, 0x93, 0x3e, 0xf3, 0x76, 0xa0, 0x85, 0xbc, 0xcb, 0xcb, 0xa2, 0x15, 0xba, 0x1e, 0x44, 0x0b, - 0x7f, 0xaf, 0x39, 0x1e, 0x3d, 0xdb, 0x56, 0x53, 0x9b, 0x7d, 0xad, 0xc5, 0x02, 0x19, 0x88, 0x86, 0xbe, 0x90, 0x33, - 0x0a, 0x77, 0x95, 0xe6, 0x6a, 0xb5, 0xaf, 0xca, 0x20, 0x81, 0x89, 0x20, 0x6b, 0x59, 0x78, 0x8f, 0xee, 0xd5, 0x23, - 0xcd, 0x2b, 0x09, 0x9e, 0xb9, 0xf8, 0x0b, 0x00, 0xa1, 0x3c, 0x49, 0xc8, 0x01, 0x39, 0x80, 0xbf, 0xa5, 0x28, 0x95, - 0x06, 0xf8, 0x67, 0x75, 0x39, 0xb6, 0xf5, 0xfd, 0x9d, 0x56, 0x31, 0xb8, 0xfe, 0x7c, 0xdd, 0xf5, 0xac, 0x1d, 0xe2, - 0x5c, 0xd9, 0xea, 0xb5, 0x65, 0x9a, 0xc7, 0x48, 0x5d, 0x03, 0x70, 0x27, 0xd2, 0x23, 0x10, 0xc9, 0x4c, 0x34, 0xc8, - 0xd9, 0x0b, 0x3e, 0x9e, 0x8a, 0xc7, 0xa4, 0xbd, 0xca, 0xf7, 0xcd, 0x85, 0x3e, 0x18, 0x63, 0xdf, 0x82, 0x06, 0xf1, - 0xd1, 0x6a, 0x6b, 0x05, 0x62, 0xbd, 0x55, 0xea, 0x43, 0x37, 0x46, 0x41, 0x07, 0x8f, 0xb8, 0x91, 0x0b, 0x8e, 0xed, - 0xae, 0xad, 0xa7, 0xf4, 0x15, 0x80, 0xb9, 0x0e, 0x54, 0x32, 0x0c, 0x52, 0xe7, 0x89, 0xc2, 0x24, 0x3f, 0x4f, 0x48, - 0x42, 0x44, 0x75, 0xb6, 0x1c, 0xa5, 0xdc, 0xb4, 0x80, 0xcb, 0x8c, 0x0c, 0x30, 0x9b, 0x34, 0xeb, 0x27, 0x97, 0x2f, - 0x41, 0x2a, 0x0d, 0x11, 0xdc, 0xb0, 0xbd, 0x64, 0x74, 0xeb, 0xa8, 0x1b, 0x54, 0x49, 0xe6, 0xfa, 0xcd, 0xed, 0x2c, - 0x52, 0xe6, 0xcd, 0x47, 0x18, 0x6b, 0xf2, 0x21, 0xac, 0x13, 0xfc, 0x36, 0x40, 0x25, 0x7d, 0x2a, 0xbc, 0x68, 0x04, - 0x10, 0xea, 0x3b, 0x55, 0xc6, 0xa7, 0xc2, 0xcb, 0x46, 0x5b, 0x96, 0x51, 0x0a, 0xd5, 0x05, 0xb3, 0x5b, 0xd3, 0x85, - 0xe8, 0x56, 0xd5, 0x40, 0x1b, 0xb8, 0x76, 0x1d, 0x28, 0xa0, 0xa1, 0xda, 0x95, 0x1b, 0x16, 0x80, 0xd5, 0x4c, 0x04, - 0x86, 0xcb, 0xbf, 0xcf, 0x5f, 0xa9, 0x18, 0x9e, 0x7e, 0x3f, 0xf4, 0xf6, 0xdb, 0x20, 0x1a, 0x6d, 0x2f, 0xd9, 0x2e, - 0x88, 0x46, 0xbb, 0xcb, 0x86, 0xd1, 0xef, 0xe7, 0xf4, 0xfb, 0x79, 0x03, 0x3a, 0x12, 0x61, 0xc2, 0xec, 0xf5, 0x1b, - 0xb5, 0x7c, 0xa5, 0xd6, 0xef, 0xd4, 0xf2, 0xa5, 0x1a, 0xde, 0xda, 0x93, 0x44, 0x10, 0x59, 0xaa, 0x9a, 0x07, 0x49, - 0x91, 0x6a, 0xe9, 0x72, 0x8c, 0x16, 0x23, 0x6a, 0x29, 0x6b, 0x8e, 0x75, 0x22, 0xed, 0x1c, 0x94, 0x0c, 0x70, 0xb4, - 0xb8, 0xaa, 0x31, 0xdd, 0xac, 0x68, 0x09, 0xc4, 0x08, 0x2b, 0xdb, 0x72, 0x71, 0x93, 0xfa, 0xe8, 0x9c, 0x7c, 0xdb, - 0x2a, 0xe5, 0xdb, 0x56, 0xf0, 0xfc, 0x2b, 0x0a, 0xe5, 0x92, 0x6b, 0xd7, 0xb2, 0x69, 0xa1, 0x14, 0xca, 0xb8, 0x06, - 0x5b, 0xfb, 0x26, 0x30, 0x64, 0x3e, 0x52, 0xd4, 0xd8, 0x5e, 0x34, 0xca, 0x21, 0xc8, 0xd6, 0xc1, 0xa8, 0x53, 0x16, - 0x2c, 0xbe, 0xdd, 0x21, 0x03, 0x19, 0xe8, 0xa8, 0x6a, 0xe3, 0xd5, 0xce, 0x4a, 0x7f, 0x58, 0x5e, 0x3c, 0x67, 0x89, - 0x95, 0x4e, 0x7e, 0x53, 0xa1, 0x3f, 0x08, 0xd1, 0x37, 0x65, 0xc3, 0xc1, 0x8b, 0x2e, 0xb6, 0x32, 0x20, 0xde, 0x30, - 0xbd, 0xb7, 0xb1, 0x92, 0xe5, 0xae, 0x29, 0x5f, 0xcc, 0x78, 0xc2, 0x71, 0xf4, 0xe5, 0x6a, 0x11, 0xd6, 0x6a, 0x91, - 0x9d, 0x00, 0x0f, 0xad, 0xd5, 0x52, 0xc8, 0xd5, 0x22, 0x9c, 0x99, 0x2e, 0xd4, 0x4c, 0xcf, 0x40, 0xf3, 0x28, 0xd4, - 0x2c, 0x4f, 0x00, 0x0b, 0x5e, 0x98, 0x19, 0x2e, 0xcc, 0x0c, 0xc7, 0x21, 0x35, 0x4e, 0x0f, 0x7a, 0xaf, 0x73, 0xcf, - 0x2d, 0x77, 0xa3, 0xd3, 0x30, 0x6f, 0x47, 0x1b, 0xcc, 0xf1, 0x41, 0x38, 0x81, 0xf8, 0xc0, 0x12, 0x01, 0x7a, 0x34, - 0xac, 0x8e, 0x1a, 0x2a, 0x47, 0xf1, 0x65, 0x01, 0x48, 0x96, 0x04, 0x20, 0xb9, 0x57, 0xe3, 0x5c, 0x5a, 0x7e, 0x5d, - 0x25, 0x21, 0x47, 0x64, 0xbc, 0x94, 0x76, 0xf7, 0x84, 0x97, 0x23, 0x23, 0x34, 0x4f, 0x16, 0xa9, 0x97, 0xb3, 0x8c, - 0x8d, 0x11, 0xb8, 0x28, 0xf4, 0x9b, 0xaa, 0xdf, 0x4f, 0x4b, 0x2f, 0xa7, 0x76, 0x7e, 0x02, 0x7f, 0xcb, 0x53, 0x67, - 0x91, 0x23, 0xe4, 0xd5, 0xc8, 0x24, 0x2c, 0x2f, 0x95, 0x7a, 0xfa, 0x12, 0x66, 0x50, 0x77, 0x6f, 0x14, 0x80, 0x6b, - 0x91, 0x4b, 0xa7, 0xda, 0x12, 0xae, 0x4c, 0xb9, 0xc1, 0x3e, 0x0f, 0x79, 0x4e, 0x42, 0xa8, 0x44, 0x1e, 0x29, 0xac, - 0xfb, 0xf6, 0xc5, 0xf3, 0x89, 0xeb, 0xc3, 0x62, 0xa3, 0x11, 0x1c, 0x0e, 0x00, 0x73, 0x30, 0xf5, 0xa2, 0x01, 0x2f, - 0xd5, 0x9c, 0xf9, 0xe8, 0xe5, 0x84, 0x8d, 0x01, 0x6a, 0x8a, 0x81, 0x53, 0xd6, 0x33, 0xf9, 0xc8, 0xf8, 0x96, 0xf9, - 0x7e, 0x80, 0xef, 0xd6, 0x85, 0x84, 0x7c, 0x50, 0xa8, 0x04, 0x99, 0x42, 0x25, 0x48, 0x0c, 0x2a, 0x41, 0x6c, 0x50, - 0x09, 0x36, 0x0d, 0x5f, 0x4b, 0xe5, 0x6d, 0x04, 0x1c, 0x11, 0x3e, 0xf4, 0x2c, 0x6c, 0xac, 0x50, 0x3c, 0x1b, 0xb3, - 0x31, 0x2b, 0xd4, 0xce, 0x93, 0xcb, 0xa9, 0xd8, 0x59, 0x8c, 0x75, 0x13, 0x59, 0x26, 0x5e, 0x48, 0xd0, 0x71, 0xce, - 0x85, 0x44, 0x5d, 0xfd, 0xdc, 0x7b, 0x49, 0xc6, 0x92, 0x79, 0x43, 0xa3, 0x06, 0xf3, 0xb2, 0xeb, 0x00, 0xa6, 0x25, - 0xdf, 0x16, 0x34, 0x98, 0x4e, 0x95, 0x47, 0xa4, 0x49, 0x50, 0x3b, 0x97, 0x49, 0x91, 0x13, 0xc2, 0x24, 0xe8, 0x95, - 0xe0, 0x37, 0x12, 0xda, 0xff, 0xab, 0x9e, 0xef, 0x80, 0xc1, 0x44, 0xab, 0xe4, 0x0b, 0x58, 0x2d, 0x73, 0xfe, 0x52, - 0x7a, 0x62, 0x23, 0xfe, 0x62, 0x99, 0xc6, 0xa3, 0x2f, 0x6c, 0x88, 0x78, 0x56, 0x2f, 0xd1, 0xb4, 0x04, 0x75, 0x80, - 0x47, 0xf4, 0xd7, 0xe8, 0x8b, 0xe1, 0x4d, 0xe9, 0x6a, 0xa4, 0xae, 0xd9, 0x39, 0xe7, 0x5f, 0x6a, 0x43, 0x84, 0x8c, - 0x69, 0x53, 0x20, 0x19, 0x10, 0x48, 0x32, 0x10, 0x00, 0x98, 0x9a, 0xce, 0xec, 0x15, 0x40, 0x34, 0x10, 0xc0, 0xe3, - 0xbc, 0xe3, 0xf1, 0x23, 0xfd, 0x55, 0x1c, 0xf7, 0x4e, 0xd3, 0xb0, 0xfd, 0x17, 0xa0, 0x29, 0x86, 0x72, 0x3c, 0xdf, - 0x29, 0x48, 0xf6, 0x28, 0x65, 0xe9, 0xaa, 0x89, 0xec, 0x50, 0xac, 0x4f, 0x73, 0xca, 0x42, 0xda, 0x96, 0x63, 0xb4, - 0xc5, 0xfa, 0x31, 0xf2, 0xde, 0xdc, 0xa8, 0xc8, 0x07, 0x3d, 0xb8, 0xbd, 0xbd, 0x7d, 0xdd, 0x63, 0x36, 0xc9, 0x8a, - 0x45, 0xae, 0x22, 0x4e, 0x9c, 0xd6, 0x21, 0x07, 0x0c, 0xc8, 0x49, 0x08, 0x4c, 0x63, 0x5c, 0x2a, 0xd0, 0x41, 0xc9, - 0x72, 0x5e, 0x03, 0xb5, 0x2c, 0x22, 0x6b, 0x80, 0xa8, 0xa6, 0xf9, 0x57, 0x0d, 0xf9, 0x49, 0xd5, 0x9c, 0x52, 0xa8, - 0x7d, 0xc5, 0xc3, 0xea, 0xf4, 0x89, 0x55, 0x9b, 0x18, 0xeb, 0x5f, 0x6b, 0x4f, 0xd0, 0x56, 0xd2, 0x40, 0x7c, 0xe7, - 0xeb, 0xf4, 0x8e, 0x42, 0x77, 0x9c, 0x99, 0x78, 0xaa, 0x02, 0x63, 0xdf, 0xda, 0x11, 0x14, 0x0e, 0x4d, 0xd7, 0x01, - 0x87, 0x69, 0x74, 0xc2, 0xe2, 0x9f, 0xd2, 0x71, 0xf2, 0xa2, 0x56, 0x88, 0x24, 0xff, 0x10, 0x2e, 0x0c, 0x89, 0x05, - 0x79, 0x49, 0xa8, 0x23, 0x32, 0x62, 0x35, 0x2a, 0xd6, 0x42, 0x45, 0xc5, 0x29, 0x1e, 0x6f, 0x15, 0x14, 0x97, 0xa2, - 0x54, 0x29, 0x15, 0xb9, 0x51, 0x29, 0x20, 0x96, 0x0d, 0xbc, 0x5b, 0xc0, 0x01, 0x10, 0x74, 0x96, 0xbb, 0xb5, 0xed, - 0x6e, 0x23, 0xf3, 0x99, 0x69, 0x9e, 0x56, 0x1f, 0xd4, 0xdf, 0xef, 0x97, 0x18, 0x5b, 0xe3, 0xe9, 0xef, 0xdb, 0xb4, - 0xe0, 0xe6, 0x6f, 0x18, 0xa2, 0x3b, 0x40, 0xc4, 0x2c, 0xed, 0xa1, 0x90, 0x05, 0x13, 0x96, 0xa1, 0x2a, 0x4f, 0x39, - 0xea, 0xe5, 0x93, 0x5b, 0x80, 0x50, 0x43, 0xbf, 0x36, 0x3a, 0xd5, 0x55, 0x09, 0xc2, 0xf7, 0x5d, 0xa1, 0x1e, 0x9b, - 0x03, 0x9e, 0x0c, 0x80, 0xbf, 0x22, 0xaf, 0xf5, 0xd8, 0xfe, 0x41, 0x6f, 0xd4, 0x1b, 0x20, 0x88, 0xce, 0x79, 0xe1, - 0x1f, 0x71, 0xae, 0x53, 0x7f, 0xc6, 0x85, 0x20, 0xbe, 0xf5, 0x24, 0xbc, 0x17, 0x67, 0x69, 0x1c, 0x9c, 0xf5, 0x06, - 0xe6, 0x22, 0x50, 0x9c, 0xa5, 0xf9, 0x19, 0x88, 0xe5, 0x88, 0x89, 0x58, 0xb3, 0x3b, 0x80, 0x09, 0x2c, 0x75, 0x1c, - 0xb2, 0xea, 0xd8, 0x7e, 0xff, 0xcd, 0xc8, 0x90, 0xa5, 0x23, 0x0c, 0x8c, 0xfe, 0x5d, 0x81, 0x00, 0x05, 0xcb, 0xcc, - 0xf6, 0x60, 0xd2, 0xd5, 0x9e, 0xd5, 0xf3, 0x66, 0x93, 0x77, 0xf5, 0x8e, 0xd5, 0xb4, 0x9c, 0x9a, 0x56, 0x59, 0x4d, - 0x9b, 0xe4, 0x50, 0x33, 0xd1, 0xef, 0x6b, 0x50, 0xd4, 0x7c, 0x0e, 0x60, 0x6c, 0x98, 0xfc, 0x66, 0x56, 0xcd, 0xfb, - 0x7d, 0x4f, 0x3e, 0x82, 0x5f, 0xc8, 0x56, 0xe6, 0xd6, 0x58, 0x3e, 0x7d, 0x4d, 0x24, 0x66, 0x06, 0xe6, 0xe8, 0xee, - 0x08, 0xdf, 0xeb, 0x46, 0x78, 0x1d, 0x73, 0x85, 0xcd, 0xc4, 0xf4, 0x0d, 0x0c, 0x9e, 0x27, 0x7c, 0x70, 0x91, 0xa3, - 0xbf, 0x91, 0xc3, 0x4c, 0x61, 0x41, 0xce, 0xfd, 0xc9, 0x1b, 0xc4, 0x4b, 0x46, 0x78, 0x07, 0x9d, 0x4e, 0x78, 0x90, - 0xfd, 0xfe, 0x0a, 0x3a, 0xb3, 0x95, 0x4a, 0xd9, 0xaa, 0xa8, 0x4c, 0xd7, 0x75, 0x51, 0x56, 0xd0, 0xb1, 0xf4, 0xf3, - 0x56, 0xc8, 0xcc, 0xfa, 0x99, 0x05, 0xf7, 0xb4, 0x92, 0x00, 0x53, 0xb6, 0x6d, 0xa2, 0x36, 0xf0, 0xb2, 0x2e, 0x3e, - 0x17, 0x78, 0x74, 0xd6, 0x5e, 0x6f, 0x84, 0xda, 0xe7, 0x7c, 0xb4, 0x2e, 0xd6, 0x1e, 0xf8, 0xc1, 0xcc, 0xd2, 0xb9, - 0x22, 0xce, 0xc8, 0xfd, 0xd1, 0xe7, 0x22, 0xcd, 0x29, 0x0f, 0x70, 0x1f, 0x8a, 0xb9, 0xfd, 0x16, 0x48, 0x3f, 0xf4, - 0x16, 0xc8, 0x3e, 0x3a, 0xe7, 0xe4, 0x0d, 0x20, 0xd2, 0x21, 0x0c, 0x6e, 0x45, 0x82, 0x8e, 0x55, 0xc3, 0x5b, 0x0b, - 0xec, 0xb4, 0x97, 0xc6, 0xbd, 0x34, 0x3f, 0x4b, 0xfb, 0x7d, 0x83, 0x9a, 0x99, 0x22, 0x1c, 0x3c, 0xce, 0xc8, 0x45, - 0xd2, 0x82, 0x2d, 0xa5, 0xfd, 0x57, 0x03, 0x47, 0x10, 0xf2, 0xf7, 0x3f, 0x84, 0xf7, 0x04, 0x20, 0x36, 0x69, 0x03, - 0xae, 0x7a, 0x4c, 0x47, 0x63, 0x4b, 0xa2, 0x56, 0x9d, 0x0d, 0x90, 0x38, 0x55, 0x5a, 0x4f, 0xb9, 0x59, 0x53, 0x18, - 0xa4, 0xca, 0x42, 0xfd, 0xc6, 0x7a, 0x32, 0x59, 0xe5, 0x22, 0x23, 0x8e, 0xca, 0xf4, 0xa5, 0x66, 0x04, 0xd3, 0xa5, - 0x9f, 0x2f, 0x60, 0xc9, 0xc6, 0x1f, 0x71, 0xf2, 0x96, 0x80, 0x63, 0x3b, 0x6b, 0x57, 0xd5, 0x2e, 0xc7, 0xad, 0xdd, - 0x1c, 0xe0, 0x7b, 0xbd, 0xd1, 0x68, 0xa4, 0x9d, 0xe3, 0x04, 0x0c, 0x55, 0x4f, 0x2d, 0x85, 0x1e, 0xab, 0x15, 0xa0, - 0x6e, 0x47, 0x2e, 0xb3, 0x64, 0x30, 0x5f, 0x18, 0xc7, 0xaf, 0xcc, 0x47, 0x1f, 0x2f, 0x95, 0xb5, 0xeb, 0x88, 0xaf, - 0xff, 0x20, 0xab, 0xf5, 0x2d, 0xef, 0xaa, 0x26, 0xe0, 0x8b, 0x2a, 0xa0, 0xf4, 0x1b, 0xde, 0x93, 0xbd, 0x8b, 0xaf, - 0xdd, 0x60, 0x97, 0x7c, 0xcb, 0x5b, 0xd4, 0x79, 0xbe, 0x72, 0x70, 0xa3, 0x4a, 0xb7, 0xf7, 0x92, 0x05, 0xae, 0xbd, - 0xa3, 0xa6, 0xb1, 0x9e, 0xf9, 0xd1, 0xc3, 0x22, 0x64, 0x3b, 0x1f, 0x7b, 0x5f, 0x35, 0x4f, 0xcf, 0x1a, 0x7a, 0x93, - 0x1a, 0xfa, 0xd8, 0x8b, 0xb2, 0x7d, 0x6a, 0x1a, 0xd1, 0x6b, 0xd8, 0xd0, 0xc7, 0xde, 0x92, 0x93, 0x43, 0x22, 0xc0, - 0xa9, 0x31, 0x7f, 0x7c, 0x38, 0x9d, 0xe1, 0xef, 0x18, 0x50, 0x09, 0xc4, 0x7c, 0x7a, 0x4c, 0x3b, 0x0a, 0x30, 0xa3, - 0x4a, 0x6f, 0x9f, 0x1e, 0xd8, 0x8e, 0x97, 0xf5, 0xd0, 0xd2, 0xbb, 0x27, 0x47, 0xb7, 0xe3, 0x55, 0x35, 0xbe, 0x94, - 0x43, 0x9e, 0xe7, 0xb3, 0xd1, 0x68, 0x24, 0x0c, 0x24, 0x77, 0xa5, 0x37, 0xb0, 0x02, 0x69, 0x5b, 0x54, 0x1f, 0xca, - 0xa5, 0xb7, 0x53, 0x87, 0x76, 0xe5, 0x4f, 0xf2, 0xc3, 0xa1, 0x18, 0x99, 0x63, 0x1c, 0xc0, 0x4d, 0x0a, 0x25, 0x47, - 0xc9, 0x5a, 0x82, 0xe8, 0x94, 0xc6, 0x53, 0x59, 0xaf, 0xad, 0x88, 0xbc, 0x1a, 0x71, 0x1e, 0x82, 0x1f, 0x3d, 0x50, - 0x8b, 0xbf, 0xd0, 0x82, 0xd8, 0x63, 0x9f, 0x2a, 0xa5, 0x17, 0xbc, 0x2a, 0x20, 0x44, 0xec, 0xef, 0x06, 0xda, 0x41, - 0x09, 0x0e, 0x25, 0xdc, 0x07, 0x84, 0x85, 0x7e, 0xed, 0xe5, 0x33, 0x19, 0xa3, 0xdc, 0x1b, 0x54, 0x73, 0x06, 0x30, - 0x95, 0x3e, 0x03, 0xbf, 0x4b, 0x80, 0x3a, 0xc5, 0xa7, 0xe8, 0x54, 0x6f, 0x1e, 0x36, 0x5d, 0x9f, 0x96, 0x28, 0x8a, - 0xe8, 0xce, 0xcf, 0xc7, 0x80, 0xd8, 0xd9, 0xb5, 0x19, 0x69, 0xd7, 0x7e, 0x83, 0x06, 0x2b, 0x25, 0x89, 0x76, 0x4e, - 0x09, 0xbb, 0x9d, 0x8f, 0x6c, 0xe9, 0x47, 0x29, 0x10, 0x73, 0xc7, 0x89, 0x44, 0xf6, 0x60, 0x23, 0x27, 0x70, 0x8b, - 0xf6, 0x8e, 0x0e, 0x40, 0xe5, 0x46, 0x41, 0x7e, 0x35, 0x47, 0x72, 0xc7, 0x77, 0xbd, 0xef, 0x06, 0xf5, 0xe0, 0xbb, - 0xde, 0x59, 0x4a, 0x72, 0x47, 0x78, 0xa6, 0xa6, 0x84, 0x88, 0xcf, 0xbe, 0x1b, 0xe4, 0x03, 0x3c, 0x4b, 0xb4, 0x48, - 0x8b, 0x84, 0x6a, 0x75, 0x8d, 0x9b, 0xf0, 0x22, 0x91, 0xdc, 0x43, 0xbb, 0xce, 0x23, 0x62, 0x01, 0xc8, 0x58, 0x7c, - 0x36, 0x6f, 0x28, 0xd4, 0xdd, 0xc4, 0x6c, 0xd1, 0x5d, 0x16, 0xfb, 0xfd, 0x6d, 0x9e, 0xd6, 0x3d, 0x1d, 0x1f, 0x83, - 0x2f, 0x48, 0x35, 0x01, 0x1e, 0xed, 0xaf, 0xcd, 0xf1, 0xea, 0xd5, 0xe6, 0x48, 0x59, 0xa8, 0x12, 0xf5, 0x5b, 0xac, - 0x66, 0x3d, 0x84, 0xe1, 0xce, 0x32, 0x63, 0x6d, 0x2f, 0x78, 0x25, 0x67, 0x55, 0x6c, 0x97, 0xe3, 0x2b, 0x96, 0xda, - 0x4a, 0xa2, 0x72, 0xb4, 0x1e, 0x6b, 0x53, 0x8c, 0xfc, 0x4a, 0x21, 0x51, 0x16, 0x1d, 0x5b, 0x0b, 0x05, 0xc4, 0x0b, - 0xd0, 0x97, 0xec, 0x4c, 0x03, 0xac, 0x37, 0x7a, 0x15, 0x11, 0x5a, 0x3e, 0x52, 0xe1, 0x4d, 0x6e, 0xaa, 0xcc, 0xca, - 0x66, 0xd1, 0xee, 0xa7, 0x8a, 0x57, 0x08, 0x56, 0x6f, 0xd4, 0x1e, 0x05, 0xa8, 0x3d, 0xb4, 0x50, 0x06, 0x90, 0xd2, - 0x34, 0x03, 0x40, 0x06, 0x00, 0x99, 0x2a, 0xe2, 0x33, 0x01, 0x2a, 0x6d, 0x75, 0xa3, 0xc0, 0x89, 0xf4, 0x1a, 0x68, - 0x16, 0x58, 0xe9, 0x23, 0x05, 0x19, 0x2c, 0xb6, 0x08, 0xc0, 0xca, 0x91, 0x33, 0x4c, 0x63, 0xc8, 0x36, 0x9a, 0xb8, - 0x24, 0xcd, 0xef, 0xc3, 0x2c, 0x95, 0x78, 0x12, 0x3f, 0xc8, 0x1a, 0x23, 0x00, 0x90, 0xbe, 0x4f, 0x2f, 0x8a, 0x2c, - 0x26, 0x1c, 0x38, 0xeb, 0xa9, 0x83, 0xa2, 0x26, 0xe7, 0x5a, 0xd3, 0xea, 0x59, 0x6d, 0xf2, 0x90, 0x05, 0x3a, 0x7b, - 0x30, 0x26, 0xb5, 0x7c, 0xcf, 0x23, 0xfb, 0x2b, 0xc7, 0x33, 0xc2, 0x77, 0xdd, 0xc1, 0xa9, 0xff, 0x6e, 0x6a, 0x60, - 0x62, 0x4a, 0x00, 0x36, 0x06, 0x47, 0x13, 0xe2, 0x77, 0x3a, 0x26, 0x53, 0x9b, 0x14, 0x81, 0xc0, 0x43, 0xf0, 0x0a, - 0x9e, 0x1b, 0x2e, 0xb7, 0xdc, 0xd8, 0x59, 0xe4, 0x69, 0x02, 0x70, 0xe2, 0x05, 0xdf, 0x02, 0x1c, 0xa7, 0x5e, 0x15, - 0xb2, 0x67, 0xcf, 0xc5, 0x74, 0x36, 0x0f, 0x1e, 0x12, 0xda, 0xbf, 0x98, 0xf0, 0x9b, 0xee, 0x2a, 0xb9, 0x32, 0xb5, - 0xee, 0x4d, 0x74, 0x95, 0xcb, 0x9d, 0x3e, 0xad, 0x38, 0x86, 0x39, 0x83, 0x55, 0x40, 0xce, 0xd9, 0x90, 0xbf, 0x38, - 0x07, 0xc0, 0x96, 0x95, 0xf0, 0x22, 0xfe, 0x22, 0x94, 0xd5, 0x02, 0xb8, 0x47, 0xce, 0x23, 0xf3, 0xcb, 0x57, 0xdb, - 0xa1, 0x9c, 0x53, 0x14, 0xc6, 0x72, 0x6a, 0x5a, 0x52, 0x9c, 0x0e, 0x3d, 0x05, 0x93, 0xa9, 0x2d, 0x7f, 0x6f, 0x13, - 0x97, 0xd9, 0x9b, 0x49, 0x38, 0x5f, 0x47, 0xb6, 0xad, 0x55, 0xf7, 0xd0, 0x0d, 0xc1, 0xa0, 0x8f, 0x11, 0xb4, 0x6c, - 0xae, 0xef, 0xd6, 0x83, 0x81, 0xc2, 0xf6, 0xad, 0xe9, 0xa6, 0x45, 0xa7, 0x38, 0xe0, 0xcc, 0x5a, 0xd7, 0xa8, 0x54, - 0x15, 0x87, 0x5e, 0xf2, 0x6e, 0x59, 0x95, 0x5d, 0x96, 0x5e, 0x08, 0x52, 0xa3, 0xae, 0x22, 0x44, 0x4a, 0xc5, 0x0e, - 0xef, 0xc9, 0xaf, 0x81, 0x89, 0x67, 0x56, 0x8e, 0xd2, 0x78, 0x0e, 0x30, 0x41, 0x0a, 0x7d, 0x53, 0x7e, 0x05, 0xb8, - 0xa1, 0x8b, 0x28, 0xcc, 0xde, 0xc6, 0x55, 0x50, 0x5b, 0x4d, 0xbf, 0x77, 0x70, 0x62, 0xcf, 0xeb, 0x7e, 0x3f, 0x25, - 0x1a, 0x3f, 0x0c, 0xbd, 0xc0, 0xbf, 0xc7, 0xd3, 0x7d, 0x13, 0xa4, 0xe6, 0x95, 0x07, 0x78, 0x45, 0x97, 0x5b, 0x9b, - 0x72, 0x45, 0xe3, 0x62, 0x5e, 0x23, 0x22, 0x7c, 0xea, 0x28, 0xb6, 0xdb, 0xfc, 0x38, 0xb5, 0x31, 0x18, 0x84, 0x70, - 0xdf, 0xca, 0xf8, 0x7d, 0xe2, 0xe5, 0xb3, 0x68, 0x0e, 0x8a, 0xd2, 0x4c, 0x93, 0x84, 0x14, 0xd2, 0x4b, 0x80, 0x3e, - 0x1a, 0x84, 0x5a, 0x5d, 0xf9, 0x47, 0xe2, 0xa5, 0x6a, 0x5a, 0x9b, 0xa7, 0x58, 0xa3, 0x40, 0xcc, 0xa2, 0x79, 0xc3, - 0x32, 0x3a, 0x24, 0xd5, 0xe5, 0xd2, 0x34, 0xe3, 0x0f, 0xab, 0x19, 0xaa, 0x15, 0x47, 0x4d, 0x50, 0xa3, 0x74, 0x03, - 0x17, 0xc0, 0xbf, 0xd3, 0x1d, 0x47, 0x35, 0x8a, 0x14, 0x0d, 0xf8, 0x04, 0x81, 0x61, 0xcd, 0xe6, 0x09, 0x6b, 0x4d, - 0x5d, 0x33, 0xfa, 0x7d, 0x19, 0x27, 0x64, 0x92, 0x90, 0x9c, 0x0f, 0x97, 0xeb, 0x47, 0x52, 0x5d, 0x00, 0xa9, 0x72, - 0xc5, 0x66, 0xbd, 0xde, 0x1c, 0x30, 0x7a, 0x61, 0xfd, 0xc2, 0xc6, 0x15, 0x9c, 0x5f, 0x12, 0xe6, 0xae, 0xfa, 0x11, - 0x66, 0x19, 0x54, 0x01, 0x69, 0x7e, 0x2c, 0x78, 0xf3, 0xdc, 0x05, 0xa2, 0x7e, 0x33, 0x52, 0x17, 0x94, 0x59, 0x3a, - 0xb7, 0x88, 0x40, 0xc0, 0x6b, 0x58, 0x3d, 0x81, 0x64, 0x5f, 0x3e, 0xf6, 0x69, 0x46, 0x81, 0xea, 0x08, 0x40, 0xd9, - 0xac, 0x1f, 0xc2, 0xfe, 0x01, 0xe1, 0x84, 0xfa, 0x9b, 0x37, 0x72, 0xd6, 0x90, 0x3c, 0x90, 0x6a, 0xc2, 0x63, 0x38, - 0x35, 0x16, 0xf8, 0xd2, 0xa2, 0x37, 0x15, 0xbc, 0x26, 0x38, 0xee, 0x05, 0x5a, 0xfb, 0x16, 0x70, 0x84, 0x08, 0x2e, - 0x43, 0x13, 0xa7, 0xbd, 0x5d, 0x2f, 0x40, 0x42, 0x73, 0x0b, 0xe7, 0xfa, 0xda, 0x05, 0x2d, 0x4e, 0x91, 0x93, 0x45, - 0x17, 0x18, 0xe8, 0x82, 0xcc, 0x1b, 0xff, 0xaa, 0x60, 0xe5, 0x02, 0x64, 0x2f, 0x15, 0x2b, 0x89, 0xd8, 0x76, 0xea, - 0x8f, 0x52, 0xd9, 0x6f, 0xcf, 0xac, 0x09, 0xfc, 0x2a, 0xb1, 0x5f, 0x22, 0x93, 0x6f, 0x7a, 0x6c, 0xf2, 0x95, 0xb1, - 0xd0, 0xa9, 0x65, 0x70, 0x4e, 0x8f, 0x0c, 0xce, 0xbd, 0x9d, 0x55, 0x9b, 0x10, 0x86, 0x82, 0x24, 0xd0, 0x74, 0xe9, - 0x61, 0xdd, 0xf4, 0xe7, 0x27, 0x2d, 0x7e, 0xad, 0xda, 0xb7, 0xee, 0xc7, 0x21, 0x76, 0xf1, 0xab, 0xc4, 0x33, 0xec, - 0xa3, 0x3e, 0x70, 0x80, 0xc9, 0x88, 0x89, 0xcb, 0x7e, 0x1f, 0x0a, 0x9b, 0x8d, 0xe7, 0xa3, 0xba, 0xf8, 0xb9, 0x78, - 0x00, 0x28, 0x87, 0x0a, 0xec, 0x72, 0x28, 0x43, 0x19, 0xb1, 0xa9, 0x2d, 0xf7, 0xfc, 0xfe, 0x2a, 0xcc, 0x41, 0xde, - 0xd1, 0x98, 0x38, 0x67, 0x20, 0x86, 0xc1, 0xd7, 0xbf, 0x7b, 0xb2, 0x4f, 0x9b, 0xef, 0xce, 0xe0, 0xbb, 0xa3, 0xb3, - 0x0f, 0xc8, 0x71, 0x73, 0xb6, 0x2e, 0x8b, 0xfb, 0x34, 0x16, 0x67, 0xdf, 0x41, 0xea, 0x77, 0x67, 0x45, 0x79, 0xf6, - 0x9d, 0xaa, 0xcc, 0x77, 0x67, 0xb4, 0xe0, 0x46, 0xbf, 0x5b, 0x13, 0xef, 0x9f, 0x95, 0xa6, 0x3d, 0x5b, 0x42, 0x38, - 0x96, 0x56, 0x3f, 0x82, 0x12, 0x51, 0x91, 0xa2, 0xca, 0x50, 0x56, 0x6b, 0xc7, 0x79, 0x9f, 0x68, 0x78, 0x6c, 0x9a, - 0x90, 0xb8, 0x5a, 0xc2, 0x3a, 0xd4, 0xb3, 0xd3, 0x26, 0xd9, 0x71, 0x1e, 0xa8, 0x03, 0x22, 0xe7, 0x2f, 0xf2, 0xd1, - 0x96, 0xbe, 0x06, 0xdf, 0x3a, 0x1c, 0xf2, 0xd1, 0xce, 0xfc, 0xf4, 0xc9, 0x5a, 0x29, 0x83, 0x8d, 0x14, 0xa3, 0x10, - 0x12, 0xc5, 0x6d, 0x7b, 0x0c, 0x80, 0xff, 0xfd, 0xc3, 0x81, 0x7e, 0xef, 0xe4, 0x6f, 0xb5, 0x5b, 0x5a, 0xf5, 0xfc, - 0xd0, 0x22, 0xcc, 0x78, 0x5d, 0x1b, 0x76, 0xb6, 0xbd, 0x04, 0x94, 0xde, 0x37, 0x0d, 0x6a, 0x8a, 0xe8, 0x27, 0xac, - 0x26, 0x56, 0x71, 0x58, 0x90, 0x12, 0x87, 0x18, 0x8e, 0xd1, 0x0e, 0x3d, 0x4e, 0x17, 0x35, 0x4f, 0xee, 0x3b, 0x64, - 0xdc, 0xfa, 0x3e, 0x20, 0xb9, 0x14, 0xce, 0x3f, 0x78, 0xa1, 0xc1, 0x44, 0x2f, 0xf2, 0xaa, 0xc8, 0xc4, 0x48, 0xd0, - 0x28, 0xbf, 0x25, 0x71, 0xe6, 0x0c, 0x6b, 0x71, 0xa6, 0x10, 0xc2, 0x42, 0x42, 0xe5, 0x2e, 0x4a, 0x4a, 0x0f, 0xce, - 0x9e, 0xec, 0xcb, 0xe6, 0x77, 0xc2, 0x84, 0x18, 0x2d, 0x80, 0x06, 0x67, 0xd7, 0x2e, 0xef, 0x21, 0x2c, 0x73, 0xef, - 0xf7, 0xb7, 0x77, 0x79, 0x01, 0x71, 0x99, 0x67, 0x52, 0xb1, 0x5a, 0x9e, 0x01, 0x4d, 0x9e, 0x88, 0xcf, 0xc2, 0x4a, - 0x4e, 0x83, 0xaa, 0xa3, 0x58, 0xbd, 0x8d, 0xe7, 0x1e, 0xf0, 0x7a, 0xbf, 0x4f, 0x80, 0xc0, 0xdd, 0x67, 0x6f, 0x94, - 0x5b, 0x2a, 0xe9, 0x91, 0xe7, 0x18, 0x22, 0x99, 0x00, 0xaf, 0x33, 0x04, 0x47, 0x0a, 0xab, 0xe7, 0x26, 0xc8, 0x3f, - 0xbe, 0x3e, 0xa1, 0xf8, 0xa2, 0x79, 0x14, 0x35, 0x2c, 0x64, 0x09, 0x1c, 0x0f, 0xc9, 0x2c, 0x9b, 0x23, 0x35, 0x79, - 0xda, 0x9e, 0x22, 0x1d, 0x9d, 0x58, 0xe2, 0xb7, 0x35, 0xa9, 0x5e, 0xa4, 0xc2, 0x2e, 0x69, 0x67, 0x2b, 0x73, 0x2f, - 0x84, 0xa1, 0x4a, 0xb8, 0xf7, 0xba, 0x9e, 0x85, 0x72, 0x53, 0xb4, 0x2a, 0x66, 0x0f, 0x53, 0x62, 0x86, 0x29, 0xd6, - 0x5f, 0xd8, 0xf0, 0x9b, 0xc4, 0x8b, 0xc1, 0x70, 0xbd, 0xe4, 0xe5, 0x6c, 0x63, 0x16, 0xc2, 0xe1, 0xb0, 0x99, 0x14, - 0xb3, 0x25, 0xc4, 0xb6, 0x2e, 0xe7, 0x87, 0x43, 0x57, 0xcb, 0xd6, 0xc2, 0x83, 0x87, 0xaa, 0x85, 0x9b, 0x86, 0xe5, - 0xf0, 0x33, 0x99, 0xc5, 0xd8, 0xbe, 0xc6, 0x67, 0xf6, 0xe7, 0x8b, 0xee, 0x59, 0x82, 0x8c, 0x1b, 0x6b, 0xe0, 0x1a, - 0x9b, 0xb5, 0x3b, 0x5c, 0x8d, 0x80, 0xe4, 0x71, 0x37, 0xfa, 0xbb, 0xb2, 0x93, 0x9c, 0x04, 0x09, 0xa3, 0x15, 0xc2, - 0xef, 0xbe, 0xf1, 0x27, 0x5a, 0xec, 0x41, 0xbb, 0x8d, 0x2d, 0x21, 0xaa, 0x69, 0xcf, 0xe5, 0x4a, 0xb1, 0x34, 0x6f, - 0xa5, 0x0d, 0x99, 0x0f, 0xeb, 0x73, 0xdf, 0xc8, 0x81, 0x82, 0x31, 0xe2, 0xa9, 0x75, 0x10, 0xcd, 0xe6, 0xc0, 0x7d, - 0x81, 0xe6, 0x11, 0x9e, 0x5a, 0x90, 0xa0, 0xcc, 0xda, 0xb0, 0x9f, 0x24, 0x27, 0xcb, 0xe3, 0xf0, 0x2d, 0xfc, 0xcb, - 0x67, 0xd8, 0x24, 0xa6, 0x28, 0x1e, 0x7f, 0xab, 0x14, 0xff, 0x1d, 0x5b, 0x10, 0xc1, 0xda, 0x8d, 0xa8, 0x0d, 0x7f, - 0xc3, 0xbf, 0x85, 0x7d, 0x84, 0xfd, 0x86, 0x26, 0x08, 0x03, 0x58, 0x7f, 0x26, 0x10, 0x17, 0x16, 0x82, 0x04, 0x7f, - 0xab, 0x24, 0xff, 0x9c, 0xf0, 0xd9, 0xa2, 0x04, 0xb2, 0x3a, 0x8c, 0xe2, 0x13, 0x8a, 0x89, 0x42, 0x18, 0x6e, 0x09, - 0xbd, 0xa3, 0xff, 0x46, 0x94, 0x64, 0x93, 0xdc, 0x8a, 0xf5, 0x40, 0x26, 0x49, 0x30, 0xc1, 0xca, 0x0b, 0xe5, 0x4b, - 0xf7, 0x42, 0xa9, 0xb5, 0x16, 0xb4, 0x7e, 0xf9, 0x93, 0xc4, 0x33, 0xa0, 0x7b, 0x20, 0x63, 0xd0, 0x6d, 0x44, 0x35, - 0xc9, 0x31, 0x7d, 0x94, 0xce, 0x33, 0x50, 0x01, 0x9d, 0xad, 0xb3, 0xb0, 0x5e, 0x16, 0xe5, 0xaa, 0x15, 0x1e, 0x2a, - 0x4b, 0x1f, 0xa9, 0xc7, 0x98, 0x17, 0xe6, 0xc9, 0x89, 0x7c, 0xf0, 0x08, 0xd0, 0xf0, 0x28, 0x4f, 0xab, 0x8e, 0xd2, - 0xfa, 0x81, 0x65, 0xc0, 0x08, 0x9c, 0x28, 0x03, 0x1e, 0x61, 0x19, 0x98, 0xa7, 0x5d, 0x86, 0x1a, 0xc4, 0x1a, 0x55, - 0x57, 0x6a, 0x83, 0x39, 0x51, 0x94, 0x7c, 0x8a, 0xa5, 0x15, 0xc6, 0xd0, 0xd4, 0x95, 0x47, 0xd6, 0x4b, 0x4e, 0xd8, - 0x93, 0xdd, 0x40, 0xba, 0x85, 0x8d, 0x02, 0x17, 0x74, 0x2d, 0x4b, 0x94, 0x8b, 0x6e, 0x19, 0x51, 0x26, 0x42, 0xea, - 0x67, 0x0f, 0x67, 0x5a, 0xed, 0x37, 0x76, 0xd2, 0xbe, 0x3d, 0x52, 0xf4, 0x82, 0x81, 0xf8, 0xb4, 0x47, 0x4a, 0x3d, - 0x6b, 0xe4, 0x32, 0xb0, 0xa5, 0x4b, 0x55, 0xcf, 0x7f, 0x83, 0xf2, 0x1d, 0xcc, 0x8c, 0xb3, 0xd9, 0xef, 0x7a, 0x73, - 0x7b, 0xb2, 0xaf, 0x9b, 0xdf, 0x59, 0xaf, 0x07, 0x5b, 0x83, 0x4c, 0x7c, 0xa9, 0xa8, 0xa7, 0xac, 0x42, 0xac, 0xc8, - 0xec, 0x7f, 0x0b, 0xef, 0x77, 0x78, 0x6b, 0x84, 0x66, 0x65, 0x3c, 0xcc, 0x47, 0x4f, 0xf6, 0xa2, 0xf9, 0xbd, 0xb3, - 0x6c, 0x2b, 0x57, 0x25, 0xb3, 0xfd, 0x7e, 0x94, 0x34, 0x67, 0x8f, 0xd7, 0x48, 0xea, 0x00, 0x1f, 0xaf, 0xcf, 0xf0, - 0x91, 0x4a, 0x28, 0xb5, 0xa0, 0xaa, 0x41, 0xeb, 0x63, 0xbf, 0xb7, 0x9e, 0xd3, 0xc7, 0x8f, 0xe5, 0x74, 0x4b, 0x8a, - 0x30, 0x7e, 0x60, 0x30, 0x65, 0x27, 0x4e, 0x5d, 0xf2, 0x66, 0x48, 0xef, 0xba, 0x55, 0x52, 0x97, 0x3d, 0x4a, 0x04, - 0xa1, 0x0e, 0xd6, 0x2f, 0xf6, 0x43, 0x98, 0xd9, 0xa2, 0x3f, 0x6c, 0x56, 0x73, 0x42, 0x41, 0x04, 0x88, 0x56, 0x79, - 0x1f, 0x38, 0x26, 0x09, 0xb3, 0xe6, 0x86, 0x74, 0xeb, 0xcd, 0x95, 0xf6, 0x4a, 0x0a, 0xe8, 0xe7, 0x20, 0x73, 0xfb, - 0xe8, 0x96, 0xab, 0x96, 0x79, 0x2e, 0x6d, 0x39, 0x60, 0xd1, 0x42, 0x74, 0x66, 0xe7, 0xd2, 0xe1, 0xe0, 0x3f, 0xa8, - 0x2b, 0x51, 0x45, 0x04, 0x1d, 0x45, 0x0b, 0x46, 0xab, 0x55, 0xbb, 0x9c, 0x6c, 0x2a, 0x64, 0x4b, 0x22, 0x9c, 0x28, - 0xd9, 0x2b, 0xa1, 0x3e, 0xca, 0xd5, 0x9e, 0x69, 0x88, 0x3f, 0x13, 0xb0, 0x69, 0x83, 0xbf, 0x05, 0xee, 0x65, 0x70, - 0x66, 0xda, 0xa7, 0x61, 0x04, 0x44, 0xe6, 0x10, 0xec, 0xe7, 0x77, 0x3d, 0xa8, 0xe0, 0x41, 0x47, 0xfa, 0xeb, 0x7a, - 0x56, 0xe0, 0x99, 0x7b, 0xe2, 0xf9, 0x9b, 0x13, 0xe9, 0x45, 0x0e, 0x0f, 0x34, 0xf7, 0x61, 0xc6, 0x5f, 0x96, 0x65, - 0xb8, 0x1b, 0x2d, 0xcb, 0x62, 0xe5, 0x45, 0x7a, 0x1f, 0xcf, 0xa4, 0x18, 0x48, 0x74, 0x98, 0x19, 0x5d, 0xc5, 0x3a, - 0xce, 0x61, 0xdc, 0xdb, 0x93, 0xb0, 0x42, 0xfb, 0x67, 0x89, 0xbd, 0x2e, 0x00, 0xc0, 0x21, 0x6b, 0xd0, 0x0a, 0xef, - 0x74, 0x7b, 0xbb, 0xc7, 0x25, 0x25, 0x8a, 0x1b, 0x35, 0x3f, 0xab, 0xa1, 0x65, 0x82, 0x5a, 0x66, 0xdd, 0xc9, 0x64, - 0x8a, 0x24, 0xf0, 0x6d, 0xd8, 0x1b, 0x56, 0xe4, 0xf3, 0x46, 0x6e, 0x0f, 0xef, 0xc2, 0x95, 0x88, 0xb5, 0x05, 0x9d, - 0x74, 0x64, 0x1c, 0xee, 0x85, 0xe6, 0x46, 0xba, 0x7f, 0x52, 0x25, 0x61, 0x29, 0x62, 0xb8, 0x05, 0xb2, 0xbd, 0xda, - 0x56, 0x82, 0x12, 0x48, 0x60, 0x3f, 0x94, 0x62, 0x99, 0x6e, 0x05, 0x80, 0x39, 0xf0, 0x3f, 0x25, 0x0c, 0xa1, 0xbb, - 0xf3, 0x10, 0xaf, 0x1a, 0x79, 0xdf, 0x20, 0x04, 0xfb, 0x6b, 0x90, 0xd3, 0x80, 0x41, 0xa4, 0x18, 0xc9, 0x82, 0x81, - 0x04, 0x20, 0xe7, 0x6b, 0x30, 0xc9, 0x4d, 0x73, 0xcf, 0x0f, 0x72, 0xdd, 0xc1, 0xb4, 0x0f, 0xba, 0x17, 0xd7, 0x9a, - 0xe5, 0xe0, 0x15, 0x13, 0xf1, 0xbf, 0xd7, 0x5e, 0xc9, 0x72, 0x96, 0xf9, 0x8d, 0xb9, 0xe8, 0x64, 0x70, 0xd5, 0x10, - 0x7e, 0x31, 0xcb, 0xe6, 0x3c, 0x9a, 0x65, 0x3a, 0xd4, 0xbf, 0x68, 0x8e, 0x4a, 0x01, 0x0c, 0x75, 0xbc, 0x00, 0x6b, - 0xbc, 0x2b, 0xdd, 0xb4, 0xe2, 0x91, 0xc6, 0x18, 0x05, 0x15, 0x3a, 0x08, 0xfd, 0xbd, 0x06, 0x78, 0x0d, 0x26, 0xb9, - 0x11, 0x2a, 0x1f, 0x5c, 0xd0, 0x0d, 0xdd, 0x72, 0xe5, 0x12, 0xd4, 0xa4, 0x6a, 0xf9, 0xe5, 0x08, 0xf5, 0xae, 0x96, - 0x5c, 0xaa, 0xcd, 0xa7, 0x46, 0x59, 0x23, 0xc8, 0xe4, 0x28, 0xfd, 0x3e, 0xe5, 0xc2, 0xad, 0x8c, 0xc9, 0xfa, 0x70, - 0xf0, 0x0a, 0x6e, 0x6a, 0xfc, 0x3a, 0x27, 0x16, 0x51, 0x7b, 0x48, 0x84, 0xad, 0xdd, 0x0a, 0xdd, 0x7b, 0xdc, 0x28, - 0xcd, 0xa3, 0x6c, 0x13, 0x8b, 0xca, 0xeb, 0x25, 0x60, 0x2d, 0xee, 0x01, 0x19, 0x2a, 0x2d, 0xfd, 0x8a, 0x15, 0x00, - 0x19, 0x20, 0x85, 0x8d, 0x1f, 0x90, 0xf6, 0xea, 0x83, 0x97, 0xfa, 0xfd, 0xbe, 0x31, 0xe5, 0xbf, 0x7f, 0xc8, 0x81, - 0x99, 0x50, 0x94, 0xf5, 0x0e, 0x26, 0x10, 0x5c, 0x3b, 0x49, 0x7b, 0x56, 0xf3, 0x17, 0xeb, 0xda, 0x03, 0x52, 0x2b, - 0xdf, 0x62, 0xae, 0x7a, 0x6d, 0x5f, 0x6c, 0xf6, 0x69, 0x75, 0x63, 0x34, 0x0e, 0x82, 0xa5, 0xd5, 0x5b, 0xad, 0x72, - 0xc8, 0x1b, 0x5e, 0x81, 0x48, 0x65, 0x5d, 0x5d, 0x2b, 0xe7, 0xea, 0x5a, 0x70, 0x24, 0x90, 0x2d, 0x79, 0x0e, 0xff, - 0x85, 0xdc, 0x2b, 0x0f, 0x87, 0xc2, 0xef, 0xf7, 0xd3, 0x19, 0x69, 0x65, 0x81, 0x32, 0x6d, 0x5d, 0x7b, 0xa1, 0x7f, - 0x38, 0xfc, 0x00, 0x5e, 0x23, 0xfe, 0xe1, 0x50, 0xf6, 0xfb, 0x1f, 0xcd, 0x4d, 0xe6, 0x7c, 0xac, 0x94, 0xb2, 0x97, - 0xa8, 0x74, 0x7f, 0x9b, 0xf0, 0xde, 0xff, 0x1e, 0xfd, 0xef, 0xd1, 0x65, 0x4f, 0x05, 0x80, 0x25, 0x7c, 0x86, 0x37, - 0x74, 0xa6, 0x2e, 0xe7, 0x4c, 0xba, 0xbb, 0x2b, 0x3f, 0xf4, 0x9e, 0xc6, 0x87, 0xef, 0xcd, 0x4d, 0x1b, 0x7f, 0xad, - 0x8e, 0x34, 0x09, 0x1d, 0x17, 0xfd, 0xc3, 0xe1, 0x53, 0xa2, 0xf5, 0x69, 0xa9, 0xd2, 0xa7, 0x29, 0xf0, 0x24, 0xc3, - 0x86, 0xeb, 0x16, 0xa6, 0xa3, 0xf9, 0x71, 0xf3, 0x55, 0xf2, 0xe2, 0x2c, 0x85, 0x6b, 0x6f, 0x3e, 0x4b, 0xe7, 0x53, - 0xb0, 0xae, 0x0c, 0xf3, 0x59, 0x3d, 0x0f, 0x20, 0x75, 0x08, 0x69, 0xd6, 0x34, 0xfc, 0x5b, 0xe5, 0x0a, 0xde, 0xda, - 0xe3, 0xdd, 0x60, 0x44, 0xa9, 0x23, 0x7d, 0xd2, 0x86, 0xd0, 0x25, 0x95, 0xfc, 0x47, 0x91, 0xc7, 0x18, 0xb3, 0xf1, - 0x9a, 0xc8, 0x3e, 0x8b, 0xfc, 0x55, 0x01, 0x80, 0x45, 0x80, 0x80, 0x9c, 0xce, 0x1d, 0x49, 0xfc, 0xe7, 0xe4, 0xdb, - 0x3f, 0xa6, 0x4b, 0xfb, 0x50, 0x16, 0x77, 0xa5, 0xa8, 0xaa, 0xa3, 0xd2, 0x76, 0xb6, 0x5c, 0x0f, 0xf4, 0xa1, 0xfd, - 0xbe, 0xa4, 0x0f, 0x4d, 0x31, 0x14, 0x05, 0x6e, 0x8d, 0xbd, 0x69, 0xca, 0x15, 0x4d, 0xf5, 0xc8, 0x58, 0x3f, 0xbf, - 0xdf, 0xbd, 0x8d, 0xbd, 0xd4, 0x0f, 0x52, 0x10, 0x84, 0x35, 0x7e, 0x52, 0x8a, 0x24, 0x70, 0x3e, 0xc3, 0x54, 0xe2, - 0xd3, 0xa5, 0x54, 0xf9, 0xc3, 0x48, 0xf3, 0x61, 0x0a, 0x7a, 0xd9, 0x7f, 0x54, 0x30, 0xff, 0x75, 0x7b, 0xb0, 0x3e, - 0xad, 0xcb, 0x34, 0xaa, 0x88, 0x2a, 0x2f, 0x4c, 0xb5, 0x09, 0x44, 0xf0, 0x17, 0xc2, 0x22, 0xf9, 0xf5, 0xc9, 0x91, - 0xa0, 0x31, 0x93, 0xe5, 0xe3, 0x91, 0xfb, 0x85, 0x7d, 0xe5, 0x3a, 0x9e, 0xff, 0xb9, 0x99, 0xff, 0x03, 0x74, 0x86, - 0x2c, 0x5e, 0x70, 0xcb, 0x60, 0x81, 0xb3, 0x5f, 0xba, 0x7a, 0xc0, 0xdf, 0xcc, 0x13, 0x2f, 0x80, 0x83, 0xf9, 0x05, - 0xba, 0x2a, 0xa6, 0xb3, 0x62, 0x00, 0x04, 0xb6, 0x7e, 0x63, 0xcd, 0x89, 0x37, 0x16, 0xcf, 0x95, 0x5c, 0x10, 0xfa, - 0xba, 0x0a, 0xb3, 0x71, 0x55, 0x6c, 0x2a, 0x51, 0x6c, 0xea, 0x1e, 0xa9, 0x65, 0xf3, 0x69, 0x6d, 0x2b, 0x64, 0x7f, - 0x12, 0x2d, 0xda, 0x2e, 0x43, 0x35, 0x19, 0x65, 0xe9, 0x7a, 0x0a, 0xa4, 0x7a, 0x01, 0x9c, 0x45, 0xe6, 0x95, 0x2f, - 0xce, 0x1e, 0xb0, 0x45, 0xe3, 0x29, 0x30, 0xa2, 0xd2, 0x1f, 0x79, 0x63, 0x74, 0x7a, 0xa2, 0xdf, 0xcf, 0xa7, 0x14, - 0xf2, 0xf5, 0x13, 0x60, 0x72, 0xd5, 0x72, 0x01, 0xfa, 0x32, 0xd4, 0x41, 0x25, 0x4a, 0xad, 0x18, 0x46, 0x2c, 0xfc, - 0x24, 0x90, 0xbd, 0x99, 0x82, 0x9a, 0x55, 0x94, 0x84, 0x4a, 0x54, 0x4a, 0xb6, 0x26, 0xa8, 0xa5, 0xf7, 0x45, 0x51, - 0xef, 0x2b, 0x70, 0x94, 0x8c, 0xb4, 0x59, 0x4e, 0x99, 0x71, 0x51, 0xe6, 0xa2, 0x1f, 0xec, 0xdf, 0x95, 0xe7, 0x37, - 0x32, 0x9f, 0xe5, 0xbe, 0xa3, 0x73, 0xda, 0x8e, 0x0b, 0x94, 0xb9, 0xe5, 0xb4, 0xd5, 0x92, 0xc7, 0xe4, 0x3d, 0x0b, - 0xb6, 0xfd, 0x97, 0x09, 0xf2, 0x2a, 0xc2, 0x7c, 0x42, 0x95, 0xcd, 0x3f, 0x20, 0xcc, 0x16, 0x07, 0xf6, 0xd8, 0x85, - 0x89, 0x48, 0x6f, 0xc1, 0x92, 0x18, 0x66, 0xa5, 0x08, 0xe3, 0x1d, 0x78, 0xff, 0x6c, 0x2a, 0x31, 0x3a, 0x43, 0x27, - 0xf7, 0xb3, 0x87, 0xb4, 0x4e, 0xce, 0xde, 0xbe, 0x3e, 0xfb, 0xae, 0x37, 0x28, 0x46, 0x69, 0x3c, 0xe8, 0x7d, 0x77, - 0xb6, 0xda, 0x00, 0x44, 0xa6, 0x38, 0x8b, 0xc9, 0x94, 0x26, 0xe2, 0x33, 0x32, 0x0c, 0x9e, 0xd5, 0x89, 0x38, 0xa3, - 0x89, 0xe9, 0xbe, 0x46, 0x69, 0xf2, 0xed, 0x28, 0xcc, 0xe1, 0xe5, 0x52, 0x6c, 0x2a, 0x11, 0x83, 0x9d, 0x52, 0xcd, - 0xb3, 0xbc, 0x7d, 0x16, 0xe7, 0xa3, 0x0e, 0x59, 0xa5, 0x03, 0x74, 0x7b, 0x22, 0xed, 0xaa, 0x74, 0x05, 0x84, 0x1e, - 0x00, 0x27, 0x5d, 0xf9, 0xf3, 0x70, 0x10, 0x09, 0x84, 0x5a, 0x30, 0x27, 0xd3, 0x88, 0x6e, 0x48, 0xaf, 0xb0, 0xcf, - 0xc0, 0x2c, 0xa4, 0x34, 0x0f, 0x6e, 0xae, 0x16, 0x2d, 0x77, 0xc5, 0xca, 0x51, 0x58, 0xad, 0x45, 0x54, 0x23, 0xd5, - 0x31, 0x38, 0xef, 0x40, 0x04, 0x80, 0x62, 0x04, 0xcf, 0x78, 0xd4, 0xef, 0x47, 0x2a, 0x28, 0x27, 0xa1, 0x5f, 0x14, - 0xfa, 0xa5, 0x31, 0x28, 0x63, 0xfe, 0x2e, 0xd4, 0xc4, 0x00, 0xf5, 0x96, 0x87, 0x8a, 0x23, 0x00, 0x97, 0x73, 0xc4, - 0x8c, 0xf3, 0x1e, 0x77, 0xd1, 0x38, 0x15, 0xef, 0x84, 0xba, 0x0e, 0x96, 0x0a, 0x75, 0xde, 0xd4, 0x47, 0x7a, 0x4e, - 0x9a, 0x04, 0x0d, 0xe2, 0x06, 0x1e, 0xaf, 0x86, 0x80, 0x6a, 0x25, 0xa4, 0xde, 0x42, 0xa7, 0x54, 0x75, 0x08, 0xac, - 0x01, 0x2e, 0x51, 0xd8, 0x56, 0x98, 0x1c, 0xd1, 0xa6, 0x2c, 0x45, 0x7e, 0xc4, 0x06, 0xed, 0x92, 0x91, 0xa9, 0x83, - 0xcb, 0xe5, 0x72, 0x22, 0xea, 0x5f, 0xf3, 0x2d, 0x80, 0xf3, 0x42, 0x7e, 0x6b, 0x37, 0x5b, 0x26, 0xd9, 0xae, 0x2b, - 0xc3, 0x59, 0x52, 0x8a, 0x6a, 0x5d, 0xe4, 0x55, 0x7a, 0x2f, 0x7e, 0xd6, 0x0f, 0x5d, 0x02, 0x29, 0xf4, 0x23, 0xbd, - 0x6e, 0x37, 0x47, 0xaa, 0x71, 0x74, 0x39, 0xb6, 0xa7, 0xd2, 0x4e, 0xf6, 0xaa, 0xc5, 0x9b, 0x2d, 0x73, 0x25, 0x69, - 0x1c, 0x8b, 0xfc, 0x6d, 0x1e, 0xa7, 0x91, 0x95, 0x1c, 0xfe, 0x1f, 0xde, 0xbe, 0x85, 0xbb, 0x6d, 0x1b, 0x5b, 0xf7, - 0xaf, 0x58, 0xbc, 0xa9, 0x4a, 0x44, 0x90, 0x2c, 0x39, 0x49, 0x67, 0x4a, 0x19, 0xd6, 0x71, 0xf3, 0x68, 0xd3, 0x36, - 0x71, 0x1a, 0xa7, 0x9d, 0xce, 0xe8, 0xea, 0xb8, 0x34, 0x09, 0x5b, 0x6c, 0x68, 0x40, 0x25, 0x29, 0x3f, 0x22, 0xf1, - 0xbf, 0xdf, 0xb5, 0x37, 0x9e, 0xa4, 0x68, 0x27, 0x33, 0xf7, 0xdc, 0xbb, 0xb2, 0x56, 0x2c, 0x82, 0x20, 0xde, 0xd8, - 0xd8, 0xd8, 0x8f, 0x6f, 0xeb, 0x00, 0xd5, 0x2e, 0xf2, 0x95, 0x8b, 0x8d, 0xfc, 0x22, 0x2b, 0x31, 0x60, 0x70, 0xa3, - 0x51, 0xad, 0x50, 0x53, 0x26, 0xf0, 0x85, 0x7c, 0x8f, 0x11, 0xb7, 0x59, 0x99, 0x00, 0xc3, 0x8f, 0x89, 0xfa, 0x92, - 0x9e, 0x42, 0x94, 0x07, 0x15, 0x8f, 0xfb, 0x05, 0x47, 0xc4, 0x6b, 0xab, 0x32, 0x07, 0x26, 0x5b, 0xab, 0x20, 0x11, - 0xec, 0x2e, 0x9b, 0xeb, 0x45, 0xb4, 0x50, 0x77, 0xa1, 0x5e, 0xbc, 0xdd, 0xf6, 0x12, 0x45, 0x07, 0x9c, 0xfc, 0x34, - 0x78, 0x15, 0x67, 0x39, 0x4f, 0xf7, 0x2a, 0xb9, 0xa7, 0x36, 0xd4, 0x9e, 0x72, 0xe6, 0x80, 0x9d, 0xf7, 0x75, 0xb5, - 0xa7, 0xd7, 0xf4, 0x9e, 0x6e, 0xe7, 0x1e, 0x5c, 0x30, 0x70, 0xe7, 0x5e, 0x66, 0xd7, 0x5c, 0xec, 0x81, 0x32, 0xd0, - 0x1a, 0x0f, 0xd4, 0xa2, 0x1a, 0xa9, 0x89, 0xd1, 0x81, 0xab, 0x13, 0x7d, 0x30, 0x07, 0xf4, 0x7b, 0x88, 0x15, 0xde, - 0x7a, 0xbb, 0xd2, 0x07, 0x6d, 0x40, 0x7f, 0x5e, 0x9a, 0x3e, 0xe8, 0x68, 0xf1, 0x2a, 0x24, 0x70, 0x63, 0x48, 0x35, - 0x52, 0xab, 0x91, 0x55, 0xa0, 0x78, 0xc3, 0x5b, 0xbc, 0x3b, 0xd7, 0x92, 0x8d, 0xf7, 0x12, 0x81, 0xbd, 0x32, 0x51, - 0xc5, 0x99, 0x38, 0xf6, 0x52, 0x79, 0xad, 0x9d, 0x64, 0x84, 0xf1, 0x2d, 0x2b, 0xa9, 0xbf, 0x43, 0xcc, 0x2d, 0xd2, - 0x1c, 0x06, 0x2f, 0xc3, 0x8a, 0xcc, 0x78, 0xbf, 0x2f, 0x67, 0x32, 0x2a, 0x67, 0x62, 0xbf, 0x8c, 0x14, 0x42, 0xdb, - 0x7d, 0x22, 0xa0, 0x07, 0x25, 0x40, 0xbe, 0x00, 0xa8, 0x7a, 0x48, 0xf8, 0xf3, 0x90, 0xd4, 0xa7, 0x53, 0xe8, 0x53, - 0x68, 0xeb, 0x15, 0xaf, 0xa0, 0xaa, 0x6e, 0x8c, 0x6c, 0xa3, 0x82, 0x16, 0x8f, 0xe5, 0x59, 0x6d, 0x18, 0x9b, 0x53, - 0xeb, 0x5d, 0x6f, 0x36, 0x98, 0xb2, 0xb9, 0x50, 0xab, 0x30, 0x24, 0xd1, 0x4d, 0xe9, 0x85, 0x0f, 0xb1, 0x58, 0x59, - 0xad, 0xcd, 0x6f, 0x62, 0x7f, 0x64, 0x22, 0xc5, 0xfd, 0x6c, 0x89, 0x73, 0x17, 0x8f, 0xe7, 0x55, 0x5f, 0x6b, 0x69, - 0x91, 0x69, 0xf3, 0x9d, 0xbe, 0x0c, 0x69, 0x2a, 0x6a, 0x48, 0xa3, 0xce, 0x0c, 0xba, 0x6f, 0x97, 0x57, 0x54, 0x23, - 0x4c, 0x80, 0x57, 0x3a, 0x83, 0x6e, 0x34, 0x1e, 0x88, 0xa2, 0x1a, 0x15, 0x6b, 0x21, 0x10, 0x6d, 0x18, 0x72, 0xcc, - 0x2c, 0x21, 0xc9, 0x3e, 0xf1, 0xef, 0x54, 0x70, 0x85, 0x22, 0xbe, 0x31, 0x70, 0xde, 0x95, 0xf5, 0xec, 0xae, 0x23, - 0x3f, 0x27, 0x16, 0x56, 0xfb, 0x0f, 0xcd, 0xa3, 0xd6, 0x38, 0x0b, 0x68, 0x6b, 0x5a, 0xdd, 0x70, 0xb8, 0x47, 0x75, - 0x2c, 0x4a, 0x03, 0x48, 0xec, 0x91, 0xe5, 0xa2, 0x75, 0xcc, 0xa0, 0x01, 0xfd, 0x6d, 0x76, 0xb5, 0xbe, 0x42, 0xd4, - 0xb6, 0x12, 0x59, 0x27, 0xa9, 0xfc, 0x4b, 0xda, 0xa3, 0xae, 0xed, 0xa9, 0xfc, 0x6f, 0xdb, 0x54, 0x39, 0xb4, 0x40, - 0xf2, 0xd8, 0xcd, 0x59, 0xa0, 0x3a, 0x12, 0x44, 0x81, 0xda, 0x7a, 0xc1, 0xd4, 0x3b, 0x65, 0x8a, 0x0e, 0xe4, 0xe7, - 0xc2, 0x9c, 0x61, 0x5f, 0x70, 0xc4, 0x98, 0xa5, 0x12, 0x83, 0xa9, 0x8f, 0x31, 0xaa, 0x69, 0xad, 0x00, 0x5d, 0x3f, - 0xdd, 0xc0, 0x9f, 0xa8, 0xa8, 0xd1, 0x50, 0x6b, 0x24, 0x85, 0xa2, 0x89, 0x0a, 0x3a, 0x96, 0x16, 0x3a, 0x98, 0x42, - 0x27, 0x91, 0xb0, 0x04, 0x34, 0x4c, 0x88, 0x4e, 0x2a, 0xf0, 0xd6, 0x00, 0xce, 0x7c, 0x5c, 0x94, 0xeb, 0x42, 0x1b, - 0xcc, 0xfd, 0x10, 0x5f, 0xf3, 0xd7, 0x2f, 0x9c, 0x51, 0x7d, 0xcb, 0x5a, 0xdf, 0xd3, 0x82, 0xfc, 0x10, 0x72, 0x8a, - 0x0e, 0x4c, 0xec, 0x68, 0x83, 0xc6, 0x18, 0x65, 0xad, 0x43, 0x5d, 0x9c, 0xe8, 0xf8, 0x2b, 0xda, 0x04, 0xef, 0x01, - 0x4f, 0x11, 0x6d, 0x78, 0x28, 0x8c, 0x55, 0x35, 0x3e, 0x95, 0xac, 0xa5, 0x07, 0x2b, 0x78, 0xba, 0x4e, 0x78, 0x08, - 0x7a, 0x24, 0xc2, 0x8e, 0xc2, 0x62, 0x1e, 0x2f, 0xe0, 0x38, 0x29, 0x08, 0xa8, 0x1d, 0xf4, 0x15, 0x7c, 0xbe, 0x40, - 0xf7, 0x57, 0x89, 0x1e, 0x60, 0x68, 0x41, 0xdc, 0x0c, 0x7d, 0x3a, 0xba, 0x8a, 0x57, 0x0d, 0x15, 0x09, 0x9f, 0x17, - 0x60, 0x3b, 0xa4, 0xd4, 0x53, 0xa0, 0x85, 0x4a, 0x94, 0x7e, 0x18, 0xf8, 0x0e, 0x0d, 0x7c, 0xad, 0x75, 0x80, 0x86, - 0x7e, 0xc6, 0x34, 0xb5, 0xce, 0x50, 0xf9, 0xcc, 0xbb, 0x67, 0x46, 0xcb, 0x99, 0x05, 0x63, 0xd0, 0xb7, 0xd1, 0x14, - 0xc5, 0x39, 0xf9, 0x2c, 0x28, 0xe2, 0x34, 0x8b, 0x73, 0xf0, 0xdb, 0x8c, 0x0b, 0xcc, 0x98, 0xc4, 0x15, 0xbf, 0x94, - 0x05, 0x68, 0xbb, 0x73, 0x95, 0x5a, 0xd7, 0x20, 0x20, 0xfb, 0x01, 0xac, 0x5e, 0x1a, 0x3a, 0x2a, 0xe7, 0xdd, 0xa5, - 0x4d, 0x21, 0x62, 0x11, 0x82, 0x4d, 0x33, 0x5d, 0xb2, 0xe3, 0x50, 0x69, 0x73, 0x20, 0xbe, 0x11, 0x1a, 0xf7, 0x4f, - 0xc3, 0xd8, 0x6a, 0x8a, 0xad, 0xdd, 0xdb, 0x76, 0xfb, 0x7b, 0xe9, 0xa5, 0xd3, 0x9c, 0xf4, 0x18, 0xfb, 0xbd, 0x0c, - 0x8b, 0x91, 0xed, 0x08, 0x81, 0x25, 0xe7, 0x7d, 0xea, 0xbf, 0xa2, 0xe5, 0x3c, 0x01, 0xd3, 0x11, 0x1d, 0x21, 0x17, - 0x28, 0x3b, 0x46, 0x71, 0x07, 0x06, 0x57, 0xf4, 0xfb, 0x60, 0x95, 0x61, 0x2e, 0x24, 0x4b, 0x92, 0x32, 0x78, 0x9e, - 0x7a, 0x18, 0xf0, 0x6b, 0xa6, 0xcc, 0x5d, 0x94, 0xf5, 0xe9, 0x92, 0x4c, 0x53, 0x64, 0x20, 0xd6, 0xe1, 0x26, 0x4b, - 0xa3, 0x44, 0x89, 0xc8, 0x96, 0xe8, 0x1f, 0x69, 0x28, 0x96, 0x0e, 0xd7, 0x8b, 0x54, 0x89, 0x50, 0x31, 0x4f, 0xf1, - 0xa4, 0x4e, 0xeb, 0x74, 0x84, 0xf1, 0x26, 0x41, 0x29, 0x57, 0xc3, 0x40, 0x95, 0x54, 0x2f, 0x85, 0x4d, 0xb1, 0xdd, - 0xea, 0x8b, 0x95, 0x98, 0xc7, 0x0b, 0x7c, 0x29, 0x70, 0x14, 0x7f, 0xe2, 0x5e, 0xac, 0x29, 0xb5, 0x3d, 0xa8, 0x1d, - 0x51, 0x42, 0x7f, 0xe2, 0x70, 0x91, 0xf8, 0x4e, 0xea, 0xb8, 0x7f, 0x68, 0x11, 0x72, 0xa6, 0x0e, 0x52, 0xc3, 0x0d, - 0xed, 0x08, 0xff, 0x0d, 0xd7, 0x67, 0x9c, 0xd1, 0x9b, 0x6a, 0x46, 0x8d, 0xdf, 0xeb, 0xe1, 0x19, 0xa3, 0x3e, 0x1b, - 0x38, 0xac, 0x10, 0x85, 0x36, 0xec, 0xa8, 0x54, 0xa2, 0x85, 0xa1, 0x54, 0x7f, 0x09, 0x15, 0x47, 0xdc, 0x99, 0x51, - 0x96, 0x8c, 0x4f, 0xcb, 0x43, 0x31, 0x1d, 0x0c, 0x4a, 0x52, 0x19, 0x0b, 0x3d, 0xb8, 0x1e, 0x78, 0xfe, 0x3d, 0x70, - 0x0b, 0xf1, 0xe0, 0x90, 0xc5, 0x90, 0x1b, 0x70, 0xfc, 0x16, 0x27, 0x57, 0x8d, 0x4a, 0x15, 0xbc, 0x9a, 0xa8, 0x16, - 0xfc, 0x54, 0x86, 0x01, 0xfa, 0x24, 0x05, 0x60, 0x32, 0x98, 0xf2, 0x5b, 0x90, 0x28, 0x9d, 0xa9, 0x1b, 0xd2, 0xaf, - 0xa2, 0xe0, 0x17, 0xbc, 0xe0, 0x22, 0x71, 0x05, 0x58, 0xde, 0xc1, 0xf6, 0x3a, 0xaa, 0xa8, 0x02, 0xe2, 0x35, 0x3d, - 0x8e, 0xb8, 0xf1, 0xfe, 0x33, 0x3d, 0xb6, 0x40, 0xad, 0xd6, 0xb1, 0xc1, 0x67, 0x8e, 0xc1, 0x05, 0x5d, 0x4b, 0x6c, - 0x0d, 0xd5, 0xb0, 0x22, 0x30, 0x70, 0x01, 0x07, 0x61, 0x89, 0xe2, 0xd8, 0x4a, 0x5e, 0x91, 0x86, 0x94, 0xf6, 0x81, - 0xe1, 0x68, 0x93, 0x1c, 0xdf, 0x66, 0xd9, 0x4d, 0xe0, 0x7c, 0xd1, 0x39, 0x69, 0x26, 0x96, 0x0d, 0xde, 0xe7, 0xcd, - 0xf9, 0x75, 0xff, 0x90, 0x50, 0x15, 0xec, 0x86, 0xb7, 0x83, 0xdd, 0x38, 0xe1, 0xd7, 0x5c, 0x2c, 0x74, 0x7c, 0x16, - 0x73, 0xc9, 0xf2, 0x5b, 0xeb, 0xdd, 0x92, 0xa4, 0x56, 0x40, 0xfb, 0x2c, 0x0b, 0x6a, 0x22, 0x00, 0xdd, 0x0f, 0x7f, - 0x81, 0xd0, 0x19, 0xfe, 0xf6, 0x18, 0x5c, 0x91, 0xc2, 0x7b, 0x87, 0x40, 0x58, 0xd3, 0xcd, 0x9d, 0xda, 0x80, 0x2f, - 0xc6, 0xfd, 0x19, 0x53, 0x4f, 0xbf, 0xcd, 0xe4, 0xae, 0xae, 0xdb, 0x23, 0xcb, 0xf0, 0x11, 0xae, 0x14, 0x00, 0xcb, - 0x84, 0xbf, 0x18, 0x5b, 0x52, 0x7d, 0x02, 0x70, 0x6a, 0x3a, 0xa2, 0x4f, 0x10, 0x18, 0x38, 0x25, 0x5a, 0x8c, 0xae, - 0x95, 0x23, 0x9a, 0x41, 0x5a, 0xd3, 0xad, 0x30, 0xde, 0x7a, 0xd0, 0x42, 0xcf, 0x34, 0x9c, 0xf8, 0x0f, 0x9a, 0x79, - 0x55, 0x40, 0x00, 0xad, 0x8c, 0xe0, 0xad, 0xf5, 0xd1, 0x1c, 0x21, 0x3e, 0x61, 0x49, 0x34, 0x61, 0xf1, 0x4c, 0xf1, - 0x63, 0x42, 0x37, 0x4d, 0x6d, 0xd3, 0x07, 0xa4, 0xbf, 0xb8, 0x66, 0xfd, 0x94, 0x65, 0xed, 0xdb, 0x43, 0xc5, 0x8b, - 0x69, 0x33, 0xf8, 0x61, 0xa2, 0x8a, 0xf1, 0xbf, 0xa8, 0x7c, 0xa9, 0x15, 0xc0, 0x30, 0x77, 0xd5, 0xd3, 0xef, 0x37, - 0xb3, 0xe5, 0x40, 0xa8, 0xfc, 0xce, 0x20, 0xe9, 0xd3, 0xf1, 0xfc, 0xc0, 0x26, 0x51, 0x5b, 0xe8, 0xf9, 0xe3, 0x52, - 0x37, 0xa1, 0xf2, 0xda, 0xd4, 0x88, 0x56, 0xc8, 0x50, 0xd9, 0x3a, 0x60, 0x7d, 0xff, 0x10, 0xee, 0x2e, 0x6a, 0x1a, - 0x6a, 0xdd, 0x73, 0xd7, 0xa2, 0xe0, 0xc4, 0x1f, 0x60, 0x2c, 0x2e, 0x24, 0xb5, 0x0e, 0xc2, 0xa4, 0x1f, 0x2d, 0x4e, - 0x72, 0xa3, 0xae, 0x4e, 0xce, 0x14, 0xf3, 0x04, 0x2e, 0xaa, 0x65, 0xdb, 0x5f, 0x51, 0xa9, 0x4b, 0xb9, 0xbd, 0xa2, - 0x34, 0x3d, 0xa4, 0xed, 0x55, 0x9c, 0xb7, 0x05, 0x17, 0xfc, 0x0b, 0x05, 0x17, 0xd6, 0xc1, 0xba, 0xe3, 0x4e, 0xd9, - 0x13, 0x9e, 0x28, 0xd3, 0xda, 0xe0, 0xae, 0x1b, 0x8c, 0x89, 0xb1, 0xdf, 0x5d, 0xf2, 0xe4, 0x23, 0xb2, 0xe0, 0xdf, - 0x65, 0x02, 0x3c, 0x93, 0xdd, 0x2b, 0x95, 0xff, 0x07, 0xff, 0x6a, 0x6b, 0xdf, 0x59, 0xf3, 0x4f, 0xcf, 0x7a, 0xb8, - 0x73, 0x98, 0xfc, 0x00, 0x9d, 0x01, 0xdd, 0x5c, 0xc9, 0x94, 0x03, 0x32, 0x80, 0xb5, 0x48, 0x46, 0x03, 0x3e, 0xb4, - 0xb2, 0x6c, 0xfb, 0x4e, 0xab, 0x0b, 0xc2, 0xbd, 0x04, 0x6e, 0x7a, 0x7f, 0x6d, 0x66, 0xe6, 0x74, 0xad, 0x44, 0xd3, - 0xa5, 0xb1, 0xb5, 0x2c, 0x55, 0xc0, 0xee, 0xf7, 0x9e, 0x64, 0xd3, 0xfc, 0x70, 0x39, 0xcd, 0x2d, 0x75, 0xdb, 0xb8, - 0x65, 0x03, 0x40, 0x88, 0x5d, 0x6b, 0x2b, 0x07, 0x90, 0xdc, 0x1e, 0x84, 0xf0, 0xb5, 0x22, 0xf4, 0x54, 0x89, 0xd0, - 0xa7, 0x69, 0xb3, 0x0f, 0x76, 0x55, 0xad, 0x1b, 0x71, 0x8e, 0x06, 0xa9, 0x66, 0xe4, 0x4f, 0xae, 0x79, 0x71, 0x91, - 0xcb, 0x1b, 0xc0, 0x40, 0x26, 0xb5, 0x51, 0x58, 0x5e, 0x81, 0x3b, 0x3f, 0x3a, 0x8e, 0x33, 0x31, 0xca, 0x31, 0x58, - 0x2b, 0xc2, 0x23, 0xeb, 0xc4, 0x19, 0x80, 0x20, 0xfb, 0x93, 0xa6, 0xe3, 0xb9, 0x16, 0x18, 0xd3, 0x17, 0xb8, 0xab, - 0x9c, 0x1d, 0x6d, 0x72, 0xbb, 0xe8, 0x9b, 0x33, 0xac, 0x3b, 0x52, 0x5a, 0x1b, 0x8b, 0xae, 0x3b, 0x58, 0x6b, 0x06, - 0x6d, 0x11, 0x4a, 0x3e, 0xe4, 0x4e, 0xda, 0x4f, 0x01, 0x0d, 0xce, 0xb2, 0xf4, 0xd6, 0x5a, 0xe5, 0x6f, 0xb4, 0x10, - 0x27, 0x8a, 0xa9, 0x13, 0xdf, 0x44, 0x89, 0x3e, 0x3f, 0x13, 0xe3, 0x06, 0x02, 0xa9, 0x3f, 0x60, 0x50, 0x8d, 0x22, - 0x4c, 0xe0, 0x3a, 0x10, 0xc5, 0xf6, 0x44, 0x6d, 0x2c, 0x47, 0xd0, 0x09, 0x21, 0xde, 0x41, 0x19, 0xc6, 0xea, 0xe2, - 0x40, 0x1b, 0x2c, 0x7d, 0xdd, 0x5a, 0xe7, 0x86, 0x50, 0x18, 0x27, 0x30, 0xc5, 0x20, 0xa9, 0xb3, 0xce, 0x32, 0x41, - 0x95, 0x1d, 0x93, 0xce, 0xfb, 0x00, 0xdd, 0x5d, 0x8b, 0xa6, 0xf8, 0xba, 0x73, 0x07, 0xdd, 0xc7, 0xf5, 0x6b, 0x2d, - 0x72, 0x83, 0x3f, 0x6f, 0x89, 0xb0, 0x08, 0x9c, 0xb5, 0x26, 0x5f, 0x35, 0xc2, 0x81, 0x29, 0xc9, 0x34, 0xec, 0x25, - 0xca, 0xa6, 0x7b, 0xbb, 0xed, 0xf5, 0xee, 0x15, 0x71, 0xf5, 0x18, 0xab, 0xbc, 0x9b, 0xb9, 0xbd, 0x53, 0xad, 0xc5, - 0xee, 0x4d, 0xdb, 0x4f, 0xb1, 0xa3, 0xd6, 0xda, 0xed, 0x86, 0x13, 0x6a, 0xc8, 0xb7, 0xa2, 0x4a, 0xab, 0xd3, 0x8d, - 0x41, 0x3b, 0xc4, 0xb3, 0x16, 0x19, 0xdc, 0x28, 0x5f, 0x38, 0xa1, 0x93, 0x8a, 0xb3, 0xea, 0xd4, 0x05, 0x9b, 0x2b, - 0x5e, 0x2d, 0x65, 0x1a, 0x09, 0x8a, 0x36, 0xe7, 0x51, 0x49, 0x13, 0xb9, 0x16, 0x55, 0x24, 0x6b, 0xd4, 0x8b, 0x5a, - 0x8d, 0x01, 0x02, 0x32, 0x9d, 0x35, 0x3d, 0xa8, 0x82, 0xd9, 0x50, 0x46, 0x72, 0xfa, 0x1e, 0x2c, 0xed, 0x91, 0x63, - 0xad, 0xef, 0xab, 0xb3, 0xc5, 0xb7, 0x7a, 0x42, 0x30, 0x85, 0xd9, 0x03, 0x61, 0xe0, 0x9a, 0xc6, 0x90, 0xd3, 0x2e, - 0x71, 0x59, 0xd3, 0x2d, 0xe1, 0x1e, 0x6e, 0x57, 0xb2, 0x23, 0x37, 0x4f, 0x9a, 0x9b, 0x2b, 0xd8, 0x51, 0x31, 0x1f, - 0x83, 0xf6, 0x4b, 0xaa, 0x6b, 0x97, 0xe6, 0xd6, 0xe3, 0x41, 0x40, 0x83, 0x41, 0x61, 0xf8, 0xd7, 0x89, 0xf1, 0xf0, - 0xa4, 0x01, 0x41, 0x52, 0x2e, 0xc2, 0xb1, 0x6f, 0x44, 0x3f, 0x99, 0xca, 0x43, 0x8e, 0x16, 0xef, 0xd0, 0xea, 0x04, - 0xa2, 0x78, 0x89, 0x50, 0x12, 0xa3, 0x2a, 0x34, 0x22, 0x28, 0x4f, 0xcb, 0x5f, 0xaa, 0xea, 0x10, 0x50, 0x48, 0xfb, - 0x8a, 0x42, 0xd9, 0x26, 0x31, 0x34, 0xc3, 0x2f, 0xe7, 0x93, 0x85, 0x9e, 0x81, 0x81, 0x9c, 0x1f, 0x2c, 0xf4, 0x2c, - 0x0c, 0xe4, 0xfc, 0xc9, 0xa2, 0x76, 0xeb, 0x40, 0x13, 0x10, 0xcf, 0x85, 0xa3, 0x93, 0xd2, 0xaa, 0x6c, 0x01, 0xdd, - 0x3c, 0x44, 0xd0, 0x7f, 0xb2, 0x87, 0xa0, 0x93, 0x0b, 0xed, 0xc8, 0x0d, 0x68, 0x3b, 0x0e, 0x81, 0xbd, 0x62, 0x52, - 0x61, 0x02, 0x10, 0x1d, 0xb2, 0x31, 0x18, 0x62, 0xab, 0x0f, 0x0e, 0xd9, 0x78, 0xea, 0x93, 0x20, 0x60, 0x74, 0x7f, - 0x30, 0x90, 0xe0, 0xb7, 0x78, 0x95, 0x3e, 0xda, 0x08, 0x74, 0xd3, 0x77, 0x77, 0x43, 0xef, 0xe2, 0x0a, 0x4e, 0xd5, - 0xee, 0x9e, 0x84, 0x6e, 0x32, 0xed, 0x00, 0xbd, 0x86, 0xb8, 0x21, 0xbf, 0x32, 0x1a, 0x8d, 0x6c, 0x4a, 0x48, 0x88, - 0xe1, 0x1c, 0x9a, 0x39, 0x2d, 0x97, 0xaf, 0x6e, 0x3d, 0x1b, 0x90, 0x61, 0xa6, 0xb7, 0x4c, 0xd6, 0x0f, 0x50, 0x56, - 0x3d, 0x86, 0x76, 0xe8, 0x3d, 0x72, 0xfc, 0xf0, 0xe0, 0x9b, 0x8c, 0x9f, 0x39, 0x5c, 0x7b, 0x38, 0x17, 0xbe, 0xcb, - 0x9a, 0x91, 0x39, 0x74, 0x9e, 0x7d, 0x1c, 0xef, 0x61, 0x9c, 0x7c, 0x9e, 0x85, 0xf2, 0xc6, 0x6b, 0xfa, 0x1f, 0x95, - 0xde, 0xec, 0x70, 0xc8, 0xe9, 0x0a, 0x56, 0xdc, 0xac, 0x0a, 0x0d, 0x3f, 0x8b, 0xbc, 0x71, 0xc4, 0x6b, 0x12, 0x55, - 0xdd, 0xe7, 0xbd, 0x0d, 0x53, 0xda, 0x31, 0x0e, 0x00, 0x4e, 0xd4, 0xaa, 0x61, 0x57, 0x1a, 0xd7, 0xea, 0x20, 0x86, - 0xa1, 0x84, 0xad, 0x12, 0x47, 0x42, 0xf9, 0x1b, 0x80, 0xb0, 0x18, 0x8a, 0xe3, 0xad, 0x61, 0x7d, 0x80, 0xfd, 0xd0, - 0x05, 0x9a, 0xe6, 0x94, 0x6a, 0x06, 0x00, 0x49, 0xc0, 0x1f, 0x3d, 0xdd, 0x34, 0x54, 0xb6, 0x79, 0x1e, 0x5a, 0x56, - 0x57, 0xf0, 0x40, 0x4f, 0x5d, 0xc9, 0xc0, 0xb8, 0xaa, 0x63, 0x6f, 0x73, 0x7f, 0x7b, 0xb4, 0x8a, 0x7c, 0x67, 0x93, - 0xda, 0x66, 0x55, 0x68, 0xec, 0xe3, 0x09, 0x3d, 0x9d, 0x00, 0xad, 0xd7, 0x96, 0x8a, 0xf6, 0xfb, 0x28, 0x46, 0x8d, - 0x0b, 0x05, 0x56, 0x61, 0x22, 0xc1, 0x21, 0xc2, 0x08, 0xa1, 0xdf, 0x97, 0xe1, 0xc6, 0x17, 0x64, 0x10, 0x0d, 0xd7, - 0xa2, 0xe3, 0x0f, 0x39, 0x5e, 0xb4, 0x2d, 0x55, 0x35, 0x27, 0x4d, 0x5b, 0x02, 0x6f, 0xc2, 0x01, 0xb6, 0xf3, 0x4f, - 0x1b, 0x22, 0x57, 0xe1, 0xa2, 0x84, 0xef, 0x88, 0x6b, 0x41, 0x74, 0x53, 0x9b, 0x7a, 0x1b, 0x76, 0x88, 0x8e, 0xa6, - 0x78, 0x74, 0xc8, 0x3d, 0x77, 0xcf, 0x6d, 0x11, 0xdf, 0x7c, 0x86, 0xdc, 0x35, 0x9d, 0xbd, 0x14, 0x61, 0x50, 0xb7, - 0x6c, 0xa0, 0x58, 0x87, 0x4e, 0x50, 0x80, 0x51, 0x5b, 0x3e, 0x01, 0x1d, 0x1b, 0x0c, 0x2a, 0x82, 0x4f, 0x0a, 0xdb, - 0xa6, 0x41, 0xfe, 0x88, 0x77, 0x43, 0x87, 0xd7, 0x96, 0x3c, 0x10, 0xaf, 0xb0, 0xcf, 0x94, 0x70, 0xff, 0x82, 0x82, - 0xee, 0x28, 0x2f, 0x57, 0x85, 0xab, 0xd2, 0x00, 0x54, 0xd9, 0xf1, 0x5c, 0x6b, 0x4a, 0x5a, 0xc0, 0x4a, 0x49, 0xdd, - 0xf9, 0x4d, 0x44, 0xdc, 0x92, 0xa9, 0x98, 0xad, 0xba, 0x51, 0xe5, 0xa1, 0x44, 0x91, 0x8e, 0x3d, 0xdb, 0x39, 0x58, - 0x03, 0xe0, 0x29, 0x6c, 0x2f, 0xce, 0xb0, 0xa0, 0x8c, 0xcb, 0x96, 0xb9, 0x04, 0x8a, 0xfa, 0x61, 0x9c, 0x97, 0x1d, - 0x5f, 0xee, 0x8e, 0xb6, 0xf7, 0xd0, 0x1b, 0xb1, 0x31, 0x5e, 0x5f, 0x46, 0x4d, 0xbf, 0x78, 0x86, 0x2b, 0x4b, 0x41, - 0x1e, 0x68, 0xaa, 0x47, 0x18, 0x1d, 0x02, 0xd3, 0x94, 0x1f, 0xb1, 0xf1, 0x74, 0x38, 0x34, 0x64, 0xd0, 0x6b, 0x26, - 0xc6, 0xff, 0xfa, 0x02, 0x5a, 0x67, 0x26, 0xae, 0xf1, 0x69, 0xfb, 0x0a, 0x5a, 0xdd, 0xa2, 0x4c, 0xee, 0x0c, 0x0c, - 0x1f, 0x68, 0xc9, 0x14, 0x4c, 0x15, 0xde, 0x10, 0xa9, 0x64, 0x9f, 0x96, 0xd6, 0x61, 0xdf, 0x2e, 0x14, 0x5a, 0x68, - 0xe2, 0x57, 0x19, 0xe2, 0xa7, 0xae, 0x33, 0xff, 0x36, 0xed, 0x53, 0x83, 0x58, 0x58, 0x12, 0xa3, 0x10, 0xbf, 0x38, - 0x55, 0xb6, 0x13, 0x42, 0x05, 0xc4, 0x43, 0xd7, 0xba, 0x71, 0x24, 0x55, 0xec, 0x49, 0xa1, 0xf1, 0xd4, 0x70, 0xdf, - 0x0b, 0x1d, 0xb3, 0x0e, 0xb3, 0xb8, 0xcd, 0x1a, 0x49, 0x8d, 0x71, 0x2a, 0x4c, 0x70, 0x4a, 0xb9, 0x8a, 0x04, 0x46, - 0xc7, 0xb3, 0x85, 0x41, 0x54, 0x49, 0x4c, 0x32, 0xb6, 0x16, 0xc2, 0xc4, 0xae, 0x73, 0x85, 0x69, 0xea, 0x22, 0xf5, - 0x9b, 0x81, 0xc9, 0x82, 0x86, 0xfc, 0x1e, 0x8d, 0xd6, 0x54, 0x4d, 0x01, 0x86, 0x71, 0x94, 0x6a, 0xfc, 0x5b, 0x84, - 0xda, 0x0c, 0x03, 0x00, 0xdb, 0xbc, 0x93, 0x99, 0xa8, 0x5e, 0x0b, 0x84, 0x40, 0x73, 0xf6, 0x53, 0x45, 0xb5, 0x33, - 0x0b, 0x46, 0xd1, 0x6e, 0xaf, 0x7c, 0x3e, 0x70, 0x42, 0x79, 0xac, 0x2e, 0x50, 0xaf, 0x64, 0xf1, 0x46, 0xa6, 0xbc, - 0x15, 0x17, 0x73, 0x4f, 0xb2, 0x0f, 0xf9, 0x08, 0xce, 0x2b, 0x74, 0x2a, 0x37, 0xdb, 0x44, 0x99, 0x25, 0x49, 0xc6, - 0x02, 0x63, 0xf3, 0x12, 0xcc, 0xa4, 0x66, 0xc6, 0xf0, 0x6b, 0x08, 0x2e, 0xb6, 0x73, 0x12, 0x6e, 0xee, 0xe7, 0x81, - 0x21, 0x34, 0xb9, 0x68, 0x89, 0x86, 0xad, 0x1d, 0xaf, 0x27, 0xd7, 0x84, 0xfb, 0xb0, 0x11, 0x6b, 0x32, 0xc6, 0xb8, - 0x36, 0x37, 0xb2, 0x7e, 0xb4, 0xc0, 0x83, 0x31, 0x65, 0xfd, 0x09, 0x64, 0x5a, 0x49, 0x59, 0xe7, 0x0b, 0x23, 0x66, - 0x52, 0x89, 0xde, 0xed, 0x1b, 0x9f, 0xd5, 0x5d, 0x44, 0xfd, 0xd6, 0x7e, 0x4f, 0xea, 0xe1, 0xce, 0x7f, 0x50, 0x58, - 0x83, 0xca, 0x88, 0xcb, 0x88, 0xf2, 0xcc, 0x81, 0x6e, 0x9a, 0x14, 0x71, 0x7a, 0xb6, 0x8a, 0x8b, 0x92, 0xa7, 0x50, - 0xa9, 0xa6, 0x6e, 0x51, 0x6f, 0x02, 0xf6, 0x86, 0x48, 0x92, 0xac, 0xa5, 0xb1, 0x15, 0xbb, 0x34, 0x48, 0xcf, 0xbd, - 0x61, 0x96, 0x5e, 0x55, 0x68, 0x48, 0x4b, 0xbd, 0xb3, 0x50, 0xc9, 0xfc, 0x15, 0xff, 0x19, 0xd4, 0x0a, 0x74, 0xb4, - 0x49, 0x31, 0x9e, 0x03, 0x23, 0xbe, 0x1b, 0xc1, 0xea, 0x01, 0xe2, 0xa2, 0x09, 0x4a, 0xbd, 0x23, 0x76, 0xfc, 0xdc, - 0xe4, 0xe1, 0x5d, 0xc8, 0x39, 0x83, 0x4f, 0x1f, 0x66, 0x89, 0x5a, 0xeb, 0x48, 0x8c, 0xd4, 0x0c, 0xa0, 0xe9, 0xa0, - 0xcc, 0x79, 0x2c, 0x82, 0x59, 0xcf, 0x24, 0x46, 0x3d, 0xae, 0x7f, 0x81, 0x86, 0xda, 0x6f, 0x56, 0x96, 0x67, 0xd5, - 0xdd, 0x97, 0x70, 0x60, 0x53, 0x5b, 0x41, 0x8f, 0xd7, 0x95, 0xbc, 0xbc, 0x54, 0xdd, 0xf6, 0x0b, 0x31, 0x72, 0xba, - 0xc6, 0xb5, 0x74, 0x5e, 0x2d, 0x58, 0xaf, 0x3b, 0xdd, 0x2c, 0xee, 0x66, 0x19, 0x0d, 0x84, 0xb5, 0x9d, 0x4f, 0x34, - 0x7f, 0xd6, 0x6c, 0xbb, 0x8f, 0xb7, 0x20, 0x66, 0x01, 0x00, 0xa4, 0x07, 0x51, 0xb0, 0xcc, 0x52, 0x1e, 0x50, 0x79, - 0x1f, 0x47, 0x59, 0x28, 0xbd, 0x9c, 0x65, 0xfc, 0xb4, 0x69, 0xac, 0x75, 0x56, 0x28, 0x43, 0x6b, 0xa3, 0x3b, 0x5d, - 0x65, 0x88, 0xed, 0x27, 0x71, 0xb6, 0x00, 0xf7, 0xc7, 0x0c, 0x85, 0x86, 0xce, 0x32, 0xd2, 0x44, 0xc3, 0x77, 0xdd, - 0x33, 0xc8, 0x28, 0x4e, 0xd6, 0x79, 0x25, 0xdd, 0xe8, 0xb3, 0x36, 0x12, 0xe6, 0x1e, 0xa2, 0x5f, 0xc5, 0xe0, 0x51, - 0xee, 0xf3, 0xda, 0xe8, 0x64, 0x5a, 0x46, 0xda, 0x9d, 0x9f, 0xd4, 0xcb, 0x2c, 0xd5, 0x3a, 0x6c, 0x9f, 0x61, 0x6f, - 0x8d, 0x49, 0x6f, 0x42, 0x6a, 0x18, 0x89, 0xcf, 0x67, 0xd4, 0x08, 0x01, 0x6d, 0x39, 0xfe, 0x0e, 0x9f, 0x61, 0x68, - 0x0a, 0x2c, 0x55, 0xdc, 0xc2, 0x6e, 0xf8, 0x9a, 0x4f, 0x56, 0x2d, 0x00, 0x11, 0xac, 0x7c, 0xbd, 0x8b, 0x57, 0x42, - 0x7d, 0xa6, 0xcd, 0x00, 0x90, 0x05, 0xa5, 0xdc, 0xf1, 0x53, 0x2a, 0x1d, 0x2c, 0x51, 0xb4, 0xbd, 0x9c, 0xbe, 0xd1, - 0xb1, 0xf1, 0x43, 0x7a, 0x2e, 0x60, 0xbb, 0x90, 0xdf, 0xba, 0x57, 0x2f, 0x51, 0x91, 0xda, 0x36, 0xeb, 0x01, 0xbe, - 0xdc, 0xa0, 0x49, 0x18, 0x41, 0x99, 0x32, 0x05, 0x30, 0xb8, 0xa9, 0x46, 0xc1, 0xa4, 0xd5, 0x48, 0xd8, 0x52, 0x4f, - 0xb2, 0xdc, 0xf4, 0xc1, 0xa9, 0xee, 0x11, 0xf4, 0x68, 0x87, 0x93, 0x96, 0xfd, 0x5a, 0xc1, 0xd1, 0xc9, 0xd5, 0x10, - 0x35, 0xf3, 0x5e, 0xdb, 0x91, 0x21, 0xe5, 0x32, 0x0c, 0x04, 0x53, 0x8e, 0x79, 0x7a, 0x6c, 0x3d, 0x23, 0xa2, 0x07, - 0xce, 0x3e, 0xd3, 0xad, 0xba, 0x92, 0x80, 0xe8, 0xf8, 0xcd, 0xd3, 0xd7, 0x57, 0xf1, 0xa5, 0x41, 0x51, 0x6a, 0x58, - 0xc4, 0x28, 0xd3, 0xbe, 0x4a, 0xc2, 0xe0, 0xfd, 0xfa, 0xfe, 0x67, 0x95, 0xa5, 0xf6, 0x7b, 0xb0, 0xb1, 0xa2, 0xaa, - 0x5f, 0x4b, 0x5e, 0x34, 0x05, 0x58, 0xf7, 0x59, 0xa2, 0x40, 0xee, 0xf7, 0x36, 0xcd, 0x7c, 0x13, 0x35, 0x6e, 0x36, - 0xac, 0x37, 0xae, 0xdb, 0xa5, 0xb6, 0x64, 0x47, 0x56, 0x22, 0x67, 0x16, 0x83, 0x19, 0x3f, 0x2a, 0x0c, 0x4a, 0xc3, - 0x06, 0x55, 0xa9, 0xf8, 0xbd, 0x11, 0xc1, 0xa9, 0x63, 0x55, 0x61, 0x4c, 0x03, 0x66, 0x5b, 0x51, 0x6b, 0x50, 0x07, - 0xa5, 0xb4, 0x35, 0x51, 0xd8, 0x7e, 0x67, 0x05, 0x35, 0xbf, 0xff, 0x69, 0x0c, 0xf9, 0x9a, 0x52, 0x50, 0x49, 0xc0, - 0xce, 0xa0, 0xd1, 0x53, 0x25, 0x0c, 0xa4, 0x20, 0x78, 0x02, 0x94, 0x2f, 0xa2, 0xc6, 0x6a, 0xb7, 0xaf, 0x4e, 0x8d, - 0xd1, 0x16, 0x10, 0x5a, 0x48, 0x8f, 0x2e, 0xfb, 0xb8, 0x8d, 0x75, 0x20, 0xf1, 0xe0, 0x04, 0xdb, 0xb9, 0xba, 0x46, - 0x23, 0xa1, 0xf9, 0x43, 0xa3, 0x01, 0xaf, 0x69, 0x05, 0x0a, 0xf5, 0x1c, 0x47, 0x43, 0x67, 0x87, 0x14, 0x44, 0x6c, - 0xd0, 0xc2, 0xbe, 0x7b, 0x3e, 0x34, 0xfb, 0x7a, 0x9e, 0x2c, 0x48, 0x4d, 0xa5, 0xfb, 0xdc, 0x2d, 0x21, 0x6b, 0xd5, - 0xa1, 0xac, 0x3c, 0xc0, 0xf1, 0x42, 0xc9, 0xfc, 0x1d, 0x26, 0x35, 0x4a, 0x63, 0x42, 0x63, 0xc4, 0x02, 0x96, 0x04, - 0xed, 0xf5, 0x40, 0xfd, 0x32, 0x08, 0x15, 0xce, 0xf4, 0x44, 0xe2, 0x53, 0xca, 0xd5, 0xa7, 0x05, 0xa9, 0xa7, 0x05, - 0x73, 0xa0, 0x97, 0xbe, 0x95, 0x5f, 0xd9, 0xf8, 0x68, 0x77, 0xef, 0x9a, 0x0b, 0xeb, 0x18, 0x82, 0x61, 0x0b, 0xbf, - 0x39, 0x35, 0x05, 0x60, 0xc3, 0x63, 0x5d, 0x96, 0x6f, 0xd4, 0x44, 0x66, 0x71, 0x48, 0x22, 0x90, 0x6c, 0x37, 0x37, - 0xb7, 0x11, 0x6c, 0x7b, 0x0b, 0xb5, 0xa1, 0xfe, 0xf2, 0xb6, 0xfb, 0x3d, 0xc3, 0xcb, 0x3d, 0xb9, 0x77, 0xd3, 0x86, - 0xf2, 0x87, 0xfb, 0x57, 0xc9, 0xff, 0x55, 0x25, 0xf7, 0x5b, 0x65, 0xd6, 0x6d, 0xf1, 0x7e, 0xd7, 0x71, 0xcb, 0x31, - 0x1a, 0x04, 0xd6, 0x14, 0x18, 0x48, 0x4f, 0x1a, 0xd3, 0x44, 0x87, 0x54, 0x66, 0xcc, 0xe0, 0xd1, 0x05, 0x68, 0x0e, - 0xd3, 0x79, 0x1e, 0x03, 0x70, 0x80, 0x7f, 0xe4, 0x11, 0xea, 0x9f, 0xce, 0xf3, 0xe0, 0x2c, 0x18, 0x94, 0x83, 0x40, - 0x7f, 0xe2, 0x9a, 0x13, 0x2c, 0x40, 0xe7, 0x16, 0x33, 0x08, 0x36, 0x69, 0xcd, 0x1c, 0xe2, 0xc3, 0x64, 0x3a, 0x18, - 0xc4, 0x64, 0x03, 0x20, 0x7d, 0xf1, 0xc2, 0x3a, 0x07, 0x15, 0x7a, 0x41, 0xb6, 0xea, 0x2e, 0x9a, 0x15, 0x7b, 0xd5, - 0x4e, 0xf3, 0x7e, 0x3f, 0x9f, 0x97, 0x83, 0xa0, 0x51, 0x61, 0x61, 0xbc, 0xff, 0x68, 0xf3, 0x4b, 0xa3, 0x93, 0x26, - 0x18, 0xa6, 0xf6, 0x18, 0xd5, 0x2b, 0x9e, 0x66, 0xb4, 0x71, 0x3b, 0x56, 0xca, 0x17, 0x10, 0xc5, 0x03, 0x43, 0xd6, - 0xca, 0xbb, 0x73, 0xf0, 0xba, 0xdc, 0x78, 0x73, 0x44, 0x01, 0x76, 0x53, 0x18, 0x27, 0x35, 0x17, 0x5d, 0xd4, 0xc4, - 0x33, 0xd8, 0xe9, 0xea, 0xad, 0x44, 0xab, 0xf1, 0x5e, 0xbc, 0x6b, 0x36, 0xfe, 0x56, 0xee, 0xe9, 0x32, 0xf7, 0x2e, - 0x00, 0x71, 0x76, 0x2f, 0xae, 0xf6, 0xb0, 0xd4, 0xbd, 0x60, 0x60, 0x91, 0x43, 0xda, 0xd5, 0xea, 0xa1, 0x88, 0xd4, - 0x79, 0x0c, 0x06, 0x4c, 0xa6, 0x21, 0x35, 0x99, 0xf6, 0x0a, 0x05, 0x69, 0x63, 0xad, 0x05, 0xb4, 0xe1, 0xb0, 0xd8, - 0xb1, 0x1b, 0x76, 0xa7, 0x5b, 0x87, 0x42, 0x09, 0xa3, 0x57, 0xd7, 0xcd, 0x43, 0xad, 0xe1, 0x89, 0xa0, 0x07, 0xd5, - 0x68, 0x3f, 0x3d, 0x94, 0x27, 0xed, 0xb1, 0x00, 0x17, 0x3d, 0x7c, 0xf9, 0x52, 0xe0, 0x45, 0x7b, 0x07, 0x79, 0xce, - 0x7c, 0xaa, 0x7c, 0x10, 0x1b, 0x6e, 0x19, 0x3e, 0xb4, 0x8f, 0x6f, 0x05, 0x32, 0xa9, 0x3b, 0x9a, 0xda, 0xda, 0x1d, - 0x8d, 0x63, 0x02, 0xfd, 0xa6, 0x1c, 0xa5, 0x4c, 0x4c, 0x2d, 0x4b, 0x76, 0xd4, 0xcb, 0x95, 0x37, 0x54, 0xca, 0x8e, - 0x96, 0x6d, 0xce, 0x2f, 0x6d, 0x24, 0xf4, 0xfb, 0xda, 0x1d, 0x08, 0xdf, 0xa8, 0xf5, 0x86, 0xbc, 0x6c, 0x88, 0x58, - 0x0e, 0x31, 0x03, 0xc7, 0x0b, 0xa9, 0x5c, 0xbb, 0x8b, 0xa6, 0xaa, 0x6e, 0x67, 0x2b, 0x17, 0xb4, 0xc4, 0x5b, 0x29, - 0xb0, 0x8a, 0xd4, 0xe9, 0xf5, 0x54, 0xe2, 0x7d, 0x1f, 0xc5, 0xf6, 0x23, 0x60, 0x1b, 0x1b, 0x47, 0x63, 0xe3, 0x16, - 0xb1, 0xc1, 0x57, 0x51, 0x45, 0x0b, 0x0e, 0x10, 0xdc, 0x6d, 0x49, 0x2d, 0xcd, 0x1c, 0xe2, 0xbe, 0xe2, 0x01, 0xda, - 0x77, 0x71, 0xc4, 0xa9, 0x00, 0xdb, 0xba, 0xd6, 0x39, 0xab, 0xe5, 0x80, 0xcd, 0x44, 0xcf, 0x3f, 0xad, 0x1a, 0x89, - 0x18, 0x56, 0xd9, 0x48, 0x59, 0xa1, 0x3d, 0x28, 0x5d, 0xc2, 0xc5, 0x17, 0xe0, 0x65, 0xfb, 0x7e, 0x65, 0xf7, 0xd9, - 0x12, 0xfb, 0x87, 0x79, 0xd5, 0x04, 0x8f, 0xbc, 0xc6, 0xdb, 0x7b, 0x98, 0xf8, 0x52, 0x29, 0x84, 0x57, 0x29, 0x0d, - 0x25, 0x00, 0x83, 0x24, 0xa8, 0xe1, 0x4a, 0xdb, 0x66, 0x90, 0xca, 0x18, 0x76, 0xb7, 0x7a, 0xab, 0xff, 0xd3, 0x2a, - 0x5c, 0x54, 0xb2, 0x18, 0x93, 0x40, 0xe7, 0x54, 0xcb, 0x4d, 0x4c, 0xc1, 0xb3, 0x5d, 0x72, 0x04, 0x0a, 0x3b, 0x01, - 0xdc, 0x50, 0xc2, 0x7e, 0xc5, 0xdb, 0x50, 0xce, 0x5e, 0x59, 0xc9, 0x93, 0xdb, 0x97, 0x54, 0xd0, 0x84, 0x4c, 0x85, - 0xdd, 0xbf, 0xad, 0x0d, 0xfb, 0x22, 0x94, 0x23, 0x29, 0x70, 0x71, 0xd0, 0x39, 0x80, 0xfd, 0x41, 0x2e, 0x63, 0xf3, - 0x99, 0xf4, 0xfb, 0xea, 0xfd, 0xf3, 0x3c, 0x4b, 0x3e, 0xee, 0xbc, 0x37, 0x3c, 0xcd, 0x92, 0x01, 0x95, 0x88, 0xa9, - 0x75, 0x55, 0x0c, 0x97, 0xda, 0xc5, 0xb8, 0x41, 0x32, 0xe2, 0x7b, 0xa9, 0x43, 0x8c, 0x18, 0x5f, 0x64, 0x87, 0xa4, - 0xe4, 0x74, 0x59, 0x77, 0xf6, 0x5c, 0x8b, 0x66, 0xd0, 0x18, 0x6e, 0xc7, 0x7b, 0x49, 0xaf, 0x00, 0x15, 0x15, 0xba, - 0x67, 0x81, 0x6b, 0x78, 0x73, 0x49, 0x34, 0xb6, 0xf4, 0xb4, 0x25, 0x1a, 0xb8, 0x57, 0x26, 0x24, 0xd5, 0xc6, 0x01, - 0x16, 0xb1, 0xae, 0x3f, 0x86, 0x12, 0x80, 0x5a, 0x0d, 0xd2, 0x2b, 0x7d, 0x45, 0xa8, 0x4a, 0x42, 0x30, 0x3a, 0x91, - 0xf0, 0x32, 0xa0, 0x71, 0x66, 0x12, 0x2d, 0x6c, 0x70, 0x40, 0x5f, 0x54, 0x26, 0xd1, 0xd8, 0x90, 0x07, 0xb4, 0xb2, - 0x69, 0x00, 0x83, 0x0f, 0x92, 0x24, 0xfa, 0x7a, 0x69, 0x92, 0x40, 0x50, 0x82, 0xf2, 0x0d, 0xfa, 0x4b, 0xe9, 0xf9, - 0x58, 0xfe, 0xcb, 0x3b, 0x94, 0x7e, 0x08, 0x25, 0xc8, 0x14, 0x75, 0xc5, 0x34, 0x63, 0x47, 0x59, 0xb7, 0x31, 0x89, - 0xe7, 0x69, 0x77, 0x5b, 0x28, 0x97, 0x2e, 0xf0, 0x2b, 0xcb, 0x10, 0xc7, 0xfa, 0x79, 0xbc, 0x62, 0xc7, 0x21, 0xd7, - 0x78, 0xe9, 0xcf, 0xe3, 0x15, 0xce, 0x10, 0xad, 0x5a, 0x09, 0x44, 0xf9, 0xaf, 0xda, 0xc0, 0x21, 0xee, 0x13, 0x0c, - 0x72, 0x51, 0x79, 0x0f, 0x04, 0xf2, 0xb6, 0x82, 0x88, 0x34, 0xb3, 0xeb, 0x30, 0x22, 0xd5, 0x4e, 0x92, 0xf9, 0xf2, - 0x47, 0x99, 0x09, 0xef, 0x1b, 0x78, 0x6c, 0x36, 0xcb, 0xa6, 0x98, 0x2f, 0x54, 0x30, 0x07, 0xf7, 0x89, 0x8a, 0x4b, - 0x51, 0xf9, 0x4f, 0xd8, 0x05, 0x2f, 0xc6, 0x83, 0xd7, 0x6b, 0x04, 0xd8, 0xaf, 0xfc, 0x27, 0x6f, 0xcc, 0xde, 0x5a, - 0x37, 0xbe, 0xcc, 0x44, 0x7c, 0xe0, 0xa3, 0x5b, 0xca, 0x47, 0x77, 0x5e, 0xa6, 0x3f, 0x1b, 0x50, 0x22, 0xa3, 0xb2, - 0xe2, 0xab, 0x15, 0x4f, 0x67, 0xb7, 0x49, 0x94, 0x8d, 0x2a, 0x2e, 0x60, 0x7a, 0xc1, 0xf1, 0x2e, 0x59, 0x9f, 0x67, - 0xc9, 0x6b, 0x88, 0x3d, 0xb0, 0x92, 0x0a, 0x8b, 0x1f, 0x96, 0x99, 0x5a, 0xcc, 0x42, 0x56, 0x52, 0xf0, 0x60, 0x76, - 0x9d, 0x44, 0x6f, 0x97, 0x1e, 0x92, 0x9a, 0x99, 0xb2, 0x4d, 0xed, 0x08, 0xb5, 0xf1, 0x75, 0xa4, 0x1b, 0x6d, 0x01, - 0x00, 0xf7, 0x6c, 0x91, 0x46, 0x92, 0x89, 0xe1, 0xa4, 0x66, 0xdc, 0xa4, 0x17, 0x98, 0x1a, 0xd7, 0xac, 0xa2, 0x89, - 0xb3, 0x90, 0x01, 0xbd, 0x3f, 0xe0, 0xe5, 0xe0, 0x73, 0x06, 0xf7, 0x1f, 0xb4, 0x06, 0x2e, 0x0f, 0x8b, 0x7e, 0x5f, - 0x1e, 0x16, 0xdb, 0x6d, 0x79, 0x14, 0xf7, 0xfb, 0xf2, 0x28, 0x36, 0xfc, 0x83, 0x52, 0x6c, 0x1b, 0x73, 0x83, 0x84, - 0xe6, 0x12, 0xa2, 0x16, 0x8d, 0xe0, 0x0f, 0xcd, 0x72, 0x2e, 0xa2, 0xfc, 0x30, 0xe9, 0xf7, 0x7b, 0xcb, 0x99, 0x18, - 0xe4, 0xc3, 0x24, 0xca, 0x87, 0x89, 0xe7, 0x84, 0xf8, 0x9b, 0xe7, 0x84, 0xa8, 0x68, 0xe0, 0x0a, 0xce, 0x0c, 0x40, - 0x14, 0xf0, 0xe9, 0x1f, 0xd5, 0xb5, 0x14, 0xba, 0x96, 0x58, 0xd5, 0x92, 0xe8, 0x0a, 0x6a, 0x76, 0x5d, 0x84, 0x25, - 0x96, 0x42, 0x97, 0xec, 0xcf, 0x25, 0xf0, 0x44, 0x39, 0xaf, 0x36, 0xc0, 0xc0, 0x46, 0x78, 0xe7, 0x30, 0xe1, 0x24, - 0xd6, 0x35, 0xa0, 0x9d, 0x6e, 0x6a, 0x7a, 0x41, 0x57, 0xf4, 0x12, 0xf9, 0xd9, 0x0b, 0x30, 0x58, 0x3a, 0x64, 0xf9, - 0x74, 0x30, 0xb8, 0x20, 0x2b, 0x56, 0xce, 0xc3, 0x78, 0x10, 0xae, 0x67, 0xf9, 0xf0, 0x22, 0xba, 0x20, 0xe4, 0xab, - 0x62, 0x41, 0x7b, 0xab, 0x51, 0xf9, 0x31, 0x83, 0xe0, 0x7e, 0xe9, 0x2c, 0xcc, 0x4c, 0x9c, 0x8f, 0xd5, 0xe8, 0x96, - 0xae, 0x20, 0x7e, 0x0d, 0xdc, 0x48, 0x48, 0x04, 0x1d, 0xb9, 0xa4, 0x2b, 0xba, 0xa6, 0xd2, 0xcc, 0x30, 0x86, 0xe8, - 0xb6, 0xc7, 0x49, 0x02, 0x8e, 0xc9, 0xae, 0xf8, 0x68, 0xac, 0x0a, 0xef, 0xfa, 0x8e, 0xd0, 0x5e, 0x2f, 0x71, 0x83, - 0xf4, 0x5d, 0x7b, 0x90, 0x80, 0x11, 0x19, 0xa9, 0x81, 0x32, 0x23, 0x23, 0xa9, 0x99, 0x54, 0x1c, 0x92, 0xd8, 0x1f, - 0x12, 0x35, 0x0e, 0x89, 0x3f, 0x0e, 0xb9, 0x1e, 0x07, 0xe4, 0xee, 0x97, 0x6c, 0x4c, 0x53, 0x36, 0xa6, 0x6b, 0x35, - 0x2a, 0xf4, 0x8a, 0x9e, 0x6b, 0xea, 0x78, 0xc6, 0xde, 0xc0, 0x81, 0x3d, 0x08, 0xf3, 0x59, 0x3c, 0x7c, 0x13, 0xbd, - 0x21, 0xe4, 0x2b, 0x49, 0xaf, 0xd5, 0xa5, 0x0c, 0xc2, 0x20, 0x5e, 0x81, 0x73, 0xa9, 0x0b, 0x75, 0x72, 0x65, 0x76, - 0x1c, 0x3e, 0x5d, 0x36, 0x9e, 0xce, 0x21, 0xa2, 0x0f, 0x5a, 0xa9, 0xf4, 0xfb, 0xe1, 0x05, 0x2b, 0xe7, 0x67, 0xe1, - 0x98, 0x00, 0x0e, 0x8f, 0x1e, 0xce, 0x8b, 0xd1, 0x2d, 0xbd, 0x18, 0xdd, 0x11, 0xb0, 0xf0, 0x1a, 0x4f, 0xd7, 0x87, - 0x2c, 0x9e, 0x0e, 0x06, 0x6b, 0xa4, 0xea, 0x2a, 0xf7, 0x9a, 0x2c, 0xe8, 0x05, 0x4e, 0x04, 0x01, 0x86, 0x3e, 0x13, - 0x6b, 0x43, 0xc3, 0xdf, 0x30, 0xf8, 0xf8, 0x8e, 0x5d, 0x8c, 0xee, 0xe8, 0x2d, 0x7b, 0xb3, 0x1d, 0x4f, 0x81, 0x99, - 0x5a, 0xcd, 0xc2, 0xbb, 0xc3, 0xcb, 0xd9, 0x25, 0xbb, 0x8b, 0xee, 0x8e, 0xa0, 0xa1, 0x57, 0xec, 0x0e, 0x01, 0x97, - 0xd2, 0xc7, 0xcb, 0xc1, 0x1b, 0xb2, 0x3f, 0x18, 0xa4, 0x24, 0x0a, 0xaf, 0x43, 0xaf, 0x95, 0x6f, 0xe8, 0x1d, 0xa1, - 0x2b, 0x76, 0x8b, 0xa3, 0x71, 0xc9, 0xf0, 0x83, 0x73, 0x76, 0x57, 0x5f, 0x87, 0xde, 0x6e, 0x4e, 0x44, 0x27, 0x88, - 0x11, 0xfa, 0x1a, 0x38, 0x9a, 0xe5, 0xc2, 0x4c, 0xc0, 0x93, 0xb9, 0xc8, 0x68, 0x51, 0x68, 0x06, 0xe2, 0xac, 0x04, - 0xc4, 0x92, 0xa8, 0xfb, 0xcd, 0x46, 0x67, 0xb0, 0x9c, 0xfb, 0xfd, 0x5e, 0x65, 0xe8, 0x01, 0x22, 0x67, 0x76, 0xd2, - 0x83, 0x9e, 0x4f, 0x0f, 0xf0, 0x13, 0xbd, 0x6a, 0x10, 0x27, 0xf3, 0xbb, 0x65, 0xf4, 0x9b, 0x47, 0x1f, 0x7e, 0xe8, - 0xa6, 0x3c, 0x22, 0xff, 0xf7, 0x29, 0x4f, 0x99, 0x47, 0x6f, 0x2a, 0x0f, 0x04, 0xcf, 0x5b, 0x93, 0x4a, 0x23, 0x51, - 0x8d, 0xce, 0x56, 0x31, 0x68, 0x23, 0x51, 0xdb, 0xa0, 0x9f, 0xd0, 0xc2, 0x0a, 0x22, 0xe4, 0x1c, 0xbc, 0x00, 0x83, - 0x54, 0x08, 0x95, 0xa3, 0x16, 0x25, 0x1a, 0x82, 0xe4, 0xb2, 0xe4, 0x2a, 0x7c, 0x0e, 0xa1, 0xea, 0xf4, 0x71, 0x26, - 0xc2, 0x86, 0x1e, 0x87, 0x3e, 0x00, 0xfc, 0xaf, 0x3b, 0xe4, 0xa2, 0xe4, 0x97, 0x78, 0x36, 0xb7, 0x09, 0x46, 0xc1, - 0x12, 0xd1, 0x0c, 0x6d, 0x83, 0xd8, 0x8f, 0x25, 0xc1, 0x7a, 0x24, 0x8d, 0x47, 0xa5, 0x39, 0x22, 0xfc, 0x28, 0x3e, - 0x8a, 0x9e, 0xc6, 0x86, 0x44, 0x72, 0x24, 0x91, 0x7c, 0x00, 0x84, 0x93, 0xa0, 0xbf, 0xb8, 0x6b, 0xb2, 0x6b, 0x21, - 0x31, 0xe8, 0x4f, 0x4b, 0xa6, 0x65, 0xf7, 0xaa, 0xc7, 0xbe, 0x22, 0xc8, 0x1d, 0xd3, 0x7f, 0x79, 0x7d, 0xf8, 0xe7, - 0x12, 0x67, 0xd0, 0x7a, 0xbe, 0xa8, 0xce, 0xcc, 0xbc, 0xc1, 0x8d, 0xbc, 0x2e, 0x6b, 0xd7, 0xe5, 0x0b, 0xbe, 0xc7, - 0x6f, 0x2b, 0x2e, 0xd2, 0x72, 0xef, 0x97, 0xaa, 0x8d, 0xe7, 0x54, 0xae, 0x57, 0x2e, 0xce, 0x8a, 0x32, 0x4e, 0xf5, - 0xa4, 0x2e, 0xc6, 0x1a, 0xb6, 0xe1, 0xf7, 0x88, 0xba, 0x92, 0x96, 0xa3, 0xa7, 0x94, 0xab, 0x66, 0xca, 0xc5, 0x3a, - 0xcf, 0x7f, 0xde, 0x49, 0xc5, 0x29, 0x6e, 0xa6, 0x20, 0x55, 0x6a, 0xb9, 0x80, 0xea, 0x39, 0x6a, 0xb9, 0x5b, 0x9a, - 0x1d, 0xe0, 0xdc, 0x36, 0xd5, 0xc7, 0xca, 0xec, 0xc2, 0x4b, 0x6e, 0xdc, 0x9f, 0x4c, 0x19, 0x16, 0x8c, 0x42, 0x9b, - 0x55, 0x57, 0xda, 0xbe, 0xd0, 0x3a, 0x0d, 0xc3, 0x95, 0x1f, 0x2f, 0x20, 0x5d, 0xc0, 0x38, 0x5e, 0x94, 0x4c, 0x8c, - 0xdb, 0xa3, 0xb7, 0x82, 0xf8, 0x92, 0xad, 0x40, 0xc0, 0x5c, 0xc3, 0xdb, 0x75, 0x1d, 0x6d, 0xf7, 0xc4, 0x29, 0xa3, - 0x72, 0x15, 0x8b, 0xef, 0xe3, 0x95, 0x81, 0x4c, 0x56, 0xc7, 0x63, 0x63, 0x4c, 0xa7, 0x3f, 0x25, 0xa1, 0x5f, 0x08, - 0x05, 0x9f, 0xf5, 0xd2, 0xca, 0x93, 0xdb, 0xc3, 0x32, 0xae, 0xd1, 0x2b, 0x71, 0xa5, 0xfb, 0x66, 0xa4, 0x90, 0x7a, - 0xe4, 0xab, 0xa6, 0x80, 0xde, 0x8c, 0x7d, 0x33, 0x15, 0xe6, 0xed, 0x9e, 0x31, 0x57, 0x08, 0x56, 0xaa, 0xec, 0xf6, - 0x9d, 0x1a, 0x53, 0x31, 0x83, 0x29, 0xb6, 0x9d, 0xc5, 0xa4, 0x5b, 0xf9, 0xa7, 0x9d, 0xfb, 0x65, 0xde, 0xe1, 0xae, - 0xa8, 0xdf, 0x02, 0x17, 0x9a, 0x15, 0x65, 0xd5, 0x96, 0x0d, 0xdb, 0xc6, 0x1b, 0x59, 0x28, 0x36, 0xc0, 0xb2, 0xe7, - 0xbe, 0x85, 0x07, 0x88, 0x9b, 0x70, 0xcf, 0x2e, 0x6a, 0xb8, 0x31, 0x7c, 0x59, 0x49, 0xbe, 0x2b, 0x8d, 0xb9, 0xf4, - 0xa9, 0xd2, 0xc4, 0x70, 0xb2, 0x18, 0x71, 0x91, 0x2e, 0xea, 0xcc, 0xae, 0x85, 0xcf, 0x78, 0x19, 0xce, 0xf9, 0xc2, - 0xe8, 0xa6, 0x74, 0xe9, 0x05, 0x8b, 0x75, 0xa7, 0x37, 0x2b, 0x8d, 0x95, 0x12, 0x71, 0x6b, 0x96, 0x09, 0x94, 0xa5, - 0xac, 0x95, 0xf0, 0xa6, 0x68, 0xd9, 0x4a, 0x1a, 0x79, 0xcf, 0x1c, 0xdc, 0xc7, 0x7e, 0x40, 0x4c, 0x64, 0x13, 0x98, - 0x14, 0x0d, 0x1d, 0xd0, 0xae, 0xba, 0xf0, 0xcd, 0xa8, 0x07, 0x83, 0xdc, 0x92, 0x44, 0xac, 0x20, 0xc5, 0x0a, 0xd6, - 0x35, 0x2b, 0xe6, 0xf9, 0x82, 0x5e, 0x30, 0x39, 0x4f, 0x17, 0x74, 0xc5, 0xe4, 0x7c, 0x8d, 0x37, 0xa1, 0x0b, 0x38, - 0x21, 0xc9, 0x26, 0x56, 0x0a, 0xd8, 0x0b, 0xbc, 0xbc, 0xe1, 0x99, 0xaa, 0x69, 0xd9, 0xa5, 0xe2, 0x00, 0xe3, 0xf3, - 0x32, 0x0c, 0xcb, 0xe1, 0x05, 0x58, 0x4b, 0xec, 0x87, 0xab, 0x39, 0x5f, 0xa8, 0xdf, 0x10, 0x70, 0x3e, 0x09, 0x15, - 0xbb, 0x60, 0xf7, 0x02, 0x99, 0x5e, 0xcd, 0xf9, 0x42, 0x8d, 0x84, 0x2e, 0xf8, 0xca, 0x1a, 0x9b, 0xc4, 0x9e, 0xa0, - 0x65, 0x16, 0xcf, 0xc7, 0x8b, 0x28, 0xae, 0x61, 0x19, 0x9e, 0xaa, 0x99, 0x69, 0xc9, 0x7f, 0x12, 0xb5, 0xa1, 0x89, - 0xbe, 0xc1, 0x2a, 0xf2, 0x87, 0xc7, 0x47, 0x97, 0x40, 0xc6, 0xce, 0xae, 0x64, 0xe6, 0x43, 0xdf, 0x47, 0x06, 0xf7, - 0xdc, 0x94, 0x33, 0xae, 0x82, 0x44, 0x19, 0xb8, 0x7b, 0x35, 0x4b, 0xc6, 0x5a, 0x84, 0xef, 0x1e, 0x15, 0x45, 0x9f, - 0x49, 0xd3, 0x80, 0xee, 0x23, 0xc1, 0x1c, 0xe8, 0xbd, 0x42, 0x87, 0xcb, 0x6a, 0x9b, 0x09, 0xf8, 0x8b, 0x04, 0xf9, - 0xad, 0xd0, 0xab, 0x1a, 0x83, 0x2a, 0xda, 0x45, 0x2c, 0xfd, 0xfb, 0x88, 0x1f, 0x65, 0xf3, 0x2f, 0x73, 0x8f, 0x57, - 0x12, 0x06, 0x3f, 0xa4, 0x66, 0x93, 0xcc, 0xdb, 0x2b, 0xf6, 0x3d, 0x74, 0xd4, 0xa3, 0xd6, 0x78, 0x5f, 0xbd, 0xe0, - 0x14, 0x62, 0x94, 0x50, 0x74, 0x12, 0x0c, 0xe0, 0x76, 0x09, 0x29, 0xee, 0x06, 0xbb, 0x69, 0x5e, 0xf3, 0xa2, 0xe0, - 0x7c, 0x5d, 0x55, 0x81, 0x1f, 0xd0, 0x70, 0xbe, 0xd8, 0x0d, 0x61, 0x38, 0xa6, 0xad, 0x6b, 0x18, 0x84, 0x19, 0xc3, - 0x48, 0x08, 0x5e, 0xff, 0xa2, 0x27, 0x34, 0x89, 0x57, 0xdf, 0xf1, 0x4f, 0x19, 0x2f, 0x14, 0x91, 0x06, 0x11, 0x52, - 0x37, 0xf1, 0x8d, 0x4c, 0x93, 0x02, 0x0a, 0x01, 0x46, 0x01, 0x95, 0xd8, 0xd0, 0x54, 0xfc, 0xad, 0x16, 0x1f, 0xfc, - 0xd4, 0x74, 0x3c, 0x1a, 0xd7, 0xad, 0xce, 0xa8, 0xa0, 0x33, 0xd0, 0xa3, 0x56, 0xd4, 0xd3, 0xa0, 0x95, 0x60, 0x1a, - 0x69, 0xde, 0xba, 0x87, 0xc0, 0x2b, 0xd3, 0xe2, 0x9d, 0x07, 0x74, 0x73, 0xe6, 0x83, 0x27, 0x8f, 0xe9, 0x99, 0x43, - 0x4f, 0xae, 0xd8, 0x51, 0xd5, 0x43, 0xed, 0xbd, 0x19, 0xa1, 0xa0, 0xdf, 0xc7, 0x14, 0xe8, 0x46, 0x50, 0x7b, 0x57, - 0xf7, 0x1f, 0xcb, 0x5d, 0x0e, 0xdf, 0x71, 0x96, 0x1b, 0xc0, 0x52, 0x91, 0xb5, 0x02, 0x8f, 0x02, 0xd4, 0xa5, 0x32, - 0x84, 0x2d, 0xe6, 0x70, 0xa8, 0xec, 0x56, 0xad, 0x86, 0x92, 0x1c, 0x96, 0x23, 0x70, 0x08, 0x5d, 0x97, 0x83, 0x72, - 0xb4, 0xcc, 0xaa, 0xf7, 0xf8, 0x5b, 0xb3, 0x0e, 0x49, 0x76, 0x1f, 0xeb, 0xc0, 0x2d, 0xeb, 0x30, 0xfd, 0x68, 0x90, - 0x02, 0xd0, 0x64, 0x23, 0x70, 0x09, 0xc0, 0x7b, 0xfb, 0x8f, 0x08, 0xb5, 0x32, 0xbd, 0x97, 0xb1, 0x50, 0xdf, 0x37, - 0x92, 0xa0, 0x84, 0x66, 0x42, 0xe5, 0x58, 0x0a, 0xde, 0x79, 0xa4, 0x73, 0x52, 0x67, 0xe2, 0x3d, 0x88, 0xd3, 0xc2, - 0x07, 0xf6, 0x16, 0x04, 0xe7, 0x2c, 0xe8, 0x1d, 0xde, 0x66, 0xb5, 0xd4, 0x46, 0x0f, 0x14, 0xc0, 0xef, 0x06, 0x77, - 0x08, 0xf2, 0xd5, 0x18, 0xae, 0x95, 0xbc, 0x09, 0xf9, 0xb0, 0xa0, 0x07, 0x64, 0x60, 0x9f, 0xc5, 0x30, 0xa6, 0x07, - 0xe4, 0xd0, 0x3e, 0x4b, 0x37, 0x80, 0x03, 0xa9, 0x47, 0x95, 0x1e, 0x40, 0x83, 0x7e, 0xb7, 0x2d, 0xb2, 0x24, 0xeb, - 0xc7, 0xd2, 0x28, 0x62, 0xa0, 0x4a, 0x10, 0x51, 0x8b, 0x7f, 0x3e, 0x98, 0xeb, 0x0e, 0x73, 0x81, 0x30, 0x07, 0x03, - 0x0e, 0xe2, 0x36, 0x08, 0xcd, 0x01, 0xb3, 0xb9, 0x8d, 0x04, 0xbd, 0xb3, 0x86, 0x99, 0x1d, 0xfd, 0xe1, 0x56, 0x82, - 0x6f, 0xb2, 0xd6, 0xa8, 0xf3, 0xe2, 0x10, 0x08, 0x82, 0x37, 0x85, 0xaa, 0xf6, 0xaa, 0x07, 0x36, 0xde, 0xaa, 0x1f, - 0xdb, 0xed, 0x78, 0x2a, 0xdc, 0xb5, 0x5f, 0x50, 0x38, 0xf9, 0x94, 0xfc, 0xeb, 0xbd, 0xc9, 0xe0, 0xc0, 0xc8, 0xf0, - 0xa5, 0xb7, 0x7f, 0xe1, 0x6b, 0x2d, 0xdd, 0x13, 0x83, 0x92, 0x3c, 0x3e, 0x50, 0xf4, 0xef, 0x5e, 0x59, 0xf9, 0xd4, - 0x4e, 0xff, 0x76, 0x6b, 0xd6, 0xe7, 0xe1, 0x68, 0xb2, 0xdd, 0xf6, 0xb4, 0x81, 0x2b, 0xd5, 0x2a, 0x04, 0xec, 0x42, - 0x49, 0xf6, 0x0f, 0x20, 0x2a, 0x42, 0x33, 0xee, 0x66, 0xd9, 0x90, 0xc8, 0xf8, 0x71, 0x3a, 0xcb, 0x86, 0x60, 0x87, - 0x7b, 0x51, 0x89, 0xcb, 0x51, 0x6b, 0x83, 0xd3, 0xb3, 0x24, 0x84, 0x50, 0x0e, 0x58, 0xd9, 0xad, 0xfa, 0x73, 0xa7, - 0xcc, 0x84, 0xd4, 0x64, 0x75, 0x3b, 0xa5, 0x7b, 0x98, 0xe6, 0x7b, 0x66, 0x04, 0x07, 0xdc, 0xdb, 0x5f, 0xf5, 0xc7, - 0x30, 0xc9, 0x34, 0x39, 0x45, 0xf2, 0x8b, 0xf4, 0x14, 0x92, 0x76, 0xe8, 0xa9, 0x22, 0x80, 0x13, 0x6a, 0x3f, 0x86, - 0xdf, 0x30, 0xee, 0xdf, 0x35, 0x5f, 0xbb, 0xa9, 0x88, 0x9e, 0x52, 0x2c, 0x53, 0x93, 0xd3, 0x24, 0x2b, 0x12, 0x88, - 0xda, 0xa8, 0x9a, 0x11, 0x3d, 0x71, 0x31, 0x1f, 0x15, 0xe1, 0xf3, 0x6a, 0xfd, 0x9f, 0x21, 0x7c, 0x46, 0xe1, 0x06, - 0x70, 0x79, 0xc5, 0xe5, 0x79, 0xf8, 0xec, 0x29, 0xdd, 0x9b, 0x7c, 0x73, 0x40, 0xf7, 0x0e, 0x9e, 0x3c, 0x23, 0x00, - 0x8b, 0x76, 0x79, 0x1e, 0x1e, 0x3c, 0x7b, 0x46, 0xf7, 0xbe, 0xfd, 0x96, 0xee, 0x4d, 0x9e, 0x1c, 0x34, 0xd2, 0x26, - 0xcf, 0xbe, 0xa5, 0x7b, 0xdf, 0x3c, 0x6d, 0xa4, 0x1d, 0x8c, 0x9f, 0xd1, 0xbd, 0xbf, 0x7f, 0x63, 0xd2, 0xfe, 0x06, - 0xd9, 0xbe, 0x3d, 0xc0, 0xff, 0x4c, 0xda, 0xe4, 0xd9, 0x13, 0xba, 0x37, 0x19, 0x43, 0x25, 0xcf, 0x5c, 0x25, 0xe3, - 0x09, 0x7c, 0xfc, 0x04, 0xfe, 0xfb, 0x1b, 0x09, 0x16, 0xb4, 0x92, 0x2c, 0x17, 0xa8, 0x3f, 0x43, 0x11, 0x27, 0xaa, - 0x26, 0x12, 0x1e, 0x62, 0x66, 0xf5, 0x4d, 0x1c, 0x06, 0xc4, 0xa5, 0x43, 0x41, 0x74, 0x6f, 0x3c, 0x7a, 0x46, 0x02, - 0x1f, 0x9e, 0xee, 0xc6, 0x07, 0x19, 0xcb, 0xc5, 0x3c, 0xfb, 0x2a, 0x37, 0xb1, 0x15, 0x3c, 0x00, 0xab, 0x8f, 0x7e, - 0xae, 0x4a, 0xce, 0xb3, 0xaf, 0x2a, 0xb9, 0x9b, 0xeb, 0xf7, 0x16, 0xa0, 0xbc, 0xbf, 0x6a, 0xd9, 0x4d, 0xa1, 0x42, - 0xa7, 0xb5, 0x46, 0x9f, 0x7d, 0xc4, 0xf4, 0xc1, 0xc0, 0xbb, 0x61, 0xff, 0xb4, 0x53, 0x4e, 0xeb, 0x1b, 0x8d, 0x42, - 0x8d, 0xca, 0x43, 0xc2, 0x8e, 0xa0, 0xe8, 0xc1, 0x00, 0x78, 0x02, 0x0f, 0xf7, 0xed, 0xdf, 0x2c, 0xe3, 0x63, 0x47, - 0x19, 0xbf, 0xa0, 0x0c, 0x01, 0x8d, 0x7a, 0x98, 0xdd, 0xf4, 0xb0, 0xd1, 0xad, 0x5e, 0xb2, 0x54, 0x27, 0x53, 0xd3, - 0x33, 0xd8, 0xd7, 0xba, 0x96, 0x7b, 0x46, 0x14, 0x2d, 0x2f, 0xf6, 0x52, 0x3e, 0xab, 0xd8, 0x4f, 0x4b, 0x54, 0x6f, - 0x45, 0x8d, 0x37, 0x32, 0x9b, 0x55, 0xec, 0x7b, 0xf3, 0x06, 0xb8, 0x19, 0xf6, 0xbb, 0x7a, 0xf2, 0x03, 0x67, 0x70, - 0x69, 0xdb, 0xa3, 0x4c, 0x8c, 0x00, 0x2b, 0x20, 0x03, 0x07, 0x1e, 0x00, 0x1d, 0xf4, 0x47, 0x7b, 0xbb, 0x55, 0x29, - 0xcd, 0x3e, 0x5b, 0x18, 0x40, 0xc3, 0xbc, 0x4d, 0x5c, 0xd9, 0xff, 0x6a, 0xc8, 0x4b, 0x50, 0xb8, 0xd5, 0x2c, 0x6f, - 0xa7, 0x30, 0x84, 0x10, 0xfc, 0x71, 0xc9, 0x00, 0x70, 0x20, 0xc0, 0x60, 0xac, 0x65, 0x40, 0xcd, 0x96, 0x8f, 0x36, - 0x5c, 0xa9, 0x27, 0x81, 0x33, 0xb8, 0x90, 0x45, 0xc2, 0x4f, 0xb4, 0xd8, 0x1f, 0xad, 0x1f, 0x7d, 0xdf, 0x1e, 0x0f, - 0xd6, 0xbe, 0xc7, 0x47, 0xfa, 0xb3, 0xc6, 0x75, 0x60, 0xd3, 0xf2, 0x8d, 0x17, 0xb5, 0x95, 0x78, 0x94, 0xc0, 0x1b, - 0x98, 0x88, 0x14, 0x06, 0xa9, 0x16, 0x38, 0x06, 0xe5, 0x8d, 0x85, 0x58, 0xaa, 0xae, 0x6e, 0xb0, 0x05, 0x91, 0x21, - 0x78, 0xb8, 0xfd, 0x6b, 0xa9, 0x02, 0x47, 0xf5, 0xfb, 0x5c, 0xfa, 0x6e, 0x4f, 0xc6, 0x8e, 0x1c, 0xa7, 0x7e, 0x2a, - 0x1c, 0xfc, 0x37, 0xa9, 0x6b, 0x63, 0xb9, 0x92, 0x32, 0xcb, 0xb2, 0xb0, 0xa3, 0x50, 0xcb, 0x3d, 0x2a, 0x0f, 0x92, - 0x2f, 0xe4, 0x10, 0xc9, 0x02, 0xa3, 0x50, 0x90, 0xe1, 0x84, 0x8a, 0xd1, 0x5a, 0x94, 0xcb, 0xec, 0xa2, 0x0a, 0x37, - 0x4a, 0xa1, 0xcc, 0x29, 0xfa, 0x76, 0x83, 0x03, 0x09, 0x89, 0xb2, 0xf2, 0x6d, 0xfc, 0x36, 0x44, 0xb0, 0x3a, 0xae, - 0x6d, 0xa1, 0xb8, 0xb7, 0x3f, 0x79, 0xda, 0xc5, 0x1f, 0x19, 0x17, 0x50, 0x17, 0x8b, 0x69, 0x38, 0xb1, 0xb1, 0x6f, - 0xdc, 0x17, 0x56, 0xd3, 0x03, 0x50, 0xdf, 0xa5, 0x12, 0x23, 0xa8, 0xaf, 0x8c, 0x7d, 0x6c, 0x8f, 0x31, 0x39, 0x83, - 0x58, 0xc3, 0x2a, 0x67, 0xa6, 0xfa, 0x46, 0xd8, 0x11, 0x00, 0x37, 0x42, 0x6b, 0x14, 0x04, 0x1e, 0xaf, 0x42, 0x3c, - 0x2f, 0x55, 0xf8, 0xd6, 0x8c, 0xd0, 0x31, 0x78, 0x53, 0xd9, 0x46, 0x66, 0xd2, 0x17, 0x0c, 0x9a, 0x63, 0x5b, 0x47, - 0x61, 0xb5, 0x95, 0x65, 0x47, 0x00, 0x37, 0x90, 0x1d, 0x9a, 0x8b, 0xe7, 0xac, 0x9a, 0x67, 0x8b, 0xc8, 0x04, 0x05, - 0x5c, 0x0a, 0xcb, 0xa0, 0x7d, 0xba, 0x47, 0xb6, 0xe3, 0x10, 0xba, 0xe1, 0x3e, 0x82, 0xf1, 0xb4, 0x9b, 0x82, 0x15, - 0x44, 0x23, 0xc4, 0xc3, 0x8c, 0x59, 0x7c, 0xaf, 0x34, 0xe5, 0xa9, 0x6a, 0x09, 0x04, 0x8e, 0x42, 0xa8, 0x8b, 0x5d, - 0xa3, 0x04, 0x97, 0xa9, 0x11, 0xcc, 0x60, 0xc7, 0x8e, 0xd4, 0x76, 0xc9, 0x39, 0x1d, 0xaa, 0x29, 0x2d, 0xf5, 0x94, - 0x6a, 0x5f, 0x43, 0x31, 0x2f, 0xd1, 0x43, 0x0f, 0x5c, 0x0f, 0xb4, 0x43, 0x5e, 0x49, 0x27, 0x26, 0x82, 0x4e, 0xab, - 0x4d, 0xd8, 0xb9, 0x91, 0x6e, 0x59, 0x8d, 0xbc, 0x63, 0x68, 0x76, 0xc4, 0x4b, 0x3f, 0x50, 0x17, 0x40, 0x84, 0xdc, - 0xdb, 0x22, 0x73, 0x44, 0xb3, 0xac, 0x7c, 0x05, 0x65, 0x71, 0xc4, 0xd6, 0x15, 0x70, 0x2d, 0x05, 0x93, 0x4b, 0x1e, - 0xf1, 0x14, 0x11, 0x01, 0x8f, 0x95, 0x76, 0x7d, 0xa7, 0x25, 0x84, 0x66, 0x29, 0x10, 0x37, 0x17, 0xc5, 0xb9, 0xb6, - 0x81, 0x2c, 0x80, 0xbe, 0xfd, 0x9c, 0x5d, 0x79, 0xe1, 0x60, 0x37, 0x57, 0x99, 0x78, 0xc1, 0x2f, 0x32, 0xc1, 0x53, - 0x04, 0xbb, 0xba, 0x35, 0x0f, 0xdc, 0xb1, 0x6d, 0x60, 0xf9, 0xf6, 0x1d, 0x2c, 0x98, 0x32, 0xd4, 0x4a, 0x89, 0x4c, - 0x44, 0x02, 0x32, 0xfb, 0xcc, 0xdd, 0x9b, 0x4c, 0xbc, 0x89, 0x6f, 0xc1, 0x9b, 0xa2, 0xc1, 0x4f, 0x8f, 0xce, 0xf1, - 0x4b, 0x44, 0x12, 0x85, 0x18, 0xb6, 0x18, 0x11, 0x0b, 0x91, 0x63, 0xc7, 0x84, 0x72, 0x25, 0x68, 0x6d, 0x0d, 0x81, - 0x17, 0x7f, 0x5a, 0x75, 0xef, 0x2a, 0x13, 0xc6, 0x3e, 0xe3, 0x2a, 0xbe, 0x65, 0xa5, 0x02, 0xb3, 0xc0, 0x38, 0xf7, - 0x6d, 0x29, 0xc9, 0x55, 0x26, 0x8c, 0x80, 0xe4, 0x2a, 0xbe, 0xa5, 0x4d, 0x19, 0x87, 0xb6, 0xa2, 0xf3, 0xe2, 0xfc, - 0xee, 0x0e, 0xbf, 0xc4, 0x50, 0x2b, 0xe3, 0x7e, 0x1f, 0x24, 0x66, 0xd2, 0x36, 0x65, 0x26, 0x23, 0xa9, 0xd1, 0x42, - 0x2a, 0xca, 0x07, 0x13, 0xb2, 0xbb, 0x52, 0x2d, 0x23, 0x6a, 0xbf, 0x0a, 0xc5, 0x6c, 0x1c, 0x4d, 0x08, 0x9d, 0x74, - 0xac, 0x77, 0xd3, 0x5a, 0xc8, 0x34, 0x7a, 0x16, 0x79, 0x3e, 0x9d, 0x05, 0xab, 0xa6, 0xc5, 0x21, 0xe3, 0xd3, 0x62, - 0x30, 0x20, 0xda, 0xa5, 0x70, 0x83, 0xf5, 0x80, 0x29, 0x8d, 0x8b, 0xb7, 0x66, 0x5a, 0xfd, 0x4a, 0xaa, 0x90, 0xf4, - 0x9e, 0x01, 0x49, 0x26, 0x5d, 0xb0, 0x5b, 0x90, 0x28, 0x7a, 0xfe, 0x77, 0x6a, 0x0b, 0xee, 0x7a, 0x30, 0x36, 0xa3, - 0xfb, 0x7a, 0xc6, 0x7f, 0xa8, 0x6d, 0x41, 0xd4, 0xa7, 0x92, 0xf5, 0x3a, 0x12, 0x55, 0xc8, 0x45, 0xf8, 0xd9, 0xd1, - 0x10, 0x43, 0x54, 0x7b, 0x2c, 0x10, 0xeb, 0xab, 0x73, 0x5e, 0xe0, 0xf4, 0x33, 0x77, 0xb9, 0x82, 0x6d, 0x41, 0x2b, - 0x43, 0xa3, 0xde, 0xc6, 0x6f, 0x23, 0x7b, 0x59, 0xd0, 0x45, 0xbe, 0x40, 0x21, 0x6b, 0x1e, 0x86, 0xd5, 0xb0, 0x3d, - 0x88, 0x64, 0xbf, 0x3d, 0x09, 0x8d, 0xc6, 0xc0, 0x02, 0xd9, 0xa1, 0x11, 0xb8, 0x08, 0xad, 0xfc, 0xed, 0x10, 0x5c, - 0xb8, 0x2c, 0x22, 0xcb, 0x50, 0xc7, 0x6f, 0x6a, 0x37, 0x41, 0xf5, 0x0a, 0x9d, 0xa6, 0xb0, 0x2a, 0x65, 0x92, 0x0f, - 0xbf, 0x5e, 0xc9, 0x02, 0x33, 0x79, 0x5d, 0xf6, 0xe8, 0x6b, 0xbb, 0xbd, 0x03, 0x53, 0xb0, 0xee, 0x93, 0xf7, 0xf5, - 0xe3, 0xce, 0x9e, 0x80, 0x51, 0xac, 0xca, 0xd1, 0x14, 0x52, 0x6a, 0x1f, 0x94, 0xfa, 0x63, 0xb8, 0x14, 0x9a, 0x63, - 0xb7, 0x80, 0x49, 0xc0, 0x3e, 0x43, 0xaa, 0xc7, 0xb4, 0x63, 0x9f, 0xa3, 0x0d, 0x2c, 0x09, 0x38, 0xfc, 0xa3, 0x4c, - 0xd6, 0xfe, 0xd5, 0x5d, 0xa4, 0xcd, 0x90, 0x2d, 0xf3, 0x05, 0xf0, 0xf9, 0xb0, 0x6b, 0xa3, 0x12, 0x65, 0x13, 0x91, - 0xa4, 0xb0, 0xe5, 0x31, 0x48, 0x7b, 0x14, 0xd3, 0x55, 0xc1, 0x93, 0x0c, 0xa5, 0x14, 0x89, 0xf6, 0x09, 0xce, 0xe1, - 0x0d, 0xee, 0x47, 0x15, 0x10, 0x5e, 0x85, 0x9c, 0x8e, 0x52, 0xaa, 0x2d, 0x60, 0x14, 0xf5, 0x00, 0x51, 0x5e, 0x06, - 0x72, 0xbc, 0xed, 0x76, 0x42, 0x57, 0x6c, 0x39, 0x9c, 0x50, 0x24, 0x25, 0x97, 0x58, 0xee, 0x15, 0xe8, 0x3c, 0xce, - 0x59, 0xef, 0x25, 0x60, 0x11, 0x9c, 0xc1, 0xdf, 0x98, 0xd0, 0x6b, 0xf8, 0x9b, 0x13, 0xfa, 0x86, 0x85, 0x57, 0xc3, - 0x4b, 0xb2, 0x1f, 0xa6, 0x83, 0x89, 0x12, 0x8c, 0xdd, 0xb1, 0x65, 0x19, 0xaa, 0xc4, 0xd5, 0xfe, 0x05, 0x79, 0x7c, - 0x41, 0x6f, 0xe9, 0x0d, 0x3d, 0xa5, 0x27, 0x40, 0xf8, 0xef, 0x0e, 0x27, 0x7c, 0x38, 0x79, 0xda, 0xef, 0xf7, 0xce, - 0xfb, 0xfd, 0xde, 0x99, 0x31, 0xa0, 0xd0, 0xbb, 0xe8, 0xb2, 0xa6, 0xfa, 0xd7, 0x55, 0xbd, 0x98, 0x9e, 0xa8, 0x8d, - 0x9b, 0xf0, 0x2c, 0x0f, 0xaf, 0xf6, 0xef, 0xc8, 0x10, 0x1f, 0x2f, 0x72, 0x29, 0x8b, 0xf0, 0x72, 0xff, 0x8e, 0xd0, - 0x93, 0x23, 0xd0, 0x9b, 0x62, 0x7d, 0x27, 0x8f, 0xef, 0x74, 0x6d, 0x84, 0xbe, 0x0c, 0x13, 0xd8, 0x26, 0xb7, 0xcc, - 0xde, 0xb5, 0x27, 0x63, 0x88, 0x65, 0x72, 0xe7, 0x95, 0x77, 0xf7, 0xf8, 0x96, 0xec, 0xdf, 0x82, 0xa7, 0xa8, 0x25, - 0x7f, 0xb3, 0xf0, 0x86, 0xb5, 0x6a, 0x78, 0x7c, 0x47, 0x4f, 0x5b, 0x8d, 0x78, 0x7c, 0x47, 0xa2, 0xf0, 0x86, 0x5d, - 0xd2, 0x53, 0x76, 0x45, 0xe8, 0x79, 0xbf, 0x7f, 0xd6, 0xef, 0xcb, 0x7e, 0xff, 0xa7, 0x38, 0x0c, 0xe3, 0x61, 0x41, - 0xf6, 0x25, 0xbd, 0xdb, 0x9f, 0xf0, 0x27, 0x64, 0x16, 0xea, 0xe6, 0xab, 0x05, 0x67, 0x55, 0xde, 0x2a, 0xd7, 0x1d, - 0x05, 0x6b, 0x85, 0x3b, 0xa6, 0x9e, 0x4e, 0xe8, 0x0d, 0x2b, 0xe8, 0x29, 0x8b, 0x49, 0x74, 0x0d, 0xad, 0x38, 0x9f, - 0x15, 0xd1, 0x0d, 0x3d, 0x65, 0x67, 0xb3, 0x38, 0x3a, 0xa5, 0x27, 0x2c, 0x1f, 0x4e, 0x20, 0xef, 0xe9, 0xf0, 0x86, - 0xec, 0x9f, 0x90, 0x28, 0x3c, 0xd1, 0xbf, 0xef, 0xe8, 0x25, 0x0f, 0x4f, 0xa8, 0x57, 0xcd, 0x09, 0x31, 0xd5, 0x37, - 0x6a, 0x3f, 0x21, 0x91, 0x3f, 0x98, 0x27, 0xd6, 0x9e, 0xe6, 0x91, 0xa3, 0x8d, 0x69, 0x19, 0x82, 0xbe, 0xb9, 0x0c, - 0x6f, 0x08, 0x99, 0x36, 0xc7, 0x0e, 0x06, 0x74, 0xf6, 0x28, 0x4a, 0x08, 0xbd, 0xf1, 0x4b, 0xbd, 0xc1, 0x31, 0x34, - 0x23, 0xa4, 0xd2, 0x4e, 0x31, 0x0d, 0xd7, 0xc1, 0x6b, 0x0d, 0xd6, 0x71, 0xde, 0xef, 0x87, 0xeb, 0x7e, 0x1f, 0x22, - 0xdd, 0x17, 0x33, 0x13, 0xdb, 0xcd, 0x91, 0x4d, 0x7a, 0x03, 0xda, 0xff, 0xd7, 0x83, 0x01, 0x74, 0xc6, 0x2b, 0x29, - 0xbc, 0x19, 0xbc, 0x7e, 0x7c, 0x47, 0x54, 0x1d, 0x05, 0x15, 0x32, 0x2c, 0xe8, 0x1b, 0x9a, 0x01, 0xe0, 0xd7, 0xeb, - 0xc1, 0x80, 0x44, 0xe6, 0x33, 0x32, 0x7d, 0x7d, 0x78, 0x32, 0x1d, 0x0c, 0x5e, 0x9b, 0x6d, 0xf2, 0x96, 0xdd, 0x53, - 0x0a, 0xac, 0xbf, 0xb3, 0x7e, 0xff, 0xed, 0x51, 0x4c, 0xce, 0x0b, 0x1e, 0x7f, 0x9c, 0x36, 0xdb, 0xf2, 0xd6, 0x45, - 0x55, 0x3b, 0xeb, 0xf7, 0xd7, 0xfd, 0xfe, 0x29, 0x60, 0x17, 0xcd, 0x9c, 0xaf, 0x27, 0x48, 0x5b, 0xe6, 0x8e, 0x22, - 0x69, 0x92, 0x43, 0x63, 0x68, 0x5b, 0xac, 0xda, 0x36, 0xeb, 0xc8, 0xc0, 0xe2, 0xa8, 0x59, 0x51, 0x5c, 0x93, 0x28, - 0xec, 0x9d, 0x6d, 0xb7, 0xa7, 0x8c, 0xb1, 0x98, 0x80, 0xf4, 0xc3, 0x7f, 0x7d, 0x5a, 0x37, 0x62, 0x88, 0x09, 0x89, - 0xcc, 0xe6, 0x66, 0x69, 0x0f, 0x81, 0x88, 0xc3, 0xa6, 0x7f, 0x6f, 0xee, 0xe5, 0xa2, 0x76, 0x7c, 0xeb, 0x2f, 0x00, - 0x42, 0x24, 0x59, 0xc8, 0x67, 0x38, 0x06, 0x65, 0x06, 0x40, 0xe6, 0x91, 0x9a, 0x79, 0x09, 0x20, 0xc0, 0x64, 0xbb, - 0x1d, 0x8d, 0xc7, 0x13, 0x5a, 0xb0, 0xd1, 0xdf, 0x9e, 0x3d, 0xae, 0x1e, 0x87, 0x41, 0x30, 0xc8, 0x48, 0x4b, 0x4f, - 0x61, 0x17, 0x6b, 0xb5, 0x0f, 0x46, 0xf0, 0x9a, 0x7d, 0xbc, 0xce, 0xbe, 0x98, 0x7d, 0x44, 0xc2, 0xda, 0x60, 0x1c, - 0xb9, 0x48, 0x5b, 0x7a, 0xbb, 0x7b, 0x18, 0x4c, 0x2e, 0xd2, 0xcf, 0xb0, 0x9d, 0x3e, 0xff, 0xe6, 0xc1, 0x78, 0xc2, - 0xc1, 0xe8, 0x2e, 0x0a, 0xfa, 0x4c, 0xdb, 0x6e, 0x2b, 0xff, 0x12, 0xf8, 0x16, 0x53, 0x41, 0xc7, 0x66, 0x59, 0xb8, - 0x41, 0x45, 0xd4, 0xd1, 0x32, 0xa8, 0x6a, 0x65, 0x3b, 0x07, 0xd4, 0x12, 0xab, 0x32, 0x71, 0x0b, 0x0c, 0x43, 0x86, - 0xba, 0xdc, 0xe3, 0xea, 0x5f, 0xbc, 0x90, 0x06, 0x3e, 0xc3, 0x89, 0x08, 0x3d, 0x6e, 0x8d, 0xfb, 0xdc, 0x9a, 0xf8, - 0x0c, 0xb7, 0x56, 0x22, 0x89, 0x35, 0xb0, 0xa4, 0xe6, 0x72, 0x94, 0xb0, 0xa3, 0x92, 0xf1, 0x59, 0x19, 0x25, 0x34, - 0x86, 0x07, 0xc9, 0xc4, 0x4c, 0x46, 0x09, 0xda, 0x27, 0xba, 0x08, 0x83, 0x7f, 0x01, 0x66, 0x3f, 0xcd, 0xe1, 0xaf, - 0x24, 0xd3, 0xe4, 0x10, 0x02, 0x42, 0x1c, 0x8e, 0x67, 0x71, 0x38, 0x26, 0x51, 0x72, 0x04, 0x4f, 0xf0, 0x5f, 0x11, - 0x8e, 0x49, 0xad, 0xef, 0x30, 0x52, 0x5d, 0x6e, 0x13, 0x06, 0x70, 0x65, 0xe3, 0xd9, 0x24, 0xb2, 0xd2, 0x5d, 0xf9, - 0x78, 0x34, 0x7e, 0x46, 0xa6, 0x71, 0x28, 0x07, 0x09, 0xa1, 0xe0, 0xdd, 0x1b, 0x96, 0xc3, 0x44, 0xc3, 0xb3, 0x01, - 0x9b, 0x57, 0x3a, 0x36, 0x4f, 0xc2, 0x09, 0x08, 0xc3, 0x84, 0x1c, 0xeb, 0x3d, 0x48, 0x29, 0xfa, 0x3c, 0xc7, 0x7e, - 0xea, 0x23, 0x08, 0xb3, 0xa3, 0x96, 0x8a, 0xaf, 0x00, 0xe8, 0x12, 0x07, 0x87, 0xda, 0x33, 0x5f, 0xcc, 0xc2, 0xd2, - 0xa3, 0x52, 0xa6, 0xba, 0x7d, 0xd1, 0xa0, 0xfc, 0xa6, 0x41, 0xfb, 0x82, 0x0c, 0x26, 0xb4, 0x3c, 0x9a, 0xf0, 0x27, - 0x10, 0xc0, 0xa3, 0x11, 0xf1, 0x4b, 0xe1, 0xc4, 0x40, 0x78, 0x15, 0x64, 0xa0, 0xd2, 0x5a, 0x35, 0x66, 0x64, 0x2b, - 0xde, 0x83, 0x30, 0x29, 0x7b, 0x37, 0x72, 0x9d, 0xa7, 0x10, 0x15, 0x6c, 0x9d, 0x57, 0x7b, 0x97, 0x60, 0xc9, 0x1e, - 0x57, 0x10, 0x27, 0x6c, 0xbd, 0x02, 0xec, 0xdc, 0x47, 0x9b, 0xb2, 0xde, 0x53, 0xdf, 0xed, 0x61, 0xcb, 0xe1, 0x55, - 0x25, 0xf7, 0x26, 0xe3, 0xf1, 0x78, 0xf4, 0x07, 0x1c, 0x1d, 0x40, 0x68, 0x49, 0x64, 0xf8, 0x64, 0x80, 0xc6, 0x5d, - 0x57, 0xdc, 0x1b, 0x17, 0x8a, 0xb2, 0xd2, 0xc9, 0x84, 0x80, 0xf8, 0xd9, 0xf4, 0x0d, 0xf6, 0x15, 0xd7, 0xf1, 0x4f, - 0x76, 0x3f, 0x31, 0x2b, 0x5a, 0xad, 0xd4, 0xd1, 0xbb, 0x93, 0xd3, 0xd7, 0x1f, 0x5e, 0xff, 0xf6, 0xf2, 0xec, 0xf5, - 0xdb, 0x57, 0xaf, 0xdf, 0xbe, 0xfe, 0xf0, 0xcf, 0x07, 0x18, 0x6c, 0xdf, 0x56, 0xc4, 0x8e, 0xbd, 0x77, 0x8f, 0xf1, - 0x6a, 0xf1, 0x85, 0xb3, 0x07, 0xee, 0x16, 0x0b, 0xb0, 0x09, 0x86, 0x5b, 0x10, 0x54, 0x33, 0x1a, 0x95, 0xbe, 0x27, - 0x20, 0xa3, 0x51, 0x21, 0x1b, 0x0f, 0x2b, 0xb6, 0x42, 0x2e, 0xde, 0x31, 0x1c, 0x7c, 0x64, 0x7f, 0x2b, 0xce, 0x84, - 0xdb, 0xd1, 0xd6, 0xac, 0x08, 0xf8, 0x7c, 0xad, 0x45, 0xe5, 0x71, 0x21, 0x6a, 0x6f, 0xdb, 0xe7, 0x90, 0x50, 0x8f, - 0xc8, 0x75, 0xf0, 0xbe, 0x0d, 0xb2, 0xc7, 0x47, 0xde, 0x93, 0xf2, 0x0c, 0xf5, 0x39, 0x1a, 0x3e, 0x6a, 0x3c, 0xa3, - 0x13, 0x73, 0x6d, 0x74, 0xa8, 0x67, 0x05, 0xec, 0x6f, 0x25, 0xc6, 0x86, 0x68, 0x0f, 0x29, 0x62, 0x7d, 0x38, 0xdd, - 0xef, 0xee, 0xcd, 0xe8, 0x7b, 0x38, 0x7e, 0x94, 0x6a, 0x02, 0x69, 0x51, 0xa0, 0x74, 0x65, 0xc8, 0x6d, 0xcf, 0xc2, - 0xc2, 0xfc, 0x0c, 0x1b, 0x04, 0xd0, 0x5e, 0x76, 0x2c, 0x09, 0x34, 0x8b, 0xd7, 0xba, 0xfe, 0x79, 0xf9, 0x32, 0xd1, - 0xce, 0x17, 0xdf, 0x42, 0x88, 0x61, 0xff, 0x8a, 0xd0, 0x98, 0x70, 0x37, 0xc9, 0xee, 0xd2, 0x62, 0xee, 0x55, 0x57, - 0x31, 0x1e, 0x77, 0xf7, 0x5c, 0x29, 0x9a, 0xb7, 0x2e, 0xb0, 0x07, 0x6a, 0x5e, 0xc7, 0x4b, 0x16, 0x02, 0x36, 0xe3, - 0xbe, 0x5d, 0x24, 0xce, 0xef, 0x9d, 0x4e, 0xc8, 0xfe, 0xc1, 0x94, 0x0f, 0x59, 0x49, 0xc5, 0x80, 0x95, 0xf5, 0x0e, - 0x35, 0xe7, 0x6d, 0x42, 0x2e, 0x76, 0x69, 0xb8, 0x18, 0xf2, 0x87, 0x2e, 0x49, 0x1f, 0x78, 0xc3, 0xa1, 0xda, 0x36, - 0x17, 0x43, 0x9a, 0x72, 0xba, 0x4b, 0x65, 0x40, 0x88, 0x74, 0x15, 0x57, 0xa4, 0xd6, 0x47, 0x55, 0xea, 0x24, 0x1d, - 0xd7, 0xd9, 0xe6, 0x33, 0x97, 0x6c, 0x75, 0xbb, 0xf6, 0xaf, 0xd5, 0xed, 0x0b, 0x33, 0x90, 0xbf, 0x3f, 0x11, 0xd5, - 0xc4, 0x40, 0x74, 0x01, 0x15, 0xfc, 0x13, 0xbc, 0x3c, 0x79, 0xa4, 0x15, 0xa0, 0xf7, 0x9d, 0x1d, 0x5d, 0x7b, 0xbc, - 0x31, 0x8b, 0xad, 0x25, 0xce, 0x59, 0xe5, 0x3b, 0xcb, 0xab, 0xb2, 0x15, 0xba, 0x8e, 0x60, 0xbf, 0x84, 0x1d, 0x7d, - 0xf7, 0xb6, 0x01, 0x10, 0xa5, 0xb0, 0x72, 0x67, 0xbf, 0xf0, 0xce, 0x7e, 0x61, 0xcf, 0x7e, 0xbb, 0x09, 0x94, 0x0f, - 0x2b, 0xb4, 0xec, 0x95, 0x14, 0x95, 0x69, 0xf2, 0xb8, 0xa9, 0xcb, 0x42, 0x5a, 0xcc, 0xf7, 0x2d, 0xed, 0x7a, 0x3a, - 0xa6, 0x12, 0xd5, 0x23, 0x3f, 0x60, 0xab, 0xf6, 0x4b, 0xf2, 0xf0, 0x3d, 0xf3, 0x7f, 0xf6, 0x06, 0x79, 0xdf, 0xdd, - 0xee, 0xff, 0xe6, 0x42, 0x07, 0xb7, 0xb5, 0x54, 0x78, 0xea, 0xea, 0xb8, 0xc0, 0xbb, 0x5a, 0xfa, 0xf0, 0x5d, 0xed, - 0x5d, 0xa6, 0x97, 0x5d, 0x05, 0xa8, 0x41, 0x62, 0x7d, 0xc5, 0x8b, 0x2c, 0xa9, 0xad, 0x42, 0xe3, 0x84, 0x43, 0x68, - 0x0f, 0xef, 0xe0, 0x02, 0x39, 0x2c, 0x21, 0xf4, 0x63, 0x65, 0x04, 0x80, 0x3e, 0x8b, 0x7d, 0xc2, 0xc3, 0x8c, 0x0c, - 0x7c, 0x89, 0x5f, 0x29, 0x7d, 0x71, 0xf1, 0xfe, 0x4e, 0x66, 0x82, 0x5e, 0x25, 0x36, 0xbb, 0x94, 0xed, 0x98, 0x1f, - 0xfe, 0x17, 0x18, 0x0d, 0xc2, 0x6b, 0x4b, 0xb6, 0x2f, 0x3a, 0x66, 0xb9, 0x82, 0xa3, 0xb6, 0x74, 0x65, 0x96, 0xad, - 0xeb, 0x67, 0x35, 0xcc, 0xf4, 0x99, 0x72, 0x02, 0xb2, 0x2f, 0xe4, 0xee, 0xa7, 0xba, 0x62, 0x41, 0x8e, 0x26, 0xe3, - 0x29, 0x11, 0x83, 0x41, 0x2b, 0xf9, 0x10, 0x93, 0x87, 0xc3, 0x1d, 0xe6, 0x52, 0xe8, 0x7e, 0x78, 0x7d, 0x80, 0xfa, - 0x1a, 0x5b, 0x92, 0x6c, 0x2a, 0xf6, 0x17, 0x98, 0xc5, 0x02, 0x71, 0x74, 0xf0, 0x8b, 0xf3, 0x05, 0x80, 0x2c, 0xc3, - 0x32, 0xd3, 0xc2, 0xa2, 0x32, 0x55, 0x3e, 0xb2, 0x05, 0x93, 0x87, 0xe3, 0x99, 0xdf, 0x73, 0xc7, 0xe0, 0x10, 0x12, - 0x4d, 0xac, 0xf1, 0x8b, 0x9f, 0x05, 0xe3, 0x38, 0x94, 0x47, 0xb2, 0xf1, 0x5d, 0x49, 0xa2, 0xb1, 0x31, 0x55, 0xd6, - 0x57, 0x89, 0x6a, 0x98, 0x90, 0xc7, 0x05, 0xd9, 0x2f, 0xe8, 0xd2, 0x1f, 0x4b, 0x4c, 0xdf, 0x8f, 0xf7, 0x27, 0x63, - 0xf2, 0x38, 0x7e, 0x3c, 0x31, 0x70, 0xc3, 0x7e, 0x8e, 0x7c, 0xb8, 0x24, 0xfb, 0xcd, 0x2a, 0xc1, 0x14, 0xd5, 0xf4, - 0xcc, 0xaf, 0x24, 0x19, 0x2c, 0x07, 0xe9, 0xe3, 0x56, 0x5e, 0xac, 0x55, 0x8f, 0xf7, 0xfa, 0x90, 0x4f, 0x89, 0x68, - 0xdc, 0x18, 0xd6, 0xf4, 0x2a, 0xfe, 0x53, 0x16, 0x51, 0x29, 0x01, 0x91, 0x10, 0xd4, 0xdb, 0xd9, 0x45, 0x96, 0xc4, - 0x22, 0x8d, 0xd2, 0x9a, 0xd0, 0xf4, 0x88, 0x4d, 0xc6, 0xb3, 0x94, 0xa5, 0x87, 0x93, 0x67, 0xb3, 0xc9, 0xb3, 0xe8, - 0x60, 0x1c, 0xa5, 0x83, 0x01, 0x24, 0x1f, 0x8c, 0xc1, 0xc5, 0x0e, 0x7e, 0xb3, 0x03, 0x18, 0xba, 0x23, 0x64, 0x09, - 0x0b, 0x68, 0xda, 0x97, 0x35, 0x49, 0x0f, 0xe7, 0x85, 0xea, 0x49, 0x7c, 0x4b, 0xd7, 0x9e, 0x83, 0x8b, 0xdf, 0xc2, - 0x0b, 0xd7, 0xc2, 0x8b, 0xdd, 0x16, 0x0a, 0x4d, 0xb6, 0x0b, 0xf9, 0xff, 0xe3, 0x86, 0x71, 0xdf, 0x5d, 0xc2, 0x2c, - 0xae, 0xeb, 0x6c, 0xb4, 0x2a, 0x64, 0x25, 0xe1, 0x36, 0xa1, 0x44, 0x61, 0xa3, 0x78, 0xb5, 0xca, 0xb5, 0x8b, 0xd8, - 0xbc, 0xa2, 0x00, 0xee, 0x02, 0x71, 0x8a, 0x81, 0x85, 0x36, 0x06, 0x72, 0x9f, 0x78, 0x21, 0x99, 0x55, 0xfb, 0x98, - 0x7b, 0xe4, 0x9f, 0x21, 0x18, 0xa3, 0x8a, 0xa3, 0xf1, 0x4c, 0x61, 0x5d, 0x7c, 0x4e, 0xde, 0xfb, 0x6f, 0x1c, 0x45, - 0xf6, 0x68, 0x06, 0x3d, 0x41, 0xe4, 0x3c, 0xe2, 0xec, 0xc9, 0xe4, 0x65, 0xe0, 0x7e, 0x06, 0x2b, 0xfd, 0x75, 0xb7, - 0x19, 0x6b, 0xdb, 0xa3, 0x7b, 0x61, 0x84, 0xa2, 0x9f, 0xf0, 0x9d, 0xa9, 0x17, 0x70, 0x09, 0xd5, 0xc0, 0xae, 0x2f, - 0x2f, 0x79, 0x09, 0x20, 0x42, 0x99, 0xe8, 0xf7, 0x7b, 0x7f, 0x1a, 0x68, 0xd2, 0x92, 0x17, 0x6f, 0x32, 0x61, 0x9d, - 0x71, 0xa0, 0xa9, 0x40, 0xfd, 0x3f, 0x56, 0xf6, 0x99, 0x8e, 0xc9, 0xcc, 0x7f, 0x1c, 0x4e, 0x48, 0xd4, 0x7c, 0x4d, - 0x3e, 0x73, 0x9a, 0x7e, 0xe6, 0x8a, 0xf6, 0x1f, 0xc8, 0xcc, 0x0d, 0x87, 0x0c, 0xf5, 0x97, 0x8e, 0x79, 0x32, 0x7a, - 0x9d, 0x98, 0x1d, 0x09, 0x56, 0xcd, 0x20, 0x0a, 0x7b, 0x01, 0x0f, 0xea, 0x5a, 0x16, 0x4f, 0x61, 0xf6, 0x41, 0x8d, - 0x28, 0x0e, 0xd9, 0x78, 0x16, 0xca, 0x70, 0x02, 0xf6, 0xbd, 0x93, 0x31, 0xdc, 0x07, 0x64, 0xf8, 0xb1, 0x0a, 0xb1, - 0x73, 0x90, 0xf6, 0xb1, 0x42, 0xc5, 0x04, 0x40, 0x04, 0x42, 0xde, 0x7e, 0x5f, 0xaa, 0x24, 0x7c, 0x5d, 0x62, 0x4a, - 0xa1, 0x3e, 0xf8, 0x4f, 0xa4, 0xea, 0x8e, 0xe9, 0x57, 0xeb, 0xc7, 0x9f, 0x09, 0xc5, 0xa7, 0xbb, 0x94, 0xf8, 0x16, - 0x82, 0x3b, 0x4b, 0xd0, 0x41, 0x54, 0x68, 0xc6, 0xf6, 0x30, 0xbf, 0x2b, 0xee, 0xe7, 0x77, 0xc5, 0xff, 0x3b, 0x7e, - 0x57, 0x3c, 0xc4, 0x18, 0x56, 0x16, 0x1a, 0x7e, 0x16, 0x8c, 0x83, 0xe8, 0x3f, 0xe7, 0x13, 0xef, 0xe5, 0xa9, 0xaf, - 0x32, 0x31, 0xbd, 0x87, 0x69, 0xf6, 0x09, 0x0a, 0xc2, 0x2a, 0xee, 0xd2, 0x93, 0x75, 0x65, 0x6f, 0xad, 0x64, 0x88, - 0x79, 0x1e, 0x60, 0x8d, 0xc2, 0xca, 0x03, 0xba, 0x47, 0xd5, 0x06, 0x71, 0x22, 0x78, 0x18, 0x33, 0x2b, 0x7d, 0xdf, - 0x6e, 0x8d, 0x0a, 0xf3, 0x41, 0x2e, 0x0a, 0xb2, 0x9b, 0x8f, 0x67, 0xe3, 0x28, 0xc4, 0x06, 0xfc, 0xc7, 0x8c, 0x55, - 0x43, 0x36, 0xdf, 0xc9, 0x48, 0xed, 0x98, 0x3c, 0x4d, 0x76, 0x49, 0xef, 0x80, 0x77, 0xc8, 0xcf, 0xeb, 0x8f, 0x61, - 0x21, 0x0d, 0xbf, 0x25, 0x2f, 0xe3, 0x22, 0xab, 0x96, 0x57, 0x59, 0x82, 0x4c, 0x17, 0xbc, 0xf8, 0x62, 0xa6, 0xcb, - 0xfb, 0x58, 0x1f, 0x30, 0x9e, 0x52, 0xbc, 0x6e, 0x88, 0xd2, 0xd7, 0x2d, 0xcf, 0x0a, 0x75, 0x79, 0x52, 0x31, 0xdb, - 0xb3, 0x12, 0x9c, 0x4e, 0xc1, 0x04, 0x5f, 0xff, 0x74, 0xbd, 0x8f, 0x01, 0x17, 0x14, 0x6a, 0x4e, 0x0b, 0xb9, 0x32, - 0x58, 0x4e, 0x16, 0xba, 0x13, 0x30, 0x43, 0xa5, 0xc0, 0x0b, 0x14, 0xfc, 0x45, 0x03, 0x23, 0xfa, 0xca, 0xfd, 0x26, - 0x03, 0x83, 0x74, 0x69, 0x4e, 0x84, 0xb1, 0xe3, 0x76, 0x8a, 0xb4, 0x15, 0xe5, 0x8c, 0xb3, 0xf7, 0xea, 0x4a, 0x01, - 0x06, 0x78, 0x9b, 0x9b, 0xe8, 0x3c, 0x41, 0xaf, 0x05, 0xa5, 0xf3, 0x06, 0xee, 0x66, 0x19, 0x19, 0xe1, 0xe2, 0xe3, - 0xca, 0x63, 0xc1, 0x3d, 0xfb, 0x85, 0x58, 0x1a, 0xcd, 0x34, 0x18, 0xb3, 0x79, 0xc1, 0x02, 0x85, 0x0a, 0x14, 0x58, - 0xce, 0xb4, 0xa5, 0x69, 0x35, 0xe4, 0xfb, 0x07, 0x68, 0x6d, 0x5a, 0x0d, 0xf8, 0xfe, 0x41, 0x1d, 0x65, 0x87, 0x90, - 0xe5, 0xc8, 0xcf, 0xa0, 0x5e, 0xd7, 0x91, 0x49, 0x31, 0xd9, 0xfd, 0xfa, 0x52, 0x7f, 0x54, 0x37, 0xe0, 0xfa, 0x01, - 0x08, 0x60, 0x03, 0x70, 0x08, 0x54, 0x83, 0xa5, 0x11, 0xc1, 0xa2, 0x4c, 0xa1, 0x7d, 0x0d, 0xbd, 0x37, 0x1a, 0xfe, - 0x0b, 0xdc, 0x45, 0xe4, 0xca, 0xff, 0x04, 0x81, 0xbf, 0xa2, 0x4c, 0x2b, 0x53, 0xfc, 0x4f, 0xb4, 0x7a, 0x85, 0x72, - 0xd6, 0xb4, 0xe6, 0x83, 0x68, 0x4d, 0x84, 0x6a, 0xc6, 0x10, 0xfc, 0x5b, 0x59, 0xa6, 0x2d, 0x55, 0x95, 0xfa, 0xd0, - 0x78, 0xad, 0x15, 0xce, 0xf2, 0x71, 0xe4, 0xbd, 0xc6, 0xd0, 0xb1, 0x89, 0xb3, 0x94, 0x53, 0xa9, 0xb3, 0x4f, 0xfb, - 0x32, 0x72, 0x80, 0xd3, 0x09, 0x1b, 0x4f, 0x93, 0x43, 0x39, 0x4d, 0x1c, 0x64, 0x7e, 0xce, 0x30, 0xb2, 0xaa, 0x01, - 0x61, 0x51, 0x36, 0x94, 0xb6, 0x00, 0x93, 0x9c, 0x10, 0x32, 0xc5, 0x50, 0x14, 0xf9, 0x48, 0xf7, 0xc3, 0x7a, 0xb3, - 0xba, 0x2f, 0xde, 0x69, 0x80, 0xd3, 0x30, 0x81, 0x40, 0xe0, 0x45, 0x7c, 0x93, 0x89, 0x4b, 0xf0, 0x18, 0x1e, 0xc0, - 0x97, 0xe0, 0x26, 0x97, 0xb2, 0xdf, 0xab, 0x30, 0xc7, 0xb5, 0x05, 0x0c, 0x1a, 0xac, 0x1e, 0x44, 0x87, 0x4b, 0x69, - 0xb3, 0xab, 0x00, 0xb1, 0x31, 0x85, 0x58, 0x16, 0x6c, 0x6d, 0xd9, 0xb3, 0xef, 0x55, 0xd3, 0xd0, 0x3a, 0xe1, 0x58, - 0x5c, 0xe6, 0x10, 0x45, 0x65, 0x10, 0x83, 0x3b, 0x92, 0xc7, 0xe7, 0x3d, 0x12, 0xe1, 0x05, 0x01, 0xb7, 0xb2, 0x58, - 0x86, 0x2b, 0xba, 0x1c, 0xdd, 0xd2, 0xf5, 0xe8, 0x86, 0x8e, 0xe9, 0xe4, 0xef, 0x63, 0xb0, 0xc8, 0xd6, 0xa9, 0x77, - 0x74, 0x3d, 0x5a, 0xd2, 0x6f, 0xc7, 0xf4, 0xe0, 0x6f, 0x60, 0xc2, 0x87, 0x87, 0x09, 0xbd, 0x00, 0xc7, 0x2e, 0x52, - 0xa3, 0xa7, 0xa6, 0x6f, 0x70, 0x58, 0x8d, 0xf2, 0x21, 0x1f, 0xe5, 0x94, 0x8f, 0x8a, 0x61, 0x35, 0x02, 0x4f, 0xc7, - 0x6a, 0xc8, 0x47, 0x15, 0xe5, 0xa3, 0xf3, 0x61, 0x35, 0x3a, 0x27, 0xcd, 0xa6, 0xbf, 0xae, 0xf8, 0x55, 0xc9, 0x52, - 0xd8, 0x16, 0xb0, 0x7c, 0x3d, 0xaf, 0xa8, 0xd4, 0x5f, 0xd5, 0xe6, 0x64, 0xb6, 0x9c, 0xbd, 0xbd, 0xee, 0x72, 0x62, - 0xf1, 0xb8, 0x6d, 0x3a, 0x5c, 0x7d, 0x39, 0x51, 0x27, 0xbd, 0x42, 0x7e, 0x18, 0x4f, 0x85, 0x3a, 0x87, 0xc0, 0x4c, - 0x62, 0x16, 0xc6, 0x0c, 0x9b, 0xa9, 0xd3, 0x40, 0x81, 0x93, 0x8d, 0x3c, 0x17, 0xc5, 0x6c, 0x94, 0x53, 0x78, 0x1f, - 0x13, 0x12, 0x09, 0x38, 0xab, 0x8e, 0xaa, 0x51, 0x01, 0x31, 0x47, 0x58, 0x88, 0x8f, 0xd0, 0x2f, 0xf5, 0x91, 0x87, - 0x04, 0x9e, 0x61, 0x5f, 0x8b, 0x41, 0x0c, 0x47, 0xbc, 0xad, 0xac, 0x9a, 0x85, 0x09, 0x54, 0x56, 0x0d, 0x4b, 0x53, - 0x59, 0x41, 0xb3, 0x51, 0xe5, 0x57, 0x56, 0xe1, 0x18, 0x25, 0x84, 0x44, 0xa5, 0xae, 0x0c, 0xd4, 0x27, 0x09, 0x0b, - 0x4b, 0x5d, 0xd9, 0xb9, 0xfa, 0xe8, 0xdc, 0xaf, 0xec, 0x1c, 0x5c, 0x48, 0x07, 0x89, 0x7f, 0x95, 0xca, 0xd3, 0xf6, - 0x75, 0xb0, 0xb1, 0xaa, 0xe8, 0x86, 0xdf, 0x56, 0x45, 0x1c, 0x95, 0xd4, 0xc5, 0x80, 0xc6, 0x85, 0x11, 0x49, 0xaa, - 0xd7, 0x28, 0xf8, 0x43, 0x82, 0xa8, 0x34, 0x06, 0xaf, 0xce, 0xa4, 0x6b, 0xa5, 0x56, 0x54, 0x0c, 0xca, 0x41, 0x01, - 0xf7, 0xa7, 0xbc, 0xb5, 0x90, 0xbe, 0x87, 0x88, 0xca, 0x50, 0xde, 0xe0, 0x1f, 0x18, 0x3c, 0x99, 0xad, 0xd2, 0x30, - 0x19, 0xdd, 0xd1, 0x78, 0xb4, 0x44, 0x38, 0x18, 0xb6, 0x4e, 0x15, 0xde, 0xfa, 0x05, 0xa4, 0xdf, 0xd2, 0x78, 0x74, - 0x43, 0x53, 0x6b, 0x73, 0x6a, 0xa0, 0xae, 0x7a, 0x63, 0x7a, 0x1b, 0xc1, 0xeb, 0xbb, 0x68, 0x49, 0x61, 0x2b, 0x1d, - 0xe7, 0xd9, 0xa5, 0x88, 0x52, 0x8a, 0x08, 0x84, 0x6b, 0x44, 0x0e, 0x5c, 0x6a, 0xb4, 0xc1, 0xf5, 0x00, 0xca, 0xd0, - 0x70, 0x81, 0xcb, 0x41, 0x3c, 0x5a, 0x7a, 0x64, 0x6a, 0xa9, 0x2f, 0xb2, 0x08, 0x1f, 0xed, 0x6c, 0xb4, 0x14, 0xcf, - 0x88, 0x85, 0x71, 0x05, 0x43, 0xa8, 0x0b, 0x2b, 0x4d, 0x41, 0xd2, 0x05, 0x8e, 0xec, 0x85, 0x45, 0x15, 0x6e, 0xc0, - 0xb4, 0xe8, 0x0e, 0xcc, 0xa3, 0x40, 0xe1, 0xe0, 0x12, 0xa4, 0x9f, 0x50, 0xb6, 0x73, 0x94, 0x26, 0x87, 0x37, 0x41, - 0xe9, 0xce, 0x04, 0x21, 0xed, 0xea, 0x26, 0x5b, 0xd2, 0x37, 0xd8, 0xde, 0xa1, 0x53, 0x51, 0x41, 0xf5, 0xb9, 0x05, - 0x93, 0x25, 0x1b, 0x84, 0x2d, 0x61, 0x7a, 0xa6, 0xd7, 0x80, 0x3d, 0xbd, 0x7f, 0xb0, 0x33, 0xdf, 0xc5, 0xec, 0xd3, - 0x7e, 0x19, 0x8d, 0x95, 0x05, 0x6f, 0x6e, 0x89, 0xdd, 0x92, 0x8d, 0xa7, 0xcb, 0xc3, 0x72, 0xba, 0x44, 0x62, 0x67, - 0xe8, 0x16, 0xe3, 0xf3, 0xe5, 0x82, 0x26, 0x78, 0xb6, 0xb1, 0x6a, 0xbe, 0x34, 0x68, 0x29, 0x29, 0xc3, 0xf5, 0xb6, - 0x44, 0xff, 0x7f, 0x75, 0xf1, 0x4b, 0x01, 0x5e, 0x82, 0xb1, 0x00, 0x10, 0xee, 0xc1, 0xb4, 0x20, 0xb5, 0x51, 0x36, - 0x96, 0x69, 0x98, 0xe2, 0x22, 0x30, 0x29, 0xfd, 0x7e, 0x98, 0xb3, 0x94, 0x78, 0xd0, 0xa1, 0xee, 0xd4, 0x4e, 0x7d, - 0x21, 0x08, 0xf0, 0x48, 0xea, 0x1c, 0x9b, 0xfc, 0x7d, 0x3c, 0x0b, 0xd4, 0x40, 0x04, 0x51, 0x76, 0x88, 0x8f, 0x18, - 0xb8, 0x28, 0xd2, 0x71, 0x3b, 0x5d, 0x11, 0x17, 0xbb, 0xc7, 0x2c, 0xc4, 0x49, 0xc2, 0x5c, 0xb3, 0x6c, 0xc8, 0xaa, - 0x08, 0x13, 0x74, 0x61, 0x60, 0x96, 0x37, 0x64, 0xd5, 0xfe, 0x01, 0x44, 0x6a, 0xb5, 0x65, 0xac, 0xba, 0xca, 0xf8, - 0x16, 0x80, 0xac, 0x19, 0x63, 0x07, 0x7f, 0x1b, 0xcf, 0xd4, 0x37, 0x51, 0xc8, 0x8f, 0x0e, 0xfe, 0x06, 0xc9, 0x87, - 0xdf, 0x22, 0x33, 0x07, 0xc9, 0x8d, 0x82, 0x2e, 0x9b, 0xb3, 0xae, 0xa1, 0x34, 0x71, 0xed, 0x95, 0x7a, 0xed, 0x49, - 0xb3, 0xf6, 0x0a, 0x74, 0xa7, 0x36, 0xbc, 0x87, 0xb2, 0x9d, 0x05, 0x13, 0x74, 0x34, 0xbb, 0x03, 0x1d, 0xbc, 0x53, - 0x04, 0xbd, 0x4c, 0x42, 0xe3, 0x11, 0xaa, 0x8c, 0x7a, 0x61, 0x47, 0x76, 0xb3, 0x2e, 0x99, 0x67, 0xc0, 0x1c, 0xdb, - 0x73, 0x48, 0x0c, 0x73, 0x75, 0x50, 0xa7, 0xac, 0x1c, 0xe6, 0x78, 0x00, 0xaf, 0x99, 0x1c, 0x8a, 0x41, 0xae, 0x51, - 0xbe, 0x2f, 0x58, 0x31, 0x2c, 0x07, 0xb9, 0xe6, 0x66, 0xa6, 0xcd, 0xd8, 0xb4, 0x89, 0x0e, 0xcf, 0xbc, 0x62, 0x47, - 0xab, 0x1e, 0xf0, 0xb1, 0xe0, 0xc9, 0xec, 0x7b, 0x3e, 0xbe, 0x01, 0x4e, 0x66, 0x73, 0x1b, 0x2d, 0xe9, 0x5d, 0x94, - 0xd2, 0x9b, 0x68, 0x4d, 0x97, 0xd1, 0x85, 0x31, 0x31, 0x4e, 0x6a, 0x38, 0x07, 0xa0, 0x55, 0x00, 0x89, 0xa7, 0x7e, - 0xbd, 0xe7, 0x49, 0x15, 0x2e, 0x69, 0x0a, 0x6e, 0xc3, 0xbe, 0x7d, 0xe6, 0x95, 0x2f, 0x91, 0xda, 0x20, 0xc6, 0x9a, - 0x35, 0x54, 0xdc, 0x78, 0xeb, 0x3e, 0x12, 0x35, 0xec, 0x5c, 0x17, 0x9b, 0xa8, 0x1a, 0x4e, 0xa6, 0x25, 0x20, 0xb6, - 0x96, 0xc3, 0xa1, 0x3b, 0x42, 0x76, 0x8f, 0x1f, 0x1d, 0xe8, 0xb9, 0x27, 0x2d, 0xb6, 0x6d, 0xcb, 0x1f, 0x18, 0xc2, - 0x94, 0x7e, 0xfe, 0xc8, 0x07, 0xc4, 0x8a, 0x4b, 0x38, 0x1b, 0x81, 0x3a, 0x5a, 0xa1, 0xd3, 0xef, 0x55, 0x58, 0xe8, - 0x03, 0x7c, 0x73, 0x1b, 0x25, 0xf4, 0x2e, 0xca, 0x3d, 0xb2, 0xb6, 0xac, 0x99, 0x9c, 0x9e, 0x65, 0x21, 0x6f, 0x1f, - 0xe8, 0xe5, 0x02, 0x40, 0xb4, 0x06, 0xb1, 0x2f, 0x75, 0x3d, 0x00, 0xa7, 0x21, 0x34, 0x09, 0x8d, 0xe0, 0xaa, 0x82, - 0x30, 0x02, 0xae, 0x24, 0xfc, 0x0d, 0x26, 0x2a, 0xf0, 0x05, 0xb8, 0xc8, 0xa4, 0x69, 0xce, 0x83, 0xda, 0x1f, 0xc9, - 0xd3, 0xa2, 0xed, 0xed, 0x0a, 0xa3, 0x09, 0xc6, 0x9e, 0x68, 0x9f, 0x47, 0xca, 0x51, 0x5c, 0x24, 0x61, 0x36, 0xba, - 0x55, 0xe7, 0x39, 0xcd, 0x46, 0x77, 0xfa, 0x57, 0x45, 0xc7, 0xf4, 0x3b, 0x1d, 0xd0, 0x46, 0x49, 0xdf, 0x3a, 0xce, - 0x06, 0xb4, 0x5e, 0x2c, 0x8d, 0xff, 0xb5, 0x1c, 0xdd, 0x52, 0x39, 0xba, 0xf3, 0x2d, 0xa9, 0x26, 0xd3, 0xe2, 0x50, - 0xa0, 0x21, 0x55, 0xe7, 0xf7, 0x05, 0xf0, 0x73, 0xa5, 0xf1, 0x9d, 0x36, 0xdf, 0x7b, 0xed, 0x3f, 0xef, 0xe4, 0x09, - 0x14, 0x4b, 0x54, 0xb0, 0x6a, 0x04, 0x76, 0xec, 0xeb, 0x3c, 0x2e, 0xcc, 0x28, 0xc5, 0xd4, 0x9a, 0xf4, 0x63, 0xe0, - 0x8a, 0x69, 0xaf, 0x00, 0x57, 0xcb, 0xed, 0x56, 0xc5, 0xd0, 0x84, 0x3d, 0x3b, 0x86, 0xa8, 0xe7, 0xc6, 0x31, 0x4a, - 0x36, 0xdc, 0x03, 0x62, 0x2d, 0xf3, 0x56, 0x2e, 0x01, 0x09, 0xbc, 0xf5, 0x30, 0x29, 0x00, 0x63, 0xb0, 0x5c, 0x12, - 0x9d, 0xc7, 0x43, 0x9f, 0x50, 0x2f, 0x34, 0xea, 0x84, 0x6c, 0x6c, 0x09, 0x1c, 0x7f, 0x58, 0x1f, 0x02, 0xc1, 0xab, - 0x3c, 0xd7, 0x5f, 0x69, 0x5d, 0x7f, 0xa9, 0xf4, 0xdc, 0xb1, 0x5c, 0xd7, 0xcf, 0xda, 0xd4, 0xe8, 0x15, 0x58, 0xf8, - 0x6e, 0x94, 0x79, 0x24, 0xb7, 0x08, 0xa9, 0x0a, 0xac, 0xd4, 0x2d, 0x24, 0x98, 0x7f, 0x25, 0x67, 0xab, 0x32, 0x5f, - 0x3d, 0xf2, 0xa0, 0x9c, 0x4d, 0x4f, 0x7f, 0x43, 0x82, 0x76, 0xd7, 0x91, 0xe6, 0xf1, 0x16, 0x1d, 0x3e, 0xbb, 0xd6, - 0x12, 0x73, 0x27, 0x51, 0xf1, 0x7c, 0x0a, 0xd8, 0xea, 0x45, 0x76, 0xa5, 0x7c, 0xac, 0x76, 0x71, 0xfc, 0xcc, 0xf9, - 0x13, 0x57, 0xe1, 0x5a, 0x34, 0x94, 0x20, 0xe0, 0xcd, 0x61, 0xec, 0x0a, 0x55, 0x40, 0x43, 0x73, 0x03, 0xc7, 0xb9, - 0x1a, 0x56, 0x9a, 0x80, 0x69, 0x29, 0x8f, 0x0e, 0x70, 0x68, 0xf2, 0xa8, 0xdd, 0x34, 0xac, 0x0c, 0x5d, 0x6b, 0xf4, - 0xb9, 0xad, 0x74, 0xc6, 0x9b, 0x0d, 0xdf, 0x3f, 0x18, 0x54, 0xf8, 0x93, 0x34, 0x47, 0xa3, 0x9d, 0x1b, 0xee, 0x34, - 0x02, 0x33, 0x57, 0x72, 0x45, 0x76, 0x47, 0xc9, 0xcb, 0xef, 0xe9, 0x85, 0x05, 0xf4, 0xe7, 0x3f, 0x17, 0x13, 0x4e, - 0x5a, 0x62, 0x42, 0xb4, 0x74, 0xd0, 0xa2, 0x83, 0x1d, 0xe5, 0x95, 0x7d, 0x89, 0x97, 0xce, 0xf1, 0xbf, 0xaf, 0xc7, - 0xda, 0x55, 0x20, 0xb4, 0x3a, 0xb9, 0xdf, 0x9e, 0x2c, 0x10, 0x35, 0xa0, 0x9a, 0x5d, 0x95, 0xa3, 0x4c, 0x3b, 0x2b, - 0xb2, 0x69, 0xc8, 0x5c, 0x77, 0xb3, 0x34, 0x6c, 0x26, 0x3b, 0x16, 0x96, 0x19, 0x06, 0x6b, 0xa7, 0x8a, 0x3e, 0x07, - 0x2d, 0x3f, 0x82, 0x17, 0x4d, 0xe5, 0x99, 0xcf, 0x66, 0x19, 0xf1, 0x02, 0x9d, 0x73, 0x2a, 0x16, 0x4d, 0xe9, 0x58, - 0xb9, 0xdd, 0x96, 0x68, 0x2c, 0x51, 0x46, 0x41, 0x50, 0xdb, 0x20, 0xec, 0xba, 0x74, 0x4f, 0xfa, 0xb4, 0x8b, 0x4f, - 0x2b, 0xd0, 0xf7, 0xf8, 0x3e, 0x03, 0x89, 0xa9, 0x27, 0x79, 0xa8, 0x1a, 0xcd, 0xd1, 0xc9, 0xb3, 0x38, 0xd5, 0xf8, - 0xfc, 0x4a, 0x76, 0xd6, 0xbc, 0x5b, 0x8d, 0x29, 0xfe, 0x23, 0x75, 0xfb, 0xce, 0x65, 0x68, 0xa2, 0xbf, 0x96, 0x07, - 0x2d, 0x85, 0x05, 0xc7, 0x6d, 0xe3, 0xaf, 0xdf, 0x66, 0x0e, 0x31, 0x2c, 0x5d, 0x0e, 0x6f, 0x42, 0x87, 0xee, 0xae, - 0xb2, 0x33, 0xd7, 0x07, 0xd4, 0xa9, 0x8b, 0x75, 0x1b, 0x50, 0xb2, 0xe4, 0xdd, 0x3a, 0x3d, 0xb1, 0xd2, 0x77, 0xfb, - 0xe1, 0xce, 0x3c, 0x6a, 0x76, 0x77, 0xbb, 0x9d, 0x90, 0xb6, 0x7d, 0x30, 0xde, 0x97, 0xb0, 0x10, 0xe7, 0x1d, 0xb6, - 0xf7, 0x7d, 0x58, 0x3d, 0xe6, 0x83, 0x5f, 0x70, 0x9c, 0x61, 0xf4, 0x33, 0x65, 0xe8, 0xf3, 0xaa, 0x90, 0x57, 0xaa, - 0x53, 0xbe, 0xd0, 0xad, 0x65, 0xea, 0xfd, 0x36, 0x7e, 0xdb, 0x0a, 0x10, 0xe3, 0x75, 0xc5, 0x4a, 0xf1, 0x86, 0x56, - 0x18, 0xd7, 0xc0, 0x6d, 0x72, 0xa8, 0xa5, 0x5a, 0x20, 0xea, 0xf2, 0x93, 0xc7, 0x3c, 0x32, 0xea, 0x4c, 0xf8, 0xee, - 0x31, 0xf7, 0xa5, 0x6b, 0xbb, 0x4d, 0xfc, 0x5c, 0xd3, 0xf6, 0x77, 0x07, 0xba, 0xa3, 0x75, 0x0f, 0x37, 0xcf, 0xe6, - 0xe7, 0x91, 0xf9, 0x62, 0x80, 0xcd, 0xda, 0x65, 0x5c, 0x76, 0x0c, 0xf7, 0xbd, 0xe9, 0xc1, 0x58, 0x40, 0x20, 0x31, - 0x43, 0x2f, 0x03, 0x17, 0xb8, 0xc0, 0x5d, 0x61, 0xc0, 0x10, 0xd7, 0xb4, 0xe4, 0x4c, 0x5b, 0xd9, 0xfa, 0xc8, 0xdb, - 0xa8, 0x10, 0xac, 0xeb, 0x8e, 0x9b, 0x24, 0x87, 0xe0, 0x84, 0x2d, 0xf7, 0xbe, 0xf6, 0xda, 0x19, 0xfe, 0x63, 0x20, - 0x9c, 0x5b, 0xa2, 0x67, 0xd4, 0xf6, 0x58, 0xab, 0x7b, 0x0d, 0xaf, 0x72, 0x17, 0x79, 0xd6, 0x6f, 0xe6, 0xa5, 0x61, - 0x5f, 0xf0, 0x5a, 0x0a, 0x0e, 0x8d, 0xed, 0x56, 0xb8, 0xc5, 0xe2, 0x1d, 0xad, 0x56, 0xd6, 0xda, 0x6a, 0xaf, 0x95, - 0x8a, 0xde, 0xbf, 0xe6, 0x38, 0x71, 0x96, 0xc2, 0xf6, 0xc3, 0x87, 0x0b, 0x76, 0x4d, 0x00, 0x83, 0x16, 0x93, 0x05, - 0x4a, 0x50, 0xc9, 0x5a, 0xd5, 0x6e, 0xa7, 0xc4, 0x2f, 0xf7, 0x8b, 0x2e, 0xb3, 0x9d, 0xc7, 0xaf, 0x9b, 0xb4, 0xcf, - 0x7c, 0x8e, 0x7e, 0x98, 0xdf, 0x59, 0x27, 0x25, 0x67, 0x18, 0xd7, 0xf2, 0xff, 0xab, 0xe8, 0x65, 0x91, 0xa5, 0xd1, - 0xc6, 0xf0, 0x60, 0x36, 0xd4, 0xa6, 0x0f, 0x8d, 0x51, 0xb9, 0x65, 0xa3, 0x88, 0x68, 0x75, 0x0b, 0x82, 0x19, 0xc5, - 0x7d, 0x89, 0x36, 0xaf, 0x54, 0x59, 0x78, 0x87, 0xcf, 0x6c, 0xf4, 0x86, 0xed, 0x09, 0xa1, 0x7c, 0xf7, 0xb4, 0x30, - 0xab, 0x96, 0x8a, 0x06, 0xdb, 0x25, 0xbc, 0x8b, 0x51, 0xa5, 0x9f, 0x30, 0xd9, 0xb2, 0x60, 0xaa, 0xff, 0xdf, 0x17, - 0x59, 0xda, 0xa6, 0xe8, 0xc0, 0x74, 0x36, 0x7d, 0x3a, 0xe9, 0x06, 0xd7, 0x19, 0xb0, 0x88, 0x60, 0x4b, 0x85, 0xe3, - 0x51, 0x6a, 0x37, 0x48, 0x98, 0x08, 0x6e, 0xa2, 0x5e, 0x76, 0xb4, 0x4c, 0xc9, 0xaa, 0x80, 0xe7, 0x57, 0xae, 0x32, - 0x1d, 0x47, 0x43, 0xbf, 0x7f, 0x95, 0x9a, 0xd0, 0xaf, 0xd4, 0x4b, 0x55, 0x9c, 0x87, 0x51, 0x75, 0xa8, 0x30, 0x46, - 0x4b, 0x9a, 0xc2, 0x31, 0x98, 0x5d, 0x84, 0x29, 0x5e, 0xce, 0x36, 0x09, 0xfb, 0x82, 0x81, 0x5c, 0x6a, 0x83, 0x7a, - 0x4d, 0x89, 0xd6, 0xac, 0xbd, 0x99, 0x53, 0x42, 0x2f, 0x58, 0xe9, 0xdf, 0x85, 0xd6, 0x20, 0x50, 0x94, 0xcd, 0x94, - 0xe9, 0xb9, 0x6e, 0xe7, 0x05, 0x4d, 0x68, 0x41, 0x57, 0xa4, 0x06, 0x7d, 0xaf, 0x93, 0xb3, 0xa3, 0x93, 0x9d, 0x99, - 0xf5, 0x98, 0x15, 0xc3, 0xc9, 0x34, 0x86, 0x6b, 0x5a, 0xec, 0xae, 0x69, 0xcb, 0xe6, 0x8d, 0xab, 0xb1, 0x71, 0x1a, - 0xb4, 0x0b, 0xa4, 0x6d, 0x9a, 0xdb, 0x4f, 0x3d, 0x6e, 0x7f, 0x5d, 0xb3, 0xe5, 0xb4, 0xb7, 0xde, 0x6e, 0x7b, 0x29, - 0xd8, 0x88, 0x7a, 0x7c, 0xfc, 0x5a, 0x49, 0xd7, 0x2d, 0x97, 0x9f, 0xc2, 0xb3, 0xc7, 0xd7, 0x2f, 0x7d, 0x70, 0x39, - 0x5a, 0xb5, 0xb9, 0xfb, 0xe5, 0x2e, 0xb2, 0xdc, 0x17, 0x0d, 0x2d, 0xd7, 0x33, 0xd4, 0x24, 0xcf, 0x46, 0x7b, 0x87, - 0x5a, 0xb0, 0x9c, 0x75, 0x13, 0x9e, 0x18, 0xec, 0xd8, 0xab, 0xc6, 0xe6, 0xa8, 0xcc, 0x25, 0xab, 0x41, 0x02, 0x7d, - 0x92, 0x67, 0x9a, 0xfe, 0x41, 0x86, 0xf9, 0xe8, 0x96, 0xe6, 0x80, 0x2b, 0x56, 0xd9, 0x4b, 0x06, 0xa9, 0xab, 0xf6, - 0x12, 0x57, 0xbe, 0xc2, 0x21, 0xd9, 0xe0, 0x93, 0x61, 0xaa, 0x3e, 0xbb, 0xe4, 0xc1, 0xff, 0xdb, 0xaa, 0x55, 0x7a, - 0x6e, 0x92, 0x1b, 0x8e, 0x7f, 0x9d, 0xb4, 0x7d, 0x4c, 0x0c, 0x12, 0xf0, 0xd4, 0x2e, 0x86, 0x6a, 0x54, 0x15, 0xb1, - 0x28, 0x73, 0x13, 0x73, 0xec, 0xde, 0xae, 0xa1, 0x83, 0x32, 0xf8, 0x75, 0xc3, 0x27, 0xe6, 0x0e, 0x6c, 0x05, 0x3a, - 0x3a, 0xd1, 0x5c, 0x86, 0x99, 0xb9, 0x0c, 0xd3, 0xae, 0xad, 0x02, 0xc3, 0xab, 0xb6, 0x4a, 0xa2, 0x5c, 0x8d, 0x7a, - 0xdc, 0xcc, 0x52, 0xb3, 0x17, 0x79, 0xf7, 0x9a, 0xf4, 0x24, 0xfe, 0x74, 0xe9, 0xc9, 0xeb, 0x61, 0x40, 0xe4, 0x97, - 0x2c, 0x0d, 0xd7, 0x28, 0x08, 0x4e, 0xad, 0x76, 0x20, 0xcd, 0x47, 0x80, 0xcc, 0x8f, 0xd3, 0xf0, 0x9d, 0x16, 0xe7, - 0x90, 0x8d, 0xd2, 0x38, 0xb1, 0xa5, 0x51, 0x0f, 0xc1, 0x9d, 0xf7, 0x8a, 0xc7, 0x10, 0xf8, 0xf0, 0x03, 0x6e, 0x06, - 0x15, 0xdd, 0x96, 0x98, 0x28, 0x6d, 0x1e, 0x75, 0xcb, 0x47, 0x0d, 0xa1, 0x92, 0x95, 0xe1, 0xc5, 0xd0, 0xde, 0x1d, - 0x81, 0x51, 0xe5, 0x04, 0x32, 0xc3, 0x62, 0xff, 0x60, 0x98, 0x2a, 0x41, 0xd1, 0x50, 0x0e, 0x97, 0x28, 0x07, 0xc4, - 0x24, 0x10, 0x18, 0x15, 0x83, 0x54, 0x57, 0xa6, 0x5e, 0x0c, 0x52, 0x7d, 0xab, 0x22, 0xf5, 0x59, 0x16, 0x56, 0x54, - 0xb7, 0x88, 0x8e, 0xe9, 0x50, 0xd2, 0xa5, 0xd9, 0xa9, 0xb9, 0x96, 0x5e, 0xa8, 0xe5, 0xf8, 0x5c, 0xa7, 0xc1, 0x28, - 0x9e, 0xba, 0x14, 0xfd, 0x56, 0xed, 0x67, 0xff, 0x2d, 0xa6, 0xd4, 0x88, 0x4d, 0xed, 0x2d, 0x62, 0x58, 0xb5, 0x1f, - 0xb2, 0x2a, 0x07, 0xed, 0x2e, 0x28, 0x1b, 0x2b, 0xe3, 0x3c, 0xdf, 0x08, 0x66, 0x0e, 0xda, 0xc6, 0xaa, 0xe9, 0x43, - 0x6f, 0xc4, 0xa8, 0xbd, 0x31, 0xd5, 0xb8, 0x27, 0xf0, 0xd3, 0x06, 0x4d, 0xf7, 0x22, 0xcf, 0x51, 0x8f, 0xbc, 0xfb, - 0x9f, 0x39, 0xb2, 0x33, 0xf9, 0x2c, 0x96, 0x49, 0xdd, 0x3e, 0x26, 0xc1, 0x42, 0xd5, 0x31, 0xba, 0x70, 0x23, 0x53, - 0xda, 0xcf, 0x9d, 0xe9, 0x47, 0x3c, 0x93, 0x87, 0xed, 0xd0, 0xa8, 0x2f, 0x0d, 0x6b, 0x49, 0x11, 0xf5, 0x05, 0xbd, - 0x35, 0xd5, 0xd1, 0x01, 0xf5, 0x3a, 0x02, 0xab, 0x2b, 0xda, 0xa0, 0x06, 0x60, 0x32, 0xae, 0x6d, 0x6d, 0x3e, 0x07, - 0x53, 0x5b, 0x55, 0xc1, 0x33, 0xba, 0x2b, 0x94, 0xee, 0x4d, 0xea, 0xba, 0x35, 0xc4, 0x16, 0x30, 0x20, 0x70, 0xa3, - 0xa7, 0xa6, 0x3f, 0x68, 0xa2, 0x02, 0xd0, 0xa0, 0x71, 0x3b, 0xd3, 0x39, 0x12, 0xfd, 0x4e, 0x6d, 0xda, 0x66, 0xaa, - 0x57, 0x95, 0x0f, 0xa0, 0xe2, 0xcf, 0xd2, 0xd9, 0x85, 0x19, 0xb1, 0x00, 0xc6, 0x3d, 0x70, 0xa6, 0x7a, 0xc7, 0x19, - 0x58, 0x4f, 0xe4, 0x79, 0x56, 0xf2, 0x44, 0x0a, 0x98, 0x11, 0x79, 0x75, 0x25, 0x05, 0x0c, 0x83, 0x1a, 0x00, 0xb4, - 0x68, 0x2e, 0xa3, 0x09, 0x7f, 0x52, 0xd3, 0xfb, 0xf2, 0xf0, 0x27, 0x3a, 0xd7, 0x37, 0xe3, 0x1a, 0x0c, 0x95, 0xd7, - 0x15, 0xdf, 0xc9, 0xf4, 0x0d, 0x7f, 0xea, 0x65, 0x5a, 0xca, 0x75, 0xb1, 0x93, 0xe5, 0xc9, 0x37, 0xfc, 0x99, 0xce, - 0x73, 0xf0, 0xb4, 0xa6, 0x69, 0x7c, 0xb7, 0x93, 0xe5, 0xef, 0xdf, 0x3c, 0xb5, 0x79, 0x9e, 0x8c, 0x6b, 0x7a, 0xc3, - 0xf9, 0x47, 0x97, 0x69, 0xa2, 0xab, 0x1a, 0x3f, 0xfd, 0xbb, 0xcd, 0xf5, 0xb4, 0xa6, 0x57, 0x52, 0x54, 0xcb, 0x9d, - 0xa2, 0x0e, 0xbe, 0x39, 0xf8, 0x3b, 0xff, 0xc6, 0x74, 0xef, 0xa0, 0xa6, 0x7f, 0xad, 0xe3, 0xa2, 0xe2, 0xc5, 0x4e, - 0x71, 0x7f, 0xfb, 0xfb, 0xdf, 0x9f, 0xda, 0x8c, 0x4f, 0x6b, 0x7a, 0xc7, 0xe3, 0x8e, 0xb6, 0x4f, 0x9e, 0x3d, 0xe5, - 0x7f, 0xab, 0x6b, 0xfa, 0x2b, 0xf3, 0x83, 0xa3, 0x1e, 0x67, 0x9e, 0x1e, 0x3e, 0x91, 0x4d, 0xd4, 0x80, 0xa1, 0x87, - 0x06, 0x90, 0x4b, 0xab, 0xa6, 0xb9, 0xc7, 0x2b, 0x17, 0xdc, 0xbe, 0xcf, 0xe2, 0x34, 0x5e, 0xc1, 0x41, 0xb0, 0x41, - 0xe3, 0xac, 0x02, 0x38, 0x55, 0xe0, 0x3d, 0xa3, 0x92, 0x66, 0xa5, 0xfc, 0x07, 0xe7, 0x1f, 0x61, 0xd0, 0x10, 0xd2, - 0x46, 0x45, 0x06, 0x3a, 0x59, 0xe9, 0xc8, 0x46, 0xe8, 0xbf, 0xd9, 0x8c, 0x83, 0xe3, 0xc3, 0xe8, 0xf5, 0xfb, 0x61, - 0xc1, 0x44, 0x58, 0x10, 0x42, 0xff, 0x0c, 0x0b, 0x70, 0x28, 0x29, 0x98, 0x97, 0xcf, 0xf8, 0x9e, 0x6b, 0xa3, 0xb0, - 0x10, 0x44, 0x77, 0x91, 0x7d, 0x40, 0xd5, 0xa3, 0xef, 0xd0, 0x0d, 0xf1, 0xb2, 0xc2, 0x82, 0xa1, 0x55, 0x0d, 0xcc, - 0x10, 0x14, 0xff, 0x86, 0x87, 0x12, 0x7c, 0xe2, 0x01, 0x3e, 0x7a, 0x4c, 0x66, 0x5c, 0x5d, 0x6b, 0x4f, 0x2e, 0xc2, - 0x82, 0x06, 0xba, 0xed, 0x10, 0x74, 0x20, 0xf2, 0x5f, 0x80, 0xa7, 0xc0, 0xc0, 0x87, 0x85, 0x5d, 0xca, 0x5d, 0x7f, - 0xf5, 0x5f, 0x0d, 0xeb, 0xe8, 0xc2, 0x8f, 0xfe, 0x6a, 0x5d, 0xd8, 0x33, 0x32, 0x95, 0x87, 0xe5, 0x70, 0x32, 0x1d, - 0x0c, 0xa4, 0x8b, 0xe3, 0x76, 0x9c, 0xcd, 0x7f, 0x9d, 0xcb, 0xc5, 0x02, 0x75, 0xdf, 0x38, 0xaf, 0x33, 0xfd, 0x37, - 0xd2, 0xce, 0x07, 0x6f, 0x8e, 0x7f, 0x3f, 0x3b, 0x3d, 0x7e, 0x05, 0xce, 0x07, 0x1f, 0x5e, 0x7e, 0xff, 0xf2, 0xbd, - 0x0a, 0xee, 0xae, 0xe6, 0xbc, 0xdf, 0x77, 0x52, 0x9f, 0x90, 0x0f, 0x2b, 0xb2, 0x1f, 0xc6, 0x8f, 0x0b, 0x65, 0xf4, - 0x40, 0x0e, 0x99, 0x85, 0x42, 0x86, 0x2a, 0x6a, 0xfb, 0xbb, 0x1c, 0x4e, 0x3c, 0x30, 0x8b, 0xbb, 0x86, 0x08, 0xd7, - 0x6f, 0xb9, 0x0d, 0xb2, 0x26, 0x8f, 0xbc, 0x7e, 0x70, 0x32, 0x95, 0x8e, 0x2d, 0x2c, 0x18, 0x94, 0x0d, 0x6d, 0x3a, - 0xce, 0xe6, 0xc5, 0xc2, 0xb6, 0xcb, 0x2d, 0x90, 0x51, 0x9a, 0x5d, 0x5c, 0x84, 0x0a, 0xba, 0xfa, 0x08, 0x34, 0x00, - 0xa6, 0x51, 0x85, 0x6b, 0x11, 0x9f, 0xf9, 0xe5, 0x47, 0x63, 0xaf, 0x79, 0xb7, 0xa8, 0x7b, 0x32, 0xcd, 0xaa, 0x1a, - 0x03, 0x3a, 0x98, 0x50, 0xee, 0x06, 0xdd, 0x04, 0x93, 0x51, 0x6d, 0xf9, 0x75, 0x5e, 0x2d, 0x4c, 0x73, 0xdc, 0x30, - 0x54, 0x5e, 0xc9, 0x6b, 0xd9, 0x40, 0x64, 0x20, 0x19, 0x86, 0x3d, 0x1a, 0xa3, 0x48, 0x7d, 0x6f, 0xd7, 0x3b, 0x7e, - 0x93, 0x4b, 0x88, 0xa6, 0x98, 0x81, 0x74, 0xfe, 0x58, 0x28, 0xe7, 0x72, 0xc9, 0xf8, 0x5c, 0x2c, 0x8e, 0xc0, 0xed, - 0x7c, 0x2e, 0x16, 0x11, 0x06, 0xe5, 0xcb, 0x20, 0x56, 0x09, 0xd8, 0xbd, 0x38, 0x08, 0xdf, 0x4e, 0x68, 0x03, 0xbb, - 0x81, 0x24, 0x1b, 0x94, 0x76, 0xa5, 0x21, 0xca, 0x9d, 0xf2, 0x68, 0x83, 0xc8, 0x43, 0xac, 0x9a, 0x57, 0x6d, 0x4f, - 0x36, 0x73, 0x31, 0xc1, 0x55, 0x16, 0x33, 0x39, 0x8d, 0x0f, 0x59, 0x31, 0x8d, 0xa1, 0x94, 0x38, 0x4d, 0xc3, 0x98, - 0x4e, 0xa8, 0x20, 0x24, 0x61, 0x7c, 0x1e, 0x2f, 0x68, 0x82, 0x52, 0x82, 0x10, 0x42, 0x7e, 0x8c, 0xd0, 0x36, 0x07, - 0x96, 0xbc, 0xdd, 0x7e, 0x9e, 0x7e, 0x6e, 0xc7, 0x70, 0x19, 0x15, 0xa1, 0x1b, 0x74, 0xd6, 0xf0, 0x6f, 0x44, 0x05, - 0x8d, 0xb1, 0x62, 0x08, 0x02, 0x5e, 0x60, 0x54, 0xc2, 0x82, 0xc4, 0xac, 0x82, 0x28, 0x02, 0xe5, 0x3c, 0x5e, 0xb0, - 0x82, 0x36, 0x6d, 0x4e, 0x63, 0x6d, 0x12, 0xd4, 0x73, 0x58, 0x6a, 0x7b, 0x52, 0xa9, 0x10, 0x7b, 0x7c, 0x26, 0xa2, - 0x6b, 0x6d, 0x68, 0x00, 0x28, 0x50, 0x4a, 0x2e, 0x7e, 0xf3, 0xe5, 0x1e, 0x6e, 0x0a, 0xfa, 0x9f, 0x6d, 0x4c, 0xb4, - 0xb3, 0x5c, 0x1d, 0x7a, 0xf3, 0x05, 0x8d, 0xf3, 0x1c, 0x42, 0xb1, 0x19, 0x04, 0x72, 0x91, 0x55, 0x10, 0xd1, 0xe2, - 0x2e, 0x30, 0x21, 0xe1, 0xa0, 0x4d, 0xbf, 0x42, 0x6a, 0x43, 0x4c, 0xae, 0x3c, 0x31, 0xb0, 0xdb, 0x2a, 0x41, 0xc0, - 0x91, 0x9e, 0x67, 0x9f, 0x9a, 0x18, 0x6b, 0x9a, 0x9a, 0x99, 0x78, 0x1b, 0x0a, 0xd1, 0xa0, 0x05, 0xd1, 0x0c, 0xde, - 0x3f, 0x57, 0x1c, 0xaf, 0x3a, 0xf0, 0x03, 0xde, 0xb9, 0x38, 0xf3, 0x6a, 0xe6, 0x11, 0x39, 0xf5, 0x51, 0x8e, 0xe8, - 0x97, 0x3c, 0xac, 0x46, 0x3a, 0x19, 0x63, 0x25, 0x71, 0xd0, 0xdb, 0x60, 0xc1, 0x9c, 0xd0, 0x15, 0x0f, 0x2d, 0x1f, - 0xff, 0x0a, 0x99, 0x8c, 0x92, 0x1a, 0x2b, 0xba, 0xd2, 0x62, 0xc4, 0x79, 0x0d, 0xb3, 0x34, 0x59, 0xd1, 0xc5, 0x42, - 0x93, 0x66, 0xa1, 0x4c, 0x03, 0x7c, 0x02, 0x2d, 0x46, 0xee, 0xa1, 0xa6, 0x0d, 0x84, 0x86, 0xdd, 0x21, 0xe0, 0x23, - 0xf7, 0xd0, 0xe1, 0xff, 0xe7, 0xd9, 0x05, 0x22, 0xed, 0xcd, 0x4d, 0x64, 0x3c, 0x52, 0x37, 0x70, 0x50, 0x8c, 0x8f, - 0x7d, 0x33, 0xf1, 0x0b, 0x67, 0xf4, 0x21, 0xa9, 0x7c, 0x87, 0x0f, 0x96, 0x3f, 0xde, 0xd4, 0xcc, 0xca, 0x08, 0xd6, - 0xc3, 0x76, 0x8b, 0x0b, 0xa2, 0xed, 0x02, 0x48, 0x3d, 0xe3, 0xd5, 0xc2, 0x37, 0x5e, 0x8d, 0xef, 0x31, 0x5e, 0x75, - 0x67, 0x6a, 0x98, 0x93, 0x0d, 0xea, 0xb3, 0x94, 0x3c, 0x3f, 0x47, 0x99, 0x60, 0xd3, 0xe5, 0xac, 0xa4, 0x2a, 0x95, - 0xd0, 0x5e, 0xec, 0x67, 0x8c, 0x6f, 0x09, 0xc6, 0x59, 0x71, 0x18, 0x09, 0x54, 0xa5, 0x92, 0x3a, 0xec, 0x15, 0xa0, - 0x1e, 0x83, 0xf7, 0x06, 0x43, 0xd4, 0xc8, 0xd8, 0x4d, 0x1b, 0x08, 0x0d, 0x8d, 0xf5, 0x68, 0xcf, 0x5a, 0x8f, 0x6e, - 0xb7, 0x95, 0xf1, 0xb7, 0x93, 0xeb, 0x22, 0x41, 0x54, 0x61, 0x35, 0x9a, 0x00, 0x6f, 0x9a, 0xd8, 0xdb, 0x92, 0x53, - 0x5a, 0x60, 0xf8, 0xec, 0x3f, 0xc3, 0xd2, 0xa9, 0x24, 0x4a, 0x32, 0x2b, 0xa3, 0x81, 0x3b, 0x07, 0x5f, 0xc4, 0x15, - 0xac, 0x01, 0x88, 0xe4, 0x88, 0x1e, 0xae, 0x7f, 0x86, 0xd2, 0x65, 0x96, 0x64, 0x26, 0x21, 0x33, 0x17, 0x69, 0x3b, - 0xeb, 0x60, 0xe2, 0x4c, 0x6a, 0xbd, 0xb1, 0x90, 0x43, 0x83, 0xfc, 0x00, 0xca, 0x10, 0x87, 0x4f, 0x3e, 0x98, 0x50, - 0xa9, 0x42, 0xa9, 0x36, 0xba, 0xd9, 0x0d, 0xbc, 0xf2, 0x21, 0xbb, 0xe2, 0x65, 0x15, 0x5f, 0xad, 0x8c, 0x25, 0x31, - 0x67, 0xf7, 0xb9, 0xed, 0x51, 0x61, 0x5e, 0xbd, 0x7d, 0xf9, 0xfd, 0x71, 0xe3, 0xd5, 0x2e, 0xe2, 0x68, 0x08, 0xb6, - 0x15, 0x63, 0x8c, 0xde, 0xe2, 0xd3, 0x60, 0xa2, 0x5c, 0x23, 0xd0, 0xbb, 0x14, 0xf4, 0xdb, 0x5f, 0xea, 0x09, 0x78, - 0xc5, 0xf5, 0xf2, 0x4b, 0x3e, 0x02, 0x96, 0xa8, 0xd0, 0xb3, 0xc2, 0xdc, 0xac, 0xcc, 0xee, 0xed, 0x56, 0x64, 0xa6, - 0x5d, 0x69, 0x64, 0x20, 0x5e, 0x6d, 0x87, 0xb1, 0x70, 0xe9, 0x9a, 0x6e, 0x07, 0xbb, 0x5a, 0x7a, 0x96, 0xc8, 0xdb, - 0x6d, 0x09, 0x1d, 0xb2, 0x03, 0xee, 0xbd, 0x8c, 0x6f, 0xe1, 0x65, 0xe9, 0x75, 0xb3, 0x19, 0x3c, 0x01, 0xcc, 0x84, - 0x0b, 0x67, 0x59, 0x1c, 0x33, 0x9e, 0x84, 0x2a, 0x36, 0x57, 0x43, 0xe4, 0xad, 0x08, 0xad, 0xd9, 0x5f, 0xa1, 0x18, - 0x81, 0xdd, 0xc9, 0xe9, 0xc7, 0x6c, 0x35, 0x5b, 0x02, 0x6a, 0xfe, 0x55, 0x26, 0x80, 0xe6, 0xda, 0xb5, 0x60, 0x9b, - 0x42, 0x9b, 0xeb, 0xfa, 0x79, 0xbc, 0x8a, 0x13, 0x50, 0xdd, 0x80, 0xb7, 0xc8, 0x9d, 0x16, 0x5d, 0x19, 0x74, 0x51, - 0xfa, 0x40, 0x39, 0x96, 0x14, 0x3a, 0xfa, 0xde, 0x13, 0xea, 0xdc, 0x33, 0x80, 0x4b, 0x1a, 0x35, 0x4f, 0xb5, 0x94, - 0xb1, 0x00, 0x58, 0xe8, 0x60, 0xa6, 0xc8, 0x56, 0x74, 0x6b, 0x30, 0x29, 0xe0, 0xad, 0x01, 0xfe, 0x10, 0x59, 0xa5, - 0xee, 0x8a, 0x65, 0x58, 0x7a, 0xf6, 0xd7, 0xfd, 0x7e, 0xec, 0xd9, 0x5f, 0x5f, 0x68, 0x5a, 0x17, 0xb7, 0x1b, 0x40, - 0x6a, 0x0c, 0x20, 0x72, 0xac, 0x07, 0xc2, 0x44, 0x14, 0x6b, 0xfa, 0xfe, 0x1d, 0x9b, 0x2c, 0x0a, 0x84, 0x7e, 0xa7, - 0x5e, 0x4f, 0x4a, 0x02, 0x3a, 0xb5, 0x8a, 0x1d, 0x0d, 0xb4, 0xd9, 0x07, 0x04, 0x44, 0xf5, 0x33, 0xb2, 0xf9, 0x42, - 0x39, 0x17, 0xab, 0xf0, 0xe1, 0x63, 0x0a, 0x01, 0x85, 0x3b, 0x6a, 0x74, 0xde, 0x86, 0x48, 0xa0, 0xac, 0x50, 0xc4, - 0x9a, 0x17, 0x6b, 0x49, 0xc8, 0x7c, 0xbc, 0x40, 0xc1, 0x95, 0x03, 0x76, 0xe5, 0x6c, 0x32, 0x2c, 0x23, 0xce, 0xc2, - 0xfb, 0xbf, 0x99, 0x2c, 0x08, 0x6a, 0xae, 0xfc, 0x40, 0x8e, 0x3b, 0x99, 0x1a, 0x7b, 0xaa, 0x51, 0x83, 0x60, 0x32, - 0x82, 0xc0, 0x70, 0xc3, 0x2f, 0xf8, 0xf8, 0x60, 0x41, 0x40, 0x45, 0x66, 0xcd, 0x42, 0xcc, 0x8b, 0xc3, 0x27, 0x80, - 0x1a, 0x33, 0x3a, 0x78, 0x06, 0xa0, 0xb0, 0x10, 0x10, 0x7d, 0x0c, 0x32, 0x5a, 0x01, 0xbf, 0x85, 0xfa, 0xdd, 0x3a, - 0xf1, 0x7d, 0xe8, 0x57, 0x41, 0x2f, 0x62, 0x60, 0x38, 0xa2, 0xc9, 0x7e, 0xc8, 0x07, 0x93, 0x01, 0x68, 0x4b, 0xbc, - 0xdd, 0xd7, 0xd2, 0x8a, 0x9b, 0xd3, 0xa5, 0xd3, 0xfd, 0x93, 0x36, 0x41, 0x12, 0xa9, 0x64, 0xa5, 0x22, 0x06, 0x10, - 0xca, 0x52, 0x6d, 0x93, 0x25, 0x58, 0x56, 0x98, 0x25, 0xcd, 0x0d, 0x4a, 0xe2, 0xee, 0x66, 0xe0, 0x18, 0x35, 0xeb, - 0x38, 0x2c, 0x5b, 0x6e, 0xd4, 0x00, 0x9f, 0x93, 0xb0, 0xc2, 0xde, 0x70, 0x66, 0xd2, 0x3b, 0xd3, 0xe1, 0xea, 0x98, - 0xb3, 0x37, 0x1c, 0xc1, 0x38, 0x12, 0xbc, 0xf1, 0xd0, 0x25, 0xd3, 0x50, 0x91, 0x29, 0xe3, 0x60, 0xda, 0x03, 0xdc, - 0x7b, 0x0e, 0xc6, 0x61, 0x6c, 0x50, 0x59, 0x52, 0x9f, 0x7a, 0x77, 0x21, 0x10, 0xa4, 0xb5, 0x5e, 0xe6, 0x33, 0x3c, - 0x3d, 0x23, 0x94, 0xfd, 0x21, 0x87, 0x2f, 0xc0, 0x8e, 0x82, 0x1c, 0x4d, 0xf8, 0xb3, 0xc7, 0xbb, 0x81, 0xaa, 0xf8, - 0x20, 0xd8, 0x8b, 0x45, 0xba, 0x17, 0x0c, 0x04, 0xfc, 0x2a, 0xf8, 0x5e, 0x25, 0xe5, 0xde, 0x45, 0x5c, 0xec, 0xc5, - 0xab, 0xb8, 0xa8, 0xf6, 0x6e, 0xb2, 0x6a, 0xb9, 0x67, 0x3a, 0x04, 0xd0, 0xbc, 0xc1, 0x20, 0x1e, 0x04, 0x7b, 0xc1, - 0xa0, 0x30, 0x53, 0xbb, 0x62, 0x65, 0xe3, 0x38, 0x33, 0x21, 0xca, 0x82, 0x66, 0x80, 0xb0, 0xc6, 0x69, 0x00, 0x7c, - 0xea, 0x9a, 0xa5, 0xf4, 0x02, 0xc3, 0x0d, 0x88, 0xe9, 0x1a, 0xfa, 0x00, 0x3c, 0xf2, 0x9a, 0xc6, 0xb0, 0x04, 0x2e, - 0x06, 0x03, 0xb2, 0x86, 0xc8, 0x05, 0x6b, 0x6a, 0x83, 0x38, 0x84, 0x6b, 0x65, 0xa7, 0xbd, 0x0b, 0xcc, 0xb4, 0xdd, - 0x02, 0xa2, 0xf2, 0x84, 0xf4, 0xfb, 0xf6, 0x1b, 0xea, 0x5f, 0xb0, 0x97, 0x60, 0x7f, 0x55, 0x54, 0x61, 0x22, 0x95, - 0xe6, 0xfb, 0x92, 0x1d, 0x0d, 0x54, 0xc4, 0xe1, 0x1d, 0x47, 0x8a, 0x36, 0x2a, 0x97, 0x65, 0x4f, 0x96, 0x0d, 0x5f, - 0x89, 0x2b, 0xee, 0xfc, 0xb8, 0x2a, 0x29, 0xf3, 0x2a, 0x5b, 0x29, 0xf6, 0x6f, 0xc6, 0x35, 0xf7, 0x07, 0xd6, 0x9f, - 0xcd, 0x57, 0x70, 0x6d, 0xf5, 0xde, 0x35, 0xb9, 0x46, 0xe4, 0x2c, 0xa1, 0x5c, 0x52, 0xdb, 0x3c, 0xbc, 0xa5, 0xef, - 0xf3, 0xab, 0x6f, 0x33, 0x9d, 0xc6, 0x67, 0x15, 0x16, 0x2e, 0x44, 0x2b, 0x82, 0x43, 0x43, 0x2e, 0x9a, 0x47, 0x80, - 0xb9, 0xf6, 0xd9, 0x0a, 0x0a, 0x52, 0x9f, 0x55, 0xe8, 0xdd, 0x0a, 0x09, 0xaf, 0x34, 0xbb, 0xf4, 0x30, 0x90, 0x32, - 0x6e, 0x0f, 0x2d, 0x61, 0xd2, 0xf2, 0x22, 0xbc, 0xf7, 0x9a, 0x9b, 0xdc, 0x8b, 0x10, 0xa3, 0x17, 0x79, 0x76, 0x02, - 0xc6, 0xba, 0x4b, 0x76, 0x36, 0x3c, 0xf1, 0x1b, 0x9e, 0xb3, 0x16, 0x8d, 0xa6, 0x4b, 0x96, 0xf4, 0xfb, 0x31, 0x98, - 0x78, 0xa7, 0x2c, 0x87, 0x5f, 0xf9, 0x82, 0xae, 0x19, 0x60, 0x8a, 0xd1, 0x0b, 0x48, 0x48, 0x11, 0x89, 0x64, 0xad, - 0x4e, 0x92, 0xcf, 0x74, 0x17, 0x80, 0xd1, 0x2f, 0x66, 0x69, 0xb4, 0xbc, 0xd7, 0xcc, 0x02, 0xc9, 0x33, 0xf4, 0x5d, - 0x07, 0xdb, 0x1b, 0xfb, 0x20, 0xe5, 0xfc, 0x50, 0x4c, 0x07, 0x03, 0x4e, 0x34, 0xdc, 0x78, 0xa9, 0xc4, 0xb5, 0xba, - 0xc5, 0x1d, 0xc3, 0x58, 0xea, 0xdb, 0x22, 0x06, 0x07, 0xec, 0xa2, 0x95, 0xdd, 0x3e, 0xc0, 0xbe, 0x72, 0xbc, 0x4b, - 0x95, 0xdd, 0xe9, 0x31, 0xd3, 0x5c, 0xb6, 0x9a, 0x74, 0x52, 0x71, 0x3f, 0x91, 0x6f, 0x72, 0x07, 0x5d, 0x2e, 0xc7, - 0x9a, 0xb7, 0x1c, 0x80, 0x8a, 0x7e, 0xa4, 0xa8, 0xee, 0x17, 0x38, 0xc2, 0x3c, 0x58, 0xb7, 0xf9, 0x64, 0xdf, 0x14, - 0x38, 0x44, 0x9e, 0xb4, 0xd1, 0x14, 0xd0, 0xbd, 0x8b, 0xc7, 0x5d, 0xfd, 0xb6, 0x74, 0x17, 0x28, 0xd1, 0x4e, 0xc5, - 0x0d, 0x3f, 0x26, 0xea, 0x74, 0xa6, 0x0d, 0xa1, 0x7f, 0x65, 0xc4, 0xfd, 0xa5, 0x71, 0x15, 0x6f, 0x7a, 0x97, 0xcf, - 0x38, 0xd4, 0xd9, 0x0d, 0xa1, 0x00, 0x5c, 0xb5, 0xa7, 0x53, 0x37, 0x86, 0xf4, 0x4a, 0x89, 0x6e, 0x83, 0x83, 0xdd, - 0xeb, 0x33, 0x8e, 0xa2, 0x1f, 0xa3, 0x46, 0xbe, 0x89, 0xc4, 0x63, 0x39, 0x88, 0x1f, 0x17, 0x74, 0x19, 0x89, 0xc7, - 0xc5, 0x20, 0x7e, 0x2c, 0xeb, 0x7a, 0xf7, 0x5c, 0xb9, 0xbf, 0x8f, 0xc8, 0xb3, 0xee, 0xec, 0xa5, 0x12, 0x36, 0x06, - 0x9e, 0x5d, 0x0b, 0x08, 0xa7, 0xe0, 0x89, 0x6c, 0x2d, 0x7d, 0xe8, 0xdc, 0xee, 0x63, 0xcb, 0x24, 0x41, 0xd0, 0xf3, - 0x36, 0x9b, 0x44, 0xb1, 0xb3, 0xcd, 0xa3, 0x0f, 0xa7, 0x40, 0x42, 0xb7, 0xdb, 0x66, 0x5d, 0xad, 0x01, 0xc5, 0x34, - 0x1c, 0xf3, 0xfd, 0x62, 0x74, 0xe3, 0xbb, 0xeb, 0xef, 0x17, 0xa3, 0x25, 0x19, 0x4e, 0xcc, 0xe4, 0xc7, 0x47, 0xe3, - 0x59, 0x1c, 0x4d, 0xea, 0x8e, 0xd3, 0x42, 0xe3, 0x9f, 0x7a, 0xb7, 0x50, 0x04, 0x4e, 0xc5, 0x08, 0x8e, 0x9c, 0x0a, - 0xe5, 0xa4, 0xd4, 0xc0, 0xf0, 0xdf, 0xab, 0x76, 0xb4, 0x69, 0x6f, 0xe2, 0x2a, 0x59, 0x66, 0xe2, 0x52, 0x87, 0x0f, - 0xd7, 0xd1, 0xc5, 0x6d, 0x40, 0x3b, 0xef, 0x32, 0xed, 0xf8, 0x75, 0xd2, 0xa0, 0x27, 0xae, 0x66, 0x06, 0xdc, 0xba, - 0x1f, 0xa1, 0x19, 0x02, 0xa3, 0xe5, 0xf9, 0x3b, 0xc4, 0xdc, 0xfe, 0x4d, 0xd9, 0xfc, 0x2a, 0xda, 0xe7, 0xc8, 0x48, - 0xd9, 0x26, 0x23, 0x15, 0x18, 0x61, 0x4a, 0x91, 0xc4, 0x55, 0x08, 0x81, 0xec, 0xbf, 0xa4, 0xb8, 0x16, 0x4b, 0xef, - 0x35, 0x08, 0x13, 0x6c, 0x17, 0xb4, 0x5f, 0xdd, 0xce, 0x6d, 0xa5, 0xc5, 0x1e, 0xa9, 0xef, 0x73, 0x67, 0xbb, 0xa2, - 0xc9, 0xdf, 0x97, 0x0d, 0x68, 0x03, 0x88, 0xf2, 0xbe, 0x3e, 0x2a, 0x81, 0x93, 0x11, 0x37, 0x94, 0x18, 0xbd, 0xa0, - 0xab, 0x13, 0xb9, 0x67, 0xa7, 0xe6, 0x4d, 0xc5, 0x4c, 0xc5, 0x95, 0x6f, 0xf6, 0xcc, 0x7f, 0x30, 0x14, 0x54, 0x80, - 0x81, 0xb7, 0x39, 0xe3, 0xd1, 0x81, 0xee, 0xc6, 0xe8, 0xb4, 0x60, 0xb3, 0xa0, 0x2e, 0xeb, 0xa6, 0x8d, 0x07, 0x8d, - 0x38, 0x28, 0x8a, 0x55, 0xa1, 0x46, 0xc2, 0x13, 0x81, 0x80, 0x29, 0xbb, 0xe2, 0x91, 0x11, 0xd4, 0xf4, 0x26, 0x14, - 0x36, 0x14, 0xfc, 0x55, 0xa2, 0x9a, 0xde, 0x84, 0x36, 0x99, 0x38, 0xcd, 0x20, 0x82, 0x19, 0xb1, 0xdd, 0x6f, 0x01, - 0x6d, 0x6e, 0xcd, 0x68, 0x53, 0xd7, 0x56, 0x5b, 0x85, 0x5c, 0x52, 0xa4, 0x2c, 0xff, 0x9d, 0x9a, 0x0a, 0x4a, 0x6a, - 0xb9, 0xe8, 0x4d, 0x9a, 0x2e, 0x7a, 0x3c, 0x33, 0x92, 0x40, 0xe5, 0x96, 0x3b, 0x46, 0x7f, 0x08, 0x0b, 0x3c, 0x62, - 0xe2, 0xc4, 0x82, 0xb9, 0xd5, 0x11, 0xcb, 0xe6, 0x62, 0x31, 0x5a, 0x49, 0x08, 0x1b, 0x7c, 0xc8, 0xb2, 0x79, 0xa9, - 0x1f, 0x42, 0x5f, 0x58, 0x7a, 0x02, 0x76, 0xb1, 0xc1, 0x4a, 0x96, 0x01, 0xf8, 0x5e, 0xd0, 0xcd, 0x4a, 0x96, 0x91, - 0x54, 0xdd, 0x8f, 0x6b, 0x2c, 0x41, 0xa5, 0x15, 0x2a, 0x2d, 0xa9, 0xb1, 0x20, 0xf0, 0x55, 0xd5, 0xe5, 0x43, 0xb2, - 0xab, 0x40, 0x3d, 0x75, 0xd4, 0x80, 0x53, 0xa0, 0xaa, 0xc0, 0x82, 0x24, 0xa8, 0x0c, 0x5d, 0x15, 0x98, 0x56, 0x60, - 0x9a, 0xa9, 0xc2, 0x45, 0x99, 0x1d, 0x4a, 0xb3, 0x5e, 0xf2, 0x59, 0x3c, 0x08, 0x93, 0x61, 0x4c, 0x1e, 0x23, 0xd4, - 0xfe, 0x7e, 0x1e, 0xc5, 0x5a, 0x2e, 0xb9, 0x72, 0x7e, 0xf1, 0x37, 0x9f, 0xb1, 0xd7, 0x3d, 0xc3, 0x60, 0x01, 0xce, - 0xd2, 0xf6, 0x2a, 0x13, 0xef, 0x64, 0x2b, 0x38, 0x0e, 0x66, 0x51, 0x0e, 0xab, 0x9e, 0x1c, 0xd1, 0x5c, 0xe4, 0xda, - 0xbb, 0x08, 0x91, 0x83, 0xcc, 0x1e, 0x03, 0xec, 0x46, 0xf8, 0x3a, 0xb4, 0x36, 0xb7, 0xba, 0x42, 0xfc, 0x8d, 0x12, - 0x89, 0x9f, 0xa5, 0xfc, 0xb8, 0x5e, 0xa9, 0x5c, 0x95, 0xc1, 0x63, 0xd5, 0xcd, 0xe0, 0x99, 0xf6, 0x3d, 0xd6, 0xfe, - 0xad, 0xed, 0xe6, 0x78, 0xef, 0xc1, 0x83, 0xd6, 0xff, 0xd6, 0x93, 0x10, 0xda, 0x2b, 0x27, 0xa9, 0x3b, 0x6a, 0xf4, - 0xcc, 0x64, 0x8d, 0xa8, 0x84, 0xa9, 0xdd, 0xa9, 0x1c, 0x03, 0x35, 0x1d, 0xc0, 0xb5, 0x44, 0x4d, 0xd0, 0x93, 0x82, - 0x8d, 0xe1, 0x88, 0xb3, 0x38, 0x68, 0x87, 0x31, 0x8a, 0x97, 0x73, 0x25, 0x5e, 0xce, 0x8f, 0x18, 0x07, 0x68, 0x2d, - 0x40, 0xaa, 0xd7, 0xb0, 0x9f, 0xb9, 0x82, 0x05, 0x36, 0x77, 0xbe, 0x03, 0x0b, 0x64, 0x88, 0x93, 0xcd, 0x71, 0xb2, - 0xc7, 0xb5, 0x9e, 0x7b, 0x81, 0x8f, 0x93, 0x7a, 0xe1, 0xd5, 0x55, 0xb6, 0xeb, 0x5a, 0xb2, 0x72, 0x5e, 0x0c, 0x26, - 0x10, 0x94, 0xa5, 0x9c, 0x17, 0xc3, 0xc9, 0x82, 0xe6, 0xf0, 0x63, 0xd1, 0x40, 0x87, 0x58, 0x0e, 0x12, 0xb8, 0x74, - 0xf6, 0x18, 0xf0, 0x86, 0x52, 0x8b, 0xbb, 0xb1, 0x8e, 0x1c, 0xeb, 0x28, 0xf6, 0xc3, 0x18, 0x70, 0x65, 0x9d, 0xc0, - 0xfb, 0xfe, 0xeb, 0x63, 0x13, 0x90, 0x55, 0xbb, 0xc2, 0xab, 0x51, 0xee, 0xba, 0xd2, 0xe8, 0x4b, 0x4a, 0x4f, 0x78, - 0xc1, 0x53, 0xc9, 0x76, 0xdb, 0x33, 0x70, 0xb6, 0xc4, 0x43, 0xe2, 0x1d, 0x23, 0x7a, 0x31, 0x6d, 0x64, 0xe6, 0x04, - 0xce, 0x6c, 0x77, 0xd9, 0xc6, 0xfc, 0xd8, 0x01, 0x0e, 0x16, 0x41, 0x48, 0xdc, 0x10, 0x86, 0x89, 0x1d, 0x95, 0x43, - 0x2d, 0x84, 0xeb, 0x5a, 0x78, 0x1d, 0xa7, 0x65, 0x0c, 0x2e, 0xd2, 0xda, 0x36, 0xf1, 0x1e, 0xba, 0xee, 0xf9, 0x31, - 0xb7, 0x3a, 0x46, 0x5b, 0x48, 0xbf, 0x1d, 0x9d, 0xde, 0x73, 0x18, 0x80, 0xa6, 0x07, 0xb3, 0xaa, 0x7d, 0x26, 0x71, - 0x73, 0xda, 0x09, 0x42, 0x22, 0x10, 0x45, 0xe9, 0x8c, 0x30, 0xfd, 0x3b, 0xcd, 0x65, 0x15, 0xad, 0x1e, 0xe4, 0x99, - 0x43, 0x9e, 0x85, 0xde, 0xf6, 0xa0, 0x55, 0x73, 0x37, 0x18, 0x27, 0x6e, 0xb7, 0x77, 0xfe, 0xdf, 0xb2, 0xae, 0xad, - 0xd6, 0x88, 0xc7, 0xed, 0xea, 0x07, 0x8d, 0xbd, 0xda, 0x53, 0x31, 0x60, 0x56, 0xd2, 0x3b, 0xa3, 0x4a, 0x5e, 0x64, - 0xbc, 0xc4, 0x93, 0x6a, 0xd5, 0xf0, 0xf1, 0xbe, 0xc9, 0x46, 0xe6, 0x81, 0x4c, 0x01, 0xf1, 0xfc, 0x26, 0x35, 0xea, - 0xe3, 0x14, 0x25, 0xe0, 0xef, 0x74, 0x7c, 0x23, 0xfa, 0xd1, 0xbe, 0xb8, 0xe4, 0xd5, 0xc9, 0x8d, 0x30, 0x2f, 0x5e, - 0x58, 0x9d, 0x3f, 0x7d, 0x53, 0xf8, 0xd0, 0xe1, 0xa8, 0xbd, 0x83, 0x22, 0x4b, 0x26, 0x8e, 0x26, 0x46, 0xd6, 0x26, - 0x66, 0x1f, 0x15, 0x5c, 0x4c, 0x54, 0xa1, 0x67, 0x9d, 0x3d, 0x61, 0x0a, 0xd0, 0x37, 0x8e, 0x51, 0xc9, 0x18, 0x16, - 0x0c, 0xd4, 0x69, 0x4a, 0x88, 0x1e, 0x8a, 0x19, 0xc6, 0x2b, 0x06, 0x50, 0x98, 0x42, 0x81, 0x28, 0x3a, 0xfb, 0x70, - 0xa0, 0x09, 0xfd, 0xfe, 0x4d, 0xaa, 0x33, 0xd0, 0xb2, 0x9e, 0x4a, 0x10, 0xd5, 0x41, 0xb4, 0x55, 0x5e, 0x84, 0x3f, - 0x2e, 0x69, 0x99, 0xd1, 0xa5, 0xa0, 0xa9, 0xa0, 0x49, 0x46, 0x2f, 0xb8, 0x12, 0x15, 0x5f, 0x08, 0xa6, 0x68, 0xbb, - 0x21, 0xec, 0xff, 0x6a, 0xd0, 0xf5, 0x56, 0xac, 0x35, 0xb4, 0x3b, 0x41, 0x46, 0x68, 0xbe, 0xd0, 0x41, 0xc8, 0x50, - 0x39, 0x09, 0x5d, 0xab, 0x34, 0x5e, 0x81, 0x4b, 0xa6, 0xd9, 0x68, 0x19, 0x97, 0x61, 0x60, 0xbf, 0x0a, 0x2c, 0x26, - 0x07, 0x26, 0x9d, 0xae, 0xcf, 0x9f, 0xcb, 0xab, 0x95, 0x14, 0x5c, 0x54, 0x0a, 0xa2, 0xdf, 0xe0, 0xbe, 0x9b, 0xb8, - 0xea, 0xac, 0x59, 0x2b, 0x7d, 0xe8, 0x5b, 0x9f, 0xb5, 0x71, 0x5f, 0x18, 0x1c, 0x83, 0x9d, 0x8f, 0x88, 0x81, 0x34, - 0xa8, 0x74, 0x8b, 0x43, 0x13, 0xa0, 0x4b, 0x87, 0x14, 0xb2, 0x64, 0x2a, 0x53, 0x25, 0xa8, 0xf8, 0xc6, 0xef, 0xa5, - 0xac, 0x46, 0x7f, 0xad, 0x79, 0x71, 0x77, 0xca, 0x73, 0x8e, 0x63, 0x14, 0x24, 0xb1, 0xb8, 0x8e, 0xcb, 0x80, 0xf8, - 0x96, 0x57, 0xc1, 0x41, 0x6a, 0xc2, 0xc6, 0xec, 0x54, 0x8d, 0x5a, 0x2f, 0x89, 0xbe, 0x32, 0xca, 0x37, 0x06, 0x43, - 0x13, 0x51, 0x05, 0x7d, 0xaf, 0xd5, 0x3d, 0xad, 0x6e, 0x58, 0x40, 0xfc, 0xb9, 0xd2, 0x0b, 0xb5, 0x5e, 0x37, 0x63, - 0x6e, 0x98, 0x08, 0x41, 0xa3, 0x27, 0xf5, 0xa2, 0xf6, 0xdc, 0xd2, 0x54, 0x64, 0xdc, 0x68, 0x93, 0xf3, 0x4b, 0x90, - 0xf1, 0x39, 0x73, 0xa1, 0x49, 0x5d, 0x53, 0x05, 0x55, 0x18, 0x6d, 0x6e, 0x1b, 0xe9, 0xf4, 0x0e, 0xdc, 0xd9, 0x8c, - 0xd9, 0x91, 0x76, 0x69, 0xac, 0x69, 0xc1, 0xcb, 0x95, 0x14, 0x25, 0x84, 0x71, 0xee, 0x8d, 0xe9, 0x55, 0x9c, 0x89, - 0x2a, 0xce, 0xc4, 0x71, 0xb9, 0xe2, 0x49, 0xf5, 0x1e, 0x6e, 0x71, 0xca, 0xea, 0xa6, 0x2e, 0xe1, 0x4a, 0x97, 0xec, - 0x61, 0x30, 0x35, 0x15, 0xf7, 0xd8, 0x19, 0x5c, 0x54, 0x7f, 0x44, 0x4b, 0x89, 0xb1, 0x50, 0x75, 0xf1, 0xf1, 0x79, - 0x29, 0xf3, 0x75, 0x05, 0xda, 0xdd, 0x8b, 0x2a, 0x3a, 0x78, 0xba, 0xba, 0x9d, 0xaa, 0x1b, 0x4c, 0xf4, 0xf4, 0x60, - 0x75, 0xdb, 0xcb, 0xae, 0x56, 0xb2, 0xa8, 0x62, 0x51, 0x4d, 0x15, 0x22, 0x59, 0x12, 0xe7, 0x49, 0x38, 0x19, 0x8f, - 0xbf, 0xda, 0x1b, 0xee, 0x41, 0x06, 0x32, 0xfd, 0x34, 0x54, 0x2e, 0x47, 0xc3, 0xc9, 0x78, 0x3c, 0x95, 0xea, 0x6e, - 0x17, 0x8d, 0x26, 0x35, 0xd6, 0x33, 0x4c, 0xf4, 0xcc, 0x8c, 0xf8, 0xed, 0x2a, 0x16, 0x29, 0xc4, 0xaf, 0xd3, 0xc5, - 0x1f, 0x3c, 0x1d, 0x37, 0xca, 0xb7, 0x9f, 0x3e, 0xab, 0xff, 0xa8, 0x4d, 0x58, 0x6b, 0xd3, 0xee, 0xe7, 0x7f, 0x1c, - 0xaa, 0xf9, 0x3e, 0x3a, 0xdc, 0xd7, 0x3f, 0xfe, 0xa8, 0xeb, 0xe9, 0x9b, 0x22, 0x9c, 0xff, 0x33, 0x54, 0xf3, 0x79, - 0x5c, 0x14, 0xf1, 0x5d, 0x0d, 0x91, 0x3c, 0x85, 0xf3, 0x26, 0xa1, 0xde, 0x36, 0xa0, 0x07, 0x64, 0x7a, 0x21, 0x18, - 0x7c, 0xf3, 0xbe, 0x0a, 0x03, 0x5e, 0xae, 0x86, 0x5c, 0x54, 0x59, 0x75, 0x37, 0xc4, 0x3c, 0x01, 0x7e, 0x6a, 0x78, - 0xb3, 0xe7, 0x85, 0x21, 0x36, 0x17, 0x05, 0xe7, 0x9f, 0x78, 0xa8, 0x8c, 0xa3, 0xc7, 0x68, 0x1c, 0x3d, 0xa6, 0x6a, - 0x30, 0x26, 0xdf, 0x50, 0xdd, 0x99, 0xc9, 0x37, 0x60, 0x82, 0x94, 0xb5, 0xbf, 0x51, 0xc6, 0x89, 0xd1, 0x98, 0x5e, - 0xbf, 0xca, 0xb3, 0x15, 0x30, 0xc1, 0x4b, 0xfd, 0xa3, 0x26, 0xf4, 0x3d, 0x6f, 0x67, 0x1f, 0x8d, 0x46, 0xcf, 0x0b, - 0x3a, 0x1a, 0x8d, 0x3e, 0x66, 0x35, 0xa1, 0x2b, 0xd1, 0xf1, 0xfe, 0x3d, 0xa7, 0xe7, 0x32, 0xbd, 0x8b, 0x82, 0x80, - 0x2e, 0xb3, 0x34, 0xe5, 0x42, 0x95, 0x75, 0x9a, 0xb6, 0xf3, 0xaa, 0x16, 0x22, 0xf0, 0x8f, 0x6e, 0x23, 0x42, 0x10, - 0x11, 0x7a, 0xb2, 0xd3, 0xb3, 0xd1, 0x68, 0x74, 0x9a, 0x9a, 0x6a, 0x1d, 0x43, 0xfe, 0x06, 0xcd, 0x07, 0x9c, 0x5d, - 0x3e, 0x58, 0xdf, 0x98, 0x68, 0x27, 0xfb, 0xff, 0x3d, 0x9c, 0xcd, 0xc7, 0xc3, 0x6f, 0x47, 0x8b, 0xc7, 0xfb, 0x34, - 0x08, 0x7c, 0xd0, 0xea, 0x50, 0x5b, 0x73, 0x4c, 0xcb, 0xc3, 0xf1, 0x94, 0x94, 0x03, 0xf6, 0xd4, 0xfa, 0xd2, 0x7c, - 0xf5, 0x14, 0x90, 0x48, 0x51, 0x84, 0x1a, 0x38, 0xe9, 0x1f, 0x5e, 0x45, 0x5e, 0x0b, 0xc0, 0x47, 0xb3, 0x91, 0x0c, - 0x8c, 0x16, 0x70, 0x1c, 0x41, 0x79, 0xb5, 0x35, 0x8d, 0xe8, 0x31, 0x96, 0x99, 0xa8, 0xa0, 0xe3, 0x69, 0x79, 0x93, - 0x55, 0xc9, 0x12, 0x03, 0x1b, 0xc5, 0x25, 0x0f, 0xbe, 0x0a, 0xa2, 0x92, 0x1d, 0x3c, 0x9b, 0x2a, 0x78, 0x5f, 0x4c, - 0x4a, 0xf9, 0x25, 0x24, 0x7e, 0x3b, 0x46, 0x08, 0x54, 0xa2, 0x3d, 0x16, 0xb1, 0xc6, 0x57, 0xb9, 0x8c, 0xc1, 0x83, - 0xb3, 0xd4, 0x3c, 0x8b, 0x3d, 0x09, 0xac, 0xfd, 0x45, 0xab, 0x39, 0x12, 0x9a, 0x13, 0x4a, 0x26, 0xf7, 0x4b, 0x2a, - 0xbf, 0x9a, 0xa0, 0x57, 0x10, 0xb8, 0x55, 0x47, 0x70, 0xdc, 0x59, 0xcb, 0x06, 0xbd, 0x7c, 0x52, 0xb6, 0x3f, 0xff, - 0xdf, 0x25, 0x5d, 0x0c, 0xf6, 0xdd, 0xd0, 0x9c, 0x68, 0xf7, 0xd5, 0x0a, 0x19, 0xa5, 0x2a, 0x7c, 0x9e, 0x12, 0x6b, - 0x7c, 0xca, 0xd9, 0xd1, 0xc6, 0x74, 0x67, 0x54, 0x15, 0xd9, 0x55, 0x48, 0x74, 0xaf, 0x1c, 0x28, 0x66, 0x10, 0x65, - 0x23, 0x5c, 0x3f, 0x60, 0x2d, 0xe2, 0x75, 0xf2, 0x9a, 0x17, 0x55, 0x96, 0xa8, 0xf7, 0xd7, 0x8d, 0xf7, 0x40, 0x0d, - 0x54, 0x83, 0xde, 0x15, 0x0c, 0xe6, 0xf9, 0xa4, 0x00, 0xd0, 0xce, 0x92, 0x17, 0xd7, 0xdc, 0xa7, 0x1b, 0x41, 0x50, - 0xbb, 0x66, 0x5e, 0x36, 0x82, 0x4d, 0xc0, 0x57, 0xef, 0x0a, 0xc0, 0xdc, 0x08, 0x41, 0x6a, 0x0a, 0xa1, 0x70, 0xe0, - 0x02, 0x5f, 0x55, 0x45, 0x76, 0xbe, 0xae, 0x38, 0x06, 0xfb, 0xf0, 0xe2, 0x26, 0x2a, 0x27, 0x3c, 0x1e, 0x06, 0xf8, - 0x23, 0xa0, 0x2a, 0xe0, 0x86, 0xf1, 0xb0, 0x83, 0x17, 0xea, 0x97, 0x7b, 0xa3, 0xf6, 0x08, 0x7b, 0x93, 0x86, 0x10, - 0x5c, 0x07, 0x1f, 0x02, 0x58, 0x52, 0x84, 0x9e, 0xe0, 0xa9, 0x1a, 0x06, 0x17, 0x79, 0xb6, 0xd2, 0x49, 0xd5, 0xa8, - 0xa3, 0xf9, 0x50, 0x6a, 0x47, 0x72, 0x40, 0xbd, 0xf4, 0x18, 0xd3, 0x0b, 0x95, 0xae, 0x8a, 0x72, 0x46, 0x28, 0xef, - 0xf4, 0xc4, 0xb8, 0x30, 0x7d, 0x1c, 0x22, 0xbf, 0xbc, 0x2b, 0x54, 0xe8, 0x17, 0xbe, 0x00, 0xf0, 0x2b, 0xb8, 0xdd, - 0xef, 0xc6, 0x77, 0x51, 0xd9, 0xcf, 0x38, 0xdb, 0xff, 0xef, 0x79, 0x3c, 0xfc, 0x34, 0x1e, 0x7e, 0xbb, 0x18, 0x84, - 0x43, 0xfb, 0x93, 0x3c, 0x7e, 0xb4, 0x4f, 0x5f, 0x71, 0xcb, 0x95, 0xc0, 0xc2, 0x6f, 0x04, 0xb7, 0x51, 0x2b, 0x21, - 0x88, 0x02, 0xbc, 0x51, 0xb8, 0xd5, 0x38, 0x01, 0x80, 0xbf, 0xe0, 0xbf, 0x02, 0x34, 0x12, 0x72, 0x17, 0x0d, 0xd0, - 0x0f, 0xa8, 0xdf, 0x47, 0x4f, 0x1a, 0x06, 0x72, 0x20, 0x9e, 0x50, 0x31, 0x50, 0x88, 0x2e, 0x63, 0xa2, 0x60, 0x7f, - 0x6d, 0xf6, 0xed, 0xb6, 0xd7, 0x96, 0xfc, 0xe0, 0x97, 0x7e, 0xa6, 0x89, 0x99, 0x77, 0xb8, 0xa1, 0xac, 0xe4, 0x2a, - 0x44, 0x6c, 0x3c, 0xfd, 0x2b, 0x67, 0x10, 0x6b, 0xf2, 0x3a, 0x03, 0x1f, 0x06, 0xfb, 0xc5, 0x78, 0x06, 0x6c, 0x03, - 0xdc, 0x71, 0x0a, 0x7e, 0x91, 0x81, 0x5b, 0xb3, 0x88, 0xf1, 0x82, 0x6d, 0x97, 0x44, 0xbf, 0xdf, 0xcb, 0xb3, 0x30, - 0xd7, 0x38, 0xcb, 0x79, 0x6d, 0xc4, 0xee, 0xa8, 0x13, 0x06, 0x71, 0xbb, 0x1e, 0x82, 0xa1, 0x1a, 0x82, 0xa2, 0xa3, - 0x2d, 0xae, 0x5e, 0x5b, 0x4f, 0x61, 0x7a, 0xab, 0xea, 0x2b, 0x46, 0x7f, 0xca, 0x4c, 0x60, 0x21, 0xed, 0x9a, 0x63, - 0x5d, 0x73, 0x8c, 0xb4, 0xa7, 0xdf, 0x17, 0x0d, 0xf2, 0xd3, 0x59, 0x78, 0x10, 0xa8, 0x52, 0xe5, 0x4e, 0x59, 0x94, - 0xdb, 0xd2, 0xbc, 0x31, 0xac, 0x69, 0x9e, 0xd9, 0xb8, 0x2e, 0xb3, 0x5e, 0x2f, 0x0c, 0xd1, 0xa1, 0x11, 0x4b, 0xc5, - 0xda, 0x20, 0xbc, 0x8f, 0x49, 0x18, 0x5d, 0x81, 0xac, 0x2e, 0x3c, 0xe3, 0x04, 0xf9, 0x32, 0x30, 0x59, 0x53, 0xd5, - 0x7a, 0x39, 0xe1, 0xb1, 0x91, 0x2f, 0x1b, 0x41, 0x83, 0xbc, 0xa4, 0xa8, 0x37, 0x71, 0x3b, 0xf6, 0x51, 0x0b, 0xa9, - 0x71, 0x53, 0x4f, 0x7b, 0x9a, 0x54, 0xf4, 0x58, 0xaf, 0x52, 0xbf, 0xc0, 0xb2, 0xc0, 0x92, 0x0f, 0x42, 0x7b, 0x9a, - 0x56, 0x60, 0x86, 0x6b, 0x9b, 0xc1, 0xd0, 0x0f, 0x87, 0xb6, 0x08, 0x9d, 0x51, 0xdb, 0x12, 0xc2, 0xb6, 0x0d, 0xc2, - 0xca, 0x7b, 0x22, 0x5f, 0x3d, 0xf5, 0x18, 0xe1, 0x90, 0x9b, 0xcd, 0x2c, 0x1a, 0x18, 0xe6, 0x57, 0xb2, 0xd9, 0x3c, - 0xdd, 0x5c, 0x2f, 0x2a, 0xa6, 0x80, 0xed, 0xb6, 0x12, 0x04, 0xff, 0x7e, 0xcc, 0x66, 0xf8, 0x37, 0xeb, 0xf7, 0x7b, - 0x21, 0xfe, 0xe2, 0x18, 0xbc, 0x67, 0x2e, 0x16, 0xec, 0x23, 0xc8, 0x54, 0x48, 0x84, 0xa9, 0xca, 0xf8, 0x8d, 0x55, - 0x60, 0x01, 0x67, 0x3e, 0x50, 0xb9, 0x30, 0x93, 0xbd, 0xbc, 0xb8, 0x86, 0x1c, 0xb7, 0xc6, 0x29, 0x1b, 0x65, 0x89, - 0x72, 0x5d, 0xc8, 0x46, 0x71, 0x9e, 0xc5, 0x25, 0x2f, 0xb7, 0x5b, 0x7d, 0x38, 0x26, 0x05, 0x07, 0xf6, 0x54, 0x51, - 0xa9, 0x92, 0x75, 0xa4, 0xba, 0xf1, 0x97, 0x61, 0x81, 0xfb, 0x94, 0xcf, 0x0b, 0x43, 0x23, 0xf6, 0xe0, 0xf2, 0xce, - 0xd4, 0xad, 0xb4, 0x17, 0x16, 0xd0, 0xbc, 0x92, 0x90, 0x0d, 0xa6, 0x7a, 0x16, 0xad, 0x31, 0x13, 0xf3, 0x62, 0x01, - 0x61, 0x64, 0x8a, 0x05, 0xd8, 0x4c, 0x71, 0x01, 0x5e, 0x24, 0x31, 0xc0, 0xc4, 0xc5, 0x64, 0x0a, 0xf1, 0xcc, 0x55, - 0x39, 0xf1, 0xc2, 0xdc, 0x2f, 0x13, 0x87, 0x94, 0x01, 0xaf, 0x6a, 0x83, 0x26, 0x66, 0x1b, 0x8e, 0x3a, 0x41, 0x4e, - 0x4c, 0x7e, 0x3f, 0x55, 0x10, 0xe2, 0x4e, 0x1c, 0x09, 0x97, 0x15, 0xdb, 0x85, 0x97, 0x1d, 0x88, 0x31, 0x6a, 0x70, - 0xca, 0xcf, 0x0c, 0x8e, 0xc6, 0xe0, 0xdc, 0x78, 0x27, 0x48, 0x11, 0xc6, 0x64, 0x23, 0xd9, 0x95, 0x0c, 0xc5, 0x3c, - 0x5e, 0x80, 0xb2, 0x2e, 0x5e, 0x80, 0x65, 0x8d, 0x31, 0xc0, 0x04, 0x79, 0x15, 0xf7, 0x42, 0x3f, 0x51, 0x5c, 0x21, - 0xd2, 0xb3, 0x72, 0x7d, 0x54, 0xb4, 0x43, 0x5f, 0xe0, 0xf5, 0x5e, 0x99, 0xe3, 0x66, 0x3d, 0x16, 0x48, 0x6c, 0x08, - 0x18, 0x1b, 0xe9, 0x34, 0xd5, 0x5a, 0xf7, 0xc6, 0xcc, 0x03, 0x9f, 0x66, 0x23, 0x21, 0xab, 0xb3, 0x0b, 0x10, 0xa1, - 0xf8, 0x68, 0xf0, 0xc8, 0x2f, 0xe2, 0xce, 0x32, 0x6f, 0x6d, 0x8b, 0x4a, 0x76, 0xb4, 0x01, 0x90, 0x3e, 0x1d, 0x2d, - 0x4a, 0xc9, 0x29, 0x4a, 0x52, 0xbb, 0x4d, 0x01, 0x2b, 0xc9, 0x5f, 0xc0, 0x10, 0x6c, 0x6c, 0x4f, 0x38, 0x9d, 0x22, - 0xc4, 0x27, 0x9a, 0x22, 0xb2, 0x62, 0x58, 0x52, 0x1c, 0xdb, 0x12, 0x51, 0x3f, 0x6d, 0x59, 0x76, 0x30, 0x4c, 0x54, - 0xdc, 0x17, 0xa9, 0x47, 0x89, 0x82, 0x80, 0xea, 0x21, 0x07, 0x89, 0xad, 0x6d, 0x20, 0x3c, 0x20, 0x8f, 0xe8, 0x8d, - 0xf5, 0xf7, 0x59, 0xe7, 0xd9, 0x85, 0xe6, 0xa8, 0x5c, 0xef, 0x0a, 0x33, 0x46, 0x78, 0x92, 0x19, 0x98, 0x7c, 0xef, - 0x3c, 0x33, 0x6a, 0x8a, 0x9e, 0x87, 0x4f, 0x76, 0x8c, 0x11, 0xe9, 0xee, 0x19, 0x74, 0x13, 0xbc, 0xaa, 0xc3, 0x46, - 0xbb, 0x52, 0x10, 0x12, 0xa6, 0x16, 0x4d, 0xcc, 0x7a, 0xd6, 0x80, 0x7a, 0xbb, 0xed, 0xe9, 0xb9, 0xba, 0x7f, 0xee, - 0xb6, 0xdb, 0x1e, 0x76, 0xeb, 0x45, 0xda, 0x6d, 0x05, 0x5e, 0xa9, 0x0f, 0xda, 0xe3, 0xcf, 0xdd, 0xf8, 0x73, 0x83, - 0xe4, 0x51, 0x3a, 0x9a, 0x69, 0xeb, 0x83, 0x70, 0xb8, 0xe9, 0x5d, 0xa3, 0x49, 0xdf, 0x67, 0xa1, 0xa4, 0x2b, 0xd1, - 0xa8, 0xae, 0x76, 0x26, 0x95, 0x0f, 0xae, 0xff, 0x87, 0x57, 0x01, 0x1e, 0x71, 0x6a, 0x67, 0xdf, 0xdb, 0xa0, 0xa2, - 0xd1, 0x16, 0x8e, 0x14, 0xa1, 0x07, 0x24, 0xe1, 0xbe, 0x96, 0xb5, 0xb8, 0xcd, 0xd3, 0xec, 0x61, 0xfa, 0xf4, 0x3a, - 0xf5, 0xad, 0xee, 0xdd, 0x32, 0xcb, 0xcc, 0x81, 0x57, 0x51, 0x1c, 0xd0, 0xa8, 0x8b, 0xf6, 0x5d, 0x65, 0x65, 0x09, - 0x5e, 0x1e, 0x70, 0x7d, 0x3e, 0xe5, 0x3e, 0xdc, 0xdc, 0x65, 0xd5, 0xdc, 0xa4, 0xa7, 0xd9, 0x3c, 0x5b, 0x6c, 0xb7, - 0x21, 0xfe, 0xed, 0x6a, 0x91, 0xa3, 0xc9, 0x73, 0xd0, 0xe1, 0x61, 0xe4, 0x1e, 0xa6, 0x1b, 0xe7, 0x6d, 0xfe, 0x4f, - 0xa2, 0xe1, 0x24, 0x70, 0x0c, 0xf4, 0x62, 0xf6, 0x08, 0x64, 0x30, 0xc6, 0xa9, 0x5f, 0xcc, 0xf4, 0x9a, 0x81, 0xe8, - 0x5b, 0x22, 0x02, 0x1c, 0x5d, 0x6c, 0x24, 0x1a, 0x59, 0x70, 0x52, 0x13, 0xb0, 0xd8, 0xb4, 0xe5, 0x7d, 0xb0, 0xb4, - 0xad, 0x2a, 0xee, 0xbc, 0x25, 0xcd, 0x71, 0x1d, 0x38, 0xdb, 0x7e, 0x33, 0xc4, 0xa6, 0xec, 0x6a, 0x81, 0xdc, 0x2f, - 0xaf, 0x69, 0x6f, 0x5c, 0x27, 0x30, 0x6b, 0x9b, 0xda, 0x32, 0x7e, 0xb6, 0xf4, 0x9f, 0xf5, 0xe0, 0x2a, 0xe3, 0xa7, - 0xb9, 0xb1, 0x4a, 0xb0, 0xfb, 0xc6, 0xf3, 0x1d, 0x80, 0x70, 0x6c, 0x3e, 0x3d, 0x3e, 0xcd, 0x3c, 0x7a, 0x0c, 0x44, - 0xc7, 0x7c, 0x54, 0xba, 0x8f, 0xec, 0xee, 0xf5, 0x03, 0xe0, 0xcd, 0xab, 0x76, 0x41, 0xf3, 0x72, 0x01, 0x81, 0x44, - 0xbd, 0xf2, 0x0a, 0xcb, 0x67, 0xc6, 0xec, 0x12, 0xc8, 0x50, 0x41, 0xc0, 0x26, 0xa9, 0xeb, 0x5c, 0x88, 0x55, 0x87, - 0x95, 0xf9, 0x48, 0xc2, 0x8e, 0x42, 0x34, 0xe7, 0x0c, 0x66, 0xc1, 0x7f, 0x05, 0x83, 0x72, 0x10, 0x44, 0x41, 0x14, - 0x04, 0x64, 0x50, 0xc0, 0x2f, 0xc4, 0x19, 0x23, 0x18, 0xa3, 0x04, 0x3a, 0xfc, 0x8e, 0x33, 0x9f, 0x11, 0x79, 0xd9, - 0x08, 0x63, 0xe9, 0x06, 0xe0, 0x5c, 0xca, 0x9c, 0xc7, 0xe8, 0x63, 0xf1, 0x8e, 0xb3, 0x8c, 0xd0, 0x77, 0xde, 0xa9, - 0xfc, 0x88, 0x37, 0x82, 0xdb, 0xed, 0x0e, 0xdb, 0x2b, 0x1e, 0x66, 0xb4, 0x37, 0xa6, 0xef, 0x38, 0x89, 0xb2, 0x86, - 0xf3, 0x30, 0x87, 0x9e, 0x55, 0x96, 0xb5, 0xa2, 0x86, 0xdc, 0xa0, 0x58, 0x17, 0x59, 0x26, 0x27, 0xc3, 0x55, 0x73, - 0x2a, 0x70, 0xdd, 0xd9, 0xf5, 0x02, 0x92, 0x32, 0xa1, 0x59, 0x3a, 0x1b, 0xbe, 0xda, 0xb6, 0xec, 0x45, 0xeb, 0x14, - 0xf2, 0x1a, 0xa2, 0xa2, 0x1f, 0x3a, 0x02, 0x6a, 0x68, 0xc5, 0x65, 0x05, 0x2e, 0xbb, 0xa6, 0x3d, 0xdc, 0xb4, 0xc7, - 0x34, 0xe3, 0x03, 0xc4, 0x88, 0xe3, 0xd8, 0x32, 0xb0, 0x9b, 0x70, 0x78, 0x36, 0xce, 0xf7, 0x65, 0x97, 0xde, 0xba, - 0x5a, 0x3c, 0xc2, 0xda, 0xf3, 0x56, 0x48, 0x08, 0x90, 0x96, 0xa6, 0xd2, 0xed, 0x36, 0x08, 0x60, 0x80, 0xfb, 0xfd, - 0x1e, 0x70, 0xad, 0x86, 0x9d, 0x34, 0xb7, 0x66, 0x4b, 0xec, 0x15, 0x85, 0xc7, 0x40, 0x94, 0x9a, 0xff, 0x0c, 0x02, - 0x8a, 0xe7, 0x6e, 0x08, 0xf6, 0x95, 0xec, 0x68, 0x53, 0xf4, 0xfb, 0x2f, 0x0a, 0x7c, 0x40, 0x39, 0x28, 0x88, 0x75, - 0x75, 0xdc, 0x0a, 0xc3, 0x3e, 0xa9, 0x0f, 0x71, 0x2c, 0xf2, 0x2c, 0x74, 0x84, 0xa5, 0x32, 0x84, 0x85, 0x2b, 0x46, - 0x3a, 0x88, 0x83, 0x9a, 0x74, 0x0e, 0x56, 0xe5, 0x82, 0x0d, 0xf7, 0x7a, 0x9f, 0x00, 0x16, 0x3c, 0xf3, 0x86, 0xe5, - 0xbd, 0x07, 0x00, 0xd6, 0xeb, 0xe1, 0x42, 0x71, 0x2f, 0x5f, 0x35, 0xd0, 0x27, 0xf1, 0xa5, 0x65, 0xd7, 0x67, 0x5a, - 0x56, 0x32, 0x1a, 0x8d, 0xaa, 0x5a, 0x49, 0x3e, 0x1c, 0x79, 0x69, 0xa1, 0x56, 0xca, 0x38, 0xe5, 0x29, 0x58, 0x7a, - 0x1b, 0x4a, 0x37, 0x5f, 0xd0, 0x15, 0x17, 0xa9, 0xfa, 0xe9, 0xa1, 0x4d, 0x36, 0x88, 0x6b, 0xd6, 0xd4, 0x59, 0xd8, - 0xe1, 0x87, 0x80, 0x8f, 0xf6, 0x61, 0xe6, 0xd2, 0x35, 0x2c, 0x2d, 0x88, 0x23, 0xe3, 0x82, 0x87, 0x2e, 0x0f, 0x60, - 0xfd, 0x99, 0x43, 0x12, 0x3f, 0x85, 0x9f, 0x33, 0x93, 0xd6, 0xf1, 0x19, 0xce, 0x66, 0x54, 0xaa, 0x1b, 0x41, 0xfb, - 0x35, 0x24, 0x12, 0x83, 0x6c, 0xdc, 0x60, 0x28, 0x5a, 0x77, 0x1b, 0xb8, 0xf2, 0x5b, 0x7a, 0xe7, 0xd3, 0x20, 0xc0, - 0xb6, 0xc6, 0x62, 0x00, 0x30, 0x14, 0x7f, 0xa0, 0xaa, 0xc6, 0x5c, 0x51, 0x4c, 0xc3, 0x54, 0xa2, 0xbd, 0xe3, 0xb8, - 0x8e, 0x1a, 0x57, 0x59, 0xc1, 0x4a, 0x6b, 0xcb, 0xeb, 0xde, 0xd2, 0xc2, 0x96, 0x80, 0x6a, 0x30, 0xdc, 0x09, 0xe0, - 0x33, 0x22, 0xd5, 0x81, 0x20, 0xbb, 0x0f, 0x0e, 0x9a, 0xb3, 0x04, 0xcf, 0xc3, 0x10, 0xfe, 0xc0, 0xc2, 0x81, 0x65, - 0xa9, 0xfa, 0xb9, 0x9c, 0xc6, 0x70, 0xee, 0xe6, 0x6a, 0x87, 0xcf, 0x96, 0xa0, 0xc8, 0x53, 0x73, 0x6a, 0x2e, 0x5f, - 0x79, 0x63, 0xbf, 0xc7, 0x04, 0xf3, 0x98, 0xd9, 0x86, 0xdf, 0x7a, 0xba, 0xad, 0x2f, 0xac, 0x1b, 0x38, 0x69, 0x2f, - 0x9c, 0xf6, 0x62, 0xbb, 0x34, 0x10, 0x77, 0x75, 0x43, 0x88, 0xf0, 0x5a, 0x13, 0x8b, 0xac, 0x21, 0xd3, 0xb1, 0xd8, - 0x18, 0xaa, 0x4d, 0xc5, 0x73, 0xad, 0x10, 0x2f, 0xa7, 0xea, 0xc2, 0xd4, 0x4a, 0x65, 0xc2, 0x20, 0xcc, 0x94, 0xb0, - 0xa8, 0x32, 0xf0, 0xd9, 0xaf, 0x90, 0xe2, 0xda, 0x7a, 0xde, 0xe2, 0xf2, 0xcd, 0x4c, 0x9b, 0xed, 0xa7, 0xaf, 0xf2, - 0xf8, 0x72, 0xbb, 0x0d, 0xbb, 0x5f, 0x80, 0xf9, 0x65, 0xa9, 0x34, 0x6a, 0xe0, 0xf4, 0x10, 0xa2, 0x9f, 0xf3, 0x3d, - 0x39, 0x27, 0x8e, 0x93, 0x6b, 0x37, 0x6f, 0xb6, 0x93, 0x62, 0x04, 0x16, 0x70, 0xe2, 0x22, 0x1d, 0x68, 0xa9, 0xe0, - 0xb4, 0x65, 0xbc, 0xb7, 0xe9, 0x1d, 0xa5, 0xc2, 0xab, 0x85, 0x26, 0x21, 0x95, 0xbb, 0x97, 0xd8, 0x51, 0x03, 0xce, - 0x49, 0xdd, 0x41, 0xc0, 0x49, 0x4d, 0x37, 0xd6, 0x2a, 0x4e, 0x4d, 0x82, 0xf7, 0x4a, 0x0f, 0x5d, 0xa2, 0x9d, 0xb8, - 0xdd, 0xb6, 0x2a, 0x5b, 0xa8, 0x8f, 0x7b, 0x39, 0x4b, 0xd4, 0xf1, 0x80, 0x42, 0x17, 0x75, 0x34, 0xe4, 0x0b, 0x52, - 0xe8, 0x95, 0xa3, 0x55, 0xab, 0xbb, 0x92, 0x81, 0x52, 0xad, 0x82, 0xbc, 0x26, 0xd6, 0x5d, 0x2b, 0x6b, 0x2c, 0xae, - 0x9c, 0x90, 0xc2, 0x26, 0x7c, 0x69, 0x29, 0x16, 0x56, 0xb0, 0x37, 0xa6, 0xbe, 0x70, 0x89, 0xd0, 0x76, 0xb7, 0x21, - 0x26, 0x19, 0xac, 0x9b, 0xed, 0xf6, 0x75, 0x11, 0xce, 0xb3, 0x05, 0x95, 0xa3, 0x2c, 0x45, 0x08, 0x31, 0xe3, 0xa1, - 0x6b, 0xbb, 0x60, 0x26, 0x86, 0xba, 0xf6, 0x78, 0x49, 0xa6, 0x58, 0x9b, 0x24, 0x47, 0xf1, 0xb9, 0x2c, 0xd4, 0x5a, - 0x23, 0x04, 0x0f, 0xf7, 0x3f, 0x53, 0x88, 0xe1, 0x66, 0xd6, 0xdd, 0x6f, 0x3b, 0x37, 0xc4, 0x3f, 0x21, 0x90, 0x40, - 0xc9, 0x5e, 0x17, 0xa3, 0xf3, 0x4c, 0xa4, 0xb8, 0x53, 0x55, 0x54, 0x5c, 0xb5, 0x0e, 0x9a, 0x2d, 0xb7, 0xf7, 0x62, - 0x4b, 0x14, 0x20, 0xae, 0xb1, 0xd0, 0x8c, 0x67, 0xe5, 0x2c, 0x45, 0x32, 0x8a, 0x0d, 0x89, 0x4a, 0x2f, 0x2a, 0xba, - 0xcf, 0xd3, 0x98, 0x1e, 0xba, 0x35, 0x08, 0xae, 0x9a, 0x3b, 0x1b, 0x69, 0xbe, 0x20, 0x44, 0x4d, 0x80, 0x84, 0x8d, - 0x6a, 0x4e, 0xad, 0x4b, 0xf1, 0x30, 0xab, 0x7c, 0xa6, 0x0f, 0xe2, 0x4b, 0x01, 0x3c, 0xac, 0xb7, 0xbd, 0xaf, 0x84, - 0xc7, 0xda, 0xe0, 0xdb, 0xed, 0xf6, 0x52, 0xcc, 0x83, 0xc0, 0x63, 0x34, 0xbf, 0x53, 0x12, 0xf3, 0xde, 0x98, 0xc2, - 0x8a, 0xf7, 0x5d, 0xda, 0xba, 0x49, 0xad, 0xb5, 0x40, 0xdd, 0xe1, 0xfa, 0x80, 0xe7, 0x29, 0x71, 0xb4, 0xa3, 0x72, - 0x2a, 0xad, 0xae, 0x1c, 0xbb, 0x22, 0x30, 0x30, 0xf4, 0x0f, 0x29, 0xdb, 0x80, 0x39, 0x1e, 0x58, 0xdb, 0xa0, 0x9f, - 0x92, 0xd2, 0xc2, 0x8c, 0xd1, 0x98, 0x45, 0xae, 0xab, 0xe8, 0x80, 0xeb, 0xe8, 0xed, 0x3c, 0xfa, 0xdb, 0xb3, 0x31, - 0x2d, 0x62, 0x91, 0xca, 0x2b, 0x50, 0x41, 0x80, 0x32, 0x04, 0x0d, 0xff, 0x35, 0x35, 0x00, 0x0d, 0x82, 0x1b, 0x80, - 0x7f, 0x74, 0x3a, 0x0d, 0xda, 0x9a, 0x7c, 0x4c, 0x52, 0x55, 0xe4, 0xac, 0x0d, 0x65, 0xa6, 0x92, 0x43, 0xf2, 0xb8, - 0x04, 0x3c, 0x47, 0x6c, 0x96, 0xb2, 0xb9, 0x50, 0x9b, 0x4d, 0xbd, 0x56, 0xec, 0xc8, 0x6d, 0xa3, 0x68, 0xb3, 0x16, - 0xb5, 0x9d, 0xc4, 0x7c, 0x31, 0xbd, 0xb5, 0xc2, 0xc0, 0xa9, 0x69, 0xcd, 0xcd, 0x0e, 0x74, 0x9a, 0xad, 0xcf, 0xe4, - 0x26, 0x40, 0x1c, 0x60, 0xb8, 0x6e, 0xe7, 0x37, 0x0b, 0x42, 0x6f, 0xd9, 0xad, 0x15, 0xab, 0xde, 0x58, 0xb9, 0x88, - 0x49, 0xbb, 0x19, 0x4c, 0xe0, 0x32, 0xce, 0x0a, 0xfb, 0x42, 0xab, 0x1b, 0x8a, 0x8e, 0xb6, 0x49, 0xfb, 0x79, 0x47, - 0xbb, 0xe1, 0x82, 0x6f, 0xc5, 0x3a, 0xce, 0x0d, 0x69, 0xaa, 0xd0, 0xa3, 0x03, 0xbd, 0x1d, 0x02, 0x9a, 0xb3, 0x31, - 0x5d, 0xd2, 0x14, 0x2f, 0xd0, 0x74, 0x0d, 0x66, 0x29, 0x17, 0xd0, 0xd7, 0x6e, 0x9f, 0xe4, 0x0b, 0xd5, 0x13, 0xe1, - 0x2d, 0x51, 0xf0, 0xe5, 0x48, 0xc1, 0x2b, 0x2b, 0xe7, 0xb1, 0x99, 0x43, 0xc0, 0x63, 0x51, 0x25, 0x7a, 0x27, 0xc5, - 0x25, 0x28, 0x53, 0xe1, 0x08, 0x34, 0x55, 0x23, 0x96, 0x70, 0x80, 0xdb, 0x8b, 0xa7, 0x01, 0xa1, 0x20, 0xd5, 0x5d, - 0xdb, 0x15, 0x79, 0xcb, 0x8e, 0x36, 0xb7, 0x60, 0x16, 0x5b, 0xad, 0xcb, 0xd6, 0x57, 0x36, 0xd9, 0x7d, 0x5c, 0x13, - 0x6c, 0xbb, 0xb7, 0x41, 0xc2, 0x5b, 0x7a, 0x43, 0x36, 0x37, 0xfd, 0x7e, 0x08, 0xfd, 0x21, 0x54, 0x77, 0xe8, 0xb6, - 0xb3, 0x43, 0xb7, 0x3e, 0xf3, 0x6b, 0xf5, 0x7c, 0xca, 0x1b, 0xe2, 0x03, 0x9a, 0x68, 0xd1, 0x55, 0x7c, 0x07, 0x9b, - 0x3a, 0xaa, 0xa8, 0xaa, 0x3c, 0x4a, 0x28, 0xa8, 0x80, 0x33, 0x5e, 0x9e, 0x72, 0x8c, 0x6d, 0xaa, 0x9f, 0xde, 0x69, - 0x5e, 0x6d, 0x6d, 0xd6, 0x66, 0xb9, 0x3e, 0x07, 0x8b, 0x80, 0x73, 0x1e, 0x5d, 0x69, 0x5a, 0x72, 0xe9, 0x31, 0xf5, - 0x67, 0x38, 0x2a, 0xc1, 0x45, 0x9c, 0xe5, 0x3c, 0x0d, 0xe8, 0x45, 0xb3, 0xff, 0xa1, 0xb6, 0x95, 0x5a, 0x36, 0xce, - 0xdc, 0xeb, 0x90, 0x6c, 0xfe, 0xc7, 0x06, 0xea, 0x4d, 0x88, 0x11, 0x51, 0xcd, 0x82, 0x3e, 0x61, 0x10, 0x1b, 0x33, - 0x28, 0xd7, 0x49, 0xc2, 0xcb, 0x32, 0x30, 0x4a, 0xad, 0x35, 0x5b, 0x9b, 0xf3, 0xec, 0x11, 0x3b, 0x7a, 0xd4, 0x63, - 0xec, 0x96, 0xd0, 0x44, 0xeb, 0x84, 0x4c, 0x8d, 0x91, 0xa7, 0x05, 0xd2, 0x1d, 0x8a, 0xb2, 0x8b, 0xf0, 0x04, 0x85, - 0x2c, 0xed, 0x7d, 0x6e, 0x4e, 0x64, 0xf5, 0x8d, 0x36, 0xba, 0x88, 0x54, 0x22, 0xc8, 0xc6, 0x6f, 0x10, 0xb0, 0x17, - 0x9a, 0x1d, 0x90, 0xcd, 0x92, 0x9d, 0xd2, 0x33, 0x6b, 0x02, 0x03, 0xaf, 0x4f, 0x54, 0xa2, 0x19, 0x65, 0x45, 0x74, - 0x95, 0x91, 0xcb, 0x5d, 0x48, 0xa2, 0xb3, 0x90, 0xf8, 0xb9, 0x61, 0x69, 0x5d, 0x87, 0x28, 0x66, 0x36, 0x1b, 0x5e, - 0x75, 0xf7, 0x51, 0x63, 0x5b, 0x19, 0x9f, 0xea, 0x5b, 0x9b, 0x46, 0xa6, 0xd0, 0xd7, 0xe1, 0xa4, 0xdf, 0x87, 0xbf, - 0x9a, 0x7e, 0xe0, 0x2d, 0x05, 0x7f, 0xb1, 0x47, 0xa4, 0x4e, 0x58, 0x00, 0x70, 0x84, 0x39, 0xaf, 0x9a, 0x13, 0xf8, - 0x88, 0x1d, 0x6d, 0x1e, 0x85, 0xa7, 0x8d, 0x99, 0xbb, 0x0b, 0xf1, 0x52, 0x95, 0xf4, 0xbc, 0x79, 0x32, 0x03, 0xb1, - 0x0a, 0xcd, 0x7e, 0xbd, 0x65, 0x56, 0x9f, 0x00, 0x44, 0xea, 0xd6, 0x3a, 0x94, 0xe2, 0xc7, 0xa6, 0xcb, 0x64, 0x93, - 0xb2, 0x36, 0x13, 0xa5, 0x54, 0x24, 0xcd, 0x45, 0x00, 0xfd, 0x86, 0xe1, 0xa8, 0x01, 0xde, 0x5b, 0x8f, 0xbd, 0x19, - 0x1a, 0x6f, 0x4c, 0x0d, 0x3d, 0xdb, 0xe8, 0xe5, 0xed, 0x28, 0x84, 0x19, 0x8b, 0xe8, 0xd6, 0x1d, 0x8b, 0xe1, 0x29, - 0x3d, 0x81, 0x0a, 0xdf, 0x84, 0x18, 0x4d, 0x97, 0xd4, 0xf5, 0x74, 0xad, 0xb6, 0xd2, 0x0d, 0xa1, 0x39, 0x46, 0xf1, - 0xf1, 0xda, 0x76, 0x47, 0x8d, 0xd0, 0x9e, 0x50, 0x1e, 0xde, 0xd2, 0x8a, 0xde, 0x58, 0x16, 0xc1, 0xc9, 0x8f, 0xbd, - 0xfc, 0x84, 0x9e, 0x7b, 0x02, 0x93, 0xa2, 0xad, 0x01, 0xfc, 0x01, 0xf5, 0xc3, 0x59, 0x3d, 0xb5, 0x52, 0x0e, 0x4f, - 0xe1, 0x4b, 0x36, 0x20, 0x57, 0xd0, 0x8b, 0x35, 0x66, 0x47, 0x31, 0xe8, 0xa0, 0x76, 0x76, 0x87, 0x37, 0x29, 0x65, - 0x88, 0xd6, 0x77, 0x0e, 0xe2, 0xe9, 0x1f, 0xa0, 0xe9, 0x83, 0xb4, 0x30, 0xa5, 0x6b, 0x14, 0xf0, 0x80, 0xbe, 0xa9, - 0xdf, 0xcf, 0xf1, 0xb9, 0xf6, 0x2c, 0xb1, 0xb0, 0xc7, 0x4b, 0x42, 0x97, 0x5e, 0xdc, 0x28, 0x90, 0x36, 0x3b, 0x56, - 0x01, 0x58, 0x91, 0x04, 0x1a, 0x91, 0x80, 0xa5, 0x8e, 0x27, 0x2e, 0xdb, 0xa0, 0x01, 0x49, 0x54, 0x52, 0xc8, 0x12, - 0x49, 0xe0, 0x87, 0x11, 0x84, 0x28, 0x8a, 0x41, 0xdc, 0xab, 0x97, 0x57, 0x5c, 0x53, 0x03, 0x4e, 0x14, 0xc1, 0x04, - 0xeb, 0x74, 0x0a, 0xc4, 0x56, 0xac, 0x57, 0xe0, 0x79, 0xe9, 0x38, 0x71, 0x64, 0x09, 0xd0, 0x20, 0xcd, 0x97, 0x4e, - 0xbb, 0xe5, 0xed, 0x89, 0x96, 0x2a, 0x36, 0xf7, 0x5e, 0x2c, 0x2c, 0xf7, 0x58, 0xf9, 0xdb, 0x81, 0xf6, 0xc2, 0x6a, - 0x47, 0x44, 0x0d, 0x56, 0x76, 0x6d, 0xbb, 0x36, 0x94, 0x86, 0xea, 0x5e, 0x39, 0x26, 0xa0, 0xa2, 0xab, 0xb8, 0x5a, - 0x46, 0xd9, 0x08, 0xfe, 0x6c, 0xb7, 0xc1, 0x7e, 0x00, 0x16, 0x90, 0xbf, 0xbe, 0xff, 0x39, 0xc2, 0xf0, 0x4c, 0xbf, - 0xbe, 0xff, 0x79, 0xbb, 0x7d, 0x36, 0x1e, 0x1b, 0xae, 0xc0, 0xa9, 0x75, 0x80, 0x3f, 0x30, 0x6c, 0x83, 0x5d, 0xb2, - 0xdb, 0xed, 0x33, 0xe0, 0x20, 0x14, 0xdb, 0x60, 0x76, 0xb1, 0x72, 0xe4, 0x52, 0xac, 0x86, 0xde, 0x91, 0x80, 0x55, - 0xb7, 0xc3, 0x52, 0xec, 0x52, 0x1f, 0x15, 0x82, 0x51, 0x2f, 0xfa, 0x97, 0x9d, 0x02, 0x4b, 0x0a, 0xa6, 0xab, 0xc1, - 0xb2, 0xaa, 0x56, 0x65, 0xb4, 0xbf, 0x1f, 0xaf, 0xb2, 0x51, 0x99, 0xc1, 0x36, 0x2f, 0xaf, 0x2f, 0x01, 0x50, 0x21, - 0xa0, 0x8d, 0x77, 0x6b, 0x91, 0x99, 0x17, 0x0b, 0xba, 0xcc, 0x70, 0x4d, 0x82, 0xd9, 0x41, 0xce, 0xad, 0x6e, 0x72, - 0x4a, 0xec, 0x03, 0xd8, 0x1c, 0x6e, 0xb7, 0x0d, 0x7e, 0xe1, 0x68, 0xf4, 0x6c, 0xb6, 0xcc, 0xb4, 0x41, 0x27, 0x37, - 0xfb, 0x9f, 0x44, 0x5e, 0x1a, 0x2a, 0x3e, 0xc9, 0xf4, 0x65, 0x06, 0x7c, 0x1e, 0x7b, 0x2b, 0x42, 0x9f, 0xe5, 0x6a, - 0xb4, 0x06, 0xd8, 0xd8, 0xec, 0xe2, 0x6e, 0x94, 0x72, 0x88, 0x48, 0x11, 0x58, 0x75, 0xcd, 0x32, 0x23, 0xbe, 0x4d, - 0xc5, 0x5d, 0x4b, 0x15, 0xf6, 0x56, 0x78, 0xce, 0x2a, 0xdc, 0x38, 0xca, 0xf4, 0x26, 0x51, 0xf8, 0x12, 0x85, 0xa8, - 0x1c, 0x8d, 0xe9, 0x9c, 0x40, 0x2a, 0xf3, 0x98, 0x50, 0xcc, 0xe1, 0xde, 0xfd, 0x9a, 0x3a, 0x73, 0x19, 0x5f, 0xb8, - 0xf7, 0xd2, 0x97, 0x99, 0xdc, 0x4a, 0x00, 0x45, 0x52, 0xb5, 0xff, 0xf2, 0x19, 0xa9, 0xf1, 0x3f, 0x53, 0xad, 0x01, - 0xe8, 0xfd, 0x02, 0x35, 0x39, 0x82, 0x80, 0xad, 0x98, 0xfa, 0x68, 0xfa, 0x56, 0x32, 0xff, 0x01, 0x75, 0x3b, 0x82, - 0x6d, 0x54, 0xfc, 0x9c, 0xa8, 0xa2, 0x05, 0x4f, 0xd7, 0x22, 0x8d, 0x45, 0x72, 0x17, 0xf1, 0x7a, 0x8a, 0x25, 0x31, - 0x1b, 0x21, 0xeb, 0x97, 0x66, 0x17, 0x7e, 0x2e, 0x1a, 0x26, 0xe0, 0xb4, 0xf4, 0xb7, 0x95, 0xb7, 0x99, 0x2c, 0xe3, - 0x8c, 0x4c, 0xb9, 0x42, 0xec, 0xb6, 0xfa, 0x1e, 0x73, 0x82, 0x3f, 0x3d, 0x78, 0x4a, 0xe8, 0xad, 0x9c, 0x96, 0x08, - 0x4a, 0x27, 0x52, 0xeb, 0xaa, 0x89, 0xfd, 0x9a, 0x42, 0x14, 0x07, 0xc1, 0x20, 0x74, 0xa7, 0x69, 0x9f, 0xe2, 0xfb, - 0x6c, 0xd9, 0x6f, 0x4d, 0xd9, 0x92, 0x6c, 0x04, 0x74, 0x4c, 0x3a, 0x6f, 0x4f, 0x6f, 0xcf, 0xce, 0xbc, 0xdf, 0xa0, - 0x09, 0x07, 0xd5, 0x0d, 0xb4, 0xab, 0x20, 0xd3, 0x18, 0xc5, 0x66, 0x31, 0xd6, 0x6e, 0x4d, 0x44, 0x10, 0x74, 0xba, - 0x9c, 0x85, 0xed, 0x76, 0x42, 0x7c, 0x09, 0x24, 0x50, 0xe0, 0xca, 0x45, 0x39, 0x09, 0x89, 0xba, 0x90, 0xe9, 0xc9, - 0xba, 0x96, 0x2c, 0xd0, 0x6b, 0xec, 0x20, 0xa0, 0xc7, 0xdc, 0x3e, 0x05, 0xf4, 0x7d, 0xc1, 0x8e, 0xf9, 0x20, 0x18, - 0x62, 0x7c, 0xd5, 0x80, 0xde, 0x48, 0xf5, 0x08, 0x1e, 0xc2, 0xc0, 0x72, 0xd1, 0x57, 0x05, 0x43, 0x58, 0xa1, 0xbf, - 0x52, 0x36, 0xf9, 0xe6, 0xef, 0x6e, 0x7e, 0xcf, 0xb5, 0x98, 0x1d, 0x84, 0xe2, 0xf6, 0x7a, 0x02, 0xc4, 0xaf, 0xe2, - 0x57, 0x60, 0x5d, 0xad, 0x25, 0xde, 0x6e, 0x7a, 0xfe, 0x14, 0xbe, 0x1c, 0xdd, 0x7e, 0x52, 0x9a, 0x4f, 0x20, 0x48, - 0x8d, 0x93, 0x94, 0xbb, 0xef, 0x3e, 0x4a, 0x57, 0x11, 0x8c, 0x16, 0x20, 0xd6, 0xdd, 0x5b, 0xc9, 0x59, 0x53, 0xf8, - 0x8f, 0x75, 0xbe, 0xc7, 0xd8, 0x21, 0xf2, 0x14, 0xa7, 0xbf, 0x01, 0x86, 0x7d, 0xe7, 0xdf, 0xca, 0xac, 0x21, 0xd1, - 0xb9, 0xfa, 0x08, 0xe8, 0xff, 0x58, 0x8f, 0xdf, 0x31, 0x4a, 0xfa, 0x92, 0x38, 0x47, 0xb8, 0x22, 0x5e, 0xa2, 0xa9, - 0x5e, 0x6f, 0x5c, 0xd3, 0x4f, 0x85, 0x79, 0xa1, 0x15, 0x1c, 0xf6, 0xad, 0x51, 0x78, 0xe0, 0x99, 0xf7, 0x9b, 0x68, - 0x08, 0xba, 0x7f, 0xc7, 0xbd, 0xf1, 0x9b, 0x60, 0x19, 0xde, 0x94, 0xb3, 0xcc, 0xdc, 0xe1, 0x6e, 0x32, 0x91, 0xca, - 0x1b, 0xc6, 0x82, 0xb5, 0x50, 0xe6, 0xab, 0x69, 0x30, 0xdb, 0xd4, 0x91, 0x4a, 0x76, 0xdf, 0xbf, 0x6d, 0x9c, 0xb0, - 0xd9, 0x20, 0x38, 0xad, 0x64, 0x11, 0x5f, 0xf2, 0x60, 0xaa, 0x55, 0x14, 0x59, 0xd6, 0xef, 0x67, 0x80, 0x0c, 0xe3, - 0xb4, 0x77, 0xf0, 0x64, 0xa9, 0x99, 0x09, 0x71, 0x6d, 0x75, 0x16, 0xf0, 0xd6, 0x8c, 0xe6, 0x71, 0x05, 0xbb, 0xcc, - 0x57, 0x52, 0xfc, 0xd9, 0x92, 0x64, 0x63, 0xfd, 0x0d, 0x19, 0xb6, 0x95, 0xcf, 0x9c, 0x03, 0xc6, 0xcc, 0x8d, 0x54, - 0x41, 0xee, 0x7a, 0xc0, 0x08, 0x21, 0x11, 0x10, 0xce, 0x62, 0xe2, 0x4e, 0x98, 0xf0, 0x8f, 0x2e, 0x30, 0x4e, 0x8c, - 0x81, 0x71, 0x3e, 0xca, 0x90, 0xd3, 0x63, 0x3e, 0x48, 0x1a, 0xb3, 0xf5, 0xa7, 0x2a, 0x91, 0x5e, 0x4b, 0x42, 0xcf, - 0xe0, 0xf7, 0xb8, 0xc5, 0x03, 0x35, 0x82, 0x53, 0xba, 0x9b, 0xd3, 0xfe, 0xab, 0x82, 0x0c, 0xff, 0x02, 0xef, 0xae, - 0xd8, 0x5e, 0x96, 0x13, 0x58, 0xdc, 0xb1, 0x57, 0x3c, 0xcd, 0x55, 0x8b, 0x13, 0xe2, 0x11, 0x8b, 0xdc, 0x27, 0x16, - 0x30, 0xa2, 0x86, 0xd1, 0xf8, 0xf1, 0xf4, 0xe4, 0xad, 0xc6, 0x6c, 0xca, 0xfd, 0x0f, 0x60, 0x44, 0xb5, 0xb4, 0xdd, - 0x0e, 0xf8, 0x72, 0x84, 0x06, 0xdb, 0xa9, 0x1b, 0xec, 0x7e, 0xdf, 0xa4, 0x1d, 0x95, 0x5e, 0x36, 0x27, 0x06, 0xdd, - 0x51, 0xda, 0x2c, 0x95, 0x41, 0x6d, 0x57, 0xe1, 0x68, 0x3e, 0x6b, 0xc4, 0xaa, 0xde, 0x87, 0xe1, 0x92, 0xc6, 0x56, - 0x56, 0x6e, 0x77, 0x13, 0x8e, 0x6c, 0x02, 0x5c, 0x9f, 0x82, 0xb2, 0x6a, 0xce, 0x41, 0x0b, 0x3a, 0x13, 0x38, 0xa2, - 0xed, 0x36, 0x84, 0x08, 0x1c, 0xc5, 0x70, 0x32, 0x0b, 0x8b, 0xe1, 0x50, 0x0d, 0x7c, 0x41, 0x48, 0xf4, 0xa9, 0x98, - 0x67, 0x0b, 0x85, 0xd8, 0xe3, 0xef, 0xa4, 0xdf, 0x0a, 0xc5, 0x29, 0xf7, 0x7e, 0x13, 0x64, 0xf3, 0x7b, 0x8a, 0x31, - 0x07, 0x9d, 0x66, 0x33, 0x03, 0x09, 0xeb, 0x71, 0x45, 0xd4, 0x3a, 0xb2, 0xb3, 0x01, 0xaa, 0x58, 0x34, 0x85, 0x05, - 0x75, 0x8b, 0x27, 0xd6, 0x33, 0x7a, 0x0f, 0x2a, 0x41, 0x54, 0x0b, 0x76, 0x63, 0xb8, 0xd6, 0x3e, 0x89, 0x50, 0x52, - 0x4e, 0x9a, 0xcc, 0x8c, 0x15, 0x0d, 0x16, 0x20, 0x24, 0x8d, 0xcb, 0xea, 0x8d, 0x4c, 0xb3, 0x8b, 0x0c, 0x10, 0x13, - 0x9c, 0xff, 0x9c, 0x6c, 0xbc, 0x79, 0xae, 0xe6, 0xa5, 0x2b, 0x71, 0x66, 0x61, 0x3e, 0xba, 0xde, 0xd2, 0x82, 0x44, - 0x05, 0xd0, 0x28, 0x5f, 0xcb, 0xf3, 0xd3, 0x8e, 0x55, 0xc8, 0xee, 0x87, 0x53, 0x65, 0x3b, 0xc4, 0x8f, 0x58, 0x45, - 0xbc, 0xd3, 0xba, 0x52, 0x22, 0x8d, 0x8e, 0xb6, 0x01, 0x31, 0x6c, 0xd9, 0xb7, 0xa8, 0xe1, 0x83, 0x30, 0x83, 0x4e, - 0xf2, 0x83, 0x9e, 0xd1, 0xb1, 0x35, 0x90, 0xf4, 0xb5, 0x08, 0xbe, 0x46, 0x47, 0x3a, 0x51, 0xa6, 0x91, 0x98, 0x42, - 0xa2, 0x5f, 0x2f, 0xb4, 0xc6, 0x32, 0xca, 0xbe, 0x22, 0xff, 0x7b, 0xdd, 0xbd, 0xdf, 0xc4, 0x76, 0x0b, 0x93, 0xec, - 0x79, 0x5c, 0xc1, 0xa6, 0x46, 0xad, 0x10, 0xce, 0xce, 0x71, 0x85, 0xda, 0xb1, 0x5e, 0x58, 0x02, 0x79, 0x00, 0x5b, - 0x91, 0x06, 0x65, 0x90, 0xec, 0x53, 0x31, 0x17, 0x0b, 0x27, 0xca, 0x91, 0x0a, 0xef, 0x4b, 0x8e, 0x52, 0x0e, 0x57, - 0xb1, 0xb0, 0x60, 0xc8, 0xaf, 0x8e, 0x2e, 0x0a, 0x79, 0x05, 0x92, 0x12, 0xc3, 0x50, 0x59, 0x5e, 0x17, 0x57, 0x6d, - 0x49, 0x68, 0xef, 0x0c, 0x40, 0x58, 0x0a, 0x10, 0xbc, 0x34, 0x6a, 0x88, 0xd9, 0x46, 0xed, 0xae, 0xe8, 0x5e, 0x72, - 0x40, 0x9d, 0xee, 0xda, 0xad, 0x37, 0x65, 0x9b, 0x6d, 0xc5, 0x85, 0x7f, 0x42, 0xe9, 0xc7, 0x7c, 0x50, 0xf8, 0x54, - 0x02, 0x37, 0xbe, 0xda, 0x64, 0xd9, 0xc5, 0x1d, 0x2e, 0xfd, 0xaa, 0x31, 0x7e, 0xfd, 0x7e, 0x4f, 0x2d, 0x84, 0x46, - 0x2a, 0x30, 0xdf, 0x3e, 0x33, 0x55, 0x19, 0x4d, 0xa9, 0xbd, 0x04, 0x57, 0xce, 0x7e, 0x04, 0x15, 0x71, 0x5d, 0x91, - 0xc9, 0xd4, 0x00, 0xed, 0x79, 0x59, 0xe1, 0x56, 0x16, 0xe0, 0xb1, 0x13, 0x90, 0xed, 0x96, 0x87, 0x81, 0x3e, 0x74, - 0x02, 0x7f, 0x4b, 0x9e, 0x22, 0xb3, 0x66, 0x1f, 0x7f, 0xd1, 0x82, 0x7f, 0x6c, 0xc1, 0xcf, 0x28, 0xee, 0xb4, 0x32, - 0xff, 0x56, 0x5a, 0xb7, 0xb8, 0x7f, 0x27, 0xd3, 0x84, 0xa2, 0x32, 0xa1, 0xf6, 0x2b, 0xfd, 0x97, 0x09, 0x96, 0xa4, - 0xb2, 0x7f, 0x90, 0xf0, 0xc1, 0xac, 0xf1, 0xc4, 0x1a, 0x4f, 0x86, 0xd3, 0xad, 0x34, 0x0c, 0x01, 0x0a, 0xfd, 0xbc, - 0xcc, 0x15, 0xd5, 0xcf, 0xbf, 0xac, 0xf9, 0x9a, 0x37, 0x5b, 0x6c, 0x93, 0x1e, 0x68, 0xb0, 0x97, 0x47, 0x53, 0x0a, - 0x27, 0x51, 0xe7, 0x46, 0xa2, 0x2e, 0x6a, 0x96, 0xa1, 0x3a, 0xc1, 0xab, 0x79, 0xaa, 0x87, 0xbd, 0x99, 0x88, 0xd6, - 0x4a, 0xca, 0x12, 0x03, 0xd6, 0x3a, 0xf2, 0x90, 0xdc, 0xad, 0x75, 0xdc, 0x69, 0xa8, 0x4b, 0x53, 0x28, 0x01, 0x56, - 0xb8, 0x00, 0x47, 0xd0, 0xcf, 0x45, 0xc8, 0xe1, 0x9a, 0xaa, 0xf4, 0x0b, 0x9a, 0x92, 0x27, 0x9e, 0xa2, 0x56, 0x2b, - 0xd2, 0xed, 0x47, 0x39, 0x76, 0xc3, 0x37, 0x4e, 0xc8, 0x89, 0x11, 0xfa, 0xbb, 0x63, 0x29, 0x67, 0x68, 0xf1, 0xa0, - 0x4e, 0xb0, 0x5e, 0xde, 0x52, 0xa0, 0x98, 0xa3, 0xcb, 0xaa, 0x6b, 0x5e, 0xa3, 0xed, 0xcb, 0xb2, 0xdf, 0xcf, 0x6d, - 0x3d, 0x29, 0x3b, 0xda, 0x2c, 0xcd, 0x3e, 0x44, 0xc5, 0x14, 0xee, 0xfa, 0x44, 0xf3, 0x57, 0xa1, 0xbe, 0x6a, 0xcb, - 0x9c, 0x8f, 0x38, 0xe2, 0x62, 0xe4, 0xa4, 0xfe, 0x45, 0x4d, 0xbd, 0x12, 0xf7, 0xab, 0x4a, 0xbe, 0x13, 0xc6, 0x8a, - 0xd1, 0x01, 0xf5, 0xa7, 0x4a, 0xe5, 0xfd, 0xb2, 0x00, 0xb8, 0x27, 0xc1, 0x3e, 0x81, 0x7d, 0x85, 0x46, 0xf8, 0x6d, - 0x09, 0xf8, 0x37, 0x8a, 0x1b, 0xb0, 0x0a, 0x0c, 0x30, 0x9a, 0x6c, 0xcf, 0x69, 0x02, 0x07, 0x9c, 0xd0, 0x2a, 0x0a, - 0x2a, 0xcc, 0xd0, 0x50, 0x5b, 0x18, 0x3d, 0x45, 0x19, 0xb7, 0xca, 0xec, 0xdd, 0x18, 0x3b, 0x2d, 0xf0, 0x1a, 0xfe, - 0x7c, 0x5e, 0xe8, 0x61, 0xa3, 0x0e, 0xd2, 0xa3, 0x93, 0x98, 0xfe, 0xb8, 0x85, 0x93, 0x9b, 0x85, 0xb3, 0xac, 0x59, - 0x02, 0xdd, 0x81, 0x0b, 0x62, 0xdc, 0xef, 0xe7, 0x70, 0x64, 0x9a, 0x91, 0x2f, 0x58, 0x4e, 0x63, 0xb6, 0xa4, 0xda, - 0xd3, 0xee, 0xb2, 0x0a, 0x73, 0xba, 0xb4, 0x32, 0xde, 0x94, 0x81, 0xca, 0x68, 0xbb, 0x0d, 0xe1, 0x4f, 0xb7, 0xb5, - 0x4b, 0x3a, 0x5f, 0x42, 0x06, 0xf8, 0x03, 0x12, 0x51, 0xc4, 0xbe, 0xfe, 0xb7, 0x1a, 0xa7, 0xf4, 0x44, 0x69, 0xcd, - 0x12, 0xba, 0x66, 0xba, 0x7e, 0x7a, 0xc1, 0xd6, 0x8d, 0xa5, 0xb0, 0xdd, 0x86, 0xcd, 0x04, 0xa6, 0x39, 0x57, 0x32, - 0xbd, 0x40, 0x9d, 0x14, 0x50, 0xb1, 0xf0, 0x02, 0x97, 0x5f, 0x4a, 0x28, 0x34, 0x77, 0xbe, 0x5c, 0x18, 0x25, 0x26, - 0xb4, 0x4a, 0x7e, 0xf9, 0x50, 0x99, 0xaf, 0x8d, 0x47, 0xdc, 0xbf, 0xd2, 0x30, 0x31, 0x45, 0xa2, 0x42, 0x74, 0xf6, - 0x1b, 0xc8, 0x72, 0x04, 0xe0, 0x58, 0x9e, 0xca, 0x9a, 0xfe, 0x98, 0x42, 0x1c, 0x74, 0x68, 0xd0, 0xbb, 0x42, 0x5e, - 0x65, 0x25, 0x0f, 0xf1, 0x9e, 0xe0, 0x69, 0x46, 0xef, 0x37, 0xf8, 0xd0, 0xd6, 0x1e, 0x3d, 0x41, 0x36, 0x9e, 0x72, - 0xbf, 0xfe, 0x4e, 0x84, 0x73, 0x88, 0x56, 0xb9, 0xa0, 0x5a, 0x5d, 0xed, 0x00, 0xa8, 0x3c, 0xdb, 0xab, 0x47, 0x70, - 0xba, 0xe9, 0xeb, 0x5b, 0x15, 0x3a, 0x73, 0x00, 0x69, 0x0f, 0xc9, 0xba, 0xe6, 0x7a, 0x07, 0xb8, 0x23, 0xb1, 0x5a, - 0x03, 0x8d, 0x75, 0x5b, 0xb3, 0xd3, 0x1e, 0xc5, 0x63, 0x22, 0x33, 0x63, 0x91, 0x62, 0xcc, 0xdd, 0x3a, 0x2d, 0x8a, - 0x36, 0x68, 0x86, 0xb0, 0x7b, 0xd7, 0xe1, 0xeb, 0x56, 0x84, 0xf5, 0xfb, 0x6d, 0x5f, 0x60, 0x34, 0x8c, 0xb9, 0x76, - 0xcf, 0x33, 0x74, 0xc3, 0x06, 0xdb, 0xc8, 0x79, 0x88, 0x7c, 0x98, 0xa9, 0x03, 0x51, 0xd6, 0xd6, 0x80, 0xed, 0x11, - 0xd7, 0x9b, 0x56, 0xf1, 0xf3, 0x2a, 0xe6, 0x6c, 0xcf, 0x1a, 0xa7, 0xb4, 0xbe, 0xc6, 0x35, 0xc7, 0x55, 0x21, 0xa2, - 0xb6, 0x9e, 0xf1, 0x30, 0xec, 0x7c, 0x81, 0x3b, 0xb3, 0xc2, 0xe0, 0x45, 0x58, 0x2a, 0xd9, 0xa9, 0x5c, 0x7f, 0x0e, - 0x5b, 0x1c, 0xa4, 0xf2, 0xa5, 0xd7, 0xdf, 0x7f, 0xf9, 0xe2, 0x0b, 0x74, 0x53, 0x73, 0x7e, 0x04, 0x41, 0x26, 0xd0, - 0x21, 0x4b, 0xa9, 0x1e, 0xbf, 0x2b, 0x80, 0xda, 0xc3, 0x3c, 0x7c, 0x57, 0x30, 0x11, 0x5f, 0x67, 0x97, 0x71, 0x25, - 0x8b, 0xd1, 0x35, 0x17, 0xa9, 0x2c, 0xac, 0xd4, 0x38, 0x38, 0x5e, 0xad, 0x72, 0x1e, 0x80, 0xa9, 0xbc, 0x65, 0x94, - 0x6d, 0x65, 0x99, 0x1e, 0x5c, 0x2d, 0x4f, 0xaf, 0xb4, 0xe8, 0xbc, 0xbc, 0xbe, 0x0c, 0x22, 0xfc, 0x75, 0x6e, 0x7e, - 0x5c, 0xc5, 0xe5, 0xc7, 0x20, 0xb2, 0x36, 0x75, 0xe6, 0x07, 0x4a, 0xe5, 0xc1, 0x7f, 0x0a, 0x64, 0xba, 0xdf, 0x15, - 0x60, 0x99, 0x6d, 0x2b, 0x3e, 0x8c, 0xb1, 0xd6, 0xe1, 0x84, 0xcc, 0x54, 0x89, 0xde, 0xbb, 0x64, 0x5d, 0x80, 0xb5, - 0x9f, 0xc2, 0x32, 0x56, 0xb9, 0x66, 0x58, 0x99, 0xaa, 0xc8, 0xcc, 0xca, 0x9a, 0xed, 0x87, 0xd6, 0x89, 0x66, 0x8e, - 0xde, 0x02, 0xfa, 0x81, 0xec, 0x5f, 0xd2, 0x72, 0xcd, 0x3c, 0x1f, 0x9b, 0xc6, 0xeb, 0x47, 0xfb, 0x97, 0x6e, 0xc1, - 0xde, 0xda, 0x3b, 0x39, 0x0a, 0x13, 0xc1, 0xb3, 0xd6, 0x8c, 0x2f, 0xf2, 0xac, 0x80, 0x95, 0x33, 0x19, 0x8f, 0xa9, - 0xb7, 0xb4, 0x5a, 0x37, 0x47, 0x87, 0xe4, 0x9a, 0x3d, 0xae, 0x1e, 0x73, 0xb2, 0xcf, 0x5b, 0xa6, 0xb6, 0x6d, 0xeb, - 0x38, 0x4f, 0x93, 0xaf, 0x4c, 0xf7, 0xc5, 0xda, 0x46, 0x44, 0x57, 0xce, 0x7d, 0xce, 0x2b, 0xb8, 0xf5, 0x4d, 0x69, - 0xe8, 0xb5, 0x04, 0x20, 0x3a, 0x6d, 0xc0, 0x5f, 0xb0, 0x72, 0x3d, 0xaa, 0x78, 0x59, 0x81, 0x84, 0x05, 0x45, 0x78, - 0x53, 0xec, 0x4d, 0xe1, 0x6e, 0x9c, 0x9e, 0xc3, 0x0e, 0x5c, 0x4c, 0xd1, 0x1d, 0x27, 0x26, 0xb3, 0xd2, 0x68, 0x45, - 0x23, 0xfd, 0xcb, 0xf5, 0x25, 0xd6, 0x7d, 0xd1, 0xca, 0x3c, 0x9b, 0x53, 0x61, 0xb1, 0xbb, 0xca, 0xa5, 0x13, 0xf5, - 0x5b, 0x26, 0x5c, 0xb9, 0x12, 0x04, 0x64, 0x5a, 0xb0, 0x5e, 0x61, 0x76, 0x91, 0x5c, 0x03, 0x21, 0x03, 0xc3, 0xd7, - 0x60, 0x2d, 0x4a, 0x6e, 0xac, 0x60, 0xbd, 0x7b, 0xbe, 0x4e, 0x10, 0x52, 0xf0, 0xc0, 0x4d, 0xd0, 0x0f, 0xad, 0x9b, - 0xb7, 0xa3, 0x44, 0x19, 0xc4, 0xe3, 0xd6, 0x4e, 0x39, 0x48, 0x20, 0x00, 0xf7, 0x54, 0x85, 0xe0, 0x50, 0x20, 0xeb, - 0xe0, 0x6a, 0xc6, 0x11, 0x5c, 0x5d, 0x39, 0x73, 0x71, 0x03, 0xb0, 0xae, 0xfc, 0xb9, 0x6c, 0x70, 0x61, 0x3d, 0xa2, - 0xca, 0x9c, 0x71, 0x8a, 0x41, 0x8c, 0x2c, 0x41, 0x5f, 0x59, 0x4a, 0x7b, 0x09, 0x9a, 0xc6, 0x2b, 0xb6, 0x52, 0x3e, - 0x00, 0xf4, 0x9c, 0xad, 0x94, 0xb1, 0x3f, 0x7e, 0x7d, 0xc6, 0x56, 0x5a, 0x1a, 0x3c, 0xbd, 0x9a, 0x9d, 0xcf, 0xce, - 0x06, 0xec, 0x20, 0x0a, 0xb5, 0x01, 0x43, 0xe0, 0x90, 0xf8, 0x83, 0x41, 0xa8, 0xf1, 0x4e, 0x06, 0x2a, 0x20, 0x16, - 0xf1, 0x78, 0x6c, 0xc4, 0xcd, 0x0a, 0xc7, 0x43, 0x0c, 0x7e, 0xd5, 0x7c, 0x41, 0x02, 0x42, 0x4d, 0x69, 0xe8, 0xf2, - 0x18, 0x0e, 0x27, 0x7b, 0x13, 0x48, 0xc5, 0xcc, 0x4c, 0x15, 0xc6, 0xc6, 0x24, 0x82, 0x78, 0xa7, 0x9d, 0xf5, 0x42, - 0xb9, 0xdd, 0x35, 0x1a, 0xc8, 0x95, 0xc1, 0x17, 0x55, 0x3c, 0xd9, 0x1b, 0x76, 0x55, 0x8c, 0xa3, 0x70, 0x6d, 0x94, - 0x6f, 0x67, 0x87, 0x00, 0x5e, 0x7b, 0x36, 0xf4, 0xe5, 0x12, 0x67, 0xfb, 0x4f, 0xc9, 0xe3, 0xa7, 0x84, 0x9e, 0xb1, - 0xb3, 0xaf, 0x9e, 0xd2, 0x33, 0x45, 0x4e, 0xf6, 0x26, 0xd1, 0x35, 0xb3, 0x98, 0x2f, 0x07, 0xaa, 0x09, 0xf4, 0x72, - 0xb4, 0x16, 0x6a, 0x81, 0x69, 0x87, 0xa6, 0xf0, 0xdb, 0xf1, 0x5e, 0x30, 0xb8, 0x6e, 0x37, 0xfd, 0xba, 0xdd, 0x56, - 0xcf, 0xab, 0x6b, 0xef, 0x20, 0xda, 0x2d, 0x66, 0xf2, 0xf7, 0xf1, 0x9e, 0x9b, 0x03, 0xac, 0xef, 0xe1, 0x31, 0x31, - 0x4d, 0xda, 0x19, 0x15, 0xbf, 0xa6, 0x27, 0xd8, 0x87, 0x66, 0x91, 0x1d, 0x7d, 0x18, 0xfe, 0x5b, 0x9d, 0xa8, 0xcf, - 0xbe, 0x3a, 0x00, 0x72, 0x04, 0x32, 0x50, 0x2c, 0x11, 0xcc, 0x70, 0xa0, 0x29, 0xa0, 0x20, 0xd3, 0xe3, 0x4e, 0xf5, - 0xf0, 0xab, 0x51, 0x53, 0x33, 0x72, 0x0d, 0x53, 0x83, 0x6d, 0xc1, 0x0f, 0x54, 0x37, 0xf4, 0x37, 0x1a, 0xdd, 0x48, - 0x3b, 0x99, 0x99, 0x97, 0xd4, 0xc6, 0x75, 0xbb, 0x86, 0x00, 0xc6, 0x0e, 0x5e, 0x50, 0xb2, 0xaf, 0x0f, 0x2f, 0xf7, - 0x70, 0x15, 0x01, 0x4a, 0x16, 0x0b, 0xbe, 0x1e, 0x5c, 0xea, 0xcd, 0xbd, 0x17, 0x90, 0xc1, 0xd7, 0xc1, 0xd1, 0xd7, - 0x03, 0x39, 0x08, 0x0e, 0xf7, 0x2f, 0x8f, 0x02, 0x67, 0xdc, 0x0f, 0x21, 0x1e, 0x55, 0x45, 0x31, 0x13, 0xa6, 0x8a, - 0xc4, 0xd6, 0x9e, 0xdb, 0x7a, 0x95, 0xf1, 0x19, 0x4d, 0xa7, 0x16, 0xf9, 0x3b, 0x4c, 0x59, 0x6c, 0x7e, 0x07, 0x13, - 0x7e, 0x15, 0x44, 0x2e, 0x08, 0xea, 0x2c, 0x8f, 0x62, 0xba, 0x64, 0xb7, 0x22, 0x4c, 0x69, 0xb2, 0x9f, 0x13, 0x12, - 0x85, 0x4b, 0x05, 0x9e, 0xa7, 0x5e, 0x27, 0x10, 0xc7, 0xd5, 0x7d, 0x7e, 0x2b, 0xc2, 0x25, 0xcd, 0xf7, 0x13, 0xd2, - 0x2a, 0xc2, 0x45, 0x64, 0xd9, 0xd4, 0xf4, 0x82, 0x85, 0x2b, 0x7a, 0x09, 0xcc, 0x94, 0x5c, 0x87, 0x97, 0xc0, 0xe5, - 0xad, 0xe7, 0xab, 0x05, 0xbb, 0x6c, 0x48, 0xdf, 0x0c, 0x5f, 0x7c, 0x61, 0x7d, 0xf2, 0x80, 0x87, 0x74, 0x7e, 0x78, - 0x29, 0xd8, 0x00, 0x5c, 0x67, 0xfc, 0xe6, 0x3b, 0x79, 0xab, 0xe7, 0xa5, 0x3d, 0xc5, 0x38, 0x33, 0xed, 0xc4, 0xa4, - 0x9d, 0x90, 0xfb, 0xf7, 0xed, 0x4d, 0x6c, 0x4e, 0xf6, 0x32, 0x5a, 0x2b, 0x97, 0x55, 0xcb, 0x90, 0x14, 0x6b, 0x86, - 0xfc, 0x3d, 0x4a, 0x4e, 0xad, 0xc0, 0x93, 0x5d, 0xf0, 0x2a, 0x59, 0xfa, 0x07, 0x95, 0xb5, 0x1a, 0xb0, 0xc7, 0x88, - 0x65, 0xa1, 0x70, 0xec, 0xdf, 0x64, 0xac, 0x58, 0xfb, 0x02, 0x8d, 0x18, 0xb9, 0xb7, 0x37, 0x19, 0xf3, 0x62, 0xae, - 0x26, 0x6b, 0x2f, 0x54, 0x9d, 0x97, 0x9e, 0xb7, 0x78, 0x2f, 0xa7, 0xd4, 0x30, 0x12, 0xd1, 0xbd, 0xb1, 0x32, 0xa3, - 0x54, 0x89, 0x5a, 0x83, 0x46, 0x04, 0x1b, 0xbb, 0xe0, 0x97, 0xe0, 0x84, 0xca, 0x3d, 0x75, 0xb6, 0x6f, 0xa7, 0x54, - 0x7a, 0xc0, 0xb2, 0xd4, 0xa8, 0xca, 0xdd, 0x32, 0x93, 0xac, 0x1a, 0x04, 0xa3, 0x3f, 0x4b, 0x29, 0x66, 0x78, 0x67, - 0x64, 0xc1, 0x14, 0xac, 0x04, 0x55, 0x2d, 0xc3, 0x72, 0xc8, 0x51, 0x8b, 0x67, 0x7c, 0x52, 0xa5, 0xfe, 0xd1, 0x11, - 0x24, 0x77, 0xb9, 0x6e, 0x05, 0xc9, 0x7d, 0x3a, 0x7e, 0xaa, 0x07, 0x3a, 0x5d, 0x6b, 0xc7, 0x43, 0x9f, 0xdf, 0x46, - 0x7c, 0x6d, 0xdd, 0x7b, 0xaa, 0xb5, 0x0a, 0x65, 0xa0, 0xc5, 0x8a, 0xca, 0x95, 0x5a, 0xd2, 0xfb, 0x5d, 0x04, 0xc0, - 0x22, 0x36, 0x66, 0xe3, 0x5d, 0xdb, 0xac, 0x10, 0x34, 0xba, 0xec, 0x68, 0x13, 0x0f, 0x58, 0xa2, 0x5b, 0x3b, 0x98, - 0xd0, 0xf8, 0x88, 0x95, 0xfd, 0x7e, 0x7e, 0x04, 0xf4, 0x54, 0x1b, 0x31, 0x15, 0x70, 0xe4, 0x7f, 0x69, 0x45, 0xa6, - 0x28, 0xb0, 0x59, 0x53, 0x77, 0x6b, 0x2c, 0x23, 0xd1, 0x97, 0x29, 0x5d, 0x9e, 0xf0, 0x0c, 0x98, 0xd6, 0xeb, 0x96, - 0xe3, 0xca, 0xae, 0xe2, 0xc8, 0x53, 0x61, 0x59, 0x71, 0x5e, 0x85, 0xe3, 0xad, 0xc7, 0x37, 0xd8, 0x37, 0x6c, 0xda, - 0x85, 0x3f, 0x84, 0xb0, 0x10, 0xde, 0x64, 0x70, 0x1b, 0xd1, 0x76, 0x12, 0xa8, 0xbc, 0x31, 0xd7, 0x09, 0x65, 0x73, - 0xbb, 0x5e, 0x7b, 0x06, 0xe9, 0xc4, 0x1c, 0x28, 0xd5, 0x08, 0x5a, 0xa3, 0x59, 0x50, 0x35, 0xe2, 0x91, 0xe3, 0xe1, - 0x9d, 0x41, 0xac, 0x96, 0x2f, 0x69, 0x2a, 0x45, 0x03, 0x30, 0x2e, 0x80, 0xcb, 0xd3, 0xaf, 0xef, 0x7f, 0x3e, 0xe5, - 0x71, 0x91, 0x2c, 0xdf, 0xc5, 0x45, 0x7c, 0x55, 0x86, 0x1b, 0x35, 0x46, 0x71, 0x4d, 0xa6, 0x62, 0xc0, 0xa4, 0x59, - 0x49, 0xcd, 0x5d, 0xa9, 0x09, 0x31, 0xd6, 0x99, 0xac, 0xcb, 0x4a, 0x5e, 0x35, 0x2a, 0x5d, 0x17, 0x19, 0x7e, 0xdc, - 0xf2, 0x39, 0xdd, 0x07, 0x20, 0x4f, 0xe3, 0x42, 0x1a, 0x49, 0x5d, 0x88, 0x31, 0x17, 0xf1, 0xba, 0x3e, 0x1e, 0x37, - 0xba, 0x5e, 0xb2, 0x67, 0xe3, 0x27, 0xd3, 0x37, 0x59, 0x98, 0x0d, 0x04, 0x19, 0x55, 0x4b, 0x2e, 0x5a, 0xa6, 0x9c, - 0xca, 0x24, 0x00, 0x7d, 0x3c, 0x7b, 0x8c, 0x1d, 0x8c, 0xc7, 0x64, 0xd3, 0x16, 0x0f, 0xf0, 0x70, 0xb9, 0x0e, 0x0b, - 0x32, 0xd3, 0x75, 0x44, 0x81, 0xe0, 0xb7, 0x55, 0x00, 0x48, 0x8e, 0xb6, 0x2a, 0xc3, 0xa5, 0xb1, 0x67, 0xe3, 0x09, - 0x95, 0xd8, 0xed, 0x90, 0xd4, 0x5e, 0x85, 0x6e, 0xe6, 0xa5, 0xef, 0x51, 0x24, 0x8d, 0xcb, 0xd2, 0x4e, 0xa5, 0x52, - 0xed, 0x99, 0x99, 0xeb, 0x1a, 0xc4, 0x60, 0x08, 0x75, 0xdd, 0xa5, 0x57, 0xf7, 0x6e, 0x73, 0xad, 0xd9, 0x0e, 0x78, - 0xaf, 0x41, 0x33, 0x94, 0xbc, 0xc5, 0xbc, 0x75, 0x45, 0xd4, 0x74, 0xb5, 0x06, 0xb3, 0x62, 0x94, 0x2d, 0x45, 0xe9, - 0x9a, 0x82, 0x52, 0x30, 0xba, 0x58, 0x7b, 0x0b, 0xf7, 0x8d, 0x6c, 0x5c, 0x58, 0x32, 0xbd, 0x5a, 0x94, 0x94, 0x50, - 0xdd, 0x54, 0x8c, 0x94, 0x30, 0x52, 0x1a, 0x9e, 0xca, 0xf7, 0x02, 0x8f, 0xf3, 0x3c, 0x88, 0x5a, 0x5e, 0x60, 0xc7, - 0x15, 0x39, 0x06, 0x47, 0x2f, 0x93, 0xd3, 0x50, 0xe0, 0x1f, 0x33, 0x05, 0x62, 0x3a, 0x54, 0xf7, 0x1b, 0xdc, 0xfc, - 0xff, 0x28, 0x58, 0xe0, 0xf1, 0xad, 0x97, 0xb8, 0x8d, 0xfe, 0x51, 0xf8, 0xb4, 0xf4, 0xb9, 0xf4, 0x5d, 0x5d, 0x3c, - 0x69, 0x6f, 0x36, 0x4a, 0x96, 0x59, 0x9e, 0xbe, 0x95, 0x29, 0x07, 0x91, 0x19, 0x5a, 0x83, 0xb2, 0x23, 0xd1, 0xb8, - 0xe1, 0x81, 0x11, 0x63, 0xe3, 0xc6, 0xf7, 0x63, 0x06, 0xb2, 0x61, 0xb0, 0xfa, 0x66, 0xa9, 0x4c, 0xd6, 0x57, 0x80, - 0x29, 0xa2, 0xe4, 0x27, 0x2f, 0x73, 0x0e, 0x4f, 0xa1, 0xbe, 0x7e, 0x81, 0xdb, 0x5c, 0xe9, 0xfb, 0x9c, 0xff, 0x98, - 0xd1, 0x1f, 0x11, 0xe8, 0x24, 0x5e, 0x81, 0xdc, 0xe3, 0x39, 0xd4, 0x8d, 0x30, 0xb5, 0x1c, 0x83, 0x03, 0x21, 0x1a, - 0x88, 0xa8, 0x58, 0xa0, 0xa0, 0x2e, 0x0c, 0xb0, 0x86, 0xba, 0x60, 0x0e, 0xcf, 0x73, 0x99, 0x7c, 0x9c, 0x1a, 0x9f, - 0xf9, 0x61, 0x8c, 0x31, 0x93, 0x83, 0x41, 0x58, 0xcd, 0x82, 0xe1, 0x78, 0x34, 0x39, 0x78, 0x06, 0xe7, 0x76, 0x30, - 0x0e, 0xc8, 0x20, 0xa8, 0xcb, 0x55, 0x2c, 0x68, 0x79, 0x7d, 0x69, 0xcb, 0xc0, 0x8f, 0xeb, 0x60, 0xf0, 0x8f, 0xc2, - 0x53, 0xbc, 0x83, 0xe6, 0xe4, 0x4c, 0x86, 0x60, 0x63, 0xbf, 0x26, 0x20, 0x29, 0xeb, 0x69, 0x7e, 0x52, 0x1f, 0x6e, - 0x4c, 0x69, 0xff, 0xcc, 0xe1, 0x05, 0x87, 0x1d, 0x12, 0x28, 0x90, 0xc6, 0xd3, 0x6c, 0xf4, 0x5a, 0x29, 0x72, 0xdf, - 0x15, 0x1c, 0xee, 0xcc, 0x3d, 0x67, 0x7a, 0xe4, 0x14, 0x12, 0xcd, 0x2c, 0xe0, 0x46, 0xfe, 0x5a, 0x5c, 0xc7, 0x79, - 0x96, 0xee, 0x35, 0xdf, 0xec, 0x95, 0x77, 0xa2, 0x8a, 0x6f, 0x47, 0x81, 0xb1, 0x26, 0xe4, 0xbe, 0xea, 0x09, 0xd0, - 0x13, 0x60, 0x0b, 0x80, 0x01, 0xf1, 0x8e, 0x99, 0xc9, 0x8c, 0x47, 0xe0, 0x11, 0xd8, 0xf4, 0x81, 0x2c, 0xee, 0x9c, - 0x4b, 0x92, 0xbf, 0x99, 0x4a, 0x7b, 0xd5, 0x2b, 0x77, 0x0a, 0xb2, 0x5e, 0x6d, 0xe5, 0xae, 0x5b, 0x9f, 0x7d, 0xd3, - 0xe1, 0x15, 0x78, 0x2e, 0xc1, 0x2d, 0xb2, 0xdf, 0x6f, 0x0a, 0x2a, 0x85, 0x51, 0x11, 0xef, 0x24, 0xd7, 0xe8, 0xdf, - 0xee, 0x8d, 0x8d, 0x22, 0xb9, 0xe5, 0xc3, 0x03, 0xa8, 0x33, 0x79, 0x57, 0xdc, 0xce, 0x21, 0x6a, 0xeb, 0x6e, 0x3c, - 0xb0, 0xda, 0xa0, 0x5d, 0xd6, 0x1c, 0xc1, 0x85, 0x17, 0x7b, 0x19, 0x8c, 0x05, 0xce, 0xca, 0x48, 0xa9, 0x71, 0x0d, - 0xa9, 0x05, 0x9f, 0xe4, 0xe9, 0x3d, 0x64, 0xa9, 0x27, 0x41, 0x91, 0xe3, 0x59, 0x0c, 0x99, 0xc6, 0xdb, 0xc0, 0xe3, - 0x77, 0x32, 0x04, 0x69, 0xda, 0x76, 0xdb, 0x1c, 0x81, 0xb2, 0x7b, 0x60, 0x4a, 0x52, 0xd7, 0xc6, 0xd4, 0x40, 0x43, - 0xed, 0xa1, 0x46, 0x2a, 0xe2, 0xec, 0xe8, 0x0d, 0xe8, 0x10, 0xc1, 0xf7, 0x3b, 0xcd, 0xca, 0x8e, 0x17, 0x13, 0x82, - 0x27, 0xef, 0xcb, 0xdb, 0xac, 0xac, 0xca, 0xe8, 0x7d, 0x8a, 0x86, 0x50, 0x89, 0x14, 0xd1, 0x2b, 0x88, 0xa7, 0x57, - 0xe2, 0xef, 0x32, 0xfa, 0x39, 0xa5, 0x71, 0x9a, 0x62, 0xfa, 0x8b, 0x02, 0x7e, 0x3e, 0x07, 0x54, 0x47, 0xdc, 0x09, - 0xd1, 0xb9, 0x04, 0x7b, 0x35, 0x88, 0x66, 0x55, 0x71, 0xc0, 0xd0, 0x8c, 0x6e, 0x05, 0x45, 0x8c, 0x36, 0xcc, 0xfe, - 0x43, 0x81, 0x42, 0x21, 0x55, 0xcc, 0x77, 0xc2, 0x3e, 0x44, 0x3f, 0x62, 0x91, 0xc7, 0xef, 0x5e, 0x9b, 0x21, 0x8d, - 0xee, 0x24, 0xd5, 0x5b, 0x1b, 0x8f, 0x2d, 0x0c, 0x5c, 0x16, 0x5d, 0xae, 0xe9, 0x59, 0xbc, 0xca, 0xa2, 0x0d, 0xe0, - 0x4f, 0xbc, 0x7b, 0xfd, 0x5c, 0x59, 0x98, 0xbc, 0xc8, 0x40, 0x71, 0x70, 0xfc, 0xee, 0xf5, 0x1b, 0x99, 0xae, 0x73, - 0x1e, 0x9d, 0x49, 0x24, 0xad, 0xc7, 0xef, 0x5e, 0xff, 0x82, 0xe6, 0x5e, 0x3f, 0x17, 0xf0, 0xfe, 0x15, 0xf0, 0x96, - 0x51, 0xbc, 0x86, 0x3e, 0xa9, 0xdf, 0xc9, 0x1a, 0x3b, 0xe5, 0xd5, 0x5a, 0x46, 0xbf, 0xa6, 0xb5, 0x27, 0xad, 0xfa, - 0x67, 0xe1, 0x53, 0x3b, 0x4f, 0xc0, 0x73, 0x9b, 0x67, 0xe2, 0x63, 0x64, 0x45, 0x3b, 0x41, 0xf4, 0xf5, 0xde, 0xed, - 0x55, 0x2e, 0xca, 0x08, 0x5f, 0x30, 0xb4, 0x0b, 0x8a, 0xf6, 0xf7, 0x6f, 0x6e, 0x6e, 0x46, 0x37, 0x4f, 0x46, 0xb2, - 0xb8, 0xdc, 0x9f, 0x7c, 0xfb, 0xed, 0xb7, 0xfb, 0xf8, 0x36, 0xf8, 0xba, 0xed, 0xf6, 0x5e, 0x11, 0x3e, 0x60, 0x01, - 0x22, 0x54, 0x7f, 0x0d, 0x57, 0x14, 0xd0, 0xc2, 0x0d, 0xbe, 0x0e, 0xbe, 0xd6, 0x87, 0xce, 0xd7, 0x87, 0xe5, 0xf5, - 0xa5, 0x2a, 0xbf, 0xab, 0xe4, 0x83, 0xf1, 0x78, 0xbc, 0x0f, 0x12, 0xa8, 0xaf, 0x07, 0x7c, 0x10, 0x1c, 0x05, 0x83, - 0x0c, 0x2e, 0x34, 0xe5, 0xf5, 0xe5, 0x51, 0xe0, 0x99, 0xe6, 0x36, 0x58, 0x44, 0x07, 0xe2, 0x12, 0xec, 0x5f, 0xd2, - 0xe0, 0xeb, 0x80, 0xb8, 0x94, 0xaf, 0x20, 0xe5, 0xab, 0x83, 0x67, 0x7e, 0xda, 0xff, 0x52, 0x69, 0x4f, 0xfc, 0xb4, - 0x43, 0x4c, 0x7b, 0xf2, 0xdc, 0x4f, 0x3b, 0x52, 0x69, 0x2f, 0xfd, 0xb4, 0xff, 0x5d, 0x0e, 0x20, 0x75, 0xcf, 0xb7, - 0xfe, 0x3b, 0xf7, 0x5a, 0x83, 0xa7, 0x50, 0x94, 0x5d, 0xc5, 0x97, 0x1c, 0x1a, 0x3d, 0xb8, 0xbd, 0xca, 0x69, 0x30, - 0xc0, 0xf6, 0x7a, 0x26, 0x21, 0xde, 0x07, 0x5f, 0xaf, 0x8b, 0x3c, 0x0c, 0xbe, 0x1e, 0x60, 0x21, 0x83, 0xaf, 0x03, - 0xf2, 0xb5, 0x31, 0x90, 0x11, 0x6c, 0x13, 0xb8, 0x50, 0xa4, 0x43, 0x1b, 0x20, 0xcc, 0x97, 0xc6, 0xd5, 0xf4, 0xaf, - 0xa2, 0x3b, 0x1b, 0xde, 0x12, 0x95, 0x9b, 0x6e, 0x50, 0xd3, 0x13, 0xf0, 0x4e, 0x80, 0x46, 0x45, 0xc1, 0x75, 0x5c, - 0x84, 0xc3, 0x61, 0x79, 0x7d, 0x49, 0xc0, 0x2e, 0x73, 0xc5, 0xe3, 0x2a, 0x0a, 0x84, 0x1c, 0xaa, 0x9f, 0x81, 0x8a, - 0x7c, 0x15, 0x20, 0x20, 0x12, 0xfc, 0x17, 0xd4, 0xf4, 0x9d, 0x64, 0x9b, 0x60, 0x78, 0xc3, 0xcf, 0x3f, 0x66, 0xd5, - 0x50, 0x89, 0x16, 0xaf, 0x05, 0x85, 0x1f, 0xf0, 0xd7, 0x55, 0x1d, 0xfd, 0x05, 0x6e, 0xdc, 0x4d, 0x0d, 0xfb, 0x3b, - 0xe9, 0x58, 0xd4, 0x77, 0x72, 0x9e, 0x2d, 0xa6, 0xad, 0x03, 0xfd, 0x44, 0x92, 0x6a, 0x9e, 0x0d, 0x82, 0x61, 0x30, - 0xe0, 0x0b, 0x76, 0x22, 0xe7, 0xdc, 0x33, 0x9f, 0x7a, 0x24, 0xfd, 0x69, 0x9e, 0x65, 0x03, 0xf0, 0x4d, 0x41, 0x7e, - 0x64, 0xff, 0xbf, 0xe7, 0x43, 0x14, 0x1e, 0x0e, 0x1e, 0xed, 0x93, 0x59, 0xb0, 0xba, 0x45, 0x8f, 0xce, 0x28, 0xc8, - 0xc4, 0x92, 0x17, 0x59, 0xe5, 0x2d, 0x95, 0xbb, 0x75, 0xdb, 0xcb, 0xe3, 0xde, 0xb3, 0x79, 0x15, 0x8b, 0x40, 0x9d, - 0x73, 0xa0, 0x78, 0x43, 0xd9, 0x53, 0xd9, 0x94, 0x90, 0x6a, 0x43, 0xde, 0xb0, 0x1c, 0xb0, 0xe0, 0xb0, 0x37, 0x1c, - 0xee, 0x05, 0x03, 0xa7, 0xce, 0x1d, 0x04, 0x7b, 0xc3, 0xe1, 0x51, 0xe0, 0xee, 0x43, 0xd9, 0xc8, 0xdd, 0x19, 0x69, - 0xc1, 0xfe, 0x59, 0x84, 0x25, 0x05, 0xf1, 0x98, 0xd4, 0xe2, 0x2f, 0x0d, 0x2e, 0x33, 0x00, 0xe8, 0x23, 0x25, 0x01, - 0x33, 0xb0, 0x32, 0x03, 0x08, 0xcd, 0x4d, 0x63, 0x76, 0x06, 0xcc, 0x23, 0x70, 0xcc, 0x23, 0x64, 0x1c, 0x00, 0xb1, - 0x24, 0xc0, 0xb9, 0x0b, 0xa2, 0x58, 0x17, 0xf2, 0x08, 0x40, 0xef, 0xf1, 0x27, 0x31, 0xa5, 0x60, 0x92, 0x8e, 0x55, - 0x08, 0x82, 0x38, 0x3e, 0xbb, 0x16, 0xad, 0xc9, 0x59, 0xa2, 0x83, 0x19, 0x49, 0x80, 0x0d, 0x31, 0xb0, 0x73, 0x70, - 0x3f, 0x07, 0xa5, 0x87, 0xd5, 0x3b, 0x21, 0x17, 0x7c, 0xc7, 0x3d, 0xd9, 0x2c, 0x5c, 0x3d, 0xe1, 0x20, 0xb8, 0xe3, - 0x9a, 0x05, 0x18, 0x55, 0xc5, 0xba, 0xac, 0x78, 0xfa, 0xe1, 0x6e, 0x05, 0xb1, 0xef, 0x70, 0x40, 0xdf, 0xc9, 0x3c, - 0x4b, 0xee, 0x42, 0x67, 0xcf, 0xb5, 0x51, 0xe9, 0x3f, 0x7c, 0x78, 0xf3, 0x73, 0x04, 0x22, 0xc7, 0xda, 0x50, 0xfa, - 0x3b, 0x8e, 0x67, 0x93, 0x1f, 0xe1, 0xc9, 0xdf, 0xd8, 0x77, 0xdc, 0x9e, 0x1e, 0xfd, 0x3e, 0xd4, 0x4d, 0xef, 0xf8, - 0xec, 0x8e, 0x8f, 0x5c, 0x71, 0xa8, 0xae, 0x70, 0x5f, 0xdf, 0xac, 0x7d, 0x23, 0xa4, 0x87, 0xe7, 0x99, 0xf2, 0xc6, - 0xfc, 0x68, 0x07, 0xc3, 0x20, 0x98, 0x6a, 0xa1, 0x24, 0x44, 0xdd, 0x60, 0x4a, 0xc0, 0x10, 0xed, 0xe9, 0x65, 0x35, - 0x45, 0xce, 0x4d, 0x8d, 0x2c, 0xbc, 0x1f, 0x30, 0x2d, 0x74, 0x68, 0xe4, 0x50, 0x7e, 0x70, 0x38, 0x61, 0xcc, 0xc2, - 0x6f, 0x95, 0x30, 0xfd, 0x6a, 0x51, 0x39, 0x07, 0xd1, 0x3d, 0x30, 0xc6, 0x15, 0xbc, 0x80, 0xae, 0xb0, 0xeb, 0xb5, - 0x8a, 0x8a, 0x81, 0xe0, 0x71, 0xc8, 0x01, 0x7a, 0xd8, 0x05, 0x2d, 0x2b, 0x4b, 0x75, 0xab, 0x72, 0x96, 0x2a, 0xea, - 0x32, 0x94, 0x95, 0xb1, 0xc2, 0x7c, 0x2f, 0xd9, 0x0f, 0x05, 0x7a, 0x96, 0x4f, 0x45, 0x17, 0xbc, 0x10, 0x4a, 0xb0, - 0x5c, 0xd7, 0x3b, 0x11, 0x88, 0x3a, 0x3f, 0xf4, 0xae, 0xfa, 0x1a, 0xc7, 0x8e, 0xa7, 0x6f, 0x64, 0xca, 0xb5, 0x09, - 0x85, 0xe6, 0xf3, 0xa5, 0xaf, 0x98, 0x28, 0xd8, 0x0d, 0xf4, 0xab, 0x6d, 0xa3, 0xcf, 0xee, 0xd6, 0x7a, 0x33, 0x28, - 0xd1, 0x31, 0xaf, 0x51, 0x70, 0xad, 0x14, 0x0a, 0x46, 0x7b, 0x1b, 0x7f, 0x86, 0x23, 0xb7, 0xba, 0x3d, 0xf4, 0x7e, - 0xab, 0xe2, 0xcb, 0xb7, 0xe8, 0xdb, 0x69, 0x7f, 0x8e, 0x2a, 0xf9, 0xeb, 0x6a, 0x05, 0x3e, 0x54, 0x10, 0x59, 0xc4, - 0xe2, 0xd2, 0x42, 0x3d, 0xa7, 0xef, 0x8e, 0xdf, 0x82, 0x1f, 0x25, 0xfe, 0xfe, 0xed, 0xfb, 0xa0, 0x26, 0xd3, 0x78, - 0x56, 0x98, 0x0f, 0x6d, 0x0e, 0x08, 0x4d, 0xe2, 0xd2, 0xec, 0xfb, 0x59, 0xdc, 0x64, 0xdf, 0x35, 0x5b, 0x4f, 0x8b, - 0x26, 0x92, 0x94, 0xe1, 0xf6, 0xc1, 0x80, 0x40, 0x1f, 0x20, 0x8a, 0xb3, 0x2f, 0x68, 0x0c, 0x69, 0x3e, 0xb3, 0xef, - 0x47, 0xc4, 0x7b, 0xb9, 0x13, 0x42, 0x8c, 0x2b, 0x2c, 0x1a, 0x3d, 0xe4, 0x33, 0x1e, 0x29, 0xc3, 0xa2, 0xf7, 0x98, - 0x40, 0x9c, 0xe1, 0xb4, 0x7a, 0x8f, 0x98, 0xc7, 0x78, 0x37, 0xd0, 0xb2, 0x87, 0x28, 0xa3, 0x2e, 0x7b, 0xc3, 0xe2, - 0xfb, 0xe3, 0x3a, 0xcc, 0xac, 0xe5, 0xe5, 0x10, 0xfe, 0x06, 0xda, 0x00, 0x9c, 0x72, 0x64, 0xf9, 0x2a, 0xb3, 0xd1, - 0xd5, 0x12, 0xd3, 0x9b, 0x08, 0x62, 0xf1, 0xe8, 0x74, 0x58, 0xbb, 0x3a, 0x55, 0xef, 0x6a, 0xe7, 0x33, 0xd1, 0xab, - 0x40, 0x2b, 0xd7, 0xb6, 0xc7, 0x43, 0xb8, 0x4b, 0x2d, 0xad, 0xb0, 0x11, 0xe5, 0x5c, 0x3c, 0xdd, 0x39, 0x36, 0x27, - 0xa0, 0xc1, 0x95, 0x4c, 0x01, 0x38, 0x4b, 0xab, 0xd1, 0xa8, 0x11, 0xf6, 0x59, 0x39, 0x9f, 0xc3, 0xd6, 0x42, 0x3c, - 0x2d, 0x00, 0xc3, 0x6d, 0x62, 0x50, 0xf2, 0x6e, 0x0c, 0xca, 0xe9, 0x47, 0x05, 0x6f, 0x1d, 0x9c, 0x95, 0xcb, 0x38, - 0x95, 0x37, 0x80, 0xc5, 0x18, 0xf8, 0xa9, 0x58, 0xaa, 0x97, 0x90, 0x2c, 0x79, 0xf2, 0x11, 0xad, 0x36, 0xd2, 0x00, - 0xb8, 0xca, 0xa9, 0xb1, 0xdc, 0x53, 0x20, 0xa1, 0xae, 0x14, 0x95, 0x10, 0x57, 0x55, 0x9c, 0x2c, 0x4f, 0x31, 0x35, - 0xdc, 0x40, 0x2f, 0xa2, 0x40, 0xae, 0xb8, 0x00, 0x92, 0x9e, 0xb3, 0x7f, 0x65, 0x1a, 0x6b, 0xfc, 0xb9, 0x44, 0x01, - 0x93, 0x46, 0x0d, 0xc6, 0x4a, 0xd9, 0x4b, 0x69, 0xa2, 0xbd, 0x05, 0x41, 0xed, 0x5e, 0xfe, 0x05, 0x75, 0x3f, 0x87, - 0x56, 0x84, 0x0d, 0x30, 0x44, 0x79, 0x8e, 0x3b, 0x34, 0xb5, 0x4b, 0xce, 0x03, 0x46, 0x74, 0xde, 0x67, 0xb5, 0xdd, - 0xea, 0xcf, 0x97, 0x80, 0x6d, 0x9a, 0x1a, 0x9f, 0xc2, 0x30, 0x21, 0x26, 0x36, 0xb0, 0x55, 0x56, 0xda, 0x0d, 0x65, - 0xda, 0x49, 0x97, 0xcc, 0x6b, 0xe1, 0x34, 0xef, 0x31, 0xb6, 0x1c, 0xa9, 0xdc, 0xfd, 0x7e, 0x68, 0x7e, 0xb2, 0x9c, - 0x3e, 0xd7, 0x21, 0x9b, 0xbd, 0xf1, 0xa0, 0x39, 0xd1, 0xea, 0xaa, 0x8e, 0x7e, 0x40, 0x07, 0x60, 0xa6, 0x2d, 0x40, - 0xa6, 0x0b, 0x36, 0xed, 0x2b, 0x51, 0x71, 0x49, 0xc2, 0x52, 0x49, 0x60, 0x67, 0x37, 0x25, 0x3b, 0x9b, 0x80, 0x78, - 0x86, 0xbb, 0x9e, 0x16, 0x3b, 0x21, 0x4d, 0x78, 0x8b, 0xbd, 0x04, 0x44, 0x1d, 0xaa, 0xba, 0x84, 0x6c, 0x8c, 0xa1, - 0x8b, 0x7f, 0x51, 0x0a, 0x13, 0xd6, 0x32, 0xa9, 0x4a, 0x4c, 0x10, 0xa4, 0x72, 0xb7, 0x45, 0x60, 0x89, 0x82, 0x1d, - 0xc0, 0xde, 0xbb, 0x51, 0x37, 0xa3, 0xa6, 0xaa, 0x53, 0x2f, 0xc1, 0xc7, 0x69, 0xd6, 0x55, 0x90, 0x59, 0xd8, 0x55, - 0xb1, 0xe6, 0x81, 0x8e, 0x4d, 0xa5, 0x8c, 0x89, 0xbb, 0xb4, 0xc8, 0x10, 0x0f, 0x18, 0x63, 0xe9, 0x42, 0x20, 0xdf, - 0x6c, 0x77, 0xdc, 0xf4, 0x04, 0xa1, 0x9f, 0xb0, 0xa1, 0x04, 0x6e, 0x3a, 0xdb, 0x53, 0xd3, 0xcc, 0x07, 0x44, 0x1c, - 0x06, 0x14, 0x48, 0x36, 0x0e, 0x69, 0x8e, 0xf4, 0x05, 0x49, 0x13, 0x06, 0x86, 0x56, 0x3c, 0x27, 0xc8, 0x8a, 0x42, - 0xcf, 0xd6, 0x55, 0x1b, 0xe7, 0xca, 0x30, 0x47, 0x4b, 0x4e, 0x85, 0xcf, 0x09, 0x32, 0xb1, 0x7b, 0xda, 0x66, 0x26, - 0xc3, 0x51, 0xb2, 0xc0, 0xfc, 0x0a, 0xa2, 0xc4, 0x9d, 0x69, 0x56, 0xe5, 0x60, 0x5c, 0xc0, 0x02, 0xad, 0x7c, 0x0f, - 0xea, 0xc6, 0x1a, 0xda, 0x68, 0x18, 0x62, 0xb7, 0x3f, 0xc1, 0x7e, 0xad, 0x9d, 0xd6, 0x65, 0x8a, 0xe5, 0x65, 0x0a, - 0xd1, 0x5e, 0xc8, 0xfc, 0x46, 0x91, 0xe8, 0x4e, 0x11, 0x86, 0x84, 0x75, 0x94, 0x3d, 0x69, 0x53, 0x03, 0xe8, 0xa9, - 0x17, 0xf0, 0xbc, 0x73, 0x2d, 0xc3, 0x2e, 0xd2, 0xfd, 0x55, 0xc1, 0xa7, 0x74, 0x83, 0x20, 0x45, 0x6f, 0x52, 0x30, - 0xe7, 0xf5, 0x28, 0xa9, 0x37, 0xa7, 0x2d, 0x33, 0xaa, 0x8e, 0x8a, 0x90, 0x72, 0x82, 0xff, 0xe4, 0xa5, 0xd4, 0xc4, - 0x26, 0x4c, 0xf0, 0xc0, 0x87, 0x79, 0x86, 0x0d, 0xbc, 0xdd, 0xbe, 0x4b, 0xc3, 0xa4, 0xcd, 0x36, 0xa4, 0x20, 0xad, - 0x30, 0x71, 0x31, 0xa0, 0xb2, 0xd7, 0xb8, 0x5f, 0xb0, 0x9d, 0x34, 0x05, 0x0f, 0xc2, 0x46, 0x03, 0x13, 0xb7, 0xba, - 0xf8, 0x3a, 0x4c, 0x68, 0xb8, 0xa4, 0xda, 0xd9, 0x49, 0x4b, 0x9a, 0xdb, 0xeb, 0xf2, 0xc2, 0xf6, 0x41, 0xc7, 0x0e, - 0xeb, 0x1a, 0x1e, 0x68, 0x5e, 0xb3, 0x8b, 0x2b, 0xa6, 0x69, 0xa2, 0xb1, 0x1e, 0x52, 0x96, 0x1c, 0xeb, 0x7a, 0xba, - 0xc2, 0xd5, 0x32, 0xd3, 0xc0, 0xee, 0x12, 0x2f, 0xf4, 0x80, 0x87, 0x1d, 0xae, 0x48, 0x74, 0x81, 0xcd, 0x66, 0xab, - 0x9a, 0x4c, 0xf3, 0xfb, 0xb2, 0xe5, 0x26, 0x20, 0x9c, 0xa5, 0xbe, 0xb9, 0x4f, 0x8e, 0x35, 0x6d, 0xf3, 0x93, 0x00, - 0xc7, 0xdb, 0x2b, 0x20, 0xe9, 0x58, 0x82, 0x2e, 0xbe, 0xa5, 0x3f, 0x88, 0xd4, 0x4c, 0x05, 0xbd, 0x77, 0xbe, 0x48, - 0xdd, 0xfc, 0x02, 0x6c, 0xa3, 0x36, 0xc6, 0x34, 0x2b, 0x5b, 0x87, 0x89, 0xb2, 0xb0, 0x46, 0x16, 0x72, 0x09, 0x3e, - 0x98, 0xbb, 0x4d, 0x9d, 0x1e, 0x77, 0x10, 0x61, 0xbf, 0x8b, 0x1e, 0x8f, 0x30, 0x56, 0xac, 0x41, 0x62, 0x58, 0x85, - 0x35, 0x6d, 0x2e, 0x87, 0x28, 0xa7, 0x66, 0xc9, 0x44, 0x4b, 0xea, 0x53, 0x8a, 0x28, 0x05, 0x73, 0xe3, 0x69, 0xd9, - 0x30, 0x25, 0x44, 0xc8, 0x0a, 0xe9, 0x80, 0x6a, 0x2d, 0xb4, 0x54, 0x13, 0xf4, 0x3a, 0xf4, 0xb2, 0xd0, 0x98, 0x82, - 0xe8, 0x23, 0x32, 0xdc, 0x88, 0x23, 0xa3, 0xbb, 0x63, 0x14, 0x13, 0x08, 0x55, 0xed, 0xe5, 0x85, 0xd5, 0xa7, 0x65, - 0x5b, 0x1d, 0xc4, 0x15, 0x22, 0xdf, 0x77, 0x13, 0xd4, 0x18, 0x05, 0x6d, 0x4e, 0x37, 0xfa, 0x6b, 0x11, 0xfa, 0x76, - 0xe1, 0xd8, 0x8d, 0x82, 0x48, 0x88, 0xc0, 0xea, 0x35, 0x15, 0x03, 0xb2, 0xce, 0x63, 0x17, 0xa1, 0x49, 0x77, 0x0b, - 0x51, 0xde, 0xa8, 0xac, 0x3f, 0xae, 0x43, 0xb2, 0xdd, 0x62, 0x59, 0xe0, 0xcb, 0x7e, 0xba, 0xbe, 0x07, 0xf2, 0xfb, - 0xcd, 0xfa, 0xb3, 0x90, 0xdf, 0xaf, 0xb3, 0x2f, 0x81, 0xfc, 0x7e, 0xb3, 0xfe, 0x9f, 0x86, 0xfc, 0x3e, 0x5d, 0x7b, - 0x90, 0xdf, 0x6a, 0x30, 0x7e, 0x2f, 0x58, 0x70, 0xf2, 0x36, 0xa0, 0x2f, 0x24, 0x0b, 0x4e, 0x5e, 0xbd, 0xf2, 0x8d, - 0x40, 0x84, 0x46, 0xae, 0x37, 0xb2, 0x60, 0xc4, 0x6d, 0x81, 0x57, 0xa8, 0x75, 0xf2, 0x81, 0x8a, 0x32, 0x00, 0x5e, - 0x2f, 0xff, 0x91, 0x55, 0xcb, 0x30, 0xd8, 0x0f, 0xc8, 0xcc, 0x41, 0x82, 0x0e, 0x27, 0x70, 0x7b, 0x43, 0x23, 0xcb, - 0xea, 0x8b, 0xe0, 0xc3, 0x47, 0xa3, 0x51, 0x5c, 0x5c, 0xe2, 0xa5, 0xce, 0x6c, 0x24, 0x04, 0x3c, 0xce, 0x78, 0x69, - 0x43, 0x44, 0x2c, 0xe3, 0xf2, 0x4c, 0xc7, 0x66, 0x29, 0xed, 0x56, 0x84, 0x88, 0xf3, 0x67, 0x80, 0x53, 0x6f, 0xf7, - 0x66, 0x8c, 0xfd, 0x50, 0x1c, 0xb1, 0x0e, 0x20, 0xfb, 0x7c, 0xad, 0xdf, 0x9d, 0xc7, 0x25, 0x7f, 0x17, 0x57, 0x4b, - 0x06, 0xbd, 0x84, 0xbb, 0x88, 0xe0, 0x49, 0xe5, 0xb1, 0x4d, 0x0a, 0xa8, 0x3c, 0xd3, 0x40, 0xe5, 0x1d, 0xef, 0x69, - 0x68, 0x87, 0x45, 0xfb, 0x00, 0x1b, 0xe9, 0x72, 0x06, 0x46, 0x8b, 0x2f, 0xaf, 0xb9, 0xa8, 0x7e, 0x06, 0x3c, 0x75, - 0xc1, 0x0b, 0xb8, 0x25, 0x20, 0x17, 0xdb, 0x70, 0x42, 0xa0, 0xc2, 0xf7, 0xec, 0x50, 0x51, 0x63, 0x8c, 0x68, 0xa2, - 0xd1, 0x6f, 0xbc, 0x09, 0xa1, 0x77, 0x27, 0xe8, 0x8a, 0x30, 0x12, 0xde, 0x5f, 0x6b, 0x7e, 0x96, 0x81, 0xf9, 0xbc, - 0x00, 0x28, 0x0d, 0x84, 0x43, 0x65, 0x4a, 0x6e, 0x81, 0x09, 0x1b, 0x63, 0xae, 0x94, 0xa5, 0x1e, 0x52, 0x29, 0x55, - 0x70, 0xba, 0x82, 0xa6, 0x12, 0x70, 0xb8, 0x23, 0x09, 0x60, 0xa6, 0xb6, 0x30, 0x88, 0x6e, 0x9b, 0xd2, 0x2c, 0x8d, - 0x9c, 0x22, 0xcd, 0xe1, 0x93, 0x52, 0x05, 0x3a, 0x7d, 0x96, 0xc4, 0x15, 0xbf, 0x94, 0x05, 0x84, 0xc2, 0x6d, 0xa5, - 0x50, 0xa4, 0xdf, 0x67, 0x62, 0x7d, 0xc5, 0x8b, 0x2c, 0x39, 0x5b, 0x66, 0x65, 0x05, 0xf9, 0xe6, 0xfa, 0xf4, 0x5b, - 0xd4, 0xd3, 0x02, 0xe7, 0x4d, 0x4d, 0x0a, 0x33, 0xf3, 0x78, 0xac, 0x76, 0x3a, 0xa8, 0x57, 0xbd, 0xd7, 0x06, 0xfb, - 0xbd, 0x39, 0xd1, 0xe3, 0xd6, 0x7a, 0xb0, 0x9a, 0xd4, 0x66, 0xaa, 0x82, 0x38, 0x02, 0xea, 0xc0, 0x8e, 0x70, 0x16, - 0x53, 0xba, 0xb6, 0x08, 0x2a, 0x60, 0xed, 0x80, 0x39, 0x32, 0x71, 0x79, 0x76, 0xa3, 0xe4, 0x27, 0x3d, 0x45, 0x61, - 0xd2, 0x28, 0x56, 0xc8, 0x3e, 0x4b, 0x16, 0xae, 0x59, 0x72, 0x4f, 0xae, 0x75, 0x94, 0x34, 0x30, 0xba, 0xe2, 0xf6, - 0x40, 0x1c, 0x26, 0xed, 0x94, 0xed, 0x76, 0x27, 0x13, 0xb0, 0x06, 0xad, 0x24, 0x88, 0xd6, 0xb1, 0x9c, 0x0d, 0x27, - 0x11, 0x40, 0xa8, 0x68, 0xb2, 0xf6, 0xd7, 0x9a, 0x1b, 0x90, 0xf9, 0x50, 0x7b, 0xfa, 0x39, 0x91, 0xbc, 0x1e, 0x59, - 0xcf, 0x38, 0x4e, 0x4f, 0xfb, 0x1c, 0x0c, 0xb3, 0xfc, 0x21, 0x81, 0x48, 0x30, 0x9d, 0xd3, 0xb3, 0x98, 0x6a, 0x33, - 0x61, 0xc3, 0xa3, 0xd0, 0x2f, 0xfb, 0x4e, 0x03, 0xe0, 0x26, 0x3c, 0x1c, 0x3e, 0x1b, 0x93, 0x5a, 0xdb, 0xac, 0xe3, - 0x02, 0xb2, 0xbf, 0xd5, 0x22, 0x73, 0xcf, 0x76, 0xa1, 0xd1, 0xa6, 0xb7, 0x41, 0xbb, 0x46, 0x2a, 0xee, 0xe9, 0x7e, - 0x4d, 0x6a, 0xb7, 0x60, 0xac, 0x04, 0xe9, 0x0f, 0x75, 0x6a, 0x9d, 0x3d, 0xda, 0x64, 0xba, 0xca, 0xfa, 0x8f, 0xcc, - 0xc6, 0x9b, 0x6b, 0x50, 0x80, 0x5a, 0x2f, 0x25, 0x1f, 0xee, 0xad, 0x23, 0x9b, 0x9e, 0x18, 0x96, 0x75, 0x92, 0x91, - 0x91, 0x7a, 0xe4, 0x2a, 0xfc, 0x56, 0x77, 0x16, 0x7e, 0xcb, 0x93, 0xb0, 0xab, 0x61, 0x8a, 0xc3, 0x37, 0x5d, 0x40, - 0x04, 0x4c, 0x90, 0xeb, 0x87, 0x7f, 0x3c, 0xda, 0x34, 0xc9, 0x52, 0xbd, 0xef, 0x7d, 0x86, 0xbf, 0xb3, 0x14, 0xfe, - 0x56, 0xf5, 0x1f, 0x74, 0x73, 0xc5, 0xab, 0xa5, 0x4c, 0xa3, 0xe0, 0xdd, 0xc9, 0xe9, 0x87, 0x40, 0x23, 0xab, 0xe3, - 0xfd, 0xc2, 0x68, 0x94, 0x0d, 0x86, 0x13, 0x68, 0x58, 0x72, 0x79, 0x89, 0xe0, 0x82, 0x1a, 0x9d, 0xfe, 0x74, 0x29, - 0x6f, 0x8e, 0xf3, 0xdc, 0x67, 0x82, 0x0d, 0xe1, 0xd4, 0x7c, 0x61, 0x83, 0xea, 0x84, 0x20, 0xcb, 0x1b, 0x65, 0xe5, - 0x99, 0xd6, 0xbe, 0xa4, 0x67, 0xe7, 0x77, 0x67, 0x5a, 0xc2, 0x63, 0xd1, 0x1d, 0x9f, 0xff, 0x71, 0x98, 0x66, 0xd7, - 0x7b, 0x48, 0xdd, 0x59, 0x00, 0xa6, 0xf1, 0x39, 0x3f, 0x5f, 0x57, 0x95, 0x14, 0xc3, 0x42, 0xde, 0x04, 0x47, 0x87, - 0xea, 0xc1, 0x64, 0x88, 0xd5, 0x63, 0xb0, 0xf7, 0x5f, 0x49, 0x9e, 0x25, 0x1f, 0x59, 0xf0, 0x68, 0x93, 0xb1, 0xa3, - 0x16, 0x0d, 0x1f, 0xd7, 0xc1, 0x11, 0xb4, 0x75, 0xef, 0x38, 0xcf, 0x0f, 0xf7, 0xd5, 0x17, 0x47, 0x87, 0xfb, 0x69, - 0x76, 0x7d, 0xe4, 0x01, 0xed, 0x3b, 0xbb, 0x59, 0x84, 0x34, 0x73, 0xf7, 0x62, 0x70, 0x90, 0x4d, 0x78, 0x68, 0x39, - 0x09, 0x90, 0xc6, 0x98, 0x30, 0x25, 0x28, 0xc1, 0x09, 0x63, 0x38, 0x37, 0xb7, 0xdb, 0xd0, 0x1a, 0xf5, 0x24, 0x1e, - 0xe2, 0x4d, 0x01, 0x9c, 0x06, 0x66, 0xa1, 0x09, 0xa1, 0x49, 0x4d, 0x42, 0x83, 0xcb, 0x13, 0x13, 0x5a, 0xd4, 0x14, - 0x8e, 0x92, 0x37, 0xf1, 0xca, 0x08, 0xb1, 0xb4, 0x50, 0xc0, 0xb4, 0x7e, 0xd6, 0x18, 0xc7, 0xa8, 0x3d, 0xaa, 0x06, - 0x29, 0xab, 0x57, 0xde, 0x37, 0xb0, 0x20, 0xb7, 0x0c, 0x2b, 0x1a, 0xb4, 0x28, 0x04, 0xc8, 0x1d, 0x7d, 0x71, 0x19, - 0xa7, 0xe1, 0xbc, 0xa4, 0x72, 0x41, 0xd8, 0x51, 0xb8, 0x41, 0xb6, 0xb9, 0x54, 0x54, 0x38, 0x92, 0xb5, 0x83, 0xad, - 0x54, 0xb3, 0x73, 0xf4, 0x68, 0x23, 0x10, 0x29, 0xb1, 0x64, 0x47, 0xcd, 0xf9, 0xaa, 0xe2, 0xf3, 0xe1, 0x92, 0x83, - 0x7f, 0x4d, 0xb0, 0xf7, 0x5f, 0xe9, 0x79, 0x6e, 0x27, 0x45, 0xad, 0xc8, 0x65, 0x2c, 0xd2, 0x9c, 0x7f, 0x88, 0xcf, - 0x7f, 0xc0, 0x3c, 0x2f, 0xce, 0xf3, 0xe7, 0x90, 0xa1, 0x0e, 0x8e, 0x1e, 0x6d, 0x92, 0x6a, 0xf4, 0xf2, 0xed, 0x87, - 0xd7, 0x1f, 0xfe, 0x79, 0xf6, 0xfc, 0xf8, 0xc3, 0xcb, 0xef, 0x4f, 0xde, 0xbf, 0x7e, 0x79, 0x3a, 0xb7, 0x0e, 0xad, - 0x0a, 0x27, 0x8d, 0x2c, 0xb6, 0x5b, 0x97, 0xef, 0xd7, 0xb7, 0x2f, 0x5e, 0xbe, 0x7a, 0xfd, 0xf6, 0xe5, 0x8b, 0x5a, - 0xcd, 0x65, 0xbb, 0x21, 0xb0, 0x43, 0xe3, 0x4c, 0xf0, 0x02, 0x8a, 0xd7, 0xd1, 0x1a, 0xb1, 0xd9, 0x1a, 0xde, 0xaf, - 0xd9, 0x74, 0x1d, 0x09, 0x01, 0x16, 0xd9, 0x9e, 0xde, 0x2c, 0xd0, 0x70, 0x69, 0x36, 0x8e, 0xbf, 0xc4, 0xfc, 0xde, - 0xbc, 0xc4, 0xef, 0xde, 0xcb, 0x1b, 0xd3, 0x15, 0x3d, 0x42, 0x0a, 0xb9, 0x6b, 0xf6, 0xfc, 0x8f, 0x43, 0x5f, 0x5a, - 0x86, 0x22, 0x05, 0x55, 0x2e, 0xfc, 0xaa, 0x83, 0x3d, 0x6d, 0xb9, 0x17, 0x40, 0xe0, 0x89, 0xe0, 0xe8, 0x70, 0xdf, - 0xcf, 0x7d, 0xf4, 0x47, 0xf4, 0xb3, 0xd7, 0x39, 0x2c, 0x15, 0xc6, 0xa1, 0x99, 0xb6, 0x73, 0xba, 0x41, 0x68, 0x24, - 0x77, 0xfe, 0xa9, 0x15, 0x64, 0xc8, 0x95, 0x24, 0x91, 0x9d, 0x44, 0x65, 0x91, 0x62, 0x4a, 0xfb, 0x43, 0xff, 0x75, - 0x7d, 0xc6, 0x1b, 0x3e, 0x17, 0xa5, 0x2c, 0x02, 0xe8, 0x47, 0x3b, 0x5e, 0xc4, 0x9e, 0x17, 0x97, 0x05, 0x7b, 0xd4, - 0x49, 0xde, 0x61, 0x44, 0xf6, 0xdb, 0x9f, 0x7a, 0x1d, 0xfb, 0x83, 0xb8, 0x1f, 0x7b, 0xba, 0x33, 0x2d, 0xf2, 0x62, - 0x1b, 0x78, 0x7f, 0x5c, 0x8f, 0xf9, 0x49, 0x46, 0xff, 0x21, 0xe9, 0x65, 0x4c, 0xaf, 0x62, 0x7a, 0x2a, 0x16, 0x75, - 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, - 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, - 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0xb3, 0x37, 0xb7, 0x6d, 0x23, 0xff, 0x7f, 0x3f, 0x05, 0xc3, 0xe4, 0x52, 0x31, 0x21, 0x69, 0x92, 0xb2, 0x6c, - 0x45, 0xb2, 0xec, 0x6b, 0xf3, 0x98, 0x4b, 0xc7, 0x6d, 0x3a, 0x89, 0x9b, 0xb9, 0xab, 0xeb, 0xb1, 0x28, 0x09, 0x92, - 0x78, 0xa1, 0x48, 0x0d, 0x49, 0xf9, 0x51, 0x85, 0xf7, 0x59, 0xee, 0xb3, 0xdc, 0x27, 0xfb, 0xcd, 0xee, 0x02, 0x20, - 0xf8, 0xd0, 0xc3, 0x4d, 0x7a, 0xf7, 0x9b, 0x36, 0x89, 0x08, 0x02, 0x4b, 0x60, 0x01, 0x2c, 0x16, 0xfb, 0xf4, 0x67, - 0x5c, 0xf6, 0x62, 0xb6, 0xd8, 0x7e, 0x9f, 0xfb, 0xfc, 0x99, 0xd9, 0xb8, 0x24, 0x81, 0xe1, 0xb3, 0xb3, 0x78, 0x36, - 0x0b, 0x59, 0x4b, 0x17, 0xc9, 0x43, 0x74, 0x53, 0x7e, 0xe6, 0xec, 0x91, 0x23, 0x22, 0x76, 0x1a, 0xf9, 0xa6, 0xad, - 0x25, 0x46, 0xcc, 0x64, 0x48, 0x3b, 0xe2, 0x5c, 0x51, 0x36, 0x7b, 0x83, 0xea, 0x0d, 0x3e, 0x2f, 0xc5, 0xd6, 0xb5, - 0x26, 0xf1, 0x6a, 0x14, 0x32, 0x0b, 0x97, 0x3b, 0x7c, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x90, 0xa5, 0xe5, 0x91, 0x63, - 0x42, 0xdc, 0x99, 0x38, 0xc5, 0xfb, 0x60, 0x6e, 0xf4, 0x61, 0x50, 0x76, 0x56, 0xed, 0x3e, 0xd8, 0x8a, 0x80, 0xa8, - 0x87, 0x3e, 0x90, 0xc1, 0xdd, 0xaf, 0x61, 0xd7, 0x0e, 0xf4, 0x0f, 0xb0, 0xfa, 0x52, 0xbd, 0xdf, 0xb4, 0xf5, 0x07, - 0x97, 0xfa, 0x07, 0xc4, 0x31, 0x66, 0x2f, 0x7e, 0x49, 0xab, 0x57, 0x37, 0x75, 0x52, 0x7a, 0xaf, 0x30, 0x8f, 0x01, - 0x08, 0x7d, 0x5f, 0x05, 0xfe, 0x2c, 0x8a, 0xd3, 0x2c, 0x18, 0xeb, 0x57, 0xfd, 0xb7, 0x41, 0xeb, 0x72, 0x91, 0xb5, - 0x8c, 0x2b, 0x73, 0x9c, 0xa9, 0x29, 0x50, 0x04, 0xc1, 0xc4, 0x0c, 0x28, 0x9b, 0x2a, 0xa9, 0x3b, 0x68, 0x6b, 0x45, - 0x41, 0x9a, 0xb1, 0xd2, 0x38, 0x1b, 0x40, 0xbd, 0x4a, 0x3e, 0x15, 0x4c, 0x0c, 0xa5, 0x63, 0x4b, 0xa3, 0x4f, 0x37, - 0x95, 0x97, 0xab, 0x35, 0x1e, 0xe5, 0x59, 0x71, 0x5a, 0x62, 0x0c, 0x60, 0xe1, 0x38, 0x43, 0xcf, 0x8f, 0x54, 0xa3, - 0xcf, 0xd2, 0xb9, 0x3b, 0xfc, 0xae, 0xcc, 0x17, 0xc0, 0xf9, 0x0d, 0x16, 0x17, 0x51, 0x9c, 0x69, 0x10, 0xd8, 0x06, - 0xbe, 0x38, 0xac, 0x1a, 0x89, 0x71, 0xa8, 0x2d, 0x23, 0xe7, 0xc4, 0xe0, 0x7b, 0x3c, 0xfc, 0x5a, 0x3c, 0xbc, 0x59, - 0x29, 0x82, 0x05, 0x5d, 0x16, 0x22, 0x98, 0xc0, 0x2c, 0x3e, 0x8f, 0x6f, 0xab, 0x7a, 0x90, 0x97, 0xc3, 0xdd, 0x67, - 0x6f, 0x4b, 0xb0, 0xc9, 0x22, 0xab, 0x5f, 0x8b, 0x27, 0x26, 0x15, 0x8c, 0x4e, 0x65, 0x4f, 0xa1, 0xe1, 0x87, 0xe0, - 0x61, 0x32, 0xb0, 0x13, 0xc3, 0xb3, 0x00, 0x48, 0x12, 0x3f, 0xa6, 0x87, 0xf9, 0xb5, 0x48, 0x9d, 0x2c, 0x12, 0x17, - 0x2b, 0x87, 0x33, 0x50, 0xd7, 0x68, 0xb9, 0xca, 0x30, 0xd4, 0x2e, 0x74, 0x80, 0xe5, 0xba, 0x86, 0xa1, 0x3b, 0x81, - 0x4a, 0x17, 0x6c, 0x62, 0xae, 0x6b, 0xc1, 0xa4, 0x5e, 0xc6, 0x99, 0x5e, 0x20, 0x5e, 0x48, 0xdf, 0x51, 0x50, 0x05, - 0x8f, 0x09, 0x1f, 0xc6, 0xd8, 0x2c, 0xe2, 0xd4, 0xb7, 0xc6, 0xa8, 0xd0, 0x69, 0xa0, 0x0c, 0x63, 0x82, 0xd3, 0x6f, - 0x85, 0x8d, 0x83, 0x85, 0xf0, 0x9b, 0xa5, 0x61, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, - 0xd6, 0xbe, 0xb4, 0x15, 0xd0, 0x2f, 0x74, 0x32, 0x14, 0x18, 0x22, 0x1a, 0x86, 0xf9, 0x75, 0xe1, 0xb9, 0x53, 0x8c, - 0x17, 0x56, 0x19, 0x95, 0x6b, 0xa8, 0xba, 0x1f, 0x70, 0x05, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xfa, 0x7c, - 0x53, 0x55, 0xfa, 0x1b, 0xba, 0x46, 0x84, 0x9e, 0x10, 0x40, 0x34, 0x5f, 0xd7, 0xfe, 0x2a, 0xcb, 0x18, 0x1f, 0xad, - 0x54, 0x6a, 0xc2, 0xb7, 0xae, 0xf5, 0xe7, 0xcc, 0x9e, 0xb0, 0xcc, 0x0f, 0x42, 0x6a, 0xd2, 0x17, 0xd9, 0xea, 0x6b, - 0xc3, 0x4b, 0xcb, 0xc3, 0x8b, 0xca, 0xeb, 0x07, 0x07, 0x43, 0x47, 0x00, 0xf5, 0x1b, 0x47, 0x86, 0x59, 0xac, 0x9a, - 0x67, 0x94, 0xde, 0xfd, 0x57, 0xa7, 0x83, 0xc1, 0x74, 0x44, 0x30, 0x1d, 0x2c, 0x1a, 0xc7, 0x13, 0xf6, 0xcb, 0xfb, - 0xb7, 0x32, 0x6d, 0x16, 0x48, 0x80, 0x86, 0x7c, 0x61, 0xa6, 0xc8, 0x3f, 0x24, 0xc8, 0x3b, 0x50, 0x82, 0x2b, 0x4d, - 0x2e, 0xa1, 0x24, 0xd7, 0xb5, 0x33, 0xea, 0x3b, 0x9b, 0x50, 0xaf, 0x07, 0x31, 0xb6, 0x4a, 0xf2, 0x93, 0x03, 0xaa, - 0x4d, 0xa7, 0x1d, 0x55, 0x02, 0x34, 0x24, 0x30, 0xc2, 0x02, 0x0b, 0x90, 0xe1, 0x73, 0xe0, 0x16, 0x17, 0x0a, 0x7b, - 0x81, 0x72, 0x76, 0xf7, 0xac, 0xcc, 0xaa, 0x60, 0x2b, 0xfd, 0xf4, 0x04, 0x73, 0x76, 0xc1, 0x79, 0x0d, 0x51, 0x3e, - 0x4e, 0x0e, 0xe8, 0x51, 0xab, 0xec, 0x88, 0x02, 0x88, 0xb8, 0xda, 0xf5, 0x38, 0x80, 0x07, 0x6d, 0x15, 0x48, 0x11, - 0x0f, 0xa5, 0x7e, 0xae, 0x6b, 0x0b, 0xce, 0x1a, 0xf1, 0x70, 0x42, 0x10, 0x6b, 0xc0, 0x81, 0xbd, 0xab, 0x6b, 0x0b, - 0xff, 0x0e, 0x47, 0x2e, 0xde, 0xf8, 0x77, 0x2d, 0x97, 0xbf, 0x2a, 0xf6, 0x5a, 0x5a, 0xde, 0x6b, 0x63, 0x3e, 0xb9, - 0xe0, 0x48, 0x20, 0x6f, 0xd6, 0x73, 0x54, 0xd0, 0x36, 0x4c, 0xee, 0x5c, 0x4c, 0xee, 0x64, 0xc3, 0xe4, 0x4e, 0xb6, - 0x4c, 0x6e, 0xc8, 0x27, 0x52, 0x93, 0xa8, 0x4b, 0xd0, 0x39, 0x4c, 0x22, 0x8f, 0x33, 0x1a, 0x3d, 0xbe, 0xcf, 0x10, - 0x4f, 0x56, 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x5c, 0x35, 0xe1, 0x45, 0x41, 0x44, 0x7d, 0xe0, 0x72, 0xd7, 0x89, 0x71, - 0x43, 0x0e, 0xce, 0x56, 0x58, 0x1d, 0x2f, 0xac, 0x52, 0xca, 0x2f, 0xde, 0x9a, 0x6f, 0x18, 0xe9, 0x7c, 0xcb, 0x48, - 0xc7, 0xa5, 0xad, 0xcb, 0x87, 0x4d, 0x9b, 0x50, 0x1d, 0x14, 0xac, 0x41, 0x30, 0x18, 0xc5, 0x25, 0x53, 0x5e, 0x87, - 0x9b, 0x69, 0xac, 0xb2, 0xa2, 0x96, 0x7e, 0x9a, 0xde, 0xc6, 0x09, 0x68, 0x5c, 0x00, 0xcc, 0xc3, 0x96, 0xd4, 0x22, - 0x88, 0x78, 0x30, 0x97, 0x8d, 0x8b, 0xa9, 0x78, 0xaf, 0x2e, 0x29, 0xaf, 0xd3, 0xa1, 0x1a, 0x4b, 0x3f, 0xcb, 0x58, - 0x82, 0x48, 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x65, 0xd6, 0x40, 0x43, 0x42, 0x85, 0xaa, 0x23, 0x85, 0x5e, 0x02, - 0x6f, 0x95, 0x88, 0x83, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc4, 0xff, 0x84, 0xdb, 0xb5, 0x95, 0x28, 0xae, 0x4b, 0xee, - 0x91, 0x61, 0x2f, 0xfd, 0xc9, 0x07, 0x50, 0xec, 0xb5, 0x3c, 0x13, 0x8c, 0x74, 0xd5, 0x30, 0x70, 0x09, 0x31, 0x7b, - 0xe3, 0x82, 0x48, 0x22, 0x95, 0xe4, 0x26, 0x50, 0xe0, 0x3d, 0xe9, 0x5b, 0xd3, 0xab, 0xb5, 0x97, 0x1f, 0xcc, 0x02, - 0xa3, 0x46, 0x35, 0x81, 0xb4, 0x85, 0x83, 0x53, 0x79, 0xe7, 0x0a, 0x4d, 0xf7, 0xc8, 0x00, 0xc9, 0xef, 0x25, 0xe4, - 0x33, 0x75, 0xc4, 0x85, 0x76, 0x98, 0xc0, 0xa9, 0x75, 0xe9, 0x5c, 0xe5, 0x4f, 0x67, 0xf8, 0xcb, 0xbd, 0xca, 0x9f, - 0x8e, 0xf0, 0x97, 0x77, 0x85, 0x99, 0xeb, 0x1a, 0x2e, 0xf2, 0xca, 0x98, 0xf5, 0xd3, 0xd2, 0x7a, 0x22, 0xfb, 0xb3, - 0x07, 0x2c, 0x1b, 0x3e, 0xc1, 0x8f, 0x9f, 0xac, 0x53, 0xf0, 0xb8, 0x54, 0xc7, 0x10, 0xd9, 0x89, 0x91, 0x37, 0x96, - 0xcf, 0x36, 0x94, 0x8f, 0x8c, 0xff, 0xf2, 0xc1, 0x8f, 0xab, 0x24, 0x2e, 0xce, 0x94, 0xb2, 0x18, 0xe2, 0x7a, 0x14, - 0x44, 0x7e, 0x72, 0x7f, 0x4d, 0xd7, 0x8b, 0x96, 0xe0, 0xdd, 0xa5, 0x78, 0x85, 0xd8, 0xcb, 0xb2, 0xba, 0x2b, 0x53, - 0x04, 0xbc, 0xf7, 0xfc, 0xa0, 0x1f, 0xfc, 0x3d, 0x51, 0xd8, 0xb6, 0xd2, 0x05, 0x94, 0x4f, 0x48, 0xe9, 0x43, 0xd7, - 0x4f, 0xd6, 0x2d, 0x56, 0x07, 0x53, 0x19, 0x6d, 0x85, 0x2f, 0x84, 0xe9, 0xc1, 0xcb, 0xec, 0x62, 0x12, 0xf4, 0x50, - 0x9f, 0x35, 0x8a, 0xef, 0xac, 0x27, 0xeb, 0xec, 0x4c, 0x5f, 0xf8, 0xc9, 0x27, 0x36, 0xb1, 0xc6, 0x41, 0x32, 0x0e, - 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x1f, 0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xca, 0x50, 0x43, 0xbd, 0xf3, 0xee, 0x2b, 0x70, - 0x42, 0x22, 0x3b, 0x64, 0x56, 0x1b, 0xb0, 0xa0, 0xbd, 0x94, 0x02, 0xaf, 0x82, 0x51, 0x2c, 0x6a, 0x99, 0x60, 0x60, - 0x09, 0x4a, 0x73, 0xf0, 0x58, 0x35, 0x75, 0x9c, 0x2f, 0xdd, 0x54, 0x87, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x1a, - 0x21, 0xfc, 0xf1, 0xcf, 0x51, 0x32, 0xec, 0xfd, 0x3f, 0x27, 0xa1, 0x7c, 0xd9, 0x08, 0xa1, 0xd4, 0x22, 0x4f, 0x89, - 0x07, 0x7c, 0x9c, 0x33, 0x98, 0x9b, 0x3f, 0xad, 0x36, 0xf6, 0xd3, 0x74, 0xb5, 0x60, 0x13, 0xd2, 0x0c, 0x9e, 0x15, - 0x9d, 0x2a, 0xdf, 0x2c, 0xd4, 0x8e, 0xfd, 0xb6, 0xf2, 0x8e, 0x0f, 0x5f, 0x82, 0xc5, 0x02, 0x30, 0x94, 0xf1, 0x74, - 0xaa, 0x17, 0x77, 0xfc, 0x1d, 0xcd, 0xdc, 0xc3, 0xdf, 0x56, 0x6f, 0x5e, 0x3b, 0x6f, 0x64, 0xe3, 0x08, 0x18, 0x63, - 0xa1, 0x7e, 0xe5, 0x7c, 0xb1, 0xd2, 0x5f, 0x31, 0xa2, 0xa9, 0x1f, 0x6d, 0x1e, 0xce, 0x65, 0x69, 0x89, 0x2f, 0x19, - 0x9b, 0x00, 0xc3, 0x6d, 0xd6, 0x4a, 0xaf, 0x43, 0x76, 0xc3, 0xa4, 0x6a, 0xb7, 0xfe, 0xb1, 0x86, 0x16, 0x18, 0x7b, - 0x8e, 0xab, 0x8c, 0x39, 0x57, 0xa7, 0x0c, 0x69, 0x88, 0x63, 0xe0, 0x23, 0x57, 0xb7, 0x58, 0x65, 0x4b, 0x0d, 0x4d, - 0x5d, 0xe9, 0xc0, 0xc6, 0x9e, 0x9d, 0x6d, 0x28, 0xef, 0x61, 0xe2, 0xe9, 0xe6, 0xbe, 0x99, 0xae, 0xd1, 0x83, 0x58, - 0xdd, 0x1c, 0x4f, 0x21, 0xec, 0xbc, 0x56, 0x21, 0x0e, 0xd9, 0x84, 0xb1, 0x26, 0x21, 0x99, 0x4e, 0xd2, 0x17, 0x61, - 0xed, 0x88, 0x66, 0xbf, 0x42, 0x0e, 0xd5, 0x38, 0x37, 0x5a, 0x79, 0xe4, 0x23, 0x4c, 0xe8, 0x1a, 0xb1, 0x34, 0xdd, - 0x88, 0x30, 0x39, 0xe9, 0xa6, 0x5e, 0xd4, 0x2e, 0xe3, 0xa3, 0x28, 0x37, 0x1d, 0x13, 0x58, 0x02, 0x1c, 0x60, 0xf5, - 0x5b, 0x78, 0xbc, 0x5c, 0x2f, 0xb8, 0xbd, 0x4a, 0x32, 0x1b, 0xe9, 0xdc, 0x96, 0x60, 0xd3, 0xfb, 0x5b, 0x9d, 0x77, - 0xaa, 0x74, 0x4c, 0x37, 0x76, 0xad, 0x55, 0x22, 0xbd, 0x35, 0x71, 0x11, 0x02, 0x10, 0x7d, 0xaa, 0xd0, 0x57, 0x36, - 0x9d, 0xb2, 0x71, 0x96, 0x1a, 0x42, 0x78, 0x24, 0xa3, 0xc7, 0x82, 0xd7, 0xd0, 0xa3, 0x81, 0xfe, 0x13, 0xf8, 0xd0, - 0x8b, 0x20, 0x4b, 0xbc, 0x43, 0xe2, 0xce, 0xd4, 0x8c, 0x26, 0x82, 0x58, 0x46, 0x11, 0xff, 0x0a, 0x24, 0x07, 0x6f, - 0x28, 0xc7, 0xae, 0xf1, 0xf3, 0xa7, 0x58, 0x17, 0xb1, 0xb4, 0x6a, 0xd9, 0x4e, 0x8a, 0xb6, 0x6d, 0xdf, 0xb5, 0xfb, - 0xa6, 0xe3, 0x3a, 0xb9, 0x6e, 0x82, 0xef, 0xd6, 0xa7, 0x7d, 0x37, 0x3d, 0xb6, 0x6a, 0x43, 0xab, 0x55, 0xf4, 0x90, - 0x76, 0x9e, 0xfb, 0xc2, 0xd5, 0x4d, 0x32, 0x99, 0x53, 0x68, 0xdb, 0x38, 0xbe, 0x61, 0xc9, 0x17, 0x0f, 0xa5, 0x0c, - 0x7c, 0xbf, 0xfe, 0x1c, 0xb9, 0x0e, 0x10, 0xe1, 0x2c, 0x5e, 0x3e, 0x60, 0x08, 0x6d, 0xdd, 0xd4, 0xc7, 0x61, 0x9c, - 0x32, 0x75, 0x0c, 0x24, 0x04, 0xf9, 0xc2, 0x41, 0xfc, 0xfc, 0xfe, 0xf5, 0x87, 0x0f, 0xba, 0x89, 0x99, 0x40, 0x53, - 0x15, 0x3a, 0x5f, 0x50, 0x3b, 0xa8, 0x7f, 0xe3, 0xba, 0xa3, 0x13, 0x86, 0x2e, 0xb5, 0xe5, 0x35, 0x47, 0x65, 0xb5, - 0x25, 0xc7, 0x4f, 0x1e, 0xfe, 0x65, 0xba, 0x89, 0xee, 0x35, 0xae, 0x06, 0xda, 0xb0, 0xfd, 0x78, 0x2b, 0x95, 0x2c, - 0x82, 0xe8, 0xba, 0xa1, 0xd4, 0xbf, 0x6b, 0x28, 0x85, 0xab, 0x5c, 0x8d, 0x56, 0xad, 0xe2, 0x85, 0xc2, 0x1a, 0x40, - 0x22, 0xe7, 0x5d, 0xe8, 0x52, 0xee, 0x53, 0x5f, 0xd0, 0x69, 0x1e, 0xc9, 0xbd, 0xda, 0xeb, 0x86, 0x62, 0x7e, 0x09, - 0x92, 0xb8, 0x1d, 0x87, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6d, 0x94, 0xe6, 0xba, 0x0a, 0x10, 0x62, 0x6f, - 0xaf, 0x33, 0xb6, 0x58, 0xb2, 0xc4, 0xcf, 0x56, 0x09, 0xbb, 0x0e, 0xe3, 0xdb, 0x47, 0x85, 0x39, 0xfd, 0x8e, 0xca, - 0xf3, 0x60, 0x36, 0x97, 0xb5, 0xcf, 0x5a, 0x6c, 0x20, 0x27, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0xb6, 0xff, - 0xf3, 0xef, 0x9d, 0x55, 0x01, 0x7c, 0x3e, 0x34, 0xb3, 0xc1, 0x1e, 0xeb, 0xa2, 0xf9, 0x4b, 0x65, 0x9c, 0x37, 0xd7, - 0xa9, 0x4d, 0x02, 0xbc, 0xaf, 0x4d, 0x41, 0xad, 0xb0, 0xbc, 0x6e, 0x1e, 0xd4, 0x31, 0x18, 0xd7, 0xce, 0x9e, 0x41, - 0xa5, 0x2f, 0xea, 0xda, 0xd0, 0xe8, 0xed, 0x35, 0x23, 0x7f, 0x1c, 0xc3, 0xbb, 0xc6, 0xf0, 0x85, 0xdd, 0xe7, 0x72, - 0xc9, 0x97, 0xc3, 0xa1, 0xcc, 0x2d, 0xa7, 0x36, 0x05, 0x13, 0xff, 0xb3, 0x5a, 0x09, 0x3f, 0x3c, 0x7b, 0x8e, 0x41, - 0xbe, 0xf7, 0x83, 0x97, 0x43, 0x34, 0x46, 0x3b, 0x19, 0x25, 0x05, 0xb3, 0xb2, 0x91, 0xb4, 0x91, 0x31, 0x79, 0x0d, - 0x68, 0x8d, 0xae, 0x41, 0x29, 0x26, 0x1c, 0xcb, 0x87, 0x86, 0xf9, 0x72, 0xc8, 0x05, 0x4b, 0xdc, 0xfe, 0xb5, 0x57, - 0x5d, 0xda, 0x5c, 0x2c, 0x5b, 0x42, 0xba, 0xa9, 0x91, 0xfe, 0x07, 0x2b, 0xb3, 0x42, 0x8e, 0x87, 0x02, 0x7e, 0x90, - 0x28, 0x0c, 0x73, 0xcc, 0x77, 0xf2, 0x6e, 0x93, 0x8d, 0xd8, 0xcf, 0xbb, 0x6d, 0xc4, 0x2e, 0xf6, 0xb2, 0x11, 0xfb, - 0xf9, 0xab, 0xdb, 0x88, 0xbd, 0x53, 0x6d, 0xc4, 0x60, 0x12, 0x5f, 0xb3, 0xbd, 0x0c, 0xb7, 0x84, 0xd5, 0x46, 0x7c, - 0x9b, 0x0e, 0x5c, 0xce, 0xd2, 0xa6, 0xe3, 0x39, 0x03, 0x19, 0x01, 0x9f, 0x95, 0x30, 0x9e, 0x81, 0x11, 0xd7, 0x9f, - 0x6f, 0x6e, 0x15, 0xc6, 0x33, 0xd5, 0xd8, 0x2a, 0xe2, 0x11, 0x5f, 0x8b, 0x28, 0x4e, 0x64, 0xe0, 0xe4, 0x98, 0x22, - 0xe6, 0x93, 0x75, 0x68, 0x28, 0x59, 0xad, 0xa5, 0xf5, 0x9a, 0x27, 0x4c, 0xa0, 0x7a, 0x68, 0x3d, 0x25, 0x1b, 0x7a, - 0xcf, 0x45, 0x6c, 0x0b, 0x15, 0x82, 0xb4, 0x12, 0xa6, 0x38, 0x11, 0x6b, 0xfd, 0xb7, 0x3b, 0xf7, 0xfb, 0x4b, 0xb7, - 0xdf, 0x76, 0xc1, 0x39, 0x1b, 0x6e, 0x98, 0x58, 0xe0, 0xf4, 0xdb, 0x6d, 0x28, 0xb8, 0x55, 0x0a, 0x3c, 0x28, 0x08, - 0x94, 0x82, 0x0e, 0x14, 0x8c, 0x95, 0x82, 0x23, 0x28, 0x98, 0x28, 0x05, 0xc7, 0x50, 0x70, 0xa3, 0xe7, 0x97, 0x91, - 0xec, 0xee, 0xb1, 0x71, 0x65, 0xd2, 0xa5, 0x42, 0x94, 0x1d, 0x9b, 0x2e, 0x58, 0x4d, 0xf9, 0xb3, 0x5e, 0x6c, 0x92, - 0x74, 0xb1, 0x97, 0x98, 0xb7, 0x73, 0x46, 0x81, 0xa2, 0x5f, 0xe1, 0x99, 0x63, 0x67, 0x31, 0xd8, 0x4d, 0x8b, 0x00, - 0x0c, 0x02, 0x0f, 0x9a, 0x6e, 0x80, 0xc0, 0xa8, 0x2f, 0x67, 0x4e, 0x04, 0xb1, 0x50, 0xe6, 0xb2, 0x78, 0x47, 0x9f, - 0xb3, 0xe4, 0x12, 0x28, 0x2c, 0x4e, 0x5a, 0xaa, 0x54, 0xf2, 0x6b, 0xd8, 0x1d, 0xbc, 0x62, 0xa3, 0xd5, 0x4c, 0x3b, - 0x8f, 0x67, 0x3b, 0x4d, 0x08, 0xd4, 0x57, 0xd0, 0x4b, 0x9d, 0xd4, 0x2f, 0x96, 0x58, 0x96, 0xfc, 0x5b, 0xf4, 0x98, - 0x97, 0xeb, 0x67, 0xd0, 0x37, 0x2d, 0x23, 0x03, 0x16, 0xf8, 0x0e, 0xe0, 0x48, 0xd1, 0xe1, 0x9f, 0x03, 0x9e, 0x95, - 0xe7, 0x0b, 0x5f, 0xe9, 0xcf, 0xe9, 0x8f, 0x2c, 0x4d, 0xfd, 0x99, 0xa8, 0x5f, 0xef, 0x27, 0x18, 0xed, 0xc8, 0xfb, - 0x17, 0x22, 0x10, 0x24, 0x79, 0x41, 0xcd, 0x36, 0x23, 0x89, 0x6f, 0x35, 0xb0, 0xfe, 0x81, 0x05, 0x55, 0xd8, 0x29, - 0x04, 0x36, 0x4c, 0x61, 0xd9, 0xa2, 0x00, 0x36, 0xff, 0x0d, 0x0b, 0xab, 0x85, 0x99, 0x3f, 0xab, 0x16, 0xd1, 0x3a, - 0xc8, 0xd5, 0xbe, 0x49, 0x85, 0x7e, 0xa9, 0xf0, 0x4b, 0x34, 0xd4, 0x61, 0x3c, 0xfb, 0x53, 0xd5, 0xd3, 0x5b, 0xcc, - 0x0a, 0x3e, 0x44, 0x66, 0x90, 0x0d, 0x6d, 0xc4, 0xb1, 0x66, 0x03, 0x0a, 0x7b, 0x51, 0x36, 0xb7, 0xd0, 0xb5, 0xac, - 0xe5, 0x45, 0x86, 0x69, 0xe3, 0xdc, 0xae, 0xab, 0x0e, 0xb5, 0xbd, 0x64, 0x36, 0xf2, 0x5b, 0xae, 0x77, 0x6c, 0x8a, - 0x3f, 0xb6, 0xd3, 0x31, 0x72, 0x84, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, - 0xbe, 0xb7, 0x88, 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x2e, 0xd4, 0x7d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x5d, - 0xdb, 0x4b, 0xd8, 0x82, 0x5a, 0xcb, 0x48, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0x97, - 0x1c, 0xb5, 0x00, 0x8e, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xfd, 0xa5, 0x3f, 0xc1, 0xc8, 0x84, 0xb6, 0xd7, 0x49, - 0xd8, 0x42, 0xb3, 0x3b, 0x1b, 0x81, 0x27, 0xf1, 0xed, 0x29, 0xf4, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0xa7, 0xf8, 0xc6, - 0x42, 0xcf, 0x12, 0x01, 0xc7, 0xc2, 0x8b, 0x38, 0x40, 0x63, 0x8b, 0x3e, 0xbc, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, - 0x91, 0x45, 0xc3, 0x39, 0x76, 0x96, 0x0a, 0x2c, 0x15, 0x7f, 0xc6, 0x1a, 0xab, 0xbb, 0x9a, 0xd3, 0x87, 0xcb, 0xda, - 0x34, 0x8c, 0x6f, 0x7b, 0xf3, 0x60, 0x32, 0x61, 0x51, 0x1f, 0xfb, 0x2c, 0x0b, 0x59, 0x18, 0x06, 0xcb, 0x34, 0x48, - 0xfb, 0x0b, 0xff, 0x8e, 0x43, 0x3d, 0xdc, 0x04, 0xb5, 0xcd, 0xa1, 0xb6, 0xf7, 0x86, 0xaa, 0x80, 0x01, 0x2f, 0x16, - 0x82, 0xc3, 0xbb, 0xd6, 0xd1, 0x9c, 0xca, 0x38, 0xf7, 0x86, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, - 0x39, 0xb9, 0x7d, 0xb3, 0xa6, 0x85, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x3c, 0x39, 0x93, 0x49, 0x6e, 0x8f, - 0xc5, 0xd3, 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0xa2, 0xa0, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, - 0x1a, 0xb9, 0xcd, 0xf8, 0x53, 0xc2, 0x26, 0x7d, 0x5c, 0x48, 0x64, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x29, 0xc0, - 0x65, 0x89, 0x36, 0xa1, 0xac, 0xe7, 0x6a, 0xbd, 0x77, 0x4d, 0xad, 0xf8, 0xdc, 0x78, 0xdc, 0x58, 0x6f, 0xe2, 0x27, - 0x9f, 0xae, 0x34, 0x65, 0x14, 0xbe, 0x4f, 0xd5, 0xd6, 0x02, 0x0d, 0xd6, 0x5d, 0x0f, 0x42, 0x76, 0xf5, 0x47, 0x71, - 0x02, 0x7b, 0x36, 0xf1, 0x27, 0xc1, 0x2a, 0xed, 0xb9, 0xde, 0xf2, 0x4e, 0x14, 0xf1, 0xb5, 0x5e, 0x14, 0xe0, 0xde, - 0xeb, 0xa5, 0x71, 0x18, 0x4c, 0x44, 0xd1, 0xa6, 0xbd, 0xe4, 0x7a, 0x46, 0x1f, 0x1d, 0xd6, 0x03, 0x0c, 0xbb, 0xe0, - 0x87, 0xa1, 0x66, 0xb7, 0x53, 0x8d, 0xf9, 0x29, 0xca, 0x97, 0x35, 0x27, 0x25, 0xbc, 0xa0, 0x73, 0xba, 0x7b, 0xb8, - 0xbc, 0x93, 0x6b, 0xde, 0x3d, 0x5a, 0xde, 0xe5, 0x7f, 0x5d, 0xb0, 0x49, 0xe0, 0x6b, 0xad, 0x62, 0x35, 0xb9, 0x0e, - 0xc8, 0xa0, 0x8d, 0xf5, 0x86, 0x65, 0x2a, 0xb6, 0x05, 0x84, 0x36, 0x7c, 0x14, 0x2c, 0x96, 0x71, 0x92, 0xf9, 0x51, - 0x96, 0xe7, 0xc3, 0xab, 0x3c, 0xef, 0x5f, 0x04, 0xad, 0xcb, 0x7f, 0xb4, 0xe8, 0x9c, 0x26, 0x9d, 0x4d, 0x6e, 0x5c, - 0x99, 0xaf, 0x99, 0x6a, 0x33, 0x02, 0xc7, 0x18, 0xda, 0x8b, 0xa8, 0x95, 0xe9, 0x94, 0xac, 0x57, 0x26, 0x24, 0xcb, - 0xea, 0x64, 0x83, 0x52, 0xae, 0x82, 0x27, 0x10, 0x54, 0x78, 0xcd, 0x06, 0x17, 0x8a, 0xfd, 0x09, 0x30, 0x2b, 0x58, - 0x99, 0xfc, 0x0a, 0x9e, 0x6c, 0xe2, 0x19, 0xbf, 0xdb, 0xcd, 0x33, 0xfe, 0x9a, 0xed, 0xc3, 0x33, 0x7e, 0xf7, 0xd5, - 0x79, 0xc6, 0x27, 0x75, 0xbf, 0x82, 0xb7, 0xf1, 0x40, 0x97, 0x1a, 0x06, 0x38, 0x9a, 0x12, 0x8a, 0xd8, 0xf3, 0xf6, - 0x0f, 0xbb, 0x01, 0x08, 0x68, 0x94, 0x83, 0x8e, 0x4e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xe7, - 0xe9, 0x74, 0xf0, 0x2a, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, - 0x4f, 0x80, 0x73, 0x36, 0x59, 0x1d, 0x4f, 0xa4, 0xf5, 0x59, 0xbf, 0xdc, 0x85, 0x96, 0x34, 0xf9, 0x14, 0x2e, 0x38, - 0x35, 0x51, 0xe2, 0x8c, 0x65, 0xdc, 0x67, 0xf6, 0xfb, 0xfb, 0xb7, 0x93, 0xd6, 0xdb, 0xd8, 0xc8, 0x83, 0xf4, 0x5d, - 0xd5, 0x01, 0x86, 0xeb, 0x7e, 0x06, 0xea, 0x70, 0x72, 0x6e, 0x41, 0xa6, 0x26, 0x98, 0x86, 0xd7, 0xd4, 0xfc, 0xac, - 0x34, 0xd2, 0x9e, 0xda, 0x90, 0x27, 0xba, 0xaa, 0x1d, 0xc6, 0xdc, 0xfb, 0x60, 0xcd, 0x39, 0x40, 0xcc, 0xdd, 0x85, - 0x7e, 0xc3, 0x13, 0x6a, 0x1e, 0x4c, 0xf2, 0xdc, 0xe8, 0x0b, 0x44, 0x28, 0x07, 0x2d, 0xdb, 0xc5, 0xc4, 0xa5, 0xb7, - 0xd2, 0xa6, 0x81, 0x6b, 0x08, 0x49, 0xfd, 0xf7, 0x16, 0x14, 0xea, 0x5c, 0x59, 0xc8, 0x71, 0xa6, 0x6b, 0x84, 0x3e, - 0x32, 0xb4, 0x50, 0x06, 0x04, 0x1a, 0x60, 0x89, 0x7f, 0xf1, 0x4a, 0x14, 0xd4, 0x6d, 0x38, 0x09, 0x39, 0x68, 0x11, - 0x00, 0x5e, 0xfe, 0x42, 0xae, 0x4d, 0x64, 0x87, 0xd7, 0xc1, 0x87, 0x5c, 0x97, 0xbc, 0x1f, 0x2e, 0xbf, 0xd3, 0x93, - 0x03, 0x68, 0x70, 0x5a, 0x31, 0x1c, 0xd8, 0x61, 0xa1, 0x08, 0xac, 0x44, 0x7a, 0x6b, 0xda, 0xe9, 0xad, 0xf6, 0x6c, - 0x2d, 0x22, 0x64, 0x64, 0xfe, 0xd2, 0x82, 0x2b, 0x3e, 0xd2, 0x5e, 0x4e, 0xf1, 0x94, 0x60, 0x1c, 0xfd, 0x55, 0x0a, - 0xb4, 0x11, 0x2f, 0xaa, 0x48, 0x7f, 0xfa, 0xe3, 0x55, 0x92, 0xc6, 0x49, 0x6f, 0x19, 0x07, 0x51, 0xc6, 0x92, 0x1c, - 0x51, 0x75, 0x89, 0xf8, 0x11, 0xe8, 0xb9, 0x5a, 0xc7, 0x4b, 0x7f, 0x1c, 0x64, 0xf7, 0x3d, 0x87, 0xb3, 0x14, 0x4e, - 0x9f, 0x73, 0x07, 0x4e, 0x63, 0xfd, 0x1e, 0xc7, 0xe6, 0x73, 0x64, 0xfc, 0x92, 0x3a, 0x3b, 0xa3, 0x2e, 0xf3, 0xbe, - 0xf2, 0x96, 0x62, 0x84, 0x00, 0xfb, 0xe1, 0x27, 0xd6, 0x0c, 0xa8, 0x3c, 0x4c, 0xb5, 0x33, 0x61, 0x33, 0x13, 0xa9, - 0x36, 0xc8, 0xe5, 0xc5, 0x1f, 0xbb, 0x63, 0x68, 0x4e, 0x73, 0x31, 0x70, 0x3c, 0xc6, 0x3e, 0x3d, 0xeb, 0xf9, 0x90, - 0x51, 0xcb, 0xdc, 0xa7, 0xe6, 0x88, 0x4d, 0xe3, 0x84, 0x51, 0x3c, 0x59, 0xb7, 0xbb, 0xbc, 0xdb, 0x1f, 0xfc, 0xf6, - 0xe1, 0x37, 0xc3, 0x89, 0xe2, 0xac, 0x25, 0x80, 0x19, 0x3b, 0xa0, 0xd5, 0xcf, 0x33, 0x60, 0x0d, 0x09, 0xf3, 0x63, - 0x0a, 0xdd, 0xd5, 0xd3, 0xf5, 0x7e, 0x63, 0xd8, 0xae, 0x65, 0xcc, 0xcf, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, - 0x9e, 0xb1, 0x7d, 0xb4, 0xbc, 0x13, 0x73, 0x8c, 0x07, 0xde, 0x03, 0x26, 0xa9, 0xd2, 0x15, 0x31, 0x49, 0xd5, 0x62, - 0x9c, 0xa4, 0x7e, 0x6d, 0x34, 0x22, 0x92, 0x45, 0xe5, 0xa4, 0xef, 0x2c, 0xef, 0xd4, 0x23, 0xba, 0x68, 0x26, 0x4f, - 0xea, 0x6a, 0x08, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x4d, 0x74, 0x79, 0x2e, 0x15, 0xe4, 0x48, 0x3c, 0xf8, - 0xa3, 0x34, 0x0e, 0x57, 0x19, 0x6b, 0x46, 0x17, 0x21, 0xc7, 0x73, 0x0a, 0xe4, 0xe0, 0xef, 0x72, 0x5f, 0x3b, 0xc0, - 0x6e, 0xc3, 0x32, 0x71, 0xfa, 0x10, 0x71, 0xd8, 0x6a, 0x97, 0xbb, 0x0e, 0xaf, 0x64, 0xa7, 0xcd, 0x86, 0x81, 0x98, - 0x70, 0x2c, 0x11, 0xf5, 0xd6, 0x6c, 0x97, 0x97, 0xc9, 0xa8, 0xab, 0xb2, 0x28, 0x2f, 0x0f, 0xe6, 0xcf, 0xd9, 0x63, - 0x2f, 0x9a, 0xf7, 0xd8, 0x0b, 0xb1, 0xc7, 0xb6, 0xaf, 0xcc, 0xc7, 0x53, 0x17, 0xfe, 0xeb, 0x17, 0x03, 0xea, 0x39, - 0x5a, 0x7b, 0x79, 0xa7, 0xb9, 0xcb, 0x3b, 0xcd, 0xf2, 0x96, 0x77, 0x1a, 0x82, 0x46, 0x7b, 0x10, 0xd3, 0xf6, 0x0c, - 0xd3, 0xd1, 0xa0, 0x10, 0xfe, 0x38, 0xa5, 0x57, 0xee, 0x21, 0xbc, 0x83, 0x56, 0x9d, 0xfa, 0x3b, 0x6f, 0xfb, 0x56, - 0xa7, 0xbd, 0x24, 0x88, 0xb6, 0x61, 0x67, 0xfe, 0x68, 0xc4, 0x26, 0xbd, 0x69, 0x3c, 0x5e, 0xa5, 0xff, 0xe2, 0xfd, - 0xe7, 0x48, 0xdc, 0x4a, 0x08, 0x2a, 0x70, 0x44, 0x53, 0x50, 0x94, 0xdc, 0x30, 0x01, 0x61, 0x2d, 0xe7, 0xa9, 0x47, - 0xe1, 0x91, 0x3d, 0xfb, 0xb0, 0x61, 0x91, 0x37, 0x23, 0xfa, 0x4f, 0x9b, 0xa5, 0xcd, 0x24, 0xe6, 0x0b, 0xd0, 0xb2, - 0x15, 0x1d, 0x0f, 0xc7, 0x06, 0x9f, 0x4d, 0xa7, 0xdb, 0xdc, 0xdd, 0x4b, 0xf1, 0xa5, 0x2b, 0x71, 0xa8, 0xf0, 0x73, - 0x8b, 0x3b, 0xa6, 0x6c, 0x87, 0xba, 0x69, 0x8d, 0xd4, 0xa0, 0x6e, 0x39, 0x10, 0x8a, 0xba, 0x7b, 0x52, 0xf9, 0xc7, - 0x2f, 0x0e, 0xe1, 0x3f, 0xe2, 0xea, 0x7f, 0xcd, 0x9a, 0x18, 0xf5, 0xb7, 0x65, 0x4b, 0x70, 0x62, 0x95, 0x90, 0x11, - 0xdf, 0xbf, 0xfe, 0x74, 0xfa, 0xb0, 0x06, 0x7b, 0xd7, 0x26, 0x53, 0xaa, 0x6a, 0xed, 0xef, 0xe3, 0x18, 0x52, 0x77, - 0xd6, 0xab, 0x0b, 0xf4, 0x90, 0xb1, 0x7b, 0x36, 0x80, 0x46, 0xe2, 0x1e, 0x41, 0x5a, 0x7c, 0x1d, 0xdb, 0xd0, 0x55, - 0xe2, 0xf5, 0xa6, 0xab, 0xc4, 0xab, 0xdd, 0x57, 0x89, 0x1f, 0xf6, 0xba, 0x4a, 0xbc, 0xfa, 0xea, 0x57, 0x89, 0xd7, - 0xf5, 0xab, 0xc4, 0x45, 0x2c, 0xec, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0xce, 0xe3, 0x41, 0xc7, - 0xa1, 0x90, 0xc7, 0x17, 0x7f, 0xf8, 0x62, 0x81, 0x0b, 0xf1, 0x3d, 0x9a, 0x93, 0x15, 0x57, 0x0b, 0x4e, 0xd9, 0xf1, - 0x3b, 0x4a, 0x71, 0x18, 0x47, 0xb3, 0x9f, 0x41, 0x29, 0x0b, 0xe2, 0xc0, 0x44, 0x79, 0x11, 0xa4, 0x3f, 0xc7, 0xcb, - 0xd5, 0xf2, 0x2d, 0xc0, 0xfa, 0x18, 0xa4, 0xc1, 0x28, 0x64, 0xd2, 0x13, 0x99, 0xcc, 0xdf, 0xb8, 0x4c, 0x1c, 0x2c, - 0x4e, 0xc5, 0x4f, 0xff, 0x4e, 0xfc, 0x44, 0x9b, 0x54, 0xfe, 0x9b, 0xec, 0xea, 0xf4, 0xe6, 0x8b, 0x88, 0x50, 0x02, - 0x2a, 0x9d, 0x7e, 0xf8, 0x65, 0xe4, 0x22, 0x36, 0x1a, 0x46, 0x29, 0xec, 0x1d, 0x36, 0xc2, 0x61, 0xb5, 0x4b, 0xcd, - 0xca, 0x30, 0x65, 0x08, 0xae, 0xba, 0x18, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x93, - 0x01, 0x68, 0x38, 0x65, 0x1b, 0x4c, 0x1e, 0xf9, 0x01, 0x19, 0xe5, 0x38, 0x69, 0xe9, 0x90, 0xbb, 0x74, 0xb5, 0xb4, - 0x48, 0xd5, 0x6c, 0xe1, 0x10, 0x75, 0x99, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0xd6, 0x52, 0x98, 0x6a, 0xc4, - 0x36, 0x97, 0x0a, 0xa7, 0xad, 0x48, 0x08, 0x17, 0x45, 0x1c, 0x8c, 0x86, 0x89, 0xe3, 0x6f, 0xc8, 0x75, 0xb5, 0x78, - 0x0b, 0x51, 0x44, 0xf2, 0x15, 0x9f, 0x0f, 0x1e, 0x15, 0x82, 0x1e, 0x5f, 0x2a, 0x68, 0x7c, 0x77, 0xc3, 0x92, 0xd0, - 0xbf, 0x6f, 0x19, 0x79, 0x1c, 0xfd, 0x08, 0x08, 0x78, 0x15, 0xdf, 0x46, 0x6a, 0x05, 0x4c, 0xd6, 0xd2, 0xb0, 0x96, - 0x1a, 0xe3, 0x97, 0x80, 0xe3, 0x8a, 0xd2, 0x03, 0x48, 0x93, 0x3b, 0x63, 0x7f, 0x37, 0xe9, 0xdf, 0x7f, 0x18, 0xb9, - 0x79, 0x1e, 0xcb, 0x0f, 0xfd, 0xb2, 0xdc, 0xe3, 0x33, 0x4f, 0x9f, 0x3e, 0xda, 0x3c, 0xec, 0x72, 0x7a, 0xf6, 0x86, - 0xd6, 0xc6, 0xc6, 0x5d, 0x00, 0xbd, 0xb8, 0x88, 0x57, 0xe3, 0x39, 0x1a, 0xba, 0x7e, 0xbd, 0xf1, 0x66, 0x00, 0x13, - 0xb3, 0x94, 0xca, 0xa1, 0x57, 0x8a, 0x0a, 0x2c, 0xe0, 0xf7, 0x5f, 0x43, 0x00, 0xce, 0xff, 0x21, 0x1a, 0xea, 0xab, - 0x86, 0xdf, 0xe2, 0x83, 0x87, 0x2d, 0xde, 0x3e, 0x24, 0xd3, 0xe4, 0xa1, 0x2d, 0x84, 0x72, 0xad, 0x99, 0xc8, 0xe4, - 0x55, 0xa4, 0xa9, 0x61, 0xe4, 0x36, 0x45, 0xc8, 0x13, 0x5f, 0x61, 0x36, 0x5d, 0xd3, 0xb9, 0xa3, 0x81, 0xc9, 0x38, - 0xb5, 0xaa, 0x10, 0x19, 0x6e, 0xf2, 0xc0, 0x90, 0x7c, 0x55, 0xdf, 0x2d, 0x82, 0xc8, 0xc4, 0x28, 0xf0, 0xf5, 0x37, - 0xfe, 0x1d, 0xc4, 0x41, 0x06, 0xe2, 0x56, 0x7d, 0x05, 0x85, 0xa6, 0xea, 0x37, 0x07, 0xa9, 0x9e, 0xf4, 0x46, 0x4c, - 0x08, 0x2d, 0xde, 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0x79, 0x8d, 0xd0, 0xe4, 0x3d, 0x02, 0xcb, 0xf1, 0x3a, 0x00, 0xda, - 0x92, 0x7c, 0x79, 0x47, 0x25, 0x70, 0x33, 0x40, 0x9d, 0xac, 0x28, 0xe0, 0xa1, 0xfe, 0x3a, 0x8e, 0x28, 0x10, 0x17, - 0x7a, 0x08, 0xd3, 0xe6, 0x27, 0x10, 0x11, 0xb8, 0xa7, 0xe1, 0x85, 0x1d, 0xdf, 0x72, 0x49, 0xb0, 0xe6, 0xd0, 0xe3, - 0xb0, 0xcf, 0x9a, 0x63, 0xc2, 0x45, 0x0a, 0x15, 0x04, 0xad, 0x43, 0x25, 0xc4, 0xb3, 0xc9, 0x1a, 0x68, 0x23, 0xde, - 0x8b, 0xee, 0xb2, 0x05, 0x8b, 0x56, 0x3a, 0xe6, 0x84, 0xc2, 0x18, 0x7d, 0x50, 0xe7, 0x15, 0x31, 0x5b, 0x40, 0x6d, - 0x9a, 0x5b, 0xce, 0xe9, 0x2c, 0x4c, 0x39, 0x49, 0xf5, 0xcd, 0x31, 0x57, 0x6c, 0xa6, 0x9c, 0xb6, 0x55, 0x4f, 0x08, - 0x3e, 0xa5, 0x71, 0xd5, 0x91, 0x8b, 0x2c, 0xa1, 0x01, 0x06, 0x45, 0xc7, 0xe0, 0xe2, 0x22, 0x81, 0xf6, 0x96, 0x5f, - 0x9d, 0x34, 0xa9, 0x91, 0xf1, 0x2b, 0x82, 0xa2, 0xc4, 0xa8, 0x83, 0xe1, 0xfd, 0x84, 0xc0, 0x44, 0x1b, 0xe1, 0x8c, - 0x6b, 0x70, 0x36, 0x0c, 0xfa, 0x13, 0xbb, 0xa7, 0x83, 0x84, 0x50, 0xf5, 0x89, 0xdd, 0x83, 0xed, 0xdf, 0x6b, 0x90, - 0xa6, 0xe8, 0x5b, 0xc8, 0xb5, 0x09, 0xa1, 0xfe, 0xc7, 0x10, 0xac, 0x6a, 0xcb, 0x06, 0x72, 0xf2, 0x2d, 0x54, 0x1c, - 0x51, 0x0c, 0x59, 0x9d, 0xc5, 0x26, 0xe6, 0x26, 0xfe, 0xad, 0x46, 0x1c, 0x5b, 0x0d, 0x5b, 0xc3, 0x78, 0xe6, 0x3a, - 0xce, 0x41, 0xad, 0x3e, 0x08, 0xb2, 0x9b, 0x6a, 0x1b, 0x66, 0x36, 0x70, 0x1d, 0x2b, 0x78, 0x66, 0x7b, 0xfd, 0xda, - 0x19, 0xad, 0xc4, 0x92, 0x1c, 0xa2, 0xf8, 0xeb, 0xf4, 0xc9, 0xba, 0x55, 0xdb, 0x90, 0x46, 0xd5, 0x64, 0x1e, 0xfb, - 0x96, 0x73, 0xf9, 0xd7, 0xb0, 0x7e, 0xf4, 0x53, 0x24, 0x4b, 0xca, 0x6b, 0x32, 0x84, 0x68, 0xc8, 0x2d, 0xd8, 0x46, - 0x7f, 0xd1, 0x9e, 0x6b, 0x2d, 0xda, 0x3e, 0x86, 0x31, 0x94, 0xe9, 0xb2, 0x85, 0x4f, 0x99, 0x0a, 0xa0, 0xf2, 0xc5, - 0xb4, 0x4a, 0xe1, 0x78, 0xdc, 0x55, 0x56, 0x68, 0xf4, 0xb6, 0x72, 0x0b, 0x08, 0x7f, 0xc3, 0xf1, 0x69, 0x8f, 0x20, - 0x2e, 0x01, 0xd4, 0x80, 0xd8, 0xe9, 0x3b, 0x01, 0xae, 0x96, 0x65, 0x70, 0xe5, 0x43, 0x72, 0x7f, 0x60, 0x78, 0xe8, - 0xa0, 0x0e, 0x4d, 0xc2, 0x6b, 0x3e, 0xee, 0x1e, 0x08, 0x92, 0x45, 0x93, 0x32, 0xc0, 0xca, 0xf9, 0xb5, 0x3f, 0xb8, - 0x12, 0x45, 0x81, 0xa4, 0x02, 0x71, 0x03, 0x45, 0xc9, 0xe3, 0x08, 0x17, 0x3f, 0x6d, 0xb7, 0x60, 0x2f, 0x2e, 0x06, - 0x1b, 0x50, 0x44, 0x30, 0xd9, 0x4c, 0x11, 0x8a, 0x43, 0xe4, 0x6a, 0x74, 0x0b, 0x6e, 0x09, 0x46, 0x74, 0xe3, 0x4a, - 0xcc, 0x84, 0x4d, 0x61, 0xd1, 0x26, 0xe0, 0xb1, 0x28, 0xf7, 0x95, 0x5a, 0x07, 0xbb, 0xa5, 0xd6, 0xd9, 0x2e, 0xa9, - 0x35, 0xb9, 0x53, 0xdd, 0x26, 0xfe, 0x52, 0xf1, 0xc8, 0x13, 0xcc, 0xb9, 0xea, 0x98, 0x57, 0x12, 0x75, 0xa3, 0xf7, - 0x95, 0x68, 0x55, 0x83, 0x46, 0x56, 0x82, 0x28, 0xfe, 0x56, 0x2e, 0x28, 0x42, 0xa1, 0xae, 0xca, 0xc6, 0x2f, 0x0a, - 0xd9, 0x38, 0xdd, 0x6a, 0x0a, 0x47, 0x1a, 0xc1, 0xfd, 0x2b, 0x4e, 0x6a, 0xf2, 0x76, 0x50, 0x38, 0xab, 0x15, 0x3d, - 0x55, 0xdc, 0xaf, 0x8a, 0x8b, 0x86, 0xe2, 0xd4, 0x27, 0x6e, 0x19, 0x65, 0xdf, 0xbe, 0x72, 0xd5, 0xc2, 0xfb, 0xaa, - 0x28, 0x07, 0xa9, 0x3b, 0x76, 0x59, 0x16, 0xab, 0xcb, 0xa6, 0xec, 0x7e, 0xa3, 0xbe, 0x56, 0x16, 0x89, 0xf4, 0x93, - 0x21, 0x04, 0x0b, 0x31, 0x7d, 0x45, 0xaf, 0x2d, 0x6d, 0x20, 0xb0, 0x93, 0x0d, 0x6e, 0x7d, 0xbb, 0xa5, 0xf3, 0x94, - 0x2f, 0xa1, 0xd0, 0xc2, 0xab, 0x32, 0x08, 0xc4, 0xef, 0xd5, 0xba, 0xe1, 0x94, 0xc7, 0x43, 0x9e, 0x9f, 0xef, 0x20, - 0x5e, 0xd4, 0x1c, 0x55, 0x91, 0x8f, 0x3b, 0xd3, 0x22, 0xf3, 0x5c, 0xac, 0x5a, 0x07, 0x4a, 0x42, 0x9c, 0x35, 0xf7, - 0x8c, 0x29, 0xcb, 0xe8, 0x79, 0x8d, 0x9e, 0xf8, 0x2e, 0x5f, 0x3a, 0xc9, 0x2a, 0xc2, 0xd8, 0xf6, 0x56, 0x96, 0xf8, - 0xe3, 0x4f, 0x4a, 0x97, 0x85, 0x9c, 0x13, 0x64, 0xc0, 0x65, 0x4d, 0x41, 0xdf, 0xc7, 0x50, 0x90, 0xac, 0x67, 0x7b, - 0xa9, 0x22, 0x7d, 0xe9, 0x3d, 0x76, 0xda, 0xfe, 0x8b, 0xe9, 0x61, 0x45, 0x28, 0xea, 0x75, 0xca, 0x22, 0xf3, 0x0d, - 0xfd, 0xc8, 0xe6, 0xab, 0xc5, 0x68, 0xad, 0xca, 0x56, 0x15, 0x91, 0x6b, 0x5d, 0xcc, 0xaa, 0x7e, 0x76, 0x3a, 0x9d, - 0x96, 0x05, 0x8d, 0x8e, 0x76, 0x88, 0xc2, 0xc2, 0xc7, 0x8e, 0xe3, 0x54, 0xfb, 0xbe, 0x1d, 0xed, 0x16, 0xca, 0x6d, - 0xbb, 0x8d, 0x3d, 0x46, 0xdc, 0xee, 0xc2, 0x5f, 0x1d, 0x1d, 0xb9, 0x5d, 0xec, 0xec, 0x92, 0x59, 0x44, 0x9f, 0x8c, - 0x21, 0x82, 0x8c, 0x2d, 0xd2, 0xde, 0x98, 0xa1, 0x0e, 0xc6, 0x56, 0x36, 0x34, 0x1a, 0x0e, 0x58, 0x33, 0x30, 0x15, - 0x71, 0xc5, 0xaa, 0x70, 0x34, 0x94, 0x87, 0xd7, 0x84, 0xf7, 0xe2, 0x23, 0xb8, 0x51, 0xd6, 0x75, 0x99, 0x36, 0x0e, - 0xab, 0xe3, 0xfc, 0xa5, 0x54, 0x4f, 0x83, 0x03, 0x70, 0x2d, 0x14, 0xda, 0x24, 0x9f, 0xc5, 0xbf, 0xa5, 0xfc, 0xff, - 0xc5, 0xf2, 0xae, 0x6c, 0x3f, 0xd2, 0x05, 0x89, 0x76, 0xb1, 0x5b, 0xa8, 0xd7, 0x4d, 0x6b, 0x40, 0x5a, 0x19, 0x4c, - 0x55, 0x05, 0x3a, 0x28, 0xe9, 0x4b, 0x09, 0x40, 0x1a, 0xc4, 0xef, 0xc8, 0x31, 0xc3, 0x14, 0x17, 0x22, 0xc4, 0x22, - 0x7d, 0x1d, 0x8c, 0xc1, 0x7c, 0xde, 0x45, 0xfd, 0x41, 0x69, 0x4d, 0x80, 0x36, 0xbe, 0x36, 0xb6, 0xbd, 0xc4, 0xfd, - 0x55, 0xbd, 0x96, 0x00, 0x0c, 0x28, 0x73, 0x61, 0x13, 0xa2, 0x21, 0x81, 0x56, 0x59, 0xdc, 0xd4, 0x4b, 0xf9, 0x56, - 0xd5, 0xb3, 0x89, 0x8e, 0x21, 0xb8, 0xe6, 0x2a, 0x04, 0x5b, 0x68, 0x0b, 0x60, 0xb0, 0x7c, 0xf9, 0xe1, 0xb3, 0x05, - 0x53, 0xac, 0xae, 0x47, 0x17, 0xa7, 0x1c, 0xd7, 0xaf, 0x85, 0x67, 0x67, 0x4a, 0xfb, 0x1f, 0xe5, 0x8b, 0x3f, 0x34, - 0x0a, 0xf4, 0x2e, 0x4a, 0x12, 0x3a, 0x6e, 0x2d, 0xee, 0x19, 0x7b, 0xd5, 0x5e, 0x04, 0xd1, 0xfe, 0x75, 0xfd, 0xbb, - 0xbd, 0xeb, 0xc2, 0x81, 0xb1, 0x77, 0x65, 0x38, 0x71, 0xc8, 0x72, 0x21, 0x1b, 0xfc, 0xa0, 0x08, 0x14, 0x55, 0xaf, - 0x63, 0x1d, 0x5b, 0x11, 0x97, 0x7f, 0xb1, 0x1a, 0x0c, 0x4f, 0xce, 0xee, 0x16, 0xa1, 0x76, 0xc3, 0x12, 0x48, 0xed, - 0x33, 0xd0, 0x5d, 0xdb, 0xd1, 0x35, 0xf4, 0xa1, 0x0d, 0xa2, 0xd9, 0x40, 0xff, 0xe5, 0xe2, 0x8d, 0xd5, 0xd5, 0xcf, - 0x40, 0x45, 0x7b, 0x33, 0xc3, 0x63, 0xef, 0xdc, 0xbf, 0x67, 0xc9, 0xb5, 0xa7, 0x6b, 0x98, 0xc1, 0x87, 0x0e, 0x3c, - 0x2c, 0xd3, 0x3c, 0x7d, 0x8f, 0x44, 0x11, 0x9a, 0xc8, 0xf5, 0xa6, 0x03, 0xc9, 0x71, 0xbd, 0xae, 0xe6, 0x7a, 0x87, - 0xf6, 0x51, 0x57, 0x3f, 0xfd, 0x46, 0xd3, 0x4e, 0x26, 0x6c, 0x9a, 0x9e, 0xe2, 0x15, 0xed, 0x04, 0xcf, 0x08, 0xfa, - 0xad, 0x69, 0xf6, 0x38, 0x4c, 0x2d, 0x57, 0x5b, 0xf3, 0x47, 0x4d, 0x9b, 0x06, 0x61, 0xd8, 0xd3, 0x1e, 0x4f, 0xbd, - 0xe9, 0xe1, 0xf4, 0x45, 0x9f, 0x17, 0xe7, 0xdf, 0x94, 0xaa, 0x9b, 0xf4, 0xaf, 0xa7, 0x34, 0x4b, 0xb3, 0x24, 0xfe, - 0xc4, 0xb8, 0xd9, 0x89, 0x26, 0x2f, 0x8f, 0xd5, 0xa6, 0x5e, 0xfd, 0x4b, 0x6e, 0x77, 0x34, 0x9e, 0x7a, 0x45, 0x75, - 0xec, 0xe3, 0x81, 0xec, 0xe4, 0xc9, 0x81, 0xe8, 0xfa, 0x89, 0x8a, 0x26, 0xd7, 0x6a, 0x42, 0x94, 0xab, 0xf3, 0x31, - 0xce, 0xc4, 0xf8, 0x4e, 0x20, 0x0e, 0xa3, 0x74, 0xd7, 0x85, 0x1e, 0xe8, 0xda, 0x64, 0xa0, 0xff, 0xe8, 0x7a, 0x5d, - 0xd3, 0x75, 0x8f, 0xec, 0xa3, 0xee, 0xd8, 0x31, 0x0f, 0xed, 0x43, 0xab, 0x6d, 0x1f, 0x99, 0x5d, 0xab, 0x6b, 0x76, - 0xff, 0xd6, 0x1d, 0x5b, 0x87, 0xf6, 0xa1, 0xe9, 0x58, 0x5d, 0x28, 0xb4, 0xba, 0x56, 0xf7, 0xc6, 0x3a, 0xec, 0x8e, - 0x1d, 0x2c, 0xf5, 0xec, 0x4e, 0xc7, 0x72, 0x1d, 0xbb, 0xd3, 0x31, 0x3b, 0xf6, 0xd1, 0x91, 0xe5, 0xb6, 0xed, 0xa3, - 0xa3, 0xf3, 0x4e, 0xd7, 0x6e, 0xc3, 0xbb, 0x76, 0x7b, 0xdc, 0xb6, 0x5d, 0xd7, 0x82, 0xbf, 0xcc, 0xae, 0xed, 0xd1, - 0x0f, 0xd7, 0xb5, 0xdb, 0xae, 0xe9, 0x84, 0x1d, 0xcf, 0x3e, 0x7a, 0x61, 0xe2, 0xdf, 0x58, 0xcd, 0xc4, 0xbf, 0x00, - 0x8c, 0xf9, 0xc2, 0xf6, 0x8e, 0xe8, 0x17, 0x02, 0xbc, 0x39, 0xec, 0xfe, 0xaa, 0x1f, 0x6c, 0x1c, 0x83, 0x4b, 0x63, - 0xe8, 0x76, 0xec, 0x76, 0xdb, 0x3c, 0x74, 0xed, 0x6e, 0x7b, 0x6e, 0x1d, 0x7a, 0xf6, 0xd1, 0xf1, 0xd8, 0x72, 0xed, - 0xe3, 0x63, 0xd3, 0xb1, 0xda, 0xb6, 0x67, 0xba, 0xf6, 0x61, 0x1b, 0x7f, 0xb4, 0x6d, 0xef, 0xe6, 0xf8, 0x85, 0x7d, - 0xd4, 0x99, 0x1f, 0xd9, 0x87, 0x1f, 0x0f, 0xbb, 0xb6, 0xd7, 0x9e, 0xb7, 0x8f, 0x6c, 0xef, 0xf8, 0xe6, 0xc8, 0x3e, - 0x9c, 0x5b, 0xde, 0xd1, 0xd6, 0x96, 0xae, 0x67, 0x03, 0x8e, 0xf0, 0x35, 0xbc, 0x30, 0xf9, 0x0b, 0xf8, 0x33, 0xc7, - 0xb6, 0xff, 0x45, 0x30, 0x69, 0xbd, 0xe9, 0x0b, 0xbb, 0x7b, 0x3c, 0xa6, 0xea, 0x50, 0x60, 0x89, 0x1a, 0xd0, 0xe4, - 0xc6, 0xa2, 0xcf, 0x22, 0x38, 0x4b, 0x00, 0x12, 0x7f, 0xf8, 0xc7, 0x6e, 0x2c, 0xf8, 0x30, 0x7d, 0xf7, 0x7f, 0x0a, - 0x47, 0x4e, 0x39, 0x64, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x49, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x45, 0xc5, 0xfb, 0xdd, - 0x8a, 0x8a, 0x37, 0xab, 0x7d, 0x14, 0x15, 0xef, 0xbf, 0xba, 0xa2, 0xe2, 0xbc, 0x6a, 0x27, 0xff, 0xbe, 0x1a, 0x9b, - 0xfe, 0xd7, 0x75, 0xf5, 0x1a, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x44, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, - 0x4a, 0x46, 0x60, 0x31, 0xd0, 0xd8, 0xf7, 0x31, 0xd1, 0xd8, 0xdf, 0x57, 0x03, 0xb0, 0x3c, 0xe1, 0x7c, 0x49, 0x30, - 0xb1, 0xe6, 0x7e, 0x38, 0x95, 0x3c, 0x0d, 0x94, 0xf4, 0xb1, 0x18, 0xbc, 0x12, 0xe0, 0xb8, 0x06, 0x75, 0xd8, 0x6a, - 0x11, 0xa5, 0xbd, 0x23, 0x07, 0x0e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xc6, 0xb6, 0x88, 0x47, 0x75, 0xcd, 0xbd, 0x26, - 0x36, 0xbe, 0x47, 0xa3, 0xc0, 0x66, 0xe8, 0x6e, 0x1d, 0xae, 0x06, 0xd6, 0x36, 0xc2, 0x68, 0x12, 0xd8, 0xb9, 0xa6, - 0xf7, 0x65, 0xd3, 0xbc, 0x8a, 0x31, 0xe6, 0xe6, 0x9e, 0x42, 0x4f, 0xaa, 0xed, 0xdd, 0xb2, 0x69, 0xdf, 0xae, 0x61, - 0x36, 0x7c, 0xbe, 0xd4, 0x7c, 0x8b, 0x5d, 0xa1, 0x04, 0x5c, 0x45, 0x55, 0x25, 0xb3, 0x5a, 0x23, 0x42, 0x0a, 0xee, - 0xbe, 0x30, 0x3e, 0x2c, 0x58, 0x4b, 0x47, 0x43, 0x7e, 0xc7, 0x51, 0xde, 0x95, 0x60, 0xaa, 0x06, 0x8b, 0xcf, 0xd6, - 0xc8, 0x71, 0x07, 0xbf, 0x03, 0xeb, 0xc8, 0x39, 0x9e, 0x51, 0xac, 0xe2, 0x79, 0xad, 0xc0, 0xa5, 0xcb, 0x4c, 0x3e, - 0x77, 0xd7, 0x75, 0xe6, 0x71, 0xa3, 0xa9, 0xb2, 0xcb, 0x16, 0x82, 0x0b, 0xc2, 0xcf, 0x93, 0x61, 0x70, 0x4e, 0xc6, - 0xdb, 0x68, 0xfb, 0xbc, 0x0d, 0x98, 0xa8, 0xf7, 0x18, 0x16, 0xb1, 0xc9, 0x1f, 0xd4, 0xb8, 0x00, 0xeb, 0x29, 0x64, - 0xc1, 0xee, 0x21, 0x9b, 0xa6, 0xf0, 0xa8, 0x1e, 0x5a, 0x31, 0xf7, 0xb7, 0x18, 0xd8, 0xa8, 0x80, 0x39, 0x10, 0xb4, - 0x86, 0xde, 0x66, 0x93, 0x23, 0x9d, 0x47, 0xd6, 0x25, 0x15, 0xb5, 0xdb, 0x39, 0x36, 0xdd, 0x23, 0xd3, 0x3e, 0xee, - 0x18, 0xb9, 0xd8, 0x70, 0x2a, 0xc8, 0x12, 0x42, 0xc0, 0x28, 0x5a, 0x76, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc3, 0x1c, - 0xf8, 0xe3, 0xf2, 0xad, 0xe2, 0x9f, 0xab, 0x34, 0x83, 0x31, 0x0a, 0xa6, 0x17, 0x0d, 0xc2, 0xad, 0x11, 0xcb, 0x6e, - 0x19, 0x8b, 0x36, 0x28, 0xcb, 0xab, 0xf6, 0xe5, 0x7f, 0x9e, 0xb5, 0x6d, 0x4e, 0x96, 0x2c, 0xa3, 0x2c, 0xe2, 0xeb, - 0x43, 0x18, 0x43, 0xe7, 0x43, 0xf3, 0xa7, 0x4d, 0x04, 0xf7, 0x9f, 0xbb, 0x09, 0x6e, 0xc6, 0xf6, 0x21, 0xb8, 0xff, - 0xfc, 0xea, 0x04, 0xf7, 0x27, 0x95, 0xe0, 0x96, 0x7c, 0x81, 0x0a, 0xa9, 0xf3, 0x07, 0x7c, 0x6e, 0x41, 0x50, 0xe7, - 0xe7, 0xfa, 0x01, 0x31, 0xf0, 0xba, 0x92, 0x6c, 0xf7, 0x63, 0x29, 0x7b, 0x10, 0x0a, 0x45, 0x30, 0x08, 0x2d, 0x65, - 0x2a, 0x81, 0x44, 0xb4, 0x32, 0xa5, 0x3a, 0xc0, 0x7c, 0x1b, 0x65, 0xa1, 0xfd, 0x9e, 0x5f, 0xfc, 0x40, 0xc9, 0xf3, - 0x26, 0x4e, 0x16, 0x3e, 0x06, 0xe0, 0xd3, 0x31, 0xeb, 0x20, 0x3c, 0x38, 0xe0, 0x7f, 0x36, 0x8e, 0xa3, 0x89, 0xd4, - 0x54, 0xb0, 0xc1, 0x25, 0x71, 0xdc, 0xfa, 0x3d, 0xf3, 0x13, 0xdd, 0xa4, 0xd7, 0x30, 0xb9, 0xcf, 0xda, 0xce, 0x33, - 0xef, 0xf0, 0xd9, 0x91, 0x03, 0xff, 0xbb, 0xac, 0x9d, 0x9b, 0xbc, 0xe2, 0x22, 0x8e, 0x20, 0xf1, 0x89, 0xa8, 0xb9, - 0xa9, 0xda, 0x2d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd, 0x95, 0x26, 0xfe, 0x7d, 0x51, 0xa7, 0xb1, 0xc6, 0x3c, 0x5e, - 0x29, 0xdd, 0x6a, 0xe8, 0x4d, 0x10, 0xad, 0x40, 0xf6, 0xa6, 0xd4, 0x50, 0x5f, 0xf3, 0xe1, 0x16, 0xe3, 0x62, 0xed, - 0xfc, 0xaa, 0xc8, 0xae, 0x24, 0xb2, 0xbc, 0xec, 0xc4, 0x20, 0x57, 0x5b, 0x38, 0x18, 0x9b, 0x1d, 0xf3, 0x0b, 0x69, - 0x90, 0xdb, 0x50, 0x4c, 0x90, 0x4f, 0x13, 0x94, 0x25, 0xab, 0x68, 0xdc, 0xc2, 0x9f, 0xfe, 0x28, 0x6d, 0x05, 0x07, - 0x10, 0x9d, 0x15, 0x3f, 0x6c, 0xe0, 0xac, 0xf9, 0xa7, 0x4e, 0x91, 0x8a, 0x22, 0x15, 0xb3, 0xe2, 0x3f, 0xcb, 0xcc, - 0x84, 0x12, 0xd8, 0xe2, 0xd4, 0x5a, 0x03, 0xff, 0x99, 0x6c, 0xf8, 0x2c, 0x33, 0x21, 0x89, 0x2c, 0x4c, 0xf7, 0xd3, - 0xa7, 0x54, 0x0b, 0xd2, 0x3a, 0xd2, 0xb0, 0xce, 0xc6, 0x45, 0x78, 0x37, 0xcd, 0x9f, 0xc5, 0x14, 0xe1, 0xad, 0x37, - 0x36, 0xe3, 0xe7, 0xcf, 0x4f, 0x07, 0xae, 0xc1, 0x93, 0x92, 0x96, 0x32, 0x68, 0x9d, 0xef, 0x67, 0x7c, 0x60, 0x34, - 0xba, 0xc5, 0x2d, 0xe1, 0xce, 0xe4, 0x08, 0x13, 0x65, 0x4e, 0xbd, 0x20, 0xa3, 0x05, 0x29, 0x19, 0x7d, 0x61, 0x04, - 0x20, 0xea, 0xc8, 0x5b, 0x57, 0xdb, 0x76, 0x6c, 0x47, 0x97, 0x0d, 0xa7, 0xc1, 0x6c, 0xb0, 0x8e, 0x33, 0x1f, 0x72, - 0x03, 0x85, 0xf1, 0x0c, 0x7c, 0x6b, 0xb2, 0x20, 0x0b, 0x21, 0xd1, 0x0c, 0x38, 0xd9, 0x2c, 0xe8, 0x5e, 0x9e, 0x73, - 0x8b, 0x67, 0x3f, 0xf9, 0x84, 0xc9, 0x06, 0x85, 0x5b, 0x1d, 0x46, 0x1c, 0xfa, 0x11, 0x0e, 0xc3, 0x96, 0xde, 0x82, - 0x54, 0x97, 0x2c, 0x49, 0x2d, 0xd5, 0x83, 0xa0, 0xa7, 0x41, 0x1b, 0x48, 0x43, 0x8f, 0x00, 0xa6, 0x89, 0xbf, 0x80, - 0x98, 0xec, 0xeb, 0xdc, 0xe4, 0x94, 0x56, 0xe7, 0xa4, 0x56, 0x73, 0x5f, 0x1c, 0x99, 0x9a, 0xe7, 0x9a, 0x9a, 0x03, - 0xe4, 0x56, 0xcf, 0xcd, 0x75, 0x7e, 0xd5, 0xdf, 0xa5, 0x04, 0x25, 0xfa, 0xf2, 0x98, 0xc6, 0x41, 0xea, 0x4f, 0x2e, - 0x5e, 0xce, 0x28, 0x80, 0x64, 0x4b, 0x89, 0x96, 0x1e, 0x90, 0x22, 0xe4, 0x82, 0xdd, 0x65, 0x06, 0x26, 0x62, 0xe1, - 0x55, 0x02, 0x63, 0x8d, 0xce, 0x7f, 0x41, 0xa4, 0x05, 0x9f, 0x3f, 0xb7, 0x02, 0x70, 0x70, 0x18, 0x28, 0xf8, 0x81, - 0x67, 0xa3, 0x84, 0xb0, 0xa0, 0x50, 0xdd, 0x21, 0xb2, 0xc0, 0xfb, 0x08, 0xfe, 0x2d, 0x8a, 0xc5, 0x0f, 0xae, 0x3a, - 0xb5, 0x43, 0x3f, 0x9a, 0x01, 0x49, 0xf3, 0xa3, 0x59, 0xcd, 0x44, 0x83, 0xfc, 0x17, 0x2b, 0xa5, 0x05, 0xa8, 0xc2, - 0x7c, 0x22, 0xfd, 0xfe, 0xfe, 0x82, 0x12, 0x4d, 0x41, 0x52, 0x73, 0x7f, 0x82, 0xce, 0x76, 0x85, 0x76, 0xe7, 0xf9, - 0xe0, 0xdb, 0x93, 0x05, 0xcb, 0x7c, 0x12, 0x0d, 0xc3, 0xe5, 0x17, 0xd8, 0x01, 0x6d, 0x2c, 0x92, 0xc4, 0x52, 0x32, - 0xf9, 0x09, 0xbb, 0x09, 0xc6, 0xfc, 0x5e, 0x6a, 0x6a, 0xfc, 0x9c, 0xb2, 0xd0, 0x0a, 0x6c, 0xe0, 0x9a, 0x64, 0x84, - 0x3c, 0xf6, 0x31, 0xcc, 0xe4, 0x20, 0x8a, 0xf5, 0xd3, 0x6f, 0xa5, 0xbf, 0xd6, 0xa6, 0x49, 0x80, 0x6c, 0x8f, 0x97, - 0x09, 0x0b, 0xff, 0x35, 0xf8, 0x16, 0x0e, 0xee, 0x6f, 0xaf, 0x74, 0xa3, 0x9f, 0xd9, 0xf3, 0x84, 0x4d, 0x07, 0xdf, - 0x36, 0x64, 0x3d, 0xc4, 0xeb, 0x3d, 0xf5, 0x45, 0x6f, 0x7b, 0x45, 0x70, 0xa0, 0xf6, 0x5e, 0x97, 0xfa, 0x53, 0x7e, - 0x5b, 0x87, 0x1b, 0xe0, 0xba, 0x74, 0xc7, 0x76, 0xfb, 0x78, 0x7f, 0x1e, 0x85, 0xfe, 0xf8, 0x53, 0x9f, 0xde, 0x94, - 0x1e, 0x2c, 0x38, 0xad, 0xc7, 0xfe, 0xb2, 0x87, 0xc7, 0xab, 0x5a, 0x08, 0xee, 0x9a, 0x54, 0x2a, 0x39, 0xbb, 0xc6, - 0xb5, 0x8c, 0x4b, 0x79, 0x8d, 0x5f, 0xc6, 0x4f, 0xdd, 0xce, 0x83, 0x8c, 0x89, 0x4f, 0xe1, 0x43, 0x9e, 0x8b, 0x8b, - 0x3a, 0x5d, 0x51, 0xf1, 0x62, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, - 0x74, 0xbb, 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, - 0x3f, 0xba, 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xad, 0xe0, 0x02, 0x44, 0xf7, 0x9d, 0x6f, 0x4b, 0x54, - 0x40, 0xf9, 0x2d, 0xf5, 0x34, 0x66, 0xe9, 0x78, 0x6b, 0xd0, 0xf5, 0x00, 0xc9, 0xd0, 0x4d, 0x11, 0x04, 0x32, 0xea, - 0xb7, 0x20, 0x0d, 0x3b, 0x26, 0x10, 0x10, 0x26, 0x2f, 0xc2, 0x2f, 0x55, 0x84, 0xd2, 0x6f, 0xdc, 0x46, 0xbc, 0x4d, - 0x73, 0xc0, 0x75, 0x91, 0x99, 0x8a, 0x94, 0x43, 0xbf, 0x2c, 0x31, 0x88, 0x91, 0x08, 0x11, 0xaf, 0x50, 0xa5, 0x22, - 0x3b, 0x62, 0xbe, 0xbb, 0xe3, 0xe8, 0x99, 0xcb, 0x64, 0x76, 0x9e, 0xaf, 0x0a, 0x9b, 0x2b, 0x8c, 0x24, 0xf4, 0x3f, - 0x0a, 0x07, 0x93, 0xd2, 0x12, 0x1c, 0x11, 0xcd, 0x75, 0x12, 0x24, 0xb2, 0x7b, 0x0a, 0x89, 0x76, 0x9b, 0x23, 0xd5, - 0x1b, 0x90, 0xc6, 0xe4, 0x2d, 0x70, 0xc9, 0x37, 0x7e, 0xa8, 0x18, 0xb7, 0x28, 0x2d, 0x1f, 0x49, 0xca, 0xff, 0xf4, - 0x69, 0xd1, 0x39, 0xab, 0xd2, 0xef, 0x13, 0xb7, 0x03, 0xc7, 0x6e, 0x87, 0xb5, 0xb7, 0xda, 0x59, 0xed, 0x0e, 0x07, - 0x5c, 0x84, 0x0b, 0x15, 0xb6, 0x14, 0x42, 0x8b, 0xbb, 0xd1, 0xd8, 0xab, 0xa6, 0xc3, 0x85, 0x40, 0xca, 0x95, 0xab, - 0x8e, 0x6e, 0xf4, 0x23, 0xa1, 0x92, 0x8c, 0xb6, 0x84, 0x40, 0xe6, 0x77, 0x31, 0x1d, 0x50, 0xb3, 0x65, 0x1c, 0x3b, - 0x9c, 0x46, 0xff, 0xd7, 0x83, 0x40, 0x07, 0x2e, 0xd0, 0xa1, 0x56, 0x76, 0x6b, 0xc9, 0xa1, 0x47, 0x9e, 0xab, 0x74, - 0xa0, 0xb2, 0xf4, 0x4c, 0x87, 0x22, 0xc8, 0x6f, 0x85, 0x29, 0xed, 0xa4, 0x01, 0x99, 0x3c, 0x2d, 0x8a, 0x02, 0x33, - 0x80, 0x18, 0xe0, 0x2d, 0xe1, 0x4c, 0x66, 0x3c, 0x7d, 0xba, 0xf1, 0x10, 0x22, 0x85, 0xbd, 0x9a, 0xd9, 0x53, 0x57, - 0xe9, 0x9b, 0xae, 0x92, 0x18, 0x09, 0x17, 0xa9, 0x86, 0xb0, 0x7b, 0xa3, 0xb5, 0x87, 0x3f, 0x47, 0xcc, 0xcf, 0x6c, - 0xae, 0x69, 0x6a, 0x29, 0x87, 0xbb, 0xe9, 0xb2, 0x36, 0x58, 0xbc, 0xf1, 0x58, 0x67, 0x3c, 0x96, 0xe0, 0x93, 0xf5, - 0xc7, 0x15, 0xf7, 0xf4, 0x06, 0x18, 0x9f, 0x9d, 0x22, 0x3c, 0xcd, 0xbb, 0xcc, 0xa7, 0x18, 0x26, 0xea, 0x91, 0x1b, - 0x67, 0xbe, 0xc8, 0x23, 0x03, 0x7c, 0x79, 0xbf, 0x51, 0x25, 0xab, 0x78, 0x83, 0x9f, 0xbe, 0xbb, 0xf8, 0x4e, 0xe3, - 0xeb, 0x9f, 0x34, 0x88, 0x78, 0x91, 0xa1, 0xac, 0x07, 0x03, 0xca, 0x7a, 0xa0, 0xf1, 0x34, 0x22, 0x90, 0x3b, 0x20, - 0x3f, 0x20, 0x0c, 0xa2, 0x00, 0x9a, 0xf4, 0xaa, 0x8b, 0x55, 0x98, 0x05, 0x4b, 0x3f, 0xc9, 0x0e, 0xa0, 0xa9, 0x05, - 0x44, 0x4e, 0xdf, 0xe4, 0x23, 0x4e, 0xaa, 0x59, 0x11, 0x62, 0x2f, 0x8b, 0x84, 0x6e, 0x76, 0x1a, 0x84, 0x52, 0x35, - 0x2b, 0x3e, 0xe0, 0x8f, 0xc7, 0x6c, 0x99, 0x0d, 0x74, 0x7f, 0x09, 0xd9, 0x2f, 0x30, 0x9e, 0xf5, 0x41, 0x3c, 0xce, - 0x58, 0x66, 0xa5, 0x59, 0xc2, 0xfc, 0x85, 0x2e, 0x43, 0xb9, 0xd6, 0xe1, 0xa5, 0xab, 0xd1, 0x22, 0xc8, 0x64, 0x2c, - 0x44, 0x1a, 0x20, 0x28, 0x49, 0xa1, 0x8b, 0xa7, 0xc3, 0x9c, 0xa3, 0xf0, 0x3c, 0x9e, 0x55, 0x56, 0x54, 0xc1, 0xb9, - 0x9c, 0x61, 0xa4, 0x5d, 0x9e, 0xf1, 0x60, 0x82, 0x3e, 0x4f, 0xd7, 0xdc, 0xaf, 0x5d, 0x86, 0x6c, 0xd4, 0x4f, 0x4f, - 0xf8, 0xf5, 0x56, 0xc3, 0x50, 0x0c, 0x7a, 0xc7, 0x81, 0x58, 0xc2, 0x9b, 0x3c, 0xde, 0x0f, 0x78, 0x65, 0x38, 0x9a, - 0x08, 0x32, 0xc6, 0x79, 0xa7, 0xbe, 0x5c, 0x00, 0x23, 0x54, 0x52, 0xa2, 0xcf, 0xdd, 0x53, 0xe9, 0x62, 0x85, 0xbd, - 0x42, 0x5e, 0xe9, 0xf3, 0xe7, 0x97, 0xc3, 0xff, 0xfc, 0x1b, 0x82, 0xd1, 0xcf, 0x5d, 0xe1, 0x67, 0x7e, 0xa9, 0xd6, - 0xe2, 0xdc, 0xa7, 0x39, 0x44, 0x03, 0x0a, 0x36, 0x11, 0x81, 0x57, 0xc4, 0xd2, 0xca, 0x87, 0x57, 0x22, 0x98, 0x16, - 0x24, 0x9c, 0x30, 0x84, 0x37, 0xfc, 0x10, 0xa6, 0x77, 0x28, 0x82, 0x30, 0x68, 0xbf, 0xdd, 0x7d, 0x7f, 0x0c, 0xc1, - 0x96, 0x6b, 0x79, 0x20, 0x94, 0x0e, 0xe2, 0x1a, 0x3a, 0x3d, 0xf1, 0x35, 0x64, 0x5a, 0x90, 0xfd, 0x48, 0x7b, 0x07, - 0x30, 0xcc, 0x79, 0xbc, 0x60, 0x76, 0x10, 0x1f, 0xdc, 0xb2, 0x91, 0xe5, 0x2f, 0x03, 0xd2, 0xd5, 0xa3, 0xdc, 0x4d, - 0x23, 0xce, 0x4f, 0xaa, 0xc0, 0x89, 0xbf, 0xce, 0x0b, 0x54, 0xc6, 0xe5, 0xe8, 0x69, 0x1d, 0xaf, 0x50, 0xdc, 0x81, - 0x4f, 0xb3, 0x82, 0xc7, 0xf8, 0xf4, 0xe4, 0xc0, 0x3f, 0x2d, 0x87, 0x6f, 0xb4, 0x45, 0x02, 0x81, 0xf2, 0x21, 0x70, - 0x46, 0x51, 0x18, 0x45, 0xc0, 0xc5, 0xe2, 0xc1, 0x8a, 0xa7, 0x53, 0x35, 0xe4, 0xa2, 0x5d, 0xee, 0x9e, 0x44, 0x5a, - 0xb1, 0xa4, 0xe3, 0x25, 0x7d, 0xa9, 0xfe, 0x09, 0xf9, 0x13, 0x92, 0x27, 0xf3, 0xe8, 0x9c, 0xb0, 0xdd, 0x6b, 0xa1, - 0x1b, 0x25, 0xc6, 0x1e, 0x53, 0x25, 0x4e, 0x47, 0xaa, 0x81, 0xc2, 0x37, 0x70, 0x2e, 0x8f, 0x06, 0x03, 0x22, 0x73, - 0x55, 0x6a, 0x07, 0x48, 0x6c, 0x48, 0xa6, 0x00, 0x83, 0xcd, 0xa0, 0xa1, 0x45, 0x2e, 0x74, 0xd8, 0xa8, 0x3a, 0x9c, - 0x7a, 0x1f, 0x0f, 0x7c, 0xb1, 0xfc, 0x4a, 0x0b, 0x14, 0x16, 0x1e, 0x9f, 0x77, 0xa0, 0xef, 0x02, 0x4e, 0x85, 0xcc, - 0x6b, 0x7f, 0x25, 0x8a, 0x6e, 0x85, 0xfe, 0x7d, 0xac, 0x98, 0x36, 0xf0, 0x28, 0x07, 0xe7, 0x58, 0x7a, 0x21, 0xbc, - 0x0b, 0x6b, 0x1b, 0x4d, 0x06, 0xa4, 0xaf, 0x6f, 0x36, 0x35, 0x82, 0xfc, 0xae, 0xbd, 0xa6, 0xd6, 0x2d, 0x0f, 0x06, - 0x89, 0x67, 0x5e, 0xec, 0xc3, 0xd2, 0x4b, 0x24, 0x0b, 0xf9, 0xc9, 0x01, 0x8c, 0x0f, 0x22, 0x33, 0x94, 0x18, 0xa7, - 0xc0, 0x80, 0xf0, 0x0f, 0x7e, 0x4a, 0xe6, 0x19, 0x6f, 0x27, 0x82, 0xe7, 0xc3, 0x8b, 0xa5, 0x8c, 0x0d, 0x5b, 0xaa, - 0x52, 0xe7, 0x65, 0x9c, 0x66, 0x26, 0x70, 0x77, 0x02, 0x87, 0xdf, 0x57, 0x98, 0xbd, 0x21, 0xef, 0x67, 0x4c, 0x38, - 0x3e, 0x9f, 0x67, 0x1b, 0x7c, 0xa3, 0x37, 0x55, 0x21, 0x7e, 0x76, 0x4b, 0x85, 0x62, 0x1d, 0x6f, 0xab, 0x55, 0x70, - 0x4e, 0xb2, 0xda, 0xd2, 0x6f, 0xe9, 0x8f, 0x71, 0xc5, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0x3b, 0xcf, 0x06, 0x50, 0x55, - 0xc8, 0xe2, 0xfd, 0xe5, 0x92, 0x2a, 0x1b, 0xfd, 0x93, 0x03, 0xba, 0x96, 0x9e, 0xd2, 0x0a, 0x3b, 0x3d, 0x01, 0xf3, - 0x4e, 0x9a, 0x74, 0x7f, 0xb9, 0xe4, 0x53, 0x4a, 0xbf, 0xe8, 0xcd, 0xc1, 0x3c, 0x5b, 0x84, 0xa7, 0xff, 0x07, 0xc0, - 0xb1, 0x34, 0x8b, 0x20, 0x5c, 0x03, 0x00}; + 0x10, 0xc1, 0x11, 0x73, 0xdb, 0xae, 0x69, 0xb2, 0x36, 0xe8, 0x75, 0x92, 0xe5, 0x7c, 0x46, 0x35, 0x33, 0x70, 0x0e, + 0x48, 0x8d, 0x9b, 0x7c, 0xda, 0x6e, 0xcd, 0x6f, 0xf7, 0x5a, 0x7b, 0xf6, 0x4f, 0x55, 0x1a, 0xb6, 0x51, 0x50, 0xd8, + 0x37, 0xc9, 0x85, 0xc1, 0x0f, 0x03, 0x0e, 0xb3, 0x8b, 0xcc, 0xea, 0x99, 0xb5, 0x0b, 0x60, 0x07, 0xb3, 0xab, 0x35, + 0x75, 0xe9, 0xe8, 0x92, 0x6d, 0xf1, 0xb4, 0xf5, 0x43, 0x3d, 0x37, 0xa7, 0x43, 0x96, 0x2f, 0xed, 0x46, 0xf5, 0xc0, + 0x75, 0x5b, 0x35, 0x5c, 0xe6, 0x80, 0x64, 0x18, 0x10, 0x0d, 0xd2, 0xb4, 0x79, 0xc3, 0x86, 0x9f, 0xb9, 0xb6, 0x5b, + 0xa6, 0xa9, 0x6e, 0xc0, 0x79, 0xc7, 0x8c, 0x69, 0xce, 0x8a, 0xa5, 0x3f, 0x8e, 0x5a, 0x35, 0x02, 0x7a, 0x25, 0xcc, + 0x41, 0xa8, 0xe9, 0xb0, 0x09, 0xa1, 0xcc, 0x58, 0xb1, 0xdc, 0x35, 0xb9, 0xcd, 0x0d, 0x1f, 0x1e, 0x67, 0x27, 0xad, + 0x96, 0x3f, 0xea, 0x9a, 0xb6, 0x4e, 0xda, 0x4e, 0x4e, 0xd9, 0x6c, 0x17, 0xa9, 0xa9, 0xd3, 0xd5, 0x76, 0x67, 0x7e, + 0xbb, 0x67, 0xfe, 0x69, 0xed, 0xb5, 0xb6, 0xe9, 0xe8, 0xf6, 0x92, 0x1f, 0x23, 0x8f, 0xa4, 0x5a, 0xce, 0xd3, 0x36, + 0x9b, 0x75, 0x17, 0x0a, 0xce, 0x4c, 0x03, 0x4e, 0x73, 0x16, 0xaf, 0xcd, 0x4c, 0x00, 0x6a, 0x94, 0x0b, 0x38, 0xa2, + 0xec, 0x31, 0x0d, 0x7d, 0x28, 0x09, 0x36, 0xe5, 0x3b, 0x1b, 0xad, 0x0f, 0xab, 0xb5, 0x57, 0x0d, 0x0c, 0xfe, 0x59, + 0xff, 0x55, 0x31, 0xb9, 0x2f, 0x58, 0x20, 0x64, 0xf0, 0x46, 0x72, 0xba, 0x6a, 0x39, 0xc1, 0x62, 0xa4, 0x2b, 0x79, + 0xc7, 0xb8, 0x65, 0xcc, 0xe8, 0xad, 0xf5, 0xcf, 0x98, 0x71, 0x01, 0xd6, 0x5f, 0x08, 0xeb, 0xc0, 0x4e, 0x7e, 0x1a, + 0x36, 0x34, 0xd2, 0x31, 0x34, 0x7c, 0xd8, 0x49, 0x4e, 0x4f, 0x11, 0x6e, 0xe1, 0xce, 0xe9, 0x69, 0x20, 0xd8, 0x8c, + 0xf5, 0xae, 0xa2, 0xbb, 0x4a, 0xaa, 0x1d, 0x25, 0x8f, 0x4c, 0xa3, 0x47, 0xed, 0x56, 0x0b, 0x1b, 0x1f, 0xf4, 0xb2, + 0x30, 0x57, 0x3b, 0x9a, 0x6d, 0xb7, 0x5a, 0xd0, 0x2c, 0xfc, 0x71, 0xf3, 0xfa, 0x85, 0x2c, 0x5b, 0x69, 0x0b, 0xb7, + 0xd3, 0x36, 0xee, 0xa4, 0x1d, 0x7c, 0x9c, 0x1e, 0xe3, 0x93, 0xf4, 0x04, 0x9f, 0xa6, 0xa7, 0xf8, 0x2c, 0x3d, 0xc3, + 0xf7, 0xd3, 0xfb, 0xf8, 0x3c, 0x3d, 0xc7, 0x0f, 0xd2, 0x07, 0xf8, 0x61, 0xda, 0x6e, 0xe1, 0x47, 0x69, 0xbb, 0x8d, + 0x1f, 0xa7, 0xed, 0x0e, 0x7e, 0x92, 0xb6, 0x8f, 0xf1, 0xd3, 0xb4, 0x7d, 0x82, 0x9f, 0xa5, 0xed, 0x53, 0x4c, 0x21, + 0x77, 0x08, 0xb9, 0x19, 0xe4, 0x8e, 0x20, 0x97, 0x41, 0xee, 0x38, 0x6d, 0x9f, 0xae, 0xb1, 0xb2, 0x71, 0x2b, 0xa2, + 0x56, 0xbb, 0x73, 0x7c, 0x72, 0x7a, 0x76, 0xff, 0xfc, 0xc1, 0xc3, 0x47, 0x8f, 0x9f, 0x3c, 0x7d, 0x16, 0x0d, 0xf0, + 0xd0, 0xb8, 0x8f, 0x28, 0xd1, 0xe7, 0x07, 0xed, 0xd3, 0x01, 0xbe, 0xf6, 0x9f, 0x31, 0x3f, 0xe8, 0x9c, 0xb4, 0xd0, + 0xe5, 0xe5, 0xc9, 0xa0, 0x51, 0xe6, 0xbe, 0x37, 0x5e, 0x2b, 0x55, 0x16, 0x21, 0x24, 0x86, 0x1c, 0x84, 0xef, 0x4c, + 0xbd, 0xf7, 0x2c, 0xe6, 0x49, 0x81, 0x0e, 0x0e, 0xcc, 0x8f, 0x89, 0xff, 0x31, 0xf4, 0x3f, 0x68, 0xb0, 0x48, 0xb7, + 0x34, 0x76, 0x6e, 0xcb, 0xba, 0x74, 0x1a, 0x28, 0xed, 0x71, 0xf6, 0xb8, 0xb3, 0x8c, 0xff, 0xaf, 0xc8, 0x5a, 0xbe, + 0x90, 0x13, 0xab, 0x5d, 0x3a, 0xed, 0x31, 0xb2, 0x2c, 0xd2, 0xce, 0xe9, 0xe9, 0xc1, 0x2f, 0x7d, 0xde, 0x6f, 0x0f, + 0x06, 0x87, 0xed, 0xfb, 0x78, 0x52, 0x26, 0x74, 0x6c, 0xc2, 0xb0, 0x4c, 0x38, 0xb6, 0x09, 0x34, 0xb5, 0xb5, 0x21, + 0xe9, 0xc4, 0x24, 0x41, 0x89, 0x75, 0x6a, 0xda, 0xbe, 0x6f, 0xdb, 0x7e, 0x00, 0x26, 0x59, 0xa6, 0x79, 0xd7, 0xf4, + 0xc5, 0xc5, 0xc9, 0xca, 0x35, 0x8a, 0x27, 0xa9, 0x6b, 0xcd, 0x27, 0x9e, 0x0c, 0x06, 0x78, 0x68, 0x12, 0x4f, 0xab, + 0xc4, 0xb3, 0xc1, 0xc0, 0x75, 0xf5, 0xc0, 0x74, 0x75, 0xbf, 0xca, 0x3a, 0x1f, 0x0c, 0x4c, 0x97, 0xc8, 0x39, 0xe0, + 0x2b, 0xbd, 0xf7, 0xa5, 0x54, 0x82, 0xf0, 0x8b, 0xce, 0xe9, 0x69, 0x0f, 0x30, 0xcc, 0x18, 0xd6, 0x7a, 0x18, 0xdd, + 0x04, 0x30, 0xba, 0x83, 0xdf, 0xbd, 0x21, 0x4d, 0xaf, 0x69, 0x09, 0xa4, 0x5e, 0xf4, 0x5f, 0x51, 0x43, 0x1b, 0x98, + 0x9b, 0x3f, 0x13, 0xfb, 0x67, 0x88, 0x1a, 0x5f, 0x28, 0x80, 0x1b, 0xd4, 0x3a, 0x5e, 0x2f, 0x6b, 0x7a, 0xfc, 0x4c, + 0xc1, 0x4f, 0x66, 0xaa, 0x72, 0xda, 0x5b, 0x4d, 0x6f, 0x86, 0xab, 0xa9, 0xfa, 0x82, 0xfe, 0x8c, 0xff, 0x54, 0x87, + 0x71, 0xbf, 0xd9, 0x48, 0xd8, 0x9f, 0x23, 0x70, 0xc8, 0xe9, 0xa5, 0x23, 0x36, 0x41, 0xbd, 0xfe, 0x9f, 0x0a, 0x0f, + 0x1a, 0x41, 0xc6, 0x0f, 0xdb, 0x29, 0xe0, 0xae, 0xb3, 0x99, 0x18, 0xff, 0x80, 0x7a, 0xa8, 0xf7, 0xa7, 0x3a, 0xfc, + 0x13, 0xdd, 0x3b, 0xaa, 0xe6, 0xf2, 0xbb, 0x74, 0x5b, 0xb8, 0x8a, 0xe1, 0x73, 0x58, 0x6e, 0x61, 0x86, 0xdb, 0x4d, + 0x06, 0x11, 0xcf, 0xc0, 0x9f, 0x9b, 0xc4, 0xb2, 0xc1, 0x8f, 0x8e, 0x5b, 0xe8, 0x87, 0x76, 0x07, 0x34, 0x14, 0x4d, + 0x71, 0xb8, 0xbd, 0xe9, 0x8b, 0xe6, 0x31, 0x7e, 0xd0, 0x2c, 0x70, 0x1b, 0xe1, 0x66, 0xdb, 0xab, 0x8e, 0xfb, 0x2a, + 0x6e, 0x21, 0xac, 0xe2, 0x73, 0xf8, 0xe7, 0x04, 0x0d, 0xaa, 0x0d, 0x79, 0x45, 0x37, 0x7b, 0x07, 0xe7, 0x53, 0x12, + 0xab, 0x06, 0x3f, 0x3a, 0x6b, 0xa1, 0x1f, 0xce, 0x4c, 0x47, 0xec, 0x50, 0xef, 0xe8, 0x4a, 0xe2, 0x93, 0xa6, 0x84, + 0x8e, 0x5a, 0x65, 0x3f, 0x22, 0x3e, 0x45, 0x58, 0xc4, 0xc7, 0xf0, 0x4f, 0x3b, 0xec, 0xe7, 0xd7, 0xad, 0x7e, 0xcc, + 0xbc, 0xdb, 0x38, 0x39, 0xb5, 0xbe, 0xac, 0xca, 0x5e, 0x2c, 0x37, 0xd8, 0x65, 0xdb, 0xdc, 0x88, 0xb5, 0x8f, 0xe0, + 0x03, 0x61, 0x7d, 0x48, 0x14, 0x66, 0x87, 0xe0, 0x04, 0x0b, 0xb6, 0x1f, 0xea, 0xe2, 0xb8, 0xab, 0x1a, 0x0d, 0x24, + 0xfa, 0x6a, 0x70, 0x48, 0xda, 0x4d, 0xdd, 0x64, 0x18, 0x7e, 0x37, 0x48, 0x19, 0x59, 0x4d, 0x54, 0xbd, 0x3e, 0x76, + 0xbd, 0xda, 0xeb, 0x73, 0x8f, 0x1d, 0x84, 0x10, 0xd5, 0x8b, 0x75, 0x93, 0xa1, 0x23, 0xd1, 0x88, 0xf5, 0x05, 0xeb, + 0x9d, 0xa5, 0x2d, 0x64, 0xb0, 0x53, 0xf5, 0x62, 0xd6, 0xe4, 0x90, 0xde, 0x49, 0x63, 0xde, 0xd4, 0xf0, 0xeb, 0x24, + 0x98, 0x85, 0x00, 0xbc, 0xab, 0x5c, 0x7a, 0x8a, 0xa3, 0xce, 0xe9, 0x29, 0x16, 0x84, 0x27, 0x13, 0xf3, 0x4b, 0x11, + 0x9e, 0x0c, 0xcd, 0x2f, 0x49, 0x4a, 0x78, 0xd9, 0xde, 0x71, 0x41, 0x82, 0x55, 0x35, 0x29, 0x14, 0x16, 0xb4, 0x40, + 0x47, 0x1d, 0x7f, 0xb7, 0x8e, 0xa7, 0x7e, 0x0e, 0xa0, 0x4b, 0x28, 0x8c, 0x59, 0xa5, 0x6c, 0x16, 0x38, 0x27, 0xf4, + 0x32, 0x39, 0xed, 0x4d, 0x8f, 0xe2, 0x4e, 0x53, 0x36, 0x0b, 0x94, 0x4e, 0x8f, 0x4c, 0x4d, 0x9c, 0x91, 0xc7, 0xd4, + 0xb6, 0x86, 0xa7, 0x70, 0x21, 0x9a, 0x91, 0xec, 0xf0, 0xac, 0xd5, 0x48, 0x4e, 0x11, 0xee, 0x67, 0xab, 0x16, 0xce, + 0x57, 0xab, 0x16, 0xa6, 0xc1, 0x32, 0x3c, 0x16, 0x1e, 0x20, 0xa5, 0xba, 0x6b, 0x33, 0xc0, 0x4d, 0x8f, 0xc7, 0x1a, + 0x2e, 0xf7, 0x35, 0xb8, 0xcc, 0x68, 0x70, 0xe6, 0x49, 0xb9, 0xbb, 0x55, 0x43, 0x26, 0xc4, 0xdf, 0x38, 0x54, 0x80, + 0xbd, 0x16, 0x7e, 0x5d, 0xbd, 0x79, 0xa6, 0x88, 0x7f, 0x97, 0xd8, 0xa6, 0x05, 0xc5, 0xe8, 0x76, 0xb1, 0x5f, 0xe9, + 0x56, 0xb1, 0x37, 0x3b, 0x8a, 0x5d, 0x6d, 0x17, 0xfb, 0x28, 0x03, 0x75, 0x1d, 0xff, 0xe1, 0xf8, 0xac, 0xd5, 0x38, + 0x06, 0x64, 0x3d, 0x3e, 0x6b, 0x55, 0x85, 0xee, 0xd1, 0x6a, 0xad, 0x34, 0xf9, 0x4c, 0xad, 0xc3, 0x02, 0xf7, 0x9e, + 0xd3, 0x66, 0xe1, 0xac, 0xdf, 0x76, 0xe9, 0xa4, 0xdd, 0x3f, 0x05, 0x83, 0x10, 0x61, 0xa8, 0x9d, 0xee, 0x9f, 0x0d, + 0x7a, 0x53, 0x16, 0x37, 0x20, 0x15, 0xa5, 0x63, 0xed, 0x7e, 0xa1, 0xf2, 0x5e, 0xf8, 0xa3, 0x84, 0xa4, 0xce, 0x00, + 0x61, 0x49, 0x1a, 0xba, 0x7f, 0x3c, 0x30, 0xe7, 0x5d, 0x01, 0xbf, 0x4f, 0xcc, 0xef, 0x52, 0x2b, 0xe3, 0xbc, 0x1a, + 0xa6, 0x37, 0xc3, 0xa8, 0x27, 0xc8, 0x6b, 0x1a, 0x1b, 0x43, 0x75, 0x94, 0x96, 0x19, 0xea, 0x0b, 0x64, 0xbc, 0x29, + 0x33, 0x04, 0x79, 0x2d, 0xdc, 0x6f, 0xbc, 0x2c, 0x52, 0x30, 0x5a, 0xc1, 0x93, 0x14, 0x0c, 0x56, 0xf0, 0x30, 0x15, + 0xe0, 0x54, 0x41, 0x53, 0x16, 0x98, 0xc2, 0x3f, 0x74, 0x6a, 0x30, 0x73, 0x75, 0x4b, 0x0c, 0x96, 0x76, 0x19, 0x9c, + 0x14, 0x1f, 0x65, 0x0c, 0x7f, 0x1b, 0x1a, 0x61, 0x06, 0x6d, 0x32, 0x84, 0x79, 0x52, 0x10, 0x48, 0xc3, 0x3c, 0x99, + 0x10, 0x06, 0x4d, 0xf2, 0x64, 0x48, 0x58, 0xbf, 0x13, 0xa0, 0xc9, 0x53, 0x03, 0x3b, 0x00, 0x0e, 0xaf, 0xdf, 0x86, + 0x6b, 0xdb, 0x38, 0x5c, 0xb3, 0x43, 0x13, 0x82, 0x70, 0x15, 0xc3, 0x2c, 0x60, 0x73, 0x9a, 0x9f, 0x9d, 0x2a, 0x86, + 0x24, 0x4f, 0xa8, 0xa1, 0xde, 0x7f, 0x01, 0x59, 0x8d, 0xef, 0x2d, 0xd9, 0x1a, 0xef, 0xdd, 0x5b, 0x8a, 0xf5, 0x0f, + 0xf0, 0x47, 0xb9, 0x3f, 0xda, 0x9c, 0x7e, 0x6b, 0xf4, 0x57, 0x0a, 0xc5, 0x76, 0x94, 0x42, 0x7f, 0x79, 0x9f, 0x3a, + 0x45, 0x96, 0xb7, 0x69, 0x34, 0xa2, 0xc5, 0xe7, 0x08, 0x7f, 0x4a, 0xa3, 0x1c, 0x18, 0xc1, 0x08, 0x7f, 0x4c, 0xa3, + 0x82, 0x45, 0xf8, 0x8f, 0x34, 0x1a, 0xe6, 0x8b, 0x08, 0x7f, 0x48, 0xa3, 0x49, 0x11, 0xe1, 0xf7, 0xa0, 0xf1, 0x1c, + 0xf1, 0xc5, 0x2c, 0xc2, 0xbf, 0xa7, 0x91, 0x32, 0x2e, 0x05, 0xf8, 0x61, 0x1a, 0x31, 0x16, 0xe1, 0x77, 0x69, 0x24, + 0xf3, 0x08, 0x5f, 0xa5, 0x91, 0x2c, 0x22, 0xfc, 0x28, 0x8d, 0x0a, 0x1a, 0xe1, 0xc7, 0x69, 0x04, 0x85, 0x26, 0x11, + 0x7e, 0x92, 0x46, 0xd0, 0xb2, 0x8a, 0xf0, 0xdb, 0x34, 0xe2, 0x22, 0xc2, 0xbf, 0xa5, 0x91, 0x5e, 0x14, 0xff, 0x2c, + 0x24, 0x57, 0x11, 0x7e, 0x9a, 0x46, 0x53, 0x1e, 0xe1, 0x37, 0x69, 0x54, 0xc8, 0x08, 0xbf, 0x4e, 0x23, 0x9a, 0x47, + 0xf8, 0x55, 0x1a, 0xe5, 0x2c, 0xc2, 0xbf, 0xa6, 0xd1, 0x88, 0x45, 0xf8, 0x65, 0x1a, 0xdd, 0xb1, 0x3c, 0x97, 0x11, + 0x7e, 0x96, 0x46, 0x4c, 0x44, 0xf8, 0x97, 0x34, 0xca, 0xa6, 0x11, 0xfe, 0x29, 0x8d, 0x68, 0xf1, 0x59, 0x45, 0xf8, + 0x79, 0x1a, 0x31, 0x1a, 0xe1, 0x17, 0xb6, 0xa3, 0x49, 0x84, 0x7f, 0x4e, 0xa3, 0x9b, 0x69, 0xb4, 0xc6, 0x4a, 0x91, + 0xe5, 0x6b, 0x9e, 0xb1, 0x3f, 0x58, 0x1a, 0x8d, 0x5b, 0xe3, 0xf3, 0xf1, 0x38, 0xc2, 0x54, 0x68, 0xfe, 0xcf, 0x82, + 0xdd, 0x3c, 0xd5, 0x90, 0x48, 0xd9, 0x70, 0x74, 0x3f, 0xc2, 0xf4, 0x9f, 0x05, 0x4d, 0xa3, 0xf1, 0xd8, 0x14, 0xf8, + 0x67, 0x41, 0x67, 0xb4, 0x78, 0xcb, 0xd2, 0xe8, 0xfe, 0x78, 0x3c, 0x1e, 0x9d, 0x44, 0x98, 0x7e, 0x5d, 0x7c, 0x34, + 0x2d, 0x98, 0x02, 0x43, 0xc6, 0x27, 0x50, 0xf7, 0x74, 0x7c, 0x3a, 0xca, 0x22, 0x3c, 0xe4, 0xea, 0x9f, 0x05, 0x7c, + 0x8f, 0xd9, 0x49, 0x76, 0x12, 0xe1, 0x61, 0x4e, 0xb3, 0xcf, 0x69, 0xd4, 0x32, 0xbf, 0xc4, 0x2f, 0x6c, 0xf4, 0x7a, + 0x26, 0xcd, 0x7d, 0xc0, 0x98, 0x0d, 0xb3, 0x51, 0x84, 0xcd, 0x60, 0xc6, 0xf0, 0xf7, 0x0b, 0x7f, 0xc7, 0x74, 0x1a, + 0x9d, 0xd3, 0xce, 0x90, 0x75, 0x22, 0x3c, 0x7c, 0x73, 0x23, 0xd2, 0x88, 0x9e, 0x76, 0x68, 0x87, 0x46, 0x78, 0xb8, + 0x28, 0xf2, 0xbb, 0x1b, 0x29, 0x47, 0x00, 0x84, 0xe1, 0xf9, 0xf9, 0xfd, 0x08, 0x67, 0xf4, 0x57, 0x0d, 0xb5, 0x4f, + 0xc7, 0x0f, 0x18, 0x6d, 0x45, 0xf8, 0x17, 0x5a, 0xe8, 0x8f, 0x0b, 0xe5, 0x06, 0xda, 0x82, 0x14, 0x99, 0xbd, 0x03, + 0x5d, 0x79, 0x34, 0xea, 0x9c, 0x3d, 0x68, 0xb3, 0x08, 0x67, 0x57, 0xaf, 0xa1, 0xb7, 0xfb, 0xe3, 0xd3, 0x16, 0x7c, + 0x08, 0x10, 0x3a, 0x59, 0x01, 0x8d, 0x9c, 0x9d, 0x3c, 0x38, 0x65, 0x23, 0x93, 0xa8, 0x78, 0xfe, 0xd9, 0xcc, 0xfe, + 0x1c, 0xe6, 0x93, 0x15, 0x7c, 0xa6, 0xa4, 0x48, 0xa3, 0x51, 0xd6, 0x3e, 0x39, 0x86, 0x84, 0x3b, 0x2a, 0x3c, 0x70, + 0x6e, 0xa1, 0xea, 0xf9, 0x30, 0xc2, 0xb7, 0x36, 0xf5, 0x7c, 0x68, 0x3e, 0x26, 0xef, 0x7e, 0x15, 0x6f, 0x46, 0x69, + 0x34, 0x3c, 0x3f, 0x3f, 0x6b, 0x41, 0xc2, 0x07, 0x7a, 0x97, 0x46, 0xf4, 0x01, 0xfc, 0x07, 0xd9, 0x1f, 0x9f, 0x41, + 0x87, 0x30, 0xc2, 0xdb, 0xc9, 0xc7, 0x30, 0xe7, 0xf3, 0x94, 0x7e, 0xe6, 0x69, 0x34, 0x1c, 0x0d, 0xef, 0x9f, 0x41, + 0xbd, 0x19, 0x9d, 0x3c, 0xd3, 0x14, 0xda, 0x6d, 0xb5, 0x4c, 0xcb, 0xef, 0xf8, 0x17, 0x66, 0xaa, 0x9f, 0x9e, 0x9e, + 0x0d, 0x3b, 0x30, 0x82, 0x2b, 0xd0, 0x96, 0xc0, 0x78, 0xce, 0x33, 0xd3, 0xe0, 0x55, 0xf6, 0x74, 0x94, 0x46, 0x0f, + 0x1e, 0x1c, 0x77, 0xb2, 0x2c, 0xc2, 0xb7, 0x1f, 0x47, 0xb6, 0xb6, 0xc9, 0x53, 0x00, 0xfb, 0x34, 0x62, 0x0f, 0x1e, + 0x9c, 0xdd, 0xa7, 0xf0, 0xfd, 0xdc, 0xb4, 0x75, 0x3e, 0x1e, 0x66, 0xe7, 0xd0, 0xd6, 0xef, 0x30, 0x9d, 0x93, 0xf3, + 0xe3, 0x91, 0xe9, 0xeb, 0x77, 0x33, 0xea, 0xce, 0xf8, 0x64, 0x7c, 0x62, 0x32, 0xcd, 0x50, 0xcb, 0xcf, 0xdf, 0x58, + 0x1a, 0x65, 0x6c, 0xd4, 0x8e, 0xf0, 0xad, 0x5b, 0xb8, 0x07, 0x27, 0xad, 0xd6, 0xe8, 0x38, 0xc2, 0xa3, 0x87, 0xf3, + 0xf9, 0x5b, 0x03, 0xc1, 0xf6, 0xc9, 0x03, 0xfb, 0xad, 0x3e, 0xdf, 0x41, 0xd3, 0x43, 0x03, 0xb4, 0x11, 0x9f, 0x99, + 0x96, 0xcf, 0x1e, 0xc0, 0x7f, 0xe6, 0xdb, 0x34, 0x5d, 0x7e, 0xcb, 0xd1, 0xc4, 0x2e, 0x4a, 0x9b, 0x3d, 0x68, 0x41, + 0x8d, 0x31, 0xff, 0x38, 0x2c, 0x38, 0xa0, 0xd1, 0xb0, 0x03, 0xff, 0x17, 0xe1, 0x71, 0x7e, 0xf5, 0xda, 0xe1, 0xec, + 0x78, 0x4c, 0xc7, 0xad, 0x08, 0x8f, 0xe5, 0x47, 0xa5, 0x3f, 0x3c, 0x14, 0x69, 0xd4, 0xe9, 0x9c, 0x0f, 0x4d, 0x99, + 0xc5, 0x2f, 0x8a, 0x1b, 0x3c, 0x6e, 0x99, 0x56, 0x26, 0xf4, 0xad, 0x1a, 0x5e, 0x49, 0x58, 0x49, 0xf8, 0x2f, 0xc2, + 0x13, 0x50, 0xb1, 0xb9, 0x56, 0xce, 0xed, 0x76, 0x98, 0xbc, 0x33, 0xa8, 0x39, 0xba, 0x0f, 0xf0, 0xf2, 0xcb, 0x38, + 0xa2, 0xf4, 0xb4, 0xd3, 0x8a, 0xb0, 0x19, 0xf5, 0x79, 0x0b, 0xfe, 0x8b, 0xb0, 0x85, 0x9c, 0x81, 0xeb, 0xe4, 0xe3, + 0xb3, 0x97, 0x37, 0x69, 0x44, 0x47, 0xe3, 0x31, 0x2c, 0x89, 0x99, 0x8c, 0x2f, 0x36, 0x95, 0x82, 0xdd, 0xfd, 0x7a, + 0xe3, 0xb6, 0x8b, 0x49, 0xd0, 0x0e, 0x3a, 0x67, 0x0f, 0x86, 0x27, 0x11, 0x7e, 0x3b, 0xe2, 0x54, 0xc0, 0x2a, 0x65, + 0xa3, 0xd3, 0xec, 0x34, 0x33, 0x09, 0x13, 0x99, 0x46, 0x27, 0xb0, 0xe4, 0x9d, 0x08, 0xf3, 0x2f, 0x57, 0x77, 0x16, + 0xdd, 0xa0, 0xb6, 0x43, 0x90, 0x71, 0x8b, 0x9d, 0x9d, 0x67, 0x11, 0xce, 0xe9, 0x97, 0x67, 0xbf, 0x16, 0x69, 0xc4, + 0xce, 0xd8, 0xd9, 0x98, 0xfa, 0xef, 0x3f, 0xd4, 0xd4, 0xd4, 0x68, 0x8d, 0x4f, 0x21, 0xe9, 0x46, 0x98, 0xb1, 0xde, + 0xcf, 0xc6, 0x06, 0x43, 0x5e, 0xcd, 0xa4, 0xc8, 0x9e, 0x8e, 0xc7, 0xd2, 0x62, 0x31, 0x85, 0x4d, 0xf8, 0x09, 0xa0, + 0x4d, 0x47, 0xa3, 0x73, 0x76, 0x16, 0xe1, 0x4f, 0x76, 0x97, 0xb8, 0x09, 0x7c, 0xb2, 0x98, 0xcd, 0xdc, 0x6e, 0xff, + 0x64, 0x81, 0x02, 0xf3, 0x1d, 0xd3, 0x31, 0x1d, 0x75, 0x22, 0xfc, 0xc9, 0xc0, 0x65, 0x74, 0x0c, 0xff, 0x41, 0x01, + 0xe8, 0xec, 0x41, 0x8b, 0xb1, 0x07, 0x2d, 0xf3, 0x15, 0xe6, 0xb9, 0x99, 0x0f, 0xcf, 0xb2, 0x76, 0x84, 0x3f, 0x39, + 0x74, 0x1c, 0x8f, 0x69, 0x0b, 0xd0, 0xf1, 0x93, 0x43, 0xc7, 0x4e, 0x6b, 0xd8, 0xa1, 0xe6, 0xdb, 0x62, 0xcd, 0xf9, + 0xfd, 0x8c, 0xc1, 0xe4, 0x3e, 0x59, 0x84, 0xbc, 0x7f, 0xff, 0xfc, 0xfc, 0xc1, 0x03, 0xf8, 0x34, 0x6d, 0x97, 0x9f, + 0x4a, 0x3f, 0xcc, 0x0d, 0x92, 0xb5, 0xb2, 0x13, 0xa0, 0x93, 0x9f, 0xcc, 0x18, 0xc7, 0xe3, 0x31, 0x6b, 0x45, 0x38, + 0xe7, 0x33, 0x66, 0x31, 0xc1, 0xfe, 0x36, 0x1d, 0x1d, 0x77, 0xb2, 0xd1, 0x71, 0x27, 0xc2, 0xf9, 0xdb, 0x67, 0x66, + 0x36, 0x2d, 0x98, 0xbd, 0xdf, 0x72, 0x1e, 0x6b, 0x66, 0xf4, 0x0d, 0x0c, 0x12, 0x56, 0x1a, 0x2a, 0xbf, 0x0f, 0xe8, + 0xe1, 0xd9, 0x59, 0x36, 0x82, 0x81, 0xbe, 0x87, 0x6e, 0x01, 0x8c, 0xef, 0xed, 0xe6, 0x1b, 0xd2, 0xd3, 0x53, 0x98, + 0xee, 0xfb, 0xf9, 0xa2, 0x98, 0xbf, 0x4a, 0xa3, 0x07, 0xc7, 0xf7, 0x5b, 0xa3, 0x61, 0x84, 0xdf, 0xbb, 0x09, 0x1e, + 0x67, 0xc3, 0xe3, 0xfb, 0xed, 0x08, 0xbf, 0x37, 0xfb, 0xed, 0xfe, 0xf0, 0xec, 0x1c, 0xce, 0x8d, 0xf7, 0x6a, 0x5e, + 0xbc, 0x9d, 0x98, 0x02, 0x63, 0xfa, 0x00, 0x9a, 0xfd, 0xcd, 0xec, 0xc6, 0x51, 0x1b, 0x36, 0xf2, 0x7b, 0xb3, 0xc9, + 0x0c, 0x9e, 0xdc, 0x6f, 0x9f, 0x9e, 0x9f, 0x46, 0x78, 0xc6, 0x47, 0x02, 0x08, 0xbc, 0xd9, 0x28, 0x0f, 0xda, 0x0f, + 0xee, 0xb7, 0x22, 0x3c, 0x7b, 0xab, 0xb3, 0x8f, 0x74, 0x66, 0xa8, 0xf1, 0x18, 0x60, 0x36, 0xe3, 0x4a, 0xdf, 0xbd, + 0x51, 0x8e, 0x1e, 0xb3, 0x76, 0x84, 0x67, 0x32, 0xcb, 0xa8, 0x7a, 0x6b, 0x13, 0x86, 0xa7, 0x11, 0x16, 0xf4, 0x0b, + 0xfd, 0x5b, 0xfa, 0xcd, 0x34, 0x62, 0x74, 0x64, 0xd2, 0x0c, 0x0e, 0x47, 0xf8, 0xdd, 0x08, 0x6e, 0xf4, 0xd2, 0x68, + 0x3c, 0x1a, 0x9f, 0x02, 0x78, 0x80, 0x00, 0x59, 0xec, 0x06, 0x68, 0xc0, 0xd7, 0xe8, 0xd1, 0x30, 0x8d, 0xce, 0x86, + 0xe7, 0xac, 0x73, 0x1c, 0xe1, 0x92, 0x1a, 0xd1, 0x53, 0xc8, 0x37, 0x9f, 0x1f, 0xcd, 0x96, 0x3a, 0xb1, 0x09, 0x06, + 0x40, 0x23, 0x7a, 0xbf, 0x35, 0x3a, 0x8b, 0xf0, 0xfc, 0x35, 0xf3, 0x7b, 0x8c, 0x31, 0x76, 0x0e, 0xb0, 0x84, 0x24, + 0x83, 0x40, 0xe7, 0xe3, 0xe1, 0x83, 0x73, 0xf3, 0x0d, 0x60, 0xa0, 0x63, 0xc6, 0x00, 0x48, 0xf3, 0xd7, 0xac, 0x04, + 0xc4, 0x68, 0x78, 0xbf, 0x05, 0xf4, 0x65, 0x4e, 0xe7, 0xf4, 0x8e, 0xde, 0x3c, 0x9d, 0x9b, 0x39, 0x8d, 0x47, 0xa7, + 0x11, 0x9e, 0x3f, 0xff, 0x65, 0xbe, 0x18, 0x8f, 0xcd, 0x84, 0xe8, 0xf0, 0x41, 0x84, 0xe7, 0xac, 0x58, 0xc0, 0x1a, + 0x9d, 0x9f, 0x1e, 0x8f, 0x23, 0xec, 0xd0, 0x30, 0x6b, 0x65, 0x43, 0xb8, 0xb2, 0x5c, 0xcc, 0xd2, 0x68, 0x34, 0xa2, + 0xad, 0x11, 0x5c, 0x60, 0xca, 0x9b, 0x5f, 0x0b, 0x8b, 0x46, 0xcc, 0xe0, 0x83, 0x5b, 0x43, 0x98, 0x2f, 0xc0, 0xe3, + 0xe3, 0x90, 0x65, 0x19, 0x75, 0x89, 0x67, 0x67, 0xc7, 0xc7, 0x80, 0x7b, 0x76, 0x86, 0x16, 0x41, 0xde, 0xa8, 0xbb, + 0x61, 0x21, 0xe1, 0xe8, 0x02, 0xa2, 0x0a, 0x64, 0xf5, 0xcd, 0xdd, 0x6b, 0x43, 0x57, 0xdb, 0x67, 0x0f, 0x60, 0x01, + 0x14, 0x1d, 0x8d, 0x5e, 0xd9, 0xc3, 0xed, 0x7c, 0x78, 0x72, 0xda, 0x3e, 0x8e, 0xb0, 0xdf, 0x08, 0xf4, 0xbc, 0x75, + 0xbf, 0x03, 0x25, 0xc4, 0xe8, 0xce, 0x96, 0x18, 0x9f, 0xd0, 0x93, 0xb3, 0x56, 0x84, 0xfd, 0xd6, 0x60, 0xe7, 0xc3, + 0xd3, 0xfb, 0xf0, 0xa9, 0xa6, 0x2c, 0xcf, 0x0d, 0x7e, 0x9f, 0x02, 0x5c, 0x14, 0x7f, 0x26, 0x68, 0x1a, 0xd1, 0xd6, + 0x69, 0xa7, 0x33, 0x82, 0xcf, 0xfc, 0x0b, 0x2b, 0xd2, 0x28, 0x6b, 0xc1, 0x7f, 0x11, 0x0e, 0x76, 0x12, 0x1b, 0x46, + 0xd8, 0xe0, 0xdd, 0x19, 0x3d, 0x35, 0x7b, 0xdf, 0xed, 0xaa, 0xd6, 0x79, 0x0b, 0x36, 0xac, 0xdb, 0x54, 0xee, 0x4b, + 0x09, 0x79, 0xe3, 0x48, 0x2c, 0x8d, 0x70, 0x80, 0xa0, 0xe3, 0xfb, 0xe3, 0x08, 0xfb, 0x1d, 0x77, 0x72, 0x76, 0xde, + 0x01, 0x52, 0xa6, 0x81, 0x50, 0x8c, 0x3a, 0xc3, 0x13, 0x20, 0x4d, 0x9a, 0xbd, 0xb6, 0x78, 0x12, 0x61, 0xfd, 0x54, + 0xe9, 0x57, 0x69, 0x34, 0x3a, 0x1f, 0x8e, 0x47, 0xe7, 0x11, 0xd6, 0x72, 0x46, 0xb5, 0x34, 0x14, 0xf0, 0xf8, 0xe4, + 0x7e, 0x84, 0x0d, 0x9a, 0xb7, 0x58, 0x6b, 0xd4, 0x8a, 0xb0, 0x3b, 0x4a, 0x18, 0x3b, 0xef, 0xc0, 0xb4, 0x7e, 0x7e, + 0xae, 0x01, 0x97, 0x47, 0x6c, 0x78, 0x1c, 0xe1, 0x92, 0xde, 0x1b, 0x42, 0x04, 0x5f, 0x6a, 0x26, 0x3f, 0x3b, 0xd6, + 0x03, 0x48, 0x9d, 0xdf, 0xf0, 0xb0, 0x0c, 0x2f, 0x6f, 0x2c, 0x1a, 0x51, 0xb3, 0xc5, 0x83, 0x2b, 0xdd, 0x27, 0x34, + 0xf6, 0x6c, 0x3b, 0x27, 0xcb, 0x35, 0x2e, 0x23, 0xa5, 0x7e, 0x66, 0x77, 0x2a, 0x56, 0xca, 0x70, 0xb2, 0x41, 0x0a, + 0x78, 0x33, 0x38, 0xdf, 0x00, 0xe7, 0xfe, 0x09, 0x82, 0xa4, 0x20, 0xad, 0xae, 0xb8, 0xf0, 0x2e, 0xa9, 0x5d, 0x01, + 0xf1, 0x13, 0x20, 0xbd, 0x20, 0x94, 0x68, 0x08, 0x33, 0x63, 0x85, 0x49, 0x6f, 0xa9, 0x6f, 0x64, 0x4a, 0x69, 0x6d, + 0xff, 0x29, 0xa1, 0x3e, 0xc0, 0x3c, 0xdc, 0x37, 0x43, 0x08, 0x26, 0xd4, 0x95, 0xc4, 0x84, 0x8b, 0x7e, 0x21, 0x74, + 0xac, 0x54, 0xbf, 0x18, 0xe0, 0xf6, 0x19, 0xc2, 0x10, 0x88, 0x81, 0xf4, 0xe5, 0xe5, 0x65, 0xfb, 0xec, 0xc0, 0x08, + 0x7d, 0x97, 0x97, 0xe7, 0xf6, 0x07, 0xfc, 0x3b, 0xa8, 0x82, 0x5f, 0xc3, 0xf8, 0x1e, 0xb1, 0x40, 0xa3, 0x67, 0xf8, + 0xeb, 0x47, 0x6c, 0xb5, 0x8a, 0x1f, 0x31, 0x02, 0x33, 0xc6, 0x8f, 0x58, 0x62, 0x2e, 0x40, 0xac, 0x9b, 0x0d, 0xe9, + 0x83, 0xe6, 0xac, 0x85, 0x21, 0x24, 0xbb, 0xe7, 0xbc, 0x1f, 0xb1, 0x3e, 0xaf, 0xbb, 0x68, 0x57, 0x71, 0x90, 0x0f, + 0x0e, 0x96, 0x45, 0xaa, 0xad, 0x98, 0xa0, 0xad, 0x98, 0xa0, 0xad, 0x98, 0xa0, 0xab, 0x48, 0xf4, 0x27, 0x3d, 0x90, + 0x52, 0x8c, 0xb2, 0xc5, 0xf1, 0xd4, 0xef, 0x40, 0xed, 0x01, 0xda, 0xc9, 0x5e, 0xa5, 0xec, 0x28, 0x75, 0x15, 0x3b, + 0x15, 0x18, 0x3b, 0x13, 0x9d, 0xb6, 0xe3, 0xe8, 0xdf, 0x51, 0x77, 0xbc, 0xac, 0x89, 0x65, 0xef, 0x76, 0x8a, 0x65, + 0xb0, 0x92, 0x46, 0x34, 0xdb, 0xb7, 0x41, 0x3d, 0x74, 0xff, 0xbe, 0x11, 0xcc, 0xaa, 0x48, 0x73, 0x0d, 0x48, 0xea, + 0x82, 0x14, 0x72, 0x6e, 0xa4, 0xb4, 0x02, 0xa5, 0x23, 0x1d, 0x17, 0xa0, 0xa1, 0xf4, 0x0a, 0xca, 0x32, 0x20, 0x6a, + 0xc3, 0x00, 0x44, 0x59, 0x19, 0xcd, 0xca, 0x6a, 0xa7, 0x20, 0xba, 0x80, 0x26, 0xcc, 0x48, 0x2c, 0xd0, 0x80, 0x30, + 0x0d, 0x08, 0x57, 0x19, 0xc4, 0x19, 0x97, 0x7d, 0x62, 0xb2, 0x95, 0xc9, 0x56, 0x65, 0xb6, 0xf4, 0xd9, 0x56, 0x48, + 0x94, 0x26, 0x5b, 0x96, 0xd9, 0x20, 0xb3, 0xe1, 0x49, 0xaa, 0xf0, 0x30, 0x95, 0x56, 0x54, 0xab, 0x64, 0xab, 0xb7, + 0x34, 0xd4, 0xe6, 0x1e, 0x1c, 0xc4, 0xa5, 0x9c, 0x64, 0xd4, 0xc4, 0xf7, 0x96, 0x3c, 0x29, 0x8c, 0x0c, 0xc4, 0x93, + 0x89, 0xfb, 0x3b, 0x5c, 0x6f, 0xca, 0x4a, 0xc5, 0x64, 0xf8, 0x8d, 0x92, 0xe8, 0x2f, 0xaf, 0x44, 0x7d, 0xc4, 0x4d, + 0x28, 0x9d, 0x0b, 0x92, 0xb4, 0x5a, 0xc7, 0xed, 0xe3, 0xd6, 0x79, 0x8f, 0x1f, 0xb6, 0x3b, 0xc9, 0x83, 0x4e, 0x6a, + 0x14, 0x11, 0x73, 0x79, 0x03, 0x0a, 0x98, 0xa3, 0x4e, 0x72, 0x82, 0x0e, 0xdb, 0x49, 0xeb, 0xf4, 0xb4, 0x09, 0xff, + 0xe0, 0xf7, 0xba, 0xac, 0x76, 0xd2, 0x3a, 0x39, 0xed, 0xf1, 0xa3, 0x8d, 0x4a, 0x31, 0x6f, 0x40, 0x41, 0x74, 0x64, + 0x2a, 0x61, 0xa8, 0x5f, 0x2d, 0xef, 0xb3, 0x2d, 0x3d, 0xcf, 0x7b, 0x1d, 0x2b, 0xab, 0x8a, 0x03, 0xa8, 0xfa, 0xaf, + 0x89, 0x01, 0xa2, 0xff, 0x1a, 0x96, 0xe1, 0x6e, 0x97, 0x05, 0x88, 0xda, 0x8f, 0x78, 0x2c, 0x1a, 0xec, 0x30, 0xb6, + 0xf9, 0x1a, 0xea, 0x36, 0x21, 0x04, 0x1d, 0x9e, 0xb8, 0x5c, 0x15, 0xe6, 0x4e, 0x10, 0x6a, 0x2a, 0xc8, 0x1d, 0xba, + 0x5c, 0x19, 0xe6, 0x0e, 0x11, 0x6a, 0x4a, 0xc8, 0xa5, 0x29, 0x4f, 0x28, 0xe4, 0xe8, 0x84, 0x36, 0x0d, 0x24, 0xab, + 0x45, 0x79, 0xce, 0xfc, 0xb0, 0xf9, 0x18, 0x96, 0xc7, 0x10, 0x14, 0x27, 0x48, 0x0b, 0x78, 0xa6, 0xa4, 0xd4, 0xe6, + 0xb4, 0x70, 0xa9, 0xc6, 0x81, 0x8c, 0x06, 0xfc, 0x73, 0xc8, 0xcc, 0xdb, 0x15, 0xad, 0xde, 0xf1, 0x59, 0x2b, 0x6d, + 0x83, 0xbf, 0x35, 0xc8, 0xda, 0xc2, 0xca, 0xda, 0xc2, 0xcb, 0xda, 0xc2, 0xcb, 0xda, 0x20, 0xc0, 0x07, 0x7d, 0xff, + 0x23, 0x6b, 0x36, 0x2c, 0xbc, 0x34, 0x88, 0xb1, 0x16, 0x0f, 0xb1, 0x5e, 0xad, 0x96, 0x6b, 0x30, 0x57, 0x2a, 0x6b, + 0x48, 0x55, 0xa9, 0x3f, 0x97, 0x45, 0xda, 0xc2, 0x93, 0x14, 0xb4, 0xdc, 0x2d, 0x4c, 0xcd, 0xe6, 0xf6, 0x54, 0x61, + 0x33, 0x14, 0x4e, 0xcf, 0xab, 0x93, 0x2f, 0xc9, 0xb1, 0xd1, 0x1e, 0x2f, 0x8b, 0x94, 0x5b, 0x9a, 0xc1, 0x2d, 0xcd, + 0xe0, 0x96, 0x66, 0x40, 0x23, 0xb8, 0x2c, 0x6c, 0xca, 0x26, 0x94, 0xc0, 0x95, 0x40, 0xff, 0x78, 0x00, 0x91, 0x00, + 0x63, 0x4d, 0xcc, 0xa8, 0x37, 0x3a, 0x6f, 0x43, 0xe4, 0x33, 0x5b, 0x52, 0x27, 0xd4, 0x38, 0x80, 0x97, 0x63, 0xfe, + 0x5a, 0x43, 0xfb, 0x04, 0x9e, 0xa5, 0x79, 0xa8, 0xe3, 0x16, 0xd8, 0x7f, 0x44, 0x45, 0xd4, 0x33, 0x64, 0x21, 0x35, + 0x3a, 0x1b, 0x67, 0xd7, 0xfd, 0x79, 0xc3, 0x9d, 0xd6, 0x52, 0x82, 0xf0, 0x31, 0x86, 0xcf, 0xac, 0xf2, 0xef, 0x2f, + 0xcd, 0x56, 0x9d, 0xcd, 0x99, 0x3d, 0x12, 0xba, 0x60, 0x7b, 0xee, 0x03, 0x47, 0xf5, 0x04, 0x91, 0xca, 0x78, 0x3e, + 0x92, 0x2a, 0xf4, 0x31, 0x78, 0x02, 0x93, 0x5b, 0x6a, 0xfc, 0x62, 0x5e, 0xd8, 0x3f, 0x5f, 0x69, 0xe0, 0x38, 0x58, + 0x4c, 0x86, 0xde, 0xdf, 0xf6, 0xda, 0x04, 0x08, 0x22, 0xfb, 0xfb, 0xd6, 0x2c, 0xdc, 0x7c, 0x6d, 0xda, 0x85, 0x9b, + 0x44, 0x93, 0x0d, 0x3b, 0xd4, 0xaf, 0xd1, 0x3f, 0xde, 0xed, 0xad, 0x98, 0x0c, 0x51, 0x40, 0xb3, 0x0d, 0x58, 0x55, + 0x05, 0x2c, 0xe5, 0xea, 0x95, 0xde, 0x90, 0xd0, 0xbb, 0x19, 0xf3, 0xba, 0x98, 0x0c, 0x77, 0xbe, 0x5f, 0x62, 0x7b, + 0xec, 0xbd, 0xa5, 0x41, 0x0f, 0x5e, 0xb5, 0x3d, 0x65, 0xb7, 0xdf, 0xab, 0x73, 0xb3, 0xb3, 0x8e, 0xca, 0xbf, 0x57, + 0xe7, 0xe9, 0xae, 0x3a, 0x33, 0x7e, 0x1b, 0xfb, 0xbd, 0xa3, 0x03, 0x35, 0xb6, 0xb1, 0x35, 0x9a, 0x0c, 0x21, 0xe0, + 0x3c, 0xfc, 0xb5, 0x61, 0x61, 0xba, 0x9e, 0x84, 0xc3, 0x2a, 0xc8, 0x5e, 0x72, 0x9a, 0x32, 0x4c, 0x49, 0xe7, 0xb0, + 0x30, 0x81, 0x61, 0x44, 0x42, 0x9b, 0x2a, 0xa1, 0x38, 0x27, 0x71, 0x4c, 0x0f, 0x33, 0x08, 0x6f, 0xd3, 0xee, 0xd1, + 0x34, 0xa6, 0x8d, 0x0c, 0x1d, 0xc5, 0xed, 0x06, 0x3d, 0xcc, 0x10, 0x6a, 0xb4, 0x41, 0x67, 0x2a, 0x49, 0xbb, 0x99, + 0x43, 0xc0, 0x4b, 0x43, 0x8a, 0xf3, 0x43, 0x91, 0x14, 0x0d, 0x79, 0xa8, 0x92, 0xa2, 0x91, 0x9c, 0x62, 0x91, 0x4c, + 0xca, 0xe4, 0x89, 0x49, 0x9e, 0xd8, 0xe4, 0x61, 0x99, 0x3c, 0x34, 0xc9, 0x43, 0x9b, 0x4c, 0x49, 0x71, 0x28, 0x12, + 0xda, 0x88, 0xdb, 0xcd, 0x02, 0x1d, 0xc2, 0x08, 0xfc, 0xe8, 0x89, 0x08, 0xe3, 0x8c, 0xaf, 0x8d, 0xa1, 0xce, 0x5c, + 0xe6, 0x2e, 0xf2, 0x67, 0x05, 0xa4, 0xd2, 0x7b, 0x0a, 0xea, 0x3c, 0x0b, 0xc0, 0x84, 0xb5, 0xfd, 0xe3, 0xe3, 0xda, + 0xad, 0xb3, 0x5c, 0x8a, 0xc0, 0x3b, 0x0c, 0x0c, 0xda, 0x3f, 0x3b, 0x9f, 0x18, 0x80, 0xea, 0x9a, 0xe6, 0xf3, 0x29, + 0xdd, 0x72, 0xc1, 0x2d, 0x26, 0x43, 0xb7, 0xb3, 0xca, 0x66, 0x18, 0x2d, 0x6c, 0xbc, 0xe8, 0xba, 0xb3, 0x24, 0x80, + 0xda, 0x3b, 0x68, 0x26, 0xd4, 0x28, 0xc9, 0x6d, 0x8d, 0x49, 0xc1, 0xee, 0x54, 0x46, 0x73, 0x16, 0x57, 0x07, 0x70, + 0x35, 0x4c, 0x46, 0x5e, 0x80, 0x59, 0x7d, 0x71, 0x98, 0x1c, 0x37, 0x74, 0x32, 0x39, 0x4c, 0x4e, 0x1f, 0x34, 0x74, + 0x32, 0x3c, 0x4c, 0xda, 0xed, 0x0a, 0x67, 0x93, 0x82, 0xe8, 0x64, 0x42, 0x34, 0x68, 0x0c, 0x6d, 0xa3, 0x72, 0x4e, + 0xc1, 0x4e, 0xec, 0xdf, 0x18, 0x46, 0xc3, 0x0d, 0x43, 0xb0, 0x89, 0x0d, 0x9d, 0xb9, 0x35, 0x86, 0xb0, 0x9b, 0xce, + 0xe9, 0x69, 0x53, 0x27, 0x05, 0xd6, 0x76, 0x25, 0x9b, 0x3a, 0x99, 0x60, 0x6d, 0x97, 0xaf, 0xa9, 0x93, 0xa1, 0x6d, + 0xca, 0xe8, 0x00, 0x99, 0x08, 0x80, 0xf5, 0x9c, 0x05, 0x90, 0xef, 0x78, 0x4f, 0x97, 0x35, 0x68, 0x0d, 0xbf, 0x57, + 0xae, 0xe9, 0x0b, 0x2a, 0xaa, 0xc1, 0x5e, 0x88, 0x7d, 0xab, 0x68, 0xbb, 0x6a, 0x92, 0xfd, 0xeb, 0xb2, 0x65, 0xb3, + 0x85, 0xd4, 0xf5, 0x82, 0x0f, 0x6b, 0x18, 0xe2, 0x4a, 0xb9, 0x83, 0xfb, 0x15, 0x25, 0x31, 0x04, 0xc8, 0x33, 0xa7, + 0x10, 0x27, 0x5e, 0x8f, 0x0c, 0x49, 0xbc, 0xd1, 0x58, 0xa3, 0x38, 0x38, 0x6f, 0x9f, 0x86, 0x54, 0x75, 0x2b, 0x6a, + 0x1e, 0x21, 0xd1, 0x42, 0x58, 0xbb, 0xca, 0x51, 0x14, 0xb0, 0x20, 0x4e, 0xbb, 0x5b, 0x3b, 0x20, 0x0e, 0x0e, 0x36, + 0xcf, 0x0b, 0xff, 0x7e, 0xc1, 0xd6, 0x9b, 0x05, 0x95, 0x51, 0x9e, 0x7f, 0x55, 0xc9, 0x9a, 0xeb, 0xf2, 0x00, 0x51, + 0x7c, 0xfc, 0xaa, 0xfb, 0x86, 0xc2, 0xf7, 0xab, 0xe0, 0x7d, 0x2e, 0xa7, 0x79, 0x66, 0x32, 0x4c, 0x5f, 0x83, 0x60, + 0x6c, 0x6f, 0xc2, 0x09, 0x95, 0x06, 0x87, 0xff, 0xb2, 0xe3, 0xa0, 0x13, 0xf7, 0xea, 0x4b, 0xd8, 0xe8, 0xdf, 0xa1, + 0x79, 0x6f, 0x05, 0x1b, 0xe7, 0xd8, 0xbd, 0x5a, 0xd5, 0xde, 0xf8, 0xb1, 0x2f, 0xc9, 0xa0, 0x83, 0x03, 0xae, 0x9e, + 0x81, 0x45, 0x32, 0x8b, 0x1b, 0xe1, 0xe1, 0xfb, 0x4f, 0xed, 0xb4, 0xfe, 0xdb, 0x9c, 0xab, 0x69, 0x70, 0xd0, 0x3d, + 0xac, 0xe5, 0xef, 0x5c, 0x89, 0x9e, 0x4e, 0xb9, 0x5b, 0xeb, 0xbf, 0x2b, 0x7b, 0xef, 0xad, 0xd7, 0xa6, 0x0e, 0x0e, + 0x78, 0x15, 0xf3, 0x29, 0xfa, 0x21, 0x42, 0x3d, 0x23, 0x83, 0x3c, 0xcb, 0x25, 0x85, 0x1b, 0x51, 0xb8, 0x62, 0x48, + 0x1b, 0xfc, 0x48, 0xe3, 0x3f, 0xe4, 0xff, 0xa7, 0x46, 0x0e, 0x75, 0xda, 0xe0, 0x81, 0x00, 0x16, 0xb2, 0x42, 0x55, + 0xb4, 0x45, 0x03, 0xe9, 0xd0, 0x7c, 0x1b, 0x95, 0x87, 0x39, 0x9d, 0xcf, 0xf3, 0x3b, 0xf3, 0xe0, 0x56, 0xc0, 0x51, + 0x55, 0x17, 0x4d, 0x2e, 0xd4, 0x1d, 0x2e, 0x80, 0xa7, 0x07, 0xdc, 0x43, 0xc6, 0x55, 0xb5, 0xbc, 0xdc, 0x16, 0x08, + 0x24, 0x33, 0x45, 0x64, 0xb3, 0xdd, 0x55, 0x97, 0x20, 0x97, 0x35, 0x9b, 0x48, 0xbb, 0x08, 0xe0, 0x98, 0x83, 0x4c, + 0xa6, 0xac, 0x3b, 0xea, 0x9e, 0x2d, 0x08, 0x92, 0x9b, 0x34, 0x22, 0xdb, 0xee, 0x52, 0x7c, 0x1c, 0x03, 0x1a, 0x21, + 0x2b, 0xf0, 0x85, 0xc2, 0x22, 0x07, 0xae, 0xb3, 0xf0, 0x1d, 0x7f, 0xa3, 0xa5, 0xa2, 0xaf, 0x06, 0x03, 0x5c, 0x98, + 0x37, 0x26, 0xca, 0xf9, 0x14, 0x2a, 0x78, 0xb3, 0x28, 0x10, 0x51, 0xf8, 0x6a, 0xb5, 0x0f, 0x4f, 0x02, 0xb9, 0x36, + 0xc1, 0x7f, 0xd5, 0xfd, 0xac, 0x9e, 0xff, 0x80, 0x71, 0x30, 0xd2, 0x32, 0x17, 0x85, 0x4e, 0xde, 0x64, 0x17, 0xa2, + 0xdb, 0x68, 0x30, 0x13, 0xad, 0x89, 0x40, 0x68, 0x36, 0x70, 0x2e, 0x84, 0x3f, 0x36, 0x00, 0x93, 0x62, 0x36, 0x8c, + 0x1d, 0xc4, 0xd7, 0xae, 0x25, 0xac, 0x56, 0xca, 0x86, 0x49, 0x31, 0x39, 0x36, 0x60, 0x4a, 0xd9, 0x4f, 0x19, 0x8f, + 0xb5, 0x32, 0xe3, 0xe0, 0x6e, 0xab, 0xbf, 0xad, 0xf6, 0xf3, 0x1e, 0xb7, 0xd7, 0x78, 0xdc, 0x04, 0x1f, 0x30, 0x80, + 0x5a, 0x6e, 0x6c, 0x70, 0x6b, 0x2c, 0x1f, 0x5b, 0xcb, 0x5e, 0xb6, 0x09, 0x41, 0x51, 0x3a, 0xdb, 0xdb, 0x9b, 0x5b, + 0x1f, 0x7c, 0x50, 0x99, 0x39, 0x29, 0xa4, 0xfb, 0x20, 0x47, 0x0f, 0x08, 0x74, 0x6e, 0x7f, 0x56, 0x74, 0xa1, 0x92, + 0x89, 0xcb, 0x31, 0xfe, 0x12, 0xdc, 0xe6, 0xf5, 0xa3, 0xeb, 0x6b, 0xb3, 0xc9, 0xaf, 0xaf, 0x23, 0x1c, 0x5a, 0xa8, + 0x47, 0x01, 0x2f, 0x18, 0x0d, 0xca, 0xf8, 0x54, 0x66, 0xe3, 0x37, 0xdb, 0x55, 0x63, 0xef, 0x69, 0x85, 0x77, 0xb0, + 0x3c, 0xa6, 0xf1, 0x2d, 0x8f, 0xce, 0x3e, 0x07, 0x78, 0xb3, 0x3e, 0x1f, 0x74, 0xdf, 0xc4, 0x0a, 0x1d, 0x1c, 0xbc, + 0x89, 0x25, 0xea, 0x5d, 0x31, 0x73, 0xe7, 0x06, 0x2e, 0xdd, 0x7d, 0x6e, 0x86, 0x2f, 0x03, 0x04, 0xb8, 0x62, 0x9b, + 0x92, 0xcd, 0x5b, 0x13, 0x40, 0x23, 0x85, 0x00, 0xdd, 0x10, 0x26, 0xd8, 0x81, 0x04, 0x7a, 0x7d, 0x13, 0x42, 0xbb, + 0xcb, 0x08, 0x03, 0x16, 0xbe, 0x74, 0xb8, 0x63, 0xc9, 0x8c, 0x15, 0x13, 0x56, 0xac, 0x56, 0xef, 0xa9, 0x75, 0xa2, + 0xdb, 0x88, 0xf7, 0xa8, 0xba, 0x8d, 0x06, 0x35, 0xe3, 0x07, 0xf1, 0x81, 0x0e, 0xf0, 0xfe, 0x9b, 0xb8, 0x40, 0x08, + 0x2c, 0x8c, 0xb8, 0x58, 0x78, 0x87, 0xb1, 0xac, 0xb6, 0x2e, 0x05, 0x2a, 0x1b, 0xc9, 0x49, 0x0b, 0x4f, 0x49, 0x56, + 0xae, 0xd1, 0xc5, 0xb4, 0xdb, 0x68, 0xe4, 0x48, 0xc6, 0x59, 0x3f, 0x1f, 0x60, 0x8e, 0x0b, 0xb8, 0x4c, 0xdd, 0x5e, + 0x87, 0x39, 0xab, 0x51, 0x2e, 0x37, 0xdf, 0xa5, 0x1d, 0x6b, 0xfa, 0x88, 0xae, 0x03, 0x60, 0x3c, 0xa2, 0x01, 0x91, + 0xd8, 0x05, 0x64, 0x61, 0x81, 0xac, 0x3c, 0x90, 0x85, 0x01, 0xb2, 0x42, 0xbd, 0x39, 0x44, 0x3e, 0x52, 0x28, 0xdd, + 0xa2, 0xe8, 0xf5, 0x18, 0x9d, 0xce, 0xff, 0x03, 0x73, 0x13, 0x26, 0xc2, 0x2d, 0x07, 0xf8, 0x82, 0x38, 0x97, 0x42, + 0x45, 0x96, 0x51, 0x64, 0xc2, 0xd5, 0xe2, 0x5b, 0xf3, 0x27, 0xb9, 0xc5, 0x77, 0xf6, 0xc7, 0x5d, 0xa0, 0x4c, 0x7a, + 0x5e, 0xd3, 0x36, 0x70, 0x17, 0xdc, 0x2d, 0x4a, 0x22, 0x40, 0x6b, 0x17, 0xa9, 0x50, 0xd4, 0x1f, 0x6f, 0x53, 0x36, + 0xa6, 0x84, 0x68, 0x10, 0x85, 0x45, 0x40, 0x3a, 0xff, 0xfc, 0x33, 0x42, 0x3d, 0x01, 0x21, 0x81, 0xdc, 0xc9, 0xd6, + 0x6c, 0xa3, 0x46, 0x94, 0x44, 0x69, 0xec, 0x23, 0x4e, 0xc0, 0xce, 0x88, 0xa2, 0xe0, 0xe1, 0x96, 0x72, 0x18, 0x1f, + 0x6a, 0xc3, 0x30, 0x83, 0xaa, 0x62, 0x68, 0x5c, 0x2e, 0x37, 0x23, 0x16, 0x19, 0xa8, 0x0a, 0x13, 0x2e, 0x06, 0xd9, + 0xd7, 0xcc, 0x18, 0x61, 0x07, 0x07, 0xac, 0x2f, 0x06, 0xc1, 0xf3, 0x64, 0xd5, 0x75, 0xb8, 0x0e, 0x17, 0x2e, 0xa6, + 0x10, 0x32, 0x7e, 0xb5, 0xb2, 0x7f, 0xc9, 0x07, 0x23, 0xcd, 0xc0, 0x3b, 0x73, 0xc1, 0x19, 0x2b, 0x76, 0xcb, 0x62, + 0x89, 0x96, 0xbf, 0x83, 0xd9, 0x9e, 0x0b, 0x00, 0xc8, 0xdd, 0x54, 0xdb, 0x1e, 0xea, 0x73, 0xa3, 0x51, 0x08, 0xc2, + 0xef, 0x56, 0x47, 0x1a, 0x9e, 0xeb, 0x30, 0xaf, 0x16, 0x46, 0x37, 0x53, 0x65, 0x34, 0x54, 0x38, 0x52, 0x12, 0x30, + 0x41, 0x37, 0x74, 0x12, 0x7e, 0xd4, 0xa9, 0xa4, 0x63, 0x21, 0x01, 0x0a, 0x1c, 0x99, 0xcb, 0x79, 0x13, 0xed, 0x9e, + 0xa1, 0x1d, 0x44, 0x2e, 0x30, 0xa1, 0xa9, 0xcb, 0x96, 0x2e, 0x2c, 0x55, 0x34, 0x93, 0x0b, 0xc5, 0x16, 0x73, 0x38, + 0xdf, 0xcb, 0xb4, 0x2c, 0xe7, 0xd9, 0xe7, 0x7a, 0x0a, 0x58, 0x3b, 0xde, 0xea, 0x19, 0x13, 0x8b, 0xc8, 0xcd, 0xf3, + 0xab, 0x15, 0xf7, 0xdf, 0xbc, 0xc0, 0x8f, 0x48, 0xe7, 0xf0, 0x2b, 0xfe, 0x48, 0xc9, 0xa3, 0xc6, 0x57, 0x3c, 0xe1, + 0xc4, 0xf2, 0x06, 0xc9, 0x9b, 0xd7, 0x57, 0x2f, 0xde, 0xbd, 0x78, 0xff, 0xf4, 0xfa, 0xc5, 0xab, 0x67, 0x2f, 0x5e, + 0xbd, 0x78, 0xf7, 0x11, 0xff, 0x43, 0xc9, 0xd7, 0xa3, 0xf6, 0x79, 0x0b, 0x7f, 0x20, 0x5f, 0x8f, 0x3a, 0xf8, 0x56, + 0x93, 0xaf, 0x47, 0x27, 0x38, 0x57, 0xe4, 0xeb, 0x61, 0xe7, 0xe8, 0x18, 0x2f, 0xb4, 0x6d, 0x32, 0x97, 0x93, 0x76, + 0x0b, 0xff, 0xe3, 0xbe, 0x40, 0xbc, 0xaf, 0x66, 0x31, 0x61, 0x1b, 0xc6, 0x0f, 0xa6, 0x0c, 0x1d, 0x2a, 0x63, 0x88, + 0x72, 0x11, 0xa0, 0xd3, 0x54, 0x85, 0xe8, 0x64, 0xe3, 0x31, 0x83, 0x0d, 0x23, 0xa0, 0x15, 0x27, 0xae, 0x1d, 0x7e, + 0xd4, 0x66, 0xc7, 0x40, 0x9f, 0x78, 0x29, 0x1c, 0x97, 0x2a, 0x9c, 0xb6, 0xd3, 0x62, 0x8c, 0x73, 0x29, 0x8b, 0x78, + 0x01, 0x8c, 0x80, 0xd1, 0x5a, 0xf0, 0xa3, 0x32, 0xf0, 0x93, 0xb8, 0x20, 0xed, 0x5e, 0x3b, 0x15, 0x17, 0xa4, 0xd3, + 0xeb, 0xc0, 0x9f, 0xd3, 0xde, 0x69, 0xda, 0x6e, 0xa1, 0xc3, 0x60, 0x1c, 0x7f, 0xd4, 0xd0, 0xba, 0x3f, 0xc0, 0xae, + 0x0b, 0xf5, 0x4f, 0xa1, 0xbd, 0x4a, 0x4f, 0x38, 0x75, 0x6c, 0xbb, 0x2b, 0x2e, 0x98, 0xd1, 0xc3, 0xf2, 0x1f, 0x00, + 0xb5, 0x8d, 0x6f, 0x4a, 0xb9, 0x71, 0xdc, 0x2f, 0x7e, 0x24, 0x50, 0x2d, 0xba, 0x4c, 0xcc, 0x56, 0x2d, 0x04, 0x4c, + 0xa3, 0xc9, 0x06, 0x73, 0xa0, 0x44, 0xc9, 0x42, 0xfb, 0x08, 0xf9, 0xaa, 0x29, 0x51, 0x32, 0x97, 0xf3, 0xb8, 0xa6, + 0x6a, 0xf8, 0x35, 0x30, 0x73, 0xdc, 0xe7, 0xea, 0x15, 0x7d, 0x15, 0xd7, 0x78, 0x9e, 0x90, 0xb5, 0x0b, 0xb7, 0xc5, + 0x2f, 0xce, 0x8a, 0xa2, 0x06, 0xae, 0x12, 0xb0, 0x7e, 0x54, 0x4d, 0x7d, 0x01, 0x4f, 0x01, 0xb2, 0x86, 0xbe, 0x24, + 0x01, 0xf5, 0xfc, 0xa9, 0x34, 0xe3, 0x2a, 0x95, 0xd1, 0x5e, 0x11, 0x6d, 0xcc, 0x82, 0xbc, 0x22, 0xfa, 0x42, 0x19, + 0x20, 0x48, 0xc2, 0xfb, 0x62, 0x00, 0x07, 0xbe, 0x1d, 0xa0, 0x34, 0x74, 0x0e, 0xd4, 0x4a, 0x95, 0x99, 0x90, 0xf9, + 0x34, 0x71, 0x0e, 0x40, 0xf3, 0x54, 0xa9, 0xa0, 0xcc, 0x27, 0x96, 0x28, 0x18, 0xfa, 0x6f, 0xe1, 0x06, 0x38, 0x8c, + 0x0d, 0x2a, 0x06, 0xd9, 0xf7, 0x44, 0x3d, 0xbf, 0x7d, 0xde, 0x3a, 0xfa, 0x1a, 0xe4, 0x8f, 0x94, 0xb7, 0xf7, 0xf8, + 0x3b, 0xa0, 0xe4, 0x36, 0x32, 0x57, 0x1b, 0xfb, 0xa0, 0x6a, 0xdd, 0x10, 0x20, 0x87, 0x1a, 0x1d, 0x99, 0x57, 0x11, + 0xbb, 0x48, 0x1f, 0x92, 0x76, 0x0b, 0x22, 0xa1, 0xed, 0xa0, 0x7c, 0x3f, 0x6d, 0xc0, 0x54, 0x27, 0xb7, 0x4d, 0xa0, + 0xd5, 0xf0, 0x50, 0xd2, 0x5d, 0x93, 0x27, 0x77, 0x58, 0x05, 0x38, 0xc3, 0x0e, 0x59, 0x43, 0x1c, 0x0a, 0xe4, 0x22, + 0xc8, 0xda, 0x0d, 0xa0, 0xa9, 0xe8, 0xd8, 0x07, 0xfb, 0xbc, 0x71, 0xd4, 0x45, 0x33, 0x39, 0x3d, 0xfc, 0x7a, 0x70, + 0x10, 0xcb, 0x06, 0x79, 0x84, 0xf0, 0x92, 0x82, 0x41, 0x36, 0x38, 0xb0, 0x71, 0xcb, 0xc4, 0xa7, 0x2a, 0xa0, 0x8e, + 0x0b, 0x55, 0x3b, 0xd6, 0xaa, 0xce, 0xca, 0xdd, 0xe0, 0xc7, 0xd4, 0x41, 0x8d, 0x20, 0xcd, 0x8e, 0xae, 0x53, 0x83, + 0x72, 0xcd, 0xdb, 0x0c, 0xb6, 0x65, 0xe3, 0x23, 0x45, 0x3f, 0x3c, 0x6a, 0x7e, 0x0d, 0x26, 0x5c, 0x33, 0x4d, 0x7a, + 0xd4, 0x78, 0x84, 0x7e, 0x78, 0x14, 0xf8, 0x0b, 0xf2, 0x8a, 0x3d, 0xf1, 0xdc, 0xc8, 0x4f, 0x96, 0x2b, 0xfd, 0x09, + 0x24, 0xfb, 0x82, 0xfc, 0x04, 0x58, 0x4e, 0xc9, 0x4f, 0xb1, 0x6c, 0x42, 0x1c, 0x45, 0xf2, 0x53, 0x5c, 0xc0, 0x8f, + 0x9c, 0xfc, 0x14, 0x03, 0xb6, 0xe3, 0xa9, 0xf9, 0x51, 0x94, 0xc0, 0x00, 0x1f, 0x35, 0x69, 0x5d, 0xd5, 0x8a, 0xd5, + 0x4a, 0x1c, 0x1c, 0x48, 0xfb, 0x8b, 0x5e, 0x66, 0x07, 0x07, 0xf9, 0xc5, 0xb4, 0xea, 0x9b, 0xe9, 0x5d, 0xf4, 0xc5, + 0x20, 0x14, 0x0e, 0x4c, 0xd3, 0x78, 0x38, 0xe3, 0x4f, 0x21, 0x65, 0x35, 0x0d, 0x34, 0x8f, 0x3b, 0xf7, 0xcf, 0xce, + 0x31, 0xfc, 0x7b, 0x3f, 0x28, 0xf8, 0x73, 0xc9, 0x77, 0x91, 0x36, 0x6b, 0x9e, 0x55, 0xc8, 0x76, 0x19, 0xe0, 0x33, + 0x66, 0xa8, 0x29, 0x0e, 0x0e, 0xf8, 0x45, 0x80, 0xcb, 0x98, 0xa1, 0x46, 0x60, 0xb1, 0xf7, 0xb0, 0xb4, 0x27, 0x33, + 0x5c, 0x13, 0xbc, 0x90, 0xcb, 0xfb, 0xc5, 0xe0, 0x42, 0x3b, 0x6a, 0x12, 0xc6, 0xd1, 0x56, 0xa4, 0xe5, 0x36, 0x59, + 0x57, 0x34, 0xd5, 0x65, 0xbb, 0x8b, 0x24, 0x51, 0x0d, 0x71, 0x79, 0xd9, 0xc6, 0xa0, 0x92, 0xef, 0x29, 0x22, 0x53, + 0x41, 0xbc, 0xaf, 0xdf, 0x32, 0x97, 0xa9, 0xc2, 0x53, 0x9e, 0x0a, 0x2f, 0x67, 0xbf, 0xf6, 0xd6, 0xd3, 0xc6, 0xfb, + 0xd2, 0xf4, 0xcc, 0xb0, 0xe8, 0xa9, 0xd2, 0x6b, 0x10, 0x36, 0xa9, 0x1a, 0xc0, 0x03, 0x84, 0x25, 0xe6, 0x31, 0xeb, + 0x2a, 0xc7, 0x20, 0xc0, 0xb3, 0x6a, 0xb4, 0x21, 0x13, 0x3e, 0xd7, 0xa9, 0x82, 0x81, 0x9a, 0xc2, 0x17, 0x40, 0xa6, + 0xb2, 0xca, 0x30, 0xdb, 0x37, 0x0c, 0x05, 0x04, 0x14, 0xb8, 0x24, 0x2c, 0x90, 0xe0, 0xe1, 0xf6, 0x23, 0x20, 0x1c, + 0x75, 0x72, 0x61, 0x27, 0x77, 0xa1, 0xa0, 0x3b, 0x31, 0xb8, 0xd0, 0x5d, 0x24, 0x1a, 0x0d, 0xc7, 0x6d, 0x5f, 0x0a, + 0x33, 0x88, 0x66, 0x7b, 0x70, 0xc9, 0xba, 0x48, 0x35, 0x9b, 0xa5, 0x01, 0xe4, 0x65, 0x6b, 0xb5, 0x52, 0x17, 0xbe, + 0x91, 0x9e, 0x3f, 0xc7, 0x0d, 0xdf, 0xe5, 0x05, 0xcf, 0xdf, 0x24, 0xe9, 0x47, 0x40, 0x55, 0x81, 0xcf, 0x96, 0xf3, + 0x08, 0x47, 0xe6, 0x6d, 0x3a, 0xf8, 0x6b, 0xde, 0x14, 0x8b, 0x70, 0xe4, 0x9e, 0xab, 0x8b, 0x06, 0xd5, 0x60, 0x79, + 0x56, 0x46, 0x5a, 0xe7, 0xc9, 0x35, 0x30, 0x0e, 0xfa, 0x6f, 0x85, 0x96, 0xd5, 0xef, 0x24, 0x77, 0x31, 0x47, 0x94, + 0x7f, 0x41, 0xcd, 0x8d, 0x6a, 0xbd, 0xdb, 0xcb, 0x93, 0xe3, 0xc8, 0x57, 0x85, 0x97, 0x08, 0xbe, 0xf3, 0x84, 0x63, + 0xdb, 0xbd, 0x1c, 0xbe, 0x2c, 0x7b, 0x00, 0xce, 0x7b, 0xbd, 0x46, 0xf8, 0x37, 0xb9, 0xf3, 0x19, 0xe1, 0xe8, 0x5a, + 0x8a, 0x27, 0x54, 0xd3, 0xa8, 0xf1, 0xc6, 0x18, 0xbe, 0x59, 0x39, 0xab, 0xfb, 0xad, 0x71, 0xb0, 0x7f, 0xab, 0x7b, + 0x88, 0x02, 0x51, 0x7b, 0xf1, 0xc8, 0xca, 0xbe, 0x26, 0xf6, 0x87, 0x0c, 0x4c, 0xdf, 0x76, 0xc0, 0xc3, 0x8f, 0x91, + 0x82, 0x6f, 0xb2, 0xe5, 0x93, 0x28, 0x84, 0x57, 0xad, 0x79, 0x44, 0x43, 0x8a, 0xed, 0xc3, 0x78, 0xcf, 0xae, 0x51, + 0xc8, 0x75, 0x8f, 0x55, 0x9d, 0x98, 0x56, 0xdd, 0x18, 0xa9, 0x83, 0x6d, 0xb2, 0xe0, 0xac, 0xea, 0xdd, 0x48, 0x28, + 0xd5, 0xe3, 0x70, 0xe6, 0x81, 0xcf, 0x66, 0xdb, 0xbc, 0x98, 0x6c, 0x9f, 0x90, 0x53, 0x60, 0xc8, 0xbb, 0x5f, 0x46, + 0xbe, 0xba, 0x84, 0x63, 0x37, 0x0e, 0x20, 0x2b, 0xc9, 0xe5, 0xd2, 0x3d, 0xef, 0xc6, 0xfb, 0x72, 0xb0, 0x2e, 0x1f, + 0x7b, 0x0b, 0xf0, 0xa0, 0x1a, 0xa9, 0xc8, 0x42, 0xce, 0xc0, 0xbf, 0x94, 0x58, 0xd3, 0x0f, 0xf1, 0xaf, 0x70, 0xc0, + 0x57, 0x48, 0x9a, 0x5a, 0xf5, 0x13, 0x3c, 0xc2, 0x04, 0x0a, 0x6f, 0x5b, 0xf7, 0x93, 0x0c, 0xbd, 0x5d, 0xeb, 0x3a, + 0x15, 0xeb, 0x50, 0x5a, 0x57, 0xac, 0x94, 0x85, 0x83, 0xe3, 0x2e, 0x46, 0xeb, 0xd4, 0x39, 0x9f, 0xba, 0x97, 0x9b, + 0x1e, 0x0a, 0x70, 0x7c, 0xe1, 0x52, 0x3c, 0x2b, 0x20, 0x14, 0x57, 0xa8, 0x4f, 0xfb, 0x59, 0x86, 0x4f, 0x13, 0xf7, + 0xe1, 0x9e, 0xb0, 0xe4, 0x39, 0xcb, 0xe7, 0xb4, 0x61, 0x81, 0x14, 0x50, 0x28, 0x85, 0xc5, 0x6a, 0x15, 0x0b, 0x13, + 0xa0, 0xc1, 0xc5, 0xe7, 0x75, 0x0f, 0x71, 0x18, 0xfd, 0x1d, 0xd4, 0xc5, 0x5e, 0x3d, 0x62, 0x4c, 0x58, 0x51, 0x78, + 0xe9, 0xa4, 0xb2, 0xa0, 0xaf, 0x5d, 0x7d, 0x88, 0x6a, 0xca, 0xbd, 0xd8, 0xe8, 0x7b, 0xdf, 0xf1, 0x19, 0x93, 0x0b, + 0x78, 0x01, 0x09, 0x33, 0xa2, 0x98, 0xf6, 0xdf, 0x40, 0x41, 0xe0, 0x19, 0x1d, 0x1e, 0xe2, 0x23, 0xf0, 0x55, 0x9e, + 0xd6, 0xc9, 0xcc, 0xbf, 0xab, 0x11, 0x99, 0xb8, 0x97, 0x51, 0x2f, 0x02, 0x17, 0x21, 0x10, 0xa1, 0x08, 0x89, 0x98, + 0x18, 0x45, 0xbd, 0xc8, 0xf8, 0x5b, 0x45, 0x60, 0x35, 0x06, 0x4a, 0xee, 0x08, 0xcf, 0x55, 0x45, 0xc4, 0xc2, 0x9a, + 0x3a, 0xa8, 0xc4, 0x52, 0x63, 0xa6, 0x7d, 0xd4, 0xa9, 0x40, 0x58, 0x64, 0x9b, 0x82, 0xb2, 0xde, 0x50, 0x17, 0x60, + 0x49, 0x8c, 0xe9, 0x2d, 0x4f, 0xae, 0x81, 0x9b, 0x63, 0x23, 0x57, 0x74, 0xc9, 0xaf, 0x40, 0x3d, 0x9d, 0x16, 0xf8, + 0xda, 0x30, 0x6c, 0xa3, 0x94, 0xae, 0x09, 0xc7, 0x19, 0x29, 0x12, 0x7a, 0x0b, 0x01, 0x2a, 0x66, 0x5c, 0xa4, 0x39, + 0x9e, 0xd1, 0xdb, 0x74, 0x8a, 0x67, 0x5c, 0x3c, 0xb1, 0xcb, 0x9e, 0x8e, 0x20, 0xc9, 0x7f, 0x2c, 0xd6, 0xc4, 0xbc, + 0xaf, 0xf5, 0xbb, 0x62, 0xc5, 0x23, 0xe0, 0x55, 0x54, 0x8c, 0xba, 0x23, 0x63, 0x53, 0xce, 0x74, 0x65, 0xbc, 0xfe, + 0x5a, 0xc7, 0x14, 0x67, 0x38, 0x47, 0x49, 0x2e, 0x31, 0xeb, 0x89, 0xf4, 0x35, 0x04, 0xa7, 0xce, 0xb0, 0x7d, 0x9b, + 0x8b, 0xdf, 0xb2, 0xfc, 0x99, 0x2c, 0xde, 0x9b, 0x2d, 0x9f, 0x23, 0x28, 0x04, 0x2e, 0x2a, 0xa2, 0x09, 0xb7, 0x7b, + 0x8b, 0x9e, 0xac, 0x9a, 0xa2, 0xb7, 0xb6, 0x29, 0x37, 0xc4, 0x29, 0x44, 0xf5, 0x4d, 0xa6, 0xbc, 0xd1, 0xc6, 0xac, + 0xd7, 0xfa, 0x4e, 0xa3, 0x53, 0x54, 0x96, 0x44, 0x18, 0xd6, 0xaa, 0xa9, 0x52, 0x49, 0x44, 0x53, 0x39, 0x09, 0x6f, + 0x69, 0x80, 0x9d, 0x2a, 0x9c, 0xc9, 0x85, 0xd0, 0xa9, 0x0c, 0xf0, 0x86, 0x56, 0x9b, 0x6b, 0x79, 0x6b, 0x21, 0xa6, + 0xf1, 0x9d, 0xfd, 0xc1, 0xf0, 0xb5, 0x51, 0xf1, 0xbf, 0x05, 0xc3, 0x1e, 0x95, 0x0a, 0x80, 0x1f, 0x18, 0xce, 0x02, + 0xe4, 0x2c, 0x3f, 0x79, 0x0b, 0xe0, 0xb3, 0x2c, 0xe4, 0x1d, 0xa4, 0x32, 0x93, 0x7a, 0x07, 0xa9, 0x0c, 0x52, 0x8d, + 0x5b, 0xfa, 0xbe, 0xa8, 0x94, 0x45, 0x61, 0x83, 0x44, 0xe1, 0x52, 0x1d, 0x2c, 0x89, 0x48, 0xa0, 0x5d, 0x23, 0xca, + 0xcd, 0xb8, 0x80, 0xf8, 0x84, 0xd0, 0xb8, 0xfd, 0xa6, 0xb7, 0xf0, 0x7d, 0x67, 0xf3, 0x99, 0xcf, 0xbf, 0xb3, 0xf9, + 0xa6, 0x23, 0x8f, 0xf1, 0xf5, 0xdb, 0x4e, 0x63, 0x19, 0x2f, 0x1d, 0xd6, 0x7e, 0x28, 0x5f, 0x83, 0x69, 0x99, 0x57, + 0xb7, 0x49, 0x1b, 0x4f, 0x02, 0xa4, 0x6c, 0x56, 0x3c, 0x5c, 0x07, 0xb7, 0x5b, 0x87, 0x31, 0x6f, 0x92, 0x36, 0x42, + 0x87, 0x4e, 0xb8, 0x12, 0xb1, 0x91, 0x9c, 0x0e, 0x1f, 0x1d, 0xc1, 0xdd, 0xcb, 0x4c, 0x6d, 0xf8, 0x4a, 0xd9, 0x6a, + 0xcd, 0x76, 0xeb, 0x90, 0xef, 0xac, 0xd2, 0x68, 0xe3, 0x19, 0x23, 0x4b, 0x70, 0x2e, 0xa3, 0x85, 0x55, 0x35, 0x80, + 0x3f, 0xea, 0x0b, 0xf1, 0xdb, 0x82, 0x8e, 0xcc, 0xf7, 0xa1, 0x4d, 0x79, 0xbd, 0xd0, 0x3e, 0xa9, 0xc9, 0x61, 0x10, + 0x1d, 0xe4, 0x4a, 0x06, 0x39, 0x31, 0x3f, 0x22, 0xc9, 0x29, 0xba, 0x68, 0xf7, 0x92, 0xd3, 0x43, 0x7e, 0xc8, 0x53, + 0xe0, 0x61, 0xe3, 0xa6, 0xaf, 0xd0, 0x6c, 0xfb, 0x3a, 0x8f, 0x17, 0x43, 0x9e, 0xb9, 0xe6, 0xab, 0x0e, 0xca, 0x54, + 0x3b, 0x47, 0xc8, 0x02, 0x14, 0xf3, 0xbd, 0x04, 0xd9, 0xf5, 0x6e, 0x0e, 0x79, 0x0a, 0xfd, 0x40, 0xad, 0x8e, 0xad, + 0x55, 0x0e, 0xee, 0xb7, 0x05, 0x20, 0x98, 0xef, 0xa8, 0x36, 0x17, 0x9b, 0xde, 0x8c, 0xab, 0xce, 0x0e, 0x79, 0x35, + 0xc2, 0xb0, 0xcc, 0x76, 0x7f, 0x7e, 0x6a, 0x55, 0x97, 0x87, 0x01, 0x44, 0x7e, 0x5b, 0x70, 0x11, 0x76, 0x1a, 0x76, + 0xeb, 0x72, 0xc2, 0x4e, 0xeb, 0xb3, 0x0c, 0x8a, 0x6c, 0xf7, 0xba, 0x35, 0xd3, 0xfa, 0x6c, 0xaf, 0xc0, 0x47, 0x10, + 0x26, 0x65, 0x56, 0x3a, 0x83, 0x2b, 0xf4, 0xc3, 0x0f, 0xc8, 0xb5, 0xfe, 0x7a, 0xa1, 0x7d, 0x7e, 0x89, 0x08, 0x90, + 0x5d, 0x75, 0x5d, 0x56, 0x87, 0x3e, 0xca, 0x26, 0xbe, 0x1e, 0xf2, 0x60, 0xe5, 0x9e, 0xde, 0xce, 0x65, 0xea, 0xf1, + 0xb5, 0xd7, 0x4a, 0xb7, 0x90, 0x13, 0x88, 0x87, 0xeb, 0x2e, 0x2c, 0x0b, 0x72, 0x76, 0x73, 0x0b, 0x25, 0xc3, 0x89, + 0xfb, 0xd2, 0x1f, 0x98, 0xbd, 0x6e, 0xe0, 0x17, 0xc9, 0x29, 0x4c, 0x7d, 0xb3, 0x87, 0xc3, 0x0e, 0xf4, 0x61, 0xe0, + 0xb0, 0xd9, 0xa0, 0xcf, 0xac, 0x20, 0xf2, 0x98, 0x17, 0x16, 0xcf, 0x2e, 0x49, 0xbb, 0xc7, 0x53, 0xb7, 0x99, 0x8c, + 0x68, 0xd4, 0x6e, 0xf2, 0x60, 0x66, 0x80, 0x5f, 0xae, 0x6c, 0x58, 0xc4, 0xaf, 0x53, 0x00, 0x25, 0x5f, 0xac, 0x5a, + 0x9f, 0x0a, 0x5e, 0xf5, 0x86, 0xd3, 0xcd, 0x74, 0xbf, 0x6e, 0x70, 0xbb, 0xeb, 0xe1, 0x09, 0xaf, 0xb9, 0x58, 0xb4, + 0xf6, 0x13, 0x9f, 0x00, 0x07, 0x94, 0xb4, 0xee, 0x9f, 0x82, 0x0b, 0x65, 0x09, 0xcb, 0xed, 0x72, 0xb3, 0xad, 0x72, + 0x16, 0x8e, 0xb6, 0x64, 0xc0, 0x1d, 0x6c, 0x42, 0x14, 0x3a, 0x38, 0xec, 0xe0, 0xa4, 0xdd, 0xee, 0x9c, 0xe2, 0xe4, + 0xe4, 0x14, 0x06, 0xda, 0x48, 0x4e, 0x0f, 0x67, 0xca, 0x02, 0x30, 0xc8, 0x59, 0xbb, 0x76, 0x1f, 0x41, 0xe4, 0xa7, + 0x50, 0xbc, 0xe6, 0x87, 0x71, 0xdc, 0x4e, 0xee, 0xb7, 0xda, 0xa7, 0xe7, 0x0d, 0x00, 0x50, 0xd3, 0x7d, 0xb8, 0x1a, + 0xaf, 0x17, 0xba, 0x5e, 0xa5, 0x44, 0xf8, 0x7a, 0xb5, 0x86, 0xaf, 0xd6, 0x68, 0xaf, 0xab, 0x29, 0xf8, 0xaa, 0x4e, + 0x38, 0xb7, 0x45, 0xbc, 0xd2, 0x26, 0xdc, 0x16, 0xb1, 0x1d, 0x48, 0x0c, 0xd2, 0x79, 0x72, 0xda, 0x39, 0x45, 0x76, + 0x2c, 0xda, 0xe1, 0x47, 0xb9, 0x4f, 0xb6, 0x8a, 0x34, 0x34, 0x20, 0x49, 0x39, 0x3b, 0xb9, 0x00, 0x89, 0x9a, 0x93, + 0xcb, 0x76, 0x73, 0xc6, 0x12, 0x3f, 0x01, 0x93, 0x0a, 0xcb, 0x59, 0xae, 0x82, 0x4b, 0x0a, 0x00, 0x71, 0x01, 0xc6, + 0x45, 0xf7, 0x4f, 0x7b, 0xf7, 0x93, 0xd3, 0xb3, 0x8e, 0x25, 0x7a, 0xfc, 0xa2, 0x53, 0x4b, 0x33, 0x53, 0x4f, 0x4e, + 0x4d, 0x1a, 0x74, 0x9d, 0xdc, 0x3f, 0x85, 0x32, 0x2e, 0x25, 0x2c, 0x05, 0x11, 0x2b, 0xaa, 0x62, 0x10, 0xa6, 0x22, + 0xad, 0xe5, 0x9e, 0xd5, 0xb2, 0xcf, 0x4f, 0x8e, 0xef, 0x9f, 0x86, 0x50, 0x2b, 0x67, 0x61, 0x16, 0xda, 0x4d, 0xc4, + 0xcf, 0x0e, 0x96, 0x16, 0x1d, 0x26, 0xa7, 0xe9, 0xd6, 0x04, 0xed, 0xa6, 0x39, 0x34, 0x38, 0x10, 0x28, 0x1c, 0x9f, + 0x0a, 0xa7, 0x2f, 0x09, 0xee, 0xc7, 0x2a, 0x43, 0x93, 0x50, 0xe1, 0xec, 0xef, 0x29, 0x83, 0x47, 0x29, 0xc3, 0xab, + 0xca, 0xc7, 0x54, 0x7c, 0xa1, 0xea, 0x0d, 0x85, 0x30, 0x1c, 0x62, 0x10, 0xb9, 0x20, 0xe1, 0xf5, 0xdc, 0x9f, 0xc0, + 0x45, 0x98, 0x09, 0xb8, 0xd0, 0xf4, 0x4a, 0xd0, 0x8a, 0x17, 0x18, 0x86, 0x0e, 0xb5, 0x66, 0x58, 0x3d, 0x9e, 0x3a, + 0x93, 0x82, 0x50, 0xb7, 0xf5, 0x9c, 0x7f, 0xaf, 0x5c, 0x52, 0x5e, 0x65, 0x27, 0xa7, 0x28, 0x71, 0x97, 0xe5, 0x49, + 0x1b, 0x25, 0x81, 0x09, 0x89, 0x3b, 0x92, 0xb3, 0x8c, 0xf4, 0xa3, 0xdb, 0x08, 0x47, 0x77, 0x11, 0x8e, 0xac, 0x0f, + 0xf3, 0x07, 0x70, 0x10, 0x8f, 0x70, 0x64, 0x5d, 0x99, 0x23, 0x1c, 0x69, 0x26, 0x20, 0x3a, 0x57, 0x34, 0xc0, 0x39, + 0x94, 0x36, 0x9e, 0xd5, 0x65, 0xe9, 0xc7, 0xfe, 0xab, 0x74, 0xbd, 0xb6, 0x29, 0x81, 0x94, 0x39, 0x35, 0x3b, 0xd4, + 0xbe, 0x2e, 0x1d, 0x51, 0xcf, 0xac, 0x47, 0x18, 0x04, 0x10, 0x7a, 0xe7, 0x5f, 0xa7, 0xab, 0x02, 0x7b, 0xb0, 0x63, + 0x58, 0x69, 0xf0, 0x33, 0x8f, 0xc2, 0x33, 0x2c, 0xc2, 0x63, 0xe1, 0x0b, 0x83, 0x58, 0xe1, 0x7f, 0xe7, 0x52, 0xce, + 0xfd, 0x6f, 0x2d, 0xcb, 0x5f, 0xf0, 0xa6, 0x89, 0xb3, 0x68, 0x01, 0xcb, 0x2d, 0x1b, 0x47, 0x68, 0xc8, 0xea, 0x23, + 0xb8, 0x1e, 0xbb, 0x58, 0x6f, 0x20, 0x11, 0x5e, 0x1b, 0x81, 0xca, 0xcb, 0x87, 0xd7, 0x36, 0xee, 0x90, 0xf9, 0x84, + 0xc0, 0x63, 0x10, 0x5b, 0x58, 0xc2, 0x85, 0xc6, 0xa4, 0x60, 0x4a, 0x45, 0x36, 0x20, 0x5f, 0x24, 0x85, 0x7f, 0x61, + 0xd1, 0xa7, 0x8c, 0x45, 0x64, 0x3a, 0xac, 0xcf, 0xd6, 0x8a, 0xc3, 0xb9, 0x2c, 0x54, 0x6a, 0x9f, 0x5b, 0xf1, 0x60, + 0x9c, 0x97, 0x6f, 0x19, 0xa6, 0x79, 0xb6, 0xc6, 0xf6, 0x0e, 0xbb, 0x2c, 0xe4, 0xae, 0xb4, 0xc3, 0x52, 0x59, 0xb6, + 0xfe, 0xd6, 0x84, 0x54, 0x6d, 0x46, 0xc1, 0x44, 0xab, 0x01, 0x55, 0x51, 0x39, 0xa0, 0xb0, 0x8d, 0xec, 0x92, 0x2e, + 0xcb, 0x92, 0xe9, 0xb2, 0x5c, 0x86, 0x93, 0x56, 0x6b, 0xbd, 0xc6, 0x05, 0x33, 0x11, 0x66, 0x76, 0x96, 0x80, 0x7c, + 0x35, 0x95, 0x37, 0x41, 0xae, 0x4a, 0xcb, 0x59, 0x9a, 0x25, 0x8a, 0x02, 0x23, 0xd8, 0x68, 0x8d, 0xbf, 0x70, 0xc5, + 0x01, 0x9e, 0x6e, 0x76, 0x43, 0x29, 0x73, 0x46, 0x21, 0x10, 0x59, 0xd0, 0xe4, 0x1a, 0x4f, 0xf9, 0x88, 0xed, 0x6e, + 0x13, 0xcc, 0x98, 0xff, 0xbd, 0x16, 0x3d, 0x02, 0x59, 0x76, 0xcf, 0xa0, 0x0e, 0x2c, 0xe2, 0x0a, 0x3a, 0x08, 0x65, + 0xf0, 0x51, 0x88, 0x9b, 0x39, 0xbd, 0x93, 0x0b, 0x0d, 0x70, 0x59, 0x68, 0xf9, 0xc6, 0xc5, 0x3a, 0xd8, 0x6f, 0x61, + 0x1f, 0xf6, 0x60, 0x09, 0x21, 0x03, 0x5a, 0xd8, 0x86, 0xbb, 0x68, 0xe1, 0xa1, 0xd4, 0x5a, 0xce, 0xd2, 0x16, 0x36, + 0xb1, 0x27, 0x5a, 0xeb, 0x32, 0x40, 0xd8, 0x75, 0xf9, 0x2e, 0x65, 0xb5, 0x09, 0x16, 0x4e, 0x3a, 0xd4, 0x44, 0x07, + 0xb7, 0x87, 0x8c, 0xf0, 0xc6, 0xcf, 0x57, 0xaf, 0x5f, 0xb9, 0xf0, 0xcf, 0x7c, 0x0c, 0x2e, 0x9b, 0x4e, 0x35, 0x76, + 0x6d, 0x1e, 0x74, 0x8a, 0x2b, 0x45, 0xa9, 0x15, 0x4e, 0xa1, 0xe5, 0x17, 0x42, 0xe7, 0x89, 0xbd, 0xbc, 0x78, 0x26, + 0x8b, 0x19, 0xb5, 0x37, 0x46, 0xf8, 0x5a, 0xb9, 0x17, 0xdc, 0xcd, 0x23, 0x31, 0xd5, 0x24, 0xdf, 0x6d, 0x5e, 0x45, + 0x2c, 0x32, 0x23, 0xbf, 0x82, 0x36, 0xc0, 0x54, 0x2e, 0x1f, 0xe0, 0x2d, 0x88, 0x0b, 0xa2, 0x1f, 0x90, 0x97, 0xb7, + 0x96, 0xba, 0x44, 0x51, 0x83, 0x1b, 0xfc, 0x64, 0x05, 0xcf, 0x82, 0xeb, 0x42, 0xc3, 0x1e, 0x39, 0xf1, 0x22, 0x6a, + 0x45, 0xf5, 0x07, 0x6c, 0x8d, 0x2a, 0xc1, 0x07, 0x60, 0x4d, 0x72, 0x09, 0xa2, 0x47, 0xf9, 0x56, 0x1e, 0x07, 0xd1, + 0xc4, 0xdf, 0x3d, 0x5f, 0xb6, 0x3d, 0x9d, 0xcd, 0x2b, 0x75, 0x62, 0x79, 0x65, 0x02, 0x1e, 0x8e, 0xf6, 0x35, 0x1a, + 0x84, 0x83, 0x44, 0x56, 0x6a, 0x0f, 0x7d, 0x2e, 0xea, 0xc6, 0xf9, 0x45, 0x9b, 0x35, 0x4f, 0x56, 0xab, 0xfc, 0xb2, + 0xcd, 0xda, 0xa7, 0xf6, 0xed, 0xba, 0x48, 0x65, 0x40, 0x73, 0xf9, 0x98, 0x67, 0x11, 0x68, 0x67, 0xc7, 0x99, 0x09, + 0xa7, 0xe0, 0xa3, 0x2d, 0x93, 0x85, 0xae, 0xfa, 0x92, 0x60, 0x5c, 0x4a, 0xac, 0x1e, 0xbf, 0x40, 0xbd, 0x76, 0xba, + 0xed, 0x2a, 0xdd, 0x6c, 0x1f, 0x06, 0x17, 0x2e, 0x05, 0xc2, 0x1d, 0x08, 0x79, 0x00, 0xfa, 0xdd, 0xa5, 0x00, 0xd3, + 0x20, 0x40, 0x65, 0x05, 0x22, 0x2d, 0x9f, 0x2d, 0x66, 0xcf, 0x0a, 0x6a, 0x96, 0xe1, 0x09, 0x9f, 0x70, 0xad, 0x52, + 0x0a, 0xd2, 0xed, 0xae, 0xf4, 0xf5, 0x6e, 0x09, 0x2a, 0xab, 0x05, 0xb1, 0x4d, 0x34, 0xcf, 0x3e, 0x2b, 0xb7, 0x70, + 0x08, 0x9b, 0x95, 0x15, 0x38, 0x43, 0x6b, 0x9c, 0xcb, 0x09, 0x2d, 0xb8, 0x9e, 0xce, 0xfe, 0xad, 0xd5, 0x61, 0x7d, + 0x3d, 0x30, 0x17, 0x56, 0x00, 0x12, 0x2a, 0x46, 0xab, 0x15, 0x3f, 0xfa, 0xfe, 0x7d, 0x92, 0xf7, 0x09, 0x6f, 0xe3, + 0x0e, 0x3e, 0xc6, 0xa7, 0xb8, 0xdd, 0xc2, 0xed, 0x53, 0xb8, 0xba, 0xcf, 0xf2, 0xc5, 0x88, 0xa9, 0x18, 0x1e, 0x31, + 0xd3, 0x97, 0xc9, 0xf9, 0x61, 0x19, 0xba, 0x5f, 0x17, 0x89, 0x43, 0x97, 0x20, 0x82, 0xbc, 0x0b, 0xbd, 0x17, 0x45, + 0x61, 0xdc, 0xb7, 0x71, 0xa8, 0x3a, 0x29, 0xf5, 0x0b, 0x97, 0xc7, 0x3d, 0xb0, 0xe7, 0xb6, 0x2b, 0xdb, 0x04, 0xb3, + 0x6f, 0xfb, 0x33, 0xad, 0x7e, 0x36, 0x75, 0x89, 0x18, 0x1e, 0x7a, 0x15, 0x7a, 0xa0, 0x4b, 0xd2, 0x3e, 0x38, 0x00, + 0xab, 0xa3, 0x60, 0x36, 0xdc, 0x46, 0x3f, 0xe0, 0xcd, 0x5a, 0x1a, 0x04, 0x2b, 0x00, 0xe3, 0xce, 0x37, 0x9c, 0x2c, + 0x2d, 0x6c, 0x35, 0x50, 0x61, 0x5d, 0x84, 0xc1, 0xe9, 0x42, 0x52, 0x61, 0x84, 0x68, 0x38, 0xc2, 0x5c, 0xa4, 0x93, + 0xfd, 0x16, 0x96, 0xe3, 0xb1, 0x62, 0x1a, 0x8e, 0x8e, 0x82, 0x7d, 0x61, 0x85, 0x32, 0xa7, 0xc8, 0x90, 0x4d, 0xb8, + 0x78, 0xa8, 0x3f, 0xb1, 0x42, 0x9a, 0x4f, 0xa3, 0xc1, 0x48, 0x23, 0xb3, 0x8a, 0x11, 0xce, 0x72, 0x3e, 0x87, 0xaa, + 0x93, 0x02, 0x9c, 0x7e, 0xe0, 0x2f, 0x1f, 0xa5, 0x61, 0x9b, 0x40, 0xbe, 0x3e, 0xd8, 0x80, 0x2d, 0x78, 0x54, 0xd0, + 0x9b, 0xd7, 0xe2, 0x31, 0xec, 0xa8, 0x87, 0x05, 0xa3, 0x90, 0x0d, 0x49, 0xef, 0xa0, 0x29, 0xf8, 0x80, 0x36, 0x5f, + 0x1a, 0xc0, 0xa5, 0xe7, 0xe6, 0xc3, 0x56, 0xf4, 0x01, 0x10, 0x93, 0xb2, 0x2d, 0x93, 0x69, 0x4e, 0xe9, 0x2a, 0xd3, + 0x86, 0x98, 0x2a, 0xa7, 0xb0, 0xc6, 0x2e, 0xea, 0x49, 0x38, 0x98, 0x11, 0x55, 0xd3, 0xb4, 0x3f, 0x30, 0x7f, 0x5f, + 0xdb, 0x92, 0x2d, 0xec, 0xc2, 0xc9, 0xac, 0xb1, 0x79, 0x7d, 0x34, 0x28, 0xdf, 0xc6, 0x70, 0x0f, 0x0b, 0x4f, 0x60, + 0xd6, 0xc8, 0xe7, 0x89, 0x27, 0x9b, 0x27, 0xeb, 0xb5, 0x19, 0x88, 0x4a, 0x41, 0x0f, 0xf4, 0xd6, 0x6f, 0x9b, 0x16, + 0x6c, 0x8f, 0xf2, 0xeb, 0xb4, 0x85, 0x67, 0x1c, 0x5e, 0xf4, 0xf4, 0xed, 0x5d, 0xe9, 0x42, 0x7e, 0x76, 0x20, 0x69, + 0x05, 0x29, 0x76, 0x3a, 0x41, 0x67, 0xc7, 0x38, 0x18, 0x39, 0xd0, 0xf3, 0xab, 0xcf, 0x16, 0xd6, 0xfe, 0xf7, 0x9b, + 0xb2, 0xa0, 0x09, 0x96, 0x53, 0x4e, 0x28, 0xf3, 0xe7, 0xe7, 0x1b, 0x9e, 0x54, 0xa8, 0xe0, 0x9e, 0xc2, 0x82, 0x3d, + 0x6d, 0xa3, 0x65, 0xce, 0xe8, 0xdf, 0xf6, 0x87, 0x0d, 0xd0, 0x53, 0x6a, 0xd9, 0xb2, 0x42, 0x2a, 0xf5, 0xd0, 0xa6, + 0xd9, 0xa3, 0x07, 0x8e, 0xc8, 0x97, 0xd0, 0x05, 0xf0, 0xfa, 0xa3, 0x42, 0xce, 0x0d, 0x22, 0xb8, 0xdf, 0x6e, 0xdc, + 0xc6, 0x57, 0x00, 0xbc, 0x1d, 0xf6, 0xaa, 0x7f, 0x5a, 0xc0, 0xfe, 0x46, 0x65, 0x49, 0x3f, 0xde, 0x8e, 0x3d, 0xfe, + 0x0b, 0x09, 0xa1, 0xd7, 0x2d, 0x1e, 0x26, 0x0e, 0x9d, 0x4a, 0xd6, 0xac, 0xfc, 0xb9, 0x55, 0x12, 0x30, 0xac, 0x5e, + 0x30, 0x64, 0xe3, 0xb6, 0x8a, 0xdb, 0xcc, 0xff, 0xa0, 0x82, 0xc1, 0x82, 0x6f, 0x8d, 0xa4, 0x62, 0x59, 0xfc, 0xf6, + 0xa9, 0xf3, 0x5f, 0x75, 0x8e, 0x6b, 0x5f, 0xd7, 0x9e, 0xdb, 0x1c, 0x9a, 0x50, 0xc7, 0x11, 0x3a, 0x38, 0xd8, 0xc8, + 0xa0, 0x63, 0x00, 0x3c, 0x72, 0xec, 0x97, 0x5f, 0x3e, 0xcf, 0x8e, 0x19, 0xcd, 0x63, 0x11, 0x85, 0xcc, 0x9d, 0xe7, + 0xe6, 0xec, 0x44, 0x9e, 0x50, 0x35, 0xf5, 0x85, 0x01, 0x8e, 0x8f, 0xb6, 0x52, 0x01, 0xdf, 0xa3, 0xf5, 0x8e, 0x09, + 0x6c, 0xf0, 0x5b, 0x76, 0x52, 0xbb, 0x0a, 0xfa, 0x05, 0x5a, 0xee, 0x62, 0x2a, 0x37, 0x16, 0x38, 0xda, 0x9c, 0xc8, + 0xce, 0xa1, 0x6f, 0xd4, 0x29, 0x59, 0x8f, 0x27, 0xbb, 0x8d, 0xbe, 0xa4, 0xd8, 0x95, 0x5c, 0xd1, 0xb6, 0x21, 0xab, + 0x9e, 0xdc, 0xd5, 0x95, 0xa9, 0x53, 0x75, 0xcd, 0x5b, 0x59, 0xda, 0x94, 0x76, 0x49, 0xf6, 0x6e, 0x8b, 0x85, 0x57, + 0xe1, 0x8d, 0x46, 0x79, 0x11, 0x0a, 0xf6, 0x58, 0x62, 0xd0, 0xe5, 0x04, 0xae, 0x17, 0x56, 0xab, 0x18, 0xfe, 0xec, + 0x1a, 0xc3, 0x2e, 0xd3, 0xa5, 0x0f, 0x7c, 0x83, 0x5f, 0x09, 0xa2, 0xfe, 0x3a, 0x3b, 0x48, 0xb0, 0xee, 0x72, 0x83, + 0x86, 0xe3, 0xc4, 0x7f, 0xc1, 0x9b, 0xd3, 0xda, 0xbb, 0x1c, 0x4c, 0xb2, 0x6f, 0xbc, 0x53, 0x57, 0xb2, 0x96, 0xb5, + 0x90, 0xf1, 0x1b, 0x12, 0x0c, 0xb1, 0x9b, 0xd2, 0x39, 0x6e, 0x25, 0x6d, 0x14, 0xb9, 0x62, 0x15, 0xfa, 0x7f, 0xab, + 0x48, 0x66, 0x33, 0xff, 0xeb, 0xec, 0xec, 0xcc, 0xa5, 0x38, 0x9b, 0x3f, 0x65, 0x3c, 0xe0, 0x4c, 0x02, 0xfb, 0xc2, + 0x33, 0x66, 0x74, 0xc8, 0x6f, 0x61, 0x28, 0x44, 0x90, 0x4b, 0xe1, 0xd8, 0x25, 0x78, 0x32, 0x11, 0x28, 0x0f, 0xb0, + 0x7f, 0x4f, 0x36, 0xca, 0xf9, 0x37, 0x97, 0x7c, 0x4c, 0xe2, 0xb2, 0x41, 0xf6, 0xc5, 0x7c, 0xf6, 0xad, 0x99, 0x0c, + 0x3c, 0x33, 0x10, 0x61, 0xfb, 0xdb, 0xb0, 0xb4, 0xce, 0x52, 0x06, 0x47, 0x5a, 0x2e, 0xb2, 0xa9, 0xd5, 0xfc, 0xbb, + 0x0f, 0x53, 0xd6, 0xbd, 0xd7, 0x03, 0x41, 0xb9, 0xc8, 0xd2, 0x85, 0xd6, 0x8c, 0x7e, 0x2c, 0xa3, 0x68, 0xee, 0xbd, + 0x62, 0x0b, 0xf6, 0x23, 0xde, 0xab, 0x52, 0xe0, 0xe3, 0x61, 0xc1, 0x69, 0xfe, 0x23, 0xde, 0xab, 0xa2, 0x69, 0x82, + 0x2b, 0xa4, 0x09, 0x48, 0x89, 0xcd, 0xdb, 0xd4, 0x69, 0x24, 0x80, 0x82, 0xe6, 0x91, 0x39, 0xc8, 0x9e, 0xbb, 0x00, + 0x8c, 0x49, 0x07, 0xbb, 0xb8, 0x5f, 0x36, 0xac, 0xaa, 0x8d, 0x46, 0x0e, 0x41, 0xe9, 0xca, 0xd9, 0x98, 0xaf, 0x47, + 0x1b, 0x0b, 0x62, 0x94, 0xc9, 0xe4, 0xf2, 0x39, 0x8f, 0xb7, 0x16, 0x0b, 0x85, 0xd5, 0x82, 0x05, 0xaa, 0x55, 0xa9, + 0xd2, 0xc3, 0xe2, 0xdb, 0x05, 0xb3, 0xa0, 0x88, 0xd9, 0x7a, 0x0f, 0x6f, 0xb9, 0x22, 0x20, 0x25, 0xbb, 0x24, 0x78, + 0x5e, 0xdc, 0x60, 0xaa, 0x7f, 0x4d, 0x1e, 0x08, 0x3d, 0x53, 0x3a, 0xc2, 0x26, 0x4f, 0x41, 0x24, 0xb1, 0xfd, 0x16, + 0x76, 0xac, 0xd1, 0x0b, 0xe1, 0x85, 0x14, 0x38, 0x57, 0x4d, 0x13, 0x33, 0xca, 0x4d, 0x74, 0xb1, 0x87, 0x6a, 0xce, + 0x32, 0x6d, 0x11, 0x60, 0xdf, 0xa1, 0xa1, 0x14, 0xcf, 0x0d, 0x28, 0xcc, 0xbb, 0xd8, 0x2e, 0xe5, 0x31, 0x2c, 0x5e, + 0x90, 0x02, 0x44, 0x8d, 0x8b, 0x49, 0x59, 0x67, 0x9e, 0x2f, 0x26, 0x5c, 0x54, 0xc8, 0x50, 0x30, 0x35, 0x97, 0x02, + 0x9e, 0xa5, 0x28, 0x8b, 0x18, 0x3a, 0x54, 0xc3, 0x77, 0x4b, 0xc2, 0xca, 0x3a, 0xe6, 0x98, 0xe2, 0xa2, 0xaa, 0x01, + 0xcc, 0xc5, 0xc3, 0xf0, 0xfd, 0x7a, 0xf5, 0x5a, 0xbc, 0x93, 0xf3, 0x2a, 0xdf, 0xd3, 0x38, 0x1f, 0xfd, 0xdd, 0xd9, + 0x0d, 0xa3, 0xb5, 0x79, 0x39, 0x2a, 0xd8, 0xbe, 0x1f, 0x78, 0xf5, 0x9a, 0xda, 0xda, 0xbc, 0x3d, 0x55, 0x66, 0x0d, + 0x59, 0xf9, 0xd0, 0x42, 0xd5, 0x5e, 0xbd, 0xaa, 0x14, 0xb6, 0x22, 0x40, 0xa5, 0xe0, 0xa3, 0xad, 0xfc, 0x27, 0xda, + 0xe6, 0xdb, 0x73, 0xa8, 0x0c, 0x0f, 0xe4, 0xc9, 0x50, 0xd5, 0x03, 0x2e, 0xca, 0x0f, 0x01, 0x2c, 0x7e, 0x64, 0x82, + 0xf0, 0xee, 0xba, 0x40, 0xe6, 0x4c, 0xc5, 0x12, 0x2f, 0xfb, 0x74, 0x90, 0x5a, 0x79, 0x28, 0x95, 0x60, 0xdb, 0x73, + 0x53, 0x70, 0xed, 0xa3, 0xfd, 0xe2, 0x3e, 0x1b, 0xa4, 0xcb, 0x7a, 0x44, 0x60, 0x1b, 0x93, 0xd8, 0x9b, 0x73, 0x9a, + 0x10, 0xba, 0x74, 0x80, 0x73, 0x02, 0xb6, 0xc7, 0x9e, 0x3d, 0x7d, 0x13, 0x67, 0xa8, 0x57, 0xe7, 0xf0, 0x97, 0x6b, + 0x9c, 0xe3, 0x0c, 0xa5, 0x0f, 0x63, 0xb8, 0xc0, 0x5a, 0x63, 0x00, 0x5f, 0x66, 0x49, 0x15, 0x78, 0xa4, 0x66, 0x46, + 0x62, 0x75, 0x17, 0x81, 0x68, 0xa9, 0xc3, 0xdb, 0x71, 0xe6, 0x63, 0x6a, 0x1b, 0xee, 0xf5, 0x99, 0x11, 0x0e, 0x27, + 0x59, 0x5c, 0x3b, 0x67, 0x38, 0xb9, 0xdc, 0xe7, 0xb5, 0x13, 0x13, 0xac, 0xbd, 0xc3, 0x53, 0x05, 0xf4, 0x68, 0x70, + 0xaa, 0x58, 0x1a, 0x02, 0x31, 0x13, 0xc0, 0x9b, 0x39, 0x3c, 0xda, 0x02, 0x9c, 0x8f, 0xd6, 0x38, 0xf8, 0x4a, 0x6b, + 0x5d, 0x6d, 0x2a, 0x51, 0xd6, 0x6b, 0xdc, 0x9f, 0x66, 0x78, 0x94, 0xe1, 0x79, 0x36, 0x08, 0x8e, 0x9b, 0x59, 0x16, + 0x9a, 0x74, 0xad, 0x56, 0x4f, 0x9d, 0x19, 0x21, 0xb2, 0x3f, 0x2d, 0xfd, 0x41, 0x3d, 0x40, 0xf8, 0x14, 0xb2, 0x80, + 0x96, 0xf4, 0xdc, 0xdf, 0x86, 0x7d, 0x72, 0x1b, 0x35, 0x62, 0x9e, 0x58, 0x32, 0xd2, 0xf3, 0x3f, 0xca, 0x2c, 0xdb, + 0x5a, 0x23, 0x9a, 0xdf, 0xee, 0x45, 0x0d, 0xdf, 0x5e, 0xa0, 0x65, 0x2b, 0xcd, 0x76, 0x00, 0x51, 0xac, 0x71, 0x92, + 0x0e, 0xd6, 0x48, 0xae, 0x56, 0xb1, 0x4d, 0x21, 0x3c, 0x99, 0x31, 0xaa, 0x16, 0x85, 0x79, 0x85, 0x2e, 0x56, 0x28, + 0x31, 0xfc, 0x2e, 0x76, 0x36, 0xa2, 0xf0, 0xe8, 0x9b, 0x04, 0xc3, 0x8d, 0x58, 0x10, 0x59, 0x13, 0xb9, 0x87, 0x59, + 0x65, 0x19, 0x24, 0x88, 0x30, 0x22, 0xbf, 0xbd, 0x2e, 0x15, 0xf6, 0x9d, 0x3b, 0xfb, 0xc7, 0xf8, 0x02, 0xc2, 0xcd, + 0xdb, 0x84, 0x16, 0x43, 0x3a, 0x01, 0x36, 0x16, 0xe2, 0x10, 0x6e, 0x25, 0xac, 0x56, 0xfd, 0x41, 0x57, 0x18, 0xf2, + 0xec, 0x5e, 0xe1, 0x2b, 0x1b, 0xda, 0xdd, 0x00, 0x5c, 0x75, 0x5b, 0x6a, 0xae, 0x8d, 0xee, 0x87, 0x9a, 0x87, 0xc2, + 0xb8, 0x4b, 0x72, 0x6f, 0x7d, 0x54, 0xcf, 0x79, 0xd7, 0x2c, 0xc0, 0x4d, 0xe8, 0x2a, 0x3c, 0xc2, 0x0b, 0x6b, 0xc3, + 0x69, 0x5e, 0x85, 0xa2, 0xe6, 0x31, 0x28, 0x78, 0x83, 0x9a, 0xb0, 0x7e, 0x36, 0xc0, 0x23, 0x1f, 0x33, 0x7c, 0xff, + 0x6d, 0x3c, 0x42, 0xa8, 0x20, 0x06, 0xa6, 0xd6, 0x65, 0x7b, 0x54, 0xd9, 0xed, 0x9b, 0x4c, 0xc3, 0x30, 0x18, 0x23, + 0xe6, 0x51, 0x68, 0xc4, 0x9c, 0x37, 0x1a, 0x68, 0x41, 0x46, 0x60, 0xc4, 0xbc, 0x08, 0x5a, 0x5b, 0xd8, 0x17, 0x43, + 0x83, 0xf6, 0x16, 0x08, 0x75, 0x39, 0xd0, 0x34, 0x0d, 0x6f, 0x83, 0x54, 0x6f, 0xb3, 0xfb, 0x97, 0xaa, 0x8e, 0x3a, + 0xa0, 0x48, 0x18, 0x5f, 0xfa, 0x49, 0x58, 0xd7, 0x70, 0x3b, 0xee, 0xb1, 0x19, 0xb7, 0xb3, 0x6d, 0x50, 0x7d, 0xd9, + 0xcf, 0x06, 0x83, 0xae, 0xf4, 0x56, 0x12, 0x2d, 0x3c, 0xae, 0x5e, 0x13, 0xa9, 0x16, 0xef, 0x8b, 0xde, 0xbc, 0xf2, + 0xe6, 0xfe, 0x91, 0xd2, 0xcd, 0xf3, 0x18, 0x38, 0xa0, 0x7d, 0xb8, 0x1f, 0xaa, 0xe2, 0x83, 0x1d, 0x75, 0x20, 0x0a, + 0x5a, 0xda, 0xaa, 0x09, 0xa4, 0xd6, 0xcc, 0x2e, 0xd6, 0x4d, 0x85, 0x0e, 0x05, 0x84, 0x21, 0x53, 0x55, 0x77, 0x77, + 0x2a, 0x50, 0x0d, 0x71, 0x38, 0xf5, 0x1f, 0x5b, 0x23, 0xd6, 0x38, 0xea, 0x8c, 0x22, 0x63, 0x24, 0x69, 0x97, 0x0f, + 0x1e, 0x10, 0x02, 0x2b, 0x01, 0x1f, 0xc8, 0xd9, 0x24, 0x19, 0x43, 0x82, 0xb7, 0x2c, 0xd3, 0x86, 0x0f, 0xe1, 0x0e, + 0x41, 0x79, 0x62, 0x63, 0x6d, 0xba, 0x4a, 0x16, 0x72, 0x55, 0x97, 0xd7, 0x01, 0x7a, 0xde, 0x95, 0xbf, 0xb1, 0xe1, + 0xc8, 0x82, 0x81, 0x65, 0x5b, 0xfb, 0x04, 0x3c, 0xf2, 0x71, 0x85, 0x20, 0x7e, 0x29, 0x74, 0x62, 0x82, 0x5e, 0x5f, + 0xc1, 0x06, 0xc5, 0x73, 0x70, 0x10, 0x74, 0x12, 0x1c, 0x06, 0xef, 0x32, 0xab, 0x49, 0x36, 0xb8, 0x35, 0x23, 0xf1, + 0x7c, 0xb5, 0x6a, 0xa1, 0xc3, 0x7f, 0xcc, 0xbb, 0xce, 0xe3, 0x52, 0xe1, 0x3e, 0xae, 0x14, 0xee, 0x60, 0x09, 0x48, + 0xc6, 0x81, 0xae, 0x1d, 0xcb, 0x50, 0x8d, 0x0e, 0x21, 0xc7, 0x5f, 0x40, 0x00, 0x6a, 0x77, 0x2c, 0x81, 0x9e, 0x7d, + 0xab, 0x80, 0xd5, 0xb5, 0x97, 0x25, 0x90, 0x11, 0xdc, 0xfd, 0x26, 0x30, 0x2a, 0x44, 0xe3, 0xf3, 0x67, 0x9e, 0x86, + 0xe0, 0x89, 0xf3, 0xe7, 0x9a, 0x19, 0xd6, 0xbd, 0xa0, 0x37, 0xa6, 0xf9, 0x78, 0x8c, 0x9b, 0x63, 0x0b, 0xce, 0xa3, + 0x0e, 0xfc, 0xb4, 0x10, 0x3d, 0xea, 0x60, 0x97, 0x8a, 0xc7, 0x25, 0x90, 0x43, 0xf4, 0x74, 0x06, 0x52, 0xc0, 0x4a, + 0xc7, 0x56, 0x8b, 0x34, 0x41, 0xab, 0xd5, 0xe4, 0x82, 0xb4, 0x10, 0x5a, 0xaa, 0x1b, 0xae, 0xb3, 0x29, 0xf8, 0x48, + 0x83, 0x62, 0xe0, 0x0d, 0xd5, 0xd3, 0x18, 0xe1, 0x31, 0x5a, 0x8e, 0xd8, 0x98, 0x2e, 0x72, 0x9d, 0xaa, 0x1e, 0x4f, + 0x6c, 0x54, 0x5e, 0x66, 0x23, 0xc1, 0x1d, 0x75, 0xf0, 0xc4, 0xf0, 0x97, 0x8f, 0x8c, 0x39, 0x48, 0x91, 0x99, 0xe4, + 0x89, 0x49, 0xc0, 0x3c, 0xc9, 0x72, 0xa9, 0x98, 0x6d, 0xa6, 0x6b, 0x6d, 0xcb, 0x21, 0xae, 0x77, 0xa4, 0x0b, 0x6e, + 0xac, 0x28, 0xa3, 0x74, 0x4a, 0x54, 0x4f, 0x1d, 0x75, 0xd2, 0x09, 0xe6, 0x09, 0x70, 0x7a, 0xef, 0x64, 0xcc, 0x1a, + 0xe5, 0xad, 0xe8, 0x0c, 0x1d, 0x4e, 0xb1, 0xa8, 0x2e, 0x51, 0x67, 0xe8, 0x70, 0x82, 0xf0, 0xac, 0x41, 0x72, 0x05, + 0x1e, 0xc3, 0x5c, 0xfc, 0x1f, 0x29, 0xff, 0xcd, 0x61, 0x43, 0xfc, 0xe8, 0xb7, 0xb0, 0x53, 0xd8, 0x28, 0x4a, 0x73, + 0x02, 0x5e, 0x8b, 0xed, 0x33, 0x9c, 0x91, 0x49, 0x33, 0xf7, 0x01, 0xf7, 0x4c, 0x2b, 0x8d, 0x5b, 0x8d, 0x0e, 0x33, + 0x3c, 0xda, 0x4c, 0x8a, 0xcd, 0x5c, 0x9b, 0x79, 0x9a, 0xc1, 0xf9, 0x5e, 0x8d, 0xc2, 0x95, 0x5f, 0x6c, 0x26, 0x85, + 0xe5, 0x1d, 0x70, 0x9b, 0x23, 0x2c, 0x9a, 0x14, 0xe7, 0x78, 0xd6, 0xfc, 0x8a, 0x67, 0xcd, 0x0f, 0x65, 0x46, 0x63, + 0x81, 0x05, 0x04, 0xef, 0x83, 0x44, 0x3c, 0xab, 0x92, 0x47, 0x58, 0x34, 0x4c, 0x79, 0x3c, 0x6b, 0x54, 0xa5, 0x9b, + 0x0b, 0x2c, 0x1a, 0xa6, 0x74, 0xe3, 0x03, 0x9e, 0x35, 0xbe, 0xfe, 0x8b, 0x49, 0x47, 0x29, 0xa0, 0xcb, 0x1c, 0x2d, + 0x33, 0x3b, 0xc4, 0xab, 0xdf, 0xde, 0xbe, 0x6b, 0x5f, 0x77, 0x0e, 0x27, 0xd8, 0xaf, 0x5f, 0x66, 0x70, 0x2c, 0xd3, + 0x31, 0x6b, 0x02, 0x44, 0x33, 0xdc, 0x39, 0x9c, 0xe2, 0xce, 0x61, 0xe6, 0x9a, 0x5a, 0xcf, 0x1a, 0xe4, 0x56, 0x87, + 0x50, 0xd4, 0x51, 0x1a, 0xc2, 0xc7, 0x4f, 0x36, 0x9d, 0xa0, 0x1a, 0x28, 0xd1, 0xe1, 0xa4, 0x06, 0x2a, 0xf8, 0x5e, + 0xd4, 0xbe, 0xab, 0x7a, 0x15, 0x06, 0x59, 0x28, 0xa1, 0x70, 0xcd, 0x0d, 0x78, 0x6a, 0x29, 0x06, 0x32, 0x61, 0x8a, + 0x05, 0xca, 0x77, 0x40, 0x61, 0x94, 0x27, 0x66, 0xe8, 0xc1, 0x74, 0x4c, 0xe2, 0xff, 0xcf, 0x93, 0x29, 0x87, 0x5e, + 0x6e, 0x99, 0xad, 0xe9, 0xb9, 0xc9, 0x84, 0xc3, 0x07, 0x1e, 0xeb, 0xff, 0xda, 0x81, 0x62, 0x03, 0x52, 0xfc, 0x7f, + 0xe9, 0xe8, 0x42, 0x30, 0x42, 0x56, 0x94, 0x16, 0x0e, 0xf1, 0xbf, 0x3f, 0xac, 0xa0, 0xfb, 0x62, 0xab, 0xfb, 0xc2, + 0x74, 0x1f, 0x36, 0x6d, 0x54, 0x39, 0x69, 0x55, 0xc9, 0x92, 0xff, 0x3a, 0xdd, 0xda, 0x02, 0x8d, 0xa8, 0xd1, 0xb3, + 0x49, 0xd8, 0xe0, 0x7e, 0x3b, 0xdd, 0x81, 0xcc, 0x6b, 0x6e, 0x9f, 0x19, 0x85, 0xc3, 0x37, 0xb8, 0x53, 0xbd, 0x6c, + 0x81, 0xf7, 0xa6, 0x32, 0xfa, 0xca, 0x38, 0xb4, 0x1c, 0x2c, 0x36, 0x4d, 0xb9, 0x8d, 0xb1, 0x74, 0x72, 0x8a, 0x8d, + 0x2b, 0x22, 0x54, 0xba, 0xbd, 0x04, 0xa5, 0xf8, 0x58, 0x37, 0x99, 0xf9, 0xba, 0xd0, 0x89, 0xb9, 0x84, 0x6a, 0x98, + 0xcf, 0xbb, 0x4b, 0x9d, 0x68, 0x39, 0xb7, 0x79, 0x77, 0x17, 0xd0, 0x27, 0x68, 0x58, 0x1b, 0x81, 0xdd, 0x3e, 0x2b, + 0x9c, 0x7e, 0xa7, 0x3a, 0x04, 0xc3, 0x03, 0xc8, 0x91, 0x16, 0xdb, 0x07, 0x36, 0xad, 0x61, 0xd7, 0x45, 0xb3, 0x4c, + 0xb4, 0xad, 0x36, 0x4d, 0xae, 0xdd, 0xc3, 0x7c, 0x1e, 0xf2, 0x14, 0xbc, 0xb0, 0xfa, 0xf1, 0x1d, 0xec, 0xc6, 0x6d, + 0x8d, 0x91, 0xa8, 0x2b, 0x99, 0x4a, 0xe8, 0x27, 0xb7, 0x98, 0x25, 0x77, 0xc6, 0x8b, 0x51, 0x19, 0x7f, 0x1f, 0x13, + 0x74, 0x3f, 0xaa, 0x24, 0x39, 0xb0, 0xec, 0x6f, 0xb0, 0xe4, 0x16, 0xcc, 0x13, 0xcb, 0x6a, 0x12, 0xeb, 0xe4, 0x2e, + 0x58, 0x44, 0x69, 0x1a, 0x59, 0x1b, 0x06, 0xd4, 0x34, 0x63, 0xd5, 0x83, 0xfb, 0x10, 0xe8, 0xa1, 0x57, 0x96, 0xd2, + 0xae, 0xb3, 0xb4, 0xd6, 0xbd, 0x36, 0xdd, 0x6f, 0x0e, 0x28, 0xe0, 0x0b, 0x03, 0xae, 0xe9, 0x5f, 0x4d, 0x22, 0x19, + 0xb2, 0xaf, 0x9c, 0x15, 0x8f, 0x17, 0x85, 0xc1, 0x34, 0xd1, 0xd3, 0x49, 0x36, 0x6f, 0x83, 0xa9, 0x5e, 0x36, 0xef, + 0xdc, 0x62, 0xf7, 0x7d, 0x67, 0xbf, 0xef, 0xb0, 0xe8, 0x31, 0x93, 0x91, 0x32, 0x53, 0xcc, 0x7f, 0xdf, 0xd9, 0xef, + 0x3b, 0xbc, 0x3d, 0x98, 0x1b, 0x7f, 0xa1, 0x58, 0xb2, 0x33, 0x5c, 0x82, 0x09, 0x79, 0xc0, 0xdd, 0xd4, 0xb2, 0x4c, + 0x10, 0xd8, 0x5a, 0x02, 0xc4, 0xf9, 0x7c, 0x1a, 0x57, 0xbc, 0x1a, 0x02, 0xee, 0xd3, 0xbb, 0xb6, 0x57, 0xa9, 0xc0, + 0x63, 0x82, 0x46, 0xc4, 0xc4, 0xb6, 0x31, 0x4f, 0x84, 0x01, 0x97, 0x47, 0x74, 0xa9, 0x27, 0x49, 0x80, 0x57, 0x35, + 0x2a, 0x6f, 0x53, 0xa4, 0xfc, 0x22, 0x41, 0x8e, 0x2f, 0xf6, 0x88, 0x2a, 0x06, 0xb0, 0x2a, 0x4b, 0xfa, 0x04, 0x52, + 0xcf, 0x0f, 0x26, 0xfa, 0x79, 0x13, 0x79, 0xec, 0x63, 0xb9, 0x9f, 0x99, 0x9e, 0x16, 0x72, 0x31, 0x99, 0x82, 0x0f, + 0x2d, 0xb0, 0x0c, 0x85, 0xa9, 0x57, 0xd9, 0xfa, 0xd7, 0x24, 0x37, 0x01, 0x14, 0x4e, 0x37, 0x65, 0x42, 0x33, 0xbd, + 0xa0, 0xb9, 0xb1, 0x24, 0xe5, 0x62, 0xf2, 0x48, 0xde, 0xbe, 0x04, 0xec, 0xa6, 0x44, 0x37, 0x76, 0xe4, 0xbd, 0x85, + 0x1d, 0x80, 0x33, 0xc2, 0x76, 0x55, 0x7c, 0xa8, 0x40, 0xe7, 0x8f, 0x73, 0xc2, 0x76, 0x55, 0x7d, 0xc2, 0x6c, 0xf6, + 0x94, 0x6c, 0x0c, 0xb7, 0x17, 0x67, 0x8d, 0x1c, 0x1d, 0x75, 0xd2, 0xbc, 0xeb, 0x89, 0x81, 0x05, 0x68, 0x00, 0xdc, + 0xad, 0xed, 0x59, 0xde, 0xdd, 0x10, 0xd0, 0xbb, 0x64, 0xd2, 0x5e, 0x97, 0x9b, 0x94, 0xd5, 0xaa, 0x53, 0x51, 0xc1, + 0x02, 0x4f, 0x83, 0xbd, 0x40, 0xed, 0xd7, 0x0e, 0x8a, 0x73, 0x95, 0x6d, 0x9a, 0x9e, 0x97, 0x7d, 0x77, 0x77, 0x2c, + 0x32, 0xb6, 0x69, 0x6f, 0x77, 0x10, 0x09, 0xcb, 0x09, 0xeb, 0x80, 0x13, 0xae, 0x6a, 0x07, 0x04, 0xe8, 0x3a, 0x10, + 0xb9, 0xb1, 0x24, 0xcb, 0x75, 0x65, 0x74, 0x1f, 0xf8, 0xdd, 0x52, 0x22, 0xdd, 0x68, 0x4b, 0x82, 0xe9, 0x13, 0x8c, + 0x9a, 0xce, 0xbc, 0xef, 0x5c, 0x7b, 0xba, 0x78, 0x53, 0xb4, 0xf5, 0x0f, 0x29, 0x63, 0xb3, 0x3d, 0x4c, 0x0c, 0x65, + 0x10, 0x03, 0xbd, 0x8f, 0x78, 0xb7, 0xd1, 0xc8, 0x10, 0x28, 0x64, 0xb2, 0x01, 0x96, 0x89, 0xd7, 0xa2, 0x1f, 0x1c, + 0x18, 0x78, 0x54, 0x09, 0x08, 0x53, 0x10, 0x42, 0xc2, 0xae, 0x0d, 0xc2, 0x86, 0xcb, 0x55, 0xcb, 0x85, 0x8d, 0x54, + 0x1b, 0x3a, 0xf8, 0x7f, 0x85, 0xcb, 0x56, 0xcf, 0x2c, 0x17, 0xc5, 0xe0, 0x66, 0x6e, 0xc0, 0x22, 0x41, 0x7a, 0xb4, + 0xd9, 0x1e, 0x8a, 0xbb, 0x73, 0xb1, 0xd9, 0x10, 0x90, 0x98, 0xc3, 0x04, 0x45, 0xc3, 0xb9, 0x31, 0xc6, 0x2a, 0xa9, + 0xb4, 0xac, 0x35, 0x89, 0x39, 0xf0, 0xa5, 0x0b, 0xd7, 0x7d, 0x79, 0x9b, 0x32, 0x7c, 0x97, 0x0a, 0x7c, 0x03, 0x9e, + 0x34, 0xa9, 0xc4, 0xee, 0xf1, 0x82, 0x62, 0x4d, 0x74, 0xd7, 0xb3, 0xb7, 0x05, 0xac, 0xb3, 0xd9, 0x23, 0x22, 0xf8, + 0x5d, 0xfd, 0x6a, 0x83, 0xef, 0x16, 0xfe, 0x0a, 0xd6, 0xcf, 0xc1, 0x49, 0x8a, 0x45, 0x43, 0x36, 0x0b, 0x77, 0x64, + 0x40, 0xb9, 0x8a, 0x5f, 0x0e, 0x53, 0xb7, 0x8a, 0xe1, 0xda, 0xc7, 0x57, 0xfc, 0x61, 0xa3, 0xdd, 0x86, 0x2a, 0x8b, + 0xdb, 0xbd, 0x29, 0x1a, 0xb2, 0x6a, 0x7a, 0x47, 0xe6, 0x46, 0x4a, 0xfd, 0xeb, 0x03, 0x6e, 0x6d, 0xb5, 0xef, 0xa7, + 0xf9, 0xd6, 0xa3, 0x73, 0xd5, 0xb4, 0x4f, 0xad, 0x15, 0xc1, 0xc1, 0xcf, 0x16, 0x6e, 0x6e, 0x0d, 0x38, 0x80, 0x9f, + 0xbf, 0xa3, 0x79, 0x9c, 0x41, 0x74, 0x7a, 0xab, 0x19, 0x5f, 0xc5, 0x7f, 0x8e, 0x1a, 0x71, 0x2f, 0xfd, 0x33, 0xf9, + 0x73, 0xd4, 0x40, 0x3d, 0x14, 0xcf, 0x6f, 0x57, 0x6c, 0xb6, 0x82, 0x60, 0x6b, 0xf7, 0x8e, 0xf0, 0xeb, 0xb0, 0x24, + 0xd7, 0x34, 0xe7, 0xd9, 0xca, 0xbd, 0xaa, 0xb7, 0x72, 0x4f, 0x0e, 0xad, 0xcc, 0x43, 0x51, 0xab, 0x58, 0x0e, 0x73, + 0x08, 0x2c, 0x1c, 0xef, 0x35, 0x7b, 0xfd, 0x56, 0xf3, 0xc1, 0xc0, 0xfe, 0x6b, 0x22, 0xdc, 0xa3, 0x5a, 0xc4, 0xb6, + 0x37, 0x1b, 0x5b, 0x3f, 0x06, 0xc3, 0x0e, 0x08, 0x05, 0x0e, 0x72, 0xe9, 0xe3, 0x0c, 0x59, 0xdf, 0x93, 0xd5, 0x8a, + 0xb9, 0x68, 0xd6, 0x4e, 0x83, 0x5f, 0xc6, 0x66, 0x3a, 0x6c, 0x27, 0x9d, 0xae, 0x17, 0x63, 0x49, 0x03, 0x22, 0x4d, + 0x63, 0x06, 0x81, 0xa4, 0x96, 0x86, 0xc3, 0x9a, 0xdf, 0x46, 0x69, 0x75, 0x7f, 0x04, 0x29, 0x3f, 0x44, 0x29, 0x3f, + 0x22, 0x10, 0x40, 0xdb, 0x32, 0x47, 0x65, 0x43, 0xde, 0x77, 0xe9, 0x9e, 0x71, 0x66, 0x68, 0xf0, 0xd5, 0xaa, 0x55, + 0x0d, 0x53, 0x14, 0xf5, 0x61, 0x2e, 0xd7, 0x58, 0x90, 0x37, 0xa0, 0x6b, 0x56, 0x44, 0xf4, 0x42, 0x57, 0x79, 0x78, + 0x54, 0x18, 0x4b, 0x02, 0x4e, 0xfa, 0x3d, 0xd1, 0x2b, 0xc8, 0xe5, 0xc3, 0x18, 0x7c, 0xcc, 0x30, 0xef, 0xeb, 0x7e, + 0x31, 0x18, 0xa0, 0xd4, 0x39, 0x9d, 0xa5, 0x26, 0xe2, 0x4a, 0xe0, 0x97, 0x5c, 0x80, 0x5f, 0xb2, 0x42, 0xac, 0x5f, + 0x0c, 0xc8, 0xbd, 0x2c, 0x96, 0xe0, 0x94, 0xbf, 0xc3, 0xe7, 0xf1, 0x61, 0x68, 0x60, 0x6a, 0x86, 0x65, 0x2e, 0xb2, + 0xc1, 0x62, 0xce, 0x5a, 0x02, 0xc1, 0xcd, 0x80, 0xbb, 0xd4, 0x86, 0x44, 0x63, 0x0d, 0x14, 0xdd, 0x46, 0xa1, 0x99, + 0xd1, 0xd3, 0xad, 0x36, 0xfa, 0x91, 0xc3, 0x0b, 0x73, 0x0d, 0x63, 0x11, 0xc8, 0x5c, 0xae, 0x7a, 0xec, 0x2f, 0x3f, + 0x6c, 0x56, 0x18, 0xbc, 0xc2, 0x98, 0xec, 0x94, 0x56, 0x89, 0x66, 0x7c, 0x95, 0x27, 0x8e, 0x21, 0xc8, 0xc4, 0x52, + 0xe9, 0x86, 0x63, 0xe2, 0x4a, 0xfa, 0x4c, 0x0c, 0xd9, 0x6e, 0x78, 0x66, 0x2e, 0x74, 0xb3, 0xfd, 0xc3, 0xb9, 0x9d, + 0x73, 0xc2, 0x8d, 0x56, 0xd2, 0x68, 0xa3, 0x9e, 0x19, 0xaa, 0xea, 0x82, 0xf9, 0x3d, 0x74, 0x5a, 0x5a, 0xec, 0x5c, + 0xbd, 0xbb, 0xe1, 0x13, 0x77, 0x65, 0xfc, 0x2d, 0x56, 0x85, 0x56, 0x64, 0xb8, 0xdd, 0x42, 0xde, 0x9c, 0xe9, 0xa1, + 0x57, 0xe4, 0x42, 0x75, 0xf8, 0x8b, 0xba, 0xc2, 0xbc, 0x7a, 0x19, 0x35, 0x84, 0x47, 0xbf, 0xd7, 0x19, 0x28, 0xff, + 0x60, 0x62, 0x32, 0x67, 0xc9, 0x0d, 0x2d, 0x44, 0xfc, 0xe3, 0x0b, 0x61, 0x62, 0x55, 0xed, 0xc1, 0x40, 0xf6, 0x4c, + 0xc5, 0x3d, 0xb8, 0x35, 0xe1, 0x63, 0xce, 0x46, 0xe9, 0x5e, 0xf4, 0x63, 0x43, 0x34, 0x7e, 0x8c, 0x7e, 0x04, 0x77, + 0x67, 0xf7, 0xc4, 0x62, 0x19, 0x17, 0xc2, 0xdf, 0x63, 0x3d, 0x2c, 0x55, 0xca, 0x58, 0x7b, 0xdd, 0x72, 0x78, 0x21, + 0xf5, 0x26, 0x8b, 0x1f, 0x3a, 0x62, 0x6d, 0x53, 0xb0, 0x0e, 0x29, 0x29, 0x3c, 0xbb, 0x62, 0x6e, 0xb5, 0x98, 0xbb, + 0xd4, 0x12, 0xfe, 0xfa, 0xea, 0x61, 0xa9, 0x82, 0x86, 0x83, 0xd0, 0x95, 0xb6, 0x90, 0x00, 0x03, 0x97, 0xd2, 0xa7, + 0xd3, 0x9d, 0x49, 0x64, 0x96, 0xc5, 0xf0, 0xee, 0x41, 0x05, 0xf3, 0xdf, 0xd9, 0x46, 0x58, 0x15, 0xb8, 0x5c, 0xa9, + 0xa2, 0x5e, 0x4a, 0x02, 0x01, 0xe8, 0x4b, 0xef, 0x41, 0x79, 0x51, 0x74, 0x1b, 0x0d, 0x09, 0x5a, 0x58, 0x6a, 0xae, + 0x55, 0x31, 0xdd, 0x0f, 0x9f, 0x06, 0x0c, 0x3e, 0xbc, 0x43, 0xda, 0xc6, 0xfb, 0x9c, 0x94, 0x50, 0xbb, 0x83, 0xf6, + 0xc1, 0x2a, 0x3b, 0x28, 0xff, 0x36, 0xa6, 0xc8, 0xe6, 0xf7, 0xd9, 0x0f, 0xd4, 0x75, 0x38, 0x70, 0x05, 0xab, 0x5e, + 0xca, 0x28, 0x18, 0xb0, 0x72, 0x0a, 0xd4, 0xde, 0x49, 0x46, 0xb3, 0x29, 0x03, 0x75, 0xbf, 0x2d, 0x5a, 0xcd, 0xed, + 0x49, 0xdd, 0x6f, 0xc8, 0x38, 0xfb, 0x08, 0xe3, 0xec, 0xa3, 0xc0, 0x8b, 0x45, 0x92, 0x3f, 0x64, 0xac, 0x71, 0xac, + 0x9a, 0x02, 0x1d, 0x75, 0x80, 0x3b, 0x03, 0x07, 0x1e, 0xb0, 0x45, 0x39, 0x38, 0xa0, 0xce, 0xe2, 0x9e, 0x36, 0x32, + 0xef, 0xed, 0x09, 0xb5, 0x8b, 0x58, 0xe0, 0x66, 0xcd, 0x4c, 0x0b, 0x5a, 0x2b, 0x8c, 0xf3, 0x78, 0xc0, 0xdb, 0x3c, + 0xab, 0xc5, 0x4f, 0xd8, 0xb0, 0xa6, 0xaa, 0xdf, 0x40, 0x73, 0x54, 0x0b, 0x72, 0xf3, 0xc4, 0x78, 0xab, 0x92, 0x7e, + 0x14, 0x0d, 0x2c, 0xa7, 0x42, 0x0c, 0xc9, 0xe8, 0xb7, 0x06, 0xc1, 0xad, 0xf6, 0x6a, 0xc5, 0x3d, 0xe2, 0x8b, 0x9a, + 0xb7, 0x9a, 0xb9, 0x05, 0xa0, 0x45, 0x1c, 0x95, 0xf7, 0x26, 0x11, 0x78, 0xdf, 0x96, 0x11, 0xd2, 0x96, 0x7d, 0xfb, + 0xfe, 0x63, 0xa9, 0xd8, 0x7c, 0x47, 0x27, 0x83, 0x34, 0xb2, 0x23, 0x8a, 0xf0, 0x75, 0x09, 0x49, 0xb8, 0x4a, 0xba, + 0x56, 0x99, 0x9c, 0x33, 0x95, 0x72, 0x7c, 0x5d, 0x48, 0xa9, 0xaf, 0xec, 0x97, 0xc4, 0xd5, 0x9d, 0x8c, 0xc0, 0xd7, + 0x13, 0xa6, 0xdf, 0xd1, 0x62, 0xc2, 0xc0, 0xaf, 0xc8, 0xdf, 0x8e, 0xa5, 0x94, 0x5c, 0x3e, 0x11, 0x71, 0x9f, 0x62, + 0x78, 0xbc, 0x74, 0x80, 0xb5, 0x09, 0x81, 0x52, 0xe2, 0x22, 0x5c, 0x10, 0xbd, 0x29, 0xe4, 0xed, 0x5d, 0x5c, 0x60, + 0xe7, 0x00, 0x58, 0x3a, 0x4d, 0x02, 0xfc, 0xcb, 0xc7, 0x7c, 0xac, 0xc6, 0x9c, 0x1a, 0x5d, 0xbf, 0xfb, 0x9d, 0x5c, + 0x03, 0xbd, 0x2d, 0x1d, 0x05, 0xfb, 0xad, 0x01, 0xe4, 0xc2, 0x5d, 0x18, 0x5c, 0x7c, 0x85, 0xb5, 0x65, 0x61, 0xbc, + 0xb1, 0x00, 0x7a, 0x7f, 0x67, 0x60, 0xc1, 0x86, 0x39, 0xa6, 0xf0, 0xf2, 0xeb, 0x84, 0xe9, 0x20, 0x2a, 0xc8, 0x93, + 0xf2, 0x6d, 0xcf, 0x5a, 0xed, 0xb7, 0x6c, 0x0c, 0x77, 0x18, 0xc9, 0xb7, 0x0b, 0x27, 0x0e, 0x3c, 0x20, 0xd3, 0x64, + 0xb6, 0xd9, 0x37, 0x3e, 0xf2, 0xc8, 0xeb, 0x71, 0xbc, 0xab, 0xa5, 0x30, 0xdf, 0xac, 0xe8, 0x1a, 0x43, 0x28, 0x8a, + 0xb0, 0xdf, 0x2f, 0x2a, 0xa6, 0xa8, 0x32, 0x68, 0x83, 0x86, 0xe5, 0x8d, 0xf8, 0x05, 0xce, 0x18, 0x5a, 0x2f, 0x64, + 0xef, 0xe8, 0xac, 0xc3, 0x99, 0xc3, 0x8c, 0x29, 0x81, 0x51, 0x69, 0x59, 0xd0, 0x09, 0x38, 0x3a, 0x57, 0x1f, 0x44, + 0xc5, 0xd5, 0xb1, 0x02, 0xf0, 0x24, 0x53, 0xf8, 0x27, 0xdf, 0x04, 0xeb, 0x7e, 0xab, 0x66, 0x98, 0xfa, 0x8b, 0xde, + 0x76, 0x2d, 0x5f, 0x86, 0x38, 0xd2, 0xc6, 0x10, 0x5a, 0xe7, 0xf6, 0x0e, 0x50, 0xc4, 0x05, 0xbd, 0x48, 0x35, 0xbe, + 0x56, 0x8b, 0xa1, 0x59, 0x5f, 0xe3, 0x3a, 0xa6, 0x0d, 0xa2, 0x58, 0x77, 0x4d, 0x7c, 0x5d, 0x3d, 0xa5, 0xaa, 0x52, + 0x05, 0x67, 0x90, 0x40, 0x58, 0x95, 0x97, 0x0d, 0xa9, 0x24, 0x97, 0xa6, 0x53, 0x69, 0x3a, 0xad, 0x10, 0xca, 0xa5, + 0x27, 0xe5, 0xfd, 0x2b, 0x84, 0x30, 0x30, 0x65, 0x76, 0x60, 0x95, 0xda, 0xc2, 0x2a, 0x78, 0xf5, 0x62, 0x03, 0xab, + 0x24, 0x1c, 0xcf, 0x25, 0x1a, 0x15, 0x15, 0x0e, 0x19, 0xd2, 0x17, 0x62, 0x11, 0x24, 0x00, 0x16, 0xbd, 0xcb, 0x5c, + 0xde, 0xf7, 0x70, 0x28, 0xec, 0x49, 0x26, 0xe1, 0x74, 0x13, 0x9a, 0xc3, 0x1b, 0xbb, 0xaa, 0xe7, 0x11, 0x02, 0x96, + 0x9e, 0x63, 0x78, 0x5b, 0xf9, 0xfb, 0x6f, 0xba, 0x3a, 0x0b, 0xf2, 0xf4, 0x5f, 0xa2, 0x24, 0x34, 0xf6, 0x9f, 0xe3, + 0xa1, 0x43, 0xc2, 0x70, 0xe0, 0x9b, 0x23, 0xac, 0x70, 0x70, 0xab, 0x88, 0xcf, 0xe0, 0x0e, 0x1f, 0xeb, 0xd0, 0x03, + 0xc0, 0x12, 0x8a, 0x43, 0x90, 0x6f, 0xa0, 0x98, 0xc1, 0x01, 0x4d, 0x96, 0xe1, 0x05, 0x2e, 0x58, 0x2d, 0x94, 0xf7, + 0xb7, 0x2d, 0x2f, 0xa5, 0xd5, 0x2e, 0x79, 0x8d, 0x39, 0x50, 0xf9, 0x19, 0x5e, 0xf8, 0x0a, 0xf3, 0xe8, 0xb3, 0xfb, + 0xc2, 0xd7, 0x0e, 0xe8, 0x29, 0x04, 0x8c, 0x74, 0xbf, 0xd7, 0x84, 0x7b, 0x8a, 0x5e, 0xe6, 0xe2, 0xb0, 0xed, 0xa0, + 0x7b, 0x81, 0xb9, 0xba, 0xaa, 0xb2, 0xe6, 0x60, 0x0a, 0x0d, 0x0e, 0xaa, 0x70, 0x46, 0x60, 0xae, 0x5e, 0x94, 0x05, + 0xe7, 0x20, 0xde, 0xf7, 0x84, 0xc9, 0x29, 0xa3, 0x01, 0xbc, 0xc8, 0xca, 0x47, 0xa7, 0x7a, 0x1c, 0x5c, 0xc6, 0x0d, + 0x9b, 0xf8, 0x42, 0xf8, 0x54, 0x60, 0x25, 0xad, 0x71, 0x68, 0x44, 0x47, 0x74, 0x0e, 0x66, 0x1b, 0x40, 0xc1, 0xdd, + 0xf9, 0xb0, 0xb1, 0x50, 0xc1, 0xbb, 0xb6, 0xb5, 0x67, 0xa8, 0x09, 0x71, 0x26, 0x4d, 0xc1, 0xdd, 0xb6, 0x41, 0x06, + 0x6f, 0x7e, 0xfb, 0x6f, 0x85, 0x45, 0x82, 0x01, 0x95, 0x9a, 0x24, 0x08, 0x4f, 0x50, 0x1a, 0xe9, 0x56, 0x6e, 0x26, + 0x90, 0x4e, 0x44, 0xcd, 0xa8, 0x7b, 0xe3, 0x7c, 0x75, 0xd4, 0x40, 0x54, 0xd4, 0x40, 0x05, 0xd4, 0x40, 0xd6, 0xb7, + 0x7f, 0x01, 0x0b, 0x61, 0x23, 0x54, 0x89, 0x20, 0x20, 0xc2, 0x5c, 0x1b, 0x3e, 0xa0, 0x48, 0x42, 0xc8, 0x1b, 0x40, + 0xc5, 0x94, 0xbc, 0x04, 0xa3, 0x71, 0x78, 0xbd, 0x07, 0xdc, 0x2f, 0x2d, 0xc3, 0xe0, 0x39, 0x05, 0x93, 0xff, 0xd6, + 0xe7, 0x43, 0xf5, 0x72, 0x75, 0x10, 0xc2, 0x2f, 0x20, 0x56, 0x84, 0xe3, 0x2f, 0x7e, 0x01, 0xb2, 0xa9, 0xb0, 0x3c, + 0x38, 0x90, 0x20, 0xf0, 0x43, 0x14, 0xe1, 0x80, 0x67, 0x78, 0x99, 0x6d, 0x10, 0x3d, 0x3f, 0x2b, 0x55, 0xcd, 0x4a, + 0x06, 0xb3, 0x2a, 0x3c, 0x8d, 0xa3, 0x6b, 0xc2, 0x40, 0x70, 0xa1, 0x76, 0xdf, 0x20, 0x04, 0xca, 0x96, 0x1b, 0x43, + 0x97, 0x9e, 0x82, 0xf9, 0x68, 0x1c, 0xbd, 0x65, 0xf0, 0x3a, 0xaf, 0x31, 0xf9, 0x67, 0x9a, 0x65, 0xda, 0x30, 0x8f, + 0x8d, 0xc0, 0x49, 0x9d, 0xa2, 0xe4, 0x6f, 0xc9, 0x45, 0x1c, 0x35, 0x2f, 0x23, 0xd4, 0x80, 0x7f, 0x1b, 0x1c, 0x75, + 0x69, 0x42, 0x47, 0x23, 0x1f, 0xfc, 0x26, 0x23, 0x66, 0x93, 0xad, 0x56, 0xa2, 0x22, 0xe8, 0x89, 0xdd, 0x60, 0xc0, + 0x4a, 0xbc, 0x00, 0xf6, 0xc1, 0x72, 0xb0, 0xe4, 0x9d, 0x88, 0x95, 0x3f, 0xa5, 0x30, 0x58, 0x3d, 0x67, 0x08, 0xe1, + 0x2c, 0x88, 0xd9, 0xf8, 0x9f, 0xcf, 0x34, 0x5c, 0x3f, 0x3f, 0x5f, 0xc7, 0x88, 0x48, 0x1f, 0x44, 0xae, 0xc6, 0x8e, + 0x88, 0x20, 0x6c, 0x99, 0xee, 0xbb, 0x32, 0x3f, 0x78, 0xeb, 0xea, 0x81, 0x0d, 0x17, 0x07, 0x06, 0xd4, 0x28, 0x30, + 0x5a, 0xc1, 0x39, 0x29, 0x07, 0x0e, 0x4a, 0x08, 0xcd, 0x8a, 0x78, 0x4a, 0x2e, 0x21, 0x12, 0x5e, 0x86, 0xba, 0x60, + 0x58, 0x10, 0x48, 0x50, 0x53, 0x90, 0xa0, 0x32, 0x5f, 0x7b, 0x04, 0xb3, 0xce, 0xcd, 0x6c, 0xa7, 0xa8, 0xeb, 0x82, + 0xfc, 0xfc, 0xa2, 0xe3, 0x11, 0xb0, 0xb4, 0x07, 0x07, 0x05, 0x44, 0x10, 0x03, 0x0a, 0x5e, 0x4a, 0x80, 0x81, 0x06, + 0xbc, 0xd8, 0xd0, 0x80, 0xcf, 0xb5, 0xf1, 0x3a, 0x30, 0xb6, 0x3e, 0x65, 0x90, 0x8b, 0x67, 0xd5, 0x9e, 0x26, 0x84, + 0xec, 0xb7, 0x7a, 0x3a, 0xdd, 0x8e, 0x90, 0xd8, 0xfb, 0xa8, 0x4d, 0xa0, 0x31, 0x47, 0xba, 0xab, 0x8d, 0xf9, 0xb5, + 0xa6, 0x47, 0xac, 0x26, 0x21, 0x5d, 0x90, 0x2e, 0xcf, 0xa7, 0x3d, 0x83, 0x2b, 0x56, 0x69, 0xe4, 0xe0, 0x02, 0xf4, + 0xd9, 0x80, 0x00, 0x05, 0x2a, 0x4d, 0x25, 0x8a, 0x22, 0x2e, 0x92, 0x92, 0x0d, 0xc3, 0x0c, 0xc2, 0x14, 0x56, 0x2b, + 0x41, 0x37, 0xd6, 0x00, 0x78, 0x67, 0x66, 0xff, 0x94, 0x3e, 0xd8, 0x74, 0xed, 0xcd, 0x23, 0x80, 0x80, 0xec, 0xb7, + 0x4b, 0x76, 0x5d, 0x6c, 0x54, 0x66, 0x61, 0x2d, 0x63, 0x2b, 0xb7, 0xed, 0x31, 0xf6, 0x4e, 0x6c, 0xf3, 0x09, 0x10, + 0xa2, 0xb6, 0x64, 0x1a, 0x21, 0x42, 0x62, 0x11, 0xeb, 0xda, 0x90, 0x8d, 0x36, 0xb4, 0x6f, 0x5e, 0xb7, 0x87, 0xd8, + 0x07, 0xa0, 0x78, 0x73, 0x5c, 0x82, 0x43, 0x78, 0xe1, 0x11, 0xfe, 0x16, 0x58, 0xa4, 0x02, 0x33, 0x2c, 0x57, 0x2b, + 0xa8, 0xe7, 0xf1, 0x3e, 0xdb, 0x0c, 0x4e, 0x2a, 0x37, 0xc6, 0x2e, 0xed, 0xc4, 0xe3, 0xb2, 0x09, 0x89, 0x33, 0xe8, + 0xd7, 0x57, 0x44, 0xbd, 0xfd, 0x76, 0xfa, 0xc4, 0xbf, 0x57, 0xe6, 0x76, 0x20, 0x36, 0xac, 0x37, 0x58, 0x7d, 0x00, + 0x2d, 0x7f, 0x95, 0xf9, 0x87, 0xca, 0x82, 0x9b, 0x04, 0xb5, 0xb9, 0x88, 0x5d, 0xd6, 0x45, 0x8c, 0xd4, 0x16, 0x77, + 0x87, 0x10, 0xff, 0x6a, 0x2b, 0x8a, 0x01, 0x4f, 0x2a, 0xfe, 0x39, 0x46, 0x5d, 0x08, 0x45, 0x6d, 0x3d, 0x6c, 0x80, + 0xd2, 0x2e, 0xd7, 0x95, 0x18, 0x19, 0x12, 0xc8, 0xb7, 0x2e, 0xbc, 0xa0, 0x39, 0x89, 0x14, 0xc8, 0xc9, 0x41, 0x54, + 0xd2, 0x6c, 0x43, 0x98, 0xeb, 0x6e, 0xe1, 0x98, 0xb9, 0xda, 0xa0, 0x45, 0xfc, 0x02, 0xd8, 0x19, 0x6e, 0x24, 0x4b, + 0x07, 0x3e, 0x55, 0x03, 0x9f, 0x5f, 0x73, 0x43, 0x51, 0x14, 0xea, 0xbd, 0xb3, 0x8f, 0xcc, 0xc1, 0xef, 0x34, 0x10, + 0x1f, 0xa9, 0xd3, 0x91, 0x6c, 0x84, 0x5a, 0x73, 0x76, 0xbc, 0x6c, 0x33, 0xc2, 0xa0, 0xb0, 0xd1, 0xfb, 0x2a, 0x64, + 0x15, 0x3b, 0x3b, 0x15, 0xc1, 0x9c, 0xbe, 0xa8, 0xca, 0x39, 0x95, 0x5b, 0x46, 0xb5, 0xd4, 0x34, 0x40, 0x84, 0x2b, + 0x9f, 0x48, 0xde, 0x67, 0x26, 0xfc, 0x83, 0xc1, 0xb8, 0x7a, 0xa4, 0xf0, 0xf7, 0xbb, 0x62, 0x87, 0x6c, 0x47, 0x87, + 0xdb, 0x08, 0x9a, 0x17, 0x2a, 0x78, 0xc0, 0x51, 0xc9, 0x12, 0x22, 0x45, 0x2e, 0xf7, 0x55, 0xcd, 0x94, 0xed, 0x3a, + 0x42, 0x08, 0x69, 0x8f, 0xb3, 0x6e, 0x68, 0xf5, 0xd0, 0x23, 0x55, 0x94, 0xc3, 0x2d, 0x9a, 0xeb, 0x02, 0x54, 0x18, + 0x81, 0x74, 0xf9, 0x99, 0xdd, 0xa5, 0x12, 0xa2, 0x97, 0xaf, 0x5d, 0x08, 0x63, 0x67, 0x65, 0x89, 0x0b, 0x33, 0x6a, + 0x1b, 0x46, 0xd7, 0x6d, 0x0c, 0x67, 0x03, 0x63, 0xa6, 0x41, 0x49, 0x0b, 0x42, 0x5d, 0x77, 0xe9, 0x45, 0x66, 0x02, + 0x3d, 0xe6, 0x84, 0x36, 0x18, 0x9e, 0x12, 0x0d, 0x96, 0x4d, 0x05, 0x58, 0xf0, 0x2d, 0x8b, 0xd4, 0xda, 0x6c, 0xb2, + 0xf8, 0xa3, 0x8e, 0xcd, 0xd3, 0x7e, 0x79, 0xc5, 0x3c, 0x17, 0x8e, 0xba, 0x3d, 0xcf, 0x7c, 0x3c, 0xba, 0xa7, 0x6f, + 0xae, 0x5e, 0xbc, 0x7c, 0xfd, 0x6a, 0xb5, 0x6a, 0xb3, 0x66, 0xfb, 0x04, 0xff, 0xa4, 0xcb, 0x78, 0xb0, 0x65, 0x14, + 0xa0, 0x83, 0x83, 0x7d, 0x6e, 0x5c, 0x78, 0x3e, 0xf3, 0x39, 0xc4, 0x0d, 0xd2, 0x03, 0x9c, 0x15, 0x65, 0x4c, 0x90, + 0xdb, 0xa8, 0x17, 0xdd, 0x45, 0xa0, 0x84, 0xaa, 0xc8, 0xdf, 0x87, 0xcd, 0xd9, 0xef, 0x41, 0x60, 0x22, 0xa8, 0x0f, + 0x11, 0x40, 0x20, 0x5e, 0x29, 0x2e, 0x08, 0xf3, 0x09, 0x10, 0xc5, 0x7b, 0x01, 0x9c, 0xa9, 0x89, 0x5a, 0xb5, 0x50, + 0x71, 0x01, 0x24, 0xd1, 0x86, 0xa3, 0xa4, 0x47, 0x26, 0x80, 0x37, 0x04, 0xa5, 0xb4, 0xbf, 0xba, 0xb9, 0x73, 0x97, + 0xca, 0x51, 0xaf, 0x95, 0xe6, 0x78, 0xea, 0x3e, 0xa7, 0xf0, 0x39, 0xed, 0xfa, 0xd3, 0x41, 0x1c, 0xe6, 0x78, 0x41, + 0xc4, 0xa1, 0x7f, 0x16, 0x71, 0x39, 0x2f, 0xd8, 0x17, 0x2e, 0x17, 0x2a, 0x5d, 0xde, 0xa6, 0x32, 0xb9, 0x6d, 0x8e, + 0x0e, 0xe3, 0x22, 0xb9, 0x6d, 0xaa, 0xe4, 0x16, 0xe1, 0xbb, 0x54, 0x26, 0x77, 0x36, 0xe5, 0xae, 0xa9, 0xe0, 0xe6, + 0x0b, 0x0b, 0x38, 0x14, 0x6d, 0xd1, 0xc6, 0x62, 0xb3, 0xa8, 0x4d, 0x71, 0x45, 0x03, 0x0c, 0xfe, 0x7d, 0xc7, 0xc6, + 0x0f, 0xc3, 0x97, 0xe0, 0xd2, 0xa4, 0x89, 0xfc, 0x04, 0xd2, 0x4f, 0xab, 0x32, 0x70, 0x9f, 0x92, 0x56, 0x77, 0x7a, + 0x21, 0x9a, 0xed, 0x6e, 0xa3, 0x31, 0x85, 0xbd, 0x9b, 0x91, 0xdc, 0x17, 0x9b, 0x36, 0x4c, 0x7c, 0x9d, 0xfd, 0x6c, + 0xb5, 0xda, 0xcf, 0x91, 0xd9, 0x70, 0x13, 0x16, 0xeb, 0xfe, 0x74, 0x80, 0x5b, 0xf8, 0x79, 0x86, 0xd0, 0x92, 0xf5, + 0xa7, 0x03, 0xc2, 0xfa, 0xd3, 0x46, 0x7b, 0x60, 0x0d, 0xed, 0xcc, 0x56, 0x5c, 0x43, 0x08, 0xcd, 0xe9, 0xe0, 0xc8, + 0x94, 0x94, 0x2e, 0xdf, 0x7e, 0xd1, 0x2a, 0xa0, 0x9f, 0xaa, 0x05, 0x2f, 0x93, 0xb8, 0x03, 0x7d, 0xd1, 0x0b, 0xfb, + 0x74, 0x6b, 0x41, 0x8e, 0x8f, 0x2a, 0x57, 0x7b, 0x8a, 0xb0, 0xe9, 0x49, 0x1d, 0x16, 0x87, 0xa6, 0x19, 0xd7, 0xa5, + 0x74, 0xdf, 0xa1, 0x66, 0xe4, 0xa3, 0x83, 0x05, 0x20, 0x48, 0x05, 0x8f, 0xac, 0x70, 0xe1, 0x94, 0x42, 0xb8, 0x38, + 0xa8, 0x6c, 0xc1, 0x24, 0x27, 0xad, 0x6e, 0x6e, 0x2c, 0xfd, 0x73, 0x17, 0xd1, 0x94, 0x62, 0x4a, 0x32, 0x5f, 0x32, + 0x37, 0x60, 0xa1, 0x9b, 0x94, 0x67, 0x0a, 0x7a, 0xa5, 0x01, 0x1e, 0x11, 0x88, 0x87, 0xd4, 0x2d, 0x8c, 0x81, 0x57, + 0x3c, 0x6d, 0x16, 0x7d, 0x36, 0x40, 0x47, 0xc7, 0x98, 0xf6, 0xff, 0xca, 0xe6, 0x6d, 0x78, 0x2c, 0xf0, 0xaf, 0x01, + 0x99, 0x36, 0x65, 0x99, 0x20, 0x20, 0x61, 0xd4, 0x94, 0x87, 0xb0, 0x97, 0x10, 0xce, 0x6c, 0xc5, 0xac, 0xcf, 0x06, + 0xcd, 0x69, 0x59, 0xb1, 0xe3, 0x2b, 0x36, 0x64, 0x99, 0x60, 0x2b, 0x36, 0x5c, 0xc5, 0xf0, 0x75, 0x06, 0x03, 0x82, + 0x10, 0x00, 0x0c, 0x00, 0xa0, 0x51, 0x10, 0xcd, 0x17, 0x2b, 0xe2, 0x37, 0xbb, 0xbd, 0xc7, 0x6f, 0x81, 0x05, 0x5a, + 0x6d, 0xff, 0xef, 0x42, 0x19, 0xb0, 0xa7, 0x2c, 0x4c, 0xcc, 0xdc, 0xc2, 0xaa, 0xe8, 0x00, 0x2a, 0x25, 0xc2, 0x14, + 0x06, 0x32, 0xfb, 0x99, 0x81, 0x5a, 0xa0, 0x35, 0xc8, 0xfb, 0x7a, 0xd0, 0xcc, 0xe0, 0x88, 0x81, 0x77, 0x68, 0xc8, + 0xd4, 0x18, 0x13, 0xc6, 0x39, 0x4c, 0x31, 0x33, 0xe0, 0x99, 0xa6, 0xad, 0xb5, 0x34, 0xb2, 0x5c, 0x2f, 0xef, 0xfd, + 0xa3, 0x63, 0xd5, 0x2f, 0x9a, 0xed, 0x01, 0xda, 0x27, 0xc4, 0x7e, 0x0c, 0x60, 0x93, 0xb9, 0xd4, 0x86, 0xf9, 0x3e, + 0xea, 0xa4, 0xf6, 0x13, 0xfe, 0x0c, 0xd6, 0x66, 0x07, 0x80, 0x8e, 0x0c, 0x9b, 0xf5, 0x97, 0x35, 0x95, 0xd7, 0xc7, + 0x9d, 0x51, 0x2a, 0x77, 0xbd, 0x3b, 0x1d, 0x68, 0x8a, 0x43, 0x6f, 0x3d, 0x5c, 0x3e, 0xd4, 0x43, 0xc0, 0x8c, 0xc1, + 0xdc, 0x32, 0xa3, 0xef, 0x85, 0x48, 0x2e, 0x88, 0xc4, 0xd2, 0x60, 0x0d, 0x83, 0xbd, 0x75, 0x70, 0x60, 0xaa, 0xb1, + 0x06, 0x3c, 0x4f, 0x8a, 0x40, 0x30, 0xf0, 0x11, 0x94, 0x01, 0x4d, 0x94, 0xb9, 0x0d, 0x27, 0x1f, 0x99, 0xfb, 0x85, + 0xcb, 0xdb, 0xc7, 0xc2, 0x69, 0x5b, 0xcd, 0xf5, 0x78, 0x59, 0xe0, 0xae, 0xbc, 0x97, 0xb4, 0x0a, 0x6e, 0x64, 0x6f, + 0xf2, 0x94, 0xb9, 0x5b, 0xf7, 0xa5, 0x3a, 0xbb, 0x9b, 0xe9, 0x94, 0xcd, 0x74, 0xb6, 0x9b, 0x09, 0x35, 0x33, 0xdf, + 0xb2, 0x8a, 0x34, 0x27, 0x6b, 0xa2, 0xe6, 0x54, 0xfc, 0x44, 0xe7, 0xa0, 0x1d, 0xe5, 0xf6, 0x5e, 0x15, 0x4e, 0xae, + 0x9c, 0x5c, 0xee, 0xe7, 0x86, 0xb8, 0x22, 0x73, 0xa1, 0x0e, 0x01, 0x5e, 0x5e, 0x94, 0x8f, 0x0f, 0x70, 0x29, 0x7e, + 0x95, 0x23, 0x17, 0xe5, 0x54, 0x48, 0x2d, 0x05, 0x8b, 0x90, 0x41, 0x55, 0x17, 0x03, 0x7b, 0x69, 0xf7, 0x9e, 0xe8, + 0xf1, 0x7e, 0x15, 0x31, 0x6f, 0x60, 0x9e, 0xfb, 0xf8, 0x9e, 0xa6, 0xd8, 0xa9, 0x89, 0x33, 0xf2, 0x21, 0x8b, 0x73, + 0x90, 0xcd, 0xfa, 0xd5, 0x6b, 0xbf, 0x8d, 0x36, 0x2e, 0x9a, 0xb1, 0xe8, 0x99, 0x27, 0x4e, 0x7e, 0x28, 0x8c, 0x71, + 0x80, 0x75, 0xf4, 0x47, 0x98, 0x5a, 0xb0, 0x67, 0x89, 0xa7, 0xd0, 0xc9, 0xad, 0x4d, 0xbb, 0x0b, 0xd3, 0xee, 0x4c, + 0x5a, 0x07, 0xca, 0x01, 0x69, 0x76, 0x65, 0x3a, 0x77, 0xfe, 0xfb, 0x0e, 0x5e, 0xba, 0x5d, 0x43, 0x24, 0xee, 0xf9, + 0x23, 0x63, 0x0c, 0xf1, 0x06, 0x6c, 0x44, 0xd5, 0xc1, 0xc1, 0x1f, 0xce, 0xfb, 0xb6, 0x92, 0xfb, 0xbe, 0x15, 0x0e, + 0x6c, 0x83, 0xa9, 0x74, 0x79, 0x23, 0x99, 0x2d, 0xc0, 0xae, 0x73, 0xff, 0x1b, 0xf1, 0xf0, 0x45, 0xc8, 0xb4, 0x58, + 0x57, 0xf1, 0x57, 0x72, 0x54, 0x7a, 0x88, 0x6a, 0x88, 0x40, 0x5a, 0x59, 0x97, 0x86, 0xa6, 0xa3, 0x57, 0x53, 0x3a, + 0x92, 0x37, 0x6f, 0xa5, 0xd4, 0x03, 0xfb, 0x22, 0xb7, 0x4e, 0xe0, 0xd1, 0xc2, 0x1a, 0x43, 0x73, 0x57, 0x7a, 0x27, + 0xd9, 0x80, 0xa8, 0xf5, 0x71, 0x87, 0x92, 0x48, 0x2c, 0xaa, 0xbb, 0x10, 0x0e, 0x77, 0x21, 0x98, 0x97, 0x41, 0xdb, + 0x20, 0x76, 0xbb, 0x0b, 0xda, 0x06, 0x4e, 0xdd, 0x36, 0x70, 0x7b, 0x30, 0x58, 0xd8, 0xfb, 0xf0, 0x72, 0x2c, 0xc7, + 0xc2, 0x5f, 0x93, 0xd9, 0x07, 0x80, 0x40, 0xed, 0xc3, 0x8a, 0x27, 0x0e, 0x04, 0x89, 0x33, 0x1c, 0x7d, 0xcf, 0xd9, + 0x8d, 0xb5, 0x1c, 0x9e, 0xcd, 0x17, 0x9a, 0x8d, 0xcc, 0x1d, 0x35, 0xa8, 0xf8, 0xea, 0x7e, 0x5e, 0x3f, 0x65, 0x35, + 0xdd, 0xf8, 0x3d, 0x08, 0x23, 0xe1, 0x94, 0x1d, 0x46, 0x21, 0x61, 0x83, 0x59, 0x95, 0xf1, 0xda, 0x7e, 0x83, 0x78, + 0x0f, 0xda, 0x84, 0x13, 0x2c, 0x6a, 0x17, 0x54, 0x11, 0xb6, 0xf1, 0xc6, 0x82, 0x28, 0x0f, 0x6f, 0xb6, 0x8c, 0xa6, + 0x97, 0x6b, 0x08, 0x74, 0xdc, 0x8b, 0x9a, 0x51, 0x83, 0xa5, 0x2e, 0x28, 0xb3, 0x8f, 0x30, 0xae, 0x2e, 0x4e, 0x4c, + 0x9c, 0xf6, 0x52, 0xaf, 0xfe, 0x5b, 0x06, 0x06, 0xf8, 0x02, 0xbc, 0xc4, 0xc2, 0xe8, 0xae, 0x7d, 0xdd, 0x80, 0xfa, + 0xb2, 0xc1, 0x06, 0x68, 0xb5, 0x6a, 0x95, 0xcf, 0x40, 0xb9, 0x6b, 0x2e, 0x61, 0xaf, 0xb9, 0x84, 0xbb, 0xe6, 0x12, + 0xfe, 0x9a, 0x4b, 0x98, 0x6b, 0x2e, 0xe1, 0xaf, 0xb9, 0x3c, 0x08, 0x3f, 0x05, 0x71, 0x1c, 0x63, 0x0e, 0x71, 0x15, + 0xb5, 0x8d, 0x8c, 0x07, 0x17, 0x9e, 0xfb, 0x2c, 0x51, 0xe5, 0xf2, 0x87, 0x31, 0xe4, 0xb6, 0x6c, 0x25, 0x8c, 0xdb, + 0x14, 0x53, 0x10, 0x39, 0xfd, 0xe0, 0xa0, 0x74, 0x77, 0x06, 0x1f, 0xf5, 0x94, 0xe3, 0xa5, 0x75, 0xa2, 0xfd, 0x03, + 0x74, 0xf2, 0xe6, 0xd7, 0xc7, 0x54, 0xae, 0x89, 0x70, 0x26, 0xf7, 0xfb, 0x6d, 0x4f, 0x29, 0x3e, 0x65, 0x26, 0x3c, + 0x39, 0x4f, 0xb4, 0x11, 0x41, 0x10, 0xa2, 0x44, 0xe1, 0x8c, 0x48, 0xbb, 0xdf, 0xbd, 0x2b, 0xbc, 0x51, 0x45, 0x79, + 0xb3, 0x92, 0xc7, 0x39, 0x38, 0xb1, 0x1b, 0x2b, 0x0c, 0xd4, 0x05, 0x17, 0x82, 0xcc, 0x24, 0xfc, 0xd1, 0xcc, 0x2d, + 0x39, 0xcb, 0xca, 0xa4, 0x8f, 0xcd, 0xdc, 0x10, 0xb0, 0x82, 0xec, 0x7b, 0x98, 0x2d, 0x6f, 0x53, 0x8a, 0xef, 0xd2, + 0x0c, 0x0f, 0xe5, 0x6d, 0x5a, 0x84, 0xb6, 0x20, 0xfe, 0xe2, 0xef, 0xff, 0x65, 0xef, 0x5d, 0x9b, 0xdb, 0x36, 0xb2, + 0x76, 0xd1, 0xbf, 0x22, 0xb1, 0x6c, 0x06, 0x30, 0x9b, 0x14, 0xe5, 0xbd, 0x67, 0xaa, 0x0e, 0xa8, 0x16, 0xcb, 0xb1, + 0xe3, 0x89, 0x33, 0xf1, 0x65, 0x2c, 0x4f, 0x26, 0x19, 0x16, 0x0f, 0x03, 0x01, 0x4d, 0x01, 0x0e, 0x08, 0x30, 0x00, + 0x28, 0x91, 0x26, 0xf1, 0xdf, 0x77, 0xad, 0xb5, 0xfa, 0x0a, 0x82, 0xb2, 0xe7, 0x7d, 0xf7, 0xfb, 0xe9, 0x9c, 0x2f, + 0xb6, 0xd8, 0x68, 0x34, 0xfa, 0xde, 0xab, 0xd7, 0xe5, 0x79, 0x96, 0x5e, 0x2f, 0x0f, 0x21, 0xde, 0xa7, 0x97, 0xe6, + 0x67, 0x69, 0x2b, 0x0a, 0x70, 0x1f, 0xa1, 0x47, 0x75, 0x20, 0xd8, 0x09, 0x4f, 0x78, 0x00, 0x27, 0xab, 0x59, 0xc5, + 0x9f, 0xa4, 0x20, 0x4e, 0x14, 0x1c, 0x02, 0xae, 0xb6, 0x37, 0xe9, 0x17, 0x30, 0x7c, 0xe9, 0x60, 0xcb, 0xe1, 0x6d, + 0xb1, 0xed, 0xb1, 0x92, 0x7f, 0x00, 0xf6, 0xad, 0x9e, 0x8c, 0xd5, 0xed, 0x81, 0xb3, 0x2e, 0xa5, 0xe8, 0x78, 0x53, + 0x1c, 0xde, 0x9e, 0xcf, 0xf6, 0xdb, 0x20, 0x62, 0xbb, 0x20, 0xc3, 0x5a, 0x27, 0x0d, 0xff, 0x89, 0xb6, 0x0e, 0x16, + 0x23, 0xec, 0xff, 0xb2, 0x1e, 0x78, 0x09, 0xa9, 0xa1, 0xc0, 0xc5, 0x60, 0xc3, 0xd1, 0xda, 0x2e, 0xd3, 0xc0, 0x4d, + 0x0d, 0x7a, 0x7d, 0x4f, 0x21, 0xca, 0x4b, 0x46, 0x73, 0x23, 0x58, 0x37, 0x86, 0x5c, 0x1c, 0x8e, 0x9b, 0xe5, 0x90, + 0x97, 0x34, 0x9d, 0x06, 0xa1, 0x74, 0x67, 0x59, 0x43, 0x12, 0x65, 0x1f, 0x84, 0xda, 0xb5, 0x65, 0xbf, 0x0d, 0x6c, + 0x5f, 0xfe, 0x68, 0x18, 0xfb, 0x17, 0xcb, 0x67, 0x42, 0xba, 0x88, 0xe7, 0x20, 0x88, 0xda, 0xcf, 0xb3, 0xe1, 0xc6, + 0xbf, 0x58, 0x3f, 0x13, 0xca, 0x6f, 0x3c, 0xb7, 0xe5, 0x90, 0x3a, 0x6b, 0xe1, 0x0b, 0xe3, 0xe1, 0xc1, 0x95, 0xa1, + 0xed, 0x70, 0x10, 0xfa, 0x6f, 0xb3, 0x46, 0x70, 0x63, 0x43, 0xfb, 0x7c, 0xe1, 0xc3, 0xd6, 0x46, 0x63, 0x4d, 0x31, + 0xdd, 0x42, 0xff, 0x26, 0xb3, 0xa5, 0x3d, 0x8d, 0x4a, 0x5e, 0x9c, 0x9a, 0x46, 0x2c, 0x84, 0x01, 0x43, 0x3f, 0x99, + 0x0f, 0xa0, 0x9a, 0x3b, 0x1e, 0x81, 0x4c, 0x3e, 0xd0, 0x83, 0x35, 0xa9, 0x55, 0x7f, 0x0d, 0x33, 0xf9, 0x7f, 0xa4, + 0xc2, 0x62, 0x74, 0xb7, 0x0d, 0x33, 0xf5, 0x47, 0x24, 0xff, 0x60, 0x39, 0xdf, 0xa5, 0x5e, 0xa8, 0xfd, 0x58, 0x58, + 0x81, 0x41, 0x89, 0xaa, 0x01, 0x3d, 0x10, 0x41, 0x55, 0x06, 0x69, 0x86, 0xd5, 0x39, 0xe8, 0x77, 0x4f, 0xab, 0x8e, + 0xe4, 0x90, 0xd6, 0x6a, 0x48, 0x05, 0x53, 0xa5, 0x06, 0xf9, 0xe1, 0x70, 0x97, 0x32, 0x5d, 0x06, 0x5c, 0xd2, 0xef, + 0x52, 0xa5, 0x14, 0xfe, 0x13, 0x01, 0xe8, 0x1c, 0xdc, 0xe3, 0xcb, 0x31, 0x90, 0x66, 0x58, 0xf8, 0xad, 0xd9, 0xf1, + 0x35, 0x09, 0xb7, 0x49, 0x70, 0x31, 0xc0, 0x39, 0xba, 0x0a, 0xcb, 0xbb, 0x14, 0x22, 0xa8, 0x4a, 0xa8, 0x6f, 0x65, + 0x1a, 0x94, 0xb6, 0x1a, 0x84, 0x35, 0x09, 0x75, 0x26, 0xd9, 0xa8, 0xb4, 0xdd, 0x28, 0xcc, 0x16, 0x71, 0x3d, 0x23, + 0xac, 0x39, 0x9b, 0xa9, 0x06, 0x26, 0x0d, 0xc7, 0x4d, 0xa3, 0xb5, 0xa8, 0x50, 0x53, 0x98, 0xd7, 0xb8, 0xaa, 0x54, + 0x75, 0x37, 0xa7, 0x96, 0xd2, 0xb2, 0xbd, 0xea, 0x26, 0xd9, 0x90, 0xcb, 0x50, 0x86, 0xc1, 0x46, 0x8e, 0x60, 0x02, + 0x49, 0x72, 0xe6, 0x6f, 0xe4, 0x1f, 0x6a, 0xd3, 0xb5, 0x80, 0x39, 0xc6, 0x2c, 0x1b, 0x16, 0xf4, 0x0a, 0xdc, 0x03, + 0xad, 0xf4, 0x7c, 0x9a, 0x5d, 0xe4, 0x41, 0x32, 0x2c, 0xf4, 0xb2, 0xc9, 0xf8, 0x9f, 0xc2, 0x48, 0x93, 0x19, 0x2b, + 0x59, 0x64, 0xbb, 0x3a, 0x25, 0xce, 0xe3, 0x04, 0xb6, 0x47, 0xd3, 0x5b, 0xbe, 0xcf, 0x20, 0x2a, 0x08, 0x14, 0xcc, + 0x98, 0x2f, 0xbb, 0x78, 0xee, 0xfb, 0xcc, 0x32, 0x75, 0x1f, 0x0e, 0xc6, 0x8c, 0xed, 0xf7, 0xfb, 0x79, 0xbf, 0xaf, + 0xe6, 0x5b, 0xbf, 0x9f, 0x5c, 0x9b, 0xbf, 0x3d, 0x60, 0x50, 0x90, 0x13, 0xd1, 0x54, 0x88, 0xe0, 0x1f, 0x92, 0x67, + 0x48, 0x46, 0x77, 0xdc, 0xe7, 0x96, 0xb3, 0x65, 0x75, 0x04, 0x82, 0x79, 0x38, 0x5c, 0x2a, 0xb0, 0x6b, 0x89, 0x22, + 0x21, 0xcb, 0x7f, 0x06, 0xc6, 0x33, 0xf7, 0x01, 0x96, 0x0c, 0x40, 0xd8, 0x2a, 0x4f, 0xd7, 0x7b, 0xbe, 0x0a, 0xde, + 0xe9, 0x78, 0xd7, 0x58, 0x91, 0x81, 0xb8, 0x05, 0x36, 0x62, 0xad, 0x3d, 0x20, 0x67, 0x0a, 0x70, 0xbc, 0x38, 0x1c, + 0xce, 0xe5, 0x2f, 0xdd, 0x6c, 0x9d, 0x40, 0xa5, 0xc0, 0xed, 0xd1, 0xc9, 0xc1, 0x7f, 0x07, 0x9a, 0x41, 0x39, 0xcc, + 0xeb, 0xed, 0xef, 0xcc, 0xc9, 0x4f, 0x4f, 0xf1, 0x4f, 0x78, 0x88, 0x4e, 0xbf, 0xdd, 0x9b, 0x3f, 0x28, 0x2a, 0x0f, + 0x07, 0xb5, 0xf8, 0xcf, 0x39, 0xaf, 0xe0, 0x17, 0xbe, 0x09, 0xcc, 0x26, 0x53, 0xef, 0xe4, 0x9b, 0x3c, 0x67, 0xea, + 0x35, 0x5e, 0x31, 0xf9, 0x0e, 0x87, 0x73, 0x31, 0xaa, 0xb7, 0x23, 0x27, 0xda, 0x29, 0xc7, 0x38, 0x18, 0xfc, 0x17, + 0xd1, 0x36, 0x21, 0xc0, 0x90, 0xba, 0x25, 0xcd, 0x6c, 0x5c, 0x59, 0xe2, 0x59, 0x3a, 0xbf, 0x9c, 0xd4, 0xe5, 0x4e, + 0x2b, 0x9e, 0xf6, 0xc0, 0xe2, 0xb6, 0x06, 0x2f, 0x80, 0x7b, 0x8b, 0xad, 0x2b, 0x05, 0x87, 0x0b, 0x88, 0x53, 0x9c, + 0x80, 0x08, 0xda, 0xef, 0x4b, 0xbc, 0x57, 0xd0, 0x27, 0xfd, 0x00, 0xc1, 0x90, 0x3f, 0x4b, 0xc0, 0x5d, 0xaf, 0x57, + 0x63, 0x7c, 0x2f, 0x85, 0xe0, 0xfa, 0x4c, 0x03, 0xd0, 0x82, 0xdf, 0xe5, 0x63, 0x39, 0xfd, 0x26, 0x02, 0xcf, 0x96, + 0xbd, 0x89, 0x72, 0xb7, 0xe1, 0x69, 0xff, 0x68, 0x21, 0x00, 0x4b, 0xf1, 0x4c, 0x09, 0x16, 0xe4, 0x14, 0x73, 0xf1, + 0xff, 0x82, 0x8f, 0x98, 0xef, 0x49, 0x17, 0xb1, 0xf5, 0xf6, 0xc9, 0x85, 0x81, 0x04, 0x9a, 0x0e, 0xc0, 0x8f, 0x57, + 0x01, 0x5d, 0x19, 0x3f, 0x3f, 0xcb, 0x7a, 0xac, 0x8f, 0xff, 0x14, 0xdc, 0xa7, 0x9f, 0x29, 0x7c, 0x74, 0x38, 0xae, + 0xd2, 0xd1, 0x8e, 0x52, 0x10, 0x1d, 0xdd, 0x3e, 0x9f, 0xf2, 0xec, 0x9b, 0x0a, 0xc8, 0x2d, 0x47, 0xed, 0xa9, 0x00, + 0x2c, 0xb6, 0x74, 0x04, 0x3e, 0xcd, 0xf2, 0x09, 0xf9, 0x5e, 0x4f, 0xc5, 0xd5, 0xa5, 0x4e, 0x17, 0xd7, 0xe3, 0x29, + 0xfc, 0x0f, 0xc4, 0x1e, 0x96, 0x29, 0xb2, 0x63, 0xd7, 0xc5, 0x0f, 0xe2, 0x6d, 0x6d, 0x47, 0x7f, 0xec, 0x20, 0xd2, + 0x71, 0x4f, 0x2e, 0xd4, 0x97, 0x90, 0x4a, 0x2e, 0xd4, 0x0d, 0xc4, 0x2e, 0xd4, 0x78, 0xc7, 0x45, 0xac, 0xf5, 0xb7, + 0x35, 0x0a, 0x56, 0x02, 0xce, 0xb4, 0xb7, 0x60, 0xb0, 0x81, 0x75, 0xcb, 0x32, 0xf8, 0x1b, 0xae, 0x69, 0x02, 0x37, + 0x2c, 0xb2, 0xde, 0x1b, 0x6c, 0xa5, 0xb7, 0xe0, 0x68, 0x99, 0x38, 0x97, 0x92, 0xac, 0x6c, 0x91, 0x71, 0xf5, 0x28, + 0xa4, 0x6a, 0xba, 0xbf, 0x15, 0xf5, 0x83, 0x10, 0x79, 0xb0, 0x4a, 0x59, 0x54, 0xac, 0x40, 0x66, 0x0f, 0xfe, 0x11, + 0x32, 0x72, 0x94, 0x03, 0x47, 0xa1, 0xbf, 0x35, 0x81, 0xce, 0xf3, 0x53, 0xa8, 0xf3, 0x48, 0xb0, 0x95, 0x7a, 0x28, + 0xac, 0xbc, 0x80, 0xe8, 0x60, 0x0b, 0x63, 0x95, 0x27, 0xa1, 0x62, 0x53, 0x26, 0xf2, 0x38, 0xa8, 0x25, 0x60, 0xac, + 0x20, 0x98, 0xb3, 0x5c, 0xba, 0x20, 0x55, 0x8d, 0x1e, 0x16, 0x99, 0xfb, 0xa9, 0xa0, 0xfc, 0x4f, 0x55, 0x4e, 0xb8, + 0xbe, 0x0c, 0x01, 0x8e, 0xf6, 0x29, 0x88, 0x12, 0x63, 0xfd, 0xa2, 0xc5, 0x3b, 0x99, 0x39, 0x9b, 0xda, 0x5e, 0x82, + 0x8c, 0xed, 0xf0, 0x2b, 0x84, 0x56, 0x0b, 0x45, 0x16, 0x0d, 0x17, 0x4c, 0xb7, 0xa7, 0xb4, 0xea, 0x1e, 0x36, 0x3c, + 0x2b, 0x3d, 0x54, 0xea, 0xdb, 0x98, 0xc0, 0xb2, 0x4a, 0x19, 0xbe, 0x9d, 0x50, 0x75, 0x62, 0x50, 0xb1, 0x6e, 0xd8, + 0x12, 0x0e, 0xb1, 0x98, 0x34, 0xd6, 0xd9, 0x80, 0x47, 0x2c, 0x81, 0x7f, 0x36, 0x7c, 0xcc, 0x96, 0x3c, 0x9a, 0x6c, + 0xae, 0x96, 0xfd, 0x7e, 0xe9, 0x85, 0x5e, 0x3d, 0xcb, 0x9e, 0x46, 0xf3, 0x59, 0x3e, 0xf7, 0x51, 0x71, 0x31, 0x19, + 0x0c, 0x36, 0x7e, 0x36, 0x1c, 0xb2, 0x64, 0x38, 0x9c, 0x64, 0x4f, 0xe1, 0xb5, 0xa7, 0x3c, 0x52, 0x4b, 0x2a, 0xb9, + 0xca, 0x60, 0x7f, 0x1f, 0xf0, 0xc8, 0x67, 0x9d, 0x9f, 0x96, 0x4d, 0x97, 0xee, 0x67, 0x76, 0xdc, 0x85, 0xee, 0x00, + 0x1b, 0x6f, 0x1b, 0x74, 0xe4, 0x5f, 0xef, 0x90, 0x52, 0x37, 0x19, 0x80, 0xdd, 0x68, 0x80, 0x43, 0xa6, 0x7a, 0x29, + 0xb2, 0x7a, 0x29, 0x53, 0xbd, 0x24, 0x2b, 0x97, 0x60, 0x21, 0x31, 0x55, 0x6e, 0x23, 0x2b, 0xb7, 0x6c, 0xb8, 0x1e, + 0x0e, 0xb6, 0x56, 0x5c, 0x36, 0x77, 0x70, 0x5f, 0x58, 0x51, 0xe0, 0xff, 0x2d, 0x5b, 0xb0, 0x7b, 0x79, 0x0c, 0xbc, + 0x45, 0xc7, 0x24, 0xb8, 0x40, 0xdc, 0xb3, 0x5b, 0xb0, 0xc3, 0xc2, 0x5f, 0x70, 0x9d, 0x1c, 0xb3, 0x1d, 0x3e, 0x0a, + 0xbd, 0x82, 0xdd, 0xfa, 0x04, 0xb4, 0x0b, 0xb6, 0x06, 0xc8, 0xc6, 0xb6, 0xf8, 0xe8, 0xee, 0x70, 0x78, 0xeb, 0xf9, + 0xec, 0x01, 0x7f, 0x9c, 0xdf, 0x1d, 0x0e, 0x3b, 0xcf, 0xa8, 0xf7, 0x6e, 0x78, 0xc2, 0xde, 0xf3, 0x64, 0x72, 0x73, + 0xc5, 0xe3, 0xc9, 0x60, 0x70, 0xe3, 0x2f, 0x78, 0x3d, 0xbb, 0x01, 0xed, 0xc0, 0xf9, 0x42, 0xea, 0x9a, 0xbd, 0x5b, + 0x9e, 0x79, 0x0b, 0x1c, 0x9b, 0x5b, 0x38, 0x7a, 0xfb, 0x7d, 0xef, 0x8e, 0x47, 0xde, 0x2d, 0xa9, 0x98, 0x56, 0x5c, + 0x71, 0xbc, 0x6d, 0x71, 0x3f, 0x5d, 0xf1, 0x10, 0x1e, 0x61, 0x55, 0xa6, 0x37, 0xc1, 0x7b, 0x9f, 0xad, 0x34, 0x0b, + 0xdc, 0x03, 0xe6, 0x58, 0x93, 0x9d, 0xd0, 0x4c, 0xfc, 0x15, 0xf6, 0xcf, 0x8d, 0xea, 0x1f, 0x9a, 0xff, 0xa5, 0xee, + 0x27, 0x70, 0xfb, 0x22, 0x0b, 0x12, 0x7b, 0xcf, 0x6f, 0xd8, 0x3d, 0x37, 0x6c, 0xb3, 0x67, 0xa6, 0xec, 0x13, 0xa5, + 0xc6, 0x8f, 0x94, 0xba, 0xb6, 0x0c, 0x2b, 0x99, 0xbb, 0x2f, 0x23, 0x70, 0x38, 0x20, 0x3f, 0xdd, 0x21, 0x0e, 0x42, + 0xeb, 0x26, 0xab, 0xb9, 0xa2, 0x9c, 0x0b, 0x6d, 0x99, 0x79, 0x39, 0xb0, 0x98, 0xa5, 0x14, 0x1a, 0x0b, 0x00, 0x04, + 0x93, 0x42, 0x6b, 0xef, 0x65, 0x00, 0x39, 0x41, 0xc3, 0x1f, 0x9b, 0xab, 0xa2, 0xac, 0x65, 0x4b, 0x42, 0x94, 0xed, + 0x7a, 0x78, 0x89, 0x90, 0x69, 0xfd, 0xfe, 0x39, 0x91, 0xac, 0x4d, 0xaa, 0xab, 0x1a, 0x2d, 0x01, 0x15, 0x59, 0x02, + 0x26, 0x7e, 0xa5, 0xf9, 0x04, 0xe0, 0x49, 0xc7, 0x83, 0xea, 0x29, 0xaf, 0x99, 0x20, 0xb2, 0x8d, 0xca, 0x9f, 0x14, + 0xd7, 0x48, 0x46, 0x50, 0x3c, 0xad, 0x55, 0xc6, 0xc2, 0x30, 0x0f, 0x14, 0x90, 0x77, 0xef, 0x4e, 0x7d, 0x6b, 0x7f, + 0xec, 0xd8, 0xb3, 0xb5, 0x0a, 0xb5, 0x50, 0x53, 0xb8, 0xe4, 0x10, 0x5d, 0x41, 0x06, 0x0a, 0x19, 0x4f, 0x5e, 0x0f, + 0x2e, 0x27, 0xd1, 0x15, 0x17, 0xe8, 0x8c, 0xaf, 0x6f, 0xba, 0xe9, 0x2c, 0x7a, 0x5a, 0xcd, 0x27, 0xa4, 0x24, 0x3b, + 0x1c, 0xb2, 0x51, 0x55, 0x17, 0xeb, 0x69, 0x28, 0x7f, 0x7a, 0x08, 0xbe, 0x5e, 0x50, 0xaf, 0xc9, 0x2a, 0xd5, 0x4f, + 0xa9, 0x52, 0x5e, 0x34, 0xbc, 0xf4, 0x9f, 0x56, 0x72, 0xdf, 0x03, 0xd2, 0x5a, 0x5e, 0x72, 0xf9, 0x7e, 0x84, 0x18, + 0x23, 0x7e, 0xe0, 0x95, 0x3c, 0x62, 0xa1, 0x9a, 0xc2, 0x35, 0x8f, 0x10, 0xe4, 0x2d, 0xd3, 0xc1, 0xdf, 0x7a, 0xe2, + 0x74, 0x7f, 0xa2, 0xb4, 0x8b, 0x2f, 0x2c, 0xea, 0x9e, 0xac, 0xad, 0x1b, 0x90, 0x83, 0x0d, 0xd3, 0x45, 0x41, 0xb6, + 0x29, 0x8d, 0xa0, 0x8d, 0x96, 0x03, 0x1b, 0x4e, 0xa5, 0x36, 0x9c, 0xb9, 0x86, 0xe0, 0x3e, 0x3f, 0x4f, 0x47, 0x0b, + 0xf8, 0x90, 0xea, 0xf6, 0x12, 0x3f, 0x1f, 0x36, 0x3c, 0x02, 0x32, 0x3b, 0xe2, 0x33, 0x9b, 0x48, 0x3a, 0xa9, 0x73, + 0x05, 0xec, 0x76, 0xf6, 0x16, 0xe4, 0x88, 0x99, 0xfb, 0x0a, 0xd5, 0xb7, 0x68, 0xc0, 0x95, 0xb1, 0xf6, 0x35, 0xc9, + 0x58, 0x78, 0x55, 0x4e, 0xc3, 0x01, 0xc0, 0xd0, 0x65, 0xf4, 0xb5, 0xe5, 0x26, 0xcb, 0x7e, 0x2e, 0x20, 0x08, 0xa2, + 0x24, 0x1e, 0x1f, 0xf0, 0xbe, 0xac, 0x86, 0x1a, 0x25, 0x1f, 0xcb, 0x46, 0x2a, 0xbd, 0x12, 0xfd, 0xdd, 0x98, 0x4b, + 0x0c, 0xf8, 0xb6, 0x6a, 0x0b, 0x0a, 0xe7, 0xf9, 0xe1, 0x70, 0x9e, 0x8f, 0x8c, 0x67, 0x19, 0xa8, 0x56, 0xa6, 0x75, + 0x10, 0x9b, 0xf9, 0x62, 0xe1, 0x2f, 0x76, 0x4e, 0x22, 0xa2, 0x20, 0xb0, 0x23, 0xe1, 0x41, 0xa4, 0x7e, 0x59, 0x79, + 0xba, 0x53, 0x7d, 0xb6, 0x5f, 0xd8, 0x44, 0x7a, 0x41, 0xc9, 0xe4, 0x93, 0x60, 0xaf, 0xfa, 0x3b, 0x08, 0x1b, 0xc2, + 0x9b, 0x57, 0xbd, 0xce, 0x32, 0x35, 0x2b, 0x41, 0xc2, 0x8c, 0x39, 0x82, 0xc7, 0x61, 0xa7, 0xb1, 0x0d, 0x8f, 0x2d, + 0x38, 0x3a, 0x6f, 0xcd, 0xee, 0xd8, 0x8a, 0xdd, 0xaa, 0x3a, 0x2d, 0x78, 0x38, 0x1d, 0x5e, 0x06, 0xb8, 0xfa, 0xd6, + 0xe7, 0x9c, 0xdf, 0xd1, 0x09, 0xb6, 0x1e, 0xf0, 0x68, 0x22, 0x66, 0xeb, 0xa7, 0x91, 0x5a, 0x3c, 0xeb, 0x21, 0x5f, + 0xd0, 0xfa, 0x13, 0xb3, 0x3b, 0x93, 0x7c, 0x37, 0xe0, 0x8b, 0xc9, 0xfa, 0x69, 0x04, 0xaf, 0x3e, 0x05, 0x2b, 0x46, + 0xe6, 0xcc, 0xb2, 0xf5, 0xd3, 0x08, 0xc7, 0xec, 0xee, 0x69, 0x44, 0xa3, 0xb6, 0x92, 0xfb, 0xd2, 0x6d, 0x03, 0xc2, + 0xca, 0x2d, 0x8b, 0xe1, 0x35, 0x10, 0xcf, 0xb4, 0x91, 0x74, 0x2d, 0x0d, 0xbd, 0x31, 0x0f, 0xa7, 0x71, 0xb0, 0xa6, + 0x56, 0xc8, 0x33, 0x43, 0xcc, 0xe2, 0xa7, 0xd1, 0x9c, 0xad, 0xb0, 0x22, 0x1b, 0x1e, 0x0f, 0x2e, 0x27, 0x9b, 0x2b, + 0xbe, 0x06, 0xf2, 0xb3, 0xc9, 0xc6, 0x6c, 0x51, 0xb7, 0x5c, 0xcc, 0x36, 0x4f, 0xa3, 0xf9, 0x64, 0x05, 0x3d, 0x6b, + 0x0f, 0x98, 0xf7, 0x1a, 0x44, 0x28, 0x09, 0xa9, 0x29, 0x37, 0xbd, 0x1e, 0x5b, 0x8f, 0x83, 0x3b, 0xb6, 0xbe, 0x0c, + 0x6e, 0xd9, 0x7a, 0x0c, 0x44, 0x1c, 0xd4, 0xef, 0xde, 0x06, 0x16, 0x5f, 0xc4, 0xd6, 0x97, 0x26, 0x6d, 0xf3, 0x34, + 0x62, 0xee, 0xe0, 0x34, 0x70, 0xc1, 0xda, 0x64, 0xde, 0x8a, 0xc1, 0x25, 0x64, 0xe9, 0xc5, 0x6c, 0x33, 0xbc, 0x64, + 0xeb, 0x11, 0x4e, 0xf5, 0xc4, 0x67, 0x77, 0xfc, 0x96, 0x25, 0x7c, 0xd5, 0xc4, 0x57, 0x1b, 0xd0, 0x88, 0x1e, 0x65, + 0xd0, 0x57, 0x50, 0x33, 0x73, 0x5e, 0x5a, 0x18, 0x95, 0xfb, 0x16, 0x1c, 0x50, 0x90, 0xb6, 0x01, 0x82, 0x24, 0x9e, + 0xdd, 0xcb, 0x70, 0x7d, 0x23, 0x85, 0x01, 0x37, 0x81, 0x19, 0x30, 0x30, 0xfd, 0x0c, 0x7e, 0x58, 0xe9, 0x12, 0x21, + 0xce, 0x7e, 0x4a, 0x49, 0x32, 0xcf, 0x4f, 0x45, 0x9a, 0xbb, 0x85, 0xeb, 0x14, 0x66, 0x45, 0x81, 0xea, 0xa7, 0xa4, + 0x34, 0xb0, 0x50, 0x89, 0x4c, 0xa5, 0xe0, 0x97, 0xcd, 0x79, 0x94, 0x1d, 0xa3, 0x73, 0x9d, 0x5f, 0x4e, 0x9c, 0xd3, + 0x49, 0xdf, 0x7f, 0xe0, 0x18, 0xb6, 0x90, 0x81, 0x0b, 0x7f, 0xea, 0x09, 0xe3, 0xd4, 0x0a, 0xc4, 0x54, 0xf2, 0xec, + 0x29, 0x7c, 0x26, 0xb4, 0x3a, 0xba, 0xf0, 0xfd, 0xa0, 0xd0, 0x26, 0xe9, 0x16, 0x24, 0x29, 0x78, 0x8a, 0x9e, 0x73, + 0xde, 0x06, 0x2a, 0xc5, 0x88, 0x16, 0x44, 0xda, 0x5a, 0x66, 0x0e, 0xd2, 0x96, 0xe6, 0xbb, 0x26, 0x7e, 0x0e, 0x0b, + 0xb8, 0x88, 0x16, 0xb6, 0x86, 0x47, 0x55, 0xac, 0xdc, 0x9b, 0x3c, 0x47, 0x38, 0xa3, 0x4b, 0x99, 0x00, 0xb8, 0xde, + 0xaf, 0xc2, 0x5a, 0xe1, 0x15, 0x35, 0x8b, 0xbc, 0xa8, 0xe9, 0x93, 0x2d, 0x70, 0x1f, 0x8b, 0x12, 0x05, 0xce, 0x5a, + 0x30, 0x60, 0x2b, 0x2c, 0xd9, 0x49, 0x61, 0x53, 0xb4, 0x84, 0xde, 0x1e, 0x3f, 0x1d, 0xd4, 0x4c, 0x06, 0xd0, 0x04, + 0xd0, 0x78, 0xfc, 0x0b, 0x40, 0x4d, 0x6f, 0x6a, 0xb1, 0xae, 0x82, 0x52, 0x29, 0x37, 0xe1, 0x67, 0x60, 0x98, 0xe1, + 0x87, 0x42, 0x6e, 0x13, 0x25, 0x72, 0x7e, 0x2c, 0x4a, 0xb1, 0x2c, 0x45, 0x95, 0xb4, 0x1b, 0x0a, 0x1e, 0x11, 0x6e, + 0x83, 0xc6, 0xcc, 0xed, 0x89, 0x2e, 0x5a, 0x11, 0xca, 0xb1, 0x59, 0xc7, 0x48, 0xa3, 0xcc, 0x4e, 0x76, 0x9d, 0x2c, + 0xb4, 0xdf, 0x57, 0x39, 0x64, 0x1d, 0xb0, 0x46, 0xf2, 0xf5, 0x9a, 0x43, 0xb7, 0x8d, 0xf2, 0xe2, 0xc1, 0xf3, 0x15, + 0x9c, 0xe6, 0x78, 0x62, 0x77, 0xbd, 0xee, 0x14, 0x89, 0x78, 0x85, 0x93, 0x2a, 0x1f, 0xc9, 0xc2, 0x71, 0xe7, 0x4e, + 0x6b, 0xb1, 0xaa, 0x5c, 0xd6, 0x53, 0x8b, 0x23, 0x02, 0x9f, 0xca, 0xa3, 0xbd, 0xd0, 0xb6, 0x28, 0x16, 0xc2, 0xe8, + 0xd1, 0x09, 0x3f, 0x29, 0x81, 0xf5, 0x75, 0x38, 0x2c, 0xfd, 0x88, 0xa3, 0xdf, 0x69, 0x34, 0x5a, 0x10, 0xd2, 0xf0, + 0xd4, 0x8b, 0x46, 0x8b, 0xba, 0xa8, 0xc3, 0xec, 0x3a, 0xd7, 0x03, 0x85, 0x61, 0x04, 0xea, 0x07, 0x57, 0x19, 0x7c, + 0x16, 0x21, 0x6a, 0x1e, 0x98, 0x66, 0x43, 0x38, 0xea, 0x02, 0x0f, 0xad, 0xa0, 0xc5, 0xcc, 0x7c, 0x14, 0x62, 0xf8, + 0x90, 0x2e, 0xce, 0x9f, 0x90, 0x95, 0x0f, 0xb0, 0x3b, 0x74, 0x17, 0xca, 0x39, 0x53, 0x31, 0xc0, 0x8f, 0x02, 0xf2, + 0x51, 0x02, 0x6e, 0x06, 0xc8, 0x1e, 0x59, 0x02, 0x88, 0x15, 0xa3, 0xa3, 0xc9, 0xe7, 0xbe, 0x17, 0x29, 0x78, 0x67, + 0x9f, 0xe5, 0x6a, 0xc2, 0x50, 0xf8, 0xc4, 0x40, 0x37, 0xbf, 0xf1, 0xdb, 0xf3, 0x16, 0x8c, 0xec, 0x92, 0x14, 0xaf, + 0x35, 0xc3, 0xfd, 0x06, 0xdc, 0x8e, 0x80, 0xb2, 0xa6, 0x3a, 0x26, 0xd9, 0xa6, 0x21, 0x92, 0x01, 0x33, 0x62, 0x44, + 0x50, 0x59, 0x2e, 0xfc, 0xef, 0x5e, 0x16, 0x05, 0x0e, 0xe0, 0x6a, 0x26, 0x83, 0xd7, 0x2e, 0x8c, 0x0a, 0x80, 0x73, + 0x1a, 0x3a, 0xa5, 0xbd, 0xaa, 0x3a, 0x24, 0xab, 0xe6, 0x07, 0xb3, 0x79, 0xd3, 0x30, 0x31, 0x22, 0x88, 0x2e, 0xc2, + 0x09, 0xa6, 0x57, 0xa4, 0xaf, 0x95, 0x9c, 0x8e, 0x56, 0x1d, 0xad, 0x25, 0x26, 0xe6, 0x8a, 0xe2, 0xaf, 0x01, 0x8f, + 0x1b, 0xbc, 0x3a, 0x49, 0xd3, 0x89, 0xea, 0xd1, 0xe3, 0xd7, 0x69, 0x3a, 0x29, 0x71, 0x57, 0xf8, 0x0d, 0xb8, 0x68, + 0xb6, 0xf9, 0xd0, 0x8f, 0x5f, 0x50, 0xc4, 0x45, 0x0d, 0xae, 0xbc, 0x53, 0x7d, 0xa5, 0xfa, 0x08, 0x6a, 0xe1, 0x89, + 0x91, 0xb5, 0xf0, 0xe4, 0x92, 0xb5, 0x16, 0x04, 0x33, 0x9b, 0x03, 0x17, 0xf2, 0x2b, 0xa5, 0x88, 0x37, 0x91, 0x50, + 0x8b, 0x41, 0xeb, 0x31, 0x73, 0x56, 0x8d, 0x16, 0x2a, 0x33, 0x42, 0xfb, 0xb6, 0x16, 0x9d, 0xdf, 0xc8, 0x4f, 0x79, + 0x6a, 0x5f, 0xb6, 0xc7, 0xf9, 0x78, 0x8f, 0xee, 0xaa, 0xb3, 0xcc, 0xa4, 0x8c, 0x4f, 0x66, 0x09, 0x0a, 0x77, 0x09, + 0x36, 0x20, 0xc9, 0x7e, 0xad, 0x03, 0x64, 0xd4, 0x5e, 0xfb, 0x5d, 0x67, 0xf9, 0xea, 0x66, 0x6b, 0x28, 0x2a, 0xb5, + 0x92, 0x14, 0x07, 0x19, 0xae, 0xdb, 0xca, 0x87, 0x8b, 0x0b, 0xe8, 0x19, 0x23, 0x91, 0x79, 0xfe, 0x44, 0xbe, 0x04, + 0xe7, 0x8c, 0xb3, 0x42, 0x60, 0xc2, 0x58, 0xbd, 0x6b, 0x2d, 0x95, 0x86, 0x14, 0x63, 0x47, 0xa3, 0x2c, 0xab, 0x2c, + 0x5d, 0x66, 0x6b, 0x09, 0x5b, 0x96, 0x93, 0x5b, 0xd8, 0x32, 0x93, 0xd5, 0x7c, 0x5f, 0x71, 0x07, 0xe5, 0x9b, 0xad, + 0x33, 0xbe, 0x97, 0xc8, 0xde, 0x6d, 0xa0, 0x84, 0xeb, 0xd1, 0x5f, 0x90, 0x7e, 0x9b, 0x61, 0x9c, 0x72, 0x5b, 0x49, + 0x0b, 0x70, 0xfa, 0x87, 0xc3, 0xfb, 0x0a, 0x83, 0x06, 0x47, 0x18, 0x47, 0xd6, 0xef, 0xdf, 0x56, 0x5e, 0x8d, 0x89, + 0x3a, 0x3e, 0xab, 0xdf, 0xaf, 0xe8, 0xe1, 0xb4, 0x1a, 0xad, 0xd2, 0x2d, 0xb2, 0x13, 0xda, 0x58, 0xf9, 0x41, 0xad, + 0x80, 0xd9, 0x5b, 0x9f, 0x4f, 0x07, 0xa0, 0x63, 0x01, 0x12, 0xcd, 0x66, 0x22, 0x31, 0x27, 0xdd, 0x93, 0xf0, 0xf8, + 0xc0, 0x02, 0x07, 0x98, 0x8a, 0xff, 0x53, 0x78, 0x33, 0xb0, 0x41, 0xa3, 0x44, 0x5f, 0xa3, 0xab, 0xda, 0xdc, 0xe8, + 0x78, 0xe9, 0x29, 0x24, 0xb2, 0x82, 0x55, 0x73, 0x5f, 0x6e, 0xe0, 0xb4, 0x87, 0x9a, 0x43, 0x65, 0x09, 0xfe, 0xf6, + 0xcb, 0xfc, 0x70, 0x58, 0x67, 0x50, 0xd8, 0x6e, 0x2d, 0xb4, 0x37, 0x66, 0xa9, 0x86, 0x8a, 0x70, 0xd0, 0xf9, 0x4a, + 0xcc, 0xea, 0x11, 0xfd, 0x3d, 0x3f, 0x1c, 0x56, 0x04, 0x06, 0x1c, 0x96, 0x32, 0x13, 0x2d, 0x14, 0x4b, 0xeb, 0x6c, + 0x46, 0x75, 0xe0, 0x81, 0x89, 0x39, 0x0b, 0x77, 0x00, 0xda, 0xa4, 0x56, 0x81, 0x5e, 0x45, 0xf4, 0x13, 0xf7, 0x6b, + 0xfb, 0xf5, 0x7a, 0x64, 0x96, 0x8e, 0xdc, 0x18, 0x0b, 0x00, 0x0e, 0x3c, 0xaf, 0x49, 0x9e, 0x93, 0xaf, 0xa1, 0xdd, + 0x93, 0x0b, 0xf9, 0x13, 0x94, 0x2d, 0x3c, 0x57, 0x4d, 0x2b, 0x8b, 0x15, 0x57, 0xd5, 0xab, 0x0b, 0x5e, 0x99, 0x4c, + 0xab, 0xb4, 0x12, 0x95, 0x12, 0x0c, 0xa8, 0x4b, 0xbc, 0xd6, 0x34, 0xa3, 0xd4, 0x46, 0x9d, 0x89, 0x1a, 0xb0, 0xc1, + 0x7e, 0xaa, 0x36, 0x3a, 0x39, 0x97, 0xcf, 0x2f, 0x8d, 0xc3, 0xa7, 0x5d, 0xbd, 0x99, 0xa9, 0x1c, 0xf8, 0x6b, 0xe5, + 0x43, 0xab, 0xc7, 0x40, 0x07, 0xe4, 0xf4, 0xc7, 0xb0, 0x98, 0xd8, 0x1d, 0x9a, 0xb7, 0xbb, 0xcb, 0xea, 0x22, 0xbd, + 0xd3, 0x94, 0xcc, 0xea, 0x2d, 0x9f, 0x59, 0x3d, 0x3a, 0xe0, 0xc5, 0x63, 0xbd, 0x57, 0x98, 0x49, 0x04, 0x17, 0x43, + 0x35, 0x89, 0xec, 0x0e, 0xb4, 0xe6, 0x51, 0xc5, 0x04, 0xf8, 0x41, 0xa9, 0x35, 0xbd, 0xb7, 0xbb, 0x42, 0x9d, 0x52, + 0x78, 0xdc, 0x5a, 0xf2, 0x03, 0x73, 0xa7, 0x5d, 0xeb, 0x7c, 0x3c, 0xbf, 0xf4, 0xfd, 0x46, 0x9e, 0xd0, 0x66, 0x67, + 0x72, 0xfa, 0x27, 0x6f, 0xf5, 0x0f, 0x53, 0x7d, 0x0b, 0xdd, 0x09, 0xfa, 0x0c, 0x5d, 0x55, 0xdd, 0x95, 0xd8, 0xc2, + 0x50, 0x4f, 0x2c, 0xf2, 0x42, 0x9e, 0xb4, 0xc6, 0x8e, 0x83, 0xbd, 0x01, 0x4e, 0xfc, 0xf2, 0x70, 0x10, 0x57, 0xb9, + 0xcf, 0xce, 0xbb, 0x46, 0x56, 0x0e, 0x60, 0x05, 0x51, 0x30, 0x6e, 0xcd, 0xc7, 0x36, 0x48, 0x97, 0xb8, 0x1a, 0x1f, + 0xbf, 0xa1, 0x58, 0x26, 0x9b, 0x88, 0x8b, 0x8b, 0xfc, 0xe9, 0x73, 0x20, 0x2d, 0xeb, 0xf7, 0xa3, 0xeb, 0xcb, 0xe9, + 0xf3, 0x61, 0x14, 0x80, 0x63, 0x97, 0xbd, 0xbc, 0x8c, 0xf9, 0xea, 0x92, 0x59, 0xa6, 0xb0, 0xc8, 0x37, 0x03, 0xaa, + 0x4b, 0x56, 0x4b, 0xd7, 0x2b, 0xc0, 0xd2, 0xe5, 0x37, 0x0f, 0x61, 0x6a, 0x40, 0x23, 0x6b, 0xee, 0x4e, 0x73, 0x2d, + 0x50, 0xea, 0x79, 0x3f, 0x33, 0xe4, 0xeb, 0x32, 0xe8, 0x0a, 0xd2, 0x3d, 0x8f, 0x48, 0x2f, 0xf7, 0xd2, 0xe9, 0x7e, + 0x5f, 0x0a, 0xb0, 0xd4, 0x97, 0xe2, 0x33, 0x28, 0x2c, 0x1a, 0xdf, 0x08, 0xd0, 0xd6, 0x50, 0x4d, 0x7b, 0xa5, 0xa8, + 0x7a, 0x41, 0xaf, 0x14, 0x9f, 0x7b, 0x7a, 0xa8, 0xcc, 0x97, 0xa5, 0xa3, 0xff, 0x09, 0x35, 0x17, 0x9c, 0x10, 0x33, + 0x31, 0x07, 0x50, 0x09, 0xda, 0xf8, 0x56, 0x47, 0x1b, 0x9f, 0xea, 0x55, 0xdc, 0xf4, 0x79, 0x6d, 0x2d, 0x73, 0x42, + 0xd8, 0x74, 0x2f, 0x01, 0x2a, 0xf2, 0x4a, 0x78, 0x04, 0xcb, 0x2f, 0x7f, 0xc8, 0xd3, 0x15, 0xa2, 0x75, 0xdc, 0xb3, + 0xcc, 0xa5, 0xb1, 0x7f, 0x6d, 0x30, 0x7d, 0x7d, 0xbb, 0x2d, 0xf2, 0x53, 0x13, 0x13, 0xd6, 0x63, 0x45, 0xdf, 0xbc, + 0x0b, 0x57, 0x02, 0x05, 0x0e, 0x25, 0x12, 0xdb, 0x54, 0xa1, 0x88, 0x07, 0x49, 0x9f, 0x2e, 0x5a, 0x9f, 0x06, 0x98, + 0x5a, 0xcb, 0x81, 0x39, 0x84, 0xab, 0xb8, 0xf0, 0xd1, 0xd3, 0xb7, 0x98, 0x85, 0xf3, 0x89, 0xf7, 0xd1, 0x2b, 0x46, + 0xe6, 0xe3, 0x3e, 0x2a, 0x95, 0xf4, 0xcf, 0xc3, 0x61, 0x56, 0xcd, 0x7d, 0x87, 0x3e, 0xd2, 0x43, 0x95, 0x0b, 0xca, + 0xde, 0x18, 0x93, 0x08, 0x94, 0xc6, 0x78, 0x1f, 0x07, 0xc7, 0x79, 0x9f, 0x06, 0x90, 0xda, 0x27, 0xde, 0x93, 0x92, + 0xc3, 0x73, 0x8e, 0x39, 0xa1, 0xb4, 0x22, 0xac, 0xe2, 0x8b, 0x0c, 0xe5, 0xba, 0x53, 0x0a, 0x26, 0x39, 0x24, 0x18, + 0xfe, 0xaa, 0x79, 0x13, 0x2b, 0x10, 0x76, 0xcd, 0xbc, 0x1a, 0x3d, 0xa9, 0x92, 0xb0, 0x14, 0x70, 0x54, 0x66, 0x9e, + 0x61, 0x6f, 0x78, 0x62, 0x18, 0x39, 0x58, 0xee, 0x8f, 0xea, 0x44, 0xe4, 0x1e, 0x5d, 0x60, 0x54, 0x16, 0x9e, 0x37, + 0x74, 0xa5, 0x41, 0x25, 0xd9, 0xf1, 0x57, 0x5c, 0x03, 0x6a, 0x6b, 0x8c, 0x18, 0x0a, 0x18, 0x05, 0xaf, 0xed, 0x0f, + 0x21, 0x8b, 0xb2, 0xf5, 0x1b, 0x1c, 0xf3, 0x59, 0xc9, 0x5d, 0xef, 0x70, 0x16, 0x5a, 0x42, 0x9e, 0xdc, 0x31, 0x48, + 0xd3, 0x58, 0x1a, 0x01, 0x27, 0x22, 0xd9, 0xc6, 0x52, 0x38, 0x02, 0x08, 0x08, 0x74, 0x53, 0x66, 0x18, 0xd3, 0xc1, + 0xc8, 0xf3, 0xa4, 0x67, 0xbc, 0x57, 0xe1, 0x29, 0xa4, 0xc9, 0xf6, 0xf5, 0xfc, 0xbd, 0x11, 0x64, 0xe5, 0x96, 0x73, + 0x3c, 0x2c, 0xbe, 0x71, 0xf6, 0x55, 0x4e, 0x9e, 0x62, 0x96, 0x91, 0xde, 0x29, 0xe6, 0x05, 0xfc, 0xa9, 0x2c, 0xf5, + 0x39, 0x4a, 0x6f, 0x99, 0x4f, 0x56, 0x91, 0x74, 0xe9, 0x6d, 0xfa, 0xfd, 0x78, 0xa4, 0x0e, 0x35, 0x7f, 0x1f, 0x8f, + 0xe4, 0x19, 0xb6, 0x61, 0x09, 0x0b, 0xad, 0x82, 0x31, 0x80, 0x24, 0x36, 0x22, 0x1a, 0x8c, 0xf6, 0xe6, 0x70, 0x38, + 0xdf, 0x98, 0xb3, 0x64, 0x0f, 0xae, 0xaf, 0x3c, 0x31, 0xef, 0xc0, 0x97, 0x79, 0x4c, 0x10, 0xb1, 0x99, 0xb7, 0x61, + 0x35, 0x78, 0xb0, 0x83, 0xeb, 0x23, 0xb6, 0x28, 0xd6, 0x3a, 0x96, 0xca, 0x3a, 0x38, 0xad, 0x63, 0xd3, 0x8c, 0x94, + 0x22, 0xfb, 0x1c, 0xfb, 0x7b, 0x37, 0xb8, 0xba, 0x36, 0x06, 0xb5, 0xc6, 0x1d, 0xe6, 0xce, 0xa9, 0x80, 0x7a, 0x4c, + 0x57, 0x50, 0x3d, 0xcb, 0xc9, 0x97, 0xdf, 0xda, 0x39, 0x20, 0x68, 0x04, 0x02, 0x17, 0x0d, 0xb4, 0x6a, 0x97, 0x72, + 0xde, 0x05, 0x84, 0xf8, 0x26, 0x05, 0x7d, 0x3a, 0x83, 0x4d, 0x6c, 0x3e, 0x81, 0x58, 0x34, 0xdd, 0xe7, 0x5a, 0x33, + 0x5f, 0x8c, 0x68, 0x67, 0xd6, 0xdd, 0x22, 0xb7, 0x5a, 0x88, 0x64, 0xf4, 0x6c, 0x33, 0xe1, 0xa2, 0x43, 0x39, 0x23, + 0x01, 0x13, 0xb4, 0xb6, 0x52, 0xf2, 0xb9, 0xee, 0x75, 0x82, 0xf6, 0x40, 0xd2, 0xba, 0x7f, 0xb3, 0xe8, 0x8c, 0x92, + 0x93, 0xeb, 0x4d, 0xce, 0x20, 0x05, 0x0b, 0xb6, 0x97, 0x39, 0xe1, 0x06, 0xf8, 0xc4, 0x66, 0xc9, 0x69, 0x1a, 0xe4, + 0xb1, 0x30, 0x1e, 0x79, 0x6d, 0x7e, 0x59, 0x40, 0x87, 0x92, 0x45, 0x23, 0xc4, 0x03, 0xec, 0x1c, 0x92, 0xab, 0x02, + 0x75, 0xd3, 0x40, 0x57, 0xae, 0x9c, 0x29, 0xa6, 0xc0, 0x85, 0x50, 0x10, 0xb5, 0xa3, 0x93, 0xa8, 0x9c, 0xf7, 0x49, + 0x75, 0x99, 0x4f, 0x0b, 0x69, 0x1a, 0xc8, 0xa7, 0x95, 0x63, 0x1e, 0xd8, 0xd9, 0xc6, 0x35, 0x81, 0x81, 0x4e, 0xed, + 0x6b, 0x51, 0xce, 0xb1, 0x8a, 0xe8, 0x7d, 0xfe, 0xa1, 0xb2, 0xa7, 0x0f, 0x22, 0x6c, 0x54, 0xa0, 0xb1, 0x94, 0x18, + 0x1b, 0x39, 0xfe, 0x2d, 0x51, 0x36, 0x64, 0x08, 0x08, 0x21, 0x6d, 0xe4, 0xf4, 0xc3, 0xfa, 0xf2, 0x36, 0xd3, 0xfe, + 0x9f, 0x24, 0x7e, 0x1b, 0xec, 0xe5, 0xd4, 0x9f, 0x7a, 0xc4, 0xe3, 0xb5, 0x46, 0x8f, 0x29, 0xe9, 0x36, 0xc8, 0x53, + 0xe5, 0x29, 0x48, 0x26, 0x8c, 0x25, 0x04, 0x8b, 0x72, 0xc1, 0x73, 0x5e, 0x71, 0x09, 0xf7, 0x51, 0xcb, 0x8a, 0x08, + 0x55, 0x89, 0x9c, 0x3e, 0x5f, 0x01, 0xcf, 0x04, 0x04, 0x3a, 0xc6, 0x48, 0xa3, 0x0a, 0xbe, 0x04, 0xc6, 0x3a, 0x50, + 0x76, 0x9a, 0x91, 0xe0, 0xb2, 0x7b, 0x83, 0x44, 0xa9, 0xaf, 0x48, 0x49, 0xfa, 0x56, 0xd4, 0x78, 0x25, 0x56, 0x11, + 0x09, 0x64, 0xa8, 0x21, 0x62, 0x55, 0x3d, 0x75, 0xaf, 0x8a, 0xc9, 0x60, 0x50, 0xf9, 0x72, 0x7a, 0xe2, 0x0d, 0x0d, + 0x95, 0x77, 0x5d, 0xd1, 0x4e, 0x4f, 0xb4, 0x52, 0xde, 0x42, 0x5a, 0x82, 0xa6, 0x61, 0xa4, 0x39, 0x94, 0xba, 0x92, + 0xee, 0xc6, 0x20, 0xbe, 0x64, 0xa2, 0x67, 0x3b, 0xb5, 0xa3, 0xb4, 0x25, 0xed, 0x21, 0xa4, 0xe7, 0x2e, 0xf9, 0x98, + 0x85, 0x5c, 0xdd, 0x29, 0x27, 0xe5, 0x55, 0x88, 0x4e, 0xee, 0x7b, 0x0c, 0x89, 0x40, 0x9f, 0x73, 0x0c, 0xeb, 0xa2, + 0xa1, 0xce, 0x61, 0x85, 0x98, 0x2d, 0x94, 0x30, 0x5f, 0x32, 0x9e, 0x4a, 0x06, 0x0d, 0x80, 0x0c, 0xf8, 0xec, 0x65, + 0x60, 0xf9, 0x2b, 0x88, 0x1f, 0x6d, 0x7c, 0x38, 0xfc, 0x59, 0x53, 0x88, 0xed, 0x9f, 0xb0, 0x19, 0xc2, 0xa3, 0x7a, + 0xc0, 0x33, 0xdf, 0xc4, 0x09, 0x5a, 0x01, 0x49, 0x99, 0x1d, 0x4d, 0x64, 0xaf, 0x7a, 0x08, 0xa7, 0xb2, 0x02, 0x75, + 0x94, 0x75, 0x56, 0xc2, 0x8f, 0x30, 0xd5, 0xad, 0xc4, 0x5a, 0xa0, 0xcd, 0xd5, 0x8a, 0xb5, 0x00, 0x0e, 0xfc, 0x1c, + 0x82, 0x27, 0xf2, 0x39, 0xb8, 0x18, 0x14, 0xe0, 0x73, 0x00, 0xbc, 0xc8, 0x5d, 0x78, 0x30, 0x8f, 0x2c, 0xab, 0x11, + 0x86, 0xa3, 0x8a, 0x58, 0xbf, 0x66, 0x3b, 0xf2, 0x81, 0xdb, 0x31, 0x3e, 0xd7, 0x1e, 0x4b, 0x96, 0x83, 0x51, 0xe6, + 0x5e, 0x2d, 0xd1, 0xf3, 0x26, 0x8d, 0x9b, 0xd1, 0x93, 0x7d, 0x2d, 0xff, 0x17, 0xf4, 0x32, 0xe8, 0x6f, 0xe1, 0x96, + 0xd7, 0xfc, 0x6e, 0x41, 0xa4, 0x99, 0x5e, 0x41, 0xa4, 0x8c, 0x1a, 0x91, 0x31, 0x84, 0x4d, 0xaa, 0x9b, 0xdb, 0xa4, + 0xba, 0x10, 0xf0, 0x74, 0x44, 0xaa, 0x6b, 0x21, 0x6d, 0xe4, 0xd3, 0x3a, 0x90, 0xb1, 0x48, 0xef, 0x7e, 0xf8, 0xdb, + 0x8b, 0x4f, 0x6f, 0x7e, 0xf9, 0x61, 0xf1, 0xe6, 0xdd, 0xeb, 0x37, 0xef, 0xde, 0x7c, 0xfa, 0x8d, 0x20, 0x3c, 0xa6, + 0x42, 0x65, 0xf8, 0xf0, 0xfe, 0xe6, 0x8d, 0x93, 0xc1, 0xf6, 0x66, 0xc8, 0xda, 0x37, 0x72, 0x30, 0x04, 0x22, 0x1b, + 0x84, 0x0c, 0xb2, 0x53, 0xdb, 0xfe, 0x4c, 0xcc, 0x31, 0xf6, 0x4e, 0x60, 0xb2, 0x05, 0x9c, 0x63, 0x99, 0x97, 0x8c, + 0xc8, 0x55, 0xa1, 0xf5, 0x03, 0x5a, 0xf0, 0x16, 0x5c, 0x64, 0xd2, 0xfc, 0xee, 0x17, 0x82, 0xd8, 0xa7, 0x95, 0x94, + 0xfb, 0x6a, 0x5b, 0xf3, 0x7c, 0x7b, 0xbf, 0x97, 0x70, 0xfe, 0x73, 0x69, 0x44, 0x2d, 0xc0, 0x01, 0xf8, 0x1c, 0xfe, + 0xb8, 0xd2, 0x96, 0x34, 0x99, 0x45, 0xfb, 0x19, 0x43, 0xd0, 0xa5, 0xc1, 0x07, 0xb1, 0x47, 0x5e, 0xea, 0x93, 0x85, + 0x04, 0xee, 0x88, 0xe1, 0xd3, 0x8a, 0xa0, 0x57, 0x8c, 0x28, 0x2e, 0xb9, 0x42, 0xa5, 0x94, 0xfc, 0x1b, 0x65, 0x17, + 0x15, 0x72, 0x56, 0xb0, 0x7b, 0x45, 0x8e, 0x8c, 0x1f, 0x04, 0x13, 0x5f, 0x0e, 0xee, 0xbf, 0xc4, 0x3b, 0x9c, 0x29, + 0x8e, 0xe4, 0x84, 0x3f, 0x64, 0x18, 0xd8, 0x9f, 0x83, 0xcf, 0xab, 0xc3, 0xbc, 0xbc, 0xd1, 0xa7, 0xdc, 0x92, 0x8f, + 0x27, 0xcb, 0x2b, 0x30, 0xd8, 0x2f, 0x55, 0x73, 0xd7, 0xbc, 0x9e, 0x2d, 0xe7, 0x6c, 0x3f, 0x8b, 0xe6, 0xc1, 0x1d, + 0x9b, 0x65, 0xf3, 0x60, 0xd5, 0xf0, 0x35, 0xbb, 0xe5, 0x6b, 0xab, 0x6a, 0x6b, 0xbb, 0x6a, 0x93, 0x0d, 0xbf, 0x05, + 0x09, 0xe1, 0x26, 0xf3, 0x80, 0xf7, 0xf8, 0xce, 0x67, 0x1b, 0x90, 0x68, 0x57, 0x6c, 0x03, 0x17, 0xb1, 0x35, 0xff, + 0xa1, 0xf2, 0x36, 0xac, 0x64, 0xe7, 0x63, 0x96, 0xe3, 0xfc, 0xf3, 0xe1, 0x01, 0xed, 0x85, 0xfa, 0xd9, 0xa5, 0x7a, + 0x36, 0x51, 0x76, 0xb3, 0xcd, 0x68, 0x71, 0x9f, 0x56, 0x9b, 0x30, 0x43, 0xcf, 0x72, 0xf8, 0x68, 0x2b, 0x05, 0x3f, + 0xbd, 0xc0, 0x2f, 0xd9, 0x51, 0x5b, 0x69, 0xdb, 0xae, 0x4a, 0x6c, 0x05, 0x2d, 0x8a, 0xac, 0x56, 0x78, 0x60, 0xce, + 0xaf, 0x61, 0x01, 0x63, 0xcf, 0x71, 0xce, 0x6b, 0x7f, 0x84, 0x8c, 0xf7, 0x0e, 0x00, 0x5a, 0xe6, 0x38, 0xc0, 0x23, + 0x56, 0x8c, 0xa2, 0xc1, 0x3b, 0xbf, 0x54, 0x56, 0x2b, 0xcd, 0x49, 0x68, 0x1b, 0xb1, 0x6a, 0x39, 0x52, 0x35, 0x23, + 0xd2, 0x07, 0xe9, 0x79, 0xdf, 0x23, 0xaa, 0xc1, 0x9e, 0xcc, 0xeb, 0xc0, 0x3e, 0xbd, 0x6c, 0xad, 0xea, 0xce, 0xef, + 0xa9, 0xd2, 0x25, 0x47, 0xb6, 0xfc, 0x74, 0x19, 0x3e, 0xa8, 0x3f, 0x25, 0xd7, 0x87, 0x02, 0x47, 0x78, 0xac, 0x02, + 0xce, 0xd7, 0x2b, 0xd1, 0xee, 0x44, 0xd8, 0x95, 0x4b, 0x40, 0x88, 0x2f, 0x69, 0x9a, 0xe3, 0x71, 0x44, 0x13, 0x11, + 0x36, 0x31, 0xfa, 0x0b, 0xbb, 0x0f, 0x25, 0x96, 0xf3, 0x5c, 0x83, 0x92, 0x4b, 0x06, 0xef, 0x49, 0x7b, 0x0d, 0x9a, + 0xe5, 0x55, 0xa9, 0xc9, 0x44, 0x0e, 0xca, 0x87, 0x43, 0x01, 0x7b, 0xa9, 0xf1, 0xd3, 0x84, 0x9f, 0xb0, 0xbc, 0xb5, + 0xb7, 0xa6, 0x14, 0x95, 0x34, 0x40, 0x05, 0x3e, 0x66, 0xf0, 0xbf, 0x3b, 0x43, 0x2c, 0x98, 0xa2, 0xe3, 0x87, 0x33, + 0x31, 0xb7, 0x9e, 0x5b, 0x65, 0x1d, 0x65, 0x6b, 0x94, 0x13, 0xf0, 0x6f, 0xa9, 0x8e, 0x93, 0x44, 0x38, 0xf5, 0x1e, + 0x71, 0x51, 0xf7, 0x72, 0x88, 0xba, 0x61, 0x6f, 0x2a, 0x1d, 0x6c, 0x39, 0x4d, 0x83, 0x23, 0xf1, 0x2b, 0xf5, 0xd9, + 0xfb, 0xcc, 0xe2, 0x51, 0x47, 0x36, 0xa2, 0x24, 0x8d, 0x63, 0x91, 0xc3, 0xf6, 0xbe, 0x90, 0xfb, 0x7f, 0xbf, 0x0f, + 0xe1, 0xa4, 0x55, 0x90, 0x94, 0x9e, 0x40, 0x44, 0x38, 0x3a, 0xfc, 0x88, 0xf0, 0x44, 0xaa, 0x0a, 0x9f, 0xd4, 0x27, + 0x6e, 0xcc, 0xee, 0x85, 0x39, 0xaa, 0xb7, 0x00, 0xc3, 0x58, 0x6f, 0x2d, 0x42, 0x12, 0xad, 0x34, 0xa3, 0xad, 0x07, + 0xc4, 0x88, 0xf7, 0x6b, 0x8b, 0x0c, 0xc6, 0xda, 0x92, 0x48, 0x00, 0xbf, 0x23, 0x21, 0x43, 0xdb, 0x46, 0x60, 0xc6, + 0xf0, 0x76, 0x56, 0x5c, 0xba, 0x0e, 0xdb, 0x9c, 0xc3, 0x17, 0xb2, 0xd0, 0xac, 0x23, 0x4a, 0x13, 0x84, 0xfc, 0x03, + 0x4e, 0x16, 0x0a, 0xa3, 0x79, 0x75, 0x94, 0x4e, 0x12, 0xeb, 0xfb, 0xae, 0x52, 0xc1, 0x66, 0x73, 0x83, 0xfa, 0xb2, + 0xa3, 0xe4, 0x97, 0xe0, 0xa4, 0xe3, 0x24, 0x8b, 0x1c, 0x44, 0x2d, 0x2a, 0xe7, 0x26, 0x09, 0x4b, 0xbb, 0x3a, 0xd5, + 0x66, 0xbd, 0x2e, 0xca, 0xba, 0x7a, 0x25, 0x22, 0x45, 0xef, 0xa3, 0x1e, 0x3d, 0x91, 0x90, 0x0a, 0xad, 0x4a, 0xed, + 0xf2, 0x08, 0xdc, 0x36, 0xb5, 0x62, 0x5b, 0x2e, 0x61, 0x89, 0x1a, 0xff, 0x09, 0xfa, 0x28, 0x17, 0x0f, 0x32, 0x40, + 0xa3, 0xe3, 0xa9, 0x79, 0xeb, 0x91, 0x57, 0x8e, 0xf2, 0x4b, 0xab, 0x4d, 0xfa, 0x05, 0x90, 0x19, 0xed, 0x1f, 0x2d, + 0x25, 0x90, 0x19, 0x98, 0x49, 0x4b, 0x43, 0x22, 0x47, 0x31, 0x4b, 0xf3, 0x3f, 0x70, 0xc5, 0x56, 0x88, 0x34, 0xac, + 0xe6, 0x1e, 0x7f, 0x51, 0x79, 0xb5, 0x5c, 0xcb, 0x4c, 0x73, 0xb3, 0xc4, 0xb1, 0x62, 0x71, 0x51, 0xaf, 0x2b, 0x91, + 0x05, 0x42, 0x1c, 0x61, 0x1a, 0xeb, 0xa9, 0x37, 0x4a, 0xab, 0x0f, 0x48, 0x28, 0xf3, 0x03, 0xf6, 0x76, 0xec, 0xf5, + 0x20, 0x0b, 0x71, 0x6c, 0x39, 0xd8, 0x6c, 0xbd, 0x4f, 0x65, 0x2a, 0xe2, 0xb3, 0xba, 0x38, 0xdb, 0x54, 0xe2, 0xac, + 0x4e, 0xc4, 0xd9, 0x77, 0x90, 0xf3, 0xbb, 0x33, 0x2a, 0xfa, 0xec, 0x21, 0xad, 0x93, 0x62, 0x53, 0xd3, 0x93, 0xd7, + 0x58, 0xc6, 0x77, 0x67, 0xc4, 0x55, 0x73, 0x46, 0x23, 0x19, 0x8f, 0xce, 0x3e, 0x64, 0x40, 0xf2, 0x7a, 0x96, 0xae, + 0x60, 0xf0, 0xce, 0xc2, 0x3c, 0x3e, 0x2b, 0xc5, 0x1d, 0x58, 0x9c, 0xca, 0xce, 0xf7, 0x20, 0xc3, 0x2a, 0xfc, 0x43, + 0x9c, 0x01, 0xb4, 0xeb, 0x59, 0x5a, 0x9f, 0xa5, 0xd5, 0x59, 0x5e, 0xd4, 0x67, 0x4a, 0x0a, 0x87, 0x30, 0x7e, 0x78, + 0x4f, 0x5f, 0xd9, 0xe5, 0x6d, 0x16, 0x77, 0x59, 0xe4, 0x4f, 0xd1, 0xab, 0x88, 0x98, 0x34, 0x2a, 0xe1, 0xb5, 0xfb, + 0xdb, 0xe6, 0xfe, 0xe1, 0x75, 0x63, 0xf7, 0xb3, 0x3b, 0x46, 0x74, 0x41, 0x3d, 0x5e, 0x49, 0x4a, 0x05, 0x05, 0x04, + 0x4e, 0x34, 0x6b, 0x3c, 0xb8, 0xe3, 0x80, 0x57, 0x03, 0x5b, 0xb2, 0xb5, 0xcf, 0xaf, 0x63, 0x19, 0xa6, 0xbd, 0x09, + 0xf0, 0xaf, 0xb2, 0x37, 0x5d, 0x07, 0x4b, 0xbc, 0x6f, 0x21, 0xdb, 0xd0, 0x9b, 0x57, 0xfc, 0x85, 0x97, 0xab, 0xbf, + 0xd9, 0x3f, 0x01, 0x08, 0x03, 0x62, 0x56, 0x7d, 0x34, 0x71, 0xef, 0xac, 0x2c, 0x3b, 0x27, 0xcb, 0xae, 0x87, 0x7e, + 0x4d, 0x62, 0x54, 0x5a, 0x59, 0x4a, 0x27, 0x4b, 0x09, 0x59, 0xc0, 0x27, 0x46, 0x53, 0x1b, 0x01, 0x84, 0xed, 0x28, + 0x95, 0x2f, 0x54, 0x5e, 0x44, 0xe1, 0x9c, 0xe0, 0x79, 0x22, 0x46, 0xf7, 0x56, 0x32, 0x60, 0x38, 0x84, 0x60, 0x0e, + 0xda, 0x62, 0x6f, 0xe8, 0x26, 0xe2, 0xaf, 0xd7, 0x45, 0xf9, 0x26, 0x26, 0x9f, 0x82, 0xdd, 0xc9, 0xc7, 0x25, 0x3c, + 0x2e, 0x4f, 0x3e, 0x0e, 0xd1, 0x23, 0xe1, 0xe4, 0x63, 0xf0, 0x3d, 0x92, 0xf3, 0xba, 0xeb, 0x71, 0x82, 0xdc, 0x42, + 0xba, 0xbf, 0x1d, 0x93, 0x00, 0xcd, 0x6b, 0x58, 0x8e, 0x9a, 0x8a, 0x6b, 0x66, 0xc6, 0x78, 0xde, 0xe8, 0xfd, 0xb1, + 0xe3, 0x2d, 0x53, 0x28, 0x66, 0x31, 0xaf, 0xe1, 0xf7, 0xac, 0x0a, 0xd4, 0x5d, 0x6f, 0x93, 0xdc, 0x32, 0xab, 0xe7, + 0x68, 0xf7, 0x7d, 0x5f, 0x27, 0x82, 0xda, 0xdf, 0x61, 0xcf, 0x33, 0xeb, 0x5d, 0x15, 0x03, 0x97, 0x2a, 0xd9, 0x21, + 0x53, 0xd5, 0xf4, 0x40, 0xa5, 0x34, 0x78, 0x7a, 0x69, 0x5d, 0xbe, 0x54, 0xda, 0xc8, 0x33, 0xcd, 0x6f, 0x00, 0x2f, + 0xa6, 0x2e, 0x8b, 0xdd, 0x57, 0xf7, 0x15, 0xdc, 0xc6, 0xfb, 0xfd, 0x65, 0xe5, 0x99, 0x9f, 0xb8, 0x00, 0xec, 0x4d, + 0x85, 0xd6, 0x09, 0x94, 0x1a, 0xd6, 0xe1, 0xcb, 0x44, 0x44, 0x7f, 0xb4, 0xcb, 0x75, 0xe6, 0x3a, 0x60, 0x44, 0x11, + 0xbf, 0x8d, 0x47, 0x7f, 0x80, 0xe2, 0xda, 0xd8, 0x03, 0xc2, 0x3a, 0x24, 0xf4, 0x19, 0x01, 0x48, 0x3d, 0xe6, 0x28, + 0x01, 0xcd, 0x8a, 0xe6, 0x8e, 0xc9, 0xcf, 0xf5, 0x95, 0xd2, 0xdf, 0x2f, 0x2b, 0x8f, 0xcc, 0x29, 0x6d, 0x33, 0x8d, + 0xd5, 0x9a, 0x4a, 0x20, 0xbc, 0xa2, 0x92, 0x55, 0xf8, 0x6c, 0xde, 0x88, 0x7e, 0x5f, 0x1e, 0xe1, 0x69, 0xf5, 0xc3, + 0x16, 0xe3, 0x5b, 0x01, 0xd1, 0x48, 0x00, 0xf4, 0x13, 0xc0, 0xbc, 0xc8, 0x66, 0x76, 0x1f, 0x07, 0x54, 0x29, 0xd1, + 0x34, 0xce, 0xe6, 0xf9, 0x2d, 0xbd, 0x29, 0x3b, 0xe8, 0xd4, 0xa9, 0x02, 0x17, 0x5c, 0x95, 0x8c, 0x57, 0xd6, 0x13, + 0xf9, 0xfc, 0xe6, 0x76, 0x93, 0x66, 0xf1, 0xfb, 0xf2, 0x9f, 0x38, 0xb6, 0xba, 0x0e, 0x8f, 0x4c, 0x9d, 0xae, 0x9d, + 0x47, 0x5a, 0x7b, 0x21, 0x20, 0xa2, 0x5d, 0x43, 0xad, 0x17, 0x16, 0x7a, 0xa4, 0x27, 0xc2, 0x39, 0x49, 0xd4, 0xb4, + 0x03, 0x2d, 0x8d, 0xd0, 0xd7, 0xd7, 0x9c, 0xfe, 0xc2, 0x60, 0xed, 0xf3, 0x31, 0x03, 0xb2, 0x12, 0xfd, 0x58, 0x3d, + 0x34, 0x36, 0x73, 0xe8, 0x59, 0xab, 0xf2, 0xcc, 0xab, 0x0e, 0x07, 0xc4, 0x87, 0xd1, 0x5f, 0xf2, 0xfb, 0xfd, 0x57, + 0x34, 0xff, 0x98, 0x50, 0xe3, 0x67, 0x9b, 0x01, 0xba, 0xf6, 0x5d, 0x79, 0x20, 0xea, 0xb9, 0x56, 0x09, 0x42, 0xbc, + 0x41, 0x4c, 0x34, 0x23, 0xe6, 0xe0, 0xb4, 0x43, 0xcd, 0x3f, 0x49, 0x0d, 0x08, 0x51, 0xe2, 0x75, 0x4c, 0x59, 0x90, + 0xd3, 0x26, 0x8e, 0xf4, 0xa3, 0x70, 0x22, 0x3f, 0x8a, 0xaa, 0xc8, 0xee, 0xe1, 0x82, 0xc1, 0xd4, 0x7b, 0xda, 0x2f, + 0xd1, 0x6f, 0x09, 0x47, 0xce, 0xd1, 0xaa, 0x10, 0x44, 0x4e, 0x08, 0x6b, 0x0d, 0x61, 0x82, 0xd8, 0x20, 0x5e, 0xf6, + 0x5d, 0x92, 0xe1, 0x48, 0xc1, 0x65, 0x1d, 0x3b, 0xc6, 0x5c, 0x1d, 0x55, 0xaf, 0x01, 0x8c, 0x57, 0x8e, 0xa0, 0xd9, + 0x28, 0xb2, 0x4b, 0x88, 0x2a, 0x72, 0x3c, 0x01, 0xb5, 0x83, 0xd2, 0xd8, 0x4c, 0xcf, 0xc7, 0x41, 0x3e, 0x5a, 0x54, + 0xa8, 0x73, 0x62, 0x19, 0xaf, 0x01, 0x58, 0x3b, 0x57, 0xfd, 0x3c, 0xab, 0xc1, 0x93, 0x86, 0xf8, 0x7c, 0x8c, 0xb6, + 0x57, 0x36, 0x07, 0xd5, 0x76, 0x3a, 0x2b, 0xaf, 0x98, 0x2e, 0x07, 0xc6, 0x7d, 0xc3, 0x2b, 0x8a, 0x33, 0xfc, 0xe8, + 0xc1, 0x16, 0xe7, 0x4f, 0x37, 0xd4, 0x7e, 0xcc, 0x8d, 0x7a, 0x18, 0x68, 0x2d, 0x78, 0x53, 0x10, 0xeb, 0xef, 0x87, + 0x8e, 0x6c, 0xef, 0xb5, 0xc8, 0x68, 0xf2, 0xd9, 0xcf, 0x3f, 0x94, 0xe9, 0x2a, 0x85, 0xfb, 0x92, 0x93, 0x45, 0x33, + 0x0f, 0x81, 0xbd, 0x21, 0x86, 0xeb, 0xa3, 0xc2, 0x23, 0xca, 0xfa, 0x7d, 0xf8, 0x7d, 0x95, 0x81, 0x29, 0x06, 0xae, + 0x2b, 0x04, 0xe3, 0x21, 0x10, 0xc4, 0xc3, 0x34, 0x3a, 0x19, 0xd4, 0xa0, 0x0d, 0xdf, 0x00, 0x64, 0x06, 0x78, 0x64, + 0x2e, 0x3d, 0x02, 0xee, 0x02, 0xd7, 0x9e, 0x8c, 0xc7, 0xfe, 0xc4, 0x34, 0x34, 0x6a, 0x4a, 0x33, 0x3d, 0x37, 0x7e, + 0xd3, 0x51, 0x2d, 0xd7, 0xce, 0x7f, 0x7c, 0xc9, 0x6f, 0xd0, 0x0b, 0x5a, 0x5e, 0xee, 0x23, 0x75, 0xb9, 0xcf, 0x28, + 0x2e, 0x13, 0xc9, 0x61, 0x41, 0x2c, 0x4b, 0x38, 0xf0, 0x18, 0x95, 0x2c, 0xb6, 0xf4, 0x58, 0x15, 0x2d, 0x5f, 0x94, + 0x1b, 0xa4, 0x43, 0x27, 0x04, 0x4b, 0x54, 0x10, 0x2c, 0x81, 0x71, 0x11, 0x6b, 0xbe, 0x19, 0xe4, 0x2c, 0x9e, 0x6d, + 0xe6, 0x1c, 0x09, 0xeb, 0x92, 0xc3, 0xa1, 0x90, 0x60, 0x33, 0xd9, 0x6c, 0x3d, 0x67, 0x6b, 0x9f, 0x81, 0x12, 0xa0, + 0x94, 0x69, 0x82, 0xd2, 0xb4, 0x62, 0x2b, 0x6e, 0x5a, 0x83, 0xd5, 0x6a, 0xca, 0x56, 0x35, 0x65, 0xe7, 0x34, 0xe5, + 0xa8, 0x82, 0x92, 0x13, 0x4a, 0x51, 0x86, 0x01, 0x8c, 0xd8, 0x24, 0xba, 0xca, 0xd0, 0xc7, 0x3b, 0xe1, 0x11, 0x54, + 0x11, 0x91, 0x4f, 0x18, 0x42, 0x60, 0x22, 0x8a, 0x0b, 0x55, 0x28, 0x06, 0xc8, 0x88, 0x04, 0x82, 0x89, 0x4a, 0x9d, + 0x02, 0xf3, 0xd1, 0x54, 0x31, 0x6c, 0xda, 0x13, 0xe5, 0x5b, 0xea, 0xb8, 0x47, 0xd9, 0xe6, 0xef, 0x62, 0x17, 0x84, + 0xc8, 0xdd, 0xb8, 0x53, 0x3f, 0x23, 0xde, 0xdb, 0x1d, 0x61, 0xfc, 0x64, 0xc7, 0x2d, 0xc2, 0x15, 0xc1, 0x96, 0x6a, + 0x0e, 0xb1, 0x98, 0x57, 0x93, 0x04, 0xb5, 0x2c, 0x89, 0xbf, 0xe1, 0xc9, 0x20, 0x67, 0x4b, 0xf0, 0xa0, 0x9d, 0xb3, + 0x0c, 0xf0, 0x57, 0xac, 0x16, 0xfd, 0x56, 0x7b, 0x4b, 0x90, 0x9f, 0x36, 0x76, 0xa3, 0x30, 0x31, 0x82, 0x44, 0xdd, + 0xae, 0x0c, 0xe4, 0x87, 0x0f, 0x38, 0x1d, 0x8f, 0x3d, 0x65, 0xcc, 0xad, 0x4c, 0x2f, 0xd3, 0xb9, 0x92, 0x6f, 0xe4, + 0x5e, 0xfa, 0xd8, 0x4b, 0xb0, 0x73, 0xc0, 0x1b, 0x48, 0x1b, 0x78, 0x03, 0xdb, 0x85, 0xd7, 0x06, 0x09, 0x33, 0x02, + 0x6c, 0x71, 0x7c, 0x8c, 0x94, 0xc0, 0x10, 0x8e, 0xb3, 0x14, 0x80, 0x69, 0xf4, 0x65, 0xb6, 0xb2, 0x2f, 0xb3, 0x5a, + 0xb3, 0xa5, 0x72, 0xba, 0x77, 0x6e, 0xdd, 0xce, 0x27, 0x12, 0x00, 0x4c, 0xea, 0x1c, 0x88, 0x33, 0x13, 0xec, 0xd2, + 0x24, 0xb2, 0x7c, 0x0c, 0xf3, 0x3b, 0xf1, 0xba, 0x2c, 0x56, 0xaa, 0x2b, 0xda, 0x3e, 0x33, 0xf9, 0x8c, 0x74, 0x12, + 0x2a, 0xa0, 0xa0, 0x90, 0x6b, 0x7d, 0xfa, 0x2e, 0x7c, 0x17, 0x14, 0x1a, 0x98, 0xad, 0xc2, 0x3d, 0x4d, 0xd6, 0x48, + 0xbd, 0x51, 0xf5, 0xfb, 0xe4, 0x1a, 0x48, 0x75, 0xe6, 0xd0, 0xb2, 0x27, 0x15, 0x06, 0x88, 0x1d, 0xf5, 0x19, 0x09, + 0x75, 0x20, 0xf5, 0x80, 0x21, 0x44, 0xdb, 0xf4, 0xf1, 0x27, 0x43, 0xa2, 0x0b, 0xb0, 0x85, 0x68, 0x03, 0x3f, 0xfe, + 0x04, 0xfb, 0x2c, 0x08, 0x8f, 0x69, 0xfe, 0x16, 0x92, 0x8e, 0x0d, 0x9c, 0x56, 0x9f, 0x82, 0x0f, 0x92, 0x1c, 0x4c, + 0xd4, 0xc1, 0xcb, 0xfd, 0xa5, 0xdf, 0x87, 0x2d, 0x3b, 0x97, 0x52, 0x1d, 0x2b, 0xf5, 0xb6, 0xad, 0xfd, 0x20, 0xda, + 0x82, 0x23, 0x8b, 0xf8, 0xfb, 0x0c, 0x11, 0xc1, 0xcc, 0x20, 0xc2, 0xae, 0x85, 0xba, 0xdb, 0x53, 0x6a, 0x59, 0xd4, + 0xdb, 0x9e, 0x52, 0xea, 0x36, 0x0c, 0xdf, 0x4d, 0x30, 0x53, 0xdc, 0xf0, 0x3f, 0x32, 0x2f, 0xd4, 0x1b, 0x8f, 0x45, + 0x81, 0xee, 0xf9, 0xfb, 0x25, 0xaf, 0x66, 0x1b, 0x65, 0xc2, 0xbc, 0xe3, 0xcb, 0x59, 0x28, 0xbb, 0x5a, 0x1a, 0x77, + 0x3e, 0x7b, 0x4b, 0x35, 0x1f, 0xfc, 0xc3, 0x21, 0x81, 0x78, 0xa3, 0xf8, 0xea, 0xae, 0x91, 0x5b, 0xd7, 0x64, 0x73, + 0x55, 0x02, 0xea, 0xf7, 0xf9, 0x1a, 0xf7, 0x5b, 0xac, 0x7f, 0xf7, 0x34, 0xc8, 0x58, 0xcd, 0x70, 0xc5, 0x14, 0x3e, + 0x05, 0x80, 0xc1, 0xe1, 0x54, 0x90, 0x16, 0x78, 0xc3, 0xcb, 0xe1, 0xe5, 0x64, 0x43, 0x26, 0xdd, 0x8d, 0x8f, 0xdc, + 0x59, 0xa0, 0xea, 0xfd, 0x86, 0xe2, 0xa4, 0x41, 0xa2, 0xb1, 0xd7, 0xe0, 0x8b, 0x2c, 0xa3, 0x5c, 0x34, 0x71, 0x1f, + 0x93, 0xaf, 0xf4, 0x00, 0xe6, 0x2a, 0x94, 0x00, 0xd1, 0x6f, 0x2c, 0x8b, 0x8d, 0x68, 0x5b, 0x6c, 0x60, 0x29, 0x55, + 0x73, 0xbd, 0x9a, 0x3e, 0x7b, 0x25, 0x9a, 0xf7, 0xd1, 0x8c, 0x53, 0x1a, 0x0d, 0x38, 0x4e, 0xa3, 0x70, 0xfb, 0xfe, + 0x5e, 0x94, 0xcb, 0x0c, 0x2c, 0xd9, 0x2a, 0x9c, 0xe2, 0xb2, 0x51, 0x67, 0xc4, 0x8b, 0x3c, 0x56, 0x00, 0x1d, 0x8f, + 0x09, 0x80, 0xea, 0x82, 0x80, 0x8a, 0x68, 0x29, 0xbd, 0x15, 0x5a, 0x2c, 0xd4, 0x1b, 0x8e, 0x52, 0xf8, 0x23, 0xfd, + 0x79, 0x90, 0x4f, 0x01, 0x88, 0x5d, 0x1f, 0x47, 0xaf, 0x8b, 0x92, 0x3e, 0x55, 0xcc, 0x72, 0x39, 0x98, 0xc0, 0xae, + 0x4e, 0x64, 0xa8, 0x15, 0xe4, 0xad, 0xba, 0xf2, 0x56, 0x26, 0x6f, 0x63, 0x9c, 0x92, 0x1f, 0xb9, 0xe9, 0x58, 0x23, + 0x06, 0x5e, 0x79, 0x5a, 0xa7, 0x09, 0xd2, 0xe4, 0x02, 0x18, 0x86, 0xf8, 0x36, 0xf3, 0x5e, 0x78, 0x8e, 0x54, 0x05, + 0xc9, 0x6c, 0x97, 0x79, 0xea, 0x22, 0xaa, 0xaf, 0x9c, 0x5a, 0x3a, 0x73, 0xfa, 0x11, 0xc0, 0x7b, 0x4c, 0x4d, 0x1a, + 0xf2, 0x11, 0x6e, 0x4b, 0xf1, 0xf5, 0x56, 0x5d, 0xe3, 0xa5, 0xd1, 0xb9, 0x7b, 0xf9, 0xd2, 0x9d, 0x06, 0xfd, 0x14, + 0x04, 0xe5, 0x7c, 0x51, 0x0a, 0xd8, 0x53, 0x66, 0x73, 0xbd, 0x5a, 0xb5, 0x42, 0xeb, 0x70, 0x18, 0x6b, 0x47, 0x21, + 0xad, 0xce, 0x02, 0xb6, 0x1a, 0xe9, 0x94, 0x00, 0x21, 0x38, 0x4e, 0xc3, 0x4e, 0x30, 0xee, 0xd2, 0x69, 0x44, 0xd6, + 0x2b, 0x25, 0xe9, 0xc2, 0x0c, 0x92, 0x7f, 0x92, 0xd7, 0x33, 0xa0, 0x25, 0x80, 0x43, 0x11, 0x4b, 0x78, 0x38, 0x49, + 0xae, 0x00, 0x3a, 0x1d, 0x0e, 0x2a, 0x0d, 0xcd, 0x59, 0xcd, 0x92, 0xf9, 0x24, 0x96, 0xaa, 0xca, 0xc3, 0xc1, 0x53, + 0x6e, 0x06, 0xfd, 0x7e, 0x36, 0x2d, 0x95, 0x0b, 0x40, 0x10, 0xeb, 0xc2, 0x00, 0xf1, 0x48, 0x0b, 0x4f, 0x16, 0x7d, + 0x4a, 0xe2, 0x97, 0xb3, 0x64, 0x6e, 0xb2, 0xe1, 0x1d, 0x18, 0xc1, 0x66, 0x5c, 0x97, 0x94, 0x69, 0x8f, 0xca, 0xef, + 0x19, 0x3d, 0xb5, 0x7d, 0xad, 0xd5, 0x16, 0xb1, 0xae, 0x83, 0xab, 0x12, 0xf5, 0x14, 0x1f, 0x94, 0x24, 0x78, 0xbf, + 0x72, 0x6e, 0x46, 0xca, 0xd7, 0x22, 0xf7, 0x83, 0x76, 0xa6, 0x56, 0x0e, 0x1c, 0x81, 0x1c, 0xab, 0xa8, 0xe4, 0xf5, + 0xae, 0x43, 0xf0, 0xe8, 0xae, 0x54, 0xa0, 0x1c, 0x7c, 0x0d, 0x62, 0x74, 0x7d, 0xd5, 0x59, 0x43, 0xcd, 0x34, 0xaa, + 0x3c, 0x82, 0x4e, 0x1d, 0xc0, 0x93, 0x82, 0x97, 0x5a, 0xfd, 0x78, 0x38, 0x78, 0xe6, 0x07, 0x7f, 0x99, 0xe9, 0x5b, + 0x88, 0x89, 0x72, 0xaa, 0x11, 0x12, 0x57, 0x4a, 0x12, 0xf1, 0xf1, 0xa2, 0x65, 0xc5, 0xa8, 0x0c, 0x1f, 0x78, 0xa5, + 0xca, 0x57, 0xa7, 0x2a, 0x2f, 0x46, 0xda, 0x96, 0xc0, 0x6b, 0xf2, 0x0f, 0x91, 0x6b, 0xde, 0xfa, 0xba, 0xab, 0x0c, + 0x7d, 0x2b, 0x2b, 0xd0, 0x11, 0x6c, 0x65, 0x29, 0x39, 0xe0, 0x93, 0xea, 0xae, 0x5a, 0xb5, 0x3e, 0xa7, 0x6c, 0x23, + 0xdc, 0xe4, 0xd7, 0xb1, 0x83, 0x23, 0xe5, 0x37, 0x78, 0x2e, 0x80, 0xbd, 0x06, 0xec, 0xcd, 0x39, 0x2b, 0x9a, 0x47, + 0x87, 0xb4, 0x2d, 0xd0, 0xc8, 0xcc, 0xed, 0x5c, 0xdd, 0xb7, 0xe5, 0x51, 0x1a, 0x43, 0x64, 0xda, 0x23, 0xd3, 0xc1, + 0x66, 0x94, 0xff, 0x96, 0xf2, 0x5b, 0x85, 0x63, 0xe0, 0xdb, 0xa9, 0x77, 0x00, 0x55, 0x4f, 0x1b, 0x64, 0xac, 0x19, + 0x86, 0x56, 0x76, 0xb9, 0x14, 0x5a, 0x82, 0x96, 0xba, 0x09, 0x82, 0xf3, 0x23, 0xa2, 0x1c, 0x01, 0xe8, 0x22, 0x05, + 0x4c, 0xf0, 0x53, 0xda, 0xee, 0x7e, 0x7f, 0x9d, 0x7a, 0xe4, 0xde, 0x15, 0x6a, 0x94, 0x50, 0x82, 0xb1, 0x9f, 0x68, + 0xcc, 0xa0, 0xa3, 0x2b, 0x72, 0xc2, 0xb3, 0x56, 0x87, 0x75, 0xdd, 0x94, 0x41, 0x59, 0x1c, 0xf3, 0x6a, 0x3a, 0xfb, + 0xfd, 0xc9, 0xbe, 0x6e, 0x90, 0x85, 0xfc, 0x77, 0xd6, 0x43, 0x32, 0xe8, 0x1e, 0x84, 0x42, 0xf4, 0xe6, 0xc1, 0x0c, + 0xff, 0x63, 0x1b, 0x9e, 0x7d, 0xc3, 0x8d, 0x3a, 0x01, 0xcc, 0x11, 0xd7, 0x4b, 0x4f, 0xd1, 0xd6, 0xc3, 0x2d, 0x90, + 0xad, 0xf1, 0xf2, 0xd6, 0x5e, 0x03, 0x39, 0xc5, 0xf1, 0xdf, 0xf1, 0x4c, 0xad, 0x6c, 0xf0, 0xd3, 0x53, 0xb6, 0x03, + 0x0f, 0x2f, 0x42, 0x40, 0x31, 0x2c, 0x1b, 0x7f, 0x67, 0x39, 0xce, 0xe8, 0xbf, 0x79, 0xc4, 0x30, 0x58, 0x44, 0x7e, + 0x7c, 0x59, 0x0a, 0xf1, 0x45, 0x78, 0x6f, 0x2a, 0xef, 0x8e, 0x9c, 0x32, 0xef, 0xf4, 0x30, 0xba, 0x2e, 0x49, 0xdf, + 0x24, 0x1f, 0x5b, 0xc3, 0xf6, 0xbb, 0x76, 0xbf, 0x19, 0x22, 0x08, 0xa1, 0x1c, 0x3f, 0x67, 0x74, 0x42, 0xe3, 0xc3, + 0x6a, 0x76, 0x7a, 0xfd, 0xde, 0x39, 0x5e, 0xb0, 0x35, 0x1a, 0xe0, 0xf1, 0xd0, 0xc5, 0x3c, 0x51, 0x43, 0xa7, 0xeb, + 0xda, 0x39, 0x78, 0x60, 0x90, 0xe5, 0xc9, 0x37, 0x0c, 0x4b, 0xec, 0x4f, 0x22, 0x9e, 0xb4, 0x55, 0x1b, 0x9b, 0x23, + 0xd5, 0x46, 0xcd, 0xc0, 0x0f, 0x5e, 0x41, 0x81, 0xd1, 0x05, 0x69, 0x05, 0xc6, 0xe1, 0x08, 0x40, 0x56, 0x8c, 0xe3, + 0x91, 0xc1, 0x04, 0x86, 0x74, 0x43, 0x51, 0x00, 0x1e, 0x1e, 0xc7, 0x83, 0x90, 0x01, 0xa4, 0x0b, 0x1e, 0x1a, 0xb6, + 0x49, 0x48, 0xf9, 0x79, 0x9e, 0xd7, 0x6a, 0x08, 0x7d, 0x67, 0xa1, 0x3a, 0xf6, 0x23, 0xed, 0x15, 0xeb, 0x5a, 0x95, + 0x8e, 0x6c, 0x75, 0x80, 0xbe, 0x21, 0x03, 0xdf, 0x3a, 0xb6, 0x00, 0x88, 0x96, 0xf8, 0x2d, 0xf5, 0x6a, 0x5f, 0xc6, + 0xac, 0x50, 0xaf, 0x2f, 0x4c, 0xbb, 0x5e, 0x49, 0x8b, 0x02, 0x2a, 0x6e, 0x5b, 0xb5, 0x3d, 0x92, 0xf3, 0x1f, 0xdf, + 0x75, 0xb4, 0xe3, 0xb3, 0x53, 0x63, 0x4b, 0x28, 0x73, 0x8b, 0x27, 0xb2, 0x3a, 0xda, 0x52, 0x9d, 0xea, 0x03, 0x2e, + 0x35, 0xa9, 0xce, 0x0c, 0x0c, 0xaf, 0x11, 0xa0, 0xdc, 0x42, 0x24, 0x8d, 0xc3, 0xde, 0xf9, 0x64, 0x50, 0x30, 0xb7, + 0x48, 0x40, 0x02, 0xdb, 0xd8, 0xda, 0x45, 0x73, 0xfd, 0xfa, 0x2d, 0xf5, 0xaa, 0x36, 0x55, 0x3d, 0x78, 0xe3, 0x05, + 0xce, 0xde, 0x69, 0x2d, 0x20, 0x80, 0xc2, 0xd6, 0xb2, 0x1c, 0x9c, 0xbb, 0x5d, 0xd5, 0x52, 0x51, 0x46, 0xfd, 0xfe, + 0xf9, 0x6f, 0x29, 0x2a, 0x62, 0x4f, 0x15, 0xa7, 0xac, 0xdf, 0x6e, 0x99, 0x8b, 0xca, 0x92, 0x37, 0xa8, 0xa2, 0xb5, + 0x3a, 0x6a, 0x2a, 0xd7, 0xcd, 0x55, 0x4b, 0x26, 0x88, 0xd1, 0x7d, 0xba, 0xd6, 0xb9, 0x53, 0xef, 0xbd, 0x8a, 0x23, + 0x06, 0x82, 0x9b, 0xee, 0xf1, 0xc1, 0x41, 0x68, 0x54, 0x94, 0x0b, 0x6e, 0x94, 0x56, 0x95, 0x94, 0x42, 0xde, 0xaa, + 0x68, 0xce, 0xf4, 0x11, 0x00, 0x11, 0x60, 0x95, 0xa8, 0xff, 0xc3, 0x97, 0xc6, 0x78, 0xf0, 0xc0, 0xd7, 0xe4, 0x3a, + 0xb6, 0xde, 0x3f, 0xad, 0x91, 0x56, 0x1b, 0xc7, 0xa4, 0x56, 0xbd, 0x6c, 0x15, 0x2f, 0xbb, 0xd7, 0xa9, 0x18, 0x3c, + 0xff, 0x9f, 0xfb, 0x00, 0x35, 0xa2, 0xa5, 0x0c, 0x6e, 0x5d, 0x0d, 0xd0, 0xf8, 0x70, 0x2c, 0x7c, 0xe3, 0x87, 0x8c, + 0xf3, 0xc1, 0x0c, 0x1d, 0xd5, 0xe6, 0xe0, 0x80, 0xe0, 0xa8, 0xee, 0xd1, 0x98, 0x30, 0x0b, 0xe7, 0x1e, 0x04, 0xaa, + 0x4f, 0xdc, 0x67, 0x5c, 0x7b, 0x41, 0x9b, 0xc0, 0x27, 0xeb, 0xba, 0xa6, 0x08, 0x70, 0x11, 0x1b, 0x13, 0x31, 0xc4, + 0x65, 0x93, 0x48, 0x7d, 0x33, 0x06, 0x05, 0x40, 0x71, 0x5d, 0x91, 0x5c, 0xba, 0x48, 0xf3, 0x4a, 0x94, 0xb5, 0x6e, + 0x46, 0xc5, 0x8a, 0x21, 0x00, 0x3c, 0x04, 0xc5, 0x55, 0x65, 0x26, 0x34, 0x62, 0x03, 0xa9, 0x2c, 0x05, 0xab, 0x86, + 0x85, 0xdf, 0xb4, 0xdf, 0x24, 0x27, 0xbd, 0xf3, 0x71, 0xeb, 0xdc, 0xb1, 0xef, 0x1d, 0x85, 0x94, 0xf6, 0x50, 0x4c, + 0x10, 0x04, 0x3f, 0xad, 0xc3, 0xf9, 0x33, 0x7e, 0x4d, 0x60, 0x2a, 0xb2, 0x19, 0x03, 0x0e, 0x42, 0x44, 0x66, 0xfc, + 0x9e, 0xc3, 0x6b, 0x5e, 0x4e, 0xc2, 0xe1, 0xd0, 0x07, 0x7d, 0x28, 0xcf, 0x66, 0xe1, 0x50, 0xcc, 0xa5, 0xf7, 0x3a, + 0x58, 0xeb, 0x42, 0x5e, 0x4f, 0x42, 0x44, 0x0b, 0x0d, 0x7d, 0x70, 0x5e, 0x77, 0xcd, 0x11, 0x96, 0x00, 0x34, 0x71, + 0xf4, 0x65, 0xfd, 0x7e, 0xe4, 0x69, 0x43, 0x8b, 0x14, 0x17, 0x8d, 0x32, 0x9b, 0xe5, 0xb2, 0x13, 0x36, 0xae, 0xdd, + 0x02, 0xa1, 0x78, 0x98, 0xb6, 0x50, 0xb5, 0x9e, 0xea, 0xf5, 0xdc, 0xb4, 0xfb, 0xee, 0x51, 0xb5, 0xca, 0x91, 0xce, + 0xda, 0x74, 0xa5, 0x56, 0xb7, 0x8c, 0xaa, 0x75, 0x96, 0x46, 0x54, 0xb9, 0x49, 0xee, 0x1a, 0xb5, 0xe0, 0x93, 0x0d, + 0x5d, 0xa6, 0xec, 0x6c, 0x0d, 0x4e, 0x1c, 0x79, 0x2e, 0xb9, 0xe5, 0xbb, 0xf3, 0x8a, 0xee, 0x4e, 0xb5, 0x6f, 0x01, + 0xee, 0xcd, 0xb0, 0x21, 0x73, 0x5e, 0x63, 0xa7, 0x41, 0x98, 0x04, 0x7e, 0xc4, 0x3e, 0x66, 0xc8, 0x06, 0x03, 0x3a, + 0x0a, 0xe9, 0x7f, 0x6d, 0x99, 0x23, 0x01, 0x93, 0xbf, 0x9e, 0xfb, 0xcd, 0xa2, 0xc8, 0x61, 0x31, 0x7e, 0xd8, 0x60, + 0xa4, 0xb1, 0x5a, 0x83, 0x61, 0x79, 0x87, 0xc8, 0x9f, 0xda, 0x1d, 0xd3, 0x54, 0xc7, 0x9b, 0xf5, 0x5a, 0xf3, 0xab, + 0xa7, 0x4f, 0x75, 0x7d, 0xfe, 0xdb, 0xf7, 0x97, 0x61, 0xcd, 0xec, 0x0f, 0x41, 0x28, 0xed, 0xde, 0x2d, 0xce, 0x1d, + 0x89, 0xde, 0xb1, 0xd2, 0xcc, 0x2e, 0xed, 0x92, 0x5d, 0x9a, 0xd2, 0x6e, 0xc8, 0xf5, 0xea, 0x2b, 0xe5, 0x8d, 0x9d, + 0x57, 0x4c, 0xf7, 0xef, 0x85, 0xde, 0x51, 0x4e, 0xd5, 0x04, 0x22, 0x9a, 0xb4, 0x23, 0x71, 0xbb, 0x57, 0x86, 0xcf, + 0x27, 0x79, 0xbb, 0x84, 0xa3, 0xae, 0x61, 0xb9, 0xf9, 0xf6, 0x3f, 0xf3, 0xaa, 0xb3, 0xc2, 0xed, 0x97, 0xc6, 0xac, + 0xfd, 0x29, 0x88, 0xab, 0xfa, 0xc3, 0x7b, 0x52, 0x33, 0x25, 0xff, 0x57, 0x3d, 0x06, 0xae, 0x7e, 0x32, 0xed, 0xe8, + 0x9e, 0x42, 0xd8, 0x60, 0xf6, 0xf3, 0xe3, 0x87, 0x16, 0xac, 0xaa, 0x0b, 0x14, 0xc9, 0x01, 0x74, 0xee, 0x92, 0x11, + 0xde, 0xef, 0x18, 0xe7, 0xfe, 0xd5, 0xf7, 0x6a, 0x72, 0x84, 0x88, 0x76, 0x11, 0x0e, 0x00, 0xe2, 0x4e, 0x53, 0x59, + 0x87, 0x1a, 0xa0, 0x0f, 0x08, 0xac, 0x43, 0xdf, 0x66, 0x00, 0x07, 0x7d, 0xb4, 0x79, 0x16, 0x81, 0xbc, 0xee, 0xdd, + 0xb3, 0xb7, 0x6c, 0xe7, 0xf3, 0xeb, 0x55, 0xea, 0xdd, 0xa3, 0x43, 0xf0, 0xf9, 0xd8, 0x9f, 0x5e, 0x06, 0x06, 0x17, + 0x9a, 0xbd, 0x7d, 0x26, 0xd8, 0x8e, 0xed, 0x9e, 0x21, 0x52, 0x51, 0x77, 0xfe, 0xe1, 0xa5, 0x89, 0x9e, 0x77, 0x5e, + 0xb8, 0xe3, 0x4b, 0x00, 0x0f, 0x64, 0x31, 0xa0, 0xf8, 0x2c, 0xbd, 0x7f, 0xb1, 0x04, 0xd4, 0xe4, 0xb7, 0x7c, 0xed, + 0x7d, 0xa1, 0xd4, 0x05, 0xfc, 0x39, 0xa0, 0xf4, 0x49, 0xce, 0xbd, 0xbb, 0xe1, 0xad, 0x7f, 0xf1, 0x1c, 0x9c, 0x27, + 0x56, 0xc3, 0x05, 0xfc, 0x55, 0xf0, 0xa1, 0x77, 0x37, 0xc0, 0xc4, 0x92, 0x0f, 0xbd, 0xd5, 0x00, 0x52, 0x15, 0x2e, + 0x24, 0xc6, 0x3e, 0xfc, 0x1a, 0xe4, 0x0c, 0xff, 0xf8, 0x4d, 0x63, 0xb0, 0xfe, 0x1a, 0x14, 0x1a, 0x8d, 0xb5, 0x54, + 0x21, 0x4b, 0xb1, 0x38, 0x13, 0x60, 0x13, 0x8e, 0xbb, 0x7d, 0xb1, 0xaa, 0xcd, 0x5a, 0xd0, 0x9f, 0x8f, 0xf8, 0x1e, + 0x8d, 0xd5, 0x55, 0x39, 0x17, 0xe5, 0x47, 0xa4, 0x4f, 0x75, 0x7c, 0x8c, 0x8a, 0x4d, 0xdd, 0x9d, 0x4e, 0xb5, 0xea, + 0x48, 0xfb, 0x4d, 0xb9, 0x06, 0x3b, 0x5e, 0x27, 0x47, 0x96, 0xc2, 0xb3, 0x0e, 0x3b, 0x2f, 0x9d, 0x12, 0x1d, 0x86, + 0xf1, 0x6e, 0xab, 0x9e, 0x31, 0x94, 0xe7, 0x06, 0x63, 0xba, 0xe0, 0x11, 0xbf, 0x1e, 0xe4, 0x32, 0x34, 0xe6, 0x03, + 0xb2, 0x61, 0x28, 0x1f, 0x5a, 0x64, 0x48, 0x88, 0x78, 0x0f, 0x95, 0x80, 0x6d, 0x0b, 0xca, 0xa4, 0x80, 0xb3, 0x68, + 0xf0, 0x5b, 0xed, 0xe5, 0xc0, 0x7b, 0x10, 0xf9, 0x8d, 0x74, 0x29, 0x97, 0xd8, 0xe8, 0xc4, 0xb1, 0x2c, 0xb4, 0xf3, + 0xb8, 0xfe, 0x3a, 0x06, 0xf5, 0x7b, 0xa5, 0xdf, 0xa0, 0x9c, 0xfd, 0x51, 0xb2, 0x4e, 0x1b, 0x4f, 0x8c, 0x7f, 0xb8, + 0xca, 0x3f, 0x45, 0x4b, 0x3d, 0xfc, 0x7f, 0xc6, 0x14, 0x4a, 0xff, 0x32, 0x2d, 0xa3, 0xcd, 0x6a, 0x29, 0x4a, 0x91, + 0x47, 0xe2, 0xe4, 0x6b, 0x91, 0x9d, 0xcb, 0x77, 0x3e, 0x85, 0x7e, 0x01, 0x68, 0xd9, 0x27, 0xc8, 0xe8, 0xef, 0x99, + 0xe0, 0xc3, 0xef, 0xb5, 0x73, 0x6d, 0xce, 0xc7, 0x93, 0xfc, 0xca, 0xda, 0xbb, 0x1d, 0x2f, 0x12, 0xa3, 0x18, 0xcb, + 0x7d, 0xd5, 0xcd, 0xca, 0x89, 0x4a, 0x0e, 0x8c, 0x74, 0x4d, 0xf6, 0x72, 0x25, 0xeb, 0x76, 0xba, 0x95, 0x40, 0x44, + 0x15, 0x78, 0x8f, 0x71, 0x15, 0xfb, 0x08, 0xa6, 0xeb, 0x8e, 0xcb, 0x68, 0xc7, 0x7b, 0xc6, 0xab, 0x13, 0x65, 0x05, + 0xb7, 0x1b, 0xd1, 0x9e, 0xd0, 0xd1, 0x4f, 0x93, 0xda, 0xb2, 0x70, 0x00, 0x72, 0x97, 0x30, 0x96, 0x0d, 0xc1, 0x8a, + 0x41, 0xe9, 0xeb, 0x35, 0x25, 0xcb, 0x02, 0x2c, 0x3a, 0xbb, 0x8c, 0x40, 0x0c, 0xeb, 0xa6, 0x39, 0xa1, 0xe3, 0xa5, + 0x8b, 0xf3, 0x5e, 0xab, 0x48, 0xc1, 0x33, 0x5a, 0x74, 0xcc, 0x4d, 0x47, 0xba, 0x31, 0xda, 0xdb, 0xef, 0x0d, 0x42, + 0x8a, 0xe7, 0x0f, 0x6c, 0xb5, 0x2e, 0x2e, 0x12, 0xaf, 0x90, 0x89, 0x16, 0xc4, 0x52, 0x04, 0x66, 0xbc, 0xd0, 0x34, + 0xc2, 0x04, 0x65, 0x4a, 0xb0, 0x68, 0x8d, 0x0e, 0xed, 0x0f, 0x4b, 0xd8, 0x3d, 0xc6, 0x08, 0x10, 0xa8, 0x32, 0x7d, + 0x0e, 0x5b, 0x13, 0x66, 0x53, 0x17, 0x1b, 0xa0, 0xad, 0x62, 0x68, 0x10, 0xd6, 0x86, 0x98, 0x8f, 0x69, 0x7e, 0xf7, + 0x2f, 0x2c, 0xc6, 0xf6, 0x04, 0x62, 0x7b, 0xb7, 0x6b, 0x12, 0xa6, 0x7b, 0x2d, 0x6e, 0xac, 0x97, 0xdb, 0x53, 0x8e, + 0xa9, 0x1d, 0x6b, 0xa3, 0x76, 0xac, 0xa5, 0xde, 0xb1, 0xd6, 0x7a, 0xc7, 0xba, 0x6b, 0xf8, 0x87, 0xcc, 0x8b, 0x59, + 0x02, 0xfa, 0xdd, 0x15, 0x57, 0x0d, 0x82, 0x66, 0x6c, 0xd8, 0x2d, 0xfc, 0x96, 0x58, 0xbb, 0xa5, 0x7f, 0xb1, 0x64, + 0x0b, 0xd3, 0x07, 0xba, 0x75, 0x80, 0x65, 0x44, 0x4d, 0xbe, 0x47, 0xde, 0x4d, 0x67, 0x45, 0xe1, 0xf6, 0xc4, 0x16, + 0x3e, 0x7b, 0x6b, 0xde, 0xbc, 0x7f, 0x16, 0x41, 0xee, 0x1d, 0xf7, 0xee, 0x87, 0x6f, 0xfd, 0x0b, 0xdd, 0x02, 0x39, + 0x99, 0xe5, 0x0c, 0xa4, 0x8e, 0xf8, 0x04, 0xd1, 0xca, 0x9e, 0xf2, 0x9d, 0x90, 0x3b, 0xdb, 0xfa, 0xd9, 0xbd, 0xbb, + 0xad, 0xdd, 0x3d, 0xbb, 0x67, 0xd5, 0x88, 0x62, 0xc5, 0x69, 0x8a, 0x84, 0x59, 0xb4, 0x01, 0x9e, 0x7a, 0xf9, 0x7e, + 0xc7, 0x8e, 0x39, 0xdc, 0x3d, 0xeb, 0xe8, 0x78, 0x39, 0x07, 0xec, 0xee, 0x3f, 0xda, 0x84, 0x8d, 0x95, 0xae, 0x55, + 0xe8, 0x70, 0xf7, 0x2c, 0xd3, 0x78, 0x0e, 0x47, 0xf2, 0xe9, 0x58, 0x63, 0x83, 0xa0, 0xae, 0xcf, 0x19, 0xd4, 0x8e, + 0xdd, 0xd7, 0x84, 0x5d, 0x76, 0xcc, 0x6b, 0x5d, 0xf3, 0xf6, 0xca, 0x53, 0xb1, 0x21, 0xa0, 0xc3, 0xd7, 0xea, 0x06, + 0xf9, 0x97, 0xc0, 0x29, 0x02, 0x40, 0x0e, 0xc7, 0x4b, 0x1e, 0xfb, 0x3e, 0xcd, 0xd2, 0x7a, 0x87, 0x5a, 0x8b, 0xca, + 0xb2, 0x0c, 0x6b, 0xef, 0x07, 0xad, 0x18, 0x96, 0x9a, 0xfe, 0xe9, 0x38, 0x70, 0x3b, 0xdb, 0xad, 0x8c, 0x5d, 0xc6, + 0xb3, 0xe2, 0xe2, 0xfb, 0xd3, 0x42, 0xb9, 0x76, 0xf3, 0x36, 0x7e, 0xd3, 0x6a, 0xc9, 0xd2, 0x5a, 0x0f, 0x79, 0x69, + 0x59, 0x44, 0x20, 0x80, 0xe1, 0x48, 0xd9, 0xc5, 0x12, 0xee, 0x11, 0x56, 0xf7, 0x20, 0x94, 0xcc, 0x0b, 0x17, 0xcf, + 0x59, 0x0c, 0x89, 0x00, 0xdb, 0x1d, 0x2a, 0xb6, 0x85, 0x8b, 0xe7, 0x6c, 0xc3, 0x8b, 0x7e, 0x3f, 0x53, 0x9d, 0x42, + 0xd6, 0x9d, 0x25, 0xdf, 0xa8, 0xe6, 0x58, 0x43, 0xcd, 0xd6, 0x26, 0xd9, 0x1a, 0xe7, 0xb6, 0xe2, 0xe3, 0xae, 0xad, + 0xf8, 0x58, 0x59, 0xeb, 0xd2, 0xbd, 0xde, 0xa3, 0xba, 0x00, 0xb6, 0xfe, 0xdb, 0xe3, 0x95, 0xeb, 0xf9, 0x8c, 0x00, + 0xbe, 0x16, 0x7c, 0x3c, 0x59, 0xa0, 0x57, 0xc9, 0xc2, 0xbf, 0x1d, 0xa8, 0xf1, 0x77, 0x3a, 0x77, 0x01, 0xd0, 0x95, + 0x94, 0x57, 0x40, 0xde, 0x41, 0x8e, 0xb9, 0x65, 0x57, 0xde, 0x9f, 0x7c, 0x87, 0xbd, 0xe5, 0xf5, 0x6c, 0x31, 0x67, + 0x3b, 0x70, 0x2a, 0x48, 0x06, 0xf6, 0xb2, 0x62, 0xbb, 0x20, 0xb6, 0x13, 0x7e, 0x23, 0x60, 0xca, 0x17, 0x10, 0xc4, + 0x15, 0xdc, 0x42, 0x1c, 0x9e, 0xfc, 0x73, 0x70, 0xdf, 0xda, 0xac, 0xef, 0x99, 0xd5, 0x39, 0xc1, 0x9a, 0x59, 0x3d, + 0x18, 0x2c, 0x9b, 0xc9, 0xaa, 0xdf, 0xf7, 0x76, 0xda, 0xf1, 0xe9, 0x4e, 0xea, 0xc4, 0x4e, 0x6b, 0xb5, 0x16, 0xec, + 0xad, 0xd4, 0xba, 0x18, 0x43, 0x0f, 0x10, 0x3f, 0xdd, 0x0e, 0xf8, 0x7d, 0xc7, 0xda, 0xf2, 0xde, 0xb2, 0x05, 0xdb, + 0xc1, 0x25, 0xa8, 0x69, 0x2f, 0xfb, 0x93, 0xca, 0x05, 0xed, 0xd8, 0x25, 0xf1, 0x70, 0xc6, 0xac, 0x52, 0x66, 0xd6, + 0x49, 0x75, 0x25, 0x3a, 0x63, 0x3a, 0x6b, 0x3d, 0x9f, 0xab, 0xf9, 0xa4, 0xd0, 0xa0, 0x7e, 0xe7, 0xc4, 0x47, 0x54, + 0x74, 0x9e, 0xc0, 0xd6, 0xb2, 0x82, 0x58, 0xed, 0x73, 0xb0, 0xd6, 0x6a, 0x97, 0x7e, 0x2f, 0x1f, 0x70, 0x9b, 0x72, + 0x58, 0x07, 0x06, 0x35, 0x27, 0x56, 0xd4, 0x63, 0xb6, 0x63, 0xdc, 0xfc, 0xf4, 0xf2, 0x07, 0x27, 0x2c, 0x59, 0xb1, + 0xda, 0x9f, 0x7e, 0xff, 0xcc, 0xd3, 0xdf, 0xa9, 0xfd, 0x0b, 0xe1, 0x07, 0xe3, 0xff, 0xd4, 0xee, 0x6b, 0x2d, 0x46, + 0x65, 0xab, 0x1c, 0xa1, 0x71, 0xb7, 0x92, 0x26, 0xcb, 0x4f, 0xc2, 0x13, 0xd6, 0x82, 0x67, 0xb9, 0x5e, 0xa2, 0x59, + 0x01, 0x2b, 0xac, 0x65, 0x12, 0xae, 0x30, 0x56, 0x4b, 0x5b, 0x7d, 0x8b, 0xa6, 0x39, 0x3e, 0x9c, 0x6b, 0x83, 0x32, + 0xe5, 0xec, 0x8c, 0x58, 0x0d, 0x97, 0x61, 0x69, 0x42, 0x11, 0xb2, 0x7b, 0x3b, 0xb8, 0xb1, 0x53, 0x96, 0x52, 0x86, + 0x73, 0x0c, 0x26, 0x3c, 0x12, 0xa3, 0x2a, 0xdf, 0xdf, 0x97, 0x14, 0x39, 0x6d, 0xcb, 0x41, 0x15, 0xc2, 0x3e, 0x92, + 0x28, 0x81, 0x5b, 0x91, 0x16, 0x8a, 0x94, 0xc5, 0xdf, 0x0e, 0xd0, 0x05, 0x5e, 0x40, 0x5d, 0x8d, 0xba, 0xfd, 0xe1, + 0x88, 0x87, 0x8f, 0x4c, 0x7d, 0x60, 0xc4, 0x92, 0x40, 0x6d, 0x2f, 0xb2, 0xf4, 0x0e, 0x54, 0xf8, 0x3d, 0x5c, 0x4d, + 0xc4, 0x7e, 0x6e, 0x49, 0x51, 0x91, 0x8d, 0xf4, 0x86, 0xd6, 0xe0, 0x11, 0x5a, 0x53, 0xbe, 0x77, 0x52, 0x6d, 0xd2, + 0x79, 0x47, 0xc8, 0xb1, 0xfa, 0xd6, 0x12, 0x46, 0xbb, 0xa2, 0x17, 0xf7, 0x8e, 0xde, 0xf3, 0x74, 0xd5, 0x73, 0x7f, + 0xe2, 0x8a, 0x79, 0x72, 0x1b, 0x81, 0xba, 0x15, 0x54, 0xb7, 0xf7, 0x2a, 0xc1, 0x82, 0x25, 0xed, 0x3e, 0x7e, 0x3b, + 0x6b, 0x07, 0xa2, 0x32, 0x56, 0xe9, 0x6b, 0x92, 0xb0, 0x27, 0x06, 0x9d, 0x42, 0x55, 0x6e, 0x77, 0x47, 0x5b, 0xe0, + 0x3a, 0x66, 0x29, 0x7a, 0x61, 0x8b, 0xdc, 0x2d, 0xff, 0xee, 0xb9, 0x22, 0x67, 0xbf, 0x04, 0x04, 0xa7, 0xe6, 0x2b, + 0xe2, 0xcb, 0x11, 0x1e, 0x55, 0xb7, 0xc0, 0x71, 0xfa, 0x0e, 0xe0, 0x1f, 0x0e, 0x97, 0xa0, 0x09, 0x88, 0x05, 0xeb, + 0xa5, 0x71, 0x8f, 0xf5, 0xe2, 0x62, 0x73, 0x97, 0xe4, 0x1b, 0x70, 0x66, 0xa0, 0x54, 0x4b, 0x3f, 0x70, 0xac, 0x16, + 0x50, 0xe1, 0x60, 0x76, 0x52, 0x2f, 0x2c, 0xa3, 0x1e, 0xd3, 0xe7, 0x67, 0xb0, 0x77, 0x84, 0x04, 0xc0, 0xfd, 0xb2, + 0x0f, 0x48, 0xc0, 0x43, 0x67, 0x76, 0x40, 0x38, 0x61, 0x16, 0x55, 0x81, 0x44, 0x72, 0xa4, 0x9f, 0x3d, 0x66, 0x22, + 0xf9, 0x83, 0x59, 0xcf, 0x39, 0x25, 0x7a, 0xac, 0xa7, 0x8e, 0x90, 0x1e, 0xeb, 0x59, 0x47, 0x44, 0x8f, 0xf5, 0xac, + 0xe3, 0xa3, 0xc7, 0x7a, 0xe6, 0xd8, 0xe9, 0x41, 0x60, 0x02, 0x44, 0x1e, 0xb0, 0x1e, 0x4d, 0xa6, 0x9e, 0xe2, 0x1e, + 0x20, 0x1a, 0x04, 0xd6, 0x93, 0xc2, 0x79, 0x0f, 0x90, 0xc7, 0x48, 0xac, 0x0e, 0x7a, 0x7f, 0x19, 0x3f, 0xed, 0x19, + 0x19, 0x79, 0xdc, 0x3a, 0xac, 0xfe, 0xd7, 0x5f, 0x21, 0x00, 0x0e, 0xcf, 0xa6, 0xde, 0xe5, 0x18, 0xb2, 0xca, 0x32, + 0x02, 0xc9, 0x4f, 0x0c, 0xbe, 0x7c, 0x01, 0x50, 0xf5, 0x99, 0xae, 0xd5, 0xe4, 0xa8, 0x3d, 0xe6, 0xd0, 0x15, 0x03, + 0xc0, 0x36, 0x2c, 0x51, 0x55, 0x0b, 0x9b, 0xb0, 0xb8, 0xfd, 0x0c, 0xa3, 0xb9, 0x6c, 0x7a, 0x41, 0x03, 0xf5, 0x08, + 0xc1, 0x2f, 0xad, 0x87, 0xd6, 0x5a, 0xa6, 0x1c, 0xba, 0x36, 0x8a, 0x2a, 0x1b, 0xea, 0x12, 0x56, 0x6b, 0x11, 0xd5, + 0x44, 0x91, 0x72, 0xc9, 0x28, 0x8a, 0xa5, 0x0a, 0xf6, 0x99, 0xb8, 0x83, 0xa8, 0x79, 0xda, 0x6a, 0xab, 0x60, 0x7f, + 0x07, 0x08, 0x6b, 0x61, 0x2d, 0xa4, 0x33, 0xa8, 0xbd, 0xd3, 0x8f, 0x94, 0xbf, 0xbc, 0x90, 0xdb, 0xb9, 0x85, 0x22, + 0xdc, 0x9e, 0x83, 0xf2, 0xa6, 0xae, 0x4a, 0x45, 0x34, 0x5a, 0x02, 0xa5, 0xcc, 0x09, 0x22, 0x0b, 0x10, 0xc0, 0x71, + 0x03, 0x81, 0xcf, 0x6b, 0x7c, 0x02, 0x8d, 0x42, 0x20, 0x3f, 0xb0, 0x0a, 0xd7, 0x1e, 0xd2, 0x52, 0x6b, 0x44, 0x94, + 0x88, 0x1f, 0x5d, 0x3d, 0xc7, 0xf6, 0xd5, 0xd3, 0x58, 0x5b, 0x4a, 0x13, 0xc4, 0x4f, 0x2c, 0xb6, 0x10, 0x13, 0x44, + 0x75, 0x88, 0x8e, 0x60, 0x39, 0x21, 0x44, 0xe1, 0x0f, 0xa1, 0x9f, 0x1a, 0xf8, 0x4b, 0xb6, 0x2c, 0xf2, 0x9a, 0x60, + 0x31, 0x2b, 0x06, 0x68, 0x55, 0x04, 0x9e, 0xe9, 0x6c, 0xa9, 0xcc, 0x69, 0x1e, 0x1d, 0xd9, 0xc1, 0x79, 0xd7, 0xc1, + 0x5e, 0xfa, 0x32, 0x76, 0xb2, 0x6c, 0x1a, 0xb5, 0xb1, 0x21, 0x12, 0x5e, 0x91, 0xbf, 0xcc, 0x52, 0xe3, 0x1c, 0x99, + 0xcb, 0xf5, 0x5d, 0x17, 0x77, 0x77, 0xb4, 0x4d, 0x58, 0x85, 0x08, 0x75, 0xdb, 0x50, 0xb9, 0x14, 0x66, 0x63, 0xd3, + 0x34, 0xc0, 0x17, 0x8a, 0x4a, 0xa5, 0x2a, 0xb5, 0x95, 0x4a, 0x4e, 0x78, 0xd7, 0x57, 0xb5, 0x48, 0x5d, 0x11, 0x6c, + 0x63, 0x86, 0x7a, 0x28, 0x37, 0x6a, 0xec, 0xeb, 0x8e, 0x55, 0x7a, 0x87, 0x09, 0x72, 0x46, 0x5e, 0xe4, 0xe0, 0xa2, + 0xa4, 0x20, 0x73, 0x35, 0x84, 0xf9, 0xa3, 0x86, 0x4f, 0x0b, 0xcb, 0x3d, 0x94, 0x80, 0xd9, 0x51, 0xc3, 0xcb, 0x08, + 0x81, 0x88, 0x4b, 0x65, 0x5f, 0x31, 0xf1, 0x7b, 0x0a, 0x66, 0xc9, 0x84, 0xee, 0x45, 0x2c, 0x8c, 0xd0, 0xc6, 0x27, + 0x49, 0x32, 0xf5, 0x34, 0x05, 0x37, 0x72, 0x19, 0xe6, 0x68, 0x84, 0x96, 0x7c, 0xe4, 0x40, 0xfa, 0x5a, 0x4e, 0x25, + 0xf8, 0x88, 0x3a, 0x05, 0x1c, 0xcf, 0xcf, 0x0b, 0xeb, 0x27, 0xcb, 0x25, 0xe6, 0xb2, 0x36, 0xff, 0x65, 0x47, 0xc7, + 0x60, 0x97, 0xa7, 0x89, 0xe3, 0xea, 0x3f, 0xaa, 0x92, 0xe2, 0xe1, 0xe7, 0x34, 0x07, 0x14, 0xc1, 0xcc, 0x9e, 0x62, + 0x7c, 0xec, 0xb3, 0x4c, 0x01, 0x7f, 0xbb, 0xde, 0x5a, 0x32, 0xb1, 0x4b, 0xda, 0xcd, 0x95, 0xf1, 0x4b, 0x6d, 0xd8, + 0x71, 0x70, 0x6e, 0x00, 0x8a, 0xb3, 0x46, 0x87, 0xe5, 0xb5, 0x6e, 0x5b, 0x15, 0x2a, 0x50, 0xeb, 0xff, 0xec, 0x16, + 0xa6, 0xbc, 0xcd, 0x4b, 0xe5, 0x6d, 0x1e, 0x9a, 0x00, 0x81, 0xc8, 0x0c, 0x79, 0xd6, 0x74, 0x4c, 0x12, 0xf7, 0x8e, + 0x94, 0xb4, 0xef, 0x48, 0xf1, 0xa3, 0x77, 0x24, 0xe4, 0x5b, 0x42, 0x47, 0xf6, 0x25, 0x27, 0x27, 0x50, 0x66, 0xb0, + 0x97, 0xd7, 0x4c, 0xf6, 0x0f, 0x68, 0x2f, 0x9c, 0xcb, 0xf2, 0x8a, 0xbf, 0x15, 0xde, 0xda, 0x9f, 0xae, 0x4f, 0xbb, + 0xaa, 0xde, 0x7e, 0x65, 0x66, 0x1e, 0x0e, 0xc5, 0xe1, 0x50, 0x99, 0xa0, 0xdd, 0x05, 0x17, 0x83, 0x9c, 0xdd, 0xbb, + 0xf1, 0xf1, 0x6f, 0x39, 0x8a, 0xd8, 0x4a, 0x79, 0x24, 0x5d, 0xa8, 0xc4, 0xf0, 0xd2, 0xc0, 0xc3, 0xec, 0xf8, 0x78, + 0xb2, 0xbb, 0xba, 0x9f, 0x0c, 0x06, 0x3b, 0xd5, 0xb7, 0x5b, 0x5e, 0xcf, 0x76, 0x73, 0xf6, 0xc0, 0x6f, 0xa7, 0xdb, + 0x60, 0xdf, 0xc0, 0xb6, 0xbb, 0xbb, 0x12, 0x87, 0xc3, 0xee, 0x9a, 0x2f, 0xfc, 0xfd, 0x03, 0x02, 0x3a, 0xf3, 0xf3, + 0x71, 0x1b, 0xe3, 0xe7, 0xa6, 0xed, 0xaa, 0xb5, 0x03, 0x78, 0xfa, 0x1f, 0xbc, 0x9b, 0xd9, 0x72, 0xee, 0xb3, 0x27, + 0xfc, 0x01, 0xfc, 0xf3, 0x71, 0x93, 0x44, 0xea, 0x13, 0xed, 0x32, 0x79, 0x03, 0x0e, 0xe4, 0x3b, 0x9f, 0xbd, 0xe1, + 0x0f, 0xb3, 0xe5, 0x9c, 0x17, 0x87, 0xc3, 0xfb, 0x69, 0x88, 0x64, 0x4d, 0x61, 0x45, 0x2c, 0x29, 0x9e, 0x1f, 0x84, + 0xc7, 0xef, 0x45, 0x64, 0x88, 0xb4, 0xdc, 0xbb, 0x43, 0x76, 0xc3, 0x22, 0x3f, 0x80, 0x0f, 0xb2, 0x9d, 0x3f, 0x91, + 0x35, 0xa5, 0xfb, 0xc5, 0x13, 0xff, 0x70, 0xa0, 0xbf, 0xde, 0xf8, 0x87, 0xc3, 0x7b, 0xf6, 0x80, 0xe0, 0xe8, 0x7c, + 0x07, 0xfd, 0xa3, 0x6f, 0x1d, 0x50, 0x95, 0xe1, 0xdb, 0xd9, 0x66, 0xee, 0x5f, 0xaf, 0xd8, 0x1d, 0x70, 0xa1, 0x28, + 0x2f, 0xb4, 0x1b, 0xf6, 0x80, 0x5e, 0x67, 0xe4, 0x44, 0x34, 0xdb, 0xcd, 0x7d, 0x16, 0xe3, 0x73, 0x75, 0x5f, 0x4c, + 0xbe, 0x7a, 0x5f, 0xdc, 0xb1, 0x6d, 0xf7, 0x7d, 0x51, 0xbe, 0xe9, 0xae, 0x9f, 0x2d, 0xdb, 0xb1, 0x07, 0x98, 0x61, + 0x6f, 0xf9, 0x4d, 0x73, 0xec, 0x18, 0xfb, 0xd5, 0x1b, 0x23, 0x80, 0x32, 0x5b, 0xb0, 0x58, 0x70, 0x50, 0xaa, 0x55, + 0xdb, 0x92, 0xc8, 0x2b, 0x1d, 0xa8, 0x36, 0x23, 0xb8, 0xaf, 0x16, 0x72, 0xe6, 0x99, 0x81, 0xbe, 0xad, 0x10, 0x2d, + 0x1c, 0x36, 0xe0, 0xaf, 0xb4, 0x75, 0x8c, 0x61, 0x9a, 0xd5, 0x4c, 0xdb, 0xa2, 0x2e, 0xbf, 0xed, 0x3d, 0x93, 0xdf, + 0xc8, 0xc0, 0x16, 0x22, 0x29, 0x1c, 0xc7, 0x17, 0xcf, 0x4f, 0xf8, 0xaf, 0x5a, 0x1e, 0xb5, 0xda, 0x2f, 0x94, 0xfa, + 0xf4, 0x25, 0x1d, 0xd1, 0xc4, 0xbd, 0x68, 0xcb, 0xb0, 0x46, 0x59, 0x53, 0x4b, 0x87, 0x61, 0x5c, 0xc3, 0xbe, 0x3c, + 0x70, 0xe8, 0x3b, 0x20, 0xd0, 0x56, 0xa9, 0x14, 0x68, 0xe1, 0x18, 0x46, 0x61, 0x16, 0x52, 0x1e, 0x17, 0x66, 0x29, + 0xef, 0xb1, 0x40, 0x8b, 0x5b, 0x75, 0x8f, 0xa9, 0xed, 0x16, 0x44, 0x58, 0xbd, 0x65, 0x9c, 0x5f, 0x36, 0xaa, 0x70, + 0x5b, 0x80, 0xa2, 0x08, 0xca, 0x60, 0x4f, 0x72, 0xdb, 0x42, 0x49, 0xb3, 0x51, 0x58, 0x8b, 0xbb, 0xa2, 0xdc, 0xf5, + 0x1a, 0xb6, 0xc0, 0x0b, 0xaa, 0x7e, 0x42, 0xd8, 0x96, 0x3d, 0xeb, 0x50, 0x2e, 0xd2, 0xff, 0xc8, 0xd2, 0xf3, 0xed, + 0xd6, 0x9c, 0xff, 0xe9, 0x2b, 0xfa, 0xa8, 0xfc, 0xcf, 0x2f, 0xe9, 0x27, 0x83, 0x65, 0xe4, 0x94, 0xfa, 0x3e, 0x1a, + 0xdd, 0xa6, 0x39, 0x61, 0x6c, 0xf9, 0xfa, 0xe9, 0x37, 0xc8, 0x14, 0x24, 0x87, 0x52, 0xaa, 0x72, 0xb2, 0x87, 0xbe, + 0xf0, 0xba, 0x0f, 0x33, 0xc1, 0x00, 0x84, 0xd7, 0x68, 0x53, 0x4d, 0x98, 0xc4, 0xa3, 0x2b, 0xf8, 0xbf, 0x11, 0xc4, + 0xa0, 0x7d, 0xa2, 0xa8, 0x63, 0xdb, 0x48, 0xd7, 0x6d, 0xe7, 0x20, 0xb9, 0x53, 0x57, 0xfe, 0xa8, 0x9c, 0xfc, 0x27, + 0x1a, 0x22, 0xaf, 0xb8, 0x42, 0xac, 0x2c, 0xb8, 0xc4, 0x62, 0xa8, 0x48, 0x01, 0xae, 0x21, 0x88, 0x94, 0x45, 0x49, + 0xe1, 0x96, 0x83, 0xaa, 0x08, 0xc0, 0xb8, 0x5a, 0x1d, 0x75, 0x22, 0x7c, 0xdc, 0x5a, 0x8b, 0x10, 0xac, 0x68, 0xd4, + 0xca, 0x5a, 0x81, 0x2f, 0x48, 0x5f, 0x3a, 0x14, 0xc4, 0xf4, 0x28, 0xa4, 0xaa, 0x74, 0x28, 0x90, 0xe6, 0x50, 0xf1, + 0x8d, 0xc1, 0x46, 0x51, 0x91, 0x9e, 0xbf, 0x34, 0x29, 0xb9, 0x34, 0x66, 0x7c, 0x10, 0x65, 0x24, 0xf2, 0x3a, 0xbc, + 0x13, 0xd3, 0x02, 0xf9, 0x46, 0x8f, 0x1f, 0x04, 0x97, 0xf0, 0x6e, 0xc8, 0xbd, 0x02, 0x6c, 0x09, 0xd8, 0x01, 0xee, + 0x95, 0x19, 0xe5, 0x3a, 0xad, 0xeb, 0xb7, 0xd6, 0x43, 0x31, 0x0c, 0x9f, 0x59, 0x02, 0xdb, 0xd1, 0x3a, 0x3a, 0xd2, + 0xc3, 0x87, 0xff, 0x75, 0x55, 0x73, 0xd4, 0xa9, 0x5c, 0xce, 0x8e, 0x27, 0x2c, 0x45, 0xcc, 0xa0, 0xfb, 0xeb, 0xf6, + 0xa5, 0x00, 0xba, 0x5d, 0x16, 0xf3, 0x6c, 0xb4, 0x93, 0x7f, 0x4b, 0x37, 0x56, 0x94, 0x36, 0xf1, 0x2e, 0xeb, 0x8d, + 0xfd, 0xe1, 0xe8, 0x2f, 0xcf, 0xbe, 0x4c, 0x08, 0x55, 0x67, 0xc3, 0xd6, 0x3a, 0xce, 0xe5, 0x7f, 0xfd, 0x75, 0x4c, + 0x56, 0x10, 0x14, 0x84, 0x65, 0xa7, 0x98, 0xa8, 0x60, 0x14, 0x29, 0xd6, 0x7c, 0x3c, 0x59, 0xa3, 0x4e, 0x78, 0xed, + 0x2f, 0xb5, 0x4e, 0x98, 0x18, 0x59, 0xa9, 0xfc, 0x35, 0xab, 0xd8, 0x9d, 0xca, 0x2c, 0x20, 0xf3, 0x20, 0x9f, 0xac, + 0x8d, 0x06, 0x73, 0xc5, 0xeb, 0xd9, 0x7a, 0x2e, 0x95, 0xcf, 0x60, 0xca, 0x59, 0x0e, 0x4e, 0x96, 0xc2, 0xee, 0x49, + 0xa0, 0x68, 0xcd, 0xd0, 0xb5, 0x3f, 0xc5, 0x56, 0xbd, 0x4a, 0xab, 0x1a, 0xe0, 0x01, 0x21, 0x06, 0x86, 0xda, 0xab, + 0x85, 0x87, 0xd6, 0x02, 0x58, 0xfb, 0xa3, 0xd2, 0x0f, 0xc6, 0x93, 0x25, 0x5f, 0x20, 0xff, 0x72, 0xe4, 0xa8, 0xdd, + 0xfb, 0x7d, 0xef, 0x1e, 0xa4, 0xe0, 0xc8, 0xb5, 0x50, 0x20, 0x11, 0xd0, 0x82, 0x6f, 0x7c, 0xe5, 0x83, 0xf1, 0x16, + 0xb5, 0xd5, 0xa0, 0xa0, 0x76, 0x74, 0xcb, 0x63, 0x47, 0xef, 0x7c, 0x7f, 0x42, 0x5f, 0xbd, 0xd0, 0xc2, 0xf1, 0x57, + 0xce, 0xc8, 0x35, 0x5b, 0x75, 0xc8, 0x11, 0xcd, 0xa4, 0x43, 0x88, 0x58, 0xb1, 0x35, 0x7b, 0x4b, 0x2a, 0xe7, 0xce, + 0x21, 0x3b, 0x7d, 0x84, 0x2a, 0xbd, 0xd6, 0xe3, 0xdb, 0x89, 0xd2, 0xdd, 0x1e, 0xef, 0x26, 0xdf, 0xb2, 0x89, 0x88, + 0xc1, 0x80, 0x36, 0x08, 0x67, 0x64, 0x1d, 0x22, 0x95, 0x0e, 0x10, 0x02, 0xc7, 0x04, 0x34, 0xfd, 0xc7, 0xd7, 0x24, + 0x0a, 0x38, 0xd2, 0x46, 0xc8, 0x5a, 0x76, 0x38, 0xe4, 0xa0, 0x51, 0x6e, 0xfe, 0xf0, 0x0a, 0x75, 0x9a, 0x03, 0xf3, + 0x74, 0x09, 0x7b, 0x0e, 0x1e, 0xe9, 0xc5, 0xf1, 0x91, 0xfe, 0xdf, 0xd1, 0x44, 0x8d, 0xff, 0x73, 0x4d, 0x94, 0xd2, + 0x22, 0x39, 0xaa, 0xa5, 0x6f, 0x52, 0x47, 0xc1, 0x45, 0xde, 0x51, 0x0b, 0xd9, 0xb3, 0x6c, 0xdc, 0xa8, 0xe6, 0xfd, + 0xff, 0x5a, 0x99, 0xff, 0xaf, 0x69, 0x65, 0x98, 0x92, 0x1d, 0x4b, 0x35, 0xf3, 0x40, 0xab, 0x18, 0x66, 0x3f, 0x93, + 0x84, 0xc8, 0x70, 0x69, 0xc0, 0x8f, 0x2a, 0xd8, 0xc7, 0x69, 0xb5, 0xce, 0xc2, 0x1d, 0x2a, 0x51, 0x6f, 0xc5, 0x5d, + 0x9a, 0xbf, 0xa8, 0xff, 0x2d, 0xca, 0x02, 0xa6, 0xf6, 0x5d, 0x99, 0xc6, 0x01, 0x59, 0xf8, 0xb3, 0xb0, 0xc4, 0xc9, + 0x8d, 0x6d, 0xfc, 0x59, 0x8e, 0xa7, 0xfd, 0xaa, 0x33, 0xf3, 0x40, 0x02, 0x35, 0x10, 0x7f, 0xe4, 0x5c, 0x56, 0x16, + 0x0f, 0x08, 0xdd, 0xfc, 0x43, 0x59, 0x16, 0xa5, 0xd7, 0xfb, 0x94, 0xa4, 0xd5, 0xd9, 0x4a, 0xd4, 0x49, 0x11, 0x2b, + 0x28, 0x9b, 0x14, 0x60, 0xf4, 0x61, 0xe5, 0x89, 0x38, 0x38, 0x43, 0xa0, 0x86, 0xb3, 0x3a, 0x09, 0x01, 0x68, 0x58, + 0x21, 0xec, 0x9f, 0x41, 0x0b, 0xcf, 0xc2, 0x38, 0x5c, 0x03, 0x4c, 0x4e, 0x5a, 0x9d, 0xad, 0xcb, 0xe2, 0x3e, 0x8d, + 0x45, 0x3c, 0xea, 0x29, 0x4a, 0x96, 0xd7, 0xb9, 0x2b, 0xe7, 0xfa, 0xfb, 0x3f, 0x28, 0x80, 0xdd, 0x80, 0xd9, 0xb6, + 0xc0, 0x0e, 0x00, 0x12, 0x14, 0xc8, 0x16, 0xea, 0x34, 0x3a, 0x53, 0x4b, 0x05, 0xde, 0x73, 0x3d, 0xc0, 0x5f, 0xe7, + 0x80, 0x65, 0x5c, 0x17, 0x32, 0x60, 0x04, 0x01, 0x8c, 0xc0, 0x41, 0x09, 0x18, 0x3a, 0x43, 0xdc, 0x56, 0xe5, 0xac, + 0x85, 0xe6, 0x4a, 0xb7, 0x25, 0x37, 0x8d, 0x72, 0xb6, 0x12, 0x01, 0xf4, 0xd5, 0x4d, 0x89, 0xd3, 0xe5, 0xb2, 0x95, + 0x84, 0x7d, 0xfb, 0xbe, 0x9d, 0x2a, 0xf2, 0xf8, 0x28, 0x0d, 0x79, 0x05, 0x9e, 0x64, 0x1c, 0x49, 0xa2, 0x44, 0xf0, + 0x3a, 0x6f, 0xcc, 0x38, 0xbc, 0x68, 0x53, 0x4e, 0xed, 0xcd, 0x7a, 0x01, 0x38, 0x4f, 0xd0, 0x96, 0x01, 0xc6, 0x02, + 0x06, 0xe7, 0x42, 0x2c, 0x79, 0x8a, 0xe0, 0x97, 0x4e, 0xa4, 0x30, 0xee, 0x72, 0x18, 0xe6, 0x41, 0xd1, 0xbb, 0xa4, + 0xfe, 0xe8, 0xf7, 0x51, 0x9b, 0x0c, 0x86, 0xa0, 0x12, 0x40, 0x65, 0xdd, 0x20, 0x31, 0xb0, 0x2a, 0x2d, 0x24, 0x2e, + 0x21, 0x5e, 0xe6, 0xab, 0x69, 0x1d, 0x05, 0xef, 0xeb, 0x09, 0x21, 0x9c, 0x60, 0x7c, 0x88, 0x1b, 0x20, 0x60, 0xb0, + 0x8a, 0x0b, 0x0c, 0x92, 0xe7, 0x12, 0xdd, 0x1f, 0xcf, 0x77, 0x0c, 0x70, 0xe5, 0xbc, 0xa7, 0xda, 0xd5, 0x03, 0x7b, + 0xb9, 0x4a, 0x97, 0x8c, 0x10, 0x56, 0xfc, 0x5f, 0x44, 0xde, 0xb7, 0xc3, 0x04, 0xd4, 0x36, 0xf2, 0xc7, 0x20, 0x31, + 0x97, 0x89, 0x22, 0x88, 0x47, 0x59, 0xc1, 0x92, 0x34, 0xd8, 0x8c, 0x92, 0x14, 0x34, 0x9a, 0x18, 0x43, 0xa6, 0x42, + 0x3b, 0x24, 0x8d, 0x66, 0x63, 0xb2, 0x8f, 0x21, 0xaf, 0xe1, 0x62, 0xb1, 0xc0, 0xfb, 0x7e, 0x16, 0xaa, 0x83, 0x6d, + 0x69, 0x0e, 0x01, 0x27, 0x09, 0xf6, 0xd4, 0x15, 0x29, 0x09, 0xb3, 0xd1, 0xa7, 0x90, 0x73, 0x03, 0x3a, 0x4e, 0x1a, + 0x43, 0xf5, 0x81, 0x49, 0x78, 0x15, 0xa1, 0x93, 0xb2, 0x42, 0x58, 0xc0, 0x7d, 0x23, 0xa3, 0xd1, 0x4a, 0x1a, 0x04, + 0xde, 0x66, 0xd8, 0x0a, 0x6c, 0x42, 0xc3, 0x5f, 0x64, 0x1e, 0xa6, 0xd5, 0xac, 0x04, 0x73, 0xbe, 0x81, 0x4a, 0x8c, + 0x27, 0xcb, 0x2b, 0xbe, 0x71, 0xb1, 0x12, 0x93, 0xd9, 0x72, 0x3e, 0x59, 0x4b, 0xaa, 0xb9, 0xdc, 0x5b, 0xb3, 0x8c, + 0x2d, 0x61, 0xff, 0x30, 0x30, 0x94, 0x0e, 0xec, 0x68, 0xaa, 0x69, 0x93, 0x00, 0x93, 0xe9, 0x9c, 0xf3, 0xe1, 0x25, + 0xa2, 0xc9, 0xea, 0xd4, 0x9d, 0x4c, 0x55, 0x3b, 0xb8, 0x26, 0x67, 0x72, 0x7a, 0xa4, 0x9e, 0x6a, 0xdd, 0x4b, 0x3e, + 0xda, 0x0e, 0xab, 0xd1, 0xd6, 0x0f, 0xc0, 0xad, 0x53, 0xd8, 0xe9, 0xbb, 0x61, 0x35, 0xda, 0xf9, 0x1a, 0x76, 0x97, + 0x14, 0x02, 0xd5, 0x9f, 0x65, 0x4d, 0xe6, 0xe2, 0x75, 0xf1, 0xe0, 0x15, 0xec, 0xb9, 0x3f, 0xd0, 0xbf, 0x4a, 0xf6, + 0xdc, 0xb7, 0x99, 0x5c, 0xff, 0x4c, 0xbb, 0x46, 0x63, 0xa6, 0xe3, 0xb5, 0x2b, 0xb0, 0x42, 0x03, 0xe4, 0x17, 0xec, + 0x68, 0x6f, 0x72, 0x10, 0x08, 0xd0, 0xbd, 0x04, 0x47, 0x51, 0x40, 0xd4, 0xb4, 0xaa, 0x3c, 0x3a, 0xdd, 0xfb, 0x7b, + 0x7c, 0xa3, 0x04, 0x6c, 0xf2, 0xd4, 0xba, 0xb7, 0x8c, 0xfd, 0xc3, 0x01, 0x42, 0xe8, 0xe5, 0xf4, 0x1b, 0x6d, 0x59, + 0x3d, 0xda, 0xb1, 0xdc, 0x37, 0x8c, 0x7a, 0x0a, 0xc6, 0x30, 0x74, 0x61, 0x15, 0x23, 0x79, 0x06, 0x64, 0x8d, 0xdf, + 0x20, 0xba, 0x80, 0x45, 0xaf, 0xf7, 0xea, 0x88, 0x06, 0x11, 0x50, 0xe9, 0x35, 0x7f, 0x29, 0xf2, 0xb9, 0x2a, 0x44, + 0xef, 0xbd, 0xb5, 0xf3, 0x66, 0x46, 0xb2, 0x4c, 0x1a, 0xa9, 0x76, 0x2b, 0x8b, 0x75, 0xe5, 0xcd, 0x4e, 0x48, 0x17, + 0x73, 0x0c, 0x95, 0xc1, 0xe3, 0x00, 0x94, 0x9e, 0x7f, 0x0b, 0xbd, 0x92, 0x21, 0xd3, 0x2c, 0xd1, 0xcc, 0xee, 0x1a, + 0x7f, 0xb2, 0x4a, 0xbd, 0x18, 0x11, 0xb3, 0x81, 0x2d, 0xc4, 0x6d, 0x51, 0xe9, 0xb6, 0x28, 0x94, 0x2d, 0x8a, 0xf4, + 0xa1, 0x76, 0xa6, 0x3b, 0xb3, 0xf0, 0x59, 0x65, 0xda, 0xf7, 0x26, 0x33, 0x63, 0x03, 0xb4, 0x5d, 0x84, 0x6f, 0xa0, + 0x03, 0x15, 0x42, 0xfe, 0x03, 0x22, 0x22, 0x11, 0xb0, 0xcb, 0xa9, 0x3b, 0xb1, 0xe9, 0x90, 0xcc, 0x43, 0xcc, 0x0a, + 0x35, 0xca, 0x4b, 0x9e, 0x1c, 0x0d, 0x48, 0x45, 0xa8, 0xdb, 0xfd, 0xfe, 0xf9, 0xd2, 0x05, 0xb5, 0x5f, 0x53, 0xec, + 0x18, 0xdd, 0x14, 0x70, 0x2e, 0x78, 0x94, 0xf7, 0xdc, 0x3b, 0x07, 0x34, 0xc7, 0xf6, 0x14, 0x59, 0x03, 0x4e, 0x6f, + 0xbb, 0x10, 0x60, 0xfb, 0xac, 0xd9, 0xda, 0x9f, 0xac, 0xae, 0xa2, 0xa9, 0x57, 0xf2, 0x99, 0xee, 0xa2, 0xc4, 0xed, + 0xa2, 0x58, 0x76, 0xd1, 0xa6, 0x81, 0x60, 0xc7, 0x95, 0x1f, 0x00, 0x6f, 0x68, 0xd4, 0xef, 0x97, 0xad, 0x9e, 0x3d, + 0xf9, 0xda, 0x71, 0xcf, 0x66, 0x3e, 0x2b, 0x4d, 0xcf, 0xfe, 0x9a, 0xba, 0x3d, 0x2b, 0x27, 0x7b, 0xd1, 0x39, 0xd9, + 0xa7, 0xb3, 0x79, 0x20, 0xb8, 0xdc, 0xb9, 0xcf, 0xf3, 0xa9, 0x9e, 0x76, 0x95, 0x1f, 0xb4, 0x86, 0xc8, 0x7c, 0xe1, + 0x53, 0xd5, 0xbd, 0xae, 0x60, 0x01, 0x4b, 0x70, 0xb7, 0x5e, 0x9a, 0xff, 0x8a, 0xdd, 0xdf, 0x0b, 0x7a, 0x69, 0xfe, + 0x1b, 0xfd, 0x49, 0x01, 0x1c, 0x80, 0xc6, 0xd4, 0x6e, 0x81, 0x87, 0x18, 0x2a, 0x28, 0xdc, 0xcd, 0xca, 0xb9, 0x57, + 0x03, 0x1c, 0x26, 0xe9, 0x1b, 0x5a, 0xbd, 0xd2, 0x62, 0xd7, 0xcb, 0x64, 0xaf, 0x00, 0x0f, 0x55, 0xc8, 0xc3, 0xc3, + 0x21, 0xea, 0x18, 0x76, 0x50, 0x47, 0xc0, 0xb0, 0x87, 0xd0, 0xd8, 0x02, 0xcf, 0xc7, 0x4f, 0x19, 0xdf, 0x0b, 0x50, + 0x1b, 0x21, 0x3c, 0x5e, 0x2d, 0xca, 0x10, 0x5b, 0xf6, 0x06, 0xa9, 0xa4, 0x7e, 0x16, 0x88, 0x32, 0x5a, 0x05, 0xb4, + 0xd5, 0x1e, 0xb3, 0x34, 0xde, 0x40, 0xa8, 0x58, 0xea, 0x63, 0x08, 0x0d, 0x1c, 0x7e, 0x87, 0x03, 0x48, 0xf0, 0x25, + 0xd7, 0x64, 0x73, 0x6f, 0xf2, 0x7b, 0xda, 0xe7, 0x0f, 0x87, 0xf3, 0x4b, 0x04, 0xa5, 0x4b, 0xe1, 0x23, 0x95, 0x88, + 0xea, 0x29, 0x6e, 0x4a, 0xc8, 0x66, 0xc9, 0x4a, 0x3f, 0xf8, 0x55, 0xfd, 0x02, 0x00, 0x59, 0x08, 0xb4, 0x89, 0xcc, + 0xfe, 0x74, 0xa6, 0xa2, 0x0b, 0x80, 0x43, 0xfc, 0xf1, 0x13, 0x44, 0xdf, 0xd0, 0x32, 0x2d, 0x1f, 0x27, 0x3c, 0x04, + 0xad, 0x2d, 0xe9, 0x24, 0x62, 0xa5, 0xc0, 0x86, 0x48, 0xf8, 0x7e, 0xff, 0x3c, 0x96, 0x74, 0xa0, 0x51, 0xab, 0x7b, + 0xe3, 0x56, 0xf7, 0xca, 0xd7, 0x75, 0x27, 0x37, 0x3e, 0x28, 0xda, 0x67, 0xf3, 0x46, 0xe5, 0xfb, 0xb6, 0xce, 0xd9, + 0x9d, 0xee, 0x1d, 0x39, 0x27, 0xbe, 0xbd, 0x87, 0x50, 0xf4, 0xd0, 0x14, 0x59, 0x96, 0x84, 0x01, 0xad, 0xb5, 0x6b, + 0xcf, 0x32, 0x3a, 0x78, 0xed, 0x1b, 0x42, 0x44, 0x9e, 0xe2, 0x93, 0x90, 0x5b, 0x1c, 0x1f, 0x14, 0xe8, 0x9f, 0x19, + 0x7f, 0xe6, 0xc4, 0x0f, 0x5b, 0xfd, 0x02, 0x38, 0x37, 0xdd, 0x7b, 0x77, 0x62, 0xd6, 0x63, 0x28, 0x65, 0xe3, 0xff, + 0x7e, 0x9f, 0xc8, 0x02, 0x9d, 0x8e, 0x68, 0x18, 0x08, 0xee, 0xa2, 0xfa, 0xbf, 0x57, 0xbc, 0xee, 0x59, 0xab, 0xf3, + 0xe5, 0xa7, 0x4e, 0x4f, 0x7a, 0xf5, 0x32, 0xee, 0x01, 0x15, 0x3a, 0x40, 0x38, 0xaf, 0xfb, 0x0d, 0xdb, 0x7d, 0xf3, + 0xcb, 0xbb, 0xa3, 0x97, 0x81, 0x4d, 0x8a, 0xc4, 0xb6, 0x92, 0xcf, 0x7a, 0xa0, 0xf0, 0xeb, 0xb1, 0x5e, 0x5d, 0xac, + 0x7b, 0xac, 0x87, 0x5a, 0x40, 0xf4, 0xb0, 0x00, 0xf5, 0x5f, 0xcf, 0x3e, 0x0d, 0x85, 0x83, 0x6c, 0x9c, 0x2a, 0x50, + 0x64, 0xc1, 0xaf, 0xc5, 0x68, 0x5d, 0x10, 0x20, 0xb2, 0x25, 0xa4, 0x55, 0x27, 0xb3, 0xc7, 0xa5, 0x96, 0x64, 0xf0, + 0x4d, 0x40, 0x66, 0x07, 0x56, 0x4e, 0x50, 0x3a, 0x6e, 0x0d, 0xb8, 0xb2, 0xc5, 0xa3, 0xdd, 0xfe, 0x34, 0xc8, 0xce, + 0x9a, 0x93, 0x46, 0xfb, 0xb0, 0x4f, 0xf3, 0x00, 0x81, 0x48, 0xa6, 0x22, 0xc8, 0x35, 0xf7, 0x96, 0xf4, 0xd1, 0xe1, + 0x9c, 0x17, 0xf2, 0xcf, 0xa9, 0xd4, 0x21, 0x0e, 0x25, 0xd6, 0x40, 0xa0, 0xf2, 0x0c, 0x55, 0x0e, 0x1b, 0xe4, 0xf8, + 0x67, 0x47, 0x32, 0x93, 0x98, 0x2c, 0x72, 0xb7, 0x66, 0x2a, 0xfc, 0x40, 0xf0, 0x31, 0xcb, 0x39, 0x70, 0x81, 0xcd, + 0xe6, 0xbe, 0x9a, 0xe2, 0xe2, 0x0a, 0xfc, 0x31, 0x85, 0x5f, 0xf1, 0x14, 0x76, 0xda, 0xfd, 0xba, 0xa8, 0x52, 0xd4, + 0x6d, 0x14, 0x16, 0x95, 0x2c, 0x98, 0xd6, 0x90, 0x26, 0x3a, 0x8c, 0xfe, 0x20, 0x67, 0xa0, 0x20, 0xe4, 0x97, 0x4d, + 0x03, 0x8c, 0x54, 0x72, 0x79, 0x50, 0x25, 0x81, 0x17, 0x60, 0x1b, 0x54, 0x6c, 0x5d, 0x40, 0x90, 0x6d, 0x52, 0x94, + 0xe9, 0x97, 0x22, 0xaf, 0xc3, 0x2c, 0xa8, 0x46, 0x69, 0xf5, 0xa3, 0xfe, 0x09, 0xcc, 0xdb, 0x54, 0x8c, 0x6a, 0x15, + 0x93, 0xdf, 0xe8, 0xf7, 0x8b, 0x41, 0xeb, 0x43, 0x06, 0x1f, 0xbd, 0x36, 0x0d, 0xfe, 0xe8, 0x34, 0xd8, 0x61, 0xa2, + 0x11, 0x00, 0xc9, 0x9c, 0x5a, 0xf2, 0x50, 0xf4, 0x47, 0x90, 0x63, 0x8d, 0x2a, 0xa7, 0x60, 0xb0, 0xfe, 0xe3, 0xd1, + 0x0e, 0x4c, 0xbd, 0x38, 0xda, 0x92, 0x1d, 0xb4, 0xf2, 0x0d, 0x70, 0xbf, 0x46, 0xb6, 0x98, 0xe5, 0x00, 0xcd, 0x5e, + 0x23, 0x32, 0x3e, 0x79, 0x01, 0x8c, 0xd9, 0x3a, 0x0b, 0x23, 0x11, 0x07, 0x63, 0xd5, 0x98, 0x31, 0x03, 0x03, 0x17, + 0xe8, 0x5a, 0x26, 0x25, 0x69, 0x48, 0x07, 0x03, 0x56, 0xca, 0x16, 0x0e, 0x78, 0xd1, 0x1c, 0xb7, 0xe3, 0x75, 0x8b, + 0xc6, 0x03, 0xdb, 0xc5, 0xf6, 0xf7, 0xdf, 0x17, 0xdb, 0xb7, 0xe1, 0x96, 0xf4, 0x0a, 0x39, 0x4b, 0xe8, 0xe7, 0x8f, + 0xb2, 0xcf, 0x1a, 0x4e, 0x4e, 0x85, 0x66, 0x68, 0x29, 0x12, 0x4a, 0xf1, 0x4e, 0x4f, 0x0a, 0x8c, 0x65, 0x2c, 0xfc, + 0x3d, 0x70, 0x4e, 0x17, 0x8a, 0xc8, 0x1d, 0x38, 0x8e, 0x6f, 0xa0, 0x82, 0x51, 0xc3, 0xc1, 0xcb, 0x18, 0xb6, 0x45, + 0x31, 0x0b, 0x09, 0xa7, 0x10, 0x2e, 0x56, 0x59, 0xbf, 0x2f, 0x7f, 0x51, 0x17, 0x5d, 0x64, 0xb2, 0xee, 0x93, 0x70, + 0x64, 0xc6, 0x72, 0xea, 0x85, 0xe4, 0x79, 0xcf, 0x93, 0x69, 0xf2, 0x2c, 0x0f, 0x22, 0x80, 0x7c, 0x0e, 0xef, 0xc3, + 0x34, 0x03, 0xab, 0x34, 0x29, 0x3f, 0x42, 0xe9, 0x8b, 0xcf, 0x2b, 0x3f, 0xd0, 0xd9, 0x73, 0x93, 0x0c, 0x6f, 0x56, + 0xad, 0x37, 0xa9, 0x75, 0x5d, 0x3c, 0xe0, 0x5f, 0x9c, 0xc1, 0xc6, 0xb9, 0xce, 0x04, 0x07, 0x5e, 0x24, 0xb5, 0x5e, + 0x33, 0x7e, 0x9d, 0xe1, 0xba, 0x54, 0x6d, 0xf4, 0x51, 0x88, 0xce, 0x21, 0x53, 0x01, 0x0a, 0x45, 0xda, 0x3f, 0x28, + 0xb5, 0x32, 0xa9, 0xb4, 0x91, 0x00, 0xba, 0x87, 0x49, 0x83, 0x2d, 0x86, 0x32, 0x96, 0x26, 0x51, 0xee, 0x34, 0x88, + 0x2b, 0xfb, 0x73, 0x25, 0x71, 0x68, 0x59, 0x24, 0xff, 0xde, 0xf5, 0xf4, 0x15, 0x52, 0x77, 0xb2, 0x40, 0x66, 0x8c, + 0x17, 0x79, 0xfc, 0x09, 0x08, 0xb3, 0x41, 0x1b, 0x15, 0x85, 0x10, 0xb2, 0x41, 0x0c, 0x1a, 0x2f, 0xf2, 0xf8, 0x7b, + 0x45, 0xe3, 0x21, 0x1f, 0x45, 0xbe, 0xfa, 0xab, 0xd4, 0x7f, 0x85, 0x3e, 0x33, 0xc1, 0x23, 0x54, 0x13, 0xfd, 0xbb, + 0xe7, 0xb3, 0x7b, 0x50, 0x1b, 0x46, 0x61, 0x66, 0xca, 0xaf, 0x7c, 0x53, 0x9c, 0xbd, 0xfe, 0x8a, 0xae, 0xb2, 0xad, + 0xfb, 0xd1, 0xc7, 0x23, 0x02, 0x6b, 0x63, 0x74, 0xc5, 0x8d, 0x01, 0xe4, 0x30, 0x79, 0xbf, 0xa2, 0xb4, 0x1c, 0xd2, + 0x20, 0x74, 0xd0, 0x10, 0xf4, 0x4a, 0xa2, 0x0f, 0x24, 0x16, 0x31, 0x86, 0x17, 0xe2, 0x19, 0xa9, 0xc9, 0x44, 0x43, + 0xbc, 0x22, 0xf6, 0x43, 0xb4, 0xe4, 0xd4, 0x44, 0x37, 0xc2, 0x14, 0x03, 0x89, 0x9d, 0x41, 0x72, 0x92, 0xd4, 0xca, + 0x2f, 0x9e, 0x49, 0xc2, 0x12, 0x3b, 0x0f, 0x31, 0x98, 0xd4, 0xd2, 0x9d, 0xde, 0x54, 0xe9, 0xdd, 0x91, 0x96, 0x83, + 0xf6, 0x01, 0xd8, 0xa5, 0xa4, 0xf7, 0x4f, 0x0a, 0x45, 0x7c, 0x08, 0xe3, 0x18, 0xc2, 0xb7, 0x88, 0xea, 0x0a, 0x9c, + 0x6b, 0x05, 0x1a, 0xab, 0x81, 0x87, 0x66, 0x56, 0xcd, 0x87, 0x9c, 0x7e, 0x2a, 0x2d, 0x7f, 0x8c, 0x68, 0x6c, 0xb4, + 0x6e, 0x0e, 0x87, 0x3d, 0xad, 0x7a, 0xe9, 0x1c, 0x74, 0xd9, 0x4c, 0x62, 0xe2, 0x06, 0xd2, 0xf5, 0xa3, 0xdf, 0x4c, + 0xd8, 0x8b, 0xa8, 0x90, 0x4b, 0x21, 0x28, 0x68, 0x75, 0x20, 0x70, 0x28, 0xbc, 0x45, 0x99, 0x2f, 0x62, 0xda, 0x40, + 0x18, 0x7c, 0x7e, 0x20, 0x3f, 0xdf, 0x14, 0xa4, 0x62, 0xc7, 0xba, 0xf6, 0xfb, 0x9b, 0xd2, 0x03, 0x3c, 0x39, 0x93, + 0xe4, 0x69, 0x33, 0x84, 0x15, 0x01, 0x34, 0x66, 0x35, 0x59, 0x9c, 0x70, 0x65, 0x0e, 0x3f, 0x56, 0x5e, 0xc9, 0x52, + 0xa6, 0xce, 0x53, 0xbd, 0x00, 0xa2, 0x8e, 0x37, 0x68, 0x45, 0xea, 0x57, 0xe8, 0xec, 0x35, 0x2b, 0x21, 0xe3, 0xe1, + 0x39, 0xe7, 0xe9, 0xe8, 0x81, 0x25, 0x3c, 0xc2, 0xbf, 0x92, 0x89, 0x3e, 0xfc, 0x1e, 0x38, 0xdc, 0x8c, 0x13, 0x1e, + 0xb9, 0xcd, 0xde, 0x57, 0xe1, 0x0a, 0x6e, 0xa6, 0x05, 0x20, 0xb9, 0x05, 0x49, 0x13, 0x50, 0x42, 0x22, 0x13, 0x32, + 0x6b, 0x4a, 0x7e, 0x6e, 0x69, 0x1b, 0xac, 0x61, 0xd2, 0x79, 0xc0, 0x8b, 0x56, 0x1f, 0xad, 0x26, 0xda, 0x65, 0x96, + 0xcf, 0x87, 0x38, 0x43, 0x35, 0xc7, 0xdd, 0x19, 0xfc, 0x1c, 0xf0, 0x8a, 0x55, 0x4d, 0x3a, 0xda, 0x0d, 0xb8, 0xf0, + 0xe4, 0x3a, 0x4f, 0x47, 0x5b, 0xfc, 0x25, 0xf7, 0x07, 0x80, 0x0e, 0xa6, 0x2e, 0x81, 0x3f, 0x55, 0x5b, 0x4d, 0xa5, + 0x7e, 0x69, 0xed, 0xd7, 0x75, 0x67, 0xb5, 0x72, 0xcf, 0xba, 0x0c, 0xed, 0x91, 0x21, 0x67, 0xcc, 0x80, 0x3f, 0x67, + 0x2c, 0xf9, 0x73, 0xc6, 0x8a, 0x3f, 0x67, 0xdc, 0x18, 0x19, 0x40, 0x09, 0xee, 0x25, 0xbf, 0xde, 0x23, 0x66, 0x88, + 0xd5, 0xa0, 0x12, 0x58, 0x59, 0xca, 0xb9, 0x8f, 0x9c, 0x62, 0xca, 0x29, 0xc3, 0x4b, 0xa7, 0x33, 0x77, 0x20, 0xe7, + 0xc1, 0xcc, 0x1d, 0x26, 0x67, 0x7d, 0x8a, 0x63, 0x69, 0x4c, 0x8a, 0x0a, 0xd2, 0x39, 0x1d, 0x6e, 0x5e, 0x1d, 0xe7, + 0x09, 0xcb, 0xf8, 0xb8, 0x7d, 0xa6, 0x40, 0x88, 0x2d, 0x9e, 0x21, 0x91, 0x52, 0x35, 0xcb, 0x6d, 0xfe, 0x70, 0xa8, + 0x47, 0x0f, 0x7a, 0xa7, 0x87, 0x5f, 0x09, 0xfb, 0x25, 0xf3, 0xec, 0x13, 0x04, 0x30, 0x49, 0xe4, 0x99, 0x84, 0xa3, + 0x1f, 0xcb, 0xd1, 0xdf, 0x34, 0xfc, 0x5d, 0x86, 0xea, 0xee, 0x10, 0x98, 0xd8, 0xb2, 0x03, 0x87, 0xe0, 0x74, 0x55, + 0x89, 0x04, 0x1c, 0x6c, 0x36, 0x2c, 0xd2, 0x7b, 0x3c, 0xc4, 0xf9, 0xa0, 0xf0, 0x11, 0x1a, 0x66, 0xf4, 0x7e, 0x7f, + 0x23, 0xbc, 0x4a, 0xb6, 0xf2, 0x70, 0x48, 0xac, 0xbb, 0xb0, 0xa3, 0x8f, 0xa3, 0x3d, 0x4a, 0xa8, 0xfd, 0xa8, 0xd6, + 0x9b, 0x4a, 0x3d, 0xc8, 0xcd, 0x2e, 0x24, 0x06, 0x15, 0x4b, 0xf5, 0xe9, 0x95, 0xea, 0x43, 0xcd, 0x3a, 0xbf, 0xab, + 0xe3, 0x3e, 0x15, 0xa3, 0xb5, 0x9c, 0x10, 0xe0, 0x3a, 0x48, 0x34, 0x3a, 0x00, 0xc6, 0xd9, 0x66, 0xcb, 0x4b, 0x6d, + 0x9d, 0x28, 0x1d, 0xc7, 0xb9, 0x3e, 0x8e, 0x0f, 0x07, 0x29, 0x66, 0x5c, 0x1e, 0x89, 0x19, 0x97, 0x0d, 0xc0, 0x9b, + 0x75, 0x1e, 0xd4, 0x87, 0xc3, 0x25, 0x5d, 0x8a, 0x4c, 0x67, 0x1b, 0xe5, 0x67, 0x3d, 0x7a, 0x78, 0x96, 0xa0, 0xb9, + 0xb7, 0xc2, 0xde, 0x8b, 0x64, 0x7b, 0x26, 0xeb, 0xd4, 0xcb, 0xc8, 0xa7, 0x17, 0xee, 0xd9, 0x25, 0x57, 0x3f, 0xac, + 0xbe, 0x9e, 0xfe, 0x2a, 0xbc, 0x88, 0x55, 0xb4, 0x5b, 0x97, 0x4c, 0xd8, 0x5b, 0x4a, 0x25, 0xad, 0xf2, 0xf2, 0xe9, + 0xc6, 0x0f, 0x30, 0x33, 0xed, 0xe9, 0x83, 0x6c, 0x44, 0xf5, 0x67, 0x25, 0x6a, 0x65, 0x98, 0x2c, 0x9c, 0x97, 0x4c, + 0x3d, 0x19, 0xf0, 0x98, 0x95, 0x3c, 0x92, 0x9d, 0xde, 0x18, 0x04, 0x01, 0xac, 0x73, 0xd2, 0xaa, 0x33, 0x8e, 0x46, + 0xab, 0xca, 0xc5, 0xe9, 0x2a, 0x17, 0x18, 0x6e, 0xb7, 0x66, 0x1b, 0x55, 0x67, 0xb9, 0xa9, 0x55, 0xca, 0x77, 0x00, + 0x1f, 0xcb, 0x2a, 0x17, 0x74, 0x4c, 0x99, 0x3a, 0x6f, 0x20, 0x18, 0x5b, 0xd5, 0xb8, 0x70, 0x6a, 0x5c, 0xf0, 0x88, + 0xda, 0xdd, 0x34, 0xf5, 0x68, 0x0b, 0x2c, 0xa5, 0xa3, 0x1d, 0x2f, 0x51, 0xa5, 0xf0, 0x77, 0xc1, 0xf7, 0x61, 0x1c, + 0x7f, 0x5f, 0x6c, 0xd5, 0x81, 0x78, 0x5b, 0x6c, 0x91, 0xf6, 0x45, 0xfe, 0x85, 0x38, 0xe0, 0xb5, 0xae, 0x29, 0xaf, + 0xad, 0x39, 0x0d, 0x6c, 0x0d, 0x23, 0x25, 0x85, 0x73, 0xf3, 0xe7, 0xe1, 0x40, 0x2b, 0xbb, 0x56, 0x77, 0x85, 0x5a, + 0x8f, 0x39, 0x6c, 0xd8, 0x8b, 0x2c, 0xdc, 0x89, 0x12, 0x1c, 0xb9, 0xe4, 0x5f, 0x87, 0x83, 0x56, 0x59, 0xaa, 0x23, + 0x7d, 0xb6, 0xff, 0x12, 0x8c, 0x19, 0xba, 0x34, 0x01, 0xcb, 0xc6, 0x48, 0xfe, 0xd5, 0x34, 0xf3, 0x86, 0xc9, 0x9a, + 0x29, 0x1c, 0x87, 0x86, 0x11, 0xd2, 0x80, 0x6e, 0x83, 0xda, 0xf0, 0x64, 0xbe, 0xa9, 0xca, 0xaf, 0xee, 0x48, 0xb5, + 0x1f, 0x0c, 0x2f, 0x27, 0xe2, 0x9c, 0x2e, 0x49, 0xea, 0xa9, 0x84, 0x92, 0x10, 0xec, 0xd2, 0x07, 0x72, 0x62, 0x05, + 0x64, 0x2d, 0x63, 0xf9, 0xad, 0x1e, 0x10, 0xfa, 0x4f, 0xbb, 0xf5, 0x42, 0xff, 0x69, 0x9a, 0x2d, 0xd4, 0xf5, 0x87, + 0xc9, 0x7d, 0x47, 0xaf, 0x3f, 0x38, 0xbc, 0x53, 0x57, 0x15, 0x57, 0xf1, 0xb0, 0x36, 0x4c, 0x72, 0xa3, 0x2c, 0xdc, + 0x15, 0x9b, 0x5a, 0x2d, 0x4f, 0xc7, 0x61, 0x04, 0x66, 0x04, 0x05, 0xc8, 0xba, 0x6e, 0x23, 0x62, 0x58, 0xc9, 0x65, + 0x42, 0x3e, 0x21, 0x20, 0x8b, 0x52, 0xe3, 0x7c, 0xdc, 0x02, 0x95, 0x08, 0x06, 0xa7, 0xa1, 0xb5, 0xea, 0x26, 0x3f, + 0xaa, 0x6c, 0xec, 0x0e, 0xc8, 0x21, 0xc9, 0x64, 0x71, 0x37, 0xba, 0x15, 0xcb, 0xa2, 0x14, 0x3f, 0x63, 0x3d, 0x5c, + 0xb3, 0x85, 0xfb, 0x0c, 0x08, 0xed, 0x27, 0x4a, 0x7b, 0x13, 0x69, 0x82, 0xee, 0x3b, 0xb6, 0x02, 0x90, 0x01, 0x14, + 0x75, 0xb5, 0x5b, 0x9f, 0xf3, 0x73, 0x24, 0xcd, 0x70, 0x18, 0xdd, 0x3e, 0xbd, 0x0b, 0xee, 0x06, 0x97, 0xa8, 0x95, + 0xbe, 0x64, 0x71, 0x0b, 0x83, 0x6a, 0x6f, 0x96, 0x70, 0x50, 0x33, 0x6b, 0x6d, 0x04, 0x82, 0xc9, 0x1e, 0x0a, 0x2a, + 0xe6, 0x0a, 0xf6, 0x41, 0xc1, 0x5a, 0xf2, 0x3a, 0x38, 0xdc, 0xda, 0x97, 0x95, 0xe2, 0xe2, 0xf9, 0x45, 0xd2, 0xba, + 0xb0, 0x94, 0x17, 0xcf, 0x1b, 0x30, 0xb8, 0x1c, 0x61, 0x53, 0x55, 0xfe, 0x64, 0x03, 0xa0, 0x5b, 0x21, 0x45, 0xbc, + 0x28, 0x85, 0x6d, 0x2b, 0x9f, 0x39, 0x61, 0x83, 0x0d, 0x7b, 0x80, 0x7b, 0x65, 0x50, 0x32, 0xb8, 0x10, 0xe3, 0x76, + 0xb3, 0x0b, 0x70, 0x05, 0x43, 0x61, 0x6c, 0xcd, 0x5f, 0x67, 0x5e, 0xa4, 0x04, 0xdc, 0x0c, 0x51, 0xbe, 0x36, 0x70, + 0x32, 0xe9, 0xc9, 0xb5, 0x64, 0x31, 0x60, 0x41, 0x83, 0xef, 0xa8, 0xf5, 0x77, 0x26, 0xff, 0xc6, 0xd3, 0x43, 0x3f, + 0xf8, 0x9c, 0x79, 0x4b, 0x9f, 0xbd, 0xae, 0x64, 0xb4, 0x26, 0x89, 0xf2, 0xea, 0xe1, 0x12, 0xe4, 0x86, 0xe5, 0xe8, + 0x81, 0x2d, 0x41, 0x9c, 0x58, 0x8e, 0x12, 0xca, 0xe8, 0x0a, 0xf7, 0x2a, 0xb3, 0x65, 0x22, 0x90, 0xe2, 0xc0, 0x52, + 0xca, 0xbd, 0xc5, 0x3a, 0x58, 0xe2, 0xfe, 0x44, 0x72, 0x01, 0x25, 0x0f, 0xa0, 0x5c, 0x29, 0x20, 0xe0, 0xd3, 0x01, + 0x94, 0x2f, 0xe5, 0x45, 0xf8, 0x13, 0x27, 0x6a, 0xb0, 0x1c, 0x3d, 0x34, 0xec, 0x47, 0x2f, 0xb4, 0xec, 0x0f, 0x77, + 0x5a, 0xd3, 0xb0, 0xe2, 0x77, 0x30, 0x2d, 0x26, 0x6e, 0x5f, 0xae, 0xec, 0xaa, 0xf8, 0x6c, 0xa5, 0xce, 0x6e, 0x6a, + 0x48, 0xc2, 0xbe, 0x22, 0xab, 0x00, 0x07, 0xab, 0x22, 0xee, 0x59, 0x96, 0xfb, 0x30, 0xfa, 0x73, 0x93, 0x96, 0xc2, + 0x42, 0x95, 0xf4, 0xf7, 0x4d, 0x29, 0x90, 0xca, 0x44, 0x27, 0x5a, 0x08, 0xae, 0xc0, 0x20, 0x70, 0x2f, 0xf2, 0x1a, + 0x00, 0x63, 0xc0, 0xa5, 0x40, 0x59, 0xb6, 0x25, 0x84, 0x54, 0xf7, 0x33, 0x50, 0xdb, 0x89, 0xfb, 0x34, 0x22, 0x6b, + 0x21, 0xfa, 0x2a, 0x18, 0x33, 0xe7, 0xa5, 0x74, 0x8b, 0x4d, 0x57, 0x9b, 0xd5, 0x0d, 0x3a, 0x97, 0xb6, 0xdc, 0xfc, + 0x84, 0x2d, 0xd6, 0x0a, 0x94, 0x4d, 0x48, 0xda, 0xce, 0x79, 0x8e, 0xb2, 0x09, 0x2d, 0xed, 0x3d, 0xf5, 0xa8, 0x50, + 0x9d, 0x6c, 0xbd, 0x54, 0x4d, 0x2d, 0xc2, 0x6a, 0x71, 0x51, 0xf9, 0x01, 0xe8, 0xa6, 0xd2, 0xea, 0x45, 0x5d, 0xa3, + 0x29, 0xd4, 0x6a, 0xe1, 0xb8, 0xd1, 0xce, 0xa6, 0xcb, 0xf4, 0x0e, 0x71, 0x56, 0xa5, 0x1d, 0xfa, 0xfb, 0x4c, 0xbb, + 0x5e, 0x76, 0xf4, 0x9b, 0x71, 0x75, 0x81, 0x0b, 0xb1, 0x01, 0x9f, 0x73, 0x7f, 0x79, 0xbd, 0xe7, 0x71, 0xcf, 0x3f, + 0x1c, 0x90, 0x3d, 0xa9, 0xfd, 0xa1, 0xfa, 0xd8, 0x15, 0x0c, 0x59, 0x18, 0xa5, 0xfe, 0x22, 0xe5, 0xbd, 0x27, 0x38, + 0xee, 0x9f, 0xab, 0x1e, 0xfb, 0x31, 0xe3, 0xfb, 0xba, 0xd8, 0x44, 0x09, 0x45, 0x35, 0xf4, 0x56, 0xc5, 0xa6, 0x12, + 0x71, 0xf1, 0x90, 0xf7, 0x18, 0x26, 0xc3, 0x58, 0xc8, 0x54, 0xf8, 0x53, 0xa6, 0x82, 0x47, 0x08, 0x25, 0x6e, 0xd6, + 0x3d, 0xd2, 0x6e, 0x42, 0x9c, 0x52, 0x2d, 0x4a, 0x99, 0x8c, 0x7f, 0xeb, 0x27, 0x50, 0x9e, 0x53, 0xb4, 0x4c, 0x3f, + 0x2a, 0x5c, 0xa6, 0x6f, 0xd6, 0xc7, 0xa5, 0x67, 0x22, 0xd4, 0x99, 0x8b, 0x4d, 0xad, 0xd3, 0x31, 0x76, 0x4a, 0xa7, + 0x36, 0xec, 0x4b, 0xa5, 0xb8, 0xac, 0x28, 0xfc, 0x1b, 0x89, 0xac, 0x7a, 0x46, 0x1c, 0xff, 0x57, 0xd6, 0x3e, 0xc3, + 0x2a, 0xf0, 0xcb, 0x40, 0xde, 0x2f, 0x00, 0x3e, 0xae, 0xeb, 0x32, 0xbd, 0xdd, 0x00, 0x6d, 0x08, 0x0d, 0x7f, 0xcf, + 0x47, 0x06, 0x4c, 0xf7, 0x11, 0xce, 0x90, 0x1e, 0xea, 0x9c, 0xd3, 0x59, 0x99, 0xce, 0xb9, 0x0a, 0x6b, 0x09, 0xf6, + 0x72, 0xd2, 0xe4, 0x72, 0x5d, 0x82, 0x9a, 0x09, 0xdc, 0x3e, 0xb4, 0x47, 0x84, 0x50, 0x9b, 0xb2, 0x9a, 0x5e, 0x42, + 0xcd, 0x3b, 0x39, 0xed, 0x68, 0x52, 0x82, 0xab, 0x86, 0xce, 0xca, 0xf5, 0x5f, 0x87, 0x43, 0xef, 0x36, 0x2b, 0xa2, + 0x3f, 0x7a, 0xe8, 0xef, 0xb8, 0xbd, 0x49, 0xbf, 0x40, 0xb4, 0x8c, 0xf5, 0x37, 0x64, 0x40, 0xc7, 0x93, 0xe1, 0x6d, + 0xb1, 0xed, 0xb1, 0x2f, 0xa8, 0xc1, 0xd2, 0xd7, 0x8f, 0x3f, 0x40, 0x42, 0xd5, 0xb5, 0x2f, 0x2c, 0x9e, 0x30, 0x4f, + 0x89, 0xb6, 0x85, 0x0f, 0x61, 0xa1, 0x5f, 0x20, 0x32, 0x12, 0xc2, 0x4d, 0x65, 0xf7, 0x28, 0x69, 0x17, 0xfa, 0xd2, + 0xd7, 0xb2, 0xaf, 0x7c, 0xe7, 0x02, 0x60, 0x65, 0x9f, 0xdb, 0x70, 0x4f, 0xfa, 0x53, 0xaa, 0x0f, 0xdb, 0xdf, 0x92, + 0x05, 0x14, 0x5a, 0x58, 0x4f, 0xe5, 0xec, 0x5c, 0x97, 0x3c, 0xcd, 0xa6, 0xfb, 0x35, 0xec, 0x51, 0xf7, 0xe8, 0x35, + 0x15, 0x9c, 0x5f, 0x9a, 0xd1, 0xfb, 0xa7, 0xa1, 0x50, 0x1d, 0x75, 0xee, 0x20, 0xeb, 0xd2, 0xba, 0xe4, 0xfc, 0x66, + 0xe5, 0x8e, 0xc2, 0xfc, 0x3e, 0x04, 0xcf, 0xb0, 0xee, 0xdd, 0xc5, 0x79, 0xef, 0xcf, 0xd6, 0x1c, 0xf9, 0x31, 0x9b, + 0xa5, 0x88, 0x45, 0x32, 0x07, 0xab, 0x1f, 0xfa, 0x79, 0xec, 0xb7, 0x41, 0x0e, 0xc7, 0x4d, 0x03, 0x3a, 0x6c, 0xc8, + 0xac, 0x7d, 0x89, 0xc0, 0xa9, 0x46, 0x90, 0xa6, 0x26, 0xa8, 0x59, 0x1e, 0x22, 0xb1, 0x5d, 0xca, 0xb6, 0x41, 0xae, + 0xbb, 0x60, 0x9a, 0x23, 0xed, 0x19, 0xbc, 0x6f, 0xd2, 0x24, 0x15, 0x9a, 0x45, 0xda, 0x2a, 0x19, 0xff, 0x8e, 0xb4, + 0x99, 0x92, 0x3d, 0xb6, 0x06, 0xde, 0x4b, 0x50, 0x4e, 0x86, 0x29, 0x86, 0xef, 0xf8, 0x7a, 0xe7, 0x31, 0xf7, 0x9c, + 0x63, 0xb6, 0x49, 0xd9, 0x11, 0x4c, 0x92, 0x8d, 0x6f, 0x28, 0xde, 0xf0, 0xfd, 0x6d, 0x25, 0x4a, 0x00, 0xbd, 0x2c, + 0xf8, 0xb5, 0xb4, 0xb9, 0x42, 0xb7, 0xbb, 0x77, 0x94, 0xc2, 0x2f, 0x79, 0x79, 0x38, 0x6c, 0x53, 0x2f, 0x84, 0xce, + 0x17, 0xf1, 0x3b, 0x30, 0x87, 0x31, 0xc4, 0x66, 0x04, 0x08, 0x73, 0x7c, 0x40, 0x1d, 0xac, 0x1f, 0x01, 0x68, 0x9c, + 0x40, 0x01, 0x46, 0x5f, 0x6d, 0x0b, 0xfa, 0x96, 0x17, 0x17, 0x11, 0xa2, 0x46, 0x01, 0x26, 0x4a, 0x9a, 0xc5, 0x30, + 0x1c, 0xe8, 0xfc, 0xbe, 0xb9, 0xad, 0x4b, 0x81, 0x43, 0xef, 0x58, 0x86, 0xff, 0xfe, 0x3f, 0xd6, 0x96, 0x56, 0x95, + 0xed, 0xd6, 0x38, 0xcd, 0xfc, 0x6f, 0xb7, 0x85, 0xbe, 0xff, 0x52, 0x28, 0x9e, 0x77, 0xbc, 0x6e, 0xbf, 0x83, 0xe8, + 0x7d, 0xdd, 0xca, 0xbb, 0x52, 0xbb, 0x61, 0xa6, 0xfc, 0x21, 0xcd, 0xe3, 0xe2, 0x61, 0x14, 0xb7, 0x8e, 0xbc, 0x49, + 0x7a, 0xce, 0xf9, 0xbb, 0xaa, 0xdf, 0xf7, 0xde, 0x01, 0x19, 0xef, 0x4b, 0x61, 0x1c, 0x31, 0x89, 0x83, 0x6f, 0x2f, + 0x46, 0xd1, 0xa6, 0x84, 0x0d, 0xb9, 0x7d, 0x5a, 0x82, 0x66, 0xa6, 0xdf, 0x47, 0x89, 0xd2, 0x9a, 0xef, 0x7f, 0x93, + 0xf3, 0xfd, 0xa5, 0x90, 0x37, 0x2b, 0xf9, 0xe1, 0xa3, 0x15, 0x06, 0xbe, 0xc7, 0xe9, 0x17, 0xd1, 0x63, 0x77, 0xa5, + 0x0f, 0xdf, 0x95, 0x96, 0x3e, 0xab, 0xa8, 0x7f, 0xa0, 0xa2, 0xe6, 0xa5, 0x18, 0x11, 0xf1, 0x20, 0x68, 0x67, 0xdb, + 0xa5, 0x76, 0x2d, 0x41, 0xbb, 0x60, 0x53, 0xd8, 0xbf, 0x1f, 0x1d, 0xf2, 0x7e, 0xff, 0x63, 0xee, 0xb5, 0x78, 0xdd, + 0x75, 0x68, 0xca, 0x4f, 0x85, 0x87, 0x10, 0xc0, 0x5a, 0x06, 0xca, 0x38, 0xc2, 0xa4, 0x8b, 0xbc, 0x46, 0xd9, 0x74, + 0x22, 0xf0, 0x31, 0xcb, 0xae, 0x9c, 0x64, 0x1a, 0x60, 0x46, 0x35, 0x85, 0x99, 0x00, 0x23, 0xf5, 0x11, 0xeb, 0xa6, + 0xa7, 0x55, 0x68, 0xf9, 0x1a, 0x82, 0x75, 0x91, 0x65, 0x1c, 0xc5, 0x4c, 0x00, 0xb0, 0xf9, 0x08, 0xf2, 0x15, 0x5d, + 0x1d, 0x92, 0x56, 0xaa, 0xbc, 0x5f, 0x67, 0x44, 0x46, 0x93, 0x10, 0xcd, 0x6f, 0xe1, 0x81, 0x7d, 0xdb, 0xcc, 0xa8, + 0x52, 0xcf, 0xa8, 0xca, 0x67, 0x38, 0x2c, 0x85, 0x63, 0xc4, 0xff, 0x7b, 0xaa, 0x7a, 0x44, 0xa0, 0x57, 0x65, 0x5a, + 0x45, 0x45, 0x9e, 0x8b, 0x08, 0x11, 0xaa, 0xa5, 0x73, 0x38, 0xf4, 0x63, 0xbf, 0x8f, 0x03, 0x61, 0x5e, 0xfc, 0xe9, + 0xb1, 0xae, 0xfc, 0xa9, 0xc0, 0xb5, 0x92, 0x02, 0xa7, 0xa2, 0x46, 0x88, 0x10, 0xde, 0x9f, 0xc0, 0xb3, 0x9a, 0xfa, + 0x7e, 0x63, 0x99, 0xe8, 0xfe, 0x99, 0x01, 0xe5, 0x0f, 0xc8, 0xd7, 0x95, 0x14, 0x67, 0xea, 0xe4, 0x31, 0x71, 0xc6, + 0x01, 0x88, 0xf9, 0xba, 0x44, 0xa3, 0xb1, 0xff, 0x01, 0x09, 0x86, 0xea, 0x07, 0x3b, 0xdd, 0xd4, 0xfb, 0x57, 0x26, + 0x71, 0x14, 0x7d, 0xda, 0x26, 0x8f, 0x25, 0x4b, 0xa3, 0x85, 0xa3, 0xf7, 0x88, 0x61, 0x1c, 0x4e, 0xe7, 0x63, 0x92, + 0x6d, 0x4c, 0x56, 0x01, 0xa4, 0x93, 0x99, 0x3a, 0xa6, 0xd4, 0xd1, 0x38, 0xd7, 0x0b, 0xaa, 0xd0, 0x63, 0x5d, 0xf2, + 0x1c, 0xac, 0x27, 0x3f, 0x78, 0xa5, 0x3f, 0x15, 0x72, 0x0e, 0x1b, 0x89, 0xa0, 0xf0, 0x03, 0x5c, 0x0d, 0x56, 0x0a, + 0x18, 0x4c, 0x7d, 0x0b, 0x5f, 0x13, 0xcf, 0x51, 0xf0, 0x28, 0xec, 0x62, 0x6c, 0xad, 0x7c, 0xe7, 0x93, 0x82, 0x72, + 0xcf, 0x8a, 0x39, 0xaf, 0x80, 0x73, 0x19, 0x14, 0xc2, 0x74, 0x3c, 0xcb, 0xff, 0x99, 0xe4, 0xf5, 0xc4, 0x86, 0x00, + 0x19, 0xfc, 0x29, 0x71, 0x5a, 0xba, 0x43, 0x77, 0x1e, 0x7a, 0x16, 0x71, 0xd8, 0xe8, 0xc9, 0xba, 0x2c, 0xb6, 0x29, + 0xea, 0x25, 0xcc, 0x0f, 0xe4, 0xe7, 0x2d, 0xf9, 0x3e, 0x44, 0xf1, 0x36, 0xf8, 0x35, 0x63, 0xb1, 0xc0, 0xbf, 0xfe, + 0x9e, 0x31, 0x9a, 0x68, 0xc1, 0xbf, 0xb3, 0x06, 0x89, 0x8a, 0x7f, 0xca, 0x26, 0x00, 0xeb, 0xc8, 0xd5, 0x87, 0x4f, + 0x89, 0xf1, 0xd6, 0x6c, 0x78, 0xe4, 0x9b, 0x15, 0xe8, 0xd4, 0xe7, 0xee, 0xca, 0xf6, 0x54, 0x35, 0xfe, 0x9e, 0xea, + 0x6a, 0xa4, 0xaa, 0x1a, 0x7f, 0x4f, 0xa9, 0x1a, 0xbf, 0x65, 0x14, 0xbf, 0x53, 0xf9, 0x0c, 0x99, 0x93, 0x4d, 0x4c, + 0xd2, 0xe9, 0x7b, 0xc3, 0x89, 0x5d, 0xf6, 0xab, 0xb7, 0x89, 0xcc, 0x44, 0x0a, 0xb9, 0x37, 0x00, 0x6d, 0xbf, 0xcb, + 0x0d, 0xa7, 0xc4, 0xf9, 0xb9, 0x87, 0x2b, 0x36, 0xad, 0x5e, 0xd2, 0x82, 0x05, 0x36, 0x2f, 0xb3, 0x3c, 0x45, 0x02, + 0xdb, 0xa6, 0xcc, 0xfa, 0x73, 0xee, 0x01, 0x04, 0x33, 0xa9, 0x09, 0x00, 0x69, 0x21, 0x2a, 0x85, 0xc8, 0x5f, 0xe2, + 0xac, 0x3e, 0xe7, 0xbd, 0x4d, 0x1e, 0x13, 0x69, 0x75, 0xaf, 0xdf, 0x4f, 0xcf, 0xd2, 0x9c, 0x82, 0x1a, 0x8e, 0xb3, + 0x4e, 0xbf, 0xcf, 0x82, 0x3a, 0x91, 0xab, 0xf4, 0x1f, 0x6e, 0x90, 0x97, 0xf1, 0x7d, 0xdd, 0xf6, 0xfc, 0x89, 0xfa, + 0x7b, 0x67, 0xfd, 0x6d, 0x81, 0xe0, 0x4e, 0x8e, 0xfd, 0x64, 0x55, 0xca, 0x13, 0xe3, 0xd2, 0xde, 0xf3, 0x9b, 0xba, + 0x28, 0xb2, 0x3a, 0x5d, 0x7f, 0x90, 0x7a, 0x1a, 0xdd, 0x17, 0x7b, 0x30, 0x06, 0xef, 0x00, 0xf0, 0x4c, 0x87, 0x06, + 0x48, 0xdf, 0x33, 0xf2, 0x70, 0x9f, 0x5b, 0xf2, 0x93, 0xca, 0xda, 0x24, 0x61, 0x45, 0xb1, 0x19, 0xc6, 0x08, 0x25, + 0xe3, 0x34, 0xb6, 0x7e, 0xbf, 0xaf, 0xfe, 0xde, 0x61, 0x14, 0x15, 0x15, 0x77, 0x8c, 0x46, 0x65, 0x55, 0x8f, 0xb6, + 0x83, 0xc3, 0xe1, 0x3c, 0xb7, 0x71, 0xb4, 0xf5, 0x0a, 0xd8, 0x5b, 0xa1, 0x52, 0xf6, 0x4a, 0x84, 0xe5, 0x87, 0x2b, + 0xbf, 0xdf, 0x87, 0x7f, 0x65, 0xa4, 0x85, 0xe7, 0x4f, 0xf1, 0xd7, 0xa2, 0x2e, 0x30, 0x3c, 0x83, 0xd6, 0x68, 0x05, + 0xc1, 0x04, 0xff, 0xe8, 0x40, 0xbd, 0xb4, 0xd2, 0x3e, 0x82, 0x6e, 0x05, 0x7a, 0x50, 0x0f, 0x7d, 0x9a, 0xb4, 0x2f, + 0x24, 0xea, 0xf6, 0x56, 0xa7, 0xd1, 0x1f, 0x15, 0x5c, 0x4e, 0x61, 0x72, 0xb8, 0xa1, 0x4f, 0xab, 0x70, 0xfb, 0x09, + 0x9e, 0xfe, 0x0c, 0x94, 0x5b, 0x87, 0x43, 0x0e, 0x62, 0x0b, 0xb8, 0x79, 0xac, 0xc2, 0xcf, 0x45, 0x29, 0x23, 0xea, + 0xe3, 0x69, 0x01, 0xda, 0xbb, 0x00, 0x1d, 0xb0, 0x34, 0x88, 0x57, 0x48, 0x9e, 0xb3, 0x11, 0xc0, 0xb2, 0x03, 0xcb, + 0x59, 0xc6, 0x29, 0xcc, 0xb3, 0xbc, 0x56, 0x2b, 0xed, 0xac, 0x4c, 0xbc, 0x9a, 0x65, 0xe0, 0x2c, 0x70, 0x51, 0xf9, + 0x2c, 0xd3, 0xaa, 0xa7, 0x2a, 0x41, 0x9f, 0x57, 0x72, 0x82, 0x2b, 0xc1, 0xc9, 0x06, 0xe4, 0x17, 0x20, 0x49, 0x53, + 0xca, 0x9a, 0xf2, 0xfa, 0x92, 0x6e, 0xc8, 0xe8, 0x39, 0xef, 0x79, 0xd1, 0x30, 0xf4, 0x2f, 0xbc, 0x12, 0xc2, 0x37, + 0x71, 0xdb, 0x46, 0x29, 0xec, 0x6f, 0x02, 0x8b, 0x4f, 0xd8, 0x0f, 0xde, 0xd2, 0x9f, 0x8e, 0x83, 0x70, 0x88, 0xdc, + 0x50, 0x31, 0x07, 0xf6, 0x34, 0x60, 0xb1, 0x89, 0xaf, 0x36, 0x93, 0x78, 0x30, 0xf0, 0x75, 0xc6, 0x62, 0x16, 0x03, + 0x0d, 0x72, 0x3c, 0xb8, 0x9c, 0xeb, 0x13, 0x42, 0x3f, 0x8c, 0xa8, 0x1c, 0x15, 0xe8, 0x1c, 0x44, 0x83, 0x25, 0xe0, + 0xa9, 0xb7, 0xb2, 0x41, 0x92, 0x31, 0xc9, 0x24, 0xae, 0x35, 0x49, 0x75, 0x38, 0xa1, 0x75, 0xa0, 0xe3, 0xea, 0x02, + 0x3a, 0x1f, 0xd7, 0xbd, 0x8f, 0x57, 0xc3, 0x05, 0x95, 0x7e, 0x21, 0x06, 0x5e, 0x3d, 0x1d, 0x07, 0x97, 0x74, 0x2b, + 0x5c, 0xac, 0xc2, 0xed, 0xcf, 0xf2, 0x81, 0xe3, 0x8e, 0x4a, 0x1a, 0x02, 0x83, 0xb7, 0x87, 0xee, 0x66, 0x86, 0x86, + 0x3a, 0x69, 0x1f, 0xc6, 0xa1, 0x1c, 0x62, 0xd5, 0x8a, 0x0b, 0xe9, 0x8d, 0xe0, 0xdb, 0x85, 0x62, 0x2c, 0x1b, 0xbb, + 0x34, 0x14, 0x85, 0xbf, 0x02, 0xd8, 0xa1, 0xf6, 0x57, 0x2a, 0xf9, 0x18, 0x19, 0xd5, 0x34, 0xd0, 0x31, 0x00, 0x4b, + 0x96, 0x26, 0x92, 0x2a, 0xd2, 0x48, 0xfc, 0x91, 0x19, 0xeb, 0xa8, 0xe9, 0xfa, 0x82, 0xa9, 0x6a, 0x91, 0x74, 0x3b, + 0x93, 0x58, 0x4e, 0x24, 0xa9, 0xed, 0x3e, 0x22, 0x06, 0x03, 0x1f, 0x6c, 0xc4, 0x34, 0x13, 0xe1, 0x88, 0x47, 0x25, + 0xb2, 0xe8, 0xf2, 0xdb, 0x28, 0x93, 0xb6, 0x2f, 0x2b, 0xb2, 0x05, 0xc1, 0xf4, 0x24, 0xfa, 0x20, 0x49, 0x39, 0x15, + 0x89, 0x34, 0x23, 0x04, 0xf8, 0xf1, 0xa4, 0xbc, 0xd2, 0x9f, 0x83, 0xa6, 0x95, 0xe0, 0x25, 0x83, 0xe4, 0x91, 0xf8, + 0x99, 0x14, 0xcc, 0x62, 0xac, 0x1a, 0x0c, 0xb0, 0x9c, 0xea, 0x99, 0x63, 0x92, 0xfe, 0x5b, 0xa7, 0x13, 0xf6, 0x0b, + 0x2f, 0xb7, 0xb5, 0xbc, 0x69, 0xee, 0xbd, 0xf0, 0x2a, 0x96, 0x6a, 0x58, 0x06, 0xfd, 0xd7, 0x44, 0xbb, 0x60, 0x6b, + 0xcb, 0x98, 0xb0, 0xea, 0x07, 0x90, 0xf6, 0x48, 0x97, 0x57, 0x0d, 0x73, 0x26, 0x78, 0x74, 0x61, 0xcd, 0x83, 0xe8, + 0x42, 0xf8, 0xc8, 0x65, 0x37, 0x49, 0xae, 0xc6, 0x13, 0x3f, 0x1c, 0x0c, 0x14, 0x00, 0x2d, 0xad, 0x93, 0x62, 0x10, + 0x3e, 0x13, 0x72, 0x20, 0x8d, 0x8e, 0xaa, 0x00, 0x8b, 0x65, 0x76, 0x55, 0x4e, 0xb2, 0xc1, 0xc0, 0x07, 0xb1, 0x31, + 0xb1, 0x1b, 0x9a, 0xcd, 0x7d, 0x76, 0xa2, 0x20, 0xab, 0xcd, 0x61, 0x6b, 0xa6, 0x5b, 0x60, 0x00, 0x30, 0x88, 0x08, + 0x96, 0xfb, 0xdc, 0xc8, 0x47, 0xd4, 0xe9, 0x29, 0x8c, 0x80, 0xe0, 0x97, 0x13, 0x81, 0xc8, 0x45, 0x02, 0xf5, 0x00, + 0x33, 0x01, 0x66, 0x54, 0x31, 0xbc, 0x04, 0x76, 0xf1, 0xdc, 0xbc, 0x62, 0xd0, 0xbf, 0x68, 0x92, 0x25, 0x9a, 0x4a, + 0x1c, 0x8d, 0x91, 0x53, 0x69, 0x8c, 0x0c, 0x88, 0x5d, 0x1c, 0xff, 0x9e, 0xd2, 0xa3, 0x20, 0x65, 0x9f, 0x2b, 0x43, + 0x1c, 0x8e, 0xe2, 0x2b, 0x58, 0x35, 0x0e, 0x87, 0xda, 0xbc, 0x9e, 0xce, 0xea, 0xf9, 0x40, 0x04, 0xf0, 0xdf, 0x50, + 0xb0, 0x5f, 0x34, 0x15, 0xb9, 0x41, 0xea, 0x3c, 0x1c, 0x52, 0x90, 0x4f, 0x75, 0x93, 0xbf, 0xaf, 0xdc, 0xfd, 0x74, + 0x36, 0xb7, 0xe6, 0xe8, 0x45, 0x8d, 0xeb, 0xd6, 0xea, 0x86, 0x42, 0xa2, 0x35, 0x4d, 0x8a, 0xab, 0x6a, 0x52, 0x0c, + 0x78, 0xee, 0x0b, 0xd5, 0xc5, 0xd6, 0x08, 0x16, 0xfe, 0xdc, 0x02, 0x61, 0x32, 0xee, 0xc5, 0x47, 0x0b, 0x39, 0xa5, + 0x5d, 0x5b, 0xed, 0xb6, 0x95, 0x0d, 0x29, 0x9a, 0x0f, 0x2f, 0x61, 0x97, 0x4e, 0x11, 0x6d, 0xbb, 0x24, 0xf8, 0x02, + 0xb4, 0xac, 0x2e, 0x44, 0x1e, 0xd3, 0xaf, 0x90, 0x5f, 0x8a, 0xe1, 0x5f, 0xa5, 0x7b, 0x73, 0x6a, 0x83, 0x1c, 0xc0, + 0x76, 0xef, 0xe1, 0x76, 0x8c, 0x1e, 0xc8, 0xe0, 0x8d, 0x90, 0x73, 0xce, 0x2f, 0xa7, 0xd6, 0x8c, 0x89, 0x86, 0x05, + 0x2b, 0x87, 0x91, 0x1f, 0x20, 0xe3, 0xe5, 0x14, 0x58, 0xd9, 0x8f, 0x8a, 0xb8, 0xf4, 0x87, 0x91, 0x7f, 0xf1, 0x3c, + 0xc8, 0xb8, 0x17, 0x0d, 0x3b, 0xbe, 0x00, 0x7b, 0xf5, 0xc5, 0x73, 0x16, 0x0d, 0x78, 0x75, 0x55, 0x4f, 0xb3, 0x60, + 0x98, 0xb1, 0xe8, 0xaa, 0x18, 0x82, 0x0f, 0xed, 0x75, 0x39, 0x08, 0x7d, 0xdf, 0xec, 0x1c, 0xba, 0x1b, 0x12, 0x79, + 0x84, 0xfd, 0x08, 0x6e, 0xbb, 0x5a, 0x62, 0x06, 0x93, 0xcd, 0x5d, 0xc4, 0x0c, 0xb6, 0xfc, 0xc5, 0x73, 0xc3, 0x25, + 0x54, 0x5d, 0x4b, 0xcd, 0x46, 0x81, 0xe6, 0xe4, 0x0a, 0xcd, 0xc9, 0x4a, 0xa8, 0x25, 0x9f, 0x54, 0x38, 0x61, 0xe7, + 0x93, 0x5c, 0xd9, 0x8d, 0xc6, 0x18, 0xb8, 0x68, 0xcf, 0x6d, 0x61, 0x64, 0xa6, 0xb3, 0x14, 0x0d, 0x58, 0x78, 0x26, + 0x4e, 0x69, 0x0c, 0x68, 0x5f, 0x0e, 0x2c, 0x6d, 0xc8, 0x8f, 0x72, 0x66, 0xa0, 0x6d, 0x48, 0x69, 0xd4, 0x0c, 0xfc, + 0x99, 0x9a, 0x30, 0xbf, 0x82, 0x95, 0x08, 0xa2, 0xba, 0x00, 0x93, 0x24, 0x27, 0xa3, 0x91, 0xb2, 0x12, 0xc9, 0x39, + 0xe0, 0x7d, 0x04, 0x4f, 0x16, 0xb1, 0xad, 0xfd, 0x29, 0xfd, 0xaf, 0x0e, 0x9f, 0x4b, 0xff, 0x99, 0x00, 0x16, 0x72, + 0x69, 0x10, 0x19, 0x28, 0x1c, 0x52, 0x53, 0x89, 0x38, 0x71, 0x3c, 0x03, 0x5f, 0xc3, 0x05, 0x9a, 0x02, 0xfa, 0x83, + 0x9a, 0x51, 0x44, 0x16, 0xfe, 0xea, 0xd9, 0x4d, 0xdd, 0xe8, 0x79, 0xe6, 0xbc, 0x06, 0xcd, 0x0c, 0x84, 0xf4, 0x38, + 0x55, 0x6f, 0x43, 0xa2, 0xf3, 0xf2, 0x52, 0xbf, 0x4c, 0x88, 0x64, 0x45, 0xe4, 0xe9, 0xfb, 0x1c, 0xcc, 0x23, 0x8a, + 0xd0, 0xc1, 0x95, 0x79, 0x38, 0x9c, 0x0b, 0x0a, 0xdf, 0x51, 0x9e, 0x0f, 0x38, 0xcd, 0xa2, 0x04, 0xb4, 0x81, 0x2c, + 0x37, 0x65, 0xae, 0x93, 0x96, 0xa9, 0x7b, 0x0f, 0x56, 0x82, 0x0a, 0xdd, 0x9c, 0x82, 0x42, 0x19, 0x09, 0x4a, 0x69, + 0x35, 0x08, 0xa5, 0x3a, 0x2c, 0x82, 0xc8, 0x21, 0x0b, 0x01, 0x37, 0x53, 0xd1, 0x68, 0x49, 0xc3, 0x23, 0x9c, 0x1b, + 0x28, 0x04, 0x20, 0xb1, 0xa7, 0x8a, 0x32, 0x2e, 0x87, 0x80, 0x8f, 0x12, 0x0e, 0x71, 0xd6, 0xa4, 0x2d, 0xcf, 0x41, + 0x1c, 0xcb, 0x25, 0x5f, 0x57, 0x08, 0x06, 0x11, 0xfa, 0x0c, 0xf9, 0x93, 0xe5, 0xfc, 0xbb, 0x75, 0x98, 0x76, 0x84, + 0x0f, 0xbb, 0xda, 0x82, 0x8b, 0xd9, 0xed, 0x7c, 0x02, 0xf1, 0x2d, 0xb7, 0xf3, 0x63, 0x0c, 0x91, 0x85, 0x3f, 0xb8, + 0x1b, 0x4a, 0xae, 0x28, 0x74, 0x59, 0x8f, 0x48, 0x91, 0x3d, 0x5d, 0x73, 0x04, 0xc1, 0x81, 0x56, 0x0d, 0x32, 0x34, + 0x12, 0x5f, 0x3c, 0x87, 0xac, 0xc1, 0x9a, 0x7f, 0xae, 0xc8, 0x59, 0xdd, 0x9f, 0x6c, 0xa0, 0x9a, 0x64, 0xb2, 0x56, + 0x54, 0xce, 0x5f, 0xaf, 0xca, 0xf2, 0x64, 0x55, 0x86, 0xab, 0x41, 0x57, 0x55, 0x96, 0x1c, 0xa9, 0x0d, 0xd0, 0x9a, + 0xae, 0x10, 0x43, 0x21, 0x6b, 0xb0, 0xb4, 0xaa, 0xb2, 0xa6, 0x3e, 0x81, 0x40, 0x1f, 0x60, 0x19, 0x35, 0xfb, 0xe9, + 0xf0, 0x5f, 0xc1, 0xbf, 0x54, 0xc8, 0x52, 0x9d, 0xd6, 0x99, 0xf8, 0x35, 0x58, 0x32, 0xfc, 0xe3, 0xb7, 0x60, 0x0d, + 0x58, 0x02, 0x64, 0xb9, 0xdb, 0xd8, 0x68, 0xbd, 0xf2, 0x0a, 0xf1, 0xa5, 0xd6, 0x17, 0xfd, 0xd6, 0x6d, 0xa2, 0x56, + 0x80, 0x11, 0x0a, 0x2d, 0x02, 0x6c, 0xf5, 0xc0, 0x3d, 0x05, 0x3f, 0x10, 0xc3, 0xb9, 0x26, 0xad, 0xa9, 0x13, 0x5e, + 0x67, 0xe3, 0x48, 0x44, 0xf5, 0x16, 0x2e, 0xee, 0xf5, 0xd6, 0xe2, 0x6f, 0x54, 0x20, 0x00, 0xb2, 0x98, 0x62, 0xed, + 0xbc, 0x21, 0xbd, 0x32, 0xec, 0x24, 0xf4, 0xde, 0xb0, 0x13, 0xc8, 0x8b, 0xc3, 0x4e, 0xa1, 0x4b, 0xb4, 0x9d, 0x22, + 0x35, 0xd1, 0x76, 0xd2, 0x62, 0x15, 0x96, 0x10, 0xfc, 0xaa, 0xbd, 0x75, 0x94, 0xed, 0x8b, 0x2c, 0x61, 0xda, 0x02, + 0x46, 0xb9, 0x55, 0x9f, 0x39, 0x45, 0xac, 0x94, 0xbd, 0xd3, 0x49, 0x95, 0xbb, 0xc8, 0xa7, 0x56, 0x53, 0x64, 0xf2, + 0xf7, 0xc7, 0x2d, 0x92, 0x4f, 0x7e, 0x6e, 0x37, 0x4c, 0xa6, 0x7f, 0x3c, 0xfa, 0x02, 0xba, 0x22, 0x3b, 0x7d, 0x02, + 0x01, 0x99, 0x0a, 0xaa, 0xd5, 0xad, 0x62, 0x9a, 0xb7, 0xab, 0xec, 0xf6, 0x42, 0x89, 0xe1, 0x74, 0x76, 0x12, 0x1e, + 0x6d, 0x86, 0x0c, 0x1c, 0x82, 0x40, 0x21, 0x54, 0x14, 0xc3, 0x23, 0x50, 0x6b, 0x24, 0x1f, 0xe0, 0x47, 0xbb, 0x53, + 0x41, 0xa4, 0x76, 0x53, 0x71, 0xe3, 0xe4, 0xa6, 0xeb, 0xa5, 0x40, 0xad, 0x53, 0xb2, 0x02, 0x28, 0x21, 0xea, 0x4f, + 0x62, 0x5b, 0xbf, 0x84, 0x2b, 0x36, 0xdf, 0x37, 0x8a, 0x9e, 0x5c, 0x9f, 0xa2, 0x6e, 0xc5, 0xd5, 0x69, 0xda, 0x6a, + 0x8e, 0x1d, 0x67, 0xc8, 0xc1, 0xb3, 0x82, 0x60, 0x3b, 0x2a, 0x51, 0xbe, 0x6d, 0x37, 0x1d, 0x13, 0x5b, 0xfd, 0xb3, + 0xa8, 0x36, 0x77, 0x50, 0x11, 0x11, 0x1f, 0x65, 0x37, 0x4f, 0xda, 0xef, 0x60, 0x8f, 0xb5, 0x1a, 0x44, 0xf6, 0x19, + 0x5c, 0xe5, 0x3a, 0x2d, 0x72, 0x5b, 0x06, 0xe7, 0x1f, 0x5e, 0xed, 0x2a, 0x6c, 0x72, 0xac, 0xab, 0xab, 0x99, 0xea, + 0xa4, 0x62, 0x03, 0x63, 0x4d, 0x6b, 0xa9, 0xe6, 0x31, 0x24, 0xdd, 0x95, 0xc5, 0x59, 0x95, 0x74, 0xd3, 0x73, 0xe3, + 0x4c, 0x21, 0x06, 0xce, 0x56, 0xa3, 0xe5, 0x0c, 0x43, 0x74, 0x7d, 0x98, 0x25, 0x7e, 0xab, 0xa7, 0xdc, 0xe7, 0xe1, + 0xd6, 0xef, 0xea, 0x05, 0x27, 0x93, 0xfd, 0xe4, 0x38, 0x77, 0xbb, 0x48, 0xfb, 0x89, 0x6f, 0xc3, 0xfc, 0xeb, 0x1b, + 0xc4, 0x9d, 0xa8, 0xff, 0x59, 0x01, 0xd0, 0xe0, 0x26, 0x8f, 0x25, 0x4a, 0xfd, 0x5e, 0x55, 0x3f, 0xa8, 0x99, 0xaa, + 0x69, 0x20, 0x98, 0x53, 0x29, 0xe0, 0x0f, 0xb7, 0x0b, 0x57, 0x3c, 0xe2, 0x86, 0x85, 0xf1, 0x4f, 0xaf, 0x66, 0xa7, + 0x82, 0xca, 0xc0, 0xcd, 0xf8, 0x4f, 0x4f, 0xb0, 0x53, 0x58, 0x2b, 0x20, 0x2b, 0xfc, 0xe9, 0xe5, 0x8f, 0xbc, 0x5f, + 0xf1, 0x3f, 0xbd, 0xea, 0x91, 0xf7, 0x11, 0xe7, 0xe5, 0x4f, 0x24, 0x75, 0x42, 0x54, 0x97, 0x3f, 0x09, 0x53, 0x6c, + 0x95, 0xe6, 0xaf, 0x48, 0xe1, 0x13, 0x7c, 0x06, 0xbe, 0xc3, 0x55, 0xb8, 0x35, 0xbf, 0xc1, 0x63, 0xc7, 0x62, 0xdb, + 0xa5, 0xbe, 0x80, 0x72, 0x04, 0x16, 0x91, 0xdb, 0x6f, 0x57, 0xf6, 0xab, 0x85, 0x51, 0xc6, 0xd8, 0x7d, 0xc9, 0x4a, + 0x94, 0xce, 0xfa, 0xfd, 0x42, 0x0a, 0x46, 0x76, 0x61, 0x8d, 0xf6, 0x28, 0x55, 0xaf, 0xbe, 0x0d, 0xeb, 0x28, 0x49, + 0xf3, 0x3b, 0x19, 0x7d, 0x24, 0xc3, 0x8e, 0xf4, 0x95, 0x94, 0x68, 0xaf, 0x55, 0x58, 0x8e, 0x66, 0xbf, 0x2e, 0x39, + 0x50, 0x5e, 0xb7, 0x82, 0xf2, 0x55, 0x13, 0x40, 0xaf, 0x54, 0xfb, 0x0c, 0xb4, 0x82, 0xc2, 0x52, 0x79, 0xb0, 0x12, + 0xe7, 0xa2, 0xcf, 0x8a, 0xc3, 0x41, 0x5d, 0x0c, 0x09, 0x05, 0xaa, 0xc4, 0x49, 0x68, 0xc4, 0x73, 0xb8, 0x10, 0x8a, + 0xeb, 0x1c, 0x63, 0x2b, 0x72, 0xe0, 0x40, 0x86, 0x1f, 0x10, 0x78, 0x2f, 0xfb, 0x57, 0x30, 0x18, 0x26, 0xb8, 0x91, + 0x51, 0x27, 0xe7, 0xec, 0x4f, 0x0c, 0xcc, 0xa0, 0x9e, 0xd4, 0xee, 0xb3, 0x7b, 0x15, 0xd8, 0x0b, 0x67, 0x40, 0x7b, + 0x37, 0x46, 0x3f, 0xab, 0x62, 0xed, 0xa4, 0x7f, 0x2a, 0xd6, 0x90, 0x4c, 0x87, 0xc5, 0xd1, 0x36, 0x0d, 0x8f, 0xe4, + 0xc9, 0x71, 0xbc, 0xe9, 0x1f, 0x0e, 0x63, 0xfc, 0x38, 0xca, 0xaf, 0x2d, 0xe0, 0x55, 0xdc, 0x42, 0x1a, 0x8b, 0x14, + 0xbd, 0x03, 0x31, 0x87, 0xa2, 0x97, 0xec, 0xb7, 0x8c, 0x97, 0x13, 0x41, 0x29, 0x49, 0x6c, 0x78, 0x47, 0x7a, 0x9a, + 0xd6, 0xa3, 0xad, 0x0c, 0xd8, 0xaf, 0x47, 0x3b, 0xfa, 0x0b, 0x14, 0x8f, 0x16, 0xfe, 0x92, 0xfe, 0x2e, 0xee, 0xe6, + 0x9e, 0xf3, 0x4d, 0xe3, 0x3b, 0xe2, 0x02, 0xc5, 0x9a, 0xdd, 0x5f, 0xd3, 0xd2, 0x59, 0x07, 0x82, 0x03, 0xde, 0x62, + 0x17, 0xed, 0xfb, 0x8d, 0xeb, 0xf4, 0xb4, 0xff, 0xd6, 0xad, 0x51, 0xbe, 0xf7, 0x4f, 0x89, 0x72, 0xb0, 0x7f, 0xe5, + 0xa2, 0xf9, 0xdb, 0x4f, 0x19, 0x92, 0x0a, 0xcd, 0x0d, 0xb6, 0x93, 0x2d, 0xc2, 0xda, 0x18, 0x07, 0x15, 0xbb, 0x2b, + 0xc3, 0x08, 0x18, 0xd4, 0xb1, 0xff, 0xd1, 0x67, 0xd3, 0x86, 0xec, 0x03, 0x40, 0xe5, 0x2a, 0x04, 0xec, 0x01, 0x38, + 0xd1, 0x08, 0x37, 0xc0, 0xad, 0x46, 0x4b, 0x3a, 0xa8, 0xdb, 0x82, 0x81, 0x68, 0x09, 0x1b, 0x79, 0xdb, 0xd5, 0xe9, + 0x2b, 0xc2, 0x87, 0xda, 0x49, 0xe9, 0x50, 0xfe, 0xea, 0x39, 0xfb, 0x9f, 0x1d, 0xd6, 0xd4, 0x94, 0x1b, 0xc0, 0xcc, + 0x59, 0x89, 0xbc, 0x42, 0xe8, 0x14, 0xf9, 0xbd, 0xaa, 0x2b, 0x31, 0x5c, 0xd6, 0xa2, 0xec, 0xcc, 0x6e, 0x9d, 0xe8, + 0x9d, 0x53, 0x50, 0x4b, 0x65, 0x83, 0x9c, 0xa4, 0xda, 0x7c, 0x64, 0xad, 0xa0, 0x44, 0x5d, 0xa3, 0xc0, 0xf1, 0x29, + 0xd7, 0xee, 0xff, 0x9d, 0x33, 0x41, 0xcd, 0x36, 0xaa, 0xfb, 0x2b, 0xfd, 0x54, 0xd5, 0x24, 0x16, 0xe0, 0x72, 0x92, + 0xe6, 0x1d, 0x8f, 0xb0, 0xfa, 0xc7, 0xc9, 0x52, 0x04, 0x7a, 0x15, 0xd1, 0xae, 0x04, 0x24, 0x68, 0x27, 0x67, 0xa1, + 0x22, 0x50, 0xa0, 0xaf, 0x7f, 0xbf, 0x49, 0xb3, 0x58, 0xae, 0x66, 0x7b, 0x98, 0x28, 0x8b, 0xf5, 0x10, 0x41, 0xce, + 0x4c, 0x1d, 0xec, 0xf7, 0x34, 0xa3, 0x59, 0x78, 0x65, 0x4a, 0x70, 0x29, 0xae, 0xa2, 0x22, 0x07, 0x9f, 0x43, 0x7c, + 0xe1, 0x53, 0x21, 0x37, 0x88, 0x68, 0xfa, 0xbd, 0x44, 0xb5, 0x23, 0x05, 0x72, 0x28, 0xf9, 0x09, 0xf1, 0x97, 0xac, + 0x8d, 0x71, 0xbf, 0x74, 0xaa, 0xfd, 0x52, 0x21, 0xb8, 0xff, 0x6c, 0x8b, 0x8d, 0x2a, 0x4f, 0xf4, 0xe8, 0x53, 0xac, + 0xff, 0xc9, 0x02, 0x4a, 0x75, 0xdf, 0x06, 0xa7, 0xe2, 0x51, 0xb8, 0xa9, 0x8b, 0x1b, 0x84, 0x16, 0x28, 0x47, 0x55, + 0xb1, 0x29, 0x23, 0xe2, 0x84, 0xdd, 0xd4, 0x45, 0x4f, 0x73, 0xa0, 0x53, 0x87, 0xa5, 0x89, 0x3c, 0x11, 0xda, 0x2d, + 0xe8, 0x9e, 0xe6, 0x58, 0x89, 0x17, 0xb2, 0x74, 0x90, 0x75, 0x22, 0x4d, 0xa8, 0xdc, 0xd5, 0x55, 0x47, 0xa5, 0x52, + 0x37, 0xbc, 0x4e, 0x35, 0xe3, 0xef, 0xd2, 0xfc, 0x89, 0x65, 0xbf, 0x6e, 0xfd, 0x56, 0xab, 0xbd, 0xb1, 0x7a, 0x54, + 0xb2, 0xe6, 0x38, 0x9b, 0x90, 0x94, 0x3e, 0x61, 0xbb, 0x99, 0x74, 0xad, 0x03, 0x4f, 0x82, 0xcb, 0xa1, 0x27, 0xa0, + 0x62, 0xd0, 0xc4, 0xdb, 0x5d, 0xa0, 0x1e, 0x81, 0x67, 0xa0, 0x7c, 0xa2, 0xd6, 0x01, 0x3f, 0xaf, 0xb5, 0x3c, 0x65, + 0x84, 0x61, 0xb5, 0xb3, 0x68, 0x39, 0x38, 0xef, 0x14, 0x81, 0x6b, 0x57, 0x02, 0xcf, 0x87, 0xea, 0xbd, 0x10, 0x30, + 0xdc, 0x3f, 0x15, 0x2a, 0x9b, 0xdd, 0x0c, 0xe7, 0x51, 0xe3, 0xf4, 0x40, 0x7b, 0xdb, 0xb5, 0x1e, 0xea, 0x5d, 0xb7, + 0x73, 0x5b, 0xe9, 0xde, 0xaf, 0x9d, 0x4c, 0xba, 0x80, 0xd6, 0xe6, 0xb3, 0xef, 0xec, 0x4a, 0xeb, 0xa6, 0xe7, 0xec, + 0xc1, 0xd6, 0x2d, 0xd1, 0xb9, 0x20, 0x9a, 0xfc, 0x7e, 0xe0, 0x59, 0xdb, 0x8e, 0x7e, 0x9b, 0x76, 0x6c, 0x73, 0x0f, + 0x75, 0xaf, 0xa0, 0xd6, 0x1b, 0x9a, 0xf7, 0xcf, 0x5c, 0xdb, 0x8e, 0xaf, 0x7e, 0x5d, 0x77, 0xb8, 0xce, 0x9b, 0xe0, + 0xb8, 0xe9, 0xda, 0x56, 0x3b, 0xfb, 0xb9, 0xbb, 0xb7, 0x16, 0x51, 0x98, 0x65, 0x3f, 0x16, 0xc5, 0x1f, 0x95, 0xbe, + 0x23, 0xd0, 0xd1, 0x9d, 0x17, 0x75, 0xba, 0xdc, 0x7d, 0x20, 0x8c, 0x27, 0xaf, 0x3e, 0x22, 0xba, 0xf5, 0x7d, 0xe6, + 0x7e, 0x05, 0xb8, 0x11, 0xdc, 0x41, 0xb4, 0x77, 0x4b, 0x7d, 0x52, 0xab, 0xaf, 0xf5, 0xda, 0x79, 0x7a, 0x7e, 0xd3, + 0xb9, 0xfd, 0xee, 0x9b, 0xa3, 0xad, 0xf7, 0xb8, 0xb0, 0x56, 0x96, 0x9e, 0xaa, 0x82, 0xbd, 0x59, 0x9e, 0xaa, 0x82, + 0xc9, 0x03, 0xaf, 0xd9, 0x2f, 0x68, 0x70, 0xa5, 0xa3, 0x8d, 0xf7, 0x44, 0x0d, 0xdc, 0xa2, 0xb0, 0x74, 0xf8, 0x25, + 0x37, 0x93, 0x97, 0xb8, 0xbf, 0x54, 0xe4, 0x62, 0xdf, 0x39, 0xa3, 0x3b, 0x33, 0xeb, 0x5e, 0x55, 0xb8, 0x5a, 0x90, + 0xab, 0x03, 0x5b, 0xcb, 0x2e, 0x0e, 0x37, 0x2c, 0xa2, 0x00, 0x81, 0x98, 0x5e, 0xa9, 0xb5, 0x3f, 0xa2, 0x41, 0xc8, + 0x07, 0x03, 0xbf, 0xc0, 0x60, 0x55, 0xa0, 0xf0, 0x81, 0x22, 0xf9, 0x2b, 0x4f, 0xc0, 0x2e, 0x9e, 0x01, 0xba, 0x15, + 0x9b, 0x15, 0x23, 0x44, 0xc8, 0x64, 0x39, 0xab, 0xe9, 0x0c, 0xf2, 0xa9, 0x2f, 0xbe, 0xb1, 0x55, 0xa7, 0xf3, 0xb6, + 0xa6, 0xca, 0xa9, 0x43, 0xa1, 0xbb, 0x9b, 0xba, 0x73, 0xeb, 0x22, 0x4f, 0x1d, 0x42, 0xae, 0x54, 0xac, 0xc4, 0x34, + 0xd4, 0x3c, 0x49, 0x33, 0xea, 0x2f, 0xf6, 0x7e, 0xaf, 0x51, 0x38, 0xe5, 0x4f, 0xc7, 0xa0, 0x0a, 0x57, 0x35, 0xc4, + 0xb1, 0x54, 0xc5, 0x23, 0x1b, 0x04, 0x9a, 0x57, 0xb7, 0x2a, 0x69, 0x42, 0x26, 0x37, 0xc2, 0xa7, 0x26, 0xa5, 0x3c, + 0x4d, 0x9b, 0xb4, 0x52, 0xa4, 0x0e, 0x3e, 0xa8, 0x53, 0x8d, 0xe7, 0x66, 0x75, 0x0d, 0x60, 0xc6, 0xf9, 0x15, 0xbf, + 0x54, 0x5c, 0x46, 0x6d, 0x65, 0x26, 0xed, 0x4f, 0x8e, 0xc6, 0x46, 0x5d, 0x4e, 0x1b, 0x65, 0x84, 0x95, 0xd2, 0x9c, + 0x14, 0xcb, 0xf1, 0xfc, 0x03, 0x06, 0x6b, 0x9e, 0xc0, 0x0e, 0x26, 0x2a, 0xe5, 0x7d, 0x04, 0xc4, 0xd7, 0x49, 0x7a, + 0x97, 0x40, 0x8a, 0xf4, 0x2f, 0x5d, 0x72, 0x97, 0xb1, 0x81, 0x18, 0xb3, 0x62, 0x66, 0xf4, 0x3f, 0xb8, 0x4b, 0xfa, + 0x93, 0x10, 0x00, 0x37, 0xd1, 0x14, 0x3a, 0x75, 0x9e, 0x5c, 0xe4, 0xc1, 0xf2, 0xc2, 0x43, 0x2b, 0x46, 0x3c, 0xf8, + 0xeb, 0x75, 0x88, 0x20, 0xe6, 0x98, 0xe2, 0xe9, 0x17, 0x46, 0x7f, 0x09, 0x2e, 0x31, 0x82, 0xd0, 0xdd, 0x3b, 0x87, + 0x21, 0xdc, 0xec, 0x41, 0x06, 0xf5, 0x87, 0x3a, 0x24, 0x6a, 0xf8, 0x63, 0xe5, 0x41, 0xff, 0xd7, 0x99, 0xb0, 0xd4, + 0x7e, 0x7a, 0x3a, 0x80, 0x0a, 0xde, 0x57, 0xbc, 0x8d, 0x88, 0xef, 0x13, 0x3f, 0x8b, 0x07, 0x9b, 0x67, 0x1b, 0xb0, + 0xd6, 0x3d, 0xc9, 0x8d, 0x75, 0x95, 0xb0, 0x81, 0x80, 0xaf, 0x51, 0xd4, 0x9e, 0xd7, 0x6e, 0xf7, 0xe0, 0xaf, 0xfe, + 0x45, 0xc8, 0x80, 0x89, 0xd3, 0xf7, 0x99, 0x93, 0x35, 0xba, 0xc8, 0x64, 0xfa, 0xd0, 0x49, 0xdf, 0xe8, 0x74, 0xdf, + 0x09, 0xff, 0xa8, 0x98, 0xc5, 0x87, 0x5b, 0xfa, 0x4a, 0x93, 0xe2, 0x0e, 0x58, 0xd9, 0x3c, 0x2a, 0x08, 0x75, 0x2e, + 0xa2, 0xaf, 0x4c, 0xf9, 0x96, 0x50, 0xb3, 0x6f, 0x2c, 0x29, 0xa5, 0x7b, 0x0d, 0xbd, 0x4e, 0x6b, 0xfd, 0x36, 0x4a, + 0x30, 0x26, 0x3a, 0x9e, 0xbc, 0x8c, 0xc7, 0xca, 0xfb, 0x78, 0xdc, 0x48, 0x85, 0x3c, 0x00, 0x11, 0xa8, 0x18, 0x7f, + 0xba, 0xf2, 0xe4, 0xa4, 0x17, 0xc6, 0xab, 0x50, 0x0a, 0x0a, 0x03, 0xba, 0x02, 0x29, 0xe0, 0x51, 0x7b, 0xa2, 0xb3, + 0xb0, 0x4b, 0xb8, 0x47, 0x37, 0x01, 0x63, 0x7d, 0xfe, 0x11, 0xd0, 0xdc, 0x85, 0x3b, 0xbc, 0x18, 0xa0, 0x36, 0xf5, + 0xea, 0xee, 0xe3, 0x5a, 0x9d, 0xc3, 0x21, 0x38, 0x58, 0x0d, 0x22, 0x38, 0x9d, 0x4f, 0x1d, 0xcd, 0xb2, 0x00, 0x95, + 0x93, 0xe5, 0x46, 0xde, 0x3c, 0x5a, 0xf4, 0xea, 0xbe, 0xb7, 0x4c, 0xcb, 0xaa, 0x0e, 0x32, 0x96, 0x85, 0x15, 0xe0, + 0xea, 0xd0, 0xfa, 0x41, 0xb8, 0x2c, 0x9c, 0x3f, 0x10, 0x82, 0xd8, 0xbd, 0xda, 0x96, 0x3c, 0x57, 0x73, 0xf8, 0xd9, + 0x73, 0xb6, 0xe6, 0x12, 0x75, 0xd2, 0x99, 0x08, 0x40, 0xec, 0xa9, 0x59, 0x45, 0xd7, 0x40, 0x52, 0xa7, 0x59, 0x45, + 0xd7, 0xd4, 0x6c, 0x63, 0x1c, 0xc8, 0x47, 0xab, 0x14, 0xb0, 0xef, 0xa6, 0xe3, 0x60, 0xf5, 0x2c, 0x96, 0xd7, 0xa1, + 0xbb, 0x67, 0x1b, 0xe5, 0x33, 0xa8, 0x5b, 0x6d, 0x8c, 0x89, 0xed, 0xe6, 0xcb, 0xb9, 0x7e, 0x3b, 0x58, 0xfa, 0x76, + 0xd0, 0x9c, 0x53, 0xf6, 0x9d, 0x2e, 0x7b, 0x65, 0x97, 0x4d, 0x3d, 0x77, 0x54, 0xb4, 0x1a, 0x03, 0x7a, 0x03, 0x0b, + 0xd6, 0xe7, 0x22, 0xcd, 0x56, 0xa5, 0x2a, 0x01, 0x2f, 0x8c, 0x15, 0xbb, 0xf3, 0x1b, 0x99, 0x21, 0x09, 0xf3, 0x38, + 0x13, 0x6f, 0xe9, 0x5e, 0x0b, 0x93, 0xe3, 0x58, 0x24, 0x53, 0x42, 0xa7, 0x74, 0x67, 0x1b, 0x3a, 0x57, 0x61, 0x14, + 0xd1, 0x5a, 0x49, 0xa5, 0x91, 0xc0, 0xd4, 0x0c, 0x50, 0x32, 0x57, 0xe0, 0x94, 0x2e, 0xf7, 0xbf, 0x23, 0x31, 0xce, + 0x7c, 0x51, 0x32, 0x03, 0xba, 0xe5, 0xd7, 0xc5, 0xba, 0x95, 0x22, 0x23, 0xcc, 0x9b, 0xe3, 0xf6, 0xba, 0x3e, 0x04, + 0x72, 0xb5, 0xec, 0x51, 0x34, 0x0e, 0x0a, 0x1d, 0x2e, 0x55, 0x02, 0xec, 0x8b, 0xc4, 0xcf, 0x08, 0x5b, 0xda, 0x03, + 0xb9, 0x3d, 0x3a, 0x13, 0xe6, 0x9c, 0x93, 0xb2, 0xec, 0x5c, 0x9a, 0xc1, 0xe5, 0xc4, 0x95, 0xe0, 0x22, 0xbd, 0x6d, + 0x4f, 0x93, 0x96, 0xb6, 0x8f, 0x0d, 0xe7, 0x68, 0x68, 0x1b, 0x74, 0xc7, 0xfe, 0xd0, 0x5c, 0x2c, 0x62, 0xeb, 0x62, + 0x31, 0xec, 0xcc, 0x7e, 0xb4, 0x58, 0x80, 0x1c, 0x00, 0x8e, 0xba, 0x0d, 0x1f, 0xb3, 0x25, 0x70, 0x5a, 0x4d, 0xb3, + 0xa9, 0xb7, 0xe1, 0xd5, 0x33, 0xd5, 0xd3, 0x4b, 0x9e, 0x3f, 0x13, 0x66, 0x2c, 0x36, 0x3c, 0x7f, 0x66, 0x1d, 0x39, + 0xd5, 0x33, 0xa1, 0x44, 0xeb, 0x02, 0x9a, 0x81, 0xd7, 0x14, 0x30, 0x62, 0xc9, 0x64, 0x4a, 0x15, 0x79, 0xdc, 0x9b, + 0x6e, 0xd4, 0xe0, 0x05, 0x85, 0x43, 0x20, 0xa5, 0xd3, 0x2f, 0x9e, 0x33, 0xfd, 0xde, 0xc5, 0xf3, 0x0e, 0x59, 0xdb, + 0x30, 0x5d, 0x6e, 0x86, 0xc9, 0xa0, 0xf4, 0x9f, 0x99, 0x89, 0x71, 0x61, 0x4d, 0x12, 0x40, 0xfc, 0x1b, 0xfb, 0x1d, + 0x52, 0xb8, 0x79, 0x7f, 0x39, 0x8c, 0x1f, 0x79, 0x3f, 0x46, 0xf6, 0x24, 0xcd, 0x10, 0x6b, 0x26, 0x15, 0x72, 0xf7, + 0xd5, 0xfa, 0xc7, 0xc4, 0x6e, 0xb2, 0x07, 0x16, 0x80, 0xd8, 0x9a, 0xb6, 0xba, 0xe5, 0xfd, 0xbe, 0x67, 0x8a, 0x00, + 0x3f, 0x28, 0xff, 0xe8, 0xce, 0x90, 0x0c, 0xca, 0xae, 0x1b, 0x42, 0x3c, 0x28, 0x9b, 0xa6, 0xbd, 0xde, 0xf6, 0xce, + 0x3c, 0x56, 0xd7, 0x69, 0x67, 0x71, 0xb5, 0xc8, 0x20, 0xad, 0x3e, 0x64, 0xc7, 0x99, 0x7d, 0x76, 0xb4, 0x54, 0xba, + 0xdf, 0x87, 0x88, 0xb8, 0xa3, 0xac, 0xed, 0xb7, 0x5b, 0x70, 0x0d, 0x47, 0x83, 0xd0, 0x95, 0xbd, 0x5d, 0x46, 0x1b, + 0x17, 0xe2, 0xb8, 0x67, 0x3a, 0x5f, 0xf0, 0xe5, 0x51, 0xda, 0x79, 0x70, 0xaa, 0x27, 0xfa, 0xdc, 0x74, 0x57, 0x99, + 0x5c, 0xeb, 0xb0, 0x1a, 0x83, 0xda, 0x2c, 0x6c, 0xe1, 0x2e, 0x6c, 0xa3, 0x83, 0xd6, 0xbe, 0x2c, 0xf8, 0xa7, 0x0c, + 0xc0, 0x97, 0x9e, 0x2d, 0xdb, 0x5e, 0x93, 0x56, 0xaf, 0x65, 0x14, 0x62, 0x4b, 0xdb, 0xab, 0x4f, 0x47, 0xf9, 0xb8, + 0x39, 0xa1, 0xb8, 0x90, 0xa3, 0xfc, 0xe8, 0x35, 0x44, 0x5d, 0xeb, 0x3a, 0x2e, 0x16, 0x1d, 0x6e, 0x5c, 0x75, 0xdb, + 0x8d, 0xeb, 0x07, 0xc4, 0x5b, 0xa3, 0x4d, 0x0a, 0xb5, 0x32, 0x76, 0x04, 0x2f, 0xcb, 0x87, 0x43, 0x26, 0x86, 0x43, + 0x09, 0x99, 0xfa, 0xd8, 0xbd, 0xa1, 0x69, 0x9f, 0x9f, 0xb6, 0x7e, 0xc4, 0x52, 0xe3, 0x28, 0x36, 0xbc, 0xd3, 0x77, + 0x1e, 0x5b, 0xe3, 0x4a, 0xbe, 0x0c, 0x66, 0xbb, 0x82, 0x6a, 0x6b, 0xbc, 0x61, 0x2f, 0xe7, 0xdf, 0x57, 0x52, 0xc9, + 0xdf, 0xfe, 0x0c, 0xd7, 0xf0, 0xd6, 0x96, 0x0e, 0x9a, 0x6a, 0x96, 0xb3, 0x5c, 0xdf, 0x0b, 0x8e, 0x3f, 0xee, 0x5e, + 0x11, 0x0c, 0x7e, 0x4f, 0x47, 0x41, 0x2e, 0x96, 0x6a, 0x0d, 0x28, 0x48, 0x47, 0x76, 0x4c, 0x65, 0x81, 0x61, 0x00, + 0x6f, 0xc8, 0x00, 0x79, 0x4c, 0xe1, 0x6e, 0xa8, 0xf0, 0xc2, 0x5f, 0x2a, 0xb2, 0x4b, 0x60, 0x5b, 0x33, 0x3e, 0x66, + 0xb8, 0x83, 0x90, 0x7f, 0x04, 0xbb, 0x63, 0x2b, 0x76, 0xcb, 0x16, 0x0c, 0xc9, 0xc6, 0x71, 0x18, 0x63, 0x3e, 0x9e, + 0xc4, 0x57, 0x62, 0x12, 0x0f, 0x78, 0x84, 0x8e, 0x11, 0x6b, 0x5e, 0xcf, 0x62, 0x39, 0x80, 0xec, 0x8e, 0x2b, 0x1d, + 0x10, 0x42, 0x63, 0x43, 0x4b, 0x5e, 0x17, 0x06, 0x17, 0x3b, 0xf6, 0x19, 0x89, 0x64, 0x1c, 0x82, 0x45, 0xab, 0x1a, + 0x58, 0x98, 0xd8, 0x2d, 0x2f, 0x66, 0xab, 0x39, 0xfe, 0x73, 0x38, 0x20, 0x00, 0x76, 0xb0, 0x6f, 0xd8, 0x5d, 0x84, + 0x48, 0x6f, 0x0b, 0x7e, 0x67, 0x79, 0xba, 0xb0, 0x7b, 0xfe, 0x96, 0x8f, 0xd9, 0xf9, 0x0f, 0x1e, 0x44, 0xce, 0x9e, + 0x7f, 0x04, 0x34, 0xc4, 0x7b, 0x7e, 0x9b, 0x7a, 0x15, 0xbb, 0x25, 0x0a, 0xc2, 0x5b, 0x70, 0x06, 0xba, 0x87, 0x08, + 0xd8, 0xb7, 0x7c, 0x81, 0xb1, 0x62, 0x67, 0xe9, 0xd2, 0xc3, 0x8c, 0x50, 0x7b, 0x3a, 0x5f, 0xd6, 0x6a, 0x12, 0x6e, + 0xae, 0x96, 0x93, 0xc1, 0x60, 0xe3, 0xef, 0xf8, 0x1a, 0xf8, 0x60, 0xce, 0x7f, 0xf0, 0x76, 0x54, 0x2e, 0xfc, 0xe7, + 0x75, 0x96, 0xbc, 0xf3, 0xd9, 0xdb, 0x01, 0x5f, 0x00, 0xde, 0x12, 0x3a, 0x70, 0xdd, 0xfb, 0x4c, 0xe2, 0xb5, 0xbd, + 0xd5, 0xd7, 0x08, 0x24, 0xf2, 0x05, 0x60, 0xc4, 0xc4, 0xfc, 0x7e, 0x0b, 0x11, 0x18, 0x09, 0xf8, 0xb6, 0x6a, 0x8f, + 0xf8, 0x2d, 0x37, 0x80, 0x5f, 0x99, 0xcf, 0x1e, 0x78, 0xa8, 0x7f, 0x26, 0x3e, 0xbb, 0xe1, 0xef, 0xf9, 0xb5, 0x27, + 0x25, 0xe9, 0x72, 0xf6, 0x7e, 0x0e, 0xd7, 0x43, 0x29, 0x4f, 0x87, 0xf4, 0xb3, 0x31, 0x18, 0x40, 0x28, 0x64, 0xde, + 0x78, 0xc0, 0x9a, 0x14, 0xe2, 0x5f, 0xc0, 0xb7, 0xa3, 0x84, 0xcd, 0x1b, 0x6f, 0xeb, 0x6b, 0x79, 0xf3, 0xc6, 0x7b, + 0xf0, 0x29, 0x0a, 0xb0, 0x0a, 0x4a, 0x59, 0x60, 0x15, 0x84, 0x8d, 0x36, 0xc2, 0x18, 0xb8, 0x7a, 0xd7, 0x18, 0xea, + 0x7a, 0x8e, 0xd8, 0xb6, 0xd2, 0x77, 0xe1, 0x3b, 0xc8, 0x80, 0x0f, 0x5e, 0x17, 0x25, 0xd1, 0xe7, 0xd4, 0x14, 0x49, + 0xeb, 0x9e, 0xfb, 0xad, 0x75, 0x47, 0x6b, 0x4a, 0x7d, 0xe4, 0x6a, 0x7c, 0x38, 0xd4, 0xd7, 0x42, 0x8b, 0x04, 0x53, + 0xd0, 0xb8, 0x06, 0x6d, 0x01, 0x82, 0x3e, 0x0f, 0x90, 0xb5, 0xa4, 0x58, 0xf0, 0xed, 0xaf, 0x10, 0x83, 0x57, 0xa6, + 0x77, 0x2e, 0x57, 0x19, 0x09, 0xdb, 0x0b, 0xbf, 0x1c, 0xd6, 0xfe, 0xc4, 0xa9, 0x85, 0xa5, 0xd5, 0x1c, 0xd4, 0xcf, + 0x6c, 0x39, 0x4e, 0x55, 0xed, 0xdf, 0x92, 0xa4, 0xda, 0x55, 0x5a, 0x4e, 0xef, 0xed, 0x9b, 0x2e, 0x13, 0x6c, 0xec, + 0x07, 0x54, 0x1d, 0x59, 0x0d, 0xbb, 0x2f, 0xd4, 0x17, 0x3d, 0x25, 0x13, 0x9a, 0x8f, 0x2a, 0x9a, 0x67, 0xf7, 0x9b, + 0x1d, 0xf5, 0x9f, 0x5e, 0x0e, 0x45, 0x80, 0x64, 0x95, 0x16, 0x4b, 0x91, 0xb3, 0xb1, 0x1f, 0x0f, 0x93, 0x4c, 0x85, + 0x17, 0xa4, 0xa3, 0xbb, 0xdf, 0xb8, 0xbf, 0xe5, 0x06, 0xb2, 0x42, 0xab, 0x36, 0x18, 0x2b, 0x45, 0xcb, 0x60, 0x7d, + 0x35, 0xee, 0xf7, 0xc5, 0xd5, 0x78, 0x2a, 0x82, 0x1a, 0x88, 0x8b, 0xc4, 0xf5, 0x78, 0x5a, 0x13, 0x4b, 0x6a, 0x57, + 0x60, 0x8c, 0x1e, 0x57, 0x45, 0xed, 0x53, 0x5f, 0x43, 0x28, 0x52, 0xad, 0x99, 0x63, 0x8d, 0x1b, 0x23, 0xe2, 0x0e, + 0x2b, 0xd7, 0x4e, 0xed, 0x75, 0x00, 0x96, 0x57, 0xe3, 0x82, 0xb0, 0x49, 0x8e, 0x9d, 0x0b, 0x58, 0x8d, 0x86, 0x54, + 0xbb, 0xe1, 0xd6, 0xcb, 0xce, 0x6f, 0x1e, 0x27, 0xb6, 0x36, 0xc2, 0x2d, 0x05, 0x94, 0x51, 0x7e, 0x63, 0x39, 0x61, + 0x77, 0xaa, 0x77, 0xa4, 0x6a, 0x47, 0x9c, 0xb8, 0x80, 0xe5, 0x86, 0xa7, 0x56, 0xdf, 0xc4, 0xe0, 0x44, 0xa8, 0x5a, + 0xe9, 0x78, 0xed, 0x47, 0xdc, 0xaf, 0xee, 0xeb, 0x5e, 0x09, 0x7e, 0x12, 0xf2, 0xfa, 0x2d, 0xef, 0x00, 0xb0, 0xe2, + 0x43, 0x5e, 0x4c, 0x0b, 0x47, 0xeb, 0x32, 0x28, 0x03, 0x44, 0x68, 0x06, 0x40, 0x27, 0x57, 0x07, 0x51, 0x1a, 0xb8, + 0xe2, 0x0e, 0x11, 0x7e, 0x1a, 0x3d, 0xcb, 0xaf, 0xc3, 0x67, 0xd5, 0x34, 0xbc, 0xc8, 0x83, 0xe8, 0xa2, 0x0a, 0xa2, + 0x67, 0xd5, 0x55, 0xf8, 0x2c, 0x9f, 0x46, 0x17, 0x79, 0x10, 0x5e, 0x54, 0x8d, 0x7d, 0xd7, 0xee, 0xee, 0x09, 0x79, + 0xdb, 0xd5, 0x1f, 0x39, 0x57, 0xf6, 0x94, 0xe9, 0xf9, 0x79, 0xad, 0x57, 0x6a, 0xb7, 0xb9, 0x5e, 0xa3, 0x66, 0xea, + 0xa3, 0xec, 0x6f, 0xb6, 0xb1, 0xf0, 0x68, 0x0e, 0xa1, 0xcf, 0x48, 0x8b, 0xb9, 0xc7, 0xb9, 0xde, 0xec, 0x49, 0x61, + 0x60, 0xc4, 0xa4, 0x92, 0x91, 0xd3, 0x0b, 0x5c, 0x84, 0x2a, 0xc4, 0xb0, 0x96, 0xae, 0xf6, 0x59, 0x97, 0xde, 0x40, + 0x5d, 0x53, 0xec, 0x6b, 0xc8, 0xc0, 0x8b, 0xa6, 0x97, 0xc1, 0x18, 0x90, 0x23, 0xf0, 0x8e, 0xcf, 0x96, 0x70, 0x60, + 0xae, 0x01, 0xfa, 0xe6, 0x51, 0x5f, 0x97, 0x3b, 0xbe, 0x56, 0x7d, 0x33, 0x5d, 0x8f, 0x94, 0xf2, 0x63, 0xc5, 0xef, + 0x2e, 0x9e, 0xb3, 0x5b, 0xae, 0x51, 0x51, 0x7e, 0xd1, 0x8b, 0xf5, 0x1e, 0xb8, 0xea, 0x7e, 0x81, 0xdb, 0x2c, 0x1e, + 0xbb, 0xf2, 0x80, 0x65, 0x5b, 0xf6, 0xc0, 0x6e, 0xd8, 0x7b, 0xf6, 0x84, 0xbd, 0x61, 0xef, 0xd8, 0x4f, 0xa8, 0xda, + 0x50, 0x42, 0x9e, 0xbf, 0xe0, 0xb7, 0xd2, 0xf4, 0x28, 0x51, 0xc9, 0x1e, 0x6c, 0x33, 0xcd, 0x70, 0xc3, 0xde, 0xf3, + 0xc5, 0x70, 0xc5, 0xde, 0x40, 0x36, 0x94, 0x89, 0x07, 0x2b, 0xf6, 0x13, 0x57, 0x20, 0x66, 0xfa, 0x2c, 0x2c, 0x2d, + 0x51, 0xd1, 0x94, 0x89, 0x32, 0xf4, 0x1b, 0x8e, 0x2f, 0xb2, 0x9f, 0xb0, 0x08, 0xf9, 0x99, 0xe1, 0x8a, 0x3d, 0xf0, + 0xc5, 0x60, 0xc5, 0xde, 0x6b, 0x03, 0xd1, 0x60, 0xe3, 0x96, 0x46, 0x48, 0x56, 0xba, 0x2c, 0x29, 0x4d, 0x6f, 0xed, + 0x6b, 0xe0, 0x86, 0xdd, 0x60, 0xed, 0x9e, 0x60, 0xd1, 0x28, 0xf0, 0x0f, 0x56, 0xec, 0x1d, 0x97, 0x00, 0x6a, 0x6e, + 0x79, 0xd2, 0x2b, 0x54, 0x17, 0x48, 0xf7, 0x83, 0x27, 0x9c, 0x5e, 0x64, 0xef, 0xb0, 0x0c, 0xfa, 0xca, 0x70, 0xc5, + 0xb6, 0x58, 0xbb, 0x1b, 0x63, 0xd9, 0xb2, 0xaa, 0x27, 0x11, 0x81, 0x51, 0x50, 0x29, 0x2d, 0xff, 0x46, 0x2c, 0x9b, + 0xba, 0x69, 0x50, 0x1b, 0xfa, 0xf3, 0xc1, 0xe8, 0x2f, 0xbe, 0x7e, 0xf7, 0x83, 0x57, 0xea, 0x6b, 0xef, 0x2f, 0x8e, + 0x6b, 0x65, 0x89, 0xae, 0x95, 0xbf, 0xf2, 0x72, 0xf6, 0xcb, 0x7c, 0xa2, 0x6b, 0x49, 0x3b, 0x0c, 0xf9, 0x9a, 0xce, + 0x7e, 0xe9, 0x70, 0xb6, 0xfc, 0xd5, 0xf7, 0x1b, 0xd3, 0xc5, 0xea, 0xb3, 0xba, 0x77, 0x1f, 0x06, 0x9b, 0xc6, 0xa9, + 0xf7, 0xee, 0x74, 0xbd, 0xb1, 0x99, 0xb5, 0xf6, 0xcc, 0xfc, 0x1f, 0xae, 0xf4, 0x16, 0x87, 0xee, 0x86, 0x6f, 0x87, + 0x1b, 0x7b, 0x14, 0xe4, 0xf7, 0xa5, 0xd2, 0x38, 0xab, 0xf9, 0x0b, 0xaf, 0x53, 0x8a, 0x05, 0x44, 0xa3, 0x4f, 0x46, + 0x12, 0xba, 0x64, 0x26, 0x9e, 0x21, 0xbe, 0xc8, 0x00, 0x99, 0x0b, 0x44, 0xb3, 0x7b, 0x3e, 0x9e, 0xdc, 0x5f, 0xc5, + 0x93, 0xfb, 0x01, 0xff, 0x64, 0x5a, 0xd0, 0x5e, 0x6c, 0xf7, 0x3e, 0xfb, 0x95, 0x17, 0xf6, 0x72, 0xfc, 0xc5, 0x67, + 0x5f, 0x84, 0xbb, 0x42, 0x7f, 0xf1, 0xd9, 0x3b, 0xc1, 0x7f, 0x1d, 0x69, 0xa2, 0x0c, 0xf6, 0xae, 0xe6, 0xbf, 0x8e, + 0x90, 0xf1, 0x83, 0x7d, 0x16, 0xfc, 0x0b, 0xf8, 0x7e, 0x57, 0x09, 0x5a, 0xc5, 0x3f, 0xd7, 0xea, 0xe7, 0x7b, 0x19, + 0x97, 0x03, 0x6f, 0x42, 0x2b, 0xe8, 0xcd, 0xdb, 0x5a, 0xfe, 0x24, 0x1e, 0x8e, 0x54, 0x3d, 0x35, 0xfc, 0xb3, 0x58, + 0xcc, 0xa2, 0x3e, 0x4a, 0xa7, 0xf2, 0x26, 0x6f, 0x79, 0x26, 0xad, 0xcb, 0xf7, 0x10, 0x0a, 0xfc, 0xd6, 0x86, 0x28, + 0xd8, 0x71, 0xdc, 0x08, 0xde, 0xb2, 0x77, 0xc2, 0x67, 0xd9, 0x74, 0xcb, 0x6f, 0xf8, 0x13, 0xfe, 0x8e, 0xef, 0x82, + 0x07, 0xfe, 0x9e, 0xbf, 0xe1, 0x3f, 0xf1, 0x1d, 0x5b, 0x4a, 0xb4, 0xd3, 0x7a, 0x7b, 0x19, 0x6c, 0x59, 0xbd, 0xbb, + 0x0c, 0x1e, 0x58, 0xbd, 0x7d, 0x1e, 0xdc, 0xb0, 0x7a, 0xf7, 0x3c, 0x78, 0xcf, 0xb6, 0x97, 0xc1, 0x13, 0xb6, 0xbb, + 0x0c, 0xde, 0xb0, 0xed, 0xf3, 0xe0, 0x1d, 0xdb, 0x3d, 0x0f, 0x7e, 0x92, 0x18, 0x0f, 0xef, 0x84, 0xe4, 0x38, 0x79, + 0x57, 0x33, 0xc3, 0xa7, 0x1b, 0x7c, 0x16, 0xd6, 0x2f, 0xaa, 0x63, 0xf0, 0xb9, 0x66, 0xba, 0xc5, 0x81, 0x10, 0x4c, + 0xb7, 0x37, 0xb8, 0xa5, 0x27, 0xa6, 0x55, 0x41, 0x2a, 0x58, 0x57, 0x3b, 0x83, 0x45, 0xdd, 0xb4, 0xce, 0x64, 0xc7, + 0x2f, 0x31, 0xee, 0xf0, 0x4b, 0x5c, 0xb0, 0x65, 0xd3, 0xe9, 0xa4, 0x73, 0xfa, 0x24, 0xd0, 0x9b, 0xbf, 0xde, 0xf5, + 0x2b, 0xe9, 0x3b, 0x53, 0x34, 0x3c, 0x57, 0x5a, 0xe3, 0xd6, 0x4e, 0x1f, 0x5a, 0x3b, 0x3d, 0x93, 0x2a, 0xb4, 0x88, + 0x45, 0x65, 0x51, 0x55, 0xc8, 0x24, 0x1e, 0x64, 0x5a, 0x9f, 0x96, 0x30, 0x52, 0x64, 0x02, 0x1a, 0x7d, 0x41, 0xc7, + 0x40, 0x4e, 0x16, 0x05, 0xb6, 0xe4, 0x9b, 0x41, 0xc2, 0xd6, 0x3c, 0x9e, 0x0e, 0x93, 0x60, 0xc9, 0xee, 0xf8, 0xb0, + 0x5b, 0x20, 0x58, 0xa9, 0x00, 0x26, 0x7d, 0x71, 0x6a, 0xef, 0xeb, 0xbc, 0xb7, 0x4a, 0xe3, 0x38, 0x13, 0xa8, 0x6c, + 0xab, 0xf4, 0x06, 0xbf, 0x75, 0xf6, 0xf3, 0xb5, 0xda, 0xdf, 0x41, 0x52, 0xf8, 0x15, 0x18, 0x76, 0x88, 0xf0, 0x0e, + 0x2a, 0x8c, 0x3c, 0x4b, 0x66, 0xd1, 0x57, 0xf6, 0x96, 0xbe, 0x35, 0xdb, 0xf4, 0x7f, 0x5a, 0x04, 0xed, 0xe3, 0xb2, + 0xf3, 0x3f, 0x99, 0x57, 0x7f, 0xeb, 0x78, 0x75, 0xe3, 0x4f, 0x1e, 0xf8, 0x27, 0x0c, 0x4b, 0xc0, 0x44, 0xb6, 0xe3, + 0x9f, 0x46, 0xdb, 0xc6, 0x29, 0x4f, 0xee, 0xe3, 0xff, 0x57, 0x0a, 0xb4, 0x77, 0xf2, 0xca, 0xde, 0x11, 0xb7, 0xbc, + 0x63, 0x1f, 0x5f, 0x5a, 0x1b, 0xa2, 0x81, 0x26, 0xf9, 0xc4, 0xdd, 0x68, 0x68, 0xd8, 0x10, 0x7f, 0xe1, 0xd5, 0xec, + 0xd3, 0x7c, 0xb2, 0xe5, 0xc7, 0xdb, 0xe1, 0xa7, 0x8e, 0xed, 0xf0, 0x17, 0x7f, 0xb0, 0x6c, 0xbe, 0xd6, 0xab, 0x9d, + 0xdb, 0xb8, 0x53, 0xe9, 0x1d, 0x3f, 0xde, 0xc4, 0x87, 0xff, 0x71, 0xa5, 0x77, 0xdf, 0x5c, 0x69, 0xbb, 0xca, 0xdd, + 0x9d, 0x6f, 0x3a, 0xbe, 0x91, 0xb5, 0xc6, 0x38, 0x33, 0xa3, 0x59, 0xfc, 0x89, 0x66, 0x69, 0x10, 0x59, 0x0a, 0xc5, + 0x9f, 0xcc, 0xb4, 0x53, 0x77, 0xaa, 0xac, 0xee, 0x96, 0x6f, 0x71, 0x8f, 0xbf, 0xe5, 0x63, 0xb6, 0x30, 0x9e, 0x9a, + 0xb7, 0x57, 0x8b, 0xc9, 0x60, 0x70, 0xeb, 0xef, 0xef, 0x79, 0x38, 0xbb, 0x9d, 0xb3, 0xb7, 0xfc, 0x9e, 0x16, 0xd3, + 0x44, 0x35, 0xbd, 0x78, 0x4c, 0xf0, 0xba, 0xf5, 0xfd, 0x89, 0xc5, 0xff, 0x6a, 0x5f, 0x34, 0x6f, 0xfd, 0x81, 0xb4, + 0x46, 0xcb, 0x5d, 0xfd, 0xfd, 0xe3, 0x8a, 0x89, 0x5b, 0x10, 0x2f, 0xde, 0xdb, 0x9a, 0x86, 0x37, 0xfc, 0xa3, 0xf7, + 0xd6, 0x9f, 0xbe, 0xd5, 0x31, 0x37, 0x13, 0x75, 0x24, 0xbd, 0xb9, 0x78, 0xce, 0x7e, 0xe5, 0x9f, 0xe4, 0x71, 0xf2, + 0x45, 0xc8, 0x49, 0x7b, 0x83, 0xdc, 0x4d, 0x74, 0x4a, 0xbc, 0x73, 0x13, 0x09, 0x0b, 0x02, 0x61, 0x38, 0x6a, 0xfe, + 0x30, 0x29, 0xa7, 0xde, 0x0e, 0xb8, 0x5d, 0xb9, 0xad, 0x7f, 0xbe, 0xe5, 0x9c, 0x2f, 0x86, 0x97, 0xd3, 0x77, 0xdd, + 0x2e, 0x3d, 0x2a, 0x9a, 0x4d, 0x05, 0xba, 0xdd, 0x62, 0xec, 0xd5, 0xc9, 0xcc, 0x32, 0x97, 0x7c, 0xe9, 0x5d, 0x6d, + 0x66, 0x1e, 0xd3, 0xfb, 0xcd, 0x34, 0x43, 0x22, 0x5f, 0x20, 0x64, 0x3a, 0x1c, 0xee, 0xce, 0xb1, 0x3c, 0x3e, 0x7c, + 0xf3, 0xec, 0xc9, 0xe0, 0x09, 0x46, 0x6e, 0x59, 0xd1, 0x20, 0xef, 0xf8, 0x30, 0xab, 0x5b, 0xb7, 0x8d, 0x8b, 0xe7, + 0xc3, 0x5f, 0x20, 0x6f, 0xd0, 0xf5, 0xd0, 0x14, 0xd1, 0x2a, 0xbf, 0xa3, 0xe8, 0x13, 0x25, 0x07, 0x1d, 0x4f, 0xa0, + 0x76, 0x48, 0x81, 0xfb, 0xee, 0x19, 0x07, 0xfd, 0x06, 0x96, 0xda, 0xef, 0x9f, 0x7f, 0x22, 0x1e, 0x69, 0x18, 0xef, + 0xef, 0xc3, 0xe8, 0x8f, 0xb8, 0x2c, 0xd6, 0x70, 0xba, 0x0e, 0xe0, 0x73, 0xcf, 0xf4, 0xed, 0xeb, 0xce, 0xf7, 0xfd, + 0xc0, 0xdb, 0xf2, 0x1b, 0xf6, 0x8e, 0x7b, 0x97, 0xc3, 0x37, 0xfe, 0xb3, 0x27, 0x20, 0x3a, 0xc1, 0xb8, 0x7c, 0xc6, + 0x48, 0xd8, 0x8e, 0x62, 0xd4, 0x2a, 0xfc, 0x5c, 0x43, 0x88, 0xd6, 0x27, 0x64, 0xec, 0x82, 0xf4, 0x0f, 0x0a, 0xd0, + 0x4f, 0x08, 0xac, 0x26, 0xa9, 0x51, 0x60, 0x12, 0xdf, 0xd6, 0x90, 0x40, 0x0a, 0x16, 0x08, 0xbd, 0x81, 0xe2, 0x53, + 0xc1, 0xdf, 0x0d, 0x3f, 0x93, 0xe4, 0xb7, 0xa8, 0xf9, 0x18, 0xfe, 0x86, 0xa1, 0x99, 0x54, 0x0f, 0x69, 0x1d, 0x25, + 0xde, 0x4f, 0xfe, 0x3e, 0x0a, 0x2b, 0xa1, 0x8e, 0x85, 0x20, 0x15, 0x43, 0x2e, 0xc4, 0xc5, 0xf3, 0xc9, 0x6d, 0x29, + 0xc2, 0x3f, 0x26, 0xf8, 0x4c, 0x2e, 0x34, 0xf9, 0x8c, 0x9e, 0x34, 0xf2, 0xfd, 0x07, 0xf9, 0xbe, 0xec, 0xd4, 0x60, + 0x51, 0x0f, 0xf9, 0x6d, 0xed, 0xbe, 0x2f, 0xa7, 0x04, 0x3d, 0xb2, 0x1f, 0xd0, 0x14, 0x0c, 0xd4, 0x04, 0xa4, 0x0c, + 0xc1, 0x2d, 0x5c, 0xf5, 0x3d, 0x55, 0x90, 0x2f, 0xbf, 0xf7, 0x59, 0xc8, 0x70, 0x95, 0x05, 0x21, 0xc9, 0xa5, 0x42, + 0x0a, 0x1b, 0xb7, 0xf5, 0xe0, 0xb3, 0xc6, 0x24, 0x91, 0x90, 0x53, 0x02, 0x92, 0xa4, 0xbd, 0x81, 0x24, 0x11, 0xd3, + 0x7f, 0xb8, 0x4e, 0x9a, 0x66, 0x25, 0xa5, 0x1b, 0xe2, 0x54, 0x7d, 0x8b, 0x34, 0x67, 0xc1, 0x7b, 0x06, 0x4b, 0x47, + 0x8a, 0x15, 0xef, 0x8c, 0xc1, 0x58, 0x07, 0x0b, 0xdd, 0xc9, 0xe2, 0x7e, 0x95, 0x84, 0x69, 0x24, 0xaa, 0x7c, 0x11, + 0xf2, 0xe7, 0xbf, 0x94, 0xf8, 0xa3, 0xb7, 0x34, 0x10, 0x81, 0xe0, 0x07, 0x68, 0x3d, 0x60, 0x8d, 0x07, 0x3f, 0xb1, + 0xba, 0x0c, 0xf3, 0x2a, 0xa3, 0xf2, 0x66, 0x3b, 0xb6, 0x9d, 0x33, 0x55, 0xb5, 0xe0, 0xb3, 0x30, 0xb4, 0x68, 0x67, + 0xab, 0xe6, 0xe4, 0x36, 0x6f, 0xf0, 0x9d, 0x49, 0x12, 0xa9, 0xa5, 0x24, 0xd2, 0x56, 0xd7, 0xa7, 0x4b, 0xaf, 0x5b, + 0x54, 0xd0, 0x18, 0x01, 0x7a, 0x49, 0xba, 0xab, 0x7c, 0x42, 0xf1, 0xca, 0x6a, 0x58, 0x0d, 0x2f, 0x1d, 0x8a, 0x30, + 0xd6, 0xde, 0x5c, 0xc9, 0xb3, 0x3b, 0xb0, 0x1e, 0xa1, 0xb5, 0xab, 0x52, 0x87, 0xb0, 0xfd, 0x44, 0xef, 0x39, 0x95, + 0xfa, 0x1b, 0x50, 0x05, 0x4e, 0x1d, 0x0d, 0xf5, 0x51, 0x3b, 0x85, 0x6c, 0xe7, 0xde, 0x92, 0xa0, 0x72, 0x25, 0x37, + 0x55, 0x5a, 0x94, 0x52, 0xa6, 0x7c, 0x2d, 0xb3, 0x95, 0xdd, 0x27, 0x03, 0x88, 0x67, 0x83, 0x02, 0xc9, 0x45, 0x6d, + 0x35, 0x07, 0xe9, 0xa3, 0x59, 0xe2, 0x58, 0x3b, 0x28, 0xbc, 0xac, 0x02, 0x33, 0x97, 0xb9, 0x5c, 0x0e, 0x0a, 0x96, + 0xeb, 0xad, 0x66, 0x9a, 0xa9, 0xbe, 0xc8, 0xed, 0x6d, 0xc6, 0xcb, 0xf4, 0xdf, 0x2c, 0x19, 0xf0, 0xe8, 0xe2, 0xb9, + 0x1f, 0x40, 0x9a, 0xe4, 0x75, 0x80, 0x24, 0xd8, 0x1c, 0xec, 0x62, 0x87, 0x61, 0xab, 0x58, 0xd9, 0x93, 0xa7, 0xcb, + 0x1d, 0x9a, 0x72, 0x09, 0x23, 0x39, 0x31, 0x97, 0x52, 0xdf, 0x97, 0x54, 0x37, 0x14, 0x9c, 0x6c, 0x9a, 0x80, 0x52, + 0x40, 0xbb, 0x05, 0xff, 0x85, 0x4f, 0x0d, 0x9d, 0x16, 0x60, 0xa9, 0xed, 0x06, 0xfc, 0x17, 0xfa, 0xc5, 0xf6, 0x11, + 0xf5, 0x03, 0xf3, 0x60, 0x6f, 0xd6, 0x56, 0xc6, 0x80, 0x88, 0xc4, 0x15, 0xe4, 0x91, 0xe0, 0x07, 0xc5, 0x9e, 0x2e, + 0x13, 0x07, 0xce, 0x14, 0x17, 0x4b, 0xa9, 0xcd, 0xcc, 0x6b, 0xbf, 0xa5, 0x26, 0xde, 0x44, 0x49, 0x54, 0xd8, 0x0e, + 0x69, 0xf4, 0x92, 0x32, 0xa6, 0x0a, 0x36, 0x44, 0xf7, 0x75, 0x13, 0x4c, 0x81, 0x37, 0x55, 0x15, 0x10, 0xa1, 0xf6, + 0x22, 0xcb, 0xf3, 0x9b, 0x2e, 0xb0, 0xba, 0xe0, 0x63, 0x63, 0x9a, 0x5d, 0xb0, 0x92, 0xab, 0x99, 0xf4, 0x99, 0xb7, + 0x03, 0x2d, 0xe4, 0x5d, 0x5e, 0x16, 0xad, 0xd0, 0xf5, 0x20, 0x5a, 0xf8, 0x7b, 0xcd, 0xf1, 0xe8, 0xd9, 0xb6, 0x9a, + 0xda, 0xec, 0x6b, 0x2d, 0x16, 0xc8, 0x40, 0x34, 0xf4, 0x85, 0x9c, 0x51, 0xb8, 0xab, 0x34, 0x57, 0xab, 0x7d, 0x55, + 0x06, 0x09, 0x4c, 0x04, 0x59, 0xcb, 0xc2, 0x7b, 0x74, 0xaf, 0x1e, 0x69, 0x5e, 0x49, 0xf0, 0xcc, 0xc5, 0x5f, 0x00, + 0x08, 0xe5, 0x49, 0x42, 0x0e, 0xc8, 0x01, 0xfc, 0x2d, 0x45, 0xa9, 0x34, 0xc0, 0x3f, 0xab, 0xcb, 0xb1, 0xad, 0xef, + 0xef, 0xb4, 0x8a, 0xc1, 0xf5, 0xe7, 0xeb, 0xae, 0x67, 0xed, 0x10, 0xe7, 0xca, 0x56, 0xaf, 0x2d, 0xd3, 0x3c, 0x46, + 0xea, 0x1a, 0x80, 0x3b, 0x91, 0x1e, 0x81, 0x48, 0x66, 0xa2, 0x41, 0xce, 0xae, 0xf9, 0x78, 0x2a, 0x1e, 0x93, 0xf6, + 0x2a, 0xdf, 0x37, 0x17, 0xfa, 0x60, 0x8c, 0x7d, 0x0b, 0x1a, 0xc4, 0x47, 0xab, 0xad, 0x15, 0x88, 0xf5, 0x56, 0xa9, + 0x0f, 0xdd, 0x18, 0x05, 0x1d, 0x3c, 0xe2, 0x46, 0x2e, 0x38, 0xb6, 0xbb, 0xb6, 0x9e, 0xd2, 0x57, 0x00, 0xe6, 0x3a, + 0x50, 0xc9, 0x30, 0x48, 0x9d, 0x27, 0x0a, 0x93, 0xfc, 0x3c, 0x21, 0x09, 0x11, 0xd5, 0xd9, 0x72, 0x94, 0x72, 0xd3, + 0x02, 0x2e, 0x33, 0x32, 0xc0, 0x6c, 0xd2, 0xac, 0x9f, 0x5c, 0xbe, 0x04, 0xa9, 0x34, 0x44, 0x70, 0xc3, 0xf6, 0x92, + 0xd1, 0xad, 0xa3, 0x6e, 0x50, 0x25, 0x99, 0xeb, 0x37, 0xb7, 0xb3, 0x48, 0x99, 0x37, 0x1f, 0x61, 0xac, 0xc9, 0x87, + 0xb0, 0x4e, 0xf0, 0xdb, 0x00, 0x95, 0xf4, 0xa9, 0xf0, 0xa2, 0x11, 0x40, 0xa8, 0xef, 0x54, 0x19, 0x9f, 0x0a, 0x2f, + 0x1b, 0x6d, 0x59, 0x46, 0x29, 0x54, 0x17, 0xcc, 0x6e, 0x4d, 0x17, 0xa2, 0x5b, 0x55, 0x03, 0x6d, 0xe0, 0xda, 0x75, + 0xa0, 0x80, 0x86, 0x6a, 0x57, 0x6e, 0x58, 0x00, 0x56, 0x33, 0x11, 0x18, 0x2e, 0xff, 0x3e, 0x7f, 0xa9, 0x62, 0x78, + 0xfa, 0xfd, 0xd0, 0xdb, 0x6f, 0x83, 0x68, 0xb4, 0xbd, 0x64, 0xbb, 0x20, 0x1a, 0xed, 0x2e, 0x1b, 0x46, 0xbf, 0x9f, + 0xd3, 0xef, 0xe7, 0x0d, 0xe8, 0x48, 0x84, 0x09, 0xb3, 0xd7, 0x6f, 0xd4, 0xf2, 0x95, 0x5a, 0xbf, 0x53, 0xcb, 0x97, + 0x6a, 0x78, 0x6b, 0x4f, 0x12, 0x41, 0x64, 0xa9, 0x6a, 0x1e, 0x24, 0x45, 0xaa, 0xa5, 0xcb, 0x31, 0x5a, 0x8c, 0xa8, + 0xa5, 0xac, 0x39, 0xd6, 0x89, 0xb4, 0x73, 0x50, 0x32, 0xc0, 0xd1, 0xe2, 0xaa, 0xc6, 0x74, 0xb3, 0xa2, 0x25, 0x10, + 0x23, 0xac, 0x6c, 0xcb, 0xc5, 0x4d, 0xea, 0xa3, 0x73, 0xf2, 0x6d, 0xab, 0x94, 0x6f, 0x5b, 0xc1, 0xf3, 0xaf, 0x28, + 0x94, 0x4b, 0xae, 0x5d, 0xcb, 0xa6, 0x85, 0x52, 0x28, 0xe3, 0x1a, 0x6c, 0xed, 0x9b, 0xc0, 0x90, 0xf9, 0x48, 0x51, + 0x63, 0x7b, 0xd1, 0x28, 0x87, 0x20, 0x5b, 0x07, 0xa3, 0x4e, 0x59, 0xb0, 0xf8, 0x76, 0x87, 0x0c, 0x64, 0xa0, 0xa3, + 0xaa, 0x8d, 0x57, 0x3b, 0x2b, 0xfd, 0x61, 0x79, 0xf1, 0x9c, 0x25, 0x56, 0x3a, 0xf9, 0x4d, 0x85, 0xfe, 0x20, 0x44, + 0xdf, 0x94, 0x0d, 0x07, 0x2f, 0xba, 0xd8, 0xca, 0x80, 0x78, 0xc3, 0xf4, 0xde, 0xc6, 0x4a, 0x96, 0xbb, 0xa6, 0x7c, + 0x31, 0xe3, 0x09, 0xc7, 0xd1, 0x97, 0xab, 0x45, 0x58, 0xab, 0x45, 0x76, 0x02, 0x3c, 0xb4, 0x56, 0x4b, 0x21, 0x57, + 0x8b, 0x70, 0x66, 0xba, 0x50, 0x33, 0x3d, 0x03, 0xcd, 0xa3, 0x50, 0xb3, 0x3c, 0x01, 0x2c, 0x78, 0x61, 0x66, 0xb8, + 0x30, 0x33, 0x1c, 0x87, 0xd4, 0x38, 0x3d, 0xe8, 0xbd, 0xce, 0x3d, 0xb7, 0xdc, 0x8d, 0x4e, 0xc3, 0xbc, 0x1d, 0x6d, + 0x30, 0xc7, 0x07, 0xe1, 0x04, 0xe2, 0x03, 0x4b, 0x04, 0xe8, 0xd1, 0xb0, 0x3a, 0x6a, 0xa8, 0x1c, 0xc5, 0x97, 0x05, + 0x20, 0x59, 0x12, 0x80, 0xe4, 0x5e, 0x8d, 0x73, 0x69, 0xf9, 0x75, 0x95, 0x84, 0x1c, 0x91, 0xf1, 0x52, 0xda, 0xdd, + 0x13, 0x5e, 0x8e, 0x8c, 0xd0, 0x3c, 0x59, 0xa4, 0x5e, 0xce, 0x32, 0x36, 0x46, 0xe0, 0xa2, 0xd0, 0x6f, 0xaa, 0x7e, + 0x3f, 0x2d, 0xbd, 0x9c, 0xda, 0xf9, 0x09, 0xfc, 0x2d, 0x4f, 0x9d, 0x45, 0x8e, 0x90, 0x57, 0x23, 0x93, 0xb0, 0xbc, + 0x54, 0xea, 0xe9, 0x4b, 0x98, 0x41, 0xdd, 0xbd, 0x51, 0x00, 0xae, 0x45, 0x2e, 0x9d, 0x6a, 0x4b, 0xb8, 0x32, 0xe5, + 0x06, 0xfb, 0x3c, 0xe4, 0x39, 0x09, 0xa1, 0x12, 0x79, 0xa4, 0xb0, 0xee, 0xdb, 0x17, 0xcf, 0x27, 0xae, 0x0f, 0x8b, + 0x8d, 0x46, 0x70, 0x38, 0x00, 0xcc, 0xc1, 0xd4, 0x8b, 0x06, 0xbc, 0x54, 0x73, 0xe6, 0xa3, 0x97, 0x13, 0x36, 0x06, + 0xa8, 0x29, 0x06, 0x4e, 0x59, 0xcf, 0xe4, 0x23, 0xe3, 0x5b, 0xe6, 0xfb, 0x01, 0xbe, 0x5b, 0x17, 0x12, 0xf2, 0x41, + 0xa1, 0x12, 0x64, 0x0a, 0x95, 0x20, 0x31, 0xa8, 0x04, 0xb1, 0x41, 0x25, 0xd8, 0x34, 0x7c, 0x2d, 0x95, 0xb7, 0x11, + 0x70, 0x44, 0xf8, 0xd0, 0xb3, 0xb0, 0xb1, 0x42, 0xf1, 0x6c, 0xcc, 0xc6, 0xac, 0x50, 0x3b, 0x4f, 0x2e, 0xa7, 0x62, + 0x67, 0x31, 0xd6, 0x4d, 0x64, 0x99, 0x78, 0x21, 0x41, 0xc7, 0x39, 0x17, 0x12, 0x75, 0xf5, 0x73, 0xef, 0x25, 0x19, + 0x4b, 0xe6, 0x0d, 0x8d, 0x1a, 0xcc, 0xcb, 0xae, 0x03, 0x98, 0x96, 0x7c, 0x5b, 0xd0, 0x60, 0x3a, 0x55, 0x1e, 0x91, + 0x26, 0x41, 0xed, 0x5c, 0x26, 0x45, 0x4e, 0x08, 0x93, 0xa0, 0x57, 0x82, 0xdf, 0x48, 0x68, 0xff, 0xaf, 0x7a, 0xbe, + 0x03, 0x06, 0x13, 0xad, 0x92, 0x2f, 0x60, 0xb5, 0xcc, 0xf9, 0x0b, 0xe9, 0x89, 0x8d, 0xf8, 0x8b, 0x65, 0x1a, 0x8f, + 0xbe, 0xb0, 0x21, 0xe2, 0x59, 0xbd, 0x40, 0xd3, 0x12, 0xd4, 0x01, 0x1e, 0xd1, 0x5f, 0xa3, 0x2f, 0x86, 0x37, 0xa5, + 0xab, 0x91, 0xba, 0x66, 0xe7, 0x9c, 0x7f, 0xa9, 0x0d, 0x11, 0x32, 0xa6, 0x4d, 0x81, 0x64, 0x40, 0x20, 0xc9, 0x40, + 0x00, 0x60, 0x6a, 0x3a, 0xb3, 0x57, 0x00, 0xd1, 0x40, 0x00, 0x8f, 0xf3, 0x8e, 0xc7, 0x8f, 0xf4, 0x57, 0x71, 0xdc, + 0x3b, 0x4d, 0xc3, 0xf6, 0x5f, 0x80, 0xa6, 0x18, 0xca, 0xf1, 0x7c, 0xa7, 0x20, 0xd9, 0xa3, 0x94, 0xa5, 0xab, 0x26, + 0xb2, 0x43, 0xb1, 0x3e, 0xcd, 0x29, 0x0b, 0x69, 0x5b, 0x8e, 0xd1, 0x16, 0xeb, 0xc7, 0xc8, 0x7b, 0x73, 0xa3, 0x22, + 0x1f, 0xf4, 0xe0, 0xf6, 0xf6, 0xe6, 0x55, 0x8f, 0xd9, 0x24, 0x2b, 0x16, 0xb9, 0x8a, 0x38, 0x71, 0x5a, 0x87, 0x1c, + 0x30, 0x20, 0x27, 0x21, 0x30, 0x8d, 0x71, 0xa9, 0x40, 0x07, 0x25, 0xcb, 0x79, 0x0d, 0xd4, 0xb2, 0x88, 0xac, 0x01, + 0xa2, 0x9a, 0xe6, 0x5f, 0x35, 0xe4, 0x27, 0x55, 0x73, 0x4a, 0xa1, 0xf6, 0x15, 0x0f, 0xab, 0xd3, 0x27, 0x56, 0x6d, + 0x62, 0xac, 0x7f, 0xad, 0x3d, 0x41, 0x5b, 0x49, 0x03, 0xf1, 0x9d, 0xaf, 0xd2, 0x3b, 0x0a, 0xdd, 0x71, 0x66, 0xe2, + 0xa9, 0x0a, 0x8c, 0x7d, 0x6b, 0x47, 0x50, 0x38, 0x34, 0x5d, 0x07, 0x1c, 0xa6, 0xd1, 0x09, 0x8b, 0x7f, 0x4a, 0xc7, + 0xc9, 0x8b, 0x5a, 0x21, 0x92, 0xfc, 0x43, 0xb8, 0x30, 0x24, 0x16, 0xe4, 0x25, 0xa1, 0x8e, 0xc8, 0x88, 0xd5, 0xa8, + 0x58, 0x0b, 0x15, 0x15, 0xa7, 0x78, 0xbc, 0x55, 0x50, 0x5c, 0x8a, 0x52, 0xa5, 0x54, 0xe4, 0x46, 0xa5, 0x80, 0x58, + 0x36, 0xf0, 0x6e, 0x01, 0x07, 0x40, 0xd0, 0x59, 0xee, 0xd6, 0xb6, 0xbb, 0x8d, 0xcc, 0x67, 0xa6, 0x79, 0x5a, 0x7d, + 0x50, 0x7f, 0xbf, 0x5f, 0x62, 0x6c, 0x8d, 0xa7, 0xbf, 0x6f, 0xd3, 0x82, 0x9b, 0xbf, 0x61, 0x88, 0xee, 0x00, 0x11, + 0xb3, 0xb4, 0x87, 0x42, 0x16, 0x4c, 0x58, 0x86, 0xaa, 0x3c, 0xe5, 0xa8, 0x97, 0x4f, 0x6e, 0x01, 0x42, 0x0d, 0xfd, + 0xda, 0xe8, 0x54, 0x57, 0x25, 0x08, 0xdf, 0x77, 0x85, 0x7a, 0x6c, 0x0e, 0x78, 0x32, 0x00, 0xfe, 0x8a, 0xbc, 0xd6, + 0x63, 0xfb, 0x07, 0xbd, 0x51, 0x6f, 0x80, 0x20, 0x3a, 0xe7, 0x85, 0x7f, 0xc4, 0xb9, 0x4e, 0xfd, 0x19, 0x17, 0x82, + 0xf8, 0xd6, 0x93, 0xf0, 0x5e, 0x9c, 0xa5, 0x71, 0x70, 0xd6, 0x1b, 0x98, 0x8b, 0x40, 0x71, 0x96, 0xe6, 0x67, 0x20, + 0x96, 0x23, 0x26, 0x62, 0xcd, 0xee, 0x00, 0x26, 0xb0, 0xd4, 0x71, 0xc8, 0xaa, 0x63, 0xfb, 0xfd, 0xd7, 0x23, 0x43, + 0x96, 0x8e, 0x30, 0x30, 0xfa, 0x77, 0x05, 0x02, 0x14, 0x2c, 0x33, 0xdb, 0x83, 0x49, 0x57, 0x7b, 0x56, 0xcf, 0x9b, + 0x4d, 0xde, 0xd5, 0x3b, 0x56, 0xd3, 0x72, 0x6a, 0x5a, 0x65, 0x35, 0x6d, 0x92, 0x43, 0xcd, 0x44, 0xbf, 0xaf, 0x41, + 0x51, 0xf3, 0x39, 0x80, 0xb1, 0x61, 0xf2, 0xeb, 0x59, 0x35, 0xef, 0xf7, 0x3d, 0xf9, 0x08, 0x7e, 0x21, 0x5b, 0x99, + 0x5b, 0x63, 0xf9, 0xf4, 0x15, 0x91, 0x98, 0x19, 0x98, 0xa3, 0xbb, 0x23, 0x7c, 0xaf, 0x1b, 0xe1, 0x75, 0xcc, 0x15, + 0x36, 0x13, 0xd3, 0xd7, 0x30, 0x78, 0x9e, 0xf0, 0xc1, 0x45, 0x8e, 0xfe, 0x46, 0x0e, 0x33, 0x85, 0x05, 0x39, 0xf7, + 0x27, 0xaf, 0x11, 0x2f, 0x19, 0xe1, 0x1d, 0x74, 0x3a, 0xe1, 0x41, 0xf6, 0xfb, 0x2b, 0xe8, 0xcc, 0x56, 0x2a, 0x65, + 0xab, 0xa2, 0x32, 0x5d, 0xd7, 0x45, 0x59, 0x41, 0xc7, 0xd2, 0xcf, 0x5b, 0x21, 0x33, 0xeb, 0x67, 0x16, 0xdc, 0xd3, + 0x4a, 0x02, 0x4c, 0xd9, 0xb6, 0x89, 0xda, 0xc0, 0xcb, 0xba, 0xf8, 0x5c, 0xe0, 0xd1, 0x59, 0x7b, 0xbd, 0x11, 0x6a, + 0x9f, 0xf3, 0xd1, 0xba, 0x58, 0x7b, 0xe0, 0x07, 0x33, 0x4b, 0xe7, 0x8a, 0x38, 0x23, 0xf7, 0x47, 0x9f, 0x8b, 0x34, + 0xa7, 0x3c, 0xc0, 0x7d, 0x28, 0xe6, 0xf6, 0x5b, 0x20, 0xfd, 0xd0, 0x5b, 0x20, 0xfb, 0xe8, 0x9c, 0x93, 0xd7, 0x80, + 0x48, 0x87, 0x30, 0xb8, 0x15, 0x09, 0x3a, 0x56, 0x0d, 0x6f, 0x2d, 0xb0, 0xd3, 0x5e, 0x1a, 0xf7, 0xd2, 0xfc, 0x2c, + 0xed, 0xf7, 0x0d, 0x6a, 0x66, 0x8a, 0x70, 0xf0, 0x38, 0x23, 0x17, 0x49, 0x0b, 0xb6, 0x94, 0xf6, 0x5f, 0x0d, 0x1c, + 0x41, 0xc8, 0xdf, 0xff, 0x10, 0xde, 0x13, 0x80, 0xd8, 0xa4, 0x0d, 0xb8, 0xea, 0x31, 0x1d, 0x8d, 0x2d, 0x89, 0x5a, + 0x75, 0x36, 0x40, 0xe2, 0x54, 0x69, 0x3d, 0xe5, 0x66, 0x4d, 0x61, 0x90, 0x2a, 0x0b, 0xf5, 0x1b, 0xeb, 0xc9, 0x64, + 0x95, 0x8b, 0x8c, 0x38, 0x2a, 0xd3, 0x97, 0x9a, 0x11, 0x4c, 0x97, 0x7e, 0xbe, 0x80, 0x25, 0x1b, 0x7f, 0xc4, 0xc9, + 0x5b, 0x02, 0x8e, 0xed, 0xac, 0x5d, 0x55, 0xbb, 0x1c, 0xb7, 0x76, 0x73, 0x80, 0xef, 0xf5, 0x46, 0xa3, 0x91, 0x76, + 0x8e, 0x13, 0x30, 0x54, 0x3d, 0xb5, 0x14, 0x7a, 0xac, 0x56, 0x80, 0xba, 0x1d, 0xb9, 0xcc, 0x92, 0xc1, 0x7c, 0x61, + 0x1c, 0xbf, 0x34, 0x1f, 0x7d, 0xbc, 0x54, 0xd6, 0xae, 0x23, 0xbe, 0xfe, 0x83, 0xac, 0xd6, 0xb7, 0xbc, 0xab, 0x9a, + 0x80, 0x2f, 0xaa, 0x80, 0xd2, 0x6f, 0x78, 0x4f, 0xf6, 0x2e, 0xbe, 0x76, 0x83, 0x5d, 0xf2, 0x2d, 0x6f, 0x51, 0xe7, + 0xf9, 0xca, 0xc1, 0x8d, 0x2a, 0xdd, 0xde, 0x4b, 0x16, 0xb8, 0xf6, 0x8e, 0x9a, 0xc6, 0x7a, 0xe6, 0x47, 0x0f, 0x8b, + 0x90, 0xed, 0x7c, 0xec, 0x7d, 0xd5, 0x3c, 0x3d, 0x6b, 0xe8, 0x4d, 0x6a, 0xe8, 0x63, 0x2f, 0xca, 0xf6, 0xa9, 0x69, + 0x44, 0xaf, 0x61, 0x43, 0x1f, 0x7b, 0x4b, 0x4e, 0x0e, 0x89, 0x00, 0xa7, 0xc6, 0xfc, 0xf1, 0xe1, 0x74, 0x86, 0xbf, + 0x63, 0x40, 0x25, 0x10, 0xf3, 0xe9, 0x31, 0xed, 0x28, 0xc0, 0x8c, 0x2a, 0xbd, 0x7d, 0x7a, 0x60, 0x3b, 0x5e, 0xd6, + 0x43, 0x4b, 0xef, 0x9e, 0x1c, 0xdd, 0x8e, 0x57, 0xd5, 0xf8, 0x52, 0x0e, 0x79, 0x9e, 0xcf, 0x46, 0xa3, 0x91, 0x30, + 0x90, 0xdc, 0x95, 0xde, 0xc0, 0x0a, 0xa4, 0x6d, 0x51, 0x7d, 0x28, 0x97, 0xde, 0x4e, 0x1d, 0xda, 0x95, 0x3f, 0xc9, + 0x0f, 0x87, 0x62, 0x64, 0x8e, 0x71, 0x00, 0x37, 0x29, 0x94, 0x1c, 0x25, 0x6b, 0x09, 0xa2, 0x53, 0x1a, 0x4f, 0x65, + 0xbd, 0xb6, 0x22, 0xf2, 0x6a, 0xc4, 0x79, 0x08, 0x7e, 0xf4, 0x40, 0x2d, 0x7e, 0xad, 0x05, 0xb1, 0xc7, 0x3e, 0x55, + 0x4a, 0x2f, 0x78, 0x55, 0x40, 0x88, 0xd8, 0xdf, 0x0d, 0xb4, 0x83, 0x12, 0x1c, 0x4a, 0xb8, 0x0f, 0x08, 0x0b, 0xfd, + 0xca, 0xcb, 0x67, 0x32, 0x46, 0xb9, 0x37, 0xa8, 0xe6, 0x0c, 0x60, 0x2a, 0x7d, 0x06, 0x7e, 0x97, 0x00, 0x75, 0x8a, + 0x4f, 0xd1, 0xa9, 0xde, 0x3c, 0x6c, 0xba, 0x3e, 0x2d, 0x51, 0x14, 0xd1, 0x9d, 0x9f, 0x8f, 0x01, 0xb1, 0xb3, 0x6b, + 0x33, 0xd2, 0xae, 0xfd, 0x06, 0x0d, 0x56, 0x4a, 0x12, 0xed, 0x9c, 0x12, 0x76, 0x3b, 0x1f, 0xd9, 0xd2, 0x8f, 0x52, + 0x20, 0xe6, 0x8e, 0x13, 0x89, 0xec, 0xc1, 0x46, 0x4e, 0xe0, 0x16, 0xed, 0x1d, 0x1d, 0x80, 0xca, 0x8d, 0x82, 0xfc, + 0x6a, 0x8e, 0xe4, 0x8e, 0xef, 0x7a, 0xdf, 0x0d, 0xea, 0xc1, 0x77, 0xbd, 0xb3, 0x94, 0xe4, 0x8e, 0xf0, 0x4c, 0x4d, + 0x09, 0x11, 0x9f, 0x7d, 0x37, 0xc8, 0x07, 0x78, 0x96, 0x68, 0x91, 0x16, 0x09, 0xd5, 0xea, 0x1a, 0x37, 0xe1, 0x45, + 0x22, 0xb9, 0x87, 0x76, 0x9d, 0x47, 0xc4, 0x02, 0x90, 0xb1, 0xf8, 0x6c, 0xde, 0x50, 0xa8, 0xbb, 0x89, 0xd9, 0xa2, + 0xbb, 0x2c, 0xf6, 0xfb, 0x9b, 0x3c, 0xad, 0x7b, 0x3a, 0x3e, 0x06, 0x5f, 0x90, 0x6a, 0x02, 0x3c, 0xda, 0x5f, 0x99, + 0xe3, 0xd5, 0xab, 0xcd, 0x91, 0xb2, 0x50, 0x25, 0xea, 0xb7, 0x58, 0xcd, 0x7a, 0x08, 0xc3, 0x9d, 0x65, 0xc6, 0xda, + 0x5e, 0xf0, 0x4a, 0xce, 0xaa, 0xd8, 0x2e, 0xc7, 0x57, 0x2c, 0xb5, 0x95, 0x44, 0xe5, 0x68, 0x3d, 0xd6, 0xa6, 0x18, + 0xf9, 0x95, 0x42, 0xa2, 0x2c, 0x3a, 0xb6, 0x16, 0x0a, 0x88, 0x17, 0xa0, 0x2f, 0xd9, 0x99, 0x06, 0x58, 0x6f, 0xf4, + 0x2a, 0x22, 0xb4, 0x7c, 0xa4, 0xc2, 0x9b, 0xdc, 0x54, 0x99, 0x95, 0xcd, 0xa2, 0xdd, 0x4f, 0x15, 0xaf, 0x10, 0xac, + 0xde, 0xa8, 0x3d, 0x0a, 0x50, 0x7b, 0x68, 0xa1, 0x0c, 0x20, 0xa5, 0x69, 0x06, 0x80, 0x0c, 0x00, 0x32, 0x55, 0xc4, + 0x67, 0x02, 0x54, 0xda, 0xea, 0x46, 0x81, 0x13, 0xe9, 0x15, 0xd0, 0x2c, 0xb0, 0xd2, 0x47, 0x0a, 0x32, 0x58, 0x6c, + 0x11, 0x80, 0x95, 0x23, 0x67, 0x98, 0xc6, 0x90, 0x6d, 0x34, 0x71, 0x49, 0x9a, 0xdf, 0x87, 0x59, 0x2a, 0xf1, 0x24, + 0x7e, 0x90, 0x35, 0x46, 0x00, 0x20, 0x7d, 0x9f, 0x5e, 0x14, 0x59, 0x4c, 0x38, 0x70, 0xd6, 0x53, 0x07, 0x45, 0x4d, + 0xce, 0xb5, 0xa6, 0xd5, 0xb3, 0xda, 0xe4, 0x21, 0x0b, 0x74, 0xf6, 0x60, 0x4c, 0x6a, 0xf9, 0x9e, 0x47, 0xf6, 0x57, + 0x8e, 0x67, 0x84, 0xef, 0xba, 0x83, 0x53, 0xff, 0xdd, 0xd4, 0xc0, 0xc4, 0x94, 0x00, 0x6c, 0x0c, 0x8e, 0x26, 0xc4, + 0xef, 0x74, 0x4c, 0xa6, 0x36, 0x29, 0x02, 0x81, 0x87, 0xe0, 0x15, 0x3c, 0x37, 0x5c, 0x6e, 0xb9, 0xb1, 0xb3, 0xc8, + 0xd3, 0x04, 0xe0, 0xc4, 0x0b, 0xbe, 0x05, 0x38, 0x4e, 0xbd, 0x2a, 0x64, 0xcf, 0x9e, 0x8b, 0xe9, 0x6c, 0x1e, 0x3c, + 0x24, 0xb4, 0x7f, 0x31, 0xe1, 0x37, 0xdd, 0x55, 0x72, 0x65, 0x6a, 0xdd, 0x9b, 0xe8, 0x2a, 0x97, 0x3b, 0x7d, 0x5a, + 0x71, 0x0c, 0x73, 0x06, 0xab, 0x80, 0x9c, 0xb3, 0x21, 0xbf, 0x3e, 0x07, 0xc0, 0x96, 0x95, 0xf0, 0x22, 0x7e, 0x1d, + 0xca, 0x6a, 0x01, 0xdc, 0x23, 0xe7, 0x91, 0xf9, 0xe5, 0xab, 0xed, 0x50, 0xce, 0x29, 0x0a, 0x63, 0x39, 0x35, 0x2d, + 0x29, 0x4e, 0x87, 0x9e, 0x82, 0xc9, 0xd4, 0x96, 0xbf, 0xb7, 0x89, 0xcb, 0xec, 0xcd, 0x24, 0x9c, 0xaf, 0x23, 0xdb, + 0xd6, 0xaa, 0x7b, 0xe8, 0x86, 0x60, 0xd0, 0xc7, 0x08, 0x5a, 0x36, 0xd7, 0x77, 0xeb, 0xc1, 0x40, 0x61, 0xfb, 0xd6, + 0x74, 0xd3, 0xa2, 0x53, 0x1c, 0x70, 0x66, 0xad, 0x6b, 0x54, 0xaa, 0x8a, 0x43, 0x2f, 0x79, 0xb7, 0xac, 0xca, 0x2e, + 0x4b, 0x2f, 0x04, 0xa9, 0x51, 0x57, 0x11, 0x22, 0xa5, 0x62, 0x87, 0xf7, 0xe4, 0xd7, 0xc0, 0xc4, 0x33, 0x2b, 0x47, + 0x69, 0x3c, 0x07, 0x98, 0x20, 0x85, 0xbe, 0x29, 0xbf, 0x02, 0xdc, 0xd0, 0x45, 0x14, 0x66, 0x6f, 0xe2, 0x2a, 0xa8, + 0xad, 0xa6, 0xdf, 0x3b, 0x38, 0xb1, 0xe7, 0x75, 0xbf, 0x9f, 0x12, 0x8d, 0x1f, 0x86, 0x5e, 0xe0, 0xdf, 0xe3, 0xe9, + 0xbe, 0x09, 0x52, 0xf3, 0xca, 0x03, 0xbc, 0xa2, 0xcb, 0xad, 0x4d, 0xb9, 0xa2, 0x71, 0x31, 0xaf, 0x11, 0x11, 0x3e, + 0x75, 0x14, 0xdb, 0x6d, 0x7e, 0x9c, 0xda, 0x18, 0x0c, 0x42, 0xb8, 0x6f, 0x65, 0xfc, 0x3e, 0xf1, 0xf2, 0x59, 0x34, + 0x07, 0x45, 0x69, 0xa6, 0x49, 0x42, 0x0a, 0xe9, 0x25, 0x40, 0x1f, 0x0d, 0x42, 0xad, 0xae, 0xfc, 0x23, 0xf1, 0x52, + 0x35, 0xad, 0xcd, 0x53, 0xac, 0x51, 0x20, 0x66, 0xd1, 0xbc, 0x61, 0x19, 0x1d, 0x92, 0xea, 0x72, 0x69, 0x9a, 0xf1, + 0x87, 0xd5, 0x0c, 0xd5, 0x8a, 0xa3, 0x26, 0xa8, 0x51, 0xba, 0x81, 0x0b, 0xe0, 0xdf, 0xe9, 0x8e, 0xa3, 0x1a, 0x45, + 0x8a, 0x06, 0x7c, 0x82, 0xc0, 0xb0, 0x66, 0xf3, 0x84, 0xb5, 0xa6, 0xae, 0x19, 0xfd, 0xbe, 0x8c, 0x13, 0x32, 0x49, + 0x48, 0xce, 0x87, 0xcb, 0xf5, 0x23, 0xa9, 0x2e, 0x80, 0x54, 0xb9, 0x62, 0xb3, 0x5e, 0x6f, 0x0e, 0x18, 0xbd, 0xb0, + 0x7e, 0x61, 0xe3, 0x0a, 0xce, 0x2f, 0x09, 0x73, 0x57, 0xfd, 0x08, 0xb3, 0x0c, 0xaa, 0x80, 0x34, 0x3f, 0x16, 0xbc, + 0x79, 0xee, 0x02, 0x51, 0xbf, 0x1e, 0xa9, 0x0b, 0xca, 0x2c, 0x9d, 0x5b, 0x44, 0x20, 0xe0, 0x35, 0xac, 0x9e, 0x40, + 0xb2, 0x2f, 0x1f, 0xfb, 0x34, 0xa3, 0x40, 0x75, 0x04, 0xa0, 0x6c, 0xd6, 0x0f, 0x61, 0xff, 0x80, 0x70, 0x42, 0xfd, + 0xcd, 0x1b, 0x39, 0x6b, 0x48, 0x1e, 0x48, 0x35, 0xe1, 0x31, 0x9c, 0x1a, 0x0b, 0x7c, 0x69, 0xd1, 0x9b, 0x0a, 0x5e, + 0x13, 0x1c, 0xf7, 0x02, 0xad, 0x7d, 0x0b, 0x38, 0x42, 0x04, 0x97, 0xa1, 0x89, 0xd3, 0xde, 0xae, 0x17, 0x20, 0xa1, + 0xb9, 0x85, 0x73, 0xfd, 0xd6, 0x05, 0x2d, 0x4e, 0x91, 0x93, 0x45, 0x17, 0x18, 0xe8, 0x82, 0xcc, 0x1b, 0xff, 0xaa, + 0x60, 0xe5, 0x02, 0x64, 0x2f, 0x15, 0x2b, 0x89, 0xd8, 0x76, 0xea, 0x8f, 0x52, 0xd9, 0x6f, 0xcf, 0xac, 0x09, 0xfc, + 0x32, 0xb1, 0x5f, 0x22, 0x93, 0x6f, 0x7a, 0x6c, 0xf2, 0x95, 0xb1, 0xd0, 0xa9, 0x65, 0x70, 0x4e, 0x8f, 0x0c, 0xce, + 0xbd, 0x9d, 0x55, 0x9b, 0x10, 0x86, 0x82, 0x24, 0xd0, 0x74, 0xe9, 0x61, 0xdd, 0xf4, 0xe7, 0x27, 0x2d, 0x7e, 0xad, + 0xda, 0xb7, 0xee, 0xc7, 0x21, 0x76, 0xf1, 0xcb, 0xc4, 0x33, 0xec, 0xa3, 0x3e, 0x70, 0x80, 0xc9, 0x88, 0x89, 0xcb, + 0x7e, 0x1f, 0x0a, 0x9b, 0x8d, 0xe7, 0xa3, 0xba, 0xf8, 0xb9, 0x78, 0x00, 0x28, 0x87, 0x0a, 0xec, 0x72, 0x28, 0x43, + 0x19, 0xb1, 0xa9, 0x2d, 0xf7, 0xfc, 0xfe, 0x32, 0xcc, 0x41, 0xde, 0xd1, 0x98, 0x38, 0x67, 0x20, 0x86, 0xc1, 0xd7, + 0xbf, 0x7b, 0xb2, 0x4f, 0x9b, 0xef, 0xce, 0xe0, 0xbb, 0xa3, 0xb3, 0x0f, 0xc8, 0x71, 0x73, 0xb6, 0x2e, 0x8b, 0xfb, + 0x34, 0x16, 0x67, 0xdf, 0x41, 0xea, 0x77, 0x67, 0x45, 0x79, 0xf6, 0x9d, 0xaa, 0xcc, 0x77, 0x67, 0xb4, 0xe0, 0x46, + 0xbf, 0x5b, 0x13, 0xef, 0x9f, 0x95, 0xa6, 0x3d, 0x5b, 0x42, 0x38, 0x96, 0x56, 0x3f, 0x82, 0x12, 0x51, 0x91, 0xa2, + 0xca, 0x50, 0x56, 0x6b, 0xc7, 0x79, 0x9f, 0x68, 0x78, 0x6c, 0x9a, 0x90, 0xb8, 0x5a, 0xc2, 0x3a, 0xd4, 0xb3, 0xd3, + 0x26, 0xd9, 0x71, 0x1e, 0xa8, 0x03, 0x22, 0xe7, 0xd7, 0xf9, 0x68, 0x4b, 0x5f, 0x83, 0x6f, 0x1d, 0x0e, 0xf9, 0x68, + 0x67, 0x7e, 0xfa, 0x64, 0xad, 0x94, 0xc1, 0x46, 0x8a, 0x51, 0x08, 0x89, 0xe2, 0xb6, 0x3d, 0x06, 0xc0, 0xff, 0xfe, + 0xe1, 0x40, 0xbf, 0x77, 0xf2, 0xb7, 0xda, 0x2d, 0xad, 0x7a, 0x7e, 0x68, 0x11, 0x66, 0xbc, 0xaa, 0x0d, 0x3b, 0xdb, + 0x5e, 0x02, 0x4a, 0xef, 0x9b, 0x06, 0x35, 0x45, 0xf4, 0x13, 0x56, 0x13, 0xab, 0x38, 0x2c, 0x48, 0x89, 0x43, 0x0c, + 0xc7, 0x68, 0x87, 0x1e, 0xa7, 0x8b, 0x9a, 0x27, 0xf7, 0x1d, 0x32, 0x6e, 0x7d, 0x1f, 0x90, 0x5c, 0x0a, 0xe7, 0x1f, + 0xbc, 0xd0, 0x60, 0xa2, 0x17, 0x79, 0x55, 0x64, 0x62, 0x24, 0x68, 0x94, 0xdf, 0x90, 0x38, 0x73, 0x86, 0xb5, 0x38, + 0x53, 0x08, 0x61, 0x21, 0xa1, 0x72, 0x17, 0x25, 0xa5, 0x07, 0x67, 0x4f, 0xf6, 0x65, 0xf3, 0x3b, 0x61, 0x42, 0x8c, + 0x16, 0x40, 0x83, 0xb3, 0x6b, 0x97, 0xf7, 0x10, 0x96, 0xb9, 0xf7, 0xfb, 0x9b, 0xbb, 0xbc, 0x80, 0xb8, 0xcc, 0x33, + 0xa9, 0x58, 0x2d, 0xcf, 0x80, 0x26, 0x4f, 0xc4, 0x67, 0x61, 0x25, 0xa7, 0x41, 0xd5, 0x51, 0xac, 0xde, 0xc6, 0x73, + 0x0f, 0x78, 0xbd, 0xdf, 0x27, 0x40, 0xe0, 0xee, 0xb3, 0xd7, 0xca, 0x2d, 0x95, 0xf4, 0xc8, 0x73, 0x0c, 0x91, 0x4c, + 0x80, 0xd7, 0x19, 0x82, 0x23, 0x85, 0xd5, 0x73, 0x13, 0xe4, 0x1f, 0x5f, 0x9f, 0x50, 0x7c, 0xd1, 0x3c, 0x8a, 0x1a, + 0x16, 0xb2, 0x04, 0x8e, 0x87, 0x64, 0x96, 0xcd, 0x91, 0x9a, 0x3c, 0x6d, 0x4f, 0x91, 0x8e, 0x4e, 0x2c, 0xf1, 0xdb, + 0x9a, 0x54, 0x2f, 0x52, 0x61, 0x97, 0xb4, 0xb3, 0x95, 0xb9, 0x17, 0xc2, 0x50, 0x25, 0xdc, 0x7b, 0x55, 0xcf, 0x42, + 0xb9, 0x29, 0x5a, 0x15, 0xb3, 0x87, 0x29, 0x31, 0xc3, 0x14, 0xeb, 0x2f, 0x6c, 0xf8, 0x4d, 0xe2, 0xc5, 0x60, 0xb8, + 0x5e, 0xf2, 0x72, 0xb6, 0x31, 0x0b, 0xe1, 0x70, 0xd8, 0x4c, 0x8a, 0xd9, 0x12, 0x62, 0x5b, 0x97, 0xf3, 0xc3, 0xa1, + 0xab, 0x65, 0x6b, 0xe1, 0xc1, 0x43, 0xd5, 0xc2, 0x4d, 0xc3, 0x72, 0xf8, 0x99, 0xcc, 0x62, 0x6c, 0x5f, 0xe3, 0x33, + 0xfb, 0xf3, 0x45, 0xf7, 0x2c, 0x41, 0xc6, 0x8d, 0x35, 0x70, 0x8d, 0xcd, 0xda, 0x1d, 0xae, 0x46, 0x40, 0xf2, 0xb8, + 0x1b, 0xfd, 0x5d, 0xd9, 0x49, 0x4e, 0x82, 0x84, 0xd1, 0x0a, 0xe1, 0x77, 0xdf, 0xf8, 0x13, 0x2d, 0xf6, 0xa0, 0xdd, + 0xc6, 0x96, 0x10, 0xd5, 0xb4, 0xe7, 0x72, 0xa5, 0x58, 0x9a, 0xb7, 0xd2, 0x86, 0xcc, 0x87, 0xf5, 0xb9, 0x6f, 0xe4, + 0x40, 0xc1, 0x18, 0xf1, 0xd4, 0x3a, 0x88, 0x66, 0x73, 0xe0, 0xbe, 0x40, 0xf3, 0x08, 0x4f, 0x2d, 0x48, 0x50, 0x66, + 0x6d, 0xd8, 0x4f, 0x92, 0x93, 0xe5, 0x71, 0xf8, 0x16, 0xfe, 0xe5, 0x33, 0x6c, 0x12, 0x53, 0x14, 0x8f, 0xbf, 0x55, + 0x8a, 0xff, 0x8e, 0x2d, 0x88, 0x60, 0xed, 0x46, 0xd4, 0x86, 0xbf, 0xe1, 0xdf, 0xc2, 0x3e, 0xc2, 0x7e, 0x43, 0x13, + 0x84, 0x01, 0xac, 0x3f, 0x13, 0x88, 0x0b, 0x0b, 0x41, 0x82, 0xbf, 0x55, 0x92, 0x7f, 0x4e, 0xf8, 0x6c, 0x51, 0x02, + 0x59, 0x1d, 0x46, 0xf1, 0x09, 0xc5, 0x44, 0x21, 0x0c, 0xb7, 0x84, 0xde, 0xd1, 0x7f, 0x23, 0x4a, 0xb2, 0x49, 0x6e, + 0xc5, 0x7a, 0x20, 0x93, 0x24, 0x98, 0x60, 0xe5, 0x85, 0xf2, 0x85, 0x7b, 0xa1, 0xd4, 0x5a, 0x0b, 0x5a, 0xbf, 0xfc, + 0x49, 0xe2, 0x19, 0xd0, 0x3d, 0x90, 0x31, 0xe8, 0x36, 0xa2, 0x9a, 0xe4, 0x98, 0x3e, 0x4a, 0xe7, 0x19, 0xa8, 0x80, + 0xce, 0xd6, 0x59, 0x58, 0x2f, 0x8b, 0x72, 0xd5, 0x0a, 0x0f, 0x95, 0xa5, 0x8f, 0xd4, 0x63, 0xcc, 0x0b, 0xf3, 0xe4, + 0x44, 0x3e, 0x78, 0x04, 0x68, 0x78, 0x94, 0xa7, 0x55, 0x47, 0x69, 0xfd, 0xc0, 0x32, 0x60, 0x04, 0x4e, 0x94, 0x01, + 0x8f, 0xb0, 0x0c, 0xcc, 0xd3, 0x2e, 0x43, 0x0d, 0x62, 0x8d, 0xaa, 0x2b, 0xb5, 0xc1, 0x9c, 0x28, 0x4a, 0x3e, 0xc5, + 0xd2, 0x0a, 0x63, 0x68, 0xea, 0xca, 0x23, 0xeb, 0x25, 0x27, 0xec, 0xc9, 0x6e, 0x20, 0xdd, 0xc2, 0x46, 0x81, 0x0b, + 0xba, 0x96, 0x25, 0xca, 0x45, 0xb7, 0x8c, 0x28, 0x13, 0x21, 0xf5, 0xb3, 0x87, 0x33, 0xad, 0xf6, 0x1b, 0x3b, 0x69, + 0xdf, 0x1e, 0x29, 0x7a, 0xc1, 0x40, 0x7c, 0xda, 0x23, 0xa5, 0x9e, 0x35, 0x72, 0x19, 0xd8, 0xd2, 0xa5, 0xaa, 0xe7, + 0xbf, 0x41, 0xf9, 0x0e, 0x66, 0xc6, 0xd9, 0xec, 0x77, 0xbd, 0xb9, 0x3d, 0xd9, 0xd7, 0xcd, 0xef, 0xac, 0xd7, 0x83, + 0xad, 0x41, 0x26, 0xbe, 0x50, 0xd4, 0x53, 0x56, 0x21, 0x56, 0x64, 0xf6, 0xbf, 0x85, 0xf7, 0x3b, 0xbc, 0x35, 0x42, + 0xb3, 0x32, 0x1e, 0xe6, 0xa3, 0x27, 0x7b, 0xd1, 0xfc, 0xde, 0x59, 0xb6, 0x95, 0xab, 0x92, 0xd9, 0x7e, 0x3f, 0x4a, + 0x9a, 0xb3, 0xc7, 0x6b, 0x24, 0x75, 0x80, 0x8f, 0xd7, 0x67, 0xf8, 0x48, 0x25, 0x94, 0x5a, 0x50, 0xd5, 0xa0, 0xf5, + 0xb1, 0xdf, 0x5b, 0xcf, 0xe9, 0xe3, 0xc7, 0x72, 0xba, 0x25, 0x45, 0x18, 0x3f, 0x30, 0x98, 0xb2, 0x13, 0xa7, 0x2e, + 0x79, 0x33, 0xa4, 0x77, 0xdd, 0x2a, 0xa9, 0xcb, 0x1e, 0x25, 0x82, 0x50, 0x07, 0xeb, 0x17, 0xfb, 0x21, 0xcc, 0x6c, + 0xd1, 0x1f, 0x36, 0xab, 0x39, 0xa1, 0x20, 0x02, 0x44, 0xab, 0xbc, 0x0f, 0x1c, 0x93, 0x84, 0x59, 0x73, 0x43, 0xba, + 0xf5, 0xe6, 0x4a, 0x7b, 0x25, 0x05, 0xf4, 0x73, 0x90, 0xb9, 0x7d, 0x74, 0xcb, 0x55, 0xcb, 0x3c, 0x97, 0xb6, 0x1c, + 0xb0, 0x68, 0x21, 0x3a, 0xb3, 0x73, 0xe9, 0x70, 0xf0, 0x1f, 0xd4, 0x95, 0xa8, 0x22, 0x82, 0x8e, 0xa2, 0x05, 0xa3, + 0xd5, 0xaa, 0x5d, 0x4e, 0x36, 0x15, 0xb2, 0x25, 0x11, 0x4e, 0x94, 0xec, 0x95, 0x50, 0x1f, 0xe5, 0x6a, 0xcf, 0x34, + 0xc4, 0x9f, 0x09, 0xd8, 0xb4, 0xc1, 0xdf, 0x02, 0xf7, 0x32, 0x38, 0x33, 0xed, 0xd3, 0x30, 0x02, 0x22, 0x73, 0x08, + 0xf6, 0xf3, 0xbb, 0x1e, 0x54, 0xf0, 0xa0, 0x23, 0xfd, 0x55, 0x3d, 0x2b, 0xf0, 0xcc, 0x3d, 0xf1, 0xfc, 0xf5, 0x89, + 0xf4, 0x22, 0x87, 0x07, 0x9a, 0xfb, 0x30, 0xe3, 0x2f, 0xca, 0x32, 0xdc, 0x8d, 0x96, 0x65, 0xb1, 0xf2, 0x22, 0xbd, + 0x8f, 0x67, 0x52, 0x0c, 0x24, 0x3a, 0xcc, 0x8c, 0xae, 0x62, 0x1d, 0xe7, 0x30, 0xee, 0xed, 0x49, 0x58, 0xa1, 0xfd, + 0xb3, 0xc4, 0x5e, 0x17, 0x00, 0xe0, 0x90, 0x35, 0x68, 0x85, 0x77, 0xba, 0xbd, 0xdd, 0xe3, 0x92, 0x12, 0xc5, 0x8d, + 0x9a, 0x9f, 0xd5, 0xd0, 0x32, 0x41, 0x2d, 0xb3, 0xee, 0x64, 0x32, 0x45, 0x12, 0xf8, 0x36, 0xec, 0x35, 0x2b, 0xf2, + 0x79, 0x23, 0xb7, 0x87, 0x77, 0xe1, 0x4a, 0xc4, 0xda, 0x82, 0x4e, 0x3a, 0x32, 0x0e, 0xf7, 0x42, 0x73, 0x23, 0xdd, + 0x3f, 0xa9, 0x92, 0xb0, 0x14, 0x31, 0xdc, 0x02, 0xd9, 0x5e, 0x6d, 0x2b, 0x41, 0x09, 0x24, 0xb0, 0x1f, 0x4a, 0xb1, + 0x4c, 0xb7, 0x02, 0xc0, 0x1c, 0xf8, 0x9f, 0x12, 0x86, 0xd0, 0xdd, 0x79, 0x88, 0x57, 0x8d, 0xbc, 0x6f, 0x10, 0x82, + 0xfd, 0x15, 0xc8, 0x69, 0xc0, 0x20, 0x52, 0x8c, 0x64, 0xc1, 0x40, 0x02, 0x90, 0xf3, 0x35, 0x98, 0xe4, 0xa6, 0xb9, + 0xe7, 0x07, 0xb9, 0xee, 0x60, 0xda, 0x07, 0xdd, 0x8b, 0x6b, 0xcd, 0x72, 0xf0, 0x8a, 0x89, 0xf8, 0xdf, 0x6b, 0xaf, + 0x64, 0x39, 0xcb, 0xfc, 0xc6, 0x5c, 0x74, 0x32, 0xb8, 0x6a, 0x08, 0xbf, 0x98, 0x65, 0x73, 0x1e, 0xcd, 0x32, 0x1d, + 0xea, 0x5f, 0x34, 0x47, 0xa5, 0x00, 0x86, 0x3a, 0x5e, 0x80, 0x35, 0xde, 0x95, 0x6e, 0x5a, 0xf1, 0x48, 0x63, 0x8c, + 0x82, 0x0a, 0x1d, 0x84, 0xfe, 0x5e, 0x03, 0xbc, 0x06, 0x93, 0xdc, 0x08, 0x95, 0x0f, 0x2e, 0xe8, 0x86, 0x6e, 0xb9, + 0x72, 0x09, 0x6a, 0x52, 0xb5, 0xfc, 0x72, 0x84, 0x7a, 0x57, 0x4b, 0x2e, 0xd5, 0xe6, 0x53, 0xa3, 0xac, 0x11, 0x64, + 0x72, 0x94, 0x7e, 0x9f, 0x72, 0xe1, 0x56, 0xc6, 0x64, 0x7d, 0x38, 0x78, 0x05, 0x37, 0x35, 0x7e, 0x95, 0x13, 0x8b, + 0xa8, 0x3d, 0x24, 0xc2, 0xd6, 0x6e, 0x85, 0xee, 0x3d, 0x6e, 0x94, 0xe6, 0x51, 0xb6, 0x89, 0x45, 0xe5, 0xf5, 0x12, + 0xb0, 0x16, 0xf7, 0x80, 0x0c, 0x95, 0x96, 0x7e, 0xc5, 0x0a, 0x80, 0x0c, 0x90, 0xc2, 0xc6, 0x0f, 0x48, 0x7b, 0xf5, + 0xc1, 0x4b, 0xfd, 0x7e, 0xdf, 0x98, 0xf2, 0xdf, 0x3f, 0xe4, 0xc0, 0x4c, 0x28, 0xca, 0x7a, 0x07, 0x13, 0x08, 0xae, + 0x9d, 0xa4, 0x3d, 0xab, 0xf9, 0xf5, 0xba, 0xf6, 0x80, 0xd4, 0xca, 0xb7, 0x98, 0xab, 0x5e, 0xd9, 0x17, 0x9b, 0x7d, + 0x5a, 0xdd, 0x18, 0x8d, 0x83, 0x60, 0x69, 0xf5, 0x46, 0xab, 0x1c, 0xf2, 0x86, 0x57, 0x20, 0x52, 0x59, 0x57, 0xd7, + 0xca, 0xb9, 0xba, 0x16, 0x1c, 0x09, 0x64, 0x4b, 0x9e, 0xc3, 0x7f, 0x21, 0xf7, 0xca, 0xc3, 0xa1, 0xf0, 0xfb, 0xfd, + 0x74, 0x46, 0x5a, 0x59, 0xa0, 0x4c, 0x5b, 0xd7, 0x5e, 0xe8, 0x1f, 0x0e, 0x3f, 0x80, 0xd7, 0x88, 0x7f, 0x38, 0x94, + 0xfd, 0xfe, 0x47, 0x73, 0x93, 0x39, 0x1f, 0x2b, 0xa5, 0xec, 0x25, 0x2a, 0xdd, 0xdf, 0x24, 0xbc, 0xf7, 0xbf, 0x47, + 0xff, 0x7b, 0x74, 0xd9, 0x53, 0x01, 0x60, 0x09, 0x9f, 0xe1, 0x0d, 0x9d, 0xa9, 0xcb, 0x39, 0x93, 0xee, 0xee, 0xca, + 0x0f, 0xbd, 0xa7, 0xf1, 0xe1, 0x7b, 0x73, 0xd3, 0xc6, 0x5f, 0xab, 0x23, 0x4d, 0x42, 0xc7, 0x45, 0xff, 0x70, 0xf8, + 0x94, 0x68, 0x7d, 0x5a, 0xaa, 0xf4, 0x69, 0x0a, 0x3c, 0xc9, 0xb0, 0xe1, 0xba, 0x85, 0xe9, 0x68, 0x7e, 0xdc, 0x7c, + 0x95, 0xbc, 0x38, 0x4b, 0xe1, 0xda, 0x9b, 0xcf, 0xd2, 0xf9, 0x14, 0xac, 0x2b, 0xc3, 0x7c, 0x56, 0xcf, 0x03, 0x48, + 0x1d, 0x42, 0x9a, 0x35, 0x0d, 0xff, 0x56, 0xb9, 0x82, 0xb7, 0xf6, 0x78, 0x37, 0x18, 0x51, 0xea, 0x48, 0x9f, 0xb4, + 0x21, 0x74, 0x49, 0x25, 0xff, 0x51, 0xe4, 0x31, 0xc6, 0x6c, 0xbc, 0x22, 0xb2, 0xcf, 0x22, 0x7f, 0x59, 0x00, 0x60, + 0x11, 0x20, 0x20, 0xa7, 0x73, 0x47, 0x12, 0xff, 0x39, 0xf9, 0xf6, 0x8f, 0xe9, 0xd2, 0x3e, 0x94, 0xc5, 0x5d, 0x29, + 0xaa, 0xea, 0xa8, 0xb4, 0x9d, 0x2d, 0xd7, 0x03, 0x7d, 0x68, 0xbf, 0x2f, 0xe9, 0x43, 0x53, 0x0c, 0x45, 0x81, 0x5b, + 0x63, 0x6f, 0x9a, 0x72, 0x45, 0x53, 0x3d, 0x32, 0xd6, 0xcf, 0xef, 0x77, 0x6f, 0x62, 0x2f, 0xf5, 0x83, 0x14, 0x04, + 0x61, 0x8d, 0x9f, 0x94, 0x22, 0x09, 0x9c, 0xcf, 0x30, 0x95, 0xf8, 0x74, 0x29, 0x55, 0xfe, 0x30, 0xd2, 0x7c, 0x98, + 0x82, 0x5e, 0xf6, 0x1f, 0x15, 0xcc, 0x7f, 0xdd, 0x1e, 0xac, 0x4f, 0xeb, 0x32, 0x8d, 0x2a, 0xa2, 0xca, 0x0b, 0x53, + 0x6d, 0x02, 0x11, 0xfc, 0x5a, 0x58, 0x24, 0xbf, 0x3e, 0x39, 0x12, 0x34, 0x66, 0xb2, 0x7c, 0x3c, 0x72, 0xbf, 0xb0, + 0xaf, 0x5c, 0xc7, 0xf3, 0x3f, 0x37, 0xf3, 0x7f, 0x80, 0xce, 0x90, 0xc5, 0x35, 0xb7, 0x0c, 0x16, 0x38, 0xfb, 0xa5, + 0xab, 0x07, 0xfc, 0xcd, 0x3c, 0x71, 0x0d, 0x1c, 0xcc, 0xd7, 0xe8, 0xaa, 0x98, 0xce, 0x8a, 0x01, 0x10, 0xd8, 0xfa, + 0x8d, 0x35, 0x27, 0x5e, 0x5b, 0x3c, 0x57, 0x72, 0x41, 0xe8, 0xeb, 0x2a, 0xcc, 0xc6, 0x55, 0xb1, 0xa9, 0x44, 0xb1, + 0xa9, 0x7b, 0xa4, 0x96, 0xcd, 0xa7, 0xb5, 0xad, 0x90, 0xfd, 0x49, 0xb4, 0x68, 0xbb, 0x0c, 0xd5, 0x64, 0x94, 0xa5, + 0xeb, 0x29, 0x90, 0xea, 0x05, 0x70, 0x16, 0x99, 0x57, 0xbe, 0x38, 0x7b, 0xc0, 0x16, 0x8d, 0xa7, 0xc0, 0x88, 0x4a, + 0x7f, 0xe4, 0x8d, 0xd1, 0xe9, 0x89, 0x7e, 0x3f, 0x9f, 0x52, 0xc8, 0xd7, 0x4f, 0x80, 0xc9, 0x55, 0xcb, 0x05, 0xe8, + 0xcb, 0x50, 0x07, 0x95, 0x28, 0xb5, 0x62, 0x18, 0xb1, 0xf0, 0x93, 0x40, 0xf6, 0x66, 0x0a, 0x6a, 0x56, 0x51, 0x12, + 0x2a, 0x51, 0x29, 0xd9, 0x9a, 0xa0, 0x96, 0xde, 0x17, 0x45, 0xbd, 0xaf, 0xc0, 0x51, 0x32, 0xd2, 0x66, 0x39, 0x65, + 0xc6, 0x45, 0x99, 0x8b, 0x7e, 0xb0, 0x7f, 0x57, 0x9e, 0xdf, 0xc8, 0x7c, 0x96, 0xfb, 0x8e, 0xce, 0x69, 0x3b, 0x2e, + 0x50, 0xe6, 0x96, 0xd3, 0x56, 0x4b, 0x1e, 0x93, 0xf7, 0x2c, 0xd8, 0xf6, 0x5f, 0x24, 0xc8, 0xab, 0x08, 0xf3, 0x09, + 0x55, 0x36, 0xff, 0x80, 0x30, 0x5b, 0x1c, 0xd8, 0x63, 0x17, 0x26, 0x22, 0xbd, 0x05, 0x4b, 0x62, 0x98, 0x95, 0x22, + 0x8c, 0x77, 0xe0, 0xfd, 0xb3, 0xa9, 0xc4, 0xe8, 0x0c, 0x9d, 0xdc, 0xcf, 0x1e, 0xd2, 0x3a, 0x39, 0x7b, 0xf3, 0xea, + 0xec, 0xbb, 0xde, 0xa0, 0x18, 0xa5, 0xf1, 0xa0, 0xf7, 0xdd, 0xd9, 0x6a, 0x03, 0x10, 0x99, 0xe2, 0x2c, 0x26, 0x53, + 0x9a, 0x88, 0xcf, 0xc8, 0x30, 0x78, 0x56, 0x27, 0xe2, 0x8c, 0x26, 0xa6, 0xfb, 0x1a, 0xa5, 0xc9, 0xb7, 0xa3, 0x30, + 0x87, 0x97, 0x4b, 0xb1, 0xa9, 0x44, 0x0c, 0x76, 0x4a, 0x35, 0xcf, 0xf2, 0xf6, 0x59, 0x9c, 0x8f, 0x3a, 0x64, 0x95, + 0x0e, 0xd0, 0xed, 0x89, 0xb4, 0xab, 0xd2, 0x15, 0x10, 0x7a, 0x00, 0x9c, 0x74, 0xe5, 0xcf, 0xc3, 0x41, 0x24, 0x10, + 0x6a, 0xc1, 0x9c, 0x4c, 0x23, 0xba, 0x21, 0xbd, 0xc4, 0x3e, 0x03, 0xb3, 0x90, 0xd2, 0x3c, 0xb8, 0xb9, 0x5a, 0xb4, + 0xdc, 0x15, 0x2b, 0x47, 0x61, 0xb5, 0x16, 0x51, 0x8d, 0x54, 0xc7, 0xe0, 0xbc, 0x03, 0x11, 0x00, 0x8a, 0x11, 0x3c, + 0xe3, 0x51, 0xbf, 0x1f, 0xa9, 0xa0, 0x9c, 0x84, 0x7e, 0x51, 0xe8, 0x97, 0xc6, 0xa0, 0x8c, 0xf9, 0xbb, 0x50, 0x13, + 0x03, 0xd4, 0x5b, 0x1e, 0x2a, 0x8e, 0x00, 0x5c, 0xce, 0x11, 0x33, 0xce, 0x7b, 0xdc, 0x45, 0xe3, 0x54, 0xbc, 0x13, + 0xea, 0x3a, 0x58, 0x2a, 0xd4, 0x79, 0x53, 0x1f, 0xe9, 0x39, 0x69, 0x12, 0x34, 0x88, 0x1b, 0x78, 0xbc, 0x1a, 0x02, + 0xaa, 0x95, 0x90, 0x7a, 0x0b, 0x9d, 0x52, 0xd5, 0x21, 0xb0, 0x06, 0xb8, 0x44, 0x61, 0x5b, 0x61, 0x72, 0x44, 0x9b, + 0xb2, 0x14, 0xf9, 0x11, 0x1b, 0xb4, 0x4b, 0x46, 0xa6, 0x0e, 0xae, 0xff, 0xc3, 0xdb, 0xb7, 0x70, 0xb7, 0x6d, 0x63, + 0xeb, 0xfe, 0x15, 0x8b, 0x37, 0x55, 0x89, 0x08, 0x92, 0x25, 0x37, 0xe9, 0xb4, 0x94, 0x21, 0x1d, 0x37, 0x8f, 0x36, + 0x9d, 0xe6, 0xd1, 0x38, 0xed, 0x74, 0x46, 0x57, 0xc7, 0xa5, 0x49, 0xd8, 0x62, 0x43, 0x03, 0x2a, 0x49, 0xf9, 0x51, + 0x89, 0xff, 0xfd, 0xae, 0xbd, 0xf1, 0x24, 0x45, 0x3b, 0x99, 0xb9, 0xe7, 0xde, 0x95, 0xb5, 0x62, 0x11, 0x04, 0xf1, + 0xc6, 0xc6, 0xc6, 0x7e, 0x7c, 0xbb, 0x19, 0xcb, 0x49, 0x85, 0xfe, 0x75, 0x75, 0x01, 0x9c, 0x17, 0xc6, 0xb7, 0x6e, + 0x66, 0xcb, 0x75, 0xb4, 0xeb, 0xd2, 0xc5, 0x2c, 0x29, 0x78, 0xb9, 0x96, 0xa2, 0xcc, 0xae, 0xf9, 0x4f, 0xf6, 0x65, + 0x33, 0x80, 0x14, 0xda, 0x91, 0xbe, 0x6e, 0x77, 0x47, 0x8b, 0x71, 0x6c, 0x39, 0xbe, 0xa5, 0xd2, 0x9d, 0x1e, 0x55, + 0x2f, 0x6e, 0xb6, 0xce, 0xb5, 0xca, 0xd2, 0x94, 0x8b, 0x57, 0x22, 0xcd, 0x12, 0x2f, 0x39, 0xd6, 0x01, 0xaa, 0x5d, + 0xe4, 0x2b, 0x17, 0x1b, 0xf9, 0x79, 0x56, 0x62, 0xc0, 0xe0, 0x46, 0xa3, 0x5a, 0xa1, 0xa6, 0x4c, 0xe0, 0x0b, 0xf9, + 0x1e, 0x23, 0x6e, 0xb3, 0x32, 0x01, 0x86, 0x1f, 0x13, 0xf5, 0x25, 0x3d, 0x85, 0x28, 0x0f, 0x2a, 0x1e, 0xf7, 0x73, + 0x8e, 0x88, 0xd7, 0x56, 0x65, 0x0e, 0x4c, 0xb6, 0x56, 0x41, 0x22, 0xd8, 0x5d, 0xb6, 0xd0, 0x8b, 0x68, 0xa9, 0xee, + 0x42, 0xbd, 0x78, 0xb7, 0xeb, 0x25, 0x8a, 0x0e, 0x38, 0xf9, 0x69, 0xf0, 0x32, 0xce, 0x72, 0x9e, 0x1e, 0x54, 0xf2, + 0x40, 0x6d, 0xa8, 0x03, 0xe5, 0xcc, 0x01, 0x3b, 0xef, 0xcb, 0xea, 0x40, 0xaf, 0xe9, 0x03, 0xdd, 0xce, 0x03, 0xb8, + 0x60, 0xe0, 0xce, 0xbd, 0xcc, 0xae, 0xb9, 0x38, 0x00, 0x65, 0xa0, 0x35, 0x1e, 0xa8, 0x45, 0x35, 0x52, 0x13, 0xa3, + 0x03, 0x57, 0x27, 0xfa, 0x60, 0x0e, 0xe8, 0xf7, 0x10, 0x2b, 0xbc, 0xf5, 0x76, 0xad, 0x0f, 0xda, 0x80, 0xfe, 0xb4, + 0x32, 0x7d, 0xd0, 0xd1, 0xe2, 0x55, 0x48, 0xe0, 0xc6, 0x90, 0x6a, 0xa4, 0x56, 0x23, 0xab, 0x40, 0xf1, 0x86, 0xb7, + 0x78, 0xf7, 0xae, 0x25, 0x5b, 0xef, 0x25, 0x02, 0x7b, 0x65, 0xa2, 0x8a, 0x33, 0x71, 0xe2, 0xa5, 0xf2, 0x5a, 0x3b, + 0xc9, 0x08, 0xe3, 0x5b, 0x56, 0x52, 0x7f, 0x87, 0x98, 0x5b, 0xa4, 0x39, 0x0c, 0x5e, 0x84, 0x15, 0x99, 0xf3, 0x7e, + 0x5f, 0xce, 0x65, 0x54, 0xce, 0xc5, 0x61, 0x19, 0x29, 0x84, 0xb6, 0xfb, 0x44, 0x40, 0x0f, 0x4a, 0x80, 0x7c, 0x01, + 0x50, 0xf5, 0x90, 0xf0, 0xe7, 0x21, 0xa9, 0x4f, 0xa7, 0xd0, 0xa7, 0xd0, 0xd6, 0x2b, 0x5e, 0x41, 0x55, 0xdd, 0x18, + 0xd9, 0x46, 0x05, 0x2d, 0x1e, 0xcb, 0xb3, 0xda, 0x30, 0x36, 0xa7, 0xd6, 0xbb, 0xde, 0x6c, 0x30, 0x65, 0x73, 0xa1, + 0x56, 0x61, 0x48, 0xa2, 0x9b, 0xd2, 0x0b, 0x1f, 0x62, 0xb1, 0xb2, 0x5a, 0x9b, 0xdf, 0xc4, 0xfe, 0xc8, 0x44, 0x8a, + 0xfb, 0xd9, 0x12, 0xe7, 0x2e, 0x1e, 0xcf, 0xab, 0xbe, 0xd6, 0xd2, 0x22, 0xd3, 0xe6, 0x3b, 0x7d, 0x19, 0xd2, 0x54, + 0xd4, 0x90, 0x46, 0x9d, 0x19, 0x74, 0xdf, 0x2e, 0xaf, 0xa8, 0x46, 0x98, 0x00, 0xaf, 0x74, 0x06, 0xdd, 0x68, 0x3c, + 0x10, 0x45, 0x35, 0x2a, 0x36, 0x42, 0x20, 0xda, 0x30, 0xe4, 0x98, 0x5b, 0x42, 0x92, 0xfd, 0xc5, 0xbf, 0x53, 0xc1, + 0x15, 0x8a, 0xf8, 0xc6, 0xc0, 0x79, 0x57, 0xd6, 0xb3, 0xbb, 0x8e, 0xfc, 0x9c, 0x58, 0x58, 0xed, 0x3f, 0x34, 0x8f, + 0x5a, 0xe3, 0x2c, 0xa0, 0xad, 0x69, 0x75, 0xc3, 0xe1, 0x1e, 0xd5, 0xb1, 0x28, 0x0d, 0x20, 0xb1, 0x47, 0x96, 0x8b, + 0xd6, 0x31, 0x83, 0x06, 0xf4, 0xb7, 0xd9, 0xd5, 0xe6, 0x0a, 0x51, 0xdb, 0x4a, 0x64, 0x9d, 0xa4, 0xf2, 0x2f, 0x69, + 0x8f, 0xba, 0xb6, 0xa7, 0xf2, 0xbf, 0x6d, 0x53, 0xe5, 0xd0, 0x02, 0xc9, 0x63, 0x37, 0xe7, 0x81, 0xea, 0x48, 0x10, + 0x05, 0x6a, 0xeb, 0x05, 0x53, 0xef, 0x94, 0x29, 0x3a, 0x90, 0x9f, 0x0b, 0x73, 0x86, 0x7d, 0xc6, 0x11, 0x63, 0x96, + 0x4a, 0x0c, 0xa6, 0x3e, 0xc6, 0xa8, 0xa6, 0xb5, 0x02, 0x74, 0xfd, 0x74, 0x0b, 0x7f, 0xa2, 0xa2, 0x46, 0x43, 0xad, + 0x91, 0x14, 0x8a, 0x26, 0x2a, 0xe8, 0x58, 0x5a, 0xe8, 0x60, 0x0a, 0x9d, 0x44, 0xc2, 0x12, 0xd0, 0x30, 0x21, 0x3a, + 0xa9, 0xc0, 0x5b, 0x03, 0x38, 0xf3, 0x71, 0x51, 0x6e, 0x0a, 0x6d, 0x30, 0xf7, 0x43, 0x7c, 0xcd, 0x5f, 0x3d, 0x77, + 0x46, 0xf5, 0x2d, 0x6b, 0x7d, 0x4f, 0x0b, 0xf2, 0x43, 0xc8, 0x29, 0x3a, 0x30, 0xb1, 0xd9, 0x16, 0x8d, 0x31, 0xca, + 0x5a, 0x87, 0xba, 0x78, 0xab, 0xe3, 0xaf, 0x68, 0x13, 0xbc, 0x07, 0x3c, 0x45, 0xb4, 0xe1, 0xa1, 0x30, 0x56, 0xd5, + 0xf8, 0x54, 0xb2, 0x96, 0x1e, 0xac, 0xe0, 0xe9, 0x26, 0xe1, 0x21, 0xe8, 0x91, 0x08, 0x9b, 0x85, 0xc5, 0x22, 0x5e, + 0xc2, 0x71, 0x52, 0x10, 0x50, 0x3b, 0xe8, 0x2b, 0xf8, 0x62, 0x89, 0xee, 0xaf, 0x12, 0x3d, 0xc0, 0xd0, 0x82, 0xb8, + 0x19, 0xfa, 0x74, 0x74, 0x15, 0xaf, 0x1b, 0x2a, 0x12, 0xbe, 0x28, 0xc0, 0x76, 0x48, 0xa9, 0xa7, 0x40, 0x0b, 0x95, + 0x28, 0xfd, 0x30, 0xf0, 0x1d, 0x1a, 0xf8, 0x5a, 0xeb, 0x00, 0x0d, 0xfd, 0x8c, 0x69, 0x6a, 0x9d, 0xa1, 0xf2, 0xb9, + 0x77, 0xcf, 0x8c, 0x56, 0x73, 0x0b, 0xc6, 0xa0, 0x6f, 0xa3, 0x29, 0x8a, 0x73, 0xf2, 0x79, 0x50, 0xc4, 0x69, 0x16, + 0xe7, 0xe0, 0xb7, 0x19, 0x17, 0x98, 0x31, 0x89, 0x2b, 0x7e, 0x29, 0x0b, 0xd0, 0x76, 0xe7, 0x2a, 0xb5, 0xae, 0x41, + 0x40, 0xf6, 0x03, 0x58, 0xbd, 0x34, 0x74, 0x54, 0xce, 0xbb, 0x4b, 0x9b, 0x42, 0xc4, 0x22, 0x04, 0x9b, 0x66, 0xba, + 0x62, 0x27, 0xa1, 0xd2, 0xe6, 0x40, 0x7c, 0x23, 0x34, 0xee, 0x9f, 0x86, 0xb1, 0xd5, 0x14, 0x5b, 0xbb, 0xb7, 0xdd, + 0xee, 0xb7, 0xd2, 0x4b, 0xa7, 0x39, 0xe9, 0x31, 0xf6, 0x5b, 0x19, 0x16, 0x23, 0xdb, 0x11, 0x02, 0x4b, 0xce, 0xfb, + 0xd4, 0x7f, 0x45, 0xcb, 0x45, 0x02, 0xa6, 0x23, 0x3a, 0x42, 0x2e, 0x50, 0x76, 0x8c, 0xe2, 0x0e, 0x0c, 0xae, 0xe8, + 0xf7, 0xc1, 0x2a, 0xc3, 0x5c, 0x48, 0x56, 0x24, 0x65, 0xf0, 0x3c, 0xf5, 0x30, 0xe0, 0x37, 0x4c, 0x99, 0xbb, 0x28, + 0xeb, 0xd3, 0x15, 0x99, 0xa6, 0xc8, 0x40, 0x6c, 0xc2, 0x6d, 0x96, 0x46, 0x89, 0x12, 0x91, 0xad, 0xd0, 0x3f, 0xd2, + 0x50, 0x2c, 0x1d, 0xae, 0x17, 0xa9, 0x12, 0xa1, 0x62, 0x91, 0xe2, 0x49, 0x9d, 0xd6, 0xe9, 0x08, 0xe3, 0x4d, 0x82, + 0x52, 0xae, 0x86, 0x81, 0x2a, 0xa9, 0x5e, 0x0a, 0xdb, 0x62, 0xb7, 0xd3, 0x17, 0x2b, 0xb1, 0x88, 0x97, 0xf8, 0x52, + 0xe0, 0x28, 0xfe, 0x9d, 0x7b, 0xb1, 0xa6, 0xd4, 0xf6, 0xa0, 0x76, 0x44, 0x09, 0xfd, 0x3b, 0x87, 0x8b, 0xc4, 0x77, + 0x52, 0xc7, 0xfd, 0x43, 0x8b, 0x90, 0x33, 0x75, 0x90, 0x1a, 0x6e, 0x68, 0x4f, 0xf8, 0x6f, 0xb8, 0x3e, 0xe3, 0x8c, + 0xde, 0x54, 0x33, 0x6a, 0xfc, 0x5e, 0x0f, 0xcf, 0x18, 0xf5, 0xd9, 0xc0, 0x61, 0x85, 0x28, 0xb4, 0x61, 0xb3, 0x52, + 0x89, 0x16, 0x86, 0x52, 0xfd, 0x25, 0x54, 0xcc, 0xb8, 0x33, 0xa3, 0x2c, 0x19, 0x9f, 0x96, 0xc7, 0x62, 0x3a, 0x18, + 0x94, 0xa4, 0x32, 0x16, 0x7a, 0x70, 0x3d, 0xf0, 0xfc, 0x7b, 0xe0, 0x16, 0xe2, 0xc1, 0x21, 0x8b, 0x21, 0x37, 0xe0, + 0xf8, 0x2d, 0x4e, 0xae, 0x1a, 0x95, 0x2a, 0x78, 0x35, 0x51, 0x2d, 0xf8, 0x7b, 0x19, 0x06, 0xe8, 0x93, 0x14, 0x80, + 0xc9, 0x60, 0xca, 0x6f, 0x41, 0xa2, 0x74, 0xa6, 0x6e, 0x48, 0xbf, 0x88, 0x82, 0x5f, 0xf0, 0x82, 0x8b, 0xc4, 0x15, + 0x60, 0x79, 0x07, 0xdb, 0xeb, 0xa8, 0xa2, 0x0a, 0x88, 0xd7, 0xf4, 0x38, 0xe2, 0xc6, 0xfb, 0xcf, 0xf4, 0xd8, 0x02, + 0xb5, 0x5a, 0xc7, 0x06, 0x9f, 0x39, 0x06, 0x17, 0x74, 0x2d, 0xb1, 0x35, 0x54, 0xc3, 0x8a, 0xc0, 0xc0, 0x05, 0x1c, + 0x84, 0x25, 0x8a, 0x63, 0x2b, 0x79, 0x45, 0x1a, 0x52, 0xda, 0x07, 0x86, 0xa3, 0x4d, 0x72, 0x7c, 0x9b, 0x65, 0x37, + 0x81, 0x8b, 0x65, 0xe7, 0xa4, 0x99, 0x58, 0x36, 0x78, 0x9f, 0x37, 0xe7, 0xd7, 0xfd, 0x43, 0x42, 0x55, 0xb0, 0x1b, + 0xde, 0x0e, 0x76, 0xe3, 0x84, 0x5f, 0x0b, 0xb1, 0xd4, 0xf1, 0x59, 0xcc, 0x25, 0xcb, 0x6f, 0xad, 0x77, 0x4b, 0x92, + 0x5a, 0x01, 0xed, 0xb3, 0x2c, 0xa8, 0x89, 0x00, 0x74, 0x3f, 0xfc, 0x05, 0x42, 0x67, 0xf8, 0xdb, 0x63, 0x70, 0x45, + 0x0a, 0xef, 0x1d, 0x02, 0x61, 0x4d, 0x37, 0xf7, 0x6a, 0x03, 0xbe, 0x18, 0xf7, 0x67, 0x4c, 0x3d, 0xfd, 0x36, 0x93, + 0xfb, 0xba, 0x6e, 0x8f, 0x2c, 0xc3, 0x47, 0xb8, 0x52, 0x00, 0x2c, 0x13, 0xfe, 0x62, 0x6c, 0x49, 0xf5, 0x09, 0xc0, + 0xa9, 0xe9, 0x88, 0x3e, 0x41, 0x60, 0xe0, 0x94, 0x68, 0x31, 0xba, 0x56, 0x8e, 0x68, 0x06, 0x69, 0x4d, 0xb7, 0xc2, + 0x78, 0xeb, 0x41, 0x0b, 0x3d, 0xd3, 0x70, 0xe2, 0x3f, 0x68, 0xe6, 0x55, 0x01, 0x01, 0xb4, 0x32, 0x82, 0xb7, 0xd6, + 0x47, 0x73, 0x84, 0xf8, 0x84, 0x25, 0xd1, 0x84, 0xc5, 0x33, 0xc5, 0x8f, 0x09, 0xdd, 0x36, 0xb5, 0x4d, 0x1f, 0x90, + 0xfe, 0xe2, 0x9a, 0xf5, 0x53, 0x56, 0xb5, 0x6f, 0x0f, 0x15, 0x2f, 0xa7, 0xcd, 0xe0, 0x87, 0x89, 0x2a, 0xc6, 0xff, + 0xa2, 0xf2, 0xa5, 0x56, 0x00, 0xc3, 0xdc, 0x55, 0x4f, 0xbf, 0xdf, 0xcc, 0x96, 0x03, 0xa1, 0xf2, 0x3b, 0x83, 0xa4, + 0x4f, 0xc7, 0xf3, 0x03, 0x9b, 0x44, 0x6d, 0xa1, 0xe7, 0x8f, 0x4b, 0xdd, 0x84, 0xca, 0x6b, 0x53, 0x23, 0x5a, 0x21, + 0x43, 0x65, 0xeb, 0x80, 0xf5, 0xfd, 0x43, 0xb8, 0xbf, 0xa8, 0x69, 0xa8, 0x75, 0xcf, 0x5d, 0x8b, 0x82, 0x13, 0x7f, + 0x80, 0xb1, 0xb8, 0x90, 0xd4, 0x3a, 0x08, 0x93, 0x7e, 0xb4, 0x38, 0xc9, 0x8d, 0xba, 0x3a, 0x39, 0x53, 0xcc, 0x13, + 0xb8, 0xa8, 0x96, 0x6d, 0x7f, 0x45, 0xa5, 0x2e, 0xe5, 0xf6, 0x8a, 0xd2, 0xf4, 0x90, 0xb6, 0x57, 0x71, 0xde, 0x16, + 0x5c, 0xf0, 0xcf, 0x14, 0x5c, 0x58, 0x07, 0xeb, 0x8e, 0x3b, 0x65, 0x4f, 0x78, 0xa2, 0x4c, 0x6b, 0x83, 0xbb, 0x69, + 0x30, 0x26, 0xc6, 0x7e, 0x77, 0xc5, 0x93, 0x8f, 0xc8, 0x82, 0x7f, 0x97, 0x09, 0xf0, 0x4c, 0x76, 0xaf, 0x54, 0xfe, + 0x1f, 0xfc, 0xab, 0xad, 0x7d, 0x67, 0xcd, 0x3f, 0x3d, 0xeb, 0xe1, 0xce, 0x61, 0xf2, 0x03, 0x74, 0x06, 0x74, 0x7b, + 0x25, 0x53, 0x0e, 0xc8, 0x00, 0xd6, 0x22, 0x19, 0x0d, 0xf8, 0xd0, 0xca, 0xb2, 0xed, 0x3b, 0xad, 0x2e, 0x08, 0xf7, + 0x12, 0xb8, 0xe9, 0xfd, 0xb5, 0x99, 0x99, 0xd3, 0xb5, 0x12, 0x4d, 0x97, 0xc6, 0xd6, 0xb2, 0x54, 0x01, 0xbb, 0xdf, + 0x7b, 0x92, 0x4d, 0xf3, 0xe3, 0xd5, 0x34, 0xb7, 0xd4, 0x6d, 0xeb, 0x96, 0x0d, 0x00, 0x21, 0x76, 0xad, 0xad, 0x1c, + 0x40, 0x72, 0x7b, 0x10, 0xc2, 0xd7, 0x8a, 0xd0, 0x53, 0x25, 0x42, 0x9f, 0xa6, 0xcd, 0x3e, 0xd8, 0x55, 0xb5, 0x69, + 0xc4, 0x39, 0x1a, 0xa4, 0x9a, 0x91, 0x7f, 0x7b, 0xcd, 0x8b, 0x8b, 0x5c, 0xde, 0x00, 0x06, 0x32, 0xa9, 0x8d, 0xc2, + 0xf2, 0x0a, 0xdc, 0xf9, 0xd1, 0x71, 0x9c, 0x89, 0x51, 0x8e, 0xc1, 0x5a, 0x11, 0x1e, 0x59, 0x27, 0xce, 0x01, 0x04, + 0xd9, 0x9f, 0x34, 0x1d, 0xcf, 0xb5, 0xc0, 0x98, 0xbe, 0xc0, 0x5d, 0xe5, 0x6c, 0xb6, 0xcd, 0xed, 0xa2, 0x6f, 0xce, + 0xb0, 0xee, 0x48, 0x69, 0x6d, 0x2c, 0xba, 0xee, 0x60, 0xad, 0x19, 0xb4, 0x45, 0x28, 0xf9, 0x90, 0x3b, 0x69, 0xff, + 0x0a, 0x68, 0x70, 0x96, 0xa5, 0xb7, 0xd6, 0x2a, 0x7f, 0xab, 0x85, 0x38, 0x51, 0x4c, 0x9d, 0xf8, 0x26, 0x4a, 0xf4, + 0xf9, 0x99, 0x18, 0x37, 0x10, 0x48, 0xfd, 0x01, 0x83, 0x6a, 0x14, 0x61, 0x02, 0xd7, 0x81, 0x28, 0xb6, 0x27, 0x6a, + 0x63, 0x39, 0x82, 0x4e, 0x08, 0xf1, 0x0e, 0xca, 0x30, 0x56, 0x17, 0x07, 0xda, 0x60, 0xe9, 0xeb, 0xd6, 0x3a, 0x37, + 0x84, 0xc2, 0x38, 0x81, 0x29, 0x06, 0x49, 0x9d, 0x75, 0x96, 0x09, 0xaa, 0xec, 0x98, 0x74, 0xde, 0x07, 0xe8, 0xfe, + 0x5a, 0x34, 0xc5, 0xd7, 0x9d, 0x3b, 0xe8, 0x3e, 0xae, 0x5f, 0x6b, 0x91, 0x1b, 0xfc, 0x79, 0x4b, 0x84, 0x45, 0xe0, + 0xac, 0x35, 0xf9, 0xaa, 0x11, 0x0e, 0x4c, 0x49, 0xa6, 0x61, 0x2f, 0x51, 0x36, 0xdd, 0xbb, 0x5d, 0xaf, 0x77, 0xaf, + 0x88, 0xab, 0xc7, 0x58, 0xe5, 0xdd, 0xcc, 0xed, 0x9d, 0x6a, 0x23, 0xf6, 0x6f, 0xda, 0x7e, 0x8a, 0x1d, 0xb5, 0xd6, + 0x6e, 0x37, 0x9c, 0x50, 0x43, 0xbe, 0x15, 0x55, 0x5a, 0x9d, 0x6e, 0x0c, 0xda, 0x21, 0x9e, 0xb5, 0xc8, 0xe0, 0x46, + 0xf9, 0xdc, 0x09, 0x9d, 0x54, 0x9c, 0x55, 0xa7, 0x2e, 0xd8, 0x5e, 0xf1, 0x6a, 0x25, 0xd3, 0x48, 0x50, 0xb4, 0x39, + 0x8f, 0x4a, 0x9a, 0xc8, 0x8d, 0xa8, 0x22, 0x59, 0xa3, 0x5e, 0xd4, 0x6a, 0x0c, 0x10, 0x90, 0xe9, 0xac, 0xe9, 0x41, + 0x15, 0xcc, 0x87, 0x32, 0x92, 0xd3, 0xf7, 0x60, 0x69, 0x8f, 0x1c, 0x6b, 0x7d, 0x5f, 0x9d, 0x2d, 0xbe, 0xd5, 0x13, + 0x82, 0x29, 0xcc, 0x1e, 0x08, 0x03, 0xd7, 0x34, 0x86, 0x9c, 0x76, 0x89, 0xcb, 0x9a, 0x6e, 0x09, 0xf7, 0x70, 0xbb, + 0x92, 0xcd, 0xdc, 0x3c, 0x69, 0x6e, 0xae, 0x60, 0xb3, 0x62, 0x31, 0x06, 0xed, 0x97, 0x54, 0xd7, 0x2e, 0xcd, 0xad, + 0xc7, 0x83, 0x80, 0x06, 0x83, 0xc2, 0xf0, 0xaf, 0x13, 0xe3, 0xe1, 0x49, 0x03, 0x82, 0xa4, 0x5c, 0x84, 0x63, 0xdf, + 0x88, 0x7e, 0x32, 0x95, 0xc7, 0x1c, 0x2d, 0xde, 0xa1, 0xd5, 0x09, 0x44, 0xf1, 0x12, 0xa1, 0x24, 0x46, 0x55, 0x68, + 0x44, 0x50, 0x9e, 0x96, 0xbf, 0x54, 0xd5, 0x21, 0xa0, 0x90, 0xf6, 0x15, 0x85, 0xb2, 0x4d, 0x62, 0x68, 0x86, 0x5f, + 0x2e, 0x26, 0x4b, 0x3d, 0x03, 0x03, 0xb9, 0x38, 0x5a, 0xea, 0x59, 0x18, 0xc8, 0xc5, 0x57, 0xcb, 0xda, 0xad, 0x03, + 0x4d, 0x40, 0x3c, 0x17, 0x8e, 0x4e, 0x4a, 0xab, 0xb2, 0x05, 0x74, 0xfb, 0x10, 0x41, 0xff, 0xbb, 0x3d, 0x04, 0x9d, + 0x5c, 0x68, 0x4f, 0x6e, 0x40, 0xdb, 0x71, 0x08, 0xec, 0x15, 0x93, 0x0a, 0x13, 0x80, 0xe8, 0x98, 0x8d, 0xc1, 0x10, + 0x5b, 0x7d, 0x70, 0xcc, 0xc6, 0x53, 0x9f, 0x04, 0x01, 0xa3, 0xfb, 0x83, 0x81, 0x04, 0xbf, 0xc5, 0xab, 0xf4, 0x6c, + 0x2b, 0xd0, 0x4d, 0xdf, 0xdd, 0x0d, 0xbd, 0x8b, 0x2b, 0x38, 0x55, 0xbb, 0x7b, 0x12, 0xba, 0xc9, 0xb4, 0x03, 0xf4, + 0x1a, 0xe2, 0x86, 0xfc, 0xca, 0x68, 0x34, 0xb2, 0x29, 0x21, 0x21, 0x86, 0x73, 0x68, 0xe6, 0xb4, 0x5c, 0xbe, 0xba, + 0xf5, 0x6c, 0x41, 0x86, 0x99, 0xde, 0x32, 0x59, 0x3f, 0x40, 0x59, 0xf5, 0x18, 0xda, 0xa1, 0xf7, 0xc8, 0xf1, 0xc3, + 0x83, 0x6f, 0x32, 0x7e, 0xe2, 0x70, 0xed, 0xe1, 0x5c, 0xf8, 0x2e, 0x6b, 0x46, 0xe6, 0xd0, 0x79, 0xf6, 0x71, 0xbc, + 0x87, 0x71, 0xf2, 0x69, 0x16, 0xca, 0x1b, 0xaf, 0xe9, 0x7f, 0x54, 0x7a, 0xb3, 0xc3, 0x21, 0xa7, 0x6b, 0x58, 0x71, + 0xf3, 0x2a, 0x34, 0xfc, 0x2c, 0xf2, 0xc6, 0x11, 0xaf, 0x49, 0x54, 0x75, 0x9f, 0xf7, 0x36, 0x4c, 0x69, 0xc7, 0x38, + 0x00, 0x38, 0x51, 0xab, 0x86, 0x7d, 0x69, 0x5c, 0xab, 0x83, 0x18, 0x86, 0x12, 0xb6, 0x4a, 0x1c, 0x09, 0xe5, 0x6f, + 0x00, 0xc2, 0x62, 0x28, 0x8e, 0xb7, 0x86, 0xf5, 0x01, 0xf6, 0x43, 0x17, 0x68, 0x9a, 0x53, 0xaa, 0x19, 0x00, 0x24, + 0x01, 0x7f, 0xf4, 0x74, 0xd3, 0x50, 0xd9, 0xe6, 0x79, 0x68, 0x59, 0x5d, 0xc1, 0x03, 0x3d, 0x75, 0x25, 0x03, 0xe3, + 0xaa, 0x8e, 0xbd, 0xed, 0xfd, 0xed, 0xd1, 0x2a, 0xf2, 0xbd, 0x4d, 0x6a, 0x9b, 0x55, 0xa1, 0xb1, 0x8f, 0x27, 0xf4, + 0x74, 0x02, 0xb4, 0x5e, 0x5b, 0x2a, 0xda, 0xef, 0xa3, 0x18, 0x35, 0x2e, 0x14, 0x58, 0x85, 0x89, 0x04, 0x87, 0x08, + 0x23, 0x84, 0x7e, 0x5f, 0x86, 0x5b, 0x5f, 0x90, 0x41, 0x34, 0x5c, 0x8b, 0x8e, 0x3f, 0xe4, 0x78, 0xd1, 0xb6, 0x54, + 0xd5, 0x9c, 0x34, 0x6d, 0x09, 0xbc, 0x09, 0x07, 0xd8, 0xce, 0x3f, 0x6d, 0x88, 0x5c, 0x85, 0x8b, 0x12, 0xbe, 0x27, + 0xae, 0x05, 0xd1, 0x4d, 0x6d, 0xea, 0x6d, 0xd8, 0x21, 0x3a, 0x9a, 0xe2, 0xd1, 0x21, 0xf7, 0xdc, 0x3d, 0xb7, 0x45, + 0x7c, 0xf3, 0x09, 0x72, 0xd7, 0x74, 0xf6, 0x52, 0x84, 0x41, 0xdd, 0xb2, 0x81, 0x62, 0x1d, 0x3b, 0x41, 0x01, 0x46, + 0x6d, 0xf9, 0x0b, 0xe8, 0xd8, 0x60, 0x50, 0x11, 0x7c, 0x52, 0xd8, 0x36, 0x0d, 0xf2, 0x47, 0xbc, 0x1b, 0x3a, 0xbc, + 0xb6, 0xe4, 0x81, 0x78, 0x85, 0x7d, 0xa2, 0x84, 0xfb, 0x17, 0x14, 0x74, 0x47, 0x79, 0xb9, 0x2a, 0x5c, 0x95, 0x06, + 0xa0, 0xca, 0x9e, 0xe7, 0x5a, 0x53, 0xd2, 0x02, 0x56, 0x4a, 0xea, 0xce, 0x6f, 0x22, 0xe2, 0x96, 0x4c, 0xc5, 0x6c, + 0xd5, 0x8d, 0x2a, 0x8f, 0x25, 0x8a, 0x74, 0xec, 0xd9, 0xce, 0xc1, 0x1a, 0x00, 0x4f, 0x61, 0x7b, 0x71, 0x86, 0x05, + 0x65, 0x5c, 0xb6, 0xcc, 0x25, 0x50, 0xd4, 0x0f, 0xe3, 0xbc, 0xec, 0xf9, 0x72, 0x77, 0xb4, 0xbd, 0x87, 0xde, 0x88, + 0x8d, 0xf1, 0xfa, 0x3c, 0x6a, 0xfa, 0xd9, 0x33, 0x5c, 0x59, 0x0a, 0xf2, 0x40, 0x53, 0x3d, 0xc2, 0xe8, 0x10, 0x98, + 0xa6, 0x7c, 0xc6, 0xc6, 0xd3, 0xe1, 0xd0, 0x90, 0x41, 0xaf, 0x99, 0x18, 0xff, 0xeb, 0x33, 0x68, 0x9d, 0x99, 0xb8, + 0xc6, 0xa7, 0xed, 0x2b, 0x68, 0x75, 0x8b, 0x32, 0xb9, 0x33, 0x30, 0x7c, 0xa0, 0x25, 0x53, 0x30, 0x55, 0x78, 0x43, + 0xa4, 0x92, 0xfd, 0xb5, 0xb2, 0x0e, 0xfb, 0x76, 0xa1, 0xd0, 0x42, 0x13, 0xbf, 0xca, 0x10, 0x3f, 0x75, 0x9d, 0xf9, + 0xb7, 0x69, 0x9f, 0x1a, 0xc4, 0xc2, 0x92, 0x18, 0x85, 0xf8, 0xc5, 0xa9, 0xb2, 0x9d, 0x10, 0x2a, 0x20, 0x1e, 0xba, + 0xd6, 0x8d, 0x23, 0xa9, 0x62, 0x4f, 0x0a, 0x8d, 0xa7, 0x86, 0xfb, 0x5e, 0xe8, 0x98, 0x75, 0x98, 0xc5, 0x6d, 0xd6, + 0x48, 0x6a, 0x8c, 0x53, 0x61, 0x82, 0x53, 0xca, 0x75, 0x24, 0x30, 0x3a, 0x9e, 0x2d, 0x0c, 0xa2, 0x4a, 0x62, 0x92, + 0xb1, 0xb5, 0x10, 0x26, 0x76, 0x9d, 0x2b, 0x4c, 0x53, 0x17, 0xa9, 0xdf, 0x0c, 0x4c, 0x16, 0x34, 0xe4, 0xf7, 0x68, + 0xb4, 0xa6, 0x6a, 0x0a, 0x30, 0x8c, 0xa3, 0x54, 0xe3, 0xdf, 0x22, 0xd4, 0x66, 0x18, 0x00, 0xd8, 0xe6, 0x9d, 0xcc, + 0x44, 0xf5, 0x4a, 0x20, 0x04, 0x9a, 0xb3, 0x9f, 0x2a, 0xaa, 0xbd, 0x59, 0x30, 0x8a, 0x76, 0x7b, 0xe5, 0xf3, 0x81, + 0x13, 0xca, 0x13, 0x75, 0x81, 0x7a, 0x29, 0x8b, 0xd7, 0x32, 0xe5, 0xad, 0xb8, 0x98, 0x07, 0x92, 0x7d, 0xc8, 0x47, + 0x70, 0x5e, 0xa1, 0x53, 0xb9, 0xd9, 0x26, 0xca, 0x2c, 0x49, 0x32, 0x16, 0x18, 0x9b, 0x97, 0x60, 0x2e, 0x35, 0x33, + 0x86, 0x5f, 0x43, 0x70, 0xb1, 0xbd, 0x93, 0x70, 0x7b, 0x3f, 0x0f, 0x0c, 0xa1, 0xc9, 0x45, 0x4b, 0x34, 0x6c, 0xed, + 0x78, 0x3d, 0xb9, 0x26, 0xdc, 0x87, 0x8d, 0x58, 0x93, 0x31, 0xc6, 0xb5, 0xb9, 0x91, 0xf5, 0xa3, 0x05, 0x1e, 0x8c, + 0x29, 0xeb, 0x4f, 0x20, 0xd3, 0x4a, 0xca, 0xba, 0x58, 0x1a, 0x31, 0x93, 0x4a, 0xf4, 0x6e, 0xdf, 0xf8, 0xac, 0xee, + 0x22, 0xea, 0xb7, 0xf6, 0x7b, 0x52, 0x0f, 0x77, 0xfe, 0x83, 0xc2, 0x1a, 0x54, 0x46, 0x5c, 0x46, 0x94, 0x67, 0x0e, + 0x74, 0xd3, 0xa4, 0x88, 0xd3, 0xb3, 0x75, 0x5c, 0x94, 0x3c, 0x85, 0x4a, 0x35, 0x75, 0x8b, 0x7a, 0x13, 0xb0, 0x37, + 0x44, 0x92, 0x64, 0x2d, 0x8d, 0xad, 0xd8, 0xa5, 0x41, 0x7a, 0xee, 0x0d, 0xb3, 0xf4, 0xb2, 0x42, 0x43, 0x5a, 0xea, + 0x9d, 0x85, 0x4a, 0xe6, 0xaf, 0xf8, 0xcf, 0xa0, 0x56, 0xa0, 0xa3, 0x4d, 0x8a, 0xf1, 0x0c, 0x18, 0xf1, 0xfd, 0x08, + 0x56, 0x0f, 0x10, 0x17, 0x4d, 0x50, 0xea, 0x3d, 0xb1, 0xe3, 0xa7, 0x26, 0x0f, 0xef, 0x42, 0xce, 0x19, 0x7c, 0xfa, + 0x30, 0x4b, 0xd4, 0x5a, 0x47, 0x62, 0xa4, 0x66, 0x00, 0x4d, 0x07, 0x65, 0xce, 0x63, 0x11, 0xcc, 0x7b, 0x26, 0x31, + 0xea, 0x71, 0xfd, 0x0b, 0x34, 0xd4, 0x7e, 0xb3, 0xb2, 0x3c, 0xab, 0xee, 0x3e, 0x87, 0x03, 0x9b, 0xda, 0x0a, 0x7a, + 0xbc, 0xae, 0xe4, 0xe5, 0xa5, 0xea, 0xb6, 0x5f, 0x88, 0x91, 0xd3, 0x35, 0xae, 0xa5, 0x8b, 0x6a, 0xc9, 0x7a, 0xdd, + 0xe9, 0x66, 0x71, 0x37, 0xcb, 0x68, 0x20, 0xac, 0xed, 0x7d, 0xa2, 0xf9, 0xb3, 0x66, 0xdb, 0x7d, 0xbc, 0x05, 0x31, + 0x0f, 0x00, 0x20, 0x3d, 0x88, 0x82, 0x55, 0x96, 0xf2, 0x80, 0xca, 0xfb, 0x38, 0xca, 0x42, 0xe9, 0xe5, 0x2c, 0xe3, + 0xa7, 0x4d, 0x63, 0xad, 0xb3, 0x42, 0x19, 0x5a, 0x1b, 0xdd, 0xe9, 0x3a, 0x43, 0x6c, 0x3f, 0x89, 0xb3, 0x05, 0xb8, + 0x3f, 0x66, 0x28, 0x34, 0x74, 0x96, 0x91, 0x26, 0x1a, 0xbe, 0xeb, 0x9e, 0x41, 0x46, 0x71, 0xb2, 0xce, 0x2b, 0xe9, + 0x56, 0x9f, 0xb5, 0x91, 0x30, 0xf7, 0x10, 0xfd, 0x2a, 0x06, 0x8f, 0x72, 0x9f, 0xd7, 0x46, 0x27, 0xd3, 0x32, 0xd2, + 0xee, 0xfc, 0xa4, 0x5e, 0x65, 0xa9, 0xd6, 0x61, 0xfb, 0x0c, 0x7b, 0x6b, 0x4c, 0x7a, 0x13, 0x52, 0xc3, 0x48, 0x7c, + 0x3a, 0xa3, 0x46, 0x08, 0x68, 0xcb, 0xf1, 0xf7, 0xf8, 0x0c, 0x43, 0x53, 0x60, 0xa9, 0xe2, 0x16, 0x76, 0xc3, 0xd7, + 0x7c, 0xb2, 0x6a, 0x01, 0x88, 0x60, 0xe5, 0xeb, 0x5d, 0xbc, 0x12, 0xea, 0x33, 0x6d, 0x06, 0x80, 0x2c, 0x28, 0xe5, + 0x8e, 0x9f, 0x52, 0xe9, 0x60, 0x89, 0xa2, 0xed, 0xe5, 0xf4, 0x8d, 0x8e, 0x8d, 0x1f, 0xd2, 0x73, 0x01, 0xdb, 0x85, + 0xfc, 0xd6, 0xbd, 0x7a, 0x89, 0x8a, 0xd4, 0xb6, 0x59, 0x0f, 0xf0, 0xe5, 0x06, 0x4d, 0xc2, 0x08, 0xca, 0x94, 0x29, + 0x80, 0xc1, 0x4d, 0x35, 0x0a, 0x26, 0xad, 0x46, 0xc2, 0x96, 0x7a, 0x92, 0xe5, 0xa6, 0x0f, 0x4e, 0x75, 0x8f, 0xa0, + 0x47, 0x3b, 0x9c, 0xb4, 0xec, 0xd7, 0x0a, 0x8e, 0x4e, 0xae, 0x86, 0xa8, 0x99, 0xf7, 0xda, 0x8e, 0x0c, 0x29, 0x97, + 0x61, 0x20, 0x98, 0x72, 0xcc, 0xd3, 0x63, 0xeb, 0x19, 0x11, 0x3d, 0x70, 0xf6, 0x99, 0x6e, 0xd5, 0x95, 0x04, 0x44, + 0xc7, 0xaf, 0x9f, 0xbc, 0xba, 0x8a, 0x2f, 0x0d, 0x8a, 0x52, 0xc3, 0x22, 0x46, 0x99, 0xf6, 0x55, 0x12, 0x06, 0xef, + 0x97, 0xf7, 0x3f, 0xa9, 0x2c, 0xb5, 0xdf, 0x83, 0xad, 0x15, 0x55, 0xfd, 0x52, 0xf2, 0xa2, 0x29, 0xc0, 0xba, 0xcf, + 0x12, 0x05, 0x72, 0xbf, 0xb7, 0x69, 0xe6, 0x9b, 0xa8, 0x71, 0xb3, 0x61, 0xbd, 0x71, 0xdd, 0x2e, 0xb5, 0x25, 0x3b, + 0xb2, 0x12, 0x39, 0xb3, 0x18, 0xcc, 0xf8, 0x51, 0x61, 0x50, 0x1a, 0xb6, 0xa8, 0x4a, 0xc5, 0xef, 0x8d, 0x08, 0x4e, + 0x1d, 0xab, 0x0a, 0x63, 0x1a, 0x30, 0xdb, 0x8a, 0x5a, 0x83, 0x3a, 0x28, 0xa5, 0xad, 0x89, 0xc2, 0xf6, 0x1b, 0x2b, + 0xa8, 0xf9, 0xfd, 0x4f, 0x63, 0xc8, 0xd7, 0x94, 0x82, 0x4a, 0x02, 0x76, 0x06, 0x8d, 0x9e, 0x2a, 0x61, 0x20, 0x05, + 0xc1, 0x13, 0xa0, 0x7c, 0x11, 0x35, 0x56, 0xfb, 0x7d, 0x75, 0x6a, 0x8c, 0xb6, 0x80, 0xd0, 0x42, 0x7a, 0x74, 0xd9, + 0xc7, 0x6d, 0xad, 0x03, 0x89, 0x07, 0x27, 0xd8, 0xce, 0xd5, 0x35, 0x1a, 0x09, 0xcd, 0x1f, 0x1a, 0x0d, 0x78, 0x4d, + 0x2b, 0x50, 0xa8, 0xe7, 0x38, 0x1a, 0x3a, 0x3b, 0xa4, 0x20, 0x62, 0x83, 0x16, 0xf6, 0xdd, 0xf3, 0xa1, 0xd9, 0xd7, + 0x8b, 0x64, 0x49, 0x6a, 0x2a, 0xdd, 0xe7, 0x6e, 0x09, 0x59, 0xab, 0x0e, 0x65, 0xe5, 0x01, 0x8e, 0x17, 0x4a, 0xe6, + 0xef, 0x30, 0xa9, 0x51, 0x1a, 0x13, 0x1a, 0x23, 0x16, 0xb0, 0x24, 0x68, 0xaf, 0x07, 0xea, 0x97, 0x41, 0xa8, 0x70, + 0xa6, 0x27, 0x12, 0x9f, 0x52, 0xae, 0x3e, 0x2d, 0x48, 0x3d, 0x2d, 0x98, 0x03, 0xbd, 0xf4, 0xad, 0xfc, 0xca, 0xc6, + 0x47, 0xfb, 0x7b, 0xd7, 0x5c, 0x58, 0xc7, 0x10, 0x0c, 0x5b, 0xf8, 0xcd, 0xa9, 0x29, 0x00, 0x1b, 0x9e, 0xe8, 0xb2, + 0x7c, 0xa3, 0x26, 0x32, 0x8f, 0x43, 0x12, 0x81, 0x64, 0xbb, 0xb9, 0xb9, 0x8d, 0x60, 0xdb, 0x5b, 0xa8, 0x0d, 0xf5, + 0x97, 0xb7, 0xdd, 0xef, 0x19, 0x5e, 0xee, 0xc9, 0xbd, 0x9b, 0x36, 0x94, 0x3f, 0xdc, 0xbf, 0x4a, 0xfe, 0xaf, 0x2a, + 0xb9, 0xdf, 0x2a, 0xb3, 0x6e, 0x8b, 0xf7, 0xbb, 0x8e, 0x5b, 0x8e, 0xd1, 0x20, 0xb0, 0xa6, 0xc0, 0x40, 0x7a, 0xd2, + 0x98, 0x26, 0x3a, 0xa4, 0x32, 0x63, 0x06, 0x8f, 0x2e, 0x40, 0x73, 0x98, 0xce, 0xf3, 0x18, 0x80, 0x03, 0xfc, 0x23, + 0x8f, 0x50, 0xff, 0x74, 0x5e, 0x04, 0x67, 0xc1, 0xa0, 0x1c, 0x04, 0xfa, 0x13, 0xd7, 0x9c, 0x60, 0x09, 0x3a, 0xb7, + 0x98, 0x41, 0xb0, 0x49, 0x6b, 0xe6, 0x10, 0x1f, 0x27, 0xd3, 0xc1, 0x20, 0x26, 0x5b, 0x00, 0xe9, 0x8b, 0x97, 0xd6, + 0x39, 0xa8, 0xd0, 0x0b, 0xb2, 0x55, 0x77, 0xd1, 0xac, 0xd8, 0xab, 0x76, 0x9a, 0xf7, 0xfb, 0xf9, 0xa2, 0x1c, 0x04, + 0x8d, 0x0a, 0x0b, 0xe3, 0xfd, 0x47, 0x9b, 0x5f, 0x1a, 0x9d, 0x34, 0xc1, 0x30, 0xb5, 0x27, 0xa8, 0x5e, 0xf1, 0x34, + 0xa3, 0x8d, 0xdb, 0xb1, 0x52, 0xbe, 0x80, 0x28, 0x1e, 0x18, 0xb2, 0x56, 0xde, 0xbd, 0x83, 0xd7, 0xe5, 0xc6, 0x9b, + 0x23, 0x0a, 0xb0, 0x9b, 0xc2, 0x38, 0xa9, 0xb9, 0xe8, 0xa2, 0x26, 0x9e, 0xc1, 0x4e, 0x57, 0x6f, 0x25, 0x5a, 0x8d, + 0xf7, 0xe2, 0x7d, 0xb3, 0xf1, 0x37, 0xf2, 0x40, 0x97, 0x79, 0x70, 0x01, 0x88, 0xb3, 0x07, 0x71, 0x75, 0x80, 0xa5, + 0x1e, 0x04, 0x03, 0x8b, 0x1c, 0xd2, 0xae, 0x56, 0x0f, 0x45, 0xa4, 0xce, 0x63, 0x30, 0x60, 0x32, 0x0d, 0xa9, 0xc9, + 0xb4, 0x57, 0x28, 0x48, 0x1b, 0x6b, 0x2d, 0xa0, 0x0d, 0x87, 0xc5, 0x9e, 0xdd, 0xb0, 0x3b, 0xdd, 0x3a, 0x14, 0x4a, + 0x18, 0xbd, 0xba, 0x6e, 0x1e, 0x6a, 0x0d, 0x4f, 0x04, 0x3d, 0xa8, 0x46, 0xfb, 0xe9, 0xa1, 0x3c, 0x69, 0x8f, 0x05, + 0xb8, 0xe8, 0xe1, 0xcb, 0x17, 0x02, 0x2f, 0xda, 0x7b, 0xc8, 0x73, 0xe6, 0x53, 0xe5, 0x83, 0xd8, 0x70, 0xcb, 0xf0, + 0xa1, 0x7d, 0x7c, 0x2b, 0x90, 0x49, 0xdd, 0xd1, 0xd4, 0xd6, 0xee, 0x68, 0x1c, 0x13, 0xe8, 0x37, 0xe5, 0x28, 0x65, + 0x62, 0x6a, 0x59, 0xb1, 0x59, 0x2f, 0x57, 0xde, 0x50, 0x29, 0x9b, 0xad, 0xda, 0x9c, 0x5f, 0xda, 0x48, 0xe8, 0xf7, + 0xb5, 0x3b, 0x10, 0xbe, 0x51, 0xeb, 0x0d, 0x79, 0xd9, 0x10, 0xb1, 0x1c, 0x62, 0x06, 0x8e, 0x17, 0x52, 0xb9, 0x76, + 0x17, 0x4d, 0x55, 0xdd, 0xde, 0x56, 0x2e, 0x68, 0x89, 0xb7, 0x52, 0x60, 0x15, 0xa9, 0xd3, 0xeb, 0xa9, 0xc4, 0xfb, + 0x3e, 0x8a, 0xed, 0x47, 0xc0, 0x36, 0x36, 0x8e, 0xc6, 0xc6, 0x2d, 0x62, 0x8b, 0xaf, 0xa2, 0x8a, 0x16, 0x1c, 0x20, + 0xb8, 0xdb, 0x92, 0x5a, 0x9a, 0x39, 0xc4, 0x7d, 0xc5, 0x03, 0xb4, 0xef, 0xe2, 0x88, 0x53, 0x01, 0xb6, 0x75, 0xad, + 0x73, 0x56, 0xcb, 0x01, 0x9b, 0x89, 0x9e, 0x7f, 0x5a, 0x35, 0x12, 0x31, 0xac, 0xb2, 0x91, 0xb2, 0x42, 0x7b, 0x50, + 0xba, 0x84, 0x8b, 0x2f, 0xc0, 0xcb, 0xf6, 0xfd, 0xca, 0xee, 0xb3, 0x15, 0xf6, 0x0f, 0xf3, 0xaa, 0x09, 0x1e, 0x79, + 0x8d, 0xb7, 0xf7, 0x30, 0xf1, 0xb9, 0x52, 0x08, 0xaf, 0x52, 0x1a, 0x4a, 0x00, 0x06, 0x49, 0x50, 0xc3, 0x95, 0xb6, + 0xcd, 0x20, 0x95, 0x31, 0xec, 0x7e, 0xf5, 0x56, 0xff, 0xa7, 0x55, 0xb8, 0xa8, 0x64, 0x31, 0x26, 0x81, 0xce, 0xa9, + 0x96, 0x9b, 0x98, 0x82, 0x67, 0xfb, 0xe4, 0x08, 0x14, 0x76, 0x02, 0xb8, 0xa1, 0x84, 0xfd, 0x82, 0xb7, 0xa1, 0x9c, + 0xbd, 0xb4, 0x92, 0x27, 0xb7, 0x2f, 0xa9, 0xa0, 0x09, 0x99, 0x0a, 0xbb, 0x7f, 0x5b, 0x1b, 0xf6, 0x79, 0x28, 0x47, + 0x52, 0xe0, 0xe2, 0xa0, 0x0b, 0x00, 0xfb, 0x83, 0x5c, 0xc6, 0xe6, 0x33, 0xe9, 0xf7, 0xd5, 0xfb, 0x67, 0x79, 0x96, + 0x7c, 0xdc, 0x7b, 0x6f, 0x78, 0x9a, 0x15, 0x03, 0x2a, 0x11, 0x53, 0xeb, 0xaa, 0x18, 0xae, 0xb4, 0x8b, 0x71, 0x83, + 0x64, 0xc4, 0xf7, 0x52, 0x87, 0x18, 0x31, 0xbe, 0xc8, 0x1e, 0x49, 0xc9, 0xe9, 0xaa, 0xee, 0xec, 0xb9, 0x16, 0xcd, + 0xa0, 0x31, 0xdc, 0x9e, 0xf7, 0x92, 0x5e, 0x01, 0x2a, 0x2a, 0x74, 0xcf, 0x02, 0xd7, 0xf0, 0xe6, 0x92, 0x68, 0x6c, + 0xe9, 0x69, 0x4b, 0x34, 0x70, 0xaf, 0x4c, 0x48, 0xaa, 0x8d, 0x03, 0x2c, 0x62, 0x5d, 0x7f, 0x0c, 0x25, 0x00, 0xb5, + 0x1a, 0xa4, 0x57, 0xfa, 0x92, 0x50, 0x95, 0x84, 0x60, 0x74, 0x22, 0xe1, 0x65, 0x40, 0xe3, 0xcc, 0x24, 0x5a, 0xd8, + 0xe0, 0x80, 0x3e, 0xaf, 0x4c, 0xa2, 0xb1, 0x21, 0x0f, 0x68, 0x65, 0xd3, 0x00, 0x06, 0x1f, 0x24, 0x49, 0xf4, 0xd5, + 0xca, 0x24, 0x81, 0xa0, 0x04, 0xe5, 0x1b, 0xf4, 0xe7, 0xd2, 0xf3, 0xb1, 0xfc, 0x97, 0x77, 0x28, 0xfd, 0x10, 0x4a, + 0x90, 0x29, 0xea, 0x8a, 0x69, 0xc6, 0x66, 0x59, 0xb7, 0x31, 0x89, 0xe7, 0x69, 0x77, 0x5b, 0x28, 0x97, 0x2e, 0xf0, + 0x2b, 0xcb, 0x10, 0xc7, 0xfa, 0x59, 0xbc, 0x66, 0x27, 0x21, 0xd7, 0x78, 0xe9, 0xcf, 0xe2, 0x35, 0xce, 0x10, 0xad, + 0x5a, 0x09, 0x44, 0xf9, 0xaf, 0xda, 0xc0, 0x21, 0xee, 0x13, 0x0c, 0x72, 0x51, 0x79, 0x0f, 0x04, 0xf2, 0xb6, 0x82, + 0x88, 0x34, 0xb3, 0xeb, 0x30, 0x22, 0xd5, 0x5e, 0x92, 0xf9, 0xf2, 0x47, 0x99, 0x09, 0xef, 0x1b, 0x78, 0x6c, 0x36, + 0xcb, 0xa6, 0x98, 0x2f, 0x54, 0x30, 0x07, 0xf7, 0x89, 0x8a, 0x4b, 0x51, 0xf9, 0x4f, 0xd8, 0x05, 0x2f, 0xc6, 0x83, + 0xd7, 0x6b, 0x04, 0xd8, 0xaf, 0xfc, 0x27, 0x6f, 0xcc, 0xde, 0x58, 0x37, 0xbe, 0xcc, 0x44, 0x7c, 0xe0, 0xa3, 0x5b, + 0xca, 0x47, 0x77, 0x5e, 0xa6, 0x3f, 0x1a, 0x50, 0x22, 0xa3, 0xb2, 0xe2, 0xeb, 0x35, 0x4f, 0xe7, 0xb7, 0x49, 0x94, + 0x8d, 0x2a, 0x2e, 0x60, 0x7a, 0xc1, 0xf1, 0x2e, 0xd9, 0x9c, 0x67, 0xc9, 0x2b, 0x88, 0x3d, 0xb0, 0x96, 0x0a, 0x8b, + 0x1f, 0x96, 0x99, 0x5a, 0xcc, 0x42, 0x56, 0x52, 0xf0, 0x60, 0x7e, 0x9d, 0x44, 0x6f, 0x56, 0x1e, 0x92, 0x9a, 0x99, + 0xb2, 0x6d, 0xed, 0x08, 0xb5, 0xf1, 0x75, 0xa4, 0x5b, 0x6d, 0x01, 0x00, 0xf7, 0x6c, 0x91, 0x46, 0x92, 0x89, 0xe1, + 0xa4, 0x66, 0xdc, 0xa4, 0x17, 0x98, 0x1a, 0xd7, 0xac, 0xa2, 0x89, 0xb3, 0x90, 0x01, 0xbd, 0x3f, 0xe0, 0xe5, 0xe0, + 0x73, 0x06, 0xf7, 0x1f, 0xb4, 0x06, 0x2e, 0x8f, 0x8b, 0x7e, 0x5f, 0x1e, 0x17, 0xbb, 0x5d, 0x39, 0x8b, 0xfb, 0x7d, + 0x39, 0x8b, 0x0d, 0xff, 0xa0, 0x14, 0xdb, 0xc6, 0xdc, 0x20, 0xa1, 0xb9, 0x84, 0xa8, 0x45, 0x23, 0xf8, 0x43, 0xb3, + 0x9c, 0x8b, 0x28, 0x3f, 0x4e, 0xfa, 0xfd, 0xde, 0x6a, 0x2e, 0x06, 0xf9, 0x30, 0x89, 0xf2, 0x61, 0xe2, 0x39, 0x21, + 0xfe, 0xea, 0x39, 0x21, 0x2a, 0x1a, 0xb8, 0x86, 0x33, 0x03, 0x10, 0x05, 0x7c, 0xfa, 0x47, 0x75, 0x2d, 0x85, 0xae, + 0x25, 0x56, 0xb5, 0x24, 0xba, 0x82, 0x9a, 0x5d, 0x17, 0x61, 0x89, 0xa5, 0xd0, 0x15, 0xfb, 0x63, 0x05, 0x3c, 0x51, + 0xce, 0xab, 0x2d, 0x30, 0xb0, 0x11, 0xde, 0x39, 0x4c, 0x38, 0x89, 0x4d, 0x0d, 0x68, 0xa7, 0xdb, 0x9a, 0x5e, 0xd0, + 0x35, 0xbd, 0x44, 0x7e, 0xf6, 0x02, 0x0c, 0x96, 0x8e, 0x59, 0x3e, 0x1d, 0x0c, 0x2e, 0xc8, 0x9a, 0x95, 0x8b, 0x30, + 0x1e, 0x84, 0x9b, 0x79, 0x3e, 0xbc, 0x88, 0x2e, 0x08, 0xf9, 0xa2, 0x58, 0xd2, 0xde, 0x7a, 0x54, 0x7e, 0xcc, 0x20, + 0xb8, 0x5f, 0x3a, 0x0f, 0x33, 0x13, 0xe7, 0x63, 0x3d, 0xba, 0xa5, 0x6b, 0x88, 0x5f, 0x03, 0x37, 0x12, 0x12, 0x41, + 0x47, 0x2e, 0xe9, 0x9a, 0x6e, 0xa8, 0x34, 0x33, 0x8c, 0x21, 0xba, 0xed, 0x71, 0x92, 0x80, 0x63, 0xb2, 0x2b, 0x3e, + 0x1a, 0xab, 0xc2, 0xbb, 0xbe, 0x23, 0xb4, 0xd7, 0x4b, 0xdc, 0x20, 0x7d, 0xd7, 0x1e, 0x24, 0x60, 0x44, 0x46, 0x6a, + 0xa0, 0xcc, 0xc8, 0x48, 0x6a, 0x26, 0x15, 0x87, 0x24, 0xf6, 0x87, 0x44, 0x8d, 0x43, 0xe2, 0x8f, 0x43, 0xae, 0xc7, + 0x01, 0xb9, 0xfb, 0x15, 0x1b, 0xd3, 0x94, 0x8d, 0xe9, 0x46, 0x8d, 0x0a, 0xbd, 0xa2, 0xe7, 0x9a, 0x3a, 0x9e, 0xb1, + 0xd7, 0x70, 0x60, 0x0f, 0xc2, 0x7c, 0x1e, 0x0f, 0x5f, 0x47, 0xaf, 0x09, 0xf9, 0x42, 0xd2, 0x6b, 0x75, 0x29, 0x83, + 0x30, 0x88, 0x57, 0xe0, 0x5c, 0xea, 0x42, 0x9d, 0x5c, 0x99, 0x1d, 0x87, 0x4f, 0x97, 0x8d, 0xa7, 0x73, 0x88, 0xe8, + 0x83, 0x56, 0x2a, 0xfd, 0x7e, 0x78, 0xc1, 0xca, 0xc5, 0x59, 0x38, 0x26, 0x80, 0xc3, 0xa3, 0x87, 0xf3, 0x62, 0x74, + 0x4b, 0x2f, 0x46, 0x77, 0x04, 0x2c, 0xbc, 0xc6, 0xd3, 0xcd, 0x31, 0x8b, 0xa7, 0x83, 0xc1, 0x06, 0xa9, 0xba, 0xca, + 0xbd, 0x21, 0x4b, 0x7a, 0x81, 0x13, 0x41, 0x80, 0xa1, 0xcf, 0xc4, 0xc6, 0xd0, 0xf0, 0xd7, 0x0c, 0x3e, 0xbe, 0x63, + 0x17, 0xa3, 0x3b, 0x7a, 0xcb, 0x5e, 0xef, 0xc6, 0x53, 0x60, 0xa6, 0xd6, 0xf3, 0xf0, 0xee, 0xf8, 0x72, 0x7e, 0xc9, + 0xee, 0xa2, 0xbb, 0x19, 0x34, 0xf4, 0x8a, 0xdd, 0x21, 0xe0, 0x52, 0xfa, 0x78, 0x35, 0x78, 0x4d, 0x0e, 0x07, 0x83, + 0x94, 0x44, 0xe1, 0x75, 0xe8, 0xb5, 0xf2, 0x35, 0xbd, 0x23, 0x74, 0xcd, 0x6e, 0x71, 0x34, 0x2e, 0x19, 0x7e, 0x70, + 0xce, 0xee, 0xea, 0xeb, 0xd0, 0xdb, 0xcd, 0x89, 0xe8, 0x04, 0x31, 0x42, 0x5f, 0x03, 0x47, 0xb3, 0x5c, 0x98, 0x09, + 0x78, 0x32, 0x17, 0x19, 0x2d, 0x0a, 0xcd, 0x40, 0x9c, 0x95, 0x80, 0x58, 0x12, 0x75, 0xbf, 0xd9, 0xe8, 0x0c, 0x96, + 0x73, 0xbf, 0xdf, 0xab, 0x0c, 0x3d, 0x40, 0xe4, 0xcc, 0x4e, 0x7a, 0xd0, 0xf3, 0xe9, 0x01, 0x7e, 0xa2, 0x57, 0x0d, + 0xe2, 0x64, 0x7e, 0xb7, 0x8a, 0x7e, 0xf5, 0xe8, 0xc3, 0x0f, 0xdd, 0x94, 0x47, 0xe4, 0xff, 0x3e, 0xe5, 0x29, 0xf3, + 0xe8, 0x75, 0xe5, 0x81, 0xe0, 0x79, 0x6b, 0x52, 0x69, 0x24, 0xaa, 0xd1, 0xd9, 0x3a, 0x06, 0x6d, 0x24, 0x6a, 0x1b, + 0xf4, 0x13, 0x5a, 0x58, 0x41, 0x84, 0x9c, 0xa3, 0xe7, 0x60, 0x90, 0x0a, 0xa1, 0x72, 0xd4, 0xa2, 0x44, 0x43, 0x90, + 0x5c, 0x96, 0x5c, 0x85, 0xcf, 0x21, 0x54, 0x9d, 0x3e, 0xce, 0x44, 0xd8, 0xd0, 0xe3, 0xd0, 0x07, 0x80, 0xff, 0x65, + 0x8f, 0x5c, 0x94, 0xfc, 0x12, 0xcf, 0xe6, 0x36, 0xc1, 0x28, 0x58, 0x22, 0x9a, 0xa1, 0x6d, 0x10, 0xfb, 0xb1, 0x24, + 0x58, 0x8f, 0xa4, 0xf1, 0xa8, 0x34, 0x47, 0x84, 0x1f, 0xc5, 0x47, 0xd1, 0xd3, 0xd8, 0x90, 0x48, 0x8e, 0x24, 0x92, + 0x0f, 0x80, 0x70, 0x12, 0xf4, 0x17, 0x77, 0x4d, 0x76, 0x2d, 0x24, 0x06, 0xfd, 0x69, 0xc5, 0xb4, 0xec, 0x5e, 0xf5, + 0xd8, 0x57, 0x04, 0xb9, 0x63, 0xfa, 0x4f, 0xaf, 0x0f, 0xff, 0x5c, 0xe1, 0x0c, 0x5a, 0xcf, 0x17, 0xd5, 0x99, 0xb9, + 0x37, 0xb8, 0x91, 0xd7, 0x65, 0xed, 0xba, 0x7c, 0xc1, 0x0f, 0xf8, 0x6d, 0xc5, 0x45, 0x5a, 0x1e, 0xfc, 0x5c, 0xb5, + 0xf1, 0x9c, 0xca, 0xcd, 0xda, 0xc5, 0x59, 0x51, 0xc6, 0xa9, 0x9e, 0xd4, 0xc5, 0x58, 0xc3, 0x36, 0xfc, 0x1e, 0x51, + 0x57, 0xd2, 0x72, 0xf4, 0x94, 0x72, 0xdd, 0x4c, 0xb9, 0xd8, 0xe4, 0xf9, 0x4f, 0x7b, 0xa9, 0x38, 0xc5, 0xcd, 0x14, + 0xa4, 0x4a, 0x2d, 0x17, 0x50, 0x3d, 0x47, 0x2d, 0x77, 0x4b, 0xb3, 0x03, 0x9c, 0xdb, 0xa6, 0xfa, 0x58, 0x99, 0x5d, + 0x78, 0xc9, 0x8d, 0xfb, 0x93, 0x29, 0xc3, 0x82, 0x51, 0x68, 0xb3, 0xea, 0x4a, 0xdb, 0x17, 0x5a, 0xa7, 0x61, 0xb8, + 0xf2, 0xe3, 0x05, 0xa4, 0x0b, 0x18, 0xc7, 0x8b, 0x92, 0x89, 0x71, 0x7b, 0xf4, 0x56, 0x10, 0x9f, 0xb3, 0x15, 0x08, + 0x98, 0x6b, 0x78, 0xbb, 0xae, 0xa3, 0xed, 0x9e, 0x38, 0x65, 0x54, 0xae, 0x63, 0xf1, 0x7d, 0xbc, 0x36, 0x90, 0xc9, + 0xea, 0x78, 0x6c, 0x8c, 0xe9, 0xf4, 0xef, 0x49, 0xe8, 0x17, 0x42, 0xc1, 0x67, 0xbd, 0xb4, 0xf2, 0xe4, 0xf6, 0xb0, + 0x8c, 0x6b, 0xf4, 0x4a, 0x5c, 0xeb, 0xbe, 0x19, 0x29, 0xa4, 0x1e, 0xf9, 0xaa, 0x29, 0xa0, 0x37, 0x63, 0xdf, 0x4c, + 0x85, 0x79, 0xbb, 0x67, 0xcc, 0x15, 0x82, 0x95, 0x2a, 0xbb, 0x7d, 0xa7, 0xc6, 0x54, 0xcc, 0x60, 0x8a, 0x6d, 0x67, + 0x31, 0xe9, 0x56, 0xfe, 0x69, 0xe7, 0x7e, 0x95, 0x77, 0xb8, 0x2b, 0xea, 0xb7, 0xc0, 0x85, 0x66, 0x45, 0x59, 0xb5, + 0x65, 0xc3, 0xb6, 0xf1, 0x46, 0x16, 0x8a, 0x0d, 0xb0, 0xec, 0xb9, 0x6f, 0xe1, 0x01, 0xe2, 0x26, 0xdc, 0xb3, 0xcb, + 0x1a, 0x6e, 0x0c, 0x9f, 0x57, 0x92, 0xef, 0x4a, 0x63, 0x2e, 0x7d, 0xaa, 0x34, 0x31, 0x9c, 0x2c, 0x47, 0x5c, 0xa4, + 0xcb, 0x3a, 0xb3, 0x6b, 0xe1, 0x13, 0x5e, 0x86, 0x0b, 0xbe, 0x34, 0xba, 0x29, 0x5d, 0x7a, 0xc1, 0x62, 0xdd, 0xe9, + 0xed, 0x5a, 0x63, 0xa5, 0x44, 0xdc, 0x9a, 0x65, 0x02, 0x65, 0x29, 0x6b, 0x25, 0xbc, 0x29, 0x5a, 0xb6, 0x92, 0x46, + 0xde, 0xb3, 0x00, 0xf7, 0xb1, 0x1f, 0x10, 0x13, 0xd9, 0x04, 0x26, 0x45, 0x43, 0x07, 0xb4, 0xab, 0x2e, 0x7c, 0x33, + 0xea, 0xc1, 0x20, 0xb7, 0x24, 0x11, 0x2b, 0x48, 0xb1, 0x82, 0x4d, 0xcd, 0x8a, 0x45, 0xbe, 0xa4, 0x17, 0x4c, 0x2e, + 0xd2, 0x25, 0x5d, 0x33, 0xb9, 0xd8, 0xe0, 0x4d, 0xe8, 0x02, 0x4e, 0x48, 0xb2, 0x8d, 0x95, 0x02, 0xf6, 0x02, 0x2f, + 0x6f, 0x78, 0xa6, 0x6a, 0x5a, 0x76, 0xa9, 0x38, 0xc0, 0xf8, 0xbc, 0x0c, 0xc3, 0x72, 0x78, 0x01, 0xd6, 0x12, 0x87, + 0xe1, 0x7a, 0xc1, 0x97, 0xea, 0x37, 0x04, 0x9c, 0x4f, 0x42, 0xc5, 0x2e, 0xd8, 0xbd, 0x40, 0xa6, 0x57, 0x0b, 0xbe, + 0x54, 0x23, 0xa1, 0x0b, 0xbe, 0xb2, 0xc6, 0x26, 0xb1, 0x27, 0x68, 0x99, 0xc7, 0x8b, 0xf1, 0x32, 0x8a, 0x6b, 0x58, + 0x86, 0xa7, 0x6a, 0x66, 0x5a, 0xf2, 0x9f, 0x44, 0x6d, 0x68, 0xa2, 0x6f, 0xb0, 0x8a, 0xfc, 0xe1, 0xf1, 0xd1, 0x25, + 0x90, 0xb1, 0xb3, 0x2b, 0x99, 0xf9, 0xd0, 0xf7, 0x91, 0xc1, 0x3d, 0x37, 0xe5, 0x8c, 0xab, 0x20, 0x51, 0x06, 0xee, + 0x5e, 0xcd, 0x92, 0xb1, 0x16, 0xe1, 0xfb, 0x47, 0x45, 0xd1, 0x67, 0xd2, 0x34, 0xa0, 0xfb, 0x48, 0x30, 0x07, 0x7a, + 0xaf, 0xd0, 0xe1, 0xb2, 0xda, 0x66, 0x02, 0xfe, 0x22, 0x41, 0x7e, 0x2b, 0xf4, 0xaa, 0xc6, 0xa0, 0x8a, 0x76, 0x11, + 0x4b, 0xff, 0x3e, 0xe2, 0x47, 0xd9, 0xfc, 0xd3, 0xdc, 0xe3, 0x95, 0x84, 0xc1, 0x0f, 0xa9, 0xd9, 0x24, 0xf3, 0xf6, + 0x8a, 0x7d, 0x0f, 0x1d, 0xf5, 0xa8, 0x35, 0xde, 0x57, 0x2f, 0x38, 0x85, 0x18, 0x25, 0x14, 0x9d, 0x04, 0x03, 0xb8, + 0x5d, 0x42, 0x8a, 0xbb, 0xc1, 0x6e, 0x9b, 0xd7, 0xbc, 0x28, 0x38, 0xdf, 0x54, 0x55, 0xe0, 0x07, 0x34, 0x5c, 0x2c, + 0xf7, 0x43, 0x18, 0x8e, 0x69, 0xeb, 0x1a, 0x06, 0x61, 0xc6, 0x30, 0x12, 0x82, 0xd7, 0xbf, 0xe8, 0x2b, 0x9a, 0xc4, + 0xeb, 0xef, 0xf8, 0x5f, 0x19, 0x2f, 0x14, 0x91, 0x06, 0x11, 0x52, 0x37, 0xf1, 0x8d, 0x4c, 0x93, 0x02, 0x0a, 0x01, + 0x46, 0x01, 0x95, 0xd8, 0xd0, 0x54, 0xfc, 0xad, 0x16, 0x1f, 0xfc, 0xd4, 0x74, 0x3c, 0x1a, 0xd7, 0xad, 0xce, 0xa8, + 0xa0, 0x33, 0xd0, 0xa3, 0x56, 0xd4, 0xd3, 0xa0, 0x95, 0x60, 0x1a, 0x69, 0xde, 0xba, 0x87, 0xc0, 0x2b, 0xd3, 0xe2, + 0x9d, 0x07, 0x74, 0x7b, 0xe6, 0x83, 0x27, 0x8f, 0xe9, 0x99, 0x43, 0x4f, 0xae, 0xd8, 0xac, 0xea, 0xa1, 0xf6, 0xde, + 0x8c, 0x50, 0xd0, 0xef, 0x63, 0x0a, 0x74, 0x23, 0xa8, 0xbd, 0xab, 0xfb, 0x8f, 0xe5, 0x3e, 0x87, 0xef, 0x38, 0xcb, + 0x2d, 0x60, 0xa9, 0xc8, 0x5a, 0x81, 0x47, 0x01, 0xea, 0x52, 0x19, 0xc2, 0x16, 0x73, 0x38, 0x54, 0x76, 0xab, 0x56, + 0x43, 0x49, 0x8e, 0xcb, 0x11, 0x38, 0x84, 0x6e, 0xca, 0x41, 0x39, 0x5a, 0x65, 0xd5, 0x7b, 0xfc, 0xad, 0x59, 0x87, + 0x24, 0xbb, 0x8f, 0x75, 0xe0, 0x96, 0x75, 0x98, 0x7e, 0x34, 0x48, 0x01, 0x68, 0xb2, 0x11, 0xb8, 0x04, 0xe0, 0xbd, + 0xfd, 0x47, 0x84, 0x5a, 0x99, 0xde, 0xcb, 0x58, 0xa8, 0xef, 0x1b, 0x49, 0x50, 0x42, 0x33, 0xa1, 0x72, 0x2c, 0x05, + 0xef, 0x3c, 0xd2, 0x39, 0xa9, 0x33, 0xf1, 0x1e, 0xc4, 0x69, 0xe1, 0x03, 0x7b, 0x0b, 0x82, 0x73, 0x16, 0xf4, 0x0e, + 0x6f, 0xb3, 0x5a, 0x6a, 0xa3, 0x07, 0x0a, 0xe0, 0x77, 0x83, 0x3b, 0x04, 0xf9, 0x6a, 0x0c, 0xd7, 0x5a, 0xde, 0x84, + 0x7c, 0x58, 0xd0, 0x23, 0x32, 0xb0, 0xcf, 0x62, 0x18, 0xd3, 0x23, 0x72, 0x6c, 0x9f, 0xa5, 0x1b, 0xc0, 0x81, 0xd4, + 0xa3, 0x4a, 0x8f, 0xa0, 0x41, 0xbf, 0xd9, 0x16, 0x59, 0x92, 0xf5, 0x63, 0x69, 0x14, 0x31, 0x50, 0x25, 0x88, 0xa8, + 0xc5, 0x3f, 0x1f, 0xcc, 0x75, 0x87, 0xb9, 0x40, 0x98, 0x83, 0x01, 0x07, 0x71, 0x1b, 0x84, 0xe6, 0x80, 0xd9, 0xde, + 0x46, 0x82, 0xde, 0x59, 0xc3, 0xcc, 0x8e, 0xfe, 0x70, 0x2b, 0xc1, 0x37, 0x59, 0x6b, 0xd4, 0x79, 0x71, 0x08, 0x04, + 0xc1, 0x9b, 0x42, 0x55, 0x7b, 0xd5, 0x03, 0x1b, 0x6f, 0xd5, 0x8f, 0xdd, 0x6e, 0x3c, 0x15, 0xee, 0xda, 0x2f, 0x28, + 0x9c, 0x7c, 0x4a, 0xfe, 0xf5, 0xde, 0x64, 0x70, 0x60, 0x64, 0xf8, 0xd2, 0xdb, 0xbf, 0xf0, 0xb5, 0x96, 0xee, 0x89, + 0x41, 0x49, 0x1e, 0x1f, 0x29, 0xfa, 0x77, 0xaf, 0xac, 0x7c, 0x6a, 0xa7, 0x7f, 0xb7, 0x33, 0xeb, 0xf3, 0x78, 0x34, + 0xd9, 0xed, 0x7a, 0xda, 0xc0, 0x95, 0x6a, 0x15, 0x02, 0x76, 0xa1, 0x24, 0x87, 0x47, 0x10, 0x15, 0xa1, 0x19, 0x77, + 0xb3, 0x6c, 0x48, 0x64, 0xfc, 0x38, 0x9d, 0x65, 0x43, 0xb0, 0xc3, 0xbd, 0xa8, 0xc4, 0xe5, 0xa8, 0xb5, 0xc1, 0xe9, + 0x59, 0x12, 0x42, 0x28, 0x07, 0xac, 0xec, 0x56, 0xfd, 0xb9, 0x53, 0x66, 0x42, 0x6a, 0xb2, 0xba, 0x9d, 0xd2, 0x3d, + 0x4c, 0xf3, 0x03, 0x33, 0x82, 0x03, 0xee, 0xed, 0xaf, 0xfa, 0x63, 0x98, 0x64, 0x9a, 0x9c, 0x22, 0xf9, 0x45, 0x7a, + 0x0a, 0x49, 0x7b, 0xf4, 0x54, 0x11, 0xc0, 0x09, 0xb5, 0x1f, 0xc3, 0x6f, 0x18, 0xf7, 0xef, 0x9a, 0xaf, 0xdd, 0x54, + 0x44, 0x4f, 0x28, 0x96, 0xa9, 0xc9, 0x69, 0x92, 0x15, 0x09, 0x44, 0x6d, 0x54, 0xcd, 0x88, 0xbe, 0x72, 0x31, 0x1f, + 0x15, 0xe1, 0xf3, 0x6a, 0xfd, 0x9f, 0x21, 0x7c, 0x46, 0xe1, 0x06, 0x70, 0x79, 0xc5, 0xe5, 0x79, 0xf8, 0xf4, 0x09, + 0x3d, 0x98, 0x7c, 0x7d, 0x44, 0x0f, 0x8e, 0xbe, 0x7a, 0x4a, 0x00, 0x16, 0xed, 0xf2, 0x3c, 0x3c, 0x7a, 0xfa, 0x94, + 0x1e, 0x7c, 0xfb, 0x2d, 0x3d, 0x98, 0x7c, 0x75, 0xd4, 0x48, 0x9b, 0x3c, 0xfd, 0x96, 0x1e, 0x7c, 0xfd, 0xa4, 0x91, + 0x76, 0x34, 0x7e, 0x4a, 0x0f, 0xbe, 0xf9, 0xda, 0xa4, 0xfd, 0x0d, 0xb2, 0x7d, 0x7b, 0x84, 0xff, 0x99, 0xb4, 0xc9, + 0xd3, 0xaf, 0xe8, 0xc1, 0x64, 0x0c, 0x95, 0x3c, 0x75, 0x95, 0x8c, 0x27, 0xf0, 0xf1, 0x57, 0xf0, 0xdf, 0xdf, 0x48, + 0xb0, 0xa4, 0x95, 0x64, 0xb9, 0x40, 0xfd, 0x19, 0x8a, 0x38, 0x51, 0x35, 0x91, 0xf0, 0x10, 0x33, 0xab, 0x6f, 0xe2, + 0x30, 0x20, 0x2e, 0x1d, 0x0a, 0xa2, 0x07, 0xe3, 0xd1, 0x53, 0x12, 0xf8, 0xf0, 0x74, 0x37, 0x3e, 0xc8, 0x58, 0x2e, + 0x16, 0xd9, 0x17, 0xb9, 0x89, 0xad, 0xe0, 0x01, 0x58, 0x7d, 0xf4, 0x73, 0x55, 0x72, 0x91, 0x7d, 0x51, 0xc9, 0xfd, + 0x5c, 0xbf, 0xb5, 0x00, 0xe5, 0xfd, 0x55, 0xcb, 0x6e, 0x0a, 0x15, 0x3a, 0xad, 0x35, 0xfa, 0xec, 0x23, 0xa6, 0x0f, + 0x06, 0xde, 0x0d, 0xfb, 0xef, 0x7b, 0xe5, 0xb4, 0xbe, 0xd1, 0x28, 0xd4, 0xa8, 0x3c, 0x24, 0x6c, 0x06, 0x45, 0x0f, + 0x06, 0xc0, 0x13, 0x78, 0xb8, 0x6f, 0xff, 0x66, 0x19, 0x1f, 0x3b, 0xca, 0xf8, 0x19, 0x65, 0x08, 0x68, 0xd4, 0xc3, + 0xec, 0xa6, 0x87, 0x8d, 0x6e, 0xf5, 0x92, 0xa5, 0x3a, 0x99, 0x9a, 0x9e, 0xc1, 0xbe, 0xd6, 0xb5, 0x3c, 0x30, 0xa2, + 0x68, 0x79, 0x71, 0x90, 0xf2, 0x79, 0xc5, 0xfe, 0xbe, 0x42, 0xf5, 0x56, 0xd4, 0x78, 0x23, 0xb3, 0x79, 0xc5, 0xbe, + 0x37, 0x6f, 0x80, 0x9b, 0x61, 0xbf, 0xa9, 0x27, 0x3f, 0x70, 0x06, 0x97, 0xb6, 0x3d, 0xca, 0xc4, 0x08, 0xb0, 0x02, + 0x32, 0x70, 0xe0, 0x01, 0xd0, 0x41, 0x7f, 0xb4, 0x77, 0x3b, 0x95, 0xd2, 0xec, 0xb3, 0x85, 0x01, 0x34, 0xcc, 0xdb, + 0xc4, 0x95, 0xfd, 0xaf, 0x86, 0xbc, 0x04, 0x85, 0x5b, 0xcd, 0xf2, 0xf6, 0x0a, 0x43, 0x08, 0xc1, 0x1f, 0x57, 0x0c, + 0x00, 0x07, 0x02, 0x0c, 0xc6, 0x5a, 0x06, 0xd4, 0x6c, 0xf9, 0x68, 0xcb, 0x95, 0x7a, 0x12, 0x38, 0x83, 0x0b, 0x59, + 0x24, 0xfc, 0xad, 0x16, 0xfb, 0xa3, 0xf5, 0xa3, 0xef, 0xdb, 0xe3, 0xc1, 0xda, 0xf7, 0xf8, 0x48, 0x7f, 0xd6, 0xb8, + 0x0e, 0x6c, 0x5b, 0xbe, 0xf1, 0xa2, 0xb6, 0x12, 0x8f, 0x12, 0x78, 0x03, 0x13, 0x91, 0xc2, 0x20, 0xd5, 0x02, 0xc7, + 0xa0, 0xbc, 0xb1, 0x10, 0x4b, 0xd5, 0xd5, 0x0d, 0xb6, 0x20, 0x32, 0x04, 0x0f, 0xb7, 0x7f, 0xad, 0x54, 0xe0, 0xa8, + 0x7e, 0x9f, 0x4b, 0xdf, 0xed, 0xc9, 0xd8, 0x91, 0xe3, 0xd4, 0x4f, 0x85, 0x83, 0xff, 0x26, 0x75, 0x6d, 0x2c, 0x57, + 0x52, 0x66, 0x59, 0x16, 0x36, 0x0b, 0xb5, 0xdc, 0xa3, 0xf2, 0x20, 0xf9, 0x42, 0x0e, 0x91, 0x2c, 0x30, 0x0a, 0x05, + 0x19, 0x4e, 0xa8, 0x18, 0x6d, 0x44, 0xb9, 0xca, 0x2e, 0xaa, 0x70, 0xab, 0x14, 0xca, 0x9c, 0xa2, 0x6f, 0x37, 0x38, + 0x90, 0x90, 0x28, 0x2b, 0xdf, 0xc4, 0x6f, 0x42, 0x04, 0xab, 0xe3, 0xda, 0x16, 0x8a, 0x7b, 0xfb, 0x93, 0xa7, 0x5d, + 0xfc, 0x91, 0x71, 0x01, 0x75, 0xb1, 0x98, 0x86, 0x13, 0x1b, 0xfb, 0xc6, 0x7d, 0x61, 0x35, 0x3d, 0x00, 0xf5, 0x5d, + 0x2a, 0x31, 0x82, 0xfa, 0xca, 0xd8, 0xc7, 0xf6, 0x18, 0x93, 0x73, 0x88, 0x35, 0xac, 0x72, 0x66, 0xaa, 0x6f, 0x84, + 0xcd, 0x00, 0xb8, 0x11, 0x5a, 0xa3, 0x20, 0xf0, 0x78, 0x15, 0xe2, 0x79, 0xa9, 0xc2, 0xb7, 0x66, 0x84, 0x8e, 0xc1, + 0x9b, 0xca, 0x36, 0x32, 0x93, 0xbe, 0x60, 0xd0, 0x1c, 0xdb, 0x3a, 0x0a, 0xab, 0xad, 0x2c, 0x9b, 0x01, 0xdc, 0x40, + 0x76, 0x6c, 0x2e, 0x9e, 0xf3, 0x6a, 0x91, 0x2d, 0x23, 0x13, 0x14, 0x70, 0x25, 0x2c, 0x83, 0xf6, 0xd7, 0x3d, 0xb2, + 0x1d, 0x87, 0xd0, 0x0d, 0xf7, 0x11, 0x8c, 0xa7, 0xdd, 0x14, 0xac, 0x20, 0x1a, 0x21, 0x1e, 0x66, 0xcc, 0xe2, 0x7b, + 0xa5, 0x29, 0x4f, 0x55, 0x4b, 0x20, 0x70, 0x14, 0x42, 0x5d, 0xec, 0x1b, 0x25, 0xb8, 0x4c, 0x8d, 0x60, 0x06, 0x7b, + 0x76, 0xa4, 0xb6, 0x4b, 0xce, 0xe9, 0x50, 0x4d, 0x69, 0xa9, 0xa7, 0x54, 0xfb, 0x1a, 0x8a, 0x45, 0x89, 0x1e, 0x7a, + 0xe0, 0x7a, 0xa0, 0x1d, 0xf2, 0x4a, 0x3a, 0x31, 0x11, 0x74, 0x5a, 0x6d, 0xc2, 0xce, 0x8d, 0x74, 0xcb, 0x6a, 0xe4, + 0x1d, 0x43, 0xb3, 0x23, 0x5e, 0xf8, 0x81, 0xba, 0x00, 0x22, 0xe4, 0xde, 0x16, 0x99, 0x23, 0x9a, 0x65, 0xe5, 0x4b, + 0x28, 0x8b, 0x23, 0xb6, 0xae, 0x80, 0x6b, 0x29, 0x98, 0x5c, 0xf2, 0x88, 0xa7, 0x88, 0x08, 0x78, 0xa2, 0xb4, 0xeb, + 0x7b, 0x2d, 0x21, 0x34, 0x4b, 0x81, 0xb8, 0xb9, 0x28, 0xce, 0xb5, 0x0d, 0x64, 0x01, 0xf4, 0xed, 0xa7, 0xec, 0xca, + 0x0b, 0x07, 0xbb, 0xbd, 0xca, 0xc4, 0x73, 0x7e, 0x91, 0x09, 0x9e, 0x22, 0xd8, 0xd5, 0xad, 0x79, 0xe0, 0x8e, 0x6d, + 0x03, 0xcb, 0xb7, 0xef, 0x60, 0xc1, 0x94, 0xa1, 0x56, 0x4a, 0x64, 0x22, 0x12, 0x90, 0xd9, 0x67, 0xee, 0x5e, 0x67, + 0xe2, 0x75, 0x7c, 0x0b, 0xde, 0x14, 0x0d, 0x7e, 0x7a, 0x74, 0x8e, 0x5f, 0x22, 0x92, 0x28, 0xc4, 0xb0, 0xc5, 0x88, + 0x58, 0x88, 0x1c, 0x3b, 0x26, 0x94, 0x2b, 0x41, 0x6b, 0x6b, 0x08, 0xbc, 0xf8, 0xd3, 0xaa, 0x7b, 0x57, 0x99, 0x30, + 0xf6, 0x19, 0x57, 0xf1, 0x2d, 0x2b, 0x15, 0x98, 0x05, 0xc6, 0xb9, 0x6f, 0x4b, 0x49, 0xae, 0x32, 0x61, 0x04, 0x24, + 0x57, 0xf1, 0x2d, 0x6d, 0xca, 0x38, 0xb4, 0x15, 0x9d, 0x17, 0xe7, 0x77, 0x7f, 0xf8, 0x25, 0x86, 0x5a, 0x19, 0xf7, + 0xfb, 0x20, 0x31, 0x93, 0xb6, 0x29, 0x73, 0x19, 0x49, 0x8d, 0x16, 0x52, 0x51, 0x3e, 0x98, 0x90, 0xfd, 0x95, 0x6a, + 0x19, 0x51, 0xfb, 0x55, 0x28, 0xe6, 0xe3, 0x68, 0x42, 0xe8, 0xa4, 0x63, 0xbd, 0x9b, 0xd6, 0x42, 0xa6, 0xd1, 0xd3, + 0xc8, 0xf3, 0xe9, 0x2c, 0x58, 0x35, 0x2d, 0x8e, 0x19, 0x9f, 0x16, 0x83, 0x01, 0xd1, 0x2e, 0x85, 0x5b, 0xac, 0x07, + 0x4c, 0x69, 0x5c, 0xbc, 0x35, 0xd3, 0xea, 0x97, 0x52, 0x85, 0xa4, 0xf7, 0x0c, 0x48, 0x32, 0xe9, 0x82, 0xdd, 0x82, + 0x44, 0xd1, 0xf3, 0xbf, 0x53, 0x5b, 0x70, 0xdf, 0x83, 0xb1, 0x19, 0xdd, 0xd7, 0x33, 0xfe, 0x43, 0x6d, 0x0b, 0xa2, + 0x3e, 0x95, 0xac, 0xd7, 0x91, 0xa8, 0x42, 0x2e, 0xc2, 0xcf, 0x8e, 0x86, 0x18, 0xa2, 0xda, 0x63, 0x81, 0xd8, 0x5c, + 0x9d, 0xf3, 0x02, 0xa7, 0x9f, 0xb9, 0xcb, 0x15, 0x6c, 0x0b, 0x5a, 0x19, 0x1a, 0xf5, 0x26, 0x7e, 0x13, 0xd9, 0xcb, + 0x82, 0x2e, 0xf2, 0x39, 0x0a, 0x59, 0xf3, 0x30, 0xac, 0x86, 0xed, 0x41, 0x24, 0x87, 0xed, 0x49, 0x68, 0x34, 0x06, + 0x16, 0xc8, 0x1e, 0x8d, 0xc0, 0x45, 0x68, 0xe5, 0x6f, 0xc7, 0xe0, 0xc2, 0x65, 0x11, 0x59, 0x86, 0x3a, 0x7e, 0x53, + 0xbb, 0x09, 0xaa, 0x57, 0xe8, 0x34, 0x85, 0x55, 0x29, 0x93, 0x7c, 0xf8, 0xf5, 0x52, 0x16, 0x98, 0xc9, 0xeb, 0xb2, + 0x47, 0x5f, 0xdb, 0xed, 0x1d, 0x98, 0x82, 0x75, 0x9f, 0xbc, 0xaf, 0x1f, 0x77, 0xf6, 0x04, 0x8c, 0x62, 0x55, 0x8e, + 0xa6, 0x90, 0x52, 0xfb, 0xa0, 0xd4, 0x1f, 0xc3, 0x95, 0xd0, 0x1c, 0xbb, 0x05, 0x4c, 0x02, 0xf6, 0x19, 0x52, 0x3d, + 0xa6, 0x1d, 0xfb, 0x1c, 0x6d, 0x61, 0x49, 0xc0, 0xe1, 0x1f, 0x65, 0xb2, 0xf6, 0xaf, 0xee, 0x22, 0x6d, 0x86, 0x6c, + 0x59, 0x2c, 0x81, 0xcf, 0x87, 0x5d, 0x1b, 0x95, 0x28, 0x9b, 0x88, 0x24, 0x85, 0x2d, 0x8f, 0x41, 0xda, 0xa3, 0x98, + 0xae, 0x0b, 0x9e, 0x64, 0x28, 0xa5, 0x48, 0xb4, 0x4f, 0x70, 0x0e, 0x6f, 0x70, 0x3f, 0xaa, 0x80, 0xf0, 0x2a, 0xe4, + 0x74, 0x94, 0x52, 0x6d, 0x01, 0xa3, 0xa8, 0x07, 0x88, 0xf2, 0x32, 0x90, 0xe3, 0xed, 0x76, 0x13, 0xba, 0x66, 0xab, + 0xe1, 0x84, 0x22, 0x29, 0xb9, 0xc4, 0x72, 0xaf, 0x40, 0xe7, 0x71, 0xce, 0x7a, 0x2f, 0x00, 0x8b, 0xe0, 0x0c, 0xfe, + 0xc6, 0x84, 0x5e, 0xc3, 0xdf, 0x9c, 0xd0, 0xd7, 0x2c, 0xbc, 0x1a, 0x5e, 0x92, 0xc3, 0x30, 0x1d, 0x4c, 0x94, 0x60, + 0xec, 0x8e, 0xad, 0xca, 0x50, 0x25, 0xae, 0x0f, 0x2f, 0xc8, 0xe3, 0x0b, 0x7a, 0x4b, 0x6f, 0xe8, 0x29, 0x7d, 0x0b, + 0x84, 0xff, 0xee, 0x78, 0xc2, 0x87, 0x93, 0x27, 0xfd, 0x7e, 0xef, 0xbc, 0xdf, 0xef, 0x9d, 0x19, 0x03, 0x0a, 0xbd, + 0x8b, 0x2e, 0x6b, 0xaa, 0x7f, 0x5d, 0xd5, 0xcb, 0xe9, 0x5b, 0xb5, 0x71, 0x13, 0x9e, 0xe5, 0xe1, 0xd5, 0xe1, 0x1d, + 0x19, 0xe2, 0xe3, 0x45, 0x2e, 0x65, 0x11, 0x5e, 0x1e, 0xde, 0x11, 0xfa, 0x76, 0x06, 0x7a, 0x53, 0xac, 0xef, 0xed, + 0xe3, 0x3b, 0x5d, 0x1b, 0xa1, 0x2f, 0xc2, 0x04, 0xb6, 0xc9, 0x2d, 0xb3, 0x77, 0xed, 0xc9, 0x18, 0x62, 0x99, 0xdc, + 0x79, 0xe5, 0xdd, 0x3d, 0xbe, 0x25, 0x87, 0xb7, 0xe0, 0x29, 0x6a, 0xc9, 0xdf, 0x3c, 0xbc, 0x61, 0xad, 0x1a, 0x1e, + 0xdf, 0xd1, 0xd3, 0x56, 0x23, 0x1e, 0xdf, 0x91, 0x28, 0xbc, 0x61, 0x97, 0xf4, 0x94, 0x5d, 0x11, 0x7a, 0xde, 0xef, + 0x9f, 0xf5, 0xfb, 0xb2, 0xdf, 0xff, 0x7b, 0x1c, 0x86, 0xf1, 0xb0, 0x20, 0x87, 0x92, 0xde, 0x1d, 0x4e, 0xf8, 0x57, + 0x64, 0x1e, 0xea, 0xe6, 0xab, 0x05, 0x67, 0x55, 0xde, 0x2a, 0xd7, 0x1d, 0x05, 0x6b, 0x85, 0x3b, 0xa6, 0x9e, 0xde, + 0xd2, 0x1b, 0x56, 0xd0, 0x53, 0x16, 0x93, 0xe8, 0x1a, 0x5a, 0x71, 0x3e, 0x2f, 0xa2, 0x1b, 0x7a, 0xca, 0xce, 0xe6, + 0x71, 0x74, 0x4a, 0xdf, 0xb2, 0x7c, 0x38, 0x81, 0xbc, 0xa7, 0xc3, 0x1b, 0x72, 0xf8, 0x96, 0x44, 0xe1, 0x5b, 0xfd, + 0xfb, 0x8e, 0x5e, 0xf2, 0xf0, 0x2d, 0xf5, 0xaa, 0x79, 0x4b, 0x4c, 0xf5, 0x8d, 0xda, 0xdf, 0x92, 0xc8, 0x1f, 0xcc, + 0xb7, 0xd6, 0x9e, 0xe6, 0x91, 0xa3, 0x8d, 0x69, 0x19, 0x82, 0xbe, 0xb9, 0x0c, 0x6f, 0x08, 0x99, 0x36, 0xc7, 0x0e, + 0x06, 0x74, 0xfe, 0x28, 0x4a, 0x08, 0xbd, 0xf1, 0x4b, 0xbd, 0xc1, 0x31, 0x34, 0x23, 0xa4, 0xd2, 0x4e, 0x31, 0x0d, + 0xd7, 0xc1, 0x2b, 0x0d, 0xd6, 0x71, 0xde, 0xef, 0x87, 0x9b, 0x7e, 0x1f, 0x22, 0xdd, 0x17, 0x73, 0x13, 0xdb, 0xcd, + 0x91, 0x4d, 0x7a, 0x03, 0xda, 0xff, 0x57, 0x83, 0x01, 0x74, 0xc6, 0x2b, 0x29, 0xbc, 0x19, 0xbc, 0x7a, 0x7c, 0x47, + 0x54, 0x1d, 0x05, 0x15, 0x32, 0x2c, 0xe8, 0x6b, 0x9a, 0x01, 0xe0, 0xd7, 0xab, 0xc1, 0x80, 0x44, 0xe6, 0x33, 0x32, + 0x7d, 0x75, 0xfc, 0x76, 0x3a, 0x18, 0xbc, 0x32, 0xdb, 0xe4, 0x0d, 0xbb, 0xa7, 0x14, 0x58, 0x7f, 0x67, 0xfd, 0xfe, + 0x9b, 0x59, 0x4c, 0xce, 0x0b, 0x1e, 0x7f, 0x9c, 0x36, 0xdb, 0xf2, 0xc6, 0x45, 0x55, 0x3b, 0xeb, 0xf7, 0x37, 0xfd, + 0xfe, 0x29, 0x60, 0x17, 0xcd, 0x9d, 0xaf, 0x27, 0x48, 0x5b, 0x16, 0x8e, 0x22, 0x69, 0x92, 0x43, 0x63, 0x68, 0x5b, + 0xac, 0xda, 0x36, 0xef, 0xc8, 0xc0, 0xe2, 0xa8, 0x59, 0x51, 0x5c, 0x93, 0x28, 0xec, 0x9d, 0xed, 0x76, 0xa7, 0x8c, + 0xb1, 0x98, 0x80, 0xf4, 0xc3, 0x7f, 0x7d, 0x5a, 0x37, 0x62, 0x88, 0x09, 0x89, 0xcc, 0xe6, 0x76, 0x65, 0x0f, 0x81, + 0x88, 0xc3, 0xa6, 0x7f, 0x6f, 0xee, 0xe5, 0xa2, 0x76, 0x7c, 0xeb, 0xcf, 0x00, 0x42, 0x24, 0x59, 0xc8, 0xe7, 0x38, + 0x06, 0x65, 0x06, 0x40, 0xe6, 0x91, 0x9a, 0x79, 0x09, 0x20, 0xc0, 0x64, 0xb7, 0x1b, 0x8d, 0xc7, 0x13, 0x5a, 0xb0, + 0xd1, 0xdf, 0x9e, 0x3e, 0xae, 0x1e, 0x87, 0x41, 0x30, 0xc8, 0x48, 0x4b, 0x4f, 0x61, 0x17, 0x6b, 0x75, 0x08, 0x46, + 0xf0, 0x9a, 0x7d, 0xbc, 0xce, 0x3e, 0x9b, 0x7d, 0x44, 0xc2, 0xda, 0x60, 0x1c, 0xb9, 0x48, 0x5b, 0x7a, 0xbb, 0x7b, + 0x18, 0x4c, 0x2e, 0xd2, 0x4f, 0xb0, 0x9d, 0x3e, 0xff, 0xe6, 0xc1, 0x78, 0xc2, 0xc1, 0xe8, 0x2e, 0x0a, 0xfa, 0x4c, + 0xdb, 0xed, 0x2a, 0xff, 0x12, 0xf8, 0x06, 0x53, 0x41, 0xc7, 0x66, 0x59, 0xb8, 0x41, 0x45, 0xd4, 0xd1, 0x32, 0xa8, + 0x6a, 0x65, 0x3b, 0x07, 0xd4, 0x12, 0xab, 0x32, 0x71, 0x0b, 0x0c, 0x43, 0x86, 0xba, 0xdc, 0x93, 0xea, 0x5f, 0xbc, + 0x90, 0x06, 0x3e, 0xc3, 0x89, 0x08, 0x3d, 0x6e, 0x8d, 0xfb, 0xdc, 0x9a, 0xf8, 0x04, 0xb7, 0x56, 0x22, 0x89, 0x35, + 0xb0, 0xa4, 0xe6, 0x72, 0x94, 0xb0, 0x59, 0xc9, 0xf8, 0xbc, 0x8c, 0x12, 0x1a, 0xc3, 0x83, 0x64, 0x62, 0x2e, 0xa3, + 0x04, 0xed, 0x13, 0x5d, 0x84, 0xc1, 0x3f, 0x01, 0xb3, 0x9f, 0xe6, 0xf0, 0x57, 0x92, 0x69, 0x72, 0x0c, 0x01, 0x21, + 0x8e, 0xc7, 0xf3, 0x38, 0x1c, 0x93, 0x28, 0x99, 0xc1, 0x13, 0xfc, 0x57, 0x84, 0x63, 0x52, 0xeb, 0x3b, 0x8c, 0x54, + 0x97, 0xdb, 0x84, 0x01, 0x5c, 0xd9, 0x78, 0x3e, 0x89, 0xac, 0x74, 0x57, 0x3e, 0x1e, 0x8d, 0x9f, 0x92, 0x69, 0x1c, + 0xca, 0x41, 0x42, 0x28, 0x78, 0xf7, 0x86, 0xe5, 0x30, 0xd1, 0xf0, 0x6c, 0xc0, 0xe6, 0x95, 0x8e, 0xcd, 0x93, 0x70, + 0x02, 0xc2, 0x30, 0x21, 0xc7, 0x7a, 0x0f, 0x52, 0x8a, 0x3e, 0xcf, 0xb1, 0x9f, 0xfa, 0x08, 0xc2, 0xec, 0xa8, 0xa5, + 0xe2, 0x6b, 0x00, 0xba, 0xc4, 0xc1, 0xa1, 0xf6, 0xcc, 0x17, 0xf3, 0xb0, 0xf4, 0xa8, 0x94, 0xa9, 0xee, 0x50, 0x34, + 0x28, 0xbf, 0x69, 0xd0, 0xa1, 0x20, 0x83, 0x09, 0x2d, 0x67, 0x13, 0xfe, 0x15, 0x04, 0xf0, 0x68, 0x44, 0xfc, 0x52, + 0x38, 0x31, 0x10, 0x5e, 0x05, 0x19, 0xa8, 0xb4, 0x56, 0x8d, 0x19, 0xd9, 0x8a, 0x0f, 0x20, 0x4c, 0xca, 0xc1, 0x8d, + 0xdc, 0xe4, 0x29, 0x44, 0x05, 0xdb, 0xe4, 0xd5, 0xc1, 0x25, 0x58, 0xb2, 0xc7, 0x15, 0xc4, 0x09, 0xdb, 0xac, 0x01, + 0x3b, 0xf7, 0xd1, 0xb6, 0xac, 0x0f, 0xd4, 0x77, 0x07, 0xd8, 0x72, 0x78, 0x55, 0xc9, 0x83, 0xc9, 0x78, 0x3c, 0x1e, + 0xfd, 0x0e, 0x47, 0x07, 0x10, 0x5a, 0x12, 0x19, 0x3e, 0x19, 0xa0, 0x71, 0x37, 0x15, 0xf7, 0xc6, 0x85, 0xa2, 0xac, + 0x74, 0x32, 0x21, 0x20, 0x7e, 0x36, 0x7d, 0x83, 0x7d, 0xc5, 0x75, 0xfc, 0x93, 0xfd, 0x4f, 0xcc, 0x8a, 0x56, 0x2b, + 0x75, 0xf4, 0xee, 0xed, 0xe9, 0xab, 0x0f, 0xaf, 0x7e, 0x7d, 0x71, 0xf6, 0xea, 0xcd, 0xcb, 0x57, 0x6f, 0x5e, 0x7d, + 0xf8, 0xe7, 0x03, 0x0c, 0xb6, 0x6f, 0x2b, 0x62, 0xc7, 0xde, 0xbb, 0xc7, 0x78, 0xb5, 0xf8, 0xc2, 0xd9, 0x23, 0x77, + 0x8b, 0x05, 0xd8, 0x04, 0xc3, 0x2d, 0x08, 0xaa, 0x19, 0x8d, 0x4a, 0xdf, 0x13, 0x90, 0xd1, 0xa8, 0x90, 0x8d, 0x87, + 0x15, 0x5b, 0x21, 0x17, 0xef, 0x18, 0x0e, 0x3e, 0xb2, 0xbf, 0x15, 0x67, 0xc2, 0xed, 0x68, 0x6b, 0x56, 0x04, 0x7c, + 0xbe, 0x36, 0xa2, 0xf2, 0xb8, 0x10, 0xb5, 0xb7, 0xed, 0x73, 0x48, 0xa8, 0x47, 0xe4, 0x3a, 0x78, 0xdf, 0x06, 0xd9, + 0xe3, 0x23, 0xef, 0x49, 0x79, 0x86, 0xfa, 0x1c, 0x0d, 0x1f, 0x35, 0x9e, 0xd1, 0x89, 0xb9, 0x36, 0x3a, 0xd4, 0xb3, + 0x02, 0xf6, 0xb7, 0x12, 0x63, 0x43, 0xb4, 0x87, 0x14, 0xb1, 0x3e, 0x9c, 0xee, 0x77, 0xff, 0x66, 0xf4, 0x3d, 0x1c, + 0x3f, 0x4a, 0x35, 0x81, 0xb4, 0x28, 0x50, 0xba, 0x32, 0xe4, 0xb6, 0xe7, 0x61, 0x61, 0x7e, 0x86, 0x0d, 0x02, 0x68, + 0x2f, 0x3b, 0x96, 0x04, 0x9a, 0xc5, 0x6b, 0x5d, 0xff, 0xbc, 0x7c, 0x99, 0x68, 0xe7, 0x8b, 0x6f, 0x21, 0xc4, 0xb0, + 0x7f, 0x45, 0x68, 0x4c, 0xb8, 0x9b, 0x64, 0x77, 0x69, 0x31, 0xf7, 0xaa, 0xab, 0x18, 0x8f, 0xbb, 0x7b, 0xae, 0x14, + 0xcd, 0x5b, 0x17, 0xd8, 0x03, 0x35, 0xaf, 0xe3, 0x25, 0x0b, 0x01, 0x9b, 0xf1, 0xd0, 0x2e, 0x12, 0xe7, 0xf7, 0x4e, + 0x27, 0xe4, 0xf0, 0x68, 0xca, 0x87, 0xac, 0xa4, 0x62, 0xc0, 0xca, 0x7a, 0x8f, 0x9a, 0xf3, 0x36, 0x21, 0x17, 0xfb, + 0x34, 0x5c, 0x0c, 0xf9, 0x43, 0x97, 0xa4, 0x0f, 0xbc, 0xe1, 0x50, 0x6d, 0x9b, 0x8b, 0x21, 0x4d, 0x39, 0xdd, 0xa7, + 0x32, 0x20, 0x44, 0xba, 0x8a, 0x2b, 0x52, 0xeb, 0xa3, 0x2a, 0x75, 0x92, 0x8e, 0xeb, 0x6c, 0xfb, 0x89, 0x4b, 0xb6, + 0xba, 0x5d, 0xfb, 0xd7, 0xea, 0xf6, 0x85, 0x19, 0xc8, 0xdf, 0x1f, 0x88, 0x6a, 0x62, 0x20, 0xba, 0x80, 0x0a, 0xfe, + 0x01, 0x5e, 0x9e, 0x3c, 0xd2, 0x0a, 0xd0, 0xfb, 0xce, 0x8e, 0xae, 0x3d, 0xde, 0x98, 0xc5, 0xd6, 0x12, 0xe7, 0xac, + 0xf2, 0x9d, 0xe5, 0x55, 0xd9, 0x0a, 0x5d, 0x47, 0xb0, 0x9f, 0xc3, 0x8e, 0xbe, 0x7b, 0xdb, 0x00, 0x88, 0x52, 0x58, + 0xb9, 0xb3, 0x5f, 0x78, 0x67, 0xbf, 0xb0, 0x67, 0xbf, 0xdd, 0x04, 0xca, 0x87, 0x15, 0x5a, 0xf6, 0x52, 0x8a, 0xca, + 0x34, 0x79, 0xdc, 0xd4, 0x65, 0x21, 0x2d, 0xe6, 0x87, 0x96, 0x76, 0x3d, 0x19, 0x53, 0x89, 0xea, 0x91, 0x1f, 0xb0, + 0x55, 0x87, 0x25, 0x79, 0xf8, 0x9e, 0xf9, 0x3f, 0x7b, 0x83, 0xbc, 0xef, 0x6e, 0xf7, 0x7f, 0x73, 0xa1, 0x83, 0xdb, + 0x5a, 0x2a, 0x3c, 0x75, 0x75, 0x5c, 0xe0, 0x5d, 0x2d, 0x7d, 0xf8, 0xae, 0xf6, 0x2e, 0xd3, 0xcb, 0xae, 0x02, 0xd4, + 0x20, 0xb1, 0xb9, 0xe2, 0x45, 0x96, 0xd4, 0x56, 0xa1, 0xf1, 0x96, 0x43, 0x68, 0x0f, 0xef, 0xe0, 0x02, 0x39, 0x2c, + 0x21, 0xf4, 0x63, 0x65, 0x04, 0x80, 0x3e, 0x8b, 0xfd, 0x96, 0x87, 0x19, 0x19, 0xf8, 0x12, 0xbf, 0x52, 0xfa, 0xe2, + 0xe2, 0xc3, 0xbd, 0xcc, 0x04, 0xbd, 0x4a, 0x6c, 0x76, 0x29, 0xdb, 0x31, 0x3f, 0xfc, 0x2f, 0x30, 0x1a, 0x84, 0xd7, + 0x96, 0xec, 0x50, 0x74, 0xcc, 0x72, 0x05, 0x47, 0x6d, 0xe9, 0xca, 0x2c, 0x5b, 0xd7, 0xcf, 0x6a, 0x98, 0xe9, 0x33, + 0xe5, 0x2d, 0xc8, 0xbe, 0x90, 0xbb, 0x9f, 0xea, 0x8a, 0x05, 0x99, 0x4d, 0xc6, 0x53, 0x22, 0x06, 0x83, 0x56, 0xf2, + 0x31, 0x26, 0x0f, 0x87, 0x7b, 0xcc, 0xa5, 0xd0, 0xfd, 0xf0, 0xfa, 0x00, 0xf5, 0x35, 0xb6, 0x24, 0xd9, 0x56, 0xec, + 0x4f, 0x30, 0x8b, 0x05, 0xe2, 0xe8, 0xe0, 0x17, 0x17, 0x4b, 0x00, 0x59, 0x86, 0x65, 0xa6, 0x85, 0x45, 0x65, 0xaa, + 0x7c, 0x64, 0x0b, 0x26, 0x8f, 0xc7, 0x73, 0xbf, 0xe7, 0x8e, 0xc1, 0x21, 0x24, 0x9a, 0x58, 0xe3, 0x17, 0x3f, 0x0b, + 0xc6, 0x71, 0x28, 0x67, 0xb2, 0xf1, 0x5d, 0x49, 0xa2, 0xb1, 0x31, 0x55, 0xd6, 0x57, 0x89, 0x6a, 0x98, 0x90, 0xc7, + 0x05, 0x39, 0x2c, 0xe8, 0xca, 0x1f, 0x4b, 0x4c, 0x3f, 0x8c, 0x0f, 0x27, 0x63, 0xf2, 0x38, 0x7e, 0x3c, 0x31, 0x70, + 0xc3, 0x7e, 0x8e, 0x7c, 0xb8, 0x22, 0x87, 0xcd, 0x2a, 0xc1, 0x14, 0xd5, 0xf4, 0xcc, 0xaf, 0x24, 0x19, 0xac, 0x06, + 0xe9, 0xe3, 0x56, 0x5e, 0xac, 0x55, 0x8f, 0xf7, 0xe6, 0x98, 0x4f, 0x89, 0x68, 0xdc, 0x18, 0x36, 0xf4, 0x2a, 0xfe, + 0x43, 0x16, 0x51, 0x29, 0x01, 0x91, 0x10, 0xd4, 0xdb, 0xd9, 0x45, 0x96, 0xc4, 0x22, 0x8d, 0xd2, 0x9a, 0xd0, 0x74, + 0xc6, 0x26, 0xe3, 0x79, 0xca, 0xd2, 0xe3, 0xc9, 0xd3, 0xf9, 0xe4, 0x69, 0x74, 0x34, 0x8e, 0xd2, 0xc1, 0x00, 0x92, + 0x8f, 0xc6, 0xe0, 0x62, 0x07, 0xbf, 0xd9, 0x11, 0x0c, 0xdd, 0x0c, 0x59, 0xc2, 0x02, 0x9a, 0xf6, 0x79, 0x4d, 0xd2, + 0xc3, 0x79, 0xa1, 0x7a, 0x12, 0xdf, 0xd2, 0x8d, 0xe7, 0xe0, 0xe2, 0xb7, 0xf0, 0xc2, 0xb5, 0xf0, 0x62, 0xbf, 0x85, + 0x42, 0x93, 0xed, 0x42, 0xfe, 0xff, 0xb8, 0x61, 0xdc, 0x77, 0x97, 0x30, 0x8b, 0xeb, 0x3a, 0x1b, 0xad, 0x0b, 0x59, + 0x49, 0xb8, 0x4d, 0x28, 0x51, 0xd8, 0x28, 0x5e, 0xaf, 0x73, 0xed, 0x22, 0xb6, 0xa8, 0x28, 0x80, 0xbb, 0x40, 0x9c, + 0x62, 0x60, 0xa1, 0x8d, 0x81, 0xdc, 0x5f, 0xbc, 0x90, 0xcc, 0xaa, 0x7d, 0xcc, 0x3d, 0xf2, 0x8f, 0x10, 0x8c, 0x51, + 0xc5, 0x6c, 0x3c, 0x57, 0x58, 0x17, 0x9f, 0x92, 0xf7, 0xfe, 0x1b, 0x47, 0x91, 0x3d, 0x9a, 0x41, 0x4f, 0x10, 0x39, + 0x8f, 0x38, 0x7b, 0x32, 0x79, 0x19, 0xb8, 0x9f, 0xc1, 0x4a, 0x7f, 0xdd, 0x6d, 0xc6, 0xda, 0xf6, 0xe8, 0x5e, 0x18, + 0xa1, 0xe8, 0x5f, 0xf8, 0xce, 0xd4, 0x0b, 0xb8, 0x84, 0x6a, 0x60, 0x37, 0x97, 0x97, 0xbc, 0x04, 0x10, 0xa1, 0x4c, + 0xf4, 0xfb, 0xbd, 0x3f, 0x0c, 0x34, 0x69, 0xc9, 0x8b, 0xd7, 0x99, 0xb0, 0xce, 0x38, 0xd0, 0x54, 0xa0, 0xfe, 0x1f, + 0x2b, 0xfb, 0x4c, 0xc7, 0x64, 0xee, 0x3f, 0x0e, 0x27, 0x24, 0x6a, 0xbe, 0x26, 0x9f, 0x38, 0x4d, 0x3f, 0x71, 0x45, + 0xfb, 0x0f, 0x64, 0xe6, 0x86, 0x43, 0x86, 0xfa, 0x4b, 0xc7, 0x3c, 0x19, 0xbd, 0x4e, 0xcc, 0x66, 0x82, 0x55, 0x73, + 0x88, 0xc2, 0x5e, 0xc0, 0x83, 0xba, 0x96, 0xc5, 0x53, 0x98, 0x7d, 0x50, 0x23, 0x8a, 0x63, 0x36, 0x9e, 0x87, 0x32, + 0x9c, 0x80, 0x7d, 0xef, 0x64, 0x0c, 0xf7, 0x01, 0x19, 0x7e, 0xac, 0x42, 0xec, 0x1c, 0xa4, 0x7d, 0xac, 0x50, 0x31, + 0x01, 0x10, 0x81, 0x90, 0xb7, 0xdf, 0x97, 0x2a, 0x09, 0x5f, 0x97, 0x98, 0x52, 0xa8, 0x0f, 0xfe, 0x13, 0xa9, 0xba, + 0x63, 0xfa, 0xd5, 0xfa, 0xf1, 0x67, 0x42, 0xf1, 0xe9, 0x2e, 0x25, 0xbe, 0x85, 0xe0, 0xce, 0x12, 0x74, 0x10, 0x15, + 0x9a, 0xb1, 0x3d, 0xcc, 0xef, 0x8a, 0xfb, 0xf9, 0x5d, 0xf1, 0xff, 0x8e, 0xdf, 0x15, 0x0f, 0x31, 0x86, 0x95, 0x85, + 0x86, 0x9f, 0x07, 0xe3, 0x20, 0xfa, 0xcf, 0xf9, 0xc4, 0x7b, 0x79, 0xea, 0xab, 0x4c, 0x4c, 0xef, 0x61, 0x9a, 0x7d, + 0x82, 0x82, 0xb0, 0x8a, 0xfb, 0xf4, 0x64, 0x53, 0xd9, 0x5b, 0x2b, 0x19, 0x62, 0x9e, 0x07, 0x58, 0xa3, 0xb0, 0xf2, + 0x80, 0xee, 0x51, 0xb5, 0x41, 0x9c, 0x08, 0x1e, 0xc6, 0xcc, 0x4a, 0xdf, 0x77, 0x3b, 0xa3, 0xc2, 0x7c, 0x90, 0x8b, + 0x82, 0xec, 0xe6, 0xe3, 0xf9, 0x38, 0x0a, 0xb1, 0x01, 0xff, 0x31, 0x63, 0xd5, 0x90, 0xcd, 0x77, 0x32, 0x52, 0x7b, + 0x26, 0x4f, 0x93, 0x7d, 0xd2, 0x3b, 0xe0, 0x1d, 0xf2, 0xf3, 0xfa, 0x63, 0x58, 0x48, 0xc3, 0x6f, 0xc9, 0xcb, 0xb8, + 0xc8, 0xaa, 0xd5, 0x55, 0x96, 0x20, 0xd3, 0x05, 0x2f, 0x3e, 0x9b, 0xe9, 0xf2, 0x3e, 0xd6, 0x07, 0x8c, 0xa7, 0x14, + 0xaf, 0x1b, 0xa2, 0xf4, 0x4d, 0xcb, 0xb3, 0x42, 0x5d, 0x9e, 0x54, 0xcc, 0xf6, 0xac, 0x04, 0xa7, 0x53, 0x30, 0xc1, + 0xd7, 0x3f, 0x5d, 0xef, 0x63, 0xc0, 0x05, 0x85, 0x9a, 0xd3, 0x42, 0xae, 0x0d, 0x96, 0x93, 0x85, 0xee, 0x04, 0xcc, + 0x50, 0x29, 0xf0, 0x02, 0x05, 0x7f, 0xd1, 0xc0, 0x88, 0xbe, 0x74, 0xbf, 0xc9, 0xc0, 0x20, 0x5d, 0x9a, 0x13, 0x61, + 0xec, 0xb8, 0x9d, 0x22, 0x6d, 0x45, 0x39, 0xe3, 0xec, 0xbd, 0xba, 0x52, 0x80, 0x01, 0xde, 0xf6, 0x26, 0x3a, 0x4f, + 0xd0, 0x6b, 0x41, 0xe9, 0xbc, 0x81, 0xbb, 0x59, 0x45, 0x46, 0xb8, 0xf8, 0xb8, 0xf2, 0x58, 0x70, 0xcf, 0x7e, 0x21, + 0x96, 0x46, 0x33, 0x0d, 0xc6, 0x6c, 0x5e, 0xb0, 0x40, 0xa1, 0x02, 0x05, 0x96, 0x73, 0x6d, 0x69, 0x5a, 0x0d, 0xf9, + 0xe1, 0x11, 0x5a, 0x9b, 0x56, 0x03, 0x7e, 0x78, 0x54, 0x47, 0xd9, 0x31, 0x64, 0x99, 0xf9, 0x19, 0xd4, 0xeb, 0x3a, + 0x32, 0x29, 0x26, 0xbb, 0x5f, 0x5f, 0xea, 0x8f, 0xea, 0x16, 0x5c, 0x3f, 0x00, 0x01, 0x6c, 0x00, 0x0e, 0x81, 0x6a, + 0xb0, 0x34, 0x22, 0x58, 0x94, 0x29, 0xb4, 0xaf, 0xa1, 0xf7, 0x46, 0xc3, 0x7f, 0x81, 0xbb, 0x88, 0x5c, 0xfb, 0x9f, + 0x20, 0xf0, 0x57, 0x94, 0x69, 0x65, 0x8a, 0xff, 0x89, 0x56, 0xaf, 0x50, 0xce, 0x9a, 0xd6, 0x7c, 0x10, 0xad, 0x89, + 0x50, 0xcd, 0x18, 0x82, 0x7f, 0x2b, 0xcb, 0xb4, 0xa5, 0xaa, 0x52, 0x1f, 0x1a, 0xaf, 0xb5, 0xc2, 0x59, 0x3e, 0x8e, + 0xbc, 0xd7, 0x18, 0x3a, 0x36, 0x71, 0x96, 0x72, 0x2a, 0x75, 0xfe, 0xd7, 0xa1, 0x8c, 0x1c, 0xe0, 0x74, 0xc2, 0xc6, + 0xd3, 0xe4, 0x58, 0x4e, 0x13, 0x07, 0x99, 0x9f, 0x33, 0x8c, 0xac, 0x6a, 0x40, 0x58, 0x94, 0x0d, 0xa5, 0x2d, 0xc0, + 0x24, 0x27, 0x84, 0x4c, 0x31, 0x14, 0x45, 0x3e, 0xd2, 0xfd, 0xb0, 0xde, 0xac, 0xee, 0x8b, 0x77, 0x1a, 0xe0, 0x34, + 0x4c, 0x20, 0x10, 0x78, 0x11, 0xdf, 0x64, 0xe2, 0x12, 0x3c, 0x86, 0x07, 0xf0, 0x25, 0xb8, 0xc9, 0xa5, 0xec, 0xb7, + 0x2a, 0xcc, 0x71, 0x6d, 0x01, 0x83, 0x06, 0xab, 0x07, 0xd1, 0xe1, 0x52, 0xda, 0xec, 0x2a, 0x40, 0x6c, 0x4c, 0x21, + 0x96, 0x05, 0xdb, 0x58, 0xf6, 0xec, 0x7b, 0xd5, 0x34, 0xb4, 0x4e, 0x38, 0x11, 0x97, 0x39, 0x44, 0x51, 0x19, 0xc4, + 0xe0, 0x8e, 0xe4, 0xf1, 0x79, 0x8f, 0x44, 0x78, 0x41, 0xc0, 0xad, 0x2c, 0x96, 0xe1, 0x9a, 0xae, 0x46, 0xb7, 0x74, + 0x33, 0xba, 0xa1, 0x63, 0x3a, 0xf9, 0x66, 0x0c, 0x16, 0xd9, 0x3a, 0xf5, 0x8e, 0x6e, 0x46, 0x2b, 0xfa, 0xed, 0x98, + 0x1e, 0xfd, 0x0d, 0x4c, 0xf8, 0xf0, 0x30, 0xa1, 0x17, 0xe0, 0xd8, 0x45, 0x6a, 0xf4, 0xd4, 0xf4, 0x0d, 0x0e, 0xab, + 0x51, 0x3e, 0xe4, 0xa3, 0x9c, 0xf2, 0x51, 0x31, 0xac, 0x46, 0xe0, 0xe9, 0x58, 0x0d, 0xf9, 0xa8, 0xa2, 0x7c, 0x74, + 0x3e, 0xac, 0x46, 0xe7, 0xa4, 0xd9, 0xf4, 0x57, 0x15, 0xbf, 0x2a, 0x59, 0x0a, 0xdb, 0x02, 0x96, 0xaf, 0xe7, 0x15, + 0x95, 0xfa, 0xab, 0xda, 0x9c, 0xcc, 0x96, 0xb3, 0xb7, 0xd7, 0x5d, 0x4e, 0x2c, 0x1e, 0xb7, 0x4d, 0x87, 0xab, 0x2f, + 0x27, 0xea, 0xa4, 0x57, 0xc8, 0x0f, 0xe3, 0xa9, 0x50, 0xe7, 0x10, 0x98, 0x49, 0xcc, 0xc3, 0x98, 0x61, 0x33, 0x75, + 0x1a, 0x28, 0x70, 0xb2, 0x91, 0xe7, 0xa2, 0x98, 0x8d, 0x72, 0x0a, 0xef, 0x63, 0x42, 0x22, 0x01, 0x67, 0xd5, 0xac, + 0x1a, 0x15, 0x10, 0x73, 0x84, 0x85, 0xf8, 0x08, 0xfd, 0x52, 0x1f, 0x79, 0x48, 0xe0, 0x19, 0xf6, 0xb5, 0x18, 0xc4, + 0x70, 0xc4, 0xdb, 0xca, 0xaa, 0x79, 0x98, 0x40, 0x65, 0xd5, 0xb0, 0x34, 0x95, 0x15, 0x34, 0x1b, 0x55, 0x7e, 0x65, + 0x15, 0x8e, 0x51, 0x42, 0x48, 0x54, 0xea, 0xca, 0x40, 0x7d, 0x92, 0xb0, 0xb0, 0xd4, 0x95, 0x9d, 0xab, 0x8f, 0xce, + 0xfd, 0xca, 0xce, 0xc1, 0x85, 0x74, 0x90, 0xf8, 0x57, 0xa9, 0x3c, 0x6d, 0x5f, 0x07, 0x1b, 0xab, 0x8a, 0x6e, 0xf9, + 0x6d, 0x55, 0xc4, 0x51, 0x49, 0x5d, 0x0c, 0x68, 0x5c, 0x18, 0x91, 0xa4, 0x7a, 0x8d, 0x82, 0x3f, 0x24, 0x88, 0x4a, + 0x63, 0xf0, 0xea, 0x4c, 0xba, 0x56, 0x6a, 0x45, 0xc5, 0xa0, 0x1c, 0x14, 0x70, 0x7f, 0xca, 0x5b, 0x0b, 0xe9, 0x7b, + 0x88, 0xa8, 0x0c, 0xe5, 0x0d, 0xfe, 0x81, 0xc1, 0x93, 0xd9, 0x3a, 0x0d, 0x93, 0xd1, 0x1d, 0x8d, 0x47, 0x2b, 0x84, + 0x83, 0x61, 0x9b, 0x54, 0xe1, 0xad, 0x5f, 0x40, 0xfa, 0x2d, 0x8d, 0x47, 0x37, 0x34, 0xb5, 0x36, 0xa7, 0x06, 0xea, + 0xaa, 0x37, 0xa6, 0xb7, 0x11, 0xbc, 0xbe, 0x8b, 0x56, 0x14, 0xb6, 0xd2, 0x49, 0x9e, 0x5d, 0x8a, 0x28, 0xa5, 0x88, + 0x40, 0xb8, 0x41, 0xe4, 0xc0, 0x95, 0x46, 0x1b, 0xdc, 0x0c, 0xa0, 0x0c, 0x0d, 0x17, 0xb8, 0x1a, 0xc4, 0xa3, 0x95, + 0x47, 0xa6, 0x56, 0xfa, 0x22, 0x8b, 0xf0, 0xd1, 0xce, 0x46, 0x4b, 0xf1, 0x8c, 0x58, 0x18, 0x57, 0x30, 0x84, 0xba, + 0xb0, 0xd2, 0x14, 0x24, 0x5d, 0xe0, 0xc8, 0x5e, 0x58, 0x54, 0xe1, 0x16, 0x4c, 0x8b, 0xee, 0xc0, 0x3c, 0x0a, 0x14, + 0x0e, 0x2e, 0x41, 0xfa, 0x09, 0x65, 0x3b, 0x47, 0x69, 0x72, 0x78, 0x13, 0x94, 0xee, 0x4d, 0x10, 0xd2, 0xae, 0x6e, + 0xb2, 0x25, 0x7d, 0x83, 0xed, 0x3d, 0x3a, 0x15, 0x15, 0x54, 0x9f, 0x5b, 0x30, 0x59, 0xb2, 0x41, 0xd8, 0x12, 0xa6, + 0x67, 0x7a, 0x03, 0xd8, 0xd3, 0x87, 0x47, 0x7b, 0xf3, 0x5d, 0xcc, 0xff, 0x3a, 0x2c, 0xa3, 0xb1, 0xb2, 0xe0, 0xcd, + 0x2d, 0xb1, 0x5b, 0xb1, 0xf1, 0x74, 0x75, 0x5c, 0x4e, 0x57, 0x48, 0xec, 0x0c, 0xdd, 0x62, 0x7c, 0xb1, 0x5a, 0xd2, + 0x04, 0xcf, 0x36, 0x56, 0x2d, 0x56, 0x06, 0x2d, 0x25, 0x65, 0xb8, 0xde, 0x56, 0xe8, 0xff, 0xaf, 0x2e, 0x7e, 0x29, + 0xc0, 0x4b, 0x30, 0x16, 0x00, 0xc2, 0x3d, 0x98, 0x16, 0xa4, 0x36, 0xca, 0xc6, 0x2a, 0x0d, 0x53, 0x5c, 0x04, 0x26, + 0xa5, 0xdf, 0x0f, 0x73, 0x96, 0x12, 0x0f, 0x3a, 0xd4, 0x9d, 0xda, 0xa9, 0x2f, 0x04, 0x01, 0x1e, 0x49, 0x9d, 0x63, + 0x93, 0x6f, 0xc6, 0xf3, 0x40, 0x0d, 0x44, 0x10, 0x65, 0xc7, 0xf8, 0x88, 0x81, 0x8b, 0x22, 0x1d, 0xb7, 0xd3, 0x15, + 0x71, 0xb1, 0x7f, 0xcc, 0x42, 0x9c, 0x24, 0xcc, 0x35, 0xcf, 0x86, 0xac, 0x8a, 0x30, 0x41, 0x17, 0x06, 0x66, 0x79, + 0x43, 0x56, 0x1d, 0x1e, 0x41, 0xa4, 0x56, 0x5b, 0xc6, 0xba, 0xab, 0x8c, 0x6f, 0x01, 0xc8, 0x9a, 0x31, 0x76, 0xf4, + 0xb7, 0xf1, 0x5c, 0x7d, 0x13, 0x85, 0x7c, 0x76, 0xf4, 0x37, 0x48, 0x3e, 0xfe, 0x16, 0x99, 0x39, 0x48, 0x6e, 0x14, + 0x74, 0xd9, 0x9c, 0x75, 0x0d, 0xa5, 0x89, 0x6b, 0xaf, 0xd4, 0x6b, 0x4f, 0x9a, 0xb5, 0x57, 0xa0, 0x3b, 0xb5, 0xe1, + 0x3d, 0x94, 0xed, 0x2c, 0x98, 0xa0, 0xa3, 0xd9, 0x1d, 0xe8, 0xe0, 0x9d, 0x22, 0xe8, 0x45, 0x12, 0x1a, 0x8f, 0x50, + 0x65, 0xd4, 0x0b, 0x3b, 0xb2, 0x9b, 0x75, 0xc9, 0x3c, 0x03, 0xe6, 0xd8, 0x9e, 0x43, 0x62, 0x98, 0xab, 0x83, 0x3a, + 0x65, 0xe5, 0x30, 0xc7, 0x03, 0x78, 0xc3, 0xe4, 0x50, 0x0c, 0x72, 0x8d, 0xf2, 0x7d, 0xc1, 0x8a, 0x61, 0x39, 0xc8, + 0x35, 0x37, 0x33, 0x6d, 0xc6, 0xa6, 0x4d, 0x74, 0x78, 0xe6, 0x35, 0x9b, 0xad, 0x7b, 0xc0, 0xc7, 0x82, 0x27, 0xb3, + 0xef, 0xf9, 0xf8, 0x1a, 0x38, 0x99, 0xed, 0x6d, 0xb4, 0xa2, 0x77, 0x51, 0x4a, 0x6f, 0xa2, 0x0d, 0x5d, 0x45, 0x17, + 0xc6, 0xc4, 0x38, 0xa9, 0xe1, 0x1c, 0x80, 0x56, 0x01, 0x24, 0x9e, 0xfa, 0xf5, 0x9e, 0x27, 0x55, 0xb8, 0xa2, 0x29, + 0xb8, 0x0d, 0xfb, 0xf6, 0x99, 0x57, 0xbe, 0x44, 0x6a, 0x8b, 0x18, 0x6b, 0xd6, 0x50, 0x71, 0xeb, 0xad, 0xfb, 0x48, + 0xd4, 0xb0, 0x73, 0x5d, 0x6c, 0xa2, 0x6a, 0x38, 0x99, 0x96, 0x80, 0xd8, 0x5a, 0x0e, 0x87, 0xee, 0x08, 0xd9, 0x3f, + 0x7e, 0x74, 0xa0, 0xe7, 0x9e, 0xb4, 0xd8, 0xb6, 0x2d, 0x7f, 0x60, 0x08, 0x53, 0xfa, 0xe9, 0x23, 0x1f, 0x10, 0x2b, + 0x2e, 0xe1, 0x6c, 0x04, 0xea, 0x68, 0x85, 0x4e, 0xbf, 0x55, 0x61, 0xa1, 0x0f, 0xf0, 0xed, 0x6d, 0x94, 0xd0, 0xbb, + 0x28, 0xf7, 0xc8, 0xda, 0xaa, 0x66, 0x72, 0x7a, 0x96, 0x85, 0xbc, 0x7d, 0xa0, 0x97, 0x4b, 0x00, 0xd1, 0x1a, 0xc4, + 0xbe, 0xd4, 0xf5, 0x08, 0x9c, 0x86, 0xd0, 0x24, 0x34, 0x82, 0xab, 0x0a, 0xc2, 0x08, 0xb8, 0x92, 0xf0, 0x37, 0x98, + 0xa8, 0xc0, 0x17, 0xe0, 0x22, 0x93, 0xa6, 0x39, 0x0f, 0x6a, 0x7f, 0x24, 0x4f, 0x8b, 0xb6, 0xb7, 0x2b, 0x8c, 0x26, + 0x18, 0x7b, 0xa2, 0x7d, 0x1e, 0x29, 0x47, 0x71, 0x91, 0x84, 0xd9, 0xe8, 0x56, 0x9d, 0xe7, 0x34, 0x1b, 0xdd, 0xe9, + 0x5f, 0x15, 0x1d, 0xd3, 0xef, 0x74, 0x40, 0x1b, 0x25, 0x7d, 0xeb, 0x38, 0x1b, 0xd0, 0x7a, 0xb1, 0x34, 0xfe, 0xd7, + 0x72, 0x74, 0x4b, 0xe5, 0xe8, 0xce, 0xb7, 0xa4, 0x9a, 0x4c, 0x8b, 0x63, 0x81, 0x86, 0x54, 0x9d, 0xdf, 0x17, 0xc0, + 0xcf, 0x95, 0xc6, 0x77, 0xda, 0x7c, 0xef, 0xb5, 0xff, 0xbc, 0x93, 0x27, 0x50, 0x2c, 0x51, 0xc1, 0xaa, 0x11, 0xd8, + 0xb1, 0x6f, 0xf2, 0xb8, 0x30, 0xa3, 0x14, 0x53, 0x6b, 0xd2, 0x8f, 0x81, 0x2b, 0xa6, 0xbd, 0x02, 0x5c, 0x2d, 0x77, + 0x3b, 0x15, 0x43, 0x13, 0xf6, 0xec, 0x18, 0xa2, 0x9e, 0x1b, 0xc7, 0x28, 0xd9, 0x70, 0x0f, 0x88, 0xb5, 0xcc, 0x5b, + 0xb9, 0x04, 0x24, 0xf0, 0xd6, 0xc3, 0xa4, 0x00, 0x8c, 0xc1, 0x72, 0x45, 0x74, 0x1e, 0x0f, 0x7d, 0x42, 0xbd, 0xd0, + 0xa8, 0x13, 0xb2, 0xb1, 0x25, 0x70, 0xfc, 0x61, 0x7d, 0x08, 0x04, 0xaf, 0xf2, 0x5c, 0x7f, 0xa5, 0x75, 0xfd, 0xa5, + 0xd2, 0x73, 0xc7, 0x72, 0x5d, 0x3f, 0x6b, 0x53, 0xa3, 0x97, 0x60, 0xe1, 0xbb, 0x55, 0xe6, 0x91, 0xdc, 0x22, 0xa4, + 0x2a, 0xb0, 0x52, 0xb7, 0x90, 0x60, 0xfe, 0x95, 0x9c, 0xad, 0xca, 0x7c, 0xf5, 0xc8, 0x83, 0x72, 0x36, 0x3d, 0xfd, + 0x0d, 0x09, 0xda, 0x5d, 0x47, 0x9a, 0xc7, 0x5b, 0x74, 0xf8, 0xec, 0x5a, 0x4b, 0xcc, 0xbd, 0x44, 0xc5, 0xf3, 0x29, + 0x60, 0xab, 0xe7, 0xd9, 0x95, 0xf2, 0xb1, 0xda, 0xc7, 0xf1, 0x33, 0xe7, 0x4f, 0x5c, 0x85, 0x1b, 0xd1, 0x50, 0x82, + 0x80, 0x37, 0x87, 0xb1, 0x2b, 0x54, 0x01, 0x0d, 0xcd, 0x0d, 0x1c, 0xe7, 0x6a, 0x58, 0x69, 0x02, 0xa6, 0xa5, 0x3c, + 0x3a, 0xc0, 0xa1, 0xc9, 0xa3, 0x76, 0xd3, 0xb0, 0x32, 0x74, 0xad, 0xd1, 0xe7, 0xb6, 0xd2, 0x19, 0x6f, 0x36, 0xfc, + 0xf0, 0x68, 0x50, 0xe1, 0x4f, 0xd2, 0x1c, 0x8d, 0x76, 0x6e, 0xb8, 0xd3, 0x08, 0xcc, 0x5c, 0xc9, 0x35, 0xd9, 0x1f, + 0x25, 0x2f, 0xbf, 0xa7, 0x17, 0x16, 0xd0, 0x9f, 0xff, 0x5c, 0x4c, 0x38, 0x69, 0x89, 0x09, 0xd1, 0xd2, 0x41, 0x8b, + 0x0e, 0xf6, 0x94, 0x57, 0xf6, 0x25, 0x5e, 0x3a, 0xc7, 0xff, 0xbe, 0x1e, 0x6b, 0x5f, 0x81, 0xd0, 0xea, 0xe4, 0x61, + 0x7b, 0xb2, 0x40, 0xd4, 0x80, 0x6a, 0x76, 0x55, 0x8e, 0x32, 0xed, 0xac, 0xc8, 0xb6, 0x21, 0x73, 0xdd, 0xcf, 0xd2, + 0xb0, 0x99, 0xec, 0x58, 0x58, 0x66, 0x18, 0xac, 0x9d, 0x2a, 0xfa, 0x1c, 0xb4, 0xfc, 0x08, 0x9e, 0x37, 0x95, 0x67, + 0x3e, 0x9b, 0x65, 0xc4, 0x0b, 0x74, 0xc1, 0xa9, 0x58, 0x36, 0xa5, 0x63, 0xe5, 0x6e, 0x57, 0xa2, 0xb1, 0x44, 0x19, + 0x05, 0x41, 0x6d, 0x83, 0xb0, 0xeb, 0xd2, 0x3d, 0xe9, 0xd3, 0x3e, 0x3e, 0xad, 0x40, 0xdf, 0xe3, 0xfb, 0x0c, 0x24, + 0xa6, 0x9e, 0xe4, 0xa1, 0x6a, 0x34, 0x47, 0x27, 0xcf, 0xe3, 0x54, 0xe3, 0xf3, 0x2b, 0xd9, 0x59, 0xf3, 0x6e, 0x35, + 0xa6, 0xf8, 0x8f, 0xd4, 0xed, 0x3b, 0x97, 0xa1, 0x89, 0xfe, 0x5a, 0x1e, 0xb4, 0x14, 0x16, 0x1c, 0xb7, 0x8d, 0xbf, + 0x7e, 0x9b, 0x39, 0xc4, 0xb0, 0x74, 0x39, 0xbc, 0x09, 0x1d, 0xba, 0xbb, 0xca, 0xde, 0x5c, 0x1f, 0x51, 0xa7, 0x2e, + 0xd6, 0x6d, 0x40, 0xc9, 0x92, 0x77, 0xeb, 0xf4, 0xc4, 0x4a, 0xdf, 0x1d, 0x86, 0x7b, 0xf3, 0xa8, 0xd9, 0xdd, 0xdd, + 0x6e, 0x42, 0xda, 0xf6, 0xc1, 0x78, 0x5f, 0xc2, 0x42, 0x9c, 0x77, 0xd8, 0xc1, 0xf7, 0x61, 0xf5, 0x98, 0x0f, 0x7e, + 0xc6, 0x71, 0x86, 0xd1, 0xcf, 0x94, 0xa1, 0xcf, 0xcb, 0x42, 0x5e, 0xa9, 0x4e, 0xf9, 0x42, 0xb7, 0x96, 0xa9, 0xf7, + 0x9b, 0xf8, 0x4d, 0x2b, 0x40, 0x8c, 0xd7, 0x15, 0x2b, 0xc5, 0x1b, 0x5a, 0x61, 0x5c, 0x03, 0xb7, 0xc9, 0xa1, 0x96, + 0x6a, 0x81, 0xa8, 0xcb, 0x4f, 0x1e, 0xf3, 0xc8, 0xa8, 0x33, 0xe1, 0xbb, 0xc7, 0xdc, 0x97, 0xae, 0xed, 0x37, 0xf1, + 0x53, 0x4d, 0x3b, 0xdc, 0x1f, 0xe8, 0x8e, 0xd6, 0x3d, 0xdc, 0x3c, 0x9b, 0x9f, 0x47, 0xe6, 0x8b, 0x01, 0x36, 0x6b, + 0x9f, 0x71, 0xd9, 0x33, 0xdc, 0xf7, 0xa6, 0x07, 0x63, 0x01, 0x81, 0xc4, 0x0c, 0xbd, 0x0c, 0x5c, 0xe0, 0x02, 0x77, + 0x85, 0x01, 0x43, 0x5c, 0xd3, 0x92, 0x33, 0x6d, 0x65, 0xeb, 0x23, 0x6f, 0xa3, 0x42, 0xb0, 0xae, 0x3b, 0x6e, 0x92, + 0x1c, 0x82, 0x13, 0xb6, 0xdc, 0xfb, 0xda, 0x6b, 0x67, 0xf8, 0x8f, 0x81, 0x70, 0x6e, 0x89, 0x9e, 0x51, 0xdb, 0x63, + 0xad, 0xee, 0x35, 0xbc, 0xca, 0x5d, 0xe4, 0x59, 0xbf, 0x99, 0x97, 0x86, 0x7d, 0xc1, 0x6b, 0x29, 0x38, 0x34, 0xb6, + 0x5b, 0xe1, 0x16, 0x8b, 0x77, 0xb4, 0x5a, 0x59, 0x6b, 0xab, 0xbd, 0x56, 0x2a, 0x7a, 0xff, 0x9a, 0xe3, 0xc4, 0x59, + 0x0a, 0xdb, 0x0f, 0x1f, 0x2e, 0xd8, 0x35, 0x01, 0x0c, 0x5a, 0x4c, 0x16, 0x28, 0x41, 0x25, 0x6b, 0x55, 0xbb, 0x9d, + 0x12, 0xbf, 0xdc, 0xcf, 0xba, 0xcc, 0x76, 0x1e, 0xbf, 0x6e, 0xd2, 0x3e, 0xf1, 0x39, 0xfa, 0x61, 0x7e, 0x67, 0x9d, + 0x94, 0x9c, 0x61, 0x5c, 0xcb, 0xff, 0xaf, 0xa2, 0x97, 0x45, 0x96, 0x46, 0x5b, 0xc3, 0x83, 0xd9, 0x50, 0x9b, 0x3e, + 0x34, 0x46, 0xe5, 0x96, 0x8d, 0x22, 0xa2, 0xd5, 0x2d, 0x08, 0x66, 0x14, 0xf7, 0x25, 0xda, 0xbc, 0x52, 0x65, 0xe1, + 0x1d, 0x3e, 0xb1, 0xd1, 0x1b, 0xb6, 0x27, 0x84, 0xf2, 0xfd, 0xd3, 0xc2, 0xac, 0x5a, 0x2a, 0x1a, 0x6c, 0x97, 0xf0, + 0x2e, 0x46, 0x95, 0x7e, 0xc2, 0x64, 0xcb, 0x82, 0xa9, 0xfe, 0x7f, 0x5f, 0x64, 0x69, 0x9b, 0xa2, 0x03, 0xd3, 0xd9, + 0xf4, 0xe9, 0xa4, 0x5b, 0x5c, 0x67, 0xc0, 0x22, 0x82, 0x2d, 0x15, 0x8e, 0x47, 0xa9, 0xdd, 0x20, 0x61, 0x22, 0xb8, + 0x89, 0x7a, 0xd9, 0xd1, 0x32, 0x25, 0xab, 0x02, 0x9e, 0x5f, 0xb9, 0xca, 0x74, 0x1c, 0x0d, 0xfd, 0xfe, 0x55, 0x6a, + 0x42, 0xbf, 0x52, 0x2f, 0x55, 0x71, 0x1e, 0x46, 0xd5, 0xa1, 0xc2, 0x18, 0xad, 0x68, 0x0a, 0xc7, 0x60, 0x76, 0x11, + 0xa6, 0x78, 0x39, 0xdb, 0x26, 0xec, 0x33, 0x06, 0x72, 0xa5, 0x0d, 0xea, 0x35, 0x25, 0xda, 0xb0, 0xf6, 0x66, 0x4e, + 0x09, 0xbd, 0x60, 0xa5, 0x7f, 0x17, 0xda, 0x80, 0x40, 0x51, 0x36, 0x53, 0xa6, 0xe7, 0xba, 0x9d, 0x17, 0x34, 0xa1, + 0x05, 0x5d, 0x93, 0x1a, 0xf4, 0xbd, 0x4e, 0xce, 0x8e, 0x4e, 0x76, 0x66, 0xd6, 0x63, 0x56, 0x0c, 0x27, 0xd3, 0x18, + 0xae, 0x69, 0xb1, 0xbb, 0xa6, 0xad, 0x9a, 0x37, 0xae, 0xc6, 0xc6, 0x69, 0xd0, 0x2e, 0x90, 0xb6, 0x69, 0x6e, 0x3f, + 0xf5, 0xb8, 0xfd, 0x4d, 0xcd, 0x56, 0xd3, 0xde, 0x66, 0xb7, 0xeb, 0xa5, 0x60, 0x23, 0xea, 0xf1, 0xf1, 0x1b, 0x25, + 0x5d, 0xb7, 0x5c, 0x7e, 0x0a, 0xcf, 0x1e, 0x5f, 0xbf, 0xf2, 0xc1, 0xe5, 0x68, 0xd5, 0xe6, 0xee, 0x57, 0xfb, 0xc8, + 0x72, 0x9f, 0x35, 0xb4, 0x5c, 0xcf, 0x50, 0x93, 0x3c, 0x1b, 0xed, 0x1d, 0x6a, 0xc1, 0x72, 0xd6, 0x4d, 0x78, 0x62, + 0xb0, 0x63, 0xaf, 0x1a, 0x9b, 0xa3, 0x32, 0x97, 0xac, 0x06, 0x09, 0xf4, 0x49, 0x9e, 0x69, 0xfa, 0x07, 0x19, 0xe6, + 0xa3, 0x5b, 0x9a, 0x03, 0xae, 0x58, 0x65, 0x2f, 0x19, 0xa4, 0xae, 0xda, 0x4b, 0x5c, 0xf9, 0x0a, 0x87, 0x64, 0x8b, + 0x4f, 0x86, 0xa9, 0xfa, 0xe4, 0x92, 0x07, 0xff, 0x6f, 0xab, 0x56, 0xe9, 0xb9, 0x49, 0x6e, 0x38, 0xfe, 0x75, 0xd2, + 0xf6, 0x31, 0x31, 0x48, 0xc0, 0x53, 0xbb, 0x18, 0xaa, 0x51, 0x55, 0xc4, 0xa2, 0xcc, 0x4d, 0xcc, 0xb1, 0x7b, 0xbb, + 0x86, 0x0e, 0xca, 0xe0, 0xd7, 0x0d, 0x9f, 0x98, 0x3b, 0xb0, 0x15, 0xe8, 0xe8, 0x44, 0x73, 0x19, 0x66, 0xe6, 0x32, + 0x4c, 0xbb, 0xb6, 0x0a, 0x0c, 0xaf, 0xda, 0x2a, 0x89, 0x72, 0x35, 0xea, 0x71, 0x33, 0x4b, 0xcd, 0x5e, 0xe4, 0xdd, + 0x6b, 0xd2, 0x93, 0xf8, 0xd3, 0x95, 0x27, 0xaf, 0x87, 0x01, 0x91, 0x9f, 0xb3, 0x34, 0x5c, 0xa3, 0x20, 0x38, 0xb5, + 0xda, 0x81, 0x34, 0x1f, 0x01, 0x32, 0x3f, 0x4e, 0xc3, 0x77, 0x5a, 0x9c, 0x43, 0xb6, 0x4a, 0xe3, 0xc4, 0x56, 0x46, + 0x3d, 0x04, 0x77, 0xde, 0x2b, 0x1e, 0x43, 0xe0, 0xc3, 0x0f, 0xb8, 0x19, 0x54, 0x74, 0x5b, 0x62, 0xa2, 0xb4, 0x79, + 0xd4, 0x2d, 0x1f, 0x35, 0x84, 0x4a, 0x56, 0x86, 0x17, 0x43, 0x7b, 0xf7, 0x04, 0x46, 0x95, 0x13, 0xc8, 0x0c, 0x8b, + 0xc3, 0xa3, 0x61, 0xaa, 0x04, 0x45, 0x43, 0x39, 0x5c, 0xa1, 0x1c, 0x10, 0x93, 0x40, 0x60, 0x54, 0x0c, 0x52, 0x5d, + 0x99, 0x7a, 0x31, 0x48, 0xf5, 0xad, 0x8a, 0xd4, 0x67, 0x59, 0x58, 0x51, 0xdd, 0x22, 0x3a, 0xa6, 0x43, 0x49, 0x57, + 0x66, 0xa7, 0xe6, 0x5a, 0x7a, 0xa1, 0x96, 0xe3, 0x33, 0x9d, 0x06, 0xa3, 0x78, 0xea, 0x52, 0xf4, 0x5b, 0xb5, 0x9f, + 0xfd, 0xb7, 0x98, 0x52, 0x23, 0x36, 0xb5, 0xb7, 0x88, 0x61, 0xd5, 0x7e, 0xc8, 0xaa, 0x1c, 0xb4, 0xbb, 0xa0, 0x6c, + 0xac, 0x8c, 0xf3, 0x7c, 0x23, 0x98, 0x39, 0x68, 0x1b, 0xab, 0xa6, 0x0f, 0xbd, 0x11, 0xa3, 0xf6, 0xc6, 0x54, 0xe3, + 0x9e, 0xc0, 0x4f, 0x1b, 0x34, 0xdd, 0x8b, 0x3c, 0x47, 0x3d, 0xf2, 0xee, 0x7f, 0xe6, 0xc8, 0xce, 0xe4, 0x93, 0x58, + 0x26, 0x75, 0xfb, 0x98, 0x04, 0x0b, 0x55, 0xc7, 0xe8, 0xc2, 0x8d, 0x4c, 0x69, 0x3f, 0xf7, 0xa6, 0x1f, 0xf1, 0x4c, + 0x1e, 0xb6, 0x43, 0xa3, 0xbe, 0x34, 0xac, 0x25, 0x45, 0xd4, 0x17, 0xf4, 0xd6, 0x54, 0x47, 0x47, 0xd4, 0xeb, 0x08, + 0xac, 0xae, 0x68, 0x8b, 0x1a, 0x80, 0xc9, 0xb8, 0xb6, 0xb5, 0xf9, 0x1c, 0x4c, 0x6d, 0x55, 0x05, 0x4f, 0xe9, 0xbe, + 0x50, 0xba, 0x37, 0xa9, 0xeb, 0xd6, 0x10, 0x5b, 0xc0, 0x80, 0xc0, 0x8d, 0x9e, 0x9a, 0xfe, 0xa0, 0x89, 0x0a, 0x40, + 0x83, 0xc6, 0xed, 0x4c, 0xe7, 0x48, 0xf4, 0x3b, 0xb5, 0x69, 0x9b, 0xa9, 0x5e, 0x55, 0x3e, 0x80, 0x8a, 0x3f, 0x4b, + 0x67, 0x17, 0x66, 0xc4, 0x02, 0x18, 0xf7, 0xc0, 0x99, 0xea, 0x9d, 0x64, 0x60, 0x3d, 0x91, 0xe7, 0x59, 0xc9, 0x13, + 0x29, 0x60, 0x46, 0xe4, 0xd5, 0x95, 0x14, 0x30, 0x0c, 0x6a, 0x00, 0xd0, 0xa2, 0xb9, 0x8c, 0x26, 0xfc, 0xab, 0x9a, + 0xde, 0x97, 0x87, 0x7f, 0xa5, 0x73, 0x7d, 0x3d, 0xae, 0xc1, 0x50, 0x79, 0x53, 0xf1, 0xbd, 0x4c, 0x5f, 0xf3, 0x27, + 0x5e, 0xa6, 0x95, 0xdc, 0x14, 0x7b, 0x59, 0xbe, 0xfa, 0x9a, 0x3f, 0xd5, 0x79, 0x8e, 0x9e, 0xd4, 0x34, 0x8d, 0xef, + 0xf6, 0xb2, 0x7c, 0xf3, 0xf5, 0x13, 0x9b, 0xe7, 0xab, 0x71, 0x4d, 0x6f, 0x38, 0xff, 0xe8, 0x32, 0x4d, 0x74, 0x55, + 0xe3, 0x27, 0xdf, 0xd8, 0x5c, 0x4f, 0x6a, 0x7a, 0x25, 0x45, 0xb5, 0xda, 0x2b, 0xea, 0xe8, 0xeb, 0xa3, 0x6f, 0xf8, + 0xd7, 0xa6, 0x7b, 0x47, 0x35, 0xfd, 0x73, 0x13, 0x17, 0x15, 0x2f, 0xf6, 0x8a, 0xfb, 0xdb, 0x37, 0xdf, 0x3c, 0xb1, + 0x19, 0x9f, 0xd4, 0xf4, 0x8e, 0xc7, 0x1d, 0x6d, 0x9f, 0x3c, 0x7d, 0xc2, 0xff, 0x56, 0xd7, 0xf4, 0x17, 0xe6, 0x07, + 0x47, 0x3d, 0xc9, 0x3c, 0x3d, 0x7c, 0x22, 0x9b, 0xa8, 0x01, 0x43, 0x0f, 0x0d, 0x20, 0x97, 0x56, 0x4d, 0x73, 0x8f, + 0x57, 0x2e, 0xb8, 0x7d, 0x9f, 0xc5, 0x69, 0xbc, 0x86, 0x83, 0x60, 0x8b, 0xc6, 0x59, 0x05, 0x70, 0xaa, 0xc0, 0x7b, + 0x46, 0x25, 0xcd, 0x4a, 0xf9, 0x0f, 0xce, 0x3f, 0xc2, 0xa0, 0x21, 0xa4, 0x8d, 0x8a, 0x0c, 0xf4, 0x76, 0xad, 0x23, + 0x1b, 0xa1, 0xff, 0x66, 0x33, 0x0e, 0x8e, 0x0f, 0xa3, 0xd7, 0xef, 0x87, 0x05, 0x13, 0x61, 0x41, 0x08, 0xfd, 0x23, + 0x2c, 0xc0, 0xa1, 0xa4, 0x60, 0x5e, 0x3e, 0xe3, 0x7b, 0xae, 0x8d, 0xc2, 0x42, 0x10, 0xdd, 0x45, 0xf6, 0x01, 0x55, + 0x8f, 0xbe, 0x43, 0x37, 0xc4, 0xcb, 0x0a, 0x0b, 0x86, 0x56, 0x35, 0x30, 0x43, 0x50, 0xfc, 0x6b, 0x1e, 0x4a, 0xf0, + 0x89, 0x07, 0xf8, 0xe8, 0x31, 0x99, 0x73, 0x75, 0xad, 0x7d, 0x7b, 0x11, 0x16, 0x34, 0xd0, 0x6d, 0x87, 0xa0, 0x03, + 0x91, 0xff, 0x02, 0x3c, 0x05, 0x06, 0x3e, 0x2c, 0xec, 0x4a, 0xee, 0xfb, 0xab, 0xff, 0x62, 0x58, 0x47, 0x17, 0x7e, + 0xf4, 0x17, 0xeb, 0xc2, 0x9e, 0x91, 0xa9, 0x3c, 0x2e, 0x87, 0x93, 0xe9, 0x60, 0x20, 0x5d, 0x1c, 0xb7, 0x93, 0x6c, + 0xf1, 0xcb, 0x42, 0x2e, 0x97, 0xa8, 0xfb, 0xc6, 0x79, 0x9d, 0xeb, 0xbf, 0x91, 0x76, 0x3e, 0x78, 0x7d, 0xf2, 0xdb, + 0xd9, 0xe9, 0xc9, 0x4b, 0x70, 0x3e, 0xf8, 0xf0, 0xe2, 0xfb, 0x17, 0xef, 0x55, 0x70, 0x77, 0x35, 0xe7, 0xfd, 0xbe, + 0x93, 0xfa, 0x84, 0x7c, 0x58, 0x91, 0xc3, 0x30, 0x7e, 0x5c, 0x28, 0xa3, 0x07, 0x72, 0xcc, 0x2c, 0x14, 0x32, 0x54, + 0x51, 0xdb, 0xdf, 0xe5, 0x70, 0xe2, 0x81, 0x59, 0xdc, 0x35, 0x44, 0xb8, 0x7e, 0xcb, 0x6d, 0x90, 0x35, 0x39, 0xf3, + 0xfa, 0xc1, 0xc9, 0x54, 0x3a, 0xb6, 0xb0, 0x60, 0x50, 0x36, 0xb4, 0xe9, 0x24, 0x5b, 0x14, 0x4b, 0xdb, 0x2e, 0xb7, + 0x40, 0x46, 0x69, 0x76, 0x71, 0x11, 0x2a, 0xe8, 0xea, 0x19, 0x68, 0x00, 0x4c, 0xa3, 0x0a, 0xd7, 0x22, 0x3e, 0xf7, + 0xcb, 0x8f, 0xc6, 0x5e, 0xf3, 0x6e, 0x51, 0xf7, 0x64, 0x9a, 0x55, 0x35, 0x06, 0x74, 0x30, 0xa1, 0xdc, 0x0d, 0xba, + 0x09, 0x26, 0xa3, 0xda, 0xf2, 0xcb, 0xa2, 0x5a, 0x9a, 0xe6, 0xb8, 0x61, 0xa8, 0xbc, 0x92, 0x37, 0xb2, 0x81, 0xc8, + 0x40, 0x32, 0x0c, 0x7b, 0x34, 0x46, 0x91, 0xfa, 0xc1, 0xbe, 0x77, 0xfc, 0x36, 0x97, 0x10, 0x4d, 0x31, 0x03, 0xe9, + 0xfc, 0x89, 0x50, 0xce, 0xe5, 0x92, 0xf1, 0x85, 0x58, 0xce, 0xc0, 0xed, 0x7c, 0x21, 0x96, 0x11, 0x06, 0xe5, 0xcb, + 0x20, 0x56, 0x09, 0xd8, 0xbd, 0x38, 0x08, 0xdf, 0x4e, 0x68, 0x03, 0xbb, 0x81, 0x24, 0x1b, 0x94, 0x76, 0xa5, 0x21, + 0xca, 0x9d, 0xf2, 0x68, 0x83, 0xc8, 0x43, 0xac, 0x5a, 0x54, 0x6d, 0x4f, 0x36, 0x73, 0x31, 0xc1, 0x55, 0x16, 0x33, + 0x39, 0x8d, 0x8f, 0x59, 0x31, 0x8d, 0xa1, 0x94, 0x38, 0x4d, 0xc3, 0x98, 0x4e, 0xa8, 0x20, 0x24, 0x61, 0x7c, 0x11, + 0x2f, 0x69, 0x82, 0x52, 0x82, 0x10, 0x42, 0x7e, 0x8c, 0xd0, 0x36, 0x07, 0x96, 0xbc, 0xdd, 0x7e, 0x9e, 0x7e, 0x6e, + 0xcf, 0x70, 0x19, 0x15, 0xa1, 0x5b, 0x74, 0xd6, 0xf0, 0x6f, 0x44, 0x05, 0x8d, 0xb1, 0x62, 0x08, 0x02, 0x5e, 0x60, + 0x54, 0xc2, 0x82, 0xc4, 0xac, 0x82, 0x28, 0x02, 0xe5, 0x22, 0x5e, 0xb2, 0x82, 0x36, 0x6d, 0x4e, 0x63, 0x6d, 0x12, + 0xd4, 0x73, 0x58, 0x6a, 0x07, 0x52, 0xa9, 0x10, 0x7b, 0x7c, 0x2e, 0xa2, 0x6b, 0x6d, 0x68, 0x00, 0x28, 0x50, 0x4a, + 0x2e, 0x7e, 0xf3, 0xf9, 0x1e, 0x6e, 0x0a, 0xfa, 0x9f, 0x6d, 0x4d, 0xb4, 0xb3, 0x5c, 0x1d, 0x7a, 0x8b, 0x25, 0x8d, + 0xf3, 0x1c, 0x42, 0xb1, 0x19, 0x04, 0x72, 0x91, 0x55, 0x10, 0xd1, 0xe2, 0x2e, 0x30, 0x21, 0xe1, 0xa0, 0x4d, 0xbf, + 0x40, 0x6a, 0x43, 0x4c, 0xae, 0x3c, 0x31, 0xb0, 0xdb, 0x2a, 0x41, 0xc0, 0x91, 0x9e, 0x67, 0x7f, 0x35, 0x31, 0xd6, + 0x34, 0x35, 0x33, 0xf1, 0x36, 0x14, 0xa2, 0x41, 0x0b, 0xa2, 0x19, 0xbc, 0x7f, 0xae, 0x38, 0x5e, 0x75, 0xe0, 0x07, + 0xbc, 0x73, 0x71, 0xe6, 0xd5, 0xcc, 0x23, 0x72, 0xea, 0xa3, 0x1c, 0xd1, 0x2f, 0x79, 0x58, 0x8d, 0x74, 0x32, 0xc6, + 0x4a, 0xe2, 0xa0, 0xb7, 0xc1, 0x82, 0x39, 0xa1, 0x6b, 0x1e, 0x5a, 0x3e, 0xfe, 0x25, 0x32, 0x19, 0x25, 0x35, 0x56, + 0x74, 0xa5, 0xc5, 0x88, 0xf3, 0x1a, 0x66, 0x69, 0xb2, 0xa2, 0x8b, 0x85, 0x26, 0xcd, 0x42, 0x99, 0x06, 0xf8, 0x04, + 0x5a, 0x8c, 0xdc, 0x43, 0x4d, 0x1b, 0x08, 0x0d, 0xfb, 0x43, 0xc0, 0x47, 0xee, 0xa1, 0xc3, 0xff, 0xcf, 0xb3, 0x0b, + 0x44, 0xda, 0x9b, 0x9b, 0xc8, 0x78, 0xa4, 0x6e, 0xe0, 0xa0, 0x18, 0x1f, 0xfb, 0x66, 0xe2, 0x67, 0xce, 0xe8, 0x43, + 0x52, 0xf9, 0x0e, 0x1f, 0x2c, 0x7f, 0xbc, 0xa9, 0x99, 0x95, 0x11, 0xac, 0x87, 0xdd, 0x0e, 0x17, 0x44, 0xdb, 0x05, + 0x90, 0x7a, 0xc6, 0xab, 0x85, 0x6f, 0xbc, 0x1a, 0xdf, 0x63, 0xbc, 0xea, 0xce, 0xd4, 0x30, 0x27, 0x5b, 0xd4, 0x67, + 0x29, 0x79, 0x7e, 0x8e, 0x32, 0xc1, 0xa6, 0xcb, 0x59, 0x49, 0x55, 0x2a, 0xa1, 0xbd, 0xd8, 0xcf, 0x18, 0xdf, 0x12, + 0x8c, 0xb3, 0xe2, 0x30, 0x12, 0xa8, 0x4a, 0x25, 0x75, 0xd8, 0x2b, 0x40, 0x3d, 0x06, 0xef, 0x0d, 0x86, 0xa8, 0x91, + 0xb1, 0x9b, 0x36, 0x10, 0x1a, 0x1a, 0xeb, 0xd1, 0x9e, 0xb5, 0x1e, 0xdd, 0xed, 0x2a, 0xe3, 0x6f, 0x27, 0x37, 0x45, + 0x82, 0xa8, 0xc2, 0x6a, 0x34, 0x01, 0xde, 0x34, 0xb1, 0xb7, 0x25, 0xa7, 0xb4, 0xc0, 0xf0, 0xd9, 0x7f, 0x84, 0xa5, + 0x53, 0x49, 0x94, 0x64, 0x5e, 0x46, 0x03, 0x77, 0x0e, 0x3e, 0x8f, 0x2b, 0x58, 0x03, 0x10, 0xc9, 0x11, 0x3d, 0x5c, + 0xff, 0x08, 0xa5, 0xcb, 0x2c, 0xc9, 0x5c, 0x42, 0x66, 0x2e, 0xd2, 0x76, 0xd6, 0xc1, 0xc4, 0x99, 0xd4, 0x7a, 0x63, + 0x21, 0x87, 0x06, 0xf9, 0x01, 0x94, 0x21, 0x0e, 0x9f, 0x7c, 0x30, 0xa1, 0x52, 0x85, 0x52, 0x6d, 0x74, 0xb3, 0x1b, + 0x78, 0xe5, 0x43, 0x76, 0xc5, 0xcb, 0x2a, 0xbe, 0x5a, 0x1b, 0x4b, 0x62, 0xce, 0xee, 0x73, 0xdb, 0xa3, 0xc2, 0xbc, + 0x7a, 0xf3, 0xe2, 0xfb, 0x93, 0xc6, 0xab, 0x7d, 0xc4, 0xd1, 0x10, 0x6c, 0x2b, 0xc6, 0x18, 0xbd, 0xc5, 0xa7, 0xc1, + 0x44, 0xb9, 0x46, 0xa0, 0x77, 0x29, 0xe8, 0xb7, 0x3f, 0xd7, 0x13, 0xf0, 0x8a, 0xeb, 0xe5, 0x97, 0x7c, 0x04, 0x2c, + 0x51, 0xa1, 0x67, 0x85, 0xb9, 0x59, 0x99, 0xdf, 0xdb, 0xad, 0xc8, 0x4c, 0xbb, 0xd2, 0xc8, 0x40, 0xbc, 0xda, 0x0e, + 0x63, 0xe1, 0xd2, 0x35, 0xdd, 0x0e, 0x76, 0xb5, 0xf2, 0x2c, 0x91, 0x77, 0xbb, 0x12, 0x3a, 0x64, 0x07, 0xdc, 0x7b, + 0x19, 0xdf, 0xc2, 0xcb, 0xd2, 0xeb, 0x66, 0x33, 0x78, 0x02, 0x98, 0x09, 0x17, 0xce, 0xb2, 0x38, 0x66, 0x3c, 0x09, + 0x55, 0x6c, 0xae, 0x86, 0xc8, 0x5b, 0x11, 0x5a, 0xb3, 0xbf, 0x42, 0x31, 0x02, 0xbb, 0x93, 0xd3, 0x8f, 0xd9, 0x7a, + 0xbe, 0x02, 0xd4, 0xfc, 0xab, 0x4c, 0x00, 0xcd, 0xb5, 0x6b, 0xc1, 0x36, 0x85, 0x36, 0xd7, 0xf5, 0xb3, 0x78, 0x1d, + 0x27, 0xa0, 0xba, 0x01, 0x6f, 0x91, 0x3b, 0x2d, 0xba, 0x32, 0xe8, 0xa2, 0xf4, 0x81, 0x72, 0x2c, 0x29, 0x74, 0xf4, + 0xbd, 0x27, 0xd4, 0xb9, 0x67, 0x00, 0x97, 0x34, 0x6a, 0x9e, 0x6a, 0x29, 0x63, 0x01, 0xb0, 0xd0, 0xc1, 0x5c, 0x91, + 0xad, 0xe8, 0xd6, 0x60, 0x52, 0xc0, 0x5b, 0x03, 0xfc, 0x21, 0xb2, 0x4a, 0xdd, 0x15, 0xcb, 0xb0, 0xf4, 0xec, 0xaf, + 0xfb, 0xfd, 0xd8, 0xb3, 0xbf, 0xbe, 0xd0, 0xb4, 0x2e, 0x6e, 0x37, 0x80, 0xd4, 0x18, 0x40, 0xe4, 0x44, 0x0f, 0x84, + 0x89, 0x28, 0xd6, 0xf4, 0xfd, 0x3b, 0x31, 0x59, 0x14, 0x08, 0xfd, 0x5e, 0xbd, 0x9e, 0x94, 0x04, 0x74, 0x6a, 0x15, + 0x9b, 0x0d, 0xb4, 0xd9, 0x07, 0x04, 0x44, 0xf5, 0x33, 0xb2, 0xc5, 0x52, 0x39, 0x17, 0xab, 0xf0, 0xe1, 0x63, 0x0a, + 0x01, 0x85, 0x3b, 0x6a, 0x74, 0xde, 0x86, 0x48, 0xa0, 0xac, 0x50, 0xc4, 0x9a, 0x17, 0x6b, 0x49, 0xc8, 0x62, 0xbc, + 0x44, 0xc1, 0x95, 0x03, 0x76, 0xe5, 0x6c, 0x32, 0x2c, 0x23, 0xce, 0xc2, 0xfb, 0xbf, 0x99, 0x2c, 0x09, 0x6a, 0xae, + 0xfc, 0x40, 0x8e, 0x7b, 0x99, 0x1a, 0x7b, 0xaa, 0x51, 0x83, 0x60, 0x32, 0x82, 0xc0, 0x70, 0xc3, 0xcf, 0xf8, 0xf8, + 0x68, 0x49, 0x40, 0x45, 0x66, 0xcd, 0x42, 0xcc, 0x8b, 0xe3, 0xaf, 0x00, 0x35, 0x66, 0x74, 0xf4, 0x14, 0x40, 0x61, + 0x21, 0x20, 0xfa, 0x18, 0x64, 0xb4, 0x02, 0x7e, 0x0b, 0xf5, 0xbb, 0x75, 0xe2, 0xfb, 0xd0, 0xaf, 0x82, 0x5e, 0xc4, + 0xc0, 0x70, 0x44, 0x93, 0xc3, 0x90, 0x0f, 0x26, 0x03, 0xd0, 0x96, 0x78, 0xbb, 0xaf, 0xa5, 0x15, 0x37, 0xa7, 0x4b, + 0xa7, 0xfb, 0x27, 0x6d, 0x82, 0x24, 0x52, 0xc9, 0x4a, 0x45, 0x0c, 0x20, 0x94, 0xa5, 0xda, 0x26, 0x2b, 0xb0, 0xac, + 0x30, 0x4b, 0x9a, 0x1b, 0x94, 0xc4, 0xfd, 0xcd, 0xc0, 0x31, 0x6a, 0xd6, 0x49, 0x58, 0xb6, 0xdc, 0xa8, 0x01, 0x3e, + 0x27, 0x61, 0x85, 0xbd, 0xe1, 0xcc, 0xa5, 0x77, 0xa6, 0xc3, 0xd5, 0x31, 0x67, 0xaf, 0x39, 0x82, 0x71, 0x24, 0x78, + 0xe3, 0xa1, 0x2b, 0xa6, 0xa1, 0x22, 0x53, 0xc6, 0xc1, 0xb4, 0x07, 0xb8, 0xf7, 0x1c, 0x8c, 0xc3, 0xd8, 0xa0, 0xb2, + 0xa4, 0x3e, 0xf5, 0xee, 0x42, 0x20, 0x48, 0x6b, 0xbd, 0xcc, 0xe7, 0x78, 0x7a, 0x46, 0x28, 0xfb, 0x43, 0x0e, 0x5f, + 0x80, 0x1d, 0x05, 0x99, 0x4d, 0xf8, 0xd3, 0xc7, 0xfb, 0x81, 0xaa, 0xf8, 0x20, 0x38, 0x88, 0x45, 0x7a, 0x10, 0x0c, + 0x04, 0xfc, 0x2a, 0xf8, 0x41, 0x25, 0xe5, 0xc1, 0x45, 0x5c, 0x1c, 0xc4, 0xeb, 0xb8, 0xa8, 0x0e, 0x6e, 0xb2, 0x6a, + 0x75, 0x60, 0x3a, 0x04, 0xd0, 0xbc, 0xc1, 0x20, 0x1e, 0x04, 0x07, 0xc1, 0xa0, 0x30, 0x53, 0xbb, 0x66, 0x65, 0xe3, + 0x38, 0x33, 0x21, 0xca, 0x82, 0x66, 0x80, 0xb0, 0xc6, 0x69, 0x00, 0x7c, 0xea, 0x86, 0xa5, 0xf4, 0x02, 0xc3, 0x0d, + 0x88, 0xe9, 0x06, 0xfa, 0x00, 0x3c, 0xf2, 0x86, 0xc6, 0xb0, 0x04, 0x2e, 0x06, 0x03, 0xb2, 0x81, 0xc8, 0x05, 0x1b, + 0x6a, 0x83, 0x38, 0x84, 0x1b, 0x65, 0xa7, 0xbd, 0x0f, 0xcc, 0xb4, 0xdb, 0x01, 0xa2, 0xf2, 0x84, 0xf4, 0xfb, 0xf6, + 0x1b, 0xea, 0x5f, 0xb0, 0x57, 0x60, 0x7f, 0x55, 0x54, 0x61, 0x22, 0x95, 0xe6, 0xfb, 0x92, 0xcd, 0x06, 0x2a, 0xe2, + 0xf0, 0x9e, 0x23, 0x45, 0x1b, 0x95, 0xcb, 0xb2, 0x27, 0xab, 0x86, 0xaf, 0xc4, 0x15, 0x77, 0x7e, 0x5c, 0x95, 0x94, + 0x79, 0x95, 0xad, 0x15, 0xfb, 0x37, 0xe7, 0x9a, 0xfb, 0x03, 0xeb, 0xcf, 0xe6, 0x2b, 0xb8, 0xb6, 0x7a, 0xef, 0x9a, + 0x5c, 0x23, 0x72, 0x96, 0x50, 0x2e, 0xa9, 0x6d, 0x1e, 0xde, 0xd2, 0xf7, 0xf9, 0xd5, 0xb7, 0x99, 0x4e, 0xe3, 0xb3, + 0x0a, 0x0b, 0x17, 0xa2, 0x15, 0xc1, 0xa1, 0x21, 0x97, 0xcd, 0x23, 0xc0, 0x5c, 0xfb, 0x6c, 0x05, 0x05, 0xa9, 0xcf, + 0x2a, 0xf4, 0x6e, 0x85, 0x84, 0x97, 0x9a, 0x5d, 0x7a, 0x18, 0x48, 0x19, 0xb7, 0x87, 0x96, 0x30, 0x69, 0x79, 0x11, + 0xde, 0x7b, 0xcd, 0x4d, 0xee, 0x79, 0x88, 0xd1, 0x8b, 0x3c, 0x3b, 0x01, 0x63, 0xdd, 0x25, 0x3b, 0x1b, 0x9e, 0xf8, + 0x0d, 0xcf, 0x59, 0x8b, 0x46, 0xd3, 0x15, 0x4b, 0xfa, 0xfd, 0x18, 0x4c, 0xbc, 0x53, 0x96, 0xc3, 0xaf, 0x7c, 0x49, + 0x37, 0x0c, 0x30, 0xc5, 0xe8, 0x05, 0x24, 0xa4, 0x88, 0x44, 0xb2, 0x51, 0x27, 0xc9, 0x27, 0xba, 0x0b, 0xc0, 0xe8, + 0x17, 0xf3, 0x34, 0x5a, 0xdd, 0x6b, 0x66, 0x81, 0xe4, 0x19, 0xfa, 0xae, 0x83, 0xed, 0x8d, 0x7d, 0x90, 0x72, 0x7e, + 0x2c, 0xa6, 0x83, 0x01, 0x27, 0x1a, 0x6e, 0xbc, 0x54, 0xe2, 0x5a, 0xdd, 0xe2, 0x8e, 0x61, 0x2c, 0xf5, 0x6d, 0x11, + 0x83, 0x03, 0x76, 0xd1, 0xca, 0x6e, 0x1f, 0x60, 0x5f, 0x39, 0xde, 0xa5, 0xca, 0xee, 0xf4, 0x98, 0x69, 0x2e, 0x5b, + 0x4d, 0x3a, 0xa9, 0xb8, 0x9f, 0xc8, 0x37, 0xb9, 0x83, 0x2e, 0x97, 0x63, 0xcd, 0x5b, 0x0e, 0x40, 0x45, 0x3f, 0x52, + 0x54, 0xf7, 0x33, 0x1c, 0x61, 0x1e, 0xac, 0xdb, 0x7c, 0x72, 0x68, 0x0a, 0x1c, 0x22, 0x4f, 0xda, 0x68, 0x0a, 0xe8, + 0xde, 0xc5, 0xe3, 0xae, 0x7e, 0x5b, 0xba, 0x0b, 0x94, 0x68, 0xaf, 0xe2, 0x86, 0x1f, 0x13, 0x75, 0x3a, 0xd3, 0x86, + 0xd0, 0xbf, 0x32, 0xe2, 0xfe, 0xd2, 0xb8, 0x8a, 0x37, 0xbd, 0xcb, 0xe7, 0x1c, 0xea, 0xec, 0x86, 0x50, 0x00, 0xae, + 0xda, 0xd3, 0xa9, 0x1b, 0x43, 0x7a, 0xa5, 0x44, 0xb7, 0xc1, 0xc1, 0xee, 0xf5, 0x19, 0x47, 0xd1, 0x8f, 0x51, 0x23, + 0xdf, 0x44, 0xe2, 0xb1, 0x1c, 0xc4, 0x8f, 0x0b, 0xba, 0x8a, 0xc4, 0xe3, 0x62, 0x10, 0x3f, 0x96, 0x75, 0xbd, 0x7f, + 0xae, 0xdc, 0xdf, 0x47, 0xe4, 0x59, 0xf7, 0xf6, 0x52, 0x09, 0x1b, 0x03, 0xcf, 0xae, 0x25, 0x84, 0x53, 0xf0, 0x44, + 0xb6, 0x96, 0x3e, 0x74, 0x6e, 0xf7, 0xb1, 0x65, 0x92, 0x20, 0xe8, 0x79, 0x9b, 0x4d, 0xa2, 0xd8, 0xd9, 0xe6, 0xd1, + 0x87, 0x53, 0x20, 0xa1, 0xdb, 0x6d, 0xb3, 0xae, 0xd6, 0x80, 0x62, 0x1a, 0x8e, 0xf9, 0x61, 0x31, 0xba, 0xf1, 0xdd, + 0xf5, 0x0f, 0x8b, 0xd1, 0x8a, 0x0c, 0x27, 0x66, 0xf2, 0xe3, 0xd9, 0x78, 0x1e, 0x47, 0x93, 0xba, 0xe3, 0xb4, 0xd0, + 0xf8, 0xa7, 0xde, 0x2d, 0x14, 0x81, 0x53, 0x31, 0x82, 0x23, 0xa7, 0x42, 0x39, 0x29, 0x35, 0x30, 0xfc, 0x0f, 0xaa, + 0x3d, 0x6d, 0xda, 0xeb, 0xb8, 0x4a, 0x56, 0x99, 0xb8, 0xd4, 0xe1, 0xc3, 0x75, 0x74, 0x71, 0x1b, 0xd0, 0xce, 0xbb, + 0x4c, 0x3b, 0x7e, 0x9d, 0x34, 0xe8, 0x89, 0xab, 0x99, 0x01, 0xb7, 0xee, 0x47, 0x68, 0x86, 0xc0, 0x68, 0x79, 0xfe, + 0x0e, 0x31, 0xb7, 0x7f, 0x55, 0x36, 0xbf, 0x8a, 0xf6, 0x39, 0x32, 0x52, 0xb6, 0xc9, 0x48, 0x05, 0x46, 0x98, 0x52, + 0x24, 0x71, 0x15, 0x42, 0x20, 0xfb, 0xcf, 0x29, 0xae, 0xc5, 0xd2, 0x7b, 0x0d, 0xc2, 0x04, 0xdb, 0x05, 0xed, 0x57, + 0xb7, 0x77, 0x5b, 0x69, 0xb1, 0x47, 0xea, 0xfb, 0xdc, 0xd9, 0xae, 0x68, 0xf2, 0xf7, 0x79, 0x03, 0xda, 0x00, 0xa2, + 0xbc, 0xaf, 0x8f, 0x4a, 0xe0, 0x64, 0xc4, 0x0d, 0x25, 0x46, 0x2f, 0xe8, 0xea, 0x44, 0xee, 0xd9, 0xa9, 0x79, 0x53, + 0x31, 0x57, 0x71, 0xe5, 0x9b, 0x3d, 0xf3, 0x1f, 0x0c, 0x05, 0x15, 0x60, 0xe0, 0x6d, 0xce, 0x78, 0x74, 0xa0, 0xbb, + 0x31, 0x3a, 0x2d, 0xd8, 0x2c, 0xa8, 0xcb, 0xba, 0x69, 0xe3, 0x41, 0x23, 0x0e, 0x8a, 0x62, 0x55, 0xa8, 0x91, 0xf0, + 0x44, 0x20, 0x60, 0xca, 0xae, 0x78, 0x64, 0x04, 0x35, 0xbd, 0x09, 0x85, 0x0d, 0x05, 0x7f, 0x95, 0xa8, 0xa6, 0x37, + 0xa1, 0x4d, 0x26, 0x4e, 0x33, 0x88, 0x60, 0x46, 0x6c, 0xf7, 0x5b, 0x40, 0x9b, 0x5b, 0x33, 0xda, 0xd6, 0xb5, 0xd5, + 0x56, 0x21, 0x97, 0x14, 0x29, 0xcb, 0x7f, 0xa7, 0xa6, 0x82, 0x92, 0x5a, 0x2e, 0x7a, 0x93, 0xa6, 0x8b, 0x1e, 0xcf, + 0x8c, 0x24, 0x50, 0xb9, 0xe5, 0x8e, 0xd1, 0x1f, 0xc2, 0x02, 0x8f, 0x98, 0x38, 0xb1, 0x60, 0x6e, 0x35, 0x63, 0xd9, + 0x42, 0x2c, 0x47, 0x6b, 0x09, 0x61, 0x83, 0x8f, 0x59, 0xb6, 0x28, 0xf5, 0x43, 0xe8, 0x0b, 0x4b, 0xdf, 0x82, 0x5d, + 0x6c, 0xb0, 0x96, 0x65, 0x00, 0xbe, 0x17, 0x74, 0xbb, 0x96, 0x65, 0x24, 0x55, 0xf7, 0xe3, 0x1a, 0x4b, 0x50, 0x69, + 0x85, 0x4a, 0x4b, 0x6a, 0x2c, 0x08, 0x7c, 0x55, 0x75, 0xf9, 0x90, 0xec, 0x2a, 0x50, 0x4f, 0x1d, 0x35, 0xe0, 0x14, + 0xa8, 0x2a, 0xb0, 0x20, 0x09, 0x2a, 0x43, 0x57, 0x05, 0xa6, 0x15, 0x98, 0x66, 0xaa, 0x70, 0x51, 0x66, 0x87, 0xd2, + 0xac, 0x97, 0x7c, 0x1e, 0x0f, 0xc2, 0x64, 0x18, 0x93, 0xc7, 0x08, 0xb5, 0x7f, 0x98, 0x47, 0xb1, 0x96, 0x4b, 0xae, + 0x9d, 0x5f, 0xfc, 0xcd, 0x27, 0xec, 0x75, 0xcf, 0x30, 0x58, 0x80, 0xb3, 0xb4, 0xbd, 0xca, 0xc4, 0x3b, 0xd9, 0x0a, + 0x8e, 0x83, 0x59, 0x94, 0xc3, 0xaa, 0x27, 0x47, 0x34, 0x17, 0xb9, 0xf6, 0x2e, 0x42, 0xe4, 0x20, 0xb3, 0xc7, 0x00, + 0xbb, 0x11, 0xbe, 0x0e, 0xad, 0xcd, 0xad, 0xae, 0x10, 0x7f, 0xa3, 0x44, 0xe2, 0x27, 0x29, 0x3f, 0x6e, 0xd6, 0x2a, + 0x57, 0x65, 0xf0, 0x58, 0x75, 0x33, 0x78, 0xa6, 0x7d, 0x8f, 0xb5, 0x7f, 0x6b, 0xbb, 0x39, 0xde, 0x7b, 0xf0, 0xa0, + 0xf5, 0xbf, 0xf5, 0x24, 0x84, 0xf6, 0xca, 0x49, 0xea, 0x8e, 0x1a, 0x3d, 0x33, 0x59, 0x23, 0x2a, 0x61, 0x6a, 0x77, + 0x2a, 0xc7, 0x40, 0x4d, 0x07, 0x70, 0x2d, 0x51, 0x13, 0xf4, 0xa4, 0x60, 0x63, 0x38, 0xe2, 0x2c, 0x0e, 0xda, 0x71, + 0x8c, 0xe2, 0xe5, 0x5c, 0x89, 0x97, 0xf3, 0x19, 0xe3, 0x00, 0xad, 0x05, 0x48, 0xf5, 0x1a, 0xf6, 0x33, 0x57, 0xb0, + 0xc0, 0xe6, 0xce, 0x77, 0x64, 0x81, 0x0c, 0x71, 0xb2, 0x39, 0x4e, 0xf6, 0xb8, 0xd6, 0x73, 0x2f, 0xf0, 0x71, 0x52, + 0x2f, 0xbd, 0xba, 0xca, 0x76, 0x5d, 0x2b, 0x56, 0x2e, 0x8a, 0xc1, 0x04, 0x82, 0xb2, 0x94, 0x8b, 0x62, 0x38, 0x59, + 0xd2, 0x1c, 0x7e, 0x2c, 0x1b, 0xe8, 0x10, 0xab, 0x41, 0x02, 0x97, 0xce, 0x1e, 0x03, 0xde, 0x50, 0x6a, 0x71, 0x37, + 0xd6, 0x91, 0x63, 0x1d, 0xc5, 0x61, 0x18, 0x03, 0xae, 0xac, 0x13, 0x78, 0xdf, 0x7f, 0x7d, 0x6c, 0x02, 0xb2, 0x6a, + 0x57, 0x78, 0x35, 0xca, 0x5d, 0x57, 0x1a, 0x7d, 0x49, 0xe9, 0x09, 0x2f, 0x78, 0x2a, 0xd9, 0xed, 0x7a, 0x06, 0xce, + 0x96, 0x78, 0x48, 0xbc, 0x63, 0x44, 0x2f, 0xa6, 0x8d, 0xcc, 0x9c, 0xc0, 0x99, 0xed, 0x2e, 0xdb, 0x98, 0x1f, 0x3b, + 0xc0, 0xc1, 0x22, 0x08, 0x89, 0x1b, 0xc2, 0x30, 0xb1, 0x59, 0x39, 0xd4, 0x42, 0xb8, 0xae, 0x85, 0xd7, 0x71, 0x5a, + 0xc6, 0xe0, 0x22, 0xad, 0x6d, 0x13, 0xef, 0xa1, 0xeb, 0x9e, 0x1f, 0x73, 0xab, 0x63, 0xb4, 0x85, 0xf4, 0xdb, 0xd1, + 0xe9, 0x03, 0x87, 0x01, 0x68, 0x7a, 0x30, 0xaf, 0xda, 0x67, 0x12, 0x37, 0xa7, 0x9d, 0x20, 0x24, 0x02, 0x51, 0x94, + 0xce, 0x08, 0xd3, 0xbf, 0xd7, 0x5c, 0x56, 0xd1, 0xea, 0x41, 0x9e, 0x39, 0xe4, 0x59, 0xe8, 0x6d, 0x0f, 0x5a, 0x35, + 0x77, 0x83, 0x71, 0xe2, 0x76, 0x7b, 0xe7, 0xff, 0x2d, 0xeb, 0xda, 0x6a, 0x8d, 0x78, 0xdc, 0xae, 0x7e, 0xd0, 0xd8, + 0xab, 0x3d, 0x15, 0x03, 0x66, 0x2d, 0xbd, 0x33, 0xaa, 0xe4, 0x45, 0xc6, 0x4b, 0x3c, 0xa9, 0xd6, 0x0d, 0x1f, 0xef, + 0x9b, 0x6c, 0x64, 0x1e, 0xc8, 0x14, 0x10, 0xcf, 0x6f, 0x52, 0xa3, 0x3e, 0x4e, 0x51, 0x02, 0xfe, 0x4e, 0xc7, 0x37, + 0xa2, 0x1f, 0xed, 0x8b, 0x4b, 0x5e, 0xbd, 0xbd, 0x11, 0xe6, 0xc5, 0x73, 0xab, 0xf3, 0xa7, 0xaf, 0x0b, 0x1f, 0x3a, + 0x1c, 0xb5, 0x77, 0x50, 0x64, 0xc9, 0xc4, 0x6c, 0x62, 0x64, 0x6d, 0x62, 0xfe, 0x51, 0xc1, 0xc5, 0x44, 0x15, 0x7a, + 0xd6, 0xd9, 0x13, 0xa6, 0x00, 0x7d, 0xe3, 0x18, 0x95, 0x8c, 0x61, 0xc1, 0x40, 0x9d, 0xa6, 0x84, 0xe8, 0xa1, 0x98, + 0x63, 0xbc, 0x62, 0x00, 0x85, 0x29, 0x14, 0x88, 0xa2, 0xb3, 0x0f, 0x07, 0x9a, 0xd0, 0xef, 0xdf, 0xa4, 0x3a, 0x03, + 0x2d, 0xeb, 0xa9, 0x04, 0x51, 0x1d, 0x44, 0x5b, 0xe5, 0x45, 0xf8, 0xe3, 0x8a, 0x96, 0x19, 0x5d, 0x09, 0x9a, 0x0a, + 0x9a, 0x64, 0xf4, 0x82, 0x2b, 0x51, 0xf1, 0x85, 0x60, 0x8a, 0xb6, 0x1b, 0xc2, 0xfe, 0xaf, 0x06, 0x5d, 0x6f, 0xc5, + 0x5a, 0x43, 0xbb, 0x13, 0x64, 0x84, 0x16, 0x4b, 0x1d, 0x84, 0x0c, 0x95, 0x93, 0xd0, 0xb5, 0x4a, 0xe3, 0x15, 0xb8, + 0x64, 0x9a, 0x8d, 0x56, 0x71, 0x19, 0x06, 0xf6, 0xab, 0xc0, 0x62, 0x72, 0x60, 0xd2, 0xe9, 0xe6, 0xfc, 0x99, 0xbc, + 0x5a, 0x4b, 0xc1, 0x45, 0xa5, 0x20, 0xfa, 0x0d, 0xee, 0xbb, 0x89, 0xab, 0xce, 0x9a, 0xb5, 0xd2, 0x87, 0xbe, 0xf5, + 0x59, 0x1b, 0xf7, 0x85, 0xc1, 0x31, 0xd8, 0xfb, 0x88, 0x18, 0x48, 0x83, 0x4a, 0xb7, 0x38, 0x34, 0x01, 0xba, 0x74, + 0x48, 0x21, 0x4b, 0xa6, 0x32, 0x55, 0x82, 0x8a, 0x6f, 0xfc, 0x5e, 0xca, 0x6a, 0xf4, 0xe7, 0x86, 0x17, 0x77, 0xa7, + 0x3c, 0xe7, 0x38, 0x46, 0x41, 0x12, 0x8b, 0xeb, 0xb8, 0x0c, 0x88, 0x6f, 0x79, 0x15, 0x1c, 0xa5, 0x26, 0x6c, 0xcc, + 0x5e, 0xd5, 0xa8, 0xf5, 0x92, 0xe8, 0x2b, 0xa3, 0x7c, 0x63, 0x30, 0x34, 0x11, 0x55, 0xd0, 0xf7, 0x5a, 0xdd, 0xd3, + 0xea, 0x86, 0x05, 0xc4, 0x5f, 0x28, 0xbd, 0x50, 0xeb, 0x75, 0x33, 0xe6, 0x86, 0x89, 0x10, 0x34, 0xfa, 0xaa, 0x5e, + 0xd6, 0x9e, 0x5b, 0x9a, 0x8a, 0x8c, 0x1b, 0x6d, 0x73, 0x7e, 0x09, 0x32, 0x3e, 0x67, 0x2e, 0x34, 0xa9, 0x6b, 0xaa, + 0xa0, 0x0a, 0xa3, 0xed, 0x6d, 0x23, 0x9d, 0xde, 0x81, 0x3b, 0x9b, 0x31, 0x3b, 0xd2, 0x2e, 0x8d, 0x35, 0x2d, 0x78, + 0xb9, 0x96, 0xa2, 0x84, 0x30, 0xce, 0xbd, 0x31, 0xbd, 0x8a, 0x33, 0x51, 0xc5, 0x99, 0x38, 0x29, 0xd7, 0x3c, 0xa9, + 0xde, 0xc3, 0x2d, 0x4e, 0x59, 0xdd, 0xd4, 0x25, 0x5c, 0xe9, 0x92, 0x03, 0x0c, 0xa6, 0xa6, 0xe2, 0x1e, 0x3b, 0x83, + 0x8b, 0xea, 0xf7, 0x68, 0x25, 0x31, 0x16, 0xaa, 0x2e, 0x3e, 0x3e, 0x2f, 0x65, 0xbe, 0xa9, 0x40, 0xbb, 0x7b, 0x51, + 0x45, 0x47, 0x4f, 0xd6, 0xb7, 0x53, 0x75, 0x83, 0x89, 0x9e, 0x1c, 0xad, 0x6f, 0x7b, 0xd9, 0xd5, 0x5a, 0x16, 0x55, + 0x2c, 0xaa, 0xa9, 0x42, 0x24, 0x4b, 0xe2, 0x3c, 0x09, 0x27, 0xe3, 0xf1, 0x17, 0x07, 0xc3, 0x03, 0xc8, 0x40, 0xa6, + 0x7f, 0x0d, 0x95, 0xcb, 0xd1, 0x70, 0x32, 0x1e, 0x4f, 0xa5, 0xba, 0xdb, 0x45, 0xa3, 0x49, 0x8d, 0xf5, 0x0c, 0x13, + 0x3d, 0x33, 0x23, 0x7e, 0xbb, 0x8e, 0x45, 0x0a, 0xf1, 0xeb, 0x74, 0xf1, 0x47, 0x4f, 0xc6, 0x8d, 0xf2, 0xed, 0xa7, + 0x4f, 0xeb, 0xdf, 0x6b, 0x13, 0xd6, 0xda, 0xb4, 0xfb, 0xd9, 0xef, 0xc7, 0x6a, 0xbe, 0x67, 0xc7, 0x87, 0xfa, 0xc7, + 0xef, 0x75, 0x3d, 0x7d, 0x5d, 0x84, 0x8b, 0x7f, 0x86, 0x6a, 0x3e, 0x4f, 0x8a, 0x22, 0xbe, 0xab, 0x21, 0x92, 0xa7, + 0x70, 0xde, 0x24, 0xd4, 0xdb, 0x06, 0xf4, 0x88, 0x4c, 0x2f, 0x04, 0x83, 0x6f, 0xde, 0x57, 0x61, 0xc0, 0xcb, 0xf5, + 0x90, 0x8b, 0x2a, 0xab, 0xee, 0x86, 0x98, 0x27, 0xc0, 0x4f, 0x0d, 0x6f, 0xf6, 0xac, 0x30, 0xc4, 0xe6, 0xa2, 0xe0, + 0xfc, 0x2f, 0x1e, 0x2a, 0xe3, 0xe8, 0x31, 0x1a, 0x47, 0x8f, 0xa9, 0x1a, 0x8c, 0xc9, 0xd7, 0x54, 0x77, 0x66, 0xf2, + 0x35, 0x98, 0x20, 0x65, 0xed, 0x6f, 0x94, 0x71, 0x62, 0x34, 0xa6, 0xd7, 0x2f, 0xf3, 0x6c, 0x0d, 0x4c, 0xf0, 0x4a, + 0xff, 0xa8, 0x09, 0x7d, 0xcf, 0xdb, 0xd9, 0x47, 0xa3, 0xd1, 0xb3, 0x82, 0x8e, 0x46, 0xa3, 0x8f, 0x59, 0x4d, 0xe8, + 0x5a, 0x74, 0xbc, 0x7f, 0xcf, 0xe9, 0xb9, 0x4c, 0xef, 0xa2, 0x20, 0xa0, 0xab, 0x2c, 0x4d, 0xb9, 0x50, 0x65, 0x9d, + 0xa6, 0xed, 0xbc, 0xaa, 0x85, 0x08, 0xfc, 0xa3, 0xdb, 0x88, 0x10, 0x44, 0x84, 0xbe, 0xdd, 0xeb, 0xd9, 0x68, 0x34, + 0x3a, 0x4d, 0x4d, 0xb5, 0x8e, 0x21, 0x7f, 0x8d, 0xe6, 0x03, 0xce, 0x2e, 0x1f, 0xac, 0x6f, 0x4c, 0xb4, 0x93, 0xc3, + 0xff, 0x1e, 0xce, 0x17, 0xe3, 0xe1, 0xb7, 0xa3, 0xe5, 0xe3, 0x43, 0x1a, 0x04, 0x3e, 0x68, 0x75, 0xa8, 0xad, 0x39, + 0xa6, 0xe5, 0xf1, 0x78, 0x4a, 0xca, 0x01, 0x7b, 0x62, 0x7d, 0x69, 0xbe, 0x78, 0x02, 0x48, 0xa4, 0x28, 0x42, 0x0d, + 0x9c, 0xf4, 0x0f, 0xaf, 0x22, 0xaf, 0x04, 0xe0, 0xa3, 0xd9, 0x48, 0x06, 0x46, 0x0b, 0x38, 0x8e, 0xa0, 0xbc, 0xda, + 0x9a, 0x46, 0xf4, 0x18, 0xcb, 0x4c, 0x54, 0xd0, 0xf1, 0xb4, 0xbc, 0xc9, 0xaa, 0x64, 0x85, 0x81, 0x8d, 0xe2, 0x92, + 0x07, 0x5f, 0x04, 0x51, 0xc9, 0x8e, 0x9e, 0x4e, 0x15, 0xbc, 0x2f, 0x26, 0xa5, 0xfc, 0x12, 0x12, 0xbf, 0x1d, 0x23, + 0x04, 0x2a, 0xd1, 0x1e, 0x8b, 0x58, 0xe3, 0xcb, 0x5c, 0xc6, 0xe0, 0xc1, 0x59, 0x6a, 0x9e, 0xc5, 0x9e, 0x04, 0xd6, + 0xfe, 0xa2, 0xd5, 0x1c, 0x09, 0xcd, 0x09, 0x25, 0x93, 0x87, 0x25, 0x95, 0x5f, 0x4c, 0xd0, 0x2b, 0x08, 0xdc, 0xaa, + 0x23, 0x38, 0xee, 0xac, 0x65, 0x83, 0x5e, 0x3e, 0x29, 0x3b, 0x5c, 0xfc, 0xef, 0x92, 0x2e, 0x07, 0x87, 0x6e, 0x68, + 0xde, 0x6a, 0xf7, 0xd5, 0x0a, 0x19, 0xa5, 0x2a, 0x7c, 0x96, 0x12, 0x6b, 0x7c, 0xca, 0xd9, 0x6c, 0x6b, 0xba, 0x33, + 0xaa, 0x8a, 0xec, 0x2a, 0x24, 0xba, 0x57, 0x0e, 0x14, 0x33, 0x88, 0xb2, 0x11, 0xae, 0x1f, 0xb0, 0x16, 0xf1, 0x3a, + 0x79, 0xcd, 0x8b, 0x2a, 0x4b, 0xd4, 0xfb, 0xeb, 0xc6, 0x7b, 0xa0, 0x06, 0xaa, 0x41, 0xef, 0x0a, 0x06, 0xf3, 0xfc, + 0xb6, 0x00, 0xd0, 0xce, 0x92, 0x17, 0xd7, 0xdc, 0xa7, 0x1b, 0x41, 0x50, 0xbb, 0x66, 0x5e, 0x36, 0x82, 0x4d, 0xc0, + 0x57, 0xef, 0x0a, 0xc0, 0xdc, 0x08, 0x41, 0x6a, 0x0a, 0xa1, 0x70, 0xe0, 0x02, 0x5f, 0x55, 0x45, 0x76, 0xbe, 0xa9, + 0x38, 0x06, 0xfb, 0xf0, 0xe2, 0x26, 0x2a, 0x27, 0x3c, 0x1e, 0x06, 0xf8, 0x23, 0xa0, 0x2a, 0xe0, 0x86, 0xf1, 0xb0, + 0x83, 0x17, 0xea, 0x97, 0x7b, 0xa3, 0xf6, 0x08, 0x7b, 0x9d, 0x86, 0x10, 0x5c, 0x07, 0x1f, 0x02, 0x58, 0x52, 0x84, + 0xbe, 0xc5, 0x53, 0x35, 0x0c, 0x2e, 0xf2, 0x6c, 0xad, 0x93, 0xaa, 0x51, 0x47, 0xf3, 0xa1, 0xd4, 0x8e, 0xe4, 0x80, + 0x7a, 0xe9, 0x31, 0xa6, 0x17, 0x2a, 0x5d, 0x15, 0xe5, 0x8c, 0x50, 0xde, 0xe9, 0x89, 0x71, 0x61, 0xfa, 0x38, 0x44, + 0x7e, 0x79, 0x57, 0xa8, 0xd0, 0x2f, 0x7c, 0x09, 0xe0, 0x57, 0x70, 0xbb, 0xdf, 0x8f, 0xef, 0xa2, 0xb2, 0x9f, 0x71, + 0x76, 0xf8, 0xdf, 0x8b, 0x78, 0xf8, 0xd7, 0x78, 0xf8, 0xed, 0x72, 0x10, 0x0e, 0xed, 0x4f, 0xf2, 0xf8, 0xd1, 0x21, + 0x7d, 0xc9, 0x2d, 0x57, 0x02, 0x0b, 0xbf, 0x11, 0xdc, 0x46, 0xad, 0x84, 0x20, 0x0a, 0xf0, 0x46, 0xe1, 0x56, 0xe3, + 0x04, 0x00, 0xfe, 0x82, 0xff, 0x0a, 0xd0, 0x48, 0xc8, 0x5d, 0x34, 0x40, 0x3f, 0xa0, 0x7e, 0xcf, 0xbe, 0x6a, 0x18, + 0xc8, 0x81, 0x78, 0x42, 0xc5, 0x40, 0x21, 0xba, 0x8c, 0x89, 0x82, 0xfd, 0xb5, 0xd9, 0x77, 0xbb, 0x5e, 0x5b, 0xf2, + 0x83, 0x5f, 0xfa, 0x99, 0x26, 0x66, 0xde, 0xe1, 0x86, 0xb2, 0x96, 0xeb, 0x10, 0xb1, 0xf1, 0xf4, 0xaf, 0x9c, 0x41, + 0xac, 0xc9, 0xeb, 0x0c, 0x7c, 0x18, 0xec, 0x17, 0xe3, 0x39, 0xb0, 0x0d, 0x70, 0xc7, 0x29, 0xf8, 0x45, 0x06, 0x6e, + 0xcd, 0x22, 0xc6, 0x0b, 0xb6, 0x5d, 0x12, 0xfd, 0x7e, 0x2f, 0xcf, 0xc2, 0x5c, 0xe3, 0x2c, 0xe7, 0xb5, 0x11, 0xbb, + 0xa3, 0x4e, 0x18, 0xc4, 0xed, 0x7a, 0x08, 0x86, 0x6a, 0x08, 0x8a, 0x8e, 0xb6, 0xb8, 0x7a, 0x6d, 0x3d, 0x85, 0xe9, + 0xad, 0xaa, 0xaf, 0x18, 0xfd, 0x21, 0x33, 0x81, 0x85, 0xb4, 0x6b, 0x8e, 0x75, 0xcd, 0x31, 0xd2, 0x9e, 0x7e, 0x5f, + 0x34, 0xc8, 0x4f, 0x67, 0xe1, 0x41, 0xa0, 0x4a, 0x95, 0x7b, 0x65, 0x51, 0x6e, 0x4b, 0xf3, 0xc6, 0xb0, 0xa6, 0x79, + 0x66, 0xe3, 0xba, 0xcc, 0x7b, 0xbd, 0x30, 0x44, 0x87, 0x46, 0x2c, 0x15, 0x6b, 0x83, 0xf0, 0x3e, 0x26, 0x61, 0x74, + 0x05, 0xb2, 0xba, 0xf0, 0x8c, 0x13, 0xe4, 0xcb, 0xc0, 0x64, 0x4d, 0x55, 0xeb, 0xe5, 0x84, 0xc7, 0x46, 0xbe, 0x6c, + 0x04, 0x0d, 0xf2, 0x92, 0xa2, 0xde, 0xc4, 0xed, 0xd8, 0x47, 0x2d, 0xa4, 0xc6, 0x6d, 0x3d, 0xed, 0x69, 0x52, 0xd1, + 0x63, 0xbd, 0x4a, 0xfd, 0x02, 0xcb, 0x02, 0x4b, 0x3e, 0x08, 0xed, 0x69, 0x5a, 0x81, 0x19, 0xae, 0x6d, 0x06, 0x43, + 0x3f, 0x1c, 0xda, 0x22, 0x74, 0x46, 0x6d, 0x4b, 0x08, 0xdb, 0x36, 0x08, 0x2b, 0xef, 0x89, 0x7c, 0xf1, 0xc4, 0x63, + 0x84, 0x43, 0x6e, 0x36, 0xb3, 0x68, 0x60, 0x98, 0x5f, 0xc9, 0x66, 0xf3, 0x74, 0x73, 0xbd, 0xa8, 0x98, 0x02, 0xb6, + 0xdb, 0x5a, 0x10, 0xfc, 0xfb, 0x31, 0x9b, 0xe3, 0xdf, 0xac, 0xdf, 0xef, 0x85, 0xf8, 0x8b, 0x63, 0xf0, 0x9e, 0x85, + 0x58, 0xb2, 0x8f, 0x20, 0x53, 0x21, 0x11, 0xa6, 0x2a, 0xe3, 0x37, 0x56, 0x81, 0x05, 0x9c, 0xf9, 0x40, 0xe5, 0xc2, + 0x4c, 0xf6, 0xf2, 0xe2, 0x1a, 0x72, 0xd2, 0x1a, 0xa7, 0x6c, 0x94, 0x25, 0xca, 0x75, 0x21, 0x1b, 0xc5, 0x79, 0x16, + 0x97, 0xbc, 0xdc, 0xed, 0xf4, 0xe1, 0x98, 0x14, 0x1c, 0xd8, 0x53, 0x45, 0xa5, 0x4a, 0xd6, 0x91, 0xea, 0xc6, 0x5f, + 0x86, 0x05, 0xee, 0x53, 0xbe, 0x28, 0x0c, 0x8d, 0x38, 0x80, 0xcb, 0x3b, 0x53, 0xb7, 0xd2, 0x5e, 0x58, 0x40, 0xf3, + 0x4a, 0x42, 0xb6, 0x98, 0xea, 0x59, 0xb4, 0xc6, 0x4c, 0x2c, 0x8a, 0x25, 0x84, 0x91, 0x29, 0x96, 0x60, 0x33, 0xc5, + 0x05, 0x78, 0x91, 0xc4, 0x00, 0x13, 0x17, 0x93, 0x29, 0xc4, 0x33, 0x57, 0xe5, 0xc4, 0x4b, 0x73, 0xbf, 0x4c, 0x1c, + 0x52, 0x06, 0xbc, 0xaa, 0x0d, 0x9a, 0x98, 0x6d, 0x38, 0xea, 0x04, 0x39, 0x31, 0xf9, 0xfd, 0x54, 0x41, 0x88, 0x3b, + 0x71, 0x24, 0x5c, 0x56, 0x6c, 0x17, 0x5e, 0x74, 0x20, 0xc6, 0xa8, 0xc1, 0x29, 0x3f, 0x31, 0x38, 0x1a, 0x83, 0x73, + 0xeb, 0x9d, 0x20, 0x45, 0x18, 0x93, 0xad, 0x64, 0x57, 0x32, 0x14, 0x8b, 0x78, 0x09, 0xca, 0xba, 0x78, 0x09, 0x96, + 0x35, 0xc6, 0x00, 0x13, 0xe4, 0x55, 0xdc, 0x0b, 0xfd, 0x44, 0x71, 0x85, 0x48, 0xcf, 0xca, 0xf5, 0x51, 0xd1, 0x0e, + 0x7d, 0x81, 0xd7, 0x7b, 0x65, 0x8e, 0x9b, 0xf5, 0x58, 0x20, 0xb1, 0x21, 0x60, 0x6c, 0xa4, 0xd3, 0x54, 0x6b, 0xdd, + 0x1b, 0x33, 0x0f, 0x7c, 0x9a, 0x8d, 0x84, 0xac, 0xce, 0x2e, 0x40, 0x84, 0xe2, 0xa3, 0xc1, 0x23, 0xbf, 0x88, 0x3b, + 0xcb, 0xbc, 0xb5, 0x2d, 0x2a, 0xd9, 0x6c, 0x0b, 0x20, 0x7d, 0x3a, 0x5a, 0x94, 0x92, 0x53, 0x94, 0xa4, 0x76, 0x9b, + 0x02, 0x56, 0x92, 0xbf, 0x80, 0x21, 0xd8, 0xd8, 0x81, 0x70, 0x3a, 0x45, 0x88, 0x4f, 0x34, 0x45, 0x64, 0xc5, 0xb0, + 0xa4, 0x38, 0xb6, 0x25, 0xa2, 0x7e, 0xda, 0xb2, 0xec, 0x60, 0x98, 0xa8, 0xb8, 0xcf, 0x53, 0x8f, 0x12, 0x05, 0x01, + 0xd5, 0x43, 0x0e, 0x12, 0x5b, 0xdb, 0x40, 0x78, 0x40, 0x1e, 0xd1, 0x1b, 0xeb, 0xef, 0xb3, 0xce, 0xb3, 0x0b, 0xcd, + 0x51, 0xb9, 0xde, 0x15, 0x66, 0x8c, 0xf0, 0x24, 0x33, 0x30, 0xf9, 0xde, 0x79, 0x66, 0xd4, 0x14, 0x3d, 0x0f, 0x9f, + 0xec, 0x04, 0x23, 0xd2, 0xdd, 0x33, 0xe8, 0x26, 0x78, 0x55, 0x87, 0x8d, 0x76, 0xa5, 0x20, 0x24, 0x4c, 0x2d, 0x9a, + 0x98, 0xf5, 0xac, 0x01, 0xf5, 0x6e, 0xd7, 0xd3, 0x73, 0x75, 0xff, 0xdc, 0xed, 0x76, 0x3d, 0xec, 0xd6, 0xf3, 0xb4, + 0xdb, 0x0a, 0xbc, 0x52, 0x1f, 0xb4, 0xc7, 0x9f, 0xbb, 0xf1, 0xe7, 0x06, 0xc9, 0xa3, 0x74, 0x34, 0xd3, 0xd6, 0x07, + 0xe1, 0x70, 0xd3, 0xbb, 0x46, 0x93, 0xbe, 0xcf, 0x42, 0x49, 0xd7, 0xa2, 0x51, 0x5d, 0xed, 0x4c, 0x2a, 0x1f, 0x5c, + 0xff, 0x0f, 0xaf, 0x02, 0x3c, 0xe2, 0xd4, 0xce, 0xbe, 0xb7, 0x41, 0x45, 0xa3, 0x2d, 0x1c, 0x29, 0x42, 0x0f, 0x48, + 0xc2, 0x7d, 0x2d, 0x6b, 0x71, 0x9b, 0xa7, 0xd9, 0xc3, 0xf4, 0xe9, 0x55, 0xea, 0x5b, 0xdd, 0xbb, 0x65, 0x96, 0x99, + 0x03, 0xaf, 0xa2, 0x38, 0xa0, 0x51, 0x17, 0xed, 0xbb, 0xca, 0xca, 0x12, 0xbc, 0x3c, 0xe0, 0xfa, 0x7c, 0xca, 0x7d, + 0xb8, 0xb9, 0xcb, 0xaa, 0xb9, 0x49, 0x4f, 0xb3, 0x45, 0xb6, 0xdc, 0xed, 0x42, 0xfc, 0xdb, 0xd5, 0x22, 0x47, 0x93, + 0x17, 0xa0, 0xc3, 0xc3, 0xc8, 0x3d, 0x4c, 0x37, 0xce, 0xdb, 0xfc, 0x7f, 0x89, 0x86, 0x93, 0xc0, 0x09, 0xd0, 0x8b, + 0xf9, 0x23, 0x90, 0xc1, 0x18, 0xa7, 0x7e, 0x31, 0xd7, 0x6b, 0x06, 0xa2, 0x6f, 0x89, 0x08, 0x70, 0x74, 0xb1, 0x91, + 0x68, 0x64, 0xc1, 0x49, 0x4d, 0xc0, 0x62, 0xd3, 0x96, 0xf7, 0xc1, 0xd2, 0xb6, 0xaa, 0xb8, 0xf3, 0x96, 0x34, 0xc7, + 0x75, 0xe0, 0x6c, 0xfb, 0xcd, 0x10, 0x9b, 0xb2, 0xab, 0x25, 0x72, 0xbf, 0xbc, 0xa6, 0xbd, 0x71, 0x9d, 0xc0, 0xac, + 0x6d, 0x6b, 0xcb, 0xf8, 0xd9, 0xd2, 0x7f, 0xd2, 0x83, 0xab, 0x8c, 0x9f, 0x16, 0xc6, 0x2a, 0xc1, 0xee, 0x1b, 0xcf, + 0x77, 0x00, 0xc2, 0xb1, 0xf9, 0xf4, 0xf8, 0x34, 0xf3, 0xe8, 0x31, 0x10, 0x1d, 0xf3, 0x51, 0xe9, 0x3e, 0xb2, 0xbb, + 0xd7, 0x0f, 0x80, 0xb7, 0xa8, 0xda, 0x05, 0x2d, 0xca, 0x25, 0x04, 0x12, 0xf5, 0xca, 0x2b, 0x2c, 0x9f, 0x19, 0xb3, + 0x4b, 0x20, 0x43, 0x05, 0x01, 0x9b, 0xa4, 0xae, 0x73, 0x21, 0x56, 0x1d, 0x56, 0xe6, 0x23, 0x09, 0x9b, 0x85, 0x68, + 0xce, 0x19, 0xcc, 0x83, 0xff, 0x0a, 0x06, 0xe5, 0x20, 0x88, 0x82, 0x28, 0x08, 0xc8, 0xa0, 0x80, 0x5f, 0x88, 0x33, + 0x46, 0x30, 0x46, 0x09, 0x74, 0xf8, 0x1d, 0x67, 0x3e, 0x23, 0xf2, 0xa2, 0x11, 0xc6, 0xd2, 0x0d, 0xc0, 0xb9, 0x94, + 0x39, 0x8f, 0xd1, 0xc7, 0xe2, 0x1d, 0x67, 0x19, 0xa1, 0xef, 0xbc, 0x53, 0xf9, 0x11, 0x6f, 0x04, 0xb7, 0xdb, 0x1f, + 0xb6, 0x97, 0x3c, 0xcc, 0x68, 0x6f, 0x4c, 0xdf, 0x71, 0x12, 0x65, 0x0d, 0xe7, 0x61, 0x0e, 0x3d, 0xab, 0x2c, 0x6b, + 0x45, 0x0d, 0xb9, 0x41, 0xb1, 0x2e, 0xb2, 0x4c, 0x4e, 0x86, 0xab, 0xe6, 0x54, 0xe0, 0xba, 0xb3, 0xeb, 0x05, 0x24, + 0x65, 0x42, 0xb3, 0x74, 0x36, 0x7c, 0xb5, 0x6d, 0xd9, 0xf3, 0xd6, 0x29, 0xe4, 0x35, 0x44, 0x45, 0x3f, 0x74, 0x04, + 0xd4, 0xd0, 0x8a, 0xcb, 0x0a, 0x5c, 0x76, 0x4d, 0x7b, 0xb8, 0x69, 0x8f, 0x69, 0xc6, 0x07, 0x88, 0x11, 0xc7, 0xb1, + 0x65, 0x60, 0x37, 0xe1, 0xf0, 0x6c, 0x9c, 0xef, 0xcb, 0x3e, 0xbd, 0x75, 0xb5, 0x78, 0x84, 0xb5, 0xe7, 0xad, 0x90, + 0x10, 0x20, 0x2d, 0x4d, 0xa5, 0xbb, 0x5d, 0x10, 0xc0, 0x00, 0xf7, 0xfb, 0x3d, 0xe0, 0x5a, 0x0d, 0x3b, 0x69, 0x6e, + 0xcd, 0x96, 0xd8, 0x2b, 0x0a, 0x8f, 0x81, 0x28, 0x35, 0xff, 0x19, 0x04, 0x14, 0xcf, 0xdd, 0x10, 0xec, 0x2b, 0xd9, + 0x6c, 0x5b, 0xf4, 0xfb, 0xcf, 0x0b, 0x7c, 0x40, 0x39, 0x28, 0x88, 0x75, 0x75, 0xdc, 0x0a, 0xc3, 0x3e, 0xa9, 0x0f, + 0x71, 0x2c, 0xf2, 0x2c, 0x74, 0x84, 0xa5, 0x32, 0x84, 0x85, 0x2b, 0x46, 0x3a, 0x88, 0x83, 0x9a, 0x74, 0x0e, 0x56, + 0xe5, 0x82, 0x0d, 0xf7, 0x7a, 0x7f, 0x01, 0x2c, 0x78, 0xe6, 0x0d, 0xcb, 0x7b, 0x0f, 0x00, 0xac, 0xd7, 0xc3, 0x85, + 0xe2, 0x5e, 0xbe, 0x6c, 0xa0, 0x4f, 0xe2, 0x4b, 0xcb, 0xae, 0xcf, 0xb5, 0xac, 0x64, 0x34, 0x1a, 0x55, 0xb5, 0x92, + 0x7c, 0x38, 0xf2, 0xd2, 0x42, 0xad, 0x94, 0x71, 0xca, 0x53, 0xb0, 0xf4, 0x36, 0x94, 0x6e, 0xb1, 0xa4, 0x6b, 0x2e, + 0x52, 0xf5, 0xd3, 0x43, 0x9b, 0x6c, 0x10, 0xd7, 0xac, 0xa9, 0xb3, 0xb0, 0xc3, 0x0f, 0x01, 0x1f, 0xed, 0xc3, 0xdc, + 0xa5, 0x6b, 0x58, 0x5a, 0x10, 0x47, 0xc6, 0x05, 0x0f, 0x5d, 0x1e, 0xc0, 0xfa, 0x33, 0x87, 0x24, 0x7e, 0x0a, 0x3f, + 0xe7, 0x26, 0xad, 0xe3, 0x33, 0x9c, 0xcd, 0xa8, 0x54, 0x37, 0x82, 0xf6, 0x6b, 0x48, 0x24, 0x06, 0xd9, 0xb8, 0xc1, + 0x50, 0xb4, 0xee, 0x36, 0x70, 0xe5, 0xb7, 0xf4, 0xce, 0xa7, 0x41, 0x80, 0x6d, 0x8d, 0xc5, 0x00, 0x60, 0x28, 0xfe, + 0x40, 0x55, 0x8d, 0xb9, 0xa2, 0x98, 0x86, 0xa9, 0x44, 0x7b, 0xc7, 0x71, 0x1d, 0x35, 0xae, 0xb2, 0x82, 0x95, 0xd6, + 0x96, 0xd7, 0xbd, 0xa5, 0x85, 0x2d, 0x01, 0xd5, 0x60, 0xb8, 0x13, 0xc0, 0x67, 0x44, 0xaa, 0x03, 0x41, 0x76, 0x1f, + 0x1c, 0x34, 0x67, 0x09, 0x9e, 0x87, 0x21, 0xfc, 0x81, 0x85, 0x03, 0xcb, 0x52, 0xf5, 0x73, 0x35, 0x8d, 0xe1, 0xdc, + 0xcd, 0xd5, 0x0e, 0x9f, 0xaf, 0x40, 0x91, 0xa7, 0xe6, 0xd4, 0x5c, 0xbe, 0xf2, 0xc6, 0x7e, 0x8f, 0x09, 0xe6, 0x31, + 0xb3, 0x0d, 0xbf, 0xf5, 0x74, 0x5b, 0x5f, 0x58, 0x37, 0x70, 0xd2, 0x5e, 0x38, 0xed, 0xc5, 0x76, 0x65, 0x20, 0xee, + 0xea, 0x86, 0x10, 0xe1, 0x95, 0x26, 0x16, 0x59, 0x43, 0xa6, 0x63, 0xb1, 0x31, 0x54, 0x9b, 0x8a, 0x67, 0x5a, 0x21, + 0x5e, 0x4e, 0xd5, 0x85, 0xa9, 0x95, 0xca, 0x84, 0x41, 0x98, 0x29, 0x61, 0x51, 0x65, 0xe0, 0xb3, 0x5f, 0x21, 0xc5, + 0xb5, 0xf5, 0xbc, 0xc1, 0xe5, 0x9b, 0x99, 0x36, 0xdb, 0x4f, 0x5f, 0xe6, 0xf1, 0xe5, 0x6e, 0x17, 0x76, 0xbf, 0x00, + 0xf3, 0xcb, 0x52, 0x69, 0xd4, 0xc0, 0xe9, 0x21, 0x44, 0x3f, 0xe7, 0x7b, 0x72, 0x4e, 0x1c, 0x27, 0xd7, 0x6e, 0xde, + 0x7c, 0x2f, 0xc5, 0x08, 0x2c, 0xe0, 0xc4, 0x45, 0x3a, 0xd0, 0x52, 0xc1, 0x69, 0xcb, 0x78, 0x6f, 0xd3, 0x3b, 0x4a, + 0x85, 0x57, 0x0b, 0x4d, 0x42, 0x2a, 0x77, 0x2f, 0xb1, 0xa3, 0x06, 0x9c, 0x93, 0xba, 0x83, 0x80, 0x93, 0x9a, 0x6e, + 0xac, 0x55, 0x9c, 0x9a, 0x04, 0xef, 0x95, 0x1e, 0xba, 0x44, 0x3b, 0x71, 0xbb, 0x6d, 0x55, 0xb6, 0x50, 0x1f, 0x0f, + 0x72, 0x96, 0xa8, 0xe3, 0x01, 0x85, 0x2e, 0xea, 0x68, 0xc8, 0x97, 0xa4, 0xd0, 0x2b, 0x47, 0xab, 0x56, 0xf7, 0x25, + 0x03, 0xa5, 0x5a, 0x05, 0x79, 0x4d, 0xac, 0xbb, 0x56, 0xd6, 0x58, 0x5c, 0x39, 0x21, 0x85, 0x4d, 0xf8, 0xdc, 0x52, + 0x2c, 0xac, 0x60, 0x6f, 0x4c, 0x7d, 0xe1, 0x12, 0xa1, 0xed, 0x6e, 0x43, 0x4c, 0x32, 0x58, 0x37, 0xbb, 0xdd, 0xab, + 0x22, 0x5c, 0x64, 0x4b, 0x2a, 0x47, 0x59, 0x8a, 0x10, 0x62, 0xc6, 0x43, 0xd7, 0x76, 0xc1, 0x4c, 0x0c, 0x75, 0xed, + 0xf1, 0x92, 0x4c, 0xb1, 0x36, 0x49, 0x8e, 0xe2, 0x73, 0x59, 0xa8, 0xb5, 0x46, 0x08, 0x1e, 0xee, 0x7f, 0xa4, 0x10, + 0xc3, 0xcd, 0xac, 0xbb, 0x5f, 0xf7, 0x6e, 0x88, 0x7f, 0x40, 0x20, 0x81, 0x92, 0xbd, 0x2a, 0x46, 0xe7, 0x99, 0x48, + 0x71, 0xa7, 0xaa, 0xa8, 0xb8, 0x6a, 0x1d, 0x34, 0x5b, 0x6e, 0xef, 0xc5, 0x96, 0x28, 0x40, 0x5c, 0x63, 0xa1, 0x19, + 0xcf, 0xca, 0x59, 0x8a, 0x64, 0x14, 0x1b, 0x12, 0x95, 0x5e, 0x54, 0x74, 0x9f, 0xa7, 0x31, 0x3d, 0x74, 0x6b, 0x10, + 0x5c, 0x35, 0xf7, 0x36, 0xd2, 0x62, 0x49, 0x88, 0x9a, 0x00, 0x09, 0x1b, 0xd5, 0x9c, 0x5a, 0x97, 0xe2, 0x61, 0x56, + 0xf9, 0x4c, 0x1f, 0xc4, 0x97, 0x02, 0x78, 0x58, 0x6f, 0x7b, 0x5f, 0x09, 0x8f, 0xb5, 0xc1, 0xb7, 0xbb, 0xdd, 0xa5, + 0x58, 0x04, 0x81, 0xc7, 0x68, 0x7e, 0xa7, 0x24, 0xe6, 0xbd, 0x31, 0x85, 0x15, 0xef, 0xbb, 0xb4, 0x75, 0x93, 0x5a, + 0x6b, 0x81, 0xba, 0xc7, 0xf5, 0x01, 0xcf, 0x53, 0xe2, 0x68, 0x47, 0xe5, 0x54, 0x5a, 0x5d, 0x39, 0x76, 0x45, 0x60, + 0x60, 0xe8, 0x1f, 0x52, 0xb6, 0x05, 0x73, 0x3c, 0xb0, 0xb6, 0x41, 0x3f, 0x25, 0xa5, 0x85, 0x19, 0xa3, 0x31, 0x8b, + 0xdc, 0x54, 0xd1, 0x11, 0xd7, 0xd1, 0xdb, 0x79, 0xf4, 0xb7, 0xa7, 0x63, 0x5a, 0xc4, 0x22, 0x95, 0x57, 0xa0, 0x82, + 0x00, 0x65, 0x08, 0x1a, 0xfe, 0x6b, 0x6a, 0x00, 0x1a, 0x04, 0x37, 0x00, 0xff, 0xe8, 0x74, 0x1a, 0xb4, 0x35, 0xf9, + 0x98, 0xa4, 0xaa, 0xc8, 0x79, 0x1b, 0xca, 0x4c, 0x25, 0x87, 0xe4, 0x71, 0x09, 0x78, 0x8e, 0xd8, 0x2c, 0x65, 0x73, + 0xa1, 0x36, 0x9b, 0x7a, 0xad, 0xd8, 0x91, 0xdb, 0x46, 0xd1, 0x66, 0x2d, 0x6a, 0x3b, 0x89, 0xc5, 0x72, 0x7a, 0x6b, + 0x85, 0x81, 0x53, 0xd3, 0x9a, 0x9b, 0x3d, 0xe8, 0x34, 0x5b, 0x9f, 0xc9, 0x4d, 0x80, 0x38, 0xc0, 0x70, 0xdd, 0x2e, + 0x6e, 0x96, 0x84, 0xde, 0xb2, 0x5b, 0x2b, 0x56, 0xbd, 0xb1, 0x72, 0x11, 0x93, 0x76, 0x33, 0x98, 0xc0, 0x65, 0x9c, + 0x15, 0xf6, 0x85, 0x56, 0x37, 0x14, 0x1d, 0x6d, 0x93, 0xf6, 0xf3, 0x8e, 0x76, 0xc3, 0x05, 0xdf, 0x8a, 0x75, 0x9c, + 0x1b, 0xd2, 0x54, 0xa1, 0x47, 0x07, 0x7a, 0x3b, 0x04, 0x34, 0x67, 0x63, 0xba, 0xa2, 0x29, 0x5e, 0xa0, 0xe9, 0x06, + 0xcc, 0x52, 0x2e, 0xa0, 0xaf, 0xdd, 0x3e, 0xc9, 0x17, 0xaa, 0x27, 0xc2, 0x5b, 0xa2, 0xe0, 0xcb, 0x91, 0x82, 0x57, + 0x56, 0xce, 0x63, 0x33, 0x87, 0x80, 0xc7, 0xa2, 0x4a, 0xf4, 0x4e, 0x8a, 0x4b, 0x50, 0xa6, 0xc2, 0x11, 0x68, 0xaa, + 0x46, 0x2c, 0xe1, 0x00, 0xb7, 0x17, 0x4f, 0x03, 0x42, 0x41, 0xaa, 0xbb, 0xb1, 0x2b, 0xf2, 0x96, 0xcd, 0xb6, 0xb7, + 0x60, 0x16, 0x5b, 0x6d, 0xca, 0xd6, 0x57, 0x36, 0xd9, 0x7d, 0x5c, 0x13, 0x6c, 0xbb, 0xb7, 0x41, 0xc2, 0x5b, 0x7a, + 0x43, 0xb6, 0x37, 0xfd, 0x7e, 0x08, 0xfd, 0x21, 0x54, 0x77, 0xe8, 0xb6, 0xb3, 0x43, 0xb7, 0x3e, 0xf3, 0x6b, 0xf5, + 0x7c, 0xca, 0x1b, 0xe2, 0x03, 0x9a, 0x68, 0xd1, 0x75, 0x7c, 0x07, 0x9b, 0x3a, 0xaa, 0xa8, 0xaa, 0x3c, 0x4a, 0x28, + 0xa8, 0x80, 0x33, 0x5e, 0x9e, 0x72, 0x8c, 0x6d, 0xaa, 0x9f, 0xde, 0x69, 0x5e, 0x6d, 0x63, 0xd6, 0x66, 0xb9, 0x39, + 0x07, 0x8b, 0x80, 0x73, 0x1e, 0x5d, 0x69, 0x5a, 0x72, 0xe9, 0x31, 0xf5, 0x67, 0x38, 0x2a, 0xc1, 0x45, 0x9c, 0xe5, + 0x3c, 0x0d, 0xe8, 0x45, 0xb3, 0xff, 0xa1, 0xb6, 0x95, 0x5a, 0x35, 0xce, 0xdc, 0xeb, 0x90, 0x6c, 0xff, 0xc7, 0x06, + 0xea, 0x75, 0x88, 0x11, 0x51, 0xcd, 0x82, 0x7e, 0xcb, 0x20, 0x36, 0x66, 0x50, 0x6e, 0x92, 0x84, 0x97, 0x65, 0x60, + 0x94, 0x5a, 0x1b, 0xb6, 0x31, 0xe7, 0xd9, 0x23, 0x36, 0x7b, 0xd4, 0x63, 0xec, 0x96, 0xd0, 0x44, 0xeb, 0x84, 0x4c, + 0x8d, 0x91, 0xa7, 0x05, 0xd2, 0x1d, 0x8a, 0xb2, 0x8b, 0xf0, 0x2d, 0x0a, 0x59, 0xda, 0xfb, 0xdc, 0x9c, 0xc8, 0xea, + 0x1b, 0x6d, 0x74, 0x11, 0xa9, 0x44, 0x90, 0x8d, 0xdf, 0x20, 0x60, 0x2f, 0x34, 0x3b, 0x20, 0xdb, 0x15, 0x3b, 0xa5, + 0x67, 0xd6, 0x04, 0x06, 0x5e, 0xbf, 0x55, 0x89, 0x66, 0x94, 0x15, 0xd1, 0x55, 0x46, 0x2e, 0x77, 0x21, 0x89, 0xce, + 0x42, 0xe2, 0xe7, 0x86, 0xa5, 0x75, 0x1d, 0xa2, 0x98, 0xd9, 0x6c, 0x78, 0xd5, 0xdd, 0x47, 0x8d, 0x6d, 0x65, 0x7c, + 0xaa, 0x6f, 0x6d, 0x1a, 0x99, 0x42, 0x5f, 0x87, 0x93, 0x7e, 0x1f, 0xfe, 0x6a, 0xfa, 0x81, 0xb7, 0x14, 0xfc, 0xc5, + 0x1e, 0x91, 0x3a, 0x61, 0x01, 0xc0, 0x11, 0xe6, 0xbc, 0x6a, 0x4e, 0xe0, 0x23, 0x36, 0xdb, 0x3e, 0x0a, 0x4f, 0x1b, + 0x33, 0x77, 0x17, 0xe2, 0xa5, 0x2a, 0xe9, 0x79, 0xf3, 0x64, 0x06, 0x62, 0x1d, 0x9a, 0xfd, 0x7a, 0xcb, 0xac, 0x3e, + 0x01, 0x88, 0xd4, 0xad, 0x75, 0x28, 0xc5, 0x8f, 0x4d, 0x97, 0xc9, 0x36, 0x65, 0x6d, 0x26, 0x4a, 0xa9, 0x48, 0x9a, + 0x8b, 0x00, 0xfa, 0x0d, 0xc3, 0x51, 0x03, 0xbc, 0xb7, 0x1e, 0x7b, 0x33, 0x34, 0xde, 0x98, 0x1a, 0x7a, 0xb6, 0xd5, + 0xcb, 0xdb, 0x51, 0x08, 0x33, 0x16, 0xd1, 0xad, 0x3b, 0x16, 0xc3, 0x53, 0xfa, 0x16, 0x2a, 0x7c, 0x1d, 0x62, 0x34, + 0x5d, 0x52, 0xd7, 0xd3, 0x8d, 0xda, 0x4a, 0x37, 0x84, 0xe6, 0x18, 0xc5, 0xc7, 0x6b, 0xdb, 0x1d, 0x35, 0x42, 0x7b, + 0x42, 0x79, 0x78, 0x4b, 0x2b, 0x7a, 0x63, 0x59, 0x04, 0x27, 0x3f, 0xf6, 0xf2, 0x13, 0x7a, 0xee, 0x09, 0x4c, 0x8a, + 0xb6, 0x06, 0xf0, 0x07, 0xd4, 0x0f, 0x67, 0xf5, 0xd4, 0x4a, 0x39, 0x3c, 0x85, 0x2f, 0xd9, 0x82, 0x5c, 0x41, 0x2f, + 0xd6, 0x98, 0xcd, 0x62, 0xd0, 0x41, 0xed, 0xed, 0x0e, 0x6f, 0x52, 0xca, 0x10, 0xad, 0xef, 0x1c, 0xc4, 0xd3, 0x3f, + 0x40, 0xd3, 0x07, 0x69, 0x61, 0x4a, 0x37, 0x28, 0xe0, 0x01, 0x7d, 0x53, 0xbf, 0x9f, 0xe3, 0x73, 0xed, 0x59, 0x62, + 0x61, 0x8f, 0x57, 0x84, 0xae, 0xbc, 0xb8, 0x51, 0x20, 0x6d, 0x76, 0xac, 0x02, 0xb0, 0x22, 0x09, 0x34, 0x22, 0x01, + 0x4b, 0x1d, 0x4f, 0x5c, 0xb6, 0x45, 0x03, 0x92, 0xa8, 0xa4, 0x90, 0x25, 0x92, 0xc0, 0x0f, 0x23, 0x08, 0x51, 0x14, + 0x83, 0xb8, 0x57, 0x2f, 0xaf, 0xb8, 0xa6, 0x06, 0x9c, 0x28, 0x82, 0x09, 0xd6, 0xe9, 0x14, 0x88, 0xad, 0xd8, 0xac, + 0xc1, 0xf3, 0xd2, 0x71, 0xe2, 0xc8, 0x12, 0xa0, 0x41, 0x9a, 0x2f, 0x9d, 0x76, 0xcb, 0xdb, 0x13, 0x2d, 0x55, 0x6c, + 0xe1, 0xbd, 0x58, 0x5a, 0xee, 0xb1, 0xf2, 0xb7, 0x03, 0xed, 0x85, 0xd5, 0x9e, 0x88, 0x1a, 0xac, 0xec, 0xda, 0x76, + 0x6d, 0x28, 0x0d, 0xd5, 0xbd, 0x72, 0x4c, 0x40, 0x45, 0xd7, 0x71, 0xb5, 0x8a, 0xb2, 0x11, 0xfc, 0xd9, 0xed, 0x82, + 0xc3, 0x00, 0x2c, 0x20, 0x7f, 0x79, 0xff, 0x53, 0x84, 0xe1, 0x99, 0x7e, 0x79, 0xff, 0xd3, 0x6e, 0xf7, 0x74, 0x3c, + 0x36, 0x5c, 0x81, 0x53, 0xeb, 0x00, 0x7f, 0x60, 0xd8, 0x06, 0xbb, 0x64, 0x77, 0xbb, 0xa7, 0xc0, 0x41, 0x28, 0xb6, + 0xc1, 0xec, 0x62, 0xe5, 0xc8, 0xa5, 0x58, 0x0d, 0xbd, 0x23, 0x01, 0xab, 0x6e, 0x8f, 0xa5, 0xd8, 0xa7, 0x3e, 0x2a, + 0x04, 0xa3, 0x5e, 0xf4, 0x2f, 0x3a, 0x05, 0x96, 0x14, 0x4c, 0x57, 0x83, 0x55, 0x55, 0xad, 0xcb, 0xe8, 0xf0, 0x30, + 0x5e, 0x67, 0xa3, 0x32, 0x83, 0x6d, 0x5e, 0x5e, 0x5f, 0x02, 0xa0, 0x42, 0x40, 0x1b, 0xef, 0x36, 0x22, 0x33, 0x2f, + 0x96, 0x74, 0x95, 0xe1, 0x9a, 0x04, 0xb3, 0x83, 0x9c, 0x5b, 0xdd, 0xe4, 0x94, 0xd8, 0x07, 0xb0, 0x39, 0xdc, 0xed, + 0x1a, 0xfc, 0xc2, 0x6c, 0xf4, 0x74, 0xbe, 0xca, 0xb4, 0x41, 0x27, 0x37, 0xfb, 0x9f, 0x44, 0x5e, 0x1a, 0x2a, 0x3e, + 0xc9, 0xf4, 0x45, 0x06, 0x7c, 0x1e, 0x7b, 0x23, 0x42, 0x9f, 0xe5, 0x6a, 0xb4, 0x06, 0xd8, 0xd8, 0xec, 0xe2, 0x6e, + 0x94, 0x72, 0x88, 0x48, 0x11, 0x58, 0x75, 0xcd, 0x2a, 0x23, 0xbe, 0x4d, 0xc5, 0x5d, 0x4b, 0x15, 0xf6, 0x46, 0x78, + 0xce, 0x2a, 0xdc, 0x38, 0xca, 0xf4, 0x26, 0x51, 0xf8, 0x02, 0x85, 0xa8, 0x1c, 0x8d, 0xe9, 0x9c, 0x40, 0x2a, 0xf3, + 0x98, 0x50, 0xcc, 0xe1, 0xde, 0xfd, 0x92, 0x3a, 0x73, 0x19, 0x5f, 0xb8, 0xf7, 0xc2, 0x97, 0x99, 0xdc, 0x4a, 0x00, + 0x45, 0x52, 0xb5, 0xff, 0xfc, 0x09, 0xa9, 0xf1, 0x3f, 0x53, 0xad, 0x01, 0xe8, 0xfd, 0x0c, 0x35, 0x39, 0x82, 0x80, + 0xad, 0x98, 0xfa, 0x68, 0xfa, 0x56, 0x32, 0xff, 0x01, 0x75, 0x3b, 0x82, 0x6d, 0x55, 0xfc, 0x9c, 0xa8, 0xa2, 0x05, + 0x4f, 0x37, 0x22, 0x8d, 0x45, 0x72, 0x17, 0xf1, 0x7a, 0x8a, 0x25, 0x31, 0x1b, 0x21, 0xeb, 0xe7, 0x66, 0x17, 0x7e, + 0x2a, 0x1a, 0x26, 0xe0, 0xb4, 0xf4, 0xb7, 0x95, 0xb7, 0x99, 0x2c, 0xe3, 0x8c, 0x4c, 0xb9, 0x42, 0xec, 0xb6, 0xfa, + 0x1e, 0x73, 0x82, 0x3f, 0x39, 0x7a, 0x42, 0xe8, 0xad, 0x9c, 0x96, 0x08, 0x4a, 0x27, 0x52, 0xeb, 0xaa, 0x89, 0xfd, + 0x9a, 0x42, 0x14, 0x07, 0xc1, 0x20, 0x74, 0xa7, 0x69, 0x9f, 0xe2, 0xfb, 0x6c, 0xd9, 0x6f, 0x4c, 0xd9, 0x92, 0x6c, + 0x05, 0x74, 0x4c, 0x3a, 0x6f, 0x4f, 0x6f, 0xcf, 0xce, 0xbd, 0xdf, 0xa0, 0x09, 0x07, 0xd5, 0x0d, 0xb4, 0xab, 0x20, + 0xd3, 0x18, 0xc5, 0x66, 0x31, 0xd6, 0x6e, 0x4d, 0x44, 0x10, 0x74, 0xba, 0x9c, 0x87, 0xed, 0x76, 0x42, 0x7c, 0x09, + 0x24, 0x50, 0xe0, 0xca, 0x45, 0x39, 0x09, 0x89, 0xba, 0x90, 0xe9, 0xc9, 0xba, 0x96, 0x2c, 0xd0, 0x6b, 0xec, 0x28, + 0xa0, 0x27, 0xdc, 0x3e, 0x05, 0xf4, 0x7d, 0xc1, 0x4e, 0xf8, 0x20, 0x18, 0x62, 0x7c, 0xd5, 0x80, 0xde, 0x48, 0xf5, + 0x08, 0x1e, 0xc2, 0xc0, 0x72, 0xd1, 0x97, 0x05, 0x43, 0x58, 0xa1, 0x3f, 0x53, 0x36, 0xf9, 0xfa, 0x1b, 0x37, 0xbf, + 0xe7, 0x5a, 0xcc, 0x0e, 0x42, 0x71, 0x7b, 0x3d, 0x01, 0xe2, 0x57, 0xf1, 0x2b, 0xb0, 0xae, 0xd6, 0x12, 0x6f, 0x37, + 0x3d, 0x7f, 0x08, 0x5f, 0x8e, 0x6e, 0x3f, 0x29, 0xcd, 0x27, 0x10, 0xa4, 0xc6, 0x49, 0xca, 0xdd, 0x77, 0x1f, 0xa5, + 0xab, 0x08, 0x46, 0x0b, 0x10, 0xeb, 0xee, 0xad, 0xe4, 0xac, 0x29, 0xfc, 0xc7, 0x3a, 0xdf, 0x63, 0xec, 0x10, 0x79, + 0x8a, 0xd3, 0xdf, 0x00, 0xc3, 0xbe, 0xf3, 0x6f, 0x65, 0xd6, 0x90, 0xe8, 0x5c, 0x7d, 0x04, 0xf4, 0x7f, 0xac, 0xc7, + 0xef, 0x04, 0x25, 0x7d, 0x49, 0x9c, 0x23, 0x5c, 0x11, 0x2f, 0xd1, 0x54, 0xaf, 0x37, 0xae, 0xe9, 0x5f, 0x85, 0x79, + 0xa1, 0x15, 0x1c, 0xf6, 0xad, 0x51, 0x78, 0xe0, 0x99, 0xf7, 0xab, 0x68, 0x08, 0xba, 0x7f, 0xc3, 0xbd, 0xf1, 0xab, + 0x60, 0x19, 0xde, 0x94, 0xb3, 0xcc, 0xdc, 0xe1, 0x6e, 0x32, 0x91, 0xca, 0x1b, 0xc6, 0x82, 0x8d, 0x50, 0xe6, 0xab, + 0x69, 0x30, 0xdf, 0xd6, 0x91, 0x4a, 0x76, 0xdf, 0xbf, 0x69, 0x9c, 0xb0, 0xd9, 0x20, 0x38, 0xad, 0x64, 0x11, 0x5f, + 0xf2, 0x60, 0xaa, 0x55, 0x14, 0x59, 0xd6, 0xef, 0x67, 0x80, 0x0c, 0xe3, 0xb4, 0x77, 0xf0, 0x64, 0xa9, 0x99, 0x09, + 0x71, 0x6d, 0x75, 0x16, 0xf0, 0xd6, 0x8c, 0xe6, 0x49, 0x05, 0xbb, 0xcc, 0x57, 0x52, 0xfc, 0xd1, 0x92, 0x64, 0x63, + 0xfd, 0x0d, 0x19, 0xb6, 0x95, 0xcf, 0x9c, 0x03, 0xc6, 0xcc, 0x8d, 0x54, 0x41, 0xee, 0x7a, 0xc0, 0x08, 0x21, 0x11, + 0x10, 0xce, 0x62, 0xe2, 0x4e, 0x98, 0xf0, 0x8f, 0x2e, 0x30, 0x4e, 0x8c, 0x81, 0x71, 0x3e, 0xca, 0x90, 0xd3, 0x13, + 0x3e, 0x48, 0x1a, 0xb3, 0xf5, 0x87, 0x2a, 0x91, 0x5e, 0x4b, 0x42, 0xcf, 0xe0, 0xf7, 0xb8, 0xc5, 0x03, 0x35, 0x82, + 0x53, 0xba, 0x9b, 0xd3, 0xe1, 0xcb, 0x82, 0x0c, 0xff, 0x04, 0xef, 0xae, 0xd8, 0x5e, 0x96, 0x13, 0x58, 0xdc, 0xb1, + 0x57, 0x3c, 0xcd, 0x55, 0x8b, 0x13, 0xe2, 0x11, 0x8b, 0xdc, 0x27, 0x16, 0x30, 0xa2, 0x86, 0xd1, 0xf8, 0xf1, 0xf4, + 0xed, 0x1b, 0x8d, 0xd9, 0x94, 0xfb, 0x1f, 0xc0, 0x88, 0x6a, 0x69, 0xbb, 0x1d, 0xf0, 0xd5, 0x08, 0x0d, 0xb6, 0x53, + 0x37, 0xd8, 0xfd, 0xbe, 0x49, 0x9b, 0x95, 0x5e, 0x36, 0x27, 0x06, 0xdd, 0x53, 0xda, 0xac, 0x94, 0x41, 0x6d, 0x57, + 0xe1, 0x68, 0x3e, 0x6b, 0xc4, 0xaa, 0xde, 0x87, 0xe1, 0x8a, 0xc6, 0x56, 0x56, 0x6e, 0x77, 0x13, 0x8e, 0x6c, 0x02, + 0x5c, 0x9f, 0x82, 0xb2, 0x6a, 0xce, 0x41, 0x0b, 0x3a, 0x13, 0x38, 0xa2, 0xdd, 0x2e, 0x84, 0x08, 0x1c, 0xc5, 0x70, + 0x32, 0x0f, 0x8b, 0xe1, 0x50, 0x0d, 0x7c, 0x41, 0x48, 0xf4, 0x57, 0xb1, 0xc8, 0x96, 0x0a, 0xb1, 0xc7, 0xdf, 0x49, + 0xbf, 0x16, 0x8a, 0x53, 0xee, 0xfd, 0x2a, 0xc8, 0xf6, 0xb7, 0x14, 0x63, 0x0e, 0x3a, 0xcd, 0x66, 0x06, 0x12, 0xd6, + 0x93, 0x8a, 0xa8, 0x75, 0x64, 0x67, 0x03, 0x54, 0xb1, 0x68, 0x0a, 0x0b, 0xea, 0x16, 0x4f, 0xac, 0x67, 0xf4, 0x1e, + 0x54, 0x82, 0xa8, 0x16, 0xec, 0xc6, 0x70, 0xad, 0xfd, 0x25, 0x42, 0x49, 0x39, 0x69, 0x32, 0x33, 0x56, 0x34, 0x58, + 0x80, 0x90, 0x34, 0x2e, 0xab, 0xd7, 0x32, 0xcd, 0x2e, 0x32, 0x40, 0x4c, 0x70, 0xfe, 0x73, 0xb2, 0xf1, 0xe6, 0x99, + 0x9a, 0x97, 0xae, 0xc4, 0xb9, 0x85, 0xf9, 0xe8, 0x7a, 0x4b, 0x0b, 0x12, 0x15, 0x40, 0xa3, 0x7c, 0x2d, 0xcf, 0xdf, + 0xf7, 0xac, 0x42, 0xf6, 0x3f, 0x9c, 0x2a, 0xdb, 0x21, 0x3e, 0x63, 0x15, 0xf1, 0x4e, 0xeb, 0x4a, 0x89, 0x34, 0x3a, + 0xda, 0x06, 0xc4, 0xb0, 0x65, 0xdf, 0xa2, 0x86, 0x0f, 0xc2, 0x0c, 0x3a, 0xc9, 0x0f, 0x7a, 0x46, 0xc7, 0xd6, 0x40, + 0xd2, 0xd7, 0x22, 0xf8, 0x1a, 0x1d, 0xe9, 0x44, 0x99, 0x46, 0x62, 0x0a, 0x89, 0x7e, 0xbd, 0xd0, 0x1a, 0xcb, 0x28, + 0xfb, 0x8a, 0xfc, 0xef, 0x75, 0xf7, 0x7e, 0x15, 0xbb, 0x1d, 0x4c, 0xb2, 0xe7, 0x71, 0x05, 0x9b, 0x1a, 0xb5, 0x42, + 0x38, 0x3b, 0x27, 0x15, 0x6a, 0xc7, 0x7a, 0x61, 0x09, 0xe4, 0x01, 0x6c, 0x45, 0x1a, 0x94, 0x41, 0xb2, 0xbf, 0x8a, + 0x85, 0x58, 0x3a, 0x51, 0x8e, 0x54, 0x78, 0x5f, 0x72, 0x94, 0x72, 0xb8, 0x8a, 0x85, 0x05, 0x43, 0x7e, 0x75, 0x74, + 0x51, 0xc8, 0x2b, 0x90, 0x94, 0x18, 0x86, 0xca, 0xf2, 0xba, 0xb8, 0x6a, 0x4b, 0x42, 0x7b, 0x67, 0x00, 0xc2, 0x52, + 0x80, 0xe0, 0xa5, 0x51, 0x43, 0xcc, 0xb6, 0x6a, 0x77, 0x45, 0xf7, 0x92, 0x03, 0xea, 0x74, 0xd7, 0x6e, 0xbd, 0x29, + 0xdb, 0x6c, 0x2b, 0x2e, 0xfc, 0x03, 0x4a, 0x3f, 0xe1, 0x83, 0xc2, 0xa7, 0x12, 0xb8, 0xf1, 0xd5, 0x26, 0xcb, 0x2e, + 0xee, 0x70, 0xe9, 0x57, 0x8d, 0xf1, 0xeb, 0xf7, 0x7b, 0x6a, 0x21, 0x34, 0x52, 0x81, 0xf9, 0xf6, 0x99, 0xa9, 0xca, + 0x68, 0x4a, 0xed, 0x25, 0xb8, 0x72, 0xf6, 0x23, 0xa8, 0x88, 0xeb, 0x8a, 0x4c, 0xa6, 0x06, 0xe8, 0xc0, 0xcb, 0x0a, + 0xb7, 0xb2, 0x00, 0x8f, 0x9d, 0x80, 0xec, 0x76, 0x3c, 0x0c, 0xf4, 0xa1, 0x13, 0xf8, 0x5b, 0xf2, 0x14, 0x99, 0x35, + 0xfb, 0xf8, 0xb3, 0x16, 0xfc, 0x63, 0x0b, 0x7e, 0x42, 0x71, 0xa7, 0x95, 0xf9, 0xb7, 0xd2, 0xba, 0xc5, 0xfd, 0x7b, + 0x99, 0x26, 0x14, 0x95, 0x09, 0xb5, 0x5f, 0xe9, 0xbf, 0x4c, 0xb0, 0x24, 0x95, 0xfd, 0x83, 0x84, 0x0f, 0xe6, 0x8d, + 0x27, 0xd6, 0x78, 0x32, 0x9c, 0x6e, 0xa5, 0x61, 0x08, 0x50, 0xe8, 0xe7, 0x65, 0xae, 0xa8, 0x7e, 0xfe, 0x79, 0xc3, + 0x37, 0xbc, 0xd9, 0x62, 0x9b, 0xf4, 0x40, 0x83, 0xbd, 0x3c, 0x9a, 0x52, 0x38, 0x89, 0x3a, 0x37, 0x12, 0x75, 0x51, + 0xb3, 0x0c, 0xd5, 0x09, 0x5e, 0xcd, 0x53, 0x3d, 0xec, 0xcd, 0x44, 0xb4, 0x56, 0x52, 0x96, 0x18, 0xb0, 0xd6, 0x91, + 0x87, 0xe4, 0x6e, 0xad, 0xe3, 0x4e, 0x43, 0x5d, 0x9a, 0x42, 0x09, 0xb0, 0xc2, 0x05, 0x38, 0x82, 0x7e, 0x2a, 0x42, + 0x0e, 0xd7, 0x54, 0xa5, 0x5f, 0xd0, 0x94, 0x3c, 0xf1, 0x14, 0xb5, 0x5a, 0x91, 0x6e, 0x3f, 0xca, 0xb1, 0x1b, 0xbe, + 0x71, 0x42, 0x4e, 0x8c, 0xd0, 0xdf, 0x1d, 0x4b, 0x39, 0x43, 0x8b, 0x07, 0x75, 0x82, 0xf5, 0xf2, 0x96, 0x02, 0xc5, + 0x1c, 0x5d, 0x56, 0x5d, 0xf3, 0x0a, 0x6d, 0x5f, 0x56, 0xfd, 0x7e, 0x6e, 0xeb, 0x49, 0xd9, 0x6c, 0xbb, 0x32, 0xfb, + 0x10, 0x15, 0x53, 0xb8, 0xeb, 0x13, 0xcd, 0x5f, 0x85, 0xfa, 0xaa, 0x2d, 0x73, 0x3e, 0xe2, 0x88, 0x8b, 0x91, 0x93, + 0xfa, 0x67, 0x35, 0xf5, 0x4a, 0xdc, 0xaf, 0x2a, 0xf9, 0x4e, 0x18, 0x2b, 0x46, 0x07, 0xd4, 0x9f, 0x2a, 0x95, 0xf7, + 0x8b, 0x02, 0xe0, 0x9e, 0x04, 0xfb, 0x0b, 0xec, 0x2b, 0x34, 0xc2, 0x6f, 0x4b, 0xc0, 0xbf, 0x55, 0xdc, 0x80, 0x55, + 0x60, 0x80, 0xd1, 0x64, 0x7b, 0x4e, 0x13, 0x38, 0xe0, 0x84, 0x56, 0x51, 0x50, 0x61, 0x86, 0x86, 0xda, 0xc2, 0xe8, + 0x29, 0xca, 0xb8, 0x55, 0x66, 0xef, 0xc6, 0xd8, 0x69, 0x81, 0xd7, 0xf0, 0xe7, 0xf3, 0x42, 0x0f, 0x1b, 0x75, 0x90, + 0x1e, 0x9d, 0xc4, 0xf4, 0xc7, 0x2d, 0x9c, 0xdc, 0x2c, 0x9c, 0x55, 0xcd, 0x12, 0xe8, 0x0e, 0x5c, 0x10, 0xe3, 0x7e, + 0x3f, 0x87, 0x23, 0xd3, 0x8c, 0x7c, 0xc1, 0x72, 0x1a, 0xb3, 0x15, 0xd5, 0x9e, 0x76, 0x97, 0x55, 0x98, 0xd3, 0x95, + 0x95, 0xf1, 0xa6, 0x0c, 0x54, 0x46, 0xbb, 0x5d, 0x08, 0x7f, 0xba, 0xad, 0x5d, 0xd2, 0xc5, 0x0a, 0x32, 0xc0, 0x1f, + 0x90, 0x88, 0x22, 0xf6, 0xf5, 0xbf, 0xd5, 0x38, 0xa5, 0x27, 0x4a, 0x6b, 0x96, 0xd0, 0x0d, 0xd3, 0xf5, 0xd3, 0x0b, + 0xb6, 0x69, 0x2c, 0x85, 0xdd, 0x2e, 0x6c, 0x26, 0x30, 0xcd, 0xb9, 0x92, 0xe9, 0x05, 0xea, 0xa4, 0x80, 0x8a, 0x85, + 0x17, 0xb8, 0xfc, 0x52, 0x42, 0xa1, 0xb9, 0x8b, 0xd5, 0xd2, 0x28, 0x31, 0xa1, 0x55, 0xf2, 0xf3, 0x87, 0xca, 0x7c, + 0x6d, 0x3c, 0xe2, 0xfe, 0x95, 0x86, 0x89, 0x29, 0x12, 0x15, 0xa2, 0xf3, 0x5f, 0x41, 0x96, 0x23, 0x00, 0xc7, 0xf2, + 0x54, 0xd6, 0xf4, 0xc7, 0x14, 0xe2, 0xa0, 0x43, 0x83, 0xde, 0x15, 0xf2, 0x2a, 0x2b, 0x79, 0x88, 0xf7, 0x04, 0x4f, + 0x33, 0x7a, 0xbf, 0xc1, 0x87, 0xb6, 0xf6, 0xe8, 0x09, 0xb2, 0xf5, 0x94, 0xfb, 0xf5, 0x77, 0x22, 0x5c, 0x40, 0xb4, + 0xca, 0x25, 0xd5, 0xea, 0x6a, 0x07, 0x40, 0xe5, 0xd9, 0x5e, 0x3d, 0x82, 0xd3, 0x4d, 0x5f, 0xdf, 0xaa, 0xd0, 0x99, + 0x03, 0x48, 0x7b, 0x48, 0xd6, 0x35, 0xd7, 0x3b, 0xc0, 0x1d, 0x89, 0xd5, 0x06, 0x68, 0xac, 0xdb, 0x9a, 0x9d, 0xf6, + 0x28, 0x1e, 0x13, 0x99, 0x19, 0x8b, 0x14, 0x63, 0xee, 0xd6, 0x69, 0x51, 0xb4, 0x45, 0x33, 0x84, 0xfd, 0xbb, 0x0e, + 0xdf, 0xb4, 0x22, 0xac, 0xdf, 0x6f, 0xfb, 0x02, 0xa3, 0x61, 0xcc, 0xb5, 0x7b, 0x9e, 0xa1, 0x1b, 0x36, 0xd8, 0x46, + 0xce, 0x43, 0xe4, 0xc3, 0x4c, 0x1d, 0x88, 0xb2, 0xb6, 0x06, 0x6c, 0x8f, 0xb8, 0xde, 0xb4, 0x8a, 0x9f, 0x57, 0x31, + 0x67, 0x7b, 0xd6, 0x38, 0xa5, 0xf5, 0x35, 0xae, 0x39, 0xae, 0x0a, 0x11, 0xb5, 0xf5, 0x8c, 0x87, 0x61, 0xe7, 0x4b, + 0xdc, 0x99, 0x15, 0x06, 0x2f, 0xc2, 0x52, 0xc9, 0x5e, 0xe5, 0xfa, 0x73, 0xd8, 0xe2, 0x20, 0x95, 0x2f, 0xbd, 0xfe, + 0xfe, 0xcb, 0x17, 0x5f, 0xa0, 0x9b, 0x9a, 0xf3, 0x23, 0x08, 0x32, 0x81, 0x0e, 0x59, 0x4a, 0xf5, 0xf8, 0x5d, 0x01, + 0xd4, 0x1e, 0xe6, 0xe1, 0xbb, 0x82, 0x89, 0xf8, 0x3a, 0xbb, 0x8c, 0x2b, 0x59, 0x8c, 0xae, 0xb9, 0x48, 0x65, 0x61, + 0xa5, 0xc6, 0xc1, 0xc9, 0x7a, 0x9d, 0xf3, 0x00, 0x4c, 0xe5, 0x2d, 0xa3, 0x6c, 0x2b, 0xcb, 0xf4, 0xe0, 0x6a, 0x79, + 0x7a, 0xa5, 0x45, 0xe7, 0xe5, 0xf5, 0x65, 0x10, 0xe1, 0xaf, 0x73, 0xf3, 0xe3, 0x2a, 0x2e, 0x3f, 0x06, 0x91, 0xb5, + 0xa9, 0x33, 0x3f, 0x50, 0x2a, 0x0f, 0xfe, 0x53, 0x20, 0xd3, 0xfd, 0xae, 0x00, 0xcb, 0x6c, 0x5b, 0xf1, 0x71, 0x8c, + 0xb5, 0x0e, 0x27, 0x64, 0xae, 0x4a, 0xf4, 0xde, 0x25, 0x9b, 0x02, 0xac, 0xfd, 0x14, 0x96, 0xb1, 0xca, 0x35, 0xc7, + 0xca, 0x54, 0x45, 0x66, 0x56, 0x36, 0xec, 0x30, 0xb4, 0x4e, 0x34, 0x0b, 0xf4, 0x16, 0xd0, 0x0f, 0xe4, 0xf0, 0x92, + 0x96, 0x1b, 0xe6, 0xf9, 0xd8, 0x34, 0x5e, 0x3f, 0x3a, 0xbc, 0x74, 0x0b, 0xf6, 0xd6, 0xde, 0xc9, 0x51, 0x98, 0x08, + 0x9e, 0xb5, 0x66, 0x7c, 0x91, 0x67, 0x05, 0xac, 0x9c, 0xc9, 0x78, 0x4c, 0xbd, 0xa5, 0xd5, 0xba, 0x39, 0x3a, 0x24, + 0xd7, 0xec, 0x71, 0xf5, 0x98, 0x93, 0x43, 0xde, 0x32, 0xb5, 0x6d, 0x5b, 0xc7, 0x79, 0x9a, 0x7c, 0x65, 0xba, 0x2f, + 0x36, 0x36, 0x22, 0xba, 0x72, 0xee, 0x73, 0x5e, 0xc1, 0xad, 0x6f, 0x4a, 0x43, 0xaf, 0x25, 0x00, 0xd1, 0x69, 0x03, + 0xfe, 0x82, 0x95, 0x9b, 0x51, 0xc5, 0xcb, 0x0a, 0x24, 0x2c, 0x28, 0xc2, 0x9b, 0x62, 0x6f, 0x0a, 0x77, 0xe3, 0xf4, + 0x1c, 0x76, 0xe0, 0x62, 0x8a, 0xee, 0x38, 0x31, 0x99, 0x97, 0x46, 0x2b, 0x1a, 0xe9, 0x5f, 0xae, 0x2f, 0xb1, 0xee, + 0x8b, 0x56, 0xe6, 0xd9, 0x9c, 0x0a, 0x8b, 0xdd, 0x55, 0x2e, 0x9d, 0xa8, 0xdf, 0x32, 0xe1, 0xca, 0x95, 0x20, 0x20, + 0xd3, 0x82, 0xf5, 0x0a, 0xb3, 0x8b, 0xe4, 0x06, 0x08, 0x19, 0x18, 0xbe, 0x06, 0x1b, 0x51, 0x72, 0x63, 0x05, 0xeb, + 0xdd, 0xf3, 0x75, 0x82, 0x90, 0x82, 0x07, 0x6e, 0x82, 0x7e, 0x68, 0xdd, 0xbc, 0x1d, 0x25, 0xca, 0x20, 0x1e, 0xb7, + 0x76, 0xca, 0x41, 0x02, 0x01, 0xb8, 0xa7, 0x2a, 0x04, 0x87, 0x02, 0x59, 0x07, 0x57, 0x33, 0x8e, 0xe0, 0xea, 0xca, + 0x99, 0x8b, 0x1b, 0x80, 0x75, 0xe5, 0xcf, 0x65, 0x83, 0x0b, 0xeb, 0x11, 0x55, 0xe6, 0x8c, 0x53, 0x0c, 0x62, 0x64, + 0x09, 0xfa, 0xda, 0x52, 0xda, 0x4b, 0xd0, 0x34, 0x5e, 0xb1, 0xb5, 0xf2, 0x01, 0xa0, 0xe7, 0x6c, 0xad, 0x8c, 0xfd, + 0xf1, 0xeb, 0x33, 0xb6, 0xd6, 0xd2, 0xe0, 0xe9, 0xd5, 0xfc, 0x7c, 0x7e, 0x36, 0x60, 0x47, 0x51, 0xa8, 0x0d, 0x18, + 0x02, 0x87, 0xc4, 0x1f, 0x0c, 0x42, 0x8d, 0x77, 0x32, 0x50, 0x01, 0xb1, 0x88, 0xc7, 0x63, 0x23, 0x6e, 0x56, 0x38, + 0x1e, 0x62, 0xf0, 0xab, 0xe6, 0x0b, 0x12, 0x10, 0x6a, 0x4a, 0x43, 0x97, 0xc7, 0x70, 0x38, 0x39, 0x98, 0x40, 0x2a, + 0x66, 0x66, 0xaa, 0x30, 0x36, 0x26, 0x11, 0xc4, 0x3b, 0xed, 0xac, 0x17, 0xca, 0xed, 0xae, 0xd1, 0x40, 0xae, 0x0c, + 0x3e, 0xab, 0xe2, 0xc9, 0xc1, 0xb0, 0xab, 0x62, 0x1c, 0x85, 0x6b, 0xa3, 0x7c, 0x3b, 0x3b, 0x06, 0xf0, 0xda, 0xb3, + 0xa1, 0x2f, 0x97, 0x38, 0x3b, 0x7c, 0x42, 0x1e, 0x3f, 0x21, 0xf4, 0x8c, 0x9d, 0x7d, 0xf1, 0x84, 0x9e, 0x29, 0x72, + 0x72, 0x30, 0x89, 0xae, 0x99, 0xc5, 0x7c, 0x39, 0x52, 0x4d, 0xa0, 0x97, 0xa3, 0x8d, 0x50, 0x0b, 0x4c, 0x3b, 0x34, + 0x85, 0xdf, 0x8e, 0x0f, 0x82, 0xc1, 0x75, 0xbb, 0xe9, 0xd7, 0xed, 0xb6, 0x7a, 0x5e, 0x5d, 0x07, 0x47, 0xd1, 0x7e, + 0x31, 0x93, 0x6f, 0xc6, 0x07, 0x6e, 0x0e, 0xb0, 0xbe, 0x87, 0xc7, 0xc4, 0x34, 0x69, 0x6f, 0x54, 0xfc, 0x9a, 0xbe, + 0xc2, 0x3e, 0x34, 0x8b, 0xec, 0xe8, 0xc3, 0xf0, 0xdf, 0xea, 0x44, 0x7d, 0xf6, 0xc5, 0x11, 0x90, 0x23, 0x90, 0x81, + 0x62, 0x89, 0x60, 0x86, 0x03, 0x4d, 0x01, 0x05, 0x99, 0x1e, 0x77, 0xaa, 0x87, 0x5f, 0x8d, 0x9a, 0x9a, 0x91, 0x6b, + 0x98, 0x1a, 0x6c, 0x0b, 0x7e, 0xa0, 0xba, 0xa1, 0xbf, 0xd1, 0xe8, 0x46, 0xda, 0xc9, 0xcc, 0xbc, 0xa4, 0x36, 0xae, + 0xdb, 0x35, 0x04, 0x30, 0x76, 0xf0, 0x82, 0x92, 0x7d, 0x79, 0x7c, 0x79, 0x80, 0xab, 0x08, 0x50, 0xb2, 0x58, 0xf0, + 0xe5, 0xe0, 0x52, 0x6f, 0xee, 0x83, 0x80, 0x0c, 0xbe, 0x0c, 0x66, 0x5f, 0x0e, 0xe4, 0x20, 0x38, 0x3e, 0xbc, 0x9c, + 0x05, 0xce, 0xb8, 0x1f, 0x42, 0x3c, 0xaa, 0x8a, 0x62, 0x26, 0x4c, 0x15, 0x89, 0xad, 0x3d, 0xb7, 0xf5, 0x2a, 0xe3, + 0x33, 0x9a, 0x4e, 0x2d, 0xf2, 0x77, 0x98, 0xb2, 0xd8, 0xfc, 0x0e, 0x26, 0xfc, 0x2a, 0x88, 0x5c, 0x10, 0xd4, 0x79, + 0x1e, 0xc5, 0x74, 0xc5, 0x6e, 0x45, 0x98, 0xd2, 0xe4, 0x30, 0x27, 0x24, 0x0a, 0x57, 0x0a, 0x3c, 0x4f, 0xbd, 0x4e, + 0x20, 0x8e, 0xab, 0xfb, 0xfc, 0x56, 0x84, 0x2b, 0x9a, 0x1f, 0x26, 0xa4, 0x55, 0x84, 0x8b, 0xc8, 0xb2, 0xad, 0xe9, + 0x05, 0x0b, 0xd7, 0xf4, 0x12, 0x98, 0x29, 0xb9, 0x09, 0x2f, 0x81, 0xcb, 0xdb, 0x2c, 0xd6, 0x4b, 0x76, 0xd9, 0x90, + 0xbe, 0x19, 0xbe, 0xf8, 0xc2, 0xfa, 0xe4, 0x01, 0x0f, 0xe9, 0xfc, 0xf0, 0x52, 0xb0, 0x01, 0xb8, 0xce, 0xf8, 0xcd, + 0x77, 0xf2, 0x56, 0xcf, 0x4b, 0x7b, 0x8a, 0x71, 0x66, 0xda, 0x89, 0x49, 0x3b, 0x21, 0xf7, 0xef, 0xdb, 0xdb, 0xd8, + 0x9c, 0xec, 0x65, 0xb4, 0x51, 0x2e, 0xab, 0x96, 0x21, 0x29, 0x36, 0x0c, 0xf9, 0x7b, 0x94, 0x9c, 0x5a, 0x81, 0x27, + 0xbb, 0xe0, 0x55, 0xb2, 0xf2, 0x0f, 0x2a, 0x6b, 0x35, 0x60, 0x8f, 0x11, 0xcb, 0x42, 0xe1, 0xd8, 0xbf, 0xce, 0x58, + 0xb1, 0xf1, 0x05, 0x1a, 0x31, 0x72, 0x6f, 0xaf, 0x33, 0xe6, 0xc5, 0x5c, 0x4d, 0x36, 0x5e, 0xa8, 0x3a, 0x2f, 0x3d, + 0x6f, 0xf1, 0x5e, 0x4e, 0xa9, 0x61, 0x24, 0xa2, 0x07, 0x63, 0x65, 0x46, 0xa9, 0x12, 0xb5, 0x06, 0x8d, 0x08, 0x36, + 0x76, 0xc1, 0x2f, 0xc1, 0x09, 0x95, 0x7b, 0xea, 0x6c, 0xdf, 0x4e, 0xa9, 0xf4, 0x80, 0x65, 0xa9, 0x51, 0x95, 0xbb, + 0x65, 0x26, 0x59, 0x35, 0x08, 0x46, 0x7f, 0x94, 0x52, 0xcc, 0xf1, 0xce, 0xc8, 0x82, 0x29, 0x58, 0x09, 0xaa, 0x5a, + 0x86, 0xe5, 0x90, 0xa3, 0x16, 0xcf, 0xf8, 0xa4, 0x4a, 0xfd, 0xa3, 0x23, 0x48, 0xee, 0x6a, 0xd3, 0x0a, 0x92, 0xfb, + 0x64, 0xfc, 0x44, 0x0f, 0x74, 0xba, 0xd1, 0x8e, 0x87, 0x3e, 0xbf, 0x8d, 0xf8, 0xda, 0xba, 0xf7, 0x54, 0x6b, 0x15, + 0xca, 0x40, 0x8b, 0x15, 0x95, 0x2b, 0xb5, 0xa4, 0xf7, 0xbb, 0x08, 0x80, 0x45, 0x6c, 0xcc, 0xc6, 0xfb, 0xb6, 0x59, + 0x21, 0x68, 0x74, 0xd9, 0x6c, 0x1b, 0x0f, 0x58, 0xa2, 0x5b, 0x3b, 0x98, 0xd0, 0x78, 0xc6, 0xca, 0x7e, 0x3f, 0x9f, + 0x01, 0x3d, 0xd5, 0x46, 0x4c, 0x05, 0x1c, 0xf9, 0x9f, 0x5b, 0x91, 0x29, 0x0a, 0x6c, 0xd6, 0xd4, 0xdd, 0x1a, 0xcb, + 0x48, 0xf4, 0x65, 0x4a, 0x97, 0x27, 0x3c, 0x03, 0xa6, 0xcd, 0xa6, 0xe5, 0xb8, 0xb2, 0xaf, 0x38, 0xf2, 0x54, 0x58, + 0x56, 0x9c, 0x57, 0xe1, 0x78, 0xeb, 0xf1, 0x0d, 0x0e, 0x0d, 0x9b, 0x76, 0xe1, 0x0f, 0x21, 0x2c, 0x84, 0xd7, 0x19, + 0xdc, 0x46, 0xb4, 0x9d, 0x04, 0x2a, 0x6f, 0xcc, 0x75, 0x42, 0xd9, 0xdc, 0x6e, 0x36, 0x9e, 0x41, 0x3a, 0x31, 0x07, + 0x4a, 0x35, 0x82, 0xd6, 0x68, 0x16, 0x54, 0x8d, 0x78, 0xe4, 0x78, 0x78, 0x67, 0x10, 0xab, 0xe5, 0x4b, 0x9a, 0x4a, + 0xd1, 0x00, 0x8c, 0x0b, 0xe0, 0xf2, 0xf4, 0xcb, 0xfb, 0x9f, 0x4e, 0x79, 0x5c, 0x24, 0xab, 0x77, 0x71, 0x11, 0x5f, + 0x95, 0xe1, 0x56, 0x8d, 0x51, 0x5c, 0x93, 0xa9, 0x18, 0x30, 0x69, 0x56, 0x52, 0x73, 0x57, 0x6a, 0x42, 0x8c, 0x75, + 0x26, 0x9b, 0xb2, 0x92, 0x57, 0x8d, 0x4a, 0x37, 0x45, 0x86, 0x1f, 0xb7, 0x7c, 0x4e, 0x0f, 0x01, 0xc8, 0xd3, 0xb8, + 0x90, 0x46, 0x52, 0x17, 0x62, 0xcc, 0x45, 0xbc, 0xae, 0x8f, 0xc7, 0x8d, 0xae, 0x97, 0xec, 0xe9, 0xf8, 0xab, 0xe9, + 0xeb, 0x2c, 0xcc, 0x06, 0x82, 0x8c, 0xaa, 0x15, 0x17, 0x2d, 0x53, 0x4e, 0x65, 0x12, 0x80, 0x3e, 0x9e, 0x3d, 0xc6, + 0x8e, 0xc6, 0x63, 0xb2, 0x6d, 0x8b, 0x07, 0x78, 0xb8, 0xda, 0x84, 0x05, 0x99, 0xeb, 0x3a, 0xa2, 0x40, 0xf0, 0xdb, + 0x2a, 0x00, 0x24, 0x47, 0x5b, 0x95, 0xe1, 0xd2, 0xd8, 0xd3, 0xf1, 0x84, 0x4a, 0xec, 0x76, 0x48, 0x6a, 0xaf, 0x42, + 0x37, 0xf3, 0xd2, 0xf7, 0x28, 0x92, 0xc6, 0x65, 0x69, 0xaf, 0x52, 0xa9, 0xf6, 0xcc, 0xdc, 0x75, 0x0d, 0x62, 0x30, + 0x84, 0xba, 0xee, 0xd2, 0xab, 0x7b, 0xbf, 0xb9, 0xd6, 0x6c, 0x07, 0xbc, 0xd7, 0xa0, 0x19, 0x4a, 0xde, 0x62, 0xde, + 0xba, 0x22, 0x6a, 0xba, 0xde, 0x80, 0x59, 0x31, 0xca, 0x96, 0xa2, 0x74, 0x43, 0x41, 0x29, 0x18, 0x5d, 0x6c, 0xbc, + 0x85, 0xfb, 0x5a, 0x36, 0x2e, 0x2c, 0x99, 0x5e, 0x2d, 0x4a, 0x4a, 0xa8, 0x6e, 0x2a, 0x46, 0x4a, 0x18, 0x29, 0x0d, + 0x4f, 0xe5, 0x7b, 0x81, 0xc7, 0x79, 0x1e, 0x44, 0x2d, 0x2f, 0xb0, 0x93, 0x8a, 0x9c, 0x80, 0xa3, 0x97, 0xc9, 0x69, + 0x28, 0xf0, 0x8f, 0x99, 0x02, 0x31, 0x1d, 0xaa, 0xfb, 0x0d, 0x6e, 0xfe, 0x7f, 0x14, 0x2c, 0xf0, 0xf8, 0xd6, 0x4b, + 0xdc, 0x46, 0xff, 0x28, 0x7c, 0x5a, 0xfa, 0x4c, 0xfa, 0xae, 0x2e, 0x9e, 0xb4, 0x37, 0x1b, 0x25, 0xab, 0x2c, 0x4f, + 0xdf, 0xc8, 0x94, 0x83, 0xc8, 0x0c, 0xad, 0x41, 0xd9, 0x4c, 0x34, 0x6e, 0x78, 0x60, 0xc4, 0xd8, 0xb8, 0xf1, 0xfd, + 0x98, 0x81, 0x6c, 0x18, 0xac, 0xbe, 0x59, 0x2a, 0x93, 0xcd, 0x15, 0x60, 0x8a, 0x28, 0xf9, 0xc9, 0x8b, 0x9c, 0xc3, + 0x53, 0xa8, 0xaf, 0x5f, 0xe0, 0x36, 0x57, 0xfa, 0x3e, 0xe7, 0x3f, 0x66, 0xf4, 0x47, 0x04, 0x3a, 0x89, 0xd7, 0x20, + 0xf7, 0x78, 0x06, 0x75, 0x23, 0x4c, 0x2d, 0xc7, 0xe0, 0x40, 0x88, 0x06, 0x22, 0x2a, 0x16, 0x28, 0xa8, 0x0b, 0x03, + 0xac, 0xa1, 0x2e, 0x98, 0xc3, 0xf3, 0x5c, 0x26, 0x1f, 0xa7, 0xc6, 0x67, 0x7e, 0x18, 0x63, 0xcc, 0xe4, 0x60, 0x10, + 0x56, 0xf3, 0x60, 0x38, 0x1e, 0x4d, 0x8e, 0x9e, 0xc2, 0xb9, 0x1d, 0x8c, 0x03, 0x32, 0x08, 0xea, 0x72, 0x1d, 0x0b, + 0x5a, 0x5e, 0x5f, 0xda, 0x32, 0xf0, 0xe3, 0x3a, 0x18, 0xfc, 0xa3, 0xf0, 0x14, 0xef, 0xa0, 0x39, 0x39, 0x93, 0x21, + 0xd8, 0xd8, 0x6f, 0x08, 0x48, 0xca, 0x7a, 0x9a, 0x9f, 0xd4, 0x87, 0x1b, 0x53, 0xda, 0x3f, 0x73, 0x78, 0xc1, 0x61, + 0x87, 0x04, 0x0a, 0xa4, 0xf1, 0x34, 0x1b, 0xbd, 0x52, 0x8a, 0xdc, 0x77, 0x05, 0x87, 0x3b, 0x73, 0xcf, 0x99, 0x1e, + 0x39, 0x85, 0x44, 0x33, 0x0b, 0xb8, 0x91, 0xbf, 0x12, 0xd7, 0x71, 0x9e, 0xa5, 0x07, 0xcd, 0x37, 0x07, 0xe5, 0x9d, + 0xa8, 0xe2, 0xdb, 0x51, 0x60, 0xac, 0x09, 0xb9, 0xaf, 0x7a, 0x02, 0xf4, 0x04, 0xd8, 0x02, 0x60, 0x40, 0xbc, 0x67, + 0x66, 0x32, 0xe7, 0x11, 0x78, 0x04, 0x36, 0x7d, 0x20, 0x8b, 0x3b, 0xe7, 0x92, 0xe4, 0x6f, 0xa6, 0xd2, 0x5e, 0xf5, + 0xca, 0xbd, 0x82, 0xac, 0x57, 0x5b, 0xb9, 0xef, 0xd6, 0x67, 0xdf, 0x74, 0x78, 0x05, 0x9e, 0x4b, 0x70, 0x8b, 0xec, + 0xf7, 0x9b, 0x82, 0x4a, 0x61, 0x54, 0xc4, 0x7b, 0xc9, 0x35, 0xfa, 0xb7, 0x7b, 0x63, 0xa3, 0x48, 0x6e, 0xf9, 0xf0, + 0x00, 0xea, 0x4c, 0xde, 0x15, 0xb7, 0x73, 0x88, 0xda, 0xba, 0x1b, 0x0f, 0xac, 0x36, 0x68, 0x97, 0xb5, 0x40, 0x70, + 0xe1, 0xe5, 0x41, 0x06, 0x63, 0x81, 0xb3, 0x32, 0x52, 0x6a, 0x5c, 0x43, 0x6a, 0xc1, 0x27, 0x79, 0x7a, 0x0f, 0x59, + 0xea, 0x49, 0x50, 0xe4, 0x78, 0x16, 0x43, 0xa6, 0xf1, 0x36, 0xf0, 0xf8, 0x9d, 0x0c, 0x41, 0x9a, 0xb6, 0xdb, 0x35, + 0x47, 0xa0, 0xec, 0x1e, 0x98, 0x92, 0xd4, 0xb5, 0x31, 0x35, 0xd0, 0x50, 0x7b, 0xa8, 0x91, 0x8a, 0x38, 0x9b, 0xbd, + 0x06, 0x1d, 0x22, 0xf8, 0x7e, 0xa7, 0x59, 0xd9, 0xf1, 0x62, 0x42, 0xf0, 0xe4, 0x7d, 0x71, 0x9b, 0x95, 0x55, 0x19, + 0xbd, 0x4f, 0xd1, 0x10, 0x2a, 0x91, 0x22, 0x7a, 0x09, 0xf1, 0xf4, 0x4a, 0xfc, 0x5d, 0x46, 0x3f, 0xa5, 0x34, 0x4e, + 0x53, 0x4c, 0x7f, 0x5e, 0xc0, 0xcf, 0x67, 0x80, 0xea, 0x88, 0x3b, 0x21, 0x3a, 0x97, 0x60, 0xaf, 0x06, 0xd1, 0xac, + 0x2a, 0x0e, 0x18, 0x9a, 0xd1, 0xad, 0xa0, 0x88, 0xd1, 0x86, 0xd9, 0x7f, 0x28, 0x50, 0x28, 0xa4, 0x8a, 0xf9, 0x4e, + 0xd8, 0x87, 0xe8, 0x47, 0x2c, 0xf2, 0xe4, 0xdd, 0x2b, 0x33, 0xa4, 0xd1, 0x9d, 0xa4, 0x7a, 0x6b, 0xe3, 0xb1, 0x85, + 0x81, 0xcb, 0xa2, 0xcb, 0x0d, 0x3d, 0x8b, 0xd7, 0x59, 0xb4, 0x05, 0xfc, 0x89, 0x77, 0xaf, 0x9e, 0x29, 0x0b, 0x93, + 0xe7, 0x19, 0x28, 0x0e, 0x4e, 0xde, 0xbd, 0x7a, 0x2d, 0xd3, 0x4d, 0xce, 0xa3, 0x33, 0x89, 0xa4, 0xf5, 0xe4, 0xdd, + 0xab, 0x9f, 0xd1, 0xdc, 0xeb, 0xa7, 0x02, 0xde, 0xbf, 0x04, 0xde, 0x32, 0x8a, 0x37, 0xd0, 0x27, 0xf5, 0x3b, 0xd9, + 0x60, 0xa7, 0xbc, 0x5a, 0xcb, 0xe8, 0x97, 0xb4, 0xf6, 0xa4, 0x55, 0xff, 0x2c, 0x7c, 0x6a, 0xe7, 0x09, 0x78, 0x6e, + 0xf3, 0x4c, 0x7c, 0x8c, 0xac, 0x68, 0x27, 0x88, 0xbe, 0x3c, 0xb8, 0xbd, 0xca, 0x45, 0x19, 0xe1, 0x0b, 0x86, 0x76, + 0x41, 0xd1, 0xe1, 0xe1, 0xcd, 0xcd, 0xcd, 0xe8, 0xe6, 0xab, 0x91, 0x2c, 0x2e, 0x0f, 0x27, 0xdf, 0x7e, 0xfb, 0xed, + 0x21, 0xbe, 0x0d, 0xbe, 0x6c, 0xbb, 0xbd, 0x57, 0x84, 0x0f, 0x58, 0x80, 0x08, 0xd5, 0x5f, 0xc2, 0x15, 0x05, 0xb4, + 0x70, 0x83, 0x2f, 0x83, 0x2f, 0xf5, 0xa1, 0xf3, 0xe5, 0x71, 0x79, 0x7d, 0xa9, 0xca, 0xef, 0x2a, 0xf9, 0x68, 0x3c, + 0x1e, 0x1f, 0x82, 0x04, 0xea, 0xcb, 0x01, 0x1f, 0x04, 0xb3, 0x60, 0x90, 0xc1, 0x85, 0xa6, 0xbc, 0xbe, 0x9c, 0x05, + 0x9e, 0x69, 0x6e, 0x83, 0x45, 0x74, 0x20, 0x2e, 0xc1, 0xe1, 0x25, 0x0d, 0xbe, 0x0c, 0x88, 0x4b, 0xf9, 0x02, 0x52, + 0xbe, 0x38, 0x7a, 0xea, 0xa7, 0xfd, 0x2f, 0x95, 0xf6, 0x95, 0x9f, 0x76, 0x8c, 0x69, 0x5f, 0x3d, 0xf3, 0xd3, 0x66, + 0x2a, 0xed, 0x85, 0x9f, 0xf6, 0xbf, 0xcb, 0x01, 0xa4, 0x1e, 0xf8, 0xd6, 0x7f, 0xe7, 0x5e, 0x6b, 0xf0, 0x14, 0x8a, + 0xb2, 0xab, 0xf8, 0x92, 0x43, 0xa3, 0x07, 0xb7, 0x57, 0x39, 0x0d, 0x06, 0xd8, 0x5e, 0xcf, 0x24, 0xc4, 0xfb, 0xe0, + 0xcb, 0x4d, 0x91, 0x87, 0xc1, 0x97, 0x03, 0x2c, 0x64, 0xf0, 0x65, 0x40, 0xbe, 0x34, 0x06, 0x32, 0x82, 0x6d, 0x03, + 0x17, 0x8a, 0x74, 0x68, 0x03, 0x84, 0xf9, 0xd2, 0xb8, 0x9a, 0xfe, 0x59, 0x74, 0x67, 0xc3, 0x5b, 0xa2, 0x72, 0xd3, + 0x0d, 0x6a, 0xfa, 0x16, 0xbc, 0x13, 0xa0, 0x51, 0x51, 0x70, 0x1d, 0x17, 0xe1, 0x70, 0x58, 0x5e, 0x5f, 0x12, 0xb0, + 0xcb, 0x5c, 0xf3, 0xb8, 0x8a, 0x02, 0x21, 0x87, 0xea, 0x67, 0xa0, 0x22, 0x5f, 0x05, 0x08, 0x88, 0x04, 0xff, 0x05, + 0x35, 0x7d, 0x27, 0xd9, 0x36, 0x18, 0xde, 0xf0, 0xf3, 0x8f, 0x59, 0x35, 0x54, 0xa2, 0xc5, 0x6b, 0x41, 0xe1, 0x07, + 0xfc, 0x75, 0x55, 0x47, 0x7f, 0x82, 0x1b, 0x77, 0x53, 0xc3, 0xfe, 0x4e, 0x3a, 0x16, 0xf5, 0x9d, 0x5c, 0x64, 0xcb, + 0x69, 0xeb, 0x40, 0x7f, 0x2b, 0x49, 0xb5, 0xc8, 0x06, 0xc1, 0x30, 0x18, 0xf0, 0x25, 0x7b, 0x2b, 0x17, 0xdc, 0x33, + 0x9f, 0x7a, 0x24, 0xfd, 0x69, 0x9e, 0x67, 0x03, 0xf0, 0x4d, 0x41, 0x7e, 0xe4, 0xf0, 0xbf, 0x17, 0x43, 0x14, 0x1e, + 0x0e, 0x1e, 0x1d, 0x92, 0x79, 0xb0, 0xbe, 0x45, 0x8f, 0xce, 0x28, 0xc8, 0xc4, 0x8a, 0x17, 0x59, 0xe5, 0x2d, 0x95, + 0xbb, 0x4d, 0xdb, 0xcb, 0xe3, 0xde, 0xb3, 0x79, 0x1d, 0x8b, 0x40, 0x9d, 0x73, 0xa0, 0x78, 0x43, 0xd9, 0x53, 0xd9, + 0x94, 0x90, 0x6a, 0x43, 0xde, 0xb0, 0x1c, 0xb0, 0xe0, 0xb8, 0x37, 0x1c, 0x1e, 0x04, 0x03, 0xa7, 0xce, 0x1d, 0x04, + 0x07, 0xc3, 0xe1, 0x2c, 0x70, 0xf7, 0xa1, 0x6c, 0xe4, 0xee, 0x8c, 0xb4, 0x60, 0xff, 0x2c, 0xc2, 0x92, 0x82, 0x78, + 0x4c, 0x6a, 0xf1, 0x97, 0x06, 0x97, 0x19, 0x00, 0xf4, 0x91, 0x92, 0x80, 0x19, 0x58, 0x99, 0x01, 0x84, 0xe6, 0xa6, + 0x31, 0x3b, 0x03, 0xe6, 0x11, 0x38, 0xe6, 0x11, 0x32, 0x0e, 0x80, 0x58, 0x12, 0xe0, 0xdc, 0x05, 0x51, 0xac, 0x0b, + 0x79, 0x04, 0xa0, 0xf7, 0xf8, 0x93, 0x98, 0x52, 0x30, 0x49, 0xc7, 0x2a, 0x04, 0x41, 0x1c, 0x9f, 0x5f, 0x8b, 0xd6, + 0xe4, 0xac, 0xd0, 0xc1, 0x8c, 0x24, 0xc0, 0x86, 0x18, 0xd8, 0x39, 0xb8, 0x9f, 0x83, 0xd2, 0xc3, 0xea, 0x9d, 0x90, + 0x0b, 0xbe, 0xe3, 0x9e, 0x6c, 0x16, 0xae, 0x9e, 0x70, 0x10, 0xdc, 0x71, 0xcd, 0x02, 0x8c, 0xaa, 0x62, 0x53, 0x56, + 0x3c, 0xfd, 0x70, 0xb7, 0x86, 0xd8, 0x77, 0x38, 0xa0, 0xef, 0x64, 0x9e, 0x25, 0x77, 0xa1, 0xb3, 0xe7, 0xda, 0xaa, + 0xf4, 0x1f, 0x3e, 0xbc, 0xfe, 0x29, 0x02, 0x91, 0x63, 0x6d, 0x28, 0xfd, 0x1d, 0xc7, 0xb3, 0xc9, 0x8f, 0xf0, 0xe4, + 0x6f, 0xec, 0x3b, 0x6e, 0x4f, 0x8f, 0x7e, 0x1f, 0xea, 0xa6, 0x77, 0x7c, 0x7e, 0xc7, 0x47, 0xae, 0x38, 0x54, 0x57, + 0xb8, 0xaf, 0x6f, 0x36, 0xbe, 0x11, 0xd2, 0xc3, 0xf3, 0x4c, 0x79, 0x63, 0x7e, 0xb4, 0x83, 0x61, 0x10, 0x4c, 0xb5, + 0x50, 0x12, 0xa2, 0x6e, 0x30, 0x25, 0x60, 0x88, 0x0e, 0xf4, 0xb2, 0x9a, 0x22, 0xe7, 0xa6, 0x46, 0x16, 0xde, 0x0f, + 0x98, 0x16, 0x3a, 0x34, 0x72, 0x28, 0x3f, 0x38, 0x9c, 0x30, 0x66, 0xe1, 0xb7, 0x4a, 0x98, 0x7e, 0xb5, 0xa8, 0x9c, + 0x83, 0xe8, 0x01, 0x18, 0xe3, 0x0a, 0x5e, 0x40, 0x57, 0xd8, 0xf5, 0x46, 0x45, 0xc5, 0x40, 0xf0, 0x38, 0xe4, 0x00, + 0x3d, 0xec, 0x82, 0x96, 0x95, 0xa5, 0xba, 0x55, 0x39, 0x4b, 0x15, 0x75, 0x19, 0xca, 0xca, 0x58, 0x61, 0xbe, 0x97, + 0xec, 0x87, 0x02, 0x3d, 0xcb, 0xa7, 0xa2, 0x0b, 0x5e, 0x08, 0x25, 0x58, 0xae, 0xeb, 0x9d, 0x08, 0x44, 0x9d, 0x1f, + 0x7a, 0x57, 0x7d, 0x8d, 0x63, 0xc7, 0xd3, 0xd7, 0x32, 0xe5, 0xda, 0x84, 0x42, 0xf3, 0xf9, 0xd2, 0x57, 0x4c, 0x14, + 0xec, 0x06, 0xfa, 0xd5, 0xb6, 0xd1, 0x67, 0x77, 0x1b, 0xbd, 0x19, 0x94, 0xe8, 0x98, 0xd7, 0x28, 0xb8, 0x56, 0x0a, + 0x05, 0xa3, 0xbd, 0x8d, 0x3f, 0xc1, 0x91, 0x5b, 0xdd, 0x1e, 0x7a, 0xbf, 0x55, 0xf1, 0xe5, 0x1b, 0xf4, 0xed, 0xb4, + 0x3f, 0x47, 0x95, 0xfc, 0x65, 0xbd, 0x06, 0x1f, 0x2a, 0x88, 0x2c, 0x62, 0x71, 0x69, 0xa1, 0x9e, 0xd3, 0x77, 0x27, + 0x6f, 0xc0, 0x8f, 0x12, 0x7f, 0xff, 0xfa, 0x7d, 0x50, 0x93, 0x69, 0x3c, 0x2f, 0xcc, 0x87, 0x36, 0x07, 0x84, 0x26, + 0x71, 0x69, 0xf6, 0xfd, 0x3c, 0x6e, 0xb2, 0xef, 0x9a, 0xad, 0xa7, 0x45, 0x13, 0x49, 0xca, 0x70, 0xfb, 0x60, 0x40, + 0xa0, 0x0f, 0x10, 0xc5, 0xd9, 0x17, 0x34, 0x86, 0x34, 0x9f, 0xd9, 0xf7, 0x23, 0xe2, 0xbd, 0xd8, 0x0b, 0x21, 0xc6, + 0x15, 0x16, 0x8d, 0x1e, 0xf2, 0x39, 0x8f, 0x94, 0x61, 0xd1, 0x7b, 0x4c, 0x20, 0xce, 0x70, 0x5a, 0xbd, 0x47, 0xcc, + 0x63, 0xbc, 0x1b, 0x68, 0xd9, 0x43, 0x94, 0x51, 0x97, 0xbd, 0x61, 0xf1, 0xfd, 0x71, 0x13, 0x66, 0xd6, 0xf2, 0x72, + 0x08, 0x7f, 0x03, 0x6d, 0x00, 0x4e, 0x39, 0xb2, 0x7c, 0x95, 0xd9, 0xe8, 0x6a, 0x89, 0xe9, 0x4d, 0x04, 0xb1, 0x78, + 0x74, 0x3a, 0xac, 0x5d, 0x9d, 0xaa, 0x77, 0xb5, 0xf3, 0x99, 0xe8, 0x55, 0xa0, 0x95, 0x6b, 0xdb, 0xe3, 0x21, 0xdc, + 0xa5, 0x96, 0x56, 0xd8, 0x88, 0x72, 0x2e, 0x9e, 0xee, 0x02, 0x9b, 0x13, 0xd0, 0xe0, 0x4a, 0xa6, 0x00, 0x9c, 0xa5, + 0xd5, 0x68, 0xd4, 0x08, 0xfb, 0xac, 0x9c, 0xcf, 0x61, 0x6b, 0x21, 0x9e, 0x16, 0x80, 0xe1, 0x36, 0x31, 0x28, 0x79, + 0x37, 0x06, 0xe5, 0xf4, 0xa3, 0x82, 0xb7, 0x0e, 0xce, 0xca, 0x55, 0x9c, 0xca, 0x1b, 0xc0, 0x62, 0x0c, 0xfc, 0x54, + 0x2c, 0xd5, 0x4b, 0x48, 0x56, 0x3c, 0xf9, 0x88, 0x56, 0x1b, 0x69, 0x00, 0x5c, 0xe5, 0xd4, 0x58, 0xee, 0x29, 0x90, + 0x50, 0x57, 0x8a, 0x4a, 0x88, 0xab, 0x2a, 0x4e, 0x56, 0xa7, 0x98, 0x1a, 0x6e, 0xa1, 0x17, 0x51, 0x20, 0xd7, 0x5c, + 0x00, 0x49, 0xcf, 0xd9, 0xbf, 0x32, 0x8d, 0x35, 0xfe, 0x4c, 0xa2, 0x80, 0x49, 0xa3, 0x06, 0x63, 0xa5, 0xec, 0x85, + 0x34, 0xd1, 0xde, 0x82, 0xa0, 0x76, 0x2f, 0xff, 0x84, 0xba, 0x9f, 0x41, 0x2b, 0xc2, 0x06, 0x18, 0xa2, 0x3c, 0xc7, + 0x1d, 0x9a, 0xda, 0x25, 0xe7, 0x01, 0x23, 0x3a, 0xef, 0xb3, 0xda, 0x6e, 0xf5, 0x67, 0x2b, 0xc0, 0x36, 0x4d, 0x8d, + 0x4f, 0x61, 0x98, 0x10, 0x13, 0x1b, 0xd8, 0x2a, 0x2b, 0xed, 0x86, 0x32, 0xed, 0xa4, 0x2b, 0xe6, 0xb5, 0x70, 0x9a, + 0xf7, 0x18, 0x5b, 0x8d, 0x54, 0xee, 0x7e, 0x3f, 0x34, 0x3f, 0x59, 0x4e, 0x9f, 0xe9, 0x90, 0xcd, 0xde, 0x78, 0xd0, + 0x9c, 0x68, 0x75, 0x55, 0x47, 0x3f, 0xa0, 0x03, 0x30, 0xd3, 0x16, 0x20, 0xd3, 0x05, 0x9b, 0xf6, 0x95, 0xa8, 0xb8, + 0x24, 0x61, 0xa9, 0x24, 0xb0, 0xb3, 0x9b, 0x92, 0x9d, 0x6d, 0x40, 0x3c, 0xc3, 0x5d, 0x4f, 0x8b, 0x9d, 0x90, 0x26, + 0xbc, 0xc5, 0x41, 0x02, 0xa2, 0x0e, 0x55, 0x5d, 0x42, 0xb6, 0xc6, 0xd0, 0xc5, 0xbf, 0x28, 0x85, 0x09, 0x6b, 0x99, + 0x54, 0x25, 0x26, 0x08, 0x52, 0xb9, 0xdf, 0x22, 0xb0, 0x44, 0xc1, 0x0e, 0x60, 0xef, 0xdd, 0xa8, 0x9b, 0x51, 0x53, + 0xd5, 0xa9, 0x97, 0xe0, 0xe3, 0x34, 0xef, 0x2a, 0xc8, 0x2c, 0xec, 0xaa, 0xd8, 0xf0, 0x40, 0xc7, 0xa6, 0x52, 0xc6, + 0xc4, 0x5d, 0x5a, 0x64, 0x88, 0x07, 0x8c, 0xb1, 0x74, 0x21, 0x90, 0x6f, 0xb6, 0x3f, 0x6e, 0x7a, 0x82, 0xd0, 0x4f, + 0xd8, 0x50, 0x02, 0x37, 0x9d, 0xed, 0xa9, 0x69, 0xe6, 0x03, 0x22, 0x0e, 0x03, 0x0a, 0x24, 0x1b, 0x87, 0x34, 0x47, + 0xfa, 0x82, 0xa4, 0x09, 0x03, 0x43, 0x2b, 0x9e, 0x13, 0x64, 0x45, 0xa1, 0x67, 0xeb, 0xaa, 0x8d, 0x73, 0x65, 0x98, + 0xa3, 0x25, 0xa7, 0xc2, 0xe7, 0x04, 0x99, 0xd8, 0x3d, 0x6d, 0x33, 0x93, 0xe1, 0x28, 0x59, 0x60, 0x7e, 0x05, 0x51, + 0xe2, 0xce, 0x34, 0xab, 0x72, 0x30, 0x2e, 0x60, 0x81, 0x56, 0xbe, 0x07, 0x75, 0x63, 0x0d, 0x6d, 0x35, 0x0c, 0xb1, + 0xdb, 0x9f, 0x60, 0xbf, 0xd6, 0x4e, 0xeb, 0x32, 0xc5, 0xf2, 0x32, 0x85, 0x68, 0x2f, 0x64, 0x7e, 0xa3, 0x48, 0x74, + 0xaf, 0x08, 0x43, 0xc2, 0x3a, 0xca, 0x9e, 0xb4, 0xa9, 0x01, 0xf4, 0xd4, 0x0b, 0x78, 0xde, 0xb9, 0x96, 0x61, 0x17, + 0xe9, 0xfe, 0xaa, 0xe0, 0x53, 0xba, 0x41, 0x90, 0xa2, 0x37, 0x29, 0x98, 0xf3, 0x7a, 0x94, 0xd4, 0x9b, 0xd3, 0x96, + 0x19, 0x55, 0x47, 0x45, 0x48, 0x39, 0xc1, 0x7f, 0xf2, 0x52, 0x6a, 0x62, 0x13, 0x26, 0x78, 0xe0, 0xc3, 0x3c, 0xc3, + 0x06, 0xde, 0xed, 0xde, 0xa5, 0x61, 0xd2, 0x66, 0x1b, 0x52, 0x90, 0x56, 0x98, 0xb8, 0x18, 0x50, 0xd9, 0x2b, 0xdc, + 0x2f, 0xd8, 0x4e, 0x9a, 0x82, 0x07, 0x61, 0xa3, 0x81, 0x89, 0x5b, 0x5d, 0x7c, 0x13, 0x26, 0x34, 0x5c, 0x51, 0xed, + 0xec, 0xa4, 0x25, 0xcd, 0xed, 0x75, 0x79, 0x61, 0xfb, 0xa0, 0x63, 0x87, 0x75, 0x0d, 0x0f, 0x34, 0xaf, 0xd9, 0xc5, + 0x35, 0xd3, 0x34, 0xd1, 0x58, 0x0f, 0x29, 0x4b, 0x8e, 0x4d, 0x3d, 0x5d, 0xe3, 0x6a, 0x99, 0x6b, 0x60, 0x77, 0x89, + 0x17, 0x7a, 0xc0, 0xc3, 0x0e, 0xd7, 0x24, 0xba, 0xc0, 0x66, 0xb3, 0x75, 0x4d, 0xa6, 0xf9, 0x7d, 0xd9, 0x72, 0x13, + 0x10, 0xce, 0x52, 0xdf, 0xdc, 0x27, 0xc7, 0x9a, 0xb6, 0xf9, 0x49, 0x80, 0xe3, 0xed, 0x15, 0x90, 0x74, 0x2c, 0x41, + 0x17, 0xdf, 0xd2, 0x1f, 0x44, 0x6a, 0xa6, 0x82, 0xde, 0x3b, 0x5f, 0xa4, 0x6e, 0x7e, 0x01, 0xb6, 0x51, 0x5b, 0x63, + 0x9a, 0x95, 0x6d, 0xc2, 0x44, 0x59, 0x58, 0x23, 0x0b, 0xb9, 0x02, 0x1f, 0xcc, 0xfd, 0xa6, 0x4e, 0x4f, 0x3a, 0x88, + 0xb0, 0xdf, 0x45, 0x8f, 0x47, 0x18, 0x2b, 0xd6, 0x20, 0x31, 0xac, 0xc2, 0x86, 0x36, 0x97, 0x43, 0x94, 0x53, 0xb3, + 0x64, 0xa2, 0x15, 0xf5, 0x29, 0x45, 0x94, 0x82, 0xb9, 0xf1, 0xb4, 0x6c, 0x98, 0x12, 0x22, 0x64, 0x85, 0x74, 0x40, + 0xb5, 0x16, 0x5a, 0xaa, 0x09, 0x7a, 0x1d, 0x7a, 0x59, 0x68, 0x4c, 0x41, 0xf4, 0x11, 0x19, 0x6e, 0xc4, 0x91, 0xd1, + 0xfd, 0x31, 0x8a, 0x09, 0x84, 0xaa, 0xf6, 0xf2, 0xc2, 0xea, 0xd3, 0xb2, 0xad, 0x0e, 0xe2, 0x0a, 0x91, 0xef, 0xbb, + 0x09, 0x6a, 0x8c, 0x82, 0x36, 0xa7, 0x1b, 0xfd, 0xa5, 0x08, 0x7d, 0xbb, 0x70, 0xec, 0x46, 0x41, 0x24, 0x44, 0x60, + 0xf5, 0x9a, 0x8a, 0x01, 0x59, 0x17, 0xb1, 0x8b, 0xd0, 0xa4, 0xbb, 0x85, 0x28, 0x6f, 0x54, 0xd6, 0x1f, 0x37, 0x21, + 0xd9, 0xed, 0xb0, 0x2c, 0xf0, 0x65, 0x3f, 0xdd, 0xdc, 0x03, 0xf9, 0xfd, 0x7a, 0xf3, 0x49, 0xc8, 0xef, 0x57, 0xd9, + 0xe7, 0x40, 0x7e, 0xbf, 0xde, 0xfc, 0x4f, 0x43, 0x7e, 0x9f, 0x6e, 0x3c, 0xc8, 0x6f, 0x35, 0x18, 0xbf, 0x15, 0x2c, + 0x78, 0xfb, 0x26, 0xa0, 0xcf, 0x25, 0x0b, 0xde, 0xbe, 0x7c, 0xe9, 0x1b, 0x81, 0x08, 0x8d, 0x5c, 0x6f, 0x64, 0xc1, + 0x88, 0xdb, 0x02, 0xaf, 0x50, 0xeb, 0xe4, 0x03, 0x15, 0x65, 0x00, 0xbc, 0x5e, 0xfe, 0x23, 0xab, 0x56, 0x61, 0x70, + 0x18, 0x90, 0xb9, 0x83, 0x04, 0x1d, 0x4e, 0xe0, 0xf6, 0x86, 0x46, 0x96, 0xd5, 0x67, 0xc1, 0x87, 0x8f, 0x46, 0xa3, + 0xb8, 0xb8, 0xc4, 0x4b, 0x9d, 0xd9, 0x48, 0x08, 0x78, 0x9c, 0xf1, 0xd2, 0x86, 0x88, 0x58, 0xc5, 0xe5, 0x99, 0x8e, + 0xcd, 0x52, 0xda, 0xad, 0x08, 0x11, 0xe7, 0xcf, 0x00, 0xa7, 0xde, 0xee, 0xcd, 0x18, 0xfb, 0xa1, 0x38, 0x62, 0x1d, + 0x40, 0xf6, 0xd9, 0x46, 0xbf, 0x3b, 0x8f, 0x4b, 0xfe, 0x2e, 0xae, 0x56, 0x0c, 0x7a, 0x09, 0x77, 0x11, 0xc1, 0x93, + 0xca, 0x63, 0x9b, 0x14, 0x50, 0x79, 0xa6, 0x81, 0xca, 0x3b, 0xde, 0xd3, 0xd0, 0x0e, 0x8b, 0xf6, 0x01, 0x36, 0xd2, + 0xe5, 0x0c, 0x8c, 0x16, 0x5f, 0x5c, 0x73, 0x51, 0xfd, 0x04, 0x78, 0xea, 0x82, 0x17, 0x70, 0x4b, 0x40, 0x2e, 0xb6, + 0xe1, 0x84, 0x40, 0x85, 0xef, 0xd9, 0xa1, 0xa2, 0xc6, 0x18, 0xd1, 0x44, 0xa3, 0xdf, 0x78, 0x13, 0x42, 0xef, 0x4e, + 0xd0, 0x15, 0x61, 0x24, 0xbc, 0x3f, 0x37, 0xfc, 0x2c, 0x03, 0xf3, 0x79, 0x01, 0x50, 0x1a, 0x08, 0x87, 0xca, 0x94, + 0xdc, 0x02, 0x13, 0xb6, 0xc6, 0x5c, 0x29, 0x4b, 0x3d, 0xa4, 0x52, 0xaa, 0xe0, 0x74, 0x05, 0x4d, 0x25, 0xe0, 0x70, + 0x47, 0x12, 0xc0, 0x4c, 0x6d, 0x61, 0x10, 0xdd, 0x36, 0xa5, 0x59, 0x1a, 0x39, 0x45, 0x9a, 0xc3, 0x27, 0xa5, 0x0a, + 0x74, 0xfa, 0x2c, 0x89, 0x2b, 0x7e, 0x29, 0x0b, 0x08, 0x85, 0xdb, 0x4a, 0xa1, 0x48, 0xbf, 0xcf, 0xc4, 0xe6, 0x8a, + 0x17, 0x59, 0x72, 0xb6, 0xca, 0xca, 0x0a, 0xf2, 0x2d, 0xf4, 0xe9, 0xb7, 0xac, 0xa7, 0x05, 0xce, 0x9b, 0x9a, 0x14, + 0x66, 0xe6, 0xf1, 0x44, 0xed, 0x74, 0x50, 0xaf, 0x7a, 0xaf, 0x0d, 0xf6, 0x7b, 0x73, 0xa2, 0xc7, 0xad, 0xf5, 0x60, + 0x35, 0xa9, 0xcd, 0x54, 0x05, 0x71, 0x04, 0xd4, 0x81, 0xcd, 0x70, 0x16, 0x53, 0xba, 0xb1, 0x08, 0x2a, 0x60, 0xed, + 0x80, 0x39, 0x32, 0x71, 0x79, 0x76, 0xa3, 0xe4, 0x27, 0x3d, 0x45, 0x61, 0xd2, 0x28, 0x56, 0xc8, 0x3e, 0x2b, 0x16, + 0x6e, 0x58, 0x72, 0x4f, 0xae, 0x4d, 0x94, 0x34, 0x30, 0xba, 0xe2, 0xf6, 0x40, 0x1c, 0x27, 0xed, 0x94, 0xf9, 0x70, + 0x12, 0xed, 0x65, 0x03, 0xe6, 0xa0, 0x9d, 0x0f, 0xae, 0xaa, 0xab, 0xb9, 0x6a, 0xc5, 0xa8, 0x92, 0x3f, 0xc9, 0x1b, + 0x73, 0xb1, 0x3d, 0x4e, 0x3a, 0x12, 0xa1, 0xdc, 0x49, 0x94, 0x1f, 0xaf, 0xd4, 0x0f, 0x80, 0x5e, 0xd1, 0xe4, 0xf0, + 0xcf, 0x0d, 0x37, 0xe0, 0xf4, 0xa1, 0xf6, 0x10, 0x74, 0xa2, 0x7c, 0x3d, 0x23, 0x9e, 0x51, 0x9d, 0x5e, 0x2e, 0x0b, + 0x30, 0xe8, 0xf2, 0x87, 0x12, 0x22, 0xc8, 0x74, 0x4e, 0xeb, 0x72, 0xaa, 0xcd, 0x8b, 0x0d, 0x6f, 0x43, 0x3f, 0xef, + 0x3b, 0x0d, 0x9c, 0x9b, 0xf0, 0x70, 0xf8, 0x74, 0x4c, 0x6a, 0x6d, 0xeb, 0x8e, 0x0b, 0xcf, 0xfe, 0x56, 0x8b, 0xd3, + 0x3d, 0xdb, 0x05, 0x4a, 0x9b, 0x5e, 0x0a, 0xed, 0x1a, 0xa9, 0xb8, 0xa7, 0xfb, 0x35, 0xa9, 0xdd, 0x42, 0xb3, 0x92, + 0xa7, 0xdf, 0xd5, 0x69, 0x77, 0xf6, 0x68, 0x9b, 0xe9, 0x2a, 0xeb, 0xdf, 0x33, 0x1b, 0xa7, 0xae, 0x41, 0x39, 0x6a, + 0xbd, 0x04, 0x7d, 0x98, 0xb8, 0x8e, 0x6c, 0x7a, 0x3a, 0x59, 0xd6, 0x49, 0x7e, 0x46, 0xea, 0x91, 0xab, 0xb0, 0x5d, + 0xdd, 0x59, 0xf8, 0x2d, 0x4f, 0xc2, 0xae, 0x86, 0xa9, 0x9b, 0x81, 0xe9, 0x02, 0x22, 0x67, 0x82, 0x3e, 0x20, 0xfc, + 0xfd, 0xd1, 0xb6, 0x49, 0xce, 0xea, 0x43, 0xef, 0x33, 0xfc, 0x9d, 0xa5, 0xf0, 0xb7, 0xaa, 0x7f, 0xa7, 0xdb, 0x2b, + 0x5e, 0xad, 0x64, 0x1a, 0x05, 0xef, 0xde, 0x9e, 0x7e, 0x08, 0x34, 0x22, 0x3b, 0xde, 0x4b, 0x8c, 0x26, 0xda, 0x60, + 0x3f, 0x81, 0x66, 0x26, 0x97, 0x97, 0x08, 0x4a, 0xa8, 0x51, 0xed, 0x4f, 0x57, 0xf2, 0xe6, 0x24, 0xcf, 0x7d, 0xe6, + 0xd9, 0x10, 0x5c, 0xcd, 0x4f, 0x36, 0xa8, 0x55, 0x08, 0x32, 0xc0, 0x51, 0x56, 0x9e, 0x69, 0xad, 0x4d, 0x7a, 0x76, + 0x7e, 0x77, 0xa6, 0x25, 0x43, 0x16, 0x15, 0xf2, 0xd9, 0xef, 0xc7, 0x69, 0x76, 0x7d, 0x80, 0xa7, 0x02, 0x0b, 0xc0, + 0xa4, 0x3e, 0xe7, 0xe7, 0x9b, 0xaa, 0x92, 0x62, 0x58, 0xc8, 0x9b, 0x60, 0x76, 0xac, 0x1e, 0x4c, 0x86, 0x58, 0x3d, + 0x06, 0x07, 0xff, 0x95, 0xe4, 0x59, 0xf2, 0x91, 0x05, 0x8f, 0xb6, 0x19, 0x9b, 0xb5, 0x68, 0xff, 0xb8, 0x0e, 0x66, + 0xd0, 0xd6, 0x83, 0x93, 0x3c, 0x3f, 0x3e, 0x54, 0x5f, 0xcc, 0x8e, 0x0f, 0xd3, 0xec, 0x7a, 0xe6, 0x01, 0xf4, 0x3b, + 0x7b, 0x5b, 0x84, 0x42, 0x73, 0xf7, 0x69, 0x70, 0xac, 0x4d, 0x78, 0x68, 0x39, 0x10, 0x90, 0xe2, 0x98, 0xf0, 0x26, + 0x28, 0xf9, 0x09, 0x63, 0x38, 0x6f, 0x77, 0xbb, 0xd0, 0x1a, 0x03, 0x25, 0x1e, 0x52, 0x4e, 0x01, 0x1c, 0x0a, 0x66, + 0xa1, 0x09, 0xa1, 0x49, 0x4d, 0x42, 0x83, 0xe7, 0x13, 0x13, 0x5a, 0xd4, 0x14, 0x8e, 0xa0, 0xd7, 0xf1, 0xda, 0x08, + 0xbf, 0xb4, 0x30, 0xc1, 0xb4, 0x7e, 0xde, 0x18, 0xc7, 0xa8, 0x3d, 0xaa, 0x06, 0x61, 0xab, 0x57, 0xde, 0x37, 0xb0, + 0x20, 0xef, 0x0c, 0x2b, 0x1a, 0xb4, 0xe8, 0x0a, 0xc8, 0x2b, 0x7d, 0x31, 0x1b, 0xa7, 0xe1, 0xa2, 0xa4, 0x72, 0x49, + 0xd8, 0x2c, 0xdc, 0x22, 0xbb, 0x5d, 0x2a, 0xea, 0x1d, 0xc9, 0xda, 0xc1, 0x5d, 0xaa, 0xd9, 0x99, 0x3d, 0xda, 0x0a, + 0x44, 0x58, 0x2c, 0xd9, 0xac, 0x39, 0x5f, 0x55, 0x7c, 0x3e, 0x5c, 0x71, 0xf0, 0xcb, 0x09, 0x0e, 0xfe, 0x2b, 0x3d, + 0xcf, 0xed, 0xa4, 0xa8, 0x15, 0xb9, 0x8a, 0x45, 0x9a, 0xf3, 0x0f, 0xf1, 0xf9, 0x0f, 0x98, 0xe7, 0xf9, 0x79, 0xfe, + 0x0c, 0x32, 0xd4, 0xc1, 0xec, 0xd1, 0x36, 0xa9, 0x46, 0x2f, 0xde, 0x7c, 0x78, 0xf5, 0xe1, 0x9f, 0x67, 0xcf, 0x4e, + 0x3e, 0xbc, 0xf8, 0xfe, 0xed, 0xfb, 0x57, 0x2f, 0x4e, 0x17, 0xd6, 0x11, 0x56, 0xe1, 0xab, 0x91, 0xe5, 0x6e, 0xe7, + 0xf2, 0xfd, 0xf2, 0xe6, 0xf9, 0x8b, 0x97, 0xaf, 0xde, 0xbc, 0x78, 0x5e, 0xab, 0xb9, 0x6c, 0x37, 0x04, 0x76, 0x68, + 0x9c, 0x09, 0x5e, 0x40, 0xf1, 0x3a, 0xca, 0x23, 0x36, 0x5b, 0xc3, 0x02, 0x36, 0x9b, 0xae, 0x23, 0x28, 0xc0, 0x22, + 0x3b, 0xd0, 0x9b, 0x05, 0x1a, 0x2e, 0xcd, 0xc6, 0xf1, 0x97, 0x98, 0xdf, 0x9b, 0x17, 0xf8, 0xdd, 0x7b, 0x79, 0x63, + 0xba, 0xa2, 0x47, 0x48, 0x21, 0x7e, 0xcd, 0x9f, 0xfd, 0x7e, 0xec, 0x4b, 0xd9, 0x50, 0x14, 0xa1, 0xca, 0x85, 0x5f, + 0x75, 0x70, 0xa0, 0x2d, 0xfe, 0x02, 0x08, 0x58, 0x11, 0xcc, 0x8e, 0x0f, 0xfd, 0xdc, 0xb3, 0xdf, 0xa3, 0x9f, 0xbc, + 0xce, 0x61, 0xa9, 0x30, 0x0e, 0xcd, 0xb4, 0xbd, 0x53, 0x11, 0x42, 0x2a, 0xb9, 0x73, 0x53, 0xad, 0x20, 0x43, 0xae, + 0x24, 0x89, 0xec, 0x24, 0x2a, 0x4b, 0x16, 0x53, 0xda, 0xef, 0xfa, 0xaf, 0xeb, 0x33, 0x4a, 0x06, 0xb8, 0x28, 0x65, + 0x11, 0x40, 0x3f, 0xda, 0x71, 0x26, 0x0e, 0xbc, 0x78, 0x2e, 0xd8, 0xa3, 0x4e, 0xf2, 0x0e, 0x23, 0x72, 0xd8, 0xfe, + 0xd4, 0xeb, 0xd8, 0xef, 0xc4, 0xfd, 0xf8, 0x3f, 0xcd, 0x3d, 0xeb, 0x76, 0xdb, 0x36, 0xd2, 0xff, 0xfb, 0x14, 0x0c, + 0x93, 0x4d, 0xc5, 0x84, 0xa4, 0x49, 0xc9, 0xb2, 0x15, 0xc9, 0xb2, 0xdb, 0xe6, 0x72, 0x36, 0xfb, 0xb9, 0x4d, 0x4f, + 0xe2, 0xe6, 0xdb, 0xad, 0xeb, 0x63, 0x51, 0x12, 0x24, 0x71, 0x43, 0x91, 0x3a, 0x24, 0xe5, 0x4b, 0x15, 0xee, 0xb3, + 0xec, 0x23, 0x7c, 0xcf, 0xd0, 0x27, 0xfb, 0xce, 0xcc, 0x00, 0x20, 0x78, 0x93, 0x94, 0x26, 0xed, 0xee, 0x69, 0x93, + 0x88, 0xb8, 0x63, 0x00, 0x0c, 0x06, 0x73, 0xd5, 0xf8, 0x64, 0x4a, 0xe8, 0x45, 0x0e, 0xb0, 0x39, 0x1e, 0xc8, 0xe5, + 0x1b, 0xdf, 0xfc, 0xdf, 0xc8, 0x9c, 0x7b, 0xe6, 0xd2, 0x33, 0xdf, 0x85, 0x57, 0x59, 0xed, 0xea, 0xc8, 0x58, 0x33, + 0x26, 0x1b, 0xb4, 0xc0, 0x63, 0x05, 0x7f, 0x47, 0x70, 0xea, 0xda, 0xb7, 0xb9, 0x8c, 0xed, 0xc2, 0x8b, 0xe7, 0x4c, + 0x84, 0x78, 0x11, 0xb9, 0x29, 0x87, 0x8a, 0xa1, 0x80, 0x05, 0xdc, 0xb9, 0x3c, 0xe0, 0xaa, 0x08, 0xbe, 0x3d, 0x49, + 0xe3, 0xe0, 0x7f, 0xd8, 0x3d, 0x50, 0x7b, 0x49, 0x1a, 0xad, 0x80, 0xc6, 0xf7, 0xe6, 0x9c, 0x67, 0x63, 0xb6, 0xd8, + 0x7e, 0xdd, 0x7d, 0xfc, 0xc8, 0x6c, 0xdc, 0x92, 0x40, 0x28, 0xda, 0x69, 0x34, 0x9f, 0x07, 0xac, 0xa5, 0x8b, 0xa0, + 0x23, 0xba, 0x29, 0xbb, 0x39, 0x7b, 0xe0, 0x08, 0x4f, 0x9f, 0x46, 0xd6, 0x74, 0xb4, 0xc4, 0x8c, 0x99, 0x74, 0x85, + 0x47, 0x14, 0x2f, 0xf2, 0x74, 0x6f, 0x50, 0x2c, 0xc2, 0xd7, 0x25, 0x3f, 0xba, 0xd6, 0x34, 0x5a, 0x8f, 0x03, 0x66, + 0xe1, 0x76, 0x87, 0x2e, 0x37, 0xe3, 0xf5, 0x78, 0x0c, 0xd1, 0x5d, 0x1e, 0x38, 0x26, 0xf8, 0xab, 0x89, 0x12, 0x7c, + 0x47, 0x66, 0xc6, 0x00, 0x26, 0x65, 0xa7, 0xe5, 0xe1, 0x83, 0x8e, 0x09, 0xb0, 0x88, 0xa8, 0x83, 0x14, 0xde, 0x8c, + 0x35, 0xa7, 0x76, 0xa8, 0xbf, 0x83, 0xdd, 0x97, 0xe8, 0x83, 0xba, 0xa3, 0x3f, 0xbc, 0xd4, 0xdf, 0x21, 0x8c, 0x31, + 0xea, 0xf1, 0x73, 0xda, 0xbd, 0xba, 0xa9, 0x93, 0xb0, 0x7c, 0x8d, 0xf1, 0x0f, 0x80, 0x59, 0xfc, 0xc2, 0xf7, 0xe6, + 0x61, 0x94, 0xa4, 0xfe, 0x44, 0xbf, 0x1a, 0xbc, 0xf6, 0x5b, 0x97, 0xcb, 0xb4, 0x65, 0x5c, 0x99, 0x93, 0x54, 0x0d, + 0x9d, 0x22, 0x10, 0x26, 0x46, 0x4e, 0x69, 0x2a, 0xa4, 0x9e, 0xa0, 0xad, 0x05, 0x05, 0x6a, 0xc6, 0x42, 0x93, 0x74, + 0x08, 0xe5, 0x4a, 0x71, 0x58, 0x30, 0xa0, 0x94, 0x8e, 0x35, 0x8d, 0x01, 0xbd, 0x70, 0x9e, 0xaf, 0x37, 0x78, 0x95, + 0xa7, 0xf9, 0x6d, 0x89, 0xbe, 0x83, 0x85, 0xc1, 0x0d, 0x7d, 0x3f, 0x50, 0x95, 0x45, 0x0b, 0xf7, 0xee, 0xe8, 0xdb, + 0x22, 0x5d, 0x00, 0xf7, 0x37, 0x68, 0x6a, 0x84, 0x51, 0xaa, 0x81, 0x43, 0x1c, 0xe8, 0x71, 0x54, 0x56, 0x2e, 0xe3, + 0xad, 0xb6, 0x8c, 0x8c, 0x23, 0x83, 0xef, 0xf0, 0xf2, 0x6b, 0x71, 0xb7, 0x68, 0x05, 0xcf, 0x17, 0xf4, 0xc8, 0x08, + 0x61, 0x01, 0x0b, 0x14, 0xa5, 0x82, 0xfb, 0x77, 0xde, 0xbd, 0x2d, 0x41, 0x5e, 0x8b, 0x68, 0x80, 0x2d, 0x1e, 0xd0, + 0x54, 0x10, 0x3a, 0xa5, 0x33, 0x85, 0x0a, 0x23, 0x82, 0x86, 0x49, 0x41, 0xbf, 0x0c, 0xef, 0x02, 0x40, 0x49, 0xfc, + 0x9a, 0x1e, 0x65, 0xd7, 0x22, 0xe4, 0xb2, 0x08, 0x78, 0xac, 0x5c, 0xce, 0x80, 0x5d, 0xc3, 0xd5, 0x3a, 0x45, 0x17, + 0xbd, 0x30, 0x00, 0x96, 0xe9, 0x1a, 0xba, 0xfc, 0x04, 0x2c, 0x9d, 0x93, 0x89, 0x99, 0xae, 0xf9, 0xd3, 0x6a, 0x1a, + 0x27, 0x7a, 0x01, 0x79, 0x21, 0x7e, 0x47, 0x06, 0x17, 0x7c, 0xc6, 0x7c, 0x1a, 0x13, 0x33, 0xf7, 0x6f, 0xdf, 0x9a, + 0xa0, 0x20, 0xa8, 0x06, 0x33, 0x4c, 0xa8, 0x9d, 0x41, 0x2b, 0xa8, 0x9d, 0x2c, 0xb8, 0xed, 0x2c, 0x4c, 0x73, 0xf4, + 0x68, 0x13, 0x66, 0x67, 0x8f, 0x36, 0x49, 0x36, 0x7c, 0xb4, 0xf1, 0xa4, 0x8e, 0x81, 0x7e, 0xa1, 0x93, 0x82, 0xc1, + 0x08, 0xc1, 0x30, 0xca, 0xae, 0x73, 0x8b, 0x9f, 0x7c, 0xbe, 0xb0, 0xcb, 0x28, 0x5d, 0x43, 0x91, 0xff, 0x90, 0x0b, + 0xf6, 0x57, 0xb1, 0xbf, 0xf4, 0xe2, 0x7b, 0xd2, 0x03, 0x30, 0x55, 0x65, 0x01, 0x43, 0xd7, 0x08, 0xd1, 0x13, 0x00, + 0x08, 0xe7, 0xeb, 0xda, 0x37, 0x32, 0x8d, 0xf1, 0xd9, 0x4a, 0x61, 0x28, 0xf4, 0x75, 0xad, 0x3f, 0x65, 0xf6, 0x94, + 0xa5, 0x9e, 0x1f, 0x50, 0x95, 0x81, 0x88, 0x72, 0x5f, 0x99, 0x5e, 0x52, 0x9c, 0x5e, 0x58, 0xdc, 0x3f, 0x38, 0x19, + 0xba, 0x02, 0x68, 0xdc, 0x38, 0x33, 0x8c, 0x7e, 0x55, 0xbf, 0xa2, 0x94, 0xf7, 0xa7, 0x2e, 0x07, 0x83, 0xe5, 0x08, + 0x61, 0x39, 0x58, 0x38, 0x89, 0xa6, 0xec, 0xa7, 0xb7, 0xaf, 0x65, 0xb8, 0x2d, 0xe0, 0x1c, 0x8d, 0xf8, 0xc6, 0x4c, + 0x90, 0x7e, 0x88, 0x91, 0x76, 0xa0, 0xc0, 0x58, 0x9a, 0xdc, 0x42, 0x71, 0xa6, 0x6b, 0x67, 0x34, 0x76, 0x36, 0xa5, + 0x51, 0x0f, 0x23, 0xac, 0x15, 0x67, 0x27, 0x07, 0x54, 0x9a, 0x6e, 0x3b, 0x2a, 0x04, 0x60, 0x88, 0x61, 0x86, 0x39, + 0x14, 0x20, 0x32, 0xe8, 0xd0, 0xcd, 0x1f, 0x14, 0xf6, 0x12, 0xf9, 0xf3, 0xee, 0x59, 0x91, 0x54, 0xc1, 0x5a, 0xfa, + 0xe9, 0x09, 0xc6, 0xfa, 0x82, 0xfb, 0x1a, 0xbc, 0x83, 0x9c, 0x1c, 0xd0, 0xa7, 0x56, 0x3a, 0x11, 0x79, 0x23, 0xe2, + 0x69, 0xd7, 0xe7, 0x0d, 0x7c, 0xd2, 0x51, 0x81, 0xd0, 0xf2, 0x90, 0xea, 0x65, 0xba, 0xb6, 0xe4, 0xa4, 0x11, 0x77, + 0x43, 0x04, 0x3e, 0x0a, 0x1c, 0x38, 0xbb, 0xba, 0xb6, 0xf4, 0xee, 0x70, 0xe6, 0x22, 0xc7, 0xbb, 0x6b, 0xb9, 0x3c, + 0x2b, 0x3f, 0x6b, 0x49, 0xf1, 0xac, 0x4d, 0xf8, 0xe2, 0x82, 0x01, 0x82, 0x7c, 0x91, 0x2f, 0x50, 0xb0, 0x5b, 0xb3, + 0xb8, 0x0b, 0xb1, 0xb8, 0xd3, 0x86, 0xc5, 0x9d, 0x6e, 0x59, 0xdc, 0x80, 0x2f, 0xa4, 0x26, 0x41, 0x17, 0xa3, 0x51, + 0x99, 0x04, 0x1e, 0x27, 0x34, 0xfa, 0xfc, 0x9c, 0x21, 0x9c, 0xac, 0x24, 0x00, 0xa5, 0xaa, 0x06, 0x58, 0xd5, 0xc1, + 0x45, 0x01, 0x44, 0x75, 0xe2, 0xf2, 0xd4, 0x89, 0x79, 0x43, 0xec, 0xce, 0x56, 0x50, 0x9e, 0x2f, 0xec, 0x52, 0x8a, + 0x4b, 0xde, 0x5a, 0x34, 0xcc, 0x74, 0xb1, 0x65, 0xa6, 0x93, 0xc2, 0xd1, 0xe5, 0xd3, 0xa6, 0x43, 0xa8, 0x4e, 0x0a, + 0xf6, 0x20, 0x28, 0x9a, 0xe2, 0x96, 0x29, 0xee, 0xc3, 0x66, 0x1c, 0xab, 0xec, 0xa8, 0x95, 0x97, 0x24, 0xb7, 0x51, + 0x0c, 0x92, 0x1a, 0x68, 0xe6, 0xd3, 0xb6, 0xd4, 0xd2, 0x0f, 0xb9, 0x13, 0x98, 0xc6, 0xcd, 0x94, 0xe7, 0xab, 0x5b, + 0xaa, 0xdd, 0xed, 0x52, 0x89, 0x95, 0x97, 0xa6, 0x2c, 0x46, 0xa0, 0x7b, 0xe0, 0x2d, 0xfc, 0xbf, 0x64, 0x9b, 0xd5, + 0xe0, 0x90, 0x40, 0xc1, 0xea, 0x88, 0xa1, 0x57, 0x40, 0x5b, 0xc5, 0xe2, 0x22, 0x56, 0x1c, 0xca, 0xc5, 0x12, 0xf0, + 0x3f, 0xe0, 0x71, 0x6d, 0xc5, 0x8a, 0xc9, 0x93, 0x7b, 0x64, 0xd8, 0x2b, 0x6f, 0xfa, 0x0e, 0x04, 0x82, 0xad, 0xb6, + 0x09, 0xca, 0xbd, 0xaa, 0xfb, 0xb8, 0x98, 0x88, 0xbd, 0x49, 0x8e, 0x24, 0x11, 0x4b, 0x72, 0xd5, 0x29, 0xb0, 0xba, + 0xf4, 0xac, 0xd9, 0xd5, 0xa6, 0x9d, 0x1d, 0xcc, 0x7d, 0xa3, 0x82, 0x35, 0x01, 0xb5, 0x05, 0xc3, 0x53, 0xf9, 0xe6, + 0x0a, 0x4c, 0xf7, 0xc8, 0x00, 0x8e, 0xf1, 0x25, 0xc4, 0x41, 0x75, 0xc4, 0x83, 0x76, 0x14, 0xc3, 0xad, 0x75, 0xe9, + 0x5c, 0x65, 0x8f, 0xe7, 0xf8, 0xcb, 0xbd, 0xca, 0x1e, 0x8f, 0xf1, 0x57, 0xfb, 0x0a, 0x23, 0xde, 0xd5, 0x3c, 0xe4, + 0x95, 0x39, 0xeb, 0xa7, 0x85, 0xfd, 0x44, 0x7a, 0x6b, 0x9f, 0xb0, 0x6d, 0xf8, 0x02, 0x3f, 0x7c, 0xb4, 0x49, 0xc0, + 0x52, 0x53, 0x9d, 0x43, 0x68, 0xc7, 0x46, 0x56, 0x9b, 0x3e, 0x6f, 0x48, 0x1f, 0x1b, 0x7f, 0xf2, 0xc5, 0x8f, 0xbb, + 0x24, 0xca, 0xef, 0x94, 0x22, 0x1b, 0xe2, 0x7a, 0xec, 0x87, 0x5e, 0x7c, 0x7f, 0x4d, 0xcf, 0x8b, 0x96, 0xa0, 0xdd, + 0x25, 0x7b, 0x85, 0xc8, 0xcb, 0xa2, 0x98, 0x2c, 0x55, 0x18, 0xc3, 0xf7, 0xfc, 0xa2, 0x1f, 0xfe, 0x3d, 0x56, 0xc8, + 0xb6, 0xc2, 0x03, 0x94, 0x2f, 0x48, 0xa1, 0xa3, 0xeb, 0x47, 0x9b, 0x16, 0xab, 0x36, 0x53, 0x9a, 0x6d, 0x89, 0x2e, + 0x84, 0xe5, 0xc1, 0xc7, 0xec, 0x72, 0xea, 0xf7, 0x51, 0x0e, 0x36, 0x8e, 0xee, 0xac, 0x47, 0x9b, 0xf4, 0x4c, 0x5f, + 0x7a, 0xf1, 0x07, 0x36, 0xb5, 0x26, 0x7e, 0x3c, 0x09, 0x98, 0xde, 0xd7, 0xc7, 0x81, 0x17, 0x7e, 0xe0, 0x9f, 0x56, + 0xb4, 0x4e, 0x51, 0xb2, 0xbd, 0xf3, 0xed, 0x2b, 0x60, 0x42, 0x2c, 0x3b, 0x24, 0x56, 0x6b, 0xa0, 0xa0, 0x3d, 0x97, + 0x0c, 0xaf, 0x9c, 0x50, 0xcc, 0x4b, 0x99, 0xa0, 0x98, 0x09, 0xc2, 0x76, 0xb0, 0x74, 0x35, 0x75, 0x5c, 0x2f, 0xdd, + 0x54, 0xa7, 0x4a, 0xcc, 0x4a, 0x19, 0xaa, 0xf1, 0x1a, 0x5b, 0xf8, 0xfd, 0xdd, 0x51, 0x10, 0xed, 0xfd, 0xbb, 0x93, + 0xad, 0x7c, 0xde, 0x0c, 0x21, 0xd5, 0x22, 0x0b, 0x8b, 0x4f, 0xe8, 0x9c, 0x13, 0x98, 0xcd, 0x5d, 0xab, 0x95, 0xbd, + 0x24, 0x59, 0x2f, 0xd9, 0x94, 0x24, 0x8a, 0x67, 0xf9, 0xa0, 0x8a, 0x2f, 0x0b, 0x75, 0x60, 0xbf, 0xac, 0xdb, 0xc7, + 0x87, 0xcf, 0x41, 0xd3, 0x01, 0x08, 0xca, 0x68, 0x36, 0xd3, 0xf3, 0x37, 0xfe, 0x8e, 0x6a, 0xee, 0xe1, 0x2f, 0xeb, + 0x57, 0x2f, 0x9d, 0x57, 0xb2, 0x72, 0x08, 0x84, 0xb1, 0x10, 0xdb, 0x72, 0xba, 0x58, 0x19, 0xaf, 0x98, 0xd1, 0xcc, + 0x0b, 0x9b, 0xa7, 0x73, 0x59, 0xd8, 0xe2, 0x2b, 0xc6, 0xa6, 0x40, 0x70, 0x9b, 0x95, 0xd4, 0xeb, 0x80, 0xdd, 0x30, + 0x29, 0x12, 0xae, 0x76, 0x56, 0x53, 0x03, 0x7d, 0xd6, 0x71, 0x51, 0x33, 0xa7, 0xea, 0x94, 0x29, 0x8d, 0x70, 0x0e, + 0x7c, 0xe6, 0xea, 0x11, 0x2b, 0x1d, 0xa9, 0x91, 0xa9, 0x2b, 0x03, 0x68, 0x1c, 0xd9, 0x59, 0x43, 0x7a, 0x1f, 0x03, + 0x56, 0xd7, 0x8f, 0xcd, 0x74, 0x8d, 0x3e, 0xf8, 0xf8, 0xe6, 0x70, 0x0a, 0xe0, 0xe4, 0xb5, 0x72, 0x76, 0x48, 0x13, + 0xc4, 0xea, 0x98, 0x64, 0x3a, 0x71, 0x5f, 0x84, 0x96, 0x24, 0xaa, 0x0b, 0x0b, 0x3e, 0x54, 0xed, 0xda, 0x68, 0xc5, + 0x99, 0x8f, 0x31, 0x10, 0x6c, 0xc8, 0x92, 0xa4, 0x11, 0x60, 0x72, 0xd1, 0x4d, 0x3d, 0x2f, 0x5d, 0x84, 0x47, 0x9e, + 0x6e, 0x3a, 0x26, 0x90, 0x04, 0x38, 0xc1, 0x72, 0x5f, 0x78, 0xbd, 0x5c, 0x2f, 0xb9, 0x9e, 0x4b, 0x3c, 0x1f, 0xeb, + 0x5c, 0x07, 0xa1, 0x29, 0xff, 0x56, 0xe7, 0x83, 0x2a, 0x5c, 0xd3, 0xb5, 0x43, 0x6b, 0x15, 0x50, 0x6f, 0x85, 0x5d, + 0x84, 0x0d, 0x88, 0x31, 0x95, 0xf0, 0x2b, 0x9b, 0xcd, 0xd8, 0x24, 0x4d, 0x0c, 0xc1, 0x3c, 0x92, 0x5e, 0x67, 0xc1, + 0xda, 0xe8, 0xc1, 0x50, 0xff, 0x01, 0x6c, 0xef, 0x85, 0x73, 0x26, 0x3e, 0x20, 0xf1, 0x66, 0xaa, 0x07, 0x13, 0xb5, + 0x58, 0x04, 0x11, 0xef, 0x05, 0x82, 0x8a, 0xd7, 0xa4, 0xe3, 0xd0, 0xf8, 0xfd, 0x93, 0xef, 0x8b, 0x48, 0x6a, 0xc3, + 0x6c, 0x47, 0x45, 0xdb, 0x8e, 0xef, 0xc6, 0x7d, 0xd5, 0x75, 0x9d, 0x4c, 0x37, 0xc1, 0xe6, 0xeb, 0xc3, 0xbe, 0x87, + 0x1e, 0x6b, 0x75, 0xa0, 0xd6, 0x3a, 0xfc, 0x94, 0x7a, 0x6d, 0xf7, 0x99, 0xab, 0x9b, 0xa4, 0x6a, 0xa7, 0xe0, 0xb6, + 0x49, 0x74, 0xc3, 0xe2, 0xcf, 0x9e, 0x4a, 0xb1, 0xf1, 0xfd, 0xc6, 0x73, 0xe4, 0x3a, 0x80, 0x84, 0xd3, 0x68, 0xf5, + 0x09, 0x53, 0xe8, 0xe8, 0xa6, 0x3e, 0x09, 0xa2, 0x84, 0xa9, 0x73, 0x20, 0x26, 0xc8, 0x67, 0x4e, 0xe2, 0xc7, 0xb7, + 0x2f, 0xdf, 0xbd, 0xd3, 0x4d, 0x8c, 0x20, 0x9a, 0xa8, 0xad, 0xf3, 0x0d, 0xb5, 0x03, 0xfb, 0xd7, 0xee, 0x3b, 0xba, + 0x61, 0xe8, 0x51, 0x5b, 0xdc, 0x73, 0x94, 0x56, 0xd9, 0x72, 0xfc, 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, + 0xd5, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x21, 0x65, 0xe9, 0x87, 0xd7, 0x35, 0xa9, 0xde, 0x5d, 0x4d, 0x2a, 0x3c, 0xe5, + 0x2a, 0xb8, 0x6a, 0x1d, 0x2d, 0x15, 0xd2, 0x00, 0x02, 0x40, 0xef, 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x8c, 0x41, 0x73, + 0x0f, 0xf0, 0xe5, 0x51, 0xd7, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, 0x24, 0x00, 0x45, 0x41, 0xa6, 0x4a, 0xe5, 0x8a, + 0x64, 0x23, 0x57, 0xf3, 0x1d, 0x96, 0x28, 0x74, 0xaa, 0x46, 0x02, 0x10, 0x8e, 0xdf, 0x57, 0xde, 0x14, 0xb4, 0xef, + 0xac, 0x71, 0x94, 0xa6, 0xd1, 0xb2, 0xef, 0x3a, 0xab, 0x3b, 0x5d, 0x1b, 0x08, 0xc6, 0x03, 0x57, 0x0e, 0xec, 0xff, + 0xf6, 0xef, 0x12, 0xca, 0xa5, 0xf4, 0xeb, 0x94, 0x2d, 0x57, 0x2c, 0xf6, 0xd2, 0x75, 0xcc, 0x32, 0xed, 0xb7, 0xff, + 0x7b, 0x5e, 0x7a, 0x64, 0x0f, 0xd4, 0x3a, 0x44, 0x5e, 0xab, 0x55, 0xae, 0x83, 0xe8, 0xf6, 0x41, 0x6e, 0x06, 0xb0, + 0xa3, 0xf0, 0xc2, 0x9f, 0x2f, 0x64, 0xe9, 0xb3, 0x74, 0xcb, 0xdc, 0xc4, 0xe8, 0x89, 0xe9, 0xae, 0x9d, 0x47, 0xb7, + 0xfd, 0xdf, 0xfe, 0x2d, 0x99, 0x27, 0x3b, 0x77, 0x5d, 0xfd, 0x40, 0x8b, 0x2b, 0x5a, 0x5f, 0xa6, 0xb2, 0xc4, 0x90, + 0x5f, 0x59, 0xe0, 0x4a, 0x22, 0xed, 0xca, 0xaa, 0x84, 0x6b, 0xcb, 0x9c, 0xfe, 0xea, 0xcf, 0x17, 0x9f, 0x3b, 0x29, + 0x00, 0xe8, 0xce, 0x59, 0x41, 0xa1, 0x2f, 0x30, 0xad, 0x51, 0x7f, 0xff, 0x05, 0xfb, 0xcc, 0x79, 0xed, 0x9a, 0xd2, + 0x97, 0x98, 0x0d, 0xe7, 0xa2, 0x3e, 0x1f, 0x8d, 0x64, 0x04, 0x3d, 0xb5, 0x3e, 0x18, 0x32, 0x9c, 0x55, 0x52, 0xf8, + 0x55, 0xdf, 0x77, 0x0c, 0xf2, 0x30, 0xb0, 0x07, 0x40, 0x50, 0x25, 0xaf, 0x06, 0x1c, 0xcd, 0xf8, 0x9a, 0x34, 0xeb, + 0x2b, 0x7d, 0x57, 0x90, 0x35, 0xa4, 0x62, 0xf4, 0x35, 0x29, 0x9a, 0x33, 0xeb, 0x87, 0x73, 0x1b, 0x7b, 0x2b, 0x62, + 0xd8, 0x6b, 0x28, 0x8f, 0x00, 0x06, 0x88, 0x78, 0xd1, 0x62, 0x70, 0x97, 0x37, 0x4d, 0x0a, 0x71, 0x3f, 0xee, 0x56, + 0x88, 0xbb, 0xd8, 0x4b, 0x21, 0xee, 0xc7, 0x2f, 0xae, 0x10, 0xf7, 0x46, 0x55, 0x88, 0x83, 0xb5, 0x7c, 0xc9, 0xf6, + 0xd2, 0x52, 0x13, 0xaa, 0x26, 0xd1, 0x6d, 0x32, 0x74, 0x39, 0x1d, 0x9e, 0x4c, 0x16, 0x0c, 0x18, 0x1b, 0x1c, 0xea, + 0x41, 0x34, 0x07, 0x8d, 0xb5, 0x3f, 0x5e, 0xb7, 0x2c, 0x88, 0xe6, 0xaa, 0x66, 0x59, 0xc8, 0xdd, 0xdb, 0xe6, 0x2e, + 0xab, 0x48, 0x9b, 0xcb, 0x31, 0x85, 0x83, 0x2b, 0xeb, 0xd0, 0x50, 0x42, 0x78, 0x4b, 0x55, 0xbd, 0xb6, 0xd0, 0xf7, + 0xea, 0xa3, 0xaa, 0x98, 0xac, 0xd8, 0x7e, 0x2a, 0x1c, 0x79, 0xa8, 0x2d, 0x48, 0x95, 0x68, 0x72, 0x8a, 0xb1, 0xd1, + 0x7f, 0xb9, 0x73, 0xbf, 0xbb, 0x74, 0x07, 0x1d, 0x17, 0x2c, 0xd1, 0xe1, 0x59, 0x8c, 0x09, 0xce, 0xa0, 0xd3, 0x81, + 0x84, 0x5b, 0x25, 0xa1, 0x0d, 0x09, 0xbe, 0x92, 0xd0, 0x85, 0x84, 0x89, 0x92, 0x70, 0x04, 0x09, 0x53, 0x25, 0xe1, + 0x18, 0x12, 0x6e, 0xf4, 0xec, 0x32, 0x94, 0xc3, 0x3d, 0x36, 0xae, 0x4c, 0x7a, 0x09, 0x89, 0xb4, 0x63, 0xd3, 0x05, + 0x15, 0x31, 0x6f, 0xde, 0x8f, 0x4c, 0x62, 0x89, 0xf6, 0x63, 0xf3, 0x76, 0xc1, 0xc8, 0x2b, 0xf6, 0x0b, 0xbc, 0x28, + 0xed, 0x34, 0x02, 0x25, 0x71, 0xe1, 0x6d, 0x42, 0xc0, 0x41, 0xd3, 0x0d, 0xe0, 0x72, 0x0d, 0xe4, 0xca, 0x09, 0x8f, + 0x1d, 0xca, 0x5a, 0xe6, 0x79, 0xd4, 0x9d, 0x25, 0xb7, 0x40, 0xae, 0x26, 0xd3, 0x52, 0x59, 0xa9, 0x5f, 0x42, 0x59, + 0xe2, 0x05, 0x1b, 0xaf, 0xe7, 0xda, 0x79, 0x34, 0xdf, 0xa9, 0xf7, 0xa0, 0x66, 0xc1, 0x28, 0x75, 0x92, 0x19, 0x59, + 0x62, 0x5b, 0xf2, 0xbe, 0xe8, 0x33, 0x2b, 0x96, 0x4f, 0x61, 0x6c, 0x5a, 0x4a, 0x18, 0x07, 0xfa, 0x01, 0x18, 0x29, + 0x8a, 0x07, 0xe7, 0x00, 0x67, 0xe5, 0xfb, 0xc2, 0x53, 0xc6, 0x73, 0xfa, 0x3d, 0x4b, 0x12, 0x6f, 0x2e, 0xca, 0x57, + 0xc7, 0x09, 0x9a, 0x46, 0xf2, 0xd1, 0x88, 0x00, 0x04, 0xf6, 0xa3, 0x5f, 0x51, 0x28, 0x89, 0xa3, 0x5b, 0x0d, 0x54, + 0x96, 0x60, 0x43, 0xe5, 0xca, 0x15, 0xbe, 0x0d, 0x4b, 0x58, 0x54, 0x83, 0x80, 0xc3, 0x7f, 0xc3, 0x82, 0x72, 0x62, + 0xea, 0xcd, 0xcb, 0x49, 0xb4, 0x0f, 0x32, 0x75, 0x6c, 0x52, 0x0b, 0xa1, 0x90, 0xf8, 0x39, 0x62, 0xf5, 0x20, 0x9a, + 0xff, 0xa1, 0x32, 0xf5, 0x2d, 0xba, 0x10, 0xef, 0x42, 0xd3, 0x4f, 0x47, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xfd, + 0x30, 0x5d, 0x58, 0x68, 0x47, 0xd7, 0x6a, 0x87, 0x86, 0x69, 0xe3, 0xda, 0x6e, 0xca, 0xd6, 0xc3, 0xfd, 0x78, 0x3e, + 0xf6, 0x5a, 0x6e, 0xfb, 0xd8, 0x14, 0x7f, 0x6c, 0xa7, 0x6b, 0x64, 0xd8, 0x82, 0x36, 0xf5, 0x6f, 0x36, 0xb3, 0x28, + 0x4c, 0xad, 0x99, 0xb7, 0xf4, 0x83, 0xfb, 0xfe, 0x32, 0x0a, 0xa3, 0x64, 0xe5, 0x4d, 0xd8, 0x20, 0xe7, 0x02, 0x0c, + 0xd0, 0x2f, 0x05, 0x37, 0x8d, 0x74, 0xed, 0x76, 0xcc, 0x96, 0x54, 0x5b, 0xba, 0x9d, 0x98, 0x05, 0xec, 0x2e, 0xe3, + 0xdd, 0x17, 0x0a, 0x53, 0x51, 0xdc, 0x72, 0x54, 0x03, 0xc8, 0x68, 0xee, 0xd3, 0x02, 0x3c, 0x39, 0x0d, 0x38, 0x2d, + 0xda, 0xb7, 0xdb, 0xdd, 0x98, 0x2d, 0x35, 0xbb, 0xdb, 0xd8, 0x78, 0x1c, 0xdd, 0x9e, 0xc2, 0x68, 0xb1, 0xb2, 0x95, + 0xb0, 0x60, 0x86, 0x39, 0x16, 0x9a, 0xd1, 0x88, 0x76, 0x2c, 0xe4, 0x1e, 0x40, 0x6b, 0x6c, 0x39, 0x80, 0xec, 0x7e, + 0x5b, 0x73, 0x06, 0x4b, 0x3f, 0xb4, 0x68, 0x3a, 0xc7, 0xce, 0x4a, 0x69, 0x4b, 0x85, 0x9f, 0xb1, 0xc1, 0xe2, 0xae, + 0xe6, 0x0c, 0xe0, 0x85, 0x39, 0x0b, 0xa2, 0xdb, 0xfe, 0xc2, 0x9f, 0x4e, 0x59, 0x38, 0xc0, 0x31, 0xcb, 0x44, 0x16, + 0x04, 0xfe, 0x2a, 0xf1, 0x93, 0xc1, 0xd2, 0xbb, 0xe3, 0xad, 0x1e, 0x36, 0xb5, 0xda, 0xe1, 0xad, 0x76, 0xf6, 0x6e, + 0x55, 0x69, 0x06, 0x4c, 0x76, 0xa8, 0x1d, 0x3e, 0xb4, 0xae, 0xe6, 0x94, 0xe6, 0xb9, 0x77, 0xab, 0xab, 0x98, 0x6d, + 0x96, 0x5e, 0x3c, 0xf7, 0xc3, 0xbe, 0x93, 0xd9, 0x37, 0x1b, 0xda, 0x18, 0x0f, 0x7b, 0xbd, 0x5e, 0x66, 0x4f, 0xc5, + 0x97, 0x33, 0x9d, 0x66, 0xf6, 0x44, 0x7c, 0xcd, 0x66, 0x8e, 0x33, 0x9b, 0x65, 0xb6, 0x2f, 0x12, 0x3a, 0xed, 0xc9, + 0xb4, 0xd3, 0xce, 0xec, 0x5b, 0xa5, 0x44, 0x66, 0x33, 0xfe, 0x15, 0xb3, 0xe9, 0x00, 0x37, 0x12, 0xe9, 0xd0, 0xf6, + 0x8f, 0x1d, 0x27, 0x43, 0x0c, 0x70, 0x59, 0xc0, 0x4d, 0xc8, 0xa0, 0xba, 0xda, 0xec, 0x5d, 0x52, 0xcb, 0xbb, 0x9b, + 0x4c, 0x6a, 0xcb, 0x4d, 0xbd, 0xf8, 0xc3, 0x95, 0xa6, 0xcc, 0xc2, 0xf3, 0xa8, 0xd8, 0x46, 0x80, 0xc1, 0xba, 0xeb, + 0x83, 0x7f, 0xb2, 0xc1, 0x38, 0x8a, 0xe1, 0xcc, 0xc6, 0xde, 0xd4, 0x5f, 0x27, 0x7d, 0xb7, 0xbd, 0xba, 0x13, 0x49, + 0x7c, 0xaf, 0xe7, 0x09, 0x78, 0xf6, 0xfa, 0x49, 0x14, 0xf8, 0x53, 0x91, 0xd4, 0x74, 0x96, 0xdc, 0xb6, 0x31, 0x40, + 0xeb, 0x7c, 0x1f, 0x7d, 0x4c, 0x78, 0x41, 0xa0, 0xd9, 0x9d, 0x44, 0x63, 0x5e, 0x82, 0x4c, 0x71, 0xcd, 0x49, 0x08, + 0x2e, 0x68, 0x89, 0xef, 0x1e, 0xae, 0xee, 0xe4, 0x9e, 0x77, 0x8f, 0x56, 0x77, 0xd9, 0x37, 0x4b, 0x36, 0xf5, 0x3d, + 0xad, 0x95, 0xef, 0x26, 0xd7, 0x01, 0xc6, 0xb9, 0xb1, 0x69, 0xd8, 0xa6, 0xe2, 0x58, 0x80, 0x1f, 0xc7, 0x07, 0xfe, + 0x72, 0x15, 0xc5, 0xa9, 0x17, 0xa6, 0x59, 0x36, 0xba, 0xca, 0xb2, 0xc1, 0x85, 0xdf, 0xba, 0xfc, 0x47, 0x8b, 0xee, + 0x69, 0x12, 0x34, 0x65, 0xc6, 0x95, 0xf9, 0x92, 0xa9, 0x8a, 0x2e, 0x70, 0x8d, 0xa1, 0x92, 0x8b, 0x5a, 0x98, 0x6e, + 0xc9, 0x6a, 0x61, 0x02, 0xb2, 0x2c, 0x4e, 0x8a, 0x33, 0xc5, 0x22, 0x78, 0x03, 0x41, 0x81, 0x97, 0x6c, 0x78, 0xa1, + 0x28, 0xcd, 0x00, 0xb1, 0x82, 0x85, 0xc9, 0x88, 0xe2, 0x51, 0x13, 0xcd, 0xf8, 0xed, 0x6e, 0x9a, 0xf1, 0xe7, 0x74, + 0x1f, 0x9a, 0xf1, 0xdb, 0x2f, 0x4e, 0x33, 0x3e, 0xaa, 0x1a, 0x51, 0xbc, 0x8e, 0x86, 0xba, 0x14, 0x8b, 0xc0, 0xd5, + 0x14, 0x93, 0x7b, 0xa2, 0xd7, 0xbf, 0xdb, 0xe6, 0x41, 0xb4, 0x46, 0x01, 0xf7, 0xe8, 0xe6, 0x06, 0x26, 0xf2, 0x9b, + 0x70, 0xf8, 0xf7, 0x58, 0xfd, 0x9e, 0xcd, 0x86, 0x2f, 0x22, 0x25, 0x41, 0x7e, 0x71, 0x8d, 0x91, 0x82, 0x2b, 0x09, + 0xca, 0x11, 0xaa, 0xa3, 0x18, 0x6c, 0x03, 0x2c, 0xd1, 0x49, 0x55, 0x7a, 0x2a, 0x55, 0xe6, 0x06, 0xc5, 0x21, 0xb4, + 0xa4, 0x9e, 0xaa, 0xb0, 0x37, 0xaa, 0xf0, 0x3f, 0xe7, 0x2c, 0xe5, 0x06, 0xc2, 0xdf, 0xdd, 0xbf, 0x9e, 0xb6, 0x5e, + 0x47, 0x46, 0xe6, 0x27, 0x6f, 0xca, 0xd6, 0x3e, 0x5c, 0x60, 0x35, 0x54, 0xa7, 0x93, 0x71, 0xb5, 0x37, 0x35, 0x9a, + 0x36, 0x64, 0x53, 0xf5, 0xb3, 0xc2, 0x4c, 0xfb, 0x6a, 0x45, 0x1e, 0xd5, 0xab, 0x72, 0x19, 0x73, 0x53, 0x8b, 0x0d, + 0xa7, 0x00, 0x31, 0x50, 0x19, 0x1a, 0x49, 0x4f, 0xa9, 0xba, 0x3f, 0xcd, 0x32, 0x63, 0x20, 0x00, 0xa1, 0x5c, 0xb4, + 0x6c, 0x17, 0x11, 0x97, 0xe4, 0xef, 0x31, 0x2e, 0xd6, 0x24, 0x99, 0xe5, 0x6b, 0xd0, 0x02, 0xe0, 0x12, 0x4e, 0x0e, + 0x33, 0x5d, 0x23, 0xf0, 0x91, 0x76, 0x88, 0x32, 0x21, 0x10, 0x5b, 0x4b, 0xf8, 0x8b, 0x2c, 0x91, 0x50, 0x55, 0x3c, + 0x25, 0xe0, 0xa0, 0x1a, 0x03, 0xb8, 0x34, 0x10, 0xcc, 0x1a, 0x42, 0x3b, 0xbc, 0x0c, 0x7e, 0x64, 0xba, 0xa4, 0xfd, + 0x70, 0xfb, 0x9d, 0x9e, 0x1c, 0x40, 0x85, 0xd3, 0x12, 0x23, 0x66, 0x87, 0x5a, 0x25, 0x90, 0x12, 0xc9, 0xad, 0x69, + 0x27, 0xb7, 0xda, 0x93, 0x8d, 0x70, 0x07, 0x92, 0x7a, 0x2b, 0x0b, 0x5e, 0xff, 0x88, 0x7b, 0x39, 0xc6, 0x53, 0x3c, + 0x8f, 0x0c, 0xd6, 0x09, 0xe0, 0x46, 0x7c, 0x88, 0x22, 0xfe, 0x19, 0x4c, 0xd6, 0x71, 0x12, 0xc5, 0xfd, 0x55, 0xe4, + 0x87, 0x29, 0x8b, 0x33, 0x04, 0xd5, 0x25, 0xc2, 0x47, 0x80, 0xe7, 0x6a, 0x13, 0xad, 0xbc, 0x89, 0x9f, 0xde, 0xf7, + 0x1d, 0x4e, 0x52, 0x38, 0x03, 0x4e, 0x1d, 0x38, 0xb5, 0xe5, 0xfb, 0x1c, 0x9a, 0x4f, 0x91, 0xf0, 0x8b, 0xab, 0xe4, + 0x8c, 0xba, 0xcd, 0x07, 0x4a, 0x2e, 0x39, 0x44, 0x01, 0xf2, 0xc3, 0x8b, 0xad, 0x39, 0x60, 0x79, 0x58, 0x6a, 0x67, + 0xca, 0xe6, 0x26, 0x62, 0x6d, 0x10, 0x26, 0x88, 0x3f, 0x76, 0xd7, 0xd0, 0x9c, 0xfa, 0x64, 0xa0, 0x78, 0x8c, 0x7d, + 0x46, 0xd6, 0xf7, 0x20, 0x7c, 0x98, 0xb9, 0x4f, 0xc9, 0x31, 0x9b, 0x45, 0x31, 0x23, 0xe7, 0xb9, 0x6e, 0x6f, 0x75, + 0xb7, 0x7f, 0xf3, 0xdb, 0xa7, 0x5f, 0xdf, 0x4e, 0x18, 0xa5, 0x2d, 0xd1, 0x98, 0xb1, 0xa3, 0xb5, 0xea, 0x7d, 0x06, + 0xa4, 0x21, 0x41, 0x7e, 0x42, 0x7e, 0xca, 0xfa, 0xba, 0x3e, 0xa8, 0xf5, 0x51, 0xb6, 0x8a, 0xf8, 0x9d, 0x17, 0xb3, + 0xc0, 0x4b, 0xfd, 0x1b, 0x41, 0x33, 0x76, 0x8e, 0x56, 0x77, 0x62, 0x8d, 0xf1, 0xc2, 0xfb, 0x84, 0x45, 0x2a, 0x0d, + 0x45, 0x2c, 0x52, 0x39, 0x19, 0x17, 0x69, 0x50, 0x99, 0x8d, 0x70, 0xdb, 0x51, 0xba, 0xe9, 0xbb, 0xab, 0x3b, 0xf5, + 0x8a, 0xce, 0xab, 0xc9, 0x9b, 0xba, 0xec, 0x6f, 0x6d, 0xe9, 0x4f, 0xa7, 0x01, 0xcb, 0x0a, 0x0b, 0x5d, 0x5c, 0x4b, + 0x05, 0x38, 0x12, 0x0e, 0xde, 0x38, 0x89, 0x82, 0x75, 0xca, 0xea, 0xc1, 0x45, 0xc0, 0x69, 0x3b, 0x39, 0x70, 0xf0, + 0x77, 0x71, 0xac, 0x5d, 0x20, 0xb7, 0x61, 0x9b, 0x38, 0x03, 0x70, 0xaf, 0x6c, 0x75, 0x8a, 0x43, 0x87, 0x2c, 0x39, + 0x68, 0xb3, 0x66, 0x22, 0x26, 0x5c, 0x4b, 0x84, 0xbd, 0x35, 0xdb, 0xe5, 0x69, 0xd2, 0xc5, 0xac, 0x4c, 0xca, 0x8a, + 0x93, 0xf9, 0x63, 0xce, 0xd8, 0xb3, 0xfa, 0x33, 0xf6, 0x4c, 0x9c, 0xb1, 0xed, 0x3b, 0xf3, 0xe1, 0xcc, 0x85, 0xff, + 0x06, 0xf9, 0x84, 0xfa, 0x8e, 0xd6, 0x59, 0xdd, 0x69, 0xee, 0xea, 0x4e, 0xb3, 0xda, 0xab, 0x3b, 0x0d, 0x9b, 0x46, + 0x25, 0x16, 0xd3, 0x6e, 0x1b, 0xa6, 0xa3, 0x41, 0x22, 0xfc, 0x71, 0x0a, 0x59, 0xee, 0x21, 0xe4, 0x41, 0xad, 0x6e, + 0x35, 0xaf, 0xbd, 0xfd, 0xa8, 0xd3, 0x59, 0x12, 0x48, 0xdb, 0xb0, 0x53, 0x6f, 0x3c, 0x66, 0xd3, 0xfe, 0x2c, 0x9a, + 0xac, 0x93, 0x7f, 0xf1, 0xf1, 0x73, 0x20, 0x6e, 0x45, 0x04, 0xa5, 0x76, 0x44, 0x55, 0x90, 0xee, 0xdc, 0x30, 0xd1, + 0xc2, 0x46, 0xae, 0x53, 0x9f, 0x7c, 0x41, 0xb7, 0xed, 0xc3, 0x9a, 0x4d, 0x5e, 0x0f, 0xe8, 0x3f, 0x6c, 0x95, 0x9a, + 0x51, 0xcc, 0x67, 0x80, 0x65, 0x2b, 0x38, 0x3e, 0x1d, 0x1a, 0x7c, 0x35, 0x9d, 0x5e, 0xfd, 0x70, 0x2f, 0x45, 0x4f, + 0x57, 0xe2, 0x52, 0xe1, 0xf7, 0x16, 0xb7, 0xa6, 0xd9, 0xde, 0x6a, 0xd3, 0x1e, 0xa9, 0xb4, 0xba, 0xe5, 0x42, 0xc8, + 0xcb, 0xee, 0x89, 0xe5, 0x1f, 0x3e, 0x3b, 0x84, 0xff, 0x88, 0xaa, 0xff, 0x39, 0xad, 0x23, 0xd4, 0x5f, 0x17, 0xd5, + 0xd7, 0x89, 0x54, 0x42, 0x42, 0x7c, 0xff, 0xf2, 0xb3, 0xd9, 0xa7, 0x55, 0xd8, 0xbb, 0x34, 0xe9, 0x7f, 0x95, 0x4b, + 0x7f, 0x17, 0x45, 0x10, 0xa7, 0xb4, 0x5a, 0x5c, 0x80, 0x87, 0x34, 0xf4, 0xd3, 0x21, 0x54, 0x12, 0xef, 0x08, 0x52, + 0x3d, 0xd0, 0xb1, 0x0e, 0x3d, 0x25, 0x5e, 0x36, 0x3d, 0x25, 0x5e, 0xec, 0x7e, 0x4a, 0xfc, 0x6d, 0xaf, 0xa7, 0xc4, + 0x8b, 0x2f, 0xfe, 0x94, 0x78, 0x59, 0x7d, 0x4a, 0x5c, 0x44, 0x42, 0xe9, 0xd7, 0x7c, 0xbd, 0xe6, 0x3f, 0xdf, 0x93, + 0x24, 0xf1, 0x3c, 0x1a, 0x76, 0x1d, 0xf2, 0xef, 0x7c, 0xf1, 0xbb, 0x1f, 0x16, 0xb8, 0x11, 0xdf, 0xa2, 0x0e, 0x5c, + 0xfe, 0xb4, 0xe0, 0x98, 0x1d, 0xfb, 0x51, 0x92, 0x83, 0x28, 0x9c, 0xff, 0x08, 0x92, 0x64, 0x60, 0x07, 0xc6, 0x4a, + 0x86, 0x9f, 0xfc, 0x18, 0xad, 0xd6, 0xab, 0xd7, 0xd0, 0xd6, 0x7b, 0x3f, 0xf1, 0xc7, 0x01, 0x93, 0x66, 0xd7, 0xa4, + 0xb3, 0xc7, 0x79, 0xe2, 0xa0, 0x26, 0x2b, 0x7e, 0x7a, 0x77, 0xe2, 0x27, 0x2a, 0xd2, 0xf2, 0xdf, 0xa4, 0x0c, 0xa8, + 0xd7, 0x3f, 0x44, 0xc0, 0x41, 0x51, 0x69, 0xd0, 0x9f, 0xfe, 0x18, 0xb9, 0x88, 0x8c, 0x9a, 0x59, 0x0a, 0x25, 0x8d, + 0xc6, 0x76, 0x58, 0xe5, 0x51, 0xb3, 0x36, 0x4c, 0xe9, 0x6f, 0xac, 0xca, 0x86, 0x5f, 0x46, 0xeb, 0x84, 0x4d, 0xa3, + 0xdb, 0x50, 0x37, 0x43, 0x69, 0x19, 0x01, 0x62, 0x59, 0x59, 0x07, 0x23, 0x65, 0xbe, 0x43, 0x42, 0x39, 0x8a, 0x5b, + 0x3a, 0x04, 0x6a, 0x5d, 0xaf, 0x2c, 0x92, 0x8f, 0x5b, 0x38, 0x45, 0x5d, 0x86, 0x74, 0x7a, 0xd0, 0x6a, 0x45, 0xc3, + 0x4f, 0xab, 0x29, 0xf4, 0x4b, 0x22, 0x9b, 0x73, 0x85, 0x93, 0x56, 0x28, 0x98, 0x8b, 0xc2, 0xe9, 0x47, 0xcd, 0xc2, + 0xf1, 0x1c, 0xb2, 0xb7, 0xcd, 0x73, 0xc1, 0x65, 0x4a, 0xb6, 0xe6, 0xeb, 0xc1, 0x5d, 0x60, 0xd0, 0xe7, 0x73, 0x05, + 0x8c, 0x6f, 0x6e, 0x58, 0x1c, 0x78, 0xf7, 0x2d, 0x23, 0x8b, 0xc2, 0xef, 0x01, 0x00, 0x2f, 0xa2, 0xdb, 0x50, 0x2d, + 0x80, 0x91, 0x69, 0x6a, 0xf6, 0x52, 0xad, 0xb3, 0x16, 0xb0, 0xb6, 0x51, 0x46, 0x00, 0x31, 0x81, 0xe7, 0xec, 0xef, + 0x26, 0xfd, 0xfb, 0x0f, 0x23, 0x33, 0xcf, 0x23, 0xd9, 0xd1, 0x4f, 0xab, 0x3d, 0xba, 0x79, 0xfc, 0xf8, 0x41, 0xf3, + 0xb4, 0x8b, 0xb1, 0xe8, 0x6b, 0x6a, 0x1b, 0x8d, 0xa7, 0x00, 0x46, 0x71, 0x11, 0xad, 0x27, 0x0b, 0xd4, 0xce, 0xfd, + 0x72, 0xf3, 0x4d, 0xa1, 0x4d, 0x0c, 0xc9, 0x2a, 0xa7, 0x5e, 0x4a, 0xca, 0xa1, 0x80, 0xfd, 0xbf, 0x04, 0x6f, 0xa3, + 0xff, 0x41, 0x30, 0x54, 0x77, 0x0d, 0x7f, 0xc5, 0xfb, 0x9f, 0xb6, 0x79, 0x07, 0x10, 0x39, 0x94, 0xfb, 0xf1, 0x10, + 0xc2, 0xb5, 0x7a, 0x24, 0x93, 0x95, 0x81, 0xa6, 0xfa, 0xcc, 0x6b, 0x72, 0x07, 0x28, 0x7a, 0x61, 0x36, 0x3d, 0xd3, + 0xb9, 0x75, 0x84, 0xc9, 0x38, 0xb6, 0x2a, 0x21, 0x19, 0xae, 0xa7, 0xc1, 0x10, 0x7d, 0x95, 0xf3, 0x96, 0x7e, 0x68, + 0xa2, 0xcb, 0xfb, 0x6a, 0x8e, 0x77, 0x07, 0x4e, 0x9f, 0x01, 0xb9, 0x95, 0xb3, 0x20, 0xd1, 0x54, 0x8d, 0xfd, 0x20, + 0xae, 0x95, 0x5e, 0x0b, 0x09, 0x21, 0xc5, 0x1b, 0x7d, 0xa5, 0x69, 0x9a, 0x26, 0x9f, 0x11, 0x9a, 0x7c, 0x47, 0x60, + 0x3a, 0x3e, 0x07, 0x40, 0x5a, 0x92, 0xad, 0xee, 0x28, 0x05, 0x5e, 0x06, 0x28, 0x99, 0x15, 0x09, 0xdc, 0xaf, 0x61, + 0xd7, 0x11, 0x09, 0xe2, 0x41, 0x0f, 0x3e, 0xe9, 0xbc, 0x18, 0xdc, 0x1f, 0xf7, 0x35, 0x7c, 0xb0, 0x63, 0x2e, 0xe7, + 0x04, 0x6b, 0x0e, 0x7d, 0x8e, 0x06, 0xac, 0xde, 0x01, 0x5e, 0xa8, 0x60, 0x41, 0x90, 0x3a, 0x94, 0xfc, 0x59, 0x9b, + 0xac, 0x06, 0x37, 0xe2, 0xbb, 0xe8, 0x2e, 0x5d, 0xb2, 0x70, 0xad, 0x63, 0x00, 0x2c, 0x74, 0x48, 0x08, 0x65, 0x5e, + 0x10, 0xb1, 0x05, 0xd8, 0xa6, 0xbe, 0xe6, 0x82, 0xee, 0xc2, 0x84, 0xa3, 0x54, 0xcf, 0x9c, 0x70, 0xc1, 0x66, 0xc2, + 0x71, 0x5b, 0xf9, 0x86, 0xe0, 0x4b, 0x1a, 0x95, 0xad, 0xcf, 0x48, 0x7d, 0x1b, 0xda, 0x20, 0x57, 0x20, 0x9c, 0x5d, + 0x24, 0xc0, 0xde, 0xf2, 0xca, 0x8b, 0x26, 0x25, 0x32, 0x5e, 0x89, 0x51, 0x14, 0x1b, 0xd5, 0x66, 0xf8, 0x38, 0xc1, + 0x0b, 0x53, 0x63, 0x3b, 0x93, 0x4a, 0x3b, 0x0d, 0x93, 0xfe, 0xc0, 0xee, 0xe9, 0x22, 0x21, 0x50, 0x7d, 0x60, 0xf7, + 0xa0, 0xb0, 0xf8, 0x12, 0xb8, 0x29, 0xfa, 0x16, 0x74, 0x6d, 0x42, 0x5c, 0x83, 0x09, 0x78, 0xe6, 0xda, 0x72, 0x80, + 0x9c, 0x6c, 0x0b, 0x16, 0x47, 0x10, 0x43, 0x08, 0x6b, 0x71, 0x88, 0xb9, 0x5d, 0x42, 0xab, 0x16, 0xc6, 0x56, 0xcd, + 0xd1, 0x30, 0x9e, 0xb8, 0x8e, 0x73, 0x50, 0x29, 0x0f, 0x8c, 0xec, 0xba, 0xd2, 0x86, 0x99, 0x0e, 0x5d, 0xc7, 0xf2, + 0x9f, 0xd8, 0xed, 0x41, 0xe5, 0x8e, 0x56, 0x1c, 0x67, 0x8e, 0x90, 0xfd, 0x75, 0xfa, 0x68, 0xd3, 0xaa, 0x1c, 0x48, + 0xa3, 0xac, 0xe7, 0x8f, 0x63, 0xcb, 0x38, 0xff, 0x6b, 0x54, 0xbd, 0xfa, 0xc9, 0x6d, 0x27, 0x05, 0x71, 0x19, 0x81, + 0xeb, 0xe7, 0x16, 0x1c, 0xa3, 0xbf, 0x68, 0x4f, 0xb5, 0x16, 0x1d, 0x1f, 0xc3, 0x18, 0xc9, 0xd8, 0xe0, 0xc2, 0x10, + 0x4e, 0x6d, 0xa0, 0xd4, 0x63, 0x52, 0xc6, 0x70, 0xdc, 0xc9, 0x2c, 0xcb, 0x25, 0x7a, 0x5b, 0xa9, 0x05, 0x6c, 0xbf, + 0xe1, 0xfa, 0xb4, 0xc7, 0xe0, 0x4c, 0x01, 0x4a, 0x80, 0xa3, 0xf8, 0x9d, 0x0d, 0xae, 0x57, 0xc5, 0xe6, 0x8a, 0x97, + 0xe4, 0xfe, 0x8d, 0xe1, 0xa5, 0x83, 0x32, 0x34, 0xd9, 0x5e, 0xfd, 0x75, 0xf7, 0x89, 0x4d, 0xb2, 0x70, 0x5a, 0x6c, + 0xb0, 0x74, 0x7f, 0xed, 0xdf, 0x5c, 0x01, 0xa3, 0x40, 0x04, 0x85, 0xa8, 0x06, 0xa3, 0x64, 0x51, 0x88, 0x9b, 0x9f, + 0x8e, 0x9b, 0xbf, 0x17, 0x15, 0x83, 0x15, 0xc8, 0xfd, 0x99, 0xac, 0xa6, 0x30, 0xc5, 0xc1, 0x4d, 0x37, 0xda, 0x32, + 0xb7, 0x04, 0x21, 0xda, 0xb8, 0x13, 0x53, 0xa1, 0x08, 0x99, 0xd7, 0xf1, 0xb9, 0xe3, 0xcd, 0x7d, 0xb9, 0xd6, 0xfe, + 0x6e, 0xae, 0x75, 0xba, 0x8b, 0x6b, 0x4d, 0x36, 0x60, 0xa4, 0xbd, 0x23, 0x6d, 0xe1, 0x04, 0x71, 0xae, 0x5a, 0x13, + 0x16, 0x58, 0xdd, 0x68, 0x32, 0x26, 0x6a, 0x55, 0x5a, 0x23, 0xd5, 0x46, 0x64, 0x7f, 0x2b, 0x0f, 0x14, 0x21, 0x50, + 0x57, 0x79, 0xe3, 0x17, 0x39, 0x6f, 0x9c, 0x5e, 0x35, 0xb9, 0xf5, 0x8f, 0xa0, 0xfe, 0x15, 0xcb, 0x3a, 0xf9, 0x3a, + 0xc8, 0x2d, 0xec, 0xf2, 0x91, 0x2a, 0x36, 0x63, 0xf9, 0x43, 0x43, 0xb1, 0x44, 0x14, 0xaf, 0x8c, 0xa2, 0x41, 0x62, + 0xb1, 0x68, 0x6e, 0x32, 0x96, 0xa7, 0x03, 0xd7, 0x1d, 0x87, 0x2c, 0x93, 0xd5, 0x6d, 0x53, 0xb4, 0x19, 0x52, 0xb3, + 0x95, 0x4d, 0x22, 0x8d, 0x7b, 0x08, 0xc0, 0x82, 0x4d, 0x5f, 0x92, 0x6b, 0x4b, 0x1d, 0x08, 0x1c, 0x64, 0x8d, 0x2d, + 0xe2, 0x6e, 0xee, 0x3c, 0x05, 0x87, 0xc8, 0x45, 0xd7, 0x2e, 0xde, 0xee, 0x24, 0x09, 0x56, 0xf9, 0x11, 0x08, 0xeb, + 0x2b, 0x85, 0x83, 0xd0, 0x77, 0x34, 0x67, 0x50, 0x43, 0x00, 0xe0, 0xfd, 0x5f, 0xfe, 0xe6, 0xa4, 0x00, 0x70, 0x22, + 0x35, 0x47, 0x95, 0xf9, 0xe3, 0x21, 0xb6, 0x48, 0xfd, 0x18, 0x8b, 0x56, 0xfb, 0x24, 0x7e, 0xcf, 0x86, 0x5b, 0xfe, + 0x14, 0xd9, 0xf9, 0xbc, 0x44, 0x5f, 0x8c, 0x83, 0xef, 0xb2, 0x78, 0x1d, 0xa2, 0xcf, 0x7f, 0x2b, 0x8d, 0xbd, 0xc9, + 0x87, 0x8d, 0xd2, 0x1f, 0x67, 0x89, 0x02, 0xbb, 0xb8, 0x28, 0x54, 0x18, 0x78, 0xe8, 0x22, 0x93, 0xf5, 0xed, 0x76, + 0xa2, 0x30, 0x6a, 0xfa, 0x0f, 0x9d, 0x8e, 0xf7, 0x6c, 0x76, 0x58, 0xe2, 0x9f, 0xb6, 0xbb, 0x45, 0xee, 0xba, 0x1c, + 0xc7, 0x32, 0xfa, 0x95, 0xdb, 0x48, 0xfe, 0xf9, 0x5d, 0x27, 0xbc, 0xcf, 0xd2, 0x1a, 0x7d, 0xce, 0x10, 0xa0, 0x7e, + 0x41, 0x30, 0xad, 0x8a, 0x69, 0x2a, 0x29, 0x4d, 0xc3, 0x9a, 0xf9, 0x41, 0x60, 0x05, 0x60, 0xa9, 0xb2, 0xf9, 0xac, + 0xe9, 0x61, 0x3b, 0x6b, 0x70, 0xce, 0xfc, 0x19, 0xed, 0x14, 0x77, 0x4a, 0xba, 0x58, 0x2f, 0xc7, 0x1b, 0x95, 0x51, + 0xae, 0xf0, 0xcf, 0xab, 0x3c, 0x73, 0xb5, 0xdb, 0xd9, 0x6c, 0x56, 0xe4, 0x1a, 0x3b, 0xda, 0x21, 0x72, 0x7e, 0x1f, + 0x3a, 0x8e, 0x53, 0x86, 0x6f, 0xd3, 0x41, 0xa1, 0x83, 0x61, 0x21, 0x13, 0xbe, 0xb7, 0x7b, 0x4f, 0xfd, 0x49, 0xa3, + 0xa5, 0xa6, 0x9a, 0xce, 0x23, 0x6d, 0xb5, 0xff, 0x8a, 0xa1, 0x20, 0x6a, 0xd8, 0x75, 0xfc, 0xab, 0x7b, 0x65, 0x4b, + 0x4b, 0xe5, 0x03, 0xfc, 0x69, 0x95, 0x77, 0xec, 0xf5, 0x3d, 0xaa, 0x36, 0x6d, 0xef, 0xcc, 0xce, 0xaf, 0xdd, 0x82, + 0xce, 0xd2, 0x80, 0x34, 0x95, 0xfc, 0x94, 0x2d, 0x93, 0xfe, 0x84, 0xa1, 0x80, 0xd4, 0x56, 0x6e, 0x5b, 0xd4, 0xea, + 0xb1, 0xe6, 0xa0, 0xc7, 0xe5, 0x0a, 0x3c, 0xec, 0x68, 0x28, 0xac, 0xaa, 0x48, 0xd6, 0x44, 0x27, 0x78, 0x8b, 0x6d, + 0xaa, 0x02, 0x27, 0xdc, 0xa6, 0x5d, 0xe7, 0x2f, 0x85, 0x72, 0x1a, 0x50, 0xa7, 0x1b, 0xa1, 0x6d, 0x42, 0xc2, 0x13, + 0xfc, 0x5b, 0x0a, 0xe7, 0x9e, 0xad, 0xee, 0x8a, 0xca, 0x5d, 0x3d, 0x10, 0x37, 0xe5, 0x57, 0x19, 0x8d, 0xba, 0x0e, + 0xf5, 0x49, 0x15, 0xa0, 0x99, 0xaa, 0xdd, 0x02, 0x1a, 0x34, 0x85, 0x50, 0x44, 0x35, 0xb2, 0x31, 0x7c, 0xce, 0xc2, + 0xce, 0xcb, 0xf9, 0xfb, 0x79, 0x20, 0x4d, 0x98, 0x83, 0xf9, 0xb4, 0x87, 0xc2, 0xbd, 0xc2, 0x56, 0x45, 0x55, 0x19, + 0xdc, 0x03, 0xe2, 0x45, 0xaa, 0xad, 0xe3, 0xc0, 0xa2, 0x38, 0x3d, 0x2d, 0x63, 0x53, 0x9d, 0x77, 0x73, 0xf3, 0x6e, + 0x17, 0xe4, 0x1a, 0x55, 0x50, 0xed, 0x25, 0xda, 0x2b, 0xcb, 0xb0, 0xc5, 0x38, 0x61, 0x05, 0xc0, 0x92, 0x42, 0x43, + 0xa5, 0x21, 0xad, 0x84, 0xfb, 0x68, 0xd2, 0x32, 0x57, 0x45, 0xd6, 0x62, 0x9e, 0xd8, 0x5c, 0x7d, 0x11, 0x6a, 0x5b, + 0x48, 0x06, 0x01, 0x76, 0x1c, 0x3b, 0xe1, 0xb7, 0x05, 0x3b, 0x46, 0x45, 0x57, 0x2e, 0xee, 0x20, 0x3c, 0xa5, 0x16, + 0xd2, 0xc9, 0x09, 0x9d, 0x52, 0x94, 0x25, 0xfc, 0xad, 0x96, 0x79, 0x7f, 0x51, 0xe0, 0xc6, 0x73, 0x73, 0x96, 0xb6, + 0xb1, 0x57, 0xe9, 0xa5, 0x1f, 0xee, 0x5f, 0xd6, 0xbb, 0xdb, 0xbb, 0x2c, 0x10, 0x87, 0x7b, 0x17, 0x06, 0xea, 0x92, + 0xb4, 0x94, 0xd2, 0xe1, 0xdf, 0x14, 0xe1, 0x81, 0xea, 0x16, 0x41, 0xc7, 0x5a, 0xf4, 0xa2, 0xbf, 0x58, 0x0f, 0x47, + 0x27, 0x67, 0x77, 0xcb, 0x40, 0xbb, 0x61, 0x31, 0xc4, 0x2c, 0x1b, 0xea, 0xae, 0xed, 0xe8, 0x1a, 0x1a, 0xf9, 0xfb, + 0xe1, 0x7c, 0xa8, 0xff, 0x74, 0xf1, 0xca, 0xea, 0xe9, 0x67, 0xa0, 0x8e, 0x71, 0x33, 0x47, 0x12, 0xf7, 0xdc, 0xbb, + 0x67, 0xf1, 0x75, 0x5b, 0xd7, 0x30, 0x34, 0x19, 0x11, 0xb7, 0x98, 0xa6, 0xb5, 0xf5, 0x3d, 0x22, 0xe0, 0x68, 0x22, + 0x88, 0xa5, 0x0e, 0x88, 0xd5, 0x6d, 0xf7, 0x34, 0xb7, 0x7d, 0x68, 0x1f, 0xf5, 0xf4, 0xd3, 0xaf, 0x34, 0xed, 0x64, + 0xca, 0x66, 0xc9, 0x29, 0xb2, 0x63, 0x4e, 0x90, 0x1e, 0xa4, 0xdf, 0x9a, 0x66, 0x4f, 0x82, 0xc4, 0x72, 0xb5, 0x0d, + 0xff, 0xd4, 0x34, 0x40, 0x46, 0x7d, 0xed, 0xe1, 0xac, 0x3d, 0x3b, 0x9c, 0x3d, 0x1b, 0xf0, 0xe4, 0xec, 0xab, 0x42, + 0x71, 0x93, 0xfe, 0x6d, 0x2b, 0xd5, 0x92, 0x34, 0x8e, 0x3e, 0x30, 0x4e, 0x4b, 0x6a, 0x92, 0x51, 0x54, 0xae, 0xda, + 0xae, 0xf6, 0xe4, 0xf6, 0xc6, 0x93, 0x59, 0x3b, 0x2f, 0x8e, 0x63, 0x3c, 0x90, 0x83, 0x3c, 0x39, 0x10, 0x43, 0x3f, + 0x51, 0xc1, 0xe4, 0x5a, 0x75, 0x80, 0x72, 0x75, 0x3e, 0xc7, 0xb9, 0x98, 0xdf, 0x09, 0x38, 0x98, 0xcd, 0x0d, 0x10, + 0x12, 0xac, 0x36, 0xd4, 0xbf, 0x77, 0xdb, 0x3d, 0xd3, 0x75, 0x8f, 0xec, 0xa3, 0xde, 0xc4, 0x31, 0x0f, 0xed, 0x43, + 0xab, 0x63, 0x1f, 0x99, 0x3d, 0xab, 0x67, 0xf6, 0xfe, 0xda, 0x9b, 0x58, 0x87, 0xf6, 0xa1, 0xe9, 0x58, 0x3d, 0x48, + 0xb4, 0x7a, 0x56, 0xef, 0xc6, 0x3a, 0xec, 0x4d, 0x1c, 0x4c, 0x6d, 0xdb, 0xdd, 0xae, 0xe5, 0x3a, 0x76, 0xb7, 0x6b, + 0x76, 0xed, 0xa3, 0x23, 0xcb, 0xed, 0xd8, 0x47, 0x47, 0xe7, 0xdd, 0x9e, 0xdd, 0x81, 0xbc, 0x4e, 0x67, 0xd2, 0xb1, + 0x5d, 0xd7, 0x82, 0xbf, 0xcc, 0x9e, 0xdd, 0xa6, 0x1f, 0xae, 0x6b, 0x77, 0x5c, 0xd3, 0x09, 0xba, 0x6d, 0xfb, 0xe8, + 0x99, 0x89, 0x7f, 0x63, 0x31, 0x13, 0xff, 0x82, 0x66, 0xcc, 0x67, 0x76, 0xfb, 0x88, 0x7e, 0x61, 0x83, 0x37, 0x87, + 0xbd, 0x9f, 0xf5, 0x83, 0xc6, 0x39, 0xb8, 0x34, 0x87, 0x5e, 0xd7, 0xee, 0x74, 0xcc, 0x43, 0xd7, 0xee, 0x75, 0x16, + 0xd6, 0x61, 0xdb, 0x3e, 0x3a, 0x9e, 0x58, 0xae, 0x7d, 0x7c, 0x6c, 0x3a, 0x56, 0xc7, 0x6e, 0x9b, 0xae, 0x7d, 0xd8, + 0xc1, 0x1f, 0x1d, 0xbb, 0x7d, 0x73, 0xfc, 0xcc, 0x3e, 0xea, 0x2e, 0x8e, 0xec, 0xc3, 0xf7, 0x87, 0x3d, 0xbb, 0xdd, + 0x59, 0x74, 0x8e, 0xec, 0xf6, 0xf1, 0xcd, 0x91, 0x7d, 0xb8, 0xb0, 0xda, 0x47, 0x5b, 0x6b, 0xba, 0x6d, 0x1b, 0x60, + 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0xb3, 0xc0, 0xba, 0x7f, 0x62, 0x33, 0x49, 0xb5, 0xea, 0x33, 0xbb, 0x77, + 0x3c, 0xa1, 0xe2, 0x90, 0x60, 0x89, 0x12, 0x50, 0xe5, 0xc6, 0xa2, 0x6e, 0xb1, 0x39, 0x4b, 0x34, 0x24, 0xfe, 0xf0, + 0xce, 0x6e, 0x2c, 0xe8, 0x98, 0xfa, 0xfd, 0x8f, 0xb6, 0x23, 0x97, 0x1c, 0x42, 0xf2, 0x7e, 0xc5, 0xff, 0xa1, 0x68, + 0x56, 0x23, 0xf3, 0xbc, 0x49, 0x28, 0xf9, 0x76, 0xb7, 0x50, 0xf2, 0xd5, 0x7a, 0x1f, 0xa1, 0xe4, 0xdb, 0x2f, 0x2e, + 0x94, 0x3c, 0x2f, 0xdb, 0xc4, 0xbc, 0x2d, 0x07, 0xdd, 0xf8, 0x79, 0x53, 0x66, 0x39, 0xf8, 0x5e, 0xeb, 0xf2, 0x62, + 0x7d, 0x05, 0xee, 0xdf, 0xde, 0x46, 0xc3, 0x57, 0xeb, 0x82, 0xc2, 0x67, 0x04, 0x38, 0xf6, 0x6d, 0x44, 0x38, 0xf6, + 0xd7, 0xf5, 0x10, 0xb4, 0xcc, 0x38, 0x99, 0xe3, 0x4f, 0xad, 0x85, 0x17, 0xcc, 0x24, 0x89, 0x04, 0x29, 0x03, 0x4c, + 0x06, 0xbb, 0x2b, 0xb8, 0x9e, 0xe1, 0x25, 0xb3, 0x5e, 0x86, 0x09, 0x68, 0x04, 0x83, 0x26, 0xc7, 0x2c, 0xce, 0x4a, + 0x95, 0x6d, 0xe1, 0x30, 0xef, 0x9a, 0x5b, 0x40, 0x35, 0xe6, 0xa3, 0x02, 0x70, 0x7d, 0xeb, 0x6e, 0xb5, 0x5d, 0x0d, + 0x34, 0xeb, 0x84, 0x82, 0x34, 0x50, 0xfb, 0x75, 0xf9, 0x45, 0x35, 0xdc, 0x92, 0xe2, 0x75, 0xf3, 0x48, 0x61, 0x24, + 0xe5, 0xfa, 0x6e, 0x51, 0x8d, 0x77, 0xd7, 0x34, 0x6b, 0xba, 0x2f, 0x54, 0xdf, 0xa2, 0x43, 0x2c, 0x1b, 0x2e, 0x83, + 0xaa, 0x14, 0x32, 0xb2, 0x16, 0x20, 0xf9, 0x03, 0x35, 0x57, 0x34, 0xce, 0x29, 0x55, 0x47, 0x43, 0x7a, 0xc7, 0x51, + 0xf2, 0x0a, 0x6d, 0xaa, 0xca, 0xc9, 0x4f, 0x36, 0xf8, 0xae, 0xf0, 0x7f, 0x05, 0x4a, 0x94, 0x53, 0x3c, 0xe3, 0x48, + 0x85, 0xf3, 0x46, 0x69, 0x97, 0xb8, 0x11, 0xd9, 0xc2, 0xdd, 0x54, 0x69, 0xd1, 0x46, 0xb3, 0x04, 0x97, 0x2d, 0x05, + 0x15, 0x84, 0xdd, 0x93, 0x11, 0x40, 0x46, 0x86, 0x1a, 0x68, 0xe7, 0xb0, 0xad, 0x31, 0x51, 0xee, 0x21, 0x6c, 0x62, + 0x93, 0x7f, 0xa8, 0x8e, 0x4b, 0x36, 0xb3, 0x20, 0xf2, 0xd2, 0x3e, 0x92, 0x69, 0x0a, 0xc9, 0xdb, 0x46, 0x8b, 0x85, + 0xc1, 0x16, 0x65, 0x3a, 0xb5, 0x61, 0xde, 0x08, 0x5a, 0x3e, 0x6c, 0xd3, 0xbf, 0x93, 0x86, 0x62, 0x9b, 0x82, 0x3a, + 0x8a, 0xdb, 0x3d, 0x36, 0xdd, 0x23, 0xd3, 0x3e, 0xee, 0x1a, 0x99, 0x38, 0x70, 0x6a, 0x93, 0x05, 0x80, 0x80, 0x01, + 0x84, 0x1c, 0xa6, 0x1f, 0xfa, 0xa9, 0xef, 0x05, 0x19, 0xd0, 0xc3, 0xc5, 0x47, 0xca, 0x3f, 0xd7, 0x49, 0x0a, 0x73, + 0x14, 0x44, 0x2f, 0x1a, 0x7f, 0x58, 0x63, 0x96, 0xde, 0x32, 0x16, 0x36, 0x28, 0xc6, 0x94, 0x6d, 0x49, 0xfe, 0x38, + 0xcd, 0xfa, 0x8c, 0xb4, 0xd6, 0xc6, 0x69, 0xc8, 0xf7, 0x87, 0x30, 0x7c, 0xc8, 0x46, 0xe6, 0x0f, 0x4d, 0x08, 0xf7, + 0x9f, 0xbb, 0x11, 0x6e, 0xca, 0xf6, 0x41, 0xb8, 0xff, 0xfc, 0xe2, 0x08, 0xf7, 0x07, 0x15, 0xe1, 0x16, 0xec, 0xfe, + 0x72, 0x09, 0xd3, 0x3b, 0xfc, 0x6e, 0x81, 0xb7, 0xfa, 0xa7, 0xfa, 0x01, 0x11, 0xf0, 0xba, 0x12, 0x45, 0xfc, 0x7d, + 0x21, 0x2c, 0x1a, 0x32, 0x40, 0xd1, 0x4b, 0x36, 0x85, 0x60, 0x82, 0x08, 0xdb, 0x8e, 0x0c, 0xc3, 0xc4, 0x6e, 0xb5, + 0xd7, 0x61, 0x1a, 0xd8, 0x6f, 0xf9, 0x3b, 0x12, 0x04, 0xba, 0xaf, 0xa2, 0x78, 0xe9, 0xa1, 0x87, 0x50, 0x1d, 0xc3, + 0xa9, 0xc2, 0x87, 0x03, 0xb6, 0xa4, 0x93, 0x28, 0x9c, 0x4a, 0xa9, 0x24, 0x1b, 0x5e, 0x12, 0xc5, 0xad, 0xdf, 0x33, + 0x2f, 0xd6, 0x4d, 0xca, 0x86, 0xc5, 0x7d, 0xd2, 0x71, 0x9e, 0xb4, 0x0f, 0x9f, 0x1c, 0x39, 0xf0, 0xbf, 0xcb, 0x3a, + 0x99, 0xc9, 0x0b, 0x2e, 0xa3, 0x10, 0x22, 0x3a, 0x89, 0x92, 0x4d, 0xc5, 0x6e, 0x19, 0xfb, 0x90, 0x97, 0x3a, 0xae, + 0x2f, 0x34, 0xf5, 0xee, 0xf3, 0x32, 0xb5, 0x25, 0x16, 0xd1, 0x5a, 0x19, 0x56, 0xcd, 0x68, 0xfc, 0x70, 0x0d, 0x7c, + 0x76, 0xa5, 0x84, 0x9a, 0xcd, 0xa7, 0x9b, 0xcf, 0x8b, 0x75, 0xb2, 0xab, 0x3c, 0x6c, 0x9c, 0x08, 0x5f, 0xb5, 0x13, + 0x82, 0x5c, 0x44, 0xe9, 0x60, 0xd0, 0x09, 0x0c, 0x9c, 0xa6, 0x41, 0xd0, 0x56, 0xb1, 0x40, 0x1e, 0x2d, 0x50, 0x1a, + 0xaf, 0xc3, 0x49, 0x0b, 0x7f, 0x7a, 0xe3, 0xa4, 0xe5, 0x1f, 0x80, 0xfb, 0x68, 0xec, 0xd8, 0xc0, 0x55, 0xf3, 0x4e, + 0x9d, 0x3c, 0xc6, 0x4e, 0x22, 0x56, 0xc5, 0x7b, 0x92, 0x9a, 0x31, 0x45, 0xe6, 0xc6, 0xa5, 0xb5, 0x86, 0xde, 0x13, + 0x59, 0xf1, 0x49, 0x6a, 0x42, 0x74, 0x6c, 0x58, 0xee, 0xc7, 0x8f, 0xa9, 0x14, 0xc4, 0xab, 0xa5, 0x69, 0x9d, 0x4d, + 0x72, 0xff, 0x93, 0x9a, 0x37, 0x8f, 0xc8, 0x05, 0x65, 0x7f, 0x62, 0x46, 0x4f, 0x9f, 0x9e, 0x0e, 0x5d, 0x83, 0x47, + 0x5b, 0x2e, 0x84, 0x06, 0x3c, 0xdf, 0x4f, 0xd1, 0xc8, 0xa8, 0x35, 0x81, 0x5d, 0xc1, 0x9b, 0xc9, 0x11, 0xe6, 0x08, + 0x1c, 0x7b, 0x41, 0xa8, 0x1e, 0x52, 0x28, 0xf0, 0x84, 0xc2, 0x8f, 0x28, 0x23, 0x5f, 0x5d, 0x1d, 0xdb, 0xb1, 0x1d, + 0x5d, 0x56, 0x9c, 0xf9, 0xf3, 0xe1, 0x26, 0x4a, 0x3d, 0x08, 0x7a, 0x16, 0x44, 0x73, 0xb0, 0xa3, 0x4b, 0xfd, 0x34, + 0x80, 0x08, 0x5a, 0x60, 0x50, 0xb7, 0xa4, 0x77, 0x79, 0xc6, 0xad, 0x1b, 0xbc, 0xf8, 0x03, 0x46, 0x51, 0x15, 0x26, + 0xb4, 0xe8, 0x12, 0xed, 0x7b, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x78, 0x03, 0x2c, 0x4e, 0x2c, 0xd5, 0x5a, 0xa8, 0xaf, + 0x41, 0x1d, 0x43, 0xe7, 0x93, 0x98, 0xc5, 0xde, 0x12, 0x82, 0x4d, 0x6c, 0x32, 0x93, 0x63, 0x5a, 0x9d, 0xa3, 0x5a, + 0xcd, 0x7d, 0x76, 0x64, 0x6a, 0x6d, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, 0x7a, 0x66, 0x6e, 0xb2, 0xab, 0xc1, 0x2e, 0x85, + 0x07, 0xc2, 0x2f, 0x0f, 0x69, 0x1e, 0xa4, 0xea, 0xc0, 0x45, 0x49, 0x29, 0x79, 0xb8, 0x6d, 0x29, 0x61, 0x20, 0x7c, + 0x12, 0x7a, 0x5e, 0xb0, 0xbb, 0xd4, 0xc0, 0x08, 0x53, 0xbc, 0x88, 0x6f, 0x6c, 0xd0, 0xd0, 0xd7, 0x0f, 0x35, 0xff, + 0xe3, 0xc7, 0x96, 0x0f, 0xc6, 0x4c, 0x43, 0x05, 0x3e, 0xf0, 0x6d, 0x14, 0x00, 0xe6, 0xe7, 0x62, 0x7a, 0x04, 0x16, + 0x58, 0x1a, 0xc2, 0xbf, 0x79, 0xb2, 0xf8, 0xc1, 0xd5, 0x24, 0xec, 0xc0, 0x0b, 0xe7, 0x80, 0xd2, 0xbc, 0x70, 0x5e, + 0x51, 0xc7, 0x22, 0x5b, 0xe5, 0x52, 0x6a, 0xde, 0x54, 0xae, 0x2a, 0x95, 0x7c, 0x77, 0x7f, 0x41, 0x11, 0xf4, 0x5a, + 0x3a, 0xdc, 0x72, 0x68, 0x58, 0x9b, 0x4b, 0x72, 0x9f, 0x0e, 0xbf, 0x3e, 0x59, 0xb2, 0xd4, 0x23, 0x31, 0x10, 0x3c, + 0x7e, 0x81, 0x1c, 0xd0, 0x26, 0x22, 0xfa, 0x35, 0x5e, 0x0d, 0xc3, 0x29, 0xbb, 0xf1, 0x27, 0xfc, 0x5d, 0x6a, 0x6a, + 0xfc, 0x9e, 0xb2, 0x50, 0xe3, 0x73, 0xe8, 0x9a, 0x64, 0x70, 0x30, 0xf1, 0xd0, 0x0f, 0xee, 0x30, 0x8c, 0xf4, 0xd3, + 0xaf, 0xa5, 0x6d, 0x66, 0xd3, 0x22, 0x40, 0x18, 0xdb, 0xcb, 0x98, 0x05, 0xff, 0x1a, 0x7e, 0x0d, 0x17, 0xf7, 0xd7, + 0x57, 0xba, 0x31, 0x48, 0xed, 0x45, 0xcc, 0x66, 0xc3, 0xaf, 0x6b, 0xc2, 0xb9, 0xe2, 0xf3, 0x9e, 0xc6, 0xa2, 0x77, + 0xda, 0xb9, 0xf7, 0xb2, 0xce, 0x5e, 0x8f, 0xfa, 0x53, 0xfe, 0x5a, 0x87, 0x17, 0xe0, 0xa6, 0xf0, 0xc6, 0x76, 0x07, + 0xf8, 0x7e, 0x1e, 0x07, 0xde, 0xe4, 0xc3, 0x80, 0x72, 0x0a, 0x1f, 0x16, 0xdc, 0xd6, 0x13, 0x6f, 0xd5, 0xc7, 0xeb, + 0x55, 0x4d, 0x04, 0xd3, 0x6c, 0x4a, 0x95, 0x94, 0x5d, 0xed, 0x5e, 0xc6, 0xad, 0xbc, 0xc1, 0x9e, 0xb1, 0xab, 0xdb, + 0x85, 0x9f, 0x32, 0xd1, 0x15, 0x7e, 0x64, 0x99, 0x78, 0xa8, 0xd3, 0x13, 0x15, 0x1f, 0xd6, 0x76, 0x47, 0x73, 0x7b, + 0x7f, 0xed, 0xde, 0xb8, 0xce, 0xa2, 0xed, 0xda, 0xbd, 0xf7, 0x6e, 0x6f, 0xd1, 0xb1, 0x8f, 0x03, 0xab, 0x63, 0x1f, + 0xc3, 0x9f, 0xf7, 0xc7, 0x76, 0x6f, 0x61, 0xb5, 0xed, 0xc3, 0xf7, 0x6e, 0x3b, 0xb0, 0x7a, 0xf6, 0x31, 0xfc, 0x39, + 0xa7, 0x5a, 0xf0, 0x00, 0xa2, 0xf7, 0xce, 0xd7, 0x05, 0x2c, 0xa0, 0xfc, 0x96, 0x32, 0x59, 0xb3, 0x70, 0xbd, 0xd5, + 0xc8, 0x75, 0x01, 0x65, 0xe8, 0xa6, 0xf0, 0x52, 0x1b, 0x0e, 0x5a, 0xe1, 0x90, 0x47, 0x46, 0x11, 0xea, 0x6d, 0xc2, + 0x06, 0x5d, 0xc4, 0x08, 0xa9, 0x3d, 0x46, 0xbc, 0x4e, 0x7d, 0x44, 0x08, 0x11, 0x72, 0x8f, 0x04, 0xc1, 0x3f, 0xad, + 0xd0, 0xcb, 0x9a, 0x88, 0x61, 0xa1, 0x60, 0xa5, 0x3c, 0xec, 0x6b, 0xb6, 0x7b, 0xe0, 0x68, 0x85, 0xcf, 0x64, 0xd8, + 0xb1, 0x2f, 0xda, 0x36, 0x17, 0x0e, 0xcb, 0xd6, 0x7f, 0x6f, 0x3b, 0x18, 0x6d, 0x9b, 0xda, 0x11, 0xee, 0xa6, 0xa7, + 0x7e, 0x2c, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0x3e, 0x94, 0x86, 0x01, 0xf1, 0x99, 0x5e, 0x03, 0x95, 0x7c, 0xe3, 0x05, + 0x8a, 0x22, 0x9b, 0x52, 0xf3, 0x81, 0xc4, 0xfc, 0x8f, 0x1f, 0xe7, 0x83, 0xb3, 0x4a, 0xe3, 0x3e, 0x71, 0xbb, 0x70, + 0xed, 0x76, 0x59, 0x67, 0xab, 0x4e, 0xe5, 0x6e, 0x7f, 0xe5, 0xb9, 0x3f, 0x63, 0xa1, 0x37, 0x25, 0x34, 0x36, 0x1a, + 0x15, 0x3b, 0x2b, 0xfa, 0x1a, 0xe0, 0xe9, 0xbd, 0xf4, 0xd4, 0xd1, 0x8d, 0x41, 0x28, 0xd4, 0x0f, 0xc2, 0x2d, 0x3e, + 0xda, 0xf9, 0x5b, 0x4c, 0x07, 0xd0, 0x6c, 0x99, 0xc7, 0x0e, 0x03, 0xf1, 0xff, 0xf4, 0x24, 0xd0, 0x58, 0x13, 0xf4, + 0x25, 0x4a, 0xa7, 0xb5, 0x60, 0xbc, 0x27, 0xef, 0x55, 0xba, 0x50, 0x59, 0x72, 0xa6, 0x43, 0x12, 0x04, 0xee, 0xc3, + 0x58, 0x9d, 0x52, 0x59, 0x54, 0xde, 0x16, 0x79, 0x82, 0xe9, 0x43, 0x90, 0x82, 0x96, 0x30, 0x1c, 0x35, 0x1e, 0x3f, + 0x6e, 0xbc, 0x84, 0x48, 0x39, 0x47, 0x0d, 0x59, 0xac, 0xab, 0xf8, 0x4d, 0x57, 0x51, 0x8c, 0x6c, 0x17, 0xb1, 0x86, + 0xd0, 0x71, 0xa5, 0xbd, 0x87, 0x3f, 0xc7, 0xcc, 0x4b, 0x6d, 0x2e, 0x2c, 0x6d, 0x29, 0x97, 0xbb, 0xe9, 0xb2, 0x0e, + 0x68, 0xb7, 0x72, 0x67, 0x8c, 0xdc, 0xd9, 0xe9, 0xa3, 0xcd, 0xfb, 0x35, 0xf7, 0xea, 0x00, 0x6d, 0x7c, 0x74, 0x72, + 0xff, 0x59, 0x6f, 0x52, 0x8f, 0x9c, 0x2c, 0xa9, 0x57, 0x6e, 0x94, 0x7a, 0x22, 0x40, 0x16, 0xd0, 0xe5, 0x83, 0x5a, + 0xf5, 0x0b, 0xc5, 0xf3, 0xc3, 0xe9, 0x9b, 0x8b, 0x6f, 0x35, 0xbe, 0xff, 0x49, 0x5b, 0x00, 0x1f, 0x32, 0x14, 0x96, + 0x65, 0x48, 0x61, 0x59, 0x34, 0x1e, 0x1f, 0x09, 0x82, 0x9b, 0x64, 0x07, 0x04, 0x41, 0x64, 0x40, 0x93, 0x0e, 0xc5, + 0x72, 0x1d, 0xa4, 0xfe, 0xca, 0x8b, 0xd3, 0x03, 0xa8, 0x6a, 0x01, 0x92, 0xd3, 0x9b, 0xfc, 0x41, 0x90, 0x1a, 0x86, + 0xf0, 0x01, 0x9a, 0x86, 0x42, 0x0f, 0x63, 0xe6, 0x07, 0x52, 0x0d, 0x43, 0x74, 0xe0, 0x4d, 0x26, 0x6c, 0x95, 0x0e, + 0x75, 0x6f, 0x05, 0xe1, 0x79, 0xd0, 0xe1, 0xfe, 0x41, 0x34, 0x49, 0x59, 0x6a, 0x25, 0x69, 0xcc, 0xbc, 0xa5, 0x2e, + 0x7d, 0x4d, 0x57, 0xdb, 0x4b, 0xd6, 0xe3, 0xa5, 0x9f, 0x4a, 0x67, 0xad, 0x34, 0x41, 0x50, 0x88, 0x80, 0x21, 0x82, + 0x73, 0x18, 0x02, 0xe1, 0x79, 0x34, 0x2f, 0xed, 0xa8, 0x9c, 0x72, 0x39, 0x43, 0x57, 0xe0, 0x3c, 0x24, 0xcb, 0x14, + 0xed, 0x1b, 0xaf, 0xb9, 0x0f, 0x0b, 0xe9, 0x53, 0x56, 0x3f, 0x3d, 0xe1, 0xcf, 0x5b, 0x0d, 0xdd, 0xae, 0xe8, 0x5d, + 0x07, 0x9c, 0x9d, 0x37, 0x79, 0xb7, 0x38, 0xe0, 0x85, 0xe1, 0x6a, 0xa2, 0x96, 0x31, 0x10, 0x05, 0x8d, 0xe5, 0x02, + 0x08, 0xa1, 0x82, 0xc2, 0xcc, 0xc2, 0x3d, 0x95, 0xe6, 0x94, 0x38, 0x2a, 0xa4, 0x95, 0x3e, 0x7e, 0x7c, 0x3e, 0xfa, + 0xed, 0xdf, 0x10, 0x2d, 0x63, 0xe1, 0x0a, 0x9f, 0x12, 0x97, 0x6a, 0x29, 0x4e, 0x7d, 0x9a, 0x23, 0x54, 0x96, 0x62, + 0x53, 0xe1, 0x98, 0x47, 0x6c, 0xad, 0x6c, 0x74, 0x25, 0xbc, 0xfd, 0x41, 0x44, 0x1c, 0x43, 0x78, 0xbe, 0x18, 0xc1, + 0xf2, 0x8e, 0x84, 0xc3, 0x15, 0xed, 0x97, 0xbb, 0xef, 0x8e, 0xb5, 0xdc, 0x05, 0x4f, 0x9d, 0x46, 0x0f, 0xed, 0xa1, + 0xd3, 0x13, 0x4f, 0x43, 0xa2, 0x05, 0xc9, 0x8f, 0xa4, 0x7f, 0x00, 0xd3, 0x5c, 0x44, 0x4b, 0x66, 0xfb, 0xd1, 0xc1, + 0x2d, 0x1b, 0x5b, 0xde, 0xca, 0x27, 0xbd, 0x1c, 0xe4, 0xbb, 0x69, 0x44, 0xf9, 0x49, 0x75, 0x17, 0xa2, 0xaf, 0xb3, + 0x1c, 0x94, 0x51, 0xd1, 0xbd, 0x63, 0xb7, 0x9d, 0xcb, 0x01, 0xc1, 0x7f, 0x81, 0x02, 0xc7, 0xe8, 0xf4, 0xe4, 0xc0, + 0x3b, 0x2d, 0xfa, 0x97, 0xb5, 0x45, 0x84, 0x93, 0xe2, 0x25, 0x70, 0x46, 0x6e, 0x62, 0x85, 0x47, 0xd8, 0xfc, 0xc3, + 0x8a, 0x66, 0x33, 0xd5, 0x27, 0xac, 0x5d, 0x1c, 0x9e, 0x04, 0x5a, 0xbe, 0xa5, 0xa3, 0x15, 0xf5, 0x54, 0xed, 0x42, + 0xfe, 0x84, 0xa8, 0xf0, 0xdc, 0x7d, 0x30, 0x1c, 0xf7, 0x8a, 0x6f, 0x59, 0x09, 0xb1, 0x87, 0x54, 0x88, 0xe3, 0x91, + 0x72, 0x24, 0x83, 0x06, 0xca, 0xe5, 0xc1, 0x70, 0x48, 0x68, 0xae, 0x8c, 0xed, 0x00, 0x88, 0x35, 0xd1, 0x5e, 0x60, + 0xb2, 0x29, 0x54, 0xb4, 0xc8, 0x5c, 0x16, 0x2b, 0x95, 0xa7, 0x53, 0x1d, 0xe3, 0x81, 0x27, 0xb6, 0x5f, 0x61, 0x83, + 0xc2, 0xc6, 0xe3, 0xeb, 0x0e, 0xf8, 0x5d, 0xb4, 0x53, 0x42, 0xf3, 0xda, 0x37, 0x84, 0xd1, 0xad, 0xc0, 0xbb, 0x8f, + 0x14, 0x35, 0x26, 0xee, 0xd1, 0xe4, 0x1c, 0x53, 0x2f, 0x84, 0x25, 0x71, 0xe5, 0xa0, 0xc9, 0x88, 0x19, 0xd5, 0xc3, + 0xa6, 0x86, 0xb8, 0xd8, 0x75, 0xd6, 0xd4, 0xb2, 0xc5, 0xc9, 0x20, 0xf2, 0xcc, 0xf2, 0x73, 0x58, 0xc8, 0x44, 0xb4, + 0x90, 0x9d, 0x1c, 0xc0, 0xfc, 0xc0, 0x0b, 0x4b, 0x81, 0x70, 0xf2, 0x0d, 0x70, 0xf5, 0xe2, 0x25, 0xa4, 0x8a, 0xf5, + 0x7a, 0x2a, 0x68, 0x3e, 0x7c, 0x58, 0x4a, 0xe7, 0xd5, 0x85, 0x22, 0x55, 0x5a, 0xc6, 0xa9, 0x27, 0x02, 0x77, 0x47, + 0x98, 0xf9, 0x75, 0x8d, 0xe1, 0x65, 0xb2, 0x41, 0xca, 0x84, 0x93, 0x83, 0xf3, 0xb4, 0xc1, 0x0f, 0x42, 0x53, 0x11, + 0xa2, 0x67, 0xb7, 0x14, 0xc8, 0xf7, 0xf1, 0xb6, 0x52, 0x39, 0xe5, 0x24, 0x8b, 0xad, 0xbc, 0x96, 0xfe, 0x10, 0x77, + 0x7c, 0xa5, 0x34, 0xa6, 0x42, 0xb9, 0xf3, 0x74, 0x08, 0x45, 0x05, 0x2f, 0xde, 0x5b, 0xad, 0xa8, 0xb0, 0x31, 0x38, + 0x39, 0xa0, 0x67, 0xe9, 0x29, 0xed, 0xb0, 0xd3, 0x13, 0x50, 0xe5, 0xa6, 0x45, 0xf7, 0x56, 0x2b, 0xbe, 0xa4, 0xf4, + 0x8b, 0x72, 0x0e, 0x16, 0xe9, 0x32, 0x38, 0xfd, 0x7f, 0x8a, 0xa5, 0x7c, 0x2e, 0xc4, 0x61, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 1f3754684adccccc54a4795d8a685d13ba59e352 Mon Sep 17 00:00:00 2001 From: dentra Date: Wed, 24 Jul 2024 06:50:59 +0300 Subject: [PATCH 055/164] [http_request] Allow configure buffer size on ESP-IDF (#7125) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/http_request/__init__.py | 11 +++++++++++ esphome/components/http_request/http_request_idf.cpp | 9 +++++++++ esphome/components/http_request/http_request_idf.h | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 161486fbb2..3ca97b9611 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -40,6 +40,8 @@ CONF_VERIFY_SSL = "verify_ssl" CONF_FOLLOW_REDIRECTS = "follow_redirects" CONF_REDIRECT_LIMIT = "redirect_limit" CONF_WATCHDOG_TIMEOUT = "watchdog_timeout" +CONF_BUFFER_SIZE_RX = "buffer_size_rx" +CONF_BUFFER_SIZE_TX = "buffer_size_tx" CONF_MAX_RESPONSE_BUFFER_SIZE = "max_response_buffer_size" CONF_ON_RESPONSE = "on_response" @@ -110,6 +112,12 @@ CONFIG_SCHEMA = cv.All( cv.positive_not_null_time_period, cv.positive_time_period_milliseconds, ), + cv.SplitDefault(CONF_BUFFER_SIZE_RX, esp32_idf=512): cv.All( + cv.uint16_t, cv.only_with_esp_idf + ), + cv.SplitDefault(CONF_BUFFER_SIZE_TX, esp32_idf=512): cv.All( + cv.uint16_t, cv.only_with_esp_idf + ), } ).extend(cv.COMPONENT_SCHEMA), cv.require_framework_version( @@ -137,6 +145,9 @@ async def to_code(config): if CORE.is_esp32: if CORE.using_esp_idf: + cg.add(var.set_buffer_size_rx(config[CONF_BUFFER_SIZE_RX])) + cg.add(var.set_buffer_size_tx(config[CONF_BUFFER_SIZE_TX])) + esp32.add_idf_sdkconfig_option( "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE", config.get(CONF_VERIFY_SSL), diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 1f03b5f3bf..4fe5585723 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -18,6 +18,12 @@ namespace http_request { static const char *const TAG = "http_request.idf"; +void HttpRequestIDF::dump_config() { + HttpRequestComponent::dump_config(); + ESP_LOGCONFIG(TAG, " Buffer Size RX: %u", this->buffer_size_rx_); + ESP_LOGCONFIG(TAG, " Buffer Size TX: %u", this->buffer_size_tx_); +} + std::shared_ptr HttpRequestIDF::start(std::string url, std::string method, std::string body, std::list
headers) { if (!network::is_connected()) { @@ -63,6 +69,9 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin config.user_agent = this->useragent_; } + config.buffer_size = this->buffer_size_rx_; + config.buffer_size_tx = this->buffer_size_tx_; + const uint32_t start = millis(); watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); diff --git a/esphome/components/http_request/http_request_idf.h b/esphome/components/http_request/http_request_idf.h index 79f850a636..431794924b 100644 --- a/esphome/components/http_request/http_request_idf.h +++ b/esphome/components/http_request/http_request_idf.h @@ -24,8 +24,18 @@ class HttpContainerIDF : public HttpContainer { class HttpRequestIDF : public HttpRequestComponent { public: + void dump_config() override; + std::shared_ptr start(std::string url, std::string method, std::string body, std::list
headers) override; + + void set_buffer_size_rx(uint16_t buffer_size_rx) { this->buffer_size_rx_ = buffer_size_rx; } + void set_buffer_size_tx(uint16_t buffer_size_tx) { this->buffer_size_tx_ = buffer_size_tx; } + + protected: + // if zero ESP-IDF will use DEFAULT_HTTP_BUF_SIZE + uint16_t buffer_size_rx_{}; + uint16_t buffer_size_tx_{}; }; } // namespace http_request From 75635956cd707237f44aab63c652555d635e3428 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Thu, 25 Jul 2024 05:30:39 +1000 Subject: [PATCH 056/164] Give more info on import errors. (#7128) --- esphome/loader.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/esphome/loader.py b/esphome/loader.py index e0457eb425..9399c4cb31 100644 --- a/esphome/loader.py +++ b/esphome/loader.py @@ -1,17 +1,17 @@ -import logging -from typing import Callable, Optional, Any, ContextManager -from types import ModuleType -import importlib -import importlib.util -import importlib.resources -import importlib.abc -import sys -from pathlib import Path from dataclasses import dataclass +import importlib +import importlib.abc +import importlib.resources +import importlib.util +import logging +from pathlib import Path +import sys +from types import ModuleType +from typing import Any, Callable, ContextManager, Optional from esphome.const import SOURCE_FILE_EXTENSIONS -import esphome.core.config from esphome.core import CORE +import esphome.core.config from esphome.types import ConfigType _LOGGER = logging.getLogger(__name__) @@ -175,7 +175,11 @@ def _lookup_module(domain): try: module = importlib.import_module(f"esphome.components.{domain}") except ImportError as e: - if "No module named" not in str(e): + if "No module named" in str(e): + _LOGGER.error( + "Unable to import component %s: %s", domain, str(e), exc_info=False + ) + else: _LOGGER.error("Unable to import component %s:", domain, exc_info=True) return None except Exception: # pylint: disable=broad-except From 23ffc3ddfb1504a0f3f5ad7f3cc2f9ea1d3cddf6 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:12:04 +1000 Subject: [PATCH 057/164] [lvgl] base implementation (#7116) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 1 + esphome/components/lvgl/__init__.py | 212 ++++++++++ esphome/components/lvgl/defines.py | 487 ++++++++++++++++++++++ esphome/components/lvgl/font.cpp | 76 ++++ esphome/components/lvgl/helpers.py | 70 ++++ esphome/components/lvgl/label.py | 34 ++ esphome/components/lvgl/lv_validation.py | 170 ++++++++ esphome/components/lvgl/lvcode.py | 237 +++++++++++ esphome/components/lvgl/lvgl_esphome.cpp | 129 ++++++ esphome/components/lvgl/lvgl_esphome.h | 119 ++++++ esphome/components/lvgl/lvgl_hal.h | 21 + esphome/components/lvgl/obj.py | 22 + esphome/components/lvgl/schemas.py | 260 ++++++++++++ esphome/components/lvgl/types.py | 64 +++ esphome/components/lvgl/widget.py | 347 +++++++++++++++ esphome/core/defines.h | 3 + platformio.ini | 1 + tests/components/lvgl/common.yaml | 0 tests/components/lvgl/lvgl-package.yaml | 24 ++ tests/components/lvgl/test.esp32-ard.yaml | 30 ++ tests/components/lvgl/test.esp32-idf.yaml | 52 +++ 21 files changed, 2359 insertions(+) create mode 100644 esphome/components/lvgl/__init__.py create mode 100644 esphome/components/lvgl/defines.py create mode 100644 esphome/components/lvgl/font.cpp create mode 100644 esphome/components/lvgl/helpers.py create mode 100644 esphome/components/lvgl/label.py create mode 100644 esphome/components/lvgl/lv_validation.py create mode 100644 esphome/components/lvgl/lvcode.py create mode 100644 esphome/components/lvgl/lvgl_esphome.cpp create mode 100644 esphome/components/lvgl/lvgl_esphome.h create mode 100644 esphome/components/lvgl/lvgl_hal.h create mode 100644 esphome/components/lvgl/obj.py create mode 100644 esphome/components/lvgl/schemas.py create mode 100644 esphome/components/lvgl/types.py create mode 100644 esphome/components/lvgl/widget.py create mode 100644 tests/components/lvgl/common.yaml create mode 100644 tests/components/lvgl/lvgl-package.yaml create mode 100644 tests/components/lvgl/test.esp32-ard.yaml create mode 100644 tests/components/lvgl/test.esp32-idf.yaml diff --git a/CODEOWNERS b/CODEOWNERS index c5e144bdfa..2fc030453f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -217,6 +217,7 @@ esphome/components/lock/* @esphome/core esphome/components/logger/* @esphome/core esphome/components/ltr390/* @latonita @sjtrny esphome/components/ltr_als_ps/* @latonita +esphome/components/lvgl/* @clydebarrow esphome/components/m5stack_8angle/* @rnauber esphome/components/matrix_keypad/* @ssieb esphome/components/max31865/* @DAVe3283 diff --git a/esphome/components/lvgl/__init__.py b/esphome/components/lvgl/__init__.py new file mode 100644 index 0000000000..2f3bd69546 --- /dev/null +++ b/esphome/components/lvgl/__init__.py @@ -0,0 +1,212 @@ +import logging + +import esphome.codegen as cg +from esphome.components.display import Display +import esphome.config_validation as cv +from esphome.const import ( + CONF_AUTO_CLEAR_ENABLED, + CONF_BUFFER_SIZE, + CONF_ID, + CONF_LAMBDA, + CONF_PAGES, +) +from esphome.core import CORE, ID, Lambda +from esphome.cpp_generator import MockObj +from esphome.final_validate import full_config +from esphome.helpers import write_file_if_changed + +from . import defines as df, helpers, lv_validation as lvalid +from .label import label_spec +from .lvcode import ConstantLiteral, LvContext + +# from .menu import menu_spec +from .obj import obj_spec +from .schemas import WIDGET_TYPES, any_widget_schema, obj_schema +from .types import FontEngine, LvglComponent, lv_disp_t_ptr, lv_font_t, lvgl_ns +from .widget import LvScrActType, Widget, add_widgets, set_obj_properties + +DOMAIN = "lvgl" +DEPENDENCIES = ("display",) +AUTO_LOAD = ("key_provider",) +CODEOWNERS = ("@clydebarrow",) +LOGGER = logging.getLogger(__name__) + +for widg in ( + label_spec, + obj_spec, +): + WIDGET_TYPES[widg.name] = widg + +lv_scr_act_spec = LvScrActType() +lv_scr_act = Widget.create( + None, ConstantLiteral("lv_scr_act()"), lv_scr_act_spec, {}, parent=None +) + +WIDGET_SCHEMA = any_widget_schema() + + +async def add_init_lambda(lv_component, init): + if init: + lamb = await cg.process_lambda(Lambda(init), [(lv_disp_t_ptr, "lv_disp")]) + cg.add(lv_component.add_init_lambda(lamb)) + + +lv_defines = {} # Dict of #defines to provide as build flags + + +def add_define(macro, value="1"): + if macro in lv_defines and lv_defines[macro] != value: + LOGGER.error( + "Redefinition of %s - was %s now %s", macro, lv_defines[macro], value + ) + lv_defines[macro] = value + + +def as_macro(macro, value): + if value is None: + return f"#define {macro}" + return f"#define {macro} {value}" + + +LV_CONF_FILENAME = "lv_conf.h" +LV_CONF_H_FORMAT = """\ +#pragma once +{} +""" + + +def generate_lv_conf_h(): + definitions = [as_macro(m, v) for m, v in lv_defines.items()] + definitions.sort() + return LV_CONF_H_FORMAT.format("\n".join(definitions)) + + +def final_validation(config): + global_config = full_config.get() + for display_id in config[df.CONF_DISPLAYS]: + path = global_config.get_path_for_id(display_id)[:-1] + display = global_config.get_config_for_path(path) + if CONF_LAMBDA in display: + raise cv.Invalid("Using lambda: in display config not compatible with LVGL") + if display[CONF_AUTO_CLEAR_ENABLED]: + raise cv.Invalid( + "Using auto_clear_enabled: true in display config not compatible with LVGL" + ) + buffer_frac = config[CONF_BUFFER_SIZE] + if not CORE.is_host and buffer_frac > 0.5 and "psram" not in global_config: + LOGGER.warning("buffer_size: may need to be reduced without PSRAM") + + +async def to_code(config): + cg.add_library("lvgl/lvgl", "8.4.0") + CORE.add_define("USE_LVGL") + # suppress default enabling of extra widgets + add_define("_LV_KCONFIG_PRESENT") + # Always enable - lots of things use it. + add_define("LV_DRAW_COMPLEX", "1") + add_define("LV_TICK_CUSTOM", "1") + add_define("LV_TICK_CUSTOM_INCLUDE", '"esphome/components/lvgl/lvgl_hal.h"') + add_define("LV_TICK_CUSTOM_SYS_TIME_EXPR", "(lv_millis())") + add_define("LV_MEM_CUSTOM", "1") + add_define("LV_MEM_CUSTOM_ALLOC", "lv_custom_mem_alloc") + add_define("LV_MEM_CUSTOM_FREE", "lv_custom_mem_free") + add_define("LV_MEM_CUSTOM_REALLOC", "lv_custom_mem_realloc") + add_define("LV_MEM_CUSTOM_INCLUDE", '"esphome/components/lvgl/lvgl_hal.h"') + + add_define("LV_LOG_LEVEL", f"LV_LOG_LEVEL_{config[df.CONF_LOG_LEVEL]}") + add_define("LV_COLOR_DEPTH", config[df.CONF_COLOR_DEPTH]) + for font in helpers.lv_fonts_used: + add_define(f"LV_FONT_{font.upper()}") + + if config[df.CONF_COLOR_DEPTH] == 16: + add_define( + "LV_COLOR_16_SWAP", + "1" if config[df.CONF_BYTE_ORDER] == "big_endian" else "0", + ) + add_define( + "LV_COLOR_CHROMA_KEY", + await lvalid.lv_color.process(config[df.CONF_TRANSPARENCY_KEY]), + ) + CORE.add_build_flag("-Isrc") + + cg.add_global(lvgl_ns.using) + lv_component = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(lv_component, config) + Widget.create(config[CONF_ID], lv_component, WIDGET_TYPES[df.CONF_OBJ], config) + for display in config[df.CONF_DISPLAYS]: + cg.add(lv_component.add_display(await cg.get_variable(display))) + + frac = config[CONF_BUFFER_SIZE] + if frac >= 0.75: + frac = 1 + elif frac >= 0.375: + frac = 2 + elif frac > 0.19: + frac = 4 + else: + frac = 8 + cg.add(lv_component.set_buffer_frac(int(frac))) + cg.add(lv_component.set_full_refresh(config[df.CONF_FULL_REFRESH])) + + for font in helpers.esphome_fonts_used: + await cg.get_variable(font) + cg.new_Pvariable(ID(f"{font}_engine", True, type=FontEngine), MockObj(font)) + default_font = config[df.CONF_DEFAULT_FONT] + if default_font not in helpers.lv_fonts_used: + add_define( + "LV_FONT_CUSTOM_DECLARE", f"LV_FONT_DECLARE(*{df.DEFAULT_ESPHOME_FONT})" + ) + globfont_id = ID( + df.DEFAULT_ESPHOME_FONT, + True, + type=lv_font_t.operator("ptr").operator("const"), + ) + cg.new_variable(globfont_id, MockObj(default_font)) + add_define("LV_FONT_DEFAULT", df.DEFAULT_ESPHOME_FONT) + else: + add_define("LV_FONT_DEFAULT", default_font) + + with LvContext(): + await set_obj_properties(lv_scr_act, config) + await add_widgets(lv_scr_act, config) + Widget.set_completed() + await add_init_lambda(lv_component, LvContext.get_code()) + for comp in helpers.lvgl_components_required: + CORE.add_define(f"USE_LVGL_{comp.upper()}") + for use in helpers.lv_uses: + add_define(f"LV_USE_{use.upper()}") + lv_conf_h_file = CORE.relative_src_path(LV_CONF_FILENAME) + write_file_if_changed(lv_conf_h_file, generate_lv_conf_h()) + CORE.add_build_flag("-DLV_CONF_H=1") + CORE.add_build_flag(f'-DLV_CONF_PATH="{LV_CONF_FILENAME}"') + + +def display_schema(config): + value = cv.ensure_list(cv.use_id(Display))(config) + return value or [cv.use_id(Display)(config)] + + +FINAL_VALIDATE_SCHEMA = final_validation + +CONFIG_SCHEMA = ( + cv.polling_component_schema("1s") + .extend(obj_schema("obj")) + .extend( + { + cv.GenerateID(CONF_ID): cv.declare_id(LvglComponent), + cv.GenerateID(df.CONF_DISPLAYS): display_schema, + cv.Optional(df.CONF_COLOR_DEPTH, default=16): cv.one_of(16), + cv.Optional(df.CONF_DEFAULT_FONT, default="montserrat_14"): lvalid.lv_font, + cv.Optional(df.CONF_FULL_REFRESH, default=False): cv.boolean, + cv.Optional(CONF_BUFFER_SIZE, default="100%"): cv.percentage, + cv.Optional(df.CONF_LOG_LEVEL, default="WARN"): cv.one_of( + *df.LOG_LEVELS, upper=True + ), + cv.Optional(df.CONF_BYTE_ORDER, default="big_endian"): cv.one_of( + "big_endian", "little_endian" + ), + cv.Optional(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA), + cv.Optional(df.CONF_TRANSPARENCY_KEY, default=0x000400): lvalid.lv_color, + } + ) +).add_extra(cv.has_at_least_one_key(CONF_PAGES, df.CONF_WIDGETS)) diff --git a/esphome/components/lvgl/defines.py b/esphome/components/lvgl/defines.py new file mode 100644 index 0000000000..50bdac3865 --- /dev/null +++ b/esphome/components/lvgl/defines.py @@ -0,0 +1,487 @@ +""" +This is the base of the import tree for LVGL. It contains constant definitions used elsewhere. +Constants already defined in esphome.const are not duplicated here and must be imported where used. + +""" + +from esphome import codegen as cg, config_validation as cv +from esphome.core import ID, Lambda +from esphome.cpp_types import uint32 +from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor + +from .lvcode import ConstantLiteral + + +class LValidator: + """ + A validator for a particular type used in LVGL. Usable in configs as a validator, also + has `process()` to convert a value during code generation + """ + + def __init__(self, validator, rtype, idtype=None, idexpr=None, retmapper=None): + self.validator = validator + self.rtype = rtype + self.idtype = idtype + self.idexpr = idexpr + self.retmapper = retmapper + + def __call__(self, value): + if isinstance(value, cv.Lambda): + return cv.returning_lambda(value) + if self.idtype is not None and isinstance(value, ID): + return cv.use_id(self.idtype)(value) + return self.validator(value) + + async def process(self, value, args=()): + if value is None: + return None + if isinstance(value, Lambda): + return cg.RawExpression( + f"{await cg.process_lambda(value, args, return_type=self.rtype)}()" + ) + if self.idtype is not None and isinstance(value, ID): + return cg.RawExpression(f"{value}->{self.idexpr}") + if self.retmapper is not None: + return self.retmapper(value) + return cg.safe_exp(value) + + +class LvConstant(LValidator): + """ + Allow one of a list of choices, mapped to upper case, and prepend the choice with the prefix. + It's also permitted to include the prefix in the value + The property `one_of` has the single case validator, and `several_of` allows a list of constants. + """ + + def __init__(self, prefix: str, *choices): + self.prefix = prefix + self.choices = choices + prefixed_choices = [prefix + v for v in choices] + prefixed_validator = cv.one_of(*prefixed_choices, upper=True) + + @schema_extractor("one_of") + def validator(value): + if value == SCHEMA_EXTRACT: + return self.choices + if isinstance(value, str) and value.startswith(self.prefix): + return prefixed_validator(value) + return self.prefix + cv.one_of(*choices, upper=True)(value) + + super().__init__(validator, rtype=uint32) + self.one_of = LValidator(validator, uint32, retmapper=self.mapper) + self.several_of = LValidator( + cv.ensure_list(self.one_of), uint32, retmapper=self.mapper + ) + + def mapper(self, value, args=()): + if isinstance(value, list): + value = "|".join(value) + return ConstantLiteral(value) + + def extend(self, *choices): + """ + Extend an LVCconstant with additional choices. + :param choices: The extra choices + :return: A new LVConstant instance + """ + return LvConstant(self.prefix, *(self.choices + choices)) + + +# Widgets +CONF_LABEL = "label" + +# Parts +CONF_MAIN = "main" +CONF_SCROLLBAR = "scrollbar" +CONF_INDICATOR = "indicator" +CONF_KNOB = "knob" +CONF_SELECTED = "selected" +CONF_ITEMS = "items" +CONF_TICKS = "ticks" +CONF_TICK_STYLE = "tick_style" +CONF_CURSOR = "cursor" +CONF_TEXTAREA_PLACEHOLDER = "textarea_placeholder" + +LV_FONTS = list(f"montserrat_{s}" for s in range(8, 50, 2)) + [ + "dejavu_16_persian_hebrew", + "simsun_16_cjk", + "unscii_8", + "unscii_16", +] + +LV_EVENT = { + "PRESS": "PRESSED", + "SHORT_CLICK": "SHORT_CLICKED", + "LONG_PRESS": "LONG_PRESSED", + "LONG_PRESS_REPEAT": "LONG_PRESSED_REPEAT", + "CLICK": "CLICKED", + "RELEASE": "RELEASED", + "SCROLL_BEGIN": "SCROLL_BEGIN", + "SCROLL_END": "SCROLL_END", + "SCROLL": "SCROLL", + "FOCUS": "FOCUSED", + "DEFOCUS": "DEFOCUSED", + "READY": "READY", + "CANCEL": "CANCEL", +} + +LV_EVENT_TRIGGERS = tuple(f"on_{x.lower()}" for x in LV_EVENT) + + +LV_ANIM = LvConstant( + "LV_SCR_LOAD_ANIM_", + "NONE", + "OVER_LEFT", + "OVER_RIGHT", + "OVER_TOP", + "OVER_BOTTOM", + "MOVE_LEFT", + "MOVE_RIGHT", + "MOVE_TOP", + "MOVE_BOTTOM", + "FADE_IN", + "FADE_OUT", + "OUT_LEFT", + "OUT_RIGHT", + "OUT_TOP", + "OUT_BOTTOM", +) + +LOG_LEVELS = ( + "TRACE", + "INFO", + "WARN", + "ERROR", + "USER", + "NONE", +) + +LV_LONG_MODES = LvConstant( + "LV_LABEL_LONG_", + "WRAP", + "DOT", + "SCROLL", + "SCROLL_CIRCULAR", + "CLIP", +) + +STATES = ( + "default", + "checked", + "focused", + "focus_key", + "edited", + "hovered", + "pressed", + "scrolled", + "disabled", + "user_1", + "user_2", + "user_3", + "user_4", +) + +PARTS = ( + CONF_MAIN, + CONF_SCROLLBAR, + CONF_INDICATOR, + CONF_KNOB, + CONF_SELECTED, + CONF_ITEMS, + CONF_TICKS, + CONF_CURSOR, + CONF_TEXTAREA_PLACEHOLDER, +) + +KEYBOARD_MODES = LvConstant( + "LV_KEYBOARD_MODE_", + "TEXT_LOWER", + "TEXT_UPPER", + "SPECIAL", + "NUMBER", +) +ROLLER_MODES = LvConstant("LV_ROLLER_MODE_", "NORMAL", "INFINITE") +DIRECTIONS = LvConstant("LV_DIR_", "LEFT", "RIGHT", "BOTTOM", "TOP") +TILE_DIRECTIONS = DIRECTIONS.extend("HOR", "VER", "ALL") +CHILD_ALIGNMENTS = LvConstant( + "LV_ALIGN_", + "TOP_LEFT", + "TOP_MID", + "TOP_RIGHT", + "LEFT_MID", + "CENTER", + "RIGHT_MID", + "BOTTOM_LEFT", + "BOTTOM_MID", + "BOTTOM_RIGHT", +) + +SIBLING_ALIGNMENTS = LvConstant( + "LV_ALIGN_", + "OUT_LEFT_TOP", + "OUT_TOP_LEFT", + "OUT_TOP_MID", + "OUT_TOP_RIGHT", + "OUT_RIGHT_TOP", + "OUT_LEFT_MID", + "OUT_RIGHT_MID", + "OUT_LEFT_BOTTOM", + "OUT_BOTTOM_LEFT", + "OUT_BOTTOM_MID", + "OUT_BOTTOM_RIGHT", + "OUT_RIGHT_BOTTOM", +) +ALIGN_ALIGNMENTS = CHILD_ALIGNMENTS.extend(*SIBLING_ALIGNMENTS.choices) + +FLEX_FLOWS = LvConstant( + "LV_FLEX_FLOW_", + "ROW", + "COLUMN", + "ROW_WRAP", + "COLUMN_WRAP", + "ROW_REVERSE", + "COLUMN_REVERSE", + "ROW_WRAP_REVERSE", + "COLUMN_WRAP_REVERSE", +) + +OBJ_FLAGS = ( + "hidden", + "clickable", + "click_focusable", + "checkable", + "scrollable", + "scroll_elastic", + "scroll_momentum", + "scroll_one", + "scroll_chain_hor", + "scroll_chain_ver", + "scroll_chain", + "scroll_on_focus", + "scroll_with_arrow", + "snappable", + "press_lock", + "event_bubble", + "gesture_bubble", + "adv_hittest", + "ignore_layout", + "floating", + "overflow_visible", + "layout_1", + "layout_2", + "widget_1", + "widget_2", + "user_1", + "user_2", + "user_3", + "user_4", +) + +ARC_MODES = LvConstant("LV_ARC_MODE_", "NORMAL", "REVERSE", "SYMMETRICAL") +BAR_MODES = LvConstant("LV_BAR_MODE_", "NORMAL", "SYMMETRICAL", "RANGE") + +BTNMATRIX_CTRLS = ( + "HIDDEN", + "NO_REPEAT", + "DISABLED", + "CHECKABLE", + "CHECKED", + "CLICK_TRIG", + "POPOVER", + "RECOLOR", + "CUSTOM_1", + "CUSTOM_2", +) + +LV_BASE_ALIGNMENTS = ( + "START", + "CENTER", + "END", +) +LV_CELL_ALIGNMENTS = LvConstant( + "LV_GRID_ALIGN_", + *LV_BASE_ALIGNMENTS, +) +LV_GRID_ALIGNMENTS = LV_CELL_ALIGNMENTS.extend( + "STRETCH", + "SPACE_EVENLY", + "SPACE_AROUND", + "SPACE_BETWEEN", +) + +LV_FLEX_ALIGNMENTS = LvConstant( + "LV_FLEX_ALIGN_", + *LV_BASE_ALIGNMENTS, + "SPACE_EVENLY", + "SPACE_AROUND", + "SPACE_BETWEEN", +) + +LV_MENU_MODES = LvConstant( + "LV_MENU_HEADER_", + "TOP_FIXED", + "TOP_UNFIXED", + "BOTTOM_FIXED", +) + +LV_CHART_TYPES = ( + "NONE", + "LINE", + "BAR", + "SCATTER", +) +LV_CHART_AXES = ( + "PRIMARY_Y", + "SECONDARY_Y", + "PRIMARY_X", + "SECONDARY_X", +) + +CONF_ACCEPTED_CHARS = "accepted_chars" +CONF_ADJUSTABLE = "adjustable" +CONF_ALIGN = "align" +CONF_ALIGN_TO = "align_to" +CONF_ANGLE_RANGE = "angle_range" +CONF_ANIMATED = "animated" +CONF_ANIMATION = "animation" +CONF_ANTIALIAS = "antialias" +CONF_ARC_LENGTH = "arc_length" +CONF_AUTO_START = "auto_start" +CONF_BACKGROUND_STYLE = "background_style" +CONF_DECIMAL_PLACES = "decimal_places" +CONF_COLUMN = "column" +CONF_DIGITS = "digits" +CONF_DISP_BG_COLOR = "disp_bg_color" +CONF_DISP_BG_IMAGE = "disp_bg_image" +CONF_BODY = "body" +CONF_BUTTONS = "buttons" +CONF_BYTE_ORDER = "byte_order" +CONF_CHANGE_RATE = "change_rate" +CONF_CLOSE_BUTTON = "close_button" +CONF_COLOR_DEPTH = "color_depth" +CONF_COLOR_END = "color_end" +CONF_COLOR_START = "color_start" +CONF_CONTROL = "control" +CONF_DEFAULT = "default" +CONF_DEFAULT_FONT = "default_font" +CONF_DIR = "dir" +CONF_DISPLAYS = "displays" +CONF_END_ANGLE = "end_angle" +CONF_END_VALUE = "end_value" +CONF_ENTER_BUTTON = "enter_button" +CONF_ENTRIES = "entries" +CONF_FLAGS = "flags" +CONF_FLEX_FLOW = "flex_flow" +CONF_FLEX_ALIGN_MAIN = "flex_align_main" +CONF_FLEX_ALIGN_CROSS = "flex_align_cross" +CONF_FLEX_ALIGN_TRACK = "flex_align_track" +CONF_FLEX_GROW = "flex_grow" +CONF_FULL_REFRESH = "full_refresh" +CONF_GRID_CELL_ROW_POS = "grid_cell_row_pos" +CONF_GRID_CELL_COLUMN_POS = "grid_cell_column_pos" +CONF_GRID_CELL_ROW_SPAN = "grid_cell_row_span" +CONF_GRID_CELL_COLUMN_SPAN = "grid_cell_column_span" +CONF_GRID_CELL_X_ALIGN = "grid_cell_x_align" +CONF_GRID_CELL_Y_ALIGN = "grid_cell_y_align" +CONF_GRID_COLUMN_ALIGN = "grid_column_align" +CONF_GRID_COLUMNS = "grid_columns" +CONF_GRID_ROW_ALIGN = "grid_row_align" +CONF_GRID_ROWS = "grid_rows" +CONF_HEADER_MODE = "header_mode" +CONF_HOME = "home" +CONF_INDICATORS = "indicators" +CONF_KEY_CODE = "key_code" +CONF_LABEL_GAP = "label_gap" +CONF_LAYOUT = "layout" +CONF_LEFT_BUTTON = "left_button" +CONF_LINE_WIDTH = "line_width" +CONF_LOG_LEVEL = "log_level" +CONF_LONG_PRESS_TIME = "long_press_time" +CONF_LONG_PRESS_REPEAT_TIME = "long_press_repeat_time" +CONF_LVGL_ID = "lvgl_id" +CONF_LONG_MODE = "long_mode" +CONF_MAJOR = "major" +CONF_MSGBOXES = "msgboxes" +CONF_OBJ = "obj" +CONF_OFFSET_X = "offset_x" +CONF_OFFSET_Y = "offset_y" +CONF_ONE_LINE = "one_line" +CONF_ON_SELECT = "on_select" +CONF_ONE_CHECKED = "one_checked" +CONF_NEXT = "next" +CONF_PAGE_WRAP = "page_wrap" +CONF_PASSWORD_MODE = "password_mode" +CONF_PIVOT_X = "pivot_x" +CONF_PIVOT_Y = "pivot_y" +CONF_PLACEHOLDER_TEXT = "placeholder_text" +CONF_POINTS = "points" +CONF_PREVIOUS = "previous" +CONF_REPEAT_COUNT = "repeat_count" +CONF_R_MOD = "r_mod" +CONF_RECOLOR = "recolor" +CONF_RIGHT_BUTTON = "right_button" +CONF_ROLLOVER = "rollover" +CONF_ROOT_BACK_BTN = "root_back_btn" +CONF_ROWS = "rows" +CONF_SCALES = "scales" +CONF_SCALE_LINES = "scale_lines" +CONF_SCROLLBAR_MODE = "scrollbar_mode" +CONF_SELECTED_INDEX = "selected_index" +CONF_SHOW_SNOW = "show_snow" +CONF_SPIN_TIME = "spin_time" +CONF_SRC = "src" +CONF_START_ANGLE = "start_angle" +CONF_START_VALUE = "start_value" +CONF_STATES = "states" +CONF_STRIDE = "stride" +CONF_STYLE = "style" +CONF_STYLE_ID = "style_id" +CONF_SKIP = "skip" +CONF_SYMBOL = "symbol" +CONF_TAB_ID = "tab_id" +CONF_TABS = "tabs" +CONF_TEXT = "text" +CONF_TILE = "tile" +CONF_TILE_ID = "tile_id" +CONF_TILES = "tiles" +CONF_TITLE = "title" +CONF_TOP_LAYER = "top_layer" +CONF_TRANSPARENCY_KEY = "transparency_key" +CONF_THEME = "theme" +CONF_VISIBLE_ROW_COUNT = "visible_row_count" +CONF_WIDGET = "widget" +CONF_WIDGETS = "widgets" +CONF_X = "x" +CONF_Y = "y" +CONF_ZOOM = "zoom" + +# Keypad keys + +LV_KEYS = LvConstant( + "LV_KEY_", + "UP", + "DOWN", + "RIGHT", + "LEFT", + "ESC", + "DEL", + "BACKSPACE", + "ENTER", + "NEXT", + "PREV", + "HOME", + "END", +) + + +# list of widgets and the parts allowed +WIDGET_PARTS = { + CONF_LABEL: (CONF_MAIN, CONF_SCROLLBAR, CONF_SELECTED), + CONF_OBJ: (CONF_MAIN,), +} + +DEFAULT_ESPHOME_FONT = "esphome_lv_default_font" + + +def join_enums(enums, prefix=""): + return "|".join(f"(int){prefix}{e.upper()}" for e in enums) diff --git a/esphome/components/lvgl/font.cpp b/esphome/components/lvgl/font.cpp new file mode 100644 index 0000000000..9c172f07f5 --- /dev/null +++ b/esphome/components/lvgl/font.cpp @@ -0,0 +1,76 @@ +#include "lvgl_esphome.h" + +#ifdef USE_LVGL_FONT +namespace esphome { +namespace lvgl { + +static const uint8_t *get_glyph_bitmap(const lv_font_t *font, uint32_t unicode_letter) { + auto *fe = (FontEngine *) font->dsc; + const auto *gd = fe->get_glyph_data(unicode_letter); + if (gd == nullptr) + return nullptr; + // esph_log_d(TAG, "Returning bitmap @ %X", (uint32_t)gd->data); + + return gd->data; +} + +static bool get_glyph_dsc_cb(const lv_font_t *font, lv_font_glyph_dsc_t *dsc, uint32_t unicode_letter, uint32_t next) { + auto *fe = (FontEngine *) font->dsc; + const auto *gd = fe->get_glyph_data(unicode_letter); + if (gd == nullptr) + return false; + dsc->adv_w = gd->offset_x + gd->width; + dsc->ofs_x = gd->offset_x; + dsc->ofs_y = fe->height - gd->height - gd->offset_y - fe->baseline; + dsc->box_w = gd->width; + dsc->box_h = gd->height; + dsc->is_placeholder = 0; + dsc->bpp = fe->bpp; + return true; +} + +FontEngine::FontEngine(font::Font *esp_font) : font_(esp_font) { + this->bpp = esp_font->get_bpp(); + this->lv_font_.dsc = this; + this->lv_font_.line_height = this->height = esp_font->get_height(); + this->lv_font_.base_line = this->baseline = this->lv_font_.line_height - esp_font->get_baseline(); + this->lv_font_.get_glyph_dsc = get_glyph_dsc_cb; + this->lv_font_.get_glyph_bitmap = get_glyph_bitmap; + this->lv_font_.subpx = LV_FONT_SUBPX_NONE; + this->lv_font_.underline_position = -1; + this->lv_font_.underline_thickness = 1; +} + +const lv_font_t *FontEngine::get_lv_font() { return &this->lv_font_; } + +const font::GlyphData *FontEngine::get_glyph_data(uint32_t unicode_letter) { + if (unicode_letter == last_letter_) + return this->last_data_; + uint8_t unicode[5]; + memset(unicode, 0, sizeof unicode); + if (unicode_letter > 0xFFFF) { + unicode[0] = 0xF0 + ((unicode_letter >> 18) & 0x7); + unicode[1] = 0x80 + ((unicode_letter >> 12) & 0x3F); + unicode[2] = 0x80 + ((unicode_letter >> 6) & 0x3F); + unicode[3] = 0x80 + (unicode_letter & 0x3F); + } else if (unicode_letter > 0x7FF) { + unicode[0] = 0xE0 + ((unicode_letter >> 12) & 0xF); + unicode[1] = 0x80 + ((unicode_letter >> 6) & 0x3F); + unicode[2] = 0x80 + (unicode_letter & 0x3F); + } else if (unicode_letter > 0x7F) { + unicode[0] = 0xC0 + ((unicode_letter >> 6) & 0x1F); + unicode[1] = 0x80 + (unicode_letter & 0x3F); + } else { + unicode[0] = unicode_letter; + } + int match_length; + int glyph_n = this->font_->match_next_glyph(unicode, &match_length); + if (glyph_n < 0) + return nullptr; + this->last_data_ = this->font_->get_glyphs()[glyph_n].get_glyph_data(); + this->last_letter_ = unicode_letter; + return this->last_data_; +} +} // namespace lvgl +} // namespace esphome +#endif // USES_LVGL_FONT diff --git a/esphome/components/lvgl/helpers.py b/esphome/components/lvgl/helpers.py new file mode 100644 index 0000000000..c8d4948fb1 --- /dev/null +++ b/esphome/components/lvgl/helpers.py @@ -0,0 +1,70 @@ +import re + +from esphome import config_validation as cv +from esphome.config import Config +from esphome.const import CONF_ARGS, CONF_FORMAT +from esphome.core import CORE, ID +from esphome.yaml_util import ESPHomeDataBase + +lv_uses = { + "USER_DATA", + "LOG", + "STYLE", + "FONT_PLACEHOLDER", + "THEME_DEFAULT", +} + + +def add_lv_use(*names): + for name in names: + lv_uses.add(name) + + +lv_fonts_used = set() +esphome_fonts_used = set() +REQUIRED_COMPONENTS = {} +lvgl_components_required = set() + + +def validate_printf(value): + cfmt = r""" + ( # start of capture group 1 + % # literal "%" + (?:[-+0 #]{0,5}) # optional flags + (?:\d+|\*)? # width + (?:\.(?:\d+|\*))? # precision + (?:h|l|ll|w|I|I32|I64)? # size + [cCdiouxXeEfgGaAnpsSZ] # type + ) + """ # noqa + matches = re.findall(cfmt, value[CONF_FORMAT], flags=re.X) + if len(matches) != len(value[CONF_ARGS]): + raise cv.Invalid( + f"Found {len(matches)} printf-patterns ({', '.join(matches)}), but {len(value[CONF_ARGS])} args were given!" + ) + return value + + +def get_line_marks(value) -> list: + """ + If possible, return a preprocessor directive to identify the line number where the given id was defined. + :param id: The id in question + :return: A list containing zero or more line directives + """ + path = None + if isinstance(value, ESPHomeDataBase): + path = value.esp_range + elif isinstance(value, ID) and isinstance(CORE.config, Config): + path = CORE.config.get_path_for_id(value)[:-1] + path = CORE.config.get_deepest_document_range_for_path(path) + if path is None: + return [] + return [path.start_mark.as_line_directive] + + +def requires_component(comp): + def validator(value): + lvgl_components_required.add(comp) + return cv.requires_component(comp)(value) + + return validator diff --git a/esphome/components/lvgl/label.py b/esphome/components/lvgl/label.py new file mode 100644 index 0000000000..5c4ae6ab0d --- /dev/null +++ b/esphome/components/lvgl/label.py @@ -0,0 +1,34 @@ +import esphome.config_validation as cv + +from .defines import CONF_LABEL, CONF_LONG_MODE, CONF_RECOLOR, CONF_TEXT, LV_LONG_MODES +from .lv_validation import lv_bool, lv_text +from .schemas import TEXT_SCHEMA +from .types import lv_label_t +from .widget import Widget, WidgetType + + +class LabelType(WidgetType): + def __init__(self): + super().__init__( + CONF_LABEL, + TEXT_SCHEMA.extend( + { + cv.Optional(CONF_RECOLOR): lv_bool, + cv.Optional(CONF_LONG_MODE): LV_LONG_MODES.one_of, + } + ), + ) + + @property + def w_type(self): + return lv_label_t + + async def to_code(self, w: Widget, config): + """For a text object, create and set text""" + if value := config.get(CONF_TEXT): + w.set_property(CONF_TEXT, await lv_text.process(value)) + w.set_property(CONF_LONG_MODE, config) + w.set_property(CONF_RECOLOR, config) + + +label_spec = LabelType() diff --git a/esphome/components/lvgl/lv_validation.py b/esphome/components/lvgl/lv_validation.py new file mode 100644 index 0000000000..1de63c30ce --- /dev/null +++ b/esphome/components/lvgl/lv_validation.py @@ -0,0 +1,170 @@ +import esphome.codegen as cg +from esphome.components.binary_sensor import BinarySensor +from esphome.components.color import ColorStruct +from esphome.components.font import Font +from esphome.components.sensor import Sensor +from esphome.components.text_sensor import TextSensor +import esphome.config_validation as cv +from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT +from esphome.core import HexInt +from esphome.cpp_generator import MockObj +from esphome.helpers import cpp_string_escape +from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor + +from . import types as ty +from .defines import LV_FONTS, LValidator, LvConstant +from .helpers import ( + esphome_fonts_used, + lv_fonts_used, + lvgl_components_required, + requires_component, +) +from .lvcode import ConstantLiteral, lv_expr +from .types import lv_font_t + + +@schema_extractor("one_of") +def color(value): + if value == SCHEMA_EXTRACT: + return ["hex color value", "color ID"] + if isinstance(value, int): + return value + return cv.use_id(ColorStruct)(value) + + +def color_retmapper(value): + if isinstance(value, cv.Lambda): + return cv.returning_lambda(value) + if isinstance(value, int): + hexval = HexInt(value) + return lv_expr.color_hex(hexval) + # Must be an id + lvgl_components_required.add(CONF_COLOR) + return lv_expr.color_from(MockObj(value)) + + +def pixels_or_percent(value): + """A length in one axis - either a number (pixels) or a percentage""" + if value == SCHEMA_EXTRACT: + return ["pixels", "..%"] + if isinstance(value, int): + return str(cv.int_(value)) + # Will throw an exception if not a percentage. + return f"lv_pct({int(cv.percentage(value) * 100)})" + + +def zoom(value): + value = cv.float_range(0.1, 10.0)(value) + return int(value * 256) + + +def angle(value): + """ + Validation for an angle in degrees, converted to an integer representing 0.1deg units + :param value: The input in the range 0..360 + :return: An angle in 1/10 degree units. + """ + return int(cv.float_range(0.0, 360.0)(cv.angle(value)) * 10) + + +@schema_extractor("one_of") +def size(value): + """A size in one axis - one of "size_content", a number (pixels) or a percentage""" + if value == SCHEMA_EXTRACT: + return ["size_content", "pixels", "..%"] + if isinstance(value, str) and value.lower().endswith("px"): + value = cv.int_(value[:-2]) + if isinstance(value, str) and not value.endswith("%"): + if value.upper() == "SIZE_CONTENT": + return "LV_SIZE_CONTENT" + raise cv.Invalid("must be 'size_content', a pixel position or a percentage") + if isinstance(value, int): + return str(cv.int_(value)) + # Will throw an exception if not a percentage. + return f"lv_pct({int(cv.percentage(value) * 100)})" + + +@schema_extractor("one_of") +def opacity(value): + consts = LvConstant("LV_OPA_", "TRANSP", "COVER") + if value == SCHEMA_EXTRACT: + return consts.choices + value = cv.Any(cv.percentage, consts.one_of)(value) + if isinstance(value, float): + return int(value * 255) + return value + + +def stop_value(value): + return cv.int_range(0, 255)(value) + + +lv_color = LValidator(color, ty.lv_color_t, retmapper=color_retmapper) +lv_bool = LValidator(cv.boolean, cg.bool_, BinarySensor, "get_state()") + + +def lvms_validator_(value): + if value == "never": + value = "2147483647ms" + return cv.positive_time_period_milliseconds(value) + + +lv_milliseconds = LValidator( + lvms_validator_, + cg.int32, + retmapper=lambda x: x.total_milliseconds, +) + + +class TextValidator(LValidator): + def __init__(self): + super().__init__( + cv.string, + cg.const_char_ptr, + TextSensor, + "get_state().c_str()", + lambda s: cg.safe_exp(f"{s}"), + ) + + def __call__(self, value): + if isinstance(value, dict): + return value + return super().__call__(value) + + async def process(self, value, args=()): + if isinstance(value, dict): + args = [str(x) for x in value[CONF_ARGS]] + arg_expr = cg.RawExpression(",".join(args)) + format_str = cpp_string_escape(value[CONF_FORMAT]) + return f"str_sprintf({format_str}, {arg_expr}).c_str()" + return await super().process(value, args) + + +lv_text = TextValidator() +lv_float = LValidator(cv.float_, cg.float_, Sensor, "get_state()") +lv_int = LValidator(cv.int_, cg.int_, Sensor, "get_state()") + + +class LvFont(LValidator): + def __init__(self): + def lv_builtin_font(value): + fontval = cv.one_of(*LV_FONTS, lower=True)(value) + lv_fonts_used.add(fontval) + return "&lv_font_" + fontval + + def validator(value): + if value == SCHEMA_EXTRACT: + return LV_FONTS + if isinstance(value, str) and value.lower() in LV_FONTS: + return lv_builtin_font(value) + fontval = cv.use_id(Font)(value) + esphome_fonts_used.add(fontval) + return requires_component("font")(f"{fontval}_engine->get_lv_font()") + + super().__init__(validator, lv_font_t) + + async def process(self, value, args=()): + return ConstantLiteral(value) + + +lv_font = LvFont() diff --git a/esphome/components/lvgl/lvcode.py b/esphome/components/lvgl/lvcode.py new file mode 100644 index 0000000000..13b4862b4d --- /dev/null +++ b/esphome/components/lvgl/lvcode.py @@ -0,0 +1,237 @@ +import abc +import logging +from typing import Union + +from esphome import codegen as cg +from esphome.core import ID, Lambda +from esphome.cpp_generator import ( + AssignmentExpression, + CallExpression, + Expression, + LambdaExpression, + Literal, + MockObj, + RawExpression, + RawStatement, + SafeExpType, + Statement, + VariableDeclarationExpression, + statement, +) + +from .helpers import get_line_marks + +_LOGGER = logging.getLogger(__name__) + + +class CodeContext(abc.ABC): + """ + A class providing a context for code generation. Generated code will be added to the + current context. A new context will stack on the current context, and restore it + when done. Used with the `with` statement. + """ + + code_context = None + + @abc.abstractmethod + def add(self, expression: Union[Expression, Statement]): + pass + + @staticmethod + def append(expression: Union[Expression, Statement]): + if CodeContext.code_context is not None: + CodeContext.code_context.add(expression) + return expression + + def __init__(self): + self.previous: Union[CodeContext | None] = None + + def __enter__(self): + self.previous = CodeContext.code_context + CodeContext.code_context = self + + def __exit__(self, *args): + CodeContext.code_context = self.previous + + +class MainContext(CodeContext): + """ + Code generation into the main() function + """ + + def add(self, expression: Union[Expression, Statement]): + return cg.add(expression) + + +class LvContext(CodeContext): + """ + Code generation into the LVGL initialisation code (called in `setup()`) + """ + + lv_init_code: list["Statement"] = [] + + @staticmethod + def lv_add(expression: Union[Expression, Statement]): + if isinstance(expression, Expression): + expression = statement(expression) + if not isinstance(expression, Statement): + raise ValueError( + f"Add '{expression}' must be expression or statement, not {type(expression)}" + ) + LvContext.lv_init_code.append(expression) + _LOGGER.debug("LV Adding: %s", expression) + return expression + + @staticmethod + def get_code(): + code = [] + for exp in LvContext.lv_init_code: + text = str(statement(exp)) + text = text.rstrip() + code.append(text) + return "\n".join(code) + "\n\n" + + def add(self, expression: Union[Expression, Statement]): + return LvContext.lv_add(expression) + + def set_style(self, prop): + return MockObj("lv_set_style_{prop}", "") + + +class LambdaContext(CodeContext): + """ + A context that will accumlate code for use in a lambda. + """ + + def __init__( + self, + parameters: list[tuple[SafeExpType, str]], + return_type: SafeExpType = None, + ): + super().__init__() + self.code_list: list[Statement] = [] + self.parameters = parameters + self.return_type = return_type + + def add(self, expression: Union[Expression, Statement]): + self.code_list.append(expression) + return expression + + async def code(self) -> LambdaExpression: + code_text = [] + for exp in self.code_list: + text = str(statement(exp)) + text = text.rstrip() + code_text.append(text) + return await cg.process_lambda( + Lambda("\n".join(code_text) + "\n\n"), + self.parameters, + return_type=self.return_type, + ) + + +class LocalVariable(MockObj): + """ + Create a local variable and enclose the code using it within a block. + """ + + def __init__(self, name, type, modifier=None, rhs=None): + base = ID(name, True, type) + super().__init__(base, "") + self.modifier = modifier + self.rhs = rhs + + def __enter__(self): + CodeContext.append(RawStatement("{")) + CodeContext.append( + VariableDeclarationExpression(self.base.type, self.modifier, self.base.id) + ) + if self.rhs is not None: + CodeContext.append(AssignmentExpression(None, "", self.base, self.rhs)) + return self.base + + def __exit__(self, *args): + CodeContext.append(RawStatement("}")) + + +class MockLv: + """ + A mock object that can be used to generate LVGL calls. + """ + + def __init__(self, base): + self.base = base + + def __getattr__(self, attr: str) -> "MockLv": + return MockLv(f"{self.base}{attr}") + + def append(self, expression): + CodeContext.append(expression) + + def __call__(self, *args: SafeExpType) -> "MockObj": + call = CallExpression(self.base, *args) + result = MockObj(call, "") + self.append(result) + return result + + def __str__(self): + return str(self.base) + + def __repr__(self): + return f"MockLv<{str(self.base)}>" + + def call(self, prop, *args): + call = CallExpression(RawExpression(f"{self.base}{prop}"), *args) + result = MockObj(call, "") + self.append(result) + return result + + def cond_if(self, expression: Expression): + CodeContext.append(RawExpression(f"if({expression}) {{")) + + def cond_else(self): + CodeContext.append(RawExpression("} else {")) + + def cond_endif(self): + CodeContext.append(RawExpression("}")) + + +class LvExpr(MockLv): + def __getattr__(self, attr: str) -> "MockLv": + return LvExpr(f"{self.base}{attr}") + + def append(self, expression): + pass + + +# Top level mock for generic lv_ calls to be recorded +lv = MockLv("lv_") +# Just generate an expression +lv_expr = LvExpr("lv_") +# Mock for lv_obj_ calls +lv_obj = MockLv("lv_obj_") + + +# equivalent to cg.add() for the lvgl init context +def lv_add(expression: Union[Expression, Statement]): + return CodeContext.append(expression) + + +def add_line_marks(where): + for mark in get_line_marks(where): + lv_add(cg.RawStatement(mark)) + + +def lv_assign(target, expression): + lv_add(RawExpression(f"{target} = {expression}")) + + +class ConstantLiteral(Literal): + __slots__ = ("constant",) + + def __init__(self, constant: str): + super().__init__() + self.constant = constant + + def __str__(self): + return self.constant diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp new file mode 100644 index 0000000000..bdaf8a4f18 --- /dev/null +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -0,0 +1,129 @@ +#include "esphome/core/defines.h" +#include "esphome/core/log.h" +#include "esphome/core/helpers.h" +#include "esphome/core/hal.h" +#include "lvgl_hal.h" +#include "lvgl_esphome.h" + +namespace esphome { +namespace lvgl { +static const char *const TAG = "lvgl"; + +lv_event_code_t lv_custom_event; // NOLINT +void LvglComponent::dump_config() { ESP_LOGCONFIG(TAG, "LVGL:"); } +void LvglComponent::draw_buffer_(const lv_area_t *area, const uint8_t *ptr) { + for (auto *display : this->displays_) { + display->draw_pixels_at(area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area), ptr, + display::COLOR_ORDER_RGB, LV_BITNESS, LV_COLOR_16_SWAP); + } +} + +void LvglComponent::flush_cb_(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { + auto now = millis(); + this->draw_buffer_(area, (const uint8_t *) color_p); + ESP_LOGV(TAG, "flush_cb, area=%d/%d, %d/%d took %dms", area->x1, area->y1, lv_area_get_width(area), + lv_area_get_height(area), (int) (millis() - now)); + lv_disp_flush_ready(disp_drv); +} + +void LvglComponent::setup() { + ESP_LOGCONFIG(TAG, "LVGL Setup starts"); +#if LV_USE_LOG + lv_log_register_print_cb(log_cb); +#endif + lv_init(); + lv_custom_event = static_cast(lv_event_register_id()); + auto *display = this->displays_[0]; + size_t buffer_pixels = display->get_width() * display->get_height() / this->buffer_frac_; + auto buf_bytes = buffer_pixels * LV_COLOR_DEPTH / 8; + auto *buf = lv_custom_mem_alloc(buf_bytes); + if (buf == nullptr) { + ESP_LOGE(TAG, "Malloc failed to allocate %zu bytes", buf_bytes); + this->mark_failed(); + this->status_set_error("Memory allocation failure"); + return; + } + lv_disp_draw_buf_init(&this->draw_buf_, buf, nullptr, buffer_pixels); + lv_disp_drv_init(&this->disp_drv_); + this->disp_drv_.draw_buf = &this->draw_buf_; + this->disp_drv_.user_data = this; + this->disp_drv_.full_refresh = this->full_refresh_; + this->disp_drv_.flush_cb = static_flush_cb; + this->disp_drv_.rounder_cb = rounder_cb; + switch (display->get_rotation()) { + case display::DISPLAY_ROTATION_0_DEGREES: + break; + case display::DISPLAY_ROTATION_90_DEGREES: + this->disp_drv_.sw_rotate = true; + this->disp_drv_.rotated = LV_DISP_ROT_90; + break; + case display::DISPLAY_ROTATION_180_DEGREES: + this->disp_drv_.sw_rotate = true; + this->disp_drv_.rotated = LV_DISP_ROT_180; + break; + case display::DISPLAY_ROTATION_270_DEGREES: + this->disp_drv_.sw_rotate = true; + this->disp_drv_.rotated = LV_DISP_ROT_270; + break; + } + display->set_rotation(display::DISPLAY_ROTATION_0_DEGREES); + this->disp_drv_.hor_res = (lv_coord_t) display->get_width(); + this->disp_drv_.ver_res = (lv_coord_t) display->get_height(); + ESP_LOGV(TAG, "sw_rotate = %d, rotated=%d", this->disp_drv_.sw_rotate, this->disp_drv_.rotated); + this->disp_ = lv_disp_drv_register(&this->disp_drv_); + for (const auto &v : this->init_lambdas_) + v(this->disp_); + lv_disp_trig_activity(this->disp_); + ESP_LOGCONFIG(TAG, "LVGL Setup complete"); +} +} // namespace lvgl +} // namespace esphome + +size_t lv_millis(void) { return esphome::millis(); } + +#if defined(USE_HOST) || defined(USE_RP2040) || defined(USE_ESP8266) +void *lv_custom_mem_alloc(size_t size) { + auto *ptr = malloc(size); // NOLINT + if (ptr == nullptr) { + esphome::ESP_LOGE(esphome::lvgl::TAG, "Failed to allocate %zu bytes", size); + } + return ptr; +} +void lv_custom_mem_free(void *ptr) { return free(ptr); } // NOLINT +void *lv_custom_mem_realloc(void *ptr, size_t size) { return realloc(ptr, size); } // NOLINT +#else +static unsigned cap_bits = MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT; // NOLINT + +void *lv_custom_mem_alloc(size_t size) { + void *ptr; + ptr = heap_caps_malloc(size, cap_bits); + if (ptr == nullptr) { + cap_bits = MALLOC_CAP_8BIT; + ptr = heap_caps_malloc(size, cap_bits); + } + if (ptr == nullptr) { + esphome::ESP_LOGE(esphome::lvgl::TAG, "Failed to allocate %zu bytes", size); + return nullptr; + } +#ifdef ESPHOME_LOG_HAS_VERBOSE + esphome::ESP_LOGV(esphome::lvgl::TAG, "allocate %zu - > %p", size, ptr); +#endif + return ptr; +} + +void lv_custom_mem_free(void *ptr) { +#ifdef ESPHOME_LOG_HAS_VERBOSE + esphome::ESP_LOGV(esphome::lvgl::TAG, "free %p", ptr); +#endif + if (ptr == nullptr) + return; + heap_caps_free(ptr); +} + +void *lv_custom_mem_realloc(void *ptr, size_t size) { +#ifdef ESPHOME_LOG_HAS_VERBOSE + esphome::ESP_LOGV(esphome::lvgl::TAG, "realloc %p: %zu", ptr, size); +#endif + return heap_caps_realloc(ptr, size, cap_bits); +} +#endif diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h new file mode 100644 index 0000000000..988c22917b --- /dev/null +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -0,0 +1,119 @@ +#pragma once +#include "esphome/core/defines.h" +#ifdef USE_LVGL + +// required for clang-tidy +#ifndef LV_CONF_H +#define LV_CONF_SKIP 1 // NOLINT +#endif + +#include "esphome/components/display/display.h" +#include "esphome/components/display/display_color_utils.h" +#include "esphome/core/component.h" +#include "esphome/core/hal.h" +#include "esphome/core/log.h" +#include +#include + +#ifdef USE_LVGL_FONT +#include "esphome/components/font/font.h" +#endif +namespace esphome { +namespace lvgl { + +extern lv_event_code_t lv_custom_event; // NOLINT +#ifdef USE_LVGL_COLOR +static lv_color_t lv_color_from(Color color) { return lv_color_make(color.red, color.green, color.blue); } +#endif +#if LV_COLOR_DEPTH == 16 +static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_565; +#elif LV_COLOR_DEPTH == 32 +static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_888; +#else +static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_332; +#endif + +// Parent class for things that wrap an LVGL object +class LvCompound { + public: + virtual void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } + lv_obj_t *obj{}; +}; + +using LvLambdaType = std::function; +using set_value_lambda_t = std::function; +using event_callback_t = void(_lv_event_t *); +using text_lambda_t = std::function; + +#ifdef USE_LVGL_FONT +class FontEngine { + public: + FontEngine(font::Font *esp_font); + const lv_font_t *get_lv_font(); + + const font::GlyphData *get_glyph_data(uint32_t unicode_letter); + uint16_t baseline{}; + uint16_t height{}; + uint8_t bpp{}; + + protected: + font::Font *font_{}; + uint32_t last_letter_{}; + const font::GlyphData *last_data_{}; + lv_font_t lv_font_{}; +}; +#endif // USE_LVGL_FONT + +class LvglComponent : public PollingComponent { + constexpr static const char *const TAG = "lvgl"; + + public: + static void static_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { + reinterpret_cast(disp_drv->user_data)->flush_cb_(disp_drv, area, color_p); + } + + float get_setup_priority() const override { return setup_priority::PROCESSOR; } + static void log_cb(const char *buf) { + esp_log_printf_(ESPHOME_LOG_LEVEL_INFO, TAG, 0, "%.*s", (int) strlen(buf) - 1, buf); + } + static void rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { + // make sure all coordinates are even + if (area->x1 & 1) + area->x1--; + if (!(area->x2 & 1)) + area->x2++; + if (area->y1 & 1) + area->y1--; + if (!(area->y2 & 1)) + area->y2++; + } + + void loop() override { lv_timer_handler_run_in_period(5); } + void setup() override; + + void update() override {} + + void add_display(display::Display *display) { this->displays_.push_back(display); } + void add_init_lambda(const std::function &lamb) { this->init_lambdas_.push_back(lamb); } + void dump_config() override; + void set_full_refresh(bool full_refresh) { this->full_refresh_ = full_refresh; } + void set_buffer_frac(size_t frac) { this->buffer_frac_ = frac; } + lv_disp_t *get_disp() { return this->disp_; } + + protected: + void draw_buffer_(const lv_area_t *area, const uint8_t *ptr); + void flush_cb_(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); + std::vector displays_{}; + lv_disp_draw_buf_t draw_buf_{}; + lv_disp_drv_t disp_drv_{}; + lv_disp_t *disp_{}; + + std::vector> init_lambdas_; + size_t buffer_frac_{1}; + bool full_refresh_{}; +}; + +} // namespace lvgl +} // namespace esphome + +#endif diff --git a/esphome/components/lvgl/lvgl_hal.h b/esphome/components/lvgl/lvgl_hal.h new file mode 100644 index 0000000000..754cc70391 --- /dev/null +++ b/esphome/components/lvgl/lvgl_hal.h @@ -0,0 +1,21 @@ +// +// Created by Clyde Stubbs on 20/9/2023. +// + +#pragma once + +#ifdef __cplusplus +#define EXTERNC extern "C" +#include +namespace esphome { +namespace lvgl {} +} // namespace esphome +#else +#define EXTERNC extern +#include +#endif + +EXTERNC size_t lv_millis(void); +EXTERNC void *lv_custom_mem_alloc(size_t size); +EXTERNC void lv_custom_mem_free(void *ptr); +EXTERNC void *lv_custom_mem_realloc(void *ptr, size_t size); diff --git a/esphome/components/lvgl/obj.py b/esphome/components/lvgl/obj.py new file mode 100644 index 0000000000..fba20bef36 --- /dev/null +++ b/esphome/components/lvgl/obj.py @@ -0,0 +1,22 @@ +from .defines import CONF_OBJ +from .types import lv_obj_t +from .widget import WidgetType + + +class ObjType(WidgetType): + """ + The base LVGL object. All other widgets inherit from this. + """ + + def __init__(self): + super().__init__(CONF_OBJ, schema={}, modify_schema={}) + + @property + def w_type(self): + return lv_obj_t + + async def to_code(self, w, config): + return [] + + +obj_spec = ObjType() diff --git a/esphome/components/lvgl/schemas.py b/esphome/components/lvgl/schemas.py new file mode 100644 index 0000000000..4ae5824151 --- /dev/null +++ b/esphome/components/lvgl/schemas.py @@ -0,0 +1,260 @@ +from esphome import config_validation as cv +from esphome.const import CONF_ARGS, CONF_FORMAT, CONF_ID, CONF_STATE, CONF_TYPE +from esphome.schema_extractors import SCHEMA_EXTRACT + +from . import defines as df, lv_validation as lvalid, types as ty +from .defines import WIDGET_PARTS +from .helpers import ( + REQUIRED_COMPONENTS, + add_lv_use, + requires_component, + validate_printf, +) +from .lv_validation import lv_font +from .types import WIDGET_TYPES, get_widget_type + +# A schema for text properties +TEXT_SCHEMA = cv.Schema( + { + cv.Optional(df.CONF_TEXT): cv.Any( + cv.All( + cv.Schema( + { + cv.Required(CONF_FORMAT): cv.string, + cv.Optional(CONF_ARGS, default=list): cv.ensure_list( + cv.lambda_ + ), + }, + ), + validate_printf, + ), + lvalid.lv_text, + ) + } +) + +# All LVGL styles and their validators +STYLE_PROPS = { + "align": df.CHILD_ALIGNMENTS.one_of, + "arc_opa": lvalid.opacity, + "arc_color": lvalid.lv_color, + "arc_rounded": lvalid.lv_bool, + "arc_width": cv.positive_int, + "anim_time": lvalid.lv_milliseconds, + "bg_color": lvalid.lv_color, + "bg_grad_color": lvalid.lv_color, + "bg_dither_mode": df.LvConstant("LV_DITHER_", "NONE", "ORDERED", "ERR_DIFF").one_of, + "bg_grad_dir": df.LvConstant("LV_GRAD_DIR_", "NONE", "HOR", "VER").one_of, + "bg_grad_stop": lvalid.stop_value, + "bg_img_opa": lvalid.opacity, + "bg_img_recolor": lvalid.lv_color, + "bg_img_recolor_opa": lvalid.opacity, + "bg_main_stop": lvalid.stop_value, + "bg_opa": lvalid.opacity, + "border_color": lvalid.lv_color, + "border_opa": lvalid.opacity, + "border_post": lvalid.lv_bool, + "border_side": df.LvConstant( + "LV_BORDER_SIDE_", "NONE", "TOP", "BOTTOM", "LEFT", "RIGHT", "INTERNAL" + ).several_of, + "border_width": cv.positive_int, + "clip_corner": lvalid.lv_bool, + "height": lvalid.size, + "img_recolor": lvalid.lv_color, + "img_recolor_opa": lvalid.opacity, + "line_width": cv.positive_int, + "line_dash_width": cv.positive_int, + "line_dash_gap": cv.positive_int, + "line_rounded": lvalid.lv_bool, + "line_color": lvalid.lv_color, + "opa": lvalid.opacity, + "opa_layered": lvalid.opacity, + "outline_color": lvalid.lv_color, + "outline_opa": lvalid.opacity, + "outline_pad": lvalid.size, + "outline_width": lvalid.size, + "pad_all": lvalid.size, + "pad_bottom": lvalid.size, + "pad_column": lvalid.size, + "pad_left": lvalid.size, + "pad_right": lvalid.size, + "pad_row": lvalid.size, + "pad_top": lvalid.size, + "shadow_color": lvalid.lv_color, + "shadow_ofs_x": cv.int_, + "shadow_ofs_y": cv.int_, + "shadow_opa": lvalid.opacity, + "shadow_spread": cv.int_, + "shadow_width": cv.positive_int, + "text_align": df.LvConstant( + "LV_TEXT_ALIGN_", "LEFT", "CENTER", "RIGHT", "AUTO" + ).one_of, + "text_color": lvalid.lv_color, + "text_decor": df.LvConstant( + "LV_TEXT_DECOR_", "NONE", "UNDERLINE", "STRIKETHROUGH" + ).several_of, + "text_font": lv_font, + "text_letter_space": cv.positive_int, + "text_line_space": cv.positive_int, + "text_opa": lvalid.opacity, + "transform_angle": lvalid.angle, + "transform_height": lvalid.pixels_or_percent, + "transform_pivot_x": lvalid.pixels_or_percent, + "transform_pivot_y": lvalid.pixels_or_percent, + "transform_zoom": lvalid.zoom, + "translate_x": lvalid.pixels_or_percent, + "translate_y": lvalid.pixels_or_percent, + "max_height": lvalid.pixels_or_percent, + "max_width": lvalid.pixels_or_percent, + "min_height": lvalid.pixels_or_percent, + "min_width": lvalid.pixels_or_percent, + "radius": cv.Any(lvalid.size, df.LvConstant("LV_RADIUS_", "CIRCLE").one_of), + "width": lvalid.size, + "x": lvalid.pixels_or_percent, + "y": lvalid.pixels_or_percent, +} + +# Complete object style schema +STYLE_SCHEMA = cv.Schema({cv.Optional(k): v for k, v in STYLE_PROPS.items()}).extend( + { + cv.Optional(df.CONF_SCROLLBAR_MODE): df.LvConstant( + "LV_SCROLLBAR_MODE_", "OFF", "ON", "ACTIVE", "AUTO" + ).one_of, + } +) + +# Object states. Top level properties apply to MAIN +STATE_SCHEMA = cv.Schema( + {cv.Optional(state): STYLE_SCHEMA for state in df.STATES} +).extend(STYLE_SCHEMA) +# Setting object states +SET_STATE_SCHEMA = cv.Schema( + {cv.Optional(state): lvalid.lv_bool for state in df.STATES} +) +# Setting object flags +FLAG_SCHEMA = cv.Schema({cv.Optional(flag): cv.boolean for flag in df.OBJ_FLAGS}) +FLAG_LIST = cv.ensure_list(df.LvConstant("LV_OBJ_FLAG_", *df.OBJ_FLAGS).one_of) + + +def part_schema(widget_type): + """ + Generate a schema for the various parts (e.g. main:, indicator:) of a widget type + :param widget_type: The type of widget to generate for + :return: + """ + parts = WIDGET_PARTS.get(widget_type) + if parts is None: + parts = (df.CONF_MAIN,) + return cv.Schema({cv.Optional(part): STATE_SCHEMA for part in parts}).extend( + STATE_SCHEMA + ) + + +def obj_schema(widget_type: str): + """ + Create a schema for a widget type itself i.e. no allowance for children + :param widget_type: + :return: + """ + return ( + part_schema(widget_type) + .extend(FLAG_SCHEMA) + .extend(ALIGN_TO_SCHEMA) + .extend( + cv.Schema( + { + cv.Optional(CONF_STATE): SET_STATE_SCHEMA, + } + ) + ) + ) + + +ALIGN_TO_SCHEMA = { + cv.Optional(df.CONF_ALIGN_TO): cv.Schema( + { + cv.Required(CONF_ID): cv.use_id(ty.lv_obj_t), + cv.Required(df.CONF_ALIGN): df.ALIGN_ALIGNMENTS.one_of, + cv.Optional(df.CONF_X, default=0): lvalid.pixels_or_percent, + cv.Optional(df.CONF_Y, default=0): lvalid.pixels_or_percent, + } + ) +} + + +# A style schema that can include text +STYLED_TEXT_SCHEMA = cv.maybe_simple_value( + STYLE_SCHEMA.extend(TEXT_SCHEMA), key=df.CONF_TEXT +) + + +ALL_STYLES = { + **STYLE_PROPS, +} + + +def container_validator(schema, widget_type): + """ + Create a validator for a container given the widget type + :param schema: Base schema to extend + :param widget_type: + :return: + """ + + def validator(value): + result = schema + if w_sch := WIDGET_TYPES[widget_type].schema: + result = result.extend(w_sch) + if value and (layout := value.get(df.CONF_LAYOUT)): + if not isinstance(layout, dict): + raise cv.Invalid("Layout value must be a dict") + ltype = layout.get(CONF_TYPE) + add_lv_use(ltype) + if value == SCHEMA_EXTRACT: + return result + return result(value) + + return validator + + +def container_schema(widget_type, extras=None): + """ + Create a schema for a container widget of a given type. All obj properties are available, plus + the extras passed in, plus any defined for the specific widget being specified. + :param widget_type: The widget type, e.g. "img" + :param extras: Additional options to be made available, e.g. layout properties for children + :return: The schema for this type of widget. + """ + lv_type = get_widget_type(widget_type) + schema = obj_schema(widget_type).extend({cv.GenerateID(): cv.declare_id(lv_type)}) + if extras: + schema = schema.extend(extras) + # Delayed evaluation for recursion + return container_validator(schema, widget_type) + + +def widget_schema(widget_type, extras=None): + """ + Create a schema for a given widget type + :param widget_type: The name of the widget + :param extras: + :return: + """ + validator = container_schema(widget_type, extras=extras) + if required := REQUIRED_COMPONENTS.get(widget_type): + validator = cv.All(validator, requires_component(required)) + return cv.Exclusive(widget_type, df.CONF_WIDGETS), validator + + +# All widget schemas must be defined before this is called. + + +def any_widget_schema(extras=None): + """ + Generate schemas for all possible LVGL widgets. This is what implements the ability to have a list of any kind of + widget under the widgets: key. + + :param extras: Additional schema to be applied to each generated one + :return: + """ + return cv.Any(dict(widget_schema(wt, extras) for wt in WIDGET_PARTS)) diff --git a/esphome/components/lvgl/types.py b/esphome/components/lvgl/types.py new file mode 100644 index 0000000000..3c043d266d --- /dev/null +++ b/esphome/components/lvgl/types.py @@ -0,0 +1,64 @@ +from esphome import codegen as cg +from esphome.core import ID + +from .defines import CONF_LABEL, CONF_OBJ, CONF_TEXT + +uint16_t_ptr = cg.uint16.operator("ptr") +lvgl_ns = cg.esphome_ns.namespace("lvgl") +char_ptr = cg.global_ns.namespace("char").operator("ptr") +void_ptr = cg.void.operator("ptr") +LvglComponent = lvgl_ns.class_("LvglComponent", cg.PollingComponent) +lv_event_code_t = cg.global_ns.namespace("lv_event_code_t") +FontEngine = lvgl_ns.class_("FontEngine") +LvCompound = lvgl_ns.class_("LvCompound") +lv_font_t = cg.global_ns.class_("lv_font_t") +lv_style_t = cg.global_ns.struct("lv_style_t") +lv_pseudo_button_t = lvgl_ns.class_("LvPseudoButton") +lv_obj_base_t = cg.global_ns.class_("lv_obj_t", lv_pseudo_button_t) +lv_obj_t_ptr = lv_obj_base_t.operator("ptr") +lv_disp_t_ptr = cg.global_ns.struct("lv_disp_t").operator("ptr") +lv_color_t = cg.global_ns.struct("lv_color_t") + + +# this will be populated later, in __init__.py to avoid circular imports. +WIDGET_TYPES: dict = {} + + +class LvType(cg.MockObjClass): + def __init__(self, *args, **kwargs): + parens = kwargs.pop("parents", ()) + super().__init__(*args, parents=parens + (lv_obj_base_t,)) + self.args = kwargs.pop("largs", [(lv_obj_t_ptr, "obj")]) + self.value = kwargs.pop("lvalue", lambda w: w.obj) + self.has_on_value = kwargs.pop("has_on_value", False) + self.value_property = None + + def get_arg_type(self): + return self.args[0][0] if len(self.args) else None + + +class LvText(LvType): + def __init__(self, *args, **kwargs): + super().__init__( + *args, + largs=[(cg.std_string, "text")], + lvalue=lambda w: w.get_property("text")[0], + **kwargs, + ) + self.value_property = CONF_TEXT + + +lv_obj_t = LvType("lv_obj_t") +lv_label_t = LvText("lv_label_t") + +LV_TYPES = { + CONF_LABEL: lv_label_t, + CONF_OBJ: lv_obj_t, +} + + +def get_widget_type(typestr: str) -> LvType: + return LV_TYPES[typestr] + + +CUSTOM_EVENT = ID("lv_custom_event", False, type=lv_event_code_t) diff --git a/esphome/components/lvgl/widget.py b/esphome/components/lvgl/widget.py new file mode 100644 index 0000000000..44f277f1c3 --- /dev/null +++ b/esphome/components/lvgl/widget.py @@ -0,0 +1,347 @@ +import sys +from typing import Any + +from esphome import codegen as cg, config_validation as cv +from esphome.config_validation import Invalid +from esphome.const import CONF_GROUP, CONF_ID, CONF_STATE +from esphome.core import ID, TimePeriod +from esphome.coroutine import FakeAwaitable +from esphome.cpp_generator import MockObjClass + +from .defines import ( + CONF_DEFAULT, + CONF_MAIN, + CONF_SCROLLBAR_MODE, + CONF_WIDGETS, + OBJ_FLAGS, + PARTS, + STATES, + LValidator, + join_enums, +) +from .helpers import add_lv_use +from .lvcode import ConstantLiteral, add_line_marks, lv, lv_add, lv_assign, lv_obj +from .schemas import ALL_STYLES +from .types import WIDGET_TYPES, LvCompound, lv_obj_t + +EVENT_LAMB = "event_lamb__" + + +class WidgetType: + """ + Describes a type of Widget, e.g. "bar" or "line" + """ + + def __init__(self, name, schema=None, modify_schema=None): + """ + :param name: The widget name, e.g. "bar" + :param schema: The config schema for defining a widget + :param modify_schema: A schema to update the widget + """ + self.name = name + self.schema = schema or {} + if modify_schema is None: + self.modify_schema = schema + else: + self.modify_schema = modify_schema + + @property + def animated(self): + return False + + @property + def w_type(self): + """ + Get the type associated with this widget + :return: + """ + return lv_obj_t + + def is_compound(self): + return self.w_type.inherits_from(LvCompound) + + async def to_code(self, w, config: dict): + """ + Generate code for a given widget + :param w: The widget + :param config: Its configuration + :return: Generated code as a list of text lines + """ + raise NotImplementedError(f"No to_code defined for {self.name}") + + def obj_creator(self, parent: MockObjClass, config: dict): + """ + Create an instance of the widget type + :param parent: The parent to which it should be attached + :param config: Its configuration + :return: Generated code as a single text line + """ + return f"lv_{self.name}_create({parent})" + + def get_uses(self): + """ + Get a list of other widgets used by this one + :return: + """ + return () + + +class LvScrActType(WidgetType): + """ + A "widget" representing the active screen. + """ + + def __init__(self): + super().__init__("lv_scr_act()") + + def obj_creator(self, parent: MockObjClass, config: dict): + return [] + + async def to_code(self, w, config: dict): + return [] + + +class Widget: + """ + Represents a Widget. + """ + + widgets_completed = False + + @staticmethod + def set_completed(): + Widget.widgets_completed = True + + def __init__(self, var, wtype: WidgetType, config: dict = None, parent=None): + self.var = var + self.type = wtype + self.config = config + self.scale = 1.0 + self.step = 1.0 + self.range_from = -sys.maxsize + self.range_to = sys.maxsize + self.parent = parent + + @staticmethod + def create(name, var, wtype: WidgetType, config: dict = None, parent=None): + w = Widget(var, wtype, config, parent) + if name is not None: + widget_map[name] = w + return w + + @property + def obj(self): + if self.type.is_compound(): + return f"{self.var}->obj" + return self.var + + def add_state(self, *args): + return lv_obj.add_state(self.obj, *args) + + def clear_state(self, *args): + return lv_obj.clear_state(self.obj, *args) + + def add_flag(self, *args): + return lv_obj.add_flag(self.obj, *args) + + def clear_flag(self, *args): + return lv_obj.clear_flag(self.obj, *args) + + def set_property(self, prop, value, animated: bool = None, ltype=None): + if isinstance(value, dict): + value = value.get(prop) + if value is None: + return + if isinstance(value, TimePeriod): + value = value.total_milliseconds + ltype = ltype or self.__type_base() + if animated is None or self.type.animated is not True: + lv.call(f"{ltype}_set_{prop}", self.obj, value) + else: + lv.call( + f"{ltype}_set_{prop}", + self.obj, + value, + "LV_ANIM_ON" if animated else "LV_ANIM_OFF", + ) + + def get_property(self, prop, ltype=None): + ltype = ltype or self.__type_base() + return f"lv_{ltype}_get_{prop}({self.obj})" + + def set_style(self, prop, value, state): + if value is None: + return [] + return lv.call(f"obj_set_style_{prop}", self.obj, value, state) + + def __type_base(self): + wtype = self.type.w_type + base = str(wtype) + if base.startswith("Lv"): + return f"{wtype}".removeprefix("Lv").removesuffix("Type").lower() + return f"{wtype}".removeprefix("lv_").removesuffix("_t") + + def __str__(self): + return f"({self.var}, {self.type})" + + +# Map of widgets to their config, used for trigger generation +widget_map: dict[Any, Widget] = {} + + +def get_widget_generator(wid): + """ + Used to wait for a widget during code generation. + :param wid: + :return: + """ + while True: + if obj := widget_map.get(wid): + return obj + if Widget.widgets_completed: + raise Invalid( + f"Widget {wid} not found, yet all widgets should be defined by now" + ) + yield + + +async def get_widget(wid: ID) -> Widget: + if obj := widget_map.get(wid): + return obj + return await FakeAwaitable(get_widget_generator(wid)) + + +def collect_props(config): + """ + Collect all properties from a configuration + :param config: + :return: + """ + props = {} + for prop in [*ALL_STYLES, *OBJ_FLAGS, CONF_GROUP]: + if prop in config: + props[prop] = config[prop] + return props + + +def collect_states(config): + """ + Collect prperties for each state of a widget + :param config: + :return: + """ + states = {CONF_DEFAULT: collect_props(config)} + for state in STATES: + if state in config: + states[state] = collect_props(config[state]) + return states + + +def collect_parts(config): + """ + Collect properties and states for all widget parts + :param config: + :return: + """ + parts = {CONF_MAIN: collect_states(config)} + for part in PARTS: + if part in config: + parts[part] = collect_states(config[part]) + return parts + + +async def set_obj_properties(w: Widget, config): + """Generate a list of C++ statements to apply properties to an lv_obj_t""" + parts = collect_parts(config) + for part, states in parts.items(): + for state, props in states.items(): + lv_state = ConstantLiteral( + f"(int)LV_STATE_{state.upper()}|(int)LV_PART_{part.upper()}" + ) + for prop, value in { + k: v for k, v in props.items() if k in ALL_STYLES + }.items(): + if isinstance(ALL_STYLES[prop], LValidator): + value = await ALL_STYLES[prop].process(value) + w.set_style(prop, value, lv_state) + flag_clr = set() + flag_set = set() + props = parts[CONF_MAIN][CONF_DEFAULT] + for prop, value in {k: v for k, v in props.items() if k in OBJ_FLAGS}.items(): + if value: + flag_set.add(prop) + else: + flag_clr.add(prop) + if flag_set: + adds = join_enums(flag_set, "LV_OBJ_FLAG_") + w.add_flag(adds) + if flag_clr: + clrs = join_enums(flag_clr, "LV_OBJ_FLAG_") + w.clear_flag(clrs) + + if states := config.get(CONF_STATE): + adds = set() + clears = set() + lambs = {} + for key, value in states.items(): + if isinstance(value, cv.Lambda): + lambs[key] = value + elif value == "true": + adds.add(key) + else: + clears.add(key) + if adds: + adds = ConstantLiteral(join_enums(adds, "LV_STATE_")) + w.add_state(adds) + if clears: + clears = ConstantLiteral(join_enums(clears, "LV_STATE_")) + w.clear_state(clears) + for key, value in lambs.items(): + lamb = await cg.process_lambda(value, [], return_type=cg.bool_) + state = ConstantLiteral(f"LV_STATE_{key.upper}") + lv.cond_if(lamb) + w.add_state(state) + lv.cond_else() + w.clear_state(state) + lv.cond_endif() + if scrollbar_mode := config.get(CONF_SCROLLBAR_MODE): + lv_obj.set_scrollbar_mode(w.obj, scrollbar_mode) + + +async def add_widgets(parent: Widget, config: dict): + """ + Add all widgets to an object + :param parent: The enclosing obj + :param config: The configuration + :return: + """ + for w in config.get(CONF_WIDGETS) or (): + w_type, w_cnfig = next(iter(w.items())) + await widget_to_code(w_cnfig, w_type, parent.obj) + + +async def widget_to_code(w_cnfig, w_type, parent): + """ + Converts a Widget definition to C code. + :param w_cnfig: The widget configuration + :param w_type: The Widget type + :param parent: The parent to which the widget should be added + :return: + """ + spec: WidgetType = WIDGET_TYPES[w_type] + creator = spec.obj_creator(parent, w_cnfig) + add_lv_use(spec.name) + add_lv_use(*spec.get_uses()) + wid = w_cnfig[CONF_ID] + add_line_marks(wid) + if spec.is_compound(): + var = cg.new_Pvariable(wid) + lv_add(var.set_obj(creator)) + else: + var = cg.Pvariable(wid, cg.nullptr, type_=lv_obj_t) + lv_assign(var, creator) + + widget = Widget.create(wid, var, spec, w_cnfig, parent) + await set_obj_properties(widget, w_cnfig) + await add_widgets(widget, w_cnfig) + await spec.to_code(widget, w_cnfig) diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 4831ed2c9e..9d453260ab 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -38,6 +38,9 @@ #define USE_LIGHT #define USE_LOCK #define USE_LOGGER +#define USE_LVGL +#define USE_LVGL_FONT +#define USE_LVGL_IMAGE #define USE_MDNS #define USE_MEDIA_PLAYER #define USE_MQTT diff --git a/platformio.ini b/platformio.ini index fc7f35b6c3..baf0a85d73 100644 --- a/platformio.ini +++ b/platformio.ini @@ -42,6 +42,7 @@ lib_deps = pavlodn/HaierProtocol@0.9.31 ; haier ; This is using the repository until a new release is published to PlatformIO https://github.com/Sensirion/arduino-gas-index-algorithm.git#3.2.1 ; Sensirion Gas Index Algorithm Arduino Library + lvgl/lvgl@8.4.0 ; lvgl build_flags = -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_VERY_VERBOSE src_filter = diff --git a/tests/components/lvgl/common.yaml b/tests/components/lvgl/common.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/components/lvgl/lvgl-package.yaml b/tests/components/lvgl/lvgl-package.yaml new file mode 100644 index 0000000000..856e7c3e9d --- /dev/null +++ b/tests/components/lvgl/lvgl-package.yaml @@ -0,0 +1,24 @@ +color: + - id: light_blue + hex: "3340FF" + +lvgl: + bg_color: light_blue + widgets: + - label: + text: Hello world + text_color: 0xFF8000 + align: center + text_font: montserrat_40 + border_post: true + + - label: + text: "Hello shiny day" + text_color: 0xFFFFFF + align: bottom_mid + text_font: space16 + +font: + - file: "gfonts://Roboto" + id: space16 + bpp: 4 diff --git a/tests/components/lvgl/test.esp32-ard.yaml b/tests/components/lvgl/test.esp32-ard.yaml new file mode 100644 index 0000000000..abfb324ea5 --- /dev/null +++ b/tests/components/lvgl/test.esp32-ard.yaml @@ -0,0 +1,30 @@ +spi: + clk_pin: 14 + mosi_pin: 13 + +i2c: + sda: GPIO18 + scl: GPIO19 + +display: + - platform: ili9xxx + model: st7789v + id: tft_display + dimensions: + width: 240 + height: 320 + transform: + swap_xy: false + mirror_x: true + mirror_y: true + data_rate: 80MHz + cs_pin: GPIO22 + dc_pin: GPIO21 + auto_clear_enabled: false + invert_colors: false + update_interval: never + +packages: + lvgl: !include lvgl-package.yaml + +<<: !include common.yaml diff --git a/tests/components/lvgl/test.esp32-idf.yaml b/tests/components/lvgl/test.esp32-idf.yaml new file mode 100644 index 0000000000..f159431b99 --- /dev/null +++ b/tests/components/lvgl/test.esp32-idf.yaml @@ -0,0 +1,52 @@ +spi: + clk_pin: 14 + mosi_pin: 13 + +i2c: + sda: GPIO18 + scl: GPIO19 + +display: + - platform: ili9xxx + model: st7789v + id: second_display + dimensions: + width: 240 + height: 320 + transform: + swap_xy: false + mirror_x: true + mirror_y: true + data_rate: 80MHz + cs_pin: GPIO20 + dc_pin: GPIO15 + auto_clear_enabled: false + invert_colors: false + update_interval: never + + - platform: ili9xxx + model: st7789v + id: tft_display + dimensions: + width: 240 + height: 320 + transform: + swap_xy: false + mirror_x: true + mirror_y: true + data_rate: 80MHz + cs_pin: GPIO22 + dc_pin: GPIO21 + auto_clear_enabled: false + invert_colors: false + update_interval: never + +packages: + lvgl: !include lvgl-package.yaml + +lvgl: + displays: + - tft_display + - second_display + +<<: !include common.yaml From d3f2434c57034c0cac30c997f80850df59e40028 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 24 Jul 2024 19:45:42 -0500 Subject: [PATCH 058/164] Bump aioesphomeapi to 24.6.2 and cryptography to 43.0.0 (#7131) --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0cbe5e7265..3e658de8ad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ async_timeout==4.0.3; python_version <= "3.10" -cryptography==42.0.2 +cryptography==43.0.0 voluptuous==0.14.2 PyYAML==6.0.1 paho-mqtt==1.6.1 @@ -13,7 +13,7 @@ platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 esphome-dashboard==20240620.0 -aioesphomeapi==24.3.0 +aioesphomeapi==24.6.2 zeroconf==0.132.2 python-magic==0.4.27 ruamel.yaml==0.18.6 # dashboard_import From f61582f82600b26e5747afe5b5f1f5b642a47ee6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:19:33 +1200 Subject: [PATCH 059/164] [dependabot] Group docker action bumps into single PR (#7133) --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3b6495653b..bb35f16048 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,6 +13,13 @@ updates: schedule: interval: daily open-pull-requests-limit: 10 + groups: + docker-actions: + applies-to: version-updates + patterns: + - "docker/setup-qemu-action" + - "docker/login-action" + - "docker/setup-buildx-action" - package-ecosystem: github-actions directory: "/.github/actions/build-image" schedule: From 39c0019534f5e6aa67d2e71f69a04d8c3ff28343 Mon Sep 17 00:00:00 2001 From: thevogoncoder <6619878+thevogoncoder@users.noreply.github.com> Date: Thu, 25 Jul 2024 04:06:23 +0200 Subject: [PATCH 060/164] Add delay after sending REG_READ_START (#7130) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/pmwcs3/pmwcs3.cpp | 61 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/esphome/components/pmwcs3/pmwcs3.cpp b/esphome/components/pmwcs3/pmwcs3.cpp index 812018b52e..97ce4c9ae0 100644 --- a/esphome/components/pmwcs3/pmwcs3.cpp +++ b/esphome/components/pmwcs3/pmwcs3.cpp @@ -72,43 +72,44 @@ void PMWCS3Component::dump_config() { LOG_SENSOR(" ", "vwc", this->vwc_sensor_); } void PMWCS3Component::read_data_() { - uint8_t data[8]; - float e25, ec, temperature, vwc; - /////// Super important !!!! first activate reading PMWCS3_REG_READ_START (if not, return always the same values) //// - if (!this->write_bytes(PMWCS3_REG_READ_START, nullptr, 0)) { this->status_set_warning(); ESP_LOGVV(TAG, "Failed to write into REG_READ_START register !!!"); return; } - // NOLINT delay(100); - if (!this->read_bytes(PMWCS3_REG_GET_DATA, (uint8_t *) &data, 8)) { - ESP_LOGVV(TAG, "Error reading PMWCS3_REG_GET_DATA registers"); - this->mark_failed(); - return; - } - if (this->e25_sensor_ != nullptr) { - e25 = ((data[1] << 8) | data[0]) / 100.0; - this->e25_sensor_->publish_state(e25); - ESP_LOGVV(TAG, "e25: data[0]=%d, data[1]=%d, result=%f", data[0], data[1], e25); - } - if (this->ec_sensor_ != nullptr) { - ec = ((data[3] << 8) | data[2]) / 10.0; - this->ec_sensor_->publish_state(ec); - ESP_LOGVV(TAG, "ec: data[2]=%d, data[3]=%d, result=%f", data[2], data[3], ec); - } - if (this->temperature_sensor_ != nullptr) { - temperature = ((data[5] << 8) | data[4]) / 100.0; - this->temperature_sensor_->publish_state(temperature); - ESP_LOGVV(TAG, "temp: data[4]=%d, data[5]=%d, result=%f", data[4], data[5], temperature); - } - if (this->vwc_sensor_ != nullptr) { - vwc = ((data[7] << 8) | data[6]) / 10.0; - this->vwc_sensor_->publish_state(vwc); - ESP_LOGVV(TAG, "vwc: data[6]=%d, data[7]=%d, result=%f", data[6], data[7], vwc); - } + // Wait for the sensor to be ready. + // 80ms empirically determined (conservative). + this->set_timeout(80, [this] { + uint8_t data[8]; + float e25, ec, temperature, vwc; + if (!this->read_bytes(PMWCS3_REG_GET_DATA, (uint8_t *) &data, 8)) { + ESP_LOGVV(TAG, "Error reading PMWCS3_REG_GET_DATA registers"); + this->mark_failed(); + return; + } + if (this->e25_sensor_ != nullptr) { + e25 = ((data[1] << 8) | data[0]) / 100.0; + this->e25_sensor_->publish_state(e25); + ESP_LOGVV(TAG, "e25: data[0]=%d, data[1]=%d, result=%f", data[0], data[1], e25); + } + if (this->ec_sensor_ != nullptr) { + ec = ((data[3] << 8) | data[2]) / 10.0; + this->ec_sensor_->publish_state(ec); + ESP_LOGVV(TAG, "ec: data[2]=%d, data[3]=%d, result=%f", data[2], data[3], ec); + } + if (this->temperature_sensor_ != nullptr) { + temperature = ((data[5] << 8) | data[4]) / 100.0; + this->temperature_sensor_->publish_state(temperature); + ESP_LOGVV(TAG, "temp: data[4]=%d, data[5]=%d, result=%f", data[4], data[5], temperature); + } + if (this->vwc_sensor_ != nullptr) { + vwc = ((data[7] << 8) | data[6]) / 10.0; + this->vwc_sensor_->publish_state(vwc); + ESP_LOGVV(TAG, "vwc: data[6]=%d, data[7]=%d, result=%f", data[6], data[7], vwc); + } + }); } } // namespace pmwcs3 From adfec578cfd301ee0295bd1dec6a649ff98fcb8b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:13:09 +1200 Subject: [PATCH 061/164] Add ``--version`` handler to cli (#7150) --- esphome/__main__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index b13f96daf7..9e7b7fa15b 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -747,7 +747,14 @@ def parse_args(argv): ) parser = argparse.ArgumentParser( - description=f"ESPHome v{const.__version__}", parents=[options_parser] + description=f"ESPHome {const.__version__}", parents=[options_parser] + ) + + parser.add_argument( + "--version", + action="version", + version=f"Version: {const.__version__}", + help="Print the ESPHome version and exit.", ) mqtt_options = argparse.ArgumentParser(add_help=False) From acf690c87d362b37dc3b8910bcc7ffd4882bc2f2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:05:41 +1200 Subject: [PATCH 062/164] [code-quality] Organise ethernet related imports (#7152) --- esphome/components/ethernet/__init__.py | 36 +++++++++---------- .../components/ethernet_info/text_sensor.py | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/esphome/components/ethernet/__init__.py b/esphome/components/ethernet/__init__.py index 697436415b..1c6acda724 100644 --- a/esphome/components/ethernet/__init__.py +++ b/esphome/components/ethernet/__init__.py @@ -1,6 +1,4 @@ from esphome import pins -import esphome.config_validation as cv -import esphome.final_validate as fv import esphome.codegen as cg from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant from esphome.components.esp32.const import ( @@ -8,31 +6,33 @@ from esphome.components.esp32.const import ( VARIANT_ESP32S2, VARIANT_ESP32S3, ) +from esphome.components.network import IPAddress +from esphome.components.spi import CONF_INTERFACE_INDEX, get_spi_interface +import esphome.config_validation as cv from esphome.const import ( - CONF_DOMAIN, - CONF_ID, - CONF_VALUE, - CONF_MANUAL_IP, - CONF_STATIC_IP, - CONF_TYPE, - CONF_USE_ADDRESS, - CONF_GATEWAY, - CONF_SUBNET, + CONF_ADDRESS, + CONF_CLK_PIN, + CONF_CS_PIN, CONF_DNS1, CONF_DNS2, - CONF_CLK_PIN, + CONF_DOMAIN, + CONF_GATEWAY, + CONF_ID, + CONF_INTERRUPT_PIN, + CONF_MANUAL_IP, CONF_MISO_PIN, CONF_MOSI_PIN, - CONF_CS_PIN, - CONF_INTERRUPT_PIN, + CONF_PAGE_ID, CONF_RESET_PIN, CONF_SPI, - CONF_PAGE_ID, - CONF_ADDRESS, + CONF_STATIC_IP, + CONF_SUBNET, + CONF_TYPE, + CONF_USE_ADDRESS, + CONF_VALUE, ) from esphome.core import CORE, coroutine_with_priority -from esphome.components.network import IPAddress -from esphome.components.spi import get_spi_interface, CONF_INTERFACE_INDEX +import esphome.final_validate as fv CONFLICTS_WITH = ["wifi"] DEPENDENCIES = ["esp32"] diff --git a/esphome/components/ethernet_info/text_sensor.py b/esphome/components/ethernet_info/text_sensor.py index a545475870..31da516e44 100644 --- a/esphome/components/ethernet_info/text_sensor.py +++ b/esphome/components/ethernet_info/text_sensor.py @@ -1,9 +1,9 @@ import esphome.codegen as cg -import esphome.config_validation as cv from esphome.components import text_sensor +import esphome.config_validation as cv from esphome.const import ( - CONF_IP_ADDRESS, CONF_DNS_ADDRESS, + CONF_IP_ADDRESS, CONF_MAC_ADDRESS, ENTITY_CATEGORY_DIAGNOSTIC, ) From 20c22465335231017b4300827ad3e68ce968bd4f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:06:08 +1200 Subject: [PATCH 063/164] [code-quality] Organise wifi related imports (#7153) --- esphome/components/wifi/__init__.py | 31 +++++++++++---------- esphome/components/wifi/wpa2_eap.py | 13 ++++----- esphome/components/wifi_info/text_sensor.py | 6 ++-- esphome/components/wifi_signal/sensor.py | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 624bcdabdc..ea03cc16d1 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -1,15 +1,19 @@ -import esphome.codegen as cg -import esphome.config_validation as cv -import esphome.final_validate as fv from esphome import automation from esphome.automation import Condition +import esphome.codegen as cg +from esphome.components.esp32 import add_idf_sdkconfig_option, const, get_esp32_variant +from esphome.components.network import IPAddress +import esphome.config_validation as cv from esphome.const import ( CONF_AP, CONF_BSSID, + CONF_CERTIFICATE, + CONF_CERTIFICATE_AUTHORITY, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, + CONF_EAP, CONF_ENABLE_BTM, CONF_ENABLE_ON_BOOT, CONF_ENABLE_RRM, @@ -17,29 +21,26 @@ from esphome.const import ( CONF_GATEWAY, CONF_HIDDEN, CONF_ID, + CONF_IDENTITY, + CONF_KEY, CONF_MANUAL_IP, CONF_NETWORKS, + CONF_ON_CONNECT, + CONF_ON_DISCONNECT, CONF_PASSWORD, CONF_POWER_SAVE_MODE, + CONF_PRIORITY, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, CONF_SUBNET, - CONF_USE_ADDRESS, - CONF_PRIORITY, - CONF_IDENTITY, - CONF_CERTIFICATE_AUTHORITY, - CONF_CERTIFICATE, - CONF_KEY, - CONF_USERNAME, - CONF_EAP, CONF_TTLS_PHASE_2, - CONF_ON_CONNECT, - CONF_ON_DISCONNECT, + CONF_USE_ADDRESS, + CONF_USERNAME, ) from esphome.core import CORE, HexInt, coroutine_with_priority -from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const -from esphome.components.network import IPAddress +import esphome.final_validate as fv + from . import wpa2_eap AUTO_LOAD = ["network"] diff --git a/esphome/components/wifi/wpa2_eap.py b/esphome/components/wifi/wpa2_eap.py index 3985dfef18..5d5bd8dca3 100644 --- a/esphome/components/wifi/wpa2_eap.py +++ b/esphome/components/wifi/wpa2_eap.py @@ -7,16 +7,15 @@ so that it doesn't crash if it's not installed. import logging from pathlib import Path -from esphome.core import CORE import esphome.config_validation as cv from esphome.const import ( - CONF_USERNAME, - CONF_IDENTITY, - CONF_PASSWORD, CONF_CERTIFICATE, + CONF_IDENTITY, CONF_KEY, + CONF_PASSWORD, + CONF_USERNAME, ) - +from esphome.core import CORE _LOGGER = logging.getLogger(__name__) @@ -49,8 +48,8 @@ def wrapped_load_pem_x509_certificate(value): def wrapped_load_pem_private_key(value, password): validate_cryptography_installed() - from cryptography.hazmat.primitives.serialization import load_pem_private_key from cryptography.hazmat.backends import default_backend + from cryptography.hazmat.primitives.serialization import load_pem_private_key if password: password = password.encode("UTF-8") @@ -91,7 +90,7 @@ def _validate_load_private_key(key, cert_pw): def _check_private_key_cert_match(key, cert): - from cryptography.hazmat.primitives.asymmetric import rsa, ec + from cryptography.hazmat.primitives.asymmetric import ec, rsa def check_match_a(): return key.public_key().public_numbers() == cert.public_key().public_numbers() diff --git a/esphome/components/wifi_info/text_sensor.py b/esphome/components/wifi_info/text_sensor.py index 75513712dd..4ceb73a695 100644 --- a/esphome/components/wifi_info/text_sensor.py +++ b/esphome/components/wifi_info/text_sensor.py @@ -1,13 +1,13 @@ import esphome.codegen as cg -import esphome.config_validation as cv from esphome.components import text_sensor +import esphome.config_validation as cv from esphome.const import ( CONF_BSSID, + CONF_DNS_ADDRESS, CONF_IP_ADDRESS, + CONF_MAC_ADDRESS, CONF_SCAN_RESULTS, CONF_SSID, - CONF_MAC_ADDRESS, - CONF_DNS_ADDRESS, ENTITY_CATEGORY_DIAGNOSTIC, ) diff --git a/esphome/components/wifi_signal/sensor.py b/esphome/components/wifi_signal/sensor.py index 77fabf272e..99b51adea0 100644 --- a/esphome/components/wifi_signal/sensor.py +++ b/esphome/components/wifi_signal/sensor.py @@ -1,6 +1,6 @@ import esphome.codegen as cg -import esphome.config_validation as cv from esphome.components import sensor +import esphome.config_validation as cv from esphome.const import ( DEVICE_CLASS_SIGNAL_STRENGTH, ENTITY_CATEGORY_DIAGNOSTIC, From e64709c37e22148572a182461f98430982e3228f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:07:44 +1200 Subject: [PATCH 064/164] [code-quality] Organise core imports (#7149) --- esphome/__main__.py | 12 ++-- esphome/automation.py | 2 +- esphome/codegen.py | 106 ++++++++++++++++---------------- esphome/config.py | 42 ++++++------- esphome/config_validation.py | 42 ++++++------- esphome/core/__init__.py | 19 +++--- esphome/core/config.py | 6 +- esphome/core/entity_helpers.py | 3 +- esphome/coroutine.py | 2 +- esphome/cpp_generator.py | 2 +- esphome/cpp_helpers.py | 8 +-- esphome/dashboard/core.py | 6 +- esphome/dashboard/dashboard.py | 6 +- esphome/dashboard/entries.py | 2 +- esphome/dashboard/util/file.py | 2 +- esphome/dashboard/web_server.py | 6 +- esphome/external_files.py | 10 +-- esphome/final_validate.py | 4 +- esphome/git.py | 10 +-- esphome/helpers.py | 12 ++-- esphome/mqtt.py | 6 +- esphome/pins.py | 12 ++-- esphome/platformio_api.py | 10 +-- esphome/storage_json.py | 3 +- esphome/types.py | 2 +- esphome/util.py | 5 +- esphome/voluptuous_schema.py | 1 + esphome/vscode.py | 9 +-- esphome/wizard.py | 2 +- esphome/writer.py | 16 ++--- esphome/yaml_util.py | 6 +- esphome/zeroconf.py | 2 +- 32 files changed, 190 insertions(+), 186 deletions(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 9e7b7fa15b..13f09e15ed 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -1,12 +1,12 @@ # PYTHON_ARGCOMPLETE_OK import argparse +from datetime import datetime import functools import logging import os import re import sys import time -from datetime import datetime import argcomplete @@ -39,14 +39,14 @@ from esphome.const import ( ) from esphome.core import CORE, EsphomeError, coroutine from esphome.helpers import indent, is_ip_address +from esphome.log import Fore, color, setup_log from esphome.util import ( + get_serial_ports, + list_yaml_files, run_external_command, run_external_process, safe_print, - list_yaml_files, - get_serial_ports, ) -from esphome.log import color, setup_log, Fore _LOGGER = logging.getLogger(__name__) @@ -116,6 +116,7 @@ def get_port_type(port): def run_miniterm(config, port): import serial + from esphome import platformio_api if CONF_LOGGER not in config: @@ -596,9 +597,10 @@ def command_update_all(args): def command_idedata(args, config): - from esphome import platformio_api import json + from esphome import platformio_api + logging.disable(logging.INFO) logging.disable(logging.WARNING) diff --git a/esphome/automation.py b/esphome/automation.py index b25ffa5abe..0bd6cf0af0 100644 --- a/esphome/automation.py +++ b/esphome/automation.py @@ -7,10 +7,10 @@ from esphome.const import ( CONF_ELSE, CONF_ID, CONF_THEN, + CONF_TIME, CONF_TIMEOUT, CONF_TRIGGER_ID, CONF_TYPE_ID, - CONF_TIME, CONF_UPDATE_INTERVAL, ) from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor diff --git a/esphome/codegen.py b/esphome/codegen.py index 6b000b53a1..bfa1683ce7 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -8,55 +8,78 @@ # want to break suddenly due to a rename (this file will get backports for features). # pylint: disable=unused-import -from esphome.cpp_generator import ( # noqa +from esphome.cpp_generator import ( # noqa: F401 + ArrayInitializer, Expression, + LineComment, + MockObj, + MockObjClass, + Pvariable, RawExpression, RawStatement, - TemplateArguments, - StructInitializer, - ArrayInitializer, - safe_exp, Statement, - LineComment, - progmem_array, - static_const_array, - statement, - variable, - with_local_variable, - new_variable, - Pvariable, - new_Pvariable, + StructInitializer, + TemplateArguments, add, - add_global, - add_library, add_build_flag, add_define, + add_global, + add_library, add_platformio_option, get_variable, get_variable_with_full_id, - process_lambda, is_template, + new_Pvariable, + new_variable, + process_lambda, + progmem_array, + safe_exp, + statement, + static_const_array, templatable, - MockObj, - MockObjClass, + variable, + with_local_variable, ) -from esphome.cpp_helpers import ( # noqa - gpio_pin_expression, - register_component, +from esphome.cpp_helpers import ( # noqa: F401 build_registry_entry, build_registry_list, extract_registry_entry_config, - register_parented, + gpio_pin_expression, past_safe_mode, + register_component, + register_parented, ) -from esphome.cpp_types import ( # noqa - global_ns, - void, - nullptr, - float_, - double, +from esphome.cpp_types import ( # noqa: F401 + NAN, + App, + Application, + Component, + ComponentPtr, + Controller, + EntityBase, + EntityCategory, + ESPTime, + GPIOPin, + InternalGPIOPin, + JsonObject, + JsonObjectConst, + Parented, + PollingComponent, + arduino_json_ns, bool_, + const_char_ptr, + double, + esphome_ns, + float_, + global_ns, + gpio_Flags, + int16, + int32, + int64, int_, + nullptr, + optional, + size_t, std_ns, std_shared_ptr, std_string, @@ -66,28 +89,5 @@ from esphome.cpp_types import ( # noqa uint16, uint32, uint64, - int16, - int32, - int64, - size_t, - const_char_ptr, - NAN, - esphome_ns, - App, - EntityBase, - Component, - ComponentPtr, - PollingComponent, - Application, - optional, - arduino_json_ns, - JsonObject, - JsonObjectConst, - Controller, - GPIOPin, - InternalGPIOPin, - gpio_Flags, - EntityCategory, - Parented, - ESPTime, + void, ) diff --git a/esphome/config.py b/esphome/config.py index 925a31fed0..a2d0d15477 100644 --- a/esphome/config.py +++ b/esphome/config.py @@ -1,40 +1,38 @@ from __future__ import annotations + import abc +from contextlib import contextmanager +import contextvars import functools import heapq import logging import re - -from typing import Union, Any - -from contextlib import contextmanager -import contextvars +from typing import Any, Union import voluptuous as vol -from esphome import core, yaml_util, loader, pins -import esphome.core.config as core_config +from esphome import core, loader, pins, yaml_util +from esphome.config_helpers import Extend, Remove +import esphome.config_validation as cv from esphome.const import ( CONF_ESPHOME, - CONF_ID, - CONF_PLATFORM, - CONF_PACKAGES, - CONF_SUBSTITUTIONS, CONF_EXTERNAL_COMPONENTS, + CONF_ID, + CONF_PACKAGES, + CONF_PLATFORM, + CONF_SUBSTITUTIONS, TARGET_PLATFORMS, ) -from esphome.core import CORE, EsphomeError, DocumentRange -from esphome.helpers import indent -from esphome.util import safe_print, OrderedDict - -from esphome.config_helpers import Extend, Remove -from esphome.loader import get_component, get_platform, ComponentManifest -from esphome.yaml_util import is_secret, ESPHomeDataBase, ESPForceValue -from esphome.voluptuous_schema import ExtraKeysInvalid -from esphome.log import color, Fore +from esphome.core import CORE, DocumentRange, EsphomeError +import esphome.core.config as core_config import esphome.final_validate as fv -import esphome.config_validation as cv -from esphome.types import ConfigType, ConfigFragmentType +from esphome.helpers import indent +from esphome.loader import ComponentManifest, get_component, get_platform +from esphome.log import Fore, color +from esphome.types import ConfigFragmentType, ConfigType +from esphome.util import OrderedDict, safe_print +from esphome.voluptuous_schema import ExtraKeysInvalid +from esphome.yaml_util import ESPForceValue, ESPHomeDataBase, is_secret _LOGGER = logging.getLogger(__name__) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 3ef92ad460..1cd1d6aa31 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -1,13 +1,13 @@ """Helpers for config validation using voluptuous.""" +from contextlib import contextmanager from dataclasses import dataclass +from datetime import datetime import logging import os import re -from contextlib import contextmanager -import uuid as uuid_ -from datetime import datetime from string import ascii_letters, digits +import uuid as uuid_ import voluptuous as vol @@ -17,37 +17,37 @@ from esphome.config_helpers import Extend, Remove from esphome.const import ( ALLOWED_NAME_CHARS, CONF_AVAILABILITY, - CONF_COMMAND_TOPIC, CONF_COMMAND_RETAIN, + CONF_COMMAND_TOPIC, + CONF_DAY, CONF_DISABLED_BY_DEFAULT, CONF_DISCOVERY, CONF_ENTITY_CATEGORY, + CONF_HOUR, CONF_ICON, CONF_ID, CONF_INTERNAL, + CONF_MINUTE, + CONF_MONTH, CONF_NAME, + CONF_PASSWORD, + CONF_PATH, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, - CONF_RETAIN, CONF_QOS, + CONF_REF, + CONF_RETAIN, + CONF_SECOND, CONF_SETUP_PRIORITY, CONF_STATE_TOPIC, CONF_TOPIC, - CONF_YEAR, - CONF_MONTH, - CONF_DAY, - CONF_HOUR, - CONF_MINUTE, - CONF_SECOND, - CONF_VALUE, - CONF_UPDATE_INTERVAL, - CONF_TYPE_ID, CONF_TYPE, - CONF_REF, + CONF_TYPE_ID, + CONF_UPDATE_INTERVAL, CONF_URL, - CONF_PATH, CONF_USERNAME, - CONF_PASSWORD, + CONF_VALUE, + CONF_YEAR, ENTITY_CATEGORY_CONFIG, ENTITY_CATEGORY_DIAGNOSTIC, ENTITY_CATEGORY_NONE, @@ -71,15 +71,15 @@ from esphome.core import ( TimePeriod, TimePeriodMicroseconds, TimePeriodMilliseconds, + TimePeriodMinutes, TimePeriodNanoseconds, TimePeriodSeconds, - TimePeriodMinutes, ) -from esphome.helpers import list_starts_with, add_class_to_obj +from esphome.helpers import add_class_to_obj, list_starts_with from esphome.schema_extractors import ( SCHEMA_EXTRACT, - schema_extractor_list, schema_extractor, + schema_extractor_list, schema_extractor_registry, schema_extractor_typed, ) @@ -1686,9 +1686,9 @@ class SplitDefault(Optional): if CORE.is_esp32: from esphome.components.esp32 import get_esp32_variant from esphome.components.esp32.const import ( + VARIANT_ESP32C3, VARIANT_ESP32S2, VARIANT_ESP32S3, - VARIANT_ESP32C3, ) variant = get_esp32_variant() diff --git a/esphome/core/__init__.py b/esphome/core/__init__.py index f25891965a..9d3d14492e 100644 --- a/esphome/core/__init__.py +++ b/esphome/core/__init__.py @@ -7,26 +7,29 @@ from typing import TYPE_CHECKING, Optional, Union from esphome.const import ( CONF_COMMENT, CONF_ESPHOME, - CONF_USE_ADDRESS, CONF_ETHERNET, + CONF_PORT, + CONF_USE_ADDRESS, CONF_WEB_SERVER, CONF_WIFI, - CONF_PORT, KEY_CORE, KEY_TARGET_FRAMEWORK, KEY_TARGET_PLATFORM, + PLATFORM_BK72XX, PLATFORM_ESP32, PLATFORM_ESP8266, - PLATFORM_BK72XX, - PLATFORM_RTL87XX, - PLATFORM_RP2040, PLATFORM_HOST, + PLATFORM_RP2040, + PLATFORM_RTL87XX, ) -from esphome.coroutine import FakeAwaitable as _FakeAwaitable -from esphome.coroutine import FakeEventLoop as _FakeEventLoop # pylint: disable=unused-import -from esphome.coroutine import coroutine, coroutine_with_priority # noqa +from esphome.coroutine import ( # noqa: F401 + FakeAwaitable as _FakeAwaitable, + FakeEventLoop as _FakeEventLoop, + coroutine, + coroutine_with_priority, +) from esphome.helpers import ensure_unique_string, get_str_env, is_ha_addon from esphome.util import OrderedDict diff --git a/esphome/core/config.py b/esphome/core/config.py index 80b731b905..739a8a1aea 100644 --- a/esphome/core/config.py +++ b/esphome/core/config.py @@ -3,9 +3,9 @@ import multiprocessing import os import re +from esphome import automation import esphome.codegen as cg import esphome.config_validation as cv -from esphome import automation from esphome.const import ( CONF_ARDUINO_VERSION, CONF_AREA, @@ -16,11 +16,11 @@ from esphome.const import ( CONF_COMPILE_PROCESS_LIMIT, CONF_ESPHOME, CONF_FRAMEWORK, + CONF_FRIENDLY_NAME, CONF_INCLUDES, CONF_LIBRARIES, CONF_MIN_VERSION, CONF_NAME, - CONF_FRIENDLY_NAME, CONF_ON_BOOT, CONF_ON_LOOP, CONF_ON_SHUTDOWN, @@ -34,8 +34,8 @@ from esphome.const import ( CONF_TYPE, CONF_VERSION, KEY_CORE, - TARGET_PLATFORMS, PLATFORM_ESP8266, + TARGET_PLATFORMS, __version__ as ESPHOME_VERSION, ) from esphome.core import CORE, coroutine_with_priority diff --git a/esphome/core/entity_helpers.py b/esphome/core/entity_helpers.py index f921711ec2..7f6a9b48ab 100644 --- a/esphome/core/entity_helpers.py +++ b/esphome/core/entity_helpers.py @@ -1,6 +1,5 @@ -import esphome.final_validate as fv - from esphome.const import CONF_ID +import esphome.final_validate as fv def inherit_property_from(property_to_inherit, parent_id_property, transform=None): diff --git a/esphome/coroutine.py b/esphome/coroutine.py index 5f391dc7ad..30ebb8147e 100644 --- a/esphome/coroutine.py +++ b/esphome/coroutine.py @@ -43,13 +43,13 @@ the last `yield` expression defines what is returned. """ import collections +from collections.abc import Awaitable, Generator, Iterator import functools import heapq import inspect import logging import types from typing import Any, Callable -from collections.abc import Awaitable, Generator, Iterator _LOGGER = logging.getLogger(__name__) diff --git a/esphome/cpp_generator.py b/esphome/cpp_generator.py index 9a4cb2269a..7a82d5cba1 100644 --- a/esphome/cpp_generator.py +++ b/esphome/cpp_generator.py @@ -1,8 +1,8 @@ import abc +from collections.abc import Sequence import inspect import math import re -from collections.abc import Sequence from typing import Any, Callable, Optional, Union from esphome.core import ( diff --git a/esphome/cpp_helpers.py b/esphome/cpp_helpers.py index 825224bb9d..9a775bad33 100644 --- a/esphome/cpp_helpers.py +++ b/esphome/cpp_helpers.py @@ -12,15 +12,13 @@ from esphome.const import ( CONF_UPDATE_INTERVAL, KEY_PAST_SAFE_MODE, ) - -from esphome.core import coroutine, ID, CORE +from esphome.core import CORE, ID, coroutine from esphome.coroutine import FakeAwaitable -from esphome.types import ConfigType, ConfigFragmentType from esphome.cpp_generator import add, get_variable from esphome.cpp_types import App +from esphome.helpers import sanitize, snake_case +from esphome.types import ConfigFragmentType, ConfigType from esphome.util import Registry, RegistryEntry -from esphome.helpers import snake_case, sanitize - _LOGGER = logging.getLogger(__name__) diff --git a/esphome/dashboard/core.py b/esphome/dashboard/core.py index 875ff6b91f..eec0777da6 100644 --- a/esphome/dashboard/core.py +++ b/esphome/dashboard/core.py @@ -1,13 +1,13 @@ from __future__ import annotations import asyncio +from collections.abc import Coroutine import contextlib -import logging -import threading from dataclasses import dataclass from functools import partial +import logging +import threading from typing import TYPE_CHECKING, Any, Callable -from collections.abc import Coroutine from ..zeroconf import DiscoveredImport from .dns import DNSCache diff --git a/esphome/dashboard/dashboard.py b/esphome/dashboard/dashboard.py index 2be98ab3e4..9de2d39ce2 100644 --- a/esphome/dashboard/dashboard.py +++ b/esphome/dashboard/dashboard.py @@ -1,14 +1,14 @@ from __future__ import annotations import asyncio +from asyncio import events +from concurrent.futures import ThreadPoolExecutor import logging import os import socket import threading -import traceback -from asyncio import events -from concurrent.futures import ThreadPoolExecutor from time import monotonic +import traceback from typing import Any from esphome.storage_json import EsphomeStorageJSON, esphome_storage_path diff --git a/esphome/dashboard/entries.py b/esphome/dashboard/entries.py index 7a9bff4ec1..cb0d4a3772 100644 --- a/esphome/dashboard/entries.py +++ b/esphome/dashboard/entries.py @@ -1,9 +1,9 @@ from __future__ import annotations import asyncio +from collections import defaultdict import logging import os -from collections import defaultdict from typing import TYPE_CHECKING, Any from esphome import const, util diff --git a/esphome/dashboard/util/file.py b/esphome/dashboard/util/file.py index 661d5f34cf..bb263f9ad7 100644 --- a/esphome/dashboard/util/file.py +++ b/esphome/dashboard/util/file.py @@ -1,7 +1,7 @@ import logging import os -import tempfile from pathlib import Path +import tempfile _LOGGER = logging.getLogger(__name__) diff --git a/esphome/dashboard/web_server.py b/esphome/dashboard/web_server.py index 33c83ffb1a..e4b7b8d342 100644 --- a/esphome/dashboard/web_server.py +++ b/esphome/dashboard/web_server.py @@ -2,6 +2,7 @@ from __future__ import annotations import asyncio import base64 +from collections.abc import Iterable import datetime import functools import gzip @@ -9,13 +10,12 @@ import hashlib import json import logging import os +from pathlib import Path import secrets import shutil import subprocess import threading import time -from collections.abc import Iterable -from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, TypeVar from urllib.parse import urlparse @@ -26,13 +26,13 @@ import tornado.httpserver import tornado.httputil import tornado.ioloop import tornado.iostream +from tornado.log import access_log import tornado.netutil import tornado.process import tornado.queues import tornado.web import tornado.websocket import yaml -from tornado.log import access_log from yaml.nodes import Node from esphome import const, platformio_api, yaml_util diff --git a/esphome/external_files.py b/esphome/external_files.py index f8eb1dcabe..baf62286e4 100644 --- a/esphome/external_files.py +++ b/esphome/external_files.py @@ -1,13 +1,15 @@ from __future__ import annotations -import logging -from pathlib import Path -import os from datetime import datetime +import logging +import os +from pathlib import Path + import requests + import esphome.config_validation as cv -from esphome.core import CORE, TimePeriodSeconds from esphome.const import __version__ +from esphome.core import CORE, TimePeriodSeconds _LOGGER = logging.getLogger(__name__) CODEOWNERS = ["@landonr"] diff --git a/esphome/final_validate.py b/esphome/final_validate.py index 5e9d2207b0..cebd2f1cda 100644 --- a/esphome/final_validate.py +++ b/esphome/final_validate.py @@ -1,9 +1,9 @@ from abc import ABC, abstractmethod -from typing import Any import contextvars +from typing import Any -from esphome.types import ConfigFragmentType, ID, ConfigPathType import esphome.config_validation as cv +from esphome.types import ID, ConfigFragmentType, ConfigPathType class FinalValidateConfig(ABC): diff --git a/esphome/git.py b/esphome/git.py index e41777f425..144c160b20 100644 --- a/esphome/git.py +++ b/esphome/git.py @@ -1,12 +1,12 @@ -import hashlib -import logging -import re -import subprocess -import urllib.parse from dataclasses import dataclass from datetime import datetime +import hashlib +import logging from pathlib import Path +import re +import subprocess from typing import Callable, Optional +import urllib.parse import esphome.config_validation as cv from esphome.core import CORE, TimePeriodSeconds diff --git a/esphome/helpers.py b/esphome/helpers.py index 4c8cb4e2cc..2a7e5cd9b6 100644 --- a/esphome/helpers.py +++ b/esphome/helpers.py @@ -1,14 +1,13 @@ import codecs from contextlib import suppress - import logging import os -import platform from pathlib import Path -from typing import Union -import tempfile -from urllib.parse import urlparse +import platform import re +import tempfile +from typing import Union +from urllib.parse import urlparse _LOGGER = logging.getLogger(__name__) @@ -129,9 +128,10 @@ def _resolve_with_zeroconf(host): def resolve_ip_address(host): - from esphome.core import EsphomeError import socket + from esphome.core import EsphomeError + errs = [] if host.endswith(".local"): diff --git a/esphome/mqtt.py b/esphome/mqtt.py index 667a20bcf8..d7e14a1d08 100644 --- a/esphome/mqtt.py +++ b/esphome/mqtt.py @@ -1,10 +1,10 @@ from datetime import datetime import hashlib +import json import logging import ssl import sys import time -import json import paho.mqtt.client as mqtt @@ -24,9 +24,9 @@ from esphome.const import ( CONF_USERNAME, ) from esphome.core import CORE, EsphomeError -from esphome.log import color, Fore +from esphome.helpers import get_int_env, get_str_env +from esphome.log import Fore, color from esphome.util import safe_print -from esphome.helpers import get_str_env, get_int_env _LOGGER = logging.getLogger(__name__) diff --git a/esphome/pins.py b/esphome/pins.py index 5ccb696738..724cd25d82 100644 --- a/esphome/pins.py +++ b/esphome/pins.py @@ -1,20 +1,20 @@ -import operator from functools import reduce -import esphome.config_validation as cv -from esphome.core import CORE +import operator +import esphome.config_validation as cv from esphome.const import ( + CONF_ALLOW_OTHER_USES, + CONF_IGNORE_STRAPPING_WARNING, CONF_INPUT, + CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_OPEN_DRAIN, CONF_OUTPUT, CONF_PULLDOWN, CONF_PULLUP, - CONF_IGNORE_STRAPPING_WARNING, - CONF_ALLOW_OTHER_USES, - CONF_INVERTED, ) +from esphome.core import CORE class PinRegistry(dict): diff --git a/esphome/platformio_api.py b/esphome/platformio_api.py index c46a3fc767..b81ec4ab37 100644 --- a/esphome/platformio_api.py +++ b/esphome/platformio_api.py @@ -1,12 +1,11 @@ from dataclasses import dataclass import json -from typing import Union -from pathlib import Path - import logging import os +from pathlib import Path import re import subprocess +from typing import Union from esphome.const import CONF_COMPILE_PROCESS_LIMIT, CONF_ESPHOME, KEY_CORE from esphome.core import CORE, EsphomeError @@ -20,9 +19,10 @@ def patch_structhash(): # removed/added. This might have unintended consequences, but this improves compile # times greatly when adding/removing components and a simple clean build solves # all issues - from platformio.run import helpers, cli - from os.path import join, isdir, getmtime from os import makedirs + from os.path import getmtime, isdir, join + + from platformio.run import cli, helpers def patched_clean_build_dir(build_dir, *args): from platformio import fs diff --git a/esphome/storage_json.py b/esphome/storage_json.py index 0a41a4f738..e2e7514904 100644 --- a/esphome/storage_json.py +++ b/esphome/storage_json.py @@ -1,10 +1,11 @@ from __future__ import annotations + import binascii import codecs +from datetime import datetime import json import logging import os -from datetime import datetime from esphome import const from esphome.const import CONF_DISABLED, CONF_MDNS diff --git a/esphome/types.py b/esphome/types.py index 27ec61ceff..4e69e3cbd7 100644 --- a/esphome/types.py +++ b/esphome/types.py @@ -2,7 +2,7 @@ from typing import Union -from esphome.core import ID, Lambda, EsphomeCore +from esphome.core import ID, EsphomeCore, Lambda ConfigFragmentType = Union[ str, diff --git a/esphome/util.py b/esphome/util.py index d5a4c60570..32fd90cd25 100644 --- a/esphome/util.py +++ b/esphome/util.py @@ -1,13 +1,12 @@ -from typing import Union - import collections import io import logging import os +from pathlib import Path import re import subprocess import sys -from pathlib import Path +from typing import Union from esphome import const diff --git a/esphome/voluptuous_schema.py b/esphome/voluptuous_schema.py index 9af6cb717c..7f1573b443 100644 --- a/esphome/voluptuous_schema.py +++ b/esphome/voluptuous_schema.py @@ -2,6 +2,7 @@ import difflib import itertools import voluptuous as vol + from esphome.schema_extractors import schema_extractor_extended diff --git a/esphome/vscode.py b/esphome/vscode.py index 8198d2659a..907ed88216 100644 --- a/esphome/vscode.py +++ b/esphome/vscode.py @@ -1,13 +1,14 @@ from __future__ import annotations + +from io import StringIO import json import os -from io import StringIO from typing import Any -from esphome.yaml_util import parse_yaml -from esphome.config import validate_config, _format_vol_invalid, Config -from esphome.core import CORE, DocumentRange +from esphome.config import Config, _format_vol_invalid, validate_config import esphome.config_validation as cv +from esphome.core import CORE, DocumentRange +from esphome.yaml_util import parse_yaml def _get_invalid_range(res: Config, invalid: cv.Invalid) -> DocumentRange | None: diff --git a/esphome/wizard.py b/esphome/wizard.py index f8911ae844..319fb31938 100644 --- a/esphome/wizard.py +++ b/esphome/wizard.py @@ -276,8 +276,8 @@ def wizard(path): from esphome.components.bk72xx import boards as bk72xx_boards from esphome.components.esp32 import boards as esp32_boards from esphome.components.esp8266 import boards as esp8266_boards - from esphome.components.rtl87xx import boards as rtl87xx_boards from esphome.components.rp2040 import boards as rp2040_boards + from esphome.components.rtl87xx import boards as rtl87xx_boards if not path.endswith(".yaml") and not path.endswith(".yml"): safe_print( diff --git a/esphome/writer.py b/esphome/writer.py index 3ad0e60d31..c6111cbe3f 100644 --- a/esphome/writer.py +++ b/esphome/writer.py @@ -1,27 +1,27 @@ import logging import os -import re from pathlib import Path +import re from typing import Union -from esphome.config import iter_components, iter_component_configs +from esphome import loader +from esphome.config import iter_component_configs, iter_components from esphome.const import ( + ENV_NOGITIGNORE, HEADER_FILE_EXTENSIONS, SOURCE_FILE_EXTENSIONS, __version__, - ENV_NOGITIGNORE, ) from esphome.core import CORE, EsphomeError from esphome.helpers import ( - mkdir_p, - read_file, - write_file_if_changed, - walk_files, copy_file_if_changed, get_bool_env, + mkdir_p, + read_file, + walk_files, + write_file_if_changed, ) from esphome.storage_json import StorageJSON, storage_path -from esphome import loader _LOGGER = logging.getLogger(__name__) diff --git a/esphome/yaml_util.py b/esphome/yaml_util.py index 06bfd8b217..d67511dfec 100644 --- a/esphome/yaml_util.py +++ b/esphome/yaml_util.py @@ -3,16 +3,16 @@ from __future__ import annotations import fnmatch import functools import inspect +from io import TextIOWrapper import logging import math import os -import uuid -from io import TextIOWrapper from typing import Any +import uuid import yaml -import yaml.constructor from yaml import SafeLoader as PurePythonLoader +import yaml.constructor try: from yaml import CSafeLoader as FastestAvailableSafeLoader diff --git a/esphome/zeroconf.py b/esphome/zeroconf.py index b67ea41323..b3ee64e259 100644 --- a/esphome/zeroconf.py +++ b/esphome/zeroconf.py @@ -1,8 +1,8 @@ from __future__ import annotations import asyncio -import logging from dataclasses import dataclass +import logging from typing import Callable from zeroconf import IPVersion, ServiceInfo, ServiceStateChange, Zeroconf From b3728697cc3997899bd7cb20fdeb9d8f3b1f06ae Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 20:13:57 +1200 Subject: [PATCH 065/164] Remove deprecated argument parser (#7151) * Remove deprecated argument parser * Add back removed argcomplete line --- esphome/__main__.py | 68 --------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 13f09e15ed..7237a04717 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -957,67 +957,6 @@ def parse_args(argv): # a deprecation warning). arguments = argv[1:] - # On Python 3.9+ we can simply set exit_on_error=False in the constructor - def _raise(x): - raise argparse.ArgumentError(None, x) - - # First, try new-style parsing, but don't exit in case of failure - try: - # duplicate parser so that we can use the original one to raise errors later on - current_parser = argparse.ArgumentParser(add_help=False, parents=[parser]) - current_parser.set_defaults(deprecated_argv_suggestion=None) - current_parser.error = _raise - return current_parser.parse_args(arguments) - except argparse.ArgumentError: - pass - - # Second, try compat parsing and rearrange the command-line if it succeeds - # Disable argparse's built-in help option and add it manually to prevent this - # parser from printing the help messagefor the old format when invoked with -h. - compat_parser = argparse.ArgumentParser(parents=[options_parser], add_help=False) - compat_parser.add_argument("-h", "--help", action="store_true") - compat_parser.add_argument("configuration", nargs="*") - compat_parser.add_argument( - "command", - choices=[ - "config", - "compile", - "upload", - "logs", - "run", - "clean-mqtt", - "wizard", - "mqtt-fingerprint", - "version", - "clean", - "dashboard", - "vscode", - "update-all", - ], - ) - - try: - compat_parser.error = _raise - result, unparsed = compat_parser.parse_known_args(argv[1:]) - last_option = len(arguments) - len(unparsed) - 1 - len(result.configuration) - unparsed = [ - "--device" if arg in ("--upload-port", "--serial-port") else arg - for arg in unparsed - ] - arguments = ( - arguments[0:last_option] - + [result.command] - + result.configuration - + unparsed - ) - deprecated_argv_suggestion = arguments - except argparse.ArgumentError: - # old-style parsing failed, don't suggest any argument - deprecated_argv_suggestion = None - - # Finally, run the new-style parser again with the possibly swapped arguments, - # and let it error out if the command is unparsable. - parser.set_defaults(deprecated_argv_suggestion=deprecated_argv_suggestion) argcomplete.autocomplete(parser) return parser.parse_args(arguments) @@ -1032,13 +971,6 @@ def run_esphome(argv): # Show timestamp for dashboard access logs args.command == "dashboard", ) - if args.deprecated_argv_suggestion is not None and args.command != "vscode": - _LOGGER.warning( - "Calling ESPHome with the configuration before the command is deprecated " - "and will be removed in the future. " - ) - _LOGGER.warning("Please instead use:") - _LOGGER.warning(" esphome %s", " ".join(args.deprecated_argv_suggestion)) if sys.version_info < (3, 8, 0): _LOGGER.error( From 24515546fd25a265dbb704890a6d7c9285775b17 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 20:22:30 +1200 Subject: [PATCH 066/164] Move ``CONF_ON_ERROR`` to const.py (#7156) --- esphome/components/ota/__init__.py | 12 ++++++--- .../components/voice_assistant/__init__.py | 27 +++++++++---------- esphome/const.py | 1 + 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/esphome/components/ota/__init__.py b/esphome/components/ota/__init__.py index 4e447bfb2d..d9917a2aae 100644 --- a/esphome/components/ota/__init__.py +++ b/esphome/components/ota/__init__.py @@ -1,10 +1,15 @@ +from esphome import automation import esphome.codegen as cg import esphome.config_validation as cv -from esphome import automation +from esphome.const import ( + CONF_ESPHOME, + CONF_ON_ERROR, + CONF_OTA, + CONF_PLATFORM, + CONF_TRIGGER_ID, +) from esphome.core import CORE, coroutine_with_priority -from esphome.const import CONF_ESPHOME, CONF_OTA, CONF_PLATFORM, CONF_TRIGGER_ID - CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["md5", "safe_mode"] @@ -13,7 +18,6 @@ IS_PLATFORM_COMPONENT = True CONF_ON_ABORT = "on_abort" CONF_ON_BEGIN = "on_begin" CONF_ON_END = "on_end" -CONF_ON_ERROR = "on_error" CONF_ON_PROGRESS = "on_progress" CONF_ON_STATE_CHANGE = "on_state_change" diff --git a/esphome/components/voice_assistant/__init__.py b/esphome/components/voice_assistant/__init__.py index c18f0a6850..031edbf27a 100644 --- a/esphome/components/voice_assistant/__init__.py +++ b/esphome/components/voice_assistant/__init__.py @@ -1,18 +1,18 @@ -import esphome.config_validation as cv -import esphome.codegen as cg - -from esphome.const import ( - CONF_ID, - CONF_MICROPHONE, - CONF_SPEAKER, - CONF_MEDIA_PLAYER, - CONF_ON_CLIENT_CONNECTED, - CONF_ON_CLIENT_DISCONNECTED, - CONF_ON_IDLE, -) from esphome import automation from esphome.automation import register_action, register_condition -from esphome.components import microphone, speaker, media_player +import esphome.codegen as cg +from esphome.components import media_player, microphone, speaker +import esphome.config_validation as cv +from esphome.const import ( + CONF_ID, + CONF_MEDIA_PLAYER, + CONF_MICROPHONE, + CONF_ON_CLIENT_CONNECTED, + CONF_ON_CLIENT_DISCONNECTED, + CONF_ON_ERROR, + CONF_ON_IDLE, + CONF_SPEAKER, +) AUTO_LOAD = ["socket"] DEPENDENCIES = ["api", "microphone"] @@ -20,7 +20,6 @@ DEPENDENCIES = ["api", "microphone"] CODEOWNERS = ["@jesserockz"] CONF_ON_END = "on_end" -CONF_ON_ERROR = "on_error" CONF_ON_INTENT_END = "on_intent_end" CONF_ON_INTENT_START = "on_intent_start" CONF_ON_LISTENING = "on_listening" diff --git a/esphome/const.py b/esphome/const.py index faf6ce19fa..4357963384 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -539,6 +539,7 @@ CONF_ON_DOUBLE_CLICK = "on_double_click" CONF_ON_ENROLLMENT_DONE = "on_enrollment_done" CONF_ON_ENROLLMENT_FAILED = "on_enrollment_failed" CONF_ON_ENROLLMENT_SCAN = "on_enrollment_scan" +CONF_ON_ERROR = "on_error" CONF_ON_EVENT = "on_event" CONF_ON_FINGER_SCAN_INVALID = "on_finger_scan_invalid" CONF_ON_FINGER_SCAN_MATCHED = "on_finger_scan_matched" From 5b6b7c0d15098f7477bae68329fe76a1d8993cf5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 29 Jul 2024 20:25:53 +1200 Subject: [PATCH 067/164] [code-quality] Organise esp32 imports (#7154) --- esphome/components/esp32/__init__.py | 19 ++++++++--------- esphome/components/esp32/boards.py | 2 +- esphome/components/esp32/gpio.py | 25 +++++++++++------------ esphome/components/esp32/gpio_esp32.py | 3 +-- esphome/components/esp32/gpio_esp32_c2.py | 3 +-- esphome/components/esp32/gpio_esp32_c3.py | 6 +----- esphome/components/esp32/gpio_esp32_c6.py | 3 +-- esphome/components/esp32/gpio_esp32_h2.py | 3 +-- esphome/components/esp32/gpio_esp32_s2.py | 3 +-- esphome/components/esp32/gpio_esp32_s3.py | 7 +------ 10 files changed, 29 insertions(+), 45 deletions(-) diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 1effea708f..0a5dd46478 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -1,11 +1,12 @@ from dataclasses import dataclass -from typing import Union, Optional -from pathlib import Path import logging import os -import esphome.final_validate as fv +from pathlib import Path +from typing import Optional, Union -from esphome.helpers import copy_file_if_changed, write_file_if_changed, mkdir_p +from esphome import git +import esphome.codegen as cg +import esphome.config_validation as cv from esphome.const import ( CONF_ADVANCED, CONF_BOARD, @@ -15,6 +16,7 @@ from esphome.const import ( CONF_IGNORE_EFUSE_MAC_CRC, CONF_NAME, CONF_PATH, + CONF_PLATFORM_VERSION, CONF_PLATFORMIO_OPTIONS, CONF_REF, CONF_REFRESH, @@ -32,13 +34,12 @@ from esphome.const import ( TYPE_GIT, TYPE_LOCAL, __version__, - CONF_PLATFORM_VERSION, ) from esphome.core import CORE, HexInt, TimePeriod -import esphome.config_validation as cv -import esphome.codegen as cg -from esphome import git +import esphome.final_validate as fv +from esphome.helpers import copy_file_if_changed, mkdir_p, write_file_if_changed +from .boards import BOARDS from .const import ( # noqa KEY_BOARD, KEY_COMPONENTS, @@ -54,12 +55,10 @@ from .const import ( # noqa VARIANT_FRIENDLY, VARIANTS, ) -from .boards import BOARDS # force import gpio to register pin schema from .gpio import esp32_pin_to_code # noqa - _LOGGER = logging.getLogger(__name__) CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["preferences"] diff --git a/esphome/components/esp32/boards.py b/esphome/components/esp32/boards.py index cd85f3da97..60abcd447c 100644 --- a/esphome/components/esp32/boards.py +++ b/esphome/components/esp32/boards.py @@ -1,4 +1,4 @@ -from .const import VARIANT_ESP32, VARIANT_ESP32S2, VARIANT_ESP32C3, VARIANT_ESP32S3 +from .const import VARIANT_ESP32, VARIANT_ESP32C3, VARIANT_ESP32S2, VARIANT_ESP32S3 ESP32_BASE_PINS = { "TX": 1, diff --git a/esphome/components/esp32/gpio.py b/esphome/components/esp32/gpio.py index 0d9cb5daf0..558ff51af8 100644 --- a/esphome/components/esp32/gpio.py +++ b/esphome/components/esp32/gpio.py @@ -1,22 +1,22 @@ from dataclasses import dataclass -from typing import Any import logging +from typing import Any +from esphome import pins +import esphome.codegen as cg +import esphome.config_validation as cv from esphome.const import ( CONF_ID, + CONF_IGNORE_PIN_VALIDATION_ERROR, + CONF_IGNORE_STRAPPING_WARNING, CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_OPEN_DRAIN, CONF_OUTPUT, - CONF_IGNORE_PIN_VALIDATION_ERROR, - CONF_IGNORE_STRAPPING_WARNING, PLATFORM_ESP32, ) -from esphome import pins from esphome.core import CORE -import esphome.config_validation as cv -import esphome.codegen as cg from . import boards from .const import ( @@ -24,22 +24,21 @@ from .const import ( KEY_ESP32, KEY_VARIANT, VARIANT_ESP32, - VARIANT_ESP32C3, - VARIANT_ESP32S2, - VARIANT_ESP32S3, VARIANT_ESP32C2, + VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32S2, + VARIANT_ESP32S3, esp32_ns, ) - from .gpio_esp32 import esp32_validate_gpio_pin, esp32_validate_supports -from .gpio_esp32_s2 import esp32_s2_validate_gpio_pin, esp32_s2_validate_supports -from .gpio_esp32_c3 import esp32_c3_validate_gpio_pin, esp32_c3_validate_supports -from .gpio_esp32_s3 import esp32_s3_validate_gpio_pin, esp32_s3_validate_supports from .gpio_esp32_c2 import esp32_c2_validate_gpio_pin, esp32_c2_validate_supports +from .gpio_esp32_c3 import esp32_c3_validate_gpio_pin, esp32_c3_validate_supports from .gpio_esp32_c6 import esp32_c6_validate_gpio_pin, esp32_c6_validate_supports from .gpio_esp32_h2 import esp32_h2_validate_gpio_pin, esp32_h2_validate_supports +from .gpio_esp32_s2 import esp32_s2_validate_gpio_pin, esp32_s2_validate_supports +from .gpio_esp32_s3 import esp32_s3_validate_gpio_pin, esp32_s3_validate_supports ESP32InternalGPIOPin = esp32_ns.class_("ESP32InternalGPIOPin", cg.InternalGPIOPin) diff --git a/esphome/components/esp32/gpio_esp32.py b/esphome/components/esp32/gpio_esp32.py index d10b266c7a..e4d3b6aaf3 100644 --- a/esphome/components/esp32/gpio_esp32.py +++ b/esphome/components/esp32/gpio_esp32.py @@ -1,5 +1,6 @@ import logging +import esphome.config_validation as cv from esphome.const import ( CONF_INPUT, CONF_MODE, @@ -8,10 +9,8 @@ from esphome.const import ( CONF_PULLDOWN, CONF_PULLUP, ) -import esphome.config_validation as cv from esphome.pins import check_strapping_pin - _ESP_SDIO_PINS = { 6: "Flash Clock", 7: "Flash Data 0", diff --git a/esphome/components/esp32/gpio_esp32_c2.py b/esphome/components/esp32/gpio_esp32_c2.py index 0bee7d82bf..abdcb1b655 100644 --- a/esphome/components/esp32/gpio_esp32_c2.py +++ b/esphome/components/esp32/gpio_esp32_c2.py @@ -1,10 +1,9 @@ import logging +import esphome.config_validation as cv from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER from esphome.pins import check_strapping_pin -import esphome.config_validation as cv - _ESP32C2_STRAPPING_PINS = {8, 9} _LOGGER = logging.getLogger(__name__) diff --git a/esphome/components/esp32/gpio_esp32_c3.py b/esphome/components/esp32/gpio_esp32_c3.py index 6c70c09f9e..5b9ec0ebd9 100644 --- a/esphome/components/esp32/gpio_esp32_c3.py +++ b/esphome/components/esp32/gpio_esp32_c3.py @@ -1,11 +1,7 @@ import logging -from esphome.const import ( - CONF_INPUT, - CONF_MODE, - CONF_NUMBER, -) import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER from esphome.pins import check_strapping_pin _ESP32C3_SPI_PSRAM_PINS = { diff --git a/esphome/components/esp32/gpio_esp32_c6.py b/esphome/components/esp32/gpio_esp32_c6.py index a1f777c625..bc735f85c4 100644 --- a/esphome/components/esp32/gpio_esp32_c6.py +++ b/esphome/components/esp32/gpio_esp32_c6.py @@ -1,8 +1,7 @@ import logging -from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER - import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER from esphome.pins import check_strapping_pin _ESP32C6_SPI_PSRAM_PINS = { diff --git a/esphome/components/esp32/gpio_esp32_h2.py b/esphome/components/esp32/gpio_esp32_h2.py index d18ee8a2a6..7413bf4db5 100644 --- a/esphome/components/esp32/gpio_esp32_h2.py +++ b/esphome/components/esp32/gpio_esp32_h2.py @@ -1,8 +1,7 @@ import logging -from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER - import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER _ESP32H2_SPI_FLASH_PINS = {6, 7, 15, 16, 17, 18, 19, 20, 21} diff --git a/esphome/components/esp32/gpio_esp32_s2.py b/esphome/components/esp32/gpio_esp32_s2.py index 82449532ec..331aeb9d94 100644 --- a/esphome/components/esp32/gpio_esp32_s2.py +++ b/esphome/components/esp32/gpio_esp32_s2.py @@ -1,5 +1,6 @@ import logging +import esphome.config_validation as cv from esphome.const import ( CONF_INPUT, CONF_MODE, @@ -8,8 +9,6 @@ from esphome.const import ( CONF_PULLDOWN, CONF_PULLUP, ) - -import esphome.config_validation as cv from esphome.pins import check_strapping_pin _ESP32S2_SPI_PSRAM_PINS = { diff --git a/esphome/components/esp32/gpio_esp32_s3.py b/esphome/components/esp32/gpio_esp32_s3.py index 8dcbf8c7bb..7120504693 100644 --- a/esphome/components/esp32/gpio_esp32_s3.py +++ b/esphome/components/esp32/gpio_esp32_s3.py @@ -1,12 +1,7 @@ import logging -from esphome.const import ( - CONF_INPUT, - CONF_MODE, - CONF_NUMBER, -) - import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER from esphome.pins import check_strapping_pin _ESP_32S3_SPI_PSRAM_PINS = { From 341fc659589a592fef60321227209f1014ccf34e Mon Sep 17 00:00:00 2001 From: FreeBear-nc <67865163+FreeBear-nc@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:05:25 +0100 Subject: [PATCH 068/164] Add microAmp and milliAmp to defined units (#7157) --- esphome/const.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/const.py b/esphome/const.py index 4357963384..37844e1047 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1033,11 +1033,13 @@ UNIT_KILOWATT_HOURS = "kWh" UNIT_LUX = "lx" UNIT_METER = "m" UNIT_METER_PER_SECOND_SQUARED = "m/s²" +UNIT_MICROAMP = "µA" UNIT_MICROGRAMS_PER_CUBIC_METER = "µg/m³" UNIT_MICROMETER = "µm" UNIT_MICROSIEMENS_PER_CENTIMETER = "µS/cm" UNIT_MICROSILVERTS_PER_HOUR = "µSv/h" UNIT_MICROTESLA = "µT" +UNIT_MILLIAMP = "mA" UNIT_MILLIGRAMS_PER_CUBIC_METER = "mg/m³" UNIT_MILLIMETER = "mm" UNIT_MILLISECOND = "ms" From 25c8676d80cb9a6b75cd6413aa4f9a99f3a662e5 Mon Sep 17 00:00:00 2001 From: RubyBailey <60991881+RubyBailey@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:20:29 -0700 Subject: [PATCH 069/164] Fix for Mitsubishi units that only support cooling (#7143) --- esphome/components/mitsubishi/mitsubishi.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/esphome/components/mitsubishi/mitsubishi.cpp b/esphome/components/mitsubishi/mitsubishi.cpp index a02aabf14d..449c8fc712 100644 --- a/esphome/components/mitsubishi/mitsubishi.cpp +++ b/esphome/components/mitsubishi/mitsubishi.cpp @@ -110,7 +110,7 @@ void MitsubishiClimate::transmit_state() { // Byte 15: HVAC specfic, i.e. POWERFUL, SMART SET, PLASMA, always 0x00 // Byte 16: Constant 0x00 // Byte 17: Checksum: SUM[Byte0...Byte16] - uint8_t remote_state[18] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x00, 0x00, + uint8_t remote_state[18] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; switch (this->mode) { @@ -136,6 +136,12 @@ void MitsubishiClimate::transmit_state() { break; case climate::CLIMATE_MODE_OFF: default: + remote_state[6] = MITSUBISHI_MODE_COOL; + remote_state[8] = MITSUBISHI_MODE_A_COOL; + if (this->supports_heat_) { + remote_state[6] = MITSUBISHI_MODE_HEAT; + remote_state[8] = MITSUBISHI_MODE_A_HEAT; + } remote_state[5] = MITSUBISHI_OFF; break; } From 12e840ee88705b063817e48c7f8a15f817103ad5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:36:09 +1200 Subject: [PATCH 070/164] Bump docker/setup-buildx-action from 3.5.0 to 3.6.1 in the docker-actions group (#7159) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 2b4539105b..91c02b0a17 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -46,7 +46,7 @@ jobs: with: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.5.0 + uses: docker/setup-buildx-action@v3.6.1 - name: Set up QEMU uses: docker/setup-qemu-action@v3.2.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index efec556059..d454076c84 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,7 @@ jobs: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.5.0 + uses: docker/setup-buildx-action@v3.6.1 - name: Set up QEMU if: matrix.platform != 'linux/amd64' uses: docker/setup-qemu-action@v3.2.0 @@ -184,7 +184,7 @@ jobs: merge-multiple: true - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.5.0 + uses: docker/setup-buildx-action@v3.6.1 - name: Log in to docker hub if: matrix.registry == 'dockerhub' From 7c1aa771aaa9c9ea2f2c42a0b981ef8267a9d664 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Tue, 30 Jul 2024 09:41:34 +1000 Subject: [PATCH 071/164] LVGL stage 2 (#7129) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/lvgl/__init__.py | 38 +++++--- esphome/components/lvgl/btn.py | 25 +++++ esphome/components/lvgl/defines.py | 9 +- esphome/components/lvgl/helpers.py | 1 - esphome/components/lvgl/label.py | 21 ++-- esphome/components/lvgl/lv_validation.py | 79 ++++++++++++--- esphome/components/lvgl/lvgl_esphome.cpp | 6 ++ esphome/components/lvgl/lvgl_esphome.h | 59 ++++++++++-- esphome/components/lvgl/obj.py | 11 +-- esphome/components/lvgl/schemas.py | 64 +++++++------ esphome/components/lvgl/touchscreens.py | 46 +++++++++ esphome/components/lvgl/types.py | 112 +++++++++++++++++----- esphome/components/lvgl/widget.py | 73 ++------------ esphome/core/defines.h | 1 + tests/components/lvgl/common.yaml | 10 ++ tests/components/lvgl/logo-text.svg | 25 +++++ tests/components/lvgl/lvgl-package.yaml | 102 +++++++++++++++++++- tests/components/lvgl/test.esp32-idf.yaml | 4 +- 18 files changed, 503 insertions(+), 183 deletions(-) create mode 100644 esphome/components/lvgl/btn.py create mode 100644 esphome/components/lvgl/touchscreens.py create mode 100644 tests/components/lvgl/logo-text.svg diff --git a/esphome/components/lvgl/__init__.py b/esphome/components/lvgl/__init__.py index 2f3bd69546..c454a61957 100644 --- a/esphome/components/lvgl/__init__.py +++ b/esphome/components/lvgl/__init__.py @@ -16,13 +16,20 @@ from esphome.final_validate import full_config from esphome.helpers import write_file_if_changed from . import defines as df, helpers, lv_validation as lvalid +from .btn import btn_spec from .label import label_spec from .lvcode import ConstantLiteral, LvContext - -# from .menu import menu_spec from .obj import obj_spec -from .schemas import WIDGET_TYPES, any_widget_schema, obj_schema -from .types import FontEngine, LvglComponent, lv_disp_t_ptr, lv_font_t, lvgl_ns +from .schemas import any_widget_schema, obj_schema +from .touchscreens import touchscreen_schema, touchscreens_to_code +from .types import ( + WIDGET_TYPES, + FontEngine, + LvglComponent, + lv_disp_t_ptr, + lv_font_t, + lvgl_ns, +) from .widget import LvScrActType, Widget, add_widgets, set_obj_properties DOMAIN = "lvgl" @@ -31,11 +38,8 @@ AUTO_LOAD = ("key_provider",) CODEOWNERS = ("@clydebarrow",) LOGGER = logging.getLogger(__name__) -for widg in ( - label_spec, - obj_spec, -): - WIDGET_TYPES[widg.name] = widg +for w_type in (label_spec, obj_spec, btn_spec): + WIDGET_TYPES[w_type.name] = w_type lv_scr_act_spec = LvScrActType() lv_scr_act = Widget.create( @@ -93,7 +97,7 @@ def final_validation(config): "Using auto_clear_enabled: true in display config not compatible with LVGL" ) buffer_frac = config[CONF_BUFFER_SIZE] - if not CORE.is_host and buffer_frac > 0.5 and "psram" not in global_config: + if CORE.is_esp32 and buffer_frac > 0.5 and "psram" not in global_config: LOGGER.warning("buffer_size: may need to be reduced without PSRAM") @@ -132,7 +136,7 @@ async def to_code(config): cg.add_global(lvgl_ns.using) lv_component = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(lv_component, config) - Widget.create(config[CONF_ID], lv_component, WIDGET_TYPES[df.CONF_OBJ], config) + Widget.create(config[CONF_ID], lv_component, obj_spec, config) for display in config[df.CONF_DISPLAYS]: cg.add(lv_component.add_display(await cg.get_variable(display))) @@ -152,7 +156,7 @@ async def to_code(config): await cg.get_variable(font) cg.new_Pvariable(ID(f"{font}_engine", True, type=FontEngine), MockObj(font)) default_font = config[df.CONF_DEFAULT_FONT] - if default_font not in helpers.lv_fonts_used: + if not lvalid.is_lv_font(default_font): add_define( "LV_FONT_CUSTOM_DECLARE", f"LV_FONT_DECLARE(*{df.DEFAULT_ESPHOME_FONT})" ) @@ -161,12 +165,15 @@ async def to_code(config): True, type=lv_font_t.operator("ptr").operator("const"), ) - cg.new_variable(globfont_id, MockObj(default_font)) + cg.new_variable( + globfont_id, MockObj(await lvalid.lv_font.process(default_font)) + ) add_define("LV_FONT_DEFAULT", df.DEFAULT_ESPHOME_FONT) else: - add_define("LV_FONT_DEFAULT", default_font) + add_define("LV_FONT_DEFAULT", await lvalid.lv_font.process(default_font)) with LvContext(): + await touchscreens_to_code(lv_component, config) await set_obj_properties(lv_scr_act, config) await add_widgets(lv_scr_act, config) Widget.set_completed() @@ -190,7 +197,7 @@ FINAL_VALIDATE_SCHEMA = final_validation CONFIG_SCHEMA = ( cv.polling_component_schema("1s") - .extend(obj_schema("obj")) + .extend(obj_schema(obj_spec)) .extend( { cv.GenerateID(CONF_ID): cv.declare_id(LvglComponent), @@ -207,6 +214,7 @@ CONFIG_SCHEMA = ( ), cv.Optional(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA), cv.Optional(df.CONF_TRANSPARENCY_KEY, default=0x000400): lvalid.lv_color, + cv.GenerateID(df.CONF_TOUCHSCREENS): touchscreen_schema, } ) ).add_extra(cv.has_at_least_one_key(CONF_PAGES, df.CONF_WIDGETS)) diff --git a/esphome/components/lvgl/btn.py b/esphome/components/lvgl/btn.py new file mode 100644 index 0000000000..4f5f88d9e6 --- /dev/null +++ b/esphome/components/lvgl/btn.py @@ -0,0 +1,25 @@ +from esphome.const import CONF_BUTTON +from esphome.cpp_generator import MockObjClass + +from .defines import CONF_MAIN +from .types import LvBoolean, WidgetType + + +class BtnType(WidgetType): + def __init__(self): + super().__init__(CONF_BUTTON, LvBoolean("lv_btn_t"), (CONF_MAIN,)) + + async def to_code(self, w, config): + return [] + + def obj_creator(self, parent: MockObjClass, config: dict): + """ + LVGL 8 calls buttons `btn` + """ + return f"lv_btn_create({parent})" + + def get_uses(self): + return ("btn",) + + +btn_spec = BtnType() diff --git a/esphome/components/lvgl/defines.py b/esphome/components/lvgl/defines.py index 50bdac3865..a2b4ac13fb 100644 --- a/esphome/components/lvgl/defines.py +++ b/esphome/components/lvgl/defines.py @@ -446,6 +446,7 @@ CONF_TILE_ID = "tile_id" CONF_TILES = "tiles" CONF_TITLE = "title" CONF_TOP_LAYER = "top_layer" +CONF_TOUCHSCREENS = "touchscreens" CONF_TRANSPARENCY_KEY = "transparency_key" CONF_THEME = "theme" CONF_VISIBLE_ROW_COUNT = "visible_row_count" @@ -474,14 +475,8 @@ LV_KEYS = LvConstant( ) -# list of widgets and the parts allowed -WIDGET_PARTS = { - CONF_LABEL: (CONF_MAIN, CONF_SCROLLBAR, CONF_SELECTED), - CONF_OBJ: (CONF_MAIN,), -} - DEFAULT_ESPHOME_FONT = "esphome_lv_default_font" def join_enums(enums, prefix=""): - return "|".join(f"(int){prefix}{e.upper()}" for e in enums) + return ConstantLiteral("|".join(f"(int){prefix}{e.upper()}" for e in enums)) diff --git a/esphome/components/lvgl/helpers.py b/esphome/components/lvgl/helpers.py index c8d4948fb1..d67739155c 100644 --- a/esphome/components/lvgl/helpers.py +++ b/esphome/components/lvgl/helpers.py @@ -22,7 +22,6 @@ def add_lv_use(*names): lv_fonts_used = set() esphome_fonts_used = set() -REQUIRED_COMPONENTS = {} lvgl_components_required = set() diff --git a/esphome/components/lvgl/label.py b/esphome/components/lvgl/label.py index 5c4ae6ab0d..0498f39474 100644 --- a/esphome/components/lvgl/label.py +++ b/esphome/components/lvgl/label.py @@ -1,16 +1,27 @@ import esphome.config_validation as cv -from .defines import CONF_LABEL, CONF_LONG_MODE, CONF_RECOLOR, CONF_TEXT, LV_LONG_MODES +from .defines import ( + CONF_LABEL, + CONF_LONG_MODE, + CONF_MAIN, + CONF_RECOLOR, + CONF_SCROLLBAR, + CONF_SELECTED, + CONF_TEXT, + LV_LONG_MODES, +) from .lv_validation import lv_bool, lv_text from .schemas import TEXT_SCHEMA -from .types import lv_label_t -from .widget import Widget, WidgetType +from .types import LvText, WidgetType +from .widget import Widget class LabelType(WidgetType): def __init__(self): super().__init__( CONF_LABEL, + LvText("lv_label_t"), + (CONF_MAIN, CONF_SCROLLBAR, CONF_SELECTED), TEXT_SCHEMA.extend( { cv.Optional(CONF_RECOLOR): lv_bool, @@ -19,10 +30,6 @@ class LabelType(WidgetType): ), ) - @property - def w_type(self): - return lv_label_t - async def to_code(self, w: Widget, config): """For a text object, create and set text""" if value := config.get(CONF_TEXT): diff --git a/esphome/components/lvgl/lv_validation.py b/esphome/components/lvgl/lv_validation.py index 1de63c30ce..533dc582f0 100644 --- a/esphome/components/lvgl/lv_validation.py +++ b/esphome/components/lvgl/lv_validation.py @@ -8,6 +8,7 @@ import esphome.config_validation as cv from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT from esphome.core import HexInt from esphome.cpp_generator import MockObj +from esphome.cpp_types import uint32 from esphome.helpers import cpp_string_escape from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor @@ -23,6 +24,28 @@ from .lvcode import ConstantLiteral, lv_expr from .types import lv_font_t +def literal_mapper(value, args=()): + if isinstance(value, str): + return ConstantLiteral(value) + return value + + +opacity_consts = LvConstant("LV_OPA_", "TRANSP", "COVER") + + +@schema_extractor("one_of") +def opacity_validator(value): + if value == SCHEMA_EXTRACT: + return opacity_consts.choices + value = cv.Any(cv.percentage, opacity_consts.one_of)(value) + if isinstance(value, float): + return int(value * 255) + return value + + +opacity = LValidator(opacity_validator, uint32, retmapper=literal_mapper) + + @schema_extractor("one_of") def color(value): if value == SCHEMA_EXTRACT: @@ -43,16 +66,24 @@ def color_retmapper(value): return lv_expr.color_from(MockObj(value)) -def pixels_or_percent(value): +lv_color = LValidator(color, ty.lv_color_t, retmapper=color_retmapper) + + +def pixels_or_percent_validator(value): """A length in one axis - either a number (pixels) or a percentage""" if value == SCHEMA_EXTRACT: return ["pixels", "..%"] if isinstance(value, int): - return str(cv.int_(value)) + return cv.int_(value) # Will throw an exception if not a percentage. return f"lv_pct({int(cv.percentage(value) * 100)})" +pixels_or_percent = LValidator( + pixels_or_percent_validator, uint32, retmapper=literal_mapper +) + + def zoom(value): value = cv.float_range(0.1, 10.0)(value) return int(value * 256) @@ -68,7 +99,7 @@ def angle(value): @schema_extractor("one_of") -def size(value): +def size_validator(value): """A size in one axis - one of "size_content", a number (pixels) or a percentage""" if value == SCHEMA_EXTRACT: return ["size_content", "pixels", "..%"] @@ -79,28 +110,42 @@ def size(value): return "LV_SIZE_CONTENT" raise cv.Invalid("must be 'size_content', a pixel position or a percentage") if isinstance(value, int): - return str(cv.int_(value)) + return cv.int_(value) # Will throw an exception if not a percentage. return f"lv_pct({int(cv.percentage(value) * 100)})" +size = LValidator(size_validator, uint32, retmapper=literal_mapper) + +radius_consts = LvConstant("LV_RADIUS_", "CIRCLE") + + @schema_extractor("one_of") -def opacity(value): - consts = LvConstant("LV_OPA_", "TRANSP", "COVER") +def radius_validator(value): if value == SCHEMA_EXTRACT: - return consts.choices - value = cv.Any(cv.percentage, consts.one_of)(value) + return radius_consts.choices + value = cv.Any(size, cv.percentage, radius_consts.one_of)(value) if isinstance(value, float): return int(value * 255) return value +def id_name(value): + if value == SCHEMA_EXTRACT: + return "id" + return cv.validate_id_name(value) + + +radius = LValidator(radius_validator, uint32, retmapper=literal_mapper) + + def stop_value(value): return cv.int_range(0, 255)(value) -lv_color = LValidator(color, ty.lv_color_t, retmapper=color_retmapper) -lv_bool = LValidator(cv.boolean, cg.bool_, BinarySensor, "get_state()") +lv_bool = LValidator( + cv.boolean, cg.bool_, BinarySensor, "get_state()", retmapper=literal_mapper +) def lvms_validator_(value): @@ -145,26 +190,32 @@ lv_float = LValidator(cv.float_, cg.float_, Sensor, "get_state()") lv_int = LValidator(cv.int_, cg.int_, Sensor, "get_state()") +def is_lv_font(font): + return isinstance(font, str) and font.lower() in LV_FONTS + + class LvFont(LValidator): def __init__(self): def lv_builtin_font(value): fontval = cv.one_of(*LV_FONTS, lower=True)(value) lv_fonts_used.add(fontval) - return "&lv_font_" + fontval + return fontval def validator(value): if value == SCHEMA_EXTRACT: return LV_FONTS - if isinstance(value, str) and value.lower() in LV_FONTS: + if is_lv_font(value): return lv_builtin_font(value) fontval = cv.use_id(Font)(value) esphome_fonts_used.add(fontval) - return requires_component("font")(f"{fontval}_engine->get_lv_font()") + return requires_component("font")(fontval) super().__init__(validator, lv_font_t) async def process(self, value, args=()): - return ConstantLiteral(value) + if is_lv_font(value): + return ConstantLiteral(f"&lv_font_{value}") + return ConstantLiteral(f"{value}_engine->get_lv_font()") lv_font = LvFont() diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp index bdaf8a4f18..74a1b0e7af 100644 --- a/esphome/components/lvgl/lvgl_esphome.cpp +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -38,7 +38,9 @@ void LvglComponent::setup() { auto buf_bytes = buffer_pixels * LV_COLOR_DEPTH / 8; auto *buf = lv_custom_mem_alloc(buf_bytes); if (buf == nullptr) { +#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_ERROR ESP_LOGE(TAG, "Malloc failed to allocate %zu bytes", buf_bytes); +#endif this->mark_failed(); this->status_set_error("Memory allocation failure"); return; @@ -85,7 +87,9 @@ size_t lv_millis(void) { return esphome::millis(); } void *lv_custom_mem_alloc(size_t size) { auto *ptr = malloc(size); // NOLINT if (ptr == nullptr) { +#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_ERROR esphome::ESP_LOGE(esphome::lvgl::TAG, "Failed to allocate %zu bytes", size); +#endif } return ptr; } @@ -102,7 +106,9 @@ void *lv_custom_mem_alloc(size_t size) { ptr = heap_caps_malloc(size, cap_bits); } if (ptr == nullptr) { +#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_ERROR esphome::ESP_LOGE(esphome::lvgl::TAG, "Failed to allocate %zu bytes", size); +#endif return nullptr; } #ifdef ESPHOME_LOG_HAS_VERBOSE diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h index 988c22917b..a884a27042 100644 --- a/esphome/components/lvgl/lvgl_esphome.h +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -18,23 +18,27 @@ #ifdef USE_LVGL_FONT #include "esphome/components/font/font.h" #endif +#ifdef USE_LVGL_TOUCHSCREEN +#include "esphome/components/touchscreen/touchscreen.h" +#endif // USE_LVGL_TOUCHSCREEN + namespace esphome { namespace lvgl { extern lv_event_code_t lv_custom_event; // NOLINT #ifdef USE_LVGL_COLOR -static lv_color_t lv_color_from(Color color) { return lv_color_make(color.red, color.green, color.blue); } -#endif +inline lv_color_t lv_color_from(Color color) { return lv_color_make(color.red, color.green, color.blue); } +#endif // USE_LVGL_COLOR #if LV_COLOR_DEPTH == 16 static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_565; #elif LV_COLOR_DEPTH == 32 static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_888; -#else +#else // LV_COLOR_DEPTH static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_332; -#endif +#endif // LV_COLOR_DEPTH // Parent class for things that wrap an LVGL object -class LvCompound { +class LvCompound final { public: virtual void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } lv_obj_t *obj{}; @@ -99,6 +103,14 @@ class LvglComponent : public PollingComponent { void set_full_refresh(bool full_refresh) { this->full_refresh_ = full_refresh; } void set_buffer_frac(size_t frac) { this->buffer_frac_ = frac; } lv_disp_t *get_disp() { return this->disp_; } + void set_paused(bool paused, bool show_snow) { + this->paused_ = paused; + if (!paused && lv_scr_act() != nullptr) { + lv_disp_trig_activity(this->disp_); // resets the inactivity time + lv_obj_invalidate(lv_scr_act()); + } + } + bool is_paused() const { return this->paused_; } protected: void draw_buffer_(const lv_area_t *area, const uint8_t *ptr); @@ -107,13 +119,48 @@ class LvglComponent : public PollingComponent { lv_disp_draw_buf_t draw_buf_{}; lv_disp_drv_t disp_drv_{}; lv_disp_t *disp_{}; + bool paused_{}; std::vector> init_lambdas_; size_t buffer_frac_{1}; bool full_refresh_{}; }; +#ifdef USE_LVGL_TOUCHSCREEN +class LVTouchListener : public touchscreen::TouchListener, public Parented { + public: + LVTouchListener(uint16_t long_press_time, uint16_t long_press_repeat_time) { + lv_indev_drv_init(&this->drv_); + this->drv_.long_press_repeat_time = long_press_repeat_time; + this->drv_.long_press_time = long_press_time; + this->drv_.type = LV_INDEV_TYPE_POINTER; + this->drv_.user_data = this; + this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { + auto *l = static_cast(d->user_data); + if (l->touch_pressed_) { + data->point.x = l->touch_point_.x; + data->point.y = l->touch_point_.y; + data->state = LV_INDEV_STATE_PRESSED; + } else { + data->state = LV_INDEV_STATE_RELEASED; + } + }; + } + void update(const touchscreen::TouchPoints_t &tpoints) override { + this->touch_pressed_ = !this->parent_->is_paused() && !tpoints.empty(); + if (this->touch_pressed_) + this->touch_point_ = tpoints[0]; + } + void release() override { touch_pressed_ = false; } + lv_indev_drv_t *get_drv() { return &this->drv_; } + + protected: + lv_indev_drv_t drv_{}; + touchscreen::TouchPoint touch_point_{}; + bool touch_pressed_{}; +}; +#endif // USE_LVGL_TOUCHSCREEN } // namespace lvgl } // namespace esphome -#endif +#endif // USE_LVGL diff --git a/esphome/components/lvgl/obj.py b/esphome/components/lvgl/obj.py index fba20bef36..92c4f63d2d 100644 --- a/esphome/components/lvgl/obj.py +++ b/esphome/components/lvgl/obj.py @@ -1,6 +1,5 @@ -from .defines import CONF_OBJ -from .types import lv_obj_t -from .widget import WidgetType +from .defines import CONF_MAIN, CONF_OBJ +from .types import WidgetType, lv_obj_t class ObjType(WidgetType): @@ -9,11 +8,7 @@ class ObjType(WidgetType): """ def __init__(self): - super().__init__(CONF_OBJ, schema={}, modify_schema={}) - - @property - def w_type(self): - return lv_obj_t + super().__init__(CONF_OBJ, lv_obj_t, (CONF_MAIN,), schema={}, modify_schema={}) async def to_code(self, w, config): return [] diff --git a/esphome/components/lvgl/schemas.py b/esphome/components/lvgl/schemas.py index 4ae5824151..9f6d984545 100644 --- a/esphome/components/lvgl/schemas.py +++ b/esphome/components/lvgl/schemas.py @@ -3,15 +3,9 @@ from esphome.const import CONF_ARGS, CONF_FORMAT, CONF_ID, CONF_STATE, CONF_TYPE from esphome.schema_extractors import SCHEMA_EXTRACT from . import defines as df, lv_validation as lvalid, types as ty -from .defines import WIDGET_PARTS -from .helpers import ( - REQUIRED_COMPONENTS, - add_lv_use, - requires_component, - validate_printf, -) +from .helpers import add_lv_use, requires_component, validate_printf from .lv_validation import lv_font -from .types import WIDGET_TYPES, get_widget_type +from .types import WIDGET_TYPES, WidgetType # A schema for text properties TEXT_SCHEMA = cv.Schema( @@ -46,9 +40,9 @@ STYLE_PROPS = { "bg_dither_mode": df.LvConstant("LV_DITHER_", "NONE", "ORDERED", "ERR_DIFF").one_of, "bg_grad_dir": df.LvConstant("LV_GRAD_DIR_", "NONE", "HOR", "VER").one_of, "bg_grad_stop": lvalid.stop_value, - "bg_img_opa": lvalid.opacity, - "bg_img_recolor": lvalid.lv_color, - "bg_img_recolor_opa": lvalid.opacity, + "bg_image_opa": lvalid.opacity, + "bg_image_recolor": lvalid.lv_color, + "bg_image_recolor_opa": lvalid.opacity, "bg_main_stop": lvalid.stop_value, "bg_opa": lvalid.opacity, "border_color": lvalid.lv_color, @@ -60,8 +54,8 @@ STYLE_PROPS = { "border_width": cv.positive_int, "clip_corner": lvalid.lv_bool, "height": lvalid.size, - "img_recolor": lvalid.lv_color, - "img_recolor_opa": lvalid.opacity, + "image_recolor": lvalid.lv_color, + "image_recolor_opa": lvalid.opacity, "line_width": cv.positive_int, "line_dash_width": cv.positive_int, "line_dash_gap": cv.positive_int, @@ -108,12 +102,21 @@ STYLE_PROPS = { "max_width": lvalid.pixels_or_percent, "min_height": lvalid.pixels_or_percent, "min_width": lvalid.pixels_or_percent, - "radius": cv.Any(lvalid.size, df.LvConstant("LV_RADIUS_", "CIRCLE").one_of), + "radius": lvalid.radius, "width": lvalid.size, "x": lvalid.pixels_or_percent, "y": lvalid.pixels_or_percent, } +STYLE_REMAP = { + "bg_image_opa": "bg_img_opa", + "bg_image_recolor": "bg_img_recolor", + "bg_image_recolor_opa": "bg_img_recolor_opa", + "bg_image_src": "bg_img_src", + "image_recolor": "img_recolor", + "image_recolor_opa": "img_recolor_opa", +} + # Complete object style schema STYLE_SCHEMA = cv.Schema({cv.Optional(k): v for k, v in STYLE_PROPS.items()}).extend( { @@ -132,25 +135,23 @@ SET_STATE_SCHEMA = cv.Schema( {cv.Optional(state): lvalid.lv_bool for state in df.STATES} ) # Setting object flags -FLAG_SCHEMA = cv.Schema({cv.Optional(flag): cv.boolean for flag in df.OBJ_FLAGS}) +FLAG_SCHEMA = cv.Schema({cv.Optional(flag): lvalid.lv_bool for flag in df.OBJ_FLAGS}) FLAG_LIST = cv.ensure_list(df.LvConstant("LV_OBJ_FLAG_", *df.OBJ_FLAGS).one_of) -def part_schema(widget_type): +def part_schema(widget_type: WidgetType): """ Generate a schema for the various parts (e.g. main:, indicator:) of a widget type :param widget_type: The type of widget to generate for :return: """ - parts = WIDGET_PARTS.get(widget_type) - if parts is None: - parts = (df.CONF_MAIN,) + parts = widget_type.parts return cv.Schema({cv.Optional(part): STATE_SCHEMA for part in parts}).extend( STATE_SCHEMA ) -def obj_schema(widget_type: str): +def obj_schema(widget_type: WidgetType): """ Create a schema for a widget type itself i.e. no allowance for children :param widget_type: @@ -187,13 +188,12 @@ STYLED_TEXT_SCHEMA = cv.maybe_simple_value( STYLE_SCHEMA.extend(TEXT_SCHEMA), key=df.CONF_TEXT ) - ALL_STYLES = { **STYLE_PROPS, } -def container_validator(schema, widget_type): +def container_validator(schema, widget_type: WidgetType): """ Create a validator for a container given the widget type :param schema: Base schema to extend @@ -203,13 +203,16 @@ def container_validator(schema, widget_type): def validator(value): result = schema - if w_sch := WIDGET_TYPES[widget_type].schema: + if w_sch := widget_type.schema: result = result.extend(w_sch) if value and (layout := value.get(df.CONF_LAYOUT)): if not isinstance(layout, dict): raise cv.Invalid("Layout value must be a dict") ltype = layout.get(CONF_TYPE) add_lv_use(ltype) + result = result.extend( + {cv.Optional(df.CONF_WIDGETS): cv.ensure_list(any_widget_schema())} + ) if value == SCHEMA_EXTRACT: return result return result(value) @@ -217,7 +220,7 @@ def container_validator(schema, widget_type): return validator -def container_schema(widget_type, extras=None): +def container_schema(widget_type: WidgetType, extras=None): """ Create a schema for a container widget of a given type. All obj properties are available, plus the extras passed in, plus any defined for the specific widget being specified. @@ -225,15 +228,16 @@ def container_schema(widget_type, extras=None): :param extras: Additional options to be made available, e.g. layout properties for children :return: The schema for this type of widget. """ - lv_type = get_widget_type(widget_type) - schema = obj_schema(widget_type).extend({cv.GenerateID(): cv.declare_id(lv_type)}) + schema = obj_schema(widget_type).extend( + {cv.GenerateID(): cv.declare_id(widget_type.w_type)} + ) if extras: schema = schema.extend(extras) # Delayed evaluation for recursion return container_validator(schema, widget_type) -def widget_schema(widget_type, extras=None): +def widget_schema(widget_type: WidgetType, extras=None): """ Create a schema for a given widget type :param widget_type: The name of the widget @@ -241,9 +245,9 @@ def widget_schema(widget_type, extras=None): :return: """ validator = container_schema(widget_type, extras=extras) - if required := REQUIRED_COMPONENTS.get(widget_type): + if required := widget_type.required_component: validator = cv.All(validator, requires_component(required)) - return cv.Exclusive(widget_type, df.CONF_WIDGETS), validator + return cv.Exclusive(widget_type.name, df.CONF_WIDGETS), validator # All widget schemas must be defined before this is called. @@ -257,4 +261,4 @@ def any_widget_schema(extras=None): :param extras: Additional schema to be applied to each generated one :return: """ - return cv.Any(dict(widget_schema(wt, extras) for wt in WIDGET_PARTS)) + return cv.Any(dict(widget_schema(wt, extras) for wt in WIDGET_TYPES.values())) diff --git a/esphome/components/lvgl/touchscreens.py b/esphome/components/lvgl/touchscreens.py new file mode 100644 index 0000000000..a0d4a3e4ad --- /dev/null +++ b/esphome/components/lvgl/touchscreens.py @@ -0,0 +1,46 @@ +import esphome.codegen as cg +from esphome.components.touchscreen import CONF_TOUCHSCREEN_ID, Touchscreen +import esphome.config_validation as cv +from esphome.const import CONF_ID +from esphome.core import CORE, TimePeriod + +from .defines import ( + CONF_LONG_PRESS_REPEAT_TIME, + CONF_LONG_PRESS_TIME, + CONF_TOUCHSCREENS, +) +from .helpers import lvgl_components_required +from .lv_validation import lv_milliseconds +from .lvcode import lv +from .types import LVTouchListener + +PRESS_TIME = cv.All(lv_milliseconds, cv.Range(max=TimePeriod(milliseconds=65535))) +CONF_TOUCHSCREEN = "touchscreen" +TOUCHSCREENS_CONFIG = cv.maybe_simple_value( + { + cv.Required(CONF_TOUCHSCREEN_ID): cv.use_id(Touchscreen), + cv.Optional(CONF_LONG_PRESS_TIME, default="400ms"): PRESS_TIME, + cv.Optional(CONF_LONG_PRESS_REPEAT_TIME, default="100ms"): PRESS_TIME, + cv.GenerateID(): cv.declare_id(LVTouchListener), + }, + key=CONF_TOUCHSCREEN_ID, +) + + +def touchscreen_schema(config): + value = cv.ensure_list(TOUCHSCREENS_CONFIG)(config) + if value or CONF_TOUCHSCREEN not in CORE.loaded_integrations: + return value + return [TOUCHSCREENS_CONFIG(config)] + + +async def touchscreens_to_code(var, config): + for tconf in config.get(CONF_TOUCHSCREENS) or (): + lvgl_components_required.add(CONF_TOUCHSCREEN) + touchscreen = await cg.get_variable(tconf[CONF_TOUCHSCREEN_ID]) + lpt = tconf[CONF_LONG_PRESS_TIME].total_milliseconds + lprt = tconf[CONF_LONG_PRESS_REPEAT_TIME].total_milliseconds + listener = cg.new_Pvariable(tconf[CONF_ID], lpt, lprt) + await cg.register_parented(listener, var) + lv.indev_drv_register(listener.get_drv()) + cg.add(touchscreen.register_listener(listener)) diff --git a/esphome/components/lvgl/types.py b/esphome/components/lvgl/types.py index 3c043d266d..60291ea54a 100644 --- a/esphome/components/lvgl/types.py +++ b/esphome/components/lvgl/types.py @@ -1,7 +1,22 @@ from esphome import codegen as cg from esphome.core import ID +from esphome.cpp_generator import MockObjClass + +from .defines import CONF_TEXT + + +class LvType(cg.MockObjClass): + def __init__(self, *args, **kwargs): + parens = kwargs.pop("parents", ()) + super().__init__(*args, parents=parens + (lv_obj_base_t,)) + self.args = kwargs.pop("largs", [(lv_obj_t_ptr, "obj")]) + self.value = kwargs.pop("lvalue", lambda w: w.obj) + self.has_on_value = kwargs.pop("has_on_value", False) + self.value_property = None + + def get_arg_type(self): + return self.args[0][0] if len(self.args) else None -from .defines import CONF_LABEL, CONF_OBJ, CONF_TEXT uint16_t_ptr = cg.uint16.operator("ptr") lvgl_ns = cg.esphome_ns.namespace("lvgl") @@ -18,25 +33,15 @@ lv_obj_base_t = cg.global_ns.class_("lv_obj_t", lv_pseudo_button_t) lv_obj_t_ptr = lv_obj_base_t.operator("ptr") lv_disp_t_ptr = cg.global_ns.struct("lv_disp_t").operator("ptr") lv_color_t = cg.global_ns.struct("lv_color_t") +LVTouchListener = lvgl_ns.class_("LVTouchListener") +LVEncoderListener = lvgl_ns.class_("LVEncoderListener") +lv_obj_t = LvType("lv_obj_t") # this will be populated later, in __init__.py to avoid circular imports. WIDGET_TYPES: dict = {} -class LvType(cg.MockObjClass): - def __init__(self, *args, **kwargs): - parens = kwargs.pop("parents", ()) - super().__init__(*args, parents=parens + (lv_obj_base_t,)) - self.args = kwargs.pop("largs", [(lv_obj_t_ptr, "obj")]) - self.value = kwargs.pop("lvalue", lambda w: w.obj) - self.has_on_value = kwargs.pop("has_on_value", False) - self.value_property = None - - def get_arg_type(self): - return self.args[0][0] if len(self.args) else None - - class LvText(LvType): def __init__(self, *args, **kwargs): super().__init__( @@ -48,17 +53,74 @@ class LvText(LvType): self.value_property = CONF_TEXT -lv_obj_t = LvType("lv_obj_t") -lv_label_t = LvText("lv_label_t") - -LV_TYPES = { - CONF_LABEL: lv_label_t, - CONF_OBJ: lv_obj_t, -} - - -def get_widget_type(typestr: str) -> LvType: - return LV_TYPES[typestr] +class LvBoolean(LvType): + def __init__(self, *args, **kwargs): + super().__init__( + *args, + largs=[(cg.bool_, "x")], + lvalue=lambda w: w.is_checked(), + has_on_value=True, + **kwargs, + ) CUSTOM_EVENT = ID("lv_custom_event", False, type=lv_event_code_t) + + +class WidgetType: + """ + Describes a type of Widget, e.g. "bar" or "line" + """ + + def __init__(self, name, w_type, parts, schema=None, modify_schema=None): + """ + :param name: The widget name, e.g. "bar" + :param w_type: The C type of the widget + :param parts: What parts this widget supports + :param schema: The config schema for defining a widget + :param modify_schema: A schema to update the widget + """ + self.name = name + self.w_type = w_type + self.parts = parts + self.schema = schema or {} + if modify_schema is None: + self.modify_schema = schema + else: + self.modify_schema = modify_schema + + @property + def animated(self): + return False + + @property + def required_component(self): + return None + + def is_compound(self): + return self.w_type.inherits_from(LvCompound) + + async def to_code(self, w, config: dict): + """ + Generate code for a given widget + :param w: The widget + :param config: Its configuration + :return: Generated code as a list of text lines + """ + raise NotImplementedError(f"No to_code defined for {self.name}") + + def obj_creator(self, parent: MockObjClass, config: dict): + """ + Create an instance of the widget type + :param parent: The parent to which it should be attached + :param config: Its configuration + :return: Generated code as a single text line + """ + return f"lv_{self.name}_create({parent})" + + def get_uses(self): + """ + Get a list of other widgets used by this one + :return: + """ + return () diff --git a/esphome/components/lvgl/widget.py b/esphome/components/lvgl/widget.py index 44f277f1c3..4755d8b21d 100644 --- a/esphome/components/lvgl/widget.py +++ b/esphome/components/lvgl/widget.py @@ -21,78 +21,19 @@ from .defines import ( ) from .helpers import add_lv_use from .lvcode import ConstantLiteral, add_line_marks, lv, lv_add, lv_assign, lv_obj -from .schemas import ALL_STYLES -from .types import WIDGET_TYPES, LvCompound, lv_obj_t +from .schemas import ALL_STYLES, STYLE_REMAP +from .types import WIDGET_TYPES, WidgetType, lv_obj_t EVENT_LAMB = "event_lamb__" -class WidgetType: - """ - Describes a type of Widget, e.g. "bar" or "line" - """ - - def __init__(self, name, schema=None, modify_schema=None): - """ - :param name: The widget name, e.g. "bar" - :param schema: The config schema for defining a widget - :param modify_schema: A schema to update the widget - """ - self.name = name - self.schema = schema or {} - if modify_schema is None: - self.modify_schema = schema - else: - self.modify_schema = modify_schema - - @property - def animated(self): - return False - - @property - def w_type(self): - """ - Get the type associated with this widget - :return: - """ - return lv_obj_t - - def is_compound(self): - return self.w_type.inherits_from(LvCompound) - - async def to_code(self, w, config: dict): - """ - Generate code for a given widget - :param w: The widget - :param config: Its configuration - :return: Generated code as a list of text lines - """ - raise NotImplementedError(f"No to_code defined for {self.name}") - - def obj_creator(self, parent: MockObjClass, config: dict): - """ - Create an instance of the widget type - :param parent: The parent to which it should be attached - :param config: Its configuration - :return: Generated code as a single text line - """ - return f"lv_{self.name}_create({parent})" - - def get_uses(self): - """ - Get a list of other widgets used by this one - :return: - """ - return () - - class LvScrActType(WidgetType): """ A "widget" representing the active screen. """ def __init__(self): - super().__init__("lv_scr_act()") + super().__init__("lv_scr_act()", lv_obj_t, ()) def obj_creator(self, parent: MockObjClass, config: dict): return [] @@ -263,7 +204,9 @@ async def set_obj_properties(w: Widget, config): }.items(): if isinstance(ALL_STYLES[prop], LValidator): value = await ALL_STYLES[prop].process(value) - w.set_style(prop, value, lv_state) + # Remapping for backwards compatibility of style names + prop_r = STYLE_REMAP.get(prop, prop) + w.set_style(prop_r, value, lv_state) flag_clr = set() flag_set = set() props = parts[CONF_MAIN][CONF_DEFAULT] @@ -291,10 +234,10 @@ async def set_obj_properties(w: Widget, config): else: clears.add(key) if adds: - adds = ConstantLiteral(join_enums(adds, "LV_STATE_")) + adds = join_enums(adds, "LV_STATE_") w.add_state(adds) if clears: - clears = ConstantLiteral(join_enums(clears, "LV_STATE_")) + clears = join_enums(clears, "LV_STATE_") w.clear_state(clears) for key, value in lambs.items(): lamb = await cg.process_lambda(value, [], return_type=cg.bool_) diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 9d453260ab..6ba5b64761 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -41,6 +41,7 @@ #define USE_LVGL #define USE_LVGL_FONT #define USE_LVGL_IMAGE +#define USE_LVGL_TOUCHSCREEN #define USE_MDNS #define USE_MEDIA_PLAYER #define USE_MQTT diff --git a/tests/components/lvgl/common.yaml b/tests/components/lvgl/common.yaml index e69de29bb2..8b92f8caa7 100644 --- a/tests/components/lvgl/common.yaml +++ b/tests/components/lvgl/common.yaml @@ -0,0 +1,10 @@ +touchscreen: + - platform: ft63x6 + id: tft_touch + display: tft_display + update_interval: 50ms + threshold: 1 + calibration: + x_max: 240 + y_max: 320 + diff --git a/tests/components/lvgl/logo-text.svg b/tests/components/lvgl/logo-text.svg new file mode 100644 index 0000000000..4950806a36 --- /dev/null +++ b/tests/components/lvgl/logo-text.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/tests/components/lvgl/lvgl-package.yaml b/tests/components/lvgl/lvgl-package.yaml index 856e7c3e9d..696c749876 100644 --- a/tests/components/lvgl/lvgl-package.yaml +++ b/tests/components/lvgl/lvgl-package.yaml @@ -1,9 +1,10 @@ -color: - - id: light_blue - hex: "3340FF" - lvgl: + log_level: TRACE bg_color: light_blue + touchscreens: + - touchscreen_id: tft_touch + long_press_repeat_time: 200ms + long_press_time: 500ms widgets: - label: text: Hello world @@ -17,8 +18,101 @@ lvgl: text_color: 0xFFFFFF align: bottom_mid text_font: space16 + - obj: + align: center + arc_opa: COVER + arc_color: 0xFF0000 + arc_rounded: false + arc_width: 3 + anim_time: 1s + bg_color: light_blue + bg_grad_color: light_blue + bg_dither_mode: ordered + bg_grad_dir: hor + bg_grad_stop: 128 + bg_image_opa: transp + bg_image_recolor: light_blue + bg_image_recolor_opa: 50% + bg_main_stop: 0 + bg_opa: 20% + border_color: 0x00FF00 + border_opa: cover + border_post: true + border_side: [bottom, left] + border_width: 4 + clip_corner: false + height: 50% + image_recolor: light_blue + image_recolor_opa: cover + line_width: 10 + line_dash_width: 10 + line_dash_gap: 10 + line_rounded: false + line_color: light_blue + opa: cover + opa_layered: cover + outline_color: light_blue + outline_opa: cover + outline_pad: 10px + outline_width: 10px + pad_all: 10px + pad_bottom: 10px + pad_column: 10px + pad_left: 10px + pad_right: 10px + pad_row: 10px + pad_top: 10px + shadow_color: light_blue + shadow_ofs_x: 5 + shadow_ofs_y: 5 + shadow_opa: cover + shadow_spread: 5 + shadow_width: 10 + text_align: auto + text_color: light_blue + text_decor: [underline, strikethrough] + text_font: montserrat_18 + text_letter_space: 4 + text_line_space: 4 + text_opa: cover + transform_angle: 180 + transform_height: 100 + transform_pivot_x: 50% + transform_pivot_y: 50% + transform_zoom: 0.5 + translate_x: 10 + translate_y: 10 + max_height: 100 + max_width: 200 + min_height: 20% + min_width: 20% + radius: circle + width: 10px + x: 100 + y: 120 + - button: + width: 20% + height: 10% + pressed: + bg_color: light_blue + widgets: + - label: + text: Button font: - file: "gfonts://Roboto" id: space16 bpp: 4 + +image: + - id: cat_img + resize: 256x48 + file: $component_dir/logo-text.svg + - id: dog_img + file: $component_dir/logo-text.svg + resize: 256x48 + type: TRANSPARENT_BINARY + +color: + - id: light_blue + hex: "3340FF" diff --git a/tests/components/lvgl/test.esp32-idf.yaml b/tests/components/lvgl/test.esp32-idf.yaml index f159431b99..eab75b05f3 100644 --- a/tests/components/lvgl/test.esp32-idf.yaml +++ b/tests/components/lvgl/test.esp32-idf.yaml @@ -19,7 +19,9 @@ display: mirror_y: true data_rate: 80MHz cs_pin: GPIO20 - dc_pin: GPIO15 + dc_pin: + number: GPIO15 + ignore_strapping_warning: true auto_clear_enabled: false invert_colors: false update_interval: never From 6e21d79bde02b90e4273b7a92f2caa8604a3d687 Mon Sep 17 00:00:00 2001 From: FreeBear-nc <67865163+FreeBear-nc@users.noreply.github.com> Date: Tue, 30 Jul 2024 02:15:27 +0100 Subject: [PATCH 072/164] [pid] Add get_min_integral() and get_max_integral() (#7162) --- esphome/components/pid/pid_climate.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/pid/pid_climate.h b/esphome/components/pid/pid_climate.h index 5ae97ee10b..b5275e9775 100644 --- a/esphome/components/pid/pid_climate.h +++ b/esphome/components/pid/pid_climate.h @@ -44,6 +44,8 @@ class PIDClimate : public climate::Climate, public Component { float get_kp() { return controller_.kp_; } float get_ki() { return controller_.ki_; } float get_kd() { return controller_.kd_; } + float get_min_integral() { return controller_.min_integral_; } + float get_max_integral() { return controller_.max_integral_; } float get_proportional_term() const { return controller_.proportional_term_; } float get_integral_term() const { return controller_.integral_term_; } float get_derivative_term() const { return controller_.derivative_term_; } From 83bb7d0266459ebae70d663addabc45a1f112092 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:23:30 +1200 Subject: [PATCH 073/164] [code-quality] Organise bluetooth related imports (#7155) --- esphome/components/ble_client/__init__.py | 8 ++++---- esphome/components/ble_client/output/__init__.py | 2 +- esphome/components/ble_client/sensor/__init__.py | 7 ++++--- esphome/components/ble_client/switch/__init__.py | 3 ++- esphome/components/ble_client/text_sensor/__init__.py | 7 ++++--- esphome/components/ble_presence/binary_sensor.py | 6 +++--- esphome/components/ble_rssi/sensor.py | 4 ++-- esphome/components/ble_scanner/text_sensor.py | 2 +- esphome/components/bluetooth_proxy/__init__.py | 6 +++--- esphome/components/esp32_ble/__init__.py | 6 +++--- esphome/components/esp32_ble_beacon/__init__.py | 10 +++++----- esphome/components/esp32_ble_client/__init__.py | 1 - esphome/components/esp32_ble_server/__init__.py | 4 ++-- esphome/components/esp32_ble_tracker/__init__.py | 4 ++-- 14 files changed, 36 insertions(+), 34 deletions(-) diff --git a/esphome/components/ble_client/__init__.py b/esphome/components/ble_client/__init__.py index 34b9868edc..6bf4ff739e 100644 --- a/esphome/components/ble_client/__init__.py +++ b/esphome/components/ble_client/__init__.py @@ -1,7 +1,8 @@ -import esphome.codegen as cg -import esphome.config_validation as cv +from esphome import automation from esphome.automation import maybe_simple_id -from esphome.components import esp32_ble_tracker, esp32_ble_client +import esphome.codegen as cg +from esphome.components import esp32_ble_client, esp32_ble_tracker +import esphome.config_validation as cv from esphome.const import ( CONF_CHARACTERISTIC_UUID, CONF_ID, @@ -13,7 +14,6 @@ from esphome.const import ( CONF_TRIGGER_ID, CONF_VALUE, ) -from esphome import automation AUTO_LOAD = ["esp32_ble_client"] CODEOWNERS = ["@buxtronix", "@clydebarrow"] diff --git a/esphome/components/ble_client/output/__init__.py b/esphome/components/ble_client/output/__init__.py index fd847d80b8..729885eb8b 100644 --- a/esphome/components/ble_client/output/__init__.py +++ b/esphome/components/ble_client/output/__init__.py @@ -1,6 +1,6 @@ import esphome.codegen as cg -import esphome.config_validation as cv from esphome.components import ble_client, esp32_ble_tracker, output +import esphome.config_validation as cv from esphome.const import CONF_CHARACTERISTIC_UUID, CONF_ID, CONF_SERVICE_UUID from .. import ble_client_ns diff --git a/esphome/components/ble_client/sensor/__init__.py b/esphome/components/ble_client/sensor/__init__.py index d0b27c30a9..0c48902a90 100644 --- a/esphome/components/ble_client/sensor/__init__.py +++ b/esphome/components/ble_client/sensor/__init__.py @@ -1,17 +1,18 @@ +from esphome import automation import esphome.codegen as cg +from esphome.components import ble_client, esp32_ble_tracker, sensor import esphome.config_validation as cv -from esphome.components import sensor, ble_client, esp32_ble_tracker from esphome.const import ( CONF_CHARACTERISTIC_UUID, CONF_LAMBDA, + CONF_SERVICE_UUID, CONF_TRIGGER_ID, CONF_TYPE, - CONF_SERVICE_UUID, DEVICE_CLASS_SIGNAL_STRENGTH, STATE_CLASS_MEASUREMENT, UNIT_DECIBEL_MILLIWATT, ) -from esphome import automation + from .. import ble_client_ns DEPENDENCIES = ["ble_client"] diff --git a/esphome/components/ble_client/switch/__init__.py b/esphome/components/ble_client/switch/__init__.py index 2304d65c01..70314e8f30 100644 --- a/esphome/components/ble_client/switch/__init__.py +++ b/esphome/components/ble_client/switch/__init__.py @@ -1,7 +1,8 @@ import esphome.codegen as cg +from esphome.components import ble_client, switch import esphome.config_validation as cv -from esphome.components import switch, ble_client from esphome.const import ICON_BLUETOOTH + from .. import ble_client_ns BLEClientSwitch = ble_client_ns.class_( diff --git a/esphome/components/ble_client/text_sensor/__init__.py b/esphome/components/ble_client/text_sensor/__init__.py index 7a93c4e4ae..479af1a57e 100644 --- a/esphome/components/ble_client/text_sensor/__init__.py +++ b/esphome/components/ble_client/text_sensor/__init__.py @@ -1,13 +1,14 @@ +from esphome import automation import esphome.codegen as cg +from esphome.components import ble_client, esp32_ble_tracker, text_sensor import esphome.config_validation as cv -from esphome.components import text_sensor, ble_client, esp32_ble_tracker from esphome.const import ( CONF_CHARACTERISTIC_UUID, CONF_ID, - CONF_TRIGGER_ID, CONF_SERVICE_UUID, + CONF_TRIGGER_ID, ) -from esphome import automation + from .. import ble_client_ns DEPENDENCIES = ["ble_client"] diff --git a/esphome/components/ble_presence/binary_sensor.py b/esphome/components/ble_presence/binary_sensor.py index 9c24a91a05..d1fdc80289 100644 --- a/esphome/components/ble_presence/binary_sensor.py +++ b/esphome/components/ble_presence/binary_sensor.py @@ -1,13 +1,13 @@ import esphome.codegen as cg -import esphome.config_validation as cv from esphome.components import binary_sensor, esp32_ble_tracker +import esphome.config_validation as cv from esphome.const import ( - CONF_MAC_ADDRESS, - CONF_SERVICE_UUID, CONF_IBEACON_MAJOR, CONF_IBEACON_MINOR, CONF_IBEACON_UUID, + CONF_MAC_ADDRESS, CONF_MIN_RSSI, + CONF_SERVICE_UUID, CONF_TIMEOUT, ) diff --git a/esphome/components/ble_rssi/sensor.py b/esphome/components/ble_rssi/sensor.py index 0543eb0578..e3ba1abfd7 100644 --- a/esphome/components/ble_rssi/sensor.py +++ b/esphome/components/ble_rssi/sensor.py @@ -1,12 +1,12 @@ import esphome.codegen as cg +from esphome.components import esp32_ble_tracker, sensor import esphome.config_validation as cv -from esphome.components import sensor, esp32_ble_tracker from esphome.const import ( CONF_IBEACON_MAJOR, CONF_IBEACON_MINOR, CONF_IBEACON_UUID, - CONF_SERVICE_UUID, CONF_MAC_ADDRESS, + CONF_SERVICE_UUID, DEVICE_CLASS_SIGNAL_STRENGTH, STATE_CLASS_MEASUREMENT, UNIT_DECIBEL_MILLIWATT, diff --git a/esphome/components/ble_scanner/text_sensor.py b/esphome/components/ble_scanner/text_sensor.py index 743403c6a4..96d71a0399 100644 --- a/esphome/components/ble_scanner/text_sensor.py +++ b/esphome/components/ble_scanner/text_sensor.py @@ -1,6 +1,6 @@ import esphome.codegen as cg +from esphome.components import esp32_ble_tracker, text_sensor import esphome.config_validation as cv -from esphome.components import text_sensor, esp32_ble_tracker DEPENDENCIES = ["esp32_ble_tracker"] diff --git a/esphome/components/bluetooth_proxy/__init__.py b/esphome/components/bluetooth_proxy/__init__.py index bec1579d8e..5a4ba36666 100644 --- a/esphome/components/bluetooth_proxy/__init__.py +++ b/esphome/components/bluetooth_proxy/__init__.py @@ -1,8 +1,8 @@ -from esphome.components import esp32_ble_tracker, esp32_ble_client -import esphome.config_validation as cv import esphome.codegen as cg -from esphome.const import CONF_ACTIVE, CONF_ID +from esphome.components import esp32_ble_client, esp32_ble_tracker from esphome.components.esp32 import add_idf_sdkconfig_option +import esphome.config_validation as cv +from esphome.const import CONF_ACTIVE, CONF_ID AUTO_LOAD = ["esp32_ble_client", "esp32_ble_tracker"] DEPENDENCIES = ["api", "esp32"] diff --git a/esphome/components/esp32_ble/__init__.py b/esphome/components/esp32_ble/__init__.py index 472669a381..75cf9d707d 100644 --- a/esphome/components/esp32_ble/__init__.py +++ b/esphome/components/esp32_ble/__init__.py @@ -1,9 +1,9 @@ -import esphome.codegen as cg -import esphome.config_validation as cv from esphome import automation +import esphome.codegen as cg +from esphome.components.esp32 import add_idf_sdkconfig_option, const, get_esp32_variant +import esphome.config_validation as cv from esphome.const import CONF_ENABLE_ON_BOOT, CONF_ID from esphome.core import CORE -from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const DEPENDENCIES = ["esp32"] CODEOWNERS = ["@jesserockz", "@Rapsssito"] diff --git a/esphome/components/esp32_ble_beacon/__init__.py b/esphome/components/esp32_ble_beacon/__init__.py index d063209478..f97f289a0a 100644 --- a/esphome/components/esp32_ble_beacon/__init__.py +++ b/esphome/components/esp32_ble_beacon/__init__.py @@ -1,10 +1,10 @@ import esphome.codegen as cg -import esphome.config_validation as cv -from esphome.components.esp32_ble import CONF_BLE_ID -from esphome.const import CONF_ID, CONF_TYPE, CONF_UUID, CONF_TX_POWER -from esphome.core import CORE, TimePeriod -from esphome.components.esp32 import add_idf_sdkconfig_option from esphome.components import esp32_ble +from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components.esp32_ble import CONF_BLE_ID +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_TX_POWER, CONF_TYPE, CONF_UUID +from esphome.core import CORE, TimePeriod AUTO_LOAD = ["esp32_ble"] DEPENDENCIES = ["esp32"] diff --git a/esphome/components/esp32_ble_client/__init__.py b/esphome/components/esp32_ble_client/__init__.py index 94a5576d0b..25957ed0da 100644 --- a/esphome/components/esp32_ble_client/__init__.py +++ b/esphome/components/esp32_ble_client/__init__.py @@ -1,5 +1,4 @@ import esphome.codegen as cg - from esphome.components import esp32_ble_tracker AUTO_LOAD = ["esp32_ble_tracker"] diff --git a/esphome/components/esp32_ble_server/__init__.py b/esphome/components/esp32_ble_server/__init__.py index ce9fdc2cf3..9da7d13999 100644 --- a/esphome/components/esp32_ble_server/__init__.py +++ b/esphome/components/esp32_ble_server/__init__.py @@ -1,9 +1,9 @@ import esphome.codegen as cg +from esphome.components import esp32_ble +from esphome.components.esp32 import add_idf_sdkconfig_option import esphome.config_validation as cv from esphome.const import CONF_ID, CONF_MODEL -from esphome.components import esp32_ble from esphome.core import CORE -from esphome.components.esp32 import add_idf_sdkconfig_option AUTO_LOAD = ["esp32_ble"] CODEOWNERS = ["@jesserockz", "@clydebarrow", "@Rapsssito"] diff --git a/esphome/components/esp32_ble_tracker/__init__.py b/esphome/components/esp32_ble_tracker/__init__.py index 1edeaadbfd..0aa8eadd0a 100644 --- a/esphome/components/esp32_ble_tracker/__init__.py +++ b/esphome/components/esp32_ble_tracker/__init__.py @@ -1,10 +1,10 @@ import re -import esphome.codegen as cg -import esphome.config_validation as cv from esphome import automation +import esphome.codegen as cg from esphome.components import esp32_ble from esphome.components.esp32 import add_idf_sdkconfig_option +import esphome.config_validation as cv from esphome.const import ( CONF_ACTIVE, CONF_DURATION, From caa2ea64e35ca883105f1fefeb1aeee5dbf28510 Mon Sep 17 00:00:00 2001 From: Olivier ARCHER Date: Tue, 30 Jul 2024 03:45:19 +0200 Subject: [PATCH 074/164] http_request watchdog as a component (#7161) --- CODEOWNERS | 1 + esphome/components/http_request/__init__.py | 2 +- esphome/components/http_request/http_request_arduino.cpp | 4 ++-- esphome/components/http_request/http_request_idf.cpp | 4 ++-- esphome/components/http_request/ota/ota_http_request.cpp | 2 +- esphome/components/watchdog/__init__.py | 1 + esphome/components/{http_request => watchdog}/watchdog.cpp | 2 -- esphome/components/{http_request => watchdog}/watchdog.h | 2 -- 8 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 esphome/components/watchdog/__init__.py rename esphome/components/{http_request => watchdog}/watchdog.cpp (96%) rename esphome/components/{http_request => watchdog}/watchdog.h (88%) diff --git a/CODEOWNERS b/CODEOWNERS index 2fc030453f..d94c34c019 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -427,6 +427,7 @@ esphome/components/veml7700/* @latonita esphome/components/version/* @esphome/core esphome/components/voice_assistant/* @jesserockz esphome/components/wake_on_lan/* @clydebarrow @willwill2will54 +esphome/components/watchdog/* @oarcher esphome/components/waveshare_epaper/* @clydebarrow esphome/components/web_server_base/* @OttoWinter esphome/components/web_server_idf/* @dentra diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 3ca97b9611..0407bbd326 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -14,7 +14,7 @@ from esphome.const import ( from esphome.core import CORE, Lambda DEPENDENCIES = ["network"] -AUTO_LOAD = ["json"] +AUTO_LOAD = ["json", "watchdog"] http_request_ns = cg.esphome_ns.namespace("http_request") HttpRequestComponent = http_request_ns.class_("HttpRequestComponent", cg.Component) diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp index 95b1cdc38e..2148d92ad2 100644 --- a/esphome/components/http_request/http_request_arduino.cpp +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -3,12 +3,12 @@ #ifdef USE_ARDUINO #include "esphome/components/network/util.h" +#include "esphome/components/watchdog/watchdog.h" + #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" -#include "watchdog.h" - namespace esphome { namespace http_request { diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 4fe5585723..3819f5544e 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -3,6 +3,8 @@ #ifdef USE_ESP_IDF #include "esphome/components/network/util.h" +#include "esphome/components/watchdog/watchdog.h" + #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" @@ -11,8 +13,6 @@ #include "esp_crt_bundle.h" #endif -#include "watchdog.h" - namespace esphome { namespace http_request { diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index dcc783ea47..1553de0bc1 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -1,11 +1,11 @@ #include "ota_http_request.h" -#include "../watchdog.h" #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" #include "esphome/components/md5/md5.h" +#include "esphome/components/watchdog/watchdog.h" #include "esphome/components/ota/ota_backend.h" #include "esphome/components/ota/ota_backend_arduino_esp32.h" #include "esphome/components/ota/ota_backend_arduino_esp8266.h" diff --git a/esphome/components/watchdog/__init__.py b/esphome/components/watchdog/__init__.py new file mode 100644 index 0000000000..6fb87e45a4 --- /dev/null +++ b/esphome/components/watchdog/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@oarcher"] diff --git a/esphome/components/http_request/watchdog.cpp b/esphome/components/watchdog/watchdog.cpp similarity index 96% rename from esphome/components/http_request/watchdog.cpp rename to esphome/components/watchdog/watchdog.cpp index a8519c59ed..3a94a658e8 100644 --- a/esphome/components/http_request/watchdog.cpp +++ b/esphome/components/watchdog/watchdog.cpp @@ -15,7 +15,6 @@ #endif namespace esphome { -namespace http_request { namespace watchdog { static const char *const TAG = "http_request.watchdog"; @@ -72,5 +71,4 @@ uint32_t WatchdogManager::get_timeout_() { } } // namespace watchdog -} // namespace http_request } // namespace esphome diff --git a/esphome/components/http_request/watchdog.h b/esphome/components/watchdog/watchdog.h similarity index 88% rename from esphome/components/http_request/watchdog.h rename to esphome/components/watchdog/watchdog.h index 9b54ae6c82..899ec3fde0 100644 --- a/esphome/components/http_request/watchdog.h +++ b/esphome/components/watchdog/watchdog.h @@ -5,7 +5,6 @@ #include namespace esphome { -namespace http_request { namespace watchdog { class WatchdogManager { @@ -22,5 +21,4 @@ class WatchdogManager { }; } // namespace watchdog -} // namespace http_request } // namespace esphome From d7231fadb1e174fe88f0d293c40265a26cd42ede Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 30 Jul 2024 16:50:12 +1200 Subject: [PATCH 075/164] [touchscreen] Allow binary sensor to have multiple pages in config (#7112) * [touchscreen] Allow binary sensor to have multiple pages in config * Sort imports --- .../touchscreen/binary_sensor/__init__.py | 34 +++++++++++++------ .../touchscreen_binary_sensor.cpp | 5 +-- .../binary_sensor/touchscreen_binary_sensor.h | 6 ++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/esphome/components/touchscreen/binary_sensor/__init__.py b/esphome/components/touchscreen/binary_sensor/__init__.py index 800bc4c2a9..45fefbf814 100644 --- a/esphome/components/touchscreen/binary_sensor/__init__.py +++ b/esphome/components/touchscreen/binary_sensor/__init__.py @@ -1,10 +1,9 @@ import esphome.codegen as cg -import esphome.config_validation as cv - from esphome.components import binary_sensor, display -from esphome.const import CONF_PAGE_ID +import esphome.config_validation as cv +from esphome.const import CONF_PAGE_ID, CONF_PAGES -from .. import touchscreen_ns, CONF_TOUCHSCREEN_ID, Touchscreen, TouchListener +from .. import CONF_TOUCHSCREEN_ID, TouchListener, Touchscreen, touchscreen_ns DEPENDENCIES = ["touchscreen"] @@ -22,7 +21,7 @@ CONF_Y_MIN = "y_min" CONF_Y_MAX = "y_max" -def validate_coords(config): +def _validate_coords(config): if ( config[CONF_X_MAX] < config[CONF_X_MIN] or config[CONF_Y_MAX] < config[CONF_Y_MIN] @@ -33,6 +32,15 @@ def validate_coords(config): return config +def _set_pages(config: dict) -> dict: + if CONF_PAGES in config or CONF_PAGE_ID not in config: + return config + + config = config.copy() + config[CONF_PAGES] = [config.pop(CONF_PAGE_ID)] + return config + + CONFIG_SCHEMA = cv.All( binary_sensor.binary_sensor_schema(TouchscreenBinarySensor) .extend( @@ -42,11 +50,17 @@ CONFIG_SCHEMA = cv.All( cv.Required(CONF_X_MAX): cv.int_range(min=0, max=2000), cv.Required(CONF_Y_MIN): cv.int_range(min=0, max=2000), cv.Required(CONF_Y_MAX): cv.int_range(min=0, max=2000), - cv.Optional(CONF_PAGE_ID): cv.use_id(display.DisplayPage), + cv.Exclusive(CONF_PAGE_ID, group_of_exclusion=CONF_PAGES): cv.use_id( + display.DisplayPage + ), + cv.Exclusive(CONF_PAGES, group_of_exclusion=CONF_PAGES): cv.ensure_list( + cv.use_id(display.DisplayPage) + ), } ) .extend(cv.COMPONENT_SCHEMA), - validate_coords, + _validate_coords, + _set_pages, ) @@ -64,6 +78,6 @@ async def to_code(config): ) ) - if CONF_PAGE_ID in config: - page = await cg.get_variable(config[CONF_PAGE_ID]) - cg.add(var.set_page(page)) + for page_id in config.get(CONF_PAGES, []): + page = await cg.get_variable(page_id) + cg.add(var.add_page(page)) diff --git a/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp b/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp index 6c26ae3626..6cd12d4d0d 100644 --- a/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp +++ b/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.cpp @@ -11,8 +11,9 @@ void TouchscreenBinarySensor::setup() { void TouchscreenBinarySensor::touch(TouchPoint tp) { bool touched = (tp.x >= this->x_min_ && tp.x <= this->x_max_ && tp.y >= this->y_min_ && tp.y <= this->y_max_); - if (this->page_ != nullptr) { - touched &= this->page_ == this->parent_->get_display()->get_active_page(); + if (!this->pages_.empty()) { + auto *current_page = this->parent_->get_display()->get_active_page(); + touched &= std::find(this->pages_.begin(), this->pages_.end(), current_page) != this->pages_.end(); } if (touched) { this->publish_state(true); diff --git a/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h b/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h index b56ae562b1..862f41064c 100644 --- a/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h +++ b/esphome/components/touchscreen/binary_sensor/touchscreen_binary_sensor.h @@ -6,6 +6,8 @@ #include "esphome/core/component.h" #include "esphome/core/helpers.h" +#include + namespace esphome { namespace touchscreen { @@ -30,14 +32,14 @@ class TouchscreenBinarySensor : public binary_sensor::BinarySensor, int16_t get_width() { return this->x_max_ - this->x_min_; } int16_t get_height() { return this->y_max_ - this->y_min_; } - void set_page(display::DisplayPage *page) { this->page_ = page; } + void add_page(display::DisplayPage *page) { this->pages_.push_back(page); } void touch(TouchPoint tp) override; void release() override; protected: int16_t x_min_, x_max_, y_min_, y_max_; - display::DisplayPage *page_{nullptr}; + std::vector pages_{}; }; } // namespace touchscreen From dff6884bedd1585b49d7864e52039f0f14e74fa8 Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Tue, 30 Jul 2024 16:57:51 -0400 Subject: [PATCH 076/164] [micro_wake_word] Fix VAD detection and modify detection computation (#7164) --- esphome/components/micro_wake_word/streaming_model.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/esphome/components/micro_wake_word/streaming_model.cpp b/esphome/components/micro_wake_word/streaming_model.cpp index 013fa2ce6e..d0d2e2df05 100644 --- a/esphome/components/micro_wake_word/streaming_model.cpp +++ b/esphome/components/micro_wake_word/streaming_model.cpp @@ -148,7 +148,7 @@ WakeWordModel::WakeWordModel(const uint8_t *model_start, float probability_cutof }; bool WakeWordModel::determine_detected() { - int32_t sum = 0; + uint32_t sum = 0; for (auto &prob : this->recent_streaming_probabilities_) { sum += prob; } @@ -175,12 +175,14 @@ VADModel::VADModel(const uint8_t *model_start, float probability_cutoff, size_t }; bool VADModel::determine_detected() { - uint8_t max = 0; + uint32_t sum = 0; for (auto &prob : this->recent_streaming_probabilities_) { - max = std::max(prob, max); + sum += prob; } - return max > this->probability_cutoff_; + float sliding_window_average = static_cast(sum) / static_cast(255 * this->sliding_window_size_); + + return sliding_window_average > this->probability_cutoff_; } } // namespace micro_wake_word From dd3dd7a136b9f81a5d3ff7c7296edd031af38f4f Mon Sep 17 00:00:00 2001 From: Adam Allport Date: Tue, 30 Jul 2024 22:30:15 +0100 Subject: [PATCH 077/164] fix: Add `pin->setup();` to matrix_keypad.cpp (#7163) --- esphome/components/matrix_keypad/matrix_keypad.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/matrix_keypad/matrix_keypad.cpp b/esphome/components/matrix_keypad/matrix_keypad.cpp index 902e574846..f62c75c869 100644 --- a/esphome/components/matrix_keypad/matrix_keypad.cpp +++ b/esphome/components/matrix_keypad/matrix_keypad.cpp @@ -8,6 +8,7 @@ static const char *const TAG = "matrix_keypad"; void MatrixKeypad::setup() { for (auto *pin : this->rows_) { + pin->setup(); if (!has_diodes_) { pin->pin_mode(gpio::FLAG_INPUT); } else { @@ -15,6 +16,7 @@ void MatrixKeypad::setup() { } } for (auto *pin : this->columns_) { + pin->setup(); if (has_pulldowns_) { pin->pin_mode(gpio::FLAG_INPUT); } else { From 8849443bf6e9f56e5c0f682a25a78a6782007a1e Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 31 Jul 2024 16:08:11 +1200 Subject: [PATCH 078/164] [update] Implement ``update.perform`` action and ``update.is_available`` condition (#7165) * [update] Fix unimplemented yaml action/condition * Add/update tests --------- Co-authored-by: Keith Burzinski --- .../update/http_request_update.cpp | 4 +- .../http_request/update/http_request_update.h | 2 +- esphome/components/update/__init__.py | 48 +++++++++++++------ esphome/components/update/automation.h | 23 +++++++++ esphome/components/update/update_entity.h | 4 +- tests/components/update/common.yaml | 27 +++++++++++ tests/components/update/test.esp32-ard.yaml | 3 ++ tests/components/update/test.esp8266-ard.yaml | 3 ++ tests/components/update/test.rp2040-ard.yaml | 3 ++ 9 files changed, 98 insertions(+), 19 deletions(-) create mode 100644 esphome/components/update/automation.h diff --git a/esphome/components/http_request/update/http_request_update.cpp b/esphome/components/http_request/update/http_request_update.cpp index 0a14dfd933..059148e7e5 100644 --- a/esphome/components/http_request/update/http_request_update.cpp +++ b/esphome/components/http_request/update/http_request_update.cpp @@ -138,8 +138,8 @@ void HttpRequestUpdate::update() { this->publish_state(); } -void HttpRequestUpdate::perform() { - if (this->state_ != update::UPDATE_STATE_AVAILABLE) { +void HttpRequestUpdate::perform(bool force) { + if (this->state_ != update::UPDATE_STATE_AVAILABLE && !force) { return; } diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h index a6bc97392b..943231a906 100644 --- a/esphome/components/http_request/update/http_request_update.h +++ b/esphome/components/http_request/update/http_request_update.h @@ -15,7 +15,7 @@ class HttpRequestUpdate : public update::UpdateEntity, public PollingComponent { void setup() override; void update() override; - void perform() override; + void perform(bool force) override; void set_source_url(const std::string &source_url) { this->source_url_ = source_url; } diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index 45bf082fa4..ba3b2f20df 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -1,10 +1,11 @@ from esphome import automation +import esphome.codegen as cg from esphome.components import mqtt, web_server import esphome.config_validation as cv -import esphome.codegen as cg from esphome.const import ( CONF_DEVICE_CLASS, CONF_ENTITY_CATEGORY, + CONF_FORCE_UPDATE, CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, @@ -23,8 +24,12 @@ UpdateEntity = update_ns.class_("UpdateEntity", cg.EntityBase) UpdateInfo = update_ns.struct("UpdateInfo") -PerformAction = update_ns.class_("PerformAction", automation.Action) -IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) +PerformAction = update_ns.class_( + "PerformAction", automation.Action, cg.Parented.template(UpdateEntity) +) +IsAvailableCondition = update_ns.class_( + "IsAvailableCondition", automation.Condition, cg.Parented.template(UpdateEntity) +) DEVICE_CLASSES = [ DEVICE_CLASS_EMPTY, @@ -92,24 +97,37 @@ async def to_code(config): cg.add_global(update_ns.using) -UPDATE_AUTOMATION_SCHEMA = cv.Schema( - { - cv.GenerateID(): cv.use_id(UpdateEntity), - } +@automation.register_action( + "update.perform", + PerformAction, + automation.maybe_simple_id( + { + cv.GenerateID(): cv.use_id(UpdateEntity), + cv.Optional(CONF_FORCE_UPDATE, default=False): cv.templatable(cv.boolean), + } + ), ) - - -@automation.register_action("update.perform", PerformAction, UPDATE_AUTOMATION_SCHEMA) async def update_perform_action_to_code(config, action_id, template_arg, args): - paren = await cg.get_variable(config[CONF_ID]) - return cg.new_Pvariable(action_id, paren, paren) + var = cg.new_Pvariable(action_id, template_arg) + await cg.register_parented(var, config[CONF_ID]) + + force = await cg.templatable(config[CONF_FORCE_UPDATE], args, cg.bool_) + cg.add(var.set_force(force)) + return var @automation.register_condition( - "update.is_available", IsAvailableCondition, UPDATE_AUTOMATION_SCHEMA + "update.is_available", + IsAvailableCondition, + automation.maybe_simple_id( + { + cv.GenerateID(): cv.use_id(UpdateEntity), + } + ), ) async def update_is_available_condition_to_code( config, condition_id, template_arg, args ): - paren = await cg.get_variable(config[CONF_ID]) - return cg.new_Pvariable(condition_id, paren, paren) + var = cg.new_Pvariable(condition_id, template_arg) + await cg.register_parented(var, config[CONF_ID]) + return var diff --git a/esphome/components/update/automation.h b/esphome/components/update/automation.h new file mode 100644 index 0000000000..df50f86a0c --- /dev/null +++ b/esphome/components/update/automation.h @@ -0,0 +1,23 @@ +#pragma once + +#include "update_entity.h" + +#include "esphome/core/automation.h" + +namespace esphome { +namespace update { + +template class PerformAction : public Action, public Parented { + TEMPLATABLE_VALUE(bool, force) + + public: + void play(Ts... x) override { this->parent_->perform(this->force_.value(x...)); } +}; + +template class IsAvailableCondition : public Condition, public Parented { + public: + bool check(Ts... x) override { return this->parent_->state == UPDATE_STATE_AVAILABLE; } +}; + +} // namespace update +} // namespace esphome diff --git a/esphome/components/update/update_entity.h b/esphome/components/update/update_entity.h index 5984c8e35b..568fbe3bb0 100644 --- a/esphome/components/update/update_entity.h +++ b/esphome/components/update/update_entity.h @@ -32,7 +32,9 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass { void publish_state(); - virtual void perform() = 0; + void perform() { this->perform(false); } + + virtual void perform(bool force) = 0; const UpdateInfo &update_info = update_info_; const UpdateState &state = state_; diff --git a/tests/components/update/common.yaml b/tests/components/update/common.yaml index 91b8669505..dcb4f42527 100644 --- a/tests/components/update/common.yaml +++ b/tests/components/update/common.yaml @@ -1 +1,28 @@ +substitutions: + verify_ssl: "true" + +esphome: + on_boot: + then: + - if: + condition: + update.is_available: + then: + - logger.log: "Update available" + - update.perform: + force_update: true + +wifi: + ssid: MySSID + password: password1 + +http_request: + verify_ssl: ${verify_ssl} + +ota: + - platform: http_request + update: + - platform: http_request + name: Firmware Update + source: http://example.com/manifest.json diff --git a/tests/components/update/test.esp32-ard.yaml b/tests/components/update/test.esp32-ard.yaml index dade44d145..c1937b5a10 100644 --- a/tests/components/update/test.esp32-ard.yaml +++ b/tests/components/update/test.esp32-ard.yaml @@ -1 +1,4 @@ +substitutions: + verify_ssl: "false" + <<: !include common.yaml diff --git a/tests/components/update/test.esp8266-ard.yaml b/tests/components/update/test.esp8266-ard.yaml index dade44d145..c1937b5a10 100644 --- a/tests/components/update/test.esp8266-ard.yaml +++ b/tests/components/update/test.esp8266-ard.yaml @@ -1 +1,4 @@ +substitutions: + verify_ssl: "false" + <<: !include common.yaml diff --git a/tests/components/update/test.rp2040-ard.yaml b/tests/components/update/test.rp2040-ard.yaml index dade44d145..c1937b5a10 100644 --- a/tests/components/update/test.rp2040-ard.yaml +++ b/tests/components/update/test.rp2040-ard.yaml @@ -1 +1,4 @@ +substitutions: + verify_ssl: "false" + <<: !include common.yaml From 3920029aff9dd85fd5f0775945b8426c03da471c Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:31:15 +1000 Subject: [PATCH 079/164] [lvgl] PR stage 3 (#7160) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/lvgl/__init__.py | 58 +++++-- esphome/components/lvgl/automation.py | 188 +++++++++++++++++++++ esphome/components/lvgl/btn.py | 6 +- esphome/components/lvgl/defines.py | 30 +++- esphome/components/lvgl/lv_validation.py | 46 ++--- esphome/components/lvgl/lvcode.py | 64 ++++--- esphome/components/lvgl/lvgl_esphome.cpp | 75 +++++++- esphome/components/lvgl/lvgl_esphome.h | 165 ++++++++++++++++-- esphome/components/lvgl/obj.py | 13 +- esphome/components/lvgl/rotary_encoders.py | 62 +++++++ esphome/components/lvgl/schemas.py | 80 ++++++++- esphome/components/lvgl/touchscreens.py | 5 +- esphome/components/lvgl/trigger.py | 61 +++++++ esphome/components/lvgl/types.py | 23 ++- esphome/components/lvgl/widget.py | 58 +++++-- esphome/core/defines.h | 3 + tests/components/lvgl/lvgl-package.yaml | 35 ++++ tests/components/lvgl/test.esp32-idf.yaml | 21 +++ 18 files changed, 895 insertions(+), 98 deletions(-) create mode 100644 esphome/components/lvgl/automation.py create mode 100644 esphome/components/lvgl/rotary_encoders.py create mode 100644 esphome/components/lvgl/trigger.py diff --git a/esphome/components/lvgl/__init__.py b/esphome/components/lvgl/__init__.py index c454a61957..182d04e038 100644 --- a/esphome/components/lvgl/__init__.py +++ b/esphome/components/lvgl/__init__.py @@ -1,5 +1,6 @@ import logging +from esphome.automation import build_automation, register_action, validate_automation import esphome.codegen as cg from esphome.components.display import Display import esphome.config_validation as cv @@ -8,7 +9,11 @@ from esphome.const import ( CONF_BUFFER_SIZE, CONF_ID, CONF_LAMBDA, + CONF_ON_IDLE, CONF_PAGES, + CONF_TIMEOUT, + CONF_TRIGGER_ID, + CONF_TYPE, ) from esphome.core import CORE, ID, Lambda from esphome.cpp_generator import MockObj @@ -16,21 +21,26 @@ from esphome.final_validate import full_config from esphome.helpers import write_file_if_changed from . import defines as df, helpers, lv_validation as lvalid +from .automation import update_to_code from .btn import btn_spec from .label import label_spec -from .lvcode import ConstantLiteral, LvContext +from .lv_validation import lv_images_used +from .lvcode import LvContext from .obj import obj_spec -from .schemas import any_widget_schema, obj_schema +from .rotary_encoders import ROTARY_ENCODER_CONFIG, rotary_encoders_to_code +from .schemas import any_widget_schema, create_modify_schema, obj_schema from .touchscreens import touchscreen_schema, touchscreens_to_code +from .trigger import generate_triggers from .types import ( WIDGET_TYPES, FontEngine, + IdleTrigger, LvglComponent, - lv_disp_t_ptr, + ObjUpdateAction, lv_font_t, lvgl_ns, ) -from .widget import LvScrActType, Widget, add_widgets, set_obj_properties +from .widget import Widget, add_widgets, lv_scr_act, set_obj_properties DOMAIN = "lvgl" DEPENDENCIES = ("display",) @@ -41,17 +51,21 @@ LOGGER = logging.getLogger(__name__) for w_type in (label_spec, obj_spec, btn_spec): WIDGET_TYPES[w_type.name] = w_type -lv_scr_act_spec = LvScrActType() -lv_scr_act = Widget.create( - None, ConstantLiteral("lv_scr_act()"), lv_scr_act_spec, {}, parent=None -) - WIDGET_SCHEMA = any_widget_schema() +for w_type in WIDGET_TYPES.values(): + register_action( + f"lvgl.{w_type.name}.update", + ObjUpdateAction, + create_modify_schema(w_type), + )(update_to_code) + async def add_init_lambda(lv_component, init): if init: - lamb = await cg.process_lambda(Lambda(init), [(lv_disp_t_ptr, "lv_disp")]) + lamb = await cg.process_lambda( + Lambda(init), [(LvglComponent.operator("ptr"), "lv_component")] + ) cg.add(lv_component.add_init_lambda(lamb)) @@ -99,6 +113,13 @@ def final_validation(config): buffer_frac = config[CONF_BUFFER_SIZE] if CORE.is_esp32 and buffer_frac > 0.5 and "psram" not in global_config: LOGGER.warning("buffer_size: may need to be reduced without PSRAM") + for image_id in lv_images_used: + path = global_config.get_path_for_id(image_id)[:-1] + image_conf = global_config.get_config_for_path(path) + if image_conf[CONF_TYPE] in ("RGBA", "RGB24"): + raise cv.Invalid( + "Using RGBA or RGB24 in image config not compatible with LVGL", path + ) async def to_code(config): @@ -174,9 +195,15 @@ async def to_code(config): with LvContext(): await touchscreens_to_code(lv_component, config) + await rotary_encoders_to_code(lv_component, config) await set_obj_properties(lv_scr_act, config) await add_widgets(lv_scr_act, config) - Widget.set_completed() + Widget.set_completed() + await generate_triggers(lv_component) + for conf in config.get(CONF_ON_IDLE, ()): + templ = await cg.templatable(conf[CONF_TIMEOUT], [], cg.uint32) + idle_trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], lv_component, templ) + await build_automation(idle_trigger, [], conf) await add_init_lambda(lv_component, LvContext.get_code()) for comp in helpers.lvgl_components_required: CORE.add_define(f"USE_LVGL_{comp.upper()}") @@ -212,9 +239,18 @@ CONFIG_SCHEMA = ( cv.Optional(df.CONF_BYTE_ORDER, default="big_endian"): cv.one_of( "big_endian", "little_endian" ), + cv.Optional(CONF_ON_IDLE): validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(IdleTrigger), + cv.Required(CONF_TIMEOUT): cv.templatable( + cv.positive_time_period_milliseconds + ), + } + ), cv.Optional(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA), cv.Optional(df.CONF_TRANSPARENCY_KEY, default=0x000400): lvalid.lv_color, cv.GenerateID(df.CONF_TOUCHSCREENS): touchscreen_schema, + cv.GenerateID(df.CONF_ROTARY_ENCODERS): ROTARY_ENCODER_CONFIG, } ) ).add_extra(cv.has_at_least_one_key(CONF_PAGES, df.CONF_WIDGETS)) diff --git a/esphome/components/lvgl/automation.py b/esphome/components/lvgl/automation.py new file mode 100644 index 0000000000..4fd0be185e --- /dev/null +++ b/esphome/components/lvgl/automation.py @@ -0,0 +1,188 @@ +from esphome import automation +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_TIMEOUT +from esphome.core import Lambda +from esphome.cpp_generator import RawStatement +from esphome.cpp_types import nullptr + +from .defines import CONF_LVGL_ID, CONF_SHOW_SNOW, literal +from .lv_validation import lv_bool +from .lvcode import ( + LambdaContext, + ReturnStatement, + add_line_marks, + lv, + lv_add, + lv_obj, + lvgl_comp, +) +from .schemas import ACTION_SCHEMA, LVGL_SCHEMA +from .types import ( + LvglAction, + LvglComponent, + LvglComponentPtr, + LvglCondition, + ObjUpdateAction, + lv_obj_t, +) +from .widget import Widget, get_widget, lv_scr_act, set_obj_properties + + +async def action_to_code(action: list, action_id, widget: Widget, template_arg, args): + with LambdaContext() as context: + lv.cond_if(widget.obj == nullptr) + lv_add(RawStatement(" return;")) + lv.cond_endif() + code = context.get_code() + code.extend(action) + action = "\n".join(code) + "\n\n" + lamb = await cg.process_lambda(Lambda(action), args) + var = cg.new_Pvariable(action_id, template_arg, lamb) + return var + + +async def update_to_code(config, action_id, template_arg, args): + if config is not None: + widget = await get_widget(config) + with LambdaContext() as context: + add_line_marks(action_id) + await set_obj_properties(widget, config) + await widget.type.to_code(widget, config) + if ( + widget.type.w_type.value_property is not None + and widget.type.w_type.value_property in config + ): + lv.event_send(widget.obj, literal("LV_EVENT_VALUE_CHANGED"), nullptr) + return await action_to_code( + context.get_code(), action_id, widget, template_arg, args + ) + + +@automation.register_condition( + "lvgl.is_paused", + LvglCondition, + LVGL_SCHEMA, +) +async def lvgl_is_paused(config, condition_id, template_arg, args): + lvgl = config[CONF_LVGL_ID] + with LambdaContext( + [(LvglComponentPtr, "lvgl_comp")], return_type=cg.bool_ + ) as context: + lv_add(ReturnStatement(lvgl_comp.is_paused())) + var = cg.new_Pvariable(condition_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, lvgl) + return var + + +@automation.register_condition( + "lvgl.is_idle", + LvglCondition, + LVGL_SCHEMA.extend( + { + cv.Required(CONF_TIMEOUT): cv.templatable( + cv.positive_time_period_milliseconds + ) + } + ), +) +async def lvgl_is_idle(config, condition_id, template_arg, args): + lvgl = config[CONF_LVGL_ID] + timeout = await cg.templatable(config[CONF_TIMEOUT], [], cg.uint32) + with LambdaContext( + [(LvglComponentPtr, "lvgl_comp")], return_type=cg.bool_ + ) as context: + lv_add(ReturnStatement(lvgl_comp.is_idle(timeout))) + var = cg.new_Pvariable(condition_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, lvgl) + return var + + +@automation.register_action( + "lvgl.widget.redraw", + ObjUpdateAction, + cv.Schema( + { + cv.Optional(CONF_ID): cv.use_id(lv_obj_t), + cv.GenerateID(CONF_LVGL_ID): cv.use_id(LvglComponent), + } + ), +) +async def obj_invalidate_to_code(config, action_id, template_arg, args): + if CONF_ID in config: + w = await get_widget(config) + else: + w = lv_scr_act + with LambdaContext() as context: + add_line_marks(action_id) + lv_obj.invalidate(w.obj) + return await action_to_code(context.get_code(), action_id, w, template_arg, args) + + +@automation.register_action( + "lvgl.pause", + LvglAction, + { + cv.GenerateID(): cv.use_id(LvglComponent), + cv.Optional(CONF_SHOW_SNOW, default=False): lv_bool, + }, +) +async def pause_action_to_code(config, action_id, template_arg, args): + with LambdaContext([(LvglComponentPtr, "lvgl_comp")]) as context: + add_line_marks(action_id) + lv_add(lvgl_comp.set_paused(True, config[CONF_SHOW_SNOW])) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, config[CONF_ID]) + return var + + +@automation.register_action( + "lvgl.resume", + LvglAction, + { + cv.GenerateID(): cv.use_id(LvglComponent), + }, +) +async def resume_action_to_code(config, action_id, template_arg, args): + with LambdaContext([(LvglComponentPtr, "lvgl_comp")]) as context: + add_line_marks(action_id) + lv_add(lvgl_comp.set_paused(False, False)) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, config[CONF_ID]) + return var + + +@automation.register_action("lvgl.widget.disable", ObjUpdateAction, ACTION_SCHEMA) +async def obj_disable_to_code(config, action_id, template_arg, args): + w = await get_widget(config) + with LambdaContext() as context: + add_line_marks(action_id) + w.add_state("LV_STATE_DISABLED") + return await action_to_code(context.get_code(), action_id, w, template_arg, args) + + +@automation.register_action("lvgl.widget.enable", ObjUpdateAction, ACTION_SCHEMA) +async def obj_enable_to_code(config, action_id, template_arg, args): + w = await get_widget(config) + with LambdaContext() as context: + add_line_marks(action_id) + w.clear_state("LV_STATE_DISABLED") + return await action_to_code(context.get_code(), action_id, w, template_arg, args) + + +@automation.register_action("lvgl.widget.hide", ObjUpdateAction, ACTION_SCHEMA) +async def obj_hide_to_code(config, action_id, template_arg, args): + w = await get_widget(config) + with LambdaContext() as context: + add_line_marks(action_id) + w.add_flag("LV_OBJ_FLAG_HIDDEN") + return await action_to_code(context.get_code(), action_id, w, template_arg, args) + + +@automation.register_action("lvgl.widget.show", ObjUpdateAction, ACTION_SCHEMA) +async def obj_show_to_code(config, action_id, template_arg, args): + w = await get_widget(config) + with LambdaContext() as context: + add_line_marks(action_id) + w.clear_flag("LV_OBJ_FLAG_HIDDEN") + return await action_to_code(context.get_code(), action_id, w, template_arg, args) diff --git a/esphome/components/lvgl/btn.py b/esphome/components/lvgl/btn.py index 4f5f88d9e6..064d886d47 100644 --- a/esphome/components/lvgl/btn.py +++ b/esphome/components/lvgl/btn.py @@ -9,9 +9,6 @@ class BtnType(WidgetType): def __init__(self): super().__init__(CONF_BUTTON, LvBoolean("lv_btn_t"), (CONF_MAIN,)) - async def to_code(self, w, config): - return [] - def obj_creator(self, parent: MockObjClass, config: dict): """ LVGL 8 calls buttons `btn` @@ -21,5 +18,8 @@ class BtnType(WidgetType): def get_uses(self): return ("btn",) + async def to_code(self, w, config): + return [] + btn_spec = BtnType() diff --git a/esphome/components/lvgl/defines.py b/esphome/components/lvgl/defines.py index a2b4ac13fb..9f349e3943 100644 --- a/esphome/components/lvgl/defines.py +++ b/esphome/components/lvgl/defines.py @@ -4,12 +4,32 @@ Constants already defined in esphome.const are not duplicated here and must be i """ +from typing import Union + from esphome import codegen as cg, config_validation as cv from esphome.core import ID, Lambda +from esphome.cpp_generator import Literal from esphome.cpp_types import uint32 from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor -from .lvcode import ConstantLiteral +from .helpers import requires_component + + +class ConstantLiteral(Literal): + __slots__ = ("constant",) + + def __init__(self, constant: str): + super().__init__() + self.constant = constant + + def __str__(self): + return self.constant + + +def literal(arg: Union[str, ConstantLiteral]): + if isinstance(arg, str): + return ConstantLiteral(arg) + return arg class LValidator: @@ -18,14 +38,19 @@ class LValidator: has `process()` to convert a value during code generation """ - def __init__(self, validator, rtype, idtype=None, idexpr=None, retmapper=None): + def __init__( + self, validator, rtype, idtype=None, idexpr=None, retmapper=None, requires=None + ): self.validator = validator self.rtype = rtype self.idtype = idtype self.idexpr = idexpr self.retmapper = retmapper + self.requires = requires def __call__(self, value): + if self.requires: + value = requires_component(self.requires)(value) if isinstance(value, cv.Lambda): return cv.returning_lambda(value) if self.idtype is not None and isinstance(value, ID): @@ -422,6 +447,7 @@ CONF_RECOLOR = "recolor" CONF_RIGHT_BUTTON = "right_button" CONF_ROLLOVER = "rollover" CONF_ROOT_BACK_BTN = "root_back_btn" +CONF_ROTARY_ENCODERS = "rotary_encoders" CONF_ROWS = "rows" CONF_SCALES = "scales" CONF_SCALE_LINES = "scale_lines" diff --git a/esphome/components/lvgl/lv_validation.py b/esphome/components/lvgl/lv_validation.py index 533dc582f0..818bde6aed 100644 --- a/esphome/components/lvgl/lv_validation.py +++ b/esphome/components/lvgl/lv_validation.py @@ -2,6 +2,7 @@ import esphome.codegen as cg from esphome.components.binary_sensor import BinarySensor from esphome.components.color import ColorStruct from esphome.components.font import Font +from esphome.components.image import Image_ from esphome.components.sensor import Sensor from esphome.components.text_sensor import TextSensor import esphome.config_validation as cv @@ -13,22 +14,15 @@ from esphome.helpers import cpp_string_escape from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor from . import types as ty -from .defines import LV_FONTS, LValidator, LvConstant +from .defines import LV_FONTS, ConstantLiteral, LValidator, LvConstant, literal from .helpers import ( esphome_fonts_used, lv_fonts_used, lvgl_components_required, requires_component, ) -from .lvcode import ConstantLiteral, lv_expr -from .types import lv_font_t - - -def literal_mapper(value, args=()): - if isinstance(value, str): - return ConstantLiteral(value) - return value - +from .lvcode import lv_expr +from .types import lv_font_t, lv_img_t opacity_consts = LvConstant("LV_OPA_", "TRANSP", "COVER") @@ -43,7 +37,7 @@ def opacity_validator(value): return value -opacity = LValidator(opacity_validator, uint32, retmapper=literal_mapper) +opacity = LValidator(opacity_validator, uint32, retmapper=literal) @schema_extractor("one_of") @@ -79,9 +73,7 @@ def pixels_or_percent_validator(value): return f"lv_pct({int(cv.percentage(value) * 100)})" -pixels_or_percent = LValidator( - pixels_or_percent_validator, uint32, retmapper=literal_mapper -) +pixels_or_percent = LValidator(pixels_or_percent_validator, uint32, retmapper=literal) def zoom(value): @@ -115,7 +107,7 @@ def size_validator(value): return f"lv_pct({int(cv.percentage(value) * 100)})" -size = LValidator(size_validator, uint32, retmapper=literal_mapper) +size = LValidator(size_validator, uint32, retmapper=literal) radius_consts = LvConstant("LV_RADIUS_", "CIRCLE") @@ -130,21 +122,37 @@ def radius_validator(value): return value +radius = LValidator(radius_validator, uint32, retmapper=literal) + + def id_name(value): if value == SCHEMA_EXTRACT: return "id" return cv.validate_id_name(value) -radius = LValidator(radius_validator, uint32, retmapper=literal_mapper) - - def stop_value(value): return cv.int_range(0, 255)(value) +lv_images_used = set() + + +def image_validator(value): + value = requires_component("image")(value) + value = cv.use_id(Image_)(value) + lv_images_used.add(value) + return value + + +lv_image = LValidator( + image_validator, + lv_img_t, + retmapper=lambda x: lv_expr.img_from(MockObj(x)), + requires="image", +) lv_bool = LValidator( - cv.boolean, cg.bool_, BinarySensor, "get_state()", retmapper=literal_mapper + cv.boolean, cg.bool_, BinarySensor, "get_state()", retmapper=literal ) diff --git a/esphome/components/lvgl/lvcode.py b/esphome/components/lvgl/lvcode.py index 13b4862b4d..3a8a958f2e 100644 --- a/esphome/components/lvgl/lvcode.py +++ b/esphome/components/lvgl/lvcode.py @@ -8,8 +8,8 @@ from esphome.cpp_generator import ( AssignmentExpression, CallExpression, Expression, + ExpressionStatement, LambdaExpression, - Literal, MockObj, RawExpression, RawStatement, @@ -19,7 +19,9 @@ from esphome.cpp_generator import ( statement, ) +from .defines import ConstantLiteral from .helpers import get_line_marks +from .types import lv_group_t _LOGGER = logging.getLogger(__name__) @@ -105,29 +107,40 @@ class LambdaContext(CodeContext): def __init__( self, - parameters: list[tuple[SafeExpType, str]], - return_type: SafeExpType = None, + parameters: list[tuple[SafeExpType, str]] = None, + return_type: SafeExpType = cg.void, + capture: str = "", ): super().__init__() self.code_list: list[Statement] = [] self.parameters = parameters self.return_type = return_type + self.capture = capture def add(self, expression: Union[Expression, Statement]): self.code_list.append(expression) return expression - async def code(self) -> LambdaExpression: + async def get_lambda(self) -> LambdaExpression: + code_text = self.get_code() + return await cg.process_lambda( + Lambda("\n".join(code_text) + "\n\n"), + self.parameters, + capture=self.capture, + return_type=self.return_type, + ) + + def get_code(self): code_text = [] for exp in self.code_list: text = str(statement(exp)) text = text.rstrip() code_text.append(text) - return await cg.process_lambda( - Lambda("\n".join(code_text) + "\n\n"), - self.parameters, - return_type=self.return_type, - ) + return code_text + + def __enter__(self): + super().__enter__() + return self class LocalVariable(MockObj): @@ -187,13 +200,18 @@ class MockLv: return result def cond_if(self, expression: Expression): - CodeContext.append(RawExpression(f"if({expression}) {{")) + CodeContext.append(RawStatement(f"if {expression} {{")) def cond_else(self): - CodeContext.append(RawExpression("} else {")) + CodeContext.append(RawStatement("} else {")) def cond_endif(self): - CodeContext.append(RawExpression("}")) + CodeContext.append(RawStatement("}")) + + +class ReturnStatement(ExpressionStatement): + def __str__(self): + return f"return {self.expression};" class LvExpr(MockLv): @@ -210,6 +228,7 @@ lv = MockLv("lv_") lv_expr = LvExpr("lv_") # Mock for lv_obj_ calls lv_obj = MockLv("lv_obj_") +lvgl_comp = MockObj("lvgl_comp", "->") # equivalent to cg.add() for the lvgl init context @@ -226,12 +245,19 @@ def lv_assign(target, expression): lv_add(RawExpression(f"{target} = {expression}")) -class ConstantLiteral(Literal): - __slots__ = ("constant",) +lv_groups = {} # Widget group names - def __init__(self, constant: str): - super().__init__() - self.constant = constant - def __str__(self): - return self.constant +def add_group(name): + if name is None: + return None + fullname = f"lv_esp_group_{name}" + if name not in lv_groups: + gid = ID(fullname, True, type=lv_group_t.operator("ptr")) + lv_add( + AssignmentExpression( + type_=gid.type, modifier="", name=fullname, rhs=lv_expr.group_create() + ) + ) + lv_groups[name] = ConstantLiteral(fullname) + return lv_groups[name] diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp index 74a1b0e7af..34f8eaf21f 100644 --- a/esphome/components/lvgl/lvgl_esphome.cpp +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -19,13 +19,35 @@ void LvglComponent::draw_buffer_(const lv_area_t *area, const uint8_t *ptr) { } void LvglComponent::flush_cb_(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { - auto now = millis(); - this->draw_buffer_(area, (const uint8_t *) color_p); - ESP_LOGV(TAG, "flush_cb, area=%d/%d, %d/%d took %dms", area->x1, area->y1, lv_area_get_width(area), - lv_area_get_height(area), (int) (millis() - now)); + if (!this->paused_) { + auto now = millis(); + this->draw_buffer_(area, (const uint8_t *) color_p); + ESP_LOGV(TAG, "flush_cb, area=%d/%d, %d/%d took %dms", area->x1, area->y1, lv_area_get_width(area), + lv_area_get_height(area), (int) (millis() - now)); + } lv_disp_flush_ready(disp_drv); } +void LvglComponent::write_random_() { + // length of 2 lines in 32 bit units + // we write 2 lines for the benefit of displays that won't write one line at a time. + size_t line_len = this->disp_drv_.hor_res * LV_COLOR_DEPTH / 8 / 4 * 2; + for (size_t i = 0; i != line_len; i++) { + ((uint32_t *) (this->draw_buf_.buf1))[i] = random_uint32(); + } + lv_area_t area; + area.x1 = 0; + area.x2 = this->disp_drv_.hor_res - 1; + if (this->snow_line_ == this->disp_drv_.ver_res / 2) { + area.y1 = static_cast(random_uint32() % (this->disp_drv_.ver_res / 2) * 2); + } else { + area.y1 = this->snow_line_++ * 2; + } + // write 2 lines + area.y2 = area.y1 + 1; + this->draw_buffer_(&area, (const uint8_t *) this->draw_buf_.buf1); +} + void LvglComponent::setup() { ESP_LOGCONFIG(TAG, "LVGL Setup starts"); #if LV_USE_LOG @@ -74,10 +96,53 @@ void LvglComponent::setup() { ESP_LOGV(TAG, "sw_rotate = %d, rotated=%d", this->disp_drv_.sw_rotate, this->disp_drv_.rotated); this->disp_ = lv_disp_drv_register(&this->disp_drv_); for (const auto &v : this->init_lambdas_) - v(this->disp_); + v(this); lv_disp_trig_activity(this->disp_); ESP_LOGCONFIG(TAG, "LVGL Setup complete"); } + +#ifdef USE_LVGL_IMAGE +lv_img_dsc_t *lv_img_from(image::Image *src, lv_img_dsc_t *img_dsc) { + if (img_dsc == nullptr) + img_dsc = new lv_img_dsc_t(); // NOLINT + img_dsc->header.always_zero = 0; + img_dsc->header.reserved = 0; + img_dsc->header.w = src->get_width(); + img_dsc->header.h = src->get_height(); + img_dsc->data = src->get_data_start(); + img_dsc->data_size = image_type_to_width_stride(img_dsc->header.w * img_dsc->header.h, src->get_type()); + switch (src->get_type()) { + case image::IMAGE_TYPE_BINARY: + img_dsc->header.cf = LV_IMG_CF_ALPHA_1BIT; + break; + + case image::IMAGE_TYPE_GRAYSCALE: + img_dsc->header.cf = LV_IMG_CF_ALPHA_8BIT; + break; + + case image::IMAGE_TYPE_RGB24: + img_dsc->header.cf = LV_IMG_CF_RGB888; + break; + + case image::IMAGE_TYPE_RGB565: +#if LV_COLOR_DEPTH == 16 + img_dsc->header.cf = src->has_transparency() ? LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED : LV_IMG_CF_TRUE_COLOR; +#else + img_dsc->header.cf = LV_IMG_CF_RGB565; +#endif + break; + + case image::IMAGE_TYPE_RGBA: +#if LV_COLOR_DEPTH == 32 + img_dsc->header.cf = LV_IMG_CF_TRUE_COLOR; +#else + img_dsc->header.cf = LV_IMG_CF_RGBA8888; +#endif + break; + } + return img_dsc; +} +#endif } // namespace lvgl } // namespace esphome diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h index a884a27042..a0d3d226ce 100644 --- a/esphome/components/lvgl/lvgl_esphome.h +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -1,23 +1,32 @@ #pragma once #include "esphome/core/defines.h" -#ifdef USE_LVGL + +#ifdef USE_LVGL_BINARY_SENSOR +#include "esphome/components/binary_sensor/binary_sensor.h" +#endif // USE_LVGL_BINARY_SENSOR +#ifdef USE_LVGL_ROTARY_ENCODER +#include "esphome/components/rotary_encoder/rotary_encoder.h" +#endif // USE_LVGL_ROTARY_ENCODER // required for clang-tidy #ifndef LV_CONF_H #define LV_CONF_SKIP 1 // NOLINT -#endif +#endif // LV_CONF_H #include "esphome/components/display/display.h" #include "esphome/components/display/display_color_utils.h" #include "esphome/core/component.h" -#include "esphome/core/hal.h" #include "esphome/core/log.h" #include +#include #include +#ifdef USE_LVGL_IMAGE +#include "esphome/components/image/image.h" +#endif // USE_LVGL_IMAGE #ifdef USE_LVGL_FONT #include "esphome/components/font/font.h" -#endif +#endif // USE_LVGL_FONT #ifdef USE_LVGL_TOUCHSCREEN #include "esphome/components/touchscreen/touchscreen.h" #endif // USE_LVGL_TOUCHSCREEN @@ -40,7 +49,7 @@ static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BIT // Parent class for things that wrap an LVGL object class LvCompound final { public: - virtual void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } + void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } lv_obj_t *obj{}; }; @@ -49,6 +58,15 @@ using set_value_lambda_t = std::function; using event_callback_t = void(_lv_event_t *); using text_lambda_t = std::function; +template class ObjUpdateAction : public Action { + public: + explicit ObjUpdateAction(std::function &&lamb) : lamb_(std::move(lamb)) {} + + void play(Ts... x) override { this->lamb_(x...); } + + protected: + std::function lamb_; +}; #ifdef USE_LVGL_FONT class FontEngine { public: @@ -67,6 +85,9 @@ class FontEngine { lv_font_t lv_font_{}; }; #endif // USE_LVGL_FONT +#ifdef USE_LVGL_IMAGE +lv_img_dsc_t *lv_img_from(image::Image *src, lv_img_dsc_t *img_dsc = nullptr); +#endif // USE_LVGL_IMAGE class LvglComponent : public PollingComponent { constexpr static const char *const TAG = "lvgl"; @@ -92,27 +113,54 @@ class LvglComponent : public PollingComponent { area->y2++; } - void loop() override { lv_timer_handler_run_in_period(5); } void setup() override; - void update() override {} + void update() override { + // update indicators + if (this->paused_) { + return; + } + this->idle_callbacks_.call(lv_disp_get_inactive_time(this->disp_)); + } + void loop() override { + if (this->paused_) { + if (this->show_snow_) + this->write_random_(); + } + lv_timer_handler_run_in_period(5); + } + + void add_on_idle_callback(std::function &&callback) { + this->idle_callbacks_.add(std::move(callback)); + } void add_display(display::Display *display) { this->displays_.push_back(display); } - void add_init_lambda(const std::function &lamb) { this->init_lambdas_.push_back(lamb); } + void add_init_lambda(const std::function &lamb) { this->init_lambdas_.push_back(lamb); } void dump_config() override; void set_full_refresh(bool full_refresh) { this->full_refresh_ = full_refresh; } + bool is_idle(uint32_t idle_ms) { return lv_disp_get_inactive_time(this->disp_) > idle_ms; } void set_buffer_frac(size_t frac) { this->buffer_frac_ = frac; } lv_disp_t *get_disp() { return this->disp_; } void set_paused(bool paused, bool show_snow) { this->paused_ = paused; + this->show_snow_ = show_snow; + this->snow_line_ = 0; if (!paused && lv_scr_act() != nullptr) { lv_disp_trig_activity(this->disp_); // resets the inactivity time lv_obj_invalidate(lv_scr_act()); } } + + void add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event) { + lv_obj_add_event_cb(obj, callback, event, this); + if (event == LV_EVENT_VALUE_CHANGED) { + lv_obj_add_event_cb(obj, callback, lv_custom_event, this); + } + } bool is_paused() const { return this->paused_; } protected: + void write_random_(); void draw_buffer_(const lv_area_t *area, const uint8_t *ptr); void flush_cb_(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); std::vector displays_{}; @@ -120,12 +168,52 @@ class LvglComponent : public PollingComponent { lv_disp_drv_t disp_drv_{}; lv_disp_t *disp_{}; bool paused_{}; + bool show_snow_{}; + lv_coord_t snow_line_{}; - std::vector> init_lambdas_; + std::vector> init_lambdas_; + CallbackManager idle_callbacks_{}; size_t buffer_frac_{1}; bool full_refresh_{}; }; +class IdleTrigger : public Trigger<> { + public: + explicit IdleTrigger(LvglComponent *parent, TemplatableValue timeout) : timeout_(std::move(timeout)) { + parent->add_on_idle_callback([this](uint32_t idle_time) { + if (!this->is_idle_ && idle_time > this->timeout_.value()) { + this->is_idle_ = true; + this->trigger(); + } else if (this->is_idle_ && idle_time < this->timeout_.value()) { + this->is_idle_ = false; + } + }); + } + + protected: + TemplatableValue timeout_; + bool is_idle_{}; +}; + +template class LvglAction : public Action, public Parented { + public: + explicit LvglAction(std::function &&lamb) : action_(std::move(lamb)) {} + void play(Ts... x) override { this->action_(this->parent_); } + + protected: + std::function action_{}; +}; + +template class LvglCondition : public Condition, public Parented { + public: + LvglCondition(std::function &&condition_lambda) + : condition_lambda_(std::move(condition_lambda)) {} + bool check(Ts... x) override { return this->condition_lambda_(this->parent_); } + + protected: + std::function condition_lambda_{}; +}; + #ifdef USE_LVGL_TOUCHSCREEN class LVTouchListener : public touchscreen::TouchListener, public Parented { public: @@ -160,7 +248,62 @@ class LVTouchListener : public touchscreen::TouchListener, public Parented { + public: + LVEncoderListener(lv_indev_type_t type, uint16_t lpt, uint16_t lprt) { + lv_indev_drv_init(&this->drv_); + this->drv_.type = type; + this->drv_.user_data = this; + this->drv_.long_press_time = lpt; + this->drv_.long_press_repeat_time = lprt; + this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { + auto *l = static_cast(d->user_data); + data->state = l->pressed_ ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->key = l->key_; + data->enc_diff = (int16_t) (l->count_ - l->last_count_); + l->last_count_ = l->count_; + data->continue_reading = false; + }; + } + + void set_left_button(binary_sensor::BinarySensor *left_button) { + left_button->add_on_state_callback([this](bool state) { this->event(LV_KEY_LEFT, state); }); + } + void set_right_button(binary_sensor::BinarySensor *right_button) { + right_button->add_on_state_callback([this](bool state) { this->event(LV_KEY_RIGHT, state); }); + } + + void set_enter_button(binary_sensor::BinarySensor *enter_button) { + enter_button->add_on_state_callback([this](bool state) { this->event(LV_KEY_ENTER, state); }); + } + + void set_sensor(rotary_encoder::RotaryEncoderSensor *sensor) { + sensor->register_listener([this](int32_t count) { this->set_count(count); }); + } + + void event(int key, bool pressed) { + if (!this->parent_->is_paused()) { + this->pressed_ = pressed; + this->key_ = key; + } + } + + void set_count(int32_t count) { + if (!this->parent_->is_paused()) + this->count_ = count; + } + + lv_indev_drv_t *get_drv() { return &this->drv_; } + + protected: + lv_indev_drv_t drv_{}; + bool pressed_{}; + int32_t count_{}; + int32_t last_count_{}; + int key_{}; +}; +#endif // USE_LVGL_KEY_LISTENER } // namespace lvgl } // namespace esphome - -#endif // USE_LVGL diff --git a/esphome/components/lvgl/obj.py b/esphome/components/lvgl/obj.py index 92c4f63d2d..40d7e55381 100644 --- a/esphome/components/lvgl/obj.py +++ b/esphome/components/lvgl/obj.py @@ -1,5 +1,9 @@ +from esphome import automation + +from .automation import update_to_code from .defines import CONF_MAIN, CONF_OBJ -from .types import WidgetType, lv_obj_t +from .schemas import create_modify_schema +from .types import ObjUpdateAction, WidgetType, lv_obj_t class ObjType(WidgetType): @@ -15,3 +19,10 @@ class ObjType(WidgetType): obj_spec = ObjType() + + +@automation.register_action( + "lvgl.widget.update", ObjUpdateAction, create_modify_schema(obj_spec) +) +async def obj_update_to_code(config, action_id, template_arg, args): + return await update_to_code(config, action_id, template_arg, args) diff --git a/esphome/components/lvgl/rotary_encoders.py b/esphome/components/lvgl/rotary_encoders.py new file mode 100644 index 0000000000..77dc397c3e --- /dev/null +++ b/esphome/components/lvgl/rotary_encoders.py @@ -0,0 +1,62 @@ +import esphome.codegen as cg +from esphome.components.binary_sensor import BinarySensor +from esphome.components.rotary_encoder.sensor import RotaryEncoderSensor +import esphome.config_validation as cv +from esphome.const import CONF_GROUP, CONF_ID, CONF_SENSOR + +from .defines import ( + CONF_ENTER_BUTTON, + CONF_LEFT_BUTTON, + CONF_LONG_PRESS_REPEAT_TIME, + CONF_LONG_PRESS_TIME, + CONF_RIGHT_BUTTON, + CONF_ROTARY_ENCODERS, +) +from .helpers import lvgl_components_required +from .lvcode import add_group, lv, lv_add, lv_expr +from .schemas import ENCODER_SCHEMA +from .types import lv_indev_type_t + +ROTARY_ENCODER_CONFIG = cv.ensure_list( + ENCODER_SCHEMA.extend( + { + cv.Required(CONF_ENTER_BUTTON): cv.use_id(BinarySensor), + cv.Required(CONF_SENSOR): cv.Any( + cv.use_id(RotaryEncoderSensor), + cv.Schema( + { + cv.Required(CONF_LEFT_BUTTON): cv.use_id(BinarySensor), + cv.Required(CONF_RIGHT_BUTTON): cv.use_id(BinarySensor), + } + ), + ), + } + ) +) + + +async def rotary_encoders_to_code(var, config): + for enc_conf in config.get(CONF_ROTARY_ENCODERS, ()): + lvgl_components_required.add("KEY_LISTENER") + lvgl_components_required.add("ROTARY_ENCODER") + lpt = enc_conf[CONF_LONG_PRESS_TIME].total_milliseconds + lprt = enc_conf[CONF_LONG_PRESS_REPEAT_TIME].total_milliseconds + listener = cg.new_Pvariable( + enc_conf[CONF_ID], lv_indev_type_t.LV_INDEV_TYPE_ENCODER, lpt, lprt + ) + await cg.register_parented(listener, var) + if sensor_config := enc_conf.get(CONF_SENSOR): + if isinstance(sensor_config, dict): + b_sensor = await cg.get_variable(sensor_config[CONF_LEFT_BUTTON]) + cg.add(listener.set_left_button(b_sensor)) + b_sensor = await cg.get_variable(sensor_config[CONF_RIGHT_BUTTON]) + cg.add(listener.set_right_button(b_sensor)) + else: + sensor_config = await cg.get_variable(sensor_config) + lv_add(listener.set_sensor(sensor_config)) + b_sensor = await cg.get_variable(enc_conf[CONF_ENTER_BUTTON]) + cg.add(listener.set_enter_button(b_sensor)) + if group := add_group(enc_conf.get(CONF_GROUP)): + lv.indev_set_group(lv_expr.indev_drv_register(listener.get_drv()), group) + else: + lv.indev_drv_register(listener.get_drv()) diff --git a/esphome/components/lvgl/schemas.py b/esphome/components/lvgl/schemas.py index 9f6d984545..ebef56a882 100644 --- a/esphome/components/lvgl/schemas.py +++ b/esphome/components/lvgl/schemas.py @@ -1,10 +1,21 @@ from esphome import config_validation as cv -from esphome.const import CONF_ARGS, CONF_FORMAT, CONF_ID, CONF_STATE, CONF_TYPE +from esphome.automation import Trigger, validate_automation +from esphome.const import ( + CONF_ARGS, + CONF_FORMAT, + CONF_GROUP, + CONF_ID, + CONF_ON_VALUE, + CONF_STATE, + CONF_TRIGGER_ID, + CONF_TYPE, +) +from esphome.core import TimePeriod from esphome.schema_extractors import SCHEMA_EXTRACT from . import defines as df, lv_validation as lvalid, types as ty from .helpers import add_lv_use, requires_component, validate_printf -from .lv_validation import lv_font +from .lv_validation import id_name, lv_font from .types import WIDGET_TYPES, WidgetType # A schema for text properties @@ -27,6 +38,28 @@ TEXT_SCHEMA = cv.Schema( } ) +ACTION_SCHEMA = cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(ty.lv_pseudo_button_t), + }, + key=CONF_ID, +) + +PRESS_TIME = cv.All( + lvalid.lv_milliseconds, cv.Range(max=TimePeriod(milliseconds=65535)) +) + +ENCODER_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.All( + cv.declare_id(ty.LVEncoderListener), requires_component("binary_sensor") + ), + cv.Optional(CONF_GROUP): lvalid.id_name, + cv.Optional(df.CONF_LONG_PRESS_TIME, default="400ms"): PRESS_TIME, + cv.Optional(df.CONF_LONG_PRESS_REPEAT_TIME, default="100ms"): PRESS_TIME, + } +) + # All LVGL styles and their validators STYLE_PROPS = { "align": df.CHILD_ALIGNMENTS.one_of, @@ -43,6 +76,7 @@ STYLE_PROPS = { "bg_image_opa": lvalid.opacity, "bg_image_recolor": lvalid.lv_color, "bg_image_recolor_opa": lvalid.opacity, + "bg_image_src": lvalid.lv_image, "bg_main_stop": lvalid.stop_value, "bg_opa": lvalid.opacity, "border_color": lvalid.lv_color, @@ -151,6 +185,39 @@ def part_schema(widget_type: WidgetType): ) +def automation_schema(typ: ty.LvType): + if typ.has_on_value: + events = df.LV_EVENT_TRIGGERS + (CONF_ON_VALUE,) + else: + events = df.LV_EVENT_TRIGGERS + if isinstance(typ, ty.LvType): + template = Trigger.template(typ.get_arg_type()) + else: + template = Trigger.template() + return { + cv.Optional(event): validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(template), + } + ) + for event in events + } + + +def create_modify_schema(widget_type): + return ( + part_schema(widget_type) + .extend( + { + cv.Required(CONF_ID): cv.use_id(widget_type), + cv.Optional(CONF_STATE): SET_STATE_SCHEMA, + } + ) + .extend(FLAG_SCHEMA) + .extend(widget_type.modify_schema) + ) + + def obj_schema(widget_type: WidgetType): """ Create a schema for a widget type itself i.e. no allowance for children @@ -161,10 +228,12 @@ def obj_schema(widget_type: WidgetType): part_schema(widget_type) .extend(FLAG_SCHEMA) .extend(ALIGN_TO_SCHEMA) + .extend(automation_schema(widget_type.w_type)) .extend( cv.Schema( { cv.Optional(CONF_STATE): SET_STATE_SCHEMA, + cv.Optional(CONF_GROUP): id_name, } ) ) @@ -188,6 +257,13 @@ STYLED_TEXT_SCHEMA = cv.maybe_simple_value( STYLE_SCHEMA.extend(TEXT_SCHEMA), key=df.CONF_TEXT ) +# For use by platform components +LVGL_SCHEMA = cv.Schema( + { + cv.GenerateID(df.CONF_LVGL_ID): cv.use_id(ty.LvglComponent), + } +) + ALL_STYLES = { **STYLE_PROPS, } diff --git a/esphome/components/lvgl/touchscreens.py b/esphome/components/lvgl/touchscreens.py index a0d4a3e4ad..499b33aa02 100644 --- a/esphome/components/lvgl/touchscreens.py +++ b/esphome/components/lvgl/touchscreens.py @@ -2,7 +2,7 @@ import esphome.codegen as cg from esphome.components.touchscreen import CONF_TOUCHSCREEN_ID, Touchscreen import esphome.config_validation as cv from esphome.const import CONF_ID -from esphome.core import CORE, TimePeriod +from esphome.core import CORE from .defines import ( CONF_LONG_PRESS_REPEAT_TIME, @@ -10,11 +10,10 @@ from .defines import ( CONF_TOUCHSCREENS, ) from .helpers import lvgl_components_required -from .lv_validation import lv_milliseconds from .lvcode import lv +from .schemas import PRESS_TIME from .types import LVTouchListener -PRESS_TIME = cv.All(lv_milliseconds, cv.Range(max=TimePeriod(milliseconds=65535))) CONF_TOUCHSCREEN = "touchscreen" TOUCHSCREENS_CONFIG = cv.maybe_simple_value( { diff --git a/esphome/components/lvgl/trigger.py b/esphome/components/lvgl/trigger.py new file mode 100644 index 0000000000..bf92bda5b0 --- /dev/null +++ b/esphome/components/lvgl/trigger.py @@ -0,0 +1,61 @@ +from esphome import automation +import esphome.codegen as cg +from esphome.const import CONF_ID, CONF_ON_VALUE, CONF_TRIGGER_ID + +from .defines import ( + CONF_ALIGN, + CONF_ALIGN_TO, + CONF_X, + CONF_Y, + LV_EVENT, + LV_EVENT_TRIGGERS, + literal, +) +from .lvcode import LambdaContext, add_line_marks, lv, lv_add +from .widget import widget_map + +lv_event_t_ptr = cg.global_ns.namespace("lv_event_t").operator("ptr") + + +async def generate_triggers(lv_component): + """ + Generate LVGL triggers for all defined widgets + Must be done after all widgets completed + :param lv_component: The parent component + :return: + """ + + for w in widget_map.values(): + if w.config: + for event, conf in { + event: conf + for event, conf in w.config.items() + if event in LV_EVENT_TRIGGERS + }.items(): + conf = conf[0] + w.add_flag("LV_OBJ_FLAG_CLICKABLE") + event = "LV_EVENT_" + LV_EVENT[event[3:].upper()] + await add_trigger(conf, event, lv_component, w) + for conf in w.config.get(CONF_ON_VALUE, ()): + await add_trigger(conf, "LV_EVENT_VALUE_CHANGED", lv_component, w) + + # Generate align to directives while we're here + if align_to := w.config.get(CONF_ALIGN_TO): + target = widget_map[align_to[CONF_ID]].obj + align = align_to[CONF_ALIGN] + x = align_to[CONF_X] + y = align_to[CONF_Y] + lv.obj_align_to(w.obj, target, align, x, y) + + +async def add_trigger(conf, event, lv_component, w): + tid = conf[CONF_TRIGGER_ID] + add_line_marks(tid) + trigger = cg.new_Pvariable(tid) + args = w.get_args() + value = w.get_value() + await automation.build_automation(trigger, args, conf) + with LambdaContext([(lv_event_t_ptr, "event_data")]) as context: + add_line_marks(tid) + lv_add(trigger.trigger(value)) + lv_add(lv_component.add_event_cb(w.obj, await context.get_lambda(), literal(event))) diff --git a/esphome/components/lvgl/types.py b/esphome/components/lvgl/types.py index 60291ea54a..6997207dac 100644 --- a/esphome/components/lvgl/types.py +++ b/esphome/components/lvgl/types.py @@ -1,4 +1,4 @@ -from esphome import codegen as cg +from esphome import automation, codegen as cg from esphome.core import ID from esphome.cpp_generator import MockObjClass @@ -23,8 +23,14 @@ lvgl_ns = cg.esphome_ns.namespace("lvgl") char_ptr = cg.global_ns.namespace("char").operator("ptr") void_ptr = cg.void.operator("ptr") LvglComponent = lvgl_ns.class_("LvglComponent", cg.PollingComponent) +LvglComponentPtr = LvglComponent.operator("ptr") lv_event_code_t = cg.global_ns.namespace("lv_event_code_t") +lv_indev_type_t = cg.global_ns.enum("lv_indev_type_t") FontEngine = lvgl_ns.class_("FontEngine") +IdleTrigger = lvgl_ns.class_("IdleTrigger", automation.Trigger.template()) +ObjUpdateAction = lvgl_ns.class_("ObjUpdateAction", automation.Action) +LvglCondition = lvgl_ns.class_("LvglCondition", automation.Condition) +LvglAction = lvgl_ns.class_("LvglAction", automation.Action) LvCompound = lvgl_ns.class_("LvCompound") lv_font_t = cg.global_ns.class_("lv_font_t") lv_style_t = cg.global_ns.struct("lv_style_t") @@ -33,9 +39,11 @@ lv_obj_base_t = cg.global_ns.class_("lv_obj_t", lv_pseudo_button_t) lv_obj_t_ptr = lv_obj_base_t.operator("ptr") lv_disp_t_ptr = cg.global_ns.struct("lv_disp_t").operator("ptr") lv_color_t = cg.global_ns.struct("lv_color_t") +lv_group_t = cg.global_ns.struct("lv_group_t") LVTouchListener = lvgl_ns.class_("LVTouchListener") LVEncoderListener = lvgl_ns.class_("LVEncoderListener") lv_obj_t = LvType("lv_obj_t") +lv_img_t = LvType("lv_img_t") # this will be populated later, in __init__.py to avoid circular imports. @@ -58,7 +66,7 @@ class LvBoolean(LvType): super().__init__( *args, largs=[(cg.bool_, "x")], - lvalue=lambda w: w.is_checked(), + lvalue=lambda w: w.has_state("LV_STATE_CHECKED"), has_on_value=True, **kwargs, ) @@ -83,11 +91,14 @@ class WidgetType: self.name = name self.w_type = w_type self.parts = parts - self.schema = schema or {} - if modify_schema is None: - self.modify_schema = schema + if schema is None: + self.schema = {} else: - self.modify_schema = modify_schema + self.schema = schema + if modify_schema is None: + self.modify_schema = self.schema + else: + self.modify_schema = self.schema @property def animated(self): diff --git a/esphome/components/lvgl/widget.py b/esphome/components/lvgl/widget.py index 4755d8b21d..83aed341e7 100644 --- a/esphome/components/lvgl/widget.py +++ b/esphome/components/lvgl/widget.py @@ -4,9 +4,9 @@ from typing import Any from esphome import codegen as cg, config_validation as cv from esphome.config_validation import Invalid from esphome.const import CONF_GROUP, CONF_ID, CONF_STATE -from esphome.core import ID, TimePeriod +from esphome.core import CORE, TimePeriod from esphome.coroutine import FakeAwaitable -from esphome.cpp_generator import MockObjClass +from esphome.cpp_generator import MockObj, MockObjClass, VariableDeclarationExpression from .defines import ( CONF_DEFAULT, @@ -16,13 +16,15 @@ from .defines import ( OBJ_FLAGS, PARTS, STATES, + ConstantLiteral, LValidator, join_enums, + literal, ) from .helpers import add_lv_use -from .lvcode import ConstantLiteral, add_line_marks, lv, lv_add, lv_assign, lv_obj +from .lvcode import add_group, add_line_marks, lv, lv_add, lv_assign, lv_expr, lv_obj from .schemas import ALL_STYLES, STYLE_REMAP -from .types import WIDGET_TYPES, WidgetType, lv_obj_t +from .types import WIDGET_TYPES, LvType, WidgetType, lv_obj_t, lv_obj_t_ptr EVENT_LAMB = "event_lamb__" @@ -76,17 +78,20 @@ class Widget: return f"{self.var}->obj" return self.var - def add_state(self, *args): - return lv_obj.add_state(self.obj, *args) + def add_state(self, state): + return lv_obj.add_state(self.obj, literal(state)) - def clear_state(self, *args): - return lv_obj.clear_state(self.obj, *args) + def clear_state(self, state): + return lv_obj.clear_state(self.obj, literal(state)) - def add_flag(self, *args): - return lv_obj.add_flag(self.obj, *args) + def has_state(self, state): + return lv_expr.obj_get_state(self.obj) & literal(state) != 0 - def clear_flag(self, *args): - return lv_obj.clear_flag(self.obj, *args) + def add_flag(self, flag): + return lv_obj.add_flag(self.obj, literal(flag)) + + def clear_flag(self, flag): + return lv_obj.clear_flag(self.obj, literal(flag)) def set_property(self, prop, value, animated: bool = None, ltype=None): if isinstance(value, dict): @@ -125,6 +130,16 @@ class Widget: def __str__(self): return f"({self.var}, {self.type})" + def get_args(self): + if isinstance(self.type.w_type, LvType): + return self.type.w_type.args + return [(lv_obj_t_ptr, "obj")] + + def get_value(self): + if isinstance(self.type.w_type, LvType): + return self.type.w_type.value(self) + return self.obj + # Map of widgets to their config, used for trigger generation widget_map: dict[Any, Widget] = {} @@ -146,7 +161,8 @@ def get_widget_generator(wid): yield -async def get_widget(wid: ID) -> Widget: +async def get_widget(config: dict, id: str = CONF_ID) -> Widget: + wid = config[id] if obj := widget_map.get(wid): return obj return await FakeAwaitable(get_widget_generator(wid)) @@ -204,9 +220,10 @@ async def set_obj_properties(w: Widget, config): }.items(): if isinstance(ALL_STYLES[prop], LValidator): value = await ALL_STYLES[prop].process(value) - # Remapping for backwards compatibility of style names prop_r = STYLE_REMAP.get(prop, prop) w.set_style(prop_r, value, lv_state) + if group := add_group(config.get(CONF_GROUP)): + lv.group_add_obj(group, w.obj) flag_clr = set() flag_set = set() props = parts[CONF_MAIN][CONF_DEFAULT] @@ -241,7 +258,7 @@ async def set_obj_properties(w: Widget, config): w.clear_state(clears) for key, value in lambs.items(): lamb = await cg.process_lambda(value, [], return_type=cg.bool_) - state = ConstantLiteral(f"LV_STATE_{key.upper}") + state = f"LV_STATE_{key.upper}" lv.cond_if(lamb) w.add_state(state) lv.cond_else() @@ -281,10 +298,19 @@ async def widget_to_code(w_cnfig, w_type, parent): var = cg.new_Pvariable(wid) lv_add(var.set_obj(creator)) else: - var = cg.Pvariable(wid, cg.nullptr, type_=lv_obj_t) + var = MockObj(wid, "->") + decl = VariableDeclarationExpression(lv_obj_t, "*", wid) + CORE.add_global(decl) + CORE.register_variable(wid, var) lv_assign(var, creator) widget = Widget.create(wid, var, spec, w_cnfig, parent) await set_obj_properties(widget, w_cnfig) await add_widgets(widget, w_cnfig) await spec.to_code(widget, w_cnfig) + + +lv_scr_act_spec = LvScrActType() +lv_scr_act = Widget.create( + None, ConstantLiteral("lv_scr_act()"), lv_scr_act_spec, {}, parent=None +) diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 6ba5b64761..726db24592 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -39,9 +39,12 @@ #define USE_LOCK #define USE_LOGGER #define USE_LVGL +#define USE_LVGL_BINARY_SENSOR #define USE_LVGL_FONT #define USE_LVGL_IMAGE +#define USE_LVGL_KEY_LISTENER #define USE_LVGL_TOUCHSCREEN +#define USE_LVGL_ROTARY_ENCODER #define USE_MDNS #define USE_MEDIA_PLAYER #define USE_MQTT diff --git a/tests/components/lvgl/lvgl-package.yaml b/tests/components/lvgl/lvgl-package.yaml index 696c749876..fde700e0bd 100644 --- a/tests/components/lvgl/lvgl-package.yaml +++ b/tests/components/lvgl/lvgl-package.yaml @@ -7,6 +7,7 @@ lvgl: long_press_time: 500ms widgets: - label: + id: hello_label text: Hello world text_color: 0xFF8000 align: center @@ -95,9 +96,43 @@ lvgl: height: 10% pressed: bg_color: light_blue + checkable: true + checked: + bg_color: 0x000000 widgets: - label: text: Button + on_click: + lvgl.label.update: + id: hello_label + bg_color: 0x123456 + text: clicked + on_value: + logger.log: + format: "state now %d" + args: [x] + on_short_click: + lvgl.widget.hide: hello_label + on_long_press: + lvgl.widget.show: hello_label + on_cancel: + lvgl.widget.enable: hello_label + on_ready: + lvgl.widget.disable: hello_label + on_defocus: + lvgl.widget.hide: hello_label + on_focus: + logger.log: Button clicked + on_scroll: + logger.log: Button clicked + on_scroll_end: + logger.log: Button clicked + on_scroll_begin: + logger.log: Button clicked + on_release: + logger.log: Button clicked + on_long_press_repeat: + logger.log: Button clicked font: - file: "gfonts://Roboto" diff --git a/tests/components/lvgl/test.esp32-idf.yaml b/tests/components/lvgl/test.esp32-idf.yaml index eab75b05f3..0f740db980 100644 --- a/tests/components/lvgl/test.esp32-idf.yaml +++ b/tests/components/lvgl/test.esp32-idf.yaml @@ -6,6 +6,23 @@ i2c: sda: GPIO18 scl: GPIO19 +sensor: + - platform: rotary_encoder + name: "Rotary Encoder" + id: encoder + pin_a: 2 + pin_b: 1 + internal: true + +binary_sensor: + - platform: gpio + id: pushbutton + name: Pushbutton + pin: + number: 0 + inverted: true + ignore_strapping_warning: true + display: - platform: ili9xxx model: st7789v @@ -50,5 +67,9 @@ lvgl: displays: - tft_display - second_display + rotary_encoders: + sensor: encoder + enter_button: pushbutton + group: general <<: !include common.yaml From cb9906b9215f17903ac004af160cc1537998b5a6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 1 Aug 2024 22:38:36 +1200 Subject: [PATCH 080/164] [api] ``homeassistant.action`` replaces ``homeassistant.service`` (#7171) --- esphome/components/api/__init__.py | 130 +++++++++++++-------- esphome/config_validation.py | 10 ++ esphome/const.py | 2 + tests/components/api/common.yaml | 16 +-- tests/components/homeassistant/common.yaml | 8 +- 5 files changed, 103 insertions(+), 63 deletions(-) diff --git a/esphome/components/api/__init__.py b/esphome/components/api/__init__.py index d6b4416af8..38b50d4b9d 100644 --- a/esphome/components/api/__init__.py +++ b/esphome/components/api/__init__.py @@ -1,25 +1,27 @@ import base64 -import esphome.codegen as cg -import esphome.config_validation as cv from esphome import automation from esphome.automation import Condition +import esphome.codegen as cg +import esphome.config_validation as cv from esphome.const import ( + CONF_ACTION, + CONF_ACTIONS, CONF_DATA, CONF_DATA_TEMPLATE, + CONF_EVENT, CONF_ID, CONF_KEY, + CONF_ON_CLIENT_CONNECTED, + CONF_ON_CLIENT_DISCONNECTED, CONF_PASSWORD, CONF_PORT, CONF_REBOOT_TIMEOUT, CONF_SERVICE, - CONF_VARIABLES, CONF_SERVICES, - CONF_TRIGGER_ID, - CONF_EVENT, CONF_TAG, - CONF_ON_CLIENT_CONNECTED, - CONF_ON_CLIENT_DISCONNECTED, + CONF_TRIGGER_ID, + CONF_VARIABLES, ) from esphome.core import coroutine_with_priority @@ -63,40 +65,51 @@ def validate_encryption_key(value): return value -CONFIG_SCHEMA = cv.Schema( +ACTIONS_SCHEMA = automation.validate_automation( { - cv.GenerateID(): cv.declare_id(APIServer), - cv.Optional(CONF_PORT, default=6053): cv.port, - cv.Optional(CONF_PASSWORD, default=""): cv.string_strict, - cv.Optional( - CONF_REBOOT_TIMEOUT, default="15min" - ): cv.positive_time_period_milliseconds, - cv.Optional(CONF_SERVICES): automation.validate_automation( + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(UserServiceTrigger), + cv.Exclusive(CONF_SERVICE, group_of_exclusion=CONF_ACTION): cv.valid_name, + cv.Exclusive(CONF_ACTION, group_of_exclusion=CONF_ACTION): cv.valid_name, + cv.Optional(CONF_VARIABLES, default={}): cv.Schema( { - cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(UserServiceTrigger), - cv.Required(CONF_SERVICE): cv.valid_name, - cv.Optional(CONF_VARIABLES, default={}): cv.Schema( - { - cv.validate_id_name: cv.one_of( - *SERVICE_ARG_NATIVE_TYPES, lower=True - ), - } - ), + cv.validate_id_name: cv.one_of(*SERVICE_ARG_NATIVE_TYPES, lower=True), } ), - cv.Optional(CONF_ENCRYPTION): cv.Schema( - { - cv.Required(CONF_KEY): validate_encryption_key, - } - ), - cv.Optional(CONF_ON_CLIENT_CONNECTED): automation.validate_automation( - single=True - ), - cv.Optional(CONF_ON_CLIENT_DISCONNECTED): automation.validate_automation( - single=True - ), - } -).extend(cv.COMPONENT_SCHEMA) + }, + cv.All( + cv.has_exactly_one_key(CONF_SERVICE, CONF_ACTION), + cv.rename_key(CONF_SERVICE, CONF_ACTION), + ), +) + +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(APIServer), + cv.Optional(CONF_PORT, default=6053): cv.port, + cv.Optional(CONF_PASSWORD, default=""): cv.string_strict, + cv.Optional( + CONF_REBOOT_TIMEOUT, default="15min" + ): cv.positive_time_period_milliseconds, + cv.Exclusive( + CONF_SERVICES, group_of_exclusion=CONF_ACTIONS + ): ACTIONS_SCHEMA, + cv.Exclusive(CONF_ACTIONS, group_of_exclusion=CONF_ACTIONS): ACTIONS_SCHEMA, + cv.Optional(CONF_ENCRYPTION): cv.Schema( + { + cv.Required(CONF_KEY): validate_encryption_key, + } + ), + cv.Optional(CONF_ON_CLIENT_CONNECTED): automation.validate_automation( + single=True + ), + cv.Optional(CONF_ON_CLIENT_DISCONNECTED): automation.validate_automation( + single=True + ), + } + ).extend(cv.COMPONENT_SCHEMA), + cv.rename_key(CONF_SERVICES, CONF_ACTIONS), +) @coroutine_with_priority(40.0) @@ -108,7 +121,7 @@ async def to_code(config): cg.add(var.set_password(config[CONF_PASSWORD])) cg.add(var.set_reboot_timeout(config[CONF_REBOOT_TIMEOUT])) - for conf in config.get(CONF_SERVICES, []): + for conf in config.get(CONF_ACTIONS, []): template_args = [] func_args = [] service_arg_names = [] @@ -119,7 +132,7 @@ async def to_code(config): service_arg_names.append(name) templ = cg.TemplateArguments(*template_args) trigger = cg.new_Pvariable( - conf[CONF_TRIGGER_ID], templ, conf[CONF_SERVICE], service_arg_names + conf[CONF_TRIGGER_ID], templ, conf[CONF_ACTION], service_arg_names ) cg.add(var.register_user_service(trigger)) await automation.build_automation(trigger, func_args, conf) @@ -152,28 +165,43 @@ async def to_code(config): KEY_VALUE_SCHEMA = cv.Schema({cv.string: cv.templatable(cv.string_strict)}) -HOMEASSISTANT_SERVICE_ACTION_SCHEMA = cv.Schema( - { - cv.GenerateID(): cv.use_id(APIServer), - cv.Required(CONF_SERVICE): cv.templatable(cv.string), - cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA, - cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA, - cv.Optional(CONF_VARIABLES, default={}): cv.Schema( - {cv.string: cv.returning_lambda} - ), - } + +HOMEASSISTANT_ACTION_ACTION_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): cv.use_id(APIServer), + cv.Exclusive(CONF_SERVICE, group_of_exclusion=CONF_ACTION): cv.templatable( + cv.string + ), + cv.Exclusive(CONF_ACTION, group_of_exclusion=CONF_ACTION): cv.templatable( + cv.string + ), + cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA, + cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA, + cv.Optional(CONF_VARIABLES, default={}): cv.Schema( + {cv.string: cv.returning_lambda} + ), + } + ), + cv.has_exactly_one_key(CONF_SERVICE, CONF_ACTION), + cv.rename_key(CONF_SERVICE, CONF_ACTION), ) +@automation.register_action( + "homeassistant.action", + HomeAssistantServiceCallAction, + HOMEASSISTANT_ACTION_ACTION_SCHEMA, +) @automation.register_action( "homeassistant.service", HomeAssistantServiceCallAction, - HOMEASSISTANT_SERVICE_ACTION_SCHEMA, + HOMEASSISTANT_ACTION_ACTION_SCHEMA, ) async def homeassistant_service_to_code(config, action_id, template_arg, args): serv = await cg.get_variable(config[CONF_ID]) var = cg.new_Pvariable(action_id, template_arg, serv, False) - templ = await cg.templatable(config[CONF_SERVICE], args, None) + templ = await cg.templatable(config[CONF_ACTION], args, None) cg.add(var.set_service(templ)) for key, value in config[CONF_DATA].items(): templ = await cg.templatable(value, args, None) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 1cd1d6aa31..d93f8aed9a 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -2181,3 +2181,13 @@ SOURCE_SCHEMA = Any( } ), ) + + +def rename_key(old_key, new_key): + def validator(config: dict) -> dict: + config = config.copy() + if old_key in config: + config[new_key] = config.pop(old_key) + return config + + return validator diff --git a/esphome/const.py b/esphome/const.py index 37844e1047..39dd48d3f8 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -37,8 +37,10 @@ CONF_ACCELERATION_Y = "acceleration_y" CONF_ACCELERATION_Z = "acceleration_z" CONF_ACCURACY = "accuracy" CONF_ACCURACY_DECIMALS = "accuracy_decimals" +CONF_ACTION = "action" CONF_ACTION_ID = "action_id" CONF_ACTION_STATE_TOPIC = "action_state_topic" +CONF_ACTIONS = "actions" CONF_ACTIVE = "active" CONF_ACTIVE_POWER = "active_power" CONF_ACTUAL_GAIN = "actual_gain" diff --git a/tests/components/api/common.yaml b/tests/components/api/common.yaml index e0b900f92d..6c2a333598 100644 --- a/tests/components/api/common.yaml +++ b/tests/components/api/common.yaml @@ -5,8 +5,8 @@ esphome: event: esphome.button_pressed data: message: Button was pressed - - homeassistant.service: - service: notify.html5 + - homeassistant.action: + action: notify.html5 data: message: Button was pressed - homeassistant.tag_scanned: pulse @@ -21,8 +21,8 @@ api: reboot_timeout: 0min encryption: key: bOFFzzvfpg5DB94DuBGLXD/hMnhpDKgP9UQyBulwWVU= - services: - - service: hello_world + actions: + - action: hello_world variables: name: string then: @@ -30,10 +30,10 @@ api: format: Hello World %s! args: - name.c_str() - - service: empty_service + - action: empty_action then: - - logger.log: Service Called - - service: all_types + - logger.log: Action Called + - action: all_types variables: bool_: bool int_: int @@ -41,7 +41,7 @@ api: string_: string then: - logger.log: Something happened - - service: array_types + - action: array_types variables: bool_arr: bool[] int_arr: int[] diff --git a/tests/components/homeassistant/common.yaml b/tests/components/homeassistant/common.yaml index ae016a3bea..07a6e8090c 100644 --- a/tests/components/homeassistant/common.yaml +++ b/tests/components/homeassistant/common.yaml @@ -13,12 +13,12 @@ esphome: message: The humidity is {{ my_variable }}%. variables: my_variable: "return id(ha_hello_world_temperature).state;" - - homeassistant.service: - service: notify.html5 + - homeassistant.action: + action: notify.html5 data: message: Button was pressed - - homeassistant.service: - service: notify.html5 + - homeassistant.action: + action: notify.html5 data: title: New Humidity data_template: From a5f18dfe7fda26d0311cfeb2fde42d0bf528f576 Mon Sep 17 00:00:00 2001 From: SimoPk Date: Thu, 1 Aug 2024 12:39:54 +0200 Subject: [PATCH 081/164] ade7953_spi wrong size specified in read_array call (#7172) --- esphome/components/ade7953_spi/ade7953_spi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/ade7953_spi/ade7953_spi.cpp b/esphome/components/ade7953_spi/ade7953_spi.cpp index cfd5d71d0a..77a2a8adc7 100644 --- a/esphome/components/ade7953_spi/ade7953_spi.cpp +++ b/esphome/components/ade7953_spi/ade7953_spi.cpp @@ -60,7 +60,7 @@ bool AdE7953Spi::ade_read_16(uint16_t reg, uint16_t *value) { this->write_byte16(reg); this->transfer_byte(0x80); uint8_t recv[2]; - this->read_array(recv, 4); + this->read_array(recv, 2); *value = encode_uint16(recv[0], recv[1]); this->disable(); return false; From aedfb32482cf11feaa6373b73cc8ce8a2da50658 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:01:21 +1200 Subject: [PATCH 082/164] Bump improv library to 1.2.4 (#7174) --- esphome/components/improv_base/__init__.py | 5 ++--- platformio.ini | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/esphome/components/improv_base/__init__.py b/esphome/components/improv_base/__init__.py index 5c2853a5c6..aa75f4d89c 100644 --- a/esphome/components/improv_base/__init__.py +++ b/esphome/components/improv_base/__init__.py @@ -1,8 +1,7 @@ import re -import esphome.config_validation as cv import esphome.codegen as cg - +import esphome.config_validation as cv from esphome.const import __version__ CODEOWNERS = ["@esphome/core"] @@ -39,4 +38,4 @@ def _process_next_url(url: str): async def setup_improv_core(var, config): if CONF_NEXT_URL in config: cg.add(var.set_next_url(_process_next_url(config[CONF_NEXT_URL]))) - cg.add_library("esphome/Improv", "1.2.3") + cg.add_library("improv/Improv", "1.2.4") diff --git a/platformio.ini b/platformio.ini index baf0a85d73..e4f363d650 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,7 +35,7 @@ build_flags = lib_deps = esphome/noise-c@0.1.4 ; api makuna/NeoPixelBus@2.7.3 ; neopixelbus - esphome/Improv@1.2.3 ; improv_serial / esp32_improv + improv/Improv@1.2.4 ; improv_serial / esp32_improv bblanchon/ArduinoJson@6.18.5 ; json wjtje/qr-code-generator-library@1.7.0 ; qr_code functionpointer/arduino-MLX90393@1.0.0 ; mlx90393 From 4a7570770b0b36cfc2495ad3795d4ae3c7df66bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ebbinghaus?= Date: Fri, 2 Aug 2024 01:58:59 +0200 Subject: [PATCH 083/164] Implement 'round to nearest multiple' filter (#7142) --- esphome/components/sensor/__init__.py | 19 +++++++++++++++++++ esphome/components/sensor/filter.cpp | 8 ++++++++ esphome/components/sensor/filter.h | 9 +++++++++ esphome/config_validation.py | 1 + esphome/const.py | 1 + 5 files changed, 38 insertions(+) diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index 262e69d75b..3b76466dec 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -17,6 +17,7 @@ from esphome.const import ( CONF_ICON, CONF_ID, CONF_IGNORE_OUT_OF_RANGE, + CONF_MULTIPLE, CONF_ON_RAW_VALUE, CONF_ON_VALUE, CONF_ON_VALUE_RANGE, @@ -249,6 +250,7 @@ CalibratePolynomialFilter = sensor_ns.class_("CalibratePolynomialFilter", Filter SensorInRangeCondition = sensor_ns.class_("SensorInRangeCondition", Filter) ClampFilter = sensor_ns.class_("ClampFilter", Filter) RoundFilter = sensor_ns.class_("RoundFilter", Filter) +RoundMultipleFilter = sensor_ns.class_("RoundMultipleFilter", Filter) validate_unit_of_measurement = cv.string_strict validate_accuracy_decimals = cv.int_ @@ -734,6 +736,23 @@ async def round_filter_to_code(config, filter_id): ) +@FILTER_REGISTRY.register( + "round_to_multiple_of", + RoundMultipleFilter, + cv.maybe_simple_value( + { + cv.Required(CONF_MULTIPLE): cv.positive_not_null_float, + }, + key=CONF_MULTIPLE, + ), +) +async def round_multiple_filter_to_code(config, filter_id): + return cg.new_Pvariable( + filter_id, + config[CONF_MULTIPLE], + ) + + async def build_filters(config): return await cg.build_registry_list(FILTER_REGISTRY, config) diff --git a/esphome/components/sensor/filter.cpp b/esphome/components/sensor/filter.cpp index eaa909429b..bcf1fc8269 100644 --- a/esphome/components/sensor/filter.cpp +++ b/esphome/components/sensor/filter.cpp @@ -472,5 +472,13 @@ optional RoundFilter::new_value(float value) { return value; } +RoundMultipleFilter::RoundMultipleFilter(float multiple) : multiple_(multiple) {} +optional RoundMultipleFilter::new_value(float value) { + if (std::isfinite(value)) { + return value - remainderf(value, this->multiple_); + } + return value; +} + } // namespace sensor } // namespace esphome diff --git a/esphome/components/sensor/filter.h b/esphome/components/sensor/filter.h index c13cb3420a..92b1d8d240 100644 --- a/esphome/components/sensor/filter.h +++ b/esphome/components/sensor/filter.h @@ -431,5 +431,14 @@ class RoundFilter : public Filter { uint8_t precision_; }; +class RoundMultipleFilter : public Filter { + public: + explicit RoundMultipleFilter(float multiple); + optional new_value(float value) override; + + protected: + float multiple_; +}; + } // namespace sensor } // namespace esphome diff --git a/esphome/config_validation.py b/esphome/config_validation.py index d93f8aed9a..6e1d3ba2f9 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -464,6 +464,7 @@ zero_to_one_float = float_range(min=0, max=1) negative_one_to_one_float = float_range(min=-1, max=1) positive_int = int_range(min=0) positive_not_null_int = int_range(min=0, min_included=False) +positive_not_null_float = float_range(min=0, min_included=False) def validate_id_name(value): diff --git a/esphome/const.py b/esphome/const.py index 39dd48d3f8..fcb630badd 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -503,6 +503,7 @@ CONF_MOTION = "motion" CONF_MOVEMENT_COUNTER = "movement_counter" CONF_MQTT = "mqtt" CONF_MQTT_ID = "mqtt_id" +CONF_MULTIPLE = "multiple" CONF_MULTIPLEXER = "multiplexer" CONF_MULTIPLY = "multiply" CONF_NAME = "name" From 61c65811233eb1b678fcfa077d6370e7f07ba091 Mon Sep 17 00:00:00 2001 From: Olivier ARCHER Date: Sat, 3 Aug 2024 01:00:18 +0200 Subject: [PATCH 084/164] git ignore managed_components (#7180) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0c9a878400..79820249ac 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,5 @@ sdkconfig.* .tests/ /components +/managed_components + From 81ac9391d1af48bc02b4df9886954474c1fd7d01 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Mon, 5 Aug 2024 12:04:06 +1000 Subject: [PATCH 085/164] [core] Eliminate nuisance messages from `build_codeowners` (#7185) --- esphome/loader.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/esphome/loader.py b/esphome/loader.py index 9399c4cb31..d808805119 100644 --- a/esphome/loader.py +++ b/esphome/loader.py @@ -1,3 +1,4 @@ +from contextlib import AbstractContextManager from dataclasses import dataclass import importlib import importlib.abc @@ -7,7 +8,7 @@ import logging from pathlib import Path import sys from types import ModuleType -from typing import Any, Callable, ContextManager, Optional +from typing import Any, Callable, Optional from esphome.const import SOURCE_FILE_EXTENSIONS from esphome.core import CORE @@ -22,7 +23,7 @@ class FileResource: package: str resource: str - def path(self) -> ContextManager[Path]: + def path(self) -> AbstractContextManager[Path]: return importlib.resources.as_file( importlib.resources.files(self.package) / self.resource ) @@ -176,7 +177,7 @@ def _lookup_module(domain): module = importlib.import_module(f"esphome.components.{domain}") except ImportError as e: if "No module named" in str(e): - _LOGGER.error( + _LOGGER.info( "Unable to import component %s: %s", domain, str(e), exc_info=False ) else: From 38c25dec93b17ede8999f0cc6f295ba4a730ab6d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:15:19 +1200 Subject: [PATCH 086/164] [code-quality] More portable shebangs (#7189) Co-authored-by: Keith Burzinski --- docker/docker_entrypoint.sh | 2 +- script/devcontainer-post-create | 2 +- script/quicklint | 2 +- script/setup | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/docker_entrypoint.sh b/docker/docker_entrypoint.sh index 397b1528c5..1b9224244c 100755 --- a/docker/docker_entrypoint.sh +++ b/docker/docker_entrypoint.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # If /cache is mounted, use that as PIO's coredir # otherwise use path in /config (so that PIO packages aren't downloaded on each compile) diff --git a/script/devcontainer-post-create b/script/devcontainer-post-create index 272d350519..2d376786ac 100755 --- a/script/devcontainer-post-create +++ b/script/devcontainer-post-create @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # set -x diff --git a/script/quicklint b/script/quicklint index a4fae98195..84e4c97667 100755 --- a/script/quicklint +++ b/script/quicklint @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/script/setup b/script/setup index aeb1b39bc1..824840c392 100755 --- a/script/setup +++ b/script/setup @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Set up ESPHome dev environment set -e From 87944f0c1b5df3019407bc20f0f0c29f8cf13033 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:58:20 +1200 Subject: [PATCH 087/164] Add support for doing update entity refresh/check via API. (#7190) --- esphome/components/api/api.proto | 7 +++++- esphome/components/api/api_connection.cpp | 12 +++++++++- esphome/components/api/api_pb2.cpp | 22 +++++++++++++++---- esphome/components/api/api_pb2.h | 7 +++++- .../http_request/update/http_request_update.h | 1 + esphome/components/update/update_entity.h | 2 +- 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index 812a1d74ae..b62fddf815 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -1872,6 +1872,11 @@ message UpdateStateResponse { string release_summary = 9; string release_url = 10; } +enum UpdateCommand { + UPDATE_COMMAND_NONE = 0; + UPDATE_COMMAND_UPDATE = 1; + UPDATE_COMMAND_CHECK = 2; +} message UpdateCommandRequest { option (id) = 118; option (source) = SOURCE_CLIENT; @@ -1879,5 +1884,5 @@ message UpdateCommandRequest { option (no_delay) = true; fixed32 key = 1; - bool install = 2; + UpdateCommand command = 2; } diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 2e73a8336e..81fa4cb339 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1328,7 +1328,17 @@ void APIConnection::update_command(const UpdateCommandRequest &msg) { if (update == nullptr) return; - update->perform(); + switch (msg.command) { + case enums::UPDATE_COMMAND_UPDATE: + update->perform(); + break; + case enums::UPDATE_COMMAND_CHECK: + update->check(); + break; + default: + ESP_LOGW(TAG, "Unknown update command: %d", msg.command); + break; + } } #endif diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp index e6e905c6d1..a57627a66c 100644 --- a/esphome/components/api/api_pb2.cpp +++ b/esphome/components/api/api_pb2.cpp @@ -567,6 +567,20 @@ template<> const char *proto_enum_to_string(enums::ValveO } } #endif +#ifdef HAS_PROTO_MESSAGE_DUMP +template<> const char *proto_enum_to_string(enums::UpdateCommand value) { + switch (value) { + case enums::UPDATE_COMMAND_NONE: + return "UPDATE_COMMAND_NONE"; + case enums::UPDATE_COMMAND_UPDATE: + return "UPDATE_COMMAND_UPDATE"; + case enums::UPDATE_COMMAND_CHECK: + return "UPDATE_COMMAND_CHECK"; + default: + return "UNKNOWN"; + } +} +#endif bool HelloRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { switch (field_id) { case 2: { @@ -8596,7 +8610,7 @@ void UpdateStateResponse::dump_to(std::string &out) const { bool UpdateCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { switch (field_id) { case 2: { - this->install = value.as_bool(); + this->command = value.as_enum(); return true; } default: @@ -8615,7 +8629,7 @@ bool UpdateCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) { } void UpdateCommandRequest::encode(ProtoWriteBuffer buffer) const { buffer.encode_fixed32(1, this->key); - buffer.encode_bool(2, this->install); + buffer.encode_enum(2, this->command); } #ifdef HAS_PROTO_MESSAGE_DUMP void UpdateCommandRequest::dump_to(std::string &out) const { @@ -8626,8 +8640,8 @@ void UpdateCommandRequest::dump_to(std::string &out) const { out.append(buffer); out.append("\n"); - out.append(" install: "); - out.append(YESNO(this->install)); + out.append(" command: "); + out.append(proto_enum_to_string(this->command)); out.append("\n"); out.append("}"); } diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index ef051eecf1..bb5263cffa 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -227,6 +227,11 @@ enum ValveOperation : uint32_t { VALVE_OPERATION_IS_OPENING = 1, VALVE_OPERATION_IS_CLOSING = 2, }; +enum UpdateCommand : uint32_t { + UPDATE_COMMAND_NONE = 0, + UPDATE_COMMAND_UPDATE = 1, + UPDATE_COMMAND_CHECK = 2, +}; } // namespace enums @@ -2175,7 +2180,7 @@ class UpdateStateResponse : public ProtoMessage { class UpdateCommandRequest : public ProtoMessage { public: uint32_t key{0}; - bool install{false}; + enums::UpdateCommand command{}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h index 943231a906..45c7e6a447 100644 --- a/esphome/components/http_request/update/http_request_update.h +++ b/esphome/components/http_request/update/http_request_update.h @@ -16,6 +16,7 @@ class HttpRequestUpdate : public update::UpdateEntity, public PollingComponent { void update() override; void perform(bool force) override; + void check() override { this->update(); } void set_source_url(const std::string &source_url) { this->source_url_ = source_url; } diff --git a/esphome/components/update/update_entity.h b/esphome/components/update/update_entity.h index 568fbe3bb0..cc269e288f 100644 --- a/esphome/components/update/update_entity.h +++ b/esphome/components/update/update_entity.h @@ -33,8 +33,8 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass { void publish_state(); void perform() { this->perform(false); } - virtual void perform(bool force) = 0; + virtual void check() = 0; const UpdateInfo &update_info = update_info_; const UpdateState &state = state_; From d18bb34f87758cff3d1a6d881b1b167d1d6f79a1 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:07:05 +1000 Subject: [PATCH 088/164] [lvgl] Stage 4 (#7166) --- esphome/components/lvgl/__init__.py | 110 +++++-- esphome/components/lvgl/animimg.py | 117 +++++++ esphome/components/lvgl/arc.py | 78 +++++ esphome/components/lvgl/automation.py | 186 ++++++----- esphome/components/lvgl/btn.py | 11 +- esphome/components/lvgl/checkbox.py | 25 ++ esphome/components/lvgl/defines.py | 64 ++-- esphome/components/lvgl/helpers.py | 20 -- esphome/components/lvgl/img.py | 85 +++++ esphome/components/lvgl/label.py | 9 +- esphome/components/lvgl/led.py | 29 ++ esphome/components/lvgl/line.py | 51 +++ esphome/components/lvgl/lv_bar.py | 53 ++++ esphome/components/lvgl/lv_switch.py | 20 ++ esphome/components/lvgl/lv_validation.py | 60 +++- esphome/components/lvgl/lvcode.py | 236 +++++++++----- esphome/components/lvgl/lvgl_esphome.cpp | 202 ++++++++++++ esphome/components/lvgl/lvgl_esphome.h | 164 ++++------ esphome/components/lvgl/page.py | 113 +++++++ esphome/components/lvgl/rotary_encoders.py | 3 +- esphome/components/lvgl/schemas.py | 105 ++++++- esphome/components/lvgl/slider.py | 63 ++++ esphome/components/lvgl/spinner.py | 43 +++ esphome/components/lvgl/styles.py | 58 ++++ esphome/components/lvgl/trigger.py | 22 +- esphome/components/lvgl/types.py | 92 ++++-- esphome/components/lvgl/widget.py | 219 +++++++++---- tests/components/lvgl/lvgl-package.yaml | 343 +++++++++++++-------- 28 files changed, 2002 insertions(+), 579 deletions(-) create mode 100644 esphome/components/lvgl/animimg.py create mode 100644 esphome/components/lvgl/arc.py create mode 100644 esphome/components/lvgl/checkbox.py create mode 100644 esphome/components/lvgl/img.py create mode 100644 esphome/components/lvgl/led.py create mode 100644 esphome/components/lvgl/line.py create mode 100644 esphome/components/lvgl/lv_bar.py create mode 100644 esphome/components/lvgl/lv_switch.py create mode 100644 esphome/components/lvgl/page.py create mode 100644 esphome/components/lvgl/slider.py create mode 100644 esphome/components/lvgl/spinner.py create mode 100644 esphome/components/lvgl/styles.py diff --git a/esphome/components/lvgl/__init__.py b/esphome/components/lvgl/__init__.py index 182d04e038..c154689199 100644 --- a/esphome/components/lvgl/__init__.py +++ b/esphome/components/lvgl/__init__.py @@ -15,44 +15,91 @@ from esphome.const import ( CONF_TRIGGER_ID, CONF_TYPE, ) -from esphome.core import CORE, ID, Lambda +from esphome.core import CORE, ID from esphome.cpp_generator import MockObj from esphome.final_validate import full_config from esphome.helpers import write_file_if_changed from . import defines as df, helpers, lv_validation as lvalid -from .automation import update_to_code +from .animimg import animimg_spec +from .arc import arc_spec +from .automation import disp_update, update_to_code from .btn import btn_spec +from .checkbox import checkbox_spec +from .defines import CONF_SKIP +from .img import img_spec from .label import label_spec -from .lv_validation import lv_images_used -from .lvcode import LvContext +from .led import led_spec +from .line import line_spec +from .lv_bar import bar_spec +from .lv_switch import switch_spec +from .lv_validation import lv_bool, lv_images_used +from .lvcode import LvContext, LvglComponent from .obj import obj_spec +from .page import add_pages, page_spec from .rotary_encoders import ROTARY_ENCODER_CONFIG, rotary_encoders_to_code -from .schemas import any_widget_schema, create_modify_schema, obj_schema +from .schemas import ( + DISP_BG_SCHEMA, + FLEX_OBJ_SCHEMA, + GRID_CELL_SCHEMA, + LAYOUT_SCHEMAS, + STYLE_SCHEMA, + WIDGET_TYPES, + any_widget_schema, + container_schema, + create_modify_schema, + grid_alignments, + obj_schema, +) +from .slider import slider_spec +from .spinner import spinner_spec +from .styles import add_top_layer, styles_to_code, theme_to_code from .touchscreens import touchscreen_schema, touchscreens_to_code from .trigger import generate_triggers from .types import ( - WIDGET_TYPES, FontEngine, IdleTrigger, - LvglComponent, ObjUpdateAction, lv_font_t, + lv_style_t, lvgl_ns, ) from .widget import Widget, add_widgets, lv_scr_act, set_obj_properties DOMAIN = "lvgl" -DEPENDENCIES = ("display",) -AUTO_LOAD = ("key_provider",) -CODEOWNERS = ("@clydebarrow",) +DEPENDENCIES = ["display"] +AUTO_LOAD = ["key_provider"] +CODEOWNERS = ["@clydebarrow"] LOGGER = logging.getLogger(__name__) -for w_type in (label_spec, obj_spec, btn_spec): +for w_type in ( + label_spec, + obj_spec, + btn_spec, + bar_spec, + slider_spec, + arc_spec, + line_spec, + spinner_spec, + led_spec, + animimg_spec, + checkbox_spec, + img_spec, + switch_spec, +): WIDGET_TYPES[w_type.name] = w_type WIDGET_SCHEMA = any_widget_schema() +LAYOUT_SCHEMAS[df.TYPE_GRID] = { + cv.Optional(df.CONF_WIDGETS): cv.ensure_list(any_widget_schema(GRID_CELL_SCHEMA)) +} +LAYOUT_SCHEMAS[df.TYPE_FLEX] = { + cv.Optional(df.CONF_WIDGETS): cv.ensure_list(any_widget_schema(FLEX_OBJ_SCHEMA)) +} +LAYOUT_SCHEMAS[df.TYPE_NONE] = { + cv.Optional(df.CONF_WIDGETS): cv.ensure_list(any_widget_schema()) +} for w_type in WIDGET_TYPES.values(): register_action( f"lvgl.{w_type.name}.update", @@ -61,14 +108,6 @@ for w_type in WIDGET_TYPES.values(): )(update_to_code) -async def add_init_lambda(lv_component, init): - if init: - lamb = await cg.process_lambda( - Lambda(init), [(LvglComponent.operator("ptr"), "lv_component")] - ) - cg.add(lv_component.add_init_lambda(lamb)) - - lv_defines = {} # Dict of #defines to provide as build flags @@ -100,6 +139,9 @@ def generate_lv_conf_h(): def final_validation(config): + if pages := config.get(CONF_PAGES): + if all(p[CONF_SKIP] for p in pages): + raise cv.Invalid("At least one page must not be skipped") global_config = full_config.get() for display_id in config[df.CONF_DISPLAYS]: path = global_config.get_path_for_id(display_id)[:-1] @@ -193,18 +235,23 @@ async def to_code(config): else: add_define("LV_FONT_DEFAULT", await lvalid.lv_font.process(default_font)) - with LvContext(): + async with LvContext(lv_component): await touchscreens_to_code(lv_component, config) await rotary_encoders_to_code(lv_component, config) + await theme_to_code(config) + await styles_to_code(config) await set_obj_properties(lv_scr_act, config) await add_widgets(lv_scr_act, config) + await add_pages(lv_component, config) + await add_top_layer(config) + await disp_update(f"{lv_component}->get_disp()", config) Widget.set_completed() await generate_triggers(lv_component) for conf in config.get(CONF_ON_IDLE, ()): templ = await cg.templatable(conf[CONF_TIMEOUT], [], cg.uint32) idle_trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], lv_component, templ) await build_automation(idle_trigger, [], conf) - await add_init_lambda(lv_component, LvContext.get_code()) + for comp in helpers.lvgl_components_required: CORE.add_define(f"USE_LVGL_{comp.upper()}") for use in helpers.lv_uses: @@ -239,6 +286,16 @@ CONFIG_SCHEMA = ( cv.Optional(df.CONF_BYTE_ORDER, default="big_endian"): cv.one_of( "big_endian", "little_endian" ), + cv.Optional(df.CONF_STYLE_DEFINITIONS): cv.ensure_list( + cv.Schema({cv.Required(CONF_ID): cv.declare_id(lv_style_t)}) + .extend(STYLE_SCHEMA) + .extend( + { + cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments, + cv.Optional(df.CONF_GRID_CELL_Y_ALIGN): grid_alignments, + } + ) + ), cv.Optional(CONF_ON_IDLE): validate_automation( { cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(IdleTrigger), @@ -247,10 +304,19 @@ CONFIG_SCHEMA = ( ), } ), - cv.Optional(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA), + cv.Exclusive(df.CONF_WIDGETS, CONF_PAGES): cv.ensure_list(WIDGET_SCHEMA), + cv.Exclusive(CONF_PAGES, CONF_PAGES): cv.ensure_list( + container_schema(page_spec) + ), + cv.Optional(df.CONF_PAGE_WRAP, default=True): lv_bool, + cv.Optional(df.CONF_TOP_LAYER): container_schema(obj_spec), cv.Optional(df.CONF_TRANSPARENCY_KEY, default=0x000400): lvalid.lv_color, + cv.Optional(df.CONF_THEME): cv.Schema( + {cv.Optional(name): obj_schema(w) for name, w in WIDGET_TYPES.items()} + ), cv.GenerateID(df.CONF_TOUCHSCREENS): touchscreen_schema, cv.GenerateID(df.CONF_ROTARY_ENCODERS): ROTARY_ENCODER_CONFIG, } ) + .extend(DISP_BG_SCHEMA) ).add_extra(cv.has_at_least_one_key(CONF_PAGES, df.CONF_WIDGETS)) diff --git a/esphome/components/lvgl/animimg.py b/esphome/components/lvgl/animimg.py new file mode 100644 index 0000000000..20b85b019c --- /dev/null +++ b/esphome/components/lvgl/animimg.py @@ -0,0 +1,117 @@ +from esphome import automation +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_DURATION, CONF_ID + +from ...cpp_generator import MockObj +from .automation import action_to_code +from .defines import CONF_AUTO_START, CONF_MAIN, CONF_REPEAT_COUNT, CONF_SRC +from .helpers import lvgl_components_required +from .img import CONF_IMAGE +from .label import CONF_LABEL +from .lv_validation import lv_image, lv_milliseconds +from .lvcode import lv, lv_expr +from .types import LvType, ObjUpdateAction, void_ptr +from .widget import Widget, WidgetType, get_widgets + +CONF_ANIMIMG = "animimg" +CONF_SRC_LIST_ID = "src_list_id" + + +def lv_repeat_count(value): + if isinstance(value, str) and value.lower() in ("forever", "infinite"): + value = 0xFFFF + return cv.int_range(min=0, max=0xFFFF)(value) + + +ANIMIMG_BASE_SCHEMA = cv.Schema( + { + cv.Optional(CONF_REPEAT_COUNT, default="forever"): lv_repeat_count, + cv.Optional(CONF_AUTO_START, default=True): cv.boolean, + } +) +ANIMIMG_SCHEMA = ANIMIMG_BASE_SCHEMA.extend( + { + cv.Required(CONF_DURATION): lv_milliseconds, + cv.Required(CONF_SRC): cv.ensure_list(lv_image), + cv.GenerateID(CONF_SRC_LIST_ID): cv.declare_id(void_ptr), + } +) + +ANIMIMG_MODIFY_SCHEMA = ANIMIMG_BASE_SCHEMA.extend( + { + cv.Optional(CONF_DURATION): lv_milliseconds, + } +) + +lv_animimg_t = LvType("lv_animimg_t") + + +class AnimimgType(WidgetType): + def __init__(self): + super().__init__( + CONF_ANIMIMG, + lv_animimg_t, + (CONF_MAIN,), + ANIMIMG_SCHEMA, + ANIMIMG_MODIFY_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + lvgl_components_required.add(CONF_IMAGE) + lvgl_components_required.add(CONF_ANIMIMG) + if CONF_SRC in config: + for x in config[CONF_SRC]: + await cg.get_variable(x) + srcs = [lv_expr.img_from(MockObj(x)) for x in config[CONF_SRC]] + src_id = cg.static_const_array(config[CONF_SRC_LIST_ID], srcs) + count = len(config[CONF_SRC]) + lv.animimg_set_src(w.obj, src_id, count) + lv.animimg_set_repeat_count(w.obj, config[CONF_REPEAT_COUNT]) + lv.animimg_set_duration(w.obj, config[CONF_DURATION]) + if config.get(CONF_AUTO_START): + lv.animimg_start(w.obj) + + def get_uses(self): + return CONF_IMAGE, CONF_LABEL + + +animimg_spec = AnimimgType() + + +@automation.register_action( + "lvgl.animimg.start", + ObjUpdateAction, + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(lv_animimg_t), + }, + key=CONF_ID, + ), +) +async def animimg_start(config, action_id, template_arg, args): + widget = await get_widgets(config) + + async def do_start(w: Widget): + lv.animimg_start(w.obj) + + return await action_to_code(widget, do_start, action_id, template_arg, args) + + +@automation.register_action( + "lvgl.animimg.stop", + ObjUpdateAction, + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(lv_animimg_t), + }, + key=CONF_ID, + ), +) +async def animimg_stop(config, action_id, template_arg, args): + widget = await get_widgets(config) + + async def do_stop(w: Widget): + lv.animimg_stop(w.obj) + + return await action_to_code(widget, do_stop, action_id, template_arg, args) diff --git a/esphome/components/lvgl/arc.py b/esphome/components/lvgl/arc.py new file mode 100644 index 0000000000..d036464c7a --- /dev/null +++ b/esphome/components/lvgl/arc.py @@ -0,0 +1,78 @@ +import esphome.config_validation as cv +from esphome.const import ( + CONF_MAX_VALUE, + CONF_MIN_VALUE, + CONF_MODE, + CONF_ROTATION, + CONF_VALUE, +) +from esphome.cpp_types import nullptr + +from .defines import ( + ARC_MODES, + CONF_ADJUSTABLE, + CONF_CHANGE_RATE, + CONF_END_ANGLE, + CONF_INDICATOR, + CONF_KNOB, + CONF_MAIN, + CONF_START_ANGLE, + literal, +) +from .lv_validation import angle, get_start_value, lv_float +from .lvcode import lv, lv_obj +from .types import LvNumber, NumberType +from .widget import Widget + +CONF_ARC = "arc" +ARC_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_MIN_VALUE, default=0): cv.int_, + cv.Optional(CONF_MAX_VALUE, default=100): cv.int_, + cv.Optional(CONF_START_ANGLE, default=135): angle, + cv.Optional(CONF_END_ANGLE, default=45): angle, + cv.Optional(CONF_ROTATION, default=0.0): angle, + cv.Optional(CONF_ADJUSTABLE, default=False): bool, + cv.Optional(CONF_MODE, default="NORMAL"): ARC_MODES.one_of, + cv.Optional(CONF_CHANGE_RATE, default=720): cv.uint16_t, + } +) + +ARC_MODIFY_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + } +) + + +class ArcType(NumberType): + def __init__(self): + super().__init__( + CONF_ARC, + LvNumber("lv_arc_t"), + parts=(CONF_MAIN, CONF_INDICATOR, CONF_KNOB), + schema=ARC_SCHEMA, + modify_schema=ARC_MODIFY_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + if CONF_MIN_VALUE in config: + lv.arc_set_range(w.obj, config[CONF_MIN_VALUE], config[CONF_MAX_VALUE]) + lv.arc_set_bg_angles( + w.obj, config[CONF_START_ANGLE] // 10, config[CONF_END_ANGLE] // 10 + ) + lv.arc_set_rotation(w.obj, config[CONF_ROTATION] // 10) + lv.arc_set_mode(w.obj, literal(config[CONF_MODE])) + lv.arc_set_change_rate(w.obj, config[CONF_CHANGE_RATE]) + + if config.get(CONF_ADJUSTABLE) is False: + lv_obj.remove_style(w.obj, nullptr, literal("LV_PART_KNOB")) + w.clear_flag("LV_OBJ_FLAG_CLICKABLE") + + value = await get_start_value(config) + if value is not None: + lv.arc_set_value(w.obj, value) + + +arc_spec = ArcType() diff --git a/esphome/components/lvgl/automation.py b/esphome/components/lvgl/automation.py index 4fd0be185e..ffa25783ad 100644 --- a/esphome/components/lvgl/automation.py +++ b/esphome/components/lvgl/automation.py @@ -1,15 +1,26 @@ +from collections.abc import Awaitable +from typing import Callable + from esphome import automation import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import CONF_ID, CONF_TIMEOUT -from esphome.core import Lambda -from esphome.cpp_generator import RawStatement from esphome.cpp_types import nullptr -from .defines import CONF_LVGL_ID, CONF_SHOW_SNOW, literal -from .lv_validation import lv_bool +from .defines import ( + CONF_DISP_BG_COLOR, + CONF_DISP_BG_IMAGE, + CONF_LVGL_ID, + CONF_SHOW_SNOW, + literal, +) +from .lv_validation import lv_bool, lv_color, lv_image from .lvcode import ( + LVGL_COMP_ARG, LambdaContext, + LocalVariable, + LvConditional, + LvglComponent, ReturnStatement, add_line_marks, lv, @@ -17,46 +28,46 @@ from .lvcode import ( lv_obj, lvgl_comp, ) -from .schemas import ACTION_SCHEMA, LVGL_SCHEMA +from .schemas import DISP_BG_SCHEMA, LIST_ACTION_SCHEMA, LVGL_SCHEMA from .types import ( + LV_EVENT, + LV_STATE, LvglAction, - LvglComponent, - LvglComponentPtr, LvglCondition, ObjUpdateAction, + lv_disp_t, lv_obj_t, ) -from .widget import Widget, get_widget, lv_scr_act, set_obj_properties +from .widget import Widget, get_widgets, lv_scr_act, set_obj_properties -async def action_to_code(action: list, action_id, widget: Widget, template_arg, args): - with LambdaContext() as context: - lv.cond_if(widget.obj == nullptr) - lv_add(RawStatement(" return;")) - lv.cond_endif() - code = context.get_code() - code.extend(action) - action = "\n".join(code) + "\n\n" - lamb = await cg.process_lambda(Lambda(action), args) - var = cg.new_Pvariable(action_id, template_arg, lamb) +async def action_to_code( + widgets: list[Widget], + action: Callable[[Widget], Awaitable[None]], + action_id, + template_arg, + args, +): + async with LambdaContext(parameters=args, where=action_id) as context: + for widget in widgets: + with LvConditional(widget.obj != nullptr): + await action(widget) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) return var async def update_to_code(config, action_id, template_arg, args): - if config is not None: - widget = await get_widget(config) - with LambdaContext() as context: - add_line_marks(action_id) - await set_obj_properties(widget, config) - await widget.type.to_code(widget, config) - if ( - widget.type.w_type.value_property is not None - and widget.type.w_type.value_property in config - ): - lv.event_send(widget.obj, literal("LV_EVENT_VALUE_CHANGED"), nullptr) - return await action_to_code( - context.get_code(), action_id, widget, template_arg, args - ) + async def do_update(widget: Widget): + await set_obj_properties(widget, config) + await widget.type.to_code(widget, config) + if ( + widget.type.w_type.value_property is not None + and widget.type.w_type.value_property in config + ): + lv.event_send(widget.obj, LV_EVENT.VALUE_CHANGED, nullptr) + + widgets = await get_widgets(config[CONF_ID]) + return await action_to_code(widgets, do_update, action_id, template_arg, args) @automation.register_condition( @@ -66,9 +77,7 @@ async def update_to_code(config, action_id, template_arg, args): ) async def lvgl_is_paused(config, condition_id, template_arg, args): lvgl = config[CONF_LVGL_ID] - with LambdaContext( - [(LvglComponentPtr, "lvgl_comp")], return_type=cg.bool_ - ) as context: + async with LambdaContext(LVGL_COMP_ARG, return_type=cg.bool_) as context: lv_add(ReturnStatement(lvgl_comp.is_paused())) var = cg.new_Pvariable(condition_id, template_arg, await context.get_lambda()) await cg.register_parented(var, lvgl) @@ -89,15 +98,23 @@ async def lvgl_is_paused(config, condition_id, template_arg, args): async def lvgl_is_idle(config, condition_id, template_arg, args): lvgl = config[CONF_LVGL_ID] timeout = await cg.templatable(config[CONF_TIMEOUT], [], cg.uint32) - with LambdaContext( - [(LvglComponentPtr, "lvgl_comp")], return_type=cg.bool_ - ) as context: + async with LambdaContext(LVGL_COMP_ARG, return_type=cg.bool_) as context: lv_add(ReturnStatement(lvgl_comp.is_idle(timeout))) var = cg.new_Pvariable(condition_id, template_arg, await context.get_lambda()) await cg.register_parented(var, lvgl) return var +async def disp_update(disp, config: dict): + if CONF_DISP_BG_COLOR not in config and CONF_DISP_BG_IMAGE not in config: + return + with LocalVariable("lv_disp_tmp", lv_disp_t, literal(disp)) as disp_temp: + if bg_color := config.get(CONF_DISP_BG_COLOR): + lv.disp_set_bg_color(disp_temp, await lv_color.process(bg_color)) + if bg_image := config.get(CONF_DISP_BG_IMAGE): + lv.disp_set_bg_image(disp_temp, await lv_image.process(bg_image)) + + @automation.register_action( "lvgl.widget.redraw", ObjUpdateAction, @@ -109,14 +126,32 @@ async def lvgl_is_idle(config, condition_id, template_arg, args): ), ) async def obj_invalidate_to_code(config, action_id, template_arg, args): - if CONF_ID in config: - w = await get_widget(config) - else: - w = lv_scr_act - with LambdaContext() as context: - add_line_marks(action_id) - lv_obj.invalidate(w.obj) - return await action_to_code(context.get_code(), action_id, w, template_arg, args) + widgets = await get_widgets(config) or [lv_scr_act] + + async def do_invalidate(widget: Widget): + lv_obj.invalidate(widget.obj) + + return await action_to_code(widgets, do_invalidate, action_id, template_arg, args) + + +@automation.register_action( + "lvgl.update", + LvglAction, + DISP_BG_SCHEMA.extend( + { + cv.GenerateID(): cv.use_id(LvglComponent), + } + ).add_extra(cv.has_at_least_one_key(CONF_DISP_BG_COLOR, CONF_DISP_BG_IMAGE)), +) +async def lvgl_update_to_code(config, action_id, template_arg, args): + widgets = await get_widgets(config) + w = widgets[0] + disp = f"{w.obj}->get_disp()" + async with LambdaContext(parameters=args, where=action_id) as context: + await disp_update(disp, config) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, w.var) + return var @automation.register_action( @@ -128,8 +163,8 @@ async def obj_invalidate_to_code(config, action_id, template_arg, args): }, ) async def pause_action_to_code(config, action_id, template_arg, args): - with LambdaContext([(LvglComponentPtr, "lvgl_comp")]) as context: - add_line_marks(action_id) + async with LambdaContext(LVGL_COMP_ARG) as context: + add_line_marks(where=action_id) lv_add(lvgl_comp.set_paused(True, config[CONF_SHOW_SNOW])) var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) await cg.register_parented(var, config[CONF_ID]) @@ -144,45 +179,48 @@ async def pause_action_to_code(config, action_id, template_arg, args): }, ) async def resume_action_to_code(config, action_id, template_arg, args): - with LambdaContext([(LvglComponentPtr, "lvgl_comp")]) as context: - add_line_marks(action_id) + async with LambdaContext(LVGL_COMP_ARG, where=action_id) as context: lv_add(lvgl_comp.set_paused(False, False)) var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) await cg.register_parented(var, config[CONF_ID]) return var -@automation.register_action("lvgl.widget.disable", ObjUpdateAction, ACTION_SCHEMA) +@automation.register_action("lvgl.widget.disable", ObjUpdateAction, LIST_ACTION_SCHEMA) async def obj_disable_to_code(config, action_id, template_arg, args): - w = await get_widget(config) - with LambdaContext() as context: - add_line_marks(action_id) - w.add_state("LV_STATE_DISABLED") - return await action_to_code(context.get_code(), action_id, w, template_arg, args) + async def do_disable(widget: Widget): + widget.add_state(LV_STATE.DISABLED) + + return await action_to_code( + await get_widgets(config), do_disable, action_id, template_arg, args + ) -@automation.register_action("lvgl.widget.enable", ObjUpdateAction, ACTION_SCHEMA) +@automation.register_action("lvgl.widget.enable", ObjUpdateAction, LIST_ACTION_SCHEMA) async def obj_enable_to_code(config, action_id, template_arg, args): - w = await get_widget(config) - with LambdaContext() as context: - add_line_marks(action_id) - w.clear_state("LV_STATE_DISABLED") - return await action_to_code(context.get_code(), action_id, w, template_arg, args) + async def do_enable(widget: Widget): + widget.clear_state(LV_STATE.DISABLED) + + return await action_to_code( + await get_widgets(config), do_enable, action_id, template_arg, args + ) -@automation.register_action("lvgl.widget.hide", ObjUpdateAction, ACTION_SCHEMA) +@automation.register_action("lvgl.widget.hide", ObjUpdateAction, LIST_ACTION_SCHEMA) async def obj_hide_to_code(config, action_id, template_arg, args): - w = await get_widget(config) - with LambdaContext() as context: - add_line_marks(action_id) - w.add_flag("LV_OBJ_FLAG_HIDDEN") - return await action_to_code(context.get_code(), action_id, w, template_arg, args) + async def do_hide(widget: Widget): + widget.add_flag("LV_OBJ_FLAG_HIDDEN") + + return await action_to_code( + await get_widgets(config), do_hide, action_id, template_arg, args + ) -@automation.register_action("lvgl.widget.show", ObjUpdateAction, ACTION_SCHEMA) +@automation.register_action("lvgl.widget.show", ObjUpdateAction, LIST_ACTION_SCHEMA) async def obj_show_to_code(config, action_id, template_arg, args): - w = await get_widget(config) - with LambdaContext() as context: - add_line_marks(action_id) - w.clear_flag("LV_OBJ_FLAG_HIDDEN") - return await action_to_code(context.get_code(), action_id, w, template_arg, args) + async def do_show(widget: Widget): + widget.clear_flag("LV_OBJ_FLAG_HIDDEN") + + return await action_to_code( + await get_widgets(config), do_show, action_id, template_arg, args + ) diff --git a/esphome/components/lvgl/btn.py b/esphome/components/lvgl/btn.py index 064d886d47..2a2a53e1e2 100644 --- a/esphome/components/lvgl/btn.py +++ b/esphome/components/lvgl/btn.py @@ -1,19 +1,14 @@ from esphome.const import CONF_BUTTON -from esphome.cpp_generator import MockObjClass from .defines import CONF_MAIN from .types import LvBoolean, WidgetType +lv_btn_t = LvBoolean("lv_btn_t") + class BtnType(WidgetType): def __init__(self): - super().__init__(CONF_BUTTON, LvBoolean("lv_btn_t"), (CONF_MAIN,)) - - def obj_creator(self, parent: MockObjClass, config: dict): - """ - LVGL 8 calls buttons `btn` - """ - return f"lv_btn_create({parent})" + super().__init__(CONF_BUTTON, lv_btn_t, (CONF_MAIN,), lv_name="btn") def get_uses(self): return ("btn",) diff --git a/esphome/components/lvgl/checkbox.py b/esphome/components/lvgl/checkbox.py new file mode 100644 index 0000000000..7418d633cf --- /dev/null +++ b/esphome/components/lvgl/checkbox.py @@ -0,0 +1,25 @@ +from .defines import CONF_INDICATOR, CONF_MAIN, CONF_TEXT +from .lv_validation import lv_text +from .lvcode import lv +from .schemas import TEXT_SCHEMA +from .types import LvBoolean +from .widget import Widget, WidgetType + +CONF_CHECKBOX = "checkbox" + + +class CheckboxType(WidgetType): + def __init__(self): + super().__init__( + CONF_CHECKBOX, + LvBoolean("lv_checkbox_t"), + (CONF_MAIN, CONF_INDICATOR), + TEXT_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + if value := config.get(CONF_TEXT): + lv.checkbox_set_text(w.obj, await lv_text.process(value)) + + +checkbox_spec = CheckboxType() diff --git a/esphome/components/lvgl/defines.py b/esphome/components/lvgl/defines.py index 9f349e3943..16ec45ae8a 100644 --- a/esphome/components/lvgl/defines.py +++ b/esphome/components/lvgl/defines.py @@ -4,31 +4,20 @@ Constants already defined in esphome.const are not duplicated here and must be i """ -from typing import Union - from esphome import codegen as cg, config_validation as cv from esphome.core import ID, Lambda -from esphome.cpp_generator import Literal +from esphome.cpp_generator import MockObj from esphome.cpp_types import uint32 from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor from .helpers import requires_component - -class ConstantLiteral(Literal): - __slots__ = ("constant",) - - def __init__(self, constant: str): - super().__init__() - self.constant = constant - - def __str__(self): - return self.constant +lvgl_ns = cg.esphome_ns.namespace("lvgl") -def literal(arg: Union[str, ConstantLiteral]): +def literal(arg): if isinstance(arg, str): - return ConstantLiteral(arg) + return MockObj(arg) return arg @@ -93,15 +82,23 @@ class LvConstant(LValidator): return self.prefix + cv.one_of(*choices, upper=True)(value) super().__init__(validator, rtype=uint32) + self.retmapper = self.mapper self.one_of = LValidator(validator, uint32, retmapper=self.mapper) self.several_of = LValidator( cv.ensure_list(self.one_of), uint32, retmapper=self.mapper ) def mapper(self, value, args=()): - if isinstance(value, list): - value = "|".join(value) - return ConstantLiteral(value) + if not isinstance(value, list): + value = [value] + return literal( + "|".join( + [ + str(v) if str(v).startswith(self.prefix) else self.prefix + str(v) + for v in value + ] + ).upper() + ) def extend(self, *choices): """ @@ -112,9 +109,6 @@ class LvConstant(LValidator): return LvConstant(self.prefix, *(self.choices + choices)) -# Widgets -CONF_LABEL = "label" - # Parts CONF_MAIN = "main" CONF_SCROLLBAR = "scrollbar" @@ -123,10 +117,15 @@ CONF_KNOB = "knob" CONF_SELECTED = "selected" CONF_ITEMS = "items" CONF_TICKS = "ticks" -CONF_TICK_STYLE = "tick_style" CONF_CURSOR = "cursor" CONF_TEXTAREA_PLACEHOLDER = "textarea_placeholder" +# Layout types + +TYPE_FLEX = "flex" +TYPE_GRID = "grid" +TYPE_NONE = "none" + LV_FONTS = list(f"montserrat_{s}" for s in range(8, 50, 2)) + [ "dejavu_16_persian_hebrew", "simsun_16_cjk", @@ -134,7 +133,7 @@ LV_FONTS = list(f"montserrat_{s}" for s in range(8, 50, 2)) + [ "unscii_16", ] -LV_EVENT = { +LV_EVENT_MAP = { "PRESS": "PRESSED", "SHORT_CLICK": "SHORT_CLICKED", "LONG_PRESS": "LONG_PRESSED", @@ -150,7 +149,7 @@ LV_EVENT = { "CANCEL": "CANCEL", } -LV_EVENT_TRIGGERS = tuple(f"on_{x.lower()}" for x in LV_EVENT) +LV_EVENT_TRIGGERS = tuple(f"on_{x.lower()}" for x in LV_EVENT_MAP) LV_ANIM = LvConstant( @@ -305,7 +304,8 @@ OBJ_FLAGS = ( ARC_MODES = LvConstant("LV_ARC_MODE_", "NORMAL", "REVERSE", "SYMMETRICAL") BAR_MODES = LvConstant("LV_BAR_MODE_", "NORMAL", "SYMMETRICAL", "RANGE") -BTNMATRIX_CTRLS = ( +BTNMATRIX_CTRLS = LvConstant( + "LV_BTNMATRIX_CTRL_", "HIDDEN", "NO_REPEAT", "DISABLED", @@ -366,7 +366,6 @@ CONF_ACCEPTED_CHARS = "accepted_chars" CONF_ADJUSTABLE = "adjustable" CONF_ALIGN = "align" CONF_ALIGN_TO = "align_to" -CONF_ANGLE_RANGE = "angle_range" CONF_ANIMATED = "animated" CONF_ANIMATION = "animation" CONF_ANTIALIAS = "antialias" @@ -384,8 +383,6 @@ CONF_BYTE_ORDER = "byte_order" CONF_CHANGE_RATE = "change_rate" CONF_CLOSE_BUTTON = "close_button" CONF_COLOR_DEPTH = "color_depth" -CONF_COLOR_END = "color_end" -CONF_COLOR_START = "color_start" CONF_CONTROL = "control" CONF_DEFAULT = "default" CONF_DEFAULT_FONT = "default_font" @@ -414,9 +411,7 @@ CONF_GRID_ROW_ALIGN = "grid_row_align" CONF_GRID_ROWS = "grid_rows" CONF_HEADER_MODE = "header_mode" CONF_HOME = "home" -CONF_INDICATORS = "indicators" CONF_KEY_CODE = "key_code" -CONF_LABEL_GAP = "label_gap" CONF_LAYOUT = "layout" CONF_LEFT_BUTTON = "left_button" CONF_LINE_WIDTH = "line_width" @@ -425,7 +420,6 @@ CONF_LONG_PRESS_TIME = "long_press_time" CONF_LONG_PRESS_REPEAT_TIME = "long_press_repeat_time" CONF_LVGL_ID = "lvgl_id" CONF_LONG_MODE = "long_mode" -CONF_MAJOR = "major" CONF_MSGBOXES = "msgboxes" CONF_OBJ = "obj" CONF_OFFSET_X = "offset_x" @@ -434,6 +428,7 @@ CONF_ONE_LINE = "one_line" CONF_ON_SELECT = "on_select" CONF_ONE_CHECKED = "one_checked" CONF_NEXT = "next" +CONF_PAGE = "page" CONF_PAGE_WRAP = "page_wrap" CONF_PASSWORD_MODE = "password_mode" CONF_PIVOT_X = "pivot_x" @@ -442,14 +437,12 @@ CONF_PLACEHOLDER_TEXT = "placeholder_text" CONF_POINTS = "points" CONF_PREVIOUS = "previous" CONF_REPEAT_COUNT = "repeat_count" -CONF_R_MOD = "r_mod" CONF_RECOLOR = "recolor" CONF_RIGHT_BUTTON = "right_button" CONF_ROLLOVER = "rollover" CONF_ROOT_BACK_BTN = "root_back_btn" CONF_ROTARY_ENCODERS = "rotary_encoders" CONF_ROWS = "rows" -CONF_SCALES = "scales" CONF_SCALE_LINES = "scale_lines" CONF_SCROLLBAR_MODE = "scrollbar_mode" CONF_SELECTED_INDEX = "selected_index" @@ -459,8 +452,9 @@ CONF_SRC = "src" CONF_START_ANGLE = "start_angle" CONF_START_VALUE = "start_value" CONF_STATES = "states" -CONF_STRIDE = "stride" CONF_STYLE = "style" +CONF_STYLES = "styles" +CONF_STYLE_DEFINITIONS = "style_definitions" CONF_STYLE_ID = "style_id" CONF_SKIP = "skip" CONF_SYMBOL = "symbol" @@ -505,4 +499,4 @@ DEFAULT_ESPHOME_FONT = "esphome_lv_default_font" def join_enums(enums, prefix=""): - return ConstantLiteral("|".join(f"(int){prefix}{e.upper()}" for e in enums)) + return literal("|".join(f"(int){prefix}{e.upper()}" for e in enums)) diff --git a/esphome/components/lvgl/helpers.py b/esphome/components/lvgl/helpers.py index d67739155c..e04a0105d5 100644 --- a/esphome/components/lvgl/helpers.py +++ b/esphome/components/lvgl/helpers.py @@ -1,10 +1,7 @@ import re from esphome import config_validation as cv -from esphome.config import Config from esphome.const import CONF_ARGS, CONF_FORMAT -from esphome.core import CORE, ID -from esphome.yaml_util import ESPHomeDataBase lv_uses = { "USER_DATA", @@ -44,23 +41,6 @@ def validate_printf(value): return value -def get_line_marks(value) -> list: - """ - If possible, return a preprocessor directive to identify the line number where the given id was defined. - :param id: The id in question - :return: A list containing zero or more line directives - """ - path = None - if isinstance(value, ESPHomeDataBase): - path = value.esp_range - elif isinstance(value, ID) and isinstance(CORE.config, Config): - path = CORE.config.get_path_for_id(value)[:-1] - path = CORE.config.get_deepest_document_range_for_path(path) - if path is None: - return [] - return [path.start_mark.as_line_directive] - - def requires_component(comp): def validator(value): lvgl_components_required.add(comp) diff --git a/esphome/components/lvgl/img.py b/esphome/components/lvgl/img.py new file mode 100644 index 0000000000..e9682def8c --- /dev/null +++ b/esphome/components/lvgl/img.py @@ -0,0 +1,85 @@ +import esphome.config_validation as cv +from esphome.const import CONF_ANGLE, CONF_MODE + +from .defines import ( + CONF_ANTIALIAS, + CONF_MAIN, + CONF_OFFSET_X, + CONF_OFFSET_Y, + CONF_PIVOT_X, + CONF_PIVOT_Y, + CONF_SRC, + CONF_ZOOM, + LvConstant, +) +from .label import CONF_LABEL +from .lv_validation import angle, lv_bool, lv_image, size, zoom +from .lvcode import lv +from .types import lv_img_t +from .widget import Widget, WidgetType + +CONF_IMAGE = "image" + +BASE_IMG_SCHEMA = cv.Schema( + { + cv.Optional(CONF_PIVOT_X, default="50%"): size, + cv.Optional(CONF_PIVOT_Y, default="50%"): size, + cv.Optional(CONF_ANGLE): angle, + cv.Optional(CONF_ZOOM): zoom, + cv.Optional(CONF_OFFSET_X): size, + cv.Optional(CONF_OFFSET_Y): size, + cv.Optional(CONF_ANTIALIAS): lv_bool, + cv.Optional(CONF_MODE): LvConstant( + "LV_IMG_SIZE_MODE_", "VIRTUAL", "REAL" + ).one_of, + } +) + +IMG_SCHEMA = BASE_IMG_SCHEMA.extend( + { + cv.Required(CONF_SRC): lv_image, + } +) + +IMG_MODIFY_SCHEMA = BASE_IMG_SCHEMA.extend( + { + cv.Optional(CONF_SRC): lv_image, + } +) + + +class ImgType(WidgetType): + def __init__(self): + super().__init__( + CONF_IMAGE, + lv_img_t, + (CONF_MAIN,), + IMG_SCHEMA, + IMG_MODIFY_SCHEMA, + lv_name="img", + ) + + def get_uses(self): + return "img", CONF_LABEL + + async def to_code(self, w: Widget, config): + if src := config.get(CONF_SRC): + lv.img_set_src(w.obj, await lv_image.process(src)) + if cf_angle := config.get(CONF_ANGLE): + pivot_x = config[CONF_PIVOT_X] + pivot_y = config[CONF_PIVOT_Y] + lv.img_set_pivot(w.obj, pivot_x, pivot_y) + lv.img_set_angle(w.obj, cf_angle) + if img_zoom := config.get(CONF_ZOOM): + lv.img_set_zoom(w.obj, img_zoom) + if offset := config.get(CONF_OFFSET_X): + lv.img_set_offset_x(w.obj, offset) + if offset := config.get(CONF_OFFSET_Y): + lv.img_set_offset_y(w.obj, offset) + if CONF_ANTIALIAS in config: + lv.img_set_antialias(w.obj, config[CONF_ANTIALIAS]) + if mode := config.get(CONF_MODE): + lv.img_set_mode(w.obj, mode) + + +img_spec = ImgType() diff --git a/esphome/components/lvgl/label.py b/esphome/components/lvgl/label.py index 0498f39474..6c3e1f4a00 100644 --- a/esphome/components/lvgl/label.py +++ b/esphome/components/lvgl/label.py @@ -1,7 +1,6 @@ import esphome.config_validation as cv from .defines import ( - CONF_LABEL, CONF_LONG_MODE, CONF_MAIN, CONF_RECOLOR, @@ -15,6 +14,8 @@ from .schemas import TEXT_SCHEMA from .types import LvText, WidgetType from .widget import Widget +CONF_LABEL = "label" + class LabelType(WidgetType): def __init__(self): @@ -33,9 +34,9 @@ class LabelType(WidgetType): async def to_code(self, w: Widget, config): """For a text object, create and set text""" if value := config.get(CONF_TEXT): - w.set_property(CONF_TEXT, await lv_text.process(value)) - w.set_property(CONF_LONG_MODE, config) - w.set_property(CONF_RECOLOR, config) + await w.set_property(CONF_TEXT, await lv_text.process(value)) + await w.set_property(CONF_LONG_MODE, config) + await w.set_property(CONF_RECOLOR, config) label_spec = LabelType() diff --git a/esphome/components/lvgl/led.py b/esphome/components/lvgl/led.py new file mode 100644 index 0000000000..f920758efb --- /dev/null +++ b/esphome/components/lvgl/led.py @@ -0,0 +1,29 @@ +import esphome.config_validation as cv +from esphome.const import CONF_BRIGHTNESS, CONF_COLOR, CONF_LED + +from .defines import CONF_MAIN +from .lv_validation import lv_brightness, lv_color +from .lvcode import lv +from .types import LvType +from .widget import Widget, WidgetType + +LED_SCHEMA = cv.Schema( + { + cv.Optional(CONF_COLOR): lv_color, + cv.Optional(CONF_BRIGHTNESS): lv_brightness, + } +) + + +class LedType(WidgetType): + def __init__(self): + super().__init__(CONF_LED, LvType("lv_led_t"), (CONF_MAIN,), LED_SCHEMA) + + async def to_code(self, w: Widget, config): + if color := config.get(CONF_COLOR): + lv.led_set_color(w.obj, await lv_color.process(color)) + if brightness := config.get(CONF_BRIGHTNESS): + lv.led_set_brightness(w.obj, await lv_brightness.process(brightness)) + + +led_spec = LedType() diff --git a/esphome/components/lvgl/line.py b/esphome/components/lvgl/line.py new file mode 100644 index 0000000000..ab50832bbf --- /dev/null +++ b/esphome/components/lvgl/line.py @@ -0,0 +1,51 @@ +import functools + +import esphome.codegen as cg +import esphome.config_validation as cv + +from . import defines as df +from .defines import CONF_MAIN, literal +from .lvcode import lv +from .types import LvType +from .widget import Widget, WidgetType + +CONF_LINE = "line" +CONF_POINTS = "points" +CONF_POINT_LIST_ID = "point_list_id" + +lv_point_t = cg.global_ns.struct("lv_point_t") + + +def point_list(il): + il = cv.string(il) + nl = il.replace(" ", "").split(",") + return [int(n) for n in nl] + + +def cv_point_list(value): + if not isinstance(value, list): + raise cv.Invalid("List of points required") + values = [point_list(v) for v in value] + if not functools.reduce(lambda f, v: f and len(v) == 2, values, True): + raise cv.Invalid("Points must be a list of x,y integer pairs") + return values + + +LINE_SCHEMA = { + cv.Required(df.CONF_POINTS): cv_point_list, + cv.GenerateID(CONF_POINT_LIST_ID): cv.declare_id(lv_point_t), +} + + +class LineType(WidgetType): + def __init__(self): + super().__init__(CONF_LINE, LvType("lv_line_t"), (CONF_MAIN,), LINE_SCHEMA) + + async def to_code(self, w: Widget, config): + """For a line object, create and add the points""" + data = literal(config[CONF_POINTS]) + points = cg.static_const_array(config[CONF_POINT_LIST_ID], data) + lv.line_set_points(w.obj, points, len(data)) + + +line_spec = LineType() diff --git a/esphome/components/lvgl/lv_bar.py b/esphome/components/lvgl/lv_bar.py new file mode 100644 index 0000000000..d5dcff0bf0 --- /dev/null +++ b/esphome/components/lvgl/lv_bar.py @@ -0,0 +1,53 @@ +import esphome.config_validation as cv +from esphome.const import CONF_MAX_VALUE, CONF_MIN_VALUE, CONF_MODE, CONF_VALUE + +from .defines import BAR_MODES, CONF_ANIMATED, CONF_INDICATOR, CONF_MAIN, literal +from .lv_validation import animated, get_start_value, lv_float +from .lvcode import lv +from .types import LvNumber, NumberType +from .widget import Widget + +CONF_BAR = "bar" +BAR_MODIFY_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_ANIMATED, default=True): animated, + } +) + +BAR_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_MIN_VALUE, default=0): cv.int_, + cv.Optional(CONF_MAX_VALUE, default=100): cv.int_, + cv.Optional(CONF_MODE, default="NORMAL"): BAR_MODES.one_of, + cv.Optional(CONF_ANIMATED, default=True): animated, + } +) + + +class BarType(NumberType): + def __init__(self): + super().__init__( + CONF_BAR, + LvNumber("lv_bar_t"), + parts=(CONF_MAIN, CONF_INDICATOR), + schema=BAR_SCHEMA, + modify_schema=BAR_MODIFY_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + var = w.obj + if CONF_MIN_VALUE in config: + lv.bar_set_range(var, config[CONF_MIN_VALUE], config[CONF_MAX_VALUE]) + lv.bar_set_mode(var, literal(config[CONF_MODE])) + value = await get_start_value(config) + if value is not None: + lv.bar_set_value(var, value, literal(config[CONF_ANIMATED])) + + @property + def animated(self): + return True + + +bar_spec = BarType() diff --git a/esphome/components/lvgl/lv_switch.py b/esphome/components/lvgl/lv_switch.py new file mode 100644 index 0000000000..5db2c2ce38 --- /dev/null +++ b/esphome/components/lvgl/lv_switch.py @@ -0,0 +1,20 @@ +from .defines import CONF_INDICATOR, CONF_KNOB, CONF_MAIN +from .types import LvBoolean +from .widget import WidgetType + +CONF_SWITCH = "switch" + + +class SwitchType(WidgetType): + def __init__(self): + super().__init__( + CONF_SWITCH, + LvBoolean("lv_switch_t"), + (CONF_MAIN, CONF_INDICATOR, CONF_KNOB), + ) + + async def to_code(self, w, config): + return [] + + +switch_spec = SwitchType() diff --git a/esphome/components/lvgl/lv_validation.py b/esphome/components/lvgl/lv_validation.py index 818bde6aed..b351b84af6 100644 --- a/esphome/components/lvgl/lv_validation.py +++ b/esphome/components/lvgl/lv_validation.py @@ -1,3 +1,5 @@ +from typing import Union + import esphome.codegen as cg from esphome.components.binary_sensor import BinarySensor from esphome.components.color import ColorStruct @@ -6,7 +8,7 @@ from esphome.components.image import Image_ from esphome.components.sensor import Sensor from esphome.components.text_sensor import TextSensor import esphome.config_validation as cv -from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT +from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT, CONF_VALUE from esphome.core import HexInt from esphome.cpp_generator import MockObj from esphome.cpp_types import uint32 @@ -14,7 +16,14 @@ from esphome.helpers import cpp_string_escape from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor from . import types as ty -from .defines import LV_FONTS, ConstantLiteral, LValidator, LvConstant, literal +from .defines import ( + CONF_END_VALUE, + CONF_START_VALUE, + LV_FONTS, + LValidator, + LvConstant, + literal, +) from .helpers import ( esphome_fonts_used, lv_fonts_used, @@ -60,6 +69,13 @@ def color_retmapper(value): return lv_expr.color_from(MockObj(value)) +def option_string(value): + value = cv.string(value).strip() + if value.find("\n") != -1: + raise cv.Invalid("Options strings must not contain newlines") + return value + + lv_color = LValidator(color, ty.lv_color_t, retmapper=color_retmapper) @@ -156,6 +172,12 @@ lv_bool = LValidator( ) +def lv_pct(value: Union[int, float]): + if isinstance(value, float): + value = int(value * 100) + return literal(f"lv_pct({value})") + + def lvms_validator_(value): if value == "never": value = "2147483647ms" @@ -189,13 +211,16 @@ class TextValidator(LValidator): args = [str(x) for x in value[CONF_ARGS]] arg_expr = cg.RawExpression(",".join(args)) format_str = cpp_string_escape(value[CONF_FORMAT]) - return f"str_sprintf({format_str}, {arg_expr}).c_str()" + return literal(f"str_sprintf({format_str}, {arg_expr}).c_str()") return await super().process(value, args) lv_text = TextValidator() lv_float = LValidator(cv.float_, cg.float_, Sensor, "get_state()") lv_int = LValidator(cv.int_, cg.int_, Sensor, "get_state()") +lv_brightness = LValidator( + cv.percentage, cg.float_, Sensor, "get_state()", retmapper=lambda x: int(x * 255) +) def is_lv_font(font): @@ -222,8 +247,33 @@ class LvFont(LValidator): async def process(self, value, args=()): if is_lv_font(value): - return ConstantLiteral(f"&lv_font_{value}") - return ConstantLiteral(f"{value}_engine->get_lv_font()") + return literal(f"&lv_font_{value}") + return literal(f"{value}_engine->get_lv_font()") lv_font = LvFont() + + +def animated(value): + if isinstance(value, bool): + value = "ON" if value else "OFF" + return LvConstant("LV_ANIM_", "OFF", "ON").one_of(value) + + +def key_code(value): + value = cv.Any(cv.All(cv.string_strict, cv.Length(min=1, max=1)), cv.uint8_t)(value) + if isinstance(value, str): + return ord(value[0]) + return value + + +async def get_end_value(config): + return await lv_int.process(config.get(CONF_END_VALUE)) + + +async def get_start_value(config): + if CONF_START_VALUE in config: + value = config[CONF_START_VALUE] + else: + value = config.get(CONF_VALUE) + return await lv_int.process(value) diff --git a/esphome/components/lvgl/lvcode.py b/esphome/components/lvgl/lvcode.py index 3a8a958f2e..f54a032de2 100644 --- a/esphome/components/lvgl/lvcode.py +++ b/esphome/components/lvgl/lvcode.py @@ -1,9 +1,9 @@ import abc -import logging from typing import Union from esphome import codegen as cg -from esphome.core import ID, Lambda +from esphome.config import Config +from esphome.core import CORE, ID, Lambda from esphome.cpp_generator import ( AssignmentExpression, CallExpression, @@ -18,12 +18,47 @@ from esphome.cpp_generator import ( VariableDeclarationExpression, statement, ) +from esphome.yaml_util import ESPHomeDataBase -from .defines import ConstantLiteral -from .helpers import get_line_marks -from .types import lv_group_t +from .defines import literal, lvgl_ns -_LOGGER = logging.getLogger(__name__) +LVGL_COMP = "lv_component" # used as a lambda argument in lvgl_comp() + +# Argument tuple for use in lambdas +LvglComponent = lvgl_ns.class_("LvglComponent", cg.PollingComponent) +LVGL_COMP_ARG = [(LvglComponent.operator("ptr"), LVGL_COMP)] +lv_event_t_ptr = cg.global_ns.namespace("lv_event_t").operator("ptr") +EVENT_ARG = [(lv_event_t_ptr, "ev")] +CUSTOM_EVENT = literal("lvgl::lv_custom_event") + + +def get_line_marks(value) -> list: + """ + If possible, return a preprocessor directive to identify the line number where the given id was defined. + :param value: The id or other token to get the line number for + :return: A list containing zero or more line directives + """ + path = None + if isinstance(value, ESPHomeDataBase): + path = value.esp_range + elif isinstance(value, ID) and isinstance(CORE.config, Config): + path = CORE.config.get_path_for_id(value)[:-1] + path = CORE.config.get_deepest_document_range_for_path(path) + if path is None: + return [] + return [path.start_mark.as_line_directive] + + +class IndentedStatement(Statement): + def __init__(self, stmt: Statement, indent: int): + self.statement = stmt + self.indent = indent + + def __str__(self): + result = " " * self.indent * 4 + str(self.statement).strip() + if not isinstance(self.statement, RawStatement): + result += ";" + return result class CodeContext(abc.ABC): @@ -39,6 +74,16 @@ class CodeContext(abc.ABC): def add(self, expression: Union[Expression, Statement]): pass + @staticmethod + def start_block(): + CodeContext.append(RawStatement("{")) + CodeContext.code_context.indent() + + @staticmethod + def end_block(): + CodeContext.code_context.detent() + CodeContext.append(RawStatement("}")) + @staticmethod def append(expression: Union[Expression, Statement]): if CodeContext.code_context is not None: @@ -47,14 +92,25 @@ class CodeContext(abc.ABC): def __init__(self): self.previous: Union[CodeContext | None] = None + self.indent_level = 0 - def __enter__(self): + async def __aenter__(self): self.previous = CodeContext.code_context CodeContext.code_context = self + return self - def __exit__(self, *args): + async def __aexit__(self, *args): CodeContext.code_context = self.previous + def indent(self): + self.indent_level += 1 + + def detent(self): + self.indent_level -= 1 + + def indented_statement(self, stmt): + return IndentedStatement(stmt, self.indent_level) + class MainContext(CodeContext): """ @@ -62,42 +118,7 @@ class MainContext(CodeContext): """ def add(self, expression: Union[Expression, Statement]): - return cg.add(expression) - - -class LvContext(CodeContext): - """ - Code generation into the LVGL initialisation code (called in `setup()`) - """ - - lv_init_code: list["Statement"] = [] - - @staticmethod - def lv_add(expression: Union[Expression, Statement]): - if isinstance(expression, Expression): - expression = statement(expression) - if not isinstance(expression, Statement): - raise ValueError( - f"Add '{expression}' must be expression or statement, not {type(expression)}" - ) - LvContext.lv_init_code.append(expression) - _LOGGER.debug("LV Adding: %s", expression) - return expression - - @staticmethod - def get_code(): - code = [] - for exp in LvContext.lv_init_code: - text = str(statement(exp)) - text = text.rstrip() - code.append(text) - return "\n".join(code) + "\n\n" - - def add(self, expression: Union[Expression, Statement]): - return LvContext.lv_add(expression) - - def set_style(self, prop): - return MockObj("lv_set_style_{prop}", "") + return cg.add(self.indented_statement(expression)) class LambdaContext(CodeContext): @@ -110,21 +131,23 @@ class LambdaContext(CodeContext): parameters: list[tuple[SafeExpType, str]] = None, return_type: SafeExpType = cg.void, capture: str = "", + where=None, ): super().__init__() self.code_list: list[Statement] = [] - self.parameters = parameters + self.parameters = parameters or [] self.return_type = return_type self.capture = capture + self.where = where def add(self, expression: Union[Expression, Statement]): - self.code_list.append(expression) + self.code_list.append(self.indented_statement(expression)) return expression async def get_lambda(self) -> LambdaExpression: code_text = self.get_code() return await cg.process_lambda( - Lambda("\n".join(code_text) + "\n\n"), + Lambda("\n".join(code_text) + "\n"), self.parameters, capture=self.capture, return_type=self.return_type, @@ -138,33 +161,59 @@ class LambdaContext(CodeContext): code_text.append(text) return code_text - def __enter__(self): - super().__enter__() + async def __aenter__(self): + await super().__aenter__() + add_line_marks(self.where) return self +class LvContext(LambdaContext): + """ + Code generation into the LVGL initialisation code (called in `setup()`) + """ + + def __init__(self, lv_component, args=None): + self.args = args or LVGL_COMP_ARG + super().__init__(parameters=self.args) + self.lv_component = lv_component + + async def add_init_lambda(self): + cg.add(self.lv_component.add_init_lambda(await self.get_lambda())) + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await super().__aexit__(exc_type, exc_val, exc_tb) + await self.add_init_lambda() + + def add(self, expression: Union[Expression, Statement]): + self.code_list.append(self.indented_statement(expression)) + return expression + + def __call__(self, *args): + return self.add(*args) + + class LocalVariable(MockObj): """ Create a local variable and enclose the code using it within a block. """ - def __init__(self, name, type, modifier=None, rhs=None): - base = ID(name, True, type) + def __init__(self, name, type, rhs=None, modifier="*"): + base = ID(name + "_VAR_", True, type) super().__init__(base, "") self.modifier = modifier self.rhs = rhs def __enter__(self): - CodeContext.append(RawStatement("{")) + CodeContext.start_block() CodeContext.append( VariableDeclarationExpression(self.base.type, self.modifier, self.base.id) ) if self.rhs is not None: CodeContext.append(AssignmentExpression(None, "", self.base, self.rhs)) - return self.base + return MockObj(self.base) def __exit__(self, *args): - CodeContext.append(RawStatement("}")) + CodeContext.end_block() class MockLv: @@ -199,14 +248,27 @@ class MockLv: self.append(result) return result - def cond_if(self, expression: Expression): - CodeContext.append(RawStatement(f"if {expression} {{")) - def cond_else(self): +class LvConditional: + def __init__(self, condition): + self.condition = condition + + def __enter__(self): + if self.condition is not None: + CodeContext.append(RawStatement(f"if ({self.condition}) {{")) + CodeContext.code_context.indent() + return self + + def __exit__(self, *args): + if self.condition is not None: + CodeContext.code_context.detent() + CodeContext.append(RawStatement("}")) + + def else_(self): + assert self.condition is not None + CodeContext.code_context.detent() CodeContext.append(RawStatement("} else {")) - - def cond_endif(self): - CodeContext.append(RawStatement("}")) + CodeContext.code_context.indent() class ReturnStatement(ExpressionStatement): @@ -228,36 +290,56 @@ lv = MockLv("lv_") lv_expr = LvExpr("lv_") # Mock for lv_obj_ calls lv_obj = MockLv("lv_obj_") -lvgl_comp = MockObj("lvgl_comp", "->") +# Operations on the LVGL component +lvgl_comp = MockObj(LVGL_COMP, "->") -# equivalent to cg.add() for the lvgl init context +# equivalent to cg.add() for the current code context def lv_add(expression: Union[Expression, Statement]): return CodeContext.append(expression) def add_line_marks(where): + """ + Add line marks for the current code context + :param where: An object to identify the source of the line marks + :return: + """ for mark in get_line_marks(where): lv_add(cg.RawStatement(mark)) def lv_assign(target, expression): - lv_add(RawExpression(f"{target} = {expression}")) + lv_add(AssignmentExpression("", "", target, expression)) -lv_groups = {} # Widget group names +def lv_Pvariable(type, name): + """ + Create but do not initialise a pointer variable + :param type: Type of the variable target + :param name: name of the variable, or an ID + :return: A MockObj of the variable + """ + if isinstance(name, str): + name = ID(name, True, type) + decl = VariableDeclarationExpression(type, "*", name) + CORE.add_global(decl) + var = MockObj(name, "->") + CORE.register_variable(name, var) + return var -def add_group(name): - if name is None: - return None - fullname = f"lv_esp_group_{name}" - if name not in lv_groups: - gid = ID(fullname, True, type=lv_group_t.operator("ptr")) - lv_add( - AssignmentExpression( - type_=gid.type, modifier="", name=fullname, rhs=lv_expr.group_create() - ) - ) - lv_groups[name] = ConstantLiteral(fullname) - return lv_groups[name] +def lv_variable(type, name): + """ + Create but do not initialise a variable + :param type: Type of the variable target + :param name: name of the variable, or an ID + :return: A MockObj of the variable + """ + if isinstance(name, str): + name = ID(name, True, type) + decl = VariableDeclarationExpression(type, "", name) + CORE.add_global(decl) + var = MockObj(name, ".") + CORE.register_variable(name, var) + return var diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp index 34f8eaf21f..1221682d28 100644 --- a/esphome/components/lvgl/lvgl_esphome.cpp +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -9,8 +9,72 @@ namespace esphome { namespace lvgl { static const char *const TAG = "lvgl"; +#if LV_USE_LOG +static void log_cb(const char *buf) { + esp_log_printf_(ESPHOME_LOG_LEVEL_INFO, TAG, 0, "%.*s", (int) strlen(buf) - 1, buf); +} +#endif // LV_USE_LOG + +static void rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { + // make sure all coordinates are even + if (area->x1 & 1) + area->x1--; + if (!(area->x2 & 1)) + area->x2++; + if (area->y1 & 1) + area->y1--; + if (!(area->y2 & 1)) + area->y2++; +} + lv_event_code_t lv_custom_event; // NOLINT void LvglComponent::dump_config() { ESP_LOGCONFIG(TAG, "LVGL:"); } +void LvglComponent::set_paused(bool paused, bool show_snow) { + this->paused_ = paused; + this->show_snow_ = show_snow; + this->snow_line_ = 0; + if (!paused && lv_scr_act() != nullptr) { + lv_disp_trig_activity(this->disp_); // resets the inactivity time + lv_obj_invalidate(lv_scr_act()); + } +} +void LvglComponent::add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event) { + lv_obj_add_event_cb(obj, callback, event, this); + if (event == LV_EVENT_VALUE_CHANGED) { + lv_obj_add_event_cb(obj, callback, lv_custom_event, this); + } +} +void LvglComponent::add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event1, + lv_event_code_t event2) { + this->add_event_cb(obj, callback, event1); + this->add_event_cb(obj, callback, event2); +} +void LvglComponent::add_page(LvPageType *page) { + this->pages_.push_back(page); + page->setup(this->pages_.size() - 1); +} +void LvglComponent::show_page(size_t index, lv_scr_load_anim_t anim, uint32_t time) { + if (index >= this->pages_.size()) + return; + this->current_page_ = index; + lv_scr_load_anim(this->pages_[this->current_page_]->obj, anim, time, 0, false); +} +void LvglComponent::show_next_page(lv_scr_load_anim_t anim, uint32_t time) { + if (this->pages_.empty() || (this->current_page_ == this->pages_.size() - 1 && !this->page_wrap_)) + return; + do { + this->current_page_ = (this->current_page_ + 1) % this->pages_.size(); + } while (this->pages_[this->current_page_]->skip); // skip empty pages() + this->show_page(this->current_page_, anim, time); +} +void LvglComponent::show_prev_page(lv_scr_load_anim_t anim, uint32_t time) { + if (this->pages_.empty() || (this->current_page_ == 0 && !this->page_wrap_)) + return; + do { + this->current_page_ = (this->current_page_ + this->pages_.size() - 1) % this->pages_.size(); + } while (this->pages_[this->current_page_]->skip); // skip empty pages() + this->show_page(this->current_page_, anim, time); +} void LvglComponent::draw_buffer_(const lv_area_t *area, const uint8_t *ptr) { for (auto *display : this->displays_) { display->draw_pixels_at(area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area), ptr, @@ -27,6 +91,116 @@ void LvglComponent::flush_cb_(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv } lv_disp_flush_ready(disp_drv); } +IdleTrigger::IdleTrigger(LvglComponent *parent, TemplatableValue timeout) : timeout_(std::move(timeout)) { + parent->add_on_idle_callback([this](uint32_t idle_time) { + if (!this->is_idle_ && idle_time > this->timeout_.value()) { + this->is_idle_ = true; + this->trigger(); + } else if (this->is_idle_ && idle_time < this->timeout_.value()) { + this->is_idle_ = false; + } + }); +} + +#ifdef USE_LVGL_TOUCHSCREEN +LVTouchListener::LVTouchListener(uint16_t long_press_time, uint16_t long_press_repeat_time) { + lv_indev_drv_init(&this->drv_); + this->drv_.long_press_repeat_time = long_press_repeat_time; + this->drv_.long_press_time = long_press_time; + this->drv_.type = LV_INDEV_TYPE_POINTER; + this->drv_.user_data = this; + this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { + auto *l = static_cast(d->user_data); + if (l->touch_pressed_) { + data->point.x = l->touch_point_.x; + data->point.y = l->touch_point_.y; + data->state = LV_INDEV_STATE_PRESSED; + } else { + data->state = LV_INDEV_STATE_RELEASED; + } + }; +} +void LVTouchListener::update(const touchscreen::TouchPoints_t &tpoints) { + this->touch_pressed_ = !this->parent_->is_paused() && !tpoints.empty(); + if (this->touch_pressed_) + this->touch_point_ = tpoints[0]; +} +#endif // USE_LVGL_TOUCHSCREEN + +#ifdef USE_LVGL_ROTARY_ENCODER +LVEncoderListener::LVEncoderListener(lv_indev_type_t type, uint16_t lpt, uint16_t lprt) { + lv_indev_drv_init(&this->drv_); + this->drv_.type = type; + this->drv_.user_data = this; + this->drv_.long_press_time = lpt; + this->drv_.long_press_repeat_time = lprt; + this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { + auto *l = static_cast(d->user_data); + data->state = l->pressed_ ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->key = l->key_; + data->enc_diff = (int16_t) (l->count_ - l->last_count_); + l->last_count_ = l->count_; + data->continue_reading = false; + }; +} +#endif // USE_LVGL_ROTARY_ENCODER + +#ifdef USE_LVGL_BUTTONMATRIX +void LvBtnmatrixType::set_obj(lv_obj_t *lv_obj) { + LvCompound::set_obj(lv_obj); + lv_obj_add_event_cb( + lv_obj, + [](lv_event_t *event) { + auto *self = static_cast(event->user_data); + if (self->key_callback_.size() == 0) + return; + auto key_idx = lv_btnmatrix_get_selected_btn(self->obj); + if (key_idx == LV_BTNMATRIX_BTN_NONE) + return; + if (self->key_map_.count(key_idx) != 0) { + self->send_key_(self->key_map_[key_idx]); + return; + } + const auto *str = lv_btnmatrix_get_btn_text(self->obj, key_idx); + auto len = strlen(str); + while (len--) + self->send_key_(*str++); + }, + LV_EVENT_PRESSED, this); +} +#endif // USE_LVGL_BUTTONMATRIX + +#ifdef USE_LVGL_KEYBOARD +static const char *const KB_SPECIAL_KEYS[] = { + "abc", "ABC", "1#", + // maybe add other special keys here +}; + +void LvKeyboardType::set_obj(lv_obj_t *lv_obj) { + LvCompound::set_obj(lv_obj); + lv_obj_add_event_cb( + lv_obj, + [](lv_event_t *event) { + auto *self = static_cast(event->user_data); + if (self->key_callback_.size() == 0) + return; + + auto key_idx = lv_btnmatrix_get_selected_btn(self->obj); + if (key_idx == LV_BTNMATRIX_BTN_NONE) + return; + const char *txt = lv_btnmatrix_get_btn_text(self->obj, key_idx); + if (txt == nullptr) + return; + for (const auto *kb_special_key : KB_SPECIAL_KEYS) { + if (strcmp(txt, kb_special_key) == 0) + return; + } + while (*txt != 0) + self->send_key_(*txt++); + }, + LV_EVENT_PRESSED, this); +} +#endif // USE_LVGL_KEYBOARD void LvglComponent::write_random_() { // length of 2 lines in 32 bit units @@ -97,9 +271,24 @@ void LvglComponent::setup() { this->disp_ = lv_disp_drv_register(&this->disp_drv_); for (const auto &v : this->init_lambdas_) v(this); + this->show_page(0, LV_SCR_LOAD_ANIM_NONE, 0); lv_disp_trig_activity(this->disp_); ESP_LOGCONFIG(TAG, "LVGL Setup complete"); } +void LvglComponent::update() { + // update indicators + if (this->paused_) { + return; + } + this->idle_callbacks_.call(lv_disp_get_inactive_time(this->disp_)); +} +void LvglComponent::loop() { + if (this->paused_) { + if (this->show_snow_) + this->write_random_(); + } + lv_timer_handler_run_in_period(5); +} #ifdef USE_LVGL_IMAGE lv_img_dsc_t *lv_img_from(image::Image *src, lv_img_dsc_t *img_dsc) { @@ -142,7 +331,20 @@ lv_img_dsc_t *lv_img_from(image::Image *src, lv_img_dsc_t *img_dsc) { } return img_dsc; } +#endif // USE_LVGL_IMAGE + +#ifdef USE_LVGL_ANIMIMG +void lv_animimg_stop(lv_obj_t *obj) { + auto *animg = (lv_animimg_t *) obj; + int32_t duration = animg->anim.time; + lv_animimg_set_duration(obj, 0); + lv_animimg_start(obj); + lv_animimg_set_duration(obj, duration); +} #endif +void LvglComponent::static_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { + reinterpret_cast(disp_drv->user_data)->flush_cb_(disp_drv, area, color_p); +} } // namespace lvgl } // namespace esphome diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h index a0d3d226ce..b92799addd 100644 --- a/esphome/components/lvgl/lvgl_esphome.h +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -18,7 +18,6 @@ #include "esphome/core/component.h" #include "esphome/core/log.h" #include -#include #include #ifdef USE_LVGL_IMAGE #include "esphome/components/image/image.h" @@ -31,6 +30,10 @@ #include "esphome/components/touchscreen/touchscreen.h" #endif // USE_LVGL_TOUCHSCREEN +#if defined(USE_LVGL_BUTTONMATRIX) || defined(USE_LVGL_KEYBOARD) +#include "esphome/components/key_provider/key_provider.h" +#endif // USE_LVGL_BUTTONMATRIX + namespace esphome { namespace lvgl { @@ -47,12 +50,25 @@ static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BIT #endif // LV_COLOR_DEPTH // Parent class for things that wrap an LVGL object -class LvCompound final { +class LvCompound { public: - void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } + virtual void set_obj(lv_obj_t *lv_obj) { this->obj = lv_obj; } lv_obj_t *obj{}; }; +class LvPageType { + public: + LvPageType(bool skip) : skip(skip) {} + + void setup(size_t index) { + this->index = index; + this->obj = lv_obj_create(nullptr); + } + lv_obj_t *obj{}; + size_t index{}; + bool skip; +}; + using LvLambdaType = std::function; using set_value_lambda_t = std::function; using event_callback_t = void(_lv_event_t *); @@ -89,48 +105,20 @@ class FontEngine { lv_img_dsc_t *lv_img_from(image::Image *src, lv_img_dsc_t *img_dsc = nullptr); #endif // USE_LVGL_IMAGE +#ifdef USE_LVGL_ANIMIMG +void lv_animimg_stop(lv_obj_t *obj); +#endif // USE_LVGL_ANIMIMG + class LvglComponent : public PollingComponent { constexpr static const char *const TAG = "lvgl"; public: - static void static_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { - reinterpret_cast(disp_drv->user_data)->flush_cb_(disp_drv, area, color_p); - } + static void static_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); float get_setup_priority() const override { return setup_priority::PROCESSOR; } - static void log_cb(const char *buf) { - esp_log_printf_(ESPHOME_LOG_LEVEL_INFO, TAG, 0, "%.*s", (int) strlen(buf) - 1, buf); - } - static void rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { - // make sure all coordinates are even - if (area->x1 & 1) - area->x1--; - if (!(area->x2 & 1)) - area->x2++; - if (area->y1 & 1) - area->y1--; - if (!(area->y2 & 1)) - area->y2++; - } - void setup() override; - - void update() override { - // update indicators - if (this->paused_) { - return; - } - this->idle_callbacks_.call(lv_disp_get_inactive_time(this->disp_)); - } - - void loop() override { - if (this->paused_) { - if (this->show_snow_) - this->write_random_(); - } - lv_timer_handler_run_in_period(5); - } - + void update() override; + void loop() override; void add_on_idle_callback(std::function &&callback) { this->idle_callbacks_.add(std::move(callback)); } @@ -141,23 +129,15 @@ class LvglComponent : public PollingComponent { bool is_idle(uint32_t idle_ms) { return lv_disp_get_inactive_time(this->disp_) > idle_ms; } void set_buffer_frac(size_t frac) { this->buffer_frac_ = frac; } lv_disp_t *get_disp() { return this->disp_; } - void set_paused(bool paused, bool show_snow) { - this->paused_ = paused; - this->show_snow_ = show_snow; - this->snow_line_ = 0; - if (!paused && lv_scr_act() != nullptr) { - lv_disp_trig_activity(this->disp_); // resets the inactivity time - lv_obj_invalidate(lv_scr_act()); - } - } - - void add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event) { - lv_obj_add_event_cb(obj, callback, event, this); - if (event == LV_EVENT_VALUE_CHANGED) { - lv_obj_add_event_cb(obj, callback, lv_custom_event, this); - } - } + void set_paused(bool paused, bool show_snow); + void add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event); + void add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_event_code_t event1, lv_event_code_t event2); bool is_paused() const { return this->paused_; } + void add_page(LvPageType *page); + void show_page(size_t index, lv_scr_load_anim_t anim, uint32_t time); + void show_next_page(lv_scr_load_anim_t anim, uint32_t time); + void show_prev_page(lv_scr_load_anim_t anim, uint32_t time); + void set_page_wrap(bool wrap) { this->page_wrap_ = wrap; } protected: void write_random_(); @@ -168,8 +148,11 @@ class LvglComponent : public PollingComponent { lv_disp_drv_t disp_drv_{}; lv_disp_t *disp_{}; bool paused_{}; + std::vector pages_{}; + size_t current_page_{0}; bool show_snow_{}; lv_coord_t snow_line_{}; + bool page_wrap_{true}; std::vector> init_lambdas_; CallbackManager idle_callbacks_{}; @@ -179,16 +162,7 @@ class LvglComponent : public PollingComponent { class IdleTrigger : public Trigger<> { public: - explicit IdleTrigger(LvglComponent *parent, TemplatableValue timeout) : timeout_(std::move(timeout)) { - parent->add_on_idle_callback([this](uint32_t idle_time) { - if (!this->is_idle_ && idle_time > this->timeout_.value()) { - this->is_idle_ = true; - this->trigger(); - } else if (this->is_idle_ && idle_time < this->timeout_.value()) { - this->is_idle_ = false; - } - }); - } + explicit IdleTrigger(LvglComponent *parent, TemplatableValue timeout); protected: TemplatableValue timeout_; @@ -217,28 +191,8 @@ template class LvglCondition : public Condition, public P #ifdef USE_LVGL_TOUCHSCREEN class LVTouchListener : public touchscreen::TouchListener, public Parented { public: - LVTouchListener(uint16_t long_press_time, uint16_t long_press_repeat_time) { - lv_indev_drv_init(&this->drv_); - this->drv_.long_press_repeat_time = long_press_repeat_time; - this->drv_.long_press_time = long_press_time; - this->drv_.type = LV_INDEV_TYPE_POINTER; - this->drv_.user_data = this; - this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { - auto *l = static_cast(d->user_data); - if (l->touch_pressed_) { - data->point.x = l->touch_point_.x; - data->point.y = l->touch_point_.y; - data->state = LV_INDEV_STATE_PRESSED; - } else { - data->state = LV_INDEV_STATE_RELEASED; - } - }; - } - void update(const touchscreen::TouchPoints_t &tpoints) override { - this->touch_pressed_ = !this->parent_->is_paused() && !tpoints.empty(); - if (this->touch_pressed_) - this->touch_point_ = tpoints[0]; - } + LVTouchListener(uint16_t long_press_time, uint16_t long_press_repeat_time); + void update(const touchscreen::TouchPoints_t &tpoints) override; void release() override { touch_pressed_ = false; } lv_indev_drv_t *get_drv() { return &this->drv_; } @@ -249,24 +203,10 @@ class LVTouchListener : public touchscreen::TouchListener, public Parented { public: - LVEncoderListener(lv_indev_type_t type, uint16_t lpt, uint16_t lprt) { - lv_indev_drv_init(&this->drv_); - this->drv_.type = type; - this->drv_.user_data = this; - this->drv_.long_press_time = lpt; - this->drv_.long_press_repeat_time = lprt; - this->drv_.read_cb = [](lv_indev_drv_t *d, lv_indev_data_t *data) { - auto *l = static_cast(d->user_data); - data->state = l->pressed_ ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - data->key = l->key_; - data->enc_diff = (int16_t) (l->count_ - l->last_count_); - l->last_count_ = l->count_; - data->continue_reading = false; - }; - } + LVEncoderListener(lv_indev_type_t type, uint16_t lpt, uint16_t lprt); void set_left_button(binary_sensor::BinarySensor *left_button) { left_button->add_on_state_callback([this](bool state) { this->event(LV_KEY_LEFT, state); }); @@ -304,6 +244,24 @@ class LVEncoderListener : public Parented { int32_t last_count_{}; int key_{}; }; -#endif // USE_LVGL_KEY_LISTENER +#endif // USE_LVGL_ROTARY_ENCODER +#ifdef USE_LVGL_BUTTONMATRIX +class LvBtnmatrixType : public key_provider::KeyProvider, public LvCompound { + public: + void set_obj(lv_obj_t *lv_obj) override; + uint16_t get_selected() { return lv_btnmatrix_get_selected_btn(this->obj); } + void set_key(size_t idx, uint8_t key) { this->key_map_[idx] = key; } + + protected: + std::map key_map_{}; +}; +#endif // USE_LVGL_BUTTONMATRIX + +#ifdef USE_LVGL_KEYBOARD +class LvKeyboardType : public key_provider::KeyProvider, public LvCompound { + public: + void set_obj(lv_obj_t *lv_obj) override; +}; +#endif // USE_LVGL_KEYBOARD } // namespace lvgl } // namespace esphome diff --git a/esphome/components/lvgl/page.py b/esphome/components/lvgl/page.py new file mode 100644 index 0000000000..4566b7eea4 --- /dev/null +++ b/esphome/components/lvgl/page.py @@ -0,0 +1,113 @@ +from esphome import automation, codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_PAGES, CONF_TIME + +from .defines import ( + CONF_ANIMATION, + CONF_LVGL_ID, + CONF_PAGE, + CONF_PAGE_WRAP, + CONF_SKIP, + LV_ANIM, +) +from .lv_validation import lv_bool, lv_milliseconds +from .lvcode import LVGL_COMP_ARG, LambdaContext, add_line_marks, lv_add, lvgl_comp +from .schemas import LVGL_SCHEMA +from .types import LvglAction, lv_page_t +from .widget import Widget, WidgetType, add_widgets, set_obj_properties + + +class PageType(WidgetType): + def __init__(self): + super().__init__( + CONF_PAGE, + lv_page_t, + (), + { + cv.Optional(CONF_SKIP, default=False): lv_bool, + }, + ) + + async def to_code(self, w: Widget, config: dict): + return [] + + +SHOW_SCHEMA = LVGL_SCHEMA.extend( + { + cv.Optional(CONF_ANIMATION, default="NONE"): LV_ANIM.one_of, + cv.Optional(CONF_TIME, default="50ms"): lv_milliseconds, + } +) + + +page_spec = PageType() + + +@automation.register_action( + "lvgl.page.next", + LvglAction, + SHOW_SCHEMA, +) +async def page_next_to_code(config, action_id, template_arg, args): + animation = await LV_ANIM.process(config[CONF_ANIMATION]) + time = await lv_milliseconds.process(config[CONF_TIME]) + async with LambdaContext(LVGL_COMP_ARG) as context: + add_line_marks(action_id) + lv_add(lvgl_comp.show_next_page(animation, time)) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, config[CONF_LVGL_ID]) + return var + + +@automation.register_action( + "lvgl.page.previous", + LvglAction, + SHOW_SCHEMA, +) +async def page_previous_to_code(config, action_id, template_arg, args): + animation = await LV_ANIM.process(config[CONF_ANIMATION]) + time = await lv_milliseconds.process(config[CONF_TIME]) + async with LambdaContext(LVGL_COMP_ARG) as context: + add_line_marks(action_id) + lv_add(lvgl_comp.show_prev_page(animation, time)) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, config[CONF_LVGL_ID]) + return var + + +@automation.register_action( + "lvgl.page.show", + LvglAction, + cv.maybe_simple_value( + SHOW_SCHEMA.extend( + { + cv.Required(CONF_ID): cv.use_id(lv_page_t), + } + ), + key=CONF_ID, + ), +) +async def page_show_to_code(config, action_id, template_arg, args): + widget = await cg.get_variable(config[CONF_ID]) + animation = await LV_ANIM.process(config[CONF_ANIMATION]) + time = await lv_milliseconds.process(config[CONF_TIME]) + async with LambdaContext(LVGL_COMP_ARG) as context: + add_line_marks(action_id) + lv_add(lvgl_comp.show_page(widget.index, animation, time)) + var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda()) + await cg.register_parented(var, config[CONF_LVGL_ID]) + return var + + +async def add_pages(lv_component, config): + lv_add(lv_component.set_page_wrap(config[CONF_PAGE_WRAP])) + for pconf in config.get(CONF_PAGES, ()): + id = pconf[CONF_ID] + skip = pconf[CONF_SKIP] + var = cg.new_Pvariable(id, skip) + page = Widget.create(id, var, page_spec, pconf) + lv_add(lv_component.add_page(var)) + # Set outer config first + await set_obj_properties(page, config) + await set_obj_properties(page, pconf) + await add_widgets(page, pconf) diff --git a/esphome/components/lvgl/rotary_encoders.py b/esphome/components/lvgl/rotary_encoders.py index 77dc397c3e..ede6905a67 100644 --- a/esphome/components/lvgl/rotary_encoders.py +++ b/esphome/components/lvgl/rotary_encoders.py @@ -13,9 +13,10 @@ from .defines import ( CONF_ROTARY_ENCODERS, ) from .helpers import lvgl_components_required -from .lvcode import add_group, lv, lv_add, lv_expr +from .lvcode import lv, lv_add, lv_expr from .schemas import ENCODER_SCHEMA from .types import lv_indev_type_t +from .widget import add_group ROTARY_ENCODER_CONFIG = cv.ensure_list( ENCODER_SCHEMA.extend( diff --git a/esphome/components/lvgl/schemas.py b/esphome/components/lvgl/schemas.py index ebef56a882..796783890d 100644 --- a/esphome/components/lvgl/schemas.py +++ b/esphome/components/lvgl/schemas.py @@ -15,8 +15,12 @@ from esphome.schema_extractors import SCHEMA_EXTRACT from . import defines as df, lv_validation as lvalid, types as ty from .helpers import add_lv_use, requires_component, validate_printf -from .lv_validation import id_name, lv_font -from .types import WIDGET_TYPES, WidgetType +from .lv_validation import id_name, lv_color, lv_font, lv_image +from .lvcode import LvglComponent +from .types import WidgetType + +# this will be populated later, in __init__.py to avoid circular imports. +WIDGET_TYPES: dict = {} # A schema for text properties TEXT_SCHEMA = cv.Schema( @@ -38,11 +42,13 @@ TEXT_SCHEMA = cv.Schema( } ) -ACTION_SCHEMA = cv.maybe_simple_value( - { - cv.Required(CONF_ID): cv.use_id(ty.lv_pseudo_button_t), - }, - key=CONF_ID, +LIST_ACTION_SCHEMA = cv.ensure_list( + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(ty.lv_pseudo_button_t), + }, + key=CONF_ID, + ) ) PRESS_TIME = cv.All( @@ -154,6 +160,7 @@ STYLE_REMAP = { # Complete object style schema STYLE_SCHEMA = cv.Schema({cv.Optional(k): v for k, v in STYLE_PROPS.items()}).extend( { + cv.Optional(df.CONF_STYLES): cv.ensure_list(cv.use_id(ty.lv_style_t)), cv.Optional(df.CONF_SCROLLBAR_MODE): df.LvConstant( "LV_SCROLLBAR_MODE_", "OFF", "ON", "ACTIVE", "AUTO" ).one_of, @@ -209,7 +216,14 @@ def create_modify_schema(widget_type): part_schema(widget_type) .extend( { - cv.Required(CONF_ID): cv.use_id(widget_type), + cv.Required(CONF_ID): cv.ensure_list( + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(widget_type), + }, + key=CONF_ID, + ) + ), cv.Optional(CONF_STATE): SET_STATE_SCHEMA, } ) @@ -227,6 +241,7 @@ def obj_schema(widget_type: WidgetType): return ( part_schema(widget_type) .extend(FLAG_SCHEMA) + .extend(LAYOUT_SCHEMA) .extend(ALIGN_TO_SCHEMA) .extend(automation_schema(widget_type.w_type)) .extend( @@ -240,6 +255,8 @@ def obj_schema(widget_type: WidgetType): ) +LAYOUT_SCHEMAS = {} + ALIGN_TO_SCHEMA = { cv.Optional(df.CONF_ALIGN_TO): cv.Schema( { @@ -252,6 +269,65 @@ ALIGN_TO_SCHEMA = { } +def grid_free_space(value): + value = cv.Upper(value) + if value.startswith("FR(") and value.endswith(")"): + value = value.removesuffix(")").removeprefix("FR(") + return f"LV_GRID_FR({cv.positive_int(value)})" + raise cv.Invalid("must be a size in pixels, CONTENT or FR(nn)") + + +grid_spec = cv.Any( + lvalid.size, df.LvConstant("LV_GRID_", "CONTENT").one_of, grid_free_space +) + +cell_alignments = df.LV_CELL_ALIGNMENTS.one_of +grid_alignments = df.LV_GRID_ALIGNMENTS.one_of +flex_alignments = df.LV_FLEX_ALIGNMENTS.one_of + +LAYOUT_SCHEMA = { + cv.Optional(df.CONF_LAYOUT): cv.typed_schema( + { + df.TYPE_GRID: { + cv.Required(df.CONF_GRID_ROWS): [grid_spec], + cv.Required(df.CONF_GRID_COLUMNS): [grid_spec], + cv.Optional(df.CONF_GRID_COLUMN_ALIGN): grid_alignments, + cv.Optional(df.CONF_GRID_ROW_ALIGN): grid_alignments, + }, + df.TYPE_FLEX: { + cv.Optional( + df.CONF_FLEX_FLOW, default="row_wrap" + ): df.FLEX_FLOWS.one_of, + cv.Optional(df.CONF_FLEX_ALIGN_MAIN, default="start"): flex_alignments, + cv.Optional(df.CONF_FLEX_ALIGN_CROSS, default="start"): flex_alignments, + cv.Optional(df.CONF_FLEX_ALIGN_TRACK, default="start"): flex_alignments, + }, + }, + lower=True, + ) +} + +GRID_CELL_SCHEMA = { + cv.Required(df.CONF_GRID_CELL_ROW_POS): cv.positive_int, + cv.Required(df.CONF_GRID_CELL_COLUMN_POS): cv.positive_int, + cv.Optional(df.CONF_GRID_CELL_ROW_SPAN, default=1): cv.positive_int, + cv.Optional(df.CONF_GRID_CELL_COLUMN_SPAN, default=1): cv.positive_int, + cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments, + cv.Optional(df.CONF_GRID_CELL_Y_ALIGN): grid_alignments, +} + +FLEX_OBJ_SCHEMA = { + cv.Optional(df.CONF_FLEX_GROW): cv.int_, +} + +DISP_BG_SCHEMA = cv.Schema( + { + cv.Optional(df.CONF_DISP_BG_IMAGE): lv_image, + cv.Optional(df.CONF_DISP_BG_COLOR): lv_color, + } +) + + # A style schema that can include text STYLED_TEXT_SCHEMA = cv.maybe_simple_value( STYLE_SCHEMA.extend(TEXT_SCHEMA), key=df.CONF_TEXT @@ -260,13 +336,11 @@ STYLED_TEXT_SCHEMA = cv.maybe_simple_value( # For use by platform components LVGL_SCHEMA = cv.Schema( { - cv.GenerateID(df.CONF_LVGL_ID): cv.use_id(ty.LvglComponent), + cv.GenerateID(df.CONF_LVGL_ID): cv.use_id(LvglComponent), } ) -ALL_STYLES = { - **STYLE_PROPS, -} +ALL_STYLES = {**STYLE_PROPS, **GRID_CELL_SCHEMA, **FLEX_OBJ_SCHEMA} def container_validator(schema, widget_type: WidgetType): @@ -281,16 +355,17 @@ def container_validator(schema, widget_type: WidgetType): result = schema if w_sch := widget_type.schema: result = result.extend(w_sch) + ltype = df.TYPE_NONE if value and (layout := value.get(df.CONF_LAYOUT)): if not isinstance(layout, dict): raise cv.Invalid("Layout value must be a dict") ltype = layout.get(CONF_TYPE) + if not ltype: + raise (cv.Invalid("Layout schema requires type:")) add_lv_use(ltype) - result = result.extend( - {cv.Optional(df.CONF_WIDGETS): cv.ensure_list(any_widget_schema())} - ) if value == SCHEMA_EXTRACT: return result + result = result.extend(LAYOUT_SCHEMAS[ltype.lower()]) return result(value) return validator diff --git a/esphome/components/lvgl/slider.py b/esphome/components/lvgl/slider.py new file mode 100644 index 0000000000..1886f79b44 --- /dev/null +++ b/esphome/components/lvgl/slider.py @@ -0,0 +1,63 @@ +import esphome.config_validation as cv +from esphome.const import CONF_MAX_VALUE, CONF_MIN_VALUE, CONF_MODE, CONF_VALUE + +from .defines import ( + BAR_MODES, + CONF_ANIMATED, + CONF_INDICATOR, + CONF_KNOB, + CONF_MAIN, + literal, +) +from .helpers import add_lv_use +from .lv_bar import CONF_BAR +from .lv_validation import animated, get_start_value, lv_float +from .lvcode import lv +from .types import LvNumber, NumberType +from .widget import Widget + +CONF_SLIDER = "slider" +SLIDER_MODIFY_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_ANIMATED, default=True): animated, + } +) + +SLIDER_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_MIN_VALUE, default=0): cv.int_, + cv.Optional(CONF_MAX_VALUE, default=100): cv.int_, + cv.Optional(CONF_MODE, default="NORMAL"): BAR_MODES.one_of, + cv.Optional(CONF_ANIMATED, default=True): animated, + } +) + + +class SliderType(NumberType): + def __init__(self): + super().__init__( + CONF_SLIDER, + LvNumber("lv_slider_t"), + parts=(CONF_MAIN, CONF_INDICATOR, CONF_KNOB), + schema=SLIDER_SCHEMA, + modify_schema=SLIDER_MODIFY_SCHEMA, + ) + + @property + def animated(self): + return True + + async def to_code(self, w: Widget, config): + add_lv_use(CONF_BAR) + if CONF_MIN_VALUE in config: + # not modify case + lv.slider_set_range(w.obj, config[CONF_MIN_VALUE], config[CONF_MAX_VALUE]) + lv.slider_set_mode(w.obj, literal(config[CONF_MODE])) + value = await get_start_value(config) + if value is not None: + lv.slider_set_value(w.obj, value, literal(config[CONF_ANIMATED])) + + +slider_spec = SliderType() diff --git a/esphome/components/lvgl/spinner.py b/esphome/components/lvgl/spinner.py new file mode 100644 index 0000000000..2f798d0fbf --- /dev/null +++ b/esphome/components/lvgl/spinner.py @@ -0,0 +1,43 @@ +import esphome.config_validation as cv +from esphome.cpp_generator import MockObjClass + +from .arc import CONF_ARC +from .defines import CONF_ARC_LENGTH, CONF_INDICATOR, CONF_MAIN, CONF_SPIN_TIME +from .lv_validation import angle +from .lvcode import lv_expr +from .types import LvType +from .widget import Widget, WidgetType + +CONF_SPINNER = "spinner" + +SPINNER_SCHEMA = cv.Schema( + { + cv.Required(CONF_ARC_LENGTH): angle, + cv.Required(CONF_SPIN_TIME): cv.positive_time_period_milliseconds, + } +) + + +class SpinnerType(WidgetType): + def __init__(self): + super().__init__( + CONF_SPINNER, + LvType("lv_spinner_t"), + (CONF_MAIN, CONF_INDICATOR), + SPINNER_SCHEMA, + {}, + ) + + async def to_code(self, w: Widget, config): + return [] + + def get_uses(self): + return (CONF_ARC,) + + def obj_creator(self, parent: MockObjClass, config: dict): + spin_time = config[CONF_SPIN_TIME].total_milliseconds + arc_length = config[CONF_ARC_LENGTH] // 10 + return lv_expr.call("spinner_create", parent, spin_time, arc_length) + + +spinner_spec = SpinnerType() diff --git a/esphome/components/lvgl/styles.py b/esphome/components/lvgl/styles.py new file mode 100644 index 0000000000..7a795bc99d --- /dev/null +++ b/esphome/components/lvgl/styles.py @@ -0,0 +1,58 @@ +import esphome.codegen as cg +from esphome.const import CONF_ID +from esphome.core import ID +from esphome.cpp_generator import MockObj + +from .defines import ( + CONF_STYLE_DEFINITIONS, + CONF_THEME, + CONF_TOP_LAYER, + LValidator, + literal, +) +from .helpers import add_lv_use +from .lvcode import LambdaContext, LocalVariable, lv, lv_assign, lv_variable +from .obj import obj_spec +from .schemas import ALL_STYLES +from .types import lv_lambda_t, lv_obj_t, lv_obj_t_ptr +from .widget import Widget, add_widgets, set_obj_properties, theme_widget_map + +TOP_LAYER = literal("lv_disp_get_layer_top(lv_component->get_disp())") + + +async def styles_to_code(config): + """Convert styles to C__ code.""" + for style in config.get(CONF_STYLE_DEFINITIONS, ()): + svar = cg.new_Pvariable(style[CONF_ID]) + lv.style_init(svar) + for prop, validator in ALL_STYLES.items(): + if value := style.get(prop): + if isinstance(validator, LValidator): + value = await validator.process(value) + if isinstance(value, list): + value = "|".join(value) + lv.call(f"style_set_{prop}", svar, literal(value)) + + +async def theme_to_code(config): + if theme := config.get(CONF_THEME): + add_lv_use(CONF_THEME) + for w_name, style in theme.items(): + if not isinstance(style, dict): + continue + + lname = "lv_theme_apply_" + w_name + apply = lv_variable(lv_lambda_t, lname) + theme_widget_map[w_name] = apply + ow = Widget.create("obj", MockObj(ID("obj")), obj_spec) + async with LambdaContext([(lv_obj_t_ptr, "obj")], where=w_name) as context: + await set_obj_properties(ow, style) + lv_assign(apply, await context.get_lambda()) + + +async def add_top_layer(config): + if top_conf := config.get(CONF_TOP_LAYER): + with LocalVariable("top_layer", lv_obj_t, TOP_LAYER) as top_layer_obj: + top_w = Widget(top_layer_obj, obj_spec, top_conf) + await set_obj_properties(top_w, top_conf) + await add_widgets(top_w, top_conf) diff --git a/esphome/components/lvgl/trigger.py b/esphome/components/lvgl/trigger.py index bf92bda5b0..c640c8abd9 100644 --- a/esphome/components/lvgl/trigger.py +++ b/esphome/components/lvgl/trigger.py @@ -7,15 +7,14 @@ from .defines import ( CONF_ALIGN_TO, CONF_X, CONF_Y, - LV_EVENT, + LV_EVENT_MAP, LV_EVENT_TRIGGERS, literal, ) -from .lvcode import LambdaContext, add_line_marks, lv, lv_add +from .lvcode import EVENT_ARG, LambdaContext, LvConditional, lv, lv_add +from .types import LV_EVENT from .widget import widget_map -lv_event_t_ptr = cg.global_ns.namespace("lv_event_t").operator("ptr") - async def generate_triggers(lv_component): """ @@ -34,15 +33,15 @@ async def generate_triggers(lv_component): }.items(): conf = conf[0] w.add_flag("LV_OBJ_FLAG_CLICKABLE") - event = "LV_EVENT_" + LV_EVENT[event[3:].upper()] + event = literal("LV_EVENT_" + LV_EVENT_MAP[event[3:].upper()]) await add_trigger(conf, event, lv_component, w) for conf in w.config.get(CONF_ON_VALUE, ()): - await add_trigger(conf, "LV_EVENT_VALUE_CHANGED", lv_component, w) + await add_trigger(conf, LV_EVENT.VALUE_CHANGED, lv_component, w) # Generate align to directives while we're here if align_to := w.config.get(CONF_ALIGN_TO): target = widget_map[align_to[CONF_ID]].obj - align = align_to[CONF_ALIGN] + align = literal(align_to[CONF_ALIGN]) x = align_to[CONF_X] y = align_to[CONF_Y] lv.obj_align_to(w.obj, target, align, x, y) @@ -50,12 +49,11 @@ async def generate_triggers(lv_component): async def add_trigger(conf, event, lv_component, w): tid = conf[CONF_TRIGGER_ID] - add_line_marks(tid) trigger = cg.new_Pvariable(tid) args = w.get_args() value = w.get_value() await automation.build_automation(trigger, args, conf) - with LambdaContext([(lv_event_t_ptr, "event_data")]) as context: - add_line_marks(tid) - lv_add(trigger.trigger(value)) - lv_add(lv_component.add_event_cb(w.obj, await context.get_lambda(), literal(event))) + async with LambdaContext(EVENT_ARG, where=tid) as context: + with LvConditional(w.is_selected()): + lv_add(trigger.trigger(value)) + lv_add(lv_component.add_event_cb(w.obj, await context.get_lambda(), event)) diff --git a/esphome/components/lvgl/types.py b/esphome/components/lvgl/types.py index 6997207dac..b6f65c8c1b 100644 --- a/esphome/components/lvgl/types.py +++ b/esphome/components/lvgl/types.py @@ -1,8 +1,11 @@ -from esphome import automation, codegen as cg -from esphome.core import ID -from esphome.cpp_generator import MockObjClass +import sys -from .defines import CONF_TEXT +from esphome import automation, codegen as cg +from esphome.const import CONF_MAX_VALUE, CONF_MIN_VALUE, CONF_VALUE +from esphome.cpp_generator import MockObj, MockObjClass + +from .defines import CONF_TEXT, lvgl_ns +from .lvcode import lv_expr class LvType(cg.MockObjClass): @@ -18,36 +21,48 @@ class LvType(cg.MockObjClass): return self.args[0][0] if len(self.args) else None +class LvNumber(LvType): + def __init__(self, *args): + super().__init__( + *args, + largs=[(cg.float_, "x")], + lvalue=lambda w: w.get_number_value(), + has_on_value=True, + ) + self.value_property = CONF_VALUE + + uint16_t_ptr = cg.uint16.operator("ptr") -lvgl_ns = cg.esphome_ns.namespace("lvgl") char_ptr = cg.global_ns.namespace("char").operator("ptr") void_ptr = cg.void.operator("ptr") -LvglComponent = lvgl_ns.class_("LvglComponent", cg.PollingComponent) -LvglComponentPtr = LvglComponent.operator("ptr") -lv_event_code_t = cg.global_ns.namespace("lv_event_code_t") +lv_coord_t = cg.global_ns.namespace("lv_coord_t") +lv_event_code_t = cg.global_ns.enum("lv_event_code_t") lv_indev_type_t = cg.global_ns.enum("lv_indev_type_t") FontEngine = lvgl_ns.class_("FontEngine") IdleTrigger = lvgl_ns.class_("IdleTrigger", automation.Trigger.template()) ObjUpdateAction = lvgl_ns.class_("ObjUpdateAction", automation.Action) LvglCondition = lvgl_ns.class_("LvglCondition", automation.Condition) LvglAction = lvgl_ns.class_("LvglAction", automation.Action) +lv_lambda_t = lvgl_ns.class_("LvLambdaType") LvCompound = lvgl_ns.class_("LvCompound") lv_font_t = cg.global_ns.class_("lv_font_t") lv_style_t = cg.global_ns.struct("lv_style_t") +# fake parent class for first class widgets and matrix buttons lv_pseudo_button_t = lvgl_ns.class_("LvPseudoButton") lv_obj_base_t = cg.global_ns.class_("lv_obj_t", lv_pseudo_button_t) lv_obj_t_ptr = lv_obj_base_t.operator("ptr") -lv_disp_t_ptr = cg.global_ns.struct("lv_disp_t").operator("ptr") +lv_disp_t = cg.global_ns.struct("lv_disp_t") lv_color_t = cg.global_ns.struct("lv_color_t") lv_group_t = cg.global_ns.struct("lv_group_t") LVTouchListener = lvgl_ns.class_("LVTouchListener") LVEncoderListener = lvgl_ns.class_("LVEncoderListener") lv_obj_t = LvType("lv_obj_t") +lv_page_t = cg.global_ns.class_("LvPageType", LvCompound) lv_img_t = LvType("lv_img_t") - -# this will be populated later, in __init__.py to avoid circular imports. -WIDGET_TYPES: dict = {} +LV_EVENT = MockObj(base="LV_EVENT_", op="") +LV_STATE = MockObj(base="LV_STATE_", op="") +LV_BTNMATRIX_CTRL = MockObj(base="LV_BTNMATRIX_CTRL_", op="") class LvText(LvType): @@ -55,7 +70,8 @@ class LvText(LvType): super().__init__( *args, largs=[(cg.std_string, "text")], - lvalue=lambda w: w.get_property("text")[0], + lvalue=lambda w: w.get_property("text"), + has_on_value=True, **kwargs, ) self.value_property = CONF_TEXT @@ -66,13 +82,21 @@ class LvBoolean(LvType): super().__init__( *args, largs=[(cg.bool_, "x")], - lvalue=lambda w: w.has_state("LV_STATE_CHECKED"), + lvalue=lambda w: w.is_checked(), has_on_value=True, **kwargs, ) -CUSTOM_EVENT = ID("lv_custom_event", False, type=lv_event_code_t) +class LvSelect(LvType): + def __init__(self, *args, **kwargs): + super().__init__( + *args, + largs=[(cg.int_, "x")], + lvalue=lambda w: w.get_property("selected"), + has_on_value=True, + **kwargs, + ) class WidgetType: @@ -80,7 +104,15 @@ class WidgetType: Describes a type of Widget, e.g. "bar" or "line" """ - def __init__(self, name, w_type, parts, schema=None, modify_schema=None): + def __init__( + self, + name: str, + w_type: LvType, + parts: tuple, + schema=None, + modify_schema=None, + lv_name=None, + ): """ :param name: The widget name, e.g. "bar" :param w_type: The C type of the widget @@ -89,6 +121,7 @@ class WidgetType: :param modify_schema: A schema to update the widget """ self.name = name + self.lv_name = lv_name or name self.w_type = w_type self.parts = parts if schema is None: @@ -98,7 +131,8 @@ class WidgetType: if modify_schema is None: self.modify_schema = self.schema else: - self.modify_schema = self.schema + self.modify_schema = modify_schema + self.mock_obj = MockObj(f"lv_{self.lv_name}", "_") @property def animated(self): @@ -118,7 +152,7 @@ class WidgetType: :param config: Its configuration :return: Generated code as a list of text lines """ - raise NotImplementedError(f"No to_code defined for {self.name}") + return [] def obj_creator(self, parent: MockObjClass, config: dict): """ @@ -127,7 +161,7 @@ class WidgetType: :param config: Its configuration :return: Generated code as a single text line """ - return f"lv_{self.name}_create({parent})" + return lv_expr.call(f"{self.lv_name}_create", parent) def get_uses(self): """ @@ -135,3 +169,23 @@ class WidgetType: :return: """ return () + + def get_max(self, config: dict): + return sys.maxsize + + def get_min(self, config: dict): + return -sys.maxsize + + def get_step(self, config: dict): + return 1 + + def get_scale(self, config: dict): + return 1.0 + + +class NumberType(WidgetType): + def get_max(self, config: dict): + return int(config[CONF_MAX_VALUE] or 100) + + def get_min(self, config: dict): + return int(config[CONF_MIN_VALUE] or 0) diff --git a/esphome/components/lvgl/widget.py b/esphome/components/lvgl/widget.py index 83aed341e7..5734aec7dc 100644 --- a/esphome/components/lvgl/widget.py +++ b/esphome/components/lvgl/widget.py @@ -1,33 +1,63 @@ import sys -from typing import Any +from typing import Any, Union from esphome import codegen as cg, config_validation as cv from esphome.config_validation import Invalid -from esphome.const import CONF_GROUP, CONF_ID, CONF_STATE -from esphome.core import CORE, TimePeriod +from esphome.const import CONF_GROUP, CONF_ID, CONF_STATE, CONF_TYPE +from esphome.core import ID, TimePeriod from esphome.coroutine import FakeAwaitable -from esphome.cpp_generator import MockObj, MockObjClass, VariableDeclarationExpression +from esphome.cpp_generator import AssignmentExpression, CallExpression, MockObj from .defines import ( CONF_DEFAULT, + CONF_FLEX_ALIGN_CROSS, + CONF_FLEX_ALIGN_MAIN, + CONF_FLEX_ALIGN_TRACK, + CONF_FLEX_FLOW, + CONF_GRID_COLUMN_ALIGN, + CONF_GRID_COLUMNS, + CONF_GRID_ROW_ALIGN, + CONF_GRID_ROWS, + CONF_LAYOUT, CONF_MAIN, CONF_SCROLLBAR_MODE, + CONF_STYLES, CONF_WIDGETS, OBJ_FLAGS, PARTS, STATES, - ConstantLiteral, + TYPE_FLEX, + TYPE_GRID, LValidator, join_enums, literal, ) from .helpers import add_lv_use -from .lvcode import add_group, add_line_marks, lv, lv_add, lv_assign, lv_expr, lv_obj -from .schemas import ALL_STYLES, STYLE_REMAP -from .types import WIDGET_TYPES, LvType, WidgetType, lv_obj_t, lv_obj_t_ptr +from .lvcode import ( + LvConditional, + add_line_marks, + lv, + lv_add, + lv_assign, + lv_expr, + lv_obj, + lv_Pvariable, +) +from .schemas import ALL_STYLES, STYLE_REMAP, WIDGET_TYPES +from .types import ( + LV_STATE, + LvType, + WidgetType, + lv_coord_t, + lv_group_t, + lv_obj_t, + lv_obj_t_ptr, +) EVENT_LAMB = "event_lamb__" +theme_widget_map = {} + class LvScrActType(WidgetType): """ @@ -37,9 +67,6 @@ class LvScrActType(WidgetType): def __init__(self): super().__init__("lv_scr_act()", lv_obj_t, ()) - def obj_creator(self, parent: MockObjClass, config: dict): - return [] - async def to_code(self, w, config: dict): return [] @@ -55,7 +82,7 @@ class Widget: def set_completed(): Widget.widgets_completed = True - def __init__(self, var, wtype: WidgetType, config: dict = None, parent=None): + def __init__(self, var, wtype: WidgetType, config: dict = None): self.var = var self.type = wtype self.config = config @@ -63,21 +90,18 @@ class Widget: self.step = 1.0 self.range_from = -sys.maxsize self.range_to = sys.maxsize - self.parent = parent + if wtype.is_compound(): + self.obj = MockObj(f"{self.var}->obj") + else: + self.obj = var @staticmethod - def create(name, var, wtype: WidgetType, config: dict = None, parent=None): - w = Widget(var, wtype, config, parent) + def create(name, var, wtype: WidgetType, config: dict = None): + w = Widget(var, wtype, config) if name is not None: widget_map[name] = w return w - @property - def obj(self): - if self.type.is_compound(): - return f"{self.var}->obj" - return self.var - def add_state(self, state): return lv_obj.add_state(self.obj, literal(state)) @@ -85,7 +109,13 @@ class Widget: return lv_obj.clear_state(self.obj, literal(state)) def has_state(self, state): - return lv_expr.obj_get_state(self.obj) & literal(state) != 0 + return (lv_expr.obj_get_state(self.obj) & literal(state)) != 0 + + def is_pressed(self): + return self.has_state(LV_STATE.PRESSED) + + def is_checked(self): + return self.has_state(LV_STATE.CHECKED) def add_flag(self, flag): return lv_obj.add_flag(self.obj, literal(flag)) @@ -93,32 +123,37 @@ class Widget: def clear_flag(self, flag): return lv_obj.clear_flag(self.obj, literal(flag)) - def set_property(self, prop, value, animated: bool = None, ltype=None): + async def set_property(self, prop, value, animated: bool = None): if isinstance(value, dict): value = value.get(prop) + if isinstance(ALL_STYLES.get(prop), LValidator): + value = await ALL_STYLES[prop].process(value) + else: + value = literal(value) if value is None: return if isinstance(value, TimePeriod): value = value.total_milliseconds - ltype = ltype or self.__type_base() + if isinstance(value, str): + value = literal(value) if animated is None or self.type.animated is not True: - lv.call(f"{ltype}_set_{prop}", self.obj, value) + lv.call(f"{self.type.lv_name}_set_{prop}", self.obj, value) else: lv.call( - f"{ltype}_set_{prop}", + f"{self.type.lv_name}_set_{prop}", self.obj, value, - "LV_ANIM_ON" if animated else "LV_ANIM_OFF", + literal("LV_ANIM_ON" if animated else "LV_ANIM_OFF"), ) def get_property(self, prop, ltype=None): ltype = ltype or self.__type_base() - return f"lv_{ltype}_get_{prop}({self.obj})" + return cg.RawExpression(f"lv_{ltype}_get_{prop}({self.obj})") def set_style(self, prop, value, state): if value is None: - return [] - return lv.call(f"obj_set_style_{prop}", self.obj, value, state) + return + lv.call(f"obj_set_style_{prop}", self.obj, value, state) def __type_base(self): wtype = self.type.w_type @@ -140,6 +175,32 @@ class Widget: return self.type.w_type.value(self) return self.obj + def get_number_value(self): + value = self.type.mock_obj.get_value(self.obj) + if self.scale == 1.0: + return value + return value / float(self.scale) + + def is_selected(self): + """ + Overridable property to determine if the widget is selected. Will be None except + for matrix buttons + :return: + """ + return None + + def get_max(self): + return self.type.get_max(self.config) + + def get_min(self): + return self.type.get_min(self.config) + + def get_step(self): + return self.type.get_step(self.config) + + def get_scale(self): + return self.type.get_scale(self.config) + # Map of widgets to their config, used for trigger generation widget_map: dict[Any, Widget] = {} @@ -161,13 +222,20 @@ def get_widget_generator(wid): yield -async def get_widget(config: dict, id: str = CONF_ID) -> Widget: - wid = config[id] +async def get_widget_(wid: Widget): if obj := widget_map.get(wid): return obj return await FakeAwaitable(get_widget_generator(wid)) +async def get_widgets(config: Union[dict, list], id: str = CONF_ID) -> list[Widget]: + if not config: + return [] + if not isinstance(config, list): + config = [config] + return [await get_widget_(c[id]) for c in config if id in c] + + def collect_props(config): """ Collect all properties from a configuration @@ -175,7 +243,7 @@ def collect_props(config): :return: """ props = {} - for prop in [*ALL_STYLES, *OBJ_FLAGS, CONF_GROUP]: + for prop in [*ALL_STYLES, *OBJ_FLAGS, CONF_STYLES, CONF_GROUP]: if prop in config: props[prop] = config[prop] return props @@ -209,12 +277,39 @@ def collect_parts(config): async def set_obj_properties(w: Widget, config): """Generate a list of C++ statements to apply properties to an lv_obj_t""" + if layout := config.get(CONF_LAYOUT): + layout_type: str = layout[CONF_TYPE] + lv_obj.set_layout(w.obj, literal(f"LV_LAYOUT_{layout_type.upper()}")) + if layout_type == TYPE_GRID: + wid = config[CONF_ID] + rows = "{" + ",".join(layout[CONF_GRID_ROWS]) + ", LV_GRID_TEMPLATE_LAST}" + row_id = ID(f"{wid}_row_dsc", is_declaration=True, type=lv_coord_t) + row_array = cg.static_const_array(row_id, cg.RawExpression(rows)) + w.set_style("grid_row_dsc_array", row_array, 0) + columns = ( + "{" + ",".join(layout[CONF_GRID_COLUMNS]) + ", LV_GRID_TEMPLATE_LAST}" + ) + column_id = ID(f"{wid}_column_dsc", is_declaration=True, type=lv_coord_t) + column_array = cg.static_const_array(column_id, cg.RawExpression(columns)) + w.set_style("grid_column_dsc_array", column_array, 0) + w.set_style( + CONF_GRID_COLUMN_ALIGN, literal(layout.get(CONF_GRID_COLUMN_ALIGN)), 0 + ) + w.set_style( + CONF_GRID_ROW_ALIGN, literal(layout.get(CONF_GRID_ROW_ALIGN)), 0 + ) + if layout_type == TYPE_FLEX: + lv_obj.set_flex_flow(w.obj, literal(layout[CONF_FLEX_FLOW])) + main = literal(layout[CONF_FLEX_ALIGN_MAIN]) + cross = literal(layout[CONF_FLEX_ALIGN_CROSS]) + track = literal(layout[CONF_FLEX_ALIGN_TRACK]) + lv_obj.set_flex_align(w.obj, main, cross, track) parts = collect_parts(config) for part, states in parts.items(): for state, props in states.items(): - lv_state = ConstantLiteral( - f"(int)LV_STATE_{state.upper()}|(int)LV_PART_{part.upper()}" - ) + lv_state = join_enums((f"LV_STATE_{state}", f"LV_PART_{part}")) + for style_id in props.get(CONF_STYLES, ()): + lv_obj.add_style(w.obj, MockObj(style_id), lv_state) for prop, value in { k: v for k, v in props.items() if k in ALL_STYLES }.items(): @@ -258,14 +353,12 @@ async def set_obj_properties(w: Widget, config): w.clear_state(clears) for key, value in lambs.items(): lamb = await cg.process_lambda(value, [], return_type=cg.bool_) - state = f"LV_STATE_{key.upper}" - lv.cond_if(lamb) - w.add_state(state) - lv.cond_else() - w.clear_state(state) - lv.cond_endif() - if scrollbar_mode := config.get(CONF_SCROLLBAR_MODE): - lv_obj.set_scrollbar_mode(w.obj, scrollbar_mode) + state = f"LV_STATE_{key.upper()}" + with LvConditional(f"{lamb}()") as cond: + w.add_state(state) + cond.else_() + w.clear_state(state) + await w.set_property(CONF_SCROLLBAR_MODE, config) async def add_widgets(parent: Widget, config: dict): @@ -280,7 +373,7 @@ async def add_widgets(parent: Widget, config: dict): await widget_to_code(w_cnfig, w_type, parent.obj) -async def widget_to_code(w_cnfig, w_type, parent): +async def widget_to_code(w_cnfig, w_type: WidgetType, parent): """ Converts a Widget definition to C code. :param w_cnfig: The widget configuration @@ -298,19 +391,33 @@ async def widget_to_code(w_cnfig, w_type, parent): var = cg.new_Pvariable(wid) lv_add(var.set_obj(creator)) else: - var = MockObj(wid, "->") - decl = VariableDeclarationExpression(lv_obj_t, "*", wid) - CORE.add_global(decl) - CORE.register_variable(wid, var) + var = lv_Pvariable(lv_obj_t, wid) lv_assign(var, creator) - widget = Widget.create(wid, var, spec, w_cnfig, parent) - await set_obj_properties(widget, w_cnfig) - await add_widgets(widget, w_cnfig) - await spec.to_code(widget, w_cnfig) + w = Widget.create(wid, var, spec, w_cnfig) + if theme := theme_widget_map.get(w_type): + lv_add(CallExpression(theme, w.obj)) + await set_obj_properties(w, w_cnfig) + await add_widgets(w, w_cnfig) + await spec.to_code(w, w_cnfig) lv_scr_act_spec = LvScrActType() -lv_scr_act = Widget.create( - None, ConstantLiteral("lv_scr_act()"), lv_scr_act_spec, {}, parent=None -) +lv_scr_act = Widget.create(None, literal("lv_scr_act()"), lv_scr_act_spec, {}) + +lv_groups = {} # Widget group names + + +def add_group(name): + if name is None: + return None + fullname = f"lv_esp_group_{name}" + if name not in lv_groups: + gid = ID(fullname, True, type=lv_group_t.operator("ptr")) + lv_add( + AssignmentExpression( + type_=gid.type, modifier="", name=fullname, rhs=lv_expr.group_create() + ) + ) + lv_groups[name] = literal(fullname) + return lv_groups[name] diff --git a/tests/components/lvgl/lvgl-package.yaml b/tests/components/lvgl/lvgl-package.yaml index fde700e0bd..0cca45d376 100644 --- a/tests/components/lvgl/lvgl-package.yaml +++ b/tests/components/lvgl/lvgl-package.yaml @@ -5,142 +5,229 @@ lvgl: - touchscreen_id: tft_touch long_press_repeat_time: 200ms long_press_time: 500ms - widgets: - - label: - id: hello_label - text: Hello world - text_color: 0xFF8000 - align: center - text_font: montserrat_40 - border_post: true - - - label: - text: "Hello shiny day" - text_color: 0xFFFFFF - align: bottom_mid - text_font: space16 - - obj: - align: center - arc_opa: COVER - arc_color: 0xFF0000 - arc_rounded: false - arc_width: 3 - anim_time: 1s - bg_color: light_blue - bg_grad_color: light_blue - bg_dither_mode: ordered - bg_grad_dir: hor - bg_grad_stop: 128 - bg_image_opa: transp - bg_image_recolor: light_blue - bg_image_recolor_opa: 50% - bg_main_stop: 0 - bg_opa: 20% - border_color: 0x00FF00 - border_opa: cover - border_post: true - border_side: [bottom, left] - border_width: 4 - clip_corner: false - height: 50% - image_recolor: light_blue - image_recolor_opa: cover - line_width: 10 - line_dash_width: 10 - line_dash_gap: 10 - line_rounded: false - line_color: light_blue - opa: cover - opa_layered: cover - outline_color: light_blue - outline_opa: cover - outline_pad: 10px - outline_width: 10px - pad_all: 10px - pad_bottom: 10px - pad_column: 10px - pad_left: 10px - pad_right: 10px - pad_row: 10px - pad_top: 10px - shadow_color: light_blue - shadow_ofs_x: 5 - shadow_ofs_y: 5 - shadow_opa: cover - shadow_spread: 5 - shadow_width: 10 - text_align: auto - text_color: light_blue - text_decor: [underline, strikethrough] - text_font: montserrat_18 - text_letter_space: 4 - text_line_space: 4 - text_opa: cover - transform_angle: 180 - transform_height: 100 - transform_pivot_x: 50% - transform_pivot_y: 50% - transform_zoom: 0.5 - translate_x: 10 - translate_y: 10 - max_height: 100 - max_width: 200 - min_height: 20% - min_width: 20% - radius: circle - width: 10px - x: 100 - y: 120 - - button: - width: 20% - height: 10% - pressed: - bg_color: light_blue - checkable: true - checked: - bg_color: 0x000000 - widgets: - - label: - text: Button - on_click: - lvgl.label.update: + pages: + - id: page1 + skip: true + widgets: + - label: id: hello_label - bg_color: 0x123456 - text: clicked - on_value: - logger.log: - format: "state now %d" - args: [x] - on_short_click: - lvgl.widget.hide: hello_label - on_long_press: - lvgl.widget.show: hello_label - on_cancel: - lvgl.widget.enable: hello_label - on_ready: - lvgl.widget.disable: hello_label - on_defocus: - lvgl.widget.hide: hello_label - on_focus: - logger.log: Button clicked - on_scroll: - logger.log: Button clicked - on_scroll_end: - logger.log: Button clicked - on_scroll_begin: - logger.log: Button clicked - on_release: - logger.log: Button clicked - on_long_press_repeat: - logger.log: Button clicked + text: Hello world + text_color: 0xFF8000 + align: center + text_font: montserrat_40 + border_post: true + - label: + text: "Hello shiny day" + text_color: 0xFFFFFF + align: bottom_mid + text_font: space16 + - obj: + align: center + arc_opa: COVER + arc_color: 0xFF0000 + arc_rounded: false + arc_width: 3 + anim_time: 1s + bg_color: light_blue + bg_grad_color: light_blue + bg_dither_mode: ordered + bg_grad_dir: hor + bg_grad_stop: 128 + bg_image_opa: transp + bg_image_recolor: light_blue + bg_image_recolor_opa: 50% + bg_main_stop: 0 + bg_opa: 20% + border_color: 0x00FF00 + border_opa: cover + border_post: true + border_side: [bottom, left] + border_width: 4 + clip_corner: false + height: 50% + image_recolor: light_blue + image_recolor_opa: cover + line_width: 10 + line_dash_width: 10 + line_dash_gap: 10 + line_rounded: false + line_color: light_blue + opa: cover + opa_layered: cover + outline_color: light_blue + outline_opa: cover + outline_pad: 10px + outline_width: 10px + pad_all: 10px + pad_bottom: 10px + pad_column: 10px + pad_left: 10px + pad_right: 10px + pad_row: 10px + pad_top: 10px + shadow_color: light_blue + shadow_ofs_x: 5 + shadow_ofs_y: 5 + shadow_opa: cover + shadow_spread: 5 + shadow_width: 10 + text_align: auto + text_color: light_blue + text_decor: [underline, strikethrough] + text_font: montserrat_18 + text_letter_space: 4 + text_line_space: 4 + text_opa: cover + transform_angle: 180 + transform_height: 100 + transform_pivot_x: 50% + transform_pivot_y: 50% + transform_zoom: 0.5 + translate_x: 10 + translate_y: 10 + max_height: 100 + max_width: 200 + min_height: 20% + min_width: 20% + radius: circle + width: 10px + x: 100 + y: 120 + - button: + width: 20% + height: 10% + pressed: + bg_color: light_blue + checkable: true + checked: + bg_color: 0x000000 + widgets: + - label: + text: Button + on_click: + lvgl.label.update: + id: hello_label + bg_color: 0x123456 + text: clicked + on_value: + logger.log: + format: "state now %d" + args: [x] + on_short_click: + lvgl.widget.hide: hello_label + on_long_press: + lvgl.widget.show: hello_label + on_cancel: + lvgl.widget.enable: hello_label + on_ready: + lvgl.widget.disable: hello_label + on_defocus: + lvgl.widget.hide: hello_label + on_focus: + logger.log: Button clicked + on_scroll: + logger.log: Button clicked + on_scroll_end: + logger.log: Button clicked + on_scroll_begin: + logger.log: Button clicked + on_release: + logger.log: Button clicked + on_long_press_repeat: + logger.log: Button clicked + - led: + color: 0x00FF00 + brightness: 50% + align: right_mid + - spinner: + arc_length: 120 + spin_time: 2s + align: left_mid + - image: + src: cat_image + align: top_left + y: 50 + + - id: page2 + widgets: + - arc: + align: left_mid + id: lv_arc + adjustable: true + on_value: + then: + - logger.log: + format: "Arc value is %f" + args: [x] + group: general + scroll_on_focus: true + value: 75 + min_value: 1 + max_value: 100 + arc_color: 0xFF0000 + indicator: + arc_color: 0xF000FF + pressed: + arc_color: 0xFFFF00 + focused: + arc_color: 0x808080 + - bar: + id: bar_id + align: top_mid + y: 20 + value: 30 + max_value: 100 + min_value: 10 + mode: range + on_click: + then: + - lvgl.bar.update: + id: bar_id + value: !lambda return (int)((float)rand() / RAND_MAX * 100); + - logger.log: + format: "bar value %f" + args: [x] + - line: + align: center + points: + - 5, 5 + - 70, 70 + - 120, 10 + - 180, 60 + - 240, 10 + on_click: + lvgl.page.next: + - switch: + align: right_mid + - checkbox: + text: Checkbox + align: bottom_right + - slider: + id: slider_id + align: top_mid + y: 40 + value: 30 + max_value: 100 + min_value: 10 + mode: normal + on_value: + then: + - logger.log: + format: "slider value %f" + args: [x] + on_click: + then: + - lvgl.slider.update: + id: slider_id + value: !lambda return (int)((float)rand() / RAND_MAX * 100); font: - file: "gfonts://Roboto" id: space16 bpp: 4 image: - - id: cat_img + - id: cat_image resize: 256x48 file: $component_dir/logo-text.svg - id: dog_img From e02319dcff75a003b5551866c701dd81803022c8 Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Mon, 5 Aug 2024 12:09:54 -0400 Subject: [PATCH 089/164] [esp32_improv] Update Improv library to reference new repo/version (#7195) --- esphome/components/esp32_improv/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/esp32_improv/__init__.py b/esphome/components/esp32_improv/__init__.py index 62d9cd376c..705dff0f1b 100644 --- a/esphome/components/esp32_improv/__init__.py +++ b/esphome/components/esp32_improv/__init__.py @@ -1,9 +1,8 @@ import esphome.codegen as cg +from esphome.components import binary_sensor, esp32_ble_server, output import esphome.config_validation as cv -from esphome.components import binary_sensor, output, esp32_ble_server from esphome.const import CONF_ID - AUTO_LOAD = ["esp32_ble_server"] CODEOWNERS = ["@jesserockz"] DEPENDENCIES = ["wifi", "esp32"] @@ -50,7 +49,7 @@ async def to_code(config): cg.add(ble_server.register_service_component(var)) cg.add_define("USE_IMPROV") - cg.add_library("esphome/Improv", "1.2.3") + cg.add_library("improv/Improv", "1.2.4") cg.add(var.set_identify_duration(config[CONF_IDENTIFY_DURATION])) cg.add(var.set_authorized_duration(config[CONF_AUTHORIZED_DURATION])) From f737ca6e286f36e243b5bae1bcb7515b9a4bf857 Mon Sep 17 00:00:00 2001 From: Daniel Kraft Date: Mon, 5 Aug 2024 23:17:02 +0200 Subject: [PATCH 090/164] hydreon_rgxx: Fix parsing of data line (#7192) --- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/hydreon_rgxx/hydreon_rgxx.cpp b/esphome/components/hydreon_rgxx/hydreon_rgxx.cpp index 95702fe9e8..92d7774193 100644 --- a/esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +++ b/esphome/components/hydreon_rgxx/hydreon_rgxx.cpp @@ -236,7 +236,7 @@ void HydreonRGxxComponent::process_line_() { } bool is_data_line = false; for (int i = 0; i < NUM_SENSORS; i++) { - if (this->sensors_[i] != nullptr && this->buffer_starts_with_(PROTOCOL_NAMES[i])) { + if (this->sensors_[i] != nullptr && this->buffer_.find(PROTOCOL_NAMES[i]) != std::string::npos) { is_data_line = true; break; } From acaec41bb765949f37c04cf34b77e0f73df26272 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Tue, 6 Aug 2024 01:40:34 +0200 Subject: [PATCH 091/164] Remove outdated version block (#7177) --- esphome/__main__.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 7237a04717..5c197ff486 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -972,13 +972,6 @@ def run_esphome(argv): args.command == "dashboard", ) - if sys.version_info < (3, 8, 0): - _LOGGER.error( - "You're running ESPHome with Python <3.8. ESPHome is no longer compatible " - "with this Python version. Please reinstall ESPHome with Python 3.8+" - ) - return 1 - if args.command in PRE_CONFIG_ACTIONS: try: return PRE_CONFIG_ACTIONS[args.command](args) From 6b141102d62930778552db1f2bdf23bdc20b1d86 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:17:29 +1000 Subject: [PATCH 092/164] [lvgl] Stage 5 (#7191) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/lvgl/__init__.py | 25 +- esphome/components/lvgl/animimg.py | 2 +- esphome/components/lvgl/automation.py | 2 +- esphome/components/lvgl/{btn.py => button.py} | 8 +- esphome/components/lvgl/buttonmatrix.py | 277 ++++++++++++++++ esphome/components/lvgl/checkbox.py | 2 +- esphome/components/lvgl/defines.py | 2 +- esphome/components/lvgl/dropdown.py | 76 +++++ esphome/components/lvgl/img.py | 8 +- esphome/components/lvgl/keyboard.py | 49 +++ esphome/components/lvgl/led.py | 4 +- esphome/components/lvgl/lvgl_esphome.cpp | 4 +- esphome/components/lvgl/lvgl_esphome.h | 2 +- esphome/components/lvgl/meter.py | 302 ++++++++++++++++++ esphome/components/lvgl/msgbox.py | 127 ++++++++ esphome/components/lvgl/roller.py | 77 +++++ esphome/components/lvgl/spinbox.py | 178 +++++++++++ esphome/components/lvgl/styles.py | 2 +- esphome/components/lvgl/tabview.py | 114 +++++++ esphome/components/lvgl/textarea.py | 67 ++++ esphome/components/lvgl/tileview.py | 128 ++++++++ esphome/components/lvgl/widget.py | 8 +- esphome/core/defines.h | 3 + tests/components/lvgl/.gitattributes | 2 + tests/components/lvgl/common.yaml | 46 +++ tests/components/lvgl/helvetica.ttf | Bin 0 -> 83644 bytes tests/components/lvgl/lvgl-package.yaml | 228 ++++++++++++- .../lvgl/materialdesignicons-webfont.ttf | Bin 0 -> 1307419 bytes tests/components/lvgl/roboto.ttf | Bin 0 -> 171676 bytes 29 files changed, 1716 insertions(+), 27 deletions(-) rename esphome/components/lvgl/{btn.py => button.py} (58%) create mode 100644 esphome/components/lvgl/buttonmatrix.py create mode 100644 esphome/components/lvgl/dropdown.py create mode 100644 esphome/components/lvgl/keyboard.py create mode 100644 esphome/components/lvgl/meter.py create mode 100644 esphome/components/lvgl/msgbox.py create mode 100644 esphome/components/lvgl/roller.py create mode 100644 esphome/components/lvgl/spinbox.py create mode 100644 esphome/components/lvgl/tabview.py create mode 100644 esphome/components/lvgl/textarea.py create mode 100644 esphome/components/lvgl/tileview.py create mode 100644 tests/components/lvgl/.gitattributes create mode 100644 tests/components/lvgl/helvetica.ttf create mode 100644 tests/components/lvgl/materialdesignicons-webfont.ttf create mode 100644 tests/components/lvgl/roboto.ttf diff --git a/esphome/components/lvgl/__init__.py b/esphome/components/lvgl/__init__.py index c154689199..a963fca98b 100644 --- a/esphome/components/lvgl/__init__.py +++ b/esphome/components/lvgl/__init__.py @@ -24,10 +24,13 @@ from . import defines as df, helpers, lv_validation as lvalid from .animimg import animimg_spec from .arc import arc_spec from .automation import disp_update, update_to_code -from .btn import btn_spec +from .button import button_spec +from .buttonmatrix import buttonmatrix_spec from .checkbox import checkbox_spec from .defines import CONF_SKIP +from .dropdown import dropdown_spec from .img import img_spec +from .keyboard import keyboard_spec from .label import label_spec from .led import led_spec from .line import line_spec @@ -35,8 +38,11 @@ from .lv_bar import bar_spec from .lv_switch import switch_spec from .lv_validation import lv_bool, lv_images_used from .lvcode import LvContext, LvglComponent +from .meter import meter_spec +from .msgbox import MSGBOX_SCHEMA, msgboxes_to_code from .obj import obj_spec from .page import add_pages, page_spec +from .roller import roller_spec from .rotary_encoders import ROTARY_ENCODER_CONFIG, rotary_encoders_to_code from .schemas import ( DISP_BG_SCHEMA, @@ -52,8 +58,12 @@ from .schemas import ( obj_schema, ) from .slider import slider_spec +from .spinbox import spinbox_spec from .spinner import spinner_spec from .styles import add_top_layer, styles_to_code, theme_to_code +from .tabview import tabview_spec +from .textarea import textarea_spec +from .tileview import tileview_spec from .touchscreens import touchscreen_schema, touchscreens_to_code from .trigger import generate_triggers from .types import ( @@ -75,7 +85,7 @@ LOGGER = logging.getLogger(__name__) for w_type in ( label_spec, obj_spec, - btn_spec, + button_spec, bar_spec, slider_spec, arc_spec, @@ -86,6 +96,15 @@ for w_type in ( checkbox_spec, img_spec, switch_spec, + tabview_spec, + buttonmatrix_spec, + meter_spec, + dropdown_spec, + roller_spec, + textarea_spec, + spinbox_spec, + keyboard_spec, + tileview_spec, ): WIDGET_TYPES[w_type.name] = w_type @@ -244,6 +263,7 @@ async def to_code(config): await add_widgets(lv_scr_act, config) await add_pages(lv_component, config) await add_top_layer(config) + await msgboxes_to_code(config) await disp_update(f"{lv_component}->get_disp()", config) Widget.set_completed() await generate_triggers(lv_component) @@ -308,6 +328,7 @@ CONFIG_SCHEMA = ( cv.Exclusive(CONF_PAGES, CONF_PAGES): cv.ensure_list( container_schema(page_spec) ), + cv.Optional(df.CONF_MSGBOXES): cv.ensure_list(MSGBOX_SCHEMA), cv.Optional(df.CONF_PAGE_WRAP, default=True): lv_bool, cv.Optional(df.CONF_TOP_LAYER): container_schema(obj_spec), cv.Optional(df.CONF_TRANSPARENCY_KEY, default=0x000400): lvalid.lv_color, diff --git a/esphome/components/lvgl/animimg.py b/esphome/components/lvgl/animimg.py index 20b85b019c..ad84713d7f 100644 --- a/esphome/components/lvgl/animimg.py +++ b/esphome/components/lvgl/animimg.py @@ -2,8 +2,8 @@ from esphome import automation import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import CONF_DURATION, CONF_ID +from esphome.cpp_generator import MockObj -from ...cpp_generator import MockObj from .automation import action_to_code from .defines import CONF_AUTO_START, CONF_MAIN, CONF_REPEAT_COUNT, CONF_SRC from .helpers import lvgl_components_required diff --git a/esphome/components/lvgl/automation.py b/esphome/components/lvgl/automation.py index ffa25783ad..7a862fb58b 100644 --- a/esphome/components/lvgl/automation.py +++ b/esphome/components/lvgl/automation.py @@ -109,7 +109,7 @@ async def disp_update(disp, config: dict): if CONF_DISP_BG_COLOR not in config and CONF_DISP_BG_IMAGE not in config: return with LocalVariable("lv_disp_tmp", lv_disp_t, literal(disp)) as disp_temp: - if bg_color := config.get(CONF_DISP_BG_COLOR): + if (bg_color := config.get(CONF_DISP_BG_COLOR)) is not None: lv.disp_set_bg_color(disp_temp, await lv_color.process(bg_color)) if bg_image := config.get(CONF_DISP_BG_IMAGE): lv.disp_set_bg_image(disp_temp, await lv_image.process(bg_image)) diff --git a/esphome/components/lvgl/btn.py b/esphome/components/lvgl/button.py similarity index 58% rename from esphome/components/lvgl/btn.py rename to esphome/components/lvgl/button.py index 2a2a53e1e2..96329b3fa9 100644 --- a/esphome/components/lvgl/btn.py +++ b/esphome/components/lvgl/button.py @@ -3,12 +3,12 @@ from esphome.const import CONF_BUTTON from .defines import CONF_MAIN from .types import LvBoolean, WidgetType -lv_btn_t = LvBoolean("lv_btn_t") +lv_button_t = LvBoolean("lv_btn_t") -class BtnType(WidgetType): +class ButtonType(WidgetType): def __init__(self): - super().__init__(CONF_BUTTON, lv_btn_t, (CONF_MAIN,), lv_name="btn") + super().__init__(CONF_BUTTON, lv_button_t, (CONF_MAIN,), lv_name="btn") def get_uses(self): return ("btn",) @@ -17,4 +17,4 @@ class BtnType(WidgetType): return [] -btn_spec = BtnType() +button_spec = ButtonType() diff --git a/esphome/components/lvgl/buttonmatrix.py b/esphome/components/lvgl/buttonmatrix.py new file mode 100644 index 0000000000..75ed43f909 --- /dev/null +++ b/esphome/components/lvgl/buttonmatrix.py @@ -0,0 +1,277 @@ +from esphome import automation +import esphome.codegen as cg +from esphome.components.key_provider import KeyProvider +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_WIDTH +from esphome.cpp_generator import MockObj + +from .automation import action_to_code +from .button import lv_button_t +from .defines import ( + BUTTONMATRIX_CTRLS, + CONF_BUTTONS, + CONF_CONTROL, + CONF_ITEMS, + CONF_KEY_CODE, + CONF_MAIN, + CONF_ONE_CHECKED, + CONF_ROWS, + CONF_SELECTED, + CONF_TEXT, +) +from .helpers import lvgl_components_required +from .lv_validation import key_code, lv_bool +from .lvcode import lv, lv_add, lv_expr +from .schemas import automation_schema +from .types import ( + LV_BTNMATRIX_CTRL, + LV_STATE, + LvBoolean, + LvCompound, + LvType, + ObjUpdateAction, + char_ptr, + lv_pseudo_button_t, +) +from .widget import Widget, WidgetType, get_widgets, widget_map + +CONF_BUTTONMATRIX = "buttonmatrix" +CONF_BUTTON_TEXT_LIST_ID = "button_text_list_id" + +LvButtonMatrixButton = LvBoolean( + str(cg.uint16), + parents=(lv_pseudo_button_t,), +) +BUTTONMATRIX_BUTTON_SCHEMA = cv.Schema( + { + cv.Optional(CONF_TEXT): cv.string, + cv.Optional(CONF_KEY_CODE): key_code, + cv.GenerateID(): cv.declare_id(LvButtonMatrixButton), + cv.Optional(CONF_WIDTH, default=1): cv.positive_int, + cv.Optional(CONF_CONTROL): cv.ensure_list( + cv.Schema( + {cv.Optional(k.lower()): cv.boolean for k in BUTTONMATRIX_CTRLS.choices} + ) + ), + } +).extend(automation_schema(lv_button_t)) + +BUTTONMATRIX_SCHEMA = cv.Schema( + { + cv.Optional(CONF_ONE_CHECKED, default=False): lv_bool, + cv.GenerateID(CONF_BUTTON_TEXT_LIST_ID): cv.declare_id(char_ptr), + cv.Required(CONF_ROWS): cv.ensure_list( + cv.Schema( + { + cv.Required(CONF_BUTTONS): cv.ensure_list( + BUTTONMATRIX_BUTTON_SCHEMA + ), + } + ) + ), + } +) + + +class ButtonmatrixButtonType(WidgetType): + """ + A pseudo-widget for the matrix buttons + """ + + def __init__(self): + super().__init__("btnmatrix_btn", LvButtonMatrixButton, (), {}, {}) + + async def to_code(self, w, config: dict): + return [] + + +btn_btn_spec = ButtonmatrixButtonType() + + +class MatrixButton(Widget): + """ + Describes a button within a button matrix. + """ + + @staticmethod + def create_button(id, parent, config: dict, index): + w = MatrixButton(id, parent, config, index) + widget_map[id] = w + return w + + def __init__(self, id, parent: Widget, config, index): + super().__init__(id, btn_btn_spec, config) + self.parent = parent + self.index = index + self.obj = parent.obj + + def is_selected(self): + return self.parent.var.get_selected() == MockObj(self.var) + + @staticmethod + def map_ctrls(state): + state = str(state).upper().removeprefix("LV_STATE_") + assert state in BUTTONMATRIX_CTRLS.choices + return getattr(LV_BTNMATRIX_CTRL, state) + + def has_state(self, state): + state = self.map_ctrls(state) + return lv_expr.btnmatrix_has_btn_ctrl(self.obj, self.index, state) + + def add_state(self, state): + state = self.map_ctrls(state) + return lv.btnmatrix_set_btn_ctrl(self.obj, self.index, state) + + def clear_state(self, state): + state = self.map_ctrls(state) + return lv.btnmatrix_clear_btn_ctrl(self.obj, self.index, state) + + def is_pressed(self): + return self.is_selected() & self.parent.has_state(LV_STATE.PRESSED) + + def is_checked(self): + return self.has_state(LV_STATE.CHECKED) + + def get_value(self): + return self.is_checked() + + def check_null(self): + return None + + +async def get_button_data(config, buttonmatrix: Widget): + """ + Process a button matrix button list + :param config: The row list + :param buttonmatrix: The parent variable + :return: text array id, control list, width list + """ + text_list = [] + ctrl_list = [] + width_list = [] + key_list = [] + for row in config: + for button_conf in row.get(CONF_BUTTONS) or (): + bid = button_conf[CONF_ID] + index = len(width_list) + MatrixButton.create_button(bid, buttonmatrix, button_conf, index) + cg.new_variable(bid, index) + text_list.append(button_conf.get(CONF_TEXT) or "") + key_list.append(button_conf.get(CONF_KEY_CODE) or 0) + width_list.append(button_conf[CONF_WIDTH]) + ctrl = ["LV_BTNMATRIX_CTRL_CLICK_TRIG"] + for item in button_conf.get(CONF_CONTROL, ()): + ctrl.extend([k for k, v in item.items() if v]) + ctrl_list.append(await BUTTONMATRIX_CTRLS.process(ctrl)) + text_list.append("\n") + text_list = text_list[:-1] + text_list.append(cg.nullptr) + return text_list, ctrl_list, width_list, key_list + + +lv_buttonmatrix_t = LvType( + "LvButtonMatrixType", + parents=(KeyProvider, LvCompound), + largs=[(cg.uint16, "x")], + lvalue=lambda w: w.var.get_selected(), +) + + +class ButtonMatrixType(WidgetType): + def __init__(self): + super().__init__( + CONF_BUTTONMATRIX, + lv_buttonmatrix_t, + (CONF_MAIN, CONF_ITEMS), + BUTTONMATRIX_SCHEMA, + {}, + lv_name="btnmatrix", + ) + + async def to_code(self, w: Widget, config): + lvgl_components_required.add("BUTTONMATRIX") + if CONF_ROWS not in config: + return [] + text_list, ctrl_list, width_list, key_list = await get_button_data( + config[CONF_ROWS], w + ) + text_id = config[CONF_BUTTON_TEXT_LIST_ID] + text_id = cg.static_const_array(text_id, text_list) + lv.btnmatrix_set_map(w.obj, text_id) + set_btn_data(w.obj, ctrl_list, width_list) + lv.btnmatrix_set_one_checked(w.obj, config[CONF_ONE_CHECKED]) + for index, key in enumerate(key_list): + if key != 0: + lv_add(w.var.set_key(index, key)) + + def get_uses(self): + return ("btnmatrix",) + + +def set_btn_data(obj, ctrl_list, width_list): + for index, ctrl in enumerate(ctrl_list): + lv.btnmatrix_set_btn_ctrl(obj, index, ctrl) + for index, width in enumerate(width_list): + lv.btnmatrix_set_btn_width(obj, index, width) + + +buttonmatrix_spec = ButtonMatrixType() + + +@automation.register_action( + "lvgl.matrix.button.update", + ObjUpdateAction, + cv.Schema( + { + cv.Optional(CONF_WIDTH): cv.positive_int, + cv.Optional(CONF_CONTROL): cv.ensure_list( + cv.Schema( + { + cv.Optional(k.lower()): cv.boolean + for k in BUTTONMATRIX_CTRLS.choices + } + ), + ), + cv.Required(CONF_ID): cv.ensure_list( + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(LvButtonMatrixButton), + }, + key=CONF_ID, + ) + ), + cv.Optional(CONF_SELECTED): lv_bool, + } + ), +) +async def button_update_to_code(config, action_id, template_arg, args): + widgets = await get_widgets(config[CONF_ID]) + assert all(isinstance(w, MatrixButton) for w in widgets) + + async def do_button_update(w: MatrixButton): + if (width := config.get(CONF_WIDTH)) is not None: + lv.btnmatrix_set_btn_width(w.obj, w.index, width) + if config.get(CONF_SELECTED): + lv.btnmatrix_set_selected_btn(w.obj, w.index) + if controls := config.get(CONF_CONTROL): + adds = [] + clrs = [] + for item in controls: + adds.extend( + [f"LV_BTNMATRIX_CTRL_{k.upper()}" for k, v in item.items() if v] + ) + clrs.extend( + [f"LV_BTNMATRIX_CTRL_{k.upper()}" for k, v in item.items() if not v] + ) + if adds: + lv.btnmatrix_set_btn_ctrl( + w.obj, w.index, await BUTTONMATRIX_CTRLS.process(adds) + ) + if clrs: + lv.btnmatrix_clear_btn_ctrl( + w.obj, w.index, await BUTTONMATRIX_CTRLS.process(clrs) + ) + + return await action_to_code( + widgets, do_button_update, action_id, template_arg, args + ) diff --git a/esphome/components/lvgl/checkbox.py b/esphome/components/lvgl/checkbox.py index 7418d633cf..be7b029269 100644 --- a/esphome/components/lvgl/checkbox.py +++ b/esphome/components/lvgl/checkbox.py @@ -18,7 +18,7 @@ class CheckboxType(WidgetType): ) async def to_code(self, w: Widget, config): - if value := config.get(CONF_TEXT): + if (value := config.get(CONF_TEXT)) is not None: lv.checkbox_set_text(w.obj, await lv_text.process(value)) diff --git a/esphome/components/lvgl/defines.py b/esphome/components/lvgl/defines.py index 16ec45ae8a..ac28f9ed5f 100644 --- a/esphome/components/lvgl/defines.py +++ b/esphome/components/lvgl/defines.py @@ -304,7 +304,7 @@ OBJ_FLAGS = ( ARC_MODES = LvConstant("LV_ARC_MODE_", "NORMAL", "REVERSE", "SYMMETRICAL") BAR_MODES = LvConstant("LV_BAR_MODE_", "NORMAL", "SYMMETRICAL", "RANGE") -BTNMATRIX_CTRLS = LvConstant( +BUTTONMATRIX_CTRLS = LvConstant( "LV_BTNMATRIX_CTRL_", "HIDDEN", "NO_REPEAT", diff --git a/esphome/components/lvgl/dropdown.py b/esphome/components/lvgl/dropdown.py new file mode 100644 index 0000000000..d7bdebaade --- /dev/null +++ b/esphome/components/lvgl/dropdown.py @@ -0,0 +1,76 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_OPTIONS + +from .defines import ( + CONF_DIR, + CONF_INDICATOR, + CONF_MAIN, + CONF_SELECTED_INDEX, + CONF_SYMBOL, + DIRECTIONS, + literal, +) +from .label import CONF_LABEL +from .lv_validation import lv_int, lv_text, option_string +from .lvcode import LocalVariable, lv, lv_expr +from .schemas import part_schema +from .types import LvSelect, LvType, lv_obj_t +from .widget import Widget, WidgetType, set_obj_properties + +CONF_DROPDOWN = "dropdown" +CONF_DROPDOWN_LIST = "dropdown_list" + +lv_dropdown_t = LvSelect("lv_dropdown_t") +lv_dropdown_list_t = LvType("lv_dropdown_list_t") +dropdown_list_spec = WidgetType(CONF_DROPDOWN_LIST, lv_dropdown_list_t, (CONF_MAIN,)) + +DROPDOWN_BASE_SCHEMA = cv.Schema( + { + cv.Optional(CONF_SYMBOL): lv_text, + cv.Optional(CONF_SELECTED_INDEX): cv.templatable(cv.int_), + cv.Optional(CONF_DIR, default="BOTTOM"): DIRECTIONS.one_of, + cv.Optional(CONF_DROPDOWN_LIST): part_schema(dropdown_list_spec), + } +) + +DROPDOWN_SCHEMA = DROPDOWN_BASE_SCHEMA.extend( + { + cv.Required(CONF_OPTIONS): cv.ensure_list(option_string), + } +) + + +class DropdownType(WidgetType): + def __init__(self): + super().__init__( + CONF_DROPDOWN, + lv_dropdown_t, + (CONF_MAIN, CONF_INDICATOR), + DROPDOWN_SCHEMA, + DROPDOWN_BASE_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + if options := config.get(CONF_OPTIONS): + text = cg.safe_exp("\n".join(options)) + lv.dropdown_set_options(w.obj, text) + if symbol := config.get(CONF_SYMBOL): + lv.dropdown_set_symbol(w.obj, await lv_text.process(symbol)) + if (selected := config.get(CONF_SELECTED_INDEX)) is not None: + value = await lv_int.process(selected) + lv.dropdown_set_selected(w.obj, value) + if dirn := config.get(CONF_DIR): + lv.dropdown_set_dir(w.obj, literal(dirn)) + if dlist := config.get(CONF_DROPDOWN_LIST): + with LocalVariable( + "dropdown_list", lv_obj_t, lv_expr.dropdown_get_list(w.obj) + ) as dlist_obj: + dwid = Widget(dlist_obj, dropdown_list_spec, dlist) + await set_obj_properties(dwid, dlist) + + def get_uses(self): + return (CONF_LABEL,) + + +dropdown_spec = DropdownType() diff --git a/esphome/components/lvgl/img.py b/esphome/components/lvgl/img.py index e9682def8c..dd962fcf31 100644 --- a/esphome/components/lvgl/img.py +++ b/esphome/components/lvgl/img.py @@ -65,16 +65,16 @@ class ImgType(WidgetType): async def to_code(self, w: Widget, config): if src := config.get(CONF_SRC): lv.img_set_src(w.obj, await lv_image.process(src)) - if cf_angle := config.get(CONF_ANGLE): + if (cf_angle := config.get(CONF_ANGLE)) is not None: pivot_x = config[CONF_PIVOT_X] pivot_y = config[CONF_PIVOT_Y] lv.img_set_pivot(w.obj, pivot_x, pivot_y) lv.img_set_angle(w.obj, cf_angle) - if img_zoom := config.get(CONF_ZOOM): + if (img_zoom := config.get(CONF_ZOOM)) is not None: lv.img_set_zoom(w.obj, img_zoom) - if offset := config.get(CONF_OFFSET_X): + if (offset := config.get(CONF_OFFSET_X)) is not None: lv.img_set_offset_x(w.obj, offset) - if offset := config.get(CONF_OFFSET_Y): + if (offset := config.get(CONF_OFFSET_Y)) is not None: lv.img_set_offset_y(w.obj, offset) if CONF_ANTIALIAS in config: lv.img_set_antialias(w.obj, config[CONF_ANTIALIAS]) diff --git a/esphome/components/lvgl/keyboard.py b/esphome/components/lvgl/keyboard.py new file mode 100644 index 0000000000..7ce73d2170 --- /dev/null +++ b/esphome/components/lvgl/keyboard.py @@ -0,0 +1,49 @@ +from esphome.components.key_provider import KeyProvider +import esphome.config_validation as cv +from esphome.const import CONF_MODE +from esphome.cpp_types import std_string + +from .defines import CONF_ITEMS, CONF_MAIN, KEYBOARD_MODES, literal +from .helpers import add_lv_use, lvgl_components_required +from .textarea import CONF_TEXTAREA, lv_textarea_t +from .types import LvCompound, LvType +from .widget import Widget, WidgetType, get_widgets + +CONF_KEYBOARD = "keyboard" + +KEYBOARD_SCHEMA = { + cv.Optional(CONF_MODE, default="TEXT_UPPER"): KEYBOARD_MODES.one_of, + cv.Optional(CONF_TEXTAREA): cv.use_id(lv_textarea_t), +} + +lv_keyboard_t = LvType( + "LvKeyboardType", + parents=(KeyProvider, LvCompound), + largs=[(std_string, "text")], + has_on_value=True, + lvalue=lambda w: literal(f"lv_textarea_get_text({w.obj})"), +) + + +class KeyboardType(WidgetType): + def __init__(self): + super().__init__( + CONF_KEYBOARD, + lv_keyboard_t, + (CONF_MAIN, CONF_ITEMS), + KEYBOARD_SCHEMA, + ) + + def get_uses(self): + return CONF_KEYBOARD, CONF_TEXTAREA + + async def to_code(self, w: Widget, config: dict): + lvgl_components_required.add("KEY_LISTENER") + lvgl_components_required.add(CONF_KEYBOARD) + add_lv_use("btnmatrix") + await w.set_property(CONF_MODE, await KEYBOARD_MODES.process(config[CONF_MODE])) + if ta := await get_widgets(config, CONF_TEXTAREA): + await w.set_property(CONF_TEXTAREA, ta[0].obj) + + +keyboard_spec = KeyboardType() diff --git a/esphome/components/lvgl/led.py b/esphome/components/lvgl/led.py index f920758efb..9b6e819278 100644 --- a/esphome/components/lvgl/led.py +++ b/esphome/components/lvgl/led.py @@ -20,9 +20,9 @@ class LedType(WidgetType): super().__init__(CONF_LED, LvType("lv_led_t"), (CONF_MAIN,), LED_SCHEMA) async def to_code(self, w: Widget, config): - if color := config.get(CONF_COLOR): + if (color := config.get(CONF_COLOR)) is not None: lv.led_set_color(w.obj, await lv_color.process(color)) - if brightness := config.get(CONF_BRIGHTNESS): + if (brightness := config.get(CONF_BRIGHTNESS)) is not None: lv.led_set_brightness(w.obj, await lv_brightness.process(brightness)) diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp index 1221682d28..544643d532 100644 --- a/esphome/components/lvgl/lvgl_esphome.cpp +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -146,12 +146,12 @@ LVEncoderListener::LVEncoderListener(lv_indev_type_t type, uint16_t lpt, uint16_ #endif // USE_LVGL_ROTARY_ENCODER #ifdef USE_LVGL_BUTTONMATRIX -void LvBtnmatrixType::set_obj(lv_obj_t *lv_obj) { +void LvButtonMatrixType::set_obj(lv_obj_t *lv_obj) { LvCompound::set_obj(lv_obj); lv_obj_add_event_cb( lv_obj, [](lv_event_t *event) { - auto *self = static_cast(event->user_data); + auto *self = static_cast(event->user_data); if (self->key_callback_.size() == 0) return; auto key_idx = lv_btnmatrix_get_selected_btn(self->obj); diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h index b92799addd..71e0fd069f 100644 --- a/esphome/components/lvgl/lvgl_esphome.h +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -246,7 +246,7 @@ class LVEncoderListener : public Parented { }; #endif // USE_LVGL_ROTARY_ENCODER #ifdef USE_LVGL_BUTTONMATRIX -class LvBtnmatrixType : public key_provider::KeyProvider, public LvCompound { +class LvButtonMatrixType : public key_provider::KeyProvider, public LvCompound { public: void set_obj(lv_obj_t *lv_obj) override; uint16_t get_selected() { return lv_btnmatrix_get_selected_btn(this->obj); } diff --git a/esphome/components/lvgl/meter.py b/esphome/components/lvgl/meter.py new file mode 100644 index 0000000000..1a6bef7c57 --- /dev/null +++ b/esphome/components/lvgl/meter.py @@ -0,0 +1,302 @@ +from esphome import automation +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import ( + CONF_COLOR, + CONF_COUNT, + CONF_ID, + CONF_LENGTH, + CONF_LOCAL, + CONF_RANGE_FROM, + CONF_RANGE_TO, + CONF_ROTATION, + CONF_VALUE, + CONF_WIDTH, +) + +from .arc import CONF_ARC +from .automation import action_to_code +from .defines import ( + CONF_END_VALUE, + CONF_MAIN, + CONF_PIVOT_X, + CONF_PIVOT_Y, + CONF_SRC, + CONF_START_VALUE, + CONF_TICKS, +) +from .helpers import add_lv_use +from .img import CONF_IMAGE +from .line import CONF_LINE +from .lv_validation import ( + angle, + get_end_value, + get_start_value, + lv_bool, + lv_color, + lv_float, + lv_image, + requires_component, + size, +) +from .lvcode import LocalVariable, lv, lv_assign, lv_expr +from .obj import obj_spec +from .types import LvType, ObjUpdateAction +from .widget import Widget, WidgetType, get_widgets + +CONF_ANGLE_RANGE = "angle_range" +CONF_COLOR_END = "color_end" +CONF_COLOR_START = "color_start" +CONF_INDICATORS = "indicators" +CONF_LABEL_GAP = "label_gap" +CONF_MAJOR = "major" +CONF_METER = "meter" +CONF_R_MOD = "r_mod" +CONF_SCALES = "scales" +CONF_STRIDE = "stride" +CONF_TICK_STYLE = "tick_style" + +lv_meter_t = LvType("lv_meter_t") +lv_meter_indicator_t = cg.global_ns.struct("lv_meter_indicator_t") +lv_meter_indicator_t_ptr = lv_meter_indicator_t.operator("ptr") + + +def pixels(value): + """A size in one axis in pixels""" + if isinstance(value, str) and value.lower().endswith("px"): + return cv.int_(value[:-2]) + return cv.int_(value) + + +INDICATOR_LINE_SCHEMA = cv.Schema( + { + cv.Optional(CONF_WIDTH, default=4): size, + cv.Optional(CONF_COLOR, default=0): lv_color, + cv.Optional(CONF_R_MOD, default=0): size, + cv.Optional(CONF_VALUE): lv_float, + } +) +INDICATOR_IMG_SCHEMA = cv.Schema( + { + cv.Required(CONF_SRC): lv_image, + cv.Required(CONF_PIVOT_X): pixels, + cv.Required(CONF_PIVOT_Y): pixels, + cv.Optional(CONF_VALUE): lv_float, + } +) +INDICATOR_ARC_SCHEMA = cv.Schema( + { + cv.Optional(CONF_WIDTH, default=4): size, + cv.Optional(CONF_COLOR, default=0): lv_color, + cv.Optional(CONF_R_MOD, default=0): size, + cv.Exclusive(CONF_VALUE, CONF_VALUE): lv_float, + cv.Exclusive(CONF_START_VALUE, CONF_VALUE): lv_float, + cv.Optional(CONF_END_VALUE): lv_float, + } +) +INDICATOR_TICKS_SCHEMA = cv.Schema( + { + cv.Optional(CONF_WIDTH, default=4): size, + cv.Optional(CONF_COLOR_START, default=0): lv_color, + cv.Optional(CONF_COLOR_END): lv_color, + cv.Exclusive(CONF_VALUE, CONF_VALUE): lv_float, + cv.Exclusive(CONF_START_VALUE, CONF_VALUE): lv_float, + cv.Optional(CONF_END_VALUE): lv_float, + cv.Optional(CONF_LOCAL, default=False): lv_bool, + } +) +INDICATOR_SCHEMA = cv.Schema( + { + cv.Exclusive(CONF_LINE, CONF_INDICATORS): INDICATOR_LINE_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(lv_meter_indicator_t), + } + ), + cv.Exclusive(CONF_IMAGE, CONF_INDICATORS): cv.All( + INDICATOR_IMG_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(lv_meter_indicator_t), + } + ), + requires_component("image"), + ), + cv.Exclusive(CONF_ARC, CONF_INDICATORS): INDICATOR_ARC_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(lv_meter_indicator_t), + } + ), + cv.Exclusive(CONF_TICK_STYLE, CONF_INDICATORS): INDICATOR_TICKS_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(lv_meter_indicator_t), + } + ), + } +) + +SCALE_SCHEMA = cv.Schema( + { + cv.Optional(CONF_TICKS): cv.Schema( + { + cv.Optional(CONF_COUNT, default=12): cv.positive_int, + cv.Optional(CONF_WIDTH, default=2): size, + cv.Optional(CONF_LENGTH, default=10): size, + cv.Optional(CONF_COLOR, default=0x808080): lv_color, + cv.Optional(CONF_MAJOR): cv.Schema( + { + cv.Optional(CONF_STRIDE, default=3): cv.positive_int, + cv.Optional(CONF_WIDTH, default=5): size, + cv.Optional(CONF_LENGTH, default="15%"): size, + cv.Optional(CONF_COLOR, default=0): lv_color, + cv.Optional(CONF_LABEL_GAP, default=4): size, + } + ), + } + ), + cv.Optional(CONF_RANGE_FROM, default=0.0): cv.float_, + cv.Optional(CONF_RANGE_TO, default=100.0): cv.float_, + cv.Optional(CONF_ANGLE_RANGE, default=270): cv.int_range(0, 360), + cv.Optional(CONF_ROTATION): angle, + cv.Optional(CONF_INDICATORS): cv.ensure_list(INDICATOR_SCHEMA), + } +) + +METER_SCHEMA = {cv.Optional(CONF_SCALES): cv.ensure_list(SCALE_SCHEMA)} + + +class MeterType(WidgetType): + def __init__(self): + super().__init__(CONF_METER, lv_meter_t, (CONF_MAIN,), METER_SCHEMA) + + async def to_code(self, w: Widget, config): + """For a meter object, create and set parameters""" + + var = w.obj + for scale_conf in config.get(CONF_SCALES) or (): + rotation = 90 + (360 - scale_conf[CONF_ANGLE_RANGE]) / 2 + if CONF_ROTATION in scale_conf: + rotation = scale_conf[CONF_ROTATION] // 10 + with LocalVariable( + "meter_var", "lv_meter_scale_t", lv_expr.meter_add_scale(var) + ) as meter_var: + lv.meter_set_scale_range( + var, + meter_var, + scale_conf[CONF_RANGE_FROM], + scale_conf[CONF_RANGE_TO], + scale_conf[CONF_ANGLE_RANGE], + rotation, + ) + if ticks := scale_conf.get(CONF_TICKS): + color = await lv_color.process(ticks[CONF_COLOR]) + lv.meter_set_scale_ticks( + var, + meter_var, + ticks[CONF_COUNT], + ticks[CONF_WIDTH], + ticks[CONF_LENGTH], + color, + ) + if CONF_MAJOR in ticks: + major = ticks[CONF_MAJOR] + color = await lv_color.process(major[CONF_COLOR]) + lv.meter_set_scale_major_ticks( + var, + meter_var, + major[CONF_STRIDE], + major[CONF_WIDTH], + major[CONF_LENGTH], + color, + major[CONF_LABEL_GAP], + ) + for indicator in scale_conf.get(CONF_INDICATORS) or (): + (t, v) = next(iter(indicator.items())) + iid = v[CONF_ID] + ivar = cg.new_variable( + iid, cg.nullptr, type_=lv_meter_indicator_t_ptr + ) + # Enable getting the meter to which this belongs. + wid = Widget.create(iid, var, obj_spec, v) + wid.obj = ivar + if t == CONF_LINE: + color = await lv_color.process(v[CONF_COLOR]) + lv_assign( + ivar, + lv_expr.meter_add_needle_line( + var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD] + ), + ) + if t == CONF_ARC: + color = await lv_color.process(v[CONF_COLOR]) + lv_assign( + ivar, + lv_expr.meter_add_arc( + var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD] + ), + ) + if t == CONF_TICK_STYLE: + color_start = await lv_color.process(v[CONF_COLOR_START]) + color_end = await lv_color.process( + v.get(CONF_COLOR_END) or color_start + ) + lv_assign( + ivar, + lv_expr.meter_add_scale_lines( + var, + meter_var, + color_start, + color_end, + v[CONF_LOCAL], + v[CONF_WIDTH], + ), + ) + if t == CONF_IMAGE: + add_lv_use("img") + lv_assign( + ivar, + lv_expr.meter_add_needle_img( + var, + meter_var, + await lv_image.process(v[CONF_SRC]), + v[CONF_PIVOT_X], + v[CONF_PIVOT_Y], + ), + ) + start_value = await get_start_value(v) + end_value = await get_end_value(v) + set_indicator_values(var, ivar, start_value, end_value) + + +meter_spec = MeterType() + + +@automation.register_action( + "lvgl.indicator.update", + ObjUpdateAction, + cv.Schema( + { + cv.Required(CONF_ID): cv.use_id(lv_meter_indicator_t), + cv.Exclusive(CONF_VALUE, CONF_VALUE): lv_float, + cv.Exclusive(CONF_START_VALUE, CONF_VALUE): lv_float, + cv.Optional(CONF_END_VALUE): lv_float, + } + ), +) +async def indicator_update_to_code(config, action_id, template_arg, args): + widget = await get_widgets(config) + start_value = await get_start_value(config) + end_value = await get_end_value(config) + + async def set_value(w: Widget): + set_indicator_values(w.var, w.obj, start_value, end_value) + + return await action_to_code(widget, set_value, action_id, template_arg, args) + + +def set_indicator_values(meter, indicator, start_value, end_value): + if start_value is not None: + if end_value is None: + lv.meter_set_indicator_value(meter, indicator, start_value) + else: + lv.meter_set_indicator_start_value(meter, indicator, start_value) + if end_value is not None: + lv.meter_set_indicator_end_value(meter, indicator, end_value) diff --git a/esphome/components/lvgl/msgbox.py b/esphome/components/lvgl/msgbox.py new file mode 100644 index 0000000000..6dd529d77f --- /dev/null +++ b/esphome/components/lvgl/msgbox.py @@ -0,0 +1,127 @@ +from esphome import config_validation as cv +from esphome.const import CONF_BUTTON, CONF_ID +from esphome.core import ID +from esphome.cpp_generator import new_Pvariable, static_const_array +from esphome.cpp_types import nullptr + +from .button import button_spec +from .buttonmatrix import ( + BUTTONMATRIX_BUTTON_SCHEMA, + CONF_BUTTON_TEXT_LIST_ID, + buttonmatrix_spec, + get_button_data, + lv_buttonmatrix_t, + set_btn_data, +) +from .defines import ( + CONF_BODY, + CONF_BUTTONS, + CONF_CLOSE_BUTTON, + CONF_MSGBOXES, + CONF_TEXT, + CONF_TITLE, + TYPE_FLEX, + literal, +) +from .helpers import add_lv_use +from .label import CONF_LABEL +from .lv_validation import lv_bool, lv_pct, lv_text +from .lvcode import ( + EVENT_ARG, + LambdaContext, + LocalVariable, + lv_add, + lv_assign, + lv_expr, + lv_obj, + lv_Pvariable, +) +from .obj import obj_spec +from .schemas import STYLE_SCHEMA, STYLED_TEXT_SCHEMA, container_schema +from .styles import TOP_LAYER +from .types import LV_EVENT, char_ptr, lv_obj_t +from .widget import Widget, set_obj_properties + +CONF_MSGBOX = "msgbox" +MSGBOX_SCHEMA = container_schema( + obj_spec, + STYLE_SCHEMA.extend( + { + cv.GenerateID(CONF_ID): cv.declare_id(lv_obj_t), + cv.Required(CONF_TITLE): STYLED_TEXT_SCHEMA, + cv.Optional(CONF_BODY): STYLED_TEXT_SCHEMA, + cv.Optional(CONF_BUTTONS): cv.ensure_list(BUTTONMATRIX_BUTTON_SCHEMA), + cv.Optional(CONF_CLOSE_BUTTON): lv_bool, + cv.GenerateID(CONF_BUTTON_TEXT_LIST_ID): cv.declare_id(char_ptr), + } + ), +) + + +async def msgbox_to_code(conf): + """ + Construct a message box. This consists of a full-screen translucent background enclosing a centered container + with an optional title, body, close button and a button matrix. And any other widgets the user cares to add + :param conf: The config data + :return: code to add to the init lambda + """ + add_lv_use( + TYPE_FLEX, + CONF_BUTTON, + CONF_LABEL, + CONF_MSGBOX, + *buttonmatrix_spec.get_uses(), + *button_spec.get_uses(), + ) + mbid = conf[CONF_ID] + outer = lv_Pvariable(lv_obj_t, mbid.id) + btnm = new_Pvariable( + ID(f"{mbid.id}_btnm_", is_declaration=True, type=lv_buttonmatrix_t) + ) + msgbox = lv_Pvariable(lv_obj_t, f"{mbid.id}_msgbox") + outer_w = Widget.create(mbid, outer, obj_spec, conf) + btnm_widg = Widget.create(str(btnm), btnm, buttonmatrix_spec, conf) + text_list, ctrl_list, width_list, _ = await get_button_data((conf,), btnm_widg) + text_id = conf[CONF_BUTTON_TEXT_LIST_ID] + text_list = static_const_array(text_id, text_list) + if (text := conf.get(CONF_BODY)) is not None: + text = await lv_text.process(text.get(CONF_TEXT)) + if (title := conf.get(CONF_TITLE)) is not None: + title = await lv_text.process(title.get(CONF_TEXT)) + close_button = conf[CONF_CLOSE_BUTTON] + lv_assign(outer, lv_expr.obj_create(TOP_LAYER)) + lv_obj.set_width(outer, lv_pct(100)) + lv_obj.set_height(outer, lv_pct(100)) + lv_obj.set_style_bg_opa(outer, 128, 0) + lv_obj.set_style_bg_color(outer, literal("lv_color_black()"), 0) + lv_obj.set_style_border_width(outer, 0, 0) + lv_obj.set_style_pad_all(outer, 0, 0) + lv_obj.set_style_radius(outer, 0, 0) + outer_w.add_flag("LV_OBJ_FLAG_HIDDEN") + lv_assign( + msgbox, lv_expr.msgbox_create(outer, title, text, text_list, close_button) + ) + lv_obj.set_style_align(msgbox, literal("LV_ALIGN_CENTER"), 0) + lv_add(btnm.set_obj(lv_expr.msgbox_get_btns(msgbox))) + await set_obj_properties(outer_w, conf) + if close_button: + async with LambdaContext(EVENT_ARG, where=mbid) as context: + outer_w.add_flag("LV_OBJ_FLAG_HIDDEN") + with LocalVariable( + "close_btn_", lv_obj_t, lv_expr.msgbox_get_close_btn(msgbox) + ) as close_btn: + lv_obj.remove_event_cb(close_btn, nullptr) + lv_obj.add_event_cb( + close_btn, + await context.get_lambda(), + LV_EVENT.CLICKED, + nullptr, + ) + + if len(ctrl_list) != 0 or len(width_list) != 0: + set_btn_data(btnm.obj, ctrl_list, width_list) + + +async def msgboxes_to_code(config): + for conf in config.get(CONF_MSGBOXES, ()): + await msgbox_to_code(conf) diff --git a/esphome/components/lvgl/roller.py b/esphome/components/lvgl/roller.py new file mode 100644 index 0000000000..7af3ef3c3d --- /dev/null +++ b/esphome/components/lvgl/roller.py @@ -0,0 +1,77 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_MODE, CONF_OPTIONS + +from .defines import ( + CONF_ANIMATED, + CONF_MAIN, + CONF_SELECTED, + CONF_SELECTED_INDEX, + CONF_VISIBLE_ROW_COUNT, + ROLLER_MODES, + literal, +) +from .label import CONF_LABEL +from .lv_validation import animated, lv_int, option_string +from .lvcode import lv +from .types import LvSelect +from .widget import WidgetType + +CONF_ROLLER = "roller" +lv_roller_t = LvSelect("lv_roller_t") + +ROLLER_BASE_SCHEMA = cv.Schema( + { + cv.Optional(CONF_SELECTED_INDEX): cv.templatable(cv.int_), + cv.Optional(CONF_VISIBLE_ROW_COUNT): lv_int, + } +) + +ROLLER_SCHEMA = ROLLER_BASE_SCHEMA.extend( + { + cv.Required(CONF_OPTIONS): cv.ensure_list(option_string), + cv.Optional(CONF_MODE, default="NORMAL"): ROLLER_MODES.one_of, + } +) + +ROLLER_MODIFY_SCHEMA = ROLLER_BASE_SCHEMA.extend( + { + cv.Optional(CONF_ANIMATED, default=True): animated, + } +) + + +class RollerType(WidgetType): + def __init__(self): + super().__init__( + CONF_ROLLER, + lv_roller_t, + (CONF_MAIN, CONF_SELECTED), + ROLLER_SCHEMA, + ROLLER_MODIFY_SCHEMA, + ) + + async def to_code(self, w, config): + if options := config.get(CONF_OPTIONS): + mode = await ROLLER_MODES.process(config[CONF_MODE]) + text = cg.safe_exp("\n".join(options)) + lv.roller_set_options(w.obj, text, mode) + animopt = literal(config.get(CONF_ANIMATED) or "LV_ANIM_OFF") + if CONF_SELECTED_INDEX in config: + if selected := config[CONF_SELECTED_INDEX]: + value = await lv_int.process(selected) + lv.roller_set_selected(w.obj, value, animopt) + await w.set_property( + CONF_VISIBLE_ROW_COUNT, + await lv_int.process(config.get(CONF_VISIBLE_ROW_COUNT)), + ) + + @property + def animated(self): + return True + + def get_uses(self): + return (CONF_LABEL,) + + +roller_spec = RollerType() diff --git a/esphome/components/lvgl/spinbox.py b/esphome/components/lvgl/spinbox.py new file mode 100644 index 0000000000..62c58c54a3 --- /dev/null +++ b/esphome/components/lvgl/spinbox.py @@ -0,0 +1,178 @@ +from esphome import automation +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_RANGE_FROM, CONF_RANGE_TO, CONF_STEP, CONF_VALUE + +from .automation import action_to_code, update_to_code +from .defines import ( + CONF_CURSOR, + CONF_DECIMAL_PLACES, + CONF_DIGITS, + CONF_MAIN, + CONF_ROLLOVER, + CONF_SCROLLBAR, + CONF_SELECTED, + CONF_TEXTAREA_PLACEHOLDER, +) +from .label import CONF_LABEL +from .lv_validation import lv_bool, lv_float +from .lvcode import lv +from .textarea import CONF_TEXTAREA +from .types import LvNumber, ObjUpdateAction +from .widget import Widget, WidgetType, get_widgets + +CONF_SPINBOX = "spinbox" + +lv_spinbox_t = LvNumber("lv_spinbox_t") + +SPIN_ACTIONS = ( + "INCREMENT", + "DECREMENT", + "STEP_NEXT", + "STEP_PREV", + "CLEAR", +) + + +def validate_spinbox(config): + max_val = 2**31 - 1 + min_val = -1 - max_val + range_from = int(config[CONF_RANGE_FROM]) + range_to = int(config[CONF_RANGE_TO]) + step = int(config[CONF_STEP]) + if ( + range_from > max_val + or range_from < min_val + or range_to > max_val + or range_to < min_val + ): + raise cv.Invalid("Range outside allowed limits") + if step <= 0 or step >= (range_to - range_from) / 2: + raise cv.Invalid("Invalid step value") + if config[CONF_DIGITS] <= config[CONF_DECIMAL_PLACES]: + raise cv.Invalid("Number of digits must exceed number of decimal places") + return config + + +SPINBOX_SCHEMA = cv.Schema( + { + cv.Optional(CONF_VALUE): lv_float, + cv.Optional(CONF_RANGE_FROM, default=0): cv.float_, + cv.Optional(CONF_RANGE_TO, default=100): cv.float_, + cv.Optional(CONF_DIGITS, default=4): cv.int_range(1, 10), + cv.Optional(CONF_STEP, default=1.0): cv.positive_float, + cv.Optional(CONF_DECIMAL_PLACES, default=0): cv.int_range(0, 6), + cv.Optional(CONF_ROLLOVER, default=False): lv_bool, + } +).add_extra(validate_spinbox) + + +SPINBOX_MODIFY_SCHEMA = { + cv.Required(CONF_VALUE): lv_float, +} + + +class SpinboxType(WidgetType): + def __init__(self): + super().__init__( + CONF_SPINBOX, + lv_spinbox_t, + ( + CONF_MAIN, + CONF_SCROLLBAR, + CONF_SELECTED, + CONF_CURSOR, + CONF_TEXTAREA_PLACEHOLDER, + ), + SPINBOX_SCHEMA, + SPINBOX_MODIFY_SCHEMA, + ) + + async def to_code(self, w: Widget, config): + if CONF_DIGITS in config: + digits = config[CONF_DIGITS] + scale = 10 ** config[CONF_DECIMAL_PLACES] + range_from = int(config[CONF_RANGE_FROM]) * scale + range_to = int(config[CONF_RANGE_TO]) * scale + step = int(config[CONF_STEP]) * scale + w.scale = scale + w.step = step + w.range_to = range_to + w.range_from = range_from + lv.spinbox_set_range(w.obj, range_from, range_to) + await w.set_property(CONF_STEP, step) + await w.set_property(CONF_ROLLOVER, config) + lv.spinbox_set_digit_format( + w.obj, digits, digits - config[CONF_DECIMAL_PLACES] + ) + if (value := config.get(CONF_VALUE)) is not None: + lv.spinbox_set_value(w.obj, await lv_float.process(value)) + + def get_scale(self, config): + return 10 ** config[CONF_DECIMAL_PLACES] + + def get_uses(self): + return CONF_TEXTAREA, CONF_LABEL + + def get_max(self, config: dict): + return config[CONF_RANGE_TO] + + def get_min(self, config: dict): + return config[CONF_RANGE_FROM] + + def get_step(self, config: dict): + return config[CONF_STEP] + + +spinbox_spec = SpinboxType() + + +@automation.register_action( + "lvgl.spinbox.increment", + ObjUpdateAction, + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(lv_spinbox_t), + }, + key=CONF_ID, + ), +) +async def spinbox_increment(config, action_id, template_arg, args): + widgets = await get_widgets(config) + + async def do_increment(w: Widget): + lv.spinbox_increment(w.obj) + + return await action_to_code(widgets, do_increment, action_id, template_arg, args) + + +@automation.register_action( + "lvgl.spinbox.decrement", + ObjUpdateAction, + cv.maybe_simple_value( + { + cv.Required(CONF_ID): cv.use_id(lv_spinbox_t), + }, + key=CONF_ID, + ), +) +async def spinbox_decrement(config, action_id, template_arg, args): + widgets = await get_widgets(config) + + async def do_increment(w: Widget): + lv.spinbox_decrement(w.obj) + + return await action_to_code(widgets, do_increment, action_id, template_arg, args) + + +@automation.register_action( + "lvgl.spinbox.update", + ObjUpdateAction, + cv.Schema( + { + cv.Required(CONF_ID): cv.use_id(lv_spinbox_t), + cv.Required(CONF_VALUE): lv_float, + } + ), +) +async def spinbox_update_to_code(config, action_id, template_arg, args): + return await update_to_code(config, action_id, template_arg, args) diff --git a/esphome/components/lvgl/styles.py b/esphome/components/lvgl/styles.py index 7a795bc99d..09f1c376d0 100644 --- a/esphome/components/lvgl/styles.py +++ b/esphome/components/lvgl/styles.py @@ -26,7 +26,7 @@ async def styles_to_code(config): svar = cg.new_Pvariable(style[CONF_ID]) lv.style_init(svar) for prop, validator in ALL_STYLES.items(): - if value := style.get(prop): + if (value := style.get(prop)) is not None: if isinstance(validator, LValidator): value = await validator.process(value) if isinstance(value, list): diff --git a/esphome/components/lvgl/tabview.py b/esphome/components/lvgl/tabview.py new file mode 100644 index 0000000000..7b6a864e21 --- /dev/null +++ b/esphome/components/lvgl/tabview.py @@ -0,0 +1,114 @@ +from esphome import automation +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INDEX, CONF_NAME, CONF_POSITION, CONF_SIZE +from esphome.cpp_generator import MockObjClass + +from . import buttonmatrix_spec +from .automation import action_to_code +from .defines import ( + CONF_ANIMATED, + CONF_MAIN, + CONF_TAB_ID, + CONF_TABS, + DIRECTIONS, + TYPE_FLEX, + literal, +) +from .lv_validation import animated, lv_int, size +from .lvcode import LocalVariable, lv, lv_assign, lv_expr +from .obj import obj_spec +from .schemas import container_schema, part_schema +from .types import LV_EVENT, LvType, ObjUpdateAction, lv_obj_t, lv_obj_t_ptr +from .widget import Widget, WidgetType, add_widgets, get_widgets, set_obj_properties + +CONF_TABVIEW = "tabview" +CONF_TAB_STYLE = "tab_style" + +lv_tab_t = LvType("lv_obj_t") + +TABVIEW_SCHEMA = cv.Schema( + { + cv.Required(CONF_TABS): cv.ensure_list( + container_schema( + obj_spec, + { + cv.Required(CONF_NAME): cv.string, + cv.GenerateID(): cv.declare_id(lv_tab_t), + }, + ) + ), + cv.Optional(CONF_TAB_STYLE): part_schema(buttonmatrix_spec), + cv.Optional(CONF_POSITION, default="top"): DIRECTIONS.one_of, + cv.Optional(CONF_SIZE, default="10%"): size, + } +) + + +class TabviewType(WidgetType): + def __init__(self): + super().__init__( + CONF_TABVIEW, + LvType( + "lv_tabview_t", + largs=[(lv_obj_t_ptr, "tab")], + lvalue=lambda w: lv_expr.obj_get_child( + lv_expr.tabview_get_content(w.obj), + lv_expr.tabview_get_tab_act(w.obj), + ), + has_on_value=True, + ), + parts=(CONF_MAIN,), + schema=TABVIEW_SCHEMA, + modify_schema={}, + ) + + def get_uses(self): + return "btnmatrix", TYPE_FLEX + + async def to_code(self, w: Widget, config: dict): + for tab_conf in config[CONF_TABS]: + w_id = tab_conf[CONF_ID] + tab_obj = cg.Pvariable(w_id, cg.nullptr, type_=lv_tab_t) + tab_widget = Widget.create(w_id, tab_obj, obj_spec) + lv_assign(tab_obj, lv_expr.tabview_add_tab(w.obj, tab_conf[CONF_NAME])) + await set_obj_properties(tab_widget, tab_conf) + await add_widgets(tab_widget, tab_conf) + if button_style := config.get(CONF_TAB_STYLE): + with LocalVariable( + "tabview_btnmatrix", lv_obj_t, rhs=lv_expr.tabview_get_tab_btns(w.obj) + ) as btnmatrix_obj: + await set_obj_properties(Widget(btnmatrix_obj, obj_spec), button_style) + + def obj_creator(self, parent: MockObjClass, config: dict): + return lv_expr.call( + "tabview_create", + parent, + literal(config[CONF_POSITION]), + literal(config[CONF_SIZE]), + ) + + +tabview_spec = TabviewType() + + +@automation.register_action( + "lvgl.tabview.select", + ObjUpdateAction, + cv.Schema( + { + cv.Required(CONF_ID): cv.use_id(tabview_spec.w_type), + cv.Optional(CONF_ANIMATED, default=False): animated, + cv.Required(CONF_INDEX): lv_int, + }, + ).add_extra(cv.has_at_least_one_key(CONF_INDEX, CONF_TAB_ID)), +) +async def tabview_select(config, action_id, template_arg, args): + widget = await get_widgets(config) + index = config[CONF_INDEX] + + async def do_select(w: Widget): + lv.tabview_set_act(w.obj, index, literal(config[CONF_ANIMATED])) + lv.event_send(w.obj, LV_EVENT.VALUE_CHANGED, cg.nullptr) + + return await action_to_code(widget, do_select, action_id, template_arg, args) diff --git a/esphome/components/lvgl/textarea.py b/esphome/components/lvgl/textarea.py new file mode 100644 index 0000000000..d383e1f098 --- /dev/null +++ b/esphome/components/lvgl/textarea.py @@ -0,0 +1,67 @@ +import esphome.config_validation as cv +from esphome.const import CONF_MAX_LENGTH + +from .defines import ( + CONF_ACCEPTED_CHARS, + CONF_CURSOR, + CONF_MAIN, + CONF_ONE_LINE, + CONF_PASSWORD_MODE, + CONF_PLACEHOLDER_TEXT, + CONF_SCROLLBAR, + CONF_SELECTED, + CONF_TEXT, + CONF_TEXTAREA_PLACEHOLDER, +) +from .lv_validation import lv_bool, lv_int, lv_text +from .schemas import TEXT_SCHEMA +from .types import LvText +from .widget import Widget, WidgetType + +CONF_TEXTAREA = "textarea" + +lv_textarea_t = LvText("lv_textarea_t") + +TEXTAREA_SCHEMA = TEXT_SCHEMA.extend( + { + cv.Optional(CONF_PLACEHOLDER_TEXT): lv_text, + cv.Optional(CONF_ACCEPTED_CHARS): lv_text, + cv.Optional(CONF_ONE_LINE): lv_bool, + cv.Optional(CONF_PASSWORD_MODE): lv_bool, + cv.Optional(CONF_MAX_LENGTH): lv_int, + } +) + + +class TextareaType(WidgetType): + def __init__(self): + super().__init__( + CONF_TEXTAREA, + lv_textarea_t, + ( + CONF_MAIN, + CONF_SCROLLBAR, + CONF_SELECTED, + CONF_CURSOR, + CONF_TEXTAREA_PLACEHOLDER, + ), + TEXTAREA_SCHEMA, + ) + + async def to_code(self, w: Widget, config: dict): + for prop in (CONF_TEXT, CONF_PLACEHOLDER_TEXT, CONF_ACCEPTED_CHARS): + if (value := config.get(prop)) is not None: + await w.set_property(prop, await lv_text.process(value)) + await w.set_property( + CONF_MAX_LENGTH, await lv_int.process(config.get(CONF_MAX_LENGTH)) + ) + await w.set_property( + CONF_PASSWORD_MODE, + await lv_bool.process(config.get(CONF_PASSWORD_MODE)), + ) + await w.set_property( + CONF_ONE_LINE, await lv_bool.process(config.get(CONF_ONE_LINE)) + ) + + +textarea_spec = TextareaType() diff --git a/esphome/components/lvgl/tileview.py b/esphome/components/lvgl/tileview.py new file mode 100644 index 0000000000..aa841fa23e --- /dev/null +++ b/esphome/components/lvgl/tileview.py @@ -0,0 +1,128 @@ +from esphome import automation +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_ON_VALUE, CONF_ROW, CONF_TRIGGER_ID + +from .automation import action_to_code +from .defines import ( + CONF_ANIMATED, + CONF_COLUMN, + CONF_DIR, + CONF_MAIN, + CONF_TILE_ID, + CONF_TILES, + TILE_DIRECTIONS, + literal, +) +from .lv_validation import animated, lv_int +from .lvcode import lv, lv_assign, lv_expr, lv_obj, lv_Pvariable +from .obj import obj_spec +from .schemas import container_schema +from .types import LV_EVENT, LvType, ObjUpdateAction, lv_obj_t, lv_obj_t_ptr +from .widget import Widget, WidgetType, add_widgets, get_widgets, set_obj_properties + +CONF_TILEVIEW = "tileview" + +lv_tile_t = LvType("lv_tileview_tile_t") + +lv_tileview_t = LvType( + "lv_tileview_t", + largs=[(lv_obj_t_ptr, "tile")], + lvalue=lambda w: w.get_property("tile_act"), +) + +tile_spec = WidgetType("lv_tileview_tile_t", lv_tile_t, (CONF_MAIN,), {}) + +TILEVIEW_SCHEMA = cv.Schema( + { + cv.Required(CONF_TILES): cv.ensure_list( + container_schema( + obj_spec, + { + cv.Required(CONF_ROW): lv_int, + cv.Required(CONF_COLUMN): lv_int, + cv.GenerateID(): cv.declare_id(lv_tile_t), + cv.Optional(CONF_DIR, default="ALL"): TILE_DIRECTIONS.several_of, + }, + ) + ), + cv.Optional(CONF_ON_VALUE): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( + automation.Trigger.template(lv_obj_t_ptr) + ) + } + ), + } +) + + +class TileviewType(WidgetType): + def __init__(self): + super().__init__( + CONF_TILEVIEW, + lv_tileview_t, + (CONF_MAIN,), + schema=TILEVIEW_SCHEMA, + modify_schema={}, + ) + + async def to_code(self, w: Widget, config: dict): + for tile_conf in config.get(CONF_TILES) or (): + w_id = tile_conf[CONF_ID] + tile_obj = lv_Pvariable(lv_obj_t, w_id) + tile = Widget.create(w_id, tile_obj, tile_spec, tile_conf) + dirs = tile_conf[CONF_DIR] + if isinstance(dirs, list): + dirs = "|".join(dirs) + lv_assign( + tile_obj, + lv_expr.tileview_add_tile( + w.obj, tile_conf[CONF_COLUMN], tile_conf[CONF_ROW], literal(dirs) + ), + ) + await set_obj_properties(tile, tile_conf) + await add_widgets(tile, tile_conf) + + +tileview_spec = TileviewType() + + +def tile_select_validate(config): + row = CONF_ROW in config + column = CONF_COLUMN in config + tile = CONF_TILE_ID in config + if tile and (row or column) or not tile and not (row and column): + raise cv.Invalid("Specify either a tile id, or both a row and a column") + return config + + +@automation.register_action( + "lvgl.tileview.select", + ObjUpdateAction, + cv.Schema( + { + cv.Required(CONF_ID): cv.use_id(lv_tileview_t), + cv.Optional(CONF_ANIMATED, default=False): animated, + cv.Optional(CONF_ROW): lv_int, + cv.Optional(CONF_COLUMN): lv_int, + cv.Optional(CONF_TILE_ID): cv.use_id(lv_tile_t), + }, + ).add_extra(tile_select_validate), +) +async def tileview_select(config, action_id, template_arg, args): + widgets = await get_widgets(config) + + async def do_select(w: Widget): + if tile := config.get(CONF_TILE_ID): + tile = await cg.get_variable(tile) + lv_obj.set_tile(w.obj, tile, literal(config[CONF_ANIMATED])) + else: + row = await lv_int.process(config[CONF_ROW]) + column = await lv_int.process(config[CONF_COLUMN]) + lv_obj.set_tile_id( + widgets[0].obj, column, row, literal(config[CONF_ANIMATED]) + ) + lv.event_send(w.obj, LV_EVENT.VALUE_CHANGED, cg.nullptr) + + return await action_to_code(widgets, do_select, action_id, template_arg, args) diff --git a/esphome/components/lvgl/widget.py b/esphome/components/lvgl/widget.py index 5734aec7dc..fcaee29085 100644 --- a/esphome/components/lvgl/widget.py +++ b/esphome/components/lvgl/widget.py @@ -282,13 +282,13 @@ async def set_obj_properties(w: Widget, config): lv_obj.set_layout(w.obj, literal(f"LV_LAYOUT_{layout_type.upper()}")) if layout_type == TYPE_GRID: wid = config[CONF_ID] - rows = "{" + ",".join(layout[CONF_GRID_ROWS]) + ", LV_GRID_TEMPLATE_LAST}" + rows = [str(x) for x in layout[CONF_GRID_ROWS]] + rows = "{" + ",".join(rows) + ", LV_GRID_TEMPLATE_LAST}" row_id = ID(f"{wid}_row_dsc", is_declaration=True, type=lv_coord_t) row_array = cg.static_const_array(row_id, cg.RawExpression(rows)) w.set_style("grid_row_dsc_array", row_array, 0) - columns = ( - "{" + ",".join(layout[CONF_GRID_COLUMNS]) + ", LV_GRID_TEMPLATE_LAST}" - ) + columns = [str(x) for x in layout[CONF_GRID_COLUMNS]] + columns = "{" + ",".join(columns) + ", LV_GRID_TEMPLATE_LAST}" column_id = ID(f"{wid}_column_dsc", is_declaration=True, type=lv_coord_t) column_array = cg.static_const_array(column_id, cg.RawExpression(columns)) w.set_style("grid_column_dsc_array", column_array, 0) diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 726db24592..b7bdbb1f9d 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -39,9 +39,12 @@ #define USE_LOCK #define USE_LOGGER #define USE_LVGL +#define USE_LVGL_ANIMIMG #define USE_LVGL_BINARY_SENSOR +#define USE_LVGL_BUTTONMATRIX #define USE_LVGL_FONT #define USE_LVGL_IMAGE +#define USE_LVGL_KEYBOARD #define USE_LVGL_KEY_LISTENER #define USE_LVGL_TOUCHSCREEN #define USE_LVGL_ROTARY_ENCODER diff --git a/tests/components/lvgl/.gitattributes b/tests/components/lvgl/.gitattributes new file mode 100644 index 0000000000..75e7a44254 --- /dev/null +++ b/tests/components/lvgl/.gitattributes @@ -0,0 +1,2 @@ +*.ttf -text + diff --git a/tests/components/lvgl/common.yaml b/tests/components/lvgl/common.yaml index 8b92f8caa7..6d0c1967b4 100644 --- a/tests/components/lvgl/common.yaml +++ b/tests/components/lvgl/common.yaml @@ -8,3 +8,49 @@ touchscreen: x_max: 240 y_max: 320 +font: + - file: "$component_dir/roboto.ttf" + id: roboto20 + size: 20 + extras: + - file: '$component_dir/materialdesignicons-webfont.ttf' + glyphs: [ + "\U000F004B", + "\U0000f0ed", + "\U000F006E", + "\U000F012C", + "\U000F179B", + "\U000F0748", + "\U000F1A1B", + "\U000F02DC", + "\U000F0A02", + "\U000F035F", + "\U000F0156", + "\U000F0C5F", + "\U000f0084", + "\U000f0091", + ] + - file: "$component_dir/helvetica.ttf" + id: helvetica20 + - file: "$component_dir/roboto.ttf" + id: roboto10 + size: 10 + bpp: 4 + extras: + - file: '$component_dir/materialdesignicons-webfont.ttf' + glyphs: [ + "\U000F004B", + "\U0000f0ed", + "\U000F006E", + "\U000F012C", + "\U000F179B", + "\U000F0748", + "\U000F1A1B", + "\U000F02DC", + "\U000F0A02", + "\U000F035F", + "\U000F0156", + "\U000F0C5F", + "\U000f0084", + "\U000f0091", + ] diff --git a/tests/components/lvgl/helvetica.ttf b/tests/components/lvgl/helvetica.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7aec6f3f3cc74a7138ce350def27a2209b44ad89 GIT binary patch literal 83644 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⪚zp1_lsq#=y^D2D*irfuF$~j2XbR1p_|= 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

69WS) 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