diff --git a/.clang-format b/.clang-format index b409c5be..5f855715 100644 --- a/.clang-format +++ b/.clang-format @@ -3,70 +3,57 @@ Language: Cpp AccessModifierOffset: -4 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false -AlignConsecutiveBitFields: AcrossEmptyLinesAndComments AlignConsecutiveDeclarations: false -AlignConsecutiveMacros: AcrossComments -AlignEscapedNewlines: Left -AlignOperands: Align +AlignEscapedNewlinesLeft: false +AlignOperands: true AlignTrailingComments: true -AllowAllArgumentsOnNextLine: false -AllowAllConstructorInitializersOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true -AllowShortBlocksOnASingleLine: Empty +AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false -AllowShortEnumsOnASingleLine: true AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: Never -AllowShortLambdasOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: true BinPackArguments: true BinPackParameters: true -BitFieldColonSpacing : Both -BreakBeforeBraces: Custom BraceWrapping: - AfterCaseLabel: false - AfterClass: true + AfterClass: true AfterControlStatement: false - AfterEnum: false - AfterFunction: true - AfterNamespace: true - AfterObjCDeclaration: false - AfterStruct: true - AfterUnion: true - AfterExternBlock: false - BeforeCatch: false - BeforeElse: false - BeforeLambdaBody: false - BeforeWhile: false - IndentBraces: false - SplitEmptyFunction: true - SplitEmptyRecord: true - SplitEmptyNamespace: true + AfterEnum: false + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: true + BeforeCatch: false + BeforeElse: false + IndentBraces: false BreakBeforeBinaryOperators: None -BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom BreakBeforeTernaryOperators: false -BreakConstructorInitializers: BeforeComma -BreakStringLiterals: true +BreakConstructorInitializersBeforeComma: true ColumnLimit: 0 CommentPragmas: '^ (IWYU pragma:|NOLINT)' ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true -DeriveLineEnding: true DerivePointerAlignment: false DisableFormat: false -EmptyLineBeforeAccessModifier: LogicalBlock -FixNamespaceComments: true ForEachMacros: [] -IncludeBlocks: Preserve -IndentExternBlock: NoIndent -IndentCaseBlocks: false +IncludeCategories: + - Regex: '^"(stdafx|PrecompiledHeader)' + Priority: -2 + - Regex: '^".*Common' + Priority: -1 + - Regex: '^<' + Priority: 1 + - Regex: '^"' + Priority: 2 IndentCaseLabels: true -IndentGotoLabels: true IndentWidth: 4 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: true @@ -77,36 +64,21 @@ NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 80 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 -PenaltyBreakTemplateDeclaration: 80 PenaltyExcessCharacter: 1000000 -PenaltyIndentedWhitespace: 80 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Right -# uncomment below when clang >13 will be out -# IndentPPDirectives: AfterHash -# PPIndentWidth: 1 ReflowComments: true SortIncludes: false SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAroundPointerQualifiers: Default SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: false -SpaceBeforeCpp11BracedList: true -SpaceBeforeInheritanceColon: false SpaceBeforeParens: ControlStatements -SpaceBeforeRangeBasedForLoopColon: true -SpaceBeforeSquareBrackets: false -SpaceInEmptyBlock: false SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false -SpacesInConditionalStatement: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false @@ -114,3 +86,4 @@ SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 4 UseTab: Never +... diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index d3cb9a0f..00000000 --- a/.editorconfig +++ /dev/null @@ -1,25 +0,0 @@ -# EditorConfig: http://EditorConfig.org - -# Top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -charset = utf-8 - -# 4 space indentation -[*.{c,h,js,css,html}] -indent_style = space -indent_size = 4 - -# 2 space indentation -[*.{json,xml,yaml,yml}] -indent_style = space -indent_size = 2 - -# Tab indentation -[Makefile*] -indent_style = tab diff --git a/.gitattributes b/.gitattributes index dfe07704..685d1af4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,24 @@ -# Auto detect text files and perform LF normalization +.gitattributes export-ignore +.gitignore export-ignore +.git export-ignore + +# Set default behaviour, in case users don't have core.autocrlf set. * text=auto + +# Explicitly declare text files we want to always be normalized and converted +# to native line endings on checkout. +*.c text +*.cpp text +*.h text +*.hpp text +*.txt text +*.rst text +*.ino text + +# Declare files that will always have CRLF line endings on checkout. +*.sln text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.gz binary diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..7d4935b0 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: https://www.buymeacoffee.com/ramapcsx2 diff --git a/.gitignore b/.gitignore index 6582d3b9..e469197f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,382 @@ -# jekyll -.jekyll-metadata -_site -.sass-cache -.jekyll-cache +# Windows image file caches +Thumbs.db +ehthumbs.db +# Folder config file +Desktop.ini -# bundler -*.gem -Gemfile.lock +# Recycle Bin used on file shares +$RECYCLE.BIN/ +# Windows Installer files +*.cab +*.msi +*.msm +*.msp -# python -*.whl +# ========================= +# Operating System Files +# ========================= +# OSX +# ========================= -# npm -node_modules -package-lock.json +.DS_Store +.AppleDouble +.LSOverride +# Icon must end with two \r +Icon -# _sass -_sass/@primer/css/**/*.md +# Thumbnails +._* +# Files that might appear on external disk +.Spotlight-V100 +.Trashes -# lighthouse -*.report.html +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +# Visual Micro files +.project +__vm/ -# action -action.changelog.md +# Visual Studio project files +*.sln +*.vcxproj +*.vcxproj.filters -script/** -!script/ProcessData.sh -!script/**.TEMPLATE +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..4e5d2510 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "gitdoc.enabled": false +} \ No newline at end of file diff --git a/3rdparty/PersWiFiManager/.gitignore b/3rdparty/PersWiFiManager/.gitignore new file mode 100644 index 00000000..1065d7c4 --- /dev/null +++ b/3rdparty/PersWiFiManager/.gitignore @@ -0,0 +1,3 @@ +PersWiFiManager.ino +data/* +!data/wifi* \ No newline at end of file diff --git a/3rdparty/PersWiFiManager/LICENSE b/3rdparty/PersWiFiManager/LICENSE new file mode 100644 index 00000000..8878ca7c --- /dev/null +++ b/3rdparty/PersWiFiManager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Ryan Downing + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/3rdparty/PersWiFiManager/PersWiFiManager.cpp b/3rdparty/PersWiFiManager/PersWiFiManager.cpp new file mode 100644 index 00000000..4df3ed53 --- /dev/null +++ b/3rdparty/PersWiFiManager/PersWiFiManager.cpp @@ -0,0 +1,158 @@ +/* PersWiFiManager + version 3.0.1 + https://r-downing.github.io/PersWiFiManager/ +*/ + +#include "PersWiFiManager.h" + +#ifdef WIFI_HTM_PROGMEM +const char wifi_htm[] PROGMEM = R"=====(ESP WiFi








Back |Home
)====="; +#endif + +PersWiFiManager::PersWiFiManager(ESP8266WebServer& s, DNSServer& d) { + _server = &s; + _dnsServer = &d; + _apPass = ""; +} //PersWiFiManager + +bool PersWiFiManager::attemptConnection(const String& ssid, const String& pass) { + //attempt to connect to wifi + WiFi.mode(WIFI_STA); + if (ssid.length()) { + if (pass.length()) WiFi.begin(ssid.c_str(), pass.c_str()); + else WiFi.begin(ssid.c_str()); + } else { + WiFi.begin(); + } + + //if in nonblock mode, skip this loop + _connectStartTime = millis();// + 1; + while (!_connectNonBlock && _connectStartTime) { + handleWiFi(); + delay(10); + } + + return (WiFi.status() == WL_CONNECTED); + +} //attemptConnection + +void PersWiFiManager::handleWiFi() { + if (!_connectStartTime) return; + + if (WiFi.status() == WL_CONNECTED) { + _connectStartTime = 0; + if (_connectHandler) _connectHandler(); + return; + } + + //if failed or not connected and time is up + if ((WiFi.status() == WL_CONNECT_FAILED) || ((WiFi.status() != WL_CONNECTED) && ((millis() - _connectStartTime) > (1000 * WIFI_CONNECT_TIMEOUT)))) { + startApMode(); + _connectStartTime = 0; //reset connect start time + } + +} //handleWiFi + +void PersWiFiManager::startApMode(){ + //start AP mode + IPAddress apIP(192, 168, 1, 1); + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); + _apPass.length() ? WiFi.softAP(getApSsid().c_str(), _apPass.c_str()) : WiFi.softAP(getApSsid().c_str()); + if (_apHandler) _apHandler(); +}//startApMode + +void PersWiFiManager::setConnectNonBlock(bool b) { + _connectNonBlock = b; +} //setConnectNonBlock + +void PersWiFiManager::setupWiFiHandlers() { + IPAddress apIP(192, 168, 1, 1); + _dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + _dnsServer->start((byte)53, "*", apIP); //used for captive portal in AP mode + + _server->on("/wifi/list", [&] () { + //scan for wifi networks + int n = WiFi.scanNetworks(); + + //build array of indices + int ix[n]; + for (int i = 0; i < n; i++) ix[i] = i; + + //sort by signal strength + for (int i = 0; i < n; i++) for (int j = 1; j < n - i; j++) if (WiFi.RSSI(ix[j]) > WiFi.RSSI(ix[j - 1])) std::swap(ix[j], ix[j - 1]); + //remove duplicates + for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (WiFi.SSID(ix[i]).equals(WiFi.SSID(ix[j])) && WiFi.encryptionType(ix[i]) == WiFi.encryptionType(ix[j])) ix[j] = -1; + + //build plain text string of wifi info + //format [signal%]:[encrypted 0 or 1]:SSID + String s = ""; + s.reserve(2050); + for (int i = 0; i < n && s.length() < 2000; i++) { //check s.length to limit memory usage + if (ix[i] != -1) { + s += String(i ? "\n" : "") + ((constrain(WiFi.RSSI(ix[i]), -100, -50) + 100) * 2) + "," + + ((WiFi.encryptionType(ix[i]) == ENC_TYPE_NONE) ? 0 : 1) + "," + WiFi.SSID(ix[i]); + } + } + + //send string to client + _server->send(200, "text/plain", s); + }); //_server->on /wifi/list + + _server->on("/wifi/wps", [&]() { + _server->send(200, "text/html", "attempting WPS"); + WiFi.mode(WIFI_STA); + WiFi.beginWPSConfig(); + delay(100); + if (WiFi.status() != WL_CONNECTED) { + attemptConnection("", ""); + } + }); //_server->on /wifi/wps + + _server->on("/wifi/connect", [&]() { + _server->send(200, "text/html", "connecting..."); + attemptConnection(_server->arg("n"), _server->arg("p")); + }); //_server->on /wifi/connect + + _server->on("/wifi/ap", [&](){ + _server->send(200, "text/html", "access point: "+getApSsid()); + startApMode(); + }); //_server->on /wifi/ap + + _server->on("/wifi/rst", [&]() { + _server->send(200, "text/html", "Rebooting..."); + delay(100); + ESP.restart(); + }); + +#ifdef WIFI_HTM_PROGMEM + _server->on("/wifi.htm", [&]() { + _server->send(200, "text/html", wifi_htm); + }); +#endif + +}//setupWiFiHandlers + +bool PersWiFiManager::begin(const String& ssid, const String& pass) { + setupWiFiHandlers(); + return attemptConnection(ssid, pass); //switched order of these two for return +} //begin + +String PersWiFiManager::getApSsid() { + return _apSsid.length() ? _apSsid : "ESP8266"; +} //getApSsid + +void PersWiFiManager::setApCredentials(const String& apSsid, const String& apPass) { + if (apSsid.length()) _apSsid = apSsid; + if (apPass.length() >= 8) _apPass = apPass; +} //setApCredentials + +void PersWiFiManager::onConnect(WiFiChangeHandlerFunction fn) { + _connectHandler = fn; +} + +void PersWiFiManager::onAp(WiFiChangeHandlerFunction fn) { + _apHandler = fn; +} + + diff --git a/3rdparty/PersWiFiManager/PersWiFiManager.h b/3rdparty/PersWiFiManager/PersWiFiManager.h new file mode 100644 index 00000000..80fcf03b --- /dev/null +++ b/3rdparty/PersWiFiManager/PersWiFiManager.h @@ -0,0 +1,52 @@ +#ifndef PERSWIFIMANAGER_H +#define PERSWIFIMANAGER_H + +#include +#include +#include + +#define WIFI_CONNECT_TIMEOUT 30 + +class PersWiFiManager { + + public: + + typedef std::function WiFiChangeHandlerFunction; + + PersWiFiManager(ESP8266WebServer& s, DNSServer& d); + + bool attemptConnection(const String& ssid = "", const String& pass = ""); + + void setupWiFiHandlers(); + + bool begin(const String& ssid = "", const String& pass = ""); + + String getApSsid(); + + void setApCredentials(const String& apSsid, const String& apPass = ""); + + void setConnectNonBlock(bool b); + + void handleWiFi(); + + void startApMode(); + + void onConnect(WiFiChangeHandlerFunction fn); + + void onAp(WiFiChangeHandlerFunction fn); + + private: + ESP8266WebServer * _server; + DNSServer * _dnsServer; + String _apSsid, _apPass; + + bool _connectNonBlock; + unsigned long _connectStartTime; + + WiFiChangeHandlerFunction _connectHandler; + WiFiChangeHandlerFunction _apHandler; + +};//class + +#endif + diff --git a/3rdparty/PersWiFiManager/README.md b/3rdparty/PersWiFiManager/README.md new file mode 100644 index 00000000..8b1115f9 --- /dev/null +++ b/3rdparty/PersWiFiManager/README.md @@ -0,0 +1,8 @@ +# PersWiFiManager +Persistent WiFiManager Arduino library for ESP8266-based microcontrollers + +This Persistent WiFi Manager provides a WiFi Settings web interface for ESP8266-based microcontrollers. It can autoconnect to the last used network, and then if unsuccessful, switch to AP mode with a captive DNS server. This action is non-blocking; the program will proceed to the main loop after, regardless of WiFi connection status. In AP mode, any device (phone, computer, etc) can connect to this network to configure the wifi connection, or access the device as a webserver. + +This library and UI was inspired by tzapu's [WiFiManager library](https://github.com/tzapu/WiFiManager). The main difference is that it allows the program to continue functioning normally, even in AP mode. It is also more memory efficient, as it does not have to dynamically build the page, and can serve it from SPIFFS rather than PROGMEM. + +[Full Documentation](http://ryandowning.net/PersWiFiManager) \ No newline at end of file diff --git a/3rdparty/PersWiFiManager/data/wifi.htm b/3rdparty/PersWiFiManager/data/wifi.htm new file mode 100644 index 00000000..5d083729 --- /dev/null +++ b/3rdparty/PersWiFiManager/data/wifi.htm @@ -0,0 +1,108 @@ + + + + + + ESP WiFi + + + + + +
+ +

+
+ +
+ +
+
+ +
+
+
+ +
+ +
+ +
+ Back | + Home +
+ + + diff --git a/3rdparty/PersWiFiManager/data/wifi.min.htm b/3rdparty/PersWiFiManager/data/wifi.min.htm new file mode 100644 index 00000000..49a4a55b --- /dev/null +++ b/3rdparty/PersWiFiManager/data/wifi.min.htm @@ -0,0 +1 @@ +ESP WiFi









Back | Home
\ No newline at end of file diff --git a/3rdparty/PersWiFiManager/data/wifi.min.htm.gz b/3rdparty/PersWiFiManager/data/wifi.min.htm.gz new file mode 100644 index 00000000..c8b0d2fb Binary files /dev/null and b/3rdparty/PersWiFiManager/data/wifi.min.htm.gz differ diff --git a/3rdparty/PersWiFiManager/examples/basic_rest_api/basic_rest_api.ino b/3rdparty/PersWiFiManager/examples/basic_rest_api/basic_rest_api.ino new file mode 100644 index 00000000..b2f22dc8 --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/basic_rest_api/basic_rest_api.ino @@ -0,0 +1,154 @@ +#define DEBUG_SERIAL //uncomment for Serial debugging statements + +#ifdef DEBUG_SERIAL +#define DEBUG_BEGIN Serial.begin(115200) +#define DEBUG_PRINT(x) Serial.println(x) +#else +#define DEBUG_PRINT(x) +#define DEBUG_BEGIN +#endif + +//includes +#include +#include +#include +#include +#include +#include +#include + +#define DEVICE_NAME "ESP8266 DEVICE" + +//const char *metaRefreshStr = "redirecting..."; +const char *metaRefreshStr = "redirecting..."; + +//server objects +ESP8266WebServer server(80); +DNSServer dnsServer; +PersWiFiManager persWM(server, dnsServer); + +////// Sample program data +int x; +String y; + + +//code from fsbrowser example, consolidated. +bool handleFileRead(String path) { + DEBUG_PRINT("handlefileread" + path); + if (path.endsWith("/")) path += "index.htm"; + String contentType; + if (path.endsWith(".htm") || path.endsWith(".html")) contentType = "text/html"; + else if (path.endsWith(".css")) contentType = "text/css"; + else if (path.endsWith(".js")) contentType = "application/javascript"; + else if (path.endsWith(".png")) contentType = "image/png"; + else if (path.endsWith(".gif")) contentType = "image/gif"; + else if (path.endsWith(".jpg")) contentType = "image/jpeg"; + else if (path.endsWith(".ico")) contentType = "image/x-icon"; + else if (path.endsWith(".xml")) contentType = "text/xml"; + else if (path.endsWith(".pdf")) contentType = "application/x-pdf"; + else if (path.endsWith(".zip")) contentType = "application/x-zip"; + else if (path.endsWith(".gz")) contentType = "application/x-gzip"; + else if (path.endsWith(".json")) contentType = "application/json"; + else contentType = "text/plain"; + + //split filepath and extension + String prefix = path, ext = ""; + int lastPeriod = path.lastIndexOf('.'); + if (lastPeriod >= 0) { + prefix = path.substring(0, lastPeriod); + ext = path.substring(lastPeriod); + } + + //look for smaller versions of file + //minified file, good (myscript.min.js) + if (SPIFFS.exists(prefix + ".min" + ext)) path = prefix + ".min" + ext; + //gzipped file, better (myscript.js.gz) + if (SPIFFS.exists(prefix + ext + ".gz")) path = prefix + ext + ".gz"; + //min and gzipped file, best (myscript.min.js.gz) + if (SPIFFS.exists(prefix + ".min" + ext + ".gz")) path = prefix + ".min" + ext + ".gz"; + + if (SPIFFS.exists(path)) { + DEBUG_PRINT("sending file " + path); + File file = SPIFFS.open(path, "r"); + if (server.hasArg("download")) + server.sendHeader("Content-Disposition", " attachment;"); + if (server.uri().indexOf("nocache") < 0) + server.sendHeader("Cache-Control", " max-age=172800"); + + //optional alt arg (encoded url), server sends redirect to file on the web + if (WiFi.status() == WL_CONNECTED && server.hasArg("alt")) { + server.sendHeader("Location", server.arg("alt"), true); + server.send ( 302, "text/plain", ""); + } else { + //server sends file + size_t sent = server.streamFile(file, contentType); + } + file.close(); + return true; + } //if SPIFFS.exists + return false; +} //bool handleFileRead + +void setup() { + DEBUG_BEGIN; //for terminal debugging + DEBUG_PRINT(); + + //allows serving of files from SPIFFS + SPIFFS.begin(); + persWM.begin(); + + //serve files from SPIFFS + server.onNotFound([]() { + if (!handleFileRead(server.uri())) { + server.sendHeader("Cache-Control", " max-age=172800"); + server.send(302, "text/html", metaRefreshStr); + } + }); //server.onNotFound + + //handles commands from webpage, sends live data in JSON format + server.on("/api", []() { + DEBUG_PRINT("server.on /api"); + if (server.hasArg("x")) { + x = server.arg("x").toInt(); + DEBUG_PRINT(String("x: ")+x); + } //if + if (server.hasArg("y")) { + y = server.arg("y"); + DEBUG_PRINT("y: "+y); + } //if + + //build json object of program data + StaticJsonBuffer<200> jsonBuffer; + JsonObject &json = jsonBuffer.createObject(); + json["x"] = x; + json["y"] = y; + + char jsonchar[200]; + json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece + server.send(200, "application/json", jsonchar); + + }); //server.on api + + + //SSDP makes device visible on windows network + server.on("/description.xml", HTTP_GET, []() { + SSDP.schema(server.client()); + }); + SSDP.setSchemaURL("description.xml"); + SSDP.setHTTPPort(80); + SSDP.setName(DEVICE_NAME); + SSDP.setURL("/"); + SSDP.begin(); + SSDP.setDeviceType("upnp:rootdevice"); + + server.begin(); + DEBUG_PRINT("setup complete."); +} //void setup + +void loop() { + dnsServer.processNextRequest(); + server.handleClient(); + + // do stuff with x and y + +} //void loop diff --git a/3rdparty/PersWiFiManager/examples/basic_rest_api/data/index.htm b/3rdparty/PersWiFiManager/examples/basic_rest_api/data/index.htm new file mode 100644 index 00000000..c6f2be1f --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/basic_rest_api/data/index.htm @@ -0,0 +1,52 @@ +

Current Data

+x: + +
y: + + +
Last updated + seconds ago. + +
+ +

Update Data

+
+ x: + + +
+
+ y: + + +
+ +WiFi settings + + diff --git a/3rdparty/PersWiFiManager/examples/basic_rest_api/data/wifi.min.htm.gz b/3rdparty/PersWiFiManager/examples/basic_rest_api/data/wifi.min.htm.gz new file mode 100644 index 00000000..c8b0d2fb Binary files /dev/null and b/3rdparty/PersWiFiManager/examples/basic_rest_api/data/wifi.min.htm.gz differ diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/index.htm b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/index.htm new file mode 100644 index 00000000..c6f2be1f --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/index.htm @@ -0,0 +1,52 @@ +

Current Data

+x: + +
y: + + +
Last updated + seconds ago. + +
+ +

Update Data

+
+ x: + + +
+
+ y: + + +
+ +WiFi settings + + diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/wifi.min.htm.gz b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/wifi.min.htm.gz new file mode 100644 index 00000000..c8b0d2fb Binary files /dev/null and b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/data/wifi.min.htm.gz differ diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api/spiffs_rest_api.ino b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/spiffs_rest_api.ino new file mode 100644 index 00000000..3f26aad9 --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api/spiffs_rest_api.ino @@ -0,0 +1,94 @@ +#define DEBUG_SERIAL //uncomment for Serial debugging statements + +#ifdef DEBUG_SERIAL +#define DEBUG_BEGIN Serial.begin(115200) +#define DEBUG_PRINT(x) Serial.println(x) +#else +#define DEBUG_PRINT(x) +#define DEBUG_BEGIN +#endif + +//includes +#include +#include +#include +#include + +//extension of ESP8266WebServer with SPIFFS handlers built in +#include // https://github.com/r-downing/SPIFFSReadServer +// upload data folder to chip with Arduino ESP8266 filesystem uploader +// https://github.com/esp8266/arduino-esp8266fs-plugin + +#include +#include + +#define DEVICE_NAME "ESP8266 DEVICE" + + +//server objects +SPIFFSReadServer server(80); +DNSServer dnsServer; +PersWiFiManager persWM(server, dnsServer); + +////// Sample program data +int x; +String y; + +void setup() { + DEBUG_BEGIN; //for terminal debugging + DEBUG_PRINT(); + + //allows serving of files from SPIFFS + SPIFFS.begin(); + //sets network name for AP mode + persWM.setApCredentials(DEVICE_NAME); + //persWM.setApCredentials(DEVICE_NAME, "password"); optional password + persWM.begin(); + + //handles commands from webpage, sends live data in JSON format + server.on("/api", []() { + DEBUG_PRINT("server.on /api"); + if (server.hasArg("x")) { + x = server.arg("x").toInt(); + DEBUG_PRINT(String("x: ")+x); + } //if + if (server.hasArg("y")) { + y = server.arg("y"); + DEBUG_PRINT("y: "+y); + } //if + + //build json object of program data + StaticJsonBuffer<200> jsonBuffer; + JsonObject &json = jsonBuffer.createObject(); + json["x"] = x; + json["y"] = y; + + char jsonchar[200]; + json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece + server.send(200, "application/json", jsonchar); + + }); //server.on api + + + //SSDP makes device visible on windows network + server.on("/description.xml", HTTP_GET, []() { + SSDP.schema(server.client()); + }); + SSDP.setSchemaURL("description.xml"); + SSDP.setHTTPPort(80); + SSDP.setName(DEVICE_NAME); + SSDP.setURL("/"); + SSDP.begin(); + SSDP.setDeviceType("upnp:rootdevice"); + + server.begin(); + DEBUG_PRINT("setup complete."); +} //void setup + +void loop() { + dnsServer.processNextRequest(); + server.handleClient(); + + // do stuff with x and y + +} //void loop diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/index.htm b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/index.htm new file mode 100644 index 00000000..c6f2be1f --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/index.htm @@ -0,0 +1,52 @@ +

Current Data

+x: + +
y: + + +
Last updated + seconds ago. + +
+ +

Update Data

+
+ x: + + +
+
+ y: + + +
+ +WiFi settings + + diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.htm b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.htm new file mode 100644 index 00000000..5d083729 --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.htm @@ -0,0 +1,108 @@ + + + + + + ESP WiFi + + + + + +
+ +

+
+ +
+ +
+
+ +
+
+
+ +
+ +
+ +
+ Back | + Home +
+ + + diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm new file mode 100644 index 00000000..49a4a55b --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm @@ -0,0 +1 @@ +ESP WiFi









Back | Home
\ No newline at end of file diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz new file mode 100644 index 00000000..c8b0d2fb Binary files /dev/null and b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz differ diff --git a/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino new file mode 100644 index 00000000..bab08e5d --- /dev/null +++ b/3rdparty/PersWiFiManager/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino @@ -0,0 +1,111 @@ +/* +SPIFFS-served REST API example for PersWiFiManager v3.0 +*/ + +#define DEBUG_SERIAL //uncomment for Serial debugging statements + +#ifdef DEBUG_SERIAL +#define DEBUG_BEGIN Serial.begin(115200) +#define DEBUG_PRINT(x) Serial.println(x) +#else +#define DEBUG_PRINT(x) +#define DEBUG_BEGIN +#endif + +//includes +#include +#include +#include + +#include // http://ryandowning.net/EasySSDP/ + +//extension of ESP8266WebServer with SPIFFS handlers built in +#include // http://ryandowning.net/SPIFFSReadServer/ +// upload data folder to chip with Arduino ESP8266 filesystem uploader +// https://github.com/esp8266/arduino-esp8266fs-plugin + +#include +#include + +#define DEVICE_NAME "ESP8266 DEVICE" + + +//server objects +SPIFFSReadServer server(80); +DNSServer dnsServer; +PersWiFiManager persWM(server, dnsServer); + +////// Sample program data +int x; +String y; + +void setup() { + DEBUG_BEGIN; //for terminal debugging + DEBUG_PRINT(); + + //optional code handlers to run everytime wifi is connected... + persWM.onConnect([]() { + DEBUG_PRINT("wifi connected"); + DEBUG_PRINT(WiFi.localIP()); + EasySSDP::begin(server); + }); + //...or AP mode is started + persWM.onAp([](){ + DEBUG_PRINT("AP MODE"); + DEBUG_PRINT(persWM.getApSsid()); + }); + + //allows serving of files from SPIFFS + SPIFFS.begin(); + //sets network name for AP mode + persWM.setApCredentials(DEVICE_NAME); + //persWM.setApCredentials(DEVICE_NAME, "password"); optional password + + //make connecting/disconnecting non-blocking + persWM.setConnectNonBlock(true); + + //in non-blocking mode, program will continue past this point without waiting + persWM.begin(); + + //handles commands from webpage, sends live data in JSON format + server.on("/api", []() { + DEBUG_PRINT("server.on /api"); + if (server.hasArg("x")) { + x = server.arg("x").toInt(); + DEBUG_PRINT(String("x: ") + x); + } //if + if (server.hasArg("y")) { + y = server.arg("y"); + DEBUG_PRINT("y: " + y); + } //if + + //build json object of program data + StaticJsonBuffer<200> jsonBuffer; + JsonObject &json = jsonBuffer.createObject(); + json["x"] = x; + json["y"] = y; + + char jsonchar[200]; + json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece + server.send(200, "application/json", jsonchar); + + }); //server.on api + + + server.begin(); + DEBUG_PRINT("setup complete."); +} //void setup + +void loop() { + //in non-blocking mode, handleWiFi must be called in the main loop + persWM.handleWiFi(); + + dnsServer.processNextRequest(); + server.handleClient(); + + //DEBUG_PRINT(millis()); + + // do stuff with x and y + +} //void loop + diff --git a/3rdparty/PersWiFiManager/keywords.txt b/3rdparty/PersWiFiManager/keywords.txt new file mode 100644 index 00000000..01e0d404 --- /dev/null +++ b/3rdparty/PersWiFiManager/keywords.txt @@ -0,0 +1,28 @@ +####################################### +# Syntax Coloring Map For PersWiFiManager Library +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +PersWiFiManager KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +attemptConnection KEYWORD2 +setupWiFiHandlers KEYWORD2 +begin KEYWORD2 +getApSsid KEYWORD2 +setApCredentials KEYWORD2 +handleWiFi KEYWORD2 +setConnectNonBlock KEYWORD2 +startApMode KEYWORD2 +onConnect KEYWORD2 +onAp KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/3rdparty/PersWiFiManager/library.properties b/3rdparty/PersWiFiManager/library.properties new file mode 100644 index 00000000..03ad2842 --- /dev/null +++ b/3rdparty/PersWiFiManager/library.properties @@ -0,0 +1,9 @@ +name=PersWiFiManager +version=3.0.1 +author=Ryan Downing +maintainer=Ryan Downing +sentence=Persistent WiFi Manager +paragraph=A non-blocking, persistant wifi manager for ESP8266 that allows network changes at any time +category=Communication +url=http://ryandowning.net/PersWiFiManager/ +architectures=esp8266 diff --git a/3rdparty/Si5351mcu/.gitignore b/3rdparty/Si5351mcu/.gitignore new file mode 100644 index 00000000..caa28400 --- /dev/null +++ b/3rdparty/Si5351mcu/.gitignore @@ -0,0 +1,7 @@ +.amake +<<<<<<< HEAD +.gch +~* + +======= +>>>>>>> 95b7ed7323809929eba7b3b2a5185d73b4242877 diff --git a/3rdparty/Si5351mcu/ChangeLog.md b/3rdparty/Si5351mcu/ChangeLog.md new file mode 100644 index 00000000..6864f8a0 --- /dev/null +++ b/3rdparty/Si5351mcu/ChangeLog.md @@ -0,0 +1,54 @@ +# Si5351mcu Changelog File # + +## v0.6.1 (Augus 1, 2018) ## + +* Documentation update and completion to match code features and tricks + +## v0.6 (February 10, 2018) ## + +* Feature: you can now OVERCLOCK the Si5351 to get up to 250 MHz from it, see the overclock subject on the README.md +* Documentation improvements and re-arrangement. + +## v0.5 (February 7, 2018) ## + +* Feature: All integer math now, induced error must be at worst +/- 2 Hz. +* Feature: Clock status via clkOn[clk] public var. +* Bug Fix: Output divider low limit safe guard in place (it make some trouble under some circumstances) +* New super simple example. + +## v0.4 (August 2, 2017) ## + +* Bug Fix: Triaged a strange level problem with freqs above ~112 Mhz, the signal level start dropping around 112MHz and ~150 MHz suddenly go beyond limits (high) to slowly drop again up to the end. Fact: the lib needs a reset() on EVERY frequency change above VCO/8 (~112MHz). Remember that datasheet specs are 8KHz to 160MHz, but we are pushing it up to ~225 Mhz (max_vco/4) +* Code refractory on some points to match correct behavior, as previous code has little bugs introduced by bad documentation from Silicon Labs (+1 for the chip; -5 for the docs errors). See Bitx20 mail-lits archives for June-August 2017 for more info and the debate. + +## v0.3 (June 14, 2017) ## + +* Feature: the lib now handle the include and start of the I2C (Wire) library internally via the init procedures +* Added a new generic init() procedure to handle the default parameters +* The init() function is required from now on (MANDATORY) +* Fixed the way we handled the base xtal and the correction factor + +## v0.2rc (April 23, 2017) ## + +* Added power level support for each output independently, watch out!: setting the power level will enable the output. +* Set default power to the lowest one (2mA) from the maximun possible (8mA). +* Fixed the need for a reset after each correction, it does it now automatically +* Added a init function to pass a custom xtal +* Modified the example to show no need for a init unless you use a different xtal +* Improved the keywords.txt file to improve edition on the Arduino IDE +* Included a "features" section on the README.md + +## v0.1rc (April 20, 2017) ## + +* Added enable(), disable() and off() functions. +* Added support for handling all the three outputs of the Si5351A, (CLK1 & CLK2 are mutually-exclusive) +* Updated the example with the new functions. +* Improved library logic by reusing and optimizing functions. +* Improved the documentation and comments (lib code, README and example) +* The compiled code is slightly smaller now (~1% on an ATMega328p) +* Added Changelog and version files. +* Extensive tests made to validate every function. + +## Initial Release, v0.0 (April 9, 2017) ## + +* Basic functionality. diff --git a/3rdparty/Si5351mcu/README.md b/3rdparty/Si5351mcu/README.md new file mode 100644 index 00000000..c24b6fd1 --- /dev/null +++ b/3rdparty/Si5351mcu/README.md @@ -0,0 +1,271 @@ +# Arduino Si5351 Library tuned for size and click noise free. # + +This library is tuned for size on the Arduino platform, it will control CLK0, CLK1 and CLK2 outputs for the Si5351A (the version with just 3 clocks out, but you will not be able to use the three at once). + +## Inspiration ## + +This work is based on the previous work of these great people: + +* [Etherkit/NT7S:](https://github.com/etherkit/Si5351Arduino) The mainstream full featured lib, with big code as well (based on Linux kernel code) +* [QRP Labs demo code from Hans Summers:](http://qrp-labs.com/synth/si5351ademo.html) The smallest and simple ones on the net. +* [DK7IH demo code:](https://radiotransmitter.wordpress.com/category/si5351a/) The first clickless noise code on the wild. +* [Jerry Gaffke](https://github.com/afarhan/ubitx.git) integer routines for the Raduino and ubitx + +## Set your Goal and make an estrategy ## + +There is a few routines in the Internet to manage the Si5351 chip, all of them has a few distinct feature set because they use different strategies (different goals) that make them unique in some way. + +My goal is this: +* Keep it as small as possible (Smallest firmware footprint) +* Less phase and click noise possible (Playing with every trick possible) + +The main purpose is to be used in Radio receiver projects, so this two mentioned goals are the golden rule. + +Let's list some of goals archeivements and bonuses: + +**Small firmware footprint:** + +A basic sketch to set just only one clock out to a given frequency with a change in power and correcting the XTAL ppm error is only ~3.3 kBytes of firmware (~10% of an Arduino Uno) + +The same settings with the [Si5351Arduino library (Etherkit)](https://github.com/etherkit/Si5351Arduino) will give you a bigger firmware space of ~10 kBytes or 31% of an Arduino Uno. + +[Jerry Gaffke](https://github.com/afarhan/ubitx.git) embedded routines in the ubitx transceiver has the smallest footprint in the Arduino platform I have seen, but has worst phase noise and smallest frequency range. + +**Phase noise to the minimum:** + +We use every trick on the datasheet, OEM Application Notes or the Internet to minimize phase noise. (Even a few ones learned on the process) + +For example the [Etherkit](https://github.com/etherkit/Si5351Arduino) library and [Jerry Gaffke](https://github.com/afarhan/ubitx.git) embedded routines uses some but not all the tricks to minimize phase noise (Etherkit one gives control over all features, Jerry Gaffke has small footprint and in the process he sacrifice phase noise and frequency range) + +**Click noise free:** + +If you play from the book (Datasheet and Application Notes) you will have a "click-like" noise burst every time you change the output frequency. + +That's not a problem if you intend to use only fixed frequencies at the output, but if you plan to sweep or use it on any application that moves the frequency that click-like noise will haunt you. (like in a radio receiver or transceiver) + +I have learned a few tricks from many sources in the Internet and after some local testing I have came across a scheme that make this lib virtually click-noise-less; see the "Click noise free" section below for details. + +**Fast frequency changes:** + +This was a side effect of the last trick to minimize the click noise, see the "Click noise free" section below for details. + +Summary: other routines write all registers for every frequency change, I write half of them most of the time, speeding up the process. + +**Two of three** + +Yes, there is no such thing as free lunch, to get all the above features and the ones that follow I have to make some sacrifices, in this case spare one of the outputs. See "Two of three" section below. + +## Features ## + +This are so far the implemented features (Any particular wish? use the Issues tab for that): + +* Custom XTAL passing on init (Default is 27.000 MHz (See _Si.init()_ ) +* You can pass a correction to the xtal while running (See _Si.correction()_ ) +* You have a fast way to power off all outputs of the Chip at once. (See _Si.off()_ ) +* You can enable/disable any output at any time (See _Si.enable(clk) and Si.disable(clk)_ ) +* By default all outputs are off after the Si.init() procedure. You has to enable them by hand. +* You can only have 2 of the 3 outputs running at any moment (See "Two of three" section below) +* Power control on each output independently (See _Si.setPower(clk, level)_ on the lib header) +* Initial power defaults to the lowest level (2mA) for all outputs. +* You don't need to include and configure the Wire (I2C) library, this lib do that for you already. +* Frequency limits are not hard coded on the lib, so you can stress your hardware to it's particular limit (_You can move usually from ~3kHz to ~225 MHz, far away from the 8kHz to 160 MHz limits from the datasheet_) +* You has a way to verify the status of a particular clock (_Enabled/Disabled by the Si.clkOn[clk] var_) +* From v0.5 and beyond we saved more than 1 kbyte of your precious firmware space due to the use of all integer math now (Worst induced error is below +/- 1 Hz) +* Overclock, yes, you can move the limits upward up to ~250MHz (see the "OVERCLOCK" section below) +* Improved the click noise algorithm to get even more click noise reduction (see Click noise free section below) +* Fast frequency changes as part of the improved click noise algorithm (see Click noise free section below) + +## How to use the lib ## + +Get the lib by cloning this git repository or get it by clicking the green "Download button" on the page. + +Move it or extract it on your library directory + +Include the lib in your code: + + +``` +(... your code here ...) + +// now include the library +#include "si5351mcu.h" + +// lib instantiation as "Si" +Si5351mcu Si; + +(... more of your code here ...) + +``` + +Follow this sequence on you setup() procedure: + +* Initialize the library with the default or optional Xtal Clock. +* Apply correction factor (if needed) +* Set some frequencies to the desired outputs. +* Enable the desired outputs + +Here you have an example code ("Si" is the lib instance): + +``` +setup() { + (... your code here ...) + + ////////////////////////////////// + // Si5351 functions / + ////////////////////////////////// + + // Init the library, in this case with the default 27.000 Mhz Xtal + Si.init(); + + // commented Init procedure for a not default 25.000 MHz xtal + //Si.init(25000000L); + + // Optional, apply a pre-calculated correction factor + Si.correction(-150); // Xtal is low by 150 Hz + + // Enable the desired outputs with some frequencies + Si.setFreq(0, 25000000); // CLK0 output 25.000 MHz + Si.setFreq(1, 145000000); // CLK1 output 145.000 MHz + + // enable the outputs + Si.enable(0); + Si.enable(1); + + (... more of your code here ...) +} + +``` + +If you need to apply/vary the correction factor **after** the setup process you will get a click noise on the next setFreq() to apply the changes. + +Use it, you can enable, disable, change the power or frequency, see this code fragment with some examples: + +``` +loop() { + (... your code here ...) + + // disable clk1 + Si.disable(1); + + // change the power of clk0 to 4mA + Si.setPower(0, SIOUT_4mA); + + // apply a correction factor of 300 Hz (correction will be applied on the next Si.setFreq() call) + Si.correction(300); + + // change the clk0 output frequency + Si.setFreq(0, 7110000); + + // power of all outputs + Si.off(); + + (... more of your code here ...) +} +``` + + +## OVERCLOCK ## + +Yes, you can overclock the Si5351, the datasheet states that the VCO moves from 600 to 900 MHz and that gives us a usable range from ~3 kHz to 225 MHz. + +But what if we can move the VCO frequency to a higher values? + +The overclock feature does just that, use a higher top limit for the VCO on the calculations. In my test with two batch of the Si5351A I can get safely up to 1.000 GHz without trouble; in one batch the PLL unlocks around 1.1 GHz and in the other about 1.050 GHz; so I recommend not going beyond 1.000 GHz. + +With a maximum VCO of 1.000 GHz and a lower division factor of 4 we have jumped from a 255 MHz to 250 MHz top frequency that can be generated with our cheap chip. + +**Some "must include" WARNINGS:** + +* The chip was not intended to go that high, so, use it with caution and test it on your hardware moving the overclock limit in steps of 10 MHz starting with 900 MHz and testing with every change until it does not work; then go down by 10 MHz to be in a safe zone. +* Moving the upper limit has its penalty on the lower level, your bottom frequency will move from the ~3 kHz to ~10 kHz range. +* The phase noise of the output if worst as you use a higher frequency, at a _**fixed**_ 250 MHz it's noticeable but no so bad for a TTL or CMOS clock application. +* The phase noise is specially bad if you make a sweep or move action beyond 180 MHz; the phase noise from the unlock state to next lock of the PLL is very noticeable in a spectrum analyzer, even on a cheap RTL-SDR one. +* I recommend to only use the outputs beyond 150 MHz as fixed value and don't move them if you cares about phase noise. + +**How to do it?** + +You need to declare a macro with the overclock value **BEFORE** the library include, just like this: + +``` +(... your code here ...) + +// Using the overclock feature for the Si5351mcu library +#define SI_OVERCLOCK 1000000000L // 1.0 GHz in Hz + +// now include the library +#include "si5351mcu.h" + +// lib instantiation as "Si" +Si5351mcu Si; + +// now you can generate frequencies from ~10 kHz up to 250 MHz. + +(... more of your code here ...) + +``` + +## Click noise free ## + +Click-like noise came from a few sources as per my testing: + +* Turn off then on the CLKx outputs (Register 3. Output Enable Control) +* Power down then on the Msynths (CLKx_PDN bits for every Msynth) +* Reset the PLL (Register 177: PLL Reset) + +We are concerned about click noise only when changing from one frequency to the other, so if we don't touch the output enable control or the power down msynth registers once activated; then we are set to avoid click from this two first sources. + +The last one is tricky, in theory a PLL does not need to be reseted every time you change it's output frequency as it's a **P**hase **L**ocked **L**oop and it's a self correcting algorithm/hardware. + +That last idea was put to test on a simple scheme: what if I set a fixed output divider Msynth and move the VCO for it's entire range without resetting it on any point? + +If the "PLL reset" is in deed needed I will have some strange behavior at some point, right? + +But practice confirmed my idea, I can set a output Msynth of 6 and move the VCO (PLL) for the entire range (600 to 900 MHz) and get a continuous and stable output from 100 to 150 MHz. + +Then what is for the "PLL reset" (Register 177) in practice? + +Some further test showed that this "reset" function is applied no to the PLL Msynth, but to the output Msynth and not in every case, yes, it has a bad name or a bad explained name. + +After some test I find that you need the "PLL reset" (Register 177) trick only on some cases when you change the value of the output divider Msynth. + +Implementing that in code was easy, an array to keep track of the actual output divider Msynth and only write it to the chip and reset "the PLL" when it's needed. + +Hey! that leads to a I2C time reduction by half (most of the time) as a side effect! + +Most of the time when you are making a sweep the output divider Msynth has a constant value and you only moves the VCO (PLL) Then I wrote just 8 bytes to the I2C bus (to control the VCO/PLL) instead of 16 (8 for the VCO/PLL & 8 more for the output divider Msynth) or 17 (16 + reset byte) most of the time, cutting time between writes to half making frequency changes 2x fast as before. + +## Two of three ## + +Yes, there is a tittle catch here with CLK1 and CLK2: both share PLL_B and as we use our own algorithm to calculate the frequencies and minimize phase noise you can only use one of them at a time. + +Note: _In practice you can, but the other will move from the frequency you set, which is an unexpected behavior, so I made them mutually exclusive (CLK1 and CLK2)._ + +This are the valid combinations for independent clocks output. + +* CLK0 and CLK1 +* CLK0 and CLK2 + +Again: You can't use CLK1 and CLK2 at the same time, as soon as you set one of them the other will shut off. That's why you get two of three and one of them must be always CLK0. + +## Author & contributors ## + +The only author is Pavel Milanes, CO7WT, a cuban amateur radio operator; reachable at pavelmc@gmail.com, Until now I have no contributors or sponsors. + +## Where to download the latest version? ## + +Always download the latest version from the [github repository](https://github.com/pavelmc/Si5351mcu/) + +See ChangeLog.md and Version files on this repository to know what are the latest changes and versions. + +## If you like to give thanks... ## + +No payment of whatsoever is required to use this code: this is [Free/Libre Software](https://en.wikipedia.org/wiki/Software_Libre), nevertheless donations are very welcomed. + +I live in Cuba island and the Internet/Cell is very expensive here (USD $1.00/hour), you can donate anonymously internet time or cell phone air time to me via [Ding Topups](https://www.ding.com/) to keep me connected and developing for the homebrewers community. + +If you like to do so, please go to Ding, select Cuba, select Cubacell (for phone top up) or Nauta (for Internet time) + +* For phone topup use this number (My cell, feel free to call me if you like): +53 538-478-19 +* For internet time use this user (Nauta service): co7wt@nauta.com.cu (that's not an email but an user account name) + +Thanks! diff --git a/3rdparty/Si5351mcu/examples/si5351_mcu/si5351_mcu.ino b/3rdparty/Si5351mcu/examples/si5351_mcu/si5351_mcu.ino new file mode 100644 index 00000000..b38a3016 --- /dev/null +++ b/3rdparty/Si5351mcu/examples/si5351_mcu/si5351_mcu.ino @@ -0,0 +1,158 @@ +/* + * si5351mcu - Si5351 library for Arduino, MCU tuned for size and click-less + * + * This is the packed example. + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/*************************************************************************** + * This example is meant to be monitored with an RTL-SDR receiver + * but you can change the frequency and other vars to test with your hardware. + * + * Set your SDR software to monitor from 60 to 62 Mhz. + * + * This will set 60.0 Mhz in clock 0, put and alternating frequencies + * at 60.5 and 61.0 Mhz on CLK1 and CLK2 to show they are mutually exclusive. + * + * Then make a sweep from 60 to 62 Mhz on CLK2, with an stop every 200Khz + * and then a train of one second pulses will follow with varying power levels + * + * Take into account your XTAL error, see Si.correction(###) below + * + ***************************************************************************/ + +#include "si5351mcu.h" + +// lib instantiation as "Si" +Si5351mcu Si; + +// Stop every X Mhz for Y seconds to measure +#define EVERY 200000 // stop every 200khz +#define DANCE 3 // 3 seconds + +// some variables +long freqStart = 60000000; // 60.0 MHz +long freqStop = 62000000; // 62.0 MHz +long step = 10000; // 10.0 kHz +long freq = freqStart; + + +void setup() { + // init the Si5351 lib + Si.init(); + + // For a different xtal (from the default of 27.00000 Mhz) + // just pass it on the init procedure, just like this + // Si.init(26570000); + + // set & apply my calculated correction factor + Si.correction(-1250); + + // pre-load some sweet spot freqs + Si.setFreq(0, freqStart); + Si.setFreq(1, freqStart); + + // reset the PLLs + Si.reset(); + + // put a tone in the start freq on CLK0 + Si.setFreq(0, freqStart); + Si.enable(0); + + // make the dance on the two outputs + Si.setFreq(1, freqStart + 500000); // CLK1 output + Si.enable(1); + delay(3000); + // Si.disable(1); // no need to disable, enabling CLK2 disable this + + Si.setFreq(2, freqStart + 1000000); // CLK2 output + Si.enable(2); + delay(3000); + //Si.disable(2); // no need to disable, enabling CLK1 disable this + + Si.setFreq(1, freqStart + 500000); // CLK1 output + Si.enable(1); + delay(3000); + //Si.disable(1); // no need to disable, enabling CLK2 disable this + + Si.setFreq(2, freqStart + 1000000); // CLK2 output + Si.enable(2); + delay(3000); + Si.disable(2); // this is the last in the dance, disable it + + // shut down CLK0 + Si.disable(0); + + // set CLK2 to the start freq + Si.setFreq(2, freqStart); // it's disabled by now +} + + +void loop() { + // check for the stop to measure + if ((freq % EVERY) == 0) { + // it's time to flip-flop it + + for (byte i = 0; i < 4; i++) { + // power off the clk2 output + Si.disable(2); + delay(500); + // power mod, the lib define some macros for that: + // SIOUT_2mA, SIOUT_4mA, SIOUT_6mA and SIOUT_8mA + // + // But they are incidentally matching the 0 to 3 count.. + // so I will use the cycle counter for that (i) + // + // moreover, setting the power on an output will enable it + // so I will explicit omit the enable here + Si.setPower(2, i); + //Si.enable(2); + + delay(1000); + } + + // reset the power to low + Si.setPower(2, SIOUT_2mA); + + // set it for the new cycle + freq += step; + } else { + // check if we are on the limits + if (freq <= freqStop) { + // no, set and increment + Si.setFreq(2,freq); // but it can be with CLK0 or CLK1 instead + + // set it for the new cycle + freq += step; + + // a short delay to slow things a little. + delay(50); + } else { + // we reached the limit, reset to start + freq = freqStart; + } + } +} diff --git a/3rdparty/Si5351mcu/examples/si5351_mcu_simple/si5351_mcu_simple.ino b/3rdparty/Si5351mcu/examples/si5351_mcu_simple/si5351_mcu_simple.ino new file mode 100644 index 00000000..998fd027 --- /dev/null +++ b/3rdparty/Si5351mcu/examples/si5351_mcu_simple/si5351_mcu_simple.ino @@ -0,0 +1,72 @@ +/* + * si5351mcu - Si5351 library for Arduino, MCU tuned for size and click-less + * + * This is the packed simplest example. + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/*************************************************************************** + * Just put two frequencies out in clk0 and clk1 at different power levels + * + * Take into account your XTAL error, see Si.correction(###) below + ***************************************************************************/ + +#include "si5351mcu.h" + +// lib instantiation as "Si" +Si5351mcu Si; + +// some variables +long F1 = 60000000; // 60.0 MHz to CLK0 +long F2 = 60500000; // 60.5 MHz to CLK1 + +void setup() { + // init the Si5351 lib + Si.init(); + + // For a different xtal (from the default of 27.00000 Mhz) + // just pass it on the init procedure, just like this + // Si.init(26570000); + + // set & apply my calculated correction factor + Si.correction(-1250); + + // set max power to both outputs + Si.setPower(0, SIOUT_8mA); + Si.setPower(1, SIOUT_2mA); + + // Set frequencies + Si.setFreq(0, F1); + Si.setFreq(1, F2); + + // reset the PLLs + Si.reset(); +} + + +void loop() { + // do nothing +} diff --git a/3rdparty/Si5351mcu/keywords.txt b/3rdparty/Si5351mcu/keywords.txt new file mode 100644 index 00000000..9468e2b1 --- /dev/null +++ b/3rdparty/Si5351mcu/keywords.txt @@ -0,0 +1,21 @@ +Si5351mcu KEYWORD1 + +init KEYWORD2 +correction KEYWORD2 +i2cWrite KEYWORD2 +reset KEYWORD2 +setFreq KEYWORD2 +enable KEYWORD2 +disable KEYWORD2 +setPower KEYWORD2 +clkOn KEYWORD2 + +SIXTAL LITERAL1 +SIADDR LITERAL1 +SIOUT_2mA LITERAL1 +SIOUT_4mA LITERAL1 +SIOUT_6mA LITERAL1 +SIOUT_8mA LITERAL1 +SICLK0_R LITERAL1 +SICLK12_R LITERAL1 +SI_OVERCLOCK LITERAL1 diff --git a/3rdparty/Si5351mcu/library.properties b/3rdparty/Si5351mcu/library.properties new file mode 100644 index 00000000..5d8d5c91 --- /dev/null +++ b/3rdparty/Si5351mcu/library.properties @@ -0,0 +1,9 @@ +name=Si5351mcu +version=0.6 +author=Pavel Milanes +maintainer=Pavel Milanes +sentence=A MCU friendly library for the Si5351A clock generator ICs from Silicon Labs. +paragraph=This library is optimized for size over the Arduino platform; will allow you to control any of the three out of the Si5351 outputs (but only two at the same time). It's click FREE while tuning and really small. +category=Device Control +url=https://github.com/pavelmc/Si5351mcu +architectures=* diff --git a/3rdparty/Si5351mcu/licence.txt b/3rdparty/Si5351mcu/licence.txt new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/3rdparty/Si5351mcu/licence.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/3rdparty/Si5351mcu/src/si5351mcu.cpp b/3rdparty/Si5351mcu/src/si5351mcu.cpp new file mode 100644 index 00000000..29633bc8 --- /dev/null +++ b/3rdparty/Si5351mcu/src/si5351mcu.cpp @@ -0,0 +1,301 @@ +/* + * si5351mcu - Si5351 library for Arduino MCU tuned for size and click-less + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "Arduino.h" +#include "si5351mcu.h" + +// wire library loading, if not defined +#ifndef WIRE_H + #include "Wire.h" +#endif + +/***************************************************************************** + * This is the default init procedure, it set the Si5351 with this params: + * XTAL 27.000 Mhz + *****************************************************************************/ + void Si5351mcu::init() { + // init with the default freq + init(int_xtal); +} + + +/***************************************************************************** + * This is the custom init procedure, it's used to pass a custom xtal + * and has the duty of init the I2C protocol handshake + *****************************************************************************/ + void Si5351mcu::init(uint32_t nxtal) { + // set the new base xtal freq + base_xtal = int_xtal = nxtal; + + // start I2C (wire) procedures + Wire.begin(); + + // power off all the outputs + off(); +} + + +/***************************************************************************** + * This function set the freq of the corresponding clock. + * + * In my tests my Si5351 can work between 7,8 Khz and ~225 Mhz [~250 MHz with + * overclocking] as usual YMMV + * + * Click noise: + * - The lib has a reset programmed [aka: click noise] every time it needs to + * change the output divider of a particular MSynth, if you move in big steps + * this can lead to an increased rate of click noise per tunning step. + * - If you move at a pace of a few Hz each time the output divider will + * change at a low rate, hence less click noise per tunning step. + * - The output divider moves [change] faster at high frequencies, so at HF the + * clikc noise is at the real minimum possible. + * + * [See the README.md file for other details] + ****************************************************************************/ +void Si5351mcu::setFreq(uint8_t clk, unsigned long freq) { + uint8_t a, R = 1, shifts = 0; + uint32_t b, c, f, fvco, outdivider; + uint32_t MSx_P1, MSNx_P1, MSNx_P2, MSNx_P3; + + // Overclock option + #ifdef SI_OVERCLOCK + // user a overclock setting for the VCO, max value in my hardware + // was 1.05 to 1.1 GHz, as usual YMMV [See README.md for details] + outdivider = SI_OVERCLOCK / freq; + #else + // normal VCO from the datasheet and AN + // With 900 MHz beeing the maximum internal PLL-Frequency + outdivider = 900000000 / freq; + #endif + + // use additional Output divider ("R") + while (outdivider > 900) { + R = R * 2; + outdivider = outdivider / 2; + } + + // finds the even divider which delivers the intended Frequency + if (outdivider % 2) outdivider--; + + // Calculate the PLL-Frequency (given the even divider) + fvco = outdivider * R * freq; + + // Convert the Output Divider to the bit-setting required in register 44 + switch (R) { + case 1: R = 0; break; + case 2: R = 16; break; + case 4: R = 32; break; + case 8: R = 48; break; + case 16: R = 64; break; + case 32: R = 80; break; + case 64: R = 96; break; + case 128: R = 112; break; + } + + // we have now the integer part of the output msynth + // the b & c is fixed below + MSx_P1 = 128 * outdivider - 512; + + // calc the a/b/c for the PLL Msynth + /*************************************************************************** + * We will use integer only on the b/c relation, and will >> 5 (/32) both + * to fit it on the 1048 k limit of C and keep the relation + * the most accurate possible, this works fine with xtals from + * 24 to 28 Mhz. + * + * This will give errors of about +/- 2 Hz maximum + * as per my test and simulations in the worst case, well below the + * XTAl ppm error... + * + * This will free more than 1K of the final eeprom + * + ****************************************************************************/ + a = fvco / int_xtal; + b = (fvco % int_xtal) >> 5; // Integer par of the fraction + // scaled to match "c" limits + c = int_xtal >> 5; // "c" scaled to match it's limits + // in the register + + // f is (128*b)/c to mimic the Floor(128*(b/c)) from the datasheet + f = (128 * b) / c; + + // build the registers to write + MSNx_P1 = 128 * a + f - 512; + MSNx_P2 = 128 * b - f * c; + MSNx_P3 = c; + + // PLLs and CLK# registers are allocated with a shift, we handle that with + // the shifts var to make code smaller + if (clk > 0 ) shifts = 8; + + // plls, A & B registers separated by 8 bytes + i2cWrite(26 + shifts, (MSNx_P3 & 65280) >> 8); // Bits [15:8] of MSNx_P3 in register 26 + i2cWrite(27 + shifts, MSNx_P3 & 255); + i2cWrite(28 + shifts, (MSNx_P1 & 196608) >> 16); + i2cWrite(29 + shifts, (MSNx_P1 & 65280) >> 8); // Bits [15:8] of MSNx_P1 in register 29 + i2cWrite(30 + shifts, MSNx_P1 & 255); // Bits [7:0] of MSNx_P1 in register 30 + i2cWrite(31 + shifts, ((MSNx_P3 & 983040) >> 12) | ((MSNx_P2 & 983040) >> 16)); // Parts of MSNx_P3 and MSNx_P1 + i2cWrite(32 + shifts, (MSNx_P2 & 65280) >> 8); // Bits [15:8] of MSNx_P2 in register 32 + i2cWrite(33 + shifts, MSNx_P2 & 255); // Bits [7:0] of MSNx_P2 in register 33 + + // Write the output divider msynth only if we need to, in this way we can + // speed up the frequency changes almost by half the time most of the time + // and the main goal is to avoid the nasty click noise on freq change + if (omsynth[clk] != outdivider) { + // CLK# registers are exactly 8 * clk# bytes shifted from a base register. + shifts = clk * 8; + + // multisynths + i2cWrite(42 + shifts, 0); // Bits [15:8] of MS0_P3 (always 0) in register 42 + i2cWrite(43 + shifts, 1); // Bits [7:0] of MS0_P3 (always 1) in register 43 + // See datasheet, special trick when R=4 + if (outdivider == 4) { + i2cWrite(44 + shifts, 12 | R); + i2cWrite(45 + shifts, 0); // Bits [15:8] of MSx_P1 must be 0 + i2cWrite(46 + shifts, 0); // Bits [7:0] of MSx_P1 must be 0 + } else { + i2cWrite(44 + shifts, ((MSx_P1 & 196608) >> 16) | R); // Bits [17:16] of MSx_P1 in bits [1:0] and R in [7:4] + i2cWrite(45 + shifts, (MSx_P1 & 65280) >> 8); // Bits [15:8] of MSx_P1 in register 45 + i2cWrite(46 + shifts, MSx_P1 & 255); // Bits [7:0] of MSx_P1 in register 46 + } + i2cWrite(47 + shifts, 0); // Bits [19:16] of MS0_P2 and MS0_P3 are always 0 + i2cWrite(48 + shifts, 0); // Bits [15:8] of MS0_P2 are always 0 + i2cWrite(49 + shifts, 0); // Bits [7:0] of MS0_P2 are always 0 + + // must reset the so called "PLL", in fact the output msynth + reset(); + + // keep track of the change + omsynth[clk] = (uint16_t)outdivider; + } +} + + +/***************************************************************************** + * Reset of the PLLs and multisynths output enable + * + * This must be called to soft reset the PLLs and cycle the output of the + * multisynths: this is the "click" noise source in the RF spectrum. + * + * So it must be avoided at all costs, so this lib just call it at the + * initialization of the PLLs and when a correction is applied + * + * If you are concerned with accuracy you can implement a reset every + * other Mhz to be sure it get exactly on spot. + ****************************************************************************/ +void Si5351mcu::reset(void) { + // This soft-resets PLL A & B (32 + 128) in just one step + i2cWrite(177, 0xA0); +} + + +/***************************************************************************** + * Function to disable all outputs + * + * The PLL are kept running, just the m-synths are powered off. + * + * This allows to keep the chip warm and exactly on freq the next time you + * enable an output. + ****************************************************************************/ +void Si5351mcu::off() { + // This disable all the CLK outputs + for (byte i=0; i<3; i++) disable(i); +} + + +/***************************************************************************** + * Function to set the correction in Hz over the Si5351 XTAL. + * + * This will call a reset of the PLLs and multi-synths so it will produce a + * click every time it's called + ****************************************************************************/ +void Si5351mcu::correction(int32_t diff) { + // apply some corrections to the xtal + int_xtal = base_xtal + diff; + + // reset the PLLs to apply the correction + reset(); +} + + +/***************************************************************************** + * This function enables the selected output + * + * Beware: ZERO is clock output enabled + *****************************************************************************/ +void Si5351mcu::enable(uint8_t clk) { + // var to handle the mask of the registers value + uint8_t m = SICLK0_R; + if (clk > 0) m = SICLK12_R; + + // write the register value + i2cWrite(16 + clk, m + clkpower[clk]); + + // 1 & 2 are mutually exclusive + if (clk == 1) disable(2); + if (clk == 2) disable(1); + + // update the status of the clk + clkOn[clk] = 1; +} + + +/***************************************************************************** + * This function disables the selected output + * + * Beware: ONE is clock output disabled + * *****************************************************************************/ +void Si5351mcu::disable(uint8_t clk) { + // send + i2cWrite(16 + clk, 128); + + // update the status of the clk + clkOn[clk] = 0; +} + + +/**************************************************************************** + * Set the power output for each output independently + ***************************************************************************/ +void Si5351mcu::setPower(byte clk, byte power) { + // set the power to the correct var + clkpower[clk] = power; + + // now enable the output to get it applied + enable(clk); +} + + +/**************************************************************************** + * Private function to send the register data to the Si5351, arduino way. + ***************************************************************************/ +void Si5351mcu::i2cWrite(byte regist, byte value){ + Wire.beginTransmission(SIADDR); + Wire.write(regist); + Wire.write(value); + Wire.endTransmission(); +} diff --git a/3rdparty/Si5351mcu/src/si5351mcu.h b/3rdparty/Si5351mcu/src/si5351mcu.h new file mode 100644 index 00000000..b5789c2b --- /dev/null +++ b/3rdparty/Si5351mcu/src/si5351mcu.h @@ -0,0 +1,141 @@ +/* + * si5351mcu - Si5351 library for Arduino MCU tuned for size and click-less + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/**************************************************************************** + * This lib tricks: + * + * CLK0 will use PLLA + * CLK1 will use PLLB + * CLK2 will use PLLB + * + * Lib defaults + * - XTAL is 27 Mhz. + * - Always put the internal 8pF across the xtal legs to GND + * - lowest power output (2mA) + * - After the init all outputs are off, you need to enable them in your code. + * + * The correction procedure is not for the PPM as other libs, this + * is just +/- Hz to the XTAL freq, you may get a click noise after + * applying a correction + * + * The init procedure is mandatory as it set the Xtal (the default or a custom + * one) and prepare the Wire (I2C) library for operation. + ****************************************************************************/ + +#ifndef SI5351MCU_H +#define SI5351MCU_H + +// rigor includes +#include "Arduino.h" +#include "Wire.h" + +// default I2C address of the Si5351 +#define SIADDR 0x60 + +// register's power modifiers +#define SIOUT_2mA 0 +#define SIOUT_4mA 1 +#define SIOUT_6mA 2 +#define SIOUT_8mA 3 + +// registers base (2mA by default) +#define SICLK0_R 76 // 0b1001100 +#define SICLK12_R 108 // 0b1101100 + + +class Si5351mcu { + public: + // default init procedure + void init(void); + + // custom init procedure (XTAL in Hz); + void init(uint32_t); + + // reset all PLLs + void reset(void); + + // set CLKx(0..2) to freq (Hz) + void setFreq(uint8_t, uint32_t); + + // pass a correction factor + void correction(int32_t); + + // enable some CLKx output + void enable(uint8_t); + + // disable some CLKx output + void disable(uint8_t); + + // disable all outputs + void off(void); + + // set power output to a specific clk + void setPower(uint8_t, uint8_t); + + // var to check the clock state + bool clkOn[3] = {0, 0, 0}; + + + private: + // used to talk with the chip, via Arduino Wire lib + void i2cWrite(uint8_t, uint8_t); + + // base xtal freq, over this we apply the correction factor + // by default 27 MHz + uint32_t base_xtal = 27000000L; + + // this is the work value, with the correction applied + // via the correction() procedure + uint32_t int_xtal = base_xtal; + + // clk# power holders (2ma by default) + uint8_t clkpower[3] = {0, 0, 0}; + + // local var to keep track of when to reset the "pll" + /********************************************************* + * BAD CONCEPT on the datasheet and AN: + * + * The chip has a soft-reset for PLL A & B but in + * practice the PLL does not need to be reseted. + * + * Test shows that if you fix the Msynth output + * dividers and move any of the VCO from bottom to top + * the frequency moves smooth and clean, no reset needed + * + * The reset is needed when you changes the value of the + * Msynth output divider, even so it's not always needed + * so we use this var to keep track of all three and only + * reset the "PLL" when this value changes to be sure + * + * It's a word (16 bit) because the final max value is 900 + *********************************************************/ + uint16_t omsynth[3] = {0, 0, 0}; +}; + + +#endif //SI5351MCU_H diff --git a/3rdparty/Si5351mcu/version b/3rdparty/Si5351mcu/version new file mode 100644 index 00000000..ee6cdce3 --- /dev/null +++ b/3rdparty/Si5351mcu/version @@ -0,0 +1 @@ +0.6.1 diff --git a/3rdparty/WebSockets/LICENSE b/3rdparty/WebSockets/LICENSE new file mode 100644 index 00000000..f166cc57 --- /dev/null +++ b/3rdparty/WebSockets/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/3rdparty/WebSockets/README.md b/3rdparty/WebSockets/README.md new file mode 100644 index 00000000..63eef3e2 --- /dev/null +++ b/3rdparty/WebSockets/README.md @@ -0,0 +1,98 @@ +WebSocket Server and Client for Arduino [![Build Status](https://travis-ci.org/Links2004/arduinoWebSockets.svg?branch=master)](https://travis-ci.org/Links2004/arduinoWebSockets) +=========================================== + +a WebSocket Server and Client for Arduino based on RFC6455. + + +##### Supported features of RFC6455 ##### + - text frame + - binary frame + - connection close + - ping + - pong + - continuation frame + +##### Limitations ##### + - max input length is limited to the ram size and the ```WEBSOCKETS_MAX_DATA_SIZE``` define + - max output length has no limit (the hardware is the limit) + - Client send big frames with mask 0x00000000 (on AVR all frames) + - continuation frame reassembly need to be handled in the application code + + ##### Limitations for Async ##### + - Functions called from within the context of the websocket event might not honor `yield()` and/or `delay()`. See [this issue](https://github.com/Links2004/arduinoWebSockets/issues/58#issuecomment-192376395) for more info and a potential workaround. + - wss / SSL is not possible. + +##### Supported Hardware ##### + - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) + - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) + - ESP31B + - Particle with STM32 ARM Cortex M3 + - ATmega328 with Ethernet Shield (ATmega branch) + - ATmega328 with enc28j60 (ATmega branch) + - ATmega2560 with Ethernet Shield (ATmega branch) + - ATmega2560 with enc28j60 (ATmega branch) + +###### Note: ###### + + version 2.0 and up is not compatible with AVR/ATmega, check ATmega branch. + + Arduino for AVR not supports std namespace of c++. + +### wss / SSL ### + supported for: + - wss client on the ESP8266 + - wss / SSL is not natively supported in WebSocketsServer however it is possible to achieve secure websockets + by running the device behind an SSL proxy. See [Nginx](examples/Nginx/esp8266.ssl.reverse.proxy.conf) for a + sample Nginx server configuration file to enable this. + +### ESP Async TCP ### + +This libary can run in Async TCP mode on the ESP. + +The mode can be activated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE define). + +[ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) libary is required. + + +### High Level Client API ### + + - `begin` : Initiate connection sequence to the websocket host. +``` +void begin(const char *host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); +void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); + ``` + - `onEvent`: Callback to handle for websocket events + + ``` + void onEvent(WebSocketClientEvent cbEvent); + ``` + + - `WebSocketClientEvent`: Handler for websocket events + ``` + void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length) + ``` +Where `WStype_t type` is defined as: + ``` + typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + } WStype_t; + ``` + +### Issues ### +Submit issues to: https://github.com/Links2004/arduinoWebSockets/issues + +[![Join the chat at https://gitter.im/Links2004/arduinoWebSockets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Links2004/arduinoWebSockets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### License and credits ### + +The library is licensed under [LGPLv2.1](https://github.com/Links2004/arduinoWebSockets/blob/master/LICENSE) + +[libb64](http://libb64.sourceforge.net/) written by Chris Venter. It is distributed under Public Domain see [LICENSE](https://github.com/Links2004/arduinoWebSockets/blob/master/src/libb64/LICENSE). diff --git a/3rdparty/WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf b/3rdparty/WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf new file mode 100644 index 00000000..ec5aa89f --- /dev/null +++ b/3rdparty/WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf @@ -0,0 +1,83 @@ +# ESP8266 nginx SSL reverse proxy configuration file (tested and working on nginx v1.10.0) + +# proxy cache location +proxy_cache_path /opt/etc/nginx/cache levels=1:2 keys_zone=ESP8266_cache:10m max_size=10g inactive=5m use_temp_path=off; + +# webserver proxy +server { + + # general server parameters + listen 50080; + server_name myDomain.net; + access_log /opt/var/log/nginx/myDomain.net.access.log; + + # SSL configuration + ssl on; + ssl_certificate /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/fullchain.pem; + ssl_certificate_key /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/privkey.pem; + ssl_session_cache builtin:1000 shared:SSL:10m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; + ssl_prefer_server_ciphers on; + + location / { + + # proxy caching configuration + proxy_cache ESP8266_cache; + proxy_cache_revalidate on; + proxy_cache_min_uses 1; + proxy_cache_use_stale off; + proxy_cache_lock on; + # proxy_cache_bypass $http_cache_control; + # include the sessionId cookie value as part of the cache key - keeps the cache per user + # proxy_cache_key $proxy_host$request_uri$cookie_sessionId; + + # header pass through configuration + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # ESP8266 custom headers which identify to the device that it's running through an SSL proxy + proxy_set_header X-SSL On; + proxy_set_header X-SSL-WebserverPort 50080; + proxy_set_header X-SSL-WebsocketPort 50081; + + # extra debug headers + add_header X-Proxy-Cache $upstream_cache_status; + add_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # actual proxying configuration + proxy_ssl_session_reuse on; + # target the IP address of the device with proxy_pass + proxy_pass http://192.168.0.20; + proxy_read_timeout 90; + } + } + +# websocket proxy +server { + + # general server parameters + listen 50081; + server_name myDomain.net; + access_log /opt/var/log/nginx/myDomain.net.wss.access.log; + + # SSL configuration + ssl on; + ssl_certificate /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/fullchain.pem; + ssl_certificate_key /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/privkey.pem; + ssl_session_cache builtin:1000 shared:SSL:10m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; + ssl_prefer_server_ciphers on; + + location / { + + # websocket upgrade tunnel configuration + proxy_pass http://192.168.0.20:81; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_read_timeout 86400; + } + } diff --git a/3rdparty/WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino b/3rdparty/WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino new file mode 100644 index 00000000..9d49d149 --- /dev/null +++ b/3rdparty/WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino @@ -0,0 +1,84 @@ +/* + * WebSocketClientAVR.ino + * + * Created on: 10.12.2015 + * + */ + +#include + +#include +#include + +#include + + + +// Enter a MAC address for your controller below. +// Newer Ethernet shields have a MAC address printed on a sticker on the shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Set the static IP address to use if the DHCP fails to assign +IPAddress ip(192, 168, 0, 177); + +WebSocketsClient webSocket; + + + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + Serial.println("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + Serial.print("[WSc] Connected to url: "); + Serial.println((char *)payload); + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + Serial.print("[WSc] get text: "); + Serial.println((char *)payload); + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + Serial.print("[WSc] get binary length: "); + Serial.println(length); + // hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(115200); + while (!Serial) {} + + // start the Ethernet connection: + if (Ethernet.begin(mac) == 0) { + Serial.println("Failed to configure Ethernet using DHCP"); + // no point in carrying on, so do nothing forevermore: + // try to congifure using IP address instead of DHCP: + Ethernet.begin(mac, ip); + } + + webSocket.begin("192.168.0.123", 8011); + webSocket.onEvent(webSocketEvent); + +} + + +void loop() +{ + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino b/3rdparty/WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino new file mode 100644 index 00000000..5e5ead46 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino @@ -0,0 +1,110 @@ +/* + * WebSocketClient.ino + * + * Created on: 24.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("192.168.0.123", 81, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino b/3rdparty/WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino new file mode 100644 index 00000000..9d722427 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino @@ -0,0 +1,106 @@ +/* + * WebSocketClientSSL.ino + * + * Created on: 10.12.2015 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.beginSSL("192.168.0.123", 81); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino b/3rdparty/WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino new file mode 100644 index 00000000..3e0d4f5b --- /dev/null +++ b/3rdparty/WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino @@ -0,0 +1,104 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + +WiFiMulti WiFiMulti; +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino new file mode 100644 index 00000000..5ee489cd --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino @@ -0,0 +1,106 @@ +/* + * WebSocketClient.ino + * + * Created on: 24.05.2015 + * + */ + +#include + +#include +#include + +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_PING: + // pong will be send automatically + USE_SERIAL.printf("[WSc] get ping\n"); + break; + case WStype_PONG: + // answer to a ping we send + USE_SERIAL.printf("[WSc] get pong\n"); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("192.168.0.123", 81, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + + // start heartbeat (optional) + // ping server every 15000 ms + // expect pong from server within 3000 ms + // consider connection disconnected if pong is not received 2 times + webSocket.enableHeartbeat(15000, 3000, 2); + +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino new file mode 100644 index 00000000..d45060e9 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino @@ -0,0 +1,88 @@ +/* + * WebSocketClientSSL.ino + * + * Created on: 10.12.2015 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include + +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + + +#define USE_SERIAL Serial1 + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.beginSSL("192.168.0.123", 81); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino new file mode 100644 index 00000000..a952e5de --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino @@ -0,0 +1,125 @@ +/* + * WebSocketClientSocketIO.ino + * + * Created on: 06.06.2016 + * + */ + +#include + +#include +#include + +#include + +#include +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +SocketIOclient socketIO; + +#define USE_SERIAL Serial1 + +void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + switch(type) { + case sIOtype_DISCONNECT: + USE_SERIAL.printf("[IOc] Disconnected!\n"); + break; + case sIOtype_CONNECT: + USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); + break; + case sIOtype_EVENT: + USE_SERIAL.printf("[IOc] get event: %s\n", payload); + break; + case sIOtype_ACK: + USE_SERIAL.printf("[IOc] get ack: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_ERROR: + USE_SERIAL.printf("[IOc] get error: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_EVENT: + USE_SERIAL.printf("[IOc] get binary: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_ACK: + USE_SERIAL.printf("[IOc] get binary ack: %u\n", length); + hexdump(payload, length); + break; + } +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + // disable AP + if(WiFi.getMode() & WIFI_AP) { + WiFi.softAPdisconnect(true); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + String ip = WiFi.localIP().toString(); + USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); + + // server address, port and URL + socketIO.begin("10.11.100.100", 8880); + + // event handler + socketIO.onEvent(socketIOEvent); +} + +unsigned long messageTimestamp = 0; +void loop() { + socketIO.loop(); + + uint64_t now = millis(); + + if(now - messageTimestamp > 2000) { + messageTimestamp = now; + + // creat JSON message for Socket.IO (event) + DynamicJsonDocument doc(1024); + JsonArray array = doc.to(); + + // add evnet name + // Hint: socket.on('event_name', .... + array.add("event_name"); + + // add payload (parameters) for the event + JsonObject param1 = array.createNestedObject(); + param1["now"] = now; + + // JSON to String (serializion) + String output; + serializeJson(doc, output); + + // Send event + socketIO.sendEVENT(output); + + // Print JSON for debugging + USE_SERIAL.println(output); + } +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino new file mode 100644 index 00000000..a0eb011f --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino @@ -0,0 +1,149 @@ +/* + WebSocketClientStomp.ino + + Example for connecting and maintining a connection with a STOMP websocket connection. + In this example, we connect to a Spring application (see https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html). + + Created on: 25.09.2017 + Author: Martin Becker , Contact: becker@informatik.uni-wuerzburg.de +*/ + +// PRE + +#define USE_SERIAL Serial + + +// LIBRARIES + +#include +#include + +#include +#include + + +// SETTINGS + +const char* wlan_ssid = "yourssid"; +const char* wlan_password = "somepassword"; + +const char* ws_host = "the.host.net"; +const int ws_port = 80; + +// URL for STOMP endpoint. +// For the default config of Spring's STOMP support, the default URL is "/socketentry/websocket". +const char* stompUrl = "/socketentry/websocket"; // don't forget the leading "/" !!! + + +// VARIABLES + +WebSocketsClient webSocket; + + +// FUNCTIONS + +/** + * STOMP messages need to be NULL-terminated (i.e., \0 or \u0000). + * However, when we send a String or a char[] array without specifying + * a length, the size of the message payload is derived by strlen() internally, + * thus dropping any NULL values appended to the "msg"-String. + * + * To solve this, we first convert the String to a NULL terminated char[] array + * via "c_str" and set the length of the payload to include the NULL value. + */ +void sendMessage(String & msg) { + webSocket.sendTXT(msg.c_str(), msg.length() + 1); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + String msg = "CONNECT\r\naccept-version:1.1,1.0\r\nheart-beat:10000,10000\r\n\r\n"; + sendMessage(msg); + } + break; + case WStype_TEXT: + { + // ##################### + // handle STOMP protocol + // ##################### + + String text = (char*) payload; + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + if (text.startsWith("CONNECTED")) { + + // subscribe to some channels + + String msg = "SUBSCRIBE\nid:sub-0\ndestination:/user/queue/messages\n\n"; + sendMessage(msg); + delay(1000); + + // and send a message + + msg = "SEND\ndestination:/app/message\n\n{\"user\":\"esp\",\"message\":\"Hello!\"}"; + sendMessage(msg); + delay(1000); + + } else { + + // do something with messages + + } + + break; + } + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + + // setup serial + + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + // USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + + + // connect to WiFi + + USE_SERIAL.print("Logging into WLAN: "); Serial.print(wlan_ssid); Serial.print(" ..."); + WiFi.mode(WIFI_STA); + WiFi.begin(wlan_ssid, wlan_password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + USE_SERIAL.print("."); + } + USE_SERIAL.println(" success."); + USE_SERIAL.print("IP: "); USE_SERIAL.println(WiFi.localIP()); + + + // connect to websocket + webSocket.begin(ws_host, ws_port, stompUrl); + webSocket.setExtraHeaders(); // remove "Origin: file://" header because it breaks the connection with Spring's default websocket config + // webSocket.setExtraHeaders("foo: I am so funny\r\nbar: not"); // some headers, in case you feel funny + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino new file mode 100644 index 00000000..cb0c45be --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino @@ -0,0 +1,150 @@ +/* + WebSocketClientStompOverSockJs.ino + + Example for connecting and maintining a connection with a SockJS+STOMP websocket connection. + In this example, we connect to a Spring application (see https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html). + + Created on: 18.07.2017 + Author: Martin Becker , Contact: becker@informatik.uni-wuerzburg.de +*/ + +// PRE + +#define USE_SERIAL Serial + + +// LIBRARIES + +#include +#include + +#include +#include + + +// SETTINGS + +const char* wlan_ssid = "yourssid"; +const char* wlan_password = "somepassword"; + +const char* ws_host = "the.host.net"; +const int ws_port = 80; + +// base URL for SockJS (websocket) connection +// The complete URL will look something like this(cf. http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-36): +// ws://://<3digits>//websocket +// For the default config of Spring's SockJS/STOMP support, the default base URL is "/socketentry/". +const char* ws_baseurl = "/socketentry/"; // don't forget leading and trailing "/" !!! + + +// VARIABLES + +WebSocketsClient webSocket; + + +// FUNCTIONS + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + } + break; + case WStype_TEXT: + { + // ##################### + // handle SockJs+STOMP protocol + // ##################### + + String text = (char*) payload; + + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + if (payload[0] == 'h') { + + USE_SERIAL.println("Heartbeat!"); + + } else if (payload[0] == 'o') { + + // on open connection + char *msg = "[\"CONNECT\\naccept-version:1.1,1.0\\nheart-beat:10000,10000\\n\\n\\u0000\"]"; + webSocket.sendTXT(msg); + + } else if (text.startsWith("a[\"CONNECTED")) { + + // subscribe to some channels + + char *msg = "[\"SUBSCRIBE\\nid:sub-0\\ndestination:/user/queue/messages\\n\\n\\u0000\"]"; + webSocket.sendTXT(msg); + delay(1000); + + // and send a message + + msg = "[\"SEND\\ndestination:/app/message\\n\\n{\\\"user\\\":\\\"esp\\\",\\\"message\\\":\\\"Hello!\\\"}\\u0000\"]"; + webSocket.sendTXT(msg); + delay(1000); + } + + break; + } + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + + // setup serial + + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + // USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + + + // connect to WiFi + + USE_SERIAL.print("Logging into WLAN: "); Serial.print(wlan_ssid); Serial.print(" ..."); + WiFi.mode(WIFI_STA); + WiFi.begin(wlan_ssid, wlan_password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + USE_SERIAL.print("."); + } + USE_SERIAL.println(" success."); + USE_SERIAL.print("IP: "); USE_SERIAL.println(WiFi.localIP()); + + + // ##################### + // create socket url according to SockJS protocol (cf. http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-36) + // ##################### + String socketUrl = ws_baseurl; + socketUrl += random(0, 999); + socketUrl += "/"; + socketUrl += random(0, 999999); // should be a random string, but this works (see ) + socketUrl += "/websocket"; + + // connect to websocket + webSocket.begin(ws_host, ws_port, socketUrl); + webSocket.setExtraHeaders(); // remove "Origin: file://" header because it breaks the connection with Spring's default websocket config + // webSocket.setExtraHeaders("foo: I am so funny\r\nbar: not"); // some headers, in case you feel funny + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino new file mode 100644 index 00000000..1ac3002d --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino @@ -0,0 +1,86 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} + diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino new file mode 100644 index 00000000..5fed1a95 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino @@ -0,0 +1,132 @@ +/* + * WebSocketServerAllFunctionsDemo.ino + * + * Created on: 10.05.2018 + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define LED_RED 15 +#define LED_GREEN 12 +#define LED_BLUE 13 + +#define USE_SERIAL Serial + +ESP8266WiFiMulti WiFiMulti; + +ESP8266WebServer server(80); +WebSocketsServer webSocket = WebSocketsServer(81); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + if(payload[0] == '#') { + // we get RGB data + + // decode rgb data + uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16); + + analogWrite(LED_RED, ((rgb >> 16) & 0xFF)); + analogWrite(LED_GREEN, ((rgb >> 8) & 0xFF)); + analogWrite(LED_BLUE, ((rgb >> 0) & 0xFF)); + } + + break; + } + +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); + + digitalWrite(LED_RED, 1); + digitalWrite(LED_GREEN, 1); + digitalWrite(LED_BLUE, 1); + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // start webSocket server + webSocket.begin(); + webSocket.onEvent(webSocketEvent); + + if(MDNS.begin("esp8266")) { + USE_SERIAL.println("MDNS responder started"); + } + + // handle index + server.on("/", []() { + // send index.html + server.send(200, "text/html", "LED Control:

R:
G:
B:
"); + }); + + server.begin(); + + // Add service to MDNS + MDNS.addService("http", "tcp", 80); + MDNS.addService("ws", "tcp", 81); + + digitalWrite(LED_RED, 0); + digitalWrite(LED_GREEN, 0); + digitalWrite(LED_BLUE, 0); + +} + +unsigned long last_10sec = 0; +unsigned int counter = 0; + +void loop() { + unsigned long t = millis(); + webSocket.loop(); + server.handleClient(); + + if((t - last_10sec) > 10 * 1000) { + counter++; + bool ping = (counter % 2); + int i = webSocket.connectedClients(ping); + USE_SERIAL.printf("%d Connected websocket clients ping: %d\n", i, ping); + last_10sec = millis(); + } +} diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino new file mode 100644 index 00000000..84c9775d --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino @@ -0,0 +1,94 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial + +String fragmentBuffer = ""; + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + break; + + // Fragmentation / continuation opcode handling + // case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT_TEXT_START: + fragmentBuffer = (char*)payload; + USE_SERIAL.printf("[%u] get start start of Textfragment: %s\n", num, payload); + break; + case WStype_FRAGMENT: + fragmentBuffer += (char*)payload; + USE_SERIAL.printf("[%u] get Textfragment : %s\n", num, payload); + break; + case WStype_FRAGMENT_FIN: + fragmentBuffer += (char*)payload; + USE_SERIAL.printf("[%u] get end of Textfragment: %s\n", num, payload); + USE_SERIAL.printf("[%u] full frame: %s\n", num, fragmentBuffer.c_str()); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} + diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino new file mode 100644 index 00000000..8bc646c4 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino @@ -0,0 +1,86 @@ +/* + * WebSocketServerHttpHeaderValidation.ino + * + * Created on: 08.06.2016 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +const unsigned long int validSessionId = 12345; //some arbitrary value to act as a valid sessionId + +/* + * Returns a bool value as an indicator to describe whether a user is allowed to initiate a websocket upgrade + * based on the value of a cookie. This function expects the rawCookieHeaderValue to look like this "sessionId=|" + */ +bool isCookieValid(String rawCookieHeaderValue) { + + if (rawCookieHeaderValue.indexOf("sessionId") != -1) { + String sessionIdStr = rawCookieHeaderValue.substring(rawCookieHeaderValue.indexOf("sessionId=") + 10, rawCookieHeaderValue.indexOf("|")); + unsigned long int sessionId = strtoul(sessionIdStr.c_str(), NULL, 10); + return sessionId == validSessionId; + } + return false; +} + +/* + * The WebSocketServerHttpHeaderValFunc delegate passed to webSocket.onValidateHttpHeader + */ +bool validateHttpHeader(String headerName, String headerValue) { + + //assume a true response for any headers not handled by this validator + bool valid = true; + + if(headerName.equalsIgnoreCase("Cookie")) { + //if the header passed is the Cookie header, validate it according to the rules in 'isCookieValid' function + valid = isCookieValid(headerValue); + } + + return valid; +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + //connecting clients must supply a valid session cookie at websocket upgrade handshake negotiation time + const char * headerkeys[] = { "Cookie" }; + size_t headerKeyCount = sizeof(headerkeys) / sizeof(char*); + webSocket.onValidateHttpHeader(validateHttpHeader, headerkeys, headerKeyCount); + webSocket.begin(); +} + +void loop() { + webSocket.loop(); +} + diff --git a/3rdparty/WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino b/3rdparty/WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino new file mode 100644 index 00000000..8f32e753 --- /dev/null +++ b/3rdparty/WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino @@ -0,0 +1,121 @@ +/* + * WebSocketServer_LEDcontrol.ino + * + * Created on: 26.11.2015 + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define LED_RED 15 +#define LED_GREEN 12 +#define LED_BLUE 13 + +#define USE_SERIAL Serial + + +ESP8266WiFiMulti WiFiMulti; + +ESP8266WebServer server(80); +WebSocketsServer webSocket = WebSocketsServer(81); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + if(payload[0] == '#') { + // we get RGB data + + // decode rgb data + uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16); + + analogWrite(LED_RED, ((rgb >> 16) & 0xFF)); + analogWrite(LED_GREEN, ((rgb >> 8) & 0xFF)); + analogWrite(LED_BLUE, ((rgb >> 0) & 0xFF)); + } + + break; + } + +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); + + digitalWrite(LED_RED, 1); + digitalWrite(LED_GREEN, 1); + digitalWrite(LED_BLUE, 1); + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // start webSocket server + webSocket.begin(); + webSocket.onEvent(webSocketEvent); + + if(MDNS.begin("esp8266")) { + USE_SERIAL.println("MDNS responder started"); + } + + // handle index + server.on("/", []() { + // send index.html + server.send(200, "text/html", "LED Control:

R:
G:
B:
"); + }); + + server.begin(); + + // Add service to MDNS + MDNS.addService("http", "tcp", 80); + MDNS.addService("ws", "tcp", 81); + + digitalWrite(LED_RED, 0); + digitalWrite(LED_GREEN, 0); + digitalWrite(LED_BLUE, 0); + +} + +void loop() { + webSocket.loop(); + server.handleClient(); +} diff --git a/3rdparty/WebSockets/examples/particle/ParticleWebSocketClient/application.cpp b/3rdparty/WebSockets/examples/particle/ParticleWebSocketClient/application.cpp new file mode 100644 index 00000000..461228f3 --- /dev/null +++ b/3rdparty/WebSockets/examples/particle/ParticleWebSocketClient/application.cpp @@ -0,0 +1,46 @@ +/* To compile using make CLI, create a folder under \firmware\user\applications and copy application.cpp there. +* Then, copy src files under particleWebSocket folder. +*/ + +#include "application.h" +#include "particleWebSocket/WebSocketsClient.h" + +WebSocketsClient webSocket; + +void webSocketEvent(WStype_t type, uint8_t* payload, size_t length) +{ + switch (type) + { + case WStype_DISCONNECTED: + Serial.printlnf("[WSc] Disconnected!"); + break; + case WStype_CONNECTED: + Serial.printlnf("[WSc] Connected to URL: %s", payload); + webSocket.sendTXT("Connected\r\n"); + break; + case WStype_TEXT: + Serial.printlnf("[WSc] get text: %s", payload); + break; + case WStype_BIN: + Serial.printlnf("[WSc] get binary length: %u", length); + break; + } +} + +void setup() +{ + Serial.begin(9600); + + WiFi.setCredentials("[SSID]", "[PASSWORD]", WPA2, WLAN_CIPHER_AES_TKIP); + WiFi.connect(); + + webSocket.begin("192.168.1.153", 85, "/ClientService/?variable=Test1212"); + webSocket.onEvent(webSocketEvent); +} + +void loop() +{ + webSocket.sendTXT("Hello world!"); + delay(500); + webSocket.loop(); +} diff --git a/3rdparty/WebSockets/library.json b/3rdparty/WebSockets/library.json new file mode 100644 index 00000000..efbc51be --- /dev/null +++ b/3rdparty/WebSockets/library.json @@ -0,0 +1,25 @@ +{ + "name": "WebSockets", + "description": "WebSocket Server and Client for Arduino based on RFC6455", + "keywords": "wifi, http, web, server, client, websocket", + "authors": [ + { + "name": "Markus Sattler", + "url": "https://github.com/Links2004", + "maintainer": true + } + ], + "repository": { + "type": "git", + "url": "https://github.com/Links2004/arduinoWebSockets.git" + }, + "version": "2.1.4", + "license": "LGPL-2.1", + "export": { + "exclude": [ + "tests" + ] + }, + "frameworks": "arduino", + "platforms": "atmelavr, espressif8266, espressif32" +} diff --git a/3rdparty/WebSockets/library.properties b/3rdparty/WebSockets/library.properties new file mode 100644 index 00000000..2fe174b9 --- /dev/null +++ b/3rdparty/WebSockets/library.properties @@ -0,0 +1,9 @@ +name=WebSockets +version=2.1.4 +author=Markus Sattler +maintainer=Markus Sattler +sentence=WebSockets for Arduino (Server + Client) +paragraph=use 2.x.x for ESP and 1.3 for AVR +category=Communication +url=https://github.com/Links2004/arduinoWebSockets +architectures=* diff --git a/3rdparty/WebSockets/src/SocketIOclient.cpp b/3rdparty/WebSockets/src/SocketIOclient.cpp new file mode 100644 index 00000000..e9467d45 --- /dev/null +++ b/3rdparty/WebSockets/src/SocketIOclient.cpp @@ -0,0 +1,174 @@ +/* + * SocketIOclient.cpp + * + * Created on: May 12, 2018 + * Author: links + */ + +#include "WebSockets.h" +#include "WebSocketsClient.h" +#include "SocketIOclient.h" + +SocketIOclient::SocketIOclient() { +} + +SocketIOclient::~SocketIOclient() { +} + +void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { + WebSocketsClient::beginSocketIO(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); +} + +void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) { + WebSocketsClient::beginSocketIO(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); +} + +/** + * set callback function + * @param cbEvent SocketIOclientEvent + */ +void SocketIOclient::onEvent(SocketIOclientEvent cbEvent) { + _cbEvent = cbEvent; +} + +bool SocketIOclient::isConnected(void) { + return WebSocketsClient::isConnected(); +} + +/** + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool SocketIOclient::sendEVENT(uint8_t * payload, size_t length, bool headerToPayload) { + bool ret = false; + if(length == 0) { + length = strlen((const char *)payload); + } + if(clientIsConnected(&_client)) { + if(!headerToPayload) { + // webSocket Header + ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true); + // Engine.IO / Socket.IO Header + if(ret) { + uint8_t buf[3] = { eIOtype_MESSAGE, sIOtype_EVENT, 0x00 }; + ret = WebSocketsClient::write(&_client, buf, 2); + } + if(ret && payload && length > 0) { + ret = WebSocketsClient::write(&_client, payload, length); + } + return ret; + } else { + // TODO implement + } + + // return WebSocketsClient::sendFrame(&_client, WSop_text, payload, length, true, true, headerToPayload); + } + return false; +} + +bool SocketIOclient::sendEVENT(const uint8_t * payload, size_t length) { + return sendEVENT((uint8_t *)payload, length); +} + +bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) { + return sendEVENT((uint8_t *)payload, length, headerToPayload); +} + +bool SocketIOclient::sendEVENT(const char * payload, size_t length) { + return sendEVENT((uint8_t *)payload, length); +} + +bool SocketIOclient::sendEVENT(String & payload) { + return sendEVENT((uint8_t *)payload.c_str(), payload.length()); +} + +void SocketIOclient::loop(void) { + WebSocketsClient::loop(); + unsigned long t = millis(); + if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) { + _lastConnectionFail = t; + DEBUG_WEBSOCKETS("[wsIOc] send ping\n"); + WebSocketsClient::sendTXT(eIOtype_PING); + } +} + +void SocketIOclient::handleCbEvent(WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + runIOCbEvent(sIOtype_DISCONNECT, NULL, 0); + DEBUG_WEBSOCKETS("[wsIOc] Disconnected!\n"); + break; + case WStype_CONNECTED: { + DEBUG_WEBSOCKETS("[wsIOc] Connected to url: %s\n", payload); + // send message to server when Connected + // Engine.io upgrade confirmation message (required) + WebSocketsClient::sendTXT(eIOtype_UPGRADE); + runIOCbEvent(sIOtype_CONNECT, payload, length); + } break; + case WStype_TEXT: { + if(length < 1) { + break; + } + + engineIOmessageType_t eType = (engineIOmessageType_t)payload[0]; + switch(eType) { + case eIOtype_PING: + payload[0] = eIOtype_PONG; + DEBUG_WEBSOCKETS("[wsIOc] get ping send pong (%s)\n", payload); + WebSocketsClient::sendTXT(payload, length, false); + break; + case eIOtype_PONG: + DEBUG_WEBSOCKETS("[wsIOc] get pong\n"); + break; + case eIOtype_MESSAGE: { + if(length < 2) { + break; + } + socketIOmessageType_t ioType = (socketIOmessageType_t)payload[1]; + uint8_t * data = &payload[2]; + size_t lData = length - 2; + switch(ioType) { + case sIOtype_EVENT: + DEBUG_WEBSOCKETS("[wsIOc] get event (%d): %s\n", lData, data); + break; + case sIOtype_CONNECT: + case sIOtype_DISCONNECT: + case sIOtype_ACK: + case sIOtype_ERROR: + case sIOtype_BINARY_EVENT: + case sIOtype_BINARY_ACK: + default: + DEBUG_WEBSOCKETS("[wsIOc] Socket.IO Message Type %c (%02X) is not implemented\n", ioType, ioType); + DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload); + break; + } + + runIOCbEvent(ioType, data, lData); + } break; + case eIOtype_OPEN: + case eIOtype_CLOSE: + case eIOtype_UPGRADE: + case eIOtype_NOOP: + default: + DEBUG_WEBSOCKETS("[wsIOc] Engine.IO Message Type %c (%02X) is not implemented\n", eType, eType); + DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload); + break; + } + } break; + + case WStype_BIN: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + case WStype_PING: + case WStype_PONG: + break; + } +} diff --git a/3rdparty/WebSockets/src/SocketIOclient.h b/3rdparty/WebSockets/src/SocketIOclient.h new file mode 100644 index 00000000..64b8c87c --- /dev/null +++ b/3rdparty/WebSockets/src/SocketIOclient.h @@ -0,0 +1,80 @@ +/** + * SocketIOclient.h + * + * Created on: May 12, 2018 + * Author: links + */ + +#ifndef SOCKETIOCLIENT_H_ +#define SOCKETIOCLIENT_H_ + +#include "WebSockets.h" + +#define EIO_HEARTBEAT_INTERVAL 20000 + +#define EIO_MAX_HEADER_SIZE (WEBSOCKETS_MAX_HEADER_SIZE + 1) +#define SIO_MAX_HEADER_SIZE (EIO_MAX_HEADER_SIZE + 1) + +typedef enum { + eIOtype_OPEN = '0', ///< Sent from the server when a new transport is opened (recheck) + eIOtype_CLOSE = '1', ///< Request the close of this transport but does not shutdown the connection itself. + eIOtype_PING = '2', ///< Sent by the client. Server should answer with a pong packet containing the same data + eIOtype_PONG = '3', ///< Sent by the server to respond to ping packets. + eIOtype_MESSAGE = '4', ///< actual message, client and server should call their callbacks with the data + eIOtype_UPGRADE = '5', ///< Before engine.io switches a transport, it tests, if server and client can communicate over this transport. If this test succeed, the client sends an upgrade packets which requests the server to flush its cache on the old transport and switch to the new transport. + eIOtype_NOOP = '6', ///< A noop packet. Used primarily to force a poll cycle when an incoming websocket connection is received. +} engineIOmessageType_t; + +typedef enum { + sIOtype_CONNECT = '0', + sIOtype_DISCONNECT = '1', + sIOtype_EVENT = '2', + sIOtype_ACK = '3', + sIOtype_ERROR = '4', + sIOtype_BINARY_EVENT = '5', + sIOtype_BINARY_ACK = '6', +} socketIOmessageType_t; + +class SocketIOclient : protected WebSocketsClient { + public: +#ifdef __AVR__ + typedef void (*SocketIOclientEvent)(socketIOmessageType_t type, uint8_t * payload, size_t length); +#else + typedef std::function SocketIOclientEvent; +#endif + + SocketIOclient(void); + virtual ~SocketIOclient(void); + + void begin(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void begin(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + + bool isConnected(void); + + void onEvent(SocketIOclientEvent cbEvent); + + bool sendEVENT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendEVENT(const uint8_t * payload, size_t length = 0); + bool sendEVENT(char * payload, size_t length = 0, bool headerToPayload = false); + bool sendEVENT(const char * payload, size_t length = 0); + bool sendEVENT(String & payload); + + void loop(void); + + protected: + uint64_t _lastHeartbeat = 0; + SocketIOclientEvent _cbEvent; + virtual void runIOCbEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(type, payload, length); + } + } + + // Handeling events from websocket layer + virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { + handleCbEvent(type, payload, length); + } + void handleCbEvent(WStype_t type, uint8_t * payload, size_t length); +}; + +#endif /* SOCKETIOCLIENT_H_ */ diff --git a/3rdparty/WebSockets/src/WebSockets.cpp b/3rdparty/WebSockets/src/WebSockets.cpp new file mode 100644 index 00000000..3a90a402 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSockets.cpp @@ -0,0 +1,749 @@ +/** + * @file WebSockets.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" + +#ifdef ESP8266 +#include +#endif + +extern "C" { +#ifdef CORE_HAS_LIBB64 +#include +#else +#include "libb64/cencode_inc.h" +#endif +} + +#ifdef ESP8266 +#include +#elif defined(ESP32) +#include +#else + +extern "C" { +#include "libsha1/libsha1.h" +} + +#endif + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param code uint16_t see RFC + * @param reason ptr to the disconnect reason message + * @param reasonLen length of the disconnect reason message + */ +void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + if(client->status == WSC_CONNECTED && code) { + if(reason) { + sendFrame(client, WSop_close, (uint8_t *)reason, reasonLen); + } else { + uint8_t buffer[2]; + buffer[0] = ((code >> 8) & 0xFF); + buffer[1] = (code & 0xFF); + sendFrame(client, WSop_close, &buffer[0], 2); + } + } + clientDisconnect(client); +} + +/** + * + * @param buf uint8_t * ptr to the buffer for writing + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param mask bool add dummy mask to the frame (needed for web browser) + * @param maskkey uint8_t[4] key used for payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + */ +uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) { + uint8_t headerSize; + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(mask) { + headerSize += 4; + } + + // create header + + // byte 0 + *headerPtr = 0x00; + if(fin) { + *headerPtr |= bit(7); ///< set Fin + } + *headerPtr |= opcode; ///< set opcode + headerPtr++; + + // byte 1 + *headerPtr = 0x00; + if(mask) { + *headerPtr |= bit(7); ///< set mask + } + + if(length < 126) { + *headerPtr |= length; + headerPtr++; + } else if(length < 0xFFFF) { + *headerPtr |= 126; + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } else { + // Normally we never get here (to less memory) + *headerPtr |= 127; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = ((length >> 24) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 16) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } + + if(mask) { + *headerPtr = maskKey[0]; + headerPtr++; + *headerPtr = maskKey[1]; + headerPtr++; + *headerPtr = maskKey[2]; + headerPtr++; + *headerPtr = maskKey[3]; + headerPtr++; + } + return headerSize; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @return true if ok + */ +bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool fin) { + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize = createHeader(&buffer[0], opcode, length, client->cIsClient, maskKey, fin); + + if(write(client, &buffer[0], headerSize) != headerSize) { + return false; + } + + return true; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * ptr to the payload + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) + * @return true if ok + */ +bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin, bool headerToPayload) { + if(client->tcp && !client->tcp->connected()) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + return false; + } + + if(client->status != WSC_CONNECTED) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + return false; + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send message frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, client->cIsClient, length, headerToPayload); + + if(opcode == WSop_text) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + } + + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize; + uint8_t * headerPtr; + uint8_t * payloadPtr = payload; + bool useInternBuffer = false; + bool ret = true; + + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(client->cIsClient) { + headerSize += 4; + } + +#ifdef WEBSOCKETS_USE_BIG_MEM + // only for ESP since AVR has less HEAP + // try to send data in one TCP package (only if some free Heap is there) + if(!headerToPayload && ((length > 0) && (length < 1400)) && (GET_FREE_HEAP > 6000)) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + uint8_t * dataPtr = (uint8_t *)malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); + if(dataPtr) { + memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); + headerToPayload = true; + useInternBuffer = true; + payloadPtr = dataPtr; + } + } +#endif + + // set Header Pointer + if(headerToPayload) { + // calculate offset in payload + headerPtr = (payloadPtr + (WEBSOCKETS_MAX_HEADER_SIZE - headerSize)); + } else { + headerPtr = &buffer[0]; + } + + if(client->cIsClient && useInternBuffer) { + // if we use a Intern Buffer we can modify the data + // by this fact its possible the do the masking + for(uint8_t x = 0; x < sizeof(maskKey); x++) { + maskKey[x] = random(0xFF); + } + } + + createHeader(headerPtr, opcode, length, client->cIsClient, maskKey, fin); + + if(client->cIsClient && useInternBuffer) { + uint8_t * dataMaskPtr; + + if(headerToPayload) { + dataMaskPtr = (payloadPtr + WEBSOCKETS_MAX_HEADER_SIZE); + } else { + dataMaskPtr = payloadPtr; + } + + for(size_t x = 0; x < length; x++) { + dataMaskPtr[x] = (dataMaskPtr[x] ^ maskKey[x % 4]); + } + } + +#ifndef NODEBUG_WEBSOCKETS + unsigned long start = micros(); +#endif + + if(headerToPayload) { + // header has be added to payload + // payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings + // offset in payload is calculatetd 14 - headerSize + if(write(client, &payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)) != (length + headerSize)) { + ret = false; + } + } else { + // send header + if(write(client, &buffer[0], headerSize) != headerSize) { + ret = false; + } + + if(payloadPtr && length > 0) { + // send payload + if(write(client, &payloadPtr[0], length) != length) { + ret = false; + } + } + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%luus).\n", client->num, (micros() - start)); + +#ifdef WEBSOCKETS_USE_BIG_MEM + if(useInternBuffer && payloadPtr) { + free(payloadPtr); + } +#endif + + return ret; +} + +/** + * callen when HTTP header is done + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::headerDone(WSclient_t * client) { + client->status = WSC_CONNECTED; + client->cWsRXsize = 0; + DEBUG_WEBSOCKETS("[WS][%d][headerDone] Header Handling Done.\n", client->num); +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; + handleWebsocket(client); +#endif +} + +/** + * handle the WebSocket stream + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::handleWebsocket(WSclient_t * client) { + if(client->cWsRXsize == 0) { + handleWebsocketCb(client); + } +} + +/** + * wait for + * @param client + * @param size + */ +bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) { + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + if(size > WEBSOCKETS_MAX_HEADER_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d too big!\n", client->num, size); + return false; + } + + if(client->cWsRXsize >= size) { + return true; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d cWsRXsize: %d\n", client->num, size, client->cWsRXsize); + readCb(client, &client->cWsHeader[client->cWsRXsize], (size - client->cWsRXsize), std::bind([](WebSockets * server, size_t size, WSclient_t * client, bool ok) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor][readCb] size: %d ok: %d\n", client->num, size, ok); + if(ok) { + client->cWsRXsize = size; + server->handleWebsocketCb(client); + } else { + DEBUG_WEBSOCKETS("[WS][%d][readCb] failed.\n", client->num); + client->cWsRXsize = 0; + // timeout or error + server->clientDisconnect(client, 1002); + } + }, + this, size, std::placeholders::_1, std::placeholders::_2)); + return false; +} + +void WebSockets::handleWebsocketCb(WSclient_t * client) { + if(!client->tcp || !client->tcp->connected()) { + return; + } + + uint8_t * buffer = client->cWsHeader; + + WSMessageHeader_t * header = &client->cWsHeaderDecode; + uint8_t * payload = NULL; + + uint8_t headerLen = 2; + + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + // split first 2 bytes in the data + header->fin = ((*buffer >> 7) & 0x01); + header->rsv1 = ((*buffer >> 6) & 0x01); + header->rsv2 = ((*buffer >> 5) & 0x01); + header->rsv3 = ((*buffer >> 4) & 0x01); + header->opCode = (WSopcode_t)(*buffer & 0x0F); + buffer++; + + header->mask = ((*buffer >> 7) & 0x01); + header->payloadLen = (WSopcode_t)(*buffer & 0x7F); + buffer++; + + if(header->payloadLen == 126) { + headerLen += 2; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->payloadLen = buffer[0] << 8 | buffer[1]; + buffer += 2; + } else if(header->payloadLen == 127) { + headerLen += 8; + // read 64bit integer as length + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + if(buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 0 || buffer[3] != 0) { + // really too big! + header->payloadLen = 0xFFFFFFFF; + } else { + header->payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7]; + } + buffer += 8; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, header->fin, header->rsv1, header->rsv2, header->rsv3, header->opCode); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, header->mask, header->payloadLen); + + if(header->payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload too big! (%u)\n", client->num, header->payloadLen); + clientDisconnect(client, 1009); + return; + } + + if(header->mask) { + headerLen += 4; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->maskKey = buffer; + buffer += 4; + } + + if(header->payloadLen > 0) { + // if text data we need one more + payload = (uint8_t *)malloc(header->payloadLen + 1); + + if(!payload) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, header->payloadLen); + clientDisconnect(client, 1011); + return; + } + readCb(client, payload, header->payloadLen, std::bind(&WebSockets::handleWebsocketPayloadCb, this, std::placeholders::_1, std::placeholders::_2, payload)); + } else { + handleWebsocketPayloadCb(client, true, NULL); + } +} + +void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) { + WSMessageHeader_t * header = &client->cWsHeaderDecode; + if(ok) { + if(header->payloadLen > 0) { + payload[header->payloadLen] = 0x00; + + if(header->mask) { + //decode XOR + for(size_t i = 0; i < header->payloadLen; i++) { + payload[i] = (payload[i] ^ header->maskKey[i % 4]); + } + } + } + + switch(header->opCode) { + case WSop_text: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + // no break here! + case WSop_binary: + case WSop_continuation: + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_ping: + // send pong back + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ping received (%s)\n", client->num, payload ? (const char *)payload : ""); + sendFrame(client, WSop_pong, payload, header->payloadLen); + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_pong: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload ? (const char *)payload : ""); + client->pongReceived = true; + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_close: { +#ifndef NODEBUG_WEBSOCKETS + uint16_t reasonCode = 1000; + if(header->payloadLen >= 2) { + reasonCode = payload[0] << 8 | payload[1]; + } +#endif + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); + if(header->payloadLen > 2) { + DEBUG_WEBSOCKETS(" (%s)\n", (payload + 2)); + } else { + DEBUG_WEBSOCKETS("\n"); + } + clientDisconnect(client, 1000); + } break; + default: + clientDisconnect(client, 1002); + break; + } + + if(payload) { + free(payload); + } + + // reset input + client->cWsRXsize = 0; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + //register callback for next message + handleWebsocketWaitFor(client, 2); +#endif + + } else { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + free(payload); + clientDisconnect(client, 1002); + } +} + +/** + * generate the key for Sec-WebSocket-Accept + * @param clientKey String + * @return String Accept Key + */ +String WebSockets::acceptKey(String & clientKey) { + uint8_t sha1HashBin[20] = { 0 }; +#ifdef ESP8266 + sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]); +#elif defined(ESP32) + String data = clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + esp_sha(SHA1, (unsigned char *)data.c_str(), data.length(), &sha1HashBin[0]); +#else + clientKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + SHA1_CTX ctx; + SHA1Init(&ctx); + SHA1Update(&ctx, (const unsigned char *)clientKey.c_str(), clientKey.length()); + SHA1Final(&sha1HashBin[0], &ctx); +#endif + + String key = base64_encode(sha1HashBin, 20); + key.trim(); + + return key; +} + +/** + * base64_encode + * @param data uint8_t * + * @param length size_t + * @return base64 encoded String + */ +String WebSockets::base64_encode(uint8_t * data, size_t length) { + size_t size = ((length * 1.6f) + 1); + char * buffer = (char *)malloc(size); + if(buffer) { + base64_encodestate _state; + base64_init_encodestate(&_state); + int len = base64_encode_block((const char *)&data[0], length, &buffer[0], &_state); + len = base64_encode_blockend((buffer + len), &_state); + + String base64 = String(buffer); + free(buffer); + return base64; + } + return String("-FAIL-"); +} + +/** + * read x byte from tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return true if ok + */ +bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) { + if(cb) { + cb(client, ok); + } + }, + client, std::placeholders::_1, cb)); + +#else + unsigned long t = millis(); + size_t len; + DEBUG_WEBSOCKETS("[readCb] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[readCb] tcp is null!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[readCb] not connected!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[readCb] receive TIMEOUT! %lu\n", (millis() - t)); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->available()) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + continue; + } + + len = client->tcp->read((uint8_t *)out, n); + if(len) { + t = millis(); + out += len; + n -= len; + //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } else { + //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + if(cb) { + cb(client, true); + } +#endif + return true; +} + +/** + * write x byte to tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return bytes send + */ +size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) { + if(out == NULL) + return 0; + if(client == NULL) + return 0; + unsigned long t = millis(); + size_t len = 0; + size_t total = 0; + DEBUG_WEBSOCKETS("[write] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[write] tcp is null!\n"); + break; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[write] not connected!\n"); + break; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[write] write TIMEOUT! %lu\n", (millis() - t)); + break; + } + + len = client->tcp->write((const uint8_t *)out, n); + if(len) { + t = millis(); + out += len; + n -= len; + total += len; + //DEBUG_WEBSOCKETS("write %d left %d!\n", len, n); + } else { + //DEBUG_WEBSOCKETS("write %d failed left %d!\n", len, n); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return total; +} + +size_t WebSockets::write(WSclient_t * client, const char * out) { + if(client == NULL) + return 0; + if(out == NULL) + return 0; + return write(client, (uint8_t *)out, strlen(out)); +} + +/** + * enable ping/pong heartbeat process + * @param client WSclient_t * + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + if(client == NULL) + return; + client->pingInterval = pingInterval; + client->pongTimeout = pongTimeout; + client->disconnectTimeoutCount = disconnectTimeoutCount; + client->pongReceived = false; +} + +/** + * handle ping/pong heartbeat timeout process + * @param client WSclient_t * + */ +void WebSockets::handleHBTimeout(WSclient_t * client) { + if(client->pingInterval) { // if heartbeat is enabled + uint32_t pi = millis() - client->lastPing; + + if(client->pongReceived) { + client->pongTimeoutCount = 0; + } else { + if(pi > client->pongTimeout) { // pong not received in time + client->pongTimeoutCount++; + client->lastPing = millis() - client->pingInterval - 500; // force ping on the next run + + DEBUG_WEBSOCKETS("[HBtimeout] pong TIMEOUT! lp=%d millis=%d pi=%d count=%d\n", client->lastPing, millis(), pi, client->pongTimeoutCount); + + if(client->disconnectTimeoutCount && client->pongTimeoutCount >= client->disconnectTimeoutCount) { + DEBUG_WEBSOCKETS("[HBtimeout] count=%d, DISCONNECTING\n", client->pongTimeoutCount); + clientDisconnect(client); + } + } + } + } +} diff --git a/3rdparty/WebSockets/src/WebSockets.h b/3rdparty/WebSockets/src/WebSockets.h new file mode 100644 index 00000000..a70768e7 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSockets.h @@ -0,0 +1,331 @@ +/** + * @file WebSockets.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETS_H_ +#define WEBSOCKETS_H_ + +#ifdef STM32_DEVICE +#include +#define bit(b) (1UL << (b)) // Taken directly from Arduino.h +#else +#include +#include +#endif + +#ifdef ARDUINO_ARCH_AVR +#error Version 2.x.x currently does not support Arduino with AVR since there is no support for std namespace of c++. +#error Use Version 1.x.x. (ATmega branch) +#else +#include +#endif + +#ifndef NODEBUG_WEBSOCKETS +#ifdef DEBUG_ESP_PORT +#define DEBUG_WEBSOCKETS(...) DEBUG_ESP_PORT.printf(__VA_ARGS__) +#else +//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) +#endif +#endif + +#ifndef DEBUG_WEBSOCKETS +#define DEBUG_WEBSOCKETS(...) +#define NODEBUG_WEBSOCKETS +#endif + +#if defined(ESP8266) || defined(ESP32) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP ESP.getFreeHeap() +// moves all Header strings to Flash (~300 Byte) +//#define WEBSOCKETS_SAVE_RAM + +#elif defined(STM32_DEVICE) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP System.freeMemory() + +#else + +//atmega328p has only 2KB ram! +#define WEBSOCKETS_MAX_DATA_SIZE (1024) +// moves all Header strings to Flash +#define WEBSOCKETS_SAVE_RAM + +#endif + +#define WEBSOCKETS_TCP_TIMEOUT (2000) + +#define NETWORK_ESP8266_ASYNC (0) +#define NETWORK_ESP8266 (1) +#define NETWORK_W5100 (2) +#define NETWORK_ENC28J60 (3) +#define NETWORK_ESP32 (4) +#define NETWORK_ESP32_ETH (5) + +// max size of the WS Message Header +#define WEBSOCKETS_MAX_HEADER_SIZE (14) + +#if !defined(WEBSOCKETS_NETWORK_TYPE) +// select Network type based +#if defined(ESP8266) || defined(ESP31B) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#elif defined(ESP32) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH +#else +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#endif +#endif + +// Includes and defined based on Network Type +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +// Note: +// No SSL/WSS support for client in Async mode +// TLS lib need a sync interface! + +#if defined(ESP8266) +#include +#elif defined(ESP32) +#include +#include +#elif defined(ESP31B) +#include +#else +#error "network type ESP8266 ASYNC only possible on the ESP mcu!" +#endif + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS AsyncTCPbuffer +#define WEBSOCKETS_NETWORK_SERVER_CLASS AsyncServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + +#if !defined(ESP8266) && !defined(ESP31B) +#error "network type ESP8266 only possible on the ESP mcu!" +#endif + +#ifdef ESP8266 +#include +#else +#include +#endif +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + +#ifdef STM32_DEVICE +#define WEBSOCKETS_NETWORK_CLASS TCPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS TCPServer +#else +#include +#include +#define WEBSOCKETS_NETWORK_CLASS EthernetClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer +#endif + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ENC28J60) + +#include +#define WEBSOCKETS_NETWORK_CLASS UIPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32_ETH) + +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#else +#error "no network type selected!" +#endif + +#ifdef WEBSOCKETS_NETWORK_SSL_CLASS +#define HAS_SSL +#endif + +// moves all Header strings to Flash (~300 Byte) +#ifdef WEBSOCKETS_SAVE_RAM +#define WEBSOCKETS_STRING(var) F(var) +#else +#define WEBSOCKETS_STRING(var) var +#endif + +typedef enum { + WSC_NOT_CONNECTED, + WSC_HEADER, + WSC_CONNECTED +} WSclientsStatus_t; + +typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + WStype_PING, + WStype_PONG, +} WStype_t; + +typedef enum { + WSop_continuation = 0x00, ///< %x0 denotes a continuation frame + WSop_text = 0x01, ///< %x1 denotes a text frame + WSop_binary = 0x02, ///< %x2 denotes a binary frame + ///< %x3-7 are reserved for further non-control frames + WSop_close = 0x08, ///< %x8 denotes a connection close + WSop_ping = 0x09, ///< %x9 denotes a ping + WSop_pong = 0x0A ///< %xA denotes a pong + ///< %xB-F are reserved for further control frames +} WSopcode_t; + +typedef struct { + bool fin; + bool rsv1; + bool rsv2; + bool rsv3; + + WSopcode_t opCode; + bool mask; + + size_t payloadLen; + + uint8_t * maskKey; +} WSMessageHeader_t; + +typedef struct { + uint8_t num; ///< connection number + + WSclientsStatus_t status; + + WEBSOCKETS_NETWORK_CLASS * tcp; + + bool isSocketIO; ///< client for socket.io server + +#if defined(HAS_SSL) + bool isSSL; ///< run in ssl mode + WEBSOCKETS_NETWORK_SSL_CLASS * ssl; +#endif + + String cUrl; ///< http url + uint16_t cCode; ///< http code + + bool cIsClient = false; ///< will be used for masking + bool cIsUpgrade; ///< Connection == Upgrade + bool cIsWebsocket; ///< Upgrade == websocket + + String cSessionId; ///< client Set-Cookie (session id) + String cKey; ///< client Sec-WebSocket-Key + String cAccept; ///< client Sec-WebSocket-Accept + String cProtocol; ///< client Sec-WebSocket-Protocol + String cExtensions; ///< client Sec-WebSocket-Extensions + uint16_t cVersion; ///< client Sec-WebSocket-Version + + uint8_t cWsRXsize; ///< State of the RX + uint8_t cWsHeader[WEBSOCKETS_MAX_HEADER_SIZE]; ///< RX WS Message buffer + WSMessageHeader_t cWsHeaderDecode; + + String base64Authorization; ///< Base64 encoded Auth request + String plainAuthorization; ///< Base64 encoded Auth request + + String extraHeaders; + + bool cHttpHeadersValid; ///< non-websocket http header validity indicator + size_t cMandatoryHeadersCount; ///< non-websocket mandatory http headers present count + + bool pongReceived; + uint32_t pingInterval; // how often ping will be sent, 0 means "heartbeat is not active" + uint32_t lastPing; // millis when last pong has been received + uint32_t pongTimeout; // interval in millis after which pong is considered to timeout + uint8_t disconnectTimeoutCount; // after how many subsequent pong timeouts discconnect will happen, 0 means "do not disconnect" + uint8_t pongTimeoutCount; // current pong timeout count + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + String cHttpLine; ///< HTTP header lines +#endif + +} WSclient_t; + +class WebSockets { + protected: +#ifdef __AVR__ + typedef void (*WSreadWaitCb)(WSclient_t * client, bool ok); +#else + typedef std::function WSreadWaitCb; +#endif + + virtual void clientDisconnect(WSclient_t * client) = 0; + virtual bool clientIsConnected(WSclient_t * client) = 0; + + void clientDisconnect(WSclient_t * client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); + + virtual void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) = 0; + + uint8_t createHeader(uint8_t * buf, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin); + bool sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length = 0, bool fin = true); + bool sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool fin = true, bool headerToPayload = false); + + void headerDone(WSclient_t * client); + + void handleWebsocket(WSclient_t * client); + + bool handleWebsocketWaitFor(WSclient_t * client, size_t size); + void handleWebsocketCb(WSclient_t * client); + void handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload); + + String acceptKey(String & clientKey); + String base64_encode(uint8_t * data, size_t length); + + bool readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb); + virtual size_t write(WSclient_t * client, uint8_t * out, size_t n); + size_t write(WSclient_t * client, const char * out); + + void enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void handleHBTimeout(WSclient_t * client); +}; + +#ifndef UNUSED +#define UNUSED(var) (void)(var) +#endif +#endif /* WEBSOCKETS_H_ */ diff --git a/3rdparty/WebSockets/src/WebSocketsClient.cpp b/3rdparty/WebSockets/src/WebSocketsClient.cpp new file mode 100644 index 00000000..82277ea7 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSocketsClient.cpp @@ -0,0 +1,854 @@ +/** + * @file WebSocketsClient.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" +#include "WebSocketsClient.h" + +WebSocketsClient::WebSocketsClient() { + _cbEvent = NULL; + _client.num = 0; + _client.cIsClient = true; + _client.extraHeaders = WEBSOCKETS_STRING("Origin: file://"); +} + +WebSocketsClient::~WebSocketsClient() { + disconnect(); +} + +/** + * calles to init the Websockets server + */ +void WebSocketsClient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { + _host = host; + _port = port; +#if defined(HAS_SSL) + _fingerprint = ""; + _CA_cert = NULL; +#endif + + _client.num = 0; + _client.status = WSC_NOT_CONNECTED; + _client.tcp = NULL; +#if defined(HAS_SSL) + _client.isSSL = false; + _client.ssl = NULL; +#endif + _client.cUrl = url; + _client.cCode = 0; + _client.cIsUpgrade = false; + _client.cIsWebsocket = true; + _client.cKey = ""; + _client.cAccept = ""; + _client.cProtocol = protocol; + _client.cExtensions = ""; + _client.cVersion = 0; + _client.base64Authorization = ""; + _client.plainAuthorization = ""; + _client.isSocketIO = false; + + _client.lastPing = 0; + _client.pongReceived = false; + _client.pongTimeoutCount = 0; + +#ifdef ESP8266 + randomSeed(RANDOM_REG32); +#else + // todo find better seed + randomSeed(millis()); +#endif +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + asyncConnect(); +#endif + + _lastConnectionFail = 0; + _reconnectInterval = 500; +} + +void WebSocketsClient::begin(String host, uint16_t port, String url, String protocol) { + begin(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +void WebSocketsClient::begin(IPAddress host, uint16_t port, const char * url, const char * protocol) { + return begin(host.toString().c_str(), port, url, protocol); +} + +#if defined(HAS_SSL) +void WebSocketsClient::beginSSL(const char * host, uint16_t port, const char * url, const char * fingerprint, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = fingerprint; + _CA_cert = NULL; +} + +void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String fingerprint, String protocol) { + beginSSL(host.c_str(), port, url.c_str(), fingerprint.c_str(), protocol.c_str()); +} + +void WebSocketsClient::beginSslWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = ""; + _CA_cert = CA_cert; +} +#endif + +void WebSocketsClient::beginSocketIO(const char * host, uint16_t port, const char * url, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; +} + +void WebSocketsClient::beginSocketIO(String host, uint16_t port, String url, String protocol) { + beginSocketIO(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +#if defined(HAS_SSL) +void WebSocketsClient::beginSocketIOSSL(const char * host, uint16_t port, const char * url, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; + _client.isSSL = true; + _fingerprint = ""; +} + +void WebSocketsClient::beginSocketIOSSL(String host, uint16_t port, String url, String protocol) { + beginSocketIOSSL(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +void WebSocketsClient::beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; + _client.isSSL = true; + _fingerprint = ""; + _CA_cert = CA_cert; +} +#endif + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * called in arduino loop + */ +void WebSocketsClient::loop(void) { + if(!clientIsConnected(&_client)) { + // do not flood the server + if((millis() - _lastConnectionFail) < _reconnectInterval) { + return; + } + +#if defined(HAS_SSL) + if(_client.isSSL) { + DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); + if(_client.ssl) { + delete _client.ssl; + _client.ssl = NULL; + _client.tcp = NULL; + } + _client.ssl = new WEBSOCKETS_NETWORK_SSL_CLASS(); + _client.tcp = _client.ssl; + if(_CA_cert) { + DEBUG_WEBSOCKETS("[WS-Client] setting CA certificate"); +#if defined(ESP32) + _client.ssl->setCACert(_CA_cert); +#elif defined(ESP8266) + _client.ssl->setCACert((const uint8_t *)_CA_cert, strlen(_CA_cert) + 1); +#else +#error setCACert not implemented +#endif + } + } else { + DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); + if(_client.tcp) { + delete _client.tcp; + _client.tcp = NULL; + } + _client.tcp = new WEBSOCKETS_NETWORK_CLASS(); + } +#else + _client.tcp = new WEBSOCKETS_NETWORK_CLASS(); +#endif + + if(!_client.tcp) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + return; + } +#if defined(ESP32) + if(_client.tcp->connect(_host.c_str(), _port, WEBSOCKETS_TCP_TIMEOUT)) { +#else + if(_client.tcp->connect(_host.c_str(), _port)) { +#endif + connectedCb(); + _lastConnectionFail = 0; + } else { + connectFailedCb(); + _lastConnectionFail = millis(); + } + } else { + handleClientData(); + + if(_client.status == WSC_CONNECTED) { + handleHBPing(); + handleHBTimeout(&_client); + } + } +} +#endif + +/** + * set callback function + * @param cbEvent WebSocketServerEvent + */ +void WebSocketsClient::onEvent(WebSocketClientEvent cbEvent) { + _cbEvent = cbEvent; +} + +/** + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsClient::sendTXT(uint8_t * payload, size_t length, bool headerToPayload) { + if(length == 0) { + length = strlen((const char *)payload); + } + if(clientIsConnected(&_client)) { + return sendFrame(&_client, WSop_text, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsClient::sendTXT(const uint8_t * payload, size_t length) { + return sendTXT((uint8_t *)payload, length); +} + +bool WebSocketsClient::sendTXT(char * payload, size_t length, bool headerToPayload) { + return sendTXT((uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsClient::sendTXT(const char * payload, size_t length) { + return sendTXT((uint8_t *)payload, length); +} + +bool WebSocketsClient::sendTXT(String & payload) { + return sendTXT((uint8_t *)payload.c_str(), payload.length()); +} + +bool WebSocketsClient::sendTXT(char payload) { + uint8_t buf[WEBSOCKETS_MAX_HEADER_SIZE + 2] = { 0x00 }; + buf[WEBSOCKETS_MAX_HEADER_SIZE] = payload; + return sendTXT(buf, 1, true); +} + +/** + * send binary data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsClient::sendBIN(uint8_t * payload, size_t length, bool headerToPayload) { + if(clientIsConnected(&_client)) { + return sendFrame(&_client, WSop_binary, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsClient::sendBIN(const uint8_t * payload, size_t length) { + return sendBIN((uint8_t *)payload, length); +} + +/** + * sends a WS ping to Server + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsClient::sendPing(uint8_t * payload, size_t length) { + if(clientIsConnected(&_client)) { + bool sent = sendFrame(&_client, WSop_ping, payload, length); + if(sent) + _client.lastPing = millis(); + return sent; + } + return false; +} + +bool WebSocketsClient::sendPing(String & payload) { + return sendPing((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * disconnect one client + * @param num uint8_t client id + */ +void WebSocketsClient::disconnect(void) { + if(clientIsConnected(&_client)) { + WebSockets::clientDisconnect(&_client, 1000); + } +} + +/** + * set the Authorizatio for the http request + * @param user const char * + * @param password const char * + */ +void WebSocketsClient::setAuthorization(const char * user, const char * password) { + if(user && password) { + String auth = user; + auth += ":"; + auth += password; + _client.base64Authorization = base64_encode((uint8_t *)auth.c_str(), auth.length()); + } +} + +/** + * set the Authorizatio for the http request + * @param auth const char * base64 + */ +void WebSocketsClient::setAuthorization(const char * auth) { + if(auth) { + //_client.base64Authorization = auth; + _client.plainAuthorization = auth; + } +} + +/** + * set extra headers for the http request; + * separate headers by "\r\n" + * @param extraHeaders const char * extraHeaders + */ +void WebSocketsClient::setExtraHeaders(const char * extraHeaders) { + _client.extraHeaders = extraHeaders; +} + +/** + * set the reconnect Interval + * how long to wait after a connection initiate failed + * @param time in ms + */ +void WebSocketsClient::setReconnectInterval(unsigned long time) { + _reconnectInterval = time; +} + +bool WebSocketsClient::isConnected(void) { + return (_client.status == WSC_CONNECTED); +} + +//################################################################################# +//################################################################################# +//################################################################################# + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * + * @param length size_t + */ +void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) { + WStype_t type = WStype_ERROR; + + UNUSED(client); + + switch(opcode) { + case WSop_text: + type = fin ? WStype_TEXT : WStype_FRAGMENT_TEXT_START; + break; + case WSop_binary: + type = fin ? WStype_BIN : WStype_FRAGMENT_BIN_START; + break; + case WSop_continuation: + type = fin ? WStype_FRAGMENT_FIN : WStype_FRAGMENT; + break; + case WSop_ping: + type = WStype_PING; + break; + case WSop_pong: + type = WStype_PONG; + break; + case WSop_close: + default: + break; + } + + runCbEvent(type, payload, length); +} + +/** + * Disconnect an client + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::clientDisconnect(WSclient_t * client) { + bool event = false; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + if(client->isSSL && client->ssl) { + if(client->ssl->connected()) { + client->ssl->flush(); + client->ssl->stop(); + } + event = true; + delete client->ssl; + client->ssl = NULL; + client->tcp = NULL; + } +#endif + + if(client->tcp) { + if(client->tcp->connected()) { +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + client->tcp->flush(); +#endif + client->tcp->stop(); + } + event = true; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->status = WSC_NOT_CONNECTED; +#else + delete client->tcp; +#endif + client->tcp = NULL; + } + + client->cCode = 0; + client->cKey = ""; + client->cAccept = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + client->cSessionId = ""; + + client->status = WSC_NOT_CONNECTED; + + DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); + if(event) { + runCbEvent(WStype_DISCONNECTED, NULL, 0); + } +} + +/** + * get client state + * @param client WSclient_t * ptr to the client struct + * @return true = conneted + */ +bool WebSocketsClient::clientIsConnected(WSclient_t * client) { + if(!client->tcp) { + return false; + } + + if(client->tcp->connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); + // do cleanup + clientDisconnect(client); + } + } + + if(client->tcp) { + // do cleanup + clientDisconnect(client); + } + + return false; +} +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * Handel incomming data from Client + */ +void WebSocketsClient::handleClientData(void) { + int len = _client.tcp->available(); + if(len > 0) { + switch(_client.status) { + case WSC_HEADER: { + String headerLine = _client.tcp->readStringUntil('\n'); + handleHeader(&_client, &headerLine); + } break; + case WSC_CONNECTED: + WebSockets::handleWebsocket(&_client); + break; + default: + WebSockets::clientDisconnect(&_client, 1002); + break; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + delay(0); +#endif +} +#endif + +/** + * send the WebSocket header to Server + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::sendHeader(WSclient_t * client) { + static const char * NEW_LINE = "\r\n"; + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); + + uint8_t randomKey[16] = { 0 }; + + for(uint8_t i = 0; i < sizeof(randomKey); i++) { + randomKey[i] = random(0xFF); + } + + client->cKey = base64_encode(&randomKey[0], 16); + +#ifndef NODEBUG_WEBSOCKETS + unsigned long start = micros(); +#endif + + String handshake; + bool ws_header = true; + String url = client->cUrl; + + if(client->isSocketIO) { + if(client->cSessionId.length() == 0) { + url += WEBSOCKETS_STRING("&transport=polling"); + ws_header = false; + } else { + url += WEBSOCKETS_STRING("&transport=websocket&sid="); + url += client->cSessionId; + } + } + + handshake = WEBSOCKETS_STRING("GET "); + handshake += url + WEBSOCKETS_STRING( + " HTTP/1.1\r\n" + "Host: "); + handshake += _host + ":" + _port + NEW_LINE; + + if(ws_header) { + handshake += WEBSOCKETS_STRING( + "Connection: Upgrade\r\n" + "Upgrade: websocket\r\n" + "Sec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Key: "); + handshake += client->cKey + NEW_LINE; + + if(client->cProtocol.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Protocol: "); + handshake += client->cProtocol + NEW_LINE; + } + + if(client->cExtensions.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Extensions: "); + handshake += client->cExtensions + NEW_LINE; + } + } else { + handshake += WEBSOCKETS_STRING("Connection: keep-alive\r\n"); + } + + // add extra headers; by default this includes "Origin: file://" + if(client->extraHeaders) { + handshake += client->extraHeaders + NEW_LINE; + } + + handshake += WEBSOCKETS_STRING("User-Agent: arduino-WebSocket-Client\r\n"); + + if(client->base64Authorization.length() > 0) { + handshake += WEBSOCKETS_STRING("Authorization: Basic "); + handshake += client->base64Authorization + NEW_LINE; + } + + if(client->plainAuthorization.length() > 0) { + handshake += WEBSOCKETS_STRING("Authorization: "); + handshake += client->plainAuthorization + NEW_LINE; + } + + handshake += NEW_LINE; + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] handshake %s", (uint8_t *)handshake.c_str()); + write(client, (uint8_t *)handshake.c_str(), handshake.length()); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsClient::handleHeader, this, client, &(client->cHttpLine))); +#endif + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%luus).\n", (micros() - start)); +} + +/** + * handle the WebSocket header reading + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { + headerLine->trim(); // remove \r + + if(headerLine->length() > 0) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine->c_str()); + + if(headerLine->startsWith(WEBSOCKETS_STRING("HTTP/1."))) { + // "HTTP/1.1 101 Switching Protocols" + client->cCode = headerLine->substring(9, headerLine->indexOf(' ', 9)).toInt(); + } else if(headerLine->indexOf(':') >= 0) { + String headerName = headerLine->substring(0, headerLine->indexOf(':')); + String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); + + // remove space in the beginning (RFC2616) + if(headerValue[0] == ' ') { + headerValue.remove(0, 1); + } + + if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("upgrade"))) { + client->cIsUpgrade = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { + client->cIsWebsocket = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Accept"))) { + client->cAccept = headerValue; + client->cAccept.trim(); // see rfc6455 + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { + client->cProtocol = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { + client->cExtensions = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { + client->cVersion = headerValue.toInt(); + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie"))) { + if(headerValue.indexOf(WEBSOCKETS_STRING("HttpOnly")) > -1) { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1, headerValue.indexOf(";")); + } else { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1); + } + } + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); + } + + (*headerLine) = ""; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsClient::handleHeader, this, client, &(client->cHttpLine))); +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); + + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); + + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cSessionId: %s\n", client->cSessionId.c_str()); + + bool ok = (client->cIsUpgrade && client->cIsWebsocket); + + if(ok) { + switch(client->cCode) { + case 101: ///< Switching Protocols + + break; + case 200: + if(client->isSocketIO) { + break; + } + case 403: ///< Forbidden + // todo handle login + default: ///< Server dont unterstand requrst + ok = false; + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + clientDisconnect(client); + _lastConnectionFail = millis(); + break; + } + } + + if(ok) { + if(client->cAccept.length() == 0) { + ok = false; + } else { + // generate Sec-WebSocket-Accept key for check + String sKey = acceptKey(client->cKey); + if(sKey != client->cAccept) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); + ok = false; + } + } + } + + if(ok) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); + headerDone(client); + + runCbEvent(WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length()); + } else if(clientIsConnected(client) && client->isSocketIO && client->cSessionId.length() > 0) { + if(_client.tcp->available()) { + // read not needed data + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still data in buffer (%d), clean up.\n", _client.tcp->available()); + while(_client.tcp->available() > 0) { + _client.tcp->read(); + } + } + sendHeader(client); + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); + _lastConnectionFail = millis(); + if(clientIsConnected(client)) { + write(client, "This is a webSocket client!"); + } + clientDisconnect(client); + } + } +} + +void WebSocketsClient::connectedCb() { + DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _client.tcp->onDisconnect(std::bind([](WebSocketsClient * c, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + client->status = WSC_NOT_CONNECTED; + client->tcp = NULL; + + // reconnect + c->asyncConnect(); + + return true; + }, + this, std::placeholders::_1, &_client)); +#endif + + _client.status = WSC_HEADER; + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + _client.tcp->setNoDelay(true); +#endif + +#if defined(HAS_SSL) + if(_client.isSSL && _fingerprint.length()) { + if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { + DEBUG_WEBSOCKETS("[WS-Client] certificate mismatch\n"); + WebSockets::clientDisconnect(&_client, 1000); + return; + } + } else if(_client.isSSL && !_CA_cert) { +#if defined(wificlientbearssl_h) && !defined(USING_AXTLS) && !defined(wificlientsecure_h) + _client.ssl->setInsecure(); +#endif + } +#endif + + // send Header to Server + sendHeader(&_client); +} + +void WebSocketsClient::connectFailedCb() { + DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Failed\n", _host.c_str(), _port); +} + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +void WebSocketsClient::asyncConnect() { + DEBUG_WEBSOCKETS("[WS-Client] asyncConnect...\n"); + + AsyncClient * tcpclient = new AsyncClient(); + + if(!tcpclient) { + DEBUG_WEBSOCKETS("[WS-Client] creating AsyncClient class failed!\n"); + return; + } + + tcpclient->onDisconnect([](void * obj, AsyncClient * c) { + c->free(); + delete c; + }); + + tcpclient->onConnect(std::bind([](WebSocketsClient * ws, AsyncClient * tcp) { + ws->_client.tcp = new AsyncTCPbuffer(tcp); + if(!ws->_client.tcp) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); + ws->connectFailedCb(); + return; + } + ws->connectedCb(); + }, + this, std::placeholders::_2)); + + tcpclient->onError(std::bind([](WebSocketsClient * ws, AsyncClient * tcp) { + ws->connectFailedCb(); + + // reconnect + ws->asyncConnect(); + }, + this, std::placeholders::_2)); + + if(!tcpclient->connect(_host.c_str(), _port)) { + connectFailedCb(); + delete tcpclient; + } +} + +#endif + +/** + * send heartbeat ping to server in set intervals + */ +void WebSocketsClient::handleHBPing() { + if(_client.pingInterval == 0) + return; + uint32_t pi = millis() - _client.lastPing; + if(pi > _client.pingInterval) { + DEBUG_WEBSOCKETS("[WS-Client] sending HB ping\n"); + if(sendPing()) { + _client.lastPing = millis(); + _client.pongReceived = false; + } + } +} + +/** + * enable ping/pong heartbeat process + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSocketsClient::enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + WebSockets::enableHeartbeat(&_client, pingInterval, pongTimeout, disconnectTimeoutCount); +} + +/** + * disable ping/pong heartbeat process + */ +void WebSocketsClient::disableHeartbeat() { + _client.pingInterval = 0; +} diff --git a/3rdparty/WebSockets/src/WebSocketsClient.h b/3rdparty/WebSockets/src/WebSocketsClient.h new file mode 100644 index 00000000..b6fe7387 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSocketsClient.h @@ -0,0 +1,145 @@ +/** + * @file WebSocketsClient.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSCLIENT_H_ +#define WEBSOCKETSCLIENT_H_ + +#include "WebSockets.h" + +class WebSocketsClient : protected WebSockets { + public: +#ifdef __AVR__ + typedef void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length); +#else + typedef std::function WebSocketClientEvent; +#endif + + WebSocketsClient(void); + virtual ~WebSocketsClient(void); + + void begin(const char * host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); + void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); + void begin(IPAddress host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); + +#if defined(HAS_SSL) + void beginSSL(const char * host, uint16_t port, const char * url = "/", const char * = "", const char * protocol = "arduino"); + void beginSSL(String host, uint16_t port, String url = "/", String fingerprint = "", String protocol = "arduino"); + void beginSslWithCA(const char * host, uint16_t port, const char * url = "/", const char * CA_cert = NULL, const char * protocol = "arduino"); +#endif + + void beginSocketIO(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void beginSocketIO(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + +#if defined(HAS_SSL) + void beginSocketIOSSL(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void beginSocketIOSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + void beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * CA_cert = NULL, const char * protocol = "arduino"); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); +#else + // Async interface not need a loop call + void loop(void) __attribute__((deprecated)) {} +#endif + + void onEvent(WebSocketClientEvent cbEvent); + + bool sendTXT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(const uint8_t * payload, size_t length = 0); + bool sendTXT(char * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(const char * payload, size_t length = 0); + bool sendTXT(String & payload); + bool sendTXT(char payload); + + bool sendBIN(uint8_t * payload, size_t length, bool headerToPayload = false); + bool sendBIN(const uint8_t * payload, size_t length); + + bool sendPing(uint8_t * payload = NULL, size_t length = 0); + bool sendPing(String & payload); + + void disconnect(void); + + void setAuthorization(const char * user, const char * password); + void setAuthorization(const char * auth); + + void setExtraHeaders(const char * extraHeaders = NULL); + + void setReconnectInterval(unsigned long time); + + void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void disableHeartbeat(); + + protected: + String _host; + uint16_t _port; + + bool isConnected(void); + +#if defined(HAS_SSL) + String _fingerprint; + const char * _CA_cert; +#endif + WSclient_t _client; + + WebSocketClientEvent _cbEvent; + + unsigned long _lastConnectionFail; + unsigned long _reconnectInterval; + + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin); + + void clientDisconnect(WSclient_t * client); + bool clientIsConnected(WSclient_t * client); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleClientData(void); +#endif + + void sendHeader(WSclient_t * client); + void handleHeader(WSclient_t * client, String * headerLine); + + void connectedCb(); + void connectFailedCb(); + + void handleHBPing(); // send ping in specified intervals + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + void asyncConnect(); +#endif + + /** + * called for sending a Event to the app + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ + virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(type, payload, length); + } + } +}; + +#endif /* WEBSOCKETSCLIENT_H_ */ diff --git a/3rdparty/WebSockets/src/WebSocketsServer.cpp b/3rdparty/WebSockets/src/WebSocketsServer.cpp new file mode 100644 index 00000000..633e34c2 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSocketsServer.cpp @@ -0,0 +1,852 @@ +/** + * @file WebSocketsServer.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" +#include "WebSocketsServer.h" + +WebSocketsServer::WebSocketsServer(uint16_t port, String origin, String protocol) { + _port = port; + _origin = origin; + _protocol = protocol; + _runnning = false; + + _server = new WEBSOCKETS_NETWORK_SERVER_CLASS(port); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->onClient([](void * s, AsyncClient * c) { + ((WebSocketsServer *)s)->newClient(new AsyncTCPbuffer(c)); + }, + this); +#endif + + _cbEvent = NULL; + + _httpHeaderValidationFunc = NULL; + _mandatoryHttpHeaders = NULL; + _mandatoryHttpHeaderCount = 0; + + memset(&_clients[0], 0x00, (sizeof(WSclient_t) * WEBSOCKETS_SERVER_CLIENT_MAX)); +} + +WebSocketsServer::~WebSocketsServer() { + // disconnect all clients + close(); + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = 0; +} + +/** + * called to initialize the Websocket server + */ +void WebSocketsServer::begin(void) { + WSclient_t * client; + + // init client storage + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + + client->num = i; + client->status = WSC_NOT_CONNECTED; + client->tcp = NULL; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + client->isSSL = false; + client->ssl = NULL; +#endif + client->cUrl = ""; + client->cCode = 0; + client->cKey = ""; + client->cProtocol = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + + client->base64Authorization = ""; + + client->cWsRXsize = 0; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; +#endif + } + +#ifdef ESP8266 + randomSeed(RANDOM_REG32); +#elif defined(ESP32) +#define DR_REG_RNG_BASE 0x3ff75144 + randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#else + // TODO find better seed + randomSeed(millis()); +#endif + + _runnning = true; + _server->begin(); + + DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); +} + +void WebSocketsServer::close(void) { + _runnning = false; + disconnect(); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + _server->close(); +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->end(); +#else + // TODO how to close server? +#endif +} + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * called in arduino loop + */ +void WebSocketsServer::loop(void) { + if(_runnning) { + handleNewClients(); + handleClientData(); + } +} +#endif + +/** + * set callback function + * @param cbEvent WebSocketServerEvent + */ +void WebSocketsServer::onEvent(WebSocketServerEvent cbEvent) { + _cbEvent = cbEvent; +} + +/* + * Sets the custom http header validator function + * @param httpHeaderValidationFunc WebSocketServerHttpHeaderValFunc ///< pointer to the custom http header validation function + * @param mandatoryHttpHeaders[] const char* ///< the array of named http headers considered to be mandatory / must be present in order for websocket upgrade to succeed + * @param mandatoryHttpHeaderCount size_t ///< the number of items in the mandatoryHttpHeaders array + */ +void WebSocketsServer::onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount) { + _httpHeaderValidationFunc = validationFunc; + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = mandatoryHttpHeaderCount; + _mandatoryHttpHeaders = new String[_mandatoryHttpHeaderCount]; + + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + _mandatoryHttpHeaders[i] = mandatoryHttpHeaders[i]; + } +} + +/* + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + if(length == 0) { + length = strlen((const char *)payload); + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_text, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsServer::sendTXT(uint8_t num, const uint8_t * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServer::sendTXT(uint8_t num, char * payload, size_t length, bool headerToPayload) { + return sendTXT(num, (uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServer::sendTXT(uint8_t num, const char * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServer::sendTXT(uint8_t num, String & payload) { + return sendTXT(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send text data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + if(length == 0) { + length = strlen((const char *)payload); + } + + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_text, payload, length, true, headerToPayload)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastTXT(const uint8_t * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServer::broadcastTXT(char * payload, size_t length, bool headerToPayload) { + return broadcastTXT((uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServer::broadcastTXT(const char * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServer::broadcastTXT(String & payload) { + return broadcastTXT((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send binary data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::sendBIN(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_binary, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsServer::sendBIN(uint8_t num, const uint8_t * payload, size_t length) { + return sendBIN(num, (uint8_t *)payload, length); +} + +/** + * send binary data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_binary, payload, length, true, headerToPayload)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) { + return broadcastBIN((uint8_t *)payload, length); +} + +/** + * sends a WS ping to Client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::sendPing(uint8_t num, uint8_t * payload, size_t length) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_ping, payload, length); + } + return false; +} + +bool WebSocketsServer::sendPing(uint8_t num, String & payload) { + return sendPing(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * sends a WS ping to all Client + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::broadcastPing(uint8_t * payload, size_t length) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_ping, payload, length)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastPing(String & payload) { + return broadcastPing((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * disconnect all clients + */ +void WebSocketsServer::disconnect(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } + } +} + +/** + * disconnect one client + * @param num uint8_t client id + */ +void WebSocketsServer::disconnect(uint8_t num) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } +} + +/* + * set the Authorization for the http request + * @param user const char * + * @param password const char * + */ +void WebSocketsServer::setAuthorization(const char * user, const char * password) { + if(user && password) { + String auth = user; + auth += ":"; + auth += password; + _base64Authorization = base64_encode((uint8_t *)auth.c_str(), auth.length()); + } +} + +/** + * set the Authorizatio for the http request + * @param auth const char * base64 + */ +void WebSocketsServer::setAuthorization(const char * auth) { + if(auth) { + _base64Authorization = auth; + } +} + +/** + * count the connected clients (optional ping them) + * @param ping bool ping the connected clients + */ +int WebSocketsServer::connectedClients(bool ping) { + WSclient_t * client; + int count = 0; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(client->status == WSC_CONNECTED) { + if(ping != true || sendPing(i)) { + count++; + } + } + } + return count; +} + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +/** + * get an IP for a client + * @param num uint8_t client id + * @return IPAddress + */ +IPAddress WebSocketsServer::remoteIP(uint8_t num) { + if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return client->tcp->remoteIP(); + } + } + + return IPAddress(); +} +#endif + +//################################################################################# +//################################################################################# +//################################################################################# + +/** + * handle new client connection + * @param client + */ +bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) { + WSclient_t * client; + // search free list entry for client + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + + // state is not connected or tcp connection is lost + if(!clientIsConnected(client)) { + client->tcp = TCPclient; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + client->isSSL = false; + client->tcp->setNoDelay(true); +#endif +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + client->status = WSC_HEADER; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress ip = client->tcp->remoteIP(); + DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->onDisconnect(std::bind([](WebSocketsServer * server, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + + AsyncTCPbuffer ** sl = &server->_clients[client->num].tcp; + if(*sl == obj) { + client->status = WSC_NOT_CONNECTED; + *sl = NULL; + } + return true; + }, + this, std::placeholders::_1, client)); + + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine))); +#endif + + return true; + break; + } + } + return false; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * + * @param length size_t + */ +void WebSocketsServer::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) { + WStype_t type = WStype_ERROR; + + switch(opcode) { + case WSop_text: + type = fin ? WStype_TEXT : WStype_FRAGMENT_TEXT_START; + break; + case WSop_binary: + type = fin ? WStype_BIN : WStype_FRAGMENT_BIN_START; + break; + case WSop_continuation: + type = fin ? WStype_FRAGMENT_FIN : WStype_FRAGMENT; + break; + case WSop_ping: + type = WStype_PING; + break; + case WSop_pong: + type = WStype_PONG; + break; + case WSop_close: + default: + break; + } + + runCbEvent(client->num, type, payload, length); +} + +/** + * Disconnect an client + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsServer::clientDisconnect(WSclient_t * client) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + if(client->isSSL && client->ssl) { + if(client->ssl->connected()) { + client->ssl->flush(); + client->ssl->stop(); + } + delete client->ssl; + client->ssl = NULL; + client->tcp = NULL; + } +#endif + + if(client->tcp) { + if(client->tcp->connected()) { +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + client->tcp->flush(); +#endif + client->tcp->stop(); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->status = WSC_NOT_CONNECTED; +#else + delete client->tcp; +#endif + client->tcp = NULL; + } + + client->cUrl = ""; + client->cKey = ""; + client->cProtocol = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + + client->cWsRXsize = 0; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; +#endif + + client->status = WSC_NOT_CONNECTED; + + DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); + + runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); +} + +/** + * get client state + * @param client WSclient_t * ptr to the client struct + * @return true = connected + */ +bool WebSocketsServer::clientIsConnected(WSclient_t * client) { + if(!client->tcp) { + return false; + } + + if(client->tcp->connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + // do cleanup + clientDisconnect(client); + } + } + + if(client->tcp) { + // do cleanup + DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num); + clientDisconnect(client); + } + + return false; +} +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * Handle incoming Connection Request + */ +void WebSocketsServer::handleNewClients(void) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + while(_server->hasClient()) { +#endif + bool ok = false; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + // store new connection + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); +#else + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); +#endif + + if(!tcpClient) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + return; + } + + ok = newClient(tcpClient); + + if(!ok) { + // no free space to handle client +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress ip = tcpClient->remoteIP(); + DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); +#endif + tcpClient->stop(); + } + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + delay(0); + } +#endif +} + +/** + * Handel incomming data from Client + */ +void WebSocketsServer::handleClientData(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + int len = client->tcp->available(); + if(len > 0) { + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleClientData] len: %d\n", client->num, len); + switch(client->status) { + case WSC_HEADER: { + String headerLine = client->tcp->readStringUntil('\n'); + handleHeader(client, &headerLine); + } break; + case WSC_CONNECTED: + WebSockets::handleWebsocket(client); + break; + default: + WebSockets::clientDisconnect(client, 1002); + break; + } + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } +} +#endif + +/* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ +bool WebSocketsServer::hasMandatoryHeader(String headerName) { + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + if(_mandatoryHttpHeaders[i].equalsIgnoreCase(headerName)) + return true; + } + return false; +} + +/** + * handles http header reading for WebSocket upgrade + * @param client WSclient_t * ///< pointer to the client struct + * @param headerLine String ///< the header being read / processed + */ +void WebSocketsServer::handleHeader(WSclient_t * client, String * headerLine) { + static const char * NEW_LINE = "\r\n"; + + headerLine->trim(); // remove \r + + if(headerLine->length() > 0) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine->c_str()); + + // websocket requests always start with GET see rfc6455 + if(headerLine->startsWith("GET ")) { + // cut URL out + client->cUrl = headerLine->substring(4, headerLine->indexOf(' ', 4)); + + //reset non-websocket http header validation state for this client + client->cHttpHeadersValid = true; + client->cMandatoryHeadersCount = 0; + + } else if(headerLine->indexOf(':') >= 0) { + String headerName = headerLine->substring(0, headerLine->indexOf(':')); + String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); + + // remove space in the beginning (RFC2616) + if(headerValue[0] == ' ') { + headerValue.remove(0, 1); + } + + if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { + headerValue.toLowerCase(); + if(headerValue.indexOf(WEBSOCKETS_STRING("upgrade")) >= 0) { + client->cIsUpgrade = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { + client->cIsWebsocket = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { + client->cVersion = headerValue.toInt(); + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Key"))) { + client->cKey = headerValue; + client->cKey.trim(); // see rfc6455 + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { + client->cProtocol = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { + client->cExtensions = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Authorization"))) { + client->base64Authorization = headerValue; + } else { + client->cHttpHeadersValid &= execHttpHeaderValidation(headerName, headerValue); + if(_mandatoryHttpHeaderCount > 0 && hasMandatoryHeader(headerName)) { + client->cMandatoryHeadersCount++; + } + } + + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); + } + + (*headerLine) = ""; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine))); +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - base64Authorization: %s\n", client->num, client->base64Authorization.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cHttpHeadersValid: %d\n", client->num, client->cHttpHeadersValid); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cMandatoryHeadersCount: %d\n", client->num, client->cMandatoryHeadersCount); + + bool ok = (client->cIsUpgrade && client->cIsWebsocket); + + if(ok) { + if(client->cUrl.length() == 0) { + ok = false; + } + if(client->cKey.length() == 0) { + ok = false; + } + if(client->cVersion != 13) { + ok = false; + } + if(!client->cHttpHeadersValid) { + ok = false; + } + if(client->cMandatoryHeadersCount != _mandatoryHttpHeaderCount) { + ok = false; + } + } + + if(_base64Authorization.length() > 0) { + String auth = WEBSOCKETS_STRING("Basic "); + auth += _base64Authorization; + if(auth != client->base64Authorization) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] HTTP Authorization failed!\n", client->num); + handleAuthorizationFailed(client); + return; + } + } + + if(ok) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incoming.\n", client->num); + + // generate Sec-WebSocket-Accept key + String sKey = acceptKey(client->cKey); + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); + + client->status = WSC_CONNECTED; + + String handshake = WEBSOCKETS_STRING( + "HTTP/1.1 101 Switching Protocols\r\n" + "Server: arduino-WebSocketsServer\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Accept: "); + handshake += sKey + NEW_LINE; + + if(_origin.length() > 0) { + handshake += WEBSOCKETS_STRING("Access-Control-Allow-Origin: "); + handshake += _origin + NEW_LINE; + } + + if(client->cProtocol.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Protocol: "); + handshake += _protocol + NEW_LINE; + } + + // header end + handshake += NEW_LINE; + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] handshake %s", client->num, (uint8_t *)handshake.c_str()); + + write(client, (uint8_t *)handshake.c_str(), handshake.length()); + + headerDone(client); + + // send ping + WebSockets::sendFrame(client, WSop_ping); + + runCbEvent(client->num, WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length()); + + } else { + handleNonWebsocketConnection(client); + } + } +} diff --git a/3rdparty/WebSockets/src/WebSocketsServer.h b/3rdparty/WebSockets/src/WebSocketsServer.h new file mode 100644 index 00000000..60144a12 --- /dev/null +++ b/3rdparty/WebSockets/src/WebSocketsServer.h @@ -0,0 +1,206 @@ +/** + * @file WebSocketsServer.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSSERVER_H_ +#define WEBSOCKETSSERVER_H_ + +#include "WebSockets.h" + +#ifndef WEBSOCKETS_SERVER_CLIENT_MAX +#define WEBSOCKETS_SERVER_CLIENT_MAX (5) +#endif + +class WebSocketsServer : protected WebSockets { + public: +#ifdef __AVR__ + typedef void (*WebSocketServerEvent)(uint8_t num, WStype_t type, uint8_t * payload, size_t length); + typedef bool (*WebSocketServerHttpHeaderValFunc)(String headerName, String headerValue); +#else + typedef std::function WebSocketServerEvent; + typedef std::function WebSocketServerHttpHeaderValFunc; +#endif + + WebSocketsServer(uint16_t port, String origin = "", String protocol = "arduino"); + virtual ~WebSocketsServer(void); + + void begin(void); + void close(void); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); +#else + // Async interface not need a loop call + void loop(void) __attribute__((deprecated)) {} +#endif + + void onEvent(WebSocketServerEvent cbEvent); + void onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount); + + bool sendTXT(uint8_t num, uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const uint8_t * payload, size_t length = 0); + bool sendTXT(uint8_t num, char * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const char * payload, size_t length = 0); + bool sendTXT(uint8_t num, String & payload); + + bool broadcastTXT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const uint8_t * payload, size_t length = 0); + bool broadcastTXT(char * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const char * payload, size_t length = 0); + bool broadcastTXT(String & payload); + + bool sendBIN(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload = false); + bool sendBIN(uint8_t num, const uint8_t * payload, size_t length); + + bool broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload = false); + bool broadcastBIN(const uint8_t * payload, size_t length); + + bool sendPing(uint8_t num, uint8_t * payload = NULL, size_t length = 0); + bool sendPing(uint8_t num, String & payload); + + bool broadcastPing(uint8_t * payload = NULL, size_t length = 0); + bool broadcastPing(String & payload); + + void disconnect(void); + void disconnect(uint8_t num); + + void setAuthorization(const char * user, const char * password); + void setAuthorization(const char * auth); + + int connectedClients(bool ping = false); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress remoteIP(uint8_t num); +#endif + + protected: + uint16_t _port; + String _origin; + String _protocol; + String _base64Authorization; ///< Base64 encoded Auth request + String * _mandatoryHttpHeaders; + size_t _mandatoryHttpHeaderCount; + + WEBSOCKETS_NETWORK_SERVER_CLASS * _server; + + WSclient_t _clients[WEBSOCKETS_SERVER_CLIENT_MAX]; + + WebSocketServerEvent _cbEvent; + WebSocketServerHttpHeaderValFunc _httpHeaderValidationFunc; + + bool _runnning; + + bool newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient); + + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin); + + void clientDisconnect(WSclient_t * client); + bool clientIsConnected(WSclient_t * client); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleNewClients(void); + void handleClientData(void); +#endif + + void handleHeader(WSclient_t * client, String * headerLine); + + /** + * called if a non Websocket connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleNonWebsocketConnection(WSclient_t * client) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); + client->tcp->write( + "HTTP/1.1 400 Bad Request\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 32\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "\r\n" + "This is a Websocket server only!"); + clientDisconnect(client); + } + + /** + * called if a non Authorization connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleAuthorizationFailed(WSclient_t * client) { + client->tcp->write( + "HTTP/1.1 401 Unauthorized\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 45\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "WWW-Authenticate: Basic realm=\"WebSocket Server\"" + "\r\n" + "This Websocket server requires Authorization!"); + clientDisconnect(client); + } + + /** + * called for sending a Event to the app + * @param num uint8_t + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ + virtual void runCbEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(num, type, payload, length); + } + } + + /* + * Called at client socket connect handshake negotiation time for each http header that is not + * a websocket specific http header (not Connection, Upgrade, Sec-WebSocket-*) + * If the custom httpHeaderValidationFunc returns false for any headerName / headerValue passed, the + * socket negotiation is considered invalid and the upgrade to websockets request is denied / rejected + * This mechanism can be used to enable custom authentication schemes e.g. test the value + * of a session cookie to determine if a user is logged on / authenticated + */ + virtual bool execHttpHeaderValidation(String headerName, String headerValue) { + if(_httpHeaderValidationFunc) { + //return the value of the custom http header validation function + return _httpHeaderValidationFunc(headerName, headerValue); + } + //no custom http header validation so just assume all is good + return true; + } + + private: + /* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ + bool hasMandatoryHeader(String headerName); +}; + +#endif /* WEBSOCKETSSERVER_H_ */ diff --git a/3rdparty/WebSockets/src/libb64/AUTHORS b/3rdparty/WebSockets/src/libb64/AUTHORS new file mode 100644 index 00000000..af687375 --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/AUTHORS @@ -0,0 +1,7 @@ +libb64: Base64 Encoding/Decoding Routines +====================================== + +Authors: +------- + +Chris Venter chris.venter@gmail.com http://rocketpod.blogspot.com diff --git a/3rdparty/WebSockets/src/libb64/LICENSE b/3rdparty/WebSockets/src/libb64/LICENSE new file mode 100644 index 00000000..a6b56069 --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/LICENSE @@ -0,0 +1,29 @@ +Copyright-Only Dedication (based on United States law) +or Public Domain Certification + +The person or persons who have associated work with this document (the +"Dedicator" or "Certifier") hereby either (a) certifies that, to the best of +his knowledge, the work of authorship identified is in the public domain of the +country from which the work is published, or (b) hereby dedicates whatever +copyright the dedicators holds in the work of authorship identified below (the +"Work") to the public domain. A certifier, moreover, dedicates any copyright +interest he may have in the associated work, and for these purposes, is +described as a "dedicator" below. + +A certifier has taken reasonable steps to verify the copyright status of this +work. Certifier recognizes that his good faith efforts may not shield him from +liability if in fact the work certified is not in the public domain. + +Dedicator makes this dedication for the benefit of the public at large and to +the detriment of the Dedicator's heirs and successors. Dedicator intends this +dedication to be an overt act of relinquishment in perpetuity of all present +and future rights under copyright law, whether vested or contingent, in the +Work. Dedicator understands that such relinquishment of all rights includes +the relinquishment of all rights to enforce (by lawsuit or otherwise) those +copyrights in the Work. + +Dedicator recognizes that, once placed in the public domain, the Work may be +freely reproduced, distributed, transmitted, used, modified, built upon, or +otherwise exploited by anyone for any purpose, commercial or non-commercial, +and in any way, including by methods that have not yet been invented or +conceived. \ No newline at end of file diff --git a/3rdparty/WebSockets/src/libb64/cdecode.c b/3rdparty/WebSockets/src/libb64/cdecode.c new file mode 100644 index 00000000..e135da24 --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/cdecode.c @@ -0,0 +1,98 @@ +/* +cdecoder.c - c source to a base64 decoding algorithm implementation + +This is part of the libb64 project, and has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#ifdef ESP8266 +#include +#endif + +#if defined(ESP32) +#define CORE_HAS_LIBB64 +#endif + +#ifndef CORE_HAS_LIBB64 +#include "cdecode_inc.h" + +int base64_decode_value(char value_in) +{ + static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51}; + static const char decoding_size = sizeof(decoding); + value_in -= 43; + if (value_in < 0 || value_in > decoding_size) return -1; + return decoding[(int)value_in]; +} + +void base64_init_decodestate(base64_decodestate* state_in) +{ + state_in->step = step_a; + state_in->plainchar = 0; +} + +int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) +{ + const char* codechar = code_in; + char* plainchar = plaintext_out; + char fragment; + + *plainchar = state_in->plainchar; + + switch (state_in->step) + { + while (1) + { + case step_a: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_a; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar = (fragment & 0x03f) << 2; + case step_b: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_b; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x030) >> 4; + *plainchar = (fragment & 0x00f) << 4; + case step_c: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_c; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x03c) >> 2; + *plainchar = (fragment & 0x003) << 6; + case step_d: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_d; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x03f); + } + } + /* control should not reach here */ + return plainchar - plaintext_out; +} + +#endif diff --git a/3rdparty/WebSockets/src/libb64/cdecode_inc.h b/3rdparty/WebSockets/src/libb64/cdecode_inc.h new file mode 100644 index 00000000..d0d7f489 --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/cdecode_inc.h @@ -0,0 +1,28 @@ +/* +cdecode.h - c header for a base64 decoding algorithm + +This is part of the libb64 project, and has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#ifndef BASE64_CDECODE_H +#define BASE64_CDECODE_H + +typedef enum +{ + step_a, step_b, step_c, step_d +} base64_decodestep; + +typedef struct +{ + base64_decodestep step; + char plainchar; +} base64_decodestate; + +void base64_init_decodestate(base64_decodestate* state_in); + +int base64_decode_value(char value_in); + +int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in); + +#endif /* BASE64_CDECODE_H */ diff --git a/3rdparty/WebSockets/src/libb64/cencode.c b/3rdparty/WebSockets/src/libb64/cencode.c new file mode 100644 index 00000000..afe1463c --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/cencode.c @@ -0,0 +1,119 @@ +/* +cencoder.c - c source to a base64 encoding algorithm implementation + +This is part of the libb64 project, and has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#ifdef ESP8266 +#include +#endif + +#if defined(ESP32) +#define CORE_HAS_LIBB64 +#endif + +#ifndef CORE_HAS_LIBB64 +#include "cencode_inc.h" + +const int CHARS_PER_LINE = 72; + +void base64_init_encodestate(base64_encodestate* state_in) +{ + state_in->step = step_A; + state_in->result = 0; + state_in->stepcount = 0; +} + +char base64_encode_value(char value_in) +{ + static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + if (value_in > 63) return '='; + return encoding[(int)value_in]; +} + +int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) +{ + const char* plainchar = plaintext_in; + const char* const plaintextend = plaintext_in + length_in; + char* codechar = code_out; + char result; + char fragment; + + result = state_in->result; + + switch (state_in->step) + { + while (1) + { + case step_A: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_A; + return codechar - code_out; + } + fragment = *plainchar++; + result = (fragment & 0x0fc) >> 2; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x003) << 4; + case step_B: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_B; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0f0) >> 4; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x00f) << 2; + case step_C: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_C; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0c0) >> 6; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x03f) >> 0; + *codechar++ = base64_encode_value(result); + + ++(state_in->stepcount); + if (state_in->stepcount == CHARS_PER_LINE/4) + { + *codechar++ = '\n'; + state_in->stepcount = 0; + } + } + } + /* control should not reach here */ + return codechar - code_out; +} + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in) +{ + char* codechar = code_out; + + switch (state_in->step) + { + case step_B: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + *codechar++ = '='; + break; + case step_C: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + break; + case step_A: + break; + } + *codechar++ = 0x00; + + return codechar - code_out; +} + +#endif diff --git a/3rdparty/WebSockets/src/libb64/cencode_inc.h b/3rdparty/WebSockets/src/libb64/cencode_inc.h new file mode 100644 index 00000000..c1e3464a --- /dev/null +++ b/3rdparty/WebSockets/src/libb64/cencode_inc.h @@ -0,0 +1,31 @@ +/* +cencode.h - c header for a base64 encoding algorithm + +This is part of the libb64 project, and has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#ifndef BASE64_CENCODE_H +#define BASE64_CENCODE_H + +typedef enum +{ + step_A, step_B, step_C +} base64_encodestep; + +typedef struct +{ + base64_encodestep step; + char result; + int stepcount; +} base64_encodestate; + +void base64_init_encodestate(base64_encodestate* state_in); + +char base64_encode_value(char value_in); + +int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in); + +#endif /* BASE64_CENCODE_H */ diff --git a/3rdparty/WebSockets/src/libsha1/libsha1.c b/3rdparty/WebSockets/src/libsha1/libsha1.c new file mode 100644 index 00000000..48f4df5a --- /dev/null +++ b/3rdparty/WebSockets/src/libsha1/libsha1.c @@ -0,0 +1,202 @@ +/* from valgrind tests */ + +/* ================ sha1.c ================ */ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ +/* #define SHA1HANDSOFF * Copies data before messing with it. */ + +#if !defined(ESP8266) && !defined(ESP32) + +#define SHA1HANDSOFF + +#include +#include +#include + +#include "libsha1.h" + + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#if BYTE_ORDER == LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#elif BYTE_ORDER == BIG_ENDIAN +#define blk0(i) block->l[i] +#else +#error "Endianness not defined!" +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) +{ + uint32_t a, b, c, d, e; + typedef union { + unsigned char c[64]; + uint32_t l[16]; + } CHAR64LONG16; +#ifdef SHA1HANDSOFF + CHAR64LONG16 block[1]; /* use array to appear as a pointer */ + memcpy(block, buffer, 64); +#else + /* The following had better never be used because it causes the + * pointer-to-const buffer to be cast into a pointer to non-const. + * And the result is written through. I threw a "const" in, hoping + * this will cause a diagnostic. + */ + CHAR64LONG16* block = (const CHAR64LONG16*)buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +#ifdef SHA1HANDSOFF + memset(block, '\0', sizeof(block)); +#endif +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init(SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len) +{ + uint32_t i, j; + + j = context->count[0]; + if ((context->count[0] += len << 3) < j) + context->count[1]++; + context->count[1] += (len>>29); + j = (j >> 3) & 63; + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final(unsigned char digest[20], SHA1_CTX* context) +{ + unsigned i; + unsigned char finalcount[8]; + unsigned char c; + +#if 0 /* untested "improvement" by DHR */ + /* Convert context->count to a sequence of bytes + * in finalcount. Second element first, but + * big-endian order within element. + * But we do it all backwards. + */ + unsigned char *fcp = &finalcount[8]; + + for (i = 0; i < 2; i++) + { + uint32_t t = context->count[i]; + int j; + + for (j = 0; j < 4; t >>= 8, j++) + *--fcp = (unsigned char) t; + } +#else + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } +#endif + c = 0200; + SHA1Update(context, &c, 1); + while ((context->count[0] & 504) != 448) { + c = 0000; + SHA1Update(context, &c, 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + /* Wipe variables */ + memset(context, '\0', sizeof(*context)); + memset(&finalcount, '\0', sizeof(finalcount)); +} +/* ================ end of sha1.c ================ */ + + +#endif diff --git a/3rdparty/WebSockets/src/libsha1/libsha1.h b/3rdparty/WebSockets/src/libsha1/libsha1.h new file mode 100644 index 00000000..ee3718e1 --- /dev/null +++ b/3rdparty/WebSockets/src/libsha1/libsha1.h @@ -0,0 +1,21 @@ +/* ================ sha1.h ================ */ +/* +SHA-1 in C +By Steve Reid +100% Public Domain +*/ + +#if !defined(ESP8266) && !defined(ESP32) + +typedef struct { + uint32_t state[5]; + uint32_t count[2]; + unsigned char buffer[64]; +} SHA1_CTX; + +void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]); +void SHA1Init(SHA1_CTX* context); +void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len); +void SHA1Final(unsigned char digest[20], SHA1_CTX* context); + +#endif diff --git a/3rdparty/WebSockets/tests/webSocket.html b/3rdparty/WebSockets/tests/webSocket.html new file mode 100644 index 00000000..66a27089 --- /dev/null +++ b/3rdparty/WebSockets/tests/webSocket.html @@ -0,0 +1,49 @@ + + + + + + + +LED Control:
+
+R:
+G:
+B:
+ + \ No newline at end of file diff --git a/3rdparty/WebSockets/tests/webSocketServer/index.js b/3rdparty/WebSockets/tests/webSocketServer/index.js new file mode 100644 index 00000000..389e1930 --- /dev/null +++ b/3rdparty/WebSockets/tests/webSocketServer/index.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node +var WebSocketServer = require('websocket').server; +var http = require('http'); + +var server = http.createServer(function(request, response) { + console.log((new Date()) + ' Received request for ' + request.url); + response.writeHead(404); + response.end(); +}); +server.listen(8011, function() { + console.log((new Date()) + ' Server is listening on port 8011'); +}); + +wsServer = new WebSocketServer({ + httpServer: server, + // You should not use autoAcceptConnections for production + // applications, as it defeats all standard cross-origin protection + // facilities built into the protocol and the browser. You should + // *always* verify the connection's origin and decide whether or not + // to accept it. + autoAcceptConnections: false +}); + +function originIsAllowed(origin) { + // put logic here to detect whether the specified origin is allowed. + return true; +} + +wsServer.on('request', function(request) { + + if (!originIsAllowed(request.origin)) { + // Make sure we only accept requests from an allowed origin + request.reject(); + console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); + return; + } + + var connection = request.accept('arduino', request.origin); + console.log((new Date()) + ' Connection accepted.'); + + connection.on('message', function(message) { + if (message.type === 'utf8') { + console.log('Received Message: ' + message.utf8Data); + // connection.sendUTF(message.utf8Data); + } + else if (message.type === 'binary') { + console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); + //connection.sendBytes(message.binaryData); + } + }); + + connection.on('close', function(reasonCode, description) { + console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); + }); + + connection.sendUTF("Hallo Client!"); +}); diff --git a/3rdparty/WebSockets/tests/webSocketServer/package.json b/3rdparty/WebSockets/tests/webSocketServer/package.json new file mode 100644 index 00000000..9538323e --- /dev/null +++ b/3rdparty/WebSockets/tests/webSocketServer/package.json @@ -0,0 +1,27 @@ +{ + "name": "webSocketServer", + "version": "1.0.0", + "description": "WebSocketServer for testing", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/Links2004/arduinoWebSockets" + }, + "keywords": [ + "esp8266", + "websocket", + "arduino" + ], + "author": "Markus Sattler", + "license": "LGPLv2", + "bugs": { + "url": "https://github.com/Links2004/arduinoWebSockets/issues" + }, + "homepage": "https://github.com/Links2004/arduinoWebSockets", + "dependencies": { + "websocket": "^1.0.18" + } +} diff --git a/3rdparty/WebSockets/travis/common.sh b/3rdparty/WebSockets/travis/common.sh new file mode 100644 index 00000000..be959faf --- /dev/null +++ b/3rdparty/WebSockets/travis/common.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +function build_sketches() +{ + local arduino=$1 + local srcpath=$2 + local platform=$3 + local sketches=$(find $srcpath -name *.ino) + for sketch in $sketches; do + local sketchdir=$(dirname $sketch) + if [[ -f "$sketchdir/.$platform.skip" ]]; then + echo -e "\n\n ------------ Skipping $sketch ------------ \n\n"; + continue + fi + echo -e "\n\n ------------ Building $sketch ------------ \n\n"; + $arduino --verify $sketch; + local result=$? + if [ $result -ne 0 ]; then + echo "Build failed ($sketch) build verbose..." + $arduino --verify --verbose --preserve-temp-files $sketch + result=$? + fi + if [ $result -ne 0 ]; then + echo "Build failed ($1) $sketch" + return $result + fi + done +} + + +function get_core() +{ + echo Setup core for $1 + + cd $HOME/arduino_ide/hardware + + if [ "$1" = "esp8266" ] ; then + mkdir esp8266com + cd esp8266com + git clone https://github.com/esp8266/Arduino.git esp8266 + cd esp8266/tools + python get.py + fi + + if [ "$1" = "esp32" ] ; then + mkdir espressif + cd espressif + git clone https://github.com/espressif/arduino-esp32.git esp32 + cd esp32/tools + python get.py + fi + +} diff --git a/GBS_CONTROL.png b/GBS_CONTROL.png deleted file mode 100644 index 9759b046..00000000 Binary files a/GBS_CONTROL.png and /dev/null differ diff --git a/Images/GBS_CONTROL.png b/Images/GBS_CONTROL.png deleted file mode 100644 index 9759b046..00000000 Binary files a/Images/GBS_CONTROL.png and /dev/null differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..818433ec --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/PersWiFiManager.cpp b/PersWiFiManager.cpp new file mode 100644 index 00000000..ba1a4d09 --- /dev/null +++ b/PersWiFiManager.cpp @@ -0,0 +1,155 @@ +/* PersWiFiManager + version 3.0.1 + https://r-downing.github.io/PersWiFiManager/ + + modified for inclusion in gbs-control + see /3rdparty/PersWiFiManager/ for original code and license +*/ +#if defined(ESP8266) +#include "PersWiFiManager.h" + +// #define WIFI_HTM_PROGMEM +// #ifdef WIFI_HTM_PROGMEM +// static const char wifi_htm[] PROGMEM = R"=====( ESP WiFi

)====="; +// #endif + +extern const char* device_hostname_full; +extern const char* device_hostname_partial; + +PersWiFiManager::PersWiFiManager(AsyncWebServer& s, DNSServer& d) { + _server = &s; + _dnsServer = &d; + _apPass = ""; +} //PersWiFiManager + +bool PersWiFiManager::attemptConnection(const String& ssid, const String& pass) { + //attempt to connect to wifi + WiFi.mode(WIFI_STA); + WiFi.hostname(device_hostname_partial); // _full // before WiFi.begin(); + if (ssid.length()) { + if (pass.length()) WiFi.begin(ssid.c_str(), pass.c_str()); + else WiFi.begin(ssid.c_str()); + } else { + WiFi.begin(); + } + + //if in nonblock mode, skip this loop + _connectStartTime = millis();// + 1; + while (!_connectNonBlock && _connectStartTime) { + handleWiFi(); + delay(10); + } + + return (WiFi.status() == WL_CONNECTED); + +} //attemptConnection + +void PersWiFiManager::handleWiFi() { + if (!_connectStartTime) return; + + if (WiFi.status() == WL_CONNECTED) { + _connectStartTime = 0; + if (_connectHandler) _connectHandler(); + return; + } + + //if failed or not connected and time is up + if ((WiFi.status() == WL_CONNECT_FAILED) || ((WiFi.status() != WL_CONNECTED) && ((millis() - _connectStartTime) > (1000 * WIFI_CONNECT_TIMEOUT)))) { + startApMode(); + _connectStartTime = 0; //reset connect start time + } + +} //handleWiFi + +void PersWiFiManager::startApMode(){ + //start AP mode + IPAddress apIP(192, 168, 4, 1); + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); + _apPass.length() ? WiFi.softAP(getApSsid().c_str(), _apPass.c_str(), 11) : WiFi.softAP(getApSsid().c_str()); + + _dnsServer->stop(); + // set which return code will be used for all other domains (e.g. sending + // ServerFailure instead of NonExistentDomain will reduce number of queries + // sent by clients) + // default is DNSReplyCode::NonExistentDomain + //_dnsServer->setErrorReplyCode(DNSReplyCode::ServerFailure); + // modify TTL associated with the domain name (in seconds) // default is 60 seconds + _dnsServer->setTTL(300); // (in seconds) as per example + //_dnsServer->start((byte)53, device_hostname_full, apIP); + _dnsServer->start(53, "*", apIP); + + if (_apHandler) _apHandler(); +}//startApMode + +void PersWiFiManager::setConnectNonBlock(bool b) { + _connectNonBlock = b; +} //setConnectNonBlock + +void PersWiFiManager::setupWiFiHandlers() { + // note: removed DNS server setup here + + _server->on("/wifi/list", HTTP_GET, [](AsyncWebServerRequest* request) { + //scan for wifi networks + int n = WiFi.scanComplete(); + String s = ""; + if (n == -2) { + WiFi.scanNetworks(true); + } + else if (n) { + //build array of indices + int ix[n]; + for (int i = 0; i < n; i++) ix[i] = i; + + //sort by signal strength + for (int i = 0; i < n; i++) for (int j = 1; j < n - i; j++) if (WiFi.RSSI(ix[j]) > WiFi.RSSI(ix[j - 1])) std::swap(ix[j], ix[j - 1]); + //remove duplicates + for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (WiFi.SSID(ix[i]).equals(WiFi.SSID(ix[j])) && WiFi.encryptionType(ix[i]) == WiFi.encryptionType(ix[j])) ix[j] = -1; + + s.reserve(2050); + //build plain text string of wifi info + //format [signal%]:[encrypted 0 or 1]:SSID + for (int i = 0; i < n && s.length() < 2000; i++) { //check s.length to limit memory usage + if (ix[i] != -1) { + s += String(i ? "\n" : "") + ((constrain(WiFi.RSSI(ix[i]), -100, -50) + 100) * 2) + "," + + ((WiFi.encryptionType(ix[i]) == ENC_TYPE_NONE) ? 0 : 1) + "," + WiFi.SSID(ix[i]); + } + } + // don't cache found ssid's + WiFi.scanDelete(); + } + //send string to client + request->send(200, "text/plain", s); + }); //_server->on /wifi/list + +// #ifdef WIFI_HTM_PROGMEM +// _server->on("/wifi.htm", HTTP_GET, [](AsyncWebServerRequest* request) { +// request->send(200, "text/html", FPSTR(wifi_htm)); +// WiFi.scanNetworks(true); // early scan to have results ready on /wifi/list +// }); +// #endif + +}//setupWiFiHandlers + +bool PersWiFiManager::begin(const String& ssid, const String& pass) { + setupWiFiHandlers(); + return attemptConnection(ssid, pass); //switched order of these two for return +} //begin + +String PersWiFiManager::getApSsid() { + return _apSsid.length() ? _apSsid : "gbscontrol"; +} //getApSsid + +void PersWiFiManager::setApCredentials(const String& apSsid, const String& apPass) { + if (apSsid.length()) _apSsid = apSsid; + if (apPass.length() >= 8) _apPass = apPass; +} //setApCredentials + +void PersWiFiManager::onConnect(WiFiChangeHandlerFunction fn) { + _connectHandler = fn; +} + +void PersWiFiManager::onAp(WiFiChangeHandlerFunction fn) { + _apHandler = fn; +} +#endif diff --git a/PersWiFiManager.h b/PersWiFiManager.h new file mode 100644 index 00000000..de490963 --- /dev/null +++ b/PersWiFiManager.h @@ -0,0 +1,61 @@ +/* PersWiFiManager + version 3.0.1 + https://r-downing.github.io/PersWiFiManager/ + + modified for inclusion in gbs-control + see /3rdparty/PersWiFiManager/ for original code and license +*/ +#if defined(ESP8266) +#ifndef PERSWIFIMANAGER_H +#define PERSWIFIMANAGER_H + +#include +#include +#include +#include + +#define WIFI_CONNECT_TIMEOUT 45 + +class PersWiFiManager { + + public: + + typedef std::function WiFiChangeHandlerFunction; + + PersWiFiManager(AsyncWebServer& s, DNSServer& d); + + bool attemptConnection(const String& ssid = "", const String& pass = ""); + + void setupWiFiHandlers(); + + bool begin(const String& ssid = "", const String& pass = ""); + + String getApSsid(); + + void setApCredentials(const String& apSsid, const String& apPass = ""); + + void setConnectNonBlock(bool b); + + void handleWiFi(); + + void startApMode(); + + void onConnect(WiFiChangeHandlerFunction fn); + + void onAp(WiFiChangeHandlerFunction fn); + + private: + AsyncWebServer * _server; + DNSServer * _dnsServer; + String _apSsid, _apPass; + + bool _connectNonBlock; + unsigned long _connectStartTime; + + WiFiChangeHandlerFunction _connectHandler; + WiFiChangeHandlerFunction _apHandler; + +};//class + +#endif +#endif diff --git a/README.md b/README.md index e8f401e7..66c8828d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,7 @@ -
-
- Logo -
-
-

GBS Control

-

an alternative firmware for Tvia Trueview5725 based upscalers / video converter boards.

- Read the documentation -
-
+# gbs-control - - -## Features: +Gbscontrol is an alternative firmware for Tvia Trueview5725 based upscalers / video converter boards. +Its growing list of features includes: - very low lag - sharp and defined upscaling, comparing well to other -expensive- units - no synchronization loss switching 240p/480i (output runs independent from input, sync to display never drops) @@ -29,11 +19,16 @@ Various variations are supported, such as the PlayStation 2's VGA modes that run Gbscontrol is a continuation of previous work by dooklink, mybook4, Ian Stedman and others. -Bob from RetroRGB did an [overview video on the project](https://www.youtube.com/watch?v=fmfR0XI5czI). This is a highly recommended watch! - +Bob from RetroRGB did an overview video on the project. This is a highly recommended watch! +https://www.youtube.com/watch?v=fmfR0XI5czI -Head over to the new [documentation](https://ramapcsx2.github.io/gbs-control/) for the setup guide to learn how to build and use it! +Head over to the wiki for the setup guide to learn how to build and use it! +https://github.com/ramapcsx2/gbs-control/wiki/Build-the-Hardware Development threads: https://shmups.system11.org/viewtopic.php?f=6&t=52172 https://circuit-board.de/forum/index.php/Thread/15601-GBS-8220-Custom-Firmware-in-Arbeit/ + +If you like gbscontrol, you can now Buy me a coffeebuy me a coffee. +Cheers! :) + diff --git a/Wiki/Arcade-Boards.md b/Wiki/Arcade-Boards.md deleted file mode 100644 index 6718afcb..00000000 --- a/Wiki/Arcade-Boards.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -sort: 15 ---- - -# Arcade Boards notes - -User @tracedebrake posted some comments regarding the use of arcade boards with the GBS scaler (or any other scaler). -I've copied them here, so that arcade machine users are aware of what to look out for. - -> Hello @xuserv & @ramapcsx2! -> -> Might I ask, @xuserv, if you have done every recommanded modifications to your GBS 8200, including soldeging a 100ohm resistor from CSYNC to ground & setting all 3 RGB potentiometer to the minimum (left)? -> -> I'm asking this because normally, most arcade SuperGuns will not properly adjust your RGBS signals to be 75 ohms & 0.7v peak-to-peak levels compatible. Arcade video signals have the same timing as NTSC video but the electrical properties are different to a standard TV/video monitor. It's analog signals with TTL level amplitude (3-5 Vpp) while regular gaming consoles are made for home use so they output at 0.7v pk-to-pk for a 75ohms load (your tv) . Arcade monitors also have a very high inputs impedance to match those TTL voltage levels (1k-10k ohms). -> -> This is why the GBS8200 has a high input resistor (1k) on CSYNC; it is made for arcade use by connecting your JAMMA harness directly to the RGBS pins. -> -> By doing the recommanded mods (100ohm resistor + adjusting your pots total left (or removing them)), what you are actually doing is modifing your GBS8200 to be console compatible. If you want to use a SuperGun with a fully modified GBS8200, you need to make sure 1st that your SuperGun properly adjust the RGBS signals to TV levels using a buffer/driver, such as the HAS v3.1 -> -> This is exactly why some people blown their expensive OSSC or Framemeister; their SuperGun wasn't properly adjusting video signals. - - -> The main issues with arcade boards are this: -> -> - they never ever been designed to be played outside their cabinet -> -> - there's was no video standard. Full-scale arcades manufacturers had not only the joy to create their own board from ground up but also the one of choosing the right monitor and fine tune it accordingly. -> -> The JAMMA standard that came at the end of the 80s/early 90s was created to allow arcade center operators to use old cabinets again & again only by changing the game board, controls and cabinet side arts/marquees. But still, since no standard was ever made for video, arcade monitors had those adjustments pots mounted either at the back of the monitor or on an external harness like this one to render the monitor ''compatible'' with the new board. That was a pain to adjust right and sometimes the adjustment was buggy at best. Even the JAMMA standard itself wasn't respected for long: some games were designed to use more buttons than what the standard allowed (exemple Street Figther 2) by using dormant pins on the JAMMA connector or by adding new connectors on their boards; see kick harness. -> -> All SuperGuns try to adapt that video chaos for what a 75ohm TV needs but it doesn't mean that they are doing it right. There is mostly 3 types of SuperGuns video designs around: -> -> - Fixed resistor value: You can't just slap some resistors on the RGBS lines and attenuate them that way by hoping to create a voltage divider. RGBS output levels from arcade boards varies too much from a board to an other to use fixed values. Avoid at all cost (exemple: the horrible Vogatek.) -> -> - Potentiometers: Better than having fixed values but same as above since you don't know for sure what you're doing. Having nice colors on your TV doesn't mean that you aren't flooding your AV equipment protection diodes, if they have any. This solution will mostly kill your AV (TV, scaler) as well in the long run. To me it's an avoid at all cost as well. (exemple: the RetroElectronik Pro gamer) -> -> - Impedance matching: very high impedance, video-bandwidth amplifiers/buffers ARE NECESSARY to prevent RGB distorsion and provide a steady impedance match for 75 ohms AV inputs. Same with the sync but it needs to be buffered, attenuated and impedance matched as well. This is the only way to go. (exemple: the current HAS 3.1 (almost impossible to get), the future Sentinel and the open-source DIY Thibaut Varènes design) - -A small reiteration regarding the "RetroElectronik Pro" as referenced above - By user @cglmrfreeman ->I was using gbs-control directly with the RetroElectronik Pro Supergun and had a lot of noise in the black areas, as well as dark rolling waves across the screen when used with an HDMI converter. These flaws didn't appear using a VGA CRT monitor but I decided to do some testing anyway. Attaching the harness from the GBS unit directly to a JAMMA fingerboard resulted in significant improvements and no noise that I could make out. -> ->As the above states, there was no video standard for arcade boards, and JAMMA is nice, but if you can bypass your supergun, such as/specifically the RetroElectronik Pro, and connect directly into the GBS, I highly recommend that route. \ No newline at end of file diff --git a/Wiki/Build-the-Hardware.md b/Wiki/Build-the-Hardware.md deleted file mode 100644 index be374545..00000000 --- a/Wiki/Build-the-Hardware.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -sort: 2 ---- - -## Intro -Gbs-control is a replacement firmware for GBS8200 upscaler boards. -It runs on the popular ESP8266 microcontroller and uses the Arduino plattform. - -GBS8200 upscalers can be bought on Ebay, at prices around $20. -Ebay also has ESP8266 microcontroller boards for about $4. -The ones called "Wemos D1" or "NodeMCU" work well and are recommended. - -## Basic Install -You need the GBS upscaler, an ESP8266 board, a bit of cabling and a jumper or wire link for disabling the onboard processor, so that the ESP8266 can take over. -Power for the ESP8266 can be provided by, for example: -- using the power supply that powers the GBS > into the ESP8266 boards "Vin" (recommended, white connector next to power input) -- using the GBS regulated Vcc (3.3V) > into the ESP8266 boards "3.3V" input (not recommended, but photo below shows this) - -Connect the ESP8266 board ground to a convenient ground point on the GBS. - -Connect the two I2C bus wires (GBS side: SDA and SCL) to the ESP8266 pins of the same name. -ESP8266 boards do not have standardized pin names, but they follow some naming rules. -- most boards label SDA and SCL directly -- if they are not named (Wemos D1 Mini and many others): SCL is "D1", SDA is "D2" -- if unsure, see if you can find your ESP8266 board [here](https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/) -- GBS side SDA goes to ESP8266 side SDA, same for SCL - - - -![](https://i.imgur.com/TvSAQuX.png) - - - -- Use a jumper to bridge the 2 pins below the first programming port (see picture above) -### Connect DebugPin -To enable automatic image position and timing adjustment, the ESP8266 needs to measure some timings. -Carefully solder a wire from the pictured DebugPin to: -- Wemos D1 / NodeMCU pin "D6" -- some boards label this pin "D12" or "MISO" - -## Software setup -Next, the ESP8266 needs to be programmed. Head over to the [software setup](./Software-Setup.html) page. - -## Troubleshooting - -### No Picture -- Are SDA / SCL reversed? It's safe to reverse them and try again. -- The debug pin does not have to be connected for gbscontrol to work at a basic level. -- Forgot to install the jumper that disables the GBS original controller? -- ~100 Ohm resistor to ground on Sync-in is installed? -- when using a sync stripper: Is the LM1881 source voltage `5V`? - - - -```tip -### To Debug Issues -The Arduino IDE serial monitor shows debug information at `115200` baud. -If your ESP8266 is connected to a computer via USB, you can access this serial monitor to find out more about the issue. -In the Arduino IDE, you need to select an ESP8266 board that matches your hardware (if unsure, select "LOLIN(WEMOS) D1 R2 & mini"). -``` - - diff --git a/Wiki/ESP8266-Board-Adapter.md b/Wiki/ESP8266-Board-Adapter.md deleted file mode 100644 index a9e8c6a5..00000000 --- a/Wiki/ESP8266-Board-Adapter.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sort: 6 ---- -# ESP8266 adapter - -```warning -The adapter method places the ESP8266 very close to the TiVo5725 scaler chip, which exposes it to electromagnetic interference. -As a result, the ESP8266 can have issues with its WiFi, resulting in limited access to the web interface. -As such, I don't recommend using this adapter method. -Instead, place the ESP8266 module right next to the GBS 8200 board, near the I2C connection headers. -``` - -## Old Article - -### Overview -This is a method of mating a GBS board with a common ESP8266 development board, using a socket to attach to the original MCU. -It provides all the required signals for the ESP8266 to take over control of the scaler. - - - -![](https://i.imgur.com/fEwLqRT.png) - - - -### Grinding down stand-offs - - - -![](https://i.imgur.com/cbKwnoD.png) - - - -### Inner socket surface has to be flat and even - - - -![](https://i.imgur.com/SFFIPYm.png) - - - -### Signal Locations - - - -![](https://i.imgur.com/9DciLIe.png) - - - -### Mating Adapter with ESP8266 Dev Board - - - -![](https://i.imgur.com/1JQfn3r.png) - - diff --git a/Wiki/GBS-8200-Variants.md b/Wiki/GBS-8200-Variants.md deleted file mode 100644 index 9eabcc10..00000000 --- a/Wiki/GBS-8200-Variants.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -sort: 3 ---- - -# GBS Variations -## Yellow Button "V5.0" or "2017" -Those newer GBS-8200 boards have an LDO oscillation problem. -It works, but there will be a lot of noise in the picture. -The easy fix is to remove one SMD capacitor, circled in red. - - - -```tip -A better fix would be to replace this capacitor with an electrolytic of 22uF to 47uF. -``` - - - - - -![](https://i.imgur.com/XWDD0Ss.jpg ) - - -[Background](http://www.ti.com/product/LM1117/datasheet/application_and_implementation#snos4127440) -The chosen SMD capacitor on these boards has far too little capacitance (120nF measured) AND has very little ESR. It causes the LDO to permanently oscillate at around 20Mhz. There is an electrolytic capacitor further down the line that is sufficient for stable operation of the LDO. - -## Original GBS-8220 - -Same LDO oscillation problem, but here it is limited to setups that use a power supply of > 5.0V. -I get wild oscillation at 7.6V from a common PSOne supply. -The same C11 removal fix works here as well. - - - -![](https://ianstedman.files.wordpress.com/2014/12/gbs-8220-v3-medium.jpg) - - - -These variants also use a special video driver for the VGA output. -The driver IC has a charge pump that it uses to generate negative voltage. -This would be a useful feature for driving YPbPr signals, but here they just seem to dump the current onto the ground plane (from what I can tell at least). -That charge pump is generating noise however, and since no ferrite bead is used at location R58, a noise pattern easily develops in the image. -With a bead installed and some extra SMD capacitors, the image is fine again. - - - -![](https://i.imgur.com/UiSPbwW.jpg) - - \ No newline at end of file diff --git a/Wiki/Hardware-Mod-Library.md b/Wiki/Hardware-Mod-Library.md deleted file mode 100644 index 2731a754..00000000 --- a/Wiki/Hardware-Mod-Library.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -sort: 7 ---- - -# Hardware Mods Library - -This page lists all of the known modifications which people have attempted on the GBS82XX series boards, what they do, and if they should be performed or not. -Note that in most cases, gbscontrol will work without any of these modifications. - -|Key| | -|---|---| -| ! | Essential | -| O | Optional / Recommended | -| X | Not needed / Deprecated | - -|Mod Description | _GBS8220_|_GBS8200_ |_GBS8200(2017)_| Effect/Issue Fixed by Mod | -|----------------|----------|---------|---------------|---------------------------| -|Add 100ohm resistor across sync and ground for RGBs input | ! | ! | ! | Corrects sync level for 75 Ohm sources (such as game consoles) | -|Replace R34 with 75 Ohm resistor | O |O |O | Permanent 75 Ohm termination, instead of the mod above | -|Remove C11, optionally replace with 22uF (6.3V to 16V) electrolytic cap | O |O |O | [Stabilizes 1.8V LDO, removes noise from image](./GBS-8200-Variants.html) | -|Remove the 3 RGB potentiometers, replace with direct link | O | O | O | [Improves Colors](./RGB-Potentiometers.html) | -|Add 10uf / 22uf ceramic SMD capacitors in parallel to stock ones (x4) C23, C41(alternative: C43), C42, C48 | O |O |O | [Provide local charge reservoir to help power supply bypassing. May reduce noise and waves in the image](./Power-supply-bypass-capacitors.html) | -|Add a Sync Stripper circuit to RGBs input | O |O |O | Try this if sync is never quite stable | -|Replace R58 with 120 Ohm ferrite bead | O |X |X | For GBS8220 (2 output version); decouples charge pump | -|Add 100n cap between R59 and R58 | O |X |X | For GBS8220 (2 output version); decouples charge pump | -|Replace C33 and C35 with 1nf (1000pf) SMD capacitors (0605/0805 50V C0G) | X |X |X | [Deprecated Sync fix](./Sync-on-Green-Capacitor-Replacements.html) | -|Foil tape over digital signal lines | X |X |X | This was fixed in software (SDRAM delays) | -|Replace L1 L2 L3 with 220R 100v ferrite beads | X |X |X | Not recommended until testing has concluded | diff --git a/Wiki/Inputs.-SCART-adapter,-optional-sync-stripper.md b/Wiki/Inputs.-SCART-adapter,-optional-sync-stripper.md deleted file mode 100644 index 478d6e6e..00000000 --- a/Wiki/Inputs.-SCART-adapter,-optional-sync-stripper.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -sort: 8 ---- - -# SCART RGB to VGA adapter - -If you want to build an adapter, here is some good inspiration: https://tomdalby.com/other/gbs8200.html Use the "GBS-8200 SCART Circuit v2" picture as a guide and ignore the LM1881 chip, just connect the wires from the 8 pin JST HX connector to the female SCART socket then add the 100 Ohm resistor (if needed, see below for the details). - -The ArcadeForge Sync Strike is a solution that will work, if you don't want to build an adapter yourself. -http://arcadeforge.net/Scaler-and-Strike-Devices/Sync-Strike::15.html?language=en - - - -```note -Every GBS board comes with ~500 Ohm termination on the sync input. This termination is meant for (PC) VGA and most arcade boards. - -Csync from consoles should be fine without additional termination but the input may not behave well with other kinds of sync. - -If you want to use the RGBS input for regular video-level sync sources, the GBS requires one additional 100 Ohm resistor connected to ground from the sync input.
Together with the ~500 Ohm factory resistor, this will bring the total termination closer to TV levels (75 Ohms). -``` - -
- -## Using a Sync Stripper -Compatibility with Sync-on-Composite or Sync-on-Luma can be improved by using a sync stripper, such as the LM1881. -It is recommended that you build your circuit so that it has a 75 Ohm to ground (termination) resistor on the LM1881 video input, as well as a 470 Ohm series (attenuation) resistor on the sync output. You will no longer need the 100 ohm terminating resistor with this sync stripper built into your SCART adapter.
-The 75 Ohm resistor on the chip's input provides a properly-terminated connection for the source signal.
-The 470 Ohm series resistor on the CSync output of the LM1881 lowers the voltage to safe levels for the GBS. - -Your extracted Sync signal can now be connected to the "S" (sync input) pin of the GBS. - -User viletim shows a good LM1881 circuit here: -https://shmups.system11.org/viewtopic.php?f=6&t=55948&p=1153713#p1153713 -https://shmups.system11.org/viewtopic.php?p=1153077#p1153077 - - - -```note -Note that his circuit omits the _Rset_ resistor and capacitor. This works for CSync generation, but the VSync output will not work. This is not a problem for this application, as we are only interested in the CSync signal. - -Also note that the LM1881 requires 5V to operate, but the GBS only makes 3.3V easily available on its headers. -The 5V power for the LM1881 needs to be sourced elsewhere. The GBS board's power input may be a good option, assuming your DC power supply is decent. - -One user has successfully used the sync stripper at just 3.3V with the output 470 Ohm resistor removed. -This is not recommended though, since the LM1881 will have a hard time with some signals when undervolted like this. -``` - - diff --git a/Wiki/OLED-Add-On-Setup-Info.md b/Wiki/OLED-Add-On-Setup-Info.md deleted file mode 100644 index e5f4a4f5..00000000 --- a/Wiki/OLED-Add-On-Setup-Info.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -sort: 9 ---- - -# OLED Addon - - - -### NOTE: This OLED Add-On is completely optional to GBS-Control. If you choose not to install it, your GBS-Control board will still operate normally. - - - - - - -```warning -This addon is not meant to replace the Web UI and was/is just a means to help select the more common settings. This is still a work-in-progress to add more features in the future. -``` - - - -## Installation: -- Materials Needed: - * 1x I2C 0.96" OLED Screen - * 1x Rotary Encoder (EC11) - * 2x 0.47uF Capacitors (50V, Electrolytic) - -- Schematic: - - - -```note -This is just a general/draft "how-to" schematic. -``` - - - -![schematic_test1](https://i.imgur.com/X3MbPzX.png) - -## General Usage - -After the boot logo splash screen, you'll be presented with a simple menu system. - - - -![mainMenu](https://i.imgur.com/sI7LR1n.jpg) - - - -By rotating left or right on the encoder, the indicator will move up or down. Pressing the encoder will select the option. - (If the indicator is acting odd, you may have the CLK and DATA pins of the encoder reversed) - -Each submenu will have a _BACK_ option which upon selecting will go back to the main menu, for example: - - - -![resolutionBackEx](https://i.imgur.com/jPDNq2N.jpg) - - - -The only menu that this is slightly different is the _Current Settings_ menu. Within this menu you will be able see various specs that are currently being utilized. While in this menu press the encoder once without rotation and this will bring you back to the main menu. - - - -![currentsettingsExample](https://i.imgur.com/wPpbZNC.jpg) - - - -## Additional Information - -### OLED: -- Communication method is very important for this! Please, try to get a hold of an **I2C** not a **SPI** screen. -- At the moment, this was designed (font/text alignments) for the 0.96" variant of screens. Any other size will produce "interesting" results. -- Color configurations will be found in various listings/datasheets for screens (BLUE,BLUE/YELLOW,WHITE). While any color configuration will work, it's recommended to stick to a single color option to achieve a cleaner look. Case in point shown below. - - - -![dcbootExample](https://i.imgur.com/cBahzGe.jpg) - - - -### Rotary Encoders: -- This type of encoder has many applications and benefits to its design. However, one major downside is that it tends to be a _noisy_ device. Along with the ISR and filter the goal is to not have many wrong inputs occur while rotation or selection. -- Any general EC11 model of encoder will work. Pretty much "EC11 Rotary Encoder" on Amazon/Ebay will yield the correct results. It's a fairly inexpensive and common part -- Breakout board versions of this part should work, but isn't entirely recommended. Mainly coming down to cost and the fact that there could be many variations of said breakout boards out there. Meaning, potentially differing resistor/capacitor values for the filtering circuit. This *could* lead to disruption of the ISR. Tests were done to ensure the capacitors/resistors worked well together with the ISR. If you choose to use a breakout then omit the capacitors and pull-up resistors. diff --git a/Wiki/Power-supply-bypass-capacitors.md b/Wiki/Power-supply-bypass-capacitors.md deleted file mode 100644 index 23750eae..00000000 --- a/Wiki/Power-supply-bypass-capacitors.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -sort: 10 ---- -# Power Supply Bypass capacitors - -One recommended modification to the stock GBS board is to add more capacitance for power supply bypassing. -This step can reduce some forms of visible noise. - -Forum post: https://shmups.system11.org/viewtopic.php?p=1349983#p1349983 -> Let's settle on 10uF for the large local storage caps, as more capacity seems to be at the upper end of current market offers. -> We want as high a voltage rating as possible, but that increases size. We want to limit size to 0805, so they can still be soldered besides the 0603 stocks. -> Ebay has some cheap listings for: -> 0805: 10V -> 0603: 6.3V -> Actual voltages are 3.3V for the main supply (C23 C41 C48), and 1.8V for the digital supply (C42). - -Examples of capacitors installed in parallel: - - - -![](https://i.imgur.com/nfrRZc6.jpg) - - - - -![](https://i.imgur.com/DVQ0Wkz.jpg) - - \ No newline at end of file diff --git a/Wiki/README.md b/Wiki/README.md deleted file mode 100644 index c8892e96..00000000 --- a/Wiki/README.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -sort: 1 ---- - - -# Welcome to the gbs-control wiki! - - - -{% include list.liquid all=true %} - - \ No newline at end of file diff --git a/Wiki/RGB-Potentiometers.md b/Wiki/RGB-Potentiometers.md deleted file mode 100644 index d0466232..00000000 --- a/Wiki/RGB-Potentiometers.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -sort: 4 ---- - -## RGB Potentiometers - -Please turn these 3 potentiometers all the way to the left. This adjusts the colors to the correct level. - - - -![](https://i.imgur.com/v4gr9AJ.jpg) - - - -The potentiometers should ideally be removed and their old inputs / outputs be bridged. -This would correct the RGB termination resistance to the TV standard `75` Ohm. - -With the potentiometers in the path, that termination is closer to `65` Ohm, which results in a slightly darker picture. -Removing these can be tricky though, since you can't reach the pins with a clipper. Desoldering is recommended. - - - -```note -This is not a necessary modification though. The brightness can be corrected with the software or on the display. -``` - - - -Here is how the connections can be bridged: - - - -![](https://i.imgur.com/nwfQQs7.jpg) - - \ No newline at end of file diff --git a/Wiki/Si5351-Clock-Generator-install-notes.md b/Wiki/Si5351-Clock-Generator-install-notes.md deleted file mode 100644 index 8e11f68f..00000000 --- a/Wiki/Si5351-Clock-Generator-install-notes.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sort: 5 ---- - -# Si5351 Clock Generator install notes - -The Si5351 Clock Generator board is controlled by I2C to output precise frequencies from <8KHz up to 150+ MHz. Input VCC is 3-5v and output is 3vpp. The GBS-Control firmware automatically supports this board when installed as follows: - -Solder a wire from the centre pad of CLK0 to TrueView pin `40` (PCLKIN). Check for continuity and resistance. Remember only the centre pad for `CLK0` is for signal. In my board I have used prepared AWG32 enamelled copper wire. - -With the scaler board oriented with text facing you, the left side of either C47 or C48 can be used for ground when soldered to the first or third pad of CLK2. I used AWG30 Kynar with the smallest amount of exposed wire, flux and a small amount solder. - -For powering the clock gen, solder a wire from the positive side of either C47 or C48 to the unlabelled capacitor shown on the clock gen board. It is most likely a filtering capacitor for the clock’s LDO 3.3v output. Again I have used AWG30 Kynar wire and clear varnish for fixation to the PCB. - -The Myson Controller (MTV230) is connected via -- Pin `25` (P1.0) to Si5351 `SCL` -- Pin `26` (P1.1) to Si5351 `SDA` - -This can be achieved by soldering directly to each controller IC leg as shown. -Alternatively one use the output side (right) of **R10 for SCL** and **R37 for SDA**. Add strain relief or fixation. - -You can solder these wires directly to the same SDA/SCL lines on the ESP8266 too. - -To test the clock generator is working, open the GBS Control web gui. Go to Preferences and scroll down to Activate FrameTime lock. Press on the FrameTime Lock button and the console will read “Active FrameTime Lock not necessary with external clock gen installed”. Video output should be pristine and free of horizontal tearing when high output resolution presets are used. - - - -![Closeup of installed clock gen to GBS8200](https://i.imgur.com/bAtlD6Ah.jpg) - - - - - -```tip -If you don't want to place the clock generator to the heat sink, then you can alternatively place it to where the potentiometers used to be. If you do the bridges on the bottom of the GBS board, then this leaves you with some blank space where you can attach the clock generator. - -You have to use a small piece of insulating material (I used 2mm and 0.5mm FR4 which is the material circuit boards are made from but without any copper on it) to raise the clock generator up a bit. And preferably use double sided tape for mounting as this can be removed if you have to for any reason. If you remove a little bit of the clock generator board to make it shift closer to pin 40 of the TrueView IC, then the "GND" pad of the clock generator actually matches a GND pad on the GBS board which allows to connect GND by just sticking a wire through both boards. This provides good, low impedance, ground coupling between the two boards. - -This is more a technique for advanced builders. If you don't have the right tools, then it is OK if you place the board to the top of the heatsink. - -![Closeup of the clock gen placed to the potentiometer location](https://user-images.githubusercontent.com/3519517/159733516-bcff58ba-ffef-4f89-9cb6-ce31d48bca01.jpg) - -``` - - \ No newline at end of file diff --git a/Wiki/Software-Setup.md b/Wiki/Software-Setup.md deleted file mode 100644 index 7db192f7..00000000 --- a/Wiki/Software-Setup.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -sort: 11 ---- - -# Software Setup - -## Arduino Software (tested with 1.8.11) -Download and install the [Arduino software (IDE)](https://www.arduino.cc/en/Main/Software) - -## ESP8266 support for Arduino IDE -In the Arduino IDE open the preferences dialog and enter the following URL as "Additional Boards Manger URL": -http://arduino.esp8266.com/stable/package_esp8266com_index.json - - - -![Preferences](https://i.imgur.com/rFCvLxl.png) - - - -Go to __Tools__ > __Board:__ > __Boards Manager ...__, search for "esp8266" and install "esp8266 by ESP8266 Community", -version 2.6.3 - - - -```warning -Do not use version `3.0.0` or newer, it is reported to break things!: -``` - - - - - -![Preferences](https://i.imgur.com/i6XGPwl.png) - - - -Now go to __Tools__ > __Board:__ and choose your ESP8266 board. - - - -```note -If you aren't sure which board you have, select "LOLIN(WEMOS) D1 R2 & mini". -``` - - - -Set CPU frequency to 160 MHz and Flash size to "4MB (FS:1MB OTA:~1019KB)". - -```danger -(Don't skip this step, or you won't be able to save custom configurations later.) -``` - -Set the `IwIP Variant` to `v2 Lower Memory`. -Plug your board into a free USB port on your PC and select the detected COM port in the Arduino IDE. - -### ESP8266 IDE Settings - - - -![ESP8266 IDE Settings](https://i.imgur.com/yQkbbn1.png) - - - -## Used Libraries - -### ESPAsyncTCP and ESPAsyncWebServer by me-no-dev - -Download these 2 libraries from Github (Button that looks like this ) and extract to Arduino libraries folder. -(On Windows: "Documents\Arduino\libraries" or full path: "C:\Users\rama\Documents\Arduino\libraries") - -https://github.com/me-no-dev/ESPAsyncTCP -https://github.com/me-no-dev/ESPAsyncWebServer - -Direct Downloads: - - - -### OLED Add-on Library - - - -```note -The OLED functionality is _completely_ optional for GBS-Control. However, the OLED driver library is still needed for compilation. You can install it via the Arduino Library Manager like the previous libraries mentioned. -``` - - - -__Sketch__ > __Include Library__ > __Manage Libraries__ > "ESP8266 and ESP32 OLED driver for SSD1306 displays" - -https://github.com/ThingPulse/esp8266-oled-ssd1306 - -Direct Download: - - -esp8266 oled ssd1306 - - - -![Libraries](https://i.imgur.com/BR2olsh.png) - - - - -### Optional Libraries -Go to __Sketch__ > __Include Library__ > __Manage Libraries ...__ and install the following libraries by searching for them and installing: - -#### ESP8266-ping - -> by @bluemurder (used to debug WiFi connection issues, have the ESP8266 ping your router) - - https://github.com/bluemurder/ESP8266-ping - -Direct Download: - - -ESP8266 ping - -## Download gbs-control, Compile and Upload -- download the current master .zip (https://github.com/ramapcsx2/gbs-control/archive/master.zip) -- (alternative): if using a Git client, checkout gbs-control (https://github.com/ramapcsx2/gbs-control.git) -Extract the zip archive and rename the folder to "gbs-control" (removing "-master"). -- start the Arduino IDE by opening gbs-control.ino - -You should be able to build the software by choosing __Sketch__ > __Verify / Compile__ (or clicking the tick mark in the tool bar). - -With the ESP8266 board connected to your computer, and the correct COM port selected, you can now upload the software. -Do this via __Sketch__ > __Upload__ (hit "Ctrl + U" or by clicking the right arrow in the tool bar). -(This could take a while for the first compilation.) - -## Accessing the web based control panel -Gbscontrol offers several options, all via an interactive web page that is served from the ESP8266 via WiFi. -Here is how you access this control panel in the default AP (Access Point) mode: - -* Start up your ESP8266, the LED on the module should come on -* The ESP8266 opens up a new WiFi Network with the name `gbscontrol` -* Connect your PC or Smartphone to the gbscontrol network (default password: `qqqqqqqq`) -* Open http://gbscontrol (or http://gbscontrol:80) (or http://gbscontrol.local) in a browser - -The control panel should load. - -## Connecting to your WiFi (optional) -The next step is to connect the ESP8266 to your home network. - -* Click on the System tab and then on "Connect to WiFi Network" -* Enter your home network SSID (you can scan for it) + password -* Click "Connect" -* The ESP8266 restarts now, so you will see an error page on your device. This is okay! -* Wait for about a minute, then the web UI will be reachable in your local network via: - - IP (have a look at the debug output in the Arduino software) - - address "http://gbscontrol.local" (requires mDNS support from the operating system, sometimes the router provides support) - - address "http://gbscontrol:80", "http://gbscontrol" or just "gbscontrol" - - - -```note -The ESP8266 remembers this network, so it will always try to connect to this network first. -If it can't connect, it will revert to AP mode. -``` - - - -### Remove WiFi settings - -If you ever want to delete the network information, you can do so by uploading the sketch in the -"Erase Flash:" > "Sketch + WiFi Settings" mode: - - - -![ESP8266 Wipe WiFi](https://i.imgur.com/QlyWocy.png) - - - -That's it! -Head over to the other Wiki pages if you want further information. - -This setup guide has been lifted with permission from @toblum and his nice McLighting project ;) -https://github.com/toblum/McLighting/ diff --git a/Wiki/Sync-on-Green-Capacitor-Replacements.md b/Wiki/Sync-on-Green-Capacitor-Replacements.md deleted file mode 100644 index b259ed00..00000000 --- a/Wiki/Sync-on-Green-Capacitor-Replacements.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sort: 17 ---- - -# Sync-On-Green Capacitors replacements - - - -```warning -This modification is not required anymore. -Gbscontrol now uses an undocumented clamping level bit to work well with the default capacitors. -It isn't necessary to do this modification anymore, but you can still do it and improve sync performance. -``` - - - -Sync pulses for RGBS and Component Video sources are AC coupled to the TV5725 scaler IC. -The GBS8200 board designs (all variants I know of) don't follow the TV5725 datasheet for these "SOG" coupling capacitors. -The value for "C33" and "C35" should be 1nF (1000pF). Instead, the installed capacitors have a value of 100nF. - -Due to the high capacitance, the SOG extraction circuit in the 5725 sees too much of any eventual video content, instead of just the synchronization pulses. -This leads to frequent short sync losses when the picture content changes rapidly, for example on a flashing screen. - -Previously, it was recommended to use a Sync Stripper circuit to address the dropouts. -It is better to replace C33 and C35 with 1nF parts, thus allowing the SOG separation circuit to do the job it was designed to do. -Due to the densely populated work area, good soldering equipment and a little experience is required. -For the capacitors, I recommend looking for 1nF SMD NP0 (or X7R) parts. Sizes of "0805" or "0603" will fit well. - - - -![](https://i.imgur.com/hgpaVER.png) - - - - -![](https://i.imgur.com/S2jw69Q.jpg) - - diff --git a/Wiki/Tested-video-modes.md b/Wiki/Tested-video-modes.md deleted file mode 100644 index e5187dd7..00000000 --- a/Wiki/Tested-video-modes.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -sort: 16 ---- - -# Tested Video Modes - - - -* [Atari ST family](atari-st-family) -* [IBM PC and compatibles](ibm-pc-and-compatibles) -* [Macintosh](macintosh) - - - -## Atari ST family -| Input | Graphics chip | Mode no | Type | Resolution | Refresh (V) | Refresh (H) | Works | Comments | -|-------|---------------|---------|------|------------|---------------|-------------|-------|------------| -| VGA | Shifter | Low | RGB | 320x200 | 50 Hz / 60 Hz | 15.75 KHz | YES | Jumps on STFM, works on Mega ST and STE ([#198](https://github.com/ramapcsx2/gbs-control/issues/198)) | -| VGA | Shifter | Medium | RGB | 640x200 | 50 Hz / 60 Hz | 15.75 KHz | YES | Tested on STE | -| VGA | Shifter | High | RGB | 640x400 | 72 Hz | 31.50 KHz | NO | Stops working after a few seconds ([#190](https://github.com/ramapcsx2/gbs-control/issues/190)) | - -## IBM PC and compatibles - -| Input | Graphics chip | Mode no | Type | Resolution | Refresh (V) | Refresh (H) | Works | Comments | -|-------|---------------|---------|------|------------|-------------|-------------|-------|------------| -| VGA | ATi Mach 64 | 00h | VGA | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 01h | BIOS | 320x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 01h | VGA | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 02h | BIOS | 640x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 03h | BIOS | 640x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 03h | VGA | 640x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 04h | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 05h | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 06h | BIOS | 640x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 07h | BIOS | 640x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 07h | VGA | 720x350 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 0Dh | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 0Eh | BIOS | 640x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 0Fh | BIOS | 640x350 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 10h | BIOS | 640x350 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 11h | BIOS | 640x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 12h | BIOS | 640x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 13h | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 14h | BIOS | 160x120 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 15h | BIOS | 256x256 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 16h | BIOS | 296x220 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 17h | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 18h | BIOS | 320x240 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 1Ah | VGA | 640x350 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 19h | BIOS | 320x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 1Ah | BIOS | 360x270 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 1Bh | BIOS | 360x360 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 1Bh | VGA | 720x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 1Ch | BIOS | 360x480 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 1Ch | VGA | 720x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 1Dh | BIOS | 400x300 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 1Dh | VGA | 640x480 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 1Eh | VGA | 640x480 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 1Fh | VGA | 640x480 | ????? | ????? | YES | Cut | -| VGA | ATi Mach 64 | 21h | BIOS | 800x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 22h | BIOS | 800x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 23h | BIOS | 1056x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 32h | BIOS | 1056x344 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 33h | BIOS | 1056x352 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 40h | BIOS | 512x384 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 41h | BIOS | 512x384 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 42h | BIOS | 400x300 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 43h | BIOS | 400x300 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 44h | BIOS | 640x350 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 45h | BIOS | 640x350 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 57h | BIOS | 640x350 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 58h | BIOS | 320x200 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 59h | BIOS | 320x240 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Ah | BIOS | 512x384 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Bh | BIOS | 400x300 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Ch | BIOS | 640x480 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Dh | BIOS | 800x600 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Eh | BIOS | 1024x768 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 5Fh | BIOS | 1280x1024 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 60h | BIOS | 320x200 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 61h | BIOS | 640x400 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 62h | BIOS | 640x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 63h | BIOS | 800x600 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 64h | BIOS | 1024x768 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 65h | BIOS | 1280x1024 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 6Bh | BIOS | 320x240 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 6Dh | BIOS | 512x384 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 6Eh | BIOS | 400x300 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 6Fh | BIOS | 640x350 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 70h | BIOS | 320x200 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 71h | BIOS | 640x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 72h | BIOS | 640x480 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 73h | BIOS | 800x600 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 74h | BIOS | 800x600 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 75h | BIOS | 1024x768 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 76h | BIOS | 1024x768 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 77h | BIOS | 1280x1024 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 78h | BIOS | 1280x1024 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 79h | BIOS | 320x240 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 7Ah | BIOS | 320x200 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 7Bh | BIOS | 320x240 | ????? | ????? | YES | | -| VGA | ATi Mach 64 | 97h | VGA | 720x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | A1h | VGA | 320x240 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | A3h | VGA | 640x350 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | C1h | VGA | 360x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | C3h | VGA | 720x400 | ????? | ????? | NO | | -| VGA | ATi Mach 64 | 100h | VESA | 640x400 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 101h | VESA | 640x480 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 103h | VESA | 800x600 | 56 Hz | ????? | YES | Misaligned | -| VGA | ATi Mach 64 | 105h | VESA | 1024x768 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 107h | VESA | 1280x1024 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 10Dh | VESA | 320x200 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 10Eh | VESA | 320x200 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 10Fh | VESA | 320x200 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 110h | VESA | 640x480 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 111h | VESA | 640x480 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 112h | VESA | 640x480 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 113h | VESA | 800x600 | 56 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 114h | VESA | 800x600 | 56 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 115h | VESA | 800x600 | 56 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 116h | VESA | 1024x768 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 117h | VESA | 1024x768 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 118h | VESA | 1024x768 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 119h | VESA | 1280x1024 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 11Ah | VESA | 1280x1024 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 11Bh | VESA | 1280x1024 | 87 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 202h | VESA | 320x200 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 212h | VESA | 320x240 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 213h | VESA | 320x240 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 214h | VESA | 320x240 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 215h | VESA | 320x240 | 60 Hz | ????? | YES | | -| VGA | ATi Mach 64 | 222h | VESA | 512x384 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 223h | VESA | 512x384 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 224h | VESA | 512x384 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 225h | VESA | 512x384 | 70 Hz | ????? | NO | | -| VGA | ATi Mach 64 | 232h | VESA | 400x300 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 233h | VESA | 400x300 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 234h | VESA | 400x300 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 235h | VESA | 400x300 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 242h | VESA | 640x350 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 243h | VESA | 640x350 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 244h | VESA | 640x350 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 245h | VESA | 640x350 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 302h | VESA | 1600x1200 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 303h | VESA | 1600x1200 | ????? | ????? | ??? | | -| VGA | ATi Mach 64 | 304h | VESA | 1600x1200 | ????? | ????? | ??? | | - -## Macintosh - -| Input | Graphics chip | Mode no | Type | Resolution | Refresh (V) | Refresh (H) | Works | Comments | -|-------|---------------|---------|------|------------|-------------|-------------|-------|------------| -| VGA | N/A | ???? | ???? | 512×342 | 60.15Hz | 22.25KHz | YES* | Tested with a Power R Model 2703 on a Mac SE. *Right side shows a big vertical green bar instead of proper output. Similar [adapter](http://www.waveguide.se/?article=compact-mac-video-adapter) to output video from Macintosh SE. | - -* BIOS means the video mode is set up using INT 10h to call the VGA BIOS -* VGA means the video card registers are changed directly bypassing the BIOS -* VESA means the video mode is set up using INT 10h to call the VESA BIOS EXTENSIONS -* BIOS and VGA modes are expected to always produce the same refresh rates, VESA modes can change the rate diff --git a/Wiki/Web-GUI.md b/Wiki/Web-GUI.md deleted file mode 100644 index e149a0b5..00000000 --- a/Wiki/Web-GUI.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -sort: 13 ---- - -# WEB GUI - - - -![](https://i.imgur.com/qOB5HGb.png) - - - - - -![](https://i.imgur.com/ilz2Ai6.png) - - - - - -![](https://i.imgur.com/l8xbGs4.png) - - - - - -![](https://i.imgur.com/1ZwoSBO.png) - - - - - -![](https://i.imgur.com/bHfSqZF.png) - - - - - -![](https://i.imgur.com/ErzcD8g.png) - - - - - -![](https://i.imgur.com/7IaA4VE.png) - - \ No newline at end of file diff --git a/Wiki/Web-UI-Development.md b/Wiki/Web-UI-Development.md deleted file mode 100644 index 10bdb728..00000000 --- a/Wiki/Web-UI-Development.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -sort: 14 ---- - -# WEB UI Development - -See: https://github.com/ramapcsx2/gbs-control/tree/master/public - diff --git a/Wiki/various-notes.md b/Wiki/various-notes.md deleted file mode 100644 index 9b175563..00000000 --- a/Wiki/various-notes.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -sort: 12 ---- - -# Various Notes - -## ESP8266 WiFi connection - -Wow, the ESP8266 WiFi connection issues are weird. -Stabilizing the power supply, using short wires, fiddling with delay() and yield(), nothing brought better signal stability. - -But while doing some testing, I switched my source from NTSC to PAL. -That instantly brought the signal back and pings came through regularly. - -### Long story short -The 5725 horizontal PLL (pixel clock recovery from HSync) can lock into a frequency that disturbs the WiFi signal! -It's in such a narrow range that changing the PLL divider by a few ticks fixes it. - -#### Quick Fix -* Change the router WiFi channel (switching to channel 6 or 11 helps in my case) - -#### Better Fix -* Modify the PCB antenna to increase signal reception (Example: https://www.instructables.com/id/Enhanced-NRF24L01/) -* Move the ESP8266 board away from the GBS scaler chip (heatsink) as much as possible diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 74a68b3f..00000000 --- a/_config.yml +++ /dev/null @@ -1,31 +0,0 @@ -title: GBS Control -description: alternative firmware for Tvia Trueview5725 based upscalers -markdown: GFM -remote_theme: rundocs/jekyll-rtd-theme -# debug: -# compress: true -# dist: false -# shortcodes: true - -readme_index: - with_frontmatter: true - -plugins: - - jemoji - - jekyll-avatar - - jekyll-mentions - - jekyll-remote-theme - -exclude: - - Makefile - - CNAME - - LICENSE - - update.sh - - Gemfile - - Gemfile.lock - - requirements.txt - - node_modules - - package.json - - package-lock.json - - webpack.config.js - - jekyll-rtd-theme.gemspec diff --git a/_includes/templates/addons.liquid b/_includes/templates/addons.liquid deleted file mode 100644 index 92989feb..00000000 --- a/_includes/templates/addons.liquid +++ /dev/null @@ -1,43 +0,0 @@ -
-
-
- {{ site.title }} -
-
- - {{ docs.source.branch }} - - -
-
- -
diff --git a/fastpin.h b/fastpin.h new file mode 100644 index 00000000..81d4f0dd --- /dev/null +++ b/fastpin.h @@ -0,0 +1,16 @@ +#ifndef FASTPIN_H_ +#define FASTPIN_H_ + +#include + +static inline uint8_t volatile* portToInput(uint8_t port) { + return reinterpret_cast(port_to_input_PGM[port]); +} + +template +static inline bool fastRead() { + return (*portToInput(digital_pin_to_port_PGM[Pin]) & + digital_pin_to_bit_mask_PGM[Pin]); +} + +#endif diff --git a/fonts.h b/fonts.h new file mode 100644 index 00000000..c2b6586e --- /dev/null +++ b/fonts.h @@ -0,0 +1,2187 @@ +const uint8_t URW_Gothic_L_Book_14[] PROGMEM = { + 0x10, // Width: 16 + 0x12, // Height: 18 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x04, // 32:65535 + 0x00, 0x00, 0x08, 0x04, // 33:0 + 0x00, 0x08, 0x07, 0x04, // 34:8 + 0x00, 0x0F, 0x16, 0x08, // 35:15 + 0x00, 0x25, 0x14, 0x08, // 36:37 + 0x00, 0x39, 0x20, 0x0B, // 37:57 + 0x00, 0x59, 0x1D, 0x0B, // 38:89 + 0x00, 0x76, 0x04, 0x03, // 39:118 + 0x00, 0x7A, 0x0E, 0x05, // 40:122 + 0x00, 0x88, 0x0B, 0x05, // 41:136 + 0x00, 0x93, 0x0D, 0x06, // 42:147 + 0x00, 0xA0, 0x17, 0x08, // 43:160 + 0x00, 0xB7, 0x08, 0x04, // 44:183 + 0x00, 0xBF, 0x0B, 0x05, // 45:191 + 0x00, 0xCA, 0x05, 0x04, // 46:202 + 0x00, 0xCF, 0x0D, 0x06, // 47:207 + 0x00, 0xDC, 0x14, 0x08, // 48:220 + 0x00, 0xF0, 0x0E, 0x08, // 49:240 + 0x00, 0xFE, 0x14, 0x08, // 50:254 + 0x01, 0x12, 0x14, 0x08, // 51:274 + 0x01, 0x26, 0x14, 0x08, // 52:294 + 0x01, 0x3A, 0x14, 0x08, // 53:314 + 0x01, 0x4E, 0x14, 0x08, // 54:334 + 0x01, 0x62, 0x13, 0x08, // 55:354 + 0x01, 0x75, 0x14, 0x08, // 56:373 + 0x01, 0x89, 0x14, 0x08, // 57:393 + 0x01, 0x9D, 0x05, 0x04, // 58:413 + 0x01, 0xA2, 0x08, 0x04, // 59:418 + 0x01, 0xAA, 0x17, 0x08, // 60:426 + 0x01, 0xC1, 0x17, 0x08, // 61:449 + 0x01, 0xD8, 0x17, 0x08, // 62:472 + 0x01, 0xEF, 0x13, 0x08, // 63:495 + 0x02, 0x02, 0x20, 0x0C, // 64:514 + 0x02, 0x22, 0x1D, 0x0A, // 65:546 + 0x02, 0x3F, 0x17, 0x08, // 66:575 + 0x02, 0x56, 0x20, 0x0B, // 67:598 + 0x02, 0x76, 0x1D, 0x0A, // 68:630 + 0x02, 0x93, 0x14, 0x08, // 69:659 + 0x02, 0xA7, 0x11, 0x07, // 70:679 + 0x02, 0xB8, 0x23, 0x0C, // 71:696 + 0x02, 0xDB, 0x17, 0x0A, // 72:731 + 0x02, 0xF2, 0x05, 0x03, // 73:754 + 0x02, 0xF7, 0x11, 0x07, // 74:759 + 0x03, 0x08, 0x17, 0x08, // 75:776 + 0x03, 0x1F, 0x11, 0x06, // 76:799 + 0x03, 0x30, 0x23, 0x0D, // 77:816 + 0x03, 0x53, 0x1A, 0x0A, // 78:851 + 0x03, 0x6D, 0x23, 0x0C, // 79:877 + 0x03, 0x90, 0x17, 0x08, // 80:912 + 0x03, 0xA7, 0x23, 0x0C, // 81:935 + 0x03, 0xCA, 0x17, 0x09, // 82:970 + 0x03, 0xE1, 0x14, 0x07, // 83:993 + 0x03, 0xF5, 0x0D, 0x06, // 84:1013 + 0x04, 0x02, 0x17, 0x09, // 85:1026 + 0x04, 0x19, 0x19, 0x0A, // 86:1049 + 0x04, 0x32, 0x25, 0x0D, // 87:1074 + 0x04, 0x57, 0x17, 0x09, // 88:1111 + 0x04, 0x6E, 0x16, 0x08, // 89:1134 + 0x04, 0x84, 0x14, 0x07, // 90:1156 + 0x04, 0x98, 0x0E, 0x05, // 91:1176 + 0x04, 0xA6, 0x11, 0x08, // 92:1190 + 0x04, 0xB7, 0x08, 0x05, // 93:1207 + 0x04, 0xBF, 0x17, 0x08, // 94:1215 + 0x04, 0xD6, 0x14, 0x07, // 95:1238 + 0x04, 0xEA, 0x0A, 0x05, // 96:1258 + 0x04, 0xF4, 0x1A, 0x0A, // 97:1268 + 0x05, 0x0E, 0x1A, 0x0A, // 98:1294 + 0x05, 0x28, 0x1A, 0x09, // 99:1320 + 0x05, 0x42, 0x1A, 0x0A, // 100:1346 + 0x05, 0x5C, 0x1A, 0x09, // 101:1372 + 0x05, 0x76, 0x0A, 0x04, // 102:1398 + 0x05, 0x80, 0x1A, 0x09, // 103:1408 + 0x05, 0x9A, 0x17, 0x09, // 104:1434 + 0x05, 0xB1, 0x05, 0x03, // 105:1457 + 0x05, 0xB6, 0x05, 0x03, // 106:1462 + 0x05, 0xBB, 0x14, 0x07, // 107:1467 + 0x05, 0xCF, 0x05, 0x03, // 108:1487 + 0x05, 0xD4, 0x23, 0x0D, // 109:1492 + 0x05, 0xF7, 0x17, 0x09, // 110:1527 + 0x06, 0x0E, 0x1A, 0x09, // 111:1550 + 0x06, 0x28, 0x1A, 0x0A, // 112:1576 + 0x06, 0x42, 0x1B, 0x0A, // 113:1602 + 0x06, 0x5D, 0x0A, 0x04, // 114:1629 + 0x06, 0x67, 0x0E, 0x05, // 115:1639 + 0x06, 0x75, 0x0D, 0x05, // 116:1653 + 0x06, 0x82, 0x17, 0x09, // 117:1666 + 0x06, 0x99, 0x14, 0x08, // 118:1689 + 0x06, 0xAD, 0x20, 0x0C, // 119:1709 + 0x06, 0xCD, 0x11, 0x07, // 120:1741 + 0x06, 0xDE, 0x13, 0x08, // 121:1758 + 0x06, 0xF1, 0x11, 0x06, // 122:1777 + 0x07, 0x02, 0x0B, 0x05, // 123:1794 + 0x07, 0x0D, 0x0E, 0x09, // 124:1805 + 0x07, 0x1B, 0x0B, 0x05, // 125:1819 + 0x07, 0x26, 0x17, 0x08, // 126:1830 + 0xFF, 0xFF, 0x00, 0x07, // 127:65535 + 0xFF, 0xFF, 0x00, 0x07, // 128:65535 + 0xFF, 0xFF, 0x00, 0x07, // 129:65535 + 0xFF, 0xFF, 0x00, 0x07, // 130:65535 + 0xFF, 0xFF, 0x00, 0x07, // 131:65535 + 0xFF, 0xFF, 0x00, 0x07, // 132:65535 + 0xFF, 0xFF, 0x00, 0x07, // 133:65535 + 0xFF, 0xFF, 0x00, 0x07, // 134:65535 + 0xFF, 0xFF, 0x00, 0x07, // 135:65535 + 0xFF, 0xFF, 0x00, 0x07, // 136:65535 + 0xFF, 0xFF, 0x00, 0x07, // 137:65535 + 0xFF, 0xFF, 0x00, 0x07, // 138:65535 + 0xFF, 0xFF, 0x00, 0x07, // 139:65535 + 0xFF, 0xFF, 0x00, 0x07, // 140:65535 + 0xFF, 0xFF, 0x00, 0x07, // 141:65535 + 0xFF, 0xFF, 0x00, 0x07, // 142:65535 + 0xFF, 0xFF, 0x00, 0x07, // 143:65535 + 0xFF, 0xFF, 0x00, 0x07, // 144:65535 + 0xFF, 0xFF, 0x00, 0x07, // 145:65535 + 0xFF, 0xFF, 0x00, 0x07, // 146:65535 + 0xFF, 0xFF, 0x00, 0x07, // 147:65535 + 0xFF, 0xFF, 0x00, 0x07, // 148:65535 + 0xFF, 0xFF, 0x00, 0x07, // 149:65535 + 0xFF, 0xFF, 0x00, 0x07, // 150:65535 + 0xFF, 0xFF, 0x00, 0x07, // 151:65535 + 0xFF, 0xFF, 0x00, 0x07, // 152:65535 + 0xFF, 0xFF, 0x00, 0x07, // 153:65535 + 0xFF, 0xFF, 0x00, 0x07, // 154:65535 + 0xFF, 0xFF, 0x00, 0x07, // 155:65535 + 0xFF, 0xFF, 0x00, 0x07, // 156:65535 + 0xFF, 0xFF, 0x00, 0x07, // 157:65535 + 0xFF, 0xFF, 0x00, 0x07, // 158:65535 + 0xFF, 0xFF, 0x00, 0x07, // 159:65535 + 0xFF, 0xFF, 0x00, 0x04, // 160:65535 + 0x07, 0x3D, 0x09, 0x04, // 161:1853 + 0x07, 0x46, 0x14, 0x08, // 162:1862 + 0x07, 0x5A, 0x17, 0x08, // 163:1882 + 0x07, 0x71, 0x14, 0x08, // 164:1905 + 0x07, 0x85, 0x17, 0x08, // 165:1925 + 0x07, 0x9C, 0x0E, 0x09, // 166:1948 + 0x07, 0xAA, 0x14, 0x09, // 167:1962 + 0x07, 0xBE, 0x0A, 0x05, // 168:1982 + 0x07, 0xC8, 0x1D, 0x0A, // 169:1992 + 0x07, 0xE5, 0x0E, 0x05, // 170:2021 + 0x07, 0xF3, 0x0E, 0x06, // 171:2035 + 0x08, 0x01, 0x17, 0x08, // 172:2049 + 0x08, 0x18, 0x0B, 0x05, // 173:2072 + 0x08, 0x23, 0x1D, 0x0A, // 174:2083 + 0x08, 0x40, 0x10, 0x07, // 175:2112 + 0x08, 0x50, 0x0D, 0x06, // 176:2128 + 0x08, 0x5D, 0x17, 0x08, // 177:2141 + 0x08, 0x74, 0x0E, 0x05, // 178:2164 + 0x08, 0x82, 0x0B, 0x05, // 179:2178 + 0x08, 0x8D, 0x0A, 0x05, // 180:2189 + 0x08, 0x97, 0x17, 0x09, // 181:2199 + 0x08, 0xAE, 0x14, 0x08, // 182:2222 + 0x08, 0xC2, 0x05, 0x04, // 183:2242 + 0x08, 0xC7, 0x0C, 0x05, // 184:2247 + 0x08, 0xD3, 0x08, 0x05, // 185:2259 + 0x08, 0xDB, 0x0E, 0x05, // 186:2267 + 0x08, 0xE9, 0x0E, 0x06, // 187:2281 + 0x08, 0xF7, 0x23, 0x0C, // 188:2295 + 0x09, 0x1A, 0x20, 0x0C, // 189:2330 + 0x09, 0x3A, 0x23, 0x0C, // 190:2362 + 0x09, 0x5D, 0x17, 0x08, // 191:2397 + 0x09, 0x74, 0x1D, 0x0A, // 192:2420 + 0x09, 0x91, 0x1D, 0x0A, // 193:2449 + 0x09, 0xAE, 0x1D, 0x0A, // 194:2478 + 0x09, 0xCB, 0x1D, 0x0A, // 195:2507 + 0x09, 0xE8, 0x1D, 0x0A, // 196:2536 + 0x0A, 0x05, 0x1D, 0x0A, // 197:2565 + 0x0A, 0x22, 0x26, 0x0E, // 198:2594 + 0x0A, 0x48, 0x20, 0x0B, // 199:2632 + 0x0A, 0x68, 0x14, 0x08, // 200:2664 + 0x0A, 0x7C, 0x14, 0x08, // 201:2684 + 0x0A, 0x90, 0x14, 0x08, // 202:2704 + 0x0A, 0xA4, 0x14, 0x08, // 203:2724 + 0x0A, 0xB8, 0x07, 0x03, // 204:2744 + 0x0A, 0xBF, 0x07, 0x03, // 205:2751 + 0x0A, 0xC6, 0x07, 0x03, // 206:2758 + 0x0A, 0xCD, 0x07, 0x03, // 207:2765 + 0x0A, 0xD4, 0x1D, 0x0B, // 208:2772 + 0x0A, 0xF1, 0x1A, 0x0A, // 209:2801 + 0x0B, 0x0B, 0x23, 0x0C, // 210:2827 + 0x0B, 0x2E, 0x23, 0x0C, // 211:2862 + 0x0B, 0x51, 0x23, 0x0C, // 212:2897 + 0x0B, 0x74, 0x23, 0x0C, // 213:2932 + 0x0B, 0x97, 0x23, 0x0C, // 214:2967 + 0x0B, 0xBA, 0x17, 0x08, // 215:3002 + 0x0B, 0xD1, 0x20, 0x0C, // 216:3025 + 0x0B, 0xF1, 0x17, 0x09, // 217:3057 + 0x0C, 0x08, 0x17, 0x09, // 218:3080 + 0x0C, 0x1F, 0x17, 0x09, // 219:3103 + 0x0C, 0x36, 0x17, 0x09, // 220:3126 + 0x0C, 0x4D, 0x16, 0x08, // 221:3149 + 0x0C, 0x63, 0x17, 0x08, // 222:3171 + 0x0C, 0x7A, 0x14, 0x08, // 223:3194 + 0x0C, 0x8E, 0x1A, 0x0A, // 224:3214 + 0x0C, 0xA8, 0x1A, 0x0A, // 225:3240 + 0x0C, 0xC2, 0x1A, 0x0A, // 226:3266 + 0x0C, 0xDC, 0x1A, 0x0A, // 227:3292 + 0x0C, 0xF6, 0x1A, 0x0A, // 228:3318 + 0x0D, 0x10, 0x1A, 0x0A, // 229:3344 + 0x0D, 0x2A, 0x2F, 0x10, // 230:3370 + 0x0D, 0x59, 0x17, 0x09, // 231:3417 + 0x0D, 0x70, 0x1A, 0x09, // 232:3440 + 0x0D, 0x8A, 0x1A, 0x09, // 233:3466 + 0x0D, 0xA4, 0x1A, 0x09, // 234:3492 + 0x0D, 0xBE, 0x1A, 0x09, // 235:3518 + 0x0D, 0xD8, 0x07, 0x03, // 236:3544 + 0x0D, 0xDF, 0x07, 0x03, // 237:3551 + 0x0D, 0xE6, 0x07, 0x03, // 238:3558 + 0x0D, 0xED, 0x07, 0x03, // 239:3565 + 0x0D, 0xF4, 0x1A, 0x09, // 240:3572 + 0x0E, 0x0E, 0x17, 0x09, // 241:3598 + 0x0E, 0x25, 0x1A, 0x09, // 242:3621 + 0x0E, 0x3F, 0x1A, 0x09, // 243:3647 + 0x0E, 0x59, 0x1A, 0x09, // 244:3673 + 0x0E, 0x73, 0x1A, 0x09, // 245:3699 + 0x0E, 0x8D, 0x1A, 0x09, // 246:3725 + 0x0E, 0xA7, 0x17, 0x08, // 247:3751 + 0x0E, 0xBE, 0x1A, 0x09, // 248:3774 + 0x0E, 0xD8, 0x17, 0x09, // 249:3800 + 0x0E, 0xEF, 0x17, 0x09, // 250:3823 + 0x0F, 0x06, 0x17, 0x09, // 251:3846 + 0x0F, 0x1D, 0x17, 0x09, // 252:3869 + 0x0F, 0x34, 0x13, 0x08, // 253:3892 + 0x0F, 0x47, 0x1A, 0x0A, // 254:3911 + 0x0F, 0x61, 0x13, 0x08, // 255:3937 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x37, // 33 + 0x00,0x00,0x00,0x70,0x00,0x00,0x70, // 34 + 0x80,0x04,0x00,0x80,0x3C,0x00,0xE0,0x07,0x00,0x90,0x04,0x00,0x80,0x3C,0x00,0xC0,0x07,0x00,0xB0,0x04,0x00,0x80, // 35 + 0x00,0x00,0x00,0xE0,0x18,0x00,0x10,0x31,0x00,0x18,0x61,0x00,0x10,0x21,0x00,0x10,0x12,0x00,0x20,0x1C, // 36 + 0x60,0x00,0x00,0x90,0x00,0x00,0x90,0x00,0x00,0x90,0x30,0x00,0x60,0x0C,0x00,0x00,0x03,0x00,0xC0,0x1C,0x00,0x30,0x22,0x00,0x00,0x22,0x00,0x00,0x22,0x00,0x00,0x1C, // 37 + 0x00,0x00,0x00,0x00,0x1E,0x00,0xE0,0x32,0x00,0x90,0x21,0x00,0x10,0x21,0x00,0x90,0x32,0x00,0xE0,0x1C,0x00,0x00,0x0E,0x00,0x00,0x13,0x00,0x00,0x20, // 38 + 0x00,0x00,0x00,0x70, // 39 + 0x00,0x00,0x00,0x80,0x1F,0x00,0xC0,0x30,0x00,0x20,0x40,0x00,0x10,0x80, // 40 + 0x10,0x80,0x00,0x20,0x40,0x00,0xC0,0x30,0x00,0x80,0x1F, // 41 + 0x00,0x00,0x00,0x40,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x40, // 42 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xC0,0x1F,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 43 + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x70, // 44 + 0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04, // 45 + 0x00,0x00,0x00,0x00,0x30, // 46 + 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x70, // 47 + 0xE0,0x1F,0x00,0x30,0x10,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x30,0x30,0x00,0xE0,0x1F, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0xF0,0x3F, // 49 + 0x00,0x20,0x00,0x60,0x30,0x00,0x10,0x28,0x00,0x10,0x24,0x00,0x10,0x26,0x00,0x30,0x23,0x00,0xE0,0x21, // 50 + 0x00,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x10,0x21,0x00,0x90,0x21,0x00,0xE0,0x11,0x00,0x00,0x0E, // 51 + 0x00,0x0C,0x00,0x00,0x0A,0x00,0x80,0x09,0x00,0x40,0x08,0x00,0x30,0x08,0x00,0xF0,0x3F,0x00,0x00,0x08, // 52 + 0x00,0x08,0x00,0xF0,0x11,0x00,0x90,0x20,0x00,0x90,0x20,0x00,0x90,0x20,0x00,0x10,0x11,0x00,0x00,0x0E, // 53 + 0x00,0x0E,0x00,0x80,0x11,0x00,0xC0,0x20,0x00,0xB0,0x20,0x00,0x90,0x20,0x00,0x00,0x11,0x00,0x00,0x0E, // 54 + 0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x30,0x00,0x10,0x0C,0x00,0x10,0x03,0x00,0xD0,0x00,0x00,0x30, // 55 + 0x00,0x00,0x00,0x00,0x1C,0x00,0xE0,0x32,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0xE0,0x32,0x00,0x00,0x1C, // 56 + 0xC0,0x01,0x00,0x20,0x02,0x00,0x10,0x24,0x00,0x10,0x34,0x00,0x10,0x0C,0x00,0x20,0x06,0x00,0xC0,0x01, // 57 + 0x00,0x00,0x00,0x80,0x31, // 58 + 0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x21, // 59 + 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x80,0x08,0x00,0x80,0x10,0x00,0x40,0x10, // 60 + 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x09,0x00,0x00,0x09,0x00,0x00,0x09,0x00,0x00,0x09,0x00,0x00,0x09,0x00,0x00,0x09, // 61 + 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x18,0x00,0x80,0x08,0x00,0x00,0x09,0x00,0x00,0x05,0x00,0x00,0x06,0x00,0x00,0x02, // 62 + 0x00,0x00,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x10,0x36,0x00,0x30,0x03,0x00,0xE0, // 63 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x18,0x00,0x20,0x17,0x00,0x90,0x28,0x00,0x50,0x28,0x00,0x50,0x24,0x00,0x90,0x2B,0x00,0x70,0x18,0x00,0x60,0x14,0x00,0xC0,0x03, // 64 + 0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0xC0,0x05,0x00,0x70,0x04,0x00,0x30,0x04,0x00,0xC0,0x04,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30, // 65 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0xE0,0x32,0x00,0x00,0x1E, // 66 + 0x00,0x00,0x00,0x80,0x07,0x00,0x60,0x18,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x30,0x00,0x20,0x10,0x00,0x40,0x08, // 67 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x60,0x18,0x00,0x80,0x07, // 68 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x20, // 69 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x01,0x00,0x10,0x01,0x00,0x10,0x01,0x00,0x10,0x01, // 70 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x10,0x22,0x00,0x10,0x22,0x00,0x10,0x22,0x00,0x10,0x22,0x00,0x20,0x12,0x00,0x60,0x0A,0x00,0x00,0x06, // 71 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0xF0,0x3F, // 72 + 0x00,0x00,0x00,0xF0,0x3F, // 73 + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0xF0,0x1F, // 74 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x06,0x00,0x00,0x03,0x00,0x80,0x04,0x00,0x40,0x08,0x00,0x30,0x30,0x00,0x10,0x20, // 75 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20, // 76 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x20,0x00,0x00,0x1C,0x00,0x00,0x07,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0xF0,0x3F, // 77 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x00,0x02,0x00,0x00,0x0C,0x00,0x00,0x10,0x00,0xF0,0x3F, // 78 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 79 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x02,0x00,0x10,0x02,0x00,0x10,0x02,0x00,0x10,0x02,0x00,0x30,0x03,0x00,0xE0,0x01, // 80 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x0C,0x00,0x20,0x14,0x00,0x10,0x24,0x00,0x10,0x24,0x00,0x10,0x24,0x00,0x10,0x28,0x00,0x10,0x28,0x00,0x20,0x10,0x00,0x60,0x28,0x00,0x80,0x27, // 81 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x06,0x00,0x10,0x1A,0x00,0x20,0x32,0x00,0xE0,0x01, // 82 + 0x00,0x00,0x00,0xE0,0x18,0x00,0x30,0x21,0x00,0x10,0x21,0x00,0x10,0x22,0x00,0x10,0x32,0x00,0x20,0x1C, // 83 + 0x10,0x00,0x00,0x10,0x00,0x00,0xF0,0x3F,0x00,0x10,0x00,0x00,0x10, // 84 + 0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0xF0,0x0F, // 85 + 0x10,0x00,0x00,0x60,0x00,0x00,0x80,0x03,0x00,0x00,0x0E,0x00,0x00,0x30,0x00,0x00,0x38,0x00,0x00,0x06,0x00,0x80,0x01,0x00,0x70, // 86 + 0x10,0x00,0x00,0xE0,0x01,0x00,0x00,0x0F,0x00,0x00,0x30,0x00,0x00,0x3C,0x00,0x80,0x03,0x00,0x70,0x00,0x00,0xE0,0x01,0x00,0x00,0x0E,0x00,0x00,0x30,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x70, // 87 + 0x00,0x20,0x00,0x30,0x30,0x00,0x60,0x08,0x00,0x80,0x07,0x00,0x00,0x03,0x00,0xC0,0x0C,0x00,0x60,0x18,0x00,0x10,0x20, // 88 + 0x00,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x3C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x30, // 89 + 0x10,0x20,0x00,0x10,0x38,0x00,0x10,0x26,0x00,0x10,0x23,0x00,0xD0,0x20,0x00,0x70,0x20,0x00,0x00,0x20, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x20,0x40,0x00,0x10,0x80, // 91 + 0x00,0x00,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x80,0x01,0x00,0x00,0x0E,0x00,0x00,0x30, // 92 + 0x10,0x80,0x00,0x30,0x40,0x00,0xE0,0x3F, // 93 + 0x00,0x08,0x00,0x00,0x0E,0x00,0x80,0x01,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x0C, // 94 + 0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80, // 95 + 0x00,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x10, // 96 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 97 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 98 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x01, // 99 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0xF0,0x3F, // 100 + 0x00,0x00,0x00,0x80,0x1F,0x00,0x80,0x14,0x00,0x40,0x24,0x00,0x40,0x24,0x00,0x40,0x24,0x00,0x80,0x34,0x00,0x80,0x17,0x00,0x00,0x04, // 101 + 0x40,0x00,0x00,0xE0,0x3F,0x00,0x50,0x00,0x00,0x50, // 102 + 0x00,0x00,0x00,0x00,0x4F,0x00,0x80,0xD0,0x00,0x40,0x20,0x01,0x40,0x20,0x01,0x40,0x20,0x01,0x40,0x20,0x01,0x80,0x90,0x00,0xC0,0x7F, // 103 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,0x80,0x3F, // 104 + 0x00,0x00,0x00,0xF0,0x3F, // 105 + 0x00,0x00,0x01,0xF0,0xFF, // 106 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x00,0x09,0x00,0xC0,0x30,0x00,0x40,0x20, // 107 + 0x00,0x00,0x00,0xF0,0x3F, // 108 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0xC0,0x00,0x00,0x00,0x3F,0x00,0xC0,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0xC0,0x00,0x00,0x80,0x3F, // 109 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x3F, // 110 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 111 + 0x00,0x00,0x00,0xC0,0xFF,0x01,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 112 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0xC0,0xFF,0x01, // 113 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0xC0,0x00,0x00,0x40, // 114 + 0x00,0x00,0x00,0x80,0x13,0x00,0x40,0x22,0x00,0x40,0x24,0x00,0x80,0x1C, // 115 + 0x40,0x00,0x00,0x40,0x00,0x00,0xF0,0x3F,0x00,0x40,0x00,0x00,0x40, // 116 + 0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x30,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0xC0,0x3F, // 117 + 0x40,0x00,0x00,0x80,0x01,0x00,0x00,0x0E,0x00,0x00,0x30,0x00,0x00,0x38,0x00,0x00,0x06,0x00,0xC0,0x01, // 118 + 0x40,0x00,0x00,0x80,0x03,0x00,0x00,0x1C,0x00,0x00,0x20,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x00,0x07,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x06,0x00,0xC0,0x01, // 119 + 0x40,0x20,0x00,0xC0,0x30,0x00,0x00,0x0F,0x00,0x00,0x06,0x00,0x80,0x19,0x00,0xC0,0x30, // 120 + 0x40,0x00,0x00,0x80,0x03,0x00,0x00,0x8E,0x01,0x00,0xF0,0x00,0x00,0x1C,0x00,0x00,0x07,0x00,0xC0, // 121 + 0x40,0x30,0x00,0x40,0x38,0x00,0x40,0x24,0x00,0x40,0x23,0x00,0xC0,0x20,0x00,0x40,0x20, // 122 + 0x00,0x00,0x00,0x00,0x06,0x00,0xF0,0xFF,0x00,0x10,0x80, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F, // 124 + 0x00,0x00,0x00,0x10,0x80,0x00,0xF0,0xFF,0x00,0x00,0x06, // 125 + 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x02, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFE,0x01, // 161 + 0x00,0x00,0x00,0x80,0x03,0x00,0x40,0x04,0x00,0x20,0x08,0x00,0x30,0x18,0x00,0x20,0x08,0x00,0x40,0x04, // 162 + 0x00,0x01,0x00,0xE0,0x21,0x00,0x30,0x23,0x00,0x10,0x3D,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x60,0x30,0x00,0x00,0x1C, // 163 + 0x40,0x17,0x00,0x80,0x08,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x40,0x17, // 164 + 0x00,0x00,0x00,0xB0,0x04,0x00,0xC0,0x04,0x00,0x00,0x07,0x00,0x00,0x3E,0x00,0x00,0x05,0x00,0xE0,0x04,0x00,0x90,0x04, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3C, // 166 + 0x00,0x00,0x00,0x00,0x67,0x00,0xE0,0xC4,0x00,0x90,0x88,0x00,0x10,0x89,0x00,0x30,0x91,0x00,0x00,0x7E, // 167 + 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30, // 168 + 0x80,0x07,0x00,0x60,0x08,0x00,0xA0,0x17,0x00,0xD0,0x2C,0x00,0x50,0x28,0x00,0x50,0x28,0x00,0x50,0x28,0x00,0x90,0x24,0x00,0x20,0x10,0x00,0x40,0x08, // 169 + 0x60,0x02,0x00,0x90,0x02,0x00,0x90,0x02,0x00,0x90,0x02,0x00,0xF0,0x02, // 170 + 0x00,0x00,0x00,0x00,0x07,0x00,0x80,0x08,0x00,0x00,0x06,0x00,0x80,0x19, // 171 + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x0F, // 172 + 0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04, // 173 + 0x80,0x07,0x00,0x60,0x08,0x00,0x20,0x10,0x00,0xD0,0x2F,0x00,0x50,0x22,0x00,0x50,0x22,0x00,0x50,0x26,0x00,0x90,0x29,0x00,0x20,0x10,0x00,0x40,0x08, // 174 + 0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x10, // 175 + 0x00,0x00,0x00,0xE0,0x00,0x00,0x10,0x01,0x00,0x10,0x01,0x00,0xE0, // 176 + 0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x22,0x00,0x00,0x22,0x00,0xC0,0x2F,0x00,0x00,0x22,0x00,0x00,0x22,0x00,0x00,0x22, // 177 + 0x00,0x00,0x00,0x30,0x03,0x00,0x10,0x03,0x00,0x90,0x02,0x00,0x60,0x02, // 178 + 0x20,0x01,0x00,0x10,0x02,0x00,0x50,0x02,0x00,0xF0,0x01, // 179 + 0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x08, // 180 + 0x00,0x00,0x00,0xC0,0xFF,0x01,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0xC0,0x3F, // 181 + 0xC0,0x00,0x00,0xF0,0x01,0x00,0xF0,0x01,0x00,0xF0,0xFF,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0xF0,0xFF, // 182 + 0x00,0x00,0x00,0x00,0x06, // 183 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0xC0,0x01, // 184 + 0x00,0x00,0x00,0x10,0x00,0x00,0xF0,0x07, // 185 + 0x60,0x02,0x00,0x90,0x02,0x00,0x90,0x02,0x00,0x90,0x02,0x00,0x60,0x02, // 186 + 0x00,0x00,0x00,0x80,0x0D,0x00,0x00,0x06,0x00,0x80,0x08,0x00,0x00,0x07, // 187 + 0x00,0x00,0x00,0x10,0x00,0x00,0xF0,0x03,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x30,0x18,0x00,0x00,0x14,0x00,0x00,0x13,0x00,0x00,0x3F,0x00,0x00,0x10, // 188 + 0x00,0x00,0x00,0x10,0x00,0x00,0xF0,0x03,0x00,0x00,0x30,0x00,0x00,0x0E,0x00,0x80,0x01,0x00,0x60,0x00,0x00,0x10,0x33,0x00,0x80,0x28,0x00,0x80,0x24,0x00,0x00,0x23, // 189 + 0x20,0x01,0x00,0x10,0x02,0x00,0x50,0x02,0x00,0xF0,0x21,0x00,0x00,0x18,0x00,0x00,0x06,0x00,0x80,0x11,0x00,0x60,0x18,0x00,0x10,0x16,0x00,0x00,0x11,0x00,0x00,0x3F,0x00,0x00,0x10, // 190 + 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x98,0x01,0x00,0x0C,0x01,0xC0,0x06,0x01,0x00,0x00,0x01,0x00,0x80,0x00,0x00,0x60, // 191 + 0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0xC2,0x05,0x00,0x76,0x04,0x00,0x34,0x04,0x00,0xC0,0x04,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30, // 192 + 0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0xC0,0x05,0x00,0x74,0x04,0x00,0x34,0x04,0x00,0xC2,0x04,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30, // 193 + 0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0xC4,0x05,0x00,0x74,0x04,0x00,0x32,0x04,0x00,0xC4,0x04,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30, // 194 + 0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0xC4,0x05,0x00,0x74,0x04,0x00,0x34,0x04,0x00,0xC4,0x04,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30, // 195 + 0x00,0x20,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0xC6,0x05,0x00,0x30,0x04,0x00,0x76,0x04,0x00,0xC0,0x05,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x20, // 196 + 0x00,0x20,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0xC2,0x05,0x00,0x35,0x04,0x00,0x37,0x04,0x00,0xC0,0x05,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x20, // 197 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x18,0x00,0x00,0x0C,0x00,0x00,0x07,0x00,0x80,0x05,0x00,0xC0,0x04,0x00,0x30,0x04,0x00,0xF0,0x3F,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21, // 198 + 0x00,0x00,0x00,0x80,0x07,0x00,0x60,0x18,0x00,0x20,0x10,0x00,0x10,0x60,0x00,0x10,0xA0,0x02,0x10,0xA0,0x03,0x10,0x20,0x00,0x20,0x10,0x00,0x60,0x18,0x00,0x00,0x08, // 199 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x12,0x21,0x00,0x14,0x21,0x00,0x14,0x21,0x00,0x10,0x21,0x00,0x10,0x20, // 200 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x10,0x21,0x00,0x14,0x21,0x00,0x12,0x21,0x00,0x12,0x21,0x00,0x10,0x20, // 201 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x14,0x21,0x00,0x12,0x21,0x00,0x14,0x21,0x00,0x14,0x21,0x00,0x10,0x20, // 202 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x16,0x21,0x00,0x10,0x21,0x00,0x16,0x21,0x00,0x10,0x21,0x00,0x10,0x20, // 203 + 0x02,0x00,0x00,0xF4,0x3F,0x00,0x04, // 204 + 0x04,0x00,0x00,0xF4,0x3F,0x00,0x02, // 205 + 0x04,0x00,0x00,0xF2,0x3F,0x00,0x04, // 206 + 0x06,0x00,0x00,0xF0,0x3F,0x00,0x06, // 207 + 0x00,0x00,0x00,0x00,0x01,0x00,0xF0,0x3F,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x60,0x18,0x00,0x80,0x07, // 208 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x30,0x00,0x00,0x44,0x00,0x00,0x84,0x01,0x00,0x04,0x02,0x00,0x04,0x0C,0x00,0x00,0x10,0x00,0xF0,0x3F, // 209 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x16,0x20,0x00,0x14,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 210 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x14,0x20,0x00,0x12,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 211 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x14,0x20,0x00,0x12,0x20,0x00,0x14,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 212 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x14,0x20,0x00,0x14,0x20,0x00,0x14,0x20,0x00,0x14,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 213 + 0x00,0x00,0x00,0x80,0x07,0x00,0x40,0x08,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x16,0x20,0x00,0x10,0x20,0x00,0x16,0x20,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 214 + 0x00,0x00,0x00,0xC0,0x10,0x00,0x80,0x09,0x00,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x0D,0x00,0x80,0x18,0x00,0x40,0x10, // 215 + 0x00,0x00,0x00,0x80,0x07,0x00,0x60,0x68,0x00,0x20,0x10,0x00,0x10,0x2C,0x00,0x10,0x22,0x00,0x10,0x21,0x00,0xD0,0x20,0x00,0x20,0x10,0x00,0x58,0x18,0x00,0x80,0x07, // 216 + 0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x10,0x00,0x02,0x20,0x00,0x04,0x20,0x00,0x04,0x20,0x00,0x00,0x10,0x00,0xF0,0x0F, // 217 + 0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x10,0x00,0x04,0x20,0x00,0x04,0x20,0x00,0x02,0x20,0x00,0x00,0x10,0x00,0xF0,0x0F, // 218 + 0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x10,0x00,0x04,0x20,0x00,0x02,0x20,0x00,0x04,0x20,0x00,0x00,0x10,0x00,0xF0,0x0F, // 219 + 0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x10,0x00,0x06,0x20,0x00,0x00,0x20,0x00,0x06,0x20,0x00,0x00,0x10,0x00,0xF0,0x0F, // 220 + 0x00,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x04,0x03,0x00,0x04,0x3C,0x00,0x02,0x03,0x00,0xC0,0x00,0x00,0x30, // 221 + 0x00,0x00,0x00,0xF0,0x3F,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x60,0x0C,0x00,0xC0,0x07, // 222 + 0x00,0x00,0x00,0xE0,0x3F,0x00,0x10,0x18,0x00,0x10,0x21,0x00,0x10,0x21,0x00,0xE0,0x32,0x00,0x00,0x1E, // 223 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x48,0x20,0x00,0x48,0x20,0x00,0x50,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 224 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x48,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 225 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 226 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 227 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x70,0x20,0x00,0x40,0x20,0x00,0x70,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 228 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x78,0x20,0x00,0x68,0x20,0x00,0x50,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F, // 229 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0xC0,0x3F,0x00,0x80,0x15,0x00,0x40,0x24,0x00,0x40,0x24,0x00,0x40,0x24,0x00,0x40,0x24,0x00,0x80,0x15,0x00,0x00,0x07, // 230 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x60,0x01,0x40,0xE0,0x01,0xC0,0x30,0x00,0x80,0x11, // 231 + 0x00,0x00,0x00,0x80,0x1F,0x00,0x80,0x14,0x00,0x48,0x24,0x00,0x50,0x24,0x00,0x50,0x24,0x00,0x80,0x34,0x00,0x80,0x17,0x00,0x00,0x04, // 232 + 0x00,0x00,0x00,0x80,0x1F,0x00,0x80,0x14,0x00,0x50,0x24,0x00,0x50,0x24,0x00,0x48,0x24,0x00,0x88,0x34,0x00,0x80,0x17,0x00,0x00,0x04, // 233 + 0x00,0x00,0x00,0x80,0x1F,0x00,0x80,0x14,0x00,0x50,0x24,0x00,0x50,0x24,0x00,0x50,0x24,0x00,0x80,0x34,0x00,0x80,0x17,0x00,0x00,0x04, // 234 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x15,0x00,0x70,0x24,0x00,0x40,0x24,0x00,0x70,0x24,0x00,0xC0,0x24,0x00,0x80,0x15,0x00,0x00,0x06, // 235 + 0x08,0x00,0x00,0xC8,0x3F,0x00,0x10, // 236 + 0x10,0x00,0x00,0xC8,0x3F,0x00,0x08, // 237 + 0x10,0x00,0x00,0xD0,0x3F,0x00,0x10, // 238 + 0x30,0x00,0x00,0xC0,0x3F,0x00,0x30, // 239 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x60,0x20,0x00,0x50,0x20,0x00,0x70,0x20,0x00,0x50,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 240 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x90,0x00,0x00,0x50,0x00,0x00,0x50,0x00,0x00,0x50,0x00,0x00,0x90,0x00,0x00,0x00,0x3F, // 241 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x48,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 242 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x40,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x48,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 243 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x60,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x60,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 244 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x50,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 245 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x10,0x00,0x70,0x20,0x00,0x40,0x20,0x00,0x70,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 246 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x80,0x0A,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 247 + 0x00,0x00,0x00,0x00,0x0F,0x00,0x80,0x30,0x00,0x40,0x38,0x00,0x40,0x24,0x00,0x40,0x22,0x00,0xC0,0x21,0x00,0xC0,0x10,0x00,0x40,0x0F, // 248 + 0x00,0x00,0x00,0xC0,0x1F,0x00,0x08,0x30,0x00,0x08,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x00,0x10,0x00,0xC0,0x3F, // 249 + 0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x30,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x08,0x20,0x00,0x08,0x10,0x00,0xC0,0x3F, // 250 + 0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x30,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x10,0x20,0x00,0x00,0x10,0x00,0xC0,0x3F, // 251 + 0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x30,0x00,0x30,0x20,0x00,0x00,0x20,0x00,0x30,0x20,0x00,0x00,0x10,0x00,0xC0,0x3F, // 252 + 0x40,0x00,0x00,0x80,0x03,0x00,0x00,0x8E,0x01,0x10,0xF0,0x00,0x08,0x1C,0x00,0x08,0x07,0x00,0xC0, // 253 + 0x00,0x00,0x00,0xF0,0xFF,0x01,0x80,0x10,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x40,0x20,0x00,0x80,0x10,0x00,0x00,0x0F, // 254 + 0x40,0x00,0x00,0x80,0x03,0x00,0x30,0x9C,0x01,0x00,0x70,0x00,0x30,0x1C,0x00,0x80,0x03,0x00,0xC0 // 255 +}; + +const uint8_t URW_Gothic_L_Book_25[] PROGMEM = { + 0x1D, // Width: 29 + 0x1F, // Height: 31 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x07, // 32:65535 + 0x00, 0x00, 0x14, 0x07, // 33:0 + 0x00, 0x14, 0x1A, 0x08, // 34:20 + 0x00, 0x2E, 0x36, 0x0E, // 35:46 + 0x00, 0x64, 0x2F, 0x0E, // 36:100 + 0x00, 0x93, 0x4B, 0x13, // 37:147 + 0x00, 0xDE, 0x4B, 0x13, // 38:222 + 0x01, 0x29, 0x0E, 0x05, // 39:297 + 0x01, 0x37, 0x20, 0x09, // 40:311 + 0x01, 0x57, 0x1F, 0x09, // 41:343 + 0x01, 0x76, 0x22, 0x0B, // 42:374 + 0x01, 0x98, 0x37, 0x0F, // 43:408 + 0x01, 0xCF, 0x17, 0x07, // 44:463 + 0x01, 0xE6, 0x1F, 0x08, // 45:486 + 0x02, 0x05, 0x10, 0x07, // 46:517 + 0x02, 0x15, 0x25, 0x0B, // 47:533 + 0x02, 0x3A, 0x33, 0x0E, // 48:570 + 0x02, 0x6D, 0x24, 0x0E, // 49:621 + 0x02, 0x91, 0x34, 0x0E, // 50:657 + 0x02, 0xC5, 0x2F, 0x0E, // 51:709 + 0x02, 0xF4, 0x37, 0x0E, // 52:756 + 0x03, 0x2B, 0x33, 0x0E, // 53:811 + 0x03, 0x5E, 0x33, 0x0E, // 54:862 + 0x03, 0x91, 0x2E, 0x0E, // 55:913 + 0x03, 0xBF, 0x33, 0x0E, // 56:959 + 0x03, 0xF2, 0x32, 0x0E, // 57:1010 + 0x04, 0x24, 0x10, 0x07, // 58:1060 + 0x04, 0x34, 0x13, 0x07, // 59:1076 + 0x04, 0x47, 0x37, 0x0F, // 60:1095 + 0x04, 0x7E, 0x37, 0x0F, // 61:1150 + 0x04, 0xB5, 0x37, 0x0F, // 62:1205 + 0x04, 0xEC, 0x32, 0x0F, // 63:1260 + 0x05, 0x1E, 0x53, 0x16, // 64:1310 + 0x05, 0x71, 0x48, 0x13, // 65:1393 + 0x05, 0xB9, 0x37, 0x0E, // 66:1465 + 0x05, 0xF0, 0x4B, 0x14, // 67:1520 + 0x06, 0x3B, 0x47, 0x13, // 68:1595 + 0x06, 0x82, 0x30, 0x0D, // 69:1666 + 0x06, 0xB2, 0x2E, 0x0C, // 70:1714 + 0x06, 0xE0, 0x53, 0x16, // 71:1760 + 0x07, 0x33, 0x3C, 0x11, // 72:1843 + 0x07, 0x6F, 0x10, 0x06, // 73:1903 + 0x07, 0x7F, 0x27, 0x0C, // 74:1919 + 0x07, 0xA6, 0x38, 0x0F, // 75:1958 + 0x07, 0xDE, 0x30, 0x0C, // 76:2014 + 0x08, 0x0E, 0x54, 0x17, // 77:2062 + 0x08, 0x62, 0x44, 0x13, // 78:2146 + 0x08, 0xA6, 0x53, 0x16, // 79:2214 + 0x08, 0xF9, 0x36, 0x0F, // 80:2297 + 0x09, 0x2F, 0x54, 0x16, // 81:2351 + 0x09, 0x83, 0x36, 0x0F, // 82:2435 + 0x09, 0xB9, 0x2F, 0x0C, // 83:2489 + 0x09, 0xE8, 0x26, 0x0B, // 84:2536 + 0x0A, 0x0E, 0x3B, 0x10, // 85:2574 + 0x0A, 0x49, 0x42, 0x12, // 86:2633 + 0x0A, 0x8B, 0x5D, 0x18, // 87:2699 + 0x0A, 0xE8, 0x3C, 0x0F, // 88:2792 + 0x0B, 0x24, 0x36, 0x0F, // 89:2852 + 0x0B, 0x5A, 0x30, 0x0C, // 90:2906 + 0x0B, 0x8A, 0x20, 0x09, // 91:2954 + 0x0B, 0xAA, 0x2C, 0x0F, // 92:2986 + 0x0B, 0xD6, 0x17, 0x09, // 93:3030 + 0x0B, 0xED, 0x3B, 0x0F, // 94:3053 + 0x0C, 0x28, 0x34, 0x0D, // 95:3112 + 0x0C, 0x5C, 0x1E, 0x09, // 96:3164 + 0x0C, 0x7A, 0x40, 0x11, // 97:3194 + 0x0C, 0xBA, 0x3F, 0x11, // 98:3258 + 0x0C, 0xF9, 0x3B, 0x10, // 99:3321 + 0x0D, 0x34, 0x40, 0x11, // 100:3380 + 0x0D, 0x74, 0x3B, 0x10, // 101:3444 + 0x0D, 0xAF, 0x1A, 0x08, // 102:3503 + 0x0D, 0xC9, 0x3C, 0x11, // 103:3529 + 0x0E, 0x05, 0x38, 0x0F, // 104:3589 + 0x0E, 0x3D, 0x10, 0x05, // 105:3645 + 0x0E, 0x4D, 0x10, 0x05, // 106:3661 + 0x0E, 0x5D, 0x34, 0x0D, // 107:3677 + 0x0E, 0x91, 0x10, 0x05, // 108:3729 + 0x0E, 0xA1, 0x58, 0x17, // 109:3745 + 0x0E, 0xF9, 0x38, 0x0F, // 110:3833 + 0x0F, 0x31, 0x3B, 0x10, // 111:3889 + 0x0F, 0x6C, 0x3F, 0x11, // 112:3948 + 0x0F, 0xAB, 0x40, 0x11, // 113:4011 + 0x0F, 0xEB, 0x1E, 0x08, // 114:4075 + 0x10, 0x09, 0x23, 0x0A, // 115:4105 + 0x10, 0x2C, 0x1E, 0x08, // 116:4140 + 0x10, 0x4A, 0x38, 0x0F, // 117:4170 + 0x10, 0x82, 0x32, 0x0E, // 118:4226 + 0x10, 0xB4, 0x4E, 0x15, // 119:4276 + 0x11, 0x02, 0x2C, 0x0C, // 120:4354 + 0x11, 0x2E, 0x32, 0x0D, // 121:4398 + 0x11, 0x60, 0x28, 0x0B, // 122:4448 + 0x11, 0x88, 0x1C, 0x09, // 123:4488 + 0x11, 0xA4, 0x28, 0x11, // 124:4516 + 0x11, 0xCC, 0x1B, 0x09, // 125:4556 + 0x11, 0xE7, 0x37, 0x0F, // 126:4583 + 0xFF, 0xFF, 0x00, 0x0D, // 127:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 128:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 129:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 130:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 131:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 132:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 133:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 134:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 135:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 136:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 137:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 138:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 139:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 140:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 141:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 142:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 143:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 144:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 145:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 146:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 147:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 148:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 149:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 150:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 151:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 152:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 153:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 154:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 155:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 156:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 157:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 158:65535 + 0xFF, 0xFF, 0x00, 0x0D, // 159:65535 + 0xFF, 0xFF, 0x00, 0x07, // 160:65535 + 0x12, 0x1E, 0x14, 0x07, // 161:4638 + 0x12, 0x32, 0x2F, 0x0E, // 162:4658 + 0x12, 0x61, 0x37, 0x0E, // 163:4705 + 0x12, 0x98, 0x33, 0x0E, // 164:4760 + 0x12, 0xCB, 0x36, 0x0E, // 165:4811 + 0x13, 0x01, 0x28, 0x11, // 166:4865 + 0x13, 0x29, 0x33, 0x0F, // 167:4905 + 0x13, 0x5C, 0x1A, 0x09, // 168:4956 + 0x13, 0x76, 0x4B, 0x13, // 169:4982 + 0x13, 0xC1, 0x1F, 0x09, // 170:5057 + 0x13, 0xE0, 0x27, 0x0B, // 171:5088 + 0x14, 0x07, 0x37, 0x0F, // 172:5127 + 0x14, 0x3E, 0x1F, 0x08, // 173:5182 + 0x14, 0x5D, 0x4B, 0x13, // 174:5213 + 0x14, 0xA8, 0x26, 0x0C, // 175:5288 + 0x14, 0xCE, 0x22, 0x0A, // 176:5326 + 0x14, 0xF0, 0x38, 0x0F, // 177:5360 + 0x15, 0x28, 0x1F, 0x08, // 178:5416 + 0x15, 0x47, 0x1F, 0x08, // 179:5447 + 0x15, 0x66, 0x19, 0x09, // 180:5478 + 0x15, 0x7F, 0x38, 0x0F, // 181:5503 + 0x15, 0xB7, 0x30, 0x0E, // 182:5559 + 0x15, 0xE7, 0x0F, 0x07, // 183:5607 + 0x15, 0xF6, 0x18, 0x08, // 184:5622 + 0x16, 0x0E, 0x17, 0x08, // 185:5646 + 0x16, 0x25, 0x23, 0x09, // 186:5669 + 0x16, 0x48, 0x27, 0x0B, // 187:5704 + 0x16, 0x6F, 0x4F, 0x15, // 188:5743 + 0x16, 0xBE, 0x54, 0x15, // 189:5822 + 0x17, 0x12, 0x4F, 0x15, // 190:5906 + 0x17, 0x61, 0x34, 0x0F, // 191:5985 + 0x17, 0x95, 0x48, 0x13, // 192:6037 + 0x17, 0xDD, 0x48, 0x13, // 193:6109 + 0x18, 0x25, 0x48, 0x13, // 194:6181 + 0x18, 0x6D, 0x48, 0x13, // 195:6253 + 0x18, 0xB5, 0x48, 0x13, // 196:6325 + 0x18, 0xFD, 0x48, 0x13, // 197:6397 + 0x19, 0x45, 0x60, 0x19, // 198:6469 + 0x19, 0xA5, 0x4B, 0x14, // 199:6565 + 0x19, 0xF0, 0x30, 0x0D, // 200:6640 + 0x1A, 0x20, 0x30, 0x0D, // 201:6688 + 0x1A, 0x50, 0x30, 0x0D, // 202:6736 + 0x1A, 0x80, 0x30, 0x0D, // 203:6784 + 0x1A, 0xB0, 0x15, 0x06, // 204:6832 + 0x1A, 0xC5, 0x15, 0x06, // 205:6853 + 0x1A, 0xDA, 0x15, 0x06, // 206:6874 + 0x1A, 0xEF, 0x15, 0x06, // 207:6895 + 0x1B, 0x04, 0x4B, 0x14, // 208:6916 + 0x1B, 0x4F, 0x44, 0x13, // 209:6991 + 0x1B, 0x93, 0x53, 0x16, // 210:7059 + 0x1B, 0xE6, 0x53, 0x16, // 211:7142 + 0x1C, 0x39, 0x53, 0x16, // 212:7225 + 0x1C, 0x8C, 0x53, 0x16, // 213:7308 + 0x1C, 0xDF, 0x53, 0x16, // 214:7391 + 0x1D, 0x32, 0x37, 0x0F, // 215:7474 + 0x1D, 0x69, 0x53, 0x16, // 216:7529 + 0x1D, 0xBC, 0x3B, 0x10, // 217:7612 + 0x1D, 0xF7, 0x3B, 0x10, // 218:7671 + 0x1E, 0x32, 0x3B, 0x10, // 219:7730 + 0x1E, 0x6D, 0x3B, 0x10, // 220:7789 + 0x1E, 0xA8, 0x36, 0x0F, // 221:7848 + 0x1E, 0xDE, 0x37, 0x0F, // 222:7902 + 0x1F, 0x15, 0x33, 0x0E, // 223:7957 + 0x1F, 0x48, 0x40, 0x11, // 224:8008 + 0x1F, 0x88, 0x40, 0x11, // 225:8072 + 0x1F, 0xC8, 0x40, 0x11, // 226:8136 + 0x20, 0x08, 0x40, 0x11, // 227:8200 + 0x20, 0x48, 0x40, 0x11, // 228:8264 + 0x20, 0x88, 0x40, 0x11, // 229:8328 + 0x20, 0xC8, 0x6F, 0x1D, // 230:8392 + 0x21, 0x37, 0x3B, 0x10, // 231:8503 + 0x21, 0x72, 0x3B, 0x10, // 232:8562 + 0x21, 0xAD, 0x3B, 0x10, // 233:8621 + 0x21, 0xE8, 0x3B, 0x10, // 234:8680 + 0x22, 0x23, 0x3B, 0x10, // 235:8739 + 0x22, 0x5E, 0x12, 0x05, // 236:8798 + 0x22, 0x70, 0x11, 0x05, // 237:8816 + 0x22, 0x81, 0x12, 0x05, // 238:8833 + 0x22, 0x93, 0x12, 0x05, // 239:8851 + 0x22, 0xA5, 0x3B, 0x10, // 240:8869 + 0x22, 0xE0, 0x38, 0x0F, // 241:8928 + 0x23, 0x18, 0x3B, 0x10, // 242:8984 + 0x23, 0x53, 0x3B, 0x10, // 243:9043 + 0x23, 0x8E, 0x3B, 0x10, // 244:9102 + 0x23, 0xC9, 0x3B, 0x10, // 245:9161 + 0x24, 0x04, 0x3B, 0x10, // 246:9220 + 0x24, 0x3F, 0x33, 0x0F, // 247:9279 + 0x24, 0x72, 0x3B, 0x10, // 248:9330 + 0x24, 0xAD, 0x38, 0x0F, // 249:9389 + 0x24, 0xE5, 0x38, 0x0F, // 250:9445 + 0x25, 0x1D, 0x38, 0x0F, // 251:9501 + 0x25, 0x55, 0x38, 0x0F, // 252:9557 + 0x25, 0x8D, 0x32, 0x0D, // 253:9613 + 0x25, 0xBF, 0x3F, 0x11, // 254:9663 + 0x25, 0xFE, 0x32, 0x0D, // 255:9726 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xCF,0x01,0x80,0xFF,0xCF,0x01, // 33 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x1F, // 34 + 0x00,0x00,0x06,0x00,0x00,0x30,0x06,0x00,0x00,0x30,0xFE,0x01,0x00,0xF0,0x7F,0x00,0x00,0xFE,0x07,0x00,0x80,0x3F,0x06,0x00,0x00,0x30,0x06,0x00,0x00,0x30,0x06,0x01,0x00,0x30,0xFE,0x01,0x00,0xF0,0x3F,0x00,0x80,0xFF,0x06,0x00,0x80,0x37,0x06,0x00,0x00,0x30,0x06,0x00,0x00,0x30, // 35 + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x1E,0x38,0x00,0x80,0x3F,0x70,0x00,0x80,0x71,0x60,0x00,0xC0,0x60,0xC0,0x00,0xF0,0x40,0xC0,0x03,0xF0,0xC0,0xC0,0x03,0xC0,0xC0,0xC0,0x00,0x80,0x81,0x61,0x00,0x80,0x87,0x7F,0x00,0x00,0x06,0x1E, // 36 + 0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x73,0x00,0x00,0x80,0x61,0x00,0x00,0x80,0x61,0x00,0x00,0x80,0x61,0x80,0x01,0x80,0x73,0xE0,0x00,0x00,0x3F,0x38,0x00,0x00,0x1E,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x78,0x00,0x00,0x3C,0xFE,0x00,0x00,0x0F,0xC6,0x01,0x80,0x03,0x83,0x01,0x80,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0xC7,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x7C, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xE3,0x00,0x00,0x9E,0xC1,0x00,0x00,0xBF,0x81,0x01,0x80,0xF3,0x80,0x01,0x80,0xE1,0x80,0x01,0x80,0xC1,0x81,0x01,0x80,0xE1,0xC3,0x01,0x80,0x33,0xC3,0x00,0x00,0x3F,0x76,0x00,0x00,0x1E,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x37,0x00,0x00,0xC0,0x71,0x00,0x00,0xC0,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x1F, // 39 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xF0,0xFF,0x00,0x00,0x78,0xE0,0x01,0x00,0x0E,0x80,0x03,0x00,0x07,0x00,0x06,0x00,0x03,0x00,0x0C,0x80,0x01,0x00,0x08, // 40 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x08,0x00,0x03,0x00,0x0C,0x00,0x07,0x00,0x06,0x00,0x0E,0x80,0x03,0x00,0x7C,0xE0,0x01,0x00,0xF0,0xFF,0x00,0x00,0xC0,0x1F, // 41 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x13,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x1B,0x00,0x00,0x80,0x12,0x00,0x00,0x00,0x02, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0xF8,0x7F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xC0, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x7C,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x01,0x00,0x00,0x3E,0x00,0x00,0x80,0x07,0x00,0x00,0x80, // 47 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xFE,0x7F,0x00,0x00,0x07,0xE0,0x00,0x80,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x01,0x00,0x07,0xE0,0x00,0x00,0xFE,0x7F,0x00,0x00,0xFC,0x3F, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 49 + 0x00,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x1E,0xC0,0x01,0x00,0x07,0xE0,0x01,0x00,0x03,0xB0,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x8E,0x01,0x80,0x01,0x86,0x01,0x80,0x03,0x83,0x01,0x00,0xC7,0x81,0x01,0x00,0xFE,0x80,0x01,0x00,0x3C,0x80,0x01, // 50 + 0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x06,0xE0,0x00,0x00,0x07,0xC0,0x00,0x80,0x01,0x80,0x01,0x80,0x41,0x80,0x01,0x80,0x41,0x80,0x01,0x80,0xE1,0x80,0x01,0x80,0xE3,0xC0,0x01,0x00,0xBF,0xE1,0x00,0x00,0x9E,0x7F,0x00,0x00,0x00,0x3E, // 51 + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x37,0x00,0x00,0xC0,0x31,0x00,0x00,0xE0,0x30,0x00,0x00,0x70,0x30,0x00,0x00,0x1C,0x30,0x00,0x00,0x0E,0x30,0x00,0x80,0x03,0x30,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 52 + 0x00,0x00,0x08,0x00,0x00,0x80,0x38,0x00,0x00,0xFE,0x70,0x00,0x80,0x7F,0xC0,0x00,0x80,0x21,0xC0,0x01,0x80,0x31,0x80,0x01,0x80,0x31,0x80,0x01,0x80,0x31,0x80,0x01,0x80,0x31,0x80,0x01,0x80,0x61,0xC0,0x00,0x80,0xE1,0xE0,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x1F, // 53 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x80,0x7F,0x00,0x00,0xE0,0xE0,0x00,0x00,0x78,0xC0,0x00,0x00,0x3C,0x80,0x01,0x00,0x37,0x80,0x01,0x80,0x33,0x80,0x01,0x80,0x30,0x80,0x01,0x00,0x70,0xC0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x1F, // 54 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0xE0,0x01,0x80,0x01,0x78,0x00,0x80,0x01,0x1E,0x00,0x80,0x81,0x07,0x00,0x80,0xE1,0x01,0x00,0x80,0x79,0x00,0x00,0x80,0x1F,0x00,0x00,0x80,0x07, // 55 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x1C,0x7F,0x00,0x00,0xBF,0xE3,0x00,0x00,0xE3,0xC1,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x00,0xE3,0xC1,0x01,0x00,0xBF,0xE3,0x00,0x00,0x1E,0x7F,0x00,0x00,0x00,0x3E, // 56 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x87,0x03,0x00,0x00,0x03,0x07,0x00,0x80,0x01,0x06,0x01,0x80,0x01,0xC6,0x01,0x80,0x01,0xF6,0x00,0x80,0x01,0x3E,0x00,0x00,0x03,0x1F,0x00,0x00,0x87,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0x01,0x00,0x70,0xC0,0x01, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x03,0x00,0x70,0xE0,0x01,0x00,0x70,0x60, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x0D,0x00,0x00,0x80,0x0D,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x60,0x00,0x00,0x30,0x60,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0xC0, // 60 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18, // 61 + 0x00,0x00,0x00,0x00,0x00,0x18,0xC0,0x00,0x00,0x30,0xC0,0x00,0x00,0x30,0x60,0x00,0x00,0x30,0x60,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0x80,0x0D,0x00,0x00,0x80,0x0D,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06, // 62 + 0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0xCC,0x01,0x80,0x01,0xCE,0x01,0x80,0x01,0x07,0x00,0x80,0x83,0x01,0x00,0x00,0xC7,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3C, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x1C,0x38,0x00,0x00,0x86,0x67,0x00,0x00,0xE2,0xCF,0x00,0x00,0x71,0x9C,0x00,0x00,0x39,0x98,0x01,0x80,0x1C,0x18,0x01,0x80,0x0C,0x08,0x01,0x80,0x0C,0x0C,0x01,0x80,0x0C,0x0E,0x01,0x80,0xD8,0x1F,0x01,0x80,0xF0,0x98,0x01,0x00,0x1D,0x98,0x00,0x00,0x01,0xDC,0x00,0x00,0x03,0x6E,0x00,0x00,0x0E,0x07,0x00,0x00,0xFC,0x03,0x00,0x00,0xF0,0x01, // 64 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x07,0x00,0x00,0x78,0x06,0x00,0x00,0x1E,0x06,0x00,0x80,0x07,0x06,0x00,0x80,0x03,0x06,0x00,0x80,0x0F,0x06,0x00,0x00,0x3C,0x06,0x00,0x00,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x00,0xE3,0xC1,0x01,0x00,0xBF,0xE3,0x00,0x00,0x1E,0xFF,0x00,0x00,0x00,0x3E, // 66 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xC0,0x00,0x80,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0x60,0x00,0x00,0x06,0x30,0x00,0x00,0x04,0x10, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0xE0,0x00,0x00,0x0E,0x70,0x00,0x00,0x1C,0x38,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x81,0x01,0x00,0x80,0x01, // 70 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0x83,0x01,0x80,0x01,0x83,0x01,0x80,0x01,0x83,0x01,0x80,0x01,0x83,0x01,0x80,0x01,0x83,0x01,0x80,0x01,0x83,0x01,0x00,0x03,0xC3,0x00,0x00,0x03,0xC3,0x00,0x00,0x07,0x63,0x00,0x00,0x0E,0x73,0x00,0x00,0x0C,0x3F,0x00,0x00,0x08,0x0F,0x00,0x00,0x00,0x03, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 73 + 0x00,0x00,0x30,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x80,0xFF,0xFF,0x00,0x80,0xFF,0x3F, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x70,0x0E,0x00,0x00,0x18,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x07,0xE0,0x00,0x80,0x03,0xC0,0x01,0x80,0x01,0x80,0x01, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x1F,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 78 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x01,0x03,0x00,0x80,0x83,0x03,0x00,0x00,0x87,0x01,0x00,0x00,0xFF,0x01,0x00,0x00,0x7C, // 80 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x76,0x00,0x00,0x07,0xE6,0x00,0x00,0x03,0xC6,0x00,0x00,0x03,0xC6,0x00,0x80,0x01,0x86,0x01,0x80,0x01,0x86,0x01,0x80,0x01,0x8E,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x98,0x01,0x00,0x03,0xF8,0x00,0x00,0x03,0xF0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0xF0,0x00,0x00,0x1C,0xF8,0x01,0x00,0xF8,0x9F,0x01,0x00,0xE0,0x87,0x01, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x02,0x00,0x80,0x01,0x0E,0x00,0x80,0x01,0x1E,0x00,0x80,0x01,0x3A,0x00,0x80,0x03,0xE3,0x00,0x00,0x87,0xC3,0x01,0x00,0xFE,0x81,0x01,0x00,0x7C, // 82 + 0x00,0x00,0x00,0x00,0x00,0x3C,0x38,0x00,0x00,0x7F,0x70,0x00,0x00,0x63,0xC0,0x00,0x80,0xC1,0x80,0x01,0x80,0x81,0x80,0x01,0x80,0x81,0x80,0x01,0x80,0x81,0x81,0x01,0x80,0x03,0xC1,0x01,0x00,0x07,0xE3,0x00,0x00,0x07,0x7E,0x00,0x00,0x06,0x3C, // 83 + 0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 85 + 0x80,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x01, // 86 + 0x80,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x01,0x00,0x00,0x7F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF8,0x01,0x00,0x80,0x1F,0x00,0x00,0xF0,0x03,0x00,0x00,0x7F,0x00,0x00,0x80,0x07,0x00,0x00,0x80, // 87 + 0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x01,0x80,0x03,0xC0,0x01,0x00,0x07,0x70,0x00,0x00,0x1C,0x38,0x00,0x00,0x38,0x0E,0x00,0x00,0xE0,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x78,0x0E,0x00,0x00,0x1C,0x3C,0x00,0x00,0x0F,0x70,0x00,0x80,0x03,0xE0,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x01, // 88 + 0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x01, // 89 + 0x00,0x00,0x80,0x01,0x80,0x01,0xE0,0x01,0x80,0x01,0xF0,0x01,0x80,0x01,0xBC,0x01,0x80,0x01,0x8E,0x01,0x80,0x81,0x83,0x01,0x80,0xC1,0x81,0x01,0x80,0x71,0x80,0x01,0x80,0x39,0x80,0x01,0x80,0x0F,0x80,0x01,0x80,0x07,0x80,0x01,0x80,0x01,0x80,0x01, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0xFE,0xFF,0x03,0x00,0x07,0x00,0x07,0x00,0x03,0x00,0x0C,0x80,0x01,0x00,0x0C, // 91 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x01, // 92 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x0C,0x80,0x01,0x00,0x06,0x00,0x07,0x00,0x07,0x00,0xFE,0xFF,0x03,0x00,0xFC,0xFF, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x10, // 94 + 0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, // 96 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0x70,0x00,0x00,0xC0,0x3F,0x00,0x00,0x80,0x1F, // 98 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xE0,0x00,0x00,0xE0,0x60,0x00,0x00,0xC0,0x20, // 99 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xE0,0x00,0x00,0xE0,0x70,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 100 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x66,0x00,0x00,0x30,0xC6,0x00,0x00,0x30,0xC6,0x00,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x38,0x86,0x01,0x00,0x30,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x77,0x00,0x00,0x80,0x17, // 101 + 0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0xFF,0xFF,0x01,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x18, // 102 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x06,0x00,0xE0,0x70,0x0E,0x00,0x30,0xC0,0x18,0x00,0x38,0xC0,0x39,0x00,0x18,0x80,0x31,0x00,0x18,0x80,0x31,0x00,0x18,0x80,0x31,0x00,0x18,0x80,0x31,0x00,0x30,0xC0,0x30,0x00,0x30,0xC0,0x18,0x00,0xE0,0x70,0x1C,0x00,0xF8,0xFF,0x0F,0x00,0xF8,0xFF,0x03, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x60,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0xC0,0xFF,0x01, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFB,0xFF,0x01,0x80,0xFB,0xFF,0x01, // 105 + 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x80,0xFB,0xFF,0x1F,0x80,0xFB,0xFF,0x0F, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0F,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x31,0x00,0x00,0x70,0xE0,0x00,0x00,0x38,0xC0,0x01,0x00,0x18,0x80,0x01,0x00,0x08,0x00,0x01, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01,0x00,0x60,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0xE0,0xFF,0x01,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xF0,0xFF,0x01,0x00,0xC0,0xFF,0x01, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01,0x00,0x60,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0xC0,0xFF,0x01, // 110 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x00,0x38,0xC0,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0xF8,0xFF,0x3F,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0x70,0x00,0x00,0xE0,0x3F,0x00,0x00,0x80,0x1F, // 112 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xE0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x3F,0x00,0xF8,0xFF,0x3F, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01,0x00,0x70,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18, // 114 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x60,0x00,0x00,0xF0,0xE1,0x00,0x00,0x38,0xC3,0x01,0x00,0x18,0x82,0x01,0x00,0x18,0x86,0x01,0x00,0x38,0xC4,0x01,0x00,0x70,0xFC,0x00,0x00,0x60,0x78, // 115 + 0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 117 + 0x00,0x08,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x00,0x00,0x00,0x38, // 118 + 0x00,0x08,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF8,0x01,0x00,0x00,0x3F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3E,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x01,0x00,0x00,0x38, // 119 + 0x00,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0xE0,0x70,0x00,0x00,0xC0,0x39,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x39,0x00,0x00,0xE0,0x70,0x00,0x00,0x38,0xC0,0x01,0x00,0x18,0x80,0x01, // 120 + 0x00,0x08,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x07,0x20,0x00,0x00,0x3E,0x38,0x00,0x00,0xF8,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x01,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x18, // 121 + 0x00,0x18,0x80,0x01,0x00,0x18,0xE0,0x01,0x00,0x18,0xF0,0x01,0x00,0x18,0xB8,0x01,0x00,0x18,0x8E,0x01,0x00,0x18,0x87,0x01,0x00,0x98,0x81,0x01,0x00,0xF8,0x80,0x01,0x00,0x78,0x80,0x01,0x00,0x18,0x80,0x01, // 122 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0xFF,0xFD,0x07,0x80,0xFF,0xF9,0x0F,0x80,0x01,0x00,0x0C,0x80,0x01,0x00,0x18, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 124 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x0C,0x80,0xFF,0xF9,0x0F,0x00,0xFF,0xFD,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x06, // 125 + 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x01, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xFF,0x3F,0x00,0x38,0xFF,0x3F, // 161 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x07,0x00,0x00,0x1C,0x0E,0x00,0x00,0x0C,0x0C,0x00,0x00,0x06,0x18,0x00,0x80,0x07,0x78,0x00,0x80,0x07,0x78,0x00,0x00,0x06,0x18,0x00,0x00,0x0C,0x0C,0x00,0x00,0x1C,0x0E,0x00,0x00,0x18,0x06, // 162 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xFC,0x80,0x01,0x00,0xFE,0x80,0x01,0x00,0xC7,0x81,0x01,0x80,0xC3,0xC3,0x01,0x80,0xC1,0xFF,0x01,0x80,0xC1,0xBC,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC3,0x80,0x01,0x00,0xC3,0xC0,0x01,0x00,0x0E,0xE0,0x00,0x00,0x0C,0x7C, // 163 + 0x00,0x00,0x00,0x00,0x00,0x90,0x4F,0x00,0x00,0xF8,0xFF,0x00,0x00,0x70,0x70,0x00,0x00,0x30,0x60,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x18,0xC0,0x00,0x00,0x30,0x60,0x00,0x00,0x70,0x70,0x00,0x00,0xF8,0xFF,0x00,0x00,0x90,0x4F, // 164 + 0x80,0x01,0x00,0x00,0x80,0x63,0x06,0x00,0x00,0x6E,0x06,0x00,0x00,0x78,0x06,0x00,0x00,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01,0x00,0xC0,0x07,0x00,0x00,0xF0,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0x6E,0x06,0x00,0x80,0x63,0x06,0x00,0x80,0x01, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0xFC,0x01,0x80,0x3F,0xFC,0x01, // 166 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x03,0x00,0xDE,0x0F,0x07,0x00,0x7F,0x0C,0x0E,0x80,0x73,0x18,0x1C,0x80,0x61,0x18,0x18,0x80,0xC1,0x30,0x18,0x80,0xC1,0x30,0x18,0x00,0x87,0x61,0x0C,0x00,0x87,0xF1,0x0F,0x00,0x04,0x9F,0x07,0x00,0x00,0x0E, // 167 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03, // 168 + 0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x1C,0x38,0x00,0x00,0x06,0x60,0x00,0x00,0xE3,0xC3,0x00,0x00,0xF1,0x87,0x00,0x80,0x39,0x8E,0x01,0x80,0x1C,0x1C,0x01,0x80,0x0C,0x18,0x01,0x80,0x0C,0x18,0x01,0x80,0x0C,0x18,0x01,0x80,0x0C,0x18,0x01,0x80,0x19,0x8C,0x01,0x00,0x11,0x84,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x60,0x00,0x00,0x1C,0x38,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 169 + 0x00,0x00,0x00,0x00,0x00,0x8E,0x01,0x00,0x00,0x9F,0x01,0x00,0x80,0xB9,0x01,0x00,0x80,0xB0,0x01,0x00,0x80,0xB0,0x01,0x00,0x00,0x99,0x01,0x00,0x80,0xBF,0x01, // 170 + 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x3D,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1D,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20, // 171 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xC0,0x1F, // 172 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 173 + 0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x1C,0x38,0x00,0x00,0x06,0x60,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0x80,0x00,0x00,0xFD,0x9F,0x01,0x80,0xFC,0x1F,0x01,0x80,0x0C,0x01,0x01,0x80,0x0C,0x03,0x01,0x80,0x0C,0x0F,0x01,0x80,0x9C,0x1D,0x01,0x80,0xF9,0x99,0x01,0x00,0xF1,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x60,0x00,0x00,0x1C,0x38,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 174 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 175 + 0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x7F,0x00,0x00,0x80,0xE3,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0xC1,0x00,0x00,0x80,0xE3,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x3E, // 176 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0xF8,0xBF,0x01,0x00,0xF8,0xBF,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x83,0x01, // 177 + 0x00,0x06,0x03,0x00,0x00,0x83,0x03,0x00,0x80,0xC0,0x03,0x00,0x80,0x60,0x03,0x00,0x80,0x30,0x03,0x00,0x80,0x19,0x03,0x00,0x00,0x1F,0x03,0x00,0x00,0x0E,0x03, // 178 + 0x00,0x00,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x08,0x03,0x00,0x80,0x08,0x03,0x00,0x80,0x0C,0x03,0x00,0x80,0x9F,0x03,0x00,0x00,0xF7,0x01, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0, // 180 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 181 + 0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x00,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0xFF,0x1F,0x80,0xFF,0xFF,0x1F,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0x1F,0x80,0xFF,0xFF,0x1F, // 182 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07, // 183 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18, // 184 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x03, // 185 + 0x00,0x00,0x00,0x00,0x00,0x8E,0x01,0x00,0x00,0x9F,0x01,0x00,0x80,0xB9,0x01,0x00,0x80,0xB0,0x01,0x00,0x80,0xB0,0x01,0x00,0x80,0xB9,0x01,0x00,0x00,0x9F,0x01,0x00,0x00,0x8E,0x01, // 186 + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x07,0x00,0x00,0x20,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x1D,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x02, // 187 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x01,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x00,0xE0,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x70,0x00,0x80,0x03,0x7C,0x00,0x80,0x00,0x66,0x00,0x00,0x80,0x63,0x00,0x00,0xC0,0x60,0x00,0x00,0xE0,0xFF,0x01,0x00,0xE0,0xFF,0x01,0x00,0x00,0x60, // 188 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x80,0xFF,0x03,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x87,0x83,0x01,0x80,0xC1,0x81,0x01,0x00,0x60,0xC0,0x01,0x00,0x60,0x60,0x01,0x00,0x60,0x30,0x01,0x00,0xE0,0x18,0x01,0x00,0xC0,0x0F,0x01,0x00,0x80,0x07,0x01, // 189 + 0x00,0x00,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x08,0x03,0x00,0x80,0x08,0x03,0x00,0x80,0x0C,0x03,0x00,0x80,0x9F,0x03,0x00,0x00,0xF7,0xC1,0x01,0x00,0xE0,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0x38,0x60,0x00,0x00,0x0E,0x78,0x00,0x80,0x03,0x6E,0x00,0x00,0x00,0x63,0x00,0x00,0xC0,0x60,0x00,0x00,0xE0,0xFF,0x01,0x00,0xE0,0xFF,0x01,0x00,0x00,0x60, // 190 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x0F,0x00,0x00,0x38,0x1C,0x00,0x00,0x1C,0x38,0x00,0x38,0x0F,0x30,0x00,0x38,0x03,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03, // 191 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x07,0x00,0x04,0x78,0x06,0x00,0x0C,0x1E,0x06,0x00,0x98,0x07,0x06,0x00,0x98,0x03,0x06,0x00,0xB0,0x0F,0x06,0x00,0x00,0x3C,0x06,0x00,0x00,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 192 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x07,0x00,0x00,0x78,0x06,0x00,0x10,0x1E,0x06,0x00,0x90,0x07,0x06,0x00,0x98,0x03,0x06,0x00,0x8C,0x0F,0x06,0x00,0x0C,0x3C,0x06,0x00,0x04,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 193 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x20,0xE0,0x07,0x00,0x10,0x78,0x06,0x00,0x18,0x1E,0x06,0x00,0x8C,0x07,0x06,0x00,0x8C,0x03,0x06,0x00,0x98,0x0F,0x06,0x00,0x18,0x3C,0x06,0x00,0x10,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 194 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x07,0x00,0x18,0x78,0x06,0x00,0x0C,0x1E,0x06,0x00,0x8C,0x07,0x06,0x00,0x98,0x03,0x06,0x00,0x98,0x0F,0x06,0x00,0x1C,0x3C,0x06,0x00,0x08,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 195 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x07,0x00,0x00,0x78,0x06,0x00,0x1C,0x1E,0x06,0x00,0x9C,0x07,0x06,0x00,0x80,0x01,0x06,0x00,0x9C,0x07,0x06,0x00,0x1C,0x3E,0x06,0x00,0x00,0xF0,0x06,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x01, // 196 + 0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0x3C,0x06,0x00,0x1C,0x0F,0x06,0x00,0x92,0x03,0x06,0x00,0x92,0x03,0x06,0x00,0x0E,0x0F,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x01, // 197 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x06,0x00,0x00,0x38,0x06,0x00,0x00,0x1C,0x06,0x00,0x00,0x0F,0x06,0x00,0x80,0x03,0x06,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 198 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xC0,0x00,0x80,0x03,0x80,0x00,0x80,0x01,0x80,0x11,0x80,0x01,0x80,0x75,0x80,0x01,0x80,0x67,0x80,0x01,0x80,0x65,0x80,0x01,0x80,0x39,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x06,0x30,0x00,0x00,0x04,0x10, // 199 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x8C,0x81,0x81,0x01,0x8C,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0xB0,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 200 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x81,0x81,0x01,0x90,0x81,0x81,0x01,0x90,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0x8C,0x81,0x81,0x01,0x8C,0x81,0x81,0x01,0x84,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 201 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0xA0,0xFF,0xFF,0x01,0x90,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0x8C,0x81,0x81,0x01,0x8C,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0x98,0x81,0x81,0x01,0x90,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 202 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x9C,0x81,0x81,0x01,0x9C,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x9C,0x81,0x81,0x01,0x9C,0x81,0x81,0x01,0x80,0x81,0x81,0x01,0x80,0x81,0x81,0x01, // 203 + 0x04,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x8C,0xFF,0xFF,0x01,0x98,0xFF,0xFF,0x01,0x18,0x00,0x00,0x00,0x10, // 204 + 0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x98,0xFF,0xFF,0x01,0x8C,0xFF,0xFF,0x01,0x0C,0x00,0x00,0x00,0x04, // 205 + 0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x8C,0xFF,0xFF,0x01,0x8C,0xFF,0xFF,0x01,0x18,0x00,0x00,0x00,0x10, // 206 + 0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x1C,0x00,0x00,0x00,0x1C, // 207 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0xE0,0x00,0x00,0x0E,0x70,0x00,0x00,0x1C,0x38,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 208 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x1C,0x00,0x00,0x0C,0x38,0x00,0x00,0x0C,0xE0,0x00,0x00,0x0C,0xC0,0x01,0x00,0x18,0x80,0x07,0x00,0x18,0x00,0x0E,0x00,0x0C,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01, // 209 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x8C,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0xB0,0x01,0x80,0x01,0xB0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 210 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x80,0x01,0x80,0x01,0x90,0x01,0x80,0x01,0xB0,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 211 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x20,0x03,0xC0,0x00,0xB0,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x88,0x01,0x80,0x01,0x88,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0xB0,0x01,0x80,0x01,0x20,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 212 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x98,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x8C,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x98,0x01,0x80,0x01,0x9C,0x01,0x80,0x01,0x08,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 213 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x1F,0x00,0x00,0x3C,0x3C,0x00,0x00,0x0E,0x70,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x9C,0x01,0x80,0x01,0x9C,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x9C,0x01,0x80,0x01,0x9C,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0x60,0x00,0x00,0x0E,0x70,0x00,0x00,0x3C,0x3C,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 214 + 0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x38,0xE0,0x00,0x00,0x70,0x70,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1D,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1D,0x00,0x00,0xE0,0x38,0x00,0x00,0x70,0x70,0x00,0x00,0x38,0xE0,0x00,0x00,0x10,0x40, // 215 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x02,0x00,0x3C,0x3C,0x07,0x00,0x0E,0xF0,0x01,0x00,0x07,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00,0x03,0xD8,0x00,0x80,0x01,0x8C,0x01,0x80,0x01,0x86,0x01,0x80,0x81,0x83,0x01,0x80,0xC1,0x81,0x01,0x80,0xE1,0x80,0x01,0x80,0x31,0x80,0x01,0x00,0x1B,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x07,0xE0,0x00,0x80,0x0F,0x70,0x00,0xE0,0x1C,0x38,0x00,0x40,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 216 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x04,0x00,0xC0,0x00,0x0C,0x00,0x80,0x01,0x08,0x00,0x80,0x01,0x18,0x00,0x80,0x01,0x30,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 217 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x01,0x30,0x00,0x80,0x01,0x18,0x00,0x80,0x01,0x0C,0x00,0x80,0x01,0x0C,0x00,0x80,0x01,0x04,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 218 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x10,0x00,0xC0,0x00,0x18,0x00,0x80,0x01,0x0C,0x00,0x80,0x01,0x0C,0x00,0x80,0x01,0x0C,0x00,0x80,0x01,0x18,0x00,0x80,0x01,0x10,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 219 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x00,0x1C,0x00,0x80,0x01,0x1C,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x1C,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x80,0xFF,0x7F,0x00,0x80,0xFF,0x1F, // 220 + 0x80,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0xC0,0x03,0x00,0x18,0x00,0xFF,0x01,0x18,0x00,0xFF,0x01,0x0C,0xC0,0x03,0x00,0x0C,0xF0,0x00,0x00,0x04,0x38,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x07,0x00,0x00,0x80,0x01, // 221 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01,0x80,0xFF,0xFF,0x01,0x00,0x0C,0x18,0x00,0x00,0x0C,0x18,0x00,0x00,0x0C,0x18,0x00,0x00,0x0C,0x18,0x00,0x00,0x0C,0x18,0x00,0x00,0x0C,0x18,0x00,0x00,0x1C,0x1C,0x00,0x00,0x38,0x0C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 222 + 0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x01,0x00,0xFF,0xFF,0x01,0x00,0x03,0x78,0x00,0x80,0x01,0xF0,0x00,0x80,0xC1,0xC0,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x80,0xC1,0x80,0x01,0x00,0xE3,0xC1,0x01,0x00,0xBF,0xE3,0x00,0x00,0x1E,0x7F,0x00,0x00,0x00,0x3E, // 223 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0xC0,0x18,0x80,0x01,0xC0,0x18,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0x00,0x19,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 224 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0xC0,0x18,0x80,0x01,0xC0,0x30,0xC0,0x00,0x40,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 225 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x32,0xC0,0x00,0x00,0x1B,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x18,0x80,0x01,0x80,0x18,0x80,0x01,0x80,0x19,0x80,0x01,0x00,0x33,0xC0,0x00,0x00,0x72,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 226 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x80,0x30,0xC0,0x00,0xC0,0x19,0x80,0x01,0xC0,0x18,0x80,0x01,0xC0,0x18,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0xC0,0x31,0xC0,0x00,0x80,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 227 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x80,0x1B,0x80,0x01,0x80,0x1B,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x80,0x1B,0x80,0x01,0x80,0x33,0xC0,0x00,0x00,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 228 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0xC0,0x19,0x80,0x01,0x20,0x1A,0x80,0x01,0x20,0x1A,0x80,0x01,0xC0,0x19,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x70,0xC0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 229 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xE0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x30,0xC0,0x00,0x00,0x30,0xE0,0x00,0x00,0xE0,0x70,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01,0x00,0xE0,0x76,0x00,0x00,0x70,0xC6,0x00,0x00,0x30,0xC6,0x00,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x30,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x76,0x00,0x00,0xC0,0x37, // 230 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x70,0xC0,0x00,0x00,0x30,0x80,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x6D,0x00,0x18,0x80,0x47,0x00,0x18,0x80,0x45,0x00,0x18,0x80,0x39,0x00,0x30,0x80,0x00,0x00,0x70,0xC0,0x00,0x00,0xE0,0x60,0x00,0x00,0xC0,0x20, // 231 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x66,0x00,0x00,0x30,0xC6,0x00,0xC0,0x30,0xC6,0x00,0xC0,0x18,0x86,0x01,0x80,0x19,0x86,0x01,0x80,0x19,0x86,0x01,0x00,0x1B,0x86,0x01,0x00,0x38,0x86,0x01,0x00,0x30,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x77,0x00,0x00,0x80,0x17, // 232 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x66,0x00,0x00,0x30,0xC6,0x00,0x00,0x30,0xC6,0x00,0x00,0x19,0x86,0x01,0x00,0x19,0x86,0x01,0x80,0x19,0x86,0x01,0xC0,0x18,0x86,0x01,0xC0,0x38,0x86,0x01,0x40,0x30,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x77,0x00,0x00,0x80,0x17, // 233 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x66,0x00,0x00,0x32,0xC6,0x00,0x00,0x33,0xC6,0x00,0x00,0x19,0x86,0x01,0x80,0x19,0x86,0x01,0x80,0x18,0x86,0x01,0x80,0x19,0x86,0x01,0x00,0x3B,0x86,0x01,0x00,0x32,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x77,0x00,0x00,0x80,0x17, // 234 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x66,0x00,0x00,0x30,0xC6,0x00,0x80,0x3B,0xC6,0x01,0x80,0x1B,0x86,0x01,0x00,0x18,0x86,0x01,0x00,0x18,0x86,0x01,0x80,0x1B,0x86,0x01,0x80,0x3B,0x86,0x01,0x00,0x30,0xC6,0x00,0x00,0x70,0xE6,0x00,0x00,0xE0,0x77,0x00,0x00,0x80,0x17, // 235 + 0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xC0,0xF8,0xFF,0x01,0x80,0xF9,0xFF,0x01,0x80,0x01, // 236 + 0x00,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xF9,0xFF,0x01,0xC0,0xF8,0xFF,0x01,0x60, // 237 + 0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xF8,0xFF,0x01,0x80,0xF8,0xFF,0x01,0x80,0x01, // 238 + 0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0xF8,0xFF,0x01,0x80,0xFB,0xFF,0x01,0x80,0x03, // 239 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xF0,0x70,0x00,0x00,0x30,0xC0,0x00,0x80,0x3A,0xC0,0x01,0x80,0x1A,0x80,0x01,0x80,0x1B,0x80,0x01,0x00,0x1B,0x80,0x01,0x80,0x1F,0x80,0x01,0x80,0x3C,0xC0,0x01,0x00,0x38,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 240 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01,0x80,0x60,0x00,0x00,0xC0,0x31,0x00,0x00,0xC0,0x18,0x00,0x00,0xC0,0x18,0x00,0x00,0x80,0x19,0x00,0x00,0x80,0x19,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0xC0,0xFF,0x01, // 241 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0xC0,0x38,0xC0,0x01,0xC0,0x18,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0x00,0x19,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 242 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x00,0x38,0xC0,0x01,0x00,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0xC0,0x18,0x80,0x01,0xC0,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 243 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x32,0xC0,0x00,0x00,0x3B,0xC0,0x01,0x00,0x19,0x80,0x01,0x80,0x18,0x80,0x01,0x80,0x18,0x80,0x01,0x00,0x19,0x80,0x01,0x00,0x3B,0xC0,0x01,0x00,0x32,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 244 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x80,0x39,0xC0,0x01,0xC0,0x18,0x80,0x01,0xC0,0x18,0x80,0x01,0x80,0x19,0x80,0x01,0x80,0x19,0x80,0x01,0xC0,0x39,0xC0,0x01,0x80,0x30,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 245 + 0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x80,0x3B,0xC0,0x01,0x80,0x1B,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x80,0x1B,0x80,0x01,0x80,0x3B,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0xF0,0x00,0x00,0xE0,0x7F,0x00,0x00,0x80,0x1F, // 246 + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x33,0x00,0x00,0x60,0x33,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 247 + 0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x3F,0x01,0x00,0xE0,0xF0,0x01,0x00,0x30,0xE0,0x00,0x00,0x38,0xF0,0x00,0x00,0x18,0x98,0x01,0x00,0x18,0x8E,0x01,0x00,0x18,0x87,0x01,0x00,0x98,0x81,0x01,0x00,0xF0,0xC0,0x01,0x00,0x70,0xC0,0x00,0x00,0xF8,0xF0,0x00,0x00,0xC8,0x7F,0x00,0x00,0x80,0x1F, // 248 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0xE0,0x00,0x60,0x00,0xC0,0x01,0xC0,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x01,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 249 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x80,0x01,0xC0,0x00,0x80,0x01,0x60,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 250 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x02,0xE0,0x00,0x00,0x03,0xC0,0x01,0x00,0x01,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0xC0,0x00,0x00,0x02,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 251 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0xE0,0x00,0x80,0x03,0xC0,0x01,0x80,0x03,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x80,0x03,0x80,0x01,0x80,0x03,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0xF8,0xFF,0x01,0x00,0xF8,0xFF,0x01, // 252 + 0x00,0x08,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x07,0x20,0x00,0x00,0x3E,0x38,0x00,0x01,0xF8,0x1F,0x80,0x01,0xC0,0x07,0xC0,0x00,0xF0,0x01,0xC0,0x00,0x3C,0x00,0x60,0x80,0x0F,0x00,0x40,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x18, // 253 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x3F,0x80,0xFF,0xFF,0x3F,0x00,0xE0,0x70,0x00,0x00,0x30,0xC0,0x00,0x00,0x30,0xC0,0x00,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x18,0x80,0x01,0x00,0x38,0xC0,0x01,0x00,0x30,0xC0,0x00,0x00,0xF0,0x70,0x00,0x00,0xE0,0x3F,0x00,0x00,0x80,0x1F, // 254 + 0x00,0x08,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x07,0x00,0x80,0x03,0x3E,0x38,0x80,0x03,0xF8,0x3E,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x01,0x80,0x03,0x7C,0x00,0x80,0x03,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x00,0x00,0x00,0x18 // 255 +}; + +const uint8_t URW_Gothic_L_Book_20[] PROGMEM = { + 0x17, // Width: 23 + 0x19, // Height: 25 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x06, // 32:65535 + 0x00, 0x00, 0x0B, 0x06, // 33:0 + 0x00, 0x0B, 0x12, 0x06, // 34:11 + 0x00, 0x1D, 0x2A, 0x0B, // 35:29 + 0x00, 0x47, 0x23, 0x0B, // 36:71 + 0x00, 0x6A, 0x3B, 0x10, // 37:106 + 0x00, 0xA5, 0x37, 0x0F, // 38:165 + 0x00, 0xDC, 0x06, 0x04, // 39:220 + 0x00, 0xE2, 0x17, 0x07, // 40:226 + 0x00, 0xF9, 0x17, 0x07, // 41:249 + 0x01, 0x10, 0x1A, 0x09, // 42:272 + 0x01, 0x2A, 0x26, 0x0C, // 43:298 + 0x01, 0x50, 0x13, 0x06, // 44:336 + 0x01, 0x63, 0x16, 0x07, // 45:355 + 0x01, 0x79, 0x0B, 0x06, // 46:377 + 0x01, 0x84, 0x1D, 0x09, // 47:388 + 0x01, 0xA1, 0x27, 0x0B, // 48:417 + 0x01, 0xC8, 0x1B, 0x0B, // 49:456 + 0x01, 0xE3, 0x27, 0x0B, // 50:483 + 0x02, 0x0A, 0x27, 0x0B, // 51:522 + 0x02, 0x31, 0x27, 0x0B, // 52:561 + 0x02, 0x58, 0x27, 0x0B, // 53:600 + 0x02, 0x7F, 0x27, 0x0B, // 54:639 + 0x02, 0xA6, 0x25, 0x0B, // 55:678 + 0x02, 0xCB, 0x27, 0x0B, // 56:715 + 0x02, 0xF2, 0x26, 0x0B, // 57:754 + 0x03, 0x18, 0x0B, 0x06, // 58:792 + 0x03, 0x23, 0x0F, 0x06, // 59:803 + 0x03, 0x32, 0x2B, 0x0C, // 60:818 + 0x03, 0x5D, 0x2B, 0x0C, // 61:861 + 0x03, 0x88, 0x2A, 0x0C, // 62:904 + 0x03, 0xB2, 0x26, 0x0C, // 63:946 + 0x03, 0xD8, 0x3E, 0x11, // 64:984 + 0x04, 0x16, 0x37, 0x0F, // 65:1046 + 0x04, 0x4D, 0x27, 0x0B, // 66:1101 + 0x04, 0x74, 0x3B, 0x10, // 67:1140 + 0x04, 0xAF, 0x36, 0x0F, // 68:1199 + 0x04, 0xE5, 0x27, 0x0B, // 69:1253 + 0x05, 0x0C, 0x22, 0x0A, // 70:1292 + 0x05, 0x2E, 0x3E, 0x11, // 71:1326 + 0x05, 0x6C, 0x2F, 0x0E, // 72:1388 + 0x05, 0x9B, 0x0B, 0x05, // 73:1435 + 0x05, 0xA6, 0x1F, 0x0A, // 74:1446 + 0x05, 0xC5, 0x2B, 0x0C, // 75:1477 + 0x05, 0xF0, 0x23, 0x09, // 76:1520 + 0x06, 0x13, 0x3F, 0x12, // 77:1555 + 0x06, 0x52, 0x33, 0x0F, // 78:1618 + 0x06, 0x85, 0x3E, 0x11, // 79:1669 + 0x06, 0xC3, 0x2A, 0x0C, // 80:1731 + 0x06, 0xED, 0x3F, 0x11, // 81:1773 + 0x07, 0x2C, 0x2B, 0x0C, // 82:1836 + 0x07, 0x57, 0x23, 0x0A, // 83:1879 + 0x07, 0x7A, 0x1D, 0x09, // 84:1914 + 0x07, 0x97, 0x2B, 0x0D, // 85:1943 + 0x07, 0xC2, 0x35, 0x0E, // 86:1986 + 0x07, 0xF7, 0x49, 0x13, // 87:2039 + 0x08, 0x40, 0x2F, 0x0C, // 88:2112 + 0x08, 0x6F, 0x29, 0x0C, // 89:2159 + 0x08, 0x98, 0x23, 0x0A, // 90:2200 + 0x08, 0xBB, 0x17, 0x07, // 91:2235 + 0x08, 0xD2, 0x23, 0x0C, // 92:2258 + 0x08, 0xF5, 0x0F, 0x07, // 93:2293 + 0x09, 0x04, 0x2A, 0x0C, // 94:2308 + 0x09, 0x2E, 0x27, 0x0A, // 95:2350 + 0x09, 0x55, 0x15, 0x08, // 96:2389 + 0x09, 0x6A, 0x2F, 0x0E, // 97:2410 + 0x09, 0x99, 0x2F, 0x0E, // 98:2457 + 0x09, 0xC8, 0x2B, 0x0D, // 99:2504 + 0x09, 0xF3, 0x2F, 0x0E, // 100:2547 + 0x0A, 0x22, 0x2F, 0x0D, // 101:2594 + 0x0A, 0x51, 0x16, 0x06, // 102:2641 + 0x0A, 0x67, 0x2F, 0x0D, // 103:2663 + 0x0A, 0x96, 0x2B, 0x0C, // 104:2710 + 0x0A, 0xC1, 0x07, 0x04, // 105:2753 + 0x0A, 0xC8, 0x07, 0x04, // 106:2760 + 0x0A, 0xCF, 0x23, 0x0A, // 107:2767 + 0x0A, 0xF2, 0x07, 0x04, // 108:2802 + 0x0A, 0xF9, 0x43, 0x13, // 109:2809 + 0x0B, 0x3C, 0x2B, 0x0C, // 110:2876 + 0x0B, 0x67, 0x2F, 0x0D, // 111:2919 + 0x0B, 0x96, 0x2F, 0x0E, // 112:2966 + 0x0B, 0xC5, 0x2F, 0x0E, // 113:3013 + 0x0B, 0xF4, 0x12, 0x06, // 114:3060 + 0x0C, 0x06, 0x1B, 0x08, // 115:3078 + 0x0C, 0x21, 0x16, 0x07, // 116:3105 + 0x0C, 0x37, 0x27, 0x0C, // 117:3127 + 0x0C, 0x5E, 0x2A, 0x0B, // 118:3166 + 0x0C, 0x88, 0x3E, 0x11, // 119:3208 + 0x0C, 0xC6, 0x23, 0x0A, // 120:3270 + 0x0C, 0xE9, 0x26, 0x0B, // 121:3305 + 0x0D, 0x0F, 0x1F, 0x09, // 122:3343 + 0x0D, 0x2E, 0x13, 0x07, // 123:3374 + 0x0D, 0x41, 0x1B, 0x0D, // 124:3393 + 0x0D, 0x5C, 0x12, 0x07, // 125:3420 + 0x0D, 0x6E, 0x2A, 0x0C, // 126:3438 + 0xFF, 0xFF, 0x00, 0x0A, // 127:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 128:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 129:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 130:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 131:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 132:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 133:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 134:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 135:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 136:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 137:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 138:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 139:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 140:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 141:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 142:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 143:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 144:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 145:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 146:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 147:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 148:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 149:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 150:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 151:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 152:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 153:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 154:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 155:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 156:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 157:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 158:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 159:65535 + 0xFF, 0xFF, 0x00, 0x06, // 160:65535 + 0x0D, 0x98, 0x0B, 0x06, // 161:3480 + 0x0D, 0xA3, 0x26, 0x0B, // 162:3491 + 0x0D, 0xC9, 0x2B, 0x0B, // 163:3529 + 0x0D, 0xF4, 0x27, 0x0B, // 164:3572 + 0x0E, 0x1B, 0x29, 0x0B, // 165:3611 + 0x0E, 0x44, 0x1B, 0x0D, // 166:3652 + 0x0E, 0x5F, 0x26, 0x0C, // 167:3679 + 0x0E, 0x85, 0x11, 0x07, // 168:3717 + 0x0E, 0x96, 0x3A, 0x0F, // 169:3734 + 0x0E, 0xD0, 0x1A, 0x07, // 170:3792 + 0x0E, 0xEA, 0x1B, 0x09, // 171:3818 + 0x0F, 0x05, 0x2B, 0x0C, // 172:3845 + 0x0F, 0x30, 0x16, 0x07, // 173:3888 + 0x0F, 0x46, 0x3A, 0x0F, // 174:3910 + 0x0F, 0x80, 0x1D, 0x0A, // 175:3968 + 0x0F, 0x9D, 0x1A, 0x08, // 176:3997 + 0x0F, 0xB7, 0x27, 0x0C, // 177:4023 + 0x0F, 0xDE, 0x16, 0x07, // 178:4062 + 0x0F, 0xF4, 0x1A, 0x07, // 179:4084 + 0x10, 0x0E, 0x15, 0x08, // 180:4110 + 0x10, 0x23, 0x27, 0x0C, // 181:4131 + 0x10, 0x4A, 0x23, 0x0B, // 182:4170 + 0x10, 0x6D, 0x0A, 0x06, // 183:4205 + 0x10, 0x77, 0x13, 0x06, // 184:4215 + 0x10, 0x8A, 0x12, 0x07, // 185:4234 + 0x10, 0x9C, 0x1A, 0x07, // 186:4252 + 0x10, 0xB6, 0x1A, 0x09, // 187:4278 + 0x10, 0xD0, 0x3F, 0x11, // 188:4304 + 0x11, 0x0F, 0x3F, 0x11, // 189:4367 + 0x11, 0x4E, 0x3F, 0x11, // 190:4430 + 0x11, 0x8D, 0x27, 0x0C, // 191:4493 + 0x11, 0xB4, 0x37, 0x0F, // 192:4532 + 0x11, 0xEB, 0x37, 0x0F, // 193:4587 + 0x12, 0x22, 0x37, 0x0F, // 194:4642 + 0x12, 0x59, 0x37, 0x0F, // 195:4697 + 0x12, 0x90, 0x37, 0x0F, // 196:4752 + 0x12, 0xC7, 0x37, 0x0F, // 197:4807 + 0x12, 0xFE, 0x47, 0x14, // 198:4862 + 0x13, 0x45, 0x3B, 0x10, // 199:4933 + 0x13, 0x80, 0x27, 0x0B, // 200:4992 + 0x13, 0xA7, 0x27, 0x0B, // 201:5031 + 0x13, 0xCE, 0x27, 0x0B, // 202:5070 + 0x13, 0xF5, 0x27, 0x0B, // 203:5109 + 0x14, 0x1C, 0x0D, 0x05, // 204:5148 + 0x14, 0x29, 0x0D, 0x05, // 205:5161 + 0x14, 0x36, 0x11, 0x05, // 206:5174 + 0x14, 0x47, 0x09, 0x05, // 207:5191 + 0x14, 0x50, 0x36, 0x10, // 208:5200 + 0x14, 0x86, 0x33, 0x0F, // 209:5254 + 0x14, 0xB9, 0x3E, 0x11, // 210:5305 + 0x14, 0xF7, 0x3E, 0x11, // 211:5367 + 0x15, 0x35, 0x3E, 0x11, // 212:5429 + 0x15, 0x73, 0x3E, 0x11, // 213:5491 + 0x15, 0xB1, 0x3E, 0x11, // 214:5553 + 0x15, 0xEF, 0x2B, 0x0C, // 215:5615 + 0x16, 0x1A, 0x3E, 0x11, // 216:5658 + 0x16, 0x58, 0x2B, 0x0D, // 217:5720 + 0x16, 0x83, 0x2B, 0x0D, // 218:5763 + 0x16, 0xAE, 0x2B, 0x0D, // 219:5806 + 0x16, 0xD9, 0x2B, 0x0D, // 220:5849 + 0x17, 0x04, 0x29, 0x0C, // 221:5892 + 0x17, 0x2D, 0x2A, 0x0C, // 222:5933 + 0x17, 0x57, 0x27, 0x0B, // 223:5975 + 0x17, 0x7E, 0x2F, 0x0E, // 224:6014 + 0x17, 0xAD, 0x2F, 0x0E, // 225:6061 + 0x17, 0xDC, 0x2F, 0x0E, // 226:6108 + 0x18, 0x0B, 0x2F, 0x0E, // 227:6155 + 0x18, 0x3A, 0x2F, 0x0E, // 228:6202 + 0x18, 0x69, 0x2F, 0x0E, // 229:6249 + 0x18, 0x98, 0x57, 0x17, // 230:6296 + 0x18, 0xEF, 0x2F, 0x0D, // 231:6383 + 0x19, 0x1E, 0x2F, 0x0D, // 232:6430 + 0x19, 0x4D, 0x2F, 0x0D, // 233:6477 + 0x19, 0x7C, 0x2F, 0x0D, // 234:6524 + 0x19, 0xAB, 0x2E, 0x0D, // 235:6571 + 0x19, 0xD9, 0x09, 0x04, // 236:6617 + 0x19, 0xE2, 0x09, 0x04, // 237:6626 + 0x19, 0xEB, 0x0D, 0x04, // 238:6635 + 0x19, 0xF8, 0x0D, 0x04, // 239:6648 + 0x1A, 0x05, 0x2F, 0x0D, // 240:6661 + 0x1A, 0x34, 0x2B, 0x0C, // 241:6708 + 0x1A, 0x5F, 0x2F, 0x0D, // 242:6751 + 0x1A, 0x8E, 0x2F, 0x0D, // 243:6798 + 0x1A, 0xBD, 0x2F, 0x0D, // 244:6845 + 0x1A, 0xEC, 0x2F, 0x0D, // 245:6892 + 0x1B, 0x1B, 0x2F, 0x0D, // 246:6939 + 0x1B, 0x4A, 0x26, 0x0C, // 247:6986 + 0x1B, 0x70, 0x2F, 0x0D, // 248:7024 + 0x1B, 0x9F, 0x27, 0x0C, // 249:7071 + 0x1B, 0xC6, 0x27, 0x0C, // 250:7110 + 0x1B, 0xED, 0x27, 0x0C, // 251:7149 + 0x1C, 0x14, 0x27, 0x0C, // 252:7188 + 0x1C, 0x3B, 0x26, 0x0B, // 253:7227 + 0x1C, 0x61, 0x2F, 0x0E, // 254:7265 + 0x1C, 0x90, 0x26, 0x0B, // 255:7312 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0E, // 33 + 0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03, // 34 + 0x00,0x44,0x00,0x00,0x00,0x44,0x0C,0x00,0x00,0xE4,0x0F,0x00,0x00,0x7F,0x00,0x00,0xE0,0x47,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x0F,0x00,0x00,0xFC,0x03,0x00,0xE0,0x5F,0x00,0x00,0x60,0x44,0x00,0x00,0x00,0x44, // 35 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x87,0x03,0x00,0xC0,0x08,0x06,0x00,0x40,0x08,0x04,0x00,0x70,0x10,0x1C,0x00,0x40,0x10,0x04,0x00,0xC0,0x30,0x06,0x00,0x80,0xC1,0x03, // 36 + 0x80,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x0E,0x00,0x40,0x84,0x07,0x00,0x80,0xE3,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x8E,0x03,0x00,0xC0,0x43,0x04,0x00,0xE0,0x20,0x08,0x00,0x20,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x40,0x04,0x00,0x00,0x80,0x03, // 37 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x30,0x04,0x00,0x80,0x13,0x0C,0x00,0x40,0x1E,0x08,0x00,0x20,0x0C,0x08,0x00,0x20,0x1C,0x08,0x00,0x20,0x3C,0x0C,0x00,0x40,0x66,0x06,0x00,0x80,0xC3,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x78,0x03,0x00,0x00,0x1C,0x06,0x00,0x00,0x04,0x0C, // 38 + 0x00,0x00,0x00,0x00,0xE0,0x03, // 39 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0x40,0x00,0x10,0x00,0x60,0x00,0x20, // 40 + 0x00,0x00,0x00,0x00,0x60,0x00,0x20,0x00,0xC0,0x00,0x10,0x00,0x80,0x01,0x08,0x00,0x00,0x07,0x07,0x00,0x00,0xFC,0x01, // 41 + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0xC0,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0x60,0x0D,0x00,0x00,0x00,0x01, // 42 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x06, // 44 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1E,0x00,0x00,0xC0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x20, // 47 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0xC0,0x00,0x06,0x00,0x60,0x00,0x0C,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x60,0x00,0x0C,0x00,0xC0,0x00,0x06,0x00,0x80,0xFF,0x03, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 49 + 0x00,0x00,0x00,0x00,0x00,0x03,0x08,0x00,0xC0,0x03,0x0E,0x00,0x60,0x00,0x0B,0x00,0x20,0x80,0x09,0x00,0x20,0xC0,0x08,0x00,0x20,0x60,0x08,0x00,0x20,0x30,0x08,0x00,0x40,0x18,0x08,0x00,0x80,0x0F,0x08, // 50 + 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x80,0x81,0x07,0x00,0xC0,0x01,0x0C,0x00,0x20,0x00,0x08,0x00,0x20,0x08,0x08,0x00,0x20,0x18,0x08,0x00,0x40,0x1C,0x08,0x00,0x80,0x37,0x04,0x00,0x00,0xE0,0x03, // 51 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0x38,0x01,0x00,0x00,0x0C,0x01,0x00,0x00,0x07,0x01,0x00,0x80,0x01,0x01,0x00,0xE0,0x00,0x01,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x01, // 52 + 0x00,0x80,0x00,0x00,0x00,0x88,0x03,0x00,0xE0,0x1F,0x06,0x00,0xE0,0x0C,0x0C,0x00,0x20,0x04,0x08,0x00,0x20,0x04,0x08,0x00,0x20,0x04,0x08,0x00,0x20,0x08,0x04,0x00,0x20,0x18,0x06,0x00,0x00,0xE0,0x01, // 53 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x18,0x06,0x00,0x00,0x0E,0x04,0x00,0x80,0x07,0x08,0x00,0xC0,0x04,0x08,0x00,0x60,0x04,0x08,0x00,0x00,0x0C,0x0C,0x00,0x00,0x18,0x06,0x00,0x00,0xE0,0x01, // 54 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x0E,0x00,0x20,0x80,0x03,0x00,0x20,0xF0,0x00,0x00,0x20,0x3C,0x00,0x00,0x20,0x07,0x00,0x00,0xE0,0x01,0x00,0x00,0x60, // 55 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x80,0x37,0x06,0x00,0x40,0x1C,0x0C,0x00,0x20,0x08,0x08,0x00,0x20,0x08,0x08,0x00,0x20,0x08,0x08,0x00,0x40,0x1C,0x0C,0x00,0x80,0x37,0x06,0x00,0x00,0xE0,0x03, // 56 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x30,0x00,0x00,0x60,0x60,0x00,0x00,0x20,0x40,0x0C,0x00,0x20,0x40,0x06,0x00,0x20,0xC0,0x03,0x00,0x40,0xE0,0x00,0x00,0xC0,0x30,0x00,0x00,0x00,0x1F, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x0E,0x06, // 59 + 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xB0,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x18,0x01,0x00,0x00,0x08,0x03,0x00,0x00,0x0C,0x02,0x00,0x00,0x04,0x06,0x00,0x00,0x06,0x04, // 60 + 0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01, // 61 + 0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x04,0x06,0x00,0x00,0x0C,0x02,0x00,0x00,0x08,0x03,0x00,0x00,0x18,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0xB0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60, // 62 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0xC0,0x0E,0x00,0x20,0x30,0x00,0x00,0x20,0x18,0x00,0x00,0x40,0x0C,0x00,0x00,0x80,0x07, // 63 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0xF0,0x04,0x00,0x40,0x8C,0x05,0x00,0x20,0x02,0x09,0x00,0x20,0x01,0x09,0x00,0x20,0x81,0x09,0x00,0x20,0xC1,0x09,0x00,0x20,0xFF,0x09,0x00,0x20,0x0E,0x0D,0x00,0x40,0x01,0x05,0x00,0xC0,0x80,0x06,0x00,0x80,0x61,0x00,0x00,0x00,0x3E, // 64 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x4F,0x00,0x00,0xE0,0x41,0x00,0x00,0x60,0x40,0x00,0x00,0xC0,0x43,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x40,0x18,0x08,0x00,0x80,0x2F,0x04,0x00,0x00,0xC0,0x03, // 66 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0xC0,0x00,0x06,0x00,0x80,0x01,0x03,0x00,0x00,0x01,0x01, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x00,0x08, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10, // 70 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x20,0x20,0x08,0x00,0x20,0x20,0x08,0x00,0x20,0x20,0x08,0x00,0x20,0x20,0x08,0x00,0x20,0x20,0x08,0x00,0x60,0x20,0x0C,0x00,0x40,0x20,0x06,0x00,0x80,0x21,0x03,0x00,0x00,0xE1,0x01,0x00,0x00,0xE0, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0xE0,0xFF,0x0F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 73 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0xE0,0xFF,0x03, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0xC3,0x01,0x00,0x80,0x01,0x03,0x00,0xE0,0x00,0x0E,0x00,0x60,0x00,0x0C, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0xC0,0x03,0x00,0x00,0x70,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x0F, // 78 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x40,0x10,0x00,0x00,0x80,0x0F, // 80 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xC3,0x01,0x00,0x80,0x40,0x03,0x00,0x40,0x40,0x04,0x00,0x40,0x40,0x04,0x00,0x20,0x40,0x08,0x00,0x20,0x40,0x08,0x00,0x20,0xC0,0x08,0x00,0x20,0x80,0x08,0x00,0x20,0x80,0x09,0x00,0x40,0x00,0x0F,0x00,0x40,0x00,0x06,0x00,0x80,0x00,0x06,0x00,0x00,0x83,0x0B,0x00,0x00,0xFC,0x08, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0xE0,0x00,0x00,0x20,0xA0,0x01,0x00,0x60,0x30,0x07,0x00,0xC0,0x10,0x0C,0x00,0x80,0x0F,0x08, // 82 + 0x00,0x00,0x00,0x00,0x80,0x07,0x03,0x00,0x40,0x0C,0x04,0x00,0x20,0x18,0x08,0x00,0x20,0x18,0x08,0x00,0x20,0x18,0x08,0x00,0x20,0x30,0x08,0x00,0x40,0x30,0x04,0x00,0x80,0xC1,0x03, // 83 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x01, // 85 + 0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0x20, // 86 + 0x20,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x0C,0x00,0x00,0xC0,0x07,0x00,0x00,0xFC,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0F,0x00,0x00,0xF0,0x01,0x00,0x00,0x3E,0x00,0x00,0xE0,0x03,0x00,0x00,0x60, // 87 + 0x00,0x00,0x08,0x00,0x60,0x00,0x0C,0x00,0xE0,0x00,0x07,0x00,0x80,0x83,0x03,0x00,0x00,0xE6,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xEE,0x00,0x00,0x80,0x83,0x01,0x00,0xC0,0x00,0x07,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x08, // 88 + 0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x20, // 89 + 0x00,0x00,0x08,0x00,0x20,0x00,0x0E,0x00,0x20,0x80,0x0B,0x00,0x20,0xE0,0x08,0x00,0x20,0x70,0x08,0x00,0x20,0x1C,0x08,0x00,0x20,0x07,0x08,0x00,0xE0,0x01,0x08,0x00,0x60,0x00,0x08, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x20, // 91 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0C, // 92 + 0x60,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x80,0x00,0x18,0x00,0x00,0xFF,0x0F, // 93 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0, // 94 + 0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xC0, // 96 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 97 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x0C,0x06,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 98 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x06,0x0C,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06, // 99 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0xE0,0xFF,0x0F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x58,0x03,0x00,0x00,0x44,0x04,0x00,0x00,0x46,0x0C,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x46,0x08,0x00,0x00,0x44,0x04,0x00,0x00,0x58,0x03,0x00,0x00,0x70,0x01, // 101 + 0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0xFF,0x0F,0x00,0x40,0x02,0x00,0x00,0x60,0x02,0x00,0x00,0x20,0x02, // 102 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x11,0x00,0x00,0x08,0x32,0x00,0x00,0x04,0x44,0x00,0x00,0x02,0xC8,0x00,0x00,0x02,0x88,0x00,0x00,0x02,0x88,0x00,0x00,0x02,0x88,0x00,0x00,0x02,0x88,0x00,0x00,0x04,0x44,0x00,0x00,0x0C,0x66,0x00,0x00,0xFE,0x1F, // 103 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF0,0x0F, // 104 + 0x00,0x00,0x00,0x00,0xE0,0xFE,0x0F, // 105 + 0x00,0x00,0xC0,0x00,0xE0,0xFE,0x3F, // 106 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06,0x00,0x00,0x06,0x0C,0x00,0x00,0x02,0x08, // 107 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 108 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF8,0x0F, // 109 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF8,0x0F, // 110 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 111 + 0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0x00,0x0C,0x06,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 112 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0xFF, // 113 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02, // 114 + 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x00,0x00,0x26,0x0C,0x00,0x00,0x62,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0xC2,0x0C,0x00,0x00,0x8C,0x07, // 115 + 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x02,0x00,0x00,0x00,0x02, // 116 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0xFE,0x0F, // 117 + 0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x02, // 118 + 0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,0xC0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x07,0x00,0x00,0xE0,0x01,0x00,0x00,0x3C,0x00,0x00,0x00,0x0E, // 119 + 0x00,0x00,0x08,0x00,0x00,0x06,0x0C,0x00,0x00,0x0C,0x06,0x00,0x00,0xB8,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x18,0x03,0x00,0x00,0x0E,0x0E,0x00,0x00,0x02,0x08, // 120 + 0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0xC1,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x07,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x06, // 121 + 0x00,0x02,0x08,0x00,0x00,0x02,0x0E,0x00,0x00,0x02,0x0B,0x00,0x00,0xC2,0x09,0x00,0x00,0x62,0x08,0x00,0x00,0x3A,0x08,0x00,0x00,0x0E,0x08,0x00,0x00,0x06,0x08, // 122 + 0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0xC0,0xDF,0x3F,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 124 + 0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xC0,0xDF,0x3F,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 125 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xFF, // 161 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x83,0x01,0x00,0x00,0x01,0x01,0x00,0xC0,0x01,0x07,0x00,0x00,0x01,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0xC6,0x00,0x00,0x00,0x44, // 162 + 0x00,0x10,0x00,0x00,0x00,0x1F,0x08,0x00,0xC0,0x18,0x08,0x00,0x60,0x30,0x08,0x00,0x20,0x70,0x0C,0x00,0x20,0xD0,0x0F,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x40,0x10,0x08,0x00,0x80,0x01,0x04,0x00,0x00,0x80,0x03, // 163 + 0x00,0x00,0x00,0x00,0x00,0xFA,0x07,0x00,0x00,0x0C,0x03,0x00,0x00,0x06,0x06,0x00,0x00,0x02,0x04,0x00,0x00,0x02,0x04,0x00,0x00,0x02,0x04,0x00,0x00,0x06,0x06,0x00,0x00,0x0C,0x03,0x00,0x00,0xFE,0x05, // 164 + 0x20,0x00,0x00,0x00,0xE0,0x48,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x70,0x00,0x00,0x00,0x4C,0x00,0x00,0x80,0x4B,0x00,0x00,0xE0,0x48,0x00,0x00,0x20, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xC7,0x0F, // 166 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x18,0x00,0xC0,0xCF,0x30,0x00,0x60,0x86,0x60,0x00,0x20,0x8C,0x41,0x00,0x20,0x08,0x43,0x00,0x60,0x18,0x22,0x00,0xC0,0x10,0x1D,0x00,0x00,0xE0, // 167 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0, // 168 + 0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x7C,0x04,0x00,0x40,0xC6,0x04,0x00,0x20,0x83,0x09,0x00,0x20,0x01,0x09,0x00,0x20,0x01,0x09,0x00,0x20,0x01,0x09,0x00,0x20,0x83,0x09,0x00,0x40,0x82,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 169 + 0x00,0x00,0x00,0x00,0xC0,0x23,0x00,0x00,0x60,0x26,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x24,0x00,0x00,0x60,0x22,0x00,0x00,0xE0,0x27, // 170 + 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x9C,0x03, // 171 + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x01, // 172 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 173 + 0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x20,0xFF,0x09,0x00,0x20,0x11,0x08,0x00,0x20,0x71,0x08,0x00,0x20,0xD1,0x08,0x00,0x20,0x0E,0x09,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 174 + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 175 + 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0C,0x00,0x00,0x40,0x08,0x00,0x00,0x40,0x08,0x00,0x00,0xC0,0x0C,0x00,0x00,0x80,0x07, // 176 + 0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0xFE,0x0B,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08, // 177 + 0xC0,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x28,0x00,0x00,0x20,0x24,0x00,0x00,0x60,0x22,0x00,0x00,0xC0,0x21, // 178 + 0x00,0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0xE0,0x30,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x23,0x00,0x00,0xC0,0x33,0x00,0x00,0x00,0x1C, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20, // 180 + 0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0xFE,0x0F, // 181 + 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0xFF,0x3F, // 182 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70, // 183 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xE0, // 184 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x3F, // 185 + 0x00,0x00,0x00,0x00,0xC0,0x23,0x00,0x00,0x60,0x26,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x24,0x00,0x00,0x60,0x26,0x00,0x00,0xC0,0x23, // 186 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x03,0x00,0x00,0xF8,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x03,0x00,0x00,0xF0, // 187 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0x01,0x03,0x00,0x60,0xC0,0x02,0x00,0x00,0x60,0x02,0x00,0x00,0x18,0x02,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x02, // 188 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x30,0x0C,0x00,0x20,0x18,0x0C,0x00,0x00,0x08,0x0A,0x00,0x00,0x08,0x09,0x00,0x00,0x98,0x08,0x00,0x00,0x70,0x08, // 189 + 0x00,0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0xE0,0x30,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x23,0x00,0x00,0xC0,0x33,0x08,0x00,0x00,0x1C,0x06,0x00,0x00,0x80,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x03,0x03,0x00,0xC0,0xC0,0x02,0x00,0x20,0x60,0x02,0x00,0x00,0x18,0x02,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x02, // 190 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x83,0x00,0x00,0x80,0x81,0x00,0x00,0x6E,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30, // 191 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x02,0x4F,0x00,0x00,0xE6,0x41,0x00,0x00,0x64,0x40,0x00,0x00,0xC8,0x43,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E, // 192 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x4F,0x00,0x00,0xEC,0x41,0x00,0x00,0x64,0x40,0x00,0x00,0xC6,0x43,0x00,0x00,0x02,0x4F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E, // 193 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x00,0x00,0x08,0x7C,0x00,0x00,0x0C,0x4F,0x00,0x00,0xE6,0x41,0x00,0x00,0x62,0x40,0x00,0x00,0xC4,0x43,0x00,0x00,0x0C,0x4F,0x00,0x00,0x08,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E, // 194 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x0C,0x4F,0x00,0x00,0xE4,0x41,0x00,0x00,0x6C,0x40,0x00,0x00,0xC8,0x43,0x00,0x00,0x0C,0x4F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x0E, // 195 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x5E,0x00,0x00,0xCE,0x43,0x00,0x00,0xE0,0x40,0x00,0x00,0xE0,0x41,0x00,0x00,0x8E,0x47,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x08, // 196 + 0x00,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x5E,0x00,0x00,0x86,0x47,0x00,0x00,0xE9,0x40,0x00,0x00,0xE9,0x40,0x00,0x00,0xC6,0x43,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0C, // 197 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x47,0x00,0x00,0x80,0x41,0x00,0x00,0x60,0x40,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08, // 198 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x06,0x00,0x40,0x00,0x04,0x00,0x20,0x00,0x88,0x00,0x20,0x00,0x38,0x01,0x20,0x00,0x28,0x01,0x20,0x00,0xE8,0x00,0x60,0x00,0x0C,0x00,0x40,0x00,0x04,0x00,0xC0,0x00,0x06,0x00,0x80,0x03,0x03,0x00,0x00,0x02,0x01, // 199 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x22,0x10,0x08,0x00,0x26,0x10,0x08,0x00,0x24,0x10,0x08,0x00,0x2C,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x00,0x08, // 200 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x08,0x00,0x2C,0x10,0x08,0x00,0x24,0x10,0x08,0x00,0x26,0x10,0x08,0x00,0x22,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x00,0x08, // 201 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x28,0x10,0x08,0x00,0x24,0x10,0x08,0x00,0x22,0x10,0x08,0x00,0x26,0x10,0x08,0x00,0x2C,0x10,0x08,0x00,0x28,0x10,0x08,0x00,0x20,0x00,0x08, // 202 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x2E,0x10,0x08,0x00,0x2E,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x2E,0x10,0x08,0x00,0x2E,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x00,0x08, // 203 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE4,0xFF,0x0F,0x00,0x0C, // 204 + 0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE6,0xFF,0x0F,0x00,0x02, // 205 + 0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xE2,0xFF,0x0F,0x00,0x04,0x00,0x00,0x00,0x08, // 206 + 0x0E,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x0E, // 207 + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x00,0x08,0x00,0x60,0x00,0x0C,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x06,0x00,0x00,0x83,0x01,0x00,0x00,0xFE, // 208 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x0C,0x03,0x00,0x00,0x04,0x0E,0x00,0x00,0x04,0x18,0x00,0x00,0x08,0x70,0x00,0x00,0x0C,0xC0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x0F, // 209 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x26,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x2C,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 210 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x20,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x2C,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x26,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 211 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x48,0x00,0x04,0x00,0x28,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x22,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x48,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 212 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x2C,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x24,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x2C,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 213 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x83,0x01,0x00,0x80,0x00,0x02,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x2E,0x00,0x08,0x00,0x2E,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x2E,0x00,0x08,0x00,0x2E,0x00,0x08,0x00,0x40,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x02,0x00,0x00,0x83,0x01,0x00,0x00,0x7C, // 214 + 0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,0x0E,0x06,0x00,0x00,0x1C,0x03,0x00,0x00,0xB8,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x98,0x03,0x00,0x00,0x0C,0x07,0x00,0x00,0x06,0x06, // 215 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x83,0x1B,0x00,0x80,0x00,0x0E,0x00,0x40,0x00,0x06,0x00,0x40,0x80,0x0F,0x00,0x20,0xC0,0x08,0x00,0x20,0x60,0x08,0x00,0x20,0x38,0x08,0x00,0x20,0x0C,0x08,0x00,0x20,0x06,0x08,0x00,0xE0,0x03,0x04,0x00,0xC0,0x00,0x04,0x00,0xE0,0x00,0x02,0x00,0xB0,0x83,0x01,0x00,0x00,0x7E, // 216 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x0C,0x00,0x06,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x0C,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x01, // 217 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x06,0x00,0x08,0x00,0x02,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x01, // 218 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x08,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x08,0x00,0x02,0x00,0x08,0x00,0x06,0x00,0x08,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x06,0x00,0xE0,0xFF,0x01, // 219 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x0E,0x00,0x08,0x00,0x0E,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0xE0,0xFF,0x01, // 220 + 0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x38,0x00,0x00,0x04,0xE0,0x0F,0x00,0x06,0x38,0x00,0x00,0x02,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x20, // 221 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x82,0x00,0x00,0x00,0x7C, // 222 + 0x00,0x00,0x00,0x00,0x80,0xFF,0x0F,0x00,0x40,0x00,0x07,0x00,0x20,0x00,0x06,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x00,0x40,0x38,0x08,0x00,0x80,0x27,0x04,0x00,0x00,0xC0,0x03, // 223 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x20,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 224 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x20,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 225 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x80,0x04,0x04,0x00,0x80,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x80,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 226 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x60,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x20,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 227 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 228 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x90,0x02,0x08,0x00,0x90,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F, // 229 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0xFE,0x0F,0x00,0x00,0x5C,0x06,0x00,0x00,0x44,0x04,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x46,0x0C,0x00,0x00,0x4C,0x04,0x00,0x00,0x78,0x03,0x00,0x00,0x70,0x01, // 230 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x03,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x0C,0x00,0x00,0x02,0x88,0x00,0x00,0x02,0x38,0x01,0x00,0x02,0x28,0x01,0x00,0x02,0xEC,0x00,0x00,0x06,0x04,0x00,0x00,0x0C,0x06,0x00,0x00,0x08,0x02, // 231 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x58,0x03,0x00,0x00,0x44,0x04,0x00,0x20,0x46,0x0C,0x00,0x60,0x42,0x08,0x00,0x40,0x42,0x08,0x00,0xC0,0x42,0x08,0x00,0x00,0x46,0x08,0x00,0x00,0x44,0x04,0x00,0x00,0x58,0x03,0x00,0x00,0x70,0x01, // 232 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x58,0x03,0x00,0x00,0x44,0x04,0x00,0x00,0x46,0x0C,0x00,0x80,0x42,0x08,0x00,0x40,0x42,0x08,0x00,0x60,0x42,0x08,0x00,0x20,0x46,0x08,0x00,0x00,0x44,0x04,0x00,0x00,0x58,0x03,0x00,0x00,0x70,0x01, // 233 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x58,0x03,0x00,0x80,0x44,0x04,0x00,0xC0,0x46,0x0C,0x00,0x60,0x42,0x08,0x00,0x20,0x42,0x08,0x00,0x60,0x42,0x08,0x00,0xC0,0x46,0x08,0x00,0x80,0x44,0x04,0x00,0x00,0x58,0x03,0x00,0x00,0x70,0x01, // 234 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x48,0x02,0x00,0x00,0x44,0x04,0x00,0xE0,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0x00,0x42,0x08,0x00,0xE0,0x42,0x08,0x00,0x00,0x46,0x0C,0x00,0x00,0x4C,0x06,0x00,0x00,0x78,0x03,0x00,0x00,0x60, // 235 + 0x20,0x00,0x00,0x00,0x60,0xFE,0x0F,0x00,0x40, // 236 + 0xC0,0x00,0x00,0x00,0x60,0xFE,0x0F,0x00,0x20, // 237 + 0x60,0x00,0x00,0x00,0x20,0xFE,0x0F,0x00,0x60,0x00,0x00,0x00,0xC0, // 238 + 0xE0,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0, // 239 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0xA0,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0xC0,0x03,0x08,0x00,0x20,0x03,0x08,0x00,0x00,0x06,0x04,0x00,0x00,0x0C,0x02,0x00,0x00,0xF0,0x01, // 240 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x0C,0x00,0x00,0x60,0x06,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x04,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF8,0x0F, // 241 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x20,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 242 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 243 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x80,0x04,0x04,0x00,0xC0,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0xC0,0x02,0x08,0x00,0x80,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 244 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0x60,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x20,0x02,0x08,0x00,0x40,0x02,0x08,0x00,0x60,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 245 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x02,0x00,0x00,0x04,0x04,0x00,0xE0,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0xE0,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 246 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 247 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x08,0x0E,0x00,0x00,0x04,0x06,0x00,0x00,0x02,0x0B,0x00,0x00,0x82,0x09,0x00,0x00,0xE2,0x08,0x00,0x00,0x32,0x08,0x00,0x00,0x1A,0x08,0x00,0x00,0x0C,0x04,0x00,0x00,0x0E,0x02,0x00,0x00,0xF8,0x01, // 248 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x08,0x00,0x60,0x00,0x08,0x00,0x40,0x00,0x08,0x00,0xC0,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0xFE,0x0F, // 249 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0xC0,0x00,0x08,0x00,0x40,0x00,0x08,0x00,0x60,0x00,0x08,0x00,0x20,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0xFE,0x0F, // 250 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x80,0x00,0x04,0x00,0xC0,0x00,0x08,0x00,0x60,0x00,0x08,0x00,0x20,0x00,0x08,0x00,0x60,0x00,0x08,0x00,0xC0,0x00,0x0C,0x00,0x80,0x00,0x06,0x00,0x00,0xFE,0x0F, // 251 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0xE0,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0xE0,0x00,0x08,0x00,0xE0,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0xFE,0x0F, // 252 + 0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0xC1,0x00,0xC0,0x00,0x7F,0x00,0x40,0x00,0x1E,0x00,0x60,0x80,0x07,0x00,0x30,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x06, // 253 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x0C,0x06,0x00,0x00,0x04,0x04,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x02,0x00,0x00,0xF0,0x01, // 254 + 0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xF8,0x00,0x00,0xE0,0xC0,0xE7,0x00,0x00,0x00,0x3E,0x00,0xE0,0x00,0x0F,0x00,0xE0,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x02 // 255 +}; + +#define FONT_LIB_V3 + +const uint8_t Open_Sans_Regular_20[] PROGMEM = { + 0x13, // Width: 19 + 0x1C, // Height: 28 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x05, // 32:65535 + 0x00, 0x00, 0x0F, 0x05, // 33:0 + 0x00, 0x0F, 0x1A, 0x08, // 34:15 + 0x00, 0x29, 0x2F, 0x0D, // 35:41 + 0x00, 0x58, 0x27, 0x0B, // 36:88 + 0x00, 0x7F, 0x3B, 0x10, // 37:127 + 0x00, 0xBA, 0x37, 0x0F, // 38:186 + 0x00, 0xF1, 0x0A, 0x04, // 39:241 + 0x00, 0xFB, 0x14, 0x06, // 40:251 + 0x01, 0x0F, 0x13, 0x06, // 41:271 + 0x01, 0x22, 0x26, 0x0B, // 42:290 + 0x01, 0x48, 0x26, 0x0B, // 43:328 + 0x01, 0x6E, 0x0F, 0x05, // 44:366 + 0x01, 0x7D, 0x13, 0x06, // 45:381 + 0x01, 0x90, 0x0F, 0x05, // 46:400 + 0x01, 0x9F, 0x1A, 0x07, // 47:415 + 0x01, 0xB9, 0x27, 0x0B, // 48:441 + 0x01, 0xE0, 0x1B, 0x0B, // 49:480 + 0x01, 0xFB, 0x27, 0x0B, // 50:507 + 0x02, 0x22, 0x27, 0x0B, // 51:546 + 0x02, 0x49, 0x2B, 0x0B, // 52:585 + 0x02, 0x74, 0x27, 0x0B, // 53:628 + 0x02, 0x9B, 0x27, 0x0B, // 54:667 + 0x02, 0xC2, 0x26, 0x0B, // 55:706 + 0x02, 0xE8, 0x27, 0x0B, // 56:744 + 0x03, 0x0F, 0x27, 0x0B, // 57:783 + 0x03, 0x36, 0x0F, 0x05, // 58:822 + 0x03, 0x45, 0x0E, 0x05, // 59:837 + 0x03, 0x53, 0x27, 0x0B, // 60:851 + 0x03, 0x7A, 0x27, 0x0B, // 61:890 + 0x03, 0xA1, 0x26, 0x0B, // 62:929 + 0x03, 0xC7, 0x1E, 0x09, // 63:967 + 0x03, 0xE5, 0x43, 0x12, // 64:997 + 0x04, 0x28, 0x33, 0x0D, // 65:1064 + 0x04, 0x5B, 0x2F, 0x0D, // 66:1115 + 0x04, 0x8A, 0x2F, 0x0D, // 67:1162 + 0x04, 0xB9, 0x37, 0x0F, // 68:1209 + 0x04, 0xF0, 0x27, 0x0B, // 69:1264 + 0x05, 0x17, 0x26, 0x0A, // 70:1303 + 0x05, 0x3D, 0x33, 0x0F, // 71:1341 + 0x05, 0x70, 0x33, 0x0F, // 72:1392 + 0x05, 0xA3, 0x0F, 0x06, // 73:1443 + 0x05, 0xB2, 0x0C, 0x05, // 74:1458 + 0x05, 0xBE, 0x2F, 0x0C, // 75:1470 + 0x05, 0xED, 0x27, 0x0A, // 76:1517 + 0x06, 0x14, 0x3F, 0x12, // 77:1556 + 0x06, 0x53, 0x33, 0x0F, // 78:1619 + 0x06, 0x86, 0x3B, 0x10, // 79:1670 + 0x06, 0xC1, 0x2A, 0x0C, // 80:1729 + 0x06, 0xEB, 0x3B, 0x10, // 81:1771 + 0x07, 0x26, 0x2B, 0x0C, // 82:1830 + 0x07, 0x51, 0x27, 0x0B, // 83:1873 + 0x07, 0x78, 0x2A, 0x0B, // 84:1912 + 0x07, 0xA2, 0x33, 0x0F, // 85:1954 + 0x07, 0xD5, 0x2E, 0x0C, // 86:2005 + 0x08, 0x03, 0x4A, 0x13, // 87:2051 + 0x08, 0x4D, 0x2F, 0x0C, // 88:2125 + 0x08, 0x7C, 0x2A, 0x0B, // 89:2172 + 0x08, 0xA6, 0x27, 0x0B, // 90:2214 + 0x08, 0xCD, 0x18, 0x07, // 91:2253 + 0x08, 0xE5, 0x1B, 0x07, // 92:2277 + 0x09, 0x00, 0x14, 0x07, // 93:2304 + 0x09, 0x14, 0x27, 0x0B, // 94:2324 + 0x09, 0x3B, 0x24, 0x09, // 95:2363 + 0x09, 0x5F, 0x1E, 0x0C, // 96:2399 + 0x09, 0x7D, 0x23, 0x0B, // 97:2429 + 0x09, 0xA0, 0x2B, 0x0C, // 98:2464 + 0x09, 0xCB, 0x23, 0x0A, // 99:2507 + 0x09, 0xEE, 0x27, 0x0C, // 100:2542 + 0x0A, 0x15, 0x27, 0x0B, // 101:2581 + 0x0A, 0x3C, 0x1A, 0x07, // 102:2620 + 0x0A, 0x56, 0x2A, 0x0B, // 103:2646 + 0x0A, 0x80, 0x27, 0x0C, // 104:2688 + 0x0A, 0xA7, 0x0B, 0x05, // 105:2727 + 0x0A, 0xB2, 0x0C, 0x05, // 106:2738 + 0x0A, 0xBE, 0x27, 0x0B, // 107:2750 + 0x0A, 0xE5, 0x0B, 0x05, // 108:2789 + 0x0A, 0xF0, 0x43, 0x13, // 109:2800 + 0x0B, 0x33, 0x27, 0x0C, // 110:2867 + 0x0B, 0x5A, 0x2B, 0x0C, // 111:2906 + 0x0B, 0x85, 0x2B, 0x0C, // 112:2949 + 0x0B, 0xB0, 0x28, 0x0C, // 113:2992 + 0x0B, 0xD8, 0x1E, 0x08, // 114:3032 + 0x0B, 0xF6, 0x23, 0x0A, // 115:3062 + 0x0C, 0x19, 0x1B, 0x07, // 116:3097 + 0x0C, 0x34, 0x27, 0x0C, // 117:3124 + 0x0C, 0x5B, 0x26, 0x0A, // 118:3163 + 0x0C, 0x81, 0x3E, 0x10, // 119:3201 + 0x0C, 0xBF, 0x23, 0x0A, // 120:3263 + 0x0C, 0xE2, 0x26, 0x0A, // 121:3298 + 0x0D, 0x08, 0x1F, 0x09, // 122:3336 + 0x0D, 0x27, 0x1C, 0x08, // 123:3367 + 0x0D, 0x43, 0x18, 0x0B, // 124:3395 + 0x0D, 0x5B, 0x1B, 0x08, // 125:3419 + 0x0D, 0x76, 0x26, 0x0B, // 126:3446 + 0x0D, 0x9C, 0x27, 0x0C, // 127:3484 + 0x0D, 0xC3, 0x27, 0x0C, // 128:3523 + 0x0D, 0xEA, 0x27, 0x0C, // 129:3562 + 0x0E, 0x11, 0x27, 0x0C, // 130:3601 + 0x0E, 0x38, 0x27, 0x0C, // 131:3640 + 0x0E, 0x5F, 0x27, 0x0C, // 132:3679 + 0x0E, 0x86, 0x27, 0x0C, // 133:3718 + 0x0E, 0xAD, 0x27, 0x0C, // 134:3757 + 0x0E, 0xD4, 0x27, 0x0C, // 135:3796 + 0x0E, 0xFB, 0x27, 0x0C, // 136:3835 + 0x0F, 0x22, 0x27, 0x0C, // 137:3874 + 0x0F, 0x49, 0x27, 0x0C, // 138:3913 + 0x0F, 0x70, 0x27, 0x0C, // 139:3952 + 0x0F, 0x97, 0x27, 0x0C, // 140:3991 + 0x0F, 0xBE, 0x27, 0x0C, // 141:4030 + 0x0F, 0xE5, 0x27, 0x0C, // 142:4069 + 0x10, 0x0C, 0x27, 0x0C, // 143:4108 + 0x10, 0x33, 0x27, 0x0C, // 144:4147 + 0x10, 0x5A, 0x27, 0x0C, // 145:4186 + 0x10, 0x81, 0x27, 0x0C, // 146:4225 + 0x10, 0xA8, 0x27, 0x0C, // 147:4264 + 0x10, 0xCF, 0x27, 0x0C, // 148:4303 + 0x10, 0xF6, 0x27, 0x0C, // 149:4342 + 0x11, 0x1D, 0x27, 0x0C, // 150:4381 + 0x11, 0x44, 0x27, 0x0C, // 151:4420 + 0x11, 0x6B, 0x27, 0x0C, // 152:4459 + 0x11, 0x92, 0x27, 0x0C, // 153:4498 + 0x11, 0xB9, 0x27, 0x0C, // 154:4537 + 0x11, 0xE0, 0x27, 0x0C, // 155:4576 + 0x12, 0x07, 0x27, 0x0C, // 156:4615 + 0x12, 0x2E, 0x27, 0x0C, // 157:4654 + 0x12, 0x55, 0x27, 0x0C, // 158:4693 + 0x12, 0x7C, 0x27, 0x0C, // 159:4732 + 0xFF, 0xFF, 0x00, 0x05, // 160:65535 + 0x12, 0xA3, 0x10, 0x05, // 161:4771 + 0x12, 0xB3, 0x23, 0x0B, // 162:4787 + 0x12, 0xD6, 0x27, 0x0B, // 163:4822 + 0x12, 0xFD, 0x27, 0x0B, // 164:4861 + 0x13, 0x24, 0x26, 0x0B, // 165:4900 + 0x13, 0x4A, 0x18, 0x0B, // 166:4938 + 0x13, 0x62, 0x23, 0x0A, // 167:4962 + 0x13, 0x85, 0x22, 0x0C, // 168:4997 + 0x13, 0xA7, 0x3F, 0x11, // 169:5031 + 0x13, 0xE6, 0x16, 0x07, // 170:5094 + 0x13, 0xFC, 0x23, 0x0A, // 171:5116 + 0x14, 0x1F, 0x27, 0x0B, // 172:5151 + 0x14, 0x46, 0x13, 0x06, // 173:5190 + 0x14, 0x59, 0x3F, 0x11, // 174:5209 + 0x14, 0x98, 0x25, 0x0A, // 175:5272 + 0x14, 0xBD, 0x1E, 0x09, // 176:5309 + 0x14, 0xDB, 0x27, 0x0B, // 177:5339 + 0x15, 0x02, 0x17, 0x07, // 178:5378 + 0x15, 0x19, 0x16, 0x07, // 179:5401 + 0x15, 0x2F, 0x1D, 0x0C, // 180:5423 + 0x15, 0x4C, 0x27, 0x0C, // 181:5452 + 0x15, 0x73, 0x2C, 0x0D, // 182:5491 + 0x15, 0x9F, 0x0F, 0x05, // 183:5535 + 0x15, 0xAE, 0x14, 0x05, // 184:5550 + 0x15, 0xC2, 0x13, 0x07, // 185:5570 + 0x15, 0xD5, 0x1A, 0x08, // 186:5589 + 0x15, 0xEF, 0x23, 0x0A, // 187:5615 + 0x16, 0x12, 0x3B, 0x10, // 188:5650 + 0x16, 0x4D, 0x37, 0x10, // 189:5709 + 0x16, 0x84, 0x3F, 0x10, // 190:5764 + 0x16, 0xC3, 0x20, 0x09, // 191:5827 + 0x16, 0xE3, 0x33, 0x0D, // 192:5859 + 0x17, 0x16, 0x33, 0x0D, // 193:5910 + 0x17, 0x49, 0x33, 0x0D, // 194:5961 + 0x17, 0x7C, 0x33, 0x0D, // 195:6012 + 0x17, 0xAF, 0x33, 0x0D, // 196:6063 + 0x17, 0xE2, 0x33, 0x0D, // 197:6114 + 0x18, 0x15, 0x3F, 0x11, // 198:6165 + 0x18, 0x54, 0x2F, 0x0D, // 199:6228 + 0x18, 0x83, 0x27, 0x0B, // 200:6275 + 0x18, 0xAA, 0x27, 0x0B, // 201:6314 + 0x18, 0xD1, 0x27, 0x0B, // 202:6353 + 0x18, 0xF8, 0x27, 0x0B, // 203:6392 + 0x19, 0x1F, 0x0F, 0x06, // 204:6431 + 0x19, 0x2E, 0x15, 0x06, // 205:6446 + 0x19, 0x43, 0x15, 0x06, // 206:6467 + 0x19, 0x58, 0x15, 0x06, // 207:6488 + 0x19, 0x6D, 0x33, 0x0E, // 208:6509 + 0x19, 0xA0, 0x33, 0x0F, // 209:6560 + 0x19, 0xD3, 0x3B, 0x10, // 210:6611 + 0x1A, 0x0E, 0x3B, 0x10, // 211:6670 + 0x1A, 0x49, 0x3B, 0x10, // 212:6729 + 0x1A, 0x84, 0x3B, 0x10, // 213:6788 + 0x1A, 0xBF, 0x3B, 0x10, // 214:6847 + 0x1A, 0xFA, 0x23, 0x0B, // 215:6906 + 0x1B, 0x1D, 0x3B, 0x10, // 216:6941 + 0x1B, 0x58, 0x33, 0x0F, // 217:7000 + 0x1B, 0x8B, 0x33, 0x0F, // 218:7051 + 0x1B, 0xBE, 0x33, 0x0F, // 219:7102 + 0x1B, 0xF1, 0x33, 0x0F, // 220:7153 + 0x1C, 0x24, 0x2A, 0x0B, // 221:7204 + 0x1C, 0x4E, 0x2B, 0x0C, // 222:7246 + 0x1C, 0x79, 0x2B, 0x0C, // 223:7289 + 0x1C, 0xA4, 0x23, 0x0B, // 224:7332 + 0x1C, 0xC7, 0x23, 0x0B, // 225:7367 + 0x1C, 0xEA, 0x23, 0x0B, // 226:7402 + 0x1D, 0x0D, 0x23, 0x0B, // 227:7437 + 0x1D, 0x30, 0x23, 0x0B, // 228:7472 + 0x1D, 0x53, 0x23, 0x0B, // 229:7507 + 0x1D, 0x76, 0x3F, 0x11, // 230:7542 + 0x1D, 0xB5, 0x23, 0x0A, // 231:7605 + 0x1D, 0xD8, 0x27, 0x0B, // 232:7640 + 0x1D, 0xFF, 0x27, 0x0B, // 233:7679 + 0x1E, 0x26, 0x27, 0x0B, // 234:7718 + 0x1E, 0x4D, 0x27, 0x0B, // 235:7757 + 0x1E, 0x74, 0x0E, 0x05, // 236:7796 + 0x1E, 0x82, 0x12, 0x05, // 237:7810 + 0x1E, 0x94, 0x12, 0x05, // 238:7828 + 0x1E, 0xA6, 0x12, 0x05, // 239:7846 + 0x1E, 0xB8, 0x2B, 0x0C, // 240:7864 + 0x1E, 0xE3, 0x27, 0x0C, // 241:7907 + 0x1F, 0x0A, 0x2B, 0x0C, // 242:7946 + 0x1F, 0x35, 0x2B, 0x0C, // 243:7989 + 0x1F, 0x60, 0x2B, 0x0C, // 244:8032 + 0x1F, 0x8B, 0x2B, 0x0C, // 245:8075 + 0x1F, 0xB6, 0x2B, 0x0C, // 246:8118 + 0x1F, 0xE1, 0x26, 0x0B, // 247:8161 + 0x20, 0x07, 0x2B, 0x0C, // 248:8199 + 0x20, 0x32, 0x27, 0x0C, // 249:8242 + 0x20, 0x59, 0x27, 0x0C, // 250:8281 + 0x20, 0x80, 0x27, 0x0C, // 251:8320 + 0x20, 0xA7, 0x27, 0x0C, // 252:8359 + 0x20, 0xCE, 0x26, 0x0A, // 253:8398 + 0x20, 0xF4, 0x2B, 0x0C, // 254:8436 + 0x21, 0x1F, 0x26, 0x0A, // 255:8479 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x3B,0x00,0x00,0x03,0x38, // 33 + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x07, // 34 + 0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x22,0x00,0x00,0x10,0x3F,0x00,0x00,0xF8,0x03,0x00,0x00,0x1F,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x3E,0x00,0x00,0xF0,0x07,0x00,0x00,0x3F,0x02,0x00,0x00,0x11,0x02,0x00,0x00,0x10,0x02, // 35 + 0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x00,0x00,0x3C,0x10,0x00,0x00,0x26,0x10,0x00,0x00,0x42,0x10,0x00,0x80,0xFF,0x7F,0x00,0x00,0xC2,0x10,0x00,0x00,0x82,0x18,0x00,0x00,0x82,0x0F,0x00,0x00,0x00,0x06, // 36 + 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xC7,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x31,0x00,0x00,0xFE,0x1C,0x00,0x00,0x38,0x07,0x00,0x00,0x80,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x38,0x07,0x00,0x00,0xCE,0x1F,0x00,0x00,0x23,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0xE0,0x38,0x00,0x00,0x80,0x0F, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x1F,0x00,0x00,0x9E,0x31,0x00,0x00,0xF3,0x20,0x00,0x00,0x61,0x20,0x00,0x00,0xE1,0x20,0x00,0x00,0xB1,0x21,0x00,0x00,0x1E,0x33,0x00,0x00,0x0C,0x1E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1E,0x00,0x00,0x80,0x37,0x00,0x00,0x80,0x21, // 38 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1F, // 39 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0xFC,0x7F,0x00,0x00,0x07,0xC0,0x01,0x00,0x01,0x00,0x01, // 40 + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xC0,0x01,0x00,0xFC,0x7F,0x00,0x00,0xF0,0x1F, // 41 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x78,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 42 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF0,0x00,0x00,0x00,0x10, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38, // 46 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01, // 47 + 0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0xFE,0x1F,0x00,0x00,0x03,0x30,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x30,0x00,0x00,0xFE,0x1F,0x00,0x00,0xF8,0x07, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F, // 49 + 0x00,0x00,0x00,0x00,0x00,0x02,0x30,0x00,0x00,0x02,0x38,0x00,0x00,0x01,0x2C,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x23,0x00,0x00,0x81,0x21,0x00,0x00,0xE3,0x20,0x00,0x00,0x7E,0x20,0x00,0x00,0x00,0x20, // 50 + 0x00,0x00,0x00,0x00,0x00,0x02,0x30,0x00,0x00,0x03,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0xB3,0x30,0x00,0x00,0xBE,0x1F,0x00,0x00,0x00,0x0F, // 51 + 0x00,0x00,0x02,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x02,0x00,0x00,0x60,0x02,0x00,0x00,0x38,0x02,0x00,0x00,0x0C,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x3F,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x61,0x10,0x00,0x00,0xC1,0x1F,0x00,0x00,0x80,0x07, // 53 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xFC,0x1F,0x00,0x00,0x46,0x10,0x00,0x00,0x22,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x21,0x20,0x00,0x00,0x61,0x30,0x00,0x00,0xC1,0x1F,0x00,0x00,0x80,0x0F, // 54 + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0x3C,0x00,0x00,0x81,0x0F,0x00,0x00,0xE1,0x01,0x00,0x00,0x79,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x03, // 55 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x0F,0x00,0x00,0xBE,0x1F,0x00,0x00,0xA3,0x30,0x00,0x00,0x61,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0xC1,0x20,0x00,0x00,0xA3,0x30,0x00,0x00,0x9E,0x1F,0x00,0x00,0x08,0x0F, // 56 + 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x20,0x00,0x00,0x83,0x21,0x00,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x00,0x00,0x01,0x11,0x00,0x00,0x82,0x18,0x00,0x00,0xFE,0x0F,0x00,0x00,0xF8,0x03, // 57 + 0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x38,0x38,0x00,0x00,0x38,0x38, // 58 + 0x00,0x00,0x00,0x00,0x00,0x10,0xF0,0x01,0x00,0x38,0x70,0x00,0x00,0x10, // 59 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x30,0x03,0x00,0x00,0x10,0x02,0x00,0x00,0x18,0x06,0x00,0x00,0x08,0x04,0x00,0x00,0x0C,0x0C, // 60 + 0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0x10,0x02, // 61 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x08,0x04,0x00,0x00,0x18,0x06,0x00,0x00,0x10,0x02,0x00,0x00,0x30,0x03,0x00,0x00,0x20,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0x80, // 62 + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x81,0x3B,0x00,0x00,0xC1,0x38,0x00,0x00,0x61,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x3E, // 63 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x1C,0x30,0x00,0x00,0x04,0x60,0x00,0x00,0x82,0xC3,0x00,0x00,0xE2,0xC7,0x00,0x00,0x33,0x8C,0x00,0x00,0x11,0x88,0x00,0x00,0x11,0x88,0x00,0x00,0x11,0x86,0x00,0x00,0xF1,0xC7,0x00,0x00,0x03,0x4C,0x00,0x00,0x02,0x08,0x00,0x00,0x0C,0x0C,0x00,0x00,0xF8,0x07,0x00,0x00,0xE0,0x01, // 64 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x01,0x00,0x00,0x1E,0x01,0x00,0x00,0x03,0x01,0x00,0x00,0x1E,0x01,0x00,0x00,0x78,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0xA3,0x30,0x00,0x00,0xBE,0x1F,0x00,0x00,0x00,0x0F, // 66 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x0F,0x00,0x00,0x0C,0x1C,0x00,0x00,0x06,0x10,0x00,0x00,0x03,0x30,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x20, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x10,0x00,0x00,0x02,0x18,0x00,0x00,0x0C,0x0C,0x00,0x00,0xF8,0x07,0x00,0x00,0xE0,0x01, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x01,0x20, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01, // 70 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x07,0x00,0x00,0x0C,0x1C,0x00,0x00,0x06,0x18,0x00,0x00,0x02,0x30,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x83,0x3F, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F, // 73 + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0xFF,0xFF,0x01, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xB0,0x01,0x00,0x00,0x18,0x07,0x00,0x00,0x0C,0x0E,0x00,0x00,0x03,0x18,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x20, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0xFF,0x31,0x00,0x00,0xFF,0x3F, // 78 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x00,0x03,0x30,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x3C, // 80 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x00,0x03,0x30,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x60,0x00,0x00,0x03,0xF0,0x00,0x00,0x02,0x90,0x01,0x00,0x0E,0x1C,0x01,0x00,0xFC,0x0F,0x00,0x00,0xE0,0x01, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x81,0x03,0x00,0x00,0x43,0x0E,0x00,0x00,0x7E,0x3C,0x00,0x00,0x18,0x30, // 82 + 0x00,0x00,0x00,0x00,0x00,0x1C,0x30,0x00,0x00,0x3E,0x20,0x00,0x00,0x63,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0xC1,0x20,0x00,0x00,0xC1,0x20,0x00,0x00,0x81,0x31,0x00,0x00,0x81,0x1F,0x00,0x00,0x01,0x0F, // 83 + 0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x1F,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x0F, // 85 + 0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x7C,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01, // 86 + 0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3C,0x00,0x00,0x80,0x0F,0x00,0x00,0xF8,0x01,0x00,0x00,0x1F,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3E,0x00,0x00,0xE0,0x07,0x00,0x00,0xFC,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01, // 87 + 0x00,0x00,0x20,0x00,0x00,0x03,0x30,0x00,0x00,0x07,0x1C,0x00,0x00,0x0C,0x0E,0x00,0x00,0xB8,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0x01,0x00,0x00,0xB8,0x03,0x00,0x00,0x0C,0x0E,0x00,0x00,0x07,0x1C,0x00,0x00,0x03,0x30,0x00,0x00,0x00,0x20, // 88 + 0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, // 89 + 0x00,0x00,0x00,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0x3C,0x00,0x00,0x01,0x2F,0x00,0x00,0x81,0x23,0x00,0x00,0xE1,0x21,0x00,0x00,0x79,0x20,0x00,0x00,0x1D,0x20,0x00,0x00,0x0F,0x20,0x00,0x00,0x03,0x20, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, // 91 + 0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 92 + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFF,0x01, // 93 + 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80,0x01, // 94 + 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x00,0x08,0x23,0x00,0x00,0x08,0x21,0x00,0x00,0x08,0x21,0x00,0x00,0x08,0x21,0x00,0x00,0x18,0x19,0x00,0x00,0xF0,0x3F, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x30,0x18,0x00,0x00,0x18,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x18,0x30,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 98 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x10,0x10,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20, // 99 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x18,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x18,0x30,0x00,0x00,0x30,0x18,0x00,0x80,0xFF,0x3F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x90,0x18,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x20,0x00,0x00,0x98,0x20,0x00,0x00,0xF0,0x20,0x00,0x00,0xE0,0x30, // 101 + 0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x80,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x80,0x08, // 102 + 0x00,0x00,0x80,0x01,0x00,0xE0,0xE0,0x03,0x00,0xF0,0x2D,0x06,0x00,0x18,0x17,0x04,0x00,0x08,0x12,0x04,0x00,0x08,0x12,0x04,0x00,0x08,0x12,0x04,0x00,0x38,0x11,0x06,0x00,0xF8,0x31,0x03,0x00,0x08,0xE0,0x03,0x00,0x08, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xF0,0x3F, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF9,0x3F, // 105 + 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x80,0xF9,0xFF,0x03, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x03,0x00,0x00,0x60,0x07,0x00,0x00,0x30,0x0C,0x00,0x00,0x18,0x38,0x00,0x00,0x08,0x30, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x60,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xF0,0x3F, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xF0,0x3F, // 110 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x10,0x10,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x10,0x10,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x30,0x18,0x00,0x00,0x10,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x18,0x30,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 112 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x18,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x10,0x30,0x00,0x00,0x30,0x18,0x00,0x00,0xF8,0xFF,0x07, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08, // 114 + 0x00,0x00,0x00,0x00,0x00,0x70,0x30,0x00,0x00,0xF0,0x20,0x00,0x00,0x88,0x21,0x00,0x00,0x88,0x21,0x00,0x00,0x08,0x21,0x00,0x00,0x08,0x23,0x00,0x00,0x08,0x1E,0x00,0x00,0x08,0x1E, // 115 + 0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xFE,0x1F,0x00,0x00,0x08,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0xF8,0x3F, // 117 + 0x00,0x08,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x08, // 118 + 0x00,0x08,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3E,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x00,0x00,0x00,0x08, // 119 + 0x00,0x00,0x00,0x00,0x00,0x08,0x30,0x00,0x00,0x38,0x18,0x00,0x00,0x60,0x0E,0x00,0x00,0xC0,0x03,0x00,0x00,0xC0,0x03,0x00,0x00,0x60,0x0E,0x00,0x00,0x38,0x18,0x00,0x00,0x08,0x30, // 120 + 0x00,0x08,0x00,0x04,0x00,0x78,0x00,0x04,0x00,0xE0,0x03,0x04,0x00,0x00,0x0F,0x02,0x00,0x00,0xF8,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x08, // 121 + 0x00,0x00,0x00,0x00,0x00,0x08,0x30,0x00,0x00,0x08,0x3C,0x00,0x00,0x08,0x2F,0x00,0x00,0x88,0x23,0x00,0x00,0xE8,0x20,0x00,0x00,0x78,0x20,0x00,0x00,0x18,0x20, // 122 + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0xFC,0x7E,0x00,0x00,0x7E,0xFC,0x00,0x00,0x03,0x80,0x01,0x00,0x01,0x00,0x01, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x07, // 124 + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x03,0x80,0x01,0x00,0x7E,0xFC,0x00,0x00,0xFC,0x7E,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x01, // 125 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 127 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 128 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 129 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 130 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 131 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 132 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 133 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 134 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 135 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 136 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 137 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 138 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 139 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 140 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 141 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 142 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 143 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 144 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 145 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 146 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 147 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 148 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 149 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 150 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 151 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 152 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 153 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 154 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 155 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 156 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 157 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 158 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0xFF,0x3F, // 159 + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB8,0xFF,0x03,0x00,0x38,0x00,0x02, // 161 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x38,0x07,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0F,0x3C,0x00,0x00,0x07,0x38,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C, // 162 + 0x00,0x00,0x00,0x00,0x00,0x80,0x30,0x00,0x00,0x80,0x3C,0x00,0x00,0xFE,0x2F,0x00,0x00,0x83,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x81,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20, // 163 + 0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0xF8,0x07,0x00,0x00,0x10,0x02,0x00,0x00,0x08,0x04,0x00,0x00,0x08,0x04,0x00,0x00,0x08,0x04,0x00,0x00,0x10,0x02,0x00,0x00,0xF8,0x07,0x00,0x00,0x08,0x04, // 164 + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8E,0x04,0x00,0x00,0xB8,0x04,0x00,0x00,0xE0,0x04,0x00,0x00,0x80,0x3F,0x00,0x00,0xE0,0x04,0x00,0x00,0xB8,0x04,0x00,0x00,0x8E,0x04,0x00,0x00,0x03, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0xF8,0x07, // 166 + 0x00,0x00,0x00,0x00,0x00,0x62,0x30,0x00,0x00,0xF7,0x20,0x00,0x80,0x9C,0x21,0x00,0x80,0x08,0x21,0x00,0x80,0x18,0x23,0x00,0x80,0x10,0x23,0x00,0x80,0xF0,0x1F,0x00,0x00,0xE0,0x0C, // 167 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 168 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x18,0x06,0x00,0x00,0x04,0x08,0x00,0x00,0x02,0x10,0x00,0x00,0xE2,0x13,0x00,0x00,0x31,0x23,0x00,0x00,0x19,0x26,0x00,0x00,0x09,0x24,0x00,0x00,0x09,0x24,0x00,0x00,0x19,0x26,0x00,0x00,0x02,0x10,0x00,0x00,0x02,0x10,0x00,0x00,0x04,0x08,0x00,0x00,0x18,0x06,0x00,0x00,0xF0,0x03, // 169 + 0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x7E, // 170 + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0C,0x00,0x00,0x60,0x18,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0C,0x00,0x00,0x60,0x18, // 171 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xC0,0x07, // 172 + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01, // 173 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x18,0x06,0x00,0x00,0x04,0x08,0x00,0x00,0x02,0x10,0x00,0x00,0x02,0x10,0x00,0x00,0xF9,0x27,0x00,0x00,0x89,0x20,0x00,0x00,0x89,0x20,0x00,0x00,0x89,0x21,0x00,0x00,0x79,0x26,0x00,0x00,0x22,0x14,0x00,0x00,0x02,0x10,0x00,0x00,0x04,0x08,0x00,0x00,0x18,0x06,0x00,0x00,0xF0,0x03, // 174 + 0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 175 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0C, // 176 + 0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10,0x00,0x00,0xFC,0x17,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10,0x00,0x00,0x40,0x10, // 177 + 0x00,0x00,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x41,0x01,0x00,0x00,0x21,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x0E,0x01, // 178 + 0x00,0x80,0x01,0x00,0x00,0x03,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x1B,0x01,0x00,0x00,0xEE, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x80, // 180 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0xF8,0x3F, // 181 + 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x00,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0x01,0x00,0x80,0xFF,0xFF,0x01,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xFF,0xFF,0x01, // 182 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0,0x01, // 183 + 0x00,0x00,0x00,0x04,0x00,0x00,0x80,0x04,0x00,0x00,0xC0,0x04,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x03, // 184 + 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0xFF,0x01, // 185 + 0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x3E, // 186 + 0x00,0x00,0x00,0x00,0x00,0x60,0x18,0x00,0x00,0xC0,0x0C,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x60,0x18,0x00,0x00,0xC0,0x0C,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x03, // 187 + 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xFF,0x31,0x00,0x00,0xFF,0x1D,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x70,0x08,0x00,0x00,0x18,0x0E,0x00,0x00,0x0E,0x09,0x00,0x00,0xC3,0x08,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x08, // 188 + 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xFF,0x31,0x00,0x00,0xFF,0x1D,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x70,0x20,0x00,0x00,0x78,0x30,0x00,0x00,0x2E,0x28,0x00,0x00,0x23,0x24,0x00,0x00,0x20,0x22,0x00,0x00,0xC0,0x21, // 189 + 0x00,0x80,0x01,0x00,0x00,0x03,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x11,0x01,0x00,0x00,0x1B,0x31,0x00,0x00,0xEE,0x1C,0x00,0x00,0x00,0x06,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x70,0x08,0x00,0x00,0x18,0x0E,0x00,0x00,0x0E,0x09,0x00,0x00,0xC3,0x08,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x08, // 190 + 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x02,0x00,0x38,0x06,0x02,0x00,0xB8,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03, // 191 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x10,0xC0,0x01,0x00,0x30,0x78,0x01,0x00,0x60,0x1E,0x01,0x00,0x40,0x03,0x01,0x00,0x00,0x1E,0x01,0x00,0x00,0x78,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 192 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x01,0x00,0x40,0x1E,0x01,0x00,0x60,0x03,0x01,0x00,0x30,0x1E,0x01,0x00,0x10,0x78,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 193 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x40,0xC0,0x01,0x00,0x60,0x78,0x01,0x00,0x30,0x1E,0x01,0x00,0x30,0x03,0x01,0x00,0x60,0x1E,0x01,0x00,0x40,0x78,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 194 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x60,0xC0,0x01,0x00,0x10,0x78,0x01,0x00,0x30,0x1E,0x01,0x00,0x20,0x03,0x01,0x00,0x40,0x1E,0x01,0x00,0x60,0x78,0x01,0x00,0x30,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 195 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x30,0x78,0x01,0x00,0x30,0x1E,0x01,0x00,0x00,0x03,0x01,0x00,0x00,0x1E,0x01,0x00,0x30,0x78,0x01,0x00,0x30,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 196 + 0x00,0x00,0x20,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x01,0x00,0x00,0x78,0x01,0x00,0xE0,0x1F,0x01,0x00,0x20,0x03,0x01,0x00,0x20,0x1F,0x01,0x00,0xE0,0x79,0x01,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x20, // 197 + 0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xF0,0x01,0x00,0x00,0x3C,0x01,0x00,0x00,0x07,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0xFF,0x3F,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x01,0x20, // 198 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF8,0x0F,0x00,0x00,0x0C,0x1C,0x00,0x00,0x06,0x10,0x00,0x00,0x03,0x30,0x04,0x00,0x01,0xA0,0x04,0x00,0x01,0xE0,0x04,0x00,0x01,0xA0,0x07,0x00,0x01,0x20,0x03,0x00,0x01,0x20,0x00,0x00,0x03,0x20, // 199 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x10,0xFF,0x3F,0x00,0x30,0x41,0x20,0x00,0x60,0x41,0x20,0x00,0x40,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x01,0x20, // 200 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x41,0x20,0x00,0x40,0x41,0x20,0x00,0x60,0x41,0x20,0x00,0x30,0x41,0x20,0x00,0x10,0x41,0x20,0x00,0x00,0x01,0x20, // 201 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x40,0xFF,0x3F,0x00,0x60,0x41,0x20,0x00,0x30,0x41,0x20,0x00,0x30,0x41,0x20,0x00,0x60,0x41,0x20,0x00,0x40,0x41,0x20,0x00,0x00,0x01,0x20, // 202 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x30,0xFF,0x3F,0x00,0x30,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x30,0x41,0x20,0x00,0x30,0x41,0x20,0x00,0x00,0x01,0x20, // 203 + 0x10,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0xFF,0x3F,0x00,0x40,0xFF,0x3F, // 204 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0x3F,0x00,0x60,0xFF,0x3F,0x00,0x30,0x00,0x00,0x00,0x10, // 205 + 0x40,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x30,0xFF,0x3F,0x00,0x30,0xFF,0x3F,0x00,0x60,0x00,0x00,0x00,0x40, // 206 + 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x30,0x00,0x00,0x00,0x30, // 207 + 0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x41,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xF0,0x01, // 208 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x03,0x00,0x00,0x60,0x0E,0x00,0x00,0x10,0x18,0x00,0x00,0x30,0x70,0x00,0x00,0x20,0xC0,0x00,0x00,0x40,0x80,0x03,0x00,0x60,0x00,0x06,0x00,0x30,0x00,0x1C,0x00,0x00,0xFF,0x31,0x00,0x00,0xFF,0x3F, // 209 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x10,0x03,0x30,0x00,0x30,0x01,0x20,0x00,0x60,0x01,0x20,0x00,0x40,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 210 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x00,0x03,0x30,0x00,0x00,0x01,0x20,0x00,0x40,0x01,0x20,0x00,0x60,0x01,0x20,0x00,0x30,0x01,0x20,0x00,0x10,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 211 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x40,0x03,0x30,0x00,0x60,0x01,0x20,0x00,0x30,0x01,0x20,0x00,0x30,0x01,0x20,0x00,0x60,0x01,0x20,0x00,0x40,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 212 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x60,0x03,0x30,0x00,0x10,0x01,0x20,0x00,0x30,0x01,0x20,0x00,0x20,0x01,0x20,0x00,0x40,0x01,0x20,0x00,0x60,0x03,0x30,0x00,0x30,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 213 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x0F,0x00,0x00,0x0E,0x1C,0x00,0x00,0x02,0x10,0x00,0x30,0x03,0x30,0x00,0x30,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x30,0x01,0x20,0x00,0x30,0x03,0x30,0x00,0x00,0x02,0x10,0x00,0x00,0x0E,0x1C,0x00,0x00,0xFC,0x07,0x00,0x00,0xE0,0x01, // 214 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0x18,0x03,0x00,0x00,0xB0,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xA0,0x01,0x00,0x00,0x18,0x03,0x00,0x00,0x0C,0x06, // 215 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xFC,0x2F,0x00,0x00,0x0E,0x3C,0x00,0x00,0x02,0x1C,0x00,0x00,0x03,0x3E,0x00,0x00,0x01,0x23,0x00,0x00,0xC1,0x21,0x00,0x00,0x61,0x20,0x00,0x00,0x31,0x20,0x00,0x00,0x1F,0x30,0x00,0x00,0x06,0x10,0x00,0x00,0x0F,0x1C,0x00,0x00,0xF9,0x07,0x00,0x00,0xE0,0x01, // 216 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x1F,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x0F, // 217 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x1F,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x0F, // 218 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x1F,0x00,0x40,0x00,0x10,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x0F, // 219 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x1F,0x00,0x30,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x30,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0xFF,0x1F,0x00,0x00,0xFF,0x0F, // 220 + 0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x40,0xE0,0x00,0x00,0x60,0x80,0x3F,0x00,0x30,0xE0,0x00,0x00,0x10,0x38,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, // 221 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x0C,0x02,0x00,0x00,0xF8,0x03,0x00,0x00,0xF0,0x01, // 222 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x30,0x00,0x80,0xF0,0x20,0x00,0x80,0xD8,0x21,0x00,0x00,0x8F,0x21,0x00,0x00,0x07,0x3F,0x00,0x00,0x00,0x1E, // 223 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x80,0x08,0x23,0x00,0x80,0x09,0x21,0x00,0x00,0x0B,0x21,0x00,0x00,0x0A,0x21,0x00,0x00,0x18,0x19,0x00,0x00,0xF0,0x3F, // 224 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x00,0x08,0x23,0x00,0x00,0x0A,0x21,0x00,0x00,0x0B,0x21,0x00,0x80,0x09,0x21,0x00,0x80,0x18,0x19,0x00,0x00,0xF0,0x3F, // 225 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x00,0x0A,0x23,0x00,0x00,0x0B,0x21,0x00,0x80,0x09,0x21,0x00,0x80,0x09,0x21,0x00,0x00,0x1B,0x19,0x00,0x00,0xF2,0x3F, // 226 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x13,0x3E,0x00,0x80,0x08,0x23,0x00,0x80,0x09,0x21,0x00,0x00,0x09,0x21,0x00,0x00,0x0A,0x21,0x00,0x00,0x1B,0x19,0x00,0x80,0xF1,0x3F, // 227 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x80,0x09,0x23,0x00,0x80,0x09,0x21,0x00,0x00,0x08,0x21,0x00,0x00,0x08,0x21,0x00,0x80,0x19,0x19,0x00,0x80,0xF1,0x3F, // 228 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x10,0x3E,0x00,0x00,0x08,0x23,0x00,0xC0,0x0B,0x21,0x00,0x40,0x0A,0x21,0x00,0x40,0x0A,0x21,0x00,0xC0,0x1B,0x19,0x00,0x00,0xF0,0x3F, // 229 + 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x18,0x3F,0x00,0x00,0x88,0x21,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x10,0x00,0x00,0xB8,0x1C,0x00,0x00,0xF0,0x0F,0x00,0x00,0xB0,0x1C,0x00,0x00,0x88,0x30,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x20,0x00,0x00,0x98,0x20,0x00,0x00,0xF0,0x20,0x00,0x00,0xE0,0x10, // 230 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x10,0x10,0x04,0x00,0x08,0xA0,0x04,0x00,0x08,0xE0,0x04,0x00,0x08,0xA0,0x07,0x00,0x08,0x20,0x03,0x00,0x08,0x20, // 231 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x80,0x90,0x18,0x00,0x80,0x89,0x20,0x00,0x00,0x8B,0x20,0x00,0x00,0x8A,0x20,0x00,0x00,0x98,0x20,0x00,0x00,0xF0,0x20,0x00,0x00,0xE0,0x30, // 232 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x90,0x18,0x00,0x00,0x88,0x20,0x00,0x00,0x8A,0x20,0x00,0x00,0x8B,0x20,0x00,0x80,0x99,0x20,0x00,0x80,0xF0,0x20,0x00,0x00,0xE0,0x30, // 233 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x92,0x18,0x00,0x00,0x8B,0x20,0x00,0x80,0x89,0x20,0x00,0x80,0x89,0x20,0x00,0x00,0x9B,0x20,0x00,0x00,0xF2,0x20,0x00,0x00,0xE0,0x30, // 234 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x80,0x91,0x18,0x00,0x80,0x89,0x20,0x00,0x00,0x88,0x20,0x00,0x00,0x88,0x20,0x00,0x80,0x99,0x20,0x00,0x80,0xF1,0x20,0x00,0x00,0xE0,0x30, // 235 + 0x80,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0xFB,0x3F,0x00,0x00,0x02, // 236 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFA,0x3F,0x00,0x00,0x03,0x00,0x00,0x80,0x01, // 237 + 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0xF9,0x3F,0x00,0x80,0x01,0x00,0x00,0x00,0x03, // 238 + 0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0x80,0x01, // 239 + 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x1F,0x00,0x00,0x64,0x10,0x00,0x80,0x25,0x20,0x00,0x00,0x27,0x20,0x00,0x00,0x23,0x20,0x00,0x00,0x27,0x20,0x00,0x00,0x4D,0x30,0x00,0x00,0xF8,0x1F,0x00,0x00,0xE0,0x07, // 240 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x33,0x00,0x00,0x80,0x10,0x00,0x00,0x80,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x1B,0x00,0x00,0x80,0xF1,0x3F, // 241 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x10,0x10,0x00,0x80,0x08,0x20,0x00,0x80,0x09,0x20,0x00,0x00,0x0B,0x20,0x00,0x00,0x0A,0x20,0x00,0x00,0x10,0x10,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 242 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x10,0x10,0x00,0x00,0x08,0x20,0x00,0x00,0x0A,0x20,0x00,0x00,0x0B,0x20,0x00,0x80,0x09,0x20,0x00,0x80,0x10,0x10,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 243 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x12,0x10,0x00,0x00,0x0B,0x20,0x00,0x80,0x09,0x20,0x00,0x80,0x09,0x20,0x00,0x00,0x0B,0x20,0x00,0x00,0x12,0x10,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 244 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x00,0x13,0x10,0x00,0x80,0x08,0x20,0x00,0x80,0x09,0x20,0x00,0x00,0x09,0x20,0x00,0x00,0x0A,0x20,0x00,0x00,0x13,0x10,0x00,0x80,0xF1,0x1F,0x00,0x00,0xC0,0x07, // 245 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x1F,0x00,0x80,0x11,0x10,0x00,0x80,0x09,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x80,0x09,0x20,0x00,0x80,0x11,0x10,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 246 + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x4C,0x06,0x00,0x00,0x48,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40, // 247 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0xF0,0x3F,0x00,0x00,0x10,0x18,0x00,0x00,0x08,0x2C,0x00,0x00,0x08,0x27,0x00,0x00,0x88,0x21,0x00,0x00,0xE8,0x20,0x00,0x00,0x30,0x10,0x00,0x00,0xF8,0x1F,0x00,0x00,0xC0,0x07, // 248 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x80,0x00,0x30,0x00,0x80,0x01,0x20,0x00,0x00,0x03,0x20,0x00,0x00,0x02,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0xF8,0x3F, // 249 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x20,0x00,0x00,0x03,0x20,0x00,0x80,0x01,0x10,0x00,0x80,0x00,0x18,0x00,0x00,0xF8,0x3F, // 250 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x02,0x30,0x00,0x00,0x03,0x20,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x20,0x00,0x00,0x03,0x10,0x00,0x00,0x02,0x18,0x00,0x00,0xF8,0x3F, // 251 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x80,0x01,0x30,0x00,0x80,0x01,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x80,0x01,0x10,0x00,0x80,0x01,0x18,0x00,0x00,0xF8,0x3F, // 252 + 0x00,0x08,0x00,0x04,0x00,0x78,0x00,0x04,0x00,0xE0,0x03,0x04,0x00,0x00,0x0F,0x02,0x00,0x02,0xF8,0x01,0x00,0x03,0x78,0x00,0x80,0x01,0x1F,0x00,0x80,0xE0,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x08, // 253 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x07,0x00,0x30,0x18,0x00,0x00,0x10,0x30,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x08,0x20,0x00,0x00,0x18,0x30,0x00,0x00,0xF0,0x1F,0x00,0x00,0xC0,0x07, // 254 + 0x00,0x08,0x00,0x04,0x00,0x78,0x00,0x04,0x80,0xE1,0x03,0x04,0x80,0x01,0x0F,0x02,0x00,0x00,0xF8,0x01,0x00,0x00,0x78,0x00,0x80,0x01,0x1F,0x00,0x80,0xE1,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0x08 // 255 +}; + +const uint8_t Open_Sans_Regular_35[] PROGMEM = { + 0x21, // Width: 33 + 0x31, // Height: 49 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x09, // 32:65535 + 0x00, 0x00, 0x2F, 0x09, // 33:0 + 0x00, 0x2F, 0x4F, 0x0E, // 34:47 + 0x00, 0x7E, 0x96, 0x17, // 35:126 + 0x01, 0x14, 0x7B, 0x14, // 36:276 + 0x01, 0x8F, 0xBB, 0x1D, // 37:399 + 0x02, 0x4A, 0xAD, 0x1A, // 38:586 + 0x02, 0xF7, 0x25, 0x08, // 39:759 + 0x03, 0x1C, 0x3E, 0x0A, // 40:796 + 0x03, 0x5A, 0x3C, 0x0A, // 41:858 + 0x03, 0x96, 0x73, 0x13, // 42:918 + 0x04, 0x09, 0x7B, 0x14, // 43:1033 + 0x04, 0x84, 0x2F, 0x09, // 44:1156 + 0x04, 0xB3, 0x43, 0x0B, // 45:1203 + 0x04, 0xF6, 0x2F, 0x09, // 46:1270 + 0x05, 0x25, 0x4F, 0x0D, // 47:1317 + 0x05, 0x74, 0x7B, 0x14, // 48:1396 + 0x05, 0xEF, 0x52, 0x14, // 49:1519 + 0x06, 0x41, 0x7C, 0x14, // 50:1601 + 0x06, 0xBD, 0x7C, 0x14, // 51:1725 + 0x07, 0x39, 0x82, 0x14, // 52:1849 + 0x07, 0xBB, 0x7C, 0x14, // 53:1979 + 0x08, 0x37, 0x7C, 0x14, // 54:2103 + 0x08, 0xB3, 0x7A, 0x14, // 55:2227 + 0x09, 0x2D, 0x7C, 0x14, // 56:2349 + 0x09, 0xA9, 0x7B, 0x14, // 57:2473 + 0x0A, 0x24, 0x2F, 0x09, // 58:2596 + 0x0A, 0x53, 0x2D, 0x09, // 59:2643 + 0x0A, 0x80, 0x7C, 0x14, // 60:2688 + 0x0A, 0xFC, 0x7B, 0x14, // 61:2812 + 0x0B, 0x77, 0x7B, 0x14, // 62:2935 + 0x0B, 0xF2, 0x5E, 0x0F, // 63:3058 + 0x0C, 0x50, 0xC8, 0x1F, // 64:3152 + 0x0D, 0x18, 0x98, 0x16, // 65:3352 + 0x0D, 0xB0, 0x91, 0x17, // 66:3504 + 0x0E, 0x41, 0x8E, 0x16, // 67:3649 + 0x0E, 0xCF, 0xA5, 0x1A, // 68:3791 + 0x0F, 0x74, 0x75, 0x13, // 69:3956 + 0x0F, 0xE9, 0x74, 0x12, // 70:4073 + 0x10, 0x5D, 0x98, 0x19, // 71:4189 + 0x10, 0xF5, 0x9F, 0x1A, // 72:4341 + 0x11, 0x94, 0x28, 0x0A, // 73:4500 + 0x11, 0xBC, 0x28, 0x09, // 74:4540 + 0x11, 0xE4, 0x91, 0x15, // 75:4580 + 0x12, 0x75, 0x75, 0x12, // 76:4725 + 0x12, 0xEA, 0xC9, 0x20, // 77:4842 + 0x13, 0xB3, 0x9F, 0x1A, // 78:5043 + 0x14, 0x52, 0xAC, 0x1B, // 79:5202 + 0x14, 0xFE, 0x81, 0x15, // 80:5374 + 0x15, 0x7F, 0xAC, 0x1B, // 81:5503 + 0x16, 0x2B, 0x91, 0x16, // 82:5675 + 0x16, 0xBC, 0x75, 0x13, // 83:5820 + 0x17, 0x31, 0x80, 0x13, // 84:5937 + 0x17, 0xB1, 0x97, 0x19, // 85:6065 + 0x18, 0x48, 0x8E, 0x15, // 86:6216 + 0x18, 0xD6, 0xD5, 0x20, // 87:6358 + 0x19, 0xAB, 0x8A, 0x14, // 88:6571 + 0x1A, 0x35, 0x87, 0x14, // 89:6709 + 0x1A, 0xBC, 0x83, 0x14, // 90:6844 + 0x1B, 0x3F, 0x4C, 0x0C, // 91:6975 + 0x1B, 0x8B, 0x52, 0x0D, // 92:7051 + 0x1B, 0xDD, 0x3E, 0x0C, // 93:7133 + 0x1C, 0x1B, 0x7B, 0x13, // 94:7195 + 0x1C, 0x96, 0x6F, 0x10, // 95:7318 + 0x1D, 0x05, 0x57, 0x14, // 96:7429 + 0x1D, 0x5C, 0x6E, 0x13, // 97:7516 + 0x1D, 0xCA, 0x83, 0x15, // 98:7626 + 0x1E, 0x4D, 0x6E, 0x11, // 99:7757 + 0x1E, 0xBB, 0x7C, 0x15, // 100:7867 + 0x1F, 0x37, 0x7B, 0x14, // 101:7991 + 0x1F, 0xB2, 0x50, 0x0C, // 102:8114 + 0x20, 0x02, 0x7D, 0x13, // 103:8194 + 0x20, 0x7F, 0x7C, 0x15, // 104:8319 + 0x20, 0xFB, 0x28, 0x09, // 105:8443 + 0x21, 0x23, 0x29, 0x09, // 106:8483 + 0x21, 0x4C, 0x75, 0x12, // 107:8524 + 0x21, 0xC1, 0x28, 0x09, // 108:8641 + 0x21, 0xE9, 0xD0, 0x21, // 109:8681 + 0x22, 0xB9, 0x7C, 0x15, // 110:8889 + 0x23, 0x35, 0x82, 0x15, // 111:9013 + 0x23, 0xB7, 0x83, 0x15, // 112:9143 + 0x24, 0x3A, 0x7D, 0x15, // 113:9274 + 0x24, 0xB7, 0x57, 0x0E, // 114:9399 + 0x25, 0x0E, 0x67, 0x11, // 115:9486 + 0x25, 0x75, 0x4B, 0x0C, // 116:9589 + 0x25, 0xC0, 0x7C, 0x15, // 117:9664 + 0x26, 0x3C, 0x7A, 0x12, // 118:9788 + 0x26, 0xB6, 0xB2, 0x1B, // 119:9910 + 0x27, 0x68, 0x75, 0x12, // 120:10088 + 0x27, 0xDD, 0x7A, 0x12, // 121:10205 + 0x28, 0x57, 0x67, 0x10, // 122:10327 + 0x28, 0xBE, 0x53, 0x0D, // 123:10430 + 0x29, 0x11, 0x4C, 0x13, // 124:10513 + 0x29, 0x5D, 0x51, 0x0D, // 125:10589 + 0x29, 0xAE, 0x7B, 0x14, // 126:10670 + 0x2A, 0x29, 0x7C, 0x15, // 127:10793 + 0x2A, 0xA5, 0x7C, 0x15, // 128:10917 + 0x2B, 0x21, 0x7C, 0x15, // 129:11041 + 0x2B, 0x9D, 0x7C, 0x15, // 130:11165 + 0x2C, 0x19, 0x7C, 0x15, // 131:11289 + 0x2C, 0x95, 0x7C, 0x15, // 132:11413 + 0x2D, 0x11, 0x7C, 0x15, // 133:11537 + 0x2D, 0x8D, 0x7C, 0x15, // 134:11661 + 0x2E, 0x09, 0x7C, 0x15, // 135:11785 + 0x2E, 0x85, 0x7C, 0x15, // 136:11909 + 0x2F, 0x01, 0x7C, 0x15, // 137:12033 + 0x2F, 0x7D, 0x7C, 0x15, // 138:12157 + 0x2F, 0xF9, 0x7C, 0x15, // 139:12281 + 0x30, 0x75, 0x7C, 0x15, // 140:12405 + 0x30, 0xF1, 0x7C, 0x15, // 141:12529 + 0x31, 0x6D, 0x7C, 0x15, // 142:12653 + 0x31, 0xE9, 0x7C, 0x15, // 143:12777 + 0x32, 0x65, 0x7C, 0x15, // 144:12901 + 0x32, 0xE1, 0x7C, 0x15, // 145:13025 + 0x33, 0x5D, 0x7C, 0x15, // 146:13149 + 0x33, 0xD9, 0x7C, 0x15, // 147:13273 + 0x34, 0x55, 0x7C, 0x15, // 148:13397 + 0x34, 0xD1, 0x7C, 0x15, // 149:13521 + 0x35, 0x4D, 0x7C, 0x15, // 150:13645 + 0x35, 0xC9, 0x7C, 0x15, // 151:13769 + 0x36, 0x45, 0x7C, 0x15, // 152:13893 + 0x36, 0xC1, 0x7C, 0x15, // 153:14017 + 0x37, 0x3D, 0x7C, 0x15, // 154:14141 + 0x37, 0xB9, 0x7C, 0x15, // 155:14265 + 0x38, 0x35, 0x7C, 0x15, // 156:14389 + 0x38, 0xB1, 0x7C, 0x15, // 157:14513 + 0x39, 0x2D, 0x7C, 0x15, // 158:14637 + 0x39, 0xA9, 0x7C, 0x15, // 159:14761 + 0xFF, 0xFF, 0x00, 0x09, // 160:65535 + 0x3A, 0x25, 0x2D, 0x09, // 161:14885 + 0x3A, 0x52, 0x75, 0x14, // 162:14930 + 0x3A, 0xC7, 0x83, 0x14, // 163:15047 + 0x3B, 0x4A, 0x7C, 0x14, // 164:15178 + 0x3B, 0xC6, 0x80, 0x14, // 165:15302 + 0x3C, 0x46, 0x4C, 0x13, // 166:15430 + 0x3C, 0x92, 0x6E, 0x12, // 167:15506 + 0x3D, 0x00, 0x64, 0x14, // 168:15616 + 0x3D, 0x64, 0xBA, 0x1D, // 169:15716 + 0x3E, 0x1E, 0x43, 0x0C, // 170:15902 + 0x3E, 0x61, 0x67, 0x11, // 171:15969 + 0x3E, 0xC8, 0x7C, 0x14, // 172:16072 + 0x3F, 0x44, 0x43, 0x0B, // 173:16196 + 0x3F, 0x87, 0xBA, 0x1D, // 174:16263 + 0x40, 0x41, 0x79, 0x12, // 175:16449 + 0x40, 0xBA, 0x57, 0x0F, // 176:16570 + 0x41, 0x11, 0x7C, 0x14, // 177:16657 + 0x41, 0x8D, 0x4A, 0x0C, // 178:16781 + 0x41, 0xD7, 0x4A, 0x0C, // 179:16855 + 0x42, 0x21, 0x56, 0x14, // 180:16929 + 0x42, 0x77, 0x83, 0x16, // 181:17015 + 0x42, 0xFA, 0x84, 0x17, // 182:17146 + 0x43, 0x7E, 0x2E, 0x09, // 183:17278 + 0x43, 0xAC, 0x30, 0x08, // 184:17324 + 0x43, 0xDC, 0x35, 0x0C, // 185:17372 + 0x44, 0x11, 0x50, 0x0D, // 186:17425 + 0x44, 0x61, 0x66, 0x11, // 187:17505 + 0x44, 0xC7, 0xB4, 0x1B, // 188:17607 + 0x45, 0x7B, 0xAD, 0x1B, // 189:17787 + 0x46, 0x28, 0xBB, 0x1B, // 190:17960 + 0x46, 0xE3, 0x61, 0x0F, // 191:18147 + 0x47, 0x44, 0x98, 0x16, // 192:18244 + 0x47, 0xDC, 0x98, 0x16, // 193:18396 + 0x48, 0x74, 0x98, 0x16, // 194:18548 + 0x49, 0x0C, 0x98, 0x16, // 195:18700 + 0x49, 0xA4, 0x98, 0x16, // 196:18852 + 0x4A, 0x3C, 0x98, 0x16, // 197:19004 + 0x4A, 0xD4, 0xC9, 0x1F, // 198:19156 + 0x4B, 0x9D, 0x8E, 0x16, // 199:19357 + 0x4C, 0x2B, 0x75, 0x13, // 200:19499 + 0x4C, 0xA0, 0x75, 0x13, // 201:19616 + 0x4D, 0x15, 0x75, 0x13, // 202:19733 + 0x4D, 0x8A, 0x75, 0x13, // 203:19850 + 0x4D, 0xFF, 0x28, 0x0A, // 204:19967 + 0x4E, 0x27, 0x39, 0x0A, // 205:20007 + 0x4E, 0x60, 0x41, 0x0A, // 206:20064 + 0x4E, 0xA1, 0x41, 0x0A, // 207:20129 + 0x4E, 0xE2, 0x9E, 0x19, // 208:20194 + 0x4F, 0x80, 0x9F, 0x1A, // 209:20352 + 0x50, 0x1F, 0xAC, 0x1B, // 210:20511 + 0x50, 0xCB, 0xAC, 0x1B, // 211:20683 + 0x51, 0x77, 0xAC, 0x1B, // 212:20855 + 0x52, 0x23, 0xAC, 0x1B, // 213:21027 + 0x52, 0xCF, 0xAC, 0x1B, // 214:21199 + 0x53, 0x7B, 0x7B, 0x14, // 215:21371 + 0x53, 0xF6, 0xAC, 0x1B, // 216:21494 + 0x54, 0xA2, 0x97, 0x19, // 217:21666 + 0x55, 0x39, 0x97, 0x19, // 218:21817 + 0x55, 0xD0, 0x97, 0x19, // 219:21968 + 0x56, 0x67, 0x97, 0x19, // 220:22119 + 0x56, 0xFE, 0x87, 0x14, // 221:22270 + 0x57, 0x85, 0x82, 0x15, // 222:22405 + 0x58, 0x07, 0x8A, 0x16, // 223:22535 + 0x58, 0x91, 0x6E, 0x13, // 224:22673 + 0x58, 0xFF, 0x6E, 0x13, // 225:22783 + 0x59, 0x6D, 0x6E, 0x13, // 226:22893 + 0x59, 0xDB, 0x6E, 0x13, // 227:23003 + 0x5A, 0x49, 0x6E, 0x13, // 228:23113 + 0x5A, 0xB7, 0x6E, 0x13, // 229:23223 + 0x5B, 0x25, 0xC1, 0x1E, // 230:23333 + 0x5B, 0xE6, 0x6E, 0x11, // 231:23526 + 0x5C, 0x54, 0x7B, 0x14, // 232:23636 + 0x5C, 0xCF, 0x7B, 0x14, // 233:23759 + 0x5D, 0x4A, 0x7B, 0x14, // 234:23882 + 0x5D, 0xC5, 0x7B, 0x14, // 235:24005 + 0x5E, 0x40, 0x28, 0x09, // 236:24128 + 0x5E, 0x68, 0x3A, 0x09, // 237:24168 + 0x5E, 0xA2, 0x3B, 0x09, // 238:24226 + 0x5E, 0xDD, 0x3A, 0x09, // 239:24285 + 0x5F, 0x17, 0x83, 0x15, // 240:24343 + 0x5F, 0x9A, 0x7C, 0x15, // 241:24474 + 0x60, 0x16, 0x82, 0x15, // 242:24598 + 0x60, 0x98, 0x82, 0x15, // 243:24728 + 0x61, 0x1A, 0x82, 0x15, // 244:24858 + 0x61, 0x9C, 0x82, 0x15, // 245:24988 + 0x62, 0x1E, 0x82, 0x15, // 246:25118 + 0x62, 0xA0, 0x7B, 0x14, // 247:25248 + 0x63, 0x1B, 0x82, 0x15, // 248:25371 + 0x63, 0x9D, 0x7C, 0x15, // 249:25501 + 0x64, 0x19, 0x7C, 0x15, // 250:25625 + 0x64, 0x95, 0x7C, 0x15, // 251:25749 + 0x65, 0x11, 0x7C, 0x15, // 252:25873 + 0x65, 0x8D, 0x7A, 0x12, // 253:25997 + 0x66, 0x07, 0x83, 0x15, // 254:26119 + 0x66, 0x8A, 0x7A, 0x12, // 255:26250 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x07,0x3E,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x3E,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x18, // 33 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0, // 34 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x38,0x00,0x00,0x00,0x00,0x30,0xF0,0x3F,0x00,0x00,0x00,0x00,0x30,0xFE,0x1F,0x00,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0x00,0x00,0x80,0xFF,0x37,0x00,0x00,0x00,0x00,0xE0,0x3F,0x30,0x00,0x00,0x00,0x00,0xE0,0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3E,0x00,0x00,0x00,0x00,0x30,0xF0,0x3F,0x00,0x00,0x00,0x00,0xB0,0xFF,0x07,0x00,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x31,0x00,0x00,0x00,0x00,0xE0,0x3F,0x30,0x00,0x00,0x00,0x00,0x60,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x30, // 35 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x3F,0x00,0x06,0x00,0x00,0x00,0x80,0x7F,0x00,0x0E,0x00,0x00,0x00,0x80,0xF7,0x00,0x0C,0x00,0x00,0x00,0x80,0xC1,0x00,0x0C,0x00,0x00,0x00,0xC0,0xC0,0x01,0x0C,0x00,0x00,0x00,0xC0,0x80,0x01,0x0C,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xC0,0x00,0x03,0x0C,0x00,0x00,0x00,0xC0,0x00,0x03,0x0E,0x00,0x00,0x00,0xC0,0x00,0x06,0x06,0x00,0x00,0x00,0xC0,0x01,0x1E,0x07,0x00,0x00,0x00,0x80,0x01,0xFC,0x03,0x00,0x00,0x00,0x80,0x01,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x60, // 36 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0xC0,0x01,0x07,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x30,0x00,0x00,0x00,0xE0,0x00,0x0E,0x3C,0x00,0x00,0x00,0xC0,0x83,0x07,0x1F,0x00,0x00,0x00,0x80,0xFF,0xC3,0x07,0x00,0x00,0x00,0x00,0xFE,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0xFC,0x07,0x00,0x00,0x00,0x00,0x1F,0xFF,0x0F,0x00,0x00,0x00,0xC0,0x07,0x0F,0x1E,0x00,0x00,0x00,0xE0,0x81,0x03,0x38,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x00,0x80,0x01,0x30,0x00,0x00,0x00,0x00,0x80,0x03,0x38,0x00,0x00,0x00,0x00,0x00,0x07,0x1C,0x00,0x00,0x00,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x00,0x00,0xFC,0x07, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x0E,0xFC,0x1F,0x00,0x00,0x00,0x80,0x3F,0x1C,0x1C,0x00,0x00,0x00,0xC0,0x7F,0x0E,0x38,0x00,0x00,0x00,0xC0,0xF1,0x07,0x30,0x00,0x00,0x00,0xE0,0xC0,0x07,0x30,0x00,0x00,0x00,0x60,0x80,0x07,0x30,0x00,0x00,0x00,0x60,0x80,0x07,0x30,0x00,0x00,0x00,0x60,0xC0,0x0F,0x30,0x00,0x00,0x00,0x60,0xE0,0x1C,0x30,0x00,0x00,0x00,0xE0,0xF0,0x38,0x38,0x00,0x00,0x00,0xC0,0x7F,0x78,0x18,0x00,0x00,0x00,0x80,0x3F,0xF0,0x1C,0x00,0x00,0x00,0x00,0x0F,0xE0,0x0D,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xFC,0x3C,0x00,0x00,0x00,0x00,0x00,0x7C,0x38,0x00,0x00,0x00,0x00,0x00,0x1C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 38 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20, // 39 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x1F,0x00,0x00,0x00,0x00,0xFC,0xFF,0x7F,0x00,0x00,0x00,0x00,0xFF,0x01,0xFF,0x01,0x00,0x00,0xC0,0x0F,0x00,0xE0,0x07,0x00,0x00,0xE0,0x03,0x00,0x00,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x20,0x00,0x00,0x00,0x08, // 40 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,0x00,0x00,0xE0,0x00,0x00,0x00,0x0C,0x00,0x00,0xE0,0x03,0x00,0x80,0x0F,0x00,0x00,0xC0,0x0F,0x00,0xE0,0x07,0x00,0x00,0x00,0xFF,0x83,0xFF,0x01,0x00,0x00,0x00,0xFC,0xFF,0x7F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x7C, // 41 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00,0xEE,0x07,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0xCE,0x07,0x00,0x00,0x00,0x00,0x00,0x86,0x03,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x04, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x1C, // 46 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0, // 47 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x00,0x00,0x00,0x80,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xC0,0x03,0x00,0x1E,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x07,0x00,0x1F,0x00,0x00,0x00,0x80,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0xFE,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 49 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x38,0x00,0x00,0x00,0x80,0x01,0x00,0x3C,0x00,0x00,0x00,0xC0,0x01,0x00,0x3E,0x00,0x00,0x00,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xE0,0x00,0x80,0x37,0x00,0x00,0x00,0x60,0x00,0xC0,0x33,0x00,0x00,0x00,0x60,0x00,0xE0,0x31,0x00,0x00,0x00,0x60,0x00,0xF0,0x30,0x00,0x00,0x00,0x60,0x00,0x78,0x30,0x00,0x00,0x00,0x60,0x00,0x3E,0x30,0x00,0x00,0x00,0xE0,0x00,0x1F,0x30,0x00,0x00,0x00,0xC0,0xC1,0x0F,0x30,0x00,0x00,0x00,0xC0,0xFF,0x03,0x30,0x00,0x00,0x00,0x80,0xFF,0x01,0x30,0x00,0x00,0x00,0x00,0x7E,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30, // 50 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x30,0x00,0x00,0x00,0xE0,0x80,0x07,0x38,0x00,0x00,0x00,0xC0,0xC1,0x06,0x18,0x00,0x00,0x00,0xC0,0xFF,0x1C,0x1E,0x00,0x00,0x00,0x80,0x7F,0xFC,0x0F,0x00,0x00,0x00,0x00,0x3F,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xF0,0x01, // 51 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x00,0x00,0x80,0xC7,0x00,0x00,0x00,0x00,0x00,0xE0,0xC3,0x00,0x00,0x00,0x00,0x00,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0xC0,0x00,0x00,0x00,0x00,0x00,0x1E,0xC0,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,0xC0,0x07,0xC0,0x00,0x00,0x00,0x00,0xE0,0x01,0xC0,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0xFE,0x01,0x18,0x00,0x00,0x00,0xE0,0xFF,0x01,0x38,0x00,0x00,0x00,0xE0,0xFF,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x38,0x00,0x00,0x00,0x60,0x00,0x03,0x1C,0x00,0x00,0x00,0x60,0x00,0x0F,0x1E,0x00,0x00,0x00,0x60,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00,0x00,0x00,0xF8,0x01, // 53 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x03,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0x00,0x00,0x00,0x1F,0x0E,0x0E,0x00,0x00,0x00,0x80,0x07,0x03,0x1C,0x00,0x00,0x00,0xC0,0x01,0x03,0x38,0x00,0x00,0x00,0xC0,0x80,0x01,0x30,0x00,0x00,0x00,0xC0,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x01,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x38,0x00,0x00,0x00,0x60,0x00,0x07,0x1C,0x00,0x00,0x00,0x60,0x00,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x03, // 54 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x3C,0x00,0x00,0x00,0x60,0x00,0x00,0x3F,0x00,0x00,0x00,0x60,0x00,0xC0,0x1F,0x00,0x00,0x00,0x60,0x00,0xF0,0x07,0x00,0x00,0x00,0x60,0x00,0xFE,0x01,0x00,0x00,0x00,0x60,0x80,0x3F,0x00,0x00,0x00,0x00,0x60,0xE0,0x0F,0x00,0x00,0x00,0x00,0x60,0xF8,0x03,0x00,0x00,0x00,0x00,0x60,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x01, // 55 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x3F,0xF8,0x0F,0x00,0x00,0x00,0x80,0x7F,0xFC,0x1F,0x00,0x00,0x00,0xC0,0xF3,0x1C,0x1C,0x00,0x00,0x00,0xC0,0xC0,0x0F,0x38,0x00,0x00,0x00,0xE0,0x80,0x07,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x80,0x07,0x30,0x00,0x00,0x00,0xE0,0x80,0x07,0x30,0x00,0x00,0x00,0xC0,0xC0,0x0E,0x38,0x00,0x00,0x00,0xC0,0xF3,0x1C,0x1C,0x00,0x00,0x00,0x80,0x7F,0xF8,0x1F,0x00,0x00,0x00,0x00,0x3F,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x03, // 56 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x30,0x00,0x00,0x00,0xC0,0x01,0x07,0x30,0x00,0x00,0x00,0xC0,0x00,0x0E,0x30,0x00,0x00,0x00,0x60,0x00,0x0C,0x30,0x00,0x00,0x00,0x60,0x00,0x0C,0x30,0x00,0x00,0x00,0x60,0x00,0x0C,0x30,0x00,0x00,0x00,0x60,0x00,0x0C,0x38,0x00,0x00,0x00,0x60,0x00,0x0C,0x18,0x00,0x00,0x00,0xE0,0x00,0x06,0x1C,0x00,0x00,0x00,0xC0,0x01,0x06,0x0E,0x00,0x00,0x00,0x80,0x03,0xC3,0x07,0x00,0x00,0x00,0x80,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x70,0x00,0x1C, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x20,0x00,0xF0,0x07,0x00,0x00,0x00,0xF8,0x00,0xFC,0x03,0x00,0x00,0x00,0xF8,0x00,0xFC,0x00,0x00,0x00,0x00,0xF8,0x00,0x1C,0x00,0x00,0x00,0x00,0x20, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x19,0x00,0x00,0x00,0x00,0x00,0xC0,0x19,0x00,0x00,0x00,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x00,0x00,0xE0,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x30,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0xE0,0x00,0x00,0x00,0x00,0x00,0x18,0xC0,0x00,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x0C,0x80,0x01,0x00,0x00,0x00,0x00,0x0E,0x80,0x03, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30, // 61 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x80,0x03,0x00,0x00,0x00,0x00,0x0C,0x80,0x01,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x18,0xC0,0x00,0x00,0x00,0x00,0x00,0x38,0xE0,0x00,0x00,0x00,0x00,0x00,0x30,0xE0,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x00,0x00,0x00,0x00,0x00,0xE0,0x30,0x00,0x00,0x00,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x00,0x00,0xC0,0x19,0x00,0x00,0x00,0x00,0x00,0x80,0x19,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x00,0x60,0x00,0x78,0x3E,0x00,0x00,0x00,0x60,0x00,0x7E,0x3E,0x00,0x00,0x00,0x60,0x00,0x0F,0x1C,0x00,0x00,0x00,0x60,0x80,0x07,0x00,0x00,0x00,0x00,0xE0,0x80,0x03,0x00,0x00,0x00,0x00,0xC0,0xE0,0x01,0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xC3,0x1F,0x00,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x00,0x00,0x00,0x0E,0x00,0x78,0x00,0x00,0x00,0x00,0x07,0x00,0x70,0x00,0x00,0x00,0x80,0x03,0x00,0xE0,0x00,0x00,0x00,0x80,0x01,0x7E,0xC0,0x00,0x00,0x00,0xC0,0x81,0xFF,0xC0,0x00,0x00,0x00,0xC0,0xC0,0xFF,0xC1,0x01,0x00,0x00,0xE0,0xE0,0x80,0x83,0x01,0x00,0x00,0xE0,0x70,0x00,0x83,0x01,0x00,0x00,0x60,0x30,0x00,0x83,0x01,0x00,0x00,0x60,0x30,0x00,0x83,0x01,0x00,0x00,0x60,0x30,0x80,0x83,0x01,0x00,0x00,0x60,0x30,0x80,0x81,0x01,0x00,0x00,0x60,0x30,0xF8,0xC0,0x01,0x00,0x00,0xE0,0xF0,0x7F,0xC0,0x00,0x00,0x00,0xC0,0xE0,0xFF,0xC1,0x00,0x00,0x00,0xC0,0x00,0x80,0xC3,0x00,0x00,0x00,0xC0,0x01,0x00,0x03,0x00,0x00,0x00,0x80,0x03,0x00,0x03,0x00,0x00,0x00,0x80,0x07,0x80,0x03,0x00,0x00,0x00,0x00,0x0F,0xC0,0x01,0x00,0x00,0x00,0x00,0x7E,0xF8,0x01,0x00,0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 64 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0x7F,0x18,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x00,0x00,0x00,0x00,0xC0,0x0F,0x18,0x00,0x00,0x00,0x00,0x00,0x7F,0x18,0x00,0x00,0x00,0x00,0x00,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0xE0,0x00,0x03,0x30,0x00,0x00,0x00,0xC0,0x80,0x07,0x38,0x00,0x00,0x00,0xC0,0xC1,0x06,0x18,0x00,0x00,0x00,0xC0,0xFF,0x1C,0x1E,0x00,0x00,0x00,0x80,0x7F,0xFC,0x0F,0x00,0x00,0x00,0x00,0x3F,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xF0,0x03, // 66 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x7F,0xE0,0x07,0x00,0x00,0x00,0x80,0x0F,0x00,0x0F,0x00,0x00,0x00,0x80,0x03,0x00,0x1E,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0x40, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x03,0x00,0x0E,0x00,0x00,0x00,0x80,0x07,0x80,0x0F,0x00,0x00,0x00,0x00,0x7F,0xF0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06, // 70 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x80,0x03,0x00,0x1E,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0xE0,0x00,0x06,0x30,0x00,0x00,0x00,0xE0,0x00,0x06,0x38,0x00,0x00,0x00,0xC0,0x00,0xFE,0x1F,0x00,0x00,0x00,0x40,0x00,0xFE,0x1F, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 73 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x07,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xE0,0xFF,0xFF,0xFF, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x78,0x3E,0x00,0x00,0x00,0x00,0x00,0x3C,0x7C,0x00,0x00,0x00,0x00,0x00,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x03,0x00,0x00,0x00,0x80,0x07,0xC0,0x07,0x00,0x00,0x00,0xC0,0x03,0x00,0x0F,0x00,0x00,0x00,0xE0,0x00,0x00,0x3E,0x00,0x00,0x00,0x60,0x00,0x00,0x38,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 78 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0x00,0xC0,0x00,0x06,0x00,0x00,0x00,0x00,0xC0,0x81,0x07,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFE, // 80 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x00,0x00,0xF0,0x01,0x00,0x00,0xC0,0x00,0x00,0xF8,0x03,0x00,0x00,0xC0,0x00,0x00,0xD8,0x07,0x00,0x00,0xC0,0x01,0x00,0x1C,0x0F,0x00,0x00,0x80,0x07,0x00,0x0F,0x0E,0x00,0x00,0x00,0x3F,0xE0,0x07,0x0C,0x00,0x00,0x00,0xFE,0xFF,0x03,0x08,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00,0x00,0x60,0x00,0x0E,0x00,0x00,0x00,0x00,0x60,0x00,0x3E,0x00,0x00,0x00,0x00,0xE0,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x81,0xF3,0x03,0x00,0x00,0x00,0xC0,0xE7,0xC1,0x07,0x00,0x00,0x00,0x80,0xFF,0x81,0x1F,0x00,0x00,0x00,0x00,0xFF,0x00,0x3E,0x00,0x00,0x00,0x00,0x1C,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x18,0x00,0x00,0x00,0x80,0x7F,0x00,0x38,0x00,0x00,0x00,0xC0,0xFF,0x00,0x38,0x00,0x00,0x00,0xC0,0xE1,0x01,0x30,0x00,0x00,0x00,0xC0,0xC0,0x03,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x30,0x00,0x00,0x00,0x60,0x80,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x07,0x30,0x00,0x00,0x00,0x60,0x00,0x07,0x30,0x00,0x00,0x00,0x60,0x00,0x0E,0x30,0x00,0x00,0x00,0x60,0x00,0x0E,0x18,0x00,0x00,0x00,0xE0,0x00,0x1E,0x1C,0x00,0x00,0x00,0xE0,0x00,0xFC,0x1F,0x00,0x00,0x00,0xC0,0x00,0xF8,0x0F,0x00,0x00,0x00,0x40,0x00,0xF0,0x07, // 83 + 0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF, // 85 + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x20, // 86 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0xFC,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x01,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x01, // 87 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x01,0x00,0x3E,0x00,0x00,0x00,0xC0,0x07,0x80,0x0F,0x00,0x00,0x00,0x00,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x3E,0xF0,0x01,0x00,0x00,0x00,0x00,0xF8,0x7C,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x78,0x7C,0x00,0x00,0x00,0x00,0x00,0x3E,0xF0,0x01,0x00,0x00,0x00,0x00,0x0F,0xE0,0x07,0x00,0x00,0x00,0xC0,0x07,0x80,0x0F,0x00,0x00,0x00,0xE0,0x01,0x00,0x3E,0x00,0x00,0x00,0xE0,0x00,0x00,0x3C,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 88 + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 89 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x60,0x00,0x00,0x3C,0x00,0x00,0x00,0x60,0x00,0x00,0x3F,0x00,0x00,0x00,0x60,0x00,0x80,0x3F,0x00,0x00,0x00,0x60,0x00,0xE0,0x37,0x00,0x00,0x00,0x60,0x00,0xF0,0x33,0x00,0x00,0x00,0x60,0x00,0xFC,0x30,0x00,0x00,0x00,0x60,0x00,0x3E,0x30,0x00,0x00,0x00,0x60,0x80,0x1F,0x30,0x00,0x00,0x00,0x60,0xE0,0x07,0x30,0x00,0x00,0x00,0x60,0xF0,0x03,0x30,0x00,0x00,0x00,0x60,0xFC,0x00,0x30,0x00,0x00,0x00,0x60,0x7E,0x00,0x30,0x00,0x00,0x00,0xE0,0x1F,0x00,0x30,0x00,0x00,0x00,0xE0,0x0F,0x00,0x30,0x00,0x00,0x00,0xE0,0x03,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30, // 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C, // 91 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 92 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x0F, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x10, // 94 + 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x01, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x30,0xF0,0x1F,0x00,0x00,0x00,0x00,0x30,0x70,0x38,0x00,0x00,0x00,0x00,0x38,0x30,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x38,0x18,0x0C,0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,0x01, // 98 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x01,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0x30,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x10,0x00,0x18, // 99 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x10,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x0F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F, // 100 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x19,0x0F,0x00,0x00,0x00,0x00,0x70,0x18,0x1C,0x00,0x00,0x00,0x00,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x00,0x00,0x00,0x00,0xF0,0x18,0x30,0x00,0x00,0x00,0x00,0xE0,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x1F, // 101 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x38,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x18, // 102 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x80,0x07,0xE0,0x1F,0x00,0x00,0x00,0xE0,0x1F,0xE7,0x1C,0x00,0x00,0x00,0xF0,0xBF,0x3F,0x18,0x00,0x00,0x00,0x70,0xF8,0x1F,0x30,0x00,0x00,0x00,0x38,0xF0,0x18,0x30,0x00,0x00,0x00,0x18,0x60,0x18,0x30,0x00,0x00,0x00,0x18,0x60,0x18,0x30,0x00,0x00,0x00,0x18,0x60,0x18,0x30,0x00,0x00,0x00,0x18,0x60,0x18,0x30,0x00,0x00,0x00,0x38,0x70,0x18,0x30,0x00,0x00,0x00,0x78,0x30,0x18,0x38,0x00,0x00,0x00,0xF8,0x3F,0x18,0x18,0x00,0x00,0x00,0xF8,0x1F,0x38,0x1C,0x00,0x00,0x00,0xD8,0x07,0xF0,0x0F,0x00,0x00,0x00,0x18,0x00,0xF0,0x0F,0x00,0x00,0x00,0x18,0x00,0xC0,0x03, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xF8,0xFF,0x3F, // 105 + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0xF0,0xF8,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xF8,0xFF,0xFF,0x1F,0x00,0x00,0xF0,0xF8,0xFF,0xFF,0x07, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x80,0xF3,0x01,0x00,0x00,0x00,0x00,0xC0,0xC1,0x03,0x00,0x00,0x00,0x00,0xF0,0x80,0x0F,0x00,0x00,0x00,0x00,0x78,0x00,0x1F,0x00,0x00,0x00,0x00,0x38,0x00,0x3C,0x00,0x00,0x00,0x00,0x18,0x00,0x38,0x00,0x00,0x00,0x00,0x08,0x00,0x30, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 110 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0xF0,0x01,0x1F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,0x01, // 112 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18, // 114 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x18,0x00,0x00,0x00,0x00,0xF0,0x07,0x38,0x00,0x00,0x00,0x00,0xF0,0x0F,0x30,0x00,0x00,0x00,0x00,0x38,0x0E,0x30,0x00,0x00,0x00,0x00,0x18,0x1C,0x30,0x00,0x00,0x00,0x00,0x18,0x1C,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x18,0x30,0x30,0x00,0x00,0x00,0x00,0x18,0x70,0x18,0x00,0x00,0x00,0x00,0x38,0xE0,0x1C,0x00,0x00,0x00,0x00,0x30,0xE0,0x1F,0x00,0x00,0x00,0x00,0x10,0xC0,0x0F, // 115 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x07,0x00,0x00,0x00,0x80,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x80,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x18,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 117 + 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x08, // 118 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0xF0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x00,0xF0,0x7F,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x78, // 119 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x20,0x00,0x00,0x00,0x00,0x18,0x00,0x38,0x00,0x00,0x00,0x00,0x78,0x00,0x3C,0x00,0x00,0x00,0x00,0xF0,0x00,0x1F,0x00,0x00,0x00,0x00,0xE0,0x83,0x07,0x00,0x00,0x00,0x00,0x80,0xC7,0x03,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0x80,0xC7,0x03,0x00,0x00,0x00,0x00,0xE0,0x83,0x0F,0x00,0x00,0x00,0x00,0xF8,0x00,0x1F,0x00,0x00,0x00,0x00,0x78,0x00,0x3C,0x00,0x00,0x00,0x00,0x18,0x00,0x38,0x00,0x00,0x00,0x00,0x08,0x00,0x20, // 120 + 0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x30,0x00,0x00,0x00,0xF8,0x01,0x00,0x30,0x00,0x00,0x00,0xF0,0x0F,0x00,0x30,0x00,0x00,0x00,0xC0,0x3F,0x00,0x38,0x00,0x00,0x00,0x00,0xFE,0x01,0x18,0x00,0x00,0x00,0x00,0xF0,0x07,0x1E,0x00,0x00,0x00,0x00,0xC0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x08, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x18,0x80,0x3F,0x00,0x00,0x00,0x00,0x18,0xC0,0x37,0x00,0x00,0x00,0x00,0x18,0xF0,0x31,0x00,0x00,0x00,0x00,0x18,0xF8,0x30,0x00,0x00,0x00,0x00,0x18,0x3E,0x30,0x00,0x00,0x00,0x00,0x18,0x1F,0x30,0x00,0x00,0x00,0x00,0xD8,0x07,0x30,0x00,0x00,0x00,0x00,0xF8,0x03,0x30,0x00,0x00,0x00,0x00,0xF8,0x00,0x30,0x00,0x00,0x00,0x00,0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30, // 122 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0xFF,0xEF,0xFF,0x01,0x00,0x00,0x80,0xFF,0xCF,0xFF,0x03,0x00,0x00,0xC0,0xFF,0x83,0xFF,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0x0E,0x00,0x00,0xE0,0x00,0x00,0x00,0x0E,0x00,0x00,0x60,0x00,0x00,0x00,0x0C, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F, // 124 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0xE0,0x00,0x00,0x00,0x0E,0x00,0x00,0xE0,0x00,0x00,0x00,0x0E,0x00,0x00,0xC0,0x01,0x00,0x00,0x07,0x00,0x00,0xC0,0xFF,0x83,0xFF,0x07,0x00,0x00,0x80,0xFF,0xEF,0xFF,0x03,0x00,0x00,0x00,0xFF,0xEF,0xFF,0x01,0x00,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 125 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x07, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 127 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 128 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 129 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 130 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 131 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 132 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 133 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 134 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 135 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 136 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 137 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 138 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 139 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 140 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 141 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 142 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 143 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 144 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 145 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 146 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 147 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 148 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 149 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 150 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 151 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 152 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 153 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 154 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 155 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 156 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 157 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 158 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 159 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xE0,0xFF,0x0F,0x00,0x00,0x00,0xF8,0xFC,0xFF,0x0F,0x00,0x00,0x00,0xF8,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x70, // 161 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x00,0x00,0x7E,0xE0,0x03,0x00,0x00,0x00,0x00,0x0E,0x80,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0xE0,0x07,0x00,0x3F,0x00,0x00,0x00,0xE0,0x07,0x00,0x3F,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x80,0x03, // 162 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x38,0x00,0x00,0x00,0x00,0x00,0x06,0x38,0x00,0x00,0x00,0x00,0x00,0x06,0x3C,0x00,0x00,0x00,0x00,0x00,0x06,0x3F,0x00,0x00,0x00,0x00,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x80,0xFF,0xFF,0x37,0x00,0x00,0x00,0xC0,0x07,0x06,0x30,0x00,0x00,0x00,0xC0,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0x60,0x00,0x06,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30, // 163 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x1C,0x8F,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0x00,0x00,0x00,0xF0,0xF9,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0xC0,0x01,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x00,0x00,0x00,0x18,0x80,0x01,0x00,0x00,0x00,0x00,0x30,0xC0,0x01,0x00,0x00,0x00,0x00,0x70,0xE0,0x00,0x00,0x00,0x00,0x00,0xF0,0xF9,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0x00,0x00,0x00,0x00,0x1C,0x8F,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x01, // 164 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x8C,0x01,0x00,0x00,0x00,0x80,0x0F,0x8C,0x01,0x00,0x00,0x00,0x00,0x3E,0x8C,0x01,0x00,0x00,0x00,0x00,0xF8,0x8C,0x01,0x00,0x00,0x00,0x00,0xE0,0x8F,0x01,0x00,0x00,0x00,0x00,0xC0,0x8F,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0x8F,0x01,0x00,0x00,0x00,0x00,0xF0,0x8F,0x01,0x00,0x00,0x00,0x00,0xF8,0x8C,0x01,0x00,0x00,0x00,0x00,0x3E,0x8C,0x01,0x00,0x00,0x00,0x80,0x0F,0x8C,0x01,0x00,0x00,0x00,0xE0,0x03,0x8C,0x01,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x60, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0xFE,0x3F,0x00,0x00,0xF8,0xFF,0x00,0xFE,0x3F,0x00,0x00,0xF8,0xFF,0x00,0xFE,0x3F, // 166 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x01,0x18,0x00,0x00,0x00,0xE0,0xE3,0x07,0x18,0x00,0x00,0x00,0xF0,0xF7,0x0F,0x38,0x00,0x00,0x00,0x30,0x3F,0x1E,0x30,0x00,0x00,0x00,0x18,0x1E,0x1C,0x30,0x00,0x00,0x00,0x18,0x1C,0x18,0x30,0x00,0x00,0x00,0x18,0x1C,0x38,0x30,0x00,0x00,0x00,0x18,0x18,0x30,0x30,0x00,0x00,0x00,0x18,0x38,0x70,0x30,0x00,0x00,0x00,0x18,0x38,0x70,0x38,0x00,0x00,0x00,0x18,0x70,0xF8,0x1C,0x00,0x00,0x00,0x38,0xE0,0xFF,0x1F,0x00,0x00,0x00,0x30,0xE0,0xCF,0x0F,0x00,0x00,0x00,0x00,0x80,0x03,0x03, // 167 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x40, // 168 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x80,0x01,0x00,0x0C,0x00,0x00,0x00,0xC0,0x81,0x0F,0x18,0x00,0x00,0x00,0xC0,0xE0,0x3F,0x18,0x00,0x00,0x00,0xC0,0xF0,0xFF,0x18,0x00,0x00,0x00,0x60,0x38,0xE0,0x30,0x00,0x00,0x00,0x60,0x1C,0xC0,0x31,0x00,0x00,0x00,0x60,0x0C,0x80,0x31,0x00,0x00,0x00,0x60,0x0C,0x80,0x31,0x00,0x00,0x00,0x60,0x0C,0x80,0x31,0x00,0x00,0x00,0x60,0x0C,0x80,0x31,0x00,0x00,0x00,0x60,0x1C,0xC0,0x31,0x00,0x00,0x00,0xC0,0x18,0xC0,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x01,0x00,0x0C,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0xF8,0xFD,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F, // 169 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0x98,0x01,0x00,0x00,0x00,0x00,0x60,0x8C,0x01,0x00,0x00,0x00,0x00,0x60,0x8C,0x01,0x00,0x00,0x00,0x00,0x60,0x8C,0x01,0x00,0x00,0x00,0x00,0x60,0x8C,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x01, // 170 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xCF,0x03,0x00,0x00,0x00,0x00,0x80,0x03,0x07,0x00,0x00,0x00,0x00,0xC0,0x01,0x0E,0x00,0x00,0x00,0x00,0x80,0x30,0x04,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0x01,0x00,0x00,0x00,0x00,0x80,0x87,0x07,0x00,0x00,0x00,0x00,0xC0,0x03,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x0E, // 171 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0x01, // 172 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 173 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x80,0x01,0x00,0x0C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0xFC,0xFF,0x19,0x00,0x00,0x00,0x60,0xFC,0xFF,0x31,0x00,0x00,0x00,0x60,0x0C,0x06,0x30,0x00,0x00,0x00,0x60,0x0C,0x06,0x30,0x00,0x00,0x00,0x60,0x0C,0x06,0x30,0x00,0x00,0x00,0x60,0x0C,0x1E,0x30,0x00,0x00,0x00,0x60,0x1C,0x3F,0x30,0x00,0x00,0x00,0x60,0xF8,0xFB,0x30,0x00,0x00,0x00,0xC0,0xF8,0xE1,0x19,0x00,0x00,0x00,0xC0,0xE0,0x80,0x19,0x00,0x00,0x00,0xC0,0x01,0x00,0x1D,0x00,0x00,0x00,0x80,0x01,0x00,0x0C,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0xF8,0xFD,0x00,0x00,0x00,0x00,0x00,0xE0,0x3F, // 174 + 0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 175 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0xC0,0x71,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0xC0,0x71,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x0E, // 176 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0xFE,0xFF,0x19,0x00,0x00,0x00,0x00,0xFE,0xFF,0x19,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x03,0x18, // 177 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x0C,0x00,0x00,0x00,0x00,0xC0,0x00,0x0E,0x00,0x00,0x00,0x00,0xE0,0x00,0x0F,0x00,0x00,0x00,0x00,0x60,0x80,0x0D,0x00,0x00,0x00,0x00,0x60,0xC0,0x0C,0x00,0x00,0x00,0x00,0x60,0x60,0x0C,0x00,0x00,0x00,0x00,0x60,0x38,0x0C,0x00,0x00,0x00,0x00,0xC0,0x1F,0x0C,0x00,0x00,0x00,0x00,0xC0,0x0F,0x0C,0x00,0x00,0x00,0x00,0x00,0x02,0x0C, // 178 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x06,0x00,0x00,0x00,0x00,0xC0,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x1C,0x0C,0x00,0x00,0x00,0x00,0xC0,0x3F,0x07,0x00,0x00,0x00,0x00,0xC0,0xE7,0x07,0x00,0x00,0x00,0x00,0x00,0xC3,0x03, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x18, // 180 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 181 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x03, // 182 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x07, // 183 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0xC0,0x31,0x00,0x00,0x00,0x00,0x00,0xC0,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x1E, // 184 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F, // 185 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0xC0,0xE1,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0xC0,0xE1,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, // 186 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x0E,0x00,0x00,0x00,0x00,0xC0,0x03,0x0F,0x00,0x00,0x00,0x00,0x80,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0xCE,0x01,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x80,0x30,0x04,0x00,0x00,0x00,0x00,0xC0,0x01,0x0E,0x00,0x00,0x00,0x00,0x80,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0xC7,0x03,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x78, // 187 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x38,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x06,0x00,0x00,0x00,0x00,0xF0,0x80,0x07,0x00,0x00,0x00,0x00,0x78,0xC0,0x07,0x00,0x00,0x00,0x00,0x1E,0xF0,0x06,0x00,0x00,0x00,0x00,0x0F,0x38,0x06,0x00,0x00,0x00,0xC0,0x03,0x1C,0x06,0x00,0x00,0x00,0xE0,0x00,0x07,0x06,0x00,0x00,0x00,0x60,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 188 + 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x38,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x30,0x00,0x00,0x00,0x00,0x1E,0x03,0x38,0x00,0x00,0x00,0x00,0x8F,0x03,0x3C,0x00,0x00,0x00,0xC0,0x83,0x01,0x36,0x00,0x00,0x00,0xE0,0x80,0x01,0x33,0x00,0x00,0x00,0x60,0x80,0x81,0x31,0x00,0x00,0x00,0x00,0x80,0xE1,0x30,0x00,0x00,0x00,0x00,0x00,0x7F,0x30,0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x30, // 189 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x06,0x00,0x00,0x00,0x00,0xC0,0x00,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x18,0x0C,0x00,0x00,0x00,0x00,0x60,0x1C,0x0C,0x30,0x00,0x00,0x00,0xC0,0x3F,0x07,0x38,0x00,0x00,0x00,0xC0,0xE7,0x07,0x1E,0x00,0x00,0x00,0x00,0xC3,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x06,0x00,0x00,0x00,0x00,0xC0,0x83,0x07,0x00,0x00,0x00,0x00,0xF0,0xC0,0x07,0x00,0x00,0x00,0x00,0x78,0xF0,0x06,0x00,0x00,0x00,0x00,0x1E,0x38,0x06,0x00,0x00,0x00,0x00,0x0F,0x1C,0x06,0x00,0x00,0x00,0xC0,0x03,0x07,0x06,0x00,0x00,0x00,0xE0,0x80,0xFF,0x3F,0x00,0x00,0x00,0x60,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 190 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x0F,0x06,0x00,0x00,0x00,0x00,0x80,0x03,0x0C,0x00,0x00,0x00,0x00,0xC0,0x03,0x0C,0x00,0x00,0x00,0xF0,0xF0,0x01,0x0C,0x00,0x00,0x00,0xF8,0xFC,0x00,0x0C,0x00,0x00,0x00,0xF8,0x3C,0x00,0x0C,0x00,0x00,0x00,0x70,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x06, // 191 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x60,0x00,0xE0,0x1F,0x00,0x00,0x00,0xE0,0x00,0xF8,0x1B,0x00,0x00,0x00,0xE0,0x01,0x7F,0x18,0x00,0x00,0x00,0xC0,0xC3,0x1F,0x18,0x00,0x00,0x00,0x00,0xE7,0x03,0x18,0x00,0x00,0x00,0x00,0xE6,0x03,0x18,0x00,0x00,0x00,0x00,0xC0,0x0F,0x18,0x00,0x00,0x00,0x00,0x00,0x7F,0x18,0x00,0x00,0x00,0x00,0x00,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 192 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0x7F,0x18,0x00,0x00,0x00,0x00,0xC6,0x1F,0x18,0x00,0x00,0x00,0x00,0xE7,0x03,0x18,0x00,0x00,0x00,0xC0,0xE3,0x03,0x18,0x00,0x00,0x00,0xE0,0xC1,0x0F,0x18,0x00,0x00,0x00,0xE0,0x00,0x7F,0x18,0x00,0x00,0x00,0x60,0x00,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 193 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x04,0xE0,0x1F,0x00,0x00,0x00,0x00,0x07,0xF8,0x1B,0x00,0x00,0x00,0x80,0x03,0x7F,0x18,0x00,0x00,0x00,0xC0,0xC1,0x1F,0x18,0x00,0x00,0x00,0xE0,0xE0,0x03,0x18,0x00,0x00,0x00,0x60,0xE0,0x03,0x18,0x00,0x00,0x00,0xE0,0xC1,0x0F,0x18,0x00,0x00,0x00,0xC0,0x03,0x7F,0x18,0x00,0x00,0x00,0x80,0x03,0xF8,0x1B,0x00,0x00,0x00,0x00,0x06,0xE0,0x1F,0x00,0x00,0x00,0x00,0x04,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 194 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x07,0x00,0x3F,0x00,0x00,0x00,0x00,0x03,0xE0,0x1F,0x00,0x00,0x00,0x80,0x03,0xF8,0x1B,0x00,0x00,0x00,0x80,0x01,0x7F,0x18,0x00,0x00,0x00,0x80,0xC3,0x1F,0x18,0x00,0x00,0x00,0x80,0xE3,0x03,0x18,0x00,0x00,0x00,0x00,0xE3,0x03,0x18,0x00,0x00,0x00,0x00,0xC7,0x0F,0x18,0x00,0x00,0x00,0x00,0x06,0x7F,0x18,0x00,0x00,0x00,0x00,0x07,0xF8,0x1B,0x00,0x00,0x00,0x00,0x07,0xE0,0x1F,0x00,0x00,0x00,0x80,0x03,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 195 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x01,0xE0,0x1F,0x00,0x00,0x00,0x80,0x03,0xF8,0x1B,0x00,0x00,0x00,0x80,0x03,0x7F,0x18,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x00,0x00,0x00,0x00,0xC0,0x0F,0x18,0x00,0x00,0x00,0x80,0x03,0x7F,0x18,0x00,0x00,0x00,0x80,0x03,0xF8,0x1B,0x00,0x00,0x00,0x00,0x01,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 196 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x1C,0xF8,0x1B,0x00,0x00,0x00,0x00,0x3E,0x7F,0x18,0x00,0x00,0x00,0x00,0xE3,0x1F,0x18,0x00,0x00,0x00,0x00,0xE3,0x03,0x18,0x00,0x00,0x00,0x00,0xE3,0x03,0x18,0x00,0x00,0x00,0x00,0xE3,0x0F,0x18,0x00,0x00,0x00,0x00,0x3E,0x7F,0x18,0x00,0x00,0x00,0x00,0x1C,0xF8,0x1B,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 197 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF0,0x1B,0x00,0x00,0x00,0x00,0x00,0xFC,0x18,0x00,0x00,0x00,0x00,0x00,0x3F,0x18,0x00,0x00,0x00,0x00,0xC0,0x0F,0x18,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x00,0x00,0x00,0x00,0xE0,0x00,0x18,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 198 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x7F,0xE0,0x07,0x00,0x00,0x00,0x80,0x0F,0x00,0x0F,0x00,0x00,0x00,0x80,0x03,0x00,0x1E,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x30,0x00,0x00,0x60,0x00,0x00,0x30,0x31,0x00,0x00,0x60,0x00,0x00,0xF0,0x31,0x00,0x00,0x60,0x00,0x00,0xF0,0x33,0x00,0x00,0x60,0x00,0x00,0x30,0x1F,0x00,0x00,0x60,0x00,0x00,0x30,0x1E,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0x40, // 199 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x60,0x60,0x00,0x03,0x30,0x00,0x00,0xE0,0x60,0x00,0x03,0x30,0x00,0x00,0xE0,0x61,0x00,0x03,0x30,0x00,0x00,0xC0,0x63,0x00,0x03,0x30,0x00,0x00,0x00,0x67,0x00,0x03,0x30,0x00,0x00,0x00,0x66,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 200 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x66,0x00,0x03,0x30,0x00,0x00,0x00,0x67,0x00,0x03,0x30,0x00,0x00,0xC0,0x63,0x00,0x03,0x30,0x00,0x00,0xE0,0x61,0x00,0x03,0x30,0x00,0x00,0xE0,0x60,0x00,0x03,0x30,0x00,0x00,0x60,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 201 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE4,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x67,0x00,0x03,0x30,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0xC0,0x61,0x00,0x03,0x30,0x00,0x00,0xE0,0x60,0x00,0x03,0x30,0x00,0x00,0x60,0x60,0x00,0x03,0x30,0x00,0x00,0xE0,0x61,0x00,0x03,0x30,0x00,0x00,0xC0,0x63,0x00,0x03,0x30,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0x00,0x66,0x00,0x03,0x30,0x00,0x00,0x00,0x64,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 202 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE1,0xFF,0xFF,0x3F,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0x80,0x63,0x00,0x03,0x30,0x00,0x00,0x00,0x61,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30, // 203 + 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE6,0xFF,0xFF,0x3F, // 204 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0xFF,0xFF,0x3F,0x00,0x00,0xC0,0xE3,0xFF,0xFF,0x3F,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x60, // 205 + 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0xE0,0xE1,0xFF,0xFF,0x3F,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x04, // 206 + 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x01, // 207 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x03,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x03,0x00,0x0E,0x00,0x00,0x00,0x80,0x07,0x80,0x0F,0x00,0x00,0x00,0x00,0x3F,0xF0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 208 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x00,0x00,0x00,0x00,0x00,0x03,0x7E,0x00,0x00,0x00,0x00,0x80,0x03,0xF8,0x00,0x00,0x00,0x00,0x80,0x01,0xE0,0x03,0x00,0x00,0x00,0x80,0x03,0xC0,0x07,0x00,0x00,0x00,0x80,0x03,0x00,0x1F,0x00,0x00,0x00,0x00,0x03,0x00,0x3E,0x00,0x00,0x00,0x00,0x07,0x00,0xF8,0x00,0x00,0x00,0x00,0x06,0x00,0xF0,0x03,0x00,0x00,0x00,0x07,0x00,0xC0,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x1F,0x00,0x00,0x80,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F, // 209 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x60,0xC0,0x00,0x00,0x18,0x00,0x00,0xE0,0x60,0x00,0x00,0x30,0x00,0x00,0xE0,0x61,0x00,0x00,0x30,0x00,0x00,0xC0,0x63,0x00,0x00,0x30,0x00,0x00,0x00,0x67,0x00,0x00,0x30,0x00,0x00,0x00,0x66,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 210 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x66,0x00,0x00,0x30,0x00,0x00,0x00,0x67,0x00,0x00,0x30,0x00,0x00,0xC0,0x63,0x00,0x00,0x30,0x00,0x00,0xE0,0x61,0x00,0x00,0x30,0x00,0x00,0xE0,0x60,0x00,0x00,0x30,0x00,0x00,0x60,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 211 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC4,0x01,0x00,0x18,0x00,0x00,0x00,0xC7,0x00,0x00,0x18,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0xC0,0x61,0x00,0x00,0x30,0x00,0x00,0xE0,0x60,0x00,0x00,0x30,0x00,0x00,0x60,0x60,0x00,0x00,0x30,0x00,0x00,0xE0,0x61,0x00,0x00,0x30,0x00,0x00,0xC0,0x63,0x00,0x00,0x30,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x00,0xC6,0x00,0x00,0x18,0x00,0x00,0x00,0xC4,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 212 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC7,0x01,0x00,0x18,0x00,0x00,0x00,0xC3,0x00,0x00,0x18,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x80,0x61,0x00,0x00,0x30,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x00,0x63,0x00,0x00,0x30,0x00,0x00,0x00,0x67,0x00,0x00,0x30,0x00,0x00,0x00,0x66,0x00,0x00,0x30,0x00,0x00,0x00,0xC7,0x00,0x00,0x18,0x00,0x00,0x00,0xC7,0x00,0x00,0x18,0x00,0x00,0x80,0xC3,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 213 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0xC0,0x01,0x00,0x18,0x00,0x00,0x00,0xC1,0x00,0x00,0x18,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x80,0x63,0x00,0x00,0x30,0x00,0x00,0x80,0xC3,0x00,0x00,0x18,0x00,0x00,0x00,0xC1,0x00,0x00,0x18,0x00,0x00,0x00,0xC0,0x01,0x00,0x1C,0x00,0x00,0x00,0x80,0x07,0x00,0x0F,0x00,0x00,0x00,0x00,0x3F,0xE0,0x07,0x00,0x00,0x00,0x00,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 214 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x3C,0xE0,0x01,0x00,0x00,0x00,0x00,0x78,0xF0,0x00,0x00,0x00,0x00,0x00,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0xE0,0x3D,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x3D,0x00,0x00,0x00,0x00,0x00,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x78,0xF0,0x00,0x00,0x00,0x00,0x00,0x3C,0xE0,0x01,0x00,0x00,0x00,0x00,0x1C,0xC0,0x01,0x00,0x00,0x00,0x00,0x08,0x80, // 215 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x20,0x00,0x00,0x00,0x00,0xFE,0xFF,0x33,0x00,0x00,0x00,0x00,0x3F,0xE0,0x7F,0x00,0x00,0x00,0x80,0x07,0x00,0x1F,0x00,0x00,0x00,0xC0,0x01,0x00,0x1F,0x00,0x00,0x00,0xC0,0x01,0xC0,0x1F,0x00,0x00,0x00,0xC0,0x00,0xE0,0x19,0x00,0x00,0x00,0x60,0x00,0xF8,0x30,0x00,0x00,0x00,0x60,0x00,0x3C,0x30,0x00,0x00,0x00,0x60,0x00,0x1E,0x30,0x00,0x00,0x00,0x60,0x80,0x07,0x30,0x00,0x00,0x00,0x60,0xC0,0x03,0x30,0x00,0x00,0x00,0x60,0xF0,0x01,0x30,0x00,0x00,0x00,0x60,0x78,0x00,0x30,0x00,0x00,0x00,0xC0,0x3E,0x00,0x18,0x00,0x00,0x00,0xC0,0x0F,0x00,0x18,0x00,0x00,0x00,0xC0,0x07,0x00,0x1C,0x00,0x00,0x00,0xE0,0x07,0x00,0x0F,0x00,0x00,0x00,0xF0,0x3F,0xE0,0x07,0x00,0x00,0x00,0x60,0xFE,0xFF,0x03,0x00,0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F, // 216 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0xE0,0x01,0x00,0x00,0x30,0x00,0x00,0xC0,0x03,0x00,0x00,0x30,0x00,0x00,0x00,0x07,0x00,0x00,0x30,0x00,0x00,0x00,0x06,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF, // 217 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x06,0x00,0x00,0x30,0x00,0x00,0x00,0x07,0x00,0x00,0x30,0x00,0x00,0xC0,0x03,0x00,0x00,0x30,0x00,0x00,0xE0,0x01,0x00,0x00,0x30,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF, // 218 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x80,0x03,0x00,0x00,0x38,0x00,0x00,0xC0,0x01,0x00,0x00,0x30,0x00,0x00,0xE0,0x00,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0x01,0x00,0x00,0x30,0x00,0x00,0xC0,0x03,0x00,0x00,0x30,0x00,0x00,0x80,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x06,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF, // 219 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x01,0x00,0x00,0x18,0x00,0x00,0x80,0x03,0x00,0x00,0x38,0x00,0x00,0x80,0x03,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x03,0x00,0x00,0x38,0x00,0x00,0x80,0x03,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00,0xE0,0xFF,0xFF, // 220 + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x06,0x80,0xFF,0x3F,0x00,0x00,0x00,0x07,0x00,0xFE,0x3F,0x00,0x00,0xC0,0x03,0x00,0xFE,0x3F,0x00,0x00,0xE0,0x01,0x80,0x0F,0x00,0x00,0x00,0xE0,0x00,0xE0,0x03,0x00,0x00,0x00,0x60,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x20, // 221 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x0E,0xE0,0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x00,0x00,0x00,0x00,0x00,0x1C,0x78,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F, // 222 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x1C,0x00,0x00,0x00,0x18,0xC0,0x00,0x38,0x00,0x00,0x00,0x18,0xE0,0x03,0x30,0x00,0x00,0x00,0x18,0xF0,0x07,0x30,0x00,0x00,0x00,0x18,0x38,0x0F,0x30,0x00,0x00,0x00,0x30,0x1C,0x1E,0x30,0x00,0x00,0x00,0xF0,0x0F,0x1C,0x30,0x00,0x00,0x00,0xE0,0x0F,0x38,0x38,0x00,0x00,0x00,0xC0,0x03,0xF8,0x1C,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F, // 223 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x30,0xF0,0x1F,0x00,0x00,0x00,0x18,0x30,0x70,0x38,0x00,0x00,0x00,0x38,0x38,0x30,0x30,0x00,0x00,0x00,0x78,0x18,0x38,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x00,0x00,0x00,0xC0,0x19,0x18,0x30,0x00,0x00,0x00,0x80,0x19,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x38,0x18,0x0C,0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 224 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x30,0xF0,0x1F,0x00,0x00,0x00,0x00,0x30,0x70,0x38,0x00,0x00,0x00,0x00,0x38,0x30,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x80,0x19,0x18,0x30,0x00,0x00,0x00,0xC0,0x19,0x18,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x00,0x00,0x00,0x38,0x38,0x18,0x0C,0x00,0x00,0x00,0x18,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 225 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x31,0xF0,0x1F,0x00,0x00,0x00,0xC0,0x31,0x70,0x38,0x00,0x00,0x00,0xE0,0x38,0x30,0x30,0x00,0x00,0x00,0x70,0x18,0x38,0x30,0x00,0x00,0x00,0x38,0x18,0x18,0x30,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x78,0x18,0x18,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x18,0x00,0x00,0x00,0xE0,0x38,0x18,0x0C,0x00,0x00,0x00,0x80,0xF1,0xFF,0x07,0x00,0x00,0x00,0x00,0xF1,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 226 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0xC0,0x31,0xF0,0x1F,0x00,0x00,0x00,0xC0,0x30,0x70,0x38,0x00,0x00,0x00,0xE0,0x38,0x30,0x30,0x00,0x00,0x00,0x60,0x18,0x38,0x30,0x00,0x00,0x00,0xE0,0x18,0x18,0x30,0x00,0x00,0x00,0xE0,0x18,0x18,0x30,0x00,0x00,0x00,0xC0,0x18,0x18,0x30,0x00,0x00,0x00,0xC0,0x19,0x18,0x18,0x00,0x00,0x00,0x80,0x39,0x18,0x0C,0x00,0x00,0x00,0xC0,0xF1,0xFF,0x07,0x00,0x00,0x00,0xC0,0xF1,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xC0,0xFF,0x3F, // 227 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x40,0x30,0xF0,0x1F,0x00,0x00,0x00,0xE0,0x30,0x70,0x38,0x00,0x00,0x00,0xE0,0x38,0x30,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0xE0,0x18,0x18,0x18,0x00,0x00,0x00,0xE0,0x38,0x18,0x0C,0x00,0x00,0x00,0x40,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 228 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00,0x30,0xF0,0x1F,0x00,0x00,0x00,0x00,0x30,0x70,0x38,0x00,0x00,0x00,0x70,0x38,0x30,0x30,0x00,0x00,0x00,0xF8,0x18,0x38,0x30,0x00,0x00,0x00,0x8C,0x19,0x18,0x30,0x00,0x00,0x00,0x8C,0x19,0x18,0x30,0x00,0x00,0x00,0x8C,0x19,0x18,0x30,0x00,0x00,0x00,0x8C,0x19,0x18,0x18,0x00,0x00,0x00,0xF8,0x38,0x18,0x0C,0x00,0x00,0x00,0x70,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 229 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x10,0xE0,0x1F,0x00,0x00,0x00,0x00,0x30,0xF0,0x1F,0x00,0x00,0x00,0x00,0x30,0x70,0x38,0x00,0x00,0x00,0x00,0x18,0x30,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x38,0x00,0x00,0x00,0x00,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x38,0x18,0x1C,0x00,0x00,0x00,0x00,0xF0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00,0x00,0xC0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xE0,0x19,0x1F,0x00,0x00,0x00,0x00,0x70,0x18,0x1C,0x00,0x00,0x00,0x00,0x38,0x18,0x38,0x00,0x00,0x00,0x00,0x18,0x18,0x38,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x38,0x18,0x30,0x00,0x00,0x00,0x00,0x70,0x18,0x30,0x00,0x00,0x00,0x00,0xE0,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x80,0x1F, // 230 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x01,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0x30,0x00,0x38,0x30,0x00,0x00,0x00,0x18,0x00,0x30,0x31,0x00,0x00,0x00,0x18,0x00,0xF0,0x31,0x00,0x00,0x00,0x18,0x00,0xF0,0x33,0x00,0x00,0x00,0x18,0x00,0x30,0x1F,0x00,0x00,0x00,0x18,0x00,0x30,0x1E,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x10,0x00,0x18, // 231 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x19,0x0F,0x00,0x00,0x00,0x18,0x70,0x18,0x1C,0x00,0x00,0x00,0x38,0x38,0x18,0x18,0x00,0x00,0x00,0x78,0x18,0x18,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x00,0x00,0x00,0xC0,0x19,0x18,0x30,0x00,0x00,0x00,0x80,0x19,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x00,0x00,0x00,0x00,0xF0,0x18,0x30,0x00,0x00,0x00,0x00,0xE0,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x1F, // 232 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x19,0x0F,0x00,0x00,0x00,0x00,0x70,0x18,0x1C,0x00,0x00,0x00,0x00,0x38,0x18,0x18,0x00,0x00,0x00,0x80,0x19,0x18,0x30,0x00,0x00,0x00,0xC0,0x19,0x18,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x00,0x00,0x00,0x78,0x18,0x18,0x30,0x00,0x00,0x00,0x38,0x18,0x18,0x30,0x00,0x00,0x00,0x18,0x30,0x18,0x30,0x00,0x00,0x00,0x00,0xF0,0x18,0x30,0x00,0x00,0x00,0x00,0xE0,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x1F, // 233 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF1,0x19,0x0F,0x00,0x00,0x00,0xC0,0x71,0x18,0x1C,0x00,0x00,0x00,0xE0,0x38,0x18,0x18,0x00,0x00,0x00,0x70,0x18,0x18,0x30,0x00,0x00,0x00,0x38,0x18,0x18,0x30,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x78,0x18,0x18,0x30,0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x00,0x00,0x00,0xE0,0x30,0x18,0x30,0x00,0x00,0x00,0x80,0xF1,0x18,0x30,0x00,0x00,0x00,0x00,0xE1,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x1F, // 234 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x40,0xF0,0x19,0x0F,0x00,0x00,0x00,0xE0,0x70,0x18,0x1C,0x00,0x00,0x00,0xE0,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0xE0,0x18,0x18,0x30,0x00,0x00,0x00,0xE0,0x30,0x18,0x30,0x00,0x00,0x00,0x40,0xF0,0x18,0x30,0x00,0x00,0x00,0x00,0xE0,0x1F,0x38,0x00,0x00,0x00,0x00,0xC0,0x1F,0x18,0x00,0x00,0x00,0x00,0x00,0x1F, // 235 + 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xC0,0xF9,0xFF,0x3F,0x00,0x00,0x00,0x80,0xF9,0xFF,0x3F, // 236 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF9,0xFF,0x3F,0x00,0x00,0x00,0xC0,0xF9,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x18, // 237 + 0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x18,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x78,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01, // 238 + 0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x40, // 239 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0x00,0x00,0x80,0xFF,0x0F,0x00,0x00,0x00,0x00,0xC0,0x03,0x1E,0x00,0x00,0x00,0x00,0xC3,0x00,0x18,0x00,0x00,0x00,0x38,0xE3,0x00,0x38,0x00,0x00,0x00,0xB8,0x63,0x00,0x30,0x00,0x00,0x00,0xF0,0x61,0x00,0x30,0x00,0x00,0x00,0xE0,0x61,0x00,0x30,0x00,0x00,0x00,0xE0,0x60,0x00,0x30,0x00,0x00,0x00,0xE0,0x61,0x00,0x30,0x00,0x00,0x00,0xE0,0xC3,0x00,0x38,0x00,0x00,0x00,0x70,0xCF,0x00,0x18,0x00,0x00,0x00,0x38,0xBE,0x01,0x1E,0x00,0x00,0x00,0x10,0xFC,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00,0x00,0x00,0x80,0xFF,0x01, // 240 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xC0,0xE1,0xFF,0x3F,0x00,0x00,0x00,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0xE0,0x30,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x00,0x00,0x00,0x00,0x00,0xC0,0x18,0x00,0x00,0x00,0x00,0x00,0xC0,0x19,0x00,0x00,0x00,0x00,0x00,0x80,0x19,0x00,0x00,0x00,0x00,0x00,0xC0,0x39,0x00,0x00,0x00,0x00,0x00,0xC0,0xF1,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F, // 241 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x18,0x70,0x00,0x1C,0x00,0x00,0x00,0x38,0x38,0x00,0x38,0x00,0x00,0x00,0x78,0x18,0x00,0x30,0x00,0x00,0x00,0xF0,0x18,0x00,0x30,0x00,0x00,0x00,0xC0,0x19,0x00,0x30,0x00,0x00,0x00,0x80,0x19,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0xF0,0x01,0x1F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 242 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x80,0x19,0x00,0x30,0x00,0x00,0x00,0xC0,0x19,0x00,0x30,0x00,0x00,0x00,0xF0,0x18,0x00,0x30,0x00,0x00,0x00,0x78,0x18,0x00,0x30,0x00,0x00,0x00,0x38,0x18,0x00,0x30,0x00,0x00,0x00,0x18,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0xF0,0x01,0x1F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 243 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF1,0x00,0x1E,0x00,0x00,0x00,0xC0,0x71,0x00,0x1C,0x00,0x00,0x00,0xE0,0x38,0x00,0x38,0x00,0x00,0x00,0x70,0x18,0x00,0x30,0x00,0x00,0x00,0x38,0x18,0x00,0x30,0x00,0x00,0x00,0x18,0x18,0x00,0x30,0x00,0x00,0x00,0x78,0x18,0x00,0x30,0x00,0x00,0x00,0xF0,0x18,0x00,0x30,0x00,0x00,0x00,0xE0,0x38,0x00,0x38,0x00,0x00,0x00,0x80,0x71,0x00,0x1C,0x00,0x00,0x00,0x00,0xF1,0x01,0x1F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 244 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0xC0,0xF1,0x00,0x1E,0x00,0x00,0x00,0xC0,0x70,0x00,0x1C,0x00,0x00,0x00,0xE0,0x38,0x00,0x38,0x00,0x00,0x00,0x60,0x18,0x00,0x30,0x00,0x00,0x00,0xE0,0x18,0x00,0x30,0x00,0x00,0x00,0xE0,0x18,0x00,0x30,0x00,0x00,0x00,0xC0,0x18,0x00,0x30,0x00,0x00,0x00,0xC0,0x19,0x00,0x30,0x00,0x00,0x00,0x80,0x39,0x00,0x38,0x00,0x00,0x00,0xC0,0x71,0x00,0x1C,0x00,0x00,0x00,0xC0,0xF1,0x01,0x1F,0x00,0x00,0x00,0xE0,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 245 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x40,0xF0,0x00,0x1E,0x00,0x00,0x00,0xE0,0x70,0x00,0x1C,0x00,0x00,0x00,0xE0,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0xE0,0x18,0x00,0x30,0x00,0x00,0x00,0xE0,0x38,0x00,0x38,0x00,0x00,0x00,0x40,0x70,0x00,0x1C,0x00,0x00,0x00,0x00,0xF0,0x01,0x1F,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x80,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 246 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x1C,0xE3,0x00,0x00,0x00,0x00,0x00,0x1E,0xE3,0x01,0x00,0x00,0x00,0x00,0x1E,0xE3,0x01,0x00,0x00,0x00,0x00,0x0C,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03, // 247 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x37,0x00,0x00,0x00,0x00,0xE0,0xFF,0x7F,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,0x1F,0x00,0x00,0x00,0x00,0x38,0x80,0x3F,0x00,0x00,0x00,0x00,0x18,0xE0,0x33,0x00,0x00,0x00,0x00,0x18,0xF0,0x30,0x00,0x00,0x00,0x00,0x18,0x7C,0x30,0x00,0x00,0x00,0x00,0x18,0x1E,0x30,0x00,0x00,0x00,0x00,0x18,0x0F,0x30,0x00,0x00,0x00,0x00,0xF0,0x03,0x38,0x00,0x00,0x00,0x00,0xF0,0x01,0x1C,0x00,0x00,0x00,0x00,0xF0,0x00,0x1F,0x00,0x00,0x00,0x00,0xFC,0xFF,0x0F,0x00,0x00,0x00,0x00,0x98,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFE, // 248 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x30,0x00,0x00,0x00,0xF0,0x00,0x00,0x30,0x00,0x00,0x00,0xC0,0x01,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 249 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x30,0x00,0x00,0x00,0xC0,0x01,0x00,0x30,0x00,0x00,0x00,0xF0,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 250 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF9,0xFF,0x1F,0x00,0x00,0x00,0xC0,0x01,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x30,0x00,0x00,0x00,0xF0,0x00,0x00,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x18,0x00,0x00,0x00,0x80,0x01,0x00,0x0E,0x00,0x00,0x00,0x00,0xF9,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 251 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x40,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x40,0xF8,0xFF,0x1F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFF,0x3F, // 252 + 0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x30,0x00,0x00,0x00,0xF8,0x01,0x00,0x30,0x00,0x00,0x00,0xF0,0x0F,0x00,0x30,0x00,0x00,0x00,0xC0,0x3F,0x00,0x38,0x00,0x00,0x00,0x00,0xFE,0x01,0x18,0x00,0x00,0x00,0x00,0xF0,0x07,0x1E,0x00,0x00,0x80,0x01,0xC0,0xFF,0x0F,0x00,0x00,0xC0,0x01,0x00,0xFE,0x07,0x00,0x00,0xF0,0x00,0x00,0xFC,0x01,0x00,0x00,0x78,0x00,0x80,0x3F,0x00,0x00,0x00,0x38,0x00,0xF0,0x0F,0x00,0x00,0x00,0x18,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x08, // 253 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x00,0xC0,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0xFF,0x01, // 254 + 0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x78,0x00,0x00,0x30,0x00,0x00,0x00,0xF8,0x01,0x00,0x30,0x00,0x00,0x00,0xF0,0x0F,0x00,0x30,0x00,0x00,0x40,0xC0,0x3F,0x00,0x38,0x00,0x00,0xE0,0x00,0xFE,0x01,0x18,0x00,0x00,0xE0,0x00,0xF0,0x07,0x1E,0x00,0x00,0x00,0x00,0xC0,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xE0,0x00,0xF0,0x0F,0x00,0x00,0x00,0xE0,0x00,0xFE,0x01,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x08 // 255 +}; diff --git a/framesync.h b/framesync.h new file mode 100644 index 00000000..bc8d5e89 --- /dev/null +++ b/framesync.h @@ -0,0 +1,372 @@ +#ifndef FRAMESYNC_H_ +#define FRAMESYNC_H_ + +// fast digitalRead() +#if defined(ESP8266) +#define digitalRead(x) ((GPIO_REG_READ(GPIO_IN_ADDRESS) >> x) & 1) +#ifndef DEBUG_IN_PIN +#define DEBUG_IN_PIN D6 +#endif +#else // Arduino + // fastest, but non portable (Uno pin 11 = PB3, Mega2560 pin 11 = PB5) + //#define digitalRead(x) bitRead(PINB, 3) +#include "fastpin.h" +#define digitalRead(x) fastRead() +// no define for DEBUG_IN_PIN +#endif + +#include + +// FS_DEBUG: full verbose debug over serial +// FS_DEBUG_LED: just blink LED (off = adjust phase, on = normal phase) +//#define FS_DEBUG +//#define FS_DEBUG_LED + +volatile uint32_t stopTime, startTime; +volatile uint32_t armed; + +void ICACHE_RAM_ATTR risingEdgeISR_measure() { + noInterrupts(); + //stopTime = ESP.getCycleCount(); + __asm__ __volatile__("rsr %0,ccount":"=a"(stopTime)); + detachInterrupt(DEBUG_IN_PIN); + interrupts(); +} + +void ICACHE_RAM_ATTR risingEdgeISR_prepare() { + noInterrupts(); + //startTime = ESP.getCycleCount(); + __asm__ __volatile__("rsr %0,ccount":"=a"(startTime)); + detachInterrupt(DEBUG_IN_PIN); + armed = 1; + attachInterrupt(DEBUG_IN_PIN, risingEdgeISR_measure, RISING); + interrupts(); +} + +template +class FrameSyncManager { +private: + typedef typename GBS::STATUS_VDS_VERT_COUNT VERT_COUNT; + typedef typename GBS::VDS_HSYNC_RST HSYNC_RST; + typedef typename GBS::VDS_VSYNC_RST VSYNC_RST; + typedef typename GBS::VDS_VS_ST VSST; + typedef typename GBS::template Tie VRST_SST; + + static const uint8_t debugInPin = Attrs::debugInPin; + static const int16_t syncCorrection = Attrs::syncCorrection; + static const int32_t syncTargetPhase = Attrs::syncTargetPhase; + + static bool syncLockReady; + static uint8_t delayLock; + static int16_t syncLastCorrection; + + // Sample vsync start and stop times from debug pin. + static bool vsyncOutputSample(uint32_t *start, uint32_t *stop) { + startTime = 0; stopTime = 0; armed = 0; + yield(); ESP.wdtDisable(); + + attachInterrupt(DEBUG_IN_PIN, risingEdgeISR_prepare, RISING); + // typical: 300000 at 80MHz, 600000 at 160MHz + for (uint32_t i = 0; i < 3000000; i++) + { + if (armed) { + armed = 0; + delay(7); + WiFi.setSleepMode(WIFI_LIGHT_SLEEP); + } + if (stopTime > 0) { + break; + } + } + *start = startTime; + *stop = stopTime; + ESP.wdtEnable(0); + WiFi.setSleepMode(WIFI_NONE_SLEEP); + + if ((*start >= *stop) || *stop == 0 || *start == 0) { + // ESP.getCycleCount() overflow oder no pulse, just fail this round + return false; + } + + return true; + } + + // Sample input and output vsync periods and their phase + // difference in microseconds + static bool vsyncPeriodAndPhase(int32_t *periodInput, int32_t *periodOutput, int32_t *phase) { + uint32_t inStart, inStop, outStart, outStop; + uint32_t inPeriod, outPeriod, diff; + + // calling code needs to ensure debug bus is ready to sample vperiod + + if (!vsyncInputSample(&inStart, &inStop)) { + return false; + } + + GBS::TEST_BUS_SEL::write(0x2); // 0x2 = VDS (t3t50t4) // measure VDS vblank (VB ST/SP) + inPeriod = (inStop - inStart); //>> 1; + if (!vsyncOutputSample(&outStart, &outStop)) { + return false; + } + outPeriod = (outStop - outStart); //>> 1; + + + diff = (outStart - inStart) % inPeriod; + if (periodInput) + *periodInput = inPeriod; + if (periodOutput) + *periodOutput = outPeriod; + if (phase) + *phase = (diff < inPeriod) ? diff : diff - inPeriod; + + return true; + } + + static bool sampleVsyncPeriods(uint32_t *input, uint32_t *output) { + int32_t inPeriod, outPeriod; + + if (!vsyncPeriodAndPhase(&inPeriod, &outPeriod, NULL)) + return false; + + *input = inPeriod; + *output = outPeriod; + + return true; + } + + // Find appropriate htotal that makes output frame time slightly more than the input. + static bool findBestHTotal(uint32_t &bestHtotal) { + uint16_t inHtotal = HSYNC_RST::read(); + uint32_t inPeriod, outPeriod; + + if (inHtotal == 0) { return false; } // safety + if (!sampleVsyncPeriods(&inPeriod, &outPeriod)) { return false; } + + if (inPeriod == 0 || outPeriod == 0) { return false; } // safety + + // allow ~4 negative (inPeriod is < outPeriod) clock cycles jitter + if ((inPeriod > outPeriod ? inPeriod - outPeriod : outPeriod - inPeriod) <= 4) { + /*if (inPeriod >= outPeriod) { + Serial.print("inPeriod >= out: "); + Serial.println(inPeriod - outPeriod); + } + else { + Serial.print("inPeriod < out: "); + Serial.println(outPeriod - inPeriod); + }*/ + bestHtotal = inHtotal; + } + else { + // large htotal can push intermediates to 33 bits + bestHtotal = (uint64_t)(inHtotal * (uint64_t)inPeriod) / (uint64_t)outPeriod; + } + + // new 08.11.19: skip this step, IF period measurement should be stable enough to give repeatable results + //if (bestHtotal == (inHtotal + 1)) { bestHtotal -= 1; } // works well + //if (bestHtotal == (inHtotal - 1)) { bestHtotal += 1; } // check with SNES + vtotal = 1000 (1280x960) + +#ifdef FS_DEBUG + if (bestHtotal != inHtotal) { + Serial.print(F(" wants new htotal, oldbest: ")); Serial.print(inHtotal); + Serial.print(F(" newbest: ")); Serial.println(bestHtotal); + Serial.print(F(" inPeriod: ")); Serial.print(inPeriod); + Serial.print(F(" outPeriod: ")); Serial.println(outPeriod); + } +#endif + return true; + } + +public: + // sets syncLockReady = false, which in turn starts a new findBestHtotal run in loop() + static void reset(uint8_t frameTimeLockMethod) { +#ifdef FS_DEBUG + Serial.print("FS reset(), with correction: "); +#endif + if (syncLastCorrection != 0) { +#ifdef FS_DEBUG + Serial.println("Yes"); +#endif + uint16_t vtotal = 0, vsst = 0; + VRST_SST::read(vtotal, vsst); + uint16_t timeout = 0; + vtotal -= syncLastCorrection; + if (frameTimeLockMethod == 0) { // moves VS position + vsst -= syncLastCorrection; + } + + while ((GBS::STATUS_VDS_FIELD::read() == 1) && (++timeout < 400)); + GBS::VDS_VS_ST::write(vsst); + timeout = 0; + while ((GBS::STATUS_VDS_FIELD::read() == 0) && (++timeout < 400)); + GBS::VDS_VSYNC_RST::write(vtotal); + } +#ifdef FS_DEBUG + else { + Serial.println("No"); + } +#endif + syncLockReady = false; + syncLastCorrection = 0; + delayLock = 0; + } + + static void resetWithoutRecalculation() { + syncLockReady = false; + delayLock = 0; + } + + static uint16_t init() { + uint32_t bestHTotal = 0; + + // Adjust output horizontal sync timing so that the overall + // frame time is as close to the input as possible while still + // being less. Increasing the vertical frame size slightly + // should then push the output frame time to being larger than + // the input. + if (!findBestHTotal(bestHTotal)) { + return 0; + } + + syncLockReady = true; + delayLock = 0; + return (uint16_t)bestHTotal; + } + + static uint32_t getPulseTicks() { + uint32_t inStart, inStop; + if (!vsyncInputSample(&inStart, &inStop)) { + return 0; + } + return inStop - inStart; + } + + static bool ready(void) { + return syncLockReady; + } + + static int16_t getSyncLastCorrection() { + return syncLastCorrection; + } + + static void cleanup() { + syncLastCorrection = 0; // the important bit + syncLockReady = 0; + delayLock = 0; + } + + // Sample vsync start and stop times from debug pin. + static bool vsyncInputSample(uint32_t *start, uint32_t *stop) { + startTime = 0; stopTime = 0; armed = 0; + yield(); ESP.wdtDisable(); + + attachInterrupt(DEBUG_IN_PIN, risingEdgeISR_prepare, RISING); + // typical: 300000 at 80MHz, 600000 at 160MHz + for (uint32_t i = 0; i < 3000000; i++) + { + if (armed) { + armed = 0; + delay(7); + WiFi.setSleepMode(WIFI_LIGHT_SLEEP); + } + if (stopTime > 0) { + break; + } + } + *start = startTime; + *stop = stopTime; + ESP.wdtEnable(0); + WiFi.setSleepMode(WIFI_NONE_SLEEP); + + if ((*start >= *stop) || *stop == 0 || *start == 0) { + // ESP.getCycleCount() overflow oder no pulse, just fail this round + return false; + } + + return true; + } + + // Perform vsync phase locking. This is accomplished by measuring + // the period and phase offset of the input and output vsync + // signals and adjusting the frame size (and thus the output vsync + // frequency) to bring the phase offset closer to the desired + // value. + static bool run(uint8_t frameTimeLockMethod) { + int32_t period; + int32_t phase; + int32_t target; + int16_t correction; + + if (!syncLockReady) + return false; + + if (delayLock < 2) { + delayLock++; + return true; + } + + if (!vsyncPeriodAndPhase(&period, NULL, &phase)) + return false; + + target = (syncTargetPhase * period) / 360; + + if (phase > target) + correction = 0; + else + correction = syncCorrection; + +#ifdef FS_DEBUG + Serial.printf("phase: %7d target: %7d", phase, target); + if (correction == syncLastCorrection) { + // terminate line if returning early + Serial.println(); + } +#endif +#ifdef FS_DEBUG_LED + if (correction == 0) { + digitalWrite(LED_BUILTIN, LOW); // LED ON + } + else { + digitalWrite(LED_BUILTIN, HIGH); // LED OFF + } +#endif + + // return early? + if (correction == syncLastCorrection) { + return true; + } + + int16_t delta = correction - syncLastCorrection; + uint16_t vtotal = 0, vsst = 0; + uint16_t timeout = 0; + VRST_SST::read(vtotal, vsst); + vtotal += delta; + if (frameTimeLockMethod == 0) { // moves VS position + vsst += delta; + } + // else it is method 1: leaves VS position alone + + while ((GBS::STATUS_VDS_FIELD::read() == 1) && (++timeout < 400)); + GBS::VDS_VS_ST::write(vsst); + timeout = 0; + while ((GBS::STATUS_VDS_FIELD::read() == 0) && (++timeout < 400)); + GBS::VDS_VSYNC_RST::write(vtotal); + + syncLastCorrection = correction; + +#ifdef FS_DEBUG + Serial.printf(" vtotal: %4d\n", vtotal); +#endif + + return true; + } +}; + +template +int16_t FrameSyncManager::syncLastCorrection; + +template +uint8_t FrameSyncManager::delayLock; + +template +bool FrameSyncManager::syncLockReady; +#endif diff --git a/gbs-control.ino b/gbs-control.ino new file mode 100644 index 00000000..6eabcc98 --- /dev/null +++ b/gbs-control.ino @@ -0,0 +1,10429 @@ +#include "ntsc_240p.h" +#include "pal_240p.h" +#include "ntsc_720x480.h" +#include "pal_768x576.h" +#include "ntsc_1280x720.h" +#include "ntsc_1280x1024.h" +#include "ntsc_1920x1080.h" +#include "ntsc_downscale.h" +#include "pal_1280x720.h" +#include "pal_1280x1024.h" +#include "pal_1920x1080.h" +#include "pal_downscale.h" +#include "presetMdSection.h" +#include "presetDeinterlacerSection.h" +#include "presetHdBypassSection.h" +#include "ofw_RGBS.h" + +#include +#include "tv5725.h" +#include "framesync.h" +#include "osd.h" + +#include "SSD1306Wire.h" +#include "fonts.h" +#include "images.h" +SSD1306Wire display(0x3c,D2,D1); //inits I2C address & pins for OLED +const int pin_clk = 14; //D5 = GPIO14 (input of one direction for encoder) +const int pin_data = 13; //D7 = GPIO13 (input of one direction for encoder) +const int pin_switch = 0; //D3 = GPIO0 pulled HIGH, else boot fail (middle push button for encoder) + +String oled_menu[4] = {"Resolutions","Presets","Misc.","Current Settings"}; +String oled_Resolutions[7] = {"1280x960","1280x1024","1280x720","1920x1080","480/576","Downscale","Pass-Through"}; +String oled_Presets[8] = {"1","2","3","4","5","6","7","Back"}; +String oled_Misc[4] = {"Reset GBS","Restore Factory","-----Back"}; + +int oled_menuItem = 1; +int oled_subsetFrame = 0; +int oled_selectOption = 0; +int oled_page = 0; + +int oled_lastCount = 0; +volatile int oled_encoder_pos = 0; +volatile int oled_main_pointer = 0; //volatile vars change done with ISR +volatile int oled_pointer_count = 0; +volatile int oled_sub_pointer = 0; + +#include +// ESPAsyncTCP and ESPAsyncWebServer libraries by me-no-dev +// download (green "Clone or download" button) and extract to Arduino libraries folder +// Windows: "Documents\Arduino\libraries" or full path: "C:\Users\rama\Documents\Arduino\libraries" +// https://github.com/me-no-dev/ESPAsyncTCP +// https://github.com/me-no-dev/ESPAsyncWebServer +#include +#include +#include "FS.h" +#include +#include +#include // mDNS library for finding gbscontrol.local on the local network +#include + +// PersWiFiManager library by Ryan Downing +// https://github.com/r-downing/PersWiFiManager +// included in project root folder to allow modifications within limitations of the Arduino framework +// See 3rdparty/PersWiFiManager for unmodified source and license +#include "PersWiFiManager.h" + +// WebSockets library by Markus Sattler +// https://github.com/Links2004/arduinoWebSockets +// included in src folder to allow header modifications within limitations of the Arduino framework +// See 3rdparty/WebSockets for unmodified source and license +#include "src/WebSockets.h" +#include "src/WebSocketsServer.h" + +// Optional: +// ESP8266-ping library to aid debugging WiFi issues, install via Arduino library manager +//#define HAVE_PINGER_LIBRARY +#ifdef HAVE_PINGER_LIBRARY +#include +#include +unsigned long pingLastTime; +Pinger pinger; // pinger global object to aid debugging WiFi issues +#endif + +typedef TV5725 GBS; + +static unsigned long lastVsyncLock = millis(); + +// Si5351mcu library by Pavel Milanes +// https ://github.com/pavelmc/Si5351mcu +// included in project root folder to allow modifications within limitations of the Arduino framework +// See 3rdparty/Si5351mcu for unmodified source and license +#include "src/si5351mcu.h" +Si5351mcu Si; + +#define THIS_DEVICE_MASTER +#ifdef THIS_DEVICE_MASTER +const char* ap_ssid = "gbscontrol"; +const char* ap_password = "qqqqqqqq"; +// change device_hostname_full and device_hostname_partial to rename the device +// (allows 2 or more on the same network) +// new: only use _partial throughout, comply to standards +const char* device_hostname_full = "gbscontrol.local"; +const char* device_hostname_partial = "gbscontrol"; // for MDNS +// +static const char ap_info_string[] PROGMEM = +"(WiFi): AP mode (SSID: gbscontrol, pass 'qqqqqqqq'): Access 'gbscontrol.local' in your browser"; +static const char st_info_string[] PROGMEM = +"(WiFi): Access 'http://gbscontrol:80' or 'http://gbscontrol.local' (or device IP) in your browser"; +#else +const char* ap_ssid = "gbsslave"; +const char* ap_password = "qqqqqqqq"; +const char* device_hostname_full = "gbsslave.local"; +const char* device_hostname_partial = "gbsslave"; // for MDNS +// +static const char ap_info_string[] PROGMEM = +"(WiFi): AP mode (SSID: gbsslave, pass 'qqqqqqqq'): Access 'gbsslave.local' in your browser"; +static const char st_info_string[] PROGMEM = +"(WiFi): Access 'http://gbsslave:80' or 'http://gbsslave.local' (or device IP) in your browser"; +#endif + +AsyncWebServer server(80); +DNSServer dnsServer; +WebSocketsServer webSocket(81); +//AsyncWebSocket webSocket("/ws"); +PersWiFiManager persWM(server, dnsServer); + +#define DEBUG_IN_PIN D6 // marked "D12/MISO/D6" (Wemos D1) or D6 (Lolin NodeMCU) +// SCL = D1 (Lolin), D15 (Wemos D1) // ESP8266 Arduino default map: SCL +// SDA = D2 (Lolin), D14 (Wemos D1) // ESP8266 Arduino default map: SDA +#define LEDON \ + pinMode(LED_BUILTIN, OUTPUT); \ + digitalWrite(LED_BUILTIN, LOW) +#define LEDOFF \ + digitalWrite(LED_BUILTIN, HIGH); \ + pinMode(LED_BUILTIN, INPUT) + +// fast ESP8266 digitalRead (21 cycles vs 77), *should* work with all possible input pins +// but only "D7" and "D6" have been tested so far +#define digitalRead(x) ((GPIO_REG_READ(GPIO_IN_ADDRESS) >> x) & 1) + +// feed the current measurement, get back the moving average +uint8_t getMovingAverage(uint8_t item) +{ + static const uint8_t sz = 16; + static uint8_t arr[sz] = { 0 }; + static uint8_t pos = 0; + + arr[pos] = item; + if (pos < (sz - 1)) { + pos++; + } + else { + pos = 0; + } + + uint16_t sum = 0; + for (uint8_t i = 0; i < sz; i++) { + sum += arr[i]; + } + return sum >> 4; // for array size 16 +} + +// +// Sync locking tunables/magic numbers +// +struct FrameSyncAttrs { + static const uint8_t debugInPin = DEBUG_IN_PIN; + static const uint32_t lockInterval = 100 * 16.70; // every 100 frames + static const int16_t syncCorrection = 2; // Sync correction in scanlines to apply when phase lags target + static const int32_t syncTargetPhase = 90; // Target vsync phase offset (output trails input) in degrees + // to debug: syncTargetPhase = 343 lockInterval = 15 * 16 +}; +typedef FrameSyncManager FrameSync; + +struct MenuAttrs { + static const int8_t shiftDelta = 4; + static const int8_t scaleDelta = 4; + static const int16_t vertShiftRange = 300; + static const int16_t horizShiftRange = 400; + static const int16_t vertScaleRange = 100; + static const int16_t horizScaleRange = 130; + static const int16_t barLength = 100; +}; +typedef MenuManager Menu; + +// runTimeOptions holds system variables +struct runTimeOptions { + uint32_t freqExtClockGen; + uint16_t noSyncCounter; // is always at least 1 when checking value in syncwatcher + uint8_t presetVlineShift; + uint8_t videoStandardInput; // 0 - unknown, 1 - NTSC like, 2 - PAL like, 3 480p NTSC, 4 576p PAL + uint8_t phaseSP; + uint8_t phaseADC; + uint8_t currentLevelSOG; + uint8_t thisSourceMaxLevelSOG; + uint8_t syncLockFailIgnore; + uint8_t applyPresetDoneStage; + uint8_t continousStableCounter; + uint8_t failRetryAttempts; + uint8_t presetID; + uint8_t HPLLState; + uint8_t medResLineCount; + uint8_t osr; + uint8_t notRecognizedCounter; + boolean isInLowPowerMode; + boolean clampPositionIsSet; + boolean coastPositionIsSet; + boolean phaseIsSet; + boolean inputIsYpBpR; + boolean syncWatcherEnabled; + boolean outModeHdBypass; + boolean printInfos; + boolean sourceDisconnected; + boolean webServerEnabled; + boolean webServerStarted; + boolean allowUpdatesOTA; + boolean enableDebugPings; + boolean autoBestHtotalEnabled; + boolean videoIsFrozen; + boolean forceRetime; + boolean motionAdaptiveDeinterlaceActive; + boolean deinterlaceAutoEnabled; + boolean scanlinesEnabled; + boolean boardHasPower; + boolean presetIsPalForce60; + boolean syncTypeCsync; + boolean isValidForScalingRGBHV; + boolean useHdmiSyncFix; + boolean extClockGenDetected; +} rtos; +struct runTimeOptions *rto = &rtos; + +// userOptions holds user preferences / customizations +struct userOptions { + // 0 - normal, 1 - x480/x576, 2 - customized, 3 - 1280x720, 4 - 1280x1024, 5 - 1920x1080, + // 6 - downscale, 10 - bypass + uint8_t presetPreference; + uint8_t presetSlot; + uint8_t enableFrameTimeLock; + uint8_t frameTimeLockMethod; + uint8_t enableAutoGain; + uint8_t wantScanlines; + uint8_t wantOutputComponent; + uint8_t deintMode; + uint8_t wantVdsLineFilter; + uint8_t wantPeaking; + uint8_t wantTap6; + uint8_t preferScalingRgbhv; + uint8_t PalForce60; + uint8_t disableExternalClockGenerator; + uint8_t matchPresetSource; + uint8_t wantStepResponse; + uint8_t wantFullHeight; + uint8_t enableCalibrationADC; + uint8_t scanlineStrength; +} uopts; +struct userOptions *uopt = &uopts; + +// remember adc options across presets +struct adcOptions { + uint8_t r_gain; + uint8_t g_gain; + uint8_t b_gain; + uint8_t r_off; + uint8_t g_off; + uint8_t b_off; +} adcopts; +struct adcOptions *adco = &adcopts; + +// SLOTS +#define SLOTS_FILE "/slots.bin" // the file where to store slots metadata +#define SLOTS_TOTAL 72 // max number of slots + +typedef struct { + char name[25]; + uint8_t presetID; + uint8_t scanlines; + uint8_t scanlinesStrength; + uint8_t slot; + uint8_t wantVdsLineFilter; + uint8_t wantStepResponse; + uint8_t wantPeaking; +} SlotMeta; + +typedef struct { + SlotMeta slot[SLOTS_TOTAL]; // the max avaliable slots that can be encoded in a the charset[A-Za-z0-9-._~()!*:,;] +} SlotMetaArray; + +char typeOneCommand; // Serial / Web Server commands +char typeTwoCommand; // Serial / Web Server commands +static uint8_t lastSegment = 0xFF; // GBS segment for direct access +//uint8_t globalDelay; // used for dev / debug + +#if defined(ESP8266) +// serial mirror class for websocket logs +class SerialMirror : public Stream { + size_t write(const uint8_t *data, size_t size) { + if (ESP.getFreeHeap() > 20000) { + webSocket.broadcastTXT(data, size); + } + else { + webSocket.disconnect(); + } + Serial.write(data, size); + return size; + } + + size_t write(const char* data, size_t size) { + if (ESP.getFreeHeap() > 20000) { + webSocket.broadcastTXT(data, size); + } + else { + webSocket.disconnect(); + } + Serial.write(data, size); + return size; + } + + size_t write(uint8_t data) { + if (ESP.getFreeHeap() > 20000) { + webSocket.broadcastTXT(&data, 1); + } + else { + webSocket.disconnect(); + } + Serial.write(data); + return 1; + } + + size_t write(char data) { + if (ESP.getFreeHeap() > 20000) { + webSocket.broadcastTXT(&data, 1); + } + else { + webSocket.disconnect(); + } + Serial.write(data); + return 1; + } + + int available() { + return 0; + } + int read() { + return -1; + } + int peek() { + return -1; + } + void flush() { } +}; + +SerialMirror SerialM; +#else +#define SerialM Serial +#endif + +void externalClockGenResetClock() { + if (!rto->extClockGenDetected) { + return; + } + + uint8_t activeDisplayClock = GBS::PLL648_CONTROL_01::read(); + + if (activeDisplayClock == 0x25) rto->freqExtClockGen = 40500000; + else if (activeDisplayClock == 0x45) rto->freqExtClockGen = 54000000; + else if (activeDisplayClock == 0x55) rto->freqExtClockGen = 64800000; + else if (activeDisplayClock == 0x65) rto->freqExtClockGen = 81000000; + else if (activeDisplayClock == 0x85) rto->freqExtClockGen = 108000000; + else if (activeDisplayClock == 0x95) rto->freqExtClockGen = 129600000; + else if (activeDisplayClock == 0xa5) rto->freqExtClockGen = 162000000; + else if (activeDisplayClock == 0x35) rto->freqExtClockGen = 81000000; // clock unused + else if (activeDisplayClock == 0) rto->freqExtClockGen = 81000000; // no preset loaded + else if (!rto->outModeHdBypass) { + SerialM.print(F("preset display clock: 0x")); + SerialM.println(activeDisplayClock, HEX); + } + + // problem: around 108MHz the library seems to double the clock + // maybe there are regs to check for this and resetPLL + if (rto->freqExtClockGen == 108000000) { + Si.setFreq(0, 87000000); delay(1); // quick fix + } + // same thing it seems at 40500000 + if (rto->freqExtClockGen == 40500000) { + Si.setFreq(0, 48500000); delay(1); // quick fix + } + + Si.setFreq(0, rto->freqExtClockGen); + GBS::PAD_CKIN_ENZ::write(0); // 0 = clock input enable (pin40) + + SerialM.print(F("clock gen reset: ")); + SerialM.println(rto->freqExtClockGen); +} + +void externalClockGenSyncInOutRate() { + if (!rto->extClockGenDetected) { + return; + } + if (GBS::PAD_CKIN_ENZ::read() != 0) { + return; + } + if (rto->outModeHdBypass) { + return; + } + if (GBS::PLL648_CONTROL_01::read() != 0x75) { + return; + } + + float sfr = getSourceFieldRate(0); + if (sfr < 47.0f || sfr > 86.0f) { + SerialM.print(F("sync skipped sfr wrong: ")); + SerialM.println(sfr); + return; + } + + float ofr = getOutputFrameRate(); + if (ofr < 47.0f || ofr > 86.0f) { + SerialM.print(F("sync skipped ofr wrong: ")); + SerialM.println(ofr); + return; + } + + uint32_t old = rto->freqExtClockGen; + uint32_t current = rto->freqExtClockGen; + + rto->freqExtClockGen = (sfr / ofr) * rto->freqExtClockGen; + + if (current > rto->freqExtClockGen) { + if ((current - rto->freqExtClockGen) < 750000) { + while (current > rto->freqExtClockGen) { + current -= 1000; + Si.setFreq(0, current); + handleWiFi(0); + } + } + } + else if (current < rto->freqExtClockGen) { + if ((rto->freqExtClockGen - current) < 750000) { + while (current < rto->freqExtClockGen) { + current += 1000; + Si.setFreq(0, current); + handleWiFi(0); + } + } + } + + Si.setFreq(0, rto->freqExtClockGen); + + int32_t diff = rto->freqExtClockGen - old; + + SerialM.print(F("source Hz: ")); SerialM.print(sfr, 5); + SerialM.print(F(" new out: ")); SerialM.print(getOutputFrameRate(), 5); + SerialM.print(F(" clock: ")); SerialM.print(rto->freqExtClockGen); + SerialM.print(F(" (")); SerialM.print(diff >= 0 ? "+" : ""); SerialM.print(diff); + SerialM.println(F(")")); + delay(1); +} + +void externalClockGenInitialize() { + // MHz: 27, 32.4, 40.5, 54, 64.8, 81, 108, 129.6, 162 + rto->freqExtClockGen = 81000000; + if (!rto->extClockGenDetected) { + return; + } + Si.init(25000000L); // many Si5351 boards come with 25MHz crystal; 27000000L for one with 27MHz + Si.setPower(0, SIOUT_6mA); + Si.setFreq(0, rto->freqExtClockGen); + Si.disable(0); +} + +void externalClockGenDetectPresence() { + if (uopt->disableExternalClockGenerator) { + SerialM.println(F("ExternalClockGenerator disabled, skipping detection")); + } + else { + const uint8_t siAddress = 0x60; // default Si5351 address + uint8_t retVal = 0; + + Wire.beginTransmission(siAddress); + // want to see some bits on reg 183, on reset at least [7:6] should be high + Wire.write(183); + Wire.endTransmission(); + Wire.requestFrom(siAddress, (uint8_t)1, (uint8_t)0); + + while (Wire.available()) + { + retVal = Wire.read(); + Serial.println(); Serial.println(retVal); + } + + if (retVal == 0) { + rto->extClockGenDetected = 0; + } + else { + rto->extClockGenDetected = 1; + } + } +} + +static inline void writeOneByte(uint8_t slaveRegister, uint8_t value) +{ + writeBytes(slaveRegister, &value, 1); +} + +static inline void writeBytes(uint8_t slaveRegister, uint8_t* values, uint8_t numValues) +{ + if (slaveRegister == 0xF0 && numValues == 1) { + lastSegment = *values; + } + else + GBS::write(lastSegment, slaveRegister, values, numValues); +} + +void copyBank(uint8_t* bank, const uint8_t* programArray, uint16_t* index) +{ + for (uint8_t x = 0; x < 16; ++x) { + bank[x] = pgm_read_byte(programArray + *index); + (*index)++; + } +} + +boolean videoStandardInputIsPalNtscSd() { + if (rto->videoStandardInput == 1 || rto->videoStandardInput == 2) { + return true; + } + return false; +} + +void zeroAll() +{ + // turn processing units off first + writeOneByte(0xF0, 0); + writeOneByte(0x46, 0x00); // reset controls 1 + writeOneByte(0x47, 0x00); // reset controls 2 + + // zero out entire register space + for (int y = 0; y < 6; y++) + { + writeOneByte(0xF0, (uint8_t)y); + for (int z = 0; z < 16; z++) + { + uint8_t bank[16]; + for (int w = 0; w < 16; w++) + { + bank[w] = 0; + // exceptions + //if (y == 5 && z == 0 && w == 2) { + // bank[w] = 0x51; // 5_02 + //} + //if (y == 5 && z == 5 && w == 6) { + // bank[w] = 0x01; // 5_56 + //} + //if (y == 5 && z == 5 && w == 7) { + // bank[w] = 0xC0; // 5_57 + //} + } + writeBytes(z * 16, bank, 16); + } + } +} + +void loadHdBypassSection() { + uint16_t index = 0; + uint8_t bank[16]; + writeOneByte(0xF0, 1); + for (int j = 3; j <= 5; j++) { // start at 0x30 + copyBank(bank, presetHdBypassSection, &index); + writeBytes(j * 16, bank, 16); + } +} + +void loadPresetDeinterlacerSection() { + uint16_t index = 0; + uint8_t bank[16]; + writeOneByte(0xF0, 2); + for (int j = 0; j <= 3; j++) { // start at 0x00 + copyBank(bank, presetDeinterlacerSection, &index); + writeBytes(j * 16, bank, 16); + } +} + +void loadPresetMdSection() { + uint16_t index = 0; + uint8_t bank[16]; + writeOneByte(0xF0, 1); + for (int j = 6; j <= 7; j++) { // start at 0x60 + copyBank(bank, presetMdSection, &index); + writeBytes(j * 16, bank, 16); + } + bank[0] = pgm_read_byte(presetMdSection + index); + bank[1] = pgm_read_byte(presetMdSection + index + 1); + bank[2] = pgm_read_byte(presetMdSection + index + 2); + bank[3] = pgm_read_byte(presetMdSection + index + 3); + writeBytes(8 * 16, bank, 4); // MD section ends at 0x83, not 0x90 +} + +// programs all valid registers (the register map has holes in it, so it's not straight forward) +// 'index' keeps track of the current preset data location. +void writeProgramArrayNew(const uint8_t* programArray, boolean skipMDSection) +{ + uint16_t index = 0; + uint8_t bank[16]; + uint8_t y = 0; + + //GBS::PAD_SYNC_OUT_ENZ::write(1); + //GBS::DAC_RGBS_PWDNZ::write(0); // no DAC + //GBS::SFTRST_MEM_FF_RSTZ::write(0); // stop mem fifos + + FrameSync::cleanup(); + + // should only be possible if previously was in RGBHV bypass, then hit a manual preset switch + if (rto->videoStandardInput == 15) { + rto->videoStandardInput = 0; + } + + rto->outModeHdBypass = 0; // the default at this stage + if (GBS::ADC_INPUT_SEL::read() == 0) { + //if (rto->inputIsYpBpR == 0) SerialM.println("rto->inputIsYpBpR was 0, fixing to 1"); + rto->inputIsYpBpR = 1; // new: update the var here, allow manual preset loads + } + else { + //if (rto->inputIsYpBpR == 1) SerialM.println("rto->inputIsYpBpR was 1, fixing to 0"); + rto->inputIsYpBpR = 0; + } + + uint8_t reset46 = GBS::RESET_CONTROL_0x46::read(); // for keeping these as they are now + uint8_t reset47 = GBS::RESET_CONTROL_0x47::read(); + + for (; y < 6; y++) + { + writeOneByte(0xF0, (uint8_t)y); + switch (y) { + case 0: + for (int j = 0; j <= 1; j++) { // 2 times + for (int x = 0; x <= 15; x++) { + if (j == 0 && x == 4) { + // keep DAC off + if (rto->useHdmiSyncFix) { + bank[x] = pgm_read_byte(programArray + index) & ~(1 << 0); + } + else { + bank[x] = pgm_read_byte(programArray + index); + } + } + else if (j == 0 && x == 6) { + bank[x] = reset46; + } + else if (j == 0 && x == 7) { + bank[x] = reset47; + } + else if (j == 0 && x == 9) { + // keep sync output off + if (rto->useHdmiSyncFix) { + bank[x] = pgm_read_byte(programArray + index) | (1 << 2); + } + else { + bank[x] = pgm_read_byte(programArray + index); + } + } + else { + // use preset values + bank[x] = pgm_read_byte(programArray + index); + } + + index++; + } + writeBytes(0x40 + (j * 16), bank, 16); + } + copyBank(bank, programArray, &index); + writeBytes(0x90, bank, 16); + break; + case 1: + for (int j = 0; j <= 2; j++) { // 3 times + copyBank(bank, programArray, &index); + if (j == 0) { + bank[0] = bank[0] & ~(1 << 5); // clear 1_00 5 + bank[1] = bank[1] | (1 << 0); // set 1_01 0 + bank[12] = bank[12] & 0x0f; // clear 1_0c upper bits + bank[13] = 0; // clear 1_0d + } + writeBytes(j * 16, bank, 16); + } + if (!skipMDSection) { + loadPresetMdSection(); + if (rto->syncTypeCsync) GBS::MD_SEL_VGA60::write(0); // EDTV possible + else GBS::MD_SEL_VGA60::write(1); // VGA 640x480 more likely + + GBS::MD_HD1250P_CNTRL::write(rto->medResLineCount); // patch med res support + } + break; + case 2: + loadPresetDeinterlacerSection(); + break; + case 3: + for (int j = 0; j <= 7; j++) { // 8 times + copyBank(bank, programArray, &index); + //if (rto->useHdmiSyncFix) { + // if (j == 0) { + // bank[0] = bank[0] | (1 << 0); // 3_00 0 sync lock + // } + // if (j == 1) { + // bank[10] = bank[10] | (1 << 4); // 3_1a 4 frame lock + // } + //} + writeBytes(j * 16, bank, 16); + } + // blank out VDS PIP registers, otherwise they can end up uninitialized + for (int x = 0; x <= 15; x++) { + writeOneByte(0x80 + x, 0x00); + } + break; + case 4: + for (int j = 0; j <= 5; j++) { // 6 times + copyBank(bank, programArray, &index); + writeBytes(j * 16, bank, 16); + } + break; + case 5: + for (int j = 0; j <= 6; j++) { // 7 times + for (int x = 0; x <= 15; x++) { + bank[x] = pgm_read_byte(programArray + index); + if (index == 322) { // s5_02 bit 6+7 = input selector (only bit 6 is relevant) + if (rto->inputIsYpBpR) bitClear(bank[x], 6); + else bitSet(bank[x], 6); + } + if (index == 323) { // s5_03 set clamps according to input channel + if (rto->inputIsYpBpR) { + bitClear(bank[x], 2); // G bottom clamp + bitSet(bank[x], 1); // R mid clamp + bitSet(bank[x], 3); // B mid clamp + } + else { + bitClear(bank[x], 2); // G bottom clamp + bitClear(bank[x], 1); // R bottom clamp + bitClear(bank[x], 3); // B bottom clamp + } + } + //if (index == 324) { // s5_04 reset(0) for ADC REF init + // bank[x] = 0x00; + //} + if (index == 352) { // s5_20 always force to 0x02 (only SP_SOG_P_ATO) + bank[x] = 0x02; + } + if (index == 375) { // s5_37 + if (videoStandardInputIsPalNtscSd()) { + bank[x] = 0x6b; + } + else { + bank[x] = 0x02; + } + } + if (index == 382) { // s5_3e + bitSet(bank[x], 5); // SP_DIS_SUB_COAST = 1 + } + if (index == 407) { // s5_57 + bitSet(bank[x], 0); // SP_NO_CLAMP_REG = 1 + } + index++; + } + writeBytes(j * 16, bank, 16); + } + break; + } + } + + // scaling RGBHV mode + if (uopt->preferScalingRgbhv && rto->isValidForScalingRGBHV) { + GBS::GBS_OPTION_SCALING_RGBHV::write(1); + rto->videoStandardInput = 3; + } +} + +void activeFrameTimeLockInitialSteps() { + // skip if using external clock gen + if (rto->extClockGenDetected) { + SerialM.println(F("Active FrameTime Lock not necessary with external clock gen installed")); + return; + } + // skip when out mode = bypass + if (rto->presetID != 0x21 && rto->presetID != 0x22) { + SerialM.print(F("Active FrameTime Lock enabled, disable if display unstable or stays blank! Method: ")); + if (uopt->frameTimeLockMethod == 0) { + SerialM.println(F("0 (vtotal + VSST)")); + } + if (uopt->frameTimeLockMethod == 1) { + SerialM.println(F("1 (vtotal only)")); + } + if (GBS::VDS_VS_ST::read() == 0) { + // VS_ST needs to be at least 1, so method 1 can decrease it when needed (but currently only increases VS_ST) + // don't force this here, instead make sure to have all presets follow the rule (easier dev) + SerialM.println(F("Warning: Check VDS_VS_ST!")); + } + } +} + +void resetInterruptSogSwitchBit() { + GBS::INT_CONTROL_RST_SOGSWITCH::write(1); + GBS::INT_CONTROL_RST_SOGSWITCH::write(0); +} + +void resetInterruptSogBadBit() { + GBS::INT_CONTROL_RST_SOGBAD::write(1); + GBS::INT_CONTROL_RST_SOGBAD::write(0); +} + +void resetInterruptNoHsyncBadBit() { + GBS::INT_CONTROL_RST_NOHSYNC::write(1); + GBS::INT_CONTROL_RST_NOHSYNC::write(0); +} + +void setResetParameters() { + SerialM.println(""); + rto->videoStandardInput = 0; + rto->videoIsFrozen = false; + rto->applyPresetDoneStage = 0; + rto->presetVlineShift = 0; + rto->sourceDisconnected = true; + rto->outModeHdBypass = 0; + rto->clampPositionIsSet = 0; + rto->coastPositionIsSet = 0; + rto->phaseIsSet = 0; + rto->continousStableCounter = 0; + rto->noSyncCounter = 0; + rto->isInLowPowerMode = false; + rto->currentLevelSOG = 5; + rto->thisSourceMaxLevelSOG = 31; // 31 = auto sog has not (yet) run + rto->failRetryAttempts = 0; + rto->HPLLState = 0; + rto->motionAdaptiveDeinterlaceActive = false; + rto->scanlinesEnabled = false; + rto->syncTypeCsync = false; + rto->isValidForScalingRGBHV = false; + rto->medResLineCount = 0x33; // 51*8=408 + rto->osr = 0; + rto->useHdmiSyncFix = 0; + rto->notRecognizedCounter = 0; + + adco->r_gain = 0; + adco->g_gain = 0; + adco->b_gain = 0; + + // clear temp storage + GBS::ADC_UNUSED_64::write(0); GBS::ADC_UNUSED_65::write(0); + GBS::ADC_UNUSED_66::write(0); GBS::ADC_UNUSED_67::write(0); + GBS::GBS_PRESET_CUSTOM::write(0); + GBS::GBS_PRESET_ID::write(0); + GBS::GBS_OPTION_SCALING_RGBHV::write(0); + GBS::GBS_OPTION_PALFORCED60_ENABLED::write(0); + + // set minimum IF parameters + GBS::IF_VS_SEL::write(1); + GBS::IF_VS_FLIP::write(1); + GBS::IF_HSYNC_RST::write(0x3FF); + GBS::IF_VB_ST::write(0); + GBS::IF_VB_SP::write(2); + + // could stop ext clock gen output here? + FrameSync::cleanup(); + + GBS::OUT_SYNC_CNTRL::write(0); // no H / V sync out to PAD + GBS::DAC_RGBS_PWDNZ::write(0); // disable DAC + GBS::ADC_TA_05_CTRL::write(0x02); // 5_05 1 // minor SOG clamp effect + GBS::ADC_TEST_04::write(0x02); // 5_04 + GBS::ADC_TEST_0C::write(0x12); // 5_0c 1 4 + GBS::ADC_CLK_PA::write(0); // 5_00 0/1 PA_ADC input clock = PLLAD CLKO2 + GBS::ADC_SOGEN::write(1); + GBS::SP_SOG_MODE::write(1); + GBS::ADC_INPUT_SEL::write(1); // 1 = RGBS / RGBHV adc data input + GBS::ADC_POWDZ::write(1); // ADC on + setAndUpdateSogLevel(rto->currentLevelSOG); + GBS::RESET_CONTROL_0x46::write(0x00); // all units off + GBS::RESET_CONTROL_0x47::write(0x00); + GBS::GPIO_CONTROL_00::write(0x67); // most GPIO pins regular GPIO + GBS::GPIO_CONTROL_01::write(0x00); // all GPIO outputs disabled + GBS::DAC_RGBS_PWDNZ::write(0); // disable DAC (output) + GBS::PLL648_CONTROL_01::write(0x00); // VCLK(1/2/4) display clock // needs valid for debug bus + GBS::PAD_CKIN_ENZ::write(0); // 0 = clock input enable (pin40) + GBS::PAD_CKOUT_ENZ::write(1); // clock output disable + GBS::IF_SEL_ADC_SYNC::write(1); // ! 1_28 2 + GBS::PLLAD_VCORST::write(1); // reset = 1 + GBS::PLL_ADS::write(1); // When = 1, input clock is from ADC ( otherwise, from unconnected clock at pin 40 ) + GBS::PLL_CKIS::write(0); // PLL use OSC clock + GBS::PLL_MS::write(2); // fb memory clock can go lower power + GBS::PAD_CONTROL_00_0x48::write(0x2b); //disable digital inputs, enable debug out pin + GBS::PAD_CONTROL_01_0x49::write(0x1f); //pad control pull down/up transistors on + loadHdBypassSection(); // 1_30 to 1_55 + loadPresetMdSection(); // 1_60 to 1_83 + setAdcParametersGainAndOffset(); + GBS::SP_PRE_COAST::write(9); // was 0x07 // need pre / poast to allow all sources to detect + GBS::SP_POST_COAST::write(18); // was 0x10 // ps2 1080p 18 + GBS::SP_NO_COAST_REG::write(0); // can be 1 in some soft reset situations, will prevent sog vsync decoding << really? + GBS::SP_CS_CLP_ST::write(32); // define it to something at start + GBS::SP_CS_CLP_SP::write(48); + GBS::SP_SOG_SRC_SEL::write(0); // SOG source = ADC + GBS::SP_EXT_SYNC_SEL::write(0); // connect HV input ( 5_20 bit 3 ) + GBS::SP_NO_CLAMP_REG::write(1); + GBS::PLLAD_ICP::write(0); // lowest charge pump current + GBS::PLLAD_FS::write(0); // low gain (have to deal with cold and warm startups) + GBS::PLLAD_5_16::write(0x1f); + GBS::PLLAD_MD::write(0x700); + resetPLL(); // cycles PLL648 + delay(2); + resetPLLAD(); // same for PLLAD + GBS::PLL_VCORST::write(1); // reset on + GBS::PLLAD_CONTROL_00_5x11::write(0x01); // reset on + resetDebugPort(); + + //GBS::RESET_CONTROL_0x47::write(0x16); + GBS::RESET_CONTROL_0x46::write(0x41); // new 23.07.19 + GBS::RESET_CONTROL_0x47::write(0x17); // new 23.07.19 (was 0x16) + GBS::INTERRUPT_CONTROL_01::write(0xff); // enable interrupts + GBS::INTERRUPT_CONTROL_00::write(0xff); // reset irq status + GBS::INTERRUPT_CONTROL_00::write(0x00); + GBS::PAD_SYNC_OUT_ENZ::write(0); // sync output enabled, will be low (HC125 fix) + rto->clampPositionIsSet = 0; // some functions override these, so make sure + rto->coastPositionIsSet = 0; + rto->phaseIsSet = 0; + rto->continousStableCounter = 0; + typeOneCommand = '@'; + typeTwoCommand = '@'; +} + +void OutputComponentOrVGA() { + + boolean isCustomPreset = GBS::GBS_PRESET_CUSTOM::read(); + if (uopt->wantOutputComponent) { + SerialM.println(F("Output Format: Component")); + GBS::VDS_SYNC_LEV::write(0x80); // 0.25Vpp sync (leave more room for Y) + GBS::VDS_CONVT_BYPS::write(1); // output YUV + GBS::OUT_SYNC_CNTRL::write(0); // no H / V sync out to PAD + } + else { + GBS::VDS_SYNC_LEV::write(0); + GBS::VDS_CONVT_BYPS::write(0); // output RGB + GBS::OUT_SYNC_CNTRL::write(1); // H / V sync out enable + } + + if (!isCustomPreset) { + if (rto->inputIsYpBpR == true) { + applyYuvPatches(); + } + else { + applyRGBPatches(); + } + } +} + +void applyComponentColorMixing() { + GBS::VDS_Y_GAIN::write(0x64); // 3_35 + GBS::VDS_UCOS_GAIN::write(0x19); // 3_36 + GBS::VDS_VCOS_GAIN::write(0x19); // 3_37 + GBS::VDS_Y_OFST::write(0xfe); // 3_3a + GBS::VDS_U_OFST::write(0x01); // 3_3b +} + +void toggleIfAutoOffset() { + if (GBS::IF_AUTO_OFST_EN::read() == 0) { + // and different ADC offsets + GBS::ADC_ROFCTRL::write(0x40); + GBS::ADC_GOFCTRL::write(0x42); + GBS::ADC_BOFCTRL::write(0x40); + // enable + GBS::IF_AUTO_OFST_EN::write(1); + GBS::IF_AUTO_OFST_PRD::write(0); // 0 = by line, 1 = by frame + } + else { + if (adco->r_off != 0 && adco->g_off != 0 && adco->b_off != 0) { + GBS::ADC_ROFCTRL::write(adco->r_off); + GBS::ADC_GOFCTRL::write(adco->g_off); + GBS::ADC_BOFCTRL::write(adco->b_off); + } + // adco->r_off = 0: auto calibration on boot failed, leave at current values + GBS::IF_AUTO_OFST_EN::write(0); + GBS::IF_AUTO_OFST_PRD::write(0); // 0 = by line, 1 = by frame + } +} + +// blue only mode: t0t44t1 t0t44t4 +void applyYuvPatches() { + GBS::ADC_RYSEL_R::write(1); // midlevel clamp red + GBS::ADC_RYSEL_B::write(1); // midlevel clamp blue + GBS::ADC_RYSEL_G::write(0); // gnd clamp green + GBS::DEC_MATRIX_BYPS::write(1); // ADC + GBS::IF_MATRIX_BYPS::write(1); + + if (GBS::GBS_PRESET_CUSTOM::read() == 0) { + // colors + GBS::VDS_Y_GAIN::write(0x80); // 3_25 + GBS::VDS_UCOS_GAIN::write(0x1c); // 3_26 + GBS::VDS_VCOS_GAIN::write(0x29); // 3_27 + GBS::VDS_Y_OFST::write(0xFE); + GBS::VDS_U_OFST::write(0x03); + GBS::VDS_V_OFST::write(0x03); + if (rto->videoStandardInput >= 5 && rto->videoStandardInput <= 7) { + // todo: Rec. 709 (vs Rec. 601 used normally + // needs this on VDS and HDBypass + } + } + + // if using ADC auto offset for yuv input / rgb output + //GBS::ADC_AUTO_OFST_EN::write(1); + //GBS::VDS_U_OFST::write(0x36); //3_3b + //GBS::VDS_V_OFST::write(0x4d); //3_3c + + if (uopt->wantOutputComponent) { + applyComponentColorMixing(); + } +} + +// blue only mode: t0t44t1 t0t44t4 +void applyRGBPatches() { + GBS::ADC_RYSEL_R::write(0); // gnd clamp red + GBS::ADC_RYSEL_B::write(0); // gnd clamp blue + GBS::ADC_RYSEL_G::write(0); // gnd clamp green + GBS::DEC_MATRIX_BYPS::write(0); // 5_1f 2 = 1 for YUV / 0 for RGB << using DEC matrix + GBS::IF_MATRIX_BYPS::write(1); + + if (GBS::GBS_PRESET_CUSTOM::read() == 0) { + // colors + GBS::VDS_Y_GAIN::write(0x80); // 0x80 = 0 + GBS::VDS_UCOS_GAIN::write(0x1c); + GBS::VDS_VCOS_GAIN::write(0x29); // 0x27 when using IF matrix, 0x29 for DEC matrix + GBS::VDS_Y_OFST::write(0x00); // 0 + GBS::VDS_U_OFST::write(0x00); // 2 + GBS::VDS_V_OFST::write(0x00); // 2 + } + + if (uopt->wantOutputComponent) { + applyComponentColorMixing(); + } +} + +void setAdcParametersGainAndOffset() { + GBS::ADC_ROFCTRL::write(0x40); + GBS::ADC_GOFCTRL::write(0x40); + GBS::ADC_BOFCTRL::write(0x40); + GBS::ADC_RGCTRL::write(0x7B); + GBS::ADC_GGCTRL::write(0x7B); + GBS::ADC_BGCTRL::write(0x7B); +} + +void updateHVSyncEdge() { + static uint8_t printHS = 0, printVS = 0; + uint16_t temp = 0; + + if (GBS::STATUS_INT_SOG_BAD::read() == 1) { + resetInterruptSogBadBit(); + return; + } + + uint8_t syncStatus = GBS::STATUS_16::read(); + if (rto->syncTypeCsync) { + // sog check, only check H + if ((syncStatus & 0x02) != 0x02) return; + } + else { + // HV check, check H + V + if ((syncStatus & 0x0a) != 0x0a) return; + } + + if ((syncStatus & 0x02) != 0x02) // if !hs active + { + //SerialM.println("(SP) can't detect sync edge"); + } + else + { + if ((syncStatus & 0x01) == 0x00) + { + if (printHS != 1) { SerialM.println(F("(SP) HS active low")); } + printHS = 1; + + temp = GBS::HD_HS_SP::read(); + if (GBS::HD_HS_ST::read() < temp) { // if out sync = ST < SP + GBS::HD_HS_SP::write(GBS::HD_HS_ST::read()); + GBS::HD_HS_ST::write(temp); + GBS::SP_HS2PLL_INV_REG::write(1); + //GBS::SP_SOG_P_INV::write(0); // 5_20 2 //could also use 5_20 1 "SP_SOG_P_ATO" + } + } + else + { + if (printHS != 2) { SerialM.println(F("(SP) HS active high")); } + printHS = 2; + + temp = GBS::HD_HS_SP::read(); + if (GBS::HD_HS_ST::read() > temp) { // if out sync = ST > SP + GBS::HD_HS_SP::write(GBS::HD_HS_ST::read()); + GBS::HD_HS_ST::write(temp); + GBS::SP_HS2PLL_INV_REG::write(0); + //GBS::SP_SOG_P_INV::write(1); // 5_20 2 //could also use 5_20 1 "SP_SOG_P_ATO" + } + } + + // VS check, but only necessary for separate sync (CS should have VS always active low) + if (rto->syncTypeCsync == false) + { + if ((syncStatus & 0x08) != 0x08) // if !vs active + { + Serial.println(F("VS can't detect sync edge")); + } + else + { + if ((syncStatus & 0x04) == 0x00) + { + if (printVS != 1) { SerialM.println(F("(SP) VS active low")); } + printVS = 1; + + temp = GBS::HD_VS_SP::read(); + if (GBS::HD_VS_ST::read() < temp) { // if out sync = ST < SP + GBS::HD_VS_SP::write(GBS::HD_VS_ST::read()); + GBS::HD_VS_ST::write(temp); + } + } + else + { + if (printVS != 2) { SerialM.println(F("(SP) VS active high")); } + printVS = 2; + + temp = GBS::HD_VS_SP::read(); + if (GBS::HD_VS_ST::read() > temp) { // if out sync = ST > SP + GBS::HD_VS_SP::write(GBS::HD_VS_ST::read()); + GBS::HD_VS_ST::write(temp); + } + } + } + } + } +} + +void prepareSyncProcessor() { + writeOneByte(0xF0, 5); + GBS::SP_SOG_P_ATO::write(0); // 5_20 disable sog auto polarity // hpw can be > ht, but auto is worse + GBS::SP_JITTER_SYNC::write(0); + // H active detect control + writeOneByte(0x21, 0x18); // SP_SYNC_TGL_THD H Sync toggle time threshold 0x20; lower than 5_33(not always); 0 to turn off (?) 0x18 for 53.69 system @ 33.33 + writeOneByte(0x22, 0x0F); // SP_L_DLT_REG Sync pulse width difference threshold (less than this = equal) + writeOneByte(0x23, 0x00); // UNDOCUMENTED range from 0x00 to at least 0x1d + writeOneByte(0x24, 0x40); // SP_T_DLT_REG H total width difference threshold rgbhv: b // range from 0x02 upwards + writeOneByte(0x25, 0x00); // SP_T_DLT_REG + writeOneByte(0x26, 0x04); // SP_SYNC_PD_THD H sync pulse width threshold // from 0(?) to 0x50 // in yuv 720p range only to 0x0a! + writeOneByte(0x27, 0x00); // SP_SYNC_PD_THD + writeOneByte(0x2a, 0x0F); // SP_PRD_EQ_THD How many legal lines as valid; scales with 5_33 (needs to be below) + // V active detect control + // these 4 only have effect with HV input; test: s5s2ds34 s5s2es24 s5s2fs16 s5s31s84 + writeOneByte(0x2d, 0x03); // SP_VSYNC_TGL_THD V sync toggle time threshold // at 5 starts to drop many 0_16 vsync events + writeOneByte(0x2e, 0x00); // SP_SYNC_WIDTH_DTHD V sync pulse width threshold + writeOneByte(0x2f, 0x02); // SP_V_PRD_EQ_THD How many continue legal v sync as valid // at 4 starts to drop 0_16 vsync events + writeOneByte(0x31, 0x2f); // SP_VT_DLT_REG V total difference threshold + // Timer value control + writeOneByte(0x33, 0x3a); // SP_H_TIMER_VAL H timer value for h detect (was 0x28) + writeOneByte(0x34, 0x06); // SP_V_TIMER_VAL V timer for V detect // 0_16 vsactive // was 0x05 + // Sync separation control + if (rto->videoStandardInput == 0) GBS::SP_DLT_REG::write(0x70); // 5_35 130 too much for ps2 1080i, 0xb0 for 1080p + else if (rto->videoStandardInput <= 4) GBS::SP_DLT_REG::write(0xC0); // old: extended to 0x150 later if mode = 1 or 2 + else if (rto->videoStandardInput <= 6) GBS::SP_DLT_REG::write(0xA0); + else if (rto->videoStandardInput == 7) GBS::SP_DLT_REG::write(0x70); + else GBS::SP_DLT_REG::write(0x70); + + if (videoStandardInputIsPalNtscSd()) { + GBS::SP_H_PULSE_IGNOR::write(0x6b); + } + else { + GBS::SP_H_PULSE_IGNOR::write(0x02); // test with MS / Genesis mode (wsog 2) vs ps2 1080p (0x13 vs 0x05) + } + // leave out pre / post coast here + // 5_3a attempted 2 for 1chip snes 239 mode intermittency, works fine except for MD in MS mode + // make sure this is stored in the presets as well, as it affects sync time + GBS::SP_H_TOTAL_EQ_THD::write(3); + + GBS::SP_SDCS_VSST_REG_H::write(0); + GBS::SP_SDCS_VSSP_REG_H::write(0); + GBS::SP_SDCS_VSST_REG_L::write(4); // 5_3f // was 12 + GBS::SP_SDCS_VSSP_REG_L::write(1); // 5_40 // was 11 + + GBS::SP_CS_HS_ST::write(0x10); // 5_45 + GBS::SP_CS_HS_SP::write(0x00); // 5_47 720p source needs ~20 range, may be necessary to adjust at runtime, based on source res + + writeOneByte(0x49, 0x00); // retime HS start for RGB+HV rgbhv: 20 + writeOneByte(0x4a, 0x00); // + writeOneByte(0x4b, 0x44); // retime HS stop rgbhv: 50 + writeOneByte(0x4c, 0x00); // + + writeOneByte(0x51, 0x02); // 0x00 rgbhv: 2 + writeOneByte(0x52, 0x00); // 0xc0 + writeOneByte(0x53, 0x00); // 0x05 rgbhv: 6 + writeOneByte(0x54, 0x00); // 0xc0 + + if (rto->videoStandardInput != 15 && (GBS::GBS_OPTION_SCALING_RGBHV::read() != 1)) { + GBS::SP_CLAMP_MANUAL::write(0); // 0 = automatic on/off possible + GBS::SP_CLP_SRC_SEL::write(0); // clamp source 1: pixel clock, 0: 27mhz // was 1 but the pixel clock isn't available at first + GBS::SP_NO_CLAMP_REG::write(1); // 5_57_0 unlock clamp + GBS::SP_SOG_MODE::write(1); + GBS::SP_H_CST_ST::write(0x10); // 5_4d + GBS::SP_H_CST_SP::write(0x100); // 5_4f + GBS::SP_DIS_SUB_COAST::write(0); // 5_3e 5 + GBS::SP_H_PROTECT::write(1); // SP_H_PROTECT on for detection + GBS::SP_HCST_AUTO_EN::write(0); + GBS::SP_NO_COAST_REG::write(0); + } + + GBS::SP_HS_REG::write(1); // 5_57 7 + GBS::SP_HS_PROC_INV_REG::write(0); // no SP sync inversion + GBS::SP_VS_PROC_INV_REG::write(0); // + + writeOneByte(0x58, 0x05); //rgbhv: 0 + writeOneByte(0x59, 0x00); //rgbhv: 0 + writeOneByte(0x5a, 0x01); //rgbhv: 0 // was 0x05 but 480p ps2 doesnt like it + writeOneByte(0x5b, 0x00); //rgbhv: 0 + writeOneByte(0x5c, 0x03); //rgbhv: 0 + writeOneByte(0x5d, 0x02); //rgbhv: 0 // range: 0 - 0x20 (how long should clamp stay off) +} + +// Sync detect resolution: 5bits; comparator voltage range 10mv~320mv. +// -> 10mV per step; if cables and source are to standard (level 6 = 60mV) +void setAndUpdateSogLevel(uint8_t level) { + rto->currentLevelSOG = level & 0x1f; + GBS::ADC_SOGCTRL::write(level); + setAndLatchPhaseSP(); + setAndLatchPhaseADC(); + latchPLLAD(); + GBS::INTERRUPT_CONTROL_00::write(0xff); // reset irq status + GBS::INTERRUPT_CONTROL_00::write(0x00); + //Serial.print("sog: "); Serial.println(rto->currentLevelSOG); +} + +// in operation: t5t04t1 for 10% lower power on ADC +// also: s0s40s1c for 5% (lower memclock of 108mhz) +// for some reason: t0t45t2 t0t45t4 (enable SDAC, output max voltage) 5% lower done in presets +// t0t4ft4 clock out should be off +// s4s01s20 (was 30) faster latency // unstable at 108mhz +// both phase controls off saves some power 506ma > 493ma +// oversample ratio can save 10% at 1x +// t3t24t3 VDS_TAP6_BYPS on can save 2% + +// Generally, the ADC has to stay enabled to perform SOG separation and thus "see" a source. +// It is possible to run in low power mode. +// Function should not further nest, so it can be called in syncwatcher +void goLowPowerWithInputDetection() { + GBS::OUT_SYNC_CNTRL::write(0); // no H / V sync out to PAD + GBS::DAC_RGBS_PWDNZ::write(0); // direct disableDAC() + //zeroAll(); + setResetParameters(); // includes rto->videoStandardInput = 0 + prepareSyncProcessor(); + delay(100); + rto->isInLowPowerMode = true; + SerialM.println(F("Scanning inputs for sources ...")); + LEDOFF; +} + +boolean optimizePhaseSP() { + uint16_t pixelClock = GBS::PLLAD_MD::read(); + uint8_t badHt = 0, prevBadHt = 0, worstBadHt = 0, worstPhaseSP = 0, prevPrevBadHt = 0, goodHt = 0; + boolean runTest = 1; + + if (GBS::STATUS_SYNC_PROC_HTOTAL::read() < (pixelClock - 8)) { + return 0; + } + if (GBS::STATUS_SYNC_PROC_HTOTAL::read() > (pixelClock + 8)) { + return 0; + } + + if (rto->currentLevelSOG <= 2) { + // not very stable, use fixed values + rto->phaseSP = 16; + rto->phaseADC = 16; + if (rto->videoStandardInput > 0 && rto->videoStandardInput <= 4) { + if (rto->osr == 4) { + rto->phaseADC += 16; rto->phaseADC &= 0x1f; + } + } + delay(8); // a bit longer, to match default run time + runTest = 0; // skip to end + } + + //unsigned long startTime = millis(); + + if (runTest) { + // 32 distinct phase settings, 3 average samples (missing 2 phase steps) > 34 + for (uint8_t u = 0; u < 34; u++) { + rto->phaseSP++; + rto->phaseSP &= 0x1f; + setAndLatchPhaseSP(); + badHt = 0; + delayMicroseconds(256); + for (uint8_t i = 0; i < 20; i++) { + if (GBS::STATUS_SYNC_PROC_HTOTAL::read() != pixelClock) { + badHt++; + delayMicroseconds(384); + } + } + // if average 3 samples has more badHt than seen yet, this phase step is worse + if ((badHt + prevBadHt + prevPrevBadHt) > worstBadHt) { + worstBadHt = (badHt + prevBadHt + prevPrevBadHt); + worstPhaseSP = (rto->phaseSP - 1) & 0x1f; // medium of 3 samples + } + + if (badHt == 0) { + // count good readings as well, to know whether the entire run is valid + goodHt++; + } + + prevPrevBadHt = prevBadHt; + prevBadHt = badHt; + //Serial.print(rto->phaseSP); Serial.print(" badHt: "); Serial.println(badHt); + } + + //Serial.println(goodHt); + + if (goodHt < 17) { + //Serial.println("pxClk unstable"); + return 0; + } + + // adjust global phase values according to test results + if (worstBadHt != 0) { + rto->phaseSP = (worstPhaseSP + 16) & 0x1f; + // assume color signals arrive at same time: phase adc = phase sp + // test in hdbypass mode shows this is more related to sog.. the assumptions seem fine at sog = 8 + rto->phaseADC = 16; //(rto->phaseSP) & 0x1f; + + // different OSR require different phase angles, also depending on bypass, etc + // shift ADC phase 180 degrees for the following + if (rto->videoStandardInput >= 5 && rto->videoStandardInput <= 7) { + if (rto->osr == 2) { + //Serial.println("shift adc phase"); + rto->phaseADC += 16; rto->phaseADC &= 0x1f; + } + } + else if (rto->videoStandardInput > 0 && rto->videoStandardInput <= 4) { + if (rto->osr == 4) { + //Serial.println("shift adc phase"); + rto->phaseADC += 16; rto->phaseADC &= 0x1f; + } + } + } + else { + // test was always good, so choose any reasonable value + rto->phaseSP = 16; + rto->phaseADC = 16; + if (rto->videoStandardInput > 0 && rto->videoStandardInput <= 4) { + if (rto->osr == 4) { + rto->phaseADC += 16; rto->phaseADC &= 0x1f; + } + } + } + } + + //Serial.println(millis() - startTime); + //Serial.print("worstPhaseSP: "); Serial.println(worstPhaseSP); + + /*static uint8_t lastLevelSOG = 99; + if (lastLevelSOG != rto->currentLevelSOG) { + SerialM.print("Phase: "); SerialM.print(rto->phaseSP); + SerialM.print(" SOG: "); SerialM.print(rto->currentLevelSOG); + SerialM.println(); + } + lastLevelSOG = rto->currentLevelSOG;*/ + + setAndLatchPhaseSP(); + delay(1); + setAndLatchPhaseADC(); + + return 1; +} + +void optimizeSogLevel() { + if (rto->boardHasPower == false) // checkBoardPower is too invasive now + { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 13; + return; + } + if (rto->videoStandardInput == 15 || GBS::SP_SOG_MODE::read() != 1 || rto->syncTypeCsync == false) { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 13; + return; + } + + if (rto->inputIsYpBpR) { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 14; + } + else { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 13; // similar to yuv, allow variations + } + setAndUpdateSogLevel(rto->currentLevelSOG); + + uint8_t debug_backup = GBS::TEST_BUS_SEL::read(); + uint8_t debug_backup_SP = GBS::TEST_BUS_SP_SEL::read(); + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(0xa); delay(1); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(0x0f); delay(1); + } + + GBS::TEST_BUS_EN::write(1); + + delay(100); + while (1) { + uint16_t syncGoodCounter = 0; + unsigned long timeout = millis(); + while ((millis() - timeout) < 60) { + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 1) { + syncGoodCounter++; + if (syncGoodCounter >= 60) { break; } + } + else if (syncGoodCounter >= 4) { syncGoodCounter -= 3; } + } + + if (syncGoodCounter >= 60) { + syncGoodCounter = 0; + //if (getVideoMode() != 0) { + if (GBS::TEST_BUS_2F::read() > 0) { + delay(20); + for (int a = 0; a < 50; a++) { + syncGoodCounter++; + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 0 || GBS::TEST_BUS_2F::read() == 0) { + syncGoodCounter = 0; + break; + } + } + if (syncGoodCounter >= 49) { + //SerialM.print("OK @SOG "); SerialM.println(rto->currentLevelSOG); printInfo(); + break; // found, exit + } + else { + //Serial.print(" inner test failed syncGoodCounter: "); Serial.println(syncGoodCounter); + } + } + else { // getVideoMode() == 0 + //Serial.print("sog-- syncGoodCounter: "); Serial.println(syncGoodCounter); + } + } + else { // syncGoodCounter < 40 + //Serial.print("outer test failed syncGoodCounter: "); Serial.println(syncGoodCounter); + } + + if (rto->currentLevelSOG >= 2) { + rto->currentLevelSOG -= 1; + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(8); // time for sog to settle + } + else { + rto->currentLevelSOG = 13; // leave at default level + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(8); + break; // break and exit + } + } + + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG; + if (rto->thisSourceMaxLevelSOG == 0) { + rto->thisSourceMaxLevelSOG = 1; // fail safe + } + + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(debug_backup); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(debug_backup_SP); + } +} + +// GBS boards have 2 potential sync sources: +// - RCA connectors +// - VGA input / 5 pin RGBS header / 8 pin VGA header (all 3 are shared electrically) +// This routine looks for sync on the currently active input. If it finds it, the input is returned. +// If it doesn't find sync, it switches the input and returns 0, so that an active input will be found eventually. +uint8_t detectAndSwitchToActiveInput() { // if any + uint8_t currentInput = GBS::ADC_INPUT_SEL::read(); + unsigned long timeout = millis(); + while (millis() - timeout < 450) { + delay(10); + handleWiFi(0); + + boolean stable = getStatus16SpHsStable(); + if (stable) + { + currentInput = GBS::ADC_INPUT_SEL::read(); + SerialM.print(F("Activity detected, input: ")); + if(currentInput == 1) SerialM.println("RGB"); + else SerialM.println(F("Component")); + + if (currentInput == 1) { // RGBS or RGBHV + boolean vsyncActive = 0; + rto->inputIsYpBpR = false; // declare for MD + rto->currentLevelSOG = 13; // test startup with MD and MS separately! + setAndUpdateSogLevel(rto->currentLevelSOG); + + unsigned long timeOutStart = millis(); + // vsync test + // 360ms good up to 5_34 SP_V_TIMER_VAL = 0x0b + while (!vsyncActive && ((millis() - timeOutStart) < 360)) { + vsyncActive = GBS::STATUS_SYNC_PROC_VSACT::read(); + handleWiFi(0); // wifi stack + delay(1); + } + + // if VSync is active, it's RGBHV or RGBHV with CSync on HS pin + if (vsyncActive) { + SerialM.println(F("VSync: present")); + GBS::MD_SEL_VGA60::write(1); // VGA 640x480 more likely than EDTV + boolean hsyncActive = 0; + + timeOutStart = millis(); + while (!hsyncActive && millis() - timeOutStart < 400) { + hsyncActive = GBS::STATUS_SYNC_PROC_HSACT::read(); + handleWiFi(0); // wifi stack + delay(1); + } + + if (hsyncActive) { + SerialM.print(F("HSync: present")); + // The HSync and SOG pins are setup to detect CSync, if present + // (SOG mode on, coasting setup, debug bus setup, etc) + // SP_H_PROTECT is needed for CSync with a VS source present as well + GBS::SP_H_PROTECT::write(1); + delay(120); + + short decodeSuccess = 0; + for (int i = 0; i < 3; i++) + { + // no success if: no signal at all (returns 0.0f), no embedded VSync (returns ~18.5f) + // todo: this takes a while with no csync present + rto->syncTypeCsync = 1; // temporary for test + float sfr = getSourceFieldRate(1); + rto->syncTypeCsync = 0; // undo + if (sfr > 40.0f) decodeSuccess++; // properly decoded vsync from 40 to xx Hz + } + + if (decodeSuccess >= 2) { + SerialM.println(F(" (with CSync)")); + GBS::SP_PRE_COAST::write(0x10); // increase from 9 to 16 (EGA 364) + delay(40); + rto->syncTypeCsync = true; + } + else { + SerialM.println(); + rto->syncTypeCsync = false; + } + + // check for 25khz, all regular SOG modes first // update: only check for mode 8 + // MD reg for medium res starts at 0x2C and needs 16 loops to ramp to max of 0x3C (vt 360 .. 496) + // if source is HS+VS, can't detect via MD unit, need to set 5_11=0x92 and look at vt: counter + for (uint8_t i = 0; i < 16; i++) { + //printInfo(); + uint8_t innerVideoMode = getVideoMode(); + if (innerVideoMode == 8) { + setAndUpdateSogLevel(rto->currentLevelSOG); + rto->medResLineCount = GBS::MD_HD1250P_CNTRL::read(); + SerialM.println(F("med res")); + + return 1; + } + // update 25khz detection + GBS::MD_HD1250P_CNTRL::write(GBS::MD_HD1250P_CNTRL::read() + 1); + //Serial.println(GBS::MD_HD1250P_CNTRL::read(), HEX); + delay(30); + } + + rto->videoStandardInput = 15; + // exception: apply preset here, not later in syncwatcher + applyPresets(rto->videoStandardInput); + delay(100); + + return 3; + } + else { + // need to continue looking + SerialM.println(F("but no HSync!")); + } + } + + if (!vsyncActive) { // then do RGBS check + rto->syncTypeCsync = true; + GBS::MD_SEL_VGA60::write(0); // EDTV60 more likely than VGA60 + uint16_t testCycle = 0; + timeOutStart = millis(); + while ((millis() - timeOutStart) < 6000) + { + delay(2); + if (getVideoMode() > 0) { + if (getVideoMode() != 8) { // if it's mode 8, need to set stuff first + return 1; + } + } + testCycle++; + // post coast 18 can mislead occasionally (SNES 239 mode) + // but even then it still detects the video mode pretty well + if ((testCycle % 150) == 0) { + if (rto->currentLevelSOG == 1) { + rto->currentLevelSOG = 2; + } + else { + rto->currentLevelSOG += 2; + } + if (rto->currentLevelSOG >= 15) { rto->currentLevelSOG = 1; } + setAndUpdateSogLevel(rto->currentLevelSOG); + } + + // new: check for 25khz, use regular scaling route for those + if (getVideoMode() == 8) { + rto->currentLevelSOG = rto->thisSourceMaxLevelSOG = 13; + setAndUpdateSogLevel(rto->currentLevelSOG); + rto->medResLineCount = GBS::MD_HD1250P_CNTRL::read(); + SerialM.println(F("med res")); + return 1; + } + + uint8_t currentMedResLineCount = GBS::MD_HD1250P_CNTRL::read(); + if (currentMedResLineCount < 0x3c) { + GBS::MD_HD1250P_CNTRL::write(currentMedResLineCount + 1); + } + else { + GBS::MD_HD1250P_CNTRL::write(0x33); + } + //Serial.println(GBS::MD_HD1250P_CNTRL::read(), HEX); + + } + + //rto->currentLevelSOG = rto->thisSourceMaxLevelSOG = 13; + //setAndUpdateSogLevel(rto->currentLevelSOG); + + return 1; //anyway, let later stage deal with it + } + + GBS::SP_SOG_MODE::write(1); + resetSyncProcessor(); + resetModeDetect(); // there was some signal but we lost it. MD is stuck anyway, so reset + delay(40); + } + else if (currentInput == 0) { // YUV + uint16_t testCycle = 0; + rto->inputIsYpBpR = true; // declare for MD + GBS::MD_SEL_VGA60::write(0); // EDTV more likely than VGA 640x480 + + unsigned long timeOutStart = millis(); + while ((millis() - timeOutStart) < 6000) + { + delay(2); + if (getVideoMode() > 0) { + return 2; + } + + testCycle++; + if ((testCycle % 180) == 0) { + if (rto->currentLevelSOG == 1) { + rto->currentLevelSOG = 2; + } + else { + rto->currentLevelSOG += 2; + } + if (rto->currentLevelSOG >= 16) { rto->currentLevelSOG = 1; } + setAndUpdateSogLevel(rto->currentLevelSOG); + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG; + } + } + + rto->currentLevelSOG = rto->thisSourceMaxLevelSOG = 14; + setAndUpdateSogLevel(rto->currentLevelSOG); + + return 2; //anyway, let later stage deal with it + } + + SerialM.println(" lost.."); + rto->currentLevelSOG = 2; + setAndUpdateSogLevel(rto->currentLevelSOG); + } + + GBS::ADC_INPUT_SEL::write(!currentInput); // can only be 1 or 0 + delay(200); + + return 0; // don't do the check on the new input here, wait till next run + } + + return 0; +} + +uint8_t inputAndSyncDetect() { + uint8_t syncFound = detectAndSwitchToActiveInput(); + + if (syncFound == 0) { + if (!getSyncPresent()) { + if (rto->isInLowPowerMode == false) { + rto->sourceDisconnected = true; + rto->videoStandardInput = 0; + // reset to base settings, then go to low power + GBS::SP_SOG_MODE::write(1); + goLowPowerWithInputDetection(); + rto->isInLowPowerMode = true; + } + } + return 0; + } + else if (syncFound == 1) { // input is RGBS + rto->inputIsYpBpR = 0; + rto->sourceDisconnected = false; + rto->isInLowPowerMode = false; + resetDebugPort(); + applyRGBPatches(); + LEDON; + return 1; + } + else if (syncFound == 2) { + rto->inputIsYpBpR = 1; + rto->sourceDisconnected = false; + rto->isInLowPowerMode = false; + resetDebugPort(); + applyYuvPatches(); + LEDON; + return 2; + } + else if (syncFound == 3) { // input is RGBHV + //already applied + rto->isInLowPowerMode = false; + rto->inputIsYpBpR = 0; + rto->sourceDisconnected = false; + rto->videoStandardInput = 15; + resetDebugPort(); + LEDON; + return 3; + } + + return 0; +} + +uint8_t getSingleByteFromPreset(const uint8_t* programArray, unsigned int offset) { + return pgm_read_byte(programArray + offset); +} + +static inline void readFromRegister(uint8_t reg, int bytesToRead, uint8_t* output) +{ + return GBS::read(lastSegment, reg, output, bytesToRead); +} + +void printReg(uint8_t seg, uint8_t reg) { + uint8_t readout; + readFromRegister(reg, 1, &readout); + // didn't think this HEX trick would work, but it does! (?) + SerialM.print("0x"); SerialM.print(readout, HEX); SerialM.print(", // s"); SerialM.print(seg); SerialM.print("_"); SerialM.println(reg, HEX); + // old: + //SerialM.print(readout); SerialM.print(", // s"); SerialM.print(seg); SerialM.print("_"); SerialM.println(reg, HEX); +} + +// dumps the current chip configuration in a format that's ready to use as new preset :) +void dumpRegisters(byte segment) +{ + if (segment > 5) return; + writeOneByte(0xF0, segment); + + switch (segment) { + case 0: + for (int x = 0x40; x <= 0x5F; x++) { + printReg(0, x); + } + for (int x = 0x90; x <= 0x9F; x++) { + printReg(0, x); + } + break; + case 1: + for (int x = 0x0; x <= 0x2F; x++) { + printReg(1, x); + } + break; + case 2: + // not needed anymore, code kept for debug + /*for (int x = 0x0; x <= 0x3F; x++) { + printReg(2, x); + }*/ + break; + case 3: + for (int x = 0x0; x <= 0x7F; x++) { + printReg(3, x); + } + break; + case 4: + for (int x = 0x0; x <= 0x5F; x++) { + printReg(4, x); + } + break; + case 5: + for (int x = 0x0; x <= 0x6F; x++) { + printReg(5, x); + } + break; + } +} + +void resetPLLAD() { + GBS::PLLAD_VCORST::write(1); + GBS::PLLAD_PDZ::write(1); // in case it was off + latchPLLAD(); + GBS::PLLAD_VCORST::write(0); + delay(1); + latchPLLAD(); + rto->clampPositionIsSet = 0; // test, but should be good + rto->continousStableCounter = 1; +} + +void latchPLLAD() { + GBS::PLLAD_LAT::write(0); + delayMicroseconds(128); + GBS::PLLAD_LAT::write(1); +} + +void resetPLL() { + GBS::PLL_VCORST::write(1); + delay(1); + GBS::PLL_VCORST::write(0); + delay(1); + rto->clampPositionIsSet = 0; // test, but should be good + rto->continousStableCounter = 1; +} + +void ResetSDRAM() { + //GBS::SDRAM_RESET_CONTROL::write(0x87); // enable "Software Control SDRAM Idle Period" and "SDRAM_START_INITIAL_CYCLE" + //GBS::SDRAM_RESET_SIGNAL::write(1); + //GBS::SDRAM_RESET_SIGNAL::write(0); + //GBS::SDRAM_START_INITIAL_CYCLE::write(0); + GBS::SDRAM_RESET_CONTROL::write(0x02); + GBS::SDRAM_RESET_SIGNAL::write(1); + GBS::SDRAM_RESET_SIGNAL::write(0); + GBS::SDRAM_RESET_CONTROL::write(0x82); +} + +// soft reset cycle +// This restarts all chip units, which is sometimes required when important config bits are changed. +void resetDigital() { + boolean keepBypassActive = 0; + if (GBS::SFTRST_HDBYPS_RSTZ::read() == 1) { // if HDBypass enabled + keepBypassActive = 1; + } + + //GBS::RESET_CONTROL_0x47::write(0x00); + GBS::RESET_CONTROL_0x47::write(0x17); // new, keep 0,1,2,4 on (DEC,MODE,SYNC,INT) //MODE okay? + + if (rto->outModeHdBypass) { // if currently in bypass + GBS::RESET_CONTROL_0x46::write(0x00); + GBS::RESET_CONTROL_0x47::write(0x1F); + return; // 0x46 stays all 0 + } + + GBS::RESET_CONTROL_0x46::write(0x41); // keep VDS (6) + IF (0) enabled, reset rest + if (keepBypassActive == 1) { // if HDBypass enabled + GBS::RESET_CONTROL_0x47::write(0x1F); + } + //else { + // GBS::RESET_CONTROL_0x47::write(0x17); + //} + GBS::RESET_CONTROL_0x46::write(0x7f); +} + +void resetSyncProcessor() { + GBS::SFTRST_SYNC_RSTZ::write(0); + delayMicroseconds(10); + GBS::SFTRST_SYNC_RSTZ::write(1); + //rto->clampPositionIsSet = false; // resetSyncProcessor is part of autosog + //rto->coastPositionIsSet = false; +} + +void resetModeDetect() { + GBS::SFTRST_MODE_RSTZ::write(0); + delay(1); // needed + GBS::SFTRST_MODE_RSTZ::write(1); + //rto->clampPositionIsSet = false; + //rto->coastPositionIsSet = false; +} + +void shiftHorizontal(uint16_t amountToShift, bool subtracting) { + uint16_t hrst = GBS::VDS_HSYNC_RST::read(); + uint16_t hbst = GBS::VDS_HB_ST::read(); + uint16_t hbsp = GBS::VDS_HB_SP::read(); + + // Perform the addition/subtraction + if (subtracting) { + if ((int16_t)hbst - amountToShift >= 0) { + hbst -= amountToShift; + } + else { + hbst = hrst - (amountToShift - hbst); + } + if ((int16_t)hbsp - amountToShift >= 0) { + hbsp -= amountToShift; + } + else { + hbsp = hrst - (amountToShift - hbsp); + } + } + else { + if ((int16_t)hbst + amountToShift <= hrst) { + hbst += amountToShift; + // also extend hbst_d to maximum hrst-1 + if (hbst > GBS::VDS_DIS_HB_ST::read()) { + GBS::VDS_DIS_HB_ST::write(hbst); + } + } + else { + hbst = 0 + (amountToShift - (hrst - hbst)); + } + if ((int16_t)hbsp + amountToShift <= hrst) { + hbsp += amountToShift; + } + else { + hbsp = 0 + (amountToShift - (hrst - hbsp)); + } + } + + GBS::VDS_HB_ST::write(hbst); + GBS::VDS_HB_SP::write(hbsp); + //Serial.print("hbst: "); Serial.println(hbst); + //Serial.print("hbsp: "); Serial.println(hbsp); +} + +void shiftHorizontalLeft() { + shiftHorizontal(4, true); +} + +void shiftHorizontalRight() { + shiftHorizontal(4, false); +} + +// unused but may become useful +void shiftHorizontalLeftIF(uint8_t amount) { + uint16_t IF_HB_ST2 = GBS::IF_HB_ST2::read() + amount; + uint16_t IF_HB_SP2 = GBS::IF_HB_SP2::read() + amount; + uint16_t PLLAD_MD = GBS::PLLAD_MD::read(); + + if (rto->videoStandardInput <= 2) { + GBS::IF_HSYNC_RST::write(PLLAD_MD / 2); // input line length from pll div + } + else if (rto->videoStandardInput <= 7) { + GBS::IF_HSYNC_RST::write(PLLAD_MD); + } + uint16_t IF_HSYNC_RST = GBS::IF_HSYNC_RST::read(); + + GBS::IF_LINE_SP::write(IF_HSYNC_RST + 1); + + // start + if (IF_HB_ST2 < IF_HSYNC_RST) { + GBS::IF_HB_ST2::write(IF_HB_ST2); + } + else { + GBS::IF_HB_ST2::write(IF_HB_ST2 - IF_HSYNC_RST); + } + //SerialM.print("IF_HB_ST2: "); SerialM.println(GBS::IF_HB_ST2::read()); + + // stop + if (IF_HB_SP2 < IF_HSYNC_RST) { + GBS::IF_HB_SP2::write(IF_HB_SP2); + } + else { + GBS::IF_HB_SP2::write((IF_HB_SP2 - IF_HSYNC_RST) + 1); + } + //SerialM.print("IF_HB_SP2: "); SerialM.println(GBS::IF_HB_SP2::read()); +} + +// unused but may become useful +void shiftHorizontalRightIF(uint8_t amount) { + int16_t IF_HB_ST2 = GBS::IF_HB_ST2::read() - amount; + int16_t IF_HB_SP2 = GBS::IF_HB_SP2::read() - amount; + uint16_t PLLAD_MD = GBS::PLLAD_MD::read(); + + if (rto->videoStandardInput <= 2) { + GBS::IF_HSYNC_RST::write(PLLAD_MD / 2); // input line length from pll div + } + else if (rto->videoStandardInput <= 7) { + GBS::IF_HSYNC_RST::write(PLLAD_MD); + } + int16_t IF_HSYNC_RST = GBS::IF_HSYNC_RST::read(); + + GBS::IF_LINE_SP::write(IF_HSYNC_RST + 1); + + if (IF_HB_ST2 > 0) { + GBS::IF_HB_ST2::write(IF_HB_ST2); + } + else { + GBS::IF_HB_ST2::write(IF_HSYNC_RST - 1); + } + //SerialM.print("IF_HB_ST2: "); SerialM.println(GBS::IF_HB_ST2::read()); + + if (IF_HB_SP2 > 0) { + GBS::IF_HB_SP2::write(IF_HB_SP2); + } + else { + GBS::IF_HB_SP2::write(IF_HSYNC_RST - 1); + //GBS::IF_LINE_SP::write(GBS::IF_LINE_SP::read() - 2); + } + //SerialM.print("IF_HB_SP2: "); SerialM.println(GBS::IF_HB_SP2::read()); +} + +void scaleHorizontal(uint16_t amountToScale, bool subtracting) +{ + uint16_t hscale = GBS::VDS_HSCALE::read(); + + // smooth out areas of interest + if (subtracting && (hscale == 513 || hscale == 512)) amountToScale = 1; + if (!subtracting && (hscale == 511 || hscale == 512)) amountToScale = 1; + + if (subtracting && (((int)hscale - amountToScale) <= 256)) { + hscale = 256; + GBS::VDS_HSCALE::write(hscale); + SerialM.println("limit"); + return; + } + + if (subtracting && (hscale - amountToScale > 255)) { + hscale -= amountToScale; + } else if (hscale + amountToScale < 1023) { + hscale += amountToScale; + } else if (hscale + amountToScale == 1023) { // exact max > bypass but apply VDS fetch changes + hscale = 1023; + GBS::VDS_HSCALE::write(hscale); + GBS::VDS_HSCALE_BYPS::write(1); + } else if (hscale + amountToScale > 1023) { // max + overshoot > bypass and no VDS fetch adjust + hscale = 1023; + GBS::VDS_HSCALE::write(hscale); + GBS::VDS_HSCALE_BYPS::write(1); + SerialM.println("limit"); + return; + } + + // will be scaling + GBS::VDS_HSCALE_BYPS::write(0); + + // move within VDS VB fetch area (within reason) + uint16_t htotal = GBS::VDS_HSYNC_RST::read(); + uint16_t toShift = 0; + if (hscale < 540) toShift = 4; + else if (hscale < 640) toShift = 3; + else toShift = 2; + + if (subtracting) { + shiftHorizontal(toShift, true); + if ((GBS::VDS_HB_ST::read() + 5) < GBS::VDS_DIS_HB_ST::read()) { + GBS::VDS_HB_ST::write(GBS::VDS_HB_ST::read() + 5); + } + else if ((GBS::VDS_DIS_HB_ST::read() + 5) < htotal) { + GBS::VDS_DIS_HB_ST::write(GBS::VDS_DIS_HB_ST::read() + 5); + GBS::VDS_HB_ST::write(GBS::VDS_DIS_HB_ST::read()); // dis_hbst = hbst + } + + // fix HB_ST > HB_SP conditions + if (GBS::VDS_HB_SP::read() < (GBS::VDS_HB_ST::read() + 16)) { // HB_SP < HB_ST + if ((GBS::VDS_HB_SP::read()) > (htotal / 2)) { // but HB_SP > some small value + GBS::VDS_HB_ST::write(GBS::VDS_HB_SP::read() - 16); + } + } + } + + // !subtracting check just for readability + if (!subtracting) { + shiftHorizontal(toShift, false); + if ((GBS::VDS_HB_ST::read() - 5) > 0) { + GBS::VDS_HB_ST::write(GBS::VDS_HB_ST::read() - 5); + } + } + + // fix scaling < 512 glitch: factor even, htotal even: hbst / hbsp should be even, etc + if (hscale < 512) { + if (hscale % 2 == 0) { // hscale 512 / even + if (GBS::VDS_HB_ST::read() % 2 == 1) { + GBS::VDS_HB_ST::write(GBS::VDS_HB_ST::read() + 1); + } + if (htotal % 2 == 1) { + if (GBS::VDS_HB_SP::read() % 2 == 0) { + GBS::VDS_HB_SP::write(GBS::VDS_HB_SP::read() - 1); + } + } else { + if (GBS::VDS_HB_SP::read() % 2 == 1) { + GBS::VDS_HB_SP::write(GBS::VDS_HB_SP::read() - 1); + } + } + } else { // hscale 499 / uneven + if (GBS::VDS_HB_ST::read() % 2 == 1) { + GBS::VDS_HB_ST::write(GBS::VDS_HB_ST::read() + 1); + } + if (htotal % 2 == 0) { + if (GBS::VDS_HB_SP::read() % 2 == 1) { + GBS::VDS_HB_SP::write(GBS::VDS_HB_SP::read() - 1); + } + } else { + if (GBS::VDS_HB_SP::read() % 2 == 0) { + GBS::VDS_HB_SP::write(GBS::VDS_HB_SP::read() - 1); + } + } + } + // if scaling was < 512 and HB_ST moved, align with VDS_DIS_HB_ST + if (GBS::VDS_DIS_HB_ST::read() < GBS::VDS_HB_ST::read()) { + GBS::VDS_DIS_HB_ST::write(GBS::VDS_HB_ST::read()); + } + } + + //SerialM.print("HB_ST: "); SerialM.println(GBS::VDS_HB_ST::read()); + //SerialM.print("HB_SP: "); SerialM.println(GBS::VDS_HB_SP::read()); + SerialM.print("HScale: "); SerialM.println(hscale); + GBS::VDS_HSCALE::write(hscale); +} + +// moves horizontal sync (VDS or HDB as needed) +void moveHS(uint16_t amountToAdd, bool subtracting) { + if (rto->outModeHdBypass) { + uint16_t SP_CS_HS_ST = GBS::SP_CS_HS_ST::read(); + uint16_t SP_CS_HS_SP = GBS::SP_CS_HS_SP::read(); + uint16_t htotal = GBS::HD_HSYNC_RST::read(); + + if (videoStandardInputIsPalNtscSd()) { + htotal -= 8; // account for the way hdbypass is setup in setOutModeHdBypass() + htotal *= 2; + } + + if (htotal == 0) return; // safety + int16_t amount = subtracting ? (0 - amountToAdd) : amountToAdd; + + if (SP_CS_HS_ST + amount < 0) { + SP_CS_HS_ST = htotal + SP_CS_HS_ST; // yep, this works :p + } + if (SP_CS_HS_SP + amount < 0) { + SP_CS_HS_SP = htotal + SP_CS_HS_SP; + } + + GBS::SP_CS_HS_ST::write((SP_CS_HS_ST + amount) % htotal); + GBS::SP_CS_HS_SP::write((SP_CS_HS_SP + amount) % htotal); + + SerialM.print("HSST: "); SerialM.print(GBS::SP_CS_HS_ST::read()); + SerialM.print(" HSSP: "); SerialM.println(GBS::SP_CS_HS_SP::read()); + } + else { + uint16_t VDS_HS_ST = GBS::VDS_HS_ST::read(); + uint16_t VDS_HS_SP = GBS::VDS_HS_SP::read(); + uint16_t htotal = GBS::VDS_HSYNC_RST::read(); + + if (htotal == 0) return; // safety + int16_t amount = subtracting ? (0 - amountToAdd) : amountToAdd; + + if (VDS_HS_ST + amount < 0) { + VDS_HS_ST = htotal + VDS_HS_ST; // yep, this works :p + } + if (VDS_HS_SP + amount < 0) { + VDS_HS_SP = htotal + VDS_HS_SP; + } + + GBS::VDS_HS_ST::write((VDS_HS_ST + amount) % htotal); + GBS::VDS_HS_SP::write((VDS_HS_SP + amount) % htotal); + + //SerialM.print("HSST: "); SerialM.print(GBS::VDS_HS_ST::read()); + //SerialM.print(" HSSP: "); SerialM.println(GBS::VDS_HS_SP::read()); + } + printVideoTimings(); +} + +void moveVS(uint16_t amountToAdd, bool subtracting) { + uint16_t vtotal = GBS::VDS_VSYNC_RST::read(); + if (vtotal == 0) return; // safety + uint16_t VDS_DIS_VB_ST = GBS::VDS_DIS_VB_ST::read(); + uint16_t newVDS_VS_ST = GBS::VDS_VS_ST::read(); + uint16_t newVDS_VS_SP = GBS::VDS_VS_SP::read(); + + if (subtracting) { + if ((newVDS_VS_ST - amountToAdd) > VDS_DIS_VB_ST) { + newVDS_VS_ST -= amountToAdd; + newVDS_VS_SP -= amountToAdd; + } + else SerialM.println("limit"); + } + else { + if ((newVDS_VS_SP + amountToAdd) < vtotal) { + newVDS_VS_ST += amountToAdd; + newVDS_VS_SP += amountToAdd; + } + else SerialM.println("limit"); + } + //SerialM.print("VSST: "); SerialM.print(newVDS_VS_ST); + //SerialM.print(" VSSP: "); SerialM.println(newVDS_VS_SP); + + GBS::VDS_VS_ST::write(newVDS_VS_ST); + GBS::VDS_VS_SP::write(newVDS_VS_SP); +} + +void invertHS() { + uint8_t high, low; + uint16_t newST, newSP; + + writeOneByte(0xf0, 3); + readFromRegister(0x0a, 1, &low); + readFromRegister(0x0b, 1, &high); + newST = ((((uint16_t)high) & 0x000f) << 8) | (uint16_t)low; + readFromRegister(0x0b, 1, &low); + readFromRegister(0x0c, 1, &high); + newSP = ((((uint16_t)high) & 0x00ff) << 4) | ((((uint16_t)low) & 0x00f0) >> 4); + + uint16_t temp = newST; + newST = newSP; + newSP = temp; + + writeOneByte(0x0a, (uint8_t)(newST & 0x00ff)); + writeOneByte(0x0b, ((uint8_t)(newSP & 0x000f) << 4) | ((uint8_t)((newST & 0x0f00) >> 8))); + writeOneByte(0x0c, (uint8_t)((newSP & 0x0ff0) >> 4)); +} + +void invertVS() { + uint8_t high, low; + uint16_t newST, newSP; + + writeOneByte(0xf0, 3); + readFromRegister(0x0d, 1, &low); + readFromRegister(0x0e, 1, &high); + newST = ((((uint16_t)high) & 0x000f) << 8) | (uint16_t)low; + readFromRegister(0x0e, 1, &low); + readFromRegister(0x0f, 1, &high); + newSP = ((((uint16_t)high) & 0x00ff) << 4) | ((((uint16_t)low) & 0x00f0) >> 4); + + uint16_t temp = newST; + newST = newSP; + newSP = temp; + + writeOneByte(0x0d, (uint8_t)(newST & 0x00ff)); + writeOneByte(0x0e, ((uint8_t)(newSP & 0x000f) << 4) | ((uint8_t)((newST & 0x0f00) >> 8))); + writeOneByte(0x0f, (uint8_t)((newSP & 0x0ff0) >> 4)); +} + +void scaleVertical(uint16_t amountToScale, bool subtracting) { + uint16_t vscale = GBS::VDS_VSCALE::read(); + + // least invasive "is vscaling enabled" check + if (vscale == 1023) { + GBS::VDS_VSCALE_BYPS::write(0); + } + + // smooth out areas of interest + if (subtracting && (vscale == 513 || vscale == 512)) amountToScale = 1; + if (subtracting && (vscale == 684 || vscale == 683)) amountToScale = 1; + if (!subtracting && (vscale == 511 || vscale == 512)) amountToScale = 1; + if (!subtracting && (vscale == 682 || vscale == 683)) amountToScale = 1; + + if (subtracting && (vscale - amountToScale > 128)) { + vscale -= amountToScale; + } + else if (subtracting) { + vscale = 128; + } + else if (vscale + amountToScale <= 1023) { + vscale += amountToScale; + } + else if (vscale + amountToScale > 1023) { + vscale = 1023; + // don't enable vscale bypass here, since that disables ie line filter + } + + SerialM.print("VScale: "); SerialM.println(vscale); + GBS::VDS_VSCALE::write(vscale); +} + +// modified to move VBSP, set VBST to VBSP-2 +void shiftVertical(uint16_t amountToAdd, bool subtracting) { + typedef GBS::Tie Regs; + uint16_t vrst = GBS::VDS_VSYNC_RST::read() - FrameSync::getSyncLastCorrection(); + uint16_t vbst = 0, vbsp = 0; + int16_t newVbst = 0, newVbsp = 0; + + Regs::read(vbst, vbsp); + newVbst = vbst; newVbsp = vbsp; + + if (subtracting) { + //newVbst -= amountToAdd; + newVbsp -= amountToAdd; + } + else { + //newVbst += amountToAdd; + newVbsp += amountToAdd; + } + + // handle the case where hbst or hbsp have been decremented below 0 + if (newVbst < 0) { + newVbst = vrst + newVbst; + } + if (newVbsp < 0) { + newVbsp = vrst + newVbsp; + } + + // handle the case where vbst or vbsp have been incremented above vrstValue + if (newVbst > (int16_t)vrst) { + newVbst = newVbst - vrst; + } + if (newVbsp > (int16_t)vrst) { + newVbsp = newVbsp - vrst; + } + + // mod: newVbsp needs to be at least newVbst+2 + if (newVbsp < (newVbst + 2)) { + newVbsp = newVbst + 2; + } + // mod: -= 2 + newVbst = newVbsp - 2; + + Regs::write(newVbst, newVbsp); + //SerialM.print("VSST: "); SerialM.print(newVbst); SerialM.print(" VSSP: "); SerialM.println(newVbsp); +} + +void shiftVerticalUp() { + shiftVertical(1, true); +} + +void shiftVerticalDown() { + shiftVertical(1, false); +} + +void shiftVerticalUpIF() { + // -4 to allow variance in source line count + uint8_t offset = rto->videoStandardInput == 2 ? 4 : 1; + uint16_t sourceLines = GBS::VPERIOD_IF::read() - offset; + // add an override for sourceLines, in case where the IF data is not available + if ((GBS::GBS_OPTION_SCALING_RGBHV::read() == 1) && rto->videoStandardInput == 14) { + sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + } + int16_t stop = GBS::IF_VB_SP::read(); + int16_t start = GBS::IF_VB_ST::read(); + + if (stop < (sourceLines-1) && start < (sourceLines-1)) { stop += 2; start += 2; } + else { + start = 0; stop = 2; + } + GBS::IF_VB_SP::write(stop); + GBS::IF_VB_ST::write(start); +} + +void shiftVerticalDownIF() { + uint8_t offset = rto->videoStandardInput == 2 ? 4 : 1; + uint16_t sourceLines = GBS::VPERIOD_IF::read() - offset; + // add an override for sourceLines, in case where the IF data is not available + if ((GBS::GBS_OPTION_SCALING_RGBHV::read() == 1) && rto->videoStandardInput == 14) { + sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + } + + int16_t stop = GBS::IF_VB_SP::read(); + int16_t start = GBS::IF_VB_ST::read(); + + if (stop > 1 && start > 1) { stop -= 2; start -= 2; } + else { + start = sourceLines - 2; stop = sourceLines; + } + GBS::IF_VB_SP::write(stop); + GBS::IF_VB_ST::write(start); +} + +void setHSyncStartPosition(uint16_t value) { + if (rto->outModeHdBypass) { + //GBS::HD_HS_ST::write(value); + GBS::SP_CS_HS_ST::write(value); + } + else { + GBS::VDS_HS_ST::write(value); + } +} + +void setHSyncStopPosition(uint16_t value) { + if (rto->outModeHdBypass) { + //GBS::HD_HS_SP::write(value); + GBS::SP_CS_HS_SP::write(value); + } + else { + GBS::VDS_HS_SP::write(value); + } +} + +void setMemoryHblankStartPosition(uint16_t value) { + GBS::VDS_HB_ST::write(value); + GBS::HD_HB_ST::write(value); +} + +void setMemoryHblankStopPosition(uint16_t value) { + GBS::VDS_HB_SP::write(value); + GBS::HD_HB_SP::write(value); +} + +void setDisplayHblankStartPosition(uint16_t value) { + GBS::VDS_DIS_HB_ST::write(value); +} + +void setDisplayHblankStopPosition(uint16_t value) { + GBS::VDS_DIS_HB_SP::write(value); +} + +void setVSyncStartPosition(uint16_t value) { + GBS::VDS_VS_ST::write(value); + GBS::HD_VS_ST::write(value); +} + +void setVSyncStopPosition(uint16_t value) { + GBS::VDS_VS_SP::write(value); + GBS::HD_VS_SP::write(value); +} + +void setMemoryVblankStartPosition(uint16_t value) { + GBS::VDS_VB_ST::write(value); + GBS::HD_VB_ST::write(value); +} + +void setMemoryVblankStopPosition(uint16_t value) { + GBS::VDS_VB_SP::write(value); + GBS::HD_VB_SP::write(value); +} + +void setDisplayVblankStartPosition(uint16_t value) { + GBS::VDS_DIS_VB_ST::write(value); +} + +void setDisplayVblankStopPosition(uint16_t value) { + GBS::VDS_DIS_VB_SP::write(value); +} + +uint16_t getCsVsStart() { + return (GBS::SP_SDCS_VSST_REG_H::read() << 8) + GBS::SP_SDCS_VSST_REG_L::read(); +} + +uint16_t getCsVsStop() { + return (GBS::SP_SDCS_VSSP_REG_H::read() << 8) + GBS::SP_SDCS_VSSP_REG_L::read(); +} + +void setCsVsStart(uint16_t start) { + GBS::SP_SDCS_VSST_REG_H::write(start >> 8); + GBS::SP_SDCS_VSST_REG_L::write(start & 0xff); +} + +void setCsVsStop(uint16_t stop) { + GBS::SP_SDCS_VSSP_REG_H::write(stop >> 8); + GBS::SP_SDCS_VSSP_REG_L::write(stop & 0xff); +} + +void printVideoTimings() { + if (rto->presetID < 0x20) { + SerialM.println(""); + SerialM.print(F("HT / scale : ")); SerialM.print(GBS::VDS_HSYNC_RST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_HSCALE::read()); + SerialM.print(F("HS ST/SP : ")); SerialM.print(GBS::VDS_HS_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_HS_SP::read()); + SerialM.print(F("HB ST/SP(d) : ")); SerialM.print(GBS::VDS_DIS_HB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_DIS_HB_SP::read()); + SerialM.print(F("HB ST/SP : ")); SerialM.print(GBS::VDS_HB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_HB_SP::read()); + SerialM.println(F("------")); + // vertical + SerialM.print(F("VT / scale : ")); SerialM.print(GBS::VDS_VSYNC_RST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_VSCALE::read()); + SerialM.print(F("VS ST/SP : ")); SerialM.print(GBS::VDS_VS_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_VS_SP::read()); + SerialM.print(F("VB ST/SP(d) : ")); SerialM.print(GBS::VDS_DIS_VB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_DIS_VB_SP::read()); + SerialM.print(F("VB ST/SP : ")); SerialM.print(GBS::VDS_VB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::VDS_VB_SP::read()); + // IF V offset + SerialM.print(F("IF VB ST/SP : ")); SerialM.print(GBS::IF_VB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::IF_VB_SP::read()); + } + else { + SerialM.println(""); + SerialM.print(F("HD_HSYNC_RST : ")); SerialM.println(GBS::HD_HSYNC_RST::read()); + SerialM.print(F("HD_INI_ST : ")); SerialM.println(GBS::HD_INI_ST::read()); + SerialM.print(F("HS ST/SP : ")); SerialM.print(GBS::SP_CS_HS_ST::read()); + SerialM.print(" "); SerialM.println(GBS::SP_CS_HS_SP::read()); + SerialM.print(F("HB ST/SP : ")); SerialM.print(GBS::HD_HB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::HD_HB_SP::read()); + SerialM.println(F("------")); + // vertical + SerialM.print(F("VS ST/SP : ")); SerialM.print(GBS::HD_VS_ST::read()); + SerialM.print(" "); SerialM.println(GBS::HD_VS_SP::read()); + SerialM.print(F("VB ST/SP : ")); SerialM.print(GBS::HD_VB_ST::read()); + SerialM.print(" "); SerialM.println(GBS::HD_VB_SP::read()); + } + + SerialM.print(F("CsVT : ")); SerialM.println(GBS::STATUS_SYNC_PROC_VTOTAL::read()); + SerialM.print(F("CsVS_ST/SP : ")); SerialM.print(getCsVsStart()); + SerialM.print(F(" ")); SerialM.println(getCsVsStop()); +} + +void set_htotal(uint16_t htotal) { + // ModeLine "1280x960" 108.00 1280 1376 1488 1800 960 961 964 1000 +HSync +VSync + // front porch: H2 - H1: 1376 - 1280 + // back porch : H4 - H3: 1800 - 1488 + // sync pulse : H3 - H2: 1488 - 1376 + + uint16_t h_blank_display_start_position = htotal - 1; + uint16_t h_blank_display_stop_position = htotal - ((htotal * 3) / 4); + uint16_t center_blank = ((h_blank_display_stop_position / 2) * 3) / 4; // a bit to the left + uint16_t h_sync_start_position = center_blank - (center_blank / 2); + uint16_t h_sync_stop_position = center_blank + (center_blank / 2); + uint16_t h_blank_memory_start_position = h_blank_display_start_position - 1; + uint16_t h_blank_memory_stop_position = h_blank_display_stop_position - (h_blank_display_stop_position / 50); + + GBS::VDS_HSYNC_RST::write(htotal); + GBS::VDS_HS_ST::write(h_sync_start_position); + GBS::VDS_HS_SP::write(h_sync_stop_position); + GBS::VDS_DIS_HB_ST::write(h_blank_display_start_position); + GBS::VDS_DIS_HB_SP::write(h_blank_display_stop_position); + GBS::VDS_HB_ST::write(h_blank_memory_start_position); + GBS::VDS_HB_SP::write(h_blank_memory_stop_position); +} + +void set_vtotal(uint16_t vtotal) { + uint16_t VDS_DIS_VB_ST = vtotal - 2; // just below vtotal + uint16_t VDS_DIS_VB_SP = (vtotal >> 6) + 8; // positive, above new sync stop position + uint16_t VDS_VB_ST = ((uint16_t)(vtotal * 0.016f)) & 0xfffe; // small fraction of vtotal + uint16_t VDS_VB_SP = VDS_VB_ST + 2; // always VB_ST + 2 + uint16_t v_sync_start_position = 1; + uint16_t v_sync_stop_position = 5; + // most low line count formats have negative sync! + // exception: 1024x768 (1344x806 total) has both sync neg. // also 1360x768 (1792x795 total) + if ((vtotal < 530) || (vtotal >=803 && vtotal <= 809) || (vtotal >=793 && vtotal <= 798)) { + uint16_t temp = v_sync_start_position; + v_sync_start_position = v_sync_stop_position; + v_sync_stop_position = temp; + } + + GBS::VDS_VSYNC_RST::write(vtotal); + GBS::VDS_VS_ST::write(v_sync_start_position); + GBS::VDS_VS_SP::write(v_sync_stop_position); + GBS::VDS_VB_ST::write(VDS_VB_ST); + GBS::VDS_VB_SP::write(VDS_VB_SP); + GBS::VDS_DIS_VB_ST::write(VDS_DIS_VB_ST); + GBS::VDS_DIS_VB_SP::write(VDS_DIS_VB_SP); + + // VDS_VSYN_SIZE1 + VDS_VSYN_SIZE2 to VDS_VSYNC_RST + 2 + GBS::VDS_VSYN_SIZE1::write(GBS::VDS_VSYNC_RST::read() + 2); + GBS::VDS_VSYN_SIZE2::write(GBS::VDS_VSYNC_RST::read() + 2); +} + +void resetDebugPort() { + GBS::PAD_BOUT_EN::write(1); // output to pad enabled + GBS::IF_TEST_EN::write(1); + GBS::IF_TEST_SEL::write(3); // IF vertical period signal + GBS::TEST_BUS_SEL::write(0xa); // test bus to SP + GBS::TEST_BUS_EN::write(1); + GBS::TEST_BUS_SP_SEL::write(0x0f); // SP test signal select (vsync in, after SOG separation) + GBS::MEM_FF_TOP_FF_SEL::write(1); // g0g13/14 shows FIFO stats (capture, rff, wff, etc) + // SP test bus enable bit is included in TEST_BUS_SP_SEL + GBS::VDS_TEST_EN::write(1); // VDS test enable +} + +void readEeprom() { + int addr = 0; + const uint8_t eepromAddr = 0x50; + Wire.beginTransmission(eepromAddr); + //if (addr >= 0x1000) { addr = 0; } + Wire.write(addr >> 8); // high addr byte, 4 bits + + Wire.write((uint8_t)addr); // low addr byte, 8 bits = 12 bits (0xfff max) + Wire.endTransmission(); + Wire.requestFrom(eepromAddr, (uint8_t)128); + uint8_t readData = 0; + uint8_t i = 0; + while (Wire.available()) + { + Serial.print("addr 0x"); Serial.print(i, HEX); + Serial.print(": 0x"); readData = Wire.read(); + Serial.println(readData, HEX); + //addr++; + i++; + } +} + +void setIfHblankParameters() { + if (!rto->outModeHdBypass) { + uint16_t pll_divider = GBS::PLLAD_MD::read(); + + // if line doubling (PAL, NTSC), div 2 + a couple pixels + GBS::IF_HSYNC_RST::write(((pll_divider >> 1) + 13) & 0xfffe); // 1_0e + GBS::IF_LINE_SP::write(GBS::IF_HSYNC_RST::read() + 1); // 1_22 + if (rto->presetID == 0x05) { + // override for 1080p manually for now (pll_divider alone isn't correct :/) + GBS::IF_HSYNC_RST::write(GBS::IF_HSYNC_RST::read() + 32); + GBS::IF_LINE_SP::write(GBS::IF_LINE_SP::read() + 32); + } + if (rto->presetID == 0x15) { + GBS::IF_HSYNC_RST::write(GBS::IF_HSYNC_RST::read() + 20); + GBS::IF_LINE_SP::write(GBS::IF_LINE_SP::read() + 20); + } + + if (GBS::IF_LD_RAM_BYPS::read()) { + // no LD = EDTV or similar + GBS::IF_HB_SP2::write((uint16_t)((float)pll_divider * 0.06512f) & 0xfffe); // 1_1a // 0.06512f + // pll_divider / 2 - 3 is minimum IF_HB_ST2 + GBS::IF_HB_ST2::write((uint16_t)((float)pll_divider * 0.4912f) & 0xfffe); // 1_18 + } + else { + // LD mode (PAL, NTSC) + GBS::IF_HB_SP2::write(4 + ((uint16_t)((float)pll_divider * 0.0224f) & 0xfffe)); // 1_1a + GBS::IF_HB_ST2::write((uint16_t)((float)pll_divider * 0.4550f) & 0xfffe); // 1_18 + + if (GBS::IF_HB_ST2::read() >= 0x420) { + // limit (fifo?) (0x420 = 1056) (might be 0x424 instead) + // limit doesn't apply to EDTV modes, where 1_18 typically = 0x4B0 + GBS::IF_HB_ST2::write(0x420); + } + + if (rto->presetID == 0x05 || rto->presetID == 0x15) { + // override 1_1a for 1080p manually for now (pll_divider alone isn't correct :/) + GBS::IF_HB_SP2::write(0x2A); + } + + // position move via 1_26 and reserve for deinterlacer: add IF RST pixels + // seems no extra pixels available at around PLLAD:84A or 2122px + //uint16_t currentRst = GBS::IF_HSYNC_RST::read(); + //GBS::IF_HSYNC_RST::write((currentRst + (currentRst / 15)) & 0xfffe); // 1_0e + //GBS::IF_LINE_SP::write(GBS::IF_HSYNC_RST::read() + 1); // 1_22 + } + } +} + +void fastGetBestHtotal() { + uint32_t inStart, inStop; + signed long inPeriod = 1; + double inHz = 1.0; + GBS::TEST_BUS_SEL::write(0xa); + if (FrameSync::vsyncInputSample(&inStart, &inStop)) { + inPeriod = (inStop - inStart) >> 1; + if (inPeriod > 1) { + inHz = (double)1000000 / (double)inPeriod; + } + SerialM.print("inPeriod: "); SerialM.println(inPeriod); + SerialM.print("in hz: "); SerialM.println(inHz); + } + else { + SerialM.println("error"); + } + + uint16_t newVtotal = GBS::VDS_VSYNC_RST::read(); + double bestHtotal = 108000000 / ((double)newVtotal * inHz); // 107840000 + double bestHtotal50 = 108000000 / ((double)newVtotal * 50); + double bestHtotal60 = 108000000 / ((double)newVtotal * 60); + SerialM.print("newVtotal: "); SerialM.println(newVtotal); + // display clock probably not exact 108mhz + SerialM.print("bestHtotal: "); SerialM.println(bestHtotal); + SerialM.print("bestHtotal50: "); SerialM.println(bestHtotal50); + SerialM.print("bestHtotal60: "); SerialM.println(bestHtotal60); + if (bestHtotal > 800 && bestHtotal < 3200) { + //applyBestHTotal((uint16_t)bestHtotal); + //FrameSync::resetWithoutRecalculation(); // was single use of this function, function has changed since + } +} + +boolean runAutoBestHTotal() { + if (!FrameSync::ready() + && rto->autoBestHtotalEnabled == true + && rto->videoStandardInput > 0 + && rto->videoStandardInput < 15) + { + + //Serial.println("running"); + //unsigned long startTime = millis(); + + boolean stableNow = 1; + + for (uint8_t i = 0; i < 64; i++) { + if (!getStatus16SpHsStable()) { + stableNow = 0; + //Serial.println("prevented: !getStatus16SpHsStable"); + break; + } + } + + if (stableNow) + { + if (GBS::STATUS_INT_SOG_BAD::read()) { + //Serial.println("prevented_2!"); + resetInterruptSogBadBit(); + delay(40); + stableNow = false; + } + resetInterruptSogBadBit(); + + if (stableNow && (getVideoMode() == rto->videoStandardInput)) { + uint8_t testBusSelBackup = GBS::TEST_BUS_SEL::read(); + uint8_t vdsBusSelBackup = GBS::VDS_TEST_BUS_SEL::read(); + uint8_t ifBusSelBackup = GBS::IF_TEST_SEL::read(); + + if (testBusSelBackup != 0) GBS::TEST_BUS_SEL::write(0); // needs decimation + if + if (vdsBusSelBackup != 0) GBS::VDS_TEST_BUS_SEL::write(0); // VDS test # 0 = VBlank + if (ifBusSelBackup != 3) GBS::IF_TEST_SEL::write(3); // IF averaged frame time + + yield(); + uint16_t bestHTotal = FrameSync::init(); // critical task + yield(); + + GBS::TEST_BUS_SEL::write(testBusSelBackup); // always restore from backup (TB has changed) + if (vdsBusSelBackup != 0) GBS::VDS_TEST_BUS_SEL::write(vdsBusSelBackup); + if (ifBusSelBackup != 3) GBS::IF_TEST_SEL::write(ifBusSelBackup); + + if (GBS::STATUS_INT_SOG_BAD::read()) { + //Serial.println("prevented_5 INT_SOG_BAD!"); + stableNow = false; + } + for (uint8_t i = 0; i < 16; i++) { + if (!getStatus16SpHsStable()) { + stableNow = 0; + //Serial.println("prevented_5: !getStatus16SpHsStable"); + break; + } + } + resetInterruptSogBadBit(); + + if (bestHTotal > 4095) { + if (!rto->forceRetime) { + stableNow = false; + } + else { + // roll with it + bestHTotal = 4095; + } + } + + if (stableNow) { + for (uint8_t i = 0; i < 24; i++) { + delay(1); + if (!getStatus16SpHsStable()) { + stableNow = false; + //Serial.println("prevented_3!"); + break; + } + } + } + + if (bestHTotal > 0 && stableNow) { + boolean success = applyBestHTotal(bestHTotal); + if (success) { + rto->syncLockFailIgnore = 16; + //Serial.print("ok, took: "); + //Serial.println(millis() - startTime); + return true; // success + } + } + } + } + + // reaching here can happen even if stableNow == 1 + if (!stableNow) { + FrameSync::reset(uopt->frameTimeLockMethod); + + if (rto->syncLockFailIgnore > 0) { + rto->syncLockFailIgnore--; + if (rto->syncLockFailIgnore == 0) { + GBS::DAC_RGBS_PWDNZ::write(1); // xth chance + if (!uopt->wantOutputComponent) + { + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out // xth chance + } + rto->autoBestHtotalEnabled = false; + } + } + Serial.print(F("bestHtotal retry (")); + Serial.print(rto->syncLockFailIgnore); + Serial.println(")"); + } + } + else if (FrameSync::ready()) { + // FS ready but mode is 0 or 15 or autoBestHtotal is off + return true; + } + + if (rto->continousStableCounter != 0 && rto->continousStableCounter != 255) { + rto->continousStableCounter++; // stop repetitions + } + + return false; +} + +boolean applyBestHTotal(uint16_t bestHTotal) { + if (rto->outModeHdBypass) { + return true; // false? doesn't matter atm + } + + uint16_t orig_htotal = GBS::VDS_HSYNC_RST::read(); + int diffHTotal = bestHTotal - orig_htotal; + uint16_t diffHTotalUnsigned = abs(diffHTotal); + + if (((diffHTotalUnsigned == 0) || (rto->extClockGenDetected && diffHTotalUnsigned == 1)) && // all this + !rto->forceRetime) // and that + { + if (!uopt->enableFrameTimeLock) { // FTL can double throw this when it resets to adjust + SerialM.print(F("HTotal Adjust (skipped)")); + + if (!rto->extClockGenDetected) { + float sfr = getSourceFieldRate(0); + yield(); // wifi + float ofr = getOutputFrameRate(); + if (sfr < 1.0f) { + sfr = getSourceFieldRate(0); // retry + } + if (ofr < 1.0f) { + ofr = getOutputFrameRate(); // retry + } + SerialM.print(F(", source Hz: ")); + SerialM.print(sfr, 3); // prec. 3 + SerialM.print(F(", output Hz: ")); + SerialM.println(ofr, 3); // prec. 3 + } + else { + SerialM.println(); + } + } + return true; // nothing to do + } + + if (GBS::GBS_OPTION_PALFORCED60_ENABLED::read() == 1) { + // source is 50Hz, preset has to stay at 60Hz: return + return true; + } + + boolean isLargeDiff = (diffHTotalUnsigned > (orig_htotal * 0.06f)) ? true : false; // typical diff: 1802 to 1794 (=8) + + if (isLargeDiff && (getVideoMode() == 8 || rto->videoStandardInput == 14)) { + // arcade stuff syncs down from 60 to 52 Hz.. + isLargeDiff = (diffHTotalUnsigned > (orig_htotal * 0.16f)) ? true : false; + } + + if (isLargeDiff) { + SerialM.println(F("ABHT: large diff")); + } + + // rto->forceRetime = true means the correction should be forced (command '.') + if (isLargeDiff && (rto->forceRetime == false)) { + if (rto->videoStandardInput != 14) { + rto->failRetryAttempts++; + if (rto->failRetryAttempts < 8) { + SerialM.println(F("retry")); + FrameSync::reset(uopt->frameTimeLockMethod); + delay(60); + } + else { + SerialM.println(F("give up")); + rto->autoBestHtotalEnabled = false; + } + } + return false; // large diff, no forced + } + + // bestHTotal 0? could be an invald manual retime + if (bestHTotal == 0) { + Serial.println(F("bestHTotal 0")); + return false; + } + + if (rto->forceRetime == false) { + if (GBS::STATUS_INT_SOG_BAD::read() == 1) { + //Serial.println("prevented in apply"); + return false; + } + } + + rto->failRetryAttempts = 0; // else all okay!, reset to 0 + + // move blanking (display) + uint16_t h_blank_display_start_position = GBS::VDS_DIS_HB_ST::read(); + uint16_t h_blank_display_stop_position = GBS::VDS_DIS_HB_SP::read(); + uint16_t h_blank_memory_start_position = GBS::VDS_HB_ST::read(); + uint16_t h_blank_memory_stop_position = GBS::VDS_HB_SP::read(); + + // new 25.10.2019 + //uint16_t blankingAreaTotal = bestHTotal * 0.233f; + //h_blank_display_start_position += (diffHTotal / 2); + //h_blank_display_stop_position += (diffHTotal / 2); + //h_blank_memory_start_position = bestHTotal - (blankingAreaTotal * 0.212f); + //h_blank_memory_stop_position = blankingAreaTotal * 0.788f; + + // h_blank_memory_start_position usually is == h_blank_display_start_position + if (h_blank_memory_start_position == h_blank_display_start_position) { + h_blank_display_start_position += (diffHTotal / 2); + h_blank_display_stop_position += (diffHTotal / 2); + h_blank_memory_start_position = h_blank_display_start_position; // normal case + h_blank_memory_stop_position += (diffHTotal / 2); + } + else { + h_blank_display_start_position += (diffHTotal / 2); + h_blank_display_stop_position += (diffHTotal / 2); + h_blank_memory_start_position += (diffHTotal / 2); // the exception (currently 1280x1024) + h_blank_memory_stop_position += (diffHTotal / 2); + } + + if (diffHTotal < 0) { + h_blank_display_start_position &= 0xfffe; + h_blank_display_stop_position &= 0xfffe; + h_blank_memory_start_position &= 0xfffe; + h_blank_memory_stop_position &= 0xfffe; + } + else if (diffHTotal > 0) { + h_blank_display_start_position += 1; h_blank_display_start_position &= 0xfffe; + h_blank_display_stop_position += 1; h_blank_display_stop_position &= 0xfffe; + h_blank_memory_start_position += 1; h_blank_memory_start_position &= 0xfffe; + h_blank_memory_stop_position += 1; h_blank_memory_stop_position &= 0xfffe; + } + + // don't move HSync with small diffs + uint16_t h_sync_start_position = GBS::VDS_HS_ST::read(); + uint16_t h_sync_stop_position = GBS::VDS_HS_SP::read(); + + // fix over / underflows + if (h_blank_display_start_position > (bestHTotal - 8) || isLargeDiff) { + // typically happens when scaling Hz up (60 to 70) + //Serial.println("overflow h_blank_display_start_position"); + h_blank_display_start_position = bestHTotal * 0.936f; + } + if (h_blank_display_stop_position > bestHTotal || isLargeDiff) { + //Serial.println("overflow h_blank_display_stop_position"); + h_blank_display_stop_position = bestHTotal * 0.178f; + } + if ((h_blank_memory_start_position > bestHTotal) || (h_blank_memory_start_position > h_blank_display_start_position) || isLargeDiff) { + //Serial.println("overflow h_blank_memory_start_position"); + h_blank_memory_start_position = h_blank_display_start_position * 0.971f; + } + if (h_blank_memory_stop_position > bestHTotal || isLargeDiff) { + //Serial.println("overflow h_blank_memory_stop_position"); + h_blank_memory_stop_position = h_blank_display_stop_position * 0.64f; + } + + // check whether HS spills over HBSPD + if (h_sync_start_position > h_sync_stop_position && (h_sync_start_position < (bestHTotal / 2))) { // is neg HSync + if (h_sync_start_position >= h_blank_display_stop_position) { + h_sync_start_position = h_blank_display_stop_position * 0.8f; + h_sync_stop_position = 4; // good idea to move this close to 0 as well + } + } + else { + if (h_sync_stop_position >= h_blank_display_stop_position) { + h_sync_stop_position = h_blank_display_stop_position * 0.8f; + h_sync_start_position = 4; // + } + } + + // just fix HS + if (isLargeDiff) { + if (h_sync_start_position > h_sync_stop_position && (h_sync_start_position < (bestHTotal / 2))) { // is neg HSync + h_sync_stop_position = 4; + // stop = at least start, then a bit outwards + h_sync_start_position = 16 + (h_blank_display_stop_position * 0.3f); + } + else { + h_sync_start_position = 4; + h_sync_stop_position = 16 + (h_blank_display_stop_position * 0.3f); + } + } + + // finally, fix forced timings with large diff + // update: doesn't seem necessary anymore + //if (isLargeDiff) { + // h_blank_display_start_position = bestHTotal * 0.946f; + // h_blank_display_stop_position = bestHTotal * 0.22f; + // h_blank_memory_start_position = h_blank_display_start_position * 0.971f; + // h_blank_memory_stop_position = h_blank_display_stop_position * 0.64f; + + // if (h_sync_start_position > h_sync_stop_position && (h_sync_start_position < (bestHTotal / 2))) { // is neg HSync + // h_sync_stop_position = 0; + // // stop = at least start, then a bit outwards + // h_sync_start_position = 16 + (h_blank_display_stop_position * 0.4f); + // } + // else { + // h_sync_start_position = 0; + // h_sync_stop_position = 16 + (h_blank_display_stop_position * 0.4f); + // } + //} + + if (diffHTotal != 0) { // apply + // delay the change to field start, a bit more compatible + uint16_t timeout = 0; + while ((GBS::STATUS_VDS_FIELD::read() == 1) && (++timeout < 400)); + while ((GBS::STATUS_VDS_FIELD::read() == 0) && (++timeout < 800)); + + GBS::VDS_HSYNC_RST::write(bestHTotal); + GBS::VDS_DIS_HB_ST::write(h_blank_display_start_position); + GBS::VDS_DIS_HB_SP::write(h_blank_display_stop_position); + GBS::VDS_HB_ST::write(h_blank_memory_start_position); + GBS::VDS_HB_SP::write(h_blank_memory_stop_position); + GBS::VDS_HS_ST::write(h_sync_start_position); + GBS::VDS_HS_SP::write(h_sync_stop_position); + } + + boolean print = 1; + if (uopt->enableFrameTimeLock) { + if ((GBS::GBS_RUNTIME_FTL_ADJUSTED::read() == 1) && !rto->forceRetime) { + // FTL enabled and regular update, so don't print + print = 0; + } + GBS::GBS_RUNTIME_FTL_ADJUSTED::write(0); + } + + rto->forceRetime = false; + + if (print) { + SerialM.print(F("HTotal Adjust: ")); + if (diffHTotal >= 0) { + SerialM.print(" "); // formatting to align with negative value readouts + } + SerialM.print(diffHTotal); + + if (!rto->extClockGenDetected) { + float sfr = getSourceFieldRate(0); + delay(0); + float ofr = getOutputFrameRate(); + if (sfr < 1.0f) { + sfr = getSourceFieldRate(0); // retry + } + if (ofr < 1.0f) { + ofr = getOutputFrameRate(); // retry + } + SerialM.print(F(", source Hz: ")); + SerialM.print(sfr, 3); // prec. 3 + SerialM.print(F(", output Hz: ")); + SerialM.println(ofr, 3); // prec. 3 + } + else { + SerialM.println(); + } + } + + return true; +} + +float getSourceFieldRate(boolean useSPBus) { + double esp8266_clock_freq = ESP.getCpuFreqMHz() * 1000000; + uint8_t testBusSelBackup = GBS::TEST_BUS_SEL::read(); + uint8_t spBusSelBackup = GBS::TEST_BUS_SP_SEL::read(); + uint8_t ifBusSelBackup = GBS::IF_TEST_SEL::read(); + uint8_t debugPinBackup = GBS::PAD_BOUT_EN::read(); + + if (debugPinBackup != 1) GBS::PAD_BOUT_EN::write(1); // enable output to pin for test + + if (ifBusSelBackup != 3) GBS::IF_TEST_SEL::write(3); // IF averaged frame time + + if (useSPBus) + { + if (rto->syncTypeCsync) { + //Serial.println("TestBus for csync"); + if (testBusSelBackup != 0xa) GBS::TEST_BUS_SEL::write(0xa); + } + else { + //Serial.println("TestBus for HV Sync"); + if (testBusSelBackup != 0x0) GBS::TEST_BUS_SEL::write(0x0); // RGBHV: TB 0x20 has vsync + } + if (spBusSelBackup != 0x0f) GBS::TEST_BUS_SP_SEL::write(0x0f); + } + else + { + if (testBusSelBackup != 0) GBS::TEST_BUS_SEL::write(0); // needs decimation + if + } + + float retVal = 0; + + uint32_t fieldTimeTicks = FrameSync::getPulseTicks(); + if (fieldTimeTicks == 0) { + // try again + fieldTimeTicks = FrameSync::getPulseTicks(); + } + + if (fieldTimeTicks > 0) { + retVal = esp8266_clock_freq / (double)fieldTimeTicks; + if (retVal < 47.0f || retVal > 86.0f) { + // try again + fieldTimeTicks = FrameSync::getPulseTicks(); + if (fieldTimeTicks > 0) { + retVal = esp8266_clock_freq / (double)fieldTimeTicks; + } + } + } + + GBS::TEST_BUS_SEL::write(testBusSelBackup); + GBS::PAD_BOUT_EN::write(debugPinBackup); + if (spBusSelBackup != 0x0f) GBS::TEST_BUS_SP_SEL::write(spBusSelBackup); + if (ifBusSelBackup != 3) GBS::IF_TEST_SEL::write(ifBusSelBackup); + + return retVal; +} + +float getOutputFrameRate() { + double esp8266_clock_freq = ESP.getCpuFreqMHz() * 1000000; + uint8_t testBusSelBackup = GBS::TEST_BUS_SEL::read(); + uint8_t debugPinBackup = GBS::PAD_BOUT_EN::read(); + + if (debugPinBackup != 1) GBS::PAD_BOUT_EN::write(1); // enable output to pin for test + + if (testBusSelBackup != 2) GBS::TEST_BUS_SEL::write(2); // 0x4d = 0x22 VDS test + + float retVal = 0; + + uint32_t fieldTimeTicks = FrameSync::getPulseTicks(); + if (fieldTimeTicks == 0) { + // try again + fieldTimeTicks = FrameSync::getPulseTicks(); + } + + if (fieldTimeTicks > 0) { + retVal = esp8266_clock_freq / (double)fieldTimeTicks; + if (retVal < 47.0f || retVal > 86.0f) { + // try again + fieldTimeTicks = FrameSync::getPulseTicks(); + if (fieldTimeTicks > 0) { + retVal = esp8266_clock_freq / (double)fieldTimeTicks; + } + } + } + + GBS::TEST_BUS_SEL::write(testBusSelBackup); + GBS::PAD_BOUT_EN::write(debugPinBackup); + + return retVal; +} + +// used for RGBHV to determine the ADPLL speed "level" / can jitter with SOG Sync +uint32_t getPllRate() { + uint32_t esp8266_clock_freq = ESP.getCpuFreqMHz() * 1000000; + uint8_t testBusSelBackup = GBS::TEST_BUS_SEL::read(); + uint8_t spBusSelBackup = GBS::TEST_BUS_SP_SEL::read(); + uint8_t debugPinBackup = GBS::PAD_BOUT_EN::read(); + + if (testBusSelBackup != 0xa) { + GBS::TEST_BUS_SEL::write(0xa); + } + if (rto->syncTypeCsync) { + if (spBusSelBackup != 0x6b) GBS::TEST_BUS_SP_SEL::write(0x6b); + } + else { + if (spBusSelBackup != 0x09) GBS::TEST_BUS_SP_SEL::write(0x09); + } + GBS::PAD_BOUT_EN::write(1); // enable output to pin for test + yield(); // BOUT signal and wifi + delayMicroseconds(200); + uint32_t ticks = FrameSync::getPulseTicks(); + + // restore + GBS::PAD_BOUT_EN::write(debugPinBackup); + if (testBusSelBackup != 0xa) { + GBS::TEST_BUS_SEL::write(testBusSelBackup); + } + GBS::TEST_BUS_SP_SEL::write(spBusSelBackup); + + uint32_t retVal = 0; + if (ticks > 0) { + retVal = esp8266_clock_freq / ticks; + } + + return retVal; +} + +void doPostPresetLoadSteps() { + //unsigned long postLoadTimer = millis(); + + //GBS::PAD_SYNC_OUT_ENZ::write(1); // no sync out + //GBS::DAC_RGBS_PWDNZ::write(0); // no DAC + //GBS::SFTRST_MEM_FF_RSTZ::write(0); // mem fifos keep in reset + + if (rto->videoStandardInput == 0) + { + uint8_t videoMode = getVideoMode(); + SerialM.print(F("post preset: rto->videoStandardInput 0 > ")); + SerialM.println(videoMode); + if (videoMode > 0) { rto->videoStandardInput = videoMode; } + } + rto->presetID = GBS::GBS_PRESET_ID::read(); + boolean isCustomPreset = GBS::GBS_PRESET_CUSTOM::read(); + + GBS::ADC_UNUSED_64::write(0); GBS::ADC_UNUSED_65::write(0); // clear temp storage + GBS::ADC_UNUSED_66::write(0); GBS::ADC_UNUSED_67::write(0); // clear temp storage + GBS::PAD_CKIN_ENZ::write(0); // 0 = clock input enable (pin40) + + prepareSyncProcessor(); // todo: handle modes 14 and 15 better, now that they support scaling + if (rto->videoStandardInput == 14) { + // copy of code in bypassModeSwitch_RGBHV + if (rto->syncTypeCsync == false) + { + GBS::SP_SOG_SRC_SEL::write(0); // 5_20 0 | 0: from ADC 1: from hs // use ADC and turn it off = no SOG + GBS::ADC_SOGEN::write(1); // 5_02 0 ADC SOG // having it 0 drags down the SOG (hsync) input; = 1: need to supress SOG decoding + GBS::SP_EXT_SYNC_SEL::write(0); // connect HV input ( 5_20 bit 3 ) + GBS::SP_SOG_MODE::write(0); // 5_56 bit 0 // 0: normal, 1: SOG + GBS::SP_NO_COAST_REG::write(1); // vblank coasting off + GBS::SP_PRE_COAST::write(0); + GBS::SP_POST_COAST::write(0); + GBS::SP_H_PULSE_IGNOR::write(0xff); // cancel out SOG decoding + GBS::SP_SYNC_BYPS::write(0); // external H+V sync for decimator (+ sync out) | 1 to mirror in sync, 0 to output processed sync + GBS::SP_HS_POL_ATO::write(1); // 5_55 4 auto polarity for retiming + GBS::SP_VS_POL_ATO::write(1); // 5_55 6 + GBS::SP_HS_LOOP_SEL::write(1); // 5_57_6 | 0 enables retiming on SP | 1 to bypass input to HDBYPASS + GBS::SP_H_PROTECT::write(0); // 5_3e 4 disable for H/V + rto->phaseADC = 16; + rto->phaseSP = 8; + } + else + { + // todo: SOG SRC can be ADC or HS input pin. HS requires TTL level, ADC can use lower levels + // HS seems to have issues at low PLL speeds + // maybe add detection whether ADC Sync is needed + GBS::SP_SOG_SRC_SEL::write(0); // 5_20 0 | 0: from ADC 1: hs is sog source + GBS::SP_EXT_SYNC_SEL::write(1); // disconnect HV input + GBS::ADC_SOGEN::write(1); // 5_02 0 ADC SOG + GBS::SP_SOG_MODE::write(1); // apparently needs to be off for HS input (on for ADC) + GBS::SP_NO_COAST_REG::write(0); // vblank coasting on + GBS::SP_PRE_COAST::write(4); // 5_38, > 4 can be seen with clamp invert on the lower lines + GBS::SP_POST_COAST::write(7); + GBS::SP_SYNC_BYPS::write(0); // use regular sync for decimator (and sync out) path + GBS::SP_HS_LOOP_SEL::write(1); // 5_57_6 | 0 enables retiming on SP | 1 to bypass input to HDBYPASS + GBS::SP_H_PROTECT::write(1); // 5_3e 4 enable for SOG + rto->currentLevelSOG = 24; + rto->phaseADC = 16; + rto->phaseSP = 8; + } + } + + GBS::SP_H_PROTECT::write(0); + GBS::SP_COAST_INV_REG::write(0); // just in case + if (!rto->outModeHdBypass && GBS::GBS_OPTION_SCALING_RGBHV::read() == 0) { + // setOutModeHdBypass has it's own and needs to update later + updateSpDynamic(0); // remember: rto->videoStandardInput for RGB(C/HV) in scaling is 1, 2 or 3 here + } + + GBS::SP_NO_CLAMP_REG::write(1); // (keep) clamp disabled, to be enabled when position determined + GBS::OUT_SYNC_CNTRL::write(1); // prepare sync out to PAD + + // auto offset adc prep + GBS::ADC_AUTO_OFST_PRD::write(1); // by line (0 = by frame) + GBS::ADC_AUTO_OFST_DELAY::write(0); // sample delay 0 (1 to 4 pipes) + GBS::ADC_AUTO_OFST_STEP::write(0); // 0 = abs diff, then 1 to 3 steps + GBS::ADC_AUTO_OFST_TEST::write(1); + GBS::ADC_AUTO_OFST_RANGE_REG::write(0x00); // 5_0f U/V ranges = 0 (full range, 1 to 15) + + if (rto->inputIsYpBpR == true) { + applyYuvPatches(); + } + else { + applyRGBPatches(); + } + + if (rto->outModeHdBypass) { + GBS::OUT_SYNC_SEL::write(1); // 0_4f 1=sync from HDBypass, 2=sync from SP + rto->autoBestHtotalEnabled = false; + } + else { + rto->autoBestHtotalEnabled = true; + } + + rto->phaseADC = GBS::PA_ADC_S::read(); // we can't know which is right, get from preset + rto->phaseSP = 8; // get phase into global variables early: before latching + + if (rto->inputIsYpBpR) { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 14; + } + else { + rto->thisSourceMaxLevelSOG = rto->currentLevelSOG = 13; // similar to yuv, allow variations + } + + setAndUpdateSogLevel(rto->currentLevelSOG); + + if (!isCustomPreset) { + setAdcParametersGainAndOffset(); + } + + GBS::GPIO_CONTROL_00::write(0x67); // most GPIO pins regular GPIO + GBS::GPIO_CONTROL_01::write(0x00); // all GPIO outputs disabled + rto->clampPositionIsSet = 0; + rto->coastPositionIsSet = 0; + rto->phaseIsSet = 0; + rto->continousStableCounter = 0; + rto->noSyncCounter = 0; + rto->motionAdaptiveDeinterlaceActive = false; + rto->scanlinesEnabled = false; + rto->failRetryAttempts = 0; + rto->videoIsFrozen = true; // ensures unfreeze + rto->sourceDisconnected = false; // this must be true if we reached here (no syncwatcher operation) + rto->boardHasPower = true; //same + + if (rto->presetID == 0x06 || rto->presetID == 0x16) { + isCustomPreset = 0; // override so it applies section 2 deinterlacer settings + } + + if (!isCustomPreset) { + if (rto->videoStandardInput == 3 || rto->videoStandardInput == 4 || + rto->videoStandardInput == 8 || rto->videoStandardInput == 9) + { + GBS::IF_LD_RAM_BYPS::write(1); // 1_0c 0 no LD, do this before setIfHblankParameters + } + + //setIfHblankParameters(); // 1_0e, 1_18, 1_1a + GBS::IF_INI_ST::write(0); // 16.08.19: don't calculate, use fixed to 0 + // the following sets a field offset that eliminates 240p content forced to 480i flicker + //GBS::IF_INI_ST::write(GBS::PLLAD_MD::read() * 0.4261f); // upper: * 0.4282f lower: 0.424f + + GBS::IF_HS_INT_LPF_BYPS::write(0); // 1_02 2 + // 0 allows int/lpf for smoother scrolling with non-ideal scaling, also reduces jailbars and even noise + // interpolation or lpf available, lpf looks better + GBS::IF_HS_SEL_LPF::write(1); // 1_02 1 + GBS::IF_HS_PSHIFT_BYPS::write(1); // 1_02 3 nonlinear scale phase shift bypass + // 1_28 1 1:hbin generated write reset 0:line generated write reset + GBS::IF_LD_WRST_SEL::write(1); // at 1 fixes output position regardless of 1_24 + //GBS::MADPT_Y_DELAY_UV_DELAY::write(0); // 2_17 default: 0 // don't overwrite + + GBS::SP_RT_HS_ST::write(0); // 5_49 // retiming hs ST, SP + GBS::SP_RT_HS_SP::write(GBS::PLLAD_MD::read() * 0.93f); + + GBS::VDS_PK_LB_CORE::write(0); // 3_44 0-3 // 1 for anti source jailbars + GBS::VDS_PK_LH_CORE::write(0); // 3_46 0-3 // 1 for anti source jailbars + if (rto->presetID == 0x05 || rto->presetID == 0x15) { + GBS::VDS_PK_LB_GAIN::write(0x16); // 3_45 // peaking HF + GBS::VDS_PK_LH_GAIN::write(0x0A); // 3_47 + } + else { + GBS::VDS_PK_LB_GAIN::write(0x16); // 3_45 + GBS::VDS_PK_LH_GAIN::write(0x18); // 3_47 + } + GBS::VDS_PK_VL_HL_SEL::write(0); // 3_43 0 if 1 then 3_45 HF almost no effect (coring 0xf9) + GBS::VDS_PK_VL_HH_SEL::write(0); // 3_43 1 + + GBS::VDS_STEP_GAIN::write(1); // step response, max 15 (VDS_STEP_DLY_CNTRL set in presets) + + // DAC filters / keep in presets for now + //GBS::VDS_1ST_INT_BYPS::write(1); // disable RGB stage interpolator + //GBS::VDS_2ND_INT_BYPS::write(1); // disable YUV stage interpolator + + // most cases will use osr 2 + setOverSampleRatio(2, true); // prepare only = true + + // full height option + if (uopt->wantFullHeight) { + if (rto->videoStandardInput == 1 || rto->videoStandardInput == 3) { + //if (rto->presetID == 0x5) + //{ // out 1080p 60 + // GBS::VDS_DIS_VB_ST::write(GBS::VDS_VSYNC_RST::read() - 1); + // GBS::VDS_DIS_VB_SP::write(42); + // GBS::VDS_VB_SP::write(42 - 10); // is VDS_DIS_VB_SP - 10 = 32 // watch for vblank overflow (ps3) + // GBS::VDS_VSCALE::write(455); + // GBS::IF_VB_SP::write(GBS::IF_VB_SP::read() + 4); + // GBS::IF_VB_ST::write(GBS::IF_VB_ST::read() + 4); + // SerialM.println(F("full height")); + //} + } + else if (rto->videoStandardInput == 2 || rto->videoStandardInput == 4) { + if (rto->presetID == 0x15) + { // out 1080p 50 + GBS::VDS_VSCALE::write(455); + GBS::VDS_DIS_VB_ST::write(GBS::VDS_VSYNC_RST::read()); // full = 1125 of 1125 + GBS::VDS_DIS_VB_SP::write(42); + GBS::IF_VB_SP::write(GBS::IF_VB_SP::read() + 22); + GBS::IF_VB_ST::write(GBS::IF_VB_ST::read() + 22); + SerialM.println(F("full height")); + } + } + } + + if (rto->videoStandardInput == 1 || rto->videoStandardInput == 2) + { + //GBS::PLLAD_ICP::write(5); // 5 rather than 6 to work well with CVBS sync as well as CSync + + GBS::ADC_FLTR::write(3); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + GBS::PLLAD_KS::write(2); // 5_16 + setOverSampleRatio(4, true); // prepare only = true + GBS::IF_SEL_WEN::write(0); // 1_02 0; 0 for SD, 1 for EDTV + if (rto->inputIsYpBpR) { // todo: check other videoStandardInput in component vs rgb + GBS::IF_HS_TAP11_BYPS::write(0); // 1_02 4 Tap11 LPF bypass in YUV444to422 + GBS::IF_HS_Y_PDELAY::write(2); // 1_02 5+6 delays + GBS::VDS_V_DELAY::write(0); // 3_24 2 + GBS::VDS_Y_DELAY::write(3); // 3_24 4/5 delays + } + + // downscale preset: source is SD + if (rto->presetID == 0x06 || rto->presetID == 0x16) { + setCsVsStart(2); // or 3, 0 + setCsVsStop(0); // fixes field position + GBS::IF_VS_SEL::write(1); // 1_00 5 // turn off VHS sync feature + GBS::IF_VS_FLIP::write(0); // 1_01 0 + GBS::IF_LD_RAM_BYPS::write(0); // 1_0c 0 + GBS::IF_HS_DEC_FACTOR::write(1); // 1_0b 4 + GBS::IF_LD_SEL_PROV::write(0); // 1_0b 7 + GBS::IF_HB_ST::write(2); // 1_10 deinterlace offset + GBS::MADPT_Y_VSCALE_BYPS::write(0); // 2_02 6 + GBS::MADPT_UV_VSCALE_BYPS::write(0); // 2_02 7 + GBS::MADPT_PD_RAM_BYPS::write(0); // 2_24 2 one line fifo for line phase adjust + GBS::MADPT_VSCALE_DEC_FACTOR::write(1); // 2_31 0..1 + GBS::MADPT_SEL_PHASE_INI::write(0); // 2_31 2 disable for SD (check 240p content) + if (rto->videoStandardInput == 1) { + GBS::IF_HB_ST2::write(0x490); // 1_18 + GBS::IF_HB_SP2::write(0x80); // 1_1a + GBS::IF_HB_SP::write(0x4A); // 1_12 deinterlace offset, green bar + GBS::IF_HBIN_SP::write(0xD0); // 1_26 + } + else if (rto->videoStandardInput == 2) { + GBS::IF_HB_SP2::write(0x74); // 1_1a + GBS::IF_HB_SP::write(0x50); // 1_12 deinterlace offset, green bar + GBS::IF_HBIN_SP::write(0xD0); // 1_26 + } + } + } + if (rto->videoStandardInput == 3 || rto->videoStandardInput == 4 || + rto->videoStandardInput == 8 || rto->videoStandardInput == 9) + { + // EDTV p-scan, need to either double adc data rate and halve vds scaling + // or disable line doubler (better) (50 / 60Hz shared) + + GBS::ADC_FLTR::write(3); // 5_03 4/5 + GBS::PLLAD_KS::write(1); // 5_16 + + if (rto->presetID != 0x06 && rto->presetID != 0x16) { + setCsVsStart(14); // pal // hm + setCsVsStop(11); // probably setting these for modes 8,9 + GBS::IF_HB_SP::write(0); // 1_12 deinterlace offset, fixes colors (downscale needs diff) + } + setOverSampleRatio(2, true); // with KS = 1 for modes 3, 4, 8 + GBS::IF_HS_DEC_FACTOR::write(0); // 1_0b 4+5 + GBS::IF_LD_SEL_PROV::write(1); // 1_0b 7 + GBS::IF_PRGRSV_CNTRL::write(1); // 1_00 6 + GBS::IF_SEL_WEN::write(1); // 1_02 0 + GBS::IF_HS_SEL_LPF::write(0); // 1_02 1 0 = use interpolator not lpf for EDTV + GBS::IF_HS_TAP11_BYPS::write(0); // 1_02 4 filter + GBS::IF_HS_Y_PDELAY::write(3); // 1_02 5+6 delays (ps2 test on one board clearly says 3, not 2) + GBS::VDS_V_DELAY::write(1); // 3_24 2 // new 24.07.2019 : 1, also set 2_17 to 1 + GBS::MADPT_Y_DELAY_UV_DELAY::write(1); // 2_17 : 1 + GBS::VDS_Y_DELAY::write(3); // 3_24 4/5 delays (ps2 test saying 3 for 1_02 goes with 3 here) + if (rto->videoStandardInput == 9) { + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() > 650) { + delay(20); + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() > 650) { + GBS::PLLAD_KS::write(0); // 5_16 + GBS::VDS_VSCALE_BYPS::write(1); // 3_00 5 no vscale + } + } + } + + // downscale preset: source is EDTV + if (rto->presetID == 0x06 || rto->presetID == 0x16) { + GBS::MADPT_Y_VSCALE_BYPS::write(0); // 2_02 6 + GBS::MADPT_UV_VSCALE_BYPS::write(0); // 2_02 7 + GBS::MADPT_PD_RAM_BYPS::write(0); // 2_24 2 one line fifo for line phase adjust + GBS::MADPT_VSCALE_DEC_FACTOR::write(1); // 2_31 0..1 + GBS::MADPT_SEL_PHASE_INI::write(1); // 2_31 2 enable + GBS::MADPT_SEL_PHASE_INI::write(0); // 2_31 2 disable + } + } + if (rto->videoStandardInput == 3 && rto->presetID != 0x06) + { // ED YUV 60 + setCsVsStart(16); // ntsc + setCsVsStop(13); // + GBS::IF_HB_ST::write(30); // 1_10; magic number + GBS::IF_HBIN_ST::write(0x20); // 1_24 + GBS::IF_HBIN_SP::write(0x60); // 1_26 + if (rto->presetID == 0x5) + { // out 1080p + GBS::IF_HB_SP2::write(0xB0); // 1_1a + GBS::IF_HB_ST2::write(0x4BC); // 1_18 + } + else if (rto->presetID == 0x3) + { // out 720p + GBS::VDS_VSCALE::write(683); // same as base preset + GBS::IF_HB_ST2::write(0x478); // 1_18 + GBS::IF_HB_SP2::write(0x84); // 1_1a + } + else if (rto->presetID == 0x2) + { // out x1024 + GBS::IF_HB_SP2::write(0x84); // 1_1a + GBS::IF_HB_ST2::write(0x478); // 1_18 + } + else if (rto->presetID == 0x1) + { // out x960 + GBS::IF_HB_SP2::write(0x84); // 1_1a + GBS::IF_HB_ST2::write(0x478); // 1_18 + } + else if (rto->presetID == 0x4) + { // out x480 + GBS::IF_HB_ST2::write(0x478); // 1_18 + GBS::IF_HB_SP2::write(0x90); // 1_1a + } + } + else if (rto->videoStandardInput == 4 && rto->presetID != 0x16) + { // ED YUV 50 + GBS::IF_HBIN_SP::write(0x40); // 1_26 was 0x80 test: ps2 videomodetester 576p mode + GBS::IF_HBIN_ST::write(0x20); // 1_24, odd but need to set this here (blue bar) + GBS::IF_HB_ST::write(0x30); // 1_10 + if (rto->presetID == 0x15) + { // out 1080p + GBS::IF_HB_ST2::write(0x4C0); // 1_18 + GBS::IF_HB_SP2::write(0xC8); // 1_1a + } + else if (rto->presetID == 0x13) + { // out 720p + GBS::IF_HB_ST2::write(0x478); // 1_18 + GBS::IF_HB_SP2::write(0x88); // 1_1a + } + else if (rto->presetID == 0x12) + { // out x1024 + // VDS_VB_SP -= 12 used to shift pic up, but seems not necessary anymore + //GBS::VDS_VB_SP::write(GBS::VDS_VB_SP::read() - 12); + GBS::IF_HB_ST2::write(0x454); // 1_18 + GBS::IF_HB_SP2::write(0x88); // 1_1a + } + else if (rto->presetID == 0x11) + { // out x960 + GBS::IF_HB_ST2::write(0x454); // 1_18 + GBS::IF_HB_SP2::write(0x88); // 1_1a + } + else if (rto->presetID == 0x14) + { // out x576 + GBS::IF_HB_ST2::write(0x478); // 1_18 + GBS::IF_HB_SP2::write(0x90); // 1_1a + } + } + else if (rto->videoStandardInput == 5) + { // 720p + GBS::ADC_FLTR::write(1); // 5_03 + GBS::IF_PRGRSV_CNTRL::write(1); // progressive + GBS::IF_HS_DEC_FACTOR::write(0); + GBS::INPUT_FORMATTER_02::write(0x74); + GBS::VDS_Y_DELAY::write(3); + } + else if (rto->videoStandardInput == 6 || rto->videoStandardInput == 7) + { // 1080i/p + GBS::ADC_FLTR::write(1); // 5_03 + GBS::PLLAD_KS::write(0); // 5_16 + GBS::IF_PRGRSV_CNTRL::write(1); + GBS::IF_HS_DEC_FACTOR::write(0); + GBS::INPUT_FORMATTER_02::write(0x74); + GBS::VDS_Y_DELAY::write(3); + } + else if (rto->videoStandardInput == 8) + { // 25khz + // todo: this mode for HV sync + uint32_t pllRate = 0; + for (int i = 0; i < 8; i++) { + pllRate += getPllRate(); + } + pllRate /= 8; + SerialM.print(F("(H-PLL) rate: ")); SerialM.println(pllRate); + if (pllRate > 200) { // is PLL even working? + if (pllRate < 1800) { // rate very low? + GBS::PLLAD_FS::write(0); // then low gain + } + } + GBS::PLLAD_ICP::write(6); // all 25khz submodes have more lines than NTSC + GBS::ADC_FLTR::write(1); // 5_03 + GBS::IF_HB_ST::write(30); // 1_10; magic number + //GBS::IF_HB_ST2::write(0x60); // 1_18 + //GBS::IF_HB_SP2::write(0x88); // 1_1a + GBS::IF_HBIN_SP::write(0x60); // 1_26 works for all output presets + if (rto->presetID == 0x1) + { // out x960 + GBS::VDS_VSCALE::write(410); + } + else if (rto->presetID == 0x2) + { // out x1024 + GBS::VDS_VSCALE::write(402); + } + else if (rto->presetID == 0x3) + { // out 720p + GBS::VDS_VSCALE::write(546); + } + else if (rto->presetID == 0x5) + { // out 1080p + GBS::VDS_VSCALE::write(400); + } + } + } + + if (rto->presetID == 0x06 || rto->presetID == 0x16) { + isCustomPreset = GBS::GBS_PRESET_CUSTOM::read(); // override back + } + + resetDebugPort(); + + boolean avoidAutoBest = 0; + if (rto->syncTypeCsync) { + if (GBS::TEST_BUS_2F::read() == 0) { + delay(4); + if (GBS::TEST_BUS_2F::read() == 0) { + optimizeSogLevel(); + avoidAutoBest = 1; + delay(4); + } + } + } + + latchPLLAD(); // besthtotal reliable with this (EDTV modes, possibly others) + + if (isCustomPreset) { + // patch in segments not covered in custom preset files (currently seg 2) + if (rto->videoStandardInput == 3 || rto->videoStandardInput == 4 || rto->videoStandardInput == 8) + { + GBS::MADPT_Y_DELAY_UV_DELAY::write(1); // 2_17 : 1 + } + + // get OSR + if (GBS::DEC1_BYPS::read() && GBS::DEC2_BYPS::read()) { rto->osr = 1; } + else if (GBS::DEC1_BYPS::read() && !GBS::DEC2_BYPS::read()) { rto->osr = 2; } + else { rto->osr = 4; } + + // always start with internal clock active first + if (GBS::PLL648_CONTROL_01::read() == 0x75 && GBS::GBS_PRESET_DISPLAY_CLOCK::read() != 0) { + GBS::PLL648_CONTROL_01::write(GBS::GBS_PRESET_DISPLAY_CLOCK::read()); + } + else if (GBS::GBS_PRESET_DISPLAY_CLOCK::read() == 0) { + SerialM.println(F("no stored display clock to use!")); + } + } + + if (rto->presetIsPalForce60) { + if (GBS::GBS_OPTION_PALFORCED60_ENABLED::read() != 1) { + SerialM.println(F("pal forced 60hz: apply vshift")); + uint16_t vshift = 56; // default shift + if (rto->presetID == 0x5) { GBS::IF_VB_SP::write(4); } // out 1080p + else { + GBS::IF_VB_SP::write(GBS::IF_VB_SP::read() + vshift); + } + GBS::IF_VB_ST::write(GBS::IF_VB_SP::read() - 2); + GBS::GBS_OPTION_PALFORCED60_ENABLED::write(1); + } + } + + //freezeVideo(); + + GBS::ADC_TEST_04::write(0x02); // 5_04 + GBS::ADC_TEST_0C::write(0x12); // 5_0c 1 4 + GBS::ADC_TA_05_CTRL::write(0x02); // 5_05 + + // auto ADC gain + if (uopt->enableAutoGain == 1 && adco->r_gain == 0) { + //SerialM.println(F("ADC gain: reset")); + GBS::ADC_RGCTRL::write(0x48); + GBS::ADC_GGCTRL::write(0x48); + GBS::ADC_BGCTRL::write(0x48); + GBS::DEC_TEST_ENABLE::write(1); + } + else if (uopt->enableAutoGain == 1 && adco->r_gain != 0) { + GBS::ADC_RGCTRL::write(adco->r_gain); + GBS::ADC_GGCTRL::write(adco->g_gain); + GBS::ADC_BGCTRL::write(adco->b_gain); + GBS::DEC_TEST_ENABLE::write(1); + } + else { + GBS::DEC_TEST_ENABLE::write(0); // no need for decimation test to be enabled + } + + // ADC offset if measured + if (adco->r_off != 0 && adco->g_off != 0 && adco->b_off != 0) { + GBS::ADC_ROFCTRL::write(adco->r_off); + GBS::ADC_GOFCTRL::write(adco->g_off); + GBS::ADC_BOFCTRL::write(adco->b_off); + } + + SerialM.print(F("ADC offset: R:")); SerialM.print(GBS::ADC_ROFCTRL::read(), HEX); + SerialM.print(" G:"); SerialM.print(GBS::ADC_GOFCTRL::read(), HEX); + SerialM.print(" B:"); SerialM.println(GBS::ADC_BOFCTRL::read(), HEX); + + GBS::IF_AUTO_OFST_U_RANGE::write(0); // 0 seems to be full range, else 1 to 15 + GBS::IF_AUTO_OFST_V_RANGE::write(0); // 0 seems to be full range, else 1 to 15 + GBS::IF_AUTO_OFST_PRD::write(0); // 0 = by line, 1 = by frame ; by line is easier to spot + GBS::IF_AUTO_OFST_EN::write(0); // not reliable yet + // to get it working with RGB: + // leave RGB to YUV at the ADC DEC stage (s5_1f 2 = 0) + // s5s07s42, 1_2a to 0, s5_06 + s5_08 to 0x40 + // 5_06 + 5_08 will be the target center value, 5_07 sets general offset + // s3s3as00 s3s3bs00 s3s3cs00 + + if (uopt->wantVdsLineFilter) { GBS::VDS_D_RAM_BYPS::write(0); } + else { GBS::VDS_D_RAM_BYPS::write(1); } + + if (uopt->wantPeaking) { GBS::VDS_PK_Y_H_BYPS::write(0); } + else { GBS::VDS_PK_Y_H_BYPS::write(1); } + + // unused now + GBS::VDS_TAP6_BYPS::write(0); + /*if (uopt->wantTap6) { GBS::VDS_TAP6_BYPS::write(0); } + else { + GBS::VDS_TAP6_BYPS::write(1); + if (!isCustomPreset) { + GBS::MADPT_Y_DELAY_UV_DELAY::write(GBS::MADPT_Y_DELAY_UV_DELAY::read() + 1); + } + }*/ + + if (uopt->wantStepResponse) { + // step response requested, but exclude 1080p presets + if (rto->presetID != 0x05 && rto->presetID != 0x15) { + GBS::VDS_UV_STEP_BYPS::write(0); + } + else { + GBS::VDS_UV_STEP_BYPS::write(1); + } + } + else { + GBS::VDS_UV_STEP_BYPS::write(1); + } + + // transfer preset's display clock to ext. gen + externalClockGenResetClock(); + + //unfreezeVideo(); + Menu::init(); + FrameSync::cleanup(); + rto->syncLockFailIgnore = 16; + + // undo eventual rto->useHdmiSyncFix (not using this method atm) + GBS::VDS_SYNC_EN::write(0); + GBS::VDS_FLOCK_EN::write(0); + + if (!rto->outModeHdBypass && rto->autoBestHtotalEnabled && + GBS::GBS_OPTION_SCALING_RGBHV::read() == 0 && !avoidAutoBest && + (rto->videoStandardInput >= 1 && rto->videoStandardInput <= 4)) + { + // autobesthtotal + updateCoastPosition(0); + delay(1); + resetInterruptNoHsyncBadBit(); resetInterruptSogBadBit(); + delay(10); + // works reliably now on my test HDMI dongle + if (rto->useHdmiSyncFix && !uopt->wantOutputComponent) { + GBS::PAD_SYNC_OUT_ENZ::write(0); // sync out + } + delay(70); // minimum delay without random failures: TBD + + for (uint8_t i = 0; i < 4; i++) { + if (GBS::STATUS_INT_SOG_BAD::read() == 1) { + optimizeSogLevel(); + resetInterruptSogBadBit(); + delay(40); + } + else if (getStatus16SpHsStable() && getStatus16SpHsStable()) { + delay(1); // wifi + if (getVideoMode() == rto->videoStandardInput) { + boolean ok = 0; + float sfr = getSourceFieldRate(0); + //Serial.println(sfr, 3); + if (rto->videoStandardInput == 1 || rto->videoStandardInput == 3) { + if (sfr > 58.6f && sfr < 61.4f) ok = 1; + } + else if (rto->videoStandardInput == 2 || rto->videoStandardInput == 4) { + if (sfr > 49.1f && sfr < 51.1f) ok = 1; + } + if (ok) { // else leave it for later + runAutoBestHTotal(); + delay(1); // wifi + break; + } + } + } + delay(10); + } + } + else { + // scaling rgbhv, HD modes, no autobesthtotal + delay(10); + // works reliably now on my test HDMI dongle + if (rto->useHdmiSyncFix && !uopt->wantOutputComponent) { + GBS::PAD_SYNC_OUT_ENZ::write(0); // sync out + } + delay(20); + updateCoastPosition(0); + updateClampPosition(); + } + + //SerialM.print("pp time: "); SerialM.println(millis() - postLoadTimer); + + // make sure + if (rto->useHdmiSyncFix && !uopt->wantOutputComponent) { + GBS::PAD_SYNC_OUT_ENZ::write(0); // sync out + } + + // late adjustments that require some delay time first + if (!isCustomPreset) { + if (videoStandardInputIsPalNtscSd() && !rto->outModeHdBypass) { + // SNES has less total lines and a slight offset (only relevant in 60Hz) + if (GBS::VPERIOD_IF::read() == 523) { + GBS::IF_VB_SP::write(GBS::IF_VB_SP::read() + 4); + GBS::IF_VB_ST::write(GBS::IF_VB_ST::read() + 4); + } + } + } + + // new, might be useful (3_6D - 3_72) + GBS::VDS_EXT_HB_ST::write(GBS::VDS_DIS_HB_ST::read()); + GBS::VDS_EXT_HB_SP::write(GBS::VDS_DIS_HB_SP::read()); + GBS::VDS_EXT_VB_ST::write(GBS::VDS_DIS_VB_ST::read()); + GBS::VDS_EXT_VB_SP::write(GBS::VDS_DIS_VB_SP::read()); + // VDS_VSYN_SIZE1 + VDS_VSYN_SIZE2 to VDS_VSYNC_RST + 2 + GBS::VDS_VSYN_SIZE1::write(GBS::VDS_VSYNC_RST::read() + 2); + GBS::VDS_VSYN_SIZE2::write(GBS::VDS_VSYNC_RST::read() + 2); + GBS::VDS_FRAME_RST::write(4); // 3_19 + // VDS_FRAME_NO, VDS_FR_SELECT + GBS::VDS_FRAME_NO::write(1); // 3_1f 0-3 + GBS::VDS_FR_SELECT::write(1); // 3_1b, 3_1c, 3_1d, 3_1e + + // noise starts here! + resetDigital(); + + resetPLLAD(); // also turns on pllad + GBS::PLLAD_LEN::write(1); // 5_11 1 + + if (!isCustomPreset) { + GBS::VDS_IN_DREG_BYPS::write(0); // 3_40 2 // 0 = input data triggered on falling clock edge, 1 = bypass + GBS::PLLAD_R::write(3); + GBS::PLLAD_S::write(3); + GBS::PLL_R::write(1); // PLL lock detector skew + GBS::PLL_S::write(2); + GBS::DEC_IDREG_EN::write(1); // 5_1f 7 + GBS::DEC_WEN_MODE::write(1); // 5_1e 7 // 1 keeps ADC phase consistent. around 4 lock positions vs totally random + + // 4 segment + GBS::CAP_SAFE_GUARD_EN::write(0); // 4_21_5 // does more harm than good + // memory timings, anti noise + GBS::PB_CUT_REFRESH::write(1); // helps with PLL=ICLK mode artefacting + GBS::RFF_LREQ_CUT::write(0); // was in motionadaptive toggle function but on, off seems nicer + GBS::CAP_REQ_OVER::write(0); // 4_22 0 1=capture stop at hblank 0=free run + GBS::CAP_STATUS_SEL::write(1); // 4_22 1 1=capture request when FIFO 50%, 0= FIFO 100% + GBS::PB_REQ_SEL::write(3); // PlayBack 11 High request Low request + // 4_2C, 4_2D should be set by preset + GBS::RFF_WFF_OFFSET::write(0x0); // scanline fix + if (rto->videoStandardInput == 3 || rto->videoStandardInput == 4) { + // this also handles mode 14 csync rgbhv + GBS::PB_CAP_OFFSET::write(GBS::PB_FETCH_NUM::read() + 4); // 4_37 to 4_39 (green bar) + } + // 4_12 should be set by preset + } + + if (!rto->outModeHdBypass) { + ResetSDRAM(); + } + + setAndUpdateSogLevel(rto->currentLevelSOG); // use this to cycle SP / ADPLL latches + + if (rto->presetID != 0x06 && rto->presetID != 0x16) { + // IF_VS_SEL = 1 for SD/HD SP mode in HD mode (5_3e 1) + GBS::IF_VS_SEL::write(0); // 0 = "VCR" IF sync, requires VS_FLIP to be on, more stable? + GBS::IF_VS_FLIP::write(1); + } + + GBS::SP_CLP_SRC_SEL::write(0); // 0: 27Mhz clock; 1: pixel clock + GBS::SP_CS_CLP_ST::write(32); GBS::SP_CS_CLP_SP::write(48); // same as reset parameters + + if (!uopt->wantOutputComponent) { + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out if needed + } + GBS::DAC_RGBS_PWDNZ::write(1); // DAC on if needed + GBS::DAC_RGBS_SPD::write(0); // 0_45 2 DAC_SVM power down disable, somehow less jailbars + GBS::DAC_RGBS_S0ENZ::write(0); // + GBS::DAC_RGBS_S1EN::write(1); // these 2 also help + + rto->useHdmiSyncFix = 0; // reset flag + + GBS::SP_H_PROTECT::write(0); + if (rto->videoStandardInput >= 5) { + GBS::SP_DIS_SUB_COAST::write(1); // might not disable it at all soon + } + + if (rto->syncTypeCsync) { + GBS::SP_EXT_SYNC_SEL::write(1); // 5_20 3 disconnect HV input + // stays disconnected until reset condition + } + + rto->coastPositionIsSet = false; // re-arm these + rto->clampPositionIsSet = false; + + if (rto->outModeHdBypass) { + GBS::INTERRUPT_CONTROL_01::write(0xff); // enable interrupts + GBS::INTERRUPT_CONTROL_00::write(0xff); // reset irq status + GBS::INTERRUPT_CONTROL_00::write(0x00); + unfreezeVideo(); // eventhough not used atm + // DAC and Sync out will be enabled later + return; // to setOutModeHdBypass(); + } + + if (GBS::GBS_OPTION_SCALING_RGBHV::read() == 1) { + rto->videoStandardInput = 14; + } + + if (GBS::GBS_OPTION_SCALING_RGBHV::read() == 0) { + unsigned long timeout = millis(); + while ((!getStatus16SpHsStable()) && (millis() - timeout < 2002)) { delay(4); handleWiFi(0); updateSpDynamic(0); } + while ((getVideoMode() == 0) && (millis() - timeout < 1505)) { delay(4); handleWiFi(0); updateSpDynamic(0); } + + timeout = millis() - timeout; + if (timeout > 1000) { + Serial.print(F("to1 is: ")); + Serial.println(timeout); + } + if (timeout >= 1500) { + if (rto->currentLevelSOG >= 7) { + optimizeSogLevel(); + delay(300); + } + } + } + + // early attempt + updateClampPosition(); + if (rto->clampPositionIsSet) { + if (GBS::SP_NO_CLAMP_REG::read() == 1) { + GBS::SP_NO_CLAMP_REG::write(0); + } + } + + updateSpDynamic(0); + + if (!rto->syncWatcherEnabled) { + GBS::SP_NO_CLAMP_REG::write(0); + } + + // this was used with ADC write enable, producing about (exactly?) 4 lock positions + // cycling through the phase let it land favorably + //for (uint8_t i = 0; i < 8; i++) { + // advancePhase(); + //} + + setAndUpdateSogLevel(rto->currentLevelSOG); // use this to cycle SP / ADPLL latches + //optimizePhaseSP(); // do this later in run loop + + GBS::INTERRUPT_CONTROL_01::write(0xff); // enable interrupts + GBS::INTERRUPT_CONTROL_00::write(0xff); // reset irq status + GBS::INTERRUPT_CONTROL_00::write(0x00); + + OutputComponentOrVGA(); + + // presetPreference 10 means the user prefers bypass mode at startup + // it's best to run a normal format detect > apply preset loop, then enter bypass mode + // this can lead to an endless loop, so applyPresetDoneStage = 10 applyPresetDoneStage = 11 + // are introduced to break out of it. + // also need to check for mode 15 + // also make sure to turn off autoBestHtotal + if (uopt->presetPreference == 10 && rto->videoStandardInput != 15) + { + rto->autoBestHtotalEnabled = 0; + if (rto->applyPresetDoneStage == 11) { + // we were here before, stop the loop + rto->applyPresetDoneStage = 1; + } + else { + rto->applyPresetDoneStage = 10; + } + } + else { + // normal modes + rto->applyPresetDoneStage = 1; + } + + unfreezeVideo(); + + if (uopt->enableFrameTimeLock) { + activeFrameTimeLockInitialSteps(); + } + + SerialM.print(F("\npreset applied: ")); + if (rto->presetID == 0x01 || rto->presetID == 0x11) SerialM.print(F("1280x960")); + else if (rto->presetID == 0x02 || rto->presetID == 0x12) SerialM.print(F("1280x1024")); + else if (rto->presetID == 0x03 || rto->presetID == 0x13) SerialM.print(F("1280x720")); + else if (rto->presetID == 0x05 || rto->presetID == 0x15) SerialM.print(F("1920x1080")); + else if (rto->presetID == 0x06 || rto->presetID == 0x16) SerialM.print(F("downscale")); + else if (rto->presetID == 0x04 ) SerialM.print(F("720x480")); + else if (rto->presetID == 0x14 ) SerialM.print(F("768x576")); + else SerialM.print(F("bypass")); + + if (isCustomPreset) { + rto->presetID = 9; // overwrite to "custom" after printing original id (for webui) + } + if (rto->outModeHdBypass) + { + SerialM.print(F(" (bypass)")); + } + else if (isCustomPreset) { + SerialM.print(F(" (custom)")); + } + + SerialM.print(F(" for ")); + if (rto->videoStandardInput == 1) SerialM.print(F("NTSC 60Hz ")); + else if (rto->videoStandardInput == 2) SerialM.print(F("PAL 50Hz ")); + else if (rto->videoStandardInput == 3) SerialM.print(F("EDTV 60Hz")); + else if (rto->videoStandardInput == 4) SerialM.print(F("EDTV 50Hz")); + else if (rto->videoStandardInput == 5) SerialM.print(F("720p 60Hz HDTV ")); + else if (rto->videoStandardInput == 6) SerialM.print(F("1080i 60Hz HDTV ")); + else if (rto->videoStandardInput == 7) SerialM.print(F("1080p 60Hz HDTV ")); + else if (rto->videoStandardInput == 8) SerialM.print(F("Medium Res ")); + else if (rto->videoStandardInput == 13) SerialM.print(F("VGA/SVGA/XGA/SXGA")); + else if (rto->videoStandardInput == 14) { + if (rto->syncTypeCsync) SerialM.print(F("scaling RGB (CSync)")); + else SerialM.print(F("scaling RGB (HV Sync)")); + } + else if (rto->videoStandardInput == 15) { + if (rto->syncTypeCsync) SerialM.print(F("RGB Bypass (CSync)")); + else SerialM.print(F("RGB Bypass (HV Sync)")); + } + else if (rto->videoStandardInput == 0) SerialM.print(F("!should not go here!")); + + if (rto->presetID == 0x05 || rto->presetID == 0x15) { + SerialM.print(F("(set your TV aspect ratio to 16:9!)")); + } + if (rto->videoStandardInput == 14) { + SerialM.print(F("\nNote: scaling RGB is still in development")); + } + // presetPreference = 2 may fail to load (missing) preset file and arrive here with defaults + SerialM.println("\n"); +} + +void applyPresets(uint8_t result) { + if (!rto->boardHasPower) { + SerialM.println(F("GBS board not responding!")); + return; + } + + // if RGBHV scaling and invoked through web ui or custom preset + // need to know syncTypeCsync + if (result == 14) { + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 1) { + rto->inputIsYpBpR = 0; + if (GBS::STATUS_SYNC_PROC_VSACT::read() == 0) { + rto->syncTypeCsync = 1; + } + else { + rto->syncTypeCsync = 0; + } + } + } + + boolean waitExtra = 0; + if (rto->outModeHdBypass || rto->videoStandardInput == 15 || rto->videoStandardInput == 0) { + waitExtra = 1; + if (result <= 4 || result == 14 || result == 8 || result == 9) { + GBS::SFTRST_IF_RSTZ::write(1); // early init + GBS::SFTRST_VDS_RSTZ::write(1); + GBS::SFTRST_DEC_RSTZ::write(1); + } + } + rto->presetIsPalForce60 = 0; // the default + rto->outModeHdBypass = 0; // the default at this stage + GBS::GBS_PRESET_CUSTOM::write(0); // in case it is set; will get set appropriately later + + // carry over debug view if possible + if (GBS::ADC_UNUSED_62::read() != 0x00) { + // only if the preset to load isn't custom + // (else the command will instantly disable debug view) + if (uopt->presetPreference != 2) { + typeOneCommand = 'D'; + } + } + + if (result == 0) { + SerialM.println(F("Source format not properly recognized, using fallback preset!")); + result = 3; // in case of success: override to 480p60 + GBS::ADC_INPUT_SEL::write(1); // RGB + delay(100); + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 1) { + rto->inputIsYpBpR = 0; + rto->syncWatcherEnabled = 1; + if (GBS::STATUS_SYNC_PROC_VSACT::read() == 0) { + rto->syncTypeCsync = 1; + } + else { + rto->syncTypeCsync = 0; + } + } + else { + GBS::ADC_INPUT_SEL::write(0); // YPbPr + delay(100); + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 1) { + rto->inputIsYpBpR = 1; + rto->syncTypeCsync = 1; + rto->syncWatcherEnabled = 1; + } + else { + // found nothing at all, switch to RGB input and turn off syncwatcher + GBS::ADC_INPUT_SEL::write(1); // RGB + writeProgramArrayNew(ntsc_240p, false); + rto->videoStandardInput = 3; // override to 480p60 + doPostPresetLoadSteps(); + GBS::SP_CLAMP_MANUAL::write(1); + rto->syncWatcherEnabled = 0; + rto->videoStandardInput = 0; + typeOneCommand = 'D'; // enable debug view + + return; + } + } + } + + if (uopt->PalForce60 == 1) { + if (uopt->presetPreference != 2) { // != custom. custom saved as pal preset has ntsc customization + if (result == 2 || result == 4) { Serial.println(F("PAL@50 to 60Hz")); rto->presetIsPalForce60 = 1; } + if (result == 2) { result = 1; } + if (result == 4) { result = 3; } + } + } + + if (result == 1 || result == 3 || result == 8 || result == 9 || result == 14) { + if (uopt->presetPreference == 0) { + writeProgramArrayNew(ntsc_240p, false); + } + else if (uopt->presetPreference == 1) { + writeProgramArrayNew(ntsc_720x480, false); + } + else if (uopt->presetPreference == 3) { + writeProgramArrayNew(ntsc_1280x720, false); + } +#if defined(ESP8266) + else if (uopt->presetPreference == 2) { + const uint8_t* preset = loadPresetFromSPIFFS(result); + writeProgramArrayNew(preset, false); + } + else if (uopt->presetPreference == 4) { + if (uopt->matchPresetSource && (result != 8) && (GBS::GBS_OPTION_SCALING_RGBHV::read() == 0)) { + SerialM.println(F("matched preset override > 1280x960")); + writeProgramArrayNew(ntsc_240p, false); // pref = x1024 override to x960 + } + else { + writeProgramArrayNew(ntsc_1280x1024, false); + } + } +#endif + else if (uopt->presetPreference == 5) { + writeProgramArrayNew(ntsc_1920x1080, false); + } + else if (uopt->presetPreference == 6) { + writeProgramArrayNew(ntsc_downscale, false); + } + } + else if (result == 2 || result == 4) { + if (uopt->presetPreference == 0) { + if (uopt->matchPresetSource) { + SerialM.println(F("matched preset override > 1280x1024")); + writeProgramArrayNew(pal_1280x1024, false); // pref = x960 override to x1024 + } + else { + writeProgramArrayNew(pal_240p, false); + } + } + else if (uopt->presetPreference == 1) { + writeProgramArrayNew(pal_768x576, false); + } + else if (uopt->presetPreference == 3) { + writeProgramArrayNew(pal_1280x720, false); + } +#if defined(ESP8266) + else if (uopt->presetPreference == 2) { + const uint8_t* preset = loadPresetFromSPIFFS(result); + writeProgramArrayNew(preset, false); + } + else if (uopt->presetPreference == 4) { + writeProgramArrayNew(pal_1280x1024, false); + } +#endif + else if (uopt->presetPreference == 5) { + writeProgramArrayNew(pal_1920x1080, false); + } + else if (uopt->presetPreference == 6) { + writeProgramArrayNew(pal_downscale, false); + } + } + else if (result == 5 || result == 6 || result == 7 || result == 13) { + // use bypass mode for these HD sources + rto->videoStandardInput = result; + setOutModeHdBypass(); + return; + } + else if (result == 15) { + SerialM.print(F("RGB/HV ")); + if (rto->syncTypeCsync) { SerialM.print(F("(CSync) ")); } + //if (uopt->preferScalingRgbhv) { + // SerialM.print("(prefer scaling mode)"); + //} + SerialM.println(); + bypassModeSwitch_RGBHV(); + // don't go through doPostPresetLoadSteps + return; + } + + // get auto gain prefs + if (uopt->presetPreference == 2 && uopt->enableAutoGain) { + adco->r_gain = GBS::ADC_RGCTRL::read(); + adco->g_gain = GBS::ADC_GGCTRL::read(); + adco->b_gain = GBS::ADC_BGCTRL::read(); + } + + rto->videoStandardInput = result; + if (waitExtra) { + // extra time needed for digital resets, so that autobesthtotal works first attempt + //Serial.println("waitExtra 400ms"); + delay(400); // min ~ 300 + } + doPostPresetLoadSteps(); +} + +void unfreezeVideo() { + /*if (rto->videoIsFrozen == true) { + GBS::IF_VB_ST::write(GBS::IF_VB_SP::read() - 2); + } + rto->videoIsFrozen = false;*/ + //Serial.print("u"); + GBS::CAPTURE_ENABLE::write(1); +} + +void freezeVideo() { + /*if (rto->videoIsFrozen == false) { + GBS::IF_VB_ST::write(GBS::IF_VB_SP::read()); + } + rto->videoIsFrozen = true;*/ + //Serial.print("f"); + GBS::CAPTURE_ENABLE::write(0); +} + +static uint8_t getVideoMode() { + uint8_t detectedMode = 0; + + if (rto->videoStandardInput >= 14) { // check RGBHV first // not mode 13 here, else mode 13 can't reliably exit + detectedMode = GBS::STATUS_16::read(); + if ((detectedMode & 0x0a) > 0) { // bit 1 or 3 active? + return rto->videoStandardInput; // still RGBHV bypass, 14 or 15 + } + else { + return 0; + } + } + + detectedMode = GBS::STATUS_00::read(); + + // note: if stat0 == 0x07, it's supposedly stable. if we then can't find a mode, it must be an MD problem + if ((detectedMode & 0x07) == 0x07) + { + if ((detectedMode & 0x80) == 0x80) { // bit 7: SD flag (480i, 480P, 576i, 576P) + if ((detectedMode & 0x08) == 0x08) return 1; // ntsc interlace + if ((detectedMode & 0x20) == 0x20) return 2; // pal interlace + if ((detectedMode & 0x10) == 0x10) return 3; // edtv 60 progressive + if ((detectedMode & 0x40) == 0x40) return 4; // edtv 50 progressive + } + + detectedMode = GBS::STATUS_03::read(); + if ((detectedMode & 0x10) == 0x10) { return 5; } // hdtv 720p + + if (rto->videoStandardInput == 4) { + detectedMode = GBS::STATUS_04::read(); + if ((detectedMode & 0xFF) == 0x80) { + return 4; // still edtv 50 progressive + } + } + } + + detectedMode = GBS::STATUS_04::read(); + if ((detectedMode & 0x20) == 0x20) { // hd mode on + if ((detectedMode & 0x61) == 0x61) { + // hdtv 1080i // 576p mode tends to get misdetected as this, even with all the checks + // real 1080i (PS2): h:199 v:1124 + // misdetected 576p (PS2): h:215 v:1249 + if (GBS::VPERIOD_IF::read() < 1160) { + return 6; + } + } + if ((detectedMode & 0x10) == 0x10) { + if ((detectedMode & 0x04) == 0x04) { // normally HD2376_1250P (PAL FHD?), but using this for 24k + return 8; + } + return 7; // hdtv 1080p + } + } + + // graphic modes, mostly used for ps2 doing rgb over yuv with sog + if ((GBS::STATUS_05::read() & 0x0c) == 0x00) // 2: Horizontal unstable AND 3: Vertical unstable are 0? + { + if (GBS::STATUS_00::read() == 0x07) { // the 3 stat0 stable indicators on, none of the SD indicators on + if ((GBS::STATUS_03::read() & 0x02) == 0x02) // Graphic mode bit on (any of VGA/SVGA/XGA/SXGA at all detected Hz) + { + if (rto->inputIsYpBpR) return 13; + else return 15; // switch to RGBS/HV handling + } + else { + // this mode looks like it wants to be graphic mode, but the horizontal counter target in MD is very strict + static uint8_t XGA_60HZ = GBS::MD_XGA_60HZ_CNTRL::read(); + static uint8_t XGA_70HZ = GBS::MD_XGA_70HZ_CNTRL::read(); + static uint8_t XGA_75HZ = GBS::MD_XGA_75HZ_CNTRL::read(); + static uint8_t XGA_85HZ = GBS::MD_XGA_85HZ_CNTRL::read(); + + static uint8_t SXGA_60HZ = GBS::MD_SXGA_60HZ_CNTRL::read(); + static uint8_t SXGA_75HZ = GBS::MD_SXGA_75HZ_CNTRL::read(); + static uint8_t SXGA_85HZ = GBS::MD_SXGA_85HZ_CNTRL::read(); + + static uint8_t SVGA_60HZ = GBS::MD_SVGA_60HZ_CNTRL::read(); + static uint8_t SVGA_75HZ = GBS::MD_SVGA_75HZ_CNTRL::read(); + static uint8_t SVGA_85HZ = GBS::MD_SVGA_85HZ_CNTRL::read(); + + static uint8_t VGA_75HZ = GBS::MD_VGA_75HZ_CNTRL::read(); + static uint8_t VGA_85HZ = GBS::MD_VGA_85HZ_CNTRL::read(); + + short hSkew = random(-2, 2); // skew the target a little + //Serial.println(XGA_60HZ + hSkew, HEX); + GBS::MD_XGA_60HZ_CNTRL::write(XGA_60HZ + hSkew); + GBS::MD_XGA_70HZ_CNTRL::write(XGA_70HZ + hSkew); + GBS::MD_XGA_75HZ_CNTRL::write(XGA_75HZ + hSkew); + GBS::MD_XGA_85HZ_CNTRL::write(XGA_85HZ + hSkew); + GBS::MD_SXGA_60HZ_CNTRL::write(SXGA_60HZ + hSkew); + GBS::MD_SXGA_75HZ_CNTRL::write(SXGA_75HZ + hSkew); + GBS::MD_SXGA_85HZ_CNTRL::write(SXGA_85HZ + hSkew); + GBS::MD_SVGA_60HZ_CNTRL::write(SVGA_60HZ + hSkew); + GBS::MD_SVGA_75HZ_CNTRL::write(SVGA_75HZ + hSkew); + GBS::MD_SVGA_85HZ_CNTRL::write(SVGA_85HZ + hSkew); + GBS::MD_VGA_75HZ_CNTRL::write(VGA_75HZ + hSkew); + GBS::MD_VGA_85HZ_CNTRL::write(VGA_85HZ + hSkew); + } + } + } + + detectedMode = GBS::STATUS_00::read(); + if ((detectedMode & 0x2F) == 0x07) { // 0_00 H+V stable, not NTSCI, not PALI + detectedMode = GBS::STATUS_16::read(); + if ((detectedMode & 0x02) == 0x02) { // SP H active + uint16_t lineCount = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + for (uint8_t i = 0; i < 2; i++) { + delay(2); + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() < (lineCount - 1) || + GBS::STATUS_SYNC_PROC_VTOTAL::read() > (lineCount + 1)) + { + lineCount = 0; + rto->notRecognizedCounter = 0; + break; + } + detectedMode = GBS::STATUS_00::read(); + if ((detectedMode & 0x2F) != 0x07) { + lineCount = 0; + rto->notRecognizedCounter = 0; + break; + } + } + if (lineCount != 0 && rto->notRecognizedCounter < 255) { + rto->notRecognizedCounter++; + } + } + else { + rto->notRecognizedCounter = 0; + } + } + else { + rto->notRecognizedCounter = 0; + } + + if (rto->notRecognizedCounter == 255) { + return 9; + } + + return 0; // unknown mode +} + +// if testbus has 0x05, sync is present and line counting active. if it has 0x04, sync is present but no line counting +boolean getSyncPresent() { + uint8_t debug_backup = GBS::TEST_BUS_SEL::read(); + uint8_t debug_backup_SP = GBS::TEST_BUS_SP_SEL::read(); + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(0xa); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(0x0f); + } + + uint16_t readout = GBS::TEST_BUS::read(); + + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(debug_backup); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(debug_backup_SP); + } + //if (((readout & 0x0500) == 0x0500) || ((readout & 0x0500) == 0x0400)) { + if (readout > 0x0180) { + return true; + } + + return false; +} + +// returns 0_00 bit 2 = H+V both stable (for the IF, not SP) +boolean getStatus00IfHsVsStable() { + return ((GBS::STATUS_00::read() & 0x04) == 0x04) ? 1 : 0; +} + +// used to be a check for the length of the debug bus readout of 5_63 = 0x0f +// now just checks the chip status at 0_16 HS active (and Interrupt bit4 HS active for RGBHV) +boolean getStatus16SpHsStable() { + if (rto->videoStandardInput == 15) { // check RGBHV first + if (GBS::STATUS_INT_INP_NO_SYNC::read() == 0) { + return true; + } + else { + resetInterruptNoHsyncBadBit(); + return false; + } + } + + // STAT_16 bit 1 is the "hsync active" flag, which appears to be a reliable indicator + // checking the flag replaces checking the debug bus pulse length manually + uint8_t status16 = GBS::STATUS_16::read(); + if ((status16 & 0x02) == 0x02) + { + if (rto->videoStandardInput == 1 || rto->videoStandardInput == 2) + { + if ((status16 & 0x01) != 0x01) + { // pal / ntsc should be sync active low + return true; + } + } + else + { + return true; // not pal / ntsc + } + } + + return false; +} + +void setOverSampleRatio(uint8_t newRatio, boolean prepareOnly) { + uint8_t ks = GBS::PLLAD_KS::read(); + + switch (newRatio) { + case 1: + if (ks == 0) GBS::PLLAD_CKOS::write(0); + if (ks == 1) GBS::PLLAD_CKOS::write(1); + if (ks == 2) GBS::PLLAD_CKOS::write(2); + if (ks == 3) GBS::PLLAD_CKOS::write(3); + GBS::ADC_CLK_ICLK2X::write(0); + GBS::ADC_CLK_ICLK1X::write(0); + GBS::DEC1_BYPS::write(1); // dec1 couples to ADC_CLK_ICLK2X + GBS::DEC2_BYPS::write(1); + + if (rto->videoStandardInput == 8 || rto->videoStandardInput == 4 || rto->videoStandardInput == 3) { + GBS::ADC_CLK_ICLK1X::write(1); + //GBS::DEC2_BYPS::write(0); + } + + rto->osr = 1; + //if (!prepareOnly) SerialM.println("OSR 1x"); + + break; + case 2: + if (ks == 0) { setOverSampleRatio(1, false); return; } // 2x impossible + if (ks == 1) GBS::PLLAD_CKOS::write(0); + if (ks == 2) GBS::PLLAD_CKOS::write(1); + if (ks == 3) GBS::PLLAD_CKOS::write(2); + GBS::ADC_CLK_ICLK2X::write(0); + GBS::ADC_CLK_ICLK1X::write(1); + GBS::DEC2_BYPS::write(0); + GBS::DEC1_BYPS::write(1); // dec1 couples to ADC_CLK_ICLK2X + + if (rto->videoStandardInput == 8 || rto->videoStandardInput == 4 || rto->videoStandardInput == 3) { + //GBS::ADC_CLK_ICLK2X::write(1); + //GBS::DEC1_BYPS::write(0); + // instead increase CKOS by 1 step + GBS::PLLAD_CKOS::write(GBS::PLLAD_CKOS::read() + 1); + } + + rto->osr = 2; + //if (!prepareOnly) SerialM.println("OSR 2x"); + + break; + case 4: + if (ks == 0) { setOverSampleRatio(1, false); return; } // 4x impossible + if (ks == 1) { setOverSampleRatio(1, false); return; } // 4x impossible + if (ks == 2) GBS::PLLAD_CKOS::write(0); + if (ks == 3) GBS::PLLAD_CKOS::write(1); + GBS::ADC_CLK_ICLK2X::write(1); + GBS::ADC_CLK_ICLK1X::write(1); + GBS::DEC1_BYPS::write(0); // dec1 couples to ADC_CLK_ICLK2X + GBS::DEC2_BYPS::write(0); + + rto->osr = 4; + //if (!prepareOnly) SerialM.println("OSR 4x"); + + break; + default: + break; + } + + if (!prepareOnly) latchPLLAD(); +} + +void togglePhaseAdjustUnits() { + GBS::PA_SP_BYPSZ::write(0); // yes, 0 means bypass on here + GBS::PA_SP_BYPSZ::write(1); + delay(2); + GBS::PA_ADC_BYPSZ::write(0); + GBS::PA_ADC_BYPSZ::write(1); + delay(2); +} + +void advancePhase() { + rto->phaseADC = (rto->phaseADC + 1) & 0x1f; + setAndLatchPhaseADC(); +} + +void movePhaseThroughRange() { + for (uint8_t i = 0; i < 128; i++) { // 4x for 4x oversampling? + advancePhase(); + } +} + +void setAndLatchPhaseSP() { + GBS::PA_SP_LAT::write(0); // latch off + GBS::PA_SP_S::write(rto->phaseSP); + GBS::PA_SP_LAT::write(1); // latch on +} + +void setAndLatchPhaseADC() { + GBS::PA_ADC_LAT::write(0); + GBS::PA_ADC_S::write(rto->phaseADC); + GBS::PA_ADC_LAT::write(1); +} + +void nudgeMD() { + GBS::MD_VS_FLIP::write(!GBS::MD_VS_FLIP::read()); + GBS::MD_VS_FLIP::write(!GBS::MD_VS_FLIP::read()); +} + +void updateSpDynamic(boolean withCurrentVideoModeCheck) { + if (!rto->boardHasPower || rto->sourceDisconnected) + { + return; + } + + uint8_t vidModeReadout = getVideoMode(); + if (vidModeReadout == 0) { + vidModeReadout = getVideoMode(); + } + + if (rto->videoStandardInput == 0 && vidModeReadout == 0) { + if (GBS::SP_DLT_REG::read() > 0x30) + GBS::SP_DLT_REG::write(0x30); // 5_35 + else + GBS::SP_DLT_REG::write(0xC0); + return; + } + // reset condition, allow most formats to detect + // compare 1chip snes and ps2 1080p + if (vidModeReadout == 0 && withCurrentVideoModeCheck) { + if ((rto->noSyncCounter % 16) <= 8 && rto->noSyncCounter != 0) { + GBS::SP_DLT_REG::write(0x30); // 5_35 + } + else if ((rto->noSyncCounter % 16) > 8 && rto->noSyncCounter != 0) { + GBS::SP_DLT_REG::write(0xC0); // may want to use lower, around 0x70 + } + else { + GBS::SP_DLT_REG::write(0x30); + } + GBS::SP_H_PULSE_IGNOR::write(0x02); + //GBS::SP_DIS_SUB_COAST::write(1); + GBS::SP_H_CST_ST::write(0x10); + GBS::SP_H_CST_SP::write(0x100); + GBS::SP_H_COAST::write(0); // 5_3e 2 (just in case) + GBS::SP_H_TIMER_VAL::write(0x3a); // new: 5_33 default 0x3a, set shorter for better hsync drop detect + if (rto->syncTypeCsync) { + GBS::SP_COAST_INV_REG::write(1); // new, allows SP to see otherwise potentially skipped vlines + } + rto->coastPositionIsSet = false; + return; + } + + if (rto->syncTypeCsync) { + GBS::SP_COAST_INV_REG::write(0); + } + + if (rto->videoStandardInput != 0) { + if (rto->videoStandardInput <= 2) { // SD interlaced + GBS::SP_PRE_COAST::write(7); + GBS::SP_POST_COAST::write(3); + GBS::SP_DLT_REG::write(0xC0); // old: 0x140 works better than 0x130 with psx + GBS::SP_H_TIMER_VAL::write(0x28); // 5_33 + + if (rto->syncTypeCsync) { + uint16_t hPeriod = GBS::HPERIOD_IF::read(); + for (int i = 0; i < 16; i++) { + if (hPeriod == 511 || hPeriod < 200) { + hPeriod = GBS::HPERIOD_IF::read(); // retry / overflow + if (i == 15) { + hPeriod = 300; break; // give up, use short base to get low ignore value later + } + } + else { + break; + } + delayMicroseconds(100); + } + + uint16_t ignoreLength = hPeriod * 0.081f; // hPeriod is base length + if (hPeriod <= 200) { // mode is NTSC / PAL, very likely overflow + ignoreLength = 0x18; // use neutral but low value + } + + // get hpw to ht ratio. stability depends on hpll lock + double ratioHs, ratioHsAverage = 0.0; + uint8_t testOk = 0; + for (int i = 0; i < 30; i++) { + ratioHs = (double)GBS::STATUS_SYNC_PROC_HLOW_LEN::read() / (double)(GBS::STATUS_SYNC_PROC_HTOTAL::read() + 1); + if (ratioHs > 0.041 && ratioHs < 0.152) { // 0.152 : (354 / 2345) is 9.5uS on NTSC (crtemudriver) + testOk++; + ratioHsAverage += ratioHs; + if (testOk == 12) { + ratioHs = ratioHsAverage / testOk; + break; + } + delayMicroseconds(30); + } + } + if (testOk != 12) { + //Serial.print(" testok: "); Serial.println(testOk); + ratioHs = 0.032; // 0.032: (~100 / 2560) is ~2.5uS on NTSC (find with crtemudriver) + } + + //Serial.print(" (debug) hPeriod: "); Serial.println(hPeriod); + //Serial.print(" (debug) ratioHs: "); Serial.println(ratioHs, 5); + //Serial.print(" (debug) ignoreBase: 0x"); Serial.println(ignoreLength,HEX); + uint16_t pllDiv = GBS::PLLAD_MD::read(); + ignoreLength = ignoreLength + (pllDiv * (ratioHs * 0.38)); // for factor: crtemudriver tests + //SerialM.print(" (debug) ign.length: 0x"); SerialM.println(ignoreLength, HEX); + + // > check relies on sync instability (potentially from too large ign. length) getting cought earlier + if (ignoreLength > GBS::SP_H_PULSE_IGNOR::read() || GBS::SP_H_PULSE_IGNOR::read() >= 0x90) { + if (ignoreLength > 0x90) { // if higher, HPERIOD_IF probably was 511 / limit + ignoreLength = 0x90; + } + if (ignoreLength >= 0x1A && ignoreLength <= 0x42) { + ignoreLength = 0x1A; // at the low end should stick to 0x1A + } + if (ignoreLength != GBS::SP_H_PULSE_IGNOR::read()) { + GBS::SP_H_PULSE_IGNOR::write(ignoreLength); + rto->coastPositionIsSet = 0; // mustn't be skipped, needed when input changes dotclock / Hz + SerialM.print(F(" (debug) ign. length: 0x")); SerialM.println(ignoreLength, HEX); + } + } + } + } + else if (rto->videoStandardInput <= 4) { + GBS::SP_PRE_COAST::write(7); // these two were 7 and 6 + GBS::SP_POST_COAST::write(6); // and last 11 and 11 + // 3,3 fixes the ps2 issue but these are too low for format change detects + // update: seems to be an SP bypass only problem (t5t57t6 to 0 also fixes it) + GBS::SP_DLT_REG::write(0xA0); + GBS::SP_H_PULSE_IGNOR::write(0x0E); // ps3: up to 0x3e, ps2: < 0x14 + } + else if (rto->videoStandardInput == 5) { // 720p + GBS::SP_PRE_COAST::write(7); // down to 4 ok with ps2 + GBS::SP_POST_COAST::write(7); // down to 6 ok with ps2 // ps3: 8 too much + GBS::SP_DLT_REG::write(0x30); + GBS::SP_H_PULSE_IGNOR::write(0x08); // ps3: 0xd too much + } + else if (rto->videoStandardInput <= 7) { // 1080i,p + GBS::SP_PRE_COAST::write(9); + GBS::SP_POST_COAST::write(18); // of 1124 input lines + GBS::SP_DLT_REG::write(0x70); + // ps2 up to 0x06 + // new test shows ps2 alternating between okay and not okay at 0x0a with 5_35=0x70 + GBS::SP_H_PULSE_IGNOR::write(0x06); + } + else if (rto->videoStandardInput >= 13) { // 13, 14 and 15 (was just 13 and 15) + if (rto->syncTypeCsync == false) + { + GBS::SP_PRE_COAST::write(0x00); + GBS::SP_POST_COAST::write(0x00); + GBS::SP_H_PULSE_IGNOR::write(0xff); // required this because 5_02 0 is on + GBS::SP_DLT_REG::write(0x00); // sometimes enough on it's own, but not always + } + else { // csync + GBS::SP_PRE_COAST::write(0x04); // as in bypass mode set function + GBS::SP_POST_COAST::write(0x07); // as in bypass mode set function + GBS::SP_DLT_REG::write(0x70); + GBS::SP_H_PULSE_IGNOR::write(0x02); + } + } + } +} + +void updateCoastPosition(boolean autoCoast) { + if (((rto->videoStandardInput == 0) || (rto->videoStandardInput > 14)) || + !rto->boardHasPower || rto->sourceDisconnected) + { + return; + } + + uint32_t accInHlength = 0; + uint16_t prevInHlength = GBS::HPERIOD_IF::read(); + for (uint8_t i = 0; i < 8; i++) { + // psx jitters between 427, 428 + uint16_t thisInHlength = GBS::HPERIOD_IF::read(); + if ((thisInHlength > (prevInHlength - 3)) && (thisInHlength < (prevInHlength + 3))) { + accInHlength += thisInHlength; + } + else { + return; + } + if (!getStatus16SpHsStable()) { + return; + } + + prevInHlength = thisInHlength; + } + accInHlength = (accInHlength * 4) / 8; + + // 30.09.19 new: especially in low res VGA input modes, it can clip at "511 * 4 = 2044" + // limit to more likely actual value of 430 + if (accInHlength >= 2040) { + accInHlength = 1716; + } + + if (accInHlength <= 240) { + // check for low res, low Hz > can overflow HPERIOD_IF + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() <= 322) { + delay(4); + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() <= 322) { + SerialM.println(F(" (debug) updateCoastPosition: low res, low hz")); + accInHlength = 2000; + // usually need to lower charge pump. todo: write better check + if (rto->syncTypeCsync && rto->videoStandardInput > 0 && rto->videoStandardInput <= 4) { + if (GBS::PLLAD_ICP::read() >= 5 && GBS::PLLAD_FS::read() == 1) { + GBS::PLLAD_ICP::write(5); + GBS::PLLAD_FS::write(0); + latchPLLAD(); + rto->phaseIsSet = 0; + } + } + } + } + } + + // accInHlength around 1732 here / NTSC + // scope on sync-in, enable 5_3e 2 > shows coast borders + if (accInHlength > 32) { + if (autoCoast) { + // autoCoast (5_55 7 = on) + GBS::SP_H_CST_ST::write((uint16_t)(accInHlength * 0.0562f)); // ~0x61, right after color burst + GBS::SP_H_CST_SP::write((uint16_t)(accInHlength * 0.1550f)); // ~0x10C, shortly before sync falling edge + GBS::SP_HCST_AUTO_EN::write(1); + } + else { + // test: psx pal black license screen, then ntsc SMPTE color bars 100%; or MS + // scope test psx: t5t11t3, 5_3e = 0x01, 5_36/5_35 = 0x30 5_37 = 0x10 : + // cst sp should be > 0x62b to clean out HS from eq pulses + // cst st should be 0, sp should be 0x69f when t5t57t7 = disabled + //GBS::SP_H_CST_ST::write((uint16_t)(accInHlength * 0.088f)); // ~0x9a, leave some room for SNES 239 mode + // new: with SP_H_PROTECT disabled, even SNES can be a small value. Small value greatly improves Mega Drive + GBS::SP_H_CST_ST::write(0x10); + + GBS::SP_H_CST_SP::write((uint16_t)(accInHlength * 0.968f)); // ~0x678 + // need a bit earlier, making 5_3e 2 more stable + //GBS::SP_H_CST_SP::write((uint16_t)(accInHlength * 0.7383f)); // ~0x4f0, before sync + GBS::SP_HCST_AUTO_EN::write(0); + } + rto->coastPositionIsSet = 1; + + /*Serial.print("coast ST: "); Serial.print("0x"); Serial.print(GBS::SP_H_CST_ST::read(), HEX); + Serial.print(", "); + Serial.print("SP: "); Serial.print("0x"); Serial.print(GBS::SP_H_CST_SP::read(), HEX); + Serial.print(" total: "); Serial.print("0x"); Serial.print(accInHlength, HEX); + Serial.print(" ~ "); Serial.println(accInHlength / 4);*/ + } +} + +void updateClampPosition() { + if ((rto->videoStandardInput == 0) || !rto->boardHasPower || rto->sourceDisconnected) + { + return; + } + // this is required especially on mode changes with ypbpr + if (getVideoMode() == 0) { return; } + + if (rto->inputIsYpBpR) { + GBS::SP_CLAMP_MANUAL::write(0); + } + else { + GBS::SP_CLAMP_MANUAL::write(1); // no auto clamp for RGB + } + + // STATUS_SYNC_PROC_HTOTAL is "ht: " value; use with SP_CLP_SRC_SEL = 1 pixel clock + // GBS::HPERIOD_IF::read() is "h: " value; use with SP_CLP_SRC_SEL = 0 osc clock + // update: in RGBHV bypass it seems both clamp source modes use pixel clock for calculation + // but with sog modes, it uses HPERIOD_IF ... k + // update2: if the clamp is already short, yet creeps into active video, check sog invert (t5t20t2) + uint32_t accInHlength = 0; + uint16_t prevInHlength = 0; + uint16_t thisInHlength = 0; + if (rto->syncTypeCsync) prevInHlength = GBS::HPERIOD_IF::read(); + else prevInHlength = GBS::STATUS_SYNC_PROC_HTOTAL::read(); + for (uint8_t i = 0; i < 16; i++) { + if (rto->syncTypeCsync) thisInHlength = GBS::HPERIOD_IF::read(); + else thisInHlength = GBS::STATUS_SYNC_PROC_HTOTAL::read(); + if ((thisInHlength > (prevInHlength - 3)) && (thisInHlength < (prevInHlength + 3))) { + accInHlength += thisInHlength; + } + else { + //Serial.println("updateClampPosition unstable"); + return; + } + if (!getStatus16SpHsStable()) { + return; + } + + prevInHlength = thisInHlength; + delayMicroseconds(100); + } + accInHlength = accInHlength / 16; // for the 16x loop + + // HPERIOD_IF: 9 bits (0-511, represents actual scanline time / 4, can overflow to low values) + // if it overflows, the calculated clamp positions are likely around 1 to 4. good enough + // STATUS_SYNC_PROC_HTOTAL: 12 bits (0-4095) + if (accInHlength > 4095) { + return; + } + + uint16_t oldClampST = GBS::SP_CS_CLP_ST::read(); + uint16_t oldClampSP = GBS::SP_CS_CLP_SP::read(); + float multiSt = rto->syncTypeCsync == 1 ? 0.032f : 0.010f; + float multiSp = rto->syncTypeCsync == 1 ? 0.174f : 0.058f; + uint16_t start = 1 + (accInHlength * multiSt); // HPERIOD_IF: *0.04 seems good + uint16_t stop = 2 + (accInHlength * multiSp); // HPERIOD_IF: *0.178 starts to creep into some EDTV modes + + if (rto->inputIsYpBpR) { + // YUV: // ST shift forward to pass blacker than black HSync, sog: min * 0.08 + multiSt = rto->syncTypeCsync == 1 ? 0.089f : 0.032f; + start = 1 + (accInHlength * multiSt); + + // new: HDBypass rewrite to sync to falling HS edge: move clamp position forward + // RGB can stay the same for now (clamp will start on sync pulse, a benefit in RGB + if (rto->outModeHdBypass) { + if (videoStandardInputIsPalNtscSd()) { + start += 0x60; + stop += 0x60; + } + // raise blank level a bit that's not handled 100% by clamping + GBS::HD_BLK_GY_DATA::write(0x05); + GBS::HD_BLK_BU_DATA::write(0x00); + GBS::HD_BLK_RV_DATA::write(0x00); + } + } + + if ((start < (oldClampST - 1) || start > (oldClampST + 1)) || + (stop < (oldClampSP - 1) || stop > (oldClampSP + 1))) + { + GBS::SP_CS_CLP_ST::write(start); + GBS::SP_CS_CLP_SP::write(stop); + /*Serial.print("clamp ST: "); Serial.print("0x"); Serial.print(start, HEX); + Serial.print(", "); + Serial.print("SP: "); Serial.print("0x"); Serial.print(stop, HEX); + Serial.print(" total: "); Serial.print("0x"); Serial.print(accInHlength, HEX); + Serial.print(" / "); Serial.println(accInHlength);*/ + } + + rto->clampPositionIsSet = true; +} + +// use t5t00t2 and adjust t5t11t5 to find this sources ideal sampling clock for this preset (affected by htotal) +// 2431 for psx, 2437 for MD +// in this mode, sampling clock is free to choose +void setOutModeHdBypass() { + if (!rto->boardHasPower) { + SerialM.println(F("GBS board not responding!")); + return; + } + + rto->autoBestHtotalEnabled = false; // disable while in this mode + rto->outModeHdBypass = 1; // skips waiting at end of doPostPresetLoadSteps + + externalClockGenResetClock(); + updateSpDynamic(0); + loadHdBypassSection(); // this would be ignored otherwise + if (GBS::ADC_UNUSED_62::read() != 0x00) { + // remember debug view + if (uopt->presetPreference != 2) { + typeOneCommand = 'D'; + } + } + + GBS::SP_NO_COAST_REG::write(0); // enable vblank coast (just in case) + GBS::SP_COAST_INV_REG::write(0); // also just in case + + FrameSync::cleanup(); + GBS::ADC_UNUSED_62::write(0x00); // clear debug view + GBS::RESET_CONTROL_0x46::write(0x00); // 0_46 all off, nothing needs to be enabled for bp mode + GBS::RESET_CONTROL_0x47::write(0x00); + GBS::PA_ADC_BYPSZ::write(1); // enable phase unit ADC + GBS::PA_SP_BYPSZ::write(1); // enable phase unit SP + + doPostPresetLoadSteps(); // todo: remove this, code path for hdbypass is hard to follow + resetDebugPort(); + + rto->autoBestHtotalEnabled = false; // need to re-set this + GBS::OUT_SYNC_SEL::write(1); // 0_4f 1=sync from HDBypass, 2=sync from SP, 0 = sync from VDS + + GBS::PLL_CKIS::write(0); // 0_40 0 // 0: PLL uses OSC clock | 1: PLL uses input clock + GBS::PLL_DIVBY2Z::write(0); // 0_40 1 // 1= no divider (full clock, ie 27Mhz) 0 = halved + //GBS::PLL_ADS::write(0); // 0_40 3 test: input clock is from PCLKIN (disconnected, not ADC clock) + GBS::PAD_OSC_CNTRL::write(1); // test: noticed some wave pattern in 720p source, this fixed it + GBS::PLL648_CONTROL_01::write(0x35); + GBS::PLL648_CONTROL_03::write(0x00); GBS::PLL_LEN::write(1); // 0_43 + GBS::DAC_RGBS_R0ENZ::write(1); GBS::DAC_RGBS_G0ENZ::write(1); // 0_44 + GBS::DAC_RGBS_B0ENZ::write(1); GBS::DAC_RGBS_S1EN::write(1); // 0_45 + // from RGBHV tests: the memory bus can be tri stated for noise reduction + GBS::PAD_TRI_ENZ::write(1); // enable tri state + GBS::PLL_MS::write(2); // select feedback clock (but need to enable tri state!) + GBS::MEM_PAD_CLK_INVERT::write(0); // helps also + GBS::RESET_CONTROL_0x47::write(0x1f); + + // update: found the real use of HDBypass :D + GBS::DAC_RGBS_BYPS2DAC::write(1); + GBS::SP_HS_LOOP_SEL::write(1); + GBS::SP_HS_PROC_INV_REG::write(0); // (5_56_5) do not invert HS + GBS::SP_CS_P_SWAP::write(0); // old default, set here to reset between HDBypass formats + GBS::SP_HS2PLL_INV_REG::write(0); // same + + GBS::PB_BYPASS::write(1); + GBS::PLLAD_MD::write(2345); // 2326 looks "better" on my LCD but 2345 looks just correct on scope + GBS::PLLAD_KS::write(2); // 5_16 post divider 0 : FCKO1 > 87MHz, 3 : FCKO1<23MHz + setOverSampleRatio(2, true); + GBS::PLLAD_ICP::write(5); + GBS::PLLAD_FS::write(1); + + if (rto->inputIsYpBpR) { + GBS::DEC_MATRIX_BYPS::write(1); // 5_1f 2 = 1 for YUV / 0 for RGB + GBS::HD_MATRIX_BYPS::write(0); // 1_30 1 / input to jacks is yuv, adc leaves it as yuv > convert to rgb for output here + GBS::HD_DYN_BYPS::write(0); // don't bypass color expansion + //GBS::HD_U_OFFSET::write(3); // color adjust via scope + //GBS::HD_V_OFFSET::write(3); // color adjust via scope + } + else { + GBS::DEC_MATRIX_BYPS::write(1); // this is normally RGB input for HDBYPASS out > no color matrix at all + GBS::HD_MATRIX_BYPS::write(1); // 1_30 1 / input is rgb, adc leaves it as rgb > bypass matrix + GBS::HD_DYN_BYPS::write(1); // bypass as well + } + + GBS::HD_SEL_BLK_IN::write(0); // 0 enables HDB blank timing (1 would be DVI, not working atm) + + GBS::SP_SDCS_VSST_REG_H::write(0); // S5_3B + GBS::SP_SDCS_VSSP_REG_H::write(0); // S5_3B + GBS::SP_SDCS_VSST_REG_L::write(0); // S5_3F // 3 for SP sync + GBS::SP_SDCS_VSSP_REG_L::write(2); // S5_40 // 10 for SP sync // check with interlaced sources + + GBS::HD_HSYNC_RST::write(0x3ff); // max 0x7ff + GBS::HD_INI_ST::write(0); // todo: test this at 0 / was 0x298 + // timing into HDB is PLLAD_MD with PLLAD_KS divider: KS = 0 > full PLLAD_MD + if (rto->videoStandardInput <= 2) { + // PAL and NTSC are rewrites, the rest is still handled normally + // These 2 formats now have SP_HS2PLL_INV_REG set. That's the only way I know so far that + // produces recovered HSyncs that align to the falling edge of the input + // ToDo: find reliable input active flank detect to then set SP_HS2PLL_INV_REG correctly + // (for PAL/NTSC polarity is known to be active low, but other formats are variable) + GBS::SP_HS2PLL_INV_REG::write(1); //5_56 1 lock to falling HS edge // check > sync issues with MD + GBS::SP_CS_P_SWAP::write(1); //5_3e 0 new: this should negate the problem with inverting HS2PLL + GBS::SP_HS_PROC_INV_REG::write(1); // (5_56_5) invert HS to DEC + // invert mode detect HS/VS triggers, helps PSX NTSC detection. required with 5_3e 0 set + GBS::MD_HS_FLIP::write(1); GBS::MD_VS_FLIP::write(1); + GBS::OUT_SYNC_SEL::write(2); // new: 0_4f 1=sync from HDBypass, 2=sync from SP, 0 = sync from VDS + GBS::SP_HS_LOOP_SEL::write(0); // 5_57 6 new: use full SP sync, enable HS positioning and pulse length control + GBS::ADC_FLTR::write(3); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + //GBS::HD_INI_ST::write(0x76); // 1_39 + + GBS::HD_HSYNC_RST::write((GBS::PLLAD_MD::read() / 2) + 8); // ADC output pixel count determined + GBS::HD_HB_ST::write(GBS::PLLAD_MD::read() * 0.945f); // 1_3B // no idea why it's not coupled to HD_RST + GBS::HD_HB_SP::write(0x90); // 1_3D + GBS::HD_HS_ST::write(0x80); // 1_3F // but better to use SP sync directly (OUT_SYNC_SEL = 2) + GBS::HD_HS_SP::write(0x00); // 1_41 // + // to use SP sync directly; prepare reasonable out HS length + GBS::SP_CS_HS_ST::write(0xA0); GBS::SP_CS_HS_SP::write(0x00); + + if (rto->videoStandardInput == 1) { + setCsVsStart(250); // don't invert VS with direct SP sync mode + setCsVsStop(1); // stop relates to HS pulses from CS decoder directly, so mind EQ pulses + GBS::HD_VB_ST::write(500); // 1_43 + GBS::HD_VS_ST::write(3); // 1_47 // but better to use SP sync directly (OUT_SYNC_SEL = 2) + GBS::HD_VS_SP::write(522); // 1_49 // + GBS::HD_VB_SP::write(16); // 1_45 + } + if (rto->videoStandardInput == 2) { + setCsVsStart(301); // don't invert + setCsVsStop(5); // stop past EQ pulses (6 on psx) normally, but HDMI adapter works with -=1 (5) + GBS::HD_VB_ST::write(605); // 1_43 + GBS::HD_VS_ST::write(1); // 1_47 + GBS::HD_VS_SP::write(621); // 1_49 + GBS::HD_VB_SP::write(16); // 1_45 + } + } + else if (rto->videoStandardInput == 3 || rto->videoStandardInput == 4) { // 480p, 576p + GBS::ADC_FLTR::write(2); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + GBS::PLLAD_KS::write(1); // 5_16 post divider + GBS::PLLAD_CKOS::write(0); // 5_16 2x OS (with KS=1) + //GBS::HD_INI_ST::write(0x76); // 1_39 + GBS::HD_HB_ST::write(0x878); // 1_3B + GBS::HD_HB_SP::write(0xa0); // 1_3D + GBS::HD_VB_ST::write(0x00); // 1_43 + GBS::HD_VB_SP::write(0x40); // 1_45 + if (rto->videoStandardInput == 3) { + GBS::HD_HS_ST::write(0x10); // 1_3F + GBS::HD_HS_SP::write(0x864); // 1_41 + GBS::HD_VS_ST::write(0x06); // 1_47 // VS neg + GBS::HD_VS_SP::write(0x00); // 1_49 + setCsVsStart(2); + setCsVsStop(0); + } + if (rto->videoStandardInput == 4) { + GBS::HD_HS_ST::write(0x10); // 1_3F + GBS::HD_HS_SP::write(0x880); // 1_41 + GBS::HD_VS_ST::write(0x06); // 1_47 // VS neg + GBS::HD_VS_SP::write(0x00); // 1_49 + setCsVsStart(48); + setCsVsStop(46); + } + } + else if (rto->videoStandardInput <= 7 || rto->videoStandardInput == 13) { + //GBS::SP_HS2PLL_INV_REG::write(0); // 5_56 1 use rising edge of tri-level sync // always 0 now + if (rto->videoStandardInput == 5) { // 720p + GBS::PLLAD_MD::write(2474); // override from 2345 + GBS::HD_HSYNC_RST::write(550); // 1_37 + //GBS::HD_INI_ST::write(78); // 1_39 + // 720p has high pllad vco output clock, so don't do oversampling + GBS::PLLAD_KS::write(0); // 5_16 post divider 0 : FCKO1 > 87MHz, 3 : FCKO1<23MHz + GBS::PLLAD_CKOS::write(0); // 5_16 1x OS (with KS=CKOS=0) + GBS::ADC_FLTR::write(0); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + GBS::ADC_CLK_ICLK1X::write(0);// 5_00 4 (OS=1) + GBS::DEC2_BYPS::write(1); // 5_1f 1 // dec2 disabled (OS=1) + GBS::PLLAD_ICP::write(6); // fine at 6 only, FS is 1 + GBS::PLLAD_FS::write(1); + GBS::HD_HB_ST::write(0); // 1_3B + GBS::HD_HB_SP::write(0x140); // 1_3D + GBS::HD_HS_ST::write(0x20); // 1_3F + GBS::HD_HS_SP::write(0x80); // 1_41 + GBS::HD_VB_ST::write(0x00); // 1_43 + GBS::HD_VB_SP::write(0x6c); // 1_45 // ps3 720p tested + GBS::HD_VS_ST::write(0x00); // 1_47 + GBS::HD_VS_SP::write(0x05); // 1_49 + setCsVsStart(2); + setCsVsStop(0); + } + if (rto->videoStandardInput == 6) { // 1080i + // interl. source + GBS::HD_HSYNC_RST::write(0x710); // 1_37 + //GBS::HD_INI_ST::write(2); // 1_39 + GBS::PLLAD_KS::write(1); // 5_16 post divider + GBS::PLLAD_CKOS::write(0); // 5_16 2x OS (with KS=1) + GBS::ADC_FLTR::write(1); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + GBS::HD_HB_ST::write(0); // 1_3B + GBS::HD_HB_SP::write(0xb8); // 1_3D + GBS::HD_HS_ST::write(0x04); // 1_3F + GBS::HD_HS_SP::write(0x50); // 1_41 + GBS::HD_VB_ST::write(0x00); // 1_43 + GBS::HD_VB_SP::write(0x1e); // 1_45 + GBS::HD_VS_ST::write(0x04); // 1_47 + GBS::HD_VS_SP::write(0x09); // 1_49 + setCsVsStart(8); + setCsVsStop(6); + } + if (rto->videoStandardInput == 7) { // 1080p + GBS::PLLAD_MD::write(2749); // override from 2345 + GBS::HD_HSYNC_RST::write(0x710); // 1_37 + //GBS::HD_INI_ST::write(0xf0); // 1_39 + // 1080p has highest pllad vco output clock, so don't do oversampling + GBS::PLLAD_KS::write(0); // 5_16 post divider 0 : FCKO1 > 87MHz, 3 : FCKO1<23MHz + GBS::PLLAD_CKOS::write(0); // 5_16 1x OS (with KS=CKOS=0) + GBS::ADC_FLTR::write(0); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + GBS::ADC_CLK_ICLK1X::write(0);// 5_00 4 (OS=1) + GBS::DEC2_BYPS::write(1); // 5_1f 1 // dec2 disabled (OS=1) + GBS::PLLAD_ICP::write(6); // was 5, fine at 6 as well, FS is 1 + GBS::PLLAD_FS::write(1); + GBS::HD_HB_ST::write(0x00); // 1_3B + GBS::HD_HB_SP::write(0xb0); // 1_3D // d0 + GBS::HD_HS_ST::write(0x20); // 1_3F + GBS::HD_HS_SP::write(0x70); // 1_41 + GBS::HD_VB_ST::write(0x00); // 1_43 + GBS::HD_VB_SP::write(0x2f); // 1_45 + GBS::HD_VS_ST::write(0x04); // 1_47 + GBS::HD_VS_SP::write(0x0A); // 1_49 + } + if (rto->videoStandardInput == 13) { // odd HD mode (PS2 "VGA" over Component) + applyRGBPatches(); // treat mostly as RGB, clamp R/B to gnd + rto->syncTypeCsync = true; // used in loop to set clamps and SP dynamic + GBS::DEC_MATRIX_BYPS::write(1); // overwrite for this mode + GBS::SP_PRE_COAST::write(4); + GBS::SP_POST_COAST::write(4); + GBS::SP_DLT_REG::write(0x70); + GBS::HD_MATRIX_BYPS::write(1); // bypass since we'll treat source as RGB + GBS::HD_DYN_BYPS::write(1); // bypass since we'll treat source as RGB + GBS::SP_VS_PROC_INV_REG::write(0); // don't invert + // same as with RGBHV, the ps2 resolution can vary widely + GBS::PLLAD_KS::write(0); // 5_16 post divider 0 : FCKO1 > 87MHz, 3 : FCKO1<23MHz + GBS::PLLAD_CKOS::write(0); // 5_16 1x OS (with KS=CKOS=0) + GBS::ADC_CLK_ICLK1X::write(0);// 5_00 4 (OS=1) + GBS::ADC_CLK_ICLK2X::write(0);// 5_00 3 (OS=1) + GBS::DEC1_BYPS::write(1); // 5_1f 1 // dec1 disabled (OS=1) + GBS::DEC2_BYPS::write(1); // 5_1f 1 // dec2 disabled (OS=1) + GBS::PLLAD_MD::write(512); // could try 856 + } + } + + if (rto->videoStandardInput == 13) { + // section is missing HD_HSYNC_RST and HD_INI_ST adjusts + uint16_t vtotal = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + if (vtotal < 532) { // 640x480 or less + GBS::PLLAD_KS::write(3); + GBS::PLLAD_FS::write(1); + } + else if (vtotal >= 532 && vtotal < 810) { // 800x600, 1024x768 + //GBS::PLLAD_KS::write(3); // just a little too much at 1024x768 + GBS::PLLAD_FS::write(0); + GBS::PLLAD_KS::write(2); + } + else { //if (vtotal > 1058 && vtotal < 1074) { // 1280x1024 + GBS::PLLAD_KS::write(2); + GBS::PLLAD_FS::write(1); + } + } + + GBS::DEC_IDREG_EN::write(1); // 5_1f 7 + GBS::DEC_WEN_MODE::write(1); // 5_1e 7 // 1 keeps ADC phase consistent. around 4 lock positions vs totally random + rto->phaseSP = 8; + rto->phaseADC = 24; // fix value // works best with yuv input in tests + setAndUpdateSogLevel(rto->currentLevelSOG); // also re-latch everything + + rto->outModeHdBypass = 1; + rto->presetID = 0x21; // bypass flavor 1, used to signal buttons in web ui + GBS::GBS_PRESET_ID::write(0x21); + + unsigned long timeout = millis(); + while ((!getStatus16SpHsStable()) && (millis() - timeout < 2002)) { + delay(1); + } + while ((getVideoMode() == 0) && (millis() - timeout < 1502)) { + delay(1); + } + // currently SP is using generic settings, switch to format specific ones + updateSpDynamic(0); + while ((getVideoMode() == 0) && (millis() - timeout < 1502)) { + delay(1); + } + + GBS::DAC_RGBS_PWDNZ::write(1); // enable DAC + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out + delay(200); + optimizePhaseSP(); + SerialM.println(F("pass-through on")); +} + +void bypassModeSwitch_RGBHV() { + if (!rto->boardHasPower) { + SerialM.println(F("GBS board not responding!")); + return; + } + + GBS::DAC_RGBS_PWDNZ::write(0); // disable DAC + GBS::PAD_SYNC_OUT_ENZ::write(1); // disable sync out + + loadHdBypassSection(); + externalClockGenResetClock(); + FrameSync::cleanup(); + GBS::ADC_UNUSED_62::write(0x00); // clear debug view + GBS::PA_ADC_BYPSZ::write(1); // enable phase unit ADC + GBS::PA_SP_BYPSZ::write(1); // enable phase unit SP + applyRGBPatches(); + resetDebugPort(); + rto->videoStandardInput = 15; // making sure + rto->autoBestHtotalEnabled = false; // not necessary, since VDS is off / bypassed // todo: mode 14 (works anyway) + rto->clampPositionIsSet = false; + rto->HPLLState = 0; + + GBS::PLL_CKIS::write(0); // 0_40 0 // 0: PLL uses OSC clock | 1: PLL uses input clock + GBS::PLL_DIVBY2Z::write(0); // 0_40 1 // 1= no divider (full clock, ie 27Mhz) 0 = halved clock + GBS::PLL_ADS::write(0); // 0_40 3 test: input clock is from PCLKIN (disconnected, not ADC clock) + GBS::PLL_MS::write(2); // 0_40 4-6 select feedback clock (but need to enable tri state!) + GBS::PAD_TRI_ENZ::write(1); // enable some pad's tri state (they become high-z / inputs), helps noise + GBS::MEM_PAD_CLK_INVERT::write(0); // helps also + GBS::PLL648_CONTROL_01::write(0x35); + GBS::PLL648_CONTROL_03::write(0x00); // 0_43 + GBS::PLL_LEN::write(1); // 0_43 + + GBS::DAC_RGBS_ADC2DAC::write(1); + GBS::OUT_SYNC_SEL::write(1); // 0_4f 1=sync from HDBypass, 2=sync from SP, (00 = from VDS) + + GBS::SFTRST_HDBYPS_RSTZ::write(1); // enable + GBS::HD_INI_ST::write(0); // needs to be some small value or apparently 0 works + //GBS::DAC_RGBS_BYPS2DAC::write(1); + //GBS::OUT_SYNC_SEL::write(2); // 0_4f sync from SP + //GBS::SFTRST_HDBYPS_RSTZ::write(1); // need HDBypass + //GBS::SP_HS_LOOP_SEL::write(1); // (5_57_6) // can bypass since HDBypass does sync + GBS::HD_MATRIX_BYPS::write(1); // bypass since we'll treat source as RGB + GBS::HD_DYN_BYPS::write(1); // bypass since we'll treat source as RGB + //GBS::HD_SEL_BLK_IN::write(1); // "DVI", not regular + + GBS::PAD_SYNC1_IN_ENZ::write(0); // filter H/V sync input1 (0 = on) + GBS::PAD_SYNC2_IN_ENZ::write(0); // filter H/V sync input2 (0 = on) + + GBS::SP_SOG_P_ATO::write(1); // 5_20 1 corrects hpw readout and slightly affects sync + if (rto->syncTypeCsync == false) + { + GBS::SP_SOG_SRC_SEL::write(0); // 5_20 0 | 0: from ADC 1: from hs // use ADC and turn it off = no SOG + GBS::ADC_SOGEN::write(1); // 5_02 0 ADC SOG // having it 0 drags down the SOG (hsync) input; = 1: need to supress SOG decoding + GBS::SP_EXT_SYNC_SEL::write(0); // connect HV input ( 5_20 bit 3 ) + GBS::SP_SOG_MODE::write(0); // 5_56 bit 0 // 0: normal, 1: SOG + GBS::SP_NO_COAST_REG::write(1); // vblank coasting off + GBS::SP_PRE_COAST::write(0); + GBS::SP_POST_COAST::write(0); + GBS::SP_H_PULSE_IGNOR::write(0xff); // cancel out SOG decoding + GBS::SP_SYNC_BYPS::write(0); // external H+V sync for decimator (+ sync out) | 1 to mirror in sync, 0 to output processed sync + GBS::SP_HS_POL_ATO::write(1); // 5_55 4 auto polarity for retiming + GBS::SP_VS_POL_ATO::write(1); // 5_55 6 + GBS::SP_HS_LOOP_SEL::write(1); // 5_57_6 | 0 enables retiming on SP | 1 to bypass input to HDBYPASS + GBS::SP_H_PROTECT::write(0); // 5_3e 4 disable for H/V + rto->phaseADC = 16; + rto->phaseSP = 8; + } + else + { + // todo: SOG SRC can be ADC or HS input pin. HS requires TTL level, ADC can use lower levels + // HS seems to have issues at low PLL speeds + // maybe add detection whether ADC Sync is needed + GBS::SP_SOG_SRC_SEL::write(0); // 5_20 0 | 0: from ADC 1: hs is sog source + GBS::SP_EXT_SYNC_SEL::write(1); // disconnect HV input + GBS::ADC_SOGEN::write(1); // 5_02 0 ADC SOG + GBS::SP_SOG_MODE::write(1); // apparently needs to be off for HS input (on for ADC) + GBS::SP_NO_COAST_REG::write(0); // vblank coasting on + GBS::SP_PRE_COAST::write(4); // 5_38, > 4 can be seen with clamp invert on the lower lines + GBS::SP_POST_COAST::write(7); + GBS::SP_SYNC_BYPS::write(0); // use regular sync for decimator (and sync out) path + GBS::SP_HS_LOOP_SEL::write(1); // 5_57_6 | 0 enables retiming on SP | 1 to bypass input to HDBYPASS + GBS::SP_H_PROTECT::write(1); // 5_3e 4 enable for SOG + rto->currentLevelSOG = 24; + rto->phaseADC = 16; + rto->phaseSP = 8; + } + GBS::SP_CLAMP_MANUAL::write(1); // needs to be 1 + GBS::SP_COAST_INV_REG::write(0); // just in case + + GBS::SP_DIS_SUB_COAST::write(1); // 5_3e 5 + GBS::SP_HS_PROC_INV_REG::write(0); // 5_56 5 + GBS::SP_VS_PROC_INV_REG::write(0); // 5_56 6 + GBS::PLLAD_KS::write(1); // 0 - 3 + setOverSampleRatio(2, true); // prepare only = true + GBS::DEC_MATRIX_BYPS::write(1); // 5_1f with adc to dac mode + GBS::ADC_FLTR::write(0); // 5_03 4/5 ADC filter 3=40, 2=70, 1=110, 0=150 Mhz + + GBS::PLLAD_ICP::write(4); + GBS::PLLAD_FS::write(0); // low gain + GBS::PLLAD_MD::write(1856); // 1349 perfect for for 1280x+ ; 1856 allows lower res to detect + + // T4R0x2B Bit: 3 (was 0x7) is now: 0xF + // S0R0x4F (was 0x80) is now: 0xBC + // 0_43 1a + // S5R0x2 (was 0x48) is now: 0x54 + // s5s11sb2 + //0x25, // s0_44 + //0x11, // s0_45 + // new: do without running default preset first + GBS::ADC_TA_05_CTRL::write(0x02); // 5_05 1 // minor SOG clamp effect + GBS::ADC_TEST_04::write(0x02); // 5_04 + GBS::ADC_TEST_0C::write(0x12); // 5_0c 1 4 + GBS::DAC_RGBS_R0ENZ::write(1); + GBS::DAC_RGBS_G0ENZ::write(1); + GBS::DAC_RGBS_B0ENZ::write(1); + GBS::OUT_SYNC_CNTRL::write(1); + //resetPLL(); // try to avoid this + resetDigital(); // this will leave 0_46 all 0 + resetSyncProcessor(); // required to initialize SOG status + delay(2);ResetSDRAM();delay(2); + resetPLLAD(); + togglePhaseAdjustUnits(); + delay(20); + GBS::PLLAD_LEN::write(1); // 5_11 1 + GBS::DAC_RGBS_PWDNZ::write(1); // enable DAC + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out + + // todo: detect if H-PLL parameters fit the source before aligning clocks (5_11 etc) + + setAndLatchPhaseSP(); // different for CSync and pure HV modes + setAndLatchPhaseADC(); + latchPLLAD(); + + if (uopt->enableAutoGain == 1 && adco->r_gain == 0) { + //SerialM.println("ADC gain: reset"); + GBS::ADC_RGCTRL::write(0x48); + GBS::ADC_GGCTRL::write(0x48); + GBS::ADC_BGCTRL::write(0x48); + GBS::DEC_TEST_ENABLE::write(1); + } + else if (uopt->enableAutoGain == 1 && adco->r_gain != 0) { + /*SerialM.println("ADC gain: keep previous"); + SerialM.print(adco->r_gain, HEX); SerialM.print(" "); + SerialM.print(adco->g_gain, HEX); SerialM.print(" "); + SerialM.print(adco->b_gain, HEX); SerialM.println(" ");*/ + GBS::ADC_RGCTRL::write(adco->r_gain); + GBS::ADC_GGCTRL::write(adco->g_gain); + GBS::ADC_BGCTRL::write(adco->b_gain); + GBS::DEC_TEST_ENABLE::write(1); + } + else { + GBS::DEC_TEST_ENABLE::write(0); // no need for decimation test to be enabled + } + + rto->presetID = 0x22; // bypass flavor 2, used to signal buttons in web ui + GBS::GBS_PRESET_ID::write(0x22); + delay(200); +} + +void runAutoGain() +{ + static unsigned long lastTimeAutoGain = millis(); + uint8_t limit_found = 0, greenValue = 0; + uint8_t loopCeiling = 0; + uint8_t status00reg = GBS::STATUS_00::read(); // confirm no mode changes happened + + //GBS::DEC_TEST_SEL::write(5); + + //for (uint8_t i = 0; i < 14; i++) { + // uint8_t greenValue = GBS::TEST_BUS_2E::read(); + // if (greenValue >= 0x28 && greenValue <= 0x2f) { // 0x2c seems to be "highest" (haven't seen 0x2b yet) + // if (getStatus16SpHsStable() && (GBS::STATUS_00::read() == status00reg)) { + // limit_found++; + // } + // else return; + // } + //} + + if ((millis() - lastTimeAutoGain) < 30000) { + loopCeiling = 61; + } + else { + loopCeiling = 8; + } + + for (uint8_t i = 0; i < loopCeiling; i++) { + if (i % 20 == 0) { + handleWiFi(0); + limit_found = 0; + } + greenValue = GBS::TEST_BUS_2F::read(); + + if (greenValue == 0x7f) { + if (getStatus16SpHsStable() && (GBS::STATUS_00::read() == status00reg)) { + limit_found++; + // 240p test suite (SNES ver): display vertical lines (hor. line test) + //Serial.print("g: "); Serial.println(greenValue, HEX); + //Serial.print("--"); Serial.println(); + } + else + return; + + if (limit_found == 2) { + limit_found = 0; + uint8_t level = GBS::ADC_GGCTRL::read(); + if (level < 0xfe) { + GBS::ADC_GGCTRL::write(level + 2); + GBS::ADC_RGCTRL::write(level + 2); + GBS::ADC_BGCTRL::write(level + 2); + + // remember these gain settings + adco->r_gain = GBS::ADC_RGCTRL::read(); + adco->g_gain = GBS::ADC_GGCTRL::read(); + adco->b_gain = GBS::ADC_BGCTRL::read(); + + printInfo(); + delay(2); // let it settle a little + lastTimeAutoGain = millis(); + } + } + } + } +} + +void enableScanlines() { + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 0) { + //SerialM.println("enableScanlines())"); + + //GBS::RFF_ADR_ADD_2::write(0); + //GBS::RFF_REQ_SEL::write(1); + //GBS::RFF_MASTER_FLAG::write(0x3f); + //GBS::RFF_WFF_OFFSET::write(0); // scanline fix + //GBS::RFF_FETCH_NUM::write(0); + //GBS::RFF_ENABLE::write(1); //GBS::WFF_ENABLE::write(1); + //delay(10); + //GBS::RFF_ENABLE::write(0); //GBS::WFF_ENABLE::write(0); + + // following lines set up UV deinterlacer (on top of normal Y) + //GBS::MADPT_UVDLY_PD_SP::write(0); // 2_39 0..3 + //GBS::MADPT_UVDLY_PD_ST::write(0); // 2_39 4..7 + //GBS::MADPT_EN_UV_DEINT::write(1); // 2_3a 0 + //GBS::MADPT_UV_MI_DET_BYPS::write(1); // 2_3a 7 enables 2_3b adjust + //GBS::MADPT_UV_MI_OFFSET::write(0x40); // 2_3b 0x40 for mix, 0x00 to test + //GBS::MADPT_MO_ADP_UV_EN::write(1); // 2_16 5 (try to do this some other way?) + + GBS::DIAG_BOB_PLDY_RAM_BYPS::write(0); // 2_00 7 enabled, looks better + GBS::MADPT_PD_RAM_BYPS::write(0); // 2_24 2 + GBS::RFF_YUV_DEINTERLACE::write(1); // scanline fix 2 + GBS::MADPT_Y_MI_DET_BYPS::write(1); // make sure, so that mixing works + //GBS::VDS_Y_GAIN::write(GBS::VDS_Y_GAIN::read() + 0x30); // more luma gain + //GBS::VDS_Y_OFST::write(GBS::VDS_Y_OFST::read() + 4); + GBS::VDS_WLEV_GAIN::write(0x08); // 3_58 + GBS::VDS_W_LEV_BYPS::write(0); // brightness + GBS::MADPT_VIIR_COEF::write(0x08); // 2_27 VIIR filter strength + GBS::MADPT_Y_MI_OFFSET::write(uopt->scanlineStrength); // 2_0b offset (mixing factor here) + GBS::MADPT_VIIR_BYPS::write(0); // 2_26 6 VIIR line fifo // 1 = off + GBS::RFF_LINE_FLIP::write(1); // clears potential garbage in rff buffer + + GBS::MAPDT_VT_SEL_PRGV::write(0); + GBS::GBS_OPTION_SCANLINES_ENABLED::write(1); + } + rto->scanlinesEnabled = 1; +} + +void disableScanlines() { + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 1) { + //SerialM.println("disableScanlines())"); + GBS::MAPDT_VT_SEL_PRGV::write(1); + + //// following lines set up UV deinterlacer (on top of normal Y) + //GBS::MADPT_UVDLY_PD_SP::write(4); // 2_39 0..3 + //GBS::MADPT_UVDLY_PD_ST::write(4); // 2_39 4..77 + //GBS::MADPT_EN_UV_DEINT::write(0); // 2_3a 0 + //GBS::MADPT_UV_MI_DET_BYPS::write(0); // 2_3a 7 enables 2_3b adjust + //GBS::MADPT_UV_MI_OFFSET::write(4); // 2_3b + //GBS::MADPT_MO_ADP_UV_EN::write(0); // 2_16 5 + + GBS::DIAG_BOB_PLDY_RAM_BYPS::write(1); // 2_00 7 + GBS::VDS_W_LEV_BYPS::write(1); // brightness + //GBS::VDS_Y_GAIN::write(GBS::VDS_Y_GAIN::read() - 0x30); + //GBS::VDS_Y_OFST::write(GBS::VDS_Y_OFST::read() - 4); + GBS::MADPT_Y_MI_OFFSET::write(0xff); // 2_0b offset 0xff disables mixing + GBS::MADPT_VIIR_BYPS::write(1); // 2_26 6 disable VIIR + GBS::MADPT_PD_RAM_BYPS::write(1); + GBS::RFF_LINE_FLIP::write(0); // back to default + + GBS::GBS_OPTION_SCANLINES_ENABLED::write(0); + } + rto->scanlinesEnabled = 0; +} + +void enableMotionAdaptDeinterlace() { + freezeVideo(); + GBS::DEINT_00::write(0x19); // 2_00 // bypass angular (else 0x00) + GBS::MADPT_Y_MI_OFFSET::write(0x00); // 2_0b // also used for scanline mixing + //GBS::MADPT_STILL_NOISE_EST_EN::write(1); // 2_0A 5 (was 0 before) + GBS::MADPT_Y_MI_DET_BYPS::write(0); //2_0a_7 // switch to automatic motion indexing + //GBS::MADPT_UVDLY_PD_BYPS::write(0); // 2_35_5 // UVDLY + //GBS::MADPT_EN_UV_DEINT::write(0); // 2_3a 0 + //GBS::MADPT_EN_STILL_FOR_NRD::write(1); // 2_3a 3 (new) + + if (rto->videoStandardInput == 1) + GBS::MADPT_VTAP2_COEFF::write(6); // 2_19 vertical filter + if (rto->videoStandardInput == 2) + GBS::MADPT_VTAP2_COEFF::write(4); + + //GBS::RFF_WFF_STA_ADDR_A::write(0); + //GBS::RFF_WFF_STA_ADDR_B::write(1); + GBS::RFF_ADR_ADD_2::write(1); + GBS::RFF_REQ_SEL::write(3); + //GBS::RFF_MASTER_FLAG::write(0x24); // use preset's value + //GBS::WFF_SAFE_GUARD::write(0); // 4_42 3 + GBS::RFF_FETCH_NUM::write(0x80); // part of RFF disable fix, could leave 0x80 always otherwise + GBS::RFF_WFF_OFFSET::write(0x100); // scanline fix + GBS::RFF_YUV_DEINTERLACE::write(0); // scanline fix 2 + GBS::WFF_FF_STA_INV::write(0); // 4_42_2 // 22.03.19 : turned off // update: only required in PAL? + //GBS::WFF_LINE_FLIP::write(0); // 4_4a_4 // 22.03.19 : turned off // update: only required in PAL? + GBS::WFF_ENABLE::write(1); // 4_42 0 // enable before RFF + GBS::RFF_ENABLE::write(1); // 4_4d 7 + //delay(60); // 55 first good + unfreezeVideo(); + delay(60); + GBS::MAPDT_VT_SEL_PRGV::write(0); // 2_16_7 + rto->motionAdaptiveDeinterlaceActive = true; +} + +void disableMotionAdaptDeinterlace() { + GBS::MAPDT_VT_SEL_PRGV::write(1); // 2_16_7 + GBS::DEINT_00::write(0xff); // 2_00 + + GBS::RFF_FETCH_NUM::write(0x1); // RFF disable fix + GBS::RFF_WFF_OFFSET::write(0x1); // RFF disable fix + delay(2); + GBS::WFF_ENABLE::write(0); + GBS::RFF_ENABLE::write(0); // can cause mem reset requirement, procedure above should fix it + + //GBS::WFF_ADR_ADD_2::write(0); + GBS::WFF_FF_STA_INV::write(1); // 22.03.19 : turned off // update: only required in PAL? + //GBS::WFF_LINE_FLIP::write(1); // 22.03.19 : turned off // update: only required in PAL? + GBS::MADPT_Y_MI_OFFSET::write(0x7f); + //GBS::MADPT_STILL_NOISE_EST_EN::write(0); // new + GBS::MADPT_Y_MI_DET_BYPS::write(1); + //GBS::MADPT_UVDLY_PD_BYPS::write(1); // 2_35_5 + //GBS::MADPT_EN_UV_DEINT::write(0); // 2_3a 0 + //GBS::MADPT_EN_STILL_FOR_NRD::write(0); // 2_3a 3 (new) + rto->motionAdaptiveDeinterlaceActive = false; +} + +boolean snapToIntegralFrameRate(void) { + + // Fetch the current output frame rate + float ofr = getOutputFrameRate(); + + if (ofr < 1.0f) { + delay(1); + ofr = getOutputFrameRate(); + } + + float target; + if (ofr > 56.5f && ofr < 64.5f) { + target = 60.0f; // NTSC like + } + else if (ofr > 46.5f && ofr < 54.5f) { + target = 50.0f; // PAL like + } + else { + // too far out of spec for an auto adjust + SerialM.println(F("out of bounds")); + return false; + } + + SerialM.print(F("Snap to ")); SerialM.print(target, 1); // precission 1 + SerialM.println("Hz"); + + // We'll be adjusting the htotal incrementally, so store current and best match. + uint16_t currentHTotal = GBS::VDS_HSYNC_RST::read(); + uint16_t closestHTotal = currentHTotal; + + // What's the closest we've been to the frame rate? + float closestDifference = fabs(target - ofr); + + // Repeatedly adjust htotals until we find the closest match. + for (;;) { + + delay(0); + + // Try to move closer to the desired framerate. + if (target > ofr) { + if (currentHTotal > 0 && applyBestHTotal(currentHTotal - 1)) { + --currentHTotal; + } + else { + return false; + } + } + else if (target < ofr) { + if (currentHTotal < 4095 && applyBestHTotal(currentHTotal + 1)) { + ++currentHTotal; + } + else { + return false; + } + } + else { + return true; + } + + // Are we closer? + ofr = getOutputFrameRate(); + + if (ofr < 1.0f) { + delay(1); + ofr = getOutputFrameRate(); + } + if (ofr < 1.0f) { + return false; + } + + // If we're getting closer, continue trying, otherwise break out of the test loop. + float newDifference = fabs(target - ofr); + if (newDifference < closestDifference) { + closestDifference = newDifference; + closestHTotal = currentHTotal; + } + else { + break; + } + } + + // Reapply the closest htotal if need be. + if (closestHTotal != currentHTotal) { + applyBestHTotal(closestHTotal); + } + + return true; + +} + +void printInfo() { + static char print[114]; // 108 + 1 minimum + static uint8_t clearIrqCounter = 0; + static uint8_t lockCounterPrevious = 0; + uint8_t lockCounter = 0; + + int32_t wifi = 0; + if ((WiFi.status() == WL_CONNECTED) || (WiFi.getMode() == WIFI_AP)) + { + wifi = WiFi.RSSI(); + } + + uint16_t hperiod = GBS::HPERIOD_IF::read(); + uint16_t vperiod = GBS::VPERIOD_IF::read(); + uint8_t stat0FIrq = GBS::STATUS_0F::read(); + char HSp = GBS::STATUS_SYNC_PROC_HSPOL::read() ? '+' : '-'; // 0 = neg, 1 = pos + char VSp = GBS::STATUS_SYNC_PROC_VSPOL::read() ? '+' : '-'; // 0 = neg, 1 = pos + char h = 'H', v = 'V'; + if (!GBS::STATUS_SYNC_PROC_HSACT::read()) { + h = HSp = ' '; + } + if (!GBS::STATUS_SYNC_PROC_VSACT::read()) { + v = VSp = ' '; + } + + //int charsToPrint = + sprintf(print, "h:%4u v:%4u PLL:%01u A:%02x%02x%02x S:%02x.%02x.%02x %c%c%c%c I:%02x D:%04x m:%hu ht:%4d vt:%4d hpw:%4d u:%3x s:%2x S:%2d W:%2d\n", + hperiod, vperiod, lockCounterPrevious, + GBS::ADC_RGCTRL::read(), GBS::ADC_GGCTRL::read(), GBS::ADC_BGCTRL::read(), + GBS::STATUS_00::read(), GBS::STATUS_05::read(), GBS::SP_CS_0x3E::read(), + h, HSp, v, VSp, stat0FIrq, GBS::TEST_BUS::read(), getVideoMode(), + GBS::STATUS_SYNC_PROC_HTOTAL::read(), GBS::STATUS_SYNC_PROC_VTOTAL::read() /*+ 1*/, // emucrt: without +1 is correct line count + GBS::STATUS_SYNC_PROC_HLOW_LEN::read(), rto->noSyncCounter, rto->continousStableCounter, + rto->currentLevelSOG, wifi); + + //SerialM.print("charsToPrint: "); SerialM.println(charsToPrint); + SerialM.print(print); + + if (stat0FIrq != 0x00) { + // clear 0_0F interrupt bits regardless of syncwatcher status + clearIrqCounter++; + if (clearIrqCounter >= 50) { + clearIrqCounter = 0; + GBS::INTERRUPT_CONTROL_00::write(0xff); // reset irq status + GBS::INTERRUPT_CONTROL_00::write(0x00); + } + } + + yield(); + if (GBS::STATUS_SYNC_PROC_HSACT::read()) { // else source might not be active + for (uint8_t i = 0; i < 9; i++) { + if (GBS::STATUS_MISC_PLLAD_LOCK::read() == 1) { + lockCounter++; + } + else { + for (int i = 0; i < 10; i++) { + if (GBS::STATUS_MISC_PLLAD_LOCK::read() == 1) { + lockCounter++; + break; + } + } + } + } + } + lockCounterPrevious = getMovingAverage(lockCounter); +} + +void stopWire() { + pinMode(SCL, INPUT); + pinMode(SDA, INPUT); + delayMicroseconds(80); +} + +void startWire() { + Wire.begin(); + // The i2c wire library sets pullup resistors on by default. + // Disable these to detect/work with GBS onboard pullups + pinMode(SCL, OUTPUT_OPEN_DRAIN); + pinMode(SDA, OUTPUT_OPEN_DRAIN); + // no issues even at 700k, requires ESP8266 160Mhz CPU clock, else (80Mhz) uses 400k in library + // no problem with Si5351 at 700k either + Wire.setClock(400000); + //Wire.setClock(700000); +} + +void fastSogAdjust() +{ + if (rto->noSyncCounter <= 5) { + uint8_t debug_backup = GBS::TEST_BUS_SEL::read(); + uint8_t debug_backup_SP = GBS::TEST_BUS_SP_SEL::read(); + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(0xa); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(0x0f); + } + + if ((GBS::TEST_BUS_2F::read() & 0x05) != 0x05) { + while ((GBS::TEST_BUS_2F::read() & 0x05) != 0x05) { + if (rto->currentLevelSOG >= 4) { + rto->currentLevelSOG -= 2; + } + else { + rto->currentLevelSOG = 13; + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(40); + break; // abort / restart next round + } + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(28); // 4 + } + delay(10); + } + + if (debug_backup != 0xa) { + GBS::TEST_BUS_SEL::write(debug_backup); + } + if (debug_backup_SP != 0x0f) { + GBS::TEST_BUS_SP_SEL::write(debug_backup_SP); + } + } +} + +void runSyncWatcher() +{ + if (!rto->boardHasPower) { + return; + } + + static uint8_t newVideoModeCounter = 0; + static uint16_t activeStableLineCount = 0; + static unsigned long lastSyncDrop = millis(); + static unsigned long lastLineCountMeasure = millis(); + + uint16_t thisStableLineCount = 0; + uint8_t detectedVideoMode = getVideoMode(); + boolean status16SpHsStable = getStatus16SpHsStable(); + + if (rto->outModeHdBypass && status16SpHsStable) { + if (videoStandardInputIsPalNtscSd()) { + if (millis() - lastLineCountMeasure > 765) { + thisStableLineCount = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + for (uint8_t i = 0; i < 3; i++) { + delay(2); + if (GBS::STATUS_SYNC_PROC_VTOTAL::read() < (thisStableLineCount - 3) || + GBS::STATUS_SYNC_PROC_VTOTAL::read() > (thisStableLineCount + 3)) + { + thisStableLineCount = 0; + break; + } + } + + if (thisStableLineCount != 0) { + if (thisStableLineCount < (activeStableLineCount - 3) || + thisStableLineCount >(activeStableLineCount + 3)) + { + activeStableLineCount = thisStableLineCount; + if (activeStableLineCount < 230 || activeStableLineCount > 340) { + // only doing NTSC/PAL currently, an unusual line count probably means a format change + setCsVsStart(1); + if (getCsVsStop() == 1) { setCsVsStop(2); } + // MD likes to get stuck as usual + nudgeMD(); + } + else { + setCsVsStart(thisStableLineCount - 9); + } + + Serial.printf("HDBypass CsVsSt: %d\n", getCsVsStart()); + delay(150); + } + } + + lastLineCountMeasure = millis(); + } + } + } + + if (rto->videoStandardInput == 13) { // using flaky graphic modes + if (detectedVideoMode == 0) { + if (GBS::STATUS_INT_SOG_BAD::read() == 0) { + detectedVideoMode = 13; // then keep it + } + } + } + + static unsigned long preemptiveSogWindowStart = millis(); + static const uint16_t sogWindowLen = 3000; // ms + static uint16_t badHsActive = 0; + static boolean lastAdjustWasInActiveWindow = 0; + + if (rto->syncTypeCsync && !rto->inputIsYpBpR && (newVideoModeCounter == 0)) { + // look for SOG instability + if (GBS::STATUS_INT_SOG_BAD::read() == 1 || GBS::STATUS_INT_SOG_SW::read() == 1) { + resetInterruptSogSwitchBit(); + if ((millis() - preemptiveSogWindowStart) > sogWindowLen) { + // start new window + preemptiveSogWindowStart = millis(); + badHsActive = 0; + } + lastVsyncLock = millis(); // best reset this + } + + if ((millis() - preemptiveSogWindowStart) < sogWindowLen) { + for (uint8_t i = 0; i < 16; i++) { + if (GBS::STATUS_INT_SOG_BAD::read() == 1 || GBS::STATUS_SYNC_PROC_HSACT::read() == 0) + { + resetInterruptSogBadBit(); + uint16_t hlowStart = GBS::STATUS_SYNC_PROC_HLOW_LEN::read(); + if (rto->videoStandardInput == 0) hlowStart = 777; // fix initial state no HLOW_LEN + for (int a = 0; a < 20; a++) { + if (GBS::STATUS_SYNC_PROC_HLOW_LEN::read() != hlowStart) { + // okay, source still active so count this one, break back to outer for loop + badHsActive++; + lastVsyncLock = millis(); // delay this + //Serial.print(badHsActive); Serial.print(" "); + break; + } + } + } + if ((i % 3) == 0) { delay(1); } + else { delay(0); } + } + + if (badHsActive >= 17) { + if (rto->currentLevelSOG >= 2) { + rto->currentLevelSOG -= 1; + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(30); + updateSpDynamic(0); + badHsActive = 0; + lastAdjustWasInActiveWindow = 1; + } + else if (badHsActive > 40) { + optimizeSogLevel(); + badHsActive = 0; + lastAdjustWasInActiveWindow = 1; + } + preemptiveSogWindowStart = millis(); // restart window + } + } + else if (lastAdjustWasInActiveWindow) { + lastAdjustWasInActiveWindow = 0; + if (rto->currentLevelSOG >= 8) { + rto->currentLevelSOG -= 1; + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(30); + updateSpDynamic(0); + badHsActive = 0; + rto->phaseIsSet = 0; + } + } + } + + if ((detectedVideoMode == 0 || !status16SpHsStable) && rto->videoStandardInput != 15) + { + rto->noSyncCounter++; + rto->continousStableCounter = 0; + lastVsyncLock = millis(); // best reset this + if (rto->noSyncCounter == 1) { + freezeVideo(); + return; // do nothing else + } + + rto->phaseIsSet = 0; + + if (rto->noSyncCounter <= 3 || GBS::STATUS_SYNC_PROC_HSACT::read() == 0) { + freezeVideo(); + } + + if (newVideoModeCounter == 0) { + LEDOFF; // LEDOFF on sync loss + + if (rto->noSyncCounter == 2) { // this usually repeats + //printInfo(); printInfo(); SerialM.println(); + //rto->printInfos = 0; + if ((millis() - lastSyncDrop) > 1500) { // minimum space between runs + if (rto->printInfos == false) { + SerialM.print("\n."); + } + } + else { + if (rto->printInfos == false) { + SerialM.print("."); + } + } + + // if sog is lowest, adjust up + if (rto->currentLevelSOG <= 1 && videoStandardInputIsPalNtscSd()) { + rto->currentLevelSOG += 1; + setAndUpdateSogLevel(rto->currentLevelSOG); + delay(30); + } + lastSyncDrop = millis(); // restart timer + } + } + + if (rto->noSyncCounter == 8) { + GBS::SP_H_CST_ST::write(0x10); + GBS::SP_H_CST_SP::write(0x100); + //GBS::SP_H_PROTECT::write(1); // at noSyncCounter = 32 will alternate on / off + if (videoStandardInputIsPalNtscSd()) { + // this can early detect mode changes (before updateSpDynamic resets all) + GBS::SP_PRE_COAST::write(9); + GBS::SP_POST_COAST::write(9); + // new: test SD<>EDTV changes + uint8_t ignore = GBS::SP_H_PULSE_IGNOR::read(); + if (ignore >= 0x33) { + GBS::SP_H_PULSE_IGNOR::write(ignore / 2); + } + } + rto->coastPositionIsSet = 0; + } + + if (rto->noSyncCounter % 27 == 0) { + // the * check needs to be first (go before auto sog level) to support SD > HDTV detection + SerialM.print("*"); + updateSpDynamic(1); + } + + if (rto->noSyncCounter % 32 == 0) { + if (GBS::STATUS_SYNC_PROC_HSACT::read() == 1) { + unfreezeVideo(); + } + else { + freezeVideo(); + } + } + + if (rto->inputIsYpBpR && (rto->noSyncCounter == 34)) { + GBS::SP_NO_CLAMP_REG::write(1); // unlock clamp + rto->clampPositionIsSet = false; + } + + if (rto->noSyncCounter == 38) { + nudgeMD(); + } + + if (rto->syncTypeCsync) { + if (rto->noSyncCounter > 47) { + if (rto->noSyncCounter % 16 == 0) { + GBS::SP_H_PROTECT::write(!GBS::SP_H_PROTECT::read()); + } + } + } + + if (rto->noSyncCounter % 150 == 0) { + if (rto->noSyncCounter == 150 || rto->noSyncCounter % 900 == 0) { + SerialM.print("\nno signal\n"); + // check whether discrete VSync is present. if so, need to go to input detect + uint8_t extSyncBackup = GBS::SP_EXT_SYNC_SEL::read(); + GBS::SP_EXT_SYNC_SEL::write(0); + delay(240); + printInfo(); + if (GBS::STATUS_SYNC_PROC_VSACT::read() == 1) { + delay(10); + if (GBS::STATUS_SYNC_PROC_VSACT::read() == 1) { + rto->noSyncCounter = 0x07fe; + } + } + GBS::SP_EXT_SYNC_SEL::write(extSyncBackup); + } + GBS::SP_H_COAST::write(0); // 5_3e 2 + GBS::SP_H_PROTECT::write(0); // 5_3e 4 + GBS::SP_H_CST_ST::write(0x10); + GBS::SP_H_CST_SP::write(0x100); // instead of disabling 5_3e 5 coast + GBS::SP_CS_CLP_ST::write(32); // neutral clamp values + GBS::SP_CS_CLP_SP::write(48); // + updateSpDynamic(1); + nudgeMD(); // can fix MD not noticing a line count update + delay(80); + + // prepare optimizeSogLevel + // use STATUS_SYNC_PROC_HLOW_LEN changes to determine whether source is still active + uint16_t hlowStart = GBS::STATUS_SYNC_PROC_HLOW_LEN::read(); + if (GBS::PLLAD_VCORST::read() == 1) { + // exception: we're in startup and pllad isn't locked yet > HLOW_LEN always 0 + hlowStart = 777; // now it'll run optimizeSogLevel if needed + } + for (int a = 0; a < 128; a++) { + if (GBS::STATUS_SYNC_PROC_HLOW_LEN::read() != hlowStart) { + // source still there + if (rto->noSyncCounter % 450 == 0) { + rto->currentLevelSOG = 0; // worst case, sometimes necessary, will be unstable but at least detect + setAndUpdateSogLevel(rto->currentLevelSOG); + } + else { + optimizeSogLevel(); + } + break; + } + else if (a == 127) { + // set sog to be able to see something + rto->currentLevelSOG = 5; + setAndUpdateSogLevel(rto->currentLevelSOG); + } + delay(0); + } + + resetSyncProcessor(); + delay(8); + resetModeDetect(); + delay(8); + } + + // long no signal time, check other input + if (rto->noSyncCounter % 413 == 0) { + if (GBS::ADC_INPUT_SEL::read() == 1) { GBS::ADC_INPUT_SEL::write(0); } + else { GBS::ADC_INPUT_SEL::write(1); } + delay(40); + unsigned long timeout = millis(); + while (millis() - timeout <= 210) { + if (getStatus16SpHsStable()) { + rto->noSyncCounter = 0x07fe; // will cause a return + break; + } + handleWiFi(0); + delay(1); + } + + if (millis() - timeout > 210) { + if (GBS::ADC_INPUT_SEL::read() == 1) { GBS::ADC_INPUT_SEL::write(0); } + else { GBS::ADC_INPUT_SEL::write(1); } + } + } + + newVideoModeCounter = 0; + // sog unstable check end + } + + // if format changed to valid, potentially new video mode + if (((detectedVideoMode != 0 && detectedVideoMode != rto->videoStandardInput) || + (detectedVideoMode != 0 && rto->videoStandardInput == 0)) && + rto->videoStandardInput != 15) + { + // before thoroughly checking for a mode change, watch format via newVideoModeCounter + if (newVideoModeCounter < 255) { + newVideoModeCounter++; + rto->continousStableCounter = 0; // usually already 0, but occasionally not + if (newVideoModeCounter > 1) { // help debug a few commits worth + if (newVideoModeCounter == 2) { + SerialM.println(); + } + SerialM.print(newVideoModeCounter); + } + if (newVideoModeCounter == 3) { + freezeVideo(); + GBS::SP_H_CST_ST::write(0x10); + GBS::SP_H_CST_SP::write(0x100); + rto->coastPositionIsSet = 0; + delay(10); + if (getVideoMode() == 0) { + updateSpDynamic(1); // check ntsc to 480p and back + delay(40); + } + } + } + + if (newVideoModeCounter >= 8) + { + uint8_t vidModeReadout = 0; + SerialM.print(F("\nFormat change:")); + for (int a = 0; a < 30; a++) { + vidModeReadout = getVideoMode(); + if (vidModeReadout == 13) { newVideoModeCounter = 5; } // treat ps2 quasi rgb as stable + if (vidModeReadout != detectedVideoMode) { newVideoModeCounter = 0; } + } + if (newVideoModeCounter != 0) { + // apply new mode + SerialM.print(" "); SerialM.print(vidModeReadout); + SerialM.println(F(" ")); + //Serial.print("Old: "); Serial.print(rto->videoStandardInput); + //Serial.print(" New: "); Serial.println(detectedVideoMode); + rto->videoIsFrozen = false; + + if (GBS::SP_SOG_MODE::read() == 1) { rto->syncTypeCsync = true; } + else { rto->syncTypeCsync = false; } + boolean wantPassThroughMode = uopt->presetPreference == 10; + + if (((rto->videoStandardInput == 1 || rto->videoStandardInput == 3) && (detectedVideoMode == 2 || detectedVideoMode == 4)) || + rto->videoStandardInput == 0 || + ((rto->videoStandardInput == 2 || rto->videoStandardInput == 4) && (detectedVideoMode == 1 || detectedVideoMode == 3))) + { + rto->useHdmiSyncFix = 1; + //SerialM.println("hdmi sync fix: yes"); + } + else { + rto->useHdmiSyncFix = 0; + //SerialM.println("hdmi sync fix: no"); + } + + if (!wantPassThroughMode) + { + // needs to know the sync type for early updateclamp (set above) + applyPresets(detectedVideoMode); + } + else + { + rto->videoStandardInput = detectedVideoMode; + setOutModeHdBypass(); + } + rto->videoStandardInput = detectedVideoMode; + rto->noSyncCounter = 0; + rto->continousStableCounter = 0; // also in postloadsteps + newVideoModeCounter = 0; + activeStableLineCount = 0; + delay(20); // post delay + badHsActive = 0; + preemptiveSogWindowStart = millis(); + } + else { + unfreezeVideo(); // (whops) + SerialM.print(" "); SerialM.print(vidModeReadout); + SerialM.println(F(" ")); + printInfo(); + newVideoModeCounter = 0; + if (rto->videoStandardInput == 0) { + // if we got here from standby mode, return there soon + // but occasionally, this is a regular new mode that needs a SP parameter change to work + // ie: 1080p needs longer post coast, which the syncwatcher loop applies at some point + rto->noSyncCounter = 0x05ff; // give some time in normal loop + } + } + } + } + else if (getStatus16SpHsStable() && detectedVideoMode != 0 && rto->videoStandardInput != 15 + && (rto->videoStandardInput == detectedVideoMode)) + { + // last used mode reappeared / stable again + if (rto->continousStableCounter < 255) { + rto->continousStableCounter++; + } + + static boolean doFullRestore = 0; + if (rto->noSyncCounter >= 150) { + // source was gone for longer // clamp will be updated at continousStableCounter 50 + rto->coastPositionIsSet = false; + rto->phaseIsSet = false; + FrameSync::reset(uopt->frameTimeLockMethod); + doFullRestore = 1; + SerialM.println(); + } + + rto->noSyncCounter = 0; + newVideoModeCounter = 0; + + if (rto->continousStableCounter == 1 && !doFullRestore) { + rto->videoIsFrozen = true; // ensures unfreeze + unfreezeVideo(); + } + + if (rto->continousStableCounter == 2) { + updateSpDynamic(0); + if (doFullRestore) { + delay(20); + optimizeSogLevel(); + doFullRestore = 0; + } + rto->videoIsFrozen = true; // ensures unfreeze + unfreezeVideo(); // called 2nd time here to make sure + } + + if (rto->continousStableCounter == 4) { + LEDON; + } + + if (!rto->phaseIsSet) { + if (rto->continousStableCounter >= 10 && rto->continousStableCounter < 61) { + // added < 61 to make a window, else sources with little pll lock hammer this + if ((rto->continousStableCounter % 10) == 0) { + rto->phaseIsSet = optimizePhaseSP(); + } + } + } + + // 5_3e 2 SP_H_COAST test + //if (rto->continousStableCounter == 11) { + // if (rto->coastPositionIsSet) { + // GBS::SP_H_COAST::write(1); + // } + //} + + if (rto->continousStableCounter == 160) { + resetInterruptSogBadBit(); + } + + if (rto->continousStableCounter == 45) { + GBS::ADC_UNUSED_67::write(0); // clear sync fix temp registers (67/68) + //rto->coastPositionIsSet = 0; // leads to a flicker + rto->clampPositionIsSet = 0; // run updateClampPosition occasionally + } + + if (rto->continousStableCounter % 31 == 0) { + // new: 8 regular interval checks up until 255 + updateSpDynamic(0); + } + + if (rto->continousStableCounter >= 3) { + if ((rto->videoStandardInput == 1 || rto->videoStandardInput == 2) && + !rto->outModeHdBypass && rto->noSyncCounter == 0) + { + // deinterlacer and scanline code + static uint8_t timingAdjustDelay = 0; + static uint8_t oddEvenWhenArmed = 0; + boolean preventScanlines = 0; + + if (rto->deinterlaceAutoEnabled) { + uint16_t VPERIOD_IF = GBS::VPERIOD_IF::read(); + static uint8_t filteredLineCountMotionAdaptiveOn = 0, filteredLineCountMotionAdaptiveOff = 0; + static uint16_t VPERIOD_IF_OLD = VPERIOD_IF; // for glitch filter + + if (VPERIOD_IF_OLD != VPERIOD_IF) { + //freezeVideo(); // glitch filter + preventScanlines = 1; + filteredLineCountMotionAdaptiveOn = 0; + filteredLineCountMotionAdaptiveOff = 0; + if (uopt->enableFrameTimeLock || rto->extClockGenDetected) { + if (uopt->deintMode == 1) { // using bob + timingAdjustDelay = 11; // arm timer (always) + oddEvenWhenArmed = VPERIOD_IF % 2; + } + } + } + + if (VPERIOD_IF == 522 || VPERIOD_IF == 524 || VPERIOD_IF == 526 || + VPERIOD_IF == 622 || VPERIOD_IF == 624 || VPERIOD_IF == 626) + { // ie v:524, even counts > enable + filteredLineCountMotionAdaptiveOn++; + filteredLineCountMotionAdaptiveOff = 0; + if (filteredLineCountMotionAdaptiveOn >= 2) // at least >= 2 + { + if (uopt->deintMode == 0 && !rto->motionAdaptiveDeinterlaceActive) { + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 1) { // don't rely on rto->scanlinesEnabled + disableScanlines(); + } + enableMotionAdaptDeinterlace(); + if (timingAdjustDelay == 0) { + timingAdjustDelay = 11; // arm timer only if it's not already armed + oddEvenWhenArmed = VPERIOD_IF % 2; + } + else { + timingAdjustDelay = 0; // cancel timer + } + preventScanlines = 1; + } + filteredLineCountMotionAdaptiveOn = 0; + } + } + else if (VPERIOD_IF == 521 || VPERIOD_IF == 523 || VPERIOD_IF == 525 || + VPERIOD_IF == 623 || VPERIOD_IF == 625 || VPERIOD_IF == 627) + { // ie v:523, uneven counts > disable + filteredLineCountMotionAdaptiveOff++; + filteredLineCountMotionAdaptiveOn = 0; + if (filteredLineCountMotionAdaptiveOff >= 2) // at least >= 2 + { + if (uopt->deintMode == 0 && rto->motionAdaptiveDeinterlaceActive) { + disableMotionAdaptDeinterlace(); + if (timingAdjustDelay == 0) { + timingAdjustDelay = 11; // arm timer only if it's not already armed + oddEvenWhenArmed = VPERIOD_IF % 2; + } + else { + timingAdjustDelay = 0; // cancel timer + } + } + filteredLineCountMotionAdaptiveOff = 0; + } + } + else { + filteredLineCountMotionAdaptiveOn = filteredLineCountMotionAdaptiveOff = 0; + } + + VPERIOD_IF_OLD = VPERIOD_IF; // part of glitch filter + + if (uopt->deintMode == 1) { // using bob + if (rto->motionAdaptiveDeinterlaceActive) { + disableMotionAdaptDeinterlace(); + FrameSync::reset(uopt->frameTimeLockMethod); + GBS::GBS_RUNTIME_FTL_ADJUSTED::write(1); + lastVsyncLock = millis(); + } + if (uopt->wantScanlines && !rto->scanlinesEnabled) { + enableScanlines(); + } + else if (!uopt->wantScanlines && rto->scanlinesEnabled) { + disableScanlines(); + } + } + + // timing adjust after a few stable cycles + // should arrive here with either odd or even VPERIOD_IF + /*if (timingAdjustDelay != 0) { + Serial.print(timingAdjustDelay); Serial.print(" "); + }*/ + if (timingAdjustDelay != 0) { + if ((VPERIOD_IF % 2) == oddEvenWhenArmed) { + timingAdjustDelay--; + if (timingAdjustDelay == 0) { + if (uopt->enableFrameTimeLock) { + FrameSync::reset(uopt->frameTimeLockMethod); + GBS::GBS_RUNTIME_FTL_ADJUSTED::write(1); + delay(10); + lastVsyncLock = millis(); + } + externalClockGenSyncInOutRate(); + } + } + /*else { + Serial.println("!!!"); + }*/ + } + } + + // scanlines + if (uopt->wantScanlines) { + if (!rto->scanlinesEnabled && !rto->motionAdaptiveDeinterlaceActive && !preventScanlines) + { + enableScanlines(); + } + else if (!uopt->wantScanlines && rto->scanlinesEnabled) { + disableScanlines(); + } + } + } + } + } + + if (rto->videoStandardInput >= 14) { // RGBHV checks + static uint16_t RGBHVNoSyncCounter = 0; + + if (uopt->preferScalingRgbhv && rto->continousStableCounter >= 2) + { + boolean needPostAdjust = 0; + static uint16_t activePresetLineCount = 0; + // is the source in range for scaling RGBHV and is it currently in mode 15? + uint16 sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); // if sourceLines = 0, might be in some reset state + if ((sourceLines <= 535 && sourceLines != 0) && rto->videoStandardInput == 15) { + uint16_t firstDetectedSourceLines = sourceLines; + boolean moveOn = 1; + for (int i = 0; i < 30; i++) { // not the best check, but we don't want to try if this is not stable (usually is though) + sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + // range needed for interlace + if ((sourceLines < firstDetectedSourceLines - 3) || (sourceLines > firstDetectedSourceLines + 3)) { + moveOn = 0; + break; + } + delay(10); + } + if (moveOn) { + SerialM.println(F(" RGB/HV upscale mode")); + rto->isValidForScalingRGBHV = true; + GBS::GBS_OPTION_SCALING_RGBHV::write(1); + rto->autoBestHtotalEnabled = 1; + + if (rto->syncTypeCsync == false) + { + GBS::SP_SOG_MODE::write(0); + GBS::SP_NO_COAST_REG::write(1); + GBS::ADC_5_00::write(0x10); // 5_00 might be required + GBS::PLL_IS::write(0); // 0_40 2: this provides a clock for IF and test bus readings + GBS::PLL_VCORST::write(1); // 0_43 5: also required for clock + delay(320); // min 250 + } + else { + GBS::SP_SOG_MODE::write(1); + GBS::SP_H_CST_ST::write(0x10); // 5_4d // set some default values + GBS::SP_H_CST_SP::write(0x80); // will be updated later + GBS::SP_H_PROTECT::write(1); // some modes require this (or invert SOG) + } + delay(4); + + float sourceRate = getSourceFieldRate(1); + Serial.println(sourceRate); + + // todo: this hack is hard to understand when looking at applypreset and mode is suddenly 1,2 or 3 + if (uopt->presetPreference == 2) { + // custom preset defined, try to load (set mode = 14 here early) + rto->videoStandardInput = 14; + } + else { + if (sourceLines < 280) { + // this is "NTSC like?" check, seen 277 lines in "512x512 interlaced (emucrt)" + rto->videoStandardInput = 1; + } + else if (sourceLines < 380) { + // this is "PAL like?" check, seen vt:369 (MDA mode) + rto->videoStandardInput = 2; + } + else if (sourceRate > 44.0f && sourceRate < 53.8f) { + // not low res but PAL = "EDTV" + rto->videoStandardInput = 4; + needPostAdjust = 1; + } + else { // sourceRate > 53.8f + // "60Hz EDTV" + rto->videoStandardInput = 3; + needPostAdjust = 1; + } + } + + if (uopt->presetPreference == 10) { + uopt->presetPreference = 0; // fix presetPreference which can be "bypass" + } + + activePresetLineCount = sourceLines; + applyPresets(rto->videoStandardInput); + + GBS::GBS_OPTION_SCALING_RGBHV::write(1); + GBS::IF_INI_ST::write(16); // fixes pal(at least) interlace + GBS::SP_SOG_P_ATO::write(1); // 5_20 1 auto SOG polarity (now "hpw" should never be close to "ht") + + GBS::SP_SDCS_VSST_REG_L::write(2); // 5_3f + GBS::SP_SDCS_VSSP_REG_L::write(0); // 5_40 + + rto->coastPositionIsSet = rto->clampPositionIsSet = 0; + rto->videoStandardInput = 14; + + if (GBS::PLLAD_ICP::read() >= 6) { + GBS::PLLAD_ICP::write(5); // reduce charge pump current for more general use + latchPLLAD(); delay(40); + } + + updateSpDynamic(1); + if (rto->syncTypeCsync == false) + { + GBS::SP_SOG_MODE::write(0); + GBS::SP_CLAMP_MANUAL::write(1); + GBS::SP_NO_COAST_REG::write(1); + } + else { + GBS::SP_SOG_MODE::write(1); + GBS::SP_H_CST_ST::write(0x10); // 5_4d // set some default values + GBS::SP_H_CST_SP::write(0x80); // will be updated later + GBS::SP_H_PROTECT::write(1); // some modes require this (or invert SOG) + } + delay(300); + + if (rto->extClockGenDetected) { + // switch to ext clock + if (!rto->outModeHdBypass) { + if (GBS::PLL648_CONTROL_01::read() != 0x35 && GBS::PLL648_CONTROL_01::read() != 0x75) { + // first store original in an option byte in 1_2D + GBS::GBS_PRESET_DISPLAY_CLOCK::write(GBS::PLL648_CONTROL_01::read()); + // enable and switch input + Si.enable(0); delayMicroseconds(800); + GBS::PLL648_CONTROL_01::write(0x75); + } + } + // sync clocks now + externalClockGenSyncInOutRate(); + } + + // note: this is all duplicated below. unify! + if (needPostAdjust) { + // base preset was "3" / no line doubling + // info: actually the position needs to be adjusted based on hor. freq or "h:" value (todo!) + GBS::IF_HB_ST2::write(0x08); // patches + GBS::IF_HB_SP2::write(0x68); // image + GBS::IF_HBIN_SP::write(0x50);// position + if (rto->presetID == 0x05) { + GBS::IF_HB_ST2::write(0x480); + GBS::IF_HB_SP2::write(0x8E); + } + + float sfr = getSourceFieldRate(0); + if (sfr >= 69.0) { + SerialM.println("source >= 70Hz"); + // increase vscale; vscale -= 57 seems to hit magic factor often + // 512 + 57 = 569 + 57 = 626 + 57 = 683 + GBS::VDS_VSCALE::write(GBS::VDS_VSCALE::read() - 57); + + } + else { + // 50/60Hz, presumably + // adjust vposition + GBS::IF_VB_SP::write(8); + GBS::IF_VB_ST::write(6); + } + } + } + } + // if currently in scaling RGB/HV, check for "SD" < > "EDTV" style source changes + else if ((sourceLines <= 535 && sourceLines != 0) && rto->videoStandardInput == 14) { + // todo: custom presets? + if (sourceLines < 280 && activePresetLineCount > 280) { + rto->videoStandardInput = 1; + } + else if (sourceLines < 380 && activePresetLineCount > 380) { + rto->videoStandardInput = 2; + } + else if (sourceLines > 380 && activePresetLineCount < 380) { + rto->videoStandardInput = 3; + needPostAdjust = 1; + } + + if (rto->videoStandardInput != 14) { + // check thoroughly first + uint16_t firstDetectedSourceLines = sourceLines; + boolean moveOn = 1; + for (int i = 0; i < 30; i++) { + sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + if ((sourceLines < firstDetectedSourceLines - 3) || (sourceLines > firstDetectedSourceLines + 3)) { + moveOn = 0; + break; + } + delay(10); + } + + if (moveOn) { + // need to change presets + if (rto->videoStandardInput <= 2) { SerialM.println(F(" RGB/HV upscale mode base 15kHz")); } + else { SerialM.println(F(" RGB/HV upscale mode base 31kHz")); } + + if (uopt->presetPreference == 10) { + uopt->presetPreference = 0; // fix presetPreference which can be "bypass" + } + + activePresetLineCount = sourceLines; + applyPresets(rto->videoStandardInput); + + GBS::GBS_OPTION_SCALING_RGBHV::write(1); + GBS::IF_INI_ST::write(16); // fixes pal(at least) interlace + GBS::SP_SOG_P_ATO::write(1); // 5_20 1 auto SOG polarity + + // adjust vposition + GBS::SP_SDCS_VSST_REG_L::write(2); // 5_3f + GBS::SP_SDCS_VSSP_REG_L::write(0); // 5_40 + + rto->coastPositionIsSet = rto->clampPositionIsSet = 0; + rto->videoStandardInput = 14; + + if (GBS::PLLAD_ICP::read() >= 6) { + GBS::PLLAD_ICP::write(5); // reduce charge pump current for more general use + latchPLLAD(); + } + + updateSpDynamic(1); + if (rto->syncTypeCsync == false) + { + GBS::SP_SOG_MODE::write(0); + GBS::SP_CLAMP_MANUAL::write(1); + GBS::SP_NO_COAST_REG::write(1); + } + else { + GBS::SP_SOG_MODE::write(1); + GBS::SP_H_CST_ST::write(0x10); // 5_4d // set some default values + GBS::SP_H_CST_SP::write(0x80); // will be updated later + GBS::SP_H_PROTECT::write(1); // some modes require this (or invert SOG) + } + delay(300); + + if (rto->extClockGenDetected) { + // switch to ext clock + if (!rto->outModeHdBypass) { + if (GBS::PLL648_CONTROL_01::read() != 0x35 && GBS::PLL648_CONTROL_01::read() != 0x75) { + // first store original in an option byte in 1_2D + GBS::GBS_PRESET_DISPLAY_CLOCK::write(GBS::PLL648_CONTROL_01::read()); + // enable and switch input + Si.enable(0); delayMicroseconds(800); + GBS::PLL648_CONTROL_01::write(0x75); + } + } + // sync clocks now + externalClockGenSyncInOutRate(); + } + + // note: this is all duplicated above. unify! + if (needPostAdjust) { + // base preset was "3" / no line doubling + // info: actually the position needs to be adjusted based on hor. freq or "h:" value (todo!) + GBS::IF_HB_ST2::write(0x08); // patches + GBS::IF_HB_SP2::write(0x68); // image + GBS::IF_HBIN_SP::write(0x50);// position + if (rto->presetID == 0x05) { + GBS::IF_HB_ST2::write(0x480); + GBS::IF_HB_SP2::write(0x8E); + } + + float sfr = getSourceFieldRate(0); + if (sfr >= 69.0) { + SerialM.println("source >= 70Hz"); + // increase vscale; vscale -= 57 seems to hit magic factor often + // 512 + 57 = 569 + 57 = 626 + 57 = 683 + GBS::VDS_VSCALE::write(GBS::VDS_VSCALE::read() - 57); + + } + else { + // 50/60Hz, presumably + // adjust vposition + GBS::IF_VB_SP::write(8); + GBS::IF_VB_ST::write(6); + } + } + } + else { + // was unstable, undo videoStandardInput change + rto->videoStandardInput = 14; + } + } + } + // check whether to revert back to full bypass + else if ((sourceLines > 535) && rto->videoStandardInput == 14) { + uint16_t firstDetectedSourceLines = sourceLines; + boolean moveOn = 1; + for (int i = 0; i < 30; i++) { + sourceLines = GBS::STATUS_SYNC_PROC_VTOTAL::read(); + // range needed for interlace + if ((sourceLines < firstDetectedSourceLines - 3) || (sourceLines > firstDetectedSourceLines + 3)) { + moveOn = 0; + break; + } + delay(10); + } + if (moveOn) { + SerialM.println(F(" RGB/HV upscale mode disabled")); + rto->videoStandardInput = 15; + rto->isValidForScalingRGBHV = false; + + activePresetLineCount = 0; + applyPresets(rto->videoStandardInput); // exception: apply preset here, not later in syncwatcher + + delay(300); + } + } + } // done preferScalingRgbhv + + if (!uopt->preferScalingRgbhv && rto->videoStandardInput == 14) { + // user toggled the web ui button / revert scaling rgbhv + rto->videoStandardInput = 15; + rto->isValidForScalingRGBHV = false; + applyPresets(rto->videoStandardInput); + delay(300); + } + + // stability check, for CSync and HV separately + uint16_t limitNoSync = 0; + uint8_t VSHSStatus = 0; + boolean stable = 0; + if (rto->syncTypeCsync == true) { + if (GBS::STATUS_INT_SOG_BAD::read() == 1) { + // STATUS_INT_SOG_BAD = 0x0f bit 0, interrupt reg + resetModeDetect(); + stable = 0; + SerialM.print("`"); + delay(10); + resetInterruptSogBadBit(); + } + else { + stable = 1; + VSHSStatus = GBS::STATUS_00::read(); + // this status can get stuck (regularly does) + stable = ((VSHSStatus & 0x04) == 0x04); // RGBS > check h+v from 0_00 + } + limitNoSync = 200; // 100 + } + else { + VSHSStatus = GBS::STATUS_16::read(); + // this status usually updates when a source goes off + stable = ((VSHSStatus & 0x0a) == 0x0a); // RGBHV > check h+v from 0_16 + limitNoSync = 300; + } + + if (!stable) { + LEDOFF; + RGBHVNoSyncCounter++; + rto->continousStableCounter = 0; + if (RGBHVNoSyncCounter % 20 == 0) { + SerialM.print("`"); + } + } + else { + RGBHVNoSyncCounter = 0; + LEDON; + if (rto->continousStableCounter < 255) { + rto->continousStableCounter++; + if (rto->continousStableCounter == 6) { + updateSpDynamic(1); + } + } + } + + if (RGBHVNoSyncCounter > limitNoSync) { + RGBHVNoSyncCounter = 0; + setResetParameters(); + prepareSyncProcessor(); + resetSyncProcessor(); // todo: fix MD being stuck in last mode when sync disappears + //resetModeDetect(); + rto->noSyncCounter = 0; + //Serial.println("RGBHV limit no sync"); + } + + static unsigned long lastTimeSogAndPllRateCheck = millis(); + if ((millis() - lastTimeSogAndPllRateCheck) > 900) + { + if (rto->videoStandardInput == 15) { + // start out by adjusting sync polarity, may reset sog unstable interrupt flag + updateHVSyncEdge(); delay(100); + } + + static uint8_t runsWithSogBadStatus = 0; + static uint8_t oldHPLLState = 0; + if (rto->syncTypeCsync == false) + { + if (GBS::STATUS_INT_SOG_BAD::read()) { // SOG source unstable indicator + runsWithSogBadStatus++; + //SerialM.print("test: "); SerialM.println(runsWithSogBadStatus); + if (runsWithSogBadStatus >= 4) { + SerialM.println(F("RGB/HV < > SOG")); + rto->syncTypeCsync = true; + rto->HPLLState = runsWithSogBadStatus = RGBHVNoSyncCounter = 0; + rto->noSyncCounter = 0x07fe; // will cause a return + } + } + else { runsWithSogBadStatus = 0; } + } + + uint32_t currentPllRate = 0; + static uint32_t oldPllRate = 10; + + // how fast is the PLL running? needed to set charge pump and gain + // typical: currentPllRate: 1560, currentPllRate: 3999 max seen the pll reach: 5008 for 1280x1024@75 + if (GBS::STATUS_INT_SOG_BAD::read() == 0) { + currentPllRate = getPllRate(); + //Serial.println(currentPllRate); + if (currentPllRate > 100 && currentPllRate < 7500) { + if ((currentPllRate < (oldPllRate - 3)) || (currentPllRate > (oldPllRate + 3))) { + delay(40); + if (GBS::STATUS_INT_SOG_BAD::read() == 1) delay(100); + currentPllRate = getPllRate(); // test again, guards against random spurs + // but don't force currentPllRate to = 0 if these inner checks fail, + // prevents csync <> hvsync changes + if ((currentPllRate < (oldPllRate - 3)) || (currentPllRate > (oldPllRate + 3))) { + oldPllRate = currentPllRate; // okay, it changed + } + } + } + else { currentPllRate = 0; } + } + + resetInterruptSogBadBit(); + + //short activeChargePumpLevel = GBS::PLLAD_ICP::read(); + //short activeGainBoost = GBS::PLLAD_FS::read(); + //SerialM.print(" rto->HPLLState: "); SerialM.println(rto->HPLLState); + //SerialM.print(" currentPllRate: "); SerialM.println(currentPllRate); + //SerialM.print(" CPL: "); SerialM.print(activeChargePumpLevel); + //SerialM.print(" Gain: "); SerialM.print(activeGainBoost); + //SerialM.print(" KS: "); SerialM.print(GBS::PLLAD_KS::read()); + + oldHPLLState = rto->HPLLState; // do this first, else it can miss events + if (currentPllRate != 0) + { + if (currentPllRate < 1030) { rto->HPLLState = 1; } + else if (currentPllRate < 2300) { rto->HPLLState = 2; } + else if (currentPllRate < 3200) { rto->HPLLState = 3; } + else if (currentPllRate < 3800) { rto->HPLLState = 4; } + else { rto->HPLLState = 5; } + } + + if (rto->videoStandardInput == 15) { + if (oldHPLLState != rto->HPLLState) { + if (rto->HPLLState == 1) { + GBS::PLLAD_KS::write(2); // KS = 2 okay + GBS::PLLAD_FS::write(0); + GBS::PLLAD_ICP::write(6); + } + else if (rto->HPLLState == 2) { + GBS::PLLAD_KS::write(1); + GBS::PLLAD_FS::write(0); + GBS::PLLAD_ICP::write(6); + } + else if (rto->HPLLState == 3) { // KS = 1 okay + GBS::PLLAD_KS::write(1); + GBS::PLLAD_FS::write(1); + GBS::PLLAD_ICP::write(6); // would need 7 but this is risky + } + else if (rto->HPLLState == 4) { + GBS::PLLAD_KS::write(0); // KS = 0 from here on + GBS::PLLAD_FS::write(0); + GBS::PLLAD_ICP::write(6); + } + else if (rto->HPLLState == 5) { + GBS::PLLAD_KS::write(0); // KS = 0 + GBS::PLLAD_FS::write(1); + GBS::PLLAD_ICP::write(6); + } + + latchPLLAD(); + delay(2); + setOverSampleRatio(4, false); // false = do apply // will auto decrease to max possible factor + SerialM.print(F("(H-PLL) rate: ")); SerialM.print(currentPllRate); + SerialM.print(F(" state: ")); SerialM.println(rto->HPLLState); + delay(100); + } + } + else if (rto->videoStandardInput == 14) { + if (oldHPLLState != rto->HPLLState) { + SerialM.print(F("(H-PLL) rate: ")); SerialM.print(currentPllRate); + SerialM.print(F(" state (no change): ")); SerialM.println(rto->HPLLState); + // need to manage HPLL state change somehow + + //FrameSync::reset(uopt->frameTimeLockMethod); + } + } + + if (rto->videoStandardInput == 14) { + // scanlines + if (uopt->wantScanlines) { + if (!rto->scanlinesEnabled && !rto->motionAdaptiveDeinterlaceActive) + { + if (GBS::IF_LD_RAM_BYPS::read() == 0) { // line doubler on? + enableScanlines(); + } + } + else if (!uopt->wantScanlines && rto->scanlinesEnabled) { + disableScanlines(); + } + } + } + + rto->clampPositionIsSet = false; // RGBHV should regularly check clamp position + lastTimeSogAndPllRateCheck = millis(); + } + } + + if (rto->noSyncCounter >= 0x07fe) { + // couldn't recover, source is lost + // restore initial conditions and move to input detect + GBS::DAC_RGBS_PWDNZ::write(0); // 0 = disable DAC + rto->noSyncCounter = 0; + SerialM.println(); + goLowPowerWithInputDetection(); // does not further nest, so it can be called here // sets reset parameters + } +} + +boolean checkBoardPower() +{ + GBS::ADC_UNUSED_69::write(0x6a); // 0110 1010 + if (GBS::ADC_UNUSED_69::read() == 0x6a) { + GBS::ADC_UNUSED_69::write(0); + return 1; + } + + GBS::ADC_UNUSED_69::write(0); // attempt to clear + if (rto->boardHasPower == true) { + Serial.println(F("! power / i2c lost !")); + } + + return 0; + + //stopWire(); // sets pinmodes SDA, SCL to INPUT + //uint8_t SCL_SDA = 0; + //for (int i = 0; i < 2; i++) { + // SCL_SDA += digitalRead(SCL); + // SCL_SDA += digitalRead(SDA); + //} + + //if (SCL_SDA != 6) + //{ + // if (rto->boardHasPower == true) { + // Serial.println("! power / i2c lost !"); + // } + // // I2C stays off and pins are INPUT + // return 0; + //} + + //startWire(); + //return 1; +} + +void calibrateAdcOffset() +{ + GBS::PAD_BOUT_EN::write(0); // disable output to pin for test + GBS::PLL648_CONTROL_01::write(0xA5); // display clock to adc = 162mhz + GBS::ADC_INPUT_SEL::write(2); // 10 > R2/G2/B2 as input (not connected, so to isolate ADC) + GBS::DEC_MATRIX_BYPS::write(1); + GBS::DEC_TEST_ENABLE::write(1); + GBS::ADC_5_03::write(0x31); // bottom clamps, filter max (40mhz) + GBS::ADC_TEST_04::write(0x00); // disable bit 1 + GBS::SP_CS_CLP_ST::write(0x00); + GBS::SP_CS_CLP_SP::write(0x00); + GBS::SP_5_56::write(0x05); // SP_SOG_MODE needs to be 1 + GBS::SP_5_57::write(0x80); + GBS::ADC_5_00::write(0x02); + GBS::TEST_BUS_SEL::write(0x0b); // 0x2b + GBS::TEST_BUS_EN::write(1); + resetDigital(); + + uint16_t hitTargetCounter = 0; + uint16_t readout16 = 0; + uint8_t missTargetCounter = 0; + uint8_t readout = 0; + + GBS::ADC_RGCTRL::write(0x7F); + GBS::ADC_GGCTRL::write(0x7F); + GBS::ADC_BGCTRL::write(0x7F); + GBS::ADC_ROFCTRL::write(0x7F); + GBS::ADC_GOFCTRL::write(0x3D); // start + GBS::ADC_BOFCTRL::write(0x7F); + GBS::DEC_TEST_SEL::write(1); // 5_1f = 0x1c + + //unsigned long overallTimer = millis(); + unsigned long startTimer = 0; + for (uint8_t i = 0; i < 3; i++) { + missTargetCounter = 0; hitTargetCounter = 0; + delay(20); + startTimer = millis(); + + // loop breaks either when the timer runs out, or hitTargetCounter reaches target + while ((millis() - startTimer) < 800) { + readout16 = GBS::TEST_BUS::read() & 0x7fff; + //Serial.println(readout16, HEX); + // readout16 is unsigned, always >= 0 + if (readout16 < 7) { + hitTargetCounter++; + missTargetCounter = 0; + } + else if (missTargetCounter++ > 2) { + if (i == 0) { + GBS::ADC_GOFCTRL::write(GBS::ADC_GOFCTRL::read() + 1); // incr. offset + readout = GBS::ADC_GOFCTRL::read(); + Serial.print(" G: "); + } + else if (i == 1) { + GBS::ADC_ROFCTRL::write(GBS::ADC_ROFCTRL::read() + 1); + readout = GBS::ADC_ROFCTRL::read(); + Serial.print(" R: "); + } + else if (i == 2) { + GBS::ADC_BOFCTRL::write(GBS::ADC_BOFCTRL::read() + 1); + readout = GBS::ADC_BOFCTRL::read(); + Serial.print(" B: "); + } + Serial.print(readout, HEX); + + if (readout >= 0x52) { + // some kind of failure + break; + } + + delay(10); + hitTargetCounter = 0; + missTargetCounter = 0; + startTimer = millis(); // extend timer + } + if (hitTargetCounter > 1500) { + break; + } + + } + if (i == 0) { + // G done, prep R + adco->g_off = GBS::ADC_GOFCTRL::read(); + GBS::ADC_GOFCTRL::write(0x7F); + GBS::ADC_ROFCTRL::write(0x3D); + GBS::DEC_TEST_SEL::write(2); // 5_1f = 0x2c + } + if (i == 1) { + adco->r_off = GBS::ADC_ROFCTRL::read(); + GBS::ADC_ROFCTRL::write(0x7F); + GBS::ADC_BOFCTRL::write(0x3D); + GBS::DEC_TEST_SEL::write(3); // 5_1f = 0x3c + } + if (i == 2) { + adco->b_off = GBS::ADC_BOFCTRL::read(); + } + Serial.println(""); + } + + if (readout >= 0x52) { + // there was a problem; revert + adco->r_off = adco->g_off = adco->b_off = 0x40; + } + + GBS::ADC_GOFCTRL::write(adco->g_off); + GBS::ADC_ROFCTRL::write(adco->r_off); + GBS::ADC_BOFCTRL::write(adco->b_off); + + //Serial.println(millis() - overallTimer); +} + +void loadDefaultUserOptions() { + uopt->presetPreference = 0; // #1 + uopt->enableFrameTimeLock = 0; // permanently adjust frame timing to avoid glitch vertical bar. does not work on all displays! + uopt->presetSlot = 0; // + uopt->frameTimeLockMethod = 0; // compatibility with more displays + uopt->enableAutoGain = 0; + uopt->wantScanlines = 0; + uopt->wantOutputComponent = 0; + uopt->deintMode = 0; + uopt->wantVdsLineFilter = 0; + uopt->wantPeaking = 1; + uopt->preferScalingRgbhv = 1; + uopt->wantTap6 = 1; + uopt->PalForce60 = 0; + uopt->matchPresetSource = 1; // #14 + uopt->wantStepResponse = 1; // #15 + uopt->wantFullHeight = 1; // #16 + uopt->enableCalibrationADC = 1; // #17 + uopt->scanlineStrength = 0x30; // #18 + uopt->disableExternalClockGenerator = 0; // #19 +} + +//RF_PRE_INIT() { +// system_phy_set_powerup_option(3); // full RFCAL at boot +//} + +//void preinit() { +// //system_phy_set_powerup_option(3); // 0 = default, use init byte; 3 = full calibr. each boot, extra 200ms +// system_phy_set_powerup_option(0); +//} +void ICACHE_RAM_ATTR isrRotaryEncoder(){ + static unsigned long lastInterruptTime = 0; + unsigned long interruptTime = millis(); + + if(interruptTime - lastInterruptTime > 120){ + if(!digitalRead(pin_data)){ + oled_encoder_pos++; + oled_main_pointer+=15; + oled_sub_pointer+=15; + oled_pointer_count++; + //down = true; + //up = false; + } else { + oled_encoder_pos--; + oled_main_pointer-=15; + oled_sub_pointer-=15; + oled_pointer_count--; + //down = false; + //up = true; + } + } + lastInterruptTime = interruptTime; +} +void setup() { + display.init(); //inits OLED on I2C bus + display.flipScreenVertically(); //orientation fix for OLED + + pinMode(pin_clk, INPUT_PULLUP); + pinMode(pin_data, INPUT_PULLUP); + pinMode(pin_switch, INPUT_PULLUP); + //ISR TO PIN + attachInterrupt(digitalPinToInterrupt(pin_clk),isrRotaryEncoder,FALLING); + + rto->webServerEnabled = true; + rto->webServerStarted = false; // make sure this is set + + Serial.begin(115200); // Arduino IDE Serial Monitor requires the same 115200 bauds! + Serial.setTimeout(10); + + // millis() at this point: typically 65ms + // start web services as early in boot as possible + WiFi.hostname(device_hostname_partial); // was _full + + startWire(); + // run some dummy commands to init I2C to GBS and cached segments + GBS::SP_SOG_MODE::read(); writeOneByte(0xF0, 0); writeOneByte(0x00, 0); + GBS::STATUS_00::read(); + + if (rto->webServerEnabled) { + rto->allowUpdatesOTA = false; // need to initialize for handleWiFi() + WiFi.setSleepMode(WIFI_NONE_SLEEP); // low latency responses, less chance for missing packets + WiFi.setOutputPower(16.0f); // float: min 0.0f, max 20.5f + startWebserver(); + rto->webServerStarted = true; + } + else { + //WiFi.disconnect(); // deletes credentials + WiFi.mode(WIFI_OFF); + WiFi.forceSleepBegin(); + } +#ifdef HAVE_PINGER_LIBRARY + pingLastTime = millis(); +#endif + + SerialM.println(F("\nstartup")); + + loadDefaultUserOptions(); + //globalDelay = 0; + + rto->allowUpdatesOTA = false; // ESP over the air updates. default to off, enable via web interface + rto->enableDebugPings = false; + rto->autoBestHtotalEnabled = true; // automatically find the best horizontal total pixel value for a given input timing + rto->syncLockFailIgnore = 16; // allow syncLock to fail x-1 times in a row before giving up (sync glitch immunity) + rto->forceRetime = false; + rto->syncWatcherEnabled = true; // continously checks the current sync status. required for normal operation + rto->phaseADC = 16; + rto->phaseSP = 16; + rto->failRetryAttempts = 0; + rto->presetID = 0; + rto->HPLLState = 0; + rto->motionAdaptiveDeinterlaceActive = false; + rto->deinterlaceAutoEnabled = true; + rto->scanlinesEnabled = false; + rto->boardHasPower = true; + rto->presetIsPalForce60 = false; + rto->syncTypeCsync = false; + rto->isValidForScalingRGBHV = false; + rto->medResLineCount = 0x33; // 51*8=408 + rto->osr = 0; + rto->useHdmiSyncFix = 0; + rto->notRecognizedCounter = 0; + + // more run time variables + rto->inputIsYpBpR = false; + rto->videoStandardInput = 0; + rto->outModeHdBypass = false; + rto->videoIsFrozen = false; + if (!rto->webServerEnabled) rto->webServerStarted = false; + rto->printInfos = false; + rto->sourceDisconnected = true; + rto->isInLowPowerMode = false; + rto->applyPresetDoneStage = 0; + rto->presetVlineShift = 0; + rto->clampPositionIsSet = 0; + rto->coastPositionIsSet = 0; + rto->continousStableCounter = 0; + rto->currentLevelSOG = 5; + rto->thisSourceMaxLevelSOG = 31; // 31 = auto sog has not (yet) run + + adco->r_gain = 0; + adco->g_gain = 0; + adco->b_gain = 0; + adco->r_off = 0; + adco->g_off = 0; + adco->b_off = 0; + + typeOneCommand = '@'; // ASCII @ = 0 + typeTwoCommand = '@'; + + pinMode(DEBUG_IN_PIN, INPUT); + pinMode(LED_BUILTIN, OUTPUT); + LEDON; // enable the LED, lets users know the board is starting up + + //Serial.setDebugOutput(true); // if you want simple wifi debug info + + // delay 1 of 2 + unsigned long initDelay = millis(); + // upped from < 500 to < 1500, allows more time for wifi and GBS startup + while (millis() - initDelay < 1500) { + display.drawXbm(2, 2, gbsicon_width, gbsicon_height, gbsicon_bits); + display.display(); + handleWiFi(0); + delay(1); + } + display.clear(); + // if i2c established and chip running, issue software reset now + GBS::RESET_CONTROL_0x46::write(0); GBS::RESET_CONTROL_0x47::write(0); + GBS::PLLAD_VCORST::write(1); GBS::PLLAD_PDZ::write(0); // AD PLL off + + // file system (web page, custom presets, ect) + if (!SPIFFS.begin()) { + SerialM.println(F("SPIFFS mount failed! ((1M SPIFFS) selected?)")); + } + else { + // load user preferences file + File f = SPIFFS.open("/preferencesv2.txt", "r"); + if (!f) { + SerialM.println(F("no preferences file yet, create new")); + loadDefaultUserOptions(); + saveUserPrefs(); // if this fails, there must be a spiffs problem + } + else { + //on a fresh / spiffs not formatted yet MCU: userprefs.txt open ok //result = 207 + uopt->presetPreference = (uint8_t)(f.read() - '0'); // #1 + if (uopt->presetPreference > 10) uopt->presetPreference = 0; // fresh spiffs ? + + uopt->enableFrameTimeLock = (uint8_t)(f.read() - '0'); + if (uopt->enableFrameTimeLock > 1) uopt->enableFrameTimeLock = 0; + + uopt->presetSlot = lowByte(f.read()); + if (uopt->presetSlot >= SLOTS_TOTAL) uopt->presetSlot = 0; + + uopt->frameTimeLockMethod = (uint8_t)(f.read() - '0'); + if (uopt->frameTimeLockMethod > 1) uopt->frameTimeLockMethod = 0; + + uopt->enableAutoGain = (uint8_t)(f.read() - '0'); + if (uopt->enableAutoGain > 1) uopt->enableAutoGain = 0; + + uopt->wantScanlines = (uint8_t)(f.read() - '0'); + if (uopt->wantScanlines > 1) uopt->wantScanlines = 0; + + uopt->wantOutputComponent = (uint8_t)(f.read() - '0'); + if (uopt->wantOutputComponent > 1) uopt->wantOutputComponent = 0; + + uopt->deintMode = (uint8_t)(f.read() - '0'); + if (uopt->deintMode > 2) uopt->deintMode = 0; + + uopt->wantVdsLineFilter = (uint8_t)(f.read() - '0'); + if (uopt->wantVdsLineFilter > 1) uopt->wantVdsLineFilter = 0; + + uopt->wantPeaking = (uint8_t)(f.read() - '0'); + if (uopt->wantPeaking > 1) uopt->wantPeaking = 1; + + uopt->preferScalingRgbhv = (uint8_t)(f.read() - '0'); + if (uopt->preferScalingRgbhv > 1) uopt->preferScalingRgbhv = 1; + + uopt->wantTap6 = (uint8_t)(f.read() - '0'); + if (uopt->wantTap6 > 1) uopt->wantTap6 = 1; + + uopt->PalForce60 = (uint8_t)(f.read() - '0'); + if (uopt->PalForce60 > 1) uopt->PalForce60 = 0; + + uopt->matchPresetSource = (uint8_t)(f.read() - '0'); // #14 + if (uopt->matchPresetSource > 1) uopt->matchPresetSource = 1; + + uopt->wantStepResponse = (uint8_t)(f.read() - '0'); // #15 + if (uopt->wantStepResponse > 1) uopt->wantStepResponse = 1; + + uopt->wantFullHeight = (uint8_t)(f.read() - '0'); // #16 + if (uopt->wantFullHeight > 1) uopt->wantFullHeight = 1; + + uopt->enableCalibrationADC = (uint8_t)(f.read() - '0'); // #17 + if (uopt->enableCalibrationADC > 1) uopt->enableCalibrationADC = 1; + + uopt->scanlineStrength = (uint8_t)(f.read() - '0'); // #18 + if (uopt->scanlineStrength > 0x60) uopt->enableCalibrationADC = 0x30; + + uopt->disableExternalClockGenerator = (uint8_t)(f.read() - '0'); // #19 + if (uopt->disableExternalClockGenerator > 1) uopt->disableExternalClockGenerator = 0; + + f.close(); + } + } + + + GBS::PAD_CKIN_ENZ::write(1); // disable to prevent startup spike damage + externalClockGenDetectPresence(); + externalClockGenInitialize(); // sets rto->extClockGenDetected + // library may change i2c clock or pins, so restart + startWire(); + GBS::STATUS_00::read(); GBS::STATUS_00::read(); GBS::STATUS_00::read(); + + // delay 2 of 2 + initDelay = millis(); + while (millis() - initDelay < 1000) { + handleWiFi(0); + delay(1); + } + + if (WiFi.status() == WL_CONNECTED) { + // nothing + } + else if (WiFi.SSID().length() == 0) { + SerialM.println(FPSTR(ap_info_string)); + } + else { + SerialM.println(F("(WiFi): still connecting..")); + WiFi.reconnect(); // only valid for station class (ok here) + } + + // dummy commands + GBS::STATUS_00::read(); GBS::STATUS_00::read(); GBS::STATUS_00::read(); + + boolean powerOrWireIssue = 0; + if ( !checkBoardPower() ) + { + stopWire(); // sets pinmodes SDA, SCL to INPUT + for (int i = 0; i < 40; i++) { + // I2C SDA probably stuck, attempt recovery (max attempts in tests was around 10) + startWire(); + GBS::STATUS_00::read(); + digitalWrite(SCL, 0); delayMicroseconds(12); + stopWire(); + if (digitalRead(SDA) == 1) { break; } // unstuck + if ((i % 7) == 0) { delay(1); } + } + + // restart and dummy + startWire(); delay(1); + GBS::STATUS_00::read(); delay(1); + + if (!checkBoardPower()) { + stopWire(); + powerOrWireIssue = 1; // fail + rto->boardHasPower = false; + rto->syncWatcherEnabled = false; + } + else { // recover success + rto->syncWatcherEnabled = true; + rto->boardHasPower = true; + SerialM.println(F("recovered")); + } + } + + if (powerOrWireIssue == 0) + { + // second init, in cases where i2c got stuck earlier but has recovered + // *if* ext clock gen is installed and *if* i2c got stuck, then clockgen must be already running + if (!rto->extClockGenDetected) { + externalClockGenDetectPresence(); // sets rto->extClockGenDetected + externalClockGenInitialize(); + } + if (rto->extClockGenDetected == 1) { Serial.println(F("ext clockgen detected")); } + else { Serial.println(F("no ext clockgen")); } + + zeroAll(); + setResetParameters(); + prepareSyncProcessor(); + + uint8_t productId = GBS::CHIP_ID_PRODUCT::read(); + uint8_t revisionId = GBS::CHIP_ID_REVISION::read(); + SerialM.print(F("Chip ID: ")); + SerialM.print(productId,HEX); + SerialM.print(" "); + SerialM.println(revisionId,HEX); + + if (uopt->enableCalibrationADC) { + // enabled by default + calibrateAdcOffset(); + } + setResetParameters(); + + delay(4); // help wifi (presets are unloaded now) + handleWiFi(1); + delay(4); + + // startup reliability test routine + /*rto->videoStandardInput = 1; + writeProgramArrayNew(ntsc_240p, 0); + doPostPresetLoadSteps(); + int i = 100000; + while (i-- > 0) loop(); + ESP.restart();*/ + + //rto->syncWatcherEnabled = false; // allows passive operation by disabling syncwatcher here + //inputAndSyncDetect(); + //if (rto->syncWatcherEnabled == true) { + // rto->isInLowPowerMode = true; // just for initial detection; simplifies code later + // for (uint8_t i = 0; i < 3; i++) { + // if (inputAndSyncDetect()) { + // break; + // } + // } + // rto->isInLowPowerMode = false; + //} + } + else { + SerialM.println(F("Please check board power and cabling or restart!")); + } + + LEDOFF; // LED behaviour: only light LED on active sync + + // some debug tools leave garbage in the serial rx buffer + if (Serial.available()) { + discardSerialRxData(); + } +} + +#ifdef HAVE_BUTTONS +#define INPUT_SHIFT 0 +#define DOWN_SHIFT 1 +#define UP_SHIFT 2 +#define MENU_SHIFT 3 + +static const uint8_t historySize = 32; +static const uint16_t buttonPollInterval = 100; // microseconds +static uint8_t buttonHistory[historySize]; +static uint8_t buttonIndex; +static uint8_t buttonState; +static uint8_t buttonChanged; + +uint8_t readButtons(void) { + return ~((digitalRead(INPUT_PIN) << INPUT_SHIFT) | + (digitalRead(DOWN_PIN) << DOWN_SHIFT) | + (digitalRead(UP_PIN) << UP_SHIFT) | + (digitalRead(MENU_PIN) << MENU_SHIFT)); +} + +void debounceButtons(void) { + buttonHistory[buttonIndex++ % historySize] = readButtons(); + buttonChanged = 0xFF; + for (uint8_t i = 0; i < historySize; ++i) + buttonChanged &= buttonState ^ buttonHistory[i]; + buttonState ^= buttonChanged; +} + +bool buttonDown(uint8_t pos) { + return (buttonState & (1 << pos)) && (buttonChanged & (1 << pos)); +} + +void handleButtons(void) { + debounceButtons(); + if (buttonDown(INPUT_SHIFT)) + Menu::run(MenuInput::BACK); + if (buttonDown(DOWN_SHIFT)) + Menu::run(MenuInput::DOWN); + if (buttonDown(UP_SHIFT)) + Menu::run(MenuInput::UP); + if (buttonDown(MENU_SHIFT)) + Menu::run(MenuInput::FORWARD); +} +#endif + +void discardSerialRxData() { + uint16_t maxThrowAway = 0x1fff; + while (Serial.available() && maxThrowAway > 0) { + Serial.read(); + maxThrowAway--; + } +} + +void updateWebSocketData() { + if (rto->webServerEnabled && rto->webServerStarted) { + if (webSocket.connectedClients() > 0) { + + char toSend[7] = { 0 }; + toSend[0] = '#'; // makeshift ping in slot 0 + + switch (rto->presetID) { + case 0x01: + case 0x11: + toSend[1] = '1'; + break; + case 0x02: + case 0x12: + toSend[1] = '2'; + break; + case 0x03: + case 0x13: + toSend[1] = '3'; + break; + case 0x04: + case 0x14: + toSend[1] = '4'; + break; + case 0x05: + case 0x15: + toSend[1] = '5'; + break; + case 0x06: + case 0x16: + toSend[1] = '6'; + break; + case 0x09: // custom + toSend[1] = '9'; + break; + case 0x21: // bypass 1 + case 0x22: // bypass 2 + toSend[1] = '8'; + break; + default: + toSend[1] = '0'; + break; + } + + toSend[2] = (char)uopt->presetSlot; + + // '@' = 0x40, used for "byte is present" detection; 0x80 not in ascii table + toSend[3] = '@'; + toSend[4] = '@'; + toSend[5] = '@'; + + if (uopt->enableAutoGain) { toSend[3] |= (1 << 0); } + if (uopt->wantScanlines) { toSend[3] |= (1 << 1); } + if (uopt->wantVdsLineFilter) { toSend[3] |= (1 << 2); } + if (uopt->wantPeaking) { toSend[3] |= (1 << 3); } + if (uopt->PalForce60) { toSend[3] |= (1 << 4); } + if (uopt->wantOutputComponent) { toSend[3] |= (1 << 5); } + + if (uopt->matchPresetSource) { toSend[4] |= (1 << 0); } + if (uopt->enableFrameTimeLock) { toSend[4] |= (1 << 1); } + if (uopt->deintMode) { toSend[4] |= (1 << 2); } + if (uopt->wantTap6) { toSend[4] |= (1 << 3); } + if (uopt->wantStepResponse) { toSend[4] |= (1 << 4); } + if (uopt->wantFullHeight) { toSend[4] |= (1 << 5); } + + if (uopt->enableCalibrationADC) { toSend[5] |= (1 << 0); } + if (uopt->preferScalingRgbhv) { toSend[5] |= (1 << 1); } + if (uopt->disableExternalClockGenerator) { toSend[5] |= (1 << 2); } + + // send ping and stats + if (ESP.getFreeHeap() > 14000) { + webSocket.broadcastTXT(toSend); + } + else { + webSocket.disconnect(); + } + } + + } +} + +void handleWiFi(boolean instant) { + static unsigned long lastTimePing = millis(); + if (rto->webServerEnabled && rto->webServerStarted) { + MDNS.update(); + persWM.handleWiFi(); // if connected, returns instantly. otherwise it reconnects or opens AP + dnsServer.processNextRequest(); + + if ((millis() - lastTimePing) > 953) { // slightly odd value so not everything happens at once + webSocket.broadcastPing(); + } + if (((millis() - lastTimePing) > 973) || instant) { + if ((webSocket.connectedClients(false) > 0) || instant) { // true = with compliant ping + updateWebSocketData(); + } + lastTimePing = millis(); + } + } + + if (rto->allowUpdatesOTA) { + ArduinoOTA.handle(); + } + yield(); +} + +void loop() { + static uint8_t readout = 0; + static uint8_t segmentCurrent = 255; + static uint8_t registerCurrent = 255; + static uint8_t inputToogleBit = 0; + static uint8_t inputStage = 0; + static unsigned long lastTimeSyncWatcher = millis(); + static unsigned long lastTimeSourceCheck = 500; // 500 to start right away (after setup it will be 2790ms when we get here) + static unsigned long lastTimeInterruptClear = millis(); + +settingsMenuOLED(); +if(oled_encoder_pos != oled_lastCount){ + oled_lastCount = oled_encoder_pos; +} + +#ifdef HAVE_BUTTONS + static unsigned long lastButton = micros(); + + if (micros() - lastButton > buttonPollInterval) { + lastButton = micros(); + handleButtons(); + } +#endif + + handleWiFi(0); // WiFi + OTA + WS + MDNS, checks for server enabled + started + + // is there a command from Terminal or web ui? + // Serial takes precedence + if (Serial.available()) { + typeOneCommand = Serial.read(); + } + else if (inputStage > 0) { + // multistage with no more data + SerialM.println(F(" abort")); + discardSerialRxData(); + typeOneCommand = ' '; + } + if (typeOneCommand != '@') + { + // multistage with bad characters? + if (inputStage > 0) { + // need 's', 't' or 'g' + if (typeOneCommand != 's' && typeOneCommand != 't' && typeOneCommand != 'g') { + discardSerialRxData(); + SerialM.println(F(" abort")); + typeOneCommand = ' '; + } + } + switch (typeOneCommand) { + case ' ': + // skip spaces + inputStage = segmentCurrent = registerCurrent = 0; // and reset these + break; + case 'd': + { + // don't store scanlines + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 1) { + disableScanlines(); + } + // pal forced 60hz: no need to revert here. let the voffset function handle it + + if (uopt->enableFrameTimeLock && FrameSync::getSyncLastCorrection() != 0) { + FrameSync::reset(uopt->frameTimeLockMethod); + } + // dump + for (int segment = 0; segment <= 5; segment++) { + dumpRegisters(segment); + } + SerialM.println("};"); + } + break; + case '+': + SerialM.println("hor. +"); + shiftHorizontalRight(); + //shiftHorizontalRightIF(4); + break; + case '-': + SerialM.println("hor. -"); + shiftHorizontalLeft(); + //shiftHorizontalLeftIF(4); + break; + case '*': + shiftVerticalUpIF(); + break; + case '/': + shiftVerticalDownIF(); + break; + case 'z': + SerialM.println(F("scale+")); + scaleHorizontal(2, true); + break; + case 'h': + SerialM.println(F("scale-")); + scaleHorizontal(2, false); + break; + case 'q': + resetDigital(); delay(2); + ResetSDRAM(); delay(2); + togglePhaseAdjustUnits(); + //enableVDS(); + break; + case 'D': + SerialM.print(F("debug view: ")); + if (GBS::ADC_UNUSED_62::read() == 0x00) { // "remembers" debug view + //if (uopt->wantPeaking == 0) { GBS::VDS_PK_Y_H_BYPS::write(0); } // 3_4e 0 // enable peaking but don't store + GBS::VDS_PK_LB_GAIN::write(0x3f); // 3_45 + GBS::VDS_PK_LH_GAIN::write(0x3f); // 3_47 + GBS::ADC_UNUSED_60::write(GBS::VDS_Y_OFST::read()); // backup + GBS::ADC_UNUSED_61::write(GBS::HD_Y_OFFSET::read()); + GBS::ADC_UNUSED_62::write(1); // remember to remove on restore + GBS::VDS_Y_OFST::write(GBS::VDS_Y_OFST::read() + 0x24); + GBS::HD_Y_OFFSET::write(GBS::HD_Y_OFFSET::read() + 0x24); + if (!rto->inputIsYpBpR) { + // RGB input that has HD_DYN bypassed, use it now + GBS::HD_DYN_BYPS::write(0); + GBS::HD_U_OFFSET::write(GBS::HD_U_OFFSET::read() + 0x24); + GBS::HD_V_OFFSET::write(GBS::HD_V_OFFSET::read() + 0x24); + } + //GBS::IF_IN_DREG_BYPS::write(1); // enhances noise from not delaying IF processing properly + SerialM.println("on"); + } + else { + //if (uopt->wantPeaking == 0) { GBS::VDS_PK_Y_H_BYPS::write(1); } // 3_4e 0 + if (rto->presetID == 0x05) { + GBS::VDS_PK_LB_GAIN::write(0x16); // 3_45 + GBS::VDS_PK_LH_GAIN::write(0x0A); // 3_47 + } + else { + GBS::VDS_PK_LB_GAIN::write(0x16); // 3_45 + GBS::VDS_PK_LH_GAIN::write(0x18); // 3_47 + } + GBS::VDS_Y_OFST::write(GBS::ADC_UNUSED_60::read()); // restore + GBS::HD_Y_OFFSET::write(GBS::ADC_UNUSED_61::read()); + if (!rto->inputIsYpBpR) { + // RGB input, HD_DYN_BYPS again + GBS::HD_DYN_BYPS::write(1); + GBS::HD_U_OFFSET::write(0); // probably just 0 by default + GBS::HD_V_OFFSET::write(0); // probably just 0 by default + } + //GBS::IF_IN_DREG_BYPS::write(0); + GBS::ADC_UNUSED_60::write(0); // .. and clear + GBS::ADC_UNUSED_61::write(0); + GBS::ADC_UNUSED_62::write(0); + SerialM.println("off"); + } + typeOneCommand = '@'; + break; + case 'C': + SerialM.println(F("PLL: ICLK")); + // display clock in last test best at 0x85 + GBS::PLL648_CONTROL_01::write(0x85); + GBS::PLL_CKIS::write(1); // PLL use ICLK (instead of oscillator) + latchPLLAD(); + //GBS::VDS_HSCALE::write(512); + rto->syncLockFailIgnore = 16; + FrameSync::reset(uopt->frameTimeLockMethod); // adjust htotal to new display clock + rto->forceRetime = true; + //applyBestHTotal(FrameSync::init()); // adjust htotal to new display clock + //applyBestHTotal(FrameSync::init()); // twice + //GBS::VDS_FLOCK_EN::write(1); //risky + delay(200); + break; + case 'Y': + writeProgramArrayNew(ntsc_1280x720, false); + doPostPresetLoadSteps(); + break; + case 'y': + writeProgramArrayNew(pal_1280x720, false); + doPostPresetLoadSteps(); + break; + case 'P': + SerialM.print(F("auto deinterlace: ")); + rto->deinterlaceAutoEnabled = !rto->deinterlaceAutoEnabled; + if (rto->deinterlaceAutoEnabled) { + SerialM.println("on"); + } + else { + SerialM.println("off"); + } + break; + case 'p': + if (!rto->motionAdaptiveDeinterlaceActive) { + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 1) { // don't rely on rto->scanlinesEnabled + disableScanlines(); + } + enableMotionAdaptDeinterlace(); + } + else { + disableMotionAdaptDeinterlace(); + } + break; + case 'k': + bypassModeSwitch_RGBHV(); + break; + case 'K': + setOutModeHdBypass(); + uopt->presetPreference = 10; + saveUserPrefs(); + break; + case 'T': + SerialM.print(F("auto gain ")); + if (uopt->enableAutoGain == 0) { + uopt->enableAutoGain = 1; + if (!rto->outModeHdBypass) { // no readout possible + GBS::ADC_RGCTRL::write(0x48); + GBS::ADC_GGCTRL::write(0x48); + GBS::ADC_BGCTRL::write(0x48); + GBS::DEC_TEST_ENABLE::write(1); + } + SerialM.println("on"); + } + else { + uopt->enableAutoGain = 0; + GBS::DEC_TEST_ENABLE::write(0); + SerialM.println("off"); + } + saveUserPrefs(); + break; + case 'e': + writeProgramArrayNew(ntsc_240p, false); + doPostPresetLoadSteps(); + break; + case 'r': + writeProgramArrayNew(pal_240p, false); + doPostPresetLoadSteps(); + break; + case '.': + { + if (!rto->outModeHdBypass) { + // bestHtotal recalc + rto->autoBestHtotalEnabled = true; + rto->syncLockFailIgnore = 16; + rto->forceRetime = true; + FrameSync::reset(uopt->frameTimeLockMethod); + + if (!rto->syncWatcherEnabled) { + boolean autoBestHtotalSuccess = 0; + delay(30); + autoBestHtotalSuccess = runAutoBestHTotal(); + if (!autoBestHtotalSuccess) { + SerialM.println(F("(unchanged)")); + } + } + } + } + break; + case '!': + //fastGetBestHtotal(); + //readEeprom(); + Serial.print(F("sfr: ")); Serial.println(getSourceFieldRate(1)); + Serial.print(F("pll: ")); Serial.println(getPllRate()); + break; + case '$': + { + // EEPROM write protect pin (7, next to Vcc) is under original MCU control + // MCU drags to Vcc to write, EEPROM drags to Gnd normally + // This routine only works with that "WP" pin disconnected + // 0x17 = input selector? // 0x18 = input selector related? + // 0x54 = coast start 0x55 = coast end + uint16_t writeAddr = 0x54; + const uint8_t eepromAddr = 0x50; + for (; writeAddr < 0x56; writeAddr++) + { + Wire.beginTransmission(eepromAddr); + Wire.write(writeAddr >> 8); // high addr byte, 4 bits + + Wire.write((uint8_t)writeAddr); // mlow addr byte, 8 bits = 12 bits (0xfff max) + Wire.write(0x10); // coast end value ? + Wire.endTransmission(); + delay(5); + } + + //Wire.beginTransmission(eepromAddr); + //Wire.write((uint8_t)0); Wire.write((uint8_t)0); + //Wire.write(0xff); // force eeprom clear probably + //Wire.endTransmission(); + //delay(5); + + Serial.println("done"); + } + break; + case 'j': + //resetPLL(); + latchPLLAD(); + break; + case 'J': + resetPLLAD(); + break; + case 'v': + rto->phaseSP += 1; rto->phaseSP &= 0x1f; + SerialM.print("SP: "); SerialM.println(rto->phaseSP); + setAndLatchPhaseSP(); + //setAndLatchPhaseADC(); + break; + case 'b': + advancePhase(); latchPLLAD(); + SerialM.print("ADC: "); SerialM.println(rto->phaseADC); + break; + case '#': + rto->videoStandardInput = 13; + applyPresets(13); + //Serial.println(getStatus00IfHsVsStable()); + //globalDelay++; + //SerialM.println(globalDelay); + break; + case 'n': + { + uint16_t pll_divider = GBS::PLLAD_MD::read(); + pll_divider += 1; + GBS::PLLAD_MD::write(pll_divider); + GBS::IF_HSYNC_RST::write((pll_divider / 2)); + GBS::IF_LINE_SP::write(((pll_divider / 2) + 1) + 0x40); + SerialM.print(F("PLL div: ")); SerialM.print(pll_divider, HEX); + SerialM.print(" "); SerialM.println(pll_divider); + // set IF before latching + //setIfHblankParameters(); + latchPLLAD(); + delay(1); + //applyBestHTotal(GBS::VDS_HSYNC_RST::read()); + updateClampPosition(); + updateCoastPosition(0); + } + break; + case 'N': + { + //if (GBS::RFF_ENABLE::read()) { + // disableMotionAdaptDeinterlace(); + //} + //else { + // enableMotionAdaptDeinterlace(); + //} + + //GBS::RFF_ENABLE::write(!GBS::RFF_ENABLE::read()); + + if (rto->scanlinesEnabled) { + rto->scanlinesEnabled = false; + disableScanlines(); + } + else { + rto->scanlinesEnabled = true; + enableScanlines(); + } + } + break; + case 'a': + SerialM.print(F("HTotal++: ")); SerialM.println(GBS::VDS_HSYNC_RST::read() + 1); + if (GBS::VDS_HSYNC_RST::read() < 4095) { + if (uopt->enableFrameTimeLock) { + // syncLastCorrection != 0 check is included + FrameSync::reset(uopt->frameTimeLockMethod); + } + rto->forceRetime = 1; + applyBestHTotal(GBS::VDS_HSYNC_RST::read() + 1); + } + break; + case 'A': + SerialM.print(F("HTotal--: ")); SerialM.println(GBS::VDS_HSYNC_RST::read() - 1); + if (GBS::VDS_HSYNC_RST::read() > 0) { + if (uopt->enableFrameTimeLock) { + // syncLastCorrection != 0 check is included + FrameSync::reset(uopt->frameTimeLockMethod); + } + rto->forceRetime = 1; + applyBestHTotal(GBS::VDS_HSYNC_RST::read() - 1); + } + break; + case 'M': + { + /*for (int a = 0; a < 10000; a++) { + GBS::VERYWIDEDUMMYREG::read(); + }*/ + + calibrateAdcOffset(); + + //optimizeSogLevel(); + /*rto->clampPositionIsSet = false; + rto->coastPositionIsSet = false; + updateClampPosition(); + updateCoastPosition();*/ + } + break; + case 'm': + SerialM.print(F("syncwatcher ")); + if (rto->syncWatcherEnabled == true) { + rto->syncWatcherEnabled = false; + if (rto->videoIsFrozen) { unfreezeVideo(); } + SerialM.println("off"); + } + else { + rto->syncWatcherEnabled = true; + SerialM.println("on"); + } + break; + case ',': + printVideoTimings(); + break; + case 'i': + rto->printInfos = !rto->printInfos; + break; + case 'c': + SerialM.println(F("OTA Updates on")); + initUpdateOTA(); + rto->allowUpdatesOTA = true; + break; + case 'G': + SerialM.print(F("Debug Pings ")); + if (!rto->enableDebugPings) { + SerialM.println("on"); + rto->enableDebugPings = 1; + } + else { + SerialM.println("off"); + rto->enableDebugPings = 0; + } + break; + case 'u': + ResetSDRAM(); + break; + case 'f': + SerialM.print(F("peaking ")); + if (uopt->wantPeaking == 0) { + uopt->wantPeaking = 1; + GBS::VDS_PK_Y_H_BYPS::write(0); + SerialM.println("on"); + } + else { + uopt->wantPeaking = 0; + GBS::VDS_PK_Y_H_BYPS::write(1); + SerialM.println("off"); + } + saveUserPrefs(); + break; + case 'F': + SerialM.print(F("ADC filter ")); + if (GBS::ADC_FLTR::read() > 0) { + GBS::ADC_FLTR::write(0); + SerialM.println("off"); + } + else { + GBS::ADC_FLTR::write(3); + SerialM.println("on"); + } + break; + case 'L': + { + // Component / VGA Output + uopt->wantOutputComponent = !uopt->wantOutputComponent; + OutputComponentOrVGA(); + saveUserPrefs(); + // apply 1280x720 preset now, otherwise a reboot would be required + uint8_t videoMode = getVideoMode(); + if (videoMode == 0) videoMode = rto->videoStandardInput; + uint8_t backup = uopt->presetPreference; + uopt->presetPreference = 3; + rto->videoStandardInput = 0; // force hard reset + applyPresets(videoMode); + uopt->presetPreference = backup; + } + break; + case 'l': + SerialM.println(F("resetSyncProcessor")); + //freezeVideo(); + resetSyncProcessor(); + //delay(10); + //unfreezeVideo(); + break; + case 'Z': + { + uopt->matchPresetSource = !uopt->matchPresetSource; + saveUserPrefs(); + uint8_t vidMode = getVideoMode(); + if (uopt->presetPreference == 0 && GBS::GBS_PRESET_ID::read() == 0x11) { + applyPresets(vidMode); + } + else if (uopt->presetPreference == 4 && GBS::GBS_PRESET_ID::read() == 0x02 ) { + applyPresets(vidMode); + } + } + break; + case 'W': + uopt->enableFrameTimeLock = !uopt->enableFrameTimeLock; + break; + case 'E': + writeProgramArrayNew(ntsc_1280x1024, false); + doPostPresetLoadSteps(); + break; + case 'R': + writeProgramArrayNew(pal_1280x1024, false); + doPostPresetLoadSteps(); + break; + case '0': + moveHS(4, true); + break; + case '1': + moveHS(4, false); + break; + case '2': + writeProgramArrayNew(pal_768x576, false); // ModeLine "720x576@50" 27 720 732 795 864 576 581 586 625 -hsync -vsync + doPostPresetLoadSteps(); + break; + case '3': + // + break; + case '4': + { + // scale vertical + + if (GBS::VDS_VSCALE::read() <= 256) { + SerialM.println("limit"); + break; + } + scaleVertical(2, true); + // actually requires full vertical mask + position offset calculation + /*shiftVerticalUp(); + uint16_t vtotal = GBS::VDS_VSYNC_RST::read(); + uint16_t vbstd = GBS::VDS_DIS_VB_ST::read(); + uint16_t vbspd = GBS::VDS_DIS_VB_SP::read(); + if ((vbstd < (vtotal - 4)) && (vbspd > 6)) + { + GBS::VDS_DIS_VB_ST::write(vbstd + 1); + GBS::VDS_DIS_VB_SP::write(vbspd - 1); + }*/ + } + break; + case '5': + { + // scale vertical - + if (GBS::VDS_VSCALE::read() == 1023) { + SerialM.println("limit"); + break; + } + scaleVertical(2, false); + // actually requires full vertical mask + position offset calculation + /*shiftVerticalDown(); + uint16_t vtotal = GBS::VDS_VSYNC_RST::read(); + uint16_t vbstd = GBS::VDS_DIS_VB_ST::read(); + uint16_t vbspd = GBS::VDS_DIS_VB_SP::read(); + if ((vbstd > 6) && (vbspd < (vtotal - 4))) + { + GBS::VDS_DIS_VB_ST::write(vbstd - 1); + GBS::VDS_DIS_VB_SP::write(vbspd + 1); + }*/ + } + break; + case '6': + if (videoStandardInputIsPalNtscSd() && !rto->outModeHdBypass) { + if (GBS::IF_HBIN_SP::read() >= 10) { // IF_HBIN_SP: min 2 + GBS::IF_HBIN_SP::write(GBS::IF_HBIN_SP::read() - 8); // canvas move right + if ((GBS::IF_HSYNC_RST::read() - 4) > ((GBS::PLLAD_MD::read() >> 1) + 5)) { + GBS::IF_HSYNC_RST::write(GBS::IF_HSYNC_RST::read() - 4); // shrink 1_0e + GBS::IF_LINE_SP::write(GBS::IF_LINE_SP::read() - 4); // and 1_22 to go with it + } + } + else { + SerialM.println("limit"); + } + } + else if (!rto->outModeHdBypass) { + if (GBS::IF_HB_SP2::read() >= 4) + GBS::IF_HB_SP2::write(GBS::IF_HB_SP2::read() - 4); // 1_1a + else + GBS::IF_HB_SP2::write(GBS::IF_HSYNC_RST::read() - 0x30); + if (GBS::IF_HB_ST2::read() >= 4) + GBS::IF_HB_ST2::write(GBS::IF_HB_ST2::read() - 4); // 1_18 + else + GBS::IF_HB_ST2::write(GBS::IF_HSYNC_RST::read() - 0x30); + SerialM.print(F("IF_HB_ST2: ")); SerialM.print(GBS::IF_HB_ST2::read(), HEX); + SerialM.print(F(" IF_HB_SP2: ")); SerialM.println(GBS::IF_HB_SP2::read(), HEX); + } + break; + case '7': + if (videoStandardInputIsPalNtscSd() && !rto->outModeHdBypass) { + if (GBS::IF_HBIN_SP::read() < 0x150) { // (arbitrary) max limit + GBS::IF_HBIN_SP::write(GBS::IF_HBIN_SP::read() + 8); // canvas move left + } + else { + SerialM.println("limit"); + } + } + else if (!rto->outModeHdBypass) { + if (GBS::IF_HB_SP2::read() < (GBS::IF_HSYNC_RST::read() - 0x30)) + GBS::IF_HB_SP2::write(GBS::IF_HB_SP2::read() + 4); // 1_1a + else + GBS::IF_HB_SP2::write(0); + if (GBS::IF_HB_ST2::read() < (GBS::IF_HSYNC_RST::read() - 0x30)) + GBS::IF_HB_ST2::write(GBS::IF_HB_ST2::read() + 4); // 1_18 + else + GBS::IF_HB_ST2::write(0); + SerialM.print(F("IF_HB_ST2: ")); SerialM.print(GBS::IF_HB_ST2::read(), HEX); + SerialM.print(F(" IF_HB_SP2: ")); SerialM.println(GBS::IF_HB_SP2::read(), HEX); + } + break; + case '8': + //SerialM.println("invert sync"); + invertHS(); invertVS(); + //optimizePhaseSP(); + break; + case '9': + writeProgramArrayNew(ntsc_720x480, false); + doPostPresetLoadSteps(); + break; + case 'o': + { + if (rto->osr == 1) { + setOverSampleRatio(2, false); + } + else if (rto->osr == 2) { + setOverSampleRatio(4, false); + } + else if (rto->osr == 4) { + setOverSampleRatio(1, false); + } + delay(4); + optimizePhaseSP(); + SerialM.print("OSR "); SerialM.print(rto->osr); SerialM.println("x"); + rto->phaseIsSet = 0; // do it again in modes applicable + } + break; + case 'g': + inputStage++; + // we have a multibyte command + if (inputStage > 0) { + if (inputStage == 1) { + segmentCurrent = Serial.parseInt(); + SerialM.print("G"); + SerialM.print(segmentCurrent); + } + else if (inputStage == 2) { + char szNumbers[3]; + szNumbers[0] = Serial.read(); szNumbers[1] = Serial.read(); szNumbers[2] = '\0'; + //char * pEnd; + registerCurrent = strtol(szNumbers, NULL, 16); + SerialM.print("R"); + SerialM.print(registerCurrent, HEX); + if (segmentCurrent <= 5) { + writeOneByte(0xF0, segmentCurrent); + readFromRegister(registerCurrent, 1, &readout); + SerialM.print(" value: 0x"); SerialM.println(readout, HEX); + } + else { + discardSerialRxData(); + SerialM.println("abort"); + } + inputStage = 0; + } + } + break; + case 's': + inputStage++; + // we have a multibyte command + if (inputStage > 0) { + if (inputStage == 1) { + segmentCurrent = Serial.parseInt(); + SerialM.print("S"); + SerialM.print(segmentCurrent); + } + else if (inputStage == 2) { + char szNumbers[3]; + for (uint8_t a = 0; a <= 1; a++) { + // ascii 0x30 to 0x39 for '0' to '9' + if ((Serial.peek() >= '0' && Serial.peek() <= '9') || + (Serial.peek() >= 'a' && Serial.peek() <= 'f') || + (Serial.peek() >= 'A' && Serial.peek() <= 'F')) + { + szNumbers[a] = Serial.read(); + } + else { + szNumbers[a] = 0; // NUL char + Serial.read(); // but consume the char + } + } + szNumbers[2] = '\0'; + //char * pEnd; + registerCurrent = strtol(szNumbers, NULL, 16); + SerialM.print("R"); + SerialM.print(registerCurrent, HEX); + } + else if (inputStage == 3) { + char szNumbers[3]; + for (uint8_t a = 0; a <= 1; a++) { + if ((Serial.peek() >= '0' && Serial.peek() <= '9') || + (Serial.peek() >= 'a' && Serial.peek() <= 'f') || + (Serial.peek() >= 'A' && Serial.peek() <= 'F')) + { + szNumbers[a] = Serial.read(); + } + else { + szNumbers[a] = 0; // NUL char + Serial.read(); // but consume the char + } + } + szNumbers[2] = '\0'; + //char * pEnd; + inputToogleBit = strtol(szNumbers, NULL, 16); + if (segmentCurrent <= 5) { + writeOneByte(0xF0, segmentCurrent); + readFromRegister(registerCurrent, 1, &readout); + SerialM.print(" (was 0x"); SerialM.print(readout, HEX); SerialM.print(")"); + writeOneByte(registerCurrent, inputToogleBit); + readFromRegister(registerCurrent, 1, &readout); + SerialM.print(" is now: 0x"); SerialM.println(readout, HEX); + } + else { + discardSerialRxData(); + SerialM.println("abort"); + } + inputStage = 0; + } + } + break; + case 't': + inputStage++; + // we have a multibyte command + if (inputStage > 0) { + if (inputStage == 1) { + segmentCurrent = Serial.parseInt(); + SerialM.print("T"); + SerialM.print(segmentCurrent); + } + else if (inputStage == 2) { + char szNumbers[3]; + for (uint8_t a = 0; a <= 1; a++) { + // ascii 0x30 to 0x39 for '0' to '9' + if ((Serial.peek() >= '0' && Serial.peek() <= '9') || + (Serial.peek() >= 'a' && Serial.peek() <= 'f') || + (Serial.peek() >= 'A' && Serial.peek() <= 'F')) + { + szNumbers[a] = Serial.read(); + } + else { + szNumbers[a] = 0; // NUL char + Serial.read(); // but consume the char + } + } + szNumbers[2] = '\0'; + //char * pEnd; + registerCurrent = strtol(szNumbers, NULL, 16); + SerialM.print("R"); + SerialM.print(registerCurrent, HEX); + } + else if (inputStage == 3) { + if (Serial.peek() >= '0' && Serial.peek() <= '7') { + inputToogleBit = Serial.parseInt(); + } + else { + inputToogleBit = 255; // will get discarded next step + } + SerialM.print(" Bit: "); SerialM.print(inputToogleBit); + inputStage = 0; + if ((segmentCurrent <= 5) && (inputToogleBit <= 7)) { + writeOneByte(0xF0, segmentCurrent); + readFromRegister(registerCurrent, 1, &readout); + SerialM.print(" (was 0x"); SerialM.print(readout, HEX); SerialM.print(")"); + writeOneByte(registerCurrent, readout ^ (1 << inputToogleBit)); + readFromRegister(registerCurrent, 1, &readout); + SerialM.print(" is now: 0x"); SerialM.println(readout, HEX); + } + else { + discardSerialRxData(); + inputToogleBit = registerCurrent = 0; + SerialM.println("abort"); + } + } + } + break; + case '<': + { + if (segmentCurrent != 255 && registerCurrent != 255) { + writeOneByte(0xF0, segmentCurrent); + readFromRegister(registerCurrent, 1, &readout); + writeOneByte(registerCurrent, readout - 1); // also allow wrapping + Serial.print("S"); Serial.print(segmentCurrent); + Serial.print("_"); Serial.print(registerCurrent, HEX); + readFromRegister(registerCurrent, 1, &readout); + Serial.print(" : "); Serial.println(readout, HEX); + } + } + break; + case '>': + { + if (segmentCurrent != 255 && registerCurrent != 255) { + writeOneByte(0xF0, segmentCurrent); + readFromRegister(registerCurrent, 1, &readout); + writeOneByte(registerCurrent, readout + 1); + Serial.print("S"); Serial.print(segmentCurrent); + Serial.print("_"); Serial.print(registerCurrent, HEX); + readFromRegister(registerCurrent, 1, &readout); + Serial.print(" : "); Serial.println(readout, HEX); + } + } + break; + case '_': + { + uint32_t ticks = FrameSync::getPulseTicks(); + Serial.println(ticks); + } + break; + case '~': + goLowPowerWithInputDetection(); // test reset + input detect + break; + case 'w': + { + //Serial.flush(); + uint16_t value = 0; + String what = Serial.readStringUntil(' '); + + if (what.length() > 5) { + SerialM.println(F("abort")); + inputStage = 0; + break; + } + if (what.equals("f")) { + if (rto->extClockGenDetected) { + Serial.print(F("old freqExtClockGen: ")); Serial.println((uint32_t)rto->freqExtClockGen); + rto->freqExtClockGen = Serial.parseInt(); + // safety range: 1 - 250 MHz + if (rto->freqExtClockGen >= 1000000 && rto->freqExtClockGen <= 250000000) { + Si.setFreq(0, rto->freqExtClockGen); + rto->clampPositionIsSet = 0; + rto->coastPositionIsSet = 0; + } + Serial.print(F("set freqExtClockGen: ")); Serial.println((uint32_t)rto->freqExtClockGen); + } + break; + } + + value = Serial.parseInt(); + if (value < 4096) { + SerialM.print("set "); SerialM.print(what); SerialM.print(" "); SerialM.println(value); + if (what.equals("ht")) { + //set_htotal(value); + if (!rto->outModeHdBypass) { + rto->forceRetime = 1; + applyBestHTotal(value); + } + else { + GBS::VDS_HSYNC_RST::write(value); + } + } + else if (what.equals("vt")) { + set_vtotal(value); + } + else if (what.equals("hsst")) { + setHSyncStartPosition(value); + } + else if (what.equals("hssp")) { + setHSyncStopPosition(value); + } + else if (what.equals("hbst")) { + setMemoryHblankStartPosition(value); + } + else if (what.equals("hbsp")) { + setMemoryHblankStopPosition(value); + } + else if (what.equals("hbstd")) { + setDisplayHblankStartPosition(value); + } + else if (what.equals("hbspd")) { + setDisplayHblankStopPosition(value); + } + else if (what.equals("vsst")) { + setVSyncStartPosition(value); + } + else if (what.equals("vssp")) { + setVSyncStopPosition(value); + } + else if (what.equals("vbst")) { + setMemoryVblankStartPosition(value); + } + else if (what.equals("vbsp")) { + setMemoryVblankStopPosition(value); + } + else if (what.equals("vbstd")) { + setDisplayVblankStartPosition(value); + } + else if (what.equals("vbspd")) { + setDisplayVblankStopPosition(value); + } + else if (what.equals("sog")) { + setAndUpdateSogLevel(value); + } + else if (what.equals("ifini")) { + GBS::IF_INI_ST::write(value); + //Serial.println(GBS::IF_INI_ST::read()); + } + else if (what.equals("ifvst")) { + GBS::IF_VB_ST::write(value); + //Serial.println(GBS::IF_VB_ST::read()); + } + else if (what.equals("ifvsp")) { + GBS::IF_VB_SP::write(value); + //Serial.println(GBS::IF_VB_ST::read()); + } + else if (what.equals("vsstc")) { + setCsVsStart(value); + } + else if (what.equals("vsspc")) { + setCsVsStop(value); + } + } + else { + SerialM.println("abort"); + } + } + break; + case 'x': + { + uint16_t if_hblank_scale_stop = GBS::IF_HBIN_SP::read(); + GBS::IF_HBIN_SP::write(if_hblank_scale_stop + 1); + SerialM.print("1_26: "); SerialM.println((if_hblank_scale_stop + 1), HEX); + } + break; + case 'X': + { + uint16_t if_hblank_scale_stop = GBS::IF_HBIN_SP::read(); + GBS::IF_HBIN_SP::write(if_hblank_scale_stop - 1); + SerialM.print("1_26: "); SerialM.println((if_hblank_scale_stop - 1), HEX); + } + break; + case '(': + { + writeProgramArrayNew(ntsc_1920x1080, false); + doPostPresetLoadSteps(); + } + break; + case ')': + { + writeProgramArrayNew(pal_1920x1080, false); + doPostPresetLoadSteps(); + } + break; + case 'V': + { + SerialM.print(F("step response ")); + uopt->wantStepResponse = !uopt->wantStepResponse; + if (uopt->wantStepResponse) { + GBS::VDS_UV_STEP_BYPS::write(0); + SerialM.println("on"); + } + else { + GBS::VDS_UV_STEP_BYPS::write(1); + SerialM.println("off"); + } + saveUserPrefs(); + } + break; + case 'S': + { + snapToIntegralFrameRate(); + break; + } + case ':': + externalClockGenSyncInOutRate(); + break; + case ';': + externalClockGenResetClock(); + if (rto->extClockGenDetected) { + rto->extClockGenDetected = 0; + Serial.println(F("ext clock gen bypass")); + } + else { + rto->extClockGenDetected = 1; + Serial.println(F("ext clock gen active")); + externalClockGenSyncInOutRate(); + } + //{ + // float bla = 0; + // double esp8266_clock_freq = ESP.getCpuFreqMHz() * 1000000; + // bla = esp8266_clock_freq / (double)FrameSync::getPulseTicks(); + // Serial.println(bla, 5); + //} + break; + default: + Serial.print(F("unknown command ")); + Serial.println(typeOneCommand, HEX); + break; + } + + delay(1); // give some time to read in eventual next chars + + // a web ui or terminal command has finished. good idea to reset sync lock timer + // important if the command was to change presets, possibly others + lastVsyncLock = millis(); + + if (!Serial.available()) { + // in case we handled a Serial or web server command and there's no more extra commands + // but keep debug view command (resets once called) + if (typeOneCommand != 'D') { + typeOneCommand = '@'; + } + handleWiFi(1); + } + } + + if (typeTwoCommand != '@') { + handleType2Command(typeTwoCommand); + typeTwoCommand = '@'; // in case we handled web server command + lastVsyncLock = millis(); + handleWiFi(1); + } + + // run FrameTimeLock if enabled + if (rto->extClockGenDetected == false) { + if (uopt->enableFrameTimeLock && rto->sourceDisconnected == false && rto->autoBestHtotalEnabled && + rto->syncWatcherEnabled && FrameSync::ready() && millis() - lastVsyncLock > FrameSyncAttrs::lockInterval + && rto->continousStableCounter > 20 && rto->noSyncCounter == 0) { + + uint16_t htotal = GBS::STATUS_SYNC_PROC_HTOTAL::read(); + uint16_t pllad = GBS::PLLAD_MD::read(); + if (((htotal > (pllad - 3)) && (htotal < (pllad + 3)))) { + uint8_t debug_backup = GBS::TEST_BUS_SEL::read(); + if (debug_backup != 0x0) { + GBS::TEST_BUS_SEL::write(0x0); + } + //unsigned long startTime = millis(); + if (!FrameSync::run(uopt->frameTimeLockMethod)) { + if (rto->syncLockFailIgnore-- == 0) { + FrameSync::reset(uopt->frameTimeLockMethod); // in case run() failed because we lost sync signal + } + } + else if (rto->syncLockFailIgnore > 0) { + rto->syncLockFailIgnore = 16; + } + //Serial.println(millis() - startTime); + + if (debug_backup != 0x0) { + GBS::TEST_BUS_SEL::write(debug_backup); + } + } + lastVsyncLock = millis(); + } + } + + if (rto->syncWatcherEnabled && rto->boardHasPower) { + if ((millis() - lastTimeInterruptClear) > 3000) { + GBS::INTERRUPT_CONTROL_00::write(0xfe); // reset except for SOGBAD + GBS::INTERRUPT_CONTROL_00::write(0x00); + lastTimeInterruptClear = millis(); + } + } + + // information mode + if (rto->printInfos == true) { + printInfo(); + } + + //uint16_t testbus = GBS::TEST_BUS::read() & 0x0fff; + //if (testbus >= 0x0FFD){ + // Serial.println(testbus,HEX); + //} + //if (rto->videoIsFrozen && (rto->continousStableCounter >= 2)) { + // unfreezeVideo(); + //} + + // syncwatcher polls SP status. when necessary, initiates adjustments or preset changes + if (rto->sourceDisconnected == false && rto->syncWatcherEnabled == true + && (millis() - lastTimeSyncWatcher) > 20) + { + runSyncWatcher(); + lastTimeSyncWatcher = millis(); + + // auto adc gain + if (uopt->enableAutoGain == 1 && !rto->sourceDisconnected + && rto->videoStandardInput > 0 && rto->clampPositionIsSet + && rto->noSyncCounter == 0 && rto->continousStableCounter > 90 + && rto->boardHasPower) + { + uint16_t htotal = GBS::STATUS_SYNC_PROC_HTOTAL::read(); + uint16_t pllad = GBS::PLLAD_MD::read(); + if (((htotal > (pllad - 3)) && (htotal < (pllad + 3)))) { + uint8_t debugRegBackup = 0, debugPinBackup = 0; + debugPinBackup = GBS::PAD_BOUT_EN::read(); + debugRegBackup = GBS::TEST_BUS_SEL::read(); + GBS::PAD_BOUT_EN::write(0); // disable output to pin for test + GBS::DEC_TEST_SEL::write(1); // luma and G channel + GBS::TEST_BUS_SEL::write(0xb); // decimation + if (GBS::STATUS_INT_SOG_BAD::read() == 0) { + runAutoGain(); + } + GBS::TEST_BUS_SEL::write(debugRegBackup); + GBS::PAD_BOUT_EN::write(debugPinBackup); // debug output pin back on + } + } + } + + // init frame sync + besthtotal routine + if (rto->autoBestHtotalEnabled && !FrameSync::ready() && rto->syncWatcherEnabled) { + if (rto->continousStableCounter >= 10 && rto->coastPositionIsSet && + ((millis() - lastVsyncLock) > 500)) + { + if ((rto->continousStableCounter % 5) == 0) { // 5, 10, 15, .., 255 + uint16_t htotal = GBS::STATUS_SYNC_PROC_HTOTAL::read(); + uint16_t pllad = GBS::PLLAD_MD::read(); + if (((htotal > (pllad - 3)) && (htotal < (pllad + 3)))) { + runAutoBestHTotal(); + } + } + } + } + + // update clamp + coast positions after preset change // do it quickly + if ((rto->videoStandardInput <= 14 && rto->videoStandardInput != 0) && + rto->syncWatcherEnabled && !rto->coastPositionIsSet) + { + if (rto->continousStableCounter >= 7) { + if ((getStatus16SpHsStable() == 1) && (getVideoMode() == rto->videoStandardInput)) + { + updateCoastPosition(0); + if (rto->coastPositionIsSet) { + if (videoStandardInputIsPalNtscSd()) { + // todo: verify for other csync formats + GBS::SP_DIS_SUB_COAST::write(0); // enable 5_3e 5 + GBS::SP_H_PROTECT::write(0); // no 5_3e 4 + } + } + } + } + } + + // don't exclude modes 13 / 14 / 15 (rgbhv bypass) + if ((rto->videoStandardInput != 0) && (rto->continousStableCounter >= 4) && + !rto->clampPositionIsSet && rto->syncWatcherEnabled) + { + updateClampPosition(); + if (rto->clampPositionIsSet) { + if (GBS::SP_NO_CLAMP_REG::read() == 1) { + GBS::SP_NO_CLAMP_REG::write(0); + } + } + } + + // later stage post preset adjustments + if ((rto->applyPresetDoneStage == 1) && + ((rto->continousStableCounter > 35 && rto->continousStableCounter < 45) || // this + !rto->syncWatcherEnabled)) // or that + { + if (rto->applyPresetDoneStage == 1) + { + // 2nd chance + GBS::DAC_RGBS_PWDNZ::write(1); // 2nd chance + if (!uopt->wantOutputComponent) + { + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out // 2nd chance + } + if (!rto->syncWatcherEnabled) + { + updateClampPosition(); + GBS::SP_NO_CLAMP_REG::write(0); // 5_57 0 + } + + if (rto->extClockGenDetected && rto->videoStandardInput != 14) { + // switch to ext clock + if (!rto->outModeHdBypass) { + if (GBS::PLL648_CONTROL_01::read() != 0x35 && GBS::PLL648_CONTROL_01::read() != 0x75) { + // first store original in an option byte in 1_2D + GBS::GBS_PRESET_DISPLAY_CLOCK::write(GBS::PLL648_CONTROL_01::read()); + // enable and switch input + Si.enable(0); delayMicroseconds(800); + GBS::PLL648_CONTROL_01::write(0x75); + } + } + // sync clocks now + externalClockGenSyncInOutRate(); + } + rto->applyPresetDoneStage = 0; + } + } + else if (rto->applyPresetDoneStage == 1 && (rto->continousStableCounter > 35)) + { + // 3rd chance + GBS::DAC_RGBS_PWDNZ::write(1); // enable DAC // 3rd chance + if (!uopt->wantOutputComponent) + { + GBS::PAD_SYNC_OUT_ENZ::write(0); // enable sync out // 3rd chance + } + + // sync clocks now + externalClockGenSyncInOutRate(); + rto->applyPresetDoneStage = 0; // timeout + } + + if (rto->applyPresetDoneStage == 10) + { + rto->applyPresetDoneStage = 11; // set first, so we don't loop applying presets + setOutModeHdBypass(); + } + + if (rto->syncWatcherEnabled == true && rto->sourceDisconnected == true && rto->boardHasPower) + { + if ((millis() - lastTimeSourceCheck) >= 500) + { + if ( checkBoardPower() ) + { + inputAndSyncDetect(); // source is off or just started; keep looking for new input + } + else { + rto->boardHasPower = false; + rto->continousStableCounter = 0; + rto->syncWatcherEnabled = false; + } + lastTimeSourceCheck = millis(); + + // vary SOG slicer level from 2 to 6 + uint8_t currentSOG = GBS::ADC_SOGCTRL::read(); + if (currentSOG >= 3) { + rto->currentLevelSOG = currentSOG - 1; + GBS::ADC_SOGCTRL::write(rto->currentLevelSOG); + } + else { + rto->currentLevelSOG = 6; + GBS::ADC_SOGCTRL::write(rto->currentLevelSOG); + } + } + } + + // has the GBS board lost power? // check at 2 points, in case one doesn't register + // low values chosen to not do this check on small sync issues + if ((rto->noSyncCounter == 61 || rto->noSyncCounter == 62) && rto->boardHasPower) + { + if ( !checkBoardPower() ) + { + rto->noSyncCounter = 1; // some neutral "no sync" value + rto->boardHasPower = false; + rto->continousStableCounter = 0; + //rto->syncWatcherEnabled = false; + stopWire(); // sets pinmodes SDA, SCL to INPUT + } + else + { + rto->noSyncCounter = 63; // avoid checking twice + } + } + + // power good now? // added syncWatcherEnabled check to enable passive mode + // (passive mode = watching OFW without interrupting) + if (!rto->boardHasPower && rto->syncWatcherEnabled) + { // then check if power has come on + if (digitalRead(SCL) && digitalRead(SDA)) + { + delay(50); + if (digitalRead(SCL) && digitalRead(SDA)) + { + Serial.println(F("power good")); + delay(350); // i've seen the MTV230 go on briefly on GBS power cycle + startWire(); + { + // run some dummy commands to init I2C + GBS::SP_SOG_MODE::read(); GBS::SP_SOG_MODE::read(); + writeOneByte(0xF0, 0); writeOneByte(0x00, 0); // update cached segment + GBS::STATUS_00::read(); + } + rto->syncWatcherEnabled = true; + rto->boardHasPower = true; + delay(100); + goLowPowerWithInputDetection(); + } + } + } + +#ifdef HAVE_PINGER_LIBRARY + // periodic pings for debugging WiFi issues + if (WiFi.status() == WL_CONNECTED) + { + if (rto->enableDebugPings && millis() - pingLastTime > 1000) { + // regular interval pings + if (pinger.Ping(WiFi.gatewayIP(), 1, 750) == false) + { + Serial.println("Error during last ping command."); + } + pingLastTime = millis(); + } + } +#endif +} + +#if defined(ESP8266) +#include "webui_html.h" +// gzip -c9 webui.html > webui_html && xxd -i webui_html > webui_html.h && rm webui_html && sed -i -e 's/unsigned char webui_html\[]/const uint8_t webui_html[] PROGMEM/' webui_html.h && sed -i -e 's/unsigned int webui_html_len/const unsigned int webui_html_len/' webui_html.h + +void handleType2Command(char argument) { + switch (argument) { + case '0': + SerialM.print(F("pal force 60hz ")); + if (uopt->PalForce60 == 0) { + uopt->PalForce60 = 1; + SerialM.println("on"); + } + else { + uopt->PalForce60 = 0; + SerialM.println("off"); + } + saveUserPrefs(); + break; + case '1': + // reset to defaults button + webSocket.close(); + loadDefaultUserOptions(); + saveUserPrefs(); + Serial.println(F("options set to defaults, restarting")); + delay(60); + ESP.reset(); // don't use restart(), messes up websocket reconnects + // + break; + case '2': + // + break; + case '3': // load custom preset + { + uopt->presetPreference = 2; // custom + if (rto->videoStandardInput == 14) { + // vga upscale path: let synwatcher handle it + rto->videoStandardInput = 15; + } + else { + // normal path + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + } + break; + case '4': // save custom preset + savePresetToSPIFFS(); + uopt->presetPreference = 2; // custom + saveUserPrefs(); + break; + case '5': + //Frame Time Lock toggle + uopt->enableFrameTimeLock = !uopt->enableFrameTimeLock; + saveUserPrefs(); + if (uopt->enableFrameTimeLock) { SerialM.println(F("FTL on")); } + else { SerialM.println(F("FTL off")); } + if (!rto->extClockGenDetected) { + FrameSync::reset(uopt->frameTimeLockMethod); + } + if (uopt->enableFrameTimeLock) { + activeFrameTimeLockInitialSteps(); + } + break; + case '6': + // + break; + case '7': + uopt->wantScanlines = !uopt->wantScanlines; + SerialM.print(F("scanlines: ")); + if (uopt->wantScanlines) { + SerialM.println(F("on (Line Filter recommended)")); + } + else { + disableScanlines(); + SerialM.println("off"); + } + saveUserPrefs(); + break; + case '9': + // + break; + case 'a': + webSocket.close(); + Serial.println(F("restart")); + delay(60); + ESP.reset(); // don't use restart(), messes up websocket reconnects + break; + case 'e': // print files on spiffs + { + Dir dir = SPIFFS.openDir("/"); + while (dir.next()) { + SerialM.print(dir.fileName()); SerialM.print(" "); SerialM.println(dir.fileSize()); + delay(1); // wifi stack + } + //// + File f = SPIFFS.open("/preferencesv2.txt", "r"); + if (!f) { + SerialM.println(F("failed opening preferences file")); + } + else { + SerialM.print(F("preset preference = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("frame time lock = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("preset slot = ")); SerialM.println((uint8_t)(f.read())); + SerialM.print(F("frame lock method = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("auto gain = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("scanlines = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("component output = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("deinterlacer mode = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("line filter = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("peaking = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("preferScalingRgbhv = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("6-tap = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("pal force60 = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("matched = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("step response = ")); SerialM.println((uint8_t)(f.read() - '0')); + SerialM.print(F("disable external clock generator = ")); SerialM.println((uint8_t)(f.read() - '0')); + + f.close(); + } + } + break; + case 'f': + case 'g': + case 'h': + case 'p': + case 's': + case 'L': + { + // load preset via webui + uint8_t videoMode = getVideoMode(); + if (videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; // last known good as fallback + //else videoMode stays 0 and we'll apply via some assumptions + + if (argument == 'f') uopt->presetPreference = 0; // 1280x960 + if (argument == 'g') uopt->presetPreference = 3; // 1280x720 + if (argument == 'h') uopt->presetPreference = 1; // 720x480/768x576 + if (argument == 'p') uopt->presetPreference = 4; // 1280x1024 + if (argument == 's') uopt->presetPreference = 5; // 1920x1080 + if (argument == 'L') uopt->presetPreference = 6; // downscale + + rto->useHdmiSyncFix = 1; // disables sync out when programming preset + if (rto->videoStandardInput == 14) { + // vga upscale path: let synwatcher handle it + rto->videoStandardInput = 15; + } + else { + // normal path + applyPresets(videoMode); + } + saveUserPrefs(); + } + break; + case 'i': + // toggle active frametime lock method + if (!rto->extClockGenDetected) { + FrameSync::reset(uopt->frameTimeLockMethod); + } + if (uopt->frameTimeLockMethod == 0) { + uopt->frameTimeLockMethod = 1; + } + else if (uopt->frameTimeLockMethod == 1) { + uopt->frameTimeLockMethod = 0; + } + saveUserPrefs(); + activeFrameTimeLockInitialSteps(); + break; + case 'l': + // cycle through available SDRAM clocks + { + uint8_t PLL_MS = GBS::PLL_MS::read(); + uint8_t memClock = 0; + + if (PLL_MS == 0) PLL_MS = 2; + else if (PLL_MS == 2) PLL_MS = 7; + else if (PLL_MS == 7) PLL_MS = 4; + else if (PLL_MS == 4) PLL_MS = 3; + else if (PLL_MS == 3) PLL_MS = 5; + else if (PLL_MS == 5) PLL_MS = 0; + + switch (PLL_MS) { + case 0: memClock = 108; break; + case 1: memClock = 81; break; // goes well with 4_2C = 0x14, 4_2D = 0x27 + case 2: memClock = 10; break; // feedback clock + case 3: memClock = 162; break; + case 4: memClock = 144; break; + case 5: memClock = 185; break; // slight OC + case 6: memClock = 216; break; // !OC! + case 7: memClock = 129; break; + default: break; + } + GBS::PLL_MS::write(PLL_MS); + ResetSDRAM(); + if (memClock != 10) { + SerialM.print(F("SDRAM clock: ")); SerialM.print(memClock); SerialM.println("Mhz"); + } + else { + SerialM.print(F("SDRAM clock: ")); SerialM.println(F("Feedback clock")); + } + } + break; + case 'm': + SerialM.print(F("Line Filter: ")); + if (uopt->wantVdsLineFilter) { + uopt->wantVdsLineFilter = 0; + GBS::VDS_D_RAM_BYPS::write(1); + SerialM.println("off"); + } + else { + uopt->wantVdsLineFilter = 1; + GBS::VDS_D_RAM_BYPS::write(0); + SerialM.println("on"); + } + saveUserPrefs(); + break; + case 'n': + SerialM.print(F("ADC gain++ : ")); + uopt->enableAutoGain = 0; + GBS::ADC_RGCTRL::write(GBS::ADC_RGCTRL::read() - 1); + GBS::ADC_GGCTRL::write(GBS::ADC_GGCTRL::read() - 1); + GBS::ADC_BGCTRL::write(GBS::ADC_BGCTRL::read() - 1); + SerialM.println(GBS::ADC_RGCTRL::read(), HEX); + break; + case 'o': + SerialM.print(F("ADC gain-- : ")); + uopt->enableAutoGain = 0; + GBS::ADC_RGCTRL::write(GBS::ADC_RGCTRL::read() + 1); + GBS::ADC_GGCTRL::write(GBS::ADC_GGCTRL::read() + 1); + GBS::ADC_BGCTRL::write(GBS::ADC_BGCTRL::read() + 1); + SerialM.println(GBS::ADC_RGCTRL::read(), HEX); + break; + case 'A': + { + uint16_t htotal = GBS::VDS_HSYNC_RST::read(); + uint16_t hbstd = GBS::VDS_DIS_HB_ST::read(); + uint16_t hbspd = GBS::VDS_DIS_HB_SP::read(); + if ((hbstd > 4) && (hbspd < (htotal - 4))) + { + GBS::VDS_DIS_HB_ST::write(GBS::VDS_DIS_HB_ST::read() - 4); + GBS::VDS_DIS_HB_SP::write(GBS::VDS_DIS_HB_SP::read() + 4); + } + else + { + SerialM.println("limit"); + } + } + break; + case 'B': + { + uint16_t htotal = GBS::VDS_HSYNC_RST::read(); + uint16_t hbstd = GBS::VDS_DIS_HB_ST::read(); + uint16_t hbspd = GBS::VDS_DIS_HB_SP::read(); + if ((hbstd < (htotal - 4)) && (hbspd > 4)) + { + GBS::VDS_DIS_HB_ST::write(GBS::VDS_DIS_HB_ST::read() + 4); + GBS::VDS_DIS_HB_SP::write(GBS::VDS_DIS_HB_SP::read() - 4); + } + else + { + SerialM.println("limit"); + } + } + break; + case 'C': + { + // vert mask + + uint16_t vtotal = GBS::VDS_VSYNC_RST::read(); + uint16_t vbstd = GBS::VDS_DIS_VB_ST::read(); + uint16_t vbspd = GBS::VDS_DIS_VB_SP::read(); + if ((vbstd > 6) && (vbspd < (vtotal - 4))) + { + GBS::VDS_DIS_VB_ST::write(vbstd - 2); + GBS::VDS_DIS_VB_SP::write(vbspd + 2); + } + else + { + SerialM.println("limit"); + } + } + break; + case 'D': + { + // vert mask - + uint16_t vtotal = GBS::VDS_VSYNC_RST::read(); + uint16_t vbstd = GBS::VDS_DIS_VB_ST::read(); + uint16_t vbspd = GBS::VDS_DIS_VB_SP::read(); + if ((vbstd < (vtotal - 4)) && (vbspd > 6)) + { + GBS::VDS_DIS_VB_ST::write(vbstd + 2); + GBS::VDS_DIS_VB_SP::write(vbspd - 2); + } + else + { + SerialM.println("limit"); + } + } + break; + case 'q': + if (uopt->deintMode != 1) + { + uopt->deintMode = 1; + disableMotionAdaptDeinterlace(); + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read()) { + disableScanlines(); + } + saveUserPrefs(); + } + SerialM.println(F("Deinterlacer: Bob")); + break; + case 'r': + if (uopt->deintMode != 0) + { + uopt->deintMode = 0; + saveUserPrefs(); + // will enable next loop() + } + SerialM.println(F("Deinterlacer: Motion Adaptive")); + break; + case 't': + // unused now + SerialM.print(F("6-tap: ")); + if (uopt->wantTap6 == 0) + { + uopt->wantTap6 = 1; + GBS::VDS_TAP6_BYPS::write(0); + GBS::MADPT_Y_DELAY_UV_DELAY::write(GBS::MADPT_Y_DELAY_UV_DELAY::read() - 1); + SerialM.println("on"); + } + else { + uopt->wantTap6 = 0; + GBS::VDS_TAP6_BYPS::write(1); + GBS::MADPT_Y_DELAY_UV_DELAY::write(GBS::MADPT_Y_DELAY_UV_DELAY::read() + 1); + SerialM.println("off"); + } + saveUserPrefs(); + break; + case 'u': + // restart to attempt wifi station mode connect + delay(30); + WiFi.mode(WIFI_STA); + WiFi.hostname(device_hostname_partial); // _full + delay(30); + ESP.reset(); + break; + case 'v': + { + uopt->wantFullHeight = !uopt->wantFullHeight; + saveUserPrefs(); + uint8_t vidMode = getVideoMode(); + if (uopt->presetPreference == 5) { + if (GBS::GBS_PRESET_ID::read() == 0x05 || GBS::GBS_PRESET_ID::read() == 0x15) { + applyPresets(vidMode); + } + } + } + break; + case 'w': + uopt->enableCalibrationADC = !uopt->enableCalibrationADC; + saveUserPrefs(); + break; + case 'x': + uopt->preferScalingRgbhv = !uopt->preferScalingRgbhv; + SerialM.print(F("preferScalingRgbhv: ")); + if (uopt->preferScalingRgbhv) { + SerialM.println("on"); + } + else { + SerialM.println("off"); + } + saveUserPrefs(); + break; + case 'X': + SerialM.print(F("ExternalClockGenerator ")); + if (uopt->disableExternalClockGenerator == 0) { + uopt->disableExternalClockGenerator = 1; + SerialM.println("disabled"); + } + else { + uopt->disableExternalClockGenerator = 0; + SerialM.println("enabled"); + } + saveUserPrefs(); + break; + case 'z': + // sog slicer level + if (rto->currentLevelSOG > 0) { + rto->currentLevelSOG -= 1; + } + else { + rto->currentLevelSOG = 16; + } + setAndUpdateSogLevel(rto->currentLevelSOG); + optimizePhaseSP(); + SerialM.print("Phase: "); SerialM.print(rto->phaseSP); + SerialM.print(" SOG: "); SerialM.print(rto->currentLevelSOG); + SerialM.println(); + break; + case 'E': + // test option for now + SerialM.print(F("IF Auto Offset: ")); + toggleIfAutoOffset(); + if (GBS::IF_AUTO_OFST_EN::read()) { + SerialM.println("on"); + } + else { + SerialM.println("off"); + } + break; + case 'F': + // freeze pic + if (GBS::CAPTURE_ENABLE::read()) { + GBS::CAPTURE_ENABLE::write(0); + } + else { + GBS::CAPTURE_ENABLE::write(1); + } + break; + case 'K': + // scanline strength + if (uopt->scanlineStrength >= 0x10) { + uopt->scanlineStrength -= 0x10; + } + else { + uopt->scanlineStrength = 0x50; + } + if (rto->scanlinesEnabled) { + GBS::MADPT_Y_MI_OFFSET::write(uopt->scanlineStrength); + } + saveUserPrefs(); + SerialM.print(F("Scanline Strength: ")); + SerialM.println(uopt->scanlineStrength, HEX); + break; + default: + break; + } +} + +//void webSocketEvent(uint8_t num, uint8_t type, uint8_t * payload, size_t length) { +// switch (type) { +// case WStype_DISCONNECTED: +// //Serial.print("WS: #"); Serial.print(num); Serial.print(" disconnected,"); +// //Serial.print(" remaining: "); Serial.println(webSocket.connectedClients()); +// break; +// case WStype_CONNECTED: +// //Serial.print("WS: #"); Serial.print(num); Serial.print(" connected, "); +// //Serial.print(" total: "); Serial.println(webSocket.connectedClients()); +// updateWebSocketData(); +// break; +// case WStype_PONG: +// //Serial.print("p"); +// updateWebSocketData(); +// break; +// } +//} + +WiFiEventHandler disconnectedEventHandler; + +void startWebserver() +{ + persWM.setApCredentials(ap_ssid, ap_password); + persWM.onConnect([]() { + SerialM.print(F("(WiFi): STA mode connected; IP: ")); + SerialM.println(WiFi.localIP().toString()); + if (MDNS.begin(device_hostname_partial, WiFi.localIP())) { // MDNS request for gbscontrol.local + //Serial.println("MDNS started"); + MDNS.addService("http", "tcp", 80); // Add service to MDNS-SD + MDNS.announce(); + } + SerialM.println(FPSTR(st_info_string)); + }); + persWM.onAp([]() { + SerialM.println(FPSTR(ap_info_string)); + // add mdns announce here as well? + }); + + disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) + { + Serial.print("Station disconnected, reason: "); + Serial.println(event.reason); + }); + + server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) { + //Serial.println("sending web page"); + if (ESP.getFreeHeap() > 10000) { + AsyncWebServerResponse* response = request->beginResponse_P(200, "text/html", webui_html, webui_html_len); + response->addHeader("Content-Encoding", "gzip"); + request->send(response); + } + }); + + server.on("/sc", HTTP_GET, [](AsyncWebServerRequest* request) { + if (ESP.getFreeHeap() > 10000) { + int params = request->params(); + //Serial.print("got serial request params: "); + //Serial.println(params); + if (params > 0) { + AsyncWebParameter* p = request->getParam(0); + //Serial.println(p->name()); + typeOneCommand = p->name().charAt(0); + + // hack, problem with '+' command received via url param + if (typeOneCommand == ' ') { + typeOneCommand = '+'; + } + } + request->send(200); // reply + } + }); + + server.on("/uc", HTTP_GET, [](AsyncWebServerRequest* request) { + if (ESP.getFreeHeap() > 10000) { + int params = request->params(); + //Serial.print("got user request params: "); + //Serial.println(params); + if (params > 0) { + AsyncWebParameter* p = request->getParam(0); + //Serial.println(p->name()); + typeTwoCommand = p->name().charAt(0); + } + request->send(200); // reply + } + }); + + server.on("/wifi/connect", HTTP_POST, [](AsyncWebServerRequest* request) { + AsyncWebServerResponse* response = + request->beginResponse(200, "application/json", "true"); + request->send(response); + + if (request->arg("n").length()) { // n holds ssid + if (request->arg("p").length()) { // p holds password + // false = only save credentials, don't connect + WiFi.begin(request->arg("n").c_str(), request->arg("p").c_str(), 0, 0, false); + } + else { + WiFi.begin(request->arg("n").c_str(), emptyString, 0, 0, false); + } + } + else { + WiFi.begin(); + } + + typeTwoCommand = 'u'; // next loop, set wifi station mode and restart device + }); + + server.on("/bin/slots.bin", HTTP_GET, [](AsyncWebServerRequest *request) { + if (ESP.getFreeHeap() > 10000) { + SlotMetaArray slotsObject; + File slotsBinaryFileRead = SPIFFS.open(SLOTS_FILE, "r"); + + if (!slotsBinaryFileRead) { + File slotsBinaryFileWrite = SPIFFS.open(SLOTS_FILE, "w"); + for (int i = 0; i < SLOTS_TOTAL; i++) { + slotsObject.slot[i].slot = i; + slotsObject.slot[i].presetID = 0; + slotsObject.slot[i].scanlines = 0; + slotsObject.slot[i].scanlinesStrength = 0; + slotsObject.slot[i].wantVdsLineFilter = false; + slotsObject.slot[i].wantStepResponse = true; + slotsObject.slot[i].wantPeaking = true; + char emptySlotName[25] = "Empty "; + strncpy(slotsObject.slot[i].name, emptySlotName, 25); + } + slotsBinaryFileWrite.write((byte *)&slotsObject, sizeof(slotsObject)); + slotsBinaryFileWrite.close(); + } else { + slotsBinaryFileRead.close(); + } + + request->send(SPIFFS, "/slots.bin", "application/octet-stream"); + } + }); + + server.on("/slot/set", HTTP_GET, [](AsyncWebServerRequest *request) { + bool result = false; + + if (ESP.getFreeHeap() > 10000) { + int params = request->params(); + + if (params > 0) { + AsyncWebParameter *slotParam = request->getParam(0); + String slotParamValue = slotParam->value(); + char slotValue[2]; + slotParamValue.toCharArray(slotValue, sizeof(slotValue)); + uopt->presetSlot = (uint8_t)slotValue[0]; + uopt->presetPreference = 2; + saveUserPrefs(); + result = true; + } + } + + request->send(200, "application/json", result ? "true":"false"); + }); + + server.on("/slot/save", HTTP_GET, [](AsyncWebServerRequest *request) { + bool result = false; + + if (ESP.getFreeHeap() > 10000) { + int params = request->params(); + + if (params > 0) { + SlotMetaArray slotsObject; + File slotsBinaryFileRead = SPIFFS.open(SLOTS_FILE, "r"); + + if (slotsBinaryFileRead) { + slotsBinaryFileRead.read((byte *)&slotsObject, sizeof(slotsObject)); + slotsBinaryFileRead.close(); + } else { + File slotsBinaryFileWrite = SPIFFS.open(SLOTS_FILE, "w"); + + for (int i = 0; i < SLOTS_TOTAL; i++) { + slotsObject.slot[i].slot = i; + slotsObject.slot[i].presetID = 0; + slotsObject.slot[i].scanlines = 0; + slotsObject.slot[i].scanlinesStrength = 0; + slotsObject.slot[i].wantVdsLineFilter = false; + slotsObject.slot[i].wantStepResponse = true; + slotsObject.slot[i].wantPeaking = true; + char emptySlotName[25] = "Empty "; + strncpy(slotsObject.slot[i].name, emptySlotName, 25); + } + + slotsBinaryFileWrite.write((byte *)&slotsObject, sizeof(slotsObject)); + slotsBinaryFileWrite.close(); + } + + // index param + AsyncWebParameter *slotIndexParam = request->getParam(0); + String slotIndexString = slotIndexParam->value(); + uint8_t slotIndex = lowByte(slotIndexString.toInt()); + + // name param + AsyncWebParameter *slotNameParam = request->getParam(1); + String slotName = slotNameParam->value(); + + char emptySlotName[25] = " "; + strncpy(slotsObject.slot[slotIndex].name, emptySlotName, 25); + + slotsObject.slot[slotIndex].slot = slotIndex; + slotName.toCharArray(slotsObject.slot[slotIndex].name, sizeof(slotsObject.slot[slotIndex].name)); + slotsObject.slot[slotIndex].presetID = rto->presetID; + slotsObject.slot[slotIndex].scanlines = uopt->wantScanlines; + slotsObject.slot[slotIndex].scanlinesStrength = uopt->scanlineStrength; + slotsObject.slot[slotIndex].wantVdsLineFilter = uopt->wantVdsLineFilter; + slotsObject.slot[slotIndex].wantStepResponse = uopt->wantStepResponse; + slotsObject.slot[slotIndex].wantPeaking = uopt->wantPeaking; + + File slotsBinaryOutputFile = SPIFFS.open(SLOTS_FILE, "w"); + slotsBinaryOutputFile.write((byte *)&slotsObject, sizeof(slotsObject)); + slotsBinaryOutputFile.close(); + + result = true; + } + } + + request->send(200, "application/json", result ? "true" : "false"); + }); + + server.on("/spiffs/upload", HTTP_GET, [](AsyncWebServerRequest *request) { + request->send(200, "application/json", "true"); + }); + + server.on("/spiffs/upload", HTTP_POST, + [](AsyncWebServerRequest *request) { request->send(200, "application/json", "true"); }, + [](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) { + if(!index){ + request->_tempFile = SPIFFS.open("/"+filename, "w"); + } + if(len) { + request->_tempFile.write(data,len); + } + if(final){ + request->_tempFile.close(); + } + } + ); + + server.on("/spiffs/download", HTTP_GET, [](AsyncWebServerRequest *request) { + if (ESP.getFreeHeap() > 10000) { + int params = request->params(); + if (params > 0) { + request->send(SPIFFS, request->getParam(0)->value(),String(), true); + } else { + request->send(200, "application/json", "false"); + } + } else { + request->send(200, "application/json", "false"); + } + }); + + server.on("/spiffs/dir", HTTP_GET, [](AsyncWebServerRequest *request) { + if (ESP.getFreeHeap() > 10000) { + Dir dir = SPIFFS.openDir("/"); + String output = "["; + + while (dir.next()) { + output += "\""; + output += dir.fileName(); + output += "\","; + delay(1); // wifi stack + } + + output += "]"; + + output.replace(",]","]"); + + request->send(200, "application/json", output); + return; + } + request->send(200, "application/json", "false"); + }); + + server.on("/spiffs/format", HTTP_GET, [](AsyncWebServerRequest *request) { + request->send(200, "application/json", SPIFFS.format() ? "true":"false"); + }); + + server.on("/wifi/status", HTTP_GET, [](AsyncWebServerRequest *request) { + WiFiMode_t wifiMode = WiFi.getMode(); + request->send(200, "application/json", wifiMode == WIFI_AP ? "{\"mode\":\"ap\"}":"{\"mode\":\"sta\",\"ssid\":\""+WiFi.SSID()+"\"}"); + }); + + server.on("/gbs/restore-filters", HTTP_GET, [](AsyncWebServerRequest *request) { + + SlotMetaArray slotsObject; + File slotsBinaryFileRead = SPIFFS.open(SLOTS_FILE, "r"); + bool result = false; + if (slotsBinaryFileRead) { + slotsBinaryFileRead.read((byte *)&slotsObject, sizeof(slotsObject)); + slotsBinaryFileRead.close(); + String slotIndexMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~()!*:,"; + uint8_t currentSlot = slotIndexMap.indexOf(uopt->presetSlot); + uopt->wantScanlines = slotsObject.slot[currentSlot].scanlines; + + SerialM.print(F("slot: ")); + SerialM.println(uopt->presetSlot); + SerialM.print(F("scanlines: ")); + if (uopt->wantScanlines) { + SerialM.println(F("on (Line Filter recommended)")); + } + else { + disableScanlines(); + SerialM.println("off"); + } + saveUserPrefs(); + + uopt->scanlineStrength = slotsObject.slot[currentSlot].scanlinesStrength; + uopt->wantVdsLineFilter = slotsObject.slot[currentSlot].wantVdsLineFilter; + uopt->wantStepResponse = slotsObject.slot[currentSlot].wantStepResponse; + uopt->wantPeaking = slotsObject.slot[currentSlot].wantPeaking; + result = true; + } + + request->send(200, "application/json",result ? "true":"false"); + }); + + //webSocket.onEvent(webSocketEvent); + + persWM.setConnectNonBlock(true); + if (WiFi.SSID().length() == 0) { + // no stored network to connect to > start AP mode right away + persWM.setupWiFiHandlers(); + persWM.startApMode(); + } + else { + persWM.begin(); // first try connecting to stored network, go AP mode after timeout + } + + server.begin(); // Webserver for the site + webSocket.begin(); // Websocket for interaction + yield(); + +#ifdef HAVE_PINGER_LIBRARY + // pinger library + pinger.OnReceive([](const PingerResponse& response) + { + if (response.ReceivedResponse) + { + Serial.printf( + "Reply from %s: time=%lums\n", + response.DestIPAddress.toString().c_str(), + response.ResponseTime + ); + + pingLastTime = millis() - 900; // produce a fast stream of pings if connection is good + } + else + { + Serial.printf("Request timed out.\n"); + } + + // Return true to continue the ping sequence. + // If current event returns false, the ping sequence is interrupted. + return true; + }); + + pinger.OnEnd([](const PingerResponse& response) + { + // detailed info not necessary + return true; + }); +#endif +} + +void initUpdateOTA() { + ArduinoOTA.setHostname("GBS OTA"); + + // ArduinoOTA.setPassword("admin"); + // Password can be set with it's md5 value as well + // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 + //ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); + + // update: no password is as (in)secure as this publicly stated hash.. + // rely on the user having to enable the OTA feature on the web ui + + ArduinoOTA.onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else // U_SPIFFS + type = "filesystem"; + + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + SPIFFS.end(); + SerialM.println("Start updating " + type); + }); + ArduinoOTA.onEnd([]() { + SerialM.println("\nEnd"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + SerialM.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + SerialM.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) SerialM.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) SerialM.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) SerialM.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) SerialM.println("Receive Failed"); + else if (error == OTA_END_ERROR) SerialM.println("End Failed"); + }); + ArduinoOTA.begin(); + yield(); +} + +// sets every element of str to 0 (clears array) +void StrClear(char *str, uint16_t length) +{ + for (int i = 0; i < length; i++) { + str[i] = 0; + } +} + +const uint8_t* loadPresetFromSPIFFS(byte forVideoMode) { + static uint8_t preset[432]; + String s = ""; + uint8_t slot = 0; + File f; + + f = SPIFFS.open("/preferencesv2.txt", "r"); + if (f) { + SerialM.println(F("preferencesv2.txt opened")); + uint8_t result[3]; + result[0] = f.read(); // todo: move file cursor manually + result[1] = f.read(); + result[2] = f.read(); + + f.close(); + if (result[2] < SLOTS_TOTAL) { // # of slots + slot = result[2]; // otherwise not stored on spiffs + } + } + else { + // file not found, we don't know what preset to load + SerialM.println(F("please select a preset slot first!")); // say "slot" here to make people save usersettings + if (forVideoMode == 2 || forVideoMode == 4) return pal_240p; + else return ntsc_240p; + } + + SerialM.print(F("loading from preset slot ")); SerialM.print((char)slot); + SerialM.print(": "); + + if (forVideoMode == 1) { + f = SPIFFS.open("/preset_ntsc." + String((char)slot), "r"); + } + else if (forVideoMode == 2) { + f = SPIFFS.open("/preset_pal." + String((char)slot), "r"); + } + else if (forVideoMode == 3) { + f = SPIFFS.open("/preset_ntsc_480p." + String((char)slot), "r"); + } + else if (forVideoMode == 4) { + f = SPIFFS.open("/preset_pal_576p." + String((char)slot), "r"); + } + else if (forVideoMode == 5) { + f = SPIFFS.open("/preset_ntsc_720p." + String((char)slot), "r"); + } + else if (forVideoMode == 6) { + f = SPIFFS.open("/preset_ntsc_1080p." + String((char)slot), "r"); + } + else if (forVideoMode == 8) { + f = SPIFFS.open("/preset_medium_res." + String((char)slot), "r"); + } + else if (forVideoMode == 14) { + f = SPIFFS.open("/preset_vga_upscale." + String((char)slot), "r"); + } + else if (forVideoMode == 0) { + f = SPIFFS.open("/preset_unknown." + String((char)slot), "r"); + } + + if (!f) { + SerialM.println(F("no preset file for this slot and source")); + if (forVideoMode == 2 || forVideoMode == 4) return pal_240p; + else return ntsc_240p; + } + else { + SerialM.println(f.name()); + s = f.readStringUntil('}'); + f.close(); + } + + char *tmp; + uint16_t i = 0; + tmp = strtok(&s[0], ","); + while (tmp) { + preset[i++] = (uint8_t)atoi(tmp); + tmp = strtok(NULL, ","); + yield(); // wifi stack + } + + return preset; +} + +void savePresetToSPIFFS() { + uint8_t readout = 0; + File f; + uint8_t slot = 0; + + // first figure out if the user has set a preferenced slot + f = SPIFFS.open("/preferencesv2.txt", "r"); + if (f) { + uint8_t result[3]; + result[0] = f.read(); // todo: move file cursor manually + result[1] = f.read(); + result[2] = f.read(); + + f.close(); + slot = result[2]; // got the slot to save to now + } + else { + // file not found, we don't know where to save this preset + SerialM.println(F("please select a preset slot first!")); + return; + } + + SerialM.print(F("saving to preset slot ")); SerialM.println(String((char)slot)); + + if (rto->videoStandardInput == 1) { + f = SPIFFS.open("/preset_ntsc." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 2) { + f = SPIFFS.open("/preset_pal." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 3) { + f = SPIFFS.open("/preset_ntsc_480p." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 4) { + f = SPIFFS.open("/preset_pal_576p." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 5) { + f = SPIFFS.open("/preset_ntsc_720p." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 6) { + f = SPIFFS.open("/preset_ntsc_1080p." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 8) { + f = SPIFFS.open("/preset_medium_res." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 14) { + f = SPIFFS.open("/preset_vga_upscale." + String((char)slot), "w"); + } + else if (rto->videoStandardInput == 0) { + f = SPIFFS.open("/preset_unknown." + String((char)slot), "w"); + } + + if (!f) { + SerialM.println(F("open save file failed!")); + } + else { + SerialM.println(F("open save file ok")); + + GBS::GBS_PRESET_CUSTOM::write(1); // use one reserved bit to mark this as a custom preset + // don't store scanlines + if (GBS::GBS_OPTION_SCANLINES_ENABLED::read() == 1) { + disableScanlines(); + } + + if (!rto->extClockGenDetected) { + if (uopt->enableFrameTimeLock && FrameSync::getSyncLastCorrection() != 0) { + FrameSync::reset(uopt->frameTimeLockMethod); + } + } + + for (int i = 0; i <= 5; i++) { + writeOneByte(0xF0, i); + switch (i) { + case 0: + for (int x = 0x40; x <= 0x5F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + for (int x = 0x90; x <= 0x9F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + break; + case 1: + for (int x = 0x0; x <= 0x2F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + break; + case 2: + // not needed anymore + break; + case 3: + for (int x = 0x0; x <= 0x7F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + break; + case 4: + for (int x = 0x0; x <= 0x5F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + break; + case 5: + for (int x = 0x0; x <= 0x6F; x++) { + readFromRegister(x, 1, &readout); + f.print(readout); f.println(","); + } + break; + } + } + f.println("};"); + SerialM.print(F("preset saved as: ")); + SerialM.println(f.name()); + f.close(); + } +} + +void saveUserPrefs() { + File f = SPIFFS.open("/preferencesv2.txt", "w"); + if (!f) { + SerialM.println(F("saveUserPrefs: open file failed")); + return; + } + f.write(uopt->presetPreference + '0'); // #1 + f.write(uopt->enableFrameTimeLock + '0'); + f.write(uopt->presetSlot); + f.write(uopt->frameTimeLockMethod + '0'); + f.write(uopt->enableAutoGain + '0'); + f.write(uopt->wantScanlines + '0'); + f.write(uopt->wantOutputComponent + '0'); + f.write(uopt->deintMode + '0'); + f.write(uopt->wantVdsLineFilter + '0'); + f.write(uopt->wantPeaking + '0'); + f.write(uopt->preferScalingRgbhv + '0'); + f.write(uopt->wantTap6 + '0'); + f.write(uopt->PalForce60 + '0'); + f.write(uopt->matchPresetSource + '0'); // #14 + f.write(uopt->wantStepResponse + '0'); // #15 + f.write(uopt->wantFullHeight + '0'); // #16 + f.write(uopt->enableCalibrationADC + '0'); // #17 + f.write(uopt->scanlineStrength + '0'); // #18 + f.write(uopt->disableExternalClockGenerator + '0'); // #19 + + + f.close(); +} + +#endif + +//OLED Functionality +void settingsMenuOLED(){ + uint8_t videoMode = getVideoMode(); + byte button_nav = digitalRead(pin_switch); + if(button_nav == LOW){ + delay(350); //TODO + oled_subsetFrame++; //this button counter for navigating menu + oled_selectOption++; + } + //main menu + if(oled_page == 0){ + pointerfunction(); + display.clear(); + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.setFont(ArialMT_Plain_16); + display.drawString(0, oled_main_pointer, ">"); + display.drawString(14, 0, String(oled_menu[0])); + display.drawString(14, 15, String(oled_menu[1])); + display.drawString(14, 30, String(oled_menu[2])); + display.drawString(14, 45, String(oled_menu[3])); + display.display(); + } + //cursor location on main menu + if (oled_main_pointer == 0 && oled_subsetFrame == 0){ + oled_pointer_count = 0; + oled_menuItem = 1; + } if (oled_main_pointer == 15 && oled_subsetFrame == 0){ + oled_pointer_count = 0; + oled_menuItem = 2; + } if (oled_main_pointer == 30 && oled_subsetFrame == 0){ + oled_pointer_count = 0; + oled_sub_pointer = 0; + oled_menuItem = 3; + } if(oled_main_pointer == 45 && oled_subsetFrame == 0){ + oled_pointer_count = 0; + oled_menuItem = 4; + } + + + //resolution pages + if (oled_menuItem == 1 && oled_subsetFrame == 1){ + oled_page = 1; + oled_main_pointer = 0; + subpointerfunction(); + display.clear(); + display.drawString(0, oled_sub_pointer, ">"); + display.drawString(14, 0, String(oled_Resolutions[0])); + display.drawString(14, 15, String(oled_Resolutions[1])); + display.drawString(14, 30, String(oled_Resolutions[2])); + display.drawString(14, 45, String(oled_Resolutions[3])); + display.display(); + } else if (oled_menuItem == 1 && oled_subsetFrame == 2){ + subpointerfunction(); + oled_page = 2; + display.clear(); + display.drawString(0, oled_sub_pointer, ">"); + display.drawString(14, 0, String(oled_Resolutions[4])); + display.drawString(14, 15, String(oled_Resolutions[5])); + display.drawString(14, 30, String(oled_Resolutions[6])); + display.drawString(14, 45, "-----Back"); + display.display(); + if(oled_sub_pointer <= -15){ + oled_page = 1; + oled_subsetFrame = 1; + oled_sub_pointer = 45; + display.clear(); + } else if (oled_sub_pointer > 45){ + oled_page = 2; + oled_subsetFrame = 2; + oled_sub_pointer = 45; + } + } +//selection + //1280x960 +if(oled_menuItem == 1){ + if(oled_pointer_count == 0 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"1280x960"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 0; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + //1280x1024 + if (oled_pointer_count == 1 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"1280x1024"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 4; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + //1280x720 + if(oled_pointer_count == 2 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"1280x720"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 3; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + //1920x1080 + if(oled_pointer_count == 3 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"1920x1080"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 5; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + //720x480 + if(oled_pointer_count == 4 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"480/576"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 1; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + //downscale + if(oled_pointer_count == 5 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i <= 800; i++){ + display.clear(); + display.drawString(0,10,"Downscale"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + if(videoMode == 0 && GBS::STATUS_SYNC_PROC_HSACT::read()) + videoMode = rto->videoStandardInput; + uopt->presetPreference = 6; + rto->useHdmiSyncFix = 1; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(videoMode); + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + //passthrough/bypass + if(oled_pointer_count == 6 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i<=800; i++){ + display.clear(); + display.drawString(0,10,"Pass-Through"); + display.drawString(0,30,"Loaded!"); + display.display(); + } + setOutModeHdBypass(); + uopt->presetPreference = 10; + if(uopt->presetPreference == 10 && rto->videoStandardInput != 15){ + rto->autoBestHtotalEnabled = 0; + if(rto->applyPresetDoneStage == 11){ + rto->applyPresetDoneStage = 1; + } else { + rto->applyPresetDoneStage = 10; + } + } else { + rto->applyPresetDoneStage = 1; + } + saveUserPrefs(); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + //go back + if (oled_pointer_count == 7 && oled_selectOption == 2){ + oled_page = 0; + oled_subsetFrame = 0; + oled_main_pointer = 0; + oled_sub_pointer = 0; + oled_selectOption = 0; + } +} +//Presets pages + if(oled_menuItem == 2 && oled_subsetFrame == 1){ + oled_page = 1; + oled_main_pointer = 0; + subpointerfunction(); + display.clear(); + display.setTextAlignment(TEXT_ALIGN_CENTER); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset Slot:"); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,String(oled_Presets[oled_pointer_count])); + display.display(); + } else if (oled_menuItem == 2 && oled_subsetFrame == 2){ + oled_page = 2; + subpointerfunction(); + display.clear(); + display.setTextAlignment(TEXT_ALIGN_CENTER); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset Slot:"); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,String(oled_Presets[oled_pointer_count])); + display.display(); + } +//Preset selection +if(oled_menuItem == 2){ + if (oled_pointer_count == 0 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'A'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i <= 280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); //first array element selected + display.drawString(64,-8,"Preset #" + String(oled_Presets[0])); //set to frame that "doesnt exist" + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); //display loading conf + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); //allowing "catchup" + oled_selectOption = 1; //reset select container + oled_subsetFrame = 1; //switch back to prev frame (prev screen) + } + if(oled_pointer_count == 1 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'B'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[1])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + if(oled_pointer_count == 2 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'C'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[2])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + if(oled_pointer_count == 3 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'D'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[3])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + if(oled_pointer_count == 4 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'E'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[4])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + if(oled_pointer_count == 5 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'F'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[5])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + if(oled_pointer_count == 6 && oled_selectOption == 2){ + oled_subsetFrame = 3; + uopt->presetSlot = 'G'; + uopt->presetPreference = 2; + saveUserPrefs(); + for(int i = 0; i<=280; i++){ + display.clear(); + display.setFont(Open_Sans_Regular_20); + display.drawString(64,-8,"Preset #" + String(oled_Presets[6])); + display.setFont(Open_Sans_Regular_35); + display.drawString(64,15,"Loaded!"); + display.display(); + } + uopt->presetPreference = 2; + if(rto->videoStandardInput == 14){ + rto->videoStandardInput = 15; + } else { + applyPresets(rto->videoStandardInput); + } + saveUserPrefs(); + delay(50); + oled_selectOption = 1; + oled_subsetFrame = 2; + } + if(oled_pointer_count == 7 && oled_selectOption == 2){ + oled_page = 0; + oled_subsetFrame = 0; + oled_main_pointer = 0; + oled_sub_pointer = 0; + oled_selectOption = 0; + } + } +//Misc pages + if(oled_menuItem == 3 && oled_subsetFrame == 1){ + oled_page = 1; + oled_main_pointer = 0; + subpointerfunction(); + display.clear(); + display.drawString(0,oled_sub_pointer,">"); + display.drawString(14,0,String(oled_Misc[0])); + display.drawString(14,15,String(oled_Misc[1])); + display.drawString(14,45,String(oled_Misc[2])); + display.display(); + if(oled_sub_pointer <= 0){ + oled_sub_pointer = 0; + } if (oled_sub_pointer >= 45){ + oled_sub_pointer = 45; + } + } +//Misc selection +if(oled_menuItem == 3){ + if(oled_pointer_count == 0 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for (int i = 0; i<=800; i++){ + display.clear(); + display.drawString(0,10,"Resetting GBS"); + display.drawString(0,30,"Please Wait..."); + display.display(); + } + webSocket.close(); + delay(60); + ESP.reset(); + oled_selectOption = 0; + oled_subsetFrame = 0; + } + + if(oled_pointer_count == 1 && oled_selectOption == 2){ + oled_subsetFrame = 3; + for(int i = 0; i<=800; i++){ + display.clear(); + display.drawString(0,10,"Defaults Loading"); + display.drawString(0,30,"Please Wait..."); + display.display(); + } + webSocket.close(); + loadDefaultUserOptions(); + saveUserPrefs(); + delay(60); + ESP.reset(); + oled_selectOption = 1; + oled_subsetFrame = 1; + } + + if(oled_pointer_count == 3 && oled_selectOption == 2){ + oled_page = 0; + oled_subsetFrame = 0; + oled_main_pointer = 0; + oled_sub_pointer = 0; + oled_selectOption = 0; + } +} +//Current Settings pages + if(oled_menuItem == 4 && oled_subsetFrame == 1){ + boolean vsyncActive = 0; + boolean hsyncActive = 0; + float ofr = getOutputFrameRate(); + uint8_t currentInput = GBS::ADC_INPUT_SEL::read(); + rto->presetID = GBS::GBS_PRESET_ID::read(); + + oled_page = 1; + oled_pointer_count = 0; + oled_main_pointer = 0; + + subpointerfunction(); + display.clear(); + display.setFont(URW_Gothic_L_Book_20); + display.setTextAlignment(TEXT_ALIGN_LEFT); + + if (rto->presetID == 0x01 || rto->presetID == 0x11){ + display.drawString(0,0,"1280x960"); + } + else if (rto->presetID == 0x02 || rto->presetID == 0x12){ + display.drawString(0,0,"1280x1024"); + } + else if (rto->presetID == 0x03 || rto->presetID == 0x13){ + display.drawString(0,0,"1280x720"); + } + else if (rto->presetID == 0x05 || rto->presetID == 0x15){ + display.drawString(0,0,"1920x1080"); + } + else if (rto->presetID == 0x06 || rto->presetID == 0x16){ + display.drawString(0,0,"Downscale"); + } + else if (rto->presetID == 0x04){ + display.drawString(0,0,"720x480"); + } + else if (rto->presetID == 0x14) { + display.drawString(0,0,"768x576"); + } + else { + display.drawString(0,0,"bypass"); + } + + display.drawString(0,20,String(ofr,5) + "Hz"); + + if(currentInput == 1){ + display.drawString(0,41,"RGB"); + } else { + display.drawString(0,41,"YpBpR"); + } + + if(currentInput == 1){ + vsyncActive = GBS::STATUS_SYNC_PROC_VSACT::read(); + if(vsyncActive){ + display.drawString(70, 41, "V"); + hsyncActive = GBS::STATUS_SYNC_PROC_HSACT::read(); + if(hsyncActive){ + display.drawString(53, 41, "H"); + } + } + } + display.display(); + + } +//current setting Selection + if(oled_menuItem == 4){ + if(oled_pointer_count >= 0 && oled_selectOption == 2){ + oled_page = 0; + oled_subsetFrame = 0; + oled_main_pointer = 0; + oled_sub_pointer = 0; + oled_selectOption = 0; + } + } +} + +void pointerfunction() { + if (oled_main_pointer <= 0){ + oled_main_pointer = 0; + } + if (oled_main_pointer >= 45){ //limits + oled_main_pointer = 45; + } + + if(oled_pointer_count <= 0){ + oled_pointer_count = 0; + } else if (oled_pointer_count >= 3){ + oled_pointer_count = 3; + } +} +void subpointerfunction(){ + if (oled_sub_pointer < 0){ + oled_sub_pointer = 0; + oled_subsetFrame = 1; + oled_page = 1; + } if (oled_sub_pointer > 45) { //limits to switch between the two pages + oled_sub_pointer = 0; //TODO + oled_subsetFrame = 2; + oled_page = 2; + } + // } if (sub_pointer <= -15){ //TODO: replace/take out + // sub_pointer = 0; + // page = 1; + // subsetFrame = 1; + // } + if (oled_pointer_count <= 0){ + oled_pointer_count = 0; + } else if (oled_pointer_count >= 7){ + oled_pointer_count = 7; + } +} diff --git a/images.h b/images.h new file mode 100644 index 00000000..42ed2323 --- /dev/null +++ b/images.h @@ -0,0 +1,89 @@ +#define gbsicon_width 124 +#define gbsicon_height 64 +static unsigned char gbsicon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0xf8, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, + 0x00, 0x00, 0xf0, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xe0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, + 0x06, 0x00, 0xf8, 0x7f, 0xe0, 0xff, 0x0f, 0x80, 0xff, 0x0f, 0xf0, 0x07, + 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xfe, 0xff, 0xe0, 0xff, 0x3f, 0xc0, + 0xff, 0x1f, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xff, 0xff, + 0xe1, 0xff, 0x7f, 0xe0, 0xff, 0x1f, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x07, + 0x06, 0x80, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xe0, 0xff, 0x1f, 0xf0, 0x01, + 0x00, 0x00, 0xc0, 0x07, 0x06, 0xc0, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf0, + 0xff, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x07, 0x06, 0xe0, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xf9, 0x8f, 0x0f, 0xf0, 0x01, 0xfc, 0x3f, 0xc0, 0x07, + 0x06, 0xe0, 0x1f, 0xe0, 0xf0, 0x01, 0xfc, 0xf9, 0x01, 0x08, 0xf0, 0x01, + 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xf0, 0x07, 0x80, 0xf0, 0x00, 0xf0, 0xf9, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xf0, 0x03, 0x00, + 0xf0, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0xf8, 0x01, 0x00, 0xf8, 0x00, 0xf0, 0x7d, 0x00, 0x00, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xf8, 0x01, 0x00, 0xf8, 0x00, 0xf0, 0x7d, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0x00, 0x00, + 0xf8, 0x00, 0xf0, 0x7d, 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0xfc, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0xc0, 0x07, 0x06, 0x7c, 0x00, 0x00, + 0xf8, 0x00, 0xf8, 0xfc, 0x01, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x7c, 0xf8, 0x03, 0x00, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x7f, 0xf8, + 0x0f, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, + 0xf8, 0xff, 0x3f, 0xf8, 0x1f, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3e, 0x80, 0xff, 0xf8, 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, 0xf8, 0xff, 0x1f, 0xe0, + 0xff, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, + 0xfc, 0xff, 0x1f, 0xc0, 0xff, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3e, 0xc0, 0xff, 0xfc, 0xff, 0x7f, 0x80, 0xff, 0x03, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, 0xfc, 0xff, 0x7f, 0x00, + 0xfe, 0x03, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3f, 0x00, 0xf8, + 0x7c, 0x00, 0x7e, 0x00, 0xfc, 0x03, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x1f, 0x00, 0xf8, 0x3c, 0x00, 0x7c, 0x00, 0xf8, 0x07, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x1f, 0x00, 0xf8, 0x3c, 0x00, 0x7c, 0x00, + 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3f, 0x00, 0x78, + 0x3e, 0x00, 0x7c, 0x00, 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3f, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, + 0xfe, 0x3f, 0xc0, 0x07, 0x06, 0x3f, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, + 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x3e, 0x00, 0x78, + 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0x7e, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7e, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, + 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7e, 0x00, 0x3c, + 0x3e, 0x00, 0x7e, 0x00, 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0xfc, 0x01, 0x3c, 0x3e, 0x00, 0x7f, 0x01, 0xf0, 0x03, 0xf0, 0x01, + 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0x07, 0x3f, 0x3e, 0xc0, 0x3f, 0x07, + 0xf8, 0x03, 0xf0, 0x01, 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0xff, 0x3f, + 0xfe, 0xff, 0x3f, 0xff, 0xff, 0x03, 0xf0, 0x01, 0xfc, 0x3f, 0x80, 0x07, + 0x06, 0xf8, 0xff, 0x3f, 0xfe, 0xff, 0x9f, 0xff, 0xff, 0x01, 0xf0, 0x01, + 0xf8, 0x1f, 0x80, 0x07, 0x06, 0xf8, 0xff, 0x3f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x07, 0x06, 0xf0, 0xff, 0x1f, + 0xff, 0xff, 0x87, 0xff, 0xff, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x07, + 0x06, 0xe0, 0xff, 0x0f, 0xff, 0xff, 0x83, 0xff, 0x3f, 0x00, 0xf0, 0x03, + 0x00, 0x00, 0xc0, 0x07, 0x06, 0x80, 0xff, 0x03, 0xff, 0x7f, 0x00, 0xfe, + 0x0f, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, + 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; diff --git a/images/gbsicon.xbm b/images/gbsicon.xbm new file mode 100644 index 00000000..42ed2323 --- /dev/null +++ b/images/gbsicon.xbm @@ -0,0 +1,89 @@ +#define gbsicon_width 124 +#define gbsicon_height 64 +static unsigned char gbsicon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0xf8, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, + 0x00, 0x00, 0xf0, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xe0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, + 0x06, 0x00, 0xf8, 0x7f, 0xe0, 0xff, 0x0f, 0x80, 0xff, 0x0f, 0xf0, 0x07, + 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xfe, 0xff, 0xe0, 0xff, 0x3f, 0xc0, + 0xff, 0x1f, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0xff, 0xff, + 0xe1, 0xff, 0x7f, 0xe0, 0xff, 0x1f, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x07, + 0x06, 0x80, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xe0, 0xff, 0x1f, 0xf0, 0x01, + 0x00, 0x00, 0xc0, 0x07, 0x06, 0xc0, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf0, + 0xff, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x07, 0x06, 0xe0, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xf9, 0x8f, 0x0f, 0xf0, 0x01, 0xfc, 0x3f, 0xc0, 0x07, + 0x06, 0xe0, 0x1f, 0xe0, 0xf0, 0x01, 0xfc, 0xf9, 0x01, 0x08, 0xf0, 0x01, + 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xf0, 0x07, 0x80, 0xf0, 0x00, 0xf0, 0xf9, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xf0, 0x03, 0x00, + 0xf0, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0xf8, 0x01, 0x00, 0xf8, 0x00, 0xf0, 0x7d, 0x00, 0x00, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xf8, 0x01, 0x00, 0xf8, 0x00, 0xf0, 0x7d, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0x00, 0x00, + 0xf8, 0x00, 0xf0, 0x7d, 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0xfc, + 0x00, 0x00, 0xf0, 0x01, 0xfe, 0x3f, 0xc0, 0x07, 0x06, 0x7c, 0x00, 0x00, + 0xf8, 0x00, 0xf8, 0xfc, 0x01, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x7c, 0xf8, 0x03, 0x00, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x7f, 0xf8, + 0x0f, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, + 0xf8, 0xff, 0x3f, 0xf8, 0x1f, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3e, 0x80, 0xff, 0xf8, 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, 0xf8, 0xff, 0x1f, 0xe0, + 0xff, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, + 0xfc, 0xff, 0x1f, 0xc0, 0xff, 0x00, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3e, 0xc0, 0xff, 0xfc, 0xff, 0x7f, 0x80, 0xff, 0x03, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3e, 0x80, 0xff, 0xfc, 0xff, 0x7f, 0x00, + 0xfe, 0x03, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3f, 0x00, 0xf8, + 0x7c, 0x00, 0x7e, 0x00, 0xfc, 0x03, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x1f, 0x00, 0xf8, 0x3c, 0x00, 0x7c, 0x00, 0xf8, 0x07, 0xf0, 0x01, + 0xfe, 0xff, 0xff, 0x07, 0x06, 0x1f, 0x00, 0xf8, 0x3c, 0x00, 0x7c, 0x00, + 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, 0x06, 0x3f, 0x00, 0x78, + 0x3e, 0x00, 0x7c, 0x00, 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0xff, 0xff, 0x07, + 0x06, 0x3f, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, + 0xfe, 0x3f, 0xc0, 0x07, 0x06, 0x3f, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, + 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x3e, 0x00, 0x78, + 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0x7e, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, 0xc0, 0x07, 0xf0, 0x01, + 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7e, 0x00, 0x78, 0x3e, 0x00, 0x7c, 0x00, + 0xc0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, 0x06, 0x7e, 0x00, 0x3c, + 0x3e, 0x00, 0x7e, 0x00, 0xe0, 0x07, 0xf0, 0x01, 0xfe, 0x3f, 0x80, 0x07, + 0x06, 0xfc, 0x01, 0x3c, 0x3e, 0x00, 0x7f, 0x01, 0xf0, 0x03, 0xf0, 0x01, + 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0x07, 0x3f, 0x3e, 0xc0, 0x3f, 0x07, + 0xf8, 0x03, 0xf0, 0x01, 0xfc, 0x3f, 0x80, 0x07, 0x06, 0xfc, 0xff, 0x3f, + 0xfe, 0xff, 0x3f, 0xff, 0xff, 0x03, 0xf0, 0x01, 0xfc, 0x3f, 0x80, 0x07, + 0x06, 0xf8, 0xff, 0x3f, 0xfe, 0xff, 0x9f, 0xff, 0xff, 0x01, 0xf0, 0x01, + 0xf8, 0x1f, 0x80, 0x07, 0x06, 0xf8, 0xff, 0x3f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x07, 0x06, 0xf0, 0xff, 0x1f, + 0xff, 0xff, 0x87, 0xff, 0xff, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x07, + 0x06, 0xe0, 0xff, 0x0f, 0xff, 0xff, 0x83, 0xff, 0x3f, 0x00, 0xf0, 0x03, + 0x00, 0x00, 0xc0, 0x07, 0x06, 0x80, 0xff, 0x03, 0xff, 0x7f, 0x00, 0xfe, + 0x0f, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, + 0x00, 0x00, 0xe0, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x07, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; diff --git a/ntsc_1280x1024.h b/ntsc_1280x1024.h new file mode 100644 index 00000000..f7f3da1f --- /dev/null +++ b/ntsc_1280x1024.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_1280x1024[] PROGMEM = { +0x7C, // s0_40 +0xA5, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x94, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x74, // s1_1A +0x0, // s1_1B +0x4, // s1_1C +0x0, // s1_1D +0x6, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD5, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x88, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x2, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0xE7, // s3_1 +0xA9, // s3_2 +0x42, // s3_3 +0x68, // s3_4 +0x9, // s3_5 +0x18, // s3_6 +0x1C, // s3_7 +0xE0, // s3_8 +0x1, // s3_9 +0x10, // s3_A +0x0, // s3_B +0x9, // s3_C +0x1, // s3_D +0x40, // s3_E +0x0, // s3_F +0xC0, // s3_10 +0x49, // s3_11 +0x20, // s3_12 +0x2A, // s3_13 +0x84, // s3_14 +0x2, // s3_15 +0x0, // s3_16 +0x52, // s3_17 +0x1E, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x2C, // s3_20 +0x4, // s3_21 +0x2C, // s3_22 +0x4, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x14, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xC0, // s3_6D +0x49, // s3_6E +0x20, // s3_6F +0x28, // s3_70 +0xAC, // s3_71 +0x2, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x21, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0xF0, // s4_25 +0x10, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x34, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x29, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x97, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x84, // s5_4B +0x8, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x78, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ntsc_1280x720.h b/ntsc_1280x720.h new file mode 100644 index 00000000..620a5215 --- /dev/null +++ b/ntsc_1280x720.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_1280x720[] PROGMEM = { +0x2C, // s0_40 +0x85, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x94, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x74, // s1_1A +0x0, // s1_1B +0x4, // s1_1C +0x0, // s1_1D +0x6, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD5, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x90, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x3, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0x62, // s3_1 +0xE9, // s3_2 +0x2E, // s3_3 +0xC8, // s3_4 +0x8, // s3_5 +0xD, // s3_6 +0xE, // s3_7 +0x0, // s3_8 +0x1, // s3_9 +0x10, // s3_A +0x0, // s3_B +0x9, // s3_C +0x1, // s3_D +0x60, // s3_E +0x0, // s3_F +0x12, // s3_10 +0x49, // s3_11 +0x15, // s3_12 +0xEE, // s3_13 +0xA2, // s3_14 +0x1, // s3_15 +0x0, // s3_16 +0xB2, // s3_17 +0x2A, // s3_18 +0x1, // s3_19 +0x0, // s3_1A +0x0, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x10, // s3_1E +0x0, // s3_1F +0x0, // s3_20 +0x0, // s3_21 +0x0, // s3_22 +0x0, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xE2, // s3_6D +0x65, // s3_6E +0x1F, // s3_6F +0xED, // s3_70 +0x7A, // s3_71 +0x1, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x11, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0xC0, // s4_25 +0x10, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3A, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x69, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0xF0, // s4_4D +0x20, // s4_4E +0x38, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x1, // s4_58 +0x80, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x29, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x9B, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x99, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0x27, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x44, // s5_4B +0x0, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x79, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ntsc_1920x1080.h b/ntsc_1920x1080.h new file mode 100644 index 00000000..7521b8ca --- /dev/null +++ b/ntsc_1920x1080.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_1920x1080[] PROGMEM = { +0x7C, // s0_40 +0x85, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x4A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0xFF, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x50, // s1_14 +0x4, // s1_15 +0x48, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x68, // s1_1A +0x0, // s1_1B +0x8, // s1_1C +0x0, // s1_1D +0xA, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0x40, // s1_22 +0x5, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x0, // s1_26 +0x1, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x5, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x12, // s3_0 +0x41, // s3_1 +0x56, // s3_2 +0x46, // s3_3 +0x12, // s3_4 +0x85, // s3_5 +0x10, // s3_6 +0x1C, // s3_7 +0xE0, // s3_8 +0x1, // s3_9 +0x14, // s3_A +0x80, // s3_B +0x4, // s3_C +0x1, // s3_D +0x60, // s3_E +0x0, // s3_F +0x4C, // s3_10 +0xC5, // s3_11 +0x15, // s3_12 +0x65, // s3_13 +0x84, // s3_14 +0x2, // s3_15 +0xFF, // s3_16 +0x73, // s3_17 +0x1C, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x67, // s3_20 +0x4, // s3_21 +0x67, // s3_22 +0x4, // s3_23 +0xB0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x27, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x76, // s3_6D +0xC5, // s3_6E +0x18, // s3_6F +0x64, // s3_70 +0xAC, // s3_71 +0x2, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x41, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0xD, // s4_23 +0x0, // s4_24 +0xF0, // s4_25 +0x10, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x2D, // s4_2C +0x0, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x10, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x34, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xFE, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x97, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x95, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0x27, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x4C, // s5_4B +0x9, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x78, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ntsc_240p.h b/ntsc_240p.h new file mode 100644 index 00000000..9df9e293 --- /dev/null +++ b/ntsc_240p.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_240p[] PROGMEM = { +0x7C, // s0_40 +0xA5, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x94, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x74, // s1_1A +0x0, // s1_1B +0x6, // s1_1C +0x0, // s1_1D +0x8, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD5, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x92, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x1, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0x90, // s3_1 +0x8A, // s3_2 +0x3E, // s3_3 +0xD0, // s3_4 +0x9, // s3_5 +0x1E, // s3_6 +0x18, // s3_7 +0xA0, // s3_8 +0x1, // s3_9 +0x8, // s3_A +0x0, // s3_B +0xA, // s3_C +0x1, // s3_D +0x40, // s3_E +0x0, // s3_F +0x22, // s3_10 +0x4A, // s3_11 +0x26, // s3_12 +0xE8, // s3_13 +0x63, // s3_14 +0x2, // s3_15 +0x0, // s3_16 +0x2, // s3_17 +0x20, // s3_18 +0x1, // s3_19 +0x0, // s3_1A +0x0, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x10, // s3_1E +0x0, // s3_1F +0x0, // s3_20 +0x0, // s3_21 +0x0, // s3_22 +0x0, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x27, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x0, // s3_6D +0x0, // s3_6E +0x0, // s3_6F +0x0, // s3_70 +0x8, // s3_71 +0x0, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x4, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x21, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0x18, // s4_25 +0x11, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3A, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6E, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x32, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x29, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x99, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0x30, // s5_35 +0x1, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0xC, // s5_3F +0xB, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x53, // s5_43 +0x0, // s5_44 +0x20, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x84, // s5_4B +0x8, // s5_4C +0x60, // s5_4D +0x0, // s5_4E +0xEF, // s5_4F +0x4, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ntsc_720x480.h b/ntsc_720x480.h new file mode 100644 index 00000000..47b66d82 --- /dev/null +++ b/ntsc_720x480.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_720x480[] PROGMEM = { +0x2C, // s0_40 +0x65, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0x11, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x94, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x50, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x5C, // s1_18 +0x4, // s1_19 +0x74, // s1_1A +0x0, // s1_1B +0x4, // s1_1C +0x0, // s1_1D +0x6, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD5, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0xA8, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x4, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x22, // s3_0 +0xD, // s3_1 +0xDA, // s3_2 +0x20, // s3_3 +0x64, // s3_4 +0xC9, // s3_5 +0x18, // s3_6 +0x16, // s3_7 +0x80, // s3_8 +0x1, // s3_9 +0xB4, // s3_A +0xC0, // s3_B +0x0, // s3_C +0x4, // s3_D +0x0, // s3_E +0x0, // s3_F +0xBA, // s3_10 +0xE9, // s3_11 +0x1F, // s3_12 +0x8, // s3_13 +0xA, // s3_14 +0x2, // s3_15 +0x0, // s3_16 +0xF2, // s3_17 +0x3F, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0xF, // s3_20 +0x2, // s3_21 +0xF, // s3_22 +0x2, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x14, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x94, // s3_6D +0x89, // s3_6E +0x22, // s3_6F +0x8, // s3_70 +0xA, // s3_71 +0x2, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x41, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0x90, // s4_25 +0xF, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3A, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x38, // s4_4E +0x8, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x29, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x99, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x91, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x84, // s5_4B +0x8, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x78, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ntsc_downscale.h b/ntsc_downscale.h new file mode 100644 index 00000000..b75e43d8 --- /dev/null +++ b/ntsc_downscale.h @@ -0,0 +1,434 @@ +const uint8_t ntsc_downscale[] PROGMEM = { +0x7C, // s0_40 +0x25, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0x11, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xA, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x24, // s0_90 +0x0, // s0_91 +0x47, // s0_92 +0xD4, // s0_93 +0x0, // s0_94 +0x3E, // s0_95 +0x32, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x62, // s1_0 +0xE0, // s1_1 +0x69, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0xC0, // s1_B +0x7, // s1_C +0x0, // s1_D +0xFF, // s1_E +0x4, // s1_F +0x0, // s1_10 +0x0, // s1_11 +0x88, // s1_12 +0x0, // s1_13 +0x48, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0xB0, // s1_18 +0x4, // s1_19 +0xB8, // s1_1A +0x0, // s1_1B +0xE, // s1_1C +0x0, // s1_1D +0x10, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0x40, // s1_22 +0x5, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x60, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x6, // s1_2B +0x0, // s1_2C +0x25, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x22, // s3_0 +0xFE, // s3_1 +0x79, // s3_2 +0x10, // s3_3 +0x32, // s3_4 +0x49, // s3_5 +0x14, // s3_6 +0xA, // s3_7 +0xC0, // s3_8 +0x0, // s3_9 +0xA0, // s3_A +0x80, // s3_B +0x0, // s3_C +0x5, // s3_D +0x10, // s3_E +0x0, // s3_F +0x72, // s3_10 +0x89, // s3_11 +0x1B, // s3_12 +0x4, // s3_13 +0x1, // s3_14 +0x1, // s3_15 +0x0, // s3_16 +0x2, // s3_17 +0x20, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x9, // s3_20 +0x1, // s3_21 +0x9, // s3_22 +0x1, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x40, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0xFE, // s3_3A +0x3, // s3_3B +0x3, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xDA, // s3_6D +0x49, // s3_6E +0x1F, // s3_6F +0x5, // s3_70 +0xC9, // s3_71 +0x0, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x4, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x21, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0x18, // s4_25 +0x11, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3A, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0xC, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0xC, // s4_36 +0x4, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6E, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x32, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x1D, // s5_2 +0x3B, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x43, // s5_6 +0x42, // s5_7 +0x42, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xFF, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x5F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x93, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x85, // s5_1F +0x8, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xA0, // s5_35 +0x0, // s5_36 +0xE, // s5_37 +0x7, // s5_38 +0x6, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0x14, // s5_41 +0x0, // s5_42 +0x27, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x84, // s5_4B +0x8, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x3C, // s5_4F +0x3, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x1, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ofw_RGBS.h b/ofw_RGBS.h new file mode 100644 index 00000000..c8a191ce --- /dev/null +++ b/ofw_RGBS.h @@ -0,0 +1,498 @@ +const uint8_t ofw_RGBS[] PROGMEM = { +0x7C, // s0_40 +0x45, // s0_41 +0x0, // s0_42 +0x0, // s0_43 +0x25, // s0_44 +0x1, // s0_45 +0x5F, // s0_46 +0x7, // s0_47 +0x3F, // s0_48 +0x0, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x30, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x0, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0x0, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x0, // s0_90 +0x0, // s0_91 +0x0, // s0_92 +0x0, // s0_93 +0x0, // s0_94 +0x0, // s0_95 +0x0, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x60, // s1_0 +0xE0, // s1_1 +0x64, // s1_2 +0xFF, // s1_3 +0xFF, // s1_4 +0xFF, // s1_5 +0xFF, // s1_6 +0xFF, // s1_7 +0xFF, // s1_8 +0xFF, // s1_9 +0xFF, // s1_A +0x4F, // s1_B +0x86, // s1_C +0x5, // s1_D +0x59, // s1_E +0xCB, // s1_F +0x12, // s1_10 +0x0, // s1_11 +0x47, // s1_12 +0x0, // s1_13 +0x2C, // s1_14 +0x3, // s1_15 +0x5C, // s1_16 +0x0, // s1_17 +0x57, // s1_18 +0x3, // s1_19 +0x87, // s1_1A +0x0, // s1_1B +0x4, // s1_1C +0x2, // s1_1D +0x8, // s1_1E +0x0, // s1_1F +0x18, // s1_20 +0x0, // s1_21 +0x72, // s1_22 +0x3, // s1_23 +0x7B, // s1_24 +0x6, // s1_25 +0x7F, // s1_26 +0x6, // s1_27 +0x4, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x0, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s2_0 +0x3, // s2_1 +0xCC, // s2_2 +0x0, // s2_3 +0x0, // s2_4 +0x0, // s2_5 +0x5, // s2_6 +0x5, // s2_7 +0x7, // s2_8 +0x0, // s2_9 +0x4C, // s2_A +0x4, // s2_B +0xCC, // s2_C +0x98, // s2_D +0xFF, // s2_E +0x49, // s2_F +0x21, // s2_10 +0x88, // s2_11 +0x8E, // s2_12 +0x0, // s2_13 +0x0, // s2_14 +0x0, // s2_15 +0x7C, // s2_16 +0x23, // s2_17 +0xD6, // s2_18 +0xD0, // s2_19 +0x0, // s2_1A +0x10, // s2_1B +0x0, // s2_1C +0x0, // s2_1D +0x0, // s2_1E +0x10, // s2_1F +0x51, // s2_20 +0x2, // s2_21 +0x4, // s2_22 +0xF, // s2_23 +0x0, // s2_24 +0x0, // s2_25 +0x4C, // s2_26 +0xC, // s2_27 +0x0, // s2_28 +0x0, // s2_29 +0x0, // s2_2A +0x0, // s2_2B +0x0, // s2_2C +0x0, // s2_2D +0x0, // s2_2E +0x0, // s2_2F +0x0, // s2_30 +0x0, // s2_31 +0x34, // s2_32 +0x0, // s2_33 +0x88, // s2_34 +0x47, // s2_35 +0x3, // s2_36 +0xB, // s2_37 +0x4, // s2_38 +0x64, // s2_39 +0xB, // s2_3A +0x4, // s2_3B +0x8F, // s2_3C +0x0, // s2_3D +0x0, // s2_3E +0x0, // s2_3F +0x0, // s3_0 +0x5C, // s3_1 +0x54, // s3_2 +0xB2, // s3_3 +0x2, // s3_4 +0x44, // s3_5 +0x9, // s3_6 +0x23, // s3_7 +0xFB, // s3_8 +0x81, // s3_9 +0x71, // s3_A +0x0, // s3_B +0x0, // s3_C +0x6, // s3_D +0x8, // s3_E +0x80, // s3_F +0x49, // s3_10 +0x64, // s3_11 +0xF, // s3_12 +0x23, // s3_13 +0x3B, // s3_14 +0x82, // s3_15 +0x48, // s3_16 +0xB3, // s3_17 +0x27, // s3_18 +0x2, // s3_19 +0x0, // s3_1A +0x0, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x0, // s3_1F +0x0, // s3_20 +0x0, // s3_21 +0x0, // s3_22 +0x0, // s3_23 +0x60, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x20, // s3_29 +0xDC, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x1A, // s3_31 +0x0, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x7D, // s3_35 +0x1F, // s3_36 +0x2C, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x0, // s3_42 +0x0, // s3_43 +0xF8, // s3_44 +0x1F, // s3_45 +0xF8, // s3_46 +0x1F, // s3_47 +0xF8, // s3_48 +0x1E, // s3_49 +0xD0, // s3_4A +0x20, // s3_4B +0xF8, // s3_4C +0xA, // s3_4D +0x8E, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x38, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0xB, // s3_56 +0xEA, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xEF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xDF, // s3_6B +0x3F, // s3_6C +0x0, // s3_6D +0x0, // s3_6E +0x0, // s3_6F +0x0, // s3_70 +0x8, // s3_71 +0x0, // s3_72 +0xB4, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x1, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x0, // s4_1A +0x0, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x2B, // s4_21 +0x3, // s4_22 +0x1F, // s4_23 +0xFF, // s4_24 +0xFF, // s4_25 +0xCF, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0xA4, // s4_2B +0x1E, // s4_2C +0x0, // s4_2D +0x80, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x8, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0xB4, // s4_37 +0xCC, // s4_38 +0xB7, // s4_39 +0x0, // s4_3A +0x2, // s4_3B +0x0, // s4_3C +0x4, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x4, // s4_40 +0x0, // s4_41 +0x69, // s4_42 +0x0, // s4_43 +0xFF, // s4_44 +0xFF, // s4_45 +0x7, // s4_46 +0xFF, // s4_47 +0xFF, // s4_48 +0x7, // s4_49 +0x1, // s4_4A +0x44, // s4_4B +0x0, // s4_4C +0xE0, // s4_4D +0x28, // s4_4E +0x3E, // s4_4F +0xC0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x68, // s4_54 +0x1, // s4_55 +0xC0, // s4_56 +0xB4, // s4_57 +0xCC, // s4_58 +0x5A, // s4_59 +0xCC, // s4_5A +0x4C, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0xD8, // s5_0 +0x0, // s5_1 +0x57, // s5_2 +0xF1, // s5_3 +0x0, // s5_4 +0x0, // s5_5 +0x3F, // s5_6 +0x3F, // s5_7 +0x3F, // s5_8 +0x7F, // s5_9 +0x7F, // s5_A +0x7F, // s5_B +0x0, // s5_C +0x0, // s5_D +0x0, // s5_E +0x0, // s5_F +0x0, // s5_10 +0x90, // s5_11 +0xB3, // s5_12 +0xC6, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x20, // s5_16 +0xCE, // s5_17 +0x85, // s5_18 +0x82, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x4, // s5_1F +0xD0, // s5_20 +0x20, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x5, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x4, // s5_2D +0x0, // s5_2E +0x4, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x28, // s5_33 +0x3, // s5_34 +0x15, // s5_35 +0x0, // s5_36 +0x60, // s5_37 +0x6, // s5_38 +0x7, // s5_39 +0xA, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0xC0, // s5_3E +0x3, // s5_3F +0xB, // s5_40 +0x27, // s5_41 +0x6, // s5_42 +0x7E, // s5_43 +0x6, // s5_44 +0x0, // s5_45 +0xC0, // s5_46 +0x5, // s5_47 +0xC0, // s5_48 +0x4, // s5_49 +0xC0, // s5_4A +0x34, // s5_4B +0xC0, // s5_4C +0x67, // s5_4D +0xC0, // s5_4E +0x67, // s5_4F +0xC0, // s5_50 +0x0, // s5_51 +0xC0, // s5_52 +0x5, // s5_53 +0xC0, // s5_54 +0xC0, // s5_55 +0x21, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0xC0, // s5_59 +0x1, // s5_5A +0xC8, // s5_5B +0x6, // s5_5C +0x0, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/ofw_ypbpr.h b/ofw_ypbpr.h new file mode 100644 index 00000000..a1be40e7 --- /dev/null +++ b/ofw_ypbpr.h @@ -0,0 +1,498 @@ +const uint8_t ofw_ypbpr[] PROGMEM = { +0x3C, // s0_40 +0x45, // s0_41 +0x0, // s0_42 +0x0, // s0_43 +0x25, // s0_44 +0x1, // s0_45 +0x5F, // s0_46 +0x7, // s0_47 +0x0, // s0_48 +0x0, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x0, // s0_4D +0x0, // s0_4E +0x30, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x0, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0x0, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x0, // s0_90 +0x0, // s0_91 +0x0, // s0_92 +0x0, // s0_93 +0x0, // s0_94 +0x0, // s0_95 +0x0, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x62, // s1_0 +0xE0, // s1_1 +0x64, // s1_2 +0xFF, // s1_3 +0xFF, // s1_4 +0xFF, // s1_5 +0xFF, // s1_6 +0xFF, // s1_7 +0xFF, // s1_8 +0xFF, // s1_9 +0xFF, // s1_A +0x4F, // s1_B +0x86, // s1_C +0x5, // s1_D +0x59, // s1_E +0xCB, // s1_F +0x12, // s1_10 +0x0, // s1_11 +0x47, // s1_12 +0x0, // s1_13 +0x2C, // s1_14 +0x3, // s1_15 +0x5C, // s1_16 +0x0, // s1_17 +0x57, // s1_18 +0x3, // s1_19 +0x87, // s1_1A +0x0, // s1_1B +0xFC, // s1_1C +0x1, // s1_1D +0x1C, // s1_1E +0x0, // s1_1F +0x18, // s1_20 +0x0, // s1_21 +0x72, // s1_22 +0x3, // s1_23 +0x7B, // s1_24 +0x6, // s1_25 +0x7F, // s1_26 +0x6, // s1_27 +0x4, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x0, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s2_0 +0x3, // s2_1 +0xCC, // s2_2 +0x0, // s2_3 +0x0, // s2_4 +0x0, // s2_5 +0x5, // s2_6 +0x5, // s2_7 +0x7, // s2_8 +0x0, // s2_9 +0x4C, // s2_A +0x4, // s2_B +0xCC, // s2_C +0x98, // s2_D +0xFF, // s2_E +0x49, // s2_F +0x21, // s2_10 +0x88, // s2_11 +0x8E, // s2_12 +0x0, // s2_13 +0x0, // s2_14 +0x0, // s2_15 +0x7C, // s2_16 +0x23, // s2_17 +0xD6, // s2_18 +0xD0, // s2_19 +0x0, // s2_1A +0x10, // s2_1B +0x0, // s2_1C +0x0, // s2_1D +0x0, // s2_1E +0x10, // s2_1F +0x51, // s2_20 +0x2, // s2_21 +0x4, // s2_22 +0xF, // s2_23 +0x0, // s2_24 +0x0, // s2_25 +0x4C, // s2_26 +0xC, // s2_27 +0x0, // s2_28 +0x0, // s2_29 +0x0, // s2_2A +0x0, // s2_2B +0x0, // s2_2C +0x0, // s2_2D +0x0, // s2_2E +0x0, // s2_2F +0x0, // s2_30 +0x0, // s2_31 +0x34, // s2_32 +0x0, // s2_33 +0x88, // s2_34 +0x47, // s2_35 +0x3, // s2_36 +0xB, // s2_37 +0x4, // s2_38 +0x64, // s2_39 +0xB, // s2_3A +0x4, // s2_3B +0x8F, // s2_3C +0x0, // s2_3D +0x0, // s2_3E +0x0, // s2_3F +0x0, // s3_0 +0x5C, // s3_1 +0x54, // s3_2 +0xB2, // s3_3 +0x6, // s3_4 +0xC4, // s3_5 +0x9, // s3_6 +0x23, // s3_7 +0xFB, // s3_8 +0x81, // s3_9 +0x71, // s3_A +0x0, // s3_B +0x0, // s3_C +0x6, // s3_D +0x8, // s3_E +0x80, // s3_F +0x49, // s3_10 +0x64, // s3_11 +0xF, // s3_12 +0x23, // s3_13 +0x3B, // s3_14 +0x82, // s3_15 +0x48, // s3_16 +0xB3, // s3_17 +0x27, // s3_18 +0x2, // s3_19 +0x0, // s3_1A +0x0, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x0, // s3_1F +0x0, // s3_20 +0x0, // s3_21 +0x0, // s3_22 +0x0, // s3_23 +0x60, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x20, // s3_29 +0xDC, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x1A, // s3_31 +0x0, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x7D, // s3_35 +0x1F, // s3_36 +0x2C, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x0, // s3_42 +0x0, // s3_43 +0xF8, // s3_44 +0x1F, // s3_45 +0xF8, // s3_46 +0x1F, // s3_47 +0xF8, // s3_48 +0x1E, // s3_49 +0xD0, // s3_4A +0x20, // s3_4B +0xF8, // s3_4C +0xA, // s3_4D +0x8E, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x38, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0xB, // s3_56 +0xEA, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xEF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xDF, // s3_6B +0x3F, // s3_6C +0x0, // s3_6D +0x0, // s3_6E +0x0, // s3_6F +0x0, // s3_70 +0x8, // s3_71 +0x0, // s3_72 +0xB4, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x1, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x0, // s4_1A +0x0, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x2B, // s4_21 +0x3, // s4_22 +0x1F, // s4_23 +0xFF, // s4_24 +0xFF, // s4_25 +0xCF, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0xA4, // s4_2B +0x1E, // s4_2C +0x0, // s4_2D +0x80, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x8, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0xB4, // s4_37 +0xCC, // s4_38 +0xB4, // s4_39 +0x0, // s4_3A +0x2, // s4_3B +0x0, // s4_3C +0x4, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x4, // s4_40 +0x0, // s4_41 +0x69, // s4_42 +0x0, // s4_43 +0xFF, // s4_44 +0xFF, // s4_45 +0x7, // s4_46 +0xFF, // s4_47 +0xFF, // s4_48 +0x7, // s4_49 +0x1, // s4_4A +0x44, // s4_4B +0x0, // s4_4C +0xE0, // s4_4D +0x28, // s4_4E +0x3E, // s4_4F +0xC0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x68, // s4_54 +0x1, // s4_55 +0xC0, // s4_56 +0xB4, // s4_57 +0xCC, // s4_58 +0x5A, // s4_59 +0xCC, // s4_5A +0x4C, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0xD8, // s5_0 +0x0, // s5_1 +0x17, // s5_2 +0xFB, // s5_3 +0x0, // s5_4 +0x0, // s5_5 +0x3F, // s5_6 +0x3F, // s5_7 +0x3F, // s5_8 +0x7F, // s5_9 +0x7F, // s5_A +0x7F, // s5_B +0x0, // s5_C +0x0, // s5_D +0x0, // s5_E +0x0, // s5_F +0x0, // s5_10 +0x90, // s5_11 +0xB3, // s5_12 +0xC6, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x20, // s5_16 +0xCC, // s5_17 +0x85, // s5_18 +0x82, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x4, // s5_1F +0xD0, // s5_20 +0x20, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x5, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x4, // s5_2D +0x0, // s5_2E +0x4, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x28, // s5_33 +0x3, // s5_34 +0x15, // s5_35 +0x0, // s5_36 +0x4, // s5_37 +0x4, // s5_38 +0x10, // s5_39 +0xA, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0xC0, // s5_3E +0x3, // s5_3F +0xB, // s5_40 +0x28, // s5_41 +0xC0, // s5_42 +0x3B, // s5_43 +0xC0, // s5_44 +0x0, // s5_45 +0xC0, // s5_46 +0x5, // s5_47 +0xC0, // s5_48 +0x4, // s5_49 +0xC0, // s5_4A +0x34, // s5_4B +0xC0, // s5_4C +0x67, // s5_4D +0xC0, // s5_4E +0x67, // s5_4F +0xC0, // s5_50 +0x0, // s5_51 +0xC0, // s5_52 +0x5, // s5_53 +0xC0, // s5_54 +0xC0, // s5_55 +0x21, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0xC0, // s5_59 +0x1, // s5_5A +0xC8, // s5_5B +0x6, // s5_5C +0x0, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0x0, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/osd.h b/osd.h new file mode 100644 index 00000000..85534936 --- /dev/null +++ b/osd.h @@ -0,0 +1,224 @@ +#ifndef OSD_H_ +#define OSD_H_ + +// FIXME: Geometry should really be controlled by a manager class +// which we reference by template argument, but in the meantime use +// forward declarations to functions in the main file +extern void shiftHorizontal(uint16_t amountToAdd, bool subtracting); +extern void shiftVertical(uint16_t amountToAdd, bool subtracting); +extern void scaleHorizontal(uint16_t amountToAdd, bool subtracting); +extern void scaleVertical(uint16_t amountToAdd, bool subtracting); + +enum class MenuInput { + UP, + DOWN, + FORWARD, + BACK +}; + +template +class MenuManager { + private: + enum class MenuState { + OFF, + MAIN, + ADJUST + }; + + struct MenuParam { + int16_t min; + int16_t max; + uint8_t delta; + }; + + static const MenuParam menuParams[GBS::OSD_ICON_COUNT]; + static const uint16_t menuBarLength = Attrs::barLength; + + static int16_t menuValues[GBS::OSD_ICON_COUNT]; + static MenuState menuState; + static uint8_t menuIndex; + + static void menuOn(void) { + GBS::OSD_COMMAND_FINISH::write(false); + GBS::OSD_MENU_ICON_SEL::write(GBS::osdIcon(menuIndex)); + GBS::OSD_DISP_EN::write(true); + GBS::OSD_MENU_EN::write(true); + GBS::OSD_COMMAND_FINISH::write(true); + } + + static void menuOff(void) { + GBS::OSD_COMMAND_FINISH::write(false); + GBS::OSD_DISP_EN::write(false); + GBS::OSD_MENU_EN::write(false); + GBS::OSD_COMMAND_FINISH::write(true); + } + + static void menuMoveCursor(int8_t delta) { + menuIndex = (uint8_t)(menuIndex + delta) % GBS::OSD_ICON_COUNT; + GBS::OSD_COMMAND_FINISH::write(false); + GBS::OSD_MENU_ICON_SEL::write(GBS::osdIcon(menuIndex)); + GBS::OSD_COMMAND_FINISH::write(true); + } + + static void menuUpdateBar(void) { + uint16_t span = menuParams[menuIndex].max - menuParams[menuIndex].min; + uint16_t filled = menuValues[menuIndex] - menuParams[menuIndex].min; + + GBS::OSD_BAR_LENGTH::write(menuBarLength); + GBS::OSD_BAR_FOREGROUND_VALUE::write((filled * menuBarLength) / span); + } + + static bool menuEnter(void) { + if (menuParams[menuIndex].delta == 0) + return false; + + GBS::OSD_COMMAND_FINISH::write(false); + GBS::OSD_MENU_MOD_SEL::write(GBS::osdIcon(menuIndex)); + menuUpdateBar(); + GBS::OSD_COMMAND_FINISH::write(true); + + return true; + } + + static void menuLeave(void) { + GBS::OSD_MENU_MOD_SEL::write(0); + // A reset is necessary to escape this state + GBS::OSD_SW_RESET::write(true); + GBS::OSD_SW_RESET::write(false); + menuOn(); + } + + static void menuApplyDelta(int8_t delta) { + if (menuValues[menuIndex] + delta < menuParams[menuIndex].min || + menuValues[menuIndex] + delta > menuParams[menuIndex].max) + return; + + menuValues[menuIndex] += delta; + GBS::OSD_COMMAND_FINISH::write(false); + menuUpdateBar(); + GBS::OSD_COMMAND_FINISH::write(true); + + switch (GBS::osdIcon(menuIndex)) { + case GBS::OSD_ICON_LEFT_RIGHT: + if (delta < 0) + shiftHorizontal(-delta, true); + else + shiftHorizontal(delta, false); + break; + case GBS::OSD_ICON_UP_DOWN: + if (delta < 0) + shiftVertical(-delta, true); + else + shiftVertical(delta, false); + break; + case GBS::OSD_ICON_HORIZONTAL_SIZE: + if (delta < 0) + scaleHorizontal(-delta, true); + else + scaleHorizontal(delta, false); + break; + case GBS::OSD_ICON_VERTICAL_SIZE: + if (delta < 0) + scaleVertical(-delta, false); + else + scaleVertical(delta, true); + break; + } + } + + static void menuAdjustUp(void) { + menuApplyDelta(-menuParams[menuIndex].delta); + } + + static void menuAdjustDown(void) { + menuApplyDelta(menuParams[menuIndex].delta); + } + + public: + + // Initialize basic OSD settings + static void init(void) { + memset(menuValues, 0, sizeof(menuValues)); + GBS::OSD_SW_RESET::write(true); + GBS::OSD_MENU_BAR_FONT_FORCOR::write(GBS::OSD_COLOR_WHITE); + GBS::OSD_MENU_BAR_FONT_BGCOR::write(GBS::OSD_COLOR_BLACK); + GBS::OSD_MENU_BAR_BORD_COR::write(GBS::OSD_COLOR_BLUE); + GBS::OSD_MENU_SEL_FORCOR::write(GBS::OSD_COLOR_GREEN); + GBS::OSD_MENU_SEL_BGCOR::write(GBS::OSD_COLOR_MAGENTA); + GBS::OSD_YCBCR_RGB_FORMAT::write(GBS::OSD_FORMAT_RGB); + // FIXME: these don't seem to be pixel positions, so what are they? + GBS::OSD_MENU_HORI_START::write(500 >> 3); + GBS::OSD_MENU_VER_START::write(400 >> 3); + GBS::OSD_MENU_DISP_STYLE::write(GBS::OSD_MENU_DISP_STYLE_VERTICAL); + GBS::OSD_HORIZONTAL_ZOOM::write(GBS::OSD_ZOOM_3X); + GBS::OSD_VERTICAL_ZOOM::write(GBS::OSD_ZOOM_3X); + GBS::OSD_DISP_EN::write(false); + GBS::OSD_MENU_EN::write(false); + GBS::OSD_SW_RESET::write(false); + } + + static void run(MenuInput input) { + switch (menuState) { + case MenuState::OFF: + if (input == MenuInput::FORWARD) { + menuOn(); + menuState = MenuState::MAIN; + } + break; + case MenuState::MAIN: + switch (input) { + case MenuInput::BACK: + menuOff(); + menuState = MenuState::OFF; + break; + case MenuInput::UP: + menuMoveCursor(-1); + break; + case MenuInput::DOWN: + menuMoveCursor(1); + break; + case MenuInput::FORWARD: + if (menuEnter()) + menuState = MenuState::ADJUST; + } + break; + case MenuState::ADJUST: + switch (input) { + case MenuInput::BACK: + menuLeave(); + menuState = MenuState::MAIN; + break; + case MenuInput::UP: + menuAdjustUp(); + break; + case MenuInput::DOWN: + menuAdjustDown(); + break; + default: + break; + } + break; + } + } +}; + +template +const typename MenuManager::MenuParam MenuManager::menuParams[GBS::OSD_ICON_COUNT] = { + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + { -Attrs::vertShiftRange / 2, Attrs::vertShiftRange / 2, Attrs::shiftDelta}, + { -Attrs::horizShiftRange / 2, Attrs::horizShiftRange / 2, Attrs::shiftDelta}, + { -Attrs::vertScaleRange / 2, Attrs::vertScaleRange / 2, Attrs::scaleDelta}, + { -Attrs::horizScaleRange / 2, Attrs::horizScaleRange / 2, Attrs::scaleDelta} +}; + +template +int16_t MenuManager::menuValues[GBS::OSD_ICON_COUNT]; +template +typename MenuManager::MenuState MenuManager::menuState = MenuState::OFF; +template +uint8_t MenuManager::menuIndex = 0; + +#endif diff --git a/pal_1280x1024.h b/pal_1280x1024.h new file mode 100644 index 00000000..9abe9b2c --- /dev/null +++ b/pal_1280x1024.h @@ -0,0 +1,434 @@ +const uint8_t pal_1280x1024[] PROGMEM = { +0x2C, // s0_40 +0x85, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0xA, // s1_C +0x0, // s1_D +0x6E, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x48, // s1_18 +0x4, // s1_19 +0x70, // s1_1A +0x0, // s1_1B +0x2C, // s1_1C +0x0, // s1_1D +0x2E, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xAF, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x8C, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x12, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0xF0, // s3_1 +0xA7, // s3_2 +0x42, // s3_3 +0x98, // s3_4 +0xE7, // s3_5 +0xD, // s3_6 +0x3, // s3_7 +0x40, // s3_8 +0x1, // s3_9 +0x0, // s3_A +0x40, // s3_B +0x8, // s3_C +0x1, // s3_D +0x60, // s3_E +0x0, // s3_F +0xD4, // s3_10 +0x87, // s3_11 +0x16, // s3_12 +0x28, // s3_13 +0x74, // s3_14 +0x1, // s3_15 +0x49, // s3_16 +0x2, // s3_17 +0x20, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x2C, // s3_20 +0x4, // s3_21 +0x2C, // s3_22 +0x4, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xE4, // s3_6D +0x7, // s3_6E +0x16, // s3_6F +0x28, // s3_70 +0x6C, // s3_71 +0x1, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x32, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x51, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x1F, // s4_23 +0x0, // s4_24 +0x70, // s4_25 +0x15, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x26, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0x20, // s4_45 +0x5, // s4_46 +0x0, // s4_47 +0x20, // s4_48 +0x5, // s4_49 +0x10, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x3C, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x1, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xDD, // s5_12 +0x8, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x91, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0x30, // s5_35 +0x1, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x20, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x54, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x3E, // s5_4B +0x8, // s5_4C +0x98, // s5_4D +0x0, // s5_4E +0xFE, // s5_4F +0x4, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/pal_1280x720.h b/pal_1280x720.h new file mode 100644 index 00000000..28ae3eb7 --- /dev/null +++ b/pal_1280x720.h @@ -0,0 +1,434 @@ +const uint8_t pal_1280x720[] PROGMEM = { +0x7C, // s0_40 +0x65, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x92, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x70, // s1_1A +0x0, // s1_1B +0x1E, // s1_1C +0x0, // s1_1D +0x20, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD3, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x90, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x13, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0x75, // s3_1 +0xE8, // s3_2 +0x2E, // s3_3 +0x84, // s3_4 +0x47, // s3_5 +0x10, // s3_6 +0x3, // s3_7 +0x0, // s3_8 +0x1, // s3_9 +0x18, // s3_A +0x0, // s3_B +0x8, // s3_C +0x1, // s3_D +0x70, // s3_E +0x0, // s3_F +0xD4, // s3_10 +0x87, // s3_11 +0x17, // s3_12 +0xEC, // s3_13 +0xA2, // s3_14 +0x1, // s3_15 +0x72, // s3_16 +0x32, // s3_17 +0x33, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0xF0, // s3_20 +0x2, // s3_21 +0xF0, // s3_22 +0x2, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xB8, // s3_6D +0xA7, // s3_6E +0x17, // s3_6F +0xEC, // s3_70 +0x4A, // s3_71 +0x1, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x51, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x1F, // s4_23 +0x0, // s4_24 +0x70, // s4_25 +0x15, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x28, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x4, // s4_37 +0x1, // s4_38 +0x4, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0xD0, // s4_45 +0x4, // s4_46 +0x0, // s4_47 +0xD0, // s4_48 +0x4, // s4_49 +0x10, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x36, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x25, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x91, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x91, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0x30, // s5_35 +0x1, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x20, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x54, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x80, // s5_4B +0x8, // s5_4C +0x98, // s5_4D +0x0, // s5_4E +0xFE, // s5_4F +0x4, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/pal_1920x1080.h b/pal_1920x1080.h new file mode 100644 index 00000000..14a4904c --- /dev/null +++ b/pal_1920x1080.h @@ -0,0 +1,434 @@ +const uint8_t pal_1920x1080[] PROGMEM = { +0x7C, // s0_40 +0x65, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0x11, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xA, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0xA, // s1_C +0x0, // s1_D +0xFC, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x48, // s1_14 +0x4, // s1_15 +0x48, // s1_16 +0x0, // s1_17 +0x64, // s1_18 +0x4, // s1_19 +0x68, // s1_1A +0x0, // s1_1B +0x26, // s1_1C +0x0, // s1_1D +0x28, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0x3D, // s1_22 +0x5, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x10, // s1_26 +0x1, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x15, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x12, // s3_0 +0xA4, // s3_1 +0x55, // s3_2 +0x46, // s3_3 +0xB4, // s3_4 +0xA4, // s3_5 +0xA, // s3_6 +0x3, // s3_7 +0x0, // s3_8 +0x1, // s3_9 +0x8, // s3_A +0x80, // s3_B +0x3, // s3_C +0x1, // s3_D +0x60, // s3_E +0x0, // s3_F +0xEE, // s3_10 +0x4, // s3_11 +0x10, // s3_12 +0x65, // s3_13 +0xC4, // s3_14 +0x1, // s3_15 +0xFF, // s3_16 +0x3, // s3_17 +0x20, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x67, // s3_20 +0x4, // s3_21 +0x67, // s3_22 +0x4, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x40, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0xD8, // s3_6D +0x4, // s3_6E +0x10, // s3_6F +0x63, // s3_70 +0xCC, // s3_71 +0x1, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x32, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x41, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x1F, // s4_23 +0x0, // s4_24 +0x70, // s4_25 +0x15, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x18, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0x20, // s4_45 +0x5, // s4_46 +0x0, // s4_47 +0x20, // s4_48 +0x5, // s4_49 +0x10, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x3C, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xF9, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x95, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x46, // s5_4B +0x9, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x84, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/pal_240p.h b/pal_240p.h new file mode 100644 index 00000000..34ed62b9 --- /dev/null +++ b/pal_240p.h @@ -0,0 +1,434 @@ +const uint8_t pal_240p[] PROGMEM = { +0x2C, // s0_40 +0x85, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0xD, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0xA, // s1_C +0x0, // s1_D +0x6E, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x40, // s1_18 +0x4, // s1_19 +0x70, // s1_1A +0x0, // s1_1B +0x28, // s1_1C +0x0, // s1_1D +0x2A, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xAF, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x88, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x11, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0x76, // s3_1 +0x88, // s3_2 +0x3E, // s3_3 +0xD4, // s3_4 +0x47, // s3_5 +0x16, // s3_6 +0x3, // s3_7 +0x0, // s3_8 +0x1, // s3_9 +0x18, // s3_A +0x80, // s3_B +0x9, // s3_C +0x1, // s3_D +0x60, // s3_E +0x0, // s3_F +0x1A, // s3_10 +0xE8, // s3_11 +0x1E, // s3_12 +0xE4, // s3_13 +0x3B, // s3_14 +0x1, // s3_15 +0x5F, // s3_16 +0x92, // s3_17 +0x24, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0xEA, // s3_20 +0x3, // s3_21 +0xEA, // s3_22 +0x3, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x1C, // s3_6D +0xA8, // s3_6E +0x1D, // s3_6F +0xE4, // s3_70 +0x2B, // s3_71 +0x1, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x32, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x41, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x1F, // s4_23 +0x0, // s4_24 +0xA0, // s4_25 +0x15, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x22, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0x20, // s4_45 +0x5, // s4_46 +0x0, // s4_47 +0x20, // s4_48 +0x5, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x3B, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x1, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xDD, // s5_12 +0x8, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x91, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0x30, // s5_35 +0x1, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x20, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x54, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x3F, // s5_4B +0x8, // s5_4C +0x98, // s5_4D +0x0, // s5_4E +0xFE, // s5_4F +0x4, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/pal_768x576.h b/pal_768x576.h new file mode 100644 index 00000000..01c54c1f --- /dev/null +++ b/pal_768x576.h @@ -0,0 +1,434 @@ +const uint8_t pal_768x576[] PROGMEM = { +0x2C, // s0_40 +0x65, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0x11, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xB, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x82, // s0_90 +0x0, // s0_91 +0x4E, // s0_92 +0xC5, // s0_93 +0x0, // s0_94 +0x10, // s0_95 +0x10, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x2, // s1_0 +0xE1, // s1_1 +0x6A, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0x50, // s1_B +0x6, // s1_C +0x0, // s1_D +0x94, // s1_E +0x4, // s1_F +0x2, // s1_10 +0x0, // s1_11 +0x48, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x60, // s1_18 +0x4, // s1_19 +0x78, // s1_1A +0x0, // s1_1B +0x28, // s1_1C +0x0, // s1_1D +0x2A, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0xD5, // s1_22 +0x4, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x8C, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x14, // s1_2B +0x0, // s1_2C +0x0, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x2, // s3_0 +0x27, // s3_1 +0x1A, // s3_2 +0x27, // s3_3 +0x60, // s3_4 +0x9, // s3_5 +0x19, // s3_6 +0x2, // s3_7 +0x40, // s3_8 +0x0, // s3_9 +0xC4, // s3_A +0xC0, // s3_B +0x1, // s3_C +0x5, // s3_D +0x10, // s3_E +0x0, // s3_F +0xBC, // s3_10 +0x49, // s3_11 +0x23, // s3_12 +0x4E, // s3_13 +0xCA, // s3_14 +0x0, // s3_15 +0x0, // s3_16 +0xF2, // s3_17 +0x3F, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x73, // s3_20 +0x2, // s3_21 +0x73, // s3_22 +0x2, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x0, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0x0, // s3_3A +0x0, // s3_3B +0x0, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x98, // s3_6D +0x8, // s3_6E +0x19, // s3_6F +0x4E, // s3_70 +0xCA, // s3_71 +0x0, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x30, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x6, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x41, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x8, // s4_23 +0x0, // s4_24 +0x40, // s4_25 +0x13, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x2B, // s4_2C +0x0, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x0, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0x70, // s4_45 +0x5, // s4_46 +0x0, // s4_47 +0x70, // s4_48 +0x5, // s4_49 +0x0, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0xE, // s4_4E +0x12, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x5B, // s5_2 +0x31, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x40, // s5_6 +0x40, // s5_7 +0x40, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0x29, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x6F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x99, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x81, // s5_1F +0x0, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xC0, // s5_35 +0x0, // s5_36 +0x14, // s5_37 +0xA, // s5_38 +0x9, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0xE, // s5_41 +0x0, // s5_42 +0x4C, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x84, // s5_4B +0x8, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x83, // s5_4F +0x6, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x5, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/pal_downscale.h b/pal_downscale.h new file mode 100644 index 00000000..ef6e2ec6 --- /dev/null +++ b/pal_downscale.h @@ -0,0 +1,434 @@ +const uint8_t pal_downscale[] PROGMEM = { +0x2C, // s0_40 +0x25, // s0_41 +0x0, // s0_42 +0x19, // s0_43 +0x25, // s0_44 +0x11, // s0_45 +0x7F, // s0_46 +0x17, // s0_47 +0xEB, // s0_48 +0xA, // s0_49 +0x0, // s0_4A +0x0, // s0_4B +0x0, // s0_4C +0x2A, // s0_4D +0x0, // s0_4E +0x3C, // s0_4F +0x0, // s0_50 +0x0, // s0_51 +0x67, // s0_52 +0x0, // s0_53 +0x0, // s0_54 +0x0, // s0_55 +0x0, // s0_56 +0x0, // s0_57 +0x0, // s0_58 +0xFF, // s0_59 +0x0, // s0_5A +0x0, // s0_5B +0x0, // s0_5C +0x0, // s0_5D +0x0, // s0_5E +0x0, // s0_5F +0x24, // s0_90 +0x0, // s0_91 +0x47, // s0_92 +0xD4, // s0_93 +0x0, // s0_94 +0x3E, // s0_95 +0x32, // s0_96 +0x0, // s0_97 +0x0, // s0_98 +0x0, // s0_99 +0x0, // s0_9A +0x0, // s0_9B +0x0, // s0_9C +0x0, // s0_9D +0x0, // s0_9E +0x0, // s0_9F +0x62, // s1_0 +0xE0, // s1_1 +0x69, // s1_2 +0x0, // s1_3 +0x0, // s1_4 +0x0, // s1_5 +0x0, // s1_6 +0x0, // s1_7 +0x0, // s1_8 +0x0, // s1_9 +0x0, // s1_A +0xC0, // s1_B +0xB, // s1_C +0x0, // s1_D +0xFC, // s1_E +0x4, // s1_F +0x0, // s1_10 +0x0, // s1_11 +0x68, // s1_12 +0x0, // s1_13 +0x40, // s1_14 +0x4, // s1_15 +0x4C, // s1_16 +0x0, // s1_17 +0x90, // s1_18 +0x4, // s1_19 +0x98, // s1_1A +0x0, // s1_1B +0xE, // s1_1C +0x0, // s1_1D +0x10, // s1_1E +0x0, // s1_1F +0x40, // s1_20 +0x0, // s1_21 +0x3D, // s1_22 +0x5, // s1_23 +0x0, // s1_24 +0x0, // s1_25 +0x60, // s1_26 +0x0, // s1_27 +0x3E, // s1_28 +0x0, // s1_29 +0x0, // s1_2A +0x16, // s1_2B +0x0, // s1_2C +0x25, // s1_2D +0x0, // s1_2E +0x0, // s1_2F +0x22, // s3_0 +0x12, // s3_1 +0x9A, // s3_2 +0x13, // s3_3 +0x10, // s3_4 +0x29, // s3_5 +0x12, // s3_6 +0x8, // s3_7 +0xA0, // s3_8 +0x0, // s3_9 +0x98, // s3_A +0x80, // s3_B +0x0, // s3_C +0x5, // s3_D +0x10, // s3_E +0x0, // s3_F +0x62, // s3_10 +0xA9, // s3_11 +0x1C, // s3_12 +0x32, // s3_13 +0x41, // s3_14 +0x1, // s3_15 +0x0, // s3_16 +0x2, // s3_17 +0x20, // s3_18 +0x4, // s3_19 +0x0, // s3_1A +0x1, // s3_1B +0x0, // s3_1C +0x0, // s3_1D +0x0, // s3_1E +0x1, // s3_1F +0x3B, // s3_20 +0x1, // s3_21 +0x3B, // s3_22 +0x1, // s3_23 +0xA0, // s3_24 +0x3, // s3_25 +0x40, // s3_26 +0xCF, // s3_27 +0x26, // s3_28 +0x7, // s3_29 +0x11, // s3_2A +0x11, // s3_2B +0xE0, // s3_2C +0x2F, // s3_2D +0x20, // s3_2E +0xF0, // s3_2F +0x40, // s3_30 +0x3A, // s3_31 +0x88, // s3_32 +0x0, // s3_33 +0x0, // s3_34 +0x80, // s3_35 +0x1C, // s3_36 +0x29, // s3_37 +0x0, // s3_38 +0x0, // s3_39 +0xFE, // s3_3A +0x3, // s3_3B +0x3, // s3_3C +0x0, // s3_3D +0x80, // s3_3E +0x0, // s3_3F +0x3, // s3_40 +0x3, // s3_41 +0x40, // s3_42 +0xC, // s3_43 +0xF8, // s3_44 +0x16, // s3_45 +0xF8, // s3_46 +0x18, // s3_47 +0xF9, // s3_48 +0x10, // s3_49 +0xF9, // s3_4A +0x20, // s3_4B +0xF9, // s3_4C +0xA, // s3_4D +0x1A, // s3_4E +0x1E, // s3_4F +0x30, // s3_50 +0x0, // s3_51 +0x70, // s3_52 +0x8, // s3_53 +0x24, // s3_54 +0xA, // s3_55 +0x8B, // s3_56 +0x0, // s3_57 +0x1A, // s3_58 +0x0, // s3_59 +0x0, // s3_5A +0x1A, // s3_5B +0x0, // s3_5C +0xC4, // s3_5D +0x3F, // s3_5E +0x4, // s3_5F +0x4, // s3_60 +0x9B, // s3_61 +0x80, // s3_62 +0x9, // s3_63 +0xE9, // s3_64 +0xFF, // s3_65 +0x7F, // s3_66 +0x40, // s3_67 +0xD2, // s3_68 +0xD, // s3_69 +0xD8, // s3_6A +0xFF, // s3_6B +0x3F, // s3_6C +0x64, // s3_6D +0x89, // s3_6E +0x1D, // s3_6F +0x37, // s3_70 +0xC9, // s3_71 +0x0, // s3_72 +0xBC, // s3_73 +0x5, // s3_74 +0x0, // s3_75 +0x0, // s3_76 +0x0, // s3_77 +0x0, // s3_78 +0x0, // s3_79 +0x0, // s3_7A +0x0, // s3_7B +0x0, // s3_7C +0x0, // s3_7D +0x0, // s3_7E +0x0, // s3_7F +0x82, // s4_0 +0x30, // s4_1 +0x0, // s4_2 +0x0, // s4_3 +0x32, // s4_4 +0x11, // s4_5 +0x42, // s4_6 +0x30, // s4_7 +0x1, // s4_8 +0x94, // s4_9 +0x11, // s4_A +0x7F, // s4_B +0x0, // s4_C +0x74, // s4_D +0x0, // s4_E +0x6, // s4_F +0x0, // s4_10 +0x92, // s4_11 +0x5, // s4_12 +0x1, // s4_13 +0x96, // s4_14 +0x5, // s4_15 +0x0, // s4_16 +0x0, // s4_17 +0x0, // s4_18 +0x0, // s4_19 +0x50, // s4_1A +0x51, // s4_1B +0x0, // s4_1C +0x0, // s4_1D +0x0, // s4_1E +0x0, // s4_1F +0x0, // s4_20 +0x43, // s4_21 +0x2, // s4_22 +0x1F, // s4_23 +0x0, // s4_24 +0x70, // s4_25 +0x15, // s4_26 +0xFF, // s4_27 +0xFF, // s4_28 +0x1F, // s4_29 +0x0, // s4_2A +0x87, // s4_2B +0x26, // s4_2C +0x3D, // s4_2D +0x0, // s4_2E +0x0, // s4_2F +0x0, // s4_30 +0x0, // s4_31 +0x0, // s4_32 +0x10, // s4_33 +0x0, // s4_34 +0x0, // s4_35 +0x10, // s4_36 +0x4, // s4_37 +0x1, // s4_38 +0x0, // s4_39 +0x1, // s4_3A +0x0, // s4_3B +0x0, // s4_3C +0x0, // s4_3D +0x3, // s4_3E +0x0, // s4_3F +0x0, // s4_40 +0x0, // s4_41 +0x6C, // s4_42 +0x0, // s4_43 +0x0, // s4_44 +0x20, // s4_45 +0x5, // s4_46 +0x0, // s4_47 +0x20, // s4_48 +0x5, // s4_49 +0x10, // s4_4A +0x14, // s4_4B +0x0, // s4_4C +0x70, // s4_4D +0x24, // s4_4E +0x3C, // s4_4F +0x0, // s4_50 +0x0, // s4_51 +0x0, // s4_52 +0x0, // s4_53 +0x1, // s4_54 +0x0, // s4_55 +0x0, // s4_56 +0x0, // s4_57 +0x0, // s4_58 +0x1, // s4_59 +0x0, // s4_5A +0xCC, // s4_5B +0x0, // s4_5C +0x0, // s4_5D +0x0, // s4_5E +0x0, // s4_5F +0x10, // s5_0 +0x0, // s5_1 +0x1D, // s5_2 +0x3B, // s5_3 +0x2, // s5_4 +0x2, // s5_5 +0x43, // s5_6 +0x42, // s5_7 +0x42, // s5_8 +0x7B, // s5_9 +0x7B, // s5_A +0x7B, // s5_B +0x12, // s5_C +0x0, // s5_D +0x82, // s5_E +0x0, // s5_F +0x0, // s5_10 +0xB2, // s5_11 +0xF9, // s5_12 +0x9, // s5_13 +0x0, // s5_14 +0x0, // s5_15 +0x5F, // s5_16 +0x6, // s5_17 +0xA1, // s5_18 +0x91, // s5_19 +0x0, // s5_1A +0x0, // s5_1B +0x0, // s5_1C +0x0, // s5_1D +0x80, // s5_1E +0x85, // s5_1F +0x8, // s5_20 +0x18, // s5_21 +0xF, // s5_22 +0x0, // s5_23 +0x40, // s5_24 +0x0, // s5_25 +0x4, // s5_26 +0x0, // s5_27 +0x0, // s5_28 +0x0, // s5_29 +0xF, // s5_2A +0x0, // s5_2B +0x0, // s5_2C +0x3, // s5_2D +0x0, // s5_2E +0x2, // s5_2F +0x0, // s5_30 +0x2F, // s5_31 +0x0, // s5_32 +0x3A, // s5_33 +0x6, // s5_34 +0xA0, // s5_35 +0x0, // s5_36 +0xE, // s5_37 +0x7, // s5_38 +0x6, // s5_39 +0x3, // s5_3A +0x0, // s5_3B +0x0, // s5_3C +0x0, // s5_3D +0x0, // s5_3E +0x4, // s5_3F +0x1, // s5_40 +0x14, // s5_41 +0x0, // s5_42 +0x27, // s5_43 +0x0, // s5_44 +0x10, // s5_45 +0x0, // s5_46 +0x0, // s5_47 +0x0, // s5_48 +0x0, // s5_49 +0x0, // s5_4A +0x46, // s5_4B +0x9, // s5_4C +0x10, // s5_4D +0x0, // s5_4E +0x3F, // s5_4F +0x3, // s5_50 +0x2, // s5_51 +0x0, // s5_52 +0x0, // s5_53 +0x0, // s5_54 +0x0, // s5_55 +0x1, // s5_56 +0xC0, // s5_57 +0x5, // s5_58 +0x0, // s5_59 +0x1, // s5_5A +0x0, // s5_5B +0x3, // s5_5C +0x2, // s5_5D +0x0, // s5_5E +0x0, // s5_5F +0x0, // s5_60 +0x0, // s5_61 +0x0, // s5_62 +0xF, // s5_63 +0x0, // s5_64 +0x0, // s5_65 +0x0, // s5_66 +0x0, // s5_67 +0x0, // s5_68 +0x0, // s5_69 +0x0, // s5_6A +0x0, // s5_6B +0x0, // s5_6C +0x0, // s5_6D +0x0, // s5_6E +0x0, // s5_6F +}; diff --git a/presetDeinterlacerSection.h b/presetDeinterlacerSection.h new file mode 100644 index 00000000..fcd5e638 --- /dev/null +++ b/presetDeinterlacerSection.h @@ -0,0 +1,66 @@ +const uint8_t presetDeinterlacerSection[] PROGMEM = { +0xFF, // s2_0 +0x3, // s2_1 +0xEC, // s2_2 +0x0, // s2_3 +0xFF, // s2_4 +0xFF, // s2_5 +0x0, // s2_6 +0x1B, // s2_7 +0x0, // s2_8 +0x70, // s2_9 +0x0, // s2_A +0x0, // s2_B +0xF, // s2_C +0x4, // s2_D // low thd: psx: gamera2000 + driver, alundra 2 high motion bg +0x7F, // s2_E // Ehrgeiz Quest mode lodge character in corner for high motion 3d +0x14, // s2_F +0x18, // s2_10 +0x0, // s2_11 +0x8E, // s2_12 +0x0, // s2_13 +0x0, // s2_14 +0x0, // s2_15 +0x80, // s2_16 +0x0, // s2_17 +0xC0, // s2_18 +0x61, // s2_19 +0x4, // s2_1A +0x15, // s2_1B +0x0, // s2_1C +0x0, // s2_1D +0x0, // s2_1E +0x10, // s2_1F +0x30, // s2_20 +0x12, // s2_21 +0x4, // s2_22 +0xF, // s2_23 +0x4, // s2_24 +0x0, // s2_25 +0x4C, // s2_26 +0xC, // s2_27 +0x0, // s2_28 +0x0, // s2_29 +0x0, // s2_2A +0x0, // s2_2B +0x0, // s2_2C +0x0, // s2_2D +0x0, // s2_2E +0x0, // s2_2F +0x0, // s2_30 +0x0, // s2_31 +0x7F, // s2_32 +0x7F, // s2_33 +0x11, // s2_34 +0x10, // s2_35 +0x3, // s2_36 +0xB, // s2_37 +0x4, // s2_38 +0x44, // s2_39 +0x60, // s2_3A +0x4, // s2_3B +0xF, // s2_3C +0x0, // s2_3D +0x0, // s2_3E +0x0, // s2_3F +}; \ No newline at end of file diff --git a/presetHdBypassSection.h b/presetHdBypassSection.h new file mode 100644 index 00000000..e173aba5 --- /dev/null +++ b/presetHdBypassSection.h @@ -0,0 +1,50 @@ +const uint8_t presetHdBypassSection[] PROGMEM = { +0x00, // s1_30 +0x80, // s1_31 // Y 84 +0x00, // s1_32 // Y offset +0x80, // s1_33 // B/U instead of 0x1c? 78 +0x00, // s1_34 // B offset 1 +0x80, // s1_35 // R/V instead of 0x29? 80 +0x00, // s1_36 // R offset ff +0xff, // s1_37 // HD_HSYNC_RST +0x03, // s1_38 +0x16, // s1_39 // HD_INI_ST +0x04, // s1_3A // +0x88, // s1_3B // HD_HB_ST +0x0f, // s1_3C +0xd0, // s1_3D // HD_HB_SP +0x00, // s1_3E +0, // s1_3F // HD_HS_ST +0, // s1_40 +0x7C, // s1_41 // HD_HS_SP +0, // s1_42 +0x00, // s1_43 HD_VB_ST +0, // s1_44 +0x14, // s1_45 +0, // s1_46 +0x02, // s1_47 // vsync st +0, // s1_48 +0x07, // s1_49 // vsync sp +0, // s1_4A +0, // s1_4B +0, // s1_4C +0x06, // s1_4D +0, // s1_4E +0, // s1_4F +0, // s1_50 +0x06, // s1_51 +0, // s1_52 +0, // s1_53 +0, // s1_54 +0, // s1_55 +0, // s1_56 +0, // s1_57 +0, // s1_58 +0, // s1_59 +0, // s1_5A +0, // s1_5B +0, // s1_5C +0, // s1_5D +0, // s1_5E +0, // s1_5F +}; \ No newline at end of file diff --git a/presetMdSection.h b/presetMdSection.h new file mode 100644 index 00000000..8098f0f5 --- /dev/null +++ b/presetMdSection.h @@ -0,0 +1,38 @@ +const uint8_t presetMdSection[] PROGMEM = { +0xB6, // s1_60 H: unlock: 5, lock: 22 // 0x9c > 4, 28 +0x84, // s1_61 V: unlock: 4, lock: 4 // 0x45 > 2, 5 +96, // s1_62 // 5-0 MD_NTSC_INT_CNTRL +38, // s1_63 +65, // s1_64 +62, // s1_65 +178, // s1_66 +154, // s1_67 +78, // s1_68 +214, // s1_69 +177, // s1_6A +142, // s1_6B +124, // s1_6C +99, // s1_6D +139, // s1_6E +118, // s1_6F +112, // s1_70 +98, // s1_71 +133, // s1_72 +105, // s1_73 +83, // s1_74 +72, // s1_75 +93, // s1_76 +148, // s1_77 +178, // s1_78 +70, // s1_79 +198, // s1_7A +238, // s1_7B +140, // s1_7C +98, // s1_7D +118, // s1_7E +44, // s1_7F // changed to ~352 // was 156 HD2376_1250P (PAL FHD?) +0xff, // s1_80 // custom mode h // was 32(d) +0xff, // s1_81 // custom mode v // was 26(d) +0x05, // s1_82 // was 0x01 // result in 0_16 // 0x35 = SP timer detect used for something +0x0c, // s1_83 MD_UNSTABLE_LOCK_VALUE = 3 // was 0x10 (lock val 4) +}; \ No newline at end of file diff --git a/public/README.md b/public/README.md new file mode 100644 index 00000000..1a53bc47 --- /dev/null +++ b/public/README.md @@ -0,0 +1,21 @@ +# GBSControl webui + +Redesigned UI for the GBSControl with added features: + +- 72 Named Slots avaliable +- Slots save current filters state. +- Slots filter state can be toggled between local/global +- Backup / Restore system +- Option to enable / disable developer options (hidden by default) +- Integrated wifi management in system menu + +## Building + +- `npm install` +- Make changes +- `npm run build` to generate the necesary files webui_html.h +- Compile & upload GBSControl project in Arduino IDE + +## Tips + +* Before every push do a `npm run build` to be sure bin files are updated to the latest. diff --git a/public/assets/fonts/material.woff2 b/public/assets/fonts/material.woff2 new file mode 100644 index 00000000..38e24a17 Binary files /dev/null and b/public/assets/fonts/material.woff2 differ diff --git a/public/assets/fonts/oswald.woff2 b/public/assets/fonts/oswald.woff2 new file mode 100644 index 00000000..40b648b4 Binary files /dev/null and b/public/assets/fonts/oswald.woff2 differ diff --git a/public/assets/icons/gbsc-logo.png b/public/assets/icons/gbsc-logo.png new file mode 100644 index 00000000..6d28d5c2 Binary files /dev/null and b/public/assets/icons/gbsc-logo.png differ diff --git a/public/assets/icons/icon-1024-maskable.png b/public/assets/icons/icon-1024-maskable.png new file mode 100644 index 00000000..6614e0e6 Binary files /dev/null and b/public/assets/icons/icon-1024-maskable.png differ diff --git a/public/assets/icons/icon-1024.png b/public/assets/icons/icon-1024.png new file mode 100644 index 00000000..b9aa9551 Binary files /dev/null and b/public/assets/icons/icon-1024.png differ diff --git a/public/package-lock.json b/public/package-lock.json new file mode 100644 index 00000000..de32914d --- /dev/null +++ b/public/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gbscontrol-webui", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "typescript": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "dev": true + } + } +} diff --git a/public/package.json b/public/package.json new file mode 100644 index 00000000..7bb23311 --- /dev/null +++ b/public/package.json @@ -0,0 +1,14 @@ +{ + "name": "gbscontrol-webui", + "version": "1.0.0", + "description": "gbscontrol-webui", + "scripts": { + "start": "tsc --watch ./index.ts", + "build": "tsc ./src/index.ts --target ES6 && cd scripts && node ./build.js && ./html2h.sh" + }, + "author": "", + "license": "GNU", + "devDependencies": { + "typescript": "^4.1.3" + } +} diff --git a/public/scripts/build.js b/public/scripts/build.js new file mode 100644 index 00000000..b897c21e --- /dev/null +++ b/public/scripts/build.js @@ -0,0 +1,41 @@ +const fs = require("fs"); +const html = fs.readFileSync("./../src/index.html.tpl", "utf-8"); +const js = fs.readFileSync("./../src/index.js", "utf-8"); + +const icon1024 = fs + .readFileSync("./../assets/icons/icon-1024-maskable.png") + .toString("base64"); +const oswald = fs + .readFileSync("./../assets/fonts/oswald.woff2") + .toString("base64"); +const material = fs + .readFileSync("./../assets/fonts/material.woff2") + .toString("base64"); +const favicon = fs + .readFileSync("./../assets/icons/gbsc-logo.png") + .toString("base64"); + +const css = fs + .readFileSync("./../src/style.css", "utf-8") + .replace("${oswald}", oswald) + .replace("${material}", material); + +const manifest = fs + .readFileSync("./../src/manifest.json", "utf-8") + .replace(/\$\{icon1024\}/g, `data:image/png;base64,${icon1024}`); + +fs.writeFileSync( + "./../../webui.html", + html + .replace("${styles}", css) + .replace("${js}", js) + .replace("${favicon}", `data:image/png;base64,${favicon}`) + .replace( + "${manifest}", + `data:application/json;base64,${Buffer.from(manifest).toString("base64")}` + ) + .replace("${icon1024}", `data:image/png;base64,${icon1024}`), + "utf8" +); + +console.log("webui.html GENERATED"); diff --git a/public/scripts/html2h.sh b/public/scripts/html2h.sh new file mode 100755 index 00000000..929f80dc --- /dev/null +++ b/public/scripts/html2h.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +cd ../.. +gzip -c9 webui.html > webui_html && xxd -i webui_html > webui_html.h && rm webui_html && sed -i -e 's/unsigned char webui_html\[]/const uint8_t webui_html[] PROGMEM/' webui_html.h && sed -i -e 's/unsigned int webui_html_len/const unsigned int webui_html_len/' webui_html.h +rm webui_html.h-e + +echo "webui_html.h GENERATED"; \ No newline at end of file diff --git a/public/src/index.html.tpl b/public/src/index.html.tpl new file mode 100644 index 00000000..a7d2d037 --- /dev/null +++ b/public/src/index.html.tpl @@ -0,0 +1,1402 @@ + + + + + GBS-Control + + + + + + + + + +
+
+ + + + + + + +
+
+
+
+ +
aspect_ratio
+
Resolution
+
+ +
    +
  • Choose an output resolution from these presets.
  • +
  • Your selection will also be used for startup. 1280x960 is recommended for NTSC sources, 1280x1024 for PAL. +
  • +
  • Use the "Matched Presets" option to switch between the two automatically (Preferences tab) +
  • +
+
+ + + + + + + +
+
+
+ +
input
+
Presets
+
+ +
    +
  • If you want to save your customizations, first select a slot for your new preset, then save to or load from that slot.
  • +
  • Selecting a slot also makes it the new startup preset.
  • +
+
+
+ + +
+
+
+ + + + + + + + + + + + +
+
+ +
code
+
Output
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+ + + diff --git a/public/src/index.js b/public/src/index.js new file mode 100644 index 00000000..8a7e3df4 --- /dev/null +++ b/public/src/index.js @@ -0,0 +1,1070 @@ +const Structs = { + slots: [ + { name: "name", type: "string", size: 25 }, + { name: "presetID", type: "byte", size: 1 }, + { name: "scanlines", type: "byte", size: 1 }, + { name: "scanlinesStrength", type: "byte", size: 1 }, + { name: "slot", type: "byte", size: 1 }, + { name: "wantVdsLineFilter", type: "byte", size: 1 }, + { name: "wantStepResponse", type: "byte", size: 1 }, + { name: "wantPeaking", type: "byte", size: 1 }, + ], +}; +const StructParser = { + pos: 0, + parseStructArray(buff, structsDescriptors, struct) { + const currentStruct = structsDescriptors[struct]; + this.pos = 0; + buff = new Uint8Array(buff); + if (currentStruct) { + const structSize = StructParser.getSize(structsDescriptors, struct); + return [...Array(buff.byteLength / structSize)].map(() => { + return currentStruct.reduce((acc, structItem) => { + acc[structItem.name] = this.getValue(buff, structItem); + return acc; + }, {}); + }); + } + return null; + }, + getValue(buff, structItem) { + switch (structItem.type) { + case "byte": + return buff[this.pos++]; + case "string": + const currentPos = this.pos; + this.pos += structItem.size; + return [...Array(structItem.size)] + .map(() => " ") + .map((_char, index) => { + if (buff[currentPos + index] > 31) { + return String.fromCharCode(buff[currentPos + index]); + } + return ""; + }) + .join("") + .trim(); + } + }, + getSize(structsDescriptors, struct) { + const currentStruct = structsDescriptors[struct]; + return currentStruct.reduce((acc, prop) => { + acc += prop.size; + return acc; + }, 0); + }, +}; +/* GBSControl Global Object*/ +const GBSControl = { + buttonMapping: { + 1: "button1280x960", + 2: "button1280x1024", + 3: "button1280x720", + 4: "button720x480", + 5: "button1920x1080", + 6: "button15kHzScaleDown", + 8: "buttonSourcePassThrough", + 9: "buttonLoadCustomPreset", + }, + controlKeysMobileMode: "move", + controlKeysMobile: { + move: { + type: "loadDoc", + left: "7", + up: "*", + right: "6", + down: "/", + }, + scale: { + type: "loadDoc", + left: "h", + up: "4", + right: "z", + down: "5", + }, + borders: { + type: "loadUser", + left: "B", + up: "C", + right: "A", + down: "D", + }, + }, + dataQueued: 0, + isWsActive: false, + maxSlots: 72, + queuedText: "", + scanSSIDDone: false, + serverIP: "", + structs: null, + timeOutWs: 0, + ui: { + backupButton: null, + backupInput: null, + customSlotFilters: null, + developerSwitch: null, + loader: null, + outputClear: null, + presetButtonList: null, + progressBackup: null, + progressRestore: null, + slotButtonList: null, + slotContainer: null, + terminal: null, + toggleList: null, + toggleSwichList: null, + webSocketConnectionWarning: null, + wifiConnect: null, + wifiConnectButton: null, + wifiList: null, + wifiListTable: null, + wifiPasswordInput: null, + wifiSSDInput: null, + wifiApButton: null, + wifiStaButton: null, + wifiStaSSID: null, + alert: null, + alertOk: null, + alertContent: null, + prompt: null, + promptOk: null, + promptCancel: null, + promptContent: null, + promptInput: null, + }, + updateTerminalTimer: 0, + webSocketServerUrl: "", + wifi: { + mode: "ap", + ssid: "", + }, + ws: null, + wsCheckTimer: 0, + wsConnectCounter: 0, + wsNoSuccessConnectingCounter: 0, + wsTimeout: 0, +}; +/** websocket services */ +const checkWebSocketServer = () => { + if (!GBSControl.isWsActive) { + if (GBSControl.ws) { + /* + 0 CONNECTING + 1 OPEN + 2 CLOSING + 3 CLOSED + */ + switch (GBSControl.ws.readyState) { + case 1: + case 2: + GBSControl.ws.close(); + break; + case 3: + GBSControl.ws = null; + break; + } + } + if (!GBSControl.ws) { + createWebSocket(); + } + } +}; +const timeOutWs = () => { + console.log("timeOutWs"); + if (GBSControl.ws) { + GBSControl.ws.close(); + } + GBSControl.isWsActive = false; + displayWifiWarning(true); +}; +const createWebSocket = () => { + if (GBSControl.ws && checkReadyState()) { + return; + } + GBSControl.wsNoSuccessConnectingCounter = 0; + GBSControl.ws = new WebSocket(GBSControl.webSocketServerUrl, ["arduino"]); + GBSControl.ws.onopen = () => { + console.log("ws onopen"); + displayWifiWarning(false); + GBSControl.wsConnectCounter++; + clearTimeout(GBSControl.wsTimeout); + GBSControl.wsTimeout = setTimeout(timeOutWs, 6000); + GBSControl.isWsActive = true; + GBSControl.wsNoSuccessConnectingCounter = 0; + }; + GBSControl.ws.onclose = () => { + console.log("ws.onclose"); + clearTimeout(GBSControl.wsTimeout); + GBSControl.isWsActive = false; + }; + GBSControl.ws.onmessage = (message) => { + clearTimeout(GBSControl.wsTimeout); + GBSControl.wsTimeout = setTimeout(timeOutWs, 2700); + GBSControl.isWsActive = true; + const [messageDataAt0, messageDataAt1, messageDataAt2, messageDataAt3, messageDataAt4, messageDataAt5,] = message.data; + if (messageDataAt0 != "#") { + GBSControl.queuedText += message.data; + GBSControl.dataQueued += message.data.length; + if (GBSControl.dataQueued >= 70000) { + GBSControl.ui.terminal.value = ""; + GBSControl.dataQueued = 0; + } + } + else { + const presetId = GBSControl.buttonMapping[messageDataAt1]; + const presetEl = document.querySelector(`[gbs-element-ref="${presetId}"]`); + const activePresetButton = presetEl + ? presetEl.getAttribute("gbs-element-ref") + : null; + if (activePresetButton) { + GBSControl.ui.presetButtonList.forEach(toggleButtonActive(activePresetButton)); + } + const slotId = "slot-" + messageDataAt2; + const activeSlotButton = document.querySelector(`[gbs-element-ref="${slotId}"]`); + if (activeSlotButton) { + GBSControl.ui.slotButtonList.forEach(toggleButtonActive(slotId)); + } + if (messageDataAt3 && messageDataAt4 && messageDataAt5) { + const optionByte0 = messageDataAt3.charCodeAt(0); + const optionByte1 = messageDataAt4.charCodeAt(0); + const optionByte2 = messageDataAt5.charCodeAt(0); + const optionButtonList = [ + ...nodelistToArray(GBSControl.ui.toggleList), + ...nodelistToArray(GBSControl.ui.toggleSwichList), + ]; + const toggleMethod = (button, mode) => { + if (button.tagName === "TD") { + button.innerText = mode ? "toggle_on" : "toggle_off"; + } + button = button.tagName !== "TD" ? button : button.parentElement; + if (mode) { + button.setAttribute("active", ""); + } + else { + button.removeAttribute("active"); + } + }; + optionButtonList.forEach((button) => { + const toggleData = button.getAttribute("gbs-toggle") || + button.getAttribute("gbs-toggle-switch"); + switch (toggleData) { + case "adcAutoGain": + toggleMethod(button, (optionByte0 & 0x01) == 0x01); + break; + case "scanlines": + toggleMethod(button, (optionByte0 & 0x02) == 0x02); + break; + case "vdsLineFilter": + toggleMethod(button, (optionByte0 & 0x04) == 0x04); + break; + case "peaking": + toggleMethod(button, (optionByte0 & 0x08) == 0x08); + break; + case "palForce60": + toggleMethod(button, (optionByte0 & 0x10) == 0x10); + break; + case "wantOutputComponent": + toggleMethod(button, (optionByte0 & 0x20) == 0x20); + break; + /** 1 */ + case "matched": + toggleMethod(button, (optionByte1 & 0x01) == 0x01); + break; + case "frameTimeLock": + toggleMethod(button, (optionByte1 & 0x02) == 0x02); + break; + case "motionAdaptive": + toggleMethod(button, (optionByte1 & 0x04) == 0x04); + break; + case "bob": + toggleMethod(button, (optionByte1 & 0x04) != 0x04); + break; + // case "tap6": + // toggleMethod(button, (optionByte1 & 0x08) != 0x04); + // break; + case "step": + toggleMethod(button, (optionByte1 & 0x10) == 0x10); + break; + case "fullHeight": + toggleMethod(button, (optionByte1 & 0x20) == 0x20); + break; + /** 2 */ + case "enableCalibrationADC": + toggleMethod(button, (optionByte2 & 0x01) == 0x01); + break; + case "preferScalingRgbhv": + toggleMethod(button, (optionByte2 & 0x02) == 0x02); + break; + case "disableExternalClockGenerator": + toggleMethod(button, (optionByte2 & 0x04) == 0x04); + break; + } + }); + } + } + }; +}; +const checkReadyState = () => { + if (GBSControl.ws.readyState == 2) { + GBSControl.wsNoSuccessConnectingCounter++; + if (GBSControl.wsNoSuccessConnectingCounter >= 7) { + console.log("ws still closing, force close"); + GBSControl.ws = null; + GBSControl.wsNoSuccessConnectingCounter = 0; + /* fall through */ + createWebSocket(); + return false; + } + else { + return true; + } + } + else if (GBSControl.ws.readyState == 0) { + GBSControl.wsNoSuccessConnectingCounter++; + if (GBSControl.wsNoSuccessConnectingCounter >= 14) { + console.log("ws still connecting, retry"); + GBSControl.ws.close(); + GBSControl.wsNoSuccessConnectingCounter = 0; + } + return true; + } + else { + return true; + } +}; +const createIntervalChecks = () => { + GBSControl.wsCheckTimer = setInterval(checkWebSocketServer, 500); + GBSControl.updateTerminalTimer = setInterval(updateTerminal, 50); +}; +/* API services */ +const loadDoc = (link) => { + return fetch(`http://${GBSControl.serverIP}/sc?${link}&nocache=${new Date().getTime()}`); +}; +const loadUser = (link) => { + if (link == "a" || link == "1") { + GBSControl.isWsActive = false; + GBSControl.ui.terminal.value += "\nRestart\n"; + GBSControl.ui.terminal.scrollTop = GBSControl.ui.terminal.scrollHeight; + } + return fetch(`http://${GBSControl.serverIP}/uc?${link}&nocache=${new Date().getTime()}`); +}; +/** SLOT management */ +const savePreset = () => { + const currentSlot = document.querySelector('[gbs-role="slot"][active]'); + if (!currentSlot) { + return; + } + const key = currentSlot.getAttribute("gbs-element-ref"); + const currentIndex = currentSlot.getAttribute("gbs-slot-id"); + gbsPrompt("Assign a slot name", GBSControl.structs.slots[currentIndex].name || key) + .then((currentName) => { + if (currentName && currentName.trim() !== "Empty") { + currentSlot.setAttribute("gbs-name", currentName); + fetch(`/slot/save?index=${currentIndex}&name=${currentName.substring(0, 24)}&${+new Date()}`).then(() => { + loadUser("4").then(() => { + setTimeout(() => { + fetchSlotNames().then((success) => { + if (success) { + updateSlotNames(); + } + }); + }, 500); + }); + }); + } + }) + .catch(() => { }); +}; +const loadPreset = () => { + loadUser("3").then(() => { + if (GBSStorage.read("customSlotFilters") === true) { + setTimeout(() => { + fetch(`/gbs/restore-filters?${+new Date()}`); + }, 250); + } + }); +}; +const getSlotsHTML = () => { + // prettier-ignore + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.', '_', '~', '(', ')', '!', '*', ':', ',' + ].map((chr, idx) => { + return ``; + }).join(''); +}; +const setSlot = (slot) => { + fetch(`/slot/set?slot=${slot}&${+new Date()}`); +}; +const updateSlotNames = () => { + for (let i = 0; i < GBSControl.maxSlots; i++) { + const el = document.querySelector(`[gbs-slot-id="${i}"]`); + el.setAttribute("gbs-name", GBSControl.structs.slots[i].name); + el.setAttribute("gbs-meta", getSlotPresetName(parseInt(GBSControl.structs.slots[i].presetID, 10))); + } +}; +const fetchSlotNames = () => { + return fetch(`/bin/slots.bin?${+new Date()}`) + .then((response) => response.arrayBuffer()) + .then((arrayBuffer) => { + if (arrayBuffer.byteLength === + StructParser.getSize(Structs, "slots") * GBSControl.maxSlots) { + GBSControl.structs = { + slots: StructParser.parseStructArray(arrayBuffer, Structs, "slots"), + }; + return true; + } + return false; + }); +}; +const getSlotPresetName = (presetID) => { + switch (presetID) { + case 0x01: + case 0x011: + return "1280x960"; + case 0x02: + case 0x012: + return "1280x1024"; + case 0x03: + case 0x013: + return "1280x720"; + case 0x05: + case 0x015: + return "1920x1080"; + case 0x06: + case 0x016: + return "DOWNSCALE"; + case 0x04: + return "720x480"; + case 0x14: + return "768x576"; + case 0x21: // bypass 1 + case 0x22: // bypass 2 + return "BYPASS"; + default: + return "CUSTOM"; + } +}; +const fetchSlotNamesErrorRetry = () => { + setTimeout(fetchSlotNamesAndInit, 1000); +}; +const fetchSlotNamesAndInit = () => { + fetchSlotNames() + .then((success) => { + if (!success) { + fetchSlotNamesErrorRetry(); + return; + } + initUIElements(); + wifiGetStatus().then(() => { + initUI(); + updateSlotNames(); + createWebSocket(); + createIntervalChecks(); + setTimeout(hideLoading, 1000); + }); + }, fetchSlotNamesErrorRetry) + .catch(fetchSlotNamesErrorRetry); +}; +/** Promises */ +const serial = (funcs) => funcs.reduce((promise, func) => promise.then((result) => func().then(Array.prototype.concat.bind(result))), Promise.resolve([])); +/** helpers */ +const toggleDeveloperMode = () => { + const developerMode = GBSStorage.read("developerMode") || false; + GBSStorage.write("developerMode", !developerMode); + updateDeveloperMode(!developerMode); +}; +const toggleCustomSlotFilters = () => { + const customSlotFilters = GBSStorage.read("customSlotFilters"); + GBSStorage.write("customSlotFilters", !customSlotFilters); + updateCustomSlotFilters(!customSlotFilters); +}; +const updateDeveloperMode = (developerMode) => { + const el = document.querySelector('[gbs-section="developer"]'); + if (developerMode) { + el.removeAttribute("hidden"); + GBSControl.ui.developerSwitch.setAttribute("active", ""); + document.body.classList.remove("gbs-output-hide"); + } + else { + el.setAttribute("hidden", ""); + GBSControl.ui.developerSwitch.removeAttribute("active"); + document.body.classList.add("gbs-output-hide"); + } + GBSControl.ui.developerSwitch.querySelector(".gbs-icon").innerText = developerMode ? "toggle_on" : "toggle_off"; +}; +const updateCustomSlotFilters = (customFilters = GBSStorage.read("customSlotFilters") === true) => { + if (customFilters) { + GBSControl.ui.customSlotFilters.setAttribute("active", ""); + } + else { + GBSControl.ui.customSlotFilters.removeAttribute("active"); + } + GBSControl.ui.customSlotFilters.querySelector(".gbs-icon").innerText = customFilters ? "toggle_on" : "toggle_off"; +}; +const GBSStorage = { + lsObject: {}, + write(key, value) { + GBSStorage.lsObject = GBSStorage.lsObject || {}; + GBSStorage.lsObject[key] = value; + localStorage.setItem("GBSControlSlotNames", JSON.stringify(GBSStorage.lsObject)); + }, + read(key) { + GBSStorage.lsObject = JSON.parse(localStorage.getItem("GBSControlSlotNames") || "{}"); + return GBSStorage.lsObject[key]; + }, +}; +const nodelistToArray = (nodelist) => { + return Array.prototype.slice.call(nodelist); +}; +const toggleButtonActive = (id) => (button, _index, _array) => { + button.removeAttribute("active"); + if (button.getAttribute("gbs-element-ref") === id) { + button.setAttribute("active", ""); + } +}; +const displayWifiWarning = (mode) => { + GBSControl.ui.webSocketConnectionWarning.style.display = mode + ? "block" + : "none"; +}; +const updateTerminal = () => { + if (GBSControl.queuedText.length > 0) { + requestAnimationFrame(() => { + GBSControl.ui.terminal.value += GBSControl.queuedText; + GBSControl.ui.terminal.scrollTop = GBSControl.ui.terminal.scrollHeight; + GBSControl.queuedText = ""; + }); + } +}; +const updateViewPort = () => { + document.documentElement.style.setProperty("--viewport-height", window.innerHeight + "px"); +}; +const hideLoading = () => { + GBSControl.ui.loader.setAttribute("style", "display:none"); +}; +const checkFetchResponseStatus = (response) => { + if (!response.ok) { + throw new Error(`HTTP ${response.status} - ${response.statusText}`); + } + return response; +}; +const readLocalFile = (file) => { + const reader = new FileReader(); + reader.addEventListener("load", (event) => { + doRestore(reader.result); + }); + reader.readAsArrayBuffer(file); +}; +/** backup / restore */ +const doBackup = () => { + let backupFiles; + let done = 0; + let total = 0; + fetch("/spiffs/dir") + .then((r) => r.json()) + .then((files) => { + backupFiles = files; + total = files.length; + const funcs = files.map((path) => () => { + return fetch(`/spiffs/download?file=${path}&${+new Date()}`).then((response) => { + GBSControl.ui.progressBackup.setAttribute("gbs-progress", `${done}/${total}`); + done++; + return checkFetchResponseStatus(response) && response.arrayBuffer(); + }); + }); + return serial(funcs); + }) + .then((files) => { + const headerDescriptor = files.reduce((acc, f, index) => { + acc[backupFiles[index]] = f.byteLength; + return acc; + }, {}); + const backupFilesJSON = JSON.stringify(headerDescriptor); + const backupFilesJSONSize = backupFilesJSON.length; + const mainHeader = [ + (backupFilesJSONSize >> 24) & 255, + (backupFilesJSONSize >> 16) & 255, + (backupFilesJSONSize >> 8) & 255, + (backupFilesJSONSize >> 0) & 255, + ]; + const outputArray = [ + ...mainHeader, + ...backupFilesJSON.split("").map((c) => c.charCodeAt(0)), + ...files.reduce((acc, f, index) => { + acc = acc.concat(Array.from(new Uint8Array(f))); + return acc; + }, []), + ]; + downloadBlob(new Blob([new Uint8Array(outputArray)]), `gbs-control.backup-${+new Date()}.bin`); + GBSControl.ui.progressBackup.setAttribute("gbs-progress", ``); + }); +}; +const doRestore = (file) => { + const { backupInput } = GBSControl.ui; + const fileBuffer = new Uint8Array(file); + const headerCheck = fileBuffer.slice(4, 6); + if (headerCheck[0] !== 0x7b || headerCheck[1] !== 0x22) { + backupInput.setAttribute("disabled", ""); + gbsAlert("Invalid Backup File") + .then(() => { + backupInput.removeAttribute("disabled"); + }, () => { + backupInput.removeAttribute("disabled"); + }) + .catch(() => { + backupInput.removeAttribute("disabled"); + }); + return; + } + const b0 = fileBuffer[0], b1 = fileBuffer[1], b2 = fileBuffer[2], b3 = fileBuffer[3]; + const headerSize = (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + const headerString = Array.from(fileBuffer.slice(4, headerSize + 4)) + .map((c) => String.fromCharCode(c)) + .join(""); + const headerObject = JSON.parse(headerString); + const files = Object.keys(headerObject); + let pos = headerSize + 4; + let total = files.length; + let done = 0; + const funcs = files.map((fileName) => () => { + const fileContents = fileBuffer.slice(pos, pos + headerObject[fileName]); + const formData = new FormData(); + formData.append("file", new Blob([fileContents], { type: "application/octet-stream" }), fileName.substr(1)); + return fetch("/spiffs/upload", { + method: "POST", + body: formData, + }).then((response) => { + GBSControl.ui.progressRestore.setAttribute("gbs-progress", `${done}/${total}`); + done++; + pos += headerObject[fileName]; + return response; + }); + }); + serial(funcs).then(() => { + GBSControl.ui.progressRestore.setAttribute("gbs-progress", ``); + loadUser("a").then(() => { + gbsAlert("Restarting GBSControl.\nPlease wait until wifi reconnects then click OK") + .then(() => { + window.location.reload(); + }) + .catch(() => { }); + }); + }); +}; +const downloadBlob = (blob, name = "file.txt") => { + // Convert your blob into a Blob URL (a special url that points to an object in the browser's memory) + const blobUrl = URL.createObjectURL(blob); + // Create a link element + const link = document.createElement("a"); + // Set link's href to point to the Blob URL + link.href = blobUrl; + link.download = name; + // Append link to the body + document.body.appendChild(link); + // Dispatch click event on the link + // This is necessary as link.click() does not work on the latest firefox + link.dispatchEvent(new MouseEvent("click", { + bubbles: true, + cancelable: true, + view: window, + })); + // Remove link from body + document.body.removeChild(link); +}; +/** WIFI management */ +const wifiGetStatus = () => { + return fetch(`/wifi/status?${+new Date()}`) + .then((r) => r.json()) + .then((wifiStatus) => { + GBSControl.wifi = wifiStatus; + if (GBSControl.wifi.mode === "ap") { + GBSControl.ui.wifiApButton.setAttribute("active", ""); + GBSControl.ui.wifiApButton.classList.add("gbs-button__secondary"); + GBSControl.ui.wifiStaButton.removeAttribute("active", ""); + GBSControl.ui.wifiStaButton.classList.remove("gbs-button__secondary"); + GBSControl.ui.wifiStaSSID.innerHTML = "STA | Scan Network"; + } + else { + GBSControl.ui.wifiApButton.removeAttribute("active", ""); + GBSControl.ui.wifiApButton.classList.remove("gbs-button__secondary"); + GBSControl.ui.wifiStaButton.setAttribute("active", ""); + GBSControl.ui.wifiStaButton.classList.add("gbs-button__secondary"); + GBSControl.ui.wifiStaSSID.innerHTML = `${GBSControl.wifi.ssid}`; + } + }); +}; +const wifiConnect = () => { + const ssid = GBSControl.ui.wifiSSDInput.value; + const password = GBSControl.ui.wifiPasswordInput.value; + if (!password.length) { + GBSControl.ui.wifiPasswordInput.classList.add("gbs-wifi__input--error"); + return; + } + const formData = new FormData(); + formData.append("n", ssid); + formData.append("p", password); + fetch("/wifi/connect", { + method: "POST", + body: formData, + }).then(() => { + gbsAlert(`GBSControl will restart and will connect to ${ssid}. Please wait some seconds then press OK`) + .then(() => { + window.location.href = "http://gbscontrol.local/"; + }) + .catch(() => { }); + }); +}; +const wifiScanSSID = () => { + GBSControl.ui.wifiStaButton.setAttribute("disabled", ""); + GBSControl.ui.wifiListTable.innerHTML = ""; + if (!GBSControl.scanSSIDDone) { + fetch(`/wifi/list?${+new Date()}`).then(() => { + GBSControl.scanSSIDDone = true; + setTimeout(wifiScanSSID, 3000); + }); + return; + } + fetch(`/wifi/list?${+new Date()}`) + .then((e) => e.text()) + .then((result) => { + GBSControl.scanSSIDDone = false; + return result.length + ? result + .split("\n") + .map((line) => line.split(",")) + .map(([strength, encripted, ssid]) => { + return { strength, encripted, ssid }; + }) + : []; + }) + .then((ssids) => { + return ssids.reduce((acc, ssid) => { + return `${acc} + wifi + ${ssid.ssid} + ${ssid.encripted ? "lock" : "lock_open"} + `; + }, ""); + }) + .then((html) => { + GBSControl.ui.wifiStaButton.removeAttribute("disabled"); + if (html.length) { + GBSControl.ui.wifiListTable.innerHTML = html; + GBSControl.ui.wifiList.removeAttribute("hidden"); + GBSControl.ui.wifiConnect.setAttribute("hidden", ""); + } + }); +}; +const wifiSelectSSID = (event) => { + GBSControl.ui + .wifiSSDInput.value = event.target.parentElement.getAttribute("gbs-ssid"); + GBSControl.ui.wifiPasswordInput.classList.remove("gbs-wifi__input--error"); + GBSControl.ui.wifiList.setAttribute("hidden", ""); + GBSControl.ui.wifiConnect.removeAttribute("hidden"); +}; +const wifiSetAPMode = () => { + if (GBSControl.wifi.mode === "ap") { + return; + } + const formData = new FormData(); + formData.append("n", "dummy"); + fetch("/wifi/connect", { + method: "POST", + body: formData, + }).then(() => { + gbsAlert("Switching to AP mode. Please connect to gbscontrol SSID and then click OK") + .then(() => { + window.location.href = "http://192.168.4.1"; + }) + .catch(() => { }); + }); +}; +/** button click management */ +const controlClick = (control) => () => { + const controlKey = control.getAttribute("gbs-control-key"); + const target = GBSControl.controlKeysMobile[GBSControl.controlKeysMobileMode]; + switch (target.type) { + case "loadDoc": + loadDoc(target[controlKey]); + break; + case "loadUser": + loadUser(target[controlKey]); + break; + } +}; +const controlMouseDown = (control) => () => { + clearInterval(control["__interval"]); + const click = controlClick(control); + click(); + control["__interval"] = setInterval(click, 300); +}; +const controlMouseUp = (control) => () => { + clearInterval(control["__interval"]); +}; +/** inits */ +const initMenuButtons = () => { + const menuButtons = nodelistToArray(document.querySelector(".gbs-menu").querySelectorAll("button")); + const sections = nodelistToArray(document.querySelectorAll("section")); + const scroll = document.querySelector(".gbs-scroll"); + menuButtons.forEach((button) => button.addEventListener("click", () => { + const section = button.getAttribute("gbs-section"); + sections.forEach((section) => section.setAttribute("hidden", "")); + document + .querySelector(`section[name="${section}"]`) + .removeAttribute("hidden"); + menuButtons.forEach((btn) => btn.removeAttribute("active")); + button.setAttribute("active", ""); + scroll.scrollTo(0, 1); + })); +}; +const initGBSButtons = () => { + const actions = { + user: loadUser, + action: loadDoc, + setSlot, + }; + const buttons = nodelistToArray(document.querySelectorAll("[gbs-click]")); + buttons.forEach((button) => { + const clickMode = button.getAttribute("gbs-click"); + const message = button.getAttribute("gbs-message"); + const messageType = button.getAttribute("gbs-message-type"); + const action = actions[messageType]; + if (clickMode === "normal") { + button.addEventListener("click", () => { + action(message); + }); + } + if (clickMode === "repeat") { + const callback = () => { + action(message); + }; + button.addEventListener(!("ontouchstart" in window) ? "mousedown" : "touchstart", () => { + callback(); + clearInterval(button["__interval"]); + button["__interval"] = setInterval(callback, 300); + }); + button.addEventListener(!("ontouchstart" in window) ? "mouseup" : "touchend", () => { + clearInterval(button["__interval"]); + }); + } + }); +}; +const initClearButton = () => { + GBSControl.ui.outputClear.addEventListener("click", () => { + GBSControl.ui.terminal.value = ""; + }); +}; +const initControlMobileKeys = () => { + const controls = document.querySelectorAll("[gbs-control-target]"); + const controlsKeys = document.querySelectorAll("[gbs-control-key]"); + controls.forEach((control) => { + control.addEventListener("click", () => { + GBSControl.controlKeysMobileMode = control.getAttribute("gbs-control-target"); + controls.forEach((crtl) => { + crtl.removeAttribute("active"); + }); + control.setAttribute("active", ""); + }); + }); + controlsKeys.forEach((control) => { + control.addEventListener(!("ontouchstart" in window) ? "mousedown" : "touchstart", controlMouseDown(control)); + control.addEventListener(!("ontouchstart" in window) ? "mouseup" : "touchend", controlMouseUp(control)); + }); +}; +const initLegendHelpers = () => { + nodelistToArray(document.querySelectorAll(".gbs-fieldset__legend--help")).forEach((e) => { + e.addEventListener("click", () => { + document.body.classList.toggle("gbs-help-hide"); + }); + }); +}; +const initUnloadListener = () => { + window.addEventListener("unload", () => { + clearInterval(GBSControl.wsCheckTimer); + if (GBSControl.ws) { + if (GBSControl.ws.readyState == 0 || GBSControl.ws.readyState == 1) { + GBSControl.ws.close(); + } + } + }); +}; +const initSlotButtons = () => { + GBSControl.ui.slotContainer.innerHTML = getSlotsHTML(); + GBSControl.ui.slotButtonList = nodelistToArray(document.querySelectorAll('[gbs-role="slot"]')); +}; +const initUIElements = () => { + GBSControl.ui = { + terminal: document.getElementById("outputTextArea"), + webSocketConnectionWarning: document.getElementById("websocketWarning"), + presetButtonList: nodelistToArray(document.querySelectorAll("[gbs-role='preset']")), + slotButtonList: nodelistToArray(document.querySelectorAll('[gbs-role="slot"]')), + toggleList: document.querySelectorAll("[gbs-toggle]"), + toggleSwichList: document.querySelectorAll("[gbs-toggle-switch]"), + wifiList: document.querySelector("[gbs-wifi-list]"), + wifiListTable: document.querySelector(".gbs-wifi__list"), + wifiConnect: document.querySelector(".gsb-wifi__connect"), + wifiConnectButton: document.querySelector("[gbs-wifi-connect-button]"), + wifiSSDInput: document.querySelector('[gbs-input="ssid"]'), + wifiPasswordInput: document.querySelector('[gbs-input="password"]'), + wifiApButton: document.querySelector("[gbs-wifi-ap]"), + wifiStaButton: document.querySelector("[gbs-wifi-station]"), + wifiStaSSID: document.querySelector("[gbs-wifi-station-ssid]"), + loader: document.querySelector(".gbs-loader"), + progressBackup: document.querySelector("[gbs-progress-backup]"), + progressRestore: document.querySelector("[gbs-progress-restore]"), + outputClear: document.querySelector("[gbs-output-clear]"), + slotContainer: document.querySelector("[gbs-slot-html]"), + backupButton: document.querySelector(".gbs-backup-button"), + backupInput: document.querySelector(".gbs-backup-input"), + developerSwitch: document.querySelector("[gbs-dev-switch]"), + customSlotFilters: document.querySelector("[gbs-slot-custom-filters]"), + alert: document.querySelector('section[name="alert"]'), + alertOk: document.querySelector("[gbs-alert-ok]"), + alertContent: document.querySelector("[gbs-alert-content]"), + prompt: document.querySelector('section[name="prompt"]'), + promptOk: document.querySelector("[gbs-prompt-ok]"), + promptCancel: document.querySelector("[gbs-prompt-cancel]"), + promptContent: document.querySelector("[gbs-prompt-content]"), + promptInput: document.querySelector('[gbs-input="prompt-input"]'), + }; +}; +const initGeneralListeners = () => { + window.addEventListener("resize", () => { + updateViewPort(); + }); + GBSControl.ui.backupInput.addEventListener("change", (event) => { + const fileList = event.target["files"]; + readLocalFile(fileList[0]); + GBSControl.ui.backupInput.value = ""; + }); + GBSControl.ui.backupButton.addEventListener("click", doBackup); + GBSControl.ui.wifiListTable.addEventListener("click", wifiSelectSSID); + GBSControl.ui.wifiConnectButton.addEventListener("click", wifiConnect); + GBSControl.ui.wifiApButton.addEventListener("click", wifiSetAPMode); + GBSControl.ui.wifiStaButton.addEventListener("click", wifiScanSSID); + GBSControl.ui.developerSwitch.addEventListener("click", toggleDeveloperMode); + GBSControl.ui.customSlotFilters.addEventListener("click", toggleCustomSlotFilters); + GBSControl.ui.alertOk.addEventListener("click", () => { + GBSControl.ui.alert.setAttribute("hidden", ""); + gbsAlertPromise.resolve(); + }); + GBSControl.ui.promptOk.addEventListener("click", () => { + GBSControl.ui.prompt.setAttribute("hidden", ""); + const value = GBSControl.ui.promptInput.value; + if (value !== undefined || value.length > 0) { + gbsPromptPromise.resolve(GBSControl.ui.promptInput.value); + } + else { + gbsPromptPromise.reject(); + } + }); + GBSControl.ui.promptCancel.addEventListener("click", () => { + GBSControl.ui.prompt.setAttribute("hidden", ""); + gbsPromptPromise.reject(); + }); + GBSControl.ui.promptInput.addEventListener("keydown", (event) => { + if (event.keyCode === 13) { + GBSControl.ui.prompt.setAttribute("hidden", ""); + const value = GBSControl.ui.promptInput.value; + if (value !== undefined || value.length > 0) { + gbsPromptPromise.resolve(GBSControl.ui.promptInput.value); + } + else { + gbsPromptPromise.reject(); + } + } + if (event.keyCode === 27) { + gbsPromptPromise.reject(); + } + }); +}; +const initDeveloperMode = () => { + const devMode = GBSStorage.read("developerMode"); + if (devMode === undefined) { + GBSStorage.write("developerMode", false); + updateDeveloperMode(false); + } + else { + updateDeveloperMode(devMode); + } +}; +const gbsAlertPromise = { + resolve: null, + reject: null, +}; +const alertKeyListener = (event) => { + if (event.keyCode === 13) { + gbsAlertPromise.resolve(); + } + if (event.keyCode === 27) { + gbsAlertPromise.reject(); + } +}; +const gbsAlert = (text) => { + GBSControl.ui.alertContent.textContent = text; + GBSControl.ui.alert.removeAttribute("hidden"); + document.addEventListener("keyup", alertKeyListener); + return new Promise((resolve, reject) => { + gbsAlertPromise.resolve = (e) => { + document.removeEventListener("keyup", alertKeyListener); + GBSControl.ui.alert.setAttribute("hidden", ""); + return resolve(e); + }; + gbsAlertPromise.reject = () => { + document.removeEventListener("keyup", alertKeyListener); + GBSControl.ui.alert.setAttribute("hidden", ""); + return reject(); + }; + }); +}; +const gbsPromptPromise = { + resolve: null, + reject: null, +}; +const gbsPrompt = (text, defaultValue = "") => { + GBSControl.ui.promptContent.textContent = text; + GBSControl.ui.prompt.removeAttribute("hidden"); + GBSControl.ui.promptInput.value = defaultValue; + return new Promise((resolve, reject) => { + gbsPromptPromise.resolve = resolve; + gbsPromptPromise.reject = reject; + GBSControl.ui.promptInput.focus(); + }); +}; +const initUI = () => { + updateCustomSlotFilters(); + initGeneralListeners(); + updateViewPort(); + initSlotButtons(); + initLegendHelpers(); + initMenuButtons(); + initGBSButtons(); + initClearButton(); + initControlMobileKeys(); + initUnloadListener(); + initDeveloperMode(); +}; +const main = () => { + const ip = location.hostname; + GBSControl.serverIP = ip; + GBSControl.webSocketServerUrl = `ws://${ip}:81/`; + document + .querySelector(".gbs-loader img") + .setAttribute("src", document.head + .querySelector('[rel="apple-touch-icon"]') + .getAttribute("href")); + fetchSlotNamesAndInit(); +}; +main(); diff --git a/public/src/index.ts b/public/src/index.ts new file mode 100644 index 00000000..a95f1977 --- /dev/null +++ b/public/src/index.ts @@ -0,0 +1,1350 @@ +/** STRUCTS */ +interface Struct { + name: string; + type: "byte" | "string"; + size: number; +} + +interface StructDescriptors { + [key: string]: Struct[]; +} + +const Structs: StructDescriptors = { + slots: [ + { name: "name", type: "string", size: 25 }, + { name: "presetID", type: "byte", size: 1 }, + { name: "scanlines", type: "byte", size: 1 }, + { name: "scanlinesStrength", type: "byte", size: 1 }, + { name: "slot", type: "byte", size: 1 }, + { name: "wantVdsLineFilter", type: "byte", size: 1 }, + { name: "wantStepResponse", type: "byte", size: 1 }, + { name: "wantPeaking", type: "byte", size: 1 }, + ], +}; + +const StructParser = { + pos: 0, + parseStructArray( + buff: ArrayBuffer, + structsDescriptors: StructDescriptors, + struct: string + ) { + const currentStruct = structsDescriptors[struct]; + + this.pos = 0; + buff = new Uint8Array(buff); + + if (currentStruct) { + const structSize = StructParser.getSize(structsDescriptors, struct); + + return [...Array(buff.byteLength / structSize)].map(() => { + return currentStruct.reduce((acc, structItem) => { + acc[structItem.name] = this.getValue(buff, structItem); + return acc; + }, {}); + }); + } + + return null; + }, + getValue(buff: any[], structItem: { type: "byte" | "string"; size: number }) { + switch (structItem.type) { + case "byte": + return buff[this.pos++]; + + case "string": + const currentPos = this.pos; + this.pos += structItem.size; + + return [...Array(structItem.size)] + .map(() => " ") + .map((_char, index) => { + if (buff[currentPos + index] > 31) { + return String.fromCharCode(buff[currentPos + index]); + } + return ""; + }) + .join("") + .trim(); + } + }, + getSize(structsDescriptors: StructDescriptors, struct: string) { + const currentStruct = structsDescriptors[struct]; + return currentStruct.reduce((acc, prop) => { + acc += prop.size; + return acc; + }, 0); + }, +}; + +/* GBSControl Global Object*/ +const GBSControl = { + buttonMapping: { + 1: "button1280x960", + 2: "button1280x1024", + 3: "button1280x720", + 4: "button720x480", + 5: "button1920x1080", + 6: "button15kHzScaleDown", + 8: "buttonSourcePassThrough", + 9: "buttonLoadCustomPreset", + }, + controlKeysMobileMode: "move", + controlKeysMobile: { + move: { + type: "loadDoc", + left: "7", + up: "*", + right: "6", + down: "/", + }, + scale: { + type: "loadDoc", + left: "h", + up: "4", + right: "z", + down: "5", + }, + borders: { + type: "loadUser", + left: "B", + up: "C", + right: "A", + down: "D", + }, + }, + dataQueued: 0, + isWsActive: false, + maxSlots: 72, + queuedText: "", + scanSSIDDone: false, + serverIP: "", + structs: null, + timeOutWs: 0, + ui: { + backupButton: null, + backupInput: null, + customSlotFilters: null, + developerSwitch: null, + loader: null, + outputClear: null, + presetButtonList: null, + progressBackup: null, + progressRestore: null, + slotButtonList: null, + slotContainer: null, + terminal: null, + toggleList: null, + toggleSwichList: null, + webSocketConnectionWarning: null, + wifiConnect: null, + wifiConnectButton: null, + wifiList: null, + wifiListTable: null, + wifiPasswordInput: null, + wifiSSDInput: null, + wifiApButton: null, + wifiStaButton: null, + wifiStaSSID: null, + alert: null, + alertOk: null, + alertContent: null, + prompt: null, + promptOk: null, + promptCancel: null, + promptContent: null, + promptInput: null, + }, + updateTerminalTimer: 0, + webSocketServerUrl: "", + wifi: { + mode: "ap", + ssid: "", + }, + ws: null, + wsCheckTimer: 0, + wsConnectCounter: 0, + wsNoSuccessConnectingCounter: 0, + wsTimeout: 0, +}; + +/** websocket services */ +const checkWebSocketServer = () => { + if (!GBSControl.isWsActive) { + if (GBSControl.ws) { + /* + 0 CONNECTING + 1 OPEN + 2 CLOSING + 3 CLOSED + */ + switch (GBSControl.ws.readyState) { + case 1: + case 2: + GBSControl.ws.close(); + break; + case 3: + GBSControl.ws = null; + break; + } + } + if (!GBSControl.ws) { + createWebSocket(); + } + } +}; + +const timeOutWs = () => { + console.log("timeOutWs"); + + if (GBSControl.ws) { + GBSControl.ws.close(); + } + + GBSControl.isWsActive = false; + displayWifiWarning(true); +}; + +const createWebSocket = () => { + if (GBSControl.ws && checkReadyState()) { + return; + } + + GBSControl.wsNoSuccessConnectingCounter = 0; + GBSControl.ws = new WebSocket(GBSControl.webSocketServerUrl, ["arduino"]); + + GBSControl.ws.onopen = () => { + console.log("ws onopen"); + + displayWifiWarning(false); + + GBSControl.wsConnectCounter++; + clearTimeout(GBSControl.wsTimeout); + GBSControl.wsTimeout = setTimeout(timeOutWs, 6000); + GBSControl.isWsActive = true; + GBSControl.wsNoSuccessConnectingCounter = 0; + }; + + GBSControl.ws.onclose = () => { + console.log("ws.onclose"); + + clearTimeout(GBSControl.wsTimeout); + GBSControl.isWsActive = false; + }; + + GBSControl.ws.onmessage = (message: any) => { + clearTimeout(GBSControl.wsTimeout); + GBSControl.wsTimeout = setTimeout(timeOutWs, 2700); + GBSControl.isWsActive = true; + + const [ + messageDataAt0, + messageDataAt1, + messageDataAt2, + messageDataAt3, + messageDataAt4, + messageDataAt5, + ] = message.data; + + if (messageDataAt0 != "#") { + GBSControl.queuedText += message.data; + GBSControl.dataQueued += message.data.length; + + if (GBSControl.dataQueued >= 70000) { + GBSControl.ui.terminal.value = ""; + GBSControl.dataQueued = 0; + } + } else { + const presetId = GBSControl.buttonMapping[messageDataAt1]; + const presetEl = document.querySelector( + `[gbs-element-ref="${presetId}"]` + ); + const activePresetButton = presetEl + ? presetEl.getAttribute("gbs-element-ref") + : null; + + if (activePresetButton) { + GBSControl.ui.presetButtonList.forEach( + toggleButtonActive(activePresetButton) + ); + } + + const slotId = "slot-" + messageDataAt2; + const activeSlotButton = document.querySelector( + `[gbs-element-ref="${slotId}"]` + ); + + if (activeSlotButton) { + GBSControl.ui.slotButtonList.forEach(toggleButtonActive(slotId)); + } + + if (messageDataAt3 && messageDataAt4 && messageDataAt5) { + const optionByte0 = messageDataAt3.charCodeAt(0); + const optionByte1 = messageDataAt4.charCodeAt(0); + const optionByte2 = messageDataAt5.charCodeAt(0); + const optionButtonList = [ + ...nodelistToArray(GBSControl.ui.toggleList), + ...nodelistToArray(GBSControl.ui.toggleSwichList), + ]; + + const toggleMethod = ( + button: HTMLTableCellElement | HTMLElement, + mode: boolean + ) => { + if (button.tagName === "TD") { + button.innerText = mode ? "toggle_on" : "toggle_off"; + } + button = button.tagName !== "TD" ? button : button.parentElement; + if (mode) { + button.setAttribute("active", ""); + } else { + button.removeAttribute("active"); + } + }; + + optionButtonList.forEach((button) => { + const toggleData = + button.getAttribute("gbs-toggle") || + button.getAttribute("gbs-toggle-switch"); + + switch (toggleData) { + case "adcAutoGain": + toggleMethod(button, (optionByte0 & 0x01) == 0x01); + break; + case "scanlines": + toggleMethod(button, (optionByte0 & 0x02) == 0x02); + break; + case "vdsLineFilter": + toggleMethod(button, (optionByte0 & 0x04) == 0x04); + break; + case "peaking": + toggleMethod(button, (optionByte0 & 0x08) == 0x08); + break; + case "palForce60": + toggleMethod(button, (optionByte0 & 0x10) == 0x10); + break; + case "wantOutputComponent": + toggleMethod(button, (optionByte0 & 0x20) == 0x20); + break; + /** 1 */ + + case "matched": + toggleMethod(button, (optionByte1 & 0x01) == 0x01); + break; + case "frameTimeLock": + toggleMethod(button, (optionByte1 & 0x02) == 0x02); + break; + case "motionAdaptive": + toggleMethod(button, (optionByte1 & 0x04) == 0x04); + break; + case "bob": + toggleMethod(button, (optionByte1 & 0x04) != 0x04); + break; + // case "tap6": + // toggleMethod(button, (optionByte1 & 0x08) != 0x04); + // break; + case "step": + toggleMethod(button, (optionByte1 & 0x10) == 0x10); + break; + case "fullHeight": + toggleMethod(button, (optionByte1 & 0x20) == 0x20); + break; + /** 2 */ + case "enableCalibrationADC": + toggleMethod(button, (optionByte2 & 0x01) == 0x01); + break; + case "preferScalingRgbhv": + toggleMethod(button, (optionByte2 & 0x02) == 0x02); + break; + case "disableExternalClockGenerator": + toggleMethod(button, (optionByte2 & 0x04) == 0x04); + break; + } + }); + } + } + }; +}; + +const checkReadyState = () => { + if (GBSControl.ws.readyState == 2) { + GBSControl.wsNoSuccessConnectingCounter++; + + if (GBSControl.wsNoSuccessConnectingCounter >= 7) { + console.log("ws still closing, force close"); + GBSControl.ws = null; + GBSControl.wsNoSuccessConnectingCounter = 0; + /* fall through */ + createWebSocket(); + return false; + } else { + return true; + } + } else if (GBSControl.ws.readyState == 0) { + GBSControl.wsNoSuccessConnectingCounter++; + + if (GBSControl.wsNoSuccessConnectingCounter >= 14) { + console.log("ws still connecting, retry"); + GBSControl.ws.close(); + GBSControl.wsNoSuccessConnectingCounter = 0; + } + return true; + } else { + return true; + } +}; + +const createIntervalChecks = () => { + GBSControl.wsCheckTimer = setInterval(checkWebSocketServer, 500); + GBSControl.updateTerminalTimer = setInterval(updateTerminal, 50); +}; + +/* API services */ + +const loadDoc = (link: string) => { + return fetch( + `http://${GBSControl.serverIP}/sc?${link}&nocache=${new Date().getTime()}` + ); +}; + +const loadUser = (link: string) => { + if (link == "a" || link == "1") { + GBSControl.isWsActive = false; + GBSControl.ui.terminal.value += "\nRestart\n"; + GBSControl.ui.terminal.scrollTop = GBSControl.ui.terminal.scrollHeight; + } + + return fetch( + `http://${GBSControl.serverIP}/uc?${link}&nocache=${new Date().getTime()}` + ); +}; + +/** SLOT management */ + +const savePreset = () => { + const currentSlot = document.querySelector('[gbs-role="slot"][active]'); + + if (!currentSlot) { + return; + } + + const key = currentSlot.getAttribute("gbs-element-ref"); + const currentIndex = currentSlot.getAttribute("gbs-slot-id"); + gbsPrompt( + "Assign a slot name", + GBSControl.structs.slots[currentIndex].name || key + ) + .then((currentName: string) => { + if (currentName && currentName.trim() !== "Empty") { + currentSlot.setAttribute("gbs-name", currentName); + fetch( + `/slot/save?index=${currentIndex}&name=${currentName.substring( + 0, + 24 + )}&${+new Date()}` + ).then(() => { + loadUser("4").then(() => { + setTimeout(() => { + fetchSlotNames().then((success: boolean) => { + if (success) { + updateSlotNames(); + } + }); + }, 500); + }); + }); + } + }) + .catch(() => {}); +}; + +const loadPreset = () => { + loadUser("3").then(() => { + if (GBSStorage.read("customSlotFilters") === true) { + setTimeout(() => { + fetch(`/gbs/restore-filters?${+new Date()}`); + }, 250); + } + }); +}; + +const getSlotsHTML = () => { + // prettier-ignore + return [ + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', + '0','1','2','3','4','5','6','7','8','9','-','.','_','~','(',')','!','*',':',',' + ].map((chr,idx)=>{ + + return ``; + + }).join(''); +}; + +const setSlot = (slot: string) => { + fetch(`/slot/set?slot=${slot}&${+new Date()}`); +}; + +const updateSlotNames = () => { + for (let i = 0; i < GBSControl.maxSlots; i++) { + const el = document.querySelector(`[gbs-slot-id="${i}"]`); + + el.setAttribute("gbs-name", GBSControl.structs.slots[i].name); + el.setAttribute( + "gbs-meta", + getSlotPresetName(parseInt(GBSControl.structs.slots[i].presetID, 10)) + ); + } +}; + +const fetchSlotNames = () => { + return fetch(`/bin/slots.bin?${+new Date()}`) + .then((response) => response.arrayBuffer()) + .then((arrayBuffer: ArrayBuffer) => { + if ( + arrayBuffer.byteLength === + StructParser.getSize(Structs, "slots") * GBSControl.maxSlots + ) { + GBSControl.structs = { + slots: StructParser.parseStructArray(arrayBuffer, Structs, "slots"), + }; + return true; + } + return false; + }); +}; + +const getSlotPresetName = (presetID: number) => { + switch (presetID) { + case 0x01: + case 0x011: + return "1280x960"; + case 0x02: + case 0x012: + return "1280x1024"; + case 0x03: + case 0x013: + return "1280x720"; + case 0x05: + case 0x015: + return "1920x1080"; + case 0x06: + case 0x016: + return "DOWNSCALE"; + case 0x04: + return "720x480"; + case 0x14: + return "768x576"; + case 0x21: // bypass 1 + case 0x22: // bypass 2 + return "BYPASS"; + default: + return "CUSTOM"; + } +}; + +const fetchSlotNamesErrorRetry = () => { + setTimeout(fetchSlotNamesAndInit, 1000); +}; + +const fetchSlotNamesAndInit = () => { + fetchSlotNames() + .then((success) => { + if (!success) { + fetchSlotNamesErrorRetry(); + return; + } + initUIElements(); + wifiGetStatus().then(() => { + initUI(); + updateSlotNames(); + createWebSocket(); + createIntervalChecks(); + setTimeout(hideLoading, 1000); + }); + }, fetchSlotNamesErrorRetry) + .catch(fetchSlotNamesErrorRetry); +}; + +/** Promises */ +const serial = (funcs: (() => Promise)[]) => + funcs.reduce( + (promise, func) => + promise.then((result) => + func().then(Array.prototype.concat.bind(result)) + ), + Promise.resolve([]) + ); + +/** helpers */ + +const toggleDeveloperMode = () => { + const developerMode = GBSStorage.read("developerMode") || false; + + GBSStorage.write("developerMode", !developerMode); + updateDeveloperMode(!developerMode); +}; + +const toggleCustomSlotFilters = () => { + const customSlotFilters = GBSStorage.read("customSlotFilters"); + GBSStorage.write("customSlotFilters", !customSlotFilters); + updateCustomSlotFilters(!customSlotFilters); +}; + +const updateDeveloperMode = (developerMode: boolean) => { + const el = document.querySelector('[gbs-section="developer"]') as HTMLElement; + if (developerMode) { + el.removeAttribute("hidden"); + GBSControl.ui.developerSwitch.setAttribute("active", ""); + document.body.classList.remove("gbs-output-hide"); + } else { + el.setAttribute("hidden", ""); + GBSControl.ui.developerSwitch.removeAttribute("active"); + document.body.classList.add("gbs-output-hide"); + } + + GBSControl.ui.developerSwitch.querySelector( + ".gbs-icon" + ).innerText = developerMode ? "toggle_on" : "toggle_off"; +}; + +const updateCustomSlotFilters = ( + customFilters: boolean = GBSStorage.read("customSlotFilters") === true +) => { + if (customFilters) { + GBSControl.ui.customSlotFilters.setAttribute("active", ""); + } else { + GBSControl.ui.customSlotFilters.removeAttribute("active"); + } + + GBSControl.ui.customSlotFilters.querySelector( + ".gbs-icon" + ).innerText = customFilters ? "toggle_on" : "toggle_off"; +}; + +const GBSStorage = { + lsObject: {}, + write(key: string, value: any) { + GBSStorage.lsObject = GBSStorage.lsObject || {}; + GBSStorage.lsObject[key] = value; + localStorage.setItem( + "GBSControlSlotNames", + JSON.stringify(GBSStorage.lsObject) + ); + }, + read(key: string): string | number | boolean { + GBSStorage.lsObject = JSON.parse( + localStorage.getItem("GBSControlSlotNames") || "{}" + ); + return GBSStorage.lsObject[key]; + }, +}; + +const nodelistToArray = ( + nodelist: + | HTMLCollectionOf + | NodeListOf +): Element[] => { + return Array.prototype.slice.call(nodelist); +}; + +const toggleButtonActive = (id: string) => ( + button: HTMLElement, + _index: any, + _array: any +) => { + button.removeAttribute("active"); + + if (button.getAttribute("gbs-element-ref") === id) { + button.setAttribute("active", ""); + } +}; + +const displayWifiWarning = (mode: boolean) => { + GBSControl.ui.webSocketConnectionWarning.style.display = mode + ? "block" + : "none"; +}; + +const updateTerminal = () => { + if (GBSControl.queuedText.length > 0) { + requestAnimationFrame(() => { + GBSControl.ui.terminal.value += GBSControl.queuedText; + GBSControl.ui.terminal.scrollTop = GBSControl.ui.terminal.scrollHeight; + GBSControl.queuedText = ""; + }); + } +}; + +const updateViewPort = () => { + document.documentElement.style.setProperty( + "--viewport-height", + window.innerHeight + "px" + ); +}; + +const hideLoading = () => { + GBSControl.ui.loader.setAttribute("style", "display:none"); +}; + +const checkFetchResponseStatus = (response: Response) => { + if (!response.ok) { + throw new Error(`HTTP ${response.status} - ${response.statusText}`); + } + return response; +}; + +const readLocalFile = (file: File) => { + const reader = new FileReader(); + reader.addEventListener("load", (event) => { + doRestore(reader.result as ArrayBuffer); + }); + reader.readAsArrayBuffer(file); +}; + +/** backup / restore */ + +const doBackup = () => { + let backupFiles: string[]; + let done = 0; + let total = 0; + fetch("/spiffs/dir") + .then((r) => r.json()) + .then((files: string[]) => { + backupFiles = files; + total = files.length; + const funcs = files.map((path: string) => () => { + return fetch(`/spiffs/download?file=${path}&${+new Date()}`).then( + (response) => { + GBSControl.ui.progressBackup.setAttribute( + "gbs-progress", + `${done}/${total}` + ); + done++; + return checkFetchResponseStatus(response) && response.arrayBuffer(); + } + ); + }); + + return serial(funcs); + }) + .then((files: ArrayBuffer[]) => { + const headerDescriptor = files.reduce((acc, f, index) => { + acc[backupFiles[index]] = f.byteLength; + return acc; + }, {}); + + const backupFilesJSON = JSON.stringify(headerDescriptor); + const backupFilesJSONSize = backupFilesJSON.length; + + const mainHeader = [ + (backupFilesJSONSize >> 24) & 255, // size + (backupFilesJSONSize >> 16) & 255, // size + (backupFilesJSONSize >> 8) & 255, // size + (backupFilesJSONSize >> 0) & 255, + ]; + + const outputArray: number[] = [ + ...mainHeader, + ...backupFilesJSON.split("").map((c) => c.charCodeAt(0)), + ...files.reduce((acc, f, index) => { + acc = acc.concat(Array.from(new Uint8Array(f))); + return acc; + }, []), + ]; + + downloadBlob( + new Blob([new Uint8Array(outputArray)]), + `gbs-control.backup-${+new Date()}.bin` + ); + GBSControl.ui.progressBackup.setAttribute("gbs-progress", ``); + }); +}; + +const doRestore = (file: ArrayBuffer) => { + const { backupInput } = GBSControl.ui; + const fileBuffer = new Uint8Array(file); + const headerCheck = fileBuffer.slice(4, 6); + + if (headerCheck[0] !== 0x7b || headerCheck[1] !== 0x22) { + backupInput.setAttribute("disabled", ""); + gbsAlert("Invalid Backup File") + .then( + () => { + backupInput.removeAttribute("disabled"); + }, + () => { + backupInput.removeAttribute("disabled"); + } + ) + .catch(() => { + backupInput.removeAttribute("disabled"); + }); + return; + } + const b0 = fileBuffer[0], + b1 = fileBuffer[1], + b2 = fileBuffer[2], + b3 = fileBuffer[3]; + const headerSize = (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + const headerString = Array.from(fileBuffer.slice(4, headerSize + 4)) + .map((c) => String.fromCharCode(c)) + .join(""); + + const headerObject = JSON.parse(headerString); + const files = Object.keys(headerObject); + let pos = headerSize + 4; + let total = files.length; + let done = 0; + const funcs = files.map((fileName) => () => { + const fileContents = fileBuffer.slice(pos, pos + headerObject[fileName]); + const formData = new FormData(); + formData.append( + "file", + new Blob([fileContents], { type: "application/octet-stream" }), + fileName.substr(1) + ); + + return fetch("/spiffs/upload", { + method: "POST", + body: formData, + }).then((response) => { + GBSControl.ui.progressRestore.setAttribute( + "gbs-progress", + `${done}/${total}` + ); + done++; + pos += headerObject[fileName]; + return response; + }); + }); + + serial(funcs).then(() => { + GBSControl.ui.progressRestore.setAttribute("gbs-progress", ``); + loadUser("a").then(() => { + gbsAlert( + "Restarting GBSControl.\nPlease wait until wifi reconnects then click OK" + ) + .then(() => { + window.location.reload(); + }) + .catch(() => {}); + }); + }); +}; + +const downloadBlob = (blob: Blob, name = "file.txt") => { + // Convert your blob into a Blob URL (a special url that points to an object in the browser's memory) + const blobUrl = URL.createObjectURL(blob); + + // Create a link element + const link = document.createElement("a"); + + // Set link's href to point to the Blob URL + link.href = blobUrl; + link.download = name; + + // Append link to the body + document.body.appendChild(link); + + // Dispatch click event on the link + // This is necessary as link.click() does not work on the latest firefox + link.dispatchEvent( + new MouseEvent("click", { + bubbles: true, + cancelable: true, + view: window, + }) + ); + + // Remove link from body + document.body.removeChild(link); +}; + +/** WIFI management */ +const wifiGetStatus = () => { + return fetch(`/wifi/status?${+new Date()}`) + .then((r) => r.json()) + .then((wifiStatus: { mode: string; ssid: string }) => { + GBSControl.wifi = wifiStatus; + if (GBSControl.wifi.mode === "ap") { + GBSControl.ui.wifiApButton.setAttribute("active", ""); + GBSControl.ui.wifiApButton.classList.add("gbs-button__secondary"); + GBSControl.ui.wifiStaButton.removeAttribute("active", ""); + GBSControl.ui.wifiStaButton.classList.remove("gbs-button__secondary"); + GBSControl.ui.wifiStaSSID.innerHTML = "STA | Scan Network"; + } else { + GBSControl.ui.wifiApButton.removeAttribute("active", ""); + GBSControl.ui.wifiApButton.classList.remove("gbs-button__secondary"); + GBSControl.ui.wifiStaButton.setAttribute("active", ""); + GBSControl.ui.wifiStaButton.classList.add("gbs-button__secondary"); + GBSControl.ui.wifiStaSSID.innerHTML = `${GBSControl.wifi.ssid}`; + } + }); +}; + +const wifiConnect = () => { + const ssid = GBSControl.ui.wifiSSDInput.value; + const password = GBSControl.ui.wifiPasswordInput.value; + + if (!password.length) { + GBSControl.ui.wifiPasswordInput.classList.add("gbs-wifi__input--error"); + return; + } + + const formData = new FormData(); + formData.append("n", ssid); + formData.append("p", password); + + fetch("/wifi/connect", { + method: "POST", + body: formData, + }).then(() => { + gbsAlert( + `GBSControl will restart and will connect to ${ssid}. Please wait some seconds then press OK` + ) + .then(() => { + window.location.href = "http://gbscontrol.local/"; + }) + .catch(() => {}); + }); +}; + +const wifiScanSSID = () => { + GBSControl.ui.wifiStaButton.setAttribute("disabled", ""); + GBSControl.ui.wifiListTable.innerHTML = ""; + + if (!GBSControl.scanSSIDDone) { + fetch(`/wifi/list?${+new Date()}`).then(() => { + GBSControl.scanSSIDDone = true; + setTimeout(wifiScanSSID, 3000); + }); + return; + } + + fetch(`/wifi/list?${+new Date()}`) + .then((e) => e.text()) + .then((result) => { + GBSControl.scanSSIDDone = false; + return result.length + ? result + .split("\n") + .map((line) => line.split(",")) + .map(([strength, encripted, ssid]) => { + return { strength, encripted, ssid }; + }) + : []; + }) + .then((ssids) => { + return ssids.reduce((acc, ssid) => { + return `${acc} + wifi + ${ssid.ssid} + ${ssid.encripted ? "lock" : "lock_open"} + `; + }, ""); + }) + .then((html) => { + GBSControl.ui.wifiStaButton.removeAttribute("disabled"); + + if (html.length) { + GBSControl.ui.wifiListTable.innerHTML = html; + GBSControl.ui.wifiList.removeAttribute("hidden"); + GBSControl.ui.wifiConnect.setAttribute("hidden", ""); + } + }); +}; + +const wifiSelectSSID = (event: Event) => { + (GBSControl.ui + .wifiSSDInput as HTMLInputElement).value = (event.target as HTMLElement).parentElement.getAttribute( + "gbs-ssid" + ); + GBSControl.ui.wifiPasswordInput.classList.remove("gbs-wifi__input--error"); + GBSControl.ui.wifiList.setAttribute("hidden", ""); + GBSControl.ui.wifiConnect.removeAttribute("hidden"); +}; + +const wifiSetAPMode = () => { + if (GBSControl.wifi.mode === "ap") { + return; + } + + const formData = new FormData(); + formData.append("n", "dummy"); + + fetch("/wifi/connect", { + method: "POST", + body: formData, + }).then(() => { + gbsAlert( + "Switching to AP mode. Please connect to gbscontrol SSID and then click OK" + ) + .then(() => { + window.location.href = "http://192.168.4.1"; + }) + .catch(() => {}); + }); +}; + +/** button click management */ +const controlClick = (control: HTMLButtonElement) => () => { + const controlKey = control.getAttribute("gbs-control-key"); + const target = GBSControl.controlKeysMobile[GBSControl.controlKeysMobileMode]; + + switch (target.type) { + case "loadDoc": + loadDoc(target[controlKey]); + break; + case "loadUser": + loadUser(target[controlKey]); + break; + } +}; + +const controlMouseDown = (control: HTMLButtonElement) => () => { + clearInterval(control["__interval"]); + + const click = controlClick(control); + click(); + control["__interval"] = setInterval(click, 300); +}; + +const controlMouseUp = (control: HTMLButtonElement) => () => { + clearInterval(control["__interval"]); +}; + +/** inits */ +const initMenuButtons = () => { + const menuButtons = nodelistToArray( + document.querySelector(".gbs-menu").querySelectorAll("button") + ); + const sections = nodelistToArray( + document.querySelectorAll("section") + ); + const scroll = document.querySelector(".gbs-scroll"); + + menuButtons.forEach((button) => + button.addEventListener("click", () => { + const section = button.getAttribute("gbs-section"); + + sections.forEach((section) => section.setAttribute("hidden", "")); + document + .querySelector(`section[name="${section}"]`) + .removeAttribute("hidden"); + + menuButtons.forEach((btn) => btn.removeAttribute("active")); + button.setAttribute("active", ""); + scroll.scrollTo(0, 1); + }) + ); +}; + +const initGBSButtons = () => { + const actions = { + user: loadUser, + action: loadDoc, + setSlot, + }; + + const buttons = nodelistToArray( + document.querySelectorAll("[gbs-click]") + ); + + buttons.forEach((button) => { + const clickMode = button.getAttribute("gbs-click"); + const message = button.getAttribute("gbs-message"); + const messageType = button.getAttribute("gbs-message-type"); + const action = actions[messageType]; + + if (clickMode === "normal") { + button.addEventListener("click", () => { + action(message); + }); + } + + if (clickMode === "repeat") { + const callback = () => { + action(message); + }; + + button.addEventListener( + !("ontouchstart" in window) ? "mousedown" : "touchstart", + () => { + callback(); + clearInterval(button["__interval"]); + button["__interval"] = setInterval(callback, 300); + } + ); + button.addEventListener( + !("ontouchstart" in window) ? "mouseup" : "touchend", + () => { + clearInterval(button["__interval"]); + } + ); + } + }); +}; + +const initClearButton = () => { + GBSControl.ui.outputClear.addEventListener("click", () => { + GBSControl.ui.terminal.value = ""; + }); +}; + +const initControlMobileKeys = () => { + const controls = document.querySelectorAll("[gbs-control-target]"); + const controlsKeys = document.querySelectorAll("[gbs-control-key]"); + + controls.forEach((control) => { + control.addEventListener("click", () => { + GBSControl.controlKeysMobileMode = control.getAttribute( + "gbs-control-target" + ); + controls.forEach((crtl) => { + crtl.removeAttribute("active"); + }); + control.setAttribute("active", ""); + }); + }); + + controlsKeys.forEach((control) => { + control.addEventListener( + !("ontouchstart" in window) ? "mousedown" : "touchstart", + controlMouseDown(control as HTMLButtonElement) + ); + control.addEventListener( + !("ontouchstart" in window) ? "mouseup" : "touchend", + controlMouseUp(control as HTMLButtonElement) + ); + }); +}; + +const initLegendHelpers = () => { + nodelistToArray( + document.querySelectorAll(".gbs-fieldset__legend--help") + ).forEach((e) => { + e.addEventListener("click", () => { + document.body.classList.toggle("gbs-help-hide"); + }); + }); +}; + +const initUnloadListener = () => { + window.addEventListener("unload", () => { + clearInterval(GBSControl.wsCheckTimer); + if (GBSControl.ws) { + if (GBSControl.ws.readyState == 0 || GBSControl.ws.readyState == 1) { + GBSControl.ws.close(); + } + } + }); +}; + +const initSlotButtons = () => { + GBSControl.ui.slotContainer.innerHTML = getSlotsHTML(); + GBSControl.ui.slotButtonList = nodelistToArray( + document.querySelectorAll('[gbs-role="slot"]') + ) as HTMLElement[]; +}; + +const initUIElements = () => { + GBSControl.ui = { + terminal: document.getElementById("outputTextArea"), + webSocketConnectionWarning: document.getElementById("websocketWarning"), + presetButtonList: nodelistToArray( + document.querySelectorAll("[gbs-role='preset']") + ) as HTMLElement[], + slotButtonList: nodelistToArray( + document.querySelectorAll('[gbs-role="slot"]') + ) as HTMLElement[], + toggleList: document.querySelectorAll("[gbs-toggle]"), + toggleSwichList: document.querySelectorAll("[gbs-toggle-switch]"), + wifiList: document.querySelector("[gbs-wifi-list]"), + wifiListTable: document.querySelector(".gbs-wifi__list"), + wifiConnect: document.querySelector(".gsb-wifi__connect"), + wifiConnectButton: document.querySelector("[gbs-wifi-connect-button]"), + wifiSSDInput: document.querySelector('[gbs-input="ssid"]'), + wifiPasswordInput: document.querySelector('[gbs-input="password"]'), + wifiApButton: document.querySelector("[gbs-wifi-ap]"), + wifiStaButton: document.querySelector("[gbs-wifi-station]"), + wifiStaSSID: document.querySelector("[gbs-wifi-station-ssid]"), + loader: document.querySelector(".gbs-loader"), + progressBackup: document.querySelector("[gbs-progress-backup]"), + progressRestore: document.querySelector("[gbs-progress-restore]"), + outputClear: document.querySelector("[gbs-output-clear]"), + slotContainer: document.querySelector("[gbs-slot-html]"), + backupButton: document.querySelector(".gbs-backup-button"), + backupInput: document.querySelector(".gbs-backup-input"), + developerSwitch: document.querySelector("[gbs-dev-switch]"), + customSlotFilters: document.querySelector("[gbs-slot-custom-filters]"), + alert: document.querySelector('section[name="alert"]'), + alertOk: document.querySelector("[gbs-alert-ok]"), + alertContent: document.querySelector("[gbs-alert-content]"), + prompt: document.querySelector('section[name="prompt"]'), + promptOk: document.querySelector("[gbs-prompt-ok]"), + promptCancel: document.querySelector("[gbs-prompt-cancel]"), + promptContent: document.querySelector("[gbs-prompt-content]"), + promptInput: document.querySelector('[gbs-input="prompt-input"]'), + }; +}; + +const initGeneralListeners = () => { + window.addEventListener("resize", () => { + updateViewPort(); + }); + + GBSControl.ui.backupInput.addEventListener("change", (event) => { + const fileList: FileList = event.target["files"]; + readLocalFile(fileList[0]); + GBSControl.ui.backupInput.value = ""; + }); + + GBSControl.ui.backupButton.addEventListener("click", doBackup); + GBSControl.ui.wifiListTable.addEventListener("click", wifiSelectSSID); + GBSControl.ui.wifiConnectButton.addEventListener("click", wifiConnect); + GBSControl.ui.wifiApButton.addEventListener("click", wifiSetAPMode); + GBSControl.ui.wifiStaButton.addEventListener("click", wifiScanSSID); + GBSControl.ui.developerSwitch.addEventListener("click", toggleDeveloperMode); + GBSControl.ui.customSlotFilters.addEventListener( + "click", + toggleCustomSlotFilters + ); + + GBSControl.ui.alertOk.addEventListener("click", () => { + GBSControl.ui.alert.setAttribute("hidden", ""); + gbsAlertPromise.resolve(); + }); + + GBSControl.ui.promptOk.addEventListener("click", () => { + GBSControl.ui.prompt.setAttribute("hidden", ""); + const value = GBSControl.ui.promptInput.value; + if (value !== undefined || value.length > 0) { + gbsPromptPromise.resolve(GBSControl.ui.promptInput.value); + } else { + gbsPromptPromise.reject(); + } + }); + + GBSControl.ui.promptCancel.addEventListener("click", () => { + GBSControl.ui.prompt.setAttribute("hidden", ""); + gbsPromptPromise.reject(); + }); + + GBSControl.ui.promptInput.addEventListener("keydown", (event: any) => { + if (event.keyCode === 13) { + GBSControl.ui.prompt.setAttribute("hidden", ""); + const value = GBSControl.ui.promptInput.value; + if (value !== undefined || value.length > 0) { + gbsPromptPromise.resolve(GBSControl.ui.promptInput.value); + } else { + gbsPromptPromise.reject(); + } + } + if (event.keyCode === 27) { + gbsPromptPromise.reject(); + } + }); +}; + +const initDeveloperMode = () => { + const devMode = GBSStorage.read("developerMode") as boolean; + if (devMode === undefined) { + GBSStorage.write("developerMode", false); + updateDeveloperMode(false); + } else { + updateDeveloperMode(devMode); + } +}; + +const gbsAlertPromise = { + resolve: null, + reject: null, +}; + +const alertKeyListener = (event: any) => { + if (event.keyCode === 13) { + gbsAlertPromise.resolve(); + } + if (event.keyCode === 27) { + gbsAlertPromise.reject(); + } +}; + +const gbsAlert = (text: string) => { + GBSControl.ui.alertContent.textContent = text; + GBSControl.ui.alert.removeAttribute("hidden"); + document.addEventListener("keyup", alertKeyListener); + return new Promise((resolve, reject) => { + gbsAlertPromise.resolve = (e) => { + document.removeEventListener("keyup", alertKeyListener); + GBSControl.ui.alert.setAttribute("hidden", ""); + return resolve(e); + }; + gbsAlertPromise.reject = () => { + document.removeEventListener("keyup", alertKeyListener); + GBSControl.ui.alert.setAttribute("hidden", ""); + return reject(); + }; + }); +}; + +const gbsPromptPromise = { + resolve: null, + reject: null, +}; + +const gbsPrompt = (text: string, defaultValue = "") => { + GBSControl.ui.promptContent.textContent = text; + GBSControl.ui.prompt.removeAttribute("hidden"); + GBSControl.ui.promptInput.value = defaultValue; + + return new Promise((resolve, reject) => { + gbsPromptPromise.resolve = resolve; + gbsPromptPromise.reject = reject; + GBSControl.ui.promptInput.focus(); + }); +}; + +const initUI = () => { + updateCustomSlotFilters(); + initGeneralListeners(); + updateViewPort(); + initSlotButtons(); + initLegendHelpers(); + initMenuButtons(); + initGBSButtons(); + initClearButton(); + initControlMobileKeys(); + initUnloadListener(); + initDeveloperMode(); +}; + +const main = () => { + const ip = location.hostname; + GBSControl.serverIP = ip; + GBSControl.webSocketServerUrl = `ws://${ip}:81/`; + document + .querySelector(".gbs-loader img") + .setAttribute( + "src", + document.head + .querySelector('[rel="apple-touch-icon"]') + .getAttribute("href") + ); + fetchSlotNamesAndInit(); +}; + +main(); diff --git a/public/src/manifest.json b/public/src/manifest.json new file mode 100644 index 00000000..776c68da --- /dev/null +++ b/public/src/manifest.json @@ -0,0 +1,26 @@ +{ + "short_name": "GBSControl", + "name": "GBSControl", + "lang": "en", + "description": "GBSControl Remote", + "background_color": "#202020", + "theme_color": "#00c0fb", + "dir": "ltr", + "display": "fullscreen", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "${icon1024}", + "type": "image/png", + "sizes": "1024x1024", + "purpose": "maskable" + }, + { + "src": "${icon1024}", + "type": "image/png", + "sizes": "1024x1024", + "purpose": "any" + } + ] +} diff --git a/public/src/style.css b/public/src/style.css new file mode 100644 index 00000000..5587c6f7 --- /dev/null +++ b/public/src/style.css @@ -0,0 +1,663 @@ +/** variables */ +:root { + --color-black: black; + --color-cod-gray-light: #181818; + --color-cod-gray: #101010; + --color-mine-shaft-light: #303030; + --color-mine-shaft: #202020; + --color-primary-rgba: 0, 192, 251; + --color-primary: #00c0fb; + --color-scorpion: #808080; + --color-secondary-rgba: 234, 182, 56; + --color-secondary: #eab638; + --color-silver-chalice: #aaa; + --color-warning: red; + --color-white: white; + --viewport-height: 100%; + + /*GBC + --color-black: black; + --color-cod-gray-light: #181818; + --color-cod-gray: #101010; + --color-mine-shaft-light: #0f380f; + --color-mine-shaft: #306230; + --color-primary-rgba: 155,188,15; + --color-primary: #9bbc0f; + --color-scorpion: #808080; + --color-secondary-rgba: 155,188,15; + --color-secondary: #9bbc0f; + --color-silver-chalice: black; + --color-warning: black; + --color-white: white; + */ +} + +/* latin */ +@font-face { + font-family: "Oswald"; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(data:font/woff2;base64,${oswald}) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, + U+FEFF, U+FFFD; +} + +/* fallback */ +@font-face { + font-family: "Material Icons"; + font-style: normal; + font-weight: 400; + src: url(data:font/woff2;base64,${material}) format("woff2"); +} + +html, +body { + height: 100%; + touch-action: manipulation; + width: 100%; +} + +body { + background-color: var(--color-cod-gray); + font-family: "Oswald", sans-serif; + height: 100%; + margin: 0; + overflow: hidden; + padding: 0; + width: 100%; +} + +* { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/** main container */ +.gbs-container { + background-color: var(--color-mine-shaft); + display: inline-block; + height: 100%; + margin-left: auto; + margin-right: auto; + max-width: 414px; + overflow: hidden; + position: relative; + width: 100%; +} + +/** main screen scrollable area */ +.gbs-scroll { + height: calc(100% - 54px); + margin-bottom: 148px; + overflow-x: hidden; + overflow-y: auto; +} + +.gbs-scroll::-webkit-scrollbar { + width: 2px; +} + +.gbs-scroll::-webkit-scrollbar-track { + background: transparent; +} + +.gbs-scroll::-webkit-scrollbar-thumb { + background-color: var(--color-primary); + border-radius: 20px; +} + +/* buttons */ +.gbs-button { + appearance: none; + background-color: var(--color-mine-shaft-light); + border-radius: 4px; + border: 1px dashed rgba(var(--color-primary-rgba), 0.2); + color: rgba(var(--color-primary-rgba), 0.6); + cursor: pointer; + flex-grow: 1; + font-family: inherit; + font-size: 14px; + font-weight: 300; + margin: 2px; + outline: 0; + overflow: hidden; + padding: 4px 8px; + position: relative; + text-align: right; + text-overflow: ellipsis; + transition: all 0.2s linear; + user-select: none; + white-space: nowrap; +} + +.gbs-button[disabled] { + opacity: 0.3; + pointer-events: none; +} + +.gbs-button[active] { + border: 1px solid var(--color-primary); + box-shadow: inset 0 0 6px 4px rgba(var(--color-primary-rgba), 0.2), + 0 0 6px 4px rgba(var(--color-primary-rgba), 0.2); + color: var(--color-primary); +} + +.gbs-button__secondary { + border: 1px dashed rgba(var(--color-secondary-rgba), 0.3); + color: rgba(var(--color-secondary-rgba), 0.7); +} + +.gbs-button__secondary[active] { + background-color: rgba(var(--color-secondary-rgba), 0.7); + border: 1px solid rgba(var(--color-secondary-rgba), 0.3); + box-shadow: inset 0 0 6px 4px rgba(var(--color-secondary-rgba), 0.2), + 0 0 6px 8px rgba(var(--color-secondary-rgba), 0.2); + color: var(--color-black); + transform: scale(0.98); +} + +.gbs-button__menu { + margin: 2px; + width: 100%; + text-align: center; +} + +.gbs-button__preset { + flex-grow: 1; + font-size: 12px; + height: 44px; + line-height: 12px; + margin: 1px; + padding: 4px; + text-align: right; + vertical-align: top; + white-space: initial; +} + +.gbs-button__slot { + flex-grow: 1; + line-height: 16px; + margin: 4px; + min-height: 56px; + padding: 8px; + text-align: right; + width: 132px; +} + +.gbs-button__slot::before { + color: var(--color-secondary); + content: attr(gbs-name); + font-size: 16px; + white-space: normal; +} + +.gbs-button__slot::after { + color: var(--color-primary); + content: attr(gbs-meta); + display: block; + font-size: 10px; + line-height: 14px; + white-space: pre; +} + +.gbs-button__resolution { + flex-grow: 1; + font-size: 14px; + height: 52px; + line-height: 14px; + margin: 1px; + min-width: 40px; + padding: 4px; + text-align: right; + vertical-align: top; + white-space: initial; +} + +.gbs-button__resolution--center { + text-align: center; +} + +.gbs-button__resolution--pass-through { + font-size: 10px; + line-height: 10px; + position: relative; + top: -4px; +} + +.gbs-button__control { + flex-grow: 1; + height: 68px; + margin: 2px; + padding: 6px; + text-align: right; + vertical-align: top; + white-space: initial; + width: 84px; +} + +.gbs-button__control-action { + flex-grow: 1; + height: 56px; + line-height: 1; + margin: 4px; + text-align: right; +} + +/* menu */ +.gbs-menu { + background-color: var(--color-cod-gray-light); + border-top: 1px solid #282828; + bottom: 0; + box-sizing: border-box; + color: var(--color-primary); + display: flex; + height: 54px; + padding: 8px; + position: absolute; + text-align: center; + width: 100%; +} + +.gbs-menu__logo { + display: none; + margin: auto; + margin-right: 8px; + width: 200%; +} + +/* fieldset */ +.gbs-fieldset { + border-radius: 4px; + border: 1px solid rgba(var(--color-primary-rgba), 0.1); + box-sizing: border-box; + color: var(--color-primary); + font-size: 15px; + margin: 8px; + padding: 8px; + position: relative; +} + +.gbs-fieldset__legend { + display: inline-block !important; + font-size: 16px; + position: relative; + text-align: left; + vertical-align: top; +} + +.gbs-fieldset__legend--help::after { + color: var(--color-secondary); + content: "help_center"; + cursor: pointer; + font-family: "Material Icons"; + font-size: 24px; + position: relative; + top: 8px; +} + +.gbs-show-help .gbs-fieldset__legend::after { + color: var(--color-scorpion); +} + +.gbs-fieldset__legend div { + display: inline-block; + vertical-align: middle; +} + +/** table */ + +.gbs-preferences { + width: 100%; +} + +.gbs-preferences td { + color: var(--color-silver-chalice); + text-align: left; +} + +.gbs-preferences td[toggle-switch], +.gbs-preferences td.gbs-icon { + cursor: pointer; +} + +.gbs-preferences tr[active] td { + color: var(--color-primary); +} + +.gbs-preferences tr td.gbs-preferences__child { + color: var(--color-secondary); +} + +.gbs-preferences tr[active] td.gbs-preferences__child { + color: var(--color-secondary); +} + +.gbs-preferences td em { + color: var(--color-silver-chalice); + display: block; + display: none; + font-size: 12px; + font-style: normal; + line-height: 16px; + margin-bottom: 16px; + margin-top: 4px; +} + +.gbs-preferences .gbs-icon { + font-size: 32px; +} + +/* sections */ + +.gbs-resolution { + display: flex; +} + +.gbs-presets { + border-radius: 8px; + display: flex; + flex-wrap: wrap; + height: calc(var(--viewport-height) - 310px); + justify-content: space-around; + margin-bottom: 16px; + overflow-y: scroll; + overflow: hidden; +} + +.gbs-controls__desktop { + display: none; +} + +.gbs-output-hide .gbs-output { + display: none; +} + +.gbs-output { + position: relative; +} + +.gbs-output__textarea { + appearance: none; + background-color: var(--color-black); + border-radius: 8px; + border: none; + box-sizing: border-box; + color: var(--color-white); + flex-grow: 1; + height: 400px; + outline: 0; + padding: 16px; + resize: none; + scrollbar-color: var(--color-primary) var(--color-black); + scrollbar-width: thin; +} + +.gbs-output__textarea::-webkit-scrollbar { + border-radius: 20px; + width: 20px; +} + +.gbs-output__textarea::-webkit-scrollbar-track { + background-color: var(--color-black); + border-radius: 20px; +} + +.gbs-output__textarea::-webkit-scrollbar-thumb { + background-color: var(--color-primary); + border-radius: 20px; + border: 7px solid var(--color-black); +} + +.gbs-loader { + align-items: center; + background-color: var(--color-mine-shaft); + display: flex; + height: 100%; + justify-content: center; + left: 0; + position: fixed; + top: 0; + width: 100%; +} + +.gbs-loader img { + border-radius: 16px; + box-shadow: 0 0 64px 4px var(--color-primary); + width: 160px; +} + +.gbs-loader, +body { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='152' height='152'%3E%3Cpath fill='%2300c0fb' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E"); +} + +.gbs-wifi__list { + text-align: left; +} + +.gbs-wifi__list tr { + height: 38px; + line-height: 38px; +} + +.gbs-wifi__list td { + line-height: 18px; + vertical-align: top; +} + +.gbs-wifi__list .gbs-icon ~ td { + width: 100%; +} + +.gbs-wifi__list td ~ td ~ td { + color: var(--color-secondary); +} + +.gbs-wifi__input { + flex-grow: 1; + height: 38px; +} + +.gbs-wifi__input--error { + animation: gbs-border-blinker 0.5s linear infinite; +} + +input { + -webkit-user-select: initial !important; + user-select: initial !important; +} + +.gbs-wifi-warning { + animation: gbs-blinker 0.5s linear infinite; + color: var(--color-warning); + position: absolute; + right: 18px; + top: 10px; + z-index: 1; +} + +/* modals */ + +section[name="prompt"], +section[name="alert"] { + background-color: rgba(0, 0, 0, 0.96); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.gbs-modal__message { + text-align: right; + margin-top: 16px; + margin-bottom: 32px; +} + +/* HELPERS */ +[hidden] { + display: none !important; +} + +[gbs-progress]::before { + content: attr(gbs-progress); +} + +.gbs-backup-input { + cursor: pointer; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + width: 100%; +} + +.gbs-button[gbs-name="Empty"] ~ .gbs-button[gbs-name="Empty"] { + display: none; +} + +.gbs-help { + color: var(--color-scorpion); + display: flex; + flex-direction: column; + font-size: 14px; + line-height: 18px; + margin: 8px 0 16px 0; + padding-left: 28px; + text-align: left; + white-space: pre-line; +} + +.gbs-help-hide .gbs-help { + display: none; +} + +.gbs-icon { + -webkit-font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; + direction: ltr; + display: inline-block; + font-family: "Material Icons"; + font-size: 24px; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-height: 1; + text-transform: none; + white-space: nowrap; + word-wrap: normal; +} + +.gbs-flex { + display: flex; +} + +.gbs-margin__bottom--16 { + margin-bottom: 16px; +} + +.gbs-padding__left-16 { + padding-left: 16px; +} + +.gbs-padding__hor-16 { + padding-left: 16px; + padding-right: 16px; +} + +@media (min-width: 415px) { + .gbs-button:hover { + border: 1px solid var(--color-primary); + box-shadow: inset 0 0 6px 4px rgba(var(--color-primary-rgba), 0.2), + 0 0 6px 4px rgba(var(--color-primary-rgba), 0.2); + color: var(--color-primary); + } + + .gbs-button__secondary:hover { + background-color: rgba(var(--color-secondary-rgba), 0.7); + border: 1px solid rgba(var(--color-secondary-rgba), 0.3); + box-shadow: inset 0 0 6px 4px rgba(var(--color-secondary-rgba), 0.2), + 0 0 6px 8px rgba(var(--color-secondary-rgba), 0.2); + color: var(--color-black); + transform: scale(0.98); + } + + .gbs-button__control { + height: 60px; + } + + .gbs-menu { + border-bottom: 1px solid rgba(var(--color-primary-rgba), 0.4); + bottom: initial; + padding-left: 8px; + padding-right: 8px; + position: relative; + top: 0; + } + + .gbs-menu__logo { + display: inline-block; + } + + .gbs-controls { + display: none; + } + + .gbs-controls__desktop { + display: block; + } + + .gbs-presets { + height: calc(100vh - 310px); + } + + .gbs-output { + background-color: var(--color-mine-shaft-light); + height: 100vh; + left: 414px; + position: fixed; + top: 0px; + width: calc(100vw - 414px); + z-index: 1; + } + + .gbs-output__textarea { + height: calc(100vh - 114px); + } + + .gbs-output-hide .gbs-container { + border-radius: 16px; + box-shadow: 0 0 64px 4px rgba(var(--color-primary-rgba), 0.4); + display: block; + height: calc(100vh - 64px); + margin-top: 32px; + } + + .gbs-output-hide .gbs-presets { + height: calc(100vh - 374px); + } + + .gbs-fieldset-output { + height: calc(100vh - 16px); + } +} + +@keyframes gbs-border-blinker { + 50% { + border: 1px solid var(--color-warning); + } +} + +@keyframes gbs-blinker { + 50% { + opacity: 0; + } +} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 6c5d5d44..00000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -sphinx-rtd-theme diff --git a/rgbhv.h b/rgbhv.h new file mode 100644 index 00000000..f7bfae07 --- /dev/null +++ b/rgbhv.h @@ -0,0 +1,595 @@ +const uint8_t rgbhv[] PROGMEM = { +44, +164, +0, +20, +37, +5, +127, +23, +42, +3, +0, +0, +0, +0, +0, +44, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +96, +128, +64, +0, +0, +0, +0, +0, +0, +0, +0, +192, +1, +4, +0, +3, +128, +0, +47, +0, +255, +255, +255, +255, +131, +0, +207, +0, +20, +224, +31, +0, +0, +0, +138, +3, +3, +0, +168, +0, +4, +0, +0, +0, +0, +0, +0, +0, +202, +0, +128, +0, +63, +0, +128, +44, +204, +0, +0, +0, +0, +1, +192, +0, +0, +1, +192, +0, +0, +1, +192, +0, +0, +1, +192, +0, +0, +1, +192, +0, +0, +1, +192, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +160, +38, +65, +62, +178, +154, +78, +214, +177, +142, +124, +99, +139, +118, +112, +98, +133, +105, +83, +72, +93, +148, +178, +70, +198, +238, +140, +98, +118, +156, +0, +0, +1, +0, +0, +12, +202, +0, +0, +0, +0, +0, +0, +0, +0, +0, +255, +3, +204, +0, +0, +0, +0, +0, +7, +0, +140, +4, +220, +0, +0, +72, +32, +128, +142, +0, +0, +0, +12, +4, +11, +4, +0, +16, +0, +0, +0, +16, +80, +2, +0, +0, +4, +0, +76, +12, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +52, +127, +153, +56, +3, +11, +4, +100, +128, +4, +143, +0, +0, +0, +2, +72, +133, +62, +194, +131, +78, +192, +3, +0, +10, +228, +69, +193, +67, +60, +194, +131, +84, +192, +139, +62, +216, +178, +32, +1, +0, +0, +0, +0, +16, +0, +0, +0, +0, +0, +8, +3, +0, +207, +38, +7, +17, +143, +224, +47, +32, +240, +64, +58, +127, +0, +0, +128, +30, +41, +0, +0, +254, +1, +1, +0, +128, +0, +7, +3, +0, +0, +250, +20, +249, +24, +249, +16, +249, +32, +249, +10, +27, +30, +32, +0, +112, +8, +36, +10, +139, +0, +26, +0, +0, +26, +0, +196, +63, +4, +4, +155, +128, +9, +233, +255, +127, +64, +210, +13, +216, +255, +63, +0, +0, +0, +0, +8, +0, +188, +5, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +135, +48, +0, +0, +48, +119, +66, +51, +1, +148, +17, +127, +0, +4, +0, +6, +0, +146, +7, +1, +150, +5, +0, +0, +0, +0, +0, +119, +0, +0, +0, +0, +0, +3, +1, +31, +0, +184, +3, +255, +255, +31, +0, +132, +30, +0, +128, +0, +0, +31, +224, +0, +1, +0, +0, +184, +204, +184, +0, +2, +0, +0, +3, +0, +0, +0, +104, +0, +255, +255, +7, +255, +255, +7, +0, +68, +0, +96, +40, +62, +192, +0, +0, +0, +0, +0, +0, +0, +204, +0, +204, +76, +0, +0, +0, +0, +216, +0, +84, +49, +0, +0, +63, +63, +63, +127, +127, +127, +0, +0, +0, +0, +0, +178, +132, +3, +0, +0, +47, +5, +0, +0, +0, +0, +0, +0, +0, +4, +210, +32, +15, +0, +64, +0, +5, +0, +0, +0, +15, +0, +0, +4, +0, +4, +0, +47, +0, +40, +3, +21, +0, +4, +0, +0, +10, +0, +0, +0, +240, +3, +11, +0, +0, +16, +0, +0, +0, +5, +0, +4, +0, +52, +0, +0, +0, +0, +0, +2, +0, +6, +0, +80, +54, +68, +5, +192, +1, +200, +6, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 00000000..f166cc57 --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/src/README.md b/src/README.md new file mode 100644 index 00000000..63eef3e2 --- /dev/null +++ b/src/README.md @@ -0,0 +1,98 @@ +WebSocket Server and Client for Arduino [![Build Status](https://travis-ci.org/Links2004/arduinoWebSockets.svg?branch=master)](https://travis-ci.org/Links2004/arduinoWebSockets) +=========================================== + +a WebSocket Server and Client for Arduino based on RFC6455. + + +##### Supported features of RFC6455 ##### + - text frame + - binary frame + - connection close + - ping + - pong + - continuation frame + +##### Limitations ##### + - max input length is limited to the ram size and the ```WEBSOCKETS_MAX_DATA_SIZE``` define + - max output length has no limit (the hardware is the limit) + - Client send big frames with mask 0x00000000 (on AVR all frames) + - continuation frame reassembly need to be handled in the application code + + ##### Limitations for Async ##### + - Functions called from within the context of the websocket event might not honor `yield()` and/or `delay()`. See [this issue](https://github.com/Links2004/arduinoWebSockets/issues/58#issuecomment-192376395) for more info and a potential workaround. + - wss / SSL is not possible. + +##### Supported Hardware ##### + - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) + - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) + - ESP31B + - Particle with STM32 ARM Cortex M3 + - ATmega328 with Ethernet Shield (ATmega branch) + - ATmega328 with enc28j60 (ATmega branch) + - ATmega2560 with Ethernet Shield (ATmega branch) + - ATmega2560 with enc28j60 (ATmega branch) + +###### Note: ###### + + version 2.0 and up is not compatible with AVR/ATmega, check ATmega branch. + + Arduino for AVR not supports std namespace of c++. + +### wss / SSL ### + supported for: + - wss client on the ESP8266 + - wss / SSL is not natively supported in WebSocketsServer however it is possible to achieve secure websockets + by running the device behind an SSL proxy. See [Nginx](examples/Nginx/esp8266.ssl.reverse.proxy.conf) for a + sample Nginx server configuration file to enable this. + +### ESP Async TCP ### + +This libary can run in Async TCP mode on the ESP. + +The mode can be activated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE define). + +[ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) libary is required. + + +### High Level Client API ### + + - `begin` : Initiate connection sequence to the websocket host. +``` +void begin(const char *host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); +void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); + ``` + - `onEvent`: Callback to handle for websocket events + + ``` + void onEvent(WebSocketClientEvent cbEvent); + ``` + + - `WebSocketClientEvent`: Handler for websocket events + ``` + void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length) + ``` +Where `WStype_t type` is defined as: + ``` + typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + } WStype_t; + ``` + +### Issues ### +Submit issues to: https://github.com/Links2004/arduinoWebSockets/issues + +[![Join the chat at https://gitter.im/Links2004/arduinoWebSockets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Links2004/arduinoWebSockets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### License and credits ### + +The library is licensed under [LGPLv2.1](https://github.com/Links2004/arduinoWebSockets/blob/master/LICENSE) + +[libb64](http://libb64.sourceforge.net/) written by Chris Venter. It is distributed under Public Domain see [LICENSE](https://github.com/Links2004/arduinoWebSockets/blob/master/src/libb64/LICENSE). diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp new file mode 100644 index 00000000..3a90a402 --- /dev/null +++ b/src/WebSockets.cpp @@ -0,0 +1,749 @@ +/** + * @file WebSockets.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" + +#ifdef ESP8266 +#include +#endif + +extern "C" { +#ifdef CORE_HAS_LIBB64 +#include +#else +#include "libb64/cencode_inc.h" +#endif +} + +#ifdef ESP8266 +#include +#elif defined(ESP32) +#include +#else + +extern "C" { +#include "libsha1/libsha1.h" +} + +#endif + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param code uint16_t see RFC + * @param reason ptr to the disconnect reason message + * @param reasonLen length of the disconnect reason message + */ +void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + if(client->status == WSC_CONNECTED && code) { + if(reason) { + sendFrame(client, WSop_close, (uint8_t *)reason, reasonLen); + } else { + uint8_t buffer[2]; + buffer[0] = ((code >> 8) & 0xFF); + buffer[1] = (code & 0xFF); + sendFrame(client, WSop_close, &buffer[0], 2); + } + } + clientDisconnect(client); +} + +/** + * + * @param buf uint8_t * ptr to the buffer for writing + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param mask bool add dummy mask to the frame (needed for web browser) + * @param maskkey uint8_t[4] key used for payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + */ +uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) { + uint8_t headerSize; + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(mask) { + headerSize += 4; + } + + // create header + + // byte 0 + *headerPtr = 0x00; + if(fin) { + *headerPtr |= bit(7); ///< set Fin + } + *headerPtr |= opcode; ///< set opcode + headerPtr++; + + // byte 1 + *headerPtr = 0x00; + if(mask) { + *headerPtr |= bit(7); ///< set mask + } + + if(length < 126) { + *headerPtr |= length; + headerPtr++; + } else if(length < 0xFFFF) { + *headerPtr |= 126; + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } else { + // Normally we never get here (to less memory) + *headerPtr |= 127; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = ((length >> 24) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 16) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } + + if(mask) { + *headerPtr = maskKey[0]; + headerPtr++; + *headerPtr = maskKey[1]; + headerPtr++; + *headerPtr = maskKey[2]; + headerPtr++; + *headerPtr = maskKey[3]; + headerPtr++; + } + return headerSize; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @return true if ok + */ +bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool fin) { + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize = createHeader(&buffer[0], opcode, length, client->cIsClient, maskKey, fin); + + if(write(client, &buffer[0], headerSize) != headerSize) { + return false; + } + + return true; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * ptr to the payload + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) + * @return true if ok + */ +bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin, bool headerToPayload) { + if(client->tcp && !client->tcp->connected()) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + return false; + } + + if(client->status != WSC_CONNECTED) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + return false; + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send message frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, client->cIsClient, length, headerToPayload); + + if(opcode == WSop_text) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + } + + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize; + uint8_t * headerPtr; + uint8_t * payloadPtr = payload; + bool useInternBuffer = false; + bool ret = true; + + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(client->cIsClient) { + headerSize += 4; + } + +#ifdef WEBSOCKETS_USE_BIG_MEM + // only for ESP since AVR has less HEAP + // try to send data in one TCP package (only if some free Heap is there) + if(!headerToPayload && ((length > 0) && (length < 1400)) && (GET_FREE_HEAP > 6000)) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + uint8_t * dataPtr = (uint8_t *)malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); + if(dataPtr) { + memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); + headerToPayload = true; + useInternBuffer = true; + payloadPtr = dataPtr; + } + } +#endif + + // set Header Pointer + if(headerToPayload) { + // calculate offset in payload + headerPtr = (payloadPtr + (WEBSOCKETS_MAX_HEADER_SIZE - headerSize)); + } else { + headerPtr = &buffer[0]; + } + + if(client->cIsClient && useInternBuffer) { + // if we use a Intern Buffer we can modify the data + // by this fact its possible the do the masking + for(uint8_t x = 0; x < sizeof(maskKey); x++) { + maskKey[x] = random(0xFF); + } + } + + createHeader(headerPtr, opcode, length, client->cIsClient, maskKey, fin); + + if(client->cIsClient && useInternBuffer) { + uint8_t * dataMaskPtr; + + if(headerToPayload) { + dataMaskPtr = (payloadPtr + WEBSOCKETS_MAX_HEADER_SIZE); + } else { + dataMaskPtr = payloadPtr; + } + + for(size_t x = 0; x < length; x++) { + dataMaskPtr[x] = (dataMaskPtr[x] ^ maskKey[x % 4]); + } + } + +#ifndef NODEBUG_WEBSOCKETS + unsigned long start = micros(); +#endif + + if(headerToPayload) { + // header has be added to payload + // payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings + // offset in payload is calculatetd 14 - headerSize + if(write(client, &payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)) != (length + headerSize)) { + ret = false; + } + } else { + // send header + if(write(client, &buffer[0], headerSize) != headerSize) { + ret = false; + } + + if(payloadPtr && length > 0) { + // send payload + if(write(client, &payloadPtr[0], length) != length) { + ret = false; + } + } + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%luus).\n", client->num, (micros() - start)); + +#ifdef WEBSOCKETS_USE_BIG_MEM + if(useInternBuffer && payloadPtr) { + free(payloadPtr); + } +#endif + + return ret; +} + +/** + * callen when HTTP header is done + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::headerDone(WSclient_t * client) { + client->status = WSC_CONNECTED; + client->cWsRXsize = 0; + DEBUG_WEBSOCKETS("[WS][%d][headerDone] Header Handling Done.\n", client->num); +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; + handleWebsocket(client); +#endif +} + +/** + * handle the WebSocket stream + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::handleWebsocket(WSclient_t * client) { + if(client->cWsRXsize == 0) { + handleWebsocketCb(client); + } +} + +/** + * wait for + * @param client + * @param size + */ +bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) { + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + if(size > WEBSOCKETS_MAX_HEADER_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d too big!\n", client->num, size); + return false; + } + + if(client->cWsRXsize >= size) { + return true; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d cWsRXsize: %d\n", client->num, size, client->cWsRXsize); + readCb(client, &client->cWsHeader[client->cWsRXsize], (size - client->cWsRXsize), std::bind([](WebSockets * server, size_t size, WSclient_t * client, bool ok) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor][readCb] size: %d ok: %d\n", client->num, size, ok); + if(ok) { + client->cWsRXsize = size; + server->handleWebsocketCb(client); + } else { + DEBUG_WEBSOCKETS("[WS][%d][readCb] failed.\n", client->num); + client->cWsRXsize = 0; + // timeout or error + server->clientDisconnect(client, 1002); + } + }, + this, size, std::placeholders::_1, std::placeholders::_2)); + return false; +} + +void WebSockets::handleWebsocketCb(WSclient_t * client) { + if(!client->tcp || !client->tcp->connected()) { + return; + } + + uint8_t * buffer = client->cWsHeader; + + WSMessageHeader_t * header = &client->cWsHeaderDecode; + uint8_t * payload = NULL; + + uint8_t headerLen = 2; + + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + // split first 2 bytes in the data + header->fin = ((*buffer >> 7) & 0x01); + header->rsv1 = ((*buffer >> 6) & 0x01); + header->rsv2 = ((*buffer >> 5) & 0x01); + header->rsv3 = ((*buffer >> 4) & 0x01); + header->opCode = (WSopcode_t)(*buffer & 0x0F); + buffer++; + + header->mask = ((*buffer >> 7) & 0x01); + header->payloadLen = (WSopcode_t)(*buffer & 0x7F); + buffer++; + + if(header->payloadLen == 126) { + headerLen += 2; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->payloadLen = buffer[0] << 8 | buffer[1]; + buffer += 2; + } else if(header->payloadLen == 127) { + headerLen += 8; + // read 64bit integer as length + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + if(buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 0 || buffer[3] != 0) { + // really too big! + header->payloadLen = 0xFFFFFFFF; + } else { + header->payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7]; + } + buffer += 8; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, header->fin, header->rsv1, header->rsv2, header->rsv3, header->opCode); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, header->mask, header->payloadLen); + + if(header->payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload too big! (%u)\n", client->num, header->payloadLen); + clientDisconnect(client, 1009); + return; + } + + if(header->mask) { + headerLen += 4; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->maskKey = buffer; + buffer += 4; + } + + if(header->payloadLen > 0) { + // if text data we need one more + payload = (uint8_t *)malloc(header->payloadLen + 1); + + if(!payload) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, header->payloadLen); + clientDisconnect(client, 1011); + return; + } + readCb(client, payload, header->payloadLen, std::bind(&WebSockets::handleWebsocketPayloadCb, this, std::placeholders::_1, std::placeholders::_2, payload)); + } else { + handleWebsocketPayloadCb(client, true, NULL); + } +} + +void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) { + WSMessageHeader_t * header = &client->cWsHeaderDecode; + if(ok) { + if(header->payloadLen > 0) { + payload[header->payloadLen] = 0x00; + + if(header->mask) { + //decode XOR + for(size_t i = 0; i < header->payloadLen; i++) { + payload[i] = (payload[i] ^ header->maskKey[i % 4]); + } + } + } + + switch(header->opCode) { + case WSop_text: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + // no break here! + case WSop_binary: + case WSop_continuation: + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_ping: + // send pong back + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ping received (%s)\n", client->num, payload ? (const char *)payload : ""); + sendFrame(client, WSop_pong, payload, header->payloadLen); + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_pong: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload ? (const char *)payload : ""); + client->pongReceived = true; + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_close: { +#ifndef NODEBUG_WEBSOCKETS + uint16_t reasonCode = 1000; + if(header->payloadLen >= 2) { + reasonCode = payload[0] << 8 | payload[1]; + } +#endif + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode); + if(header->payloadLen > 2) { + DEBUG_WEBSOCKETS(" (%s)\n", (payload + 2)); + } else { + DEBUG_WEBSOCKETS("\n"); + } + clientDisconnect(client, 1000); + } break; + default: + clientDisconnect(client, 1002); + break; + } + + if(payload) { + free(payload); + } + + // reset input + client->cWsRXsize = 0; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + //register callback for next message + handleWebsocketWaitFor(client, 2); +#endif + + } else { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + free(payload); + clientDisconnect(client, 1002); + } +} + +/** + * generate the key for Sec-WebSocket-Accept + * @param clientKey String + * @return String Accept Key + */ +String WebSockets::acceptKey(String & clientKey) { + uint8_t sha1HashBin[20] = { 0 }; +#ifdef ESP8266 + sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]); +#elif defined(ESP32) + String data = clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + esp_sha(SHA1, (unsigned char *)data.c_str(), data.length(), &sha1HashBin[0]); +#else + clientKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + SHA1_CTX ctx; + SHA1Init(&ctx); + SHA1Update(&ctx, (const unsigned char *)clientKey.c_str(), clientKey.length()); + SHA1Final(&sha1HashBin[0], &ctx); +#endif + + String key = base64_encode(sha1HashBin, 20); + key.trim(); + + return key; +} + +/** + * base64_encode + * @param data uint8_t * + * @param length size_t + * @return base64 encoded String + */ +String WebSockets::base64_encode(uint8_t * data, size_t length) { + size_t size = ((length * 1.6f) + 1); + char * buffer = (char *)malloc(size); + if(buffer) { + base64_encodestate _state; + base64_init_encodestate(&_state); + int len = base64_encode_block((const char *)&data[0], length, &buffer[0], &_state); + len = base64_encode_blockend((buffer + len), &_state); + + String base64 = String(buffer); + free(buffer); + return base64; + } + return String("-FAIL-"); +} + +/** + * read x byte from tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return true if ok + */ +bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) { + if(cb) { + cb(client, ok); + } + }, + client, std::placeholders::_1, cb)); + +#else + unsigned long t = millis(); + size_t len; + DEBUG_WEBSOCKETS("[readCb] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[readCb] tcp is null!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[readCb] not connected!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[readCb] receive TIMEOUT! %lu\n", (millis() - t)); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->available()) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + continue; + } + + len = client->tcp->read((uint8_t *)out, n); + if(len) { + t = millis(); + out += len; + n -= len; + //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } else { + //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + if(cb) { + cb(client, true); + } +#endif + return true; +} + +/** + * write x byte to tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return bytes send + */ +size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) { + if(out == NULL) + return 0; + if(client == NULL) + return 0; + unsigned long t = millis(); + size_t len = 0; + size_t total = 0; + DEBUG_WEBSOCKETS("[write] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[write] tcp is null!\n"); + break; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[write] not connected!\n"); + break; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[write] write TIMEOUT! %lu\n", (millis() - t)); + break; + } + + len = client->tcp->write((const uint8_t *)out, n); + if(len) { + t = millis(); + out += len; + n -= len; + total += len; + //DEBUG_WEBSOCKETS("write %d left %d!\n", len, n); + } else { + //DEBUG_WEBSOCKETS("write %d failed left %d!\n", len, n); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return total; +} + +size_t WebSockets::write(WSclient_t * client, const char * out) { + if(client == NULL) + return 0; + if(out == NULL) + return 0; + return write(client, (uint8_t *)out, strlen(out)); +} + +/** + * enable ping/pong heartbeat process + * @param client WSclient_t * + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + if(client == NULL) + return; + client->pingInterval = pingInterval; + client->pongTimeout = pongTimeout; + client->disconnectTimeoutCount = disconnectTimeoutCount; + client->pongReceived = false; +} + +/** + * handle ping/pong heartbeat timeout process + * @param client WSclient_t * + */ +void WebSockets::handleHBTimeout(WSclient_t * client) { + if(client->pingInterval) { // if heartbeat is enabled + uint32_t pi = millis() - client->lastPing; + + if(client->pongReceived) { + client->pongTimeoutCount = 0; + } else { + if(pi > client->pongTimeout) { // pong not received in time + client->pongTimeoutCount++; + client->lastPing = millis() - client->pingInterval - 500; // force ping on the next run + + DEBUG_WEBSOCKETS("[HBtimeout] pong TIMEOUT! lp=%d millis=%d pi=%d count=%d\n", client->lastPing, millis(), pi, client->pongTimeoutCount); + + if(client->disconnectTimeoutCount && client->pongTimeoutCount >= client->disconnectTimeoutCount) { + DEBUG_WEBSOCKETS("[HBtimeout] count=%d, DISCONNECTING\n", client->pongTimeoutCount); + clientDisconnect(client); + } + } + } + } +} diff --git a/src/WebSockets.h b/src/WebSockets.h new file mode 100644 index 00000000..d0813d30 --- /dev/null +++ b/src/WebSockets.h @@ -0,0 +1,331 @@ +/** + * @file WebSockets.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETS_H_ +#define WEBSOCKETS_H_ + +#ifdef STM32_DEVICE +#include +#define bit(b) (1UL << (b)) // Taken directly from Arduino.h +#else +#include +#include +#endif + +#ifdef ARDUINO_ARCH_AVR +#error Version 2.x.x currently does not support Arduino with AVR since there is no support for std namespace of c++. +#error Use Version 1.x.x. (ATmega branch) +#else +#include +#endif + +#ifndef NODEBUG_WEBSOCKETS +#ifdef DEBUG_ESP_PORT +#define DEBUG_WEBSOCKETS(...) DEBUG_ESP_PORT.printf(__VA_ARGS__) +#else +//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) +#endif +#endif + +#ifndef DEBUG_WEBSOCKETS +#define DEBUG_WEBSOCKETS(...) +#define NODEBUG_WEBSOCKETS +#endif + +#if defined(ESP8266) || defined(ESP32) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP ESP.getFreeHeap() +// moves all Header strings to Flash (~300 Byte) +//#define WEBSOCKETS_SAVE_RAM + +#elif defined(STM32_DEVICE) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP System.freeMemory() + +#else + +//atmega328p has only 2KB ram! +#define WEBSOCKETS_MAX_DATA_SIZE (1024) +// moves all Header strings to Flash +#define WEBSOCKETS_SAVE_RAM + +#endif + +#define WEBSOCKETS_TCP_TIMEOUT (2000) + +#define NETWORK_ESP8266_ASYNC (0) +#define NETWORK_ESP8266 (1) +#define NETWORK_W5100 (2) +#define NETWORK_ENC28J60 (3) +#define NETWORK_ESP32 (4) +#define NETWORK_ESP32_ETH (5) + +// max size of the WS Message Header +#define WEBSOCKETS_MAX_HEADER_SIZE (14) + +#if !defined(WEBSOCKETS_NETWORK_TYPE) +// select Network type based +#if defined(ESP8266) || defined(ESP31B) +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#elif defined(ESP32) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH +#else +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#endif +#endif + +// Includes and defined based on Network Type +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +// Note: +// No SSL/WSS support for client in Async mode +// TLS lib need a sync interface! + +#if defined(ESP8266) +#include +#elif defined(ESP32) +#include +#include +#elif defined(ESP31B) +#include +#else +#error "network type ESP8266 ASYNC only possible on the ESP mcu!" +#endif + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS AsyncTCPbuffer +#define WEBSOCKETS_NETWORK_SERVER_CLASS AsyncServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + +#if !defined(ESP8266) && !defined(ESP31B) +#error "network type ESP8266 only possible on the ESP mcu!" +#endif + +#ifdef ESP8266 +#include +#else +#include +#endif +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + +#ifdef STM32_DEVICE +#define WEBSOCKETS_NETWORK_CLASS TCPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS TCPServer +#else +#include +#include +#define WEBSOCKETS_NETWORK_CLASS EthernetClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer +#endif + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ENC28J60) + +#include +#define WEBSOCKETS_NETWORK_CLASS UIPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32_ETH) + +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#else +#error "no network type selected!" +#endif + +#ifdef WEBSOCKETS_NETWORK_SSL_CLASS +#define HAS_SSL +#endif + +// moves all Header strings to Flash (~300 Byte) +#ifdef WEBSOCKETS_SAVE_RAM +#define WEBSOCKETS_STRING(var) F(var) +#else +#define WEBSOCKETS_STRING(var) var +#endif + +typedef enum { + WSC_NOT_CONNECTED, + WSC_HEADER, + WSC_CONNECTED +} WSclientsStatus_t; + +typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + WStype_PING, + WStype_PONG, +} WStype_t; + +typedef enum { + WSop_continuation = 0x00, ///< %x0 denotes a continuation frame + WSop_text = 0x01, ///< %x1 denotes a text frame + WSop_binary = 0x02, ///< %x2 denotes a binary frame + ///< %x3-7 are reserved for further non-control frames + WSop_close = 0x08, ///< %x8 denotes a connection close + WSop_ping = 0x09, ///< %x9 denotes a ping + WSop_pong = 0x0A ///< %xA denotes a pong + ///< %xB-F are reserved for further control frames +} WSopcode_t; + +typedef struct { + bool fin; + bool rsv1; + bool rsv2; + bool rsv3; + + WSopcode_t opCode; + bool mask; + + size_t payloadLen; + + uint8_t * maskKey; +} WSMessageHeader_t; + +typedef struct { + uint8_t num; ///< connection number + + WSclientsStatus_t status; + + WEBSOCKETS_NETWORK_CLASS * tcp; + + bool isSocketIO; ///< client for socket.io server + +#if defined(HAS_SSL) + bool isSSL; ///< run in ssl mode + WEBSOCKETS_NETWORK_SSL_CLASS * ssl; +#endif + + String cUrl; ///< http url + uint16_t cCode; ///< http code + + bool cIsClient = false; ///< will be used for masking + bool cIsUpgrade; ///< Connection == Upgrade + bool cIsWebsocket; ///< Upgrade == websocket + + String cSessionId; ///< client Set-Cookie (session id) + String cKey; ///< client Sec-WebSocket-Key + String cAccept; ///< client Sec-WebSocket-Accept + String cProtocol; ///< client Sec-WebSocket-Protocol + String cExtensions; ///< client Sec-WebSocket-Extensions + uint16_t cVersion; ///< client Sec-WebSocket-Version + + uint8_t cWsRXsize; ///< State of the RX + uint8_t cWsHeader[WEBSOCKETS_MAX_HEADER_SIZE]; ///< RX WS Message buffer + WSMessageHeader_t cWsHeaderDecode; + + String base64Authorization; ///< Base64 encoded Auth request + String plainAuthorization; ///< Base64 encoded Auth request + + String extraHeaders; + + bool cHttpHeadersValid; ///< non-websocket http header validity indicator + size_t cMandatoryHeadersCount; ///< non-websocket mandatory http headers present count + + bool pongReceived; + uint32_t pingInterval; // how often ping will be sent, 0 means "heartbeat is not active" + uint32_t lastPing; // millis when last pong has been received + uint32_t pongTimeout; // interval in millis after which pong is considered to timeout + uint8_t disconnectTimeoutCount; // after how many subsequent pong timeouts discconnect will happen, 0 means "do not disconnect" + uint8_t pongTimeoutCount; // current pong timeout count + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + String cHttpLine; ///< HTTP header lines +#endif + +} WSclient_t; + +class WebSockets { + protected: +#ifdef __AVR__ + typedef void (*WSreadWaitCb)(WSclient_t * client, bool ok); +#else + typedef std::function WSreadWaitCb; +#endif + + virtual void clientDisconnect(WSclient_t * client) = 0; + virtual bool clientIsConnected(WSclient_t * client) = 0; + + void clientDisconnect(WSclient_t * client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); + + virtual void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) = 0; + + uint8_t createHeader(uint8_t * buf, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin); + bool sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length = 0, bool fin = true); + bool sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool fin = true, bool headerToPayload = false); + + void headerDone(WSclient_t * client); + + void handleWebsocket(WSclient_t * client); + + bool handleWebsocketWaitFor(WSclient_t * client, size_t size); + void handleWebsocketCb(WSclient_t * client); + void handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload); + + String acceptKey(String & clientKey); + String base64_encode(uint8_t * data, size_t length); + + bool readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb); + virtual size_t write(WSclient_t * client, uint8_t * out, size_t n); + size_t write(WSclient_t * client, const char * out); + + void enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void handleHBTimeout(WSclient_t * client); +}; + +#ifndef UNUSED +#define UNUSED(var) (void)(var) +#endif +#endif /* WEBSOCKETS_H_ */ diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp new file mode 100644 index 00000000..633e34c2 --- /dev/null +++ b/src/WebSocketsServer.cpp @@ -0,0 +1,852 @@ +/** + * @file WebSocketsServer.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" +#include "WebSocketsServer.h" + +WebSocketsServer::WebSocketsServer(uint16_t port, String origin, String protocol) { + _port = port; + _origin = origin; + _protocol = protocol; + _runnning = false; + + _server = new WEBSOCKETS_NETWORK_SERVER_CLASS(port); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->onClient([](void * s, AsyncClient * c) { + ((WebSocketsServer *)s)->newClient(new AsyncTCPbuffer(c)); + }, + this); +#endif + + _cbEvent = NULL; + + _httpHeaderValidationFunc = NULL; + _mandatoryHttpHeaders = NULL; + _mandatoryHttpHeaderCount = 0; + + memset(&_clients[0], 0x00, (sizeof(WSclient_t) * WEBSOCKETS_SERVER_CLIENT_MAX)); +} + +WebSocketsServer::~WebSocketsServer() { + // disconnect all clients + close(); + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = 0; +} + +/** + * called to initialize the Websocket server + */ +void WebSocketsServer::begin(void) { + WSclient_t * client; + + // init client storage + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + + client->num = i; + client->status = WSC_NOT_CONNECTED; + client->tcp = NULL; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + client->isSSL = false; + client->ssl = NULL; +#endif + client->cUrl = ""; + client->cCode = 0; + client->cKey = ""; + client->cProtocol = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + + client->base64Authorization = ""; + + client->cWsRXsize = 0; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; +#endif + } + +#ifdef ESP8266 + randomSeed(RANDOM_REG32); +#elif defined(ESP32) +#define DR_REG_RNG_BASE 0x3ff75144 + randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#else + // TODO find better seed + randomSeed(millis()); +#endif + + _runnning = true; + _server->begin(); + + DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); +} + +void WebSocketsServer::close(void) { + _runnning = false; + disconnect(); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + _server->close(); +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->end(); +#else + // TODO how to close server? +#endif +} + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * called in arduino loop + */ +void WebSocketsServer::loop(void) { + if(_runnning) { + handleNewClients(); + handleClientData(); + } +} +#endif + +/** + * set callback function + * @param cbEvent WebSocketServerEvent + */ +void WebSocketsServer::onEvent(WebSocketServerEvent cbEvent) { + _cbEvent = cbEvent; +} + +/* + * Sets the custom http header validator function + * @param httpHeaderValidationFunc WebSocketServerHttpHeaderValFunc ///< pointer to the custom http header validation function + * @param mandatoryHttpHeaders[] const char* ///< the array of named http headers considered to be mandatory / must be present in order for websocket upgrade to succeed + * @param mandatoryHttpHeaderCount size_t ///< the number of items in the mandatoryHttpHeaders array + */ +void WebSocketsServer::onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount) { + _httpHeaderValidationFunc = validationFunc; + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = mandatoryHttpHeaderCount; + _mandatoryHttpHeaders = new String[_mandatoryHttpHeaderCount]; + + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + _mandatoryHttpHeaders[i] = mandatoryHttpHeaders[i]; + } +} + +/* + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + if(length == 0) { + length = strlen((const char *)payload); + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_text, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsServer::sendTXT(uint8_t num, const uint8_t * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServer::sendTXT(uint8_t num, char * payload, size_t length, bool headerToPayload) { + return sendTXT(num, (uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServer::sendTXT(uint8_t num, const char * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServer::sendTXT(uint8_t num, String & payload) { + return sendTXT(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send text data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + if(length == 0) { + length = strlen((const char *)payload); + } + + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_text, payload, length, true, headerToPayload)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastTXT(const uint8_t * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServer::broadcastTXT(char * payload, size_t length, bool headerToPayload) { + return broadcastTXT((uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServer::broadcastTXT(const char * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServer::broadcastTXT(String & payload) { + return broadcastTXT((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send binary data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::sendBIN(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_binary, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsServer::sendBIN(uint8_t num, const uint8_t * payload, size_t length) { + return sendBIN(num, (uint8_t *)payload, length); +} + +/** + * send binary data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServer::broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_binary, payload, length, true, headerToPayload)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) { + return broadcastBIN((uint8_t *)payload, length); +} + +/** + * sends a WS ping to Client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::sendPing(uint8_t num, uint8_t * payload, size_t length) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_ping, payload, length); + } + return false; +} + +bool WebSocketsServer::sendPing(uint8_t num, String & payload) { + return sendPing(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * sends a WS ping to all Client + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::broadcastPing(uint8_t * payload, size_t length) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_ping, payload, length)) { + ret = false; + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastPing(String & payload) { + return broadcastPing((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * disconnect all clients + */ +void WebSocketsServer::disconnect(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } + } +} + +/** + * disconnect one client + * @param num uint8_t client id + */ +void WebSocketsServer::disconnect(uint8_t num) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } +} + +/* + * set the Authorization for the http request + * @param user const char * + * @param password const char * + */ +void WebSocketsServer::setAuthorization(const char * user, const char * password) { + if(user && password) { + String auth = user; + auth += ":"; + auth += password; + _base64Authorization = base64_encode((uint8_t *)auth.c_str(), auth.length()); + } +} + +/** + * set the Authorizatio for the http request + * @param auth const char * base64 + */ +void WebSocketsServer::setAuthorization(const char * auth) { + if(auth) { + _base64Authorization = auth; + } +} + +/** + * count the connected clients (optional ping them) + * @param ping bool ping the connected clients + */ +int WebSocketsServer::connectedClients(bool ping) { + WSclient_t * client; + int count = 0; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(client->status == WSC_CONNECTED) { + if(ping != true || sendPing(i)) { + count++; + } + } + } + return count; +} + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +/** + * get an IP for a client + * @param num uint8_t client id + * @return IPAddress + */ +IPAddress WebSocketsServer::remoteIP(uint8_t num) { + if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return client->tcp->remoteIP(); + } + } + + return IPAddress(); +} +#endif + +//################################################################################# +//################################################################################# +//################################################################################# + +/** + * handle new client connection + * @param client + */ +bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) { + WSclient_t * client; + // search free list entry for client + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + + // state is not connected or tcp connection is lost + if(!clientIsConnected(client)) { + client->tcp = TCPclient; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + client->isSSL = false; + client->tcp->setNoDelay(true); +#endif +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + client->status = WSC_HEADER; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress ip = client->tcp->remoteIP(); + DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->onDisconnect(std::bind([](WebSocketsServer * server, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + + AsyncTCPbuffer ** sl = &server->_clients[client->num].tcp; + if(*sl == obj) { + client->status = WSC_NOT_CONNECTED; + *sl = NULL; + } + return true; + }, + this, std::placeholders::_1, client)); + + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine))); +#endif + + return true; + break; + } + } + return false; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * + * @param length size_t + */ +void WebSocketsServer::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) { + WStype_t type = WStype_ERROR; + + switch(opcode) { + case WSop_text: + type = fin ? WStype_TEXT : WStype_FRAGMENT_TEXT_START; + break; + case WSop_binary: + type = fin ? WStype_BIN : WStype_FRAGMENT_BIN_START; + break; + case WSop_continuation: + type = fin ? WStype_FRAGMENT_FIN : WStype_FRAGMENT; + break; + case WSop_ping: + type = WStype_PING; + break; + case WSop_pong: + type = WStype_PONG; + break; + case WSop_close: + default: + break; + } + + runCbEvent(client->num, type, payload, length); +} + +/** + * Disconnect an client + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsServer::clientDisconnect(WSclient_t * client) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + if(client->isSSL && client->ssl) { + if(client->ssl->connected()) { + client->ssl->flush(); + client->ssl->stop(); + } + delete client->ssl; + client->ssl = NULL; + client->tcp = NULL; + } +#endif + + if(client->tcp) { + if(client->tcp->connected()) { +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + client->tcp->flush(); +#endif + client->tcp->stop(); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->status = WSC_NOT_CONNECTED; +#else + delete client->tcp; +#endif + client->tcp = NULL; + } + + client->cUrl = ""; + client->cKey = ""; + client->cProtocol = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + + client->cWsRXsize = 0; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; +#endif + + client->status = WSC_NOT_CONNECTED; + + DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); + + runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); +} + +/** + * get client state + * @param client WSclient_t * ptr to the client struct + * @return true = connected + */ +bool WebSocketsServer::clientIsConnected(WSclient_t * client) { + if(!client->tcp) { + return false; + } + + if(client->tcp->connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + // do cleanup + clientDisconnect(client); + } + } + + if(client->tcp) { + // do cleanup + DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num); + clientDisconnect(client); + } + + return false; +} +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * Handle incoming Connection Request + */ +void WebSocketsServer::handleNewClients(void) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + while(_server->hasClient()) { +#endif + bool ok = false; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + // store new connection + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); +#else + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); +#endif + + if(!tcpClient) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + return; + } + + ok = newClient(tcpClient); + + if(!ok) { + // no free space to handle client +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress ip = tcpClient->remoteIP(); + DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); +#endif + tcpClient->stop(); + } + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + delay(0); + } +#endif +} + +/** + * Handel incomming data from Client + */ +void WebSocketsServer::handleClientData(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + int len = client->tcp->available(); + if(len > 0) { + //DEBUG_WEBSOCKETS("[WS-Server][%d][handleClientData] len: %d\n", client->num, len); + switch(client->status) { + case WSC_HEADER: { + String headerLine = client->tcp->readStringUntil('\n'); + handleHeader(client, &headerLine); + } break; + case WSC_CONNECTED: + WebSockets::handleWebsocket(client); + break; + default: + WebSockets::clientDisconnect(client, 1002); + break; + } + } + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } +} +#endif + +/* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ +bool WebSocketsServer::hasMandatoryHeader(String headerName) { + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + if(_mandatoryHttpHeaders[i].equalsIgnoreCase(headerName)) + return true; + } + return false; +} + +/** + * handles http header reading for WebSocket upgrade + * @param client WSclient_t * ///< pointer to the client struct + * @param headerLine String ///< the header being read / processed + */ +void WebSocketsServer::handleHeader(WSclient_t * client, String * headerLine) { + static const char * NEW_LINE = "\r\n"; + + headerLine->trim(); // remove \r + + if(headerLine->length() > 0) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine->c_str()); + + // websocket requests always start with GET see rfc6455 + if(headerLine->startsWith("GET ")) { + // cut URL out + client->cUrl = headerLine->substring(4, headerLine->indexOf(' ', 4)); + + //reset non-websocket http header validation state for this client + client->cHttpHeadersValid = true; + client->cMandatoryHeadersCount = 0; + + } else if(headerLine->indexOf(':') >= 0) { + String headerName = headerLine->substring(0, headerLine->indexOf(':')); + String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); + + // remove space in the beginning (RFC2616) + if(headerValue[0] == ' ') { + headerValue.remove(0, 1); + } + + if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { + headerValue.toLowerCase(); + if(headerValue.indexOf(WEBSOCKETS_STRING("upgrade")) >= 0) { + client->cIsUpgrade = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { + client->cIsWebsocket = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { + client->cVersion = headerValue.toInt(); + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Key"))) { + client->cKey = headerValue; + client->cKey.trim(); // see rfc6455 + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { + client->cProtocol = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { + client->cExtensions = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Authorization"))) { + client->base64Authorization = headerValue; + } else { + client->cHttpHeadersValid &= execHttpHeaderValidation(headerName, headerValue); + if(_mandatoryHttpHeaderCount > 0 && hasMandatoryHeader(headerName)) { + client->cMandatoryHeadersCount++; + } + } + + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); + } + + (*headerLine) = ""; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine))); +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - base64Authorization: %s\n", client->num, client->base64Authorization.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cHttpHeadersValid: %d\n", client->num, client->cHttpHeadersValid); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cMandatoryHeadersCount: %d\n", client->num, client->cMandatoryHeadersCount); + + bool ok = (client->cIsUpgrade && client->cIsWebsocket); + + if(ok) { + if(client->cUrl.length() == 0) { + ok = false; + } + if(client->cKey.length() == 0) { + ok = false; + } + if(client->cVersion != 13) { + ok = false; + } + if(!client->cHttpHeadersValid) { + ok = false; + } + if(client->cMandatoryHeadersCount != _mandatoryHttpHeaderCount) { + ok = false; + } + } + + if(_base64Authorization.length() > 0) { + String auth = WEBSOCKETS_STRING("Basic "); + auth += _base64Authorization; + if(auth != client->base64Authorization) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] HTTP Authorization failed!\n", client->num); + handleAuthorizationFailed(client); + return; + } + } + + if(ok) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incoming.\n", client->num); + + // generate Sec-WebSocket-Accept key + String sKey = acceptKey(client->cKey); + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); + + client->status = WSC_CONNECTED; + + String handshake = WEBSOCKETS_STRING( + "HTTP/1.1 101 Switching Protocols\r\n" + "Server: arduino-WebSocketsServer\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Accept: "); + handshake += sKey + NEW_LINE; + + if(_origin.length() > 0) { + handshake += WEBSOCKETS_STRING("Access-Control-Allow-Origin: "); + handshake += _origin + NEW_LINE; + } + + if(client->cProtocol.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Protocol: "); + handshake += _protocol + NEW_LINE; + } + + // header end + handshake += NEW_LINE; + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] handshake %s", client->num, (uint8_t *)handshake.c_str()); + + write(client, (uint8_t *)handshake.c_str(), handshake.length()); + + headerDone(client); + + // send ping + WebSockets::sendFrame(client, WSop_ping); + + runCbEvent(client->num, WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length()); + + } else { + handleNonWebsocketConnection(client); + } + } +} diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h new file mode 100644 index 00000000..a517da64 --- /dev/null +++ b/src/WebSocketsServer.h @@ -0,0 +1,206 @@ +/** + * @file WebSocketsServer.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSSERVER_H_ +#define WEBSOCKETSSERVER_H_ + +#include "WebSockets.h" + +#ifndef WEBSOCKETS_SERVER_CLIENT_MAX +#define WEBSOCKETS_SERVER_CLIENT_MAX (2) +#endif + +class WebSocketsServer : protected WebSockets { + public: +#ifdef __AVR__ + typedef void (*WebSocketServerEvent)(uint8_t num, WStype_t type, uint8_t * payload, size_t length); + typedef bool (*WebSocketServerHttpHeaderValFunc)(String headerName, String headerValue); +#else + typedef std::function WebSocketServerEvent; + typedef std::function WebSocketServerHttpHeaderValFunc; +#endif + + WebSocketsServer(uint16_t port, String origin = "", String protocol = "arduino"); + virtual ~WebSocketsServer(void); + + void begin(void); + void close(void); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); +#else + // Async interface not need a loop call + void loop(void) __attribute__((deprecated)) {} +#endif + + void onEvent(WebSocketServerEvent cbEvent); + void onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount); + + bool sendTXT(uint8_t num, uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const uint8_t * payload, size_t length = 0); + bool sendTXT(uint8_t num, char * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const char * payload, size_t length = 0); + bool sendTXT(uint8_t num, String & payload); + + bool broadcastTXT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const uint8_t * payload, size_t length = 0); + bool broadcastTXT(char * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const char * payload, size_t length = 0); + bool broadcastTXT(String & payload); + + bool sendBIN(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload = false); + bool sendBIN(uint8_t num, const uint8_t * payload, size_t length); + + bool broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload = false); + bool broadcastBIN(const uint8_t * payload, size_t length); + + bool sendPing(uint8_t num, uint8_t * payload = NULL, size_t length = 0); + bool sendPing(uint8_t num, String & payload); + + bool broadcastPing(uint8_t * payload = NULL, size_t length = 0); + bool broadcastPing(String & payload); + + void disconnect(void); + void disconnect(uint8_t num); + + void setAuthorization(const char * user, const char * password); + void setAuthorization(const char * auth); + + int connectedClients(bool ping = false); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress remoteIP(uint8_t num); +#endif + + protected: + uint16_t _port; + String _origin; + String _protocol; + String _base64Authorization; ///< Base64 encoded Auth request + String * _mandatoryHttpHeaders; + size_t _mandatoryHttpHeaderCount; + + WEBSOCKETS_NETWORK_SERVER_CLASS * _server; + + WSclient_t _clients[WEBSOCKETS_SERVER_CLIENT_MAX]; + + WebSocketServerEvent _cbEvent; + WebSocketServerHttpHeaderValFunc _httpHeaderValidationFunc; + + bool _runnning; + + bool newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient); + + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin); + + void clientDisconnect(WSclient_t * client); + bool clientIsConnected(WSclient_t * client); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleNewClients(void); + void handleClientData(void); +#endif + + void handleHeader(WSclient_t * client, String * headerLine); + + /** + * called if a non Websocket connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleNonWebsocketConnection(WSclient_t * client) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); + client->tcp->write( + "HTTP/1.1 400 Bad Request\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 32\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "\r\n" + "This is a Websocket server only!"); + clientDisconnect(client); + } + + /** + * called if a non Authorization connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleAuthorizationFailed(WSclient_t * client) { + client->tcp->write( + "HTTP/1.1 401 Unauthorized\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 45\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "WWW-Authenticate: Basic realm=\"WebSocket Server\"" + "\r\n" + "This Websocket server requires Authorization!"); + clientDisconnect(client); + } + + /** + * called for sending a Event to the app + * @param num uint8_t + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ + virtual void runCbEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(num, type, payload, length); + } + } + + /* + * Called at client socket connect handshake negotiation time for each http header that is not + * a websocket specific http header (not Connection, Upgrade, Sec-WebSocket-*) + * If the custom httpHeaderValidationFunc returns false for any headerName / headerValue passed, the + * socket negotiation is considered invalid and the upgrade to websockets request is denied / rejected + * This mechanism can be used to enable custom authentication schemes e.g. test the value + * of a session cookie to determine if a user is logged on / authenticated + */ + virtual bool execHttpHeaderValidation(String headerName, String headerValue) { + if(_httpHeaderValidationFunc) { + //return the value of the custom http header validation function + return _httpHeaderValidationFunc(headerName, headerValue); + } + //no custom http header validation so just assume all is good + return true; + } + + private: + /* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ + bool hasMandatoryHeader(String headerName); +}; + +#endif /* WEBSOCKETSSERVER_H_ */ diff --git a/src/si5351mcu.cpp b/src/si5351mcu.cpp new file mode 100644 index 00000000..44fe98c4 --- /dev/null +++ b/src/si5351mcu.cpp @@ -0,0 +1,301 @@ +/* + * si5351mcu - Si5351 library for Arduino MCU tuned for size and click-less + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "Arduino.h" +#include "si5351mcu.h" + +// wire library loading, if not defined +#ifndef WIRE_H + #include "Wire.h" +#endif + +/***************************************************************************** + * This is the default init procedure, it set the Si5351 with this params: + * XTAL 27.000 Mhz + *****************************************************************************/ + void Si5351mcu::init() { + // init with the default freq + init(int_xtal); +} + + +/***************************************************************************** + * This is the custom init procedure, it's used to pass a custom xtal + * and has the duty of init the I2C protocol handshake + *****************************************************************************/ + void Si5351mcu::init(uint32_t nxtal) { + // set the new base xtal freq + base_xtal = int_xtal = nxtal; + + // start I2C (wire) procedures + Wire.begin(); + + // power off all the outputs + off(); +} + + +/***************************************************************************** + * This function set the freq of the corresponding clock. + * + * In my tests my Si5351 can work between 7,8 Khz and ~225 Mhz [~250 MHz with + * overclocking] as usual YMMV + * + * Click noise: + * - The lib has a reset programmed [aka: click noise] every time it needs to + * change the output divider of a particular MSynth, if you move in big steps + * this can lead to an increased rate of click noise per tunning step. + * - If you move at a pace of a few Hz each time the output divider will + * change at a low rate, hence less click noise per tunning step. + * - The output divider moves [change] faster at high frequencies, so at HF the + * clikc noise is at the real minimum possible. + * + * [See the README.md file for other details] + ****************************************************************************/ +void Si5351mcu::setFreq(uint8_t clk, uint32_t freq) { + uint8_t a, R = 1, shifts = 0; + uint32_t b, c, f, fvco, outdivider; + uint32_t MSx_P1, MSNx_P1, MSNx_P2, MSNx_P3; + + // Overclock option + #ifdef SI_OVERCLOCK + // user a overclock setting for the VCO, max value in my hardware + // was 1.05 to 1.1 GHz, as usual YMMV [See README.md for details] + outdivider = SI_OVERCLOCK / freq; + #else + // normal VCO from the datasheet and AN + // With 900 MHz beeing the maximum internal PLL-Frequency + outdivider = 900000000 / freq; + #endif + + // use additional Output divider ("R") + while (outdivider > 900) { + R = R * 2; + outdivider = outdivider / 2; + } + + // finds the even divider which delivers the intended Frequency + if (outdivider % 2) outdivider--; + + // Calculate the PLL-Frequency (given the even divider) + fvco = outdivider * R * freq; + + // Convert the Output Divider to the bit-setting required in register 44 + switch (R) { + case 1: R = 0; break; + case 2: R = 16; break; + case 4: R = 32; break; + case 8: R = 48; break; + case 16: R = 64; break; + case 32: R = 80; break; + case 64: R = 96; break; + case 128: R = 112; break; + } + + // we have now the integer part of the output msynth + // the b & c is fixed below + MSx_P1 = 128 * outdivider - 512; + + // calc the a/b/c for the PLL Msynth + /*************************************************************************** + * We will use integer only on the b/c relation, and will >> 5 (/32) both + * to fit it on the 1048 k limit of C and keep the relation + * the most accurate possible, this works fine with xtals from + * 24 to 28 Mhz. + * + * This will give errors of about +/- 2 Hz maximum + * as per my test and simulations in the worst case, well below the + * XTAl ppm error... + * + * This will free more than 1K of the final eeprom + * + ****************************************************************************/ + a = fvco / int_xtal; + b = (fvco % int_xtal) >> 5; // Integer par of the fraction + // scaled to match "c" limits + c = int_xtal >> 5; // "c" scaled to match it's limits + // in the register + + // f is (128*b)/c to mimic the Floor(128*(b/c)) from the datasheet + f = (128 * b) / c; + + // build the registers to write + MSNx_P1 = 128 * a + f - 512; + MSNx_P2 = 128 * b - f * c; + MSNx_P3 = c; + + // PLLs and CLK# registers are allocated with a shift, we handle that with + // the shifts var to make code smaller + if (clk > 0 ) shifts = 8; + + // plls, A & B registers separated by 8 bytes + i2cWrite(26 + shifts, (MSNx_P3 & 65280) >> 8); // Bits [15:8] of MSNx_P3 in register 26 + i2cWrite(27 + shifts, MSNx_P3 & 255); + i2cWrite(28 + shifts, (MSNx_P1 & 196608) >> 16); + i2cWrite(29 + shifts, (MSNx_P1 & 65280) >> 8); // Bits [15:8] of MSNx_P1 in register 29 + i2cWrite(30 + shifts, MSNx_P1 & 255); // Bits [7:0] of MSNx_P1 in register 30 + i2cWrite(31 + shifts, ((MSNx_P3 & 983040) >> 12) | ((MSNx_P2 & 983040) >> 16)); // Parts of MSNx_P3 and MSNx_P1 + i2cWrite(32 + shifts, (MSNx_P2 & 65280) >> 8); // Bits [15:8] of MSNx_P2 in register 32 + i2cWrite(33 + shifts, MSNx_P2 & 255); // Bits [7:0] of MSNx_P2 in register 33 + + // Write the output divider msynth only if we need to, in this way we can + // speed up the frequency changes almost by half the time most of the time + // and the main goal is to avoid the nasty click noise on freq change + if (omsynth[clk] != outdivider) { + // CLK# registers are exactly 8 * clk# bytes shifted from a base register. + shifts = clk * 8; + + // multisynths + i2cWrite(42 + shifts, 0); // Bits [15:8] of MS0_P3 (always 0) in register 42 + i2cWrite(43 + shifts, 1); // Bits [7:0] of MS0_P3 (always 1) in register 43 + // See datasheet, special trick when R=4 + if (outdivider == 4) { + i2cWrite(44 + shifts, 12 | R); + i2cWrite(45 + shifts, 0); // Bits [15:8] of MSx_P1 must be 0 + i2cWrite(46 + shifts, 0); // Bits [7:0] of MSx_P1 must be 0 + } else { + i2cWrite(44 + shifts, ((MSx_P1 & 196608) >> 16) | R); // Bits [17:16] of MSx_P1 in bits [1:0] and R in [7:4] + i2cWrite(45 + shifts, (MSx_P1 & 65280) >> 8); // Bits [15:8] of MSx_P1 in register 45 + i2cWrite(46 + shifts, MSx_P1 & 255); // Bits [7:0] of MSx_P1 in register 46 + } + i2cWrite(47 + shifts, 0); // Bits [19:16] of MS0_P2 and MS0_P3 are always 0 + i2cWrite(48 + shifts, 0); // Bits [15:8] of MS0_P2 are always 0 + i2cWrite(49 + shifts, 0); // Bits [7:0] of MS0_P2 are always 0 + + // must reset the so called "PLL", in fact the output msynth + reset(); + + // keep track of the change + omsynth[clk] = (uint16_t)outdivider; + } +} + + +/***************************************************************************** + * Reset of the PLLs and multisynths output enable + * + * This must be called to soft reset the PLLs and cycle the output of the + * multisynths: this is the "click" noise source in the RF spectrum. + * + * So it must be avoided at all costs, so this lib just call it at the + * initialization of the PLLs and when a correction is applied + * + * If you are concerned with accuracy you can implement a reset every + * other Mhz to be sure it get exactly on spot. + ****************************************************************************/ +void Si5351mcu::reset(void) { + // This soft-resets PLL A & B (32 + 128) in just one step + i2cWrite(177, 0xA0); +} + + +/***************************************************************************** + * Function to disable all outputs + * + * The PLL are kept running, just the m-synths are powered off. + * + * This allows to keep the chip warm and exactly on freq the next time you + * enable an output. + ****************************************************************************/ +void Si5351mcu::off() { + // This disable all the CLK outputs + for (byte i=0; i<3; i++) disable(i); +} + + +/***************************************************************************** + * Function to set the correction in Hz over the Si5351 XTAL. + * + * This will call a reset of the PLLs and multi-synths so it will produce a + * click every time it's called + ****************************************************************************/ +void Si5351mcu::correction(int32_t diff) { + // apply some corrections to the xtal + int_xtal = base_xtal + diff; + + // reset the PLLs to apply the correction + reset(); +} + + +/***************************************************************************** + * This function enables the selected output + * + * Beware: ZERO is clock output enabled + *****************************************************************************/ +void Si5351mcu::enable(uint8_t clk) { + // var to handle the mask of the registers value + uint8_t m = SICLK0_R; + if (clk > 0) m = SICLK12_R; + + // write the register value + i2cWrite(16 + clk, m + clkpower[clk]); + + // 1 & 2 are mutually exclusive + if (clk == 1) disable(2); + if (clk == 2) disable(1); + + // update the status of the clk + clkOn[clk] = 1; +} + + +/***************************************************************************** + * This function disables the selected output + * + * Beware: ONE is clock output disabled + * *****************************************************************************/ +void Si5351mcu::disable(uint8_t clk) { + // send + i2cWrite(16 + clk, 128); + + // update the status of the clk + clkOn[clk] = 0; +} + + +/**************************************************************************** + * Set the power output for each output independently + ***************************************************************************/ +void Si5351mcu::setPower(byte clk, byte power) { + // set the power to the correct var + clkpower[clk] = power; + + // now enable the output to get it applied + enable(clk); +} + + +/**************************************************************************** + * Private function to send the register data to the Si5351, arduino way. + ***************************************************************************/ +void Si5351mcu::i2cWrite(byte regist, byte value){ + Wire.beginTransmission(SIADDR); + Wire.write(regist); + Wire.write(value); + Wire.endTransmission(); +} diff --git a/src/si5351mcu.h b/src/si5351mcu.h new file mode 100644 index 00000000..b5789c2b --- /dev/null +++ b/src/si5351mcu.h @@ -0,0 +1,141 @@ +/* + * si5351mcu - Si5351 library for Arduino MCU tuned for size and click-less + * + * Copyright (C) 2017 Pavel Milanes + * + * Many chunk of codes are derived-from/copied from other libs + * all GNU GPL licenced: + * - Linux Kernel (www.kernel.org) + * - Hans Summers libs and demo code (qrp-labs.com) + * - Etherkit (NT7S) Si5351 libs on github + * - DK7IH example. + * - Jerry Gaffke integer routines for the bitx20 group + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/**************************************************************************** + * This lib tricks: + * + * CLK0 will use PLLA + * CLK1 will use PLLB + * CLK2 will use PLLB + * + * Lib defaults + * - XTAL is 27 Mhz. + * - Always put the internal 8pF across the xtal legs to GND + * - lowest power output (2mA) + * - After the init all outputs are off, you need to enable them in your code. + * + * The correction procedure is not for the PPM as other libs, this + * is just +/- Hz to the XTAL freq, you may get a click noise after + * applying a correction + * + * The init procedure is mandatory as it set the Xtal (the default or a custom + * one) and prepare the Wire (I2C) library for operation. + ****************************************************************************/ + +#ifndef SI5351MCU_H +#define SI5351MCU_H + +// rigor includes +#include "Arduino.h" +#include "Wire.h" + +// default I2C address of the Si5351 +#define SIADDR 0x60 + +// register's power modifiers +#define SIOUT_2mA 0 +#define SIOUT_4mA 1 +#define SIOUT_6mA 2 +#define SIOUT_8mA 3 + +// registers base (2mA by default) +#define SICLK0_R 76 // 0b1001100 +#define SICLK12_R 108 // 0b1101100 + + +class Si5351mcu { + public: + // default init procedure + void init(void); + + // custom init procedure (XTAL in Hz); + void init(uint32_t); + + // reset all PLLs + void reset(void); + + // set CLKx(0..2) to freq (Hz) + void setFreq(uint8_t, uint32_t); + + // pass a correction factor + void correction(int32_t); + + // enable some CLKx output + void enable(uint8_t); + + // disable some CLKx output + void disable(uint8_t); + + // disable all outputs + void off(void); + + // set power output to a specific clk + void setPower(uint8_t, uint8_t); + + // var to check the clock state + bool clkOn[3] = {0, 0, 0}; + + + private: + // used to talk with the chip, via Arduino Wire lib + void i2cWrite(uint8_t, uint8_t); + + // base xtal freq, over this we apply the correction factor + // by default 27 MHz + uint32_t base_xtal = 27000000L; + + // this is the work value, with the correction applied + // via the correction() procedure + uint32_t int_xtal = base_xtal; + + // clk# power holders (2ma by default) + uint8_t clkpower[3] = {0, 0, 0}; + + // local var to keep track of when to reset the "pll" + /********************************************************* + * BAD CONCEPT on the datasheet and AN: + * + * The chip has a soft-reset for PLL A & B but in + * practice the PLL does not need to be reseted. + * + * Test shows that if you fix the Msynth output + * dividers and move any of the VCO from bottom to top + * the frequency moves smooth and clean, no reset needed + * + * The reset is needed when you changes the value of the + * Msynth output divider, even so it's not always needed + * so we use this var to keep track of all three and only + * reset the "PLL" when this value changes to be sure + * + * It's a word (16 bit) because the final max value is 900 + *********************************************************/ + uint16_t omsynth[3] = {0, 0, 0}; +}; + + +#endif //SI5351MCU_H diff --git a/tv5725.h b/tv5725.h new file mode 100644 index 00000000..f2a1a4d1 --- /dev/null +++ b/tv5725.h @@ -0,0 +1,806 @@ +#ifndef TV5725_H_ +#define TV5725_H_ + +#include "tw.h" + +#define GBS_ADDR 0x17 // 7 bit GBS I2C Address + +namespace detail { +struct TVAttrs { + // Segment register at 0xf0, no bit offset, 8 bits, initial value assumed invalid + static const uint8_t SegByteOffset = 0xf0; + static const uint8_t SegBitOffset = 0; + static const uint8_t SegBitWidth = 8; + static const uint8_t SegInitial = 0xff; +}; +} + +template +class TV5725 : public tw::SegmentedSlave { + private: + // Stupid template boilerplate + typedef tw::SegmentedSlave Base; + using typename Base::SegValue; + template + using Register = typename Base::template Register; + template + using UReg = Register; + + public: + // STATUS Registers + // Arbitary names for STATUS_IF register + typedef UReg<0x00, 0x00, 0, 8> STATUS_00; // whole register for convenience + typedef UReg<0x00, 0x00, 0, 1> STATUS_IF_VT_OK; + typedef UReg<0x00, 0x00, 1, 1> STATUS_IF_HT_OK; + typedef UReg<0x00, 0x00, 2, 1> STATUS_IF_HVT_OK; + typedef UReg<0x00, 0x00, 3, 1> STATUS_IF_INP_NTSC_INT; + typedef UReg<0x00, 0x00, 4, 1> STATUS_IF_INP_NTSC_PRG; + typedef UReg<0x00, 0x00, 5, 1> STATUS_IF_INP_PAL_INT; + typedef UReg<0x00, 0x00, 6, 1> STATUS_IF_INP_PAL_PRG; + typedef UReg<0x00, 0x00, 7, 1> STATUS_IF_INP_SD; + typedef UReg<0x00, 0x01, 0, 1> STATUS_IF_INP_VGA60; + typedef UReg<0x00, 0x01, 1, 1> STATUS_IF_INP_VGA75; + typedef UReg<0x00, 0x01, 2, 1> STATUS_IF_INP_VGA86; + typedef UReg<0x00, 0x01, 3, 1> STATUS_IF_INP_VGA; + typedef UReg<0x00, 0x01, 4, 1> STATUS_IF_INP_SVGA60; + typedef UReg<0x00, 0x01, 5, 1> STATUS_IF_INP_SVGA75; + typedef UReg<0x00, 0x01, 6, 1> STATUS_IF_INP_SVGA85; + typedef UReg<0x00, 0x01, 7, 1> STATUS_IF_INP_SVGA; + typedef UReg<0x00, 0x02, 0, 1> STATUS_IF_INP_XGA60; + typedef UReg<0x00, 0x02, 1, 1> STATUS_IF_INP_XGA70; + typedef UReg<0x00, 0x02, 2, 1> STATUS_IF_INP_XGA75; + typedef UReg<0x00, 0x02, 3, 1> STATUS_IF_INP_XGA85; + typedef UReg<0x00, 0x02, 4, 1> STATUS_IF_INP_XGA; + typedef UReg<0x00, 0x02, 5, 1> STATUS_IF_INP_SXGA60; + typedef UReg<0x00, 0x02, 6, 1> STATUS_IF_INP_SXGA75; + typedef UReg<0x00, 0x02, 7, 1> STATUS_IF_INP_SXGA85; + typedef UReg<0x00, 0x03, 0, 8> STATUS_03; // whole register for convenience + typedef UReg<0x00, 0x03, 0, 1> STATUS_IF_INP_SXGA; + typedef UReg<0x00, 0x03, 1, 1> STATUS_IF_INP_PC; + typedef UReg<0x00, 0x03, 2, 1> STATUS_IF_INP_720P50; + typedef UReg<0x00, 0x03, 3, 1> STATUS_IF_INP_720P60; + typedef UReg<0x00, 0x03, 4, 1> STATUS_IF_INP_720; + typedef UReg<0x00, 0x03, 5, 1> STATUS_IF_INP_2200_1125I; + typedef UReg<0x00, 0x03, 6, 1> STATUS_IF_INP_2376_1250I; + typedef UReg<0x00, 0x03, 7, 1> STATUS_IF_INP_2640_1125I; + typedef UReg<0x00, 0x04, 0, 8> STATUS_04; // whole register for convenience + typedef UReg<0x00, 0x04, 0, 1> STATUS_IF_INP_1080I; + typedef UReg<0x00, 0x04, 1, 1> STATUS_IF_INP_2200_1125P; + typedef UReg<0x00, 0x04, 2, 1> STATUS_IF_INP_2376_1250P; + typedef UReg<0x00, 0x04, 3, 1> STATUS_IF_INP_2640_1125P; + typedef UReg<0x00, 0x04, 4, 1> STATUS_IF_INP_1808P; + typedef UReg<0x00, 0x04, 5, 1> STATUS_IF_INP_HD; + typedef UReg<0x00, 0x04, 6, 1> STATUS_IF_INP_INT; + typedef UReg<0x00, 0x04, 7, 1> STATUS_IF_INP_PRG; + typedef UReg<0x00, 0x05, 0, 8> STATUS_05; // whole register for convenience + typedef UReg<0x00, 0x05, 0, 1> STATUS_IF_INP_USER; + typedef UReg<0x00, 0x05, 1, 1> STATUS_IF_NO_SYNC; + typedef UReg<0x00, 0x05, 2, 1> STATUS_IF_HT_BAD; + typedef UReg<0x00, 0x05, 3, 1> STATUS_IF_VT_BAD; + typedef UReg<0x00, 0x05, 4, 1> STATUS_IF_INP_SW; + + typedef UReg<0x00, 0x06, 0, 9> HPERIOD_IF; + typedef UReg<0x00, 0x07, 1, 11> VPERIOD_IF; + + typedef UReg<0x00, 0x09, 6, 1> STATUS_MISC_PLL648_LOCK; + typedef UReg<0x00, 0x09, 7, 1> STATUS_MISC_PLLAD_LOCK; + typedef UReg<0x00, 0x0A, 0, 1> STATUS_MISC_PIP_EN_V; + typedef UReg<0x00, 0x0A, 1, 1> STATUS_MISC_PIP_EN_H; + typedef UReg<0x00, 0x0A, 4, 1> STATUS_MISC_VBLK; + typedef UReg<0x00, 0x0A, 5, 1> STATUS_MISC_HBLK; + typedef UReg<0x00, 0x0A, 6, 1> STATUS_MISC_VSYNC; + typedef UReg<0x00, 0x0A, 7, 1> STATUS_MISC_HSYNC; + + typedef UReg<0x00, 0x0B, 0, 8> CHIP_ID_FOUNDRY; + typedef UReg<0x00, 0x0C, 0, 8> CHIP_ID_PRODUCT; + typedef UReg<0x00, 0x0D, 0, 8> CHIP_ID_REVISION; + + typedef UReg<0x00, 0x0E, 0, 1> STATUS_GPIO_GPIO; + typedef UReg<0x00, 0x0E, 1, 1> STATUS_GPIO_HALF; + typedef UReg<0x00, 0x0E, 2, 1> STATUS_GPIO_SCLSA; + typedef UReg<0x00, 0x0E, 3, 1> STATUS_GPIO_MBA; + typedef UReg<0x00, 0x0E, 4, 1> STATUS_GPIO_MCS1; + typedef UReg<0x00, 0x0E, 5, 1> STATUS_GPIO_HBOUT; + typedef UReg<0x00, 0x0E, 6, 1> STATUS_GPIO_VBOUT; + typedef UReg<0x00, 0x0E, 7, 1> STATUS_GPIO_CLKOUT; + + typedef UReg<0x00, 0x0F, 0, 8> STATUS_0F; // whole register for convenience + typedef UReg<0x00, 0x0F, 0, 1> STATUS_INT_SOG_BAD; + typedef UReg<0x00, 0x0F, 1, 1> STATUS_INT_SOG_SW; + typedef UReg<0x00, 0x0F, 2, 1> STATUS_INT_SOG_OK; + typedef UReg<0x00, 0x0F, 3, 1> STATUS_INT_INP_SW; + typedef UReg<0x00, 0x0F, 4, 1> STATUS_INT_INP_NO_SYNC; + typedef UReg<0x00, 0x0F, 5, 1> STATUS_INT_INP_HSYNC; + typedef UReg<0x00, 0x0F, 6, 1> STATUS_INT_INP_VSYNC; + typedef UReg<0x00, 0x0F, 7, 1> STATUS_INT_INP_CSYNC; //Needs confirmation + + typedef UReg<0x00, 0x10, 0, 4> STATUS_VDS_FR_NUM; + typedef UReg<0x00, 0x10, 4, 1> STATUS_VDS_OUT_VSYNC; + typedef UReg<0x00, 0x10, 5, 1> STATUS_VDS_OUT_HSYNC; + typedef UReg<0x00, 0x11, 0, 1> STATUS_VDS_FIELD; + typedef UReg<0x00, 0x11, 1, 1> STATUS_VDS_OUT_BLANK; + typedef UReg<0x00, 0x11, 4, 11> STATUS_VDS_VERT_COUNT; + + typedef UReg<0x00, 0x13, 0, 1> STATUS_MEM_FF_WFF_FIFO_FULL; + typedef UReg<0x00, 0x13, 1, 1> STATUS_MEM_FF_WFF_FIFO_EMPTY; + typedef UReg<0x00, 0x13, 2, 1> STATUS_MEM_FF_RFF_FIFO_FULL; + typedef UReg<0x00, 0x13, 3, 1> STATUS_MEM_FF_RFF_FIFO_EMPTY; + typedef UReg<0x00, 0x13, 4, 1> STATUS_MEM_FF_CAP_FIFO_FULL; + typedef UReg<0x00, 0x13, 5, 1> STATUS_MEM_FF_CAP_FIFO_EMPTY; + typedef UReg<0x00, 0x13, 6, 1> STATUS_MEM_FF_PLY_FIFO_FULL; + typedef UReg<0x00, 0x13, 7, 1> STATUS_MEM_FF_PLY_FIFO_EMPTY; + typedef UReg<0x00, 0x14, 0, 1> STATUS_MEM_FF_EXT_FIN; + + typedef UReg<0x00, 0x15, 7, 1> STATUS_DEINT_PULLDN; + + typedef UReg<0x00, 0x16, 0, 8> STATUS_16; // whole register for convenience + typedef UReg<0x00, 0x16, 0, 1> STATUS_SYNC_PROC_HSPOL; + typedef UReg<0x00, 0x16, 1, 1> STATUS_SYNC_PROC_HSACT; + typedef UReg<0x00, 0x16, 2, 1> STATUS_SYNC_PROC_VSPOL; + typedef UReg<0x00, 0x16, 3, 1> STATUS_SYNC_PROC_VSACT; + typedef UReg<0x00, 0x17, 0, 12> STATUS_SYNC_PROC_HTOTAL; + typedef UReg<0x00, 0x19, 0, 12> STATUS_SYNC_PROC_HLOW_LEN; + typedef UReg<0x00, 0x1B, 0, 11> STATUS_SYNC_PROC_VTOTAL; + typedef UReg<0x00, 0x1F, 0, 8> TEST_BUS_1F; + typedef UReg<0x00, 0x20, 0, 16> TEST_FF_STATUS; + typedef UReg<0x00, 0x23, 0, 8> TEST_BUS_23; + typedef UReg<0x00, 0x2E, 0, 16> TEST_BUS; + typedef UReg<0x00, 0x2E, 0, 8> TEST_BUS_2E; + typedef UReg<0x00, 0x2F, 0, 8> TEST_BUS_2F; + + // Miscellaneous Registers + typedef UReg<0x00, 0x40, 0, 1> PLL_CKIS; + typedef UReg<0x00, 0x40, 1, 1> PLL_DIVBY2Z; + typedef UReg<0x00, 0x40, 2, 1> PLL_IS; + typedef UReg<0x00, 0x40, 3, 1> PLL_ADS; + typedef UReg<0x00, 0x40, 4, 3> PLL_MS; + typedef UReg<0x00, 0x41, 0, 8> PLL648_CONTROL_01; + typedef UReg<0x00, 0x43, 0, 8> PLL648_CONTROL_03; + typedef UReg<0x00, 0x43, 0, 2> PLL_R; + typedef UReg<0x00, 0x43, 2, 2> PLL_S; + typedef UReg<0x00, 0x43, 4, 1> PLL_LEN; + typedef UReg<0x00, 0x43, 5, 1> PLL_VCORST; + typedef UReg<0x00, 0x44, 0, 1> DAC_RGBS_PWDNZ; + typedef UReg<0x00, 0x44, 2, 1> DAC_RGBS_R0ENZ; + typedef UReg<0x00, 0x44, 5, 1> DAC_RGBS_G0ENZ; + typedef UReg<0x00, 0x45, 0, 1> DAC_RGBS_B0ENZ; + typedef UReg<0x00, 0x45, 2, 1> DAC_RGBS_SPD; + typedef UReg<0x00, 0x45, 3, 1> DAC_RGBS_S0ENZ; + typedef UReg<0x00, 0x45, 4, 1> DAC_RGBS_S1EN; + typedef UReg<0x00, 0x46, 0, 8> RESET_CONTROL_0x46; // fake name + typedef UReg<0x00, 0x46, 0, 1> SFTRST_IF_RSTZ; + typedef UReg<0x00, 0x46, 1, 1> SFTRST_DEINT_RSTZ; + typedef UReg<0x00, 0x46, 2, 1> SFTRST_MEM_FF_RSTZ; + typedef UReg<0x00, 0x46, 4, 1> SFTRST_FIFO_RSTZ; + typedef UReg<0x00, 0x46, 6, 1> SFTRST_VDS_RSTZ; + typedef UReg<0x00, 0x47, 0, 8> RESET_CONTROL_0x47; // fake name + typedef UReg<0x00, 0x47, 0, 1> SFTRST_DEC_RSTZ; + typedef UReg<0x00, 0x47, 1, 1> SFTRST_MODE_RSTZ; + typedef UReg<0x00, 0x47, 2, 1> SFTRST_SYNC_RSTZ; + typedef UReg<0x00, 0x47, 3, 1> SFTRST_HDBYPS_RSTZ; + typedef UReg<0x00, 0x47, 4, 1> SFTRST_INT_RSTZ; + typedef UReg<0x00, 0x48, 0, 8> PAD_CONTROL_00_0x48; + typedef UReg<0x00, 0x48, 0, 1> PAD_BOUT_EN; // aka debug pin + typedef UReg<0x00, 0x48, 6, 1> PAD_SYNC1_IN_ENZ; + typedef UReg<0x00, 0x48, 7, 1> PAD_SYNC2_IN_ENZ; + typedef UReg<0x00, 0x49, 0, 8> PAD_CONTROL_01_0x49; // fake name + typedef UReg<0x00, 0x49, 0, 1> PAD_CKIN_ENZ; + typedef UReg<0x00, 0x49, 1, 1> PAD_CKOUT_ENZ; + typedef UReg<0x00, 0x49, 2, 1> PAD_SYNC_OUT_ENZ; + typedef UReg<0x00, 0x49, 4, 1> PAD_TRI_ENZ; + typedef UReg<0x00, 0x4A, 0, 3> PAD_OSC_CNTRL; + typedef UReg<0x00, 0x4B, 1, 1> DAC_RGBS_BYPS2DAC; + typedef UReg<0x00, 0x4B, 2, 1> DAC_RGBS_ADC2DAC; + typedef UReg<0x00, 0x4D, 0, 5> TEST_BUS_SEL; + typedef UReg<0x00, 0x4D, 5, 1> TEST_BUS_EN; + typedef UReg<0x00, 0x4F, 5, 1> OUT_SYNC_CNTRL; + typedef UReg<0x00, 0x4F, 6, 2> OUT_SYNC_SEL; + + typedef UReg<0x00, 0x52, 0, 8> GPIO_CONTROL_00; + typedef UReg<0x00, 0x53, 0, 8> GPIO_CONTROL_01; + typedef UReg<0x00, 0x58, 0, 8> INTERRUPT_CONTROL_00; + typedef UReg<0x00, 0x58, 0, 1> INT_CONTROL_RST_SOGBAD; + typedef UReg<0x00, 0x58, 1, 1> INT_CONTROL_RST_SOGSWITCH; + typedef UReg<0x00, 0x58, 4, 1> INT_CONTROL_RST_NOHSYNC; + typedef UReg<0x00, 0x59, 0, 8> INTERRUPT_CONTROL_01; + + // IF Registers + typedef UReg<0x01, 0x00, 0, 1> IF_IN_DREG_BYPS; + typedef UReg<0x01, 0x00, 1, 1> IF_MATRIX_BYPS; + typedef UReg<0x01, 0x00, 2, 1> IF_UV_REVERT; + typedef UReg<0x01, 0x00, 3, 1> IF_SEL_656; + typedef UReg<0x01, 0x00, 4, 1> IF_SEL16BIT; + typedef UReg<0x01, 0x00, 5, 1> IF_VS_SEL; + typedef UReg<0x01, 0x00, 6, 1> IF_PRGRSV_CNTRL; + typedef UReg<0x01, 0x00, 7, 1> IF_HS_FLIP; + typedef UReg<0x01, 0x01, 0, 1> IF_VS_FLIP; + typedef UReg<0x01, 0x01, 7, 1> IF_SEL24BIT; + typedef UReg<0x01, 0x02, 0, 8> INPUT_FORMATTER_02; // convenience + typedef UReg<0x01, 0x02, 0, 1> IF_SEL_WEN; + typedef UReg<0x01, 0x02, 1, 1> IF_HS_SEL_LPF; + typedef UReg<0x01, 0x02, 2, 1> IF_HS_INT_LPF_BYPS; + typedef UReg<0x01, 0x02, 3, 1> IF_HS_PSHIFT_BYPS; + typedef UReg<0x01, 0x02, 4, 1> IF_HS_TAP11_BYPS; + typedef UReg<0x01, 0x02, 5, 2> IF_HS_Y_PDELAY; + typedef UReg<0x01, 0x0b, 4, 2> IF_HS_DEC_FACTOR; + typedef UReg<0x01, 0x0b, 6, 1> IF_SEL_HSCALE; + typedef UReg<0x01, 0x0b, 7, 1> IF_LD_SEL_PROV; + typedef UReg<0x01, 0x0c, 0, 1> IF_LD_RAM_BYPS; + typedef UReg<0x01, 0x0c, 1, 4> IF_LD_ST; + typedef UReg<0x01, 0x0c, 5, 11> IF_INI_ST; + typedef UReg<0x01, 0x0e, 0, 11> IF_HSYNC_RST; + typedef UReg<0x01, 0x10, 0, 11> IF_HB_ST; + typedef UReg<0x01, 0x12, 0, 11> IF_HB_SP; + typedef UReg<0x01, 0x16, 0, 11> IF_HB_SP1; + typedef UReg<0x01, 0x18, 0, 11> IF_HB_ST2; + typedef UReg<0x01, 0x1a, 0, 11> IF_HB_SP2; + typedef UReg<0x01, 0x1c, 0, 11> IF_VB_ST; + typedef UReg<0x01, 0x1e, 0, 11> IF_VB_SP; + typedef UReg<0x01, 0x20, 0, 12> IF_LINE_ST; + typedef UReg<0x01, 0x22, 0, 12> IF_LINE_SP; + typedef UReg<0x01, 0x24, 0, 12> IF_HBIN_ST; + typedef UReg<0x01, 0x26, 0, 12> IF_HBIN_SP; + typedef UReg<0x01, 0x28, 1, 1> IF_LD_WRST_SEL; + typedef UReg<0x01, 0x28, 2, 1> IF_SEL_ADC_SYNC; + typedef UReg<0x01, 0x28, 3, 1> IF_TEST_EN; + typedef UReg<0x01, 0x28, 4, 4> IF_TEST_SEL; + typedef UReg<0x01, 0x29, 0, 1> IF_AUTO_OFST_EN; + typedef UReg<0x01, 0x29, 1, 1> IF_AUTO_OFST_PRD; + typedef UReg<0x01, 0x2A, 0, 4> IF_AUTO_OFST_U_RANGE; + typedef UReg<0x01, 0x2A, 4, 4> IF_AUTO_OFST_V_RANGE; + typedef UReg<0x01, 0x2B, 0, 7> GBS_PRESET_ID; + typedef UReg<0x01, 0x2B, 7, 1> GBS_PRESET_CUSTOM; + typedef UReg<0x01, 0x2C, 0, 1> GBS_OPTION_SCANLINES_ENABLED; + typedef UReg<0x01, 0x2C, 1, 1> GBS_OPTION_SCALING_RGBHV; + typedef UReg<0x01, 0x2C, 2, 1> GBS_OPTION_PALFORCED60_ENABLED; + typedef UReg<0x01, 0x2C, 3, 1> GBS_RUNTIME_UNUSED_BIT; + typedef UReg<0x01, 0x2C, 4, 1> GBS_RUNTIME_FTL_ADJUSTED; + typedef UReg<0x01, 0x2D, 0, 8> GBS_PRESET_DISPLAY_CLOCK; + + // HDBypass + typedef UReg<0x01, 0x30, 1, 1> HD_MATRIX_BYPS; + typedef UReg<0x01, 0x30, 2, 1> HD_DYN_BYPS; + typedef UReg<0x01, 0x30, 3, 1> HD_SEL_BLK_IN; + typedef UReg<0x01, 0x32, 0, 8> HD_Y_OFFSET; + typedef UReg<0x01, 0x34, 0, 8> HD_U_OFFSET; + typedef UReg<0x01, 0x36, 0, 8> HD_V_OFFSET; + typedef UReg<0x01, 0x37, 0, 11> HD_HSYNC_RST; + typedef UReg<0x01, 0x39, 0, 11> HD_INI_ST; + typedef UReg<0x01, 0x3B, 0, 12> HD_HB_ST; + typedef UReg<0x01, 0x3D, 0, 12> HD_HB_SP; + typedef UReg<0x01, 0x3F, 0, 12> HD_HS_ST; + typedef UReg<0x01, 0x41, 0, 12> HD_HS_SP; + typedef UReg<0x01, 0x43, 0, 12> HD_VB_ST; + typedef UReg<0x01, 0x45, 0, 12> HD_VB_SP; + typedef UReg<0x01, 0x47, 0, 12> HD_VS_ST; + typedef UReg<0x01, 0x49, 0, 12> HD_VS_SP; + typedef UReg<0x01, 0x53, 0, 8> HD_BLK_GY_DATA; + typedef UReg<0x01, 0x54, 0, 8> HD_BLK_BU_DATA; + typedef UReg<0x01, 0x55, 0, 8> HD_BLK_RV_DATA; + + // Mode Detect + typedef UReg<0x01, 0x60, 0, 5> MD_HPERIOD_LOCK_VALUE; + typedef UReg<0x01, 0x60, 5, 3> MD_HPERIOD_UNLOCK_VALUE; + typedef UReg<0x01, 0x61, 0, 5> MD_VPERIOD_LOCK_VALUE; + typedef UReg<0x01, 0x61, 5, 3> MD_VPERIOD_UNLOCK_VALUE; + typedef UReg<0x01, 0x63, 6, 1> MD_HS_FLIP; + typedef UReg<0x01, 0x63, 7, 1> MD_VS_FLIP; + typedef UReg<0x01, 0x65, 0, 7> MD_VGA_CNTRL; + typedef UReg<0x01, 0x65, 7, 1> MD_SEL_VGA60; + typedef UReg<0x01, 0x66, 0, 8> MD_VGA_75HZ_CNTRL; + typedef UReg<0x01, 0x67, 0, 8> MD_VGA_85HZ_CNTRL; + typedef UReg<0x01, 0x6A, 0, 8> MD_SVGA_60HZ_CNTRL; + typedef UReg<0x01, 0x6B, 0, 8> MD_SVGA_75HZ_CNTRL; + typedef UReg<0x01, 0x6C, 0, 8> MD_SVGA_85HZ_CNTRL; + typedef UReg<0x01, 0x6E, 0, 8> MD_XGA_60HZ_CNTRL; + typedef UReg<0x01, 0x6F, 0, 7> MD_XGA_70HZ_CNTRL; + typedef UReg<0x01, 0x70, 0, 7> MD_XGA_75HZ_CNTRL; + typedef UReg<0x01, 0x71, 0, 7> MD_XGA_85HZ_CNTRL; + typedef UReg<0x01, 0x73, 0, 7> MD_SXGA_60HZ_CNTRL; + typedef UReg<0x01, 0x74, 0, 7> MD_SXGA_75HZ_CNTRL; + typedef UReg<0x01, 0x75, 0, 7> MD_SXGA_85HZ_CNTRL; + typedef UReg<0x01, 0x7F, 0, 7> MD_HD1250P_CNTRL; // changed to meaning 24khz + + // Deinterlacer / Scaledown registers + typedef UReg<0x02, 0x00, 0, 8> DEINT_00; + typedef UReg<0x02, 0x00, 7, 1> DIAG_BOB_PLDY_RAM_BYPS; + typedef UReg<0x02, 0x02, 6, 1> MADPT_Y_VSCALE_BYPS; + typedef UReg<0x02, 0x02, 7, 1> MADPT_UV_VSCALE_BYPS; + typedef UReg<0x02, 0x0A, 5, 1> MADPT_STILL_NOISE_EST_EN; + typedef UReg<0x02, 0x0A, 7, 1> MADPT_Y_MI_DET_BYPS; + typedef UReg<0x02, 0x0B, 0, 7> MADPT_Y_MI_OFFSET; + typedef UReg<0x02, 0x0C, 4, 1> MADPT_MI_1BIT_BYPS; + typedef UReg<0x02, 0x0C, 5, 1> MADPT_MI_1BIT_FRAME2_EN; + typedef UReg<0x02, 0x16, 5, 1> MADPT_MO_ADP_UV_EN; + typedef UReg<0x02, 0x16, 6, 1> MADPT_VT_FILTER_CNTRL; + typedef UReg<0x02, 0x16, 7, 1> MAPDT_VT_SEL_PRGV; + typedef UReg<0x02, 0x17, 0, 8> MADPT_Y_DELAY_UV_DELAY; // convenience + typedef UReg<0x02, 0x17, 0, 4> MADPT_Y_DELAY; + typedef UReg<0x02, 0x17, 4, 4> MADPT_UV_DELAY; + typedef UReg<0x02, 0x18, 3, 1> MADPT_HTAP_BYPS; + typedef UReg<0x02, 0x19, 0, 1> MADPT_BIT_STILL_EN; + typedef UReg<0x02, 0x19, 2, 1> MADPT_VTAP2_BYPS; + typedef UReg<0x02, 0x19, 3, 1> MADPT_VTAP2_ROUND_SEL; + typedef UReg<0x02, 0x19, 4, 4> MADPT_VTAP2_COEFF; + typedef UReg<0x02, 0x21, 4, 1> MADPT_EN_NOUT_FOR_STILL; + typedef UReg<0x02, 0x21, 5, 1> MADPT_EN_NOUT_FOR_LESS_STILL; + typedef UReg<0x02, 0x24, 2, 1> MADPT_PD_RAM_BYPS; + typedef UReg<0x02, 0x26, 6, 1> MADPT_VIIR_BYPS; + typedef UReg<0x02, 0x27, 0, 7> MADPT_VIIR_COEF; + typedef UReg<0x02, 0x31, 0, 2> MADPT_VSCALE_DEC_FACTOR; + typedef UReg<0x02, 0x31, 2, 1> MADPT_SEL_PHASE_INI; + typedef UReg<0x02, 0x35, 3, 1> MADPT_DD0_SEL; + typedef UReg<0x02, 0x35, 4, 1> MADPT_NRD_VIIR_PD_BYPS; + typedef UReg<0x02, 0x35, 5, 1> MADPT_UVDLY_PD_BYPS; + typedef UReg<0x02, 0x35, 6, 1> MADPT_CMP_EN; + typedef UReg<0x02, 0x39, 0, 4> MADPT_UVDLY_PD_SP; + typedef UReg<0x02, 0x39, 4, 4> MADPT_UVDLY_PD_ST; + typedef UReg<0x02, 0x3a, 0, 1> MADPT_EN_UV_DEINT; + typedef UReg<0x02, 0x3a, 3, 1> MADPT_EN_STILL_FOR_NRD; + typedef UReg<0x02, 0x3a, 5, 2> MADPT_MI_1BIT_DLY; + typedef UReg<0x02, 0x3a, 7, 1> MADPT_UV_MI_DET_BYPS; + typedef UReg<0x02, 0x3b, 0, 7> MADPT_UV_MI_OFFSET; + + // VDS Registers + typedef UReg<0x03, 0x00, 0, 1> VDS_SYNC_EN; + typedef UReg<0x03, 0x00, 1, 1> VDS_FIELDAB_EN; + typedef UReg<0x03, 0x00, 2, 1> VDS_DFIELD_EN; + typedef UReg<0x03, 0x00, 3, 1> VDS_FIELD_FLIP; + typedef UReg<0x03, 0x00, 4, 1> VDS_HSCALE_BYPS; + typedef UReg<0x03, 0x00, 5, 1> VDS_VSCALE_BYPS; + typedef UReg<0x03, 0x00, 6, 1> VDS_HALF_EN; + typedef UReg<0x03, 0x00, 7, 1> VDS_SRESET; + typedef UReg<0x03, 0x01, 0, 12> VDS_HSYNC_RST; + typedef UReg<0x03, 0x02, 4, 11> VDS_VSYNC_RST; + typedef UReg<0x03, 0x04, 0, 12> VDS_HB_ST; + typedef UReg<0x03, 0x05, 4, 12> VDS_HB_SP; + typedef UReg<0x03, 0x07, 0, 11> VDS_VB_ST; + typedef UReg<0x03, 0x08, 4, 11> VDS_VB_SP; + typedef UReg<0x03, 0x0A, 0, 12> VDS_HS_ST; + typedef UReg<0x03, 0x0B, 4, 12> VDS_HS_SP; + typedef UReg<0x03, 0x0D, 0, 11> VDS_VS_ST; + typedef UReg<0x03, 0x0E, 4, 11> VDS_VS_SP; + typedef UReg<0x03, 0x10, 0, 12> VDS_DIS_HB_ST; + typedef UReg<0x03, 0x11, 4, 12> VDS_DIS_HB_SP; + typedef UReg<0x03, 0x13, 0, 11> VDS_DIS_VB_ST; + typedef UReg<0x03, 0x14, 4, 11> VDS_DIS_VB_SP; + typedef UReg<0x03, 0x16, 0, 10> VDS_HSCALE; + typedef UReg<0x03, 0x17, 4, 10> VDS_VSCALE; + typedef UReg<0x03, 0x19, 0, 10> VDS_FRAME_RST; + typedef UReg<0x03, 0x1A, 4, 1> VDS_FLOCK_EN; + typedef UReg<0x03, 0x1A, 5, 1> VDS_FREERUN_FID; + typedef UReg<0x03, 0x1A, 6, 1> VDS_FID_AA_DLY; + typedef UReg<0x03, 0x1A, 7, 1> VDS_FID_RST; + + typedef UReg<0x03, 0x1B, 0, 32> VDS_FR_SELECT; + typedef UReg<0x03, 0x1F, 0, 4> VDS_FRAME_NO; + typedef UReg<0x03, 0x1F, 4, 1> VDS_DIF_FR_SEL_EN; + typedef UReg<0x03, 0x1F, 5, 1> VDS_EN_FR_NUM_RST; + typedef UReg<0x03, 0x20, 0, 11> VDS_VSYN_SIZE1; + typedef UReg<0x03, 0x22, 0, 11> VDS_VSYN_SIZE2; + typedef UReg<0x03, 0x24, 0, 8> VDS_3_24; // convenience + typedef UReg<0x03, 0x24, 0, 1> VDS_UV_FLIP; + typedef UReg<0x03, 0x24, 1, 1> VDS_U_DELAY; + typedef UReg<0x03, 0x24, 2, 1> VDS_V_DELAY; + typedef UReg<0x03, 0x24, 3, 1> VDS_TAP6_BYPS; + typedef UReg<0x03, 0x24, 4, 2> VDS_Y_DELAY; + typedef UReg<0x03, 0x24, 6, 2> VDS_WEN_DELAY; + typedef UReg<0x03, 0x25, 0, 10> VDS_D_SP; + typedef UReg<0x03, 0x26, 6, 1> VDS_D_RAM_BYPS; + typedef UReg<0x03, 0x26, 7, 1> VDS_BLEV_AUTO_EN; + typedef UReg<0x03, 0x27, 0, 4> VDS_USER_MIN; + typedef UReg<0x03, 0x27, 4, 4> VDS_USER_MAX; + typedef UReg<0x03, 0x28, 0, 8> VDS_BLEV_LEVEL; + typedef UReg<0x03, 0x29, 0, 8> VDS_BLEV_GAIN; + typedef UReg<0x03, 0x2A, 0, 1> VDS_BLEV_BYPS; + typedef UReg<0x03, 0x2A, 4, 2> VDS_STEP_DLY_CNTRL; + typedef UReg<0x03, 0x2A, 6, 2> VDS_0X2A_RESERVED_2BITS; + typedef UReg<0x03, 0x2B, 0, 4> VDS_STEP_GAIN; + typedef UReg<0x03, 0x2B, 4, 3> VDS_STEP_CLIP; + typedef UReg<0x03, 0x2B, 7, 1> VDS_UV_STEP_BYPS; + + typedef UReg<0x03, 0x2C, 0, 8> VDS_SK_U_CENTER; + typedef UReg<0x03, 0x2D, 0, 8> VDS_SK_V_CENTER; + typedef UReg<0x03, 0x2E, 0, 8> VDS_SK_Y_LOW_TH; + typedef UReg<0x03, 0x2F, 0, 8> VDS_SK_Y_HIGH_TH; + typedef UReg<0x03, 0x30, 0, 8> VDS_SK_RANGE; + typedef UReg<0x03, 0x31, 0, 4> VDS_SK_GAIN; + typedef UReg<0x03, 0x31, 4, 1> VDS_SK_Y_EN; + typedef UReg<0x03, 0x31, 5, 1> VDS_SK_BYPS; + + typedef UReg<0x03, 0x32, 0, 2> VDS_SVM_BPF_CNTRL; + typedef UReg<0x03, 0x32, 2, 1> VDS_SVM_POL_FLIP; + typedef UReg<0x03, 0x32, 3, 1> VDS_SVM_2ND_BYPS; + typedef UReg<0x03, 0x32, 4, 3> VDS_SVM_VCLK_DELAY; + typedef UReg<0x03, 0x32, 7, 1> VDS_SVM_SIGMOID_BYPS; + typedef UReg<0x03, 0x33, 0, 8> VDS_SVM_GAIN; + typedef UReg<0x03, 0x34, 0, 8> VDS_SVM_OFFSET; + + typedef UReg<0x03, 0x35, 0, 8> VDS_Y_GAIN; + typedef UReg<0x03, 0x36, 0, 8> VDS_UCOS_GAIN; + typedef UReg<0x03, 0x37, 0, 8> VDS_VCOS_GAIN; + typedef UReg<0x03, 0x38, 0, 8> VDS_USIN_GAIN; + typedef UReg<0x03, 0x39, 0, 8> VDS_VSIN_GAIN; + typedef UReg<0x03, 0x3A, 0, 8> VDS_Y_OFST; + typedef UReg<0x03, 0x3B, 0, 8> VDS_U_OFST; + typedef UReg<0x03, 0x3C, 0, 8> VDS_V_OFST; + + typedef UReg<0x03, 0x3D, 0, 9> VDS_SYNC_LEV; + typedef UReg<0x03, 0x3E, 3, 1> VDS_CONVT_BYPS; + typedef UReg<0x03, 0x3E, 4, 1> VDS_DYN_BYPS; + typedef UReg<0x03, 0x3E, 7, 1> VDS_BLK_BF_EN; + typedef UReg<0x03, 0x3F, 0, 8> VDS_UV_BLK_VAL; + typedef UReg<0x03, 0x40, 0, 1> VDS_1ST_INT_BYPS; + typedef UReg<0x03, 0x40, 1, 1> VDS_2ND_INT_BYPS; + typedef UReg<0x03, 0x40, 2, 1> VDS_IN_DREG_BYPS; + typedef UReg<0x03, 0x40, 4, 2> VDS_SVM_V4CLK_DELAY; + + typedef UReg<0x03, 0x41, 0, 10> VDS_PK_LINE_BUF_SP; + typedef UReg<0x03, 0x42, 6, 1> VDS_PK_RAM_BYPS; + typedef UReg<0x03, 0x43, 0, 1> VDS_PK_VL_HL_SEL; + typedef UReg<0x03, 0x43, 1, 1> VDS_PK_VL_HH_SEL; + typedef UReg<0x03, 0x43, 2, 1> VDS_PK_VH_HL_SEL; + typedef UReg<0x03, 0x43, 3, 1> VDS_PK_VH_HH_SEL; + typedef UReg<0x03, 0x44, 0, 3> VDS_PK_LB_CORE; + typedef UReg<0x03, 0x44, 3, 5> VDS_PK_LB_CMP; + typedef UReg<0x03, 0x45, 0, 6> VDS_PK_LB_GAIN; + typedef UReg<0x03, 0x46, 0, 3> VDS_PK_LH_CORE; + typedef UReg<0x03, 0x46, 3, 5> VDS_PK_LH_CMP; + typedef UReg<0x03, 0x47, 0, 6> VDS_PK_LH_GAIN; + typedef UReg<0x03, 0x48, 0, 3> VDS_PK_HL_CORE; + typedef UReg<0x03, 0x48, 3, 5> VDS_PK_HL_CMP; + typedef UReg<0x03, 0x49, 0, 6> VDS_PK_HL_GAIN; + typedef UReg<0x03, 0x4A, 0, 3> VDS_PK_HB_CORE; + typedef UReg<0x03, 0x4A, 3, 5> VDS_PK_HB_CMP; + typedef UReg<0x03, 0x4B, 0, 6> VDS_PK_HB_GAIN; + typedef UReg<0x03, 0x4C, 0, 3> VDS_PK_HH_CORE; + typedef UReg<0x03, 0x4C, 3, 5> VDS_PK_HH_CMP; + typedef UReg<0x03, 0x4D, 0, 6> VDS_PK_HH_GAIN; + typedef UReg<0x03, 0x4E, 0, 1> VDS_PK_Y_H_BYPS; + typedef UReg<0x03, 0x4E, 1, 1> VDS_PK_Y_V_BYPS; + typedef UReg<0x03, 0x4E, 3, 1> VDS_C_VPK_BYPS; + typedef UReg<0x03, 0x4E, 4, 3> VDS_C_VPK_CORE; + typedef UReg<0x03, 0x4F, 0, 6> VDS_C_VPK_GAIN; + + typedef UReg<0x03, 0x50, 0, 4> VDS_TEST_BUS_SEL; + typedef UReg<0x03, 0x50, 4, 1> VDS_TEST_EN; + typedef UReg<0x03, 0x50, 5, 1> VDS_DO_UV_DEV_BYPS; + typedef UReg<0x03, 0x50, 6, 1> VDS_DO_UVSEL_FLIP; + typedef UReg<0x03, 0x50, 7, 1> VDS_DO_16B_EN; + + typedef UReg<0x03, 0x51, 7, 11> VDS_GLB_NOISE; + typedef UReg<0x03, 0x52, 4, 1> VDS_NR_Y_BYPS; + typedef UReg<0x03, 0x52, 5, 1> VDS_NR_C_BYPS; + typedef UReg<0x03, 0x52, 6, 1> VDS_NR_DIF_LPF5_BYPS; + typedef UReg<0x03, 0x52, 7, 1> VDS_NR_MI_TH_EN; + typedef UReg<0x03, 0x53, 0, 7> VDS_NR_MI_OFFSET; + typedef UReg<0x03, 0x53, 7, 1> VDS_NR_MIG_USER_EN; + typedef UReg<0x03, 0x54, 0, 4> VDS_NR_MI_GAIN; + typedef UReg<0x03, 0x54, 4, 4> VDS_NR_STILL_GAIN; + typedef UReg<0x03, 0x55, 0, 4> VDS_NR_MI_THRES; + typedef UReg<0x03, 0x55, 4, 1> VDS_NR_EN_H_NOISY; + typedef UReg<0x03, 0x55, 6, 1> VDS_NR_EN_GLB_STILL; + typedef UReg<0x03, 0x55, 7, 1> VDS_NR_GLB_STILL_MENU; + typedef UReg<0x03, 0x56, 0, 7> VDS_NR_NOISY_OFFSET; + typedef UReg<0x03, 0x56, 7, 1> VDS_W_LEV_BYPS; + typedef UReg<0x03, 0x57, 0, 8> VDS_W_LEV; + typedef UReg<0x03, 0x58, 0, 8> VDS_WLEV_GAIN; + typedef UReg<0x03, 0x59, 0, 8> VDS_NS_U_CENTER; + typedef UReg<0x03, 0x5A, 0, 8> VDS_NS_V_CENTER; + typedef UReg<0x03, 0x5B, 0, 7> VDS_NS_U_GAIN; + typedef UReg<0x03, 0x5B, 7, 15> VDS_NS_SQUARE_RAD; + typedef UReg<0x03, 0x5D, 6, 8> VDS_NS_Y_HIGH_TH; + typedef UReg<0x03, 0x5E, 6, 7> VDS_NS_V_GAIN; + typedef UReg<0x03, 0x5F, 5, 5> VDS_NS_Y_LOW_TH; + typedef UReg<0x03, 0x60, 2, 1> VDS_NS_BYPS; + typedef UReg<0x03, 0x60, 3, 1> VDS_NS_Y_ACTIVE_EN; + + typedef UReg<0x03, 0x60, 4, 10> VDS_C1_TAG_LOW_SLOPE; + typedef UReg<0x03, 0x61, 6, 10> VDS_C1_TAG_HIGH_SLOPE; + typedef UReg<0x03, 0x63, 0, 4> VDS_C1_GAIN; + typedef UReg<0x03, 0x63, 4, 8> VDS_C1_U_LOW; + typedef UReg<0x03, 0x64, 4, 8> VDS_C1_U_HIGH; + typedef UReg<0x03, 0x65, 4, 1> VDS_C1_BYPS; + typedef UReg<0x03, 0x65, 5, 8> VDS_C1_Y_THRESH; + + typedef UReg<0x03, 0x66, 5, 10> VDS_C2_TAG_LOW_SLOPE; + typedef UReg<0x03, 0x67, 7, 10> VDS_C2_TAG_HIGH_SLOPE; + typedef UReg<0x03, 0x69, 1, 4> VDS_C2_GAIN; + typedef UReg<0x03, 0x69, 5, 8> VDS_C2_U_LOW; + typedef UReg<0x03, 0x6A, 5, 8> VDS_C2_U_HIGH; + typedef UReg<0x03, 0x6B, 5, 1> VDS_C2_BYPS; + typedef UReg<0x03, 0x6B, 6, 8> VDS_C2_Y_THRESH; + + typedef UReg<0x03, 0x6D, 0, 12> VDS_EXT_HB_ST; + typedef UReg<0x03, 0x6E, 4, 12> VDS_EXT_HB_SP; + typedef UReg<0x03, 0x70, 0, 11> VDS_EXT_VB_ST; + typedef UReg<0x03, 0x71, 4, 11> VDS_EXT_VB_SP; + typedef UReg<0x03, 0x72, 7, 1> VDS_SYNC_IN_SEL; + + typedef UReg<0x03, 0x73, 0, 3> VDS_BLUE_RANGE; + typedef UReg<0x03, 0x73, 3, 1> VDS_BLUE_BYPS; + typedef UReg<0x03, 0x73, 4, 4> VDS_BLUE_UGAIN; + typedef UReg<0x03, 0x74, 0, 4> VDS_BLUE_VGAIN; + typedef UReg<0x03, 0x74, 4, 4> VDS_BLUE_Y_LEV; + + // PIP Registers + typedef UReg<0x03, 0x80, 0, 1> PIP_UV_FLIP; + typedef UReg<0x03, 0x80, 1, 1> PIP_U_DELAY; + typedef UReg<0x03, 0x80, 2, 1> PIP_V_DELAY; + typedef UReg<0x03, 0x80, 3, 1> PIP_TAP3_BYPS; + typedef UReg<0x03, 0x80, 4, 2> PIP_Y_DELAY; + typedef UReg<0x03, 0x80, 6, 1> PIP_SUB_16B_SEL; + typedef UReg<0x03, 0x80, 7, 1> PIP_DYN_BYPS; + typedef UReg<0x03, 0x81, 0, 1> PIP_CONVT_BYPS; + typedef UReg<0x03, 0x81, 3, 1> PIP_DREG_BYPS; + typedef UReg<0x03, 0x81, 7, 1> PIP_EN; + typedef UReg<0x03, 0x82, 0, 8> PIP_Y_GAIN; + typedef UReg<0x03, 0x83, 0, 8> PIP_U_GAIN; + typedef UReg<0x03, 0x84, 0, 8> PIP_V_GAIN; + typedef UReg<0x03, 0x85, 0, 8> PIP_Y_OFST; + typedef UReg<0x03, 0x86, 0, 8> PIP_U_OFST; + typedef UReg<0x03, 0x87, 0, 8> PIP_V_OFST; + typedef UReg<0x03, 0x88, 0, 12> PIP_H_ST; + typedef UReg<0x03, 0x8A, 0, 12> PIP_H_SP; + typedef UReg<0x03, 0x8C, 0, 11> PIP_V_ST; + typedef UReg<0x03, 0x8E, 0, 11> PIP_V_SP; + + // Memory Controller Registers + typedef UReg<0x04, 0x00, 0, 8> SDRAM_RESET_CONTROL; // fake name + typedef UReg<0x04, 0x00, 4, 1> SDRAM_RESET_SIGNAL; + typedef UReg<0x04, 0x00, 7, 1> SDRAM_START_INITIAL_CYCLE; + typedef UReg<0x04, 0x12, 0, 1> MEM_INTER_DLYCELL_SEL; + typedef UReg<0x04, 0x12, 1, 1> MEM_CLK_DLYCELL_SEL; + typedef UReg<0x04, 0x12, 2, 1> MEM_FBK_CLK_DLYCELL_SEL; + typedef UReg<0x04, 0x13, 0, 1> MEM_PAD_CLK_INVERT; + typedef UReg<0x04, 0x13, 1, 1> MEM_RD_DATA_CLK_INVERT; + typedef UReg<0x04, 0x13, 2, 1> MEM_FBK_CLK_INVERT; + typedef UReg<0x04, 0x15, 0, 1> MEM_REQ_PBH_RFFH; + typedef UReg<0x04, 0x1b, 0, 3> MEM_ADR_DLY_REG; + typedef UReg<0x04, 0x1b, 4, 3> MEM_CLK_DLY_REG; + + // Playback / Capture / Memory Registers + typedef UReg<0x04, 0x21, 0, 1> CAPTURE_ENABLE; + typedef UReg<0x04, 0x21, 1, 1> CAP_FF_HALF_REQ; + typedef UReg<0x04, 0x21, 5, 1> CAP_SAFE_GUARD_EN; + typedef UReg<0x04, 0x22, 0, 1> CAP_REQ_OVER; + typedef UReg<0x04, 0x22, 1, 1> CAP_STATUS_SEL; + typedef UReg<0x04, 0x22, 3, 1> CAP_REQ_FREEZ; + typedef UReg<0x04, 0x24, 0, 21> CAP_SAFE_GUARD_A; + typedef UReg<0x04, 0x27, 0, 21> CAP_SAFE_GUARD_B; + typedef UReg<0x04, 0x2b, 0, 1> PB_CUT_REFRESH; + typedef UReg<0x04, 0x2b, 1, 2> PB_REQ_SEL; + typedef UReg<0x04, 0x2b, 3, 1> PB_BYPASS; + typedef UReg<0x04, 0x2b, 5, 1> PB_DB_BUFFER_EN; + typedef UReg<0x04, 0x2b, 7, 1> PB_ENABLE; + typedef UReg<0x04, 0x2c, 0, 8> PB_MAST_FLAG_REG; + typedef UReg<0x04, 0x2d, 0, 8> PB_GENERAL_FLAG_REG; + typedef UReg<0x04, 0x37, 0, 10> PB_CAP_OFFSET; + typedef UReg<0x04, 0x39, 0, 10> PB_FETCH_NUM; + typedef UReg<0x04, 0x42, 0, 1> WFF_ENABLE; + typedef UReg<0x04, 0x42, 2, 1> WFF_FF_STA_INV; + typedef UReg<0x04, 0x42, 3, 1> WFF_SAFE_GUARD; + typedef UReg<0x04, 0x42, 5, 1> WFF_ADR_ADD_2; + typedef UReg<0x04, 0x42, 7, 1> WFF_FF_STATUS_SEL; + typedef UReg<0x04, 0x44, 0, 21> WFF_SAFE_GUARD_A; + typedef UReg<0x04, 0x47, 0, 21> WFF_SAFE_GUARD_B; + typedef UReg<0x04, 0x4a, 0, 1> WFF_YUV_DEINTERLACE; + typedef UReg<0x04, 0x4a, 4, 1> WFF_LINE_FLIP; + typedef UReg<0x04, 0x4b, 0, 3> WFF_HB_DELAY; + typedef UReg<0x04, 0x4b, 4, 3> WFF_VB_DELAY; + typedef UReg<0x04, 0x4d, 4, 1> RFF_ADR_ADD_2; + typedef UReg<0x04, 0x4d, 5, 2> RFF_REQ_SEL; + typedef UReg<0x04, 0x4d, 7, 1> RFF_ENABLE; + typedef UReg<0x04, 0x4e, 0, 8> RFF_MASTER_FLAG; + typedef UReg<0x04, 0x50, 5, 1> RFF_LINE_FLIP; + typedef UReg<0x04, 0x50, 6, 1> RFF_YUV_DEINTERLACE; + typedef UReg<0x04, 0x50, 7, 1> RFF_LREQ_CUT; + typedef UReg<0x04, 0x51, 0, 21> RFF_WFF_STA_ADDR_A; + typedef UReg<0x04, 0x54, 0, 21> RFF_WFF_STA_ADDR_B; + typedef UReg<0x04, 0x57, 0, 10> RFF_WFF_OFFSET; + typedef UReg<0x04, 0x59, 0, 10> RFF_FETCH_NUM; + typedef UReg<0x04, 0x5B, 7, 1> MEM_FF_TOP_FF_SEL; + + // OSD Registers + typedef UReg<0x00, 0x90, 0, 1> OSD_SW_RESET; + typedef UReg<0x00, 0x90, 1, 3> OSD_HORIZONTAL_ZOOM; + typedef UReg<0x00, 0x90, 4, 2> OSD_VERTICAL_ZOOM; + typedef UReg<0x00, 0x90, 6, 1> OSD_DISP_EN; + typedef UReg<0x00, 0x90, 7, 1> OSD_MENU_EN; + typedef UReg<0x00, 0x91, 0, 4> OSD_MENU_ICON_SEL; + typedef UReg<0x00, 0x91, 4, 4> OSD_MENU_MOD_SEL; + typedef UReg<0x00, 0x92, 0, 3> OSD_MENU_BAR_FONT_FORCOR; + typedef UReg<0x00, 0x92, 3, 3> OSD_MENU_BAR_FONT_BGCOR; + typedef UReg<0x00, 0x92, 6, 3> OSD_MENU_BAR_BORD_COR; + typedef UReg<0x00, 0x93, 1, 3> OSD_MENU_SEL_FORCOR; + typedef UReg<0x00, 0x93, 4, 3> OSD_MENU_SEL_BGCOR; + typedef UReg<0x00, 0x93, 7, 1> OSD_COMMAND_FINISH; + typedef UReg<0x00, 0x94, 0, 1> OSD_MENU_DISP_STYLE; + typedef UReg<0x00, 0x94, 2, 1> OSD_YCBCR_RGB_FORMAT; + typedef UReg<0x00, 0x94, 3, 1> OSD_INT_NG_LAT; + typedef UReg<0x00, 0x94, 4, 4> OSD_TEST_SEL; + typedef UReg<0x00, 0x95, 0, 8> OSD_MENU_HORI_START; + typedef UReg<0x00, 0x96, 0, 8> OSD_MENU_VER_START; + typedef UReg<0x00, 0x97, 0, 8> OSD_BAR_LENGTH; + typedef UReg<0x00, 0x98, 0, 8> OSD_BAR_FOREGROUND_VALUE; + + // ADC, SP Registers + typedef UReg<0x05, 0x00, 0, 8> ADC_5_00; // convenience + typedef UReg<0x05, 0x00, 0, 2> ADC_CLK_PA; + typedef UReg<0x05, 0x00, 3, 1> ADC_CLK_ICLK2X; + typedef UReg<0x05, 0x00, 4, 1> ADC_CLK_ICLK1X; + typedef UReg<0x05, 0x02, 0, 1> ADC_SOGEN; + typedef UReg<0x05, 0x02, 1, 5> ADC_SOGCTRL; + typedef UReg<0x05, 0x02, 6, 2> ADC_INPUT_SEL; + typedef UReg<0x05, 0x03, 0, 8> ADC_5_03; // convenience + typedef UReg<0x05, 0x03, 0, 1> ADC_POWDZ; + typedef UReg<0x05, 0x03, 1, 1> ADC_RYSEL_R; + typedef UReg<0x05, 0x03, 2, 1> ADC_RYSEL_G; + typedef UReg<0x05, 0x03, 3, 1> ADC_RYSEL_B; + typedef UReg<0x05, 0x03, 4, 2> ADC_FLTR; + typedef UReg<0x05, 0x04, 0, 8> ADC_TEST_04; + typedef UReg<0x05, 0x04, 0, 2> ADC_TR_RSEL; + typedef UReg<0x05, 0x04, 1, 1> ADC_TR_RSEL_04_BIT1; + typedef UReg<0x05, 0x04, 2, 3> ADC_TR_ISEL; + typedef UReg<0x05, 0x05, 0, 1> ADC_TA_05_EN; + typedef UReg<0x05, 0x05, 0, 8> ADC_TA_05_CTRL; + typedef UReg<0x05, 0x06, 0, 8> ADC_ROFCTRL; + typedef UReg<0x05, 0x07, 0, 8> ADC_GOFCTRL; + typedef UReg<0x05, 0x08, 0, 8> ADC_BOFCTRL; + typedef UReg<0x05, 0x09, 0, 8> ADC_RGCTRL; + typedef UReg<0x05, 0x0A, 0, 8> ADC_GGCTRL; + typedef UReg<0x05, 0x0B, 0, 8> ADC_BGCTRL; + typedef UReg<0x05, 0x0C, 0, 8> ADC_TEST_0C; + typedef UReg<0x05, 0x0C, 1, 1> ADC_TEST_0C_BIT1; + typedef UReg<0x05, 0x0C, 3, 1> ADC_TEST_0C_BIT3; + typedef UReg<0x05, 0x0C, 4, 1> ADC_TEST_0C_BIT4; + typedef UReg<0x05, 0x0E, 0, 1> ADC_AUTO_OFST_EN; + typedef UReg<0x05, 0x0E, 1, 1> ADC_AUTO_OFST_PRD; + typedef UReg<0x05, 0x0E, 2, 2> ADC_AUTO_OFST_DELAY; + typedef UReg<0x05, 0x0E, 4, 2> ADC_AUTO_OFST_STEP; + typedef UReg<0x05, 0x0E, 7, 1> ADC_AUTO_OFST_TEST; + typedef UReg<0x05, 0x0F, 0, 8> ADC_AUTO_OFST_RANGE_REG; + typedef UReg<0x05, 0x11, 0, 8> PLLAD_CONTROL_00_5x11; // fake name + typedef UReg<0x05, 0x11, 0, 1> PLLAD_VCORST; + typedef UReg<0x05, 0x11, 1, 1> PLLAD_LEN; + typedef UReg<0x05, 0x11, 2, 1> PLLAD_TEST; + typedef UReg<0x05, 0x11, 3, 1> PLLAD_TS; + typedef UReg<0x05, 0x11, 4, 1> PLLAD_PDZ; + typedef UReg<0x05, 0x11, 5, 1> PLLAD_FS; + typedef UReg<0x05, 0x11, 6, 1> PLLAD_BPS; + typedef UReg<0x05, 0x11, 7, 1> PLLAD_LAT; + typedef UReg<0x05, 0x12, 0, 12> PLLAD_MD; + typedef UReg<0x05, 0x16, 0, 8> PLLAD_5_16; // fake name + typedef UReg<0x05, 0x16, 0, 2> PLLAD_R; + typedef UReg<0x05, 0x16, 2, 2> PLLAD_S; + typedef UReg<0x05, 0x16, 4, 2> PLLAD_KS; + typedef UReg<0x05, 0x16, 6, 2> PLLAD_CKOS; + typedef UReg<0x05, 0x17, 0, 3> PLLAD_ICP; + typedef UReg<0x05, 0x18, 0, 1> PA_ADC_BYPSZ; + typedef UReg<0x05, 0x18, 1, 5> PA_ADC_S; + typedef UReg<0x05, 0x18, 6, 1> PA_ADC_LOCKOFF; + typedef UReg<0x05, 0x18, 7, 1> PA_ADC_LAT; + typedef UReg<0x05, 0x19, 0, 1> PA_SP_BYPSZ; + typedef UReg<0x05, 0x19, 1, 5> PA_SP_S; + typedef UReg<0x05, 0x19, 6, 1> PA_SP_LOCKOFF; + typedef UReg<0x05, 0x19, 7, 1> PA_SP_LAT; + typedef UReg<0x05, 0x1E, 7, 1> DEC_WEN_MODE; + typedef UReg<0x05, 0x1F, 0, 8> DEC_5_1F; // convenience + typedef UReg<0x05, 0x1F, 0, 1> DEC1_BYPS; + typedef UReg<0x05, 0x1F, 1, 1> DEC2_BYPS; + typedef UReg<0x05, 0x1F, 2, 1> DEC_MATRIX_BYPS; + typedef UReg<0x05, 0x1F, 3, 1> DEC_TEST_ENABLE; // fake name + typedef UReg<0x05, 0x1F, 4, 3> DEC_TEST_SEL; + typedef UReg<0x05, 0x1F, 7, 1> DEC_IDREG_EN; + typedef UReg<0x05, 0x20, 0, 1> SP_SOG_SRC_SEL; + typedef UReg<0x05, 0x20, 1, 1> SP_SOG_P_ATO; + typedef UReg<0x05, 0x20, 2, 1> SP_SOG_P_INV; + typedef UReg<0x05, 0x20, 3, 1> SP_EXT_SYNC_SEL; + typedef UReg<0x05, 0x20, 4, 1> SP_JITTER_SYNC; + typedef UReg<0x05, 0x26, 0, 12> SP_SYNC_PD_THD; + typedef UReg<0x05, 0x33, 0, 8> SP_H_TIMER_VAL; + typedef UReg<0x05, 0x35, 0, 12> SP_DLT_REG; + typedef UReg<0x05, 0x37, 0, 8> SP_H_PULSE_IGNOR; + typedef UReg<0x05, 0x38, 0, 8> SP_PRE_COAST; + typedef UReg<0x05, 0x39, 0, 8> SP_POST_COAST; + typedef UReg<0x05, 0x3A, 0, 8> SP_H_TOTAL_EQ_THD; + typedef UReg<0x05, 0x3B, 0, 3> SP_SDCS_VSST_REG_H; + typedef UReg<0x05, 0x3B, 4, 3> SP_SDCS_VSSP_REG_H; + typedef UReg<0x05, 0x3E, 0, 8> SP_CS_0x3E; // fake name + typedef UReg<0x05, 0x3E, 0, 1> SP_CS_P_SWAP; + typedef UReg<0x05, 0x3E, 1, 1> SP_HD_MODE; + typedef UReg<0x05, 0x3E, 2, 1> SP_H_COAST; + typedef UReg<0x05, 0x3E, 4, 1> SP_H_PROTECT; + typedef UReg<0x05, 0x3E, 5, 1> SP_DIS_SUB_COAST; + typedef UReg<0x05, 0x3F, 0, 8> SP_SDCS_VSST_REG_L; + typedef UReg<0x05, 0x40, 0, 8> SP_SDCS_VSSP_REG_L; + typedef UReg<0x05, 0x41, 0, 12> SP_CS_CLP_ST; + typedef UReg<0x05, 0x43, 0, 12> SP_CS_CLP_SP; + typedef UReg<0x05, 0x45, 0, 12> SP_CS_HS_ST; + typedef UReg<0x05, 0x47, 0, 12> SP_CS_HS_SP; + typedef UReg<0x05, 0x49, 0, 12> SP_RT_HS_ST; + typedef UReg<0x05, 0x4B, 0, 12> SP_RT_HS_SP; + typedef UReg<0x05, 0x4D, 0, 12> SP_H_CST_ST; + typedef UReg<0x05, 0x4F, 0, 12> SP_H_CST_SP; + typedef UReg<0x05, 0x55, 4, 1> SP_HS_POL_ATO; + typedef UReg<0x05, 0x55, 6, 1> SP_VS_POL_ATO; + typedef UReg<0x05, 0x55, 7, 1> SP_HCST_AUTO_EN; + typedef UReg<0x05, 0x56, 0, 8> SP_5_56; // convenience + typedef UReg<0x05, 0x56, 0, 1> SP_SOG_MODE; + typedef UReg<0x05, 0x56, 1, 1> SP_HS2PLL_INV_REG; + typedef UReg<0x05, 0x56, 2, 1> SP_CLAMP_MANUAL; + typedef UReg<0x05, 0x56, 3, 1> SP_CLP_SRC_SEL; + typedef UReg<0x05, 0x56, 4, 1> SP_SYNC_BYPS; + typedef UReg<0x05, 0x56, 5, 1> SP_HS_PROC_INV_REG; + typedef UReg<0x05, 0x56, 6, 1> SP_VS_PROC_INV_REG; + typedef UReg<0x05, 0x56, 7, 1> SP_CLAMP_INV_REG; + typedef UReg<0x05, 0x57, 0, 8> SP_5_57; // convenience + typedef UReg<0x05, 0x57, 0, 1> SP_NO_CLAMP_REG; + typedef UReg<0x05, 0x57, 1, 1> SP_COAST_INV_REG; + typedef UReg<0x05, 0x57, 2, 1> SP_NO_COAST_REG; + typedef UReg<0x05, 0x57, 6, 1> SP_HS_LOOP_SEL; + typedef UReg<0x05, 0x57, 7, 1> SP_HS_REG; + typedef UReg<0x05, 0x60, 0, 8> ADC_UNUSED_60; + typedef UReg<0x05, 0x61, 0, 8> ADC_UNUSED_61; + typedef UReg<0x05, 0x62, 0, 8> ADC_UNUSED_62; + typedef UReg<0x05, 0x63, 0, 8> TEST_BUS_SP_SEL; + typedef UReg<0x05, 0x64, 0, 8> ADC_UNUSED_64; + typedef UReg<0x05, 0x65, 0, 8> ADC_UNUSED_65; + typedef UReg<0x05, 0x66, 0, 8> ADC_UNUSED_66; + typedef UReg<0x05, 0x67, 0, 16> ADC_UNUSED_67; // + ADC_UNUSED_68; + typedef UReg<0x05, 0x69, 0, 8> ADC_UNUSED_69; + + typedef UReg<0x05, 0xD0, 0, 32> VERYWIDEDUMMYREG; + + static const uint8_t OSD_ZOOM_1X = 0; + static const uint8_t OSD_ZOOM_2X = 1; + static const uint8_t OSD_ZOOM_3X = 2; + static const uint8_t OSD_ZOOM_4X = 3; + static const uint8_t OSD_ZOOM_5X = 4; + static const uint8_t OSD_ZOOM_6X = 5; + static const uint8_t OSD_ZOOM_7X = 6; + static const uint8_t OSD_ZOOM_8X = 7; + + static const uint8_t OSD_MENU_DISP_STYLE_VERTICAL = 0; + static const uint8_t OSD_MENU_DISP_STYLE_HORIZONTAL = 1; + + static const uint8_t OSD_ICON_NONE = 0; + static const uint8_t OSD_ICON_BRIGHTNESS = 1; + static const uint8_t OSD_ICON_CONTRAST = 2; + static const uint8_t OSD_ICON_HUE = 3; + static const uint8_t OSD_ICON_SOUND = 4; + static const uint8_t OSD_ICON_UP_DOWN = 8; + static const uint8_t OSD_ICON_LEFT_RIGHT = 9; + static const uint8_t OSD_ICON_VERTICAL_SIZE = 10; + static const uint8_t OSD_ICON_HORIZONTAL_SIZE = 11; + static const uint8_t OSD_ICON_COUNT = 8; + + static inline uint8_t osdIcon(uint8_t index) { + static const uint8_t osdIcons[8] = { + OSD_ICON_BRIGHTNESS, + OSD_ICON_CONTRAST, + OSD_ICON_HUE, + OSD_ICON_SOUND, + OSD_ICON_UP_DOWN, + OSD_ICON_LEFT_RIGHT, + OSD_ICON_VERTICAL_SIZE, + OSD_ICON_HORIZONTAL_SIZE, + }; + return osdIcons[index]; + } + + static const uint8_t OSD_COLOR_BLACK = 0; + static const uint8_t OSD_COLOR_BLUE = 1; + static const uint8_t OSD_COLOR_GREEN = 2; + static const uint8_t OSD_COLOR_CYAN = 3; + static const uint8_t OSD_COLOR_RED = 4; + static const uint8_t OSD_COLOR_MAGENTA = 5; + static const uint8_t OSD_COLOR_YELLOW = 6; + static const uint8_t OSD_COLOR_WHITE = 7; + + static const uint8_t OSD_FORMAT_YCBCR = 1; + static const uint8_t OSD_FORMAT_RGB = 0; +}; + + +#endif diff --git a/tw.h b/tw.h new file mode 100644 index 00000000..4c8c5fdd --- /dev/null +++ b/tw.h @@ -0,0 +1,372 @@ +#ifndef TW_H_ +#define TW_H_ + +#include + +namespace tw { + +enum class Signage { + UNSIGNED, + SIGNED +}; + +namespace detail { + +// Template to pick integer type to fit a register of a particular bit +// width and signedness +template +struct RegValue_ { + // Recursively try next largest bit width if there isn't a + // specialization + typedef typename RegValue_ < BitWidth + 1, Signed >::Type Type; +}; + +template<> +struct RegValue_<8, Signage::UNSIGNED> { + typedef uint8_t Type; +}; + +template<> +struct RegValue_<8, Signage::SIGNED> { + typedef int8_t Type; +}; + +template<> +struct RegValue_<16, Signage::UNSIGNED> { + typedef uint16_t Type; +}; + +template<> +struct RegValue_<16, Signage::SIGNED> { + typedef int16_t Type; +}; + +template<> +struct RegValue_<32, Signage::UNSIGNED> { + typedef uint32_t Type; +}; + +template<> +struct RegValue_<32, Signage::SIGNED> { + typedef int32_t Type; +}; + +template +using RegValue = typename RegValue_::Type; + +void rawRead(uint8_t addr, uint8_t reg, uint8_t* output, uint8_t size) +{ + Wire.beginTransmission(addr); + Wire.write(reg); + Wire.endTransmission(); + Wire.requestFrom(addr, size, static_cast(true)); + uint8_t rcvBytes = 0; + while (Wire.available()) + { + output[rcvBytes++] = Wire.read(); + } + +#if 0 + Serial.print("READ "); Serial.print(addr, HEX); Serial.print("@"); Serial.print(reg, HEX); Serial.print(": "); + for (uint8_t i = 0; i < size; ++i) { + Serial.print(output[i] >> 4, HEX); Serial.print(output[i] & 0xF, HEX); + } + Serial.println(); +#endif +} + +void rawWrite(uint8_t addr, uint8_t reg, uint8_t const* input, uint8_t size) +{ +#if 0 + Serial.print("WRITE "); Serial.print(addr, HEX); Serial.print("@"); Serial.print(reg, HEX); Serial.print(": "); + for (uint8_t i = 0; i < size; ++i) { + Serial.print(input[i] >> 4, HEX); Serial.print(input[i] & 0xF, HEX); + } + Serial.println(); +#endif + Wire.beginTransmission(addr); + Wire.write(reg); + Wire.write(input, size); + Wire.endTransmission(); +} + +// Number of bytes covered by a register with a particular offset and +// width +static constexpr uint8_t byteSize(uint8_t BitOffset, uint8_t BitWidth) { + return (BitOffset + BitWidth + 7) / 8; +} + +// Decode a register from the raw bytes it covers +template +RegValue regDecode(uint8_t* data) { + RegValue value; + // For the least significant byte, just shift off the leading bits + // we don't want + value = data[0] >> BitOffset; + // Append the rest of the bytes to the value. Note the correction + // by -BitOffset to line the positions up with the least significant + // byte above. + for (uint8_t i = 1; i < byteSize(BitOffset, BitWidth); ++i) { + value |= static_cast>(data[i]) << (8 * i - BitOffset); + } + // Mask off extraneous bits from the most significant byte + value &= (1 << BitWidth) - 1; + return value; +} + +template +RegValue regRead(uint8_t addr, uint8_t offset) { + static const uint8_t bs = byteSize(BitOffset, BitWidth); + uint8_t data[bs]; + rawRead(addr, offset, data, bs); + return regDecode(data); +} + +// This silences a compiler warning because GCC can't tell that a +// negative result only occurs when the if branch isn't taken +static inline uint8_t rightShift(uint8_t size, uint8_t offset) { + return 8 * (size - 1) - offset; +} + +// Encode a register into the raw bytes it covers +template +void regEncode(RegValue value, uint8_t* data) { + static const uint8_t bs = byteSize(BitOffset, BitWidth); + // Special case when only one byte is covered + if (bs == 1) { + // Create a mask of the specified width and position + static const uint8_t mask = static_cast(((1u << BitWidth) - 1) << BitOffset); + // Move value into position, mask it, and combine with existing + // data + data[0] = (data[0] & ~mask) | ((value << BitOffset) & mask); + } else { + // For the least significant byte, create a mask from the bit + // offset up + static const uint8_t mask = static_cast(0xFFu << BitOffset); + // Move value into position, mask it, and combine with existing + // data + data[0] = (data[0] & ~mask) | ((value << BitOffset) & mask); + // For remaining bytes other than the most significant, the entire + // byte is covered, so simply shift into position and truncate + for (uint8_t i = 1; i < bs - 1; ++i) { + data[i] = value >> (8 * i - BitOffset); + } + // For the most significant byte, create a mask for the covered + // lower bits + static const uint8_t mask2 = (1 << (BitWidth + BitOffset - (bs - 1) * 8)) - 1; + // Apply it. rightShift is really (8 * (bs - 1) - BitOffset), but + // gcc doesn't realize that bs - 1 can't be negative in this + // branch and warns about a negative shift value. The helper + // function silences the warning. + data[bs - 1] = (data[bs - 1] & ~mask2) | (value >> rightShift(bs, BitOffset)); + } +} + +template +void regWrite(uint8_t addr, uint8_t offset, RegValue value) { + static const uint8_t bs = byteSize(BitOffset, BitWidth); + uint8_t data[bs]; + if (BitOffset == 0 && BitWidth % 8 == 0) + memset(data, 0, sizeof(data)); + else + rawRead(addr, offset, data, bs); + regEncode(value, data); + rawWrite(addr, offset, data, bs); +} + +// Template to compute the range of byte offsets covered by a list of +// registers +template +struct RegRange {}; + +template<> +struct RegRange<> { + static const uint8_t start = 0xFF; + static const uint8_t end = 0x00; +}; + +template +struct RegRange { + private: + static const uint8_t tailStart = RegRange::start; + static const uint8_t tailEnd = RegRange::end; + static const uint8_t regEnd = Reg::byteOffset + byteSize(Reg::bitOffset, Reg::bitWidth); + public: + static const uint8_t start = Reg::byteOffset < tailStart ? Reg::byteOffset : tailStart; + static const uint8_t end = regEnd > tailEnd ? regEnd : tailEnd; +}; + +// Template to check whether a list of segmented registers are all in +// the same segment. +template +struct SegCompatible {}; + +template +struct SegCompatible { + static const bool compatible = true; + static constexpr SegValue segment = Reg::segment; +}; + +template +struct SegCompatible { + static const bool compatible = Reg1::segment == Reg2::segment && SegCompatible::compatible; + static constexpr SegValue segment = Reg1::segment; +}; + +} + +template +class Slave { + protected: + template + class Register { + static_assert(BitWidth <= 32, "Register too wide"); + static_assert(BitOffset < 8, "Register bit offset too large"); + + public: + static const uint8_t byteOffset = ByteOffset; + static const uint8_t bitOffset = BitOffset; + static const uint8_t bitWidth = BitWidth; + static const Signage signage = Signed; + + typedef detail::RegValue Value; + + static inline Value read(void) { + return detail::regRead(Addr, ByteOffset); + } + + static inline void write(Value value) { + detail::regWrite(Addr, ByteOffset, value); + } + }; + + // Ties several registers together so they can be + // read/written/modified in a single transaction. + template + class Tie { + public: + static void read(typename Regs::Value &... values) { + static const uint8_t start = detail::RegRange::start; + static const uint8_t end = detail::RegRange::end; + static const uint8_t size = end - start; + uint8_t data[size]; + detail::rawRead(Addr, start, data, size); + // We really want a regDecode statement for each register, but + // template parameter packs can only be expanded in expression + // list contexts such as function parameters or initializer + // lists. We turn each call into an int expression with the + // comma operator and capture the results into a dummy array. + // The attribute prevents gcc from warning about an unused + // variable. + int dummy[] __attribute__((unused)) = { + (values = detail::regDecode(data + Regs::byteOffset - start), 0)... + }; + } + + static void write(typename Regs::Value... values) { + static const uint8_t start = detail::RegRange::start; + static const uint8_t end = detail::RegRange::end; + static const uint8_t size = end - start; + uint8_t data[size]; + // FIXME: we can avoid this if registers are contiguous and + // aligned to byte boundaries at both start and end. The + // template logic for determining this would be a bit complex + // since we would need to sort the register list first. + detail::rawRead(Addr, start, data, size); + int dummy[] __attribute__((unused)) = { + (detail::regEncode(values, data + Regs::byteOffset - start), 0)... + }; + detail::rawWrite(Addr, start, data, size); + } + }; +}; + +template +class SegmentedSlave : public Slave { + private: + typedef tw::Slave Base; + template + using BaseReg = typename Base::template Register; + typedef BaseReg Segment; + + protected: + typedef typename Segment::Value SegValue; + + private: + static void setSeg(SegValue seg) { + static SegValue curSeg = Attrs::SegInitial; + if (curSeg != seg) { + Segment::write(seg); + curSeg = seg; + } + } + + public: + template + class Register : public BaseReg { + private: + typedef BaseReg Base; + public: + typedef typename Base::Value Value; + static const SegValue segment = Seg; + + static Value read(void) { + setSeg(Seg); + return Base::read(); + } + + static void write(Value value) { + setSeg(Seg); + Base::write(value); + } + }; + + template + class Tie : public Base::template Tie { + private: + static_assert(detail::SegCompatible::compatible, "Tied registers must all be in the same segment"); + static const SegValue segment = detail::SegCompatible::segment; + typedef typename Base::template Tie BaseTie; + + public: + static void read(typename Regs::Value &... values) { + setSeg(segment); + BaseTie::read(values...); + } + + static void write(typename Regs::Value... values) { + setSeg(segment); + BaseTie::write(values...); + } + + template + static void modify(Funcs... funcs) { + setSeg(segment); + BaseTie::modify(funcs...); + } + }; + + static void read(SegValue seg, uint8_t offset, uint8_t* output, uint8_t size) { + setSeg(seg); + detail::rawRead(Addr, offset, output, size); + } + + static uint8_t read(SegValue seg, uint8_t offset) { + uint8_t value; + read(seg, offset, &value, sizeof(value)); + return value; + } + + static void write(SegValue seg, uint8_t offset, uint8_t const* input, uint8_t size) { + setSeg(seg); + detail::rawWrite(Addr, offset, input, size); + } + + static void write(SegValue seg, uint8_t offset, uint8_t value) { + write(seg, offset, &value, sizeof(value)); + } +}; + +} + +#endif diff --git a/webui.html b/webui.html new file mode 100644 index 00000000..3b6c9991 --- /dev/null +++ b/webui.html @@ -0,0 +1,3135 @@ + + + + + GBS-Control + + + + + + + + + +
+
+ + + + + + + +
+
+
+
+ +
aspect_ratio
+
Resolution
+
+ +
    +
  • Choose an output resolution from these presets.
  • +
  • Your selection will also be used for startup. 1280x960 is recommended for NTSC sources, 1280x1024 for PAL. +
  • +
  • Use the "Matched Presets" option to switch between the two automatically (Preferences tab) +
  • +
+
+ + + + + + + +
+
+
+ +
input
+
Presets
+
+ +
    +
  • If you want to save your customizations, first select a slot for your new preset, then save to or load from that slot.
  • +
  • Selecting a slot also makes it the new startup preset.
  • +
+
+
+ + +
+
+
+ + + + + + + + + + + + +
+
+ +
code
+
Output
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+ + + diff --git a/webui_html.h b/webui_html.h new file mode 100644 index 00000000..a07bf90c --- /dev/null +++ b/webui_html.h @@ -0,0 +1,14149 @@ +const uint8_t webui_html[] PROGMEM = { + 0x1f, 0x8b, 0x08, 0x08, 0x48, 0xc9, 0x9f, 0x62, 0x02, 0x03, 0x77, 0x65, + 0x62, 0x75, 0x69, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0xbc, 0xfd, 0x6d, + 0xb3, 0xab, 0xba, 0x96, 0x2e, 0x08, 0x7e, 0xcf, 0x5f, 0xb1, 0xfb, 0x54, + 0x74, 0x44, 0xc7, 0x5d, 0x79, 0x62, 0xf2, 0x62, 0x3c, 0xa7, 0xf3, 0xe5, + 0x46, 0x1b, 0x83, 0xc0, 0xd8, 0xc8, 0x13, 0x81, 0x24, 0xd0, 0x37, 0x40, + 0x5e, 0xc6, 0x20, 0x30, 0xb6, 0xb1, 0x8d, 0xa9, 0xe8, 0xff, 0xde, 0x83, + 0xb5, 0xf7, 0x39, 0x79, 0xf2, 0x46, 0xde, 0x5b, 0x55, 0xd1, 0xd5, 0x7b, + 0xaf, 0x58, 0x7b, 0xce, 0x65, 0x63, 0x84, 0xa4, 0x31, 0x9e, 0x17, 0x90, + 0x86, 0xff, 0xed, 0xff, 0xe1, 0x1c, 0x36, 0x49, 0xf6, 0xed, 0xfe, 0x56, + 0x0d, 0xad, 0xfa, 0xef, 0xff, 0xf4, 0x6f, 0xf3, 0x8f, 0xdf, 0x54, 0xde, + 0x9d, 0xfe, 0xfd, 0x2f, 0xc7, 0xee, 0x2f, 0xff, 0xfd, 0x9f, 0x7e, 0xfb, + 0xed, 0xdf, 0xaa, 0x63, 0x2e, 0xe7, 0x5f, 0xe0, 0xd7, 0xf6, 0x38, 0xe4, + 0xbf, 0x95, 0x55, 0x7e, 0xbb, 0x1f, 0x87, 0x7f, 0xff, 0x0b, 0x4d, 0xd0, + 0x5f, 0xbf, 0xfe, 0xf2, 0xdb, 0xc7, 0x1f, 0x6f, 0x0e, 0xe7, 0x41, 0x1d, + 0xff, 0xbb, 0x67, 0xc7, 0x7f, 0xdd, 0x5c, 0xba, 0xe1, 0x76, 0x51, 0xff, + 0xf6, 0xf1, 0xfb, 0x4b, 0xbf, 0xbf, 0xad, 0xce, 0x5d, 0xf3, 0xdb, 0xed, + 0xa8, 0xfe, 0xfd, 0x2f, 0x6d, 0xde, 0x9d, 0x7f, 0x1e, 0xef, 0xc3, 0x5f, + 0x7e, 0xab, 0x6e, 0xc7, 0x9f, 0xff, 0xfe, 0x17, 0x99, 0x0f, 0xf9, 0xbf, + 0xe4, 0x7d, 0xaf, 0xce, 0x65, 0x3e, 0x9c, 0x2f, 0xdd, 0x47, 0x7d, 0xbf, + 0x74, 0xff, 0x5a, 0xe4, 0xf7, 0xe3, 0x72, 0xf1, 0xcf, 0xc7, 0xd7, 0xe5, + 0xb4, 0xdd, 0x04, 0x53, 0xee, 0xad, 0xde, 0x12, 0xad, 0x1e, 0x19, 0xd7, + 0xd5, 0xb6, 0x86, 0xd7, 0x1a, 0xb9, 0xa1, 0x1a, 0x7e, 0x16, 0x1d, 0x79, + 0x17, 0xc6, 0xeb, 0xbc, 0x5f, 0xff, 0x3a, 0xee, 0xff, 0xe8, 0xfd, 0x7b, + 0xc6, 0xad, 0xee, 0xd7, 0xfb, 0x2d, 0x7b, 0x6c, 0xcf, 0xaf, 0xdd, 0x76, + 0xb3, 0x3e, 0x0b, 0x8f, 0x4d, 0x99, 0x19, 0xf4, 0xa5, 0x4f, 0xfa, 0xc2, + 0x58, 0x9c, 0x0f, 0xe7, 0xf5, 0x99, 0x68, 0x41, 0x12, 0x19, 0xab, 0x87, + 0xf4, 0x83, 0x67, 0xb1, 0xb1, 0x63, 0xc1, 0xf5, 0xa7, 0xf4, 0xe8, 0xdf, + 0xce, 0x73, 0xce, 0x38, 0xbe, 0x09, 0x33, 0x78, 0x4a, 0x6e, 0x35, 0xa9, + 0x01, 0xed, 0xc0, 0xf5, 0xfd, 0x3a, 0xef, 0x39, 0x7c, 0x87, 0xce, 0xf6, + 0x15, 0xd6, 0xeb, 0xbf, 0x1d, 0xab, 0xe5, 0x1e, 0x1b, 0x04, 0x5b, 0xd5, + 0x85, 0x31, 0x3e, 0xcb, 0xf3, 0x76, 0xb9, 0xdd, 0x6c, 0xeb, 0xd0, 0xb1, + 0xeb, 0xd0, 0x13, 0xe7, 0xff, 0xb8, 0x06, 0xf5, 0xfb, 0xe7, 0xdb, 0x51, + 0x83, 0x63, 0xee, 0x9b, 0xf3, 0x1a, 0x7e, 0x27, 0x7d, 0x69, 0xda, 0xf7, + 0x2c, 0x6d, 0x7e, 0x5d, 0x93, 0xe8, 0xd8, 0xbd, 0xf0, 0x71, 0x5d, 0xb6, + 0x4c, 0x15, 0x7f, 0x3f, 0x66, 0xf5, 0xce, 0x39, 0x7b, 0x48, 0x0f, 0x69, + 0x39, 0x5f, 0x3d, 0x7e, 0x9d, 0xa3, 0xb3, 0x9f, 0x25, 0xf4, 0x3b, 0xe3, + 0x4a, 0xdb, 0xa7, 0x36, 0xbc, 0xaf, 0x57, 0x65, 0xd7, 0xfc, 0xed, 0x7a, + 0x5e, 0xf0, 0xf9, 0x56, 0xa4, 0xc1, 0x4f, 0xf8, 0x09, 0xe7, 0x26, 0x4a, + 0xa0, 0x55, 0x55, 0xfa, 0xf6, 0x3d, 0xe7, 0xb8, 0x92, 0x9e, 0x82, 0x31, + 0x0b, 0xa1, 0x3d, 0xbb, 0xcd, 0xf8, 0x38, 0x89, 0xf8, 0xf7, 0xeb, 0x83, + 0xf7, 0xfe, 0xf6, 0x7a, 0xf1, 0xab, 0xdd, 0x8d, 0xfd, 0xf9, 0xfb, 0xcf, + 0xf5, 0xaf, 0xf9, 0x29, 0xdb, 0xf0, 0xf7, 0x6b, 0x84, 0xeb, 0xc8, 0x92, + 0xbe, 0x2f, 0x38, 0xea, 0x44, 0xbc, 0x7a, 0x15, 0x6d, 0xf9, 0x99, 0xb5, + 0x68, 0x12, 0x49, 0xa6, 0xed, 0x3d, 0xc5, 0xa3, 0x66, 0x15, 0xcb, 0xc9, + 0xde, 0x13, 0x43, 0x3e, 0x23, 0x8a, 0xec, 0x88, 0x5a, 0x09, 0xe3, 0x15, + 0x62, 0x5c, 0xc2, 0xef, 0x41, 0x48, 0xe7, 0xd7, 0x58, 0xf8, 0x8a, 0x34, + 0x84, 0x7f, 0xbd, 0xdf, 0xac, 0x2e, 0x19, 0x95, 0xf1, 0xaf, 0xdf, 0x59, + 0x33, 0x46, 0x8d, 0xce, 0x09, 0xa3, 0xfa, 0xd1, 0xcb, 0x16, 0xf0, 0x5a, + 0xc7, 0x68, 0xe0, 0x1c, 0x5d, 0xc6, 0x19, 0x95, 0x4f, 0xe1, 0x6d, 0xf5, + 0x38, 0x45, 0x43, 0x69, 0xdc, 0x47, 0x19, 0xaf, 0x02, 0xe2, 0x8a, 0x4b, + 0xe8, 0xf5, 0x97, 0x18, 0xda, 0x4b, 0x18, 0xc3, 0xa1, 0x29, 0xa3, 0x5c, + 0x93, 0x01, 0x35, 0xe5, 0x90, 0xb7, 0x41, 0x27, 0xcd, 0x40, 0x27, 0x94, + 0xf8, 0x39, 0x43, 0x87, 0xa4, 0x1d, 0x6a, 0x8e, 0xd4, 0xf6, 0xe0, 0xf7, + 0x9a, 0x48, 0x31, 0x67, 0x7a, 0x25, 0xa8, 0x0a, 0xee, 0x30, 0x47, 0x0d, + 0x4e, 0xf1, 0x3e, 0x41, 0xc4, 0x94, 0xe9, 0xda, 0xca, 0x8d, 0x20, 0x2f, + 0x74, 0xa5, 0x15, 0x93, 0x22, 0x31, 0xed, 0xaf, 0x34, 0xc5, 0x8f, 0x83, + 0x53, 0x41, 0x3c, 0xac, 0x26, 0xca, 0xd6, 0x23, 0xe5, 0x55, 0x1b, 0x6b, + 0x3a, 0x65, 0xae, 0x24, 0x30, 0xdf, 0xd0, 0x87, 0xd5, 0x77, 0xe8, 0x30, + 0x18, 0x07, 0x3d, 0x4f, 0x34, 0xe8, 0x03, 0x1f, 0x6f, 0xa1, 0x37, 0x22, + 0xca, 0x44, 0x8c, 0x9d, 0x40, 0x3f, 0x36, 0x41, 0xf7, 0xab, 0xcf, 0x14, + 0x39, 0x11, 0x5f, 0x45, 0x61, 0x67, 0x7b, 0xb8, 0x1d, 0x9c, 0xdf, 0xc7, + 0xe6, 0xff, 0xef, 0x7f, 0x7d, 0xe2, 0x6c, 0x35, 0xf2, 0x1f, 0xff, 0xc6, + 0xf9, 0x79, 0xa5, 0xd1, 0x46, 0x30, 0xa6, 0x04, 0xff, 0x13, 0xfe, 0x0a, + 0x96, 0xa8, 0xef, 0xa8, 0xf9, 0x7b, 0xfb, 0x51, 0x7c, 0x5e, 0x9d, 0x29, + 0x0b, 0xf8, 0x9f, 0xd4, 0x7e, 0x4a, 0x98, 0xed, 0x0a, 0xfd, 0x8f, 0xf6, + 0xb9, 0x8c, 0x8e, 0x9e, 0xf0, 0x43, 0x57, 0xfc, 0x59, 0xed, 0x37, 0x39, + 0x25, 0xb6, 0xd4, 0xd8, 0x1f, 0xfd, 0x57, 0xd1, 0x5e, 0xaf, 0xe2, 0xc2, + 0xfd, 0x93, 0xfa, 0xdf, 0x88, 0x36, 0x6b, 0x25, 0xf9, 0x7b, 0x3c, 0xa4, + 0x2a, 0xda, 0x4d, 0x08, 0x31, 0xf5, 0x27, 0xb5, 0xdf, 0x56, 0x34, 0x74, + 0x08, 0xfa, 0x7b, 0xfb, 0x49, 0xf5, 0x38, 0xa4, 0x64, 0x43, 0xd4, 0x9f, + 0x35, 0xfe, 0x8a, 0x1c, 0xdc, 0xd5, 0x26, 0xfa, 0x5b, 0xfe, 0xc5, 0x2b, + 0xef, 0xe0, 0x05, 0x84, 0xfd, 0x59, 0xed, 0xd7, 0x41, 0x90, 0xc0, 0xfc, + 0xff, 0x91, 0xff, 0xb6, 0x78, 0x7f, 0x59, 0xc2, 0x95, 0xec, 0x4f, 0xea, + 0x3f, 0x63, 0x2d, 0xd1, 0x0b, 0x63, 0xc6, 0x27, 0xfb, 0x19, 0x99, 0xc8, + 0x2e, 0x4c, 0x71, 0x11, 0x2c, 0x78, 0x96, 0x14, 0x91, 0x9c, 0xc9, 0x5b, + 0xd6, 0x35, 0xcf, 0xa3, 0xb7, 0x78, 0x53, 0x5a, 0x89, 0xb2, 0x0e, 0x5e, + 0x79, 0x22, 0xdf, 0xa5, 0x23, 0xe9, 0x4e, 0x93, 0x93, 0x40, 0xff, 0x13, + 0x4c, 0xd1, 0x1a, 0x2d, 0xe4, 0xab, 0x4b, 0xd9, 0x8a, 0x3b, 0x47, 0x68, + 0x99, 0x27, 0xe8, 0x1c, 0x69, 0xf8, 0x0d, 0x38, 0x9c, 0x92, 0xe4, 0xf4, + 0xce, 0x34, 0x52, 0xf1, 0x76, 0x4c, 0x69, 0x53, 0x31, 0xe2, 0xa1, 0xbc, + 0x40, 0x32, 0x8e, 0xf5, 0xde, 0xe3, 0x29, 0x12, 0xac, 0x1d, 0xd2, 0x82, + 0x05, 0x03, 0x31, 0x46, 0x8f, 0x37, 0xe2, 0x99, 0xeb, 0xfd, 0xbd, 0xd0, + 0x83, 0x81, 0xb6, 0x68, 0x57, 0x30, 0x91, 0x93, 0xd4, 0xbe, 0xb1, 0x56, + 0xbd, 0x72, 0xf8, 0x4c, 0xc6, 0x7a, 0x9f, 0x73, 0xc4, 0xe6, 0xcf, 0xe4, + 0xf0, 0x19, 0x66, 0x54, 0xfe, 0xfc, 0x99, 0x82, 0xf5, 0x3c, 0xd7, 0xf1, + 0x40, 0x95, 0xdc, 0x17, 0x14, 0x3e, 0xd3, 0xd9, 0x37, 0xde, 0x56, 0x2f, + 0xaa, 0x04, 0xdd, 0x6b, 0x2c, 0x8f, 0x5b, 0x7c, 0x98, 0xb1, 0x18, 0x3e, + 0x47, 0x43, 0xda, 0x0f, 0x49, 0x0d, 0xc1, 0xde, 0x92, 0x6b, 0x68, 0x68, + 0x6f, 0xae, 0xc4, 0x8d, 0x26, 0xe1, 0xeb, 0xe8, 0xbb, 0x66, 0xe1, 0x8d, + 0x8b, 0x22, 0xb1, 0xad, 0x58, 0x07, 0x3e, 0x6f, 0x87, 0x86, 0x18, 0x56, + 0x80, 0xb9, 0x0e, 0xed, 0x06, 0x43, 0xd4, 0x22, 0x38, 0x3f, 0x06, 0x8e, + 0xab, 0xd2, 0x5c, 0x0f, 0xe0, 0xe7, 0x78, 0x61, 0xc6, 0x2a, 0x86, 0x31, + 0x7b, 0x09, 0x5d, 0x3e, 0x79, 0x2b, 0xd3, 0xd2, 0x1b, 0x58, 0x61, 0xda, + 0x4f, 0xd6, 0xd9, 0x88, 0xa7, 0xf6, 0x8b, 0x33, 0x31, 0x42, 0x60, 0xdd, + 0x4b, 0xa6, 0xbc, 0x92, 0x4a, 0x41, 0x3a, 0x94, 0x93, 0x66, 0xd8, 0x67, + 0x54, 0x54, 0xb4, 0x91, 0xfb, 0x8c, 0x49, 0x2f, 0xe3, 0x95, 0x1f, 0xc3, + 0xb9, 0xe1, 0xfc, 0x97, 0x82, 0x06, 0x15, 0x8c, 0x45, 0x02, 0xdc, 0xbd, + 0xe0, 0x74, 0xf5, 0x60, 0xaa, 0x3a, 0xe7, 0x1d, 0x8b, 0x0e, 0xc9, 0x49, + 0x3b, 0x38, 0xd9, 0x2b, 0x37, 0xfa, 0x40, 0xba, 0xd5, 0x95, 0x99, 0x04, + 0xcb, 0x9a, 0x6a, 0x85, 0x0a, 0x17, 0xf0, 0xd3, 0xc0, 0x8e, 0x6c, 0x63, + 0x2a, 0xf5, 0xe4, 0xfd, 0x75, 0x13, 0xec, 0xa4, 0x0b, 0x4e, 0xaa, 0x8c, + 0x89, 0x2b, 0x33, 0xfa, 0x05, 0x5c, 0x9f, 0xce, 0x3d, 0x6b, 0x11, 0x9a, + 0xa5, 0x95, 0x35, 0x8b, 0x1b, 0x31, 0x91, 0x0a, 0xcf, 0x2b, 0x60, 0x40, + 0xba, 0xc8, 0xda, 0xc0, 0x60, 0xfe, 0xc9, 0xc2, 0xb5, 0x5d, 0xe7, 0x0d, + 0xd3, 0xb0, 0xb9, 0xd6, 0x99, 0xb6, 0x6a, 0xb2, 0xee, 0x72, 0xcb, 0xeb, + 0xf2, 0x75, 0x54, 0x41, 0x14, 0x3a, 0xeb, 0xa9, 0x9c, 0x70, 0x78, 0x40, + 0xe5, 0x8b, 0xf0, 0x1e, 0x49, 0x47, 0xc2, 0xeb, 0xd2, 0x28, 0x9d, 0x6c, + 0xa2, 0x89, 0x9a, 0x0e, 0x88, 0x2c, 0x77, 0x26, 0xbe, 0x63, 0x25, 0x61, + 0x2e, 0xab, 0xb1, 0x48, 0x21, 0xbf, 0x75, 0xb2, 0x2f, 0x4d, 0xf1, 0x4a, + 0xe8, 0x48, 0x93, 0x2e, 0x7c, 0x85, 0x66, 0x10, 0xc5, 0x9d, 0x9d, 0x42, + 0xff, 0xcf, 0xa4, 0xa9, 0x9a, 0xa4, 0x45, 0xa1, 0x4c, 0x81, 0x06, 0xea, + 0xe6, 0x19, 0xb5, 0xd8, 0x0d, 0xe1, 0xdc, 0x07, 0x3f, 0xd8, 0x48, 0x64, + 0x5f, 0x65, 0x0b, 0xd7, 0x67, 0x58, 0x0d, 0x33, 0xdd, 0x5b, 0x9e, 0xe0, + 0x3c, 0x6b, 0x23, 0x03, 0xfa, 0xd2, 0x15, 0x7c, 0x61, 0xf1, 0x96, 0x5a, + 0x99, 0xf1, 0xba, 0x25, 0x94, 0x99, 0x94, 0x92, 0x3d, 0x6d, 0x67, 0xdc, + 0x40, 0x1e, 0x51, 0x41, 0x9d, 0xd5, 0x5b, 0x6b, 0x3f, 0xa1, 0xef, 0x50, + 0x61, 0x5a, 0xfa, 0xd1, 0x3b, 0x9f, 0xb6, 0x46, 0xac, 0x55, 0x7d, 0x5c, + 0x13, 0x76, 0xf4, 0xb4, 0x45, 0x9e, 0xe2, 0x1d, 0x4d, 0x98, 0x38, 0xb6, + 0x62, 0x93, 0x19, 0x72, 0x22, 0x4d, 0x5f, 0x95, 0x94, 0x2d, 0x09, 0x5d, + 0x81, 0x64, 0xea, 0x8d, 0xa3, 0x8b, 0x0f, 0xc4, 0xb5, 0x42, 0xdc, 0x90, + 0x8e, 0x76, 0xf6, 0x46, 0xa0, 0x7e, 0x77, 0x4c, 0xd4, 0x32, 0x53, 0xcc, + 0x2a, 0xba, 0x60, 0x77, 0xa4, 0x03, 0x34, 0x2b, 0xde, 0xa2, 0x95, 0x4e, + 0x64, 0x12, 0x33, 0x32, 0xed, 0xd7, 0xb1, 0x85, 0x7e, 0x53, 0x35, 0x51, + 0x0f, 0xe6, 0x99, 0xaf, 0xfc, 0x8c, 0x65, 0x6f, 0x51, 0xaf, 0x5f, 0x39, + 0x1d, 0xf7, 0xac, 0xc9, 0x26, 0x92, 0xac, 0x6f, 0xd4, 0x00, 0x9d, 0x95, + 0xba, 0x46, 0xcc, 0x64, 0x1b, 0x4e, 0xa4, 0xce, 0x27, 0x52, 0x51, 0x33, + 0x80, 0x38, 0xc4, 0x2a, 0x31, 0x64, 0x57, 0x26, 0xe2, 0x89, 0xeb, 0x8a, + 0xb2, 0x74, 0xfb, 0xa2, 0xa6, 0xe0, 0xa5, 0x12, 0x7d, 0xa6, 0xb0, 0xc6, + 0xe8, 0xb0, 0x28, 0x40, 0x41, 0x91, 0x46, 0x77, 0x8b, 0x36, 0x38, 0x48, + 0xd0, 0x27, 0xa4, 0xfd, 0xa5, 0x3f, 0x6b, 0xe9, 0xf7, 0x7a, 0x82, 0x90, + 0x20, 0x6a, 0x3b, 0x52, 0x1f, 0x5d, 0x8e, 0x6c, 0xfd, 0xe4, 0x7e, 0x4f, + 0xe3, 0xf6, 0x3e, 0x15, 0x28, 0xba, 0xc5, 0xaa, 0x7a, 0xc5, 0x0a, 0xbf, + 0x12, 0x2e, 0x9e, 0x61, 0xfb, 0x32, 0xf3, 0x84, 0x70, 0x9c, 0xaa, 0x20, + 0x37, 0xab, 0xa4, 0xe4, 0xe4, 0x19, 0xa9, 0x80, 0x88, 0xb6, 0x32, 0x13, + 0x07, 0xbb, 0x98, 0x5a, 0x7d, 0xb1, 0xf9, 0xd2, 0x25, 0xc3, 0xde, 0x81, + 0x56, 0x3c, 0x4b, 0xf1, 0x1b, 0x5a, 0x57, 0x0c, 0xa1, 0x5b, 0xe9, 0x8a, + 0x8a, 0x25, 0x32, 0x91, 0x29, 0xd1, 0x89, 0x57, 0x35, 0x19, 0xb3, 0xbb, + 0xc4, 0x41, 0x35, 0x6d, 0x82, 0xb4, 0xf0, 0xc4, 0x83, 0x6a, 0xf2, 0x76, + 0x74, 0xec, 0x96, 0x40, 0x1e, 0x32, 0x83, 0x68, 0xa1, 0x57, 0xf5, 0x39, + 0xba, 0x68, 0xc2, 0x97, 0xd7, 0x6c, 0x82, 0x5c, 0x34, 0x59, 0x28, 0x7c, + 0xc8, 0xbf, 0xf7, 0xca, 0x87, 0x71, 0x1d, 0x21, 0xde, 0xaf, 0xb1, 0x4e, + 0x36, 0xa5, 0xde, 0x47, 0x58, 0xd3, 0x77, 0x22, 0xb5, 0x75, 0xee, 0x56, + 0x37, 0xd1, 0x5c, 0xc6, 0xc8, 0x74, 0xdf, 0x85, 0x23, 0x63, 0xca, 0x58, + 0xbe, 0x9f, 0x82, 0xc7, 0x91, 0x22, 0x18, 0x63, 0xb2, 0xc7, 0xcd, 0x0a, + 0x09, 0xb7, 0xef, 0xa5, 0x71, 0xbf, 0x25, 0xcd, 0x2a, 0x4b, 0x14, 0x0e, + 0x99, 0x8f, 0x93, 0x78, 0x92, 0x31, 0x07, 0x28, 0x4f, 0x78, 0xb3, 0xa0, + 0x7c, 0x7c, 0x95, 0x3a, 0xda, 0xee, 0xb5, 0xf0, 0x95, 0x6b, 0x54, 0xa7, + 0xda, 0xd6, 0xcc, 0x68, 0xd0, 0x10, 0xfe, 0x05, 0xf9, 0x0d, 0x2d, 0x37, + 0xb8, 0x3f, 0x20, 0xfc, 0x3a, 0x76, 0x38, 0x87, 0x76, 0x3b, 0xc0, 0x82, + 0x20, 0x4f, 0x5c, 0x93, 0xd7, 0x64, 0x7b, 0xac, 0xed, 0x29, 0xa4, 0x41, + 0x9a, 0x43, 0x7f, 0xa2, 0xb9, 0x3f, 0x28, 0xa8, 0x4a, 0xae, 0xda, 0xbd, + 0x86, 0xb9, 0x6c, 0x41, 0x0b, 0xa2, 0xca, 0x04, 0xad, 0x99, 0x52, 0x13, + 0xbd, 0x63, 0xc3, 0xca, 0x4a, 0xea, 0xbe, 0x93, 0x69, 0x3d, 0xe6, 0x49, + 0x05, 0xf9, 0x4f, 0x3c, 0xd0, 0x51, 0x96, 0x38, 0xdf, 0xf5, 0x4c, 0x07, + 0x6c, 0x83, 0x6b, 0x2d, 0x8d, 0x5e, 0x91, 0xd6, 0xd5, 0x0a, 0x84, 0xb3, + 0x9d, 0x41, 0x5c, 0xda, 0x05, 0x15, 0xd3, 0x04, 0xe4, 0x88, 0x9c, 0xa4, + 0xd6, 0x07, 0x21, 0xc2, 0xdf, 0xb2, 0x75, 0xcd, 0x68, 0x22, 0x5a, 0xdc, + 0x89, 0xfe, 0x90, 0x20, 0x1b, 0xda, 0x4a, 0xf3, 0x44, 0xe8, 0x09, 0xc3, + 0x01, 0x7b, 0x0f, 0x66, 0x89, 0x82, 0x04, 0x62, 0x23, 0xcb, 0x5d, 0xe1, + 0x64, 0x9a, 0xbc, 0x86, 0xca, 0x56, 0x99, 0x4e, 0xad, 0xd8, 0xab, 0x76, + 0x4c, 0xeb, 0x9d, 0xd2, 0x41, 0xd7, 0xb8, 0xab, 0xb6, 0x85, 0x13, 0x54, + 0xd8, 0x11, 0xd0, 0xe3, 0xf2, 0x25, 0xd3, 0x20, 0x2a, 0x18, 0x68, 0x09, + 0xa3, 0x4f, 0x4a, 0x98, 0x3b, 0xc8, 0xb1, 0x7b, 0xa8, 0x04, 0x78, 0x1f, + 0x79, 0x15, 0x89, 0xea, 0x33, 0xca, 0x32, 0xce, 0x5f, 0x93, 0xe0, 0x8b, + 0x09, 0x70, 0x70, 0x3a, 0x72, 0xe5, 0xb3, 0x09, 0x74, 0xb0, 0xa9, 0xda, + 0xd2, 0xa9, 0x06, 0xe2, 0x43, 0x7c, 0x24, 0xf8, 0xcc, 0x3a, 0x14, 0x86, + 0x8d, 0xc5, 0x89, 0xf1, 0xb5, 0x90, 0xae, 0x34, 0xcb, 0x16, 0xa5, 0xc5, + 0x66, 0x38, 0x17, 0x1c, 0x6f, 0x42, 0x57, 0xf2, 0x48, 0x01, 0xde, 0x79, + 0x3a, 0x0d, 0xdb, 0x31, 0x06, 0x6c, 0xce, 0x88, 0xe9, 0xbe, 0x68, 0x3b, + 0x4f, 0x8a, 0x6a, 0x04, 0x8c, 0xe1, 0xc1, 0x67, 0x2f, 0xd9, 0x05, 0x01, + 0xd5, 0x83, 0x73, 0xde, 0xac, 0x76, 0x98, 0xf6, 0xaf, 0x18, 0x55, 0x0c, + 0x72, 0x38, 0x4f, 0x12, 0xe5, 0x25, 0x90, 0x5b, 0x80, 0x6b, 0xaf, 0xdd, + 0x74, 0x7a, 0x72, 0xd6, 0xb3, 0x24, 0xb1, 0xdf, 0x85, 0xa9, 0xf4, 0xd0, + 0xd3, 0x43, 0xd0, 0xe4, 0xb4, 0x6c, 0xe4, 0xb6, 0x74, 0xab, 0x5c, 0xe8, + 0x22, 0xc3, 0x2e, 0xc1, 0xa5, 0xbe, 0x36, 0xb1, 0xc9, 0x02, 0x68, 0x73, + 0xd6, 0xe2, 0x46, 0x41, 0xd9, 0x20, 0x75, 0xd7, 0x22, 0x89, 0x98, 0x20, + 0x9d, 0x6b, 0xc8, 0x15, 0xbf, 0x9c, 0xaa, 0x86, 0xd1, 0xf1, 0x4d, 0x90, + 0x40, 0xc4, 0x40, 0x3c, 0x54, 0xfd, 0x23, 0x03, 0xa6, 0xc1, 0x1d, 0x02, + 0x0c, 0x62, 0x0d, 0x68, 0xad, 0x9c, 0xba, 0xc1, 0x23, 0x34, 0xc8, 0x23, + 0x49, 0x99, 0x81, 0x21, 0xb2, 0xca, 0x24, 0xa8, 0xcb, 0x04, 0x65, 0xb1, + 0x26, 0xdf, 0x82, 0x07, 0x77, 0xec, 0x2a, 0x33, 0x9c, 0xd4, 0x2e, 0x36, + 0xee, 0x66, 0x42, 0xab, 0x4b, 0x58, 0x83, 0x35, 0x55, 0x80, 0xac, 0x6e, + 0x68, 0x26, 0xda, 0xa8, 0x91, 0x56, 0x66, 0x07, 0x16, 0xec, 0x24, 0x0d, + 0x96, 0xb1, 0x91, 0xcd, 0xf9, 0xcf, 0x88, 0xdf, 0x4c, 0x72, 0xa2, 0x2f, + 0xdc, 0x55, 0xdf, 0xc4, 0x25, 0x08, 0x2b, 0x95, 0x03, 0x57, 0xf0, 0xc2, + 0xc5, 0x11, 0x4b, 0xd9, 0x1b, 0xb0, 0xc5, 0x4e, 0x5c, 0x15, 0x15, 0x86, + 0x7c, 0xd3, 0x94, 0x2d, 0xc5, 0x1c, 0xb3, 0xb4, 0x5c, 0x84, 0x7e, 0x05, + 0x2c, 0x8c, 0xb7, 0x40, 0x65, 0x3c, 0x34, 0xe4, 0x52, 0xd2, 0xf0, 0x55, + 0x34, 0x8a, 0x48, 0x6d, 0xab, 0x13, 0xf0, 0xaf, 0xf0, 0xda, 0xab, 0xe0, + 0xfd, 0xb7, 0x6c, 0xd8, 0x3b, 0xf1, 0x2c, 0x17, 0xbb, 0xaf, 0xa7, 0x34, + 0x51, 0xc8, 0x9b, 0xde, 0x85, 0x98, 0x6b, 0x0a, 0x8f, 0xa5, 0x25, 0x1d, + 0x2a, 0x9e, 0xc8, 0xee, 0x00, 0x79, 0x2b, 0x98, 0x3d, 0x1c, 0x13, 0xa4, + 0xc3, 0x71, 0x66, 0xcc, 0x07, 0x4e, 0x1d, 0xd9, 0x67, 0xc6, 0x40, 0x42, + 0xad, 0x7f, 0x65, 0x06, 0xcb, 0x19, 0x2b, 0x9f, 0xb9, 0xab, 0xce, 0x80, + 0x19, 0x0e, 0x6e, 0x46, 0x94, 0x77, 0x81, 0x5e, 0xa4, 0x52, 0x4b, 0x50, + 0x9f, 0x32, 0xca, 0x74, 0xc8, 0x10, 0x23, 0x4a, 0x45, 0x46, 0xdd, 0x11, + 0xc6, 0x5a, 0x7d, 0x53, 0x4e, 0x26, 0xd0, 0x64, 0x03, 0x46, 0xd1, 0x8b, + 0xe8, 0x99, 0xc5, 0xe3, 0x01, 0xb8, 0x34, 0x7b, 0xe6, 0x48, 0x2d, 0x99, + 0x16, 0x02, 0x56, 0x22, 0x02, 0x71, 0x02, 0xb8, 0x29, 0xb4, 0xd2, 0xd5, + 0x45, 0xac, 0xc8, 0x86, 0x7a, 0xb8, 0x17, 0x1d, 0xb9, 0x94, 0x8d, 0x45, + 0x80, 0xb3, 0xdc, 0xb2, 0xb9, 0x1b, 0x72, 0xf6, 0x68, 0x75, 0x90, 0x60, + 0xde, 0xef, 0xc3, 0x94, 0xb5, 0xa1, 0x6f, 0x3f, 0xf1, 0x54, 0x21, 0xee, + 0xc9, 0x1d, 0x70, 0xd9, 0xbb, 0x34, 0x74, 0xb3, 0xa4, 0x10, 0x47, 0xed, + 0xa8, 0x87, 0xa9, 0xed, 0xb2, 0xcd, 0x60, 0xcb, 0x66, 0x40, 0x59, 0x27, + 0xed, 0xa4, 0xb9, 0x9b, 0x11, 0xa5, 0xb7, 0x02, 0x58, 0xa9, 0x70, 0xf0, + 0x93, 0x36, 0xee, 0x3b, 0xf4, 0x83, 0x17, 0xd3, 0xa4, 0x81, 0xdd, 0xec, + 0x05, 0xd7, 0xf8, 0xe2, 0xa8, 0x17, 0x10, 0x4f, 0x35, 0x33, 0x74, 0xcc, + 0xf9, 0xd6, 0x24, 0x29, 0xf1, 0x63, 0xc0, 0x3f, 0x8c, 0x82, 0x05, 0xc4, + 0xda, 0x37, 0x60, 0xfc, 0xe1, 0x48, 0x2f, 0xba, 0x6c, 0x60, 0x3c, 0x26, + 0x85, 0x20, 0x06, 0xc6, 0x1d, 0x8c, 0x3b, 0xa5, 0xca, 0x26, 0x26, 0x21, + 0xb9, 0x66, 0xe5, 0x70, 0x7d, 0x0c, 0x73, 0x14, 0x94, 0xed, 0xea, 0x82, + 0x1b, 0x15, 0x62, 0x53, 0x3c, 0xe3, 0x76, 0xa5, 0xa2, 0xb4, 0x7a, 0xee, + 0xb5, 0xcc, 0xca, 0x79, 0xf3, 0x24, 0xe7, 0xe1, 0x8d, 0xf9, 0xf0, 0xca, + 0x12, 0x0a, 0x39, 0x11, 0x4d, 0x70, 0x4d, 0x99, 0xd4, 0x7b, 0x1d, 0xb0, + 0x18, 0xb0, 0x51, 0x0d, 0x19, 0x30, 0x56, 0xd9, 0x60, 0x24, 0x13, 0x84, + 0x8b, 0xa9, 0xda, 0x61, 0x6f, 0xb8, 0x64, 0x53, 0xa9, 0x49, 0xbf, 0xca, + 0x13, 0x8f, 0x74, 0x92, 0xa3, 0x3c, 0xd3, 0x2e, 0x0b, 0xc0, 0x10, 0x4d, + 0x76, 0x32, 0x17, 0xbc, 0x5a, 0x16, 0xda, 0x1d, 0x3c, 0xf9, 0x6a, 0x64, + 0x3e, 0xc4, 0x4d, 0x57, 0x0d, 0x30, 0x26, 0xdb, 0x9d, 0x09, 0xac, 0xa1, + 0x57, 0x1b, 0xe6, 0x92, 0x67, 0xe8, 0x86, 0xda, 0xde, 0x24, 0x31, 0x6f, + 0x24, 0xcc, 0xab, 0xf0, 0x0a, 0xa5, 0x9a, 0x03, 0x0a, 0x1a, 0xf0, 0xef, + 0x51, 0xce, 0xc4, 0x52, 0x9a, 0x7d, 0x22, 0xb9, 0xba, 0x42, 0xfc, 0x23, + 0x89, 0x84, 0x9f, 0x3b, 0xcc, 0xa6, 0x5d, 0x66, 0x32, 0xdd, 0xd5, 0xb0, + 0x21, 0x61, 0x32, 0x03, 0x47, 0x34, 0x43, 0x78, 0x6c, 0x4a, 0x4b, 0x6a, + 0x30, 0xaf, 0x7c, 0xcc, 0x32, 0xce, 0x58, 0xd1, 0x0a, 0x2c, 0x5b, 0xc5, + 0x70, 0xd3, 0x68, 0x54, 0x5b, 0xe9, 0x79, 0x1a, 0xec, 0x12, 0x24, 0x2b, + 0x66, 0xda, 0x57, 0x51, 0x93, 0x68, 0x67, 0xaa, 0x3a, 0x31, 0x03, 0x04, + 0xe7, 0x0b, 0x62, 0x17, 0x3f, 0xa4, 0x86, 0xb2, 0x63, 0x53, 0x75, 0x45, + 0x8a, 0x74, 0x40, 0x1a, 0xab, 0xf4, 0x56, 0x2a, 0xaf, 0x6d, 0xef, 0xd8, + 0x35, 0x8b, 0x38, 0xb1, 0x01, 0x37, 0x88, 0x83, 0xb5, 0xc1, 0x93, 0xee, + 0x38, 0xc6, 0x70, 0xdd, 0x49, 0x2b, 0x22, 0xce, 0x07, 0x8d, 0xb6, 0xaf, + 0xd7, 0x11, 0xad, 0x17, 0x3b, 0xe3, 0xf4, 0xa4, 0x9d, 0x3c, 0x84, 0x35, + 0xa1, 0xa5, 0xd6, 0x53, 0x36, 0x31, 0x51, 0xd2, 0x2a, 0x3a, 0x52, 0x6a, + 0xfc, 0x43, 0xfb, 0x89, 0x48, 0xc1, 0xc7, 0x3b, 0x41, 0x22, 0xfc, 0xcb, + 0x08, 0x9a, 0xf1, 0x99, 0xf8, 0xa7, 0x57, 0x5c, 0x57, 0xe7, 0x43, 0xc2, + 0xba, 0xac, 0x25, 0x77, 0x4e, 0xbf, 0x5e, 0x42, 0xd9, 0x67, 0xe2, 0x6a, + 0x66, 0x61, 0x30, 0xad, 0xac, 0x19, 0x05, 0x8f, 0x7f, 0x85, 0x31, 0x34, + 0x72, 0x76, 0x1a, 0x81, 0xbf, 0x88, 0x30, 0xac, 0x36, 0xd1, 0x56, 0xaf, + 0x9d, 0x31, 0x28, 0xea, 0x49, 0x5f, 0x70, 0xd9, 0x51, 0x8e, 0x62, 0x0a, + 0x73, 0x06, 0x9c, 0x1f, 0x24, 0x9a, 0xf2, 0x43, 0x24, 0x31, 0x60, 0xa5, + 0x91, 0xd0, 0x00, 0xf0, 0x5c, 0x04, 0x85, 0xa6, 0x40, 0xb7, 0x8d, 0xbb, + 0xbc, 0x66, 0x01, 0xae, 0xd9, 0x1b, 0x7b, 0xe3, 0x25, 0x6b, 0xfb, 0x09, + 0xbb, 0xab, 0x65, 0xd1, 0x84, 0x8b, 0xd0, 0x5d, 0x21, 0xd9, 0x9d, 0x16, + 0x84, 0xb2, 0xf3, 0x6e, 0x0a, 0x26, 0xc6, 0x44, 0x4b, 0x6b, 0x52, 0x81, + 0xd7, 0x4f, 0x80, 0x3b, 0x44, 0x4e, 0x33, 0xe0, 0x5b, 0x76, 0x0d, 0x59, + 0x69, 0xd1, 0xd4, 0x06, 0x6d, 0x33, 0x1c, 0x78, 0x93, 0x2d, 0xe8, 0x64, + 0x6b, 0xd4, 0x1b, 0x70, 0xec, 0x0b, 0x9b, 0x37, 0x80, 0xf5, 0x2e, 0xf4, + 0x7f, 0xf3, 0xb5, 0x38, 0xfa, 0x84, 0x86, 0x06, 0xbe, 0x62, 0x4d, 0x79, + 0xb9, 0x63, 0x1b, 0xc0, 0xa7, 0xcb, 0xdc, 0x64, 0xdf, 0xa0, 0xa5, 0x46, + 0xda, 0x8a, 0x1b, 0xcc, 0xf6, 0x37, 0xc4, 0x8b, 0x8a, 0xdb, 0x20, 0x4d, + 0x1a, 0xfd, 0x1b, 0x70, 0x19, 0xe7, 0x2e, 0xf0, 0x3f, 0x68, 0xe8, 0xd8, + 0xef, 0x9d, 0x82, 0x53, 0x13, 0xb4, 0xe6, 0x22, 0xa2, 0x9a, 0xc9, 0x5d, + 0xf1, 0x94, 0x8e, 0x32, 0x04, 0x1c, 0x7e, 0x4c, 0xa4, 0x4d, 0xb9, 0x14, + 0xbc, 0xb3, 0xb7, 0xac, 0x59, 0x3c, 0x49, 0x8a, 0xc2, 0x9d, 0xa6, 0x8d, + 0x45, 0xc7, 0xce, 0x61, 0x8d, 0x19, 0x31, 0x04, 0x89, 0xda, 0x6c, 0x91, + 0xbb, 0x72, 0xe6, 0xe7, 0x28, 0x44, 0x6a, 0x93, 0x77, 0x76, 0xce, 0x26, + 0x79, 0x4e, 0xb4, 0x61, 0x0b, 0xef, 0x8d, 0xd8, 0x5f, 0x1b, 0xb1, 0xab, + 0x20, 0x57, 0xb7, 0x8b, 0x42, 0x03, 0x4e, 0x01, 0xed, 0x20, 0x9c, 0xea, + 0x1b, 0x72, 0x71, 0x02, 0x3c, 0xbd, 0x60, 0x2f, 0x30, 0x25, 0xf0, 0x78, + 0xee, 0x57, 0x8b, 0x03, 0x1f, 0x77, 0x24, 0xc1, 0x55, 0xe8, 0x93, 0x1d, + 0x9b, 0xef, 0xcb, 0x74, 0xe5, 0xc8, 0x53, 0xf6, 0x28, 0x7d, 0x69, 0x01, + 0x6f, 0x57, 0xbb, 0x79, 0xae, 0xcd, 0x20, 0x63, 0x3e, 0x7a, 0xd0, 0x4e, + 0x34, 0xc7, 0xb6, 0xca, 0x0f, 0x9e, 0xb0, 0x41, 0xcf, 0x2c, 0x0b, 0x0a, + 0xbc, 0xc0, 0x2e, 0x06, 0x60, 0x9b, 0x4f, 0x9b, 0xc5, 0x48, 0x14, 0x33, + 0x40, 0x53, 0x78, 0x87, 0x54, 0x09, 0x59, 0x57, 0x87, 0xdc, 0xb3, 0xe2, + 0xd2, 0x08, 0x02, 0xec, 0xb3, 0x2b, 0xf6, 0x70, 0x13, 0x37, 0x03, 0x93, + 0xe7, 0xaf, 0x27, 0xf6, 0x15, 0x03, 0x5f, 0x52, 0xd1, 0x1a, 0x51, 0xe6, + 0x57, 0x7b, 0x3a, 0xe1, 0x3e, 0xa6, 0xc1, 0x3d, 0x4a, 0xf1, 0x55, 0xb8, + 0xd4, 0x10, 0x31, 0x78, 0x09, 0x70, 0xf7, 0xb9, 0x31, 0xa6, 0x45, 0x27, + 0xe2, 0x70, 0xb3, 0x8a, 0xc2, 0x06, 0x74, 0x7b, 0x0a, 0xf3, 0x5e, 0x93, + 0x59, 0xf5, 0xf5, 0x54, 0x35, 0xc0, 0x7d, 0xab, 0x45, 0xc9, 0xe8, 0x33, + 0x4b, 0x82, 0x33, 0x78, 0x93, 0x1d, 0x68, 0x18, 0x0d, 0xda, 0xdf, 0x33, + 0xc6, 0x40, 0x2f, 0x10, 0xc8, 0xf9, 0x31, 0x11, 0xc6, 0x18, 0x4b, 0x27, + 0xa0, 0x39, 0xa0, 0x03, 0xd5, 0xf4, 0x09, 0x33, 0x95, 0xe6, 0xad, 0x3b, + 0xc6, 0x08, 0xf2, 0x8d, 0xd1, 0x17, 0x68, 0x45, 0x11, 0x35, 0xf2, 0x46, + 0x3a, 0x81, 0x4a, 0x77, 0x8c, 0x78, 0x53, 0x21, 0x96, 0x84, 0x37, 0xc0, + 0x7d, 0x3f, 0xe7, 0x2a, 0x10, 0x14, 0xe2, 0x13, 0x62, 0x0f, 0xbf, 0x57, + 0x49, 0x9c, 0x8a, 0x3d, 0xd6, 0xbe, 0x0c, 0x52, 0x03, 0x0e, 0x69, 0x84, + 0x97, 0xb5, 0x68, 0x85, 0x6e, 0xbb, 0x07, 0x17, 0x78, 0xa7, 0x16, 0x58, + 0xe8, 0xa4, 0x15, 0x93, 0xba, 0xe6, 0xc0, 0x95, 0x39, 0xb7, 0xbc, 0x64, + 0xb2, 0x15, 0x68, 0xd3, 0x3b, 0xef, 0xc8, 0x9d, 0xb8, 0xab, 0x77, 0xde, + 0xaa, 0x07, 0x6b, 0xc8, 0x24, 0xbb, 0xcb, 0x3b, 0x53, 0x30, 0x9e, 0x7c, + 0xd0, 0x05, 0x5b, 0xeb, 0x1c, 0xfa, 0xc0, 0x5c, 0x98, 0xbb, 0x39, 0xd6, + 0xfc, 0xca, 0x10, 0x2e, 0x9c, 0x2b, 0xb5, 0x37, 0xdc, 0x97, 0x30, 0x36, + 0x08, 0xe2, 0x1a, 0x69, 0xa0, 0x2f, 0x62, 0x51, 0xe3, 0x8e, 0x37, 0x56, + 0x15, 0x6b, 0x8c, 0xf1, 0xf3, 0xfd, 0x26, 0x54, 0x85, 0x73, 0x13, 0xf1, + 0x92, 0x12, 0x4d, 0x80, 0xa4, 0xce, 0xdd, 0xaf, 0x17, 0xa7, 0xa3, 0xca, + 0x6a, 0xb5, 0xcd, 0x9a, 0x1e, 0xc7, 0x1d, 0x16, 0x22, 0xed, 0xb3, 0x84, + 0xd9, 0xbb, 0x23, 0x1f, 0xce, 0x79, 0x0a, 0x5c, 0x08, 0x6d, 0x94, 0x5c, + 0xe6, 0x00, 0x95, 0x1e, 0x71, 0x47, 0xd0, 0xb5, 0x56, 0x7c, 0x40, 0xe8, + 0x5a, 0xd6, 0x8d, 0x79, 0x88, 0x87, 0x99, 0x17, 0x9f, 0x19, 0x0f, 0x50, + 0x02, 0x63, 0x82, 0x3d, 0xa5, 0xcb, 0xb4, 0x02, 0xcd, 0xad, 0x1c, 0xe9, + 0xb9, 0xb7, 0xb8, 0xb1, 0x52, 0xd9, 0x35, 0x6f, 0xc6, 0xc7, 0x2b, 0xa6, + 0x7a, 0xc8, 0x3d, 0x05, 0xb6, 0x48, 0x45, 0x09, 0xc5, 0x4f, 0xac, 0x2a, + 0x1d, 0x62, 0xc2, 0x14, 0x46, 0x78, 0xe3, 0x3e, 0xfa, 0x16, 0x0e, 0xd6, + 0xc1, 0x97, 0x7a, 0x99, 0xde, 0xb3, 0x63, 0x22, 0xf0, 0x91, 0x55, 0x2f, + 0xac, 0xb3, 0x20, 0xf7, 0xc1, 0x1b, 0x19, 0xd5, 0x24, 0x93, 0x20, 0x8c, + 0xdb, 0x8a, 0x31, 0x2a, 0x7d, 0xea, 0x34, 0x26, 0xd5, 0x30, 0x0d, 0x41, + 0xdd, 0x96, 0x49, 0x36, 0x1d, 0xfd, 0x00, 0xf4, 0xb7, 0xd2, 0xa4, 0x06, + 0x78, 0x56, 0xdb, 0x8c, 0x3b, 0x6a, 0x57, 0x32, 0xb1, 0xa0, 0x74, 0x75, + 0x83, 0x9c, 0x05, 0xbf, 0xa7, 0x9e, 0xc4, 0x0c, 0xf6, 0xc4, 0x50, 0x09, + 0x4e, 0xed, 0x84, 0xfa, 0x01, 0xc9, 0x75, 0xd6, 0x46, 0x1a, 0xc4, 0x13, + 0x78, 0xd5, 0x58, 0x1b, 0x6d, 0x32, 0x05, 0x1d, 0x60, 0xa5, 0x41, 0x5d, + 0xb8, 0x1e, 0x88, 0x0f, 0xe1, 0x59, 0xaf, 0x03, 0x92, 0x6d, 0xa2, 0xa4, + 0x59, 0x50, 0xbc, 0x01, 0x5f, 0xda, 0x40, 0x44, 0x8c, 0x30, 0x76, 0x1d, + 0x68, 0xb3, 0x1b, 0x6d, 0xc8, 0x39, 0xf4, 0xfb, 0x4d, 0xc1, 0x07, 0x2f, + 0x76, 0x07, 0x5a, 0xa0, 0x0a, 0xae, 0x68, 0xb5, 0x08, 0xdb, 0x15, 0x68, + 0x77, 0x6c, 0x81, 0xe7, 0xa1, 0xf3, 0x98, 0xee, 0xf5, 0xed, 0x42, 0x4e, + 0x28, 0x8e, 0xdb, 0xcb, 0x33, 0x54, 0xd5, 0x15, 0x9f, 0xbf, 0x16, 0xe1, + 0x04, 0x28, 0xe2, 0x41, 0x16, 0x69, 0xaf, 0x97, 0x74, 0xfb, 0x65, 0xcc, + 0xab, 0x0b, 0xa7, 0x90, 0x53, 0x09, 0xbb, 0x27, 0x06, 0xe1, 0xb4, 0xae, + 0xb6, 0x10, 0x9b, 0x3a, 0x78, 0x3b, 0x55, 0x72, 0x36, 0x81, 0x7e, 0x20, + 0x91, 0x29, 0x46, 0xe6, 0x8a, 0x7d, 0x09, 0xf8, 0x9a, 0x4f, 0x8c, 0x1f, + 0x15, 0x6a, 0x32, 0x13, 0x11, 0x4c, 0xc5, 0x58, 0xb8, 0xae, 0xc5, 0xcf, + 0x03, 0x66, 0xcd, 0xeb, 0xc5, 0x5d, 0x6c, 0x12, 0xa3, 0x7f, 0xf1, 0x36, + 0xe8, 0x43, 0x77, 0xd4, 0x80, 0x73, 0x76, 0x80, 0x97, 0x26, 0xe7, 0x38, + 0x00, 0xfd, 0xff, 0xa2, 0x86, 0xb4, 0xe3, 0x9a, 0x6d, 0x98, 0x31, 0xdc, + 0x62, 0xa6, 0x5e, 0x91, 0xca, 0x34, 0xec, 0x90, 0x25, 0xd5, 0x94, 0x06, + 0x9a, 0x30, 0x67, 0xfa, 0x69, 0xa2, 0x46, 0x70, 0x03, 0xaf, 0x71, 0x2d, + 0x9b, 0xad, 0x9e, 0x53, 0xb9, 0x29, 0xdf, 0x2b, 0x87, 0xf2, 0x0c, 0xce, + 0x89, 0xe3, 0x82, 0x92, 0x7c, 0xaf, 0x03, 0x37, 0xb6, 0x52, 0x17, 0x3a, + 0xf2, 0x00, 0xef, 0xdc, 0x63, 0x2b, 0xe3, 0xd2, 0x9d, 0xbd, 0x01, 0x19, + 0x72, 0x55, 0x25, 0x99, 0xb9, 0x7d, 0x15, 0x8e, 0xb8, 0x70, 0x16, 0x6c, + 0x58, 0x57, 0x5d, 0x84, 0xc9, 0xd4, 0x51, 0xe1, 0x74, 0xa7, 0x2b, 0xb6, + 0xd7, 0x50, 0x7c, 0x60, 0x72, 0x71, 0xec, 0xec, 0x83, 0xd0, 0x82, 0x03, + 0xf8, 0x3b, 0x93, 0x82, 0x06, 0x2b, 0x13, 0x99, 0x1f, 0xbd, 0x51, 0x3f, + 0xa6, 0xc8, 0x95, 0x33, 0x16, 0xf9, 0xa0, 0x91, 0x37, 0xc3, 0x2b, 0x61, + 0xac, 0x8f, 0x0c, 0x10, 0x0b, 0x6d, 0x03, 0x1a, 0x3f, 0xd8, 0x1e, 0x41, + 0xdd, 0x83, 0x26, 0xd6, 0x48, 0x1a, 0xbe, 0x4a, 0x8d, 0xde, 0xc2, 0xa9, + 0x31, 0x0a, 0x17, 0x68, 0xcf, 0x60, 0x23, 0xa9, 0x51, 0x53, 0x68, 0xc3, + 0x52, 0x7a, 0x3a, 0x80, 0x90, 0x78, 0x11, 0x54, 0x5a, 0x07, 0x24, 0x1c, + 0x66, 0xbc, 0x0c, 0x82, 0xdc, 0x91, 0x72, 0xbd, 0x13, 0x9a, 0x00, 0x0e, + 0x50, 0x0d, 0xa9, 0xa3, 0xe9, 0x08, 0xfa, 0x83, 0x1a, 0x4a, 0x83, 0xcf, + 0x8d, 0x54, 0x97, 0x1a, 0x68, 0xc1, 0x3c, 0x37, 0x18, 0x68, 0x1c, 0xd0, + 0x24, 0xda, 0x62, 0x91, 0x41, 0x9e, 0xc0, 0x98, 0xf9, 0xd1, 0xe4, 0x1a, + 0x49, 0x22, 0x17, 0xb9, 0x52, 0x17, 0xc6, 0xbf, 0x80, 0xf3, 0xd9, 0x36, + 0xf6, 0x83, 0x06, 0xf8, 0x82, 0x94, 0x9d, 0xd8, 0x0a, 0xaf, 0x52, 0xc2, + 0x09, 0x2e, 0xb1, 0x31, 0x78, 0x19, 0x8b, 0x46, 0xc8, 0x72, 0x04, 0x1a, + 0x01, 0x7c, 0x01, 0x4e, 0xb1, 0xd6, 0x23, 0xa1, 0x37, 0xef, 0xa3, 0x27, + 0x96, 0xd8, 0xc7, 0x0f, 0x4e, 0xd1, 0x95, 0x36, 0x30, 0xa3, 0xd4, 0x02, + 0xad, 0x14, 0xea, 0x7b, 0x1d, 0x35, 0x25, 0x78, 0x8e, 0x98, 0xde, 0x5f, + 0xa0, 0xcf, 0xfc, 0x9d, 0xa6, 0xeb, 0x65, 0x1b, 0x8c, 0xa1, 0x91, 0x01, + 0xf6, 0x82, 0x4e, 0xd6, 0xb0, 0x8d, 0x13, 0x65, 0x4b, 0x27, 0xb3, 0x8e, + 0xe7, 0x55, 0x9f, 0xe8, 0xc2, 0x21, 0x09, 0x7b, 0x50, 0x27, 0x83, 0xfc, + 0x09, 0x6e, 0xa4, 0x45, 0x24, 0xe4, 0x16, 0xe8, 0x4a, 0xc9, 0xcb, 0x0e, + 0x9f, 0xa5, 0x63, 0xd7, 0xb2, 0xd5, 0xeb, 0x43, 0x9a, 0x2d, 0x42, 0x2f, + 0xbc, 0x95, 0x69, 0x04, 0x3e, 0xd6, 0x05, 0xcf, 0x5f, 0x29, 0xa6, 0x97, + 0x26, 0xe1, 0xc8, 0x4e, 0x14, 0x20, 0x37, 0x03, 0x1c, 0x68, 0x85, 0x4f, + 0x3a, 0xf2, 0x92, 0xe0, 0x51, 0x73, 0xd4, 0x27, 0x09, 0x6b, 0xde, 0x51, + 0x12, 0x80, 0x37, 0xc1, 0x9d, 0x04, 0x7d, 0x94, 0x20, 0x05, 0xca, 0x4a, + 0x4d, 0x9c, 0xd9, 0xe0, 0x01, 0x7b, 0x88, 0x15, 0x79, 0x4b, 0x66, 0x1c, + 0xf5, 0x46, 0x0f, 0x0c, 0xd9, 0x08, 0xbe, 0xd1, 0x22, 0x5c, 0xda, 0xbc, + 0x96, 0x96, 0xe4, 0x7a, 0x5d, 0xb6, 0xe4, 0xc9, 0xa0, 0x6f, 0x38, 0x11, + 0xa0, 0xa7, 0xad, 0xab, 0x98, 0x84, 0x9b, 0x34, 0x6a, 0xbf, 0xd7, 0xc0, + 0x51, 0x74, 0xfd, 0x8e, 0x73, 0xb2, 0xe1, 0x94, 0xd9, 0xb1, 0x51, 0x5d, + 0x49, 0xbb, 0xf2, 0xa3, 0x4e, 0x5e, 0x19, 0x47, 0xd7, 0xfd, 0xfb, 0xeb, + 0xc6, 0xba, 0x70, 0xe4, 0xee, 0x02, 0xae, 0x50, 0xdd, 0x0a, 0x5d, 0xdd, + 0x71, 0x5b, 0x2d, 0x41, 0x93, 0x1d, 0x8e, 0x1e, 0x70, 0x33, 0x0d, 0x28, + 0x9d, 0xb6, 0x0b, 0x88, 0xd4, 0x1d, 0xf8, 0xb7, 0x45, 0xce, 0xfa, 0x07, + 0xe0, 0xd7, 0x12, 0xe6, 0x33, 0x04, 0x8d, 0x93, 0x44, 0x10, 0x47, 0xa0, + 0xb7, 0xcd, 0xa8, 0xc9, 0xde, 0x59, 0x03, 0x5a, 0xb1, 0x0b, 0xee, 0xac, + 0x13, 0x5d, 0xd2, 0xf4, 0x3d, 0x56, 0x88, 0x27, 0x9e, 0xda, 0x94, 0x0e, + 0x69, 0x12, 0x4e, 0xe2, 0x78, 0xaa, 0x7a, 0xa2, 0xd6, 0x5a, 0xd1, 0x92, + 0x33, 0xe8, 0x6a, 0x2d, 0x9e, 0xf5, 0x05, 0xed, 0x0f, 0xe0, 0x76, 0xdf, + 0xd8, 0x94, 0x07, 0xe0, 0x82, 0x1b, 0xe8, 0xe3, 0x1d, 0x33, 0xe5, 0x3e, + 0x32, 0x86, 0x4d, 0x96, 0x54, 0xe0, 0x04, 0x84, 0x11, 0x99, 0xd5, 0xed, + 0xc8, 0x50, 0x90, 0x3b, 0xd1, 0xab, 0xd0, 0xed, 0x28, 0xd3, 0x83, 0x31, + 0x76, 0x22, 0x9d, 0x37, 0xe1, 0x8b, 0x6a, 0xe2, 0x19, 0xb5, 0xa5, 0x4e, + 0x98, 0x34, 0x92, 0xa9, 0xd1, 0x29, 0x62, 0x67, 0x6c, 0xe0, 0x79, 0x1c, + 0x75, 0xd1, 0x9e, 0x6e, 0x91, 0x26, 0x6c, 0xf0, 0xd5, 0x1e, 0x75, 0x4a, + 0x33, 0x47, 0xc2, 0x0b, 0x3d, 0xc0, 0x27, 0xaf, 0x22, 0xd2, 0x5d, 0xa5, + 0xa5, 0x5e, 0xd9, 0x61, 0x83, 0x1f, 0xa5, 0x62, 0xa0, 0x7b, 0x5f, 0xc6, + 0xc1, 0xb1, 0x15, 0x78, 0x99, 0x25, 0xe8, 0xca, 0xef, 0x63, 0xab, 0x7c, + 0xde, 0x7c, 0xcd, 0xe7, 0x7f, 0x13, 0xae, 0x19, 0x8c, 0x66, 0x66, 0x38, + 0xe7, 0x52, 0x1d, 0x0c, 0x24, 0xad, 0xb6, 0x3b, 0x5d, 0x46, 0xb2, 0xc5, + 0x84, 0xba, 0x84, 0x1c, 0xdd, 0xad, 0x59, 0xf0, 0x55, 0x1a, 0x7a, 0x63, + 0x15, 0x37, 0xe1, 0x94, 0x53, 0x71, 0x88, 0x35, 0x7c, 0x60, 0x86, 0xb8, + 0x48, 0xa5, 0x1e, 0x61, 0x67, 0xeb, 0x82, 0x82, 0x67, 0x9b, 0xd8, 0x33, + 0xa4, 0x72, 0xe2, 0xca, 0x6e, 0x62, 0x33, 0x03, 0xdd, 0x13, 0xde, 0x88, + 0x33, 0x3f, 0x77, 0xaa, 0x66, 0x2c, 0xdb, 0x51, 0x53, 0x40, 0xbb, 0xe3, + 0x9d, 0x79, 0x2f, 0x88, 0x7f, 0xf0, 0x86, 0x8e, 0x00, 0x9f, 0x8f, 0x4c, + 0xdc, 0x96, 0x6f, 0xdc, 0x8a, 0x9e, 0x4e, 0xb2, 0xa7, 0x3a, 0x5c, 0x4f, + 0xb2, 0x35, 0x18, 0x78, 0xb5, 0xa4, 0x61, 0x6e, 0xd8, 0x65, 0x6f, 0xe2, + 0x56, 0x8b, 0x9d, 0x56, 0x4e, 0xbc, 0xed, 0xcf, 0xb4, 0x51, 0xe7, 0xa3, + 0x8b, 0x2f, 0x10, 0xc7, 0x36, 0xf6, 0xd8, 0x8d, 0xb6, 0x24, 0x88, 0xe7, + 0x67, 0x31, 0x93, 0xdd, 0x45, 0x53, 0x00, 0x3a, 0x5f, 0x9d, 0x33, 0x2a, + 0x32, 0xa1, 0x55, 0x80, 0x6b, 0xca, 0xc2, 0x89, 0x74, 0xf7, 0x9a, 0xfe, + 0xe6, 0xad, 0xf5, 0x2e, 0x3d, 0x3c, 0x80, 0x97, 0x42, 0xa2, 0xc1, 0x4b, + 0xe9, 0xdb, 0x67, 0x9e, 0x40, 0x1c, 0x24, 0xb6, 0x05, 0xba, 0xf6, 0xfb, + 0xc8, 0x00, 0xbf, 0xcd, 0xc0, 0x15, 0x0c, 0xf0, 0xdf, 0x65, 0xef, 0xd2, + 0x69, 0xde, 0x49, 0x63, 0x0d, 0xb4, 0x66, 0x7b, 0xf0, 0xd7, 0x5e, 0xd9, + 0x56, 0xdd, 0x2f, 0x1c, 0xf2, 0xe1, 0xd8, 0xa6, 0xea, 0xa3, 0x94, 0xd9, + 0x90, 0xab, 0xe0, 0x51, 0xc0, 0x0b, 0xb5, 0xa3, 0x5d, 0x78, 0xe5, 0x0d, + 0x1b, 0x8a, 0x11, 0xd5, 0xfb, 0x7f, 0x1c, 0x2f, 0x72, 0x26, 0xb5, 0xac, + 0x0d, 0x96, 0x7b, 0xc3, 0x0a, 0x8a, 0x96, 0xa1, 0xbc, 0x85, 0xf1, 0x70, + 0x33, 0xad, 0x04, 0x6f, 0x04, 0x7c, 0xc2, 0xb3, 0x54, 0x3c, 0x12, 0x04, + 0xf9, 0xa6, 0xa9, 0x21, 0xd7, 0xc4, 0x35, 0xf1, 0xe9, 0x2b, 0x37, 0x05, + 0xe8, 0x9f, 0xca, 0x14, 0xdd, 0x65, 0x8a, 0xb4, 0x85, 0x26, 0xe9, 0x48, + 0x69, 0xba, 0x1e, 0x45, 0x2a, 0x41, 0x05, 0xc8, 0x28, 0x4b, 0x83, 0x06, + 0xfc, 0x6d, 0x9f, 0x78, 0x6c, 0x0f, 0xd8, 0xa1, 0x43, 0xce, 0xd5, 0x07, + 0x66, 0x67, 0x94, 0x8f, 0x02, 0x7c, 0xac, 0xca, 0x9d, 0xe0, 0xcd, 0x3d, + 0x0b, 0x54, 0x39, 0x7e, 0x0b, 0xfd, 0xf2, 0x04, 0x4c, 0xae, 0xc1, 0x0f, + 0x9d, 0xa5, 0x87, 0xb5, 0x22, 0x21, 0xe0, 0xdd, 0xb3, 0xb7, 0xe8, 0x18, + 0x82, 0x7e, 0xa8, 0xd0, 0x0c, 0x6c, 0xe2, 0x50, 0x73, 0x6f, 0x20, 0x0c, + 0x5a, 0xf2, 0x1c, 0x53, 0xd2, 0xe2, 0x54, 0xfa, 0x80, 0x3d, 0x5d, 0x88, + 0x40, 0x33, 0x77, 0xf6, 0x85, 0x1a, 0xba, 0x96, 0xf1, 0xd1, 0x06, 0x5d, + 0x78, 0xff, 0x85, 0x3f, 0xe7, 0x21, 0x28, 0xcd, 0x20, 0x8d, 0x93, 0xc8, + 0xc0, 0x8e, 0x9d, 0xf2, 0x46, 0x8f, 0xc4, 0x44, 0x4c, 0xea, 0x91, 0x2a, + 0x6c, 0x75, 0x78, 0x4d, 0x54, 0xf2, 0x3d, 0x74, 0x2c, 0x8d, 0xfe, 0xf8, + 0xfc, 0xa0, 0x83, 0x47, 0x23, 0x2c, 0x25, 0xbb, 0xb0, 0x5d, 0x58, 0x45, + 0x2d, 0x2f, 0xb1, 0x1e, 0x5a, 0x78, 0x22, 0xe0, 0x13, 0x57, 0xdb, 0x52, + 0x5b, 0xb9, 0xf9, 0x66, 0x58, 0x1e, 0xdc, 0xd5, 0x02, 0x3c, 0xe1, 0xa3, + 0xa8, 0x05, 0xc2, 0x06, 0xdb, 0xe5, 0xae, 0xb5, 0x81, 0xd8, 0xc6, 0x19, + 0x27, 0x77, 0xd0, 0x22, 0x46, 0xf1, 0x5e, 0xd5, 0xbc, 0x41, 0x29, 0x75, + 0xb1, 0x13, 0xb6, 0xbd, 0x46, 0x4c, 0x06, 0x9e, 0x7a, 0x61, 0xd0, 0x04, + 0xce, 0xeb, 0xa0, 0x1b, 0x45, 0x6a, 0x0b, 0xba, 0x26, 0x2b, 0xc0, 0xf3, + 0xc4, 0x4a, 0xc5, 0x21, 0x67, 0x09, 0x6b, 0x57, 0xb7, 0x52, 0x55, 0x76, + 0xa4, 0x30, 0x96, 0x35, 0xe8, 0x1d, 0x5f, 0x3e, 0x63, 0x57, 0x56, 0x05, + 0x87, 0x7e, 0xd4, 0x62, 0x60, 0xf3, 0x3d, 0x28, 0x45, 0x2e, 0xac, 0xb9, + 0x6b, 0x89, 0xa1, 0xf6, 0x07, 0xd7, 0xd5, 0xc0, 0x4b, 0x04, 0xe0, 0x5e, + 0x13, 0xe9, 0xcd, 0x7e, 0x51, 0x39, 0x90, 0xef, 0x9b, 0xd2, 0x40, 0xb9, + 0x68, 0x57, 0x28, 0xf1, 0x03, 0xeb, 0xa8, 0x9a, 0x51, 0xe8, 0x62, 0x0f, + 0x3e, 0xea, 0x05, 0x33, 0x02, 0x18, 0x39, 0x7c, 0x43, 0x1c, 0x36, 0x45, + 0x52, 0x65, 0x51, 0x57, 0x01, 0x86, 0x08, 0xc2, 0x1a, 0x3d, 0xc0, 0x3a, + 0x66, 0x39, 0xf8, 0x0a, 0x3c, 0x21, 0xc8, 0x4c, 0x3b, 0x0b, 0x53, 0xb1, + 0x39, 0xb8, 0x08, 0xb4, 0x1d, 0x03, 0xef, 0xc9, 0x92, 0x38, 0xc1, 0x64, + 0x6f, 0xa2, 0x0d, 0x6e, 0x2a, 0xf0, 0x9f, 0xaf, 0xd9, 0x8b, 0xbe, 0x7e, + 0x69, 0x35, 0xa4, 0xf4, 0xbc, 0x23, 0x01, 0xf0, 0xa3, 0x79, 0xec, 0xe8, + 0x4d, 0xc4, 0x2b, 0x97, 0x72, 0x01, 0xfc, 0xa7, 0x67, 0x39, 0xc4, 0x19, + 0x75, 0xab, 0x08, 0xb7, 0x6c, 0x91, 0x40, 0x3f, 0x32, 0xf5, 0x2b, 0xdf, + 0x83, 0x1d, 0xa8, 0x6f, 0x68, 0xef, 0x06, 0x7a, 0x0f, 0x34, 0x82, 0xae, + 0x61, 0x5f, 0x7e, 0xc7, 0xcc, 0x5d, 0x60, 0xd3, 0xc6, 0x07, 0xd0, 0x02, + 0x14, 0x74, 0x57, 0x04, 0x99, 0xbf, 0x9f, 0x58, 0x7e, 0x6c, 0xd9, 0x12, + 0x64, 0xa4, 0x45, 0x1d, 0x25, 0x60, 0xfe, 0xfe, 0xc0, 0x23, 0x16, 0x44, + 0xc6, 0x98, 0x67, 0xa0, 0x0d, 0x44, 0x5a, 0x61, 0xe1, 0xc9, 0xe7, 0x11, + 0xb4, 0x7b, 0xd1, 0xd9, 0x0e, 0x87, 0x98, 0x8d, 0x1a, 0x4d, 0xcb, 0x34, + 0x76, 0x10, 0xde, 0xf8, 0xe4, 0x9d, 0x7b, 0x93, 0x9b, 0xbb, 0x75, 0xf0, + 0x06, 0x22, 0x5c, 0xd5, 0x03, 0xd6, 0xa7, 0x09, 0xd7, 0x4c, 0x70, 0xe7, + 0x56, 0x99, 0x56, 0xf7, 0xdc, 0x01, 0xdf, 0xce, 0xad, 0x34, 0x61, 0xc1, + 0xf5, 0xa8, 0x48, 0x58, 0x7a, 0x21, 0x30, 0x50, 0x39, 0x46, 0x1d, 0xa3, + 0x45, 0x33, 0x5e, 0x0b, 0x24, 0x86, 0xbc, 0x76, 0x17, 0xd2, 0x13, 0x1a, + 0x61, 0x55, 0x12, 0x73, 0xfd, 0x06, 0x73, 0xf0, 0x7d, 0x54, 0xec, 0x3b, + 0x9c, 0x70, 0x1a, 0x9f, 0xef, 0x1a, 0x78, 0xb2, 0xa8, 0x30, 0x33, 0x2d, + 0x37, 0x20, 0x8e, 0x75, 0x3b, 0x0e, 0xe9, 0xb0, 0x80, 0x18, 0x9b, 0x68, + 0x1d, 0x90, 0xc4, 0x94, 0x79, 0x04, 0x3e, 0x21, 0x7b, 0xaf, 0x76, 0xa1, + 0x8b, 0x01, 0xe7, 0xd8, 0x25, 0x4b, 0x88, 0x8a, 0xf9, 0x10, 0xd2, 0xd6, + 0x5a, 0x26, 0x35, 0x20, 0xbb, 0x6f, 0x0f, 0x89, 0x1e, 0xe8, 0x59, 0xc3, + 0x9e, 0x91, 0x8e, 0x3a, 0x3a, 0x05, 0xdb, 0x4c, 0x43, 0xf7, 0xa4, 0x19, + 0x9e, 0x59, 0xab, 0xac, 0x63, 0xc2, 0xae, 0x59, 0x82, 0xcc, 0x03, 0xeb, + 0x05, 0xe8, 0xe5, 0x30, 0x9a, 0x64, 0x55, 0x02, 0x06, 0xc9, 0x74, 0xfb, + 0x2c, 0xdd, 0xf0, 0x0d, 0x98, 0x78, 0xcb, 0xc1, 0x67, 0xc4, 0x9d, 0xba, + 0x85, 0xac, 0xcf, 0x76, 0xa6, 0x30, 0xb1, 0x31, 0xb2, 0x12, 0x09, 0x17, + 0x1b, 0x43, 0x9e, 0xa9, 0xcb, 0x82, 0xa7, 0xc8, 0x00, 0x0e, 0x07, 0x7f, + 0x99, 0x3d, 0x0b, 0x7d, 0x3d, 0x25, 0xe6, 0x56, 0x83, 0xf1, 0xd2, 0x72, + 0x07, 0x81, 0xfe, 0x20, 0x5d, 0xec, 0x49, 0xc0, 0x31, 0xdc, 0x80, 0x9f, + 0x1b, 0x42, 0x16, 0x34, 0x31, 0x57, 0x51, 0x8e, 0x82, 0x6f, 0x98, 0xaf, + 0x27, 0x79, 0x7f, 0x99, 0xb3, 0xaf, 0x95, 0x6c, 0x7e, 0x36, 0x2d, 0x21, + 0x06, 0x82, 0x9e, 0xf8, 0xe2, 0x0e, 0x5e, 0x27, 0x3b, 0xb8, 0xe5, 0x02, + 0xfc, 0x71, 0x18, 0x19, 0x8d, 0x1e, 0x2a, 0xd1, 0xe5, 0xed, 0xfc, 0x0c, + 0x64, 0xf1, 0x3c, 0x42, 0xbc, 0x02, 0x47, 0xc0, 0x98, 0x8c, 0xe7, 0x88, + 0xae, 0x50, 0x0e, 0xfa, 0x0e, 0xf4, 0xf6, 0x3b, 0x49, 0x6d, 0x94, 0x74, + 0xaa, 0x2e, 0xf4, 0xfe, 0x02, 0x3e, 0x6e, 0x3a, 0xb2, 0x48, 0xdb, 0x1b, + 0xd5, 0x9b, 0x3b, 0xa4, 0x0f, 0xe3, 0x55, 0x02, 0xba, 0xd8, 0xcd, 0x68, + 0x69, 0x1d, 0x99, 0x7c, 0x84, 0xef, 0x21, 0x2d, 0x5d, 0x96, 0x81, 0xbe, + 0xbd, 0x80, 0x4a, 0xa8, 0x00, 0x89, 0x46, 0xc0, 0xa1, 0xa6, 0x44, 0xe5, + 0x2d, 0xd1, 0xf4, 0x67, 0x3e, 0xad, 0xdf, 0xb2, 0x8d, 0x6e, 0x89, 0x21, + 0xdd, 0x9d, 0x4e, 0x8c, 0x63, 0x5d, 0x4e, 0xa2, 0xc5, 0xe1, 0xc1, 0xc3, + 0x1e, 0xe4, 0xcf, 0x0b, 0xf0, 0x35, 0x81, 0x78, 0x87, 0x9c, 0x52, 0xde, + 0x91, 0xdf, 0x47, 0xae, 0x84, 0x9d, 0x73, 0x6c, 0x73, 0x15, 0x6a, 0xe0, + 0x47, 0x3d, 0x9c, 0x8a, 0xdb, 0x01, 0x30, 0x2a, 0xa6, 0xa7, 0xe7, 0x5e, + 0x53, 0x4e, 0xac, 0x4a, 0x0d, 0x3e, 0x6f, 0xc5, 0x3e, 0xba, 0x12, 0x14, + 0xf0, 0xd0, 0xab, 0x80, 0x3f, 0xee, 0x6f, 0xca, 0x71, 0x4e, 0x94, 0xc4, + 0xdc, 0x03, 0x6d, 0x40, 0xc1, 0xbb, 0x74, 0x81, 0x83, 0x21, 0x07, 0xc1, + 0xc3, 0x86, 0xdc, 0x91, 0x87, 0xbd, 0x0e, 0x1c, 0xe2, 0xd8, 0x9d, 0xa4, + 0xe5, 0x8b, 0xa8, 0x13, 0xf8, 0x11, 0x71, 0x2b, 0xe8, 0x08, 0x1a, 0x81, + 0x59, 0x09, 0x78, 0xc3, 0x32, 0x25, 0x11, 0x78, 0xa1, 0x4b, 0x98, 0x10, + 0x18, 0xc7, 0xf2, 0x0d, 0x7d, 0x6b, 0x42, 0x83, 0xb9, 0xd1, 0x7b, 0x30, + 0x8e, 0x09, 0xca, 0x12, 0x2a, 0x39, 0x68, 0xd4, 0x0c, 0x9b, 0x55, 0xf0, + 0x07, 0x1f, 0x8a, 0x23, 0xe8, 0xad, 0xf9, 0x8e, 0xb3, 0x68, 0xb7, 0x93, + 0x00, 0xad, 0x83, 0x75, 0xfb, 0xb5, 0x37, 0xd9, 0x50, 0x7a, 0x6c, 0xdc, + 0x4d, 0x6c, 0x17, 0xa9, 0xe8, 0x95, 0x38, 0x78, 0xc0, 0x5a, 0xb5, 0x04, + 0x6e, 0x1a, 0x72, 0x3d, 0xd8, 0x4a, 0x63, 0xb5, 0xcd, 0x38, 0x7a, 0x40, + 0x4c, 0xea, 0xf3, 0xfd, 0x2e, 0xd9, 0x34, 0x0b, 0xd0, 0x6f, 0xa0, 0x23, + 0x95, 0x1b, 0xea, 0x41, 0x9d, 0x31, 0x35, 0x3f, 0x37, 0xe8, 0x41, 0x73, + 0x7c, 0x43, 0xcc, 0x42, 0x4f, 0xf4, 0x3f, 0xc6, 0x47, 0x6e, 0xc0, 0xe3, + 0x1c, 0x00, 0xfb, 0x55, 0x5c, 0xa3, 0xb7, 0xd0, 0x5e, 0x8b, 0x03, 0x78, + 0x69, 0x9c, 0xb8, 0x6f, 0x9c, 0x9e, 0x9e, 0x82, 0x89, 0x7b, 0xa4, 0x59, + 0x56, 0x42, 0xc7, 0xed, 0xc1, 0x17, 0x3b, 0xac, 0xc4, 0x0b, 0xf4, 0x5d, + 0x0c, 0xf9, 0xb4, 0x27, 0x0d, 0x68, 0x36, 0xd4, 0x93, 0x64, 0xda, 0x3e, + 0x71, 0xfc, 0xf5, 0x4c, 0x6a, 0x66, 0x86, 0x53, 0x35, 0xe6, 0xad, 0x04, + 0x2f, 0xa4, 0xce, 0x51, 0xeb, 0x6a, 0x34, 0x65, 0xec, 0xd8, 0x62, 0xe8, + 0x83, 0xb2, 0xc0, 0xe3, 0x07, 0x60, 0xa0, 0x04, 0xd3, 0xfa, 0x0e, 0xeb, + 0xa8, 0xc2, 0xfa, 0x09, 0x74, 0x6d, 0xa4, 0x81, 0xcf, 0xda, 0x96, 0x26, + 0xba, 0x26, 0xed, 0x4a, 0x97, 0xef, 0xfb, 0x58, 0x32, 0xf2, 0xc4, 0x5c, + 0xdc, 0x58, 0x4d, 0xb5, 0xf9, 0x9e, 0x36, 0x45, 0x38, 0x28, 0xb8, 0xee, + 0x45, 0x1a, 0xdb, 0x40, 0x1c, 0x3f, 0x0a, 0x2e, 0xf5, 0xb2, 0x41, 0xaa, + 0xa8, 0xc9, 0x77, 0xae, 0xc8, 0x3e, 0xd2, 0xc8, 0x7b, 0x3f, 0xd9, 0xd7, + 0xdc, 0x17, 0x4f, 0x18, 0xdf, 0xdb, 0x7c, 0x2f, 0x39, 0x04, 0x8c, 0x88, + 0xf9, 0x09, 0xf4, 0xd8, 0xca, 0xa2, 0x9d, 0x7d, 0xcb, 0x14, 0x71, 0x24, + 0x70, 0x10, 0xe8, 0xb7, 0x2e, 0x4e, 0xc4, 0x26, 0x4a, 0x4a, 0x98, 0xff, + 0x60, 0x29, 0x29, 0xc4, 0x9e, 0xa1, 0x60, 0x22, 0xd0, 0x81, 0xf1, 0xe0, + 0x1b, 0x9f, 0x87, 0x43, 0xa1, 0x90, 0x41, 0x4c, 0x09, 0x56, 0x0d, 0xf0, + 0x4d, 0x13, 0xf1, 0xb1, 0xde, 0xbe, 0xca, 0xce, 0x6e, 0x31, 0x72, 0x8d, + 0xa8, 0xbd, 0x2c, 0x0e, 0x34, 0x60, 0x25, 0xd7, 0x0f, 0x2c, 0x15, 0x0d, + 0x51, 0x95, 0x73, 0x70, 0x87, 0x50, 0xf2, 0x71, 0x3a, 0xf8, 0x70, 0x0e, + 0xbd, 0x4a, 0x00, 0x93, 0x5f, 0x33, 0x5e, 0x44, 0x86, 0xb4, 0xa2, 0x94, + 0x6c, 0x8e, 0x5d, 0xa3, 0xb1, 0xf7, 0xca, 0x07, 0x2f, 0x65, 0x26, 0xc6, + 0xd0, 0x65, 0x13, 0x8c, 0x35, 0xaf, 0xb6, 0xe0, 0x59, 0xeb, 0xb8, 0xcb, + 0xac, 0x3c, 0x45, 0xa0, 0x99, 0x85, 0x1b, 0x72, 0x7d, 0x11, 0x33, 0xd0, + 0x15, 0x26, 0x99, 0x22, 0x1a, 0x04, 0xc7, 0x78, 0xd8, 0x82, 0x0e, 0xd9, + 0xc5, 0x8e, 0xdc, 0x00, 0x5e, 0x7a, 0x71, 0xdb, 0x37, 0xf1, 0x84, 0xe3, + 0x30, 0x1e, 0xc0, 0xaf, 0xe3, 0x20, 0xe3, 0xc3, 0x3b, 0x31, 0xc4, 0x0e, + 0x22, 0xe5, 0xbb, 0x74, 0x55, 0x4a, 0x75, 0x3c, 0x15, 0x93, 0xdc, 0xc3, + 0x10, 0x2b, 0xf0, 0x0c, 0xdb, 0xc2, 0x2f, 0xe7, 0xe7, 0x4b, 0x36, 0x68, + 0xc3, 0x67, 0x61, 0xf4, 0x31, 0x9c, 0xe7, 0x41, 0x9a, 0xcb, 0x3b, 0x36, + 0x40, 0x0b, 0x76, 0x36, 0x3d, 0xa6, 0x80, 0xfb, 0xe0, 0xef, 0x0b, 0x63, + 0x78, 0x83, 0xef, 0x32, 0x0b, 0xdf, 0xae, 0x12, 0xba, 0xaa, 0xa5, 0x51, + 0xd5, 0x80, 0x3f, 0x22, 0x66, 0xf8, 0x11, 0x7b, 0x3d, 0x8f, 0x99, 0x4d, + 0x40, 0xcb, 0xef, 0x81, 0xcf, 0x13, 0xea, 0x54, 0x3b, 0xea, 0x6d, 0xdf, + 0xb9, 0xa7, 0x7e, 0x8f, 0x9f, 0xa6, 0xda, 0x1f, 0xf9, 0x98, 0x33, 0x33, + 0x30, 0x38, 0x62, 0x06, 0xeb, 0x20, 0xf7, 0x92, 0xea, 0x1b, 0xa3, 0xe8, + 0x09, 0xda, 0x65, 0x07, 0xfc, 0xeb, 0xb0, 0x49, 0x2e, 0xca, 0xf7, 0xe0, + 0xc9, 0xe6, 0xa4, 0x41, 0x5b, 0x17, 0xd0, 0x9b, 0xfb, 0xa3, 0xa7, 0xa6, + 0x12, 0x55, 0x90, 0x0d, 0x8a, 0x60, 0xbd, 0xd7, 0x39, 0xef, 0x1f, 0xa0, + 0x99, 0xf2, 0x90, 0x0f, 0x24, 0x33, 0xaa, 0x10, 0xe2, 0xc4, 0xc9, 0xc1, + 0xd3, 0x64, 0x4a, 0x5e, 0xa3, 0xe4, 0xa4, 0x95, 0xac, 0x0f, 0x18, 0xf8, + 0x56, 0x89, 0x58, 0x18, 0xe9, 0x80, 0x05, 0xee, 0xcb, 0x48, 0x7c, 0xf8, + 0x5d, 0x9d, 0x74, 0x6c, 0xf6, 0xbb, 0xbc, 0x46, 0x9b, 0xa8, 0xae, 0x36, + 0xb2, 0x16, 0x4e, 0x46, 0x17, 0x66, 0x82, 0xa2, 0x31, 0xa4, 0xc8, 0x4a, + 0x3a, 0xe4, 0x96, 0x0c, 0x7b, 0x39, 0xf4, 0x91, 0x50, 0xe4, 0x52, 0x13, + 0x3f, 0x0e, 0xa8, 0x57, 0x58, 0xb3, 0x8c, 0x83, 0x2b, 0x40, 0xd5, 0xad, + 0x6c, 0x0a, 0x57, 0x16, 0xa6, 0x41, 0x98, 0x1b, 0x42, 0x2b, 0x41, 0xef, + 0x01, 0x1e, 0x71, 0xd1, 0x58, 0xfb, 0xdc, 0x08, 0xc8, 0xce, 0xc4, 0x99, + 0x48, 0x00, 0x0b, 0x6b, 0xe9, 0x50, 0xd0, 0xdf, 0xe0, 0x35, 0x06, 0xea, + 0x29, 0x11, 0x1b, 0xf2, 0x02, 0xb3, 0x5f, 0xe7, 0x53, 0xf9, 0xdc, 0xe9, + 0xec, 0xce, 0x9a, 0xe1, 0xc5, 0xd4, 0xc9, 0x82, 0x98, 0x48, 0xc1, 0x63, + 0x86, 0xa1, 0x5e, 0x0d, 0xb2, 0xd1, 0x9d, 0xf9, 0x1e, 0x7b, 0x82, 0xe4, + 0x23, 0xf7, 0xac, 0x96, 0x33, 0x79, 0x87, 0xd8, 0x79, 0x46, 0xd3, 0xfa, + 0x09, 0x8a, 0x44, 0xe5, 0xa9, 0x1d, 0x08, 0x6d, 0xe4, 0x85, 0x86, 0x9f, + 0x91, 0xea, 0xdb, 0x63, 0x7b, 0xd1, 0x0b, 0x2e, 0x2e, 0xb9, 0x17, 0x34, + 0xd2, 0xcc, 0xac, 0xb2, 0x01, 0x6c, 0x50, 0xb2, 0x3f, 0xa6, 0xe4, 0x0a, + 0xd8, 0x7f, 0x66, 0xa6, 0x3d, 0x11, 0x4d, 0x2d, 0x84, 0x2f, 0x17, 0x52, + 0x5d, 0x9e, 0xa0, 0x11, 0x5c, 0xd0, 0x01, 0x23, 0x68, 0xa5, 0x25, 0xf8, + 0x97, 0x73, 0x7e, 0x1e, 0x6e, 0x79, 0xaa, 0x68, 0xe8, 0xa2, 0x3b, 0xf8, + 0x98, 0x70, 0xbe, 0x2f, 0x1f, 0xa5, 0xb6, 0x00, 0x5d, 0x60, 0x72, 0x47, + 0x45, 0xb8, 0xce, 0x5e, 0x71, 0x3b, 0x92, 0x68, 0x22, 0xfd, 0xd1, 0x9d, + 0xef, 0x3d, 0xeb, 0xa0, 0xdd, 0xd6, 0x5a, 0xc9, 0xad, 0x1d, 0x69, 0x03, + 0x1a, 0xbb, 0x4c, 0x4f, 0x7c, 0xbb, 0x65, 0x74, 0x7b, 0x23, 0x29, 0x7a, + 0xc3, 0x31, 0x2a, 0x04, 0x3c, 0x05, 0x9c, 0x72, 0x43, 0x27, 0xb8, 0x42, + 0x8e, 0x85, 0xc7, 0xae, 0x37, 0xc1, 0x3a, 0xc1, 0x88, 0xea, 0x6d, 0xd8, + 0xa2, 0x18, 0xfc, 0x5b, 0x90, 0x31, 0x16, 0x1f, 0x99, 0x80, 0xeb, 0xed, + 0xdb, 0xa2, 0x46, 0xcf, 0x38, 0x09, 0xec, 0xac, 0xa9, 0x58, 0xee, 0xa3, + 0x8c, 0xd4, 0xf6, 0xad, 0x30, 0x44, 0x16, 0xb6, 0x56, 0xbe, 0x37, 0x4e, + 0xaf, 0xa2, 0x21, 0x69, 0xa2, 0xb2, 0x27, 0x07, 0x2c, 0x8b, 0x6b, 0xb9, + 0xc9, 0x1b, 0x06, 0x5a, 0x9d, 0x5a, 0x05, 0x62, 0xe0, 0x39, 0xe0, 0x38, + 0x5d, 0x2e, 0xc1, 0x87, 0xaa, 0x43, 0x52, 0xe9, 0xa2, 0x06, 0xed, 0xc7, + 0xd1, 0x77, 0xd8, 0x28, 0x74, 0x74, 0x23, 0xeb, 0xd8, 0x58, 0x3b, 0x88, + 0x8b, 0x0a, 0x78, 0xf6, 0x8d, 0x75, 0x02, 0x9e, 0xcd, 0x7e, 0x51, 0x37, + 0xd2, 0xca, 0x6e, 0xbb, 0x10, 0x4a, 0x5c, 0x40, 0xdb, 0x04, 0x90, 0x23, + 0x49, 0xe1, 0x8e, 0xf9, 0xaf, 0x7b, 0x95, 0x8d, 0xe0, 0xe1, 0x66, 0x95, + 0x44, 0x89, 0x32, 0x71, 0x3c, 0x44, 0x0c, 0xf4, 0x32, 0x78, 0x98, 0x0d, + 0x69, 0xaa, 0x1b, 0xef, 0xc8, 0x35, 0xe3, 0x81, 0x1f, 0x7a, 0xc3, 0x24, + 0x50, 0x05, 0x8a, 0x15, 0xdb, 0xf3, 0x7d, 0x14, 0xe2, 0xea, 0x6f, 0x41, + 0xd1, 0x2e, 0xa1, 0x55, 0x5a, 0xfa, 0xae, 0x76, 0xe4, 0xdb, 0xd7, 0xd1, + 0xb7, 0x17, 0x07, 0x8f, 0x69, 0x34, 0x71, 0x35, 0xec, 0xac, 0x4d, 0xd6, + 0x91, 0x90, 0x68, 0xcc, 0x01, 0x5e, 0x05, 0x1f, 0x18, 0x82, 0x3a, 0x06, + 0x9f, 0xe0, 0xbb, 0xf3, 0x1a, 0xa7, 0x1d, 0x71, 0x84, 0x4b, 0xd3, 0xe8, + 0x26, 0x1b, 0xf2, 0xa2, 0x3e, 0x5c, 0x4f, 0x87, 0x02, 0xd9, 0x0c, 0x57, + 0xf0, 0xe6, 0x55, 0xee, 0x41, 0x4e, 0x38, 0xea, 0x00, 0x31, 0x6e, 0x27, + 0x1a, 0x7b, 0x80, 0x86, 0x7d, 0x27, 0x8e, 0x3d, 0xc4, 0xd0, 0x0f, 0x9e, + 0x08, 0x60, 0xb2, 0xd5, 0xb3, 0xf0, 0xac, 0x37, 0x43, 0xae, 0x1e, 0x03, + 0x16, 0xc5, 0x0c, 0x82, 0xfd, 0x3d, 0xf4, 0x45, 0x2a, 0xb7, 0xc9, 0xfb, + 0x6e, 0xc5, 0x0d, 0xe8, 0x0f, 0x6f, 0xa1, 0x11, 0x87, 0x1c, 0x4a, 0x43, + 0xb9, 0xe0, 0x69, 0x6e, 0xa5, 0x36, 0xe6, 0x1c, 0xb8, 0x0b, 0x70, 0x2c, + 0x91, 0xc6, 0xd8, 0x1e, 0x1d, 0xe9, 0x72, 0x3a, 0x5a, 0x10, 0xf3, 0x1b, + 0xf0, 0x25, 0x67, 0xa9, 0x57, 0x29, 0x6d, 0x56, 0xd3, 0xc1, 0xbb, 0x2f, + 0x12, 0x85, 0xc2, 0xdc, 0x67, 0x29, 0x4f, 0xec, 0x07, 0xe4, 0x7f, 0x25, + 0x38, 0xeb, 0x0b, 0xb3, 0x6a, 0xe2, 0x56, 0x55, 0xe0, 0xfb, 0xbf, 0xa5, + 0x03, 0xee, 0x8f, 0xaa, 0x51, 0xea, 0x0d, 0xe0, 0x1f, 0x36, 0x8a, 0x14, + 0x74, 0xf9, 0x24, 0xad, 0x98, 0x5b, 0x31, 0x66, 0x64, 0xc6, 0x99, 0x1b, + 0x7c, 0x96, 0x93, 0xc9, 0x5d, 0xc4, 0xd4, 0x3a, 0x83, 0x17, 0x1d, 0x21, + 0xa6, 0xe7, 0xf8, 0xd4, 0xa8, 0x2b, 0x79, 0x98, 0x6e, 0xdf, 0x71, 0xd3, + 0x5b, 0xa1, 0x2f, 0x75, 0x06, 0x2a, 0x6c, 0xa7, 0x91, 0xd9, 0x93, 0x71, + 0x66, 0x54, 0xcd, 0x0e, 0x78, 0x3e, 0x71, 0xf5, 0x27, 0xe0, 0xe1, 0x1d, + 0xa7, 0xd9, 0x53, 0xfa, 0x41, 0xf5, 0x47, 0xbc, 0xe5, 0x2c, 0x09, 0xa0, + 0xef, 0x77, 0xe3, 0x08, 0x79, 0xc9, 0x34, 0x39, 0x45, 0x66, 0x30, 0x24, + 0xed, 0xfd, 0x05, 0xb9, 0x84, 0x73, 0xc4, 0x06, 0xec, 0xa1, 0xad, 0x74, + 0x87, 0x07, 0x78, 0x50, 0x03, 0x9b, 0xe4, 0x00, 0xf1, 0x07, 0x3a, 0x28, + 0x48, 0x61, 0x1e, 0x5e, 0x18, 0x85, 0x2f, 0xe9, 0x56, 0xf7, 0x90, 0xbb, + 0x96, 0xd0, 0x30, 0x83, 0xf9, 0xb4, 0x92, 0x49, 0x2e, 0x33, 0xa3, 0x17, + 0xdc, 0xc3, 0x22, 0x3b, 0x0f, 0x56, 0xae, 0x80, 0x27, 0x93, 0xea, 0x16, + 0x4e, 0x08, 0x58, 0xd8, 0xae, 0x39, 0xc2, 0x49, 0x0e, 0x71, 0x0e, 0xfe, + 0x2a, 0x83, 0xb9, 0xcd, 0xc0, 0x23, 0x9b, 0x11, 0x0b, 0xec, 0x43, 0x7a, + 0x19, 0x13, 0xbd, 0x31, 0x93, 0x96, 0x2e, 0xc0, 0x5d, 0x6c, 0x84, 0x6b, + 0x59, 0x79, 0xeb, 0x3e, 0x8f, 0x1d, 0xbb, 0x1c, 0x53, 0xa9, 0x15, 0xde, + 0x78, 0xa6, 0xef, 0x01, 0x95, 0x7e, 0xd0, 0x1f, 0x13, 0xa2, 0x25, 0x49, + 0x70, 0x97, 0x66, 0xf5, 0x08, 0x3d, 0x72, 0x4b, 0x74, 0x55, 0xc5, 0x90, + 0xb7, 0xc4, 0xfd, 0x32, 0x81, 0xa3, 0xc4, 0xbc, 0xc6, 0x30, 0x9a, 0x9f, + 0x29, 0xf8, 0xf8, 0x4d, 0x95, 0x4a, 0x41, 0x1f, 0x5e, 0xc1, 0x4b, 0xcc, + 0x6b, 0x0a, 0x72, 0xc1, 0xca, 0x77, 0x48, 0xa9, 0x15, 0xce, 0xcf, 0x9e, + 0x1c, 0xd6, 0x93, 0x09, 0xf9, 0x47, 0xca, 0x40, 0x83, 0x81, 0xfe, 0x51, + 0x8d, 0x49, 0x6a, 0x92, 0x93, 0x54, 0x99, 0xd2, 0x15, 0x97, 0x8c, 0x61, + 0x96, 0xe8, 0x88, 0x97, 0xcc, 0xd5, 0x13, 0x4f, 0xe8, 0x84, 0x82, 0x3f, + 0xe6, 0x41, 0x45, 0x9a, 0xa1, 0x39, 0xb6, 0xfd, 0x2b, 0xa2, 0xb8, 0x01, + 0xae, 0x80, 0x4c, 0xc9, 0x16, 0x61, 0x63, 0x05, 0xec, 0x6f, 0xf1, 0x88, + 0x10, 0x82, 0xbc, 0x4c, 0x81, 0x87, 0xbd, 0x4c, 0x23, 0x29, 0xc4, 0xa0, + 0x8a, 0x9b, 0x20, 0xd9, 0xeb, 0x08, 0x8b, 0xcd, 0x70, 0x01, 0x9f, 0x13, + 0xc6, 0x8c, 0x78, 0x79, 0xb7, 0xbe, 0xc5, 0x2e, 0x6a, 0xc1, 0x87, 0xa4, + 0xd4, 0x54, 0x5a, 0xe1, 0xe2, 0x43, 0x4c, 0xf1, 0x21, 0x82, 0x98, 0x15, + 0xac, 0xbf, 0x64, 0xca, 0xfe, 0x2e, 0xd3, 0x20, 0xcb, 0xb4, 0xd5, 0xb7, + 0x8c, 0x87, 0x00, 0x30, 0x9e, 0x96, 0x4e, 0x50, 0x49, 0x98, 0x57, 0xe0, + 0x20, 0x53, 0x7a, 0xe3, 0x3d, 0x6b, 0xee, 0xaf, 0x58, 0x17, 0x1e, 0xeb, + 0x24, 0x86, 0x7f, 0x6f, 0xb1, 0x1b, 0x8d, 0x85, 0xc1, 0x3c, 0xc0, 0xd5, + 0x83, 0xa4, 0xf2, 0x1e, 0x37, 0x55, 0x45, 0xc0, 0x83, 0x24, 0x40, 0xa8, + 0xa0, 0x49, 0x7e, 0x1f, 0x7f, 0x6f, 0x04, 0xb5, 0x20, 0x3a, 0xf2, 0xbe, + 0xdf, 0x88, 0x1e, 0x5c, 0x32, 0x6d, 0xf1, 0x02, 0xcc, 0x59, 0x60, 0xf7, + 0xfe, 0x4a, 0xfc, 0xfe, 0x16, 0x69, 0x41, 0x72, 0xa0, 0xac, 0xa5, 0x1d, + 0x3e, 0x17, 0x0d, 0x5b, 0xe4, 0x26, 0xc9, 0x01, 0xff, 0xad, 0xf9, 0xfc, + 0x45, 0x53, 0x3d, 0xc0, 0xbb, 0xd2, 0x82, 0xf5, 0xb8, 0xa0, 0x68, 0x93, + 0xb5, 0xaf, 0x27, 0xe8, 0x1c, 0x8d, 0xb9, 0x63, 0xc6, 0x59, 0x03, 0x3a, + 0x98, 0xbd, 0xa8, 0xce, 0xce, 0xc0, 0x77, 0x71, 0x6e, 0x00, 0x5e, 0xd0, + 0x8b, 0x46, 0xdb, 0x21, 0x3a, 0xf8, 0xd8, 0xa1, 0x70, 0xee, 0x1c, 0xd9, + 0x76, 0x94, 0x56, 0x06, 0x78, 0x31, 0x9d, 0xa0, 0xca, 0x86, 0x38, 0x15, + 0xd2, 0x44, 0x07, 0x18, 0x1f, 0xa7, 0x64, 0x62, 0xcf, 0x6a, 0xa4, 0x33, + 0xc5, 0x14, 0xe8, 0x1b, 0x2d, 0x81, 0xeb, 0x09, 0xdd, 0xe6, 0x55, 0x98, + 0x36, 0xcd, 0xdd, 0x13, 0xcc, 0xb9, 0x70, 0x12, 0x83, 0x9d, 0x41, 0x73, + 0x0e, 0x31, 0xcb, 0xc6, 0x2c, 0x51, 0xd1, 0xc1, 0x8d, 0x80, 0x07, 0xef, + 0x63, 0x0c, 0x5a, 0xa9, 0x74, 0xd4, 0x19, 0x78, 0x5d, 0x10, 0xf0, 0x2f, + 0xcc, 0xd0, 0xef, 0x11, 0x78, 0xb5, 0x8c, 0xf6, 0x38, 0x4c, 0x50, 0xc5, + 0x3d, 0xe2, 0xc5, 0xc8, 0x76, 0xc3, 0x44, 0xd4, 0xf0, 0x1a, 0xcc, 0x9c, + 0x7e, 0x85, 0x78, 0x02, 0xfd, 0xa1, 0x5f, 0x31, 0x07, 0xbf, 0x4e, 0xab, + 0x47, 0x94, 0x00, 0x5e, 0xea, 0xa2, 0x2b, 0x15, 0x60, 0x74, 0x43, 0x16, + 0xa5, 0x86, 0xe2, 0x84, 0xa2, 0xe6, 0xe8, 0x0b, 0x93, 0xab, 0x7e, 0xbb, + 0x37, 0xfa, 0x67, 0x91, 0xf6, 0x51, 0xd1, 0x91, 0x5b, 0xc6, 0xc8, 0x76, + 0x0f, 0x0e, 0x64, 0xa7, 0xa9, 0xf4, 0xe8, 0x05, 0x59, 0x62, 0x8c, 0x6f, + 0xf0, 0x26, 0x51, 0x39, 0xd9, 0x2e, 0x7e, 0xdf, 0x75, 0xc0, 0x01, 0x9f, + 0xf0, 0x6a, 0x43, 0x94, 0xed, 0xc8, 0x66, 0xe5, 0x95, 0x1e, 0xce, 0xa0, + 0xbd, 0x07, 0xa5, 0x2b, 0xb8, 0x1c, 0x30, 0x2e, 0xba, 0xdd, 0x92, 0x3a, + 0xb8, 0x80, 0xbf, 0x25, 0xc2, 0x18, 0x76, 0x42, 0x53, 0x49, 0xa2, 0xf5, + 0xef, 0x48, 0x1b, 0x31, 0xf3, 0x2e, 0xef, 0x48, 0xef, 0x13, 0xd0, 0x87, + 0xbc, 0x30, 0xf1, 0x1b, 0xbc, 0xd3, 0xa5, 0x84, 0xf1, 0x49, 0x10, 0xe0, + 0x60, 0x8b, 0x52, 0x88, 0xa3, 0x01, 0xbc, 0xd8, 0xa5, 0x30, 0x15, 0x91, + 0xde, 0x05, 0xfc, 0x5a, 0xe5, 0x24, 0xb4, 0x07, 0x9f, 0x10, 0xe4, 0xb2, + 0xc3, 0x56, 0x04, 0xe1, 0x9d, 0xa7, 0x30, 0xd6, 0x74, 0x6c, 0x4b, 0x9d, + 0xd9, 0xa0, 0x43, 0xf8, 0xde, 0xac, 0x3c, 0xea, 0xf6, 0x66, 0x51, 0xe3, + 0x5d, 0x6e, 0xda, 0x5b, 0x92, 0x56, 0x75, 0xae, 0x55, 0xb9, 0x68, 0x46, + 0x17, 0x5c, 0x2c, 0xe5, 0xe0, 0xaf, 0x8e, 0x3e, 0x0a, 0x7f, 0x79, 0xdf, + 0x16, 0x8e, 0x73, 0xc4, 0x21, 0xeb, 0x94, 0xcd, 0x5c, 0xf4, 0xcd, 0xa8, + 0x9a, 0x40, 0x8f, 0x6c, 0x62, 0x8a, 0x06, 0xfc, 0xfe, 0x02, 0x7c, 0x7c, + 0x41, 0x3e, 0x56, 0x39, 0xe4, 0x93, 0x07, 0x5a, 0xec, 0x16, 0xd2, 0xca, + 0xc8, 0xfd, 0x4a, 0xcf, 0x80, 0xe3, 0xf3, 0x64, 0xfb, 0xe2, 0x3c, 0x60, + 0x0c, 0xbc, 0x6e, 0x98, 0x80, 0x76, 0x04, 0xee, 0x13, 0x7e, 0xb5, 0x9d, + 0x8f, 0x87, 0xf9, 0x7c, 0x33, 0x8a, 0x2a, 0xd0, 0xe4, 0x69, 0xa4, 0x47, + 0x4f, 0xa2, 0x4b, 0xc5, 0x59, 0x68, 0x90, 0x06, 0x74, 0x76, 0x5d, 0x45, + 0xbf, 0xee, 0x15, 0x75, 0xd2, 0x8c, 0x3a, 0x89, 0x20, 0xf6, 0x8d, 0xb8, + 0x89, 0x0c, 0x18, 0xf7, 0xb4, 0x34, 0xe5, 0x25, 0xe3, 0xd1, 0x2b, 0x6b, + 0x25, 0x8d, 0x26, 0xb6, 0x07, 0x2f, 0xa5, 0x45, 0x54, 0x1b, 0x89, 0x53, + 0x61, 0xec, 0xb9, 0x56, 0xd1, 0x89, 0x89, 0xbb, 0xac, 0x8a, 0x12, 0x14, + 0x1e, 0x39, 0xb9, 0x15, 0x53, 0x30, 0x00, 0x36, 0xde, 0x8e, 0xde, 0xc9, + 0xa0, 0x4a, 0x84, 0x47, 0xda, 0xf7, 0xb1, 0x9e, 0x69, 0x49, 0x8b, 0xa2, + 0x90, 0x6b, 0x2f, 0x79, 0x5e, 0x29, 0x9e, 0x56, 0xe0, 0xa1, 0x71, 0x27, + 0x95, 0x02, 0x9e, 0xed, 0x97, 0x98, 0x61, 0x05, 0xb9, 0x18, 0xc6, 0x93, + 0x3d, 0x10, 0x66, 0x27, 0x05, 0x1f, 0xf5, 0x08, 0x7c, 0x7d, 0xa6, 0x57, + 0x1a, 0x07, 0x3f, 0x7b, 0xf0, 0xf4, 0xee, 0x88, 0x4e, 0xef, 0xb2, 0x2b, + 0x9f, 0x65, 0xcd, 0xae, 0xc0, 0x2f, 0xdf, 0xb4, 0x1d, 0x53, 0xe0, 0xc1, + 0x29, 0x53, 0x41, 0x72, 0xf4, 0x46, 0x0d, 0x34, 0xda, 0x53, 0xd4, 0x78, + 0xc2, 0x49, 0x35, 0x45, 0x6c, 0xf6, 0xb7, 0x7a, 0x5d, 0xb8, 0xfa, 0x85, + 0x02, 0xf7, 0xd0, 0x86, 0x55, 0xc2, 0xd0, 0x1f, 0xbc, 0x56, 0xbb, 0xb8, + 0xc3, 0xa0, 0x6b, 0xd5, 0x2e, 0x8f, 0x57, 0x7b, 0xf0, 0x90, 0x3b, 0xd0, + 0x71, 0xd7, 0x03, 0x93, 0xe0, 0x6d, 0x54, 0x44, 0x59, 0xb5, 0x03, 0x5c, + 0x19, 0x85, 0x21, 0x36, 0x38, 0x01, 0x4f, 0xeb, 0xae, 0xb6, 0x91, 0x51, + 0xfd, 0x9e, 0x7f, 0xbe, 0x8d, 0x88, 0xf1, 0x02, 0x66, 0x59, 0x9d, 0x4b, + 0x8a, 0xb4, 0xd0, 0x04, 0xcf, 0xda, 0x20, 0xc6, 0x55, 0x70, 0x39, 0xfa, + 0xbd, 0x01, 0x7e, 0x19, 0xb4, 0x03, 0xa9, 0x41, 0xf7, 0x1d, 0x42, 0xa7, + 0x19, 0xb1, 0xa9, 0x0e, 0xc0, 0x2f, 0x57, 0xf0, 0x82, 0xef, 0x18, 0x21, + 0x70, 0xa1, 0x6c, 0x37, 0xb7, 0x02, 0xbe, 0xef, 0xcc, 0xe9, 0x69, 0xe4, + 0x49, 0xe0, 0xc6, 0x3a, 0xbc, 0x5a, 0x57, 0x3b, 0x39, 0x49, 0x16, 0xba, + 0x64, 0xc3, 0x5b, 0xfd, 0x2e, 0x13, 0xe1, 0x83, 0x56, 0x17, 0xcc, 0x00, + 0xcc, 0xf4, 0x10, 0xe8, 0x4d, 0xdc, 0x85, 0x13, 0xe3, 0x98, 0x47, 0xcf, + 0xa4, 0x93, 0xd7, 0xb8, 0xb6, 0x21, 0x6f, 0x65, 0x17, 0x37, 0xe1, 0x08, + 0x31, 0x3b, 0x46, 0x6d, 0xb0, 0x8c, 0xd5, 0xdf, 0xf8, 0x64, 0xfd, 0x94, + 0xae, 0xb2, 0x8a, 0x14, 0x28, 0x8e, 0xe3, 0xd7, 0xc1, 0xef, 0x7d, 0x89, + 0x40, 0xbf, 0xf9, 0x30, 0x6f, 0x1d, 0x71, 0x71, 0x1a, 0x9a, 0x80, 0x8d, + 0x84, 0xfb, 0x7d, 0x9c, 0xd1, 0x95, 0x01, 0xf3, 0xbf, 0x00, 0xfd, 0x12, + 0x82, 0x6f, 0x48, 0x59, 0x63, 0x1d, 0xb0, 0x8e, 0x55, 0x31, 0xd9, 0x17, + 0xa1, 0xe9, 0x97, 0x83, 0x27, 0x86, 0xfd, 0xbc, 0xce, 0xce, 0xeb, 0x11, + 0x49, 0x10, 0xc9, 0xa7, 0xca, 0xc2, 0xae, 0xe8, 0x62, 0xbf, 0xdf, 0x16, + 0xae, 0x55, 0x01, 0xde, 0x98, 0xb8, 0xb6, 0x77, 0x18, 0xf4, 0x42, 0xcc, + 0x65, 0x9c, 0x78, 0xcd, 0xb3, 0x68, 0xfa, 0x7b, 0xe8, 0x93, 0xb7, 0x68, + 0xd0, 0x13, 0xb8, 0x2d, 0x91, 0x8c, 0xb0, 0x88, 0x8e, 0x5d, 0x64, 0xf4, + 0x7d, 0xe2, 0x5a, 0x98, 0x03, 0x76, 0x43, 0xbe, 0x8b, 0x50, 0x23, 0xe0, + 0xdd, 0xc4, 0x39, 0x99, 0xe7, 0xbb, 0x6e, 0x16, 0x92, 0x07, 0xb1, 0x48, + 0x20, 0x07, 0x99, 0xfb, 0x66, 0x4a, 0x21, 0x56, 0xcb, 0x1e, 0x38, 0x4d, + 0x44, 0xed, 0x18, 0x97, 0xba, 0xcd, 0xc2, 0x66, 0xf1, 0xa2, 0x6c, 0x7d, + 0x0b, 0x0d, 0xe9, 0x47, 0xec, 0x74, 0xc3, 0xf3, 0x93, 0x1e, 0x24, 0xbd, + 0x5f, 0xf9, 0xa9, 0xd0, 0x06, 0xfc, 0x32, 0x2b, 0x55, 0x36, 0x4a, 0xc3, + 0x1a, 0x8e, 0x0e, 0xba, 0x47, 0x6d, 0x15, 0x80, 0x16, 0x57, 0xbc, 0xad, + 0xe6, 0xcf, 0x37, 0x30, 0x7f, 0x10, 0x57, 0xc1, 0x12, 0xf2, 0xde, 0x17, + 0x69, 0x64, 0x08, 0x24, 0x6e, 0x31, 0x84, 0x2c, 0xd3, 0xa9, 0x91, 0xd0, + 0xa1, 0xca, 0x9b, 0xe1, 0x97, 0x5e, 0x2b, 0x79, 0x10, 0x1c, 0xe8, 0x60, + 0x85, 0x13, 0x61, 0xb1, 0xcf, 0xc6, 0xbd, 0x81, 0x87, 0x83, 0xfb, 0x7a, + 0x67, 0xe6, 0xfa, 0x19, 0x32, 0x25, 0x4a, 0x27, 0x1a, 0x13, 0x3e, 0xb6, + 0xdc, 0xc7, 0x49, 0x68, 0xda, 0x4d, 0xd9, 0x2a, 0x1d, 0xb8, 0x23, 0x93, + 0xcd, 0x08, 0x3e, 0x6d, 0xb5, 0x8c, 0xeb, 0x80, 0xc3, 0x95, 0x59, 0x92, + 0xf5, 0x07, 0xc8, 0x59, 0x33, 0xa4, 0x78, 0x4a, 0x80, 0x76, 0x48, 0xa7, + 0x14, 0x4d, 0xd0, 0x28, 0x37, 0xab, 0x3e, 0xd2, 0x56, 0x59, 0xd9, 0x36, + 0xc6, 0xb1, 0x71, 0x75, 0xda, 0x08, 0x1b, 0x3b, 0xe4, 0x16, 0xb6, 0x99, + 0x71, 0xa0, 0x25, 0x60, 0xae, 0x6e, 0x24, 0x48, 0x24, 0x82, 0xaa, 0x07, + 0xf1, 0x88, 0x51, 0xd6, 0xe8, 0x8a, 0xa7, 0xe6, 0x96, 0x38, 0x28, 0x8e, + 0x95, 0xed, 0x67, 0x35, 0x62, 0x85, 0x86, 0x66, 0xdd, 0x26, 0x28, 0xe0, + 0x7b, 0x88, 0xaa, 0x80, 0xb5, 0x55, 0x75, 0x6c, 0xd4, 0xc4, 0xe6, 0xf5, + 0x45, 0x35, 0xe2, 0x07, 0xe0, 0x76, 0x66, 0x36, 0xe6, 0xb1, 0xab, 0xc0, + 0xdb, 0x92, 0xae, 0xf4, 0xd0, 0x0b, 0x3c, 0x7f, 0x25, 0xfc, 0xad, 0x56, + 0xba, 0x03, 0xa8, 0xb7, 0xed, 0x28, 0xb4, 0xea, 0xce, 0xea, 0x79, 0x1d, + 0xbf, 0x18, 0x69, 0xb3, 0x30, 0x70, 0x33, 0xbc, 0x69, 0x53, 0x79, 0xa0, + 0xb9, 0x1f, 0xac, 0x56, 0x0b, 0xbe, 0x19, 0xce, 0x61, 0x33, 0x1e, 0xe2, + 0x5a, 0x6c, 0x33, 0x03, 0xf8, 0xc7, 0xc4, 0x56, 0xe2, 0xd2, 0x57, 0x9e, + 0x6e, 0x4d, 0x88, 0x59, 0x33, 0xe4, 0x24, 0xdf, 0x19, 0x90, 0xcb, 0x8c, + 0x74, 0xb4, 0x55, 0x8f, 0x9c, 0x2f, 0x0c, 0xda, 0xe2, 0x03, 0x70, 0x93, + 0xcb, 0xa6, 0x2a, 0x04, 0x5e, 0x09, 0xf6, 0x53, 0x10, 0x96, 0x3a, 0x39, + 0x10, 0x4e, 0x00, 0xbb, 0x94, 0x3b, 0xdf, 0x27, 0x2c, 0x74, 0xec, 0x45, + 0x8a, 0x71, 0xe1, 0x44, 0x53, 0xa8, 0xaf, 0x6f, 0xdc, 0xd5, 0x73, 0xea, + 0xa1, 0x06, 0x38, 0x37, 0x04, 0x2d, 0xe0, 0xca, 0x06, 0xbd, 0x92, 0x0e, + 0xab, 0xbd, 0x59, 0x3e, 0x21, 0xbf, 0xbd, 0x92, 0x49, 0x2f, 0xe4, 0xcc, + 0x92, 0xed, 0xc2, 0x82, 0xfe, 0xea, 0xa4, 0x96, 0x07, 0xf0, 0x5e, 0x61, + 0xa8, 0x2a, 0x17, 0x34, 0x84, 0x97, 0x4f, 0x6a, 0x23, 0x38, 0x06, 0xcd, + 0xd7, 0x18, 0x91, 0x31, 0xde, 0x73, 0x0d, 0xa1, 0x68, 0xc2, 0x53, 0x66, + 0xca, 0x26, 0x4a, 0xe0, 0xca, 0xdb, 0x68, 0x94, 0xa9, 0x4c, 0x80, 0x1b, + 0x4c, 0xc0, 0xf0, 0x45, 0x6c, 0x04, 0x87, 0x78, 0x12, 0x93, 0x30, 0xab, + 0x08, 0xa7, 0xd8, 0xca, 0x34, 0xb4, 0xcf, 0x95, 0x1d, 0x70, 0x7e, 0x9f, + 0x24, 0x9d, 0xd7, 0x38, 0xd0, 0xe7, 0x1e, 0x5c, 0x55, 0x3c, 0xad, 0xa7, + 0x63, 0x8a, 0xfc, 0x8c, 0xbb, 0xd3, 0x91, 0x55, 0x69, 0x42, 0x45, 0x7d, + 0x48, 0x45, 0x9b, 0x98, 0x38, 0x12, 0xa6, 0x5d, 0x95, 0x29, 0x22, 0xe0, + 0xef, 0x6f, 0x8c, 0xf7, 0xa9, 0xf4, 0xd4, 0x15, 0x38, 0x6d, 0x88, 0x53, + 0x69, 0x84, 0x7a, 0xb0, 0x04, 0x3f, 0xa1, 0x01, 0x4f, 0xe7, 0xe4, 0xbd, + 0x02, 0x85, 0x1f, 0x2c, 0x99, 0x1e, 0xd4, 0xa0, 0xd3, 0xdf, 0xd8, 0x91, + 0x0b, 0xc0, 0xc3, 0x89, 0xf2, 0x8b, 0xb5, 0x37, 0xc6, 0x4b, 0xe1, 0xe9, + 0x63, 0x69, 0xe0, 0x3b, 0x78, 0x64, 0x5d, 0x24, 0xeb, 0x17, 0xe6, 0xfa, + 0xfb, 0xe0, 0xad, 0x92, 0xbc, 0xd1, 0xcc, 0xc2, 0x13, 0x99, 0x74, 0xdc, + 0x49, 0x30, 0x94, 0x62, 0xe8, 0x43, 0xe1, 0xca, 0x9a, 0x25, 0xf2, 0x56, + 0x34, 0x9a, 0x91, 0x37, 0xc1, 0x13, 0x72, 0xe7, 0x12, 0x25, 0xf3, 0xf3, + 0x67, 0xe6, 0x84, 0x9a, 0x65, 0xc7, 0xef, 0x15, 0x49, 0xda, 0x20, 0x2f, + 0x01, 0x83, 0xc0, 0x8f, 0x7d, 0x4b, 0x2f, 0xb0, 0x8e, 0x8c, 0x0c, 0xb2, + 0xeb, 0xbf, 0xe7, 0x67, 0xdd, 0x02, 0x7c, 0xef, 0xb1, 0xc6, 0xa0, 0x8b, + 0x08, 0xa5, 0x2c, 0xb4, 0x76, 0xef, 0xaf, 0x85, 0x34, 0x40, 0x93, 0xeb, + 0xd8, 0xdd, 0xe9, 0xeb, 0x27, 0x36, 0x66, 0x1d, 0xfb, 0xeb, 0xd9, 0x6d, + 0x46, 0xda, 0x79, 0x0d, 0xef, 0xd8, 0xef, 0x0d, 0x74, 0xce, 0x5b, 0xe2, + 0x53, 0xaf, 0x7f, 0x94, 0xdd, 0xc9, 0x82, 0x18, 0xbc, 0xe4, 0x29, 0x1d, + 0xa3, 0xf3, 0x7d, 0xdc, 0x6b, 0x3a, 0x2d, 0x36, 0xab, 0xef, 0xc2, 0x55, + 0x79, 0xa4, 0x88, 0x9e, 0x35, 0xf2, 0x11, 0x73, 0x3c, 0xcf, 0xa3, 0x02, + 0x0f, 0xdd, 0x1c, 0x9b, 0x00, 0x49, 0xbf, 0xb7, 0x49, 0x1a, 0x59, 0x58, + 0xc9, 0x54, 0x24, 0x28, 0xce, 0x75, 0x9c, 0xee, 0xcd, 0xbe, 0xe1, 0x1d, + 0x1a, 0x99, 0xb3, 0x9e, 0x98, 0xa7, 0xdf, 0x0f, 0x29, 0x7e, 0x48, 0xe3, + 0x64, 0x84, 0xe6, 0x65, 0x81, 0x6b, 0x6c, 0xc4, 0x8e, 0xc0, 0x89, 0x2b, + 0x52, 0xe2, 0xdd, 0xe1, 0x7d, 0x12, 0x49, 0xb7, 0xc7, 0xc0, 0x93, 0x97, + 0x72, 0x5e, 0x57, 0xba, 0x59, 0x5d, 0x01, 0xdb, 0x1e, 0xd8, 0x0f, 0x10, + 0xb8, 0x95, 0x03, 0x35, 0xab, 0x37, 0xd3, 0xd9, 0x1e, 0x3c, 0x91, 0x1b, + 0xba, 0xa7, 0xb1, 0x64, 0xca, 0x01, 0x2c, 0xab, 0x0f, 0x09, 0xf2, 0x59, + 0x12, 0x1a, 0x6c, 0x73, 0x37, 0x40, 0x73, 0x44, 0xb9, 0x1b, 0x54, 0x6c, + 0xbe, 0x7f, 0x51, 0x67, 0x80, 0x97, 0xb8, 0x02, 0xff, 0x12, 0x01, 0xc6, + 0xa5, 0x92, 0xd9, 0xe9, 0x91, 0x81, 0xcf, 0x69, 0x2d, 0x50, 0x9a, 0x95, + 0xc3, 0x28, 0x7e, 0x84, 0xb3, 0xbe, 0xf4, 0x2c, 0x1a, 0xea, 0xe0, 0x87, + 0x9b, 0xd7, 0xb3, 0xe0, 0x56, 0x28, 0xc1, 0xf3, 0x53, 0xbd, 0xdf, 0xd1, + 0x6e, 0x6b, 0x48, 0x6e, 0xd9, 0xb8, 0x81, 0xf8, 0x6d, 0x47, 0x5c, 0xd6, + 0x36, 0x8c, 0x5f, 0xa9, 0x17, 0x1a, 0x68, 0xcd, 0x4e, 0xf2, 0xd2, 0x18, + 0xe6, 0xb5, 0x9a, 0x03, 0x47, 0xdb, 0x27, 0x05, 0x8c, 0x3a, 0xb8, 0x2b, + 0x8f, 0x76, 0xd5, 0x26, 0xef, 0x18, 0x4b, 0x12, 0xcc, 0x40, 0xc7, 0x05, + 0xc9, 0x66, 0x05, 0xda, 0x71, 0x78, 0x11, 0x1a, 0x4e, 0xa0, 0x6d, 0xac, + 0x50, 0xc7, 0xf3, 0xf3, 0xaa, 0xe5, 0xce, 0x10, 0x2e, 0xf1, 0x5c, 0xd0, + 0xb1, 0x2b, 0xc6, 0x9d, 0x93, 0x59, 0xd6, 0x44, 0xb0, 0x96, 0xf4, 0x79, + 0x1a, 0x7c, 0x33, 0x6f, 0x60, 0xa0, 0xa7, 0xaa, 0xdc, 0x65, 0x61, 0xac, + 0x40, 0xf5, 0x23, 0x14, 0x1e, 0x1c, 0xdb, 0x4b, 0x7c, 0x45, 0x98, 0x13, + 0xbc, 0x99, 0xb9, 0xbe, 0x11, 0x4d, 0x68, 0x7b, 0x43, 0x85, 0x89, 0x87, + 0x20, 0x30, 0x47, 0x46, 0xbd, 0x95, 0x41, 0x41, 0x0b, 0x26, 0x6d, 0xff, + 0xa4, 0x2a, 0x83, 0xbc, 0xb7, 0xce, 0xb1, 0x26, 0xf6, 0xf0, 0x57, 0x65, + 0x14, 0xf4, 0xaa, 0x3b, 0xa2, 0xa8, 0x11, 0x0c, 0x77, 0x7d, 0x5e, 0xb4, + 0xa7, 0x17, 0x71, 0xc7, 0xb8, 0x30, 0xdd, 0x31, 0x74, 0xab, 0x6b, 0xcc, + 0x7a, 0x83, 0xb7, 0xec, 0x55, 0x18, 0x68, 0x97, 0x1b, 0xea, 0x99, 0xd4, + 0x54, 0x2f, 0xb9, 0xec, 0x73, 0x5e, 0xb5, 0x05, 0xaf, 0x62, 0xde, 0xae, + 0xf6, 0x45, 0x67, 0x3f, 0xb0, 0x19, 0x6c, 0x20, 0xff, 0x4c, 0xda, 0xc8, + 0xbe, 0x44, 0xd5, 0xf9, 0x30, 0xdf, 0x67, 0x77, 0xc8, 0x39, 0x36, 0x83, + 0x00, 0x7c, 0x81, 0x9d, 0xd3, 0xd5, 0x98, 0x78, 0xd5, 0x32, 0xd1, 0xc0, + 0x7c, 0x79, 0x78, 0x07, 0xd7, 0x9c, 0xc4, 0xa6, 0x7d, 0xa1, 0xb5, 0x4d, + 0x21, 0xce, 0x95, 0x54, 0x08, 0x7c, 0xab, 0xf4, 0x0b, 0x75, 0x32, 0x63, + 0xd4, 0xf3, 0x7c, 0x02, 0x34, 0xae, 0x49, 0x15, 0x37, 0x72, 0x20, 0x4d, + 0x60, 0xe7, 0x29, 0xbb, 0xcb, 0x89, 0x11, 0xc0, 0x77, 0x53, 0xd4, 0x32, + 0xc6, 0x9e, 0x55, 0x03, 0xf7, 0xd4, 0xf9, 0x66, 0xf0, 0x65, 0x07, 0x9e, + 0x31, 0x09, 0x06, 0x91, 0xf6, 0x1b, 0xc9, 0xaa, 0x45, 0xd4, 0xf4, 0xd0, + 0x33, 0x99, 0x02, 0x0e, 0x22, 0xe1, 0xb2, 0x5e, 0x82, 0x46, 0x2a, 0x37, + 0xf3, 0x7a, 0xb2, 0x5e, 0x2f, 0x5c, 0x36, 0xb7, 0x1f, 0x44, 0xc6, 0x0a, + 0x01, 0xde, 0xec, 0x13, 0x2d, 0x78, 0x81, 0x63, 0xbb, 0x81, 0x3f, 0xc8, + 0xc4, 0xe6, 0xeb, 0x26, 0xb4, 0xde, 0x2e, 0xdc, 0xcb, 0x74, 0xe4, 0x7a, + 0x10, 0x9a, 0xec, 0x7e, 0xf4, 0x4a, 0xf0, 0x42, 0x38, 0xcf, 0x78, 0x65, + 0x43, 0x2c, 0x69, 0x14, 0xa9, 0x5c, 0x28, 0x0c, 0xde, 0x43, 0xd7, 0x40, + 0x97, 0xb4, 0x45, 0xda, 0xbc, 0x8f, 0x35, 0xd9, 0x14, 0x86, 0x45, 0x69, + 0x2a, 0x34, 0xe0, 0x3e, 0x1d, 0xb0, 0xe1, 0x1b, 0xf4, 0x84, 0x8b, 0xdd, + 0xa0, 0xa6, 0x0e, 0x98, 0x75, 0x4d, 0x2e, 0x59, 0xda, 0xbf, 0x92, 0x49, + 0x3d, 0x80, 0x1b, 0x2e, 0xa0, 0x73, 0xbb, 0x43, 0x22, 0x53, 0x98, 0xdf, + 0x2c, 0x8a, 0x87, 0x57, 0xd1, 0xac, 0xb4, 0xd8, 0x03, 0xdf, 0xd7, 0x9e, + 0xf4, 0x58, 0x03, 0x4e, 0x9b, 0xc4, 0x2e, 0x4c, 0x7b, 0xe3, 0xa8, 0xc0, + 0x33, 0xfb, 0x6b, 0x33, 0x74, 0xaa, 0xdd, 0x5e, 0x3b, 0x59, 0xd8, 0xc7, + 0x53, 0xec, 0x45, 0x56, 0xd6, 0xe2, 0x6b, 0x51, 0xb3, 0xf9, 0x1e, 0x79, + 0x58, 0x98, 0xe1, 0x18, 0x2a, 0x64, 0x4b, 0xcf, 0x5a, 0x82, 0xce, 0xb7, + 0x60, 0x9c, 0xa3, 0xc2, 0x09, 0xe6, 0xe7, 0x58, 0xa0, 0x9e, 0x31, 0x0d, + 0xdb, 0xc6, 0xca, 0x5d, 0xf1, 0xe4, 0x28, 0x78, 0x63, 0x60, 0x27, 0xea, + 0x90, 0x7b, 0x01, 0x18, 0x5d, 0xf8, 0x95, 0x9f, 0x18, 0x27, 0x9d, 0xc6, + 0xab, 0x81, 0xb6, 0x20, 0x70, 0xdb, 0xea, 0x7d, 0x44, 0xa0, 0xcd, 0x13, + 0xf5, 0x2c, 0xda, 0x00, 0xef, 0x8d, 0x55, 0xcb, 0x80, 0x0b, 0xc1, 0x53, + 0x8a, 0x78, 0x7e, 0x46, 0xc3, 0x14, 0xe7, 0x74, 0x65, 0x49, 0x55, 0x79, + 0x07, 0xce, 0xe6, 0x67, 0x17, 0x08, 0x7c, 0x1f, 0x11, 0x26, 0xd9, 0x83, + 0xe7, 0xd2, 0x0a, 0x43, 0x4f, 0xa2, 0xd6, 0xd5, 0x0f, 0xbe, 0x3c, 0x43, + 0xdc, 0x85, 0xa0, 0x19, 0x1b, 0x6a, 0xa2, 0xef, 0xa2, 0x19, 0x70, 0x91, + 0x90, 0x26, 0x84, 0x3c, 0x62, 0xbc, 0x52, 0x47, 0xd0, 0xa4, 0x80, 0x8f, + 0xfc, 0x98, 0x62, 0xc0, 0x3c, 0x94, 0x84, 0xae, 0xa5, 0x4a, 0x2a, 0x20, + 0x77, 0xe0, 0x7a, 0x1b, 0x7d, 0x7b, 0x4c, 0x82, 0x1e, 0x77, 0x80, 0x01, + 0xcd, 0x78, 0x3b, 0x20, 0xf1, 0x9d, 0x01, 0x67, 0xc8, 0x49, 0xc4, 0x85, + 0x83, 0xb7, 0xa1, 0x17, 0xec, 0x44, 0x07, 0x5c, 0xe8, 0x90, 0x57, 0x69, + 0x9c, 0x2c, 0x9e, 0x88, 0x5b, 0xd2, 0x82, 0x1f, 0x57, 0x01, 0x05, 0x6f, + 0x3f, 0x64, 0xda, 0xf6, 0x15, 0x69, 0xbd, 0x8f, 0x79, 0x45, 0xe0, 0xf3, + 0x6c, 0x37, 0xb1, 0x05, 0x78, 0x12, 0x23, 0xd3, 0x64, 0x3a, 0xeb, 0x0d, + 0x6c, 0x8a, 0x08, 0x7c, 0x77, 0x9b, 0x78, 0x3d, 0xcb, 0xdd, 0x72, 0xe6, + 0xd6, 0xec, 0xe0, 0x59, 0xef, 0xd2, 0xc5, 0x1a, 0xbc, 0x8e, 0x31, 0xeb, + 0x41, 0xd7, 0xe3, 0x80, 0xa7, 0xb6, 0x1f, 0x25, 0xb2, 0x82, 0xf7, 0xef, + 0xa2, 0x56, 0x36, 0xe6, 0x92, 0x60, 0xad, 0xaf, 0x4a, 0xd4, 0xef, 0x0f, + 0x5c, 0x3c, 0x88, 0x81, 0xbf, 0xb9, 0x2b, 0x02, 0xc0, 0x54, 0x2a, 0x5c, + 0x88, 0x77, 0x53, 0x05, 0x12, 0x7a, 0x9b, 0x68, 0xcd, 0x08, 0xfe, 0x76, + 0x49, 0xcf, 0x83, 0xce, 0x8c, 0xfe, 0x01, 0x7a, 0x76, 0x2c, 0x6a, 0x39, + 0x15, 0xc8, 0x86, 0xe4, 0x24, 0xd1, 0x5e, 0x63, 0x3c, 0xf6, 0xd8, 0x7e, + 0xaf, 0xcd, 0xeb, 0xa7, 0x86, 0xf9, 0xee, 0xc0, 0xec, 0x27, 0x06, 0xde, + 0x08, 0x3d, 0xf4, 0x56, 0xdb, 0x9c, 0x9f, 0xde, 0xd8, 0x23, 0xcb, 0xdc, + 0xd3, 0x7b, 0xe1, 0x13, 0x14, 0xb5, 0x10, 0xa3, 0x8d, 0xae, 0x93, 0x66, + 0x3c, 0x17, 0x66, 0x34, 0x66, 0xc6, 0x2a, 0xcb, 0x13, 0x3c, 0x31, 0x0a, + 0x5a, 0xa9, 0xa9, 0x12, 0x11, 0x7f, 0x8d, 0x8c, 0xb1, 0x73, 0xc9, 0xfa, + 0x4c, 0x00, 0xbf, 0x4b, 0x03, 0xbd, 0x33, 0xbe, 0xba, 0x82, 0x26, 0xde, + 0xc7, 0xcd, 0xb0, 0x8f, 0x6b, 0xf7, 0x95, 0x6b, 0xc3, 0x05, 0x78, 0x26, + 0x66, 0xde, 0xd6, 0x8c, 0xcc, 0x3e, 0xcf, 0x4c, 0xd0, 0x32, 0xa0, 0x21, + 0x4a, 0x04, 0xce, 0x7e, 0x6a, 0x2c, 0xc8, 0x93, 0x37, 0xf8, 0x06, 0x0d, + 0x1b, 0x6c, 0x8b, 0xa7, 0x40, 0x93, 0x35, 0xe0, 0x15, 0x12, 0x23, 0x6f, + 0xc5, 0xae, 0xe8, 0x02, 0x12, 0x2a, 0xb5, 0x09, 0x11, 0x8c, 0xb7, 0x0b, + 0x1a, 0x2d, 0x61, 0x0b, 0xe9, 0xe9, 0x94, 0x01, 0xf6, 0x97, 0x09, 0xe0, + 0x1f, 0x2a, 0xf5, 0x18, 0x38, 0x21, 0xe2, 0xa0, 0x5b, 0x75, 0xa2, 0x12, + 0x25, 0x46, 0x3c, 0x55, 0x46, 0x62, 0x60, 0xe0, 0xbc, 0xfb, 0xbb, 0xa4, + 0xe3, 0x78, 0xa4, 0x02, 0x70, 0x00, 0x54, 0xac, 0x21, 0x72, 0xee, 0x07, + 0x04, 0xb8, 0x77, 0x0f, 0x73, 0xa5, 0x97, 0x1a, 0xf8, 0x12, 0x3f, 0x68, + 0x4a, 0xad, 0xb9, 0xe5, 0x5d, 0xf3, 0x3a, 0xfa, 0x55, 0x7d, 0xac, 0xab, + 0x0e, 0xfa, 0x18, 0x00, 0x87, 0x2e, 0xc1, 0x3e, 0x58, 0x05, 0xbb, 0x3c, + 0xe1, 0x9a, 0x92, 0x9d, 0xb1, 0xba, 0x63, 0x67, 0x3d, 0xaf, 0x27, 0xa6, + 0x25, 0x6a, 0x4c, 0xc0, 0xbf, 0x06, 0x4f, 0x62, 0x0f, 0xfa, 0xc2, 0x9e, + 0xd7, 0x7b, 0x65, 0x89, 0xbd, 0xa5, 0x8d, 0x02, 0xbd, 0x66, 0x81, 0xe6, + 0xad, 0x2e, 0xa2, 0xb1, 0x62, 0x32, 0x55, 0x53, 0x36, 0xa9, 0x57, 0x0c, + 0xde, 0x36, 0xf6, 0x21, 0x1d, 0x5c, 0x45, 0x40, 0xeb, 0x3d, 0x8b, 0xba, + 0x62, 0x65, 0x47, 0xc7, 0x78, 0x22, 0x71, 0xe1, 0x8d, 0x9c, 0x3b, 0x01, + 0x4d, 0x4c, 0xf0, 0xf7, 0xf4, 0x62, 0x82, 0x1e, 0x1b, 0x89, 0x36, 0x6c, + 0xe0, 0xf7, 0x57, 0xa8, 0x2e, 0x26, 0xf3, 0x42, 0xc0, 0x53, 0xe4, 0xe2, + 0x69, 0xfb, 0x2a, 0x50, 0xf8, 0x3c, 0xaa, 0xca, 0x39, 0x36, 0x77, 0x4b, + 0x1a, 0x2a, 0x2f, 0x3c, 0x16, 0x53, 0xc3, 0x7a, 0xb0, 0xa6, 0xfa, 0xce, + 0x6a, 0x49, 0x20, 0xaf, 0x05, 0xa8, 0x8a, 0x57, 0xd6, 0x5d, 0x16, 0xb1, + 0x29, 0x1a, 0xc1, 0x11, 0x82, 0xb6, 0x7d, 0xf1, 0x5e, 0x79, 0x04, 0xbc, + 0x36, 0xc4, 0xf7, 0x08, 0xd7, 0xe5, 0xd1, 0x29, 0x9c, 0x80, 0xbf, 0xb7, + 0x21, 0xf8, 0xdb, 0xc4, 0x58, 0x55, 0xe4, 0x3c, 0x1c, 0xb0, 0x8a, 0x6e, + 0x05, 0xbf, 0x3f, 0x23, 0x3a, 0x3c, 0x72, 0x5f, 0xf2, 0xbd, 0x2e, 0x28, + 0x31, 0x86, 0xa1, 0xd8, 0x0c, 0x8f, 0xc3, 0xbc, 0xbe, 0xd9, 0xb3, 0x30, + 0xe8, 0xa9, 0x31, 0x64, 0xfd, 0x84, 0x6b, 0x35, 0x60, 0x63, 0xa5, 0x98, + 0xc1, 0x40, 0x63, 0x8e, 0x5e, 0x91, 0x54, 0x80, 0xcd, 0x56, 0x06, 0xda, + 0x60, 0x4c, 0x6a, 0xd4, 0x1f, 0x5b, 0xf1, 0x02, 0x0e, 0x64, 0x2c, 0x15, + 0x1b, 0xea, 0x30, 0x06, 0x7d, 0x42, 0x3b, 0xc3, 0x32, 0x4a, 0xae, 0xea, + 0xa4, 0x85, 0x98, 0x6e, 0x83, 0x07, 0x53, 0xc1, 0x23, 0xf1, 0x5c, 0x43, + 0x24, 0x4c, 0x15, 0x20, 0xff, 0x8f, 0x4c, 0xc6, 0x99, 0x92, 0x31, 0x68, + 0xa9, 0x01, 0xfa, 0x6c, 0x16, 0xda, 0x0a, 0x74, 0x38, 0x7a, 0x15, 0xf1, + 0x00, 0x6e, 0xb5, 0xaa, 0xe8, 0xbc, 0x7f, 0x63, 0xda, 0xea, 0xf3, 0xda, + 0xa5, 0x72, 0x6a, 0x5e, 0x18, 0x3c, 0x8e, 0xf0, 0x91, 0x7d, 0x60, 0xea, + 0x8e, 0x95, 0x80, 0xf9, 0x00, 0x6f, 0xc8, 0xd9, 0x05, 0xf2, 0xfb, 0x99, + 0x51, 0x05, 0xfe, 0x71, 0xfb, 0xda, 0xe9, 0x82, 0xc7, 0xe8, 0x32, 0xca, + 0xa6, 0x31, 0x92, 0xc6, 0x7a, 0x16, 0xc6, 0xe2, 0xcd, 0x5a, 0xcb, 0x04, + 0xac, 0x3a, 0x33, 0x50, 0x65, 0x21, 0x78, 0x4f, 0xd0, 0x34, 0x6f, 0xc2, + 0xad, 0x73, 0x64, 0x34, 0x23, 0x6d, 0x81, 0x03, 0x1d, 0x7b, 0x10, 0xc6, + 0x8a, 0x94, 0xf3, 0x7e, 0x13, 0x6d, 0x61, 0x32, 0xa7, 0x62, 0xa1, 0x87, + 0x80, 0x0f, 0x03, 0x7f, 0x5e, 0xdb, 0x12, 0xea, 0xb2, 0x02, 0xce, 0x9b, + 0x32, 0x83, 0x45, 0x91, 0x46, 0xdc, 0x98, 0xb3, 0x74, 0xf7, 0x5e, 0xf9, + 0x09, 0xcf, 0x74, 0xce, 0xaa, 0xfa, 0xe0, 0x2b, 0x60, 0x33, 0x0b, 0xb4, + 0x0f, 0x79, 0xf2, 0x34, 0xe8, 0x62, 0x4e, 0x40, 0x5f, 0xcb, 0xe6, 0xe8, + 0xc8, 0x30, 0x36, 0xe8, 0x0b, 0xe2, 0x20, 0xdd, 0x19, 0x7d, 0x5e, 0xf2, + 0x15, 0x68, 0xaa, 0xf0, 0x1d, 0x81, 0x1e, 0xc2, 0x3a, 0xea, 0xf8, 0x79, + 0xa0, 0xe0, 0x07, 0x19, 0x60, 0x77, 0x5a, 0x70, 0xf1, 0x1d, 0xa9, 0x70, + 0xa2, 0x5e, 0xc5, 0x78, 0x8b, 0x69, 0xae, 0x54, 0x9c, 0x77, 0x04, 0xf0, + 0x59, 0xe5, 0x61, 0xab, 0x58, 0xc6, 0x41, 0x97, 0xb6, 0xb2, 0x4e, 0xc0, + 0x53, 0x25, 0xc6, 0x18, 0xe5, 0x7a, 0xe5, 0x94, 0x8e, 0xbc, 0x48, 0x5e, + 0x81, 0xb6, 0x0c, 0xdf, 0xa1, 0x36, 0xcc, 0x39, 0xa6, 0x15, 0x75, 0xd0, + 0xec, 0x27, 0xf5, 0xcc, 0x55, 0x10, 0xee, 0xcc, 0xc0, 0x8a, 0xa7, 0xe0, + 0x5a, 0x7a, 0xe3, 0x35, 0xd3, 0x2c, 0xe0, 0xf5, 0x00, 0x5c, 0xb5, 0xbc, + 0x1c, 0x9d, 0x6a, 0x04, 0x3d, 0x5e, 0x91, 0xc4, 0x76, 0x42, 0xbf, 0x7f, + 0xc9, 0xf9, 0xfe, 0x54, 0x2d, 0xe6, 0xfb, 0x7b, 0x2d, 0x35, 0x58, 0x02, + 0x5a, 0x73, 0x5f, 0xb6, 0x99, 0x55, 0xd4, 0x6b, 0x93, 0x69, 0xe3, 0x42, + 0x78, 0x43, 0x12, 0x32, 0x82, 0x12, 0xae, 0xa7, 0xc2, 0xb5, 0xc6, 0x9d, + 0x59, 0x8e, 0x7b, 0x93, 0x80, 0x7f, 0x5a, 0xf5, 0x05, 0x6b, 0x6e, 0x47, + 0x8e, 0xac, 0x7c, 0x5e, 0x43, 0x5d, 0xcb, 0x7d, 0xc2, 0x57, 0x43, 0x8e, + 0xfa, 0xb1, 0x48, 0x94, 0xc7, 0x98, 0x48, 0xc2, 0x16, 0x3c, 0x0a, 0x8b, + 0xf4, 0xa2, 0x41, 0x02, 0xce, 0x13, 0x24, 0x3e, 0x36, 0x0a, 0xa5, 0x3c, + 0xec, 0xcd, 0x6b, 0xbe, 0x18, 0x05, 0x6f, 0xe1, 0x16, 0xfc, 0xa2, 0x83, + 0xd6, 0x3f, 0x94, 0x2e, 0xf8, 0xed, 0xce, 0xce, 0xe2, 0x79, 0x55, 0x1d, + 0x68, 0x89, 0x3c, 0xc9, 0x6e, 0x61, 0x22, 0xe3, 0x5c, 0x55, 0xac, 0xa8, + 0x33, 0x3d, 0x9e, 0x39, 0xa6, 0x66, 0xaa, 0x64, 0xd5, 0x3d, 0xd1, 0x46, + 0x9f, 0xe8, 0xeb, 0xf7, 0xd1, 0x61, 0xe0, 0xb7, 0xed, 0x85, 0x34, 0x4f, + 0x53, 0xa2, 0x81, 0xc7, 0x30, 0x56, 0x1d, 0x78, 0xbe, 0x48, 0x34, 0x10, + 0x43, 0x6d, 0xf0, 0x9c, 0xf7, 0x53, 0x73, 0x9f, 0x6d, 0x93, 0x06, 0xed, + 0x45, 0x1b, 0xec, 0x8e, 0x3c, 0x78, 0xe0, 0x46, 0xaf, 0x71, 0x2d, 0xbe, + 0x45, 0x13, 0xec, 0x33, 0x33, 0x7b, 0x1f, 0xf8, 0xea, 0x21, 0xe6, 0x35, + 0x2d, 0x4e, 0x60, 0xe5, 0x5c, 0x1d, 0xb2, 0xe6, 0x72, 0x3b, 0x82, 0xb7, + 0x0c, 0x9b, 0x4a, 0x0b, 0xe9, 0x62, 0x04, 0x8d, 0xa5, 0x27, 0xcc, 0xee, + 0xcb, 0xae, 0xc2, 0x80, 0xf9, 0xdf, 0xb2, 0x1d, 0x02, 0xd6, 0x81, 0x7f, + 0xd4, 0x65, 0x1f, 0x35, 0xab, 0x7d, 0xee, 0xa1, 0x7d, 0xe1, 0xd8, 0xaf, + 0x98, 0x0a, 0xe0, 0xd4, 0xc8, 0x8a, 0x5d, 0xec, 0x08, 0x13, 0xe2, 0x9d, + 0xea, 0x06, 0x60, 0x66, 0x47, 0x50, 0xf0, 0x0d, 0xf3, 0x12, 0x90, 0x4e, + 0x88, 0x88, 0xc1, 0x67, 0x8c, 0xc6, 0x84, 0xf1, 0x38, 0xe7, 0x3a, 0x05, + 0xbf, 0x83, 0xf6, 0xa0, 0x69, 0x37, 0x39, 0x15, 0x15, 0xd3, 0x18, 0x12, + 0x2d, 0x9d, 0x0a, 0xd5, 0x4f, 0xbc, 0xa6, 0x0b, 0xec, 0x82, 0xd6, 0x76, + 0xd1, 0x81, 0xd4, 0xe2, 0x72, 0x74, 0x11, 0x8c, 0x09, 0xf6, 0x43, 0x4f, + 0x1e, 0x40, 0x97, 0x25, 0x71, 0xcb, 0x02, 0x86, 0xe4, 0x54, 0xba, 0xca, + 0x2b, 0x7d, 0x81, 0x32, 0x3a, 0xcc, 0xfb, 0x90, 0x88, 0xa0, 0xc3, 0x53, + 0xa6, 0x2c, 0x0e, 0xf9, 0x38, 0x61, 0x55, 0xdd, 0xa8, 0x86, 0x82, 0x1c, + 0x54, 0x0e, 0x46, 0xc1, 0x93, 0x33, 0xf0, 0x65, 0x5c, 0x44, 0x78, 0x42, + 0x35, 0xf8, 0xc2, 0x06, 0xb0, 0xee, 0x0d, 0x7e, 0xc4, 0x86, 0xeb, 0x53, + 0xa5, 0x87, 0x49, 0xe2, 0xe1, 0x65, 0xde, 0x89, 0x54, 0x34, 0xf3, 0xfd, + 0x01, 0xb5, 0x14, 0x35, 0xb6, 0x40, 0x8f, 0x69, 0x94, 0xe2, 0xa7, 0x54, + 0x14, 0xbc, 0xaa, 0x78, 0xf1, 0x84, 0x50, 0xd6, 0x04, 0x63, 0x9c, 0xa8, + 0x51, 0xfa, 0xb6, 0x96, 0x01, 0x5e, 0xe7, 0xcd, 0x18, 0x45, 0x54, 0xb7, + 0x67, 0x7c, 0x4d, 0x14, 0x7a, 0xd3, 0x54, 0xba, 0x58, 0x0f, 0x6f, 0xcc, + 0x27, 0xe0, 0x89, 0xc1, 0x9b, 0x24, 0x6b, 0x8d, 0x76, 0x80, 0xe3, 0x8d, + 0xcc, 0x21, 0xb6, 0xa2, 0x58, 0x63, 0xa0, 0xcb, 0x82, 0x0a, 0x9b, 0x55, + 0x0a, 0x7a, 0x2e, 0x06, 0x2e, 0x69, 0x61, 0x1c, 0x77, 0xc7, 0x96, 0xd4, + 0x25, 0x1d, 0xae, 0x99, 0x19, 0x8c, 0x25, 0xdf, 0x2e, 0x8e, 0x49, 0x65, + 0xe7, 0xbf, 0xc6, 0x9b, 0x40, 0x6e, 0x02, 0x8b, 0x1a, 0xc3, 0x1e, 0xb8, + 0x37, 0x00, 0xad, 0x1a, 0x32, 0x46, 0xde, 0x31, 0x62, 0xdf, 0xa1, 0x8f, + 0x83, 0xc4, 0x9d, 0x55, 0x41, 0xff, 0x04, 0x4e, 0x81, 0x1c, 0xe9, 0x07, + 0xd0, 0xa6, 0x1b, 0xa1, 0x29, 0x01, 0xda, 0x2d, 0x3f, 0x52, 0x85, 0xa8, + 0x16, 0x04, 0x90, 0xdf, 0x63, 0xdc, 0x58, 0x97, 0xbd, 0x1e, 0x1a, 0x39, + 0x23, 0x1b, 0xa6, 0xbd, 0x74, 0x18, 0x15, 0x7f, 0x37, 0x61, 0xb7, 0x60, + 0x41, 0x05, 0xbe, 0xb0, 0xa2, 0xb3, 0x5f, 0x40, 0x41, 0x50, 0x1a, 0xab, + 0x67, 0xa1, 0x8b, 0x27, 0x01, 0x34, 0x0b, 0x67, 0x6f, 0xd3, 0xaa, 0x3e, + 0x6a, 0x51, 0x4f, 0x67, 0xbe, 0x9f, 0xfb, 0xa7, 0xa9, 0xa0, 0xf0, 0x51, + 0x40, 0xda, 0xd1, 0x4f, 0x26, 0x7b, 0x8e, 0xe1, 0xe8, 0x08, 0x7a, 0xbb, + 0x30, 0x14, 0xcf, 0x12, 0x44, 0xb0, 0x1e, 0xa4, 0x92, 0x33, 0xd0, 0xc6, + 0x04, 0x74, 0x79, 0xcf, 0xcb, 0x79, 0x0f, 0x80, 0x57, 0x9d, 0xb3, 0x1a, + 0xd3, 0xd2, 0xad, 0x38, 0x60, 0xa2, 0xc7, 0x8c, 0xe1, 0xbb, 0xa4, 0x98, + 0x83, 0xfe, 0x63, 0x54, 0x1b, 0x05, 0xf4, 0x9b, 0xcf, 0xb7, 0xb3, 0xe0, + 0xf8, 0x7b, 0x49, 0xfb, 0x38, 0x4e, 0x49, 0x5f, 0x98, 0x36, 0x87, 0x9f, + 0x0e, 0x60, 0x44, 0x5a, 0x18, 0x23, 0xca, 0x93, 0x60, 0x9f, 0xf3, 0x91, + 0xe5, 0x89, 0xbd, 0x8f, 0xf4, 0xbe, 0xca, 0x67, 0x49, 0x8f, 0xd4, 0x18, + 0x83, 0x73, 0x4b, 0x10, 0x7a, 0xc6, 0xed, 0x38, 0xc6, 0x2a, 0x98, 0x79, + 0xec, 0x59, 0x22, 0x11, 0xc0, 0x2c, 0x74, 0x05, 0x93, 0x4f, 0xd0, 0x9e, + 0x7d, 0xd8, 0x0c, 0x7d, 0x81, 0xe0, 0xa7, 0x3b, 0x38, 0x1c, 0xfa, 0xc2, + 0x1c, 0xe2, 0x0a, 0xbe, 0xba, 0x33, 0x63, 0x15, 0x81, 0x43, 0x4d, 0xcb, + 0x1a, 0xbc, 0xe1, 0x64, 0x43, 0x3e, 0x54, 0x0b, 0x56, 0x8b, 0x08, 0x70, + 0xff, 0xff, 0xf2, 0xde, 0x6e, 0xa1, 0x6d, 0x2d, 0x6c, 0xe0, 0x7f, 0xd8, + 0x47, 0xbe, 0xa2, 0xe0, 0xbf, 0xbb, 0x3c, 0x45, 0x63, 0xf9, 0xa7, 0xfc, + 0xc5, 0x81, 0xa0, 0x15, 0x5c, 0xc7, 0x1f, 0xed, 0x33, 0x7b, 0xd8, 0x6b, + 0xd6, 0x33, 0x36, 0xff, 0xac, 0xf6, 0x03, 0x3b, 0x76, 0x03, 0x33, 0xfe, + 0xa3, 0xff, 0x94, 0xad, 0x0d, 0x88, 0xc7, 0x2a, 0xfa, 0x93, 0xda, 0x8f, + 0x4d, 0xb6, 0x8c, 0xfe, 0x61, 0x6f, 0x75, 0xae, 0xaf, 0xad, 0x12, 0x78, + 0xf0, 0xcf, 0x1a, 0xff, 0xc8, 0xb0, 0x34, 0xa9, 0xa9, 0xbf, 0xc7, 0x03, + 0x66, 0x6b, 0xe0, 0x65, 0xbc, 0x2f, 0xff, 0xa4, 0xf6, 0xc1, 0xc3, 0x6b, + 0x99, 0xf6, 0x1f, 0x71, 0xbb, 0x33, 0xb6, 0x8b, 0xb0, 0x95, 0xe3, 0x9f, + 0xd5, 0x7e, 0xa9, 0x01, 0xae, 0xba, 0xa8, 0xfb, 0xbd, 0xfd, 0xc0, 0xde, + 0x9b, 0x2e, 0xf8, 0x84, 0xd5, 0x9f, 0xd3, 0x7f, 0xbe, 0x1a, 0xb1, 0xa6, + 0xfb, 0xff, 0x51, 0xd7, 0x00, 0x13, 0xc8, 0xbd, 0x29, 0xef, 0xd0, 0x9f, + 0x34, 0xfe, 0xf6, 0x5e, 0x24, 0x78, 0xde, 0xd7, 0xfe, 0x7b, 0xff, 0x35, + 0xf2, 0xdc, 0xbf, 0x07, 0x0d, 0x34, 0x87, 0x53, 0x68, 0xff, 0x37, 0xd6, + 0x8f, 0x60, 0x95, 0xcd, 0x7c, 0xdb, 0x4b, 0x26, 0xfa, 0x16, 0x7c, 0xa8, + 0x40, 0xee, 0xfe, 0x6d, 0xbc, 0x77, 0x54, 0x51, 0x9d, 0xa4, 0xc1, 0x2d, + 0x6e, 0xc1, 0x99, 0x4f, 0xda, 0xea, 0x8f, 0x3a, 0x27, 0xbf, 0xd7, 0x0b, + 0xe9, 0xc8, 0x7c, 0x5f, 0xed, 0x57, 0xbd, 0x90, 0xb9, 0x36, 0x89, 0x30, + 0xe8, 0xb3, 0xf4, 0xac, 0xee, 0x3f, 0x1f, 0x83, 0x41, 0xc7, 0xb2, 0xe9, + 0x57, 0x3d, 0x13, 0xf0, 0x30, 0x61, 0x4d, 0x16, 0x61, 0xb2, 0x7e, 0xe3, + 0xcd, 0x1f, 0x75, 0x4f, 0x7e, 0xaf, 0x3b, 0x32, 0xef, 0x75, 0x7c, 0x15, + 0x26, 0xfe, 0xbd, 0xe6, 0x4b, 0xab, 0x57, 0xa5, 0x31, 0x54, 0x59, 0x3b, + 0xaa, 0xed, 0xe9, 0xf2, 0xeb, 0x98, 0x9f, 0xf1, 0x1f, 0xe7, 0xf4, 0xef, + 0xff, 0x78, 0xee, 0x77, 0xf6, 0x9e, 0xeb, 0xb0, 0x04, 0x4d, 0x96, 0x92, + 0xea, 0xd0, 0xaa, 0x21, 0xe3, 0x52, 0xed, 0x4d, 0xfb, 0x21, 0xa6, 0xe1, + 0x9c, 0xa5, 0x58, 0xe1, 0x3a, 0xba, 0xe7, 0x4c, 0x6c, 0x12, 0x3d, 0x30, + 0x01, 0xa7, 0x7d, 0xe0, 0xac, 0x5f, 0x7d, 0x4e, 0xd4, 0xbc, 0x3e, 0x10, + 0xd4, 0xd4, 0x3c, 0x8e, 0xcd, 0xf8, 0x2b, 0xbf, 0xe9, 0x64, 0x3b, 0x33, + 0xe7, 0xc2, 0xef, 0x9b, 0xc4, 0xa8, 0x2a, 0xa2, 0x07, 0xbf, 0x8e, 0xe5, + 0x09, 0xfc, 0x9b, 0x09, 0xc4, 0xc0, 0x33, 0x89, 0xba, 0x9a, 0xeb, 0x4b, + 0xb0, 0xa8, 0xc1, 0x0b, 0xc2, 0x04, 0x23, 0xc6, 0xaa, 0xc9, 0x6a, 0x16, + 0x80, 0xef, 0x9a, 0xf2, 0x09, 0xe9, 0x7b, 0x4d, 0xb9, 0xa4, 0x3d, 0xbd, + 0xf2, 0xb6, 0xda, 0x43, 0x7b, 0x18, 0x88, 0x68, 0x92, 0xba, 0x7d, 0x23, + 0x9a, 0x4a, 0xa4, 0xa1, 0x5f, 0xb3, 0x56, 0x9a, 0x65, 0xc7, 0x10, 0x01, + 0xaf, 0x49, 0xa9, 0x75, 0xc8, 0x0d, 0x9c, 0x71, 0x7a, 0x9a, 0xd7, 0xac, + 0xa9, 0x52, 0x17, 0xe9, 0xbc, 0x4d, 0x68, 0xde, 0x67, 0x25, 0xda, 0x08, + 0x7c, 0xd5, 0x30, 0x3f, 0x37, 0xd2, 0x4b, 0x47, 0xdd, 0x32, 0xd5, 0x83, + 0x0e, 0x26, 0xcf, 0x03, 0x43, 0xf3, 0x7a, 0x00, 0x52, 0x1a, 0x8b, 0xc5, + 0xc1, 0x0b, 0x2a, 0x18, 0x33, 0x42, 0x1d, 0x44, 0x72, 0x4f, 0xec, 0x13, + 0xf0, 0xb0, 0x44, 0x47, 0xc0, 0x4d, 0xba, 0x9d, 0x68, 0x5f, 0x2f, 0x9c, + 0xda, 0x8f, 0x82, 0xf5, 0xdf, 0x73, 0x1f, 0x0a, 0xef, 0xfe, 0x02, 0xce, + 0x22, 0x4c, 0x6d, 0xb5, 0xb0, 0xfb, 0x47, 0x4c, 0xc3, 0x76, 0x01, 0x9a, + 0xaf, 0x74, 0x33, 0x23, 0xd7, 0xb0, 0xfd, 0xe7, 0xd4, 0x2b, 0x91, 0x2e, + 0xc4, 0xc1, 0x7f, 0xd4, 0x8b, 0xa0, 0xfa, 0x75, 0xde, 0x17, 0x47, 0x14, + 0xfb, 0xb3, 0xea, 0x45, 0xb0, 0x03, 0xfd, 0x7b, 0xbd, 0x88, 0x99, 0xd3, + 0x76, 0x7b, 0x23, 0x20, 0xf4, 0x4f, 0xab, 0x57, 0x21, 0x11, 0x75, 0x49, + 0xf7, 0xf7, 0x7a, 0x11, 0xba, 0xbd, 0x10, 0xcd, 0xbc, 0xd6, 0xee, 0x4f, + 0x6a, 0xbf, 0x25, 0x3d, 0x71, 0x91, 0xf9, 0xb7, 0x7a, 0x31, 0xf1, 0xbc, + 0xd7, 0x1c, 0x05, 0xf7, 0xe8, 0x4f, 0x6a, 0x9f, 0xb4, 0xe2, 0xfc, 0xf7, + 0x5a, 0x2d, 0xf0, 0xf7, 0x38, 0x3f, 0xff, 0xa1, 0x8c, 0xff, 0x59, 0xe3, + 0x9f, 0xa3, 0xe8, 0x85, 0x5d, 0xf6, 0xf7, 0xf6, 0x0f, 0xde, 0xc2, 0x92, + 0x6e, 0xe0, 0xfd, 0x59, 0xf5, 0x42, 0x38, 0x73, 0x17, 0x89, 0x16, 0xfc, + 0x8d, 0x53, 0xec, 0xbd, 0x96, 0x2d, 0x32, 0x85, 0xfe, 0xac, 0x5a, 0x35, + 0x3c, 0x6c, 0x14, 0x86, 0xf9, 0xff, 0x9b, 0xa6, 0xe9, 0xc0, 0xdb, 0x36, + 0x44, 0x67, 0x7f, 0x52, 0xff, 0x19, 0x17, 0x3e, 0x7b, 0x16, 0x80, 0x4f, + 0xa1, 0xb7, 0x72, 0x4a, 0x8a, 0x9e, 0xb2, 0xad, 0x14, 0x6d, 0x57, 0x63, + 0xc4, 0x40, 0x43, 0x1b, 0xc3, 0xf9, 0x18, 0xaf, 0x16, 0xe0, 0xed, 0x48, + 0x8c, 0xd4, 0x3b, 0xec, 0xec, 0x1e, 0x9b, 0xc1, 0x0b, 0xeb, 0xd1, 0x8d, + 0x98, 0xb8, 0xa1, 0xff, 0x35, 0xa6, 0x38, 0x71, 0x32, 0xaf, 0xcf, 0xa8, + 0xde, 0xa2, 0x1d, 0x33, 0x9a, 0xf6, 0x7d, 0xc8, 0x03, 0x27, 0x32, 0xb7, + 0x2f, 0xf0, 0x69, 0xe8, 0xe0, 0x04, 0xf5, 0xdf, 0x6b, 0x94, 0x20, 0xe6, + 0x66, 0xac, 0xbf, 0x33, 0x3d, 0xd8, 0xf3, 0x46, 0x88, 0x92, 0x29, 0x9e, + 0xeb, 0x72, 0xbe, 0x6f, 0xea, 0x17, 0xae, 0xc8, 0x49, 0xbb, 0xba, 0xf1, + 0x76, 0x7c, 0xc2, 0xbf, 0xe3, 0xf9, 0xd9, 0x0f, 0x53, 0x3d, 0x2a, 0xbd, + 0x81, 0xe7, 0xa9, 0x7d, 0x81, 0xcf, 0x54, 0xbc, 0x91, 0x22, 0x63, 0x6c, + 0xfe, 0x4c, 0x0f, 0xc7, 0xa4, 0xb9, 0x2b, 0xe7, 0xcf, 0x0c, 0xbf, 0x6a, + 0x8e, 0x18, 0x7a, 0xcc, 0xb4, 0x61, 0x20, 0xaa, 0xf7, 0xe0, 0x33, 0x79, + 0xee, 0x43, 0x6a, 0xa9, 0x08, 0x3c, 0x4f, 0xbf, 0xcb, 0x34, 0xeb, 0xf1, + 0x7b, 0x4d, 0x93, 0x68, 0x8c, 0x5b, 0xfd, 0x70, 0xa0, 0x2a, 0x17, 0xde, + 0x65, 0x2a, 0x92, 0x60, 0xae, 0x61, 0x42, 0xc2, 0xc9, 0x5e, 0x94, 0x89, + 0xbc, 0x17, 0x7e, 0x35, 0x84, 0xbe, 0xda, 0xd3, 0x69, 0xfb, 0xce, 0x0d, + 0xe2, 0x17, 0x4d, 0xa3, 0xcf, 0x5e, 0x0a, 0xda, 0xda, 0x64, 0x1c, 0xec, + 0xba, 0xa1, 0x86, 0x1c, 0xc9, 0x1b, 0x05, 0xae, 0x2b, 0xbc, 0x2a, 0x2d, + 0xf4, 0xa0, 0x67, 0xa6, 0xdd, 0x81, 0xe7, 0xc8, 0x85, 0x2e, 0x5f, 0xb9, + 0xce, 0x80, 0x83, 0x57, 0xbc, 0x74, 0x99, 0x28, 0xfd, 0x79, 0x9d, 0x1c, + 0x42, 0x9c, 0x8f, 0x23, 0xa7, 0x62, 0x24, 0x3a, 0xf8, 0x5a, 0xd6, 0x7b, + 0xb1, 0x36, 0x54, 0xa4, 0x45, 0x31, 0x81, 0x9f, 0x0c, 0x3c, 0x1a, 0xf4, + 0x61, 0x07, 0xe7, 0x86, 0xf3, 0x57, 0xff, 0x51, 0x13, 0xe5, 0xd7, 0x3d, + 0x11, 0x8b, 0x73, 0x2f, 0xb8, 0x4a, 0xb6, 0xb6, 0x0e, 0x4e, 0xb4, 0xc0, + 0xb5, 0x7d, 0xcb, 0x1b, 0xa5, 0xc5, 0x1e, 0xf8, 0x4f, 0x57, 0x37, 0x70, + 0x42, 0x1e, 0x74, 0xaa, 0xe0, 0x27, 0x28, 0x44, 0x43, 0x04, 0xc4, 0x64, + 0xdf, 0xa0, 0x4f, 0x14, 0x77, 0x60, 0xa6, 0x3d, 0x54, 0xb1, 0xb6, 0x4f, + 0xf3, 0xae, 0x82, 0xeb, 0x63, 0x59, 0xd1, 0x9d, 0x26, 0x39, 0xa9, 0x73, + 0x72, 0x1e, 0xfc, 0x92, 0xd3, 0xf7, 0x5e, 0x07, 0x06, 0x4c, 0xc0, 0xbf, + 0x75, 0x82, 0x1e, 0x9d, 0xc6, 0x08, 0x3d, 0x7c, 0x25, 0x69, 0x64, 0x96, + 0x0e, 0x4b, 0x13, 0x83, 0x9c, 0x8f, 0xe7, 0xe1, 0x0a, 0xde, 0x69, 0x49, + 0xd5, 0xfa, 0x15, 0x3a, 0x78, 0x0a, 0xb5, 0xd7, 0x82, 0x4d, 0x36, 0xfa, + 0xbd, 0xa6, 0x89, 0xbd, 0x64, 0xa6, 0x78, 0xe1, 0x1a, 0x93, 0x43, 0x1a, + 0x2e, 0x98, 0x7f, 0xb9, 0x95, 0xc6, 0xcb, 0x60, 0x3a, 0xcc, 0xa5, 0x8f, + 0x86, 0x23, 0x8a, 0x26, 0xe6, 0x0e, 0x93, 0xec, 0x6c, 0x0c, 0xd6, 0xf1, + 0x50, 0x4e, 0xeb, 0xa9, 0x54, 0xf6, 0xae, 0x44, 0xd2, 0x2b, 0x79, 0xe0, + 0xc5, 0x1e, 0x39, 0x64, 0x74, 0x04, 0xaf, 0xca, 0x0e, 0x87, 0x78, 0xb5, + 0xc9, 0xb4, 0xe8, 0xc5, 0xa6, 0xf5, 0x02, 0x7c, 0xbb, 0x46, 0xbd, 0xde, + 0x00, 0x42, 0x9e, 0x8a, 0x16, 0xfc, 0x5b, 0x3c, 0xf4, 0xa1, 0xde, 0x9f, + 0x85, 0x23, 0xa0, 0x2f, 0x72, 0x28, 0x6a, 0x98, 0xb3, 0x44, 0xd5, 0xc5, + 0x66, 0xc0, 0x24, 0x95, 0x84, 0xb8, 0xf3, 0x9a, 0xe1, 0xc0, 0xa3, 0x54, + 0x78, 0xe0, 0xed, 0xce, 0x61, 0xdd, 0x3c, 0x43, 0xfa, 0xf5, 0x06, 0xc5, + 0xf4, 0x92, 0x4e, 0x70, 0x0b, 0x6b, 0xb1, 0x8f, 0x3d, 0xb5, 0xc3, 0x88, + 0x2d, 0x8a, 0xa4, 0xea, 0x4b, 0xad, 0x27, 0x98, 0xa9, 0xa5, 0x68, 0x82, + 0x5a, 0x98, 0xd8, 0x8b, 0x5b, 0x34, 0x92, 0xb4, 0x47, 0x89, 0x5e, 0xe5, + 0xbc, 0x13, 0x8b, 0x48, 0xb3, 0xdc, 0xa4, 0x79, 0x19, 0xc4, 0xfb, 0xb5, + 0xe7, 0xae, 0xe1, 0x4d, 0x6f, 0x1d, 0xd2, 0xfe, 0xcc, 0x52, 0xf5, 0x28, + 0xe1, 0xf7, 0x58, 0xc7, 0x84, 0x75, 0x41, 0x2b, 0x34, 0xec, 0x48, 0x5f, + 0x3a, 0x30, 0xbf, 0xcb, 0xcc, 0x78, 0xe9, 0x71, 0x8a, 0x23, 0x01, 0xf3, + 0x5c, 0xfc, 0xda, 0x23, 0x19, 0xb4, 0xa1, 0x63, 0xf7, 0x89, 0x3b, 0x70, + 0x52, 0x63, 0x14, 0x6e, 0x86, 0xa4, 0x30, 0x40, 0x4b, 0x82, 0xc7, 0x67, + 0x46, 0x36, 0x61, 0x0f, 0xdf, 0xb0, 0x87, 0x92, 0x52, 0x45, 0xe0, 0x2d, + 0xd8, 0xb7, 0x30, 0xe4, 0x88, 0xdb, 0x2f, 0xe3, 0x80, 0x08, 0x2b, 0x6b, + 0x3b, 0x91, 0x4a, 0xbc, 0x59, 0xab, 0xce, 0x74, 0xbe, 0xb7, 0x6c, 0x56, + 0x4f, 0x50, 0x50, 0x5e, 0x42, 0xc9, 0x23, 0x6b, 0x2c, 0x1d, 0xf4, 0x89, + 0x97, 0x19, 0x43, 0x57, 0xb6, 0x58, 0x3b, 0x76, 0x0c, 0x20, 0x5b, 0x79, + 0x14, 0x7c, 0x7a, 0xc9, 0x2b, 0x8b, 0x6e, 0x56, 0xd9, 0x51, 0x91, 0x5d, + 0x3e, 0xe1, 0x3b, 0xdb, 0x0c, 0x3b, 0xee, 0xdb, 0x3b, 0x6a, 0xda, 0x58, + 0xb4, 0x5f, 0x73, 0x0d, 0x90, 0x1e, 0xa3, 0x4c, 0x3f, 0x52, 0x75, 0x3b, + 0x22, 0x3c, 0x0a, 0x6f, 0xb5, 0x01, 0xcf, 0xdf, 0xe6, 0xbe, 0x0c, 0x43, + 0x2d, 0xd2, 0x93, 0x56, 0xdd, 0xf7, 0xf3, 0x33, 0x22, 0x2d, 0xb3, 0x62, + 0x24, 0xaa, 0xd2, 0xdc, 0x9a, 0x84, 0x33, 0x4a, 0xf9, 0xf0, 0x82, 0x38, + 0x65, 0x58, 0xc7, 0xba, 0xf4, 0x99, 0x9b, 0x7b, 0xa4, 0xa2, 0x1e, 0x7c, + 0x86, 0xe3, 0x38, 0x52, 0xf2, 0x2e, 0x5a, 0x2b, 0x21, 0xc6, 0xb0, 0x08, + 0x3d, 0xe1, 0x43, 0x0c, 0xa7, 0xc2, 0x8f, 0x5e, 0xb9, 0xa7, 0x2e, 0xbc, + 0x26, 0x8d, 0x34, 0xfa, 0x1a, 0x6b, 0xc3, 0x53, 0xd2, 0xb1, 0x91, 0xac, + 0xdf, 0xef, 0xb5, 0x12, 0xb2, 0x09, 0x62, 0xd2, 0xe8, 0xf7, 0xcc, 0x0d, + 0x26, 0xae, 0xd6, 0x66, 0x42, 0x7b, 0x55, 0xfa, 0x2c, 0x8b, 0xbd, 0xa1, + 0x8d, 0x6b, 0xe4, 0x94, 0x49, 0x70, 0xc7, 0x7a, 0x40, 0x18, 0xbb, 0x3c, + 0xc3, 0xd6, 0xb2, 0xa2, 0x54, 0x3a, 0xf3, 0x1a, 0xbe, 0x44, 0x63, 0xf3, + 0x7a, 0x42, 0x33, 0x7f, 0x0f, 0x07, 0x98, 0xab, 0x03, 0xd5, 0x46, 0x5a, + 0xea, 0x78, 0x0f, 0xc7, 0xe6, 0xcc, 0xb5, 0x70, 0x9e, 0x54, 0xa4, 0xf0, + 0xed, 0x89, 0xd2, 0xd3, 0x33, 0x9a, 0x40, 0xeb, 0x25, 0x2c, 0x89, 0x6a, + 0x59, 0x45, 0x2d, 0x41, 0xc5, 0x14, 0xe4, 0x14, 0x66, 0x34, 0x32, 0x9a, + 0x05, 0x8c, 0xc7, 0xb2, 0xd4, 0x2f, 0x66, 0xc2, 0xe5, 0xa3, 0xa0, 0xaa, + 0x0f, 0x13, 0x99, 0x63, 0xb7, 0x5a, 0x86, 0x7e, 0x38, 0x42, 0x7f, 0x2e, + 0xd0, 0x1f, 0x67, 0xee, 0x0f, 0x85, 0xb8, 0xc8, 0x79, 0xf6, 0x8c, 0x74, + 0x61, 0x64, 0xa0, 0x05, 0xb9, 0x2f, 0x41, 0x6b, 0xca, 0x04, 0xbc, 0xf0, + 0xbe, 0x50, 0xd5, 0x18, 0xcd, 0x6b, 0x77, 0x1d, 0xd4, 0x1f, 0x20, 0xff, + 0x85, 0x2b, 0x50, 0x94, 0xaa, 0x76, 0x37, 0xb1, 0x9a, 0x23, 0xe6, 0xc1, + 0xb5, 0x4e, 0x79, 0xcb, 0xbc, 0x2c, 0x21, 0x77, 0xaa, 0x9f, 0x6e, 0xc2, + 0x25, 0xf1, 0x5c, 0xef, 0x83, 0x74, 0x97, 0x9b, 0x34, 0xb1, 0x19, 0x37, + 0xcd, 0x8b, 0x6a, 0x2b, 0x23, 0x4b, 0xa4, 0x83, 0x7d, 0xb2, 0x93, 0x6d, + 0x63, 0x85, 0xd4, 0x85, 0xb6, 0x60, 0x8e, 0x3a, 0x86, 0xa9, 0xa6, 0xd2, + 0x9d, 0x29, 0x5f, 0x80, 0x01, 0xdf, 0x42, 0xaf, 0x2e, 0xa4, 0xc1, 0x35, + 0x31, 0x2e, 0x6f, 0xea, 0xb1, 0x9a, 0x25, 0x6a, 0x9b, 0xbb, 0x7d, 0x1a, + 0x37, 0xf8, 0x15, 0xf2, 0x7e, 0x77, 0x9c, 0xd7, 0x28, 0xb6, 0xae, 0x86, + 0x3b, 0xe8, 0xf1, 0x64, 0xeb, 0x90, 0x63, 0x03, 0x07, 0x2d, 0x91, 0x2b, + 0xfc, 0xa2, 0xf3, 0xfa, 0x7b, 0xfe, 0x82, 0x58, 0x1a, 0xc1, 0x17, 0xf4, + 0xea, 0xc0, 0x55, 0x45, 0x58, 0x25, 0x0a, 0x07, 0xab, 0xa2, 0xc6, 0x3c, + 0x37, 0xb1, 0x95, 0x53, 0x99, 0xce, 0xf7, 0xe3, 0x8e, 0x5c, 0xbc, 0x0e, + 0x9e, 0xee, 0x1e, 0xe7, 0x31, 0x31, 0x02, 0x5e, 0xd2, 0xd7, 0x3b, 0x51, + 0xc2, 0x2f, 0xa6, 0x4a, 0x23, 0xa6, 0x7c, 0x67, 0x4c, 0xde, 0x77, 0x46, + 0xf0, 0xeb, 0x99, 0x10, 0xd1, 0xc5, 0x06, 0xf0, 0xae, 0x29, 0x58, 0xf4, + 0x2e, 0x50, 0x80, 0x4a, 0x54, 0xf9, 0x65, 0x62, 0xc7, 0x39, 0x4c, 0x0a, + 0xe7, 0xa4, 0x11, 0xed, 0x62, 0x21, 0x53, 0xdb, 0x28, 0x1b, 0x95, 0xd0, + 0x36, 0xb8, 0x26, 0xda, 0x45, 0x8f, 0x3b, 0x7b, 0xae, 0xcb, 0x51, 0x01, + 0x96, 0xe3, 0x03, 0x15, 0x07, 0xc8, 0x2d, 0xce, 0xfd, 0xf5, 0xed, 0xb0, + 0x59, 0x09, 0xae, 0x18, 0x0e, 0xfd, 0xe0, 0x79, 0x4c, 0xe9, 0xab, 0xa0, + 0x63, 0x4f, 0x19, 0x79, 0x13, 0xad, 0x7a, 0xc5, 0xa8, 0xef, 0x98, 0x3a, + 0x69, 0xc4, 0xd5, 0xa7, 0x79, 0x6f, 0x9f, 0xa4, 0xaa, 0x29, 0xd2, 0x59, + 0x8b, 0x8b, 0x81, 0x70, 0xdd, 0xa4, 0x89, 0x42, 0xb8, 0xc3, 0x98, 0x41, + 0xde, 0x53, 0x4d, 0x4e, 0x07, 0x8f, 0xb0, 0xc4, 0x0f, 0x5c, 0xd6, 0xb0, + 0x5f, 0x35, 0x83, 0x78, 0x6b, 0x55, 0xc0, 0x34, 0x06, 0x78, 0x38, 0x4c, + 0x38, 0x81, 0x6c, 0xea, 0xa3, 0xa8, 0x5d, 0x4c, 0xc2, 0xb3, 0xb0, 0x4c, + 0x33, 0x13, 0x22, 0x6b, 0x0c, 0x7f, 0x3d, 0x07, 0xa8, 0xf6, 0xc4, 0x0c, + 0x14, 0xcc, 0xb3, 0x16, 0xa7, 0xe5, 0x74, 0xa0, 0xfd, 0x3e, 0x9f, 0x24, + 0x8e, 0xbd, 0xd3, 0xfb, 0xc0, 0x83, 0xf7, 0x7c, 0xd7, 0x36, 0x9a, 0xe4, + 0x77, 0xe2, 0x13, 0x4f, 0xe8, 0x27, 0x8b, 0x36, 0xbd, 0x1e, 0x75, 0xfd, + 0x5e, 0xd4, 0x90, 0xff, 0xc0, 0x65, 0xc7, 0x04, 0x9b, 0x38, 0x59, 0x1b, + 0x47, 0x77, 0xe5, 0x12, 0x97, 0x1a, 0x9c, 0xf5, 0x15, 0xe8, 0xa8, 0x7b, + 0xa4, 0xdb, 0x0c, 0x3c, 0x15, 0x4a, 0x34, 0x14, 0xc6, 0xcc, 0x7e, 0x0a, + 0x33, 0x20, 0x32, 0x9d, 0xf7, 0x28, 0x04, 0x82, 0x4c, 0xa7, 0xd7, 0x5c, + 0x1f, 0x8f, 0x6a, 0x15, 0x50, 0x59, 0x36, 0x09, 0x13, 0xce, 0x39, 0xd9, + 0x8f, 0x98, 0x21, 0x33, 0xaa, 0x99, 0x1f, 0x19, 0x5f, 0xf0, 0x9a, 0x3d, + 0xe4, 0xcd, 0xca, 0x00, 0xef, 0x17, 0x16, 0x4d, 0xa4, 0x25, 0x9b, 0xd5, + 0x5c, 0xd7, 0x23, 0x8f, 0x1b, 0x92, 0x0a, 0x8f, 0xdc, 0x05, 0x93, 0x63, + 0x6c, 0x20, 0x81, 0x8d, 0xd2, 0xa2, 0x9a, 0x50, 0xd4, 0xd3, 0xad, 0x30, + 0xa5, 0x5a, 0xe2, 0xc8, 0x20, 0xd7, 0x45, 0x84, 0x0d, 0x55, 0xe7, 0xba, + 0x3b, 0xc1, 0xd8, 0xd7, 0x82, 0xf5, 0x8c, 0xbd, 0x57, 0x97, 0x98, 0xcf, + 0x75, 0x21, 0x43, 0x23, 0x71, 0xd9, 0x15, 0x3c, 0xd0, 0x20, 0x4d, 0x12, + 0x72, 0x25, 0x19, 0x49, 0x21, 0x43, 0x7c, 0x61, 0x4b, 0x55, 0x45, 0x89, + 0x5f, 0x9a, 0x47, 0xba, 0x22, 0xc2, 0x0f, 0x2d, 0xe9, 0x69, 0x1a, 0x73, + 0x6c, 0x9f, 0xd5, 0x4a, 0xec, 0x4c, 0xe0, 0xd2, 0xf3, 0xea, 0xc2, 0xd3, + 0x3e, 0x8d, 0x26, 0xc0, 0xca, 0x79, 0x8f, 0x2b, 0xab, 0xf2, 0x79, 0xbd, + 0x6c, 0xc2, 0xd4, 0x0e, 0x72, 0x3a, 0xca, 0x0c, 0xd5, 0x4a, 0xaf, 0x82, + 0xd8, 0x41, 0x57, 0x49, 0xc9, 0x3b, 0x9e, 0xe6, 0x3d, 0x4e, 0xa0, 0x77, + 0x54, 0xa8, 0xe7, 0xcd, 0x7d, 0x94, 0x3c, 0x7b, 0x95, 0xde, 0x97, 0x79, + 0x70, 0x59, 0x26, 0xb4, 0xfe, 0x96, 0x77, 0xc1, 0x04, 0x73, 0x3a, 0x26, + 0x28, 0xf0, 0x0a, 0x9f, 0x8e, 0xa5, 0x4b, 0xe8, 0x4e, 0x43, 0x46, 0xac, + 0xb1, 0xb3, 0xd4, 0xd0, 0x21, 0x9e, 0xa4, 0x4d, 0xe2, 0xe1, 0x19, 0x99, + 0xf2, 0x1e, 0x1a, 0xab, 0x38, 0x4a, 0x7e, 0xed, 0x99, 0x48, 0x89, 0x99, + 0x69, 0xa4, 0xb6, 0xe1, 0x1a, 0xed, 0x8c, 0x2b, 0x75, 0x28, 0x3d, 0x9c, + 0x16, 0x54, 0x17, 0x59, 0x2d, 0x91, 0x74, 0xe5, 0x96, 0x6d, 0xee, 0x1a, + 0xed, 0x2a, 0x88, 0xb5, 0x95, 0x17, 0x37, 0x96, 0x15, 0xd7, 0xcc, 0x20, + 0x30, 0x1e, 0x07, 0xca, 0xa2, 0xa8, 0x73, 0x6f, 0x30, 0xee, 0x24, 0xa6, + 0xc8, 0x97, 0x73, 0x4d, 0x1f, 0xd5, 0xc3, 0xf5, 0x51, 0x3d, 0xa3, 0xea, + 0x5d, 0x18, 0x27, 0x23, 0xa6, 0x2f, 0x53, 0xb6, 0xab, 0x5d, 0x61, 0x30, + 0xfb, 0xe8, 0x7d, 0x3d, 0x49, 0xad, 0xfa, 0x3c, 0x5e, 0x79, 0x3b, 0x73, + 0xab, 0xe7, 0xa6, 0x5d, 0xe1, 0x04, 0x72, 0xc2, 0xc1, 0x90, 0xaf, 0x95, + 0xc9, 0x3b, 0xd6, 0x95, 0x0a, 0xeb, 0x47, 0xae, 0x9f, 0xe9, 0x24, 0xde, + 0x91, 0xc6, 0xf4, 0x90, 0xea, 0xcf, 0x83, 0x7b, 0xd1, 0x72, 0xa3, 0xaa, + 0xf1, 0x44, 0xb4, 0x23, 0xea, 0x43, 0xe1, 0xc9, 0x79, 0x8f, 0x48, 0x1d, + 0xd7, 0x15, 0x60, 0x08, 0x31, 0xa4, 0xde, 0xab, 0xdc, 0xef, 0x9f, 0xf1, + 0x34, 0xd7, 0xe9, 0x41, 0xe0, 0xc6, 0xa8, 0x71, 0xf4, 0x74, 0x18, 0x93, + 0xd3, 0x4d, 0x02, 0x6b, 0x70, 0x37, 0xa0, 0xc4, 0xfb, 0x7a, 0x45, 0x53, + 0xf4, 0x94, 0x28, 0xc8, 0x89, 0x49, 0x35, 0xc8, 0xac, 0x07, 0xe7, 0x11, + 0x60, 0x13, 0x79, 0x0b, 0x66, 0xf7, 0xac, 0xeb, 0xcd, 0x23, 0xb4, 0x9d, + 0xf3, 0x1e, 0xe2, 0x9f, 0x01, 0x42, 0xca, 0x0b, 0xa6, 0x28, 0x96, 0xb5, + 0x4c, 0x69, 0x12, 0x99, 0x42, 0x87, 0xc9, 0x6c, 0x70, 0x1b, 0x6b, 0xe3, + 0x92, 0x4c, 0xca, 0x84, 0x79, 0xd5, 0x0b, 0x54, 0x55, 0x82, 0xb1, 0x87, + 0x68, 0x74, 0x23, 0x67, 0xd4, 0x88, 0x13, 0x92, 0x24, 0x26, 0xeb, 0x81, + 0xdb, 0x42, 0x66, 0xcc, 0xb5, 0x0d, 0xfa, 0x16, 0xa3, 0x35, 0xe0, 0x01, + 0xfe, 0x2e, 0x1b, 0x06, 0xe7, 0x53, 0xdb, 0xc8, 0xb0, 0xcc, 0x88, 0x55, + 0xcb, 0xd8, 0x93, 0x43, 0x39, 0xaf, 0x8e, 0x4e, 0xd4, 0x0b, 0xc6, 0xe6, + 0x1a, 0xba, 0x62, 0x79, 0x4c, 0xe6, 0xfd, 0x45, 0xba, 0x3b, 0xd7, 0xf3, + 0x89, 0x35, 0xa1, 0x25, 0x3e, 0xda, 0x12, 0x6f, 0x75, 0x10, 0xca, 0x16, + 0x39, 0xf8, 0xc9, 0xc2, 0xb1, 0x17, 0xd4, 0x39, 0xdd, 0xf2, 0xcd, 0x2a, + 0x96, 0xda, 0xe2, 0x8d, 0x11, 0x99, 0x62, 0x45, 0x52, 0xe0, 0xe0, 0x31, + 0x46, 0xf6, 0x5c, 0x6f, 0xe8, 0x3f, 0xda, 0xd7, 0xb1, 0x2a, 0x6b, 0xb6, + 0x0d, 0xd5, 0xbc, 0x67, 0x0c, 0x21, 0xc0, 0x86, 0xf0, 0xe8, 0xd8, 0xbb, + 0x83, 0xb7, 0xb5, 0x30, 0x97, 0x67, 0xe1, 0x8d, 0x22, 0x99, 0xec, 0x96, + 0x7a, 0x81, 0x9b, 0x24, 0xf2, 0x29, 0x52, 0xf2, 0xc6, 0x8c, 0xec, 0x43, + 0xaf, 0x87, 0x31, 0x14, 0x3d, 0x77, 0x90, 0x4e, 0x75, 0xd4, 0x15, 0xad, + 0xf8, 0x4e, 0xcc, 0xf5, 0x2d, 0x37, 0x58, 0x24, 0x34, 0x60, 0x53, 0x43, + 0x92, 0x8c, 0x05, 0x11, 0xcc, 0x59, 0x2d, 0x34, 0xf5, 0x1d, 0xd3, 0xf2, + 0xc5, 0xe6, 0x7d, 0xe0, 0x9d, 0xc0, 0x51, 0x17, 0xec, 0x45, 0xa3, 0x9e, + 0x31, 0x93, 0xe0, 0xcd, 0xfb, 0x2b, 0xa6, 0x8d, 0x81, 0xd3, 0xed, 0xbc, + 0x06, 0xf4, 0x9c, 0x77, 0xa1, 0x96, 0x98, 0xfd, 0x23, 0x82, 0x5c, 0x05, + 0x4c, 0x37, 0x8e, 0x4e, 0x85, 0x08, 0xdf, 0xde, 0xc2, 0x0e, 0x33, 0xd6, + 0x8a, 0x18, 0x38, 0x1c, 0xbc, 0x3e, 0x5e, 0x86, 0x48, 0xf5, 0xe4, 0x3c, + 0xec, 0x18, 0xbf, 0x8c, 0x6c, 0x52, 0xa4, 0x04, 0x6d, 0x33, 0xd7, 0xc0, + 0x21, 0x30, 0xd7, 0xa1, 0x4f, 0xa2, 0x5c, 0xd3, 0xb7, 0xb2, 0x41, 0x39, + 0xf1, 0xc9, 0x96, 0x20, 0xf2, 0xda, 0x4f, 0xd5, 0x42, 0xa2, 0xb9, 0x76, + 0xca, 0xc5, 0x8c, 0xa9, 0xb8, 0x84, 0xbe, 0x08, 0xc3, 0xb4, 0xbf, 0x49, + 0xc8, 0xb9, 0x43, 0x8a, 0x62, 0xd1, 0x0e, 0xe6, 0x5c, 0xc3, 0x25, 0xe3, + 0x6c, 0x97, 0x29, 0x79, 0x48, 0xe8, 0x0a, 0x70, 0x59, 0xbf, 0x44, 0x8d, + 0x65, 0x82, 0x86, 0xde, 0x1e, 0x1b, 0x3c, 0x08, 0xe0, 0x2d, 0x61, 0x56, + 0x36, 0x8c, 0x43, 0x06, 0xda, 0x57, 0x3b, 0xa4, 0xa2, 0xe1, 0x2c, 0xb0, + 0xb0, 0x86, 0x08, 0xcc, 0x7b, 0x3e, 0xdf, 0x8f, 0x4f, 0xce, 0x2b, 0x04, + 0x38, 0x7e, 0x4b, 0x12, 0xf4, 0x90, 0x7c, 0xfb, 0x0e, 0x75, 0xe6, 0x0b, + 0x85, 0x36, 0xa2, 0x06, 0x4e, 0x31, 0x81, 0x9f, 0xf5, 0xf5, 0x8b, 0xd3, + 0xe0, 0x5a, 0xa2, 0x3e, 0xc5, 0x46, 0xf0, 0x1d, 0x6b, 0x15, 0xbc, 0xe7, + 0x6a, 0x80, 0xaf, 0xdb, 0x98, 0xde, 0xc7, 0xb2, 0xae, 0x9e, 0x64, 0xde, + 0x77, 0xea, 0xc8, 0xe6, 0xe0, 0xae, 0x20, 0x17, 0x71, 0xc5, 0xbc, 0x93, + 0x96, 0x75, 0x72, 0xe6, 0xf1, 0xcb, 0xd1, 0x3f, 0x59, 0x30, 0x66, 0x28, + 0x34, 0xdc, 0xb9, 0xce, 0x02, 0x15, 0xf3, 0x3e, 0x99, 0x09, 0x09, 0xc9, + 0xad, 0x97, 0x34, 0xff, 0xa8, 0x51, 0x01, 0x73, 0x5d, 0xaa, 0x8a, 0x96, + 0xdc, 0x8a, 0x65, 0x4b, 0x96, 0x39, 0xba, 0x80, 0xcf, 0x46, 0x5e, 0x92, + 0xf6, 0xc3, 0xcc, 0x0b, 0xbc, 0x16, 0x80, 0x6d, 0x32, 0x4e, 0x6a, 0xe4, + 0xb1, 0x54, 0xc4, 0x51, 0x93, 0x59, 0x47, 0xa6, 0x8c, 0x83, 0x6b, 0x5d, + 0x0a, 0x15, 0x4c, 0x59, 0xd3, 0x68, 0x92, 0x5f, 0xb4, 0xcc, 0x20, 0xbb, + 0x58, 0x67, 0xc6, 0xfe, 0xfd, 0xa5, 0x1d, 0x19, 0x23, 0xb1, 0x87, 0xe2, + 0x90, 0x11, 0x7a, 0x74, 0x87, 0x24, 0x34, 0x54, 0x10, 0xb5, 0xa3, 0x5d, + 0x1a, 0x7d, 0x03, 0xf1, 0xa4, 0x76, 0xe0, 0x25, 0x24, 0x62, 0x37, 0xf0, + 0x1a, 0x0f, 0xa9, 0xb6, 0xaf, 0xbd, 0xbe, 0x7e, 0x47, 0x5c, 0x27, 0x47, + 0x5a, 0xbe, 0xb1, 0x3f, 0xab, 0x3e, 0x15, 0xf3, 0x64, 0x7e, 0x06, 0x54, + 0x8d, 0x2c, 0x5e, 0x55, 0x61, 0x0b, 0xde, 0xc4, 0xed, 0x17, 0x30, 0x57, + 0xd0, 0xfe, 0xc0, 0x58, 0x0a, 0x9a, 0xc2, 0x57, 0x7d, 0x01, 0xec, 0x02, + 0xfc, 0xa6, 0x85, 0x8a, 0xcc, 0x7b, 0xb2, 0x93, 0x24, 0x0d, 0x75, 0xce, + 0xe4, 0xbc, 0x6f, 0x72, 0x0b, 0xf9, 0xa6, 0xb3, 0xc4, 0x76, 0x13, 0xa5, + 0x36, 0xa0, 0x17, 0x3c, 0xd9, 0xb0, 0x57, 0x82, 0xec, 0x3c, 0x76, 0xd9, + 0xbc, 0xb7, 0x82, 0x49, 0x2a, 0xfb, 0x9c, 0xaa, 0x79, 0x9d, 0x42, 0x90, + 0xb1, 0xad, 0xb9, 0xd7, 0x71, 0x20, 0x9b, 0xbb, 0x99, 0x00, 0xfb, 0xcc, + 0xb8, 0x4c, 0x90, 0x98, 0xf7, 0x7b, 0x77, 0xd4, 0x8d, 0x16, 0x51, 0xfb, + 0x32, 0x70, 0xa3, 0x77, 0xcc, 0x13, 0xdd, 0x81, 0xf7, 0x3d, 0xe0, 0x75, + 0x5f, 0x34, 0xe2, 0x3b, 0xf4, 0xd8, 0x48, 0xf8, 0x98, 0x4b, 0x6f, 0x74, + 0x13, 0x33, 0xb8, 0xe6, 0xdc, 0xe2, 0xc4, 0xc7, 0xc6, 0xb1, 0x0e, 0xce, + 0x94, 0x5b, 0x24, 0x37, 0x99, 0xa2, 0x0e, 0x13, 0xd0, 0x07, 0x0a, 0x73, + 0xe7, 0xcc, 0xb1, 0x76, 0xf4, 0x45, 0x43, 0x1a, 0x5d, 0x01, 0xbf, 0x66, + 0x52, 0x9b, 0x9f, 0x6f, 0xca, 0x57, 0x96, 0x46, 0x56, 0xc8, 0x40, 0x93, + 0x1a, 0x32, 0x4f, 0x5a, 0xb4, 0x07, 0x71, 0x95, 0xef, 0xde, 0x43, 0xcb, + 0x5d, 0xfd, 0x56, 0xce, 0xb5, 0x14, 0xfd, 0x79, 0xad, 0x41, 0x75, 0x81, + 0xdc, 0x12, 0x89, 0xc7, 0xce, 0x07, 0x5a, 0x9d, 0xe3, 0x46, 0xdf, 0x95, + 0xba, 0x52, 0x47, 0x55, 0x61, 0xea, 0xf6, 0x73, 0xad, 0xde, 0xfe, 0xc8, + 0x83, 0x09, 0xda, 0x18, 0x85, 0xde, 0x67, 0xb4, 0x11, 0x6e, 0xe2, 0x81, + 0xae, 0x55, 0xdb, 0x05, 0xe5, 0xfd, 0xfb, 0x90, 0x94, 0xd6, 0x4e, 0x03, + 0x0e, 0x6b, 0x57, 0x55, 0xd6, 0xb0, 0x03, 0x31, 0xee, 0x5a, 0x9e, 0x32, + 0xfd, 0xe8, 0x57, 0xfd, 0x91, 0x62, 0x2d, 0x8b, 0x87, 0x5d, 0xa2, 0xa4, + 0x71, 0x4c, 0x02, 0x56, 0x78, 0x17, 0x3d, 0xa1, 0x63, 0x96, 0x03, 0x7f, + 0x70, 0x66, 0x63, 0xe0, 0x3a, 0x83, 0xfb, 0xa0, 0x9b, 0x52, 0xd9, 0x65, + 0xef, 0x21, 0x2b, 0xe9, 0xaa, 0x09, 0x4d, 0x06, 0xbe, 0x54, 0xd4, 0xa0, + 0x0d, 0x2c, 0x18, 0x1b, 0x0b, 0xb4, 0x82, 0xc9, 0xa8, 0xba, 0x80, 0x8e, + 0x7a, 0xe6, 0x3e, 0xd6, 0xc3, 0x66, 0xdc, 0xe5, 0x08, 0x02, 0x41, 0x93, + 0xd1, 0x21, 0x91, 0x49, 0x04, 0x9e, 0x2e, 0xd3, 0x41, 0x47, 0xd7, 0x78, + 0x51, 0x82, 0x3e, 0x3f, 0x00, 0x43, 0xfc, 0xaa, 0x59, 0x86, 0x58, 0x06, + 0x7c, 0x3e, 0xb2, 0xae, 0x22, 0x89, 0x31, 0x40, 0xce, 0x5e, 0xa6, 0x9c, + 0xaf, 0xfc, 0xb2, 0x19, 0xfc, 0x9c, 0x85, 0x7a, 0x89, 0x70, 0x54, 0x2a, + 0x74, 0xfb, 0xb5, 0x6a, 0x12, 0xe2, 0x09, 0xbc, 0xea, 0x3e, 0x71, 0x91, + 0x1f, 0xb6, 0x80, 0x95, 0xbe, 0x88, 0xa2, 0xf7, 0x20, 0x20, 0x3e, 0x9a, + 0xa2, 0x5b, 0x2f, 0x98, 0x21, 0x0e, 0xcc, 0x94, 0x43, 0xa4, 0x05, 0x71, + 0xc6, 0x41, 0x19, 0x26, 0xe0, 0x1d, 0x3c, 0x09, 0xda, 0x6c, 0x88, 0x89, + 0xb7, 0x7d, 0x1d, 0x9b, 0x60, 0xde, 0xc3, 0xbe, 0x8d, 0x75, 0x72, 0xe7, + 0x3e, 0x68, 0x6a, 0xf3, 0xf4, 0xfe, 0xb5, 0x26, 0xd3, 0x9c, 0x3d, 0x1f, + 0x81, 0x31, 0xd5, 0x9e, 0xb4, 0xae, 0x4c, 0x98, 0x8b, 0x5d, 0x7e, 0xfe, + 0x7a, 0xf3, 0x5f, 0xeb, 0xdb, 0x4f, 0x13, 0x9e, 0xeb, 0xc5, 0xa0, 0xd0, + 0x4c, 0x1c, 0x5b, 0x8b, 0xbb, 0x3e, 0xc8, 0xbd, 0x4a, 0x44, 0x86, 0x3b, + 0x62, 0x3e, 0x7e, 0x0b, 0x24, 0xe2, 0x83, 0x5b, 0x41, 0x6c, 0xb2, 0x80, + 0x18, 0x6c, 0x14, 0x29, 0x9e, 0xf7, 0x38, 0x3a, 0xb2, 0x03, 0xec, 0x69, + 0x06, 0xd0, 0xf5, 0xf6, 0x0d, 0x33, 0xb1, 0xa4, 0xc0, 0x19, 0xf3, 0x5e, + 0x0e, 0xd2, 0xa1, 0x7b, 0x94, 0xa8, 0x7c, 0xa7, 0xe9, 0x1c, 0xce, 0x97, + 0x01, 0x6f, 0xfa, 0x73, 0x3d, 0xa2, 0xac, 0x6d, 0x5e, 0xa0, 0x5f, 0x14, + 0x68, 0xc7, 0x7d, 0xe8, 0x83, 0x7f, 0xd6, 0xd4, 0x86, 0x76, 0x76, 0x22, + 0x34, 0xb4, 0xc3, 0x73, 0x9d, 0x3e, 0x63, 0x98, 0xd7, 0xe9, 0x6c, 0x58, + 0x1d, 0x69, 0xd8, 0xef, 0x93, 0x38, 0x25, 0xb7, 0x23, 0xeb, 0x53, 0xee, + 0x80, 0xb3, 0x6c, 0x07, 0xed, 0xd8, 0xf6, 0x6f, 0xd0, 0x25, 0x3d, 0xd1, + 0x82, 0x69, 0xaf, 0x61, 0x22, 0x6a, 0x38, 0xa7, 0x1e, 0x0c, 0x04, 0x5d, + 0x9e, 0x1c, 0xb8, 0x51, 0x98, 0xac, 0x03, 0x0f, 0x96, 0x84, 0x2e, 0x59, + 0x0a, 0x3d, 0x78, 0xfd, 0xf2, 0x06, 0x9e, 0x7e, 0xe5, 0x08, 0xd7, 0xe0, + 0x69, 0xe6, 0x7a, 0x13, 0x82, 0x36, 0x01, 0x3f, 0x7a, 0x55, 0x27, 0x39, + 0x5b, 0x52, 0xbd, 0xbc, 0xcd, 0x75, 0x76, 0x22, 0xb6, 0xb5, 0x98, 0x59, + 0x2d, 0x4b, 0xd7, 0xea, 0x00, 0xdf, 0xc0, 0xdf, 0xc9, 0x28, 0x06, 0x3d, + 0x80, 0xf5, 0x7e, 0x51, 0xf8, 0xcc, 0x9a, 0x6b, 0xe9, 0xcc, 0xb5, 0x3b, + 0x40, 0x23, 0x2f, 0x40, 0x7f, 0x60, 0xc6, 0x95, 0x03, 0xe3, 0xbe, 0xcb, + 0x13, 0xfb, 0x16, 0x35, 0xd5, 0x12, 0xf2, 0x08, 0x34, 0x31, 0x41, 0xe5, + 0x64, 0x4f, 0x24, 0xbe, 0x4f, 0x87, 0x44, 0xdc, 0x89, 0xaa, 0x12, 0x91, + 0x22, 0x2f, 0xe4, 0xe4, 0x19, 0x9b, 0xbd, 0x56, 0x70, 0xf5, 0x7b, 0xcd, + 0x91, 0xa9, 0x59, 0xb0, 0x06, 0x74, 0xc2, 0xbc, 0x97, 0x0a, 0x4c, 0x69, + 0xc1, 0x65, 0x47, 0x80, 0x03, 0x62, 0x4e, 0x3c, 0xec, 0xe0, 0x25, 0xb4, + 0x97, 0xe4, 0x29, 0xf1, 0xc2, 0x14, 0x25, 0xcc, 0x8c, 0xb4, 0x98, 0xf5, + 0x37, 0x31, 0x6b, 0x1c, 0x97, 0xa4, 0x49, 0x5d, 0x55, 0x90, 0x27, 0x1b, + 0xda, 0x48, 0x27, 0x4c, 0x04, 0xc6, 0x66, 0x75, 0xe5, 0xbc, 0x62, 0x05, + 0x70, 0x3e, 0xa1, 0xd5, 0xb6, 0x6c, 0xc9, 0x39, 0x57, 0xe8, 0x2d, 0x9b, + 0xaa, 0xc9, 0xe7, 0xfd, 0x01, 0x6d, 0xb5, 0x87, 0x58, 0xa8, 0x98, 0x83, + 0x5a, 0xd1, 0xcc, 0x1a, 0x81, 0x79, 0x91, 0x5e, 0x82, 0xf6, 0x67, 0x1d, + 0x4f, 0x82, 0x85, 0xe8, 0x2e, 0xe0, 0x86, 0x2c, 0x11, 0xf1, 0x3e, 0x26, + 0x30, 0xa3, 0x49, 0x43, 0xde, 0xd1, 0x44, 0x9f, 0x73, 0x8d, 0x38, 0x88, + 0xac, 0xe0, 0x57, 0x0d, 0xae, 0xa6, 0xbc, 0x25, 0x29, 0x7b, 0x67, 0x9d, + 0x3b, 0x89, 0x1a, 0x57, 0x90, 0x0b, 0xdf, 0x91, 0xe6, 0xea, 0x07, 0x8a, + 0x34, 0x5c, 0xab, 0xe5, 0xde, 0x50, 0xdf, 0xd0, 0x1f, 0x84, 0xb9, 0x15, + 0xe1, 0x1a, 0xce, 0xdf, 0xce, 0xf5, 0x51, 0xdc, 0x11, 0xf8, 0xcf, 0x67, + 0xba, 0x78, 0x97, 0x06, 0x60, 0x17, 0xa0, 0x4d, 0xc1, 0x41, 0xc7, 0xd5, + 0xa7, 0x17, 0xe4, 0xd6, 0x28, 0x1d, 0xf0, 0xb1, 0xe0, 0xf9, 0xe1, 0x1a, + 0x53, 0x36, 0x49, 0x94, 0x51, 0x74, 0x60, 0x73, 0xdd, 0xd4, 0xb9, 0x06, + 0x67, 0x23, 0x3d, 0xe9, 0xdb, 0xfa, 0x5c, 0xd3, 0x82, 0x2b, 0x8c, 0xe1, + 0x3a, 0xed, 0x79, 0xbd, 0x1b, 0xe0, 0x86, 0x11, 0x2a, 0x16, 0x02, 0xf6, + 0xb9, 0xc7, 0x14, 0x8b, 0xb9, 0xce, 0x01, 0x9f, 0xeb, 0x0d, 0x1a, 0xc3, + 0x01, 0x70, 0x74, 0x31, 0xef, 0x41, 0x3b, 0xa4, 0xae, 0x15, 0xfb, 0x0a, + 0x41, 0x3c, 0xe5, 0xd8, 0x54, 0x7a, 0xc1, 0xf1, 0x1b, 0x3c, 0x26, 0x27, + 0x5d, 0xa8, 0xe3, 0xa6, 0xdf, 0x17, 0x2d, 0xe8, 0xde, 0x86, 0x1c, 0x60, + 0x2e, 0x9f, 0x44, 0x23, 0xc6, 0xb1, 0xe9, 0x05, 0xf8, 0x76, 0x41, 0x28, + 0xda, 0xe7, 0x5e, 0xef, 0x81, 0x6f, 0xde, 0x80, 0x5f, 0x64, 0x19, 0xbf, + 0xcc, 0xcf, 0x57, 0x78, 0x39, 0xa1, 0x2c, 0xa9, 0xd9, 0x74, 0xe4, 0xc3, + 0x93, 0xf3, 0x97, 0x91, 0xfb, 0x17, 0x53, 0x36, 0xd6, 0x62, 0xae, 0x67, + 0x16, 0x29, 0x92, 0x84, 0x75, 0x05, 0x91, 0xda, 0x83, 0x7f, 0xab, 0x7a, + 0xd0, 0xf9, 0x2a, 0xe9, 0x7a, 0x02, 0xde, 0xc1, 0x4c, 0x10, 0x76, 0x20, + 0x8e, 0x42, 0x88, 0xa1, 0x0d, 0x01, 0x9c, 0x8c, 0x3a, 0x9b, 0x97, 0xed, + 0xc8, 0x65, 0x2b, 0x0f, 0x71, 0xdb, 0x18, 0x74, 0x5e, 0x8f, 0x4f, 0x83, + 0x17, 0xf6, 0x08, 0x16, 0x28, 0xd8, 0x1f, 0x3c, 0xf0, 0xcf, 0x0e, 0x79, + 0x08, 0x2f, 0xc8, 0xe3, 0x8e, 0x04, 0x73, 0x8d, 0x28, 0xd0, 0x8b, 0x3a, + 0x06, 0xff, 0x2b, 0x35, 0x8b, 0x31, 0x3e, 0xcc, 0xf5, 0x01, 0x53, 0xc0, + 0x52, 0x27, 0xd7, 0x82, 0xea, 0xe0, 0x82, 0x13, 0xe8, 0x84, 0x73, 0xf4, + 0x06, 0x8b, 0x02, 0x1e, 0x61, 0xc7, 0x7e, 0x52, 0x64, 0xd7, 0xb4, 0x43, + 0x5b, 0xec, 0xb0, 0x1c, 0x34, 0x7c, 0x02, 0x7c, 0xbc, 0x11, 0x13, 0x43, + 0xcc, 0x14, 0xdf, 0x87, 0x84, 0x45, 0x8c, 0x6f, 0xcd, 0xcc, 0x80, 0x8b, + 0x32, 0x59, 0x9b, 0x6f, 0x06, 0x87, 0x34, 0x88, 0x42, 0xae, 0x44, 0x78, + 0x92, 0x17, 0xd6, 0x64, 0x7f, 0xd4, 0x3c, 0x40, 0x5a, 0x32, 0xef, 0xf9, + 0x76, 0xdd, 0x37, 0xe8, 0xad, 0x37, 0x4b, 0xa5, 0x9d, 0x38, 0x73, 0x8d, + 0x19, 0xf0, 0x32, 0xe9, 0xbc, 0x77, 0x66, 0xb5, 0x04, 0xaf, 0x96, 0x27, + 0xf3, 0xf9, 0xbb, 0x00, 0x15, 0x89, 0x60, 0x90, 0xf1, 0xd3, 0x9c, 0x4b, + 0x61, 0xab, 0xa3, 0xa3, 0x7b, 0xba, 0x31, 0xdd, 0x36, 0x32, 0x1d, 0x45, + 0x04, 0xa1, 0x05, 0x78, 0xdf, 0xa1, 0xd0, 0xcb, 0x57, 0xe1, 0xa1, 0x5d, + 0x34, 0xe1, 0x9e, 0x34, 0xd6, 0x3e, 0xd2, 0xac, 0x54, 0xb4, 0x95, 0xc1, + 0xf9, 0xe2, 0x0d, 0x9e, 0x5b, 0x45, 0x89, 0x9d, 0x60, 0xfe, 0x35, 0x12, + 0x13, 0xe7, 0x30, 0xa7, 0x7b, 0x59, 0x6f, 0x35, 0x88, 0x11, 0x77, 0xae, + 0x71, 0x72, 0x74, 0x67, 0x2c, 0xeb, 0x13, 0xd9, 0xac, 0x96, 0x85, 0x37, + 0xd2, 0xc2, 0xa9, 0xaa, 0x78, 0xee, 0x2f, 0xc4, 0x56, 0x96, 0x96, 0x86, + 0x98, 0xb6, 0x86, 0x68, 0x55, 0x02, 0x5c, 0x96, 0x30, 0xb8, 0x9e, 0xb0, + 0x16, 0x29, 0x53, 0xd5, 0x81, 0xd0, 0xe8, 0x2d, 0xeb, 0xc0, 0x8d, 0xfd, + 0xd3, 0x8d, 0x4c, 0x38, 0xcf, 0xdb, 0x20, 0x06, 0xcf, 0xb1, 0x88, 0x8c, + 0xea, 0x9d, 0x35, 0xae, 0x26, 0xf8, 0x1f, 0x7b, 0xbc, 0x35, 0x95, 0x84, + 0x1e, 0xe4, 0x52, 0xc3, 0xce, 0xc7, 0x79, 0x5d, 0xb0, 0xaa, 0xba, 0x18, + 0x21, 0xe7, 0x98, 0x36, 0x3a, 0xb8, 0xad, 0x67, 0x02, 0x1c, 0x5c, 0x74, + 0xc1, 0x2b, 0x33, 0xf4, 0x8a, 0x36, 0xac, 0x8d, 0x20, 0x8f, 0x4b, 0x2f, + 0x10, 0x07, 0xff, 0xa2, 0x87, 0xfe, 0xac, 0x6b, 0x57, 0x16, 0x67, 0xa1, + 0x59, 0x36, 0x44, 0xf1, 0x44, 0x46, 0xe0, 0x91, 0x5e, 0x87, 0x24, 0x38, + 0x24, 0xad, 0x1e, 0x63, 0xc0, 0x8b, 0xb9, 0xa6, 0x4b, 0xee, 0xc9, 0x5f, + 0x38, 0x54, 0x42, 0x1f, 0x62, 0x4f, 0xd9, 0x92, 0x22, 0xc8, 0xd5, 0x20, + 0x02, 0x2f, 0xc4, 0x0b, 0x17, 0xdd, 0xc5, 0xfb, 0x6e, 0xe6, 0x8c, 0x79, + 0xbc, 0x29, 0x7f, 0x3f, 0x1e, 0x74, 0x1c, 0x33, 0xc9, 0x39, 0xeb, 0x2e, + 0xcf, 0xa2, 0x51, 0x0f, 0x41, 0xd9, 0x75, 0x1e, 0x0f, 0x52, 0x83, 0x1f, + 0x05, 0xdd, 0x00, 0xbe, 0xb7, 0x92, 0x2d, 0x50, 0x29, 0xb7, 0x7e, 0xaf, + 0xd9, 0xd0, 0xf6, 0xa1, 0x04, 0x1c, 0x92, 0xad, 0xfb, 0x3a, 0xfa, 0xb2, + 0x3d, 0xd6, 0xd8, 0x49, 0x6a, 0xa2, 0x03, 0xb4, 0x90, 0xd2, 0x41, 0x4a, + 0xea, 0xa0, 0x02, 0x74, 0xbb, 0x02, 0x6c, 0xc0, 0xa1, 0xa7, 0x42, 0x41, + 0x07, 0xc0, 0x0e, 0x86, 0x32, 0xc8, 0x47, 0x8a, 0x2a, 0x52, 0x20, 0x05, + 0x3e, 0x96, 0x5d, 0xc2, 0x2e, 0xc8, 0x0a, 0x25, 0x18, 0x35, 0x83, 0x8e, + 0x9f, 0x57, 0x89, 0x30, 0xf0, 0x98, 0x78, 0x81, 0x96, 0x99, 0x64, 0xc0, + 0x30, 0x17, 0xa2, 0x0e, 0x5a, 0x49, 0xd9, 0xbd, 0x6c, 0xe9, 0x54, 0x36, + 0xc8, 0xc5, 0x49, 0xf9, 0xcc, 0xa8, 0x0e, 0x3a, 0x3b, 0x08, 0x88, 0x07, + 0xac, 0xa7, 0xc9, 0x73, 0xde, 0x96, 0x2f, 0x0e, 0x1a, 0xaa, 0xf4, 0xaa, + 0xa4, 0x48, 0x49, 0x05, 0xfd, 0x03, 0x5d, 0x38, 0xfe, 0xc2, 0x9f, 0x9d, + 0xa6, 0xa6, 0x52, 0xc9, 0x00, 0x3b, 0x99, 0x16, 0x22, 0x88, 0x21, 0x66, + 0x77, 0xd8, 0x97, 0x91, 0xf0, 0xdc, 0x77, 0x91, 0x66, 0x1a, 0x6e, 0x91, + 0xb9, 0x33, 0x24, 0x93, 0xce, 0xef, 0x9f, 0xcf, 0x4d, 0xfa, 0x2a, 0x11, + 0x82, 0x6c, 0xbf, 0xbc, 0x8b, 0x5a, 0x3d, 0xb0, 0x31, 0xd7, 0x84, 0x6b, + 0xcc, 0xb9, 0x42, 0x5b, 0xa2, 0x55, 0x53, 0xa2, 0x91, 0xcb, 0xce, 0xbc, + 0x2c, 0x12, 0xb3, 0x12, 0x3b, 0xc3, 0x7a, 0xe0, 0x86, 0x9a, 0x82, 0xf6, + 0x97, 0xa4, 0x09, 0x20, 0xb6, 0xf5, 0x0a, 0x74, 0x3a, 0x68, 0x11, 0xf1, + 0xdc, 0x1b, 0x38, 0x8f, 0x98, 0x8c, 0x22, 0x2d, 0x7c, 0xe7, 0x1d, 0xf1, + 0x65, 0x2a, 0x71, 0x52, 0x0b, 0x82, 0xdd, 0xcb, 0x2b, 0xe4, 0x43, 0xc4, + 0x69, 0xe5, 0x26, 0x7a, 0x75, 0x17, 0x5a, 0xb5, 0xe3, 0x6c, 0x3b, 0x8a, + 0xbf, 0xed, 0x19, 0x77, 0xd1, 0x86, 0x6a, 0xba, 0x71, 0xe0, 0x16, 0x9d, + 0xeb, 0x0f, 0x00, 0x8f, 0x0f, 0x02, 0xfa, 0x81, 0x5b, 0x9d, 0x49, 0xd0, + 0x09, 0xcc, 0xab, 0x78, 0x3c, 0x91, 0xef, 0x9c, 0xde, 0x17, 0x51, 0x02, + 0x5e, 0x82, 0xfe, 0xda, 0xa3, 0x0e, 0xee, 0x03, 0xcd, 0x7b, 0x0c, 0x79, + 0xd9, 0x04, 0x73, 0x6d, 0xa7, 0xb6, 0xd0, 0x58, 0x58, 0x76, 0x6a, 0xc9, + 0x13, 0xd4, 0xb1, 0xe6, 0xfe, 0x9c, 0xb1, 0x4d, 0xf2, 0xc1, 0xcb, 0xb5, + 0x2f, 0x88, 0x43, 0x32, 0x1c, 0x50, 0xb5, 0x39, 0xba, 0x7f, 0xd4, 0x30, + 0xa2, 0x8d, 0x49, 0x75, 0x76, 0x49, 0x92, 0xf2, 0xd7, 0xbe, 0x92, 0x12, + 0x9d, 0x46, 0xd9, 0x6c, 0x17, 0x11, 0x1c, 0x0f, 0xd7, 0x7d, 0xc7, 0x0c, + 0x07, 0xa1, 0xee, 0x3e, 0x4b, 0xba, 0x35, 0x62, 0xdf, 0x4e, 0xc1, 0x8b, + 0x83, 0x17, 0xb5, 0x67, 0xad, 0x06, 0x7e, 0x98, 0xcd, 0x6b, 0xe7, 0x81, + 0x1f, 0xe5, 0x52, 0xc6, 0x83, 0xda, 0x6b, 0x84, 0x08, 0x88, 0xbb, 0x82, + 0x55, 0x57, 0x98, 0x87, 0x28, 0x46, 0x6b, 0x43, 0xa4, 0x55, 0x08, 0xfd, + 0x38, 0xff, 0x9e, 0xef, 0xcd, 0x8d, 0x34, 0xa5, 0x49, 0x8d, 0xa1, 0x3b, + 0xa4, 0xa0, 0x11, 0xd2, 0x48, 0x93, 0xda, 0x2a, 0xa0, 0xc9, 0xc9, 0x2c, + 0x5d, 0x6d, 0x21, 0x10, 0x26, 0xa0, 0xbb, 0x36, 0x90, 0xf9, 0x4f, 0xcc, + 0xfa, 0xa5, 0x48, 0x7b, 0xc2, 0xe6, 0xfd, 0x80, 0xac, 0x01, 0x3c, 0xff, + 0x03, 0x8f, 0xa8, 0x72, 0x0a, 0xd4, 0x9f, 0x41, 0x1b, 0xa8, 0xa3, 0xab, + 0x37, 0xc2, 0x58, 0x2d, 0x45, 0x8d, 0x1e, 0xa5, 0x8b, 0x73, 0x88, 0xd9, + 0x4d, 0x92, 0x40, 0xd4, 0x52, 0xab, 0x29, 0xbc, 0x55, 0x5e, 0xc6, 0x83, + 0xb6, 0x03, 0xee, 0xcb, 0x75, 0x34, 0xd7, 0xe0, 0x00, 0xac, 0x97, 0xb8, + 0x48, 0xc0, 0x9d, 0x4f, 0x6a, 0x3c, 0x7a, 0xe3, 0x05, 0xbb, 0x01, 0x29, + 0x94, 0xc4, 0xb4, 0xed, 0x97, 0x40, 0x1f, 0xaf, 0x6c, 0x66, 0xa0, 0x09, + 0x6d, 0x24, 0x23, 0x8f, 0xc4, 0xeb, 0xef, 0xac, 0xd5, 0xaf, 0x80, 0xb3, + 0xda, 0xbc, 0xe2, 0x8b, 0xff, 0xaa, 0x99, 0x30, 0x78, 0xcc, 0x5d, 0x2d, + 0x19, 0xfd, 0x9a, 0x42, 0x5d, 0xee, 0x76, 0x13, 0x69, 0x01, 0x03, 0x9f, + 0xa0, 0x84, 0x6e, 0x10, 0xc7, 0x29, 0x45, 0xdb, 0x31, 0x36, 0x2b, 0x88, + 0x31, 0x1c, 0x87, 0x0a, 0x7d, 0x83, 0xd7, 0xb5, 0xc1, 0x27, 0xd4, 0x7b, + 0xed, 0xf2, 0x8a, 0x74, 0xa4, 0x11, 0x5e, 0x55, 0xf3, 0x9e, 0xea, 0x5c, + 0x1b, 0xe3, 0xa2, 0xeb, 0x0f, 0x21, 0x20, 0x7b, 0xe9, 0xe9, 0xdf, 0xb4, + 0x63, 0x67, 0xc2, 0xe7, 0x5a, 0x68, 0x32, 0x09, 0x1b, 0xc0, 0x77, 0x3e, + 0x1e, 0x62, 0x63, 0x35, 0xd7, 0xc9, 0x03, 0xff, 0xd7, 0x57, 0x61, 0x5a, + 0x5a, 0x5c, 0x35, 0x8b, 0xa8, 0x19, 0x1d, 0x6c, 0xa0, 0xb7, 0x98, 0x02, + 0xbd, 0x3c, 0xaf, 0xfe, 0xa1, 0x26, 0x47, 0xb5, 0xfb, 0xbd, 0x26, 0x07, + 0x78, 0xe8, 0xae, 0x34, 0x0b, 0xc4, 0x5e, 0xac, 0x89, 0xcc, 0x5c, 0xef, + 0xcf, 0xbc, 0xae, 0x44, 0x99, 0x0a, 0xe0, 0x70, 0xb6, 0xc5, 0xe7, 0xd5, + 0x93, 0x3a, 0xe0, 0x6f, 0x6b, 0xf2, 0x28, 0x7d, 0x72, 0x09, 0xd3, 0x6a, + 0x09, 0xcc, 0xb7, 0x15, 0x26, 0xe0, 0x98, 0x41, 0x96, 0xa1, 0xa7, 0x8d, + 0x73, 0x4d, 0xa5, 0x9c, 0xd9, 0x17, 0xda, 0x7c, 0xbd, 0x66, 0xbd, 0xb8, + 0x9f, 0xe4, 0xec, 0x6b, 0x75, 0x4a, 0x75, 0x9b, 0x68, 0x5b, 0x23, 0x6a, + 0x95, 0x2b, 0xdb, 0x51, 0x48, 0x76, 0x5a, 0x90, 0xa9, 0x32, 0x23, 0x3a, + 0x3a, 0x79, 0x42, 0xdf, 0xac, 0x95, 0xd7, 0xf9, 0x19, 0x48, 0x71, 0x5e, + 0x2d, 0x21, 0x5e, 0x2d, 0x0a, 0x3a, 0xaa, 0xf0, 0x82, 0x79, 0x5f, 0xf6, + 0x0d, 0xf4, 0xd8, 0xad, 0x4c, 0x03, 0x5c, 0xba, 0xec, 0x00, 0xfe, 0xfa, + 0xc9, 0xdb, 0x0a, 0x7c, 0x1c, 0xb6, 0x98, 0x13, 0x81, 0xa6, 0x0d, 0x32, + 0xec, 0x35, 0x23, 0xf8, 0x84, 0x2c, 0xa7, 0xa4, 0x82, 0xb9, 0xb1, 0x98, + 0xb1, 0x98, 0xc0, 0xcb, 0xfc, 0x51, 0xf3, 0x01, 0xc6, 0xd3, 0x40, 0x35, + 0x99, 0x10, 0xe8, 0x5a, 0xf2, 0x62, 0xef, 0xe1, 0x3b, 0xe1, 0xab, 0x5b, + 0xe8, 0x04, 0x86, 0xd8, 0x0c, 0xdf, 0x42, 0x8b, 0x6e, 0xe0, 0xee, 0x96, + 0x78, 0xc2, 0x6d, 0xa6, 0xbd, 0x16, 0x99, 0x26, 0x8c, 0x43, 0x6a, 0x3b, + 0xe0, 0xa5, 0x7f, 0xd5, 0x28, 0xe0, 0x54, 0x58, 0xf9, 0x84, 0x72, 0xd6, + 0xa0, 0x3e, 0x03, 0x8e, 0xa6, 0x13, 0xc9, 0x89, 0x0b, 0xd8, 0xd1, 0xde, + 0x17, 0x80, 0x51, 0x41, 0xbc, 0xf9, 0x7a, 0x42, 0xee, 0xec, 0x18, 0xcc, + 0x65, 0x66, 0xaa, 0x6d, 0xc9, 0x7b, 0x97, 0x2a, 0x88, 0x55, 0xe0, 0x8f, + 0x78, 0x0a, 0x48, 0xa6, 0xf7, 0x1e, 0x78, 0xe6, 0x4c, 0x18, 0xa2, 0x9f, + 0xbd, 0x4b, 0xd9, 0x84, 0x46, 0x3c, 0x81, 0x87, 0xd5, 0xc6, 0x0c, 0x6b, + 0x8b, 0x27, 0x33, 0x71, 0x06, 0x78, 0xae, 0x83, 0x5f, 0xf4, 0xf8, 0x66, + 0x45, 0xe7, 0xb5, 0xaf, 0x89, 0x0f, 0x1a, 0x21, 0x55, 0x21, 0x78, 0xc3, + 0x51, 0xce, 0x6b, 0xb6, 0xf9, 0x69, 0x04, 0xdc, 0xd9, 0x92, 0x29, 0x80, + 0xbe, 0x45, 0x93, 0xa0, 0xc4, 0xd9, 0x99, 0x02, 0x00, 0xb5, 0xc2, 0x80, + 0xad, 0x79, 0xa6, 0x4e, 0xe6, 0xd1, 0x6d, 0xfe, 0x56, 0x03, 0xc8, 0x02, + 0xbd, 0xe5, 0x33, 0x57, 0xb4, 0x59, 0x8d, 0xdb, 0xbd, 0x01, 0xf9, 0xe9, + 0xaf, 0x9f, 0x92, 0xeb, 0x2f, 0x91, 0xba, 0x37, 0x4c, 0xfb, 0x0d, 0x73, + 0xec, 0x30, 0x34, 0x34, 0x33, 0xf6, 0xfb, 0x6a, 0xc6, 0x63, 0xda, 0x54, + 0x66, 0xa1, 0x55, 0x55, 0xc6, 0x2d, 0x88, 0xc9, 0xb9, 0xea, 0xe4, 0xca, + 0x88, 0x93, 0x8a, 0x03, 0xd7, 0x59, 0x47, 0x0a, 0xea, 0xaa, 0x05, 0x0d, + 0xc5, 0x07, 0x4c, 0xb8, 0xda, 0xe7, 0xee, 0x0a, 0x62, 0x96, 0xa0, 0xe2, + 0x8f, 0x1a, 0x0e, 0x4c, 0x0b, 0x2c, 0xf0, 0xec, 0xe7, 0xac, 0x65, 0xbb, + 0x30, 0x0d, 0xba, 0xc4, 0x39, 0x81, 0x97, 0x76, 0xf5, 0x30, 0xd9, 0xea, + 0xc7, 0xcd, 0x4a, 0xb1, 0x76, 0x74, 0x92, 0x4e, 0xe1, 0xc4, 0x3d, 0x2d, + 0x64, 0x73, 0x31, 0x40, 0x4f, 0xee, 0x73, 0x3d, 0x68, 0x62, 0x3a, 0x78, + 0xd1, 0x5c, 0x33, 0x17, 0xe2, 0x3c, 0x3c, 0x7f, 0xe9, 0xfb, 0xf7, 0xea, + 0x80, 0xe7, 0x7b, 0x88, 0x3e, 0xba, 0x42, 0x4e, 0x56, 0x39, 0x0f, 0x36, + 0x59, 0x42, 0x88, 0x64, 0x6c, 0x09, 0x1a, 0xc0, 0xe4, 0xa9, 0x22, 0x07, + 0x3a, 0xd7, 0x0c, 0x52, 0x69, 0xdc, 0x02, 0x06, 0x70, 0xd7, 0xe4, 0x0e, + 0xe8, 0x5a, 0x87, 0x80, 0xcf, 0xaa, 0x26, 0x18, 0xf7, 0x43, 0x61, 0x32, + 0x73, 0x37, 0xa1, 0x91, 0x79, 0x5f, 0xba, 0x68, 0x07, 0x8e, 0x93, 0x68, + 0xbe, 0xa7, 0x1d, 0xcd, 0x35, 0xb2, 0x0a, 0x2a, 0x1c, 0xe0, 0xb0, 0x79, + 0x1f, 0xcd, 0x00, 0x9a, 0x1b, 0x7c, 0x2d, 0x7b, 0x60, 0x77, 0x75, 0x65, + 0x2e, 0xe8, 0x0a, 0x7f, 0xfb, 0x9c, 0xbf, 0xa3, 0x45, 0xb6, 0x2b, 0x18, + 0xdf, 0xa1, 0xc7, 0x1d, 0x9d, 0x00, 0x23, 0x82, 0xdc, 0x01, 0x3d, 0x66, + 0xaa, 0xb8, 0xf4, 0x86, 0x33, 0x73, 0xb1, 0x09, 0x1c, 0x54, 0xf1, 0x16, + 0xf8, 0xa0, 0x09, 0x6c, 0xfc, 0xbe, 0x83, 0x5f, 0xea, 0x75, 0xe2, 0x35, + 0x53, 0x4e, 0x59, 0x15, 0x52, 0x8b, 0x65, 0xcd, 0x97, 0xb1, 0xd3, 0xac, + 0x07, 0x4d, 0x85, 0x2f, 0x35, 0x3d, 0xe1, 0xf3, 0xde, 0x13, 0x15, 0x2c, + 0xc3, 0xda, 0x7e, 0x97, 0x5e, 0xa6, 0xd1, 0x44, 0x6c, 0xf2, 0xfa, 0x64, + 0x45, 0x8a, 0x8d, 0x05, 0x1c, 0x0f, 0xbe, 0xde, 0xe3, 0x6e, 0xb8, 0x88, + 0xb5, 0x11, 0x3c, 0x53, 0xb8, 0x28, 0xa9, 0x95, 0x02, 0x4e, 0xa4, 0xd4, + 0xb4, 0x67, 0xbc, 0x70, 0x84, 0x09, 0xdc, 0xeb, 0x06, 0xcb, 0x23, 0x60, + 0xf5, 0x5e, 0x93, 0xe0, 0xa5, 0xe4, 0x77, 0x6e, 0xc8, 0x3a, 0x6c, 0x01, + 0x03, 0xdc, 0x2a, 0x3a, 0x7a, 0x78, 0x27, 0x6b, 0xd5, 0x97, 0xbc, 0xda, + 0x8b, 0x26, 0x9a, 0x6b, 0xdd, 0xff, 0x5e, 0x93, 0xc3, 0xc7, 0x76, 0xd4, + 0x28, 0xf0, 0x95, 0x15, 0xe8, 0x90, 0x7e, 0x8b, 0xb5, 0xa0, 0x3b, 0x50, + 0xb1, 0xcb, 0x5b, 0xb2, 0x0f, 0xf5, 0xed, 0xb8, 0x33, 0xc1, 0xaf, 0x6b, + 0xaa, 0xca, 0xcd, 0xe0, 0x5b, 0x34, 0xbd, 0x2b, 0x9a, 0xd5, 0x2b, 0x66, + 0x32, 0xa1, 0x26, 0x7e, 0x62, 0x6d, 0xc8, 0x58, 0x4b, 0x17, 0xf0, 0xd9, + 0xbb, 0x7c, 0xcf, 0xcf, 0x97, 0x90, 0x99, 0x78, 0xab, 0x79, 0xfd, 0xf0, + 0x16, 0x1b, 0x96, 0x17, 0xd7, 0xc1, 0x3e, 0x63, 0xe2, 0x50, 0x22, 0x62, + 0x95, 0x3a, 0x9b, 0xfd, 0xfd, 0x13, 0xce, 0x23, 0xe6, 0xfb, 0x8c, 0xa5, + 0x87, 0x70, 0x62, 0x60, 0x33, 0xf7, 0xf0, 0x21, 0xd6, 0x55, 0x40, 0x0d, + 0x6b, 0x9b, 0x2b, 0x11, 0x50, 0x34, 0x6b, 0xf9, 0xa1, 0x2a, 0x15, 0x8e, + 0x0e, 0x6e, 0x1f, 0x65, 0x75, 0x70, 0xc9, 0xff, 0x88, 0x9f, 0xd8, 0x1d, + 0x2c, 0x18, 0xeb, 0xb4, 0xec, 0x44, 0xc6, 0x52, 0xc1, 0x8f, 0xa9, 0x6d, + 0x1f, 0xdc, 0x2f, 0x8d, 0x6d, 0x56, 0x2d, 0xe8, 0x54, 0xe0, 0x6d, 0x9c, + 0x82, 0x67, 0x98, 0x76, 0x90, 0x97, 0xb1, 0x43, 0x9e, 0xb9, 0x51, 0xe5, + 0x71, 0x33, 0xcc, 0xf5, 0xf3, 0x5f, 0x73, 0x7d, 0x93, 0x98, 0xb9, 0xf3, + 0xbd, 0x44, 0x91, 0xb7, 0x56, 0x9e, 0xab, 0xcb, 0x08, 0x58, 0x5d, 0xe7, + 0xee, 0x08, 0x46, 0x1b, 0xdf, 0xc0, 0xd3, 0x9c, 0x99, 0xd1, 0xdb, 0x07, + 0x87, 0x8c, 0xbc, 0x51, 0x29, 0xb4, 0xa9, 0x31, 0xc0, 0x1b, 0x36, 0x81, + 0x66, 0x74, 0x44, 0x28, 0xe9, 0xb8, 0xe1, 0x0e, 0x35, 0x41, 0x53, 0x5f, + 0x43, 0x1a, 0x6c, 0x0e, 0x6e, 0x60, 0xe0, 0x06, 0x57, 0x49, 0x2d, 0x43, + 0xe6, 0xb8, 0x63, 0x94, 0xaa, 0x03, 0xf8, 0xa8, 0xf1, 0x8f, 0x9a, 0x4e, + 0x28, 0xa2, 0x24, 0x99, 0xd7, 0xae, 0xf0, 0x96, 0x9a, 0x49, 0x97, 0x2d, + 0x48, 0x83, 0x81, 0x2b, 0x51, 0x24, 0x8c, 0x68, 0x2c, 0x9b, 0xf1, 0x06, + 0x38, 0xff, 0x02, 0xbd, 0x97, 0x61, 0x24, 0xda, 0xa4, 0x19, 0x6e, 0x99, + 0x72, 0x6f, 0xa5, 0x5e, 0xa9, 0xb0, 0xf9, 0x7a, 0x63, 0xf0, 0x7e, 0xa0, + 0xbf, 0xc1, 0x6b, 0xe8, 0x51, 0xce, 0xd4, 0x5e, 0x18, 0x15, 0xcc, 0x3e, + 0xbe, 0xe1, 0xb9, 0xc6, 0x20, 0x1f, 0x79, 0x6c, 0xda, 0x9c, 0x3b, 0x8a, + 0x49, 0x35, 0x7b, 0xcc, 0xd7, 0xc4, 0x3d, 0xdd, 0x48, 0xe8, 0xaf, 0x7b, + 0xec, 0x21, 0x33, 0xac, 0x0b, 0x78, 0x13, 0xc1, 0x8c, 0x97, 0x15, 0xb5, + 0x2b, 0x27, 0xdc, 0xac, 0x9c, 0xcc, 0x60, 0x7d, 0xe9, 0xaa, 0x2e, 0x41, + 0x62, 0x5e, 0xd3, 0xbc, 0xe1, 0xad, 0x58, 0xe6, 0x35, 0x1b, 0x40, 0xa7, + 0x5e, 0xb2, 0x96, 0x98, 0x10, 0x17, 0xef, 0x19, 0x1b, 0x7e, 0xdf, 0xa3, + 0x7f, 0x59, 0x44, 0x6d, 0x90, 0x96, 0x3e, 0xf6, 0xe3, 0xb4, 0x6a, 0xa4, + 0x09, 0x5a, 0xf6, 0xbc, 0xa2, 0x52, 0x8b, 0x40, 0x07, 0xa0, 0x01, 0x7c, + 0xab, 0x27, 0xbd, 0xe0, 0xba, 0x83, 0xd8, 0x3f, 0xb2, 0xe8, 0x05, 0xfc, + 0x71, 0xe1, 0xcd, 0x6b, 0xbe, 0x2f, 0x6f, 0x97, 0x48, 0xf1, 0xb2, 0x9b, + 0x6b, 0x8d, 0xaf, 0x8d, 0x79, 0x5f, 0x6d, 0x31, 0xd7, 0xec, 0xf6, 0xd4, + 0x22, 0x99, 0xef, 0x3d, 0xa7, 0xb2, 0x2d, 0x61, 0x6c, 0x8b, 0xa6, 0xf7, + 0x32, 0x45, 0xb6, 0x24, 0x05, 0xdd, 0xe0, 0x09, 0x16, 0x9d, 0x07, 0x04, + 0x78, 0xbd, 0x48, 0x38, 0x7d, 0x01, 0x9e, 0x5a, 0x21, 0x8d, 0x5e, 0xe1, + 0x5c, 0x67, 0xd4, 0x1d, 0x97, 0x47, 0x38, 0x17, 0x45, 0x14, 0xbc, 0x65, + 0xf6, 0xce, 0x58, 0x00, 0xfe, 0x4d, 0x55, 0x8c, 0x01, 0xae, 0x75, 0xea, + 0x1d, 0xb7, 0xe2, 0x11, 0xf2, 0x55, 0x10, 0x36, 0xe8, 0x1c, 0x23, 0x76, + 0x29, 0x59, 0xe5, 0x01, 0x6f, 0x3f, 0x85, 0x02, 0xae, 0x57, 0x97, 0x67, + 0xee, 0xd8, 0x0f, 0x82, 0xe4, 0x81, 0x9d, 0x57, 0x19, 0xf8, 0xd4, 0x1d, + 0xc4, 0xf5, 0x95, 0xb0, 0xf2, 0x25, 0x12, 0x75, 0x67, 0x90, 0x4f, 0x4c, + 0x9d, 0x26, 0x66, 0xf6, 0xe0, 0x5f, 0xa9, 0x75, 0xf0, 0x59, 0x8b, 0x29, + 0x1b, 0x32, 0xfa, 0xf5, 0x8e, 0x29, 0x5b, 0x10, 0x47, 0x2d, 0xe7, 0xba, + 0x8b, 0x19, 0x47, 0x29, 0xf5, 0xb7, 0xe6, 0x5c, 0xe9, 0xb4, 0xf4, 0xed, + 0x88, 0x38, 0xe4, 0x5d, 0xd6, 0x55, 0xcb, 0xda, 0x93, 0x26, 0xa8, 0xda, + 0xe5, 0x0a, 0xdf, 0x13, 0x74, 0x99, 0xef, 0x55, 0x72, 0x02, 0x38, 0x0e, + 0xbc, 0x62, 0x1f, 0xd2, 0x52, 0xdf, 0xe9, 0x36, 0xe3, 0x09, 0xf8, 0x86, + 0x66, 0x7e, 0x06, 0x3b, 0xe4, 0xd2, 0xeb, 0xab, 0x0c, 0xf4, 0x6f, 0x6e, + 0xe2, 0x86, 0x23, 0xa9, 0x97, 0x9a, 0x3b, 0xdf, 0x47, 0x71, 0x41, 0x7f, + 0xab, 0x88, 0xf6, 0x38, 0x46, 0xf2, 0x55, 0x26, 0xc4, 0xca, 0x6a, 0x7b, + 0x51, 0xfa, 0x27, 0xf0, 0x5f, 0x84, 0x84, 0x09, 0x28, 0x3a, 0x47, 0x72, + 0xe9, 0x8e, 0x3e, 0xa1, 0x58, 0x94, 0x7c, 0x38, 0x00, 0x9f, 0xe8, 0xb3, + 0x4f, 0x28, 0xe3, 0x79, 0x8d, 0x53, 0xef, 0x82, 0xd7, 0x23, 0x72, 0x33, + 0x18, 0x04, 0xae, 0x0d, 0xb4, 0xca, 0xae, 0xa4, 0xca, 0x88, 0x8d, 0xfe, + 0x4e, 0x5a, 0x74, 0x11, 0x9b, 0x55, 0x73, 0xa0, 0x8b, 0x31, 0xd7, 0xd0, + 0x37, 0xe1, 0x56, 0x40, 0xfc, 0x20, 0x0c, 0x3d, 0x7d, 0x37, 0x3f, 0x2b, + 0xc7, 0x9d, 0xd0, 0x12, 0x63, 0x75, 0x07, 0xed, 0x4f, 0x69, 0xc2, 0x82, + 0xac, 0x01, 0x5d, 0xc4, 0xe8, 0xb4, 0x33, 0xd4, 0x20, 0xb5, 0xea, 0x7b, + 0x37, 0xa9, 0x5d, 0xc2, 0x07, 0xb7, 0xa8, 0x89, 0x8b, 0x5d, 0x0b, 0x30, + 0x8b, 0x80, 0xa7, 0x19, 0xa6, 0x04, 0xf5, 0x39, 0x70, 0x97, 0x4e, 0x10, + 0x9e, 0xf7, 0x77, 0x2e, 0xb0, 0x46, 0x44, 0xe2, 0x2b, 0x88, 0xf9, 0x20, + 0x65, 0x6d, 0x60, 0x42, 0xdf, 0xe2, 0xc4, 0x0c, 0x17, 0xf9, 0x54, 0x1d, + 0x28, 0x1d, 0x2f, 0xa0, 0x76, 0x45, 0xe8, 0x59, 0x07, 0xc8, 0x75, 0x25, + 0xb8, 0x7a, 0x1e, 0x3d, 0x32, 0xd7, 0x80, 0x49, 0x98, 0xb6, 0xd2, 0xe6, + 0x67, 0x9d, 0x71, 0x8a, 0x4c, 0x9e, 0x08, 0xbf, 0x34, 0xc5, 0x50, 0x82, + 0x2e, 0x07, 0x4f, 0x1b, 0x14, 0x6a, 0xab, 0x33, 0xe8, 0x1b, 0xb4, 0x27, + 0x42, 0x24, 0x7c, 0xd0, 0x44, 0x41, 0xd2, 0x06, 0xe0, 0x45, 0x91, 0xf8, + 0x7d, 0x0f, 0x3b, 0x89, 0x88, 0x9e, 0x8d, 0x65, 0x1d, 0xec, 0xe2, 0xae, + 0x79, 0x49, 0x93, 0xa5, 0xa4, 0x8e, 0x6e, 0xe0, 0xc7, 0xc0, 0x93, 0x89, + 0x34, 0xf7, 0xa2, 0x1b, 0xf0, 0x7c, 0x08, 0xbc, 0x6d, 0x4b, 0xef, 0xa5, + 0xcb, 0xf3, 0x4a, 0x2b, 0x5b, 0xf4, 0x7b, 0xbc, 0xa1, 0x9e, 0x85, 0xd0, + 0xf7, 0x78, 0x12, 0x90, 0x97, 0xf0, 0x39, 0x13, 0x3b, 0x65, 0xab, 0x1f, + 0xf2, 0xc9, 0x66, 0xb2, 0xd1, 0x2f, 0x8c, 0x6b, 0x5a, 0x46, 0x2b, 0x2d, + 0x36, 0xac, 0xea, 0xe0, 0x67, 0xa6, 0x74, 0xad, 0xb9, 0xae, 0x3c, 0xf0, + 0x3b, 0xcc, 0x83, 0xbf, 0xd6, 0xe6, 0xba, 0xd8, 0xb1, 0xf7, 0x9a, 0xeb, + 0x46, 0x74, 0x91, 0x3e, 0xd7, 0x50, 0x54, 0xdf, 0xd8, 0xec, 0xeb, 0x5c, + 0xa9, 0x2c, 0xd3, 0xd5, 0x79, 0x67, 0xaa, 0x2b, 0x07, 0x9e, 0x3c, 0x78, + 0xf7, 0x29, 0x64, 0xd8, 0xff, 0x55, 0xb3, 0x41, 0xc7, 0x17, 0x88, 0xf3, + 0x8a, 0xaa, 0x6a, 0x51, 0xa2, 0x8a, 0xcb, 0x4e, 0xda, 0xb4, 0x71, 0xad, + 0x63, 0x8d, 0xbe, 0xc1, 0x53, 0x1d, 0x44, 0x52, 0x01, 0xda, 0x07, 0x0d, + 0xf0, 0xde, 0x35, 0x8b, 0x57, 0x4b, 0xc9, 0x2b, 0x4b, 0x9a, 0xe4, 0x0e, + 0x7a, 0x26, 0xd9, 0x69, 0xec, 0x55, 0xb6, 0xa0, 0xcb, 0x7c, 0xf0, 0x36, + 0xed, 0x68, 0x1e, 0xbd, 0xc5, 0x4b, 0x78, 0xc3, 0x37, 0xe7, 0x68, 0x0b, + 0x79, 0xeb, 0x26, 0x93, 0xac, 0x08, 0x52, 0x95, 0xf4, 0x98, 0x53, 0x7a, + 0x3d, 0xa8, 0xdd, 0x20, 0x9e, 0xeb, 0x16, 0x14, 0x6d, 0x0f, 0x5e, 0x62, + 0x5e, 0x53, 0xd0, 0x2b, 0x36, 0x6d, 0x47, 0x92, 0x34, 0x23, 0x49, 0xa9, + 0x86, 0xb9, 0xf2, 0x43, 0x2a, 0x2d, 0xf0, 0x71, 0xe8, 0x40, 0xc9, 0x19, + 0xda, 0xf7, 0x30, 0xea, 0xd1, 0x5c, 0x1f, 0x85, 0xb4, 0x55, 0x05, 0xda, + 0xfc, 0x1b, 0xbc, 0xfb, 0x08, 0x31, 0x11, 0xce, 0xb5, 0x1b, 0x09, 0xf8, + 0xe3, 0xac, 0x45, 0x5e, 0x0c, 0x7a, 0x2d, 0xef, 0x6c, 0x3b, 0x32, 0xc8, + 0x5c, 0x0b, 0x82, 0xb2, 0xfa, 0xf4, 0x86, 0x5c, 0xe4, 0x7f, 0x8b, 0x47, + 0x0a, 0x9c, 0xc6, 0x98, 0xac, 0x72, 0x2a, 0x6a, 0xc8, 0x39, 0x88, 0xc1, + 0xb9, 0xce, 0x59, 0xf8, 0x04, 0x1d, 0xd7, 0xec, 0x8c, 0xd3, 0xab, 0x74, + 0xc7, 0x00, 0x34, 0xc6, 0xb5, 0xdc, 0x0c, 0xdb, 0x88, 0x0b, 0xf0, 0x21, + 0x32, 0x39, 0xa6, 0x64, 0xae, 0x4d, 0x16, 0xc0, 0xdf, 0x0d, 0xc4, 0xec, + 0xbc, 0xcf, 0xfd, 0x4c, 0xdd, 0xd5, 0x08, 0xfa, 0xb2, 0x4e, 0xb4, 0x95, + 0x0e, 0x7e, 0x6a, 0xde, 0xe6, 0x0f, 0x58, 0x00, 0x5a, 0x16, 0x89, 0x18, + 0x38, 0xe3, 0x57, 0x0d, 0x97, 0xf9, 0xbb, 0xd1, 0xe6, 0xda, 0x40, 0xc0, + 0x99, 0x5a, 0xe1, 0x9e, 0x34, 0xe2, 0xa0, 0xa7, 0x00, 0x9f, 0x2f, 0x34, + 0x4b, 0x27, 0xc6, 0xb8, 0x8b, 0x3d, 0xe4, 0x83, 0x07, 0xc1, 0x09, 0x67, + 0xfc, 0x6f, 0xe3, 0x5f, 0x78, 0x18, 0xd0, 0x47, 0xfa, 0xbb, 0xf7, 0xe0, + 0xd3, 0x16, 0xce, 0x5f, 0xdb, 0x80, 0x39, 0x27, 0x88, 0x03, 0x3b, 0x3c, + 0xce, 0xdf, 0x5d, 0xa6, 0x42, 0x8b, 0x70, 0x31, 0xd7, 0xed, 0x7e, 0x90, + 0xb4, 0xba, 0x49, 0xe0, 0x18, 0xd0, 0xc3, 0x70, 0xfe, 0xea, 0x11, 0x7b, + 0x96, 0xc7, 0x15, 0x19, 0x78, 0xa3, 0x0f, 0x11, 0x0d, 0xce, 0xc5, 0x66, + 0x65, 0xc1, 0xb5, 0xd3, 0x04, 0x55, 0x82, 0xc7, 0xf7, 0x91, 0xa5, 0x76, + 0xc2, 0x38, 0xf0, 0x9d, 0x1e, 0xdc, 0x00, 0x2f, 0x58, 0x5c, 0x93, 0x38, + 0xd7, 0xd7, 0x8b, 0x52, 0xc3, 0x11, 0x9c, 0xfb, 0x42, 0x5d, 0x64, 0x1f, + 0xfd, 0xec, 0x15, 0xa6, 0xcc, 0xe5, 0xae, 0x0b, 0x71, 0xaa, 0x4c, 0xe0, + 0xee, 0x5d, 0xd4, 0xe0, 0x91, 0x35, 0x03, 0x87, 0xd7, 0xe1, 0x4a, 0x99, + 0x17, 0xa5, 0x24, 0x8c, 0xa7, 0xf5, 0x2b, 0x4e, 0xec, 0x27, 0xf0, 0xe5, + 0x05, 0xf8, 0x0b, 0x03, 0xbf, 0x7c, 0x0b, 0xbe, 0xbd, 0x31, 0x4f, 0x0f, + 0x58, 0x8d, 0x2a, 0xc0, 0xd5, 0x05, 0xd9, 0x00, 0x0f, 0x4e, 0x28, 0x00, + 0xad, 0xf4, 0x3a, 0xf0, 0x20, 0x3a, 0x22, 0xe5, 0x83, 0x7f, 0x49, 0x0b, + 0x0e, 0xda, 0x98, 0x0e, 0x55, 0xdc, 0x68, 0x63, 0xc8, 0x51, 0x26, 0x5c, + 0xb1, 0xa5, 0x6e, 0x34, 0x62, 0xd0, 0x63, 0xb1, 0x8a, 0x8c, 0x84, 0xf7, + 0xc9, 0xce, 0x68, 0xa6, 0x79, 0xbf, 0x4c, 0xa6, 0xe4, 0x00, 0xfd, 0xb2, + 0x67, 0xbc, 0x04, 0x2d, 0xfd, 0x66, 0x9e, 0x5a, 0x12, 0x7f, 0xae, 0x39, + 0x11, 0x60, 0xd0, 0x59, 0x8b, 0xb9, 0xce, 0x3f, 0x6f, 0x4e, 0xcf, 0xbc, + 0x5d, 0x0d, 0x47, 0x65, 0x3f, 0xa4, 0x37, 0x54, 0xcc, 0x3d, 0x3d, 0xc1, + 0x81, 0xdc, 0x80, 0xfb, 0x17, 0x99, 0xaa, 0xbe, 0x0b, 0x3f, 0x58, 0x32, + 0x66, 0x4f, 0xa1, 0x1b, 0x81, 0x8e, 0x62, 0x22, 0x71, 0x25, 0xca, 0xe7, + 0x35, 0x22, 0x2e, 0x36, 0x12, 0x4d, 0xbc, 0x32, 0xbd, 0x82, 0xf6, 0x2c, + 0x92, 0xcc, 0x97, 0x43, 0x91, 0x43, 0x3d, 0xe1, 0x85, 0xed, 0x09, 0xfc, + 0x2d, 0xea, 0x72, 0xad, 0xef, 0x62, 0x86, 0xbf, 0xe3, 0x2e, 0x70, 0x12, + 0x57, 0xa7, 0x79, 0x1d, 0x38, 0x5c, 0xe1, 0x37, 0x03, 0x7d, 0x00, 0x31, + 0x5c, 0x51, 0x5e, 0xbd, 0x61, 0x7c, 0x42, 0xc8, 0xd0, 0x38, 0x63, 0xe5, + 0x93, 0x72, 0x3d, 0x85, 0xbc, 0x78, 0xfe, 0xaa, 0x4b, 0x58, 0x67, 0xcf, + 0x83, 0x8b, 0x71, 0xdc, 0x82, 0x4f, 0x50, 0xbd, 0x51, 0x82, 0xee, 0x81, + 0xf0, 0xee, 0x61, 0xac, 0xfb, 0xc4, 0x13, 0x13, 0x9b, 0x6b, 0xca, 0xe8, + 0xd9, 0xf3, 0xe8, 0x8a, 0x28, 0xee, 0xe4, 0x23, 0xd4, 0xfa, 0x5b, 0xe9, + 0x56, 0x08, 0xf4, 0xcf, 0x2d, 0x46, 0x7d, 0x9b, 0xb8, 0x11, 0x20, 0x0f, + 0x11, 0xe0, 0xaf, 0x40, 0x43, 0x8d, 0xb3, 0xf7, 0xdd, 0xe5, 0x1d, 0x78, + 0xcf, 0xc6, 0x3a, 0x1f, 0x81, 0x6c, 0x22, 0xba, 0x62, 0x71, 0x8a, 0x83, + 0x79, 0xdf, 0x47, 0xc4, 0x35, 0x73, 0x3f, 0xb1, 0xa0, 0x70, 0xc8, 0x5c, + 0x93, 0x6b, 0x49, 0x1b, 0x31, 0x16, 0xe0, 0x7d, 0x62, 0x5f, 0x5c, 0x8e, + 0x3e, 0xab, 0xa2, 0xb9, 0xfe, 0x5c, 0x6d, 0x8b, 0x4c, 0x31, 0x2a, 0x78, + 0x34, 0x86, 0x9a, 0xba, 0x1f, 0x98, 0xdd, 0xcc, 0xeb, 0x05, 0xe6, 0x1a, + 0x5e, 0xa0, 0xe9, 0x59, 0xc4, 0x91, 0x22, 0xe0, 0xfa, 0x41, 0xa3, 0xf8, + 0xcc, 0x60, 0x82, 0x4e, 0xc2, 0x4b, 0x8c, 0xc6, 0x38, 0x20, 0x7b, 0xbe, + 0x57, 0xc4, 0xa5, 0x29, 0x37, 0x52, 0x63, 0x67, 0xea, 0x8b, 0xb9, 0xfe, + 0x54, 0xce, 0x95, 0x9c, 0xa4, 0x51, 0x55, 0xc2, 0xb1, 0xcf, 0x42, 0x27, + 0x0e, 0xa6, 0xc3, 0x16, 0xd7, 0xc4, 0x4e, 0x12, 0xe4, 0x1e, 0x5c, 0xc0, + 0xa7, 0x44, 0x3d, 0x64, 0x87, 0xb3, 0xb9, 0x06, 0x72, 0x48, 0x47, 0x0b, + 0xf0, 0xe0, 0x19, 0xb6, 0x3a, 0x60, 0x23, 0xe8, 0x1c, 0x47, 0xc4, 0xac, + 0x19, 0xad, 0xb8, 0x55, 0x7b, 0x56, 0x93, 0x43, 0xc6, 0xd6, 0x63, 0x91, + 0xd8, 0xc6, 0x1e, 0xda, 0x3d, 0xfa, 0x73, 0x8d, 0x54, 0x69, 0x70, 0xe0, + 0xd9, 0xbc, 0xbb, 0xe8, 0xd4, 0x60, 0x5b, 0xf0, 0x53, 0x7b, 0xe0, 0x04, + 0x44, 0x11, 0x1e, 0x0a, 0x9f, 0x6d, 0xc0, 0x9b, 0xd4, 0xdc, 0x27, 0x59, + 0xe1, 0x7d, 0x2d, 0x0a, 0x2e, 0x17, 0xdc, 0x09, 0xde, 0xa0, 0xeb, 0xde, + 0xe0, 0x0b, 0x81, 0x5f, 0x56, 0x71, 0x31, 0xaf, 0x2b, 0xf2, 0xf1, 0x99, + 0x2a, 0xbc, 0x28, 0x7c, 0x52, 0x95, 0xed, 0xaa, 0x0d, 0xcd, 0x50, 0x3f, + 0x80, 0x86, 0x64, 0xb3, 0xbf, 0xe5, 0xc0, 0x87, 0xbc, 0x8a, 0x80, 0x7b, + 0x62, 0xb8, 0xbe, 0xae, 0xe0, 0x56, 0x7e, 0xa0, 0xfd, 0xae, 0xd4, 0x83, + 0x25, 0xfc, 0xec, 0xf7, 0xda, 0x90, 0x90, 0xa6, 0x7f, 0xc7, 0xde, 0xc5, + 0x9a, 0xbf, 0x8b, 0x63, 0xae, 0x4d, 0xc7, 0xdd, 0xde, 0x8e, 0x4c, 0xd4, + 0x89, 0x66, 0xab, 0x87, 0x68, 0xfb, 0x4a, 0xb4, 0xca, 0xc9, 0xff, 0xc8, + 0x3f, 0xf0, 0x70, 0x7e, 0xe1, 0x30, 0xf0, 0x25, 0x01, 0xe8, 0xab, 0x08, + 0x74, 0xbb, 0x8c, 0x23, 0xc6, 0x72, 0xc8, 0xe1, 0xc5, 0xb1, 0x13, 0xd7, + 0x30, 0x1e, 0xe0, 0x8a, 0x30, 0xe8, 0xbe, 0xc5, 0xeb, 0x90, 0xb8, 0xe6, + 0x91, 0xce, 0x35, 0xc6, 0xfa, 0x1b, 0xc4, 0xe6, 0x96, 0x32, 0xf0, 0x35, + 0xb4, 0x87, 0x56, 0xc0, 0xf7, 0x79, 0x81, 0x88, 0x1d, 0x24, 0xc2, 0x86, + 0xec, 0x99, 0xcf, 0x38, 0xe8, 0x4a, 0x13, 0xeb, 0x73, 0x1d, 0xfc, 0x20, + 0x9f, 0xeb, 0xb4, 0xe0, 0x46, 0x56, 0x5c, 0xa9, 0x34, 0x9b, 0xec, 0x45, + 0x96, 0x06, 0x97, 0xcc, 0x28, 0x27, 0xcc, 0x32, 0x1d, 0xfa, 0x71, 0x90, + 0x46, 0xbf, 0x0b, 0xe7, 0xbc, 0x35, 0xe4, 0x2e, 0x9a, 0x10, 0xc4, 0x2c, + 0xc4, 0x57, 0xd7, 0xef, 0xd8, 0xdf, 0xf8, 0x64, 0xb3, 0xd2, 0xe2, 0x54, + 0x0d, 0x90, 0x87, 0x22, 0x33, 0xd7, 0x8b, 0xe3, 0xfc, 0x8d, 0x2d, 0x90, + 0xfb, 0x92, 0x0e, 0x3b, 0x09, 0xb1, 0x06, 0x2a, 0x00, 0xb0, 0x11, 0x65, + 0x47, 0x15, 0x54, 0x89, 0x29, 0x60, 0xfe, 0x2b, 0x0b, 0xe6, 0xa8, 0xc7, + 0xc0, 0x29, 0x49, 0xb3, 0x30, 0x61, 0x1e, 0xc0, 0x4f, 0x54, 0x5d, 0xc2, + 0x81, 0xf7, 0x5b, 0xed, 0x99, 0xbb, 0x32, 0xcb, 0x1b, 0x86, 0x42, 0x86, + 0x6e, 0x07, 0xbf, 0x99, 0xbf, 0xbb, 0x65, 0x7b, 0x6c, 0xaa, 0x7b, 0xd2, + 0x22, 0x01, 0x9a, 0xc2, 0x08, 0xdd, 0x8b, 0x0e, 0x7a, 0x21, 0x10, 0x7a, + 0x10, 0xe6, 0xf1, 0xea, 0x11, 0xb7, 0xaf, 0x97, 0xf4, 0x83, 0x36, 0xe2, + 0x2b, 0x06, 0x3e, 0x54, 0x67, 0x88, 0xd9, 0x89, 0x27, 0x9d, 0xbc, 0x55, + 0x61, 0xd2, 0xe8, 0x79, 0x6c, 0x44, 0x90, 0xef, 0xcd, 0x44, 0x3c, 0xfd, + 0x06, 0x1c, 0xfd, 0x0d, 0xf3, 0xed, 0xcd, 0xf5, 0xd9, 0x32, 0x15, 0xa8, + 0x03, 0xc3, 0x98, 0x26, 0x01, 0x84, 0x04, 0xe3, 0xd8, 0x98, 0x39, 0x4d, + 0x6d, 0x0a, 0x14, 0x4c, 0x90, 0x06, 0x6f, 0xc0, 0x48, 0x42, 0x37, 0xf7, + 0x49, 0x68, 0xd2, 0xe6, 0x9b, 0xbb, 0x49, 0x4c, 0x02, 0xfd, 0xfa, 0x95, + 0x9f, 0x67, 0x4a, 0x03, 0xf0, 0xcb, 0xec, 0x0d, 0x98, 0x64, 0x16, 0xad, + 0xbe, 0x08, 0xf9, 0xb8, 0xc9, 0x5d, 0x65, 0x1f, 0x3c, 0x96, 0xe7, 0xf3, + 0xe7, 0x3d, 0x92, 0xe6, 0x1c, 0xe2, 0xaa, 0xeb, 0x1d, 0xea, 0x82, 0x4a, + 0x75, 0x44, 0xc3, 0xda, 0xb9, 0xfe, 0x94, 0x9d, 0xb2, 0x44, 0xe0, 0xd8, + 0x40, 0xd7, 0x58, 0xff, 0xa5, 0xd7, 0xc6, 0xac, 0x69, 0xac, 0xd8, 0x6c, + 0x26, 0x8c, 0xd8, 0x56, 0xa6, 0xee, 0x33, 0x33, 0xb4, 0x45, 0xe2, 0x04, + 0x75, 0xb9, 0xf9, 0x1a, 0x39, 0x53, 0x2f, 0xec, 0x20, 0x3c, 0xd7, 0x92, + 0x28, 0xf5, 0x70, 0x2a, 0x3d, 0xf2, 0xce, 0xd3, 0x5f, 0x7b, 0x0c, 0x8d, + 0xc4, 0x05, 0x9f, 0x66, 0xc2, 0xdc, 0x28, 0x01, 0xd7, 0xa6, 0x74, 0xde, + 0x58, 0x01, 0x35, 0xcb, 0x31, 0x32, 0x71, 0x48, 0xf5, 0xb9, 0x6e, 0x28, + 0x23, 0x61, 0x8a, 0xe6, 0x9a, 0x02, 0x4e, 0xa2, 0x57, 0xef, 0x3c, 0x11, + 0xcb, 0x28, 0x61, 0x31, 0x69, 0x5c, 0x0d, 0x7b, 0xf7, 0xb7, 0xa8, 0x33, + 0x8b, 0x4c, 0x20, 0xb3, 0x52, 0x11, 0x32, 0x85, 0x55, 0xcc, 0x2d, 0x57, + 0xf8, 0xe2, 0x1d, 0xf2, 0xcb, 0xfc, 0x9d, 0x00, 0xe1, 0xfc, 0xfc, 0x08, + 0xae, 0xfd, 0x1c, 0x32, 0xf6, 0x8c, 0xd2, 0x59, 0xb7, 0xa9, 0x24, 0xe3, + 0xee, 0x8b, 0xbb, 0x8a, 0x83, 0x5f, 0x5f, 0x02, 0x46, 0xd0, 0x79, 0x7d, + 0x51, 0xc8, 0x32, 0x0b, 0xb8, 0x3d, 0x3d, 0x26, 0x72, 0x79, 0x74, 0xad, + 0xb3, 0xf0, 0xe6, 0x67, 0x81, 0x6b, 0xf0, 0xfc, 0xa8, 0x29, 0x6b, 0xf2, + 0x8a, 0x4d, 0x42, 0x41, 0xbb, 0x74, 0xb1, 0x37, 0x72, 0xd0, 0x89, 0x6f, + 0xd1, 0xa1, 0x38, 0xa9, 0x33, 0x23, 0x06, 0xae, 0x8e, 0xdd, 0x59, 0x73, + 0x5b, 0xfc, 0x90, 0x56, 0xd9, 0xce, 0xd8, 0xbe, 0x13, 0xd7, 0xda, 0xe1, + 0xa6, 0xaa, 0xc5, 0xec, 0x71, 0x4c, 0x15, 0x92, 0xc4, 0xee, 0xcb, 0x5a, + 0x42, 0xcc, 0x96, 0xa3, 0x00, 0x9d, 0x09, 0xb9, 0xac, 0x33, 0x4f, 0xc6, + 0x39, 0xb7, 0xfa, 0xa2, 0x16, 0x71, 0xa6, 0x01, 0x37, 0x35, 0x24, 0x3d, + 0xb8, 0xaf, 0x1b, 0x71, 0x9b, 0x67, 0xd8, 0x8c, 0x13, 0x73, 0x2d, 0x24, + 0xdc, 0x20, 0x88, 0xc1, 0xf7, 0x93, 0x46, 0x7f, 0x82, 0x1f, 0xd9, 0x30, + 0x26, 0x1a, 0xec, 0x84, 0x13, 0xdd, 0x0c, 0x59, 0xc2, 0xc0, 0x53, 0xcd, + 0xf5, 0x4c, 0xb4, 0x11, 0xb4, 0xc0, 0xfc, 0xdd, 0x39, 0xf6, 0xa1, 0x34, + 0xe8, 0x13, 0xf2, 0x3c, 0x2e, 0x5c, 0x31, 0x32, 0x2d, 0x1b, 0x45, 0xaa, + 0x8c, 0xa2, 0x86, 0xfe, 0xa6, 0xcc, 0xc3, 0xd0, 0x46, 0xae, 0xbd, 0xde, + 0x1c, 0xb8, 0x84, 0x50, 0x71, 0x3b, 0xd0, 0x40, 0x65, 0xa6, 0x1a, 0x41, + 0xb7, 0x39, 0xc0, 0xc7, 0xb7, 0x88, 0x32, 0x27, 0x34, 0x71, 0x2d, 0x41, + 0x1b, 0xe0, 0x5a, 0x78, 0xc2, 0x41, 0xba, 0xd4, 0xf1, 0x92, 0xa5, 0xf2, + 0x1d, 0x75, 0xd5, 0x3e, 0x6b, 0xac, 0x3d, 0xee, 0x70, 0x77, 0x44, 0xeb, + 0xb9, 0x2e, 0x7a, 0x1d, 0xd1, 0xe1, 0x4a, 0x5d, 0x25, 0xf2, 0x09, 0x50, + 0x38, 0x51, 0x2f, 0x11, 0x7f, 0x3d, 0xa9, 0x29, 0xf7, 0xa1, 0x83, 0xad, + 0x92, 0xca, 0x2a, 0x4b, 0xb0, 0x05, 0x3a, 0x12, 0x93, 0x36, 0xb4, 0x64, + 0x2b, 0xbe, 0x4b, 0xdd, 0x9e, 0xeb, 0xbf, 0x8c, 0x25, 0xc8, 0x11, 0xc9, + 0x07, 0x96, 0x2b, 0xa9, 0x41, 0x8e, 0x57, 0x71, 0xab, 0x07, 0xd2, 0xcc, + 0x26, 0x88, 0x31, 0x2f, 0xeb, 0xc8, 0x03, 0xb0, 0xdd, 0xdf, 0x1b, 0xa0, + 0xf0, 0xbb, 0x3e, 0xa5, 0x2d, 0x06, 0x9d, 0xbe, 0xd5, 0xc0, 0x0b, 0xc6, + 0xac, 0xc3, 0x24, 0xaf, 0x9b, 0x67, 0xe1, 0x55, 0xf7, 0x22, 0x45, 0x53, + 0x66, 0x80, 0xaf, 0x48, 0x98, 0x0a, 0x9d, 0xb5, 0x5e, 0xcc, 0xdf, 0x15, + 0xa2, 0xe3, 0x6b, 0x92, 0xc8, 0xbb, 0x50, 0x95, 0x16, 0x26, 0x58, 0x51, + 0x56, 0x1a, 0xd0, 0x87, 0x3b, 0x31, 0x30, 0xc3, 0xc6, 0xf0, 0x48, 0x12, + 0x71, 0x05, 0x1f, 0x05, 0xb9, 0x53, 0xcd, 0x75, 0x33, 0x7e, 0xaf, 0x7b, + 0xd1, 0xa0, 0xfd, 0x5e, 0x47, 0x87, 0x4c, 0xf5, 0x6f, 0xc0, 0x20, 0x1e, + 0x83, 0x9e, 0xcd, 0x3a, 0x65, 0x01, 0x4f, 0x1b, 0xc7, 0xe6, 0xd7, 0xb3, + 0xee, 0x0e, 0x7c, 0xef, 0x32, 0xd4, 0x40, 0x17, 0x21, 0x42, 0xe8, 0xd4, + 0xdc, 0xf6, 0x53, 0x65, 0x02, 0x9e, 0x74, 0x54, 0x8b, 0x6e, 0x74, 0xf3, + 0x65, 0x0a, 0xd0, 0xb1, 0xf1, 0xfc, 0xec, 0x16, 0x81, 0xfe, 0xe3, 0xc0, + 0x83, 0x5e, 0x33, 0x7f, 0x07, 0xc5, 0x55, 0xb8, 0x32, 0x02, 0x7f, 0xfa, + 0x3e, 0x3a, 0x2a, 0x0c, 0x79, 0xd5, 0xcb, 0x04, 0x6d, 0x76, 0x93, 0xfb, + 0x4c, 0x18, 0xb9, 0xef, 0xb5, 0xd5, 0x3d, 0x66, 0xfd, 0x06, 0x30, 0xec, + 0x3c, 0x7f, 0xbf, 0x5f, 0x66, 0xc0, 0x3c, 0x1a, 0x0c, 0x3c, 0x34, 0x59, + 0x46, 0x0d, 0xd3, 0x8e, 0x0d, 0x42, 0xd2, 0x69, 0x0c, 0xa6, 0x4b, 0x05, + 0xf1, 0x7b, 0xa3, 0x7a, 0xf9, 0x3c, 0xb6, 0x24, 0x2f, 0x53, 0x44, 0x61, + 0x7c, 0x69, 0xc1, 0x5f, 0x56, 0x69, 0x58, 0x66, 0xee, 0x64, 0xd3, 0xb1, + 0x9e, 0x6b, 0x96, 0x88, 0x2d, 0x6e, 0xf4, 0x90, 0x28, 0xe9, 0xc2, 0x7c, + 0x50, 0x81, 0x40, 0xdf, 0x36, 0xfa, 0x2d, 0xf6, 0xaa, 0x79, 0x5d, 0xe9, + 0x6b, 0x6f, 0xf4, 0x5a, 0xcc, 0x17, 0x5a, 0xd9, 0x50, 0x70, 0x2b, 0x56, + 0x72, 0xf4, 0x41, 0xe7, 0xd3, 0x21, 0x05, 0x5d, 0x31, 0xef, 0x51, 0x1f, + 0x39, 0xc5, 0x16, 0x83, 0x79, 0x02, 0x4d, 0xc9, 0xc2, 0x49, 0xd0, 0xdd, + 0x04, 0x9a, 0x03, 0xd9, 0x97, 0xa8, 0x45, 0x74, 0xbe, 0x7f, 0x81, 0x41, + 0xe3, 0x46, 0x06, 0xf2, 0x09, 0xb3, 0x9f, 0x21, 0xf8, 0x1e, 0x8a, 0xa4, + 0x45, 0x13, 0xb2, 0x2c, 0x14, 0xd5, 0xb9, 0x8b, 0x59, 0x64, 0x2c, 0x46, + 0xd0, 0x97, 0x6e, 0xa1, 0xa2, 0x89, 0x75, 0xe4, 0x9d, 0x6c, 0x56, 0x43, + 0xd1, 0x8c, 0x1a, 0x78, 0xfe, 0x84, 0x37, 0x7d, 0x5c, 0xd6, 0x42, 0x2f, + 0x1a, 0x17, 0x66, 0x55, 0xb4, 0x85, 0xab, 0xbf, 0x43, 0x6f, 0xd5, 0xb1, + 0x89, 0x3d, 0x81, 0x4f, 0xcf, 0x52, 0x17, 0x53, 0x0e, 0x9a, 0xaf, 0x34, + 0xf4, 0x8c, 0x9e, 0x57, 0x04, 0x30, 0x6a, 0x91, 0xcc, 0xf5, 0x5e, 0xdd, + 0x79, 0x1d, 0x2f, 0xc3, 0xa1, 0xce, 0x6e, 0xd2, 0x55, 0xe1, 0x5e, 0x17, + 0x31, 0xf8, 0xe5, 0xb9, 0xa6, 0x0e, 0x8e, 0xd2, 0x66, 0xa2, 0xe6, 0xfc, + 0xbc, 0xea, 0x72, 0x13, 0x0d, 0x71, 0xb3, 0x04, 0x74, 0xac, 0xce, 0xb2, + 0x83, 0x23, 0xdf, 0x18, 0xbc, 0xab, 0xf0, 0x54, 0x5f, 0x36, 0x2b, 0x9a, + 0xeb, 0x0c, 0xf4, 0x14, 0xba, 0x10, 0x3a, 0xee, 0xa8, 0x46, 0x5f, 0x94, + 0xbe, 0x16, 0xa1, 0x2b, 0x42, 0xd0, 0x1f, 0x34, 0xec, 0xc0, 0x1b, 0x6f, + 0x06, 0x9f, 0x74, 0xc0, 0x2b, 0x74, 0x0c, 0x33, 0xca, 0x50, 0x82, 0x58, + 0x54, 0x98, 0x82, 0x80, 0x16, 0x3c, 0x80, 0x66, 0x8a, 0x81, 0x7b, 0x5f, + 0xe0, 0x59, 0xf6, 0xf3, 0xf7, 0x25, 0x92, 0x96, 0x55, 0xa4, 0x11, 0x34, + 0x71, 0xd9, 0x86, 0x28, 0x6a, 0x1c, 0x55, 0xff, 0x00, 0x6f, 0xea, 0x26, + 0x28, 0x78, 0x96, 0x89, 0xfb, 0x8a, 0xbd, 0x3e, 0xe0, 0x9d, 0xc8, 0x45, + 0x6a, 0x3f, 0x33, 0xda, 0xdf, 0x72, 0xbe, 0x3a, 0xe0, 0x84, 0x8d, 0xc2, + 0x50, 0x7d, 0xee, 0x89, 0x01, 0xf0, 0x34, 0x2f, 0xb4, 0xe1, 0x51, 0x7a, + 0x8b, 0xb9, 0xfe, 0xcf, 0xed, 0x90, 0xca, 0x98, 0x18, 0xea, 0xc5, 0xbd, + 0xad, 0x05, 0xf9, 0xe0, 0x62, 0x2f, 0xd8, 0x97, 0x4d, 0xf3, 0x12, 0x2e, + 0xea, 0x13, 0x73, 0xae, 0x11, 0xd9, 0x7f, 0xc7, 0x74, 0xf6, 0xd2, 0x97, + 0x45, 0x88, 0xf0, 0xbe, 0xf4, 0xaa, 0x38, 0x44, 0xd1, 0xa2, 0x30, 0x98, + 0x41, 0x39, 0xf8, 0x56, 0x4d, 0x3e, 0xb8, 0x23, 0xb7, 0xf3, 0x3a, 0x6e, + 0x9c, 0xb2, 0x79, 0x7d, 0xcd, 0x8e, 0x18, 0xba, 0x17, 0x35, 0xa8, 0x97, + 0x7c, 0x34, 0x31, 0x43, 0x67, 0x0a, 0x6a, 0x19, 0xeb, 0x5b, 0xad, 0x68, + 0xf1, 0xf6, 0xd8, 0xe2, 0xcb, 0x4e, 0x93, 0x86, 0xec, 0x84, 0x0e, 0x3a, + 0x43, 0x1d, 0x9b, 0x40, 0xe7, 0x7e, 0xb5, 0x89, 0x3b, 0xe8, 0x99, 0x2e, + 0x97, 0xe0, 0x97, 0x1b, 0xc2, 0x95, 0x0e, 0x1a, 0xe9, 0x05, 0x7e, 0xe5, + 0x7c, 0xec, 0xd8, 0x9d, 0xfc, 0x6a, 0x5f, 0x39, 0x85, 0xc6, 0xb2, 0x84, + 0x0e, 0xdf, 0x51, 0x67, 0xeb, 0xd9, 0x7b, 0xa8, 0x72, 0x56, 0x35, 0xfb, + 0xf7, 0xd0, 0xc5, 0x0d, 0xba, 0xc7, 0xf3, 0xfe, 0x60, 0xda, 0x4c, 0xd0, + 0xe6, 0x42, 0x00, 0xaf, 0xd2, 0x79, 0x4f, 0xaa, 0xeb, 0x5a, 0x61, 0x4a, + 0x22, 0xce, 0xfa, 0x16, 0x30, 0xc1, 0x2e, 0x52, 0x32, 0x00, 0xf6, 0x0f, + 0xc7, 0x24, 0x58, 0x62, 0x37, 0x78, 0x16, 0x0a, 0xfc, 0x6e, 0x47, 0x02, + 0x61, 0x52, 0x4b, 0x36, 0x2b, 0xd0, 0x13, 0x91, 0x06, 0x7e, 0x24, 0x3a, + 0x24, 0xcd, 0x8d, 0x98, 0x3d, 0x3b, 0x76, 0xf6, 0xf7, 0x81, 0x5b, 0x46, + 0xe2, 0x9d, 0x40, 0xe7, 0x96, 0x16, 0xd6, 0x4b, 0x98, 0xdf, 0xca, 0xde, + 0x99, 0xf6, 0x23, 0x31, 0xc9, 0x36, 0x9f, 0xc4, 0x32, 0x77, 0xd8, 0x9e, + 0x68, 0x73, 0x15, 0xb3, 0xcb, 0x08, 0x1a, 0x62, 0x49, 0x29, 0xe8, 0x0c, + 0xa7, 0x7c, 0x1d, 0xdc, 0xcb, 0x33, 0x76, 0x1a, 0xad, 0x34, 0xf1, 0x56, + 0x38, 0xea, 0x9c, 0x19, 0xfd, 0x03, 0xff, 0xba, 0x47, 0x3e, 0x3e, 0xcb, + 0xc9, 0x7d, 0x53, 0x8a, 0xb4, 0xa2, 0xeb, 0xb7, 0xe0, 0x51, 0xfb, 0x44, + 0xb7, 0xef, 0xa1, 0x9a, 0x9f, 0x63, 0xb1, 0xb6, 0xd4, 0x23, 0xe0, 0x16, + 0x75, 0x21, 0xed, 0x2a, 0xa3, 0xdd, 0xd6, 0x64, 0x89, 0x8c, 0xb0, 0x37, + 0x3e, 0x00, 0xa3, 0xef, 0x47, 0x57, 0x7e, 0x43, 0x7b, 0x64, 0x6f, 0xe8, + 0x71, 0xc1, 0xd5, 0x01, 0x7c, 0xe9, 0x82, 0x72, 0x24, 0xe6, 0x3d, 0xe3, + 0x59, 0xa3, 0x3d, 0x0b, 0x43, 0x30, 0xe0, 0x42, 0x2d, 0x46, 0x6a, 0x0b, + 0xd7, 0x39, 0x70, 0x26, 0x44, 0x62, 0x2a, 0x83, 0xbb, 0x99, 0x25, 0x68, + 0x69, 0x52, 0x0d, 0xe2, 0x58, 0xa1, 0x4e, 0xba, 0x03, 0x78, 0x2e, 0xf2, + 0x2c, 0x18, 0xde, 0xfc, 0xfa, 0x1e, 0x2f, 0x23, 0x80, 0xb8, 0x1b, 0xcf, + 0xc0, 0xb3, 0x49, 0x49, 0x41, 0x03, 0x68, 0xfa, 0x80, 0xbd, 0xe8, 0x05, + 0xe3, 0xc3, 0x72, 0x8f, 0x59, 0xa0, 0x49, 0x41, 0xf3, 0x0b, 0xc8, 0xf5, + 0xea, 0x9e, 0xb1, 0x10, 0x62, 0x91, 0x8d, 0x70, 0x7d, 0xdd, 0x7c, 0xbd, + 0x09, 0xad, 0xac, 0x70, 0xae, 0xdd, 0xe5, 0x64, 0xef, 0xc4, 0xbb, 0x2f, + 0x58, 0xb3, 0xaa, 0x81, 0x33, 0x4c, 0x3c, 0x7f, 0x77, 0xb4, 0x76, 0x7a, + 0x65, 0x4d, 0xdf, 0x1e, 0x81, 0x0b, 0xb1, 0x6f, 0x4f, 0xf9, 0x5c, 0xbb, + 0xbd, 0x1d, 0x0e, 0xc2, 0xed, 0x3d, 0xaa, 0x48, 0x9c, 0x18, 0x7a, 0x1d, + 0xd5, 0xb6, 0x13, 0x37, 0xa5, 0x9e, 0x23, 0xf7, 0x9d, 0x20, 0x0a, 0x31, + 0x74, 0x5a, 0x80, 0x6e, 0xad, 0x89, 0x2e, 0x41, 0x6f, 0x68, 0xa6, 0x54, + 0x36, 0xf8, 0x6e, 0x11, 0xe6, 0x8a, 0x5d, 0xc8, 0x34, 0x73, 0xeb, 0x69, + 0x31, 0x3f, 0x63, 0x8c, 0x4c, 0x62, 0x4b, 0x57, 0x03, 0x9e, 0x06, 0x7e, + 0xd6, 0x94, 0x28, 0x5d, 0x69, 0x63, 0x03, 0x64, 0x4e, 0x3b, 0xb6, 0x07, + 0xea, 0xea, 0x42, 0x77, 0xcd, 0xb8, 0x45, 0x2f, 0xde, 0xdc, 0x2d, 0xd1, + 0x5a, 0x7e, 0xa6, 0xad, 0x32, 0xd2, 0x00, 0xa6, 0x22, 0xd2, 0x40, 0xbc, + 0x4f, 0x47, 0xaa, 0x0c, 0x92, 0xc8, 0xef, 0x38, 0x41, 0x37, 0x98, 0x87, + 0x78, 0x07, 0xbe, 0x1f, 0x70, 0xd2, 0xe0, 0x29, 0x7a, 0x60, 0x13, 0xdf, + 0xa9, 0x07, 0xca, 0x07, 0xad, 0x01, 0x1b, 0xc4, 0x56, 0xd0, 0xfb, 0x33, + 0xea, 0xc0, 0x87, 0x6a, 0xf3, 0xdd, 0x81, 0xd9, 0x4f, 0xe8, 0x39, 0xe9, + 0xe8, 0xab, 0xd0, 0xaa, 0x3e, 0x77, 0xb6, 0x9a, 0xf0, 0xe7, 0x1a, 0xe6, + 0xaa, 0x91, 0x90, 0x93, 0x10, 0xa3, 0x79, 0x02, 0x3c, 0x97, 0x78, 0xc1, + 0x53, 0x3a, 0xa8, 0x2e, 0xf4, 0xaa, 0x07, 0x3e, 0x63, 0xa4, 0x0d, 0x0e, + 0x31, 0xc2, 0x6a, 0x3f, 0x21, 0x06, 0xfe, 0x6e, 0xe4, 0xaa, 0x6a, 0x81, + 0xdf, 0x4d, 0xd0, 0x87, 0x55, 0x61, 0xf4, 0x6f, 0xd0, 0xe5, 0xbb, 0x58, + 0x1b, 0x76, 0x73, 0x4d, 0x8c, 0xd8, 0x00, 0x9e, 0x51, 0x01, 0xcd, 0x6a, + 0xe9, 0x40, 0x7e, 0xd7, 0x12, 0xb1, 0x3d, 0x68, 0x88, 0x17, 0xf3, 0x32, + 0xf3, 0x90, 0xa8, 0x96, 0x99, 0xc1, 0x58, 0xa4, 0x91, 0x29, 0xe8, 0xc9, + 0x0c, 0x3b, 0x62, 0x84, 0xe7, 0x55, 0xc4, 0x3a, 0x94, 0x8b, 0xa6, 0x7f, + 0x94, 0xca, 0x7d, 0x73, 0xba, 0x7d, 0x31, 0xdf, 0x7e, 0x81, 0x46, 0xeb, + 0x71, 0x5a, 0x69, 0x05, 0x03, 0x96, 0xe1, 0xd5, 0x18, 0xd6, 0x62, 0xfe, + 0x9e, 0x80, 0x1d, 0x70, 0x82, 0x2d, 0x7c, 0x50, 0x9c, 0x1e, 0x3b, 0xb0, + 0xce, 0x35, 0x0f, 0xbe, 0xf8, 0xce, 0x4c, 0xe0, 0xbc, 0x29, 0x18, 0x13, + 0x1f, 0x59, 0xa4, 0x1d, 0xe6, 0x5d, 0xec, 0x9d, 0x50, 0x7d, 0x56, 0x2a, + 0xb4, 0x04, 0x8c, 0x8e, 0x13, 0x93, 0x4d, 0xbf, 0x6a, 0x24, 0xb4, 0x64, + 0x8a, 0xe3, 0xe1, 0x7a, 0x4c, 0xec, 0x05, 0x78, 0xa0, 0xe5, 0xc1, 0x93, + 0x75, 0x31, 0x7f, 0x4f, 0x4e, 0xda, 0x87, 0x74, 0x52, 0x03, 0x3f, 0x7f, + 0x99, 0xa1, 0x0a, 0x6f, 0x85, 0xf1, 0xd2, 0x42, 0xc7, 0x36, 0x4a, 0x45, + 0x5e, 0x3c, 0x99, 0x6b, 0x4a, 0x80, 0x92, 0x6a, 0x06, 0xd0, 0x17, 0x68, + 0x5e, 0xef, 0x55, 0x85, 0x6e, 0x15, 0xc7, 0x7c, 0x18, 0x0b, 0x08, 0xfb, + 0x83, 0x57, 0xb5, 0x89, 0x0a, 0x7c, 0xd0, 0xfd, 0xf5, 0x21, 0xb5, 0xb7, + 0xe0, 0x61, 0xb7, 0x52, 0xf5, 0x34, 0x66, 0x48, 0xc9, 0xcd, 0xea, 0x71, + 0x40, 0xec, 0x0d, 0xbc, 0xb5, 0xc7, 0x28, 0xb8, 0x17, 0x48, 0x64, 0xe1, + 0x5c, 0x77, 0xbf, 0xad, 0xaa, 0xb8, 0x96, 0xda, 0xde, 0x44, 0x7e, 0xac, + 0x05, 0xf0, 0xfb, 0xfa, 0xcd, 0x6b, 0x49, 0xb3, 0x09, 0xf0, 0x94, 0x46, + 0x26, 0xc4, 0xec, 0x9d, 0xbe, 0x57, 0x4b, 0xe0, 0x85, 0x65, 0x3c, 0x29, + 0x33, 0x67, 0xfd, 0x5d, 0xb0, 0x20, 0x29, 0x5a, 0x8b, 0xc7, 0xee, 0xea, + 0x8c, 0x75, 0x64, 0xcc, 0xdf, 0xe5, 0x22, 0x27, 0xfb, 0x7c, 0xac, 0xab, + 0xbd, 0x6c, 0x89, 0x02, 0xec, 0xdd, 0x02, 0xf7, 0x74, 0x7b, 0x4d, 0xb8, + 0xe0, 0xff, 0x20, 0xbe, 0x51, 0x9b, 0x34, 0x22, 0x09, 0x27, 0x7c, 0x27, + 0xda, 0x69, 0x04, 0x7d, 0xf9, 0x5d, 0x18, 0xc8, 0xdb, 0x69, 0x0b, 0x83, + 0x6d, 0x86, 0x21, 0x7f, 0xaf, 0xec, 0xd8, 0xb0, 0x2e, 0x12, 0xfc, 0x21, + 0x53, 0xc4, 0xcf, 0x0d, 0xfd, 0xbe, 0x33, 0x16, 0x16, 0xe8, 0x93, 0xb0, + 0x68, 0xf4, 0x38, 0x33, 0xdd, 0x91, 0x77, 0xa1, 0x71, 0xe0, 0xbf, 0xbe, + 0xa7, 0x2d, 0x15, 0x14, 0x34, 0xa6, 0x2b, 0x86, 0x83, 0x6f, 0x03, 0xf6, + 0x54, 0x8a, 0xa6, 0xe8, 0x10, 0x72, 0xb5, 0x14, 0x9d, 0x9d, 0x52, 0x08, + 0x0b, 0xd9, 0x04, 0x11, 0x66, 0x4c, 0xdb, 0x6b, 0x14, 0x62, 0x52, 0x8c, + 0x39, 0xc7, 0x07, 0x61, 0x80, 0x2e, 0x80, 0x6b, 0xa6, 0xad, 0x15, 0x66, + 0x89, 0x50, 0x98, 0xb3, 0x81, 0x21, 0x61, 0x31, 0x3d, 0x38, 0xc3, 0x5f, + 0x0f, 0xda, 0x84, 0x3e, 0xcb, 0x27, 0xe4, 0x92, 0x17, 0xa6, 0xf6, 0xb0, + 0x33, 0x32, 0x1d, 0xf4, 0xe4, 0x5c, 0x9e, 0xf0, 0x3b, 0xac, 0xe9, 0xbc, + 0x76, 0x69, 0x3a, 0x24, 0x6b, 0x03, 0x3c, 0x4e, 0x53, 0x52, 0xd7, 0x9a, + 0xd7, 0x65, 0xb0, 0x4e, 0xa6, 0xc2, 0x11, 0x42, 0xf0, 0x0a, 0xf2, 0x7b, + 0x55, 0xc5, 0xbc, 0x31, 0xc2, 0x7a, 0x7d, 0x63, 0x4a, 0x6c, 0x79, 0x8d, + 0x8c, 0x38, 0x11, 0x87, 0xa4, 0x5d, 0x3d, 0x8b, 0x3a, 0xe0, 0x45, 0x57, + 0xbe, 0x29, 0x0f, 0x66, 0x55, 0x36, 0x82, 0xf7, 0x04, 0x4d, 0x13, 0xa0, + 0xa2, 0x0d, 0x9c, 0x3c, 0x41, 0x71, 0x36, 0xe1, 0xf9, 0x1e, 0x60, 0x57, + 0xe8, 0xe8, 0x4d, 0xd5, 0x7a, 0x4a, 0x60, 0xfc, 0x0f, 0x08, 0xb0, 0x3a, + 0xbd, 0xdc, 0xb2, 0x46, 0x7a, 0x51, 0x7b, 0x9f, 0x98, 0x81, 0x76, 0x14, + 0xf4, 0x9c, 0x60, 0xb6, 0x43, 0x5c, 0xc0, 0x5a, 0x56, 0xde, 0xf6, 0x9a, + 0xc4, 0xa2, 0x66, 0x82, 0x7b, 0x73, 0xad, 0x45, 0xd2, 0x14, 0x0a, 0x1d, + 0x84, 0xb7, 0x12, 0x65, 0x0b, 0x3e, 0xc4, 0x53, 0x0e, 0x31, 0xc8, 0x02, + 0x6b, 0xe3, 0x5e, 0x24, 0x36, 0xc4, 0x41, 0x79, 0xcb, 0x55, 0x3f, 0x16, + 0xa6, 0xbc, 0xc3, 0xdc, 0x6e, 0x8e, 0xcd, 0x97, 0x49, 0xb9, 0xcc, 0x77, + 0x3a, 0xe9, 0x0a, 0xc6, 0xc0, 0xb7, 0xc8, 0x41, 0x34, 0xab, 0x0d, 0x9d, + 0x70, 0x94, 0x23, 0x96, 0x67, 0x3a, 0xb9, 0x72, 0x06, 0x9c, 0xed, 0x03, + 0x3e, 0xb3, 0xcb, 0x3b, 0x67, 0xac, 0xca, 0x40, 0x97, 0x0a, 0x03, 0x63, + 0xf0, 0x54, 0xdf, 0x05, 0xb2, 0x6f, 0x10, 0x13, 0x2f, 0x6c, 0x54, 0x7a, + 0xee, 0x23, 0xf0, 0x53, 0xdb, 0x29, 0xd6, 0x21, 0xc7, 0x7c, 0xf2, 0x08, + 0xdb, 0xe8, 0x09, 0x58, 0x7a, 0xa5, 0xcd, 0xeb, 0x56, 0x76, 0x6a, 0x1f, + 0xb6, 0xfd, 0xab, 0xf0, 0xfa, 0x3a, 0xe9, 0x4e, 0xef, 0xa8, 0x05, 0x1f, + 0x66, 0x54, 0x8b, 0x83, 0x8f, 0x5e, 0x19, 0x47, 0x28, 0x74, 0xc3, 0x17, + 0xf0, 0x83, 0x39, 0xdf, 0x9f, 0xc2, 0xad, 0x55, 0x1d, 0x3c, 0x91, 0x08, + 0x06, 0x5a, 0xd3, 0x1d, 0xe6, 0xef, 0xdd, 0x7a, 0x84, 0x8e, 0x4c, 0x13, + 0xbf, 0x6a, 0x72, 0x3d, 0x1c, 0x99, 0xcb, 0x70, 0x01, 0xb3, 0x9b, 0xcc, + 0xdf, 0x41, 0x01, 0xda, 0x4b, 0xa2, 0x66, 0x4a, 0x0c, 0xc8, 0x95, 0x78, + 0xb0, 0xb2, 0x54, 0x5d, 0x0b, 0x9f, 0xbe, 0xb1, 0x36, 0xe0, 0xc2, 0xd0, + 0x2f, 0xbc, 0x43, 0xc3, 0x81, 0xce, 0xdf, 0x3f, 0x1f, 0xbe, 0xb3, 0xf9, + 0xb3, 0x0e, 0x7b, 0x44, 0x4c, 0x35, 0xb9, 0xa6, 0xc2, 0xd2, 0x14, 0x0f, + 0x4e, 0x33, 0xc8, 0x35, 0x7b, 0x33, 0xd7, 0x9c, 0x00, 0xbd, 0x3d, 0xe4, + 0x35, 0xcb, 0x76, 0x9a, 0xf5, 0x4a, 0xc0, 0x6f, 0x97, 0x08, 0xe2, 0x38, + 0x01, 0x64, 0xec, 0x48, 0x8f, 0xcf, 0xf7, 0x11, 0xeb, 0xc1, 0x95, 0x23, + 0xf6, 0xc0, 0x35, 0x04, 0xbe, 0x6e, 0x03, 0xff, 0xb0, 0x91, 0x7b, 0xe3, + 0x77, 0xe2, 0xce, 0xdf, 0x17, 0x16, 0x2c, 0x30, 0x07, 0xbf, 0xed, 0x57, + 0xe6, 0xd1, 0xc1, 0xdf, 0x51, 0xba, 0x86, 0x18, 0x05, 0xdd, 0xa5, 0xec, + 0x36, 0x36, 0x32, 0x23, 0x6b, 0x57, 0xce, 0x5c, 0x53, 0x47, 0xd2, 0xea, + 0x00, 0x1a, 0xbb, 0x05, 0x1c, 0xb7, 0xb2, 0x76, 0x61, 0x24, 0x3c, 0x34, + 0x70, 0xb3, 0x6a, 0xa3, 0x66, 0xa8, 0x65, 0xbd, 0xb5, 0xe0, 0x18, 0x45, + 0xea, 0xf2, 0x15, 0x76, 0xa0, 0x2f, 0xa8, 0x75, 0x8e, 0xcf, 0xc3, 0x22, + 0x69, 0xdd, 0x77, 0xec, 0x47, 0x73, 0x2d, 0x9e, 0x77, 0xe8, 0x33, 0x4c, + 0x3d, 0x35, 0xd7, 0x0f, 0xf7, 0x68, 0xb3, 0x32, 0xa0, 0x1f, 0xbc, 0x04, + 0xff, 0xc8, 0x0c, 0xb5, 0x49, 0xb4, 0xe1, 0x92, 0xd1, 0xe1, 0x1e, 0xfa, + 0x76, 0x40, 0x3a, 0xfb, 0x41, 0x1c, 0xb5, 0x8d, 0x34, 0xdc, 0x95, 0xad, + 0xc5, 0xc0, 0x47, 0x01, 0x66, 0x4a, 0x17, 0x3e, 0xf3, 0x08, 0x1b, 0xe5, + 0x49, 0xa5, 0x6c, 0xf8, 0x0c, 0xc4, 0x9d, 0x7c, 0x44, 0x3c, 0xb8, 0xb1, + 0x24, 0x88, 0xe1, 0xba, 0xc2, 0x90, 0x06, 0x3d, 0x99, 0xf7, 0x69, 0x50, + 0xd6, 0x8a, 0x04, 0x3f, 0xf8, 0xfc, 0xbd, 0xb6, 0xc9, 0x49, 0x23, 0xc6, + 0x70, 0x8f, 0xa8, 0xe5, 0x61, 0xf0, 0xf6, 0xe0, 0xf5, 0xcd, 0x48, 0x2b, + 0x5f, 0x42, 0xb3, 0x40, 0x97, 0xe1, 0x1d, 0xe4, 0x21, 0x65, 0x26, 0xfe, + 0x55, 0x23, 0x45, 0x36, 0xac, 0x8a, 0x35, 0x01, 0x7c, 0x84, 0x54, 0x6c, + 0xac, 0x74, 0xc9, 0xb6, 0x63, 0xe1, 0x87, 0x06, 0xf7, 0x86, 0x24, 0xa2, + 0xea, 0x0a, 0x2a, 0x47, 0xa3, 0xed, 0x4a, 0x50, 0xf0, 0x65, 0x42, 0xad, + 0xcd, 0x90, 0xe3, 0x80, 0x1a, 0x04, 0xb0, 0x2e, 0x78, 0x83, 0xc6, 0x71, + 0x69, 0xcb, 0x5e, 0x99, 0x8e, 0xc2, 0xcc, 0xec, 0xaf, 0xe0, 0x4c, 0xdb, + 0x68, 0xbe, 0x3f, 0x90, 0xf6, 0x6d, 0x68, 0x2a, 0xd0, 0x63, 0x84, 0x44, + 0xc6, 0xca, 0x60, 0xf1, 0x5c, 0xa3, 0xc5, 0x16, 0x18, 0x11, 0x1e, 0x75, + 0x28, 0x38, 0x80, 0x8f, 0x2c, 0x7d, 0x72, 0x06, 0xbc, 0xbe, 0x26, 0xc8, + 0xb6, 0x13, 0x8a, 0x66, 0x7c, 0x3d, 0xd0, 0x34, 0x20, 0x52, 0x8b, 0x4c, + 0xfa, 0x1e, 0xa8, 0x74, 0x83, 0x57, 0xac, 0xa4, 0x1e, 0x3a, 0x24, 0x96, + 0x9e, 0x7e, 0x25, 0x7a, 0x0f, 0x3e, 0xc6, 0xde, 0x13, 0x8a, 0xfa, 0xa8, + 0x75, 0xcd, 0x23, 0x92, 0x3d, 0x68, 0x39, 0xe0, 0x12, 0x01, 0xe3, 0xd8, + 0x2f, 0x85, 0x87, 0xc7, 0xd8, 0xe8, 0xeb, 0xb2, 0x43, 0x63, 0x56, 0x57, + 0xd6, 0xc1, 0x9d, 0xbf, 0x53, 0x6b, 0x65, 0x08, 0x04, 0xb9, 0x69, 0xca, + 0x2e, 0xd7, 0x06, 0x81, 0x1b, 0x75, 0x8e, 0x9a, 0x71, 0xae, 0x39, 0xb5, + 0x65, 0xf4, 0xeb, 0x55, 0x42, 0x4c, 0x41, 0x6b, 0x1a, 0x6f, 0x57, 0x2d, + 0x83, 0x11, 0xcb, 0x5b, 0x0d, 0xb4, 0x69, 0xd0, 0x01, 0xf9, 0xf4, 0x92, + 0xf5, 0x16, 0x68, 0xb1, 0x24, 0x6a, 0x54, 0x57, 0x98, 0x68, 0x97, 0xb4, + 0xa7, 0x27, 0x9d, 0x44, 0xcf, 0xdc, 0x20, 0x4d, 0x9c, 0x79, 0x54, 0xca, + 0xdb, 0x5c, 0xb3, 0x94, 0xb6, 0xc8, 0x99, 0xf7, 0xc4, 0xcd, 0x7e, 0x81, + 0x36, 0x6a, 0x2a, 0x8c, 0xd5, 0x93, 0xb5, 0x2b, 0x40, 0xb3, 0x72, 0xf6, + 0x36, 0xef, 0x9c, 0xab, 0x4d, 0xc6, 0x55, 0x3c, 0xf3, 0x3d, 0xf4, 0x2f, + 0x81, 0x5f, 0xee, 0x25, 0x55, 0x5e, 0x01, 0x5a, 0x26, 0x44, 0x10, 0xc3, + 0xcc, 0x5e, 0x80, 0xde, 0x7e, 0xe6, 0x0c, 0x38, 0x81, 0xb9, 0x26, 0x85, + 0x3e, 0x0b, 0x2a, 0x42, 0xe9, 0xb3, 0x27, 0x68, 0x8e, 0x31, 0xae, 0x99, + 0x96, 0x7b, 0xc1, 0x39, 0xd4, 0xc1, 0xfb, 0x22, 0xc0, 0x44, 0x2a, 0xd2, + 0x5c, 0x5b, 0x8d, 0x91, 0x2e, 0xfe, 0x7f, 0xab, 0x39, 0x02, 0x52, 0x08, + 0xb8, 0x7e, 0x0f, 0x5e, 0x3d, 0xa4, 0x7c, 0xb5, 0x2b, 0x7c, 0xc0, 0xa9, + 0x06, 0x78, 0x8c, 0xaf, 0x5e, 0x0c, 0x7e, 0x46, 0x86, 0x1c, 0x98, 0xb1, + 0xba, 0x13, 0xde, 0xbc, 0x63, 0x43, 0xdd, 0x19, 0x6f, 0x5e, 0xb1, 0x36, + 0xd7, 0xc0, 0x53, 0x14, 0xbb, 0x44, 0x15, 0xf3, 0xf7, 0x2a, 0xea, 0x36, + 0x78, 0x6b, 0xf9, 0x0e, 0xeb, 0xed, 0xbc, 0x47, 0xbe, 0x3e, 0xfa, 0x15, + 0xc7, 0xca, 0x06, 0x1f, 0xfd, 0x7f, 0x79, 0x6f, 0x77, 0x17, 0xd5, 0x8d, + 0xf9, 0x8f, 0xf5, 0x22, 0x12, 0x3d, 0x7a, 0x86, 0xad, 0xec, 0xff, 0xbc, + 0x7a, 0x11, 0x4a, 0xfd, 0x47, 0xbd, 0x08, 0x64, 0x53, 0x4f, 0x7b, 0xfe, + 0x69, 0xf5, 0x22, 0xe6, 0xbf, 0x0d, 0xda, 0x82, 0xc6, 0x0a, 0xfe, 0x68, + 0x9f, 0x50, 0x47, 0x40, 0x3c, 0x22, 0xe7, 0x4f, 0x6a, 0x7f, 0x2f, 0xd3, + 0x7e, 0xf3, 0x0f, 0x7b, 0xab, 0x6f, 0xd4, 0x51, 0x6f, 0xe0, 0xc1, 0x3f, + 0x6b, 0xfc, 0x9d, 0xa2, 0x23, 0x7f, 0xaf, 0xd5, 0x12, 0x81, 0x7e, 0xa5, + 0x9b, 0x55, 0x15, 0x69, 0xc3, 0x9f, 0x55, 0x2f, 0x04, 0x3c, 0x3c, 0xa9, + 0xa3, 0xbf, 0xc7, 0xad, 0x7b, 0xcb, 0xea, 0xd3, 0x5b, 0xfc, 0x69, 0xb5, + 0x6a, 0xd0, 0x14, 0x71, 0xbc, 0x8d, 0xb8, 0xfc, 0xbd, 0xfd, 0xc6, 0x7d, + 0x96, 0xf1, 0x70, 0x28, 0xfe, 0xa4, 0xfe, 0x17, 0xa6, 0x6b, 0x26, 0x54, + 0xfe, 0x47, 0x5d, 0x03, 0xdd, 0x7d, 0x86, 0x1d, 0xbe, 0x96, 0xf4, 0x4f, + 0x1a, 0x7f, 0x77, 0x50, 0xe1, 0xbc, 0xaf, 0xfd, 0xf7, 0xfe, 0x3b, 0xc4, + 0xfb, 0x7a, 0xee, 0xcc, 0x68, 0x7e, 0x66, 0xf1, 0xfc, 0xbf, 0xb3, 0x7e, + 0x04, 0x77, 0x11, 0x2d, 0x5d, 0xf1, 0x8d, 0x93, 0x40, 0xe5, 0x06, 0xca, + 0xe8, 0xdf, 0xc7, 0xbb, 0x8f, 0x59, 0xc2, 0x50, 0xd9, 0x0e, 0x3b, 0x01, + 0xce, 0xfc, 0x3b, 0xd1, 0xce, 0xfb, 0xf5, 0xe5, 0x8f, 0x1a, 0x23, 0xeb, + 0xb3, 0xf4, 0xe7, 0xfb, 0x6a, 0xbf, 0xea, 0x85, 0xf4, 0x05, 0x47, 0x9d, + 0x88, 0x57, 0xaf, 0xa2, 0x2d, 0xff, 0xd3, 0x31, 0xe5, 0x5c, 0xa3, 0x2b, + 0x0d, 0x7f, 0xd5, 0x34, 0xf9, 0x55, 0xa7, 0xc4, 0x07, 0xbd, 0x0c, 0xde, + 0xe8, 0x3f, 0xd7, 0x34, 0xb1, 0xf5, 0xb2, 0xb3, 0x9f, 0xa5, 0xf1, 0x7b, + 0xed, 0x93, 0x8c, 0x5b, 0xd6, 0xdf, 0xeb, 0x94, 0x44, 0xf0, 0x13, 0x69, + 0x3b, 0xf8, 0xf9, 0xef, 0x7f, 0xf9, 0xed, 0xe3, 0xbf, 0xff, 0xd3, 0x6f, + 0xf0, 0xdf, 0xbf, 0xdd, 0x87, 0xb7, 0x3a, 0xfe, 0xfe, 0xfb, 0x6f, 0xbf, + 0x7d, 0xfc, 0xb7, 0xff, 0xf6, 0xdb, 0x33, 0xbf, 0x9d, 0xf3, 0x42, 0x1d, + 0xef, 0xbf, 0xfd, 0xb7, 0x8f, 0x7f, 0xfa, 0x97, 0xdb, 0xe5, 0x32, 0xfc, + 0xf6, 0xbf, 0xc3, 0xdb, 0x7f, 0xfd, 0x6b, 0x79, 0x51, 0x97, 0xdb, 0x5f, + 0x0b, 0x95, 0x97, 0xcd, 0xbf, 0xfc, 0xf6, 0xeb, 0xc7, 0xbf, 0xfe, 0xc3, + 0xeb, 0xe5, 0x45, 0xfe, 0xf5, 0x74, 0xcb, 0xdf, 0x7f, 0x55, 0xe7, 0x53, + 0x35, 0xfc, 0xcb, 0x6f, 0xff, 0x9b, 0xfe, 0x35, 0xff, 0xf9, 0xaf, 0x0e, + 0x99, 0xdf, 0xd4, 0xe6, 0x3f, 0xff, 0xf8, 0x66, 0x7b, 0xee, 0x8e, 0x7f, + 0xbd, 0x57, 0xf9, 0xcf, 0xe1, 0xef, 0x67, 0x30, 0xb5, 0xf9, 0xcf, 0x7f, + 0x7d, 0x10, 0xbc, 0x6d, 0x68, 0xf3, 0x9f, 0x7f, 0x7c, 0xbb, 0xbf, 0x9d, + 0xdb, 0xfc, 0xf6, 0xfe, 0xeb, 0xed, 0x54, 0xe4, 0xff, 0xf2, 0x9b, 0xf6, + 0xcf, 0xbf, 0xe9, 0x2b, 0xe3, 0x9f, 0x7f, 0x33, 0x2c, 0xfd, 0xbf, 0x38, + 0x08, 0x4e, 0xa0, 0x69, 0xa5, 0xf6, 0xb3, 0xf8, 0xc7, 0xf7, 0xee, 0xe5, + 0xe5, 0xd6, 0x9f, 0x2f, 0x1d, 0xbc, 0xf9, 0xa5, 0xcd, 0x7f, 0xfe, 0xd3, + 0x9b, 0xc7, 0xf2, 0xd2, 0xc9, 0xff, 0x38, 0xbf, 0x61, 0x2e, 0xa0, 0x85, + 0x2f, 0x68, 0xc1, 0x5a, 0xfe, 0x97, 0xc7, 0xc1, 0x59, 0x8e, 0x79, 0xb1, + 0x34, 0xff, 0xd3, 0x20, 0xdc, 0xcf, 0xea, 0x79, 0x84, 0xb1, 0xa8, 0x72, + 0x75, 0x2e, 0x8f, 0x70, 0x48, 0x9e, 0xe7, 0xff, 0xf8, 0xfe, 0x2b, 0xbf, + 0x75, 0xe7, 0xee, 0xf4, 0x2f, 0xbf, 0xdd, 0x8e, 0xf2, 0x3f, 0xbd, 0x5e, + 0x9d, 0x07, 0x38, 0xfc, 0xd7, 0x8f, 0xdf, 0x5f, 0x7f, 0x9e, 0x8f, 0xaf, + 0xfe, 0x72, 0x1b, 0xfe, 0x5a, 0x1d, 0x7f, 0x1f, 0x30, 0x5d, 0xd3, 0xfe, + 0x9f, 0xff, 0xfa, 0x4f, 0xff, 0x34, 0x4f, 0xa3, 0x67, 0x6f, 0xfe, 0x17, + 0x73, 0xf6, 0x7f, 0x6a, 0xd6, 0xfe, 0x0f, 0xe6, 0xed, 0x7f, 0x39, 0x73, + 0xda, 0x4f, 0xf3, 0x4b, 0xfb, 0xf9, 0x3f, 0x3b, 0xec, 0xd7, 0xd4, 0x2e, + 0x0d, 0xf3, 0x7f, 0x38, 0xcf, 0x7f, 0x9e, 0x3d, 0xdd, 0xb2, 0xfe, 0x59, + 0xff, 0xfa, 0xfa, 0x67, 0xdd, 0xfa, 0x2f, 0x8f, 0x82, 0x73, 0xac, 0x8a, + 0xa2, 0xfc, 0x1f, 0x1b, 0xf9, 0x2f, 0x27, 0xf0, 0x7f, 0x3e, 0x85, 0xff, + 0xb3, 0x46, 0xfe, 0x71, 0x0a, 0xff, 0xcb, 0x66, 0xfe, 0x87, 0x49, 0xfc, + 0x2f, 0x46, 0xf6, 0xef, 0xf3, 0xf8, 0x5f, 0xbd, 0xf7, 0x3f, 0xcc, 0x25, + 0x24, 0xda, 0xff, 0xe7, 0x9f, 0xfe, 0xe9, 0xe3, 0xbf, 0xfd, 0xa6, 0xf2, + 0xe1, 0xdc, 0xcd, 0xff, 0xfc, 0x7f, 0xff, 0xbc, 0x74, 0xc3, 0x5f, 0x7f, + 0xe6, 0xe5, 0xf1, 0x57, 0xf2, 0xfd, 0xf1, 0xaf, 0xf6, 0xac, 0xe0, 0x8a, + 0xfe, 0x72, 0xb8, 0xcf, 0xb5, 0x23, 0xfe, 0xf2, 0xaf, 0x7f, 0x7b, 0xe3, + 0x57, 0x0a, 0xff, 0xcb, 0x6f, 0xdd, 0xe5, 0xd6, 0xe6, 0xea, 0xef, 0xaf, + 0xbe, 0xfe, 0x88, 0x0a, 0x53, 0xd3, 0xfe, 0xfe, 0x9a, 0x3c, 0xdf, 0x7b, + 0x35, 0x4f, 0x24, 0x9c, 0xa1, 0x9f, 0x5f, 0xbd, 0xdf, 0xca, 0x7f, 0xf9, + 0xed, 0x71, 0x53, 0xff, 0x2f, 0x99, 0x0f, 0xf9, 0xbf, 0xcc, 0xc7, 0x7c, + 0xbc, 0x2e, 0x3f, 0x7f, 0x1a, 0xff, 0x5a, 0xe4, 0xf7, 0xe3, 0x72, 0xf1, + 0xcf, 0x52, 0x5b, 0x79, 0xe1, 0x69, 0x6d, 0xaf, 0xe7, 0xff, 0xdc, 0x98, + 0xae, 0xed, 0xf0, 0xd7, 0xaf, 0xe7, 0x7d, 0x04, 0xff, 0x8e, 0x3a, 0xf8, + 0xdf, 0xfa, 0x7f, 0xf5, 0x9f, 0x77, 0x71, 0xef, 0x9e, 0xb5, 0x7a, 0xf9, + 0x5b, 0xac, 0x7d, 0x6b, 0x15, 0x8f, 0xd8, 0x0e, 0xd9, 0x6b, 0x71, 0xfa, + 0xd6, 0x31, 0x8d, 0x18, 0xf1, 0x82, 0xf1, 0xb2, 0xae, 0xbc, 0xc5, 0xf3, + 0xdb, 0x76, 0xb7, 0x9b, 0xe7, 0x7a, 0x61, 0xb8, 0x5f, 0xfb, 0x93, 0x7e, + 0x59, 0x87, 0xf8, 0x45, 0xd7, 0x49, 0xb6, 0x09, 0xd6, 0x07, 0x3f, 0x5c, + 0x47, 0x27, 0x3b, 0x23, 0x0b, 0xfb, 0xbd, 0x2e, 0xae, 0x5d, 0xa3, 0x17, + 0x7e, 0x79, 0x7c, 0xd8, 0x46, 0xf6, 0xb4, 0xf7, 0x1f, 0x48, 0xa3, 0xa4, + 0xb0, 0xdf, 0xd1, 0x71, 0x9d, 0x27, 0xbb, 0xf0, 0x72, 0xb9, 0x26, 0xdf, + 0xd6, 0x87, 0xb6, 0x0a, 0x92, 0x36, 0xba, 0x9c, 0x13, 0xb0, 0x31, 0x68, + 0x60, 0xc3, 0xab, 0x8c, 0x37, 0xf7, 0xcf, 0x5b, 0xf9, 0x65, 0xe2, 0xe9, + 0xfb, 0xd8, 0xe2, 0xed, 0x42, 0x38, 0x91, 0xba, 0x4f, 0xeb, 0xcb, 0x3e, + 0xe5, 0xe9, 0x76, 0x7b, 0xbe, 0x44, 0x96, 0x56, 0xdd, 0x22, 0x6f, 0x1d, + 0x1d, 0xa4, 0xf3, 0xea, 0xba, 0x6d, 0x30, 0xa6, 0xeb, 0x0c, 0xb9, 0x2e, + 0xca, 0x75, 0xe3, 0x42, 0x71, 0xf5, 0x94, 0x07, 0xbf, 0x5f, 0x17, 0x1f, + 0x71, 0xe2, 0xbd, 0x4a, 0x30, 0x9e, 0xf5, 0x0f, 0xb1, 0x5f, 0xd8, 0x47, + 0xd1, 0x86, 0x76, 0xf8, 0xfe, 0x41, 0x99, 0xb2, 0x9d, 0x1f, 0x53, 0x88, + 0x17, 0x3b, 0x73, 0xe5, 0x89, 0xca, 0x19, 0xc6, 0x8b, 0xbd, 0x57, 0x66, + 0xf8, 0xd9, 0xbd, 0xcb, 0xbc, 0x9d, 0x6e, 0xb5, 0xfd, 0x73, 0x91, 0x4e, + 0xe4, 0xe2, 0x9e, 0xe6, 0xaf, 0xe8, 0x0d, 0xdf, 0xfa, 0xe3, 0xbb, 0x74, + 0xc2, 0x30, 0x48, 0x46, 0x55, 0x7e, 0x2d, 0x2c, 0xe2, 0xeb, 0xda, 0xed, + 0xd3, 0x70, 0x9e, 0xab, 0xd4, 0x47, 0x27, 0xe3, 0x47, 0x6d, 0x8d, 0xab, + 0xeb, 0x8a, 0xff, 0xf4, 0xf2, 0xc5, 0x67, 0x5d, 0xc7, 0xa1, 0xb9, 0x29, + 0x6b, 0xeb, 0xf6, 0xf9, 0xf5, 0x31, 0x95, 0x1f, 0xc3, 0x2b, 0xbd, 0x2e, + 0x73, 0xf3, 0x9e, 0xa0, 0xf7, 0x56, 0x3b, 0x62, 0x97, 0x6b, 0xb6, 0x71, + 0xaf, 0x7c, 0xe5, 0x2e, 0x6b, 0x1b, 0xf4, 0xba, 0x55, 0xca, 0x8b, 0xb6, + 0xce, 0xef, 0xbb, 0xb6, 0x1a, 0x96, 0x7b, 0xad, 0x6a, 0x6f, 0x87, 0x76, + 0x75, 0x6a, 0xe2, 0x75, 0x74, 0xa9, 0xb2, 0x7b, 0x64, 0xe6, 0x97, 0x64, + 0x4b, 0x2e, 0x34, 0x13, 0x67, 0x26, 0xbc, 0x3b, 0xd9, 0xaf, 0xb2, 0x27, + 0xfd, 0x14, 0x60, 0xeb, 0xe3, 0xdb, 0x6e, 0x25, 0xa3, 0x45, 0x79, 0xc4, + 0xa1, 0xfd, 0x4c, 0x97, 0x9f, 0xd3, 0xe6, 0x3b, 0xf9, 0x58, 0x7c, 0x5d, + 0xc9, 0x26, 0x59, 0x5d, 0xce, 0xeb, 0xd8, 0x3e, 0xd5, 0xad, 0xa6, 0xed, + 0x3e, 0x91, 0xa3, 0x33, 0x64, 0xe0, 0x0c, 0xed, 0xbf, 0x36, 0xbb, 0xd7, + 0xfd, 0xf0, 0x12, 0xd5, 0x99, 0xbf, 0x92, 0x35, 0x3a, 0x2e, 0x25, 0xfe, + 0xf9, 0xf3, 0xb3, 0xd4, 0xd3, 0x35, 0x7a, 0x2d, 0x4f, 0xdf, 0x76, 0x47, + 0xc3, 0x40, 0x5d, 0xbb, 0x58, 0xb0, 0x4d, 0x76, 0xfa, 0x26, 0x4d, 0x26, + 0xa8, 0x79, 0xbd, 0x79, 0x51, 0xd8, 0x7a, 0x3c, 0xda, 0x67, 0x21, 0x5d, + 0x7f, 0xb1, 0xc3, 0x8f, 0xad, 0x77, 0xda, 0x7d, 0x7e, 0x14, 0xbe, 0xfb, + 0xf9, 0x91, 0xfc, 0x5c, 0xa1, 0xf3, 0x0f, 0x8d, 0x64, 0xcf, 0x9d, 0xf3, + 0xad, 0x97, 0x2b, 0xb7, 0x23, 0x6e, 0x23, 0x3a, 0xf1, 0xfd, 0x53, 0xbe, + 0xaf, 0x1f, 0xd7, 0x66, 0x77, 0x9a, 0x0e, 0xfc, 0xc6, 0xcf, 0x3c, 0x29, + 0x35, 0x2b, 0x18, 0x16, 0xb5, 0xbd, 0x6a, 0xa8, 0x57, 0xb6, 0xef, 0x6c, + 0x21, 0xbf, 0xef, 0xdb, 0x4d, 0x61, 0x9a, 0xf9, 0x91, 0x68, 0x96, 0xb2, + 0x56, 0x3f, 0xbc, 0xd4, 0xca, 0x37, 0x8b, 0x8d, 0x15, 0x5d, 0x6c, 0xf0, + 0xaf, 0xc3, 0x7d, 0x99, 0x2c, 0x8b, 0x15, 0xf8, 0x5d, 0x36, 0x95, 0xdf, + 0xf1, 0x19, 0x67, 0xfa, 0xf7, 0xf0, 0xd3, 0x5f, 0xac, 0x71, 0xbc, 0x6f, + 0x1d, 0xd3, 0xfb, 0xe8, 0x76, 0xee, 0xa9, 0x3c, 0x5c, 0x5a, 0x3b, 0x76, + 0x16, 0x27, 0xf4, 0x18, 0x83, 0xd3, 0xb8, 0xfe, 0x1e, 0x3f, 0xde, 0xe6, + 0x7a, 0x7b, 0x7d, 0x67, 0x7c, 0xa7, 0x12, 0xb3, 0x3e, 0x3f, 0x46, 0xba, + 0x4d, 0xd6, 0x87, 0xfa, 0xe7, 0x23, 0x22, 0xd6, 0xc1, 0xb2, 0x7f, 0x1c, + 0x4d, 0x63, 0xfb, 0x6d, 0x17, 0x23, 0x98, 0xe4, 0xdd, 0x17, 0xfa, 0xdc, + 0x3e, 0x36, 0xb7, 0xe7, 0xa8, 0xad, 0x03, 0xbb, 0xb7, 0x92, 0x63, 0x18, + 0xa0, 0x36, 0x7d, 0x1b, 0x83, 0xf1, 0x69, 0x8e, 0x6b, 0xe2, 0x7c, 0xee, + 0x84, 0x73, 0xcf, 0x87, 0xf8, 0xe3, 0xaa, 0x6e, 0x3f, 0xa7, 0x87, 0x46, + 0x6d, 0xf6, 0xd4, 0xef, 0x89, 0xbd, 0x6d, 0xa6, 0x83, 0xb9, 0xb5, 0xe2, + 0x75, 0x83, 0xca, 0xe5, 0xb7, 0x5e, 0x9f, 0xba, 0xfa, 0xa4, 0x35, 0x4d, + 0x65, 0xed, 0xec, 0x65, 0xfa, 0xad, 0x9c, 0x75, 0x73, 0x59, 0xaf, 0x37, + 0x3c, 0x7d, 0xbe, 0x7f, 0xdc, 0xf2, 0xcd, 0x21, 0x4f, 0x57, 0xcf, 0xeb, + 0xd0, 0xfe, 0x20, 0xe3, 0x9a, 0x1f, 0x6d, 0x57, 0xdb, 0xbf, 0x5f, 0x92, + 0x7d, 0x28, 0x27, 0x1c, 0xa7, 0x67, 0x75, 0x6c, 0xf5, 0xc1, 0xc7, 0xe8, + 0x6d, 0xa2, 0x25, 0x7b, 0x23, 0xdd, 0x37, 0x57, 0xe6, 0x50, 0xdc, 0xd7, + 0xdb, 0x08, 0xed, 0xb5, 0x5b, 0xe9, 0xa2, 0xc8, 0xde, 0xfa, 0x27, 0x4c, + 0x79, 0x63, 0xf7, 0x6d, 0x29, 0xca, 0xe8, 0xd2, 0x7c, 0xa5, 0x97, 0xb3, + 0x08, 0x96, 0xc7, 0xcf, 0xe7, 0x6e, 0x73, 0x79, 0x2c, 0xe9, 0x23, 0x92, + 0x11, 0x7a, 0x9f, 0x5b, 0x77, 0xb3, 0x54, 0xef, 0xc9, 0x35, 0xbb, 0x49, + 0x1d, 0x97, 0xcb, 0x61, 0xa2, 0x37, 0xf5, 0xf6, 0xb9, 0x1f, 0xab, 0xf1, + 0xc3, 0xd1, 0x3e, 0x53, 0xbd, 0xfb, 0xf8, 0xd2, 0x1a, 0xe4, 0x28, 0x8d, + 0xaf, 0xee, 0xc9, 0x67, 0x65, 0xb8, 0xdb, 0xaf, 0xe0, 0x3c, 0x7d, 0x7f, + 0xfe, 0xb4, 0x34, 0x33, 0xd6, 0x8b, 0x40, 0x1b, 0xac, 0x24, 0xaf, 0xd6, + 0xfb, 0x2a, 0x8c, 0x03, 0xa4, 0xdd, 0x6e, 0xee, 0x6e, 0x33, 0x6d, 0x2e, + 0xb7, 0xc7, 0x18, 0x6d, 0xb4, 0x31, 0x1f, 0x6f, 0xd6, 0xe3, 0xe7, 0x73, + 0xdc, 0x35, 0x51, 0x15, 0x2a, 0x7f, 0xc0, 0xd7, 0xab, 0xb5, 0x2e, 0x56, + 0xdd, 0x8d, 0x6d, 0xf3, 0x1d, 0x4d, 0xc3, 0x5e, 0x20, 0xc7, 0xf2, 0x37, + 0xdf, 0x17, 0xf9, 0x7c, 0x72, 0x93, 0x4c, 0x21, 0x1d, 0xb9, 0x2d, 0x02, + 0xe3, 0xc7, 0x87, 0x96, 0xb5, 0x6f, 0x5d, 0xfb, 0x62, 0x7c, 0xb1, 0xdd, + 0xa5, 0x7e, 0xf4, 0xf3, 0xc7, 0xf5, 0x74, 0xb0, 0xdd, 0x2f, 0xe3, 0x67, + 0x1a, 0x6f, 0xd7, 0xd4, 0x59, 0x3f, 0x37, 0xa7, 0x9f, 0xeb, 0xc5, 0x3e, + 0x0f, 0xc6, 0xed, 0xfa, 0xdb, 0xdf, 0x7a, 0xdf, 0x49, 0xb3, 0x7d, 0xdd, + 0x03, 0xaf, 0x8c, 0xc3, 0xae, 0x79, 0x8b, 0x47, 0x4f, 0xa7, 0xef, 0x8f, + 0x8f, 0xed, 0xeb, 0xe4, 0x9d, 0xd6, 0xa1, 0xbe, 0x71, 0x23, 0x74, 0x40, + 0xd7, 0x73, 0x56, 0x75, 0xcb, 0xf5, 0x76, 0x33, 0x79, 0xf7, 0xb5, 0xa7, + 0x6d, 0x7e, 0x7e, 0x2d, 0xaa, 0x7e, 0x6c, 0x2b, 0xa6, 0xcc, 0xb4, 0x58, + 0x85, 0xee, 0xe7, 0x74, 0xbf, 0x2f, 0xf7, 0x4d, 0xbd, 0xae, 0x58, 0x4e, + 0x49, 0xcc, 0xf5, 0x7a, 0xe9, 0x38, 0xfe, 0x7a, 0xbd, 0x5f, 0x67, 0xcd, + 0x7d, 0x6f, 0x7c, 0xba, 0xb7, 0x63, 0x9d, 0xbc, 0x6e, 0xb7, 0xf6, 0x75, + 0x5b, 0xdb, 0x8b, 0xcd, 0xda, 0x89, 0xde, 0xe1, 0xfb, 0xb6, 0x7f, 0xeb, + 0x95, 0x7f, 0x0a, 0x4f, 0x43, 0x54, 0x67, 0x64, 0x3d, 0xde, 0x9a, 0x24, + 0x5e, 0xbe, 0xcd, 0x55, 0x95, 0x78, 0x91, 0xf9, 0x78, 0xa4, 0xe2, 0x71, + 0x66, 0xce, 0x6b, 0xff, 0xd4, 0x17, 0xf1, 0xe1, 0x67, 0x93, 0xb9, 0x65, + 0xb9, 0xd8, 0xfd, 0xf0, 0xb7, 0xc2, 0xbc, 0xb9, 0xd6, 0xb0, 0xcf, 0x47, + 0x5d, 0x4a, 0xe9, 0xde, 0x16, 0xad, 0x51, 0xa4, 0x6c, 0xd5, 0x23, 0xcf, + 0x63, 0xba, 0x8b, 0x75, 0x99, 0x9f, 0x57, 0x6d, 0xf0, 0x23, 0x23, 0x8f, + 0xef, 0xe7, 0x39, 0x5c, 0x1a, 0x98, 0xad, 0x8e, 0xe3, 0x47, 0x6f, 0xd4, + 0x9f, 0x85, 0xfe, 0x31, 0x3c, 0x9e, 0x3f, 0x7e, 0x3c, 0x4d, 0xb9, 0xfd, + 0x28, 0x48, 0x94, 0x85, 0x59, 0x74, 0x00, 0x31, 0xb8, 0x5f, 0xd5, 0x25, + 0x69, 0x7e, 0x6c, 0xa2, 0xe6, 0x81, 0x49, 0x79, 0x76, 0x9a, 0x31, 0x38, + 0x16, 0x9a, 0x69, 0xab, 0x57, 0xf6, 0x38, 0xd4, 0x68, 0xe1, 0x7a, 0xaf, + 0x6f, 0x54, 0x06, 0xee, 0xa9, 0x13, 0x32, 0x44, 0x90, 0x93, 0x3b, 0x82, + 0xee, 0xf7, 0x4b, 0x2e, 0xfa, 0xa3, 0x1b, 0x8e, 0xd1, 0x89, 0xa1, 0x4b, + 0x45, 0x2f, 0xba, 0x7b, 0x78, 0xea, 0x8d, 0xd6, 0xb4, 0x99, 0x76, 0xb3, + 0x9a, 0xde, 0x7b, 0x14, 0x51, 0x6d, 0x6b, 0xd6, 0xf6, 0xa5, 0x7d, 0x3e, + 0x72, 0x6d, 0xda, 0x4e, 0xd6, 0xe9, 0x8b, 0x3e, 0x36, 0x6b, 0x97, 0x84, + 0x5b, 0xaf, 0x3b, 0x5e, 0xc7, 0x89, 0xbf, 0x1f, 0x7e, 0x85, 0x77, 0xa1, + 0xbb, 0x23, 0xa5, 0x7d, 0x09, 0xda, 0xbd, 0xe7, 0x79, 0x92, 0x26, 0xa3, + 0x1e, 0xde, 0xbe, 0x73, 0xff, 0xda, 0x37, 0x95, 0xcb, 0x8e, 0x8f, 0x67, + 0x34, 0x8c, 0xeb, 0xfb, 0x5a, 0xd4, 0x49, 0xad, 0x7f, 0x3a, 0xe3, 0x99, + 0x0e, 0x1e, 0x6d, 0xbe, 0x7f, 0x66, 0xe8, 0xe4, 0x57, 0x8b, 0x8d, 0x6b, + 0x77, 0x9a, 0x95, 0x7f, 0x5e, 0x5f, 0x4d, 0x0c, 0x79, 0x78, 0x5e, 0x9b, + 0x16, 0x3f, 0x19, 0x97, 0x70, 0xcb, 0x0f, 0x3f, 0xc6, 0xf1, 0x65, 0x23, + 0xac, 0x45, 0x7c, 0xfd, 0xf3, 0x44, 0x3e, 0xd6, 0xa7, 0x53, 0x73, 0x06, + 0xc1, 0xb3, 0x41, 0xda, 0xf1, 0xbb, 0x89, 0xdc, 0x26, 0x1a, 0x1b, 0x77, + 0x1b, 0x8a, 0x48, 0xc5, 0x07, 0x2f, 0xce, 0xec, 0x71, 0xb8, 0xbb, 0xf1, + 0x26, 0x0e, 0x04, 0x0a, 0xb6, 0x41, 0x8c, 0xbb, 0x84, 0xdb, 0xf1, 0xcf, + 0xb4, 0x53, 0x29, 0xea, 0xc5, 0x22, 0x03, 0xca, 0x19, 0x6e, 0xcb, 0x74, + 0xf3, 0x5a, 0x17, 0x9b, 0xe8, 0x72, 0xa7, 0x1e, 0xda, 0xa7, 0x45, 0xb6, + 0x58, 0xac, 0x6b, 0x4f, 0xbd, 0xf2, 0x32, 0xab, 0xb6, 0xeb, 0xc5, 0x67, + 0x6c, 0x52, 0x5c, 0x6b, 0x9f, 0x9b, 0xf8, 0x9a, 0x1c, 0xa6, 0x66, 0x83, + 0xbd, 0xf3, 0xf1, 0x1a, 0xde, 0xf3, 0xe8, 0x7e, 0xc3, 0x6b, 0x6f, 0x5f, + 0x7f, 0xb9, 0x8b, 0x75, 0x65, 0x56, 0xde, 0x3b, 0xae, 0xaf, 0xd1, 0xe6, + 0xbd, 0xad, 0xa3, 0xf7, 0x1d, 0x38, 0x73, 0x43, 0x17, 0x61, 0x15, 0x27, + 0xfa, 0xf7, 0x5a, 0x8c, 0xb7, 0x73, 0x97, 0x6b, 0x67, 0xeb, 0xbc, 0xb9, + 0xfa, 0xeb, 0x45, 0x7d, 0x21, 0xce, 0x2e, 0x8a, 0xa2, 0xb1, 0xdd, 0x20, + 0xb7, 0x09, 0x83, 0x45, 0x00, 0xff, 0xb9, 0xe5, 0xd9, 0x50, 0xf1, 0x87, + 0x75, 0x39, 0x3d, 0x7c, 0xf5, 0xde, 0xbf, 0x45, 0x14, 0x5f, 0x1e, 0x7a, + 0xaf, 0xe1, 0xcc, 0xb6, 0x2e, 0x5e, 0x63, 0x9d, 0x5e, 0x2f, 0xf1, 0xa5, + 0xbf, 0xf6, 0xa7, 0xc3, 0xd4, 0x4e, 0xa1, 0xf7, 0x23, 0x3c, 0x9b, 0x61, + 0x98, 0x7b, 0x9f, 0x1b, 0xa7, 0x5b, 0x6f, 0x63, 0xaf, 0x8e, 0x82, 0xe8, + 0x22, 0xca, 0x57, 0x50, 0xf8, 0xf7, 0xfd, 0xea, 0x5a, 0xe3, 0x9f, 0xbc, + 0x47, 0xeb, 0xf7, 0x9d, 0x7c, 0x59, 0x87, 0xb1, 0x0b, 0x77, 0xb9, 0xbc, + 0x04, 0xd5, 0xc7, 0xf2, 0x3b, 0x14, 0xd7, 0xdd, 0xe7, 0x6e, 0x17, 0xac, + 0xb6, 0xab, 0x9c, 0xe9, 0x0f, 0xf7, 0x33, 0xa2, 0x27, 0x74, 0xa8, 0x6d, + 0xe3, 0xfb, 0x87, 0x52, 0xe1, 0x3d, 0xa9, 0xcf, 0x3d, 0x79, 0xfc, 0x0c, + 0x3e, 0x53, 0x07, 0xe6, 0xb9, 0xd7, 0xf1, 0x57, 0x98, 0x5e, 0x9c, 0x3b, + 0xfe, 0x74, 0xe8, 0xca, 0x0f, 0x8d, 0xf3, 0xb2, 0xf7, 0x89, 0xbb, 0x30, + 0xbf, 0xd7, 0xe6, 0x5e, 0xe8, 0xc3, 0xb1, 0xcd, 0x5b, 0xdd, 0x14, 0xfe, + 0x8d, 0xe9, 0xe1, 0xca, 0x4a, 0x9d, 0xe6, 0x73, 0xd3, 0xb3, 0x7e, 0xe8, + 0x7f, 0xe0, 0xe1, 0x47, 0x88, 0x45, 0x1a, 0xe4, 0x72, 0x49, 0x22, 0xb1, + 0x9a, 0x96, 0xdd, 0x91, 0x3f, 0xaf, 0xf2, 0x10, 0xad, 0xbe, 0xcf, 0x9d, + 0xc2, 0xb5, 0xe3, 0xd6, 0xfe, 0x71, 0xf8, 0x79, 0xfb, 0x71, 0x67, 0xe4, + 0xfd, 0xc1, 0x70, 0xe5, 0x9b, 0xe9, 0xe8, 0x36, 0x97, 0x76, 0xd9, 0xf0, + 0x65, 0x59, 0x1e, 0x57, 0x89, 0x91, 0xee, 0x51, 0xe9, 0xec, 0x70, 0x3c, + 0xbe, 0xf0, 0x67, 0xc8, 0xf2, 0x3e, 0xd5, 0x7e, 0xc2, 0xaf, 0xcf, 0x2a, + 0x63, 0xc5, 0x74, 0xaf, 0xbf, 0xaa, 0x1f, 0xbb, 0xa3, 0x75, 0x3a, 0x0e, + 0xb7, 0xed, 0xdd, 0x5c, 0xe1, 0xc1, 0x10, 0xb9, 0xe6, 0x57, 0x48, 0xf7, + 0x04, 0x29, 0x3f, 0x0c, 0x75, 0xf0, 0xb4, 0x36, 0x4f, 0xcd, 0xfd, 0xcf, + 0xd6, 0xff, 0x59, 0xd5, 0x13, 0xfe, 0xba, 0x45, 0x15, 0xd1, 0x76, 0xfa, + 0x9b, 0x05, 0xf7, 0xaf, 0xaf, 0xfa, 0xa2, 0xd2, 0x14, 0x7f, 0x70, 0xe7, + 0x67, 0x7e, 0x68, 0x9c, 0xef, 0xa3, 0x78, 0xa6, 0xf5, 0xf1, 0x5a, 0xc8, + 0x38, 0x96, 0xa0, 0x1c, 0xaa, 0xf6, 0xea, 0xdc, 0xe5, 0x39, 0x7f, 0x2e, + 0xcf, 0xae, 0x96, 0xf3, 0xcb, 0xe9, 0x53, 0x3b, 0x2b, 0xfa, 0xfe, 0x91, + 0x9d, 0xac, 0x6c, 0xbd, 0x6d, 0x85, 0x3c, 0x7a, 0xe7, 0x7b, 0xd3, 0x15, + 0xe1, 0x61, 0xe1, 0x35, 0x79, 0xea, 0xe9, 0xc9, 0x93, 0x2b, 0xa7, 0xd8, + 0x14, 0xf5, 0xcf, 0x92, 0x5e, 0xeb, 0xc5, 0x37, 0xd9, 0xb2, 0xeb, 0xf8, + 0x24, 0xd7, 0x93, 0xce, 0x1e, 0xe6, 0x0a, 0xf0, 0x29, 0xc5, 0xd6, 0xed, + 0x52, 0x1d, 0xf2, 0xd5, 0xc7, 0xdb, 0xf7, 0xbf, 0x7f, 0x9e, 0x42, 0x9e, + 0xdd, 0x4e, 0xce, 0xfb, 0x4d, 0x9b, 0x9a, 0xb9, 0xe8, 0x2b, 0x25, 0x87, + 0xc4, 0x53, 0x8b, 0xfb, 0x43, 0xac, 0xba, 0xe3, 0x6d, 0xcb, 0xde, 0x71, + 0xb7, 0x3d, 0xd2, 0x75, 0x57, 0xa0, 0xc5, 0x3d, 0xc8, 0xe7, 0xef, 0x3b, + 0x1b, 0xfd, 0x13, 0xf7, 0x2f, 0x86, 0x47, 0x69, 0xe9, 0x6d, 0x44, 0x92, + 0x71, 0xd9, 0x6d, 0xdf, 0xf5, 0xab, 0x0a, 0x6a, 0x3f, 0xd8, 0x2a, 0xf7, + 0x71, 0xfd, 0x76, 0xf6, 0xaa, 0x59, 0x3e, 0xd6, 0x17, 0x6b, 0x57, 0xb2, + 0xb0, 0x12, 0x84, 0x8d, 0x80, 0x75, 0x8c, 0x6e, 0x92, 0xe3, 0x31, 0xdf, + 0x4e, 0x6d, 0xf8, 0xd5, 0x2c, 0x1d, 0x7f, 0x41, 0x93, 0x63, 0x8b, 0x5e, + 0x5b, 0x7a, 0xdd, 0xe6, 0xef, 0x6d, 0xb5, 0x7d, 0xae, 0x11, 0x6a, 0xb4, + 0x50, 0x5f, 0xd3, 0xe8, 0x16, 0xbf, 0x47, 0x94, 0xb4, 0xeb, 0x47, 0x3e, + 0xbd, 0x37, 0x6d, 0xc4, 0xdc, 0x45, 0xd7, 0xbb, 0xad, 0x3f, 0x6e, 0xcf, + 0x8a, 0x87, 0x6e, 0xbc, 0x7b, 0xcb, 0x86, 0xd9, 0xb5, 0x19, 0xf4, 0xcb, + 0x7b, 0x88, 0x9a, 0xdb, 0x79, 0x0a, 0xce, 0x38, 0x90, 0xf5, 0xcf, 0x2d, + 0x93, 0x56, 0x1f, 0x5b, 0x5f, 0xeb, 0xd3, 0xca, 0xdf, 0x2c, 0xe2, 0xec, + 0x2c, 0xb7, 0xef, 0xef, 0xd4, 0xca, 0xee, 0x34, 0x6e, 0xbc, 0x8b, 0xe8, + 0x9b, 0x33, 0xdf, 0x3c, 0x78, 0xb9, 0xef, 0x77, 0x37, 0x37, 0xd0, 0x6b, + 0x14, 0x0c, 0xae, 0xea, 0xab, 0xfb, 0x8f, 0xae, 0xf7, 0xbc, 0xf5, 0xd7, + 0x76, 0x5b, 0xad, 0x93, 0x45, 0x56, 0x95, 0x93, 0x0b, 0x30, 0xd3, 0x6e, + 0xd5, 0xd6, 0x3d, 0x67, 0xd9, 0xf9, 0xda, 0xf0, 0xf5, 0xa5, 0xc5, 0x07, + 0x77, 0x97, 0x2e, 0xa3, 0xb3, 0x4b, 0x3a, 0x78, 0xf1, 0x74, 0x13, 0xea, + 0xac, 0x91, 0xe7, 0x42, 0xea, 0x3f, 0x54, 0xec, 0x1e, 0xcb, 0xde, 0x97, + 0x9e, 0xd1, 0x5d, 0x46, 0x7a, 0xf2, 0xf3, 0x4f, 0x59, 0x90, 0x5e, 0xfb, + 0x2e, 0x2e, 0xf7, 0xb3, 0xff, 0x19, 0xfd, 0x08, 0xbb, 0xac, 0xf9, 0x71, + 0x7a, 0xeb, 0xc1, 0xa1, 0xde, 0x4e, 0xef, 0xd3, 0x8d, 0xdb, 0xdf, 0xc3, + 0xbc, 0x7a, 0xe6, 0x12, 0xdd, 0xbf, 0x86, 0x45, 0x1b, 0x9f, 0x13, 0x21, + 0x6f, 0xb5, 0xdc, 0x4e, 0x1f, 0x87, 0x63, 0x23, 0x2e, 0x7b, 0xad, 0x6d, + 0xac, 0x26, 0x7c, 0xb4, 0xc0, 0x80, 0x1f, 0xe1, 0xe9, 0x1d, 0xac, 0xb7, + 0x5e, 0xbc, 0x77, 0x02, 0x99, 0x25, 0x51, 0xaf, 0xd9, 0xaf, 0x2a, 0x5e, + 0x9e, 0xb0, 0x93, 0xfb, 0xf8, 0xd6, 0xb4, 0x65, 0x4a, 0x97, 0xde, 0xf0, + 0x60, 0xfd, 0xb5, 0x32, 0x9f, 0x03, 0x75, 0xb6, 0xf7, 0xe1, 0x7b, 0x8b, + 0xf4, 0xea, 0x8e, 0x43, 0x80, 0xfe, 0xdc, 0xb2, 0xa6, 0xdb, 0x0e, 0x9f, + 0x5f, 0x93, 0x0d, 0x11, 0x18, 0x7f, 0x46, 0xaf, 0x71, 0x18, 0xb7, 0xa2, + 0x3c, 0x44, 0x9f, 0xa7, 0x69, 0x51, 0x84, 0x2c, 0x74, 0x92, 0x38, 0x5f, + 0x23, 0x99, 0xd9, 0x89, 0x14, 0x5f, 0x8b, 0xb7, 0xa5, 0x69, 0xdf, 0xf5, + 0xb6, 0x7c, 0xe6, 0x8f, 0xd2, 0xfe, 0x2c, 0xdd, 0xec, 0xb3, 0x1a, 0xc2, + 0xdb, 0xfb, 0x66, 0x70, 0x9e, 0x77, 0x1f, 0xe3, 0x57, 0x6f, 0x34, 0xd9, + 0x67, 0x1e, 0x2d, 0xf9, 0x30, 0x11, 0xa7, 0x02, 0x1b, 0xf2, 0xe8, 0x0f, + 0x5e, 0xb3, 0xb9, 0x24, 0x9f, 0x86, 0x77, 0xce, 0xc4, 0x09, 0xc0, 0x09, + 0x34, 0xe5, 0x7a, 0x77, 0x7f, 0xd8, 0x3f, 0xe4, 0x60, 0xed, 0x69, 0xf7, + 0xf1, 0xf9, 0x73, 0x4a, 0x2f, 0xd7, 0xfd, 0xee, 0x7a, 0x2f, 0x78, 0xfd, + 0x5c, 0x6e, 0x2f, 0xaa, 0x69, 0xbf, 0xeb, 0xbb, 0xf9, 0x3d, 0x6d, 0xb4, + 0xe7, 0x7e, 0xb7, 0x04, 0xb0, 0x1b, 0x87, 0xc2, 0x98, 0x9e, 0xde, 0x36, + 0xae, 0xbc, 0xc6, 0x4e, 0xf0, 0xdd, 0x7e, 0x3d, 0xcf, 0xc1, 0xee, 0x9e, + 0xdf, 0xfa, 0xca, 0xc8, 0x3e, 0x6f, 0x95, 0xee, 0x95, 0xfd, 0xbc, 0x04, + 0xb2, 0xe3, 0x1c, 0xbd, 0x69, 0xab, 0x7c, 0xb7, 0x52, 0x91, 0x4b, 0x8d, + 0xdb, 0xf5, 0xc0, 0x16, 0x63, 0xbd, 0x25, 0xef, 0x6a, 0x74, 0x36, 0xb9, + 0xe9, 0x7d, 0x1e, 0xdd, 0x95, 0x76, 0x4f, 0xad, 0xc7, 0x66, 0x48, 0xc3, + 0x70, 0x50, 0x4b, 0x2f, 0x6c, 0x6e, 0x44, 0x6c, 0xbb, 0xc5, 0x02, 0x4f, + 0xd9, 0xf9, 0x89, 0x59, 0x51, 0x4a, 0xe7, 0xd6, 0x74, 0x83, 0xf5, 0x69, + 0xff, 0xd8, 0x1d, 0x8a, 0xc0, 0x3e, 0x3f, 0xc7, 0x43, 0x7b, 0xf0, 0x7e, + 0xec, 0xec, 0x5d, 0x79, 0xed, 0x67, 0x36, 0x10, 0x29, 0x33, 0xb5, 0x0d, + 0x8f, 0x9c, 0x14, 0xff, 0x24, 0xce, 0x3e, 0xf9, 0xb1, 0xf2, 0x07, 0xf1, + 0x8d, 0xcc, 0x43, 0x70, 0xbc, 0xe2, 0x9f, 0x91, 0x8a, 0x92, 0xe0, 0x63, + 0x51, 0x1c, 0x47, 0x31, 0xbe, 0x57, 0x89, 0xc7, 0xf1, 0x4f, 0xcb, 0xdc, + 0x2e, 0x3f, 0xf5, 0xd2, 0x1c, 0xaf, 0xf2, 0xfb, 0x79, 0xd3, 0x3f, 0x5f, + 0x79, 0xb1, 0xa9, 0xc0, 0xb4, 0xfa, 0x32, 0x89, 0xb9, 0x77, 0x43, 0xcb, + 0xf1, 0x81, 0x92, 0x9f, 0xcf, 0xb7, 0xb3, 0xf8, 0xc4, 0xa9, 0xf5, 0x63, + 0x89, 0xf7, 0xd7, 0xb8, 0xf9, 0x99, 0x1b, 0x0d, 0x2d, 0xbf, 0xfd, 0x93, + 0xe1, 0x1b, 0x51, 0xfa, 0x41, 0xbf, 0x89, 0x4a, 0xd6, 0xb8, 0x50, 0x9b, + 0xe7, 0x70, 0x40, 0xa7, 0x55, 0x52, 0x97, 0x6a, 0xc1, 0xc8, 0x39, 0x60, + 0xfe, 0xeb, 0xf9, 0xb1, 0x49, 0x7e, 0xee, 0xc3, 0xa4, 0x5e, 0x3d, 0x79, + 0x78, 0x2f, 0x8a, 0xe3, 0x46, 0xfb, 0xf8, 0x54, 0x6a, 0x97, 0x7d, 0x7d, + 0x68, 0xd3, 0x8f, 0xc7, 0xee, 0xc7, 0xcf, 0xc5, 0xe9, 0xf1, 0x81, 0x56, + 0x9e, 0xa7, 0x82, 0x6d, 0x27, 0xe3, 0x73, 0x94, 0x64, 0x74, 0xa4, 0xfe, + 0x36, 0xec, 0x4b, 0xdb, 0x32, 0xd4, 0x54, 0xd4, 0x0f, 0xd3, 0xaf, 0xd6, + 0xfe, 0x41, 0xb8, 0x1f, 0x40, 0xab, 0x4a, 0x5b, 0x3c, 0x4e, 0x8b, 0xe7, + 0x5a, 0x9c, 0x8d, 0x8f, 0x8f, 0x8f, 0xd1, 0x8a, 0xbc, 0xcf, 0x40, 0x5f, + 0xb3, 0xf5, 0xed, 0x15, 0xae, 0x0b, 0x34, 0x38, 0x6b, 0x9b, 0xbc, 0x36, + 0xe1, 0xf6, 0xf2, 0x79, 0x90, 0xfb, 0xac, 0x90, 0x3f, 0x3b, 0xc5, 0xbd, + 0x35, 0x04, 0xd3, 0x39, 0x3c, 0x7f, 0x4f, 0xcd, 0xce, 0x6e, 0xbf, 0xec, + 0x23, 0xbf, 0x57, 0x56, 0x9c, 0x7f, 0xef, 0x4e, 0x8b, 0x75, 0x34, 0x7d, + 0x26, 0x9a, 0x56, 0x0e, 0xb7, 0xcd, 0xa7, 0xba, 0x96, 0xeb, 0xc8, 0x01, + 0xf8, 0xd6, 0xae, 0x85, 0x85, 0x2e, 0x8f, 0xad, 0x7d, 0x44, 0xee, 0x29, + 0x5e, 0xdb, 0xaf, 0xc7, 0x4f, 0x77, 0xda, 0x2c, 0x78, 0xeb, 0xb1, 0xd4, + 0xd4, 0x9f, 0x6c, 0x99, 0xf2, 0xaf, 0x74, 0xbf, 0xed, 0x7b, 0xe2, 0x1d, + 0x80, 0xb1, 0xbb, 0xd5, 0xc9, 0xff, 0x44, 0x3b, 0x0f, 0xd3, 0xf0, 0x47, + 0x98, 0x8d, 0xcf, 0x62, 0x6e, 0xef, 0x44, 0xbb, 0x4d, 0xc7, 0x46, 0xfe, + 0x5d, 0xaf, 0xc7, 0x32, 0x67, 0xbb, 0xd4, 0xbe, 0x7c, 0xe3, 0xe5, 0xf7, + 0xe3, 0xf0, 0xf9, 0x71, 0xff, 0x60, 0x6b, 0xfd, 0xb4, 0x5b, 0x6f, 0x4e, + 0xb7, 0x2d, 0x22, 0xc5, 0x99, 0x78, 0xd0, 0xc7, 0x76, 0xb1, 0xbc, 0xa3, + 0xb5, 0xfd, 0xf1, 0x6c, 0xfc, 0xc3, 0x57, 0x6f, 0xba, 0x75, 0x7a, 0xa8, + 0xbf, 0x7e, 0x96, 0x91, 0xdf, 0xa7, 0x4c, 0xb7, 0x47, 0x67, 0xd8, 0x89, + 0xcd, 0x6d, 0xda, 0x7c, 0x6d, 0x8e, 0xe7, 0x60, 0xff, 0x71, 0x7c, 0xb4, + 0x93, 0xba, 0x74, 0x45, 0xea, 0xf3, 0xef, 0xe8, 0x83, 0x5e, 0x6f, 0x7b, + 0x09, 0x22, 0xe3, 0x3e, 0xb8, 0x47, 0x75, 0x63, 0x42, 0x7c, 0x66, 0xe2, + 0x76, 0x53, 0xcf, 0xe7, 0xf7, 0x25, 0x0e, 0xaa, 0x0c, 0xfb, 0x49, 0xb8, + 0x73, 0x77, 0xf1, 0x00, 0xba, 0x6d, 0xcf, 0x15, 0x98, 0xc4, 0x83, 0xff, + 0x5d, 0xbd, 0x2f, 0x5a, 0x5a, 0x4c, 0xd6, 0xd7, 0x0f, 0xa9, 0x54, 0xbb, + 0x32, 0x1f, 0x87, 0xdd, 0x86, 0xa4, 0x7d, 0xf5, 0x6a, 0xa2, 0x7c, 0x87, + 0xda, 0xc3, 0x05, 0x74, 0x3a, 0x46, 0xc7, 0xf2, 0xe3, 0x8b, 0xec, 0x40, + 0xec, 0xad, 0xfb, 0x78, 0x61, 0x95, 0x24, 0xbb, 0xb2, 0x9d, 0x93, 0x06, + 0xce, 0xf9, 0x63, 0x90, 0xee, 0x63, 0x25, 0xe9, 0xe2, 0xf3, 0x73, 0xf1, + 0xda, 0xa7, 0x5d, 0xdb, 0xbc, 0x78, 0x38, 0xf9, 0x7e, 0x5a, 0xa4, 0xcd, + 0x97, 0x06, 0x28, 0xd9, 0x12, 0x52, 0x7c, 0x2e, 0xae, 0x4b, 0x1f, 0x3f, + 0xfb, 0xeb, 0x45, 0xb4, 0x07, 0xce, 0x97, 0x02, 0x25, 0xd9, 0x29, 0x4b, + 0x6d, 0xcd, 0xb6, 0x2f, 0x1e, 0xae, 0xdc, 0x1f, 0xeb, 0x18, 0xed, 0xc5, + 0x7d, 0x14, 0x0b, 0xb4, 0x7b, 0x65, 0xda, 0x37, 0x3a, 0xe5, 0xe0, 0xdc, + 0x80, 0xae, 0x2d, 0x0d, 0xed, 0xc9, 0x5b, 0x2f, 0x5c, 0xff, 0xcb, 0x8e, + 0x4e, 0xd1, 0x0e, 0x9d, 0xfb, 0x8d, 0x72, 0x5d, 0xcf, 0x33, 0x40, 0x04, + 0xd1, 0x2c, 0x17, 0x20, 0x43, 0x9a, 0xcb, 0xcb, 0x8c, 0xb2, 0xde, 0x65, + 0x6f, 0x90, 0xd3, 0x1b, 0xf9, 0xf3, 0x94, 0xec, 0xfb, 0xa0, 0xdb, 0xd1, + 0xe5, 0x6d, 0x5d, 0x3b, 0xd7, 0x7e, 0x8c, 0xbf, 0x69, 0xfe, 0x73, 0x15, + 0x45, 0xcc, 0x5f, 0x13, 0x52, 0xbb, 0x45, 0xb6, 0x91, 0xe6, 0x57, 0xab, + 0xc5, 0x6b, 0x57, 0xa0, 0x35, 0x3d, 0xba, 0xfd, 0xcb, 0xf0, 0x1e, 0x3f, + 0xb8, 0x43, 0x72, 0xcd, 0x06, 0x58, 0x38, 0x7e, 0x71, 0x99, 0x7e, 0x7c, + 0x87, 0x6b, 0xe3, 0xb4, 0xf2, 0xee, 0xb7, 0x05, 0x48, 0xfb, 0xa7, 0x7f, + 0xf2, 0xb5, 0x72, 0x0a, 0x3f, 0xb6, 0x83, 0x02, 0x57, 0x7b, 0xaf, 0xdc, + 0x04, 0xb9, 0xde, 0xc9, 0x0d, 0xbb, 0xbe, 0xfa, 0x34, 0xcf, 0x37, 0x77, + 0xbf, 0xd8, 0x5d, 0x1e, 0xfe, 0x3d, 0xbe, 0x3f, 0x9b, 0xda, 0xb4, 0xa2, + 0x77, 0xe1, 0x45, 0xdf, 0xe5, 0x2b, 0x03, 0x7a, 0x22, 0xc3, 0xf8, 0x6d, + 0x5a, 0xf4, 0x03, 0xed, 0xde, 0x2a, 0x39, 0xaf, 0x0f, 0x34, 0xa0, 0x4f, + 0x7b, 0xf5, 0xa3, 0x0f, 0xf3, 0xe8, 0xe3, 0xf8, 0xf3, 0xe4, 0xfb, 0x83, + 0x85, 0x8a, 0x15, 0x61, 0xf6, 0x17, 0xd1, 0x37, 0x76, 0xbf, 0xbf, 0xf6, + 0xf4, 0x38, 0x80, 0xc2, 0x00, 0x4a, 0xda, 0xb1, 0xf1, 0x4d, 0x87, 0x6e, + 0x1f, 0x0d, 0x64, 0x8f, 0x0b, 0x7a, 0xb8, 0xde, 0xbf, 0x8e, 0x13, 0x3f, + 0x1c, 0xf9, 0xcf, 0xe3, 0x62, 0x65, 0xfa, 0xf7, 0x4f, 0x76, 0x38, 0x46, + 0xe7, 0x2f, 0xa7, 0x5d, 0xe6, 0xb4, 0x57, 0x80, 0x61, 0xb8, 0xba, 0xf7, + 0x05, 0x5a, 0xb1, 0x27, 0xcc, 0xc6, 0x56, 0x5f, 0x61, 0xff, 0x74, 0x5b, + 0xa1, 0xee, 0x8b, 0x6f, 0xe4, 0xb2, 0xdf, 0x3f, 0x55, 0xd5, 0xae, 0x5c, + 0x33, 0x7b, 0x6f, 0xdd, 0xe7, 0x5e, 0xe3, 0xdf, 0xe0, 0x69, 0xd5, 0xa1, + 0x7f, 0x68, 0xf8, 0x1b, 0x74, 0x73, 0xdc, 0x5b, 0x5f, 0xe0, 0xba, 0x87, + 0x87, 0xff, 0xf3, 0xfe, 0xf5, 0x2c, 0xaa, 0x83, 0xa1, 0xdf, 0x1f, 0xc3, + 0xcd, 0x6b, 0xb5, 0x9f, 0x45, 0x51, 0xd7, 0x5f, 0xcb, 0x64, 0x88, 0x40, + 0xad, 0x1c, 0x47, 0xa3, 0xab, 0x79, 0x19, 0xef, 0x4d, 0xd2, 0xb7, 0xfa, + 0x5e, 0x04, 0xe3, 0xe0, 0x79, 0xc8, 0x59, 0x8b, 0xef, 0xef, 0x9d, 0xab, + 0xf7, 0xb1, 0xb6, 0x55, 0xeb, 0xe2, 0xfa, 0x23, 0x7c, 0x2d, 0x7e, 0x3e, + 0x52, 0xbd, 0x14, 0x1f, 0x5f, 0xd3, 0x79, 0xf3, 0x60, 0xfb, 0xe8, 0xd0, + 0x1f, 0x20, 0x45, 0x82, 0x67, 0xd1, 0xbf, 0x85, 0x1e, 0xfd, 0x24, 0x1c, + 0xd0, 0xe2, 0x9c, 0x7f, 0x76, 0x5b, 0xdb, 0xe9, 0x8f, 0xe9, 0x55, 0x3d, + 0x56, 0xcb, 0xc3, 0x97, 0xff, 0x1a, 0xb7, 0x2e, 0xd5, 0x0d, 0x81, 0xeb, + 0x4f, 0x3b, 0x2a, 0xc2, 0x33, 0x49, 0x87, 0xf9, 0x8b, 0xbb, 0xb6, 0xe7, + 0xee, 0x55, 0xd0, 0x69, 0xfc, 0x6a, 0xb4, 0x0b, 0x0e, 0xeb, 0x05, 0x5b, + 0xef, 0x2f, 0xdb, 0xef, 0x14, 0xfc, 0xdf, 0xa2, 0x43, 0x46, 0x4c, 0x76, + 0x54, 0xbc, 0x41, 0x21, 0x53, 0x73, 0xa1, 0xef, 0x2f, 0xfb, 0xcf, 0xfb, + 0x71, 0xb3, 0x21, 0xb1, 0x1e, 0x93, 0x77, 0xc3, 0xfa, 0x4d, 0xbc, 0x63, + 0xef, 0x71, 0xa7, 0x3e, 0xd6, 0xdb, 0xc3, 0xd1, 0xce, 0xb5, 0xb8, 0xda, + 0x85, 0x44, 0x8b, 0x9e, 0x8f, 0x75, 0x06, 0x68, 0xb0, 0x6b, 0xbb, 0x38, + 0xbe, 0x5a, 0x27, 0x42, 0xbf, 0x5f, 0x95, 0xde, 0x2e, 0x95, 0x7e, 0x70, + 0xa2, 0x78, 0xd5, 0x6c, 0xfd, 0x5c, 0xcf, 0x1f, 0x69, 0xf8, 0x4a, 0xc9, + 0xd9, 0x37, 0xd2, 0x66, 0xe5, 0xb8, 0xa7, 0xab, 0xbe, 0xdb, 0xa2, 0xb6, + 0xc5, 0xbc, 0xbc, 0xe8, 0xa7, 0x27, 0x3b, 0x57, 0x28, 0xbc, 0xbc, 0xc4, + 0xb7, 0xec, 0xfb, 0x65, 0x9a, 0xf4, 0xee, 0x25, 0xb2, 0x7f, 0x98, 0xb7, + 0xf0, 0xcd, 0xc9, 0x57, 0xbd, 0xfc, 0x0e, 0xec, 0xcd, 0x93, 0x7e, 0xd0, + 0x21, 0x09, 0xd2, 0xa6, 0x4e, 0x51, 0xf4, 0x11, 0xfc, 0x7c, 0xc7, 0xa4, + 0xce, 0x42, 0x66, 0x88, 0xd1, 0x7a, 0xdf, 0xc6, 0x63, 0xaf, 0x3a, 0xbf, + 0x21, 0xea, 0xeb, 0xa8, 0xd7, 0xd5, 0x0f, 0xeb, 0xac, 0x4d, 0xaf, 0x5e, + 0xed, 0xef, 0xce, 0xa7, 0xfa, 0x5c, 0xec, 0x1a, 0xe1, 0x7f, 0xd0, 0x38, + 0x1a, 0xec, 0x67, 0x69, 0xb2, 0x63, 0xbc, 0x7e, 0xff, 0x78, 0xe4, 0x5f, + 0xe8, 0xe6, 0x7f, 0x26, 0x3f, 0x08, 0x7b, 0x7f, 0x14, 0x97, 0x53, 0xbe, + 0x63, 0x51, 0xf5, 0xd6, 0x65, 0xdc, 0x2f, 0x9b, 0xcf, 0xd0, 0xf8, 0x0c, + 0x1f, 0xf5, 0x68, 0xae, 0x3e, 0xfc, 0xab, 0xaa, 0xae, 0xa1, 0xb5, 0xb3, + 0xe4, 0xb6, 0xaa, 0xfa, 0x68, 0x1f, 0x59, 0x72, 0x5d, 0x16, 0xe0, 0x40, + 0xc3, 0xc8, 0x23, 0x64, 0xec, 0x99, 0x08, 0x92, 0xd7, 0xf9, 0x2e, 0x9c, + 0x86, 0x6d, 0x1b, 0x23, 0x50, 0xcf, 0x2c, 0xfb, 0xfe, 0x3e, 0xd4, 0xe1, + 0xe7, 0x0f, 0x15, 0x7e, 0x86, 0xd7, 0xcb, 0xb0, 0xaa, 0x8c, 0xf6, 0x26, + 0xf4, 0xeb, 0x65, 0x23, 0x2f, 0x3f, 0xf6, 0xf7, 0xf5, 0xea, 0x36, 0x79, + 0xdf, 0x51, 0x9c, 0xc9, 0x71, 0x72, 0xe2, 0xf2, 0xa3, 0xe1, 0xa3, 0xe9, + 0xcd, 0x5f, 0x79, 0xe6, 0x8d, 0xae, 0x7e, 0x6e, 0x4c, 0x93, 0x17, 0xd7, + 0x75, 0x71, 0xdb, 0xfb, 0x83, 0xb9, 0xef, 0x7b, 0x18, 0xd8, 0x1f, 0x67, + 0xe3, 0xe7, 0xd9, 0xdd, 0xbe, 0xde, 0xfd, 0x83, 0xec, 0xbe, 0x6a, 0xee, + 0x6b, 0xa9, 0x11, 0xbc, 0x11, 0x79, 0xdd, 0xcb, 0x5a, 0xe6, 0xfd, 0x97, + 0x61, 0xeb, 0xef, 0x26, 0xbf, 0x3e, 0x3d, 0xa5, 0x4e, 0x9d, 0xbf, 0x1f, + 0x62, 0xe3, 0x62, 0x09, 0xe3, 0x6b, 0x7d, 0x48, 0xa7, 0x82, 0x7f, 0xff, + 0xf8, 0x66, 0x32, 0x8e, 0x76, 0xde, 0x27, 0xa4, 0x47, 0xd0, 0x7f, 0x0d, + 0xeb, 0x43, 0xfb, 0xb1, 0xb1, 0xc9, 0xe9, 0xc7, 0x76, 0x20, 0x6b, 0xab, + 0x0a, 0xba, 0x26, 0xd9, 0xbb, 0x97, 0xe5, 0x4e, 0x1b, 0xce, 0xb2, 0xbc, + 0xe9, 0x5b, 0xdb, 0x46, 0xfb, 0xb0, 0xc1, 0x69, 0xf6, 0xf3, 0xbb, 0x54, + 0x59, 0x98, 0x5b, 0x69, 0x10, 0xaf, 0x83, 0x48, 0x1e, 0x50, 0x1a, 0x96, + 0x3f, 0x48, 0x02, 0xd8, 0xb9, 0xc7, 0x90, 0xf3, 0x9f, 0xeb, 0xe3, 0xb2, + 0x33, 0x7f, 0xae, 0xa9, 0xe6, 0x87, 0xbc, 0xd7, 0x8a, 0x57, 0x65, 0x7e, + 0xfc, 0x08, 0x3f, 0x9d, 0x27, 0xf9, 0xb4, 0x59, 0xff, 0x19, 0x72, 0x6b, + 0x38, 0x6e, 0xbe, 0x75, 0xd1, 0xd7, 0x9f, 0x6c, 0xbb, 0xef, 0xb5, 0xf6, + 0xa9, 0xf7, 0xa2, 0x3b, 0xbd, 0x37, 0x17, 0x15, 0xb0, 0x3e, 0x73, 0x4a, + 0x29, 0x5e, 0x51, 0x88, 0xb7, 0x17, 0xef, 0x41, 0x82, 0x83, 0x61, 0x6f, + 0xb0, 0xf8, 0xfa, 0x5c, 0xd8, 0xae, 0x11, 0xb2, 0xf6, 0x1c, 0x96, 0x64, + 0xb5, 0xc8, 0x0a, 0x95, 0xfd, 0xe8, 0xf2, 0x6e, 0x0a, 0x56, 0x09, 0x0e, + 0x3f, 0x07, 0x41, 0x3c, 0x5d, 0xa2, 0xaf, 0x6d, 0x62, 0x35, 0xb4, 0xd9, + 0xa3, 0x6f, 0xdf, 0x2f, 0x8b, 0x1f, 0x2a, 0xf8, 0x99, 0xbe, 0xf9, 0x4f, + 0xe9, 0xbe, 0xd1, 0xad, 0x13, 0x5a, 0xc6, 0xcb, 0x2f, 0x26, 0x1b, 0x37, + 0x1b, 0xb2, 0x67, 0x58, 0xd1, 0xf5, 0xfe, 0x6c, 0x2c, 0x2e, 0xc4, 0x4d, + 0x0b, 0xe7, 0x88, 0x0f, 0x51, 0xc6, 0xde, 0xaf, 0xab, 0xf3, 0x13, 0xf7, + 0xd8, 0xdd, 0xb3, 0x45, 0xca, 0x7d, 0xbd, 0xce, 0x57, 0x75, 0xf3, 0x51, + 0xe3, 0x4b, 0x66, 0xa4, 0x71, 0x14, 0x97, 0xaa, 0x51, 0xcb, 0x9b, 0xf3, + 0xf3, 0x72, 0x61, 0x5f, 0xc9, 0xfb, 0xfa, 0x6e, 0x84, 0x95, 0xfd, 0xbc, + 0x7e, 0xfd, 0x1c, 0x85, 0x7c, 0xd7, 0xf5, 0x77, 0xb2, 0x0e, 0xe4, 0xbe, + 0xdf, 0xca, 0x3c, 0x79, 0x7b, 0x9b, 0xc3, 0x72, 0x58, 0x2d, 0xb3, 0xbb, + 0x46, 0x9a, 0x29, 0x6f, 0x6e, 0x99, 0xfe, 0x9e, 0xbf, 0x49, 0x2d, 0xf4, + 0xd4, 0x75, 0x2a, 0x8a, 0xd2, 0xff, 0xf2, 0xce, 0x35, 0x96, 0xde, 0xee, + 0xfe, 0x76, 0x6c, 0x6e, 0xde, 0x3d, 0xfb, 0xa5, 0xb2, 0xc3, 0x05, 0xf7, + 0x51, 0xe8, 0xe4, 0x89, 0xdb, 0xf7, 0xee, 0x36, 0x79, 0x5d, 0xee, 0xd7, + 0xee, 0x56, 0xd7, 0x1f, 0x89, 0xb9, 0x60, 0xda, 0xfb, 0x79, 0x5a, 0x16, + 0xf7, 0x72, 0x99, 0xed, 0xf6, 0x3c, 0x2e, 0x5e, 0x63, 0xd9, 0x2d, 0x74, + 0x67, 0x34, 0x1e, 0xed, 0x7a, 0x91, 0x84, 0xa2, 0xde, 0xf9, 0x69, 0x97, + 0xaf, 0x85, 0x35, 0x84, 0x45, 0xe6, 0x05, 0x96, 0xb6, 0xb4, 0x8b, 0x0f, + 0x29, 0x69, 0xb5, 0x72, 0x22, 0x72, 0x27, 0x27, 0x6c, 0x9e, 0x93, 0xce, + 0x3f, 0xbe, 0xde, 0x9f, 0x15, 0x1a, 0xfd, 0x2b, 0x0a, 0x8f, 0x39, 0x5f, + 0x6c, 0xb4, 0x6b, 0x5f, 0xed, 0x77, 0x9d, 0x7a, 0xc8, 0x9f, 0x2c, 0x3a, + 0xf5, 0xc7, 0x2b, 0x5b, 0x9f, 0x5f, 0x41, 0xbe, 0xba, 0x6e, 0x5e, 0xfb, + 0x43, 0x7b, 0x9a, 0xa6, 0x2f, 0xac, 0x1c, 0xcd, 0x3b, 0x9f, 0x4f, 0xe5, + 0xf6, 0x67, 0xd8, 0xd3, 0xf5, 0xf5, 0x23, 0x3a, 0x4f, 0x4b, 0x4b, 0x7c, + 0xdc, 0xfd, 0xef, 0x45, 0x7d, 0x3f, 0xec, 0x5e, 0x67, 0x13, 0x05, 0x57, + 0xcd, 0x10, 0xe9, 0x65, 0x47, 0x06, 0x2e, 0xce, 0x08, 0x2f, 0x1c, 0xf4, + 0x4a, 0x0c, 0x11, 0xed, 0x73, 0xb3, 0x73, 0x8e, 0xe1, 0xca, 0xd1, 0x9e, + 0xe4, 0xd4, 0xdf, 0xa7, 0xcf, 0x4f, 0xf3, 0xb9, 0xed, 0xed, 0x93, 0x26, + 0xbe, 0x97, 0xad, 0x3a, 0x9e, 0xdd, 0x7c, 0x1b, 0x37, 0xbd, 0xc9, 0x42, + 0x0d, 0x0f, 0xf5, 0xd9, 0x95, 0x85, 0xea, 0x0f, 0xed, 0xbe, 0x4c, 0xbf, + 0xbf, 0x9b, 0x73, 0x65, 0x1e, 0x56, 0x8d, 0x59, 0x15, 0x8f, 0x5a, 0xdb, + 0x95, 0xb7, 0xf1, 0x21, 0xb2, 0xe7, 0x2d, 0x0b, 0x5a, 0xab, 0xd9, 0x39, + 0xd5, 0xf6, 0xee, 0x04, 0x9e, 0x31, 0x6d, 0x63, 0x54, 0x7d, 0x6e, 0x37, + 0xfb, 0xf0, 0x76, 0xb3, 0xf7, 0xa6, 0x7e, 0xab, 0x2d, 0x75, 0x3f, 0x5e, + 0xf3, 0xe7, 0x84, 0xec, 0x0f, 0x67, 0x07, 0x51, 0x71, 0x1c, 0xbd, 0xc7, + 0xeb, 0x03, 0xdf, 0xae, 0x2d, 0xb7, 0x57, 0xf9, 0xb6, 0xdb, 0x4c, 0xaf, + 0x1f, 0xc1, 0xeb, 0xfa, 0x8e, 0x5e, 0x52, 0x3b, 0x2c, 0x4e, 0x1f, 0x8f, + 0x89, 0xfc, 0x14, 0xaf, 0xe1, 0xc3, 0xd1, 0xc6, 0x93, 0x1c, 0x3f, 0xda, + 0xe8, 0xa3, 0x7b, 0xde, 0x97, 0xf5, 0xe3, 0xe5, 0x29, 0x51, 0xe0, 0x3a, + 0xfb, 0xb1, 0x4a, 0xd3, 0x73, 0x25, 0x3c, 0xef, 0x7b, 0xb8, 0xf1, 0xed, + 0xe1, 0x5c, 0x3d, 0xa8, 0x24, 0x32, 0xf7, 0x62, 0x75, 0xf3, 0xfb, 0x78, + 0x3b, 0xee, 0x57, 0xa0, 0xff, 0xa8, 0xf4, 0xc3, 0xfc, 0x2e, 0x5f, 0x84, + 0x9f, 0x9d, 0xdd, 0xc4, 0x8d, 0xd5, 0xdd, 0xf2, 0xf7, 0xee, 0xed, 0x73, + 0xf7, 0xc3, 0xc5, 0xd7, 0xc5, 0xe6, 0x96, 0xda, 0xbc, 0x65, 0x97, 0x38, + 0x34, 0x9f, 0x87, 0x77, 0xb1, 0x9d, 0x76, 0xf2, 0xe3, 0xe3, 0x36, 0x6d, + 0x07, 0x84, 0x0f, 0xc6, 0xb1, 0xdf, 0x81, 0xa8, 0x79, 0x5e, 0xd5, 0xb2, + 0xe6, 0x27, 0xe7, 0x3e, 0xee, 0xac, 0x7b, 0xfd, 0x7d, 0xdc, 0xbe, 0xb6, + 0xda, 0x90, 0xe9, 0xcf, 0x9b, 0x7c, 0x34, 0xd9, 0x6a, 0xfb, 0x4e, 0xa6, + 0x52, 0x2f, 0x8b, 0x36, 0x60, 0x14, 0xf5, 0xf2, 0x7c, 0xfa, 0x7a, 0x7c, + 0x4a, 0x26, 0xb4, 0xe7, 0x45, 0x4c, 0xf7, 0x71, 0xa5, 0x2f, 0x9d, 0x8f, + 0xf5, 0xfd, 0xd9, 0xa7, 0xef, 0xba, 0xa1, 0x7d, 0xcc, 0xc6, 0x84, 0x7d, + 0xad, 0x35, 0x29, 0xba, 0xb6, 0xb0, 0x1f, 0x9f, 0x1d, 0x91, 0xb4, 0x3d, + 0x0d, 0xda, 0x92, 0xa3, 0x93, 0x08, 0xb7, 0xc3, 0x52, 0x5b, 0x8e, 0x9f, + 0xef, 0xa3, 0xfb, 0xb8, 0x61, 0x8e, 0xb2, 0xad, 0x6d, 0x78, 0x09, 0x1e, + 0x7b, 0xf7, 0xcb, 0x22, 0xfb, 0x47, 0x91, 0xed, 0xa6, 0xe7, 0xfb, 0x23, + 0xc9, 0xf0, 0x67, 0x4b, 0x17, 0xc9, 0x4a, 0x3d, 0xf8, 0xa5, 0xd8, 0xd1, + 0x8f, 0xdc, 0x12, 0x5f, 0xc5, 0x58, 0xd5, 0xab, 0x62, 0xff, 0x6a, 0xc1, + 0x24, 0x4e, 0xd7, 0xdb, 0x5a, 0xbf, 0x7c, 0xfe, 0xfc, 0x79, 0xf4, 0x74, + 0x6f, 0x2b, 0x4f, 0x9f, 0xaf, 0x93, 0xd5, 0x75, 0x85, 0x1f, 0x75, 0xd7, + 0xec, 0xd3, 0x03, 0xc4, 0x0c, 0xf1, 0x58, 0x2e, 0xe6, 0xaf, 0x60, 0xfb, + 0x51, 0x9d, 0x76, 0xfa, 0xa7, 0xd9, 0x6b, 0x5a, 0xb6, 0xeb, 0xaa, 0xa6, + 0x56, 0xe6, 0xed, 0x44, 0x3e, 0xb6, 0xec, 0x62, 0x90, 0xf2, 0xf2, 0xfe, + 0x41, 0x5c, 0x6f, 0xfd, 0x23, 0xbe, 0x7b, 0xcf, 0x25, 0xb2, 0xeb, 0x6d, + 0xfc, 0xf9, 0xae, 0x3a, 0xf0, 0xb7, 0xc7, 0x69, 0x38, 0x93, 0x78, 0xf3, + 0xd5, 0x8f, 0x7a, 0x77, 0x1d, 0xb9, 0xfa, 0x68, 0x83, 0x4c, 0x3d, 0x97, + 0xa7, 0x7d, 0x47, 0xbc, 0xcd, 0xba, 0xb7, 0x6e, 0x9f, 0xad, 0x74, 0x33, + 0xfa, 0x78, 0x94, 0x79, 0xfa, 0x7a, 0xe6, 0xd7, 0xc0, 0x7d, 0x2f, 0xd6, + 0xcd, 0x57, 0xbe, 0xd3, 0x34, 0x8d, 0x47, 0xbc, 0xbd, 0xc4, 0x7b, 0x10, + 0x24, 0xc9, 0xed, 0x49, 0xb7, 0x21, 0xbe, 0x8c, 0x6b, 0x76, 0xad, 0xad, + 0xa8, 0x1d, 0x97, 0x87, 0xd7, 0xb1, 0xf6, 0xed, 0xfa, 0x99, 0x8c, 0xfe, + 0x19, 0xaf, 0x86, 0x67, 0x2e, 0x9c, 0x1c, 0xa8, 0x83, 0xde, 0xbf, 0xed, + 0xe3, 0x15, 0xad, 0x7f, 0x1a, 0xc6, 0xa7, 0x5b, 0x4d, 0xcb, 0xe3, 0xd1, + 0x96, 0xb7, 0xdd, 0x54, 0x84, 0x27, 0xed, 0x71, 0x06, 0x0a, 0x1d, 0xca, + 0x09, 0xdb, 0xd3, 0xe7, 0xb3, 0xac, 0x5f, 0x8e, 0x51, 0x8e, 0xc7, 0xa7, + 0xff, 0xdd, 0x4d, 0xde, 0x45, 0x23, 0x65, 0xf4, 0x20, 0xf4, 0xb1, 0xbc, + 0x26, 0x46, 0x83, 0xb9, 0x68, 0xdd, 0x9f, 0xf9, 0x5a, 0x5b, 0xd6, 0x44, + 0x1c, 0xc3, 0xa5, 0x23, 0xaf, 0x87, 0x45, 0xfc, 0xf8, 0xd9, 0xb4, 0x9b, + 0x7e, 0x20, 0xe7, 0x49, 0xc4, 0xf7, 0x38, 0x78, 0xfc, 0x38, 0x9e, 0x17, + 0x35, 0xbf, 0xac, 0xd6, 0xd7, 0x65, 0x36, 0x2e, 0x77, 0x4f, 0x9c, 0x0f, + 0x3f, 0x74, 0xfe, 0x03, 0x28, 0xec, 0x07, 0x98, 0xf5, 0xbb, 0x74, 0x5b, + 0xd2, 0x74, 0x3f, 0xc9, 0xcf, 0x5b, 0x65, 0xff, 0x44, 0xf1, 0x5e, 0xac, + 0x56, 0x47, 0x77, 0x78, 0xee, 0xd9, 0x6b, 0x47, 0xda, 0xa0, 0x2f, 0xda, + 0xb8, 0xd0, 0x6f, 0x9a, 0xe6, 0xfd, 0xfc, 0xb6, 0xce, 0xa6, 0x99, 0xdf, + 0x0e, 0xe2, 0x9e, 0xae, 0x17, 0x6f, 0xdf, 0x3b, 0xf8, 0x96, 0xf6, 0x55, + 0x7f, 0xd5, 0x43, 0x99, 0xe6, 0xcf, 0xb2, 0x78, 0xe8, 0x60, 0xb6, 0xbe, + 0x83, 0x83, 0x5d, 0x8d, 0xba, 0xbd, 0xfa, 0xd6, 0xae, 0x7c, 0xa8, 0x96, + 0xa7, 0xe8, 0xf5, 0xd3, 0x72, 0x71, 0x53, 0xfa, 0xc8, 0xee, 0xea, 0x6b, + 0x3a, 0xa4, 0xfd, 0xf3, 0xb1, 0xda, 0x6f, 0xc6, 0xb6, 0x95, 0xd6, 0x7d, + 0x75, 0x3f, 0x6d, 0xaa, 0x0f, 0x6a, 0x25, 0x87, 0x8f, 0x63, 0x79, 0xbd, + 0xa1, 0x1d, 0xe1, 0x61, 0xb8, 0x69, 0x8e, 0xc3, 0x26, 0x2e, 0x96, 0x87, + 0x03, 0xc8, 0x55, 0xdc, 0x1e, 0xf4, 0xf8, 0xb3, 0x8f, 0x3f, 0x0f, 0x49, + 0xb6, 0xf1, 0xea, 0xfc, 0xcb, 0x79, 0x2e, 0x9e, 0xf6, 0xf3, 0x4d, 0x5f, + 0x56, 0xbb, 0xd2, 0x34, 0xf3, 0xf3, 0xdb, 0xed, 0x99, 0xbc, 0x1a, 0xcd, + 0x3d, 0x6a, 0x9b, 0x9f, 0xdd, 0xcf, 0x64, 0xff, 0x24, 0xb7, 0xc4, 0xab, + 0x9e, 0x52, 0x0c, 0xb5, 0x6a, 0x2d, 0x9c, 0x7c, 0xb5, 0x4e, 0x63, 0x1c, + 0x97, 0x94, 0xf4, 0x3f, 0x86, 0xa3, 0x36, 0x79, 0xef, 0x7a, 0x12, 0x47, + 0xfc, 0x76, 0x8e, 0x46, 0x51, 0xef, 0x8d, 0xf2, 0xfe, 0x65, 0xad, 0x4d, + 0x53, 0x3b, 0xb9, 0x0b, 0xfa, 0xa5, 0x7d, 0xdd, 0xf4, 0xb6, 0xaf, 0xef, + 0xcd, 0xf7, 0x6a, 0xf9, 0x3a, 0x57, 0x2b, 0x6d, 0x3b, 0x68, 0x6f, 0x32, + 0xf8, 0xdf, 0xc1, 0x0a, 0xe8, 0xb1, 0xce, 0x5d, 0xbc, 0xdc, 0x6c, 0xf5, + 0xdd, 0xf5, 0x9a, 0x71, 0xf5, 0xa0, 0x97, 0xaf, 0x8d, 0xb2, 0xf7, 0xdb, + 0x29, 0xed, 0x68, 0x6e, 0x3c, 0x0c, 0x51, 0xa9, 0x43, 0x12, 0xea, 0xab, + 0x2b, 0x3e, 0x7e, 0x77, 0x3f, 0xd9, 0xb4, 0xff, 0x30, 0xac, 0xe1, 0xb6, + 0x5e, 0x58, 0x01, 0x5a, 0x3f, 0xb2, 0x72, 0xec, 0x2f, 0x97, 0x8e, 0xe7, + 0xe3, 0x21, 0x72, 0x3e, 0xf2, 0xe9, 0xe4, 0xc9, 0xae, 0xef, 0x17, 0xcc, + 0x4c, 0x7e, 0x7c, 0xe6, 0xcf, 0xc5, 0xe9, 0xdd, 0x84, 0xc5, 0x62, 0x83, + 0xfd, 0xc5, 0xd7, 0x75, 0xcf, 0x8e, 0xab, 0xe7, 0x7a, 0x2a, 0xf9, 0xe7, + 0xb2, 0x0b, 0xbe, 0xe5, 0x32, 0xbb, 0x9d, 0x93, 0xed, 0xb3, 0xc2, 0xcf, + 0xef, 0x9d, 0x5f, 0xdd, 0x4e, 0xc1, 0x6d, 0xff, 0x91, 0x5e, 0x37, 0x1b, + 0xad, 0x3e, 0xb7, 0xd1, 0x55, 0x4f, 0xb6, 0xf9, 0x95, 0xdd, 0xfa, 0xd3, + 0xe6, 0x8a, 0x88, 0xed, 0x47, 0x56, 0x93, 0xec, 0x30, 0x3e, 0xfc, 0xb8, + 0xbb, 0xeb, 0xef, 0xe9, 0x71, 0xd9, 0x7f, 0x91, 0x1f, 0x13, 0x75, 0xf2, + 0xeb, 0x2a, 0xaa, 0x3d, 0xbc, 0x1a, 0x2f, 0x63, 0x38, 0xb4, 0xcd, 0x3e, + 0xfc, 0xf4, 0xdc, 0x8b, 0x34, 0xb6, 0x3a, 0xa3, 0x9f, 0x90, 0xa9, 0xf5, + 0x8f, 0x68, 0x7f, 0xf0, 0xcd, 0x50, 0x0f, 0x3f, 0xd7, 0xd1, 0xe9, 0xb9, + 0x5d, 0xf5, 0x29, 0xde, 0x92, 0xf3, 0xd6, 0xfc, 0x5e, 0x09, 0x32, 0x2c, + 0xa8, 0xbd, 0x6d, 0xde, 0x3e, 0x68, 0x32, 0xcd, 0xb9, 0x8a, 0x65, 0x7f, + 0xfa, 0xf0, 0x53, 0xea, 0x58, 0xeb, 0xef, 0xad, 0xfc, 0x4a, 0xf6, 0x85, + 0x11, 0x0f, 0xed, 0xf1, 0xf4, 0x70, 0x9c, 0x6b, 0x96, 0xd2, 0x0f, 0xaf, + 0x5b, 0x36, 0xb9, 0x69, 0xbc, 0x23, 0xe3, 0xf3, 0xdd, 0xc9, 0xc9, 0xbb, + 0xb5, 0x1f, 0x1f, 0x87, 0x9f, 0x54, 0x7a, 0xe6, 0x2b, 0xf9, 0xd6, 0x8a, + 0x8f, 0x0d, 0xfd, 0xa1, 0xff, 0xb4, 0x1f, 0x26, 0x58, 0xcc, 0x89, 0xa9, + 0xcd, 0x63, 0xb1, 0xe9, 0xce, 0xd9, 0xf8, 0xb6, 0xcf, 0x72, 0xbf, 0x7a, + 0xc1, 0xb9, 0x1e, 0x59, 0xfd, 0xe3, 0xd6, 0xad, 0xbe, 0x8e, 0x3f, 0x3f, + 0xf3, 0xf2, 0xd0, 0x6a, 0xde, 0xeb, 0x47, 0x65, 0x0d, 0xad, 0xbd, 0xae, + 0x7e, 0x28, 0x0e, 0x68, 0x2c, 0x4f, 0xe1, 0xf7, 0xd7, 0x35, 0xe0, 0x7d, + 0xe4, 0x1e, 0xf7, 0x9b, 0xad, 0xfb, 0x9d, 0xb8, 0x3f, 0x8b, 0x4f, 0x54, + 0x2e, 0xa3, 0xa6, 0x8d, 0x3f, 0xf8, 0xcb, 0xed, 0x32, 0xa4, 0xf0, 0x8d, + 0x8e, 0xa9, 0xb5, 0xb9, 0x68, 0xcd, 0xda, 0x4d, 0x7c, 0xf9, 0x3c, 0x65, + 0x97, 0x8f, 0x65, 0x8e, 0x7c, 0x23, 0xdf, 0x86, 0xd0, 0x9d, 0x55, 0xff, + 0x88, 0xef, 0x5f, 0xa8, 0x89, 0x9e, 0x64, 0xb8, 0xfb, 0x7d, 0xb1, 0x2b, + 0x2a, 0xb6, 0x44, 0x3a, 0x4b, 0xce, 0x3f, 0x83, 0xb2, 0xf3, 0x4a, 0x35, + 0xbd, 0xe3, 0x2b, 0x89, 0xcf, 0x3f, 0x6e, 0x81, 0xde, 0xa0, 0xd3, 0x40, + 0xd3, 0x7c, 0xba, 0xe8, 0x97, 0x9e, 0x91, 0xdd, 0xc6, 0xcd, 0x8b, 0xdd, + 0x23, 0x7c, 0x7c, 0xed, 0xf8, 0xae, 0xc3, 0x3f, 0x6e, 0x84, 0xa9, 0xf1, + 0xc4, 0xce, 0x76, 0x15, 0x6e, 0xbb, 0xf3, 0xc3, 0x7c, 0x0f, 0xcf, 0x91, + 0x5f, 0x86, 0x90, 0x3d, 0x86, 0x74, 0xa6, 0xd3, 0x0f, 0x96, 0x54, 0xd2, + 0xaf, 0xf2, 0x2f, 0xf7, 0xe5, 0xda, 0xbb, 0xa7, 0xde, 0xc4, 0xc7, 0x91, + 0x7c, 0x61, 0x7f, 0x7c, 0xd9, 0xea, 0xc3, 0xa1, 0xfc, 0x43, 0xfd, 0x7f, + 0x29, 0x3b, 0x8f, 0xed, 0x06, 0xd9, 0x2e, 0xcd, 0xde, 0x4a, 0xad, 0x1a, + 0x75, 0x2d, 0xba, 0x16, 0x39, 0x75, 0x8f, 0xc8, 0x39, 0x67, 0x66, 0x20, + 0x44, 0x46, 0xe4, 0x78, 0xf5, 0x8d, 0xff, 0xaf, 0x7a, 0x5c, 0xdd, 0x1e, + 0x48, 0x96, 0xbd, 0x8c, 0x11, 0x9c, 0xf3, 0x9c, 0xbd, 0x6d, 0xf4, 0xaa, + 0xf2, 0x7a, 0x24, 0x3b, 0xf2, 0x85, 0x97, 0xc0, 0x38, 0xd0, 0x9c, 0xe8, + 0x9b, 0xf4, 0x4d, 0x34, 0xbf, 0x63, 0x94, 0x54, 0x93, 0x05, 0x07, 0x35, + 0x96, 0x4b, 0x0d, 0x46, 0x2e, 0x6b, 0x49, 0x05, 0x9b, 0x46, 0x1b, 0x64, + 0x67, 0x39, 0x0f, 0x8b, 0x8c, 0xcb, 0x1e, 0x2e, 0x29, 0x93, 0x10, 0xb4, + 0x67, 0xcf, 0xdf, 0x39, 0x31, 0xba, 0xe5, 0x2c, 0xc7, 0x5b, 0xcd, 0x0b, + 0x2e, 0x87, 0xba, 0xac, 0xd2, 0xc4, 0xfc, 0x17, 0xd5, 0x6f, 0x1d, 0xa1, + 0x0f, 0x9f, 0x24, 0xbc, 0xa1, 0x54, 0xf9, 0x27, 0x73, 0xb7, 0x05, 0xa7, + 0xd3, 0x8e, 0x1c, 0x9a, 0xfc, 0xfb, 0xb8, 0x68, 0x2a, 0x5c, 0xa9, 0x4f, + 0x6e, 0x63, 0xf9, 0xb6, 0x35, 0xc7, 0x34, 0x82, 0x0d, 0x45, 0xb8, 0x9c, + 0x6f, 0x08, 0xb9, 0x4e, 0xe2, 0xd6, 0xcf, 0x50, 0x8e, 0xdb, 0xb6, 0xb1, + 0x87, 0xef, 0xef, 0x6b, 0x6a, 0x2e, 0xbe, 0x34, 0x95, 0x0f, 0x19, 0xb2, + 0x01, 0x31, 0x66, 0x65, 0xc5, 0x16, 0x39, 0x11, 0x0e, 0xcb, 0xb9, 0xbb, + 0xe5, 0x03, 0x18, 0x76, 0xd2, 0xd6, 0xcf, 0xb2, 0xd1, 0x24, 0x4e, 0xad, + 0x72, 0x4c, 0xb3, 0x1f, 0x1b, 0xad, 0x14, 0x16, 0x4b, 0xdd, 0xb1, 0x30, + 0xb9, 0x9f, 0x83, 0x73, 0xa2, 0xf2, 0xf2, 0xce, 0x03, 0xfc, 0x82, 0x5b, + 0x07, 0x32, 0xb2, 0x8b, 0x09, 0x34, 0xd5, 0xae, 0x9a, 0x3c, 0xd7, 0x03, + 0x79, 0xbb, 0x58, 0xe0, 0x04, 0xe5, 0xee, 0x67, 0x6d, 0x29, 0xd5, 0xc4, + 0xfa, 0xd1, 0xc8, 0xf1, 0xf9, 0x68, 0x71, 0xd5, 0xac, 0xad, 0xf6, 0x46, + 0x04, 0x97, 0x56, 0x55, 0x00, 0x6f, 0xbf, 0xd3, 0xd7, 0x6b, 0x86, 0x3f, + 0xbf, 0xf3, 0xcf, 0x66, 0xba, 0x70, 0xa1, 0xc3, 0x5e, 0x28, 0x82, 0x9f, + 0x98, 0xe7, 0x10, 0x61, 0x1a, 0x33, 0xf0, 0xe5, 0x9c, 0x73, 0x64, 0x55, + 0x62, 0x0b, 0x08, 0xb0, 0x23, 0x15, 0x7e, 0x9b, 0x17, 0x3a, 0xbf, 0x0d, + 0x0f, 0xa2, 0x0d, 0xa9, 0x33, 0x20, 0xff, 0xb3, 0xc7, 0x45, 0x53, 0x52, + 0x85, 0xff, 0x24, 0x89, 0x42, 0xb0, 0x09, 0x6d, 0xff, 0xb0, 0x08, 0x10, + 0xd7, 0xe3, 0xea, 0x85, 0x63, 0xce, 0xf2, 0xed, 0x52, 0x32, 0x51, 0xcf, + 0x48, 0x72, 0x01, 0xb1, 0x19, 0xc9, 0x61, 0x8c, 0x56, 0xe2, 0x21, 0x8b, + 0x40, 0xf6, 0x25, 0x15, 0x1f, 0x2a, 0xee, 0x80, 0xd3, 0xea, 0x91, 0x83, + 0x2e, 0x19, 0x0c, 0x11, 0xbd, 0x00, 0xd3, 0x28, 0x59, 0xdf, 0x20, 0xfb, + 0x6a, 0xfa, 0x7a, 0x4d, 0xa8, 0x1a, 0xb2, 0xae, 0x57, 0xc9, 0x00, 0xb2, + 0x1a, 0xd0, 0xf8, 0x78, 0xd7, 0xbd, 0xa9, 0x52, 0x8d, 0x13, 0xdc, 0xb7, + 0x26, 0x04, 0x49, 0x0d, 0x07, 0x42, 0xf7, 0xdf, 0x84, 0xf9, 0x64, 0xda, + 0x50, 0xc8, 0xdb, 0xf3, 0x96, 0xf8, 0x1e, 0x43, 0x8a, 0x8a, 0xd4, 0xbb, + 0x7a, 0x70, 0x7a, 0xde, 0x5d, 0x3c, 0xd4, 0x26, 0xcd, 0x43, 0x01, 0xd9, + 0x80, 0x15, 0x9f, 0xc2, 0x8a, 0x81, 0xde, 0x56, 0x05, 0xa7, 0x3a, 0x91, + 0x23, 0xcf, 0xf0, 0x6f, 0xf8, 0xa0, 0x97, 0xb4, 0x72, 0x35, 0x06, 0x8c, + 0xc5, 0xa3, 0x87, 0x57, 0x52, 0x17, 0x66, 0x9d, 0xf4, 0xa0, 0xa6, 0x46, + 0x74, 0xa3, 0x0c, 0x4b, 0xc6, 0x54, 0xd7, 0xd3, 0x5f, 0x39, 0x7e, 0xb2, + 0x28, 0x87, 0xbc, 0x2c, 0xdc, 0xa3, 0x70, 0x66, 0x47, 0x1a, 0xf3, 0xf7, + 0x8a, 0xf2, 0x59, 0xac, 0x67, 0x4e, 0xae, 0x09, 0x5d, 0x13, 0xc3, 0x67, + 0x9e, 0xd1, 0x38, 0x1c, 0xc5, 0xda, 0xdf, 0xbc, 0x32, 0x19, 0x98, 0xb2, + 0x84, 0x66, 0xd7, 0xc8, 0x8d, 0x79, 0x1f, 0xd1, 0xc2, 0x37, 0x1e, 0x35, + 0xd5, 0x37, 0xe4, 0x83, 0xbc, 0xa4, 0xd8, 0x63, 0xcc, 0xb5, 0x6d, 0x0d, + 0xf3, 0x98, 0x6d, 0x47, 0x0c, 0x3e, 0x5c, 0x3a, 0x8c, 0x8d, 0x28, 0x24, + 0x51, 0x7c, 0x5b, 0xc0, 0xeb, 0x6d, 0x1a, 0x27, 0x66, 0x4a, 0x41, 0x94, + 0x79, 0x86, 0xf4, 0xcb, 0x1f, 0x23, 0x11, 0xb7, 0xc7, 0xe9, 0x8e, 0x6b, + 0xef, 0x84, 0xbb, 0xd3, 0xbb, 0x89, 0xec, 0x10, 0xe6, 0x21, 0x55, 0x93, + 0xd5, 0x4b, 0x9e, 0x68, 0xaa, 0xb5, 0x15, 0x68, 0xdf, 0xcf, 0x8e, 0x4f, + 0xb0, 0x41, 0x47, 0xd0, 0xef, 0xe4, 0xb7, 0xca, 0x0e, 0x29, 0x16, 0xa6, + 0xa5, 0x45, 0x10, 0xfa, 0x05, 0x1b, 0x3f, 0x72, 0x62, 0x46, 0xc4, 0x13, + 0x9f, 0xfe, 0xb6, 0x71, 0x8e, 0xb9, 0x2c, 0x20, 0xc0, 0xed, 0xde, 0x11, + 0x4f, 0x25, 0x0c, 0xe4, 0xc7, 0xa1, 0x06, 0x0e, 0x7b, 0xdb, 0x72, 0xb5, + 0xe6, 0x89, 0x37, 0xc8, 0x98, 0x76, 0xf3, 0x18, 0x8f, 0xb9, 0xb4, 0xb0, + 0xca, 0xad, 0x17, 0xb0, 0x5f, 0x51, 0xc3, 0x2d, 0x9f, 0x6c, 0x18, 0xc0, + 0x36, 0x62, 0xa3, 0x3a, 0x39, 0xc1, 0x8a, 0xc9, 0xa4, 0x0a, 0x9f, 0xef, + 0x1d, 0x67, 0x1b, 0x7d, 0x95, 0x02, 0x17, 0x50, 0x40, 0x1d, 0xb5, 0x58, + 0x0e, 0x4d, 0xc9, 0x35, 0x4c, 0xa4, 0xa5, 0x7d, 0x6b, 0x9a, 0x2d, 0x0e, + 0x56, 0xf9, 0x66, 0x2e, 0xe0, 0x5b, 0xf2, 0xe7, 0x90, 0x5d, 0x66, 0xcc, + 0x90, 0xf3, 0xaa, 0x05, 0x56, 0x91, 0xbc, 0x52, 0x10, 0x9c, 0xaf, 0xea, + 0x4f, 0x5e, 0xbe, 0x19, 0xb0, 0x40, 0xf0, 0x7a, 0x5a, 0xb5, 0xb2, 0x76, + 0xf3, 0x8a, 0xbc, 0x29, 0x08, 0xfd, 0x6d, 0x80, 0x1e, 0xb6, 0xa7, 0x08, + 0x84, 0x57, 0x9c, 0x62, 0xfc, 0xfe, 0xb3, 0x1f, 0x5a, 0xf8, 0x54, 0x83, + 0x6d, 0x38, 0xd6, 0x46, 0xa5, 0xd3, 0x76, 0x58, 0x2a, 0xf6, 0x99, 0xb5, + 0xb4, 0xce, 0x51, 0xc2, 0xc4, 0x6f, 0x68, 0x84, 0x4d, 0x6a, 0x3f, 0xbe, + 0x1e, 0xf2, 0xdc, 0xd3, 0x14, 0x06, 0x99, 0x6f, 0x97, 0x8e, 0xb2, 0xa4, + 0xf5, 0x97, 0x31, 0xee, 0xdd, 0xd6, 0x96, 0x1d, 0xb8, 0xfa, 0x32, 0x0d, + 0xce, 0x2e, 0x9f, 0xe5, 0x2b, 0x48, 0x58, 0x41, 0xc1, 0x16, 0xee, 0x13, + 0x5f, 0x31, 0xd7, 0x81, 0xba, 0x80, 0x66, 0x9f, 0x15, 0x77, 0xb5, 0xa2, + 0x19, 0x46, 0x00, 0x89, 0x99, 0xb8, 0x1c, 0xb5, 0xbd, 0xb1, 0x7a, 0xe2, + 0x27, 0x81, 0x89, 0x53, 0x0f, 0xd0, 0x2e, 0x01, 0x47, 0x5c, 0x3c, 0x13, + 0x46, 0x13, 0x1b, 0x9f, 0x0b, 0x48, 0x46, 0xc8, 0x8a, 0xff, 0x4b, 0xd8, + 0xd3, 0x54, 0xc4, 0x97, 0x72, 0x89, 0x72, 0x0e, 0x3a, 0x97, 0xd9, 0x1d, + 0xe2, 0x0d, 0xca, 0xd0, 0x6c, 0xa8, 0x47, 0x24, 0x6e, 0x28, 0xec, 0x0d, + 0xf0, 0x68, 0x98, 0x2e, 0x23, 0x9d, 0x8c, 0x6a, 0x8d, 0x99, 0x19, 0x61, + 0x47, 0xe2, 0xe5, 0x1c, 0x8a, 0xc3, 0x44, 0xd1, 0xe4, 0x55, 0xae, 0xa3, + 0xfe, 0x7c, 0x3e, 0xdf, 0x51, 0x4f, 0xc9, 0xde, 0xcf, 0x6c, 0x34, 0x7c, + 0x67, 0x1f, 0xae, 0x02, 0xc6, 0xca, 0x12, 0x78, 0x2f, 0x72, 0xc0, 0xd7, + 0x89, 0xb4, 0x79, 0x7f, 0x74, 0xab, 0x9f, 0xec, 0xc2, 0x81, 0xa6, 0x41, + 0x47, 0x73, 0x4e, 0xf3, 0xfd, 0x1a, 0xf6, 0x2a, 0xbd, 0x12, 0x5d, 0xaa, + 0x66, 0x21, 0x80, 0xa7, 0xb3, 0x0f, 0x7a, 0xb7, 0x70, 0xcb, 0xf2, 0x85, + 0x40, 0x59, 0xcb, 0xc4, 0xf5, 0xd5, 0xdc, 0x8b, 0x2b, 0x57, 0xdc, 0xc4, + 0x94, 0x10, 0x31, 0x40, 0x25, 0xba, 0xcf, 0x7e, 0x00, 0xf3, 0xe6, 0x12, + 0x9b, 0x10, 0xa7, 0x31, 0xfd, 0x98, 0x6d, 0x6a, 0x46, 0x84, 0x1a, 0x2d, + 0xcb, 0xf3, 0xa5, 0x4b, 0x38, 0x45, 0xa9, 0x1e, 0x71, 0x81, 0xec, 0xc5, + 0x9a, 0x5c, 0xaf, 0x39, 0x13, 0xd6, 0xdd, 0x22, 0xf9, 0x68, 0x54, 0xc9, + 0xff, 0x60, 0x57, 0x10, 0x59, 0x74, 0x4c, 0x20, 0xae, 0xc7, 0x87, 0x22, + 0x6c, 0x7a, 0xa7, 0xdb, 0xb5, 0x7c, 0x7c, 0xa6, 0x0c, 0x69, 0x45, 0x1f, + 0x66, 0xc1, 0xb9, 0x93, 0x8a, 0xa0, 0x00, 0x85, 0x6e, 0x4f, 0x03, 0x33, + 0x71, 0xc8, 0xf8, 0x6c, 0xdd, 0x4c, 0xcd, 0x64, 0xf2, 0xd6, 0x02, 0xbb, + 0x74, 0xb9, 0x41, 0x10, 0xac, 0xf2, 0x57, 0x89, 0x84, 0x71, 0xbc, 0x2c, + 0x64, 0x37, 0x8d, 0xb7, 0x54, 0xfe, 0x3d, 0x1c, 0x8a, 0x59, 0x8e, 0x6e, + 0xea, 0x79, 0x5c, 0x39, 0xea, 0x27, 0xeb, 0x49, 0x88, 0xae, 0xc8, 0x5f, + 0x9c, 0xf9, 0xe2, 0xb6, 0x61, 0xcf, 0x62, 0xda, 0xd8, 0xd3, 0x68, 0x45, + 0xca, 0x1c, 0x09, 0x71, 0x5a, 0x46, 0x12, 0xce, 0xa1, 0x72, 0x76, 0x64, + 0xa0, 0xe0, 0x15, 0x01, 0x1d, 0xf3, 0x77, 0xc3, 0x75, 0x0a, 0x60, 0x83, + 0x9b, 0xf0, 0xd0, 0x5f, 0x59, 0x72, 0x2b, 0xbf, 0x7e, 0x21, 0xfa, 0x60, + 0xaa, 0x5d, 0x70, 0x0c, 0xe6, 0xb7, 0x88, 0x31, 0x39, 0x2a, 0xb6, 0x95, + 0x04, 0xb5, 0x5d, 0x02, 0xf3, 0x8e, 0x89, 0xf6, 0x77, 0xef, 0x4a, 0xe4, + 0x6b, 0xac, 0x3c, 0xc4, 0xf7, 0x1c, 0xf2, 0x05, 0xe7, 0x29, 0xaa, 0xbc, + 0xbc, 0x44, 0x39, 0x2a, 0x9f, 0xf0, 0x3c, 0xf0, 0xc1, 0x4d, 0x31, 0xf8, + 0x35, 0xf3, 0x4f, 0x6d, 0x20, 0xda, 0xc3, 0x71, 0xbf, 0x4e, 0xd8, 0x51, + 0x5e, 0x3f, 0xbf, 0x50, 0xec, 0x87, 0x23, 0x2d, 0x70, 0x0d, 0x15, 0xd1, + 0xce, 0xeb, 0xbf, 0xd6, 0xcf, 0x72, 0x8e, 0x4d, 0xd6, 0x77, 0x23, 0x87, + 0x5a, 0xd3, 0x9e, 0x80, 0xe7, 0x31, 0xb2, 0xf3, 0x39, 0xe2, 0x8d, 0x4f, + 0x28, 0xa9, 0xfc, 0xd2, 0x24, 0xc9, 0xb3, 0xe7, 0xaf, 0x95, 0x09, 0x55, + 0xb3, 0xb7, 0x53, 0x8b, 0x46, 0x1b, 0xfe, 0xa9, 0x61, 0x46, 0xc2, 0x6a, + 0x64, 0xf8, 0x24, 0x43, 0xb6, 0x90, 0x6b, 0x98, 0xd6, 0x16, 0xf6, 0x68, + 0x7a, 0x4f, 0x3c, 0xc5, 0x91, 0x79, 0x57, 0x12, 0x42, 0x2c, 0xe9, 0x4e, + 0x6b, 0xb3, 0x24, 0xe7, 0xc7, 0x6b, 0xc3, 0x64, 0x51, 0x58, 0xa1, 0xdb, + 0x11, 0x4c, 0x77, 0x47, 0x42, 0xdd, 0xfd, 0xb4, 0xa2, 0xf7, 0x05, 0x1a, + 0xc8, 0xf6, 0x7e, 0x86, 0x7a, 0x7c, 0xa8, 0x2a, 0x24, 0x7c, 0x7b, 0xf2, + 0x83, 0xb8, 0x5e, 0x7a, 0x72, 0x10, 0x24, 0x8a, 0xc7, 0x64, 0x81, 0x19, + 0x7e, 0xc6, 0xc7, 0x3b, 0x76, 0x63, 0x1e, 0x26, 0x10, 0xd4, 0x81, 0x4d, + 0x2b, 0x59, 0xd0, 0x24, 0x3d, 0xc0, 0xdf, 0x8e, 0x99, 0xca, 0x2a, 0x03, + 0xc0, 0x75, 0x9c, 0xb9, 0xab, 0x0d, 0x55, 0x06, 0x84, 0xcf, 0x52, 0x1a, + 0xfa, 0xfb, 0x7f, 0x5c, 0xb9, 0xe2, 0xc4, 0xdb, 0x11, 0x14, 0xc7, 0x9e, + 0x72, 0xf8, 0xf5, 0x5b, 0xf8, 0x77, 0xf1, 0x20, 0x45, 0x7c, 0x6c, 0x87, + 0x50, 0x40, 0x9d, 0xe6, 0xfa, 0xd9, 0x12, 0xf9, 0xf0, 0x01, 0x79, 0xe1, + 0x2e, 0x7a, 0x95, 0x12, 0xb6, 0x17, 0x26, 0xbe, 0xd1, 0x9e, 0x5a, 0x5d, + 0x92, 0x78, 0xb2, 0x35, 0xea, 0xa2, 0xa4, 0xde, 0x87, 0x16, 0x13, 0x4f, + 0x0a, 0x6b, 0x5e, 0xc1, 0x4b, 0x02, 0x7f, 0x7c, 0xe6, 0x8c, 0xd3, 0x53, + 0x7b, 0x21, 0xd5, 0x51, 0x86, 0x02, 0xff, 0xb7, 0x23, 0x31, 0x98, 0x11, + 0x08, 0x02, 0x24, 0x09, 0xf1, 0x49, 0xd1, 0xe0, 0x3a, 0xe5, 0x0d, 0x8a, + 0x56, 0x86, 0xf8, 0xa6, 0xa3, 0x89, 0x86, 0x82, 0x39, 0x15, 0xc3, 0x42, + 0xf1, 0x6c, 0xee, 0x26, 0x41, 0x58, 0xd8, 0x5a, 0xfb, 0x93, 0xb3, 0xee, + 0xf9, 0xdc, 0x07, 0x77, 0xaf, 0xb3, 0x04, 0xec, 0x37, 0xe9, 0xe1, 0xb8, + 0x6d, 0x81, 0x0a, 0xcb, 0x47, 0x1d, 0xac, 0xda, 0x5e, 0x46, 0xab, 0x10, + 0xc5, 0x30, 0x7d, 0xbe, 0x61, 0x56, 0x9b, 0x4e, 0x9f, 0xa9, 0xee, 0xbb, + 0x69, 0xc3, 0x43, 0x14, 0x2e, 0x5c, 0x17, 0x2a, 0xf2, 0x02, 0x0b, 0x82, + 0x2b, 0x62, 0xea, 0xb9, 0xd1, 0x07, 0x12, 0x7f, 0x67, 0x94, 0xa5, 0x97, + 0x2d, 0x56, 0x99, 0x50, 0x01, 0xb6, 0xb8, 0xc2, 0xdf, 0xf1, 0xb0, 0xc7, + 0xd4, 0x19, 0xc7, 0x1c, 0x0e, 0x2d, 0x4b, 0xc4, 0xce, 0x3f, 0x3f, 0xec, + 0x7f, 0xb6, 0x6c, 0xbb, 0x36, 0xf2, 0x6b, 0xb5, 0xc2, 0x6b, 0x8b, 0x2c, + 0xc3, 0x0c, 0x99, 0x71, 0x52, 0x0e, 0x75, 0xf2, 0x19, 0x99, 0x35, 0x9b, + 0xd8, 0x8f, 0x82, 0x48, 0x1b, 0x73, 0x1b, 0x67, 0xad, 0xc5, 0x27, 0x99, + 0x51, 0x20, 0x36, 0x90, 0xbe, 0x11, 0x3d, 0x35, 0xad, 0xf6, 0x25, 0xbf, + 0x07, 0x08, 0xec, 0xfb, 0xc9, 0xc4, 0x47, 0x9d, 0x91, 0xe6, 0x93, 0x6e, + 0x20, 0xa5, 0x66, 0x73, 0x15, 0xe9, 0xce, 0xf5, 0xa2, 0xc0, 0xb9, 0x46, + 0x92, 0x47, 0xff, 0xfd, 0x07, 0x6c, 0x40, 0x5d, 0x50, 0xe4, 0x72, 0x5b, + 0x6f, 0x6a, 0x23, 0x10, 0x6d, 0xba, 0xb9, 0x39, 0xdc, 0xd0, 0x51, 0x5a, + 0x66, 0x25, 0xb6, 0xe1, 0x8d, 0x29, 0x56, 0x97, 0xe6, 0x97, 0xd4, 0x5d, + 0x3e, 0x34, 0x30, 0x29, 0x78, 0x46, 0x4a, 0x0c, 0xc9, 0x09, 0x99, 0xa9, + 0x24, 0x2a, 0x74, 0x93, 0x13, 0x17, 0x06, 0xf6, 0xe5, 0xdf, 0x3a, 0xd3, + 0x56, 0x95, 0xcb, 0x1d, 0xd0, 0x6f, 0x1c, 0x7a, 0x85, 0xfc, 0xbe, 0x13, + 0x39, 0x67, 0xdb, 0x6e, 0xfb, 0xe5, 0x3f, 0xbe, 0x9f, 0x96, 0x4f, 0x5a, + 0x80, 0x49, 0xa7, 0x04, 0x26, 0x07, 0xaf, 0x16, 0xbd, 0xf8, 0x50, 0xc2, + 0x75, 0x1d, 0x43, 0x57, 0xa2, 0x5a, 0x88, 0x18, 0x6d, 0x4b, 0x07, 0x6a, + 0x71, 0xa3, 0x9b, 0xbb, 0xfc, 0xd5, 0x00, 0xf9, 0x47, 0x55, 0xe9, 0x6c, + 0x25, 0x6c, 0x5c, 0x55, 0x42, 0x16, 0x6b, 0x26, 0xd7, 0xc5, 0x63, 0x3e, + 0x3b, 0xe9, 0xf8, 0x9a, 0x0f, 0xa1, 0xf9, 0xac, 0x28, 0xea, 0xbd, 0x34, + 0x16, 0x05, 0xe8, 0x86, 0x3f, 0x28, 0x79, 0x49, 0x4a, 0x96, 0xb3, 0x16, + 0x69, 0xb8, 0xe2, 0x24, 0xb6, 0xfb, 0x21, 0x61, 0x8b, 0x1f, 0x84, 0x9f, + 0x3f, 0xca, 0x79, 0x22, 0x68, 0x10, 0x90, 0x86, 0xa7, 0xf9, 0x58, 0x05, + 0xea, 0xa2, 0xb5, 0x16, 0xb8, 0x30, 0xe7, 0x22, 0x4f, 0xce, 0xfd, 0x7b, + 0x6c, 0x45, 0xc2, 0x0b, 0x84, 0x31, 0x44, 0x9c, 0x20, 0x7c, 0x69, 0x0f, + 0x67, 0x4d, 0x29, 0x45, 0xad, 0x49, 0x94, 0x9c, 0xa2, 0x08, 0x48, 0xc5, + 0x73, 0xd3, 0x2c, 0xa0, 0x6f, 0x21, 0xbb, 0x8b, 0xd7, 0x74, 0x78, 0x84, + 0x37, 0x28, 0xb4, 0x69, 0xa5, 0x67, 0x38, 0xba, 0xc4, 0x82, 0xf3, 0xb3, + 0xf8, 0xe5, 0x67, 0xf0, 0x10, 0x98, 0xa6, 0x2b, 0xdd, 0x31, 0xd8, 0x0f, + 0x4a, 0x7d, 0xaa, 0x84, 0xf5, 0x69, 0xfd, 0xee, 0x8b, 0x28, 0xc2, 0xe3, + 0xb7, 0x01, 0x1b, 0x72, 0x90, 0x3f, 0x3e, 0x67, 0xb7, 0x22, 0x43, 0xa1, + 0x06, 0x21, 0xa0, 0x1b, 0xea, 0x0d, 0xd2, 0xe6, 0xf6, 0x4e, 0x81, 0x7d, + 0x6c, 0xea, 0x23, 0x7d, 0x3c, 0xbe, 0x58, 0x9c, 0x4d, 0x73, 0xcb, 0x28, + 0xa2, 0xde, 0xaa, 0x89, 0xbb, 0x0e, 0xdd, 0x1e, 0x03, 0x73, 0xe0, 0x2a, + 0x51, 0x45, 0x51, 0x98, 0xf0, 0xe1, 0x4d, 0x19, 0x35, 0x4e, 0x74, 0xe9, + 0x3e, 0xfb, 0x48, 0x2f, 0xf6, 0x19, 0xce, 0xf5, 0x0f, 0x1e, 0x1c, 0x4f, + 0xc3, 0xde, 0x77, 0x18, 0x36, 0x79, 0xb7, 0x1d, 0xd5, 0x24, 0x5e, 0x49, + 0x0a, 0x86, 0x81, 0x1a, 0x98, 0x5f, 0xbe, 0x1d, 0xe6, 0xa2, 0xb4, 0x6e, + 0xcf, 0x31, 0x9c, 0x03, 0x9c, 0x09, 0x9c, 0x08, 0x6c, 0xf8, 0xc0, 0x03, + 0x04, 0x6e, 0x49, 0x7c, 0x2a, 0x33, 0xca, 0x25, 0x4f, 0x09, 0x88, 0xd4, + 0x8c, 0xee, 0x52, 0x9e, 0x52, 0xf6, 0x55, 0x2e, 0x2f, 0xb7, 0x90, 0xa8, + 0x5a, 0x4c, 0x73, 0x4c, 0xa0, 0xd4, 0x41, 0x02, 0x0d, 0x58, 0x24, 0x76, + 0x17, 0x24, 0x01, 0x14, 0xdc, 0xe7, 0x00, 0xbe, 0x73, 0x18, 0x72, 0xf9, + 0x9f, 0x18, 0x8a, 0x51, 0x28, 0x9c, 0x0a, 0xe3, 0x55, 0xbf, 0xe0, 0x75, + 0x46, 0xca, 0xcd, 0xdf, 0x3e, 0xdb, 0x3c, 0xc6, 0xa7, 0xf0, 0xd1, 0x4d, + 0x5e, 0x09, 0xdb, 0xa7, 0x5d, 0xc4, 0xaf, 0xdf, 0x08, 0x17, 0x05, 0x7d, + 0xc7, 0x40, 0x9c, 0x90, 0xa4, 0xc9, 0x21, 0xda, 0xf7, 0x57, 0x90, 0x23, + 0x75, 0x58, 0x52, 0x07, 0xe1, 0x70, 0xd3, 0x02, 0x6c, 0x7d, 0x54, 0x67, + 0xc1, 0x05, 0x87, 0xf6, 0x28, 0x65, 0xd4, 0x32, 0xcb, 0xd9, 0xd6, 0xc2, + 0x59, 0x1e, 0xdf, 0x25, 0x87, 0xf3, 0x3c, 0x2c, 0x37, 0x90, 0x29, 0xe0, + 0xd1, 0x87, 0x75, 0xfb, 0xc9, 0x47, 0x91, 0xa4, 0xc8, 0x8c, 0xe8, 0x4b, + 0x55, 0x20, 0x39, 0x31, 0x84, 0x81, 0x6d, 0x15, 0xe7, 0x96, 0xeb, 0x09, + 0xfa, 0xf2, 0x08, 0x3d, 0x27, 0x06, 0xf4, 0x89, 0xb1, 0xe5, 0x23, 0x5b, + 0x0f, 0x97, 0x23, 0xe4, 0xf0, 0xfb, 0x38, 0x1c, 0x64, 0x7e, 0x0e, 0x0b, + 0x52, 0xea, 0xc7, 0xf4, 0x53, 0xcb, 0x64, 0x2d, 0xbb, 0x0a, 0x8a, 0xfb, + 0xfb, 0xa5, 0x61, 0x42, 0xac, 0xf6, 0xc8, 0xf1, 0xda, 0xce, 0x72, 0x3f, + 0x21, 0xa9, 0x1f, 0x4c, 0x9c, 0x07, 0xb8, 0x7a, 0x49, 0xbf, 0x4f, 0x52, + 0xeb, 0xba, 0xe9, 0xbb, 0x63, 0xe6, 0x18, 0x7d, 0xb9, 0xdb, 0x89, 0x48, + 0x1a, 0x0d, 0x22, 0x7d, 0xab, 0xc2, 0x9f, 0xe9, 0x43, 0x93, 0x82, 0x13, + 0x41, 0xa5, 0x48, 0xf9, 0xd2, 0x00, 0xc7, 0x2e, 0xc9, 0xf3, 0x8c, 0x36, + 0x75, 0x13, 0xa5, 0x1c, 0x08, 0xe7, 0xd6, 0xcb, 0x91, 0xf6, 0x98, 0x5f, + 0x75, 0xa7, 0x62, 0x3a, 0x35, 0x31, 0x8b, 0xff, 0xe3, 0xe7, 0x08, 0x03, + 0xe9, 0x08, 0xad, 0x6d, 0xa6, 0xa4, 0x05, 0xc8, 0x3c, 0x06, 0x80, 0xb0, + 0xcc, 0x06, 0xe9, 0x82, 0x99, 0x3e, 0xcd, 0x89, 0xe3, 0xde, 0x19, 0xde, + 0x40, 0xdc, 0x56, 0xc4, 0xed, 0x22, 0xaa, 0xca, 0x61, 0xc4, 0x2e, 0xa0, + 0x9e, 0xfe, 0xc1, 0x0f, 0x13, 0x60, 0xd5, 0xa9, 0xdd, 0x12, 0x50, 0xaf, + 0xdb, 0xcc, 0x64, 0xe2, 0x62, 0x8a, 0x5c, 0x55, 0x27, 0x9d, 0x02, 0x74, + 0x98, 0xc6, 0x5d, 0x63, 0x33, 0x75, 0xa6, 0x4f, 0xe6, 0x54, 0x36, 0x00, + 0xa0, 0xaf, 0x83, 0x7c, 0xc3, 0xa0, 0x38, 0xf1, 0x0f, 0x38, 0xb2, 0x5b, + 0x11, 0x1e, 0x6c, 0x01, 0xc5, 0x5d, 0x6c, 0x4b, 0x2f, 0x51, 0x48, 0xfb, + 0x5a, 0x75, 0xce, 0x4a, 0x7c, 0xe6, 0xea, 0xb3, 0x9c, 0x29, 0x24, 0xa8, + 0xa1, 0xff, 0x2b, 0x2a, 0x15, 0xf3, 0x85, 0x4c, 0xaa, 0x32, 0x8c, 0x7b, + 0x7f, 0x26, 0xdf, 0x17, 0x0c, 0x84, 0x89, 0x0d, 0x78, 0x1b, 0x0e, 0xa5, + 0xe3, 0x18, 0x56, 0xc2, 0xb8, 0xe1, 0x33, 0x5d, 0xd8, 0x18, 0xf0, 0x98, + 0xf6, 0x1f, 0xb9, 0xff, 0x8e, 0xe0, 0x02, 0xae, 0x77, 0xdc, 0x7e, 0x53, + 0x3a, 0x41, 0xaa, 0x03, 0x7a, 0x47, 0x36, 0xf3, 0x35, 0xac, 0xb5, 0xf8, + 0xa0, 0x9f, 0x77, 0x76, 0xf8, 0x73, 0x4c, 0x50, 0x23, 0xdb, 0x12, 0x46, + 0x98, 0xc0, 0x27, 0xd2, 0x89, 0xab, 0x4e, 0x02, 0xf2, 0xe6, 0x13, 0xd4, + 0x50, 0xe3, 0xb6, 0x97, 0x8e, 0x46, 0xa0, 0x00, 0x21, 0x78, 0x53, 0xe9, + 0x78, 0x69, 0xa8, 0x78, 0xfa, 0xcc, 0x8e, 0x9a, 0x53, 0x84, 0xe0, 0xad, + 0xba, 0xad, 0xec, 0xad, 0x8a, 0xe4, 0x92, 0x23, 0x38, 0x6d, 0x8d, 0x65, + 0xf7, 0x1a, 0x6c, 0x40, 0x74, 0x26, 0xc9, 0xac, 0xdf, 0xe1, 0x27, 0x71, + 0xd7, 0x74, 0xf7, 0x2b, 0xbf, 0x07, 0x58, 0x83, 0x22, 0x1f, 0xa6, 0xcf, + 0x68, 0x6a, 0xe8, 0x4e, 0xf3, 0xae, 0x9a, 0xb3, 0x45, 0xa5, 0x6a, 0x45, + 0xdc, 0x73, 0x45, 0xe8, 0xeb, 0xa7, 0xbe, 0x76, 0x7a, 0x65, 0xd9, 0x57, + 0x4a, 0xc2, 0xd3, 0xc8, 0x5d, 0x22, 0x39, 0x17, 0x23, 0x80, 0xce, 0x54, + 0xa8, 0xd2, 0x6b, 0xe0, 0x02, 0xc6, 0x4c, 0x4d, 0x48, 0x14, 0xea, 0x08, + 0xb9, 0x6b, 0x19, 0xe2, 0xd4, 0x9f, 0xee, 0x43, 0xcb, 0x5c, 0xad, 0xcb, + 0x77, 0x48, 0xd9, 0x45, 0xd9, 0x4d, 0xd3, 0xb1, 0xbf, 0x89, 0xc6, 0xf2, + 0x63, 0xbb, 0x70, 0x6b, 0xbe, 0xbf, 0xd4, 0x5f, 0xb5, 0x3f, 0xa6, 0x1c, + 0x1a, 0x3a, 0xba, 0x8b, 0x51, 0x0f, 0x09, 0x34, 0xd5, 0x4b, 0x79, 0x47, + 0xdc, 0x98, 0x2a, 0x97, 0x00, 0xcd, 0xd0, 0x78, 0xbf, 0xba, 0x8f, 0x8d, + 0x90, 0x26, 0xd6, 0x59, 0xec, 0xa8, 0x99, 0xb5, 0x88, 0x11, 0x36, 0x93, + 0x79, 0x31, 0xaa, 0xeb, 0xfa, 0xb1, 0x5a, 0xe7, 0xde, 0xa1, 0x83, 0xd1, + 0x33, 0x60, 0x7a, 0x20, 0xde, 0x2f, 0x24, 0x3f, 0x06, 0x83, 0x15, 0x9d, + 0x7a, 0xa2, 0xfb, 0xb9, 0xe0, 0x04, 0xcb, 0x51, 0xb1, 0xbf, 0x03, 0xc7, + 0x76, 0xe5, 0xc7, 0x20, 0x72, 0xeb, 0x09, 0x4b, 0x35, 0x58, 0xb7, 0xfb, + 0x37, 0x71, 0xa8, 0x4f, 0x62, 0x1e, 0x16, 0x97, 0x3c, 0xe0, 0x43, 0x64, + 0x48, 0x5e, 0xbe, 0x31, 0x08, 0x5c, 0xbf, 0xa0, 0x81, 0xd4, 0x33, 0xde, + 0x59, 0x82, 0xc9, 0xab, 0x8d, 0xa2, 0x7f, 0xbf, 0x6a, 0x90, 0x78, 0x80, + 0x8f, 0x34, 0xc5, 0xff, 0x42, 0xc8, 0xf3, 0xf1, 0xa4, 0x8b, 0x80, 0x4a, + 0x18, 0xc1, 0x51, 0x16, 0x2d, 0x17, 0xfb, 0x37, 0xc9, 0xc8, 0x73, 0x38, + 0xf3, 0xf9, 0xf7, 0xaa, 0x43, 0xf1, 0x57, 0x12, 0xe0, 0x8e, 0x26, 0x00, + 0xd3, 0x2a, 0x0d, 0x25, 0x9f, 0x22, 0xd0, 0xde, 0x56, 0x69, 0x3a, 0x39, + 0x2d, 0x95, 0x7e, 0xe1, 0x34, 0xd4, 0xe7, 0xdb, 0x42, 0x0a, 0xde, 0x15, + 0x9e, 0xe0, 0x31, 0xb6, 0x86, 0x7f, 0x63, 0x16, 0xf3, 0xd5, 0x74, 0x7f, + 0x35, 0x30, 0x9e, 0x60, 0x1e, 0xab, 0x6b, 0x8a, 0xc7, 0x57, 0x98, 0xe8, + 0x49, 0x96, 0x02, 0x57, 0x27, 0x12, 0xb8, 0xc7, 0x0a, 0xed, 0x92, 0xb8, + 0x89, 0x80, 0xdc, 0x7a, 0x8b, 0xd7, 0x6f, 0xca, 0x6e, 0x8b, 0x50, 0x1e, + 0x50, 0xd9, 0xbb, 0x3f, 0x33, 0x3b, 0x4c, 0x52, 0x8a, 0x51, 0x05, 0x5d, + 0x7f, 0x80, 0x43, 0xf0, 0x7f, 0x02, 0xc2, 0xc6, 0xe0, 0x23, 0x33, 0x00, + 0x7c, 0xc5, 0x31, 0x5b, 0x7d, 0x0d, 0x1e, 0xf2, 0xf1, 0x46, 0xc8, 0x9d, + 0xd3, 0xf0, 0x7d, 0x14, 0x59, 0xdd, 0x59, 0xb1, 0x63, 0xfc, 0xc0, 0x0f, + 0x2c, 0x1a, 0x5c, 0x1f, 0x62, 0x9f, 0x00, 0x93, 0x0e, 0xc7, 0xf8, 0x79, + 0xf0, 0x64, 0xbe, 0x9e, 0x38, 0x7d, 0xa0, 0x87, 0xfc, 0x62, 0xda, 0x74, + 0x75, 0xd1, 0x8b, 0x6a, 0xed, 0x18, 0xef, 0x21, 0x87, 0x36, 0x05, 0xd0, + 0x60, 0x01, 0x2a, 0x2c, 0x30, 0xc7, 0xb8, 0x16, 0x82, 0x2f, 0xc9, 0x51, + 0xfd, 0x5d, 0x16, 0x7b, 0x05, 0x9c, 0xa2, 0x0b, 0xb1, 0xcc, 0xf5, 0x47, + 0xab, 0x8a, 0xc6, 0x12, 0x27, 0x81, 0xcf, 0x4e, 0x3b, 0x9a, 0xd7, 0xc6, + 0xf2, 0x6d, 0x03, 0x6b, 0x0c, 0xb9, 0xd3, 0xf4, 0xe6, 0xa8, 0xa2, 0x7e, + 0xa2, 0xdb, 0xa0, 0x18, 0x52, 0x9d, 0x00, 0x38, 0x46, 0xa6, 0x47, 0x24, + 0xd1, 0x4f, 0x1e, 0x78, 0x4e, 0xaa, 0xee, 0x73, 0xb5, 0xe9, 0xdf, 0x47, + 0x14, 0x57, 0x63, 0x05, 0x18, 0x1a, 0x85, 0xee, 0xf8, 0x0b, 0x44, 0xbf, + 0xc3, 0x46, 0x26, 0x3b, 0xde, 0x01, 0xde, 0xba, 0x93, 0x1d, 0x94, 0xd0, + 0x90, 0x4f, 0x25, 0x57, 0xeb, 0x42, 0x57, 0x47, 0x3d, 0xfc, 0x83, 0x5f, + 0xf4, 0x3a, 0x0a, 0xec, 0x6c, 0xd5, 0x4f, 0xc8, 0x4e, 0x8a, 0x82, 0xc0, + 0xfc, 0x3b, 0x96, 0x7a, 0x57, 0x43, 0xc2, 0x57, 0xde, 0xd2, 0xed, 0x22, + 0xdb, 0xfc, 0x03, 0xc7, 0x8a, 0x4f, 0x62, 0x4e, 0x96, 0xa4, 0x73, 0x9e, + 0x48, 0x7c, 0x1e, 0x49, 0xa5, 0x19, 0x19, 0x9c, 0x75, 0x46, 0x1a, 0x4d, + 0x0c, 0xd7, 0xe5, 0xe0, 0xd3, 0x67, 0xe3, 0x36, 0x43, 0xa2, 0x61, 0x66, + 0x64, 0xa9, 0xe2, 0xbc, 0xa0, 0x92, 0x53, 0xa0, 0xd8, 0x76, 0x57, 0x6e, + 0x02, 0x17, 0xe7, 0xc9, 0x03, 0x88, 0xac, 0x36, 0xb3, 0x4c, 0xc3, 0xf4, + 0x55, 0x32, 0xac, 0x29, 0x50, 0x2a, 0xfc, 0xe8, 0x77, 0x97, 0x3f, 0xf9, + 0xa4, 0x03, 0xf1, 0x86, 0x1e, 0xf1, 0x4d, 0xeb, 0xb9, 0xb2, 0xed, 0xbf, + 0x93, 0xb6, 0x48, 0x85, 0x1c, 0xba, 0x4a, 0x5b, 0x18, 0x45, 0xf7, 0xf8, + 0xf6, 0x87, 0xb6, 0x5a, 0x1b, 0xb7, 0xb7, 0x3f, 0x44, 0xb3, 0xc9, 0x72, + 0x21, 0xbb, 0xc5, 0xec, 0x85, 0x93, 0x63, 0xfb, 0x2b, 0xe2, 0x0d, 0x69, + 0xa9, 0xd3, 0xde, 0xa4, 0x90, 0xed, 0xc3, 0x58, 0x39, 0x47, 0x05, 0x61, + 0x60, 0x63, 0xa1, 0xc1, 0x72, 0xa0, 0x62, 0x32, 0xea, 0x04, 0x42, 0x8c, + 0x83, 0xe9, 0xe2, 0x67, 0x03, 0x46, 0x6d, 0x72, 0x39, 0x22, 0x86, 0xdf, + 0x7e, 0x1d, 0xf5, 0x1b, 0x93, 0xef, 0x02, 0xe5, 0xac, 0x7f, 0x2e, 0x3f, + 0x5d, 0x51, 0xca, 0x45, 0x4d, 0xd3, 0x5a, 0xf5, 0x4a, 0x8f, 0xde, 0x71, + 0x6c, 0x54, 0xaa, 0x71, 0x4a, 0xfd, 0x26, 0xb6, 0xca, 0xe7, 0x73, 0xd5, + 0x5d, 0x35, 0xa2, 0x93, 0x71, 0xd9, 0x8a, 0x93, 0xf0, 0xa9, 0x81, 0xe8, + 0x0b, 0x66, 0xb6, 0x47, 0x63, 0xdf, 0x21, 0xc0, 0x6c, 0x13, 0x8f, 0x29, + 0xe5, 0x17, 0x0b, 0xad, 0x0a, 0x30, 0xd3, 0xe0, 0xf3, 0xc8, 0xb3, 0x2c, + 0xb1, 0xb7, 0x88, 0xb9, 0xf0, 0xa0, 0x00, 0x22, 0x8d, 0x91, 0xa2, 0x6d, + 0x41, 0xea, 0x87, 0x5e, 0x42, 0x49, 0x01, 0xc8, 0xac, 0xb7, 0xf6, 0x49, + 0x5f, 0x71, 0xb1, 0x49, 0x37, 0x04, 0xea, 0x11, 0xce, 0x3f, 0xa9, 0x5f, + 0x27, 0x57, 0xca, 0x0e, 0x26, 0xe1, 0xe1, 0x36, 0x8f, 0x89, 0x44, 0xa6, + 0xf6, 0xfd, 0xf8, 0xa5, 0x24, 0xac, 0x00, 0x71, 0x99, 0xdf, 0x70, 0x9f, + 0x17, 0xd4, 0x59, 0xe3, 0xbf, 0x77, 0x57, 0x07, 0x30, 0xcc, 0x8c, 0x54, + 0x5c, 0xc6, 0xf1, 0x02, 0x2b, 0xa7, 0x48, 0xce, 0x35, 0xfa, 0x68, 0x95, + 0x7a, 0xb7, 0x07, 0x78, 0x9b, 0xae, 0xcf, 0xf3, 0xc8, 0xe8, 0xa9, 0x51, + 0xe6, 0x9e, 0x31, 0x56, 0xfa, 0x3a, 0x1a, 0xd7, 0xc6, 0x7c, 0x5d, 0x76, + 0x79, 0x7f, 0xee, 0xeb, 0xa7, 0x4b, 0xde, 0x13, 0x58, 0xac, 0x14, 0xf8, + 0x19, 0x4c, 0x6e, 0xe1, 0xc6, 0x74, 0x66, 0xd1, 0x8f, 0x58, 0xe4, 0x7d, + 0xf3, 0x8a, 0xed, 0xb7, 0xfb, 0x32, 0xe4, 0x3d, 0x4c, 0x61, 0x24, 0xcf, + 0x87, 0x9e, 0x0e, 0xe1, 0x17, 0xb3, 0x17, 0x6d, 0x38, 0x48, 0x5c, 0xfe, + 0xa2, 0x16, 0x51, 0x17, 0x7b, 0xcf, 0x2a, 0x70, 0xa0, 0xff, 0xad, 0x97, + 0x43, 0x81, 0x41, 0x78, 0x8d, 0xfc, 0xce, 0x7f, 0xae, 0x29, 0xd7, 0x81, + 0x37, 0x78, 0x35, 0x1d, 0x57, 0x5d, 0xbf, 0xcc, 0x5c, 0x13, 0x41, 0x88, + 0x5f, 0x09, 0x3a, 0x59, 0x06, 0x99, 0x73, 0x55, 0xb3, 0xf4, 0x6b, 0xc1, + 0x27, 0xcd, 0x7a, 0x21, 0x65, 0xde, 0xc1, 0x08, 0x33, 0x35, 0xc7, 0xa4, + 0x62, 0x46, 0x0e, 0x5f, 0x35, 0x0f, 0x35, 0x78, 0x31, 0x3a, 0xf7, 0x4a, + 0x20, 0xe0, 0x63, 0xdf, 0xfe, 0x4a, 0x29, 0xeb, 0x72, 0x3f, 0x16, 0xd5, + 0xd9, 0xb6, 0x7c, 0x2f, 0xb6, 0xfe, 0xd2, 0xb7, 0x48, 0x03, 0xcc, 0x27, + 0xfe, 0xf4, 0xee, 0xdf, 0x0a, 0x1d, 0x54, 0x50, 0xec, 0x28, 0xb5, 0xa9, + 0xde, 0xd8, 0xa0, 0xb6, 0x11, 0x7d, 0xa9, 0xc7, 0xac, 0xab, 0x1e, 0xe0, + 0xfb, 0x50, 0x4a, 0x73, 0xd0, 0xea, 0x36, 0x76, 0x3e, 0xed, 0x58, 0x0a, + 0x3b, 0xe0, 0x1d, 0x8f, 0x50, 0x10, 0xcd, 0x2a, 0x84, 0x46, 0x5b, 0xce, + 0xac, 0x3d, 0x23, 0xb4, 0x17, 0xaf, 0x7d, 0x4f, 0xae, 0xfa, 0x9a, 0xce, + 0x60, 0x7a, 0x99, 0xe8, 0x4a, 0x53, 0x59, 0x4d, 0x5b, 0x9f, 0x71, 0xd5, + 0x03, 0xef, 0xd9, 0x02, 0xbb, 0xca, 0x92, 0x49, 0xb1, 0x1f, 0xe8, 0x75, + 0xe4, 0xd2, 0xc5, 0x98, 0x30, 0x61, 0xa5, 0x7d, 0x80, 0x90, 0x83, 0x26, + 0x6d, 0x1c, 0xb8, 0xf1, 0xca, 0x77, 0xe6, 0x3d, 0x1e, 0x09, 0x11, 0xae, + 0x2e, 0x21, 0x76, 0xd7, 0x7b, 0xca, 0x52, 0xcc, 0xff, 0x7e, 0x27, 0xd0, + 0x68, 0xc1, 0xd9, 0xe5, 0xa4, 0x66, 0x70, 0x4a, 0xff, 0xa7, 0xf2, 0xcf, + 0x26, 0xaa, 0xad, 0xe9, 0x9e, 0x38, 0x31, 0x74, 0xb9, 0xc8, 0x82, 0x17, + 0x40, 0x95, 0xb8, 0x72, 0x41, 0x89, 0x50, 0x81, 0x10, 0xfb, 0xde, 0xd9, + 0xa0, 0x27, 0xda, 0xe9, 0xa6, 0xbf, 0xb5, 0x97, 0x9d, 0x9a, 0x83, 0x36, + 0xd3, 0xcd, 0xd6, 0xf1, 0x87, 0x9f, 0x04, 0x98, 0x6d, 0xd2, 0x9f, 0x26, + 0x3d, 0x32, 0xb8, 0x0b, 0xae, 0xbe, 0xd1, 0xf0, 0xa1, 0x21, 0x70, 0x54, + 0x82, 0xd0, 0x3d, 0xd8, 0x79, 0xc4, 0x3f, 0x6b, 0xe5, 0xf8, 0x6f, 0xc4, + 0xf9, 0xc8, 0xbd, 0xcc, 0xee, 0x8a, 0x5e, 0x97, 0xcc, 0xf6, 0xc6, 0xba, + 0x0d, 0xbc, 0xdb, 0x1c, 0xaf, 0xc4, 0xe6, 0xb3, 0xa6, 0x61, 0x02, 0x40, + 0xc4, 0xe5, 0x39, 0x3d, 0x67, 0xf7, 0x58, 0xa2, 0x95, 0xd8, 0x5f, 0x76, + 0x97, 0x59, 0x79, 0xa3, 0xc0, 0x5e, 0xfc, 0x42, 0xd1, 0x66, 0x64, 0xfb, + 0x0b, 0x01, 0xe3, 0x22, 0xf5, 0x4f, 0x47, 0xc4, 0xd1, 0x90, 0x29, 0x39, + 0x5a, 0x62, 0xdf, 0x16, 0x21, 0xb4, 0x82, 0xb8, 0x17, 0x9f, 0x28, 0xa3, + 0xd0, 0x0f, 0xa5, 0x52, 0x9b, 0x7e, 0xf0, 0x34, 0x4f, 0x2b, 0xe5, 0x4b, + 0x6d, 0x0f, 0x07, 0xac, 0x76, 0xf9, 0x87, 0xc9, 0xc7, 0x00, 0xdc, 0x3f, + 0x74, 0xf3, 0xed, 0x7d, 0x66, 0x31, 0xe7, 0x19, 0x4e, 0xc6, 0x2e, 0x6a, + 0x59, 0x42, 0xc5, 0xf0, 0x1c, 0xb3, 0x1a, 0xe7, 0x94, 0xed, 0xf0, 0x2b, + 0xfa, 0x96, 0x94, 0x6c, 0xe2, 0xfa, 0x4d, 0x45, 0x45, 0x02, 0xeb, 0xf2, + 0x8d, 0x5f, 0xd3, 0x90, 0xbd, 0x1a, 0xb0, 0x49, 0xd8, 0x5a, 0x00, 0x17, + 0x5b, 0xbd, 0x29, 0x8a, 0x55, 0x90, 0x33, 0x9c, 0x44, 0xb6, 0x23, 0x3c, + 0xd5, 0x29, 0x6d, 0x72, 0x68, 0x65, 0x62, 0x28, 0x65, 0x52, 0x00, 0xee, + 0xad, 0x99, 0x41, 0x01, 0x73, 0x38, 0x05, 0xfd, 0x1f, 0x63, 0xd0, 0x7b, + 0x34, 0xf4, 0xc0, 0x6e, 0x17, 0x95, 0x9e, 0xd0, 0x98, 0xe6, 0x51, 0x04, + 0x8a, 0x56, 0xc4, 0x18, 0xba, 0x97, 0x2a, 0x63, 0xc7, 0xc3, 0x37, 0x1f, + 0x8b, 0x29, 0x97, 0x99, 0x9c, 0xc9, 0x83, 0xf2, 0x18, 0xfd, 0xc8, 0x9d, + 0xbd, 0x1b, 0xd0, 0xfe, 0x0d, 0x2b, 0x51, 0xa0, 0xaf, 0xaa, 0x12, 0xaf, + 0x35, 0x2b, 0xd4, 0x2f, 0x9e, 0x87, 0x21, 0x55, 0x0c, 0x61, 0x63, 0xf6, + 0x0a, 0x9e, 0xd4, 0x27, 0x3b, 0x5e, 0xf1, 0xa1, 0xa9, 0xe1, 0xa1, 0x5d, + 0xee, 0xb1, 0x51, 0x80, 0x5a, 0x40, 0x93, 0x0a, 0xe2, 0xca, 0x04, 0xe2, + 0xbc, 0x82, 0xc2, 0xba, 0x82, 0x9e, 0x72, 0xa9, 0x7f, 0x96, 0x29, 0x15, + 0x7f, 0xae, 0x32, 0x6a, 0x2a, 0x3d, 0x4a, 0x8a, 0x3b, 0x9d, 0x99, 0xde, + 0xa0, 0xc4, 0x9a, 0xdf, 0x5e, 0xf1, 0xca, 0xee, 0x69, 0x77, 0x5a, 0x4c, + 0x4e, 0x02, 0x45, 0x35, 0x5f, 0xa7, 0xd6, 0xde, 0x13, 0x5f, 0x87, 0xe6, + 0x85, 0xfa, 0x04, 0xeb, 0x3f, 0x25, 0x93, 0x12, 0x0a, 0xcd, 0x0d, 0xdd, + 0x8f, 0x83, 0x40, 0xbb, 0xda, 0x76, 0x33, 0x00, 0x92, 0xf4, 0x64, 0x7e, + 0x08, 0xec, 0x75, 0x26, 0x67, 0x6e, 0x16, 0x3c, 0xc5, 0x79, 0x77, 0xd9, + 0x1f, 0xd7, 0x84, 0xab, 0xef, 0x36, 0xf2, 0x3a, 0x02, 0xd8, 0x8c, 0x61, + 0x33, 0x47, 0x09, 0xe4, 0x54, 0xd8, 0xab, 0xd8, 0x04, 0x02, 0x90, 0x03, + 0xae, 0xb2, 0x3e, 0x39, 0x35, 0xaf, 0x0e, 0xcc, 0xa8, 0xe2, 0x17, 0xb5, + 0xb2, 0x9c, 0x4b, 0x96, 0xdb, 0x76, 0x3c, 0xd5, 0x8a, 0x56, 0x6f, 0xec, + 0x66, 0x79, 0xc2, 0x4b, 0xaa, 0x20, 0xf3, 0x62, 0xd3, 0x14, 0x2b, 0x78, + 0x1c, 0xb7, 0xaa, 0x5d, 0xcd, 0x28, 0xa9, 0x89, 0x90, 0xb3, 0xf1, 0xab, + 0x02, 0x56, 0xbc, 0x10, 0x77, 0x0d, 0x86, 0xe7, 0xc7, 0x88, 0x49, 0x9c, + 0xe0, 0x03, 0xbf, 0x1e, 0xc1, 0x14, 0xb2, 0x24, 0x55, 0x81, 0x92, 0x15, + 0x04, 0x9b, 0x8e, 0x77, 0x11, 0xd6, 0x92, 0x74, 0xaa, 0x19, 0xfa, 0x1e, + 0x50, 0xe7, 0x84, 0x29, 0xf3, 0xb0, 0xe2, 0xeb, 0xe6, 0x62, 0x35, 0xb4, + 0x44, 0xaf, 0xf3, 0x09, 0x74, 0x29, 0x96, 0x27, 0x9f, 0x5f, 0x1d, 0x17, + 0xbb, 0xbe, 0x92, 0x7f, 0x97, 0x78, 0xfa, 0x3b, 0x86, 0xc7, 0x78, 0x8c, + 0x03, 0x02, 0x2e, 0xa9, 0xc3, 0x00, 0x3b, 0xcc, 0xe5, 0xa4, 0x37, 0xd9, + 0xe6, 0x36, 0x25, 0xdd, 0x06, 0xb1, 0x4e, 0xc9, 0x86, 0xe6, 0xb6, 0x25, + 0x1d, 0xa6, 0x41, 0xe7, 0xd9, 0x37, 0x46, 0x6d, 0xed, 0x98, 0xb4, 0x4c, + 0x52, 0x5f, 0xa6, 0xfd, 0x58, 0x61, 0x04, 0xe1, 0xa0, 0x84, 0x56, 0x54, + 0x12, 0x05, 0x46, 0xe8, 0x58, 0x07, 0x18, 0xbe, 0xce, 0x55, 0xca, 0xf5, + 0xfc, 0xb3, 0x95, 0x75, 0x00, 0xca, 0xd3, 0xf2, 0xab, 0x65, 0x3c, 0xa3, + 0xcf, 0x50, 0x3f, 0x8d, 0xb9, 0x7a, 0x9c, 0xaf, 0xb4, 0xf6, 0x11, 0x73, + 0x1b, 0x93, 0x3e, 0xd6, 0x09, 0x3f, 0x56, 0xd0, 0xa7, 0x34, 0x43, 0x5e, + 0x8d, 0x17, 0xe1, 0xf8, 0x80, 0x3c, 0x49, 0xd3, 0x1b, 0x09, 0x12, 0x52, + 0x43, 0xb6, 0xcf, 0x2c, 0x65, 0xf5, 0x4c, 0x7d, 0x14, 0x71, 0xe4, 0x2d, + 0x87, 0x39, 0x59, 0x47, 0x67, 0x0c, 0x46, 0x60, 0x6c, 0x88, 0xba, 0x35, + 0x31, 0x4a, 0x41, 0x65, 0x01, 0xd9, 0xfc, 0x9b, 0xf6, 0xcf, 0x0f, 0x87, + 0xa8, 0xfc, 0x04, 0x59, 0xc6, 0x84, 0x8b, 0x20, 0x60, 0x3f, 0x8f, 0x78, + 0x26, 0xb3, 0x87, 0xd4, 0x59, 0xad, 0x6e, 0x56, 0x18, 0xf9, 0xc4, 0xba, + 0x33, 0x6b, 0x15, 0x5a, 0xb5, 0x90, 0x81, 0xcd, 0xf0, 0xf3, 0xb6, 0x28, + 0xd3, 0x96, 0x0e, 0xec, 0x42, 0xd8, 0xcb, 0x21, 0x60, 0x30, 0x6f, 0x91, + 0x2b, 0x35, 0xd1, 0x63, 0x19, 0x9a, 0x47, 0x8b, 0x22, 0xe6, 0x5f, 0x15, + 0x83, 0x95, 0x5f, 0x78, 0xf4, 0x34, 0xe8, 0x93, 0x1d, 0xf6, 0x58, 0x77, + 0x37, 0xe9, 0x88, 0x0c, 0x65, 0x6e, 0x98, 0xc2, 0xce, 0xd7, 0xb5, 0x46, + 0x81, 0x01, 0x2a, 0xeb, 0x69, 0xde, 0xd2, 0x5f, 0x4f, 0x97, 0xf1, 0xfc, + 0x19, 0x3d, 0x20, 0xe8, 0xc7, 0xda, 0x69, 0x48, 0x7d, 0x3a, 0x1a, 0xd9, + 0x89, 0x4f, 0x88, 0x4a, 0x43, 0xae, 0xcc, 0x15, 0xba, 0x4c, 0x99, 0x3b, + 0xef, 0xf1, 0x40, 0x3c, 0x42, 0x36, 0xa7, 0xc6, 0x53, 0x7b, 0xd9, 0x3c, + 0x37, 0xa1, 0x58, 0x99, 0xeb, 0x98, 0xff, 0x2a, 0x16, 0x64, 0xf9, 0x21, + 0xc5, 0xab, 0x9d, 0xf9, 0xd1, 0x68, 0x99, 0x41, 0x3f, 0x0b, 0xa4, 0xfa, + 0xea, 0x3b, 0xb7, 0x8a, 0x8e, 0xa3, 0xa1, 0xf8, 0x8c, 0xde, 0x62, 0x7e, + 0xbe, 0x7b, 0xc6, 0xba, 0xe8, 0xd6, 0xe0, 0xa5, 0x77, 0x36, 0x2b, 0xee, + 0x45, 0xbd, 0x99, 0x4b, 0xab, 0xfd, 0x3e, 0x6f, 0xe5, 0xb4, 0x4b, 0x11, + 0x67, 0x6c, 0xc2, 0xb9, 0xf6, 0x0a, 0x68, 0xc0, 0xb3, 0x80, 0xd7, 0x9a, + 0x7b, 0xa7, 0xf3, 0x66, 0xfb, 0x5c, 0xab, 0xdb, 0x82, 0x14, 0x16, 0x14, + 0x57, 0x59, 0xa9, 0xfb, 0x0a, 0xc5, 0xf7, 0x55, 0xaf, 0xea, 0xd1, 0xa2, + 0x25, 0x1c, 0x7c, 0xbd, 0x18, 0x8a, 0x61, 0x7a, 0x8c, 0x5f, 0xd8, 0xee, + 0x37, 0x36, 0x83, 0xca, 0x24, 0xf3, 0xfc, 0xb1, 0x7e, 0x01, 0x58, 0xf8, + 0xb4, 0x3f, 0x29, 0xa9, 0xd5, 0x08, 0x63, 0x3c, 0xb0, 0xda, 0x21, 0xb1, + 0x3f, 0x3e, 0x2a, 0x3d, 0x78, 0x60, 0x2d, 0xa1, 0xd5, 0x66, 0x53, 0xf4, + 0xc1, 0x8b, 0x94, 0x61, 0x9f, 0xf7, 0xcf, 0x41, 0xae, 0x45, 0x3a, 0x98, + 0x16, 0xfc, 0xfd, 0x00, 0x00, 0x76, 0x35, 0x03, 0xa9, 0x76, 0x3d, 0x0b, + 0xe0, 0x4d, 0x89, 0x88, 0x6c, 0xb0, 0xeb, 0x06, 0xd1, 0x3e, 0x03, 0xb7, + 0xef, 0xcb, 0x3b, 0x27, 0xb0, 0xbb, 0x4a, 0xef, 0x9c, 0xc4, 0x86, 0xa3, + 0x6a, 0x23, 0x6f, 0x3f, 0x16, 0x9e, 0x2e, 0x4a, 0xf2, 0x00, 0xd2, 0x18, + 0x01, 0x8e, 0x7e, 0x91, 0xf3, 0x6d, 0xc2, 0x37, 0xdb, 0xfc, 0xe0, 0xf8, + 0x36, 0x77, 0xd3, 0xdc, 0xf3, 0x73, 0xdd, 0x12, 0xe3, 0x4d, 0xac, 0x87, + 0xd8, 0x39, 0x74, 0x86, 0x83, 0xa3, 0xf6, 0x9d, 0x1c, 0xf0, 0xed, 0x9d, + 0xa3, 0x86, 0x97, 0xdf, 0x57, 0x84, 0x90, 0x74, 0xf6, 0x9d, 0xfc, 0x91, + 0xb3, 0xe7, 0x2d, 0x6d, 0x18, 0xa7, 0x6e, 0x7e, 0xf9, 0xf4, 0x11, 0xec, + 0x3a, 0xc8, 0xaa, 0x1e, 0xb4, 0x0b, 0x2e, 0xe5, 0x8a, 0x1f, 0xeb, 0x15, + 0xee, 0xba, 0x8a, 0x0f, 0x69, 0x2a, 0xa2, 0xdf, 0x7b, 0x29, 0xd0, 0x25, + 0xb3, 0xf6, 0x3e, 0x37, 0xd0, 0x97, 0x93, 0x8a, 0x02, 0x62, 0x7d, 0x6d, + 0x8e, 0x2c, 0x67, 0x4e, 0x9d, 0xb7, 0x3e, 0xa3, 0xe0, 0x13, 0x5e, 0xfa, + 0x21, 0x79, 0x6a, 0x3b, 0xf1, 0x7b, 0x3b, 0xb9, 0x74, 0xb6, 0x14, 0xac, + 0x70, 0x14, 0x24, 0x87, 0x2f, 0x8b, 0xfd, 0xed, 0xe3, 0x54, 0xe2, 0xfb, + 0xa6, 0xd9, 0xba, 0x21, 0x43, 0x66, 0x3e, 0x0c, 0x8b, 0xfc, 0x65, 0x99, + 0x6f, 0xaf, 0x15, 0xe0, 0xcb, 0x7c, 0x4f, 0x4b, 0x31, 0x1c, 0xc8, 0x0f, + 0xa0, 0x50, 0x63, 0x84, 0xaf, 0x84, 0x83, 0x87, 0x06, 0xe8, 0x57, 0x2b, + 0x87, 0xe9, 0xce, 0xae, 0xed, 0xd7, 0xc7, 0xb9, 0x31, 0x77, 0x6d, 0x99, + 0xa3, 0x48, 0x4e, 0xbe, 0x40, 0xf6, 0xa3, 0x98, 0x32, 0x61, 0x47, 0xeb, + 0x74, 0x3f, 0xe5, 0x17, 0xef, 0x48, 0x6b, 0x5a, 0x89, 0xbc, 0x58, 0xbf, + 0x70, 0x0d, 0x46, 0xc7, 0x80, 0xd3, 0x34, 0xb0, 0x20, 0x10, 0x00, 0xd9, + 0x08, 0x80, 0xe6, 0x25, 0x5a, 0x32, 0xf9, 0xe0, 0x0d, 0x72, 0x31, 0xb6, + 0xc0, 0xfd, 0xc9, 0xd7, 0xbc, 0xe8, 0x08, 0x52, 0xdd, 0xa2, 0x00, 0x46, + 0xd4, 0x65, 0xbf, 0x28, 0xb4, 0xfd, 0xc1, 0x04, 0xa9, 0x54, 0x25, 0xc8, + 0x94, 0x95, 0x92, 0x3c, 0xec, 0xc9, 0x28, 0x4c, 0xb9, 0x6f, 0x72, 0x06, + 0x7e, 0xc3, 0xd1, 0x95, 0x41, 0x48, 0xfc, 0x2d, 0x43, 0x77, 0x31, 0x1a, + 0x4a, 0x42, 0x60, 0x14, 0x77, 0x15, 0xba, 0x4d, 0x3a, 0xea, 0xee, 0x45, + 0x2d, 0xbe, 0xdd, 0x62, 0x5c, 0x2f, 0x75, 0xf5, 0x01, 0x0d, 0xf1, 0x20, + 0xbc, 0xd9, 0x9d, 0x1e, 0x76, 0x6b, 0xf0, 0x5c, 0xbc, 0xc5, 0x48, 0x94, + 0x3f, 0xd6, 0x20, 0x2a, 0xaf, 0x77, 0x86, 0xc4, 0xcf, 0x21, 0xc3, 0xc7, + 0x4e, 0x1f, 0xde, 0xfa, 0x7c, 0xec, 0xa2, 0x00, 0x59, 0x8c, 0xa3, 0x2f, + 0x3d, 0x6e, 0xdb, 0xc8, 0x1c, 0x1e, 0xb2, 0x7f, 0xab, 0xc6, 0xea, 0xfc, + 0x24, 0x55, 0xba, 0x83, 0x23, 0xef, 0x4c, 0xcc, 0x28, 0x24, 0x9a, 0xa4, + 0xb3, 0xa2, 0x6f, 0xfe, 0x51, 0x71, 0xa1, 0xf8, 0xda, 0x53, 0x80, 0x9e, + 0x4e, 0x21, 0x9b, 0x18, 0xea, 0x44, 0xa2, 0x1c, 0x5a, 0x8c, 0x3a, 0xff, + 0xa2, 0x68, 0x94, 0x8d, 0x9d, 0x00, 0x45, 0xf3, 0x49, 0xa4, 0x0c, 0xe5, + 0xca, 0x5d, 0x4e, 0xeb, 0x0d, 0x84, 0xff, 0x5e, 0xf4, 0x23, 0x5e, 0x56, + 0xc6, 0x72, 0xeb, 0x9e, 0xd5, 0x21, 0x63, 0xfa, 0xd3, 0x67, 0xb7, 0x19, + 0xe4, 0x85, 0x2a, 0xcd, 0xd1, 0x12, 0xfd, 0x51, 0xe7, 0x91, 0xac, 0x85, + 0xbd, 0xad, 0xbd, 0x48, 0x90, 0x95, 0x3b, 0x5b, 0x12, 0xdd, 0x6e, 0x82, + 0x28, 0xa8, 0xb4, 0x7d, 0xf3, 0x44, 0xe8, 0x88, 0x5a, 0x1d, 0x5d, 0xca, + 0x03, 0xae, 0x75, 0xf8, 0xbe, 0x03, 0xd8, 0x58, 0x89, 0x50, 0x9b, 0xd0, + 0xf8, 0x45, 0x67, 0x8e, 0xfd, 0x1d, 0xfd, 0x17, 0x39, 0xbf, 0x50, 0x63, + 0xb6, 0x36, 0xcc, 0x6b, 0xfe, 0x17, 0xdf, 0xdc, 0xc0, 0x49, 0xae, 0xcd, + 0xf9, 0x19, 0x88, 0xb0, 0x21, 0x21, 0x0d, 0x2f, 0xe2, 0x5d, 0xa3, 0x0b, + 0x19, 0x45, 0xc4, 0xdd, 0xdb, 0x2a, 0x27, 0x96, 0xad, 0x7e, 0x25, 0x15, + 0x99, 0x1c, 0x69, 0x72, 0xe5, 0x49, 0xb1, 0x50, 0x62, 0x7c, 0x2f, 0x1b, + 0x66, 0xea, 0x0b, 0x5b, 0xae, 0xaa, 0x3a, 0x8e, 0x63, 0x6b, 0x10, 0xfd, + 0x6d, 0x70, 0x07, 0x11, 0xb4, 0x1b, 0xf5, 0xe5, 0xfb, 0x2f, 0x46, 0x08, + 0x8f, 0x38, 0xbd, 0xc8, 0x84, 0x1e, 0x3a, 0xf8, 0x00, 0x23, 0x4f, 0x37, + 0xb1, 0xc7, 0x1f, 0x1c, 0x57, 0x85, 0xe5, 0x4d, 0xc6, 0x27, 0x38, 0xf0, + 0x8c, 0xba, 0xaf, 0x77, 0xad, 0xac, 0xab, 0xfe, 0xd6, 0x42, 0x12, 0xeb, + 0xc1, 0x8d, 0x1c, 0x64, 0x51, 0x3c, 0x8d, 0xa2, 0xde, 0x31, 0x00, 0x75, + 0x6b, 0xd5, 0x64, 0xb8, 0x6e, 0xfa, 0x49, 0xb9, 0x75, 0x32, 0x9e, 0xd6, + 0xcd, 0x64, 0x7a, 0x82, 0xb4, 0xc4, 0x3a, 0x5d, 0x40, 0xe8, 0x5d, 0xc5, + 0x8c, 0x94, 0xac, 0x50, 0x8a, 0xf4, 0x62, 0x80, 0x80, 0x73, 0x8a, 0xe3, + 0x08, 0x20, 0x47, 0xcb, 0x21, 0xb9, 0x3a, 0x0c, 0xf1, 0x44, 0xdf, 0x82, + 0xf0, 0x5c, 0xed, 0xd8, 0x3c, 0x1f, 0x52, 0x89, 0x18, 0xd6, 0x5e, 0x07, + 0xe9, 0x50, 0x5e, 0x89, 0x9f, 0xa9, 0xef, 0x74, 0x04, 0xd5, 0x5e, 0xbe, + 0x7c, 0xf2, 0xf3, 0x7a, 0xdd, 0x50, 0x19, 0xe7, 0x22, 0x4e, 0x3e, 0xc1, + 0x9f, 0x43, 0xc3, 0x06, 0x3a, 0x04, 0xaf, 0xe7, 0x24, 0x7f, 0xf5, 0x06, + 0x07, 0xd1, 0xec, 0x64, 0x07, 0xc1, 0xdc, 0xa1, 0xac, 0x62, 0x3a, 0x3d, + 0xc0, 0x37, 0x6c, 0xbe, 0x52, 0xa1, 0x44, 0x00, 0x15, 0xfe, 0xb1, 0xd8, + 0x97, 0x7f, 0x86, 0x96, 0xb1, 0x9b, 0xfe, 0x3b, 0x88, 0x4a, 0xf0, 0x3d, + 0x8d, 0x91, 0x6f, 0x32, 0x77, 0xa0, 0x2c, 0x3e, 0x44, 0x4b, 0xaa, 0xc8, + 0x99, 0xc0, 0x10, 0xe1, 0xb7, 0x88, 0x64, 0xf6, 0x3a, 0x40, 0x3c, 0x13, + 0xcf, 0xd8, 0x78, 0x03, 0xd2, 0xa7, 0x53, 0x8b, 0xdc, 0x4e, 0xe4, 0xa8, + 0x47, 0x62, 0x0c, 0x64, 0x6d, 0x26, 0x2f, 0xe0, 0x24, 0x29, 0x5b, 0x0f, + 0x5d, 0x46, 0x05, 0x63, 0x32, 0x44, 0xf8, 0xaf, 0xc5, 0x7c, 0x19, 0xee, + 0x21, 0x9f, 0xd9, 0x39, 0x74, 0xe0, 0x4a, 0xd1, 0xe4, 0x89, 0x4a, 0x60, + 0x75, 0xa8, 0xef, 0x57, 0x90, 0x4d, 0xd2, 0xb9, 0xd5, 0xa3, 0x83, 0x0a, + 0xb0, 0x0a, 0xec, 0x7c, 0x9d, 0xd4, 0x41, 0x1d, 0x81, 0xe3, 0x6e, 0x3c, + 0xc8, 0xe6, 0xdc, 0xdd, 0x9b, 0xda, 0x46, 0x30, 0x5a, 0xab, 0xbf, 0xf4, + 0x5e, 0x0d, 0x22, 0x27, 0x60, 0x7b, 0x38, 0x8c, 0x6b, 0x52, 0x56, 0xb0, + 0xac, 0x8d, 0x1f, 0xd0, 0x9d, 0x0f, 0x28, 0x83, 0x73, 0x7d, 0x3a, 0x02, + 0x28, 0x29, 0x0d, 0x0f, 0x11, 0x11, 0x41, 0xda, 0xb6, 0x2f, 0x71, 0x94, + 0x4b, 0x46, 0x90, 0xb6, 0x0b, 0x03, 0x1b, 0xfc, 0x33, 0x80, 0x65, 0xc7, + 0xf8, 0xba, 0x5f, 0xc4, 0x6f, 0x11, 0x64, 0xb6, 0xcb, 0x3d, 0x97, 0x52, + 0xe3, 0x15, 0xca, 0x72, 0x29, 0xbc, 0x0f, 0x26, 0x8a, 0x93, 0x54, 0xc9, + 0x43, 0x9b, 0x5c, 0x52, 0xb8, 0x7c, 0x3d, 0x3a, 0xa5, 0x0a, 0x2f, 0x6c, + 0xfc, 0x70, 0x96, 0xb3, 0x7a, 0xd5, 0xec, 0x24, 0x14, 0xb0, 0x58, 0x74, + 0x27, 0xf8, 0x35, 0x6a, 0x4b, 0x13, 0xa4, 0x5a, 0x86, 0x9c, 0x01, 0x5d, + 0xdb, 0x27, 0x75, 0xfa, 0x36, 0xed, 0x03, 0x9b, 0x30, 0x4f, 0x6a, 0x09, + 0xa3, 0x9d, 0x90, 0x20, 0xbe, 0x98, 0x97, 0xe2, 0x19, 0x03, 0x39, 0xd7, + 0xca, 0x67, 0x70, 0xf6, 0xe2, 0x25, 0x21, 0x15, 0x13, 0xc5, 0x00, 0x90, + 0x1a, 0x9c, 0x68, 0x10, 0x88, 0x8f, 0x56, 0xf1, 0x08, 0x47, 0xf4, 0xea, + 0x78, 0x76, 0xf5, 0x7a, 0xe4, 0x09, 0xe2, 0x63, 0x1a, 0x41, 0x89, 0xd6, + 0xa2, 0xb1, 0x4c, 0x8e, 0xcb, 0xb5, 0x65, 0xe4, 0xd6, 0x85, 0x05, 0x8a, + 0x2b, 0x31, 0xe2, 0xd3, 0xb2, 0x1b, 0xba, 0xcd, 0x81, 0x66, 0x4b, 0x5e, + 0xf4, 0x63, 0xea, 0x41, 0x5c, 0x32, 0x9e, 0xdb, 0xd6, 0xb3, 0xca, 0xa6, + 0x51, 0x76, 0x9c, 0x3e, 0x0f, 0xb7, 0x9b, 0x1a, 0xc4, 0x95, 0x9e, 0x6b, + 0x4e, 0x2e, 0x2f, 0x66, 0x84, 0x4d, 0xe4, 0x37, 0x89, 0xec, 0x9d, 0xc0, + 0xbc, 0xea, 0x67, 0x7b, 0x79, 0x4b, 0xeb, 0xfa, 0x44, 0xdb, 0x07, 0xd0, + 0xb3, 0xc2, 0xb7, 0x3d, 0x18, 0x18, 0x50, 0xd0, 0x37, 0x67, 0x3c, 0x47, + 0x9c, 0xef, 0xb0, 0x46, 0x31, 0xeb, 0x7c, 0x71, 0x19, 0x9c, 0x8c, 0xd7, + 0x2c, 0x66, 0xa0, 0x61, 0x0d, 0x24, 0x38, 0x16, 0x41, 0xda, 0xd5, 0x45, + 0x46, 0xf7, 0xc9, 0x11, 0x31, 0x6d, 0xc3, 0xad, 0xcd, 0xbb, 0x63, 0x35, + 0xb2, 0x34, 0xe0, 0x69, 0x52, 0x69, 0xd7, 0xc1, 0xa4, 0x88, 0x4e, 0xf6, + 0x38, 0xce, 0x74, 0x2e, 0xdf, 0x83, 0xd9, 0x44, 0xaa, 0x2c, 0x7c, 0x5e, + 0x36, 0x30, 0x26, 0x25, 0x91, 0x62, 0xd5, 0xe2, 0x08, 0xdf, 0xfd, 0xb5, + 0xe7, 0x79, 0xbf, 0x80, 0x04, 0xf1, 0xac, 0xa7, 0x61, 0xd2, 0xa9, 0xe3, + 0xf3, 0x05, 0xad, 0xeb, 0x40, 0x39, 0xdf, 0x37, 0xa8, 0xde, 0x72, 0x3b, + 0xf0, 0x1b, 0x41, 0x45, 0x6e, 0xb5, 0x1e, 0x0d, 0x24, 0x9c, 0x10, 0x36, + 0x06, 0xca, 0x3d, 0x4d, 0x3c, 0x1c, 0x59, 0x71, 0xf4, 0x88, 0x66, 0xd0, + 0x80, 0xfa, 0x0a, 0xf8, 0x44, 0x86, 0xa5, 0xcc, 0xdd, 0x34, 0xe8, 0x12, + 0xdb, 0x30, 0xf7, 0x70, 0xa7, 0x3f, 0x45, 0xf4, 0x78, 0x25, 0x38, 0x4d, + 0x4d, 0x67, 0xc1, 0xad, 0xf0, 0xbe, 0x36, 0xa9, 0x44, 0x11, 0x17, 0x16, + 0x53, 0x1e, 0x6d, 0xf1, 0xbc, 0x35, 0x63, 0xea, 0x90, 0x0e, 0x40, 0xa5, + 0x19, 0xd5, 0xa3, 0x4c, 0x66, 0x27, 0xeb, 0x66, 0xe4, 0xf1, 0xc3, 0x79, + 0x47, 0xa9, 0x0c, 0x61, 0x48, 0x5a, 0x42, 0x20, 0x2a, 0x21, 0xb7, 0x12, + 0x1a, 0x7c, 0x13, 0x17, 0x08, 0x39, 0xef, 0xe9, 0x1b, 0xe5, 0x3b, 0xb0, + 0xfe, 0x28, 0xf2, 0x48, 0x3e, 0x7a, 0x27, 0xfb, 0xbc, 0x48, 0xbf, 0xf5, + 0xbd, 0xad, 0x3a, 0x90, 0x70, 0xf7, 0x0f, 0x6b, 0xb8, 0x76, 0x83, 0x09, + 0x9f, 0x24, 0xd4, 0x67, 0x25, 0x0f, 0x11, 0x60, 0x6e, 0x87, 0x05, 0x57, + 0x6d, 0x6f, 0x64, 0xc0, 0xff, 0xca, 0xdd, 0x81, 0xec, 0xb0, 0x8f, 0x66, + 0x24, 0x0a, 0x3d, 0xbe, 0xd7, 0xee, 0xa7, 0x5f, 0x26, 0xe8, 0x4e, 0xe5, + 0xa1, 0xfc, 0x65, 0xc2, 0x8c, 0x7e, 0x05, 0x85, 0x39, 0xa9, 0x7d, 0x24, + 0x3e, 0x25, 0x0d, 0x0c, 0xf4, 0xf8, 0x3b, 0xaa, 0x25, 0x6b, 0x9c, 0xdf, + 0xab, 0x0c, 0x6b, 0x3f, 0xc5, 0xca, 0x6e, 0x5a, 0x66, 0x38, 0x36, 0x64, + 0x73, 0xbe, 0xaa, 0x02, 0xcf, 0xf7, 0xb4, 0xe0, 0xc6, 0x60, 0xb7, 0xd8, + 0xf1, 0x65, 0xeb, 0xe8, 0x38, 0xc1, 0xb6, 0xc9, 0xf3, 0x49, 0xfa, 0x09, + 0xc8, 0x58, 0x9f, 0x85, 0x24, 0xab, 0x5a, 0xb8, 0x29, 0xa2, 0x0b, 0x6f, + 0x30, 0x52, 0xe3, 0xb1, 0xb2, 0x6d, 0x02, 0x1a, 0x33, 0x3d, 0xc0, 0xfd, + 0xee, 0x2b, 0xfa, 0xb9, 0xe2, 0x82, 0x08, 0x17, 0x17, 0x5c, 0x20, 0x11, + 0x62, 0x1b, 0x82, 0x47, 0x99, 0xdb, 0x24, 0xac, 0x1a, 0xaf, 0x91, 0xef, + 0xb0, 0x0c, 0x2c, 0x5f, 0x23, 0x26, 0x65, 0x2f, 0x75, 0x9b, 0xc2, 0x85, + 0x5b, 0x45, 0x86, 0xad, 0x6f, 0x43, 0x95, 0x5f, 0xdb, 0xf2, 0x45, 0x7a, + 0xa7, 0x1c, 0x2e, 0x52, 0xc2, 0x68, 0x25, 0xda, 0x43, 0xab, 0x1a, 0xcb, + 0x56, 0x82, 0xb0, 0xbf, 0xf2, 0x7e, 0xa5, 0xb0, 0x0f, 0xd4, 0x0c, 0x45, + 0x51, 0x07, 0x23, 0xfe, 0x56, 0x4b, 0x90, 0xe2, 0xc9, 0xb0, 0x7b, 0xd2, + 0x02, 0x67, 0xb8, 0x79, 0x10, 0x5a, 0x19, 0x9b, 0xaa, 0xe8, 0xae, 0x05, + 0xae, 0x2d, 0x61, 0xe6, 0xd2, 0x8a, 0xf0, 0x33, 0x14, 0x65, 0x92, 0x52, + 0x24, 0xf7, 0xb2, 0xf2, 0xa3, 0x22, 0xb3, 0xf2, 0xf9, 0x86, 0x4d, 0x7d, + 0x4b, 0x91, 0x82, 0x6e, 0x7b, 0x85, 0x6d, 0xda, 0x8a, 0xf4, 0xf9, 0xf9, + 0x8e, 0x31, 0x8a, 0x55, 0x9a, 0xc2, 0xcc, 0xf4, 0x97, 0xdc, 0x8c, 0x9d, + 0x6b, 0x23, 0xd5, 0x97, 0x64, 0x36, 0x2a, 0xe9, 0x7d, 0x0c, 0x89, 0xe2, + 0x3b, 0x8a, 0x5c, 0xb3, 0xae, 0xe6, 0x0d, 0xa9, 0x4d, 0x50, 0x10, 0x79, + 0x64, 0x00, 0x64, 0x5b, 0x3c, 0xd1, 0x0b, 0x92, 0x0e, 0xcf, 0xae, 0x6c, + 0x99, 0x53, 0x46, 0x30, 0x1b, 0xee, 0x59, 0xef, 0x8a, 0xdb, 0x4e, 0x69, + 0xfd, 0x39, 0x23, 0x24, 0xd4, 0x7f, 0x69, 0x03, 0x80, 0x50, 0x15, 0x7a, + 0x6f, 0xa7, 0xcb, 0x7a, 0x8f, 0x8e, 0x30, 0xcd, 0x56, 0x5a, 0x5b, 0x1e, + 0x79, 0x24, 0x7a, 0xa8, 0xa5, 0x88, 0x2f, 0xe7, 0x12, 0x16, 0x01, 0x4f, + 0x43, 0x47, 0x51, 0x30, 0xc9, 0x64, 0xd7, 0x53, 0xc4, 0x5d, 0xba, 0xa5, + 0xde, 0xf0, 0x96, 0xbe, 0x2a, 0x57, 0x2f, 0x6b, 0x19, 0xcc, 0x66, 0xf6, + 0x3b, 0x2f, 0xe6, 0x22, 0xf1, 0x7c, 0x74, 0xad, 0x8b, 0x31, 0xde, 0xfa, + 0x6d, 0x1a, 0x17, 0x6c, 0x40, 0xc3, 0x89, 0x45, 0xb2, 0x67, 0xd3, 0x27, + 0xc4, 0x23, 0xe1, 0xa1, 0x09, 0x5c, 0x7d, 0xf0, 0xef, 0x9e, 0xdb, 0x1f, + 0x03, 0x18, 0xcd, 0x24, 0x03, 0x4d, 0xa2, 0x20, 0x4b, 0xe7, 0x53, 0xb0, + 0x43, 0xe0, 0x9c, 0x1c, 0xac, 0xad, 0xea, 0x3d, 0xbc, 0x8e, 0x05, 0x0a, + 0x90, 0xaa, 0xad, 0x58, 0x5e, 0x3c, 0x03, 0x47, 0x88, 0xd7, 0x05, 0xfd, + 0xd2, 0x53, 0xe3, 0xdf, 0x16, 0x89, 0x9d, 0x59, 0x61, 0x1c, 0x43, 0x26, + 0xb9, 0x10, 0x41, 0x73, 0x70, 0x18, 0xbf, 0xc3, 0xe3, 0x22, 0xb2, 0x0a, + 0xe1, 0x31, 0x86, 0x74, 0x0a, 0xeb, 0x67, 0x2d, 0xa5, 0x34, 0x3f, 0xec, + 0xa7, 0x29, 0x23, 0x4a, 0x9e, 0x77, 0x52, 0x92, 0x1c, 0xb0, 0x8c, 0x99, + 0x71, 0xaa, 0x9b, 0xfb, 0x91, 0xcf, 0x15, 0xbb, 0x2a, 0x7d, 0x74, 0x7c, + 0x1c, 0x5a, 0x82, 0x7d, 0x18, 0x59, 0x18, 0x85, 0xcd, 0xf2, 0xf4, 0xa3, + 0x76, 0x18, 0x55, 0x21, 0x05, 0xbc, 0xcc, 0x41, 0xec, 0xa7, 0x8a, 0x03, + 0x38, 0x2a, 0xca, 0x02, 0x94, 0xd0, 0xe4, 0xad, 0xd3, 0x74, 0xda, 0x2c, + 0x11, 0xad, 0xcb, 0x02, 0x1f, 0x5e, 0x6a, 0x59, 0xc0, 0x1e, 0x75, 0x3e, + 0x35, 0x49, 0x6f, 0x20, 0x4f, 0x34, 0x61, 0x5e, 0xec, 0x03, 0x36, 0x84, + 0x45, 0xa2, 0x88, 0x57, 0xcc, 0x22, 0xbb, 0xc9, 0x35, 0x42, 0x15, 0xae, + 0x9a, 0xf6, 0x28, 0x75, 0xe4, 0xef, 0xa6, 0xd8, 0xa0, 0x55, 0x66, 0x32, + 0xbf, 0x7c, 0x28, 0xe0, 0x3d, 0x99, 0xbb, 0x02, 0xc0, 0xaa, 0xcf, 0xec, + 0x1a, 0xdd, 0xaf, 0xff, 0xa1, 0x91, 0xe3, 0xb8, 0xfb, 0xa6, 0x34, 0x17, + 0xe6, 0xeb, 0xeb, 0xf8, 0xed, 0xcd, 0x53, 0x13, 0x3e, 0x8f, 0xc9, 0xac, + 0x65, 0x0c, 0x60, 0x24, 0x11, 0x50, 0xf5, 0x5a, 0x34, 0x2f, 0x58, 0xd1, + 0x7c, 0x5c, 0xf5, 0x68, 0x98, 0xb1, 0x45, 0x3c, 0xc8, 0x83, 0xa5, 0x05, + 0x43, 0xa3, 0xe8, 0x9c, 0x81, 0xcd, 0x0b, 0xf1, 0x41, 0xeb, 0x53, 0x52, + 0x39, 0x22, 0x1e, 0xe3, 0xdd, 0x55, 0x45, 0x87, 0x8e, 0xfd, 0x1c, 0x99, + 0xf8, 0x50, 0x22, 0x07, 0x16, 0x53, 0xa2, 0x15, 0xae, 0x99, 0x46, 0x4f, + 0xcc, 0x8f, 0xca, 0x1c, 0xd9, 0x4d, 0x3a, 0x3f, 0x12, 0x0c, 0xd4, 0x3c, + 0x38, 0xfa, 0xc3, 0xd5, 0x96, 0x91, 0x0e, 0xe7, 0xd6, 0x42, 0x8e, 0x60, + 0xe6, 0xdf, 0x13, 0x23, 0x78, 0xa6, 0x75, 0x6b, 0x2d, 0xa8, 0xa4, 0xc8, + 0x9d, 0x87, 0x49, 0x95, 0xd3, 0x95, 0xa7, 0xde, 0xbb, 0x5e, 0x14, 0xa1, + 0xa1, 0x18, 0x34, 0x7e, 0x0c, 0x60, 0xf2, 0x13, 0xb8, 0xdb, 0x23, 0x99, + 0x44, 0x47, 0xcb, 0xdf, 0xa3, 0x89, 0xb1, 0x9c, 0x85, 0x0e, 0x1b, 0xce, + 0x8a, 0x54, 0xbd, 0x13, 0x03, 0xe7, 0x1c, 0x79, 0xef, 0x5f, 0xed, 0x58, + 0xa3, 0x0f, 0x07, 0x50, 0xf5, 0x49, 0x10, 0xb0, 0x77, 0xf7, 0x2d, 0x82, + 0x91, 0x4d, 0xf4, 0xec, 0x52, 0x83, 0x7b, 0x7e, 0x98, 0x19, 0x0e, 0x5e, + 0x6e, 0x3f, 0x70, 0xc5, 0x52, 0x1f, 0xcb, 0x7e, 0xdd, 0x6d, 0x5b, 0x44, + 0x34, 0xd7, 0x2c, 0x1d, 0xaa, 0xf0, 0x8a, 0x37, 0xaf, 0xfa, 0xca, 0xdf, + 0x4d, 0xd5, 0x1d, 0x24, 0x8a, 0xc2, 0x1d, 0x83, 0x1a, 0xfc, 0xfe, 0x94, + 0xf1, 0x52, 0xa9, 0xb1, 0x16, 0x79, 0xda, 0xc0, 0x96, 0x48, 0xc5, 0xfa, + 0x4e, 0xf6, 0x59, 0x1d, 0x8b, 0x2f, 0xe6, 0xa6, 0x10, 0xd3, 0xd8, 0x6e, + 0x58, 0x0b, 0x4f, 0x22, 0x4b, 0x87, 0x50, 0x64, 0x55, 0x00, 0x87, 0x27, + 0x5f, 0xf5, 0xa4, 0x71, 0xd2, 0x18, 0xe6, 0xe5, 0x8b, 0xa3, 0x7d, 0x4d, + 0xbf, 0xcf, 0x7f, 0xb9, 0x36, 0xbe, 0x80, 0x9d, 0x8e, 0xc8, 0x62, 0x49, + 0xda, 0x32, 0x38, 0x29, 0xda, 0xa6, 0xb1, 0x3e, 0x32, 0xbd, 0x32, 0x0c, + 0x50, 0x34, 0xa5, 0x08, 0x04, 0x7b, 0x96, 0x66, 0xfb, 0x8c, 0x5d, 0xa4, + 0x13, 0xed, 0x0a, 0x3e, 0xe4, 0xcd, 0x03, 0x75, 0x22, 0xee, 0x9a, 0x7d, + 0x1f, 0x99, 0x69, 0x59, 0xca, 0xa3, 0x0c, 0x0d, 0x15, 0xb3, 0xa3, 0x07, + 0x16, 0xae, 0xa8, 0xcf, 0xdc, 0xec, 0xd3, 0xeb, 0x10, 0xf2, 0xc5, 0xa2, + 0xb3, 0x47, 0x0c, 0x9d, 0x53, 0x58, 0xde, 0xbd, 0xa1, 0x0d, 0xfc, 0x01, + 0x51, 0x12, 0x36, 0x9a, 0xf2, 0x13, 0x0c, 0xeb, 0xa1, 0x9f, 0x41, 0x65, + 0xeb, 0x9c, 0x17, 0xc6, 0x7a, 0x35, 0xee, 0xde, 0xfb, 0xba, 0xa5, 0x46, + 0x51, 0x96, 0xf8, 0x65, 0xbf, 0x83, 0x53, 0x02, 0xbb, 0xa3, 0x76, 0xe3, + 0x2b, 0x87, 0x2d, 0xd2, 0x4d, 0xdc, 0xa3, 0x36, 0x8b, 0xe8, 0x5d, 0xbb, + 0xdb, 0x55, 0xe3, 0xca, 0xca, 0xbc, 0xa2, 0xd7, 0x8d, 0x24, 0x4f, 0x90, + 0xc7, 0x27, 0xd1, 0xf4, 0x05, 0x56, 0xdd, 0xc7, 0x1d, 0x6b, 0xab, 0x36, + 0x4c, 0xdf, 0x56, 0x45, 0x7d, 0x67, 0xad, 0x2c, 0x01, 0xb4, 0x5c, 0x90, + 0xf9, 0x34, 0x8a, 0xb2, 0xe2, 0x10, 0xe3, 0x4a, 0x89, 0x01, 0xe0, 0xda, + 0xb1, 0x3f, 0x47, 0x30, 0x9f, 0xb1, 0x62, 0xf2, 0x42, 0x7f, 0xa3, 0xbb, + 0xcc, 0x34, 0x69, 0xb7, 0xa1, 0x5b, 0x3c, 0xe2, 0xc7, 0xc6, 0xfa, 0x33, + 0x5c, 0xc0, 0xd7, 0x93, 0xe1, 0xd5, 0x00, 0xcb, 0x41, 0x42, 0x92, 0xc2, + 0x80, 0x10, 0x2d, 0x52, 0x4a, 0x33, 0xbf, 0x19, 0xb2, 0x0d, 0x5f, 0x8a, + 0xac, 0x6d, 0xf7, 0x3c, 0xe1, 0xa6, 0x34, 0xb5, 0x76, 0xa5, 0x70, 0x5d, + 0x16, 0xb7, 0xa5, 0x46, 0x65, 0x39, 0xfe, 0xde, 0xbc, 0x61, 0x8c, 0x4d, + 0xfc, 0x7c, 0xe1, 0x61, 0xf8, 0xb0, 0x93, 0x17, 0x57, 0x4b, 0xfd, 0x60, + 0x32, 0x35, 0xc5, 0x0e, 0xf8, 0x11, 0xef, 0x80, 0x9f, 0x80, 0x96, 0x04, + 0x53, 0x22, 0x54, 0xb0, 0xcb, 0xc6, 0x8c, 0x84, 0xdb, 0x27, 0x52, 0x44, + 0x3d, 0xc6, 0x21, 0xce, 0xcc, 0x88, 0xd7, 0x38, 0xd3, 0x00, 0x6e, 0x67, + 0xd4, 0xed, 0xd3, 0x66, 0xc6, 0xd7, 0x8d, 0x0f, 0xc7, 0x44, 0x42, 0x90, + 0x6f, 0xfb, 0xf6, 0x27, 0x7a, 0x83, 0x33, 0x70, 0xa4, 0x1f, 0x1e, 0xb4, + 0x7f, 0x1c, 0x5a, 0xb0, 0xec, 0x0b, 0x9f, 0x7c, 0x5c, 0x7a, 0x55, 0x31, + 0xa2, 0xc0, 0x72, 0x43, 0xb4, 0xa9, 0x81, 0x69, 0x65, 0xa4, 0x94, 0x7e, + 0x50, 0xbc, 0xa4, 0x5d, 0x6b, 0x5b, 0xdd, 0xa7, 0xc2, 0xbd, 0x16, 0x31, + 0xa1, 0x53, 0x87, 0x7b, 0x3b, 0x7f, 0xa6, 0x20, 0x42, 0x6e, 0x1f, 0xe1, + 0xbd, 0x86, 0x28, 0x8d, 0x91, 0x0d, 0xc7, 0xf8, 0x31, 0xc7, 0x5f, 0xc2, + 0xb9, 0x24, 0xdb, 0xdf, 0x08, 0x85, 0x27, 0xfd, 0xb7, 0xa2, 0x86, 0xad, + 0xfe, 0x59, 0x5a, 0x39, 0x67, 0x11, 0x7d, 0x08, 0xdf, 0xef, 0x7c, 0x1e, + 0xa5, 0x22, 0x0f, 0x00, 0x11, 0xf0, 0x35, 0xc6, 0xe0, 0xaa, 0x1f, 0x55, + 0xeb, 0xfe, 0x81, 0xac, 0xbf, 0xd7, 0xfd, 0xeb, 0x1f, 0x17, 0x9c, 0xe3, + 0x7a, 0xe0, 0x3e, 0xe2, 0xef, 0xb7, 0x35, 0xbf, 0x78, 0x12, 0x4c, 0x9e, + 0xb1, 0xec, 0x65, 0xdb, 0x44, 0x6d, 0x81, 0x1b, 0x15, 0x90, 0xec, 0x94, + 0x38, 0xd1, 0xc9, 0x31, 0x21, 0x8a, 0x4f, 0x0b, 0xf3, 0x6f, 0x1d, 0xee, + 0x34, 0x14, 0xdb, 0xcd, 0xd2, 0xea, 0x0f, 0xd5, 0xff, 0x02, 0x36, 0x3c, + 0xbd, 0x40, 0x33, 0xce, 0x02, 0x94, 0x39, 0x22, 0xa7, 0x08, 0x3f, 0xd1, + 0xee, 0x0c, 0x33, 0x65, 0xb1, 0xf5, 0xe7, 0x43, 0x74, 0x63, 0xc8, 0x3c, + 0x5a, 0xbb, 0x9c, 0x86, 0x0d, 0x7d, 0x9d, 0x68, 0xaf, 0xaf, 0xcd, 0x3c, + 0x56, 0x0f, 0x50, 0x1a, 0x2d, 0x39, 0xe8, 0x92, 0xab, 0x86, 0xb3, 0x6f, + 0xa4, 0x6e, 0xe4, 0x57, 0xe8, 0xb7, 0x0e, 0x1b, 0x95, 0x14, 0xf9, 0x4c, + 0xb4, 0xdc, 0x19, 0x32, 0x42, 0x63, 0x72, 0x19, 0xa4, 0x6d, 0xb0, 0xef, + 0xe2, 0xb5, 0x59, 0xcf, 0xfc, 0x4f, 0xcf, 0xe2, 0x6c, 0x14, 0xd5, 0xb7, + 0x6f, 0x8b, 0x64, 0x93, 0x03, 0xca, 0x50, 0xf5, 0x31, 0x27, 0xbd, 0x3c, + 0xb2, 0x9f, 0xdc, 0xe6, 0x93, 0x31, 0xb2, 0xac, 0x4b, 0xe7, 0x3e, 0x11, + 0xf9, 0x4c, 0xb8, 0x9c, 0xa6, 0xe5, 0x75, 0x25, 0x98, 0xaf, 0x20, 0x47, + 0x14, 0x81, 0x35, 0xc7, 0xd3, 0x00, 0x0d, 0xa3, 0x2a, 0xe0, 0x36, 0x26, + 0x3a, 0xd9, 0x67, 0x85, 0xfa, 0x85, 0x87, 0x41, 0x64, 0x7a, 0x20, 0x5b, + 0x4a, 0x35, 0x6c, 0x95, 0x51, 0x2a, 0x1a, 0xc7, 0x04, 0x9f, 0x31, 0x7b, + 0x43, 0xa2, 0xcd, 0x3a, 0x8a, 0x6e, 0x63, 0x91, 0x79, 0x2f, 0x05, 0x56, + 0x3b, 0xab, 0xe9, 0x51, 0x3f, 0x05, 0x5b, 0x61, 0xa6, 0x43, 0xbf, 0x54, + 0x88, 0xdc, 0x24, 0x33, 0x4a, 0xc0, 0x67, 0x7b, 0xe5, 0x58, 0x0c, 0xd4, + 0xec, 0x98, 0x98, 0x26, 0xd1, 0xf6, 0xec, 0xf3, 0x51, 0xe3, 0x6c, 0xa1, + 0x6f, 0xcc, 0xcb, 0xc4, 0x8d, 0x1a, 0x69, 0x9f, 0x7e, 0x5d, 0xbd, 0x2c, + 0x21, 0x75, 0xa8, 0x7c, 0xe5, 0x57, 0xc4, 0x7a, 0x72, 0xa8, 0xea, 0xea, + 0x3e, 0xc7, 0xa2, 0xe0, 0x1b, 0x2a, 0x37, 0xb9, 0xc3, 0x84, 0x14, 0xed, + 0xe8, 0x31, 0x76, 0x07, 0xdc, 0x31, 0x64, 0xb0, 0x4c, 0xd2, 0x07, 0x8a, + 0x00, 0x25, 0x0d, 0x59, 0x17, 0x35, 0x51, 0x42, 0x64, 0xdb, 0x1f, 0x6f, + 0x42, 0x96, 0x4e, 0xa2, 0x09, 0xea, 0xcd, 0xd4, 0x2a, 0x08, 0x0e, 0xe9, + 0x94, 0xe8, 0x8a, 0xfe, 0x00, 0xe3, 0xb8, 0x0c, 0xc5, 0x27, 0xb6, 0x4e, + 0xd4, 0xb2, 0x84, 0x27, 0x7b, 0x93, 0x69, 0x64, 0xa9, 0x2f, 0x03, 0x0f, + 0x93, 0x1b, 0x7d, 0xf5, 0x2b, 0xac, 0x9e, 0xae, 0x44, 0x50, 0x23, 0xc9, + 0xef, 0xf1, 0x13, 0xbb, 0x21, 0xf5, 0x59, 0x7a, 0x9c, 0xa7, 0x4f, 0x81, + 0xf9, 0xc1, 0x3a, 0xcf, 0x2b, 0x3c, 0x54, 0x38, 0x6c, 0x2c, 0xe8, 0xa7, + 0x50, 0x35, 0xfc, 0x7e, 0xe9, 0x13, 0xb7, 0xc2, 0xee, 0xf5, 0x81, 0x36, + 0x08, 0x44, 0x58, 0xa4, 0xc6, 0x38, 0xc0, 0x02, 0xe5, 0x97, 0x90, 0xf9, + 0x90, 0x91, 0x4f, 0x9a, 0xa3, 0x7f, 0x98, 0x28, 0x43, 0xfc, 0x17, 0xfb, + 0x48, 0xb7, 0x8d, 0x37, 0x55, 0xe6, 0x97, 0xfb, 0x5d, 0xa9, 0x39, 0xf6, + 0xf7, 0xe7, 0xc8, 0xae, 0x33, 0xc2, 0xef, 0x72, 0x7e, 0x94, 0x89, 0x07, + 0xb5, 0x94, 0xf6, 0x01, 0x2b, 0x45, 0x8f, 0x6a, 0x43, 0x4d, 0x1c, 0xa5, + 0xf8, 0x90, 0x3e, 0x1e, 0xeb, 0x46, 0x43, 0xcb, 0x2f, 0x43, 0xeb, 0xb4, + 0x25, 0xc9, 0xba, 0xc0, 0x47, 0x6a, 0xc9, 0xcf, 0xcb, 0x0c, 0xfa, 0x44, + 0x58, 0x76, 0x86, 0x41, 0xc5, 0x7b, 0x76, 0x17, 0xea, 0x62, 0x3a, 0x12, + 0xf4, 0xbe, 0x72, 0xe2, 0xa7, 0x63, 0x35, 0x0b, 0x24, 0x3e, 0x44, 0x0e, + 0xc5, 0x96, 0x67, 0x3c, 0x74, 0x63, 0x48, 0x4d, 0xec, 0x22, 0xb9, 0x1e, + 0x6f, 0x17, 0x81, 0x2a, 0xc2, 0xd4, 0x07, 0x4e, 0x5a, 0xfa, 0xd2, 0x54, + 0xd5, 0x43, 0xa4, 0xeb, 0x5b, 0xb5, 0x30, 0x9b, 0x7d, 0xd3, 0xc2, 0xd5, + 0x6c, 0x61, 0xef, 0xd1, 0x19, 0x5e, 0x74, 0x4a, 0xc9, 0x92, 0xb2, 0xb6, + 0xf4, 0xf0, 0x01, 0x6e, 0xe5, 0xb5, 0xe1, 0xc5, 0x19, 0xcf, 0xa4, 0x0f, + 0x53, 0x7d, 0x17, 0xfc, 0x8f, 0xdd, 0x7e, 0xbd, 0x0e, 0xf8, 0x21, 0x87, + 0xbc, 0x5c, 0xf4, 0xd6, 0xf2, 0x57, 0x21, 0xe4, 0x5d, 0xb9, 0xa2, 0xfb, + 0x72, 0x1f, 0xdf, 0xf6, 0xdb, 0xbd, 0x76, 0x1b, 0x03, 0x81, 0x55, 0x5c, + 0x06, 0x49, 0x32, 0xa7, 0xde, 0x87, 0xba, 0x3e, 0x3d, 0x0f, 0x1d, 0xf3, + 0x62, 0xf9, 0x4d, 0x45, 0x6e, 0xc4, 0x8e, 0x88, 0x55, 0x52, 0x9b, 0xdb, + 0xe2, 0xdd, 0x3e, 0xe3, 0x0e, 0x55, 0x54, 0xec, 0x73, 0xe2, 0xca, 0x40, + 0xf9, 0x9c, 0x42, 0xde, 0xb7, 0x92, 0x15, 0x62, 0x6e, 0x78, 0x45, 0x7f, + 0x6b, 0x83, 0x41, 0xde, 0xb6, 0xd8, 0x96, 0x5d, 0x90, 0x97, 0x2a, 0xe5, + 0xf3, 0xd0, 0xc7, 0x34, 0x22, 0xee, 0x2d, 0x29, 0x84, 0x8b, 0x8c, 0x4f, + 0x52, 0xef, 0x91, 0xe7, 0x3e, 0xf7, 0x36, 0x53, 0x58, 0x28, 0xea, 0x70, + 0x44, 0x69, 0x16, 0x88, 0x82, 0xa6, 0xe5, 0x6a, 0x97, 0x8a, 0x71, 0x1c, + 0xe6, 0xf4, 0x66, 0x22, 0x70, 0x9f, 0x75, 0x39, 0x97, 0x88, 0xda, 0x76, + 0xf8, 0x8b, 0xf0, 0xe8, 0xad, 0x29, 0xc0, 0x83, 0x1d, 0xeb, 0xb7, 0x83, + 0xf2, 0x7a, 0x34, 0xa1, 0x22, 0x41, 0xd0, 0x4f, 0xb3, 0x37, 0x10, 0x90, + 0x64, 0x40, 0x1d, 0xb2, 0xed, 0xc8, 0x4d, 0x7c, 0x2b, 0x55, 0xe4, 0x78, + 0xcf, 0xc2, 0x2d, 0xbd, 0x7c, 0xdc, 0x94, 0xa9, 0x5f, 0xd2, 0x75, 0x42, + 0xb9, 0x44, 0x38, 0x26, 0x24, 0x71, 0x85, 0x05, 0xcd, 0xec, 0x1a, 0x8d, + 0x94, 0xe6, 0x16, 0x2f, 0x1e, 0x3c, 0xd7, 0x57, 0x89, 0x96, 0x12, 0x8f, + 0x49, 0x23, 0x68, 0xfc, 0xa6, 0xa0, 0x4e, 0x09, 0xf4, 0x33, 0xdf, 0x85, + 0x8d, 0xb3, 0xbd, 0x72, 0x49, 0x27, 0xaf, 0x9d, 0x67, 0x0f, 0xf0, 0x42, + 0xad, 0x01, 0x42, 0xb5, 0x34, 0x95, 0x77, 0x75, 0xd6, 0x2a, 0x8c, 0x64, + 0x53, 0x6f, 0x59, 0xbd, 0x4e, 0xba, 0x61, 0xae, 0xe6, 0x86, 0x8d, 0xb1, + 0x95, 0x21, 0xa1, 0xeb, 0x37, 0xc1, 0x79, 0x65, 0x70, 0xf7, 0x23, 0xb6, + 0xa6, 0x87, 0x14, 0xfa, 0xf9, 0xf4, 0x55, 0x04, 0xac, 0x3b, 0xbe, 0xdc, + 0x0e, 0xd1, 0x0f, 0x30, 0x67, 0x85, 0x6f, 0x24, 0x4e, 0x28, 0x1b, 0x15, + 0xc3, 0x26, 0xbc, 0xa1, 0x1e, 0xc7, 0x9c, 0xa4, 0xa9, 0x3e, 0x9f, 0x66, + 0x63, 0xef, 0xd4, 0x84, 0x1e, 0xad, 0x83, 0xe5, 0x88, 0x57, 0x1f, 0x57, + 0xe3, 0x71, 0x08, 0x39, 0x3e, 0x55, 0x3e, 0xb4, 0xdc, 0x8b, 0x7e, 0x49, + 0xce, 0x7b, 0x6c, 0xf3, 0xec, 0x1d, 0xf1, 0x31, 0xa5, 0x67, 0x66, 0x74, + 0x7d, 0xa6, 0xab, 0x34, 0x77, 0xff, 0x87, 0x38, 0x8b, 0xb6, 0xe4, 0x11, + 0xa4, 0xcb, 0x6c, 0x47, 0x3e, 0xc1, 0x56, 0x25, 0x6d, 0x0f, 0x85, 0x4a, + 0xe6, 0x5e, 0xf9, 0xda, 0xf1, 0x2f, 0xb3, 0x1c, 0x1f, 0xa3, 0x89, 0xee, + 0xba, 0x35, 0xbf, 0x5b, 0x70, 0x3b, 0x8f, 0x45, 0x4f, 0x5f, 0x5d, 0xdd, + 0x65, 0x60, 0xda, 0xca, 0xd8, 0x3b, 0x9a, 0x14, 0xb5, 0xd7, 0xd2, 0x1f, + 0x8d, 0xc5, 0x09, 0xbf, 0xa6, 0xc7, 0x09, 0xd7, 0x1b, 0xb3, 0xa1, 0x6f, + 0xf2, 0x9a, 0xa0, 0x17, 0x0b, 0x19, 0xfc, 0x11, 0x9e, 0x4f, 0x53, 0x8a, + 0x48, 0x1d, 0x41, 0xfe, 0xeb, 0x2f, 0x41, 0x2e, 0x58, 0xc9, 0x32, 0x52, + 0x96, 0x8f, 0x98, 0x6f, 0x90, 0xa9, 0xf6, 0x87, 0x6a, 0x83, 0x10, 0x13, + 0xb4, 0x2c, 0xcb, 0x6b, 0xaa, 0xea, 0x8b, 0xe9, 0x0a, 0x05, 0xbb, 0xbd, + 0xd4, 0x1c, 0x8c, 0xa4, 0x21, 0x6e, 0x08, 0x99, 0xcc, 0x6d, 0x5d, 0x18, + 0xe9, 0x13, 0x43, 0x91, 0xdd, 0x28, 0x1a, 0x2e, 0xb0, 0x72, 0x63, 0xbd, + 0x1f, 0x1f, 0x7a, 0xc6, 0x8f, 0xf2, 0x04, 0xae, 0x1d, 0x9a, 0x02, 0xec, + 0x8d, 0x53, 0x7d, 0xae, 0xf2, 0xf0, 0x2d, 0xec, 0x2a, 0xa4, 0xdd, 0xd8, + 0xbd, 0x01, 0x88, 0xc1, 0x91, 0xa8, 0xf5, 0x8f, 0x67, 0x65, 0x3d, 0xc0, + 0xee, 0x43, 0x5e, 0x66, 0xf7, 0x2b, 0x03, 0xc0, 0x46, 0x89, 0xde, 0xac, + 0x7d, 0x75, 0xae, 0x59, 0xbf, 0xae, 0x3f, 0x91, 0x13, 0xf0, 0x24, 0x84, + 0x88, 0xa4, 0xb9, 0x01, 0xd7, 0xe3, 0xe8, 0x2b, 0xde, 0x03, 0x48, 0xa3, + 0xdf, 0x6c, 0x08, 0xd1, 0xa2, 0x2f, 0x49, 0x88, 0xba, 0x75, 0x06, 0xc2, + 0x11, 0x03, 0x53, 0xb2, 0x4c, 0xb5, 0xd8, 0x37, 0xa3, 0xf9, 0x71, 0x29, + 0x38, 0x99, 0x2a, 0xb8, 0xf7, 0x28, 0x17, 0x66, 0xd8, 0x20, 0x89, 0x94, + 0x9d, 0x43, 0x97, 0x40, 0xd0, 0x02, 0xc6, 0x10, 0x60, 0x43, 0xe7, 0x5f, + 0xd9, 0x51, 0xda, 0xbb, 0xae, 0x5e, 0x66, 0xdc, 0x6c, 0x16, 0x0c, 0xc8, + 0x3c, 0x2e, 0x81, 0xc2, 0x6c, 0x2e, 0x8b, 0xdd, 0xd7, 0x79, 0x41, 0xed, + 0x14, 0x1b, 0x2e, 0x9d, 0x67, 0x0a, 0x38, 0x08, 0xdd, 0x48, 0xd2, 0xdf, + 0x58, 0xc5, 0xec, 0x6f, 0x24, 0x34, 0xfd, 0xe6, 0xda, 0x72, 0x81, 0xba, + 0xbb, 0xd5, 0xb0, 0xb8, 0x8e, 0x55, 0x3f, 0xf8, 0x95, 0x18, 0xdd, 0x92, + 0x87, 0x78, 0x65, 0x02, 0x0e, 0xd4, 0xa2, 0x25, 0x66, 0xb0, 0x86, 0x47, + 0xa1, 0xf0, 0xb7, 0xbc, 0x78, 0xfd, 0x33, 0x83, 0xf3, 0x53, 0x5b, 0x94, + 0x1b, 0x98, 0x1c, 0xa6, 0x8f, 0x9b, 0xbb, 0xab, 0x04, 0xa0, 0x7a, 0xa6, + 0x79, 0x5e, 0x60, 0x6a, 0xf5, 0x2b, 0x7f, 0x76, 0xbd, 0xec, 0xab, 0x06, + 0x3d, 0x48, 0x3a, 0xfd, 0x73, 0x35, 0x46, 0x31, 0xe1, 0x5b, 0xe7, 0x02, + 0x7c, 0x77, 0xdb, 0x91, 0x2c, 0x59, 0x35, 0x01, 0x09, 0xbb, 0x2e, 0x52, + 0x96, 0x88, 0x7e, 0x34, 0x00, 0x6b, 0xf7, 0xa3, 0xcb, 0x33, 0x8a, 0xb2, + 0x8e, 0xd8, 0x7c, 0x89, 0x72, 0xd5, 0x6f, 0xe2, 0x73, 0x7f, 0x5f, 0x92, + 0x00, 0x7e, 0x6a, 0xbe, 0x17, 0x12, 0xcb, 0xd8, 0x31, 0xdc, 0x3b, 0xb0, + 0x80, 0x70, 0x36, 0x8a, 0x1e, 0x94, 0x25, 0xfd, 0x6c, 0xe1, 0x6b, 0xd8, + 0x33, 0xb4, 0x8d, 0x24, 0x0e, 0xdc, 0x54, 0xc8, 0x7f, 0x19, 0x83, 0x3f, + 0x9e, 0x6e, 0x9e, 0xba, 0xa4, 0x6f, 0xfc, 0x91, 0xec, 0x76, 0x43, 0xf9, + 0xde, 0x1e, 0x92, 0xd3, 0xe6, 0x7d, 0x7e, 0x51, 0xfb, 0x13, 0x5f, 0x08, + 0xa8, 0xf0, 0x6f, 0xf0, 0x19, 0xf1, 0x5e, 0x2e, 0xcb, 0x22, 0xac, 0x9e, + 0x4c, 0x63, 0x18, 0x08, 0x72, 0xc0, 0x4d, 0xca, 0x0a, 0x40, 0xc7, 0x67, + 0x63, 0xbc, 0xf2, 0xf4, 0xe0, 0xe3, 0x92, 0x01, 0x1b, 0x7f, 0x63, 0xf1, + 0xa8, 0x4c, 0xf7, 0x1c, 0x0a, 0xbc, 0xd3, 0x30, 0x2f, 0x6b, 0x3e, 0x7e, + 0x9c, 0xd6, 0xcf, 0x68, 0x9a, 0x36, 0xf3, 0x4b, 0xc1, 0x49, 0x46, 0x93, + 0x11, 0x42, 0x2d, 0x2d, 0x9c, 0xd2, 0x3d, 0xb9, 0x5f, 0x4e, 0xbe, 0x12, + 0xdd, 0x63, 0x65, 0x30, 0x06, 0x91, 0x25, 0x87, 0x83, 0xb2, 0x6c, 0x6b, + 0xf4, 0x84, 0xab, 0xcf, 0xaa, 0x9a, 0x0e, 0xbf, 0x07, 0xb0, 0x09, 0x6b, + 0x06, 0x06, 0x3c, 0x0e, 0x27, 0x2f, 0x11, 0x20, 0xec, 0x20, 0x22, 0xa8, + 0xb5, 0xd2, 0xfe, 0x18, 0x8b, 0x0f, 0x29, 0x90, 0x06, 0x95, 0x53, 0x41, + 0xcf, 0x01, 0x04, 0xf0, 0xb7, 0x64, 0x79, 0x73, 0x07, 0x33, 0x63, 0x24, + 0x47, 0x35, 0xf2, 0x1a, 0xd8, 0x72, 0xc6, 0x80, 0x9f, 0x99, 0x97, 0xc9, + 0xea, 0x0c, 0x4d, 0x9f, 0x1e, 0x7e, 0xe8, 0x7d, 0x20, 0x97, 0x58, 0x7d, + 0xae, 0x4e, 0xb4, 0xe4, 0xcc, 0x71, 0x01, 0xe4, 0x57, 0xd6, 0xbc, 0x4d, + 0x5d, 0x99, 0xf1, 0xc0, 0xc4, 0x4c, 0xb7, 0x1f, 0x09, 0x97, 0x39, 0xd2, + 0x85, 0x67, 0x32, 0x6e, 0xc5, 0xf6, 0x2a, 0x3e, 0x82, 0x08, 0x93, 0x4b, + 0xf5, 0xd9, 0x08, 0x4e, 0x0b, 0x94, 0xa1, 0x60, 0x90, 0x1d, 0xed, 0xa6, + 0xec, 0x9d, 0x1c, 0xba, 0x0d, 0xf7, 0x14, 0x95, 0xe9, 0x41, 0xfb, 0x6b, + 0xb1, 0xcd, 0xfe, 0x59, 0x29, 0x62, 0xc0, 0x0c, 0xfe, 0x31, 0x32, 0x59, + 0x23, 0xbf, 0xb3, 0xfa, 0xec, 0x05, 0x14, 0xc4, 0xb1, 0x5a, 0x73, 0x9d, + 0x81, 0xbb, 0xc0, 0xb3, 0x79, 0xf5, 0x9d, 0x04, 0x8b, 0x32, 0x95, 0x28, + 0x78, 0xef, 0x9a, 0x4b, 0xd6, 0x89, 0x3b, 0x17, 0x36, 0x8a, 0x10, 0xdf, + 0xfa, 0x4b, 0x14, 0x8f, 0x11, 0x2c, 0xc5, 0x85, 0x59, 0x92, 0x8a, 0xd7, + 0x7d, 0x7d, 0x5f, 0xc2, 0xe7, 0x77, 0x93, 0x9f, 0xaf, 0xaa, 0xd3, 0xb4, + 0x79, 0xc2, 0x76, 0x44, 0xb3, 0xee, 0x26, 0x1d, 0x5a, 0x6f, 0x3f, 0x14, + 0x80, 0x19, 0xdd, 0xb3, 0x23, 0x63, 0x94, 0x24, 0x2e, 0x45, 0x9c, 0x50, + 0x0f, 0x47, 0x81, 0x35, 0x66, 0xa5, 0x3a, 0x77, 0xb7, 0xd0, 0x9c, 0x25, + 0x78, 0x8f, 0xac, 0x3b, 0x8d, 0x78, 0xcb, 0x78, 0xfb, 0x77, 0x7c, 0x74, + 0x32, 0x3b, 0x77, 0x0c, 0x64, 0x98, 0x32, 0x89, 0x12, 0xfd, 0x71, 0xd6, + 0xb9, 0xf3, 0xc7, 0x20, 0x2b, 0x0e, 0xfd, 0x57, 0x62, 0x60, 0x15, 0x02, + 0x3c, 0x4d, 0x5d, 0xb8, 0x32, 0xe7, 0xfe, 0x1c, 0x98, 0xba, 0x1f, 0x0e, + 0x32, 0x1b, 0xe4, 0x1d, 0xf0, 0xa1, 0x89, 0xed, 0x1e, 0x3e, 0xf8, 0x4c, + 0xf5, 0xca, 0x69, 0x05, 0x5e, 0xe2, 0x0b, 0x4c, 0x90, 0x14, 0x99, 0x0a, + 0xf9, 0xa6, 0xb7, 0x61, 0xf6, 0xca, 0x25, 0x01, 0x50, 0x57, 0xf2, 0x51, + 0xb6, 0x0c, 0x36, 0x20, 0xad, 0x0b, 0x4f, 0x9c, 0x73, 0xc8, 0xdd, 0x27, + 0x26, 0x54, 0xf0, 0xc7, 0x8c, 0x1c, 0x70, 0x48, 0xf0, 0x0a, 0x58, 0xb6, + 0x85, 0xa7, 0xb5, 0x20, 0x90, 0x8e, 0xc8, 0x9c, 0x29, 0xc1, 0x56, 0xdf, + 0xf0, 0x21, 0xfe, 0xde, 0x33, 0x89, 0x80, 0x04, 0xd9, 0xed, 0xa2, 0xd4, + 0x64, 0x68, 0xb7, 0x5d, 0x7f, 0x6b, 0x71, 0x22, 0xa4, 0xf2, 0x82, 0x6c, + 0xc4, 0xc2, 0xbd, 0xf8, 0x03, 0x9a, 0xd8, 0xbf, 0xe1, 0x30, 0x1b, 0x4d, + 0x1d, 0xbf, 0x81, 0xa6, 0xa5, 0x83, 0x3c, 0x5d, 0x90, 0xad, 0xfd, 0xd2, + 0x65, 0x70, 0x89, 0x59, 0xdf, 0x10, 0xba, 0x8d, 0x8a, 0xe9, 0x4a, 0xb1, + 0x03, 0xde, 0xa6, 0x8b, 0xd2, 0xdb, 0x4b, 0xed, 0x08, 0x81, 0xf6, 0x43, + 0xad, 0xac, 0xe7, 0x06, 0xbf, 0xa3, 0x84, 0x39, 0x1f, 0x51, 0xb7, 0xdd, + 0x38, 0xa8, 0xce, 0x84, 0xa1, 0x66, 0x62, 0x0e, 0xb2, 0x5c, 0xea, 0x72, + 0xde, 0xc2, 0xd1, 0x55, 0x39, 0x0c, 0xbc, 0x26, 0x74, 0x22, 0xfc, 0xfc, + 0x5b, 0x9b, 0x3b, 0xf8, 0x39, 0x11, 0xbb, 0x64, 0x85, 0x6f, 0xa8, 0xf5, + 0x55, 0x04, 0x26, 0xe5, 0x51, 0xe3, 0xaa, 0x29, 0xc7, 0x9c, 0x9c, 0xae, + 0x89, 0xa9, 0xec, 0xb9, 0x29, 0xcc, 0x7b, 0x36, 0xe2, 0x07, 0xe3, 0x74, + 0x82, 0x90, 0x07, 0xf5, 0x89, 0xd3, 0xf7, 0xe0, 0xa5, 0x9b, 0xf0, 0x41, + 0xca, 0xb9, 0x12, 0x7a, 0x98, 0xb2, 0xcb, 0xd7, 0xe5, 0xc9, 0x76, 0x1c, + 0x84, 0x8a, 0xf3, 0x34, 0xce, 0xca, 0x04, 0xce, 0x23, 0x63, 0x5b, 0x63, + 0x01, 0xa0, 0x70, 0x7c, 0xed, 0xdd, 0x57, 0xb7, 0x9e, 0x3e, 0xee, 0x8c, + 0x76, 0x5e, 0x3e, 0x58, 0x4a, 0x6c, 0x94, 0xe2, 0xf2, 0x77, 0x85, 0x0f, + 0x16, 0x37, 0x16, 0x65, 0xb3, 0xc9, 0xe1, 0x6f, 0xe3, 0x6b, 0x15, 0xad, + 0x8d, 0x57, 0x44, 0x37, 0x13, 0x3b, 0x0d, 0x95, 0x97, 0xf5, 0x32, 0x44, + 0xf1, 0x04, 0x9a, 0xc2, 0x93, 0xe4, 0x3e, 0x3d, 0x60, 0x8e, 0xde, 0x44, + 0x95, 0x70, 0xea, 0x0b, 0xc3, 0xd6, 0xb2, 0x3d, 0x45, 0xce, 0x3f, 0xa7, + 0x7b, 0x47, 0x18, 0x31, 0xc3, 0xd6, 0x5b, 0x8c, 0x01, 0x10, 0x36, 0x2a, + 0xc1, 0xbf, 0xf0, 0x01, 0x14, 0xb2, 0xdc, 0xa0, 0xa0, 0x75, 0x93, 0x55, + 0xfc, 0xa3, 0xd7, 0x05, 0x3b, 0xdb, 0x3b, 0x05, 0x8b, 0x58, 0x9b, 0xf7, + 0xd3, 0xde, 0xae, 0x0f, 0x4b, 0x4b, 0x7b, 0x73, 0x30, 0x70, 0x7a, 0x71, + 0xe4, 0xb9, 0x91, 0x8a, 0x5e, 0xe5, 0x08, 0x5b, 0x1f, 0x28, 0xd4, 0x88, + 0x74, 0xc5, 0x05, 0x32, 0xec, 0x24, 0x59, 0x85, 0xb5, 0xe0, 0x80, 0xe8, + 0x5a, 0xb3, 0x7b, 0xb8, 0x72, 0x5e, 0x9b, 0x84, 0x54, 0x18, 0x07, 0xae, + 0xdf, 0xea, 0x86, 0xbb, 0xcc, 0x09, 0xe8, 0x88, 0x84, 0x40, 0xa8, 0xe1, + 0x3e, 0x56, 0x5f, 0x6a, 0xfc, 0x5e, 0x31, 0x82, 0x12, 0x4c, 0xa0, 0xc5, + 0x61, 0x6e, 0xe4, 0x1a, 0x39, 0x42, 0xf0, 0x1b, 0x33, 0x90, 0x05, 0xf7, + 0xee, 0x8c, 0x5e, 0x1f, 0xf2, 0xbe, 0x83, 0x9b, 0x29, 0x41, 0x71, 0x4c, + 0x62, 0xb6, 0xbc, 0x2b, 0xe6, 0x57, 0x1f, 0x02, 0x80, 0x62, 0x5a, 0x82, + 0xac, 0x85, 0xaf, 0x1b, 0x02, 0xd9, 0xe4, 0x3f, 0x14, 0x36, 0x86, 0x58, + 0x6d, 0xf8, 0x13, 0xe5, 0x56, 0xc0, 0x99, 0xa9, 0xdb, 0x81, 0xb0, 0x86, + 0x38, 0xc3, 0xdc, 0xe4, 0xb0, 0xda, 0xb6, 0x2d, 0x34, 0xf5, 0xaa, 0xa1, + 0xcc, 0x10, 0x34, 0x83, 0xde, 0x0c, 0x3d, 0xbf, 0xdd, 0x8f, 0x08, 0xa5, + 0xea, 0xd4, 0xd7, 0x8f, 0x1f, 0x84, 0xb9, 0xc1, 0x8b, 0x1f, 0xfa, 0x5a, + 0x7d, 0x58, 0xe4, 0xc1, 0xbc, 0xb8, 0x39, 0x8e, 0xb4, 0xb0, 0x7c, 0xc4, + 0x98, 0x1b, 0x32, 0x30, 0x63, 0xb8, 0xa5, 0xe8, 0x04, 0x54, 0xa3, 0x71, + 0x0f, 0xd0, 0xb1, 0xac, 0x87, 0x75, 0x3a, 0xdd, 0x47, 0x07, 0xef, 0xc8, + 0x67, 0xe6, 0xfd, 0x61, 0xe7, 0xe7, 0xa3, 0x83, 0x12, 0x67, 0xed, 0x1a, + 0xb4, 0xba, 0xef, 0x76, 0x12, 0x7b, 0x68, 0x4f, 0xb9, 0xd7, 0x3e, 0x60, + 0xcc, 0x1d, 0x3e, 0xb8, 0xdc, 0x71, 0xc1, 0xe9, 0xaa, 0x8b, 0xbb, 0x93, + 0x27, 0x4b, 0x84, 0xcf, 0xb9, 0xac, 0xf5, 0x3c, 0xd2, 0x6c, 0x3a, 0xf7, + 0xb2, 0xce, 0x87, 0x27, 0x47, 0x6b, 0x7f, 0xad, 0xfc, 0x54, 0x0f, 0x33, + 0x62, 0x3d, 0x9f, 0x5c, 0xef, 0xef, 0x6a, 0x2f, 0x2e, 0x62, 0xeb, 0xbf, + 0x71, 0x35, 0xcf, 0xbf, 0xf2, 0x2a, 0xa5, 0x50, 0x66, 0xb6, 0x59, 0x92, + 0xd6, 0xd5, 0x27, 0xd0, 0xc5, 0x04, 0x64, 0x34, 0x96, 0x74, 0xd6, 0xb6, + 0x7a, 0x12, 0xf2, 0xb8, 0xfd, 0x8a, 0x23, 0x29, 0x4d, 0x7b, 0xa3, 0x60, + 0xbf, 0xe2, 0xa4, 0x46, 0x30, 0x04, 0xde, 0xf1, 0xab, 0x71, 0x57, 0x0f, + 0xc6, 0xd6, 0x81, 0x7d, 0x8f, 0x76, 0x52, 0x05, 0x43, 0x3b, 0xa5, 0x5c, + 0x19, 0x19, 0x0c, 0x60, 0xe1, 0x84, 0x94, 0x97, 0xb4, 0xed, 0x8c, 0xc7, + 0x69, 0xc0, 0x32, 0x7e, 0xb8, 0xf9, 0xed, 0xca, 0xb7, 0x4e, 0xe4, 0xd3, + 0x77, 0x39, 0x4d, 0xb6, 0xc7, 0xfa, 0x77, 0xd4, 0x3f, 0x8e, 0x60, 0x62, + 0x08, 0x0c, 0x20, 0xd7, 0xf4, 0xa3, 0x23, 0xca, 0x93, 0xac, 0xa0, 0x16, + 0xfb, 0xfe, 0x95, 0xf0, 0x70, 0xdb, 0xc8, 0xeb, 0x7c, 0x58, 0x03, 0x9b, + 0xd9, 0xc8, 0xc5, 0xef, 0x63, 0xef, 0xbb, 0x7a, 0xd5, 0xa9, 0x4e, 0x05, + 0x7c, 0x52, 0xfe, 0x08, 0x4b, 0x65, 0x90, 0x86, 0x84, 0x56, 0x70, 0x12, + 0x86, 0x90, 0xa2, 0xc3, 0xea, 0x63, 0xb4, 0xc0, 0x16, 0x42, 0x96, 0x7b, + 0x65, 0x78, 0x0d, 0xe8, 0x85, 0xf4, 0x13, 0x59, 0xab, 0xee, 0x75, 0x60, + 0xc6, 0x15, 0xb5, 0x39, 0x28, 0x11, 0x80, 0xde, 0xd8, 0x2f, 0xad, 0x73, + 0x0f, 0x75, 0x87, 0x42, 0x7f, 0xaa, 0x01, 0xfc, 0x25, 0x67, 0x66, 0xea, + 0xb1, 0x35, 0x98, 0xf8, 0xd2, 0x31, 0xcf, 0xb8, 0x75, 0x7b, 0xa1, 0x7e, + 0xec, 0x75, 0x85, 0xd1, 0x41, 0xe8, 0xc2, 0x6c, 0x3e, 0x56, 0xb0, 0x0c, + 0x62, 0xec, 0xdc, 0xca, 0xfc, 0xe6, 0x29, 0xb4, 0x8c, 0x49, 0x37, 0x03, + 0x37, 0xfa, 0x32, 0x29, 0x85, 0x92, 0xf9, 0x48, 0x8c, 0x67, 0xd9, 0x0b, + 0x1c, 0xe2, 0xd9, 0xd0, 0x9f, 0x7c, 0xc9, 0xc8, 0xef, 0x96, 0xe2, 0xea, + 0xc1, 0xcf, 0x9c, 0x91, 0x33, 0x62, 0x3a, 0x60, 0x50, 0xb0, 0x9e, 0x2a, + 0x57, 0x41, 0x6e, 0xeb, 0x9f, 0x1f, 0x52, 0xad, 0xb9, 0xbc, 0x70, 0xe0, + 0x37, 0x1a, 0x22, 0xea, 0x2c, 0x49, 0xe6, 0xb2, 0xbc, 0xde, 0x23, 0x0f, + 0x7d, 0xc3, 0xe3, 0x00, 0x96, 0x86, 0xef, 0xe5, 0xa3, 0x07, 0x74, 0xf5, + 0x79, 0xdb, 0xe0, 0x9f, 0xa5, 0xee, 0xf0, 0x08, 0xbd, 0xd1, 0x5f, 0x44, + 0xf0, 0x44, 0xad, 0xa1, 0x29, 0xf4, 0x38, 0x62, 0x16, 0x22, 0xbf, 0x17, + 0xe2, 0xb3, 0xad, 0x3c, 0x59, 0x35, 0x44, 0x19, 0x87, 0xf2, 0x8e, 0xdc, + 0x64, 0xb1, 0x9a, 0x77, 0x6d, 0x5a, 0xfe, 0x72, 0x29, 0x32, 0xcb, 0x6a, + 0x6a, 0x3c, 0x00, 0x43, 0x06, 0x8b, 0xbd, 0xac, 0x84, 0xb2, 0x5e, 0x3b, + 0x4d, 0xe0, 0x51, 0x14, 0xa2, 0x04, 0xf2, 0x36, 0xc1, 0x6c, 0x5e, 0x3c, + 0x77, 0x1e, 0x8f, 0xb6, 0xe1, 0x58, 0x56, 0x35, 0x2d, 0x7b, 0xe9, 0xf8, + 0xd3, 0x05, 0x20, 0xc1, 0x03, 0x5a, 0xf5, 0x2d, 0xb5, 0x26, 0xe2, 0xea, + 0x9d, 0x10, 0xa6, 0xe0, 0xba, 0x70, 0x26, 0xa3, 0x12, 0x3e, 0xd6, 0x89, + 0x24, 0xf2, 0xcf, 0xfe, 0x89, 0xcc, 0x47, 0xfc, 0x60, 0x65, 0x14, 0xf2, + 0xc0, 0x72, 0x02, 0x76, 0x77, 0x01, 0x98, 0xfa, 0x77, 0x4d, 0xe4, 0xef, + 0xc0, 0x63, 0xfa, 0xf9, 0xfb, 0xd3, 0x3c, 0x60, 0x23, 0x80, 0x57, 0xc9, + 0x05, 0x4f, 0x79, 0xac, 0x58, 0xdc, 0xc7, 0x1c, 0x47, 0xd0, 0xe9, 0x78, + 0xee, 0x47, 0xe0, 0x00, 0x49, 0xb4, 0xaf, 0x37, 0x77, 0x5e, 0x6d, 0xb3, + 0x58, 0xc4, 0x82, 0x71, 0xdf, 0x96, 0x31, 0xab, 0x05, 0x3a, 0x66, 0x3b, + 0x8e, 0xd7, 0x71, 0xbe, 0x00, 0xb4, 0x01, 0x2b, 0x64, 0x0a, 0x10, 0x05, + 0xb8, 0x46, 0xa1, 0x90, 0x7e, 0xb7, 0x71, 0x0f, 0x2c, 0x62, 0x9f, 0xcf, + 0xfc, 0xd3, 0xbf, 0x45, 0x8d, 0x8e, 0xe7, 0x90, 0x96, 0x64, 0x8f, 0x33, + 0x27, 0x83, 0x27, 0xf0, 0x52, 0x74, 0xcc, 0x51, 0xa6, 0x28, 0xb8, 0x32, + 0x7b, 0xa6, 0xa3, 0xfe, 0x17, 0xec, 0x00, 0x11, 0x08, 0x48, 0x27, 0x78, + 0x78, 0x52, 0xc3, 0x46, 0x08, 0xa6, 0xbd, 0x45, 0xdf, 0x6d, 0xfb, 0x47, + 0xdc, 0xf9, 0x52, 0x46, 0xba, 0xb1, 0x81, 0xbc, 0xb8, 0x68, 0x60, 0x6a, + 0xda, 0x32, 0x50, 0x18, 0x03, 0xfa, 0xf2, 0xa1, 0x6f, 0xec, 0x61, 0xac, + 0xe1, 0xc5, 0x0d, 0xd0, 0x96, 0x37, 0x5e, 0x9a, 0x8e, 0xbf, 0x21, 0x24, + 0xce, 0x0c, 0xfa, 0xb1, 0xaf, 0xae, 0x35, 0xa8, 0xef, 0x89, 0x21, 0x9f, + 0x23, 0x5c, 0x0f, 0xfa, 0xdb, 0x63, 0x5f, 0xba, 0xc8, 0xae, 0x01, 0x24, + 0x88, 0xf9, 0x25, 0x61, 0x44, 0x96, 0x81, 0x75, 0xe8, 0x88, 0x0a, 0x23, + 0xeb, 0x8e, 0xd0, 0x53, 0xff, 0x85, 0xb1, 0x73, 0x9c, 0xdd, 0xf1, 0x9e, + 0x8e, 0xdf, 0x03, 0x43, 0x9f, 0x00, 0x2b, 0x0e, 0x18, 0x46, 0x30, 0x9b, + 0x9f, 0x08, 0x92, 0xf2, 0x27, 0xed, 0xa9, 0xb6, 0xfd, 0x4a, 0xc3, 0xc1, + 0x8d, 0x42, 0x8b, 0x82, 0x51, 0x34, 0x42, 0x49, 0x8c, 0xde, 0x67, 0x11, + 0x6e, 0x03, 0xc2, 0xf2, 0x8b, 0x6c, 0x4d, 0xdd, 0xe2, 0x92, 0x01, 0x97, + 0x64, 0x66, 0x2a, 0x62, 0xb0, 0xfb, 0xbc, 0x6b, 0xe3, 0x73, 0xa1, 0xbb, + 0xb6, 0x73, 0x06, 0x79, 0x56, 0x3c, 0x34, 0x35, 0xad, 0x7e, 0x32, 0x5e, + 0x0d, 0x65, 0x99, 0xc7, 0xd4, 0x9f, 0x86, 0xc9, 0x00, 0x7c, 0xdc, 0xb2, + 0x47, 0x0e, 0x6e, 0xe0, 0xc3, 0xa3, 0x33, 0xb0, 0xac, 0xd3, 0xcf, 0xba, + 0x80, 0x25, 0x63, 0x48, 0x70, 0xf8, 0x4c, 0x5f, 0xee, 0xd7, 0x07, 0x3d, + 0x0f, 0x27, 0x31, 0xd6, 0x71, 0x69, 0x46, 0x06, 0x84, 0x51, 0xd0, 0x5d, + 0xed, 0xb2, 0x9f, 0x1e, 0x84, 0xa1, 0x91, 0x32, 0x46, 0x75, 0x4a, 0xf2, + 0x59, 0x16, 0x31, 0xc7, 0x55, 0xb4, 0x31, 0xec, 0x29, 0x34, 0xcc, 0x0d, + 0x1b, 0x24, 0x18, 0x2d, 0xb7, 0x94, 0xe5, 0xe6, 0x7f, 0x2f, 0x9a, 0xea, + 0x40, 0xcb, 0x28, 0x42, 0xb3, 0x17, 0xc7, 0x05, 0x55, 0xca, 0xee, 0xe2, + 0x4d, 0x97, 0xfb, 0xa9, 0x5c, 0x32, 0xdb, 0x32, 0xd9, 0xa2, 0xdb, 0xed, + 0xdf, 0x57, 0x78, 0xf5, 0x64, 0x40, 0x9b, 0xe5, 0xf8, 0x19, 0x84, 0x2b, + 0xb2, 0xb5, 0xa8, 0xee, 0x28, 0x96, 0xdd, 0x2d, 0x88, 0xd3, 0xc9, 0x0a, + 0xdd, 0xc0, 0xf2, 0x6a, 0x28, 0xf9, 0xf6, 0xc0, 0xab, 0xa3, 0x88, 0x47, + 0x27, 0x87, 0x95, 0xa9, 0x79, 0x50, 0x36, 0x8e, 0x9b, 0xf8, 0x5b, 0x6b, + 0x69, 0xec, 0xb6, 0x36, 0x1f, 0xca, 0x51, 0xf4, 0x85, 0x13, 0xc2, 0x30, + 0x95, 0x23, 0xa1, 0xfe, 0x86, 0xc7, 0x3d, 0xdb, 0x72, 0xb3, 0xe3, 0xd0, + 0xa3, 0x76, 0xb7, 0x83, 0x30, 0x4c, 0x2a, 0xec, 0x5b, 0x29, 0x24, 0xa9, + 0x5b, 0x2b, 0x50, 0x6a, 0xe2, 0xb1, 0x8c, 0x4e, 0xc3, 0x88, 0xfe, 0xd6, + 0x43, 0xf4, 0xf7, 0xad, 0xff, 0x05, 0x7d, 0x16, 0xa7, 0x33, 0xdb, 0x22, + 0x9f, 0x2b, 0xa9, 0xcf, 0x88, 0xc7, 0x74, 0x3b, 0x95, 0xba, 0x74, 0xf6, + 0x14, 0x08, 0x95, 0x51, 0x3d, 0xcf, 0x34, 0xc0, 0xfd, 0x90, 0xb4, 0x74, + 0xa5, 0x18, 0x32, 0x48, 0x1f, 0x3a, 0xc9, 0xe2, 0xe2, 0x1b, 0xdf, 0x18, + 0x38, 0xbe, 0x8a, 0xbb, 0x8d, 0x88, 0x21, 0xd4, 0x62, 0xf8, 0x68, 0x90, + 0x97, 0xe8, 0x91, 0x2f, 0x6d, 0xab, 0x6d, 0xae, 0x4b, 0x4e, 0xe3, 0x66, + 0x59, 0x46, 0x9e, 0xb4, 0xb7, 0xa7, 0x1a, 0x07, 0x37, 0x77, 0xbb, 0x71, + 0x5e, 0xe1, 0x00, 0x44, 0xfe, 0xe4, 0x2e, 0xb2, 0x61, 0x48, 0x1a, 0x9a, + 0x49, 0x49, 0xdc, 0xbb, 0x87, 0x0b, 0x9d, 0x62, 0x90, 0xaf, 0xf0, 0x51, + 0x0d, 0x24, 0x9e, 0x96, 0x37, 0x93, 0x97, 0xe5, 0xbb, 0x89, 0x0e, 0x60, + 0x95, 0xa3, 0x79, 0x46, 0x3b, 0x73, 0x11, 0x83, 0x17, 0xf1, 0x0c, 0x86, + 0xb3, 0x40, 0x17, 0xe0, 0x62, 0xbd, 0xf3, 0xc5, 0x55, 0x39, 0x85, 0x25, + 0xac, 0x83, 0x80, 0x21, 0x41, 0xe1, 0x68, 0xcb, 0xca, 0x0a, 0x9d, 0xff, + 0xc0, 0x8f, 0x72, 0x8c, 0x20, 0x6f, 0xd5, 0xbe, 0x34, 0xd5, 0x65, 0x01, + 0xb0, 0xd3, 0xbc, 0xe5, 0x1e, 0xeb, 0xd2, 0xdf, 0x43, 0xb0, 0x23, 0x64, + 0xc7, 0x88, 0xe2, 0xeb, 0xe0, 0x7b, 0x88, 0xff, 0xf6, 0x6b, 0x5f, 0xa9, + 0xe5, 0xe9, 0xc4, 0xaf, 0x9f, 0xd5, 0xe1, 0xe2, 0x67, 0x0e, 0x06, 0xeb, + 0x74, 0x81, 0x7d, 0x04, 0x79, 0x0f, 0xa0, 0xe9, 0x6c, 0x4a, 0x4f, 0x3f, + 0xf7, 0x9f, 0x25, 0x1a, 0xdd, 0xb8, 0x44, 0xe3, 0x2e, 0xf0, 0xb5, 0x0b, + 0x51, 0x0f, 0x2a, 0x6b, 0x52, 0x6c, 0x72, 0x68, 0x6c, 0x92, 0x9d, 0x5c, + 0x33, 0x77, 0x46, 0x01, 0xea, 0x73, 0x46, 0x14, 0x29, 0xe2, 0xb0, 0x57, + 0x4a, 0x58, 0x89, 0x54, 0x01, 0xc8, 0xd3, 0x9b, 0xfa, 0x42, 0x64, 0x3d, + 0x2a, 0x0e, 0xe9, 0x92, 0x4d, 0x2c, 0xd6, 0xa7, 0x36, 0xdc, 0x6a, 0x29, + 0xbb, 0xfc, 0xca, 0xc1, 0x55, 0x48, 0x64, 0x5a, 0x7f, 0xa7, 0x2a, 0x92, + 0xa9, 0x70, 0x4a, 0x11, 0x07, 0x82, 0x93, 0x99, 0x39, 0x63, 0xe5, 0x51, + 0xfa, 0xe6, 0x9b, 0xa6, 0xe6, 0xd7, 0x73, 0xa0, 0x84, 0x5d, 0x18, 0xc7, + 0xb5, 0x5b, 0x35, 0xfa, 0xbb, 0x2e, 0x16, 0x77, 0x1b, 0xbb, 0xb1, 0x60, + 0x8c, 0x9a, 0xc3, 0x17, 0x38, 0xf6, 0xe7, 0x4b, 0x4a, 0x44, 0xfd, 0x55, + 0x00, 0xdb, 0x91, 0x38, 0xe9, 0xfc, 0xbb, 0xc8, 0x3e, 0x12, 0x14, 0x8c, + 0xbc, 0x55, 0x84, 0x41, 0xd2, 0x8a, 0x02, 0x46, 0x0f, 0x74, 0xf9, 0x29, + 0x3b, 0xb5, 0x1e, 0x49, 0x95, 0xf3, 0x57, 0x75, 0x66, 0xd4, 0x85, 0xe0, + 0x02, 0x08, 0x43, 0xc7, 0x74, 0x1c, 0xd6, 0xa7, 0xfe, 0x51, 0xba, 0x70, + 0xfc, 0xb5, 0x85, 0xb3, 0xf7, 0x09, 0xa3, 0x9d, 0x09, 0x69, 0x37, 0x03, + 0x6a, 0xb4, 0x58, 0xf3, 0xb4, 0xa7, 0x1a, 0x75, 0xd9, 0x27, 0xf2, 0x09, + 0x00, 0x34, 0xa8, 0x79, 0x60, 0xb6, 0xca, 0xf8, 0x3c, 0xf2, 0x9e, 0x36, + 0x94, 0x7c, 0xcc, 0xca, 0x9a, 0x80, 0xa3, 0x07, 0xf1, 0x9f, 0x98, 0xc4, + 0xa3, 0x19, 0x04, 0xeb, 0x5f, 0xd0, 0x31, 0x9e, 0x48, 0x26, 0x5a, 0xf5, + 0x18, 0x7f, 0x6b, 0x20, 0x90, 0x22, 0x89, 0x95, 0xd6, 0x0a, 0x4c, 0x95, + 0xaa, 0x0a, 0x18, 0x44, 0xcb, 0xd1, 0xc1, 0x60, 0x46, 0xa2, 0xbd, 0x51, + 0x46, 0xa2, 0x97, 0x5e, 0x91, 0x96, 0x65, 0x43, 0x20, 0x66, 0x11, 0xbd, + 0x0d, 0x62, 0x0d, 0xf5, 0x29, 0x3e, 0xb4, 0x0d, 0x79, 0x6f, 0x00, 0x7d, + 0xbc, 0x76, 0x18, 0xc4, 0xc1, 0x7d, 0xfc, 0xe8, 0xc2, 0x4f, 0x98, 0x96, + 0xf1, 0x79, 0x2b, 0x87, 0xd1, 0xa4, 0x7f, 0xd5, 0xe0, 0x84, 0x39, 0xeb, + 0x8b, 0xc8, 0x53, 0xf9, 0xa8, 0xd9, 0x17, 0x1c, 0x88, 0x18, 0xca, 0x6a, + 0xa3, 0x5a, 0xf0, 0x3b, 0xd4, 0x2f, 0x34, 0x5c, 0x9b, 0x87, 0xbc, 0x85, + 0x37, 0x1b, 0x4a, 0xfd, 0x91, 0x1b, 0x23, 0x60, 0x8b, 0xd9, 0x3c, 0x69, + 0x5d, 0x69, 0x16, 0xfc, 0x9a, 0x22, 0x58, 0x1e, 0x1a, 0x49, 0xe5, 0xf9, + 0xd8, 0x59, 0x2c, 0xf6, 0xd3, 0x22, 0x18, 0x0d, 0x26, 0x60, 0xf6, 0xbb, + 0x79, 0xc3, 0xf5, 0xc2, 0x82, 0x7a, 0x93, 0xa7, 0x5b, 0x20, 0x2e, 0x98, + 0x64, 0xd7, 0xa3, 0xcd, 0xa1, 0xf7, 0x9e, 0x66, 0x52, 0xa1, 0x0c, 0xd4, + 0xb9, 0x5d, 0x65, 0x4c, 0x8f, 0xfe, 0x5d, 0x81, 0x4b, 0x22, 0xd9, 0x70, + 0x00, 0x22, 0xee, 0xab, 0x9b, 0x66, 0x22, 0x10, 0x2d, 0x5a, 0x6e, 0x36, + 0x0d, 0xc3, 0xaa, 0x8a, 0xb6, 0x58, 0x6e, 0x93, 0x45, 0x41, 0xae, 0x81, + 0xb8, 0x90, 0x88, 0x56, 0x25, 0xe7, 0xdf, 0xec, 0xe6, 0xd9, 0xc9, 0xfe, + 0x53, 0x1b, 0x32, 0x64, 0x06, 0xd3, 0xca, 0xcc, 0xa3, 0xe7, 0x4c, 0xa5, + 0xb2, 0x18, 0x25, 0xda, 0x4b, 0xf2, 0x61, 0x00, 0x1b, 0x24, 0x7b, 0x94, + 0x98, 0xe8, 0x2f, 0xeb, 0xaa, 0x0c, 0xd5, 0x78, 0x3f, 0x7d, 0xc7, 0xde, + 0xa4, 0x2c, 0x2d, 0x9f, 0xf9, 0x96, 0x6e, 0x0f, 0x12, 0x6f, 0xf4, 0x14, + 0x6c, 0x4a, 0xaa, 0xbd, 0x8a, 0xf0, 0x03, 0x6a, 0x2b, 0xa2, 0xff, 0x79, + 0xc9, 0x44, 0x68, 0x09, 0xf7, 0x52, 0xdc, 0x49, 0x34, 0x60, 0x19, 0xda, + 0x8a, 0x03, 0xb7, 0x10, 0x38, 0x8a, 0xdf, 0xa7, 0xcd, 0x3b, 0xfe, 0x5b, + 0xf2, 0x66, 0xaa, 0xfe, 0xc4, 0x08, 0x1e, 0x09, 0xc3, 0xe5, 0x9a, 0x52, + 0x30, 0x76, 0x8d, 0x8c, 0xeb, 0x4a, 0xa8, 0x3e, 0xb7, 0x01, 0xe2, 0xca, + 0x12, 0x07, 0xbf, 0xc2, 0xc1, 0x25, 0x7b, 0xa3, 0xed, 0xcf, 0xdf, 0x6a, + 0xb9, 0xc9, 0x6e, 0xe6, 0x5f, 0x50, 0xa9, 0xc6, 0x54, 0x2c, 0x81, 0x18, + 0x88, 0xdb, 0xe7, 0xc3, 0x56, 0xd2, 0x17, 0x0c, 0x2d, 0x88, 0xa1, 0x6c, + 0xc5, 0xbe, 0xb6, 0x10, 0xc7, 0xca, 0x47, 0x74, 0xfd, 0x4f, 0xc4, 0x9d, + 0xb2, 0x93, 0xfc, 0x2d, 0xaf, 0x6b, 0xd7, 0x38, 0x59, 0xfd, 0x9a, 0xed, + 0xd4, 0xdf, 0x80, 0x97, 0x5e, 0x6c, 0xce, 0x33, 0x62, 0xe4, 0xb1, 0x52, + 0x30, 0xa9, 0x7d, 0x8d, 0x32, 0xfb, 0x95, 0x00, 0x86, 0x92, 0xc4, 0x0a, + 0xdc, 0x3b, 0x8a, 0x2a, 0xcd, 0xe9, 0x14, 0x0e, 0xe2, 0x0c, 0x78, 0x5d, + 0x68, 0x82, 0xc8, 0x81, 0x28, 0x71, 0xdf, 0x5f, 0x64, 0x6e, 0x1a, 0xa1, + 0x7b, 0x9e, 0x9b, 0x1c, 0x2a, 0x1c, 0xfa, 0x84, 0x3d, 0x28, 0x2e, 0xac, + 0x9a, 0x32, 0x55, 0xdf, 0xe7, 0x9f, 0x84, 0x56, 0x7d, 0xbf, 0x49, 0x6e, + 0xe3, 0x03, 0x93, 0xa6, 0xdb, 0xfb, 0xd9, 0xd7, 0x2e, 0x80, 0xcf, 0xc2, + 0x6f, 0x83, 0x16, 0xd3, 0x29, 0xb4, 0x3d, 0xdf, 0x34, 0x1f, 0x72, 0xb8, + 0x19, 0x20, 0x00, 0x03, 0x12, 0xff, 0x39, 0x7c, 0x0f, 0x59, 0x5f, 0x4e, + 0x22, 0x2a, 0x7f, 0x73, 0x7c, 0xfa, 0xfc, 0x2d, 0x79, 0x5a, 0xcf, 0xe2, + 0x04, 0x83, 0x94, 0x48, 0xde, 0xf7, 0x00, 0xe4, 0xd1, 0x92, 0xbc, 0xd8, + 0xc0, 0xf9, 0xbf, 0x77, 0xde, 0x0e, 0x90, 0xf1, 0x9d, 0xb2, 0x55, 0x4d, + 0x26, 0x0b, 0x57, 0xa6, 0x41, 0xd2, 0xe0, 0x82, 0xc7, 0xd5, 0xd9, 0x7d, + 0xcf, 0x5f, 0x57, 0x3c, 0xf2, 0x08, 0xe2, 0x54, 0x4a, 0x77, 0xe2, 0x07, + 0x06, 0x65, 0x0d, 0x30, 0x0f, 0x81, 0x43, 0xf1, 0xc7, 0x75, 0x48, 0x4b, + 0xfe, 0xbe, 0x93, 0xed, 0x5c, 0x05, 0x30, 0xee, 0x2e, 0xdf, 0x27, 0xb6, + 0x63, 0xbe, 0x6e, 0x70, 0xec, 0xba, 0x87, 0x7f, 0x0c, 0xfd, 0xe3, 0xe5, + 0xb5, 0xa5, 0xcc, 0xb7, 0x9a, 0x11, 0x76, 0x15, 0x25, 0xdd, 0x6b, 0xdb, + 0x8c, 0x0f, 0x7c, 0x0d, 0x49, 0x4f, 0xde, 0xea, 0xcc, 0x58, 0xbb, 0x3b, + 0x54, 0x0a, 0xc7, 0xfd, 0x17, 0x6e, 0x0c, 0x11, 0x88, 0xbf, 0x9f, 0xee, + 0xf8, 0x2d, 0xf6, 0xa9, 0x4d, 0x47, 0xcf, 0x0f, 0x27, 0x69, 0x49, 0x11, + 0x8c, 0xf9, 0xe3, 0x62, 0x49, 0x81, 0xf9, 0x0c, 0x25, 0x32, 0x0e, 0x38, + 0x08, 0xab, 0x7f, 0x0b, 0x96, 0xa5, 0x68, 0x4f, 0xde, 0xa7, 0x9d, 0xd2, + 0x89, 0x0a, 0x9f, 0x2e, 0xe6, 0xa4, 0x8e, 0xff, 0x3d, 0xa9, 0x14, 0xd6, + 0x32, 0xf7, 0xa1, 0x6b, 0x4a, 0x8e, 0xa4, 0x3c, 0x66, 0xe5, 0xf4, 0xf4, + 0x02, 0x53, 0xe4, 0xba, 0x61, 0x80, 0x46, 0xec, 0xe2, 0xe1, 0xb9, 0x22, + 0x0d, 0x28, 0x02, 0xf4, 0xbf, 0x85, 0x17, 0x83, 0xfd, 0xcb, 0x63, 0xeb, + 0xcb, 0x27, 0xaf, 0xe3, 0x5b, 0xf6, 0x46, 0x5d, 0x40, 0x3d, 0x4b, 0xbe, + 0xc2, 0xc9, 0xa6, 0x11, 0x9e, 0x12, 0x29, 0x20, 0xcc, 0x85, 0x6b, 0xbb, + 0x8c, 0xb5, 0x12, 0x08, 0xf9, 0x07, 0x56, 0x4f, 0x49, 0xb3, 0x56, 0xba, + 0xca, 0x25, 0x68, 0x99, 0xe3, 0xec, 0x2f, 0x49, 0xec, 0x40, 0xf5, 0xe9, + 0xfd, 0xf1, 0xef, 0x46, 0x02, 0xeb, 0xe1, 0xc4, 0x75, 0xfd, 0x7b, 0x02, + 0xca, 0x83, 0xd8, 0xd8, 0x61, 0x60, 0xb8, 0x9e, 0xda, 0xac, 0x6a, 0xe7, + 0xfc, 0x50, 0xfa, 0x9a, 0x87, 0x82, 0x68, 0xac, 0x06, 0xab, 0x73, 0x88, + 0x44, 0x75, 0xd7, 0x88, 0x6d, 0xad, 0x46, 0x37, 0x21, 0x13, 0x69, 0x6d, + 0x75, 0x79, 0x2f, 0xe7, 0xef, 0x1d, 0xba, 0xb6, 0xe2, 0x7c, 0xe7, 0xaf, + 0x63, 0xa6, 0xfe, 0x6e, 0x26, 0xf2, 0xb1, 0xf4, 0xd2, 0x82, 0x8f, 0x14, + 0xf6, 0x75, 0x81, 0xc6, 0x76, 0x83, 0x0f, 0x33, 0x29, 0x8c, 0x18, 0xbc, + 0xac, 0xbd, 0x33, 0x43, 0xa5, 0x8d, 0x0b, 0xc6, 0xcc, 0x6c, 0xe8, 0xf4, + 0x01, 0x3f, 0x30, 0x7b, 0x0b, 0xf9, 0x7b, 0xe3, 0xa4, 0xbf, 0xc6, 0x5f, + 0x42, 0x66, 0x56, 0xb4, 0x9c, 0x56, 0xf6, 0x20, 0x55, 0x87, 0x18, 0xe1, + 0xde, 0xb2, 0xac, 0x18, 0x09, 0xf1, 0x20, 0x2b, 0xa8, 0x32, 0x70, 0xb6, + 0x84, 0x98, 0x61, 0x64, 0xeb, 0xa8, 0x20, 0x4e, 0x19, 0x18, 0xf6, 0x64, + 0xb6, 0x11, 0x1f, 0xc0, 0xca, 0xf4, 0x8d, 0x57, 0x32, 0x03, 0xf4, 0xc5, + 0x3f, 0xe2, 0xe3, 0x4d, 0xfc, 0x3c, 0x74, 0x83, 0xea, 0xf3, 0xba, 0x5f, + 0x74, 0x4f, 0x24, 0x5e, 0xf7, 0xf6, 0x84, 0x90, 0xc1, 0xfc, 0x4c, 0x9f, + 0x0f, 0x19, 0xcf, 0x8b, 0x55, 0x44, 0x63, 0xbc, 0xf5, 0x98, 0x31, 0xd2, + 0x2f, 0xa3, 0x9f, 0x5b, 0xd7, 0x9f, 0xc8, 0xf7, 0x50, 0xf5, 0x59, 0xcf, + 0x39, 0xb8, 0xeb, 0xee, 0x53, 0x21, 0xad, 0xd5, 0x84, 0xf4, 0xde, 0xf3, + 0x13, 0x6e, 0x79, 0xd4, 0x66, 0xf8, 0x1c, 0x47, 0x0a, 0x67, 0x0a, 0xcc, + 0x53, 0x4f, 0x0b, 0x84, 0x11, 0x4e, 0x51, 0xde, 0xc4, 0xe1, 0x64, 0xf1, + 0x32, 0x37, 0x7f, 0x42, 0x35, 0x14, 0x8e, 0xa3, 0xd0, 0xb4, 0x5c, 0xa3, + 0x9d, 0xc7, 0x1b, 0xf6, 0x25, 0x2b, 0x7f, 0x16, 0xa4, 0x41, 0x67, 0x63, + 0xff, 0xa6, 0xa8, 0xa4, 0xb6, 0x44, 0xcf, 0x3a, 0x22, 0xdc, 0x6b, 0xc3, + 0xe0, 0x63, 0x86, 0x22, 0xe5, 0x4f, 0xe4, 0x12, 0xd9, 0x8a, 0x7c, 0xca, + 0xe7, 0xba, 0xbd, 0xf0, 0x2b, 0x2c, 0xbd, 0x91, 0xae, 0x77, 0xef, 0xdf, + 0xe4, 0xc3, 0xbf, 0x54, 0x7d, 0x83, 0xb2, 0x49, 0xee, 0xd0, 0xa4, 0xf3, + 0xe9, 0xe4, 0xd9, 0xe2, 0x4a, 0x8d, 0x9f, 0x90, 0x35, 0x08, 0xa7, 0x6f, + 0x35, 0xcf, 0x0d, 0x8f, 0x3a, 0x8a, 0x82, 0x27, 0x57, 0x14, 0x53, 0x4c, + 0x4d, 0x41, 0x44, 0x38, 0xef, 0xfa, 0x86, 0xda, 0xe7, 0xf3, 0x8a, 0x27, + 0x38, 0xaa, 0x92, 0x1e, 0xf8, 0x70, 0x8b, 0x6b, 0x60, 0xd6, 0xa5, 0x54, + 0xa6, 0x09, 0x3b, 0xb7, 0xbf, 0x9a, 0x5a, 0x66, 0x9a, 0xd4, 0x75, 0x84, + 0x7d, 0xb2, 0x50, 0x64, 0xfb, 0xeb, 0x95, 0xb4, 0x13, 0xe6, 0xb6, 0xea, + 0xe7, 0xe7, 0x02, 0x0a, 0x1a, 0xa9, 0x12, 0xf9, 0x95, 0x8a, 0x68, 0x60, + 0x1d, 0x86, 0xf9, 0x8f, 0x7f, 0x2b, 0xff, 0x56, 0xf1, 0xde, 0xfe, 0xc7, + 0xbf, 0xff, 0x6b, 0x19, 0xee, 0x7f, 0xff, 0x8f, 0xbf, 0x45, 0xba, 0xf7, + 0x5f, 0xf3, 0x19, 0x8b, 0xef, 0x7f, 0x2e, 0xd9, 0xaf, 0xfa, 0xfe, 0xaf, + 0x7f, 0x0b, 0x00, 0xe8, 0xfd, 0xf8, 0x4f, 0x08, 0x12, 0xc5, 0xff, 0xf9, + 0xf7, 0x00, 0x46, 0xe1, 0x7f, 0xee, 0x71, 0xe4, 0x3f, 0xdf, 0x1b, 0xf4, + 0x5f, 0x0f, 0x10, 0x96, 0xfd, 0xcf, 0xf7, 0x86, 0xfb, 0xe7, 0x01, 0x47, + 0xfc, 0x73, 0xcf, 0x33, 0xff, 0xf3, 0x5f, 0x0b, 0x91, 0xff, 0xeb, 0xf3, + 0x7f, 0x7d, 0x0f, 0xf9, 0xdb, 0x14, 0x02, 0x11, 0xe2, 0x3f, 0x0f, 0x48, + 0xec, 0x9f, 0x7b, 0xe6, 0x9f, 0x6f, 0xc2, 0x08, 0xf2, 0xcf, 0x3d, 0x0d, + 0xff, 0xd7, 0xfd, 0xbf, 0xb6, 0x8e, 0xbc, 0xdf, 0xf8, 0xaf, 0x7b, 0xfc, + 0xff, 0x6e, 0x50, 0x14, 0xfe, 0xd9, 0x1d, 0x51, 0x14, 0xf9, 0xff, 0xfd, + 0x5f, 0xcb, 0x99, 0x97, 0xd9, 0x1b, 0x3b, 0xd9, 0xa7, 0xfb, 0x6f, 0x57, + 0x34, 0x37, 0xb2, 0xed, 0xbb, 0x34, 0x59, 0xff, 0x6f, 0xca, 0x67, 0xfc, + 0xad, 0xff, 0xaf, 0x2b, 0x9b, 0x63, 0xff, 0xac, 0x6c, 0xfe, 0xff, 0xb5, + 0x86, 0x79, 0x22, 0x53, 0x0c, 0x83, 0xfd, 0x6b, 0x35, 0x73, 0x27, 0xab, + 0xde, 0xc7, 0x52, 0xf3, 0xdf, 0xae, 0x61, 0x5e, 0x9f, 0xb9, 0xc0, 0xde, + 0x7c, 0xc3, 0x57, 0x52, 0xc2, 0x70, 0x94, 0x51, 0x0b, 0x0a, 0x37, 0x3e, + 0x8d, 0xa5, 0xfc, 0x62, 0xae, 0xda, 0x31, 0x97, 0x61, 0x58, 0xb3, 0x52, + 0x3a, 0x06, 0x3f, 0x07, 0x96, 0x63, 0xc4, 0xea, 0x37, 0xca, 0x8a, 0x78, + 0xb0, 0xf1, 0x64, 0x32, 0x04, 0xe7, 0x22, 0xb7, 0x33, 0x95, 0x68, 0x33, + 0x54, 0x4f, 0x23, 0x0c, 0x6f, 0x74, 0xad, 0xa2, 0xe8, 0x8d, 0x00, 0x2a, + 0xf4, 0x4d, 0x8f, 0xa3, 0x9f, 0xd8, 0xc9, 0x83, 0xb5, 0x3f, 0x32, 0x58, + 0xdb, 0x05, 0x51, 0xe6, 0x69, 0x69, 0xba, 0xf9, 0xa5, 0xd3, 0x3b, 0xd3, + 0xb5, 0x97, 0x1f, 0x84, 0xad, 0x07, 0xf8, 0xf7, 0x11, 0xab, 0xaa, 0x91, + 0x40, 0xd0, 0xc1, 0xec, 0xb7, 0x63, 0x57, 0x8a, 0xf6, 0x9e, 0xa8, 0x29, + 0xc2, 0x97, 0xdc, 0xaa, 0x52, 0xce, 0x74, 0xd4, 0x69, 0x3e, 0xa9, 0xe6, + 0x32, 0x0c, 0x58, 0xe1, 0x8c, 0xc3, 0x65, 0x75, 0xdd, 0xd3, 0x7e, 0x0d, + 0x17, 0x8e, 0xde, 0x69, 0x25, 0xee, 0x69, 0x0e, 0x08, 0xb1, 0xdb, 0xfe, + 0x57, 0x33, 0x66, 0xaf, 0x6b, 0xce, 0xc9, 0x49, 0xb2, 0x20, 0xb5, 0xbb, + 0xbd, 0x4b, 0xd2, 0xd6, 0x9d, 0x9a, 0x4f, 0x23, 0xc6, 0x39, 0x8f, 0x8f, + 0x2a, 0x4c, 0x5d, 0xc6, 0x07, 0xd8, 0xa8, 0x31, 0xd8, 0x09, 0x59, 0x9f, + 0x40, 0x54, 0x10, 0x73, 0x81, 0x78, 0x7b, 0xa0, 0xb7, 0x0a, 0x1d, 0xb8, + 0x4a, 0x7d, 0xeb, 0xb3, 0x0c, 0xe9, 0x81, 0xb0, 0x0f, 0x96, 0x00, 0xa7, + 0x76, 0x22, 0x55, 0xf6, 0x1d, 0x05, 0x70, 0x8d, 0xfc, 0xe6, 0x79, 0xd2, + 0xf0, 0x3b, 0x0e, 0xee, 0x53, 0x02, 0x39, 0x27, 0xe0, 0x84, 0x0c, 0xa2, + 0x6e, 0xe1, 0x97, 0x6b, 0x3f, 0xeb, 0x7e, 0x0f, 0x49, 0x83, 0xb9, 0x2e, + 0x21, 0xce, 0xdb, 0x82, 0x3e, 0xe8, 0x4f, 0x39, 0xd3, 0x53, 0x5a, 0x31, + 0xfe, 0xbb, 0x9c, 0xb8, 0xdd, 0xa3, 0xae, 0x4a, 0x3f, 0xc5, 0x85, 0x90, + 0x69, 0x9f, 0x13, 0xeb, 0x94, 0xee, 0xf9, 0x17, 0x4f, 0x28, 0xfa, 0x5b, + 0xfa, 0xb7, 0x47, 0xf3, 0x65, 0xbb, 0x2f, 0x24, 0x00, 0xd4, 0x40, 0xa6, + 0x9e, 0xb2, 0xbe, 0xe7, 0x53, 0x0f, 0x01, 0xe5, 0x11, 0xa2, 0x1f, 0xd0, + 0xbf, 0x33, 0x16, 0x6c, 0x0e, 0x51, 0xcd, 0x02, 0x5c, 0xf8, 0xdd, 0xaa, + 0x3a, 0x04, 0x4e, 0x2d, 0x65, 0xca, 0xa4, 0x45, 0x98, 0x8c, 0x5f, 0xcd, + 0x59, 0xf2, 0x72, 0x4f, 0xec, 0x71, 0x43, 0xa8, 0x2f, 0x28, 0xa8, 0xdf, + 0xfd, 0x61, 0x1c, 0xfc, 0xb7, 0x41, 0xb4, 0x02, 0x90, 0x32, 0xe8, 0x8e, + 0x28, 0x08, 0x57, 0x24, 0xaa, 0x4e, 0x4d, 0xe4, 0x65, 0xdf, 0x40, 0x9f, + 0x6c, 0x73, 0x8f, 0x5f, 0x3b, 0x8b, 0x5a, 0xfa, 0xb7, 0x68, 0x89, 0xcb, + 0x01, 0xe9, 0xf1, 0x53, 0x22, 0x4c, 0xdc, 0x3d, 0xd1, 0xbd, 0x56, 0x1d, + 0x37, 0x71, 0x06, 0xb2, 0x1e, 0x65, 0xf7, 0x7f, 0x9c, 0x73, 0xb2, 0x87, + 0xa5, 0xd5, 0x80, 0xf1, 0xc9, 0xa7, 0x45, 0xbb, 0x21, 0x17, 0x7c, 0x21, + 0xf0, 0xce, 0x04, 0x95, 0xd4, 0xc9, 0xef, 0x16, 0xfb, 0x01, 0x69, 0x47, + 0xb7, 0x53, 0x79, 0x8e, 0x3b, 0x24, 0x46, 0x7e, 0x19, 0xd7, 0x42, 0xe7, + 0x1e, 0x0f, 0xf2, 0x48, 0x58, 0x0c, 0xe3, 0x80, 0xf0, 0x76, 0xe6, 0xb0, + 0xe7, 0xc1, 0xbe, 0x3b, 0x62, 0x34, 0xd3, 0xf0, 0xbd, 0xd5, 0xe1, 0xdb, + 0x7c, 0xef, 0xe5, 0x2e, 0x91, 0x03, 0xb4, 0x7e, 0x3d, 0x99, 0x02, 0x79, + 0x83, 0x59, 0x64, 0xce, 0xe7, 0xac, 0x15, 0xf5, 0x5b, 0x3d, 0x42, 0xe3, + 0x8d, 0x03, 0xfb, 0xad, 0xf4, 0x0e, 0x1e, 0xe3, 0x61, 0xc2, 0x24, 0x0a, + 0xc7, 0xf4, 0x61, 0x74, 0x9a, 0xe9, 0x72, 0xec, 0x01, 0x39, 0x16, 0xec, + 0x68, 0x4a, 0xe3, 0x69, 0xbb, 0x8d, 0x01, 0x60, 0x44, 0x89, 0xab, 0x2f, + 0x9b, 0x2c, 0x27, 0x19, 0xb9, 0x00, 0xae, 0x88, 0x8e, 0xa7, 0x29, 0x23, + 0xcc, 0x58, 0xdf, 0x95, 0xfd, 0xca, 0xee, 0x57, 0xcd, 0xa2, 0x96, 0xac, + 0x14, 0x00, 0x50, 0x01, 0x12, 0x28, 0x5c, 0x16, 0x7b, 0x2b, 0x76, 0xe2, + 0xae, 0x00, 0x55, 0x32, 0xc8, 0x6a, 0xd3, 0x3b, 0xec, 0x18, 0x7b, 0xe8, + 0x8f, 0xcf, 0x63, 0x0b, 0x3c, 0x79, 0xc0, 0x47, 0xa3, 0x37, 0x28, 0x8e, + 0x92, 0x88, 0x71, 0x4c, 0xb6, 0xfa, 0x55, 0x6e, 0xc1, 0x5a, 0x1b, 0xc6, + 0x51, 0x95, 0x98, 0x0e, 0x70, 0xfb, 0x07, 0x1e, 0x27, 0x58, 0xe0, 0xe4, + 0x0d, 0x92, 0x2b, 0x05, 0x45, 0xbc, 0xc7, 0x70, 0x61, 0xd5, 0x58, 0xba, + 0x0f, 0x47, 0xc2, 0x5b, 0x41, 0xb1, 0x3a, 0x31, 0xfb, 0x30, 0xc3, 0xb3, + 0x1b, 0x54, 0x4e, 0x0e, 0xd8, 0x2f, 0x84, 0xbd, 0x4e, 0x90, 0x83, 0x75, + 0x32, 0xf7, 0xfe, 0x92, 0x34, 0x4b, 0xb4, 0x73, 0x2f, 0x51, 0xb9, 0x81, + 0xe1, 0xf2, 0x9f, 0x14, 0xb5, 0x4d, 0x97, 0x45, 0x7e, 0x15, 0xb7, 0x1b, + 0x56, 0x9b, 0x1f, 0xb0, 0x3e, 0x90, 0x4e, 0x9a, 0x17, 0x73, 0xe7, 0x27, + 0x7c, 0xd6, 0x2f, 0xfe, 0xca, 0xaa, 0xf2, 0xe6, 0x68, 0x91, 0x41, 0x46, + 0x0c, 0x94, 0xba, 0xb8, 0x5e, 0x8f, 0xec, 0x5e, 0x4f, 0x3b, 0x71, 0xc6, + 0x92, 0xac, 0xa2, 0x9c, 0x82, 0xae, 0xac, 0xb9, 0x67, 0x71, 0xc3, 0xf2, + 0x14, 0xa6, 0x6e, 0xa7, 0x94, 0xef, 0x6a, 0x06, 0x12, 0x0f, 0x79, 0x55, + 0x0a, 0x37, 0x6c, 0x36, 0x59, 0x2b, 0x2b, 0x13, 0x0d, 0xa7, 0xef, 0x75, + 0x68, 0xa2, 0xcc, 0xc4, 0x22, 0x16, 0x0a, 0x9e, 0x24, 0x7b, 0xa7, 0x38, + 0xe8, 0x24, 0x35, 0x6b, 0xf3, 0x03, 0x4b, 0xb2, 0x66, 0xc6, 0x73, 0x17, + 0x9d, 0x6d, 0xf5, 0x30, 0x76, 0x87, 0xb7, 0x4a, 0x2b, 0x64, 0x6b, 0x3c, + 0x1c, 0xbc, 0x48, 0x30, 0xd5, 0xf1, 0x3e, 0x88, 0xb5, 0x8b, 0x03, 0xa2, + 0xfb, 0x07, 0xbc, 0x51, 0x33, 0x75, 0xe3, 0x7e, 0x97, 0xd2, 0x1e, 0xa0, + 0x97, 0xd0, 0x51, 0x80, 0xbf, 0xb7, 0xf1, 0x81, 0x35, 0x70, 0x05, 0x57, + 0x70, 0xba, 0x46, 0x3f, 0x0d, 0x55, 0x8d, 0x6c, 0x40, 0x28, 0xf3, 0x42, + 0x81, 0x7d, 0x1f, 0x08, 0x4a, 0xaa, 0xcd, 0x3f, 0x40, 0x9c, 0xc4, 0x6e, + 0x03, 0x31, 0xbc, 0xeb, 0x97, 0x2c, 0xd2, 0x2b, 0x13, 0xda, 0x67, 0x53, + 0x1a, 0x18, 0x20, 0x15, 0x30, 0x62, 0xdc, 0x27, 0x15, 0x73, 0x89, 0x91, + 0xf8, 0x7e, 0x29, 0x3f, 0xfa, 0x8e, 0xae, 0x11, 0x47, 0x71, 0x24, 0x5e, + 0x11, 0xfc, 0xbc, 0xc7, 0x4f, 0xd6, 0x38, 0x52, 0xf6, 0x38, 0x39, 0xf9, + 0x54, 0x72, 0x6f, 0x61, 0x19, 0xb3, 0xe8, 0x17, 0x3b, 0xa9, 0x5f, 0x77, + 0x5a, 0x95, 0xbd, 0x2e, 0xcf, 0x44, 0x11, 0x07, 0x06, 0x7f, 0xeb, 0xd4, + 0x18, 0x5a, 0x22, 0x8c, 0x18, 0xa3, 0x72, 0x28, 0x31, 0x51, 0x8c, 0x40, + 0x93, 0x64, 0x82, 0xd3, 0x32, 0x69, 0xd1, 0x3a, 0xa9, 0x57, 0xae, 0xad, + 0x75, 0x83, 0xd9, 0xaa, 0xac, 0x2e, 0xc2, 0xbf, 0x12, 0xb7, 0xaa, 0x2a, + 0x27, 0x83, 0xaa, 0xbd, 0x3f, 0x95, 0x7d, 0xcb, 0x46, 0x14, 0x4e, 0x76, + 0xcd, 0x46, 0x4c, 0xbb, 0x96, 0x70, 0x85, 0xf5, 0x1f, 0x8f, 0x69, 0x76, + 0xd5, 0x22, 0x1c, 0x0b, 0x3e, 0x05, 0xf1, 0x6e, 0xb7, 0x60, 0xf1, 0xf4, + 0xe8, 0x55, 0xb6, 0x85, 0xb3, 0xf8, 0xd9, 0x8c, 0x3c, 0x94, 0x01, 0xe0, + 0x08, 0x9f, 0x9a, 0x0c, 0xd9, 0xb6, 0x3c, 0xda, 0x80, 0xb8, 0x03, 0x4c, + 0x70, 0xe7, 0x2d, 0x82, 0x65, 0x9c, 0x1e, 0xaf, 0xfc, 0xf3, 0x54, 0x70, + 0x93, 0x60, 0x14, 0xc3, 0x11, 0x3b, 0xf1, 0x7c, 0xcf, 0x84, 0x33, 0x8e, + 0x16, 0x05, 0x88, 0xd3, 0xb7, 0x62, 0xa6, 0x31, 0x86, 0xef, 0x99, 0x23, + 0xc8, 0x1d, 0xdc, 0x9c, 0xf9, 0x25, 0xff, 0x11, 0x49, 0x12, 0x0f, 0x49, + 0x5e, 0x57, 0x9f, 0xb6, 0xc3, 0x20, 0x74, 0xa7, 0xf5, 0x3b, 0x7b, 0x33, + 0x7a, 0xab, 0x87, 0x40, 0x22, 0x55, 0x75, 0x9b, 0x9a, 0x96, 0xec, 0x61, + 0x68, 0x0a, 0xbb, 0xe9, 0xdc, 0x6a, 0x25, 0xea, 0x1d, 0x5c, 0x79, 0x0f, + 0x7c, 0x07, 0x39, 0x8f, 0x48, 0xd3, 0x64, 0x05, 0xdc, 0xe7, 0x4d, 0xf3, + 0x3d, 0x03, 0x86, 0x70, 0xbd, 0x37, 0xdf, 0x98, 0x86, 0xd6, 0x11, 0x0f, + 0x9e, 0xf2, 0xab, 0x65, 0x71, 0xdd, 0xd6, 0x1b, 0xa7, 0x62, 0xee, 0x79, + 0x80, 0xac, 0xc8, 0xe9, 0xf0, 0xa9, 0x90, 0xb1, 0x31, 0xe4, 0xfa, 0xc6, + 0x15, 0x57, 0x92, 0xd0, 0x15, 0x16, 0xf1, 0xb1, 0x80, 0x80, 0x0a, 0x5a, + 0x02, 0x61, 0xfe, 0xe1, 0x11, 0x20, 0x4b, 0x5c, 0xde, 0x53, 0xf5, 0xc2, + 0x42, 0xc6, 0xab, 0xe8, 0x48, 0x0c, 0x38, 0xf1, 0x6e, 0x2e, 0x45, 0xa5, + 0xd6, 0x28, 0xf3, 0xc7, 0xb7, 0xb0, 0xa7, 0xb1, 0x31, 0x55, 0x89, 0x2c, + 0x55, 0xc2, 0x26, 0xda, 0xe3, 0x2c, 0x86, 0x74, 0x5f, 0x49, 0xf2, 0x3c, + 0xa0, 0xa2, 0xc6, 0x19, 0xf5, 0xfb, 0xa7, 0xd9, 0x73, 0x28, 0x49, 0x07, + 0x9f, 0x15, 0x66, 0x13, 0xda, 0xb2, 0x98, 0xea, 0xa1, 0x03, 0x8d, 0x5e, + 0x91, 0x5d, 0xda, 0x95, 0x5f, 0x61, 0x43, 0xf0, 0x55, 0x1b, 0x2a, 0x87, + 0x13, 0x59, 0x7f, 0x26, 0x2f, 0x7f, 0x53, 0xc8, 0x5b, 0xa6, 0x57, 0x0b, + 0x79, 0xb4, 0x6a, 0xee, 0x76, 0x90, 0xa6, 0x1d, 0x67, 0xf7, 0x8b, 0xbf, + 0x87, 0x1d, 0x0f, 0xcf, 0xad, 0x11, 0xb3, 0x78, 0xca, 0x75, 0xe4, 0xc2, + 0x29, 0x22, 0xde, 0xf3, 0x57, 0x07, 0x0c, 0xf8, 0x13, 0x8a, 0xd0, 0x72, + 0xc3, 0x54, 0x76, 0xfb, 0x41, 0xc7, 0xfa, 0x02, 0x45, 0xd8, 0x44, 0x6c, + 0x67, 0x0c, 0x5b, 0xbc, 0xcc, 0xd6, 0xdc, 0x70, 0x44, 0x78, 0x0d, 0x85, + 0x26, 0x28, 0xc8, 0xe5, 0x63, 0x29, 0xb0, 0xf1, 0xe2, 0xe5, 0xa1, 0x09, + 0x70, 0x3f, 0x27, 0x9f, 0x86, 0x67, 0xca, 0x2d, 0xa1, 0x4c, 0xed, 0xa2, + 0xb4, 0xcc, 0x02, 0x55, 0xdf, 0xd0, 0x37, 0x44, 0xf3, 0xfb, 0x3d, 0xcb, + 0x03, 0xb6, 0x71, 0xf0, 0x5a, 0xc8, 0x13, 0x1d, 0x1f, 0x68, 0x15, 0xa0, + 0xd8, 0x49, 0xd3, 0x0c, 0xdd, 0xe3, 0x44, 0xef, 0xaf, 0x11, 0xc9, 0x05, + 0xb9, 0xdb, 0xab, 0x5f, 0xbb, 0xe4, 0xe1, 0x43, 0x80, 0x90, 0x06, 0xd2, + 0x1e, 0xf4, 0xf3, 0xf3, 0x3a, 0xe0, 0x6b, 0x99, 0xc3, 0xb6, 0x18, 0x18, + 0xbf, 0x63, 0xe3, 0x01, 0xa7, 0x8c, 0x56, 0x53, 0x5f, 0xb3, 0x4c, 0x1e, + 0x2f, 0xdf, 0x1f, 0x7d, 0x83, 0x70, 0xe1, 0x1f, 0x04, 0xad, 0x15, 0x7d, + 0xac, 0xfa, 0x03, 0xab, 0x20, 0x26, 0x1f, 0xe6, 0x41, 0x9b, 0x40, 0x26, + 0x92, 0x61, 0x1f, 0x8e, 0x92, 0x05, 0xb9, 0x88, 0xa8, 0xc2, 0x76, 0x70, + 0xb1, 0xc9, 0x48, 0x2b, 0xdc, 0x8e, 0x0c, 0x71, 0x44, 0x0d, 0xbc, 0x2e, + 0x45, 0x66, 0x07, 0x45, 0xce, 0xd8, 0xca, 0x60, 0x70, 0xb0, 0xca, 0x16, + 0x3a, 0x06, 0x9e, 0x24, 0x77, 0xa7, 0xe2, 0x61, 0xdc, 0x64, 0x06, 0x9f, + 0x2e, 0x54, 0x3c, 0xf0, 0xa8, 0x31, 0x0c, 0xb8, 0x6b, 0xae, 0x51, 0x6a, + 0x65, 0xb6, 0x26, 0xe2, 0x7c, 0xb4, 0xc9, 0x1f, 0x83, 0x3a, 0x0c, 0xe9, + 0x68, 0xd6, 0xfa, 0xbe, 0xb5, 0xf0, 0x28, 0x5c, 0xbe, 0x2f, 0x46, 0x13, + 0xc5, 0x9c, 0x97, 0xc2, 0x04, 0xdd, 0xf2, 0x16, 0x2a, 0xa1, 0xe5, 0x67, + 0xe3, 0xb7, 0x77, 0xc9, 0x5e, 0xda, 0x91, 0x2f, 0x3c, 0xe2, 0xa4, 0x2c, + 0x7e, 0x61, 0xf2, 0x13, 0xde, 0xa0, 0x0d, 0x00, 0x34, 0x0d, 0xf2, 0x25, + 0x40, 0x81, 0x95, 0x5c, 0x95, 0xf2, 0xe9, 0x83, 0x2a, 0xe4, 0x38, 0x0a, + 0xd7, 0x79, 0x02, 0x17, 0x70, 0x0a, 0x17, 0x68, 0x3d, 0xfb, 0x50, 0x55, + 0xe1, 0xc8, 0x9e, 0xbe, 0x8e, 0xde, 0xa2, 0x4c, 0x77, 0x1f, 0xca, 0xdd, + 0x64, 0xdf, 0x83, 0x84, 0x67, 0xfe, 0x3e, 0x8e, 0xc6, 0x19, 0x65, 0x6d, + 0xe7, 0xa7, 0xf9, 0x38, 0xa4, 0xb8, 0xe7, 0x15, 0x37, 0x0f, 0x1b, 0x15, + 0x80, 0x60, 0xf5, 0xf0, 0xcb, 0xc2, 0x0c, 0x25, 0x69, 0x9d, 0x88, 0xe0, + 0x7c, 0xcb, 0xe8, 0x41, 0x4f, 0x67, 0x34, 0x3c, 0x42, 0x00, 0x06, 0x17, + 0x7c, 0xa2, 0xb3, 0x1c, 0xb8, 0x60, 0x91, 0xfa, 0xb5, 0xa5, 0x45, 0xa3, + 0x6b, 0xd8, 0x52, 0xb0, 0x64, 0xc3, 0x5b, 0xd7, 0x09, 0x0d, 0x78, 0x7e, + 0xd4, 0xf4, 0xb5, 0x03, 0x4e, 0x8b, 0xb4, 0x7a, 0x19, 0x2a, 0xa4, 0x81, + 0x39, 0x4f, 0x91, 0x96, 0xf0, 0xcd, 0xc4, 0x7a, 0x68, 0xbf, 0x01, 0x3f, + 0x73, 0x9d, 0x83, 0xc6, 0xc0, 0x82, 0x14, 0x6a, 0xd0, 0x79, 0x0c, 0xcc, + 0x26, 0x7a, 0x70, 0xcb, 0x44, 0x99, 0x7f, 0xdd, 0x4f, 0xaa, 0xd9, 0x6a, + 0xb9, 0x24, 0x3b, 0x70, 0xfc, 0xbd, 0x8b, 0xeb, 0x70, 0x3a, 0x79, 0x7e, + 0xb1, 0x9b, 0x30, 0x40, 0x59, 0xae, 0xb6, 0x0f, 0xc8, 0xe6, 0xb6, 0x56, + 0xa2, 0xb1, 0xbc, 0x99, 0x08, 0xd9, 0x7b, 0x17, 0xcf, 0x41, 0xc6, 0xaa, + 0x72, 0x4c, 0x3e, 0xae, 0x74, 0x14, 0x5b, 0x52, 0xb1, 0x6f, 0xcb, 0x8e, + 0x5c, 0xee, 0xc7, 0x49, 0x87, 0x30, 0x7c, 0x69, 0x1a, 0x25, 0x7e, 0xa1, + 0xfb, 0x90, 0x6e, 0xf6, 0x4e, 0x81, 0xce, 0x7d, 0x07, 0xf3, 0x7c, 0x7e, + 0x2b, 0xdb, 0x61, 0x2e, 0xa7, 0x60, 0x07, 0xe4, 0xd1, 0xea, 0x37, 0x80, + 0xe1, 0xcf, 0x9b, 0xd3, 0x52, 0x6b, 0xe7, 0xeb, 0x05, 0x58, 0x1d, 0x6a, + 0x03, 0xcf, 0xb7, 0x07, 0xf5, 0x4f, 0xf5, 0x3b, 0x28, 0xbf, 0xec, 0x04, + 0xab, 0x74, 0x68, 0x7b, 0x13, 0xb7, 0xd8, 0x48, 0x13, 0x2e, 0xb5, 0xb0, + 0x53, 0x28, 0xde, 0xd9, 0xc4, 0x36, 0x46, 0x2b, 0xf0, 0x59, 0x85, 0x31, + 0x83, 0xd7, 0x06, 0xec, 0xad, 0xc8, 0xa8, 0x30, 0xd5, 0x92, 0x57, 0xc6, + 0x6d, 0x4a, 0x7c, 0x9f, 0x8b, 0xba, 0xd3, 0xd4, 0x26, 0xc2, 0xda, 0xb0, + 0x09, 0x66, 0xb2, 0x3f, 0x6c, 0xe4, 0x90, 0xd3, 0xad, 0x2b, 0x68, 0xad, + 0x3d, 0xbf, 0x09, 0xa7, 0x6f, 0x4d, 0x06, 0xf0, 0x38, 0xa7, 0xc5, 0x23, + 0x42, 0x40, 0x37, 0xff, 0x9d, 0xf9, 0xeb, 0x6d, 0x28, 0x34, 0x40, 0x1a, + 0x30, 0x38, 0xca, 0x2e, 0x8c, 0x35, 0x56, 0x17, 0x14, 0x7a, 0x1c, 0x5e, + 0x01, 0x82, 0xc4, 0x79, 0x3f, 0xc6, 0x9b, 0xab, 0xc0, 0x9b, 0x8a, 0xa1, + 0x10, 0x8a, 0x61, 0x10, 0x8a, 0xae, 0xe0, 0xc3, 0x4b, 0x1e, 0xa3, 0x20, + 0x4d, 0xe6, 0x04, 0x10, 0xb4, 0xd4, 0x45, 0x90, 0x36, 0x80, 0xa2, 0x68, + 0x81, 0xcc, 0x82, 0x2b, 0xbe, 0x4f, 0x3e, 0x80, 0xb3, 0xf1, 0x4c, 0xde, + 0xa0, 0xbf, 0xf6, 0xf1, 0x4a, 0xcd, 0xb5, 0xc6, 0x22, 0x10, 0x1e, 0x6e, + 0x51, 0x71, 0x85, 0xfc, 0xf7, 0xfc, 0x40, 0x28, 0x2b, 0x35, 0x99, 0x79, + 0x25, 0x81, 0xe3, 0x31, 0x47, 0x53, 0x39, 0x7e, 0x8c, 0xc0, 0xec, 0xc8, + 0xd3, 0x15, 0x07, 0x0d, 0x98, 0x20, 0xd5, 0x14, 0xe9, 0xfd, 0x50, 0xc4, + 0x26, 0x9e, 0xa9, 0xf9, 0xfa, 0x43, 0x52, 0xfb, 0x17, 0x1c, 0xe1, 0x89, + 0x8a, 0x6c, 0x6d, 0x73, 0x55, 0xf4, 0x01, 0x9e, 0x3e, 0x96, 0x8c, 0xc0, + 0xc3, 0x76, 0x45, 0x63, 0x1a, 0x5b, 0x39, 0x16, 0x5d, 0x49, 0x49, 0xf0, + 0x32, 0xbe, 0xce, 0x59, 0xc4, 0x8e, 0xed, 0x86, 0x5a, 0xa9, 0x16, 0x79, + 0x09, 0x69, 0x28, 0x78, 0x00, 0x17, 0x87, 0xe7, 0x5b, 0x08, 0x27, 0x7c, + 0x03, 0xb5, 0x13, 0x37, 0xa9, 0xcc, 0xdd, 0x9d, 0xf7, 0x94, 0x42, 0x93, + 0x56, 0x4e, 0xa0, 0xae, 0x78, 0x86, 0xa2, 0x30, 0xa9, 0xed, 0x4d, 0x3f, + 0x3b, 0x4c, 0x13, 0xfb, 0xa6, 0x23, 0x83, 0x59, 0xcf, 0x49, 0x59, 0x30, + 0x7c, 0xd8, 0xd6, 0xc7, 0x58, 0x1a, 0x9e, 0x0e, 0x74, 0x46, 0xd4, 0x9c, + 0x2a, 0xfe, 0x06, 0xcb, 0xef, 0xde, 0x34, 0x91, 0xee, 0xb7, 0xa9, 0xf0, + 0x03, 0xe9, 0xca, 0x28, 0x7c, 0xa3, 0x00, 0xb3, 0xf8, 0xd2, 0x15, 0xd0, + 0x3d, 0x1c, 0x9a, 0x10, 0xbb, 0x3e, 0xe8, 0x23, 0xef, 0x7f, 0x9b, 0xe1, + 0x9d, 0xc5, 0x3b, 0xac, 0x0d, 0xd2, 0x77, 0x6e, 0xb3, 0x2d, 0x04, 0x51, + 0xed, 0x61, 0x40, 0xdd, 0x18, 0xcf, 0x3c, 0x23, 0x63, 0xb8, 0x4d, 0x11, + 0x8e, 0x9c, 0x65, 0x80, 0xb0, 0x02, 0xb6, 0x4d, 0x00, 0x44, 0x92, 0x93, + 0x17, 0xb7, 0x60, 0xf2, 0xbb, 0xd2, 0xf2, 0xf6, 0xd0, 0xd3, 0xf1, 0x2a, + 0xc9, 0x87, 0x69, 0x29, 0xfe, 0x71, 0x7f, 0x64, 0x38, 0x28, 0x7c, 0xe4, + 0xb4, 0x88, 0xe0, 0x20, 0xed, 0x37, 0x7a, 0xd4, 0xef, 0x89, 0x87, 0xab, + 0xfb, 0x4d, 0x06, 0xd7, 0x97, 0x6b, 0x6a, 0xad, 0xe5, 0xc0, 0x91, 0x79, + 0xc8, 0xa8, 0xce, 0xc0, 0x09, 0x58, 0x3d, 0xd8, 0xfa, 0xd2, 0x77, 0x9c, + 0x3a, 0x61, 0x5b, 0x1e, 0x0a, 0xf7, 0x9e, 0x9b, 0x08, 0x5e, 0x14, 0x02, + 0x6d, 0x49, 0xf4, 0x84, 0xe5, 0x03, 0x82, 0x95, 0x9a, 0x82, 0xa9, 0x1d, + 0xd8, 0x49, 0x2a, 0x28, 0x88, 0x18, 0x01, 0xef, 0x3b, 0x4e, 0x62, 0x53, + 0xb6, 0x91, 0x3b, 0xa7, 0x01, 0x49, 0x8c, 0x90, 0x46, 0x8e, 0x6d, 0x8b, + 0x21, 0x42, 0x5d, 0xf8, 0x1e, 0xd7, 0xbf, 0x4b, 0xe3, 0xa1, 0x25, 0x83, + 0xff, 0x16, 0x73, 0xa6, 0x07, 0xfe, 0x4e, 0x6c, 0x77, 0x0d, 0xaf, 0x8f, + 0x9e, 0x5a, 0xde, 0x34, 0x54, 0xb4, 0x21, 0x48, 0xdb, 0xe0, 0x92, 0xed, + 0x2f, 0xcb, 0x0c, 0x18, 0x42, 0xbe, 0x62, 0xa2, 0x62, 0x9f, 0xdc, 0xb8, + 0x8a, 0xc8, 0xf8, 0xe0, 0xf9, 0xa9, 0x3a, 0x7f, 0xaf, 0x08, 0x09, 0xef, + 0x68, 0xaa, 0xea, 0xc8, 0xb8, 0xc4, 0xf7, 0x30, 0xa7, 0xf6, 0x1b, 0x83, + 0xed, 0x28, 0xa8, 0xfb, 0x27, 0x9d, 0xef, 0x54, 0x10, 0x04, 0x46, 0xe1, + 0xea, 0x02, 0xc2, 0xb3, 0xe2, 0x9d, 0x1c, 0x96, 0xe7, 0x89, 0x6b, 0xe4, + 0xf1, 0x7e, 0x4f, 0x61, 0x44, 0x54, 0x9f, 0x80, 0xcd, 0xeb, 0x81, 0x20, + 0x28, 0xec, 0x37, 0x61, 0x34, 0xb1, 0xcf, 0x2a, 0x35, 0x75, 0x9e, 0xea, + 0xb9, 0xb1, 0x78, 0x71, 0x09, 0x4e, 0xe5, 0x17, 0x1a, 0x05, 0x34, 0xfd, + 0xce, 0x7e, 0x51, 0xcb, 0x8d, 0x53, 0x9d, 0x4a, 0x36, 0x52, 0xc8, 0x95, + 0xef, 0xee, 0xab, 0xba, 0x3b, 0x4d, 0x44, 0x57, 0xd9, 0x81, 0xe2, 0x58, + 0xe7, 0x64, 0x8c, 0xa0, 0xa9, 0x02, 0x34, 0xee, 0xa4, 0x2f, 0x44, 0xa9, + 0x94, 0x08, 0x16, 0x1a, 0x19, 0x69, 0x1f, 0x8b, 0x6f, 0x9f, 0x3c, 0xc4, + 0xfc, 0x7b, 0x21, 0xc6, 0x40, 0x88, 0x8b, 0xc8, 0xc3, 0x2f, 0x31, 0xa5, + 0xf5, 0x4b, 0x2f, 0x55, 0x54, 0x23, 0xa5, 0x94, 0xf6, 0xaf, 0x79, 0x6e, + 0x35, 0x97, 0x09, 0xf0, 0xaf, 0x1d, 0xac, 0xb7, 0x95, 0x12, 0x9b, 0xdb, + 0xfd, 0x0b, 0x19, 0x41, 0x32, 0x71, 0x09, 0x23, 0xbd, 0x56, 0xb4, 0x3d, + 0xe3, 0x59, 0x95, 0xf7, 0x4d, 0x8c, 0x7d, 0x8d, 0xfc, 0x94, 0x28, 0x09, + 0x92, 0xb4, 0xc5, 0xb1, 0xaf, 0x65, 0x60, 0x6e, 0x21, 0xba, 0x75, 0x6b, + 0x37, 0x7c, 0xaa, 0xf7, 0xda, 0x04, 0xff, 0x8c, 0x05, 0xcd, 0x9d, 0xe9, + 0xc7, 0x76, 0x4d, 0x1b, 0xe6, 0xa6, 0x87, 0xf5, 0x16, 0xf9, 0xa8, 0x14, + 0x0d, 0xd0, 0x87, 0x6c, 0x62, 0x94, 0xdc, 0x83, 0x81, 0xe5, 0x1a, 0x68, + 0x79, 0x1c, 0x46, 0x2a, 0xe2, 0xea, 0x96, 0xc7, 0x7f, 0xef, 0x53, 0x0b, + 0x88, 0x59, 0x3e, 0xe7, 0xce, 0x1e, 0xc1, 0xba, 0x8a, 0xfa, 0xeb, 0xbb, + 0x07, 0xc4, 0x33, 0x6d, 0xda, 0xf0, 0x0a, 0x4e, 0xbf, 0x95, 0x9f, 0xc2, + 0xb4, 0xd3, 0x2b, 0x95, 0xd4, 0xba, 0x1c, 0x36, 0x7f, 0x8d, 0x1a, 0xd9, + 0x7c, 0x20, 0x7c, 0xf9, 0xd0, 0x9f, 0xa2, 0x90, 0x63, 0x7a, 0x10, 0x9e, + 0x78, 0x75, 0xbd, 0x34, 0x62, 0xaa, 0xc7, 0x59, 0x5f, 0xbe, 0x30, 0xf8, + 0x86, 0xcb, 0x1e, 0xcc, 0x63, 0x5d, 0x81, 0x12, 0x28, 0xe6, 0x3d, 0xbc, + 0x99, 0x3a, 0x4d, 0x1d, 0x3b, 0xb9, 0xd8, 0xdc, 0x3f, 0x0e, 0x27, 0x34, + 0xe7, 0xdd, 0xb2, 0x28, 0xf7, 0x93, 0x64, 0x27, 0x0c, 0xbc, 0x6e, 0x29, + 0x7c, 0xe9, 0x5a, 0x56, 0x1f, 0x13, 0x45, 0x97, 0x4e, 0xfa, 0xce, 0xe0, + 0x2d, 0x0f, 0xe8, 0x77, 0x71, 0xa7, 0x29, 0x0f, 0x21, 0x8c, 0x7a, 0x20, + 0xf8, 0x3a, 0x18, 0x93, 0x6d, 0xd8, 0xaa, 0x9a, 0x25, 0xad, 0xf5, 0x37, + 0x6a, 0x4d, 0xe7, 0xc0, 0xbd, 0x97, 0x75, 0x91, 0x7e, 0x74, 0xf4, 0x24, + 0x45, 0xbf, 0x86, 0x86, 0x8d, 0xa0, 0x15, 0xd4, 0x07, 0x65, 0x82, 0xc3, + 0x18, 0xd0, 0x73, 0x99, 0x4d, 0x5f, 0x8d, 0xe6, 0x49, 0x94, 0xb1, 0x67, + 0xba, 0x76, 0x51, 0xf2, 0xfa, 0x01, 0xc2, 0x7f, 0xee, 0x3c, 0x85, 0x2a, + 0xc7, 0x36, 0x78, 0x79, 0x1e, 0x67, 0x6c, 0x4b, 0x74, 0x16, 0xa2, 0x6d, + 0xa5, 0x02, 0x61, 0xdb, 0x09, 0xcb, 0x9d, 0x32, 0xeb, 0x86, 0xe1, 0x72, + 0x7e, 0x26, 0xc8, 0xe4, 0x7c, 0x3e, 0x61, 0xe3, 0x41, 0xcc, 0x41, 0x00, + 0xd3, 0x47, 0x98, 0x4f, 0x90, 0x95, 0x77, 0x64, 0x8f, 0x1d, 0x97, 0xe1, + 0x93, 0xb9, 0x11, 0x13, 0x8f, 0xeb, 0xe7, 0x02, 0x98, 0x5a, 0x6c, 0xbc, + 0x60, 0x90, 0x25, 0xb7, 0x2f, 0x93, 0xf3, 0x4b, 0xb5, 0xde, 0xed, 0xac, + 0x45, 0x22, 0x7b, 0x75, 0x69, 0x55, 0xd2, 0xf4, 0xf2, 0x9e, 0x8a, 0x2e, + 0x2f, 0x58, 0x0f, 0x08, 0x21, 0xcb, 0x24, 0x13, 0x39, 0x41, 0x01, 0x2a, + 0x12, 0x98, 0xe7, 0x6b, 0x6b, 0xbb, 0x35, 0xf6, 0x30, 0x1f, 0x4f, 0x5f, + 0x9c, 0xfb, 0x5c, 0xf7, 0x07, 0x91, 0xf1, 0xe4, 0x4a, 0x89, 0xf4, 0x61, + 0x7e, 0xc3, 0xb0, 0x27, 0xbb, 0x62, 0x9c, 0x35, 0xf0, 0xdb, 0x87, 0x0b, + 0x39, 0x93, 0xe0, 0x83, 0x5d, 0x73, 0x12, 0x56, 0x7e, 0xc7, 0xde, 0x45, + 0xd7, 0xbb, 0x99, 0x33, 0xc4, 0xe3, 0xb8, 0x6c, 0x31, 0xe4, 0x36, 0xad, + 0x29, 0x58, 0xe9, 0x77, 0xfc, 0xb9, 0x8a, 0xdc, 0xf6, 0xcb, 0x7c, 0xd4, + 0x70, 0xf2, 0xdd, 0x51, 0x53, 0xd9, 0xab, 0x04, 0x51, 0x4e, 0xa9, 0x93, + 0xdf, 0x74, 0x0b, 0x67, 0x0f, 0x9c, 0xc4, 0x4f, 0x14, 0x53, 0x97, 0xcb, + 0x41, 0x39, 0x75, 0xf8, 0xb0, 0x9d, 0xcd, 0x5e, 0x31, 0x99, 0x66, 0xab, + 0xe0, 0xe8, 0x17, 0x66, 0xc2, 0x2f, 0x3a, 0x01, 0xb1, 0x15, 0x9d, 0xc2, + 0x51, 0x0c, 0x8a, 0xbe, 0x7d, 0xd2, 0x22, 0xd3, 0x85, 0xee, 0xc7, 0xf3, + 0x54, 0xf4, 0xbc, 0xa3, 0x7f, 0x99, 0x61, 0x57, 0xba, 0xf6, 0xd9, 0xfb, + 0x54, 0xcc, 0xca, 0x55, 0x5f, 0x3d, 0xd0, 0xda, 0xd8, 0x94, 0x86, 0x35, + 0xf8, 0xd5, 0x02, 0xff, 0x8b, 0x35, 0xe5, 0x2c, 0xf0, 0x62, 0xb2, 0x54, + 0x87, 0xad, 0x15, 0x07, 0xbc, 0x4f, 0x0f, 0xa4, 0x79, 0xa5, 0xc6, 0x55, + 0xd5, 0x6f, 0x79, 0xfb, 0x76, 0x10, 0x1c, 0xc5, 0xe1, 0x97, 0x42, 0x47, + 0x59, 0x82, 0xd6, 0xae, 0x9d, 0x83, 0xd1, 0x9d, 0x02, 0x9e, 0xa9, 0x80, + 0x08, 0x3b, 0x3d, 0x5b, 0x13, 0xac, 0xf8, 0x69, 0x2a, 0xe6, 0xdc, 0xec, + 0x82, 0x29, 0x07, 0xcf, 0x47, 0x3f, 0x12, 0xd4, 0xc4, 0x47, 0x46, 0x9d, + 0x91, 0x17, 0x68, 0x69, 0x1e, 0x2a, 0xa6, 0xb4, 0x86, 0xab, 0xd6, 0x3a, + 0x9b, 0xb0, 0xf3, 0x5b, 0x18, 0xda, 0xef, 0x78, 0x3b, 0xa7, 0x9e, 0xef, + 0x10, 0x27, 0xf2, 0xed, 0xd6, 0x8f, 0x74, 0xf7, 0xaf, 0x97, 0x06, 0x6a, + 0xbb, 0x49, 0x63, 0x6e, 0xc2, 0x38, 0xaf, 0xae, 0xf8, 0x6f, 0x5d, 0x4b, + 0x32, 0x20, 0xd4, 0x7b, 0xa4, 0xdc, 0x8d, 0xef, 0xfb, 0x7e, 0x15, 0xbf, + 0x97, 0xb0, 0x9a, 0x63, 0xcd, 0x06, 0x6c, 0x9e, 0x46, 0x2d, 0xfc, 0x61, + 0x86, 0xa6, 0x7d, 0x32, 0xc5, 0xdc, 0x7c, 0x8b, 0xa4, 0x06, 0xbf, 0xd6, + 0x6c, 0x13, 0x37, 0x7a, 0xb1, 0xb9, 0x15, 0x1c, 0xb7, 0x9e, 0x22, 0x44, + 0xb8, 0x15, 0xeb, 0x54, 0xe4, 0x03, 0x7d, 0xcf, 0xfa, 0x77, 0x70, 0xd1, + 0x7e, 0xd6, 0x53, 0xde, 0x73, 0x16, 0x12, 0x64, 0xa0, 0x91, 0xde, 0x1b, + 0xdf, 0xfc, 0x94, 0x40, 0x28, 0xae, 0x8a, 0x2c, 0x32, 0xa2, 0xf8, 0xe4, + 0x11, 0xce, 0xa7, 0xec, 0xa9, 0x11, 0xda, 0x38, 0xb6, 0x19, 0x9a, 0x7c, + 0xeb, 0xd1, 0xfc, 0x0c, 0x7f, 0xff, 0x48, 0xa5, 0x1f, 0xb3, 0x93, 0xf5, + 0x30, 0x98, 0xbf, 0xb9, 0x5d, 0x74, 0x36, 0xb7, 0x5a, 0x29, 0xbb, 0x7c, + 0x4b, 0xea, 0xa7, 0x73, 0x27, 0x5d, 0x06, 0x86, 0x90, 0xa3, 0x3c, 0xf9, + 0x7e, 0xb5, 0x2a, 0x87, 0xaf, 0x73, 0xd4, 0xaa, 0x39, 0x4b, 0x1d, 0xf6, + 0xb2, 0xdb, 0xa3, 0x5d, 0x97, 0xe7, 0x2e, 0x6a, 0xb3, 0x56, 0xb9, 0x31, + 0x75, 0xdd, 0x67, 0xe2, 0xec, 0x01, 0x94, 0x81, 0xea, 0xee, 0xb8, 0xc4, + 0x49, 0x7b, 0x13, 0xfb, 0xde, 0x74, 0xa2, 0x32, 0x24, 0xda, 0x6f, 0xee, + 0x2b, 0x7b, 0xc2, 0x2a, 0x57, 0x05, 0x2f, 0xca, 0x84, 0x86, 0xb8, 0x07, + 0x02, 0x28, 0xc8, 0x85, 0x25, 0x95, 0xa0, 0x24, 0x64, 0x58, 0x76, 0x39, + 0xee, 0x7c, 0xba, 0xac, 0x3f, 0x62, 0x3a, 0x14, 0x92, 0xc1, 0x50, 0xba, + 0xeb, 0x7a, 0xc0, 0x14, 0xb1, 0xa0, 0x87, 0x93, 0x5b, 0xdc, 0x71, 0x84, + 0x97, 0xc9, 0x9e, 0xa9, 0x22, 0xad, 0x25, 0xa5, 0xe7, 0xef, 0x4e, 0x5f, + 0xad, 0xb7, 0x8e, 0x56, 0x3e, 0x7f, 0x7a, 0xae, 0xfc, 0x40, 0xe4, 0xa4, + 0x99, 0x84, 0xdf, 0x0d, 0x70, 0xf5, 0xcb, 0xc3, 0xd8, 0xb8, 0x7b, 0x84, + 0x34, 0x94, 0x39, 0x4d, 0xe6, 0xea, 0x82, 0x03, 0x4c, 0xbb, 0xda, 0xea, + 0xc2, 0xbe, 0x0d, 0x43, 0xef, 0x7a, 0xa1, 0x4c, 0x0d, 0x08, 0xaa, 0xa8, + 0x9d, 0x3f, 0x97, 0xfd, 0xac, 0x57, 0x5c, 0xc1, 0x43, 0x1e, 0x98, 0x26, + 0x71, 0xb0, 0x4b, 0xe7, 0x48, 0xcf, 0xf0, 0x4b, 0xb6, 0x34, 0x91, 0x85, + 0xdf, 0xb8, 0x10, 0x63, 0xae, 0xd2, 0x71, 0x61, 0x59, 0xcd, 0x86, 0xa5, + 0x8d, 0xff, 0x94, 0x7a, 0x58, 0x45, 0x9e, 0x5a, 0x0a, 0xc4, 0x79, 0x25, + 0xe6, 0x43, 0x84, 0x3f, 0xc8, 0x53, 0xed, 0xb5, 0x9b, 0x65, 0xc9, 0xff, + 0x9e, 0xcf, 0x72, 0x0e, 0xd1, 0x1a, 0x46, 0xc3, 0xb2, 0x6b, 0xd1, 0xcb, + 0xb3, 0xb3, 0x3c, 0xdf, 0xdf, 0xbd, 0xeb, 0xc8, 0xdc, 0x1e, 0xcf, 0xc1, + 0xe7, 0x4a, 0x7d, 0x94, 0x2a, 0x93, 0x8e, 0xdb, 0xb3, 0x62, 0x1e, 0x49, + 0x2e, 0x83, 0xfc, 0x9c, 0x0d, 0xae, 0x10, 0x7f, 0x29, 0x8d, 0xa8, 0xe7, + 0x07, 0x29, 0xbd, 0xb3, 0x34, 0x03, 0x93, 0x95, 0x65, 0xa3, 0x56, 0xa9, + 0x13, 0x12, 0x1f, 0x9f, 0xec, 0xce, 0x72, 0x25, 0x99, 0x0f, 0x1f, 0x56, + 0x16, 0xad, 0x7f, 0xd4, 0x9f, 0x96, 0xe5, 0x4c, 0x67, 0x33, 0x31, 0x04, + 0xb9, 0x00, 0x11, 0x9a, 0xee, 0xc0, 0xee, 0x6d, 0xe6, 0x75, 0x15, 0xc1, + 0x1a, 0x42, 0xe3, 0x11, 0xf4, 0xb7, 0x1b, 0x8b, 0x37, 0xe9, 0x9a, 0xa0, + 0xad, 0x11, 0x2a, 0xa4, 0x34, 0xb5, 0xe2, 0xdf, 0xc8, 0x13, 0x0c, 0x0a, + 0xa2, 0x0c, 0xdf, 0x5f, 0x40, 0x45, 0x1a, 0x7a, 0xbb, 0xa6, 0x44, 0xb4, + 0xf3, 0x3c, 0xa1, 0x1a, 0xc8, 0x7a, 0xc9, 0x56, 0xcc, 0x5c, 0x9f, 0x86, + 0x1d, 0x2c, 0x10, 0xab, 0x0e, 0x70, 0x0a, 0x12, 0x06, 0x32, 0x35, 0xa9, + 0x94, 0xd8, 0x87, 0x6b, 0xe4, 0xa7, 0x13, 0x1c, 0xc9, 0x05, 0xb4, 0xab, + 0x83, 0xd0, 0xcf, 0x49, 0x7e, 0xa2, 0xa4, 0xad, 0x41, 0x64, 0x95, 0xf4, + 0xab, 0x8c, 0x95, 0xab, 0xef, 0x30, 0x78, 0x66, 0x5d, 0x8f, 0x6c, 0x41, + 0x0c, 0x16, 0x4b, 0x2f, 0xff, 0x49, 0x9e, 0x7a, 0x1d, 0x4b, 0x04, 0x9c, + 0xf7, 0x32, 0xd1, 0x78, 0xdb, 0xd3, 0xbd, 0xb6, 0x9b, 0xd6, 0xa9, 0x56, + 0x5b, 0xd1, 0x4c, 0x52, 0x4f, 0x59, 0x64, 0x91, 0x14, 0x18, 0x62, 0xea, + 0xee, 0x68, 0xd5, 0x7e, 0xb0, 0xc3, 0xe7, 0xb9, 0x84, 0x3f, 0x49, 0xe9, + 0xb7, 0x4d, 0xaa, 0xd2, 0x86, 0x18, 0x1b, 0x0d, 0xc5, 0x27, 0x9d, 0x6d, + 0x9a, 0x35, 0x97, 0x46, 0x03, 0x71, 0xa0, 0xa0, 0x93, 0xac, 0x64, 0xad, + 0x5f, 0xb1, 0x4c, 0x47, 0xbc, 0x07, 0x2b, 0x45, 0xb9, 0x17, 0x6a, 0x72, + 0xd4, 0xbb, 0x92, 0x13, 0x0f, 0x03, 0xae, 0x01, 0xb8, 0xce, 0xc1, 0x7e, + 0xc8, 0x66, 0x3b, 0xb8, 0x1d, 0x71, 0x87, 0x76, 0x7d, 0x94, 0xbe, 0xdf, + 0x7a, 0xd0, 0x71, 0xaa, 0xb6, 0xa4, 0xf1, 0x60, 0x27, 0x4a, 0x62, 0xb0, + 0x4c, 0x5b, 0xb3, 0xaf, 0xe9, 0x73, 0xf3, 0x1c, 0x09, 0x64, 0xad, 0x0c, + 0x6c, 0x2c, 0x09, 0x32, 0x45, 0x89, 0xb5, 0x13, 0x62, 0xb5, 0x38, 0xa0, + 0xfe, 0x2d, 0xa3, 0x7c, 0xc8, 0xe2, 0x58, 0x68, 0x1f, 0x5b, 0x6e, 0xda, + 0xd3, 0x9a, 0x39, 0x2b, 0x09, 0xb6, 0xa4, 0xc5, 0x4a, 0xf8, 0x33, 0x44, + 0x62, 0x80, 0x99, 0x44, 0xf1, 0xfe, 0xca, 0xdc, 0xbb, 0x42, 0x6e, 0x10, + 0xf8, 0x77, 0x60, 0x97, 0x7e, 0x83, 0xef, 0x2d, 0xb1, 0x5c, 0x14, 0xcd, + 0xae, 0x63, 0x94, 0x25, 0xe6, 0x47, 0xe1, 0x1a, 0x35, 0x64, 0x85, 0xe4, + 0x18, 0x9b, 0x99, 0x10, 0x95, 0xad, 0x59, 0xdc, 0x61, 0x47, 0xc7, 0xbf, + 0x2b, 0x9b, 0x45, 0x7c, 0xef, 0x6f, 0x43, 0xfd, 0xe9, 0xec, 0xb1, 0x2e, + 0xb8, 0xe7, 0x0f, 0x81, 0xc6, 0x9d, 0x72, 0xda, 0x22, 0x35, 0xd7, 0xba, + 0xde, 0xb6, 0xfb, 0xce, 0xf1, 0x7d, 0x45, 0xdd, 0xe4, 0xd3, 0x6f, 0x13, + 0xb9, 0xe2, 0x81, 0x7e, 0x00, 0xf8, 0x21, 0xe0, 0x5d, 0x60, 0x1f, 0x48, + 0x5f, 0x10, 0x33, 0xec, 0x6e, 0xaf, 0xa4, 0x6c, 0xff, 0xfa, 0x84, 0xbf, + 0x1a, 0x13, 0x87, 0xef, 0xbe, 0x4a, 0x35, 0xb6, 0xe3, 0xb9, 0xf5, 0x5b, + 0xc5, 0x6e, 0xfd, 0xde, 0x64, 0xbf, 0xa4, 0x1f, 0x40, 0xae, 0x44, 0x0a, + 0xad, 0x73, 0xcf, 0x19, 0xa5, 0x0b, 0xf8, 0xa5, 0xbb, 0x27, 0xc4, 0x41, + 0x65, 0xa2, 0xee, 0x5e, 0x99, 0x66, 0x54, 0x0c, 0x55, 0x27, 0x83, 0x3f, + 0x47, 0xb3, 0x84, 0x4a, 0x70, 0xaf, 0x9d, 0x92, 0x77, 0x79, 0x6e, 0x21, + 0xc7, 0x87, 0x4b, 0x8d, 0xaf, 0x2c, 0x0d, 0xc9, 0xf3, 0xe7, 0x1d, 0x89, + 0xdc, 0xeb, 0xb1, 0xd6, 0x62, 0xd9, 0x7c, 0x2a, 0x0c, 0x48, 0x14, 0x3f, + 0xb4, 0x49, 0x41, 0x4f, 0x2f, 0xff, 0xaa, 0x46, 0x20, 0x7b, 0x52, 0x19, + 0xd1, 0x8f, 0x95, 0xbe, 0x33, 0x79, 0xa2, 0x15, 0x35, 0x2f, 0xac, 0x49, + 0xf5, 0x72, 0x27, 0x92, 0xcb, 0x4d, 0x0f, 0x0b, 0x6f, 0x2c, 0xd6, 0xc8, + 0xff, 0x4d, 0xf9, 0xef, 0xde, 0x73, 0x17, 0x5d, 0x99, 0x30, 0x81, 0xaf, + 0xe6, 0xc4, 0xf1, 0x8c, 0x78, 0x5e, 0x9e, 0xb2, 0xcb, 0xaf, 0x9e, 0x64, + 0xaa, 0x92, 0x16, 0xc0, 0x80, 0xf9, 0xbe, 0xa4, 0x43, 0x1e, 0xf5, 0xed, + 0xaf, 0xac, 0xba, 0x8e, 0x6c, 0x1c, 0x57, 0xcb, 0x12, 0x28, 0x9f, 0xe5, + 0x9f, 0xc1, 0x4a, 0xed, 0xa0, 0xfa, 0xe1, 0x29, 0x46, 0x4a, 0xc9, 0xab, + 0xf5, 0xf7, 0x99, 0xdc, 0xa6, 0xcf, 0x52, 0xf3, 0x0f, 0x83, 0xdf, 0xe3, + 0xab, 0x24, 0x40, 0xd1, 0x9c, 0x4b, 0xea, 0x5b, 0x4f, 0x1e, 0xeb, 0x98, + 0x91, 0xd8, 0x8b, 0x38, 0x32, 0xdf, 0x0b, 0x73, 0xdf, 0x3d, 0x4b, 0xea, + 0x0b, 0xad, 0xd4, 0x75, 0x88, 0xe0, 0xd0, 0x95, 0xf8, 0x0f, 0xb9, 0xe8, + 0x20, 0x77, 0x31, 0x1c, 0x20, 0xe2, 0xc9, 0x64, 0xad, 0xfd, 0x0d, 0xea, + 0x1b, 0xbf, 0x8f, 0xab, 0xc6, 0x0e, 0xcd, 0x6f, 0x7a, 0x79, 0xd4, 0xb6, + 0x13, 0xdc, 0x94, 0x59, 0xd6, 0xfd, 0x06, 0x07, 0xf8, 0xda, 0x96, 0x4f, + 0x42, 0x74, 0x7c, 0x7d, 0x0c, 0xf9, 0x07, 0xc6, 0x31, 0x3f, 0x7d, 0x7d, + 0x82, 0x8a, 0x23, 0x17, 0x29, 0x6a, 0xe1, 0xd7, 0xc3, 0x50, 0x34, 0xf1, + 0x95, 0x2c, 0x77, 0xdf, 0xd3, 0x01, 0xf8, 0x34, 0x15, 0xb4, 0x65, 0x54, + 0xb0, 0x8f, 0x1f, 0xc6, 0xbd, 0x0c, 0x11, 0x5a, 0xf4, 0xa4, 0x03, 0xcf, + 0xbc, 0xf5, 0x9e, 0xde, 0xe0, 0x4c, 0xd7, 0xf7, 0xd8, 0x28, 0x8f, 0xb9, + 0xc8, 0xbf, 0x77, 0xbb, 0x8d, 0xdf, 0x84, 0xaf, 0x2f, 0x76, 0xe1, 0x37, + 0xd6, 0x88, 0x63, 0x27, 0x42, 0x69, 0x5c, 0x41, 0x0e, 0x08, 0x60, 0x79, + 0x3c, 0x12, 0x42, 0x14, 0xee, 0x8c, 0x10, 0x1f, 0x57, 0x7d, 0xd4, 0x1d, + 0xc7, 0x96, 0x47, 0x87, 0x1b, 0xa4, 0x71, 0x24, 0x68, 0xc6, 0xac, 0x33, + 0x87, 0xb1, 0x74, 0x01, 0xfa, 0xe5, 0xf4, 0xe8, 0x48, 0xfe, 0x70, 0x97, + 0x7b, 0x10, 0xae, 0x3a, 0x7f, 0xfc, 0x37, 0x63, 0xca, 0xcf, 0xeb, 0x24, + 0x5c, 0xb5, 0xd8, 0x43, 0xfc, 0xb6, 0x99, 0x78, 0x1a, 0x7a, 0x44, 0x99, + 0x3b, 0x83, 0xcd, 0x47, 0x1e, 0x49, 0xc8, 0x6d, 0xa1, 0x13, 0xd4, 0x94, + 0x24, 0xd3, 0xb3, 0x7b, 0x07, 0x8b, 0x2c, 0x53, 0xdf, 0x7c, 0x00, 0xcf, + 0x0f, 0x1c, 0x66, 0x76, 0x78, 0x8e, 0x53, 0x41, 0x14, 0xfd, 0xf5, 0x76, + 0x05, 0xdd, 0x7f, 0x8d, 0x75, 0x32, 0xa8, 0x35, 0xcf, 0x7f, 0xb3, 0xfd, + 0xb8, 0x16, 0x9d, 0xc8, 0x72, 0x5d, 0x6f, 0xd0, 0x97, 0x13, 0x27, 0x62, + 0xa3, 0x14, 0xb5, 0x7e, 0x4d, 0xe7, 0x13, 0x8d, 0x42, 0x52, 0x4f, 0x72, + 0x26, 0x4d, 0x7a, 0x25, 0x46, 0xeb, 0x0b, 0x2d, 0x09, 0xd8, 0xfd, 0x20, + 0xcc, 0x91, 0x70, 0xad, 0x9e, 0xd9, 0x70, 0x01, 0xec, 0x27, 0x95, 0x13, + 0xe0, 0x1e, 0x62, 0xe8, 0xd2, 0xe8, 0xdb, 0xfe, 0x0d, 0x79, 0x1e, 0xe8, + 0x56, 0x8c, 0x83, 0x5f, 0xf5, 0x4a, 0x4a, 0x0b, 0x92, 0xf5, 0x99, 0x5c, + 0x58, 0xb1, 0xac, 0x7d, 0x03, 0x86, 0xdd, 0x7a, 0xa6, 0xb8, 0x95, 0x53, + 0xe1, 0x63, 0x39, 0x82, 0x67, 0xbb, 0x68, 0xf4, 0xfb, 0x9d, 0xd0, 0x2d, + 0x1d, 0xed, 0x03, 0x2b, 0x80, 0xad, 0xb2, 0xd4, 0x99, 0xf5, 0xa0, 0xac, + 0x12, 0x52, 0x59, 0x49, 0x7f, 0xb1, 0xaa, 0x53, 0x1a, 0xcf, 0x63, 0x86, + 0xee, 0xf8, 0x5e, 0x79, 0xa8, 0x48, 0x0b, 0xb0, 0x63, 0xaa, 0xe7, 0x5f, + 0x31, 0x3d, 0xac, 0x75, 0xdc, 0xf0, 0xd5, 0xa5, 0xd9, 0xe3, 0x8b, 0xea, + 0xf1, 0xfa, 0x0a, 0xd6, 0x3a, 0x55, 0xf9, 0x66, 0xb3, 0x90, 0xdd, 0x7e, + 0x1e, 0x63, 0x26, 0x1a, 0xd1, 0xe8, 0x98, 0x20, 0xe1, 0x94, 0xb5, 0x61, + 0xa0, 0x21, 0x33, 0xeb, 0xec, 0x1d, 0xdd, 0x8b, 0x01, 0xb3, 0x8d, 0x5b, + 0x34, 0x6c, 0xc9, 0x11, 0x39, 0x0e, 0x16, 0x72, 0x48, 0x16, 0x7c, 0x4d, + 0x80, 0xb8, 0x9d, 0xf7, 0x48, 0xb1, 0xab, 0xcf, 0xab, 0x13, 0x5c, 0x9f, + 0x32, 0x03, 0x23, 0xd8, 0x26, 0xbc, 0x46, 0x00, 0xb2, 0x78, 0x44, 0xaf, + 0x66, 0x7f, 0x2f, 0xad, 0x5f, 0x17, 0x61, 0x5d, 0x20, 0x94, 0x98, 0xd7, + 0x13, 0xfb, 0xd8, 0x07, 0xb0, 0x9f, 0xf9, 0x71, 0x3c, 0x6f, 0x55, 0x82, + 0x37, 0x14, 0xed, 0x93, 0xf4, 0x75, 0x00, 0x9d, 0xcb, 0xed, 0xd5, 0x17, + 0xd9, 0x51, 0x2f, 0x05, 0x23, 0x28, 0x9b, 0xc8, 0xf9, 0xd4, 0x56, 0xf2, + 0x46, 0xbd, 0x35, 0x07, 0xdf, 0xdf, 0xb7, 0x8f, 0x26, 0x64, 0x9b, 0x32, + 0x0d, 0xc0, 0xa8, 0x79, 0xe8, 0xa6, 0x85, 0x2b, 0x5e, 0xa9, 0xe5, 0xc9, + 0x0f, 0xba, 0x26, 0xe5, 0x14, 0x67, 0xe4, 0x8e, 0xd3, 0x93, 0x9f, 0x80, + 0xbd, 0x7a, 0x89, 0x9a, 0x18, 0x67, 0xf1, 0xd5, 0x09, 0xaf, 0x27, 0x6f, + 0x3a, 0x7c, 0x9f, 0xdb, 0x49, 0xdc, 0x37, 0xfb, 0xb6, 0xcc, 0x38, 0x09, + 0xc8, 0x10, 0x61, 0xe6, 0x94, 0xa0, 0x46, 0x6e, 0xca, 0x3c, 0x17, 0x7e, + 0x7f, 0xfa, 0x76, 0x08, 0xb3, 0xfe, 0x66, 0xb3, 0x9c, 0xb0, 0xf9, 0x2b, + 0x38, 0x5b, 0x44, 0x97, 0xb1, 0x8b, 0x67, 0x75, 0x18, 0x60, 0x72, 0x8e, + 0xf4, 0x5e, 0x00, 0x65, 0x2e, 0x98, 0xbe, 0xe4, 0x0b, 0x4e, 0x99, 0x3d, + 0xd6, 0xf3, 0x3a, 0xf9, 0x28, 0x42, 0xe2, 0xa9, 0x61, 0xf6, 0x40, 0xe9, + 0xad, 0xa5, 0xe3, 0x5f, 0x40, 0xfe, 0x11, 0xc8, 0xd9, 0xc3, 0xdd, 0x75, + 0xa9, 0x75, 0x29, 0x72, 0xf6, 0x5c, 0xdc, 0x38, 0x31, 0x97, 0xfc, 0xfa, + 0x17, 0x1c, 0x9e, 0x12, 0x19, 0x33, 0xa9, 0x10, 0xec, 0xab, 0x42, 0xab, + 0x84, 0x38, 0x02, 0x4e, 0x55, 0x98, 0x2c, 0xa5, 0x0f, 0x3f, 0x66, 0x77, + 0x5d, 0x51, 0x58, 0xad, 0x9d, 0xad, 0xd5, 0x1c, 0x9f, 0x4f, 0xfc, 0x62, + 0x68, 0x7f, 0xe0, 0x50, 0x55, 0x92, 0x36, 0x26, 0x15, 0x9f, 0xb0, 0x9a, + 0x7a, 0xf8, 0x18, 0xc9, 0x38, 0x0d, 0xbe, 0x8a, 0x0e, 0xf0, 0x1e, 0x9e, + 0x1b, 0xa8, 0xfb, 0xa4, 0x0b, 0xce, 0xb0, 0xd1, 0x73, 0x04, 0xbf, 0x78, + 0xe6, 0xd9, 0xce, 0x39, 0x54, 0x1c, 0xff, 0x7d, 0xf6, 0x74, 0xcc, 0x1a, + 0x71, 0x83, 0x86, 0x33, 0xf4, 0x9d, 0x82, 0x7d, 0x67, 0xc9, 0xd6, 0x0d, + 0xcc, 0x6b, 0x80, 0xcc, 0xfd, 0xc9, 0x3b, 0xb3, 0x1d, 0xbe, 0xa7, 0xce, + 0x37, 0x0f, 0x61, 0x9d, 0xca, 0xf2, 0xd4, 0x1f, 0xcd, 0x1e, 0x53, 0x86, + 0x8a, 0x41, 0xc6, 0xb0, 0xd4, 0x8d, 0x3b, 0x09, 0x24, 0x91, 0x53, 0xed, + 0x22, 0xbd, 0x72, 0x2c, 0x3c, 0xa4, 0x32, 0x65, 0x0c, 0xa0, 0xdd, 0x57, + 0x06, 0xb9, 0xe3, 0xf8, 0x6a, 0xcc, 0xe1, 0xa7, 0x6a, 0xd5, 0xbd, 0x9e, + 0x72, 0xef, 0x86, 0x3f, 0xbd, 0x50, 0xe6, 0x69, 0xd9, 0xf9, 0xab, 0xfb, + 0x79, 0x61, 0x81, 0x8d, 0xa7, 0x67, 0x54, 0x14, 0xe1, 0x3d, 0x2e, 0xfd, + 0x2f, 0xa8, 0x89, 0x6a, 0xe8, 0x36, 0xcd, 0x69, 0xbc, 0x30, 0x44, 0x5b, + 0x96, 0x7f, 0xb8, 0x09, 0x37, 0x49, 0xad, 0x5f, 0xdd, 0x17, 0xe8, 0xdb, + 0xbc, 0xf0, 0x70, 0x15, 0xfa, 0xeb, 0xcc, 0x2b, 0x3f, 0x1c, 0x0d, 0x38, + 0x31, 0xa6, 0x3e, 0x0a, 0x5e, 0x92, 0xa3, 0x56, 0xfd, 0xc4, 0x73, 0xc8, + 0xda, 0xe6, 0x06, 0x55, 0xd1, 0xcb, 0x6f, 0x1f, 0x9d, 0x2d, 0x48, 0xe9, + 0x65, 0xcf, 0x21, 0x4c, 0xc7, 0xd1, 0xff, 0x54, 0xed, 0x67, 0x53, 0x7e, + 0xa4, 0xd3, 0x77, 0x08, 0x9a, 0xc1, 0x2e, 0x91, 0xbf, 0xd0, 0x84, 0x42, + 0x20, 0x5f, 0x00, 0xcb, 0xa4, 0xec, 0x6d, 0x01, 0x5b, 0xe2, 0xe7, 0x46, + 0xbb, 0xe3, 0xec, 0xd0, 0xa6, 0x65, 0x3a, 0xf0, 0x9d, 0x7e, 0xde, 0xab, + 0x4a, 0x41, 0x06, 0x2d, 0xf3, 0xe8, 0xf2, 0xc8, 0x5e, 0x3a, 0x03, 0xc7, + 0x75, 0xd9, 0x42, 0xa6, 0xa7, 0x54, 0xba, 0x5f, 0xc4, 0x61, 0x75, 0x0c, + 0x96, 0x58, 0xd1, 0xdf, 0xe5, 0xea, 0xa7, 0xdb, 0x41, 0xc3, 0x2f, 0xbf, + 0x8a, 0xa2, 0x45, 0x86, 0x7a, 0x77, 0x7e, 0xd6, 0x4d, 0x77, 0x2e, 0xcd, + 0x53, 0x80, 0xd7, 0x0c, 0x6c, 0x6b, 0x2f, 0x39, 0xe1, 0x8d, 0xf5, 0xef, + 0x59, 0x54, 0x92, 0xd4, 0x68, 0x78, 0xec, 0x84, 0x40, 0xe9, 0x17, 0x95, + 0xe1, 0x97, 0xb6, 0x09, 0xa2, 0x18, 0xf0, 0x88, 0x80, 0x0a, 0x0f, 0x68, + 0xb5, 0x70, 0x84, 0xa5, 0x65, 0x01, 0x45, 0xbe, 0xc2, 0x09, 0xe7, 0x51, + 0x09, 0xff, 0x82, 0x9f, 0x0e, 0xad, 0x60, 0xbd, 0x85, 0x76, 0x45, 0xb1, + 0x14, 0x6c, 0x08, 0xa9, 0x6c, 0xc6, 0x5f, 0xd9, 0xcc, 0xb2, 0x9a, 0x77, + 0x0a, 0xd0, 0xc5, 0x09, 0x1b, 0xb3, 0xb9, 0xd1, 0xa4, 0xd2, 0x12, 0x7e, + 0x24, 0xa6, 0x68, 0xb8, 0xd3, 0xc8, 0xeb, 0x12, 0x6d, 0x77, 0xa6, 0xa8, + 0x06, 0xdc, 0x38, 0x9a, 0x10, 0x66, 0x51, 0x4d, 0xe5, 0x1c, 0xb4, 0xa5, + 0x33, 0xae, 0x0c, 0x81, 0xbc, 0x4e, 0xed, 0x9f, 0xfd, 0x84, 0xf5, 0xdc, + 0x17, 0x95, 0xe3, 0x49, 0xef, 0x99, 0x44, 0x3d, 0x06, 0x94, 0x3a, 0x84, + 0x51, 0xaa, 0x10, 0xbd, 0xc9, 0x9f, 0xd0, 0x8f, 0x88, 0xfd, 0x24, 0x14, + 0xb0, 0x99, 0xf9, 0x35, 0x5d, 0x75, 0x2d, 0xf7, 0x4f, 0xd8, 0xc6, 0x32, + 0xaf, 0xb0, 0x22, 0x58, 0x94, 0x10, 0xb2, 0xf7, 0x33, 0x37, 0x9b, 0x07, + 0xa9, 0xe6, 0x5a, 0x6a, 0x4d, 0xa7, 0x55, 0x25, 0x09, 0x40, 0xef, 0x09, + 0x7f, 0xd3, 0xcd, 0x32, 0xb0, 0x97, 0xb7, 0x2f, 0x64, 0xff, 0x74, 0x8a, + 0xe1, 0xbf, 0x8e, 0xe7, 0x08, 0x30, 0x99, 0x5a, 0x9b, 0xa9, 0x0b, 0xaa, + 0x19, 0x26, 0xe1, 0xef, 0xfc, 0xd8, 0x84, 0x73, 0x27, 0x46, 0xcd, 0xb6, + 0xdd, 0xf2, 0xcd, 0x41, 0x8f, 0xab, 0x73, 0x9e, 0x0a, 0x1d, 0x19, 0x9b, + 0xf6, 0xaf, 0xb4, 0x34, 0x8b, 0x2c, 0xaa, 0x76, 0xae, 0x28, 0x0a, 0x9e, + 0x48, 0xbb, 0x6e, 0x62, 0x64, 0xe5, 0xba, 0x3c, 0x7d, 0x15, 0xf0, 0x39, + 0x74, 0xc8, 0xaa, 0x91, 0x48, 0x95, 0x4d, 0x78, 0x54, 0xee, 0x3f, 0xa1, + 0x4a, 0xa9, 0x1f, 0xf2, 0xc0, 0x0f, 0x93, 0x35, 0x98, 0xd8, 0x6c, 0xe1, + 0xee, 0x1b, 0x9f, 0x14, 0xb9, 0xbb, 0x0d, 0xa7, 0x01, 0x95, 0xd1, 0xa2, + 0x6b, 0xf7, 0x6e, 0x22, 0xdf, 0x52, 0xe5, 0x1e, 0x45, 0x8d, 0xb8, 0x77, + 0x1f, 0x8f, 0x28, 0x9e, 0xa8, 0x1c, 0xb9, 0x98, 0xd2, 0x93, 0x71, 0x2f, + 0x41, 0xa5, 0x57, 0x11, 0xce, 0x4c, 0xc7, 0xa0, 0x9a, 0x5e, 0xdf, 0x44, + 0x62, 0x7d, 0x51, 0x49, 0x71, 0x95, 0x7a, 0xff, 0xda, 0x6b, 0xec, 0xb3, + 0xcc, 0xde, 0x76, 0x21, 0x38, 0x1b, 0xc8, 0x8e, 0xa2, 0x01, 0xe0, 0x04, + 0x69, 0xfb, 0x19, 0xc8, 0x26, 0x78, 0xe3, 0xe7, 0x7b, 0xa9, 0xe7, 0x7c, + 0x19, 0xfa, 0xd0, 0x1d, 0xdf, 0x79, 0xc2, 0x99, 0x9e, 0x97, 0x99, 0x08, + 0xd5, 0x19, 0x88, 0x3e, 0x4d, 0xb9, 0xfa, 0x0c, 0xa2, 0x1e, 0x63, 0x9e, + 0x63, 0x6d, 0x93, 0x99, 0x96, 0x82, 0x9e, 0x19, 0x08, 0xde, 0xea, 0xbc, + 0xc5, 0xa8, 0xc9, 0xcb, 0xb0, 0x7e, 0xa0, 0x3d, 0xc3, 0x99, 0x2a, 0xd6, + 0xee, 0x0f, 0x67, 0x2c, 0x03, 0xac, 0xf7, 0x43, 0xe7, 0xcc, 0x87, 0x18, + 0xbf, 0x37, 0x97, 0x96, 0x6a, 0x82, 0x99, 0x85, 0x9a, 0x39, 0x15, 0x75, + 0x0d, 0x96, 0xde, 0x8d, 0x1f, 0xee, 0x07, 0xc0, 0x84, 0xcf, 0x16, 0x08, + 0xcf, 0x93, 0xae, 0x23, 0xea, 0x75, 0xcc, 0x50, 0x6a, 0x8b, 0x83, 0xae, + 0x75, 0x17, 0x2e, 0xa5, 0x87, 0x98, 0x92, 0x30, 0x21, 0x82, 0x1e, 0xd1, + 0x5f, 0x1d, 0xa3, 0x2b, 0xa7, 0x5b, 0xb5, 0xac, 0xdc, 0x4f, 0x33, 0xc0, + 0xd3, 0x3e, 0x9c, 0x18, 0x6a, 0xc7, 0xd1, 0xf5, 0xda, 0xc3, 0xd4, 0x6b, + 0xbf, 0x82, 0x0d, 0xe7, 0x6a, 0x7f, 0x52, 0x1d, 0x63, 0x29, 0xc4, 0x78, + 0xa9, 0x7c, 0x58, 0x28, 0x86, 0x07, 0x88, 0xbe, 0x61, 0xe8, 0x8a, 0xd1, + 0xee, 0xaa, 0x0a, 0x17, 0xc7, 0xac, 0x06, 0xdc, 0x65, 0x69, 0x0d, 0xa6, + 0xc0, 0xd2, 0x6e, 0x89, 0x55, 0xce, 0x3e, 0x51, 0x94, 0x04, 0xb7, 0x87, + 0x2e, 0x48, 0x77, 0x56, 0xd3, 0x07, 0x2c, 0x00, 0x6a, 0x64, 0x3b, 0x3c, + 0x19, 0x48, 0x81, 0xe3, 0x16, 0x63, 0x7d, 0x19, 0x77, 0xfa, 0xa0, 0xc7, + 0x0f, 0x92, 0x07, 0x69, 0x6a, 0xa7, 0xd0, 0xe4, 0x7c, 0x29, 0x64, 0xcd, + 0xe3, 0xfa, 0xea, 0xe9, 0xe1, 0xa3, 0x71, 0xda, 0x2a, 0xce, 0x6f, 0xdd, + 0xcd, 0xa5, 0x20, 0x56, 0xa6, 0x4a, 0xbb, 0x29, 0x4b, 0xae, 0x36, 0xfc, + 0xc4, 0x43, 0xca, 0xee, 0x5a, 0x4c, 0x5b, 0x4d, 0x24, 0x0a, 0xf1, 0x61, + 0x2d, 0x5f, 0x90, 0x71, 0xe8, 0x29, 0x0a, 0x1d, 0x6b, 0xc6, 0x9e, 0xd6, + 0xf0, 0xd6, 0x9c, 0x52, 0x3f, 0x28, 0x8e, 0xce, 0xf2, 0x1a, 0x00, 0x5d, + 0x31, 0x2d, 0x91, 0x6c, 0x5d, 0xd7, 0x8d, 0xa1, 0x83, 0x7b, 0x2b, 0x09, + 0x37, 0xd2, 0x35, 0xff, 0x11, 0x2e, 0x87, 0xc1, 0x91, 0x65, 0x53, 0x48, + 0x38, 0xdf, 0x96, 0x30, 0xda, 0x03, 0x54, 0xd4, 0x1b, 0x30, 0x7d, 0x6d, + 0xb1, 0x48, 0x96, 0xf0, 0x04, 0x5e, 0x7c, 0x00, 0x40, 0xaa, 0xec, 0x78, + 0x4f, 0xb9, 0xd4, 0x16, 0xfd, 0x30, 0xcf, 0x5b, 0x75, 0x34, 0x44, 0xf6, + 0xea, 0x12, 0xc5, 0xad, 0xb3, 0x87, 0xf8, 0x4b, 0x27, 0x6d, 0x74, 0xbe, + 0xf3, 0x31, 0xff, 0x85, 0x08, 0x06, 0x94, 0xe5, 0x0f, 0xc0, 0x77, 0x29, + 0xc0, 0xbe, 0x0e, 0x44, 0x5d, 0x4d, 0x2e, 0xab, 0x69, 0x5f, 0xc9, 0xfd, + 0xd1, 0xdc, 0x7a, 0xdd, 0xf0, 0x52, 0xa4, 0xa7, 0xd7, 0x02, 0xb1, 0xa9, + 0xb4, 0x93, 0x08, 0xd4, 0xca, 0xd5, 0xf8, 0x02, 0xdc, 0x11, 0x2f, 0xe6, + 0xe7, 0x3d, 0xaa, 0x62, 0x11, 0x8d, 0x7a, 0xff, 0x3b, 0xa1, 0xdf, 0x38, + 0xd5, 0xa0, 0x35, 0xb3, 0xf6, 0x61, 0x06, 0x99, 0x29, 0xa7, 0x67, 0x47, + 0xe0, 0xb8, 0xc4, 0x7c, 0x18, 0x18, 0x19, 0x21, 0x74, 0xc7, 0x59, 0x93, + 0x40, 0x24, 0x19, 0xce, 0xb5, 0x8f, 0xfe, 0xc2, 0x2a, 0x65, 0x77, 0xc5, + 0xc3, 0xf5, 0x5d, 0x69, 0xfb, 0xdc, 0xb7, 0x20, 0x75, 0xa9, 0x02, 0x67, + 0x5f, 0x6f, 0xd2, 0x40, 0x74, 0xa6, 0x8a, 0x93, 0xc8, 0x32, 0x65, 0xb8, + 0xcf, 0xe4, 0x35, 0x34, 0xba, 0x2b, 0x4b, 0x66, 0x3f, 0x16, 0x57, 0xd9, + 0xb4, 0x73, 0x94, 0xc9, 0x8f, 0x4b, 0x99, 0xed, 0x47, 0x68, 0x96, 0x2f, + 0xc6, 0xbf, 0xbe, 0xd7, 0x13, 0x5d, 0x64, 0xae, 0xf2, 0x27, 0xd3, 0x5d, + 0x23, 0x66, 0x35, 0x41, 0x7c, 0x8d, 0xc6, 0x50, 0x9d, 0x92, 0x91, 0xbc, + 0x96, 0xcf, 0xda, 0xf4, 0x16, 0xa5, 0xde, 0xd8, 0xaa, 0x0a, 0x6b, 0xf5, + 0x25, 0x96, 0x89, 0x2c, 0x50, 0xa6, 0xdf, 0x27, 0x00, 0x6b, 0xb7, 0x4f, + 0xea, 0x38, 0x67, 0x8b, 0x0e, 0x09, 0x34, 0x26, 0xed, 0x9d, 0x6d, 0x91, + 0xfd, 0x3b, 0xb8, 0x6e, 0x66, 0x4e, 0x78, 0x07, 0x67, 0x0d, 0xce, 0xc0, + 0xcb, 0x7d, 0x6d, 0x00, 0xaf, 0x0e, 0x90, 0x9b, 0x18, 0xda, 0xbf, 0x95, + 0x34, 0xab, 0x0d, 0x3e, 0xab, 0x2a, 0xe1, 0xe1, 0x82, 0x1b, 0xa9, 0x26, + 0xab, 0xb5, 0x80, 0x20, 0x3f, 0xa1, 0x63, 0x26, 0x33, 0x8b, 0x00, 0x77, + 0x82, 0xf9, 0x85, 0x8a, 0xc1, 0x53, 0xbd, 0x03, 0xae, 0x16, 0x75, 0xeb, + 0x4e, 0x38, 0x65, 0xf5, 0xeb, 0xe2, 0xdd, 0x8f, 0x68, 0x4b, 0xb4, 0x57, + 0x16, 0x7b, 0x1d, 0xb1, 0xb8, 0x01, 0xa9, 0xf1, 0xb3, 0xcc, 0x4f, 0x9e, + 0xc0, 0x12, 0xa1, 0x00, 0x6f, 0x56, 0xd4, 0x35, 0x11, 0x23, 0x82, 0xac, + 0x87, 0x9f, 0xba, 0xe4, 0x3c, 0x92, 0x8a, 0x6d, 0x75, 0x28, 0xaa, 0x62, + 0x98, 0x08, 0xe4, 0xe2, 0x8b, 0x68, 0xfb, 0x56, 0x9c, 0x33, 0xe6, 0xed, + 0x51, 0x65, 0x3c, 0xa2, 0x4d, 0xe1, 0x2c, 0x11, 0x77, 0xc4, 0xb7, 0x31, + 0xa1, 0x0a, 0xac, 0x7c, 0x74, 0x0a, 0x81, 0x15, 0x8f, 0x7f, 0xac, 0xc3, + 0xa1, 0x6d, 0xc1, 0x0b, 0xaf, 0xac, 0x1a, 0x14, 0xe9, 0xe4, 0x64, 0x22, + 0xf7, 0xcc, 0x37, 0xcc, 0xd4, 0xb0, 0x23, 0x79, 0x3e, 0xda, 0xca, 0xd9, + 0x75, 0x64, 0x87, 0x2e, 0x7a, 0x10, 0x51, 0x41, 0xd7, 0xf2, 0x39, 0xd7, + 0x56, 0xcb, 0x86, 0x1a, 0x27, 0x1f, 0x0e, 0xc5, 0xd4, 0x6f, 0x7f, 0x33, + 0x0c, 0x7f, 0xad, 0xfb, 0xb7, 0x89, 0xca, 0x8f, 0xe0, 0x66, 0x94, 0x90, + 0xf2, 0x5a, 0x83, 0x12, 0x89, 0xad, 0x8b, 0x73, 0xaf, 0x32, 0xfa, 0x17, + 0x6a, 0x21, 0x61, 0x1d, 0x1a, 0x8b, 0x88, 0x8e, 0x38, 0x7d, 0xec, 0x9f, + 0xa0, 0xcf, 0x07, 0x33, 0x09, 0xe4, 0x40, 0x7d, 0x8a, 0x62, 0x81, 0xfa, + 0x5c, 0xf5, 0x2e, 0x67, 0xf3, 0xd3, 0x34, 0xfa, 0x5e, 0x81, 0x6f, 0x11, + 0x2b, 0xf5, 0x6c, 0x38, 0xe2, 0xd2, 0x39, 0xce, 0x0b, 0x00, 0x98, 0xf4, + 0x3f, 0xc4, 0x35, 0xe4, 0xdd, 0x05, 0xd6, 0x26, 0x32, 0x27, 0x89, 0x7c, + 0x58, 0x0b, 0x56, 0x7d, 0x87, 0xb8, 0x83, 0x4f, 0xda, 0xe1, 0x66, 0x13, + 0xe7, 0x62, 0x13, 0x9d, 0x1c, 0x05, 0xd5, 0x9c, 0x50, 0x2f, 0xfc, 0x3b, + 0x23, 0x52, 0x43, 0xb5, 0xb4, 0x2f, 0x52, 0xab, 0x8f, 0x06, 0xf5, 0x02, + 0x41, 0x6b, 0xc4, 0xd4, 0x4c, 0x5c, 0x83, 0xb8, 0x52, 0x87, 0xb7, 0x43, + 0x68, 0xa0, 0x02, 0xe9, 0x89, 0xd0, 0xe8, 0x06, 0xcd, 0x5d, 0xe0, 0x7d, + 0xd7, 0x64, 0xe1, 0x2c, 0xf5, 0xac, 0x01, 0x0a, 0x1e, 0x6a, 0x85, 0xa7, + 0x9c, 0x61, 0x57, 0x9f, 0x29, 0xcf, 0x06, 0xc8, 0x9a, 0x64, 0xc3, 0xdf, + 0x5d, 0xac, 0x66, 0x4b, 0xf4, 0xe1, 0xfb, 0x4a, 0xd4, 0x66, 0x04, 0x38, + 0xa8, 0x30, 0x15, 0x33, 0x91, 0x4c, 0x99, 0xd8, 0xc8, 0x9f, 0x7e, 0x11, + 0xad, 0xb8, 0x67, 0x78, 0x4c, 0x8c, 0xfd, 0x9e, 0x9d, 0xdd, 0x64, 0x09, + 0x6f, 0x90, 0x92, 0xe1, 0x24, 0xb3, 0xa6, 0x2d, 0xe2, 0x78, 0x70, 0x38, + 0x73, 0x8a, 0x6d, 0x68, 0xe0, 0xf9, 0x55, 0x48, 0x08, 0x75, 0x68, 0x4d, + 0x1f, 0x59, 0xf5, 0x9c, 0xe5, 0xa7, 0x3a, 0x9f, 0x93, 0xcd, 0x9b, 0xc6, + 0x50, 0x74, 0x17, 0xd2, 0x9b, 0xd0, 0xa5, 0x3f, 0x06, 0x91, 0x4f, 0x89, + 0xb7, 0xda, 0xd7, 0x4d, 0xde, 0x32, 0xf4, 0x8d, 0x3a, 0x8f, 0x43, 0x00, + 0xdc, 0x27, 0xb4, 0xed, 0xb1, 0x14, 0xbb, 0x81, 0xfb, 0x1e, 0x6a, 0x71, + 0xff, 0x5a, 0xc6, 0x4d, 0xb7, 0x31, 0x24, 0x42, 0x1b, 0xd3, 0x94, 0x3a, + 0x2d, 0x80, 0xfa, 0x72, 0x54, 0x89, 0x37, 0x82, 0x7a, 0xdc, 0x52, 0xe2, + 0x0a, 0xa5, 0x03, 0x43, 0x0b, 0xde, 0xde, 0x3d, 0x9b, 0xd9, 0xb8, 0x4c, + 0x44, 0x13, 0xbb, 0xe8, 0x2b, 0xb7, 0xe8, 0x37, 0x6f, 0x58, 0x07, 0xee, + 0x0f, 0xef, 0xf3, 0x30, 0x52, 0x35, 0x70, 0x02, 0x70, 0x5a, 0x16, 0x2d, + 0x8c, 0x1f, 0x06, 0xd4, 0x04, 0xd6, 0xf9, 0x02, 0x9c, 0x7c, 0x1e, 0x86, + 0xef, 0x6a, 0x8c, 0x78, 0xaf, 0x49, 0xcb, 0x9a, 0x6a, 0xcd, 0xfd, 0x70, + 0x88, 0x64, 0xce, 0x76, 0xaf, 0xb9, 0x2e, 0x90, 0x98, 0x91, 0xca, 0xf2, + 0x4f, 0x14, 0x75, 0xa9, 0x6b, 0x8b, 0x28, 0x1c, 0x9b, 0x3f, 0x8b, 0x1a, + 0xa6, 0x11, 0x43, 0x2c, 0xed, 0x83, 0xda, 0x31, 0x3c, 0x3b, 0xb6, 0x0b, + 0x5f, 0xf3, 0x5d, 0xd0, 0x27, 0x5f, 0xd5, 0xef, 0x68, 0x00, 0x8e, 0xd6, + 0xa1, 0x36, 0x9f, 0x41, 0xc3, 0x96, 0xe1, 0x19, 0x61, 0x67, 0x93, 0x0a, + 0xe6, 0x3a, 0x9e, 0x85, 0x3a, 0x04, 0x81, 0xf7, 0xcf, 0x74, 0x6c, 0x19, + 0x35, 0x49, 0x5a, 0x94, 0xa7, 0xd4, 0xe1, 0x3a, 0x2d, 0xd8, 0x93, 0x17, + 0x0c, 0x7c, 0xc1, 0xb8, 0x8f, 0xe0, 0x02, 0xdd, 0xb0, 0x37, 0x58, 0x1e, + 0x56, 0xbf, 0x71, 0x96, 0xac, 0xbe, 0x31, 0xaa, 0xc3, 0xbc, 0x1f, 0x97, + 0x65, 0x11, 0xa7, 0xc5, 0x6f, 0x51, 0x6d, 0xf8, 0x03, 0xb3, 0xf3, 0xa2, + 0x3b, 0x73, 0xb5, 0x40, 0xe4, 0x64, 0x2e, 0x6c, 0xc1, 0x35, 0x19, 0xfe, + 0x1b, 0x7f, 0xf3, 0x52, 0xf1, 0x52, 0x91, 0xd0, 0x9f, 0xc3, 0x8a, 0xa9, + 0x1a, 0x24, 0x01, 0xe7, 0xc0, 0x55, 0xb8, 0xff, 0xee, 0x68, 0xaf, 0x53, + 0x01, 0x1c, 0xd0, 0x8b, 0x2e, 0x6e, 0x8a, 0xd9, 0xe0, 0x28, 0x8a, 0x07, + 0xc6, 0x99, 0x83, 0x4a, 0x5c, 0x48, 0xaa, 0x64, 0xe4, 0xaf, 0x2b, 0xf6, + 0x8f, 0xb6, 0x29, 0x9d, 0x8e, 0x88, 0x5d, 0xe8, 0x7c, 0x8a, 0xcc, 0x58, + 0xc0, 0x45, 0xe8, 0x95, 0xf8, 0x43, 0x9c, 0x13, 0x53, 0xb8, 0x7c, 0xd0, + 0x39, 0x7d, 0x13, 0x96, 0xda, 0xea, 0xcb, 0x8c, 0x11, 0xe3, 0xee, 0xf7, + 0xf8, 0x7d, 0x64, 0xfd, 0xed, 0x40, 0xaa, 0x2a, 0xd6, 0xb5, 0xfa, 0x40, + 0xcc, 0xc8, 0x89, 0x7f, 0x6f, 0x95, 0x23, 0xd0, 0x8b, 0xeb, 0x67, 0x96, + 0x84, 0x0b, 0x5e, 0x66, 0xde, 0xeb, 0xdb, 0xc4, 0x92, 0x25, 0x8c, 0x00, + 0xdc, 0x8b, 0xde, 0x47, 0xb7, 0xb8, 0x49, 0xbc, 0xc1, 0xd8, 0x4e, 0xa5, + 0x59, 0xfe, 0x48, 0xf4, 0x4a, 0x7d, 0x06, 0x19, 0xe2, 0x72, 0xb1, 0xf8, + 0xe4, 0x72, 0x71, 0x5c, 0x1e, 0x9b, 0x77, 0x57, 0x4b, 0x1c, 0x11, 0xf3, + 0xd4, 0x64, 0x95, 0x00, 0x7d, 0x79, 0x8e, 0x76, 0x92, 0x2f, 0x01, 0xa5, + 0xb3, 0x78, 0xf7, 0x04, 0x01, 0x39, 0xe6, 0x75, 0x54, 0xea, 0xd7, 0x2d, + 0xe5, 0x9e, 0x95, 0x0d, 0x98, 0x02, 0x50, 0xf7, 0x09, 0xc9, 0x13, 0x5a, + 0x5c, 0x52, 0x17, 0x3c, 0x69, 0x34, 0xaf, 0xcd, 0x0c, 0x7f, 0x35, 0xc1, + 0xd9, 0xb6, 0x62, 0x97, 0x76, 0xe0, 0x16, 0x91, 0x29, 0x96, 0x00, 0xfc, + 0xce, 0x12, 0x3a, 0x65, 0x9e, 0x8f, 0x1a, 0x5e, 0x59, 0x5f, 0xa9, 0x32, + 0x0a, 0x6c, 0x12, 0xaf, 0xbd, 0x58, 0xc9, 0x21, 0x70, 0xce, 0xae, 0xfc, + 0x94, 0x6d, 0x84, 0xee, 0xb6, 0x08, 0x63, 0x69, 0xd2, 0xdd, 0xa6, 0x29, + 0xe8, 0x38, 0x08, 0xea, 0x74, 0x44, 0x48, 0x24, 0xef, 0xdc, 0xfe, 0x04, + 0xbf, 0xc5, 0xf8, 0x2d, 0xd6, 0x77, 0x2f, 0x31, 0x61, 0x56, 0x56, 0x53, + 0x89, 0x26, 0x34, 0xf4, 0xbd, 0xbe, 0xa0, 0x8f, 0xb9, 0x4b, 0x38, 0xc2, + 0x5d, 0x3a, 0xf1, 0x2b, 0x3d, 0xdf, 0x02, 0xde, 0xc2, 0xd3, 0x6d, 0x60, + 0xaa, 0x23, 0x5b, 0x6f, 0x33, 0xb4, 0x76, 0xb2, 0x4c, 0x39, 0xea, 0x33, + 0xc7, 0x10, 0x9d, 0xb6, 0xea, 0x91, 0x1c, 0xf7, 0x34, 0xa1, 0xa9, 0x0a, + 0xa1, 0xe2, 0x2b, 0x9a, 0xdb, 0xd2, 0x10, 0xa2, 0x85, 0xa8, 0x8c, 0xd7, + 0x7e, 0x6f, 0x48, 0x82, 0x85, 0x2f, 0x49, 0xbd, 0xc3, 0x6f, 0xc8, 0x3b, + 0x3a, 0xd7, 0xef, 0x0a, 0xd0, 0x80, 0x36, 0xb3, 0xe8, 0x99, 0xf9, 0x03, + 0xf4, 0x5d, 0xb9, 0x87, 0xbd, 0xf1, 0x28, 0x4b, 0x3a, 0xdc, 0x74, 0xff, + 0xcc, 0x7b, 0xfc, 0x89, 0xc0, 0x90, 0x40, 0x64, 0xb8, 0x95, 0xdb, 0x4c, + 0x1b, 0x84, 0xb1, 0x01, 0xc3, 0xcf, 0x1a, 0xdd, 0x5a, 0xef, 0x1d, 0xfc, + 0xb7, 0xf0, 0x53, 0x8f, 0xb7, 0x23, 0xba, 0xcd, 0x5f, 0x56, 0xeb, 0x53, + 0xd7, 0x3b, 0x71, 0x38, 0xc8, 0x5c, 0x9d, 0xdf, 0xda, 0x3c, 0x9d, 0x26, + 0xce, 0x54, 0x2d, 0xb0, 0x1e, 0x3b, 0x2b, 0x7c, 0x15, 0xb2, 0x98, 0xcb, + 0xfa, 0x57, 0xbf, 0x35, 0xe0, 0x8d, 0x53, 0x3e, 0xab, 0x29, 0x22, 0xcf, + 0xca, 0x92, 0x6b, 0xb0, 0x56, 0xa1, 0xdf, 0xe3, 0x13, 0x31, 0xc8, 0xed, + 0x4d, 0x65, 0xa6, 0x7f, 0xfc, 0xe6, 0x29, 0x37, 0x34, 0x45, 0xd2, 0x68, + 0x33, 0x25, 0x9e, 0xd1, 0x51, 0xe0, 0x13, 0x8c, 0x30, 0x42, 0x04, 0x75, + 0xbd, 0x5c, 0x51, 0x76, 0x2e, 0xc7, 0xe1, 0x6c, 0x48, 0x74, 0xc6, 0x11, + 0x7a, 0x90, 0x20, 0x0e, 0x80, 0x3f, 0x5b, 0x3e, 0x5d, 0xbf, 0x13, 0xee, + 0x74, 0x3c, 0xfb, 0xa1, 0xcb, 0x69, 0x3c, 0xe8, 0xd2, 0x80, 0xc0, 0x7f, + 0x1c, 0xa6, 0x09, 0xe6, 0x12, 0xc8, 0x56, 0x94, 0x99, 0x53, 0x8f, 0xa8, + 0xe2, 0xbc, 0xe2, 0x1c, 0x70, 0x81, 0x9b, 0xf5, 0xc3, 0x88, 0x2f, 0x9a, + 0x12, 0x96, 0x4e, 0x12, 0x20, 0x2f, 0xf1, 0xad, 0x09, 0xe1, 0xdf, 0x24, + 0xbd, 0x10, 0x07, 0xb3, 0x5a, 0x6c, 0x53, 0x3d, 0xaf, 0x60, 0xb1, 0xc8, + 0x71, 0xb2, 0x7e, 0xc4, 0xfe, 0x2e, 0x8a, 0xc5, 0x37, 0xef, 0x8a, 0x7e, + 0x6c, 0x39, 0xdb, 0xd9, 0x85, 0x34, 0xc0, 0x92, 0x75, 0xdb, 0x8c, 0x90, + 0x2f, 0x74, 0x92, 0x9a, 0x4e, 0x0f, 0x52, 0xd0, 0x15, 0x42, 0x88, 0xe7, + 0xac, 0xd0, 0xe6, 0xca, 0xae, 0x82, 0x50, 0x66, 0x4a, 0xee, 0xf0, 0xee, + 0xbb, 0xf1, 0x10, 0x31, 0xe2, 0x91, 0xc5, 0x27, 0xdd, 0x34, 0xe3, 0x05, + 0x76, 0x53, 0x10, 0x7f, 0xb5, 0x75, 0x6f, 0x5e, 0xa8, 0xdf, 0xa2, 0x52, + 0xa1, 0xc4, 0x92, 0x8d, 0x18, 0x47, 0x48, 0x68, 0xf6, 0x54, 0x3e, 0x4e, + 0x7e, 0x8f, 0x9b, 0xff, 0xb5, 0xe1, 0xe5, 0xcb, 0x25, 0x96, 0x27, 0x65, + 0x45, 0x80, 0x13, 0x5f, 0x56, 0x2e, 0x1e, 0x06, 0xb3, 0x65, 0x1a, 0xfc, + 0x94, 0x88, 0x29, 0x54, 0xf3, 0xb0, 0x06, 0xd4, 0xba, 0x4a, 0x34, 0xa4, + 0x0f, 0x7c, 0x4a, 0x0e, 0x55, 0x0f, 0xef, 0x7c, 0xbb, 0xaa, 0x24, 0x47, + 0xeb, 0x9c, 0x16, 0xf9, 0xe7, 0x80, 0xf3, 0x85, 0x51, 0x5d, 0x36, 0x7a, + 0x42, 0x2e, 0x56, 0x76, 0xaf, 0xf3, 0x6e, 0x5e, 0x31, 0x6d, 0xcf, 0x75, + 0xd3, 0x84, 0x77, 0xfe, 0xc0, 0xf7, 0x12, 0x09, 0xa5, 0x66, 0x30, 0x45, + 0xce, 0xe2, 0x9f, 0xbc, 0xbd, 0x60, 0x92, 0xf0, 0x63, 0x50, 0xcd, 0x99, + 0x22, 0xdc, 0x4c, 0x11, 0x5a, 0xcd, 0xad, 0xc0, 0x45, 0x53, 0xa6, 0x1a, + 0x08, 0xa3, 0xa8, 0x81, 0x5d, 0xfe, 0x98, 0xaa, 0x44, 0xf5, 0x51, 0x21, + 0x32, 0xbf, 0xfe, 0xce, 0x58, 0x4b, 0x0c, 0x96, 0x59, 0x26, 0x6b, 0xd2, + 0x15, 0x59, 0x2a, 0xca, 0x5c, 0x0b, 0xdb, 0xdd, 0x55, 0xd5, 0x10, 0x94, + 0xb7, 0x1f, 0xc1, 0x4f, 0xca, 0xde, 0xf7, 0x37, 0x80, 0x29, 0x8f, 0x2b, + 0xf6, 0xcc, 0x33, 0xe9, 0x1c, 0x82, 0x8e, 0x3d, 0x6a, 0x66, 0xa6, 0x96, + 0x5c, 0x39, 0x7a, 0x41, 0x9d, 0x46, 0xaa, 0xb0, 0x3e, 0x5b, 0x70, 0xe8, + 0x9c, 0xf6, 0x2a, 0xb9, 0x28, 0x72, 0x4c, 0x0f, 0xef, 0xc9, 0x31, 0xbc, + 0xaa, 0x82, 0x3a, 0x0a, 0x24, 0xd7, 0x52, 0x44, 0x3a, 0xfe, 0x8e, 0x32, + 0x6c, 0x3d, 0xc6, 0x63, 0xd3, 0xaa, 0x42, 0xf1, 0x8c, 0xcd, 0xfe, 0xad, + 0xeb, 0xd8, 0x01, 0x9a, 0x66, 0x98, 0xe8, 0x07, 0xc6, 0x0e, 0xce, 0x55, + 0xe9, 0xf3, 0xc0, 0xc2, 0x94, 0x9d, 0xc9, 0xab, 0x58, 0xc0, 0xc3, 0xf9, + 0xb6, 0xc2, 0x67, 0x9a, 0xaa, 0xaa, 0xa3, 0x4a, 0xb8, 0xfe, 0xe8, 0xb4, + 0x1d, 0x22, 0x19, 0x24, 0xbf, 0xa8, 0xa7, 0xef, 0xfd, 0x9a, 0x43, 0x92, + 0xe9, 0x35, 0x23, 0x53, 0x9a, 0xbb, 0x44, 0x88, 0x2c, 0x5c, 0x39, 0xa7, + 0x6a, 0xea, 0x6e, 0x35, 0x9d, 0xba, 0xa2, 0xca, 0x3f, 0xc6, 0x2f, 0x49, + 0x8a, 0xfd, 0xd6, 0x85, 0x81, 0x25, 0x58, 0xf1, 0xde, 0x46, 0xbe, 0xd3, + 0x1a, 0xa1, 0x69, 0xc8, 0xfd, 0xe7, 0x77, 0x18, 0xf2, 0xe9, 0x08, 0xca, + 0xd7, 0xf0, 0x67, 0x10, 0x7a, 0x0c, 0xa8, 0x33, 0x1a, 0xaf, 0x63, 0xcb, + 0x3e, 0x22, 0xcb, 0xd1, 0x0a, 0x1d, 0xdd, 0x2f, 0xbf, 0x39, 0x3c, 0x0b, + 0x67, 0x6a, 0x51, 0xa3, 0x5d, 0x6a, 0xdd, 0x40, 0xae, 0x2b, 0x08, 0x2a, + 0x33, 0x90, 0xd1, 0xad, 0x42, 0xfb, 0x3a, 0x42, 0x6e, 0xb6, 0x63, 0xfe, + 0x20, 0xa2, 0x45, 0xee, 0x65, 0xb8, 0xa5, 0xb4, 0x09, 0xc8, 0xe1, 0xd3, + 0x85, 0xd5, 0xca, 0xdc, 0x91, 0xaa, 0x01, 0x8c, 0xdd, 0x3d, 0x94, 0x1a, + 0xde, 0xf3, 0x76, 0xb2, 0xbe, 0x4a, 0x4b, 0xb6, 0x62, 0x34, 0x5f, 0x64, + 0xaf, 0xfb, 0x13, 0xf7, 0x1b, 0x8b, 0xe2, 0x9f, 0x2a, 0x87, 0x81, 0x78, + 0x93, 0xc5, 0x5d, 0x84, 0xf3, 0xab, 0xfe, 0x72, 0x65, 0x19, 0x4e, 0xee, + 0xc4, 0xe0, 0x25, 0xf0, 0xfa, 0x79, 0xa9, 0x4c, 0x98, 0xb8, 0xf5, 0xce, + 0xae, 0xe3, 0x2c, 0xbb, 0xf7, 0x77, 0x9d, 0x0e, 0x2c, 0x3c, 0x99, 0x75, + 0xf9, 0x3e, 0x6b, 0x53, 0x82, 0xc4, 0x27, 0xba, 0x77, 0x66, 0x49, 0xe6, + 0x7e, 0x5a, 0xc9, 0x58, 0x66, 0x7f, 0x0a, 0x34, 0xc1, 0xdd, 0x28, 0xb1, + 0x12, 0x65, 0x43, 0x77, 0x98, 0xbb, 0xae, 0x94, 0x60, 0x6f, 0xee, 0x31, + 0x50, 0x18, 0x0c, 0x03, 0xab, 0xd0, 0x55, 0xed, 0xd8, 0x48, 0x36, 0x46, + 0xd5, 0x12, 0x9c, 0x35, 0x37, 0x40, 0x10, 0x38, 0x5b, 0x34, 0x0c, 0x89, + 0x63, 0x25, 0xfb, 0x4d, 0x52, 0xde, 0x34, 0x3d, 0xc0, 0x91, 0xf2, 0x7c, + 0x02, 0x44, 0x68, 0x7f, 0x40, 0xf4, 0x8d, 0x20, 0x43, 0x05, 0x44, 0xe3, + 0x17, 0xd6, 0xc0, 0xf8, 0xab, 0xfc, 0x0c, 0x50, 0x7b, 0xe1, 0x4d, 0xc5, + 0x78, 0x36, 0x43, 0xd4, 0xcb, 0x00, 0xaf, 0x13, 0x22, 0xf2, 0x92, 0x41, + 0x3d, 0x80, 0x0d, 0x30, 0xa7, 0xef, 0x3a, 0x60, 0xa2, 0x12, 0x97, 0xce, + 0x14, 0x0b, 0x3e, 0xfe, 0x44, 0x1d, 0x64, 0x13, 0x7a, 0xb3, 0x0c, 0xac, + 0x27, 0xbd, 0xa3, 0x7c, 0xbb, 0xe6, 0x0d, 0xc8, 0xa4, 0x01, 0x58, 0x89, + 0xab, 0x76, 0x1b, 0xe3, 0x97, 0x2d, 0x27, 0x1c, 0xed, 0xde, 0x79, 0xc1, + 0x89, 0xe2, 0x05, 0x5f, 0x0c, 0xe0, 0xcb, 0xda, 0xd3, 0x46, 0x99, 0xb7, + 0xd2, 0x62, 0xb0, 0xb6, 0xdf, 0xcc, 0x33, 0x53, 0xa9, 0x8d, 0xdc, 0x3d, + 0x14, 0x0e, 0xc2, 0x9d, 0xa2, 0x2e, 0x0f, 0x5d, 0xed, 0x45, 0x9b, 0x59, + 0x15, 0xec, 0xf3, 0x01, 0xa8, 0xef, 0xcb, 0xbf, 0x29, 0xef, 0x1b, 0xe3, + 0xc4, 0xae, 0x3f, 0x6c, 0x43, 0x16, 0xea, 0x61, 0xe1, 0xef, 0x1a, 0x24, + 0xd9, 0xd3, 0x18, 0x79, 0x69, 0xe3, 0xeb, 0xf2, 0x7b, 0xb2, 0xb3, 0x91, + 0xa2, 0xd0, 0x2d, 0xd6, 0x59, 0xd6, 0x89, 0xc3, 0xa2, 0xf9, 0x19, 0x9f, + 0x08, 0x9f, 0x48, 0x77, 0x26, 0x71, 0x27, 0x8b, 0x82, 0x3f, 0x90, 0x60, + 0x0d, 0x04, 0x80, 0x49, 0xc6, 0x2f, 0xa9, 0x17, 0xa8, 0xea, 0x74, 0x3e, + 0xf4, 0x28, 0x3a, 0x76, 0xc6, 0x0e, 0x38, 0xce, 0x81, 0xdd, 0x86, 0x8f, + 0x64, 0x92, 0x1c, 0x64, 0x62, 0x7f, 0x6f, 0x96, 0xb4, 0xa8, 0x42, 0x19, + 0x60, 0x43, 0x43, 0x2a, 0x17, 0x03, 0xa5, 0x84, 0x5e, 0xd0, 0x97, 0x66, + 0xfa, 0xe3, 0x94, 0x44, 0xf1, 0x4c, 0xd5, 0x94, 0xd1, 0xb6, 0x4d, 0xdc, + 0x46, 0xb3, 0x39, 0x50, 0x86, 0x40, 0x0c, 0x77, 0xe6, 0xc3, 0xd4, 0x10, + 0x3d, 0xe4, 0x8a, 0xb9, 0xc4, 0xb1, 0x04, 0xc1, 0x0f, 0xe7, 0xfa, 0x42, + 0x7e, 0xf7, 0x72, 0xbd, 0x80, 0xab, 0x8e, 0x19, 0x47, 0x20, 0x50, 0x55, + 0x89, 0xa0, 0x2d, 0xb8, 0x16, 0x58, 0x21, 0xb5, 0x5f, 0xf1, 0xb3, 0x35, + 0xac, 0x6a, 0xad, 0xb0, 0xe6, 0xb8, 0xe8, 0x7a, 0x8a, 0xbc, 0xa6, 0x5b, + 0x09, 0xb4, 0x31, 0x8c, 0x65, 0x81, 0xfb, 0x93, 0x6d, 0xca, 0xa4, 0xc6, + 0x0a, 0x6d, 0x0a, 0xc0, 0xbb, 0x4d, 0xd9, 0xd0, 0x38, 0x67, 0xaf, 0x4e, + 0xb5, 0xae, 0x00, 0x4f, 0x5d, 0x98, 0x6c, 0x04, 0x69, 0x4f, 0x3d, 0x5c, + 0xf4, 0x50, 0xd9, 0x32, 0x2b, 0x94, 0x83, 0x3c, 0xbe, 0x15, 0x59, 0xd6, + 0xa6, 0x76, 0x76, 0x4a, 0xb8, 0x8d, 0xb5, 0xa8, 0xdc, 0xe9, 0xe5, 0xff, + 0x6e, 0x0d, 0xc2, 0xf3, 0x5a, 0xb6, 0x82, 0x0b, 0xbd, 0xa2, 0x25, 0xf1, + 0x82, 0xc9, 0x01, 0xbb, 0x99, 0x4e, 0x56, 0x05, 0x4a, 0xd8, 0xfe, 0x5e, + 0x61, 0xb0, 0x70, 0xd8, 0xad, 0x62, 0xcb, 0xa5, 0xe6, 0x62, 0xba, 0xfe, + 0x90, 0x95, 0xcf, 0xf0, 0x82, 0xca, 0x54, 0xa7, 0x55, 0x76, 0x17, 0x5c, + 0x62, 0xcf, 0xd9, 0x9d, 0x1e, 0x77, 0x3f, 0xcf, 0xdf, 0xff, 0xbb, 0xaa, + 0x1a, 0x20, 0x7a, 0xd1, 0xa0, 0x34, 0x24, 0x44, 0xc4, 0x12, 0x54, 0xbe, + 0xe2, 0x91, 0x9e, 0xe1, 0xcf, 0x23, 0xfc, 0xb8, 0x4d, 0x35, 0xf8, 0x31, + 0x7a, 0x69, 0x0b, 0x01, 0xbc, 0x43, 0x17, 0xd6, 0xa0, 0x2b, 0x20, 0xcd, + 0x12, 0xcf, 0xef, 0x39, 0xd4, 0x62, 0x90, 0x03, 0x6d, 0xbf, 0x58, 0x56, + 0xaa, 0x81, 0xcd, 0xb2, 0x26, 0x5b, 0x8a, 0xf4, 0x99, 0xf9, 0x4a, 0x08, + 0x37, 0xdf, 0x9d, 0x03, 0x18, 0xc7, 0xe8, 0x44, 0x9f, 0xb8, 0x20, 0x0a, + 0x67, 0xf6, 0x30, 0x84, 0x1a, 0xb8, 0xed, 0x57, 0xf1, 0x55, 0xaf, 0x0a, + 0x67, 0xc1, 0x3c, 0x07, 0x5e, 0x26, 0x1e, 0x1a, 0x0a, 0x5d, 0x9f, 0x9a, + 0x05, 0x2e, 0x6d, 0x30, 0x85, 0xbd, 0xc3, 0xa9, 0xa5, 0x5f, 0xb3, 0x3b, + 0x9e, 0x6a, 0x00, 0x42, 0x2d, 0x47, 0x24, 0xd8, 0xbf, 0x65, 0x38, 0x61, + 0xe7, 0xe6, 0xb6, 0x89, 0x2c, 0x94, 0xa0, 0xf0, 0xdb, 0x15, 0x5a, 0xe5, + 0x1f, 0xfc, 0x94, 0x3b, 0x79, 0x5f, 0xe4, 0x77, 0x48, 0xb9, 0x39, 0xad, + 0x6d, 0xf3, 0xce, 0xd6, 0x43, 0x10, 0x82, 0xaf, 0x56, 0x8e, 0x91, 0xb2, + 0xd1, 0xde, 0xea, 0x32, 0x1a, 0xbd, 0xab, 0x9d, 0x26, 0x22, 0xaf, 0xbc, + 0x91, 0x18, 0x40, 0x9e, 0x19, 0xf2, 0xa5, 0x5d, 0x0c, 0x34, 0xde, 0x83, + 0x84, 0x11, 0x20, 0x39, 0x47, 0x68, 0x99, 0x1a, 0x07, 0xd1, 0x3e, 0xbd, + 0x48, 0x8d, 0x27, 0xa3, 0x89, 0x86, 0xc3, 0xa9, 0x9c, 0xf9, 0xf3, 0x57, + 0xef, 0x76, 0xa0, 0xa6, 0x76, 0xad, 0x0d, 0x67, 0x33, 0x21, 0xc1, 0xec, + 0xaf, 0x80, 0x85, 0x0e, 0xf8, 0x85, 0x4b, 0xbe, 0x2e, 0x7b, 0x18, 0xc1, + 0x81, 0xcf, 0x0f, 0x47, 0x93, 0x81, 0x42, 0x69, 0xaa, 0x64, 0x7f, 0x4f, + 0xbb, 0x80, 0xfd, 0xaf, 0x70, 0xca, 0x80, 0xb8, 0x06, 0xd8, 0xfa, 0xdc, + 0x2f, 0xfc, 0x86, 0x15, 0x57, 0x02, 0x29, 0xbc, 0x77, 0xbb, 0x74, 0x3b, + 0x6b, 0x9d, 0x7f, 0x15, 0xd4, 0x90, 0x5e, 0xd6, 0x2e, 0x2b, 0x78, 0x93, + 0x1b, 0xec, 0xd6, 0xaf, 0x7e, 0x2e, 0x1d, 0x1e, 0x5b, 0xa5, 0x91, 0xdd, + 0xaf, 0x41, 0x96, 0xe2, 0x6c, 0x8b, 0xef, 0x14, 0xf6, 0x5f, 0xab, 0xe1, + 0xda, 0xb5, 0xf7, 0xb3, 0x30, 0xbd, 0xbb, 0xbe, 0xf9, 0x71, 0xf9, 0x5a, + 0x2e, 0xd9, 0x4f, 0xc3, 0x09, 0xf1, 0xbb, 0x4e, 0xac, 0x09, 0x4d, 0xd2, + 0x67, 0x60, 0x6c, 0xc0, 0x8a, 0x9e, 0x32, 0xd0, 0x59, 0xca, 0x8d, 0xd0, + 0xf4, 0x97, 0x4a, 0xfc, 0xe5, 0xb0, 0xdf, 0x0c, 0xc3, 0x8b, 0x28, 0x84, + 0xa2, 0x0c, 0xd2, 0x38, 0xec, 0x6d, 0x3a, 0xb4, 0x6e, 0xf4, 0xa5, 0x12, + 0x9b, 0x20, 0x95, 0x52, 0xd5, 0x0d, 0xbe, 0x17, 0x31, 0x52, 0x27, 0x7c, + 0x22, 0x5e, 0x23, 0xcb, 0x13, 0xf1, 0xdb, 0xf7, 0x2a, 0xa0, 0xaf, 0x15, + 0xaf, 0xe4, 0x27, 0xfe, 0xcc, 0xc4, 0x60, 0xd2, 0xfb, 0x5a, 0x7d, 0x81, + 0xf4, 0x32, 0x18, 0x3d, 0x74, 0xf3, 0x95, 0xfe, 0xbd, 0xee, 0xa0, 0x84, + 0x67, 0x24, 0x86, 0x58, 0xd3, 0x6d, 0xce, 0xc2, 0xac, 0xb3, 0xb3, 0x22, + 0xe2, 0x2c, 0x47, 0xf2, 0xf0, 0xb1, 0x35, 0x5c, 0x57, 0x56, 0x58, 0x06, + 0xcd, 0x4c, 0xc1, 0x8e, 0xf6, 0x76, 0x37, 0xa1, 0x0c, 0x6f, 0xfc, 0x03, + 0x93, 0xfa, 0x57, 0x56, 0xab, 0x5b, 0x0a, 0x8f, 0x33, 0x9f, 0x22, 0x36, + 0x47, 0x5a, 0x6a, 0xa0, 0x16, 0x2a, 0xe4, 0x08, 0xfe, 0xc3, 0x53, 0x44, + 0x93, 0x1a, 0x28, 0xa7, 0xd8, 0x38, 0x67, 0x9e, 0x0f, 0x4b, 0xd1, 0x48, + 0xa1, 0xe1, 0xdc, 0x8f, 0x01, 0x30, 0x5c, 0xf5, 0x0d, 0x74, 0x33, 0x01, + 0x78, 0x1d, 0x19, 0x82, 0x02, 0x9e, 0x54, 0x10, 0x2e, 0x7b, 0x12, 0xb8, + 0x17, 0xba, 0xc3, 0xf0, 0xf7, 0x65, 0x9d, 0xd2, 0xe3, 0xcd, 0x96, 0x07, + 0x5e, 0xfa, 0x0d, 0x89, 0x94, 0xc3, 0x8c, 0x92, 0x9f, 0x17, 0xcb, 0x3b, + 0xea, 0xed, 0xf6, 0x9d, 0xee, 0x06, 0xc6, 0x42, 0xa5, 0x69, 0xa0, 0x9f, + 0x94, 0x00, 0xaa, 0xec, 0xd9, 0x20, 0x70, 0x23, 0x65, 0xa7, 0xb3, 0xdf, + 0xb1, 0x8c, 0x17, 0xc5, 0x0f, 0x9d, 0x45, 0x94, 0xf9, 0xed, 0xbc, 0x3c, + 0x78, 0x7e, 0x3c, 0xf7, 0x6a, 0x59, 0x95, 0x15, 0x15, 0xce, 0x17, 0xe1, + 0xc7, 0xf1, 0x79, 0xbb, 0xb0, 0x77, 0xd4, 0xee, 0x1c, 0x55, 0x92, 0x3f, + 0x08, 0xab, 0x7e, 0x96, 0x59, 0x48, 0x82, 0x9e, 0xc9, 0xea, 0x2a, 0x07, + 0x13, 0xd2, 0x19, 0x0b, 0x73, 0xec, 0x10, 0x36, 0xb8, 0x4d, 0x17, 0x2e, + 0x1d, 0x9c, 0x27, 0x9d, 0xb2, 0xfc, 0xa0, 0xfe, 0x8a, 0xdb, 0xae, 0x73, + 0xa7, 0xb5, 0x44, 0xff, 0x38, 0x14, 0x9d, 0x67, 0xd1, 0x53, 0xf4, 0x8e, + 0x2d, 0x52, 0x39, 0xa3, 0x63, 0x38, 0x78, 0x30, 0x7c, 0x7d, 0x99, 0xe9, + 0x11, 0x78, 0xf0, 0x53, 0xc2, 0xcf, 0x6b, 0xf3, 0x6c, 0x81, 0x96, 0x20, + 0x9f, 0x72, 0x24, 0x66, 0x83, 0x80, 0x60, 0x20, 0xb1, 0x35, 0x21, 0x3a, + 0x68, 0xa4, 0x07, 0x96, 0xb6, 0xdc, 0x32, 0xa0, 0x4a, 0x6f, 0xa5, 0x9f, + 0xf2, 0xa5, 0xc2, 0xf4, 0x3b, 0x95, 0x66, 0x34, 0x06, 0xae, 0x95, 0x23, + 0x38, 0xb1, 0xd3, 0x68, 0x59, 0x10, 0x2c, 0xdd, 0x6f, 0xb3, 0x1a, 0x03, + 0xf3, 0xb8, 0xea, 0xfa, 0x6f, 0x3f, 0xd2, 0x25, 0x6c, 0x59, 0x29, 0x70, + 0xa4, 0xc7, 0x96, 0x80, 0x33, 0x1c, 0x19, 0x4f, 0x6d, 0x0e, 0x51, 0xc2, + 0x17, 0x5a, 0x76, 0xbf, 0x1d, 0x7c, 0x86, 0x57, 0x94, 0x2b, 0xe4, 0xe0, + 0x7e, 0xb9, 0x75, 0xb9, 0x00, 0x54, 0x2f, 0xbb, 0x96, 0xb5, 0xd0, 0x00, + 0x66, 0x75, 0x95, 0xe3, 0x54, 0x13, 0x2b, 0x5a, 0xff, 0xab, 0xe7, 0x5f, + 0x76, 0x4b, 0x04, 0x79, 0xae, 0xb8, 0x14, 0x94, 0xa0, 0x4c, 0x51, 0x5b, + 0xc7, 0xf8, 0xbb, 0x64, 0x28, 0x61, 0x05, 0x7f, 0x78, 0xbe, 0xec, 0x32, + 0x4f, 0xc6, 0xed, 0xba, 0xe3, 0x15, 0xa5, 0x34, 0x65, 0x3f, 0x15, 0x1f, + 0x17, 0x1e, 0x29, 0xae, 0xfe, 0x0d, 0xd3, 0xf1, 0xaa, 0x64, 0x40, 0xdb, + 0xcc, 0xc1, 0xa4, 0xf2, 0xa4, 0x9a, 0xda, 0x5c, 0xe9, 0xb3, 0x7a, 0x71, + 0xac, 0xbb, 0x8a, 0x8b, 0x80, 0x1a, 0x68, 0x16, 0x54, 0x6c, 0xbb, 0x7f, + 0x95, 0x8b, 0x14, 0xe9, 0x2e, 0x03, 0xf9, 0x93, 0x4a, 0x36, 0x16, 0x5a, + 0x32, 0xd6, 0x85, 0x9f, 0xf7, 0x2d, 0x29, 0xbf, 0xb3, 0xce, 0x10, 0x3d, + 0xa3, 0x96, 0xa1, 0x75, 0x65, 0x78, 0xcf, 0x00, 0xdb, 0xa6, 0x20, 0x09, + 0x13, 0x7e, 0xae, 0x79, 0xcb, 0xdf, 0x6c, 0xcb, 0xca, 0x2b, 0x66, 0xcc, + 0xbd, 0xa9, 0xe9, 0xc4, 0xd7, 0xe9, 0xa8, 0x3e, 0x2c, 0x2c, 0x25, 0xf9, + 0x27, 0x22, 0x0e, 0x6d, 0x9f, 0xd6, 0x97, 0x51, 0x2f, 0x1e, 0x3d, 0x91, + 0x50, 0x8b, 0x24, 0x01, 0x34, 0x12, 0x18, 0x5e, 0xc5, 0x5a, 0x81, 0x78, + 0xad, 0xaa, 0x04, 0x00, 0x20, 0x78, 0xb7, 0x45, 0x61, 0x36, 0x80, 0x88, + 0xd2, 0xec, 0x57, 0x47, 0xaf, 0x77, 0x14, 0x15, 0x89, 0xd8, 0x30, 0xe9, + 0xa2, 0x50, 0x73, 0xc6, 0x79, 0xa3, 0x60, 0x40, 0xcb, 0x21, 0x61, 0xd7, + 0xbd, 0x50, 0x91, 0x1e, 0xbb, 0x40, 0xa4, 0x7e, 0x1a, 0xf5, 0x75, 0x20, + 0xef, 0x47, 0xa6, 0x2b, 0xbe, 0x98, 0xad, 0xee, 0x7d, 0x8b, 0x9f, 0xd4, + 0xed, 0x89, 0x31, 0x2c, 0x56, 0xfb, 0x6d, 0x54, 0x4a, 0x74, 0xf2, 0x51, + 0xa9, 0x77, 0x4e, 0x78, 0x7d, 0x99, 0xd5, 0xc8, 0xa7, 0x29, 0xa0, 0x48, + 0x79, 0x29, 0xc1, 0x02, 0x01, 0x65, 0xd2, 0x47, 0xac, 0xed, 0x81, 0x8c, + 0xf0, 0xce, 0x47, 0x1b, 0xdd, 0xbf, 0x17, 0x9a, 0x9d, 0x0b, 0x3f, 0x2c, + 0x53, 0x18, 0xce, 0x5b, 0x5a, 0x05, 0x5f, 0x0c, 0x40, 0xfd, 0x54, 0xcd, + 0xf6, 0xd1, 0xcf, 0x0a, 0x5b, 0x23, 0xee, 0x0a, 0x98, 0x14, 0xc8, 0x56, + 0xbf, 0xf8, 0x33, 0xd3, 0x50, 0x93, 0x1e, 0x1d, 0x24, 0xf3, 0xa6, 0xe8, + 0x81, 0x2c, 0x60, 0x06, 0x3d, 0x95, 0xff, 0xda, 0xc2, 0x55, 0x3b, 0x2a, + 0xa1, 0xda, 0xbc, 0xd3, 0xc7, 0x54, 0x23, 0x51, 0x38, 0xd1, 0x4a, 0xd1, + 0xf0, 0xb9, 0x42, 0x5a, 0xec, 0x86, 0x60, 0xac, 0x34, 0xf8, 0x96, 0x2e, + 0x45, 0xa2, 0x4c, 0x0e, 0x72, 0x9b, 0xda, 0xd9, 0xc5, 0xa3, 0x10, 0x76, + 0x0e, 0xd2, 0xa6, 0x97, 0xff, 0x52, 0x3c, 0x97, 0x99, 0xc9, 0xac, 0x78, + 0xf1, 0x29, 0x38, 0x06, 0x25, 0x60, 0x20, 0xe8, 0x20, 0xed, 0x3c, 0x3f, + 0xc4, 0x7d, 0x85, 0xe8, 0x50, 0xd4, 0x82, 0xd0, 0xbc, 0xb0, 0x18, 0xb6, + 0x75, 0xa0, 0x8b, 0x6f, 0x71, 0xfd, 0xf8, 0xfb, 0x83, 0xb6, 0xb4, 0xa2, + 0x4e, 0x6c, 0x46, 0xd8, 0x62, 0xc9, 0x4e, 0xbf, 0x93, 0x4d, 0x47, 0x6a, + 0xbb, 0xd1, 0x59, 0xc6, 0xee, 0x7e, 0xab, 0xb4, 0x0b, 0xe9, 0xee, 0x02, + 0x84, 0x90, 0x00, 0x6a, 0x22, 0xf7, 0xde, 0x08, 0xff, 0x8a, 0x89, 0xe6, + 0xa6, 0x62, 0x13, 0x2a, 0xe2, 0x1a, 0xb9, 0xe9, 0x3d, 0xdf, 0xf0, 0xbc, + 0x22, 0x4c, 0xdc, 0x31, 0x8c, 0x76, 0x6b, 0xac, 0x5e, 0x21, 0xad, 0x16, + 0xe6, 0xec, 0x6a, 0xeb, 0x1c, 0xfe, 0x9b, 0x8f, 0xfc, 0x44, 0x67, 0x44, + 0x24, 0x0b, 0xab, 0x85, 0xf1, 0x2d, 0x7d, 0x7e, 0x20, 0xd7, 0xc4, 0x3f, + 0x75, 0xa1, 0xb8, 0x0f, 0xfc, 0xb3, 0xd0, 0xe9, 0x68, 0x8b, 0xe2, 0xd3, + 0x02, 0x5c, 0x4f, 0xbc, 0x67, 0x19, 0xe3, 0x2a, 0xa1, 0x93, 0x94, 0x38, + 0x1d, 0xb3, 0x53, 0xfc, 0x01, 0x70, 0xe3, 0x7d, 0x94, 0xaa, 0x55, 0x98, + 0x60, 0x85, 0xbe, 0x78, 0x1a, 0x74, 0x07, 0x6d, 0x5e, 0x9d, 0x89, 0x44, + 0xf5, 0x5c, 0xd8, 0xd0, 0xa5, 0x38, 0x5b, 0x8b, 0xd0, 0x06, 0x61, 0x4b, + 0x30, 0x57, 0x92, 0xd2, 0x3d, 0xba, 0x0e, 0x3c, 0xa8, 0x22, 0x45, 0x86, + 0x69, 0x03, 0xef, 0x30, 0xdb, 0x41, 0x7a, 0x13, 0x7d, 0x7f, 0x15, 0x00, + 0x8a, 0x0a, 0xdc, 0x71, 0x2e, 0xe8, 0x89, 0x4e, 0x2d, 0xc7, 0xdc, 0xfe, + 0xb1, 0x4a, 0x98, 0x73, 0xe5, 0x0f, 0xef, 0x0b, 0xdd, 0x7b, 0x44, 0x3d, + 0x06, 0x16, 0xb4, 0xa8, 0xe9, 0x27, 0x87, 0x09, 0x32, 0x14, 0x2b, 0x2b, + 0xdd, 0x83, 0xe9, 0x87, 0xbc, 0x75, 0x3e, 0xe6, 0x7e, 0x14, 0xad, 0x96, + 0x0b, 0xa6, 0x55, 0x98, 0x5b, 0x65, 0xf9, 0x89, 0x49, 0x23, 0xaf, 0xbc, + 0x20, 0x2d, 0x3d, 0xcf, 0x50, 0x5f, 0x72, 0x93, 0xa5, 0x0d, 0xa0, 0xd7, + 0x2d, 0xee, 0x55, 0x8c, 0x90, 0x1b, 0x7e, 0xa3, 0x7f, 0x46, 0x59, 0xc9, + 0xa9, 0x8c, 0x91, 0xbb, 0xc5, 0x4a, 0x9c, 0x75, 0xd8, 0xb1, 0x75, 0xcf, + 0xb1, 0x55, 0xbf, 0x06, 0x51, 0x94, 0x00, 0x91, 0xdc, 0xa2, 0x25, 0xbc, + 0xb1, 0x1d, 0x70, 0xc9, 0x63, 0x2e, 0x74, 0x83, 0x0d, 0xd2, 0x1d, 0xde, + 0xd3, 0x4c, 0x4f, 0xf5, 0x73, 0xaa, 0xa2, 0xb2, 0x3f, 0xbf, 0x92, 0xa7, + 0x57, 0x55, 0x71, 0xea, 0x8e, 0x81, 0xe4, 0x45, 0x33, 0xd7, 0x29, 0x9b, + 0x0b, 0x3b, 0xe2, 0xa9, 0xb1, 0xe6, 0xcb, 0x21, 0x25, 0x10, 0xbb, 0xfb, + 0x1e, 0x0b, 0x82, 0xa9, 0x37, 0x54, 0x84, 0x93, 0xeb, 0xd7, 0x3d, 0xb2, + 0x5a, 0x4a, 0xa4, 0xd6, 0xfa, 0xaa, 0x7a, 0x25, 0x90, 0x7d, 0x82, 0xd8, + 0x54, 0xad, 0x3e, 0x95, 0x61, 0xb2, 0x9e, 0xc9, 0x2a, 0x8e, 0x04, 0x2b, + 0x57, 0x93, 0x02, 0x75, 0x05, 0x2b, 0x01, 0xf8, 0x88, 0x85, 0x58, 0x37, + 0x80, 0x8d, 0xed, 0x4e, 0x96, 0x1a, 0xe2, 0x2c, 0x8e, 0xef, 0x20, 0xba, + 0x16, 0x61, 0x2a, 0xbb, 0x16, 0x5d, 0x26, 0xbd, 0xe0, 0x78, 0x7e, 0xdd, + 0x7a, 0x39, 0xdc, 0x19, 0x3d, 0x88, 0xac, 0xe1, 0xd4, 0x7e, 0xc9, 0xaf, + 0x21, 0x84, 0xb9, 0xae, 0x24, 0x90, 0xb3, 0xbb, 0xd0, 0x8d, 0x7a, 0x83, + 0x7e, 0xa4, 0x6b, 0x47, 0x53, 0xb0, 0x0b, 0x89, 0xf1, 0xa4, 0x10, 0xa1, + 0xe0, 0x42, 0xa8, 0x05, 0x0f, 0x8e, 0x88, 0x94, 0xd6, 0x96, 0xf9, 0x8d, + 0xd4, 0xc0, 0x19, 0xfe, 0x26, 0xf5, 0x66, 0x6a, 0x1b, 0x87, 0x4e, 0x5a, + 0x03, 0x5b, 0xe0, 0x44, 0x04, 0x8e, 0x9f, 0xea, 0xa3, 0x9c, 0x68, 0x2a, + 0x3f, 0x21, 0xa9, 0xf0, 0x89, 0x8e, 0x3d, 0xaa, 0xf9, 0xa5, 0xf9, 0x8a, + 0xba, 0xe7, 0x54, 0xb1, 0x9d, 0x48, 0x45, 0x5e, 0x0d, 0x44, 0xa4, 0x0b, + 0x7b, 0x14, 0x5a, 0x64, 0xd4, 0xf4, 0x49, 0xbe, 0xb4, 0x59, 0x61, 0x3a, + 0xd1, 0x56, 0x94, 0x98, 0xf7, 0x8f, 0x02, 0x85, 0x98, 0x0e, 0xcf, 0x37, + 0xb9, 0x40, 0x3a, 0x5a, 0xa1, 0xe1, 0x84, 0x93, 0x9b, 0x53, 0xe4, 0x5a, + 0xd2, 0x84, 0x53, 0x53, 0x35, 0x4d, 0xca, 0x56, 0x74, 0x01, 0x22, 0xe5, + 0x34, 0x42, 0x92, 0x7d, 0x16, 0xf5, 0x4c, 0x35, 0xa8, 0x7d, 0xd2, 0x1d, + 0xd8, 0x77, 0x63, 0x6e, 0xea, 0x05, 0xdf, 0x1f, 0xcd, 0xb7, 0x64, 0x44, + 0x26, 0xe9, 0xe3, 0xc2, 0x9e, 0xaf, 0xe7, 0x91, 0x04, 0x42, 0x97, 0x00, + 0x1a, 0x76, 0x03, 0xa4, 0x11, 0xef, 0x28, 0x89, 0x0e, 0xaa, 0xc0, 0x05, + 0xdb, 0x4c, 0xb4, 0x77, 0x28, 0x25, 0x10, 0x64, 0x96, 0xe5, 0x44, 0x66, + 0x62, 0xa9, 0x55, 0x1c, 0x27, 0xf2, 0xef, 0x61, 0xc3, 0x77, 0x8a, 0xd9, + 0x33, 0x48, 0xf4, 0xfb, 0x61, 0xbe, 0x59, 0xe9, 0x2e, 0xc8, 0xbf, 0xf7, + 0xe4, 0x70, 0xfb, 0xfd, 0x81, 0xe8, 0xe2, 0xc3, 0x60, 0xc9, 0x18, 0x9e, + 0xb4, 0x12, 0xea, 0x5d, 0xbc, 0xc2, 0xf8, 0x08, 0x6b, 0xba, 0xcc, 0x09, + 0x3f, 0x20, 0x86, 0x22, 0xc9, 0x38, 0xc9, 0x9c, 0x57, 0x97, 0xd1, 0x3b, + 0xf3, 0x4b, 0xb3, 0x09, 0x67, 0x62, 0x96, 0x4f, 0x3b, 0x5f, 0x1a, 0xfb, + 0xda, 0x93, 0xe7, 0xd8, 0x6f, 0x4c, 0xc0, 0x9f, 0xd2, 0xe2, 0x33, 0x1f, + 0xda, 0x14, 0x68, 0x61, 0x38, 0x75, 0x9c, 0xbd, 0x56, 0x09, 0x4e, 0x35, + 0xdf, 0x94, 0x71, 0x3f, 0x00, 0x7b, 0x6a, 0x91, 0x0f, 0x36, 0xa8, 0x61, + 0xd8, 0x3d, 0x2f, 0xd1, 0x17, 0x07, 0x74, 0x72, 0xb7, 0x95, 0x88, 0x0d, + 0xed, 0xb3, 0xbe, 0x42, 0x95, 0x2b, 0x47, 0x80, 0xa6, 0xda, 0x73, 0x7a, + 0x7d, 0x44, 0x80, 0x58, 0x45, 0x8f, 0xbc, 0x46, 0x5e, 0x87, 0xa9, 0xb5, + 0x40, 0xbf, 0xd1, 0x0c, 0xe9, 0x0c, 0x8a, 0x79, 0x49, 0xe8, 0x37, 0x58, + 0x20, 0x3a, 0xc4, 0x90, 0x5f, 0xbc, 0x6c, 0x7f, 0x20, 0xa4, 0xec, 0xdf, + 0x01, 0x91, 0xf7, 0x55, 0xb2, 0x7d, 0x85, 0x43, 0x5b, 0x79, 0x20, 0x6f, + 0x0a, 0x1c, 0xf9, 0xad, 0x86, 0x64, 0xbd, 0xa7, 0xe3, 0x1d, 0xe5, 0x40, + 0x24, 0x83, 0x59, 0x63, 0x67, 0x6b, 0xc4, 0x23, 0xd9, 0x80, 0x3b, 0x39, + 0xf9, 0x78, 0xb7, 0xad, 0xc5, 0x28, 0x05, 0x0b, 0xdc, 0x8c, 0x6c, 0xce, + 0x8b, 0xfb, 0x1c, 0x5e, 0xf2, 0x6b, 0xe4, 0xd4, 0x91, 0xf3, 0xfc, 0xd6, + 0x9f, 0x18, 0xba, 0x10, 0x60, 0xe5, 0x15, 0xf5, 0x7b, 0x4e, 0x6a, 0x7e, + 0xcf, 0x79, 0x6d, 0xfa, 0x3e, 0x1a, 0x31, 0x1c, 0xa7, 0xb4, 0x3c, 0xb3, + 0x0f, 0x75, 0x9c, 0xad, 0xc0, 0x04, 0xf5, 0xe9, 0x6c, 0x76, 0xbd, 0x8a, + 0x9a, 0x3f, 0x02, 0x45, 0xa8, 0x22, 0xc3, 0x31, 0xfb, 0x87, 0xe2, 0x18, + 0x60, 0xdf, 0xeb, 0x85, 0x8c, 0x55, 0x92, 0xbb, 0x0e, 0xbb, 0x1c, 0xdc, + 0xf8, 0x15, 0xbe, 0xc2, 0xc6, 0xd6, 0xbf, 0xde, 0x36, 0x9e, 0x8d, 0x0b, + 0xa8, 0xb9, 0x22, 0x7a, 0x5c, 0xdd, 0x4c, 0x11, 0x3a, 0xfb, 0x6a, 0xe6, + 0x70, 0x0d, 0xd9, 0xee, 0x14, 0x1d, 0x56, 0x09, 0x46, 0x29, 0x08, 0x78, + 0x05, 0xfc, 0xc5, 0x77, 0xcb, 0x3b, 0x31, 0xec, 0x4c, 0xed, 0x99, 0x11, + 0x1f, 0x23, 0x86, 0x53, 0xa0, 0xee, 0x4e, 0x3d, 0x53, 0x1a, 0x48, 0x2a, + 0x8d, 0xe6, 0x39, 0xe2, 0xc9, 0x70, 0xca, 0xce, 0x5e, 0x17, 0xa6, 0x26, + 0x07, 0xd8, 0x75, 0xdb, 0xd3, 0xc0, 0xf7, 0xb9, 0x3e, 0x4c, 0x07, 0x01, + 0x54, 0xe9, 0x0c, 0x36, 0x7e, 0x6a, 0x62, 0x69, 0xc7, 0x84, 0x3b, 0xba, + 0x41, 0xc7, 0x7e, 0x87, 0x5d, 0x91, 0x70, 0x0c, 0xfd, 0x59, 0x46, 0xa2, + 0x5a, 0x04, 0x59, 0x79, 0x1b, 0xe5, 0xc3, 0xa1, 0xd8, 0x03, 0x1b, 0xf4, + 0xa8, 0x6f, 0x39, 0xdf, 0xaf, 0xe8, 0x4f, 0x9b, 0xc1, 0x41, 0xb8, 0x12, + 0x5e, 0x11, 0xba, 0x05, 0xee, 0x4b, 0x7c, 0x8c, 0xbd, 0x1e, 0x98, 0xab, + 0x31, 0xd4, 0x0f, 0x1c, 0x5b, 0x9c, 0x74, 0x9d, 0xa5, 0x43, 0x1c, 0xb7, + 0x8e, 0x5d, 0x95, 0xd5, 0x04, 0xf6, 0x42, 0xc1, 0xde, 0x01, 0xd6, 0x9a, + 0x56, 0xc0, 0x9a, 0x84, 0x54, 0x15, 0xcf, 0x01, 0x13, 0x54, 0x16, 0xff, + 0xd8, 0x8e, 0xf7, 0xa4, 0x19, 0x5c, 0x6e, 0x8e, 0xf1, 0x44, 0xfd, 0x3e, + 0xe1, 0x72, 0xf1, 0x0e, 0xfb, 0x58, 0xd8, 0xb6, 0xb9, 0x23, 0x6a, 0xb8, + 0xf7, 0x28, 0xa2, 0x3b, 0x0e, 0x0c, 0x82, 0xae, 0xc4, 0x1b, 0x9c, 0x13, + 0x86, 0xea, 0x56, 0xd7, 0x53, 0x10, 0xc8, 0x30, 0x13, 0xa6, 0xf3, 0x18, + 0x67, 0xec, 0xb0, 0xcd, 0xb7, 0xf4, 0x96, 0xe9, 0x3d, 0xdd, 0x16, 0xb6, + 0x45, 0x76, 0xf2, 0x16, 0x91, 0xcf, 0x9f, 0x5a, 0xa6, 0xf1, 0xbc, 0xf6, + 0xaa, 0xe8, 0xa4, 0xd6, 0xaa, 0xb0, 0x08, 0x2c, 0x96, 0xba, 0x92, 0xec, + 0xd1, 0xba, 0x37, 0x18, 0x21, 0x23, 0x26, 0x0b, 0x6b, 0xcf, 0xf1, 0x37, + 0x9e, 0x94, 0xe3, 0xa9, 0x88, 0xef, 0x5d, 0xdf, 0xa8, 0x45, 0xbb, 0x09, + 0x07, 0xa5, 0x96, 0xe8, 0x99, 0xd8, 0xb2, 0x64, 0xfa, 0x23, 0x56, 0x9e, + 0x9f, 0x34, 0xbe, 0x5f, 0x6f, 0xb1, 0x07, 0x4d, 0xb5, 0xbb, 0xe0, 0x09, + 0x85, 0x4b, 0xcd, 0x79, 0xb5, 0x5a, 0xb6, 0x18, 0xef, 0x00, 0x35, 0x0a, + 0x30, 0xb3, 0xbe, 0x51, 0x0b, 0x3b, 0x7c, 0x0d, 0x17, 0x08, 0x11, 0x01, + 0x16, 0x67, 0x3d, 0xf9, 0x1e, 0xb7, 0xc4, 0x99, 0xaa, 0x3b, 0x2d, 0x9f, + 0x8c, 0xfd, 0x19, 0xdf, 0xea, 0xc9, 0xb0, 0x9c, 0x83, 0x87, 0x68, 0x73, + 0x6e, 0xb6, 0xeb, 0xf7, 0x3d, 0xe3, 0x3f, 0xbd, 0x50, 0xfc, 0x9c, 0x09, + 0xcd, 0xba, 0x65, 0x50, 0x8b, 0x62, 0x66, 0xd3, 0xb3, 0xe3, 0x21, 0x31, + 0x0e, 0xaf, 0x9d, 0x15, 0x34, 0xe3, 0x6b, 0xae, 0x24, 0x4a, 0x59, 0xe9, + 0x19, 0xf3, 0x45, 0x45, 0x1f, 0x3e, 0x81, 0x7d, 0xad, 0xb9, 0xbf, 0x8a, + 0xad, 0x19, 0x82, 0x55, 0x9d, 0xa8, 0xaa, 0xb3, 0xe5, 0x9a, 0x7d, 0x56, + 0x12, 0x91, 0x91, 0xb6, 0x31, 0x5e, 0x5d, 0xbc, 0x06, 0x14, 0x5f, 0xa5, + 0x00, 0x1f, 0x08, 0xbd, 0x42, 0x03, 0xfc, 0x6e, 0xf1, 0xa3, 0x0c, 0x58, + 0x51, 0x3f, 0x3e, 0x95, 0x37, 0x38, 0xe3, 0x1e, 0xa7, 0x88, 0xac, 0xb0, + 0xae, 0xec, 0x28, 0x61, 0xa6, 0x22, 0xab, 0xe2, 0x50, 0x6d, 0x5d, 0xad, + 0x6e, 0x6a, 0x31, 0xa6, 0x5a, 0x08, 0x8a, 0xd0, 0x3a, 0x8b, 0xd0, 0xc4, + 0x73, 0x13, 0x91, 0x10, 0xc4, 0xb9, 0x67, 0x7f, 0x9d, 0x8d, 0x40, 0x20, + 0x86, 0x72, 0x7d, 0xd4, 0x65, 0xdd, 0x97, 0xe3, 0xd7, 0xd3, 0x4d, 0xb2, + 0x79, 0xc4, 0xdd, 0xd0, 0x49, 0xdd, 0xac, 0x92, 0x16, 0x04, 0x1a, 0x34, + 0xd4, 0x9e, 0x9c, 0xa2, 0xa7, 0xab, 0x1e, 0xfe, 0x3c, 0x32, 0x2f, 0xdf, + 0x28, 0xf4, 0xc5, 0xd9, 0x84, 0x44, 0xb7, 0xda, 0xe9, 0x02, 0x67, 0x60, + 0x6a, 0x03, 0xb5, 0xe9, 0x4b, 0x12, 0x76, 0xca, 0x25, 0x27, 0xa7, 0xe9, + 0x1c, 0xe8, 0x48, 0x40, 0xf3, 0x25, 0x36, 0x9a, 0x56, 0xce, 0x02, 0x5d, + 0xb9, 0xa7, 0x42, 0x9c, 0x33, 0x90, 0x70, 0x87, 0x0e, 0xe7, 0xcb, 0xd6, + 0x56, 0x8a, 0x21, 0xc5, 0x34, 0x1b, 0xf5, 0x48, 0x26, 0xea, 0xc8, 0xe9, + 0xb0, 0xbd, 0xc5, 0x0d, 0x37, 0xd8, 0xe8, 0xb7, 0xf5, 0x6b, 0xbf, 0xf5, + 0xfb, 0xed, 0x83, 0xb1, 0xd8, 0x72, 0x3b, 0xd7, 0xbf, 0x25, 0xa5, 0xf9, + 0x63, 0xe0, 0xd6, 0x81, 0x5c, 0x84, 0xdb, 0x56, 0x4b, 0xf7, 0xef, 0x0f, + 0x9d, 0xee, 0x5e, 0x27, 0xc5, 0xf8, 0x7a, 0xdf, 0xc0, 0x5d, 0x93, 0x11, + 0xe8, 0x7d, 0x02, 0xf1, 0x55, 0x8c, 0xe6, 0xd9, 0x60, 0x64, 0x69, 0x35, + 0x78, 0x94, 0x36, 0x25, 0x1b, 0xbc, 0xaa, 0x1d, 0xb6, 0x1c, 0xa5, 0xee, + 0xe6, 0x04, 0x51, 0xfa, 0x08, 0xb8, 0xcb, 0x92, 0x35, 0x72, 0xf5, 0x3e, + 0x0b, 0xee, 0xfe, 0x70, 0xe9, 0x83, 0x25, 0x66, 0x25, 0x56, 0x6f, 0x47, + 0xb0, 0x81, 0x7a, 0x44, 0x44, 0xf5, 0xaa, 0xec, 0x7e, 0x7e, 0x19, 0x0c, + 0xa1, 0xf3, 0x5d, 0xa9, 0x3b, 0x13, 0x8f, 0x6a, 0x2d, 0xa7, 0x93, 0x59, + 0xaa, 0x53, 0x7b, 0x8c, 0x8c, 0xee, 0xe4, 0x58, 0x67, 0x86, 0xe5, 0xc7, + 0x39, 0x95, 0x87, 0xf8, 0x80, 0x91, 0x64, 0xbb, 0x1c, 0x01, 0xfd, 0x96, + 0xe5, 0xd2, 0x98, 0xea, 0x83, 0xdc, 0x46, 0x15, 0x5a, 0x29, 0x05, 0xc7, + 0x1b, 0x20, 0x9d, 0x91, 0x45, 0x9f, 0x94, 0x88, 0xd8, 0x9c, 0x15, 0x9e, + 0x1a, 0x28, 0x98, 0xa5, 0x05, 0xcc, 0x59, 0x19, 0xef, 0x2c, 0x26, 0xe4, + 0x4e, 0xee, 0xe9, 0xb8, 0x4f, 0xa6, 0xc2, 0xcc, 0xce, 0x9f, 0x2b, 0x61, + 0x2b, 0xfd, 0xfd, 0xd1, 0xb6, 0xec, 0xa4, 0x1d, 0x5a, 0x03, 0xf8, 0xaa, + 0x26, 0x39, 0x63, 0x77, 0xb3, 0x92, 0xd3, 0xea, 0xcc, 0x51, 0x00, 0x83, + 0x7f, 0xda, 0x90, 0x98, 0x99, 0x47, 0xc6, 0x2d, 0xff, 0xb1, 0xbe, 0x6c, + 0x53, 0xb5, 0x54, 0x7c, 0xa3, 0x39, 0xac, 0xdf, 0x59, 0x8d, 0x68, 0xec, + 0x3a, 0xd9, 0x35, 0x3c, 0xb5, 0x16, 0x41, 0x1a, 0xb4, 0x71, 0x98, 0xee, + 0xdc, 0x78, 0xd3, 0xc8, 0xc1, 0x96, 0x59, 0x63, 0x81, 0xb5, 0x86, 0x4f, + 0xa8, 0x49, 0x6b, 0xc6, 0x06, 0x71, 0x16, 0x1b, 0x56, 0xaa, 0x82, 0xdb, + 0x60, 0xcf, 0x14, 0x9c, 0x6a, 0xca, 0x33, 0x1a, 0xfc, 0x8b, 0xb5, 0xa1, + 0xed, 0x7a, 0x76, 0xfb, 0x46, 0x83, 0x3a, 0x99, 0x83, 0x22, 0xe6, 0x33, + 0xe5, 0x3e, 0x4c, 0xbf, 0x5b, 0x24, 0x58, 0x67, 0xd7, 0x35, 0xc5, 0x65, + 0x16, 0xc5, 0xca, 0x33, 0x95, 0xab, 0x47, 0xec, 0xda, 0x02, 0xec, 0x5f, + 0xf6, 0x34, 0xf9, 0x36, 0xf2, 0x96, 0xa9, 0x47, 0xe1, 0x9c, 0x9f, 0xea, + 0xde, 0x0c, 0xc7, 0x37, 0x71, 0x6a, 0x9c, 0x33, 0x2a, 0x16, 0x14, 0xd8, + 0x6f, 0x72, 0xde, 0x2a, 0x0d, 0x7a, 0x21, 0xeb, 0x85, 0xd1, 0xd4, 0x4b, + 0x52, 0xb3, 0xcc, 0x3a, 0x73, 0x2e, 0x42, 0xcd, 0x8e, 0xc0, 0x87, 0xe6, + 0x8e, 0x18, 0x0d, 0x84, 0x55, 0xc8, 0x0c, 0x3d, 0x0a, 0x12, 0xe6, 0x0e, + 0xa7, 0xd9, 0x10, 0xb7, 0x6d, 0x98, 0xd5, 0x3a, 0x15, 0xc3, 0xf1, 0xbc, + 0x5b, 0xfb, 0x83, 0x62, 0x82, 0xe1, 0x28, 0x82, 0xed, 0xc2, 0x63, 0xa0, + 0x10, 0xac, 0xbd, 0x8a, 0xfb, 0xc6, 0x02, 0x96, 0xb7, 0x10, 0x86, 0x7d, + 0x18, 0x96, 0x18, 0xbb, 0xde, 0xe3, 0x62, 0xca, 0xa7, 0xdd, 0x7b, 0xae, + 0xf4, 0x0e, 0x35, 0xab, 0xf2, 0xfe, 0x86, 0xf7, 0xf7, 0x37, 0x28, 0xaa, + 0xf2, 0xf9, 0xde, 0xbf, 0x0c, 0xc3, 0x1a, 0x86, 0x85, 0x41, 0xcc, 0x48, + 0x28, 0x4b, 0x6f, 0x88, 0x0f, 0x93, 0x1f, 0x29, 0xc4, 0x20, 0x50, 0xb3, + 0x2e, 0x9c, 0x17, 0x40, 0xf0, 0x25, 0x2d, 0x93, 0xe0, 0xc4, 0x0d, 0x16, + 0xc3, 0x36, 0xcc, 0x2a, 0x7c, 0x77, 0x19, 0x89, 0x18, 0x3a, 0x6b, 0x59, + 0x9d, 0x61, 0xab, 0xb9, 0xb0, 0x85, 0x35, 0xc2, 0x10, 0x16, 0x30, 0xf9, + 0xd6, 0xc0, 0x4e, 0xcc, 0x47, 0x46, 0x8e, 0x4f, 0x08, 0xc2, 0x96, 0x41, + 0x5a, 0x7d, 0x32, 0xd1, 0x3d, 0xf4, 0x7b, 0x4d, 0x92, 0xf4, 0x60, 0x40, + 0x8c, 0xc5, 0x49, 0xd2, 0x84, 0xf1, 0xf2, 0x63, 0x75, 0x76, 0x40, 0x85, + 0xc6, 0x1b, 0xce, 0xfe, 0x32, 0x07, 0xe9, 0x87, 0x66, 0xa5, 0xfc, 0xf8, + 0x79, 0xce, 0x6e, 0x87, 0x97, 0xdf, 0x99, 0x46, 0xb5, 0x31, 0xe6, 0x2d, + 0x5e, 0xd0, 0xc7, 0x52, 0x4a, 0xea, 0x9a, 0xbb, 0x27, 0x0e, 0xc5, 0x5a, + 0xe7, 0xd2, 0x9c, 0xf7, 0xc2, 0xf0, 0x7e, 0x8a, 0xba, 0xf0, 0x62, 0xc8, + 0xd8, 0xcf, 0xe1, 0xab, 0x8c, 0xbc, 0xec, 0xdd, 0xfb, 0x20, 0xdd, 0xc4, + 0x1b, 0xe1, 0xa2, 0xfb, 0xf2, 0x97, 0x0b, 0x7d, 0x2f, 0x75, 0x16, 0x0e, + 0xc6, 0xf3, 0x6d, 0x33, 0x57, 0x4d, 0x0a, 0x28, 0x0f, 0x10, 0x7e, 0xb0, + 0x4d, 0x4b, 0xe6, 0x2e, 0x40, 0xfd, 0xdc, 0xd8, 0x98, 0xd3, 0x7d, 0x39, + 0xe0, 0x39, 0xc6, 0x2f, 0x3b, 0xec, 0xcf, 0x73, 0x9c, 0x71, 0xb2, 0x82, + 0xcd, 0xef, 0xe7, 0x2d, 0x17, 0xed, 0x0c, 0x95, 0x87, 0x6c, 0xe9, 0x2d, + 0x38, 0x1b, 0xcb, 0x53, 0x6e, 0x4f, 0x61, 0x4d, 0xbc, 0x26, 0xd1, 0x74, + 0x7c, 0x70, 0xc0, 0xe7, 0xf8, 0xae, 0x44, 0x77, 0x2d, 0xe3, 0x58, 0xbd, + 0x67, 0x99, 0x86, 0x95, 0x42, 0xdd, 0x7c, 0x4b, 0x89, 0xe5, 0xb0, 0x70, + 0x1a, 0x43, 0xa2, 0x7b, 0x6e, 0xbb, 0xe3, 0xbc, 0x32, 0x57, 0x0c, 0xc8, + 0x6f, 0x75, 0xec, 0x53, 0xc6, 0x3c, 0x09, 0x52, 0x56, 0x0e, 0x4b, 0x70, + 0x49, 0x2c, 0xb8, 0xf1, 0x0c, 0x1e, 0xcc, 0x51, 0x5e, 0x75, 0xb3, 0x46, + 0xd6, 0xb2, 0x77, 0xe2, 0x2d, 0x5f, 0x3a, 0x3b, 0xb2, 0xd7, 0xc3, 0x99, + 0x85, 0x47, 0xca, 0x99, 0x00, 0x02, 0xf5, 0x1d, 0x04, 0x3f, 0xef, 0x64, + 0xc1, 0x12, 0xd8, 0xc3, 0x58, 0x71, 0x66, 0x0c, 0x53, 0xc9, 0x2b, 0x71, + 0x7e, 0x93, 0x7a, 0xe6, 0x38, 0xd1, 0xa0, 0x13, 0x15, 0x74, 0xa6, 0xbb, + 0x6b, 0x8a, 0x56, 0x7b, 0x3d, 0x4a, 0x66, 0x88, 0x2d, 0x87, 0xfe, 0x1c, + 0x4d, 0xdf, 0xd0, 0xdc, 0xf7, 0x59, 0xbb, 0x87, 0xaf, 0x53, 0x2e, 0x7a, + 0x72, 0x19, 0x3c, 0x93, 0x49, 0x13, 0x98, 0x82, 0x9f, 0x9d, 0xc4, 0xc0, + 0x97, 0x52, 0x32, 0xd0, 0x2e, 0x7f, 0xda, 0x18, 0x99, 0x6a, 0xbd, 0xe9, + 0x28, 0xb2, 0x3c, 0x23, 0xad, 0x7d, 0x4a, 0x37, 0xfc, 0xd5, 0x9d, 0xc1, + 0x0e, 0xc9, 0x46, 0xc3, 0x84, 0xc9, 0x6c, 0x06, 0x0f, 0x51, 0x83, 0x3b, + 0x1d, 0xae, 0x90, 0x6c, 0x27, 0x71, 0xc8, 0xee, 0x4b, 0x8f, 0x70, 0x35, + 0x2b, 0xec, 0x9e, 0x91, 0xe2, 0x0f, 0x94, 0x24, 0x6b, 0x3a, 0x24, 0xe4, + 0x6d, 0x21, 0x65, 0x7b, 0xa7, 0xa2, 0xe0, 0x26, 0xa9, 0x64, 0xe9, 0xef, + 0x94, 0x88, 0x22, 0x47, 0x8b, 0x3f, 0x58, 0x7b, 0x23, 0x75, 0x5f, 0x87, + 0x03, 0x33, 0x7d, 0x94, 0x0d, 0x1a, 0x08, 0x55, 0x9a, 0x66, 0xc5, 0xb4, + 0x62, 0xba, 0x2c, 0x16, 0x3d, 0x8d, 0xa1, 0x83, 0x21, 0x12, 0xff, 0x69, + 0x16, 0x94, 0x6f, 0x65, 0x09, 0xfb, 0x45, 0xe1, 0xc9, 0xd6, 0x31, 0x93, + 0xc6, 0xf3, 0x6a, 0xde, 0x1e, 0x26, 0x50, 0x7e, 0xf8, 0x1d, 0x41, 0x66, + 0x22, 0x4c, 0x41, 0x4e, 0x39, 0x02, 0x70, 0xdc, 0x49, 0x1b, 0x3e, 0x78, + 0x93, 0xf9, 0xb7, 0x9e, 0xd9, 0xfd, 0x70, 0x93, 0xf4, 0x92, 0x34, 0xcf, + 0x2b, 0xac, 0xec, 0x50, 0x68, 0x56, 0xe6, 0x15, 0x76, 0x13, 0xce, 0xf5, + 0xe0, 0x9b, 0x93, 0xc7, 0x8e, 0x61, 0xdd, 0x4b, 0xfe, 0xef, 0xa5, 0x7a, + 0x67, 0x85, 0x28, 0xa4, 0x33, 0xcf, 0x4b, 0x9c, 0x6e, 0x40, 0xff, 0x55, + 0xa3, 0x57, 0xc7, 0x01, 0xe3, 0x45, 0xfc, 0x7c, 0x71, 0xb0, 0xba, 0x7a, + 0xf4, 0x45, 0x98, 0x73, 0x3d, 0x6f, 0x42, 0x05, 0x69, 0xf1, 0xb5, 0x7c, + 0xb8, 0xd7, 0x43, 0x16, 0xc1, 0x96, 0x4f, 0x29, 0xf9, 0xb0, 0x1a, 0xea, + 0x9e, 0xcf, 0x27, 0x99, 0x44, 0xdb, 0x17, 0x96, 0x5c, 0x0c, 0xd3, 0xbc, + 0x5a, 0xc8, 0x1d, 0x7e, 0x68, 0x98, 0x05, 0xbf, 0x8e, 0xac, 0x3e, 0x5a, + 0x7c, 0x30, 0x0a, 0x84, 0x0c, 0x8c, 0xa1, 0xed, 0x26, 0xf8, 0x07, 0x78, + 0x67, 0x73, 0x31, 0xf1, 0x70, 0x60, 0x22, 0xe0, 0xdb, 0x63, 0xc6, 0xbd, + 0xbd, 0xa2, 0xd8, 0x3e, 0x9c, 0x04, 0x38, 0x3d, 0x5b, 0x42, 0xa6, 0x77, + 0x82, 0xcb, 0x72, 0xd2, 0x59, 0x82, 0xc5, 0x56, 0x42, 0x4e, 0x5e, 0x95, + 0xcb, 0x22, 0xae, 0xec, 0x44, 0x57, 0xcb, 0x89, 0xa2, 0xb0, 0x69, 0x7b, + 0xd5, 0x6a, 0xfe, 0xc8, 0x8c, 0xf5, 0x0b, 0xbb, 0x5f, 0xc1, 0xd2, 0x81, + 0x7b, 0x20, 0x56, 0x14, 0x69, 0x27, 0x4c, 0xa5, 0xa8, 0x55, 0xf0, 0xd5, + 0x6b, 0xfe, 0x5e, 0x0d, 0x28, 0x27, 0x2b, 0xd1, 0x50, 0xc9, 0xa3, 0xbc, + 0xb1, 0xb6, 0xf8, 0x3e, 0x8f, 0x31, 0x91, 0x90, 0x2d, 0x2a, 0xc7, 0xa8, + 0x89, 0x12, 0x76, 0xbd, 0x34, 0x3c, 0x20, 0xca, 0xf7, 0x37, 0xc7, 0xf1, + 0x26, 0x9c, 0xd7, 0xa1, 0x2d, 0xc3, 0x96, 0x6a, 0xb3, 0xe8, 0xe5, 0x40, + 0x2b, 0x53, 0x24, 0x41, 0xd5, 0x82, 0x34, 0x32, 0x08, 0x06, 0xf1, 0xc1, + 0x3b, 0x83, 0x31, 0x94, 0x95, 0x16, 0x61, 0x98, 0x57, 0x2f, 0x5c, 0xfb, + 0xe3, 0x23, 0x7e, 0x5a, 0x5a, 0x36, 0xb8, 0xa1, 0x7b, 0x8c, 0x24, 0xfc, + 0x7e, 0xf3, 0x07, 0x31, 0xd5, 0x41, 0xec, 0x40, 0xd0, 0xf4, 0x88, 0x25, + 0xb4, 0x6c, 0xfe, 0xf7, 0x80, 0xc2, 0xfc, 0x69, 0x82, 0xf7, 0xfc, 0xa9, + 0x51, 0xaa, 0xce, 0xdc, 0x02, 0xc9, 0xed, 0xdc, 0xb9, 0x46, 0xa3, 0x6a, + 0xef, 0xf1, 0xf5, 0x11, 0xb1, 0x08, 0x9a, 0xd7, 0x72, 0xd5, 0x03, 0x39, + 0x33, 0xb3, 0x09, 0x91, 0x7d, 0xf2, 0x06, 0x06, 0xe9, 0xc5, 0xda, 0x99, + 0x84, 0x37, 0x04, 0xa8, 0x17, 0x0d, 0xac, 0x96, 0x81, 0xc4, 0xba, 0xbb, + 0x9b, 0x9e, 0xda, 0xa2, 0x07, 0xee, 0x93, 0x54, 0x85, 0x85, 0x98, 0xa8, + 0xd2, 0x31, 0x5d, 0x70, 0xe5, 0x9c, 0xf1, 0x29, 0x8a, 0x1b, 0x29, 0x57, + 0x2c, 0x7b, 0x03, 0x3e, 0x53, 0x98, 0x98, 0x30, 0x79, 0x0c, 0xaa, 0xcd, + 0xda, 0xf9, 0x57, 0x9c, 0x31, 0x66, 0x0a, 0xeb, 0xc7, 0x34, 0xcb, 0x77, + 0x8b, 0x56, 0xc6, 0xba, 0xa2, 0x91, 0x11, 0x49, 0xfc, 0x00, 0xcd, 0xa7, + 0x04, 0x9f, 0x3b, 0xa0, 0x93, 0x44, 0x7b, 0x74, 0x5f, 0x85, 0x74, 0xdc, + 0xec, 0x6d, 0xf0, 0xdb, 0xb1, 0xbe, 0x0b, 0xe1, 0x50, 0xd0, 0xcb, 0x22, + 0x95, 0x37, 0xbb, 0x80, 0x31, 0x73, 0xe1, 0x8f, 0x7b, 0x8f, 0xcb, 0x16, + 0x98, 0x5b, 0x07, 0xc7, 0xb8, 0x5f, 0x54, 0x66, 0xb0, 0xac, 0x24, 0x3a, + 0x2f, 0x7e, 0x4e, 0x77, 0xdd, 0x13, 0xd0, 0x96, 0x75, 0x0b, 0xd3, 0x77, + 0xe1, 0x4b, 0x3e, 0x9c, 0x4a, 0x13, 0x47, 0x95, 0xdc, 0x3e, 0x41, 0xf5, + 0xdf, 0xdf, 0xb7, 0xcc, 0xec, 0xc6, 0x97, 0x53, 0x10, 0x82, 0x33, 0xd0, + 0x49, 0xba, 0x59, 0x2d, 0x38, 0x7c, 0x5a, 0x07, 0xec, 0x20, 0x12, 0x0d, + 0x95, 0x87, 0xce, 0xed, 0x38, 0x67, 0x99, 0xee, 0x56, 0x98, 0xde, 0x4d, + 0xcf, 0x6f, 0x35, 0xed, 0xda, 0xc1, 0xd9, 0x1f, 0x61, 0x2c, 0x3f, 0xd1, + 0x62, 0x70, 0x93, 0x85, 0xb5, 0xed, 0x22, 0x95, 0x58, 0x22, 0x3f, 0xf6, + 0x7b, 0xd0, 0xcc, 0x05, 0xdb, 0x1a, 0x80, 0x90, 0x5a, 0x47, 0xa1, 0x08, + 0xd9, 0x2d, 0x4d, 0xfd, 0x93, 0x21, 0x0a, 0xc8, 0x7a, 0x5a, 0x31, 0x61, + 0x78, 0x0b, 0xfd, 0x46, 0x61, 0x36, 0x4e, 0x37, 0x98, 0xa4, 0xa9, 0x52, + 0x29, 0x96, 0x80, 0x91, 0x5f, 0x12, 0xd4, 0xd8, 0xf3, 0x13, 0x1d, 0xe7, + 0xd3, 0x8c, 0x80, 0xc4, 0x82, 0xd2, 0x24, 0x58, 0x0e, 0xf3, 0xbb, 0xb0, + 0x9f, 0xb2, 0xe6, 0x56, 0xca, 0x7c, 0xf3, 0xa2, 0x0a, 0x8f, 0x97, 0x33, + 0x6c, 0x9e, 0x73, 0x45, 0x3a, 0xb7, 0x1e, 0x05, 0x58, 0x39, 0xfd, 0x7b, + 0x7c, 0xe0, 0xde, 0x6c, 0x00, 0xad, 0x9a, 0x37, 0x35, 0x91, 0xf2, 0xab, + 0x4c, 0x2e, 0x2c, 0x9f, 0x5d, 0x44, 0x6c, 0x67, 0xe1, 0x43, 0xc2, 0x2f, + 0x35, 0x8f, 0x69, 0x7c, 0xe8, 0x9a, 0x36, 0xf7, 0x78, 0x0a, 0x9c, 0x8f, + 0x2f, 0x13, 0xd8, 0xea, 0x36, 0x96, 0xaa, 0xce, 0x8a, 0xde, 0xf4, 0x5c, + 0xe0, 0xcc, 0xa3, 0x19, 0x7f, 0x88, 0x63, 0x4c, 0x0e, 0x51, 0x9c, 0x73, + 0x15, 0xd4, 0x04, 0x5f, 0x02, 0x91, 0x6c, 0x64, 0x61, 0x77, 0xf8, 0xbb, + 0xb0, 0x6c, 0x8d, 0x88, 0x5f, 0xab, 0x4c, 0x5d, 0x44, 0x7a, 0xe1, 0x80, + 0x15, 0x3b, 0x2c, 0xb5, 0xf5, 0x27, 0x91, 0x17, 0x23, 0xee, 0x72, 0x2e, + 0xf5, 0xb9, 0xee, 0x23, 0x00, 0x85, 0x69, 0xdd, 0xd4, 0xdd, 0xea, 0x13, + 0x6c, 0x0e, 0x3c, 0x4b, 0x1d, 0xba, 0xc0, 0x42, 0x43, 0x15, 0x02, 0x44, + 0x8c, 0x47, 0x2e, 0x9c, 0x42, 0xb1, 0x3b, 0xf0, 0x9a, 0x9b, 0xab, 0x6d, + 0x21, 0xe2, 0x24, 0xeb, 0x30, 0xf1, 0xfe, 0x83, 0x3c, 0x19, 0xa7, 0x22, + 0x6d, 0x3f, 0xd1, 0x0e, 0x30, 0xc8, 0x23, 0xfe, 0x7c, 0xd6, 0x23, 0x50, + 0x5a, 0x76, 0xb3, 0x3e, 0x93, 0xfa, 0x31, 0xee, 0x01, 0x1f, 0x67, 0x25, + 0x15, 0xbb, 0x65, 0xce, 0x64, 0x96, 0x86, 0x90, 0xb5, 0x51, 0x3e, 0x75, + 0xf8, 0xc9, 0x95, 0x02, 0xa6, 0xc3, 0xec, 0x75, 0x0c, 0xd3, 0xb6, 0x39, + 0x59, 0x10, 0xca, 0x76, 0x68, 0x56, 0x18, 0x0c, 0x74, 0x2f, 0x8e, 0x36, + 0x42, 0x58, 0xa8, 0xbd, 0x80, 0x22, 0xb8, 0xb1, 0xe5, 0xee, 0xae, 0x48, + 0xec, 0x71, 0x85, 0x31, 0xc6, 0xe1, 0x8a, 0x5a, 0x56, 0xb6, 0xfb, 0xa4, + 0xe8, 0xdd, 0x6a, 0x0f, 0x49, 0x18, 0xb5, 0x50, 0x73, 0xf3, 0x8f, 0x34, + 0x5d, 0xf3, 0x20, 0x3d, 0x51, 0xd5, 0x90, 0x95, 0xfb, 0x6c, 0x23, 0xb9, + 0xc8, 0xb7, 0xcd, 0x05, 0x91, 0x7b, 0xb4, 0x2b, 0x97, 0x2c, 0x72, 0xfd, + 0xd0, 0x8c, 0x2d, 0xff, 0x12, 0xa4, 0xb4, 0x8a, 0x31, 0x92, 0x8f, 0x4f, + 0x2a, 0x83, 0x9c, 0x3c, 0x40, 0xed, 0x78, 0x1b, 0x69, 0xdd, 0x9c, 0x0a, + 0x5b, 0x1f, 0x7e, 0x5e, 0x77, 0x50, 0xb2, 0x26, 0x75, 0xb5, 0xb7, 0xed, + 0xbd, 0x33, 0xd4, 0x6f, 0xaf, 0x03, 0xb1, 0xc8, 0x6d, 0x52, 0xf6, 0x55, + 0x6f, 0x7d, 0x47, 0x67, 0xbf, 0x11, 0xe6, 0x8d, 0x18, 0x57, 0x65, 0x9e, + 0xf1, 0xa5, 0xef, 0x09, 0x53, 0x0d, 0xbf, 0xa1, 0x37, 0x48, 0xc0, 0xb6, + 0x1c, 0x32, 0xf9, 0x41, 0x12, 0x80, 0x52, 0xd3, 0x58, 0x00, 0x4f, 0xce, + 0xa3, 0x8c, 0xb8, 0x41, 0xd2, 0x1c, 0xb5, 0x6f, 0xbe, 0x5e, 0x3f, 0x41, + 0x43, 0xac, 0x26, 0x90, 0x54, 0xe4, 0x6e, 0xec, 0x99, 0x70, 0xbb, 0x51, + 0x89, 0x93, 0x72, 0xee, 0xde, 0x69, 0xf2, 0xc2, 0x22, 0x30, 0x7c, 0xc5, + 0xc3, 0x04, 0x2d, 0xec, 0x8b, 0x5d, 0x1f, 0x03, 0x48, 0xc8, 0x9b, 0x85, + 0x87, 0x41, 0x1e, 0x31, 0xbb, 0x6e, 0xd7, 0x3c, 0xe2, 0x1b, 0x6c, 0x35, + 0xda, 0x44, 0x78, 0x71, 0x97, 0x87, 0xfc, 0x8b, 0x6f, 0x1c, 0x2f, 0xab, + 0x68, 0x78, 0x56, 0xa5, 0xa5, 0x24, 0xa3, 0x89, 0xfa, 0xb8, 0xd6, 0x9b, + 0x16, 0x7e, 0x9d, 0x4a, 0x28, 0x29, 0x66, 0x71, 0x65, 0x61, 0x1f, 0x92, + 0xfd, 0xae, 0xb6, 0x83, 0x97, 0xe8, 0x4b, 0x74, 0x69, 0x80, 0x8e, 0x6f, + 0x82, 0x80, 0x7b, 0x2e, 0x2f, 0xde, 0x84, 0x7a, 0x8c, 0xf1, 0x90, 0xac, + 0x7f, 0x4c, 0xb2, 0x66, 0xa1, 0xd6, 0x17, 0xc0, 0xbf, 0xbb, 0x63, 0x93, + 0x37, 0xd4, 0x50, 0x9a, 0x55, 0x0f, 0xf6, 0xb9, 0xd8, 0x5f, 0x8c, 0x2f, + 0x97, 0xaf, 0xbd, 0xb1, 0xf8, 0x44, 0x19, 0x77, 0xab, 0x6c, 0xa4, 0x58, + 0xd4, 0xa9, 0x2c, 0x28, 0xcb, 0x85, 0xc4, 0x3f, 0x6e, 0xe7, 0xb3, 0xe3, + 0xd8, 0x1c, 0x93, 0x89, 0xbb, 0xeb, 0x5b, 0x2c, 0xd2, 0x37, 0xac, 0x8c, + 0x3d, 0x76, 0x5f, 0x04, 0x24, 0x2e, 0xb2, 0x31, 0x7e, 0x68, 0x69, 0x82, + 0x3c, 0x85, 0xbf, 0x45, 0x49, 0x28, 0x22, 0x8f, 0x91, 0xfc, 0x33, 0x41, + 0x5d, 0xfe, 0xd1, 0x23, 0x4f, 0xf2, 0x8c, 0xf7, 0xf9, 0xab, 0x71, 0xbb, + 0x62, 0x7e, 0x4d, 0xdb, 0x06, 0xd4, 0xff, 0xd8, 0x41, 0xcd, 0x44, 0x0e, + 0xa2, 0x59, 0x0f, 0xc6, 0x0d, 0x24, 0xed, 0xe3, 0x81, 0xf9, 0xf4, 0xee, + 0xb9, 0x7e, 0xae, 0x72, 0xf8, 0xed, 0x1b, 0x44, 0xf4, 0x64, 0x2e, 0xba, + 0x9c, 0xe9, 0x76, 0x15, 0x81, 0x30, 0xa5, 0xf3, 0x99, 0x2f, 0x88, 0xca, + 0xd9, 0x65, 0xa0, 0x0d, 0x32, 0x1e, 0xb4, 0xaf, 0x4b, 0xe0, 0xa9, 0xee, + 0xe3, 0xf3, 0x47, 0x9b, 0xee, 0x99, 0x96, 0x99, 0xae, 0x09, 0x40, 0xd0, + 0xd5, 0xc8, 0xac, 0x17, 0xaa, 0xa8, 0xfb, 0x82, 0x01, 0x5d, 0x57, 0x2c, + 0x60, 0x66, 0xd3, 0xce, 0x30, 0x82, 0x8e, 0xf8, 0x04, 0xe8, 0xf5, 0x0f, + 0xe6, 0x8e, 0xd7, 0x0b, 0x42, 0xaa, 0x33, 0xfb, 0xed, 0x57, 0x00, 0x26, + 0x2d, 0xfe, 0x26, 0x21, 0xd3, 0x5c, 0xbb, 0x1a, 0x0a, 0x1e, 0xe3, 0xb7, + 0xd9, 0x8f, 0x06, 0x0c, 0x73, 0xd4, 0xf8, 0x3e, 0x59, 0x98, 0x1e, 0xc2, + 0xe0, 0xdd, 0x0e, 0x95, 0xe3, 0x9a, 0x2b, 0x38, 0xaa, 0x51, 0xc9, 0x0a, + 0x30, 0xcc, 0x6a, 0x85, 0x3d, 0x7a, 0x93, 0x91, 0xde, 0xd7, 0xdf, 0xc5, + 0x5d, 0x35, 0x9b, 0x3e, 0x97, 0x9b, 0x39, 0x9e, 0x04, 0x4f, 0xb1, 0x56, + 0x2a, 0x26, 0x43, 0xfc, 0xce, 0x62, 0xfe, 0x19, 0x09, 0x5f, 0xe8, 0xb8, + 0xd4, 0x92, 0x28, 0x46, 0x96, 0x7d, 0xfa, 0x7f, 0x38, 0x3a, 0x8f, 0xe5, + 0x46, 0x81, 0x00, 0x88, 0x7e, 0x10, 0x07, 0x72, 0x3a, 0x92, 0x33, 0x88, + 0x28, 0xd0, 0x8d, 0x9c, 0x73, 0xe6, 0xeb, 0x17, 0xef, 0xde, 0xd6, 0x25, + 0x97, 0xad, 0x09, 0xdd, 0xef, 0x19, 0xc4, 0xa4, 0x63, 0x07, 0x01, 0x19, + 0x07, 0xcd, 0x90, 0x89, 0x13, 0xfc, 0x9a, 0x55, 0x3e, 0xfe, 0x03, 0x01, + 0xed, 0x6d, 0x56, 0x99, 0xdb, 0x50, 0x6c, 0x1d, 0x7d, 0x46, 0x3d, 0x3b, + 0x8f, 0x9a, 0xa8, 0x5f, 0x85, 0x70, 0x7f, 0x17, 0xce, 0x95, 0x9e, 0xaf, + 0x22, 0x40, 0xea, 0xf0, 0x77, 0xdb, 0xb3, 0x9c, 0x82, 0xa8, 0x26, 0x62, + 0x81, 0xc6, 0xc7, 0x3d, 0x41, 0x3b, 0x74, 0x46, 0xce, 0xc1, 0x8b, 0x44, + 0x63, 0x91, 0xa2, 0xed, 0x98, 0x9b, 0x9b, 0x4e, 0xd0, 0x6c, 0x96, 0xce, + 0x73, 0x2a, 0x45, 0x17, 0x4e, 0x5d, 0x82, 0x1b, 0x66, 0xb1, 0xb0, 0xe5, + 0xa9, 0x02, 0xfc, 0xd5, 0x4e, 0x44, 0x5d, 0x28, 0x14, 0x12, 0x47, 0x08, + 0xa6, 0x7a, 0x9b, 0x25, 0x67, 0xba, 0x54, 0x47, 0x94, 0x28, 0x8d, 0x7a, + 0x28, 0x69, 0xbb, 0x9e, 0x6c, 0x95, 0x40, 0xc2, 0xc7, 0x74, 0xa3, 0xe9, + 0x47, 0xcf, 0xda, 0xaf, 0xca, 0x3e, 0xad, 0x5b, 0x4a, 0x28, 0xdc, 0xcc, + 0x93, 0xf9, 0xc9, 0x74, 0x93, 0x46, 0xd0, 0xf2, 0xdb, 0x93, 0x47, 0x10, + 0x19, 0xd3, 0xca, 0xa2, 0x4d, 0x1e, 0xbc, 0x88, 0xf1, 0x9d, 0xc2, 0x94, + 0xe5, 0x75, 0x2d, 0xd2, 0x4e, 0xa5, 0xde, 0x0e, 0x48, 0xd0, 0x2b, 0x88, + 0xe5, 0x6b, 0x1d, 0xe8, 0xa6, 0x88, 0x7b, 0x3b, 0x5e, 0x87, 0x90, 0xe4, + 0x99, 0xb8, 0x12, 0xcd, 0xe9, 0xce, 0xdd, 0xe2, 0xe3, 0x8d, 0xfc, 0x44, + 0xfd, 0xaa, 0x42, 0x7c, 0x2d, 0x2d, 0x21, 0xb5, 0xd9, 0xac, 0xbb, 0x89, + 0xf4, 0x83, 0x33, 0x01, 0xc8, 0x65, 0xb2, 0x8b, 0x71, 0x43, 0xaa, 0x49, + 0x5e, 0xb0, 0xe9, 0xb2, 0xf7, 0x0c, 0xc5, 0xf5, 0x91, 0x79, 0x75, 0x24, + 0xf7, 0x97, 0xac, 0x57, 0x59, 0xd6, 0xd7, 0x14, 0x14, 0x0f, 0xee, 0x36, + 0x42, 0xf5, 0xf1, 0x14, 0xa5, 0x95, 0x23, 0x33, 0x37, 0x58, 0x6a, 0x32, + 0xf3, 0x83, 0xfc, 0x18, 0x39, 0x7b, 0xf0, 0x00, 0x03, 0x3e, 0x20, 0xe1, + 0x83, 0x09, 0x09, 0xa0, 0x46, 0xf7, 0x10, 0x7c, 0x0b, 0x3e, 0xcf, 0xf0, + 0x90, 0xa3, 0x90, 0xda, 0x75, 0x2e, 0x3a, 0x64, 0x14, 0x34, 0x7d, 0xc0, + 0xb5, 0x1a, 0x1c, 0x36, 0x3a, 0x0a, 0x6f, 0xa0, 0x54, 0x6e, 0x9c, 0xa6, + 0x62, 0x08, 0x3e, 0x03, 0x38, 0x91, 0xbf, 0x3b, 0x85, 0xde, 0xbf, 0x7a, + 0x45, 0xef, 0x25, 0xc2, 0x29, 0xbc, 0x6e, 0x35, 0x90, 0x7d, 0xa7, 0xe5, + 0xc0, 0xb4, 0xe0, 0xdd, 0x97, 0xb4, 0x55, 0xe5, 0x74, 0x1a, 0xd7, 0x0f, + 0x1e, 0xf6, 0xc4, 0xcb, 0x13, 0x84, 0x4b, 0x3b, 0x81, 0xfa, 0xf7, 0x48, + 0x58, 0x64, 0x9b, 0x40, 0x12, 0x01, 0xc3, 0x05, 0x00, 0x73, 0xe3, 0xfe, + 0x32, 0xbf, 0x9b, 0x6e, 0x1e, 0xa1, 0xd2, 0x0a, 0x6b, 0x4d, 0x6e, 0x4d, + 0x56, 0x38, 0x9b, 0xad, 0x6b, 0x91, 0x8d, 0x38, 0x4f, 0xf9, 0x99, 0x56, + 0x8e, 0xd6, 0xfb, 0x6f, 0xdb, 0x6e, 0x68, 0xde, 0x9c, 0x52, 0xc4, 0x6c, + 0x43, 0xeb, 0x8f, 0x3b, 0xcb, 0xd0, 0x63, 0xc0, 0xe7, 0x97, 0x03, 0xc1, + 0xef, 0x60, 0xd2, 0x67, 0xdc, 0x0f, 0xa2, 0xba, 0xec, 0xc9, 0x07, 0xa3, + 0xfd, 0xd5, 0x98, 0x57, 0xae, 0x0b, 0x82, 0xb9, 0x26, 0x16, 0xb0, 0x33, + 0x12, 0xe9, 0x1d, 0x31, 0xe7, 0xf8, 0x8e, 0x40, 0x93, 0x34, 0x1f, 0x22, + 0x1a, 0x56, 0xcc, 0xc5, 0xeb, 0xbd, 0x2f, 0x8b, 0xbc, 0x7c, 0xcb, 0x63, + 0x21, 0xc2, 0x62, 0xdc, 0xe3, 0xcb, 0x10, 0x30, 0xd7, 0xf9, 0x35, 0x83, + 0xba, 0xe4, 0x31, 0x2b, 0xf8, 0x6b, 0x39, 0x4a, 0x40, 0x30, 0x02, 0x62, + 0x8f, 0x55, 0x0b, 0x48, 0x54, 0xd5, 0x3c, 0x1d, 0xd9, 0xd7, 0x89, 0xf6, + 0x29, 0xe0, 0x13, 0x66, 0x73, 0xe4, 0xb9, 0xa5, 0x69, 0xc7, 0x58, 0x40, + 0x7f, 0xa4, 0xd9, 0x0d, 0x7b, 0x52, 0x49, 0xea, 0xbf, 0x1c, 0xf3, 0x6b, + 0xfc, 0x3a, 0x0f, 0x89, 0x62, 0x78, 0xfa, 0x90, 0x42, 0x97, 0xdc, 0x4c, + 0x28, 0x13, 0xcd, 0x50, 0x40, 0xce, 0xa1, 0xdc, 0xea, 0x19, 0xf4, 0xd4, + 0x87, 0xba, 0x50, 0xe2, 0x10, 0xcd, 0x92, 0x3d, 0x19, 0xd2, 0x75, 0xcb, + 0x88, 0x1e, 0x29, 0xe5, 0xfd, 0xe3, 0x82, 0xd9, 0xdf, 0xf1, 0x3e, 0x49, + 0x4b, 0xa3, 0x78, 0x6c, 0xf3, 0x22, 0xb0, 0xbf, 0x98, 0x46, 0xa3, 0x0f, + 0x5f, 0x00, 0xa4, 0x00, 0x42, 0x9b, 0x0f, 0xc2, 0x53, 0x42, 0xfe, 0x68, + 0xb0, 0x82, 0xc1, 0x05, 0x65, 0x68, 0xf3, 0x7e, 0x21, 0x80, 0xa4, 0xdd, + 0x88, 0x26, 0xd0, 0xd6, 0x2a, 0xc2, 0x16, 0x71, 0x08, 0xd4, 0x2e, 0x6d, + 0x0d, 0xcc, 0xcd, 0x9d, 0x4b, 0xbb, 0x43, 0xcf, 0x27, 0xd7, 0x6a, 0xc2, + 0x85, 0x98, 0xeb, 0x8e, 0x8d, 0x57, 0x2f, 0x31, 0x0e, 0xbd, 0x9c, 0x76, + 0x84, 0xfb, 0x7b, 0x94, 0x85, 0xe5, 0x4e, 0xa6, 0xe5, 0x31, 0xb7, 0x06, + 0x6e, 0x0c, 0x12, 0x17, 0x9b, 0xe6, 0x18, 0x1b, 0x65, 0xb3, 0x9f, 0x6f, + 0x8c, 0xde, 0x5b, 0x53, 0x83, 0x1a, 0xee, 0x43, 0x08, 0x5c, 0x8e, 0x7c, + 0x4b, 0xb9, 0x69, 0x38, 0x2e, 0x65, 0xc3, 0x1d, 0x51, 0x58, 0xfe, 0x7e, + 0xae, 0xfb, 0xc4, 0xd1, 0xd7, 0x22, 0x28, 0xf5, 0x8b, 0x32, 0xa3, 0xb6, + 0xc0, 0xc9, 0xbc, 0xaa, 0xb1, 0xa3, 0xfe, 0x7a, 0xcf, 0x55, 0x5f, 0xa4, + 0xdc, 0xe1, 0x9d, 0xcb, 0x7c, 0x53, 0x36, 0x11, 0x99, 0xf2, 0x74, 0xda, + 0xa7, 0xa4, 0x78, 0x4b, 0xed, 0x39, 0x46, 0x16, 0xa4, 0xf6, 0x9c, 0xba, + 0x7d, 0xdd, 0x4c, 0x25, 0x94, 0x08, 0xd6, 0x18, 0xac, 0x55, 0x5b, 0xf0, + 0x30, 0x8e, 0x30, 0x58, 0x89, 0xf1, 0x32, 0x0a, 0xc3, 0x65, 0x54, 0x75, + 0x28, 0xd9, 0x87, 0xdf, 0x5f, 0xae, 0x52, 0xdc, 0x7e, 0x3b, 0x30, 0x5f, + 0x56, 0x96, 0x6f, 0x82, 0xec, 0xa0, 0x7b, 0xd8, 0xf8, 0x39, 0x2a, 0x5c, + 0x7d, 0x19, 0xf3, 0xe4, 0x38, 0x72, 0xfe, 0x26, 0xf4, 0xb7, 0xa4, 0x8d, + 0xf9, 0xd5, 0xbc, 0x63, 0x65, 0x98, 0xdc, 0xc6, 0xb9, 0x6d, 0x38, 0x53, + 0x64, 0x30, 0x19, 0xbd, 0x66, 0x02, 0x15, 0x56, 0xa2, 0x23, 0x67, 0x77, + 0x14, 0xa4, 0xad, 0x28, 0x42, 0x17, 0x57, 0xdc, 0x4b, 0x59, 0xf2, 0x58, + 0x77, 0xca, 0x36, 0x7c, 0xab, 0x59, 0x15, 0xff, 0xb0, 0xe9, 0x6d, 0x15, + 0xa2, 0x73, 0x5b, 0x91, 0x4e, 0x98, 0x75, 0x05, 0x89, 0xec, 0x1c, 0x32, + 0x56, 0xe1, 0xc1, 0xe1, 0x50, 0x5d, 0x0e, 0xd6, 0xc1, 0xf0, 0x77, 0x8a, + 0x94, 0x3d, 0xf1, 0xd3, 0x41, 0x30, 0xf0, 0x99, 0xa0, 0x13, 0xf9, 0x1b, + 0xdd, 0xf5, 0xf2, 0x7a, 0xee, 0xc7, 0x91, 0x82, 0xd0, 0xfe, 0x7e, 0x97, + 0xee, 0x6b, 0x95, 0x06, 0xae, 0x4f, 0x85, 0x40, 0xba, 0xe3, 0x2f, 0x7a, + 0x7e, 0x6b, 0x6c, 0x64, 0xec, 0xfc, 0x77, 0x53, 0xea, 0x53, 0x5e, 0x58, + 0x89, 0xd1, 0xf2, 0xd8, 0xa6, 0x49, 0x74, 0x82, 0xb0, 0xf0, 0x0d, 0x65, + 0xf3, 0x34, 0x6d, 0x61, 0x57, 0xc5, 0xaf, 0x20, 0x60, 0x92, 0x45, 0x31, + 0xfb, 0x4b, 0x40, 0x30, 0x72, 0x3d, 0x49, 0xca, 0x37, 0xed, 0xb9, 0xdd, + 0xc4, 0x40, 0xb3, 0xc3, 0x17, 0x7f, 0x10, 0x9e, 0x6e, 0x5e, 0x0d, 0x4f, + 0x15, 0xc4, 0x4c, 0x1c, 0x4a, 0x1c, 0x19, 0x2b, 0x2b, 0xa6, 0xdd, 0x40, + 0x0a, 0x90, 0x07, 0x87, 0x7c, 0xc7, 0x0d, 0xbf, 0xe7, 0xae, 0x84, 0x9a, + 0xa0, 0x64, 0xba, 0xa5, 0x2f, 0x37, 0x34, 0x8f, 0x5c, 0x13, 0xd7, 0x34, + 0xa7, 0x1f, 0x86, 0x07, 0x79, 0xce, 0x4b, 0x91, 0xb9, 0x16, 0x25, 0x53, + 0x73, 0xc0, 0xab, 0x1c, 0x9c, 0x38, 0x1e, 0x96, 0x18, 0xf7, 0x2e, 0x33, + 0x31, 0x04, 0x1f, 0x58, 0x8c, 0x5a, 0xac, 0x49, 0xce, 0x99, 0xff, 0x4e, + 0xf5, 0xfd, 0xb6, 0xd9, 0x67, 0x49, 0x24, 0x54, 0xbd, 0x27, 0xb2, 0xfd, + 0xba, 0xf6, 0xd3, 0x22, 0x59, 0xda, 0xe6, 0x26, 0xdf, 0x5a, 0x67, 0xf3, + 0xe7, 0xb4, 0xb7, 0x72, 0x47, 0x9b, 0xd5, 0x03, 0x18, 0x58, 0xc4, 0x29, + 0x14, 0x8e, 0xbd, 0x0f, 0x3d, 0x99, 0x57, 0x36, 0x60, 0x1b, 0x3a, 0x72, + 0x1a, 0x32, 0x7e, 0x19, 0x7c, 0x36, 0x2f, 0x39, 0x61, 0xc7, 0x15, 0x66, + 0xdb, 0x13, 0xed, 0xfe, 0x4e, 0xa4, 0x9b, 0xaf, 0xb0, 0x2f, 0x53, 0x1e, + 0xd3, 0xe0, 0xce, 0x26, 0xc0, 0xd6, 0x15, 0x75, 0x22, 0x89, 0xc1, 0x8c, + 0xb0, 0x12, 0x40, 0x46, 0x70, 0x5b, 0x44, 0xc5, 0x01, 0x9c, 0x69, 0x58, + 0x1a, 0xed, 0x12, 0xaf, 0x82, 0x7e, 0x4d, 0xec, 0x6e, 0xf9, 0xaf, 0x01, + 0xea, 0x12, 0xe2, 0xc9, 0x11, 0xac, 0x7c, 0xc8, 0xeb, 0xeb, 0x12, 0x07, + 0x90, 0xfe, 0xe0, 0x45, 0xc5, 0x4c, 0x2f, 0x88, 0xb8, 0x88, 0x52, 0xdb, + 0x0c, 0x36, 0x09, 0x5b, 0xdd, 0xbe, 0xb0, 0x77, 0x0f, 0x86, 0xfc, 0x8b, + 0xbf, 0x36, 0x4d, 0x2c, 0x4e, 0x91, 0x3f, 0x17, 0xea, 0xe9, 0x92, 0x5a, + 0xcb, 0xd0, 0x05, 0x16, 0x9e, 0x3a, 0xce, 0x9f, 0x1e, 0xa3, 0xbc, 0xef, + 0x76, 0x8e, 0x7e, 0x85, 0x37, 0x51, 0xfa, 0xab, 0x9c, 0x4f, 0x6b, 0xba, + 0x6c, 0x1b, 0x27, 0x67, 0x4a, 0xe8, 0xbc, 0x8f, 0x9e, 0x4b, 0x10, 0xdf, + 0x9a, 0xf1, 0x10, 0xa7, 0x2a, 0x85, 0x29, 0x03, 0x80, 0x02, 0xd9, 0xf4, + 0x80, 0x46, 0x38, 0x1c, 0x03, 0x8e, 0x3f, 0x45, 0x51, 0xbb, 0x6f, 0x00, + 0x8f, 0xbb, 0x86, 0x1b, 0x3b, 0xff, 0xf0, 0x64, 0x32, 0xaa, 0xf8, 0xc8, + 0x88, 0xc6, 0xe7, 0x07, 0x4c, 0x05, 0xbe, 0xb8, 0x2b, 0x50, 0x7e, 0x44, + 0x3f, 0xee, 0xa4, 0xc4, 0xf9, 0xce, 0xb4, 0x32, 0xc9, 0x1e, 0x48, 0x69, + 0x3d, 0x2b, 0x57, 0xae, 0xb0, 0x87, 0x7a, 0x1f, 0x01, 0x73, 0xfe, 0x61, + 0x1a, 0xfc, 0x3c, 0x66, 0x58, 0xb6, 0x81, 0x99, 0x7c, 0xa5, 0x79, 0x14, + 0xa8, 0x47, 0x50, 0x08, 0x83, 0x69, 0xab, 0xda, 0x99, 0xb3, 0xb7, 0x6e, + 0xb2, 0x73, 0xc1, 0x1b, 0xef, 0x8b, 0xb1, 0xe8, 0xb7, 0xf4, 0x5b, 0x19, + 0xfc, 0xfc, 0xd0, 0x52, 0xa1, 0xc0, 0xd6, 0x58, 0xc1, 0x8b, 0x72, 0x5f, + 0xdb, 0x14, 0x9d, 0x62, 0x2c, 0x6a, 0x36, 0x05, 0x64, 0xf6, 0xd4, 0x9e, + 0x35, 0xb0, 0x7a, 0xc1, 0xe4, 0x84, 0x81, 0xc6, 0xf8, 0xa1, 0xee, 0x5b, + 0xda, 0x2f, 0x1c, 0x06, 0xc3, 0x91, 0xb2, 0xfe, 0x04, 0x13, 0x4f, 0x9a, + 0x6d, 0xa4, 0xcf, 0x87, 0xf3, 0xc6, 0x3f, 0xd3, 0xe5, 0x99, 0x2a, 0x79, + 0xaa, 0xa1, 0xa2, 0x31, 0x33, 0x34, 0x5c, 0xe5, 0x70, 0x4f, 0x92, 0xd8, + 0xe3, 0x51, 0xc8, 0x0f, 0x65, 0x3c, 0x37, 0x70, 0x18, 0xf7, 0x69, 0x83, + 0xf9, 0x08, 0x3c, 0x94, 0xa6, 0xf0, 0xd0, 0x18, 0x05, 0x8b, 0x32, 0x92, + 0xcd, 0x93, 0x2b, 0x8c, 0x68, 0x46, 0xc7, 0x53, 0xed, 0xa5, 0x80, 0x13, + 0x04, 0x30, 0x1f, 0x03, 0x26, 0x61, 0x5a, 0x3d, 0xe8, 0x8d, 0x1c, 0x9c, + 0x55, 0x86, 0x4f, 0x55, 0x97, 0x4f, 0x4c, 0x46, 0xc6, 0x25, 0xcb, 0x9b, + 0xac, 0xdb, 0x46, 0x08, 0x47, 0x1a, 0x04, 0x0d, 0x67, 0x9f, 0x9e, 0x9d, + 0x8e, 0xd2, 0xe4, 0x8a, 0xdc, 0x50, 0xb0, 0x9b, 0xac, 0x91, 0x72, 0xc8, + 0x76, 0xd9, 0x7e, 0xd8, 0x28, 0x6d, 0x24, 0x41, 0xc5, 0x89, 0x53, 0xe2, + 0x4d, 0x67, 0xd3, 0xb1, 0x06, 0x5d, 0x17, 0x03, 0x60, 0x36, 0xcd, 0x7a, + 0xfd, 0x50, 0xe2, 0x58, 0x69, 0xd7, 0xe9, 0x40, 0x4d, 0x55, 0xd0, 0x6d, + 0x9b, 0x30, 0x3e, 0xe0, 0x51, 0x13, 0x46, 0xda, 0x3a, 0x76, 0x51, 0x53, + 0x1c, 0x6b, 0xbf, 0xf4, 0xe4, 0x47, 0x55, 0x0a, 0xe1, 0xc8, 0x13, 0x5f, + 0xcc, 0x76, 0x0e, 0x95, 0x71, 0x8c, 0x36, 0x28, 0x36, 0x02, 0x00, 0xc8, + 0xd4, 0x9b, 0x5b, 0x41, 0x1f, 0xed, 0x0d, 0xb6, 0x1f, 0x40, 0x8f, 0x21, + 0x72, 0xc7, 0x0b, 0xdc, 0xed, 0xe8, 0x6b, 0x3e, 0x01, 0xbf, 0xa5, 0xa0, + 0x09, 0x6d, 0x3f, 0x26, 0x51, 0x1f, 0x1c, 0x46, 0xc9, 0xf5, 0xf0, 0xd0, + 0xf8, 0xe8, 0xc9, 0x35, 0x4a, 0x62, 0x05, 0x99, 0x04, 0xa3, 0x45, 0x79, + 0x83, 0xf1, 0x36, 0x99, 0x0c, 0xf1, 0x4c, 0x3c, 0xe4, 0xd9, 0x1a, 0x19, + 0xb0, 0xd5, 0x73, 0xeb, 0x25, 0x42, 0x0e, 0xc9, 0x36, 0xa2, 0x3d, 0x97, + 0xb5, 0x34, 0x33, 0xc6, 0x11, 0xc5, 0xf3, 0x78, 0x41, 0x46, 0xdf, 0x8f, + 0x90, 0xf8, 0x7e, 0x43, 0xfa, 0xde, 0x54, 0x47, 0x2e, 0xab, 0xa0, 0xc1, + 0x38, 0x89, 0x08, 0x51, 0xea, 0x9d, 0x63, 0xb7, 0xa0, 0x3f, 0xf0, 0xf2, + 0xed, 0x8a, 0x45, 0x3a, 0x4a, 0x1b, 0x73, 0x5c, 0xf4, 0xd3, 0x40, 0x50, + 0x0f, 0x42, 0x11, 0x70, 0x0c, 0xe0, 0xaf, 0x2c, 0xf6, 0x93, 0x87, 0x18, + 0xd0, 0x93, 0xc5, 0xa0, 0xcd, 0x17, 0x0e, 0x2c, 0x11, 0x04, 0xea, 0x6f, + 0xc6, 0x90, 0xf0, 0xdf, 0x74, 0x1b, 0xb4, 0x57, 0x61, 0x1d, 0x93, 0xe0, + 0x30, 0x27, 0x7b, 0xd6, 0xbc, 0x17, 0xe5, 0x2d, 0x56, 0x8b, 0x8e, 0xc0, + 0xad, 0xcc, 0x5a, 0xe5, 0x8d, 0xc2, 0x91, 0x33, 0xdc, 0xa1, 0xf5, 0x2e, + 0xf6, 0x5a, 0xfd, 0xa5, 0xa7, 0x90, 0x2c, 0xda, 0xe5, 0x69, 0x6b, 0x8a, + 0x81, 0x1d, 0x19, 0x7f, 0xa2, 0x3c, 0xf7, 0x6b, 0xce, 0x18, 0x99, 0x49, + 0x6e, 0x36, 0x7b, 0x88, 0xf7, 0x4c, 0x20, 0xb8, 0x05, 0xcf, 0x18, 0x57, + 0xed, 0xf4, 0xfd, 0xe6, 0xbf, 0xea, 0xe0, 0x5f, 0x5a, 0x48, 0xd4, 0x50, + 0x69, 0xc4, 0xb6, 0x55, 0x33, 0xbb, 0x57, 0x35, 0x45, 0x8a, 0xd3, 0xd1, + 0xdd, 0xaa, 0x0e, 0x7c, 0x97, 0x12, 0x82, 0xc2, 0x8a, 0x6e, 0xd6, 0x1f, + 0x16, 0xba, 0xeb, 0x4a, 0xb3, 0x84, 0x0a, 0x51, 0x34, 0x40, 0x8f, 0x7e, + 0x8b, 0x3d, 0xff, 0xac, 0xc1, 0x32, 0x8a, 0x4a, 0x98, 0x0a, 0xb3, 0x13, + 0x85, 0xb8, 0xda, 0x42, 0xbb, 0xc3, 0x2f, 0x54, 0xe2, 0x8a, 0x0c, 0x73, + 0xf2, 0xb4, 0x8e, 0x44, 0xa5, 0x56, 0x6f, 0x91, 0x45, 0x96, 0x08, 0x82, + 0x90, 0x69, 0xe8, 0x51, 0x36, 0xaa, 0x46, 0x84, 0x1f, 0x1b, 0x69, 0x27, + 0xeb, 0x3b, 0x83, 0x37, 0xe7, 0x90, 0x83, 0xe3, 0xd7, 0x3b, 0xb1, 0xa6, + 0xc5, 0x8d, 0x6e, 0x70, 0x6a, 0xe7, 0x1d, 0x15, 0xd9, 0x42, 0x62, 0x2f, + 0x9f, 0x29, 0x9d, 0x91, 0x13, 0x3c, 0x2e, 0xa4, 0x9d, 0xa4, 0x77, 0xf9, + 0x4c, 0xa2, 0xde, 0x7e, 0x20, 0x4a, 0x3e, 0x88, 0x60, 0x90, 0xa7, 0x8f, + 0x35, 0x03, 0x63, 0x5a, 0x4e, 0x7a, 0xae, 0x93, 0xf0, 0x97, 0xc4, 0x57, + 0x0f, 0x85, 0x13, 0x1f, 0xfb, 0x7a, 0xa6, 0x3f, 0xcf, 0xf6, 0x97, 0x50, + 0x5b, 0xea, 0xf6, 0xc0, 0x41, 0x8b, 0xdb, 0xb8, 0xb4, 0xe5, 0x7d, 0x11, + 0x24, 0xc8, 0x83, 0x32, 0x1d, 0xcb, 0xb0, 0xc7, 0xe7, 0x63, 0x01, 0x4a, + 0x88, 0x2e, 0x48, 0x44, 0x9f, 0x60, 0x56, 0x1a, 0xcc, 0x79, 0x83, 0x78, + 0x10, 0xc6, 0x26, 0xa0, 0x2b, 0xc8, 0xf1, 0x47, 0xc0, 0x86, 0xc9, 0xbc, + 0x12, 0x2c, 0x7c, 0x9d, 0x11, 0x1b, 0x1f, 0x65, 0xf8, 0xb4, 0xa8, 0xdc, + 0xdd, 0x7f, 0x8f, 0x81, 0x32, 0xf1, 0xce, 0xdb, 0xa0, 0xd8, 0x9c, 0xb3, + 0xe5, 0xaa, 0xad, 0xe9, 0xc6, 0x2e, 0xdd, 0x57, 0xea, 0x5c, 0x32, 0x2e, + 0x8c, 0x86, 0x94, 0x94, 0xad, 0xc0, 0xbb, 0x15, 0x28, 0x70, 0x54, 0x9b, + 0x2e, 0x12, 0xbc, 0xe9, 0x7c, 0x2b, 0x54, 0xaa, 0x67, 0xb4, 0xfa, 0x9b, + 0x25, 0x35, 0x17, 0xc1, 0x3a, 0x3f, 0x71, 0xef, 0x17, 0x93, 0xfa, 0xea, + 0xc7, 0xc4, 0x67, 0x51, 0x06, 0xd9, 0x15, 0x0d, 0xb7, 0x02, 0x91, 0xf2, + 0x70, 0xad, 0xe7, 0x4a, 0x6c, 0x1e, 0x86, 0x0f, 0xa5, 0xf8, 0xe4, 0xe0, + 0x75, 0xdc, 0x2a, 0x32, 0x7d, 0x77, 0x3f, 0xc2, 0x91, 0xf3, 0x69, 0x06, + 0x58, 0xcf, 0xaa, 0xaf, 0xfe, 0xd9, 0x94, 0x2a, 0xa4, 0xbe, 0xce, 0x25, + 0x00, 0x07, 0xff, 0x7d, 0x3d, 0xd6, 0xf8, 0x8c, 0x6b, 0x3b, 0x76, 0xb4, + 0xf5, 0x29, 0xec, 0x4b, 0x9f, 0x97, 0xd2, 0xad, 0x25, 0x14, 0x79, 0x91, + 0x69, 0x33, 0x22, 0x3c, 0x4f, 0xef, 0x88, 0x39, 0x52, 0x03, 0x16, 0xbf, + 0x2b, 0x0c, 0xa5, 0x57, 0x72, 0x42, 0xdf, 0x61, 0x05, 0x5a, 0xf1, 0x89, + 0xf6, 0x73, 0x28, 0x68, 0x92, 0xa0, 0xe0, 0x9a, 0x0e, 0x5e, 0x4f, 0x25, + 0xed, 0xe3, 0xf9, 0x98, 0x84, 0xb6, 0xb4, 0x01, 0xc8, 0x4b, 0x2c, 0x50, + 0x8b, 0xf2, 0xa5, 0x35, 0x19, 0xb4, 0x8b, 0xe5, 0xa6, 0x7a, 0xe8, 0xa5, + 0x46, 0x9f, 0x9e, 0xd2, 0x19, 0x63, 0x33, 0x95, 0xe5, 0x54, 0x16, 0xd2, + 0x81, 0x40, 0xe3, 0x91, 0xa7, 0x8e, 0x9b, 0x7b, 0x38, 0x25, 0x9d, 0xb6, + 0x2f, 0xac, 0x4d, 0xdc, 0xd3, 0x9a, 0xf1, 0x16, 0x29, 0xf8, 0x74, 0x7c, + 0xac, 0x25, 0x20, 0xc6, 0x46, 0x1a, 0xcb, 0x66, 0xb7, 0xb0, 0xcb, 0xf9, + 0xd7, 0x14, 0xab, 0xdc, 0x28, 0x49, 0x15, 0xe5, 0xcd, 0x6f, 0x34, 0xb2, + 0xb8, 0xde, 0x38, 0x12, 0x6e, 0x06, 0xf7, 0x19, 0x97, 0xa2, 0x9b, 0x65, + 0xfb, 0xb8, 0xce, 0x9d, 0x8f, 0x22, 0xa1, 0xa3, 0x66, 0x8e, 0xb2, 0x03, + 0xd9, 0xaf, 0x28, 0x3b, 0xbe, 0x21, 0xb7, 0x11, 0x7d, 0xdc, 0xcb, 0xb5, + 0xb8, 0x11, 0xdc, 0xa6, 0xef, 0xc9, 0x87, 0xa8, 0xde, 0x05, 0xa0, 0x82, + 0xfd, 0x48, 0x87, 0x81, 0xf8, 0x4c, 0xfc, 0x1d, 0xa2, 0x6c, 0xfe, 0x34, + 0x26, 0xeb, 0xef, 0x66, 0x16, 0x69, 0xb0, 0xdb, 0x0d, 0xd9, 0xea, 0x2c, + 0x1d, 0x9d, 0x75, 0xfe, 0xaa, 0x0a, 0x45, 0x0e, 0x73, 0xc0, 0x9d, 0x16, + 0xfd, 0xea, 0xf3, 0x2f, 0xda, 0xd5, 0xf9, 0xaf, 0xdd, 0x8c, 0x3b, 0xb0, + 0x6d, 0x5d, 0x5c, 0xed, 0xc4, 0x8e, 0xa8, 0x88, 0x69, 0x20, 0xff, 0xce, + 0xbf, 0xb0, 0x14, 0x59, 0xa2, 0x1b, 0xeb, 0xf9, 0xb5, 0x80, 0xaa, 0xc8, + 0xd9, 0x61, 0x27, 0x66, 0x5e, 0xf3, 0xcb, 0x93, 0x6f, 0x3f, 0x03, 0x59, + 0x0e, 0x0c, 0x94, 0x45, 0x03, 0xfa, 0xf3, 0x11, 0x24, 0x57, 0xad, 0x62, + 0x4e, 0xb1, 0xf9, 0x69, 0x44, 0x19, 0x83, 0x5b, 0xac, 0x81, 0x5b, 0xe0, + 0x28, 0x76, 0x18, 0x9c, 0x98, 0x25, 0xd4, 0xf8, 0xaa, 0xc4, 0x24, 0xf0, + 0x94, 0x81, 0x79, 0x69, 0x38, 0x9c, 0xdf, 0xaf, 0x6c, 0x07, 0x07, 0x4d, + 0xc7, 0xda, 0x95, 0x00, 0x37, 0x8c, 0x67, 0xf1, 0xda, 0x5e, 0x5d, 0x41, + 0xf0, 0x98, 0x19, 0x7f, 0x0b, 0x68, 0x30, 0x0f, 0xf6, 0xfb, 0x58, 0xe1, + 0x51, 0xaf, 0xb7, 0x48, 0x0f, 0x76, 0x4e, 0xac, 0xcf, 0xb6, 0xdf, 0x39, + 0xab, 0x62, 0x8c, 0xfe, 0x09, 0x36, 0x75, 0x69, 0x9b, 0x0b, 0xb5, 0xc9, + 0xa9, 0xeb, 0xc2, 0xbb, 0x44, 0x3a, 0x54, 0x73, 0x08, 0xb0, 0xa4, 0x0b, + 0xbd, 0xe3, 0x35, 0x0a, 0x3f, 0x14, 0x85, 0x8c, 0x22, 0x77, 0x35, 0xab, + 0x48, 0x4c, 0x2e, 0x95, 0x2d, 0x79, 0x3e, 0x81, 0xbb, 0x23, 0x2a, 0xd3, + 0xe8, 0x0e, 0xb8, 0xee, 0x23, 0xff, 0x80, 0x4f, 0x2b, 0xc7, 0x86, 0x43, + 0x3d, 0xe7, 0xb2, 0xc8, 0xc6, 0xcb, 0x00, 0x1d, 0x82, 0x8f, 0x7a, 0x69, + 0x76, 0x7a, 0xd8, 0xaf, 0x40, 0x63, 0x07, 0xeb, 0x74, 0xca, 0x44, 0x25, + 0x7e, 0x66, 0x5f, 0x41, 0x8e, 0x40, 0xb5, 0x03, 0xfa, 0xdb, 0x90, 0x95, + 0xbb, 0x72, 0xfd, 0xa4, 0x51, 0x05, 0x00, 0xc5, 0x11, 0x4f, 0xaf, 0x11, + 0x59, 0x80, 0x00, 0x19, 0xf1, 0x50, 0x94, 0x2b, 0xbe, 0xaa, 0xea, 0x80, + 0x09, 0x69, 0x60, 0xd1, 0x12, 0xcc, 0x95, 0x7d, 0x08, 0x4d, 0x34, 0xce, + 0x2f, 0xfc, 0x14, 0x4e, 0x28, 0x8e, 0x2c, 0x0f, 0x5a, 0x60, 0x25, 0x60, + 0x08, 0x0f, 0x2e, 0xdd, 0x81, 0xf3, 0x10, 0x1c, 0x7e, 0x21, 0x8e, 0xff, + 0xfb, 0xd0, 0xe1, 0xdb, 0x09, 0x8e, 0x32, 0x48, 0x89, 0x29, 0x1e, 0xd0, + 0x8a, 0x4c, 0x37, 0x0b, 0x6a, 0xd4, 0x5d, 0x2b, 0xc4, 0xf5, 0xd6, 0xe3, + 0x7d, 0x4c, 0x6c, 0x58, 0x45, 0x01, 0x6e, 0xda, 0x1c, 0x5f, 0xa2, 0x5f, + 0xf3, 0x41, 0x02, 0x0a, 0x69, 0xdf, 0x30, 0x64, 0x0a, 0x2e, 0x8c, 0x16, + 0x83, 0x50, 0x30, 0x62, 0xdb, 0x64, 0xf3, 0x6a, 0x24, 0xb3, 0x1b, 0x9d, + 0x94, 0x28, 0x52, 0xa6, 0x3f, 0x3e, 0x52, 0xff, 0xe1, 0xed, 0x4e, 0x86, + 0x05, 0xc2, 0x2f, 0x01, 0x5e, 0xb4, 0x5e, 0xaa, 0xf6, 0x6c, 0xcd, 0x11, + 0x99, 0x2f, 0x69, 0xf3, 0x96, 0xf9, 0xa6, 0x51, 0x8f, 0x78, 0x34, 0xbe, + 0xb2, 0xb5, 0xa8, 0x31, 0x1f, 0x45, 0xf2, 0xc2, 0x46, 0xc5, 0x77, 0xcf, + 0xa1, 0x4b, 0xeb, 0xf2, 0xdb, 0x15, 0xa9, 0x49, 0x21, 0x7b, 0xdf, 0x0a, + 0xa3, 0x2f, 0x9f, 0x61, 0x96, 0x82, 0xec, 0xa6, 0xf8, 0x35, 0x09, 0x6b, + 0x1d, 0x24, 0xbc, 0x08, 0xb6, 0x30, 0xe2, 0xc2, 0x43, 0x12, 0xda, 0x43, + 0xd4, 0xb9, 0x9e, 0xc8, 0xf3, 0x97, 0x3b, 0xfe, 0xa9, 0x9d, 0x2c, 0xda, + 0x8c, 0xba, 0x7c, 0xa9, 0x33, 0x17, 0x2b, 0x00, 0x8a, 0x2a, 0x8c, 0x27, + 0x14, 0x54, 0x65, 0x8a, 0xaf, 0x06, 0x98, 0x37, 0x89, 0xf7, 0xaa, 0x15, + 0x41, 0xc9, 0x67, 0x93, 0x6a, 0xad, 0xa6, 0x4f, 0x45, 0xcf, 0x6c, 0x93, + 0x85, 0x84, 0x25, 0xa0, 0x9a, 0x9d, 0xaa, 0xfb, 0xc9, 0xac, 0x48, 0xed, + 0x2c, 0x67, 0xe8, 0x45, 0xce, 0x3e, 0x60, 0xd3, 0xfd, 0xa3, 0x0c, 0x39, + 0x64, 0xca, 0xba, 0xd6, 0x18, 0xce, 0x76, 0x18, 0x14, 0x7a, 0x1a, 0xb1, + 0xbb, 0x24, 0xd9, 0x62, 0x8c, 0x2f, 0x0e, 0xe0, 0xf3, 0x54, 0x38, 0x06, + 0x4c, 0x8a, 0xc5, 0xe9, 0x5e, 0x4b, 0x75, 0x86, 0xd7, 0x52, 0x76, 0xcf, + 0x4e, 0x1d, 0x1a, 0xd5, 0xc1, 0xbb, 0x30, 0x69, 0x37, 0xe9, 0xed, 0x5a, + 0xbe, 0x71, 0x82, 0x11, 0x87, 0xcf, 0x17, 0xd1, 0x97, 0x72, 0xba, 0x16, + 0xd6, 0x31, 0x0b, 0x2e, 0xf9, 0x08, 0xbf, 0x73, 0xec, 0x54, 0x86, 0x1f, + 0x7e, 0x9b, 0xe9, 0x47, 0x79, 0x13, 0xfa, 0xc1, 0x29, 0xef, 0xcd, 0x6f, + 0x1b, 0x5d, 0x90, 0xd0, 0x8f, 0x6a, 0x81, 0x0c, 0x05, 0x77, 0xbe, 0x6f, + 0x11, 0xe3, 0xe1, 0x17, 0xc4, 0xda, 0xb1, 0x05, 0x89, 0xfd, 0xb7, 0x3e, + 0x80, 0x80, 0x0c, 0x96, 0x70, 0x6f, 0x68, 0x63, 0x6b, 0xaf, 0x55, 0x84, + 0x88, 0xaa, 0x63, 0xeb, 0xeb, 0xa0, 0xb0, 0xac, 0x77, 0xe1, 0x5b, 0x7e, + 0xa1, 0x8a, 0x87, 0xba, 0x4a, 0xde, 0x6c, 0x09, 0xe5, 0xde, 0x01, 0xe5, + 0x6d, 0xbc, 0x32, 0x87, 0x46, 0x4c, 0xb0, 0x81, 0xc5, 0x3b, 0xeb, 0xc4, + 0x4e, 0x19, 0xdd, 0x10, 0xfa, 0x58, 0x3e, 0x45, 0x71, 0x5b, 0x4d, 0x6e, + 0xa5, 0xa2, 0xf2, 0xd4, 0xb4, 0x46, 0xc5, 0x6d, 0xb5, 0xb6, 0x15, 0xa3, + 0x1b, 0x5e, 0xea, 0xb6, 0xff, 0xc1, 0xed, 0xf8, 0x93, 0x0b, 0xdb, 0x66, + 0x7f, 0x47, 0x06, 0x19, 0x79, 0x0c, 0xca, 0xa2, 0x8f, 0xff, 0x26, 0x78, + 0xa9, 0x10, 0x62, 0x01, 0x96, 0xf7, 0x17, 0x40, 0xc5, 0x7d, 0x87, 0xb3, + 0xaf, 0x50, 0xa4, 0xd2, 0x87, 0x84, 0x33, 0x1a, 0x70, 0x53, 0x1c, 0x9d, + 0x6a, 0x6b, 0xa5, 0xc8, 0x07, 0x01, 0x7e, 0x14, 0x93, 0x35, 0x37, 0x94, + 0x14, 0x3d, 0x08, 0xeb, 0x54, 0xea, 0xb9, 0xd4, 0x81, 0x5c, 0x81, 0x38, + 0x96, 0x3d, 0x83, 0x31, 0x69, 0x29, 0x30, 0xd7, 0xb1, 0x85, 0x5c, 0x0e, + 0xd3, 0x1b, 0x07, 0xdc, 0x3f, 0x8d, 0xfb, 0xb9, 0x78, 0x2e, 0xfb, 0x15, + 0x94, 0xbf, 0x1c, 0x02, 0xa2, 0x67, 0x43, 0x4a, 0xa7, 0xe6, 0x28, 0x4a, + 0xe2, 0x23, 0x70, 0x51, 0x1b, 0xbf, 0xa6, 0xc4, 0x73, 0xbd, 0x8f, 0x87, + 0x6e, 0x70, 0x6f, 0x5c, 0x0a, 0x51, 0x53, 0x6c, 0x21, 0xf4, 0xe3, 0xf2, + 0xdf, 0x99, 0x07, 0xd9, 0x3b, 0x6a, 0xca, 0xbd, 0x4f, 0xb1, 0xd4, 0xd1, + 0x2d, 0xff, 0xdb, 0x0f, 0xde, 0xdf, 0x91, 0x59, 0xe4, 0x06, 0x3d, 0x65, + 0xfb, 0xc4, 0x3d, 0x38, 0xfc, 0xfc, 0xaa, 0xb7, 0x37, 0x46, 0x30, 0x7e, + 0xc1, 0xea, 0x29, 0xf6, 0x64, 0x98, 0x0f, 0xc7, 0x69, 0x5a, 0xff, 0xad, + 0xb0, 0xc5, 0x05, 0x9e, 0x5a, 0x0f, 0x17, 0x73, 0xbc, 0x3b, 0x45, 0x15, + 0xda, 0xd1, 0x85, 0xc6, 0xc2, 0x26, 0x02, 0x19, 0x52, 0x37, 0x24, 0x2a, + 0x01, 0xef, 0xa3, 0x18, 0xdf, 0xea, 0x45, 0x59, 0xcd, 0x75, 0xf0, 0xa5, + 0x16, 0xab, 0xab, 0x22, 0x39, 0x45, 0x03, 0x7f, 0x80, 0x61, 0xb6, 0x7f, + 0x9f, 0x91, 0xfb, 0x06, 0x03, 0x55, 0x6c, 0x16, 0x0f, 0xdc, 0xc2, 0x4c, + 0xc8, 0x5e, 0x1d, 0x60, 0x66, 0xe8, 0xaf, 0xa8, 0xcc, 0x4e, 0xd5, 0xaa, + 0x6a, 0xa4, 0xfd, 0xd6, 0x06, 0x81, 0x15, 0x1b, 0x6e, 0xd6, 0xc1, 0x69, + 0x1a, 0x95, 0x82, 0x4f, 0xf0, 0xb7, 0xce, 0x28, 0xbf, 0x10, 0x8d, 0x5b, + 0xad, 0xc1, 0x4f, 0xe6, 0xd2, 0xd4, 0x1d, 0x42, 0xc2, 0xe5, 0x23, 0x12, + 0xba, 0xc0, 0x72, 0xbb, 0x41, 0x15, 0xdb, 0xbd, 0xc0, 0x2c, 0x1f, 0x48, + 0xe9, 0xb0, 0x2a, 0x75, 0x62, 0x34, 0x66, 0x9b, 0x4c, 0x64, 0xc1, 0x22, + 0x31, 0xfa, 0x65, 0x09, 0x3a, 0xeb, 0xe5, 0xf1, 0xd4, 0x75, 0xf6, 0x4d, + 0x96, 0x57, 0x26, 0xf5, 0x77, 0x9f, 0x81, 0x5c, 0x6b, 0x68, 0x7a, 0x74, + 0x73, 0x39, 0x5b, 0xef, 0x46, 0x63, 0x93, 0x8c, 0x55, 0x1c, 0xf5, 0x82, + 0x47, 0xbb, 0x70, 0x4d, 0xa8, 0xa5, 0xb8, 0x91, 0xee, 0x5c, 0x49, 0x3f, + 0x09, 0xd3, 0x33, 0x7f, 0x82, 0x0a, 0x11, 0x80, 0x7b, 0x71, 0x8b, 0x2d, + 0x17, 0x30, 0xfd, 0x3b, 0xe4, 0x57, 0xf2, 0xde, 0x89, 0x0b, 0xcd, 0x35, + 0xe6, 0x0c, 0xab, 0x55, 0xdf, 0x36, 0xb0, 0xcf, 0x76, 0xd9, 0xa2, 0x21, + 0x9f, 0xe5, 0xa8, 0xdd, 0xa5, 0x86, 0xa9, 0x63, 0x0b, 0x9d, 0xc7, 0x9f, + 0xaa, 0xec, 0x5d, 0xb3, 0xc5, 0x8b, 0xf5, 0xd5, 0x3e, 0x23, 0x83, 0x6d, + 0x9d, 0xf7, 0x00, 0x47, 0x1b, 0xf5, 0x65, 0x83, 0x06, 0xf1, 0x4e, 0x88, + 0x13, 0x30, 0xd4, 0xd7, 0x7a, 0x00, 0xd7, 0x06, 0xe8, 0xa3, 0xb3, 0x70, + 0x33, 0xd9, 0x7e, 0x30, 0x8f, 0xde, 0xdf, 0x24, 0x44, 0x17, 0xeb, 0xc8, + 0x39, 0x37, 0xa7, 0xa5, 0xc2, 0xdf, 0xf6, 0x8d, 0xfd, 0x90, 0x3d, 0x1d, + 0x25, 0x8f, 0x27, 0x20, 0x76, 0x75, 0xc8, 0x92, 0x42, 0x34, 0x8f, 0x55, + 0x97, 0xd1, 0x17, 0x46, 0x13, 0x26, 0xff, 0x62, 0x5d, 0x04, 0x48, 0x53, + 0xb2, 0x2c, 0xf1, 0x9c, 0x59, 0x67, 0xb5, 0x9d, 0xde, 0xa2, 0x64, 0xce, + 0xf7, 0xb5, 0xb3, 0x62, 0x7e, 0xbf, 0x4c, 0x22, 0x60, 0xcc, 0x6b, 0xaa, + 0x09, 0x7a, 0x94, 0xe5, 0x0a, 0x59, 0xa0, 0x5b, 0x3f, 0x65, 0x72, 0x92, + 0x04, 0x7d, 0x08, 0x7b, 0xb9, 0x4b, 0x2f, 0x3b, 0x7d, 0xa0, 0xb7, 0x42, + 0xfc, 0x1d, 0xef, 0xa2, 0x1a, 0x2d, 0xf3, 0xfa, 0x2d, 0x93, 0x06, 0xb1, + 0x08, 0x6b, 0x9c, 0xe4, 0x25, 0x32, 0x81, 0xc7, 0xdd, 0xce, 0x4e, 0x9f, + 0xb5, 0xc4, 0x56, 0x01, 0x94, 0x9f, 0x53, 0x7b, 0x04, 0x38, 0xc3, 0x1c, + 0xee, 0x58, 0xbf, 0x61, 0x70, 0x2a, 0x3b, 0xba, 0xdc, 0x1d, 0x8a, 0xb8, + 0x36, 0x46, 0x50, 0x46, 0x1f, 0xd0, 0x40, 0x2e, 0xdb, 0x1e, 0xa6, 0x90, + 0x4e, 0xa4, 0x01, 0x53, 0x73, 0xc5, 0xa6, 0x10, 0x50, 0xfe, 0xab, 0xed, + 0x4a, 0x2a, 0x71, 0x6e, 0xd4, 0x58, 0x71, 0xbe, 0xd0, 0x8c, 0x0e, 0x0b, + 0x24, 0xe9, 0x20, 0x92, 0x8b, 0x45, 0x48, 0x48, 0xee, 0xb8, 0x95, 0x0b, + 0x0a, 0x86, 0x76, 0xb0, 0x9f, 0xd4, 0x3f, 0x31, 0x5f, 0x46, 0x8e, 0xa2, + 0xd4, 0x6a, 0x7e, 0x37, 0x4a, 0x7c, 0x9c, 0x79, 0xb8, 0x6a, 0xad, 0x11, + 0xb1, 0xd7, 0xab, 0xa8, 0xd3, 0xf9, 0xbd, 0xd6, 0xa5, 0xea, 0x49, 0xad, + 0x0f, 0xcf, 0x61, 0x11, 0x60, 0x3d, 0xa5, 0x5c, 0x54, 0xd3, 0x72, 0x46, + 0x12, 0x29, 0x80, 0x2a, 0x84, 0xa9, 0x0f, 0xbe, 0x81, 0x05, 0xb0, 0xe9, + 0xd8, 0x91, 0x6b, 0x35, 0xc5, 0x4f, 0xe6, 0x2b, 0x68, 0xb3, 0x88, 0xad, + 0x4e, 0x66, 0xb8, 0xd8, 0xb0, 0x34, 0x40, 0x35, 0x06, 0x6c, 0x0d, 0x6b, + 0xfd, 0x93, 0x96, 0x77, 0x01, 0x97, 0xca, 0x29, 0x00, 0x52, 0xaf, 0xda, + 0x42, 0x02, 0x06, 0x4d, 0xd9, 0x1b, 0xdf, 0x6d, 0xfe, 0xed, 0x99, 0x1e, + 0xd7, 0x48, 0x22, 0xfc, 0x66, 0xde, 0x26, 0xc7, 0x86, 0xfb, 0x1a, 0x67, + 0x8e, 0xb6, 0x0b, 0xe3, 0xad, 0xf3, 0x4f, 0xd1, 0x2b, 0x09, 0x59, 0xc6, + 0x01, 0x73, 0xca, 0xae, 0x84, 0xf4, 0x14, 0xa5, 0xd0, 0xe4, 0x78, 0x99, + 0xb0, 0x95, 0xf7, 0x77, 0xba, 0xf3, 0xa7, 0xe6, 0x9f, 0x22, 0xd6, 0xe5, + 0x80, 0x5d, 0xab, 0xb7, 0xbf, 0xa1, 0xe1, 0x0b, 0xe5, 0x85, 0xa9, 0x7e, + 0x58, 0xee, 0x57, 0xc6, 0xe8, 0xb2, 0x13, 0x47, 0x3d, 0x3a, 0x37, 0x9b, + 0x27, 0xfd, 0xac, 0xdf, 0x09, 0xe4, 0x9f, 0x99, 0x7f, 0x6d, 0xae, 0x00, + 0x87, 0x32, 0x3a, 0xaa, 0xbb, 0x64, 0xd2, 0xb5, 0x1d, 0x33, 0xe0, 0xe9, + 0x85, 0x58, 0xfe, 0x9d, 0x0b, 0xf6, 0xd4, 0x21, 0x4f, 0xff, 0xf1, 0x4f, + 0xd7, 0x7d, 0x6b, 0xb0, 0x84, 0xfd, 0xd9, 0x3c, 0x0a, 0xc8, 0x62, 0xdd, + 0xb8, 0x62, 0x4d, 0xde, 0x38, 0x29, 0x26, 0x79, 0x7e, 0xae, 0x85, 0xfb, + 0xd7, 0x0c, 0x3f, 0x52, 0xbf, 0xbd, 0x45, 0xee, 0x60, 0x90, 0xd6, 0x16, + 0x43, 0xfa, 0x9a, 0x89, 0x63, 0x37, 0x52, 0x58, 0x31, 0x0f, 0x51, 0x65, + 0x2a, 0x08, 0xfb, 0x1a, 0xd7, 0xcd, 0xf7, 0xb9, 0x12, 0x05, 0xc4, 0x4b, + 0x1b, 0x7b, 0xc1, 0xbf, 0x06, 0xaa, 0xaa, 0x2f, 0x3f, 0x28, 0x2d, 0x35, + 0x60, 0x5f, 0x59, 0x33, 0x8c, 0x83, 0x49, 0xc3, 0x74, 0xfa, 0x92, 0x3d, + 0x76, 0x77, 0x0c, 0x6e, 0x5e, 0x95, 0x52, 0x9d, 0x97, 0x8a, 0xee, 0x84, + 0x09, 0x02, 0xd7, 0xa2, 0x8d, 0x42, 0x5a, 0x73, 0xd5, 0xfe, 0xf7, 0x41, + 0x13, 0x6c, 0x7d, 0xc5, 0x02, 0x0d, 0xa9, 0xa1, 0xfe, 0xf9, 0x84, 0x2a, + 0x15, 0x44, 0x76, 0xe9, 0xd4, 0xf4, 0xfa, 0xb4, 0x29, 0x71, 0xbf, 0x8b, + 0xb0, 0x2c, 0xcc, 0xb3, 0x93, 0xbb, 0xca, 0x6d, 0x85, 0xe5, 0x98, 0x53, + 0xf1, 0x85, 0x74, 0xae, 0xed, 0x52, 0x76, 0xfc, 0xb3, 0x42, 0x72, 0x40, + 0xc9, 0xf2, 0xf2, 0xef, 0x43, 0x25, 0xea, 0xc3, 0x02, 0xc1, 0xa3, 0x4c, + 0xde, 0xa3, 0xb8, 0xe4, 0xc3, 0xed, 0xe4, 0xf3, 0xa9, 0xde, 0xa8, 0x85, + 0xdb, 0x64, 0xbb, 0x9c, 0x5f, 0x1b, 0x00, 0x88, 0xf4, 0x49, 0xf2, 0xea, + 0x08, 0x0b, 0x75, 0x19, 0x8c, 0x5f, 0xb2, 0x14, 0x49, 0x16, 0xd1, 0x6f, + 0xb7, 0x32, 0x09, 0xc6, 0x92, 0x5c, 0x4c, 0x81, 0x97, 0x30, 0x83, 0xe7, + 0x1c, 0x12, 0x30, 0x8a, 0x9b, 0xb3, 0xe6, 0xd8, 0xbc, 0xe1, 0x04, 0x3a, + 0xf5, 0x63, 0x76, 0xe9, 0xa7, 0xea, 0xbb, 0x13, 0x59, 0x37, 0x64, 0x76, + 0x80, 0x50, 0x36, 0xee, 0xf0, 0xdd, 0xa5, 0x60, 0xde, 0x93, 0x6d, 0xae, + 0x5e, 0x4f, 0xa9, 0xea, 0xae, 0x22, 0xd5, 0xa0, 0x63, 0xec, 0x28, 0x24, + 0xbc, 0x0c, 0x7e, 0x23, 0x3a, 0xb8, 0x58, 0x5d, 0x93, 0x78, 0x67, 0xf6, + 0x9e, 0xec, 0xf3, 0x35, 0x13, 0xbe, 0xb3, 0x35, 0x73, 0x48, 0x24, 0xb9, + 0xc1, 0xac, 0x5b, 0xdb, 0xc0, 0x9a, 0xdc, 0xe5, 0x03, 0xff, 0x70, 0x8e, + 0x4e, 0x64, 0xb6, 0xa6, 0x65, 0x66, 0xf7, 0x28, 0x11, 0x39, 0x80, 0x48, + 0x9c, 0xb6, 0x81, 0x77, 0x1c, 0xf9, 0xd2, 0xf6, 0xf1, 0xef, 0x07, 0x8d, + 0xb9, 0x13, 0x91, 0x38, 0xda, 0x4e, 0x6e, 0xb8, 0x7d, 0x7c, 0xb4, 0x3e, + 0xfa, 0x10, 0xc6, 0x10, 0xb4, 0x60, 0x47, 0x98, 0x5e, 0xcd, 0x0c, 0x38, + 0xb2, 0xb4, 0x28, 0x62, 0xb7, 0xc8, 0x29, 0x47, 0x91, 0x56, 0xca, 0xee, + 0x15, 0x60, 0x08, 0xc4, 0x9d, 0x6b, 0xae, 0xfd, 0x80, 0xe0, 0x67, 0xf7, + 0xee, 0x2b, 0x98, 0x9b, 0xa7, 0x00, 0x6f, 0x9a, 0xfe, 0xb6, 0xfa, 0xd7, + 0x5f, 0x02, 0x62, 0x73, 0x66, 0x44, 0xf6, 0xd0, 0xc7, 0xf4, 0x47, 0x08, + 0x6b, 0x7c, 0x8c, 0x7f, 0xbb, 0xd8, 0x64, 0x4b, 0x7b, 0x05, 0x7e, 0x4a, + 0x25, 0xe9, 0xaa, 0x66, 0x73, 0xb6, 0x92, 0xc7, 0x82, 0xf2, 0x61, 0x17, + 0x59, 0x28, 0xf1, 0x6b, 0x15, 0x3b, 0xdd, 0xf8, 0xd9, 0x0f, 0xb7, 0xc5, + 0xa6, 0x25, 0x7d, 0x6e, 0xb0, 0xb0, 0xae, 0x9f, 0x85, 0xdf, 0x9d, 0x38, + 0x1c, 0x4b, 0xbb, 0x3d, 0xfe, 0x1e, 0x19, 0x3a, 0xaa, 0xe3, 0xe4, 0x1c, + 0xa6, 0xb6, 0x0c, 0x3e, 0xce, 0x63, 0x1c, 0x2c, 0x53, 0x83, 0xa8, 0xe1, + 0x91, 0x59, 0x88, 0xb3, 0xc6, 0x37, 0xb8, 0xb8, 0xc6, 0x08, 0x53, 0x56, + 0xf6, 0x64, 0x2c, 0xb6, 0xfa, 0x39, 0x63, 0x5b, 0x3d, 0xf8, 0xc1, 0x74, + 0xc6, 0xec, 0x43, 0x84, 0xc8, 0x7b, 0xfd, 0xbb, 0xec, 0xef, 0xe0, 0x85, + 0x90, 0x7c, 0x7f, 0x15, 0xcb, 0xa6, 0x15, 0x74, 0x6b, 0x67, 0x82, 0x9d, + 0xb3, 0x35, 0x0f, 0x7b, 0x01, 0xc4, 0xef, 0x42, 0x6c, 0x3c, 0xbd, 0xc4, + 0xb5, 0xe6, 0x85, 0x52, 0xed, 0x77, 0x9d, 0xe5, 0xf7, 0x48, 0xef, 0x60, + 0xb0, 0x8a, 0x37, 0xc7, 0xb1, 0xe7, 0xb9, 0xe7, 0xa3, 0xf8, 0x18, 0xeb, + 0xf7, 0x85, 0x4d, 0x98, 0x56, 0xb4, 0x6f, 0x1f, 0x59, 0xc7, 0x21, 0x85, + 0x34, 0xa7, 0x58, 0x9b, 0x56, 0x84, 0x14, 0x09, 0x72, 0x5a, 0x6b, 0xce, + 0x37, 0x43, 0x7d, 0xea, 0x49, 0x94, 0xf3, 0xf6, 0xbe, 0x5d, 0xd7, 0xf3, + 0xce, 0x53, 0xf0, 0x8b, 0x1b, 0x77, 0xd7, 0xef, 0x54, 0x4e, 0x54, 0x5b, + 0x16, 0x34, 0xec, 0x85, 0xaf, 0xdc, 0x43, 0x43, 0x93, 0x5d, 0xa0, 0x4f, + 0xb9, 0xa5, 0xd3, 0xaa, 0x52, 0xda, 0x4e, 0xb7, 0x3d, 0xa8, 0x46, 0xee, + 0x87, 0xb8, 0xf9, 0xdc, 0x31, 0xf0, 0xbe, 0xc6, 0x96, 0x5b, 0xea, 0x48, + 0x9f, 0xec, 0x34, 0x0f, 0x99, 0xbb, 0x17, 0x53, 0x08, 0x5f, 0xf8, 0x26, + 0x58, 0xbd, 0x79, 0x17, 0xf2, 0xd0, 0xab, 0x44, 0x98, 0x5d, 0x19, 0x3c, + 0x45, 0xed, 0x1f, 0x18, 0x4b, 0x79, 0x6c, 0x20, 0x40, 0x9a, 0xf1, 0xe7, + 0x8f, 0xb0, 0x50, 0x28, 0xdd, 0x5e, 0x56, 0xac, 0xe1, 0x69, 0xfb, 0x95, + 0x5e, 0xfc, 0x5c, 0xba, 0x62, 0xf4, 0x20, 0xf5, 0x63, 0x4b, 0xb2, 0xe0, + 0x28, 0x55, 0x47, 0xb2, 0x18, 0x64, 0x17, 0x01, 0x29, 0x69, 0xba, 0xcf, + 0xbe, 0x13, 0x38, 0xd1, 0x66, 0x42, 0xc5, 0x07, 0xb9, 0x39, 0x06, 0xa8, + 0x36, 0x53, 0x42, 0xb7, 0xae, 0xa2, 0xa2, 0x2a, 0x9c, 0xc8, 0x5f, 0x08, + 0x5d, 0x3a, 0x94, 0xb8, 0x23, 0x2a, 0xb7, 0xd0, 0xa4, 0x85, 0xf4, 0x68, + 0xeb, 0xa1, 0x58, 0x02, 0x86, 0x91, 0x50, 0x66, 0x89, 0xd9, 0x1e, 0x76, + 0x0c, 0xd8, 0xed, 0x6b, 0xba, 0x5d, 0xab, 0x54, 0x98, 0x0c, 0xac, 0x14, + 0x08, 0x1e, 0xda, 0xf0, 0x01, 0x9f, 0xfa, 0x07, 0x77, 0x27, 0x97, 0x80, + 0xbc, 0x5a, 0x9c, 0x5c, 0x68, 0xa8, 0xa8, 0xd5, 0x16, 0xa5, 0xd0, 0x91, + 0xe6, 0x7a, 0x94, 0x60, 0x35, 0x6f, 0x27, 0x14, 0x52, 0x96, 0xaa, 0xab, + 0xf1, 0x37, 0x67, 0x6b, 0x74, 0x96, 0xcb, 0x06, 0x6e, 0x82, 0x60, 0xe5, + 0xc5, 0xc2, 0x98, 0xe6, 0xf6, 0x63, 0xea, 0xa9, 0x84, 0x7c, 0xc0, 0x0a, + 0xcc, 0x41, 0x77, 0xef, 0xaf, 0x64, 0x72, 0x37, 0x70, 0x9d, 0xd3, 0x40, + 0x04, 0xa9, 0x04, 0xad, 0xc7, 0x8d, 0xd4, 0xd6, 0xb9, 0xfc, 0x94, 0x91, + 0x35, 0x1e, 0xe0, 0xee, 0x6e, 0xbc, 0xce, 0x38, 0x05, 0x99, 0x4b, 0x04, + 0xf3, 0xbb, 0x5a, 0xb9, 0x3d, 0x50, 0xfe, 0x93, 0x74, 0xc0, 0xf3, 0x79, + 0x78, 0x6c, 0x02, 0x93, 0x82, 0x34, 0xa3, 0xbe, 0x00, 0x4d, 0xa0, 0xb7, + 0x17, 0xd4, 0x2b, 0xb1, 0xc1, 0x02, 0xdb, 0x78, 0x47, 0x4e, 0x29, 0x51, + 0x61, 0xd0, 0xc2, 0xd4, 0x63, 0x31, 0x8a, 0x9d, 0x0b, 0xee, 0xf8, 0x52, + 0xe9, 0xc2, 0x9b, 0x83, 0xdf, 0x7a, 0x8d, 0xf7, 0x30, 0xba, 0x30, 0x8b, + 0xda, 0x21, 0xe8, 0x81, 0xac, 0xcf, 0xcb, 0x04, 0xec, 0x8d, 0x2e, 0x17, + 0xe6, 0x6b, 0x73, 0x2e, 0xd7, 0x8b, 0x0f, 0x64, 0x36, 0x25, 0x6d, 0x27, + 0x46, 0xc9, 0xdd, 0x5e, 0x4b, 0x93, 0x19, 0x50, 0x60, 0xcb, 0x01, 0xc2, + 0xac, 0x64, 0x50, 0x3b, 0x1e, 0xe8, 0x5a, 0x67, 0x86, 0x05, 0x75, 0x5f, + 0x04, 0x66, 0xd2, 0x60, 0x38, 0x92, 0x2b, 0xc8, 0x3a, 0x18, 0xd6, 0x46, + 0x8f, 0x20, 0xe1, 0x2f, 0x9f, 0x7c, 0x0b, 0x89, 0x01, 0xb8, 0xc2, 0xaa, + 0xd8, 0xed, 0xd1, 0x06, 0xaa, 0xe0, 0xad, 0x5d, 0xbe, 0x2f, 0xdc, 0xcb, + 0xdf, 0xfa, 0x34, 0xfb, 0x5a, 0xb0, 0x92, 0xcd, 0x62, 0xde, 0xfe, 0x24, + 0x19, 0xc4, 0xa4, 0x21, 0xff, 0x84, 0x01, 0x48, 0x5d, 0x9a, 0xff, 0x02, + 0xe9, 0x95, 0xf3, 0xf4, 0x90, 0x95, 0xdf, 0x81, 0x4e, 0xfe, 0x2e, 0xf8, + 0x20, 0xcb, 0xb5, 0x7f, 0xe4, 0x91, 0xb4, 0xf4, 0xf9, 0x8d, 0xdf, 0x0c, + 0xdd, 0xbc, 0x14, 0xd9, 0x23, 0xfd, 0xd0, 0xc4, 0xa1, 0x00, 0xa7, 0x45, + 0x42, 0x5d, 0x9d, 0x87, 0x69, 0x20, 0xc2, 0x32, 0x65, 0x7d, 0xc3, 0x5a, + 0x6c, 0x72, 0x78, 0x9f, 0xe5, 0x5f, 0x0d, 0x13, 0x53, 0x5a, 0x26, 0x50, + 0x2e, 0x98, 0x37, 0x90, 0xe2, 0x05, 0x7c, 0x60, 0xac, 0x71, 0x57, 0x64, + 0xb8, 0x67, 0xdb, 0x67, 0xff, 0x3d, 0xc7, 0x9e, 0xcb, 0x6d, 0x8a, 0xee, + 0xa9, 0xa5, 0x38, 0x02, 0x2b, 0xf2, 0xae, 0x10, 0xa8, 0x2d, 0x77, 0x67, + 0x5d, 0x79, 0xe1, 0x71, 0xe3, 0x4d, 0x06, 0xf8, 0x4d, 0x58, 0x77, 0x45, + 0x06, 0x7d, 0x38, 0x45, 0x8e, 0x55, 0x6a, 0xf6, 0xfd, 0x5a, 0xef, 0x69, + 0x6d, 0x6d, 0x16, 0xa5, 0xaf, 0x75, 0x77, 0xe7, 0x8c, 0x90, 0xe6, 0xfc, + 0xea, 0x1b, 0x07, 0x1f, 0xb5, 0x46, 0x63, 0xc3, 0x42, 0x8a, 0x6f, 0xba, + 0xfb, 0x3f, 0xc7, 0x8d, 0xfb, 0xbe, 0x0b, 0xf0, 0x2a, 0x7d, 0x69, 0xbc, + 0xed, 0x85, 0x79, 0x9e, 0xdf, 0x15, 0xe0, 0x4c, 0xef, 0xbf, 0xc0, 0x8c, + 0x89, 0xef, 0xd7, 0x0f, 0xc2, 0x04, 0x36, 0x33, 0x27, 0xf2, 0x29, 0x04, + 0xce, 0x19, 0x3a, 0x8a, 0x11, 0x18, 0x86, 0xcd, 0xce, 0x3e, 0x31, 0xa6, + 0x6f, 0x9c, 0x16, 0x8d, 0x32, 0xcd, 0x8f, 0x93, 0x4f, 0xff, 0x88, 0xfb, + 0xf9, 0x33, 0x7b, 0xcd, 0xcc, 0x57, 0x24, 0x79, 0xb7, 0x5d, 0x92, 0xe5, + 0x79, 0x61, 0xe7, 0x96, 0xab, 0x2a, 0xb5, 0xf7, 0x4a, 0x19, 0x9e, 0xc9, + 0x42, 0x2d, 0x4a, 0x8b, 0x59, 0xab, 0xce, 0xfc, 0xce, 0x49, 0xbd, 0x43, + 0x78, 0x70, 0x2b, 0x6c, 0xf3, 0x9d, 0x97, 0x8a, 0x85, 0x7d, 0xf7, 0x97, + 0x7a, 0xbf, 0x3d, 0x4c, 0x61, 0xef, 0xc3, 0x61, 0x63, 0x24, 0x22, 0xf3, + 0x12, 0xa5, 0x5f, 0x5e, 0x97, 0x97, 0x48, 0xe1, 0x26, 0xc1, 0x7d, 0x61, + 0x53, 0x69, 0x1d, 0x63, 0x7e, 0x23, 0x41, 0xf1, 0xdd, 0x64, 0xb5, 0xb8, + 0x60, 0x87, 0x89, 0x6b, 0x24, 0x65, 0xec, 0xac, 0x8c, 0x75, 0x00, 0x4b, + 0x8b, 0x7b, 0x45, 0x00, 0xad, 0xa6, 0x83, 0x1d, 0x19, 0x3c, 0xac, 0xba, + 0x30, 0x79, 0xf3, 0xb8, 0xf3, 0x71, 0x08, 0x10, 0x58, 0x02, 0x8a, 0xda, + 0xeb, 0xd7, 0xba, 0x3f, 0x49, 0x15, 0xb6, 0x37, 0xbe, 0xcf, 0xaf, 0x4a, + 0x13, 0x8a, 0xff, 0x35, 0xad, 0x50, 0x6c, 0x42, 0x0d, 0xaf, 0xb9, 0xd4, + 0x76, 0xac, 0xd6, 0xf8, 0x09, 0x53, 0xfb, 0x5a, 0x30, 0x95, 0xa5, 0xf3, + 0xb7, 0x82, 0x08, 0xea, 0xdb, 0xfc, 0x08, 0x30, 0x47, 0xf5, 0xe6, 0xc1, + 0x52, 0xc9, 0x6b, 0x77, 0x56, 0x09, 0xc2, 0x30, 0x08, 0x41, 0xd4, 0xf7, + 0xa9, 0x85, 0x78, 0xab, 0x76, 0xc4, 0xe8, 0xd8, 0x18, 0xeb, 0x2f, 0xff, + 0x72, 0x71, 0xc5, 0x58, 0x76, 0xec, 0x20, 0xe9, 0x0d, 0x4c, 0x7c, 0xd5, + 0xf2, 0x82, 0xc9, 0x29, 0xd1, 0x6f, 0x55, 0x25, 0xa1, 0xfd, 0x0c, 0x76, + 0xc7, 0xb8, 0x90, 0x7a, 0xbc, 0x38, 0xd8, 0xd7, 0xc2, 0x23, 0x65, 0xe6, + 0x68, 0xf5, 0xe9, 0x83, 0xff, 0x98, 0x13, 0xb1, 0x01, 0x8b, 0xce, 0x02, + 0x6b, 0x97, 0xe3, 0xf6, 0x26, 0xb0, 0x60, 0x53, 0xcc, 0x80, 0xb0, 0x3f, + 0xcb, 0x7c, 0x40, 0x27, 0xe8, 0x5f, 0x24, 0xb4, 0x6e, 0xba, 0x76, 0xf3, + 0x84, 0x80, 0xf0, 0x8d, 0x42, 0xdc, 0xe6, 0x99, 0xde, 0x66, 0x1f, 0x35, + 0xfd, 0xba, 0x31, 0x92, 0x17, 0x80, 0x79, 0x22, 0x5a, 0x72, 0xd6, 0x5c, + 0xc4, 0x2a, 0x7e, 0x50, 0x8f, 0x35, 0xc9, 0xf6, 0x87, 0x75, 0x56, 0xce, + 0x8c, 0xf9, 0x00, 0x28, 0x8f, 0x3b, 0x3b, 0x04, 0x35, 0x95, 0x10, 0xdb, + 0xf3, 0xfa, 0x4a, 0xa7, 0xd4, 0xee, 0x16, 0xc3, 0x99, 0x7f, 0x87, 0x13, + 0x07, 0xbe, 0xb6, 0x90, 0x97, 0xdf, 0x54, 0x06, 0xca, 0x24, 0xb5, 0xa4, + 0x98, 0xde, 0xab, 0x3a, 0x6d, 0x26, 0x7f, 0x1c, 0xdd, 0xd0, 0x9f, 0xfd, + 0xbb, 0xcb, 0x60, 0xb6, 0x1c, 0xb0, 0xd8, 0x91, 0x7e, 0x77, 0x3e, 0x96, + 0x3e, 0x32, 0x46, 0x26, 0x82, 0x77, 0x8e, 0x5d, 0x3a, 0xc5, 0xcf, 0x7b, + 0x72, 0x7c, 0x18, 0x4c, 0x56, 0x82, 0x77, 0x14, 0xff, 0xb4, 0x81, 0x74, + 0xcc, 0x4f, 0xa5, 0x38, 0xe5, 0x84, 0x35, 0x06, 0xf4, 0xa5, 0x6d, 0x65, + 0x2a, 0xba, 0xfa, 0xba, 0xd6, 0x70, 0x44, 0xac, 0x46, 0x5f, 0xe1, 0x86, + 0x54, 0xc8, 0x27, 0x3f, 0x4b, 0x4d, 0xd3, 0x1e, 0x6a, 0x03, 0xc6, 0x4f, + 0xfa, 0xa9, 0xb5, 0xad, 0x8a, 0xc0, 0xcb, 0xe8, 0x2b, 0x1b, 0x92, 0x88, + 0xeb, 0x77, 0xe9, 0xe2, 0xfb, 0xbd, 0x44, 0x8a, 0xc9, 0xc9, 0x2e, 0xeb, + 0xad, 0x2e, 0x02, 0x4b, 0xdf, 0xae, 0xc5, 0x79, 0xd8, 0x64, 0x7f, 0x4a, + 0x58, 0x2b, 0x7d, 0xd8, 0xb3, 0x4a, 0x75, 0x59, 0x45, 0x82, 0xfb, 0x2b, + 0x5b, 0x46, 0xb9, 0x2d, 0x26, 0x63, 0xbd, 0x18, 0xed, 0x71, 0xc1, 0x50, + 0x20, 0x1e, 0x36, 0x20, 0x06, 0x45, 0x24, 0x98, 0x99, 0x78, 0xfe, 0xda, + 0xa8, 0x58, 0xb3, 0x10, 0x71, 0xf5, 0xb3, 0x3c, 0x59, 0xca, 0x86, 0xca, + 0xc5, 0xf6, 0x79, 0xcf, 0x34, 0x4a, 0xd0, 0x55, 0xbf, 0xc7, 0xd9, 0x95, + 0xec, 0xfd, 0x1c, 0xd8, 0x68, 0x3a, 0xb2, 0x56, 0xb6, 0xc8, 0x3d, 0x47, + 0x88, 0xc1, 0x9b, 0x79, 0x68, 0x75, 0x0c, 0x1b, 0x8c, 0x30, 0xc7, 0xa3, + 0xf4, 0x4c, 0x0c, 0x56, 0xd4, 0xb0, 0xac, 0x7e, 0x73, 0x59, 0xc5, 0x77, + 0x1c, 0x68, 0x87, 0x4e, 0xfb, 0x96, 0x23, 0x33, 0x91, 0x51, 0xad, 0x2d, + 0xfe, 0xdc, 0xdf, 0xac, 0x0e, 0x52, 0x99, 0x1b, 0xb1, 0xdd, 0x71, 0x4f, + 0x14, 0xa1, 0x95, 0x8f, 0x41, 0x7d, 0x06, 0x82, 0x95, 0x5d, 0x55, 0x74, + 0xd2, 0x4c, 0x69, 0xb3, 0xed, 0xf2, 0xc7, 0x4a, 0x50, 0xed, 0x74, 0x09, + 0xdc, 0xc1, 0x77, 0xe1, 0x34, 0xce, 0x42, 0x2d, 0x28, 0xa9, 0x45, 0xd7, + 0x60, 0x0e, 0x64, 0x70, 0xe6, 0x67, 0x88, 0x5f, 0x4a, 0xb4, 0x59, 0xba, + 0x04, 0x7f, 0x16, 0x65, 0xcf, 0xb7, 0x78, 0x76, 0x44, 0xfb, 0x33, 0xe0, + 0xcf, 0xf9, 0x5b, 0x41, 0xe6, 0x90, 0x2e, 0xd2, 0xf6, 0x0e, 0x4f, 0x93, + 0xd5, 0xd0, 0xce, 0x3f, 0x32, 0x3f, 0x43, 0xab, 0x6f, 0x10, 0x0c, 0xe6, + 0x40, 0x5e, 0x96, 0x6c, 0xc3, 0x13, 0xad, 0xb9, 0xf9, 0xd0, 0xcd, 0x25, + 0x1c, 0xf8, 0x6d, 0x1b, 0x9c, 0x5d, 0x72, 0xdf, 0x16, 0x05, 0x5b, 0xa2, + 0x68, 0x93, 0xf0, 0x48, 0x49, 0x48, 0xfb, 0xec, 0xd8, 0xa7, 0x1e, 0x38, + 0xc7, 0xb5, 0x1f, 0xde, 0xf2, 0x73, 0x2a, 0x27, 0x2b, 0x05, 0xfe, 0xe1, + 0xce, 0xde, 0x4a, 0x14, 0xcf, 0x0b, 0x89, 0x4e, 0xd1, 0xac, 0x66, 0xe3, + 0xe4, 0x03, 0xfe, 0x48, 0x36, 0xe1, 0x65, 0xd2, 0xc2, 0x64, 0x52, 0x16, + 0x82, 0xbf, 0x63, 0x1a, 0xd5, 0x14, 0xff, 0x60, 0x43, 0xf0, 0xfc, 0xd0, + 0x05, 0x3b, 0xcb, 0x8b, 0xf8, 0x46, 0xb6, 0x78, 0x0a, 0x97, 0xae, 0xf3, + 0xa2, 0x3e, 0x7e, 0x0b, 0x83, 0x9e, 0xaf, 0x61, 0x0a, 0xba, 0xae, 0x0b, + 0xed, 0x23, 0xef, 0x04, 0xa9, 0xd2, 0x6e, 0x4d, 0x64, 0xc5, 0x6d, 0x55, + 0x64, 0x53, 0x9d, 0xb6, 0x0e, 0xe9, 0xe7, 0x25, 0xe1, 0x68, 0x32, 0x88, + 0x30, 0x57, 0xcd, 0x88, 0xfb, 0xbe, 0x49, 0x9c, 0xe3, 0xfa, 0xf3, 0x79, + 0x08, 0x11, 0x5d, 0xd8, 0xa2, 0x8d, 0xeb, 0x51, 0x28, 0xd3, 0xcc, 0xdf, + 0xe7, 0x51, 0xa0, 0xe6, 0xec, 0xf5, 0x49, 0xc6, 0xc6, 0x93, 0xcf, 0xd7, + 0x56, 0x53, 0x36, 0x6b, 0x1a, 0xea, 0x3c, 0x3e, 0xe7, 0x1d, 0x1e, 0x3d, + 0x40, 0xcd, 0x33, 0x14, 0xff, 0x1a, 0x92, 0x4c, 0xb4, 0x20, 0xdb, 0xb7, + 0x94, 0xa6, 0x92, 0x11, 0x39, 0x0a, 0x23, 0xdc, 0xa5, 0x77, 0x06, 0x09, + 0xfc, 0x97, 0xc0, 0xcb, 0xb0, 0xb1, 0x7f, 0x5c, 0x94, 0x66, 0xd2, 0x07, + 0x3c, 0x44, 0x75, 0xf9, 0xfb, 0x8b, 0x85, 0x01, 0x82, 0xdf, 0x5e, 0x2f, + 0xc0, 0xab, 0x21, 0xc0, 0xe7, 0xed, 0x40, 0x06, 0x39, 0x55, 0xe2, 0x55, + 0x15, 0x5f, 0x46, 0x4b, 0x32, 0x6a, 0xe9, 0x65, 0x00, 0x2b, 0x00, 0xe3, + 0x12, 0x66, 0xe0, 0x71, 0x1c, 0x61, 0x0a, 0x2c, 0x5a, 0xb9, 0x62, 0x63, + 0x10, 0x85, 0x21, 0x85, 0x5e, 0x76, 0x86, 0x25, 0x6b, 0x7f, 0x0f, 0x95, + 0x65, 0xaa, 0xda, 0x19, 0x18, 0xb1, 0xe2, 0x52, 0x3b, 0x65, 0xea, 0x2e, + 0x53, 0x7c, 0x09, 0x96, 0xad, 0x23, 0x30, 0x59, 0xe9, 0x81, 0xe3, 0x9e, + 0x56, 0x0b, 0x4d, 0x0b, 0xa6, 0xda, 0x21, 0x04, 0x0a, 0x1e, 0xa3, 0xf7, + 0x2b, 0x39, 0x9b, 0xa6, 0x06, 0xc6, 0x78, 0x1e, 0x06, 0x3e, 0x45, 0xd2, + 0xe8, 0x35, 0x07, 0x74, 0xaa, 0x69, 0xd2, 0x1f, 0xd0, 0x14, 0x75, 0x38, + 0x16, 0x95, 0xd5, 0xa0, 0xde, 0x40, 0x9c, 0xda, 0xbb, 0x8f, 0x6e, 0x1a, + 0x89, 0x78, 0xd6, 0x46, 0x12, 0x25, 0xfb, 0x7e, 0xee, 0xaf, 0x65, 0xef, + 0xf8, 0x54, 0x37, 0x17, 0x7c, 0x3d, 0xcf, 0xcf, 0x3f, 0x42, 0x00, 0x34, + 0x30, 0x48, 0x66, 0x00, 0x90, 0xea, 0xbb, 0xc8, 0x9e, 0xda, 0xfa, 0xbb, + 0xb4, 0xb7, 0x2a, 0xf6, 0x27, 0x81, 0xca, 0x08, 0x7f, 0x86, 0x05, 0xf4, + 0xc2, 0x19, 0x88, 0x7c, 0x83, 0x1d, 0x78, 0x00, 0x99, 0xc2, 0xb2, 0x16, + 0x20, 0x1e, 0x9e, 0x5a, 0x5e, 0x66, 0x03, 0xa7, 0xc3, 0x3a, 0xc6, 0x52, + 0xf0, 0xab, 0xf4, 0xee, 0x88, 0x7c, 0x59, 0xfa, 0x9a, 0x20, 0xa2, 0xb8, + 0xd9, 0x01, 0x1c, 0xcb, 0xf7, 0x8a, 0x1d, 0xb5, 0x22, 0x77, 0x3e, 0xcb, + 0x68, 0xdf, 0x63, 0xab, 0x0a, 0x53, 0x51, 0xb8, 0xe1, 0x38, 0xe1, 0x74, + 0x4b, 0x64, 0x5a, 0x47, 0x10, 0x14, 0xb8, 0xd8, 0x82, 0xa4, 0xf1, 0xbc, + 0x6d, 0xcb, 0x33, 0xff, 0x4e, 0xf9, 0xd5, 0x9c, 0x4e, 0x55, 0x73, 0xf2, + 0xac, 0x09, 0xb3, 0xbe, 0x32, 0xcf, 0x56, 0x55, 0xef, 0xb4, 0x3c, 0x3c, + 0x9f, 0xb1, 0xdd, 0x5e, 0x49, 0x58, 0xd3, 0x64, 0xce, 0xd0, 0x89, 0xe2, + 0x57, 0x42, 0x20, 0x68, 0x7e, 0x64, 0x29, 0x17, 0xfb, 0xde, 0x33, 0x77, + 0xc3, 0x4c, 0x25, 0xbb, 0x76, 0x93, 0x58, 0x4f, 0xb7, 0x16, 0x78, 0xce, + 0x0d, 0xb9, 0xa4, 0x38, 0xeb, 0x5c, 0x4b, 0xb6, 0x80, 0x28, 0x9a, 0xde, + 0xfe, 0xe7, 0x8b, 0xcc, 0x41, 0xe2, 0x08, 0x8b, 0xee, 0xdf, 0xeb, 0x8d, + 0xfb, 0xbb, 0xa2, 0xf6, 0xbe, 0x47, 0x10, 0x37, 0xe9, 0x6e, 0xf4, 0x67, + 0x0c, 0x0f, 0x69, 0xe3, 0xf8, 0xc8, 0x11, 0x11, 0x41, 0xe0, 0xf2, 0xba, + 0x87, 0x24, 0x9c, 0xbe, 0x2b, 0xc1, 0x63, 0x76, 0x32, 0x35, 0x0c, 0x76, + 0x68, 0xec, 0x0b, 0x6c, 0x0a, 0x4b, 0x25, 0x87, 0xc1, 0x4a, 0x9c, 0x83, + 0xe5, 0x83, 0x6f, 0xc2, 0xa1, 0xaf, 0xc0, 0x18, 0x69, 0xf7, 0xf2, 0x8a, + 0x5e, 0x25, 0x20, 0xd6, 0x7e, 0x52, 0x90, 0x05, 0x9e, 0x8b, 0x99, 0x5b, + 0x8e, 0x5d, 0x4b, 0x87, 0xff, 0xa9, 0xa6, 0xfd, 0xe5, 0xd4, 0x78, 0xed, + 0x03, 0x17, 0xe3, 0x13, 0xe7, 0xd6, 0xdf, 0x24, 0x9d, 0xc9, 0x57, 0x01, + 0xcc, 0x25, 0xc0, 0xbc, 0x53, 0x88, 0x0d, 0x02, 0xbd, 0xd0, 0x37, 0x0c, + 0xa4, 0x23, 0xbb, 0xea, 0xef, 0x6a, 0x33, 0xb7, 0x16, 0x98, 0x90, 0x21, + 0x59, 0x47, 0x7f, 0x9a, 0xb2, 0x0d, 0x7c, 0xda, 0xf8, 0xd2, 0x2d, 0xdc, + 0x7d, 0xdf, 0xa7, 0x1a, 0x85, 0xbf, 0x63, 0xb8, 0x0d, 0x8a, 0x2e, 0x46, + 0x2e, 0x60, 0xcf, 0x19, 0x51, 0x05, 0x09, 0x0e, 0x1b, 0xb6, 0x92, 0xb1, + 0xfa, 0xeb, 0x74, 0xdc, 0x2d, 0x42, 0x6f, 0x0a, 0xe7, 0x28, 0xe1, 0x39, + 0x61, 0x41, 0xde, 0xb3, 0x78, 0x4f, 0x97, 0x88, 0x53, 0xf3, 0x65, 0x99, + 0xbe, 0x00, 0xce, 0x0f, 0xe9, 0x5f, 0xdf, 0x29, 0x67, 0xae, 0xf2, 0x76, + 0x4c, 0xcd, 0x90, 0x1c, 0xb2, 0x7f, 0x84, 0x16, 0x4a, 0x60, 0x62, 0xf6, + 0x7e, 0xdb, 0x4c, 0x9a, 0x6f, 0xc4, 0x1a, 0x9a, 0xa8, 0xaa, 0xe9, 0xee, + 0x85, 0xc3, 0xcd, 0x1a, 0x00, 0x99, 0x51, 0x3e, 0x50, 0x98, 0xcd, 0x43, + 0x64, 0x16, 0xae, 0xc3, 0xb4, 0x56, 0x7c, 0xf6, 0xaf, 0xc1, 0x53, 0x82, + 0x29, 0x5f, 0xa5, 0x7b, 0x16, 0xe5, 0xa9, 0x41, 0x1c, 0xc3, 0x32, 0xaf, + 0x49, 0x29, 0x44, 0x6c, 0x72, 0xda, 0xa9, 0xb0, 0x0e, 0xe7, 0x44, 0x6b, + 0x18, 0xf2, 0xa5, 0xa5, 0x08, 0x72, 0x73, 0xbd, 0x03, 0xa1, 0x8d, 0xb6, + 0x12, 0x6a, 0x32, 0x2b, 0xb4, 0xf4, 0xcf, 0xa8, 0x8d, 0x51, 0xe0, 0x59, + 0xa6, 0x44, 0x62, 0x2b, 0x6f, 0x6c, 0x3d, 0xe5, 0x04, 0xc2, 0x61, 0x90, + 0xc4, 0x88, 0x14, 0x81, 0x67, 0x42, 0x45, 0xe1, 0x10, 0x5b, 0x91, 0xe6, + 0x8a, 0x29, 0xdf, 0x15, 0x7c, 0x62, 0xa9, 0x28, 0xd5, 0x9a, 0x32, 0x3a, + 0x27, 0x44, 0xac, 0x5f, 0x86, 0xac, 0x2f, 0x5d, 0x08, 0x74, 0x9c, 0xa0, + 0x3f, 0x9f, 0xfe, 0x14, 0xdd, 0x4a, 0x98, 0xfd, 0xd2, 0x31, 0xd7, 0xaf, + 0x56, 0xbb, 0x95, 0x63, 0xb7, 0xf7, 0xe4, 0x77, 0x6f, 0x11, 0xab, 0xa2, + 0xb7, 0xb4, 0xf3, 0x18, 0x6f, 0xdf, 0x1a, 0xd6, 0xca, 0x6b, 0x0c, 0xe2, + 0x4d, 0x0e, 0xc3, 0x79, 0xd0, 0xa6, 0xd0, 0x83, 0x6f, 0x9e, 0x5d, 0xd6, + 0xd8, 0xfc, 0x2d, 0xc1, 0x24, 0xf4, 0xd0, 0x6f, 0x45, 0xa3, 0xed, 0x5b, + 0x5d, 0x2c, 0x53, 0x8d, 0xae, 0xb6, 0x7d, 0x43, 0x73, 0x86, 0x88, 0x4c, + 0xda, 0xd1, 0x17, 0xa2, 0x46, 0x13, 0xee, 0xad, 0xb2, 0x2f, 0x01, 0x7d, + 0x8a, 0x17, 0xf2, 0x50, 0xef, 0x8c, 0x2e, 0x0a, 0x20, 0x9c, 0xa1, 0xef, + 0x3b, 0x79, 0x30, 0x99, 0xc2, 0x55, 0xc2, 0x9b, 0x2c, 0xa3, 0x94, 0x50, + 0xdd, 0x36, 0xaf, 0x6d, 0xbf, 0x6f, 0xd1, 0xa9, 0x1a, 0x21, 0x82, 0x53, + 0xc4, 0x45, 0xd8, 0xdb, 0xf2, 0x0e, 0x37, 0x56, 0x29, 0xff, 0x5b, 0xc6, + 0x9c, 0xe7, 0x8a, 0x8e, 0xac, 0xee, 0x7b, 0xe3, 0x0b, 0xac, 0x3d, 0xff, + 0xd4, 0xc9, 0xd4, 0x1d, 0xc8, 0x6a, 0x23, 0x09, 0x7a, 0xb4, 0x44, 0x8f, + 0x50, 0x5e, 0x48, 0x3f, 0x5d, 0xbd, 0x7b, 0xcf, 0x1d, 0x4d, 0x82, 0x6e, + 0x04, 0x75, 0xc6, 0x2b, 0x3f, 0x79, 0xe9, 0xdc, 0x45, 0x98, 0x1a, 0x47, + 0xdb, 0xe0, 0x71, 0xcb, 0x49, 0x83, 0xad, 0x57, 0x09, 0x83, 0x89, 0xc4, + 0x8b, 0x59, 0x7e, 0x7c, 0x33, 0x21, 0x34, 0x4f, 0xc3, 0x24, 0x1d, 0xc8, + 0x5e, 0x07, 0xf5, 0x45, 0xdb, 0xe7, 0xdd, 0x76, 0x3b, 0xdb, 0x74, 0xc4, + 0x3c, 0x37, 0x3d, 0xbe, 0xf5, 0xd4, 0xad, 0x61, 0x09, 0x59, 0xbe, 0x32, + 0x00, 0x29, 0x76, 0x52, 0x09, 0xca, 0xd4, 0x71, 0x6a, 0xfb, 0xfe, 0x0e, + 0xda, 0xdd, 0xfa, 0x2d, 0xf2, 0xbe, 0xf9, 0xab, 0x8a, 0x70, 0x63, 0xd0, + 0xb4, 0x8a, 0x71, 0x85, 0x1a, 0xaf, 0x95, 0xd2, 0xf5, 0x03, 0xb1, 0x8b, + 0x76, 0x65, 0x56, 0x39, 0xaf, 0x75, 0xa1, 0x71, 0xee, 0x54, 0xd5, 0xd5, + 0x5d, 0x64, 0xfb, 0x0a, 0x3f, 0x69, 0x8e, 0xef, 0x75, 0xac, 0x07, 0x17, + 0x18, 0xe6, 0x77, 0xca, 0xa6, 0x20, 0xd8, 0xe3, 0x79, 0x3e, 0xd4, 0xd0, + 0x07, 0x0c, 0x94, 0xcf, 0xe2, 0xcd, 0xf1, 0x37, 0x3d, 0x0c, 0x0b, 0xa5, + 0xdf, 0xb2, 0xcc, 0xdf, 0x18, 0xda, 0xdf, 0xbc, 0x85, 0xf8, 0xbb, 0x05, + 0xf8, 0x14, 0x68, 0x55, 0xf9, 0x36, 0xfa, 0x9d, 0xb6, 0xa9, 0xb4, 0x63, + 0x63, 0xdf, 0x52, 0x5b, 0xc1, 0x17, 0xe8, 0x28, 0x5b, 0x5d, 0x97, 0x96, + 0xf4, 0x17, 0x04, 0x55, 0x6f, 0xa7, 0x56, 0x03, 0x86, 0x95, 0x08, 0xee, + 0xd2, 0x00, 0x60, 0xf5, 0x02, 0xd7, 0x93, 0x7c, 0x20, 0xab, 0xc2, 0xfa, + 0x69, 0x05, 0x85, 0x81, 0x57, 0x75, 0xdb, 0xa1, 0xa2, 0xa5, 0xfd, 0x7e, + 0xe1, 0xc4, 0xbe, 0x16, 0x8d, 0x00, 0xad, 0x2e, 0xf0, 0xb5, 0xa8, 0x44, + 0xeb, 0x0f, 0x8b, 0x0c, 0x46, 0x92, 0xb0, 0xd2, 0x4d, 0xd1, 0x30, 0x1f, + 0xec, 0xe2, 0xcb, 0x8e, 0x06, 0xa3, 0x83, 0xcb, 0xa5, 0x9f, 0x0e, 0x8e, + 0x4f, 0x52, 0x60, 0x1a, 0xb5, 0x32, 0x20, 0x63, 0xd8, 0x45, 0xb2, 0x8a, + 0xb7, 0xc0, 0xdc, 0x0d, 0x6f, 0x1f, 0xf9, 0xa5, 0x61, 0x28, 0x2d, 0x8f, + 0xb3, 0x37, 0x1c, 0x1b, 0xd2, 0x2d, 0xb6, 0xf6, 0xca, 0xd1, 0x6a, 0x9d, + 0x62, 0x2d, 0xb8, 0x89, 0xb9, 0x2f, 0xca, 0x98, 0x4b, 0x8c, 0x69, 0x43, + 0x8a, 0x68, 0x2c, 0xf5, 0xff, 0x61, 0xe0, 0x71, 0x13, 0x15, 0x12, 0x25, + 0xf2, 0x28, 0xd0, 0x07, 0x6d, 0x2b, 0xd6, 0x3a, 0x12, 0x71, 0x13, 0x70, + 0x71, 0xbe, 0x2f, 0x02, 0x9c, 0x89, 0x8b, 0x6d, 0xe1, 0xcf, 0x44, 0x23, + 0x1a, 0x0c, 0xd5, 0x8e, 0x59, 0x4c, 0xe3, 0x38, 0xff, 0xa5, 0x2c, 0xb2, + 0x13, 0x51, 0x4a, 0xc3, 0x60, 0x75, 0x07, 0x13, 0x34, 0xbf, 0x49, 0xd1, + 0xd4, 0xeb, 0x17, 0xf6, 0x20, 0xa1, 0x2c, 0xbf, 0xc2, 0x0b, 0x32, 0xb8, + 0xc0, 0x98, 0xed, 0x5a, 0xa2, 0x29, 0x11, 0xb8, 0x9c, 0xa2, 0xc8, 0xef, + 0xcc, 0x0b, 0xa4, 0xc3, 0x4a, 0x8d, 0xac, 0x7b, 0xfb, 0xe9, 0x0d, 0x59, + 0xa5, 0xf3, 0x08, 0xee, 0x39, 0x00, 0x1d, 0x57, 0x36, 0xc3, 0xd4, 0x98, + 0xbc, 0x91, 0xea, 0x7a, 0x81, 0x6d, 0x35, 0x3d, 0x9f, 0x11, 0xd2, 0x1b, + 0xdf, 0x0d, 0x50, 0x7e, 0xf0, 0xf3, 0xb7, 0xe2, 0x22, 0x66, 0xc5, 0xe3, + 0xde, 0x58, 0x3f, 0x11, 0x61, 0x76, 0x63, 0xfc, 0x39, 0xb1, 0xee, 0x20, + 0x67, 0x97, 0x9f, 0x94, 0x0c, 0xa0, 0x45, 0xe1, 0x7e, 0x38, 0x18, 0x10, + 0xf2, 0x46, 0x15, 0x8e, 0x2b, 0xab, 0x00, 0x65, 0x11, 0xca, 0x48, 0xbb, + 0x09, 0xfa, 0x4c, 0xe2, 0x76, 0xad, 0xfc, 0x70, 0x04, 0xe4, 0x5f, 0x03, + 0xeb, 0x80, 0x77, 0x67, 0x37, 0x18, 0xda, 0x06, 0x1b, 0xe3, 0x0f, 0x45, + 0xeb, 0xfb, 0x08, 0x09, 0xa3, 0x29, 0x4b, 0x72, 0x66, 0x8f, 0x4e, 0xc6, + 0x88, 0x56, 0xcc, 0x71, 0xe7, 0x53, 0x63, 0xb5, 0x9e, 0x8a, 0x74, 0xd8, + 0xfe, 0x70, 0xbc, 0x39, 0x19, 0x19, 0x49, 0x4e, 0xc3, 0x80, 0xe9, 0x63, + 0x8e, 0x8c, 0xeb, 0x68, 0x6a, 0xcb, 0x22, 0xda, 0x47, 0x1a, 0xf3, 0xfc, + 0xca, 0x5e, 0x7e, 0x16, 0x7e, 0x62, 0x1f, 0x4c, 0x2b, 0x99, 0x81, 0xba, + 0x92, 0x2e, 0x8e, 0xe8, 0xef, 0xe2, 0x6f, 0x25, 0xe4, 0xd1, 0x58, 0x67, + 0xba, 0x94, 0x1e, 0xba, 0xa8, 0xa3, 0x41, 0xc9, 0x2d, 0xbe, 0xfe, 0xd4, + 0xb5, 0x2e, 0x11, 0xc8, 0xfc, 0xa3, 0x7e, 0x3d, 0x61, 0x72, 0x65, 0xb2, + 0x01, 0xad, 0xfb, 0xfc, 0xfd, 0x29, 0x48, 0xfb, 0x76, 0xd9, 0x14, 0xd7, + 0x2d, 0xf3, 0x21, 0xca, 0xab, 0x82, 0xb8, 0x65, 0xbf, 0xe9, 0x14, 0x8a, + 0xd3, 0xbe, 0x42, 0xc7, 0x62, 0xf6, 0x84, 0xd0, 0xc4, 0x00, 0x54, 0xb6, + 0x1b, 0xc4, 0x87, 0x91, 0x26, 0x8d, 0x1a, 0x9e, 0xc6, 0x38, 0x69, 0xb9, + 0xe2, 0x64, 0xfe, 0x3e, 0x12, 0x20, 0xce, 0xbe, 0x30, 0xf9, 0x06, 0xb5, + 0xd6, 0x05, 0x9a, 0x0d, 0xfd, 0x78, 0x4e, 0xd4, 0xf1, 0x7e, 0xbb, 0x2f, + 0x40, 0x20, 0xb1, 0x5e, 0xb2, 0xc0, 0x20, 0xd9, 0xe7, 0x87, 0xb4, 0xdf, + 0x93, 0x53, 0x90, 0xfc, 0x53, 0xc3, 0x5b, 0x3a, 0xb2, 0x72, 0xb1, 0xe1, + 0xf6, 0x9d, 0x9f, 0x2c, 0x1c, 0xba, 0x05, 0xf3, 0xcd, 0x22, 0x6b, 0xf7, + 0x06, 0x35, 0xdb, 0x17, 0xe7, 0xa0, 0x1b, 0xa6, 0x01, 0x4b, 0xca, 0x8c, + 0xcd, 0xaf, 0xd1, 0xfd, 0xfc, 0x7a, 0xe5, 0x5d, 0x1d, 0xcf, 0x88, 0x61, + 0x90, 0x74, 0x71, 0x42, 0xc6, 0x5b, 0x19, 0xa9, 0x3c, 0x5a, 0x10, 0xc3, + 0x47, 0xdb, 0xbe, 0xea, 0x91, 0x2c, 0x08, 0x98, 0x65, 0x7a, 0x8a, 0xc4, + 0xbe, 0xbf, 0x02, 0xd0, 0x4e, 0x0e, 0xaa, 0x1f, 0xb0, 0x92, 0x28, 0xe9, + 0xce, 0x2c, 0x50, 0x4d, 0xa5, 0xbc, 0x30, 0xa6, 0xc4, 0xba, 0xb4, 0x2d, + 0x7b, 0x8f, 0x5d, 0x53, 0x3b, 0x21, 0xb7, 0x0b, 0x75, 0x4a, 0x23, 0x73, + 0xc4, 0x7d, 0x3b, 0x5f, 0xdf, 0x3c, 0xe9, 0x2d, 0x81, 0x32, 0xe3, 0x1d, + 0x59, 0xcb, 0xd7, 0x2e, 0xfb, 0x0a, 0x61, 0x03, 0xca, 0x10, 0xf8, 0xf2, + 0x8b, 0xf2, 0x46, 0xb9, 0x40, 0x1f, 0x38, 0xad, 0xfe, 0x78, 0x00, 0xf1, + 0xb2, 0x77, 0x0c, 0x22, 0xe6, 0xcc, 0x8a, 0xf8, 0x89, 0x0c, 0xd4, 0x6d, + 0xd1, 0x82, 0x25, 0xca, 0x5b, 0xf1, 0x8f, 0x11, 0x3d, 0xdc, 0x7e, 0xfe, + 0x3c, 0x6a, 0x65, 0x37, 0xc7, 0x06, 0x96, 0x65, 0xb3, 0x0a, 0x57, 0x78, + 0x65, 0xc1, 0x65, 0x75, 0xfe, 0xb7, 0xd6, 0xd8, 0xf5, 0x3c, 0x0b, 0x8b, + 0xec, 0x47, 0x0a, 0xb0, 0x0b, 0x1b, 0x26, 0x4b, 0xe0, 0xc3, 0xd8, 0x44, + 0x51, 0xef, 0x9b, 0xb7, 0xe1, 0x79, 0xb6, 0x74, 0xd3, 0x78, 0x29, 0x45, + 0xb5, 0xe1, 0xca, 0xa7, 0x01, 0xea, 0x90, 0x36, 0xd6, 0x8c, 0x38, 0xec, + 0x59, 0xac, 0x03, 0x27, 0xf1, 0xe8, 0x43, 0xb5, 0xdf, 0x52, 0xbe, 0x84, + 0xef, 0x22, 0xb3, 0xb9, 0x45, 0xaf, 0xe7, 0x33, 0x9e, 0x08, 0x5d, 0xbe, + 0x19, 0xe0, 0xb6, 0xce, 0x87, 0xad, 0x7f, 0x38, 0xac, 0x23, 0x26, 0x15, + 0x73, 0x28, 0x56, 0x2c, 0x21, 0xee, 0x03, 0xb5, 0x0f, 0x9c, 0x60, 0x2f, + 0xf9, 0x1d, 0x77, 0xad, 0xd1, 0x05, 0x30, 0x91, 0x68, 0x7d, 0x04, 0x34, + 0xf2, 0xef, 0xe8, 0x82, 0xec, 0x6f, 0x12, 0xe6, 0x33, 0x17, 0x07, 0xfa, + 0x6a, 0xb6, 0x56, 0x79, 0xf0, 0xc3, 0x9c, 0xc7, 0xbd, 0x82, 0x48, 0xbb, + 0x4d, 0x1d, 0x53, 0x36, 0xc4, 0x9b, 0xc9, 0x45, 0xa9, 0x53, 0x6d, 0xd2, + 0x6e, 0x4a, 0x2a, 0x5a, 0x3b, 0x9a, 0xcb, 0x16, 0x12, 0x71, 0xe3, 0xd8, + 0x89, 0x16, 0x66, 0x00, 0x79, 0x1c, 0x57, 0x96, 0xc9, 0x97, 0x0b, 0x5f, + 0x40, 0x36, 0xd3, 0xec, 0x47, 0x67, 0xa7, 0xe7, 0x30, 0x94, 0xeb, 0xfb, + 0xfb, 0x4e, 0x1e, 0x9a, 0xee, 0x5d, 0xb4, 0xf0, 0x91, 0xd1, 0xca, 0xb5, + 0xf2, 0x0a, 0xcf, 0xa8, 0xea, 0x59, 0x5a, 0xf4, 0x92, 0x27, 0x8e, 0x71, + 0x47, 0x7f, 0xb6, 0x77, 0xd6, 0x62, 0xc4, 0x21, 0xe0, 0x0f, 0xdb, 0x88, + 0x03, 0x73, 0xf3, 0x65, 0x9f, 0x7a, 0x7c, 0x83, 0x56, 0xa3, 0x73, 0x42, + 0x18, 0x03, 0xcd, 0x83, 0x74, 0xbe, 0x14, 0x73, 0x41, 0x61, 0x58, 0x54, + 0xf9, 0xd2, 0x73, 0xbc, 0x19, 0x65, 0x09, 0x33, 0x81, 0x58, 0x1e, 0x81, + 0x58, 0xda, 0x23, 0x41, 0x14, 0xe8, 0xe0, 0x0d, 0x68, 0x62, 0x9a, 0xe8, + 0xc1, 0xc1, 0xa9, 0x03, 0xc2, 0xb3, 0x32, 0x76, 0x94, 0x4b, 0x56, 0x18, + 0x88, 0x9a, 0xfb, 0xee, 0x12, 0x5b, 0x7e, 0x20, 0xf7, 0x2c, 0xd1, 0xd1, + 0x53, 0xb5, 0xba, 0xad, 0x8e, 0x51, 0x39, 0x44, 0xfe, 0xd3, 0x39, 0x88, + 0x7f, 0xbf, 0xf8, 0x7e, 0xd1, 0x81, 0x46, 0x4f, 0x82, 0x01, 0xf7, 0x3b, + 0xff, 0xf4, 0x4d, 0xad, 0x0a, 0xdc, 0x4a, 0xfe, 0xf0, 0x21, 0x15, 0xaa, + 0xe6, 0xe2, 0x5f, 0x58, 0xe4, 0xa0, 0xde, 0x75, 0xde, 0xdf, 0xdc, 0x91, + 0x8a, 0x91, 0x9e, 0xae, 0xec, 0x1c, 0x86, 0x6f, 0xe2, 0x7f, 0xd5, 0x7e, + 0x7f, 0x4e, 0x9c, 0x59, 0x2c, 0x69, 0x17, 0x46, 0x81, 0x44, 0x59, 0xb7, + 0xf8, 0x3b, 0xc6, 0x7d, 0xd9, 0x6a, 0x98, 0xcc, 0x1c, 0xb8, 0xba, 0x8b, + 0x8c, 0xb6, 0x81, 0xa9, 0x30, 0x82, 0xa5, 0xd6, 0x30, 0x1a, 0xae, 0x44, + 0x11, 0x2e, 0x5c, 0xf8, 0x18, 0xb3, 0xb0, 0x5c, 0xec, 0xe7, 0x17, 0x49, + 0x71, 0xac, 0x33, 0x3d, 0xe3, 0x13, 0xc6, 0x95, 0xbb, 0x02, 0x32, 0x5e, + 0xe9, 0xc6, 0x93, 0x56, 0xb4, 0xbc, 0x7c, 0x28, 0x0f, 0x39, 0x24, 0x5b, + 0x02, 0xd1, 0x05, 0xf0, 0xe6, 0x57, 0x08, 0xe7, 0xbf, 0xeb, 0x0d, 0x88, + 0x2c, 0x11, 0x41, 0xac, 0xaa, 0xcb, 0x65, 0x5e, 0x16, 0x90, 0x4c, 0xc1, + 0xa8, 0xcf, 0xce, 0x1e, 0x75, 0x67, 0xcb, 0x57, 0x5c, 0xe6, 0x36, 0x8f, + 0xbd, 0x66, 0x2b, 0x4d, 0xcb, 0x77, 0x76, 0x9f, 0x20, 0x9d, 0x2c, 0x20, + 0xdd, 0x8c, 0xd3, 0xe0, 0xc7, 0x77, 0xc9, 0x9a, 0xd1, 0xd1, 0x73, 0x05, + 0xd2, 0x73, 0x8d, 0xee, 0xd4, 0x99, 0xe7, 0xe8, 0x55, 0x08, 0x09, 0x6c, + 0xc1, 0x6b, 0x9f, 0x22, 0x38, 0xdc, 0x8b, 0xe9, 0x68, 0x92, 0x2c, 0x2b, + 0x9c, 0xbb, 0x12, 0x38, 0x49, 0x67, 0xde, 0xca, 0x3b, 0xd6, 0x4e, 0x82, + 0xe3, 0xea, 0x83, 0x6f, 0x7b, 0x96, 0x99, 0x0f, 0xc4, 0x04, 0xb9, 0x37, + 0xdb, 0x1a, 0x6e, 0x5f, 0xe5, 0x68, 0x16, 0x96, 0x3f, 0xf6, 0xe5, 0xbe, + 0xa6, 0xa7, 0x8a, 0x89, 0x73, 0xee, 0x70, 0x58, 0xf5, 0x56, 0x23, 0x09, + 0x9e, 0x2d, 0x34, 0xa8, 0x34, 0x9a, 0xb0, 0x89, 0xd5, 0x08, 0x53, 0x84, + 0x11, 0x1d, 0x93, 0xee, 0x65, 0x21, 0xa7, 0x3b, 0x7c, 0xc2, 0x63, 0xa4, + 0xb6, 0xbc, 0x3c, 0xd8, 0x63, 0x29, 0xa9, 0xa2, 0x2d, 0x68, 0x51, 0xb7, + 0xf4, 0x8f, 0xf9, 0x11, 0xdf, 0x72, 0xe3, 0x46, 0xa8, 0x9d, 0x96, 0xb3, + 0xb5, 0xcd, 0xef, 0xd8, 0x9c, 0xb3, 0xca, 0x24, 0xc2, 0x31, 0xcf, 0x9e, + 0x5c, 0x7d, 0xe2, 0x08, 0x79, 0x5c, 0xce, 0x54, 0x01, 0x95, 0xaf, 0x2f, + 0x67, 0x9e, 0x77, 0x56, 0x4f, 0xcc, 0x30, 0xff, 0x11, 0xec, 0x10, 0x44, + 0xa3, 0x9e, 0xf3, 0x84, 0xa3, 0x0a, 0x80, 0xff, 0xfb, 0x6a, 0xa3, 0xc9, + 0xf0, 0xe0, 0x57, 0x43, 0x63, 0xbc, 0xf6, 0x00, 0x52, 0x4b, 0x5b, 0xf7, + 0xcb, 0xf8, 0x7c, 0x7e, 0x02, 0x7f, 0x77, 0x8e, 0xde, 0xc4, 0x73, 0x2f, + 0x8f, 0x34, 0x2c, 0x38, 0x8d, 0xa9, 0xb9, 0xe8, 0x23, 0xa6, 0x19, 0x4a, + 0xcf, 0x58, 0x8b, 0x0a, 0xae, 0x4a, 0x99, 0x76, 0x9e, 0x18, 0x58, 0x8a, + 0xcd, 0xdc, 0x00, 0x83, 0x69, 0x98, 0xa8, 0x4b, 0x0e, 0x3f, 0xa1, 0x1a, + 0xbb, 0x73, 0xbe, 0xfd, 0xb3, 0x6f, 0x53, 0x13, 0xd1, 0xcc, 0x9b, 0x9d, + 0x07, 0x61, 0x37, 0xad, 0xe1, 0x8e, 0xf8, 0xa4, 0xf5, 0x50, 0xff, 0x31, + 0x62, 0xcc, 0x5b, 0x31, 0xae, 0x0a, 0x28, 0xe2, 0x8e, 0x6d, 0x9c, 0x5a, + 0xf0, 0xb3, 0x83, 0x16, 0x3f, 0xd5, 0x88, 0x99, 0x0e, 0x66, 0x67, 0xcc, + 0x8e, 0x91, 0x14, 0x7c, 0x1a, 0xc6, 0x7f, 0xa8, 0xb9, 0x85, 0xa2, 0x38, + 0x72, 0x24, 0xd2, 0x39, 0xc2, 0xb3, 0xbe, 0x11, 0xef, 0xeb, 0x5e, 0x3d, + 0x72, 0x12, 0xd6, 0xe1, 0xa2, 0x45, 0x29, 0x8b, 0x3a, 0x9a, 0x69, 0x4e, + 0xbd, 0x0e, 0x9e, 0xbe, 0x64, 0x08, 0xa2, 0xc4, 0x97, 0x54, 0x76, 0xeb, + 0x06, 0x70, 0xb5, 0x41, 0x26, 0x11, 0x97, 0xf5, 0xac, 0xb7, 0xe3, 0xbd, + 0xca, 0x47, 0x28, 0x8d, 0x59, 0x0c, 0xc7, 0xfd, 0xe2, 0x2d, 0xf3, 0xb1, + 0x8e, 0x9a, 0x99, 0xad, 0xf9, 0xf1, 0xab, 0xf3, 0x4a, 0xba, 0x26, 0x1e, + 0xf9, 0xf9, 0xc9, 0x07, 0xbc, 0x61, 0x47, 0xfe, 0x1d, 0x6a, 0x96, 0x24, + 0x1c, 0x19, 0x23, 0xbb, 0xa0, 0x9a, 0xb3, 0x86, 0xb1, 0xe5, 0xdd, 0x0c, + 0x4f, 0xa8, 0xe0, 0x8c, 0x6e, 0xff, 0x55, 0xc8, 0xa6, 0x00, 0x0a, 0x85, + 0xf0, 0x93, 0xeb, 0xa8, 0x6a, 0x28, 0x5a, 0x04, 0x47, 0xb1, 0x96, 0x99, + 0x02, 0xde, 0x4f, 0xf5, 0xd2, 0x9e, 0x0d, 0x6a, 0xa0, 0x06, 0x1a, 0xac, + 0x56, 0xc5, 0x73, 0xbd, 0x94, 0xd2, 0xe3, 0xa3, 0x18, 0x6b, 0x3a, 0xec, + 0x74, 0x9c, 0xcd, 0x75, 0x31, 0x9a, 0x24, 0x04, 0xf5, 0xd5, 0x80, 0x59, + 0xe5, 0xc7, 0x74, 0xd2, 0x45, 0x5c, 0x90, 0xa1, 0xd4, 0x54, 0x29, 0x20, + 0xc9, 0x94, 0x84, 0xc0, 0x5e, 0x89, 0x02, 0x60, 0x2d, 0x42, 0x85, 0x10, + 0x62, 0xf4, 0xcf, 0x97, 0xc4, 0x13, 0xe8, 0xc9, 0xdb, 0xfb, 0xfb, 0x4d, + 0x21, 0xe7, 0x6a, 0x3e, 0xc6, 0x2d, 0x49, 0xd8, 0x55, 0x93, 0x8c, 0x66, + 0xa0, 0x4f, 0xf3, 0xe1, 0xed, 0x30, 0xb4, 0x43, 0x82, 0x8e, 0x32, 0xd4, + 0xd1, 0xd4, 0xb7, 0xa2, 0x9e, 0x02, 0x3a, 0xc1, 0x1c, 0x43, 0x7f, 0xb0, + 0x37, 0x32, 0x5f, 0xec, 0x52, 0x97, 0x9b, 0x8b, 0x4d, 0xc0, 0xe7, 0x3e, + 0x12, 0xfa, 0x11, 0xf7, 0x78, 0xb3, 0x85, 0xcc, 0x77, 0x56, 0xd0, 0x89, + 0xf0, 0xa5, 0x62, 0x48, 0xd2, 0xd7, 0x1e, 0x93, 0xf6, 0xb4, 0x12, 0xec, + 0xb4, 0x9f, 0x81, 0x6f, 0xa1, 0xd5, 0x53, 0x44, 0x7a, 0x95, 0x60, 0x60, + 0xe5, 0x11, 0x98, 0x6f, 0x42, 0x6b, 0xe4, 0xb3, 0x60, 0x89, 0xe2, 0x42, + 0x5a, 0xca, 0x0d, 0x75, 0x41, 0x58, 0x4b, 0x1a, 0xda, 0x4e, 0x64, 0x7d, + 0xe4, 0xc0, 0xb2, 0x98, 0x28, 0x9b, 0x02, 0x52, 0x7b, 0x93, 0xcd, 0x01, + 0x0b, 0xfe, 0x4a, 0xe9, 0x5b, 0x56, 0x7e, 0x53, 0x93, 0x00, 0x27, 0x4d, + 0xf3, 0xe3, 0xba, 0x97, 0x31, 0xd7, 0x0f, 0x1f, 0xb7, 0xa6, 0x55, 0x35, + 0xf3, 0x33, 0xdc, 0x9f, 0xad, 0xb5, 0xd6, 0x4c, 0xa9, 0x26, 0xe3, 0x3d, + 0xa0, 0x83, 0x31, 0x40, 0x85, 0x31, 0xae, 0x3e, 0xdb, 0x48, 0xca, 0x70, + 0x2e, 0x84, 0x1e, 0xe3, 0xc3, 0xa8, 0x98, 0xd5, 0xa5, 0x00, 0xea, 0x56, + 0xe6, 0xe7, 0x66, 0x33, 0xce, 0x2d, 0xae, 0xe7, 0x4f, 0xba, 0x28, 0x58, + 0x9d, 0xf7, 0x3e, 0xac, 0x56, 0x08, 0xe4, 0x53, 0x0d, 0x43, 0x9f, 0x51, + 0xec, 0x26, 0x0b, 0x13, 0x42, 0xd8, 0x9c, 0x6f, 0xc7, 0xac, 0x3b, 0x1d, + 0xa1, 0x56, 0x82, 0x99, 0x2f, 0xe4, 0xfc, 0x30, 0x0d, 0x1b, 0x58, 0xbb, + 0xf6, 0xf9, 0x95, 0xd0, 0xe6, 0xf5, 0x02, 0xef, 0xb4, 0xef, 0x5e, 0x74, + 0xa9, 0xaa, 0x42, 0x34, 0x9e, 0x16, 0xcb, 0xc0, 0x7e, 0x21, 0x29, 0x5a, + 0x11, 0x81, 0x8f, 0xb3, 0xf8, 0x28, 0xab, 0x31, 0xf6, 0x78, 0x00, 0x0d, + 0xe4, 0x65, 0x2b, 0xd5, 0xbf, 0x87, 0x55, 0x2e, 0x2e, 0x44, 0x05, 0x72, + 0x88, 0x15, 0x6d, 0x35, 0xc0, 0x16, 0xb5, 0x1f, 0x1f, 0xa2, 0xe0, 0x68, + 0x8c, 0x9d, 0x69, 0x94, 0xe0, 0x5a, 0x40, 0x3f, 0x14, 0xdb, 0xf9, 0x8e, + 0x6e, 0x61, 0x0a, 0x23, 0xb3, 0xee, 0x70, 0x11, 0xa3, 0x9d, 0x13, 0x14, + 0x21, 0xcc, 0xfb, 0x61, 0x98, 0x35, 0x2a, 0x9d, 0x6a, 0x94, 0x5f, 0x44, + 0x08, 0x8c, 0x31, 0xdb, 0xa8, 0x19, 0xc7, 0x30, 0x21, 0xf0, 0xcc, 0x1c, + 0x49, 0x11, 0xfb, 0xe7, 0xd2, 0xf8, 0x5b, 0x78, 0x12, 0x7c, 0x1f, 0x93, + 0xa5, 0x4d, 0x19, 0xb6, 0x04, 0x6b, 0xc0, 0x55, 0x97, 0x31, 0xfa, 0x51, + 0xaf, 0x1d, 0xc6, 0x91, 0x62, 0xa6, 0x2b, 0x31, 0xd8, 0xca, 0x76, 0x86, + 0x50, 0xe5, 0xdc, 0x88, 0x48, 0x44, 0xc8, 0x79, 0xdc, 0x42, 0xc2, 0x1f, + 0x54, 0x85, 0x77, 0xde, 0x70, 0x48, 0xa8, 0x72, 0x1a, 0x2d, 0x4f, 0x38, + 0xc1, 0xb4, 0x1d, 0x46, 0x38, 0x3c, 0x1c, 0xd5, 0xa2, 0x27, 0xf9, 0x55, + 0x0c, 0x9b, 0x7b, 0xb4, 0x25, 0x4c, 0x51, 0xa9, 0xfa, 0xa1, 0xab, 0x30, + 0x5f, 0xbf, 0x72, 0x29, 0x24, 0xcf, 0xcf, 0xe5, 0x78, 0xfc, 0xfb, 0xbc, + 0x2f, 0xa1, 0x90, 0xd4, 0x25, 0x73, 0x83, 0xc2, 0x0d, 0x92, 0x28, 0xb9, + 0xf8, 0x41, 0x9a, 0x8e, 0x10, 0x1c, 0xfd, 0xad, 0x37, 0x98, 0x3d, 0x38, + 0xd3, 0x02, 0x77, 0xbd, 0x17, 0xf6, 0xda, 0x0d, 0x36, 0x75, 0x6f, 0x85, + 0xb3, 0xca, 0x86, 0x4d, 0xe2, 0xad, 0xbe, 0xed, 0x98, 0xd6, 0xd5, 0x0b, + 0x9f, 0xe3, 0x55, 0x70, 0x71, 0x64, 0x26, 0x9c, 0xa1, 0xf7, 0xcc, 0x02, + 0xa3, 0x95, 0xfe, 0xa2, 0xbd, 0xb5, 0xee, 0x17, 0xaa, 0xe6, 0x03, 0xeb, + 0xf1, 0x9c, 0x28, 0x68, 0x60, 0x66, 0xb7, 0xfc, 0xf2, 0xda, 0xf9, 0x24, + 0x1f, 0x62, 0xe8, 0x56, 0x72, 0x9d, 0x89, 0x06, 0x69, 0xaa, 0x03, 0x42, + 0xda, 0x43, 0x33, 0x88, 0x3e, 0xe4, 0x36, 0x40, 0x69, 0x45, 0xbf, 0x01, + 0x64, 0xa3, 0x3d, 0x45, 0xd3, 0x2c, 0xd3, 0x10, 0x96, 0x8e, 0xaa, 0xfe, + 0x5b, 0xcc, 0x5d, 0xe6, 0x77, 0xc2, 0xda, 0xa1, 0x8d, 0xd8, 0x00, 0xb0, + 0x3b, 0x33, 0xeb, 0xbc, 0x35, 0x37, 0x28, 0x38, 0x12, 0x9b, 0xdf, 0xc9, + 0xfe, 0xe5, 0x5a, 0xe3, 0x09, 0x31, 0xdb, 0x0e, 0x24, 0x60, 0x81, 0x39, + 0xbb, 0xba, 0x09, 0xd3, 0x2d, 0x30, 0xf2, 0x03, 0x10, 0x43, 0x06, 0x08, + 0x1c, 0x67, 0xa0, 0xb5, 0x69, 0x30, 0x6c, 0x24, 0x34, 0x80, 0x2c, 0x9c, + 0xe5, 0xfa, 0x36, 0xbe, 0x13, 0xc9, 0x06, 0x43, 0x54, 0x69, 0x6e, 0x2d, + 0xd1, 0x67, 0xeb, 0x9b, 0x51, 0x27, 0x6d, 0x70, 0x84, 0x40, 0xb7, 0xc6, + 0x32, 0x4e, 0xd7, 0xbb, 0xd3, 0x13, 0x36, 0xd7, 0x27, 0xae, 0xa6, 0x7b, + 0x03, 0x10, 0x2c, 0xcd, 0x5f, 0x6c, 0x69, 0x87, 0xc3, 0x93, 0x74, 0x71, + 0x91, 0xbf, 0x0a, 0x45, 0xe4, 0x95, 0x86, 0x0b, 0xf8, 0x26, 0xb8, 0xa1, + 0x6d, 0x67, 0xd5, 0xf9, 0xde, 0xea, 0x34, 0x80, 0x74, 0xd3, 0x48, 0x72, + 0xfb, 0x93, 0x9f, 0xdb, 0x5b, 0x89, 0xad, 0x62, 0x30, 0x3f, 0x1f, 0xf1, + 0x4a, 0x4c, 0x0e, 0xec, 0x94, 0xa5, 0xca, 0x13, 0xf5, 0x51, 0xc1, 0x7c, + 0x2f, 0xb3, 0x51, 0x93, 0xe7, 0x7f, 0xf5, 0x9e, 0x4a, 0x4a, 0xcc, 0x4d, + 0xdf, 0x2d, 0x24, 0x17, 0xf0, 0xc0, 0x4f, 0x9d, 0x4a, 0x25, 0xe4, 0xd5, + 0x32, 0xfb, 0x06, 0xf3, 0x3e, 0xfd, 0xc4, 0xf9, 0xe9, 0x36, 0xfc, 0x0c, + 0xab, 0x9a, 0xb1, 0xf1, 0x79, 0xd1, 0x86, 0xe0, 0xa8, 0x42, 0x28, 0xdb, + 0x40, 0x43, 0xf2, 0x91, 0x06, 0x6a, 0xcf, 0x68, 0xe9, 0x90, 0xc1, 0x0c, + 0x23, 0xfb, 0x69, 0xb2, 0xbe, 0xa3, 0x3e, 0x9b, 0xb4, 0x2b, 0x52, 0xc8, + 0x5e, 0x87, 0x7c, 0x90, 0x6e, 0xba, 0xb9, 0x15, 0xb7, 0xab, 0x66, 0x06, + 0x37, 0xc1, 0x99, 0x6e, 0xbb, 0xb4, 0x31, 0x17, 0x48, 0xa9, 0x7f, 0xa5, + 0x55, 0x85, 0x23, 0x5e, 0x65, 0x4d, 0x49, 0xa7, 0x7f, 0x62, 0x3e, 0x98, + 0x28, 0x53, 0x77, 0x5b, 0xb0, 0x8e, 0xe2, 0x15, 0x4a, 0x7b, 0x52, 0xb7, + 0x48, 0xd4, 0x2a, 0xce, 0x7d, 0x0e, 0xc9, 0x23, 0xcf, 0xde, 0xc7, 0x0e, + 0x7b, 0x59, 0xb6, 0xb5, 0xc3, 0xf6, 0xb2, 0xfa, 0xa9, 0x9c, 0xd2, 0x08, + 0xf5, 0xd3, 0x08, 0x29, 0xd9, 0xd9, 0x7c, 0xab, 0x64, 0x74, 0xdd, 0x88, + 0xfe, 0x0e, 0x75, 0x67, 0x72, 0xc3, 0xc1, 0x9a, 0x2c, 0xe8, 0xbe, 0xd6, + 0xcb, 0xb6, 0x7b, 0x71, 0x8e, 0xd3, 0xbc, 0xa3, 0x9d, 0xd2, 0x4d, 0x88, + 0xf9, 0xbb, 0xed, 0xfa, 0x4b, 0xe4, 0x8c, 0x11, 0xd0, 0xb1, 0xdd, 0x1e, + 0xdf, 0x33, 0xb4, 0x0a, 0x00, 0xfd, 0x2d, 0x9f, 0xc1, 0x84, 0x28, 0xd3, + 0xbe, 0x62, 0x47, 0x38, 0xb6, 0xa2, 0x43, 0x7d, 0x9e, 0xfa, 0x52, 0x35, + 0x84, 0x29, 0x20, 0xb2, 0x04, 0x35, 0xeb, 0xca, 0x15, 0x11, 0xf4, 0xa6, + 0xe0, 0xc5, 0x1c, 0xad, 0x13, 0x33, 0xc8, 0xe8, 0x92, 0x4f, 0x37, 0x22, + 0x05, 0x9b, 0x56, 0x3d, 0x5c, 0xe2, 0x81, 0x84, 0xf8, 0xcb, 0x7b, 0xf3, + 0x60, 0xd0, 0x04, 0x28, 0x3f, 0x6f, 0x7a, 0x40, 0xaa, 0xde, 0x4b, 0xdf, + 0xf0, 0xdd, 0xf8, 0x35, 0xd2, 0xb1, 0xc2, 0xcf, 0x3c, 0x05, 0xd4, 0xfb, + 0x05, 0x1f, 0xa6, 0x35, 0xe2, 0x77, 0x30, 0x45, 0x00, 0xae, 0x52, 0xaa, + 0x0f, 0x76, 0xd7, 0x4b, 0xdd, 0xcc, 0x1b, 0x63, 0x57, 0x39, 0xa4, 0x3d, + 0x9b, 0x49, 0xa8, 0x51, 0x8e, 0x6d, 0x50, 0xeb, 0xdc, 0xed, 0x28, 0xc8, + 0x45, 0xbe, 0xe1, 0xbe, 0x60, 0xdc, 0x4a, 0xd9, 0x86, 0x31, 0xe4, 0x49, + 0xd7, 0xee, 0x81, 0xf1, 0x95, 0xbf, 0x8c, 0x1b, 0x97, 0xac, 0xc9, 0xcf, + 0x9e, 0xf5, 0x77, 0x81, 0xf6, 0xe7, 0x50, 0xb8, 0xf2, 0x7c, 0x64, 0x0a, + 0x3a, 0xe2, 0xa0, 0xfd, 0x0d, 0x49, 0xc0, 0x37, 0x17, 0xee, 0x4e, 0x20, + 0x34, 0xbe, 0xd1, 0x75, 0xa4, 0xea, 0x04, 0x30, 0x7e, 0xda, 0x56, 0x28, + 0x7b, 0x4a, 0x77, 0x70, 0xd3, 0x89, 0x98, 0x1b, 0x20, 0x53, 0x9e, 0xe3, + 0x9c, 0x33, 0xa2, 0x6d, 0xac, 0x62, 0x36, 0xb2, 0x3e, 0x4d, 0xe2, 0x27, + 0x84, 0x7d, 0x9d, 0xc5, 0x5b, 0xba, 0x1f, 0xcc, 0x28, 0xe1, 0x05, 0xe0, + 0x4e, 0x34, 0x79, 0x99, 0x71, 0x04, 0xdf, 0x6d, 0x07, 0x39, 0x3c, 0x3e, + 0xf5, 0x8a, 0xfe, 0x41, 0x32, 0xbf, 0xc1, 0x53, 0x87, 0x0d, 0x07, 0x9d, + 0xb9, 0x50, 0x8f, 0x08, 0xcd, 0x3b, 0xa5, 0x43, 0xbb, 0x4e, 0xc0, 0xb8, + 0xc0, 0xd0, 0x79, 0x0e, 0xad, 0x3f, 0xc0, 0x1b, 0x4c, 0xc9, 0x37, 0xda, + 0x8f, 0x04, 0x3f, 0xb1, 0xaf, 0xa9, 0x92, 0x01, 0x4f, 0x0b, 0x53, 0x22, + 0x43, 0xa7, 0x3b, 0x4a, 0x75, 0x71, 0xa0, 0xab, 0x05, 0x74, 0x67, 0x3b, + 0x1f, 0x12, 0x30, 0x9e, 0xac, 0xf9, 0x9d, 0xf0, 0xa8, 0xd9, 0xcd, 0xa7, + 0xc1, 0x1f, 0x33, 0xb6, 0x1f, 0xd7, 0xed, 0x81, 0x0d, 0x96, 0xab, 0x5c, + 0xd0, 0x87, 0xad, 0x98, 0x50, 0x30, 0x9a, 0xfd, 0xe8, 0xd3, 0x24, 0x47, + 0x45, 0xd7, 0x1e, 0x76, 0x87, 0x23, 0xdf, 0x5b, 0xcb, 0x6c, 0x94, 0xae, + 0x08, 0xa3, 0x05, 0xc9, 0xf7, 0xb7, 0xb9, 0xf2, 0x13, 0xf1, 0xce, 0xce, + 0x83, 0xa1, 0x61, 0xf1, 0xa3, 0xb0, 0x86, 0x18, 0x08, 0xf4, 0x6d, 0xe8, + 0xfd, 0x83, 0x1b, 0xde, 0x90, 0x86, 0xbf, 0xbb, 0xe6, 0x7f, 0xf9, 0x50, + 0x84, 0xec, 0x37, 0x24, 0xfb, 0x78, 0x07, 0x3e, 0x15, 0x09, 0x5e, 0xa6, + 0x82, 0x01, 0x76, 0xe7, 0xc5, 0x06, 0x5c, 0x03, 0xf6, 0xe2, 0x2a, 0x9f, + 0xb7, 0x34, 0x3c, 0xeb, 0xd2, 0xf3, 0x92, 0x75, 0xa3, 0x5f, 0x34, 0x0c, + 0xb9, 0x71, 0xfa, 0xd5, 0x95, 0xc9, 0x39, 0x7d, 0xd7, 0x2f, 0x14, 0xcb, + 0x77, 0x01, 0x41, 0x10, 0x7b, 0x86, 0xb5, 0xcf, 0x07, 0x7d, 0x8a, 0x7c, + 0x61, 0xee, 0x28, 0xe9, 0x6d, 0x4b, 0xdf, 0x2a, 0x26, 0xa5, 0x44, 0x84, + 0xe4, 0xec, 0x88, 0xde, 0x5d, 0x75, 0xc4, 0xb9, 0xf6, 0x7d, 0xb9, 0xbd, + 0x23, 0xc1, 0xbf, 0x67, 0x27, 0x2d, 0x00, 0xee, 0xee, 0x36, 0xb1, 0x3a, + 0x03, 0xfa, 0x45, 0x08, 0xb4, 0x97, 0x7d, 0x58, 0x48, 0x34, 0x50, 0x2e, + 0x9e, 0x95, 0x66, 0xc8, 0x66, 0xfc, 0xe1, 0x74, 0xfc, 0xd3, 0x7d, 0xd4, + 0x4b, 0xf0, 0x0f, 0x1b, 0x0f, 0x1e, 0x15, 0x08, 0x0b, 0x45, 0xb8, 0xae, + 0x1e, 0x0a, 0x8d, 0xa2, 0xa6, 0xc2, 0x44, 0x9f, 0xcc, 0x8c, 0xff, 0x06, + 0x60, 0xa4, 0x90, 0x9f, 0x8c, 0x43, 0x70, 0xf5, 0x96, 0x23, 0xc8, 0x22, + 0xa0, 0xda, 0x83, 0x6d, 0x56, 0x94, 0xdd, 0x6e, 0xa3, 0xbf, 0x20, 0x5b, + 0x1b, 0xfa, 0xc7, 0xb5, 0xba, 0xfa, 0xdb, 0xab, 0x11, 0x05, 0x54, 0x0b, + 0x6e, 0x49, 0x09, 0xff, 0xb8, 0xea, 0xba, 0x7f, 0xbd, 0x1e, 0x89, 0x72, + 0x57, 0x37, 0x89, 0x4c, 0x22, 0xad, 0x02, 0x9d, 0x2b, 0xca, 0x2a, 0xfa, + 0x95, 0x09, 0xf2, 0x4d, 0x6e, 0xfe, 0x96, 0xe8, 0x7d, 0xd3, 0xa8, 0xea, + 0x87, 0x27, 0xa7, 0xea, 0x32, 0x47, 0xb9, 0x2d, 0xaf, 0x6e, 0xe8, 0x77, + 0xf7, 0x4d, 0x3a, 0x90, 0xc7, 0x97, 0xb8, 0x06, 0x0c, 0x03, 0x40, 0x7d, + 0x89, 0x35, 0xe0, 0x9b, 0x7f, 0xb2, 0xdc, 0x5c, 0x6b, 0x00, 0xa8, 0xb3, + 0x87, 0xd2, 0x4f, 0x05, 0x21, 0x9e, 0x18, 0xf8, 0x7b, 0xd1, 0xc5, 0x5e, + 0xe0, 0x49, 0x03, 0xcf, 0x88, 0xe3, 0xe1, 0xc7, 0xfa, 0xb4, 0x3c, 0xe8, + 0x6c, 0x3a, 0x4e, 0xad, 0xaf, 0x2f, 0xc9, 0x1a, 0x67, 0xdf, 0x42, 0xb1, + 0x16, 0x97, 0xfb, 0xf5, 0x3f, 0x6d, 0x6e, 0x65, 0x27, 0xce, 0x4a, 0xc5, + 0xf4, 0x6b, 0xe9, 0x69, 0x94, 0x27, 0x9e, 0x58, 0x75, 0xf6, 0xc8, 0xfb, + 0x38, 0x4a, 0x57, 0xcc, 0x4b, 0x72, 0x4a, 0x31, 0x88, 0x99, 0x48, 0x0b, + 0xa3, 0x5a, 0x7e, 0x13, 0xf9, 0x14, 0x01, 0x71, 0x24, 0xcd, 0xb0, 0x41, + 0xfd, 0xd7, 0xdb, 0xf4, 0xce, 0xdb, 0xb3, 0x28, 0xac, 0x1f, 0xb9, 0xa2, + 0xe8, 0x99, 0xf8, 0x9c, 0x26, 0xb8, 0x22, 0x06, 0xa2, 0x04, 0xfc, 0x60, + 0x6b, 0x4e, 0xec, 0xe6, 0xf2, 0xd7, 0x83, 0x15, 0x07, 0x58, 0x32, 0x46, + 0xc5, 0x81, 0x02, 0x5e, 0x7a, 0xd6, 0x21, 0x3e, 0x3f, 0x1a, 0x7e, 0xe5, + 0x84, 0x50, 0x8b, 0xb4, 0xde, 0x06, 0xee, 0x98, 0x3f, 0xf1, 0x79, 0x89, + 0xc0, 0x11, 0x51, 0x02, 0xc3, 0x4a, 0x21, 0x01, 0x50, 0xe4, 0x4d, 0x68, + 0x90, 0x67, 0x01, 0x6f, 0x1a, 0x43, 0x63, 0xa9, 0xba, 0xcb, 0xe7, 0xe3, + 0x40, 0x18, 0xee, 0xe9, 0x3b, 0x57, 0xcf, 0x32, 0xf6, 0x3d, 0xf1, 0xd8, + 0x3c, 0xb8, 0x78, 0x5f, 0x53, 0x12, 0x35, 0x60, 0xe3, 0x7a, 0x69, 0xb4, + 0xf2, 0x9e, 0xc5, 0x1f, 0xa0, 0x50, 0xd9, 0xf7, 0xfa, 0xad, 0x61, 0xda, + 0x1e, 0x26, 0xa6, 0x67, 0xc7, 0x5f, 0x0c, 0xa2, 0xeb, 0xab, 0x75, 0xee, + 0x9d, 0x1c, 0x69, 0x03, 0x5e, 0x42, 0x58, 0x91, 0x3f, 0x0c, 0x2a, 0x06, + 0xc5, 0xff, 0x35, 0x4f, 0xc1, 0xa4, 0xc5, 0xfa, 0xed, 0x40, 0x25, 0x00, + 0xfb, 0xe7, 0x7a, 0xd0, 0xe9, 0xfb, 0x21, 0x5b, 0x24, 0xd3, 0xb5, 0x6f, + 0xa8, 0x40, 0xc3, 0x52, 0x4d, 0x0f, 0x2c, 0x1c, 0xae, 0x41, 0x36, 0xce, + 0x77, 0xfd, 0x00, 0x9f, 0x89, 0x38, 0xe8, 0x41, 0xca, 0x4c, 0x89, 0xc2, + 0x99, 0x9c, 0x45, 0x69, 0x58, 0x8a, 0x10, 0x79, 0xf9, 0x19, 0xe4, 0xf6, + 0xa0, 0x38, 0x43, 0xd5, 0x22, 0xda, 0xd5, 0x93, 0xe7, 0xe1, 0x51, 0x7a, + 0x0e, 0x60, 0xf1, 0xf7, 0x19, 0x11, 0x33, 0xa6, 0xd0, 0x44, 0x60, 0x35, + 0x58, 0x5b, 0xeb, 0x07, 0x7e, 0xea, 0x55, 0x3a, 0x7c, 0xd3, 0xe5, 0x12, + 0x67, 0x72, 0xad, 0x32, 0xd2, 0x21, 0xfa, 0x9c, 0x16, 0x01, 0x2c, 0x84, + 0x08, 0x94, 0xb6, 0xed, 0x49, 0xde, 0xd1, 0xda, 0x7b, 0x64, 0x25, 0xf8, + 0xcd, 0xae, 0xcd, 0x4f, 0x37, 0x6a, 0x4d, 0x9d, 0x26, 0xae, 0x49, 0x15, + 0x27, 0x22, 0x85, 0xeb, 0xf0, 0xdd, 0x17, 0x7b, 0x81, 0x91, 0x8e, 0xa2, + 0xe4, 0x19, 0x94, 0xec, 0xf1, 0xa8, 0x46, 0xfc, 0xea, 0xb1, 0x72, 0x5e, + 0x4b, 0x12, 0xa7, 0x1f, 0xb7, 0x78, 0xc6, 0xc8, 0xd8, 0x55, 0x07, 0xfe, + 0x05, 0x31, 0x81, 0x03, 0xb9, 0x3b, 0x11, 0x80, 0xce, 0xa4, 0xf7, 0x70, + 0x70, 0xf0, 0x13, 0xd5, 0xbe, 0xba, 0x56, 0x10, 0x3e, 0x78, 0x08, 0x8e, + 0x76, 0x78, 0xed, 0x52, 0x2d, 0xde, 0xd8, 0xa0, 0x7e, 0x2c, 0x72, 0xc1, + 0x17, 0x8b, 0xe9, 0x36, 0xc1, 0xdc, 0x9b, 0x59, 0x8a, 0xa8, 0x70, 0x2d, + 0x25, 0xf2, 0xc6, 0x31, 0x6a, 0x3e, 0x2a, 0x3f, 0x33, 0x1e, 0x9e, 0x04, + 0x84, 0x8f, 0xc0, 0xd5, 0xc0, 0xa5, 0xf5, 0xad, 0x0a, 0xa3, 0x83, 0x55, + 0xd7, 0xc6, 0x0a, 0x3d, 0xbb, 0x09, 0xbc, 0x5e, 0x49, 0x0c, 0x55, 0x54, + 0x68, 0xb0, 0x09, 0xaf, 0x67, 0xa1, 0xc4, 0x53, 0xca, 0x08, 0xf6, 0xa8, + 0x61, 0x3d, 0x38, 0xf3, 0x4f, 0xac, 0x92, 0x43, 0xcb, 0x03, 0x8d, 0x31, + 0xad, 0x83, 0x3d, 0x6c, 0xde, 0xe9, 0xf6, 0x5e, 0x04, 0x01, 0x9e, 0xb4, + 0xa5, 0xfc, 0xfa, 0xfc, 0xa0, 0x96, 0x09, 0x2c, 0x43, 0x95, 0x2c, 0x57, + 0xc1, 0x87, 0x58, 0x50, 0xec, 0xcf, 0xeb, 0xc8, 0x93, 0x85, 0x3a, 0x13, + 0x9c, 0x72, 0xf5, 0x6d, 0x86, 0x2e, 0x43, 0x0c, 0x61, 0x6b, 0x44, 0xaa, + 0xc4, 0xa4, 0x2d, 0xf2, 0x1c, 0xe8, 0x2f, 0x0b, 0xd2, 0x22, 0x9e, 0x24, + 0x97, 0x3d, 0x37, 0x18, 0x59, 0xa2, 0x15, 0xcc, 0x72, 0x67, 0xda, 0x22, + 0xd2, 0xcd, 0x81, 0x19, 0xb4, 0xbf, 0xf5, 0xf6, 0xf7, 0xec, 0xff, 0x0f, + 0x2a, 0xc7, 0x7a, 0xae, 0x2f, 0x20, 0x62, 0x18, 0xdf, 0x4f, 0x74, 0xa3, + 0x13, 0x0c, 0x7a, 0xe4, 0x2d, 0xa7, 0x93, 0x27, 0x87, 0x1b, 0x92, 0x0c, + 0x49, 0xea, 0x75, 0x18, 0xb5, 0x9f, 0xd1, 0xe8, 0xd4, 0x94, 0xf5, 0xd0, + 0x4e, 0x57, 0xd3, 0x71, 0x35, 0xb1, 0xe4, 0xc7, 0xd3, 0xc9, 0xf1, 0x97, + 0x39, 0x84, 0x9b, 0x37, 0xba, 0x5d, 0x7a, 0xfa, 0x94, 0xee, 0x4a, 0x19, + 0x84, 0x30, 0x42, 0xa6, 0xcd, 0xf7, 0xfb, 0x9a, 0x82, 0xef, 0xcf, 0xcf, + 0xdb, 0x51, 0x88, 0x63, 0xf6, 0x3a, 0xbd, 0x06, 0xb6, 0x57, 0xf0, 0x19, + 0x86, 0x91, 0xb8, 0x52, 0xb8, 0xb1, 0x9c, 0xfb, 0x52, 0x10, 0x48, 0xcb, + 0x5b, 0x19, 0x66, 0x8d, 0xc7, 0xb2, 0xc7, 0x41, 0xb5, 0xd0, 0x97, 0xfc, + 0x8d, 0x7a, 0xa8, 0xd2, 0x91, 0x68, 0xe6, 0x50, 0x81, 0x03, 0xa0, 0x78, + 0x0e, 0xe8, 0xfd, 0x8c, 0x2d, 0x74, 0xe7, 0x34, 0x84, 0x9d, 0xef, 0x67, + 0xfa, 0x49, 0x63, 0xef, 0xc9, 0x3f, 0xf9, 0x00, 0x9e, 0xac, 0x98, 0x5c, + 0xcc, 0x1c, 0xf8, 0x79, 0x02, 0xa5, 0xe2, 0x67, 0x49, 0x82, 0xb2, 0x28, + 0x02, 0xd0, 0x40, 0x7e, 0x7a, 0xf7, 0x80, 0x1b, 0x38, 0xfe, 0x8c, 0xe7, + 0x43, 0x81, 0xe1, 0x91, 0xef, 0x78, 0x2d, 0x3a, 0xa3, 0x8e, 0xca, 0xad, + 0x35, 0x76, 0x19, 0x50, 0xcb, 0x79, 0x0f, 0x73, 0x88, 0xf0, 0x05, 0xbe, + 0x5e, 0x91, 0x5a, 0xc9, 0x3b, 0x88, 0x27, 0x38, 0xc5, 0x6d, 0xae, 0x95, + 0x04, 0xe3, 0x20, 0x7f, 0x47, 0xfb, 0x4c, 0x54, 0xc1, 0xe4, 0xbe, 0x29, + 0x37, 0x26, 0x92, 0xe8, 0x84, 0x5d, 0x83, 0xcc, 0xa7, 0xa8, 0xae, 0x63, + 0xf3, 0xb4, 0x6f, 0x05, 0x48, 0x48, 0xd7, 0x8b, 0xb8, 0x02, 0x38, 0xc3, + 0xe9, 0xb2, 0x1f, 0x8c, 0x2e, 0xaa, 0x84, 0xc2, 0xa9, 0x1b, 0xfe, 0xed, + 0x6b, 0x6f, 0x1b, 0xe7, 0xe6, 0xd8, 0x07, 0xa1, 0x97, 0xd2, 0x21, 0x65, + 0xbe, 0x7a, 0x7c, 0x04, 0x83, 0xbb, 0xec, 0x03, 0x54, 0xb0, 0xf0, 0x63, + 0x5f, 0xfd, 0xe8, 0x32, 0xfe, 0x8d, 0x7f, 0xf0, 0xe2, 0xdc, 0x2d, 0xa3, + 0x8c, 0x18, 0xa7, 0x93, 0x71, 0x55, 0x84, 0x23, 0x5d, 0xcb, 0x7f, 0xde, + 0x6f, 0xb3, 0x7b, 0x2e, 0xe1, 0xcc, 0xc9, 0x5d, 0xec, 0xb5, 0xc2, 0x03, + 0x26, 0x02, 0x7a, 0xdb, 0x92, 0x6a, 0x61, 0xfb, 0x45, 0x41, 0x64, 0x35, + 0x91, 0xdc, 0xc5, 0xe9, 0xbc, 0x44, 0x87, 0x93, 0x81, 0x38, 0x36, 0x15, + 0xbc, 0xb0, 0xb2, 0x0d, 0x40, 0x70, 0x08, 0xc9, 0x6f, 0x33, 0x38, 0x6f, + 0x23, 0xfb, 0xe8, 0x81, 0xa2, 0xf7, 0xd0, 0x93, 0x14, 0xe0, 0xaf, 0x2e, + 0x0d, 0xda, 0x56, 0x8e, 0xd3, 0xd5, 0x5c, 0x41, 0x0a, 0x97, 0x53, 0x09, + 0x88, 0x5c, 0xcf, 0x41, 0x1a, 0xd6, 0xdc, 0x77, 0x87, 0xcd, 0xe2, 0xc2, + 0x9a, 0x75, 0xc3, 0xc3, 0x6b, 0x70, 0x1a, 0x8e, 0x83, 0xfe, 0x1c, 0xda, + 0xb7, 0xdd, 0x71, 0x9e, 0x35, 0x7c, 0x5e, 0xb9, 0xe5, 0x6d, 0x1f, 0x47, + 0x3a, 0x19, 0xf6, 0xd0, 0x25, 0x60, 0xd6, 0x2a, 0x74, 0x6c, 0x68, 0xd5, + 0xaa, 0xf2, 0x65, 0x0e, 0x6b, 0xf3, 0xa1, 0x35, 0x84, 0x84, 0xa6, 0x95, + 0xff, 0x4e, 0xcf, 0x22, 0x48, 0x71, 0xf6, 0x72, 0x3a, 0xf8, 0x2e, 0xe1, + 0xec, 0x28, 0x64, 0x1b, 0x9c, 0x51, 0x30, 0x1c, 0xec, 0x68, 0x55, 0x02, + 0x56, 0x0e, 0x16, 0xc7, 0x69, 0xd8, 0xfc, 0xb3, 0x7d, 0xac, 0xc3, 0xb9, + 0x28, 0x5e, 0x84, 0x45, 0x66, 0x75, 0x9f, 0xa2, 0xcb, 0x59, 0x24, 0x4b, + 0xb0, 0x1a, 0xc0, 0x3e, 0x10, 0xf5, 0x13, 0xab, 0x2e, 0x4b, 0xbe, 0xf6, + 0x6e, 0x7c, 0xb8, 0xda, 0xeb, 0x26, 0x42, 0x2d, 0xc5, 0x2d, 0x71, 0xe7, + 0x9a, 0x03, 0xac, 0xb2, 0x10, 0x56, 0x74, 0x89, 0x52, 0x9c, 0x61, 0x3e, + 0x07, 0x8d, 0x73, 0x81, 0x13, 0x8b, 0x79, 0x52, 0x2e, 0x94, 0x51, 0x99, + 0xb4, 0x16, 0xab, 0x15, 0xe1, 0x85, 0x43, 0x54, 0x76, 0x4a, 0xee, 0xb4, + 0x30, 0x23, 0x7c, 0xc1, 0x28, 0xbc, 0x0e, 0xe8, 0xc6, 0xe7, 0x49, 0x57, + 0x02, 0xb1, 0xcd, 0x47, 0x1b, 0x47, 0x35, 0x81, 0xa0, 0x3e, 0x83, 0xb6, + 0x5e, 0xc6, 0x22, 0xca, 0x6e, 0xa9, 0xb5, 0x1d, 0x05, 0x2f, 0x59, 0x1a, + 0xf9, 0x89, 0xf9, 0xd5, 0x35, 0xbc, 0xcd, 0x1e, 0xed, 0x10, 0xb7, 0x9c, + 0x94, 0xa6, 0x2a, 0x64, 0x3c, 0x2b, 0x0c, 0x5f, 0xb8, 0xba, 0x35, 0x47, + 0x1e, 0x61, 0xe0, 0x28, 0xd0, 0x62, 0xbc, 0x6c, 0x2a, 0xde, 0x1c, 0xb9, + 0x50, 0x94, 0xbf, 0x3f, 0x3d, 0x19, 0xf4, 0xcf, 0x11, 0x62, 0x8b, 0xec, + 0xe5, 0x8c, 0xc4, 0x67, 0x4c, 0xec, 0xf2, 0x33, 0x39, 0x32, 0xaf, 0x36, + 0x75, 0xff, 0xda, 0x8d, 0x2a, 0x12, 0x64, 0x19, 0xb5, 0x46, 0x7a, 0x71, + 0xe4, 0xef, 0x6e, 0xb8, 0x93, 0x00, 0xf4, 0x2f, 0x21, 0xf4, 0x88, 0x5c, + 0xb6, 0x12, 0x2a, 0xe2, 0xf3, 0xbc, 0x9b, 0xdb, 0xbe, 0x8a, 0x6c, 0xeb, + 0x0e, 0x30, 0x13, 0xae, 0x1f, 0xb5, 0xaa, 0x97, 0xbf, 0x0b, 0x1b, 0xe2, + 0xc7, 0x2a, 0xb9, 0xd9, 0x1c, 0xfd, 0x26, 0x61, 0x02, 0x59, 0xd2, 0x67, + 0x14, 0xf8, 0x36, 0x9f, 0x9c, 0x05, 0x3e, 0x86, 0xc1, 0x9c, 0x47, 0x13, + 0x80, 0xcf, 0xfa, 0x29, 0xe1, 0x24, 0xa2, 0x5e, 0x46, 0xff, 0xdd, 0xe1, + 0xd3, 0x72, 0xa4, 0x66, 0xd8, 0x5c, 0x54, 0x56, 0xc6, 0x67, 0xd3, 0xb5, + 0x5a, 0x54, 0x43, 0x17, 0xe7, 0x95, 0x1c, 0x4e, 0xfa, 0xaf, 0x31, 0x9b, + 0xe2, 0x66, 0x0f, 0x8c, 0xcc, 0x32, 0x8a, 0x7d, 0x67, 0x75, 0xff, 0xbb, + 0x97, 0x83, 0x02, 0xe3, 0x3a, 0x7e, 0xde, 0xd9, 0x95, 0x92, 0xc8, 0x28, + 0x62, 0x67, 0xfe, 0x5b, 0x6d, 0xf0, 0x53, 0x6d, 0x31, 0xbf, 0x73, 0x91, + 0xa3, 0x1e, 0x6c, 0xb5, 0x3c, 0xec, 0xaa, 0xc5, 0xa1, 0xa2, 0xa8, 0x44, + 0x98, 0x5a, 0x25, 0x01, 0xc7, 0xc9, 0x5e, 0xb4, 0x77, 0x7b, 0x71, 0xe3, + 0x1b, 0xce, 0xa2, 0xa6, 0x24, 0x65, 0x68, 0xf7, 0xe8, 0x59, 0xb9, 0x9c, + 0x06, 0xd3, 0x6e, 0x5f, 0x60, 0xac, 0x7b, 0x4f, 0xcf, 0x4b, 0xd1, 0x15, + 0x2c, 0x71, 0x19, 0x31, 0xa0, 0x15, 0x89, 0x16, 0x7d, 0x0a, 0xde, 0xf9, + 0x39, 0xaf, 0xcd, 0xb7, 0xdc, 0x95, 0x16, 0x8d, 0x98, 0x2c, 0xf5, 0x18, + 0xc6, 0xc6, 0x45, 0x4e, 0xd6, 0x4e, 0x46, 0x42, 0xe8, 0x31, 0x08, 0x6a, + 0x94, 0xa7, 0xe2, 0xe9, 0x77, 0x67, 0xdd, 0x72, 0x75, 0xdd, 0xe5, 0x7f, + 0x52, 0x44, 0x3e, 0x8a, 0xa2, 0x1c, 0xb7, 0x83, 0x7d, 0xc4, 0x07, 0x2b, + 0xa6, 0xa0, 0x22, 0x59, 0xce, 0x1c, 0x88, 0xc9, 0xb9, 0x3b, 0x0b, 0x11, + 0xc3, 0xf5, 0xe7, 0x52, 0x61, 0xdf, 0x88, 0xdb, 0x52, 0xa1, 0xcb, 0xc1, + 0xe0, 0xa7, 0x9d, 0xce, 0x4f, 0x24, 0x5e, 0xd7, 0xa3, 0xac, 0x81, 0x27, + 0x8a, 0x45, 0xf6, 0x15, 0xe1, 0x1f, 0x23, 0x31, 0x4e, 0xed, 0x39, 0xb1, + 0x65, 0xe3, 0x70, 0x3f, 0xb0, 0x7d, 0x50, 0x14, 0xca, 0xb0, 0x29, 0x62, + 0x4a, 0xb8, 0x63, 0xa6, 0xee, 0xbf, 0x37, 0xb9, 0x89, 0x0f, 0x42, 0xcc, + 0x94, 0xbc, 0x39, 0x51, 0x06, 0x82, 0xa3, 0xbc, 0x74, 0x3d, 0x1b, 0x7f, + 0xa3, 0xec, 0xef, 0xe6, 0x71, 0x7b, 0x63, 0x5d, 0xa9, 0xe1, 0xe2, 0x45, + 0x5f, 0xfd, 0xb3, 0xb3, 0xcf, 0xc4, 0xe8, 0xa2, 0x5d, 0x8f, 0x93, 0x73, + 0xbf, 0x88, 0xec, 0x6b, 0x06, 0x6d, 0xcc, 0x53, 0x55, 0xf4, 0xce, 0x02, + 0x69, 0xf9, 0x5c, 0x9b, 0xc6, 0x4f, 0x67, 0xec, 0x2b, 0x1c, 0xa4, 0xad, + 0x1e, 0x0e, 0x0a, 0x4f, 0x60, 0x6d, 0x23, 0x33, 0x87, 0x0d, 0xba, 0x91, + 0x5d, 0x97, 0xeb, 0xb2, 0x5a, 0x06, 0x63, 0xd7, 0xb1, 0x51, 0x3d, 0x70, + 0xe8, 0x38, 0xd7, 0xde, 0x4a, 0xca, 0x05, 0x26, 0xd5, 0x0b, 0x7f, 0x84, + 0x60, 0x9c, 0xd7, 0x84, 0x0f, 0x23, 0x97, 0x4a, 0x90, 0x71, 0xd8, 0x80, + 0xa9, 0x3e, 0x79, 0xcd, 0xce, 0x59, 0x8a, 0x1a, 0xba, 0xe9, 0xa8, 0xc5, + 0xfa, 0x30, 0xdf, 0xb4, 0xa1, 0x4b, 0x6c, 0x72, 0xe9, 0x82, 0x42, 0x04, + 0x65, 0x62, 0x4c, 0x5f, 0xe7, 0x05, 0x02, 0x7f, 0x49, 0xa8, 0x12, 0xa8, + 0xa1, 0xfa, 0x32, 0x33, 0x24, 0x9b, 0xdf, 0xcd, 0xe3, 0xf6, 0xb1, 0xda, + 0x11, 0xc3, 0xb9, 0xaf, 0xf9, 0x46, 0x20, 0xe8, 0x43, 0x19, 0xc2, 0x86, + 0xd5, 0x8e, 0x14, 0x57, 0xc8, 0xc2, 0xe7, 0xf3, 0xae, 0xbb, 0xfb, 0x76, + 0x0b, 0xd8, 0xc6, 0x9a, 0xe8, 0x2b, 0x99, 0xd3, 0x9c, 0x50, 0x92, 0x94, + 0xbf, 0x9d, 0xf5, 0xf3, 0xc2, 0x87, 0xf5, 0x0b, 0xb1, 0x69, 0x8d, 0x8a, + 0x55, 0x58, 0xed, 0xf3, 0xbc, 0x1d, 0x7e, 0xce, 0x5a, 0x5d, 0x8f, 0xee, + 0x46, 0xa7, 0xbb, 0xe3, 0xe3, 0x9d, 0x8f, 0xbb, 0xf6, 0x04, 0x09, 0xa9, + 0x3b, 0xf4, 0x9f, 0xe5, 0xd3, 0xdf, 0x15, 0xb6, 0x80, 0xb1, 0x6c, 0x05, + 0xef, 0x12, 0x35, 0x8f, 0xaf, 0x83, 0xa0, 0x63, 0xbb, 0x32, 0x14, 0x91, + 0x65, 0xee, 0xc5, 0x7d, 0x37, 0x60, 0x95, 0x11, 0x2e, 0x32, 0x09, 0xbb, + 0x5b, 0xd9, 0x7b, 0x79, 0xab, 0xc9, 0xac, 0xfd, 0x23, 0x63, 0x3f, 0x29, + 0xc3, 0x49, 0x1f, 0x73, 0xb8, 0x0e, 0xdf, 0x1e, 0x59, 0x3d, 0xc2, 0x8e, + 0xc9, 0xa6, 0x06, 0xe0, 0xba, 0xe4, 0x4e, 0x7d, 0x0a, 0x40, 0xdb, 0x49, + 0x43, 0x75, 0x69, 0xe9, 0xd6, 0x62, 0xe8, 0x73, 0x3d, 0x67, 0x71, 0xa8, + 0x4c, 0x11, 0xbf, 0x8d, 0x14, 0xf7, 0xed, 0xde, 0x1c, 0x3d, 0x88, 0x8a, + 0x5f, 0x1d, 0xbc, 0x5d, 0x92, 0x79, 0x80, 0xb9, 0xd3, 0xb2, 0xd2, 0x27, + 0x54, 0xc6, 0xbe, 0xdb, 0x1c, 0x09, 0x89, 0x5f, 0xbc, 0x43, 0x3a, 0xcc, + 0x95, 0xc4, 0x47, 0xf4, 0xd8, 0xe1, 0x77, 0x20, 0xbe, 0x32, 0x59, 0x1d, + 0xc1, 0x08, 0x58, 0x49, 0xea, 0x4f, 0x26, 0x62, 0x7a, 0x6d, 0xa7, 0x80, + 0x5e, 0xea, 0x93, 0x63, 0x0d, 0xb3, 0xfa, 0xfb, 0x68, 0xaf, 0x83, 0x74, + 0x61, 0xe9, 0xa0, 0x00, 0x12, 0x62, 0x77, 0x67, 0x04, 0x6a, 0xb9, 0xe7, + 0xd7, 0x2f, 0x7a, 0x0d, 0xc0, 0x84, 0x34, 0x52, 0xca, 0x5e, 0xf2, 0x94, + 0x63, 0xc8, 0x47, 0xc7, 0x65, 0xbb, 0xcc, 0xd5, 0x9c, 0xa2, 0x39, 0x22, + 0xd6, 0x78, 0x67, 0x23, 0x53, 0xde, 0xc3, 0x2f, 0xfc, 0x31, 0xcc, 0xe0, + 0x39, 0xc2, 0xb2, 0x99, 0x86, 0x1a, 0xf3, 0x57, 0x81, 0x75, 0xf4, 0xa8, + 0x30, 0xe1, 0xac, 0x5a, 0xb7, 0x8f, 0xc6, 0x6f, 0x7b, 0xb2, 0x3d, 0x30, + 0xd1, 0x4b, 0x0b, 0x71, 0xc1, 0x3a, 0x0b, 0xc5, 0x57, 0x28, 0x96, 0xf2, + 0x00, 0x1b, 0x0e, 0x49, 0x7c, 0x0b, 0xd0, 0xb5, 0xd4, 0x9d, 0xd3, 0xa8, + 0x19, 0xe5, 0x6d, 0xae, 0xbe, 0xc6, 0xcd, 0x0d, 0x22, 0x8e, 0xac, 0xca, + 0x3a, 0x60, 0x5c, 0xb8, 0x02, 0x82, 0x30, 0xd3, 0x01, 0xde, 0x6b, 0x63, + 0xbf, 0xc0, 0xe1, 0xf8, 0xe6, 0x1f, 0x93, 0xdf, 0x2e, 0xcd, 0x4f, 0x19, + 0x98, 0x67, 0xf3, 0x08, 0x78, 0x2d, 0x96, 0x49, 0xc5, 0x56, 0x29, 0x25, + 0x45, 0x61, 0x95, 0xbc, 0xca, 0xf5, 0x79, 0xfd, 0x0d, 0x23, 0xbb, 0x33, + 0x88, 0x2d, 0x0e, 0x24, 0x06, 0x5d, 0x2d, 0x66, 0x81, 0x8f, 0x20, 0x00, + 0x92, 0x4b, 0xe5, 0x56, 0xd2, 0x19, 0x0f, 0xf6, 0xf9, 0xb0, 0x7a, 0xf3, + 0xbb, 0x19, 0xe2, 0xf3, 0x34, 0xda, 0xcf, 0x29, 0xac, 0xd9, 0x80, 0x0c, + 0x60, 0x12, 0x56, 0x4c, 0x50, 0x84, 0x25, 0xb0, 0x31, 0x25, 0x37, 0xa0, + 0xd2, 0xbc, 0x53, 0xc0, 0x2a, 0x1c, 0x1d, 0x68, 0x28, 0xe8, 0x0c, 0x48, + 0x8d, 0x89, 0x09, 0x45, 0xc0, 0x96, 0xba, 0xad, 0xbb, 0xcf, 0xea, 0xae, + 0xcc, 0x44, 0xf8, 0xad, 0x7b, 0xa9, 0x35, 0xdb, 0x79, 0x25, 0xb5, 0xf7, + 0xe2, 0xc7, 0xb8, 0xa7, 0x3c, 0x6b, 0xa6, 0x00, 0x50, 0x8b, 0xd2, 0x85, + 0xc8, 0x93, 0x47, 0x69, 0x3e, 0x83, 0x16, 0xb8, 0xa0, 0x84, 0x56, 0x42, + 0xd4, 0x8f, 0xcb, 0xff, 0x78, 0x19, 0x0f, 0x01, 0xca, 0x62, 0xad, 0x88, + 0xda, 0x90, 0x40, 0xa1, 0xce, 0x5f, 0x19, 0xfe, 0xe6, 0x90, 0x42, 0x54, + 0xdf, 0x82, 0x91, 0x98, 0xad, 0xc1, 0x83, 0x1f, 0xe1, 0x73, 0x8a, 0xa5, + 0x2e, 0x11, 0x60, 0x8d, 0xf3, 0x10, 0x95, 0x0b, 0xcb, 0xe0, 0x7c, 0xd6, + 0xb0, 0x67, 0x54, 0x25, 0x61, 0x36, 0x82, 0x74, 0x69, 0xe7, 0x13, 0xd7, + 0xa2, 0x18, 0x00, 0x37, 0xf4, 0x12, 0xaf, 0xa8, 0x6e, 0x0c, 0xcd, 0xea, + 0xa2, 0x4b, 0x2e, 0xbd, 0x30, 0xcc, 0x5c, 0xc8, 0xd0, 0x33, 0x59, 0x14, + 0x24, 0xb0, 0x6e, 0xce, 0xc2, 0x0e, 0x69, 0xce, 0xa7, 0x3c, 0x71, 0x89, + 0x4f, 0x2c, 0x20, 0xf0, 0x52, 0x88, 0xcc, 0x19, 0xf7, 0x28, 0x2a, 0x37, + 0x59, 0x43, 0xba, 0xf2, 0x06, 0x83, 0xaf, 0x71, 0xea, 0xb2, 0x08, 0x45, + 0x03, 0xf4, 0xb1, 0x00, 0x5e, 0x3b, 0xf3, 0x97, 0xad, 0x1c, 0x1f, 0xc6, + 0x67, 0xdb, 0x0b, 0x7b, 0x93, 0x1c, 0x06, 0xad, 0x00, 0xd5, 0x6a, 0xd2, + 0x10, 0xf9, 0xe3, 0x24, 0x2c, 0x87, 0xee, 0x17, 0xf8, 0x6c, 0x68, 0xbc, + 0xb1, 0x6d, 0x45, 0xcf, 0x59, 0x84, 0x03, 0x44, 0x01, 0xce, 0x96, 0x0a, + 0x27, 0xed, 0xe4, 0x3d, 0xdd, 0x98, 0x14, 0x0d, 0x83, 0xf1, 0x92, 0x01, + 0xd2, 0x65, 0xee, 0x9a, 0xd5, 0x9e, 0x1e, 0xd8, 0x18, 0xe8, 0x44, 0x8c, + 0x39, 0xa7, 0x66, 0x27, 0x9d, 0x58, 0x99, 0xbc, 0xf6, 0x3d, 0xe0, 0x02, + 0x9e, 0x30, 0x84, 0xd3, 0x94, 0xd1, 0x07, 0x07, 0xa2, 0xf5, 0x24, 0xcc, + 0x3b, 0x1c, 0x3c, 0x84, 0xc1, 0x4a, 0x03, 0xa4, 0x0b, 0x70, 0x12, 0x42, + 0x9d, 0x92, 0xcb, 0x89, 0x37, 0x9b, 0xe7, 0x7e, 0xf6, 0xf4, 0x61, 0x24, + 0x82, 0x36, 0xe9, 0x7c, 0x72, 0x1a, 0x92, 0x86, 0xc0, 0xbb, 0x84, 0xb9, + 0x8d, 0x85, 0x6c, 0xfc, 0x18, 0xed, 0xbb, 0x61, 0x63, 0x6e, 0xd4, 0xf2, + 0x20, 0x83, 0x19, 0x69, 0x54, 0xfc, 0x75, 0x14, 0x61, 0x1c, 0x60, 0xee, + 0x0e, 0xb0, 0xd1, 0x90, 0x65, 0xd0, 0xe8, 0x88, 0x39, 0x77, 0xa6, 0xed, + 0x08, 0x7e, 0x51, 0x73, 0xa4, 0xb2, 0xd5, 0x86, 0xce, 0xcc, 0x91, 0x8a, + 0xf9, 0x48, 0x13, 0x5b, 0x7e, 0xae, 0x05, 0xfe, 0x8e, 0x12, 0xe4, 0x3f, + 0x25, 0xb7, 0x11, 0xd8, 0xb7, 0x09, 0xd8, 0xda, 0xf9, 0xc2, 0xf2, 0x24, + 0xbe, 0x30, 0x33, 0x63, 0xfc, 0x2d, 0x11, 0xeb, 0x06, 0x8a, 0x9f, 0x54, + 0xd3, 0x35, 0x1f, 0x6c, 0x77, 0xa0, 0x8c, 0xa1, 0xdd, 0xb6, 0x8a, 0x34, + 0x41, 0x2b, 0x3d, 0x03, 0xef, 0xeb, 0x19, 0xe0, 0xee, 0x55, 0x3b, 0xaf, + 0x5e, 0x94, 0xe0, 0x77, 0x47, 0x49, 0xfe, 0xc2, 0xfa, 0x55, 0x6d, 0xb6, + 0xb3, 0x3d, 0xdf, 0x69, 0x1f, 0x15, 0x02, 0x2d, 0xa9, 0x45, 0xb8, 0x46, + 0x0c, 0xea, 0xbe, 0x4f, 0xcc, 0x3b, 0x75, 0x3b, 0x9e, 0x00, 0xdc, 0xa4, + 0xf4, 0x30, 0xad, 0x14, 0x91, 0xe2, 0x63, 0x0b, 0x42, 0xab, 0x04, 0x41, + 0x79, 0x9e, 0x1d, 0x7d, 0xad, 0xf5, 0x5d, 0x56, 0x50, 0xd1, 0x6e, 0x84, + 0x4c, 0xa7, 0xbc, 0x3f, 0x5b, 0xa4, 0x2f, 0x21, 0x3f, 0x6b, 0xc0, 0xe0, + 0xb0, 0xcf, 0x15, 0x41, 0x81, 0x93, 0xc3, 0x3f, 0x31, 0x4f, 0x1b, 0x29, + 0x32, 0xe8, 0x88, 0x0b, 0x7e, 0x05, 0x66, 0x1e, 0xae, 0x46, 0xe5, 0xfc, + 0xa7, 0x29, 0xce, 0x07, 0x5e, 0x3a, 0x76, 0x3b, 0x4c, 0xf4, 0xc6, 0x27, + 0x72, 0xa0, 0x79, 0x71, 0x73, 0xfd, 0x43, 0xdd, 0x4f, 0x92, 0x02, 0x10, + 0xf6, 0x48, 0xba, 0x99, 0x6d, 0x84, 0xad, 0x29, 0x9a, 0xc7, 0xd5, 0x44, + 0xf2, 0x36, 0x0c, 0xfb, 0x84, 0x3d, 0x46, 0xa3, 0x32, 0xaf, 0x32, 0x4f, + 0x02, 0x13, 0xba, 0x39, 0x89, 0xf3, 0x16, 0x2a, 0x39, 0xe3, 0x6e, 0x30, + 0xe5, 0x2c, 0x61, 0x27, 0xbd, 0xa3, 0x87, 0xb1, 0xb4, 0x6b, 0x98, 0xac, + 0xa4, 0xe2, 0x73, 0xbf, 0x74, 0xdc, 0x42, 0x26, 0x92, 0x93, 0x49, 0xda, + 0x40, 0x34, 0x65, 0xed, 0xd8, 0xb8, 0x7a, 0xb0, 0x8e, 0x90, 0xf5, 0xa9, + 0x9c, 0x82, 0xcf, 0x78, 0xca, 0x29, 0x67, 0xc0, 0xf6, 0xe8, 0xb8, 0x97, + 0x6c, 0xfa, 0x70, 0x9e, 0xa4, 0x35, 0x61, 0x7d, 0x9e, 0xad, 0xee, 0xd3, + 0x9a, 0x89, 0x6b, 0x43, 0x68, 0x20, 0x82, 0x4b, 0xb6, 0xea, 0xa2, 0x72, + 0xab, 0xea, 0x77, 0x6f, 0x5a, 0x87, 0xd7, 0x32, 0x7d, 0x31, 0xe1, 0xdc, + 0xc7, 0xc6, 0xa4, 0xd9, 0xc5, 0x77, 0x22, 0xea, 0x5a, 0x6b, 0x19, 0x50, + 0xd0, 0x69, 0xfb, 0x2d, 0x00, 0xda, 0x29, 0x32, 0x95, 0x86, 0x47, 0x71, + 0x92, 0xd0, 0x8f, 0x07, 0xd5, 0xc9, 0xd5, 0x19, 0xef, 0x51, 0x4b, 0xc9, + 0x88, 0x46, 0x11, 0x08, 0x24, 0x0a, 0x20, 0xf6, 0x32, 0xe4, 0x18, 0x80, + 0xff, 0xee, 0x4d, 0x3a, 0xbe, 0x68, 0x74, 0x57, 0x89, 0x8a, 0xd1, 0x4e, + 0x02, 0xc6, 0xf9, 0x54, 0x72, 0x18, 0x0f, 0x5f, 0x33, 0xf4, 0xcd, 0x15, + 0xd0, 0xfb, 0x0d, 0x6d, 0x8f, 0x1b, 0x20, 0xd8, 0xef, 0x61, 0x0f, 0x15, + 0x80, 0x09, 0xe8, 0x35, 0xc5, 0xd9, 0x38, 0x44, 0x7e, 0x69, 0x2a, 0x96, + 0x7d, 0x80, 0xf3, 0x0d, 0x55, 0xcf, 0x63, 0x53, 0xb9, 0x79, 0xd6, 0xcf, + 0x8a, 0x7e, 0x84, 0xb5, 0x36, 0x4f, 0xee, 0x72, 0xff, 0x8c, 0xc1, 0xab, + 0x66, 0xf0, 0x58, 0x31, 0x52, 0xbb, 0x90, 0x87, 0x3b, 0xb3, 0xc7, 0x18, + 0x7b, 0x63, 0x3e, 0xe3, 0xf4, 0xf5, 0xb9, 0x35, 0xf2, 0x88, 0x6a, 0x62, + 0x3f, 0x84, 0xa4, 0xec, 0xe5, 0xcf, 0xb7, 0x4f, 0x00, 0x56, 0x18, 0x84, + 0xd2, 0x86, 0x8d, 0x12, 0x32, 0x03, 0x38, 0x06, 0x60, 0xc1, 0xa6, 0x9a, + 0x4e, 0xfe, 0x0a, 0xfe, 0x4b, 0xdb, 0x57, 0xfc, 0xa3, 0xdc, 0x6f, 0x53, + 0x92, 0x2f, 0xd0, 0x05, 0x6e, 0x86, 0x35, 0xd2, 0x40, 0xf8, 0xa4, 0x4f, + 0xd3, 0xe4, 0x7c, 0xc0, 0xde, 0xf7, 0xe3, 0x84, 0x63, 0xa3, 0x37, 0x4f, + 0x36, 0xc5, 0x47, 0xb1, 0xb0, 0x75, 0x96, 0xf5, 0x6b, 0x0e, 0xd5, 0x87, + 0xc7, 0xdf, 0x22, 0x8c, 0x88, 0xa8, 0x80, 0x12, 0x94, 0x9c, 0xe8, 0x8d, + 0xa9, 0x98, 0x55, 0x2d, 0xac, 0xd5, 0xc5, 0x8c, 0xc6, 0x78, 0x6f, 0xcb, + 0x5e, 0x28, 0x73, 0x68, 0xcd, 0x9f, 0x0d, 0xa6, 0xce, 0xfe, 0x3e, 0x21, + 0xfa, 0xf8, 0xb1, 0x1a, 0x19, 0xe9, 0xdf, 0xdc, 0x32, 0x12, 0x8a, 0xa5, + 0x1b, 0x70, 0x8d, 0x67, 0xbc, 0x56, 0xd7, 0x8c, 0xff, 0x50, 0x3e, 0x45, + 0xee, 0x3f, 0x06, 0x41, 0x10, 0x41, 0x1c, 0x6c, 0xd8, 0x02, 0x09, 0x38, + 0xb1, 0x9d, 0x7b, 0x85, 0x1b, 0x67, 0xe8, 0x70, 0x1e, 0xa4, 0x50, 0x0b, + 0x99, 0x46, 0xdc, 0x9c, 0x6f, 0x9d, 0x49, 0xd8, 0x93, 0xd3, 0x39, 0x44, + 0xb4, 0xa3, 0xec, 0x20, 0x50, 0xeb, 0x6c, 0x3c, 0x0f, 0x55, 0xcb, 0xf2, + 0x44, 0x29, 0xeb, 0x0c, 0x5d, 0x4e, 0x39, 0x27, 0xce, 0x65, 0x9c, 0x2a, + 0xea, 0x4e, 0x59, 0x1a, 0x79, 0x42, 0x25, 0x31, 0x24, 0xf8, 0x55, 0x7b, + 0xf9, 0xd1, 0x47, 0x37, 0x95, 0xfd, 0xb6, 0xfc, 0x78, 0xb1, 0xc4, 0xca, + 0xbe, 0x89, 0xc8, 0xe1, 0x67, 0x13, 0x61, 0x41, 0xc9, 0x7f, 0x58, 0x06, + 0x6f, 0xcd, 0xc1, 0x67, 0x97, 0x2b, 0xf0, 0x2a, 0x55, 0xd5, 0x4d, 0xcf, + 0x5d, 0xcb, 0xfd, 0x46, 0xb5, 0xba, 0xef, 0x92, 0x68, 0xe3, 0x63, 0x58, + 0x44, 0xb3, 0x62, 0x11, 0x66, 0xfa, 0xce, 0xb5, 0x5e, 0x31, 0xa7, 0x61, + 0x29, 0x4c, 0x57, 0x2a, 0xcc, 0x9d, 0x07, 0x48, 0x13, 0x67, 0x5d, 0xf2, + 0x4d, 0xbd, 0x5a, 0x44, 0x3c, 0x1d, 0x71, 0x63, 0x2d, 0x62, 0xa6, 0xcc, + 0xa8, 0xbe, 0x3e, 0x98, 0xc2, 0x11, 0xa1, 0xa9, 0xaf, 0xd2, 0x7c, 0x2c, + 0x76, 0x94, 0x41, 0x44, 0xc1, 0xda, 0x93, 0x8d, 0x3c, 0x82, 0xc5, 0xd3, + 0x30, 0xfe, 0x11, 0x1f, 0xc3, 0x37, 0xc6, 0x6d, 0x26, 0xf0, 0x44, 0x76, + 0xee, 0x51, 0x87, 0x3e, 0x23, 0x8d, 0xbb, 0xab, 0x1f, 0xed, 0xb8, 0x48, + 0x74, 0xe9, 0xb8, 0xbe, 0x6b, 0x73, 0x51, 0x4f, 0x5e, 0xe0, 0x6b, 0x98, + 0xab, 0xf3, 0xb2, 0x15, 0x8c, 0xc9, 0x8c, 0x96, 0x93, 0xe3, 0xec, 0x2d, + 0x21, 0x94, 0x1a, 0x06, 0xa6, 0x51, 0xe4, 0x3f, 0xca, 0x05, 0xcb, 0xa5, + 0xa7, 0x70, 0x5e, 0x9e, 0xcb, 0x2d, 0xc5, 0x9e, 0xad, 0xe0, 0xa7, 0x5a, + 0xce, 0x2a, 0x87, 0xbb, 0xc4, 0xc5, 0x9a, 0x25, 0x7c, 0x13, 0xda, 0xf1, + 0x18, 0x3d, 0x16, 0xe0, 0x28, 0x0e, 0xd4, 0x62, 0xcc, 0xa7, 0xb7, 0xf3, + 0xa9, 0xe5, 0xb2, 0x4b, 0xc5, 0xd2, 0xc1, 0x8d, 0xa5, 0x9d, 0x66, 0xfc, + 0x9f, 0xf1, 0x29, 0x3c, 0x59, 0xb2, 0xd9, 0x19, 0xf8, 0x3b, 0x0f, 0x07, + 0x7b, 0x48, 0x0b, 0x65, 0xfd, 0xda, 0x6d, 0x9d, 0x03, 0x57, 0x25, 0x4b, + 0xdf, 0x02, 0xe4, 0x52, 0x18, 0x97, 0xac, 0xb8, 0x4a, 0x6d, 0x60, 0x53, + 0x5f, 0x79, 0xf6, 0xeb, 0x75, 0x62, 0xb3, 0x1a, 0x51, 0xf6, 0x6d, 0x04, + 0xd7, 0x10, 0xef, 0x74, 0x3f, 0xa5, 0xdd, 0xfc, 0x20, 0xfa, 0xbc, 0x3c, + 0x7a, 0x5d, 0x9e, 0x42, 0x4b, 0x9b, 0xc1, 0xea, 0xce, 0x69, 0x52, 0x25, + 0x1c, 0x8a, 0xff, 0x14, 0xdc, 0x46, 0x85, 0x9d, 0x66, 0xe7, 0x8a, 0xe5, + 0x3a, 0xbd, 0xad, 0x28, 0xf1, 0x8a, 0xb8, 0xd1, 0x83, 0x93, 0x8e, 0xf8, + 0x50, 0x51, 0x6e, 0x22, 0x2d, 0x92, 0x88, 0x32, 0x09, 0x42, 0x45, 0x13, + 0x3a, 0xf7, 0x5c, 0x3b, 0x38, 0x47, 0x1c, 0x7d, 0x91, 0xba, 0x2e, 0xff, + 0x68, 0x7b, 0x4a, 0x54, 0xf9, 0x80, 0xad, 0x62, 0xf2, 0x31, 0x00, 0x14, + 0x50, 0x0c, 0xc1, 0xd7, 0xd5, 0x6f, 0xf2, 0x77, 0xe2, 0x6a, 0xff, 0xf8, + 0xbf, 0x5f, 0x0c, 0x08, 0xb8, 0x7d, 0x44, 0x61, 0x9d, 0xb2, 0x17, 0x72, + 0x4a, 0x97, 0x06, 0x57, 0xc5, 0x3a, 0xba, 0x5a, 0x04, 0x50, 0x10, 0xa2, + 0xc5, 0x5e, 0xd0, 0x18, 0xf3, 0xd5, 0x8e, 0x02, 0x55, 0x4a, 0x0d, 0xec, + 0x16, 0x0f, 0xd5, 0x73, 0x3f, 0xc8, 0xe9, 0x39, 0xc1, 0xf9, 0xce, 0x3b, + 0x38, 0x50, 0xa6, 0xb3, 0xc0, 0x61, 0xc5, 0xab, 0xea, 0x1b, 0x3d, 0x94, + 0x4e, 0x5e, 0x8a, 0x57, 0xb0, 0x94, 0x88, 0x3a, 0xa1, 0xa1, 0xe9, 0xe6, + 0xa4, 0x9f, 0x04, 0xb8, 0xc1, 0x7c, 0xa3, 0xbe, 0x82, 0xc8, 0xc8, 0xfc, + 0xe5, 0xa1, 0x54, 0xd9, 0xd2, 0xd0, 0xeb, 0xfa, 0x6a, 0xd5, 0xa0, 0x50, + 0x49, 0xcd, 0xb5, 0xe7, 0xb9, 0x8c, 0x1c, 0x67, 0x2c, 0x4b, 0x70, 0xed, + 0x89, 0x27, 0x16, 0xec, 0xb2, 0x68, 0x1c, 0x8a, 0xb6, 0x22, 0xe2, 0xe6, + 0x50, 0x4d, 0x27, 0x7a, 0xc2, 0x8d, 0x74, 0xf9, 0x7e, 0x98, 0xbe, 0x43, + 0xc9, 0xcb, 0x24, 0xd4, 0x6b, 0x17, 0xe7, 0x82, 0xdf, 0xf1, 0x12, 0xc4, + 0x29, 0x81, 0x1c, 0x90, 0x93, 0x4f, 0xa0, 0xa8, 0x14, 0xe3, 0xde, 0xb0, + 0xd9, 0x10, 0x7f, 0x9d, 0x02, 0xc8, 0x03, 0x12, 0x84, 0xcc, 0xd2, 0x58, + 0x02, 0x5e, 0x35, 0xfe, 0xba, 0x34, 0x80, 0x4f, 0xdb, 0x8e, 0xed, 0xeb, + 0xe5, 0x36, 0x86, 0x64, 0xcf, 0x6a, 0x50, 0xee, 0x0e, 0x12, 0x53, 0x7c, + 0x3f, 0x2a, 0xc4, 0x6d, 0x38, 0x90, 0x14, 0x08, 0x1e, 0x33, 0xee, 0xb8, + 0xb0, 0x28, 0x84, 0xec, 0xa9, 0xec, 0xad, 0x99, 0x79, 0x35, 0x0b, 0x3c, + 0xe9, 0x12, 0xe1, 0xb9, 0xdf, 0x11, 0xfc, 0xbb, 0xa6, 0x92, 0x68, 0x78, + 0x5c, 0x19, 0x5e, 0x0c, 0xb1, 0xda, 0xa8, 0x3d, 0x4d, 0x79, 0x76, 0x90, + 0x7c, 0x5e, 0xe7, 0x2f, 0x04, 0x04, 0x1f, 0xe4, 0x24, 0x4b, 0x1c, 0x5d, + 0x48, 0x76, 0xf1, 0x10, 0x8b, 0x3f, 0x7e, 0x0b, 0xf6, 0x7c, 0x72, 0xff, + 0x80, 0x19, 0x71, 0x44, 0xcc, 0xe4, 0xbe, 0x45, 0x21, 0x60, 0xa3, 0x9a, + 0x65, 0xdf, 0x6c, 0x14, 0x9a, 0x5f, 0x8c, 0xe8, 0x0d, 0xae, 0x9b, 0x9a, + 0x4c, 0x64, 0x84, 0x76, 0x66, 0xaa, 0x24, 0x5a, 0x40, 0xf7, 0x4a, 0xe6, + 0x5b, 0x19, 0x5c, 0xa0, 0x02, 0x07, 0xce, 0x02, 0x5e, 0x0d, 0x31, 0x42, + 0x40, 0xd8, 0xd6, 0x96, 0x1b, 0x41, 0x14, 0x11, 0x27, 0xc9, 0x8a, 0xe2, + 0xee, 0xe1, 0x61, 0xdf, 0x77, 0x75, 0x66, 0x29, 0x78, 0x1d, 0x99, 0xfc, + 0x1e, 0xa1, 0xec, 0x13, 0x33, 0x68, 0x87, 0x30, 0xc3, 0x2c, 0x7d, 0x71, + 0x8e, 0x2b, 0xc3, 0xf6, 0x61, 0x6c, 0xc6, 0x73, 0x54, 0xa8, 0x8c, 0x7d, + 0xea, 0x1a, 0xb8, 0xb0, 0xb0, 0x38, 0xe6, 0xb2, 0x94, 0x70, 0xd2, 0x4a, + 0x2a, 0xa8, 0x34, 0xe7, 0x68, 0xb5, 0x8d, 0xbe, 0xd9, 0xc5, 0xf6, 0xcf, + 0x4d, 0x51, 0x66, 0x08, 0xe0, 0x5a, 0x21, 0x2f, 0x22, 0x7e, 0x71, 0x6a, + 0xf9, 0x67, 0xe4, 0xfe, 0x5b, 0xac, 0xdf, 0xf0, 0x4a, 0xec, 0x6e, 0x67, + 0x82, 0x24, 0xb3, 0x6b, 0x87, 0xda, 0x8d, 0x55, 0x25, 0xcd, 0xfe, 0x6b, + 0x0e, 0xd4, 0x1a, 0x6a, 0xf8, 0x62, 0x33, 0x92, 0x0b, 0x65, 0x9b, 0xb0, + 0x06, 0xce, 0xc1, 0xe6, 0xcb, 0x65, 0x5a, 0x63, 0x5f, 0x54, 0x43, 0xd7, + 0xcd, 0xa8, 0xda, 0xf3, 0x1e, 0x57, 0x78, 0xc7, 0x06, 0x01, 0xa5, 0x37, + 0xdb, 0x1d, 0x51, 0x59, 0xfd, 0xaf, 0xed, 0x73, 0x2c, 0x3a, 0xcd, 0xd2, + 0xfc, 0xac, 0xe7, 0x49, 0x02, 0x1f, 0x24, 0xba, 0x9e, 0xcb, 0x55, 0x49, + 0x55, 0x03, 0x2f, 0x4e, 0xe4, 0x4c, 0x27, 0x24, 0xec, 0x75, 0xa6, 0x11, + 0x0e, 0x92, 0x01, 0x3b, 0x6c, 0xd0, 0x6f, 0x4b, 0x60, 0x7f, 0xcc, 0x7e, + 0x7d, 0x3b, 0xc1, 0xc0, 0x79, 0xb1, 0x88, 0x49, 0x4a, 0x4a, 0x63, 0x80, + 0x18, 0x67, 0xa0, 0x96, 0xd0, 0x34, 0x83, 0x82, 0x4f, 0x81, 0x48, 0x06, + 0xa4, 0xc5, 0x9a, 0x86, 0x43, 0xba, 0x5c, 0x9d, 0x58, 0x4c, 0x7c, 0xc0, + 0x7b, 0x56, 0x12, 0x5d, 0xc6, 0x2e, 0x29, 0xa3, 0xc2, 0x1c, 0x63, 0xd4, + 0xa0, 0xe4, 0x11, 0xf1, 0xc7, 0x97, 0xea, 0xc7, 0xf3, 0x4e, 0xba, 0xc4, + 0xb3, 0xe0, 0x14, 0x1b, 0x7b, 0xb2, 0x1a, 0x76, 0x0d, 0xfd, 0xe6, 0x27, + 0x4a, 0xa6, 0x4f, 0x08, 0xf2, 0x51, 0x11, 0xd7, 0xb6, 0xcc, 0xcd, 0x8f, + 0xe9, 0x88, 0xb4, 0xf0, 0xaf, 0x96, 0x07, 0x1a, 0x15, 0xcc, 0x3f, 0x5c, + 0xe0, 0x4f, 0xfd, 0xf8, 0xf7, 0xf7, 0xad, 0x80, 0xbd, 0x7e, 0x26, 0x55, + 0x96, 0xe3, 0xb5, 0x6e, 0xb6, 0x94, 0x7e, 0x5f, 0x09, 0x14, 0xfa, 0xac, + 0x35, 0xf2, 0x3a, 0x37, 0xfa, 0x69, 0x59, 0xf5, 0xb4, 0x36, 0x66, 0x57, + 0x35, 0x3f, 0xf4, 0xa7, 0x82, 0x1e, 0x02, 0x2f, 0xea, 0x2e, 0x09, 0xe9, + 0x28, 0xf4, 0x29, 0x38, 0x0a, 0xe2, 0x9a, 0xac, 0x76, 0x98, 0x9d, 0xdd, + 0x60, 0xad, 0x06, 0x9a, 0x9e, 0x24, 0x7f, 0x0d, 0x12, 0x1d, 0x49, 0x23, + 0xf8, 0xde, 0x26, 0xeb, 0x55, 0x16, 0xea, 0xd1, 0x20, 0x9f, 0xc1, 0xcc, + 0xd8, 0x64, 0xbd, 0x3c, 0xaa, 0x5b, 0x1c, 0x62, 0xc1, 0xdd, 0x6c, 0xbe, + 0x63, 0x80, 0xb0, 0x65, 0x5f, 0x7d, 0xb2, 0xe4, 0x53, 0x5c, 0xfc, 0xc3, + 0x2f, 0x50, 0x80, 0xa6, 0x72, 0x51, 0x67, 0xdd, 0x6e, 0x16, 0x9f, 0x65, + 0xfe, 0x48, 0x78, 0xe1, 0xf8, 0x63, 0xaa, 0xd6, 0x5f, 0x66, 0x8d, 0x04, + 0xcc, 0xaa, 0x6c, 0xf6, 0x32, 0x8d, 0xce, 0x33, 0xba, 0xa9, 0x0c, 0x98, + 0x28, 0x24, 0x62, 0xde, 0xf0, 0x87, 0xec, 0xa7, 0x31, 0xb8, 0xc8, 0x7b, + 0x1f, 0x5e, 0x1c, 0x47, 0xc3, 0x4d, 0x46, 0xad, 0x71, 0xed, 0x63, 0x3c, + 0xf3, 0xf5, 0xb8, 0x8c, 0x6e, 0xc0, 0x42, 0x40, 0x06, 0x89, 0xf7, 0xbd, + 0x2b, 0xa5, 0x9d, 0x6f, 0x86, 0xf0, 0xf1, 0x27, 0xcc, 0x80, 0xd2, 0x93, + 0x65, 0x7a, 0xfd, 0xca, 0xa3, 0x51, 0x5f, 0xab, 0x8f, 0xce, 0xba, 0x1d, + 0x1d, 0xdf, 0xc8, 0x20, 0x8a, 0x78, 0xcf, 0x4c, 0x5b, 0xc7, 0x9c, 0x58, + 0x03, 0xa9, 0x21, 0x9b, 0x1e, 0x3a, 0x73, 0x18, 0x8b, 0xa3, 0xcf, 0xe3, + 0xac, 0x73, 0xc4, 0xe8, 0x3d, 0xf5, 0xe7, 0x4b, 0x4c, 0x4f, 0xf3, 0x95, + 0x31, 0x5f, 0xce, 0xc4, 0xef, 0xf0, 0x22, 0xb3, 0xc2, 0x16, 0x31, 0xdd, + 0xbe, 0x1b, 0x2f, 0xf1, 0x32, 0x49, 0xc0, 0xcf, 0x34, 0x56, 0x44, 0xf1, + 0x33, 0x4a, 0xf5, 0xdf, 0xcd, 0xee, 0x8a, 0xae, 0xdb, 0x1f, 0x93, 0x5b, + 0xe0, 0x9a, 0xc2, 0x0d, 0x57, 0xd1, 0x4b, 0x45, 0x9d, 0xe1, 0xb0, 0xaf, + 0x76, 0x0c, 0x9a, 0x9e, 0x19, 0x25, 0x27, 0x3d, 0xb6, 0xfb, 0x6f, 0x6b, + 0x79, 0x91, 0xca, 0x0b, 0x31, 0x7c, 0x33, 0xea, 0x59, 0xf2, 0xcb, 0x2f, + 0x79, 0xd4, 0xab, 0xcb, 0xae, 0x53, 0x37, 0x80, 0x27, 0x7d, 0x04, 0x96, + 0x79, 0x75, 0x6b, 0x13, 0xd8, 0xc8, 0x55, 0xf9, 0x33, 0xef, 0xa6, 0xfa, + 0xf6, 0xe8, 0x2f, 0xe1, 0x7b, 0x10, 0x55, 0xe7, 0x41, 0xdf, 0xef, 0xb2, + 0x06, 0x61, 0xe3, 0x91, 0x47, 0xfc, 0x7c, 0x57, 0x87, 0x45, 0x17, 0x34, + 0x7f, 0x7d, 0x09, 0x5a, 0x82, 0x9a, 0x45, 0xdf, 0x5f, 0x3d, 0xcb, 0x1e, + 0x93, 0x53, 0x92, 0xfc, 0x52, 0x13, 0xbc, 0x36, 0x8e, 0x0d, 0x79, 0x98, + 0x39, 0x09, 0xd4, 0x8b, 0x39, 0xf8, 0x21, 0xf1, 0xd2, 0xe5, 0x58, 0x2c, + 0x95, 0x6f, 0x65, 0x3e, 0xf8, 0x91, 0xef, 0x52, 0xb4, 0xea, 0x26, 0xa2, + 0xe4, 0xa8, 0x39, 0x14, 0xf1, 0x02, 0xea, 0x11, 0xfc, 0x3b, 0x75, 0x0a, + 0x7f, 0xc7, 0x48, 0x7f, 0xb9, 0xb8, 0x80, 0x55, 0xf2, 0x11, 0xcc, 0xbb, + 0x9e, 0x19, 0x25, 0x44, 0xab, 0xcb, 0x1d, 0x06, 0x5c, 0x83, 0x10, 0x71, + 0xdd, 0xd3, 0x44, 0x26, 0x19, 0xf8, 0x79, 0x3e, 0xfa, 0x41, 0x78, 0x7c, + 0x31, 0xc4, 0xbb, 0x1d, 0xe8, 0xcc, 0xa0, 0x4c, 0x67, 0xff, 0xd3, 0x25, + 0xa4, 0x2d, 0xa6, 0xdc, 0x9b, 0x64, 0xa5, 0x6d, 0x74, 0x3a, 0xfc, 0x29, + 0xcb, 0x83, 0x86, 0x27, 0x58, 0x35, 0xfd, 0xe3, 0xca, 0x48, 0xb9, 0x8f, + 0xab, 0x3c, 0x29, 0x01, 0x67, 0x12, 0xb3, 0xfb, 0x1b, 0x81, 0x96, 0x7d, + 0x32, 0xe0, 0xc7, 0xd9, 0x11, 0xd2, 0x6f, 0xee, 0xe6, 0xdd, 0xa8, 0x6e, + 0xe3, 0x05, 0xc0, 0x54, 0x64, 0xe3, 0xb5, 0x1f, 0x75, 0x82, 0xf8, 0xa3, + 0x44, 0xb8, 0x90, 0x25, 0x9c, 0x5b, 0x11, 0x18, 0x34, 0x33, 0x4a, 0xd1, + 0x8a, 0x42, 0x8a, 0xcf, 0x32, 0xb5, 0xa6, 0xd1, 0xcf, 0x6f, 0xbe, 0xe5, + 0xaf, 0x42, 0xad, 0xce, 0xba, 0x65, 0x2d, 0x1d, 0x55, 0x21, 0xb0, 0x3a, + 0xef, 0xd6, 0x19, 0xdc, 0x6b, 0xc0, 0x04, 0x52, 0xaf, 0x33, 0x6e, 0x30, + 0x10, 0x7b, 0x3c, 0x2b, 0xbf, 0x1b, 0xc7, 0xa6, 0x9f, 0xc4, 0x3d, 0x69, + 0xfc, 0x43, 0x78, 0x5f, 0x72, 0x9a, 0x32, 0x52, 0x9b, 0xa5, 0x3a, 0x20, + 0x8d, 0xe5, 0xf0, 0x5c, 0x2c, 0xf2, 0xf9, 0xa5, 0x43, 0xfe, 0x46, 0x23, + 0x6e, 0x40, 0xc7, 0x86, 0x6d, 0xcf, 0xc1, 0x61, 0x7f, 0x5b, 0xed, 0xd1, + 0xc9, 0x9c, 0x84, 0x8f, 0xc8, 0x9d, 0x1c, 0xa5, 0x9a, 0x46, 0x09, 0x87, + 0x82, 0x29, 0x29, 0xb3, 0xbc, 0xc2, 0x4b, 0xbc, 0x4d, 0x99, 0xe5, 0x8e, + 0x97, 0xae, 0x92, 0xa1, 0x05, 0xec, 0x0b, 0xab, 0xd3, 0xee, 0xcd, 0x6d, + 0xc2, 0x74, 0x62, 0xb7, 0x27, 0x0d, 0xa8, 0x26, 0xe8, 0x15, 0x4d, 0xe9, + 0xc9, 0xd9, 0xe0, 0x8d, 0x4c, 0xe8, 0xeb, 0x64, 0x3f, 0x21, 0xe8, 0x1d, + 0x8c, 0x34, 0xb7, 0x78, 0x97, 0xa1, 0x4e, 0x4c, 0xe0, 0xf0, 0xf3, 0x47, + 0x3a, 0xc7, 0x10, 0xfa, 0x82, 0x1a, 0xdb, 0x8a, 0xfe, 0xc0, 0x3a, 0x26, + 0x36, 0x8d, 0xd5, 0x78, 0xf3, 0x03, 0xf2, 0x20, 0xbe, 0x1b, 0xa0, 0xf6, + 0x1b, 0x41, 0x0b, 0xe1, 0xb8, 0x4d, 0x7d, 0x09, 0x75, 0x7a, 0xbc, 0xd5, + 0xb4, 0xd7, 0x9f, 0xa9, 0x52, 0xe2, 0xb7, 0x50, 0x62, 0x25, 0x48, 0x35, + 0x83, 0x7a, 0x82, 0x8f, 0x21, 0xa6, 0x8b, 0xf1, 0xfe, 0x47, 0xc2, 0xc2, + 0x00, 0x71, 0x5c, 0x02, 0x74, 0x61, 0x61, 0xde, 0xc9, 0x7e, 0x20, 0x6f, + 0x8d, 0x65, 0x66, 0xd4, 0xbe, 0x00, 0xd6, 0x2f, 0xc9, 0x39, 0x72, 0x68, + 0x0f, 0x13, 0x21, 0xd8, 0x8d, 0xb2, 0x5d, 0xf8, 0x3a, 0xc2, 0x56, 0x0a, + 0xb9, 0xab, 0x46, 0x91, 0x55, 0x6a, 0x32, 0xd5, 0x13, 0x3e, 0x65, 0x13, + 0x51, 0x2a, 0xfe, 0x08, 0xe7, 0x07, 0x7d, 0xaa, 0x69, 0xf2, 0xb0, 0x43, + 0x8c, 0x07, 0xb0, 0x7a, 0x20, 0x63, 0x38, 0x08, 0x42, 0x8b, 0x4a, 0x6d, + 0x67, 0x99, 0x2a, 0x20, 0x30, 0x56, 0xa1, 0xca, 0xcb, 0xa4, 0xa8, 0xca, + 0xce, 0xb6, 0x07, 0x13, 0xbf, 0x81, 0x64, 0x92, 0xca, 0x69, 0xcb, 0x80, + 0xb3, 0x64, 0xb8, 0xb8, 0xf0, 0xee, 0xaf, 0x37, 0x4a, 0x23, 0x5d, 0xbb, + 0x6f, 0x59, 0xa6, 0x5f, 0xac, 0x7c, 0x0b, 0xe9, 0x53, 0xc7, 0xc7, 0x56, + 0x09, 0xe6, 0x5c, 0xfd, 0x9d, 0xe4, 0x1b, 0x30, 0x7d, 0x96, 0x12, 0x4d, + 0x17, 0x60, 0xd8, 0xf6, 0x30, 0x2c, 0xca, 0x91, 0x96, 0x02, 0x47, 0xec, + 0x38, 0x20, 0xd2, 0x16, 0xbf, 0xd8, 0x33, 0xd7, 0x23, 0x8e, 0x11, 0x65, + 0x38, 0xaf, 0xa9, 0x76, 0x76, 0xae, 0x84, 0x96, 0xa4, 0x46, 0xa4, 0x64, + 0x9c, 0x5d, 0x17, 0x78, 0x85, 0x41, 0x49, 0x67, 0x71, 0xce, 0x1d, 0x71, + 0x0b, 0xe5, 0xce, 0xa6, 0x85, 0xe1, 0xaf, 0xe5, 0x34, 0x5c, 0x5d, 0xaf, + 0x99, 0x29, 0x79, 0x28, 0xa1, 0xf4, 0xa0, 0x97, 0xa3, 0x6b, 0xb0, 0xbd, + 0x69, 0xed, 0x95, 0x1c, 0x88, 0xd3, 0x79, 0x5d, 0xdf, 0x05, 0x66, 0x66, + 0xe8, 0x0f, 0x97, 0x27, 0x82, 0x50, 0x4a, 0xc3, 0xfd, 0xb8, 0x1f, 0xee, + 0x83, 0x09, 0x11, 0x11, 0xa6, 0x02, 0x46, 0x27, 0x62, 0xbf, 0x61, 0x99, + 0xe1, 0xcd, 0x25, 0x87, 0x96, 0x47, 0xdf, 0x3f, 0x87, 0x62, 0x7f, 0x68, + 0x57, 0x27, 0xac, 0xf6, 0x38, 0x54, 0xbf, 0xac, 0xaf, 0x6d, 0x9c, 0x19, + 0xeb, 0xfd, 0x31, 0x86, 0x8f, 0xa7, 0x02, 0x91, 0xf9, 0x02, 0x03, 0x50, + 0xdb, 0xf5, 0x1d, 0xfd, 0x88, 0x1a, 0x5a, 0x51, 0xc2, 0xf2, 0xbf, 0xdb, + 0xa8, 0xe6, 0x7a, 0x41, 0x22, 0xfa, 0x90, 0xed, 0x94, 0xc4, 0xf9, 0x35, + 0x90, 0x84, 0xcf, 0x09, 0xb7, 0x9f, 0x8c, 0xb5, 0x45, 0x18, 0x0b, 0x7c, + 0x94, 0x8c, 0x3a, 0x84, 0x42, 0xbb, 0x9a, 0xb9, 0x54, 0x06, 0xee, 0x1c, + 0xab, 0xd6, 0x5e, 0x1e, 0x5c, 0xd5, 0xdd, 0xe0, 0x76, 0xa3, 0xbd, 0x58, + 0x99, 0x69, 0x81, 0x42, 0xbb, 0x55, 0x92, 0x4d, 0x29, 0xca, 0x27, 0x89, + 0xdf, 0x00, 0x3b, 0x2f, 0x6f, 0x54, 0x53, 0xc5, 0xb7, 0x42, 0xca, 0x64, + 0x2d, 0xe3, 0xfe, 0x9c, 0xad, 0x78, 0x97, 0x40, 0x96, 0xbb, 0x5a, 0x70, + 0xa6, 0x1c, 0x98, 0xc7, 0xb6, 0xe7, 0xdf, 0xc1, 0x92, 0x24, 0x2b, 0xbb, + 0x66, 0x36, 0x6e, 0x98, 0xc4, 0x1e, 0x54, 0xc5, 0x6b, 0x07, 0xde, 0x6c, + 0xdd, 0xbf, 0x9e, 0x7f, 0xe1, 0xa9, 0x22, 0xaa, 0x90, 0x1c, 0xf9, 0xfc, + 0x0b, 0x9d, 0xfc, 0x27, 0x36, 0x7f, 0xb2, 0xe1, 0x0a, 0x85, 0xa8, 0xba, + 0xbc, 0x8d, 0x6e, 0xb1, 0x28, 0x7d, 0x6a, 0x65, 0x52, 0xc6, 0x52, 0x12, + 0x5b, 0x3d, 0xd0, 0x46, 0x9c, 0xd7, 0xbf, 0x72, 0x7b, 0x98, 0x4a, 0x29, + 0xb2, 0xf3, 0xea, 0xc3, 0x6a, 0xec, 0x8e, 0xe6, 0xe4, 0xfa, 0x9f, 0xf4, + 0xf7, 0x44, 0x46, 0xb1, 0x90, 0xfe, 0xfa, 0x49, 0x3d, 0xf6, 0x56, 0x41, + 0x45, 0x5e, 0xd7, 0xae, 0xb1, 0x5b, 0x6c, 0x0a, 0xb3, 0x03, 0x23, 0x0f, + 0x7b, 0x94, 0x06, 0x8a, 0xc0, 0x65, 0xd2, 0xe1, 0xa2, 0x1c, 0x58, 0x12, + 0xcd, 0xf8, 0x1d, 0x01, 0x06, 0xd9, 0x0b, 0x4f, 0x19, 0x79, 0xb4, 0x84, + 0x44, 0x9e, 0x6b, 0x05, 0x9d, 0xfd, 0x96, 0x59, 0x03, 0xd6, 0xfc, 0x13, + 0x2c, 0xb9, 0x75, 0x53, 0xc0, 0x8b, 0x46, 0x93, 0x95, 0xd5, 0xbe, 0x5f, + 0xfd, 0x5d, 0x01, 0x30, 0x8c, 0xa8, 0xf8, 0x98, 0x30, 0xcd, 0xbd, 0x79, + 0xea, 0x14, 0x52, 0x11, 0x03, 0x0f, 0x1f, 0x78, 0x6b, 0xfd, 0xdd, 0xb4, + 0x9a, 0x41, 0x98, 0x47, 0x12, 0x9c, 0x5a, 0xcd, 0x91, 0xa8, 0xad, 0xd5, + 0x62, 0xcf, 0x13, 0xc4, 0xec, 0x75, 0xed, 0x22, 0xba, 0x03, 0x0e, 0x9d, + 0x96, 0xa6, 0xd7, 0xc0, 0x9f, 0xdb, 0x66, 0x98, 0x54, 0x4a, 0x49, 0x5e, + 0xb3, 0x35, 0x67, 0x36, 0x95, 0xc9, 0xe9, 0xc7, 0x27, 0x5d, 0x99, 0x86, + 0x3a, 0x9e, 0x7e, 0x6a, 0xba, 0x7f, 0x34, 0xbd, 0xd5, 0x8f, 0xa3, 0x8a, + 0x3c, 0x7b, 0xdb, 0x5d, 0x4f, 0xdf, 0xc9, 0x37, 0x36, 0x93, 0x0f, 0xf7, + 0x78, 0x9a, 0xf7, 0x61, 0xb2, 0x7b, 0x6d, 0x72, 0xb7, 0xee, 0x1c, 0xef, + 0xb7, 0x69, 0x03, 0xc9, 0x88, 0x0c, 0x57, 0xe1, 0x37, 0x56, 0x91, 0xc4, + 0xc3, 0x4b, 0x18, 0xab, 0xfb, 0x2a, 0x26, 0xa1, 0x73, 0x8e, 0xf4, 0x09, + 0x13, 0x2a, 0x9e, 0x7c, 0xdb, 0xf6, 0x06, 0x34, 0xd3, 0x87, 0x76, 0xe0, + 0x3b, 0x12, 0xd5, 0x75, 0x03, 0xf0, 0x55, 0xa2, 0xbc, 0x1f, 0x10, 0x9f, + 0x56, 0x9b, 0xf8, 0x70, 0xca, 0xc0, 0xde, 0x06, 0x73, 0xab, 0xad, 0x1f, + 0xea, 0xd7, 0xb2, 0x6d, 0xb2, 0x5e, 0x46, 0x40, 0x32, 0xc0, 0x6b, 0x78, + 0xf6, 0x2f, 0xc2, 0x9b, 0x20, 0x09, 0xd2, 0xdb, 0xbb, 0xfb, 0x05, 0x15, + 0xf8, 0xf5, 0x58, 0x3f, 0x26, 0xab, 0x33, 0x66, 0xaf, 0x3a, 0xa5, 0xfc, + 0x76, 0x2e, 0x11, 0x94, 0x46, 0x43, 0x42, 0x1c, 0x68, 0xfe, 0xbb, 0x89, + 0x0c, 0x35, 0xf7, 0x72, 0xe5, 0x48, 0x98, 0x59, 0x1d, 0x7b, 0x88, 0x25, + 0x3e, 0x32, 0x74, 0x26, 0xec, 0xde, 0x8e, 0x22, 0x43, 0x56, 0x2f, 0x67, + 0x95, 0xb4, 0x87, 0x8a, 0x63, 0xd3, 0x88, 0x6e, 0x74, 0xf5, 0x50, 0x23, + 0x8b, 0x8f, 0xd9, 0xa0, 0x04, 0xea, 0x2f, 0xdf, 0x71, 0x3c, 0xe1, 0x50, + 0x82, 0x97, 0xd9, 0xfd, 0x8f, 0x5d, 0x19, 0x9f, 0x56, 0x4f, 0x68, 0xff, + 0x19, 0x09, 0xd1, 0x9e, 0x6f, 0x1f, 0xfb, 0xc0, 0xc7, 0x41, 0x31, 0x4e, + 0x91, 0x0c, 0xea, 0xd8, 0x6c, 0xfc, 0x76, 0x92, 0x55, 0x82, 0x13, 0x05, + 0x64, 0xcc, 0xa0, 0xca, 0x53, 0x6c, 0xe0, 0x68, 0x14, 0x4c, 0x88, 0xbe, + 0xeb, 0x0d, 0xc3, 0x49, 0x03, 0xa8, 0x50, 0x0e, 0xb8, 0xe8, 0xe0, 0xb1, + 0x8b, 0x05, 0x88, 0xfb, 0xd8, 0x99, 0x12, 0x36, 0xf0, 0xd9, 0xde, 0x7a, + 0xd5, 0x41, 0x41, 0xf0, 0x18, 0x8a, 0xee, 0x11, 0xc7, 0xa3, 0x0a, 0x52, + 0x2d, 0xfa, 0x92, 0x19, 0xf0, 0xf9, 0x79, 0xa1, 0x53, 0x68, 0x11, 0x95, + 0x5d, 0x8e, 0xcc, 0x06, 0xad, 0x93, 0x5a, 0x7c, 0x06, 0xa2, 0xc5, 0xad, + 0x2d, 0xbb, 0x86, 0x5a, 0x37, 0x0f, 0x35, 0xac, 0xf5, 0xbb, 0x18, 0xea, + 0x68, 0xff, 0x69, 0xbf, 0x6c, 0xe5, 0x25, 0xcf, 0x22, 0x2e, 0x9e, 0xbb, + 0x24, 0xf0, 0xa0, 0xf7, 0xad, 0xa8, 0xf4, 0x85, 0x6c, 0x36, 0x1d, 0xe9, + 0x66, 0x99, 0xb0, 0x4f, 0x64, 0x42, 0xbf, 0x1f, 0x30, 0xd6, 0x1b, 0xfd, + 0x31, 0xb7, 0xc7, 0xc0, 0x7f, 0x72, 0xda, 0x67, 0x1f, 0xf8, 0x77, 0x2f, + 0x36, 0x9a, 0x82, 0xfb, 0xcb, 0xbe, 0xac, 0xe3, 0x95, 0x81, 0x99, 0xfd, + 0x3d, 0xa9, 0xad, 0xc7, 0xdf, 0x58, 0x7f, 0x18, 0x12, 0x04, 0xa8, 0xb6, + 0x8f, 0xcb, 0x6a, 0x4f, 0x4b, 0x37, 0xc1, 0xc3, 0x8f, 0xda, 0x69, 0x38, + 0x17, 0x40, 0xfb, 0x62, 0x4b, 0x64, 0xd5, 0x70, 0x3a, 0xe8, 0xa9, 0x0c, + 0x9d, 0x0b, 0xd9, 0x1b, 0xee, 0x14, 0x46, 0x7c, 0xf4, 0x34, 0xd0, 0x0b, + 0x81, 0x6f, 0x6b, 0x44, 0x96, 0xd8, 0x94, 0x2e, 0x99, 0x42, 0x3a, 0xc6, + 0x22, 0xa9, 0xb0, 0xc8, 0xa6, 0x6d, 0x0c, 0x43, 0x32, 0x63, 0x92, 0x9e, + 0xf6, 0xa7, 0x8d, 0xeb, 0xe4, 0x89, 0x98, 0x3f, 0xed, 0xdf, 0xf0, 0xe4, + 0xa4, 0x16, 0x8a, 0xbe, 0xed, 0x62, 0xd3, 0xbf, 0x85, 0x31, 0x00, 0x73, + 0xf7, 0x04, 0x44, 0xe5, 0xbc, 0xb1, 0x31, 0xbf, 0xfe, 0x7d, 0xb9, 0xe2, + 0x53, 0xab, 0xf2, 0x05, 0xc6, 0x1e, 0x46, 0xfe, 0x42, 0xcc, 0x9b, 0xf9, + 0xca, 0xd5, 0xb7, 0x76, 0xfa, 0x82, 0x02, 0x93, 0x24, 0x31, 0x8c, 0xac, + 0x55, 0x7d, 0xc1, 0xc9, 0xf2, 0xfe, 0xa7, 0x68, 0x86, 0x4e, 0xff, 0xd5, + 0xa6, 0x69, 0x36, 0x68, 0x21, 0x5a, 0x89, 0x60, 0x7b, 0x8e, 0xc2, 0x7b, + 0xda, 0x00, 0xeb, 0x33, 0x4d, 0x34, 0x92, 0xab, 0x6c, 0xf9, 0xb7, 0xcc, + 0x18, 0x92, 0x87, 0x47, 0x3a, 0x9c, 0x81, 0xd8, 0x61, 0xc6, 0xcb, 0x1e, + 0xb0, 0x5c, 0x26, 0x8a, 0xbc, 0x54, 0x8a, 0x14, 0x4b, 0x7e, 0xe5, 0xaf, + 0xb6, 0x3f, 0x9b, 0x19, 0x15, 0x32, 0xf6, 0x6e, 0x83, 0x61, 0xa8, 0xde, + 0x02, 0xd4, 0x1e, 0x1e, 0x3a, 0x54, 0x37, 0xd2, 0xaa, 0xca, 0xd0, 0x2d, + 0x01, 0x88, 0x2a, 0x14, 0x48, 0xfb, 0x88, 0xd7, 0xf2, 0xaf, 0xdd, 0x7d, + 0x48, 0x41, 0xd4, 0x84, 0x9a, 0xb2, 0xb5, 0x10, 0xed, 0x2a, 0x15, 0xf6, + 0x15, 0xd1, 0xb5, 0x2a, 0x6a, 0x9f, 0xd7, 0x23, 0xf5, 0x48, 0x21, 0x44, + 0x22, 0xcc, 0xe6, 0xb7, 0xdd, 0xf4, 0x8e, 0x9a, 0x2d, 0x88, 0xb6, 0xff, + 0x28, 0xa8, 0xe5, 0x22, 0xe6, 0xaf, 0xa4, 0xd5, 0xa3, 0x41, 0xb1, 0x81, + 0x88, 0xdf, 0xdf, 0xdc, 0xb6, 0xed, 0x7c, 0x81, 0x67, 0xc4, 0xe0, 0x10, + 0xe2, 0x27, 0xf5, 0xe6, 0xdb, 0x00, 0xe6, 0xda, 0x7e, 0xdb, 0xf4, 0x97, + 0x04, 0xfa, 0x47, 0x5a, 0x4c, 0x0f, 0xba, 0xf0, 0xf3, 0x01, 0x2e, 0xba, + 0x59, 0xfd, 0xee, 0xd5, 0x7d, 0x5f, 0x05, 0x08, 0xfe, 0x92, 0x68, 0x29, + 0x2e, 0x39, 0x75, 0x33, 0x54, 0x43, 0x15, 0xb9, 0xf6, 0x1a, 0x10, 0x8c, + 0x7d, 0xd9, 0x0b, 0x9a, 0x9a, 0x5c, 0x1b, 0x90, 0x52, 0x48, 0x23, 0x48, + 0xd6, 0x99, 0x8f, 0x8e, 0x75, 0x6a, 0x9b, 0x09, 0x88, 0x24, 0xa4, 0x92, + 0x71, 0xf2, 0xb8, 0x69, 0xae, 0xd5, 0x58, 0x5a, 0x9c, 0xae, 0x62, 0x1f, + 0x64, 0xb2, 0xfc, 0x0d, 0xe1, 0x32, 0x85, 0xe0, 0x80, 0xbf, 0x33, 0x69, + 0x6c, 0xde, 0x09, 0xd3, 0xaf, 0x09, 0xcc, 0x39, 0xc6, 0x96, 0xfa, 0xf0, + 0xe5, 0x08, 0x2a, 0xb2, 0x3d, 0xa0, 0x56, 0x36, 0xd9, 0xb7, 0xd0, 0xd4, + 0x40, 0x56, 0x90, 0x57, 0x7d, 0xa9, 0xf1, 0xb9, 0x2d, 0x01, 0x5b, 0x95, + 0x7e, 0x96, 0x5a, 0xfb, 0x2d, 0x88, 0xb7, 0xa0, 0x99, 0xfc, 0x3c, 0x77, + 0xc8, 0x7f, 0x7d, 0x61, 0xbb, 0x4c, 0x58, 0x63, 0xbc, 0xfd, 0x0e, 0x6e, + 0x76, 0x8a, 0x12, 0x87, 0xbd, 0xe3, 0x5f, 0xa3, 0x12, 0x95, 0x57, 0x4d, + 0xcf, 0xf9, 0xc1, 0xe4, 0xd6, 0x4a, 0x0c, 0xa0, 0x21, 0xf1, 0xc3, 0xcb, + 0x91, 0xf9, 0xd0, 0x44, 0xa8, 0xd8, 0xca, 0x31, 0x4f, 0x65, 0xd3, 0x9a, + 0x3a, 0x3b, 0x83, 0xc9, 0x01, 0x9f, 0xa6, 0x05, 0xfb, 0x8c, 0x40, 0x53, + 0x3e, 0xde, 0x46, 0x00, 0x20, 0x23, 0xaf, 0xa7, 0x16, 0x92, 0xe8, 0x3a, + 0x00, 0x60, 0x47, 0x80, 0x27, 0xc2, 0xc9, 0x4a, 0xfc, 0xe6, 0x3c, 0x32, + 0xd3, 0x37, 0x08, 0x4e, 0x25, 0x65, 0x19, 0x83, 0x11, 0x8e, 0xb8, 0xdb, + 0xa4, 0x02, 0x92, 0xb3, 0x96, 0x38, 0xaf, 0x04, 0x5d, 0x06, 0xfd, 0x36, + 0x10, 0x3e, 0xb0, 0x53, 0x5f, 0xb8, 0x31, 0x09, 0xfa, 0xaa, 0x52, 0x45, + 0x38, 0x23, 0x9f, 0x17, 0x97, 0x30, 0x2f, 0x1b, 0x13, 0xa7, 0x1a, 0x9c, + 0x9d, 0x67, 0xc3, 0x4c, 0xc9, 0xf2, 0x4b, 0x9d, 0xd7, 0x8d, 0x42, 0x17, + 0xf8, 0xce, 0x77, 0xc6, 0x1b, 0x39, 0x0e, 0x20, 0x9c, 0xe8, 0xbb, 0x79, + 0xf4, 0x9a, 0x83, 0xf3, 0x56, 0x4e, 0x7c, 0x17, 0xf6, 0xcd, 0xf9, 0x1a, + 0x43, 0x00, 0x41, 0x9e, 0xad, 0x15, 0xc6, 0xe5, 0x06, 0xe1, 0x6d, 0x5c, + 0x57, 0x45, 0xf3, 0xf1, 0x69, 0xde, 0x15, 0xd8, 0xd7, 0xe7, 0xcf, 0xeb, + 0xf0, 0x41, 0xaa, 0xa5, 0xe7, 0xc3, 0x37, 0x5f, 0x7c, 0x87, 0xd5, 0x61, + 0xe8, 0x1d, 0x11, 0xd2, 0xb7, 0x63, 0x62, 0xe7, 0xeb, 0x18, 0xad, 0xad, + 0xfb, 0x88, 0x47, 0x53, 0xd1, 0x1f, 0x71, 0x95, 0xf6, 0x7a, 0x9b, 0x85, + 0xe4, 0x2d, 0x9f, 0x40, 0x2a, 0x46, 0xd8, 0xae, 0x5a, 0x28, 0x10, 0xf8, + 0xf5, 0x02, 0x48, 0x19, 0x81, 0x7c, 0x33, 0x82, 0x5f, 0x75, 0xd4, 0x29, + 0x7e, 0x82, 0xa7, 0x8c, 0x42, 0x7e, 0x39, 0xdc, 0xcb, 0x27, 0xa9, 0x8a, + 0xd2, 0xad, 0xa4, 0x08, 0xb2, 0xc0, 0x0d, 0xa5, 0x26, 0x80, 0xfa, 0xad, + 0xc4, 0x4e, 0xd5, 0x55, 0x45, 0x80, 0x61, 0x84, 0x3f, 0xcf, 0xc2, 0x60, + 0xe6, 0x92, 0x2f, 0xce, 0x9c, 0x69, 0xb1, 0x9a, 0xae, 0x98, 0x2a, 0x4e, + 0x2e, 0x24, 0xd0, 0xd9, 0xb8, 0xba, 0xcd, 0xb7, 0x88, 0x1e, 0xda, 0xea, + 0xc5, 0xad, 0x63, 0xef, 0x79, 0x71, 0x30, 0x79, 0x68, 0x1d, 0x21, 0x29, + 0x7a, 0xe7, 0xe1, 0xaa, 0x57, 0x65, 0x37, 0xd2, 0x08, 0x69, 0x1c, 0x6e, + 0x66, 0x74, 0xff, 0xf8, 0x9d, 0x21, 0x95, 0xf9, 0x54, 0xde, 0x97, 0x6d, + 0xa8, 0x64, 0x23, 0xe8, 0xc8, 0x62, 0xf4, 0x46, 0x85, 0x92, 0xad, 0x3b, + 0x96, 0x2f, 0x73, 0xa5, 0x5a, 0xb9, 0x58, 0x0c, 0x64, 0x3d, 0x63, 0xcb, + 0x0b, 0xef, 0xb0, 0xb1, 0x6c, 0x02, 0xc6, 0xd2, 0x9e, 0xf8, 0xd7, 0x13, + 0x2b, 0xaf, 0x11, 0x61, 0xc9, 0x5d, 0xb6, 0x16, 0x65, 0xce, 0xfe, 0x5d, + 0x3a, 0xb5, 0x02, 0xe5, 0x87, 0x60, 0xb3, 0xf0, 0x74, 0x5a, 0x62, 0x1d, + 0x68, 0xd8, 0xce, 0x5b, 0x48, 0xb5, 0x76, 0x98, 0x1a, 0x9b, 0xa2, 0x8e, + 0x27, 0xa0, 0xca, 0x47, 0x34, 0x3f, 0xa3, 0x74, 0xc9, 0x45, 0xb3, 0xa1, + 0x99, 0x6b, 0xd7, 0x07, 0xa2, 0xe7, 0x73, 0x65, 0xa6, 0x82, 0x50, 0x7a, + 0x2d, 0xe1, 0x79, 0xcd, 0xeb, 0x43, 0xba, 0x2a, 0xc1, 0x53, 0xc4, 0xac, + 0x5c, 0x36, 0xf6, 0x32, 0x9a, 0x8b, 0x28, 0x08, 0x5f, 0xf2, 0xd6, 0x74, + 0xea, 0x11, 0x33, 0x8e, 0x5d, 0x90, 0x28, 0x1f, 0x47, 0x6e, 0x63, 0xee, + 0x8e, 0xa7, 0x28, 0x62, 0x9c, 0x5f, 0xfd, 0xbe, 0xc1, 0x0f, 0x16, 0xe9, + 0x54, 0x5c, 0xf5, 0x9a, 0x87, 0x50, 0x83, 0xe3, 0xf8, 0xb2, 0x42, 0x67, + 0x12, 0xa5, 0x89, 0xd3, 0xbe, 0x09, 0xb9, 0x2f, 0x15, 0xb5, 0x9b, 0x58, + 0x60, 0xaa, 0x7c, 0xf5, 0xee, 0x07, 0x30, 0xac, 0x0d, 0x4d, 0xd0, 0xf6, + 0xbb, 0x95, 0x80, 0xbc, 0x21, 0xae, 0xba, 0x63, 0xbb, 0xa1, 0x1b, 0xf0, + 0x87, 0x7c, 0x7f, 0x7b, 0x12, 0xce, 0x74, 0x44, 0x27, 0xae, 0x4e, 0x8f, + 0xaf, 0xd8, 0xf6, 0x7c, 0xb4, 0x61, 0xd0, 0xb8, 0x0e, 0x9c, 0x7e, 0xc0, + 0xce, 0x07, 0xef, 0xe7, 0x2d, 0x7a, 0x11, 0x70, 0x37, 0x5f, 0xc3, 0xed, + 0x18, 0x45, 0xda, 0x27, 0x6c, 0x5e, 0xc1, 0xe7, 0xc1, 0x0c, 0x49, 0x84, + 0xb6, 0x42, 0x1e, 0x2c, 0xc9, 0x3c, 0xb9, 0xc9, 0xe6, 0xd9, 0x59, 0xb3, + 0xaa, 0xf8, 0xf1, 0x2f, 0x03, 0x74, 0xd9, 0xba, 0x25, 0x0a, 0xa4, 0xbe, + 0xb0, 0x64, 0xea, 0x86, 0x19, 0x94, 0xb3, 0xc5, 0x69, 0x0e, 0x66, 0x72, + 0x04, 0x1b, 0x76, 0x02, 0x88, 0xba, 0xeb, 0x91, 0xed, 0x7c, 0x8c, 0x1f, + 0xf9, 0xb8, 0x58, 0x74, 0x08, 0x4e, 0x5b, 0xdc, 0xc5, 0x89, 0xa8, 0x2f, + 0x8e, 0x0d, 0x26, 0xa2, 0x78, 0x85, 0xc0, 0x8f, 0x7c, 0x3f, 0x07, 0x00, + 0x15, 0x40, 0x7b, 0xa6, 0x0e, 0xf0, 0x38, 0x58, 0xca, 0xe0, 0xd2, 0x8e, + 0xa2, 0x75, 0x7b, 0x26, 0xc3, 0xd3, 0x7b, 0x27, 0xaa, 0x7e, 0x5d, 0x8a, + 0x3d, 0xc9, 0x5d, 0x0c, 0x26, 0x1a, 0xab, 0xb2, 0xe2, 0x55, 0xfb, 0xaf, + 0xae, 0x37, 0xd5, 0x95, 0xc4, 0xe2, 0x3d, 0x45, 0x19, 0x2f, 0xbf, 0xd6, + 0xfa, 0x69, 0xd3, 0x4d, 0xe7, 0x9c, 0xd6, 0x6e, 0x5a, 0x42, 0x4f, 0xb0, + 0x29, 0x57, 0x3e, 0x05, 0x0c, 0xfa, 0x60, 0x93, 0x02, 0xd5, 0x87, 0x73, + 0x4c, 0x5e, 0x3c, 0xf8, 0x92, 0xe2, 0x3e, 0xbf, 0x27, 0x81, 0x85, 0x93, + 0xbd, 0x30, 0x3b, 0xf3, 0x8d, 0x80, 0x7a, 0x48, 0x6f, 0x6d, 0xb2, 0xe3, + 0x53, 0xf5, 0xfd, 0x1d, 0xc2, 0xa4, 0x99, 0x63, 0x34, 0xd9, 0x09, 0x68, + 0x04, 0x3c, 0x92, 0xff, 0x09, 0xac, 0xb6, 0x03, 0x97, 0x0e, 0xde, 0x70, + 0x2a, 0xbc, 0x22, 0x28, 0x0b, 0x52, 0xca, 0x28, 0xbf, 0x87, 0xb1, 0xe3, + 0xc5, 0x1e, 0x26, 0x02, 0x45, 0xd7, 0x7c, 0x66, 0x0d, 0xd1, 0x72, 0xea, + 0x31, 0xe5, 0x7a, 0x9c, 0x2d, 0xbf, 0x18, 0x7c, 0xaa, 0xc7, 0xdd, 0x81, + 0xb0, 0xf1, 0xa8, 0x1e, 0x06, 0x2f, 0xc7, 0xf8, 0x6b, 0xa4, 0xec, 0xb0, + 0x65, 0xec, 0x04, 0x6f, 0x17, 0x6f, 0xd1, 0x46, 0x00, 0x5e, 0x5c, 0x21, + 0xc1, 0x9e, 0x32, 0x88, 0x8f, 0x15, 0x6f, 0x70, 0x30, 0x98, 0x36, 0xfd, + 0x3d, 0x2e, 0xf5, 0x11, 0x38, 0x40, 0x77, 0x12, 0x90, 0x53, 0xa6, 0x9a, + 0xea, 0x30, 0xfd, 0xe7, 0x1c, 0x0f, 0xfb, 0x9b, 0xb5, 0x28, 0x19, 0xba, + 0x02, 0x2d, 0x4c, 0x74, 0xcb, 0x8a, 0xaa, 0x31, 0x34, 0xb6, 0x46, 0x02, + 0x6e, 0x54, 0xa3, 0x2c, 0x92, 0xfb, 0x25, 0x8c, 0x60, 0x63, 0x43, 0xe2, + 0xd0, 0xa3, 0xca, 0x54, 0x41, 0x3f, 0xa2, 0x0b, 0x1d, 0x19, 0xaf, 0xf0, + 0xfd, 0x97, 0x5d, 0xbe, 0x9c, 0xf2, 0x81, 0x9c, 0x85, 0xac, 0xee, 0xee, + 0xb3, 0x21, 0x6a, 0x2e, 0x99, 0x6f, 0xa6, 0x04, 0x21, 0xbf, 0x65, 0x01, + 0x64, 0xff, 0x7e, 0x74, 0x96, 0x75, 0xfd, 0x9a, 0xf1, 0xf3, 0x01, 0xb7, + 0xd2, 0x0d, 0x57, 0x1b, 0xba, 0xc1, 0x5e, 0x35, 0xfa, 0x61, 0x41, 0xbf, + 0xc8, 0x27, 0x6f, 0x4c, 0x5c, 0x69, 0x88, 0xb6, 0xf6, 0xd8, 0xc9, 0x5c, + 0x6b, 0x97, 0x7e, 0x90, 0x99, 0x8c, 0x1a, 0x51, 0x05, 0xa0, 0xb2, 0x7f, + 0xb0, 0xb2, 0xa6, 0x91, 0x99, 0x09, 0x9d, 0xf9, 0x42, 0x4a, 0xc4, 0x90, + 0xa5, 0xb5, 0xfc, 0xd3, 0x98, 0x1f, 0xd5, 0xaa, 0x1d, 0x7f, 0x5c, 0x2d, + 0x2d, 0xd3, 0x0a, 0xa7, 0x2d, 0x5d, 0x12, 0x4d, 0x36, 0x7a, 0x5c, 0x14, + 0x1f, 0x37, 0x8e, 0xf8, 0xb0, 0x9c, 0x3e, 0xcb, 0x6a, 0xbc, 0x79, 0xed, + 0x29, 0xed, 0x7d, 0xb4, 0x33, 0xc1, 0xfa, 0xab, 0x56, 0xb6, 0x61, 0x30, + 0xc4, 0xcd, 0x8d, 0xa7, 0x0f, 0x3f, 0xe8, 0x61, 0x19, 0xdf, 0xcc, 0x22, + 0xa0, 0x4e, 0x96, 0x1c, 0x93, 0xd9, 0x71, 0xe8, 0xeb, 0xad, 0xf4, 0xe2, + 0x65, 0xf2, 0xe6, 0xb1, 0x61, 0xc3, 0x3c, 0xb4, 0xc7, 0xd1, 0x4f, 0x7a, + 0x56, 0x0f, 0x9b, 0x3a, 0x75, 0x7d, 0xb3, 0x37, 0x29, 0x70, 0x02, 0x5b, + 0x79, 0x99, 0xe0, 0x7e, 0x5b, 0xfb, 0x4e, 0x1d, 0xf8, 0xa1, 0xf4, 0x71, + 0xaf, 0x4f, 0xdb, 0xcd, 0x1a, 0xc1, 0xa1, 0x1e, 0x83, 0x06, 0xaa, 0x0d, + 0x76, 0x81, 0x0b, 0x98, 0xd7, 0x9b, 0x4c, 0x4b, 0x13, 0xff, 0xec, 0x9d, + 0xfc, 0x62, 0xd8, 0x21, 0x7f, 0xd8, 0xe4, 0x4e, 0x6d, 0xb8, 0x07, 0x18, + 0x79, 0x08, 0x19, 0xf9, 0x73, 0x4b, 0xbe, 0x58, 0x19, 0x80, 0x23, 0x8c, + 0xeb, 0x13, 0x9c, 0x49, 0x31, 0x3b, 0xb2, 0x68, 0x6b, 0xd5, 0x0f, 0x7d, + 0x36, 0x5b, 0xc9, 0x02, 0x79, 0xd1, 0xa7, 0xee, 0x92, 0xf1, 0x1d, 0x32, + 0x78, 0xde, 0xa9, 0x11, 0xb3, 0x64, 0x78, 0x1f, 0x18, 0x14, 0x88, 0xe8, + 0xb8, 0xaf, 0x52, 0x86, 0xd8, 0xf7, 0xf2, 0x39, 0xfe, 0xc9, 0x9d, 0x98, + 0xf9, 0x61, 0x00, 0x71, 0x67, 0x72, 0x9a, 0x38, 0xb9, 0x9b, 0xfa, 0x94, + 0x68, 0x64, 0xe9, 0xc9, 0x94, 0x55, 0x19, 0x08, 0x10, 0x0c, 0x8b, 0x35, + 0x16, 0x9c, 0x9c, 0xee, 0xde, 0xc0, 0x1c, 0xcf, 0x7a, 0x0a, 0xe8, 0xb4, + 0xfa, 0x51, 0x10, 0x2b, 0x8b, 0x1b, 0x8e, 0xef, 0xb6, 0x8a, 0x27, 0x88, + 0xe4, 0x40, 0x3b, 0xa0, 0x3b, 0x82, 0xd0, 0x70, 0xbb, 0x4f, 0x76, 0x2c, + 0x82, 0x4d, 0x6a, 0xe9, 0xd9, 0xf9, 0x8e, 0xed, 0xb4, 0xe5, 0x99, 0xb4, + 0xa3, 0x78, 0x23, 0xfe, 0xdf, 0xdd, 0x83, 0xc3, 0xf8, 0xab, 0xea, 0x31, + 0xaf, 0x10, 0x32, 0xbe, 0xba, 0x5f, 0x0e, 0xea, 0xf2, 0xe5, 0xf8, 0xde, + 0x2f, 0x60, 0x8d, 0x15, 0x9b, 0x52, 0xb5, 0x97, 0xa1, 0x36, 0x41, 0x91, + 0x6d, 0x76, 0x1d, 0x74, 0xc9, 0x28, 0x1a, 0x28, 0xb6, 0xc5, 0x3d, 0xd7, + 0x65, 0xc6, 0x8e, 0x1b, 0x35, 0xfb, 0xa6, 0x43, 0x88, 0xcc, 0x0a, 0xf4, + 0xdd, 0x92, 0x8d, 0x01, 0xb0, 0xbc, 0x72, 0xbf, 0x53, 0x30, 0x05, 0x97, + 0xb3, 0xf3, 0x8e, 0xa1, 0x59, 0x65, 0x76, 0x2b, 0xc2, 0xee, 0xca, 0xbe, + 0xc1, 0xe5, 0x19, 0x13, 0xb3, 0x85, 0x5c, 0x48, 0x7d, 0xd1, 0x1f, 0x66, + 0xa1, 0x9a, 0x99, 0x8d, 0xab, 0x87, 0x85, 0xc0, 0xa9, 0x79, 0xd2, 0x74, + 0x08, 0x19, 0x40, 0xc6, 0x6e, 0x43, 0xc5, 0xc0, 0xeb, 0x35, 0x45, 0xd4, + 0x30, 0x37, 0x9f, 0xc7, 0x0e, 0xff, 0x4b, 0xea, 0xc8, 0x9c, 0x39, 0x9e, + 0x02, 0x89, 0x29, 0xa1, 0x8e, 0x51, 0x08, 0x4e, 0x2b, 0x53, 0x54, 0x67, + 0xc0, 0x40, 0x1a, 0x0b, 0xf3, 0x27, 0xe4, 0xb2, 0x44, 0x17, 0xa1, 0xeb, + 0x73, 0x0b, 0x00, 0x69, 0xaa, 0xb2, 0xd2, 0x05, 0x33, 0xd6, 0x6e, 0xa2, + 0x93, 0x9f, 0xec, 0xcf, 0x1b, 0x56, 0xee, 0xad, 0x1f, 0xdb, 0x19, 0x34, + 0x98, 0xf4, 0x69, 0x05, 0x01, 0x7f, 0x71, 0xc9, 0x5f, 0x8c, 0xb0, 0xcd, + 0x69, 0xe9, 0xc8, 0xf7, 0xd0, 0x52, 0xe5, 0x38, 0x51, 0xdb, 0x5a, 0xdd, + 0x86, 0xeb, 0x8a, 0xbd, 0x2a, 0xa1, 0xc8, 0x31, 0xd6, 0x82, 0x05, 0x47, + 0x0f, 0xb8, 0x9d, 0x4d, 0x7d, 0xac, 0xad, 0xf8, 0x5a, 0x66, 0xd0, 0xac, + 0x55, 0xd9, 0x1c, 0x4a, 0x53, 0x5e, 0xee, 0xf7, 0xcd, 0x2a, 0x15, 0xba, + 0x73, 0x8a, 0x8c, 0x1c, 0xa9, 0x2d, 0xb6, 0x94, 0xf7, 0x47, 0xc9, 0xa4, + 0x4e, 0x27, 0x6d, 0x7c, 0x6b, 0xb7, 0x14, 0x39, 0xf6, 0x85, 0xd1, 0xcf, + 0x97, 0xde, 0xda, 0x9f, 0x20, 0x69, 0x2f, 0xd7, 0x2c, 0xcc, 0x97, 0x70, + 0x2a, 0xac, 0xc5, 0x27, 0xec, 0xe9, 0xf8, 0xa7, 0x57, 0x27, 0xea, 0xb4, + 0x23, 0x7a, 0x12, 0x1d, 0x91, 0xf4, 0xfa, 0xeb, 0x2b, 0xe0, 0x6b, 0x79, + 0x32, 0x9e, 0x86, 0xf8, 0x6d, 0x2d, 0x78, 0xae, 0x17, 0x16, 0x16, 0x74, + 0x4b, 0x48, 0xb6, 0x27, 0x2f, 0xbf, 0xbb, 0x17, 0x5d, 0x68, 0x9f, 0x35, + 0xf0, 0x3e, 0xba, 0x1e, 0xaa, 0xf4, 0x67, 0x4d, 0x22, 0xf9, 0x4a, 0xb2, + 0x72, 0x92, 0x72, 0xd2, 0x48, 0x91, 0x3c, 0x7d, 0x93, 0x33, 0x2c, 0x7e, + 0xd9, 0xf5, 0xfd, 0x26, 0xd9, 0x0a, 0xf4, 0xe7, 0xaa, 0xe2, 0x36, 0x80, + 0x0b, 0xc0, 0x98, 0x11, 0x5f, 0x1a, 0xc5, 0x73, 0x81, 0xae, 0x09, 0xe6, + 0x02, 0x24, 0x44, 0x7f, 0x09, 0x2f, 0x21, 0xf1, 0x77, 0xf5, 0x25, 0xb5, + 0x6d, 0x9d, 0xc7, 0xf0, 0xf7, 0x8c, 0xa8, 0x18, 0x4b, 0xc7, 0x45, 0xaa, + 0x09, 0xa3, 0x65, 0x6f, 0xe3, 0xe4, 0xa8, 0xaa, 0xb9, 0xe6, 0x80, 0xea, + 0x14, 0x8c, 0x9f, 0x5e, 0xc6, 0x90, 0x42, 0x55, 0xf7, 0x34, 0xac, 0x48, + 0x6c, 0xb7, 0x4e, 0x27, 0xc4, 0x88, 0xde, 0x37, 0x48, 0x5b, 0xe5, 0xb8, + 0xea, 0x32, 0xa9, 0xa3, 0xbe, 0x7e, 0xe9, 0x7c, 0xdc, 0x5d, 0x31, 0xb3, + 0x00, 0xc8, 0x4b, 0x81, 0xdf, 0xdd, 0x66, 0x92, 0xda, 0x5c, 0xd9, 0x14, + 0x24, 0xba, 0xda, 0x49, 0xe2, 0x28, 0x3f, 0xe9, 0x93, 0x47, 0xa3, 0xd6, + 0xd2, 0xde, 0x02, 0x9b, 0xc0, 0x98, 0xe5, 0x00, 0x81, 0x9a, 0xb6, 0x77, + 0x1e, 0x36, 0x70, 0x0f, 0x6f, 0xa7, 0x9b, 0xca, 0xb4, 0x11, 0x8a, 0x19, + 0xfd, 0x09, 0xd0, 0x39, 0x4f, 0x0e, 0x7a, 0x05, 0x53, 0x75, 0x72, 0xbb, + 0x19, 0x25, 0x30, 0xaf, 0xd1, 0xed, 0xe8, 0xe5, 0xab, 0x3f, 0xec, 0x3c, + 0x28, 0xbe, 0xc0, 0x98, 0xfa, 0xb6, 0x26, 0x30, 0xa2, 0xe5, 0x9c, 0x27, + 0x1e, 0x33, 0x8d, 0x2b, 0x47, 0x18, 0xce, 0x87, 0x63, 0xc5, 0x1f, 0x78, + 0xa2, 0x85, 0x11, 0x80, 0x95, 0x46, 0xea, 0xa2, 0x2b, 0xbc, 0x47, 0x2a, + 0x04, 0xbe, 0x9e, 0x6f, 0x96, 0x15, 0xd2, 0xe0, 0x53, 0xd8, 0xc6, 0x8d, + 0x3c, 0x16, 0xa8, 0x7a, 0x56, 0xb6, 0x31, 0x57, 0x21, 0x08, 0x2f, 0x83, + 0x76, 0x15, 0x57, 0x5b, 0x03, 0xbe, 0x01, 0xb2, 0xbf, 0x5a, 0xf8, 0x80, + 0x45, 0x55, 0x09, 0xb9, 0x0e, 0x05, 0xc8, 0x82, 0x45, 0xf5, 0xd4, 0xbb, + 0x3d, 0x3c, 0xc8, 0x1d, 0x6f, 0x72, 0xae, 0xdf, 0x0b, 0x0a, 0x1d, 0x79, + 0xf5, 0x0d, 0xf9, 0x31, 0xf1, 0x30, 0x7e, 0x96, 0x0b, 0x7c, 0xea, 0x67, + 0x96, 0xde, 0x0b, 0x61, 0x98, 0xb0, 0x2d, 0xf1, 0x04, 0xa5, 0x3c, 0xe4, + 0x01, 0x4b, 0x3c, 0xc7, 0x27, 0xa3, 0x58, 0x41, 0xf9, 0x8a, 0x47, 0x81, + 0x54, 0xc3, 0x25, 0x92, 0x11, 0xa5, 0x05, 0x3b, 0xad, 0x1d, 0xcd, 0x41, + 0xf5, 0x83, 0xe0, 0x40, 0x45, 0x23, 0x67, 0xd5, 0xa0, 0xf7, 0x56, 0xb5, + 0x72, 0xa0, 0x02, 0xea, 0x37, 0x7c, 0xd3, 0xc9, 0xa5, 0x2f, 0x22, 0x0f, + 0xa6, 0x86, 0x6b, 0xfe, 0x3d, 0x45, 0xdd, 0x0b, 0xde, 0x78, 0x8f, 0xe8, + 0xb0, 0x85, 0x77, 0x96, 0x8c, 0x96, 0x9c, 0xff, 0xe8, 0x8c, 0x5b, 0xe9, + 0x01, 0xc1, 0x73, 0x9f, 0xb2, 0x80, 0x40, 0x5a, 0x35, 0x64, 0x47, 0xa1, + 0xe3, 0xea, 0xb9, 0x52, 0x02, 0x56, 0xc5, 0x22, 0xb4, 0xfa, 0x86, 0xea, + 0xa1, 0x1f, 0xb5, 0x35, 0xa7, 0x7e, 0x92, 0xf6, 0x54, 0xbe, 0xba, 0x05, + 0x91, 0xe1, 0xa6, 0x0f, 0xed, 0xd8, 0xca, 0x5a, 0x81, 0xfb, 0x50, 0x9c, + 0xe8, 0x03, 0xd9, 0x1d, 0x42, 0x60, 0xcd, 0x16, 0xdb, 0x85, 0xd6, 0x59, + 0x11, 0x7e, 0xef, 0xeb, 0xa6, 0x8f, 0x64, 0x9e, 0xa5, 0x7e, 0xa7, 0xcd, + 0xe2, 0x69, 0x0e, 0x8c, 0x85, 0xd2, 0xbe, 0x86, 0xbc, 0x20, 0xe7, 0x30, + 0x76, 0x7e, 0xd1, 0x44, 0x45, 0x6b, 0x16, 0xb6, 0x8a, 0x78, 0xd6, 0xca, + 0x31, 0x2b, 0x3d, 0xc1, 0x54, 0x70, 0xf5, 0x2b, 0xb5, 0x3c, 0x39, 0x40, + 0x4c, 0x3e, 0x65, 0x91, 0x13, 0xbd, 0xb9, 0x62, 0x4b, 0x5e, 0x31, 0xd2, + 0xea, 0x9c, 0xf6, 0xfd, 0xbb, 0x7e, 0xe6, 0x58, 0xa2, 0xdf, 0x69, 0xf4, + 0x37, 0x51, 0x11, 0xbc, 0x08, 0x02, 0xc2, 0x11, 0xf9, 0xe2, 0x3c, 0xe2, + 0x1a, 0x0b, 0x37, 0x23, 0x47, 0x3a, 0x94, 0x19, 0x58, 0x22, 0x9c, 0xd5, + 0x3d, 0x26, 0xfc, 0x77, 0x85, 0x13, 0x83, 0x39, 0x1a, 0x60, 0x14, 0xb1, + 0xfb, 0x36, 0x55, 0x82, 0x01, 0xae, 0x95, 0xf2, 0x37, 0x3a, 0x41, 0xd1, + 0xd1, 0xe5, 0x5f, 0xee, 0x2a, 0xdc, 0xe8, 0x1c, 0xbc, 0x20, 0xf9, 0x0c, + 0xb7, 0x7d, 0xd1, 0xa9, 0x2a, 0x40, 0xae, 0xbe, 0xc0, 0x66, 0xcd, 0x7c, + 0xd5, 0x1f, 0xd3, 0x25, 0xd5, 0x5a, 0x0d, 0xd6, 0x0a, 0x53, 0xe3, 0x6f, + 0x1d, 0xdc, 0x95, 0xb2, 0x14, 0x33, 0x98, 0xa7, 0x7b, 0xf8, 0x05, 0xe7, + 0xd8, 0xac, 0x0f, 0x06, 0x30, 0x2d, 0xed, 0x58, 0x08, 0xcf, 0x31, 0x1f, + 0xe4, 0xd4, 0xef, 0xbf, 0x73, 0x9a, 0x82, 0x9a, 0x44, 0xde, 0x34, 0x32, + 0xbe, 0x4b, 0xd9, 0xec, 0xc6, 0x2a, 0x00, 0x54, 0x75, 0x18, 0x9b, 0x76, + 0x1a, 0x6c, 0xc4, 0xd6, 0xf1, 0x87, 0xff, 0x89, 0x2d, 0x42, 0x89, 0x5e, + 0x53, 0xb1, 0xbd, 0x41, 0x59, 0xe2, 0x8d, 0xa9, 0x10, 0xa3, 0x11, 0xb3, + 0x3f, 0x1f, 0xca, 0xa8, 0x30, 0x28, 0xba, 0x46, 0x27, 0x2c, 0x9b, 0x9f, + 0x9d, 0x4f, 0xbf, 0x9b, 0xaf, 0xad, 0x18, 0x6a, 0xb1, 0x1f, 0x7f, 0xec, + 0xfa, 0xf9, 0x63, 0x80, 0x39, 0x90, 0xb7, 0x43, 0x86, 0xa1, 0xf4, 0x62, + 0x56, 0xc2, 0x76, 0x68, 0x16, 0xbd, 0xc7, 0xc8, 0x8c, 0x44, 0x1e, 0x74, + 0xa4, 0x94, 0xf7, 0x9c, 0xee, 0xa8, 0xcd, 0x01, 0x8e, 0x75, 0xec, 0x4a, + 0x27, 0x0d, 0x45, 0xe1, 0x14, 0x37, 0x2a, 0x3f, 0x95, 0xd1, 0x66, 0x5f, + 0xb1, 0x45, 0x14, 0x60, 0xdb, 0xaf, 0x44, 0xb1, 0x83, 0x2b, 0xf4, 0x8b, + 0xce, 0x01, 0xbd, 0xf1, 0x63, 0x8b, 0x56, 0x98, 0xbe, 0xd7, 0xbe, 0x4d, + 0xeb, 0xc2, 0xdc, 0xc3, 0x28, 0x7e, 0x4d, 0x8f, 0x90, 0x6f, 0x7a, 0xe7, + 0xe1, 0x0b, 0x2b, 0x87, 0x3a, 0x1f, 0x1f, 0x8f, 0xd7, 0x64, 0xca, 0xcc, + 0xd2, 0xb7, 0xc8, 0x9c, 0xe2, 0x31, 0xfa, 0x50, 0x18, 0xe3, 0x30, 0x3f, + 0x99, 0x38, 0x4f, 0x83, 0x25, 0x02, 0x3c, 0x05, 0x00, 0x0c, 0x12, 0x0b, + 0x26, 0x17, 0x60, 0x3b, 0xc2, 0x44, 0x8c, 0x84, 0x8b, 0x69, 0xfb, 0x1e, + 0x70, 0x69, 0x0b, 0xc4, 0x6f, 0x5f, 0x69, 0x82, 0xf2, 0xe1, 0x4d, 0x23, + 0xe9, 0x8c, 0xdb, 0xb7, 0xc8, 0x71, 0x14, 0x1d, 0xad, 0x16, 0x7c, 0x43, + 0xca, 0x8b, 0x58, 0x75, 0x9f, 0xe2, 0x00, 0x51, 0xc2, 0x45, 0x4b, 0x5e, + 0x6b, 0x5d, 0x8e, 0x75, 0xd4, 0xd4, 0x08, 0x90, 0xd1, 0xab, 0xff, 0x9e, + 0xbe, 0xea, 0xb5, 0x31, 0x4a, 0x4a, 0x0f, 0x7e, 0x8b, 0x74, 0xcc, 0x04, + 0xf0, 0xc8, 0x94, 0xdc, 0xf3, 0x7d, 0x42, 0x09, 0xea, 0xe6, 0xa4, 0x25, + 0x33, 0x9b, 0x1d, 0x1d, 0x9b, 0x05, 0xe3, 0x05, 0x87, 0x63, 0x63, 0xa9, + 0xbd, 0x65, 0x7f, 0xa5, 0x0f, 0x99, 0x90, 0xe0, 0xeb, 0xed, 0xde, 0xe9, + 0xe1, 0xe5, 0x91, 0xf8, 0x68, 0xd9, 0x06, 0x17, 0xb6, 0xfc, 0x70, 0x12, + 0x38, 0x49, 0xfc, 0xce, 0x0d, 0xbc, 0x8a, 0x06, 0xc2, 0x41, 0x62, 0x88, + 0x67, 0x58, 0x0b, 0x22, 0xf8, 0x38, 0x47, 0x4f, 0xe1, 0x7b, 0xce, 0x86, + 0x9c, 0x9a, 0x28, 0xee, 0xdd, 0x70, 0x20, 0xb0, 0x12, 0x58, 0x73, 0x0a, + 0x07, 0x25, 0x1f, 0x82, 0x75, 0x5f, 0x8d, 0x84, 0xed, 0x03, 0xbc, 0x6b, + 0x8c, 0x99, 0x4c, 0xaf, 0x3d, 0x8c, 0xb7, 0x42, 0xb2, 0x4d, 0xeb, 0x0c, + 0xb8, 0x67, 0xfb, 0xc5, 0x0f, 0x60, 0x37, 0x9a, 0xef, 0xfe, 0x95, 0xce, + 0xe6, 0x26, 0x14, 0x17, 0xd6, 0xa5, 0x76, 0x2f, 0x91, 0xe8, 0x79, 0x13, + 0x21, 0xae, 0x6b, 0x55, 0x6a, 0x1f, 0xf7, 0x1a, 0x94, 0xf3, 0xa2, 0xb7, + 0xa7, 0x4e, 0x89, 0x7a, 0x42, 0x10, 0xbb, 0x9b, 0x55, 0x9d, 0x55, 0xa8, + 0x95, 0xae, 0x77, 0x8c, 0xb8, 0x93, 0x63, 0x53, 0x74, 0x2e, 0x98, 0xec, + 0xdd, 0x74, 0x88, 0xa8, 0xa0, 0xd0, 0x00, 0x74, 0xf1, 0x5b, 0xfd, 0x30, + 0x0f, 0xe8, 0x19, 0xb6, 0x7b, 0x9f, 0x78, 0xda, 0x98, 0x83, 0x01, 0xa2, + 0x3d, 0x11, 0xe2, 0xca, 0x83, 0x16, 0x8f, 0x6b, 0x62, 0x32, 0x9b, 0xc7, + 0x95, 0xda, 0xc3, 0xee, 0xa5, 0x2a, 0x30, 0x2d, 0x8c, 0x80, 0x4c, 0x72, + 0x0c, 0x8d, 0x29, 0x61, 0xa9, 0xbe, 0x5b, 0x32, 0x1c, 0xcb, 0x37, 0x49, + 0xf4, 0x1d, 0xb2, 0xc7, 0x17, 0x7f, 0xb9, 0x50, 0x51, 0xf1, 0xb1, 0x9f, + 0xc7, 0x2a, 0x2a, 0x22, 0x8e, 0x33, 0xc2, 0x24, 0x97, 0x08, 0x6c, 0x05, + 0x03, 0xc9, 0x1f, 0x92, 0xdb, 0x8e, 0x70, 0x5c, 0x50, 0xb1, 0x23, 0x68, + 0xb5, 0xc3, 0x42, 0x50, 0xe5, 0xd7, 0x03, 0x3c, 0xb5, 0xff, 0xfc, 0x21, + 0x2b, 0x98, 0xb0, 0xdb, 0xcd, 0x75, 0xf4, 0x92, 0xd1, 0x82, 0xcf, 0xfb, + 0xf4, 0xf4, 0x91, 0x32, 0xac, 0x9a, 0x27, 0xbb, 0xa5, 0x2e, 0x7e, 0x71, + 0x21, 0xe6, 0x54, 0x06, 0x7c, 0xe8, 0xcf, 0x97, 0xa6, 0x0a, 0xf8, 0x75, + 0xd0, 0xef, 0xc7, 0xfb, 0x31, 0xc1, 0xf8, 0x1b, 0x9b, 0x32, 0xe5, 0xbf, + 0x38, 0x71, 0xc2, 0x3d, 0x21, 0xbc, 0xcb, 0x76, 0xe7, 0xac, 0x76, 0xa9, + 0xc2, 0x99, 0x9f, 0x44, 0xb0, 0x97, 0xf6, 0xf1, 0x8d, 0x8c, 0x16, 0xfe, + 0x24, 0xec, 0x51, 0xb1, 0xf3, 0x87, 0x38, 0x7c, 0x7f, 0xf8, 0xd5, 0x98, + 0xb0, 0x73, 0x43, 0xc7, 0xbd, 0x2f, 0x26, 0xe1, 0xa4, 0x71, 0xa6, 0xb9, + 0x68, 0x28, 0xaf, 0x1f, 0xa4, 0x92, 0x7a, 0xd6, 0xb2, 0x30, 0xc2, 0x85, + 0x42, 0x7b, 0x14, 0x38, 0xe0, 0x59, 0xdc, 0xc9, 0x3b, 0x01, 0x74, 0x54, + 0xb1, 0x92, 0xd2, 0x67, 0xe1, 0x16, 0x98, 0xf5, 0x90, 0x45, 0xfb, 0x2c, + 0xd2, 0x3f, 0x9f, 0xf2, 0x4d, 0x88, 0xaa, 0x0c, 0xdf, 0x35, 0x0d, 0xa6, + 0x62, 0x61, 0x23, 0xd1, 0xc8, 0xe5, 0x9d, 0x1b, 0x8a, 0x79, 0x63, 0xb4, + 0x55, 0x78, 0x35, 0xec, 0x59, 0xcb, 0x88, 0x17, 0x09, 0xdc, 0x1a, 0x35, + 0x25, 0xeb, 0xd8, 0x84, 0xeb, 0x48, 0x80, 0x7e, 0x45, 0xbe, 0xcd, 0xa5, + 0xf8, 0x3c, 0xc8, 0x28, 0x24, 0x0e, 0xdf, 0xbc, 0xb6, 0xe9, 0xfa, 0xc7, + 0x25, 0xbd, 0xa7, 0x46, 0xc2, 0x2a, 0xb8, 0x2d, 0x26, 0x95, 0xc5, 0x86, + 0xa0, 0xd2, 0x90, 0xd5, 0x5f, 0xca, 0xbc, 0xd1, 0x98, 0x82, 0x49, 0xf1, + 0x50, 0x35, 0x27, 0xe8, 0x01, 0x0f, 0x07, 0x28, 0xba, 0x2c, 0x7f, 0x28, + 0xec, 0x19, 0xef, 0xf2, 0x3c, 0x87, 0xb6, 0x8a, 0x30, 0xbd, 0x65, 0x80, + 0x39, 0xf5, 0xf3, 0x8f, 0x29, 0xf5, 0xb6, 0x6d, 0xb4, 0x65, 0xf8, 0x60, + 0xcc, 0x42, 0xee, 0xe6, 0x2f, 0xce, 0xa8, 0x2e, 0xf5, 0x6f, 0xc7, 0xe0, + 0x6d, 0x3c, 0xce, 0x02, 0x26, 0xde, 0xeb, 0xcf, 0x24, 0x85, 0xce, 0xb5, + 0x89, 0x45, 0xc6, 0x01, 0x94, 0xc4, 0xf3, 0xb0, 0x5d, 0x4f, 0x40, 0x13, + 0xb3, 0x76, 0x51, 0xb8, 0x99, 0x67, 0x52, 0xe1, 0x86, 0xce, 0x3d, 0xdc, + 0x63, 0x00, 0x99, 0xcc, 0x5e, 0x77, 0xbc, 0xef, 0xfb, 0x98, 0x4d, 0xb4, + 0x06, 0xe8, 0xfd, 0x20, 0x02, 0x72, 0xc1, 0x83, 0x34, 0xcc, 0x4c, 0x53, + 0xac, 0x8b, 0x80, 0xac, 0xb0, 0x83, 0x31, 0x2a, 0x60, 0xda, 0x5e, 0xc6, + 0xf6, 0x68, 0x36, 0x85, 0x7d, 0x75, 0x97, 0x77, 0x74, 0x8e, 0xc2, 0xee, + 0x8b, 0x75, 0x8f, 0xb5, 0xcf, 0x6e, 0x43, 0x87, 0x50, 0xd6, 0x03, 0x14, + 0x8f, 0xde, 0xdd, 0xf3, 0x7a, 0x3e, 0x36, 0xd6, 0x5c, 0x63, 0x28, 0xc3, + 0x19, 0x99, 0xce, 0x6b, 0x17, 0x07, 0xa5, 0x43, 0xe7, 0x40, 0xb3, 0xaa, + 0x6d, 0x0f, 0x38, 0x67, 0x56, 0x40, 0xc5, 0xb8, 0x50, 0xf9, 0xfe, 0x56, + 0x34, 0xc4, 0x7e, 0x08, 0x99, 0xd0, 0xd1, 0x1f, 0x14, 0x76, 0x58, 0xdc, + 0x86, 0x8d, 0xa6, 0xee, 0x28, 0x91, 0x66, 0x10, 0xdd, 0x30, 0x6d, 0xa1, + 0xc2, 0xcb, 0x29, 0x3a, 0x9e, 0x46, 0x8c, 0x93, 0x22, 0x12, 0x96, 0xbe, + 0x6f, 0xe0, 0xa8, 0xa4, 0xe4, 0x74, 0x8d, 0x85, 0x74, 0xe5, 0x24, 0x92, + 0xbd, 0xfa, 0x02, 0x20, 0x5f, 0x65, 0x38, 0x6a, 0x1e, 0x1b, 0x73, 0xb0, + 0xfc, 0x16, 0x73, 0x49, 0x32, 0x46, 0xf9, 0xf0, 0x98, 0xcb, 0xc3, 0x04, + 0x87, 0xc9, 0xdf, 0x0a, 0x2c, 0x6a, 0x9b, 0x84, 0xe3, 0x6d, 0xca, 0x9d, + 0x87, 0x30, 0x0a, 0x19, 0x42, 0x07, 0xa5, 0xe7, 0xa5, 0xe6, 0x1d, 0xc1, + 0x49, 0xfc, 0x56, 0xaf, 0x5b, 0xe8, 0xf9, 0xcd, 0x69, 0x19, 0x53, 0x39, + 0x5d, 0xcc, 0x16, 0x57, 0x7d, 0x06, 0x4d, 0x06, 0xf6, 0xb1, 0xae, 0xdf, + 0x5f, 0xad, 0xe0, 0x85, 0x87, 0xb0, 0xe4, 0xd6, 0x40, 0xc2, 0x55, 0x66, + 0x26, 0x79, 0x2a, 0x4d, 0x6a, 0x7a, 0x56, 0x9c, 0x14, 0x72, 0x42, 0x5d, + 0x23, 0xd3, 0xf0, 0x04, 0x1e, 0x45, 0xf4, 0xdf, 0xf4, 0x49, 0xb0, 0xdd, + 0x33, 0xcd, 0x99, 0xc0, 0xf3, 0xd6, 0x64, 0xa9, 0xb8, 0x8f, 0xac, 0x17, + 0x09, 0xfa, 0x76, 0x76, 0x14, 0x95, 0x71, 0x7f, 0xe4, 0x4c, 0x7f, 0x0c, + 0x15, 0x72, 0xc1, 0xfe, 0x8b, 0xd2, 0xf1, 0x3b, 0x15, 0x26, 0xda, 0x82, + 0x67, 0x9b, 0xad, 0xf4, 0xc4, 0x42, 0x13, 0xa5, 0x1c, 0x08, 0xa1, 0x85, + 0xbb, 0xc5, 0x7f, 0xf6, 0x75, 0x49, 0x06, 0xd3, 0x41, 0x59, 0xee, 0xbb, + 0x90, 0xe9, 0xc4, 0xec, 0x1e, 0xed, 0x7c, 0x90, 0x9c, 0x3c, 0x86, 0xba, + 0x03, 0x87, 0xd4, 0x00, 0x58, 0x53, 0x0d, 0x94, 0x1e, 0x84, 0x64, 0x8d, + 0x1b, 0x9e, 0x39, 0xc4, 0x3a, 0x5f, 0xd1, 0x3c, 0x4f, 0x6f, 0x49, 0xa0, + 0xa7, 0x8d, 0xbe, 0xac, 0x4c, 0x3e, 0x04, 0x38, 0x92, 0xdb, 0x49, 0xf1, + 0xfb, 0x1c, 0x8c, 0x3d, 0xb3, 0xdf, 0x6f, 0x4a, 0x89, 0x71, 0x4a, 0x4b, + 0x8a, 0x0d, 0x42, 0xe1, 0xe5, 0x31, 0xa0, 0xc7, 0xf9, 0x32, 0xcd, 0xfe, + 0xfa, 0x6b, 0x42, 0xd6, 0xb4, 0x34, 0x1e, 0x19, 0xab, 0xaa, 0x07, 0x14, + 0x08, 0x3a, 0x04, 0xf1, 0xcb, 0x7a, 0x07, 0xc6, 0xde, 0x08, 0x1c, 0x2b, + 0x17, 0x5b, 0x79, 0x95, 0xe2, 0x26, 0x29, 0xf1, 0x3c, 0x56, 0x09, 0x0f, + 0xc3, 0x16, 0xd2, 0xa9, 0x33, 0x0d, 0x52, 0x98, 0x84, 0xd1, 0x6d, 0xea, + 0xed, 0x1a, 0x99, 0x87, 0x0d, 0x83, 0xaf, 0x56, 0xfe, 0x1c, 0x86, 0x34, + 0xca, 0x1f, 0x78, 0x32, 0xe8, 0x61, 0x31, 0xe9, 0x6d, 0x7c, 0x07, 0xce, + 0x2c, 0x13, 0x88, 0x64, 0x69, 0x0b, 0x77, 0xa1, 0xc0, 0x47, 0x77, 0x42, + 0x4e, 0x1f, 0x4c, 0xa5, 0x02, 0x75, 0xed, 0xea, 0x4f, 0x50, 0xf4, 0x6f, + 0x43, 0xba, 0x61, 0x29, 0xa4, 0x1f, 0xe2, 0x04, 0xf9, 0x00, 0x4a, 0x02, + 0x05, 0x01, 0x12, 0x9c, 0x95, 0x5c, 0x60, 0xfd, 0x26, 0x65, 0x87, 0x8e, + 0x47, 0x9d, 0x44, 0x0b, 0x1e, 0x1d, 0x7a, 0xb1, 0xde, 0x59, 0xb9, 0xaa, + 0xb9, 0x39, 0x3d, 0x80, 0xbb, 0xe7, 0x1c, 0xa3, 0x6f, 0x60, 0x1b, 0x7e, + 0xaf, 0xf8, 0xd3, 0x8c, 0x2b, 0xf3, 0xa1, 0xd4, 0xdc, 0x7f, 0x22, 0x54, + 0x23, 0x75, 0x3c, 0x48, 0x48, 0x8c, 0xb2, 0x87, 0xfe, 0xa7, 0x7c, 0xc8, + 0xe5, 0x5a, 0x56, 0x55, 0x86, 0x2b, 0xf0, 0xd6, 0xf6, 0x80, 0x23, 0xad, + 0x8a, 0x1e, 0x1a, 0xfb, 0x0b, 0x06, 0x7b, 0x63, 0x82, 0xe1, 0xe8, 0x6a, + 0x3f, 0xb4, 0x84, 0xc0, 0xb4, 0xb7, 0x62, 0x1f, 0x21, 0xbf, 0xe2, 0xb3, + 0x46, 0x6b, 0xda, 0x4a, 0x3e, 0x13, 0xb0, 0xe8, 0x96, 0xe7, 0x50, 0x48, + 0x4c, 0x6d, 0x4e, 0xb7, 0x5e, 0xea, 0xa1, 0x1b, 0xf7, 0x8b, 0xe6, 0xec, + 0x72, 0x44, 0x98, 0x65, 0xec, 0x95, 0xc3, 0xb2, 0x1a, 0x73, 0xe5, 0x0b, + 0x7e, 0x7c, 0x7a, 0xb9, 0x64, 0xa0, 0x77, 0xc4, 0x3c, 0xd7, 0x5f, 0x52, + 0x67, 0xde, 0x04, 0x17, 0x85, 0xbe, 0x9f, 0x3d, 0x2a, 0x11, 0xc7, 0xaa, + 0xf9, 0x0d, 0x73, 0x32, 0x4c, 0x46, 0xe6, 0x33, 0x2b, 0x84, 0x7e, 0x4f, + 0xb1, 0xfe, 0xa9, 0x28, 0xe4, 0xb1, 0xfd, 0x37, 0xf8, 0x5e, 0xae, 0xb2, + 0x8f, 0xba, 0x8f, 0x5b, 0x85, 0x02, 0x23, 0xca, 0xb2, 0x3c, 0xe1, 0x98, + 0xb7, 0x0b, 0xc5, 0x9b, 0x13, 0x5a, 0x70, 0x0e, 0x87, 0x84, 0xca, 0x1a, + 0x89, 0x43, 0xf1, 0x05, 0x69, 0xdc, 0x0e, 0xd2, 0x85, 0x23, 0xa0, 0x18, + 0xcf, 0x3b, 0x3c, 0x7b, 0xf3, 0x77, 0x6a, 0xc5, 0x77, 0x28, 0x44, 0x1b, + 0xea, 0xe0, 0x6f, 0x0a, 0x98, 0xce, 0x6d, 0xb4, 0xd6, 0xdf, 0x96, 0xed, + 0xad, 0xc4, 0x24, 0x35, 0xa3, 0x94, 0x49, 0x3c, 0x39, 0xaa, 0x02, 0x5d, + 0xab, 0xad, 0x19, 0xd1, 0xd4, 0xc3, 0x90, 0x3e, 0xc0, 0x0e, 0x5f, 0x8e, + 0xd3, 0x22, 0xc3, 0x5a, 0x75, 0xe2, 0x5c, 0x73, 0x87, 0xe6, 0x2f, 0x3b, + 0x4b, 0x4e, 0x31, 0x72, 0xbf, 0xb8, 0x9b, 0xbf, 0xd5, 0xf7, 0x89, 0x0c, + 0xc0, 0x8c, 0x51, 0xd5, 0xf3, 0x2c, 0xbd, 0xe6, 0xee, 0x49, 0xaa, 0x5d, + 0x0a, 0x75, 0x20, 0x81, 0x3b, 0x4c, 0x93, 0x33, 0xe9, 0xa9, 0x6d, 0xb0, + 0x54, 0xdd, 0x49, 0xd4, 0x22, 0xfc, 0xbb, 0x34, 0x98, 0x6b, 0xda, 0xae, + 0x9c, 0xd8, 0x8c, 0x8b, 0xf8, 0xfd, 0xdd, 0x4f, 0xda, 0xcf, 0x97, 0x7b, + 0x6e, 0x3e, 0x64, 0x55, 0x30, 0x25, 0x5b, 0x0e, 0x6b, 0x42, 0xfb, 0x14, + 0x28, 0xbe, 0x17, 0x33, 0x23, 0x11, 0x38, 0x65, 0xfc, 0x77, 0xb6, 0x2d, + 0x32, 0xbb, 0x99, 0xe1, 0x7b, 0x5c, 0xa6, 0x46, 0x4c, 0x93, 0x28, 0x8f, + 0x88, 0x36, 0x4c, 0xf5, 0xd1, 0x2a, 0xc8, 0x14, 0xe6, 0x2d, 0x39, 0xed, + 0xcd, 0x13, 0x1d, 0x15, 0x61, 0xbd, 0x66, 0x87, 0x8f, 0x23, 0x3b, 0xc6, + 0xf2, 0x6a, 0xd4, 0xc1, 0xcd, 0x7f, 0xd2, 0x32, 0x72, 0x3e, 0x2d, 0x7e, + 0x7e, 0xae, 0x50, 0xd3, 0x2c, 0xd4, 0x86, 0xf4, 0xef, 0x31, 0xbc, 0x48, + 0x02, 0x04, 0xd0, 0x84, 0x58, 0x05, 0x50, 0xa9, 0x78, 0x26, 0xb4, 0x0d, + 0x85, 0xe8, 0x94, 0xc3, 0xab, 0x98, 0xc5, 0x48, 0x16, 0xa4, 0xc8, 0x14, + 0xcc, 0x3b, 0x1f, 0x7d, 0xc4, 0x81, 0x06, 0x4b, 0xe3, 0x42, 0x0d, 0xf6, + 0xb5, 0x1a, 0x21, 0x28, 0x52, 0x20, 0x79, 0x0e, 0x20, 0x62, 0x69, 0xd8, + 0x28, 0xe7, 0xad, 0x88, 0xb4, 0x16, 0x14, 0xb2, 0x18, 0x6f, 0x9e, 0x64, + 0x18, 0xce, 0x7d, 0xb7, 0x83, 0x84, 0x2a, 0x87, 0x97, 0x12, 0xbe, 0x66, + 0xd1, 0xe1, 0x96, 0x92, 0x34, 0xed, 0x1c, 0xeb, 0xd6, 0x71, 0xfb, 0x1f, + 0x54, 0xbe, 0x05, 0xb2, 0x8b, 0xba, 0x4c, 0x89, 0x3a, 0x3d, 0xd0, 0x6b, + 0xb4, 0xe6, 0x2a, 0x4e, 0x06, 0x12, 0xc1, 0x1e, 0x23, 0x33, 0x22, 0x2f, + 0x8d, 0x63, 0xcc, 0xe6, 0xf1, 0xd1, 0xeb, 0xe2, 0xe6, 0x4e, 0xfe, 0xcc, + 0xbb, 0x73, 0x57, 0x26, 0x6d, 0x83, 0xea, 0x87, 0x18, 0x0b, 0x9d, 0x30, + 0x94, 0x8c, 0x37, 0x94, 0x43, 0xf4, 0xc0, 0xac, 0x99, 0x4b, 0x16, 0x4e, + 0xe1, 0xa5, 0x91, 0xa3, 0xaa, 0x33, 0x81, 0x17, 0x53, 0x69, 0x4a, 0x4c, + 0x27, 0x23, 0x68, 0xb9, 0x46, 0x61, 0xdf, 0x9f, 0x29, 0x29, 0x38, 0xd9, + 0x10, 0xf2, 0x41, 0xaa, 0xcc, 0x77, 0x34, 0x94, 0x8b, 0x60, 0x06, 0xe5, + 0xba, 0x5a, 0xaf, 0x04, 0x88, 0x6e, 0x68, 0x09, 0xef, 0x7e, 0x33, 0x35, + 0x7e, 0xd7, 0x21, 0xc1, 0x3c, 0xa6, 0x3c, 0x0c, 0x8f, 0xb1, 0x3c, 0x96, + 0x91, 0x3b, 0x97, 0x0e, 0x7f, 0xe3, 0xe5, 0x03, 0xc7, 0x9f, 0x12, 0xab, + 0x45, 0xa0, 0xc5, 0x5f, 0x4f, 0x6e, 0x1a, 0xc3, 0x45, 0xa8, 0xd6, 0xe0, + 0x49, 0x6a, 0x49, 0x5d, 0x06, 0x67, 0x1f, 0x12, 0xb3, 0x91, 0x58, 0x1e, + 0xdf, 0x32, 0xc4, 0x7d, 0x43, 0x5d, 0xcd, 0xb7, 0x14, 0x05, 0xbd, 0x5e, + 0x02, 0x99, 0x79, 0x06, 0xee, 0x2d, 0x1a, 0xd9, 0xae, 0x5c, 0x2e, 0x10, + 0x4c, 0xd7, 0x81, 0xcf, 0x4c, 0x10, 0xfa, 0x8e, 0x76, 0xe5, 0x90, 0x2c, + 0x77, 0x40, 0xfe, 0x3d, 0x99, 0x00, 0xf5, 0x29, 0xd5, 0x44, 0x36, 0x4b, + 0xdb, 0x51, 0x34, 0x2a, 0x6e, 0xee, 0xdb, 0xbc, 0x3c, 0xa3, 0xf9, 0xa5, + 0x13, 0xc8, 0xdf, 0xe9, 0x68, 0x16, 0x89, 0xb2, 0x38, 0x99, 0xc7, 0x73, + 0x0a, 0xe5, 0xbe, 0x02, 0xb3, 0x07, 0x13, 0xed, 0xd1, 0x97, 0xf0, 0xb5, + 0x25, 0xe7, 0xb4, 0xeb, 0xcb, 0xc0, 0xf7, 0x63, 0xde, 0x29, 0x51, 0x88, + 0xa9, 0xb4, 0xce, 0xc6, 0xd7, 0x50, 0xf7, 0xcf, 0x5e, 0xbe, 0x33, 0x93, + 0xb2, 0x77, 0x70, 0x0a, 0x13, 0xac, 0xea, 0x52, 0xf6, 0x69, 0x9e, 0xaa, + 0xa1, 0x2e, 0x5f, 0xfd, 0x3a, 0x52, 0x67, 0xf7, 0xe8, 0x93, 0x61, 0xd7, + 0x1e, 0x84, 0x1f, 0x73, 0xba, 0xc7, 0x0e, 0x45, 0x38, 0xf1, 0x4e, 0x55, + 0xca, 0x60, 0x22, 0xec, 0x0b, 0x3e, 0xb3, 0xdf, 0x8a, 0x82, 0x59, 0x83, + 0xa0, 0xdd, 0x1e, 0xbb, 0x6f, 0x87, 0x0b, 0x21, 0x07, 0x5d, 0x01, 0xdd, + 0xc9, 0xcf, 0xc4, 0x32, 0x74, 0xcc, 0xfa, 0xbd, 0x9e, 0xe9, 0x86, 0xb4, + 0x66, 0x94, 0x63, 0xd0, 0x32, 0x98, 0x53, 0x7c, 0xc8, 0x13, 0xba, 0xa1, + 0xc9, 0xae, 0xf1, 0xd2, 0x06, 0x04, 0xd9, 0x2f, 0x59, 0xb1, 0x5c, 0xdc, + 0x32, 0xdc, 0x67, 0xa4, 0xed, 0xfd, 0x34, 0xab, 0x27, 0xfc, 0xfb, 0x70, + 0xbe, 0x50, 0xbb, 0xb0, 0x89, 0x50, 0xae, 0x4f, 0x3b, 0xe2, 0x9c, 0xe1, + 0x90, 0xae, 0x0d, 0xc1, 0x1e, 0x65, 0x24, 0x4a, 0xf5, 0x1d, 0x02, 0xef, + 0x74, 0x3d, 0x70, 0x87, 0xb1, 0x6a, 0xcf, 0x58, 0x9e, 0x9b, 0x22, 0x29, + 0x68, 0xfe, 0x81, 0x1f, 0x5c, 0xa8, 0xed, 0x5e, 0x1e, 0x89, 0x1f, 0xf7, + 0x2b, 0x6d, 0x47, 0x89, 0xe2, 0x9c, 0xfb, 0x15, 0x28, 0x71, 0x17, 0x3d, + 0xe7, 0x63, 0x3b, 0x7b, 0x60, 0xe8, 0x57, 0x82, 0x49, 0xa8, 0x58, 0xf6, + 0x35, 0xd6, 0xfa, 0x29, 0xa8, 0x97, 0x8b, 0x1e, 0xa1, 0x33, 0xce, 0xd4, + 0x42, 0x49, 0xae, 0xef, 0x75, 0x23, 0xc9, 0x54, 0x8c, 0x7e, 0xcd, 0x3a, + 0x2f, 0x1e, 0x10, 0x22, 0x79, 0xdc, 0x97, 0x25, 0xa6, 0x14, 0x13, 0x1f, + 0x5f, 0x1b, 0xb9, 0x1f, 0x8e, 0x0b, 0x25, 0x21, 0xc0, 0x18, 0x29, 0xf4, + 0x47, 0x61, 0x0f, 0xdd, 0x6f, 0x74, 0xc1, 0x8c, 0xdf, 0x43, 0xa4, 0xac, + 0x18, 0xa7, 0x13, 0x70, 0x98, 0x53, 0xa9, 0x69, 0x1f, 0x8c, 0xbd, 0xf3, + 0xed, 0xf5, 0x11, 0x49, 0xff, 0xce, 0xb3, 0xd9, 0xc7, 0x09, 0xf6, 0x3b, + 0x78, 0x0e, 0x48, 0x97, 0x94, 0x0b, 0xb9, 0x30, 0x25, 0x90, 0x65, 0x69, + 0x6c, 0x59, 0xf4, 0x1a, 0x2c, 0x10, 0x2e, 0xe4, 0x73, 0x2e, 0x91, 0x23, + 0x3d, 0x2c, 0x57, 0x37, 0x31, 0xfd, 0xe1, 0xfb, 0x64, 0x6a, 0xb6, 0xc2, + 0x40, 0x76, 0x40, 0x4b, 0x51, 0xdd, 0x00, 0x4a, 0xad, 0xc0, 0x26, 0x51, + 0x46, 0xe6, 0xe2, 0xcd, 0xef, 0xe3, 0xcf, 0x60, 0x52, 0xca, 0xc0, 0x77, + 0xb6, 0xdf, 0x66, 0x1d, 0x00, 0x08, 0x0b, 0x0f, 0x88, 0x38, 0xc2, 0x23, + 0xa5, 0x89, 0x86, 0x30, 0xe2, 0x5c, 0x7b, 0x72, 0xb0, 0x15, 0x2b, 0x2d, + 0xb2, 0x25, 0x2f, 0x28, 0xe4, 0x26, 0x12, 0x82, 0x5f, 0x1f, 0xe6, 0xca, + 0x3b, 0xd7, 0xa4, 0x1d, 0x65, 0x8d, 0xd9, 0xa8, 0x5f, 0x19, 0xf5, 0x0b, + 0x22, 0xe7, 0x28, 0xda, 0x32, 0x51, 0xa3, 0xb7, 0x7d, 0xf4, 0xf7, 0xfb, + 0x7e, 0xd7, 0x3a, 0x6f, 0x78, 0xf8, 0xad, 0x4a, 0x31, 0x65, 0xd9, 0x77, + 0xa3, 0x54, 0x91, 0xf1, 0xc1, 0x08, 0x45, 0x83, 0x4e, 0x26, 0xcb, 0xfa, + 0x10, 0x95, 0x6a, 0xbd, 0x6a, 0x0a, 0xfb, 0x4c, 0x64, 0x01, 0xe7, 0x2f, + 0x3c, 0xfe, 0xe5, 0x6f, 0x7c, 0x1a, 0xcb, 0x60, 0x75, 0x2d, 0x27, 0x8e, + 0x67, 0x6a, 0x21, 0x6f, 0x9f, 0x5c, 0x49, 0x90, 0x22, 0x8f, 0xc6, 0x97, + 0xe5, 0x40, 0x0b, 0x65, 0x42, 0xfb, 0x6d, 0x7b, 0xe0, 0x6c, 0x46, 0xf8, + 0x35, 0x7f, 0x61, 0xc0, 0xc8, 0xd7, 0x7f, 0x47, 0x55, 0x8f, 0x03, 0x36, + 0x34, 0xad, 0x30, 0x13, 0xf1, 0x4d, 0xa4, 0x4d, 0x83, 0x19, 0xd9, 0xc0, + 0xf4, 0x9f, 0x96, 0xde, 0x65, 0xaf, 0x0f, 0x75, 0xa6, 0xfe, 0xdc, 0x7e, + 0xee, 0xd8, 0x9a, 0xd6, 0x7d, 0x8b, 0x40, 0xca, 0xf1, 0x86, 0x0b, 0x40, + 0x56, 0x46, 0x8d, 0xd6, 0x16, 0x09, 0x99, 0xd9, 0xb7, 0x08, 0xe9, 0x7b, + 0x05, 0xfa, 0xc6, 0x66, 0x5e, 0x53, 0xfe, 0xf9, 0xf8, 0x90, 0xc7, 0xef, + 0x4e, 0x94, 0x3b, 0x77, 0xad, 0xda, 0xb0, 0x4b, 0x61, 0xd3, 0xcf, 0xf2, + 0x95, 0xcc, 0xe5, 0x60, 0x8b, 0x42, 0x74, 0x30, 0x7f, 0x62, 0x75, 0x7c, + 0xac, 0xcf, 0x16, 0x84, 0xe5, 0x85, 0x41, 0xd0, 0xb9, 0xaa, 0x67, 0x9f, + 0xd6, 0x24, 0x06, 0x20, 0xa2, 0xd9, 0x7c, 0x45, 0x70, 0xff, 0xc1, 0xc8, + 0x6c, 0xe2, 0x3a, 0x78, 0xec, 0x6a, 0x24, 0xf3, 0x41, 0x60, 0xd3, 0x12, + 0x64, 0x3f, 0xcb, 0xf5, 0xcc, 0x52, 0x75, 0x87, 0x5b, 0x31, 0x95, 0x17, + 0x7b, 0x7b, 0x6e, 0xa5, 0x1c, 0x34, 0x15, 0x8d, 0x50, 0xa5, 0xc0, 0x99, + 0xf1, 0xa3, 0xe1, 0xa1, 0xd4, 0xe3, 0x31, 0xd8, 0x8e, 0x20, 0x54, 0xd9, + 0xda, 0xb2, 0x60, 0xa2, 0x96, 0x33, 0xc9, 0x63, 0x05, 0xc6, 0xe4, 0x63, + 0xcd, 0x80, 0xa9, 0x5a, 0x06, 0x58, 0x32, 0x5b, 0xbe, 0x90, 0x0e, 0x74, + 0xc8, 0x22, 0xb5, 0x90, 0xe5, 0x79, 0xfb, 0x22, 0x1d, 0xc3, 0x4f, 0xd7, + 0x13, 0xb3, 0x26, 0x21, 0xa0, 0xc7, 0x4c, 0xde, 0xb9, 0x13, 0xcb, 0xd9, + 0xa3, 0xd5, 0x0b, 0x03, 0x47, 0x07, 0xe8, 0x5f, 0x40, 0x50, 0x99, 0xf4, + 0x21, 0x80, 0x2f, 0x49, 0x24, 0x7d, 0xc3, 0x10, 0xd8, 0xfb, 0x1d, 0x27, + 0x60, 0x9c, 0xaf, 0x68, 0x2f, 0x72, 0xf2, 0xe2, 0x66, 0xb1, 0xce, 0x9e, + 0xbc, 0x75, 0xe6, 0x6f, 0xcf, 0x24, 0x68, 0x8f, 0xe3, 0x77, 0x40, 0x34, + 0x9a, 0x7c, 0xb1, 0x7d, 0x97, 0x40, 0xab, 0x87, 0x7c, 0x20, 0x69, 0x91, + 0x4f, 0xff, 0xfd, 0x66, 0x39, 0x49, 0x13, 0xfb, 0x4c, 0x91, 0x67, 0x0d, + 0x7b, 0xb7, 0x0e, 0x80, 0xb8, 0x5c, 0x53, 0x90, 0xd7, 0xea, 0x04, 0x1b, + 0xcf, 0x73, 0xcd, 0x50, 0x7b, 0xf5, 0x17, 0x3c, 0xa7, 0x6f, 0xe6, 0xf6, + 0x7c, 0x82, 0xaf, 0x4c, 0x4a, 0x5c, 0xee, 0xb7, 0x67, 0x2c, 0x57, 0x6d, + 0x3a, 0xd6, 0xab, 0x7c, 0xb9, 0xc4, 0x14, 0xfd, 0x5e, 0x3e, 0xfc, 0x2a, + 0x75, 0xfe, 0xc6, 0x5e, 0x61, 0x27, 0x99, 0x90, 0x72, 0xd5, 0xf8, 0xfd, + 0xfd, 0xfc, 0x62, 0xaf, 0xe3, 0xe9, 0x6b, 0x70, 0x18, 0x7b, 0x7f, 0xfd, + 0x95, 0xd3, 0xd9, 0x88, 0x4a, 0xc7, 0x4f, 0x6c, 0x41, 0x32, 0xe5, 0x92, + 0x1c, 0x85, 0x56, 0x43, 0xb7, 0xaf, 0x54, 0x84, 0x54, 0xca, 0x30, 0x00, + 0x04, 0xc0, 0x31, 0x27, 0x07, 0x88, 0xcd, 0x0d, 0x79, 0x24, 0xeb, 0x9b, + 0x94, 0x74, 0x23, 0x5d, 0x02, 0x02, 0xed, 0x06, 0x26, 0x13, 0xb1, 0x9e, + 0x8d, 0xa4, 0x65, 0x15, 0x4f, 0x45, 0xa5, 0xfd, 0x1a, 0x1f, 0x94, 0x37, + 0x38, 0x05, 0xed, 0x6a, 0x95, 0x59, 0x12, 0x35, 0xb8, 0x2a, 0xe8, 0xe5, + 0xda, 0x27, 0x4a, 0x3f, 0x9f, 0x48, 0x78, 0xb5, 0x36, 0x25, 0x13, 0x2c, + 0x2c, 0x00, 0xa4, 0x25, 0x71, 0x81, 0x2c, 0xc6, 0x4d, 0xce, 0x78, 0x06, + 0x38, 0x8b, 0x75, 0x03, 0xe4, 0xf0, 0xbb, 0x7f, 0xfb, 0xf3, 0x31, 0xc8, + 0xcd, 0x0f, 0x2f, 0x08, 0x91, 0xf9, 0x94, 0xde, 0xe4, 0x09, 0x10, 0x88, + 0x88, 0xfd, 0xcd, 0x29, 0x3f, 0x32, 0x8d, 0x80, 0x00, 0xea, 0x0b, 0x89, + 0x14, 0x9a, 0x95, 0x2a, 0x79, 0xb1, 0x74, 0x7f, 0xf1, 0x96, 0xba, 0xa7, + 0xc4, 0xa1, 0x75, 0x44, 0xb2, 0x2e, 0xf2, 0x61, 0x46, 0x3e, 0xb8, 0xcb, + 0x96, 0x60, 0xee, 0x70, 0x73, 0x3c, 0xbf, 0xc3, 0xeb, 0x62, 0xb8, 0xec, + 0xbc, 0xf2, 0xa2, 0x69, 0x31, 0x8e, 0xc8, 0x31, 0x46, 0x19, 0x82, 0x6e, + 0xe2, 0x2a, 0xfb, 0x95, 0xfc, 0xe4, 0x3c, 0x61, 0x7d, 0xe6, 0xf6, 0x5d, + 0x89, 0xe5, 0x03, 0x71, 0xe6, 0x16, 0xf2, 0x99, 0x06, 0x32, 0x15, 0xd7, + 0x7f, 0x20, 0x58, 0xb0, 0x7b, 0x56, 0xc3, 0x7f, 0x91, 0xba, 0x10, 0x4e, + 0x5b, 0x68, 0x7b, 0x78, 0x88, 0xf7, 0xf2, 0xda, 0x30, 0x50, 0x0a, 0xd7, + 0xb3, 0x12, 0xfa, 0x5b, 0x31, 0x9d, 0xd9, 0x5c, 0xed, 0xf6, 0xe6, 0xa8, + 0xfc, 0x88, 0x19, 0x51, 0x6a, 0xfe, 0xc0, 0x86, 0xcd, 0x12, 0xc5, 0xa3, + 0x27, 0xa3, 0x3d, 0x09, 0x41, 0x08, 0xfd, 0xf8, 0x5f, 0x3e, 0x6d, 0xc4, + 0xcf, 0xbe, 0xab, 0x3f, 0xd2, 0xe1, 0xba, 0xdc, 0x8a, 0xcc, 0x76, 0x8c, + 0x21, 0x9c, 0x1c, 0xd3, 0x3a, 0xf5, 0x35, 0xc3, 0x55, 0xee, 0x74, 0xfb, + 0x9d, 0x7d, 0xec, 0xdf, 0xaa, 0x56, 0xdd, 0x52, 0x46, 0x95, 0x8d, 0x48, + 0xb5, 0xe8, 0x53, 0x91, 0xd8, 0x09, 0xf4, 0x04, 0xf7, 0x64, 0x39, 0x5c, + 0xac, 0x05, 0x71, 0x5c, 0x58, 0xbb, 0xf3, 0x18, 0xe7, 0xff, 0x5d, 0x04, + 0xfe, 0x00, 0xce, 0x2f, 0x56, 0x7e, 0x28, 0xa5, 0x52, 0xb9, 0xfe, 0xcb, + 0xa5, 0xbd, 0xe2, 0xf4, 0x06, 0xb4, 0x71, 0x4e, 0xd6, 0xbf, 0x76, 0x6f, + 0xe1, 0x04, 0x73, 0x3a, 0xb4, 0x2e, 0x8f, 0x7b, 0xae, 0x1b, 0x1a, 0x17, + 0x32, 0x4d, 0x01, 0xa7, 0x34, 0xdf, 0x15, 0xbf, 0x66, 0x0b, 0x4b, 0x3c, + 0x69, 0x56, 0x91, 0x80, 0x52, 0xe0, 0xf0, 0x1f, 0x50, 0x3f, 0x7e, 0xc3, + 0x83, 0x2d, 0x55, 0xdc, 0x65, 0x58, 0x10, 0xcf, 0x48, 0x63, 0x02, 0xfa, + 0x6c, 0xd0, 0x28, 0x82, 0x35, 0x96, 0x6f, 0x86, 0xc2, 0xc5, 0x7d, 0x67, + 0x2a, 0x4a, 0x8b, 0x4e, 0xc5, 0x23, 0xa9, 0x0f, 0x0c, 0xec, 0xde, 0xaa, + 0xcd, 0xa8, 0x4d, 0x1b, 0x1e, 0x58, 0x85, 0xf4, 0x2b, 0xba, 0xba, 0x6c, + 0x95, 0xee, 0x0e, 0x69, 0x09, 0x04, 0x45, 0xcd, 0x14, 0x81, 0x13, 0x59, + 0x3c, 0x72, 0xc2, 0x1f, 0xbe, 0xc7, 0x85, 0x73, 0x68, 0x5c, 0xca, 0x26, + 0x51, 0xf0, 0xa3, 0xd9, 0x68, 0x1e, 0xc9, 0x1d, 0xb9, 0x17, 0x51, 0xd6, + 0xf0, 0x1d, 0x30, 0x4f, 0x78, 0x6a, 0x29, 0x2b, 0x75, 0x27, 0xa8, 0x42, + 0x5a, 0x18, 0xe9, 0x1b, 0xc9, 0x4f, 0xfa, 0x89, 0x94, 0xe5, 0x6d, 0xa9, + 0x18, 0x82, 0x9a, 0x74, 0x14, 0xb1, 0x24, 0x3a, 0xd9, 0x84, 0x45, 0x7c, + 0x40, 0x46, 0x25, 0xce, 0xec, 0x10, 0x26, 0x54, 0xee, 0x27, 0xfe, 0x14, + 0xb4, 0x48, 0xcb, 0xaf, 0xc0, 0x58, 0xe4, 0x96, 0x1e, 0xeb, 0xc4, 0x51, + 0x81, 0x90, 0xa6, 0xa1, 0x1c, 0xce, 0x85, 0xb2, 0x12, 0x24, 0x4c, 0x7c, + 0xce, 0x5a, 0x83, 0x0e, 0xc6, 0x57, 0xdc, 0x62, 0xb1, 0xa5, 0xf4, 0x28, + 0xb9, 0x4b, 0x50, 0x1f, 0x46, 0xfb, 0xd9, 0x48, 0x4e, 0xa5, 0xab, 0x88, + 0x7d, 0x66, 0x94, 0x06, 0xf5, 0x0d, 0xa2, 0x0f, 0xc6, 0xfd, 0xe4, 0xc5, + 0xd8, 0x92, 0x4c, 0xf7, 0x00, 0x3d, 0x2a, 0x76, 0x4c, 0x2a, 0xa5, 0x6c, + 0x47, 0x22, 0x17, 0x10, 0x05, 0x62, 0x32, 0x19, 0x44, 0xaa, 0xfb, 0xe1, + 0x9e, 0x18, 0xc6, 0xb3, 0xe8, 0x4f, 0x67, 0xf2, 0x5a, 0xb8, 0x01, 0x4b, + 0x29, 0x0d, 0xb3, 0x30, 0x2d, 0x06, 0xac, 0x3e, 0x8a, 0xe4, 0x5b, 0xe1, + 0x6a, 0x68, 0x5a, 0x8f, 0x27, 0x1b, 0xd2, 0x83, 0x4e, 0x80, 0x51, 0xcc, + 0x31, 0xb7, 0xc4, 0x77, 0x0b, 0xa1, 0xfd, 0x90, 0x33, 0x41, 0x79, 0x33, + 0x09, 0x9c, 0x14, 0xe4, 0x2e, 0xee, 0x6a, 0xf9, 0x7b, 0x30, 0x49, 0x88, + 0x98, 0x47, 0xf5, 0xca, 0xa6, 0xbd, 0x4f, 0xc3, 0xc4, 0x67, 0xd3, 0xed, + 0x3d, 0x06, 0xae, 0xde, 0x53, 0x57, 0xa5, 0xeb, 0xb5, 0x44, 0x2d, 0x82, + 0xaf, 0x5c, 0xfc, 0x90, 0x2b, 0x72, 0x75, 0x4f, 0xc4, 0xaf, 0x9b, 0xb3, + 0x71, 0x6e, 0xf1, 0x93, 0xa8, 0xa0, 0xd0, 0x05, 0x9f, 0xfa, 0x80, 0x8c, + 0x4d, 0x16, 0x03, 0x30, 0x6b, 0x42, 0x30, 0x1a, 0xbc, 0x59, 0xb5, 0xd3, + 0xd2, 0x0a, 0xf1, 0x24, 0x74, 0xb8, 0xa4, 0x05, 0xc8, 0x91, 0xe6, 0x03, + 0xf0, 0x08, 0xd5, 0xb7, 0x8b, 0xea, 0xe9, 0x4c, 0x7f, 0xc0, 0xba, 0xd0, + 0xbf, 0x32, 0xcb, 0x57, 0xe9, 0xa2, 0x59, 0xef, 0x5c, 0xaa, 0x4c, 0xf0, + 0xc5, 0x50, 0xb7, 0x89, 0x09, 0x4b, 0x1b, 0x67, 0x33, 0x91, 0xbd, 0xa2, + 0x66, 0xe7, 0xde, 0x09, 0xfd, 0xe6, 0x5b, 0x70, 0x67, 0xf1, 0xdf, 0xa8, + 0xfa, 0x57, 0x5d, 0x39, 0x1a, 0xd0, 0x33, 0x4a, 0xf2, 0x6c, 0x32, 0x52, + 0x75, 0x37, 0xf5, 0xe3, 0xbe, 0x52, 0x0a, 0xf4, 0xc5, 0xb5, 0xd1, 0xe6, + 0xf2, 0x61, 0x97, 0xda, 0x5f, 0x22, 0x54, 0x16, 0x6e, 0xb0, 0x43, 0x3e, + 0x26, 0x40, 0x06, 0x89, 0x94, 0x5c, 0x4c, 0xce, 0xf7, 0x32, 0x70, 0x24, + 0xa0, 0xa8, 0xc6, 0xf0, 0x86, 0x9a, 0x92, 0x65, 0xf9, 0x8b, 0xbb, 0xd3, + 0xd7, 0xaf, 0xeb, 0x4e, 0xbb, 0x20, 0x11, 0xfc, 0x28, 0xec, 0x95, 0xe6, + 0xd5, 0x34, 0xbd, 0xd0, 0x12, 0xa4, 0xae, 0x0f, 0xc5, 0xa0, 0x3e, 0xa4, + 0x6d, 0x0a, 0x50, 0xdc, 0x4e, 0x0e, 0xe4, 0x1f, 0x34, 0x37, 0x9b, 0x26, + 0x4e, 0xf0, 0x2a, 0x50, 0x93, 0x58, 0xf2, 0xd2, 0x60, 0x82, 0x50, 0xe6, + 0x7d, 0xfd, 0x84, 0xaf, 0x9d, 0x3a, 0xe8, 0xe5, 0x67, 0xbb, 0xb5, 0xf1, + 0xfc, 0x41, 0xa0, 0x7a, 0x0e, 0x5e, 0xb3, 0x7e, 0x75, 0x3a, 0xca, 0xf3, + 0x73, 0x70, 0x85, 0xd5, 0xe7, 0xbe, 0x19, 0xe8, 0x43, 0xfc, 0x93, 0x64, + 0x68, 0x82, 0x87, 0xbf, 0x85, 0x77, 0xd9, 0xec, 0xe0, 0x19, 0xf9, 0x8c, + 0xef, 0x8f, 0xb9, 0xcd, 0xe4, 0xb9, 0x8a, 0xd7, 0x23, 0x55, 0xa1, 0xcb, + 0x18, 0xbf, 0xd4, 0x16, 0xee, 0x37, 0x01, 0xc3, 0xb5, 0xcc, 0xa7, 0x80, + 0x15, 0x37, 0xe0, 0x48, 0x71, 0xc5, 0x4d, 0x21, 0xd8, 0x25, 0x31, 0xee, + 0xef, 0xa1, 0x69, 0x37, 0x19, 0xbb, 0x14, 0x81, 0x2c, 0x45, 0x81, 0x16, + 0x6b, 0x42, 0x4e, 0x09, 0xf1, 0xbd, 0xd8, 0x5f, 0xc8, 0x89, 0x52, 0x40, + 0x54, 0x50, 0x5f, 0xb0, 0xac, 0xc3, 0x73, 0x7b, 0x9d, 0x02, 0xcc, 0xd1, + 0x12, 0x54, 0x83, 0x76, 0x69, 0x8f, 0x39, 0x48, 0xa9, 0x18, 0x7a, 0x81, + 0x22, 0x73, 0x78, 0x78, 0x9a, 0x09, 0x67, 0xc2, 0xba, 0x7d, 0x83, 0xc6, + 0x1a, 0xe5, 0x47, 0x2d, 0xca, 0x8c, 0xa2, 0xef, 0x28, 0x9c, 0x4a, 0xde, + 0xe9, 0xe0, 0xcf, 0x8f, 0x30, 0x40, 0xa4, 0x26, 0x8e, 0x98, 0xa5, 0xcc, + 0x58, 0x99, 0x11, 0x6c, 0xcd, 0x0a, 0x0f, 0x9d, 0x87, 0x01, 0x8d, 0x05, + 0xfc, 0x69, 0x2a, 0xc3, 0xd3, 0x5a, 0x08, 0x59, 0x91, 0x78, 0x6a, 0x89, + 0xb1, 0x8b, 0x4e, 0x62, 0x0f, 0xf9, 0xc7, 0x10, 0x66, 0xb2, 0xcf, 0xac, + 0xed, 0xe7, 0x82, 0x2b, 0x59, 0x34, 0xc7, 0x36, 0x60, 0xf1, 0xa3, 0xb8, + 0x9f, 0x82, 0xdb, 0xac, 0x17, 0x39, 0x00, 0x73, 0xe2, 0x19, 0xab, 0x4d, + 0x69, 0x45, 0x3a, 0x01, 0x46, 0xab, 0x96, 0xb7, 0x12, 0xba, 0xd5, 0x09, + 0xf1, 0xe5, 0xf6, 0x01, 0xc5, 0x15, 0x4a, 0x74, 0x12, 0x10, 0x47, 0x57, + 0xaf, 0x36, 0xa0, 0x11, 0xc2, 0x14, 0x46, 0xc0, 0xf0, 0x4c, 0xf1, 0xc3, + 0x80, 0xc2, 0xe0, 0xc3, 0xe9, 0x5b, 0xcb, 0x54, 0x41, 0x79, 0x90, 0xd7, + 0xf1, 0x4d, 0xbb, 0x6c, 0x76, 0x62, 0x60, 0x83, 0xa0, 0x58, 0x6f, 0xd0, + 0xc0, 0x47, 0x05, 0x07, 0x1a, 0x74, 0x03, 0x91, 0x49, 0xee, 0x32, 0xce, + 0xba, 0x24, 0xb2, 0xe2, 0x66, 0xd6, 0xc0, 0x34, 0x3e, 0x0d, 0x90, 0x1f, + 0x02, 0x72, 0xe2, 0xd5, 0x68, 0x06, 0x48, 0x24, 0x48, 0x01, 0x80, 0xc5, + 0x59, 0x75, 0xeb, 0x22, 0x7f, 0xd7, 0xac, 0x58, 0xeb, 0x25, 0x48, 0xbc, + 0x67, 0xf6, 0xa6, 0xa7, 0x04, 0x78, 0x85, 0x3c, 0xfb, 0x27, 0xe7, 0x61, + 0x71, 0x86, 0xa6, 0x37, 0xda, 0x3c, 0xd6, 0x30, 0x7e, 0x7e, 0x27, 0x20, + 0xde, 0xb0, 0xb7, 0xff, 0xed, 0x8f, 0x20, 0xb8, 0x9a, 0xc6, 0x86, 0xcc, + 0x62, 0x83, 0xe2, 0x83, 0x5b, 0x7e, 0x69, 0x37, 0x09, 0xe3, 0x16, 0xc8, + 0x14, 0xc4, 0x3a, 0xf2, 0x4c, 0xe5, 0x91, 0xe7, 0x42, 0x85, 0xd0, 0xc2, + 0xb8, 0x9a, 0x4f, 0xb6, 0xc7, 0xcb, 0xa5, 0xd8, 0xc4, 0xec, 0x7d, 0xdb, + 0x93, 0x34, 0x54, 0xf0, 0x84, 0x19, 0x7a, 0xeb, 0x17, 0xa2, 0x8c, 0x95, + 0x35, 0xd8, 0x7e, 0x45, 0x89, 0x7f, 0x76, 0xe1, 0x4b, 0x16, 0xdd, 0x14, + 0xd7, 0xef, 0x97, 0xca, 0x18, 0x41, 0x72, 0x7f, 0xfd, 0x5a, 0xea, 0xb9, + 0x21, 0x89, 0xc2, 0x3f, 0x9d, 0x80, 0xe0, 0xe6, 0xb1, 0x1a, 0x04, 0x24, + 0x86, 0x11, 0x31, 0x05, 0x91, 0xcb, 0x51, 0x5f, 0x9d, 0xf1, 0x17, 0xb3, + 0x57, 0x8d, 0x92, 0xeb, 0xd1, 0xfe, 0x28, 0x54, 0x65, 0xec, 0x15, 0xdc, + 0x2f, 0x57, 0x70, 0x97, 0x3a, 0x29, 0x9a, 0x52, 0xd1, 0xb0, 0xf1, 0x0f, + 0x76, 0x77, 0x95, 0x7a, 0xbe, 0x18, 0xfe, 0xd8, 0x3f, 0x94, 0x96, 0x36, + 0x69, 0xfa, 0xec, 0x9f, 0x63, 0x7e, 0x25, 0xde, 0x79, 0x76, 0x7b, 0x27, + 0x7c, 0xe8, 0xb3, 0x9e, 0x4a, 0x94, 0xe1, 0xe0, 0x4a, 0xd8, 0x45, 0x4f, + 0xac, 0x41, 0x54, 0xe9, 0xf7, 0x75, 0x56, 0xdc, 0x2f, 0x84, 0x4d, 0x51, + 0xfa, 0xe2, 0xbd, 0xb1, 0xfb, 0x65, 0x0a, 0xb0, 0x9e, 0xd7, 0xa0, 0x95, + 0x78, 0x1c, 0xf3, 0xbb, 0xd4, 0xea, 0x1f, 0x8d, 0x11, 0x33, 0x90, 0xa6, + 0x48, 0x34, 0xa9, 0x69, 0x2e, 0xdc, 0x25, 0x76, 0x8e, 0x4c, 0x60, 0x52, + 0x8a, 0xb5, 0x89, 0xc6, 0xdc, 0x0e, 0xb6, 0x80, 0x04, 0x3b, 0x28, 0x94, + 0xfa, 0xc4, 0xfb, 0x9d, 0x5b, 0xaa, 0x16, 0x35, 0x0a, 0x30, 0xcb, 0xf9, + 0x45, 0xcc, 0x49, 0x4e, 0x9b, 0xa4, 0xd3, 0x4f, 0xcc, 0xbc, 0x23, 0xde, + 0xe9, 0x17, 0x57, 0x86, 0x9f, 0x08, 0xba, 0x6f, 0x3c, 0xd5, 0xaa, 0x86, + 0x30, 0x71, 0xd3, 0x3d, 0x61, 0xe7, 0x2f, 0x4e, 0xec, 0x6f, 0xd7, 0x0b, + 0x55, 0x48, 0xd4, 0x1e, 0xfe, 0xbe, 0x95, 0x36, 0xda, 0x7c, 0xa8, 0x66, + 0x28, 0x6d, 0xd2, 0x2d, 0x0e, 0xcd, 0x10, 0xda, 0xb5, 0x3c, 0xbd, 0x0e, + 0x0c, 0xa9, 0x44, 0x07, 0x14, 0xe2, 0x48, 0xc7, 0xaa, 0x5b, 0x24, 0xfd, + 0xb7, 0x62, 0x86, 0xbd, 0xa4, 0x2d, 0x8f, 0x96, 0x98, 0x05, 0xa8, 0xfb, + 0xd7, 0x3d, 0x8e, 0xdc, 0xa6, 0x20, 0x02, 0x8b, 0xec, 0x84, 0xdf, 0xe4, + 0xdb, 0xf8, 0xf1, 0xb0, 0x6b, 0x93, 0xcf, 0x48, 0x50, 0xbc, 0x2d, 0x4e, + 0xc8, 0xb0, 0xe7, 0x2e, 0x48, 0xdb, 0x17, 0xe2, 0xa3, 0xa5, 0xc8, 0x79, + 0x39, 0x33, 0x09, 0x0d, 0xf7, 0x63, 0x85, 0xe9, 0x5b, 0x3a, 0x0d, 0xca, + 0x4c, 0xbb, 0xa2, 0x76, 0x9f, 0x14, 0x41, 0xe7, 0x92, 0x79, 0x2c, 0x16, + 0x14, 0x59, 0x83, 0xf8, 0xed, 0x50, 0x6f, 0xe2, 0xab, 0x54, 0x6a, 0x5c, + 0x40, 0x59, 0x6f, 0x1a, 0xf3, 0x21, 0x9d, 0xb8, 0x0c, 0x15, 0x05, 0xb2, + 0x5e, 0x9d, 0x3f, 0x97, 0x7e, 0xe6, 0xbf, 0xe7, 0xe0, 0x4a, 0x73, 0x85, + 0x1d, 0xdc, 0x27, 0x38, 0xb8, 0xce, 0xe7, 0x98, 0xd7, 0x45, 0x2f, 0x81, + 0xe2, 0x1c, 0x63, 0x36, 0x02, 0x5b, 0xb1, 0xae, 0x31, 0x38, 0x33, 0x18, + 0xda, 0x5d, 0x7b, 0xd1, 0xc6, 0xdf, 0x71, 0x09, 0xe5, 0x2a, 0xcc, 0x5c, + 0x9f, 0x4c, 0x33, 0x3f, 0xb7, 0x47, 0x0c, 0x46, 0xac, 0xe8, 0xbb, 0x87, + 0xa2, 0xd9, 0x6a, 0x55, 0x30, 0x6f, 0x7f, 0xab, 0xab, 0x5b, 0x8c, 0x67, + 0x2c, 0xf4, 0x02, 0x59, 0x1d, 0xf0, 0xb9, 0x89, 0xcb, 0xaf, 0x72, 0xec, + 0xa7, 0xdb, 0x12, 0x8a, 0xa8, 0x41, 0xd4, 0x1f, 0xb7, 0xad, 0x21, 0x21, + 0xaf, 0xbf, 0xf9, 0xe4, 0x03, 0xff, 0xc0, 0x11, 0xae, 0x08, 0xc2, 0x6e, + 0x11, 0x6d, 0xec, 0x92, 0x6f, 0x10, 0x40, 0x87, 0x42, 0x4a, 0xe3, 0x47, + 0x03, 0x31, 0xf2, 0x0a, 0x59, 0xa9, 0x35, 0x3d, 0xd1, 0xc6, 0x3a, 0x36, + 0xf9, 0x7c, 0xac, 0xc5, 0xb2, 0xdb, 0x76, 0x1b, 0x8d, 0x0a, 0xcb, 0x85, + 0x56, 0xfc, 0xb8, 0x3c, 0x50, 0xe5, 0x16, 0x3a, 0xad, 0xdc, 0x0e, 0x80, + 0xce, 0x30, 0x1b, 0xac, 0xc4, 0x4c, 0x9a, 0xb1, 0x5f, 0x82, 0xa3, 0x5c, + 0xf9, 0x2b, 0xfd, 0x70, 0x44, 0xfe, 0xea, 0x11, 0x49, 0xbc, 0x07, 0x67, + 0x49, 0x76, 0x13, 0xb5, 0xb2, 0xfc, 0x15, 0x55, 0x05, 0x37, 0x2a, 0xac, + 0xdc, 0xc5, 0xf3, 0xe1, 0xd2, 0x1a, 0x6c, 0x76, 0x5a, 0xd7, 0xd9, 0xa2, + 0x42, 0x02, 0x56, 0x1b, 0xca, 0xdc, 0x6d, 0x86, 0xda, 0xc5, 0x3e, 0xc0, + 0xac, 0xf3, 0xbf, 0x9c, 0x90, 0xa9, 0x7a, 0x69, 0x81, 0x88, 0x12, 0x10, + 0xf0, 0x81, 0xb3, 0x71, 0xcc, 0x58, 0x36, 0x05, 0x7d, 0xf4, 0xa8, 0x84, + 0x9d, 0x75, 0x59, 0x74, 0x5b, 0x02, 0x56, 0x6e, 0x8f, 0xb9, 0xfe, 0xa4, + 0xeb, 0xcd, 0xfb, 0xd0, 0xf3, 0xca, 0x70, 0xbc, 0x99, 0x8d, 0x6d, 0x5f, + 0x89, 0x6b, 0xd0, 0x6e, 0x60, 0xb7, 0x69, 0x53, 0x09, 0xc7, 0x42, 0xa0, + 0x0d, 0x96, 0xaf, 0x99, 0xec, 0xce, 0x38, 0x5b, 0xba, 0x40, 0x0c, 0x82, + 0x4a, 0x5e, 0x86, 0xd5, 0xcc, 0x5b, 0xa9, 0x04, 0xec, 0xb4, 0x47, 0x70, + 0x17, 0x44, 0xb4, 0xe4, 0x05, 0xbb, 0x8b, 0xce, 0xa7, 0x2a, 0xd6, 0xfd, + 0x1c, 0xa5, 0x34, 0xbf, 0xfe, 0xa5, 0x30, 0x41, 0x15, 0x7a, 0x43, 0xff, + 0xed, 0xc3, 0x5d, 0x40, 0xa8, 0x1f, 0x2a, 0x29, 0x93, 0x7f, 0x23, 0x34, + 0xc9, 0x30, 0xe2, 0x4f, 0x59, 0x3d, 0x32, 0xb1, 0x25, 0x06, 0xa3, 0x45, + 0x96, 0xe1, 0x44, 0x8b, 0x69, 0xfd, 0x2b, 0x49, 0x71, 0xcb, 0x38, 0xf4, + 0xf4, 0x2b, 0x89, 0x6a, 0x72, 0x98, 0x6a, 0xc3, 0xc0, 0x57, 0xac, 0x79, + 0xfe, 0x2f, 0x04, 0xfd, 0xe1, 0xba, 0x18, 0x62, 0xfe, 0x30, 0x03, 0x6f, + 0xed, 0xdf, 0x9f, 0xbe, 0xd0, 0x0a, 0xa4, 0xdb, 0x0c, 0x3a, 0x0e, 0xd4, + 0xf7, 0x41, 0xa7, 0x66, 0x3a, 0x8e, 0xf0, 0xa7, 0xaf, 0x73, 0xa4, 0xc9, + 0xc8, 0xe7, 0xc7, 0x6f, 0x9f, 0x16, 0x71, 0xf9, 0xdf, 0xaf, 0x91, 0xa5, + 0x98, 0x0b, 0xed, 0xc0, 0x4e, 0x59, 0x9b, 0x4e, 0x8c, 0x78, 0x71, 0xdb, + 0x9a, 0x90, 0x65, 0xf4, 0xc7, 0x73, 0xb9, 0xfa, 0xa3, 0x2b, 0x67, 0xcf, + 0x35, 0xb5, 0x0e, 0x28, 0x7c, 0x69, 0xf8, 0x67, 0xbd, 0x52, 0xed, 0x51, + 0xc7, 0x18, 0xe4, 0x6f, 0xe6, 0xdd, 0x63, 0xe0, 0xa9, 0xba, 0x93, 0xca, + 0xa7, 0x26, 0x21, 0xaf, 0x5d, 0x1e, 0x42, 0x77, 0x45, 0x74, 0x84, 0x45, + 0x40, 0xe4, 0x63, 0x35, 0x74, 0x39, 0x89, 0x54, 0x63, 0x9c, 0xc9, 0x00, + 0xf1, 0xe0, 0xe1, 0xd4, 0x4d, 0xa1, 0x41, 0xdf, 0xb1, 0x5b, 0xa9, 0xfd, + 0x96, 0x10, 0x29, 0xe9, 0x69, 0xee, 0x6c, 0x8d, 0x60, 0xb6, 0xbe, 0xd0, + 0x27, 0x69, 0x97, 0xc5, 0xc1, 0x78, 0xe5, 0x91, 0x6c, 0x3b, 0x1e, 0xa4, + 0x16, 0x58, 0xbf, 0x35, 0x40, 0xa7, 0x5e, 0xee, 0x89, 0x1d, 0xe4, 0x6b, + 0x1b, 0xf5, 0x85, 0x79, 0xe6, 0xdc, 0x34, 0x07, 0x19, 0xc4, 0x79, 0x16, + 0xe2, 0xe7, 0x63, 0x61, 0xd5, 0x38, 0x11, 0xef, 0x72, 0xcb, 0x7d, 0x3d, + 0x90, 0x56, 0x3e, 0x82, 0xaa, 0x81, 0x4b, 0xe7, 0x77, 0x87, 0x85, 0xbb, + 0xda, 0x6a, 0x5a, 0x25, 0x11, 0x03, 0xe3, 0xe9, 0x31, 0x26, 0xeb, 0xc9, + 0x1e, 0x07, 0xea, 0xb9, 0x0c, 0x64, 0xdd, 0x3d, 0x7e, 0x61, 0x64, 0x7d, + 0x16, 0xd1, 0x5d, 0xcd, 0x65, 0x80, 0x5d, 0x9d, 0x73, 0xa7, 0x62, 0x86, + 0x87, 0x8b, 0x92, 0xca, 0x59, 0xfa, 0x8e, 0xf7, 0x99, 0x78, 0x73, 0x6d, + 0xcc, 0xc0, 0x81, 0x0d, 0x88, 0xd7, 0xfc, 0x1b, 0x75, 0xc3, 0x82, 0x84, + 0x51, 0x72, 0x7c, 0xb3, 0x90, 0x65, 0x97, 0x05, 0x8c, 0x0c, 0xd1, 0xe5, + 0xa6, 0xa9, 0x30, 0xa1, 0x51, 0xa0, 0x63, 0x6e, 0xcc, 0xdb, 0xe0, 0x7a, + 0xdd, 0x69, 0xdc, 0xd0, 0x27, 0xf6, 0xf7, 0x27, 0x95, 0x3a, 0xf4, 0x6d, + 0x67, 0x59, 0x14, 0x0a, 0x03, 0x96, 0xae, 0xad, 0x17, 0xad, 0xa3, 0xa4, + 0xde, 0x56, 0x8a, 0x37, 0xa7, 0xe8, 0xb4, 0x1f, 0xf3, 0x85, 0xdf, 0x7c, + 0x86, 0x33, 0xea, 0xf5, 0xd2, 0x7c, 0x2f, 0x7f, 0xf4, 0xf2, 0xd4, 0x41, + 0x9f, 0x55, 0xe7, 0x03, 0x3c, 0xf8, 0xeb, 0xab, 0xf9, 0xd4, 0x79, 0x42, + 0xdf, 0x3e, 0x6e, 0x7d, 0xd2, 0x71, 0x1d, 0x7a, 0xcf, 0xc7, 0x0c, 0xc8, + 0x6a, 0x2c, 0xe0, 0x19, 0xc1, 0x6d, 0x04, 0x29, 0x3f, 0xd9, 0xd3, 0xee, + 0x61, 0x1e, 0x01, 0x41, 0x66, 0xe7, 0xf2, 0x56, 0x5a, 0xf7, 0xa4, 0x4a, + 0x69, 0x59, 0xcd, 0xe2, 0x35, 0x3d, 0x6e, 0x7b, 0x0b, 0x74, 0x2f, 0xcc, + 0x7c, 0xc3, 0xd9, 0x26, 0xc4, 0x6c, 0x9f, 0xb5, 0x0b, 0xad, 0x30, 0x06, + 0x5b, 0x54, 0x30, 0x87, 0x39, 0x5c, 0x1e, 0xd1, 0xee, 0x9c, 0x8a, 0x71, + 0xd5, 0xb9, 0x86, 0x47, 0x40, 0x75, 0x66, 0xc7, 0xd2, 0x9d, 0xa5, 0x3d, + 0xd3, 0x94, 0x44, 0xde, 0x08, 0xb5, 0x2d, 0x94, 0xc7, 0xd7, 0xfa, 0x16, + 0x07, 0x6c, 0x3e, 0x15, 0x57, 0x67, 0x07, 0x92, 0xf3, 0xb1, 0x0e, 0x5f, + 0x59, 0xaf, 0xf9, 0x66, 0x74, 0xc3, 0x61, 0x51, 0x39, 0x9a, 0x42, 0xd8, + 0x49, 0xdb, 0x1a, 0x14, 0xa0, 0xa3, 0x8b, 0x18, 0x36, 0x5c, 0xaf, 0xa6, + 0x11, 0x6d, 0x60, 0xd2, 0xdc, 0x44, 0xa2, 0xc2, 0x8e, 0x7b, 0x16, 0x92, + 0x80, 0xac, 0x4a, 0x1b, 0x50, 0x31, 0xb7, 0x25, 0x95, 0xe4, 0xb7, 0xe6, + 0x59, 0xc3, 0x8e, 0x0a, 0x7c, 0x47, 0x03, 0x50, 0x26, 0xa2, 0xa9, 0x5a, + 0xcb, 0x23, 0x55, 0x79, 0x03, 0x29, 0xa0, 0xaf, 0x01, 0x5a, 0xbc, 0x05, + 0xb5, 0xa1, 0x87, 0x16, 0x29, 0x29, 0x4b, 0x3b, 0xaa, 0xa9, 0xcd, 0x37, + 0xb4, 0x50, 0x07, 0x4f, 0x21, 0x17, 0x71, 0x0d, 0x76, 0xd8, 0xdd, 0xbc, + 0x04, 0x70, 0x3e, 0xac, 0x9d, 0xe5, 0x1b, 0xb2, 0x04, 0x6c, 0xd0, 0x6b, + 0x26, 0x95, 0x94, 0xb7, 0x26, 0x5f, 0xd0, 0x6c, 0xdc, 0xd9, 0xec, 0x93, + 0x78, 0x4f, 0x96, 0xfb, 0x36, 0xc3, 0x66, 0xe4, 0x62, 0x29, 0x59, 0x4c, + 0x54, 0x71, 0xab, 0xa4, 0x43, 0xa4, 0xcb, 0x5b, 0x43, 0x49, 0x07, 0xf8, + 0xe6, 0x26, 0xcf, 0xcf, 0x98, 0x88, 0xeb, 0x99, 0x0d, 0xab, 0x40, 0x67, + 0xbc, 0x0c, 0xff, 0x3d, 0xe0, 0xdb, 0x8f, 0x19, 0xf7, 0x80, 0xd3, 0x4e, + 0xc1, 0xd1, 0x0d, 0x47, 0x4f, 0xeb, 0xe7, 0x6c, 0xe8, 0x98, 0xd5, 0x73, + 0xa0, 0xb4, 0x9f, 0xed, 0x21, 0x44, 0x13, 0x93, 0xe5, 0x38, 0x95, 0x1e, + 0xf9, 0xe8, 0x73, 0xe2, 0x06, 0x37, 0xe5, 0xd9, 0x2d, 0xbe, 0xba, 0x87, + 0x93, 0xdb, 0xc7, 0x9e, 0x29, 0xf2, 0x3d, 0x8a, 0xe9, 0xa6, 0xa3, 0x0e, + 0x25, 0xb2, 0x79, 0xe5, 0x8c, 0xdd, 0xb8, 0x16, 0x5e, 0x3f, 0x86, 0x7b, + 0x25, 0x88, 0x3f, 0x77, 0x33, 0x74, 0x72, 0x5e, 0x7e, 0xbf, 0x88, 0xa9, + 0x18, 0x14, 0xb2, 0xea, 0x20, 0x01, 0xcf, 0x2b, 0x19, 0x07, 0xa0, 0xd8, + 0x2b, 0x84, 0x3b, 0x52, 0xdf, 0xf1, 0x87, 0x89, 0x3f, 0x40, 0x95, 0x4e, + 0x8f, 0x91, 0x82, 0xf0, 0x7e, 0x16, 0x88, 0xe7, 0xf5, 0xf9, 0x0b, 0xbc, + 0x25, 0x38, 0xdf, 0x32, 0xbe, 0xc6, 0x62, 0xe4, 0x63, 0xde, 0xdd, 0x9d, + 0x07, 0x93, 0x19, 0xfd, 0x38, 0xee, 0x4c, 0x74, 0x42, 0xd5, 0xb1, 0x4c, + 0x5f, 0xea, 0xa7, 0xb6, 0xa0, 0x84, 0x5f, 0xd7, 0xd7, 0xba, 0x8a, 0x41, + 0x7b, 0xa7, 0x66, 0x5c, 0xd7, 0xb2, 0xeb, 0xad, 0x15, 0x3b, 0x4c, 0x16, + 0x83, 0xe3, 0x16, 0x51, 0x3d, 0x94, 0x42, 0x8d, 0x9f, 0x9c, 0x85, 0x2d, + 0x27, 0x26, 0x55, 0xa6, 0x34, 0xf6, 0x59, 0x2c, 0x46, 0xe6, 0xe1, 0x7b, + 0xde, 0x07, 0x1d, 0x1c, 0x34, 0x70, 0xca, 0xab, 0x24, 0x64, 0x14, 0x8e, + 0xee, 0x93, 0x8c, 0x90, 0x67, 0x35, 0xe1, 0x25, 0x56, 0x97, 0x27, 0x0d, + 0x94, 0xb8, 0x9c, 0xa9, 0xdf, 0xea, 0x56, 0x50, 0xeb, 0x0b, 0x61, 0x75, + 0x4d, 0xad, 0x77, 0xcf, 0xb9, 0xf8, 0x41, 0x95, 0x8f, 0x05, 0x50, 0xaf, + 0x2d, 0x2d, 0xc2, 0x8b, 0x75, 0x5d, 0x2d, 0xa1, 0xca, 0xf8, 0x33, 0xdb, + 0xb0, 0xf0, 0x0e, 0x6b, 0x11, 0x53, 0xd4, 0xd4, 0x56, 0x49, 0x4c, 0x1d, + 0x08, 0x0d, 0x5a, 0x61, 0x36, 0x67, 0x13, 0x57, 0xa0, 0x88, 0xaf, 0x48, + 0xfb, 0x56, 0x17, 0x65, 0x9a, 0xd9, 0xf1, 0xef, 0x16, 0xf7, 0x5e, 0x11, + 0x8e, 0xe2, 0xd4, 0x70, 0x41, 0xfb, 0x49, 0x6a, 0x47, 0x07, 0x8c, 0x67, + 0x4d, 0x34, 0xe6, 0xd9, 0x9f, 0x1a, 0x1a, 0xa8, 0xce, 0x5c, 0x33, 0x41, + 0x18, 0xbd, 0x8e, 0xca, 0xda, 0xb2, 0x58, 0xc1, 0xbc, 0x7d, 0x7c, 0xc8, + 0xef, 0x6d, 0x84, 0xfe, 0x5e, 0x30, 0x10, 0xdd, 0x6d, 0xae, 0x7d, 0x59, + 0x75, 0x7c, 0x37, 0x50, 0x4a, 0x1b, 0x18, 0x1a, 0x0e, 0x61, 0x9e, 0x0f, + 0xae, 0x5d, 0x58, 0x8c, 0x83, 0x44, 0xb3, 0xe0, 0xc0, 0x29, 0x3c, 0xd6, + 0x4a, 0x5a, 0x8b, 0x01, 0x5c, 0x5a, 0x1f, 0xd4, 0xd6, 0xea, 0xcd, 0x91, + 0x7b, 0xbf, 0x0c, 0x7c, 0xbe, 0xe5, 0x8d, 0x4d, 0xd8, 0xad, 0x74, 0x62, + 0xff, 0x9e, 0xa4, 0x61, 0x1f, 0x86, 0x73, 0x2a, 0x8c, 0x07, 0x2c, 0xb3, + 0xfc, 0x5d, 0x1a, 0x69, 0x88, 0x31, 0xe5, 0xe6, 0x15, 0x87, 0x16, 0x4b, + 0xb9, 0x76, 0x6e, 0x23, 0x25, 0x7e, 0x6d, 0x1c, 0x9b, 0xc5, 0xa8, 0x61, + 0x0b, 0x64, 0x43, 0x41, 0xfd, 0xae, 0x3b, 0x8d, 0x9a, 0xaa, 0xc7, 0x2d, + 0x30, 0xfa, 0x93, 0xdb, 0x9f, 0x89, 0x8e, 0x4a, 0x77, 0x2b, 0x3f, 0x53, + 0x82, 0xf0, 0x64, 0xc4, 0x8e, 0x76, 0xd6, 0xbe, 0xe2, 0x28, 0x99, 0x5a, + 0xfb, 0x21, 0x21, 0x32, 0x3d, 0x61, 0xa2, 0xb9, 0xe3, 0xc4, 0x6b, 0xaa, + 0x52, 0x97, 0x69, 0x6e, 0x66, 0x1b, 0x0f, 0xad, 0xbc, 0xa7, 0x69, 0xd2, + 0xa0, 0x11, 0xb4, 0x0f, 0x96, 0xd2, 0x9e, 0x3a, 0xd9, 0x19, 0xad, 0x9b, + 0x00, 0x6c, 0x2e, 0xf1, 0xbc, 0xf8, 0x5e, 0x34, 0x94, 0x6a, 0x78, 0x36, + 0xa3, 0x82, 0x04, 0x9b, 0x40, 0x07, 0xa8, 0x32, 0x7d, 0x1b, 0x18, 0x07, + 0x3a, 0x12, 0x83, 0xf9, 0x2f, 0x62, 0xcf, 0x6a, 0x5d, 0x77, 0x12, 0x27, + 0xa7, 0xe3, 0xad, 0x1d, 0x58, 0x53, 0x3e, 0x39, 0xf6, 0x81, 0xc9, 0x44, + 0x81, 0x0a, 0x8b, 0xd2, 0x0b, 0xcb, 0xd1, 0x96, 0x95, 0x85, 0x82, 0x68, + 0x5e, 0x3f, 0x84, 0xce, 0x95, 0xe6, 0xe6, 0xf0, 0xbb, 0x45, 0xbb, 0xd3, + 0x9b, 0xad, 0xb4, 0x33, 0xfa, 0xc2, 0x98, 0x81, 0x5d, 0xe8, 0xf3, 0xa0, + 0x0d, 0x45, 0x6f, 0xd1, 0xc2, 0x43, 0x28, 0x3f, 0xf6, 0xbd, 0x05, 0x68, + 0xd3, 0x3e, 0x1b, 0xba, 0x6f, 0xd9, 0xe4, 0x2b, 0xb1, 0xe8, 0xaf, 0xe6, + 0xdd, 0xc7, 0x19, 0x03, 0x66, 0xf6, 0x8f, 0xbf, 0x7e, 0xba, 0x25, 0xcc, + 0x63, 0x85, 0xc8, 0xfa, 0x1c, 0xda, 0xcf, 0x81, 0x68, 0xe0, 0x9a, 0x38, + 0x86, 0x2f, 0xf0, 0x0d, 0x68, 0x8d, 0x1c, 0x9f, 0x8d, 0x19, 0x8c, 0x90, + 0xd9, 0x71, 0x12, 0xd4, 0xdc, 0x1f, 0x70, 0x48, 0x5f, 0x0d, 0x93, 0x8f, + 0xb4, 0x86, 0x69, 0xc4, 0x6b, 0xa3, 0x06, 0x6c, 0x9a, 0x2b, 0x25, 0xc5, + 0x89, 0xa6, 0x1a, 0x42, 0x0c, 0xf6, 0x72, 0x2f, 0xaa, 0xd0, 0x93, 0x8d, + 0xf8, 0x2a, 0x97, 0x7a, 0xf2, 0x3d, 0x13, 0x80, 0xa5, 0xd7, 0xa4, 0x8f, + 0x5a, 0x4b, 0x52, 0xeb, 0xf5, 0x3a, 0x34, 0x93, 0x3d, 0xb3, 0xab, 0x64, + 0x34, 0x1f, 0x82, 0xfb, 0x12, 0x01, 0x5c, 0x37, 0x3a, 0x06, 0x93, 0x76, + 0x40, 0xe0, 0x29, 0x5c, 0x35, 0xe1, 0x8a, 0x8b, 0x3d, 0xa4, 0xe0, 0x38, + 0x24, 0x29, 0x59, 0xdd, 0x98, 0x84, 0x29, 0x84, 0xfd, 0x2c, 0x8e, 0xdb, + 0x3e, 0xc9, 0xa4, 0x6b, 0x61, 0x5b, 0xf5, 0x32, 0xb9, 0x91, 0x30, 0x62, + 0xe1, 0x1d, 0x55, 0x11, 0xc3, 0xe7, 0xf7, 0x9a, 0x3e, 0xa6, 0x39, 0x18, + 0xba, 0xf6, 0x6f, 0xa5, 0x3b, 0x86, 0x1a, 0x96, 0x41, 0x84, 0x1a, 0x20, + 0x09, 0x8f, 0xcf, 0x04, 0x64, 0xc4, 0x6d, 0x3b, 0x89, 0x39, 0x4e, 0x1f, + 0x7f, 0x25, 0xbd, 0x9b, 0xad, 0xf7, 0x40, 0xa7, 0x8e, 0xd1, 0xfb, 0xb6, + 0x5d, 0xd5, 0x94, 0x1f, 0xaa, 0xd7, 0x5c, 0xb8, 0x0d, 0x7e, 0xfc, 0x63, + 0x6a, 0x3d, 0xdb, 0xed, 0xa8, 0xf7, 0x95, 0x7e, 0x11, 0xf2, 0xb1, 0x64, + 0x5c, 0xae, 0x7c, 0x28, 0x29, 0xdf, 0x79, 0x1e, 0x2c, 0x38, 0x10, 0xc7, + 0xc0, 0x4e, 0xd6, 0x10, 0xa2, 0x26, 0x79, 0x8a, 0xae, 0x77, 0xa7, 0x3f, + 0xb1, 0xcd, 0xb5, 0x58, 0xf9, 0x13, 0xec, 0xbb, 0x24, 0x20, 0x0b, 0xe6, + 0x22, 0xf2, 0x00, 0x2c, 0xb2, 0x0d, 0xff, 0x1e, 0x2b, 0xaa, 0xd0, 0x98, + 0x4d, 0x84, 0x33, 0xdb, 0x57, 0x6f, 0x2e, 0x1b, 0x2a, 0x69, 0x6a, 0xbb, + 0xa1, 0xd2, 0x22, 0x95, 0x2c, 0xaf, 0xfe, 0xd8, 0xa3, 0xdb, 0x12, 0xae, + 0xc9, 0x6f, 0x96, 0x07, 0x96, 0x57, 0x6f, 0xa0, 0x87, 0x7b, 0xf3, 0xd8, + 0xea, 0xeb, 0xf1, 0xa6, 0xbb, 0x1f, 0x8e, 0x19, 0x18, 0xa6, 0xdf, 0xb4, + 0x23, 0x3e, 0x29, 0x58, 0xaa, 0x0f, 0xbb, 0xac, 0x55, 0x2b, 0x43, 0x8c, + 0x23, 0x1c, 0x85, 0x0b, 0x47, 0xd0, 0xa8, 0x6f, 0x44, 0xc3, 0xc1, 0x5c, + 0xf3, 0xeb, 0xc1, 0x1a, 0x53, 0xb5, 0x33, 0x76, 0x1c, 0x8f, 0x4d, 0x73, + 0xbc, 0x45, 0x4c, 0xa1, 0x14, 0xd2, 0xa5, 0x19, 0x84, 0xfc, 0x47, 0xa2, + 0x7b, 0x7f, 0x4f, 0xc4, 0x1a, 0x14, 0x45, 0x90, 0x44, 0xbc, 0x2b, 0x3f, + 0x41, 0xec, 0xae, 0x64, 0xd2, 0x97, 0x6c, 0xf9, 0x23, 0xbc, 0x46, 0xbe, + 0x6a, 0x33, 0x2f, 0xc9, 0x5c, 0xf3, 0x1b, 0x4c, 0x2e, 0x84, 0x08, 0x98, + 0x47, 0xfa, 0x18, 0xa3, 0x9e, 0x06, 0x27, 0x29, 0x90, 0x76, 0x72, 0xa5, + 0xec, 0x04, 0xe2, 0x03, 0x73, 0x3c, 0x51, 0x63, 0x23, 0xe6, 0x7a, 0x1e, + 0x70, 0xc9, 0x90, 0x97, 0xfd, 0x08, 0xf4, 0x02, 0xb7, 0x48, 0x8a, 0x17, + 0xb5, 0xc4, 0x7d, 0x8c, 0x26, 0xa5, 0x38, 0x86, 0xc7, 0x90, 0xb4, 0x1b, + 0xb3, 0x58, 0x4f, 0x9b, 0x5a, 0x8e, 0x73, 0x8d, 0x69, 0xef, 0xde, 0x11, + 0xfc, 0x89, 0x02, 0x56, 0xa2, 0x01, 0xe4, 0xdd, 0x3d, 0x18, 0xf4, 0x8b, + 0x3a, 0x85, 0x0c, 0xa0, 0xd7, 0xf6, 0xa6, 0x40, 0x30, 0xf3, 0xd9, 0x6f, + 0xca, 0x25, 0x51, 0x54, 0x13, 0x3a, 0x45, 0x51, 0xe9, 0x72, 0x6a, 0x2e, + 0x2f, 0xd8, 0x2c, 0x58, 0x5a, 0x5e, 0x7d, 0xf2, 0xeb, 0x19, 0x7e, 0x8c, + 0xf7, 0xcd, 0x57, 0xc9, 0x90, 0xc3, 0x8f, 0xac, 0xc1, 0x7d, 0x7a, 0x3d, + 0xad, 0x0b, 0x14, 0x17, 0xe6, 0x89, 0x8d, 0x63, 0x23, 0x60, 0xe4, 0x6f, + 0x40, 0x61, 0x57, 0xf2, 0x74, 0x47, 0x05, 0x18, 0xca, 0x30, 0xd8, 0xe8, + 0xf2, 0x1b, 0x18, 0x94, 0xe4, 0xa6, 0xc8, 0xb8, 0x76, 0xe8, 0xb0, 0x71, + 0x44, 0xe6, 0x86, 0x44, 0xdd, 0xbd, 0x39, 0x81, 0x4d, 0xb8, 0x7b, 0xb7, + 0x3e, 0x72, 0x27, 0xa8, 0xa3, 0x52, 0x44, 0x13, 0xc8, 0xb7, 0x82, 0xb4, + 0xf9, 0x4e, 0x64, 0xe7, 0xe2, 0x7e, 0x16, 0xf7, 0xef, 0x63, 0xad, 0xa0, + 0x72, 0x2d, 0xf0, 0xce, 0xc2, 0x4f, 0x45, 0xb8, 0x03, 0x72, 0xa9, 0x9f, + 0xec, 0x16, 0xc8, 0x73, 0xfb, 0x75, 0xc4, 0x2b, 0xde, 0xc3, 0x0d, 0xec, + 0xa1, 0xf4, 0xfc, 0xc8, 0xa5, 0x2c, 0x26, 0x82, 0xfe, 0x6c, 0x04, 0x49, + 0x2e, 0xde, 0xe4, 0x96, 0xb7, 0x5f, 0x64, 0x58, 0xc9, 0x0b, 0x4f, 0xb0, + 0xfd, 0xde, 0x81, 0xc9, 0xeb, 0x01, 0xb5, 0xe5, 0x8d, 0xec, 0x4b, 0xcf, + 0xae, 0x32, 0x0d, 0x71, 0x8b, 0x1b, 0x98, 0x81, 0xe6, 0xf8, 0xa4, 0x42, + 0x41, 0x9d, 0x83, 0x9f, 0x9c, 0x99, 0xf8, 0x66, 0xf2, 0x03, 0x0e, 0xdb, + 0x63, 0xcd, 0x85, 0x85, 0x05, 0x3f, 0xa6, 0x44, 0x31, 0xcb, 0x42, 0x6d, + 0x68, 0xcc, 0x1b, 0x7f, 0x63, 0xe4, 0xdd, 0x62, 0xff, 0x8e, 0x64, 0x27, + 0x86, 0xf9, 0x4b, 0x11, 0x01, 0x26, 0x7e, 0x4c, 0x34, 0xae, 0xd7, 0x8c, + 0x84, 0xc6, 0x6c, 0xcb, 0xda, 0x85, 0x4b, 0xba, 0x2d, 0xb0, 0x6d, 0x58, + 0x4d, 0x1e, 0x92, 0x3c, 0xaf, 0x42, 0xf9, 0x62, 0xdd, 0xf0, 0x8e, 0x28, + 0xa5, 0x6b, 0xa9, 0xa8, 0x5a, 0xc7, 0xfc, 0x96, 0x14, 0xe6, 0x86, 0xc4, + 0xeb, 0x9b, 0xdb, 0x67, 0xb2, 0x1b, 0x99, 0x4e, 0x41, 0x62, 0x21, 0x66, + 0x6a, 0x19, 0xcc, 0x3c, 0x5d, 0x0e, 0x6d, 0x8e, 0xef, 0xdc, 0x4d, 0x2a, + 0x9e, 0x91, 0xea, 0x2c, 0x74, 0x9c, 0xb9, 0x15, 0x12, 0x7c, 0x97, 0xc6, + 0xe9, 0xdb, 0x47, 0xd2, 0xa1, 0xaa, 0xba, 0xa9, 0xa5, 0x67, 0xf6, 0x5c, + 0x62, 0x5f, 0xc0, 0xc9, 0x1b, 0xb2, 0x67, 0xfd, 0x14, 0xde, 0x4f, 0xaf, + 0x24, 0x9a, 0xd6, 0x04, 0x1b, 0x5d, 0xe1, 0x8e, 0xcb, 0xb9, 0x0c, 0x8c, + 0x7e, 0xfc, 0x8c, 0x87, 0x18, 0xbe, 0xf1, 0x67, 0x5e, 0x46, 0x6a, 0x46, + 0x86, 0x77, 0xf3, 0x3b, 0xe8, 0xbb, 0x72, 0x8b, 0xab, 0xab, 0xac, 0x62, + 0xa6, 0x3a, 0x3a, 0x1d, 0x56, 0xd0, 0x92, 0x39, 0xa7, 0x99, 0xfe, 0x51, + 0x74, 0xde, 0x08, 0x8e, 0x02, 0x41, 0x14, 0x3d, 0x10, 0x01, 0x46, 0xd8, + 0x10, 0xef, 0xbd, 0x27, 0x43, 0x80, 0xf0, 0xde, 0x73, 0xfa, 0x61, 0x82, + 0x0d, 0x66, 0x8d, 0x46, 0xea, 0xae, 0xaa, 0xff, 0x9e, 0x56, 0xd3, 0x4d, + 0xb6, 0x80, 0x4a, 0x61, 0xf5, 0x4a, 0x54, 0x76, 0x18, 0x2c, 0xbb, 0x3b, + 0x13, 0x97, 0x94, 0xbc, 0x82, 0x30, 0xe9, 0x46, 0xe6, 0xe9, 0x8e, 0x92, + 0x7e, 0xeb, 0x7b, 0x64, 0x81, 0x8e, 0xb3, 0xf2, 0xe4, 0xfb, 0x4d, 0xef, + 0xc4, 0x9d, 0x36, 0x0d, 0xdb, 0x98, 0x99, 0xe7, 0x38, 0x39, 0x69, 0x3c, + 0xf5, 0x37, 0x47, 0x3e, 0x11, 0x49, 0x76, 0x86, 0x03, 0x84, 0x41, 0x8d, + 0x89, 0xa3, 0x96, 0xe8, 0xb3, 0x7b, 0xe5, 0xf7, 0x8c, 0xa7, 0xc9, 0xcd, + 0x89, 0xc7, 0x36, 0xa6, 0xf9, 0xb3, 0x51, 0xf7, 0x71, 0x92, 0xe0, 0x9a, + 0xc0, 0x8e, 0x0c, 0x55, 0x80, 0x2f, 0x90, 0x1f, 0x4e, 0xf5, 0xe8, 0x0f, + 0xa7, 0xc1, 0x4e, 0x6a, 0x7a, 0x07, 0x73, 0x86, 0x1c, 0x2c, 0x2f, 0xca, + 0x9e, 0x33, 0xa7, 0x57, 0xcd, 0x65, 0x05, 0x6c, 0x45, 0xf6, 0xfd, 0xbf, + 0x76, 0x31, 0x89, 0xc9, 0xa9, 0x19, 0xf6, 0xfe, 0xf1, 0x63, 0x6b, 0x32, + 0x50, 0xd1, 0xf9, 0xde, 0xd9, 0xdd, 0x84, 0xec, 0x76, 0x68, 0x49, 0xb8, + 0x7c, 0x80, 0x08, 0x8a, 0x41, 0x64, 0xad, 0x01, 0x5a, 0x28, 0x0b, 0x22, + 0x4f, 0x04, 0xfd, 0xcd, 0xf2, 0xdd, 0xc6, 0xcc, 0x06, 0xb7, 0x17, 0x2d, + 0x99, 0xa3, 0x95, 0xb9, 0x49, 0xcc, 0x79, 0x6a, 0x73, 0xaf, 0x15, 0x62, + 0xd0, 0x79, 0x08, 0xd8, 0xe8, 0x87, 0x12, 0x4e, 0x3a, 0x30, 0xf9, 0x41, + 0x61, 0x69, 0x2c, 0xeb, 0x1f, 0xef, 0xf3, 0x8e, 0xae, 0x4f, 0x31, 0x1f, + 0x8e, 0x2b, 0xd0, 0xba, 0xb3, 0x6d, 0x0a, 0x67, 0x05, 0x14, 0xf8, 0x72, + 0x79, 0x1b, 0x02, 0xd8, 0x15, 0x7c, 0x11, 0x27, 0x2a, 0xfa, 0x46, 0x9a, + 0x31, 0xf7, 0xb8, 0xd0, 0x70, 0xd6, 0xc1, 0xd4, 0xca, 0xfc, 0xb9, 0x9f, + 0x95, 0xbc, 0x01, 0xe6, 0x8a, 0x86, 0x25, 0x83, 0xdb, 0xb3, 0xb3, 0x6b, + 0xce, 0x38, 0x1b, 0x4c, 0x82, 0xef, 0xc8, 0x4b, 0x8d, 0x60, 0x60, 0x14, + 0xf9, 0x1b, 0xe7, 0x74, 0xcb, 0x16, 0xdd, 0xf6, 0x82, 0x22, 0x91, 0x12, + 0xea, 0xd5, 0xa7, 0x71, 0xbb, 0xfe, 0xed, 0x68, 0x65, 0xe9, 0x4c, 0xd1, + 0x95, 0x48, 0x23, 0xdf, 0x60, 0x1c, 0x0f, 0x12, 0x58, 0x80, 0xea, 0x69, + 0xa3, 0x1f, 0x52, 0xfd, 0x80, 0x14, 0xcb, 0x44, 0x5a, 0xbd, 0x50, 0x02, + 0xc1, 0x3d, 0x03, 0xf1, 0xba, 0x0b, 0x06, 0x3c, 0xca, 0xff, 0x89, 0xae, + 0xfc, 0x83, 0xe6, 0x20, 0xdf, 0x54, 0x49, 0xe1, 0xde, 0x9d, 0x0c, 0x0c, + 0xa6, 0x4e, 0xa2, 0x98, 0x3e, 0xf1, 0xe0, 0x17, 0x5c, 0x2c, 0x00, 0xc9, + 0x6b, 0x46, 0x7c, 0x9c, 0xd2, 0x11, 0x89, 0x3e, 0xd7, 0xd0, 0xe4, 0x9b, + 0xb6, 0x59, 0xf8, 0x01, 0x2c, 0x38, 0x0c, 0x53, 0x7c, 0x15, 0xf2, 0x2d, + 0x74, 0xc3, 0x1d, 0x18, 0x60, 0xf1, 0x8b, 0x18, 0xa3, 0x84, 0x7d, 0x17, + 0x3c, 0xd0, 0x51, 0x67, 0x3e, 0x49, 0xe0, 0x66, 0x01, 0xf6, 0xd6, 0xee, + 0x7e, 0x54, 0xe4, 0x32, 0x2a, 0xc6, 0x00, 0x21, 0x7f, 0xe2, 0xf3, 0x04, + 0xcb, 0x85, 0xfb, 0xe3, 0x02, 0xdf, 0x97, 0x85, 0x6f, 0x2f, 0x9e, 0xd2, + 0xf0, 0x52, 0x77, 0x80, 0xd3, 0xe4, 0x83, 0x9b, 0x07, 0x3c, 0x8b, 0xe4, + 0x11, 0x96, 0xa7, 0x45, 0xc2, 0x86, 0xc5, 0x72, 0xf4, 0x62, 0xa2, 0x31, + 0xa0, 0x1a, 0xb2, 0xf3, 0x28, 0x75, 0x00, 0x79, 0x00, 0xa9, 0xfa, 0x54, + 0x6a, 0xbf, 0x04, 0x6e, 0x4c, 0xd2, 0x42, 0xa3, 0xbd, 0x8f, 0x53, 0xfe, + 0xba, 0x90, 0x5e, 0x0e, 0x0d, 0xda, 0x09, 0x17, 0x57, 0x7e, 0x6b, 0xed, + 0x17, 0x69, 0xe3, 0x2f, 0x12, 0x2c, 0xb3, 0xb6, 0x38, 0x66, 0x40, 0xb3, + 0xd8, 0x5f, 0x36, 0x31, 0xc9, 0x2f, 0x87, 0xa5, 0xfe, 0x5b, 0x3a, 0xe5, + 0xf9, 0x63, 0x1e, 0x39, 0xcd, 0x1a, 0xb4, 0x7e, 0x9b, 0xeb, 0x95, 0x49, + 0xe0, 0xaa, 0x6e, 0x5e, 0x74, 0xdc, 0x6b, 0x4c, 0xcc, 0xda, 0x5c, 0x68, + 0x43, 0xdf, 0x7a, 0x79, 0x74, 0xe8, 0x80, 0xc1, 0x8d, 0xb2, 0xd3, 0xc9, + 0xea, 0x2b, 0x3b, 0x75, 0x72, 0x88, 0x89, 0xa5, 0xf2, 0xd3, 0x59, 0xa3, + 0xe6, 0xb6, 0x10, 0xfc, 0x2f, 0xff, 0xbd, 0xd8, 0x33, 0x36, 0x13, 0x7d, + 0x88, 0xbc, 0xc2, 0xbe, 0x2c, 0xc2, 0x1d, 0x31, 0x42, 0xb3, 0xc0, 0x54, + 0x3f, 0x10, 0x32, 0x4e, 0x1b, 0xd0, 0x73, 0x75, 0x00, 0x56, 0xa9, 0x06, + 0x23, 0xfa, 0xbb, 0xf1, 0x14, 0xc4, 0x3a, 0xb0, 0x4d, 0xe1, 0x37, 0xa1, + 0xf5, 0x0b, 0x1a, 0x8a, 0x4e, 0xae, 0xca, 0x3b, 0x98, 0x97, 0x2c, 0xc5, + 0x80, 0x3d, 0x74, 0xb7, 0x13, 0xda, 0x80, 0x4b, 0x11, 0xac, 0x27, 0xe1, + 0xa8, 0x78, 0x2a, 0xd7, 0x13, 0x91, 0x9f, 0xe5, 0xbd, 0x24, 0xb1, 0xf4, + 0x75, 0xf2, 0x94, 0x5b, 0x20, 0x44, 0xc8, 0x31, 0x26, 0xf1, 0x39, 0x58, + 0xcf, 0xd0, 0x54, 0x63, 0x17, 0xb3, 0xed, 0xc7, 0x9d, 0x90, 0x26, 0x3f, + 0x0c, 0x38, 0x2b, 0x8b, 0x0d, 0x2b, 0xad, 0x9f, 0x73, 0xeb, 0xe0, 0xcd, + 0xac, 0xb0, 0x9a, 0xb9, 0xdf, 0x29, 0x15, 0x1f, 0xba, 0x39, 0x5e, 0x4e, + 0x0f, 0x99, 0x27, 0xef, 0x5f, 0xf9, 0xe9, 0x90, 0x2c, 0x9a, 0x81, 0x1d, + 0xbb, 0x88, 0xbe, 0x46, 0xd7, 0xdf, 0xaf, 0x8c, 0x1c, 0x36, 0x87, 0x2a, + 0x0d, 0x57, 0xcb, 0x55, 0xcb, 0x68, 0x57, 0xc9, 0x50, 0x39, 0x2b, 0x1f, + 0xbf, 0xf9, 0x03, 0xbc, 0xc8, 0x08, 0xf5, 0x8f, 0xc1, 0x98, 0x53, 0xea, + 0xae, 0xdf, 0x39, 0x48, 0x53, 0x32, 0x9c, 0x02, 0xff, 0x37, 0x31, 0xd3, + 0x1b, 0xc7, 0x7e, 0x92, 0xf6, 0x60, 0x23, 0x30, 0x48, 0xc6, 0x9d, 0xd7, + 0x88, 0x7c, 0xea, 0xe8, 0x7d, 0xd8, 0x11, 0x8d, 0x82, 0x56, 0xb4, 0xca, + 0xf2, 0xf8, 0x99, 0xe1, 0x07, 0x4d, 0x7e, 0x06, 0x14, 0x7f, 0x39, 0xbd, + 0x15, 0x3e, 0x75, 0x45, 0xf9, 0xf9, 0x49, 0x2a, 0x00, 0x7c, 0xe8, 0x06, + 0xb5, 0x62, 0x45, 0x60, 0x56, 0x53, 0x8f, 0x57, 0x3b, 0xb1, 0x0b, 0x0b, + 0xeb, 0xb4, 0x73, 0x0c, 0x68, 0x55, 0xcf, 0xe9, 0x6a, 0x16, 0x40, 0xbc, + 0x0d, 0x5f, 0x09, 0x03, 0xa3, 0x90, 0x1a, 0x7e, 0x3e, 0x4b, 0x5d, 0x1c, + 0xad, 0xe9, 0x69, 0x4d, 0x3f, 0xbf, 0x30, 0xbf, 0x0d, 0x3e, 0x0b, 0xf1, + 0x4a, 0xbf, 0x58, 0x3e, 0x58, 0x1d, 0x84, 0xfe, 0x58, 0x3f, 0x6a, 0x42, + 0xf0, 0x93, 0x48, 0xc3, 0xc4, 0x81, 0xd8, 0x85, 0xd2, 0x64, 0x57, 0xbf, + 0xa5, 0xb2, 0x16, 0xfa, 0x09, 0xac, 0x31, 0x65, 0xf0, 0xe2, 0x4b, 0x24, + 0x34, 0x40, 0x0e, 0x68, 0x4d, 0xb8, 0x9d, 0x53, 0x0d, 0x5d, 0xcb, 0x90, + 0xd6, 0x38, 0xd3, 0x71, 0x52, 0x49, 0xfa, 0x52, 0x2b, 0x33, 0x3b, 0xb9, + 0xf2, 0x9e, 0xf8, 0x3f, 0x3b, 0x9f, 0xea, 0x7f, 0x7b, 0x8b, 0x8d, 0xa5, + 0x63, 0xb0, 0xa8, 0x9d, 0xf6, 0x71, 0xbd, 0x6d, 0xf5, 0xe7, 0xb1, 0x3d, + 0x57, 0x96, 0x95, 0xac, 0x66, 0xec, 0x7a, 0x4d, 0x32, 0xbd, 0x30, 0x7f, + 0x6c, 0xdb, 0xe6, 0x4d, 0xce, 0x6e, 0xa5, 0x1d, 0x13, 0x68, 0xac, 0x7f, + 0x26, 0x8e, 0xc6, 0x00, 0x67, 0xc5, 0xe4, 0x15, 0xfb, 0xbf, 0xc3, 0x59, + 0xdf, 0xd8, 0x47, 0x3d, 0xa8, 0x1f, 0x10, 0x33, 0xd1, 0x9c, 0xca, 0xbf, + 0x9a, 0x7d, 0x37, 0x48, 0xfb, 0xbe, 0x24, 0x7d, 0x47, 0xcc, 0xe1, 0xdb, + 0xb1, 0x3a, 0x8e, 0xc1, 0x71, 0x3b, 0x97, 0xc8, 0xe5, 0xa0, 0x20, 0x02, + 0x9d, 0x45, 0x15, 0xd6, 0x70, 0x96, 0x9f, 0xc9, 0xf8, 0x04, 0x00, 0xf8, + 0x49, 0x06, 0x07, 0x90, 0x3e, 0x97, 0x8d, 0x56, 0x2d, 0x4e, 0x4b, 0xd1, + 0xa0, 0x27, 0x8c, 0x38, 0x2b, 0x54, 0xa1, 0x56, 0x6c, 0xb8, 0x5c, 0x9c, + 0x08, 0x9c, 0x8e, 0xb7, 0x16, 0x76, 0x1b, 0x92, 0xb5, 0xac, 0x1d, 0xca, + 0x61, 0xb1, 0x2f, 0x90, 0x23, 0xfc, 0xd5, 0x18, 0xc4, 0x8f, 0xcd, 0x98, + 0x99, 0xa6, 0x3e, 0x22, 0xb1, 0xee, 0x76, 0x7e, 0x42, 0xf8, 0xa5, 0xa9, + 0x78, 0x63, 0x02, 0x98, 0x8a, 0xc2, 0x3e, 0xf6, 0x13, 0x9b, 0x07, 0xdc, + 0x3f, 0xc5, 0x67, 0xde, 0x2a, 0xfa, 0xa3, 0x63, 0x1c, 0xf7, 0x28, 0x16, + 0x28, 0xe1, 0x2a, 0xfc, 0xfd, 0xe4, 0x70, 0xff, 0xb1, 0x1a, 0x90, 0x5a, + 0x19, 0xa5, 0x44, 0x3d, 0xe1, 0x3b, 0xf2, 0xed, 0xe9, 0xa3, 0x67, 0x19, + 0xab, 0xd9, 0xff, 0x51, 0x51, 0xab, 0x51, 0xe5, 0xbc, 0x2e, 0x59, 0x37, + 0x33, 0x57, 0xa4, 0xf5, 0xd8, 0x17, 0x40, 0xa8, 0x0a, 0x4d, 0x90, 0x91, + 0x0c, 0xca, 0xf5, 0x37, 0xf7, 0xe6, 0x26, 0x8f, 0xe7, 0xb8, 0xcb, 0x50, + 0x03, 0x4f, 0x64, 0x52, 0x1b, 0x35, 0x89, 0xc9, 0xa7, 0xc3, 0x22, 0x3f, + 0x7d, 0x9e, 0xab, 0xdf, 0xe4, 0xd0, 0x7e, 0x05, 0x62, 0x90, 0xc7, 0x67, + 0x11, 0xdf, 0x01, 0x0c, 0x64, 0xb5, 0x8e, 0xd4, 0x30, 0x94, 0xd2, 0x3c, + 0x19, 0x13, 0xfb, 0x9c, 0xa3, 0x93, 0x8b, 0x3b, 0xc4, 0x75, 0xff, 0xcc, + 0x42, 0x43, 0xfd, 0xda, 0xaa, 0x41, 0xd6, 0xd5, 0xe1, 0xfe, 0x42, 0x26, + 0xb4, 0x12, 0xdd, 0x33, 0x68, 0xc3, 0x70, 0xd6, 0x90, 0x44, 0x83, 0xce, + 0x29, 0x29, 0xec, 0x1b, 0x95, 0x65, 0x91, 0x92, 0x64, 0xea, 0x73, 0x94, + 0xc8, 0x44, 0x00, 0xbf, 0x6c, 0x6c, 0xec, 0xd8, 0x9c, 0xfa, 0x26, 0x9a, + 0x1d, 0x5d, 0xb6, 0x36, 0x72, 0x17, 0x37, 0x3b, 0x61, 0x83, 0x84, 0x07, + 0xeb, 0x3a, 0x0e, 0x08, 0x3c, 0x35, 0x50, 0x42, 0x20, 0x6a, 0xd2, 0x6e, + 0xc5, 0xcf, 0x4b, 0x1b, 0xbb, 0xe5, 0xae, 0xe9, 0x8d, 0xbc, 0x78, 0x6b, + 0xf4, 0x83, 0xb3, 0x10, 0x4f, 0x7a, 0x9e, 0x13, 0x1b, 0x56, 0xf5, 0xa7, + 0xc2, 0xfb, 0xb3, 0x03, 0x17, 0x0e, 0x24, 0x33, 0x4f, 0x52, 0x07, 0xe0, + 0x34, 0x19, 0xfa, 0xc0, 0xd4, 0x1c, 0xfc, 0x01, 0x07, 0x07, 0xf4, 0xf5, + 0x6d, 0x6d, 0xe6, 0xd7, 0xa4, 0x1e, 0x78, 0xd1, 0x36, 0xce, 0x53, 0x2b, + 0x2e, 0x32, 0xea, 0xb2, 0xb0, 0x84, 0x3b, 0x06, 0xea, 0x34, 0x01, 0x83, + 0x80, 0xd7, 0xf7, 0x12, 0xa3, 0x9a, 0x18, 0x02, 0x9a, 0x9a, 0x0d, 0x60, + 0xcf, 0xff, 0xe8, 0xee, 0xdb, 0x6b, 0xdf, 0x41, 0x51, 0x1c, 0xa1, 0x1d, + 0xa0, 0x35, 0xb4, 0x20, 0xec, 0x60, 0xc9, 0xb8, 0xd8, 0x36, 0xf4, 0xc1, + 0xef, 0xc2, 0x7c, 0xbd, 0xa0, 0xf1, 0x5b, 0x4e, 0x05, 0xd3, 0x07, 0xc1, + 0xbd, 0xae, 0x9f, 0xca, 0x87, 0x88, 0xd5, 0x4d, 0x31, 0xbe, 0x0a, 0x3e, + 0x82, 0x28, 0x77, 0x92, 0xcd, 0x8f, 0x5f, 0x6d, 0x68, 0x87, 0xa9, 0xeb, + 0x2d, 0x9d, 0x00, 0x4c, 0xfb, 0x42, 0x09, 0xa6, 0xee, 0xee, 0xcc, 0xf1, + 0x38, 0x19, 0x19, 0xbf, 0xd5, 0x8b, 0x35, 0xf6, 0xae, 0x8f, 0xcd, 0xf8, + 0xb2, 0x9b, 0x7d, 0x44, 0x9d, 0x9d, 0xac, 0xa6, 0xd5, 0xd6, 0xdc, 0xfa, + 0xe9, 0x83, 0x2a, 0x10, 0x4f, 0x41, 0x7d, 0x04, 0x14, 0xa0, 0x48, 0xdb, + 0x7b, 0xe6, 0xfb, 0x83, 0x8e, 0x5d, 0xc5, 0xcf, 0x36, 0xc4, 0x96, 0x6f, + 0x22, 0xdc, 0xdf, 0xdf, 0xfa, 0x60, 0x65, 0x35, 0xc3, 0x90, 0x0f, 0x1e, + 0x88, 0x8d, 0xa5, 0xa2, 0x44, 0xb7, 0x59, 0x7f, 0xcf, 0x7b, 0x20, 0x38, + 0x8c, 0xa5, 0xa6, 0xc4, 0x62, 0x26, 0x5e, 0xea, 0x94, 0x55, 0xde, 0x65, + 0x5c, 0x13, 0xdc, 0x72, 0xe4, 0x2a, 0xbc, 0x4d, 0x10, 0xd9, 0x47, 0xbd, + 0x80, 0xb3, 0x9d, 0x15, 0xba, 0x75, 0xae, 0x5f, 0xe3, 0xd5, 0xdc, 0x97, + 0xb1, 0x48, 0x54, 0x4c, 0xf0, 0xe2, 0x53, 0xfb, 0x78, 0x00, 0xb9, 0x83, + 0x72, 0xd2, 0xd4, 0x0d, 0x1c, 0x2d, 0x21, 0x2f, 0xbe, 0x69, 0x05, 0xd3, + 0xa6, 0x04, 0xe7, 0x55, 0x33, 0xb4, 0x65, 0xae, 0x01, 0x88, 0x7c, 0xef, + 0x4f, 0x3d, 0x37, 0xb1, 0xa9, 0x7b, 0xf4, 0xdb, 0x5c, 0x78, 0x12, 0x1e, + 0x59, 0xac, 0xd9, 0x13, 0xca, 0x07, 0xd4, 0xf7, 0x60, 0x6c, 0xef, 0xaa, + 0xf9, 0xc1, 0x09, 0xd7, 0x4b, 0x3c, 0x1b, 0x73, 0x6c, 0x2c, 0xf2, 0xf7, + 0x13, 0xbf, 0xc0, 0x78, 0x65, 0x83, 0xbe, 0xe9, 0x94, 0xc0, 0x4e, 0xe6, + 0x34, 0xa7, 0xc5, 0xf2, 0x1a, 0x2b, 0x36, 0x4d, 0xb4, 0x9f, 0xe1, 0x43, + 0xf2, 0x60, 0x64, 0xec, 0x8d, 0x14, 0x94, 0x05, 0x23, 0x24, 0x38, 0x08, + 0xb9, 0x75, 0xff, 0xe7, 0x65, 0x25, 0x8c, 0x24, 0x28, 0xb7, 0x8f, 0x81, + 0xf3, 0x36, 0x6f, 0x83, 0x35, 0x53, 0x75, 0x78, 0x4e, 0xe8, 0x53, 0xdf, + 0xf9, 0x21, 0xf6, 0x7c, 0x02, 0x29, 0x0b, 0x90, 0x1c, 0x61, 0xd9, 0xbf, + 0xfb, 0x45, 0x79, 0xd7, 0x4b, 0x07, 0x61, 0x8b, 0x61, 0xce, 0x7e, 0x5f, + 0x4d, 0xc9, 0x33, 0xd7, 0x24, 0x33, 0xdd, 0xc7, 0xb8, 0x9f, 0xb1, 0x87, + 0xb5, 0x4f, 0xb9, 0xb9, 0x4c, 0x45, 0x66, 0xbf, 0x08, 0xb7, 0x69, 0x47, + 0x34, 0x82, 0xfe, 0x31, 0xbf, 0x57, 0xdc, 0x8f, 0xf1, 0x4e, 0x71, 0x1c, + 0xc1, 0xf6, 0x0b, 0x4b, 0xce, 0xca, 0xd2, 0xe6, 0x64, 0x16, 0xdd, 0x04, + 0xc2, 0x04, 0xda, 0x1a, 0x7d, 0xf9, 0xa3, 0x21, 0x60, 0x8c, 0xd3, 0x83, + 0xfa, 0x6e, 0x9b, 0x9d, 0x2c, 0xf2, 0xf4, 0xb5, 0x1f, 0x88, 0x2b, 0x2e, + 0x03, 0x14, 0x7c, 0x69, 0xa8, 0xca, 0x21, 0x8a, 0x48, 0x32, 0xc0, 0x3e, + 0xdb, 0x03, 0xa7, 0x1a, 0x36, 0x63, 0xf7, 0xf6, 0x3b, 0x5e, 0xed, 0x2d, + 0xb6, 0x91, 0xf8, 0xc1, 0x97, 0x47, 0x88, 0xd0, 0xf3, 0x29, 0x5d, 0x60, + 0xb5, 0x46, 0x66, 0xe7, 0xe6, 0xe4, 0xad, 0xc2, 0x09, 0x30, 0xb2, 0xc7, + 0x9e, 0xc7, 0xec, 0x52, 0xf6, 0xbb, 0x86, 0x31, 0x42, 0x17, 0x12, 0x07, + 0x9e, 0xb0, 0x4c, 0x24, 0x8a, 0xe8, 0xe1, 0x22, 0x0f, 0xaa, 0xb4, 0x48, + 0xc5, 0x5f, 0xb1, 0xc4, 0x8c, 0xfe, 0xdb, 0x54, 0x6a, 0x32, 0xfc, 0x9f, + 0x7a, 0x8b, 0x54, 0xad, 0xfc, 0x8b, 0xeb, 0xd7, 0x62, 0x90, 0x55, 0xda, + 0xd6, 0xb4, 0xe8, 0xa4, 0x52, 0xa4, 0x3f, 0xab, 0x56, 0x38, 0x34, 0x12, + 0x6e, 0xd0, 0x3b, 0x16, 0xa0, 0x2c, 0x4b, 0x5d, 0xff, 0x4a, 0x51, 0x2c, + 0xee, 0xf0, 0x26, 0x86, 0xab, 0x71, 0x79, 0xa1, 0x76, 0x2a, 0xbb, 0x05, + 0xa9, 0x58, 0x4a, 0x54, 0xbe, 0x88, 0x4c, 0x28, 0xe4, 0x61, 0x9b, 0x1c, + 0xb4, 0x9f, 0x50, 0xdf, 0x33, 0xf2, 0x63, 0xd1, 0xee, 0x8a, 0x94, 0xb3, + 0x2b, 0xb3, 0x6f, 0x13, 0x8c, 0xd7, 0x81, 0xad, 0xde, 0x11, 0xc8, 0x4b, + 0x9f, 0x95, 0xe6, 0xb8, 0x1a, 0x07, 0x74, 0x27, 0xb0, 0xad, 0x3e, 0x8f, + 0x35, 0x47, 0xd8, 0x06, 0x08, 0xc7, 0xd2, 0xa5, 0x16, 0x57, 0x6d, 0xce, + 0xfa, 0x9c, 0x78, 0x6b, 0xf2, 0x2b, 0x1c, 0x13, 0xd6, 0x15, 0x16, 0x08, + 0x4a, 0x7c, 0xb7, 0xbe, 0x58, 0xb3, 0xe7, 0x13, 0x0f, 0xbf, 0x3d, 0xc9, + 0xdd, 0x3d, 0x28, 0x6e, 0x8a, 0x70, 0x73, 0xe8, 0xe3, 0x9a, 0x6a, 0x2e, + 0x77, 0x26, 0x55, 0x55, 0xc4, 0x11, 0xd1, 0x63, 0xd4, 0x69, 0x9e, 0xf3, + 0x8e, 0x3f, 0xf8, 0x35, 0xb1, 0xa5, 0xfb, 0x3f, 0x7e, 0x05, 0x99, 0x67, + 0x11, 0x32, 0x60, 0x48, 0x2a, 0xda, 0xec, 0x07, 0xf1, 0xaf, 0x8d, 0x0f, + 0x10, 0xba, 0xde, 0xb2, 0xd5, 0x5f, 0x40, 0x2b, 0xa2, 0x86, 0xa5, 0x65, + 0xc4, 0x2b, 0x08, 0x22, 0x54, 0x20, 0x96, 0x06, 0x85, 0xce, 0xf2, 0x71, + 0xc9, 0xc5, 0x36, 0x66, 0x18, 0x8d, 0x25, 0x3b, 0x62, 0x6e, 0xd7, 0x81, + 0x60, 0x75, 0x49, 0x1a, 0xa3, 0x11, 0xd9, 0x2c, 0xd2, 0xe3, 0xdb, 0xf3, + 0xd3, 0x31, 0x2d, 0x4c, 0x99, 0x83, 0x3f, 0xa9, 0xe3, 0x28, 0x93, 0x17, + 0xc4, 0xb5, 0x8b, 0xfc, 0x7e, 0x48, 0xae, 0x60, 0x75, 0xe3, 0xbf, 0x1b, + 0x32, 0xd6, 0x91, 0x8d, 0x09, 0x04, 0xf6, 0x18, 0xe2, 0xb2, 0x01, 0x68, + 0xb6, 0x47, 0xf6, 0x0b, 0xc0, 0xc8, 0xcf, 0x1a, 0xb0, 0x05, 0xe3, 0xa7, + 0xaf, 0x7e, 0x3e, 0x28, 0x38, 0x33, 0x25, 0x3e, 0xdb, 0xd9, 0x88, 0xce, + 0x77, 0x10, 0x2f, 0xf7, 0xe6, 0x44, 0xb3, 0xd6, 0x06, 0x53, 0x99, 0xa7, + 0xa5, 0x66, 0x17, 0x6d, 0x68, 0xdb, 0xdf, 0x67, 0x8c, 0xf9, 0xf4, 0x54, + 0x81, 0xc8, 0xdc, 0x55, 0x0c, 0xcf, 0xc6, 0x68, 0xba, 0x4a, 0xa9, 0x0f, + 0xad, 0x06, 0x45, 0x1d, 0xae, 0x01, 0xd6, 0xe6, 0x13, 0xc0, 0x8b, 0xf1, + 0x1b, 0x70, 0x05, 0x13, 0xf4, 0xaa, 0xcb, 0x5c, 0xcd, 0x82, 0x98, 0xde, + 0x1f, 0x6d, 0x31, 0x9b, 0x9e, 0x01, 0x5e, 0xca, 0xf3, 0xff, 0xa0, 0x34, + 0x11, 0xa5, 0x34, 0xfe, 0x91, 0xed, 0xd4, 0x0c, 0x62, 0x1f, 0xc6, 0x54, + 0x6d, 0x7a, 0xb7, 0x74, 0x5c, 0xd0, 0xeb, 0x82, 0x61, 0x1d, 0xcd, 0xef, + 0x8a, 0x85, 0x7b, 0x71, 0xdd, 0x66, 0x88, 0x5e, 0xf6, 0xba, 0xd6, 0x2c, + 0x8a, 0xab, 0xcf, 0x82, 0xca, 0xe2, 0x33, 0xfa, 0x7d, 0x2e, 0x79, 0xf2, + 0xbc, 0xad, 0x3c, 0xf3, 0x88, 0xe1, 0x7f, 0x52, 0xaf, 0xab, 0x28, 0x7e, + 0xca, 0xae, 0xf9, 0xb5, 0xe8, 0xab, 0xdd, 0x2d, 0x62, 0xfe, 0x31, 0x20, + 0x0f, 0x03, 0x1a, 0x14, 0x48, 0xc5, 0xb7, 0x3c, 0x1b, 0xe7, 0xfa, 0x7e, + 0x10, 0x75, 0x03, 0xfc, 0xeb, 0x06, 0x7a, 0xf6, 0xe3, 0xaf, 0x2d, 0xb2, + 0x2d, 0x1d, 0x1b, 0x4f, 0x37, 0xb3, 0x3c, 0x79, 0xce, 0x12, 0x97, 0xb1, + 0xe0, 0x26, 0xc1, 0x2d, 0x9f, 0x9b, 0xe5, 0x0e, 0x63, 0x8b, 0x5f, 0x40, + 0x58, 0x77, 0x42, 0x90, 0x22, 0x8b, 0x7b, 0xa6, 0x0e, 0x7c, 0xc4, 0x89, + 0x50, 0xc6, 0x69, 0xd0, 0xd7, 0xcf, 0x82, 0xdb, 0x68, 0xb2, 0xfb, 0xab, + 0xf9, 0x4d, 0x46, 0x77, 0x25, 0xaf, 0x52, 0x4b, 0x6b, 0x73, 0xfb, 0xf1, + 0x91, 0x77, 0x18, 0x4e, 0xbd, 0xa2, 0x28, 0x7d, 0xd8, 0xdb, 0xa6, 0x56, + 0x81, 0xf7, 0xf1, 0x11, 0x1f, 0x96, 0x1a, 0x9c, 0x3e, 0x35, 0x7c, 0xa6, + 0x27, 0x20, 0x1b, 0xbe, 0x10, 0x61, 0xbc, 0xca, 0xea, 0x6f, 0x59, 0x9b, + 0xf4, 0xe1, 0x0e, 0xa7, 0x3b, 0xaf, 0xd5, 0x78, 0x11, 0xff, 0x5f, 0x17, + 0x79, 0xdf, 0x4a, 0x0c, 0xce, 0x0a, 0x2a, 0xe6, 0x64, 0xb0, 0x40, 0x32, + 0xfb, 0x56, 0xcb, 0x60, 0x7c, 0xaf, 0x7d, 0xac, 0x0b, 0x17, 0x50, 0x5a, + 0x98, 0x46, 0xdc, 0x31, 0x75, 0x84, 0x8e, 0x04, 0xb4, 0x56, 0x42, 0x89, + 0x18, 0x4f, 0x0f, 0xe7, 0xa5, 0x65, 0xb9, 0x3e, 0x90, 0x66, 0x11, 0x5b, + 0x3e, 0x36, 0xcb, 0xda, 0x54, 0x4f, 0x8f, 0x8f, 0xeb, 0xdf, 0xe4, 0x50, + 0xe5, 0x24, 0x57, 0x61, 0x7e, 0x39, 0xf0, 0x88, 0x4d, 0xbe, 0x05, 0x10, + 0x8e, 0xfb, 0x76, 0x21, 0x21, 0x54, 0xd3, 0x19, 0x43, 0xdd, 0x14, 0xe7, + 0xa3, 0xf3, 0x52, 0x18, 0xe5, 0xef, 0x6a, 0xb6, 0x79, 0x0f, 0x0c, 0x05, + 0x5a, 0x84, 0x09, 0x0a, 0xaa, 0x02, 0x32, 0xd7, 0xb7, 0x13, 0x34, 0x04, + 0xce, 0x05, 0xcd, 0x24, 0x5e, 0xf1, 0x67, 0xd5, 0xf8, 0xec, 0xf1, 0xaa, + 0x11, 0x1d, 0x82, 0x26, 0xcc, 0xcb, 0x57, 0xbc, 0x74, 0x65, 0x1a, 0x6e, + 0x20, 0x54, 0xf1, 0xf5, 0xb0, 0xcb, 0x3a, 0xbb, 0x8f, 0xa3, 0xca, 0xe1, + 0xa1, 0x75, 0xf2, 0x98, 0xa8, 0x1e, 0x8d, 0x75, 0x09, 0x1e, 0xfa, 0x99, + 0xfa, 0xdd, 0xf4, 0xff, 0x01, 0x1b, 0xd9, 0xbd, 0x8c, 0xbc, 0x07, 0xe5, + 0x2e, 0xe7, 0x19, 0x8a, 0xd0, 0x98, 0x4d, 0x8b, 0x47, 0xff, 0xc7, 0x7b, + 0x6f, 0x8d, 0x9b, 0x43, 0x40, 0xc4, 0x79, 0x97, 0x14, 0x88, 0xa9, 0x76, + 0x80, 0x90, 0xaf, 0x24, 0x56, 0x00, 0x52, 0x2e, 0x09, 0x3c, 0xe0, 0xbd, + 0xaa, 0x73, 0xb6, 0xc9, 0xc2, 0x19, 0x15, 0x53, 0x54, 0x71, 0xc2, 0x42, + 0xb1, 0xb1, 0xf3, 0xaa, 0x87, 0x77, 0x3c, 0x7c, 0x3c, 0x96, 0x82, 0x6a, + 0x9f, 0x3c, 0x68, 0x34, 0xa4, 0xbd, 0x98, 0xaa, 0x3c, 0x45, 0xfe, 0xfe, + 0xd0, 0x78, 0x77, 0x48, 0xe5, 0x48, 0x12, 0x88, 0x6c, 0x12, 0x04, 0x92, + 0xd7, 0x6c, 0x4e, 0x94, 0xb4, 0x27, 0x23, 0x42, 0xc6, 0x35, 0xb4, 0xdf, + 0x5b, 0xbb, 0x69, 0x16, 0x05, 0x78, 0xc0, 0xaf, 0x3e, 0x32, 0xfe, 0xc6, + 0x74, 0xe3, 0xb4, 0x2a, 0xaa, 0x0e, 0x92, 0xb5, 0x01, 0xdd, 0x57, 0x72, + 0x8f, 0xd9, 0xab, 0x7b, 0x0e, 0xfb, 0xe4, 0x3c, 0x79, 0x2f, 0xc8, 0x24, + 0x5c, 0xb3, 0x9a, 0x65, 0x25, 0x9c, 0x19, 0x42, 0xb5, 0x57, 0x56, 0x78, + 0xa6, 0x9f, 0x4f, 0x71, 0x55, 0xcc, 0xc6, 0xf9, 0x46, 0xf3, 0xff, 0x66, + 0x97, 0xd5, 0xc9, 0x79, 0xea, 0x5a, 0xaa, 0xe9, 0xc7, 0xd5, 0x56, 0xad, + 0xfa, 0xd7, 0x32, 0x78, 0x99, 0xe6, 0xbe, 0x7c, 0x50, 0xc8, 0xb8, 0x5d, + 0x06, 0xf6, 0xdd, 0x7c, 0x7c, 0x46, 0x08, 0x18, 0x30, 0xa9, 0x03, 0x96, + 0x3e, 0x61, 0xa1, 0xce, 0xdd, 0x89, 0x21, 0x83, 0x02, 0x85, 0xc5, 0x42, + 0x60, 0x44, 0xdb, 0x3a, 0xe7, 0x09, 0x32, 0xa4, 0x04, 0x94, 0xef, 0x56, + 0xed, 0x8a, 0xb5, 0x83, 0x95, 0xae, 0xdd, 0x53, 0x60, 0x8d, 0x3f, 0xa7, + 0xff, 0x29, 0x0e, 0xb2, 0xe9, 0x31, 0x45, 0x9c, 0x73, 0xa9, 0x74, 0xf7, + 0xd9, 0x4d, 0xa2, 0x9d, 0xca, 0xd6, 0x4b, 0x86, 0x48, 0xdc, 0x59, 0xf9, + 0x6d, 0x4c, 0xba, 0xfe, 0xd9, 0x28, 0x6c, 0x9a, 0x19, 0x33, 0x6d, 0x8c, + 0x28, 0xb1, 0xed, 0x2d, 0xc8, 0x9b, 0x6a, 0x9d, 0x2f, 0x53, 0xf5, 0x07, + 0x22, 0xd9, 0x04, 0x49, 0x10, 0x83, 0x51, 0xd1, 0x8f, 0xf9, 0xbe, 0xc6, + 0xb0, 0x02, 0x09, 0x24, 0x90, 0xe0, 0xa2, 0x11, 0x8c, 0x2a, 0xf9, 0x62, + 0xd3, 0xfa, 0xcd, 0x12, 0xf5, 0x62, 0x64, 0x8a, 0x00, 0x70, 0xf4, 0xa7, + 0x47, 0x50, 0x6b, 0x7c, 0x05, 0xc8, 0x6d, 0x0f, 0xdc, 0x99, 0xa3, 0x50, + 0x2b, 0x5d, 0x3a, 0x36, 0x2f, 0x6b, 0xb4, 0x81, 0x9a, 0xca, 0x2a, 0xb7, + 0x6f, 0xb0, 0x24, 0xb4, 0x38, 0x79, 0x0d, 0xf8, 0xc7, 0x56, 0xa1, 0xc4, + 0xe9, 0x08, 0x79, 0xbe, 0xb1, 0x4d, 0xf7, 0xc3, 0x8b, 0xb6, 0x09, 0xf2, + 0xa0, 0x4e, 0x58, 0xba, 0xfa, 0x40, 0xbf, 0x6f, 0x98, 0x2e, 0x8e, 0x49, + 0x2e, 0xde, 0xc6, 0x27, 0x7b, 0xef, 0xf7, 0x63, 0xd7, 0x49, 0x7e, 0x0c, + 0x5b, 0x9a, 0x3c, 0x2e, 0x1b, 0x58, 0x2e, 0x4b, 0xfb, 0xb5, 0x9c, 0x58, + 0xfe, 0x1b, 0xe6, 0x67, 0x36, 0x3b, 0x32, 0x57, 0x24, 0xb6, 0x03, 0x58, + 0xef, 0xee, 0xd1, 0x69, 0xee, 0x2d, 0x1f, 0xa8, 0x38, 0xed, 0x56, 0x9e, + 0x52, 0x61, 0x66, 0x44, 0x98, 0xed, 0x49, 0x3f, 0xe8, 0x6f, 0x27, 0x23, + 0x05, 0x93, 0x2f, 0x7b, 0x2e, 0x5b, 0x37, 0xc5, 0x1b, 0xf8, 0xef, 0xb6, + 0x1c, 0xf3, 0x1b, 0x55, 0x9f, 0x49, 0xdb, 0x18, 0x22, 0x50, 0xe4, 0x4f, + 0xe5, 0x96, 0xe8, 0x46, 0x54, 0xf5, 0xd8, 0xf1, 0xe3, 0x33, 0xe9, 0x5a, + 0xc3, 0x95, 0xd4, 0x85, 0x44, 0xfe, 0x0b, 0x17, 0xc7, 0x5c, 0x5a, 0x5e, + 0xb7, 0xb3, 0x3b, 0x56, 0x98, 0x35, 0x3c, 0x66, 0xae, 0xa5, 0xf0, 0xfa, + 0x45, 0xf1, 0x9d, 0x3a, 0x77, 0x0a, 0xa4, 0x43, 0x42, 0x82, 0xc1, 0x07, + 0x81, 0xc4, 0x29, 0xb9, 0xac, 0x35, 0x2b, 0x0a, 0xe6, 0x4d, 0xb2, 0xef, + 0x3c, 0x5b, 0x3e, 0x92, 0xbb, 0x96, 0x49, 0x77, 0xad, 0xc7, 0x65, 0x9f, + 0xf8, 0x67, 0xab, 0x42, 0x9a, 0xb6, 0x95, 0x5c, 0x67, 0x42, 0x0a, 0x5a, + 0xa5, 0x85, 0x30, 0xa0, 0xdf, 0x18, 0x51, 0xf7, 0xa7, 0xd2, 0x4b, 0x6b, + 0x0a, 0xf6, 0xf4, 0xb7, 0x47, 0x01, 0x06, 0x71, 0xf0, 0xa5, 0xe1, 0x70, + 0x5a, 0xd7, 0xcb, 0x0a, 0x7f, 0x23, 0x69, 0x8a, 0xd1, 0xc4, 0x60, 0x56, + 0xef, 0xcc, 0xda, 0x03, 0xb5, 0x0f, 0x6e, 0xa8, 0xea, 0xff, 0xcb, 0x19, + 0x16, 0xd8, 0xca, 0x0c, 0x40, 0x44, 0xf4, 0x48, 0x52, 0x26, 0x3c, 0x82, + 0xef, 0x33, 0xaf, 0xe9, 0x09, 0xaa, 0x58, 0x1c, 0x58, 0xd6, 0x8a, 0xe1, + 0xe2, 0x80, 0x2d, 0xa7, 0xc6, 0x48, 0xe6, 0x6f, 0x92, 0x95, 0xd2, 0x1c, + 0x8b, 0x2d, 0xb3, 0x6f, 0xdb, 0x04, 0xcf, 0x5f, 0x3e, 0x8f, 0x96, 0x65, + 0x1a, 0x34, 0x14, 0xbf, 0xf0, 0xcf, 0x2f, 0x3c, 0x86, 0x07, 0x38, 0x14, + 0xf2, 0x44, 0x45, 0x2f, 0x6c, 0x03, 0x33, 0x24, 0xb8, 0x10, 0x82, 0xcd, + 0x73, 0x51, 0x72, 0x39, 0x75, 0x55, 0x1b, 0xd2, 0xc3, 0x1e, 0x10, 0x7d, + 0x6c, 0x8e, 0x3c, 0x0b, 0xfb, 0x2d, 0x6e, 0xb3, 0x06, 0x8e, 0x54, 0x95, + 0x52, 0x78, 0xe9, 0x17, 0xd9, 0x50, 0xc1, 0xa7, 0x64, 0xd1, 0x19, 0xc1, + 0x90, 0x5d, 0x26, 0xdb, 0xd5, 0xfb, 0x90, 0xbf, 0xbb, 0xb1, 0x6d, 0x0e, + 0x37, 0x0f, 0xe9, 0xd6, 0x92, 0xd2, 0x58, 0x5a, 0x77, 0xa1, 0x48, 0xae, + 0xd3, 0xc4, 0xca, 0x0b, 0x19, 0xff, 0x73, 0x84, 0x51, 0xf8, 0x3d, 0x7f, + 0xba, 0xc8, 0x0d, 0x09, 0x0b, 0x6f, 0x2b, 0x06, 0x94, 0xb2, 0xe3, 0x06, + 0xf9, 0x42, 0x0e, 0x6b, 0x61, 0x15, 0x32, 0xf6, 0xff, 0x26, 0xc5, 0x76, + 0xd9, 0x57, 0x73, 0x2d, 0x77, 0x56, 0xaa, 0x9d, 0x85, 0x1a, 0xc1, 0x87, + 0xdc, 0x4c, 0x7e, 0xfb, 0x7f, 0x7b, 0xb9, 0x2c, 0x28, 0xd4, 0xeb, 0xb0, + 0x03, 0x11, 0x27, 0xf2, 0xdd, 0x78, 0x0b, 0x40, 0x0d, 0x3e, 0x55, 0x60, + 0x8b, 0x87, 0xb6, 0x25, 0x47, 0xb0, 0x1d, 0x05, 0x69, 0x12, 0x3f, 0xdc, + 0xa7, 0x47, 0x43, 0xff, 0xa3, 0x7d, 0x36, 0xee, 0x58, 0xb7, 0x8a, 0x92, + 0x8b, 0xe8, 0x57, 0x23, 0xdb, 0x64, 0x54, 0x8c, 0x0c, 0xc7, 0xbd, 0x53, + 0x32, 0xc7, 0xe0, 0x4b, 0x8c, 0x7f, 0x9c, 0x6e, 0x5f, 0x3b, 0x55, 0x8e, + 0x2b, 0xdd, 0xa8, 0x51, 0x66, 0x89, 0x15, 0x12, 0xca, 0x12, 0x3d, 0x97, + 0xe7, 0x93, 0xdc, 0x93, 0x60, 0x4d, 0x57, 0x08, 0x15, 0x7c, 0x4f, 0x98, + 0xdd, 0x69, 0xd0, 0xc3, 0xdd, 0xc2, 0x56, 0xf0, 0x8c, 0xe6, 0xdb, 0xd8, + 0xf5, 0x89, 0xb3, 0x02, 0x54, 0x2f, 0x74, 0xdb, 0x5f, 0xb1, 0x85, 0xba, + 0xa7, 0xcb, 0x59, 0x9a, 0xb5, 0x44, 0x66, 0x5a, 0xfc, 0x52, 0xbe, 0x93, + 0x14, 0x9f, 0x03, 0x03, 0xc6, 0xf9, 0xc7, 0x79, 0x4d, 0x9b, 0xdf, 0x87, + 0xda, 0xeb, 0xc3, 0xdb, 0x27, 0xf8, 0x16, 0x3a, 0x48, 0x90, 0x6e, 0x1e, + 0xb1, 0xc7, 0x8a, 0x53, 0xab, 0x55, 0x07, 0xfb, 0xfc, 0x36, 0x8a, 0x84, + 0x1b, 0xe3, 0xe2, 0xdf, 0x49, 0x00, 0x0c, 0x12, 0xab, 0xf2, 0x89, 0xb2, + 0xcc, 0x5f, 0xe4, 0xfe, 0x61, 0xb9, 0x6b, 0x83, 0x98, 0x68, 0x06, 0xba, + 0x4e, 0xb0, 0x98, 0x2e, 0x7d, 0x1c, 0x5b, 0xe2, 0x50, 0x3f, 0x64, 0xa5, + 0x31, 0x69, 0xd9, 0x55, 0xca, 0xc9, 0xb4, 0x5d, 0x58, 0xc8, 0xbf, 0x8a, + 0x46, 0xde, 0x03, 0x33, 0x8a, 0x0d, 0xa6, 0xa2, 0xdd, 0x81, 0xde, 0x62, + 0x2f, 0xad, 0xf4, 0xc4, 0x46, 0x48, 0xe5, 0x9c, 0xc8, 0xbc, 0x38, 0xd3, + 0x26, 0xeb, 0xd9, 0x3c, 0x02, 0xa2, 0x11, 0xc7, 0xcb, 0x17, 0x3d, 0xbc, + 0x9e, 0x1d, 0xbd, 0x65, 0x37, 0x70, 0x65, 0x2d, 0xbd, 0x7c, 0xca, 0x6e, + 0xf3, 0xf9, 0x5e, 0xcf, 0x4b, 0xe8, 0xe8, 0x57, 0x2e, 0x8c, 0x82, 0xc4, + 0x85, 0x1b, 0x8c, 0x12, 0x68, 0x96, 0x98, 0xd1, 0x42, 0x9c, 0x0e, 0x3a, + 0x14, 0x51, 0xca, 0x19, 0xe7, 0x48, 0x6e, 0xb0, 0xe1, 0xa1, 0x1a, 0x06, + 0xc6, 0x85, 0x12, 0x2b, 0x71, 0x5a, 0xba, 0xb5, 0x85, 0x7e, 0x6b, 0x3e, + 0xd9, 0x70, 0x3c, 0x5d, 0x92, 0x03, 0xda, 0x94, 0xcb, 0x41, 0x6f, 0x98, + 0xa2, 0x5c, 0x7e, 0x93, 0xce, 0xd2, 0xe2, 0xad, 0xc4, 0x77, 0x86, 0x05, + 0x4e, 0x76, 0x8b, 0xe4, 0x1e, 0xfd, 0xe5, 0xaf, 0x6f, 0x83, 0x1e, 0x06, + 0x9e, 0x57, 0xa2, 0x33, 0x7e, 0x49, 0x3f, 0xc5, 0x7f, 0xd1, 0xb6, 0x9c, + 0x42, 0x96, 0xaa, 0x50, 0xd1, 0x0e, 0xb0, 0xad, 0xb4, 0x0c, 0x9c, 0xf3, + 0xa6, 0x61, 0xab, 0xfa, 0x49, 0x00, 0xe9, 0x62, 0x07, 0x4d, 0x89, 0x32, + 0xf3, 0x0b, 0xaa, 0xf1, 0x0c, 0xd9, 0xc6, 0xa5, 0x2b, 0x39, 0xd3, 0x43, + 0x9c, 0xcb, 0x11, 0x1f, 0x99, 0x1a, 0xb3, 0xce, 0xb7, 0xce, 0x3a, 0xb7, + 0x71, 0xb0, 0x73, 0x92, 0xd5, 0xb2, 0x24, 0x9b, 0x24, 0x04, 0x9a, 0x09, + 0x13, 0x5b, 0x37, 0xfc, 0x71, 0x48, 0x7e, 0x7c, 0xfd, 0x69, 0xcb, 0xde, + 0x73, 0xbe, 0xb2, 0xd3, 0x69, 0x9a, 0x27, 0x77, 0x97, 0x56, 0xb7, 0xfd, + 0x3e, 0x11, 0xaf, 0x5e, 0x32, 0x49, 0x60, 0xa6, 0x8b, 0xa0, 0xf6, 0x27, + 0x3f, 0x2a, 0x21, 0x2e, 0x47, 0x6a, 0xd9, 0xf7, 0xc2, 0xa3, 0x0e, 0xba, + 0x48, 0xab, 0xcf, 0x9d, 0xdb, 0x2c, 0x37, 0x1b, 0x85, 0x23, 0x97, 0x4e, + 0xb1, 0xf3, 0xd9, 0x5c, 0x87, 0xed, 0x2e, 0x53, 0x97, 0x9f, 0xda, 0xa2, + 0xaa, 0x2f, 0x23, 0xb6, 0x51, 0xdd, 0x59, 0x43, 0x73, 0x08, 0x30, 0xe3, + 0x6d, 0xf4, 0xcc, 0xb3, 0x99, 0x50, 0x84, 0xf3, 0x16, 0x09, 0x1c, 0x1b, + 0x3e, 0x4b, 0xc5, 0x8a, 0xb8, 0xcd, 0x63, 0x64, 0xaf, 0x81, 0x7e, 0x5c, + 0x70, 0x47, 0x9f, 0xcd, 0xca, 0x9c, 0xcf, 0x04, 0x27, 0x84, 0xf2, 0xfb, + 0x49, 0x37, 0xb4, 0xe5, 0x1c, 0x05, 0x2e, 0x9f, 0x5e, 0x52, 0x60, 0x60, + 0xc5, 0x84, 0xd4, 0x03, 0xb0, 0x96, 0xd4, 0x05, 0xac, 0x48, 0x3f, 0x18, + 0x9a, 0x69, 0xec, 0xd9, 0x4f, 0x5e, 0x21, 0xba, 0xe8, 0x4e, 0xe1, 0x23, + 0xff, 0xa2, 0x66, 0x20, 0x1f, 0x5b, 0xcc, 0x2a, 0x62, 0x46, 0xcb, 0x29, + 0x68, 0xe8, 0xff, 0x6f, 0x72, 0x6e, 0xf2, 0xd7, 0xd7, 0x93, 0x7e, 0x32, + 0x3b, 0x7e, 0x55, 0x07, 0x97, 0xd2, 0x2e, 0xaf, 0x35, 0x1c, 0x50, 0x74, + 0x8c, 0x5f, 0xe5, 0xc0, 0x0a, 0xf6, 0x35, 0x74, 0x57, 0xba, 0x86, 0x91, + 0x36, 0xde, 0x39, 0x3c, 0xf5, 0x48, 0x76, 0xcb, 0xae, 0xb5, 0x54, 0x1f, + 0x55, 0xa7, 0x48, 0x1c, 0x85, 0x15, 0x63, 0x01, 0x75, 0x2b, 0x92, 0xc5, + 0x14, 0xb2, 0xde, 0xc9, 0x97, 0xa8, 0xf0, 0x3c, 0xb9, 0xea, 0x67, 0xaf, + 0x88, 0x57, 0xb1, 0x36, 0x3f, 0x80, 0x12, 0x2b, 0xb2, 0xd5, 0x61, 0xeb, + 0xfa, 0x7d, 0x0c, 0xa5, 0x55, 0x48, 0xbe, 0x56, 0xdf, 0x1d, 0xc8, 0x9e, + 0xda, 0x74, 0x80, 0x4d, 0x67, 0xb0, 0x82, 0x7e, 0xae, 0x86, 0x50, 0x61, + 0x89, 0xea, 0x18, 0x77, 0x76, 0x91, 0x71, 0xc4, 0xc4, 0x8f, 0xc9, 0x3c, + 0x73, 0x82, 0x54, 0x4e, 0x66, 0xbb, 0xa5, 0x52, 0x5f, 0xfd, 0xf2, 0xb7, + 0x61, 0xa8, 0xa2, 0xb0, 0xf4, 0x39, 0x3c, 0xa2, 0x14, 0x39, 0x23, 0x61, + 0x71, 0x49, 0xfa, 0x47, 0x10, 0x5f, 0x97, 0x0e, 0x2a, 0x55, 0x8a, 0x25, + 0x9f, 0x13, 0x5c, 0xc8, 0x0c, 0xfc, 0x34, 0x4d, 0x4d, 0x26, 0x93, 0x7c, + 0xda, 0xea, 0x86, 0x02, 0x5d, 0x20, 0xcb, 0x39, 0x6b, 0xe1, 0x90, 0x51, + 0x15, 0xb5, 0x56, 0x9d, 0xed, 0x9f, 0x60, 0x77, 0x61, 0x16, 0xfd, 0xda, + 0xfb, 0x03, 0x75, 0x45, 0x38, 0x0d, 0xc4, 0xc7, 0x2f, 0xbe, 0x8a, 0xde, + 0x7c, 0x47, 0xa8, 0xeb, 0x54, 0xc2, 0xbb, 0x5a, 0x9d, 0xf1, 0x0a, 0x04, + 0x0e, 0x1b, 0x8a, 0x25, 0x8b, 0x2a, 0x18, 0x78, 0x9b, 0x04, 0x50, 0xfc, + 0x26, 0x6d, 0x38, 0xcd, 0x06, 0xa4, 0x98, 0x6a, 0x6c, 0x68, 0x85, 0x78, + 0x96, 0xf7, 0xbb, 0x73, 0xa8, 0xa2, 0xd9, 0xaf, 0x1e, 0x88, 0x84, 0x61, + 0x09, 0x1b, 0x2f, 0xcb, 0xd5, 0x33, 0xb4, 0xdc, 0x71, 0x9e, 0x70, 0x27, + 0xc1, 0x5a, 0xe1, 0x0a, 0x0a, 0x18, 0xea, 0x42, 0xe1, 0x62, 0x17, 0x0b, + 0x26, 0xba, 0x30, 0x15, 0xa1, 0xa0, 0xe1, 0xab, 0x80, 0x3b, 0xdb, 0x84, + 0xd4, 0x94, 0x70, 0xea, 0xed, 0xc1, 0xe3, 0x52, 0x5e, 0xac, 0x30, 0xa6, + 0xdd, 0xf5, 0xc3, 0xd1, 0xc6, 0xfe, 0xc8, 0x4f, 0xc7, 0x8c, 0xc6, 0xc3, + 0x0f, 0x25, 0x77, 0x89, 0x35, 0xad, 0x45, 0x70, 0x4e, 0xff, 0x12, 0x22, + 0xc2, 0xe3, 0xd8, 0x0f, 0xf8, 0xb4, 0x57, 0x22, 0xb5, 0xde, 0xee, 0xcf, + 0x39, 0x76, 0x8f, 0x90, 0xc8, 0x9d, 0x31, 0xaf, 0x33, 0x2f, 0x32, 0x9f, + 0x4e, 0x51, 0x80, 0x70, 0x5f, 0xfa, 0x93, 0xb1, 0x8c, 0x9f, 0x68, 0xb3, + 0x69, 0x80, 0x28, 0xe4, 0x29, 0x73, 0x95, 0x00, 0x4a, 0xeb, 0xa6, 0x6d, + 0x58, 0x33, 0x23, 0x52, 0x8d, 0xe4, 0x9e, 0xff, 0xfb, 0x19, 0x5d, 0xe1, + 0x3b, 0x14, 0x16, 0x0d, 0x35, 0x33, 0xbf, 0x23, 0xdd, 0x1d, 0xc2, 0x32, + 0x94, 0xa2, 0x10, 0xc8, 0xe9, 0x8d, 0xa9, 0x5d, 0x24, 0xee, 0x7f, 0x37, + 0x99, 0x62, 0xd9, 0x50, 0x81, 0xa4, 0x4e, 0xb9, 0xa6, 0xe9, 0x25, 0xfe, + 0xe2, 0x57, 0x70, 0xb4, 0x02, 0x0a, 0x31, 0x84, 0x3b, 0x62, 0x9c, 0x53, + 0x0b, 0x45, 0x53, 0x78, 0x18, 0xe9, 0x28, 0x79, 0x16, 0x3a, 0x7b, 0xdc, + 0x0d, 0x98, 0x5c, 0x21, 0x1f, 0xff, 0xd0, 0x4d, 0xfa, 0x29, 0xed, 0x73, + 0x9a, 0x3d, 0x7f, 0x1d, 0xd7, 0x91, 0x74, 0x5b, 0x37, 0x88, 0x22, 0x68, + 0x4f, 0x2e, 0x11, 0x8b, 0x06, 0x2f, 0xdd, 0x2f, 0x91, 0x3f, 0x66, 0x5c, + 0x84, 0x1d, 0xed, 0x01, 0x67, 0x22, 0x06, 0x5f, 0x97, 0x2f, 0xdd, 0xba, + 0x41, 0xae, 0xc6, 0x0d, 0xa3, 0xce, 0x32, 0x74, 0x2d, 0x67, 0x3c, 0x5c, + 0xc6, 0x7f, 0x8b, 0x3e, 0x53, 0xb7, 0x26, 0x01, 0x5c, 0x59, 0x88, 0x55, + 0x3c, 0x2f, 0xf4, 0x7a, 0x4b, 0xc2, 0xad, 0xa0, 0xc0, 0x68, 0xce, 0x4b, + 0xfb, 0x3e, 0x3b, 0x08, 0xc1, 0x65, 0x78, 0x94, 0xfa, 0x84, 0x3c, 0xaa, + 0x2a, 0x6d, 0xfc, 0x1d, 0x30, 0xda, 0xa0, 0x34, 0x2b, 0x85, 0xa4, 0x77, + 0x01, 0x8d, 0xce, 0x9d, 0x38, 0x17, 0x07, 0x5d, 0xbf, 0xe2, 0xfd, 0x95, + 0x65, 0x25, 0x6e, 0xe6, 0x85, 0xa5, 0x47, 0x56, 0xdb, 0x22, 0x15, 0xb6, + 0x70, 0x36, 0xfa, 0xaa, 0xcd, 0x3d, 0x05, 0x45, 0x9f, 0xea, 0x24, 0x7b, + 0x8b, 0x23, 0x31, 0x7e, 0x5f, 0x94, 0xa8, 0x14, 0xa6, 0x8c, 0x19, 0x83, + 0x12, 0x54, 0x61, 0x08, 0xfa, 0x08, 0x39, 0x56, 0x69, 0xda, 0x8e, 0xa8, + 0x96, 0x6b, 0xc8, 0x65, 0x11, 0x88, 0xe3, 0xbf, 0x3d, 0x38, 0xdc, 0x8e, + 0x6f, 0x09, 0x3c, 0x67, 0xa3, 0xbf, 0xad, 0xef, 0xf2, 0x8a, 0x26, 0x9c, + 0xa4, 0x6c, 0xef, 0x8a, 0x63, 0x36, 0xdd, 0x41, 0xdc, 0x9d, 0x17, 0xe3, + 0xed, 0x9c, 0xd2, 0xe4, 0x91, 0xc3, 0x25, 0x54, 0x74, 0x90, 0x05, 0x52, + 0xe9, 0x63, 0x53, 0x6d, 0xf8, 0x43, 0x96, 0xf8, 0xc0, 0x34, 0x07, 0x30, + 0x5d, 0xb9, 0xba, 0x0e, 0x79, 0x1b, 0x22, 0x9d, 0xb8, 0xda, 0x53, 0xa8, + 0x2f, 0x09, 0x49, 0x3b, 0x47, 0x6a, 0xbb, 0x6e, 0xe4, 0x97, 0x0a, 0x6e, + 0xc0, 0xea, 0xeb, 0xd6, 0xa3, 0x71, 0x6b, 0xde, 0xea, 0x56, 0xb6, 0x71, + 0xf6, 0x11, 0x87, 0x81, 0xad, 0xbc, 0x51, 0x4f, 0xc4, 0x8e, 0xef, 0xdc, + 0xee, 0x67, 0xc3, 0x4e, 0x35, 0x6f, 0xf1, 0xa5, 0x39, 0x4c, 0xb3, 0x5a, + 0x4b, 0x89, 0xa7, 0xbd, 0xe2, 0x5d, 0x65, 0x0d, 0xc8, 0xc5, 0x58, 0xa4, + 0x97, 0x85, 0x4f, 0x06, 0xe1, 0x8f, 0x1a, 0x95, 0xc3, 0x8b, 0x96, 0x13, + 0xcb, 0x19, 0x1a, 0x98, 0xf1, 0x3b, 0xf6, 0x6d, 0x0c, 0xde, 0x96, 0x17, + 0xe4, 0x46, 0xb8, 0xd9, 0x7e, 0xb1, 0x5b, 0x63, 0xcd, 0x4b, 0x32, 0xbd, + 0x08, 0xd8, 0x78, 0xf4, 0x17, 0x51, 0x79, 0x82, 0x2b, 0xda, 0xb8, 0xf6, + 0x95, 0xd7, 0xca, 0xb3, 0xad, 0xc6, 0xbf, 0xc0, 0x2f, 0x93, 0x50, 0xb8, + 0x6f, 0x17, 0xec, 0xa0, 0xb8, 0xeb, 0x10, 0x8b, 0xc2, 0x58, 0x8c, 0xd2, + 0x8e, 0xa7, 0x36, 0x21, 0x3f, 0x83, 0xbc, 0x48, 0xfe, 0x69, 0xf3, 0x54, + 0xda, 0x46, 0xd6, 0x65, 0x13, 0x5f, 0xf2, 0xfd, 0xaf, 0x4a, 0xe0, 0x77, + 0xca, 0xe3, 0xbd, 0x16, 0xcd, 0xc3, 0x2d, 0x8d, 0xf1, 0xec, 0x62, 0xe1, + 0xdd, 0xbd, 0xff, 0x68, 0x8e, 0xd8, 0xee, 0x13, 0xd2, 0x7b, 0x1b, 0x23, + 0xc3, 0xfa, 0xf4, 0x2e, 0xa4, 0xaf, 0xb5, 0x6f, 0x67, 0x28, 0x60, 0x10, + 0xdf, 0xae, 0xcc, 0x8f, 0xc5, 0xe4, 0xda, 0x63, 0x5f, 0x60, 0x17, 0x22, + 0x0f, 0x64, 0xd9, 0x3e, 0x56, 0x5b, 0xf3, 0xa7, 0x72, 0x7d, 0x7e, 0x02, + 0xb8, 0x7d, 0xfc, 0x25, 0x8e, 0x4e, 0xf3, 0x21, 0x42, 0x59, 0x40, 0x20, + 0xfa, 0xda, 0x05, 0x93, 0x99, 0x42, 0xdb, 0xe3, 0x7c, 0x79, 0x82, 0xaf, + 0xfa, 0x83, 0xf8, 0xb1, 0xc6, 0x55, 0x31, 0xd8, 0x8b, 0xd2, 0x74, 0xfe, + 0x08, 0x5d, 0x6e, 0x2b, 0x25, 0x32, 0x8f, 0xfa, 0x54, 0xe9, 0xd1, 0x96, + 0xdf, 0x24, 0x38, 0xe4, 0x72, 0x81, 0xec, 0xd0, 0xcb, 0x9f, 0x24, 0x31, + 0x6c, 0x48, 0x7b, 0x96, 0xe6, 0x6a, 0xbb, 0x58, 0x93, 0xdc, 0x4f, 0x1a, + 0xf9, 0xea, 0x3a, 0x87, 0x3f, 0xc9, 0x91, 0x8a, 0x2c, 0x8f, 0xbc, 0x1a, + 0x46, 0xec, 0x1e, 0xf8, 0xbf, 0x05, 0xe3, 0x09, 0x56, 0x7a, 0x55, 0xaf, + 0x53, 0x8b, 0x79, 0x05, 0x95, 0x24, 0xeb, 0xeb, 0x42, 0x2d, 0x84, 0x6c, + 0x88, 0x56, 0x33, 0x3c, 0x52, 0x62, 0x3d, 0x94, 0x49, 0xd4, 0x5a, 0x49, + 0x83, 0x94, 0x20, 0x12, 0x76, 0x58, 0x50, 0x6c, 0x57, 0x14, 0xb4, 0xfb, + 0xf0, 0xc4, 0x35, 0xdc, 0xa0, 0xb7, 0x14, 0xe0, 0x33, 0xec, 0x8b, 0xa1, + 0x66, 0xee, 0x0f, 0xb0, 0x37, 0x8b, 0x6c, 0x54, 0x32, 0xfa, 0x8a, 0x71, + 0x72, 0xfc, 0xcb, 0x6e, 0x48, 0xd1, 0x08, 0x79, 0x8b, 0x8b, 0x16, 0xfd, + 0xc6, 0xdd, 0x43, 0xc3, 0xfb, 0xb2, 0x4f, 0xbf, 0x49, 0x14, 0xdc, 0xc3, + 0xa1, 0xc3, 0x5c, 0x40, 0xfc, 0xaf, 0xc7, 0x10, 0x12, 0x7e, 0x45, 0x8e, + 0x3b, 0x89, 0xbf, 0xaf, 0x26, 0x4e, 0x19, 0xbb, 0x11, 0x6b, 0x6d, 0xf2, + 0x45, 0x0d, 0x09, 0x8e, 0xe9, 0xc6, 0xc6, 0x66, 0x5f, 0x4b, 0xbf, 0xb3, + 0x49, 0xc8, 0x5d, 0x42, 0xec, 0x39, 0xa2, 0xfd, 0xb3, 0xa3, 0x47, 0xf6, + 0x1c, 0x5e, 0x18, 0x6e, 0x85, 0x2a, 0xb6, 0x57, 0xbc, 0x02, 0x31, 0xd7, + 0x5b, 0x27, 0x60, 0x88, 0xed, 0x37, 0x43, 0xdc, 0x3a, 0x31, 0x4c, 0x94, + 0xca, 0x71, 0x63, 0xb8, 0x1a, 0x73, 0x39, 0x5b, 0x9c, 0x4d, 0x95, 0xde, + 0x4a, 0x1d, 0x69, 0x18, 0x7e, 0x06, 0x4c, 0x3c, 0x39, 0x7e, 0xd4, 0x25, + 0xe6, 0x77, 0x63, 0xdd, 0xdd, 0x96, 0x17, 0x58, 0xec, 0x13, 0x34, 0x71, + 0x3c, 0x85, 0x44, 0x25, 0x77, 0xb8, 0xba, 0x15, 0x66, 0xef, 0xbb, 0x5f, + 0x64, 0x6c, 0x97, 0x9b, 0x24, 0x66, 0x9d, 0x1f, 0xa5, 0xb6, 0xbd, 0xea, + 0xd3, 0x8c, 0xc9, 0xb9, 0xae, 0xa7, 0xd5, 0xe6, 0xc4, 0xf6, 0x86, 0xe2, + 0x4d, 0x42, 0xe8, 0x0e, 0xb3, 0xf1, 0x78, 0x32, 0x60, 0x1a, 0xab, 0xe3, + 0x2e, 0xa1, 0x18, 0x39, 0x97, 0x7e, 0xe2, 0x3b, 0xfc, 0x4c, 0x29, 0x60, + 0x7d, 0x6b, 0x7b, 0x69, 0xdb, 0xad, 0x9c, 0x30, 0x39, 0x18, 0xfc, 0x0d, + 0x28, 0x3f, 0xf6, 0x41, 0xe2, 0x7a, 0xf8, 0x97, 0xbf, 0x2e, 0x76, 0xa2, + 0xd5, 0xf7, 0xd9, 0x2d, 0x9c, 0xa6, 0x93, 0xe7, 0x58, 0xf9, 0x4a, 0x32, + 0xbf, 0x85, 0xa7, 0x1e, 0x5e, 0xc5, 0x48, 0xf8, 0x39, 0xc9, 0x16, 0xff, + 0x7a, 0xab, 0xcb, 0xdb, 0xf5, 0x69, 0xf1, 0xf7, 0x4f, 0x41, 0x2c, 0xee, + 0x7c, 0x56, 0x1b, 0x08, 0x07, 0xec, 0xc9, 0x7f, 0xd9, 0x07, 0x38, 0x8f, + 0x13, 0x92, 0x02, 0x05, 0x4b, 0x7b, 0xf4, 0xc8, 0x7d, 0x32, 0x1a, 0xb0, + 0xfe, 0xfc, 0x7f, 0x53, 0x14, 0x7e, 0xcc, 0x5f, 0x1e, 0x70, 0xe3, 0x09, + 0xb6, 0x9e, 0xf9, 0x6e, 0x46, 0x9b, 0x4d, 0xdb, 0x74, 0x56, 0x26, 0x57, + 0x51, 0x8c, 0x0f, 0x32, 0x11, 0x31, 0xb4, 0x9d, 0x92, 0x29, 0xc7, 0xad, + 0xd6, 0x28, 0x22, 0xe2, 0x80, 0xf7, 0xa1, 0xdc, 0x57, 0x3a, 0xfa, 0xbc, + 0x96, 0x6c, 0xec, 0xdb, 0x7e, 0x57, 0xc2, 0x71, 0xe4, 0x85, 0xe1, 0xad, + 0xcd, 0x92, 0x33, 0xdf, 0xb7, 0x46, 0xa3, 0xe6, 0x85, 0x45, 0x39, 0xb5, + 0xc1, 0xb8, 0xa8, 0x66, 0xe3, 0x5e, 0xa4, 0x8b, 0x3f, 0xcb, 0x1b, 0xae, + 0xe6, 0x74, 0x7c, 0x30, 0xa4, 0x01, 0xa8, 0x35, 0x84, 0x7a, 0x75, 0xc2, + 0x88, 0xbd, 0x20, 0xbf, 0x66, 0x86, 0x01, 0x7e, 0xfd, 0x6c, 0x2e, 0xdb, + 0xba, 0x9a, 0xfb, 0x65, 0x31, 0xb4, 0xb2, 0x6f, 0xe0, 0x13, 0x5c, 0xea, + 0xe3, 0xcc, 0xb7, 0x0e, 0x78, 0x5d, 0xa8, 0xbf, 0xc0, 0xcc, 0x99, 0xf6, + 0xb5, 0xbf, 0x10, 0x15, 0x1c, 0xa1, 0x3d, 0x0e, 0xbf, 0x69, 0xe2, 0x9e, + 0x13, 0x7b, 0x65, 0xbc, 0xb8, 0x03, 0x77, 0x81, 0x56, 0x91, 0x28, 0xd0, + 0xf5, 0xc3, 0x7c, 0x51, 0xf4, 0x39, 0x6b, 0xad, 0x86, 0x0b, 0x29, 0x97, + 0x2b, 0x9e, 0x50, 0x3e, 0x30, 0xfe, 0xa6, 0x53, 0x15, 0xc2, 0x64, 0xaf, + 0xa5, 0x9f, 0x1d, 0x81, 0x35, 0xbe, 0xff, 0xf0, 0x43, 0x92, 0x6c, 0x52, + 0x6b, 0xfd, 0xdc, 0x8c, 0x38, 0xba, 0x28, 0xcc, 0xdd, 0x4e, 0x87, 0xbd, + 0x37, 0x46, 0x05, 0x68, 0xcd, 0xe2, 0x0b, 0xcc, 0xfa, 0xe6, 0xa7, 0x5e, + 0xc8, 0x74, 0x6d, 0x13, 0x78, 0x8d, 0xfc, 0x3d, 0x4d, 0x3f, 0x04, 0x30, + 0x98, 0xa7, 0x08, 0xdb, 0x4a, 0xeb, 0x39, 0x3b, 0xa5, 0x71, 0xcc, 0x24, + 0x3a, 0xd7, 0x15, 0xd6, 0xc8, 0xa5, 0x4b, 0x85, 0x9d, 0x4d, 0x11, 0x1f, + 0x31, 0xd9, 0xa6, 0x40, 0x57, 0xf5, 0x02, 0x3c, 0x04, 0xce, 0xc7, 0x0d, + 0xee, 0xf2, 0x63, 0xdc, 0x08, 0x5d, 0xd6, 0x93, 0x3a, 0x22, 0xf3, 0x38, + 0x39, 0x0f, 0xbe, 0x4f, 0x2f, 0x0a, 0xf3, 0x46, 0x48, 0x29, 0x9f, 0x79, + 0x6f, 0x24, 0xad, 0x0a, 0x0f, 0x0a, 0x1b, 0x56, 0xbb, 0x02, 0x5c, 0x35, + 0x70, 0x7b, 0x43, 0x0f, 0xb9, 0x69, 0x12, 0x71, 0xf1, 0xb0, 0xa3, 0x85, + 0x98, 0x4d, 0x3e, 0x7a, 0x98, 0x22, 0x16, 0x6c, 0x09, 0xe6, 0x81, 0x46, + 0x5f, 0xbd, 0x9b, 0xf0, 0xf6, 0x42, 0x63, 0xe2, 0x06, 0xf8, 0x01, 0x4b, + 0xd0, 0x1b, 0x87, 0x36, 0xc0, 0x19, 0x69, 0xe2, 0xb3, 0xd8, 0x52, 0x6c, + 0x8f, 0xf4, 0x4d, 0x72, 0x6b, 0x8e, 0x52, 0xf7, 0xa1, 0xfa, 0xad, 0x7f, + 0x42, 0x55, 0xa1, 0x95, 0x9f, 0xb8, 0x43, 0x57, 0xd1, 0xc1, 0x5a, 0x7c, + 0xe8, 0xf8, 0xc7, 0x8b, 0xcf, 0xd9, 0x39, 0xf1, 0xde, 0x0d, 0xcc, 0x5b, + 0x64, 0xff, 0x3f, 0x69, 0xcf, 0x1c, 0x01, 0xb7, 0xd5, 0x0b, 0x2e, 0x3c, + 0xd6, 0x1e, 0xf6, 0x53, 0x26, 0xd6, 0x46, 0xd3, 0x87, 0xa7, 0x26, 0x10, + 0x2e, 0x47, 0x73, 0x96, 0xff, 0xe2, 0xde, 0xcb, 0x9b, 0x2d, 0x78, 0xad, + 0x5d, 0xd5, 0xc4, 0xb5, 0xa8, 0x32, 0x6f, 0x38, 0x24, 0x30, 0x35, 0xc4, + 0xd7, 0xb5, 0xbe, 0x7c, 0x24, 0x57, 0x8a, 0x4e, 0x7e, 0x53, 0x47, 0x3c, + 0x72, 0x6e, 0x15, 0x69, 0xf6, 0xfe, 0xd6, 0x20, 0x0d, 0xd1, 0xe5, 0xe8, + 0xe0, 0xcf, 0x3a, 0x27, 0x43, 0xee, 0x28, 0xba, 0xd7, 0xd6, 0x75, 0x5e, + 0xee, 0x89, 0x08, 0x9b, 0x97, 0x23, 0x38, 0xb1, 0xaf, 0xba, 0xd8, 0x79, + 0x76, 0x56, 0x2f, 0x52, 0x71, 0x3b, 0xc2, 0x5b, 0x7e, 0xf3, 0x60, 0x17, + 0x9a, 0x1a, 0xe4, 0x30, 0xe4, 0x7c, 0x2a, 0xd0, 0xeb, 0x1d, 0xe1, 0x7a, + 0xda, 0xef, 0xc4, 0x30, 0x92, 0xca, 0x8c, 0x3f, 0x59, 0x98, 0x8c, 0x70, + 0x2c, 0xe8, 0xd0, 0x76, 0x55, 0xd0, 0x73, 0xcd, 0xe4, 0x24, 0x11, 0x11, + 0xe2, 0x89, 0x0e, 0xf3, 0x2e, 0x51, 0xdf, 0x36, 0x66, 0xfd, 0xf4, 0x63, + 0xfb, 0x00, 0x8a, 0xaf, 0x25, 0xba, 0xb6, 0x67, 0x8c, 0xf7, 0x59, 0x45, + 0x61, 0xe6, 0x10, 0xee, 0xa0, 0x43, 0xb5, 0xd0, 0x9c, 0x51, 0xc6, 0x0d, + 0x5e, 0x8f, 0xa5, 0x71, 0xc0, 0x45, 0x28, 0x23, 0x5d, 0xf1, 0x2c, 0x27, + 0x84, 0x9f, 0x8c, 0x8e, 0x6a, 0xdb, 0x57, 0x16, 0x6e, 0xaa, 0xd9, 0x0f, + 0xc7, 0x75, 0xe8, 0x96, 0x48, 0x9e, 0xd3, 0x16, 0xed, 0x10, 0x43, 0xc2, + 0x24, 0xc8, 0x8c, 0x9c, 0x6a, 0x96, 0xaf, 0xd2, 0xe9, 0x5d, 0x53, 0xaa, + 0xd7, 0xea, 0xb9, 0x87, 0xbd, 0xb3, 0x2e, 0x02, 0x38, 0x55, 0xc8, 0x64, + 0xbc, 0xf4, 0x31, 0xd7, 0x1d, 0x88, 0x3d, 0x31, 0xee, 0x23, 0x76, 0xf7, + 0xb5, 0x9c, 0xf4, 0xb2, 0x2f, 0x1a, 0x0b, 0x3f, 0xd5, 0xf0, 0x6b, 0x7e, + 0x92, 0x4b, 0x71, 0xf9, 0x0e, 0x55, 0x8e, 0x08, 0x33, 0x7b, 0xcb, 0x1b, + 0x87, 0x67, 0x62, 0x32, 0x62, 0xe7, 0x68, 0x13, 0xb7, 0x68, 0xaf, 0x38, + 0x5a, 0xf0, 0x58, 0xbf, 0xd7, 0x24, 0x50, 0x51, 0xc6, 0x6f, 0xc9, 0x72, + 0xf2, 0x3c, 0xdb, 0x25, 0xa4, 0x12, 0x3a, 0xd1, 0x0d, 0x4e, 0x9b, 0x21, + 0x34, 0x9b, 0x04, 0xdb, 0x86, 0xd8, 0x91, 0x8c, 0xd1, 0x4e, 0xfa, 0xa0, + 0x4d, 0xd8, 0x40, 0xa1, 0x60, 0xa1, 0x04, 0x30, 0x54, 0x19, 0x3b, 0xc6, + 0x64, 0x4f, 0x77, 0xc9, 0x4e, 0xba, 0x45, 0xbb, 0xb2, 0xdf, 0xc7, 0x29, + 0x10, 0xf0, 0x58, 0x7f, 0xe0, 0xb7, 0xd0, 0x93, 0x49, 0xa5, 0xa5, 0x01, + 0xcc, 0xae, 0x80, 0x8f, 0x3c, 0xe2, 0x5d, 0x83, 0xeb, 0x23, 0x9d, 0x27, + 0xd7, 0x4c, 0x8a, 0xdc, 0xf7, 0x9d, 0x77, 0x7f, 0x3c, 0x44, 0x00, 0x0d, + 0xcc, 0x8d, 0x03, 0xe0, 0xea, 0x18, 0xfc, 0x6e, 0x8c, 0x20, 0xf9, 0x8e, + 0x6d, 0xb4, 0x5e, 0xb1, 0x98, 0xbf, 0x24, 0x05, 0xad, 0xb1, 0x9a, 0x6c, + 0x17, 0xe3, 0xb3, 0x07, 0x6b, 0x6d, 0x63, 0xb0, 0x29, 0x0f, 0xe7, 0x6a, + 0xc0, 0x17, 0x93, 0xec, 0x90, 0xaf, 0xfb, 0xa2, 0x17, 0x10, 0x58, 0xd8, + 0x5c, 0xc1, 0x6e, 0x9b, 0xf8, 0x1a, 0xb6, 0x88, 0xd0, 0x7c, 0xf6, 0x99, + 0xd2, 0x62, 0x9e, 0x64, 0xfa, 0x3c, 0x3c, 0x4f, 0xe8, 0x2f, 0x2a, 0x95, + 0xd6, 0x38, 0xb4, 0x8e, 0xbb, 0x88, 0x89, 0x09, 0xbe, 0x53, 0x34, 0xf7, + 0xbb, 0x34, 0x53, 0xc8, 0xc5, 0xfc, 0x06, 0xe2, 0xd8, 0x31, 0x09, 0x74, + 0xcf, 0xa3, 0x7c, 0x3d, 0xcd, 0x6e, 0xad, 0x33, 0xc4, 0xda, 0x5a, 0x9f, + 0x62, 0xaf, 0x1a, 0x3f, 0x3b, 0x9e, 0xd7, 0x00, 0xc8, 0xd5, 0xdc, 0x51, + 0xfc, 0xbc, 0x05, 0xfa, 0x64, 0xb2, 0x52, 0x71, 0xe7, 0x15, 0x41, 0x41, + 0xec, 0x23, 0x6e, 0xd4, 0x1e, 0x60, 0x31, 0x60, 0x7b, 0xda, 0x2b, 0x7d, + 0xde, 0x4d, 0x61, 0xbc, 0xee, 0x03, 0x4a, 0xfd, 0x68, 0xb7, 0x86, 0xc3, + 0x20, 0x17, 0xb3, 0xf1, 0xf4, 0xf3, 0x8d, 0x47, 0x76, 0xc8, 0xe1, 0x18, + 0x2d, 0x43, 0xad, 0xe6, 0x97, 0x5a, 0xf6, 0xe6, 0xea, 0xfd, 0x98, 0xf5, + 0x3b, 0x02, 0xf8, 0xd7, 0x57, 0x43, 0x61, 0x6f, 0x59, 0xde, 0x34, 0x70, + 0xc5, 0xdb, 0x36, 0x6f, 0xcb, 0xee, 0x21, 0xc4, 0x73, 0xbb, 0xa3, 0x36, + 0xc6, 0x0e, 0x5b, 0xcc, 0x8f, 0xaf, 0xe9, 0xb2, 0x5e, 0xb4, 0x5f, 0x49, + 0x8b, 0x60, 0xf9, 0x41, 0x7e, 0x1d, 0xa7, 0x63, 0xeb, 0x49, 0xd4, 0xe5, + 0x11, 0xc0, 0xc6, 0xcf, 0xe6, 0x69, 0x7c, 0xa8, 0x33, 0xd1, 0x57, 0x7b, + 0x9f, 0x1b, 0x48, 0x0a, 0x4a, 0xda, 0x36, 0xda, 0x04, 0x09, 0x76, 0xbd, + 0xab, 0x7f, 0x13, 0xd8, 0xf1, 0x66, 0x83, 0x52, 0x3f, 0xd0, 0x71, 0x6f, + 0xb2, 0x91, 0xd5, 0x75, 0x37, 0xdf, 0x37, 0x52, 0xbe, 0x1a, 0x79, 0x38, + 0x03, 0xdf, 0x52, 0x4c, 0xcc, 0x77, 0x5f, 0x3a, 0x1a, 0x16, 0x39, 0x5d, + 0xae, 0x20, 0x0d, 0x5c, 0xae, 0x34, 0xd3, 0x64, 0x1b, 0xa6, 0x0d, 0x3b, + 0xb7, 0x13, 0xba, 0xe0, 0xb6, 0xb3, 0xb3, 0x8f, 0xf3, 0xfd, 0x21, 0x8f, + 0x79, 0xef, 0x71, 0x9b, 0xbc, 0xca, 0x3a, 0x8a, 0x80, 0x15, 0x33, 0x8b, + 0xe0, 0xb4, 0x26, 0xd7, 0x83, 0x22, 0x96, 0xd0, 0x3b, 0xad, 0x47, 0xf5, + 0x51, 0x7e, 0x77, 0x90, 0x0a, 0xce, 0xf3, 0xc5, 0x8e, 0x62, 0xf8, 0xe2, + 0x78, 0xf4, 0xfe, 0x02, 0x1e, 0xa0, 0xca, 0x06, 0xd0, 0x26, 0x12, 0xc9, + 0x4c, 0x06, 0x6e, 0x40, 0x3f, 0x47, 0xfb, 0x31, 0xa7, 0x30, 0x17, 0x87, + 0xa3, 0xab, 0x88, 0x8d, 0x40, 0xdd, 0x8f, 0x45, 0xd4, 0x4c, 0x67, 0x3a, + 0x78, 0x59, 0xf8, 0x44, 0x3a, 0x5f, 0x42, 0xc3, 0x99, 0xbf, 0x6f, 0xad, + 0x72, 0x9d, 0xa0, 0xe4, 0x71, 0xe1, 0x26, 0x5f, 0xa9, 0x83, 0xc1, 0xeb, + 0xaa, 0x0a, 0x2b, 0x68, 0xd1, 0x20, 0x0a, 0x11, 0x6a, 0xc2, 0x5f, 0x1e, + 0x1b, 0x40, 0x76, 0x87, 0x9f, 0x26, 0x88, 0xae, 0x64, 0x25, 0x04, 0xa2, + 0x3b, 0x79, 0x34, 0x05, 0x28, 0xda, 0xfb, 0xe6, 0xda, 0xab, 0xb9, 0x65, + 0xc6, 0x5e, 0xe5, 0x22, 0x12, 0x78, 0xf5, 0x8d, 0x30, 0x74, 0x4f, 0xb7, + 0xde, 0x5e, 0xe8, 0xaa, 0x93, 0xe4, 0x95, 0x96, 0xd7, 0x0a, 0x81, 0xb4, + 0x78, 0x70, 0xe8, 0x7a, 0x45, 0x3c, 0x4e, 0xd5, 0xc5, 0xb2, 0x1f, 0xf3, + 0x6c, 0x57, 0xf3, 0xc3, 0x72, 0xc0, 0x5f, 0x7d, 0x5f, 0xe5, 0x0b, 0x5c, + 0x7b, 0xc9, 0x1d, 0x0d, 0x45, 0xb6, 0x21, 0xf2, 0x30, 0x00, 0x78, 0x8e, + 0x74, 0x9d, 0x53, 0x48, 0x11, 0x70, 0x35, 0x2b, 0xfa, 0xd4, 0x2b, 0x71, + 0xdd, 0x8f, 0xc6, 0x04, 0x2a, 0xdc, 0xcd, 0x2e, 0x31, 0x73, 0x16, 0xe6, + 0x03, 0xa2, 0x20, 0x65, 0x17, 0x2a, 0xf1, 0x05, 0x61, 0xca, 0x4d, 0x51, + 0x39, 0x73, 0xf2, 0xd9, 0x24, 0x93, 0x3a, 0x19, 0x1b, 0x79, 0xec, 0xb3, + 0xb5, 0xb1, 0xb8, 0xf1, 0xbb, 0xff, 0x2a, 0x48, 0xfb, 0xe5, 0xb6, 0x2e, + 0x76, 0x78, 0xa5, 0x18, 0xd6, 0x70, 0x7d, 0x4b, 0x4b, 0x8d, 0x05, 0xa3, + 0x79, 0x19, 0xb6, 0x42, 0x3b, 0xf4, 0x06, 0x5c, 0xde, 0xd7, 0x7f, 0x29, + 0x37, 0xc4, 0x76, 0xf7, 0xf8, 0x5d, 0xdd, 0x46, 0xde, 0xc4, 0x49, 0xba, + 0xd6, 0xde, 0x8e, 0x56, 0x5e, 0xfc, 0x4e, 0x6d, 0x81, 0x92, 0x1e, 0x4f, + 0xbb, 0xce, 0x0b, 0x52, 0x28, 0x46, 0xc1, 0xaa, 0x76, 0xd4, 0xde, 0xf8, + 0x13, 0x63, 0xb4, 0x56, 0xdc, 0xfa, 0x59, 0xfc, 0x20, 0xa8, 0xd4, 0xa6, + 0xdb, 0x16, 0x60, 0xb7, 0xfe, 0x59, 0x3c, 0xdb, 0x6c, 0xfb, 0x94, 0x63, + 0xf6, 0x97, 0x62, 0x9d, 0x4e, 0x46, 0x70, 0x96, 0x9f, 0x38, 0xb0, 0xd8, + 0x37, 0x4c, 0xff, 0x47, 0x0b, 0x2b, 0x70, 0x4c, 0x96, 0x3e, 0x75, 0x66, + 0xf7, 0xb8, 0x7e, 0xbc, 0x8e, 0xa8, 0x6a, 0xac, 0x77, 0x72, 0x42, 0xb9, + 0x0c, 0xfa, 0x5f, 0x8a, 0x64, 0x76, 0x0a, 0x6e, 0x92, 0xcc, 0x29, 0xa9, + 0x54, 0x81, 0x1d, 0x91, 0xca, 0x14, 0x20, 0x9b, 0xf6, 0xb7, 0x6d, 0xa3, + 0xb0, 0x48, 0x64, 0x93, 0xdb, 0x00, 0xa1, 0x0a, 0x43, 0x01, 0x0b, 0x94, + 0x65, 0xcb, 0x0f, 0xb8, 0xfc, 0x69, 0xa1, 0x0b, 0x18, 0x9d, 0xd0, 0xbc, + 0x71, 0x14, 0x03, 0x32, 0xbe, 0x86, 0xdb, 0xf7, 0x93, 0xc2, 0xa9, 0x84, + 0x7c, 0xe1, 0xb3, 0xab, 0x05, 0x9a, 0x4a, 0x1f, 0xe1, 0xc4, 0x7e, 0x53, + 0xac, 0xe3, 0x8e, 0x74, 0x09, 0x67, 0x6d, 0x95, 0x7e, 0x39, 0xcb, 0x8b, + 0xe2, 0x21, 0xac, 0x54, 0x53, 0x87, 0xea, 0x8b, 0x44, 0x97, 0xed, 0xed, + 0x57, 0x8e, 0xac, 0x03, 0xf8, 0x3d, 0x12, 0x77, 0x70, 0x88, 0x8d, 0xfa, + 0x7e, 0x96, 0x7e, 0x9e, 0x92, 0x31, 0x82, 0x7b, 0x99, 0x4e, 0xf4, 0xff, + 0x03, 0x34, 0xa4, 0x8b, 0x3a, 0x47, 0x67, 0x93, 0x70, 0xe6, 0xf1, 0x38, + 0x6a, 0xca, 0x27, 0xe5, 0xfd, 0xd7, 0x11, 0xa7, 0x4d, 0x85, 0x38, 0x83, + 0xfe, 0x05, 0xab, 0x5f, 0x37, 0x38, 0xd5, 0x25, 0x38, 0xdf, 0x66, 0x52, + 0x72, 0x74, 0x48, 0x5c, 0xb2, 0xc1, 0x9a, 0x9e, 0xb1, 0x2f, 0x50, 0x6e, + 0x12, 0xaf, 0x1c, 0xe4, 0xcc, 0xa5, 0x4d, 0x46, 0x30, 0x7b, 0x4c, 0xec, + 0x83, 0x97, 0xee, 0x92, 0x57, 0x29, 0xfc, 0x06, 0xda, 0x90, 0xde, 0x39, + 0xaa, 0x6f, 0x7d, 0x6c, 0x83, 0xd9, 0x5f, 0x27, 0xa7, 0xb5, 0x56, 0x62, + 0x3d, 0x2b, 0xa6, 0x7b, 0xfa, 0xc7, 0x90, 0x5f, 0x3c, 0xe4, 0xf3, 0x87, + 0x1b, 0x3e, 0xa3, 0xcc, 0x99, 0xfb, 0xf7, 0x4d, 0x2f, 0x95, 0xf1, 0x17, + 0xe2, 0x17, 0xc1, 0x78, 0x0a, 0x2e, 0x78, 0x8f, 0x45, 0x7d, 0x2b, 0xf3, + 0x75, 0xf1, 0x31, 0x24, 0xa3, 0x95, 0x12, 0x66, 0x98, 0xe0, 0x66, 0x5d, + 0x56, 0x6f, 0xe7, 0xed, 0x80, 0x80, 0x4c, 0xcd, 0x93, 0x55, 0xf3, 0xc6, + 0x3f, 0xce, 0xc8, 0x97, 0x5b, 0x9e, 0x07, 0x91, 0xbb, 0x7f, 0xb8, 0xbd, + 0xc6, 0xd6, 0x09, 0x5c, 0xe8, 0x1a, 0xb8, 0xe1, 0x0e, 0xc5, 0x61, 0x07, + 0x48, 0x02, 0x85, 0x13, 0x28, 0x3f, 0xe3, 0x9e, 0x7a, 0x4f, 0xac, 0x72, + 0x0b, 0x50, 0xaa, 0x03, 0xfa, 0x5c, 0x81, 0x9c, 0xaa, 0x11, 0xea, 0x85, + 0x06, 0x1c, 0x05, 0x08, 0x8d, 0x10, 0xc3, 0x41, 0x23, 0x8c, 0x21, 0x7e, + 0xa1, 0x7b, 0x05, 0xa3, 0x21, 0x83, 0x1a, 0x66, 0x8c, 0x80, 0xb6, 0xe6, + 0x27, 0x7c, 0xe6, 0xaf, 0x7d, 0xca, 0x67, 0x0d, 0x35, 0xe6, 0xd6, 0x5d, + 0xbf, 0xac, 0x9f, 0x1e, 0x2e, 0x22, 0x9f, 0xf2, 0xbe, 0xbc, 0xf9, 0xf5, + 0x43, 0xf9, 0x40, 0xb6, 0x8e, 0xbb, 0xbd, 0xf4, 0x44, 0x5d, 0x31, 0xac, + 0xbc, 0xdc, 0x5a, 0xfa, 0x81, 0x14, 0x39, 0x74, 0xda, 0x9d, 0xbb, 0xc0, + 0x99, 0xfd, 0xca, 0xe0, 0xcb, 0xff, 0x59, 0xe1, 0xd5, 0x2b, 0xb6, 0x59, + 0x0f, 0xf7, 0x50, 0x69, 0x69, 0xb6, 0x52, 0x3b, 0x1b, 0x33, 0x31, 0xd7, + 0xf2, 0x91, 0xed, 0xc2, 0x46, 0xd0, 0x4d, 0x2a, 0xbe, 0x25, 0xdf, 0x49, + 0x4e, 0x07, 0xb9, 0x49, 0x91, 0xc5, 0xc3, 0x4f, 0x49, 0x9c, 0x05, 0xdd, + 0x10, 0x50, 0xb6, 0x78, 0x4d, 0xe4, 0x79, 0x51, 0x95, 0x68, 0x59, 0x18, + 0x60, 0x07, 0x77, 0x0f, 0x5d, 0x9e, 0xaf, 0x54, 0x78, 0x1f, 0xea, 0x65, + 0x02, 0x60, 0xb0, 0x71, 0xb5, 0xe0, 0x6d, 0x17, 0x3b, 0xaa, 0xe2, 0xe3, + 0x5b, 0x20, 0x5f, 0x3b, 0xa6, 0x4c, 0x00, 0xe8, 0xae, 0xdb, 0xa7, 0x04, + 0xd3, 0x2d, 0x5c, 0xf8, 0x56, 0x3d, 0x9e, 0x7a, 0xe3, 0x16, 0x51, 0x68, + 0x71, 0xa6, 0xdd, 0x39, 0x43, 0xbe, 0x97, 0xbb, 0xfe, 0xf2, 0x31, 0x42, + 0x9d, 0xda, 0x7b, 0xe5, 0x8b, 0x2e, 0x33, 0x89, 0x1e, 0x2f, 0xa5, 0xe6, + 0x20, 0xf6, 0x4c, 0x30, 0xf3, 0x62, 0x5f, 0x9a, 0xad, 0x10, 0xae, 0xef, + 0x9e, 0xb6, 0x29, 0x9a, 0xcb, 0x4c, 0xe7, 0xb7, 0x33, 0x9a, 0xa2, 0x84, + 0x61, 0x2f, 0xef, 0x19, 0xc9, 0x18, 0x2f, 0xf0, 0x8c, 0xe3, 0x79, 0x7d, + 0x2c, 0x8a, 0xfb, 0xf0, 0xa1, 0x0b, 0x9a, 0x57, 0xa6, 0x51, 0x60, 0x0f, + 0x9d, 0x04, 0x1a, 0xfc, 0x6c, 0x84, 0xd4, 0xcd, 0xc0, 0xbd, 0x2f, 0x05, + 0x54, 0x7a, 0x02, 0x25, 0xf6, 0x5c, 0xb8, 0xfa, 0xfb, 0xdc, 0x61, 0xc5, + 0x03, 0x15, 0x98, 0x58, 0xbf, 0xa1, 0x1a, 0x92, 0xc5, 0x6f, 0x04, 0x5a, + 0x12, 0xc9, 0x81, 0x9b, 0x13, 0xf6, 0x12, 0x09, 0xa6, 0x44, 0x91, 0x55, + 0x43, 0x5b, 0x7c, 0x5f, 0xe2, 0xb8, 0xff, 0x73, 0x79, 0x93, 0xd5, 0x8f, + 0x1d, 0x95, 0xff, 0x95, 0xaa, 0x43, 0xe0, 0x28, 0xdd, 0xdd, 0x60, 0x06, + 0xa5, 0x2f, 0x73, 0x55, 0x8d, 0xfd, 0x86, 0xca, 0xc8, 0xcd, 0xc4, 0x16, + 0x36, 0xad, 0x37, 0x18, 0x4e, 0x6a, 0xe1, 0x50, 0xc4, 0xe0, 0xe6, 0x85, + 0x2c, 0x89, 0xa9, 0x2f, 0xc4, 0x6e, 0x3a, 0x3c, 0x05, 0x90, 0x23, 0x25, + 0xea, 0x5f, 0xe6, 0x77, 0x56, 0x57, 0x3c, 0xa3, 0x11, 0x0c, 0x7c, 0x93, + 0x5a, 0x13, 0x3b, 0x39, 0x2d, 0x33, 0x22, 0x2e, 0xec, 0xd1, 0x06, 0x59, + 0x9f, 0x68, 0xa8, 0xc7, 0xbf, 0x19, 0xb4, 0x35, 0xa0, 0xc9, 0xd8, 0x2b, + 0x21, 0xf2, 0xa8, 0x7d, 0x82, 0x23, 0x9c, 0x46, 0x33, 0x77, 0x3b, 0x80, + 0x19, 0x42, 0x76, 0x0c, 0x12, 0x72, 0x74, 0x65, 0xa8, 0xba, 0x3e, 0xd7, + 0xe6, 0x90, 0xeb, 0x58, 0x57, 0xd4, 0x36, 0xea, 0xca, 0x8f, 0x6c, 0x04, + 0xae, 0xba, 0x32, 0xb6, 0xca, 0x92, 0x0b, 0x4b, 0x00, 0x6a, 0xc7, 0xf2, + 0x25, 0xf9, 0x8d, 0x61, 0x4f, 0xb3, 0x71, 0xb7, 0xb3, 0x47, 0xe3, 0x0a, + 0xf1, 0xd4, 0x61, 0xc7, 0x7c, 0xfa, 0x3a, 0xed, 0x2a, 0x09, 0x44, 0xe0, + 0x0d, 0x5f, 0x86, 0x1e, 0x74, 0x97, 0x74, 0x41, 0x84, 0xd9, 0xf3, 0x71, + 0xe1, 0xd5, 0x37, 0x07, 0xf4, 0x37, 0xf9, 0xee, 0xf5, 0x34, 0x7d, 0x64, + 0x34, 0x8d, 0xb9, 0x4c, 0xc6, 0x2f, 0xf2, 0x04, 0xc7, 0x91, 0x52, 0x31, + 0xe0, 0x36, 0x1e, 0x90, 0x96, 0xcb, 0x49, 0x44, 0xb7, 0x97, 0x89, 0x7d, + 0x25, 0xf6, 0xda, 0x1a, 0x9f, 0x96, 0xfd, 0x36, 0xb6, 0xc9, 0x7a, 0xe3, + 0x40, 0xc1, 0x01, 0x65, 0x95, 0x50, 0x5b, 0xa9, 0x98, 0x33, 0x26, 0xa5, + 0xa2, 0x65, 0x6f, 0x30, 0x34, 0x7b, 0x53, 0x65, 0xc2, 0xa0, 0x00, 0x6b, + 0x6a, 0x28, 0x8d, 0xff, 0x18, 0x1a, 0x9a, 0xc5, 0xf3, 0x9b, 0xc9, 0x66, + 0xa8, 0x5d, 0x9e, 0xe2, 0x63, 0x62, 0xec, 0x4b, 0xcb, 0xdb, 0xae, 0xf2, + 0x3a, 0x69, 0x12, 0x9b, 0x1b, 0xa3, 0x95, 0x37, 0x09, 0x3d, 0xd5, 0x84, + 0xa0, 0x93, 0xc2, 0x2b, 0x28, 0x61, 0x46, 0xbf, 0xd5, 0x50, 0x3a, 0x6b, + 0xe9, 0xc6, 0x0d, 0xa6, 0x02, 0x92, 0xd3, 0xf4, 0x62, 0x55, 0x55, 0xc0, + 0x4f, 0x9a, 0x34, 0x63, 0x74, 0x5b, 0x43, 0xba, 0x7b, 0xad, 0xf9, 0x3d, + 0xe6, 0x54, 0x38, 0x2e, 0x94, 0xb7, 0x59, 0xf2, 0xcf, 0x7e, 0xd9, 0x0f, + 0x3a, 0xfd, 0xa7, 0xfd, 0xc6, 0x81, 0xa0, 0x24, 0x34, 0x10, 0x6c, 0x82, + 0xff, 0xc9, 0x34, 0xd7, 0xe5, 0xa1, 0x61, 0x51, 0xe4, 0x48, 0x4d, 0x75, + 0x04, 0x4a, 0xef, 0x48, 0xb7, 0xec, 0xeb, 0xec, 0xe2, 0x0c, 0x9a, 0x1c, + 0x84, 0x90, 0x4f, 0x03, 0x5d, 0xe7, 0x94, 0x7c, 0xea, 0xb6, 0xd5, 0x20, + 0x9a, 0x5b, 0xe7, 0x69, 0xda, 0x1b, 0x02, 0x8a, 0x61, 0x55, 0x3a, 0x98, + 0xf3, 0xf3, 0x7d, 0x3c, 0x91, 0x0c, 0x90, 0x2b, 0xa0, 0x1f, 0x19, 0x12, + 0x29, 0x0d, 0xe8, 0x16, 0x8d, 0x2c, 0x78, 0xc9, 0x30, 0x94, 0x49, 0xbe, + 0x80, 0x06, 0xcf, 0xe9, 0xb8, 0x1c, 0x66, 0xfe, 0x4a, 0xd8, 0x23, 0x96, + 0x76, 0xd8, 0x29, 0xbc, 0x67, 0x1c, 0xae, 0xaa, 0xc7, 0x32, 0x6b, 0x4d, + 0x1a, 0x12, 0xe4, 0x81, 0x36, 0x8b, 0x09, 0x65, 0xf7, 0x88, 0xf8, 0x30, + 0xdf, 0x08, 0x08, 0x57, 0xed, 0xc7, 0xf3, 0x48, 0x7a, 0x07, 0x17, 0x8f, + 0x3c, 0x65, 0x03, 0xcf, 0x5e, 0x61, 0xa1, 0x19, 0x9b, 0x41, 0x74, 0xfb, + 0x0e, 0x37, 0xdd, 0xeb, 0xd3, 0xc2, 0x50, 0xd7, 0x28, 0x80, 0xba, 0xc2, + 0xb2, 0x58, 0xf6, 0x2b, 0x4f, 0x7a, 0xe3, 0x8a, 0xe4, 0xb3, 0x77, 0x53, + 0x00, 0x2f, 0xe8, 0x51, 0xe1, 0x1a, 0x41, 0x17, 0x12, 0x87, 0x64, 0xb7, + 0x3d, 0x50, 0x95, 0x9a, 0x08, 0xba, 0x55, 0xb1, 0x02, 0xa4, 0x9f, 0x08, + 0xd9, 0xc8, 0x0f, 0x96, 0x7a, 0x0b, 0xba, 0x1f, 0x28, 0x70, 0x9c, 0x79, + 0x64, 0x6c, 0x94, 0xf3, 0x65, 0x5f, 0xa7, 0x83, 0x7b, 0x75, 0xfe, 0x7c, + 0xfd, 0x6e, 0x8c, 0x5f, 0xa5, 0xd0, 0x11, 0x8b, 0xd5, 0x81, 0x89, 0x9b, + 0x1f, 0x59, 0xcb, 0x9a, 0x6b, 0x0e, 0x7b, 0xae, 0x86, 0x3e, 0x4e, 0x3c, + 0x48, 0x0d, 0x82, 0x5a, 0xe3, 0x65, 0xf0, 0xb0, 0xa2, 0x03, 0xf8, 0x2c, + 0xc3, 0xf3, 0xca, 0x41, 0xfa, 0xb7, 0x84, 0x42, 0x70, 0x68, 0x6e, 0xfb, + 0x77, 0x93, 0xf3, 0xcf, 0xdf, 0x62, 0x66, 0xce, 0xfa, 0xed, 0x7c, 0xb3, + 0x4a, 0x09, 0x2d, 0x57, 0x70, 0x8a, 0x83, 0x51, 0x94, 0xa1, 0x38, 0xf9, + 0xbe, 0xa4, 0x02, 0xae, 0x89, 0x15, 0xd8, 0xb6, 0xf7, 0x5f, 0x54, 0xc9, + 0xe9, 0xd4, 0x84, 0x11, 0x03, 0xc8, 0xe6, 0xb6, 0x6c, 0x07, 0x6a, 0xf3, + 0x80, 0x00, 0xd0, 0xfe, 0x07, 0x9c, 0x52, 0x17, 0x3d, 0x1d, 0x9e, 0x89, + 0x40, 0x31, 0xfc, 0xfd, 0x30, 0x91, 0x19, 0x4d, 0x01, 0xe5, 0x47, 0x33, + 0x06, 0x7f, 0xce, 0xda, 0x49, 0x33, 0x43, 0xa6, 0x21, 0xfb, 0x74, 0x21, + 0xd9, 0xa8, 0xa7, 0x0f, 0xd2, 0x42, 0x84, 0x0b, 0xff, 0x37, 0xdc, 0x88, + 0x6b, 0x11, 0x0a, 0xed, 0xfa, 0x45, 0x60, 0x3f, 0x01, 0x51, 0xf1, 0x9c, + 0x61, 0x17, 0xcf, 0x57, 0x1e, 0x21, 0xb4, 0xfe, 0x5d, 0xa0, 0xcb, 0x73, + 0xf3, 0x85, 0x72, 0x60, 0x83, 0xd8, 0x87, 0x9f, 0xb4, 0x1d, 0xfe, 0xaa, + 0x42, 0xb6, 0xfe, 0x9d, 0x3c, 0xf8, 0x74, 0xd2, 0xf2, 0x49, 0x8c, 0xa1, + 0xa9, 0x71, 0x00, 0xa9, 0x63, 0xec, 0xb9, 0x01, 0x1a, 0xd0, 0xd4, 0x6e, + 0xe5, 0x8c, 0xeb, 0xfa, 0xb0, 0x99, 0x1b, 0x2c, 0xa8, 0x73, 0x2e, 0x68, + 0xc4, 0xd2, 0x28, 0x18, 0xce, 0x2d, 0x0b, 0x1d, 0x09, 0xa6, 0xcd, 0x9c, + 0xaa, 0xf2, 0x34, 0xe6, 0xb7, 0xf1, 0x89, 0xc0, 0xbf, 0x5f, 0x84, 0xca, + 0xa9, 0x28, 0x1c, 0x5b, 0xc1, 0xda, 0x80, 0xc8, 0x5f, 0xb2, 0x50, 0x13, + 0xab, 0x89, 0x5e, 0xa3, 0x03, 0x27, 0x7d, 0xcc, 0xf7, 0x4a, 0x53, 0x26, + 0xdf, 0x83, 0x09, 0xaa, 0xbc, 0xfb, 0x15, 0x8b, 0x04, 0x0b, 0x07, 0x2e, + 0x20, 0x78, 0x39, 0xf9, 0x02, 0x67, 0xd0, 0x8e, 0x19, 0x25, 0x39, 0x89, + 0xcb, 0xde, 0x17, 0xba, 0x57, 0x1f, 0x36, 0xc9, 0xee, 0xe3, 0xf0, 0x39, + 0x6e, 0xee, 0xc4, 0xc8, 0x49, 0x69, 0xf6, 0x21, 0xdf, 0xd7, 0x1d, 0x52, + 0x6d, 0xd3, 0xf8, 0x23, 0xe9, 0x5e, 0xe5, 0x34, 0x7f, 0xcf, 0xa6, 0x63, + 0x99, 0xce, 0xf5, 0xd0, 0xc3, 0xbc, 0xa6, 0xef, 0x6f, 0x38, 0xcb, 0x51, + 0x8e, 0xbd, 0xc4, 0x31, 0x19, 0x89, 0xdf, 0x05, 0xf9, 0xfa, 0xbc, 0xfa, + 0x1d, 0x4a, 0x10, 0xcb, 0xd4, 0xba, 0xe5, 0xa6, 0x42, 0xa9, 0xc9, 0x34, + 0x74, 0x13, 0xbd, 0xdc, 0x12, 0x04, 0x6c, 0xa6, 0xe7, 0x42, 0x4b, 0x78, + 0xba, 0x39, 0x19, 0xdb, 0x06, 0xcf, 0xf7, 0xfb, 0x71, 0x6a, 0x26, 0x76, + 0x2d, 0x78, 0xf8, 0xc5, 0x52, 0x58, 0x30, 0x65, 0xea, 0x7f, 0xdd, 0x81, + 0x03, 0xa4, 0x33, 0x1b, 0x1b, 0xc5, 0x98, 0x96, 0xd5, 0xf7, 0x61, 0x8d, + 0x9e, 0x60, 0x93, 0x5e, 0x79, 0x0a, 0x3d, 0xe6, 0x67, 0x37, 0x55, 0x18, + 0x36, 0xb4, 0xfe, 0x79, 0xd5, 0xd3, 0xf0, 0xd7, 0x06, 0x09, 0xcc, 0x03, + 0x2a, 0x2c, 0x3b, 0xf6, 0xec, 0x5f, 0xaa, 0x8e, 0x7b, 0x57, 0x94, 0xac, + 0x60, 0x74, 0xaa, 0x5d, 0x92, 0x33, 0xd0, 0x4d, 0x74, 0xe1, 0x8e, 0x41, + 0x62, 0x13, 0x0d, 0x2c, 0x1e, 0xc5, 0x4d, 0xaa, 0xd8, 0x56, 0x9a, 0x02, + 0x69, 0x9c, 0x72, 0x00, 0x93, 0x25, 0x35, 0x62, 0x8d, 0xc4, 0xfe, 0xaa, + 0x02, 0x5a, 0x95, 0xaa, 0x79, 0x10, 0x54, 0xcd, 0xd9, 0x21, 0xfb, 0x72, + 0x22, 0xa4, 0x7d, 0x18, 0x98, 0x16, 0x66, 0x40, 0x96, 0xd8, 0xe8, 0x77, + 0x79, 0x70, 0x3e, 0x0b, 0x75, 0xec, 0x9c, 0x04, 0xcf, 0x4d, 0x26, 0xa4, + 0xf5, 0x09, 0xf2, 0x88, 0x85, 0xcc, 0x29, 0x6a, 0xe1, 0x0a, 0xc2, 0x54, + 0xef, 0x0b, 0x8c, 0x66, 0x92, 0x85, 0xc7, 0x05, 0x8a, 0xce, 0xb9, 0x36, + 0x6e, 0xcd, 0xd5, 0xee, 0xcb, 0x6d, 0x7a, 0x2b, 0x17, 0xe0, 0x0b, 0xa7, + 0xfe, 0x5c, 0x71, 0xd9, 0xe3, 0x4d, 0x61, 0x41, 0xef, 0x83, 0xd5, 0x55, + 0xda, 0x9a, 0x65, 0xdb, 0xa7, 0x51, 0x80, 0xee, 0xe5, 0x40, 0x0b, 0xd8, + 0x1d, 0x19, 0xab, 0x16, 0xbc, 0xd0, 0x4a, 0x64, 0x60, 0xeb, 0x5d, 0xa2, + 0xf7, 0x10, 0x6b, 0x79, 0xc5, 0x23, 0x78, 0xdd, 0x38, 0xa9, 0x5e, 0x8e, + 0xc8, 0xac, 0x2c, 0xdd, 0x40, 0xc2, 0xef, 0x26, 0x24, 0xa8, 0x80, 0x47, + 0x59, 0xc3, 0x9f, 0x9c, 0xfa, 0x6a, 0xb1, 0xaa, 0x8c, 0xf9, 0x05, 0x44, + 0x11, 0xaf, 0x82, 0xca, 0xb6, 0x47, 0x53, 0x70, 0xd8, 0xa2, 0x55, 0xe1, + 0x9f, 0xb9, 0x6a, 0xbe, 0x6c, 0x6c, 0x2d, 0x52, 0xd0, 0x2d, 0x95, 0x1d, + 0x95, 0x06, 0x0e, 0x61, 0x83, 0x99, 0x28, 0xba, 0x01, 0xff, 0xc6, 0x8f, + 0x98, 0xc5, 0x5f, 0x9a, 0xff, 0x20, 0x29, 0x3f, 0xea, 0x9e, 0x34, 0xa8, + 0x53, 0x98, 0xe6, 0x85, 0x32, 0x0b, 0xd2, 0x57, 0x4b, 0xa4, 0xf0, 0x9b, + 0x40, 0x69, 0x7f, 0xf4, 0xc2, 0xe0, 0xcd, 0x94, 0xf3, 0xb3, 0xa5, 0xb5, + 0xb6, 0xd8, 0xf4, 0x7b, 0x54, 0xbd, 0x79, 0xc4, 0xab, 0x9f, 0xf5, 0x26, + 0x2a, 0x8e, 0xe7, 0xe9, 0x60, 0x35, 0xc4, 0xba, 0x53, 0x1f, 0x17, 0x9c, + 0x35, 0xe8, 0xb2, 0x9d, 0x2b, 0xd7, 0x57, 0x8a, 0x2d, 0x39, 0x37, 0x2c, + 0x00, 0x4c, 0x12, 0x89, 0x6a, 0xe3, 0x77, 0x87, 0x8f, 0xad, 0xc9, 0x51, + 0xcd, 0x27, 0x3f, 0xd7, 0x84, 0xd8, 0x46, 0x00, 0x19, 0x21, 0x90, 0x63, + 0xc7, 0xf3, 0xae, 0xe0, 0xba, 0xb9, 0xb4, 0xa1, 0x5f, 0x2a, 0x83, 0xbe, + 0x21, 0xde, 0xe4, 0x85, 0x48, 0x19, 0x68, 0xad, 0x93, 0xd8, 0xa6, 0x18, + 0x10, 0x11, 0xa2, 0xd1, 0xf9, 0x1d, 0xe8, 0xde, 0x5b, 0x3d, 0x3a, 0x36, + 0x03, 0x61, 0xc8, 0x3c, 0x86, 0x1f, 0xfc, 0xfc, 0xa7, 0xcc, 0xa7, 0xdf, + 0x86, 0xbc, 0xac, 0xcb, 0x8a, 0xc5, 0x40, 0x99, 0xcc, 0xc9, 0x27, 0xe9, + 0xa5, 0xc1, 0x12, 0x16, 0x48, 0xd0, 0x7c, 0x94, 0xb8, 0x2e, 0xe6, 0xbe, + 0x4e, 0xea, 0xca, 0x52, 0xbd, 0x03, 0xe7, 0xde, 0x8c, 0x72, 0x24, 0x09, + 0xe2, 0xd7, 0xa0, 0xe9, 0xc7, 0x10, 0x28, 0xbb, 0x94, 0x65, 0x34, 0x34, + 0x0c, 0x73, 0xe7, 0xe6, 0x7d, 0x81, 0x59, 0xf7, 0xf9, 0xc5, 0xf4, 0x22, + 0xd2, 0x21, 0xf9, 0x77, 0x5f, 0xcc, 0x51, 0x87, 0x59, 0xa0, 0x58, 0x45, + 0x18, 0x70, 0xc6, 0xae, 0x8d, 0x94, 0xe5, 0x04, 0x83, 0x14, 0x2a, 0x00, + 0x5d, 0x7f, 0x63, 0x68, 0x9c, 0xed, 0x5b, 0xc1, 0x54, 0x43, 0xe0, 0x12, + 0xa0, 0x97, 0xb5, 0x9d, 0xcf, 0xc5, 0x85, 0xd6, 0xa0, 0xae, 0x07, 0x8e, + 0x5d, 0x4d, 0x0b, 0xb0, 0x97, 0xbd, 0x2c, 0x9c, 0x2c, 0xf9, 0xb2, 0xd7, + 0x8d, 0x6d, 0xba, 0xf6, 0x27, 0x5a, 0xa8, 0x3e, 0xc9, 0xbb, 0x03, 0xd1, + 0xb1, 0xf1, 0x15, 0x46, 0x57, 0xe7, 0x95, 0xa5, 0x4f, 0x49, 0xb5, 0x01, + 0x96, 0x8c, 0xd9, 0x58, 0x66, 0xd6, 0xfb, 0x82, 0xed, 0x2d, 0xc2, 0x7e, + 0xa6, 0xca, 0x91, 0x29, 0x84, 0xf3, 0xbd, 0xb6, 0x1e, 0xf3, 0x5e, 0xdf, + 0xfa, 0x0f, 0x43, 0x54, 0x37, 0xbc, 0x43, 0x9a, 0xaf, 0x24, 0xa4, 0x18, + 0xdb, 0x3f, 0xe4, 0x64, 0x6c, 0x32, 0x75, 0xc8, 0x6d, 0x38, 0xdc, 0x60, + 0x1b, 0xbe, 0x0d, 0x5b, 0x30, 0x11, 0xda, 0x33, 0xac, 0x84, 0x96, 0x7d, + 0x1d, 0x7a, 0x02, 0x4f, 0x98, 0x5f, 0x8a, 0xa8, 0x26, 0xa0, 0xaa, 0x4b, + 0x8d, 0xdc, 0xbc, 0xf5, 0x63, 0xac, 0xf5, 0x90, 0x5f, 0x17, 0xaa, 0x04, + 0x8d, 0xe2, 0x8e, 0x16, 0x1d, 0xfd, 0x76, 0xfd, 0x64, 0x42, 0xbc, 0x99, + 0x01, 0x7c, 0xb9, 0x28, 0xc9, 0xe1, 0xa5, 0x4c, 0xed, 0x5e, 0x2b, 0xd7, + 0x61, 0x60, 0xa5, 0xdc, 0xf4, 0xb3, 0x9a, 0x9e, 0xbf, 0xa0, 0xbe, 0x16, + 0xb6, 0x15, 0xf5, 0x71, 0xe0, 0x56, 0xd7, 0x15, 0x71, 0x51, 0x4a, 0x6d, + 0x7d, 0x74, 0xea, 0x4b, 0xe7, 0x2b, 0xc5, 0x49, 0x1a, 0x96, 0xbb, 0x66, + 0xc7, 0xfb, 0xcb, 0xb9, 0x2f, 0xcf, 0x5d, 0xad, 0x07, 0x7d, 0xcf, 0x48, + 0x90, 0xde, 0xeb, 0x5a, 0x18, 0x69, 0x65, 0xdd, 0x80, 0xcd, 0x76, 0x28, + 0x4c, 0xce, 0x11, 0x94, 0x46, 0xd4, 0x3e, 0x2a, 0x3c, 0xa8, 0xf2, 0xc1, + 0x49, 0x3c, 0x2a, 0x5a, 0x2f, 0x8f, 0x99, 0x01, 0xb8, 0x2d, 0xdf, 0x42, + 0x7f, 0xc4, 0x1e, 0x7e, 0xdc, 0xd6, 0xb4, 0x60, 0x44, 0xaa, 0x50, 0xfa, + 0xa1, 0x47, 0xa6, 0x90, 0xa7, 0x0f, 0x8a, 0xef, 0xcd, 0x40, 0x7d, 0x14, + 0x08, 0x4f, 0x21, 0x50, 0x47, 0xea, 0x69, 0x5a, 0x36, 0x1c, 0x03, 0x54, + 0xde, 0x66, 0xce, 0x61, 0x02, 0xf7, 0xa5, 0xb1, 0x70, 0x55, 0x4e, 0x04, + 0xba, 0x1e, 0xc3, 0x1e, 0xa2, 0x92, 0x4c, 0xfd, 0x32, 0x96, 0x0e, 0x58, + 0x35, 0x0a, 0x0d, 0xc7, 0xe8, 0x5b, 0x02, 0x73, 0x37, 0xd3, 0x34, 0x85, + 0x72, 0x6b, 0x4f, 0x38, 0x01, 0x86, 0x68, 0xb5, 0xc7, 0x31, 0xc0, 0xa8, + 0xf2, 0x0a, 0x37, 0x63, 0xb5, 0x97, 0x27, 0x4f, 0x53, 0x74, 0x96, 0xc5, + 0xa1, 0x3e, 0xcc, 0x11, 0x72, 0xc7, 0x81, 0x81, 0x17, 0xff, 0x42, 0xbe, + 0x29, 0xdc, 0xe5, 0x37, 0x09, 0xfb, 0xd3, 0x5d, 0x5d, 0x1f, 0x64, 0xcc, + 0xdd, 0x1c, 0xcc, 0x98, 0x00, 0xd9, 0x09, 0x60, 0x79, 0x1c, 0xd4, 0xb7, + 0xa5, 0x44, 0x39, 0xbb, 0x2c, 0xda, 0x5b, 0xf2, 0xb0, 0xbc, 0x32, 0xa9, + 0xed, 0xd9, 0xb4, 0xab, 0x84, 0xf1, 0xb6, 0xab, 0xc3, 0x4d, 0x1a, 0x69, + 0xa4, 0xbd, 0xeb, 0x4b, 0x64, 0x9d, 0xbc, 0x8c, 0xfe, 0xf2, 0xb3, 0x1c, + 0x61, 0x24, 0x7f, 0xc7, 0x87, 0xea, 0x51, 0xcb, 0xfb, 0xe2, 0x67, 0x21, + 0xde, 0x03, 0x66, 0x68, 0xe0, 0x5d, 0x0a, 0x0a, 0xdc, 0x79, 0x4d, 0x72, + 0xa8, 0x34, 0xec, 0xe3, 0x32, 0x2f, 0x9e, 0xcc, 0xec, 0xf8, 0x8b, 0xe6, + 0xd3, 0xe1, 0xcf, 0x02, 0x85, 0x83, 0x8e, 0x82, 0x45, 0xc7, 0x27, 0xe7, + 0xac, 0xb3, 0x54, 0x34, 0x09, 0x97, 0xe5, 0x6f, 0x13, 0x9f, 0x81, 0x97, + 0x66, 0xd6, 0xff, 0x23, 0x53, 0x07, 0x34, 0xbb, 0x1c, 0x00, 0x0c, 0x8b, + 0x67, 0xb1, 0xbe, 0x56, 0x06, 0x51, 0x29, 0x84, 0xf4, 0xd8, 0xc5, 0x43, + 0xcf, 0x21, 0x42, 0x87, 0x40, 0xbd, 0xf3, 0xec, 0x53, 0x2c, 0x3f, 0xc9, + 0x1e, 0xda, 0xe8, 0x93, 0x2b, 0x44, 0xe0, 0x73, 0x63, 0x44, 0x74, 0x68, + 0x46, 0x3a, 0x3f, 0x5f, 0xb7, 0x35, 0xe3, 0x07, 0x5d, 0x78, 0xd6, 0x42, + 0xa3, 0xf6, 0xcd, 0xd0, 0xb9, 0x9c, 0x46, 0x71, 0x88, 0xdf, 0x91, 0x57, + 0x47, 0x59, 0xed, 0x69, 0x5f, 0xb8, 0x91, 0xfb, 0x6c, 0x8e, 0x78, 0x53, + 0x57, 0x69, 0xca, 0xc2, 0xab, 0x0c, 0x19, 0x2e, 0x3a, 0x22, 0x85, 0xce, + 0xc7, 0x69, 0x17, 0x20, 0x37, 0x7f, 0xd8, 0x41, 0x86, 0xcd, 0x0f, 0xf2, + 0x25, 0x5c, 0xeb, 0x49, 0x05, 0x78, 0x4b, 0x63, 0x31, 0x11, 0xbd, 0x9b, + 0xfd, 0xb6, 0x9d, 0x45, 0x91, 0x94, 0xa0, 0x03, 0x47, 0xfe, 0x25, 0x5d, + 0x6d, 0x4f, 0xc7, 0x65, 0xed, 0x89, 0xe0, 0xd5, 0xcd, 0x1b, 0xf7, 0xf5, + 0xc4, 0x94, 0x70, 0x80, 0x2e, 0x05, 0xba, 0xb8, 0xc8, 0x61, 0x71, 0x85, + 0x1a, 0x34, 0xc9, 0xcd, 0x2c, 0x43, 0x05, 0x17, 0x58, 0x9c, 0x9e, 0xc0, + 0x35, 0x81, 0xb4, 0x61, 0xe4, 0x91, 0xa3, 0xf3, 0xee, 0x0c, 0x58, 0xcc, + 0xa2, 0x05, 0xd9, 0xa7, 0x56, 0x12, 0xb6, 0x96, 0x03, 0xca, 0x55, 0xe8, + 0x93, 0xc1, 0xa2, 0x62, 0xf1, 0x65, 0xa4, 0x44, 0x10, 0x4e, 0x3a, 0x2a, + 0xa5, 0x22, 0x1e, 0xcd, 0x9b, 0x69, 0x21, 0xb5, 0x40, 0xc2, 0x53, 0x81, + 0x8d, 0xd6, 0x7a, 0x71, 0x0d, 0x7f, 0x33, 0xb7, 0x4b, 0x7c, 0x94, 0xce, + 0xaa, 0x1c, 0x53, 0xa8, 0x61, 0x7e, 0xe8, 0x97, 0x99, 0x87, 0xbe, 0x08, + 0x82, 0x4c, 0x4a, 0x53, 0xb1, 0xb8, 0xb8, 0x71, 0x45, 0xf1, 0x95, 0xa8, + 0x78, 0x75, 0x60, 0x7e, 0xb7, 0x91, 0xcd, 0x3c, 0xa5, 0x57, 0x0e, 0x53, + 0x06, 0xa3, 0xe6, 0x48, 0x0b, 0xe1, 0xfa, 0x5f, 0x8e, 0x2e, 0xd6, 0x23, + 0x5b, 0xd8, 0x20, 0x55, 0x0c, 0x03, 0xfb, 0x25, 0x55, 0xf2, 0x96, 0x14, + 0x0a, 0xf5, 0xac, 0xbb, 0xf3, 0xc1, 0xec, 0x97, 0xaa, 0xfe, 0x00, 0x90, + 0xbc, 0x3a, 0x4c, 0x3b, 0x8b, 0xa7, 0x8b, 0xba, 0x3f, 0x8a, 0x86, 0x1b, + 0xe8, 0xe0, 0xfd, 0x87, 0x6f, 0x35, 0x51, 0x9d, 0xbd, 0x6c, 0x9c, 0xa7, + 0x3d, 0x55, 0xb1, 0x7a, 0xef, 0x69, 0xe4, 0x9e, 0x0d, 0xd7, 0x09, 0x13, + 0x0c, 0x0e, 0xb9, 0xd5, 0x8a, 0x75, 0x90, 0xaf, 0x62, 0xb1, 0xcc, 0xc7, + 0x14, 0x7c, 0x47, 0x69, 0xfc, 0xfd, 0x75, 0xa5, 0x0a, 0x32, 0xb4, 0x9f, + 0xaa, 0x19, 0x69, 0xf2, 0x2f, 0x5c, 0x0e, 0x7e, 0x2d, 0xd7, 0xab, 0xef, + 0x94, 0xee, 0x49, 0xf8, 0x08, 0x6d, 0xbe, 0xfd, 0x95, 0xbc, 0x4c, 0x99, + 0x92, 0xce, 0xb3, 0x08, 0xf0, 0xf8, 0xf5, 0x03, 0x67, 0xf9, 0x9c, 0x07, + 0x5a, 0x93, 0x1c, 0x27, 0xa8, 0x49, 0x4c, 0x18, 0x40, 0xe1, 0x88, 0x0f, + 0x6b, 0xb8, 0x95, 0xd2, 0xbc, 0x66, 0x6c, 0xa9, 0x17, 0x99, 0x51, 0xa5, + 0x9d, 0x1e, 0x7b, 0xee, 0x61, 0x0a, 0x9e, 0x0b, 0xe9, 0x33, 0xa3, 0x6e, + 0xd1, 0x58, 0xc3, 0xe5, 0xf3, 0xe8, 0x43, 0x46, 0xae, 0x3a, 0x7a, 0x25, + 0x7e, 0x62, 0xba, 0xb6, 0x19, 0x6f, 0x22, 0xb5, 0x2c, 0x28, 0x3c, 0xdd, + 0x59, 0xc0, 0x37, 0x41, 0x3f, 0x44, 0xa9, 0x73, 0x4e, 0x85, 0xd0, 0x53, + 0xf8, 0xc0, 0xd8, 0x13, 0xce, 0xcf, 0x8c, 0x4d, 0xba, 0x96, 0x2f, 0x86, + 0x06, 0xa7, 0x21, 0x5c, 0x10, 0xf8, 0xf9, 0xfc, 0x9f, 0x2a, 0x8e, 0x0f, + 0x9d, 0x7e, 0x61, 0xe0, 0x78, 0x95, 0xd5, 0x4b, 0x67, 0xc0, 0xa3, 0xa6, + 0xef, 0x20, 0x7b, 0xe5, 0x86, 0xa3, 0x47, 0xc8, 0x43, 0xd4, 0x8d, 0xa5, + 0x7a, 0x11, 0xa3, 0x9d, 0x34, 0x31, 0x72, 0xac, 0x4d, 0x1f, 0x4f, 0xbe, + 0xdf, 0xb6, 0xdb, 0x15, 0xd5, 0xdb, 0x70, 0x1f, 0x35, 0x4a, 0xea, 0x1a, + 0x3f, 0x17, 0x91, 0x94, 0xf9, 0x81, 0x14, 0x71, 0x11, 0xf0, 0xf9, 0x0f, + 0x22, 0x60, 0xb4, 0xc8, 0x1f, 0x43, 0xf4, 0x91, 0xd4, 0x54, 0x83, 0xbe, + 0x68, 0x7d, 0x11, 0xd8, 0x86, 0x75, 0x9a, 0x3e, 0x4a, 0xd1, 0x07, 0xcb, + 0x81, 0x01, 0x28, 0x1a, 0x30, 0x82, 0x3c, 0x30, 0x66, 0x33, 0x12, 0x1b, + 0x1c, 0x19, 0xb4, 0xcd, 0xc6, 0xba, 0x15, 0xd8, 0xd4, 0x87, 0xa8, 0x4e, + 0x38, 0x42, 0xb2, 0xee, 0x8a, 0x1c, 0x0a, 0xdb, 0xbd, 0x5d, 0xf7, 0x12, + 0x01, 0xc5, 0x6b, 0xcc, 0xb1, 0x4b, 0x76, 0x78, 0x87, 0x9a, 0x44, 0x35, + 0xe3, 0x2b, 0x72, 0x3c, 0x74, 0x5a, 0xfa, 0xeb, 0x29, 0x6b, 0xb0, 0x19, + 0xf9, 0x48, 0x87, 0xed, 0x7c, 0xcd, 0x6c, 0x5f, 0x85, 0xac, 0xa8, 0x9b, + 0x3e, 0x5b, 0x9e, 0x3d, 0x59, 0x62, 0x28, 0x7e, 0x5a, 0x5f, 0x85, 0xdf, + 0xe7, 0x40, 0x60, 0xf5, 0xf2, 0x41, 0xab, 0x3e, 0xf8, 0x2a, 0x4c, 0x6d, + 0xf8, 0xb4, 0x14, 0xfb, 0xbd, 0x91, 0x4e, 0x1d, 0xba, 0xa1, 0xae, 0xff, + 0xee, 0x95, 0xa7, 0xa7, 0xe2, 0x49, 0x62, 0xac, 0x87, 0x9c, 0xe5, 0xbe, + 0x29, 0xab, 0x01, 0xe8, 0xc8, 0x85, 0x87, 0xd9, 0x02, 0xbb, 0x6a, 0xa3, + 0xfa, 0xd9, 0x72, 0xdf, 0x11, 0x6f, 0xa8, 0x78, 0xb2, 0xbd, 0xdb, 0xa1, + 0x18, 0x5e, 0x9e, 0x85, 0xd7, 0x27, 0x6d, 0xd1, 0x79, 0x4d, 0x6e, 0x17, + 0xa1, 0xd6, 0x92, 0x26, 0x72, 0x37, 0xbd, 0xe5, 0x49, 0x88, 0x94, 0x5c, + 0xc2, 0x60, 0x46, 0x0f, 0x78, 0x24, 0xf1, 0x2a, 0xc1, 0x59, 0xae, 0x5e, + 0x16, 0x62, 0xee, 0xb3, 0x7e, 0x84, 0xf1, 0xab, 0xfb, 0xf5, 0x14, 0x8c, + 0x0f, 0x6b, 0x3e, 0x3d, 0x98, 0xa6, 0xe5, 0xec, 0xcc, 0x37, 0xe5, 0x91, + 0x2c, 0x76, 0x09, 0x62, 0xd4, 0xe8, 0x89, 0x84, 0xbc, 0x73, 0x7c, 0x9d, + 0x28, 0x96, 0x64, 0x57, 0x6c, 0xbf, 0x2c, 0xbf, 0x06, 0x15, 0x2a, 0xa2, + 0x0c, 0xa7, 0xf1, 0x96, 0x4c, 0x95, 0x7a, 0x97, 0x7a, 0xbc, 0xdf, 0xe6, + 0xd0, 0xc9, 0x6c, 0xca, 0xb9, 0x9e, 0x54, 0x6a, 0x4d, 0x25, 0xc3, 0x36, + 0x92, 0x06, 0x2b, 0xe4, 0x93, 0xeb, 0x27, 0x29, 0x3d, 0x05, 0x05, 0x7a, + 0xd4, 0xb0, 0xfd, 0xc0, 0xc9, 0xe1, 0x97, 0xd6, 0x5d, 0x65, 0xbb, 0xa5, + 0x5c, 0xc8, 0x51, 0xaa, 0x3c, 0x88, 0x3f, 0xa2, 0xe9, 0x11, 0x86, 0x9c, + 0x0f, 0x2a, 0x5a, 0xf2, 0x99, 0x9d, 0xcd, 0x9d, 0xc1, 0x79, 0x0a, 0xf9, + 0x7d, 0xd5, 0x36, 0xff, 0x52, 0x27, 0x47, 0x60, 0x2e, 0xa8, 0xb5, 0x58, + 0xc3, 0x47, 0x26, 0x54, 0x63, 0xa3, 0xc4, 0x64, 0x66, 0x79, 0x76, 0x8a, + 0xc1, 0xcc, 0xa3, 0x67, 0x93, 0x5d, 0xc8, 0x0b, 0x05, 0x28, 0x42, 0x51, + 0x95, 0x63, 0x45, 0x70, 0x3b, 0x9c, 0xf2, 0x93, 0xcb, 0xf3, 0xcc, 0xa2, + 0x3a, 0xe9, 0x56, 0x83, 0x1f, 0xdc, 0x56, 0xf8, 0xcc, 0x91, 0x0c, 0x7e, + 0x13, 0xbb, 0x4b, 0xe6, 0x14, 0x0d, 0xdf, 0xe5, 0xbc, 0x46, 0x04, 0x2a, + 0x1a, 0x52, 0xa0, 0xf8, 0x1d, 0xb5, 0x28, 0x78, 0xfb, 0x2d, 0x1f, 0x5e, + 0x36, 0x03, 0xd4, 0x2f, 0x3f, 0xf8, 0xf2, 0xce, 0x8e, 0xc4, 0x90, 0xa1, + 0xaa, 0xda, 0xb3, 0xc9, 0xf4, 0x7a, 0x13, 0x1a, 0x34, 0x2c, 0x54, 0xf6, + 0x19, 0x48, 0x9c, 0xef, 0xb6, 0x44, 0xa1, 0xd0, 0x25, 0xb8, 0x10, 0xd1, + 0xa9, 0x07, 0x0c, 0xb1, 0xa5, 0xb4, 0x98, 0xc8, 0x09, 0x1c, 0x2d, 0x63, + 0x67, 0xf1, 0xe6, 0x19, 0x8f, 0xd6, 0xb4, 0xeb, 0xba, 0x78, 0x96, 0xc6, + 0x5b, 0x2f, 0x3f, 0x26, 0x50, 0xd7, 0x3d, 0x1a, 0x8c, 0xdf, 0x47, 0x0d, + 0xad, 0x72, 0x93, 0xe9, 0xd3, 0x60, 0x54, 0xb4, 0xbb, 0x86, 0x94, 0xad, + 0xeb, 0xe7, 0xe8, 0x5b, 0xbb, 0x3f, 0xf7, 0xfb, 0x5d, 0xf9, 0xa2, 0x9e, + 0xbe, 0x93, 0x0c, 0x50, 0x35, 0x61, 0xce, 0x21, 0xd5, 0xf5, 0xa9, 0xc3, + 0x7c, 0x8f, 0x06, 0x87, 0xf4, 0x9b, 0x58, 0xbe, 0x5c, 0x7e, 0x12, 0xcc, + 0x4b, 0x48, 0x11, 0x4c, 0x59, 0x2a, 0x1e, 0x29, 0xc1, 0x22, 0x36, 0xa0, + 0xa4, 0x75, 0xd5, 0xcd, 0xe4, 0x79, 0xa7, 0x36, 0xe4, 0x2a, 0xe6, 0xf5, + 0x11, 0x54, 0x30, 0xdc, 0x26, 0x2f, 0xf7, 0x70, 0xf3, 0x2a, 0x2a, 0x93, + 0x02, 0x41, 0xa4, 0xa2, 0x41, 0x4c, 0x1a, 0x86, 0x89, 0xfa, 0xe1, 0xa6, + 0xad, 0x32, 0xf1, 0x0e, 0xaa, 0x7c, 0x44, 0x49, 0x9f, 0xd3, 0x75, 0x32, + 0x5c, 0x49, 0xa1, 0xe5, 0x46, 0x86, 0x6e, 0xce, 0xbb, 0x1b, 0x29, 0x1d, + 0x61, 0x25, 0xf9, 0x3e, 0xd4, 0xe9, 0xbc, 0xc5, 0x56, 0xc5, 0xd6, 0xa1, + 0x4d, 0x52, 0xde, 0x92, 0x11, 0x4b, 0xef, 0x16, 0x1d, 0xd6, 0xcb, 0xce, + 0xb4, 0x2a, 0x4e, 0xfa, 0x1c, 0xae, 0xcf, 0x0f, 0xc8, 0x10, 0x61, 0x23, + 0x48, 0xaf, 0x92, 0x79, 0x7c, 0x88, 0xce, 0x12, 0x78, 0x6e, 0x63, 0x45, + 0xbe, 0xed, 0x2c, 0x65, 0xe0, 0x54, 0x7d, 0x84, 0x68, 0x00, 0x07, 0x3e, + 0x6a, 0x99, 0xf9, 0x22, 0x05, 0x30, 0x83, 0x9a, 0x3a, 0xb5, 0x0f, 0x88, + 0x18, 0xb4, 0x9b, 0x4a, 0x6e, 0x26, 0xdd, 0x8e, 0x09, 0xed, 0xc5, 0x24, + 0x83, 0xf9, 0xc9, 0x6e, 0x1b, 0x06, 0xd5, 0x21, 0xd6, 0xdf, 0xec, 0xd7, + 0x8e, 0x35, 0x89, 0x8b, 0x56, 0x77, 0x5d, 0xa9, 0x2c, 0xbf, 0x85, 0x7d, + 0xd1, 0xbc, 0xc1, 0x66, 0x2c, 0xc6, 0x18, 0x2a, 0x3d, 0xae, 0x9a, 0x01, + 0xbe, 0xfb, 0x5c, 0x08, 0x64, 0xa3, 0xf8, 0x12, 0xb3, 0x4b, 0xa0, 0x4b, + 0x3a, 0xf6, 0x40, 0x96, 0x5d, 0x67, 0x36, 0x65, 0x19, 0x58, 0x03, 0x59, + 0x1f, 0xcd, 0xcc, 0x3a, 0xa8, 0x2f, 0x23, 0xb5, 0xcb, 0xef, 0x8e, 0xe1, + 0x57, 0xdc, 0xcb, 0xd5, 0x3f, 0x48, 0xd5, 0x16, 0xc9, 0x56, 0x52, 0xc2, + 0x0c, 0x2a, 0x83, 0xde, 0xe8, 0x03, 0x35, 0x90, 0x69, 0x3e, 0x81, 0xee, + 0x7d, 0xde, 0x28, 0xcd, 0x4e, 0xa5, 0xb9, 0x8b, 0xfc, 0x3a, 0x48, 0xe0, + 0x43, 0x5e, 0xd9, 0x5f, 0x7f, 0xf7, 0x0f, 0x7e, 0x89, 0xce, 0xf3, 0xab, + 0xa3, 0x76, 0xc3, 0x41, 0x73, 0xcf, 0xa3, 0x84, 0xa3, 0xf1, 0xfc, 0xa8, + 0x4c, 0xad, 0x2c, 0x84, 0x6e, 0x9f, 0x8e, 0x0e, 0x78, 0x8e, 0xaa, 0xfc, + 0x71, 0x1f, 0x1d, 0x7a, 0xbf, 0xdc, 0x32, 0xcc, 0x25, 0xe2, 0x0f, 0xd1, + 0x7b, 0xe2, 0x1d, 0x44, 0x21, 0xaf, 0x7e, 0x82, 0xfe, 0xb3, 0xf4, 0xc1, + 0xeb, 0x52, 0xe5, 0xaf, 0x91, 0xe9, 0x69, 0x0f, 0x39, 0xe3, 0xcb, 0x7a, + 0x16, 0x6a, 0xe9, 0x78, 0x29, 0x5f, 0xe1, 0x66, 0x95, 0x6d, 0x30, 0xd0, + 0x50, 0x13, 0x08, 0x62, 0x40, 0x3b, 0xb3, 0xca, 0x7d, 0xa1, 0xb2, 0x51, + 0x9c, 0x29, 0x7b, 0xd3, 0x1a, 0xee, 0x46, 0xfa, 0xec, 0x27, 0x9b, 0x5c, + 0xa3, 0x0f, 0xf1, 0x73, 0x4a, 0x16, 0xdc, 0x0e, 0xd6, 0xb8, 0xc6, 0x50, + 0x29, 0xc2, 0x99, 0x47, 0x37, 0xf7, 0xb4, 0xee, 0x52, 0x9b, 0x0a, 0xe1, + 0xd3, 0xed, 0x94, 0x59, 0xda, 0x1b, 0xeb, 0x80, 0x4d, 0xf7, 0xb4, 0x78, + 0x0a, 0x0b, 0xd9, 0x4c, 0x67, 0x75, 0x2c, 0x05, 0x59, 0x02, 0xeb, 0xff, + 0xf7, 0x71, 0xe0, 0x88, 0x19, 0x61, 0xb9, 0xce, 0x49, 0x75, 0xd7, 0xb4, + 0xa6, 0x7c, 0x35, 0x80, 0x77, 0x5d, 0xfb, 0xb0, 0x2d, 0xb7, 0x58, 0x95, + 0x82, 0xca, 0x95, 0x74, 0x25, 0x60, 0x48, 0x5b, 0x7c, 0x46, 0xec, 0x53, + 0x89, 0xe7, 0x3b, 0x23, 0xb2, 0xcc, 0x1b, 0x0f, 0x47, 0xdb, 0xf5, 0x2a, + 0x25, 0x90, 0x12, 0x9b, 0x3f, 0x1e, 0xfb, 0xe3, 0x3a, 0x55, 0x77, 0xb3, + 0xa4, 0x30, 0x65, 0x43, 0x76, 0x81, 0x4b, 0xa0, 0x21, 0xe0, 0x79, 0x36, + 0xe4, 0x13, 0xef, 0x25, 0x8c, 0xd0, 0x43, 0x4b, 0xa5, 0xeb, 0x8d, 0x4f, + 0x56, 0x53, 0xd2, 0x70, 0xe9, 0xbf, 0x44, 0x31, 0x28, 0x1c, 0x04, 0x77, + 0x19, 0xee, 0x88, 0xd4, 0x1c, 0x32, 0xbb, 0xab, 0xd6, 0xb2, 0x75, 0x27, + 0x93, 0x09, 0xe7, 0x03, 0xee, 0x59, 0x58, 0x36, 0xbd, 0x75, 0xfa, 0x2c, + 0xd4, 0x2f, 0x88, 0xb7, 0xdd, 0x59, 0xe0, 0x14, 0xda, 0x34, 0x31, 0x34, + 0xc0, 0x18, 0x86, 0xa3, 0xcc, 0x9f, 0x28, 0x28, 0xf2, 0x9f, 0xdc, 0x89, + 0x01, 0x7f, 0xac, 0x29, 0x5b, 0x8a, 0x27, 0x27, 0x38, 0x8b, 0x55, 0xf5, + 0x88, 0x74, 0x42, 0x4c, 0xd1, 0xd8, 0xdc, 0xd5, 0xe5, 0x87, 0xaf, 0x25, + 0x17, 0xec, 0x75, 0xe4, 0x0d, 0xd5, 0x75, 0x14, 0x64, 0xad, 0x80, 0x53, + 0x03, 0x5a, 0xf4, 0xf8, 0x1a, 0x28, 0xe4, 0xa2, 0x37, 0x65, 0x06, 0xdb, + 0x59, 0x7e, 0x73, 0xca, 0x65, 0x75, 0x59, 0x8d, 0xe8, 0x2b, 0xce, 0x42, + 0xcf, 0x22, 0xfa, 0x98, 0x38, 0xd7, 0x2c, 0x93, 0x20, 0xf1, 0x1f, 0x62, + 0x7b, 0xa3, 0x8f, 0xad, 0x4b, 0xf5, 0xf3, 0xdb, 0x27, 0x8b, 0xac, 0x25, + 0xef, 0x03, 0x58, 0xa4, 0x8e, 0xc0, 0x06, 0xd5, 0xc7, 0xc0, 0xae, 0x98, + 0xa2, 0xee, 0xab, 0x70, 0x9c, 0x99, 0xad, 0x92, 0x7d, 0xe3, 0x5b, 0x2d, + 0x9f, 0xf0, 0xe3, 0xac, 0xea, 0xe2, 0xdc, 0x48, 0x24, 0x3f, 0x33, 0x6f, + 0xc4, 0xd2, 0x8d, 0x9c, 0xcf, 0xe8, 0xb7, 0x52, 0x32, 0xab, 0xb9, 0x41, + 0x18, 0x0c, 0x0f, 0x13, 0xf2, 0x48, 0x91, 0x68, 0x19, 0x55, 0x22, 0x04, + 0x1d, 0xed, 0xda, 0xa6, 0xaf, 0x29, 0xcb, 0xcb, 0x85, 0x00, 0x00, 0x04, + 0xe6, 0x3d, 0x68, 0xb5, 0x2b, 0xd4, 0x0d, 0x5b, 0xcd, 0x34, 0x6b, 0x15, + 0x36, 0x71, 0x48, 0xf2, 0xd2, 0xcd, 0x46, 0xc5, 0x3b, 0xa5, 0x19, 0xa0, + 0x94, 0x60, 0x36, 0x62, 0x41, 0xe8, 0x4e, 0x10, 0x0d, 0x81, 0x43, 0x68, + 0xc4, 0x7f, 0x89, 0x29, 0x24, 0x9f, 0x6f, 0x69, 0x8f, 0xf2, 0x26, 0x8d, + 0x8b, 0x36, 0x64, 0x4f, 0xde, 0x6f, 0xae, 0xaa, 0xd3, 0x1b, 0xa0, 0x8a, + 0x55, 0x60, 0xa3, 0xe7, 0x67, 0xe8, 0x89, 0xfb, 0xce, 0x66, 0x34, 0x0b, + 0xce, 0xba, 0xe6, 0x80, 0xc2, 0xeb, 0x01, 0xc9, 0xd6, 0xad, 0x59, 0x02, + 0xb7, 0x14, 0x0d, 0x2c, 0xe9, 0xf9, 0xcd, 0x7a, 0x83, 0x72, 0xdf, 0xb5, + 0x25, 0x11, 0x65, 0x1a, 0xee, 0xf0, 0x40, 0xbb, 0xdf, 0x62, 0xb3, 0x03, + 0xd5, 0xbf, 0x18, 0xbc, 0xd1, 0x41, 0x53, 0x84, 0x5e, 0x28, 0x25, 0x54, + 0x14, 0xd1, 0xcf, 0xff, 0x1b, 0xb1, 0x62, 0xc9, 0x5e, 0x05, 0xd6, 0xe7, + 0x92, 0x18, 0xe7, 0xf3, 0x55, 0xd4, 0x9e, 0x3c, 0x0f, 0x0f, 0x77, 0xb8, + 0xd3, 0xd7, 0x7e, 0xb4, 0xb1, 0xe0, 0x36, 0x50, 0x96, 0xeb, 0xd0, 0x7e, + 0x72, 0x22, 0x69, 0x65, 0x35, 0xbb, 0xba, 0xc4, 0x4a, 0xdf, 0xdd, 0x30, + 0xe8, 0xe0, 0x47, 0x30, 0x1c, 0xbb, 0x7b, 0xa2, 0x7f, 0xbf, 0x7c, 0x34, + 0x93, 0x0e, 0x72, 0x38, 0x80, 0x5a, 0x6a, 0xfa, 0x67, 0xa7, 0x70, 0x39, + 0xb8, 0xfd, 0x39, 0x48, 0x67, 0x9a, 0x56, 0x8f, 0x8c, 0xc3, 0xb0, 0x4a, + 0x99, 0x00, 0xde, 0x63, 0x29, 0x9c, 0xae, 0x34, 0xcd, 0x73, 0xd7, 0xf3, + 0xcb, 0x7d, 0xa6, 0xd6, 0xe0, 0x1d, 0xd4, 0x86, 0xa5, 0xaa, 0x1e, 0xf1, + 0x78, 0xad, 0xd5, 0xc6, 0xae, 0xc0, 0xdd, 0x04, 0x23, 0x02, 0x75, 0xc7, + 0xb2, 0xef, 0x99, 0x5d, 0xa7, 0xea, 0xf9, 0x5e, 0x34, 0xe3, 0x5e, 0x0b, + 0x0a, 0x23, 0x21, 0xd7, 0x4b, 0x0a, 0x5e, 0xa3, 0xfd, 0xe8, 0xb7, 0x32, + 0xf8, 0x7e, 0xf4, 0xfd, 0xe8, 0xa9, 0x1b, 0xd6, 0x65, 0x7e, 0xf9, 0xce, + 0xa4, 0x54, 0xe2, 0x73, 0xaf, 0xf1, 0x17, 0x15, 0x28, 0x23, 0x75, 0xfa, + 0x36, 0xbe, 0x39, 0x89, 0xb4, 0xeb, 0xb1, 0x05, 0xff, 0x68, 0xe7, 0xbc, + 0xc1, 0x62, 0x11, 0xc7, 0xb9, 0xcc, 0xe6, 0xde, 0x12, 0x93, 0x7e, 0x0e, + 0x7e, 0x02, 0xb5, 0xfd, 0xb0, 0x5e, 0x11, 0x8b, 0xbf, 0xc8, 0x4d, 0x76, + 0x48, 0xdf, 0x60, 0x2b, 0x47, 0x48, 0x1f, 0xd5, 0x3e, 0x6e, 0x14, 0xe3, + 0xe8, 0xcd, 0x65, 0x8b, 0xf8, 0x7f, 0x40, 0x69, 0x2d, 0x1e, 0x64, 0x85, + 0xe0, 0x37, 0xe6, 0x07, 0x43, 0x02, 0x44, 0xc5, 0x37, 0x23, 0x37, 0x5e, + 0x8a, 0x78, 0xde, 0xdd, 0x96, 0x36, 0xf4, 0x46, 0xe4, 0x19, 0x47, 0xca, + 0xe9, 0x35, 0x31, 0x30, 0xdc, 0x54, 0x83, 0x8f, 0x6f, 0x5e, 0xa0, 0xdd, + 0xa6, 0x9d, 0x6d, 0xdf, 0xb2, 0x53, 0x24, 0x0c, 0xb1, 0xea, 0x45, 0x7e, + 0x65, 0xbd, 0x6d, 0x72, 0xbc, 0xcf, 0xb2, 0x41, 0x0b, 0xc8, 0xcd, 0xec, + 0x9c, 0xea, 0xda, 0x62, 0xc2, 0xf6, 0xdf, 0x22, 0xed, 0xc5, 0x0c, 0xd0, + 0xa3, 0x71, 0x6a, 0x23, 0xf0, 0x80, 0x7a, 0x0c, 0x31, 0x38, 0xb4, 0x70, + 0x52, 0xb3, 0x3a, 0xfd, 0x8f, 0x57, 0x48, 0xb1, 0x86, 0xce, 0x6d, 0x90, + 0xa8, 0x1e, 0xaa, 0xa1, 0xbd, 0x85, 0x49, 0x49, 0x25, 0xbb, 0x03, 0x08, + 0xcf, 0xa8, 0xc4, 0x7d, 0x6c, 0x11, 0x94, 0xb0, 0x17, 0xc9, 0xee, 0xdb, + 0xd5, 0x66, 0x60, 0x1a, 0xc2, 0xda, 0xfb, 0xbb, 0xc4, 0xa2, 0x82, 0x74, + 0x98, 0x5f, 0x89, 0xf5, 0xc7, 0x31, 0xb0, 0xb0, 0x13, 0xf6, 0x88, 0x7e, + 0x02, 0xa6, 0x45, 0xe8, 0x46, 0xc1, 0x1f, 0xbd, 0x61, 0x7e, 0x86, 0x94, + 0xfe, 0xb9, 0x0e, 0xcb, 0xba, 0x94, 0x65, 0xde, 0x79, 0x79, 0xb5, 0x2b, + 0xbb, 0x89, 0xcb, 0x0d, 0xbc, 0x60, 0x72, 0xaf, 0x9b, 0xcf, 0x86, 0xd6, + 0x37, 0xf0, 0x32, 0x11, 0xd5, 0x2d, 0xab, 0xb2, 0xfd, 0x48, 0x9a, 0x08, + 0x46, 0x83, 0xa9, 0x67, 0x02, 0x70, 0x76, 0xca, 0x7b, 0x4c, 0x24, 0xee, + 0x2a, 0x4c, 0x9b, 0x2d, 0xd0, 0x09, 0x2a, 0x78, 0xaa, 0xd1, 0x25, 0xb4, + 0xa1, 0x99, 0x8d, 0xc6, 0x1b, 0x79, 0xd2, 0xd6, 0xd9, 0x04, 0x6e, 0x9e, + 0x4f, 0x8e, 0x51, 0xa9, 0x53, 0x78, 0xe7, 0x00, 0xcf, 0xf8, 0x0f, 0xb6, + 0x20, 0x2c, 0xfc, 0x82, 0xb0, 0xf6, 0x4d, 0x15, 0xc5, 0x40, 0x44, 0x2a, + 0xee, 0x9e, 0xc0, 0x70, 0x72, 0x92, 0xf0, 0x32, 0x8a, 0x4c, 0x72, 0x3e, + 0x19, 0xe1, 0x46, 0xcc, 0xaa, 0x69, 0x46, 0x54, 0xa4, 0x02, 0x12, 0x73, + 0xb2, 0xca, 0x75, 0x67, 0x8d, 0x79, 0x01, 0x52, 0xfd, 0x80, 0x92, 0xe9, + 0x7b, 0x02, 0xfd, 0x4d, 0xd7, 0x85, 0x84, 0x4b, 0xe2, 0xa7, 0x36, 0x74, + 0xb8, 0xed, 0x28, 0x6d, 0xb3, 0x35, 0x37, 0x92, 0x7e, 0xb5, 0x67, 0x00, + 0x87, 0x16, 0xbc, 0x41, 0x08, 0x69, 0x07, 0xdd, 0x45, 0x0e, 0x91, 0xe9, + 0x5d, 0x9c, 0xed, 0x6c, 0xd3, 0x18, 0xd0, 0x8a, 0x0c, 0x45, 0x52, 0x54, + 0x2a, 0xa7, 0x3a, 0x0a, 0xe6, 0xe6, 0x5e, 0x19, 0xb8, 0xb4, 0xb5, 0xd9, + 0x8c, 0x7b, 0x76, 0x2d, 0xf7, 0x04, 0x0f, 0x29, 0x54, 0x29, 0xc3, 0x42, + 0x35, 0x9f, 0x52, 0x0d, 0x64, 0x35, 0xea, 0xb7, 0xfd, 0x4d, 0x63, 0x17, + 0x3f, 0xdc, 0x00, 0xc5, 0x01, 0x28, 0x4c, 0x34, 0xcc, 0x8c, 0xb2, 0x6b, + 0x68, 0xa7, 0x04, 0x2f, 0x36, 0xdd, 0xcd, 0xfa, 0xcd, 0x12, 0xc2, 0x93, + 0xd3, 0xf7, 0xfe, 0x91, 0xda, 0xad, 0x09, 0x2d, 0x93, 0x13, 0xbf, 0x5c, + 0xef, 0x10, 0x46, 0x11, 0x8c, 0x22, 0xb4, 0xcc, 0xf8, 0x01, 0x85, 0x79, + 0x98, 0x4c, 0x8b, 0xa7, 0x30, 0x07, 0x6a, 0x2f, 0x10, 0x5f, 0x1a, 0x72, + 0x7a, 0x69, 0xf6, 0xf6, 0x22, 0x87, 0x98, 0x31, 0x8d, 0xe3, 0x38, 0xf2, + 0xd7, 0x10, 0xfc, 0xe7, 0xa0, 0x2a, 0xdd, 0x5e, 0x4f, 0x30, 0x21, 0x5b, + 0x8c, 0x2d, 0x5f, 0xdb, 0x45, 0x66, 0xc2, 0x59, 0x56, 0x4a, 0x77, 0x13, + 0xef, 0xf3, 0xff, 0x61, 0x43, 0xaf, 0x4e, 0x29, 0xe2, 0xf9, 0x0d, 0xe2, + 0x21, 0x2b, 0x58, 0xea, 0x9e, 0x0d, 0xe1, 0xbc, 0x7b, 0xc2, 0x39, 0xdf, + 0xf5, 0xdb, 0x12, 0xfd, 0xc2, 0x1c, 0xf7, 0x2f, 0xdb, 0x5d, 0x41, 0x50, + 0xdc, 0xcb, 0x2b, 0x7e, 0xd0, 0x86, 0xef, 0x1a, 0xcb, 0x0e, 0x06, 0x2c, + 0x6d, 0x53, 0x09, 0xc7, 0x7b, 0x66, 0xa7, 0x49, 0x2a, 0xa3, 0x94, 0xe5, + 0x27, 0x16, 0x75, 0x8a, 0x9e, 0xec, 0x30, 0x22, 0x67, 0xe4, 0x6c, 0x19, + 0x70, 0xe4, 0x04, 0x7e, 0xbf, 0xe3, 0x45, 0x41, 0x63, 0x2e, 0x94, 0x22, + 0x5b, 0x98, 0xb7, 0xdf, 0x13, 0x67, 0x6a, 0x49, 0x1e, 0xa3, 0xbb, 0xb5, + 0x4d, 0x06, 0x08, 0x2a, 0x0f, 0xd3, 0xce, 0xbf, 0x61, 0x9d, 0x6d, 0xff, + 0x87, 0xcd, 0x3e, 0x6f, 0x1c, 0xd8, 0x77, 0x08, 0xcc, 0xe4, 0xae, 0x2d, + 0x32, 0x85, 0x60, 0xe0, 0xfa, 0xa2, 0x2d, 0x44, 0x14, 0xe8, 0x6b, 0x9f, + 0x73, 0xbd, 0x16, 0x43, 0xf0, 0x82, 0xdd, 0xaf, 0x56, 0xf0, 0x73, 0x87, + 0x4e, 0x39, 0x5a, 0xe7, 0xa5, 0x98, 0xfa, 0xf6, 0xa7, 0x55, 0xdf, 0xc3, + 0xbc, 0xa0, 0x69, 0x65, 0x05, 0xc2, 0xe9, 0x57, 0xba, 0x53, 0x84, 0x29, + 0x88, 0x3c, 0x5f, 0x33, 0x9c, 0xc4, 0xaf, 0xbd, 0x50, 0xcd, 0xf7, 0x25, + 0x9c, 0x6c, 0x53, 0xd7, 0x8f, 0x70, 0x55, 0x77, 0x72, 0xd6, 0xea, 0x0d, + 0x6b, 0x95, 0x55, 0x30, 0x92, 0x8d, 0x01, 0x79, 0xca, 0x3f, 0xe9, 0x87, + 0x7e, 0xd5, 0xcb, 0x0e, 0x30, 0xbd, 0x46, 0x03, 0x60, 0xd2, 0xef, 0x83, + 0x5b, 0x91, 0x20, 0x2d, 0x9c, 0xb9, 0xcf, 0x7e, 0xff, 0xa7, 0x41, 0x5b, + 0x6c, 0xcd, 0x56, 0x87, 0xf9, 0xb6, 0x32, 0x65, 0xf7, 0x19, 0xad, 0x8d, + 0x17, 0xeb, 0x98, 0xa0, 0x65, 0x7c, 0x60, 0xa1, 0x9a, 0x8f, 0x97, 0xc2, + 0x37, 0x9a, 0x43, 0x99, 0x00, 0xa7, 0x64, 0x0b, 0x23, 0x4a, 0x1b, 0xc0, + 0xf4, 0xb4, 0xc4, 0x2d, 0xdb, 0x69, 0xc3, 0x04, 0xbf, 0xb7, 0x70, 0xed, + 0x26, 0x9c, 0xcf, 0xa6, 0x7d, 0x23, 0xf3, 0x80, 0x75, 0x2b, 0x2c, 0xfe, + 0x7e, 0x99, 0x02, 0xf6, 0x87, 0xdc, 0x9a, 0xff, 0x7f, 0x5a, 0xed, 0x3c, + 0xa2, 0x05, 0x02, 0x84, 0x57, 0x4d, 0x52, 0xf1, 0xd2, 0xf5, 0xb2, 0x82, + 0x94, 0x43, 0xde, 0x9c, 0x63, 0x5c, 0x3b, 0xdd, 0x32, 0xe1, 0x8e, 0x6c, + 0x4c, 0xa1, 0x77, 0xbd, 0x60, 0xb5, 0x7f, 0x5c, 0xe8, 0xeb, 0x8a, 0xfb, + 0x04, 0xf9, 0x53, 0x37, 0x81, 0x62, 0xb4, 0xcc, 0x53, 0x29, 0x18, 0x62, + 0x99, 0x0f, 0x57, 0xcd, 0x2c, 0x92, 0x05, 0x39, 0x25, 0xb2, 0xa4, 0x16, + 0x88, 0xd3, 0x9b, 0x17, 0xcc, 0x83, 0xf9, 0xc9, 0xf2, 0xfb, 0xde, 0x98, + 0x59, 0xcd, 0x26, 0x59, 0xe8, 0xf6, 0x30, 0x2a, 0x1b, 0xa7, 0x6e, 0x1f, + 0xb0, 0x11, 0xdb, 0x51, 0xc9, 0xf7, 0xbc, 0x9a, 0x47, 0x50, 0x82, 0x3a, + 0xed, 0x1a, 0x37, 0x59, 0x22, 0x29, 0xe5, 0x65, 0x1f, 0x4f, 0xe8, 0xe0, + 0xe9, 0xea, 0xcf, 0x72, 0x6c, 0xea, 0x6b, 0x6e, 0xa9, 0x51, 0x97, 0x27, + 0x7d, 0x47, 0x47, 0xf8, 0x17, 0x88, 0x86, 0x55, 0xf3, 0x6c, 0x86, 0xbd, + 0x35, 0x69, 0x21, 0xfd, 0x92, 0x98, 0x2a, 0x32, 0x53, 0xc2, 0x47, 0x09, + 0x7e, 0xad, 0xfc, 0xb1, 0x49, 0x94, 0x30, 0xe0, 0x74, 0x55, 0x9c, 0x17, + 0x89, 0x03, 0x97, 0xfa, 0x01, 0x11, 0xa4, 0xf8, 0x28, 0xcf, 0x90, 0xc5, + 0xb4, 0xe6, 0x2e, 0xb0, 0x1e, 0xc4, 0xf8, 0xeb, 0x2f, 0x61, 0x57, 0x4d, + 0x39, 0x4c, 0x7b, 0xd1, 0xe4, 0x71, 0x04, 0xde, 0x07, 0x6f, 0x8b, 0x7e, + 0xdc, 0x88, 0x8f, 0xce, 0x67, 0x23, 0x82, 0x64, 0x7d, 0xcc, 0x3b, 0x60, + 0xb4, 0x50, 0x96, 0x71, 0x58, 0xa2, 0x97, 0xd8, 0x6e, 0x57, 0xa0, 0xe4, + 0xe2, 0x7c, 0x5f, 0x05, 0xd2, 0x2d, 0xbf, 0xbd, 0xc0, 0xb6, 0x1c, 0xff, + 0x03, 0x21, 0x3c, 0xff, 0x4e, 0x9b, 0x19, 0x23, 0x83, 0x37, 0x41, 0xd3, + 0xb2, 0x91, 0x67, 0xaf, 0xa0, 0xd1, 0x78, 0x63, 0x86, 0x5f, 0x88, 0xce, + 0x0c, 0xc4, 0x88, 0x3d, 0x33, 0xed, 0xd5, 0xc4, 0x74, 0x84, 0x1c, 0x46, + 0xea, 0x46, 0xc6, 0xf4, 0x6b, 0x2b, 0x1e, 0x66, 0xcf, 0xba, 0x92, 0xae, + 0xac, 0xa5, 0xed, 0x7d, 0x81, 0x97, 0xe0, 0xc7, 0x6e, 0x98, 0x98, 0x7e, + 0x22, 0xad, 0x33, 0x72, 0x0e, 0xc1, 0x0a, 0xe6, 0x4b, 0x5d, 0xc5, 0xa2, + 0xa1, 0xfe, 0xfe, 0x29, 0xb6, 0x56, 0x82, 0xd1, 0x81, 0x6a, 0x73, 0x5d, + 0x39, 0xd2, 0x22, 0x41, 0x2a, 0x90, 0x9c, 0x7f, 0x02, 0x6f, 0x66, 0xb8, + 0xb4, 0xa1, 0x3a, 0xbf, 0xe4, 0xd7, 0xcf, 0x87, 0x37, 0xf3, 0x36, 0x66, + 0x7c, 0x52, 0xa3, 0xa5, 0x2d, 0xdd, 0xa0, 0x82, 0xee, 0x68, 0xea, 0x58, + 0xef, 0x05, 0xe8, 0x4f, 0x01, 0xf5, 0x82, 0x98, 0x13, 0xf6, 0x67, 0x6f, + 0x66, 0x2f, 0x2c, 0xd9, 0xbd, 0x01, 0x40, 0x86, 0xe5, 0x52, 0xfa, 0x9d, + 0xca, 0xb6, 0x05, 0x13, 0x96, 0x62, 0x8f, 0xe1, 0x20, 0x34, 0xdc, 0x6f, + 0x8f, 0xdb, 0x4e, 0x0d, 0xac, 0x6c, 0x86, 0x05, 0x1d, 0x8f, 0x99, 0x1f, + 0xfd, 0x71, 0xb9, 0xfe, 0xa8, 0xd0, 0xd7, 0x6c, 0xb0, 0xda, 0x8b, 0xdb, + 0x97, 0x8a, 0xda, 0xda, 0x65, 0x3a, 0xa5, 0x12, 0x44, 0x35, 0x8d, 0xe5, + 0x71, 0xa1, 0xd8, 0x2d, 0x05, 0x0a, 0x97, 0x3a, 0x77, 0x36, 0xce, 0xfd, + 0x93, 0x29, 0x76, 0x73, 0x15, 0x2c, 0x2b, 0x70, 0xd8, 0x47, 0xeb, 0x68, + 0x66, 0xb3, 0x23, 0x17, 0x0b, 0x9a, 0xac, 0x2e, 0x4d, 0x6a, 0xaf, 0x75, + 0xa8, 0xa9, 0xbe, 0xe3, 0x02, 0xfe, 0x92, 0xe0, 0x25, 0x34, 0x00, 0xd0, + 0xa3, 0xaa, 0xd3, 0xc5, 0xf9, 0xf3, 0x79, 0x9c, 0x03, 0xf8, 0x02, 0xc4, + 0xcc, 0x0c, 0x0e, 0xca, 0x5d, 0x46, 0xb4, 0x8f, 0x20, 0xbc, 0x1f, 0x84, + 0x75, 0x5c, 0xe1, 0x15, 0x60, 0x6d, 0x0b, 0x94, 0x89, 0xdb, 0x23, 0x28, + 0xa0, 0x58, 0x7b, 0xaa, 0xf1, 0x17, 0x9e, 0x66, 0xd3, 0x84, 0x81, 0x04, + 0x24, 0xe9, 0xbc, 0x5f, 0xaf, 0xb2, 0xb2, 0x51, 0xf2, 0x8a, 0xee, 0x6d, + 0xc6, 0x27, 0x8d, 0x7b, 0xf4, 0xe4, 0x97, 0xc7, 0xda, 0x81, 0x09, 0xbe, + 0x4d, 0x76, 0xcb, 0xfa, 0x0f, 0x43, 0xf3, 0x86, 0x3f, 0x14, 0x9b, 0xe2, + 0x05, 0x3e, 0x50, 0xc5, 0x61, 0x23, 0x44, 0xb8, 0xa0, 0xc4, 0x69, 0x0f, + 0x42, 0x06, 0x31, 0xd9, 0xc1, 0x53, 0xc2, 0x17, 0x60, 0x63, 0xfb, 0x6b, + 0x45, 0x00, 0x3c, 0x22, 0x14, 0x17, 0x4f, 0x4d, 0xc6, 0x43, 0xc5, 0x42, + 0x76, 0x51, 0x14, 0x20, 0x6f, 0x51, 0xbb, 0x73, 0x5f, 0xf6, 0xee, 0xed, + 0x49, 0x8d, 0x1e, 0xff, 0x76, 0x74, 0x3f, 0x24, 0x1f, 0x91, 0xfd, 0xb8, + 0xb5, 0xd8, 0xa0, 0x4c, 0x8b, 0x8b, 0x22, 0x22, 0x4a, 0x29, 0x49, 0xd7, + 0xfa, 0xa1, 0xde, 0x44, 0x14, 0x61, 0x3e, 0xe4, 0x6b, 0x04, 0x4b, 0x66, + 0x94, 0x28, 0xe7, 0x29, 0x05, 0x78, 0xcb, 0x3f, 0x86, 0xf7, 0x7e, 0x6f, + 0xca, 0x6f, 0xfa, 0x87, 0xd6, 0xcc, 0x7d, 0x56, 0xcf, 0xb3, 0x69, 0x00, + 0x9f, 0x69, 0x69, 0x3f, 0x85, 0x62, 0x88, 0x1f, 0x4f, 0x1b, 0x52, 0xd6, + 0x09, 0x0a, 0x00, 0x9e, 0x67, 0x7d, 0x11, 0x64, 0x20, 0x45, 0xd6, 0x0b, + 0xbf, 0xda, 0xdd, 0x32, 0xa9, 0x6a, 0xa9, 0xf2, 0x7a, 0x0b, 0x99, 0xd9, + 0x4a, 0x5e, 0x63, 0x59, 0x81, 0x71, 0x26, 0x6e, 0x59, 0xe3, 0x6c, 0x9b, + 0xaa, 0x37, 0x45, 0xbb, 0xd6, 0x0d, 0x54, 0x58, 0x81, 0x0d, 0x65, 0x61, + 0x07, 0x66, 0x79, 0x9c, 0x64, 0xf7, 0x2d, 0xea, 0x90, 0x41, 0x06, 0x7a, + 0xeb, 0x0e, 0x71, 0xf5, 0x17, 0x1b, 0x9a, 0x8b, 0xf9, 0x8b, 0x40, 0x22, + 0x69, 0x1b, 0x28, 0xf1, 0x07, 0x73, 0xb4, 0x32, 0x53, 0x71, 0xa1, 0x45, + 0xae, 0x18, 0x5a, 0x82, 0x71, 0x6a, 0x37, 0xff, 0x03, 0x6b, 0x6e, 0x79, + 0xaf, 0xaa, 0x3a, 0xef, 0x4c, 0x33, 0xa7, 0x52, 0xbd, 0x24, 0x21, 0xf2, + 0x45, 0x0b, 0x30, 0x03, 0xe6, 0x27, 0x54, 0x6f, 0x2a, 0x0b, 0x5c, 0x86, + 0x37, 0x64, 0x79, 0xa2, 0xf9, 0x35, 0xcb, 0xec, 0x04, 0xee, 0x9d, 0x56, + 0x2a, 0x74, 0x14, 0x91, 0xd2, 0x5f, 0x89, 0x1f, 0x29, 0x19, 0x14, 0xa3, + 0x70, 0x3a, 0xc3, 0x3b, 0x48, 0x45, 0x4d, 0xc8, 0x53, 0x36, 0x1c, 0x11, + 0xe9, 0x20, 0xbf, 0x24, 0x65, 0xb8, 0x2e, 0x3d, 0xf2, 0xca, 0x34, 0x8d, + 0x95, 0x1a, 0x4a, 0xb3, 0x5f, 0xbb, 0xaa, 0x38, 0xaa, 0xd4, 0xcd, 0x68, + 0x06, 0x5f, 0xa2, 0x8f, 0x02, 0xf3, 0x64, 0x35, 0x5b, 0x79, 0xf1, 0x02, + 0x07, 0x48, 0x97, 0xa1, 0x3d, 0xcb, 0xe5, 0xe8, 0x60, 0x98, 0x2a, 0xc8, + 0x6f, 0x9c, 0xe8, 0xec, 0xc5, 0x22, 0xc4, 0xa2, 0xb4, 0x96, 0x0a, 0xe4, + 0x00, 0x85, 0xfc, 0x6a, 0x23, 0x9f, 0xda, 0x57, 0xd0, 0xc1, 0xc0, 0x9d, + 0x6d, 0xe6, 0x09, 0xba, 0xd2, 0x55, 0x91, 0xe3, 0x49, 0x9b, 0x90, 0x1d, + 0x3e, 0x2a, 0x7d, 0x91, 0xa1, 0xc7, 0x14, 0x27, 0x9c, 0x77, 0xc9, 0x2e, + 0x50, 0x9f, 0x2b, 0x3c, 0x1e, 0x1b, 0x5a, 0xac, 0x86, 0xe1, 0xc5, 0xc6, + 0x51, 0x6a, 0x54, 0x2b, 0x3b, 0x79, 0xec, 0xc9, 0xc5, 0x8e, 0x5e, 0x04, + 0xa8, 0x0d, 0xe0, 0x75, 0xb1, 0xbb, 0x7b, 0x31, 0xaa, 0xf9, 0xad, 0x9f, + 0x0d, 0x41, 0xc7, 0xe8, 0xf7, 0x19, 0xc1, 0x7b, 0x33, 0x7a, 0x76, 0x39, + 0x6f, 0x81, 0x58, 0x92, 0xb7, 0xac, 0x70, 0x89, 0xc3, 0x3e, 0x01, 0xdc, + 0x92, 0xaf, 0xf4, 0x46, 0xf3, 0x00, 0x1e, 0x45, 0x1d, 0xf7, 0x5a, 0xad, + 0x2a, 0x22, 0xaa, 0x34, 0x13, 0x8e, 0xf2, 0xb4, 0xff, 0xb2, 0x08, 0x45, + 0x07, 0x22, 0xed, 0x37, 0x24, 0x42, 0x78, 0x88, 0x28, 0x73, 0x7a, 0xb6, + 0xa2, 0x6a, 0xb8, 0x8c, 0x48, 0x2c, 0x7c, 0x13, 0xc8, 0x1c, 0xd5, 0x61, + 0xa2, 0x89, 0xaf, 0x1c, 0x41, 0x1e, 0xf0, 0x01, 0x0e, 0x89, 0xbb, 0x20, + 0xd1, 0xb9, 0xe1, 0x43, 0x47, 0x17, 0xf3, 0x29, 0xc0, 0x22, 0xdb, 0xcf, + 0x15, 0x84, 0x8d, 0x94, 0xe6, 0xe9, 0x92, 0x13, 0x44, 0xa1, 0xcd, 0xcf, + 0x50, 0xb7, 0x5d, 0xa7, 0xb1, 0x38, 0x49, 0x48, 0xb1, 0xf3, 0x63, 0xb8, + 0x9f, 0x12, 0x08, 0xce, 0xc6, 0x41, 0x5c, 0x82, 0x3a, 0xfb, 0x7e, 0xe3, + 0x06, 0x5e, 0xfa, 0x85, 0x0c, 0xd0, 0x08, 0xe9, 0xb1, 0x4d, 0xd7, 0x4f, + 0xf4, 0x9f, 0x6e, 0x05, 0x75, 0x47, 0xd8, 0xd1, 0xa3, 0xc7, 0x72, 0xbe, + 0x8e, 0x80, 0x51, 0x85, 0x80, 0xc8, 0xc0, 0xf1, 0x44, 0xe7, 0xd7, 0x20, + 0xf1, 0x23, 0x67, 0xde, 0xfa, 0x4c, 0xaf, 0x91, 0x0a, 0x7b, 0x2e, 0x02, + 0x01, 0x24, 0xa1, 0x88, 0x08, 0xaa, 0xf3, 0x33, 0x60, 0xec, 0xde, 0x71, + 0x0f, 0x20, 0x54, 0x33, 0x1c, 0xa1, 0xb0, 0x4d, 0x30, 0xed, 0xbe, 0x00, + 0xda, 0xd6, 0x97, 0x57, 0xe2, 0xc8, 0x0c, 0x10, 0xd1, 0x7e, 0x9c, 0x8c, + 0x7a, 0xbb, 0x9f, 0xdf, 0x66, 0xab, 0xc5, 0x3e, 0x67, 0x52, 0xfa, 0xce, + 0x47, 0x20, 0xf4, 0x6a, 0xed, 0x47, 0x3d, 0x26, 0xb1, 0x13, 0x1a, 0x15, + 0xa3, 0xaf, 0xda, 0x74, 0xf2, 0x6a, 0x47, 0xf7, 0xbd, 0x7e, 0x3e, 0x4b, + 0x68, 0x27, 0x4e, 0xf7, 0x10, 0xee, 0x4e, 0x80, 0xab, 0xf3, 0x45, 0x67, + 0xbf, 0xe2, 0x89, 0x19, 0xa4, 0x07, 0x11, 0x9a, 0xc6, 0x62, 0xa0, 0x85, + 0xa1, 0x07, 0x09, 0x4f, 0xa3, 0xe8, 0xd7, 0x68, 0xd6, 0x62, 0xee, 0x61, + 0x80, 0xb8, 0xd0, 0x94, 0x65, 0x23, 0x97, 0x89, 0xf9, 0x39, 0x85, 0xd6, + 0x0e, 0x6a, 0x56, 0x14, 0x10, 0x54, 0x63, 0xec, 0x3a, 0xa7, 0x16, 0x98, + 0x73, 0x0f, 0x46, 0x8b, 0x70, 0x5f, 0x6f, 0x72, 0x38, 0x77, 0xc6, 0x61, + 0x5e, 0x02, 0x56, 0x3d, 0x81, 0x8c, 0x0f, 0xc9, 0x29, 0x30, 0xe2, 0xd0, + 0x86, 0xc9, 0xf0, 0xd7, 0x77, 0xdc, 0x93, 0x05, 0xf6, 0x0a, 0xd3, 0x3d, + 0x94, 0xcf, 0x02, 0x11, 0x9f, 0xb6, 0xe2, 0xe6, 0x1c, 0xf9, 0xea, 0xea, + 0x37, 0xd5, 0xdc, 0xba, 0x3f, 0x39, 0xf0, 0x7d, 0x21, 0xeb, 0xb4, 0x94, + 0xed, 0x96, 0x40, 0x8d, 0x51, 0x86, 0x38, 0x78, 0x82, 0x11, 0x35, 0xef, + 0x19, 0x17, 0x46, 0x9f, 0x00, 0x35, 0xc0, 0x77, 0xe4, 0x6e, 0xca, 0x4f, + 0x00, 0x44, 0xe1, 0xf5, 0xe5, 0x4f, 0xa8, 0x86, 0xe0, 0x11, 0xa8, 0x0a, + 0x19, 0xd8, 0x2a, 0xfd, 0x89, 0xfd, 0x65, 0x3d, 0x04, 0xbf, 0x58, 0x4e, + 0x9d, 0x9f, 0x30, 0x04, 0xdf, 0xd1, 0x5e, 0x33, 0x59, 0xc0, 0x0a, 0x74, + 0xec, 0xc2, 0x9e, 0xcf, 0x53, 0x07, 0x60, 0x3b, 0x13, 0x6d, 0x32, 0x3e, + 0x0a, 0x29, 0xa5, 0xf2, 0x92, 0xd8, 0x40, 0xe1, 0xa8, 0xc6, 0x7a, 0xc1, + 0x55, 0x2e, 0x12, 0xe8, 0x03, 0x09, 0x0a, 0x88, 0x71, 0x82, 0xb6, 0xe9, + 0x23, 0xa4, 0xb1, 0x29, 0xa0, 0x15, 0x07, 0x83, 0xf7, 0xa0, 0xa8, 0xe2, + 0xbf, 0x51, 0x77, 0x11, 0x53, 0x69, 0xb2, 0x35, 0xc2, 0x62, 0x97, 0x18, + 0x5c, 0x2e, 0x21, 0xcb, 0xf3, 0xe1, 0x6f, 0x24, 0x6f, 0xb8, 0x6a, 0xfa, + 0x90, 0x4c, 0xc0, 0x1c, 0xd6, 0x79, 0x9d, 0xad, 0x1d, 0xbe, 0x11, 0x53, + 0x0d, 0x14, 0xfb, 0xba, 0x78, 0x75, 0x22, 0x04, 0x17, 0xd0, 0x04, 0xdb, + 0xac, 0xa6, 0xb8, 0xef, 0x74, 0xf5, 0x19, 0x43, 0xeb, 0xe5, 0xc7, 0xcc, + 0x97, 0xf4, 0x11, 0x04, 0xcf, 0x01, 0xf2, 0x71, 0x9f, 0x10, 0xf4, 0x79, + 0x09, 0x62, 0x1a, 0xe2, 0x66, 0x0f, 0x4e, 0x81, 0x71, 0xec, 0x91, 0x62, + 0xa8, 0x96, 0x84, 0xc0, 0x9a, 0x25, 0x30, 0x3f, 0x84, 0x48, 0x80, 0xf9, + 0xcc, 0x50, 0xa3, 0xd3, 0x96, 0x30, 0x08, 0xd1, 0xac, 0x2d, 0x57, 0x00, + 0x47, 0x1b, 0xfe, 0x90, 0x9d, 0xb7, 0x48, 0x9c, 0xe0, 0xf2, 0x69, 0x71, + 0x0a, 0x25, 0x78, 0x90, 0x79, 0xd8, 0x8c, 0xfe, 0x64, 0xcf, 0xc6, 0x36, + 0x07, 0x28, 0x04, 0xd2, 0x2a, 0xaa, 0x03, 0x53, 0x9b, 0x34, 0x1c, 0x47, + 0x3e, 0x94, 0x82, 0x9b, 0x4a, 0x98, 0x1e, 0x71, 0x4c, 0x9a, 0x72, 0xc4, + 0x60, 0x29, 0x91, 0x23, 0x06, 0x81, 0x38, 0x35, 0xe1, 0xa5, 0xd5, 0x41, + 0x47, 0xbf, 0xcc, 0x39, 0xa6, 0xe5, 0x7e, 0x9d, 0x98, 0x50, 0xb8, 0xe3, + 0x1c, 0x5d, 0x26, 0x35, 0xf4, 0x01, 0x42, 0x40, 0x14, 0x0d, 0xe6, 0x63, + 0xad, 0x50, 0x82, 0x82, 0xec, 0xaf, 0x22, 0x92, 0x52, 0x66, 0xdd, 0x84, + 0x9f, 0xf2, 0xfa, 0xa5, 0x74, 0xce, 0x49, 0xeb, 0x05, 0x5b, 0xa2, 0x94, + 0x8f, 0x2b, 0x37, 0xc9, 0xdb, 0x47, 0xf8, 0xbd, 0xe9, 0x65, 0x2b, 0x8a, + 0x7e, 0xbf, 0xf2, 0x96, 0x25, 0x9b, 0x56, 0xbc, 0xc5, 0xc0, 0x0c, 0x0d, + 0xf0, 0xa9, 0xca, 0x4e, 0x5f, 0x75, 0x5c, 0x64, 0xec, 0xcb, 0xc1, 0xc9, + 0x61, 0x75, 0xa3, 0xbc, 0x37, 0x5f, 0x5b, 0x5d, 0x9b, 0xe7, 0xa2, 0xaf, + 0x46, 0x28, 0xa6, 0x91, 0x58, 0xef, 0xba, 0x09, 0xf3, 0x18, 0x4a, 0xb1, + 0x18, 0xfe, 0xe4, 0x23, 0xf1, 0x29, 0x44, 0xc8, 0x5c, 0x17, 0x13, 0x8e, + 0xf1, 0x56, 0x41, 0xbb, 0xfc, 0xce, 0x7e, 0x56, 0x7c, 0xb3, 0x2b, 0x02, + 0xa5, 0x3f, 0x47, 0x28, 0x95, 0x91, 0xa7, 0xe3, 0xb2, 0xbd, 0x4f, 0x59, + 0xd4, 0x03, 0xa7, 0x87, 0xa9, 0x15, 0x0c, 0xe7, 0xb7, 0xff, 0x1a, 0x71, + 0xcb, 0xb0, 0x6c, 0xcf, 0x2e, 0x43, 0x6e, 0xb1, 0xa6, 0x7b, 0xf8, 0xe5, + 0xc3, 0xf1, 0xb6, 0xf3, 0x49, 0x4e, 0x36, 0xe5, 0x3e, 0x03, 0x86, 0x9f, + 0x54, 0xd2, 0x1c, 0xc6, 0x36, 0xd5, 0x78, 0xb8, 0x42, 0x5f, 0xc9, 0x7d, + 0x31, 0x58, 0xf8, 0xc9, 0x97, 0xef, 0xbf, 0x29, 0x20, 0x7c, 0x80, 0xcf, + 0x19, 0x5b, 0x4a, 0xaa, 0x26, 0x31, 0x9f, 0xeb, 0x55, 0x55, 0x79, 0x0e, + 0x70, 0x06, 0xc4, 0xd1, 0xd8, 0xa3, 0xbf, 0xdf, 0xd6, 0x6c, 0xea, 0xcc, + 0xf3, 0x65, 0xc4, 0xb2, 0xea, 0x64, 0xf9, 0x43, 0x49, 0xe8, 0xb1, 0xca, + 0xd5, 0x1b, 0xb9, 0x1a, 0x2f, 0x4c, 0xb6, 0x15, 0xe1, 0x45, 0x77, 0xce, + 0xab, 0xcb, 0x33, 0x99, 0xef, 0x70, 0x26, 0x36, 0x40, 0x99, 0x30, 0x0f, + 0x7b, 0xf5, 0xea, 0x0a, 0xed, 0x41, 0x01, 0x99, 0x0b, 0xc4, 0x97, 0x0d, + 0xe3, 0x57, 0xcd, 0xbd, 0x90, 0xa3, 0x7d, 0x68, 0xe2, 0x6b, 0x2a, 0xca, + 0xe7, 0x4a, 0x6a, 0x07, 0xe2, 0xb5, 0x2f, 0x53, 0x03, 0x50, 0x04, 0xd1, + 0xaa, 0xb8, 0x80, 0x2a, 0x4a, 0x2c, 0x2c, 0x80, 0x45, 0x2e, 0x9f, 0x8c, + 0x9c, 0xf4, 0x00, 0x9a, 0x1d, 0xd9, 0x6e, 0x42, 0x79, 0x0d, 0x6a, 0x01, + 0x6b, 0xc2, 0x27, 0xc2, 0x16, 0xfb, 0x7d, 0x62, 0xc1, 0x09, 0x36, 0xf8, + 0x27, 0xc1, 0x20, 0x40, 0x91, 0x8f, 0x33, 0x6e, 0x40, 0x25, 0x20, 0xfa, + 0x75, 0x30, 0xb6, 0xfd, 0x92, 0xcb, 0xaa, 0xbd, 0x94, 0x49, 0xd9, 0x68, + 0x73, 0x12, 0x6a, 0x26, 0xc4, 0xe8, 0x5a, 0x5c, 0xc0, 0x82, 0x5e, 0xe7, + 0xa3, 0xef, 0x76, 0x4c, 0xd6, 0x3f, 0xd6, 0xfd, 0xb9, 0x1e, 0x7c, 0x26, + 0xbc, 0x58, 0xa3, 0x3a, 0x5e, 0xfa, 0xe9, 0x93, 0xbe, 0xaf, 0x99, 0x37, + 0x52, 0xbc, 0x5a, 0xfb, 0x86, 0xad, 0x8f, 0x3d, 0xcf, 0x47, 0xb6, 0xf4, + 0xa7, 0x61, 0x95, 0xd5, 0x86, 0xa0, 0x68, 0x02, 0x3b, 0x6e, 0xd5, 0x17, + 0x0f, 0x85, 0xb5, 0x24, 0xe6, 0xc0, 0x4d, 0xdc, 0x3e, 0x85, 0x7c, 0x82, + 0x9b, 0xf3, 0xf0, 0xb3, 0x43, 0xc1, 0xdf, 0x9c, 0x17, 0x59, 0x6d, 0xf3, + 0x6c, 0x4d, 0xd9, 0x82, 0x5c, 0x0c, 0x36, 0x1a, 0xbd, 0xe7, 0x65, 0x60, + 0x5f, 0xba, 0xec, 0x2f, 0xd8, 0x08, 0x36, 0x9d, 0x5e, 0x78, 0x80, 0x3b, + 0x8a, 0x18, 0x76, 0x89, 0xc5, 0x22, 0x4d, 0xc7, 0x02, 0x8b, 0x18, 0x85, + 0x5e, 0xdd, 0xa0, 0x9d, 0x2d, 0x0a, 0x17, 0xe8, 0xf3, 0x5d, 0x5d, 0xe1, + 0xa0, 0x2e, 0x3c, 0x0a, 0x6a, 0x15, 0x60, 0xdc, 0x1f, 0xc8, 0x38, 0x48, + 0x03, 0x0a, 0x63, 0xfe, 0x14, 0xb2, 0xfb, 0x3e, 0xfd, 0x36, 0x16, 0x6d, + 0xec, 0x60, 0x42, 0xfa, 0xbc, 0x5e, 0x3e, 0x13, 0x05, 0x01, 0x34, 0x59, + 0x46, 0x44, 0xbf, 0xf4, 0x2b, 0x12, 0x7e, 0x15, 0x8a, 0x75, 0x72, 0x39, + 0x85, 0xe2, 0x0b, 0x8e, 0x96, 0x8d, 0x93, 0xaa, 0x6f, 0x75, 0x15, 0xa4, + 0xb8, 0xa8, 0x87, 0x79, 0x35, 0xf2, 0xd6, 0xf5, 0x56, 0x03, 0xe7, 0xfd, + 0x58, 0xe1, 0xfc, 0xc4, 0xd5, 0x79, 0x09, 0x59, 0x68, 0x8a, 0x17, 0xbe, + 0x8b, 0x52, 0xdd, 0x21, 0xd4, 0xf4, 0xe3, 0xeb, 0x6a, 0x2e, 0x9b, 0x53, + 0xdf, 0x55, 0x0d, 0x98, 0xdd, 0x1d, 0x04, 0xbf, 0x9e, 0x16, 0xf9, 0xdc, + 0x0a, 0x16, 0x1f, 0x37, 0xd9, 0xf6, 0xdc, 0xf7, 0x3b, 0x98, 0x32, 0xe6, + 0x41, 0x97, 0x4a, 0x80, 0x3f, 0x81, 0x19, 0x06, 0xc1, 0xd7, 0x91, 0xa8, + 0xd7, 0x5e, 0x83, 0x1a, 0x9f, 0x08, 0xe7, 0x0a, 0x3b, 0xb3, 0x76, 0x98, + 0x33, 0x0d, 0xae, 0xb8, 0x55, 0xfc, 0xb0, 0x14, 0xa2, 0xed, 0xeb, 0xc4, + 0x06, 0xb7, 0xbc, 0x63, 0x89, 0xa3, 0xbf, 0xcf, 0x82, 0x70, 0x62, 0x89, + 0x51, 0xcb, 0xaa, 0xf2, 0xab, 0x77, 0x32, 0x9a, 0xde, 0x4b, 0x7c, 0x60, + 0xe5, 0xe0, 0x97, 0x3d, 0x83, 0xae, 0xe1, 0x25, 0xac, 0xa2, 0x59, 0x9d, + 0xec, 0xe7, 0x16, 0xa5, 0x39, 0x24, 0xa6, 0x4b, 0x75, 0x01, 0x4e, 0xfb, + 0x52, 0x35, 0x19, 0x6c, 0x27, 0x27, 0x46, 0x2f, 0xe1, 0x5b, 0xbe, 0x7e, + 0x52, 0x31, 0x2a, 0x0e, 0xc6, 0x88, 0x86, 0x7f, 0x59, 0x8f, 0xf1, 0xaa, + 0xfd, 0x82, 0xfb, 0xa0, 0xba, 0x46, 0x43, 0x7d, 0xb1, 0x21, 0xaf, 0x92, + 0x36, 0x44, 0x49, 0x12, 0xdf, 0xeb, 0x3b, 0x30, 0x2f, 0x9e, 0xd2, 0x6e, + 0xc9, 0xde, 0x4a, 0x36, 0xb6, 0x8e, 0xc9, 0x6c, 0x72, 0x9c, 0xbe, 0x2d, + 0x6e, 0x0c, 0x45, 0x10, 0xc3, 0xa2, 0xc1, 0x00, 0x9c, 0xf7, 0xb5, 0xc7, + 0xf9, 0xcf, 0xea, 0xb5, 0xaf, 0x04, 0x28, 0xb9, 0x5a, 0xd6, 0xba, 0x4c, + 0x14, 0xcb, 0xa7, 0xb0, 0xed, 0x46, 0x2c, 0xf7, 0xd1, 0x28, 0x4a, 0xbd, + 0x4f, 0xb4, 0xbb, 0x90, 0x47, 0xb0, 0xa0, 0x31, 0xdf, 0xd4, 0x76, 0x51, + 0x3f, 0xfa, 0xc3, 0x59, 0xe3, 0x47, 0xae, 0x16, 0xe2, 0xab, 0x6c, 0xe0, + 0xb1, 0x58, 0x0a, 0x70, 0x8f, 0xf7, 0xf5, 0x2c, 0x7c, 0x26, 0xd7, 0xac, + 0xb0, 0xfb, 0xe7, 0x70, 0x19, 0x8f, 0x51, 0x82, 0x9a, 0x94, 0x53, 0x19, + 0x00, 0x56, 0x79, 0x8c, 0xf0, 0xe3, 0x25, 0xe3, 0x97, 0xa9, 0x07, 0x1a, + 0xc2, 0xcf, 0x2b, 0xaa, 0xa0, 0xef, 0x13, 0x2d, 0x47, 0xff, 0x9e, 0xf0, + 0xca, 0x2f, 0x3c, 0xb8, 0x18, 0x80, 0x79, 0x3c, 0x3d, 0xb2, 0x26, 0x07, + 0x27, 0x4c, 0x76, 0xb1, 0x9a, 0x2b, 0xf1, 0xff, 0xce, 0x5c, 0x6a, 0xd1, + 0xa9, 0x5f, 0x04, 0x5b, 0xb1, 0x05, 0x85, 0xdd, 0x0f, 0x03, 0xb1, 0x0a, + 0x7d, 0x7f, 0xef, 0x78, 0xb7, 0xe0, 0xbb, 0xae, 0xc5, 0x2d, 0x0e, 0xf4, + 0x13, 0x45, 0x4f, 0x25, 0xb1, 0x86, 0xb6, 0x6b, 0x24, 0x68, 0x42, 0x4f, + 0x32, 0x93, 0x18, 0xdb, 0x2b, 0x4e, 0x86, 0x59, 0x11, 0x56, 0x15, 0xae, + 0x72, 0x1c, 0x13, 0x07, 0x30, 0xfc, 0x37, 0xd6, 0x90, 0x71, 0x4f, 0xbf, + 0x4c, 0xef, 0xf1, 0x46, 0xd0, 0x85, 0xb3, 0xb4, 0x25, 0xf5, 0x67, 0xb3, + 0xae, 0x21, 0x16, 0xb0, 0xe0, 0xe7, 0x7d, 0x7e, 0xaf, 0x67, 0x5b, 0x54, + 0xf1, 0x69, 0xa0, 0x7d, 0xba, 0x8b, 0x93, 0xbf, 0x36, 0x66, 0x75, 0x4f, + 0x22, 0x8d, 0xa8, 0xe9, 0x73, 0x68, 0x26, 0xf6, 0x01, 0xbe, 0x26, 0x12, + 0x1d, 0xab, 0xf1, 0x25, 0xc6, 0x16, 0x4e, 0xbc, 0x1e, 0x09, 0x56, 0x44, + 0x59, 0xfa, 0x5b, 0xff, 0x96, 0xc1, 0xca, 0x55, 0xe0, 0x78, 0xfb, 0x26, + 0x15, 0x8d, 0x87, 0x8d, 0xa0, 0xcb, 0x77, 0x68, 0xb6, 0xf9, 0x01, 0x3b, + 0x4d, 0x28, 0x1f, 0x58, 0x0f, 0x79, 0xb3, 0x49, 0xd5, 0x76, 0x80, 0x3e, + 0x26, 0xaa, 0xea, 0x32, 0xff, 0xeb, 0x0b, 0xdc, 0xf2, 0xa8, 0x0b, 0xa5, + 0xf4, 0xa6, 0x83, 0xbe, 0x7e, 0xd7, 0x8a, 0x1f, 0xea, 0xc8, 0xcc, 0x82, + 0xb4, 0x60, 0x90, 0x7c, 0xfa, 0x93, 0x92, 0xaa, 0x04, 0xd5, 0x06, 0xa9, + 0xdb, 0x7a, 0x68, 0x89, 0x11, 0x23, 0x9a, 0xd1, 0x77, 0x79, 0x04, 0x01, + 0xf2, 0x2c, 0x70, 0x2b, 0x1d, 0xbc, 0xe3, 0xbe, 0x08, 0xf5, 0x33, 0x15, + 0x35, 0x62, 0x5b, 0x78, 0x9a, 0x3a, 0x6b, 0xc9, 0xc3, 0x20, 0xfa, 0x2a, + 0xd6, 0xf8, 0xbd, 0xd9, 0xbe, 0x34, 0x93, 0x69, 0xcc, 0xa4, 0x4b, 0x71, + 0xe3, 0xcd, 0x70, 0x94, 0xcb, 0xe9, 0xf1, 0x86, 0xc4, 0x4c, 0xa0, 0x6c, + 0x2f, 0x69, 0x93, 0x32, 0xbc, 0x0b, 0x97, 0x79, 0x31, 0x81, 0x9f, 0x23, + 0x1d, 0x1d, 0xf5, 0x2b, 0xa4, 0x81, 0x8a, 0xf0, 0x71, 0xc3, 0x7c, 0x4d, + 0x2b, 0x6d, 0x49, 0x87, 0x3d, 0x50, 0xa4, 0xe2, 0xd7, 0x38, 0x53, 0x69, + 0x0b, 0x8e, 0xaf, 0x02, 0x52, 0x55, 0xd9, 0x4a, 0xe0, 0x06, 0x7e, 0x19, + 0x6d, 0x7f, 0xd7, 0x20, 0x2d, 0xc7, 0xd7, 0x58, 0xda, 0x1c, 0x08, 0xa1, + 0x1c, 0x68, 0x1a, 0xb6, 0x27, 0x4b, 0x9d, 0x84, 0xc8, 0x5c, 0xd9, 0x9b, + 0x4a, 0x02, 0xf2, 0x0f, 0x4e, 0xaf, 0xe8, 0x1b, 0xc2, 0x46, 0x01, 0x14, + 0xfb, 0x81, 0x7e, 0x81, 0xa2, 0x24, 0x15, 0xa9, 0xc7, 0x36, 0xef, 0x18, + 0x68, 0x9c, 0xc2, 0x80, 0xa8, 0xfd, 0x3d, 0x0f, 0x31, 0x85, 0xa6, 0xd4, + 0x35, 0xe4, 0x03, 0xbd, 0x60, 0x25, 0xbf, 0x92, 0xb8, 0x7d, 0x62, 0x93, + 0xb2, 0x16, 0xab, 0x93, 0x28, 0x87, 0x0d, 0x64, 0x21, 0x64, 0x19, 0x1f, + 0x17, 0xff, 0x8f, 0xb5, 0x9c, 0x10, 0xc6, 0x64, 0x3e, 0x55, 0x8e, 0xe6, + 0x01, 0xe0, 0xcc, 0x1f, 0x1a, 0x47, 0x06, 0x30, 0xa9, 0x27, 0x36, 0x5e, + 0xb5, 0xef, 0xf0, 0x98, 0x5e, 0x1e, 0x8a, 0xb0, 0x8e, 0xde, 0xd0, 0xd7, + 0x0e, 0x7f, 0x6c, 0xdf, 0xf3, 0x06, 0x04, 0x3f, 0xae, 0x23, 0x32, 0x2d, + 0x6b, 0xb9, 0x54, 0x48, 0x2a, 0x43, 0xc3, 0x5a, 0xbe, 0x3c, 0x6d, 0x9a, + 0x23, 0x40, 0x65, 0xeb, 0x28, 0xbf, 0x61, 0x4e, 0x9c, 0x16, 0x28, 0x1a, + 0x6b, 0xfa, 0x89, 0x0e, 0xf9, 0xb1, 0x8d, 0x5b, 0xd9, 0x08, 0xa2, 0x60, + 0xb1, 0xf9, 0xb1, 0x41, 0x61, 0xd2, 0x59, 0x46, 0xc9, 0x4c, 0xf2, 0xe7, + 0x33, 0xe2, 0x84, 0x3e, 0xbf, 0x30, 0x15, 0x83, 0xf3, 0x11, 0xb3, 0x12, + 0xf6, 0x0f, 0xcd, 0x5f, 0x8e, 0x09, 0xe7, 0xb6, 0x46, 0xa3, 0x44, 0xdf, + 0x94, 0xd8, 0x25, 0xc5, 0xc9, 0xe3, 0xec, 0x1f, 0xf8, 0x40, 0x1b, 0x25, + 0x4e, 0xf7, 0x5f, 0x76, 0xb0, 0x66, 0x8f, 0xbd, 0xbd, 0xf7, 0xe2, 0x91, + 0xff, 0x5d, 0xc0, 0x24, 0xd4, 0xbe, 0xec, 0x3c, 0x2f, 0x8e, 0x8a, 0xd9, + 0x3f, 0x88, 0x6e, 0xf9, 0xf8, 0x53, 0x42, 0xa7, 0x57, 0xae, 0x95, 0xc7, + 0xf7, 0xd2, 0xd8, 0x35, 0x4c, 0xf9, 0x11, 0x9b, 0x15, 0xa9, 0x7f, 0x5f, + 0x63, 0xfc, 0xc2, 0x22, 0xef, 0xf7, 0x58, 0x66, 0xbe, 0xd5, 0x90, 0xd5, + 0x7d, 0xd4, 0x3f, 0x6c, 0xf8, 0x36, 0x5d, 0xc4, 0x7b, 0x11, 0x9a, 0x11, + 0xb9, 0x08, 0xae, 0x3a, 0xb6, 0x2d, 0x11, 0x3f, 0x0d, 0x60, 0x13, 0xb6, + 0xad, 0xc3, 0xf3, 0xb3, 0x3a, 0x70, 0xe5, 0x4f, 0x98, 0x9f, 0x38, 0xa5, + 0xb7, 0xb7, 0xa8, 0xdd, 0x35, 0x6d, 0x2b, 0x6b, 0xc6, 0xa1, 0x9c, 0x64, + 0xee, 0xee, 0x15, 0x6e, 0x8a, 0x8b, 0x68, 0xed, 0x47, 0x7c, 0xb3, 0xe8, + 0xde, 0x79, 0x3f, 0x68, 0xc6, 0x28, 0x91, 0xf4, 0xae, 0xa8, 0x3f, 0xbc, + 0xc1, 0xa3, 0xbb, 0x46, 0x8f, 0x0e, 0xbb, 0xf7, 0xf0, 0x31, 0x5b, 0x47, + 0x57, 0xc3, 0xbc, 0x25, 0x46, 0xb2, 0x23, 0x11, 0x0d, 0x38, 0x2d, 0x3e, + 0x00, 0xdb, 0x5c, 0x7c, 0x6b, 0x6d, 0x26, 0xbe, 0x2e, 0x5f, 0x92, 0x20, + 0x25, 0x7d, 0x1c, 0x8c, 0xf5, 0x47, 0x81, 0xca, 0x34, 0x68, 0x0d, 0xe2, + 0x47, 0x29, 0x8f, 0xa2, 0xb9, 0x7a, 0xd4, 0x1d, 0x0d, 0x7e, 0x5d, 0x1f, + 0x55, 0xb1, 0xc3, 0x14, 0x9e, 0x74, 0x6d, 0x00, 0x6b, 0xb3, 0x68, 0xbe, + 0x12, 0x15, 0x39, 0x97, 0x1f, 0x8a, 0xc2, 0xd8, 0xc3, 0xf5, 0x39, 0x96, + 0x78, 0x34, 0x37, 0xc5, 0xbe, 0xa0, 0xca, 0x6e, 0xc2, 0x3f, 0xc0, 0x36, + 0x60, 0xca, 0x74, 0x77, 0x49, 0x19, 0x9e, 0x36, 0xff, 0x12, 0xa8, 0x32, + 0x0c, 0x46, 0x32, 0xf6, 0x73, 0xbc, 0x13, 0x2d, 0xb1, 0xf0, 0xa4, 0x50, + 0xb0, 0xdd, 0x36, 0xb9, 0xa1, 0x4f, 0xf0, 0x70, 0x8d, 0x81, 0xfb, 0x44, + 0x3c, 0x8d, 0xc0, 0xd3, 0xd7, 0x52, 0x11, 0x4e, 0x85, 0xf2, 0xac, 0x04, + 0x7c, 0x7c, 0xfa, 0x89, 0x49, 0xd7, 0xf8, 0x91, 0x1b, 0xa0, 0x23, 0x9a, + 0x06, 0xaa, 0x57, 0xf5, 0x49, 0x52, 0xc9, 0x70, 0x44, 0xff, 0x20, 0xad, + 0xa6, 0xce, 0xdb, 0x2f, 0x03, 0xc5, 0xba, 0xc1, 0x18, 0x97, 0xdb, 0x6b, + 0xb0, 0xbd, 0x5a, 0xa9, 0xa0, 0x0e, 0x5e, 0x85, 0x2f, 0x67, 0x35, 0xdb, + 0x60, 0xaa, 0x59, 0x56, 0xf4, 0x5b, 0x11, 0x56, 0x83, 0x18, 0xc0, 0x82, + 0xcb, 0x76, 0xd9, 0x2d, 0xa9, 0xbf, 0xb3, 0x0f, 0x6c, 0x24, 0xc8, 0xcf, + 0xd8, 0x12, 0xf1, 0x6b, 0x3c, 0x79, 0x20, 0x11, 0x18, 0x09, 0xfc, 0x98, + 0x68, 0xfe, 0x5e, 0xe3, 0x22, 0xd7, 0x03, 0xde, 0x54, 0xe4, 0xb7, 0x48, + 0xbc, 0x91, 0xf0, 0xe2, 0x10, 0xcf, 0xcd, 0xdc, 0x99, 0x75, 0xda, 0x37, + 0xab, 0x71, 0xf8, 0x8a, 0xbf, 0x9d, 0x9a, 0x74, 0xf7, 0x79, 0x20, 0xd3, + 0xdf, 0x32, 0x14, 0x88, 0x00, 0x44, 0x35, 0xa4, 0xdd, 0x9b, 0x36, 0x29, + 0x26, 0x0f, 0x60, 0xa3, 0xa2, 0x00, 0x70, 0x91, 0x2d, 0x2c, 0x50, 0xa6, + 0x6b, 0x66, 0x1c, 0x9c, 0xc6, 0xdd, 0x40, 0x6f, 0x9a, 0xee, 0x31, 0x4e, + 0x36, 0x72, 0xf9, 0x90, 0x2c, 0xa1, 0x5e, 0x13, 0xf3, 0x40, 0xa0, 0xad, + 0x39, 0x01, 0x38, 0xb2, 0xc3, 0x36, 0x22, 0x00, 0xe2, 0x5d, 0xbd, 0xa2, + 0xa0, 0x5d, 0xa9, 0x13, 0xd6, 0x86, 0xd6, 0x32, 0xd9, 0xc7, 0x84, 0x03, + 0xb1, 0xe6, 0x20, 0xca, 0x6d, 0x42, 0xb0, 0xc8, 0x66, 0xb6, 0x37, 0x6c, + 0x60, 0x71, 0x61, 0x41, 0x5f, 0x53, 0xe7, 0x14, 0xc3, 0xfe, 0x15, 0xb7, + 0xe5, 0xf1, 0x8b, 0xa5, 0xb7, 0x00, 0xc2, 0x53, 0xaa, 0x0c, 0xf8, 0xc9, + 0x59, 0xe0, 0x06, 0x51, 0xf5, 0xea, 0xcd, 0xb8, 0x7c, 0x49, 0x05, 0x1f, + 0xc5, 0x1c, 0x92, 0x6b, 0xdf, 0x49, 0xbe, 0x5a, 0x1d, 0xde, 0x17, 0x8e, + 0xbe, 0xfe, 0xa0, 0x70, 0x61, 0x3c, 0x70, 0x85, 0xcf, 0x7b, 0x3b, 0x96, + 0xcd, 0xc7, 0xb9, 0xee, 0xc3, 0xdb, 0x43, 0x83, 0x60, 0x16, 0xa5, 0xff, + 0x4c, 0x53, 0xf5, 0x81, 0x06, 0x43, 0x98, 0xa3, 0xf4, 0xa7, 0x9d, 0x25, + 0x35, 0x2e, 0xf4, 0xe4, 0x7c, 0x8d, 0x46, 0xd2, 0x75, 0xb1, 0xa8, 0xd9, + 0x63, 0x9b, 0xaf, 0x8a, 0x69, 0x9a, 0x9c, 0xf2, 0x84, 0x89, 0x62, 0x76, + 0xc0, 0xa7, 0xc8, 0x1e, 0x87, 0x5c, 0x0a, 0xdf, 0xdc, 0xf4, 0x43, 0xed, + 0xde, 0x86, 0x7a, 0x59, 0x76, 0x32, 0x8f, 0xec, 0x81, 0x81, 0xaa, 0x7f, + 0xb6, 0x91, 0x3b, 0x1d, 0xca, 0x9c, 0x27, 0xdb, 0xfc, 0x7e, 0x30, 0x18, + 0x08, 0x87, 0xd5, 0x43, 0x21, 0xc0, 0xc9, 0x4c, 0x9c, 0x8c, 0xb2, 0x57, + 0x06, 0x04, 0x9f, 0x51, 0x7f, 0x1b, 0x5a, 0x0b, 0xf0, 0xa7, 0x06, 0xb9, + 0xa2, 0x61, 0xc5, 0x35, 0x0c, 0xc0, 0x8e, 0x72, 0x65, 0xfc, 0xf4, 0x7b, + 0xdc, 0xcc, 0x58, 0x5b, 0x28, 0x36, 0xec, 0x27, 0xe7, 0x36, 0xb7, 0xb6, + 0xae, 0x1f, 0x06, 0xad, 0x96, 0x02, 0x20, 0xae, 0x73, 0x1f, 0x2f, 0x6f, + 0x3e, 0x82, 0x66, 0xa4, 0x82, 0x7e, 0x78, 0xb1, 0x3c, 0x85, 0x22, 0x2b, + 0x94, 0xb3, 0xdb, 0x38, 0x17, 0x1c, 0x9f, 0x25, 0x01, 0x01, 0x86, 0xa5, + 0xb0, 0x2f, 0x7a, 0xf3, 0x9d, 0x4b, 0x68, 0x97, 0x0d, 0x01, 0x74, 0x43, + 0x83, 0x19, 0x1a, 0x8e, 0xb3, 0x29, 0x7e, 0x07, 0x69, 0x09, 0xd7, 0xd2, + 0xfe, 0x42, 0xd9, 0xc8, 0xa7, 0x1a, 0x81, 0xdb, 0xe6, 0xe1, 0xff, 0xa8, + 0xd7, 0x7a, 0xd9, 0xc0, 0x08, 0x41, 0xf4, 0xea, 0xc0, 0x5f, 0xf1, 0xb9, + 0x2a, 0xd9, 0x06, 0xe9, 0x07, 0x03, 0x50, 0xc0, 0x13, 0xf9, 0xec, 0x83, + 0x06, 0xb5, 0x46, 0xac, 0x6c, 0xdd, 0x5c, 0x9a, 0x82, 0x3a, 0x10, 0xca, + 0x5c, 0x7a, 0x5e, 0x71, 0x20, 0xf1, 0xd4, 0x4c, 0xf1, 0x15, 0x29, 0x1b, + 0x72, 0x0e, 0x0e, 0xdb, 0x33, 0xb3, 0x81, 0x81, 0xb1, 0x38, 0x7a, 0x97, + 0xe8, 0xa2, 0x53, 0x33, 0x01, 0x0b, 0x81, 0x3f, 0x02, 0xa7, 0xca, 0xcd, + 0x3b, 0x04, 0xa3, 0x11, 0x66, 0x3e, 0x36, 0xc8, 0xa0, 0xa6, 0x65, 0x7e, + 0x42, 0x10, 0x46, 0x2a, 0x00, 0x84, 0xa8, 0xc0, 0x66, 0x5f, 0x1f, 0xab, + 0x05, 0xb9, 0xe8, 0xe2, 0x6b, 0x85, 0x76, 0xdf, 0x51, 0x27, 0x43, 0x46, + 0x05, 0xce, 0xfe, 0x1a, 0xf9, 0x0e, 0xe2, 0xca, 0xaf, 0x07, 0x04, 0x99, + 0x1a, 0xa8, 0xe5, 0x5d, 0xe3, 0x80, 0x5f, 0xe1, 0x40, 0x3d, 0xb2, 0xfe, + 0xb7, 0x75, 0x72, 0xed, 0xee, 0x9c, 0x76, 0x11, 0x19, 0x08, 0x7c, 0xc1, + 0x3c, 0x01, 0xf3, 0x01, 0x8f, 0x39, 0xdf, 0x63, 0xc5, 0x20, 0xf0, 0x2a, + 0x80, 0x4e, 0x03, 0x9a, 0x47, 0x19, 0x5e, 0xc1, 0xc5, 0xf0, 0x5b, 0xf0, + 0x4a, 0x7c, 0x5a, 0x74, 0xc7, 0xa1, 0xb9, 0xd4, 0xd8, 0x0f, 0xd1, 0xf6, + 0xb6, 0x7a, 0x28, 0x3a, 0x01, 0x0e, 0xed, 0xc8, 0x70, 0x13, 0x6d, 0x3d, + 0x36, 0xb1, 0x71, 0xcb, 0x01, 0x07, 0xcc, 0x10, 0xc3, 0x47, 0xfe, 0x79, + 0x4c, 0x0c, 0xa8, 0x9e, 0x92, 0x74, 0xea, 0x13, 0xff, 0x15, 0xaf, 0x36, + 0x1d, 0xef, 0xaa, 0x6a, 0x5f, 0xf4, 0x5a, 0x00, 0x0f, 0x88, 0x91, 0xbe, + 0x53, 0x9c, 0xf6, 0x0d, 0x0c, 0xa7, 0x4e, 0x59, 0x4b, 0x23, 0x07, 0x9d, + 0x38, 0x27, 0x3e, 0x99, 0x1c, 0xb3, 0xda, 0xeb, 0x41, 0xb0, 0x2a, 0x6a, + 0xff, 0xd9, 0xb2, 0x3a, 0xa5, 0x12, 0x91, 0x9a, 0xc5, 0xab, 0x79, 0x35, + 0x45, 0xb4, 0xb4, 0x40, 0x9b, 0xa9, 0x4e, 0x63, 0xda, 0xd4, 0x8b, 0xa3, + 0x5f, 0x4a, 0x74, 0x90, 0x52, 0x88, 0x2b, 0x6f, 0x36, 0x4f, 0xb8, 0x6f, + 0x27, 0xbe, 0x4c, 0xe4, 0xfb, 0xb7, 0x0b, 0x0f, 0xd4, 0x0c, 0xee, 0xcf, + 0xb8, 0xa9, 0x9b, 0x2c, 0x13, 0xb5, 0xb2, 0xfd, 0xff, 0x2f, 0x5f, 0xad, + 0xa3, 0xc1, 0xd2, 0x7f, 0x56, 0xdf, 0x37, 0x06, 0x13, 0xf1, 0x78, 0x28, + 0xd8, 0xc0, 0xfb, 0x51, 0x7a, 0x47, 0x02, 0x13, 0x52, 0xf7, 0x2c, 0xd8, + 0x41, 0xda, 0x93, 0x91, 0x7c, 0x55, 0xe6, 0x77, 0x0a, 0x66, 0xc4, 0x76, + 0x5a, 0x99, 0xe0, 0x13, 0xd9, 0x8e, 0x70, 0xea, 0x23, 0xe5, 0xc6, 0xc7, + 0xda, 0xef, 0x78, 0xf8, 0x4b, 0x32, 0xe2, 0x50, 0xc7, 0x98, 0x94, 0x0a, + 0x32, 0xae, 0xcc, 0x3a, 0xe6, 0xca, 0xe2, 0xd1, 0xd7, 0x80, 0x0c, 0xb6, + 0x24, 0x65, 0xea, 0x21, 0x49, 0x22, 0x86, 0x4c, 0x85, 0x5f, 0x53, 0xca, + 0x53, 0x9a, 0xd4, 0x05, 0xab, 0x49, 0xfc, 0x05, 0xf2, 0xae, 0x1f, 0xdb, + 0x49, 0xdb, 0x84, 0x6e, 0x6c, 0xbf, 0xcb, 0x65, 0xdf, 0xf3, 0xd3, 0x29, + 0x93, 0xb0, 0x91, 0x3e, 0xf7, 0x8a, 0xfa, 0xca, 0xce, 0x82, 0x8c, 0x5e, + 0x2c, 0x04, 0xf7, 0x2a, 0x3b, 0x3a, 0x11, 0xaf, 0x9a, 0x94, 0xba, 0x7e, + 0xea, 0x14, 0x9a, 0x18, 0xc4, 0x26, 0x8a, 0x6f, 0x90, 0x26, 0x65, 0x5d, + 0x3b, 0x9f, 0x6b, 0xe7, 0x60, 0xea, 0x97, 0xf0, 0x4a, 0x40, 0x9e, 0x2e, + 0x23, 0x9b, 0x7b, 0x73, 0x7a, 0x55, 0xf9, 0xe4, 0x51, 0x9d, 0xdb, 0x4b, + 0xf7, 0xff, 0x6e, 0x47, 0xea, 0x02, 0xc0, 0xda, 0xda, 0x7b, 0xd8, 0x8f, + 0x00, 0x51, 0xec, 0xcd, 0xe1, 0xbc, 0xe5, 0x9f, 0xcb, 0xde, 0x8c, 0x9f, + 0x9f, 0x67, 0xbd, 0xaf, 0x25, 0x05, 0xb1, 0xe4, 0xc3, 0xc9, 0xf0, 0x14, + 0x82, 0x98, 0x65, 0x3f, 0x8a, 0x96, 0xa3, 0x83, 0x60, 0x42, 0x5e, 0x3d, + 0x85, 0x15, 0x7d, 0x7e, 0x83, 0x1e, 0x6c, 0x30, 0xfd, 0x03, 0x72, 0x46, + 0x14, 0x47, 0x2a, 0x2b, 0xb9, 0xef, 0x88, 0x7c, 0x65, 0x7d, 0x2d, 0x7e, + 0xdc, 0x29, 0xcd, 0x69, 0x6e, 0x61, 0x24, 0x4e, 0x7e, 0xa0, 0x12, 0x28, + 0x9e, 0xa5, 0x4b, 0x91, 0x97, 0x8b, 0xec, 0x61, 0xfe, 0x78, 0x59, 0xde, + 0xdd, 0xeb, 0x0e, 0xd4, 0x6f, 0xd1, 0xc4, 0xd5, 0x06, 0xb7, 0xf8, 0xe4, + 0xa4, 0x76, 0x90, 0x7d, 0xc2, 0xcb, 0x0c, 0xe4, 0x27, 0x37, 0x50, 0xd7, + 0x97, 0x0c, 0xc5, 0x87, 0xd5, 0x92, 0x65, 0x12, 0xd4, 0xe4, 0xf9, 0x49, + 0xa5, 0x3b, 0x63, 0xe7, 0xe1, 0x46, 0x1c, 0x49, 0xf2, 0xe2, 0x10, 0xf7, + 0x29, 0x7c, 0x45, 0xae, 0x46, 0xbb, 0xe6, 0xd9, 0xd6, 0x08, 0x38, 0x35, + 0x0f, 0x25, 0x7e, 0x2a, 0xe7, 0x29, 0xea, 0xdd, 0xff, 0x37, 0x75, 0x38, + 0xab, 0x8d, 0x2f, 0x26, 0x92, 0xe0, 0xf2, 0x9b, 0x22, 0xb9, 0x4f, 0xb4, + 0x1a, 0x33, 0xad, 0xe2, 0x7d, 0xa9, 0x98, 0x9e, 0xfb, 0x03, 0xd7, 0x60, + 0x3e, 0xa6, 0x03, 0x07, 0xa0, 0x81, 0x96, 0x6f, 0x67, 0x27, 0xa7, 0x5a, + 0x27, 0x69, 0xc4, 0x39, 0xca, 0x0a, 0x0e, 0xb6, 0x52, 0xd6, 0xee, 0x55, + 0xb2, 0xf6, 0x7d, 0x3e, 0x1d, 0x66, 0x5e, 0x8e, 0xbf, 0x80, 0x93, 0xc7, + 0x28, 0x60, 0xb1, 0x42, 0x48, 0xd0, 0x36, 0x85, 0xa1, 0x85, 0x91, 0x4a, + 0x2c, 0x07, 0x55, 0xc9, 0xf0, 0x7c, 0xaa, 0x68, 0x2c, 0x1a, 0xdf, 0xc8, + 0xba, 0xf6, 0xe7, 0xe7, 0xa2, 0xaf, 0xa1, 0xe7, 0x50, 0x74, 0xb5, 0x4d, + 0xf0, 0x45, 0xb7, 0x7f, 0x6c, 0xf0, 0xe6, 0x18, 0x9e, 0xe2, 0x73, 0x07, + 0x7f, 0x1d, 0x17, 0x7d, 0x36, 0xf4, 0x37, 0xef, 0x14, 0x88, 0xb7, 0xed, + 0x97, 0x54, 0x40, 0x7c, 0x1c, 0xd2, 0x7a, 0xc4, 0x35, 0xe9, 0x37, 0xaa, + 0xbe, 0x6c, 0x25, 0x95, 0x5e, 0x10, 0x5a, 0x7c, 0x36, 0x36, 0xbf, 0xdf, + 0x77, 0x01, 0xcb, 0x78, 0x52, 0x60, 0x63, 0xac, 0xc5, 0x52, 0xf3, 0xc3, + 0x73, 0x6d, 0x19, 0x49, 0x84, 0x35, 0x0f, 0x9a, 0x94, 0x2d, 0x89, 0xfb, + 0xa4, 0x73, 0x5d, 0x55, 0xa5, 0x42, 0x3c, 0x49, 0x70, 0xbf, 0xc4, 0x83, + 0x57, 0xd8, 0xfe, 0x1d, 0x31, 0x8d, 0xa0, 0xa0, 0x18, 0xa8, 0x45, 0x2c, + 0xfb, 0xf4, 0xd5, 0x0c, 0x37, 0xd9, 0xf8, 0xfe, 0x89, 0xbd, 0x9b, 0xc2, + 0x7c, 0x9b, 0x4d, 0x1b, 0x5c, 0x2f, 0xe2, 0xa1, 0x68, 0x7f, 0xb2, 0xcd, + 0x2f, 0x80, 0x0e, 0x6b, 0xf0, 0xb4, 0x9c, 0x20, 0xb0, 0x14, 0xf4, 0x06, + 0xb5, 0x27, 0x24, 0x9f, 0x90, 0xc4, 0x5f, 0x7d, 0xd5, 0xde, 0x56, 0xb8, + 0x50, 0x7f, 0x2f, 0xe1, 0x82, 0x0c, 0x52, 0xd6, 0x38, 0x4f, 0x9f, 0xf9, + 0xe5, 0x2f, 0x52, 0xba, 0x5b, 0xaf, 0xa2, 0x6e, 0xe2, 0xee, 0x06, 0xf2, + 0x70, 0xcf, 0x5f, 0x3a, 0x24, 0xf5, 0xa2, 0xc6, 0x74, 0x1b, 0xf8, 0xd5, + 0xf5, 0x3d, 0xa1, 0x24, 0x05, 0x7a, 0xb6, 0xb4, 0x77, 0xa8, 0x38, 0x59, + 0x3f, 0xc6, 0xad, 0x65, 0xc3, 0x01, 0xe0, 0x92, 0xe9, 0x90, 0xd8, 0x82, + 0x04, 0x30, 0x92, 0xea, 0xc4, 0xdd, 0xa5, 0x51, 0xf8, 0xcd, 0x7b, 0x54, + 0xfd, 0xe6, 0x64, 0x5f, 0x41, 0x20, 0xca, 0x7f, 0xfd, 0x6c, 0x0b, 0xb4, + 0xb4, 0xe4, 0xad, 0xaf, 0x04, 0x0a, 0xfc, 0xa1, 0x61, 0xdc, 0x92, 0xcf, + 0xc8, 0xa4, 0x54, 0xe4, 0x8d, 0xd3, 0x11, 0x20, 0x95, 0x9c, 0xeb, 0xdc, + 0xea, 0x69, 0xe9, 0xcf, 0xbd, 0xc0, 0xcb, 0xde, 0xce, 0x3e, 0xfc, 0x01, + 0xbb, 0xee, 0x51, 0xab, 0x7e, 0xf2, 0x3a, 0x01, 0x84, 0xe7, 0x5f, 0x94, + 0xd6, 0x78, 0x77, 0x8a, 0x3d, 0x9c, 0x77, 0xdc, 0x14, 0xec, 0x71, 0xb5, + 0xbe, 0xc5, 0x46, 0xbd, 0x05, 0xba, 0x01, 0xeb, 0x83, 0x6c, 0xec, 0xff, + 0x67, 0x94, 0xef, 0x25, 0x86, 0x95, 0xd4, 0x00, 0x55, 0x93, 0xbd, 0xf7, + 0x7a, 0x22, 0x9f, 0x26, 0x8f, 0xf6, 0x8f, 0xe1, 0x8b, 0xcd, 0x12, 0x1b, + 0xc8, 0x79, 0xb0, 0x4b, 0x0d, 0x33, 0xac, 0x52, 0x46, 0x7b, 0x9e, 0x00, + 0x2b, 0x5e, 0x17, 0x9d, 0x3d, 0xeb, 0x73, 0xe5, 0xa2, 0x84, 0x7e, 0x32, + 0x02, 0x89, 0xe0, 0x7a, 0x8e, 0xcf, 0x18, 0xbb, 0x14, 0xc8, 0x3a, 0x59, + 0x92, 0x48, 0x51, 0x10, 0xd0, 0xd8, 0x46, 0xb1, 0xeb, 0xfc, 0x69, 0xfd, + 0xff, 0x44, 0x4c, 0x1f, 0x64, 0x44, 0xab, 0xcf, 0x4b, 0x74, 0xfc, 0x9e, + 0x7b, 0xea, 0x83, 0x7e, 0x08, 0xdb, 0x44, 0xd7, 0xed, 0x85, 0xa9, 0x08, + 0x02, 0xb4, 0x14, 0xfa, 0x2b, 0xa9, 0x86, 0x7d, 0x26, 0xbb, 0x95, 0x55, + 0x2f, 0xe0, 0x49, 0x71, 0x95, 0xa4, 0xef, 0x6e, 0xb6, 0x6a, 0x17, 0xaa, + 0x56, 0xab, 0xa2, 0xe4, 0xcc, 0x5a, 0x8d, 0x62, 0x3b, 0xaf, 0xe1, 0x59, + 0xa8, 0xf8, 0x0e, 0x20, 0x18, 0x83, 0x25, 0xe6, 0xee, 0xf3, 0xb8, 0x55, + 0x2d, 0x10, 0xa8, 0xaa, 0x82, 0x6e, 0xa1, 0x7d, 0x76, 0x7f, 0x03, 0x36, + 0x70, 0x58, 0x11, 0xbc, 0xa1, 0xe9, 0x18, 0xfe, 0x2c, 0xfc, 0xda, 0xa8, + 0x1f, 0xcc, 0x5f, 0x34, 0x36, 0x33, 0x69, 0x6e, 0x2e, 0xa5, 0x84, 0x44, + 0x02, 0xcc, 0xd7, 0x84, 0xfc, 0xf8, 0x0a, 0xfd, 0xed, 0x3f, 0x73, 0x4a, + 0x6e, 0x39, 0x05, 0x19, 0x8c, 0x0e, 0x98, 0xd3, 0xea, 0x70, 0xd2, 0xc8, + 0xf9, 0xb6, 0x22, 0xd3, 0x85, 0x86, 0xc9, 0xd3, 0xb4, 0x9c, 0x2c, 0xd7, + 0x91, 0x54, 0x95, 0xcf, 0x8c, 0x74, 0xa5, 0x1d, 0xf2, 0x0b, 0xce, 0x7d, + 0x5b, 0xde, 0xca, 0xb4, 0x25, 0x8e, 0x1d, 0x7e, 0x0b, 0x58, 0xb0, 0xaa, + 0x00, 0x64, 0xdf, 0x87, 0xef, 0x4e, 0x50, 0x69, 0x44, 0x20, 0xa5, 0x9c, + 0xf6, 0x4f, 0x1f, 0x68, 0x31, 0xc4, 0x36, 0x0d, 0xdf, 0x5c, 0x66, 0x32, + 0xac, 0x76, 0x16, 0x2b, 0xd8, 0xd5, 0x60, 0xe4, 0xae, 0x8a, 0x97, 0xed, + 0xc4, 0xd5, 0x07, 0xf5, 0x0a, 0xea, 0x4a, 0x50, 0x10, 0xfb, 0x40, 0x4d, + 0xe1, 0x4a, 0x1e, 0x16, 0x7a, 0x2c, 0xd3, 0x17, 0xf9, 0x87, 0x71, 0x3a, + 0xa0, 0x7f, 0x4d, 0xa1, 0x53, 0x47, 0xc7, 0xb6, 0x95, 0x7e, 0x74, 0xbf, + 0x5e, 0x06, 0x16, 0x06, 0x0b, 0x4c, 0xab, 0x0f, 0x9a, 0xb5, 0x37, 0x0f, + 0xd2, 0xd4, 0x9c, 0xae, 0xf8, 0xdd, 0xf8, 0xd7, 0xfd, 0x96, 0xa8, 0x3b, + 0x05, 0xee, 0x1b, 0xb7, 0x5b, 0x4f, 0x62, 0xe9, 0x0b, 0x4f, 0x2a, 0x54, + 0x14, 0x14, 0xdf, 0x69, 0xf2, 0x36, 0xfd, 0x26, 0xce, 0x43, 0x0a, 0x9c, + 0x18, 0xc5, 0x77, 0xd2, 0x89, 0xaf, 0x65, 0xa9, 0x6a, 0xab, 0x42, 0xdb, + 0xde, 0xe9, 0xc2, 0xf8, 0x89, 0xe0, 0xcf, 0x87, 0xac, 0x24, 0xa6, 0xc7, + 0x19, 0x13, 0x6c, 0x62, 0xa6, 0xa9, 0x59, 0x92, 0xdc, 0x4a, 0x3d, 0x78, + 0x17, 0x78, 0x94, 0xd0, 0xbb, 0xb8, 0x74, 0x29, 0xe6, 0x62, 0xaa, 0x86, + 0x6a, 0x62, 0x37, 0xd8, 0xdf, 0x95, 0x31, 0x7a, 0xc6, 0xef, 0x86, 0x6c, + 0x9f, 0x28, 0x53, 0x24, 0x7b, 0x64, 0xc8, 0x3b, 0x37, 0x3b, 0x84, 0x21, + 0x0b, 0x84, 0xc7, 0xb6, 0x23, 0x45, 0x59, 0xf2, 0xcb, 0xf8, 0x28, 0xe7, + 0xf5, 0xeb, 0x3c, 0xdd, 0x40, 0xb9, 0xf5, 0xf7, 0x47, 0xce, 0x7a, 0xee, + 0x43, 0x6c, 0x00, 0xc8, 0x7d, 0x81, 0x5f, 0xc1, 0xb2, 0xfc, 0xef, 0x8c, + 0xd0, 0x47, 0x90, 0x70, 0x86, 0x69, 0xae, 0x47, 0x2c, 0x7e, 0xde, 0x97, + 0x7e, 0x47, 0xe5, 0x66, 0xcf, 0xf2, 0xe7, 0x83, 0xfe, 0xe4, 0xae, 0xbd, + 0x40, 0x68, 0x8a, 0x8f, 0xf9, 0x22, 0xc0, 0xf4, 0x30, 0x0e, 0x41, 0x3c, + 0x80, 0xc6, 0xaf, 0x09, 0x96, 0xf8, 0x64, 0x7b, 0x00, 0x80, 0x89, 0x0e, + 0xa4, 0xf3, 0x7f, 0x84, 0x11, 0xd6, 0x24, 0xf0, 0x82, 0x03, 0xf3, 0x04, + 0xdb, 0x02, 0xdc, 0x50, 0xdf, 0x0b, 0x90, 0x3e, 0xf4, 0xb2, 0x53, 0xa4, + 0xf1, 0xe5, 0x5c, 0x21, 0xb5, 0x43, 0xa5, 0xfc, 0xc4, 0xb1, 0x5e, 0xff, + 0x32, 0x03, 0xcb, 0x64, 0xbd, 0x92, 0x4d, 0x59, 0xbb, 0x05, 0x77, 0x6f, + 0x02, 0xce, 0xd2, 0xc7, 0x67, 0x9b, 0x92, 0xd9, 0x69, 0x5c, 0xe0, 0x70, + 0x2c, 0x61, 0x66, 0xb5, 0x74, 0x4a, 0xb9, 0x0c, 0x67, 0xcb, 0x34, 0xfa, + 0xdd, 0x4d, 0xbd, 0x83, 0xed, 0x9b, 0xc5, 0x1d, 0x8d, 0x75, 0x10, 0x04, + 0x9b, 0xf3, 0xeb, 0xc8, 0x6f, 0x37, 0x9a, 0x8b, 0x51, 0x89, 0xbc, 0xcb, + 0x88, 0x34, 0xf9, 0x66, 0xdb, 0x18, 0x76, 0x2f, 0xd4, 0x31, 0x1f, 0x08, + 0xe0, 0xca, 0x69, 0xc9, 0x35, 0xf8, 0x0b, 0xe4, 0xef, 0x9c, 0x7f, 0x4e, + 0x23, 0x67, 0x23, 0x5c, 0x78, 0xcb, 0x43, 0xbd, 0x3a, 0xe5, 0x5d, 0xc6, + 0x1f, 0x54, 0xbc, 0x7d, 0xf0, 0x00, 0x45, 0x01, 0x03, 0x1b, 0x97, 0x7e, + 0xdf, 0x60, 0x96, 0x67, 0x65, 0x46, 0xe2, 0x8a, 0x5f, 0x98, 0x7d, 0x13, + 0x84, 0x0f, 0x20, 0x18, 0x33, 0xcb, 0x84, 0x90, 0x1a, 0xa6, 0xa1, 0xf2, + 0xc4, 0xf6, 0x0c, 0xd7, 0x75, 0xdf, 0xa8, 0xd0, 0x7d, 0xb7, 0x6f, 0x7c, + 0xa2, 0x8c, 0xcc, 0x59, 0xf0, 0xed, 0x4a, 0x4d, 0x0e, 0x51, 0x5f, 0x24, + 0x2c, 0x00, 0x0f, 0xbb, 0x7e, 0x07, 0xba, 0x9f, 0xe6, 0x06, 0x3e, 0xf1, + 0x94, 0xde, 0x17, 0x09, 0xe4, 0xa2, 0xbe, 0xe6, 0x7e, 0x1e, 0x3e, 0x09, + 0xd4, 0x21, 0xdf, 0xa7, 0xa4, 0xde, 0x06, 0xc8, 0xa5, 0xef, 0x4d, 0x7e, + 0x41, 0xcb, 0xfc, 0x01, 0x68, 0x5e, 0xfb, 0xc1, 0xfb, 0xfa, 0x9a, 0xef, + 0xdc, 0x88, 0xdf, 0x0f, 0x51, 0x78, 0x4f, 0x0f, 0x07, 0x81, 0xd2, 0xc0, + 0x84, 0x98, 0xd7, 0xe2, 0xd5, 0x91, 0x13, 0xf6, 0xc9, 0xa4, 0xa0, 0x2b, + 0x3f, 0x73, 0x28, 0x3d, 0xa1, 0x3f, 0x68, 0x9f, 0x21, 0xe1, 0x34, 0x11, + 0xd9, 0xf2, 0x93, 0xb7, 0x5d, 0xba, 0x06, 0x1e, 0x27, 0x18, 0x1f, 0x92, + 0x5d, 0xc8, 0x78, 0x0d, 0x74, 0xa3, 0x47, 0xe8, 0x80, 0xa4, 0x72, 0x63, + 0xc7, 0x3d, 0x65, 0x4e, 0x8e, 0x9e, 0xbe, 0x06, 0xe6, 0xb6, 0x89, 0x14, + 0xd1, 0x63, 0x0c, 0x09, 0x7b, 0x06, 0x7b, 0x6d, 0x16, 0x00, 0x05, 0xa6, + 0x13, 0x8a, 0xb7, 0x6f, 0x0f, 0x9a, 0x56, 0x11, 0x33, 0x06, 0xa2, 0x70, + 0xcd, 0x23, 0xb5, 0xd3, 0x3c, 0x92, 0xa4, 0xb9, 0x6e, 0x10, 0xd8, 0x2b, + 0xc3, 0xa8, 0xf9, 0x24, 0x8b, 0xcf, 0xb7, 0xb1, 0x45, 0xf0, 0xd5, 0x31, + 0x73, 0x28, 0x45, 0x10, 0xd6, 0xa4, 0x2e, 0x3b, 0xe8, 0xbb, 0x82, 0x1a, + 0x27, 0x3f, 0x61, 0xaa, 0x82, 0xd7, 0xc5, 0x12, 0x89, 0x94, 0xec, 0x05, + 0xe5, 0xd2, 0x7f, 0x49, 0x1d, 0x90, 0xa9, 0xa6, 0x85, 0x14, 0x15, 0xf5, + 0x2d, 0x1a, 0x65, 0xb8, 0x9c, 0x85, 0xd0, 0x6c, 0x37, 0x0d, 0xa8, 0x78, + 0xd5, 0x17, 0x62, 0x8a, 0xb1, 0xa6, 0xf1, 0x3a, 0xf0, 0x18, 0x1e, 0xfc, + 0x0c, 0x7d, 0xa4, 0x57, 0x31, 0x77, 0x5e, 0xf8, 0x8f, 0xfb, 0x8a, 0x28, + 0x10, 0x47, 0xe6, 0xa1, 0xdd, 0x6a, 0xfb, 0x58, 0xf6, 0xc1, 0x6b, 0x51, + 0x4a, 0xa4, 0x4a, 0x70, 0x1c, 0x1f, 0xf0, 0x60, 0xcb, 0x7a, 0x14, 0x04, + 0x3e, 0x8b, 0x6b, 0x2f, 0x55, 0x5c, 0x5c, 0xb1, 0xf2, 0xf6, 0x73, 0x36, + 0xdc, 0x80, 0x1e, 0xe5, 0xdc, 0x4e, 0x93, 0x4c, 0x83, 0x37, 0x66, 0xa4, + 0x13, 0x68, 0x78, 0x25, 0xe4, 0x33, 0x81, 0xfa, 0x0c, 0x38, 0xd4, 0x91, + 0x61, 0x5e, 0x15, 0x5e, 0xf2, 0x26, 0xc4, 0xa7, 0xdc, 0x6b, 0x82, 0xf0, + 0xed, 0xa3, 0x42, 0xf8, 0xff, 0x23, 0xe4, 0x4c, 0x96, 0xd1, 0x38, 0x9f, + 0xad, 0x86, 0xdf, 0x8e, 0xcd, 0xc1, 0xd9, 0x9c, 0xe7, 0x6c, 0x01, 0x43, + 0x2c, 0x3a, 0x4d, 0x77, 0x6c, 0x67, 0x6f, 0xac, 0xee, 0x96, 0x5e, 0x1f, + 0x42, 0xd0, 0x84, 0x12, 0xd7, 0xae, 0x51, 0x6b, 0x42, 0xc4, 0x8e, 0x89, + 0x27, 0xd8, 0x07, 0x6f, 0x48, 0x82, 0x65, 0x43, 0x82, 0x94, 0x85, 0xde, + 0x48, 0xf0, 0x5e, 0x45, 0x3b, 0x3e, 0x31, 0xb1, 0x7d, 0x0c, 0x1c, 0x5d, + 0xdf, 0xc0, 0x7a, 0x06, 0x03, 0xea, 0xf2, 0x3d, 0xad, 0xd4, 0xdf, 0xdb, + 0xc5, 0xb5, 0x9e, 0x6c, 0xed, 0x54, 0x47, 0x4d, 0x47, 0xea, 0x99, 0xe4, + 0x27, 0xad, 0x59, 0x24, 0xfa, 0x47, 0x8c, 0x51, 0xc3, 0xf9, 0x4d, 0x05, + 0x24, 0x2b, 0x94, 0xa5, 0x27, 0xbb, 0xa6, 0x8c, 0x06, 0x57, 0x2d, 0xec, + 0x59, 0x4a, 0x60, 0x00, 0x08, 0x04, 0x5e, 0x1d, 0x4d, 0x6e, 0x50, 0x49, + 0x4c, 0x0c, 0xdf, 0xe2, 0x7d, 0x1e, 0x58, 0x89, 0xee, 0x07, 0x7c, 0x15, + 0x2b, 0x00, 0x3c, 0x50, 0xea, 0x61, 0xc8, 0x9c, 0x22, 0x46, 0xf8, 0xa1, + 0xfa, 0x6d, 0x99, 0x9f, 0xab, 0x04, 0xc5, 0x61, 0xc5, 0x8d, 0xaf, 0xd2, + 0x5e, 0xd2, 0x4e, 0x80, 0x84, 0x61, 0x2c, 0xef, 0xa3, 0x4b, 0xd7, 0xd2, + 0xe4, 0xba, 0x42, 0xbb, 0x9f, 0x5f, 0xac, 0x56, 0xa7, 0x99, 0x29, 0x92, + 0xc1, 0xfb, 0x76, 0xd9, 0xa8, 0xb5, 0xef, 0x96, 0xfe, 0x4d, 0xdb, 0x09, + 0x9e, 0xa2, 0xde, 0xd7, 0x4e, 0x2b, 0x83, 0xb5, 0xf4, 0x0b, 0xd3, 0x8c, + 0x9e, 0xfb, 0xbf, 0x68, 0xb4, 0x14, 0x4e, 0x45, 0x9a, 0x39, 0x69, 0x15, + 0x35, 0x74, 0xcd, 0x46, 0xed, 0x5d, 0x05, 0xf3, 0xcc, 0x81, 0xb3, 0x30, + 0x03, 0x4b, 0x28, 0x6e, 0xa0, 0x8d, 0x07, 0x21, 0x3e, 0x75, 0x1c, 0x8e, + 0x84, 0xa4, 0x2f, 0xd4, 0x4f, 0xa0, 0x60, 0xcd, 0xf7, 0xcb, 0x88, 0xbb, + 0xb9, 0x7f, 0x68, 0x7e, 0xcb, 0x46, 0x95, 0x8d, 0x47, 0x1e, 0xec, 0xc1, + 0x8c, 0x76, 0xf1, 0x2a, 0xa0, 0x9f, 0x85, 0x91, 0xc8, 0xaf, 0xa9, 0x23, + 0x3f, 0x30, 0x6c, 0x7c, 0x5b, 0xdb, 0xf8, 0x80, 0x6d, 0x61, 0x59, 0xe7, + 0x73, 0x81, 0xe6, 0xfd, 0xdf, 0x5c, 0x21, 0x6a, 0x18, 0x1f, 0xe5, 0x32, + 0x7e, 0x8a, 0xa0, 0xe5, 0x53, 0xdc, 0x59, 0xb5, 0x51, 0x44, 0x4a, 0x04, + 0x73, 0x18, 0x89, 0x55, 0xdb, 0x8f, 0x6e, 0x07, 0x03, 0xd8, 0x8e, 0x3c, + 0xdf, 0x16, 0xb6, 0x04, 0x08, 0xb1, 0x52, 0xcb, 0xf3, 0x6d, 0xa5, 0xda, + 0x54, 0x02, 0xeb, 0xfb, 0x75, 0x3d, 0xd2, 0xae, 0xe0, 0xb4, 0x56, 0xc8, + 0xbd, 0x08, 0x50, 0x2d, 0xa6, 0xc0, 0x18, 0x81, 0x98, 0xdd, 0xcd, 0x0b, + 0xfe, 0x1e, 0xdc, 0xb1, 0x26, 0x71, 0xc1, 0xd3, 0xf7, 0xba, 0xbc, 0xc9, + 0x8d, 0x12, 0xc2, 0x14, 0x9e, 0x77, 0xea, 0x60, 0x74, 0x1f, 0x07, 0x61, + 0x0f, 0xd0, 0xb9, 0x3a, 0x56, 0xc0, 0xa5, 0xd8, 0xc7, 0xe1, 0xd4, 0x46, + 0x01, 0x4d, 0x42, 0x63, 0xcb, 0xbc, 0x2b, 0x67, 0xb5, 0xdb, 0x7a, 0x8c, + 0xb0, 0x73, 0x9e, 0x6c, 0x39, 0x8e, 0xe2, 0x30, 0xb4, 0x80, 0x7a, 0xfc, + 0x63, 0x90, 0x9e, 0x21, 0x93, 0xb2, 0x80, 0xaa, 0x67, 0x2f, 0x57, 0x99, + 0x90, 0x7f, 0x63, 0x05, 0x9d, 0x12, 0x02, 0x72, 0x24, 0xd6, 0x08, 0xde, + 0x2f, 0x51, 0x4e, 0x5d, 0x2d, 0x1d, 0x94, 0x6d, 0x36, 0x77, 0x1a, 0x94, + 0x1e, 0x82, 0x4d, 0xc9, 0xed, 0x0f, 0x1b, 0xc6, 0xc0, 0x58, 0xa3, 0xf7, + 0x81, 0x57, 0x02, 0x4d, 0x2e, 0xb6, 0xce, 0xa6, 0xa7, 0x8e, 0x9c, 0xf6, + 0xa0, 0x3f, 0x1e, 0xa1, 0xbd, 0xdf, 0xeb, 0x6b, 0xb0, 0xd9, 0x1a, 0x3f, + 0x2a, 0x61, 0x1f, 0x97, 0x10, 0x04, 0xaf, 0x2e, 0xab, 0x15, 0x8e, 0x42, + 0x1b, 0x6b, 0x31, 0x82, 0x30, 0xeb, 0x91, 0x9f, 0x3b, 0x88, 0x99, 0xb6, + 0x35, 0x5f, 0xb1, 0xf6, 0x36, 0xb5, 0x80, 0xd4, 0x7a, 0xcb, 0xbc, 0x92, + 0x0e, 0xb3, 0x65, 0x8f, 0xfd, 0xc1, 0xe2, 0xb5, 0xaa, 0xe5, 0x01, 0x2e, + 0xc5, 0x59, 0x0d, 0xf4, 0x47, 0x54, 0xdf, 0xae, 0xb8, 0x7a, 0x6d, 0x58, + 0x06, 0x3d, 0x72, 0xe8, 0x2a, 0x6a, 0xfd, 0x2f, 0x1f, 0x28, 0x19, 0x6f, + 0x5d, 0x1e, 0xc3, 0x71, 0xca, 0xfe, 0x91, 0xe5, 0x89, 0xeb, 0x8c, 0xf2, + 0x54, 0xdb, 0x3e, 0xa3, 0x29, 0x19, 0xba, 0x3c, 0x41, 0x22, 0x2d, 0xd0, + 0x39, 0x7b, 0xfb, 0x0b, 0xc3, 0x8a, 0xcc, 0x46, 0xe2, 0x6a, 0x3b, 0x5d, + 0x74, 0xec, 0xf4, 0xe7, 0x95, 0x3d, 0x32, 0x97, 0x58, 0x08, 0xf5, 0x97, + 0x0a, 0x31, 0x2c, 0xc4, 0x7b, 0x19, 0xca, 0x7f, 0xb6, 0xea, 0xc4, 0x9d, + 0xb1, 0xed, 0xd2, 0xc1, 0xf3, 0xe7, 0xf7, 0x61, 0x25, 0x96, 0x3a, 0x70, + 0xb8, 0x57, 0x4a, 0x6f, 0x6e, 0x38, 0xea, 0xb2, 0x9c, 0xed, 0xc7, 0xa2, + 0xa0, 0x56, 0xf1, 0x74, 0x3c, 0x28, 0x73, 0x51, 0x1c, 0xdb, 0xe7, 0x76, + 0x0c, 0xab, 0x0e, 0x5f, 0x43, 0x65, 0x2b, 0xb9, 0x30, 0x44, 0x7f, 0x20, + 0xea, 0x39, 0xcd, 0xca, 0x47, 0x97, 0x75, 0x1a, 0x01, 0x47, 0x23, 0x34, + 0xfb, 0x57, 0x14, 0xdd, 0xdd, 0x40, 0x92, 0xae, 0x05, 0x71, 0xe0, 0xc2, + 0x26, 0x29, 0xdb, 0xc9, 0xdc, 0xf2, 0x46, 0x68, 0x88, 0x29, 0xc3, 0x2f, + 0xa4, 0x16, 0x8b, 0xe1, 0xc7, 0xa0, 0x8e, 0xbd, 0x3c, 0xbc, 0x00, 0x87, + 0x93, 0x93, 0x04, 0x3e, 0x4b, 0x75, 0xfd, 0xbc, 0xf9, 0x98, 0xc2, 0x5e, + 0x6f, 0xf6, 0xe9, 0x5a, 0xcd, 0x9f, 0x84, 0x98, 0x6b, 0x91, 0x77, 0xd7, + 0x64, 0x9d, 0xdc, 0x06, 0x40, 0xf3, 0xf4, 0x78, 0x45, 0x39, 0xaa, 0x0d, + 0x8c, 0x7a, 0x75, 0x4b, 0xa5, 0xa3, 0x7e, 0xc6, 0x24, 0x5e, 0xc5, 0x5f, + 0x47, 0xd1, 0x70, 0x7d, 0xf4, 0x60, 0xdd, 0x11, 0xf8, 0xc0, 0xac, 0x7c, + 0xf0, 0x57, 0xb1, 0x4a, 0x94, 0xfd, 0x9a, 0xb5, 0x56, 0xb5, 0xa1, 0x50, + 0xdd, 0x8e, 0x56, 0x87, 0xe2, 0x14, 0x0a, 0xd7, 0xba, 0x92, 0x18, 0x3a, + 0x1d, 0xef, 0x98, 0xe1, 0x85, 0x59, 0x25, 0x36, 0xc9, 0xbf, 0x7d, 0xd2, + 0x16, 0x4f, 0x90, 0xf6, 0xe5, 0xd2, 0xb0, 0x82, 0x26, 0x3b, 0x4a, 0xca, + 0xd6, 0x94, 0x15, 0x94, 0x55, 0x16, 0x38, 0xe3, 0x96, 0x0c, 0xda, 0x8a, + 0xfd, 0x38, 0x78, 0xc7, 0x41, 0xac, 0xa4, 0x73, 0x7a, 0xc3, 0xd6, 0x60, + 0xef, 0xfb, 0x62, 0xd6, 0x1e, 0xe1, 0x9d, 0xc5, 0x21, 0xa6, 0x6f, 0x0d, + 0x83, 0x29, 0xd8, 0xce, 0x5e, 0x93, 0xef, 0x41, 0xaa, 0x2c, 0x54, 0x95, + 0x6d, 0xd3, 0x0e, 0xad, 0x32, 0xaa, 0x5f, 0xfc, 0x98, 0x3e, 0xdf, 0x7b, + 0x91, 0x8b, 0xa1, 0x87, 0x1d, 0x89, 0x4c, 0x1d, 0x5b, 0xa2, 0x55, 0x19, + 0x65, 0x9c, 0xe2, 0x08, 0xda, 0x07, 0xdf, 0x8a, 0xf8, 0x59, 0x2e, 0x2d, + 0x7b, 0xa8, 0xad, 0x7e, 0x5a, 0xd0, 0x53, 0x75, 0xe4, 0xf8, 0xd3, 0xe9, + 0x62, 0x37, 0x94, 0x97, 0x21, 0x3a, 0xc2, 0x6f, 0xed, 0x28, 0x64, 0xfe, + 0xd8, 0xbe, 0xe8, 0x68, 0xfc, 0x1a, 0x32, 0x93, 0xd3, 0x26, 0xb2, 0x25, + 0x73, 0x97, 0x94, 0x15, 0x76, 0x26, 0xbf, 0xdd, 0x2c, 0xb3, 0x97, 0x0b, + 0x45, 0xe7, 0xcf, 0x9a, 0xcb, 0x77, 0xea, 0x17, 0x34, 0x94, 0x15, 0xf5, + 0xc0, 0xa0, 0x16, 0xa4, 0x35, 0x55, 0xb1, 0xc2, 0x70, 0x89, 0x58, 0x61, + 0xd0, 0x27, 0xd4, 0xb7, 0x1b, 0x36, 0xac, 0xd6, 0xed, 0x86, 0x6d, 0x64, + 0x31, 0x64, 0xa0, 0xcc, 0xbe, 0x09, 0xb9, 0xae, 0x59, 0x07, 0xcb, 0xbd, + 0xf6, 0xa7, 0x93, 0x88, 0x41, 0x44, 0xa9, 0x29, 0x50, 0xde, 0xce, 0xdd, + 0x88, 0xce, 0x38, 0xcb, 0xfd, 0x7f, 0x0f, 0x1e, 0x43, 0x5e, 0xba, 0xbe, + 0x2d, 0x0a, 0x09, 0x10, 0x38, 0xd9, 0x53, 0xc7, 0x6f, 0xfc, 0x9f, 0x05, + 0x4b, 0x42, 0xa9, 0x03, 0x4e, 0xb2, 0x94, 0x7b, 0xa7, 0xc3, 0x57, 0xa8, + 0x35, 0xb1, 0x02, 0x59, 0x6c, 0x74, 0x96, 0x80, 0x9d, 0xd7, 0x56, 0xb3, + 0x4b, 0xd0, 0x6c, 0xa8, 0x64, 0xcd, 0x96, 0xb0, 0x42, 0xe4, 0xa4, 0xb8, + 0x35, 0xa7, 0x98, 0x01, 0x76, 0xaa, 0x22, 0xd3, 0xd3, 0x42, 0x4d, 0x49, + 0xab, 0x47, 0xb4, 0xc0, 0xa1, 0x58, 0x96, 0xfc, 0x37, 0x50, 0x81, 0x24, + 0xf6, 0x4c, 0x25, 0x8a, 0xb4, 0x20, 0x3f, 0xac, 0x2b, 0xaa, 0xde, 0x3b, + 0x62, 0x3e, 0xf7, 0xd7, 0xac, 0x29, 0xe6, 0x59, 0xca, 0x94, 0xe5, 0x7d, + 0x01, 0x88, 0xce, 0xf7, 0x81, 0x1c, 0xb5, 0xae, 0xb3, 0xf8, 0x9d, 0x93, + 0xbb, 0x51, 0xef, 0xd1, 0x0d, 0x96, 0x48, 0x9e, 0x13, 0xe4, 0x25, 0xfd, + 0xe6, 0x78, 0xd2, 0x5a, 0x87, 0x40, 0xd8, 0x40, 0x02, 0x29, 0x33, 0xe8, + 0x74, 0x36, 0x4e, 0xc2, 0xdd, 0x6d, 0x00, 0xc0, 0x6d, 0x21, 0xcc, 0xc5, + 0x8d, 0xa1, 0x33, 0x59, 0xa8, 0x52, 0xc3, 0x80, 0xc5, 0xdc, 0x77, 0xfd, + 0x4e, 0x76, 0xb4, 0x6a, 0x7e, 0x52, 0xfc, 0xe3, 0xae, 0x55, 0x79, 0x12, + 0x6d, 0x8c, 0x4b, 0x2c, 0x00, 0x12, 0x93, 0xa9, 0xc9, 0x9d, 0x2b, 0x97, + 0xc9, 0x1b, 0x59, 0xcf, 0xa0, 0x0b, 0xb2, 0x7b, 0x94, 0xa2, 0x84, 0x15, + 0x67, 0x59, 0xed, 0xf7, 0x79, 0x7c, 0x11, 0x0c, 0x4e, 0x0f, 0xf4, 0x57, + 0xe8, 0x35, 0x31, 0xf5, 0xd8, 0xcf, 0xeb, 0x66, 0xf8, 0x47, 0x3e, 0x86, + 0x48, 0x9a, 0x5f, 0x64, 0x9e, 0x8b, 0x8e, 0xb8, 0x36, 0xe7, 0xfc, 0xca, + 0x13, 0xa5, 0xc2, 0x3f, 0x60, 0x45, 0xfd, 0xbd, 0x7c, 0x94, 0xf8, 0xac, + 0x19, 0xc0, 0xb2, 0xde, 0xf4, 0xfd, 0xba, 0x2b, 0x75, 0x5c, 0xd4, 0x33, + 0xf5, 0xe4, 0xd4, 0x73, 0x7b, 0x35, 0x73, 0x8a, 0x11, 0x98, 0x4f, 0x13, + 0xa3, 0x8d, 0x60, 0xb5, 0x3f, 0xb1, 0x00, 0xd3, 0xa7, 0xb2, 0x98, 0x46, + 0x43, 0x40, 0x45, 0xaf, 0x0b, 0xcb, 0x41, 0xa8, 0xbe, 0xf3, 0xb3, 0x21, + 0x21, 0x76, 0xdf, 0x61, 0x98, 0x6c, 0xa3, 0x39, 0x33, 0xc0, 0x7a, 0xbd, + 0x72, 0x87, 0x6c, 0x7a, 0x1a, 0x20, 0x01, 0xc3, 0x9f, 0x31, 0xf3, 0xd8, + 0x71, 0x77, 0x61, 0x47, 0xef, 0x65, 0xeb, 0xc7, 0xa0, 0xfc, 0xd5, 0xd4, + 0x4e, 0xd0, 0x5c, 0xa1, 0x09, 0x79, 0x12, 0x6c, 0x34, 0x0c, 0xee, 0x6b, + 0x60, 0x0e, 0xab, 0x16, 0x5c, 0xa0, 0x09, 0x34, 0xdd, 0x8d, 0x18, 0xc2, + 0xe9, 0x16, 0xa1, 0x8d, 0xa2, 0x71, 0x8a, 0x95, 0xf2, 0xa0, 0x5b, 0x4c, + 0x34, 0x90, 0xba, 0x9b, 0x5c, 0xa0, 0xe0, 0x88, 0x46, 0x55, 0xc5, 0x15, + 0x89, 0xb8, 0x69, 0xcd, 0x43, 0x96, 0x69, 0xb4, 0xc5, 0x98, 0x86, 0xba, + 0x21, 0x13, 0xac, 0x22, 0x4c, 0x64, 0x6c, 0xbc, 0x76, 0x9f, 0x7c, 0xc6, + 0x5a, 0x04, 0x94, 0x94, 0x72, 0xba, 0x6f, 0xfb, 0x6d, 0xd9, 0xe3, 0x97, + 0xaf, 0xf1, 0x8d, 0x9f, 0x92, 0xb1, 0xc6, 0x2e, 0x17, 0xb9, 0xc4, 0x78, + 0x9f, 0x5b, 0x72, 0x3a, 0x22, 0xe0, 0xfb, 0x8a, 0xbe, 0xd0, 0x3d, 0x50, + 0x88, 0x07, 0xd3, 0x21, 0xb2, 0x42, 0x64, 0xb2, 0xa2, 0xa9, 0xfb, 0x27, + 0x84, 0xd0, 0xe7, 0xa1, 0x16, 0x2b, 0xe1, 0x01, 0x00, 0x37, 0xbd, 0x44, + 0x6d, 0x99, 0x21, 0x48, 0x5c, 0x3d, 0x31, 0xbe, 0x95, 0x66, 0x46, 0x8b, + 0xb1, 0xf6, 0xa8, 0xd9, 0x47, 0xf0, 0x2f, 0xf4, 0x17, 0x1d, 0x93, 0x3f, + 0x24, 0x05, 0x64, 0x41, 0x9d, 0x4b, 0xfe, 0xff, 0xb5, 0xe3, 0xf5, 0x22, + 0xdb, 0xcf, 0xfe, 0x7d, 0xf7, 0x24, 0x64, 0x78, 0xd1, 0xd6, 0xb5, 0xe0, + 0xfa, 0x05, 0x53, 0x2d, 0xca, 0x54, 0x2d, 0x9a, 0xf8, 0x1c, 0x1a, 0x61, + 0xb9, 0x3b, 0xd3, 0x5b, 0x06, 0xbb, 0x0e, 0xb2, 0x24, 0x83, 0x3b, 0x0c, + 0x57, 0x4f, 0x2d, 0xc2, 0x74, 0x6a, 0xb6, 0x7d, 0xad, 0x02, 0x66, 0xc1, + 0x67, 0x93, 0x91, 0xf4, 0x10, 0x0f, 0x1c, 0xc0, 0xc7, 0x0b, 0x74, 0x22, + 0xf2, 0xa7, 0xdd, 0xf4, 0x90, 0xda, 0x7b, 0x9f, 0xc5, 0xaf, 0x24, 0x8f, + 0x7d, 0x8a, 0xa3, 0xdf, 0xef, 0x6e, 0x7d, 0x93, 0x2f, 0xdd, 0x61, 0x99, + 0x30, 0xb4, 0x6c, 0xd0, 0xf3, 0xc9, 0x72, 0xcc, 0xf8, 0xbd, 0x66, 0xe0, + 0x8d, 0x40, 0xdf, 0xfe, 0x2e, 0x2c, 0x1f, 0x51, 0x10, 0xc7, 0x4d, 0x56, + 0x58, 0xa5, 0x54, 0xee, 0x59, 0x0f, 0x6c, 0x37, 0xca, 0xb9, 0xf2, 0x7e, + 0xe6, 0x79, 0xcf, 0x64, 0x54, 0xa3, 0x24, 0x20, 0x36, 0xc8, 0xf9, 0x7b, + 0xd4, 0x39, 0x8d, 0x09, 0xb0, 0xd8, 0x44, 0xd3, 0x97, 0x5b, 0x37, 0x8c, + 0x08, 0x51, 0x02, 0xaa, 0x5d, 0xb8, 0x0f, 0x17, 0xfb, 0xdc, 0xe1, 0xc0, + 0x3e, 0x8b, 0x7b, 0x90, 0x9f, 0xed, 0xf2, 0x03, 0x11, 0x9b, 0x23, 0x0d, + 0xfa, 0x19, 0x08, 0x3c, 0x3c, 0x69, 0x7c, 0xb9, 0xa3, 0x6a, 0x26, 0xd7, + 0xea, 0x96, 0xbd, 0x35, 0xdf, 0x84, 0xf8, 0xdb, 0x1f, 0xf8, 0x83, 0x69, + 0x8c, 0xe0, 0x8e, 0x6f, 0xf9, 0x08, 0x1b, 0x8c, 0xe9, 0xde, 0x00, 0x8c, + 0x8b, 0x6c, 0x59, 0x77, 0x9c, 0xb5, 0xf9, 0x07, 0xea, 0xe4, 0xb2, 0x95, + 0x7e, 0x69, 0xdf, 0x8e, 0x92, 0xdd, 0x2a, 0x0b, 0xac, 0xd6, 0xcd, 0x56, + 0x48, 0x5d, 0x3c, 0xc9, 0x27, 0xd0, 0xad, 0xb4, 0xcb, 0x5d, 0x76, 0xb6, + 0x40, 0x51, 0x55, 0xd6, 0xf4, 0x5a, 0xa5, 0x3d, 0x8e, 0x7b, 0x63, 0xcc, + 0x40, 0x0e, 0x85, 0xaf, 0x6b, 0xa0, 0xe1, 0xbf, 0x19, 0x20, 0xaa, 0xe9, + 0x91, 0x1c, 0x65, 0x20, 0x9b, 0x50, 0x70, 0x85, 0x79, 0x8d, 0x2e, 0x4d, + 0x8d, 0x0a, 0x44, 0x2c, 0xd9, 0x0d, 0x50, 0x2c, 0xe5, 0xca, 0xf0, 0x77, + 0xf6, 0x20, 0x28, 0x91, 0x73, 0x4c, 0xd0, 0x3d, 0x9e, 0x9c, 0x07, 0xa5, + 0x4b, 0xde, 0xac, 0x8e, 0xb4, 0x3d, 0x1a, 0x4f, 0xa1, 0x41, 0x42, 0x32, + 0xf1, 0x21, 0xd9, 0xf8, 0xf9, 0x42, 0x72, 0x08, 0xd6, 0x01, 0x7e, 0xc8, + 0x6d, 0x2a, 0xa6, 0x52, 0x4a, 0xfc, 0x30, 0x41, 0xfa, 0xc5, 0xae, 0x3b, + 0x6a, 0x24, 0xc7, 0xa0, 0xdb, 0x86, 0xfe, 0x06, 0x9a, 0xfa, 0xe4, 0xb5, + 0xac, 0xa5, 0xea, 0x68, 0x4e, 0xd6, 0x74, 0x94, 0x3d, 0xc3, 0x5e, 0x3a, + 0x30, 0xbe, 0x64, 0x12, 0xb3, 0x25, 0xa7, 0x7a, 0x1b, 0xfd, 0x56, 0x0d, + 0xcf, 0x6a, 0xa0, 0x45, 0x2a, 0xef, 0x92, 0x8e, 0x36, 0x85, 0x08, 0xa9, + 0xa3, 0xa6, 0xa2, 0xfa, 0xb8, 0x06, 0x16, 0x68, 0xa6, 0xac, 0x40, 0x5a, + 0xdd, 0xf2, 0x49, 0xaa, 0x24, 0x36, 0x46, 0xa3, 0x52, 0xf5, 0x12, 0x0c, + 0x37, 0xf2, 0x77, 0x5c, 0x81, 0x90, 0x64, 0x70, 0xb4, 0xcf, 0x55, 0x2b, + 0x23, 0x5e, 0x8d, 0x0b, 0xe3, 0x1a, 0x9e, 0x47, 0xbf, 0x0e, 0x55, 0xa5, + 0x10, 0xf2, 0x01, 0x97, 0x85, 0x19, 0x5d, 0xa8, 0x06, 0xd6, 0xe0, 0xe9, + 0xb7, 0xc1, 0x9a, 0x45, 0xab, 0xa3, 0x7b, 0xa2, 0x1f, 0x82, 0xd1, 0xe6, + 0x6f, 0xec, 0xf8, 0x1f, 0xa5, 0x66, 0xb2, 0xaf, 0x36, 0x27, 0xf1, 0x88, + 0x0a, 0x1f, 0x58, 0x5d, 0x96, 0x53, 0x9f, 0x5f, 0x96, 0x35, 0x56, 0x36, + 0x66, 0x65, 0x8f, 0x8f, 0xb6, 0xe3, 0x1b, 0xc6, 0xb7, 0xb8, 0xae, 0x46, + 0x40, 0xa8, 0xe8, 0x26, 0xdd, 0x57, 0x70, 0x66, 0xe6, 0xde, 0x1b, 0x08, + 0x44, 0x99, 0x7a, 0x70, 0x06, 0xa6, 0xb2, 0x16, 0x81, 0xd0, 0x70, 0x3c, + 0x13, 0xf3, 0x94, 0x59, 0x69, 0x15, 0x24, 0x3c, 0x50, 0xa4, 0x7e, 0x3d, + 0x3d, 0x46, 0xed, 0x56, 0x16, 0x30, 0xa3, 0xd7, 0xbd, 0x0f, 0xbb, 0x53, + 0xde, 0xdc, 0x9f, 0xec, 0x46, 0x22, 0xf1, 0xf7, 0xec, 0x3f, 0x5d, 0xaf, + 0x7d, 0x3a, 0x46, 0x9c, 0x20, 0x7d, 0x64, 0xd0, 0x49, 0xbf, 0xbe, 0x11, + 0x0e, 0x67, 0x10, 0x3f, 0x43, 0x7c, 0x9f, 0xa0, 0x12, 0x0a, 0xc6, 0xc0, + 0xfe, 0x85, 0x15, 0x85, 0x3d, 0x19, 0xd7, 0x10, 0x94, 0x6e, 0xf5, 0x82, + 0x72, 0x77, 0x69, 0x73, 0xe1, 0x19, 0x53, 0x7a, 0xff, 0x79, 0xc2, 0x79, + 0xc7, 0xaf, 0x7b, 0xf8, 0xf9, 0xa1, 0xd7, 0x48, 0xb0, 0x55, 0xcd, 0x0c, + 0xc3, 0x10, 0x09, 0x6f, 0x3e, 0xe2, 0xb6, 0xdc, 0x75, 0x35, 0xcb, 0xc7, + 0x75, 0xf4, 0x16, 0x7c, 0x56, 0xc9, 0xc7, 0xe8, 0x92, 0xcc, 0x42, 0x77, + 0x6f, 0x39, 0x47, 0x17, 0x93, 0x03, 0x10, 0xac, 0xdd, 0x84, 0xe4, 0x76, + 0xfd, 0x78, 0xf6, 0xbf, 0x15, 0x6d, 0x0c, 0x4d, 0xc9, 0x21, 0x01, 0x45, + 0xb8, 0x95, 0xce, 0x80, 0x67, 0x27, 0xb5, 0xd4, 0x56, 0x65, 0xf2, 0x93, + 0xa6, 0x31, 0x7f, 0x96, 0xdc, 0x6a, 0x3d, 0xaa, 0x60, 0xa0, 0x2b, 0xeb, + 0x92, 0x11, 0x9d, 0x82, 0x13, 0x51, 0x54, 0x6d, 0x7d, 0x9a, 0x5f, 0x86, + 0x11, 0x5b, 0x42, 0x08, 0xdc, 0x4f, 0xac, 0x5e, 0x6d, 0xc7, 0x10, 0x6d, + 0x94, 0x01, 0x11, 0x75, 0x3c, 0x39, 0x71, 0x95, 0x5f, 0x64, 0x1b, 0x6d, + 0x78, 0xe0, 0x8c, 0xfa, 0x3b, 0x22, 0xb7, 0x0f, 0x44, 0xbf, 0xc0, 0xfd, + 0x9e, 0x05, 0x54, 0x9a, 0x54, 0x05, 0xc8, 0x50, 0x3c, 0xc6, 0xea, 0xed, + 0xfd, 0x6e, 0xf5, 0x05, 0x27, 0x17, 0x91, 0xf0, 0x34, 0xee, 0x1a, 0x54, + 0xff, 0x04, 0x6b, 0x4a, 0x04, 0x6c, 0xf1, 0x15, 0x70, 0xdc, 0x9a, 0x1b, + 0x48, 0x8e, 0xea, 0xc1, 0x27, 0x11, 0xc8, 0xd6, 0x0f, 0x6e, 0xf8, 0x3c, + 0xc6, 0x3d, 0x58, 0x16, 0xf8, 0x21, 0x12, 0xdb, 0xf2, 0x34, 0xcd, 0x89, + 0x7a, 0xd0, 0x16, 0x49, 0x16, 0xd6, 0xc2, 0xed, 0x07, 0x2a, 0x54, 0xe7, + 0xb8, 0xa0, 0xff, 0x0b, 0xaf, 0x58, 0x2b, 0x50, 0xcb, 0xda, 0x8a, 0x2b, + 0x97, 0x36, 0xea, 0x39, 0xe1, 0x09, 0xa5, 0xbf, 0x6e, 0xdd, 0xd7, 0x1d, + 0x22, 0xd8, 0x95, 0x20, 0xc4, 0x9d, 0xad, 0xd7, 0x67, 0xb9, 0x98, 0xb3, + 0x8e, 0x8b, 0xa8, 0x8d, 0xed, 0xf5, 0x45, 0x9f, 0x72, 0xc8, 0x32, 0x75, + 0x08, 0x38, 0x0d, 0x19, 0xf8, 0x24, 0x85, 0x5c, 0x07, 0x16, 0xdc, 0x9f, + 0x65, 0xcb, 0x2c, 0xfc, 0xec, 0x2a, 0x50, 0xc9, 0x95, 0x4e, 0xab, 0x32, + 0x02, 0xe0, 0x6d, 0xba, 0xe4, 0x8a, 0xb7, 0x60, 0xbb, 0x4a, 0x53, 0x70, + 0x2c, 0x09, 0xf4, 0x95, 0x72, 0xc9, 0xe7, 0x4e, 0x53, 0xb3, 0xf7, 0xf3, + 0x6d, 0x4c, 0xf7, 0x1b, 0x4c, 0x89, 0xd9, 0xff, 0xc1, 0xf8, 0x62, 0x26, + 0xd4, 0xcf, 0x9f, 0x40, 0x77, 0x80, 0xd5, 0x17, 0x4b, 0x7f, 0xf7, 0xe1, + 0xbc, 0x68, 0x35, 0x39, 0x2e, 0x4d, 0xf3, 0xbc, 0x4f, 0x26, 0x5f, 0x93, + 0xed, 0xf4, 0x58, 0x60, 0x61, 0x37, 0xb7, 0x02, 0x4a, 0xb7, 0x7e, 0xab, + 0xb2, 0x4b, 0x82, 0x12, 0xd3, 0xd7, 0xc2, 0x26, 0x6b, 0x02, 0xb4, 0xc6, + 0x15, 0x45, 0xbf, 0x19, 0xb7, 0x70, 0x3f, 0xab, 0x74, 0x71, 0x95, 0x3e, + 0xd3, 0x2f, 0x25, 0x3c, 0xc8, 0xa0, 0x36, 0x19, 0xa3, 0xd6, 0x5f, 0x2c, + 0x82, 0xce, 0xc6, 0xbd, 0x41, 0xdd, 0x8f, 0x77, 0x64, 0xab, 0x33, 0xf6, + 0x33, 0xe3, 0x5c, 0x09, 0x41, 0xe1, 0xaa, 0x72, 0xf8, 0x7a, 0x86, 0x4f, + 0xab, 0x29, 0x11, 0x19, 0xb9, 0x79, 0xb6, 0x31, 0xbc, 0x95, 0x60, 0xe9, + 0x1a, 0x1f, 0xf5, 0x16, 0xf1, 0xea, 0x94, 0xaa, 0x94, 0xad, 0x09, 0x8c, + 0x40, 0xbb, 0xdd, 0xa9, 0x63, 0xf0, 0xee, 0xa0, 0x7a, 0x09, 0x1c, 0x11, + 0xa2, 0x7e, 0xd0, 0x95, 0x26, 0x75, 0x46, 0x6c, 0x68, 0x29, 0x58, 0x6e, + 0xd3, 0x99, 0xc4, 0xf1, 0xae, 0x38, 0xeb, 0xc3, 0x37, 0x10, 0x50, 0x5f, + 0x29, 0xf0, 0x03, 0x57, 0x2f, 0x3a, 0x34, 0xa3, 0x76, 0xbb, 0x2f, 0xd2, + 0x95, 0xcc, 0xd7, 0xc7, 0x42, 0x2f, 0x12, 0xdc, 0x52, 0xad, 0x64, 0x0b, + 0x2a, 0xf0, 0xaa, 0x13, 0x8d, 0x2f, 0xfa, 0xd5, 0x21, 0x70, 0x27, 0x92, + 0xbc, 0x89, 0x07, 0x80, 0x45, 0xf2, 0x05, 0x27, 0xee, 0xc0, 0x7b, 0xd8, + 0xb0, 0xa2, 0x0e, 0x87, 0x3e, 0x6e, 0x67, 0x3f, 0x5c, 0xa4, 0x72, 0xd6, + 0x9b, 0xdb, 0x57, 0xb5, 0x52, 0x03, 0xcc, 0x1f, 0x03, 0xd5, 0x30, 0x94, + 0xf6, 0x0b, 0xe6, 0xcb, 0x41, 0xa9, 0xae, 0x55, 0x93, 0x24, 0xd5, 0x48, + 0xef, 0x4e, 0x4f, 0xa5, 0xc5, 0x48, 0x3f, 0xf0, 0x66, 0xa1, 0x52, 0x25, + 0x8f, 0x1f, 0xf5, 0xb4, 0xe1, 0x73, 0x24, 0x08, 0x57, 0x2f, 0xeb, 0x53, + 0x49, 0xe0, 0x7c, 0x1d, 0x89, 0x39, 0xd7, 0xc4, 0x26, 0xe7, 0x1a, 0x01, + 0x41, 0x1c, 0x06, 0x0f, 0x8b, 0x25, 0xd7, 0x6b, 0x1f, 0xd4, 0x60, 0xd3, + 0x27, 0x53, 0x35, 0x4c, 0xb2, 0x05, 0xbe, 0xbe, 0x3c, 0x8e, 0xd0, 0xe8, + 0x24, 0x2f, 0x02, 0x9a, 0xb3, 0x27, 0x5a, 0xe6, 0xe4, 0xb1, 0x0c, 0x16, + 0x9f, 0x08, 0x55, 0x5d, 0x68, 0x95, 0xab, 0xae, 0xba, 0xb0, 0x7c, 0xb0, + 0x7e, 0xef, 0x91, 0x0d, 0x9b, 0xe1, 0xed, 0xa0, 0xa6, 0xf1, 0x79, 0x5e, + 0x2b, 0x21, 0x52, 0x2f, 0xdd, 0xc9, 0xd2, 0xc4, 0xac, 0x73, 0x5d, 0xb4, + 0x80, 0xd8, 0x9e, 0xef, 0xd4, 0xf1, 0x1b, 0xfa, 0x68, 0xff, 0x19, 0xef, + 0x9f, 0x1d, 0x83, 0x4e, 0x82, 0xac, 0x11, 0xbe, 0x81, 0x56, 0x98, 0x70, + 0xeb, 0x44, 0x2e, 0x72, 0x0c, 0xb7, 0x4f, 0xe9, 0x64, 0xb3, 0x0b, 0x8b, + 0x4a, 0x96, 0xfa, 0xb0, 0x53, 0x53, 0xb8, 0x88, 0xbf, 0x25, 0x6f, 0xe8, + 0x96, 0xe2, 0x13, 0x1e, 0xdf, 0x6c, 0x5f, 0x9a, 0x08, 0x6b, 0xb8, 0xcd, + 0x46, 0xd7, 0x94, 0x77, 0xa5, 0x31, 0x0c, 0x6e, 0x46, 0x90, 0xb8, 0xf9, + 0x01, 0xde, 0x08, 0x3c, 0xec, 0xec, 0x79, 0x2a, 0xac, 0x83, 0x94, 0x9d, + 0xbc, 0x19, 0xc5, 0x03, 0xb0, 0xd6, 0xb1, 0x27, 0xfb, 0xa1, 0xb0, 0x22, + 0x2c, 0xdb, 0x39, 0xf6, 0x51, 0x9f, 0x5e, 0xb5, 0xbb, 0x14, 0x27, 0x21, + 0xb8, 0x9e, 0xe2, 0x35, 0xa6, 0x85, 0xf2, 0xe1, 0x1c, 0x53, 0x8b, 0x6e, + 0x2d, 0xde, 0xa9, 0x32, 0x06, 0x2c, 0xe1, 0xab, 0xaa, 0x57, 0x5f, 0x0e, + 0x78, 0xab, 0x67, 0xb5, 0x6d, 0x5d, 0xd3, 0xdd, 0xe9, 0x0a, 0xf8, 0x5d, + 0x27, 0x94, 0x84, 0x4e, 0x5e, 0xcb, 0x45, 0xeb, 0xf3, 0x67, 0x83, 0xe2, + 0x69, 0x71, 0x17, 0xc1, 0x25, 0x71, 0xb3, 0x79, 0xb5, 0x15, 0x20, 0x35, + 0x51, 0x9c, 0x00, 0x10, 0xa4, 0xf7, 0xac, 0xc6, 0xd0, 0xd2, 0x28, 0x66, + 0xae, 0x21, 0xc6, 0x79, 0x6b, 0x06, 0x70, 0x2a, 0xa7, 0x2d, 0xfe, 0x38, + 0x07, 0x11, 0xf6, 0x50, 0x52, 0x0f, 0xb5, 0xc2, 0x69, 0xf9, 0x90, 0x60, + 0x34, 0x2c, 0x76, 0xe2, 0xd2, 0xe3, 0x62, 0xc3, 0xdc, 0xdc, 0x60, 0x6b, + 0xac, 0xfd, 0x82, 0xa4, 0x4c, 0x2d, 0x78, 0x09, 0xf2, 0xaf, 0xa6, 0x2b, + 0x87, 0xf1, 0x73, 0xf2, 0xca, 0xe6, 0x77, 0xea, 0xcb, 0xf5, 0x69, 0x4f, + 0xb9, 0x6d, 0xc5, 0xb7, 0x79, 0x34, 0x73, 0xd8, 0x8c, 0xf8, 0xbf, 0x18, + 0x1a, 0xd1, 0xe2, 0x91, 0x7a, 0xae, 0xe7, 0x9c, 0x62, 0x74, 0x8a, 0x27, + 0xf4, 0x27, 0x80, 0x84, 0x75, 0x91, 0x92, 0x79, 0x2e, 0x23, 0xf3, 0x2b, + 0x84, 0x52, 0x41, 0xc5, 0x7d, 0xf7, 0xe8, 0x80, 0x6f, 0x3e, 0x8e, 0x04, + 0xfd, 0x15, 0xbd, 0xc6, 0x49, 0x8d, 0x22, 0x58, 0x1f, 0x21, 0xcf, 0x5b, + 0x90, 0xdf, 0x0c, 0x15, 0xc0, 0x3a, 0xe6, 0x17, 0x1c, 0xb1, 0xf8, 0xc0, + 0x45, 0x77, 0xc3, 0x94, 0x16, 0xf7, 0x87, 0xaa, 0x11, 0x86, 0xcb, 0xb0, + 0x9f, 0x1e, 0x1a, 0x10, 0x10, 0x60, 0x0a, 0x9f, 0xb8, 0x09, 0xa7, 0x3f, + 0xaa, 0x28, 0xc9, 0x0f, 0xf3, 0x86, 0x6e, 0xbc, 0x5f, 0x74, 0xfa, 0xbe, + 0xde, 0xd4, 0xdf, 0x1e, 0xa5, 0x8a, 0xae, 0xf2, 0xe4, 0x6d, 0xfb, 0x76, + 0x34, 0xf1, 0x2c, 0x61, 0xab, 0x09, 0x0b, 0x89, 0x69, 0x59, 0x92, 0xaf, + 0xad, 0x63, 0xe0, 0xcf, 0xd4, 0x23, 0x78, 0x8c, 0x21, 0x07, 0xe8, 0x39, + 0x13, 0xfe, 0x4a, 0xb2, 0xb1, 0x99, 0x47, 0x39, 0x96, 0x96, 0x06, 0x7f, + 0x6b, 0xe4, 0xb6, 0xa3, 0xd7, 0x48, 0x5d, 0xb7, 0xfb, 0x3d, 0xdc, 0xe0, + 0xfc, 0x34, 0xb8, 0x45, 0xe1, 0x5f, 0x52, 0x14, 0x72, 0xd4, 0x35, 0x26, + 0xf2, 0x0b, 0x03, 0x63, 0x7e, 0x99, 0x06, 0x4b, 0xaf, 0x26, 0xf0, 0xc6, + 0x1f, 0xb6, 0x63, 0xc4, 0xfa, 0xd9, 0xb2, 0xed, 0x95, 0x34, 0x18, 0x42, + 0xd2, 0x55, 0xe4, 0x9d, 0xa5, 0xd7, 0x87, 0xec, 0x96, 0x79, 0x26, 0xef, + 0x10, 0x8a, 0xc7, 0xc1, 0xcf, 0xcf, 0x73, 0x90, 0x55, 0x00, 0x63, 0x9f, + 0x23, 0x94, 0xdf, 0x4c, 0x92, 0xd0, 0x5e, 0x65, 0xc7, 0x3d, 0xce, 0xbd, + 0x9c, 0xdc, 0x49, 0xb9, 0x52, 0x18, 0xd1, 0x4e, 0x93, 0x54, 0x98, 0xc8, + 0x57, 0x7d, 0x68, 0x8f, 0x2e, 0x81, 0xef, 0xc9, 0x29, 0xeb, 0xae, 0xe5, + 0x3a, 0x36, 0xc5, 0x8e, 0x68, 0x55, 0xa8, 0xda, 0x86, 0xd7, 0x45, 0x64, + 0x52, 0x25, 0x5f, 0x34, 0x12, 0x5e, 0x5f, 0x26, 0x4f, 0xb8, 0xd9, 0x64, + 0x04, 0x9f, 0x2e, 0x5a, 0x46, 0x91, 0x05, 0xfc, 0x97, 0xb0, 0x0e, 0x57, + 0x65, 0xf1, 0xe3, 0xd4, 0xe5, 0xb2, 0x08, 0x9c, 0x20, 0x1f, 0x75, 0xc1, + 0x16, 0x9d, 0x29, 0x7b, 0x61, 0x16, 0x37, 0x26, 0xc9, 0x59, 0x05, 0x61, + 0x31, 0xdc, 0xe4, 0x87, 0x15, 0x4a, 0x86, 0xdd, 0x7c, 0xe6, 0x15, 0xb6, + 0x7f, 0xda, 0xd8, 0x61, 0x69, 0x7c, 0xab, 0x25, 0x7e, 0xb7, 0x11, 0x3e, + 0xd3, 0x12, 0x23, 0x39, 0x8a, 0xc7, 0x75, 0xe1, 0xf6, 0x15, 0x3d, 0xcf, + 0x4a, 0xe0, 0xbb, 0x8c, 0xb5, 0x6e, 0xb1, 0xbd, 0xaf, 0xd1, 0x3f, 0x80, + 0xff, 0x82, 0x25, 0x91, 0x15, 0xc8, 0xf2, 0x79, 0xf9, 0xb5, 0xb8, 0xe5, + 0xb1, 0x0b, 0xf9, 0x99, 0xf4, 0x15, 0x3e, 0x72, 0x57, 0x9c, 0x2c, 0xe0, + 0x7d, 0xa2, 0x63, 0xae, 0xb4, 0x11, 0xcb, 0x8b, 0x7a, 0xce, 0x24, 0xbe, + 0x4d, 0x99, 0x82, 0x85, 0x2b, 0xfd, 0x22, 0x08, 0xfc, 0x71, 0xd9, 0xcb, + 0x0e, 0xf7, 0x32, 0xc2, 0xa3, 0x3a, 0xcb, 0xce, 0x78, 0x0b, 0xc6, 0xee, + 0x24, 0xf4, 0xb5, 0x7d, 0x25, 0x79, 0x47, 0x3e, 0x69, 0xea, 0x13, 0xc5, + 0x40, 0xaf, 0xad, 0x74, 0xfd, 0x9a, 0xa7, 0x3d, 0x95, 0x62, 0xa3, 0xdd, + 0xf0, 0x3c, 0xb4, 0xb0, 0x2b, 0x42, 0xc9, 0xe8, 0x4f, 0xe0, 0xf4, 0xb4, + 0x06, 0xf3, 0x56, 0x4d, 0x7c, 0x73, 0x8f, 0x08, 0xd0, 0xae, 0x5f, 0x99, + 0x56, 0xae, 0xf7, 0xc1, 0x15, 0xca, 0xb7, 0x3d, 0x1c, 0x74, 0x75, 0x71, + 0x41, 0xdf, 0xfb, 0x3c, 0xe4, 0x24, 0xff, 0x14, 0x80, 0x2a, 0xfe, 0xe8, + 0x88, 0xc6, 0x5e, 0x83, 0x7d, 0x27, 0xb6, 0x28, 0x10, 0x0c, 0x1f, 0xe9, + 0xc1, 0xea, 0x1b, 0xac, 0x2a, 0x56, 0x4c, 0xb7, 0x7d, 0x83, 0x12, 0xbd, + 0x24, 0x9c, 0x0b, 0x7b, 0x3c, 0xf7, 0xb1, 0x11, 0x96, 0x93, 0xfc, 0xb7, + 0x8d, 0x43, 0x45, 0xb8, 0xe6, 0xa9, 0x13, 0x64, 0x33, 0xba, 0x34, 0xd5, + 0xdc, 0x13, 0x80, 0x7f, 0xb6, 0x0e, 0x7e, 0xea, 0xfc, 0x37, 0x37, 0xfb, + 0xe9, 0xf8, 0x5e, 0x73, 0xa9, 0x9a, 0xea, 0x38, 0x4d, 0xb7, 0x8a, 0x01, + 0x85, 0xbe, 0x0f, 0xf0, 0xbd, 0xfd, 0x5a, 0x92, 0xac, 0xbb, 0x1c, 0x75, + 0xb4, 0x60, 0x0c, 0xb7, 0xe0, 0x98, 0x3d, 0x13, 0x3d, 0x59, 0xb2, 0x06, + 0x4c, 0xaf, 0x8d, 0xd8, 0x50, 0x42, 0x9b, 0xf7, 0xa1, 0xfe, 0xab, 0xdb, + 0x56, 0x05, 0xed, 0xd2, 0x23, 0xa6, 0x79, 0x7a, 0xbc, 0x23, 0x26, 0x20, + 0x2f, 0xde, 0xe1, 0x3e, 0x04, 0x86, 0xe1, 0xcf, 0xc4, 0x0b, 0x8e, 0x34, + 0x01, 0xb2, 0xcb, 0x96, 0xba, 0x51, 0x28, 0xf7, 0xd7, 0x52, 0x2d, 0x40, + 0x9d, 0x7b, 0xac, 0x8f, 0x34, 0xfa, 0xc6, 0xf3, 0x29, 0x03, 0x8c, 0x5a, + 0x08, 0x3f, 0x0d, 0x20, 0x03, 0xbe, 0xc3, 0xe3, 0x46, 0x5d, 0xf9, 0xe8, + 0xe4, 0xd9, 0xeb, 0x48, 0xd3, 0xce, 0x77, 0xf0, 0x46, 0x89, 0xfb, 0x55, + 0xfd, 0x21, 0xcf, 0x48, 0x85, 0x7b, 0x22, 0xae, 0x01, 0x40, 0xf3, 0xa8, + 0xe3, 0x49, 0xa5, 0x39, 0x81, 0xbc, 0x5b, 0x8e, 0x0a, 0x2c, 0x0f, 0x32, + 0x38, 0xab, 0x16, 0x28, 0x89, 0xc3, 0x7d, 0xf6, 0x83, 0x08, 0xfe, 0xd7, + 0xe8, 0xf2, 0xc5, 0x5b, 0x4e, 0x45, 0x6a, 0x6b, 0x06, 0xd0, 0x48, 0x41, + 0x8e, 0xd5, 0x07, 0x74, 0x21, 0x18, 0x48, 0xec, 0x3e, 0x06, 0xcc, 0x49, + 0x0f, 0xf7, 0x16, 0x0e, 0x86, 0xb4, 0x28, 0x83, 0xa2, 0xf2, 0x3b, 0x7b, + 0xb2, 0xe1, 0x1c, 0x52, 0xac, 0x34, 0xc7, 0xf4, 0x4f, 0x77, 0x55, 0x34, + 0xa0, 0x17, 0x59, 0xf8, 0x1a, 0xde, 0xcd, 0x02, 0x8c, 0xd6, 0x3f, 0x8d, + 0xcf, 0xd4, 0x6e, 0x50, 0x45, 0x83, 0xbd, 0xa4, 0xb1, 0x9d, 0x4a, 0xc9, + 0xd1, 0xd4, 0xb4, 0xcc, 0x64, 0xf4, 0x0c, 0x68, 0xfa, 0xad, 0x98, 0xfc, + 0x8d, 0x06, 0xa9, 0x73, 0x6f, 0x89, 0xfb, 0x13, 0x04, 0x85, 0x07, 0x6d, + 0x32, 0xe9, 0x92, 0xfd, 0x1d, 0xb9, 0x6f, 0xd4, 0x0d, 0x0a, 0xbb, 0x14, + 0x38, 0x33, 0x08, 0xc5, 0x7c, 0x12, 0x58, 0x91, 0xda, 0x24, 0x91, 0x67, + 0x58, 0x68, 0x2a, 0x90, 0x02, 0x67, 0x89, 0x53, 0xa7, 0x52, 0xc9, 0x4b, + 0x7c, 0x5a, 0x65, 0x78, 0x5f, 0x37, 0x2c, 0xaf, 0xfc, 0x50, 0xc1, 0xb3, + 0xfd, 0x71, 0xd6, 0x74, 0x74, 0x53, 0x7a, 0x56, 0xa7, 0x4d, 0x6a, 0xe3, + 0xdb, 0x1f, 0x37, 0xbb, 0xcd, 0xb8, 0x52, 0xf9, 0x55, 0x42, 0x8e, 0xc9, + 0x7b, 0x46, 0xf0, 0xb8, 0x81, 0xdb, 0x6e, 0xc7, 0xef, 0xa4, 0xdd, 0xfa, + 0x07, 0xe9, 0xa6, 0x73, 0x82, 0xf8, 0xb6, 0x71, 0x82, 0x99, 0x00, 0xe6, + 0xfd, 0x2c, 0x29, 0xcf, 0x93, 0x2d, 0xa2, 0x93, 0x66, 0xf8, 0x4b, 0xcc, + 0x94, 0x2e, 0xe0, 0x48, 0x86, 0xa4, 0x82, 0x9f, 0x56, 0xe0, 0xa3, 0xdb, + 0xe7, 0xf6, 0x4b, 0xa1, 0x9b, 0x6a, 0xbb, 0x41, 0x66, 0x26, 0x1f, 0x81, + 0x4c, 0x9a, 0xaa, 0xe4, 0xb2, 0x36, 0x39, 0x4e, 0x7d, 0xb6, 0x01, 0xa6, + 0xb1, 0x1f, 0x20, 0xfe, 0xf4, 0x47, 0x6b, 0x40, 0xe5, 0x5e, 0x28, 0x52, + 0x7a, 0xf5, 0xbf, 0xa0, 0x48, 0x5e, 0x3e, 0x72, 0xd1, 0x2e, 0x50, 0x38, + 0xeb, 0x12, 0x1f, 0x16, 0xee, 0x65, 0x15, 0x9a, 0x93, 0xb7, 0x40, 0x5c, + 0x3c, 0x74, 0x64, 0xa9, 0xfb, 0x94, 0x2d, 0xab, 0x5d, 0x2f, 0x9b, 0x8f, + 0xb1, 0xc4, 0x4a, 0xa3, 0xe0, 0xe9, 0x6d, 0x60, 0xef, 0x37, 0xd1, 0x30, + 0xda, 0xad, 0xb4, 0x60, 0x7b, 0x20, 0x9b, 0x17, 0x5e, 0xa5, 0x7f, 0x8d, + 0xd0, 0xe4, 0xea, 0x24, 0xb1, 0xfd, 0x8d, 0x01, 0x15, 0x09, 0x60, 0xbb, + 0xa2, 0x18, 0x59, 0x54, 0x7a, 0xf8, 0x2f, 0x98, 0x19, 0x35, 0x89, 0xfa, + 0xae, 0x27, 0xf5, 0x97, 0xfb, 0x10, 0xb8, 0xbe, 0x6e, 0x64, 0x3a, 0xd3, + 0x47, 0xb3, 0x52, 0xd9, 0x47, 0x72, 0xd9, 0x46, 0xce, 0x7f, 0x0a, 0xe8, + 0x83, 0x17, 0xaf, 0x40, 0x57, 0xf5, 0xa0, 0x9d, 0x30, 0x3f, 0x22, 0x45, + 0x00, 0x62, 0x15, 0x2f, 0xa0, 0xbf, 0x64, 0xb9, 0xcc, 0x39, 0xc1, 0x28, + 0xae, 0xc8, 0x87, 0x2d, 0xdd, 0xdf, 0x1d, 0x18, 0x4c, 0xec, 0x31, 0xc3, + 0xfb, 0x24, 0x2f, 0x73, 0xd4, 0x74, 0xda, 0xd6, 0x55, 0x5c, 0xbe, 0x01, + 0xe3, 0x5a, 0x17, 0x10, 0xce, 0x11, 0x87, 0xfc, 0xcf, 0xbd, 0x5d, 0x46, + 0x3e, 0xc4, 0x57, 0x74, 0x7a, 0x6e, 0x4c, 0xe3, 0x47, 0x5b, 0xac, 0xd6, + 0x92, 0xc5, 0x81, 0xdd, 0x43, 0x82, 0xec, 0x93, 0xb0, 0xca, 0xf7, 0x05, + 0xf9, 0x80, 0xb3, 0xce, 0xad, 0xa8, 0x6b, 0x30, 0x98, 0x21, 0x2a, 0x91, + 0xaa, 0xb2, 0x44, 0xd4, 0xdc, 0xd5, 0xb0, 0x35, 0x82, 0xba, 0x04, 0xb1, + 0x8c, 0x6a, 0x74, 0x3a, 0x05, 0x18, 0x54, 0x8f, 0x7a, 0xe8, 0x12, 0x3b, + 0xee, 0xb2, 0x56, 0x04, 0x5e, 0xda, 0x3e, 0x75, 0x51, 0xfe, 0xff, 0x71, + 0x11, 0xd4, 0x09, 0x96, 0x5c, 0x9f, 0xb9, 0xdc, 0x5d, 0xfb, 0xcf, 0x7e, + 0x92, 0x5d, 0xcb, 0xa5, 0x0d, 0xc0, 0x20, 0xbd, 0xe1, 0xf2, 0x5d, 0x59, + 0x2b, 0x2a, 0xe4, 0x31, 0x13, 0xbc, 0x77, 0xd6, 0x5c, 0x47, 0xa6, 0x75, + 0xf6, 0xb1, 0xd3, 0xa9, 0x7a, 0xac, 0x36, 0x28, 0x65, 0x75, 0x73, 0xa8, + 0x45, 0x1d, 0xb7, 0x7b, 0x6e, 0xe7, 0x3c, 0xb9, 0xfd, 0x71, 0x6b, 0xb9, + 0xb0, 0xd4, 0xcb, 0x06, 0x20, 0xc5, 0xce, 0x87, 0xdb, 0x03, 0xfa, 0x4c, + 0xe5, 0x54, 0x43, 0xbf, 0xa9, 0x93, 0xb6, 0xbf, 0xc2, 0xd8, 0x9e, 0x2b, + 0xc9, 0x08, 0xc5, 0xb4, 0xe2, 0x6a, 0x92, 0x8f, 0x1b, 0x8b, 0x88, 0x5e, + 0xca, 0xfa, 0x72, 0xf4, 0x4d, 0xf4, 0xa2, 0xb7, 0x1f, 0x7d, 0x1c, 0xdd, + 0xcb, 0x57, 0x62, 0xf4, 0x5b, 0x0c, 0x15, 0x8e, 0x9d, 0x35, 0xe0, 0x5a, + 0x04, 0xd1, 0xa3, 0x34, 0x61, 0xac, 0xfa, 0x97, 0xb9, 0xf2, 0x3b, 0x63, + 0xa1, 0x9e, 0xe8, 0x60, 0xad, 0xa9, 0x86, 0x5e, 0x51, 0xb8, 0x77, 0xf8, + 0x89, 0x02, 0x70, 0x5b, 0x5c, 0xfb, 0x98, 0x53, 0xad, 0x73, 0xdf, 0xb1, + 0x4b, 0xc3, 0x90, 0xd8, 0xae, 0x2e, 0x8a, 0xa2, 0x75, 0x2f, 0x8a, 0xb4, + 0xef, 0xc2, 0x0f, 0x05, 0xe2, 0xb0, 0xa6, 0xf6, 0x3b, 0x38, 0xe6, 0x9f, + 0x3a, 0x98, 0xa1, 0x47, 0x7d, 0x20, 0xf1, 0xa3, 0x6f, 0xb1, 0x6d, 0x33, + 0xc0, 0x8f, 0x48, 0xd9, 0x3e, 0x27, 0x5f, 0xb2, 0xe8, 0x4e, 0x51, 0xe1, + 0xf1, 0x8c, 0x5e, 0x58, 0x56, 0xe9, 0x85, 0xab, 0x0d, 0x25, 0xbe, 0x46, + 0x7e, 0xb7, 0x71, 0x62, 0x16, 0xe0, 0x6b, 0x5f, 0x22, 0xc9, 0x8a, 0x45, + 0x1f, 0xbf, 0xb6, 0x7f, 0x49, 0x12, 0x93, 0x59, 0x87, 0xe1, 0xb3, 0xd2, + 0xbc, 0x98, 0xa1, 0x71, 0xf5, 0x9f, 0x8c, 0xa8, 0x88, 0xd1, 0x09, 0x8e, + 0x9d, 0xfc, 0x3e, 0xd4, 0x61, 0x8a, 0xbb, 0x44, 0xa6, 0xc3, 0x8c, 0xf6, + 0x61, 0x37, 0x42, 0xd8, 0x05, 0x84, 0x8c, 0xa3, 0x18, 0xb8, 0x1c, 0xca, + 0xcb, 0x3a, 0xc7, 0x9d, 0xaa, 0xfd, 0xae, 0xbd, 0x1f, 0xbe, 0xc2, 0xf2, + 0xe9, 0xc6, 0xed, 0x6d, 0x8f, 0x85, 0x82, 0x45, 0xf4, 0x23, 0x5d, 0xf6, + 0x95, 0x42, 0x13, 0x1b, 0x7e, 0xb7, 0xad, 0xdf, 0xb8, 0x10, 0xac, 0xdc, + 0xa4, 0xfc, 0xae, 0xbf, 0x10, 0x21, 0x52, 0x79, 0x0d, 0xee, 0x4d, 0x59, + 0xbc, 0x07, 0x1f, 0x5b, 0x45, 0x96, 0x2d, 0x27, 0xcf, 0x5d, 0x31, 0x1a, + 0x1b, 0xdc, 0xde, 0xbc, 0xd9, 0xea, 0xfa, 0xe6, 0x02, 0xca, 0xcb, 0xb8, + 0x0a, 0xd3, 0xfc, 0x61, 0xb0, 0x80, 0x7f, 0xc0, 0x08, 0x4c, 0x0e, 0xcf, + 0x01, 0x8b, 0xac, 0x06, 0x84, 0x4b, 0xa1, 0xbb, 0x96, 0x25, 0xe2, 0xc1, + 0xd0, 0x43, 0xe2, 0xa1, 0x5e, 0x1e, 0x85, 0x26, 0x11, 0x33, 0xd6, 0xe1, + 0x2b, 0xe5, 0x08, 0x9a, 0x14, 0x5b, 0x9e, 0x88, 0xe8, 0x14, 0x02, 0x48, + 0x37, 0x1a, 0x0f, 0x14, 0x68, 0x22, 0xe1, 0x22, 0x94, 0xd0, 0x44, 0x77, + 0xcf, 0xf6, 0xc4, 0x81, 0x46, 0x84, 0x67, 0xdf, 0xb2, 0xcf, 0x7f, 0xf2, + 0x5f, 0x6e, 0x98, 0x24, 0xfa, 0xc9, 0xd7, 0x05, 0x41, 0x1a, 0xdf, 0x7d, + 0xfa, 0x4e, 0xff, 0xa2, 0x24, 0xb5, 0x95, 0x73, 0x32, 0xbc, 0xab, 0x7b, + 0x9b, 0x7e, 0xba, 0x31, 0xde, 0xba, 0x31, 0xaa, 0x2b, 0x63, 0xa6, 0x6e, + 0xf6, 0xa4, 0xe6, 0x62, 0x94, 0x98, 0xc1, 0x1c, 0x21, 0x61, 0x13, 0xdf, + 0xba, 0x76, 0x77, 0xcc, 0x68, 0x02, 0xaf, 0x60, 0x8a, 0xd8, 0xf1, 0x07, + 0x22, 0x85, 0xef, 0x9a, 0x76, 0xf0, 0x12, 0x35, 0x03, 0x7e, 0xf9, 0x83, + 0xd9, 0x2c, 0xa6, 0x46, 0x11, 0xd3, 0xdc, 0xf1, 0x86, 0x2b, 0x3f, 0xe5, + 0xb3, 0xbf, 0x06, 0xcd, 0xcf, 0xaa, 0x63, 0x47, 0x38, 0x05, 0x74, 0x7d, + 0xc7, 0xd0, 0x7d, 0x0f, 0xf3, 0x87, 0xf5, 0x38, 0x7c, 0xbb, 0xa9, 0xcb, + 0xb9, 0x40, 0xaf, 0xdd, 0x0c, 0x04, 0x5d, 0xca, 0x0d, 0xbf, 0xc6, 0x0c, + 0x01, 0x0d, 0xae, 0x24, 0x65, 0x84, 0x64, 0x15, 0x41, 0xa2, 0x29, 0x8a, + 0xb3, 0x9c, 0x8e, 0x24, 0x13, 0xff, 0x9f, 0x70, 0x60, 0x93, 0xfd, 0x30, + 0x2d, 0x38, 0x1b, 0xb8, 0x68, 0x4d, 0x85, 0x01, 0x2c, 0x24, 0x17, 0xda, + 0x6f, 0x06, 0x5f, 0x2d, 0x25, 0xa6, 0xf4, 0x5d, 0x16, 0xd2, 0xab, 0x67, + 0x80, 0x37, 0x1f, 0xef, 0x68, 0x80, 0x9b, 0x26, 0x80, 0x56, 0x00, 0x2f, + 0x5e, 0xb2, 0x22, 0x5f, 0x3c, 0x6c, 0xbf, 0x44, 0x1b, 0x2e, 0x35, 0x66, + 0x21, 0xf4, 0x44, 0x62, 0x57, 0xd2, 0xdb, 0xc4, 0x65, 0x66, 0x3e, 0xe4, + 0xbd, 0xeb, 0x06, 0xe5, 0xca, 0xed, 0x9a, 0xfd, 0x12, 0x6e, 0x02, 0x1b, + 0xdf, 0x8b, 0x09, 0xf7, 0xc1, 0xdc, 0x9a, 0x9d, 0xc5, 0x8d, 0xe0, 0xfc, + 0xe1, 0x79, 0xa7, 0xb3, 0x63, 0x4d, 0x1e, 0x5c, 0xe8, 0x52, 0x18, 0x2e, + 0x2d, 0x25, 0x92, 0x9e, 0xc0, 0x02, 0xa9, 0xc2, 0xdd, 0x68, 0x66, 0xb1, + 0x8e, 0xfd, 0xdf, 0xd1, 0x95, 0x97, 0x30, 0xb9, 0x5f, 0xda, 0xf1, 0x74, + 0x25, 0x1e, 0x10, 0xd4, 0xe1, 0x77, 0x6f, 0x9a, 0x68, 0xd5, 0x0d, 0x58, + 0x06, 0x77, 0x75, 0xe0, 0xe8, 0x9f, 0xe2, 0xff, 0xe6, 0x8a, 0xe3, 0x11, + 0xb6, 0x02, 0xf8, 0xbd, 0x75, 0x01, 0x20, 0xd3, 0x27, 0xa4, 0x14, 0xd2, + 0x7c, 0x6b, 0x81, 0x9a, 0x7a, 0x8a, 0x72, 0xf1, 0xea, 0x3a, 0xb4, 0x8f, + 0xae, 0xa9, 0x8d, 0x5f, 0x91, 0xd7, 0xfc, 0xbc, 0x96, 0xa7, 0xac, 0x84, + 0x5d, 0x10, 0xea, 0xef, 0xfa, 0x66, 0x43, 0x9f, 0xf3, 0x9f, 0xcd, 0x2c, + 0x9a, 0xfc, 0x6b, 0x2d, 0xf0, 0x47, 0xbf, 0xd1, 0x0e, 0x6c, 0xc7, 0xe8, + 0x97, 0xa0, 0x50, 0x76, 0x8b, 0x61, 0xd1, 0xcc, 0xa0, 0xaa, 0x96, 0x71, + 0x4e, 0xfb, 0xe1, 0xe7, 0xe0, 0xf3, 0xe6, 0x67, 0xe3, 0xe5, 0x84, 0x76, + 0x3e, 0xa9, 0x60, 0xb5, 0xb1, 0x46, 0x95, 0x97, 0xef, 0xd9, 0x86, 0x41, + 0x50, 0x44, 0x9f, 0x3b, 0xfd, 0x1c, 0x29, 0x0f, 0x70, 0x54, 0x65, 0xeb, + 0xe5, 0xc3, 0x7c, 0x20, 0x5a, 0xfe, 0xb6, 0x86, 0xcd, 0xf0, 0x52, 0xe9, + 0x4f, 0x97, 0xd9, 0x22, 0xd2, 0x8b, 0x5a, 0x2c, 0xae, 0x57, 0x61, 0xdf, + 0x63, 0x41, 0xb5, 0x7b, 0xa5, 0xdf, 0x3d, 0x03, 0xb0, 0x16, 0xf1, 0xde, + 0x09, 0xf2, 0x43, 0xd6, 0xb9, 0x65, 0x45, 0x7c, 0x35, 0x9c, 0x33, 0x65, + 0x1e, 0xf3, 0x4a, 0xc1, 0xc3, 0x68, 0xc9, 0x98, 0x64, 0x3e, 0x77, 0xf2, + 0x03, 0x42, 0x7a, 0x8b, 0xe7, 0x9f, 0x87, 0x2f, 0xd1, 0xf0, 0x90, 0xd3, + 0x4b, 0xe4, 0xb6, 0xc3, 0xcf, 0x77, 0x1b, 0x28, 0x5e, 0xf2, 0x19, 0xd8, + 0xf5, 0x47, 0x01, 0x59, 0xf1, 0x2b, 0x5c, 0x6f, 0xb4, 0x0f, 0x85, 0x4c, + 0x7b, 0x0c, 0xfb, 0x96, 0x30, 0x40, 0x19, 0x53, 0x5e, 0x17, 0x43, 0xbd, + 0xef, 0xdc, 0xb6, 0x40, 0xe4, 0xf3, 0xd2, 0x0a, 0xf7, 0xa3, 0x72, 0x2e, + 0xde, 0x8c, 0xef, 0x46, 0x55, 0x06, 0xa2, 0xde, 0xfb, 0x41, 0x3a, 0xa0, + 0xb8, 0x64, 0x4b, 0x7f, 0xed, 0xdf, 0x1e, 0x8e, 0x57, 0xea, 0x49, 0xac, + 0x18, 0x22, 0xbc, 0x4d, 0xc7, 0x70, 0xe3, 0x7d, 0xbd, 0x65, 0x93, 0x9f, + 0xfa, 0x62, 0xa1, 0x6e, 0x2f, 0xfd, 0x5f, 0x23, 0xf9, 0xb5, 0x75, 0x6d, + 0x8c, 0xfb, 0xfe, 0x41, 0x12, 0xee, 0xcd, 0x42, 0x27, 0x5e, 0xb8, 0x77, + 0x18, 0x8d, 0xee, 0xf2, 0xd9, 0xd2, 0x4a, 0x57, 0x16, 0x8e, 0xd3, 0xd8, + 0x2f, 0xa1, 0x02, 0x6f, 0x2b, 0x89, 0x31, 0x47, 0x27, 0x72, 0xbe, 0x01, + 0xbb, 0x31, 0xc2, 0x7e, 0x4e, 0x25, 0x3a, 0x0e, 0xfb, 0xad, 0xe6, 0x9c, + 0xa7, 0xff, 0xab, 0x39, 0x73, 0xdb, 0x7b, 0x8c, 0x2d, 0x6a, 0x15, 0xf1, + 0xb3, 0x40, 0x8e, 0x67, 0x09, 0x00, 0xbf, 0x95, 0xe0, 0x8a, 0x2a, 0x93, + 0x75, 0xf9, 0x67, 0x6f, 0x70, 0x62, 0x07, 0x7f, 0x0d, 0x4e, 0x1a, 0xf2, + 0xa1, 0x7a, 0x3e, 0xba, 0x80, 0xfb, 0xd2, 0x9e, 0x69, 0xee, 0xf3, 0xad, + 0x21, 0xb4, 0x46, 0xc2, 0xcc, 0xec, 0x45, 0x1e, 0xe1, 0xd3, 0x17, 0xf7, + 0x6f, 0x27, 0xbe, 0x02, 0x42, 0x57, 0x9f, 0xea, 0x19, 0x53, 0xf4, 0x8c, + 0x90, 0xb2, 0x8c, 0x99, 0x04, 0xc7, 0xe4, 0x96, 0xfe, 0x6a, 0x84, 0x23, + 0x60, 0x96, 0x79, 0x7f, 0x40, 0xa0, 0xcf, 0x77, 0x0d, 0xd7, 0x77, 0xb6, + 0xc3, 0xbb, 0xde, 0x50, 0xc0, 0xd4, 0x78, 0x7e, 0xf0, 0xaf, 0x5e, 0xd1, + 0x95, 0x92, 0x62, 0x44, 0xa4, 0xef, 0x2e, 0x25, 0xc0, 0x82, 0x0f, 0xf4, + 0x2f, 0xee, 0xcf, 0x17, 0xb6, 0x2d, 0x4a, 0x3f, 0xcd, 0x5f, 0x8e, 0x1d, + 0xc1, 0x4f, 0x38, 0xff, 0xcc, 0x9d, 0xad, 0xdf, 0x39, 0x41, 0x62, 0x86, + 0x67, 0x32, 0x37, 0xa8, 0x47, 0xd4, 0x12, 0x65, 0xaa, 0x7a, 0xd0, 0x61, + 0x70, 0xcf, 0x35, 0x9e, 0x9b, 0x11, 0x5b, 0xaf, 0xb3, 0x00, 0x8a, 0x8e, + 0xe3, 0xa8, 0x55, 0x84, 0xcc, 0xd9, 0xa1, 0x7e, 0xa6, 0x9d, 0x02, 0x5e, + 0xa6, 0x0c, 0x08, 0xd0, 0x24, 0x13, 0x95, 0x83, 0x1a, 0x06, 0xcc, 0x4a, + 0x76, 0x73, 0xed, 0x5a, 0x66, 0x8f, 0x5c, 0x0a, 0x3e, 0x45, 0x06, 0x8f, + 0x01, 0xff, 0x1d, 0x40, 0x51, 0xd0, 0xc3, 0x05, 0x48, 0x2b, 0xdf, 0xaa, + 0x25, 0x85, 0xd2, 0xbe, 0x98, 0xcd, 0x97, 0x80, 0x89, 0x79, 0xad, 0x51, + 0xb0, 0xd6, 0x88, 0xd3, 0x82, 0x29, 0x09, 0x5d, 0xce, 0x0e, 0x1b, 0xf1, + 0x8b, 0xf2, 0xb1, 0x18, 0x7e, 0x69, 0x7f, 0xac, 0x07, 0xb7, 0x6c, 0xc8, + 0x02, 0x98, 0x1c, 0x1e, 0x3c, 0x60, 0xdb, 0x3d, 0x4a, 0x02, 0x02, 0x8a, + 0x70, 0x1e, 0x04, 0x55, 0x67, 0xc9, 0xb1, 0x33, 0xf7, 0x20, 0x5a, 0x43, + 0x6a, 0xd4, 0xc1, 0x97, 0x27, 0x6b, 0x27, 0x4b, 0x54, 0x33, 0xc4, 0xf7, + 0x8f, 0x81, 0x00, 0x7c, 0xf0, 0xc8, 0x14, 0x88, 0xae, 0xbf, 0xf3, 0xd3, + 0xf2, 0x45, 0x8f, 0x94, 0x41, 0xd6, 0xa5, 0xe5, 0x7c, 0x1e, 0x5e, 0x4c, + 0x58, 0x5f, 0x61, 0xa7, 0x99, 0x31, 0x37, 0x43, 0x38, 0x69, 0x1c, 0x6a, + 0x0d, 0xc0, 0xe4, 0xff, 0xda, 0x33, 0xaf, 0x0a, 0x65, 0xee, 0x9d, 0x00, + 0xf6, 0xb8, 0xbc, 0x95, 0x63, 0xea, 0x46, 0x2e, 0x4b, 0x3f, 0x8a, 0xf3, + 0xb0, 0xa7, 0x84, 0x35, 0x2e, 0x04, 0x04, 0x68, 0x3f, 0x0a, 0xbb, 0x07, + 0x09, 0xfa, 0x11, 0x9e, 0xb0, 0xd1, 0xae, 0x05, 0x3a, 0x57, 0x62, 0x14, + 0x20, 0x03, 0xce, 0x52, 0xa2, 0xf9, 0x92, 0x71, 0xfd, 0x09, 0xeb, 0x69, + 0xaa, 0x1b, 0xf8, 0xb7, 0x3d, 0x3c, 0x21, 0x7f, 0x21, 0x63, 0xab, 0x76, + 0x26, 0x36, 0xa2, 0xf7, 0x61, 0x90, 0x60, 0xc1, 0xeb, 0x05, 0x1c, 0x16, + 0x83, 0x32, 0x07, 0x4a, 0xc0, 0x39, 0x52, 0xab, 0x8c, 0x05, 0x70, 0xc1, + 0x3c, 0x62, 0xa9, 0x65, 0x4f, 0x4c, 0x92, 0xfc, 0x1a, 0x55, 0xa4, 0xb9, + 0x20, 0x33, 0x6e, 0x72, 0xa7, 0xa2, 0x3d, 0x2d, 0xda, 0xc2, 0x39, 0x39, + 0x38, 0x9d, 0xb3, 0xbb, 0x5e, 0x6d, 0x98, 0x63, 0x1f, 0xaa, 0xcf, 0x9f, + 0xaa, 0x33, 0x98, 0x3d, 0xf2, 0x7f, 0x14, 0xf9, 0xc3, 0xb2, 0xa6, 0x10, + 0xc5, 0x95, 0x8b, 0xe6, 0xa9, 0xcc, 0x08, 0x74, 0x9d, 0xf8, 0xa4, 0x28, + 0x73, 0x9e, 0x10, 0x71, 0x3c, 0x94, 0xd7, 0x7e, 0xae, 0xfb, 0x61, 0x9b, + 0x77, 0x19, 0x8e, 0x2b, 0xee, 0x28, 0x94, 0xa8, 0xea, 0xc8, 0x68, 0x67, + 0x76, 0xb5, 0x33, 0xbd, 0x20, 0xc0, 0x08, 0x46, 0xde, 0xca, 0x86, 0x24, + 0xfd, 0xcc, 0x59, 0xcb, 0x28, 0x04, 0x37, 0x6d, 0x1e, 0x18, 0x53, 0x0d, + 0x97, 0x55, 0x74, 0x50, 0x32, 0x7b, 0xfb, 0x1e, 0x12, 0x73, 0x3a, 0xa1, + 0x08, 0xde, 0xa2, 0x51, 0x0e, 0x8e, 0x54, 0x7c, 0x86, 0xa4, 0xda, 0x10, + 0xaa, 0xc1, 0x96, 0x63, 0xef, 0xa5, 0xe7, 0x9e, 0x5c, 0x3d, 0x43, 0x93, + 0x67, 0x6a, 0x0b, 0xae, 0x48, 0x86, 0xe5, 0xd1, 0x5c, 0x43, 0x94, 0xcd, + 0x2e, 0x90, 0x62, 0xe8, 0xfc, 0xb9, 0xc2, 0x40, 0x99, 0x23, 0xd1, 0x9b, + 0x6c, 0xfd, 0x7b, 0xec, 0x8e, 0x1b, 0xac, 0xd4, 0xe8, 0xe6, 0x61, 0xe8, + 0x5e, 0x55, 0x5d, 0x8d, 0x78, 0xd4, 0x38, 0x0a, 0x0d, 0x30, 0x04, 0x25, + 0x3f, 0x2e, 0xcc, 0x2b, 0xc0, 0x8a, 0x23, 0x5e, 0x17, 0x3b, 0x33, 0x76, + 0xe4, 0x66, 0x7b, 0x88, 0x19, 0x8f, 0x65, 0xe6, 0xaf, 0xc4, 0x9a, 0x22, + 0x46, 0x2b, 0x35, 0x60, 0xbc, 0x0d, 0xb4, 0xbc, 0xa1, 0x33, 0xdf, 0xb8, + 0xd7, 0x94, 0x1b, 0xb0, 0xb9, 0x4f, 0xc9, 0x2e, 0x79, 0xba, 0x08, 0x64, + 0x52, 0xaf, 0x89, 0x18, 0xee, 0x95, 0xba, 0xcf, 0x9f, 0x56, 0xa5, 0x8f, + 0xba, 0xa2, 0x73, 0x5d, 0x9a, 0x33, 0x0b, 0xfe, 0x38, 0x11, 0x02, 0xa6, + 0x28, 0xf0, 0xce, 0xff, 0x6e, 0xaa, 0xdf, 0x3c, 0xf7, 0x5c, 0xc2, 0xd1, + 0x8a, 0x07, 0x1a, 0x24, 0xd1, 0x7f, 0x0c, 0xbf, 0x45, 0x9e, 0x41, 0x4f, + 0x66, 0x97, 0x19, 0x23, 0xa3, 0xbe, 0x9e, 0x81, 0x42, 0x79, 0x70, 0xa9, + 0x84, 0x24, 0x8d, 0x52, 0x5b, 0x01, 0x3e, 0xb3, 0x13, 0x54, 0xee, 0xc8, + 0xbb, 0x4f, 0x25, 0x4e, 0xbc, 0xec, 0x4c, 0xd5, 0x68, 0xeb, 0x09, 0xf8, + 0x4a, 0xcc, 0xea, 0x5b, 0xab, 0x5d, 0x32, 0xa2, 0xee, 0xdc, 0xe2, 0xf5, + 0x89, 0x89, 0x84, 0xfe, 0x5a, 0x4e, 0x11, 0x82, 0x54, 0xb2, 0xb8, 0xf1, + 0xf0, 0x45, 0xd9, 0x6b, 0xde, 0x1e, 0xf4, 0x70, 0x53, 0x13, 0xa9, 0xfd, + 0x60, 0x83, 0x70, 0xae, 0xbe, 0xe5, 0x6f, 0xdc, 0xe4, 0x0a, 0xb1, 0x45, + 0x13, 0x7d, 0xb7, 0x27, 0x45, 0x3a, 0x0a, 0xbd, 0x77, 0x1d, 0x68, 0x33, + 0xdb, 0x59, 0xff, 0xa8, 0x12, 0x14, 0x2d, 0xfa, 0x6d, 0xc1, 0xcc, 0x06, + 0xb8, 0x7b, 0xc2, 0xa3, 0xe4, 0x8b, 0x80, 0x97, 0x00, 0x38, 0x80, 0xf5, + 0xa2, 0xda, 0xf7, 0x50, 0xd9, 0x52, 0x6d, 0x5a, 0x22, 0xb9, 0xcf, 0xa1, + 0x07, 0x5a, 0x9c, 0xa0, 0xbe, 0xb7, 0x55, 0x08, 0x0e, 0x52, 0x58, 0x26, + 0x4b, 0x8b, 0xc4, 0xc3, 0x57, 0x3f, 0xde, 0x9a, 0x9f, 0x95, 0xd8, 0xc2, + 0x6d, 0xea, 0x41, 0x06, 0xf8, 0x0c, 0x4b, 0x85, 0xac, 0x96, 0x16, 0x87, + 0x4b, 0xf5, 0xa8, 0x97, 0x58, 0x88, 0x76, 0xaa, 0x94, 0x3f, 0x30, 0x4b, + 0x81, 0x54, 0xf6, 0x40, 0x1b, 0x64, 0xa4, 0x89, 0x5a, 0x9f, 0x6b, 0x74, + 0x75, 0x5a, 0xa9, 0x57, 0x0b, 0x8f, 0xce, 0xcd, 0x5a, 0x97, 0x6f, 0x31, + 0xcf, 0x15, 0x17, 0xf5, 0x80, 0x34, 0xfc, 0x94, 0x87, 0x18, 0x6d, 0xae, + 0xce, 0x0a, 0xb9, 0xbf, 0x69, 0x07, 0x6f, 0x89, 0x5b, 0xc1, 0x92, 0x8d, + 0x43, 0xc9, 0x6f, 0x83, 0x7e, 0x08, 0x30, 0xd8, 0xba, 0x4c, 0x48, 0x7f, + 0x7e, 0x89, 0xc7, 0xa8, 0x1b, 0xf2, 0xaa, 0x77, 0x0b, 0xc1, 0x85, 0x98, + 0xe8, 0xb1, 0x6e, 0xe9, 0x01, 0x7e, 0x66, 0x8c, 0x8d, 0x06, 0x53, 0xac, + 0x6c, 0x3b, 0xfe, 0xd1, 0xfe, 0x3a, 0x2c, 0x25, 0xa1, 0xf7, 0x2d, 0xf5, + 0xdd, 0xb4, 0x21, 0x08, 0xd1, 0xd8, 0x83, 0x08, 0xfc, 0x40, 0xbe, 0x19, + 0x95, 0x70, 0x9c, 0xc4, 0x6c, 0x18, 0xb6, 0xb5, 0xd6, 0x76, 0x77, 0x7d, + 0x65, 0xf4, 0x08, 0x16, 0x12, 0x44, 0xb0, 0x46, 0xb5, 0x3a, 0x1a, 0xc3, + 0xff, 0xff, 0xca, 0x11, 0x26, 0x8c, 0x26, 0x2d, 0x66, 0x56, 0xef, 0x74, + 0x61, 0xdc, 0x6f, 0x4b, 0xd8, 0xfe, 0x90, 0xe7, 0x6b, 0x3f, 0x6f, 0x72, + 0x72, 0x6d, 0xfc, 0xfd, 0x23, 0xe5, 0x5d, 0xc2, 0xc8, 0x8a, 0x31, 0x6f, + 0x83, 0x34, 0xfa, 0x02, 0xaa, 0x5d, 0x25, 0x0c, 0x7b, 0x33, 0x2c, 0x9c, + 0x6f, 0x98, 0xdd, 0x38, 0xbe, 0xbd, 0xa9, 0x17, 0x58, 0x53, 0x92, 0x6c, + 0xea, 0xcf, 0x38, 0xdd, 0xa0, 0x35, 0x07, 0xac, 0xa3, 0x95, 0xe9, 0x1a, + 0xb2, 0x37, 0x75, 0x04, 0xbe, 0xdb, 0x30, 0xb0, 0xd1, 0x0b, 0x8a, 0x6d, + 0x50, 0x86, 0x49, 0xb5, 0x03, 0x94, 0x55, 0x0b, 0x8b, 0x7b, 0xf2, 0xb0, + 0x3e, 0x18, 0xc9, 0xa4, 0xe4, 0x10, 0x6e, 0x5e, 0xc4, 0x60, 0x31, 0x52, + 0xfc, 0x5c, 0x0c, 0xc3, 0x1e, 0x73, 0x36, 0x06, 0x48, 0x34, 0x78, 0xe5, + 0x4a, 0xc9, 0x5c, 0x0e, 0x80, 0x6b, 0x54, 0x74, 0x4b, 0x52, 0x23, 0x43, + 0xe5, 0xea, 0x55, 0x2a, 0x0d, 0x44, 0xe2, 0x81, 0x56, 0xc0, 0xe4, 0xd1, + 0xcb, 0xc1, 0xdd, 0x22, 0x9e, 0xa2, 0x65, 0x8a, 0x79, 0x0f, 0xd0, 0x27, + 0x74, 0xcc, 0xf1, 0x76, 0x88, 0xa9, 0x19, 0x12, 0xf0, 0xd3, 0x7c, 0xf2, + 0x6f, 0x0e, 0x02, 0x58, 0xd0, 0xb6, 0x08, 0x7e, 0x14, 0x70, 0xbf, 0x0e, + 0x0a, 0x04, 0xce, 0x3e, 0x50, 0x88, 0x81, 0xbd, 0x23, 0x5e, 0x66, 0x12, + 0x46, 0xb8, 0x66, 0x86, 0x94, 0xe1, 0x09, 0xda, 0x60, 0x0e, 0xa3, 0x2c, + 0xa9, 0xb9, 0x5b, 0x5e, 0x92, 0xb5, 0x48, 0xc4, 0xd3, 0x1f, 0x5a, 0xc7, + 0x82, 0xcb, 0x67, 0x78, 0x02, 0xd8, 0x87, 0xb8, 0x2e, 0x38, 0x2c, 0xff, + 0x68, 0x12, 0x90, 0x30, 0xe4, 0xf1, 0x0e, 0x9a, 0x55, 0xd5, 0x16, 0xad, + 0x86, 0xbd, 0x03, 0xea, 0x2a, 0x49, 0x84, 0x2e, 0xa7, 0x2d, 0xcd, 0xaf, + 0x8c, 0x2a, 0x0b, 0xf5, 0xe1, 0x43, 0x55, 0xa6, 0x26, 0x65, 0x33, 0x4b, + 0x6a, 0xa1, 0x3d, 0xd5, 0xe7, 0x40, 0x7a, 0x34, 0x05, 0xdf, 0xbc, 0xe9, + 0x31, 0x5e, 0x93, 0x95, 0x29, 0x19, 0xfb, 0xfa, 0x3e, 0xa3, 0x9f, 0x9e, + 0x0b, 0x28, 0x7c, 0x33, 0xfb, 0xd0, 0x00, 0x34, 0x87, 0xe4, 0xf9, 0x26, + 0xfb, 0x46, 0xe1, 0x8a, 0x4f, 0x4a, 0x22, 0x44, 0x8b, 0x0a, 0xf7, 0xa4, + 0xa6, 0xc5, 0x55, 0x07, 0x7e, 0x1e, 0x11, 0xfd, 0x55, 0xfc, 0xac, 0x5c, + 0xa1, 0x30, 0xf1, 0xbe, 0x16, 0xd3, 0x6d, 0x0f, 0x1e, 0x02, 0xfa, 0x20, + 0x66, 0x4d, 0x7c, 0x3f, 0x86, 0x42, 0x7d, 0x4b, 0x4e, 0x17, 0x43, 0xf7, + 0x39, 0x46, 0x84, 0xfc, 0x2e, 0xd5, 0xe1, 0x3b, 0x72, 0x03, 0xef, 0xf5, + 0xfc, 0xb9, 0x4f, 0x91, 0xe7, 0xa4, 0x39, 0xf5, 0x2e, 0x3f, 0x52, 0xed, + 0xed, 0xa8, 0x22, 0x37, 0xfe, 0x1c, 0x27, 0xeb, 0x83, 0x7d, 0x64, 0xe6, + 0x44, 0x23, 0x04, 0xe0, 0xe4, 0xf7, 0xfe, 0xa4, 0xed, 0x5c, 0x24, 0x7e, + 0xb1, 0x1b, 0xa7, 0x2c, 0xe5, 0x27, 0x78, 0xcf, 0xef, 0x78, 0xff, 0xee, + 0xaf, 0xcd, 0xa1, 0x52, 0x67, 0x8e, 0x6f, 0x35, 0x55, 0xf8, 0xa6, 0xa0, + 0x2b, 0xc8, 0xf2, 0x37, 0xc9, 0xe4, 0x09, 0x3a, 0x7d, 0xcf, 0xd9, 0x23, + 0x17, 0x5f, 0x1b, 0xca, 0x59, 0x0f, 0xea, 0x3e, 0xde, 0xb2, 0xb4, 0x78, + 0x3a, 0x88, 0xdc, 0xd8, 0xcf, 0xc8, 0x45, 0xf3, 0xc7, 0x8a, 0x88, 0x93, + 0x6c, 0xf4, 0x01, 0x52, 0xcf, 0xac, 0xac, 0x88, 0x7d, 0xcd, 0x72, 0x2c, + 0xc5, 0x76, 0xe2, 0x5d, 0xc7, 0xef, 0xa8, 0xea, 0x37, 0xd0, 0xe1, 0xb1, + 0xf0, 0xa9, 0x89, 0xb7, 0x92, 0x35, 0x00, 0xac, 0xb5, 0x85, 0x00, 0xef, + 0x7b, 0x42, 0xa2, 0xfc, 0xcb, 0x4b, 0xc4, 0x45, 0x38, 0xea, 0xba, 0xf7, + 0x7b, 0xc3, 0x05, 0x52, 0x83, 0x31, 0xcd, 0x25, 0x05, 0xef, 0xcb, 0xcd, + 0xe2, 0xfa, 0x4a, 0x5f, 0x74, 0x04, 0x44, 0x30, 0x70, 0x4f, 0x62, 0xde, + 0x99, 0xe0, 0x14, 0xb5, 0x9c, 0xa5, 0x64, 0x09, 0x7f, 0x71, 0x52, 0x0d, + 0xc9, 0xf2, 0xeb, 0xd5, 0x72, 0x1a, 0xfe, 0x52, 0xf6, 0xfb, 0xe4, 0xd9, + 0x1a, 0x6c, 0x1a, 0x6d, 0x0c, 0xc8, 0xa3, 0xde, 0x03, 0xc3, 0x27, 0xde, + 0x46, 0x7c, 0xdd, 0x2c, 0x52, 0x9a, 0x4a, 0xab, 0xa4, 0x80, 0xb2, 0x2d, + 0xe6, 0x36, 0x42, 0x5b, 0x64, 0xb2, 0xa5, 0x6d, 0xae, 0x4d, 0x5a, 0xd7, + 0x07, 0x8b, 0x03, 0x66, 0x07, 0x34, 0xfe, 0xe7, 0xf6, 0x16, 0x2a, 0x57, + 0x3d, 0x5a, 0xd7, 0xf8, 0xec, 0x9f, 0x24, 0x58, 0xc6, 0xca, 0xf1, 0x0a, + 0xf6, 0xd4, 0x38, 0xd1, 0xb0, 0x10, 0x50, 0x18, 0x8d, 0xe7, 0x5b, 0x31, + 0xff, 0xb7, 0xd9, 0x58, 0xe4, 0x6e, 0x80, 0x3c, 0xe6, 0x24, 0xb9, 0x96, + 0x20, 0xaf, 0x74, 0xb4, 0xdb, 0x9b, 0x28, 0x64, 0x85, 0x32, 0x2a, 0x6e, + 0x0f, 0xfb, 0x04, 0x8d, 0x72, 0x34, 0xb6, 0x21, 0xa7, 0x14, 0x40, 0xc2, + 0x1a, 0xb8, 0xd6, 0xb6, 0x6e, 0x70, 0x59, 0xac, 0x2c, 0x07, 0xe9, 0xd8, + 0xcb, 0x75, 0xb9, 0xba, 0xd8, 0x03, 0xab, 0xca, 0xd0, 0x54, 0xe0, 0x73, + 0x61, 0x63, 0x4b, 0xd0, 0x85, 0x11, 0x67, 0x22, 0xb1, 0x14, 0x47, 0x92, + 0x5d, 0x57, 0x51, 0x06, 0x25, 0x6a, 0xcb, 0xb9, 0x2c, 0xb7, 0x44, 0x64, + 0x5c, 0xfc, 0x48, 0x49, 0xf4, 0x70, 0x54, 0xab, 0x9e, 0x9d, 0x05, 0x0a, + 0x01, 0xd5, 0xf1, 0x01, 0x14, 0xd6, 0x7a, 0x0a, 0x90, 0xd4, 0x7a, 0x6b, + 0xc9, 0x38, 0x22, 0x1a, 0xc8, 0xdf, 0xc6, 0x2c, 0x39, 0x57, 0x46, 0x05, + 0xca, 0x73, 0x2f, 0x8a, 0x5c, 0x8d, 0x0c, 0xf6, 0xac, 0xb1, 0x76, 0x55, + 0xa4, 0xc3, 0xfc, 0x4c, 0x84, 0x89, 0x54, 0xd5, 0xdf, 0xd2, 0xcd, 0x37, + 0x96, 0x95, 0x98, 0xb1, 0x42, 0x4a, 0x60, 0x78, 0x63, 0xc7, 0xc4, 0x76, + 0x56, 0x04, 0xbe, 0x1c, 0x42, 0x79, 0x5e, 0xc8, 0x66, 0xbb, 0xb0, 0x94, + 0xe8, 0x29, 0xa9, 0xae, 0xb9, 0x56, 0x5f, 0xa7, 0x8a, 0x86, 0x29, 0xcc, + 0x44, 0x4a, 0x34, 0xdd, 0xef, 0xba, 0xb7, 0x2d, 0x85, 0x73, 0x09, 0x03, + 0x09, 0x80, 0xf0, 0x32, 0xa0, 0x7c, 0x7b, 0xd3, 0xf8, 0x12, 0x8a, 0x25, + 0x67, 0x96, 0xcc, 0x5b, 0x1e, 0x2f, 0xd4, 0x0a, 0x74, 0x80, 0xc2, 0x47, + 0xd3, 0xd9, 0x7c, 0xfe, 0x0a, 0x1e, 0x1c, 0xce, 0xfb, 0x90, 0xbe, 0x0d, + 0xc5, 0x70, 0xd8, 0x7d, 0xea, 0x45, 0x90, 0x6b, 0xb0, 0x6b, 0xa3, 0xb1, + 0x10, 0x2d, 0xf3, 0x99, 0x4a, 0xd5, 0x6b, 0x19, 0x86, 0xfc, 0x7f, 0xae, + 0x83, 0x26, 0x21, 0x27, 0x0e, 0x9b, 0x25, 0x61, 0xbc, 0xda, 0xff, 0xf8, + 0x63, 0xf8, 0xba, 0xf6, 0xaf, 0xdc, 0xe7, 0x1d, 0x48, 0x49, 0x31, 0x85, + 0x19, 0x16, 0x19, 0x18, 0x58, 0x30, 0x7a, 0xfe, 0x1a, 0xf1, 0xa1, 0xe3, + 0xb5, 0x9b, 0xd3, 0x6b, 0x2d, 0x13, 0x7d, 0x0e, 0xaf, 0xf8, 0x07, 0x21, + 0xa1, 0x90, 0x40, 0x46, 0x85, 0x3b, 0x74, 0x1f, 0xa1, 0x32, 0xa3, 0x8d, + 0x7e, 0x9b, 0xdc, 0x5c, 0x77, 0xfe, 0x28, 0x20, 0x04, 0xf8, 0xe7, 0x28, + 0x2a, 0x8f, 0xcf, 0x6f, 0x53, 0x8d, 0xb4, 0x9d, 0x8c, 0x69, 0xd0, 0xc0, + 0x21, 0x63, 0xaa, 0x30, 0x6b, 0xf4, 0xf5, 0x31, 0x56, 0x14, 0xc3, 0x92, + 0x94, 0x00, 0x99, 0x01, 0xa5, 0xa1, 0x64, 0x69, 0xe6, 0x1a, 0xa9, 0xa4, + 0x13, 0x4f, 0x7f, 0x0b, 0x3b, 0xd8, 0x72, 0x5d, 0x4c, 0x3d, 0x3f, 0x6c, + 0x2b, 0x75, 0x3b, 0x33, 0x52, 0xce, 0x09, 0x50, 0xdf, 0x4b, 0xe5, 0xcc, + 0x3c, 0x19, 0x14, 0x90, 0x93, 0x15, 0x99, 0x14, 0x6c, 0x56, 0xff, 0x21, + 0xb6, 0xb3, 0x67, 0x38, 0x3f, 0x6a, 0xfd, 0xd4, 0x32, 0x9f, 0x86, 0x86, + 0x2e, 0xf4, 0x5b, 0x19, 0xb8, 0x6a, 0x6e, 0xc9, 0xe7, 0xb0, 0xaa, 0xae, + 0x6b, 0x3b, 0x22, 0x00, 0x5e, 0xea, 0xc6, 0x0b, 0xa7, 0x9a, 0x3e, 0x96, + 0xa2, 0x1a, 0x4b, 0x2d, 0x09, 0xc9, 0xef, 0x2e, 0x9e, 0x59, 0xec, 0xd1, + 0x8c, 0x1a, 0xba, 0x2e, 0x7c, 0xce, 0x67, 0x03, 0xdb, 0x6f, 0x1a, 0x1d, + 0x46, 0x3a, 0x04, 0x70, 0x24, 0x94, 0x69, 0xc6, 0x3f, 0x5f, 0x87, 0x27, + 0x7b, 0xe4, 0xfd, 0x63, 0x7d, 0xb0, 0xac, 0x12, 0xc5, 0x3b, 0xaa, 0x67, + 0xa7, 0x60, 0xbd, 0x4f, 0xc3, 0xd6, 0x81, 0x21, 0xff, 0xc5, 0x91, 0x5c, + 0x7a, 0x3a, 0x01, 0x21, 0x79, 0x61, 0x1f, 0x82, 0x17, 0x6f, 0xb7, 0x07, + 0x8e, 0x64, 0x10, 0xe7, 0x2d, 0x51, 0xef, 0x4b, 0x41, 0x3e, 0xb1, 0x90, + 0x93, 0xfc, 0x27, 0xdc, 0x64, 0x2b, 0x00, 0x85, 0x6c, 0x03, 0x41, 0xf4, + 0xac, 0x6b, 0xb1, 0x82, 0xb2, 0xe0, 0xe3, 0x90, 0xf6, 0x6a, 0xc5, 0x88, + 0x65, 0x82, 0xfe, 0x22, 0x7c, 0x5a, 0x94, 0x94, 0xb4, 0x6d, 0x94, 0x6f, + 0x5e, 0x14, 0x57, 0x4d, 0xdc, 0x49, 0x18, 0xa8, 0x69, 0x46, 0x0a, 0x62, + 0x64, 0x88, 0x8d, 0xc3, 0x39, 0x40, 0x78, 0x2b, 0x3a, 0xb0, 0xb9, 0x13, + 0x6c, 0x79, 0xbd, 0xed, 0x72, 0xa9, 0xa3, 0xa6, 0x73, 0xac, 0xf9, 0xfd, + 0x34, 0xe5, 0x0c, 0x2d, 0x28, 0x94, 0xc8, 0xb1, 0xec, 0x71, 0x2a, 0x99, + 0x20, 0x4c, 0x2b, 0x91, 0x9a, 0xb4, 0x4c, 0x04, 0x09, 0xe8, 0x26, 0xcf, + 0x9d, 0xf2, 0xbe, 0xb2, 0xd0, 0x43, 0x90, 0xbe, 0xe3, 0xba, 0x66, 0x59, + 0x46, 0x45, 0xaa, 0xeb, 0xc6, 0xe8, 0xf8, 0x32, 0xf3, 0xce, 0x23, 0x94, + 0x6d, 0x25, 0x64, 0x73, 0xcd, 0xec, 0x06, 0x69, 0x8d, 0x1d, 0xb8, 0x51, + 0xe4, 0x5f, 0x62, 0x61, 0x27, 0xf8, 0x2a, 0x55, 0xc5, 0xe0, 0xec, 0x39, + 0xec, 0x92, 0x6c, 0xc7, 0xab, 0x30, 0x26, 0xeb, 0x36, 0xa8, 0x15, 0x38, + 0x74, 0x9b, 0xac, 0x54, 0x5f, 0x30, 0x8a, 0xf1, 0x3b, 0x85, 0xf1, 0x37, + 0x94, 0x00, 0xda, 0x34, 0xe4, 0x9b, 0xab, 0x92, 0xce, 0x3f, 0xdc, 0x0f, + 0x8e, 0x03, 0xca, 0x95, 0x9b, 0xc7, 0x39, 0xcc, 0x25, 0x48, 0xc9, 0xd0, + 0x2e, 0xa5, 0x85, 0x08, 0x22, 0xf5, 0x17, 0xc1, 0xb1, 0x37, 0x4f, 0x52, + 0x3e, 0xa5, 0x18, 0x68, 0xe9, 0x73, 0xa8, 0x16, 0x0a, 0xc2, 0xff, 0x7c, + 0xa3, 0x8a, 0xc3, 0x0d, 0xfd, 0xe0, 0x7a, 0x09, 0xc9, 0x72, 0x7d, 0xfb, + 0x45, 0x45, 0xc1, 0xab, 0xd6, 0xce, 0xe6, 0xc3, 0xfa, 0x02, 0xc7, 0x9c, + 0x57, 0x63, 0x03, 0x0d, 0x9a, 0xf1, 0x53, 0xaa, 0xfb, 0x6a, 0xff, 0x38, + 0x3a, 0x8f, 0x25, 0x37, 0x81, 0x28, 0x8a, 0x7e, 0x10, 0x0b, 0x72, 0x5a, + 0x92, 0x73, 0xce, 0xda, 0x91, 0x05, 0x22, 0x67, 0xf8, 0x7a, 0x33, 0x2e, + 0xbb, 0xca, 0x55, 0xb6, 0xcc, 0x48, 0xdd, 0xaf, 0xef, 0x3b, 0x47, 0x84, + 0x9e, 0x32, 0xe9, 0xda, 0xda, 0x4a, 0xa0, 0x8c, 0x3c, 0xb0, 0x5d, 0x7d, + 0x95, 0x12, 0x0d, 0x9b, 0xcf, 0x77, 0xf1, 0x0e, 0x70, 0xdd, 0xd6, 0x8b, + 0x4f, 0x3e, 0x9f, 0x7d, 0x5e, 0xc4, 0x14, 0xe8, 0xdd, 0xe9, 0xe0, 0x80, + 0xdc, 0x06, 0xa7, 0xa5, 0x44, 0xf5, 0xf5, 0x37, 0x5e, 0x3b, 0xef, 0xdf, + 0xf3, 0x11, 0x7b, 0xdb, 0xa9, 0xa2, 0x33, 0x42, 0xc5, 0xa0, 0xe6, 0xe3, + 0x55, 0xca, 0xd6, 0xdd, 0x7d, 0x4b, 0x83, 0xb0, 0xc4, 0x00, 0x12, 0x55, + 0xf9, 0x77, 0x00, 0x7e, 0xe7, 0xf3, 0xf9, 0xa0, 0x5e, 0x25, 0x25, 0x1c, + 0xad, 0x6a, 0x23, 0x57, 0x7b, 0x8d, 0xf8, 0x3a, 0x23, 0x17, 0x3f, 0x59, + 0x90, 0xd8, 0x20, 0xbb, 0xc0, 0x6e, 0x71, 0x57, 0xc5, 0xb7, 0x72, 0xbe, + 0xbb, 0xac, 0x8a, 0x8e, 0xf8, 0xba, 0x6e, 0x55, 0x51, 0xc4, 0x43, 0x3c, + 0xdc, 0xba, 0x3c, 0x14, 0xac, 0x5e, 0x77, 0x72, 0xc2, 0x77, 0xac, 0x87, + 0x5f, 0x46, 0x4e, 0xf6, 0xdb, 0xf4, 0x4e, 0x1c, 0x89, 0xe7, 0x32, 0x94, + 0xc8, 0x81, 0x61, 0x69, 0xea, 0x34, 0xa9, 0xef, 0xa3, 0x53, 0x8d, 0xca, + 0x16, 0x1e, 0x51, 0x13, 0x7f, 0x5b, 0x0b, 0xef, 0x95, 0x90, 0xb3, 0xf7, + 0x6e, 0x78, 0x32, 0x7e, 0x04, 0xa6, 0xfc, 0xd4, 0x37, 0xae, 0x97, 0xe4, + 0xb6, 0xc5, 0xd2, 0xd1, 0x3c, 0xd1, 0x98, 0x08, 0x3c, 0xf8, 0xaa, 0x2e, + 0xbf, 0xaa, 0x9e, 0x06, 0x65, 0x61, 0xf8, 0x15, 0xc2, 0xe9, 0xfd, 0x2b, + 0x76, 0xd3, 0xe8, 0x7d, 0x25, 0xc6, 0x99, 0xfd, 0xfc, 0xd8, 0xd1, 0x87, + 0x37, 0x9f, 0x7c, 0xa5, 0x0c, 0x0f, 0xc1, 0x64, 0x48, 0x76, 0xc8, 0x4c, + 0xee, 0x4f, 0xda, 0x1d, 0xcd, 0xe1, 0xd8, 0xc9, 0xc7, 0x0f, 0x62, 0x40, + 0xc7, 0xdb, 0xbf, 0x3b, 0xf2, 0x16, 0xbf, 0xa0, 0x3c, 0x31, 0xb8, 0x5d, + 0x6a, 0x47, 0x63, 0x0c, 0x1f, 0x57, 0x6b, 0x36, 0x7a, 0x4c, 0xbb, 0x2b, + 0x03, 0x50, 0x05, 0x25, 0x78, 0x2c, 0xc0, 0x1b, 0x93, 0xd9, 0xb5, 0x50, + 0xe2, 0x4e, 0x92, 0x82, 0x5c, 0x3a, 0xd0, 0x72, 0xb1, 0x08, 0xfa, 0x42, + 0xe2, 0xb1, 0x33, 0x41, 0xac, 0x63, 0xd7, 0xe4, 0x82, 0xa6, 0x5a, 0xbf, + 0xc9, 0xd2, 0x64, 0x60, 0x80, 0x09, 0xd0, 0x42, 0x32, 0x90, 0xc8, 0x50, + 0xa9, 0xa6, 0xf7, 0x82, 0x14, 0xd6, 0x92, 0xa1, 0xca, 0x44, 0x84, 0xc5, + 0xa3, 0x30, 0xd1, 0xef, 0x6f, 0xb6, 0xa6, 0x7f, 0x91, 0x82, 0x40, 0x63, + 0x63, 0x2c, 0x9f, 0x43, 0x41, 0xb2, 0x9b, 0x18, 0x8d, 0x57, 0xe2, 0x2c, + 0xe8, 0xa2, 0x27, 0x8f, 0x5b, 0x98, 0x5a, 0x60, 0xe6, 0xb7, 0x22, 0xe9, + 0x6f, 0x9c, 0x1e, 0x42, 0xc5, 0xe7, 0x38, 0x07, 0x16, 0x3b, 0x71, 0x02, + 0xbf, 0x40, 0x22, 0x13, 0xc6, 0x22, 0x8b, 0x48, 0x34, 0x15, 0xaa, 0x5e, + 0xbb, 0x2c, 0xc8, 0x18, 0x0e, 0x8f, 0x0a, 0xa2, 0x0b, 0x9e, 0x14, 0x38, + 0xc8, 0x98, 0x5b, 0x83, 0xb2, 0x0a, 0x79, 0xf7, 0x74, 0x02, 0x10, 0x54, + 0xf5, 0xb6, 0x3e, 0xb6, 0xf2, 0x40, 0xc2, 0xb6, 0x9f, 0x06, 0x91, 0x5d, + 0x26, 0xda, 0x74, 0xa1, 0xc2, 0x8c, 0xf6, 0xcc, 0x44, 0xab, 0xe0, 0x13, + 0x41, 0xef, 0x98, 0x25, 0xcc, 0x57, 0x79, 0x6b, 0xdc, 0x68, 0x47, 0x12, + 0xfa, 0xb2, 0x6e, 0x97, 0x62, 0x87, 0x61, 0x41, 0x9f, 0xe4, 0x2d, 0xca, + 0xa5, 0x62, 0xfc, 0xe3, 0x95, 0x44, 0x77, 0xd1, 0xa9, 0x35, 0xd5, 0xdc, + 0xfb, 0xd9, 0x11, 0x5d, 0xeb, 0x66, 0x5a, 0x87, 0x76, 0x7a, 0x81, 0x27, + 0x3c, 0x9d, 0xdb, 0x96, 0x58, 0x45, 0x21, 0x72, 0xcd, 0xcd, 0xe9, 0x27, + 0xa5, 0x1a, 0x22, 0x84, 0x6f, 0x11, 0x18, 0x2e, 0x82, 0xb4, 0x68, 0xfd, + 0xfb, 0x82, 0x33, 0x4a, 0x62, 0x9f, 0xda, 0x10, 0x2b, 0x72, 0x94, 0x4e, + 0x93, 0xec, 0x4f, 0xf4, 0x45, 0x5f, 0x54, 0x06, 0xbe, 0x72, 0x6e, 0xab, + 0x1c, 0xcb, 0x5e, 0x5c, 0x16, 0x75, 0x5b, 0x1c, 0x65, 0x3f, 0xd0, 0x0a, + 0x21, 0xc9, 0xa9, 0xb8, 0x36, 0xa0, 0xb6, 0xf3, 0x17, 0x8f, 0x53, 0xd8, + 0x84, 0x88, 0xfb, 0xc9, 0x24, 0x14, 0xd9, 0x03, 0x0b, 0xb6, 0x64, 0x15, + 0xc1, 0x25, 0xba, 0x62, 0x7f, 0x82, 0xe7, 0x21, 0xe9, 0xc3, 0x7a, 0x3a, + 0x95, 0xf7, 0x1f, 0xe3, 0x9a, 0xd1, 0x9d, 0xb4, 0x1f, 0xd8, 0xe8, 0x77, + 0x7e, 0xc9, 0x29, 0xa0, 0xf0, 0x51, 0x89, 0x06, 0x89, 0x42, 0x8d, 0xd2, + 0x36, 0x65, 0x99, 0x7a, 0xbc, 0xcc, 0xd8, 0xd2, 0x10, 0xd1, 0xfc, 0xe8, + 0x9e, 0x2d, 0x84, 0x6a, 0x72, 0xd6, 0x50, 0xae, 0x37, 0xf5, 0xcf, 0x18, + 0x9f, 0xb7, 0x83, 0xf9, 0x85, 0x65, 0xad, 0xc2, 0x2b, 0x0b, 0x82, 0xff, + 0x53, 0x21, 0x4b, 0x17, 0xab, 0xf0, 0x54, 0x14, 0x2c, 0x82, 0xcd, 0x8f, + 0xb8, 0x27, 0x93, 0x8c, 0xa1, 0x39, 0x1b, 0x08, 0xee, 0x4f, 0xca, 0xce, + 0x50, 0xfb, 0x80, 0xc3, 0xf6, 0x10, 0x1a, 0xf2, 0xec, 0x98, 0x98, 0x39, + 0x51, 0x44, 0xb2, 0x3c, 0x7f, 0xf8, 0x40, 0x20, 0x72, 0xe5, 0x01, 0x6d, + 0xd5, 0x66, 0xa1, 0xb7, 0xd5, 0x2a, 0xe4, 0x71, 0xcc, 0x1a, 0x6d, 0x4f, + 0xed, 0x45, 0x68, 0x0d, 0xd9, 0xf2, 0xec, 0x28, 0xdd, 0x47, 0xb8, 0x23, + 0xe6, 0xb9, 0xb4, 0xa5, 0x61, 0xb3, 0x3a, 0xf7, 0x71, 0x3b, 0x57, 0xa9, + 0x37, 0xdf, 0x64, 0x57, 0x36, 0x86, 0xfd, 0x0d, 0x1a, 0x04, 0x36, 0x8d, + 0x7b, 0x54, 0xc2, 0x90, 0x08, 0x24, 0x3e, 0x68, 0x0f, 0xe5, 0xde, 0x87, + 0x43, 0xf2, 0xe0, 0x46, 0xe8, 0x9e, 0xb9, 0x79, 0xb2, 0x5b, 0x27, 0xe7, + 0x0b, 0xf4, 0x55, 0x5b, 0xa4, 0x62, 0x34, 0x4e, 0x2c, 0x17, 0xc7, 0xf0, + 0x15, 0x56, 0xa4, 0x4c, 0x55, 0x06, 0x3a, 0xce, 0x26, 0x6c, 0x69, 0xe0, + 0xb3, 0xfa, 0xd9, 0x36, 0x01, 0xef, 0x14, 0xf0, 0x61, 0x14, 0x3d, 0x6d, + 0x84, 0xb7, 0xc5, 0xef, 0x24, 0x97, 0x9f, 0x6f, 0xee, 0x53, 0x88, 0x42, + 0xdb, 0xf2, 0x22, 0x16, 0xab, 0xd3, 0xad, 0x41, 0xd8, 0xb6, 0x00, 0x20, + 0x86, 0x1e, 0x8a, 0x3a, 0x82, 0x3e, 0x30, 0xd2, 0x5a, 0x74, 0x14, 0x9e, + 0x9b, 0xe5, 0xae, 0x6b, 0xe5, 0xf2, 0x1c, 0xc6, 0x40, 0x2a, 0xca, 0xe4, + 0x28, 0x0d, 0xf0, 0x90, 0xd2, 0x0d, 0xc8, 0x69, 0xb9, 0xf8, 0x18, 0x3b, + 0x37, 0x47, 0x12, 0x5b, 0xd7, 0xb0, 0x7d, 0x3f, 0x6d, 0x74, 0xf0, 0x52, + 0x5a, 0x00, 0xb4, 0x93, 0xd6, 0x60, 0xe0, 0xdd, 0x92, 0x30, 0xb8, 0xef, + 0x9d, 0x8d, 0x9e, 0x4a, 0x44, 0x1e, 0x27, 0x65, 0x5a, 0x28, 0x40, 0x85, + 0x65, 0xbd, 0x15, 0x3e, 0x8b, 0x04, 0xb9, 0xe7, 0xd2, 0x1b, 0xe0, 0x7f, + 0x26, 0x84, 0xf8, 0x3b, 0xdf, 0xe6, 0xa3, 0x26, 0x63, 0xd2, 0xc5, 0x37, + 0x77, 0xa9, 0xa6, 0x6f, 0xcc, 0x49, 0x43, 0x12, 0x1f, 0xa6, 0xf2, 0x26, + 0x33, 0x58, 0xae, 0x47, 0x9f, 0x49, 0x61, 0xf4, 0x0b, 0x16, 0xa6, 0x1b, + 0x4b, 0x28, 0x8f, 0xe9, 0x07, 0xf6, 0xdc, 0x97, 0xb8, 0xc8, 0xd3, 0x06, + 0x44, 0xa7, 0x73, 0xa2, 0x53, 0xaa, 0x22, 0x92, 0xf2, 0x86, 0x58, 0x9e, + 0x4c, 0x22, 0x9f, 0xf9, 0x22, 0xd3, 0xb3, 0x7f, 0xa3, 0xec, 0xf1, 0x29, + 0x09, 0xfa, 0x99, 0x28, 0xdf, 0xfb, 0x32, 0x4c, 0x83, 0xa0, 0x57, 0xda, + 0xd1, 0x6e, 0x1e, 0x98, 0x4d, 0xdc, 0xd4, 0x3e, 0xf0, 0xfb, 0x40, 0xf3, + 0x86, 0xd6, 0x04, 0xa9, 0x47, 0xc0, 0x24, 0x91, 0x3f, 0xe3, 0xda, 0x4a, + 0xec, 0xa7, 0xf5, 0x76, 0x9b, 0xe5, 0x9d, 0x03, 0x86, 0x52, 0x9f, 0x00, + 0xfe, 0xb6, 0x92, 0xd6, 0x81, 0xd0, 0x46, 0x5d, 0xd4, 0x8b, 0x36, 0x3d, + 0xe4, 0x1e, 0x94, 0x3e, 0x7b, 0xee, 0x12, 0xf1, 0x0f, 0x55, 0x61, 0x1e, + 0x34, 0xfc, 0xac, 0x42, 0x9a, 0x6f, 0x90, 0x34, 0x16, 0x7b, 0x18, 0x74, + 0x5f, 0x41, 0x4b, 0x0d, 0xdf, 0x3a, 0x4d, 0x63, 0xf5, 0xec, 0xfb, 0x1b, + 0xac, 0xee, 0x4c, 0x8d, 0x9e, 0xe7, 0xda, 0x4f, 0x5c, 0xd3, 0x44, 0xa2, + 0x85, 0xb4, 0x58, 0x43, 0xa9, 0x3a, 0x32, 0xb4, 0x4c, 0x56, 0x16, 0x68, + 0x12, 0xe7, 0xef, 0x2e, 0xd1, 0x6c, 0xae, 0xf4, 0xe7, 0x57, 0x6c, 0x1a, + 0xf5, 0xa0, 0xa8, 0x1e, 0x9c, 0xa0, 0x46, 0xdf, 0xc5, 0xdf, 0x3d, 0x99, + 0x8c, 0xc2, 0xa4, 0xfc, 0x0b, 0xe5, 0xed, 0xc4, 0xed, 0xbf, 0x2a, 0x28, + 0x5c, 0xcc, 0x72, 0x03, 0xae, 0x50, 0x07, 0xe8, 0x77, 0x19, 0xbc, 0xd2, + 0xd1, 0xbf, 0x9c, 0x84, 0x3a, 0x39, 0xb2, 0xc8, 0x90, 0x5a, 0x10, 0xa1, + 0x56, 0xef, 0x54, 0xbb, 0x14, 0x77, 0xb0, 0xa9, 0x00, 0x64, 0x04, 0xfc, + 0x39, 0xc9, 0x07, 0x5c, 0xb1, 0xc2, 0x07, 0x50, 0xf6, 0xfa, 0x15, 0xda, + 0x4e, 0xf0, 0x38, 0x2c, 0x5d, 0xe3, 0x65, 0x75, 0xd0, 0xe6, 0x92, 0x22, + 0x51, 0x05, 0xb6, 0x52, 0xd0, 0xbd, 0xf8, 0x4d, 0x4c, 0xea, 0xd6, 0x13, + 0x81, 0xeb, 0x93, 0x15, 0x6d, 0x5a, 0x15, 0x35, 0x26, 0x25, 0x84, 0xd6, + 0x0d, 0xcf, 0x92, 0x63, 0xc0, 0x5a, 0x09, 0x7a, 0x98, 0x50, 0x2c, 0xb4, + 0xa2, 0xab, 0xf7, 0x85, 0x2a, 0xa3, 0x25, 0xc5, 0x6d, 0x55, 0x98, 0x8e, + 0x39, 0xbf, 0xa6, 0x3b, 0xc4, 0xc0, 0xb2, 0x92, 0x0e, 0x37, 0x83, 0xd9, + 0x5a, 0xef, 0x41, 0xd5, 0x5c, 0xfe, 0xce, 0x9b, 0xaf, 0xfc, 0xdb, 0xf8, + 0x3b, 0x26, 0x51, 0xf0, 0x3a, 0xa5, 0x7d, 0x14, 0xcf, 0x32, 0x92, 0x6c, + 0xa1, 0xbe, 0x3e, 0x6c, 0xc1, 0x1c, 0x21, 0x79, 0xfb, 0x2c, 0xd2, 0xdc, + 0xf3, 0x6d, 0xe1, 0x1d, 0x10, 0x5d, 0x4e, 0xb4, 0x5a, 0x4f, 0x08, 0xd6, + 0xa0, 0x3f, 0xeb, 0xa3, 0x4e, 0xe0, 0x67, 0xad, 0x3b, 0xea, 0x1c, 0x3a, + 0x5c, 0x34, 0x44, 0x77, 0x57, 0x3b, 0x9d, 0x80, 0x0d, 0xff, 0x6f, 0x1b, + 0x53, 0x49, 0x6b, 0x11, 0xa5, 0x21, 0x0d, 0x8d, 0xfa, 0xc0, 0x46, 0xb6, + 0x47, 0x05, 0xca, 0xd7, 0xe0, 0xe1, 0xcc, 0x88, 0xcc, 0x2f, 0xe1, 0x0c, + 0x7d, 0xad, 0x16, 0xb6, 0xa3, 0xeb, 0xb6, 0x45, 0xa3, 0x73, 0xf2, 0x30, + 0xa4, 0x82, 0x5f, 0xb3, 0xb8, 0x0c, 0x2d, 0x14, 0xe1, 0x02, 0xfe, 0x5c, + 0xd9, 0x94, 0x3f, 0x1d, 0x6f, 0x1f, 0x0f, 0xee, 0x19, 0x59, 0x6b, 0x30, + 0x99, 0xc0, 0xad, 0xdb, 0x59, 0x9c, 0x9b, 0x93, 0x75, 0xe5, 0xfa, 0x20, + 0xc8, 0xe3, 0x43, 0xc7, 0xa2, 0x01, 0x07, 0x05, 0xf4, 0x1b, 0x41, 0x48, + 0xa9, 0x4d, 0x82, 0x5f, 0x96, 0x65, 0x3e, 0x33, 0x9d, 0x86, 0x09, 0xba, + 0xbf, 0x15, 0x2e, 0xcb, 0xec, 0x63, 0xc5, 0x5d, 0xf4, 0x3d, 0x33, 0x24, + 0x39, 0xf9, 0x1d, 0xd8, 0xde, 0xd9, 0xc2, 0x06, 0x14, 0x84, 0xb0, 0x44, + 0x92, 0x0d, 0x31, 0xcc, 0xd3, 0x1e, 0x0e, 0xe3, 0xc4, 0xdd, 0x18, 0x70, + 0x94, 0x5c, 0xbc, 0x22, 0xc1, 0x18, 0xf4, 0x6a, 0xbf, 0x7d, 0x29, 0xda, + 0xb9, 0xce, 0x33, 0xce, 0xb5, 0x40, 0xad, 0x54, 0x0c, 0x86, 0x28, 0x39, + 0x63, 0x95, 0xa2, 0x26, 0x80, 0x8b, 0x53, 0xc2, 0x1d, 0x6c, 0x99, 0x00, + 0xb1, 0x11, 0x6e, 0xe8, 0xcb, 0x5b, 0x34, 0xbd, 0xbb, 0xc7, 0xd7, 0xea, + 0x9a, 0xc6, 0xcc, 0x99, 0x22, 0xc2, 0xfa, 0xfb, 0x22, 0x1e, 0x21, 0xe0, + 0xbe, 0x29, 0x5c, 0x57, 0xb2, 0x2a, 0x32, 0x50, 0xdf, 0x28, 0x01, 0xee, + 0xdf, 0xd4, 0xd9, 0x42, 0xe7, 0x06, 0xd4, 0xc9, 0x27, 0xf7, 0xd7, 0x41, + 0x75, 0xce, 0x23, 0xbb, 0x1e, 0x8e, 0x22, 0xd4, 0x7b, 0x29, 0x9f, 0x09, + 0xf9, 0xe2, 0x4b, 0xb2, 0x39, 0x3d, 0x6d, 0xe5, 0x3e, 0x65, 0x5e, 0xd5, + 0xf1, 0x1a, 0x94, 0xc8, 0xdb, 0xe2, 0x67, 0x15, 0x07, 0x8f, 0x14, 0x4e, + 0x47, 0x7e, 0xca, 0xd4, 0xdc, 0xe0, 0xf9, 0xf1, 0x4f, 0x39, 0x32, 0xf1, + 0x27, 0x47, 0x3d, 0xfb, 0x2e, 0x7f, 0x80, 0x40, 0x2d, 0xc6, 0x35, 0x34, + 0x4e, 0x5f, 0x12, 0x90, 0x69, 0xb4, 0x2e, 0x7c, 0xb4, 0x5d, 0x6d, 0x9d, + 0x73, 0xf9, 0xd3, 0x94, 0xed, 0x07, 0x81, 0x63, 0xb3, 0xcb, 0xad, 0xee, + 0x30, 0x86, 0x79, 0xaf, 0xa9, 0xad, 0x45, 0x73, 0x56, 0x3e, 0x97, 0xd7, + 0x73, 0xb0, 0xeb, 0x08, 0x63, 0x97, 0x00, 0xb5, 0x57, 0x47, 0x8d, 0x3e, + 0x4b, 0xe0, 0xf4, 0x2b, 0x29, 0xeb, 0x94, 0x12, 0xe4, 0x84, 0x13, 0xc3, + 0x2e, 0xe3, 0xcb, 0xd6, 0x16, 0x98, 0xef, 0x44, 0x62, 0x78, 0x2c, 0xdb, + 0x54, 0x3a, 0xf0, 0x43, 0xf6, 0xc4, 0xaa, 0x55, 0x47, 0xbf, 0xc0, 0xcd, + 0x5c, 0x2b, 0xbe, 0x24, 0x27, 0x30, 0xd5, 0x3f, 0xfe, 0xfd, 0xb1, 0x26, + 0x28, 0x7d, 0xad, 0x9c, 0xcc, 0x4c, 0x1c, 0x47, 0xf3, 0x39, 0x35, 0x08, + 0xc4, 0x2a, 0xd0, 0x50, 0x3e, 0x2b, 0xe4, 0xe5, 0xeb, 0x94, 0xf9, 0x3e, + 0x9e, 0x3f, 0xa4, 0x04, 0xe8, 0xe2, 0xfb, 0x07, 0x52, 0xae, 0x93, 0x9c, + 0x76, 0xe8, 0x04, 0x3c, 0xc2, 0xbc, 0xda, 0xef, 0x14, 0xe2, 0xae, 0xeb, + 0xc8, 0xe3, 0x12, 0xe2, 0xc0, 0x1b, 0x32, 0xf4, 0x31, 0x0b, 0x5f, 0xb5, + 0x19, 0x09, 0x71, 0x02, 0xd6, 0x51, 0xff, 0xc6, 0xbc, 0xd6, 0x7e, 0x81, + 0xda, 0x04, 0xda, 0xec, 0x9b, 0x68, 0xc4, 0xe5, 0x5f, 0x9d, 0x21, 0xc9, + 0x0c, 0xd6, 0xfc, 0x30, 0xe8, 0x43, 0xf1, 0xbc, 0x65, 0xca, 0x96, 0xa3, + 0x4c, 0xb5, 0x0a, 0xb2, 0x28, 0xe0, 0x56, 0xf3, 0x78, 0x6d, 0x31, 0xfd, + 0x65, 0xe5, 0x25, 0x87, 0x23, 0xb9, 0x83, 0xfa, 0xa0, 0xb9, 0x6d, 0x8f, + 0x53, 0x55, 0x07, 0xc4, 0xc5, 0xeb, 0x7c, 0x3f, 0x51, 0xc5, 0x94, 0x46, + 0x08, 0x71, 0xe4, 0x43, 0x03, 0x99, 0xbc, 0x55, 0x46, 0x68, 0x5c, 0xa3, + 0x25, 0x17, 0x67, 0x11, 0xa7, 0xc8, 0xe4, 0x95, 0xf0, 0x84, 0xbd, 0x2b, + 0xfc, 0x98, 0x3d, 0x0f, 0x12, 0xdc, 0xe7, 0x4a, 0x7d, 0xe7, 0xa8, 0xd7, + 0xad, 0x56, 0xd1, 0x83, 0x2e, 0x6a, 0xa1, 0xdf, 0xd5, 0x92, 0x91, 0xf4, + 0xcc, 0x26, 0x02, 0x23, 0x6a, 0x86, 0x76, 0x7a, 0x62, 0x09, 0x87, 0xca, + 0xe6, 0xf9, 0xf6, 0xd5, 0x5c, 0x5b, 0xc0, 0x71, 0x0c, 0x05, 0x0c, 0x1f, + 0xa7, 0x9d, 0x28, 0xf2, 0x0d, 0x7e, 0x36, 0xed, 0xf9, 0xde, 0x8b, 0xd4, + 0xa4, 0x29, 0xe2, 0x35, 0x4a, 0xe5, 0xe4, 0xa5, 0x15, 0xab, 0x9b, 0x61, + 0x22, 0xab, 0xf7, 0x63, 0x2b, 0x6a, 0x65, 0xb9, 0xbc, 0x5e, 0x51, 0x90, + 0xf7, 0x90, 0xac, 0xed, 0x6e, 0x97, 0xcd, 0xa1, 0xe1, 0x41, 0x73, 0x10, + 0x5c, 0xc0, 0x1c, 0x16, 0x65, 0x31, 0xdc, 0xcf, 0xc4, 0xd6, 0xc9, 0xc5, + 0xbf, 0x0f, 0x36, 0x97, 0x4f, 0x73, 0x0b, 0x13, 0x8a, 0x37, 0x45, 0x25, + 0x56, 0x27, 0x07, 0xd2, 0x42, 0x6d, 0xac, 0x2b, 0x66, 0xfe, 0xea, 0xb5, + 0x50, 0xf7, 0xb7, 0xf6, 0xeb, 0x84, 0x66, 0xf4, 0x56, 0x52, 0xa5, 0x2b, + 0xef, 0x6f, 0xa3, 0xee, 0xb1, 0xaa, 0x88, 0xcb, 0xf0, 0x61, 0x46, 0x43, + 0xd1, 0x36, 0x8b, 0xb4, 0x4c, 0x93, 0xbf, 0x32, 0x5d, 0x4d, 0x9f, 0xbc, + 0x7a, 0xd1, 0xdc, 0x2f, 0xc8, 0x62, 0xda, 0x28, 0x9e, 0x9b, 0x56, 0x21, + 0xe5, 0x5e, 0xa5, 0xbe, 0x0a, 0x6a, 0xf9, 0x56, 0x66, 0x93, 0xd0, 0x6f, + 0x67, 0x57, 0xe3, 0x47, 0xe6, 0x07, 0xba, 0x09, 0x61, 0x6c, 0x6c, 0x02, + 0xb0, 0xa6, 0xab, 0xac, 0x6a, 0x31, 0xb0, 0xda, 0xa7, 0xc8, 0x23, 0x54, + 0x76, 0x9e, 0x3f, 0x3c, 0xdb, 0x10, 0xa6, 0x5f, 0x60, 0x31, 0x4e, 0x42, + 0xb4, 0x4c, 0x7c, 0xc7, 0x34, 0xc1, 0x1b, 0xb5, 0x5d, 0x03, 0x29, 0xc8, + 0x4c, 0x36, 0x74, 0x90, 0x51, 0x8b, 0x59, 0xbc, 0x1e, 0x29, 0xd2, 0x5f, + 0x7f, 0x99, 0x08, 0x76, 0x9b, 0x1a, 0xb4, 0xa3, 0x63, 0xb4, 0x26, 0xea, + 0x9e, 0x89, 0x9c, 0xa3, 0xd8, 0xa7, 0xdc, 0x8b, 0x59, 0x6f, 0x01, 0xb6, + 0xaa, 0x06, 0xf8, 0x59, 0x08, 0x10, 0x96, 0xa1, 0x6c, 0x8c, 0x7d, 0xaa, + 0x68, 0x55, 0xec, 0x10, 0x36, 0xda, 0x6e, 0x9a, 0xdd, 0xf4, 0x82, 0x9b, + 0x8a, 0x4e, 0x12, 0x83, 0x1f, 0x1e, 0xad, 0x26, 0xc9, 0xb5, 0x90, 0xb6, + 0xbd, 0xd7, 0x32, 0xf8, 0x05, 0xd3, 0x47, 0x3c, 0x35, 0xb2, 0x55, 0xa2, + 0x32, 0xbc, 0xf4, 0x41, 0x19, 0x95, 0x2f, 0x4b, 0x56, 0x2c, 0x4d, 0x74, + 0x64, 0xbe, 0xc5, 0x0b, 0x4f, 0x7d, 0xca, 0x40, 0x1c, 0x1a, 0xb1, 0xfa, + 0x0d, 0x68, 0xa9, 0xc8, 0x88, 0xb3, 0x1f, 0x04, 0x0e, 0x38, 0x34, 0x29, + 0x3e, 0x39, 0xba, 0x3f, 0xc5, 0x51, 0x0d, 0x43, 0x58, 0x7e, 0xf2, 0x25, + 0xbb, 0x1d, 0x71, 0x12, 0x86, 0x69, 0x5f, 0x5c, 0x6c, 0x8c, 0x38, 0x89, + 0x56, 0x69, 0x35, 0xb5, 0x8e, 0xf4, 0xfc, 0x3c, 0x6b, 0x82, 0xc7, 0xf2, + 0x3a, 0xd8, 0x0c, 0x3e, 0x31, 0xfd, 0x45, 0x28, 0x42, 0x52, 0x59, 0x68, + 0xaa, 0xd0, 0x8a, 0x18, 0x44, 0x45, 0xcf, 0xb2, 0x53, 0x11, 0xbc, 0x76, + 0xe1, 0xa7, 0xa0, 0x60, 0xc2, 0x6f, 0x36, 0xe0, 0x07, 0x2a, 0xba, 0x05, + 0x4f, 0x48, 0x94, 0xfb, 0xc6, 0x03, 0x30, 0x9b, 0x71, 0x86, 0xad, 0x81, + 0x23, 0x65, 0xde, 0x63, 0x45, 0x69, 0x52, 0x98, 0x3f, 0x93, 0x9f, 0x23, + 0x13, 0x1c, 0x54, 0xb8, 0x5f, 0x53, 0xb8, 0x79, 0xaa, 0xf0, 0x30, 0xeb, + 0xaf, 0xb8, 0x53, 0xa6, 0x58, 0x54, 0x47, 0xbe, 0x2f, 0x10, 0x48, 0x67, + 0xa4, 0xad, 0xda, 0x37, 0x11, 0xd3, 0x60, 0x95, 0xa4, 0x25, 0x09, 0xb6, + 0x5f, 0x7c, 0xbc, 0xfc, 0x48, 0xef, 0x68, 0x76, 0xc4, 0x7f, 0x11, 0x31, + 0xbe, 0xea, 0x12, 0xe5, 0x5b, 0x0f, 0xdf, 0xc1, 0x56, 0x2c, 0x2f, 0x38, + 0x95, 0x59, 0x36, 0xb0, 0xc8, 0xfa, 0xf7, 0xf4, 0x29, 0x71, 0x9b, 0x93, + 0x42, 0x0a, 0x6f, 0xf9, 0x5a, 0x12, 0x34, 0x7c, 0x65, 0xa5, 0x2e, 0xa4, + 0xa8, 0xd8, 0xf6, 0xb0, 0xf8, 0x7c, 0x6f, 0x83, 0xf1, 0x32, 0xdd, 0xb7, + 0xa5, 0x21, 0x18, 0x78, 0x56, 0x5d, 0xf7, 0xac, 0x6b, 0x3c, 0x4a, 0xd4, + 0xb9, 0x9a, 0x3c, 0x0b, 0xfb, 0xd3, 0x38, 0x44, 0xf1, 0x46, 0x5e, 0x46, + 0x5d, 0xb3, 0x91, 0x6c, 0x17, 0xc8, 0x2d, 0x50, 0x69, 0xa5, 0xbe, 0x8d, + 0xda, 0xf5, 0x2d, 0x80, 0x1c, 0xbd, 0xe6, 0x72, 0x74, 0x85, 0xa6, 0x4b, + 0xd6, 0x36, 0x99, 0x64, 0x20, 0x7d, 0x29, 0xf4, 0x0f, 0x33, 0x43, 0xb1, + 0xcc, 0x3d, 0xbc, 0x9f, 0x02, 0x00, 0xff, 0xb2, 0x58, 0x6c, 0xc8, 0xe6, + 0x2f, 0x30, 0x32, 0xcb, 0x31, 0x58, 0xc6, 0x7a, 0xd4, 0x7a, 0x6c, 0x8a, + 0x80, 0x8f, 0xe5, 0x16, 0xbd, 0xa0, 0xcf, 0xe1, 0x75, 0x27, 0xd1, 0x71, + 0x9f, 0x8f, 0xba, 0xdf, 0xd5, 0xfd, 0xc9, 0x85, 0xe3, 0xc1, 0x80, 0x4d, + 0x22, 0x47, 0x78, 0xae, 0xc2, 0x41, 0xa3, 0x9c, 0xdd, 0x28, 0xf3, 0x4a, + 0x4b, 0x74, 0xec, 0x17, 0x03, 0xab, 0xf2, 0x99, 0x89, 0x0a, 0xd4, 0x58, + 0xe2, 0x84, 0xfb, 0x71, 0xca, 0x6c, 0xec, 0x1b, 0x21, 0x6c, 0x1a, 0xb0, + 0x0e, 0x0d, 0x26, 0xd2, 0x6f, 0x93, 0x99, 0x43, 0x2b, 0x38, 0xed, 0x67, + 0x77, 0x63, 0x2d, 0xc2, 0x6e, 0x68, 0xb6, 0xb0, 0x05, 0x02, 0xb2, 0x96, + 0x10, 0x89, 0x01, 0xdc, 0xeb, 0xd3, 0x42, 0xdc, 0x84, 0x69, 0xa2, 0x32, + 0xb2, 0x18, 0xd2, 0x16, 0x37, 0x12, 0x01, 0x63, 0x8c, 0xf3, 0x68, 0x73, + 0x7a, 0xed, 0x58, 0x07, 0x85, 0xfe, 0xb0, 0x0a, 0x98, 0x1d, 0x0f, 0x71, + 0x15, 0xb1, 0x31, 0xb8, 0x26, 0xf7, 0x9d, 0x68, 0x3b, 0x74, 0x57, 0x95, + 0x31, 0xba, 0x4f, 0xbf, 0x0a, 0x4f, 0xde, 0x06, 0xa0, 0xc6, 0x0b, 0x28, + 0xce, 0x4f, 0xaa, 0x9b, 0x51, 0x7b, 0x6f, 0x4a, 0x60, 0x7e, 0x07, 0x8f, + 0x12, 0xe3, 0x79, 0xb5, 0x67, 0x11, 0x8c, 0x7f, 0xba, 0xfc, 0x00, 0xc7, + 0xa9, 0xfb, 0x3d, 0xef, 0xa2, 0x26, 0x57, 0xed, 0x60, 0x02, 0xb6, 0x9f, + 0xcc, 0x37, 0x14, 0x4b, 0x2b, 0xe4, 0x58, 0xf1, 0x46, 0x28, 0x0c, 0x88, + 0x44, 0x89, 0x51, 0x45, 0xf4, 0xf1, 0x26, 0x3f, 0xf8, 0x15, 0x7e, 0x15, + 0x0c, 0x5d, 0xbc, 0x3c, 0xfb, 0xd4, 0xa1, 0x19, 0x10, 0x75, 0x74, 0x3a, + 0xe5, 0xfa, 0xd7, 0x37, 0x70, 0x53, 0x55, 0x55, 0x05, 0x87, 0x40, 0x0f, + 0x94, 0xd3, 0xbf, 0x73, 0xc3, 0x3d, 0xec, 0xf7, 0x53, 0x4e, 0xd4, 0x1a, + 0xa9, 0xb1, 0x59, 0xae, 0x7d, 0xeb, 0x65, 0xd7, 0xbc, 0xc5, 0x29, 0xc7, + 0xa6, 0x83, 0x71, 0xe6, 0x00, 0x70, 0xe4, 0xfa, 0x0c, 0x68, 0x4d, 0x95, + 0xeb, 0xa1, 0x1a, 0x3f, 0x7d, 0x58, 0x76, 0x08, 0x9d, 0x16, 0xb5, 0x82, + 0xf5, 0xc3, 0x70, 0xcb, 0xba, 0x34, 0x64, 0x83, 0x73, 0x15, 0x6e, 0x54, + 0x0d, 0xf2, 0xf8, 0x6d, 0xbf, 0xb5, 0xfb, 0x70, 0x31, 0x4c, 0xd3, 0xc5, + 0x94, 0x42, 0x58, 0x87, 0x65, 0x48, 0x1a, 0x32, 0x76, 0x22, 0xd1, 0x58, + 0xc2, 0x90, 0x95, 0x87, 0xfc, 0xa0, 0xe1, 0xde, 0x56, 0xc8, 0x5c, 0xb9, + 0xfd, 0x51, 0x1a, 0xdb, 0x3f, 0xd6, 0xb9, 0xec, 0x3d, 0x76, 0x7b, 0x7c, + 0xb7, 0x1f, 0x6d, 0xc6, 0x95, 0x82, 0xb4, 0xea, 0x74, 0xe9, 0xac, 0x16, + 0x63, 0xf1, 0x3d, 0xf0, 0x29, 0x22, 0xe7, 0xb7, 0xeb, 0x68, 0x9c, 0x24, + 0x0c, 0x68, 0x96, 0x59, 0x42, 0x8d, 0x06, 0x08, 0xaf, 0x9b, 0x4c, 0x9e, + 0x90, 0x4f, 0x4b, 0xe1, 0x01, 0x72, 0x16, 0x8e, 0xe4, 0x4c, 0x7d, 0x50, + 0xd2, 0x67, 0xb9, 0x21, 0xdb, 0x98, 0x20, 0x58, 0x49, 0x81, 0x04, 0x09, + 0x8e, 0x9e, 0x09, 0x29, 0xe3, 0xf3, 0xd4, 0x6c, 0x4a, 0x53, 0x47, 0x47, + 0xe3, 0xbf, 0x9b, 0xeb, 0xa8, 0x61, 0xc5, 0xb3, 0xdc, 0x90, 0x30, 0xa5, + 0x37, 0x78, 0xa4, 0xf7, 0xf0, 0x78, 0x44, 0x43, 0xdf, 0xcf, 0x14, 0xb6, + 0x7d, 0x58, 0xc9, 0x59, 0xa6, 0xd2, 0x1d, 0xc0, 0x61, 0x3c, 0xed, 0x71, + 0x91, 0x85, 0x6e, 0xe6, 0x9d, 0x68, 0xb4, 0x54, 0xf9, 0xf2, 0xf6, 0xdc, + 0xc9, 0x99, 0x2f, 0x4a, 0xac, 0x7b, 0xec, 0xd5, 0x98, 0xc0, 0xbe, 0x93, + 0x96, 0xc5, 0xd4, 0x47, 0x26, 0xd2, 0x68, 0x3d, 0xf2, 0x0d, 0xff, 0xc6, + 0x26, 0x73, 0x21, 0x6d, 0x80, 0xad, 0x52, 0xb7, 0x3a, 0x91, 0xc7, 0x4c, + 0x4b, 0x63, 0xef, 0x49, 0xaf, 0x71, 0xd6, 0x40, 0x61, 0x6f, 0xd2, 0x96, + 0x0c, 0xbf, 0x5c, 0x67, 0x72, 0xe5, 0x76, 0x8c, 0xa8, 0x0b, 0x00, 0x75, + 0xbd, 0x0f, 0xd6, 0x3b, 0x6f, 0xf1, 0x67, 0xbe, 0xb6, 0x23, 0x6d, 0xcf, + 0xc4, 0x8e, 0xe7, 0x31, 0xd7, 0x17, 0x51, 0xf3, 0x58, 0xba, 0x0e, 0x3f, + 0x72, 0x2c, 0x7f, 0xdc, 0xb4, 0xea, 0x73, 0x54, 0xbc, 0xe0, 0x1f, 0x17, + 0x44, 0x68, 0x1d, 0x12, 0xd0, 0xd2, 0x15, 0x73, 0xbc, 0xed, 0x40, 0xe3, + 0x46, 0x67, 0x7b, 0x7e, 0xad, 0x8f, 0xc6, 0x8e, 0x6c, 0xf5, 0x8a, 0x63, + 0xdb, 0x21, 0x99, 0x49, 0xe6, 0x5f, 0x48, 0xb0, 0xf2, 0x47, 0xc6, 0xd5, + 0xc3, 0x6c, 0x8f, 0xe2, 0x00, 0xba, 0x2f, 0x67, 0x04, 0xbf, 0x04, 0xd4, + 0x96, 0x29, 0xaa, 0x00, 0x75, 0x58, 0x4b, 0xb2, 0x38, 0x78, 0xee, 0xe9, + 0x0b, 0x71, 0x1a, 0xaf, 0xf8, 0x20, 0xcf, 0xbd, 0xf4, 0x55, 0x92, 0x8d, + 0xbf, 0xeb, 0x8e, 0xae, 0xf9, 0x93, 0x10, 0x93, 0x9b, 0xd8, 0xee, 0xf3, + 0x93, 0x83, 0x43, 0x11, 0xbe, 0x27, 0xb9, 0xeb, 0x43, 0xba, 0x9f, 0xc3, + 0x97, 0x07, 0x5a, 0x51, 0x07, 0x39, 0xed, 0xb8, 0x70, 0xd7, 0x3c, 0xb6, + 0xed, 0x75, 0x0e, 0x03, 0xb5, 0xb9, 0xf3, 0x5d, 0x2d, 0x4f, 0x7c, 0x3c, + 0xbb, 0x8d, 0x3a, 0xb4, 0x10, 0x8a, 0xf7, 0x07, 0xb9, 0x15, 0x80, 0x4d, + 0x84, 0xa2, 0x3e, 0x6f, 0xc6, 0xb7, 0x85, 0x55, 0x64, 0xca, 0x0a, 0xc8, + 0x2c, 0xe0, 0x46, 0xd9, 0x38, 0xae, 0x8a, 0x56, 0x46, 0x93, 0xbf, 0xd3, + 0xed, 0xaf, 0x5b, 0xfb, 0x32, 0xde, 0x85, 0x2f, 0x66, 0x36, 0x06, 0x42, + 0xbe, 0xef, 0xe5, 0xb1, 0x63, 0x53, 0x56, 0x4e, 0xfa, 0xfc, 0xb2, 0xea, + 0x28, 0x71, 0xe5, 0x9b, 0xb9, 0x7d, 0x2a, 0x25, 0x17, 0xc3, 0xb0, 0x69, + 0xad, 0x32, 0x6f, 0x6c, 0x5c, 0x5a, 0x80, 0x02, 0x06, 0xe9, 0x58, 0xdf, + 0x9b, 0x78, 0x82, 0xaf, 0x33, 0xcc, 0x71, 0xe8, 0xa6, 0x3d, 0xf4, 0x3a, + 0xd6, 0x71, 0x40, 0x7d, 0x8f, 0x76, 0xbf, 0x14, 0x84, 0x02, 0x64, 0x30, + 0x8d, 0xc4, 0xfc, 0xe9, 0x0f, 0xd4, 0x1a, 0xda, 0x47, 0x08, 0xf9, 0x93, + 0x9c, 0x59, 0xb6, 0x58, 0x6e, 0xe5, 0x03, 0x35, 0xf2, 0x8f, 0x76, 0xcc, + 0x5d, 0xb9, 0x4c, 0x48, 0x02, 0x90, 0x61, 0x1c, 0x52, 0x09, 0xda, 0x1d, + 0xa0, 0xed, 0x51, 0xab, 0xdc, 0xe4, 0x2f, 0xe4, 0xbe, 0xf3, 0x5a, 0xa6, + 0xfa, 0x74, 0xd5, 0xf8, 0xc1, 0x4d, 0xe5, 0xaf, 0xb7, 0x61, 0xa4, 0x1c, + 0xf7, 0x42, 0x48, 0x59, 0xa4, 0xfc, 0x56, 0x03, 0x11, 0xf2, 0xd0, 0xf7, + 0x80, 0x19, 0xf6, 0xb3, 0x81, 0x6b, 0x1e, 0x43, 0xce, 0x8a, 0x59, 0xd4, + 0x84, 0xcd, 0xe0, 0x5b, 0xb2, 0xc3, 0xf1, 0x70, 0x4d, 0x53, 0x2f, 0xd9, + 0x62, 0xd3, 0x34, 0xe3, 0x73, 0xdc, 0x73, 0xbf, 0x6d, 0x46, 0x8a, 0xee, + 0x68, 0x30, 0xef, 0xc6, 0xe4, 0x2c, 0x13, 0x3f, 0x82, 0xbd, 0x1a, 0x95, + 0x94, 0x82, 0x27, 0xf1, 0x13, 0xf3, 0x61, 0x9f, 0x0c, 0xb2, 0x9d, 0x1a, + 0xd0, 0x40, 0xa6, 0xe0, 0xfe, 0xeb, 0xbd, 0x0d, 0x8b, 0x86, 0x1c, 0x32, + 0x8f, 0x4b, 0x50, 0xd7, 0x69, 0xd4, 0xa6, 0x7a, 0x62, 0x64, 0x13, 0x67, + 0x0a, 0x57, 0x17, 0x0c, 0x6a, 0x05, 0xcd, 0x2d, 0x83, 0xd1, 0x93, 0x33, + 0x30, 0xbb, 0x67, 0xde, 0x94, 0xf4, 0x40, 0xf4, 0x44, 0x60, 0x33, 0x93, + 0xc3, 0xa4, 0xba, 0x04, 0xb9, 0xc7, 0xce, 0x64, 0x6e, 0xc5, 0xd6, 0x40, + 0xe4, 0xbe, 0xb3, 0xb8, 0x3c, 0x77, 0x17, 0x22, 0xec, 0xf4, 0x24, 0x6b, + 0x09, 0xd6, 0x9d, 0xb7, 0x6b, 0x29, 0xb6, 0x84, 0xaa, 0xa9, 0x62, 0xbc, + 0xbd, 0x5d, 0x95, 0x2e, 0x8b, 0xa6, 0xf8, 0xc1, 0xdd, 0xeb, 0xbb, 0x3b, + 0x6e, 0x1e, 0x09, 0x61, 0xaf, 0x44, 0x56, 0x99, 0xe6, 0x01, 0xcd, 0x81, + 0xfc, 0xe7, 0x88, 0x47, 0x9f, 0x7d, 0x1a, 0x92, 0xdb, 0x42, 0x98, 0x93, + 0xa0, 0x99, 0xd9, 0x49, 0xec, 0x6b, 0x74, 0xe3, 0x59, 0x18, 0x56, 0xf4, + 0x65, 0x12, 0xe7, 0x99, 0x50, 0xe5, 0xb7, 0x99, 0x12, 0xaa, 0x24, 0x7b, + 0xee, 0x5e, 0x34, 0x3d, 0xf1, 0x14, 0x01, 0xbe, 0x05, 0x32, 0x7f, 0xa5, + 0x63, 0x99, 0x14, 0xda, 0xb0, 0x54, 0x74, 0x50, 0xe5, 0xe3, 0x5b, 0xdc, + 0xe4, 0x17, 0x98, 0xdb, 0x2e, 0x4f, 0x71, 0xc4, 0x3e, 0xf1, 0x2f, 0x8e, + 0xe1, 0x9c, 0xc7, 0x3c, 0x89, 0xe4, 0x38, 0xfd, 0x1c, 0x96, 0x12, 0x2a, + 0xcc, 0x3e, 0xda, 0xd8, 0x8a, 0xe0, 0x08, 0x7b, 0xe0, 0x5a, 0x51, 0xc9, + 0x68, 0xed, 0xb3, 0x16, 0x01, 0x07, 0x7c, 0x57, 0x96, 0x0a, 0xf1, 0xfb, + 0xfa, 0x5e, 0xdc, 0xb2, 0xe8, 0x6d, 0x6a, 0x5c, 0x74, 0xa8, 0xd3, 0x54, + 0x02, 0x1e, 0xa4, 0x9b, 0xce, 0xf2, 0xbb, 0x6e, 0x1a, 0x14, 0xbf, 0x30, + 0x69, 0x06, 0xd1, 0x56, 0x11, 0x75, 0x94, 0x5c, 0xca, 0x36, 0x2e, 0xa0, + 0xdf, 0x04, 0x9c, 0x21, 0x35, 0xc7, 0x95, 0x3d, 0x9f, 0x51, 0xd8, 0x95, + 0x95, 0xfd, 0x20, 0x9b, 0xde, 0xbc, 0xc4, 0x28, 0x2f, 0x1f, 0x7a, 0x26, + 0x27, 0x38, 0x45, 0x0f, 0x79, 0x5d, 0xc4, 0xd1, 0xdb, 0xb6, 0x83, 0xe1, + 0xaf, 0x29, 0xac, 0x23, 0x3d, 0x36, 0x71, 0x4a, 0xa9, 0x32, 0x49, 0x98, + 0xd0, 0xef, 0xb7, 0x8a, 0x76, 0xaa, 0xca, 0x93, 0x92, 0x99, 0x5c, 0x7b, + 0x38, 0x58, 0xc0, 0xa5, 0xfd, 0xc0, 0x76, 0x2f, 0xd8, 0x93, 0xa6, 0x97, + 0x05, 0xf4, 0x00, 0xd2, 0x4f, 0xa3, 0x99, 0xb9, 0x44, 0x14, 0x45, 0xc2, + 0x20, 0xce, 0xbc, 0x72, 0x38, 0x91, 0x13, 0x73, 0xd9, 0xba, 0x96, 0x23, + 0x8e, 0xe3, 0xa7, 0x83, 0x9b, 0xe2, 0x90, 0x94, 0x8c, 0x6f, 0x10, 0x0f, + 0x57, 0x08, 0x1c, 0xb4, 0xe4, 0xde, 0xf0, 0x19, 0xd5, 0x5a, 0x39, 0xf3, + 0x14, 0xa2, 0x9a, 0xdd, 0xc8, 0x73, 0xbc, 0xbb, 0x6c, 0x25, 0x0a, 0xde, + 0x91, 0x38, 0xca, 0x48, 0x08, 0x57, 0xec, 0xa9, 0x8f, 0x63, 0x4b, 0x89, + 0xbe, 0x05, 0x06, 0x6f, 0xfe, 0x76, 0xda, 0xc6, 0x64, 0xce, 0x4a, 0x95, + 0x71, 0x19, 0xe1, 0xfb, 0x5e, 0xeb, 0x34, 0xf0, 0x08, 0x90, 0x41, 0x34, + 0xff, 0x08, 0x84, 0x02, 0x2f, 0x1f, 0x26, 0x93, 0xc8, 0x41, 0x62, 0xc2, + 0x6c, 0x17, 0xe0, 0x34, 0xf9, 0x3c, 0x4b, 0x7a, 0xcb, 0x78, 0xe3, 0x7d, + 0x69, 0x7a, 0xe6, 0x38, 0x35, 0x76, 0x52, 0x34, 0x1b, 0x09, 0xa1, 0x8f, + 0x3c, 0x2b, 0xa7, 0xd3, 0x99, 0xaf, 0x32, 0x3b, 0x84, 0xdd, 0xf5, 0xc8, + 0xd8, 0xb3, 0xb6, 0xca, 0xa3, 0xfe, 0x80, 0x7b, 0x94, 0xb2, 0x1f, 0xdd, + 0xfc, 0x96, 0xda, 0xde, 0x60, 0xa3, 0x9e, 0xf9, 0xb7, 0x4e, 0x8b, 0xcb, + 0xf0, 0x21, 0xcb, 0xab, 0xe4, 0x5d, 0x0d, 0x89, 0x8f, 0xa3, 0x5b, 0xfb, + 0xb9, 0xf9, 0xf2, 0xce, 0x58, 0x02, 0x97, 0xd9, 0xef, 0x32, 0xf6, 0xab, + 0xef, 0x5d, 0x88, 0xe7, 0x83, 0xae, 0x9f, 0xef, 0x75, 0x64, 0xfc, 0xc0, + 0x25, 0xb9, 0xf3, 0x58, 0x42, 0x8b, 0xe3, 0xb6, 0x31, 0xd6, 0x2e, 0x73, + 0x2b, 0x8b, 0x92, 0xa6, 0xaf, 0x7d, 0x47, 0x1c, 0x06, 0x84, 0x68, 0x77, + 0x76, 0x98, 0x50, 0x21, 0x38, 0x46, 0x5d, 0x6a, 0x14, 0x79, 0xf6, 0xdf, + 0x63, 0x09, 0xa3, 0x56, 0xe5, 0x9b, 0xa2, 0x72, 0x24, 0x3b, 0xcd, 0xce, + 0xb1, 0x30, 0x1d, 0x83, 0x92, 0x60, 0x50, 0xab, 0x60, 0xd0, 0x1b, 0x2f, + 0xb7, 0x57, 0xb9, 0xe2, 0x87, 0x7f, 0xdd, 0x18, 0x07, 0x5c, 0x49, 0xdc, + 0xec, 0x46, 0x98, 0xe7, 0x43, 0x9b, 0x0b, 0x0e, 0xf9, 0xff, 0xf0, 0xcd, + 0x27, 0x6b, 0x25, 0xa3, 0x95, 0xd9, 0xfc, 0x03, 0xa1, 0x50, 0xd0, 0x94, + 0xb1, 0xb0, 0xf3, 0xcd, 0x3e, 0x1c, 0xf6, 0x9c, 0xe8, 0xaf, 0x02, 0x5d, + 0x1c, 0x06, 0x15, 0x21, 0x38, 0x81, 0x34, 0x78, 0x0d, 0x1b, 0xaa, 0x6d, + 0xea, 0x9b, 0x30, 0xd9, 0xe7, 0x3e, 0xdf, 0x7a, 0x4f, 0x34, 0x65, 0x12, + 0x0b, 0x9d, 0x1b, 0x0f, 0x1c, 0x3b, 0xe8, 0x49, 0x51, 0xde, 0xd5, 0xf7, + 0x01, 0x28, 0x31, 0x6b, 0xd7, 0x82, 0xd3, 0xd9, 0x55, 0xf7, 0x41, 0x4f, + 0x32, 0x6c, 0x84, 0x9c, 0x69, 0xd9, 0x4b, 0xc3, 0x35, 0xf4, 0x51, 0x99, + 0x0c, 0x7c, 0x7c, 0x52, 0xaf, 0xbe, 0x59, 0x2d, 0x9b, 0xfa, 0xdb, 0xdd, + 0x9a, 0xdc, 0x60, 0xd2, 0x00, 0xdf, 0xee, 0x56, 0x4a, 0xac, 0x4e, 0xd1, + 0x93, 0x68, 0x7b, 0xcc, 0x55, 0x58, 0x16, 0x93, 0xd6, 0x49, 0x94, 0x19, + 0xa4, 0x5d, 0xad, 0xf6, 0x7e, 0x53, 0x0b, 0x13, 0x64, 0xe1, 0xe6, 0x14, + 0xf2, 0x75, 0x82, 0x67, 0xa8, 0xdd, 0x82, 0xfd, 0xa3, 0x5f, 0x07, 0xc1, + 0x67, 0xa6, 0xe3, 0x11, 0x06, 0x1a, 0xac, 0xc9, 0x39, 0x7f, 0xed, 0x70, + 0x78, 0x52, 0xea, 0xc4, 0xac, 0x4f, 0x71, 0x4e, 0x2a, 0x7e, 0x2b, 0x36, + 0xd7, 0x58, 0xeb, 0x40, 0x4b, 0x1d, 0xb6, 0xc9, 0x01, 0x9a, 0xec, 0x12, + 0x73, 0x08, 0xf7, 0x7e, 0x50, 0x09, 0xcf, 0xfa, 0xcb, 0xfb, 0xf9, 0x8c, + 0x3d, 0x95, 0x44, 0xc7, 0xab, 0x8b, 0x3f, 0x26, 0x78, 0xe6, 0x3a, 0x51, + 0x77, 0x2b, 0x68, 0x67, 0xe7, 0xd5, 0x11, 0xfd, 0x9d, 0xa8, 0x36, 0xae, + 0x62, 0x67, 0xe1, 0xa5, 0x9b, 0x14, 0x39, 0x6e, 0x0e, 0xe1, 0x73, 0xa6, + 0xa3, 0x1a, 0x5f, 0x3d, 0x21, 0xe3, 0xe5, 0x91, 0xc2, 0xe5, 0xc6, 0x75, + 0x27, 0x55, 0x1c, 0x86, 0x16, 0x46, 0xf8, 0xfb, 0xc7, 0xf1, 0x01, 0x8d, + 0xac, 0x07, 0xa6, 0x9f, 0x41, 0xc0, 0xa5, 0xa8, 0xcf, 0x5e, 0xfa, 0x0d, + 0xf5, 0x0d, 0x37, 0x90, 0x1f, 0x3f, 0x03, 0x0e, 0xc3, 0x39, 0xd1, 0x64, + 0x38, 0x83, 0xe2, 0x33, 0x4a, 0x25, 0x68, 0xbb, 0x6f, 0x81, 0x30, 0x1b, + 0xb8, 0xa7, 0xe8, 0x9c, 0x63, 0xc0, 0x5b, 0xcf, 0x4a, 0x36, 0x18, 0x43, + 0xf2, 0x7e, 0xe5, 0x06, 0x5d, 0x79, 0x76, 0x3d, 0x66, 0x6a, 0x4d, 0xdd, + 0x7f, 0x3f, 0xa0, 0x57, 0x64, 0x7c, 0xde, 0x02, 0xed, 0x17, 0xb5, 0xa4, + 0x88, 0xb1, 0x47, 0xc8, 0x40, 0x79, 0x34, 0x33, 0xc0, 0x80, 0xc6, 0x1e, + 0x13, 0x39, 0xe0, 0x93, 0x95, 0xd4, 0x91, 0xa9, 0x5d, 0x37, 0x89, 0x14, + 0x5c, 0xe7, 0x94, 0x4c, 0x6f, 0x04, 0x35, 0xfa, 0x7c, 0x7f, 0x43, 0x19, + 0xe2, 0xc7, 0x35, 0xa6, 0x70, 0x1e, 0xbf, 0xe2, 0x81, 0x0d, 0x29, 0x48, + 0x37, 0xf4, 0x0c, 0x94, 0x60, 0x29, 0x0d, 0xc6, 0x67, 0x2d, 0x71, 0x75, + 0xfe, 0x8e, 0x9f, 0x9a, 0x9c, 0xd4, 0x0d, 0x39, 0x80, 0xb2, 0x3a, 0x3e, + 0xe3, 0xa5, 0x9b, 0x44, 0x60, 0x35, 0x01, 0x96, 0x37, 0x8f, 0x50, 0x2c, + 0x05, 0x10, 0x20, 0xc6, 0xfa, 0x83, 0xb3, 0x9c, 0xcc, 0x11, 0x3c, 0xdc, + 0x35, 0x7d, 0x7a, 0x2a, 0x71, 0x11, 0x69, 0x8b, 0x84, 0xe9, 0x02, 0xc8, + 0xd0, 0x71, 0x89, 0x6e, 0x03, 0x00, 0x73, 0x74, 0xb8, 0xc8, 0xac, 0xfa, + 0x12, 0xf7, 0x4b, 0x05, 0x32, 0x28, 0xd9, 0xf4, 0x04, 0x1d, 0x20, 0x9a, + 0x2e, 0x7b, 0x12, 0xab, 0x19, 0x14, 0x53, 0x43, 0x1e, 0xda, 0x39, 0xcb, + 0xca, 0xdb, 0x04, 0xdb, 0x7b, 0x85, 0xa7, 0x7c, 0xa1, 0x5e, 0xd7, 0x5e, + 0xf1, 0xfa, 0x87, 0xa6, 0xdd, 0x45, 0x1b, 0x6e, 0x09, 0x2d, 0x29, 0x14, + 0x0e, 0xa4, 0xef, 0xf0, 0x09, 0x12, 0x93, 0x8e, 0xdf, 0x30, 0x9b, 0xbf, + 0xa6, 0x28, 0xbf, 0x3d, 0xdc, 0xa3, 0x97, 0x4f, 0x9d, 0xbc, 0x00, 0x5f, + 0x55, 0x3a, 0xc9, 0x97, 0xe8, 0x36, 0x1d, 0x31, 0x61, 0x3d, 0x29, 0x4b, + 0xc6, 0x5f, 0x9a, 0x5f, 0xbf, 0x5c, 0x81, 0x02, 0xc7, 0x83, 0xfa, 0x2d, + 0xd1, 0xc6, 0xac, 0x0c, 0xa7, 0xbe, 0x0e, 0xf9, 0x0d, 0xcd, 0xd9, 0xed, + 0x82, 0x90, 0x00, 0x19, 0x0a, 0x8c, 0x1a, 0x65, 0x8a, 0xc0, 0x55, 0xa2, + 0xfb, 0x36, 0x03, 0x85, 0xb9, 0xdd, 0xfa, 0x16, 0x71, 0xaa, 0x7a, 0xcb, + 0x76, 0xd5, 0xf0, 0x8d, 0x22, 0xe2, 0xd7, 0x90, 0x0c, 0xc3, 0x57, 0x7c, + 0x56, 0x82, 0x6a, 0xea, 0xe8, 0xe1, 0x96, 0xd1, 0x46, 0xd8, 0x50, 0x4e, + 0xe0, 0x6a, 0xcc, 0xa6, 0x36, 0x14, 0xa7, 0x89, 0x29, 0x71, 0x15, 0xa4, + 0x1b, 0xb9, 0x6c, 0xa4, 0xf1, 0x3f, 0x1b, 0xd2, 0x64, 0x6b, 0x97, 0xdc, + 0xe2, 0xe8, 0xb4, 0x15, 0x69, 0x68, 0xd7, 0x28, 0x10, 0x26, 0x19, 0x26, + 0x27, 0x08, 0x34, 0xa9, 0x61, 0xb7, 0x79, 0x13, 0x01, 0x38, 0xe1, 0x18, + 0x0d, 0xc8, 0x56, 0x86, 0xea, 0xca, 0x18, 0xd8, 0xbb, 0xf8, 0xc1, 0xc4, + 0x6d, 0x97, 0x82, 0x9a, 0x0d, 0xb7, 0xde, 0xf6, 0xfa, 0xc0, 0x69, 0x1d, + 0xb2, 0x8e, 0x82, 0xc4, 0x17, 0x33, 0x05, 0xa2, 0x46, 0xcb, 0xaa, 0x11, + 0x19, 0xde, 0x84, 0x35, 0x28, 0x5e, 0x4a, 0x50, 0x98, 0x96, 0xe2, 0x39, + 0xa1, 0x77, 0x99, 0xd2, 0x15, 0xee, 0x88, 0xe7, 0xd7, 0x74, 0x41, 0x21, + 0xe5, 0x51, 0xfd, 0xfa, 0x21, 0xe0, 0x02, 0x63, 0x35, 0x86, 0xc4, 0x27, + 0xac, 0x45, 0x00, 0x15, 0xce, 0x85, 0xed, 0xe0, 0xc1, 0xc7, 0xcd, 0xac, + 0x1f, 0x74, 0xfc, 0x02, 0x55, 0xc0, 0xe1, 0x0f, 0x9e, 0x5a, 0x20, 0x89, + 0xe0, 0xf3, 0x14, 0x4e, 0x63, 0x53, 0xc7, 0xd7, 0xd7, 0xaf, 0x1f, 0x01, + 0x08, 0x4d, 0xb9, 0x66, 0x23, 0x37, 0xfa, 0xd0, 0x28, 0x42, 0xc6, 0xa1, + 0xce, 0xeb, 0x14, 0x69, 0xd9, 0x17, 0x62, 0xc6, 0x5e, 0x10, 0x9d, 0x3f, + 0x74, 0x9e, 0xb0, 0x97, 0xfc, 0x25, 0x27, 0x95, 0x7f, 0xf9, 0xd2, 0x65, + 0x52, 0x81, 0xb8, 0x86, 0xb7, 0xbf, 0xf3, 0x26, 0xf2, 0xe3, 0x17, 0x50, + 0xd9, 0x4e, 0x2e, 0x2b, 0xce, 0x17, 0x31, 0x03, 0x08, 0x5b, 0x6d, 0xa9, + 0x22, 0xad, 0xe9, 0x99, 0x00, 0x6f, 0x22, 0xee, 0x03, 0xa7, 0xde, 0xb3, + 0x14, 0x94, 0xc4, 0xa1, 0xfb, 0x8f, 0xd8, 0x64, 0xab, 0x69, 0x7e, 0x42, + 0xa9, 0xb6, 0xbc, 0xc9, 0xe4, 0x7d, 0x9f, 0xf6, 0xbb, 0x1d, 0x93, 0xf2, + 0xd4, 0x49, 0x1f, 0xc8, 0xf8, 0x9e, 0xe1, 0x42, 0x6c, 0x05, 0xbc, 0x2d, + 0x61, 0x9e, 0xc8, 0x17, 0xa0, 0xc4, 0x10, 0xb9, 0xaf, 0x9b, 0x33, 0xa0, + 0x26, 0x8f, 0x03, 0x0f, 0xf7, 0xcc, 0x69, 0x74, 0xaa, 0xf0, 0x47, 0x5a, + 0xf1, 0x2e, 0x8a, 0x36, 0xb9, 0x68, 0x43, 0xbb, 0x3b, 0x70, 0x91, 0x78, + 0xf3, 0x67, 0x38, 0x24, 0xe9, 0x78, 0xc2, 0x99, 0x80, 0xf4, 0x5a, 0x06, + 0xbf, 0xab, 0x14, 0xf6, 0xc8, 0x5b, 0x63, 0xae, 0xef, 0x4f, 0xd7, 0xd9, + 0x24, 0x21, 0x5a, 0x90, 0xf6, 0xcc, 0x6e, 0x2a, 0x21, 0x7c, 0x6b, 0x45, + 0xbe, 0x7e, 0x44, 0xf0, 0xe5, 0x72, 0xd2, 0xe5, 0x91, 0xae, 0x3b, 0x83, + 0xd5, 0xdb, 0x45, 0x51, 0x55, 0x3b, 0xb8, 0x7c, 0xdb, 0xdd, 0x47, 0xf6, + 0xe3, 0x31, 0x88, 0x9f, 0x7b, 0x73, 0x9d, 0x1f, 0xae, 0xdd, 0xfb, 0xdf, + 0xb3, 0xb2, 0xbb, 0xfe, 0xe6, 0x31, 0xd1, 0x39, 0x8c, 0xa6, 0xb8, 0x3e, + 0xd8, 0x5b, 0xbb, 0x87, 0x58, 0x9b, 0x57, 0x98, 0x46, 0x83, 0x28, 0x46, + 0x48, 0xb7, 0x45, 0x70, 0xb7, 0xa5, 0x5d, 0x2d, 0x74, 0xf1, 0x5d, 0x31, + 0x1f, 0x5a, 0xc4, 0x13, 0x10, 0x42, 0x01, 0x05, 0xe0, 0x1e, 0x3c, 0x0f, + 0x46, 0x25, 0x9a, 0x52, 0xc4, 0xd4, 0xab, 0xbd, 0x1d, 0x58, 0xb3, 0x73, + 0x60, 0x72, 0x1c, 0xa3, 0xfd, 0x26, 0x42, 0xdd, 0x3b, 0x47, 0x1b, 0xf5, + 0x19, 0x1d, 0x5e, 0xaf, 0x24, 0xe2, 0x89, 0x8c, 0x9e, 0xb1, 0x82, 0x6e, + 0xcf, 0x85, 0x88, 0x3a, 0xbc, 0xa0, 0x8c, 0x68, 0x16, 0xde, 0xa0, 0xd6, + 0x7e, 0xc6, 0x53, 0x99, 0x2b, 0xea, 0x4d, 0x6f, 0x33, 0x0b, 0x5d, 0x19, + 0x26, 0x51, 0x8c, 0x74, 0x61, 0xa3, 0x0d, 0x06, 0x96, 0x1c, 0x27, 0x2f, + 0xff, 0xc0, 0x78, 0xe5, 0x35, 0x4f, 0x4e, 0xe0, 0xcb, 0xa5, 0xc8, 0x64, + 0xb1, 0xc9, 0x17, 0x7b, 0xe7, 0x00, 0x7b, 0x53, 0x6d, 0xfa, 0x55, 0xae, + 0xb6, 0xf1, 0x22, 0xfb, 0x8c, 0x78, 0x87, 0x9c, 0x3a, 0x9c, 0xa0, 0x50, + 0x9f, 0xca, 0x50, 0x60, 0x5d, 0xf9, 0x60, 0x5f, 0x3a, 0x78, 0x8b, 0x43, + 0xf8, 0xc6, 0x2b, 0x5e, 0x2c, 0x32, 0xb4, 0x80, 0x0d, 0xa2, 0xbf, 0x26, + 0x0e, 0x55, 0x78, 0x42, 0x74, 0x84, 0x8b, 0xbf, 0x60, 0xe9, 0x3e, 0x44, + 0x85, 0x0c, 0x83, 0xec, 0x5b, 0x59, 0x6c, 0x77, 0xa6, 0x81, 0x71, 0x91, + 0x67, 0xd4, 0xc5, 0xa1, 0x35, 0x3d, 0x37, 0xff, 0xce, 0xe4, 0xe1, 0x33, + 0x60, 0xde, 0x3b, 0x90, 0x1a, 0x5d, 0xd9, 0xcd, 0x52, 0x58, 0x7a, 0x51, + 0x2c, 0x6b, 0x1e, 0xb5, 0x4e, 0x8d, 0x98, 0x75, 0xe6, 0xbd, 0x6e, 0xdb, + 0xac, 0xb9, 0x97, 0x4d, 0x4a, 0xfd, 0x6c, 0xd6, 0xf0, 0x16, 0xff, 0x71, + 0x10, 0x33, 0x08, 0x43, 0x19, 0x8c, 0x30, 0xca, 0xa7, 0xbe, 0x89, 0x29, + 0xf0, 0x24, 0x7e, 0x7f, 0x9e, 0x08, 0x8a, 0xd3, 0x4c, 0x3b, 0xd2, 0xd9, + 0x09, 0x0a, 0xeb, 0xcd, 0x74, 0xd8, 0x6b, 0x7a, 0x5e, 0x92, 0xd2, 0xac, + 0x9e, 0x2e, 0xbd, 0xb0, 0x79, 0xa3, 0x3e, 0x09, 0x05, 0x1d, 0xaa, 0x1a, + 0xb5, 0xb0, 0x75, 0xa5, 0x62, 0x8d, 0x3d, 0xd1, 0x3c, 0x31, 0xb8, 0x25, + 0xd5, 0x4d, 0xd7, 0xa5, 0x41, 0x84, 0x82, 0x0e, 0x2f, 0xef, 0x84, 0x40, + 0x54, 0x5a, 0x2c, 0xbb, 0x70, 0x01, 0x61, 0x11, 0xd7, 0xe7, 0x9a, 0x4a, + 0x78, 0xea, 0xaa, 0x19, 0x68, 0xc1, 0x18, 0x94, 0xa7, 0x9a, 0x16, 0x8d, + 0x0c, 0x9d, 0x23, 0x6e, 0x1e, 0xca, 0x7e, 0x73, 0x95, 0x18, 0x0f, 0xfe, + 0x77, 0x53, 0x23, 0x57, 0x1d, 0xba, 0xea, 0x0a, 0x07, 0xfd, 0x99, 0xda, + 0x4c, 0x75, 0x36, 0xcd, 0x1e, 0xca, 0x1d, 0xb9, 0x1d, 0x1f, 0x7d, 0xf8, + 0x7d, 0x29, 0x81, 0x5f, 0x17, 0x7c, 0x84, 0x5c, 0xcc, 0xdb, 0x6f, 0xa0, + 0x11, 0xb4, 0xaa, 0x4a, 0x31, 0x7b, 0x37, 0x58, 0xa0, 0x9e, 0x24, 0x19, + 0x28, 0x48, 0x62, 0xea, 0x65, 0x0d, 0x0a, 0x95, 0xfa, 0x09, 0x51, 0xae, + 0x79, 0xb1, 0xe7, 0xc7, 0x6f, 0x07, 0x06, 0x97, 0xda, 0xc8, 0x53, 0xa4, + 0x0a, 0x2f, 0x3b, 0xf2, 0x7c, 0x64, 0x21, 0xfb, 0xe6, 0xea, 0x98, 0x50, + 0xfa, 0xb1, 0x90, 0xa6, 0x84, 0x78, 0xe4, 0x37, 0xe8, 0x6f, 0xe0, 0xa2, + 0xf1, 0x3b, 0x6d, 0x05, 0xa2, 0xea, 0x48, 0x0a, 0x1d, 0x62, 0x59, 0x7c, + 0xd4, 0xf6, 0xfd, 0xc5, 0x70, 0x5c, 0x67, 0xd6, 0xdc, 0xcc, 0x26, 0x64, + 0x54, 0xdb, 0x6f, 0xd3, 0x59, 0x4a, 0x04, 0xef, 0xb4, 0x7c, 0xea, 0xbd, + 0x2b, 0xa7, 0x38, 0xaf, 0x9e, 0xca, 0x7c, 0x01, 0x62, 0x8a, 0x67, 0xbe, + 0xfc, 0xf9, 0x25, 0xfa, 0x17, 0x8b, 0x63, 0xa1, 0x4f, 0xd4, 0x9c, 0x66, + 0x56, 0xb3, 0x70, 0xa5, 0xf6, 0x5d, 0x0a, 0xf2, 0xeb, 0xfa, 0x08, 0xaf, + 0x95, 0x69, 0x19, 0x39, 0xa3, 0xf9, 0x63, 0x80, 0x98, 0x4c, 0x47, 0xb8, + 0x35, 0x9b, 0xc0, 0x72, 0xc7, 0xf4, 0x63, 0x50, 0x79, 0xc8, 0xa6, 0x5f, + 0x82, 0xfe, 0x14, 0x1f, 0x3d, 0xdb, 0x58, 0x32, 0x43, 0xaf, 0x93, 0xae, + 0x51, 0x30, 0xc5, 0x23, 0xbb, 0x4c, 0x82, 0x88, 0xa6, 0x1e, 0x7b, 0xfa, + 0xa2, 0x8a, 0x8e, 0x45, 0xe8, 0x06, 0xa2, 0x8d, 0x55, 0x78, 0x78, 0xa4, + 0xbe, 0xc3, 0xa6, 0x7d, 0x1d, 0x2b, 0x41, 0xa0, 0xcb, 0x30, 0x5b, 0x94, + 0xa5, 0xa9, 0x28, 0x73, 0x40, 0x2a, 0xcd, 0x53, 0x10, 0x1f, 0xc2, 0xc5, + 0x25, 0x60, 0x3a, 0xa5, 0x7f, 0x01, 0x9a, 0xbd, 0xd2, 0x3d, 0x5d, 0x86, + 0xdd, 0xc8, 0x79, 0x29, 0xc3, 0x9a, 0x46, 0x03, 0xbd, 0x06, 0xbc, 0xba, + 0x21, 0x9b, 0x3a, 0x11, 0x01, 0x30, 0xd9, 0x81, 0x75, 0x24, 0xda, 0xf1, + 0x1a, 0x7f, 0x9e, 0x10, 0x9b, 0xcf, 0x3d, 0x85, 0xf2, 0x9d, 0xab, 0x57, + 0x7b, 0x92, 0x82, 0xd9, 0x56, 0x05, 0xe5, 0x2b, 0x3d, 0x80, 0x6f, 0x18, + 0xb9, 0xeb, 0x32, 0xc9, 0x04, 0x52, 0x4e, 0x87, 0xfb, 0xc4, 0x22, 0xf5, + 0x64, 0x8a, 0x9b, 0x99, 0x14, 0x94, 0x8b, 0x92, 0x99, 0xd0, 0xd6, 0x3a, + 0xcf, 0x15, 0xc6, 0xcd, 0x8d, 0x89, 0x1a, 0xfe, 0xe3, 0x5e, 0x4c, 0xf9, + 0x7e, 0x38, 0x52, 0x08, 0xc3, 0x09, 0x27, 0xdc, 0x4a, 0x4e, 0x53, 0x5f, + 0x79, 0xb0, 0x6c, 0xd6, 0x4c, 0xec, 0xcd, 0x13, 0x22, 0x4a, 0xa2, 0x2f, + 0x62, 0x35, 0xe1, 0xde, 0x62, 0xf7, 0x63, 0x3e, 0xfa, 0xae, 0x00, 0x1b, + 0xe5, 0x93, 0x0c, 0xf1, 0x6b, 0xae, 0x05, 0x1c, 0x7e, 0x06, 0x32, 0x78, + 0x8d, 0xa7, 0xf9, 0xae, 0x78, 0x5a, 0xdf, 0xb3, 0x56, 0xd2, 0x2c, 0x11, + 0xe9, 0xc8, 0x23, 0x4b, 0xf4, 0x40, 0x7d, 0x33, 0x52, 0xc1, 0xde, 0xe6, + 0xa1, 0x8d, 0xb6, 0xfd, 0x1e, 0xf5, 0xef, 0x6a, 0x7c, 0x81, 0x23, 0xd4, + 0xaf, 0xa4, 0x07, 0x3a, 0x59, 0xde, 0xa1, 0x2a, 0x5e, 0x3e, 0x49, 0x84, + 0xfa, 0x40, 0xa5, 0xe0, 0x25, 0xd6, 0xdb, 0x57, 0x5b, 0x46, 0x8c, 0x00, + 0xd8, 0x51, 0x40, 0x1c, 0xe0, 0x0b, 0xf7, 0x20, 0xff, 0xc9, 0xd8, 0x48, + 0x09, 0x95, 0x71, 0x0a, 0xb3, 0xbb, 0x94, 0xb4, 0x77, 0xdd, 0x4c, 0x86, + 0x4c, 0x56, 0xe3, 0x68, 0x26, 0x3c, 0x9e, 0x74, 0x85, 0xf3, 0xa3, 0x68, + 0x95, 0xdb, 0xc3, 0xbf, 0xe7, 0xd2, 0x1f, 0x8d, 0x09, 0xa8, 0x59, 0xec, + 0xc5, 0xba, 0x45, 0xc8, 0x2c, 0x21, 0x76, 0xbf, 0x40, 0x6e, 0x5f, 0x6e, + 0xf6, 0x5f, 0x2f, 0xfe, 0xf1, 0x65, 0x0c, 0x16, 0x34, 0xd4, 0x29, 0x31, + 0x38, 0xa9, 0x7a, 0x8e, 0xa5, 0xb1, 0x47, 0x67, 0x85, 0xe6, 0x0a, 0x76, + 0x3d, 0x6b, 0x4d, 0x2a, 0x56, 0x03, 0x18, 0x71, 0x03, 0x25, 0x26, 0x8f, + 0x9d, 0xc7, 0xcd, 0x46, 0x6c, 0x77, 0x99, 0xcb, 0x2c, 0xee, 0x96, 0x8d, + 0xc3, 0x03, 0x17, 0x54, 0x2f, 0xe9, 0x62, 0x47, 0x1e, 0x30, 0x02, 0xa8, + 0xe1, 0x95, 0x24, 0xe4, 0x10, 0xfc, 0x9a, 0x4b, 0xd0, 0x52, 0x58, 0x5d, + 0x32, 0x87, 0xf6, 0xe9, 0x11, 0xf0, 0xf5, 0x31, 0x12, 0xd1, 0x8b, 0xc8, + 0x11, 0x3c, 0x7e, 0x3f, 0xa8, 0xba, 0xbe, 0x43, 0x01, 0xee, 0xbb, 0x51, + 0xca, 0xbf, 0x40, 0x69, 0x23, 0x3d, 0x73, 0x65, 0x29, 0x93, 0xf0, 0x9a, + 0xeb, 0xf9, 0xeb, 0x23, 0xaa, 0x94, 0x59, 0xea, 0xbb, 0xab, 0xf1, 0x24, + 0x65, 0xb0, 0xce, 0x49, 0xe0, 0xa1, 0x52, 0x4b, 0xbb, 0xa8, 0x4b, 0x2f, + 0x68, 0xd2, 0xf2, 0x1a, 0x94, 0x28, 0xd2, 0xec, 0xba, 0x63, 0x33, 0xcd, + 0x33, 0xdb, 0xd7, 0x26, 0x05, 0x81, 0xf9, 0x51, 0x47, 0xde, 0xd8, 0x95, + 0x10, 0x73, 0x25, 0x14, 0xb1, 0x75, 0xc7, 0x93, 0xdb, 0x7e, 0xa9, 0x57, + 0xe1, 0x9c, 0xbc, 0x1a, 0xba, 0x24, 0x36, 0xd1, 0x89, 0xe7, 0xb5, 0x50, + 0xa8, 0x9d, 0x31, 0x10, 0x86, 0xce, 0x86, 0x65, 0x5d, 0x82, 0x65, 0xa8, + 0x9f, 0x25, 0x18, 0xcc, 0xcf, 0x9e, 0x70, 0xac, 0xb3, 0x9d, 0x10, 0x75, + 0x87, 0x46, 0x77, 0x9f, 0xd4, 0x05, 0xd5, 0x2c, 0x99, 0x83, 0x29, 0x26, + 0x82, 0x9d, 0xe8, 0x31, 0xff, 0x05, 0xa8, 0x24, 0x4e, 0x5a, 0x5e, 0x92, + 0x8f, 0xae, 0x61, 0xf9, 0xbf, 0x1c, 0x31, 0x6d, 0x37, 0xb6, 0x83, 0x4d, + 0xb5, 0xfa, 0x3b, 0xff, 0x79, 0x1f, 0xcf, 0x6a, 0x00, 0x75, 0xf7, 0x24, + 0x7f, 0x40, 0x62, 0x76, 0x9c, 0x3e, 0x8f, 0x37, 0xd1, 0x78, 0xdc, 0x75, + 0x4f, 0x29, 0xa2, 0xa2, 0x78, 0x96, 0x6d, 0x74, 0xe1, 0x88, 0xf0, 0x95, + 0x54, 0x56, 0x1c, 0x02, 0xeb, 0xef, 0xe9, 0x47, 0x89, 0xf9, 0x80, 0x45, + 0x0c, 0xfe, 0x42, 0xad, 0xe8, 0xf5, 0xa1, 0xae, 0x01, 0x0e, 0x85, 0xee, + 0xf3, 0xf2, 0xe8, 0x49, 0x4d, 0x95, 0x41, 0x15, 0xc7, 0x2d, 0x8f, 0x7e, + 0x15, 0x4e, 0x95, 0xef, 0x88, 0xbf, 0x42, 0x90, 0x75, 0x6f, 0x9b, 0xee, + 0xaa, 0xf3, 0xa2, 0xc7, 0x9e, 0x01, 0x01, 0x32, 0xea, 0xf2, 0xc4, 0x0e, + 0x79, 0xaf, 0xdc, 0x3f, 0x2d, 0x29, 0xf8, 0x14, 0xc1, 0xea, 0x05, 0x00, + 0x53, 0x30, 0xae, 0x09, 0xbf, 0xb3, 0x38, 0x99, 0x61, 0x06, 0x1a, 0x6b, + 0x47, 0xea, 0x62, 0xc7, 0x00, 0x0d, 0xdb, 0xfa, 0xe4, 0x50, 0xa2, 0x6b, + 0x7b, 0xfd, 0x56, 0x15, 0xea, 0x6e, 0x71, 0x7a, 0x20, 0x0e, 0xbf, 0x6b, + 0x0d, 0x3d, 0xba, 0x66, 0xf0, 0x06, 0xa6, 0x1f, 0xbc, 0x93, 0x9e, 0xfa, + 0xc9, 0xba, 0x5b, 0x01, 0xcc, 0x5f, 0xd1, 0xc5, 0x2b, 0xee, 0x4c, 0x36, + 0x39, 0x22, 0x49, 0xaa, 0xbb, 0xb9, 0x03, 0xb6, 0x8f, 0x57, 0x9a, 0x09, + 0xf0, 0xc8, 0xa5, 0x3e, 0x5d, 0x97, 0xd4, 0xe4, 0x33, 0xb6, 0xdc, 0x08, + 0x7a, 0xc9, 0x60, 0x38, 0x42, 0xa0, 0x24, 0xbd, 0xac, 0x3b, 0xb2, 0xd1, + 0x73, 0xea, 0x22, 0xf4, 0x9a, 0x3d, 0x78, 0x05, 0xec, 0x35, 0xc3, 0x11, + 0xf9, 0xdb, 0xa6, 0x48, 0xb9, 0x06, 0x04, 0x09, 0xb9, 0x4c, 0xad, 0x6d, + 0x3c, 0xca, 0x5c, 0x23, 0x05, 0x14, 0x47, 0x1d, 0x48, 0x6d, 0x88, 0x47, + 0xd5, 0xfb, 0xd6, 0x4c, 0x53, 0x7b, 0xe0, 0xc6, 0x9f, 0xf9, 0xcc, 0x57, + 0x1d, 0x54, 0xf3, 0xc0, 0x89, 0xc7, 0x0d, 0x16, 0x88, 0x6b, 0x2d, 0x56, + 0x79, 0x5d, 0x80, 0xf4, 0x22, 0x00, 0xa5, 0x94, 0x94, 0x4b, 0x15, 0xd0, + 0x1f, 0x26, 0x92, 0x7f, 0xf8, 0xd6, 0x43, 0x8f, 0x70, 0x1c, 0x9b, 0x53, + 0xd6, 0xbe, 0x6d, 0x0c, 0x92, 0x3f, 0x6f, 0x1a, 0xa3, 0x30, 0xf5, 0xc1, + 0xae, 0xa8, 0x9b, 0xeb, 0x75, 0x2d, 0x99, 0x9d, 0x5b, 0x93, 0xb2, 0x7c, + 0x5b, 0x48, 0x09, 0x45, 0xcd, 0xd4, 0xb3, 0x0c, 0xf2, 0xb9, 0x3c, 0xa8, + 0xc1, 0x9c, 0xe7, 0x36, 0x97, 0x9c, 0x95, 0x8f, 0xdc, 0xec, 0xd4, 0x0e, + 0x83, 0xae, 0x46, 0x35, 0x2b, 0x0a, 0xbb, 0xdc, 0x63, 0x03, 0x36, 0x5b, + 0x6a, 0x15, 0x0b, 0xd4, 0x64, 0x63, 0xa8, 0xe2, 0xe8, 0x9b, 0x2f, 0xf5, + 0xf8, 0x79, 0x50, 0x1b, 0x56, 0xc3, 0xec, 0x45, 0x9b, 0x09, 0xc1, 0x82, + 0x96, 0xd2, 0xe1, 0xa7, 0x83, 0xaa, 0x63, 0x01, 0x3d, 0x84, 0xc3, 0xf2, + 0x7b, 0x1d, 0xce, 0x4e, 0x22, 0xf1, 0x13, 0x73, 0xc8, 0x19, 0xb0, 0xbd, + 0xaf, 0x57, 0xca, 0x3c, 0x50, 0x52, 0x15, 0x48, 0x2c, 0x93, 0x87, 0x27, + 0xad, 0x3c, 0x29, 0x2c, 0x74, 0x6b, 0x15, 0x64, 0xc2, 0xcf, 0x30, 0x7e, + 0xee, 0x91, 0x55, 0x5d, 0xe6, 0xef, 0x21, 0x74, 0x5c, 0x99, 0xb3, 0x66, + 0x56, 0x40, 0x33, 0xa2, 0x68, 0x86, 0xfb, 0xbb, 0xc9, 0xfc, 0x62, 0xca, + 0x74, 0xfa, 0x0a, 0xe5, 0x4a, 0x9c, 0x29, 0xf4, 0xfb, 0x50, 0xd3, 0x03, + 0x5c, 0xcb, 0x03, 0x45, 0x76, 0xec, 0x8e, 0x16, 0xbb, 0x94, 0xcd, 0x6d, + 0x26, 0x1a, 0xfc, 0x09, 0x00, 0xd8, 0xee, 0x5e, 0x21, 0xf0, 0x21, 0x50, + 0x3d, 0xe9, 0x33, 0x66, 0xfb, 0x4f, 0xbf, 0xcc, 0xe3, 0x37, 0xbc, 0xc4, + 0xd7, 0x92, 0xda, 0xf0, 0x12, 0x20, 0x12, 0xa3, 0x2b, 0xca, 0x32, 0xd1, + 0xd6, 0x95, 0x1c, 0xd1, 0xaf, 0x0c, 0x83, 0xeb, 0x0a, 0x7c, 0x17, 0xdd, + 0xc9, 0xa5, 0x05, 0x01, 0x38, 0x39, 0x9a, 0x72, 0x53, 0x57, 0x98, 0xbf, + 0xa1, 0xc0, 0x0e, 0x63, 0x67, 0xc4, 0x25, 0xef, 0xaf, 0x3a, 0xfa, 0x41, + 0xd9, 0x23, 0xc1, 0x1f, 0xdb, 0x20, 0x3c, 0x84, 0xc2, 0x6b, 0x1e, 0x6d, + 0xf7, 0xe9, 0xd5, 0x6b, 0xae, 0xa5, 0x63, 0xd9, 0x1d, 0xc8, 0x9f, 0xe0, + 0x23, 0x93, 0xaf, 0x0c, 0x80, 0x04, 0x5a, 0x1f, 0xdd, 0xd7, 0x7a, 0x95, + 0x2d, 0x5f, 0x50, 0x31, 0xf1, 0x2c, 0xed, 0x43, 0xdb, 0x4a, 0x76, 0x12, + 0x12, 0xe6, 0x25, 0xa6, 0xd7, 0x16, 0x83, 0xaa, 0x5f, 0x16, 0xc7, 0x33, + 0x64, 0x4f, 0xd4, 0x89, 0x20, 0xfc, 0xf6, 0x81, 0x65, 0x66, 0x80, 0xab, + 0xa2, 0xcc, 0x1d, 0x2f, 0x3e, 0xbd, 0x78, 0xfb, 0xbe, 0xd5, 0x51, 0x51, + 0x1b, 0x87, 0x1d, 0xea, 0x83, 0x1c, 0xea, 0x8d, 0x09, 0x6c, 0x86, 0xa6, + 0x01, 0x54, 0xb5, 0xe3, 0x1c, 0xc7, 0x32, 0x41, 0x2e, 0x30, 0x40, 0x70, + 0x9e, 0x7a, 0x36, 0x65, 0x56, 0x7d, 0xe8, 0xab, 0x43, 0x0d, 0xb6, 0x32, + 0x7d, 0xf2, 0x36, 0x01, 0x01, 0xe4, 0x05, 0xf8, 0x73, 0x32, 0x79, 0xec, + 0xaf, 0xfb, 0xf9, 0x0a, 0x66, 0x1d, 0x43, 0xaf, 0x7d, 0x92, 0x09, 0xed, + 0xb0, 0x24, 0x9d, 0x64, 0x98, 0x14, 0xbf, 0xa6, 0xf2, 0x51, 0x42, 0x76, + 0x79, 0xa9, 0x52, 0xed, 0xd7, 0xda, 0x81, 0xe8, 0x98, 0x2c, 0xe7, 0x54, + 0xe7, 0x88, 0x52, 0x36, 0x08, 0x46, 0x91, 0x8c, 0xe2, 0x20, 0xd7, 0xe7, + 0x0b, 0xdc, 0xbb, 0x8f, 0xee, 0xbb, 0xa5, 0x6f, 0x86, 0xb6, 0x1d, 0xa4, + 0x0e, 0x2d, 0xd4, 0x87, 0xcf, 0xe8, 0x1d, 0xec, 0xfa, 0xb7, 0x10, 0xcb, + 0x8b, 0x90, 0x7f, 0xf0, 0xcd, 0x4c, 0x09, 0x36, 0x82, 0xe7, 0x41, 0xff, + 0x42, 0xc3, 0x26, 0xe0, 0x04, 0x5d, 0x24, 0x64, 0xca, 0x6a, 0x42, 0x45, + 0x02, 0x6b, 0x63, 0xe5, 0x3a, 0x51, 0x4d, 0xa9, 0xd8, 0x18, 0x49, 0x5e, + 0xa1, 0x93, 0x20, 0x09, 0x06, 0x92, 0xdf, 0x59, 0xb0, 0x01, 0xe9, 0xbc, + 0xbe, 0x51, 0xfd, 0x2d, 0xa7, 0xae, 0x7e, 0x0a, 0xac, 0x59, 0xe9, 0x0e, + 0x98, 0x7f, 0x91, 0x10, 0x64, 0x22, 0x8f, 0x84, 0xbc, 0xcb, 0x7a, 0x89, + 0xa8, 0x30, 0xb8, 0xa6, 0x5a, 0x80, 0xaf, 0x4e, 0xd0, 0x0f, 0x16, 0x48, + 0x5c, 0xef, 0x88, 0x00, 0x63, 0x1e, 0x18, 0x07, 0xf6, 0x9e, 0x14, 0xfa, + 0xad, 0x2e, 0xa1, 0xbe, 0x8e, 0xbf, 0xce, 0x56, 0x10, 0xce, 0x0c, 0x35, + 0x61, 0xcc, 0x36, 0x53, 0xb3, 0xdf, 0x52, 0xc9, 0x38, 0x36, 0x57, 0x3f, + 0x64, 0xdf, 0xd8, 0x10, 0x44, 0x1f, 0xcd, 0x28, 0xe9, 0x17, 0x5a, 0x44, + 0x0b, 0x64, 0x2e, 0xd0, 0xe7, 0x0b, 0xe4, 0xef, 0x70, 0x31, 0xeb, 0x2f, + 0x7f, 0xa6, 0xe3, 0xd7, 0x35, 0xdc, 0xb8, 0xc5, 0xae, 0x8d, 0x08, 0x54, + 0x33, 0x04, 0xb6, 0x7e, 0x68, 0x02, 0x03, 0x7f, 0x81, 0xcc, 0xa0, 0x79, + 0xe8, 0xfa, 0x8a, 0x5e, 0x8d, 0xb4, 0xa1, 0x8b, 0xfa, 0x30, 0x59, 0xf8, + 0x84, 0x50, 0xd3, 0x31, 0x78, 0x38, 0x52, 0x49, 0x61, 0x40, 0xcf, 0x3b, + 0x95, 0x8a, 0x6d, 0x43, 0x57, 0xc2, 0x6b, 0x0c, 0xfb, 0x14, 0x80, 0xe8, + 0xfe, 0x57, 0x26, 0xa3, 0xad, 0xa1, 0x0e, 0x5d, 0xa4, 0x68, 0xa0, 0xe2, + 0x3e, 0x9b, 0x42, 0x23, 0xe8, 0x2f, 0xcd, 0xc2, 0x73, 0x7a, 0x82, 0x9c, + 0x43, 0x98, 0x01, 0x1d, 0x3a, 0x08, 0xda, 0xf5, 0x08, 0xf8, 0x10, 0x66, + 0x83, 0xde, 0xa5, 0x7b, 0x51, 0x00, 0xad, 0xf5, 0x6e, 0xb6, 0x11, 0xc7, + 0xda, 0xb6, 0xe7, 0x2f, 0x20, 0x2b, 0x95, 0x4e, 0x0a, 0xe9, 0xe7, 0x87, + 0x06, 0x9b, 0x34, 0x86, 0x02, 0x49, 0x2c, 0x53, 0xfc, 0x10, 0x9e, 0xea, + 0x7d, 0xe2, 0x63, 0xbc, 0x04, 0xc1, 0x82, 0x50, 0xb1, 0xb8, 0xbe, 0x89, + 0x65, 0xa1, 0x5b, 0xdc, 0xb0, 0x66, 0xb7, 0xa8, 0xaf, 0xdd, 0xcd, 0xcd, + 0x4b, 0xb6, 0x93, 0xff, 0x28, 0xc9, 0x96, 0xed, 0xad, 0x6e, 0xba, 0x1d, + 0x2c, 0x42, 0xae, 0x4a, 0xef, 0x1c, 0xd2, 0x2a, 0x2a, 0xeb, 0x74, 0xb6, + 0xc0, 0xe3, 0xe7, 0x45, 0x31, 0x18, 0xb6, 0x5f, 0x5f, 0x41, 0x8e, 0x2a, + 0x00, 0x7d, 0x02, 0x11, 0x52, 0xaa, 0xa6, 0x15, 0x8c, 0x61, 0xb3, 0xf4, + 0xab, 0xef, 0x48, 0x81, 0x20, 0x2d, 0x48, 0xcf, 0xb5, 0xd7, 0x39, 0xa5, + 0x48, 0xba, 0x78, 0x5d, 0x9f, 0x2e, 0x8e, 0x36, 0x40, 0xa0, 0x72, 0x8b, + 0x5c, 0xe1, 0xea, 0xc3, 0x3f, 0x7c, 0xc1, 0x85, 0x45, 0xf7, 0xa1, 0x79, + 0xf4, 0x90, 0xa5, 0x8f, 0x67, 0x77, 0x8f, 0x1b, 0xb3, 0x65, 0xd7, 0x54, + 0x72, 0x77, 0x25, 0x76, 0xa3, 0xea, 0x13, 0xd6, 0xbe, 0xf3, 0x82, 0x18, + 0xca, 0x2a, 0xa0, 0x5d, 0xc8, 0x26, 0x93, 0x20, 0x96, 0x90, 0x94, 0xc4, + 0x03, 0xec, 0x83, 0xd7, 0x5d, 0xd4, 0x0b, 0xd0, 0x87, 0xbe, 0xb9, 0xca, + 0xa8, 0x50, 0x21, 0xfd, 0xe4, 0xe3, 0x3f, 0x8c, 0xbd, 0xdd, 0xed, 0x32, + 0xc4, 0x76, 0x31, 0xb8, 0xf8, 0x89, 0x18, 0x77, 0xcf, 0x68, 0xaa, 0x96, + 0x6d, 0xfb, 0xe8, 0x6e, 0xc0, 0xad, 0x5b, 0x1c, 0xd1, 0x2d, 0x68, 0x50, + 0xbf, 0xc0, 0x21, 0xe3, 0x01, 0x30, 0x5f, 0xb8, 0xba, 0xbf, 0x19, 0x4d, + 0xd9, 0x8e, 0x02, 0xdd, 0x2e, 0x9b, 0x2d, 0x56, 0x60, 0x19, 0xd4, 0x6c, + 0xf4, 0xf1, 0x4f, 0x78, 0x00, 0x3c, 0x2c, 0xd3, 0x1b, 0x53, 0x32, 0x69, + 0xf0, 0x3c, 0xa8, 0xaa, 0xbd, 0x22, 0xfe, 0x8d, 0xa5, 0x82, 0x82, 0x8d, + 0x31, 0x15, 0xc5, 0x22, 0x4b, 0xf8, 0x36, 0xd5, 0x39, 0xa4, 0x47, 0x26, + 0x8d, 0x07, 0x48, 0x97, 0x32, 0x59, 0xa2, 0xa1, 0x9d, 0x5a, 0x0e, 0x30, + 0x77, 0x48, 0x07, 0xcf, 0xce, 0xbe, 0xf1, 0x08, 0xd6, 0x0a, 0x03, 0xce, + 0xc1, 0x2d, 0x13, 0xa7, 0xa3, 0xec, 0x07, 0x6a, 0x3a, 0xfd, 0x17, 0x5b, + 0xb6, 0xb8, 0x7b, 0x36, 0xea, 0x80, 0xcf, 0x87, 0x5a, 0x34, 0x87, 0x56, + 0xb4, 0x1e, 0xb2, 0xb1, 0x7e, 0xa3, 0x45, 0x36, 0x96, 0xdf, 0x99, 0x07, + 0x82, 0xb4, 0x73, 0xb7, 0x25, 0xf0, 0x7f, 0x92, 0xf2, 0x2d, 0x37, 0xf0, + 0xfb, 0x70, 0x8c, 0x1e, 0x0d, 0x82, 0x1e, 0x8e, 0xf4, 0x14, 0x50, 0x84, + 0x3b, 0x47, 0x74, 0x95, 0x70, 0x03, 0x03, 0x55, 0xdd, 0xbb, 0x54, 0x26, + 0x86, 0x6c, 0x12, 0x20, 0x69, 0xfb, 0x2e, 0x49, 0x43, 0x10, 0x1c, 0x2b, + 0x02, 0x00, 0xdf, 0xe1, 0x10, 0x1a, 0x2f, 0x8b, 0xf1, 0x70, 0xd2, 0xaf, + 0x6f, 0xe9, 0x34, 0x48, 0x72, 0x30, 0xcd, 0xe5, 0x7e, 0x56, 0xc6, 0x1f, + 0x52, 0x37, 0x54, 0x3b, 0x61, 0x3b, 0x8a, 0x61, 0x84, 0x2c, 0x4b, 0x08, + 0xc6, 0x49, 0xff, 0x81, 0xb6, 0x1f, 0x2f, 0x5f, 0x57, 0x87, 0x5d, 0x0d, + 0x35, 0xba, 0xce, 0x54, 0x1e, 0xe7, 0x7c, 0xf9, 0x91, 0xb6, 0x2d, 0x2e, + 0x4b, 0x8e, 0xfd, 0x97, 0xd4, 0x39, 0x6e, 0xa6, 0x0d, 0xaf, 0x17, 0x87, + 0x99, 0x51, 0x56, 0x3c, 0x19, 0x18, 0x42, 0x0b, 0x63, 0xed, 0xd3, 0x83, + 0x49, 0x83, 0x5f, 0xa0, 0x54, 0x69, 0x45, 0xd5, 0xc6, 0xe6, 0x3d, 0xf2, + 0x08, 0xd0, 0x11, 0xd7, 0xad, 0xc6, 0xe8, 0xa4, 0xd2, 0x18, 0xbd, 0x78, + 0xa5, 0x08, 0x01, 0x3b, 0x71, 0xf5, 0x59, 0x5e, 0x39, 0x60, 0x6b, 0x97, + 0x7c, 0x02, 0x07, 0x14, 0xd5, 0x15, 0x5f, 0x0f, 0xe6, 0x53, 0xb8, 0x23, + 0x26, 0x40, 0xf4, 0x8a, 0xb2, 0x35, 0x54, 0xed, 0x41, 0x78, 0xed, 0x15, + 0x9a, 0x3e, 0x2a, 0xfa, 0xf1, 0x19, 0x23, 0x7a, 0x5c, 0x4d, 0xec, 0xcb, + 0x24, 0xe2, 0xfc, 0x51, 0x3a, 0x03, 0x8a, 0x91, 0x5d, 0x92, 0x8e, 0xe7, + 0x39, 0x5d, 0xbc, 0xd4, 0x8e, 0x5b, 0xde, 0x40, 0x83, 0x72, 0xcc, 0x7d, + 0xba, 0xd6, 0x4f, 0x51, 0xad, 0xfb, 0x23, 0x01, 0x23, 0x9e, 0x02, 0xf4, + 0x3e, 0xdd, 0xaf, 0x86, 0xf6, 0x53, 0xdd, 0xb3, 0x97, 0x6b, 0xd2, 0xb4, + 0xea, 0xc0, 0x69, 0x79, 0x93, 0xba, 0xd5, 0x26, 0x48, 0x83, 0x1a, 0x24, + 0x0d, 0xa9, 0xaa, 0x26, 0x22, 0xb7, 0x1e, 0x1c, 0x30, 0x43, 0xf0, 0x08, + 0xf2, 0x5a, 0xe6, 0xea, 0xf6, 0x7f, 0xb0, 0x66, 0xae, 0x4d, 0x15, 0xe6, + 0x3a, 0xdc, 0x43, 0x1d, 0x3f, 0x46, 0x83, 0xd4, 0x3e, 0x73, 0x6f, 0x8f, + 0x38, 0x62, 0xed, 0x92, 0x02, 0x28, 0xfa, 0x7c, 0xc1, 0x00, 0x29, 0x33, + 0x95, 0x3d, 0x41, 0x50, 0xc8, 0x32, 0xcb, 0x80, 0x52, 0x60, 0xb2, 0xdb, + 0x32, 0x92, 0xca, 0x0f, 0x05, 0xa8, 0xc9, 0x78, 0x7f, 0x2f, 0x06, 0x37, + 0x65, 0x1c, 0x2f, 0x1a, 0x83, 0xf0, 0x3f, 0x6f, 0x94, 0xdd, 0x13, 0x4e, + 0x47, 0x8b, 0x68, 0x96, 0x48, 0x15, 0x3b, 0x20, 0x86, 0x44, 0xbf, 0x56, + 0xf2, 0xaf, 0x01, 0xbb, 0xb5, 0x96, 0xf3, 0x03, 0xda, 0x4c, 0xcc, 0x76, + 0x04, 0xb0, 0xe1, 0x93, 0x1b, 0x4b, 0xa4, 0xc3, 0x27, 0x6c, 0xc8, 0x45, + 0xbe, 0xf9, 0x13, 0x6a, 0xd3, 0xa9, 0x02, 0xcd, 0xc9, 0x17, 0xb2, 0x7c, + 0x80, 0x42, 0xe2, 0xd8, 0x1a, 0xe6, 0x72, 0x7f, 0x40, 0xf4, 0x28, 0x09, + 0x58, 0xb7, 0x69, 0xa0, 0x98, 0xab, 0x98, 0x76, 0xdf, 0x00, 0xc7, 0xb0, + 0x5e, 0xbb, 0xe6, 0x65, 0x5e, 0x65, 0x47, 0xa7, 0x88, 0x6b, 0x27, 0x66, + 0xfb, 0x43, 0x21, 0x43, 0x6c, 0x82, 0x44, 0xdf, 0xe2, 0xfd, 0x4a, 0x79, + 0x42, 0x49, 0xea, 0x47, 0x1b, 0x5c, 0xd6, 0x4c, 0x7e, 0x94, 0x5a, 0xff, + 0x89, 0x9f, 0x76, 0x4b, 0x40, 0x13, 0x83, 0x1a, 0x1c, 0xe7, 0x08, 0x2f, + 0x1c, 0x1e, 0xc8, 0xa3, 0xf7, 0x3c, 0xf7, 0x6d, 0x00, 0x31, 0x11, 0xba, + 0xed, 0x7f, 0x46, 0xa8, 0xb6, 0x2c, 0x75, 0x67, 0x19, 0x0d, 0x61, 0xae, + 0xc7, 0x0c, 0x83, 0xf1, 0xc0, 0xbc, 0x08, 0x77, 0xa5, 0xdd, 0xeb, 0x38, + 0xef, 0x7c, 0xe7, 0xd3, 0xfe, 0x48, 0x7a, 0x6f, 0x55, 0x83, 0xa4, 0xb8, + 0xd0, 0x81, 0xe7, 0xd2, 0xe7, 0x88, 0x0f, 0xc2, 0x57, 0x24, 0xc7, 0x6c, + 0xd2, 0xfd, 0x57, 0x4e, 0x97, 0x54, 0xd9, 0x7a, 0x5a, 0xb9, 0x48, 0xe6, + 0xbd, 0xf5, 0x47, 0x63, 0x9f, 0x4f, 0x34, 0x87, 0x20, 0x41, 0x29, 0x63, + 0xf9, 0x23, 0x9e, 0x25, 0xe5, 0xda, 0xe3, 0x66, 0x57, 0xac, 0xff, 0x50, + 0xe1, 0x78, 0x9c, 0xcf, 0x81, 0x6a, 0x8b, 0x3f, 0x36, 0x2d, 0x21, 0x0b, + 0x48, 0x2b, 0x57, 0xb6, 0x59, 0x54, 0xe0, 0x87, 0x79, 0x7d, 0x36, 0x06, + 0xad, 0x7d, 0x42, 0x56, 0x01, 0xd1, 0xc8, 0x97, 0x1f, 0xb1, 0x58, 0x7b, + 0x75, 0xe4, 0x77, 0xae, 0xc3, 0x67, 0x58, 0xb7, 0x03, 0x17, 0xc1, 0xe4, + 0xec, 0x66, 0x02, 0x4f, 0x5c, 0x02, 0xa9, 0x90, 0xed, 0x1b, 0x6b, 0x31, + 0x58, 0x59, 0x91, 0xb4, 0xfc, 0xa4, 0xfa, 0xc8, 0x15, 0xfe, 0xec, 0x77, + 0xc2, 0x40, 0xb3, 0xed, 0x2e, 0x0e, 0x56, 0x80, 0x63, 0x97, 0x5a, 0x91, + 0xca, 0x16, 0xda, 0x03, 0xb0, 0x2f, 0x7f, 0xce, 0x0f, 0x72, 0x40, 0xd3, + 0xd3, 0xc8, 0x33, 0x7b, 0xcb, 0x9a, 0x80, 0x24, 0x9c, 0x82, 0xac, 0x87, + 0x29, 0x9e, 0x60, 0x72, 0x22, 0x0f, 0x5a, 0x20, 0x61, 0xe2, 0xc8, 0xc8, + 0x0b, 0x1b, 0x01, 0x06, 0x2d, 0x25, 0x25, 0x7e, 0x73, 0xa4, 0x41, 0x1f, + 0x85, 0x34, 0xce, 0xf5, 0xf8, 0xa9, 0xf4, 0x05, 0x98, 0x9b, 0x6c, 0x51, + 0xc7, 0x74, 0xb7, 0x4b, 0x0d, 0x14, 0x7c, 0xdc, 0x17, 0xcc, 0xb9, 0xa6, + 0x93, 0xb3, 0xfd, 0x08, 0xc4, 0x21, 0xb2, 0xf1, 0x16, 0x11, 0xf8, 0x63, + 0x76, 0xd0, 0xce, 0x90, 0x83, 0x69, 0x3d, 0x69, 0xdf, 0x6a, 0xd1, 0xda, + 0xa1, 0x10, 0x17, 0x77, 0x03, 0xae, 0x4d, 0x66, 0x4f, 0xb4, 0x6f, 0xf6, + 0x0f, 0x3f, 0x2a, 0xc4, 0xc9, 0x88, 0xa0, 0x62, 0x87, 0x93, 0x18, 0xe6, + 0x5c, 0x9e, 0xa0, 0xc9, 0x43, 0x5a, 0xfd, 0x49, 0x67, 0x21, 0x7e, 0x83, + 0x97, 0xdc, 0xc4, 0xf4, 0xb5, 0xfa, 0xee, 0xd6, 0x3a, 0x5e, 0x1a, 0xb7, + 0x60, 0x9d, 0x9d, 0xac, 0x46, 0x2a, 0x54, 0xf0, 0xa5, 0x63, 0xdd, 0xbd, + 0xa2, 0xed, 0x99, 0x5a, 0x4f, 0xb7, 0x70, 0x93, 0x56, 0x53, 0x5b, 0xeb, + 0xa5, 0xf7, 0xdc, 0x16, 0x9e, 0x30, 0xdd, 0x7f, 0x21, 0xc0, 0xd3, 0x3c, + 0x9d, 0xd0, 0xb4, 0xef, 0x55, 0x8b, 0x45, 0x69, 0x26, 0xac, 0x46, 0xe1, + 0x1f, 0x7d, 0xd1, 0xb7, 0xe8, 0xf3, 0xa1, 0x7f, 0x4a, 0xcf, 0x2d, 0x2d, + 0xa2, 0x0f, 0x8c, 0x21, 0x13, 0xce, 0x47, 0xad, 0xbb, 0xbf, 0x0b, 0xeb, + 0xc6, 0x02, 0x35, 0x2e, 0x4e, 0xa4, 0x0f, 0x5a, 0xde, 0x9b, 0x0d, 0xaf, + 0xe4, 0xc2, 0x4a, 0xc5, 0x7a, 0x86, 0x2e, 0xca, 0xda, 0x74, 0x54, 0x3e, + 0x40, 0x17, 0x31, 0x8e, 0x8c, 0x46, 0xd3, 0xdf, 0x44, 0x0c, 0x77, 0x70, + 0x80, 0x09, 0xcf, 0x41, 0x1b, 0x69, 0x3e, 0x67, 0x36, 0xda, 0xad, 0x60, + 0x3a, 0x11, 0x2e, 0x06, 0xaf, 0xa6, 0xde, 0x89, 0x91, 0x75, 0x03, 0x78, + 0x4b, 0x6a, 0x3b, 0x48, 0x93, 0x9f, 0x7f, 0xb5, 0xe8, 0x82, 0x53, 0x77, + 0xba, 0x13, 0xe5, 0xde, 0xc4, 0xd4, 0xfa, 0xbb, 0xd8, 0x8e, 0x02, 0xc3, + 0x4b, 0xb7, 0x7f, 0x9d, 0x31, 0xc7, 0x9c, 0x5d, 0x1f, 0x8a, 0xd7, 0xb5, + 0x37, 0x9c, 0x5a, 0xe8, 0x29, 0x3a, 0xbf, 0x86, 0x1c, 0x16, 0x38, 0x89, + 0x4f, 0xac, 0x15, 0xeb, 0xaf, 0x9e, 0x27, 0x92, 0x91, 0xf8, 0x9c, 0xb3, + 0xed, 0xda, 0x07, 0xfe, 0x72, 0x0c, 0xf8, 0x72, 0x92, 0x85, 0x79, 0xb9, + 0xd1, 0x35, 0xf2, 0xf3, 0x76, 0xdf, 0xdc, 0xf6, 0x73, 0xb6, 0x56, 0x64, + 0x2d, 0x6f, 0x64, 0xf8, 0xb5, 0xa8, 0x08, 0x3a, 0xcd, 0x14, 0x2f, 0x5b, + 0xa1, 0x12, 0xa9, 0x96, 0x57, 0x90, 0xcc, 0xa6, 0x4f, 0x64, 0xe8, 0x0c, + 0xd6, 0x45, 0x1d, 0x28, 0x43, 0x88, 0xfc, 0xeb, 0x25, 0x25, 0xf2, 0x8e, + 0xf2, 0x45, 0x1c, 0x7a, 0x15, 0x36, 0x71, 0xaa, 0x43, 0x45, 0xd3, 0x06, + 0x24, 0xa2, 0x6c, 0x1f, 0xe8, 0x14, 0x1a, 0x4b, 0x58, 0x4c, 0x71, 0x84, + 0x8d, 0x6e, 0xb7, 0x25, 0x0d, 0x8e, 0xde, 0x74, 0xda, 0x8a, 0xeb, 0x9e, + 0x0c, 0x12, 0x63, 0x4b, 0x8b, 0x79, 0x88, 0xfa, 0x97, 0xcb, 0x4a, 0x5e, + 0x1c, 0x57, 0xf1, 0x2b, 0xa4, 0xe7, 0x6a, 0xd1, 0xf9, 0x28, 0x14, 0x5f, + 0xb9, 0x44, 0x62, 0x69, 0x17, 0xec, 0x28, 0xfb, 0x39, 0x35, 0x02, 0xdb, + 0x80, 0xb7, 0x1d, 0x2f, 0x7b, 0xb6, 0x90, 0x65, 0x96, 0x34, 0x92, 0x56, + 0x4f, 0xe7, 0x99, 0x5c, 0xa3, 0x5c, 0x36, 0xe5, 0x56, 0x72, 0x7b, 0xb1, + 0x73, 0x00, 0xe0, 0xbc, 0x85, 0x78, 0xf0, 0x02, 0x37, 0xf4, 0xcc, 0xba, + 0x76, 0x9b, 0x22, 0xa4, 0xf2, 0xd1, 0xa6, 0x31, 0x8a, 0x52, 0x01, 0xa0, + 0xcc, 0xeb, 0x7d, 0x37, 0x3d, 0x2d, 0x46, 0x37, 0xc3, 0xc2, 0x3a, 0x41, + 0xcb, 0x6f, 0xc5, 0x3d, 0xf7, 0x87, 0xff, 0x19, 0x78, 0xaa, 0x45, 0xcb, + 0xee, 0xb0, 0xf2, 0xa6, 0x2b, 0xb6, 0x93, 0x35, 0xf7, 0xdc, 0x01, 0xbd, + 0xa4, 0x40, 0xa0, 0xc3, 0x45, 0xca, 0xb5, 0xa1, 0xe3, 0x12, 0x38, 0xc3, + 0xf6, 0x64, 0x19, 0x9c, 0x72, 0x63, 0xf7, 0x53, 0xfc, 0xe9, 0xd8, 0x8e, + 0x5b, 0x97, 0x10, 0x9b, 0x5b, 0x1c, 0x50, 0x9d, 0x03, 0xa9, 0xe8, 0x23, + 0x14, 0x51, 0xbf, 0x3f, 0x86, 0x60, 0x17, 0xca, 0xc8, 0xc3, 0xf6, 0xfe, + 0x7d, 0xde, 0xce, 0x9f, 0xb4, 0xe7, 0xf1, 0xf9, 0x79, 0x87, 0xa3, 0x26, + 0x59, 0xd8, 0x6e, 0xe9, 0x52, 0x7c, 0x78, 0x27, 0xf6, 0x8e, 0xd1, 0x3f, + 0x03, 0x14, 0x09, 0xb3, 0xa5, 0x67, 0x20, 0xbb, 0x4f, 0x49, 0xed, 0x9c, + 0xa5, 0xec, 0x1e, 0xea, 0x74, 0x8e, 0x29, 0x3d, 0x68, 0x2d, 0x72, 0x14, + 0xf4, 0xf6, 0x31, 0x9b, 0x1a, 0x6f, 0xf9, 0xad, 0x8c, 0x65, 0xb6, 0x0f, + 0x8c, 0x94, 0x9a, 0x7f, 0x63, 0xb5, 0xd6, 0x40, 0x8b, 0x0c, 0x35, 0xd5, + 0xca, 0x72, 0x5f, 0x7f, 0xce, 0x7a, 0xa5, 0xc7, 0x52, 0x3f, 0xc7, 0xba, + 0x02, 0xcf, 0x06, 0x92, 0xdb, 0x10, 0x73, 0x28, 0x22, 0x18, 0xab, 0x9e, + 0x67, 0x87, 0x5f, 0x40, 0x51, 0xac, 0x9d, 0xff, 0x90, 0x0c, 0x04, 0x45, + 0xe5, 0x37, 0x8a, 0xd4, 0x20, 0x5f, 0x9f, 0x62, 0xe8, 0xa1, 0xcc, 0xb0, + 0x66, 0x9e, 0xf6, 0xa4, 0x0a, 0xb2, 0x65, 0x18, 0xfc, 0x95, 0x4e, 0xf0, + 0xc2, 0x93, 0xac, 0xac, 0x9f, 0xcd, 0x03, 0xf6, 0xe6, 0x6c, 0x50, 0x9a, + 0xc3, 0xc8, 0x1c, 0x7b, 0xb5, 0x3a, 0x8f, 0xc7, 0xe2, 0x9a, 0xf4, 0x65, + 0xe1, 0x2e, 0x78, 0xa3, 0x1d, 0xbb, 0x0e, 0x02, 0x1b, 0x6d, 0xb7, 0x81, + 0xc9, 0xc5, 0x85, 0x0a, 0x50, 0xa9, 0x0b, 0xe9, 0x07, 0x92, 0x8a, 0x42, + 0xe2, 0x09, 0x9a, 0xfd, 0xa2, 0x22, 0x57, 0x55, 0x40, 0x91, 0x37, 0x4a, + 0x9d, 0xc9, 0xcc, 0x82, 0x04, 0xf7, 0x12, 0xd4, 0x93, 0x9b, 0x3b, 0xbe, + 0x7c, 0x81, 0x92, 0x57, 0x56, 0xfb, 0xa9, 0x6c, 0xd1, 0x41, 0x1d, 0xfe, + 0xba, 0xc8, 0xce, 0xc7, 0x94, 0xef, 0xc0, 0x97, 0x09, 0x02, 0x73, 0x6d, + 0xa2, 0x1d, 0xa5, 0x9e, 0xe7, 0xc4, 0xac, 0x17, 0x4f, 0xfc, 0x25, 0x30, + 0x97, 0x79, 0x0c, 0x58, 0x10, 0x02, 0x6e, 0xb9, 0xea, 0x78, 0x60, 0xc0, + 0x83, 0x7b, 0x4b, 0x0d, 0xc8, 0xfa, 0x6c, 0x17, 0x7e, 0xaa, 0x25, 0x1a, + 0xa2, 0xaa, 0x23, 0x04, 0x2a, 0xc8, 0xf0, 0xe7, 0xba, 0xbf, 0xe4, 0xdd, + 0x7c, 0xb7, 0xbb, 0xc2, 0x91, 0x63, 0xb3, 0xfb, 0x55, 0xc2, 0xfd, 0xc9, + 0x93, 0x9b, 0x21, 0xb5, 0x79, 0xb3, 0x4e, 0xc0, 0xd5, 0x9d, 0xf0, 0xae, + 0xb2, 0xb7, 0xfb, 0xf5, 0x04, 0x14, 0xc8, 0x60, 0x81, 0x25, 0x73, 0xe4, + 0x42, 0x43, 0xfb, 0xeb, 0xa3, 0xb7, 0xa1, 0x44, 0x9e, 0xac, 0x37, 0xe2, + 0xd9, 0xe1, 0x28, 0x00, 0xbf, 0x6b, 0x82, 0x3e, 0x36, 0x8e, 0xe8, 0x7f, + 0x62, 0x9a, 0x32, 0x1e, 0x55, 0xf5, 0x66, 0x98, 0x7e, 0xe9, 0xf2, 0xd1, + 0xab, 0x19, 0x8c, 0xd1, 0x9e, 0xab, 0x99, 0x32, 0xfb, 0x78, 0x65, 0x86, + 0x06, 0x23, 0x86, 0xb1, 0x52, 0xad, 0xc4, 0x4a, 0x5a, 0x16, 0x7d, 0xc3, + 0x71, 0x62, 0xab, 0xa1, 0xc2, 0xa1, 0xc9, 0xdd, 0x29, 0x88, 0xc9, 0xec, + 0x4e, 0xe3, 0x81, 0xeb, 0x5b, 0xc2, 0xdf, 0x28, 0x24, 0xe4, 0xef, 0x72, + 0x67, 0x3c, 0xec, 0x47, 0x25, 0x10, 0x24, 0x4b, 0x05, 0xe2, 0x3b, 0xcc, + 0x96, 0x90, 0xc3, 0xdf, 0x9d, 0x19, 0xdf, 0x5b, 0x70, 0x93, 0xc2, 0x73, + 0xe6, 0xaf, 0x04, 0x61, 0x99, 0x71, 0x51, 0xa3, 0xeb, 0x5e, 0x3a, 0x98, + 0x7d, 0xf9, 0xe3, 0x31, 0x50, 0x27, 0x04, 0xec, 0x7b, 0xcc, 0xd6, 0x5a, + 0xa6, 0x55, 0x82, 0x38, 0xfc, 0xe6, 0x57, 0x6f, 0xa5, 0x2c, 0x6a, 0x6e, + 0xf8, 0x81, 0x97, 0xcf, 0xa0, 0xe4, 0xab, 0xd1, 0xd0, 0x2f, 0x86, 0x13, + 0x7b, 0x4e, 0x68, 0xd9, 0x83, 0x7d, 0xd7, 0x80, 0x89, 0x08, 0xb9, 0x99, + 0x95, 0xd1, 0x1e, 0xa5, 0x26, 0xa9, 0xf8, 0xdc, 0x5c, 0xa8, 0x1d, 0x2e, + 0x60, 0x1c, 0xbe, 0x75, 0xb2, 0x67, 0xb9, 0xc0, 0xc3, 0x80, 0xb8, 0x43, + 0x91, 0x28, 0xfa, 0xdb, 0x0f, 0xd0, 0x3c, 0x80, 0x1b, 0x68, 0xec, 0x9d, + 0x4a, 0x00, 0x70, 0x14, 0x30, 0x09, 0x4f, 0x7e, 0x2d, 0x97, 0x21, 0x31, + 0x78, 0xd5, 0xe5, 0xdf, 0xee, 0x84, 0xe1, 0xe7, 0x5d, 0xfa, 0x7f, 0xa7, + 0x27, 0x82, 0xa6, 0xb1, 0x46, 0x91, 0x50, 0x76, 0x3e, 0x7a, 0x88, 0xef, + 0x75, 0x9e, 0x44, 0x07, 0x96, 0x01, 0x73, 0xbe, 0x48, 0xcb, 0x7c, 0x85, + 0xd6, 0xde, 0xb8, 0xbb, 0x49, 0xdd, 0x84, 0x4e, 0xd4, 0xa9, 0x33, 0x04, + 0xda, 0xf2, 0x38, 0x51, 0x5c, 0x84, 0x82, 0xba, 0x79, 0x3a, 0x52, 0x92, + 0x3e, 0xa3, 0xa5, 0x01, 0xfa, 0x15, 0x04, 0x81, 0x9a, 0x85, 0x60, 0x6c, + 0x32, 0x49, 0x71, 0x9d, 0x7a, 0x2d, 0xdd, 0xf9, 0x0a, 0x65, 0x8d, 0x3d, + 0x08, 0xe6, 0x74, 0x23, 0xaa, 0x71, 0x61, 0x17, 0xe8, 0x08, 0x07, 0x92, + 0x46, 0x15, 0x4f, 0x9a, 0x2f, 0xb5, 0x71, 0xff, 0x3a, 0x20, 0x33, 0x34, + 0xc8, 0xf2, 0xe0, 0xaf, 0x76, 0x9f, 0x57, 0x6c, 0xc4, 0x03, 0xc8, 0x32, + 0x7d, 0x5b, 0xa8, 0xa2, 0xfe, 0xf9, 0xac, 0x64, 0xac, 0xeb, 0xc6, 0xac, + 0x1a, 0xf0, 0x43, 0x93, 0xfa, 0xb3, 0x75, 0x6f, 0x5a, 0x6e, 0xdd, 0xd4, + 0xe8, 0xef, 0xd0, 0xe1, 0x55, 0xd1, 0x80, 0xc7, 0x88, 0xf8, 0xde, 0x27, + 0x90, 0x94, 0xa6, 0xac, 0x45, 0x6d, 0x1b, 0x5f, 0x25, 0x99, 0xa5, 0xeb, + 0x98, 0xe1, 0x6b, 0xdf, 0xa3, 0xf5, 0x92, 0xb4, 0xc4, 0x9c, 0x26, 0x2b, + 0x9f, 0x9a, 0x13, 0x82, 0xad, 0x2a, 0x5c, 0x5e, 0xc9, 0x62, 0x8e, 0xe7, + 0x60, 0xcd, 0x9b, 0xee, 0xbf, 0xea, 0xa9, 0xea, 0x1b, 0x7b, 0xe6, 0x86, + 0x1d, 0xea, 0x58, 0x0a, 0x94, 0x86, 0xec, 0xf9, 0x20, 0x49, 0xe4, 0x28, + 0x78, 0x50, 0x5a, 0x66, 0x72, 0x30, 0xf8, 0xda, 0x06, 0x34, 0xda, 0x4b, + 0xb5, 0x1f, 0x4b, 0x89, 0x7e, 0x8c, 0x48, 0x6e, 0x56, 0xc1, 0x6f, 0xd8, + 0x8d, 0x86, 0xd7, 0xaf, 0x7e, 0xcb, 0x80, 0x8f, 0xa7, 0x64, 0xff, 0x23, + 0x73, 0x29, 0x2e, 0xe1, 0x11, 0x92, 0x13, 0x0e, 0x65, 0xb5, 0x49, 0xb8, + 0x67, 0x67, 0x07, 0x28, 0x03, 0xcc, 0x10, 0x0b, 0xff, 0xe1, 0xd4, 0x59, + 0x99, 0x10, 0x0a, 0xe0, 0x26, 0x9a, 0xe5, 0x0d, 0xf4, 0x8b, 0x99, 0xb2, + 0x8e, 0x78, 0x70, 0xfb, 0x35, 0xd1, 0x4c, 0x04, 0x6a, 0xd5, 0x6b, 0x40, + 0x85, 0x94, 0xdf, 0xf9, 0x5a, 0x7d, 0x28, 0x8e, 0x76, 0x94, 0xef, 0xed, + 0xc0, 0xdd, 0xed, 0xee, 0x48, 0x30, 0x1c, 0x76, 0xdf, 0xf0, 0xbe, 0xf2, + 0x45, 0xdb, 0xa7, 0x38, 0x92, 0x7a, 0x96, 0x16, 0x1a, 0x95, 0x8f, 0x35, + 0x27, 0x65, 0x42, 0x47, 0x0e, 0xd3, 0x0f, 0xe3, 0xb3, 0x4a, 0xd7, 0x38, + 0x1a, 0x8d, 0xe8, 0xee, 0x44, 0xfc, 0x10, 0x93, 0x18, 0x03, 0xdd, 0xf1, + 0x08, 0x7d, 0xf4, 0x3c, 0xc7, 0xfa, 0x35, 0x8d, 0x97, 0xb6, 0x50, 0x90, + 0x81, 0xfa, 0x16, 0x3f, 0xa3, 0x44, 0xfa, 0x49, 0x7c, 0x93, 0xb4, 0xfc, + 0x46, 0xe1, 0x96, 0x4f, 0x67, 0x8a, 0x5b, 0xc4, 0x6a, 0xf3, 0xf0, 0x2b, + 0xfa, 0x5a, 0x37, 0x42, 0xe9, 0xa6, 0x13, 0x00, 0x4f, 0xcc, 0x3c, 0x18, + 0x80, 0x98, 0xfe, 0xfb, 0xfc, 0xe6, 0xd2, 0x3f, 0xf6, 0xc1, 0x15, 0xda, + 0xe5, 0x3b, 0x56, 0x4c, 0x1c, 0x5d, 0x27, 0xc0, 0x9d, 0x8d, 0x70, 0x80, + 0x59, 0x2e, 0x41, 0x3f, 0xae, 0x16, 0x9f, 0x43, 0x43, 0xdb, 0xc1, 0x83, + 0x16, 0xed, 0x79, 0x28, 0xb4, 0x45, 0xa2, 0x4a, 0x7e, 0xbc, 0x85, 0xe3, + 0x04, 0x8c, 0xe8, 0xf3, 0x5e, 0x4e, 0xdd, 0x6a, 0x41, 0xd6, 0xa2, 0x43, + 0x16, 0x58, 0x2f, 0x4c, 0x63, 0xe7, 0x69, 0xfd, 0x95, 0xfb, 0xbc, 0x13, + 0x83, 0x13, 0x4a, 0xe1, 0xb4, 0x28, 0xc1, 0x25, 0xd7, 0x66, 0xf7, 0xf3, + 0x83, 0x9d, 0x93, 0x0b, 0x59, 0xdf, 0xeb, 0xa4, 0x66, 0xbf, 0x42, 0xd8, + 0x56, 0xe2, 0x71, 0x20, 0x20, 0xa3, 0xa9, 0xeb, 0x76, 0xdb, 0x8b, 0x7b, + 0x2d, 0xe0, 0xf6, 0xb7, 0x52, 0x1b, 0x51, 0x91, 0x29, 0x35, 0x01, 0xad, + 0xab, 0x12, 0xca, 0x61, 0x5f, 0xec, 0xe7, 0x90, 0x64, 0xce, 0xdb, 0xae, + 0x6a, 0x81, 0xc6, 0x6b, 0x5a, 0xf5, 0xc3, 0x12, 0x34, 0x5c, 0xbb, 0x5a, + 0xbb, 0xa6, 0xce, 0x75, 0x83, 0xab, 0x7d, 0xbe, 0x15, 0xf6, 0x0c, 0x13, + 0x46, 0x35, 0xcf, 0x9a, 0xd3, 0xce, 0x78, 0x1c, 0x1f, 0xe3, 0x24, 0xe9, + 0x92, 0xd8, 0xe6, 0x8f, 0x9f, 0x57, 0x26, 0xcc, 0x86, 0x3e, 0xb2, 0x12, + 0x5f, 0xf4, 0xe7, 0x1f, 0x00, 0x13, 0xcb, 0x23, 0xba, 0x23, 0x0f, 0xf5, + 0x19, 0xaa, 0x20, 0xb5, 0x59, 0x25, 0x18, 0x6b, 0xc6, 0x52, 0x38, 0xac, + 0x51, 0xe8, 0x21, 0x3f, 0xf4, 0x65, 0x6d, 0x40, 0xbc, 0x1a, 0x3b, 0x70, + 0xa7, 0xaa, 0x1b, 0x94, 0x23, 0xd9, 0x95, 0xf9, 0x06, 0x69, 0xe8, 0x6a, + 0x4a, 0x52, 0x87, 0xbe, 0x59, 0x70, 0x36, 0x14, 0x41, 0x99, 0x85, 0x0c, + 0xe8, 0x7e, 0x09, 0x47, 0x13, 0xbc, 0x9e, 0xe5, 0xc9, 0xe4, 0xd6, 0x74, + 0x7f, 0x8f, 0x20, 0xc1, 0x3f, 0xfe, 0xb4, 0x5b, 0x30, 0x07, 0xdd, 0x15, + 0x3f, 0x87, 0x98, 0x2b, 0xee, 0xb4, 0x7e, 0x14, 0x3a, 0xe2, 0x3e, 0x3c, + 0x69, 0xa1, 0x91, 0x8f, 0x49, 0xe7, 0x14, 0x9e, 0xce, 0x7a, 0x0b, 0xe8, + 0x8f, 0xa0, 0xa6, 0xe4, 0x64, 0xf9, 0xdb, 0x9d, 0x4d, 0xd7, 0x0c, 0xb5, + 0x1f, 0x29, 0x2d, 0xc1, 0xf2, 0x77, 0x61, 0xa4, 0xae, 0x8b, 0x1b, 0x1c, + 0xa5, 0x51, 0x8d, 0x4b, 0xcc, 0x2a, 0x94, 0x6e, 0xa7, 0x7f, 0x4f, 0x27, + 0xa4, 0xde, 0x6a, 0x0f, 0xdf, 0x5e, 0xee, 0xec, 0xe4, 0xe7, 0xae, 0x96, + 0x63, 0xbe, 0xa3, 0x08, 0xb6, 0x11, 0x3f, 0xcb, 0x38, 0x1e, 0xa6, 0x8a, + 0x72, 0x24, 0x6c, 0xd3, 0xc3, 0x6a, 0x4b, 0x63, 0x28, 0x78, 0x41, 0xba, + 0x69, 0xd9, 0xe6, 0xc4, 0xc1, 0x3c, 0x73, 0xf3, 0x09, 0x98, 0xcc, 0xcb, + 0x2e, 0x3c, 0x64, 0xf0, 0x0e, 0x80, 0x0a, 0x45, 0xbe, 0xbf, 0x83, 0x02, + 0xfb, 0x21, 0x1b, 0x2a, 0x9f, 0x5a, 0x96, 0xe7, 0xeb, 0x59, 0x22, 0xbc, + 0x2c, 0x26, 0x02, 0x9a, 0x29, 0x47, 0x7e, 0x4a, 0x8d, 0xbf, 0xe2, 0x48, + 0x94, 0xe2, 0x2a, 0xcd, 0x06, 0xec, 0x82, 0x40, 0x64, 0x13, 0x7c, 0xf1, + 0xf4, 0x4d, 0x9a, 0xc5, 0xc7, 0x34, 0x47, 0x58, 0xeb, 0x2d, 0xde, 0x62, + 0x6b, 0x25, 0x00, 0x20, 0x30, 0xc2, 0x80, 0x6c, 0xca, 0x94, 0x4b, 0x30, + 0xa1, 0x44, 0x41, 0xeb, 0x7b, 0xf6, 0x22, 0x4e, 0x18, 0xf0, 0xdb, 0xf5, + 0xed, 0x03, 0x57, 0x5a, 0xf2, 0x36, 0x7e, 0x06, 0x97, 0xcb, 0x5b, 0x3f, + 0xe6, 0xbe, 0xfd, 0xb6, 0xa7, 0xef, 0x2e, 0x5c, 0x83, 0x05, 0x6c, 0x6b, + 0x64, 0x89, 0xc3, 0x95, 0x5a, 0xf8, 0x2b, 0x8c, 0x2f, 0xb3, 0x5f, 0xf4, + 0x47, 0x6e, 0x88, 0xae, 0x5d, 0xfd, 0xfd, 0x06, 0xc1, 0x46, 0x40, 0x07, + 0x0c, 0x88, 0x58, 0x00, 0x8b, 0x40, 0xbf, 0x46, 0x22, 0x1b, 0xa1, 0xc7, + 0x6f, 0x24, 0x0f, 0x8c, 0xf4, 0x08, 0x73, 0xb1, 0xe1, 0x09, 0xbc, 0xcd, + 0x24, 0xbe, 0x69, 0x90, 0x3c, 0xfe, 0x48, 0xd2, 0x0a, 0xcd, 0x6f, 0x95, + 0xaa, 0x5a, 0xf6, 0xd5, 0x37, 0xe2, 0x47, 0x4d, 0x1d, 0xf6, 0x93, 0xed, + 0x41, 0x7b, 0x96, 0x0b, 0xab, 0xe5, 0x32, 0x4d, 0x1b, 0x97, 0xe3, 0xe9, + 0x79, 0xdb, 0x8a, 0x1c, 0x15, 0xd9, 0x94, 0x98, 0xcb, 0x1a, 0xdc, 0x83, + 0x75, 0xbc, 0x35, 0x15, 0xcc, 0xb4, 0xa6, 0x6d, 0xe1, 0x18, 0xbf, 0x5f, + 0x95, 0xa4, 0x2b, 0xe2, 0x60, 0xc9, 0x33, 0xfd, 0xad, 0xe5, 0xf5, 0xe1, + 0x29, 0xb8, 0x04, 0x34, 0x3e, 0x52, 0x74, 0x4b, 0x4b, 0x82, 0x65, 0xba, + 0xd8, 0x8a, 0x6c, 0x96, 0xb7, 0x77, 0xac, 0x1c, 0xd9, 0x63, 0x60, 0xe3, + 0xa7, 0xa4, 0x27, 0x92, 0xe1, 0xd8, 0xbe, 0x23, 0xba, 0xc6, 0xc0, 0x52, + 0x6e, 0x24, 0x8b, 0x51, 0x7b, 0x1f, 0x87, 0x4d, 0x6a, 0x44, 0x54, 0x2e, + 0xce, 0x90, 0x39, 0xc7, 0x92, 0x95, 0xd0, 0x6c, 0xa7, 0x5f, 0x7a, 0x35, + 0xea, 0xd4, 0x4a, 0x76, 0x3d, 0xfd, 0x49, 0xec, 0xaf, 0x42, 0x51, 0xbb, + 0x41, 0x7f, 0x90, 0x82, 0x11, 0xc3, 0x71, 0x61, 0xab, 0xcc, 0xf5, 0x9c, + 0xba, 0xb7, 0xbf, 0xd0, 0x04, 0x1e, 0xf9, 0x3a, 0xa0, 0xd0, 0x2a, 0x7f, + 0x9c, 0x92, 0x6a, 0x6e, 0x13, 0x8c, 0x07, 0xa1, 0x3a, 0x8b, 0x28, 0x3d, + 0xd1, 0x6c, 0x7c, 0xee, 0x64, 0xca, 0xcb, 0xa2, 0xc3, 0x92, 0xa6, 0xc2, + 0x46, 0x05, 0x98, 0x10, 0x17, 0xac, 0x76, 0xc9, 0x7f, 0xa5, 0xdd, 0x5c, + 0xde, 0x82, 0xa0, 0xc1, 0x23, 0x2a, 0x17, 0x03, 0x33, 0xe3, 0x8d, 0x24, + 0x9f, 0xf6, 0x5d, 0x18, 0x1b, 0x7f, 0x29, 0x48, 0xb5, 0x18, 0x21, 0xfa, + 0xf5, 0x21, 0xfa, 0x55, 0x01, 0x55, 0x41, 0xea, 0xca, 0xbe, 0xeb, 0x44, + 0x3c, 0x6c, 0x7f, 0x49, 0x26, 0x8e, 0x0a, 0x0d, 0xaa, 0x78, 0x2b, 0xaa, + 0x5e, 0x04, 0xec, 0xeb, 0x45, 0x0f, 0x96, 0xd9, 0xcd, 0xca, 0x66, 0x53, + 0x7b, 0x8e, 0x1b, 0xae, 0xb0, 0x34, 0x2f, 0xd9, 0x21, 0x33, 0x97, 0x28, + 0xfe, 0xbd, 0xf5, 0xbf, 0x6f, 0xcf, 0xb0, 0xc1, 0xf6, 0x46, 0x0d, 0x82, + 0xa4, 0x74, 0xb8, 0xdc, 0x38, 0x0c, 0xc4, 0xa4, 0xf8, 0xc2, 0xbc, 0x21, + 0xbd, 0x54, 0xca, 0x1a, 0x49, 0xa0, 0xa2, 0xfa, 0x63, 0x97, 0x61, 0x64, + 0xb2, 0x0a, 0x6d, 0x39, 0x8f, 0xea, 0x06, 0xd0, 0xdd, 0x4a, 0xc4, 0xef, + 0x7a, 0x8a, 0xe7, 0xbe, 0xfa, 0xa5, 0x2d, 0x57, 0xbf, 0x83, 0xf8, 0xec, + 0xa2, 0x21, 0x80, 0x7f, 0x52, 0xa8, 0x63, 0xe3, 0x1c, 0x51, 0x16, 0x07, + 0x82, 0xe8, 0xcd, 0xa7, 0x7b, 0x7e, 0xe1, 0xde, 0xa5, 0x87, 0x03, 0x3a, + 0xcd, 0xf3, 0x5c, 0x71, 0x04, 0x7e, 0x47, 0x15, 0xb2, 0x3e, 0x12, 0x65, + 0x19, 0x7f, 0x72, 0x69, 0xa2, 0x3f, 0x5b, 0x44, 0xca, 0x44, 0x12, 0x4f, + 0x31, 0x88, 0x65, 0x5d, 0x90, 0x74, 0x4b, 0x72, 0x13, 0xb0, 0x86, 0xca, + 0x37, 0xb5, 0xa4, 0x7f, 0x17, 0xc4, 0xa6, 0xd2, 0xef, 0x20, 0x1a, 0xf0, + 0x52, 0x4f, 0xcd, 0xff, 0x41, 0xa0, 0xd7, 0x70, 0xed, 0x65, 0x41, 0x6d, + 0x69, 0x7f, 0x14, 0x55, 0x74, 0x3e, 0x44, 0xc4, 0x09, 0xb5, 0x89, 0xd4, + 0x80, 0xf4, 0x60, 0xf4, 0xaa, 0x91, 0xa1, 0x84, 0x16, 0x89, 0xec, 0xdb, + 0x79, 0x86, 0xf4, 0xcb, 0x90, 0x9d, 0xe4, 0x06, 0x2a, 0x58, 0x6e, 0x67, + 0x1b, 0x0d, 0xc0, 0xb8, 0x43, 0x0e, 0xee, 0xb1, 0x09, 0x9a, 0xb7, 0x88, + 0x9f, 0xd2, 0x8d, 0x98, 0x8c, 0x2a, 0xc6, 0xcf, 0x8a, 0xe2, 0x81, 0x0d, + 0xa2, 0x66, 0x3c, 0xf5, 0xb5, 0x65, 0x1e, 0xf1, 0x3b, 0x53, 0x71, 0x77, + 0x27, 0xd9, 0xf6, 0xd5, 0x51, 0x30, 0xfe, 0xfa, 0x48, 0x48, 0xed, 0xbc, + 0x9a, 0xe5, 0xab, 0x1d, 0x06, 0x0b, 0x52, 0x8b, 0x81, 0x7e, 0xdd, 0xc1, + 0xf2, 0xe2, 0xb3, 0xf4, 0xa8, 0x30, 0xe7, 0x69, 0xfa, 0x7c, 0xb4, 0x98, + 0x36, 0x4b, 0x08, 0xcc, 0x75, 0x79, 0xc4, 0x7c, 0x84, 0x6b, 0xbf, 0xad, + 0x23, 0x2b, 0x17, 0xcb, 0x9c, 0xe6, 0xc6, 0xa7, 0xed, 0x48, 0x1a, 0x93, + 0xe2, 0x95, 0x0d, 0xf9, 0xc5, 0x89, 0x0f, 0xcd, 0xc7, 0xe6, 0xef, 0x02, + 0x15, 0x8b, 0x31, 0xaa, 0xf6, 0x20, 0x8e, 0xf1, 0x67, 0x5e, 0x6f, 0x7b, + 0x82, 0x29, 0x6f, 0x77, 0xea, 0x2c, 0x28, 0xa0, 0x79, 0xd7, 0x45, 0x94, + 0xf2, 0xaa, 0x76, 0xd9, 0x22, 0x6b, 0xcc, 0xe8, 0x94, 0xff, 0xf1, 0x2d, + 0xe8, 0x97, 0x2c, 0x45, 0xa1, 0xf8, 0xb9, 0xeb, 0xf8, 0xb3, 0x65, 0x8c, + 0x92, 0x95, 0xb1, 0xcf, 0x9f, 0xf2, 0x0f, 0x44, 0x94, 0x34, 0x46, 0x11, + 0x24, 0xba, 0xfd, 0x92, 0x84, 0x77, 0xfe, 0x00, 0x6a, 0xd0, 0x5c, 0xed, + 0xe7, 0xcb, 0xe1, 0x01, 0x79, 0xbb, 0x99, 0x1c, 0xc0, 0xbd, 0x54, 0x4b, + 0xe2, 0x44, 0x66, 0x03, 0xac, 0xe3, 0x4e, 0xba, 0x7d, 0xb6, 0x3d, 0xa3, + 0x9a, 0x79, 0x08, 0x5e, 0x1e, 0x74, 0x0b, 0x30, 0xee, 0x2e, 0xaa, 0xf3, + 0x1f, 0x25, 0xd6, 0x89, 0x33, 0xca, 0x34, 0xb7, 0x0c, 0x71, 0x60, 0x2c, + 0x3b, 0x61, 0xf0, 0x86, 0x2a, 0xc3, 0x87, 0xa7, 0x94, 0x4f, 0x2f, 0x84, + 0xdf, 0x66, 0xc0, 0xe0, 0x1d, 0xe7, 0xa2, 0xe6, 0x98, 0x48, 0xa0, 0x2f, + 0xeb, 0x81, 0x1c, 0x66, 0xd2, 0x50, 0x26, 0xdd, 0x2f, 0xda, 0xaf, 0x4d, + 0x76, 0x62, 0x17, 0xb8, 0x9a, 0x39, 0x6c, 0xfa, 0xb2, 0x94, 0xf3, 0xce, + 0x20, 0xe8, 0x7b, 0xa6, 0x3f, 0x3d, 0x19, 0x56, 0x34, 0xfd, 0x01, 0xed, + 0xd4, 0x05, 0xe2, 0x9c, 0x73, 0x3b, 0xce, 0x62, 0xea, 0x5f, 0x2b, 0x88, + 0x8d, 0x17, 0x04, 0xea, 0xcf, 0x31, 0xe6, 0xdd, 0x09, 0x22, 0xad, 0x45, + 0x48, 0x7a, 0x34, 0xc4, 0x8c, 0xfb, 0x7d, 0xd9, 0x48, 0x64, 0x4f, 0xd5, + 0x55, 0x99, 0x54, 0x9d, 0x67, 0x13, 0x20, 0x07, 0x98, 0x60, 0x78, 0xe8, + 0x49, 0xbe, 0xd6, 0x0f, 0x5b, 0x3f, 0x4a, 0x53, 0x27, 0x38, 0xab, 0x57, + 0x8b, 0xfd, 0x0c, 0x85, 0x64, 0xc3, 0xed, 0x9a, 0xcd, 0xd7, 0x2b, 0xee, + 0xf3, 0x8b, 0x6b, 0x23, 0x52, 0x1a, 0xe9, 0x8a, 0xc5, 0x61, 0xd5, 0xa4, + 0xe6, 0xef, 0xc0, 0xce, 0x03, 0x16, 0x1e, 0x80, 0xa2, 0x18, 0x77, 0x39, + 0x2b, 0x66, 0x50, 0xd7, 0xcd, 0x88, 0x3e, 0x5a, 0x7c, 0x44, 0x7b, 0x86, + 0x87, 0xe4, 0x15, 0x43, 0xb4, 0x78, 0x8d, 0x8b, 0xf9, 0x54, 0x55, 0xdf, + 0x13, 0x3f, 0x50, 0x4e, 0x51, 0x98, 0x15, 0x05, 0x0f, 0x68, 0xba, 0xd5, + 0x24, 0xda, 0xaa, 0x12, 0x2c, 0xee, 0x17, 0x1f, 0x0c, 0x11, 0x40, 0xe4, + 0x90, 0xc2, 0x1f, 0xd8, 0x5c, 0x44, 0xb5, 0x32, 0x55, 0xe3, 0xa7, 0xfd, + 0x72, 0x91, 0xb5, 0x29, 0x65, 0xbe, 0xfd, 0x89, 0xe6, 0x31, 0x5d, 0x25, + 0x60, 0x5e, 0xcf, 0x09, 0x30, 0x21, 0x36, 0x16, 0x0a, 0x8e, 0x56, 0xd6, + 0x77, 0x56, 0x6e, 0xdb, 0x64, 0xa3, 0x84, 0xd2, 0xb2, 0x1f, 0xe3, 0x16, + 0x9d, 0xb3, 0x36, 0xa5, 0xbe, 0x5c, 0xdd, 0x2a, 0xb8, 0x41, 0x4d, 0x9b, + 0x54, 0x49, 0x48, 0x6d, 0xd5, 0x6a, 0xaf, 0x25, 0xe4, 0xf0, 0x2f, 0x90, + 0x7d, 0x93, 0x88, 0xff, 0xb6, 0x02, 0xef, 0xe8, 0xfa, 0x01, 0xeb, 0x63, + 0x83, 0x1c, 0xa5, 0x04, 0x5c, 0xa1, 0x23, 0xbd, 0x91, 0xd4, 0x8e, 0xfa, + 0xf7, 0x10, 0xaa, 0x71, 0x03, 0xd6, 0x41, 0x84, 0x9d, 0x9a, 0xf9, 0x1a, + 0xe8, 0x13, 0xc8, 0x48, 0x63, 0x0b, 0x9f, 0x50, 0xd3, 0x3b, 0x8a, 0xa1, + 0x24, 0xe1, 0xbb, 0x70, 0x4c, 0xb7, 0xdc, 0xa7, 0x50, 0x7c, 0xa9, 0x10, + 0xdd, 0x9e, 0xc5, 0xe3, 0xd6, 0x23, 0xb5, 0xc9, 0x45, 0x61, 0x99, 0x4a, + 0xfd, 0xd8, 0x29, 0x75, 0x46, 0x78, 0xbf, 0x68, 0x2b, 0x69, 0x21, 0x9d, + 0x54, 0x75, 0xdd, 0x5c, 0xf5, 0xba, 0xe9, 0x5b, 0x9a, 0x4e, 0xd6, 0xf1, + 0xfa, 0x82, 0x51, 0xb7, 0x48, 0x26, 0x00, 0x6b, 0x87, 0x00, 0xad, 0x55, + 0x40, 0x04, 0x94, 0xf2, 0x13, 0x4b, 0x3b, 0xa5, 0x9b, 0x9c, 0xbe, 0xa6, + 0xc0, 0xb5, 0x45, 0xc9, 0x65, 0x9c, 0x0f, 0x0c, 0x90, 0x4c, 0x0a, 0x14, + 0x76, 0x1f, 0x61, 0x93, 0x20, 0xf7, 0xaf, 0xea, 0x6c, 0x2d, 0x74, 0x64, + 0x31, 0xce, 0x20, 0x22, 0x4e, 0x59, 0x46, 0x1f, 0xeb, 0x7f, 0xd7, 0x63, + 0xca, 0xb5, 0xd5, 0x90, 0x26, 0x58, 0x24, 0x8e, 0xd2, 0xbc, 0x78, 0x7d, + 0x34, 0x9d, 0x31, 0xde, 0x3e, 0x26, 0xaa, 0x50, 0xf0, 0xe3, 0xeb, 0xc1, + 0x63, 0x04, 0x33, 0xdd, 0x07, 0x8f, 0xe7, 0x40, 0x6d, 0x3e, 0xaf, 0x16, + 0xb8, 0xfb, 0xef, 0x06, 0x3a, 0x58, 0xf5, 0x9b, 0x32, 0x6a, 0x4a, 0xb7, + 0xb6, 0x5b, 0x81, 0x5c, 0xe2, 0xf6, 0xb7, 0xab, 0xc3, 0x9b, 0x00, 0x92, + 0xba, 0x06, 0xee, 0xdd, 0x2d, 0x66, 0x1e, 0x2c, 0x6e, 0xa6, 0x69, 0x8d, + 0x8f, 0x8b, 0x93, 0x3a, 0x48, 0x91, 0x09, 0xfe, 0xa1, 0x6c, 0xfb, 0x53, + 0x2c, 0x95, 0x84, 0x23, 0xcb, 0x32, 0xab, 0x35, 0xf4, 0xc0, 0x2f, 0xe3, + 0xb8, 0xaa, 0xc4, 0x5d, 0x84, 0x42, 0x44, 0xf5, 0xf7, 0x46, 0x29, 0x84, + 0x4a, 0xe7, 0xf3, 0x0c, 0xc3, 0xea, 0xb7, 0xa1, 0x61, 0x1e, 0xf3, 0x2f, + 0x58, 0xf2, 0xa9, 0xa6, 0x02, 0xe0, 0x89, 0x1c, 0x11, 0xfa, 0xb1, 0x7b, + 0xe6, 0x1b, 0x97, 0x79, 0xf6, 0xa8, 0x35, 0x40, 0xa2, 0xc4, 0xab, 0x98, + 0x79, 0x5f, 0x0b, 0xfc, 0xce, 0xe7, 0x9f, 0x88, 0xfc, 0x7b, 0xce, 0x08, + 0xc8, 0x77, 0xd4, 0x4b, 0x90, 0xe2, 0x9c, 0x78, 0x17, 0xd3, 0x38, 0xa5, + 0xd3, 0x9c, 0xce, 0xa1, 0xd5, 0x81, 0x1a, 0x1d, 0xd5, 0x7c, 0xa5, 0xd2, + 0xed, 0x08, 0xf1, 0x27, 0xf5, 0x61, 0x49, 0xaf, 0x05, 0xc9, 0x49, 0xfa, + 0x02, 0x93, 0xee, 0x82, 0x44, 0xc8, 0x9d, 0xb6, 0x8b, 0xe4, 0x93, 0xd5, + 0xd8, 0xb0, 0xce, 0xe8, 0x00, 0x56, 0x0b, 0x71, 0xc3, 0x6a, 0x22, 0x59, + 0x01, 0x56, 0x78, 0x44, 0x3a, 0x75, 0x3f, 0x4d, 0xf6, 0x64, 0x63, 0x5f, + 0x82, 0x39, 0xc7, 0x6c, 0x1c, 0x98, 0x2d, 0x87, 0xd8, 0x3c, 0x28, 0x37, + 0x67, 0x62, 0x20, 0x73, 0xe3, 0x6e, 0x9a, 0xe9, 0xa7, 0xc8, 0x53, 0x8d, + 0x7b, 0x1e, 0x0c, 0x50, 0xdd, 0xc4, 0xa0, 0xaf, 0x4b, 0x53, 0x76, 0xe0, + 0x75, 0x9a, 0x97, 0xa9, 0xc1, 0x98, 0xeb, 0x8f, 0xd4, 0x49, 0xeb, 0xf2, + 0x09, 0x8a, 0xe0, 0xf3, 0xcb, 0x7a, 0xf8, 0x50, 0x93, 0x44, 0x66, 0xeb, + 0x6b, 0xcf, 0x6e, 0x61, 0xe6, 0x3b, 0xe4, 0x4d, 0xce, 0x09, 0x34, 0x75, + 0x61, 0x10, 0x42, 0xcd, 0x9d, 0xf9, 0x99, 0x6a, 0xa7, 0x5e, 0xc3, 0x14, + 0x8d, 0x79, 0xc0, 0x7c, 0xfe, 0xe5, 0x42, 0x3b, 0x71, 0x2f, 0x49, 0x46, + 0xe5, 0x37, 0xe3, 0x1a, 0xbb, 0xa7, 0x0e, 0x12, 0xb0, 0xfb, 0xae, 0x84, + 0x79, 0x6f, 0x2a, 0x84, 0xbb, 0x8c, 0x14, 0x30, 0xc6, 0xda, 0xe8, 0x73, + 0x58, 0xc9, 0xdf, 0x6e, 0x56, 0x38, 0x68, 0x11, 0x8c, 0x8a, 0x2a, 0x61, + 0xaf, 0x93, 0x99, 0xaf, 0xb1, 0x98, 0x01, 0xde, 0xc5, 0xf4, 0x10, 0x54, + 0xba, 0x04, 0x9f, 0x12, 0x72, 0x83, 0x1c, 0x74, 0xc6, 0xfb, 0x33, 0xbd, + 0xfd, 0xc7, 0x6f, 0x66, 0xd5, 0x96, 0xdb, 0xf2, 0x73, 0x7d, 0x40, 0x87, + 0x5f, 0x72, 0x91, 0xae, 0xd4, 0x12, 0x6d, 0xee, 0x70, 0xf8, 0x6a, 0xfa, + 0xb8, 0x9b, 0x61, 0xb3, 0xc2, 0x5f, 0xc6, 0x19, 0xf5, 0x0f, 0xb6, 0x78, + 0xb0, 0x25, 0x7e, 0x07, 0x3a, 0x45, 0xaa, 0x89, 0x60, 0xc9, 0xf6, 0xf5, + 0x9d, 0xea, 0x7d, 0xb9, 0xa3, 0x58, 0x51, 0xe8, 0xb6, 0xb1, 0x19, 0x90, + 0x0f, 0xf2, 0x2b, 0x67, 0xe7, 0x15, 0xab, 0xc2, 0x73, 0x19, 0x8c, 0xf2, + 0xf2, 0x30, 0xb0, 0x61, 0x44, 0xae, 0x8b, 0x55, 0xc9, 0x77, 0x64, 0xb4, + 0x53, 0xef, 0x6a, 0xd3, 0x78, 0x72, 0x9a, 0xd1, 0x6c, 0x4b, 0xcf, 0x02, + 0x62, 0xcf, 0x9e, 0xe9, 0x07, 0xb0, 0xb9, 0xa3, 0x2c, 0x81, 0xe9, 0xa5, + 0x23, 0xa6, 0xa5, 0x75, 0x85, 0xa1, 0xba, 0xee, 0xb6, 0xef, 0x1b, 0x96, + 0x7e, 0xb2, 0x80, 0x31, 0x43, 0xd5, 0xe0, 0x2d, 0x47, 0xe1, 0xe1, 0xc0, + 0xd7, 0xd0, 0xe6, 0xfc, 0x75, 0xa3, 0xc9, 0x4b, 0x97, 0x6d, 0xf8, 0xf9, + 0xb0, 0x98, 0x5c, 0x91, 0x6c, 0x73, 0xd2, 0x74, 0x98, 0x67, 0x2b, 0x6b, + 0x40, 0x12, 0x98, 0xfa, 0x4b, 0xf5, 0xb4, 0x74, 0x13, 0xd0, 0xe7, 0xda, + 0x2f, 0x2d, 0xbf, 0x13, 0x34, 0xc6, 0xbf, 0x0e, 0x42, 0x17, 0xa6, 0x7a, + 0xb5, 0x90, 0x8e, 0x9b, 0x82, 0xc8, 0x05, 0xf6, 0x64, 0x6a, 0x32, 0x5a, + 0xfe, 0xce, 0x90, 0x4c, 0x38, 0xd6, 0xd4, 0x6e, 0xa6, 0xf9, 0x7e, 0x5b, + 0x8e, 0x2d, 0xbc, 0x8e, 0xb0, 0x53, 0x02, 0x17, 0x71, 0x92, 0x41, 0x05, + 0x47, 0x2c, 0x98, 0xd2, 0xbe, 0xb7, 0xfb, 0x56, 0x47, 0xbf, 0x02, 0xee, + 0x1f, 0x94, 0xdc, 0xd1, 0x6e, 0x55, 0xd0, 0x66, 0x59, 0x5d, 0x80, 0xfd, + 0xdd, 0xf2, 0xa7, 0x25, 0x72, 0x53, 0x8d, 0xf6, 0xf4, 0x41, 0xd2, 0xd5, + 0x83, 0x69, 0xaa, 0xbf, 0xe2, 0x4a, 0x2b, 0x77, 0x12, 0xc1, 0xf1, 0x62, + 0xd6, 0x81, 0xba, 0x12, 0x81, 0x0b, 0x37, 0xaf, 0xa0, 0xea, 0xc9, 0x51, + 0x82, 0xf9, 0xeb, 0xf1, 0x0f, 0x97, 0x14, 0x3b, 0x9f, 0x31, 0x7f, 0x7e, + 0xb7, 0xe6, 0xc4, 0xd3, 0x0c, 0x13, 0x4e, 0x7d, 0x96, 0x14, 0xf9, 0xc0, + 0x21, 0x54, 0x47, 0x86, 0xfb, 0xb1, 0x04, 0xc0, 0xe2, 0xd6, 0x4c, 0x04, + 0x25, 0x2e, 0x0f, 0xde, 0x6c, 0x88, 0xc1, 0x32, 0x3c, 0x28, 0x83, 0xe3, + 0x66, 0x39, 0x49, 0x9e, 0x1b, 0x4e, 0x27, 0xad, 0x92, 0x80, 0x03, 0x36, + 0x16, 0xfc, 0x52, 0x3f, 0x98, 0xc2, 0xd5, 0xda, 0x55, 0x12, 0x15, 0x58, + 0xe3, 0x67, 0x6c, 0xdf, 0x94, 0x34, 0x75, 0xb4, 0xcd, 0x3f, 0xba, 0xf7, + 0xb7, 0xd1, 0xfd, 0xa2, 0x03, 0x15, 0x69, 0xd1, 0x07, 0x50, 0xc9, 0xca, + 0x2f, 0xe3, 0xd6, 0x17, 0x7f, 0xe6, 0xd7, 0x70, 0x61, 0x60, 0xa6, 0xbb, + 0x50, 0x5c, 0x7f, 0x4a, 0xfe, 0xca, 0x3c, 0xd1, 0xb6, 0x2b, 0x1c, 0xe1, + 0xe4, 0xb4, 0xf5, 0xbb, 0x47, 0xe0, 0x6f, 0x24, 0x13, 0x6c, 0x1b, 0x4d, + 0xd8, 0x9d, 0x3e, 0x69, 0xba, 0x69, 0x66, 0x29, 0x86, 0x25, 0x16, 0xb2, + 0xf7, 0x05, 0x08, 0xc8, 0xbb, 0xaa, 0xf8, 0xc2, 0x37, 0x8d, 0xa8, 0x8e, + 0x74, 0x05, 0x82, 0x5e, 0x93, 0x54, 0x62, 0xea, 0x5b, 0x72, 0x68, 0x97, + 0xbe, 0xf1, 0x40, 0xfd, 0xdd, 0x1f, 0xf7, 0x7d, 0x87, 0xea, 0x9c, 0x84, + 0x20, 0xef, 0x97, 0x29, 0x87, 0x78, 0x69, 0xb9, 0x34, 0xbb, 0x21, 0xb5, + 0xaf, 0xc3, 0x2c, 0xf9, 0xdb, 0x5c, 0x83, 0x95, 0xc2, 0x1b, 0xc1, 0xd7, + 0x54, 0xe4, 0xbb, 0xd8, 0xbd, 0x94, 0x34, 0xbc, 0x62, 0xd9, 0x19, 0x17, + 0x93, 0x6c, 0xd3, 0x32, 0x49, 0x2e, 0xf3, 0xb3, 0x14, 0x08, 0xf4, 0x0d, + 0x14, 0x8c, 0x46, 0xc6, 0x1c, 0x54, 0x4f, 0x51, 0xea, 0xa1, 0x21, 0xbc, + 0x4d, 0x9f, 0xa1, 0xed, 0x77, 0x80, 0xf8, 0x59, 0xd6, 0xb0, 0xf0, 0x9b, + 0x9b, 0x60, 0xea, 0xca, 0xe8, 0xd4, 0x75, 0x8b, 0x89, 0x27, 0xfd, 0x98, + 0x6a, 0x42, 0xc5, 0x8a, 0x14, 0x0e, 0x9d, 0xa5, 0x58, 0x25, 0xa7, 0x09, + 0xe8, 0x14, 0xe1, 0x7e, 0x73, 0x0b, 0x2d, 0xae, 0xd8, 0x14, 0xec, 0x93, + 0x91, 0xf6, 0xde, 0xc4, 0x27, 0x5d, 0x88, 0xfa, 0x62, 0xd6, 0x3e, 0x4a, + 0xe9, 0x44, 0x03, 0xfc, 0x48, 0x4e, 0xa4, 0x62, 0x6a, 0x30, 0x02, 0xd5, + 0xce, 0x18, 0xc9, 0xb0, 0x43, 0xbe, 0x0c, 0xfe, 0x39, 0xa8, 0x71, 0x7e, + 0xf9, 0x16, 0xba, 0x4c, 0x51, 0x0b, 0xdd, 0x37, 0xe4, 0x3d, 0xd4, 0xd6, + 0x09, 0x2a, 0xb1, 0x96, 0x2b, 0x31, 0x17, 0x22, 0xcd, 0xfc, 0x28, 0x05, + 0x3a, 0x4b, 0x0b, 0x82, 0x19, 0xca, 0x86, 0xe6, 0x58, 0xac, 0xb1, 0x75, + 0xe3, 0x3d, 0x7c, 0x30, 0xf4, 0xa3, 0x7c, 0x9d, 0x9f, 0x27, 0xb7, 0x14, + 0x5c, 0xe5, 0xb1, 0xbb, 0xa2, 0xea, 0x87, 0x83, 0x51, 0x06, 0x84, 0xa4, + 0xa2, 0xd4, 0x0d, 0xb9, 0x6f, 0xa6, 0x75, 0xb8, 0xbf, 0x3b, 0xf2, 0xb5, + 0xaf, 0xc6, 0x54, 0x42, 0xba, 0x46, 0x67, 0x99, 0xde, 0xe8, 0x8c, 0x34, + 0x85, 0x5e, 0x78, 0x63, 0xcd, 0x55, 0xe4, 0x22, 0x23, 0x0d, 0x0a, 0x08, + 0xd0, 0xae, 0x86, 0xf7, 0x76, 0x2d, 0x06, 0x8e, 0x86, 0xbc, 0xea, 0x69, + 0xce, 0x95, 0x9f, 0x81, 0x54, 0x53, 0x3a, 0x2b, 0x57, 0x3b, 0xb5, 0xd8, + 0x02, 0x4e, 0x1c, 0x89, 0xf4, 0x53, 0xda, 0xfa, 0x16, 0xee, 0x48, 0x05, + 0xe2, 0x07, 0x9a, 0x6f, 0xb2, 0x55, 0xfb, 0x34, 0x58, 0x96, 0x93, 0x4f, + 0xc4, 0xd5, 0xe1, 0x24, 0xb2, 0xd4, 0x1b, 0xc2, 0x18, 0xd0, 0x22, 0x2d, + 0x12, 0x9f, 0xfc, 0x53, 0x2f, 0x27, 0xc9, 0x76, 0x50, 0xc0, 0x5d, 0x95, + 0x03, 0xa4, 0x84, 0x45, 0x9d, 0x2f, 0x42, 0xaa, 0x4d, 0x2a, 0xa6, 0xf3, + 0xaf, 0x27, 0x01, 0xf1, 0xba, 0x3e, 0x61, 0xda, 0x0c, 0x70, 0x3b, 0xca, + 0xb9, 0x23, 0x57, 0x30, 0x1e, 0x8c, 0xa0, 0x40, 0x5e, 0xa8, 0xea, 0x16, + 0x06, 0xbc, 0x65, 0x09, 0x3a, 0x1f, 0x49, 0x87, 0x31, 0x98, 0xb7, 0x84, + 0x44, 0x25, 0xb2, 0x3c, 0xf6, 0xb7, 0x9b, 0x37, 0x90, 0x4e, 0x42, 0x63, + 0x02, 0xc8, 0x1e, 0x5a, 0xb0, 0x81, 0xf2, 0xbc, 0x45, 0xc8, 0x59, 0x8f, + 0xb2, 0x41, 0xab, 0x7e, 0x27, 0x00, 0x22, 0xc6, 0x38, 0x3d, 0x20, 0x7d, + 0x18, 0x2a, 0xa3, 0x6b, 0x96, 0xac, 0x17, 0x26, 0x8e, 0xdd, 0xb9, 0xcf, + 0xdf, 0xc7, 0x5b, 0x70, 0xf3, 0x64, 0x0a, 0x7c, 0xe6, 0xbf, 0x98, 0xfd, + 0x90, 0x43, 0x97, 0xe8, 0xef, 0xc0, 0x50, 0xf2, 0x37, 0xcf, 0x1c, 0xf8, + 0x13, 0xeb, 0x9e, 0x33, 0x4e, 0xa1, 0xa6, 0xbd, 0x03, 0x37, 0x8c, 0xeb, + 0x67, 0xfb, 0xf5, 0x6b, 0x65, 0xab, 0x51, 0x62, 0xb9, 0x3a, 0x9e, 0x61, + 0xde, 0xe6, 0x78, 0x5e, 0xc4, 0x71, 0x14, 0x7f, 0x4c, 0x1c, 0xa9, 0xbd, + 0x14, 0xf0, 0xd4, 0x82, 0xb7, 0x05, 0x41, 0x52, 0x47, 0xe6, 0x82, 0x79, + 0xa8, 0xeb, 0x5d, 0x47, 0xea, 0x7f, 0x5a, 0xa7, 0x8a, 0x95, 0x10, 0x90, + 0x8f, 0xaa, 0x3f, 0x9a, 0x50, 0x8c, 0x46, 0x1c, 0xee, 0x82, 0x18, 0x4e, + 0xbc, 0x63, 0x5d, 0x65, 0x6e, 0x4c, 0x18, 0xd1, 0xce, 0x7a, 0x45, 0xf6, + 0xa2, 0x9c, 0x69, 0x85, 0xf6, 0xc4, 0x8b, 0xe3, 0x49, 0x87, 0x0d, 0x19, + 0x80, 0x41, 0x6f, 0xc5, 0x87, 0xb1, 0x59, 0x00, 0x97, 0x38, 0xe6, 0x4b, + 0x13, 0x14, 0x84, 0xfe, 0x1c, 0xd4, 0x27, 0xc8, 0xed, 0x5d, 0xbf, 0xa1, + 0xa1, 0xe4, 0xa5, 0xcf, 0x2a, 0x1e, 0x40, 0x2b, 0x0e, 0xdb, 0x49, 0x81, + 0x9d, 0xa8, 0xc3, 0x88, 0xc8, 0x3b, 0xac, 0x7a, 0x87, 0x67, 0x67, 0x12, + 0x32, 0x6b, 0x5b, 0x17, 0x28, 0x5b, 0x8c, 0x75, 0x41, 0x54, 0xec, 0x33, + 0xd1, 0x9a, 0x8c, 0xf5, 0x81, 0x9c, 0xcf, 0x6f, 0x8f, 0x0e, 0xd5, 0x66, + 0x23, 0xdd, 0x91, 0xfb, 0xd4, 0x56, 0xfc, 0x1f, 0x98, 0x1e, 0x3b, 0xe8, + 0xda, 0xbc, 0x73, 0xed, 0x27, 0x82, 0x4b, 0xdd, 0x2f, 0xa7, 0x10, 0xfb, + 0xed, 0x94, 0x65, 0x8d, 0x6d, 0xdb, 0x23, 0x71, 0xf6, 0x70, 0xd1, 0x44, + 0x60, 0x91, 0xc4, 0xbe, 0xbf, 0x09, 0x2e, 0xdb, 0xc4, 0xf2, 0x39, 0x6c, + 0x7c, 0x4b, 0x42, 0x1a, 0x81, 0x89, 0xc0, 0xab, 0xa5, 0x0f, 0x53, 0x37, + 0xb5, 0x02, 0xd0, 0x2d, 0x90, 0x9a, 0xae, 0x01, 0x7e, 0xf2, 0xd8, 0xb0, + 0xa5, 0xfa, 0x63, 0x23, 0x40, 0x6d, 0x08, 0x15, 0x1c, 0x90, 0x9d, 0x2a, + 0x5d, 0x0b, 0xd3, 0x09, 0x29, 0x23, 0xcb, 0xfa, 0x8f, 0xb5, 0xfb, 0x93, + 0xed, 0x51, 0x7c, 0xa7, 0x4c, 0xc5, 0xdb, 0x27, 0x68, 0xfe, 0x91, 0x21, + 0xcc, 0xda, 0x1e, 0x51, 0xa2, 0x07, 0xbb, 0xa4, 0x2d, 0xd5, 0x7d, 0xe5, + 0x2f, 0x47, 0xbb, 0xb8, 0xff, 0x15, 0xdd, 0x42, 0xc9, 0x31, 0xe3, 0x37, + 0xec, 0xd1, 0x0c, 0x1f, 0x3a, 0xf0, 0xeb, 0xc3, 0x50, 0xe0, 0x0d, 0x83, + 0x19, 0xc9, 0x77, 0x18, 0xe6, 0x79, 0x25, 0x53, 0xe9, 0xbb, 0x6a, 0xd3, + 0x6a, 0x82, 0xf2, 0xde, 0xdf, 0x96, 0x8d, 0xff, 0x68, 0x46, 0x7b, 0x3f, + 0x89, 0x55, 0x78, 0x14, 0xc1, 0x53, 0x16, 0xaf, 0x6c, 0x20, 0x5a, 0x40, + 0x95, 0x93, 0x0d, 0xd3, 0xf1, 0x01, 0xfa, 0xec, 0xe0, 0x5d, 0x27, 0x7a, + 0xf8, 0xef, 0xbd, 0x85, 0xeb, 0x30, 0x1a, 0x11, 0xb2, 0xab, 0x34, 0x20, + 0x4f, 0x60, 0x3b, 0x88, 0xda, 0x06, 0x4e, 0xc6, 0xd2, 0x67, 0x2a, 0x3e, + 0x7c, 0x73, 0xbe, 0x61, 0xc4, 0x3c, 0xf5, 0x90, 0x12, 0x69, 0x41, 0xa9, + 0x23, 0x9f, 0x1e, 0xde, 0x09, 0x09, 0x32, 0xdc, 0xe8, 0x87, 0x31, 0x8a, + 0x98, 0x51, 0x9c, 0xe8, 0x44, 0x57, 0x10, 0x9d, 0x2e, 0x8a, 0xf9, 0x4d, + 0xe3, 0x33, 0xf5, 0xb1, 0xb9, 0x41, 0xbb, 0x98, 0xa2, 0x1e, 0x83, 0x38, + 0x4b, 0xd1, 0x30, 0xcd, 0x3c, 0x9a, 0x45, 0x34, 0x0b, 0x3f, 0x37, 0x05, + 0x40, 0x4a, 0x93, 0xde, 0x7b, 0x82, 0x09, 0xf0, 0x96, 0x6e, 0x23, 0x44, + 0x9f, 0x13, 0xac, 0x6a, 0xbe, 0xe5, 0x83, 0xec, 0x53, 0x24, 0x3c, 0x98, + 0x71, 0x1a, 0xea, 0x48, 0xcf, 0x39, 0x5a, 0xfa, 0x4e, 0x3a, 0x62, 0x9a, + 0x68, 0xfb, 0x33, 0x07, 0xd0, 0x1b, 0x45, 0x17, 0x7a, 0x46, 0x37, 0x99, + 0x3d, 0x3c, 0x91, 0x12, 0x3b, 0x06, 0x9d, 0x4a, 0xcf, 0xdb, 0x0f, 0x78, + 0x17, 0xab, 0x2f, 0x1d, 0x5e, 0xcd, 0x31, 0xba, 0xae, 0x58, 0x18, 0x4d, + 0x49, 0x9d, 0xca, 0xd1, 0x56, 0x69, 0x92, 0xc9, 0x1d, 0x69, 0xbf, 0xac, + 0x12, 0xb5, 0xfb, 0x37, 0x31, 0x4f, 0x75, 0x6f, 0x15, 0x05, 0x4a, 0x9f, + 0x8c, 0x1d, 0xfa, 0x4e, 0xd6, 0x73, 0x85, 0x84, 0x54, 0xc4, 0x96, 0xcf, + 0x9f, 0x2f, 0x2d, 0x86, 0x37, 0x91, 0x06, 0x56, 0x75, 0x0e, 0x7f, 0xa9, + 0xc1, 0x12, 0x0e, 0xe7, 0xb0, 0x9f, 0x02, 0xfe, 0xf4, 0x5e, 0x7b, 0x91, + 0x0d, 0x89, 0x91, 0xa2, 0xaa, 0xb5, 0x67, 0x51, 0xbf, 0x8e, 0x65, 0xb6, + 0xb9, 0x30, 0xf6, 0x75, 0x19, 0x55, 0x26, 0x4d, 0xcf, 0x80, 0xf6, 0xe9, + 0x79, 0xf3, 0xb5, 0x53, 0x06, 0x8b, 0x8c, 0x27, 0x25, 0xab, 0xaa, 0xda, + 0x0f, 0x04, 0x46, 0x8d, 0x39, 0x26, 0xf5, 0x1e, 0x06, 0xac, 0x0f, 0x81, + 0x6a, 0xe6, 0xdf, 0x63, 0x03, 0x2e, 0xf6, 0xe4, 0x27, 0xd1, 0x9a, 0x82, + 0xe2, 0xf2, 0xaa, 0x60, 0xaa, 0x21, 0xd1, 0xac, 0x4c, 0x9b, 0x24, 0x4b, + 0xfb, 0x7b, 0xad, 0x81, 0x9c, 0x37, 0xa0, 0xa7, 0x19, 0x91, 0x21, 0xc2, + 0x29, 0x4c, 0x16, 0xa5, 0x11, 0xcb, 0xe1, 0xaf, 0xb8, 0x8b, 0x0e, 0xdc, + 0x27, 0xa4, 0x6a, 0xa1, 0x3c, 0x8c, 0xd1, 0xf9, 0x9e, 0x38, 0xf4, 0x26, + 0xaa, 0x54, 0xc0, 0xf6, 0x76, 0x91, 0xd1, 0x0e, 0x28, 0x6d, 0xff, 0xb8, + 0x0f, 0x5a, 0x08, 0xdd, 0x39, 0x41, 0x68, 0xe2, 0xae, 0x8a, 0xdd, 0xab, + 0x3f, 0x68, 0x03, 0x72, 0x55, 0xdb, 0x72, 0xb6, 0xef, 0x62, 0x57, 0x5e, + 0x81, 0x15, 0x46, 0x2f, 0x42, 0x77, 0x04, 0x35, 0xf8, 0x70, 0x4a, 0x94, + 0x3d, 0xf4, 0x45, 0xcd, 0xeb, 0xa3, 0x5e, 0xa6, 0xbd, 0x1d, 0x34, 0x02, + 0x9a, 0x2d, 0x32, 0x2f, 0x76, 0x3c, 0x12, 0xd4, 0xbb, 0x26, 0x67, 0x45, + 0x72, 0x60, 0xbf, 0xb8, 0xb6, 0x7b, 0x18, 0x15, 0xf9, 0x51, 0xee, 0xb3, + 0x20, 0xa5, 0x27, 0xe5, 0x2f, 0x42, 0xec, 0xf6, 0x6d, 0xa4, 0xdf, 0x74, + 0xc0, 0x9e, 0xac, 0x4c, 0xaf, 0x92, 0xec, 0x3e, 0x39, 0x0d, 0x14, 0x44, + 0x3f, 0x14, 0x82, 0x21, 0x7c, 0x2c, 0x6e, 0x51, 0x78, 0x31, 0xeb, 0x54, + 0xa0, 0x9f, 0x4a, 0x26, 0xcd, 0x6b, 0x13, 0x76, 0xc0, 0x0c, 0x24, 0x37, + 0xcb, 0xdd, 0xbc, 0x5f, 0x7c, 0x6d, 0x2e, 0x9e, 0xf3, 0x49, 0xe0, 0xb4, + 0x58, 0xc5, 0x6b, 0xfb, 0x9e, 0x77, 0xfe, 0xd8, 0x44, 0x00, 0x04, 0xc0, + 0x6a, 0xee, 0x7c, 0x28, 0x5d, 0x83, 0xa6, 0x90, 0xd9, 0x2b, 0x31, 0x67, + 0x80, 0x13, 0x5b, 0x2b, 0xd6, 0x69, 0x91, 0x5f, 0x11, 0x68, 0xd9, 0x82, + 0x1c, 0x74, 0x41, 0xe5, 0xf9, 0x33, 0xd5, 0x3c, 0x0a, 0x62, 0x7e, 0xa5, + 0x06, 0xa9, 0x91, 0x91, 0xd8, 0x2b, 0x1c, 0xe4, 0x1b, 0xda, 0x00, 0xb3, + 0xb6, 0x83, 0xd1, 0x7a, 0x96, 0x53, 0x17, 0xdd, 0x83, 0xfd, 0x5a, 0x76, + 0xf9, 0xe5, 0x81, 0x11, 0xc1, 0x2c, 0xd5, 0xab, 0xe5, 0xf1, 0x93, 0xdd, + 0x35, 0xf1, 0x55, 0x0e, 0x66, 0x5d, 0xb4, 0xf9, 0xae, 0xf0, 0x06, 0x85, + 0xf6, 0xa3, 0x45, 0x82, 0xf7, 0xe3, 0x67, 0x6b, 0x25, 0xd1, 0xcb, 0xca, + 0x17, 0x4d, 0x04, 0x6a, 0x8c, 0x72, 0xc0, 0x14, 0x7c, 0xc2, 0x6f, 0x6d, + 0x37, 0xc2, 0x2d, 0xb4, 0x5a, 0xc8, 0x8b, 0xea, 0x2d, 0x24, 0xc1, 0xce, + 0x5d, 0xfa, 0x9b, 0x40, 0xec, 0x12, 0x64, 0x79, 0x6b, 0x20, 0xf6, 0x55, + 0xa4, 0x6a, 0x12, 0x78, 0x2f, 0x4d, 0x84, 0x38, 0x7c, 0x6e, 0x10, 0x87, + 0xe2, 0xb7, 0x26, 0xdf, 0xb7, 0x81, 0x6e, 0x90, 0xba, 0xda, 0xf9, 0x03, + 0x30, 0x86, 0x55, 0xd3, 0x4c, 0x9e, 0x18, 0x4b, 0x80, 0x27, 0x05, 0xe1, + 0x49, 0x75, 0x09, 0x8f, 0x26, 0xa6, 0x0e, 0x99, 0xcf, 0xf4, 0x2d, 0x3a, + 0xc9, 0xbe, 0x07, 0x4f, 0xcc, 0xc0, 0x1b, 0x97, 0x40, 0xb2, 0x70, 0x46, + 0x6b, 0x5a, 0x79, 0x1e, 0xab, 0xe1, 0x20, 0xc9, 0x64, 0x61, 0xa5, 0xd7, + 0xf7, 0x31, 0x59, 0x19, 0x23, 0x92, 0xef, 0x3d, 0x6e, 0x62, 0x57, 0x6f, + 0x7b, 0x7a, 0xae, 0xa7, 0xf4, 0x8f, 0xf7, 0x38, 0xb9, 0xa8, 0x07, 0x09, + 0x4e, 0x16, 0x4d, 0xf6, 0x43, 0xec, 0x87, 0xb3, 0x1e, 0xbd, 0x9f, 0x37, + 0x6c, 0x9e, 0x22, 0xf1, 0x63, 0x3f, 0x3c, 0xf7, 0xad, 0xa3, 0xf8, 0x63, + 0x36, 0x01, 0x4b, 0xa0, 0x3e, 0xab, 0x73, 0x77, 0x2d, 0x80, 0xf8, 0xe6, + 0x9d, 0x86, 0xf8, 0x84, 0xa0, 0x12, 0xa7, 0x38, 0x8e, 0xff, 0xdd, 0xf8, + 0xa2, 0x82, 0xbf, 0x5c, 0x47, 0xb6, 0xbb, 0xcb, 0x5e, 0x3d, 0x83, 0x37, + 0x5c, 0x47, 0x55, 0x0a, 0x41, 0x29, 0xc1, 0x0d, 0x98, 0xe6, 0x71, 0x40, + 0x07, 0x7a, 0x88, 0x57, 0xba, 0x8f, 0x80, 0x61, 0x9d, 0xec, 0x29, 0xf5, + 0x41, 0x6a, 0x35, 0x50, 0xd4, 0xe2, 0x3a, 0x4b, 0x3f, 0xad, 0x00, 0xda, + 0x11, 0x0a, 0xb6, 0xf8, 0x47, 0xaa, 0xdf, 0xb7, 0x58, 0x15, 0x2b, 0xdb, + 0xed, 0x58, 0xf6, 0x6a, 0xa8, 0xbc, 0x3c, 0xe0, 0x56, 0x29, 0x05, 0x5a, + 0xff, 0xd2, 0xcf, 0x26, 0x94, 0x34, 0xb5, 0xa8, 0xb0, 0x05, 0x56, 0xe0, + 0x7d, 0xbc, 0xc7, 0xf2, 0xd4, 0xa8, 0xde, 0x5c, 0xac, 0x1c, 0x7e, 0x63, + 0xca, 0x51, 0xf3, 0x08, 0x7b, 0x3f, 0x74, 0x45, 0x34, 0x20, 0xed, 0x1d, + 0xf3, 0xf4, 0xa3, 0x99, 0xff, 0xf5, 0x9e, 0xc4, 0x42, 0x3a, 0x56, 0xc2, + 0x24, 0xdd, 0x63, 0xc1, 0x2b, 0xcb, 0xc8, 0xb7, 0x9d, 0x3f, 0xfb, 0x9b, + 0x0e, 0x73, 0xf0, 0x6d, 0x4e, 0xfb, 0xf2, 0x9a, 0xdb, 0x61, 0xfd, 0x58, + 0x17, 0xa3, 0x30, 0xbb, 0xdc, 0xf1, 0xeb, 0x89, 0x5b, 0x53, 0xb7, 0xfb, + 0x47, 0x9d, 0x53, 0x9b, 0x03, 0xd6, 0x27, 0xc1, 0xd2, 0x4b, 0xbf, 0x24, + 0x56, 0xb9, 0x98, 0x48, 0x29, 0xfb, 0x01, 0x1b, 0xa2, 0x60, 0x8e, 0x4a, + 0xbd, 0x89, 0x2c, 0x22, 0xf9, 0x4e, 0x99, 0x52, 0x52, 0xdb, 0xfa, 0x77, + 0x1b, 0xef, 0xb1, 0x1d, 0xe2, 0x33, 0x2d, 0x39, 0x18, 0xf3, 0xa0, 0x07, + 0xb6, 0x71, 0xbe, 0x5c, 0xf6, 0xc1, 0xaf, 0x82, 0x6c, 0xbe, 0x6c, 0xc9, + 0x74, 0xb3, 0xa2, 0x6b, 0xd3, 0xf4, 0xdb, 0x42, 0x94, 0x01, 0xc0, 0x85, + 0x9c, 0x3e, 0xc7, 0x58, 0x80, 0x08, 0x38, 0x25, 0x9f, 0x04, 0x60, 0xa8, + 0x1d, 0x66, 0x7f, 0x95, 0xde, 0x1a, 0x64, 0xdf, 0xe1, 0x3a, 0xeb, 0xed, + 0xaf, 0x07, 0x3f, 0x39, 0x7f, 0xcb, 0x67, 0x50, 0x33, 0xb3, 0xe0, 0x30, + 0xd7, 0xbc, 0xde, 0x2c, 0xb4, 0x32, 0x33, 0xbc, 0x1a, 0x55, 0x38, 0x06, + 0x05, 0x65, 0xdf, 0x7c, 0x68, 0x10, 0x30, 0x54, 0xbc, 0x14, 0x14, 0x92, + 0x21, 0x2a, 0x74, 0xd3, 0xe9, 0x32, 0x45, 0xca, 0xbc, 0x4a, 0x54, 0xb9, + 0x47, 0x5e, 0x1c, 0x86, 0xd1, 0x4e, 0xcb, 0x46, 0x0e, 0xc8, 0xce, 0xb7, + 0x66, 0x59, 0x8f, 0x06, 0x4c, 0xee, 0xe1, 0x2f, 0x5b, 0x5d, 0x34, 0x0b, + 0xfb, 0xa8, 0x9f, 0xa8, 0x6b, 0x7d, 0x43, 0xa6, 0x01, 0x78, 0x2d, 0xc6, + 0xc9, 0x03, 0x6e, 0xc9, 0x60, 0x59, 0xb7, 0x0f, 0x4b, 0xce, 0x17, 0x04, + 0xa3, 0x76, 0x0d, 0x2e, 0x57, 0xad, 0x32, 0xb0, 0xc7, 0xff, 0x1a, 0x32, + 0xc6, 0x7c, 0x42, 0xc5, 0x55, 0xc6, 0xf5, 0x77, 0x55, 0xcb, 0xac, 0x8c, + 0xdd, 0x62, 0x8d, 0x9c, 0x7e, 0xe7, 0x4f, 0xe0, 0x0f, 0x0d, 0xdc, 0x68, + 0xab, 0x2b, 0x00, 0x84, 0xff, 0xea, 0xa3, 0x01, 0x95, 0xdb, 0x89, 0x24, + 0xa7, 0xbb, 0x0d, 0x0f, 0x10, 0x0e, 0x83, 0x4c, 0x78, 0xf0, 0x41, 0xde, + 0x27, 0x9a, 0x22, 0x7a, 0x4b, 0xe5, 0x24, 0x5e, 0x0e, 0xb3, 0x38, 0x4d, + 0x60, 0x9f, 0x1b, 0x98, 0x71, 0xac, 0x84, 0x04, 0x13, 0x03, 0x30, 0x89, + 0xc7, 0xb9, 0x1e, 0x7d, 0xb5, 0x76, 0xe0, 0xb7, 0x00, 0xad, 0xc6, 0x90, + 0x7c, 0xa3, 0xc5, 0xd0, 0x4a, 0x3d, 0x1d, 0xad, 0x3f, 0xc2, 0xc5, 0x81, + 0x4d, 0x3a, 0x17, 0x39, 0xca, 0xbc, 0xa2, 0xd0, 0x90, 0x22, 0xd9, 0x25, + 0x80, 0xc5, 0xcf, 0x5d, 0xf7, 0x35, 0x04, 0xe5, 0x07, 0x2b, 0x35, 0xf2, + 0xbd, 0x18, 0xa3, 0xce, 0x2c, 0xbb, 0xfd, 0x58, 0xdf, 0xef, 0x77, 0x55, + 0x49, 0x8e, 0xde, 0xc2, 0x4b, 0x2b, 0x49, 0x5d, 0xfa, 0x6a, 0xaa, 0xe8, + 0x99, 0x0c, 0x44, 0xbd, 0x65, 0xf4, 0xc9, 0x3e, 0x10, 0x1a, 0x25, 0x1d, + 0xc5, 0xee, 0x9d, 0x52, 0x8c, 0xe7, 0x0d, 0x4a, 0x9f, 0x7b, 0x8c, 0x21, + 0x2f, 0xe1, 0xbb, 0x74, 0xa4, 0x43, 0x6b, 0x23, 0x3f, 0xdf, 0x48, 0x3c, + 0x96, 0x4c, 0x49, 0xe0, 0x07, 0x42, 0x9e, 0x2c, 0x45, 0xec, 0x54, 0x42, + 0xb2, 0x67, 0x78, 0xc4, 0x92, 0xe3, 0xf0, 0xaf, 0xc7, 0xd5, 0xb3, 0x44, + 0x61, 0xf5, 0x47, 0x9e, 0xed, 0xc6, 0xfc, 0xea, 0x26, 0xf1, 0xcb, 0x7f, + 0x76, 0x73, 0x8c, 0xdc, 0x0a, 0x06, 0xf3, 0x02, 0x7f, 0x2e, 0x02, 0xdb, + 0x1f, 0xcf, 0xc5, 0x5c, 0xb3, 0x94, 0xf2, 0xb0, 0xfd, 0xbc, 0x71, 0xaf, + 0xa2, 0xfe, 0x6d, 0xc5, 0x8d, 0xf6, 0x99, 0xc9, 0x95, 0xaa, 0x00, 0xd4, + 0x63, 0x7b, 0xb2, 0x4c, 0xc9, 0xd4, 0xb6, 0x7b, 0xef, 0x97, 0xb1, 0x67, + 0x47, 0x4b, 0x25, 0x9e, 0x53, 0xee, 0x0c, 0x97, 0x48, 0x31, 0x14, 0xbd, + 0x74, 0x14, 0x2a, 0x4e, 0xed, 0x9c, 0xe3, 0x3f, 0xf8, 0x28, 0xcb, 0x9f, + 0x27, 0x08, 0x1b, 0xba, 0xf0, 0xf4, 0x95, 0x52, 0xf9, 0x33, 0xd2, 0x1a, + 0x64, 0x55, 0x7d, 0x21, 0x9e, 0x91, 0x1f, 0x4e, 0xb2, 0x6d, 0x65, 0x32, + 0xb3, 0xe8, 0x2a, 0xd0, 0x7c, 0x19, 0x6d, 0xc3, 0xfc, 0xee, 0x6f, 0x0b, + 0x00, 0xeb, 0xd8, 0x8b, 0xce, 0x0b, 0x24, 0xd5, 0xe8, 0x68, 0x68, 0xeb, + 0xae, 0xf5, 0xee, 0x35, 0xb5, 0xcc, 0xf9, 0x6b, 0xa2, 0x9a, 0x86, 0xf9, + 0xd9, 0xb0, 0x04, 0x0d, 0xc5, 0x7c, 0x90, 0x55, 0x20, 0x8f, 0x53, 0xc3, + 0x28, 0x3e, 0x79, 0xb1, 0xab, 0xab, 0x32, 0x11, 0x8a, 0xa8, 0x76, 0x9a, + 0x31, 0xd3, 0xee, 0x7b, 0xcc, 0xf9, 0x87, 0xfa, 0xd0, 0xdb, 0x05, 0x02, + 0x9a, 0x0c, 0xe6, 0xc2, 0xfb, 0xb9, 0x7b, 0x82, 0x98, 0x14, 0xad, 0x3f, + 0x3b, 0x92, 0x97, 0xf8, 0x2f, 0xd9, 0xc4, 0xe8, 0xb7, 0x27, 0xa1, 0x84, + 0x83, 0x5d, 0xae, 0x6d, 0x6d, 0x45, 0x03, 0x3b, 0x5b, 0x1a, 0xbf, 0x40, + 0x2e, 0x01, 0x59, 0x46, 0xba, 0x5f, 0x66, 0xb6, 0x6c, 0x89, 0xd7, 0x65, + 0x1b, 0x16, 0x4f, 0xb3, 0x01, 0x83, 0xeb, 0xfa, 0x1a, 0x24, 0xdd, 0x61, + 0xf3, 0x25, 0xb7, 0x3a, 0x15, 0x26, 0xe3, 0x1a, 0x66, 0x1a, 0x50, 0x6e, + 0x72, 0xfe, 0xd9, 0xa1, 0xa0, 0x54, 0x93, 0xb1, 0x7f, 0xce, 0x66, 0xbf, + 0x56, 0x36, 0x95, 0x22, 0xe1, 0x3a, 0x29, 0x03, 0x40, 0x52, 0xb5, 0x2f, + 0x8a, 0x15, 0x54, 0xc5, 0xf2, 0x40, 0xa6, 0x80, 0x72, 0x26, 0x3c, 0xd9, + 0xd7, 0xbe, 0xe6, 0x7d, 0x60, 0xa1, 0xc3, 0x1c, 0x24, 0xa5, 0xd4, 0xf9, + 0xf8, 0xd7, 0x23, 0x3f, 0x16, 0x97, 0xa1, 0x31, 0x16, 0xd6, 0x04, 0xbc, + 0x66, 0x2c, 0x84, 0xf0, 0xdb, 0x6f, 0x0b, 0x80, 0xf4, 0x35, 0x35, 0xd3, + 0xb8, 0x25, 0x4c, 0xa7, 0x68, 0x7e, 0xfe, 0x08, 0xc5, 0x9b, 0x3a, 0xc9, + 0xd0, 0xab, 0x77, 0xc9, 0x13, 0xce, 0xc9, 0xc9, 0xac, 0x5b, 0x8b, 0xd1, + 0x41, 0xaf, 0x11, 0x52, 0x60, 0x44, 0x15, 0x7d, 0xcf, 0x7c, 0xe3, 0xed, + 0x24, 0x64, 0xd6, 0xae, 0x82, 0x8a, 0xb5, 0x8f, 0xbf, 0x01, 0x53, 0xc6, + 0xa5, 0xe5, 0x36, 0x8a, 0x39, 0x44, 0x6e, 0xe6, 0x28, 0x44, 0x55, 0x3a, + 0x40, 0x4e, 0xff, 0xa6, 0x24, 0x48, 0x8f, 0xa0, 0xa9, 0xdc, 0x5d, 0x51, + 0xcf, 0x49, 0x5c, 0xec, 0xd0, 0x5b, 0x56, 0xcf, 0x66, 0xe7, 0xe5, 0xa9, + 0xde, 0x65, 0xc5, 0xd5, 0x3e, 0x70, 0xe6, 0xb2, 0xf6, 0x95, 0x02, 0xcb, + 0x4e, 0x29, 0xd7, 0x86, 0x42, 0x29, 0x80, 0x5c, 0x8e, 0xc6, 0x5e, 0xbd, + 0x20, 0xf2, 0x07, 0xeb, 0xfa, 0x64, 0xa5, 0x25, 0x1a, 0xc8, 0x52, 0xab, + 0xc9, 0x8f, 0x78, 0x3b, 0xc6, 0x8f, 0x58, 0xcf, 0xcc, 0xbe, 0x5e, 0xed, + 0xbe, 0xaa, 0xf2, 0xf7, 0x01, 0x34, 0x5a, 0x5e, 0x53, 0x52, 0x78, 0x86, + 0x4a, 0x05, 0x07, 0xd7, 0xce, 0x7d, 0x53, 0x24, 0x79, 0x16, 0xcb, 0x70, + 0xad, 0xe6, 0x09, 0x1e, 0x2a, 0x8b, 0x60, 0xde, 0x72, 0xe3, 0xd5, 0x06, + 0x27, 0x15, 0xd2, 0x88, 0x39, 0xf7, 0xab, 0xf6, 0x20, 0xaf, 0xa7, 0x45, + 0x4b, 0x7a, 0x4c, 0x58, 0xfb, 0xe0, 0x91, 0xf7, 0x8d, 0x95, 0x97, 0x7f, + 0xf9, 0xbf, 0xeb, 0x1d, 0x6d, 0xc1, 0x15, 0x3c, 0x17, 0xbf, 0x84, 0x5c, + 0xcb, 0x83, 0x22, 0x73, 0x97, 0x34, 0x79, 0x12, 0xf2, 0xbb, 0x5f, 0x3b, + 0xca, 0x90, 0x1c, 0x8f, 0x35, 0xb6, 0xd4, 0x7b, 0xca, 0x28, 0xcf, 0x11, + 0xce, 0x72, 0x08, 0xb0, 0x3b, 0x07, 0x46, 0x0d, 0xcd, 0x2f, 0xae, 0xf1, + 0x6f, 0x8e, 0xc1, 0xbc, 0xe0, 0x61, 0xc8, 0xc3, 0x91, 0xf1, 0xe3, 0x28, + 0x93, 0xb9, 0x4a, 0x88, 0xac, 0xa6, 0x6b, 0x63, 0x62, 0x80, 0x11, 0xe9, + 0x49, 0x04, 0xac, 0xb9, 0x77, 0x92, 0x3d, 0xf2, 0xf6, 0x92, 0x4d, 0xc7, + 0x3c, 0xc9, 0xa9, 0x96, 0x54, 0xbc, 0x6a, 0x9c, 0x1c, 0x8e, 0x5b, 0x20, + 0x50, 0x5a, 0x34, 0xe0, 0x60, 0x95, 0x95, 0x8d, 0x2f, 0x2a, 0x57, 0xb9, + 0x03, 0x7a, 0xb7, 0x31, 0x64, 0x7c, 0x5a, 0x49, 0x77, 0xe8, 0x72, 0x1b, + 0xd8, 0x36, 0x87, 0xc1, 0x44, 0xfd, 0x56, 0x97, 0x1a, 0xa9, 0x24, 0xb3, + 0x05, 0x31, 0x97, 0x52, 0xc5, 0x97, 0xf7, 0x05, 0xce, 0xc5, 0x6d, 0x4a, + 0xcb, 0x6d, 0xbe, 0x8a, 0x45, 0x26, 0x5c, 0x94, 0x05, 0xdd, 0x43, 0x23, + 0x95, 0xe7, 0xf3, 0x93, 0x25, 0x74, 0x71, 0xb1, 0x0d, 0x93, 0xa4, 0x88, + 0x00, 0x4f, 0xee, 0x86, 0x67, 0x3e, 0x76, 0xd6, 0xa7, 0xb1, 0xe2, 0x2b, + 0xe2, 0x3d, 0x11, 0x6b, 0x14, 0x23, 0xb3, 0xb8, 0x4e, 0x1a, 0x9e, 0x4b, + 0xbc, 0x3a, 0x66, 0x12, 0xc9, 0xaa, 0x18, 0x91, 0x24, 0xac, 0x26, 0x2d, + 0x8c, 0x50, 0x46, 0x4a, 0xfd, 0xdc, 0x03, 0x41, 0x3e, 0xd8, 0xfd, 0x78, + 0x1a, 0x30, 0xb7, 0x91, 0x48, 0x12, 0xe7, 0xe8, 0x77, 0x2e, 0xdc, 0xfd, + 0xbc, 0x46, 0x64, 0xa8, 0x5a, 0x4e, 0x94, 0x9b, 0xba, 0xb8, 0x66, 0x92, + 0x5e, 0x8b, 0x5e, 0x7f, 0x1d, 0xa7, 0x3d, 0x2c, 0x06, 0xbc, 0xd2, 0xde, + 0x64, 0x13, 0x2f, 0x71, 0x9f, 0xf2, 0x7a, 0x1e, 0xc4, 0xfa, 0xcc, 0x4f, + 0x67, 0xb2, 0xa2, 0x45, 0x28, 0x2c, 0xa3, 0xbf, 0x4a, 0xdd, 0xa3, 0xf3, + 0x5a, 0xe7, 0xee, 0x07, 0x9c, 0x5d, 0x96, 0xbd, 0x5e, 0x3f, 0xb8, 0xd2, + 0xba, 0x29, 0xe7, 0x56, 0x96, 0xee, 0x34, 0xd1, 0x74, 0x46, 0x33, 0x3f, + 0xbc, 0xd6, 0x43, 0x17, 0xb9, 0x19, 0x46, 0x6a, 0xf6, 0xe3, 0x2b, 0xb7, + 0xf2, 0xec, 0xd3, 0x1b, 0x13, 0xaa, 0xd6, 0xb3, 0x99, 0xfa, 0xc5, 0x6a, + 0xb0, 0xa7, 0xd7, 0x0b, 0x40, 0x13, 0xd3, 0x87, 0x3f, 0xdd, 0x4c, 0x7f, + 0xbb, 0x90, 0xad, 0x84, 0xae, 0x20, 0x1c, 0x89, 0x8b, 0x4b, 0x02, 0xa4, + 0x33, 0x81, 0xc7, 0x12, 0x3b, 0x51, 0x0c, 0xb4, 0x2d, 0xce, 0xf7, 0xaa, + 0xc5, 0x51, 0x84, 0xe5, 0xcd, 0x96, 0xa2, 0xbf, 0x0d, 0x84, 0x40, 0xfe, + 0x03, 0xec, 0x54, 0x1a, 0x9c, 0x25, 0x30, 0x47, 0xf4, 0xa1, 0x74, 0x43, + 0xcf, 0x50, 0x55, 0x7b, 0x41, 0x91, 0x1f, 0x51, 0xd8, 0xd0, 0xbb, 0xca, + 0xa3, 0x75, 0x41, 0xc5, 0x4d, 0xc1, 0x54, 0x7c, 0x99, 0xef, 0x87, 0xa6, + 0x27, 0xa6, 0x08, 0xab, 0x75, 0xfc, 0xdb, 0xbc, 0xd2, 0xaf, 0x18, 0x4d, + 0x23, 0x03, 0x6f, 0x56, 0x4d, 0x59, 0x2e, 0x3b, 0x6c, 0xd4, 0x07, 0xd0, + 0xc5, 0x33, 0xab, 0x26, 0x3b, 0xe8, 0xdb, 0xa1, 0x77, 0xa3, 0x3e, 0xed, + 0x75, 0xab, 0xa5, 0x3b, 0x7d, 0x80, 0x72, 0x52, 0x36, 0x1c, 0x21, 0xb2, + 0x87, 0x97, 0x3e, 0x16, 0x2b, 0xf2, 0xea, 0xaa, 0x56, 0xc4, 0x19, 0x7c, + 0xdf, 0x59, 0xed, 0x2f, 0x9b, 0xc9, 0x24, 0x9e, 0xd0, 0xf4, 0xf0, 0xb3, + 0x45, 0x57, 0x3f, 0xae, 0x67, 0xa6, 0x7a, 0x28, 0x8f, 0xdf, 0x5d, 0x54, + 0x23, 0x4a, 0x5e, 0xd8, 0x5b, 0xcb, 0x4a, 0xb3, 0x23, 0x65, 0x9a, 0x2b, + 0x2f, 0xa0, 0xe5, 0x99, 0x82, 0xb0, 0x36, 0xf1, 0x47, 0xbf, 0xc0, 0x58, + 0xc6, 0xdc, 0xba, 0x02, 0x88, 0x0c, 0xfe, 0xa9, 0x80, 0x58, 0xc7, 0x0c, + 0xa8, 0x7e, 0x17, 0x2f, 0xdc, 0x74, 0xf3, 0xae, 0x0b, 0x1b, 0x5f, 0xbe, + 0x9d, 0x60, 0x6a, 0xbd, 0x90, 0xb8, 0x44, 0x4d, 0x66, 0x6c, 0xc7, 0x93, + 0xc3, 0x98, 0xba, 0xaf, 0x2d, 0x8d, 0x63, 0x31, 0x71, 0xbf, 0x5d, 0x6e, + 0x65, 0xe1, 0x2b, 0x2c, 0x5a, 0x8b, 0x10, 0xdf, 0x0b, 0x15, 0xca, 0x20, + 0xdf, 0x17, 0x4d, 0x3b, 0xf8, 0x84, 0x47, 0xf5, 0xe8, 0x91, 0x0c, 0x90, + 0xd0, 0xb4, 0x51, 0x59, 0xa8, 0xcc, 0xb2, 0xf6, 0x17, 0x05, 0x9a, 0x26, + 0xef, 0xe4, 0x5c, 0x00, 0x08, 0x96, 0xc9, 0x7e, 0x9d, 0x81, 0x61, 0x68, + 0x77, 0xa8, 0x8e, 0x0e, 0xc4, 0xfe, 0xe0, 0xe0, 0x4f, 0xfc, 0xf2, 0xf9, + 0xf7, 0x86, 0x29, 0xbb, 0xcb, 0x0c, 0x86, 0x99, 0x59, 0xb7, 0x3f, 0x19, + 0x8e, 0x0c, 0x62, 0xad, 0x5f, 0x1f, 0xfb, 0x0a, 0x1e, 0x4a, 0xcf, 0xf0, + 0xbc, 0x59, 0x85, 0xf6, 0x66, 0x2e, 0xef, 0x49, 0x98, 0xe4, 0x69, 0xc6, + 0xa3, 0x12, 0x22, 0x21, 0xb6, 0x50, 0x68, 0x1d, 0x6b, 0x18, 0xb3, 0x2a, + 0x84, 0x54, 0x3f, 0x60, 0x2d, 0x19, 0x84, 0xf9, 0xa6, 0xd4, 0x93, 0xda, + 0x10, 0x94, 0x62, 0xaa, 0x94, 0x92, 0x6b, 0xbb, 0xfb, 0x8d, 0x54, 0x91, + 0xfa, 0x6f, 0x07, 0x74, 0xde, 0x11, 0xba, 0x7c, 0x61, 0x1b, 0xe3, 0xdb, + 0x44, 0x5e, 0x26, 0xb7, 0x8e, 0x87, 0xdd, 0xb6, 0x85, 0xa9, 0xa4, 0x91, + 0x39, 0xf1, 0x89, 0x4e, 0xee, 0xc2, 0x16, 0x4a, 0x03, 0x84, 0xdf, 0x75, + 0x97, 0x56, 0x97, 0x3b, 0x6d, 0x01, 0xcd, 0x0d, 0x69, 0x8d, 0xed, 0xdf, + 0x49, 0x27, 0xdf, 0xcc, 0x05, 0x18, 0xe0, 0xa0, 0xed, 0xe4, 0x38, 0xb0, + 0xfa, 0x98, 0x9f, 0xf0, 0x9d, 0x36, 0x17, 0xef, 0xd1, 0xd8, 0xd8, 0x84, + 0xac, 0xd8, 0x96, 0x09, 0x2d, 0x59, 0x46, 0x76, 0x25, 0xe1, 0x3c, 0xb0, + 0x37, 0x7b, 0xe7, 0xa9, 0xf9, 0x8e, 0xab, 0x16, 0x5a, 0xe0, 0x42, 0xa1, + 0xea, 0x3a, 0xc7, 0xb6, 0x8c, 0x80, 0xd2, 0xc8, 0x88, 0x46, 0x95, 0x9c, + 0xa5, 0x08, 0x49, 0xfc, 0xe0, 0x6a, 0xc9, 0x6a, 0xac, 0x4c, 0xd9, 0xcb, + 0x10, 0xa8, 0x2c, 0x84, 0x2d, 0xd3, 0x6b, 0x87, 0xf1, 0xe4, 0x67, 0xe7, + 0x26, 0xa7, 0x1b, 0x05, 0xf7, 0xbb, 0x06, 0x2e, 0x03, 0x38, 0xc0, 0x04, + 0xa4, 0x3c, 0xac, 0x20, 0xfc, 0x98, 0xfb, 0xf9, 0xef, 0x24, 0x43, 0xdb, + 0x6e, 0x45, 0xfc, 0xc7, 0x60, 0x50, 0x7f, 0x42, 0xab, 0x57, 0xf0, 0x4e, + 0xfb, 0x6b, 0xc5, 0x19, 0xa1, 0x97, 0x4f, 0x52, 0x6c, 0x6e, 0x63, 0x61, + 0xf9, 0x98, 0x5b, 0xda, 0x63, 0x73, 0x6e, 0x79, 0x32, 0x1e, 0x0f, 0xb9, + 0x8c, 0x03, 0x06, 0x0e, 0x0f, 0xbb, 0xbd, 0x97, 0xff, 0x9a, 0x52, 0xf9, + 0x88, 0x86, 0xcf, 0xdb, 0x79, 0xc8, 0x38, 0xe8, 0xdc, 0x1b, 0xb2, 0x80, + 0xe9, 0x69, 0x57, 0x9e, 0xe3, 0x1d, 0x30, 0x7a, 0x1f, 0xc7, 0x56, 0x22, + 0x32, 0x69, 0xb6, 0xb3, 0xe9, 0x58, 0x47, 0xbd, 0x39, 0x7f, 0xc2, 0x2e, + 0x21, 0xa6, 0x41, 0x9b, 0xf8, 0xbd, 0xe9, 0x37, 0x26, 0xd0, 0x24, 0x63, + 0x99, 0xf0, 0xa0, 0x96, 0x92, 0x72, 0x43, 0x5b, 0xe2, 0x50, 0xbc, 0xdb, + 0x4a, 0xa1, 0x87, 0x64, 0xca, 0x29, 0xba, 0x34, 0xf1, 0x6a, 0x7a, 0x42, + 0xf1, 0xfc, 0x4d, 0x5e, 0x29, 0xd2, 0x8f, 0x3b, 0x48, 0x10, 0x97, 0xb5, + 0xf6, 0x2f, 0x1a, 0xfb, 0x6d, 0x28, 0x7c, 0x70, 0x96, 0x7f, 0x94, 0x16, + 0xa5, 0x5d, 0x87, 0xac, 0xc1, 0xa1, 0xd8, 0x28, 0x2f, 0x5a, 0xcf, 0xbd, + 0x70, 0x0c, 0x58, 0xce, 0x75, 0x4d, 0x0f, 0x0c, 0xce, 0xb7, 0x69, 0xce, + 0xaa, 0x71, 0x68, 0x70, 0x10, 0xbd, 0x74, 0xe1, 0x12, 0xb2, 0x09, 0xb2, + 0x8b, 0xe0, 0xcb, 0xd2, 0x81, 0x3a, 0xd3, 0x39, 0xcb, 0x9b, 0xc2, 0xba, + 0xf9, 0xfb, 0xf8, 0xb5, 0x8c, 0xb4, 0x56, 0x0e, 0xa8, 0x8a, 0x10, 0x8d, + 0x61, 0x68, 0x4c, 0x80, 0xe4, 0x99, 0x16, 0x14, 0xc0, 0x19, 0x32, 0x61, + 0xa2, 0xf9, 0x6d, 0xae, 0x33, 0x09, 0xb9, 0x16, 0xc4, 0x80, 0xc7, 0xc8, + 0x20, 0xbb, 0xec, 0xe8, 0xcb, 0xcd, 0xe0, 0xc9, 0x5f, 0x71, 0x04, 0xfd, + 0x15, 0x07, 0x26, 0xbd, 0x39, 0x31, 0x4a, 0x0d, 0xeb, 0x23, 0xcd, 0x5a, + 0x5f, 0x46, 0x41, 0xa6, 0xa6, 0x81, 0xd3, 0x0a, 0x2b, 0x90, 0x82, 0xd0, + 0x62, 0xb3, 0xda, 0x5a, 0x4c, 0x2d, 0x78, 0x43, 0xc7, 0x27, 0x37, 0xcc, + 0x30, 0x5f, 0x09, 0xd5, 0xef, 0xab, 0xfc, 0x7a, 0x86, 0xcb, 0x18, 0xbf, + 0x5f, 0xf2, 0xa5, 0x8c, 0xb6, 0xfe, 0xfc, 0xec, 0x54, 0x49, 0x8d, 0x6b, + 0xcb, 0xe5, 0xf4, 0x03, 0x99, 0x43, 0x9d, 0x0c, 0x67, 0x3b, 0x7d, 0x16, + 0x04, 0xf6, 0x88, 0x9a, 0xd5, 0xe3, 0xd2, 0x08, 0xc1, 0xf1, 0xe7, 0x87, + 0x96, 0x36, 0x9f, 0x69, 0xd8, 0x50, 0x85, 0xca, 0x8e, 0x54, 0xbd, 0x4c, + 0x76, 0xf0, 0xf9, 0x96, 0x94, 0xcf, 0xee, 0x16, 0x28, 0x9c, 0x99, 0x4b, + 0x57, 0xe0, 0x68, 0xaf, 0xb8, 0xf7, 0x65, 0x42, 0x9a, 0x7d, 0x4b, 0xaa, + 0xb9, 0xf3, 0xa1, 0xc1, 0x24, 0xdf, 0xc7, 0xae, 0xb7, 0xc3, 0x0f, 0x5e, + 0xf1, 0xf9, 0xf5, 0xd3, 0x3e, 0x7c, 0x48, 0x2c, 0xe1, 0xdf, 0xce, 0x2d, + 0x7f, 0xd3, 0x5f, 0xff, 0xc3, 0x6a, 0x71, 0xfe, 0xab, 0xf8, 0x30, 0xb6, + 0x4c, 0xd7, 0x23, 0x3b, 0x07, 0xf1, 0x2d, 0x68, 0xca, 0xbd, 0x8f, 0xbb, + 0xef, 0x26, 0x53, 0x90, 0xf3, 0x66, 0x8c, 0xe2, 0x4e, 0x87, 0x0f, 0x9a, + 0x6d, 0xed, 0x2f, 0xc9, 0x8a, 0x97, 0x54, 0x4e, 0xcf, 0x7d, 0x4c, 0x1b, + 0x1c, 0x19, 0x8e, 0xd0, 0x0f, 0xe3, 0x88, 0x03, 0x34, 0x7a, 0xca, 0x0e, + 0x98, 0x32, 0x56, 0xe0, 0xa3, 0xe8, 0xc0, 0xc6, 0xef, 0x10, 0x81, 0xce, + 0xf6, 0xe2, 0xbc, 0x60, 0xab, 0x25, 0xc3, 0x73, 0x65, 0xe1, 0x70, 0xcc, + 0xf6, 0x16, 0xf8, 0x5a, 0xd3, 0x47, 0x42, 0x3a, 0xb6, 0x1c, 0xd9, 0x17, + 0xc4, 0x51, 0x46, 0xac, 0x8f, 0x16, 0x1b, 0x70, 0x0d, 0xd0, 0xc0, 0x34, + 0xde, 0xc4, 0xac, 0x1e, 0xad, 0x9b, 0x28, 0x84, 0x91, 0xcb, 0x56, 0x9f, + 0x99, 0xe1, 0xef, 0xf2, 0xad, 0x5e, 0x9b, 0xd5, 0x36, 0x65, 0x54, 0x0f, + 0x85, 0x67, 0xd7, 0x9f, 0x9f, 0xae, 0xa6, 0xce, 0xa2, 0x8d, 0xe1, 0xd4, + 0xc9, 0xd9, 0xd5, 0xe1, 0xaf, 0xf6, 0x45, 0x86, 0x1b, 0x98, 0xb6, 0x7c, + 0xb5, 0xbe, 0x32, 0x81, 0x0b, 0x51, 0x4f, 0x58, 0x69, 0x1b, 0x23, 0x2f, + 0xfa, 0x91, 0x47, 0x12, 0x89, 0x0a, 0x14, 0x47, 0x62, 0xd2, 0x54, 0x44, + 0x75, 0x4f, 0x11, 0xbe, 0x0e, 0xb8, 0x63, 0x35, 0x34, 0xeb, 0x88, 0xaf, + 0x07, 0x9f, 0x20, 0xe9, 0xd8, 0x41, 0x49, 0x66, 0xd8, 0x7d, 0x4d, 0x08, + 0xfc, 0xde, 0x93, 0x23, 0x52, 0xd7, 0xa9, 0x8d, 0x99, 0x5f, 0xad, 0x20, + 0xed, 0xa6, 0x4f, 0x04, 0xf0, 0x96, 0x91, 0x4d, 0x51, 0x4c, 0x85, 0xa0, + 0x49, 0xe2, 0x9e, 0xcd, 0x78, 0xaa, 0x75, 0xc7, 0xc8, 0xaf, 0xf9, 0xbc, + 0x5d, 0xb4, 0x4d, 0xe1, 0xd0, 0x51, 0x90, 0x6f, 0x06, 0xcd, 0xae, 0x41, + 0x64, 0x4d, 0x2f, 0xdd, 0x44, 0x63, 0x7d, 0xf3, 0xa1, 0x8d, 0xf7, 0xed, + 0xd2, 0x2a, 0xcb, 0x9d, 0xca, 0x32, 0x62, 0xfa, 0xc0, 0x7c, 0x7a, 0xe4, + 0x52, 0x26, 0xf7, 0x22, 0xe4, 0x8c, 0x4f, 0x3b, 0x61, 0x80, 0x8a, 0x4d, + 0xf6, 0xc7, 0x87, 0xd3, 0xa0, 0xe0, 0xd7, 0xfb, 0x44, 0x40, 0xc5, 0x91, + 0xb1, 0x2b, 0xf6, 0x57, 0x76, 0x04, 0x7c, 0xfc, 0x86, 0xcc, 0x12, 0x33, + 0x67, 0x86, 0x11, 0xdb, 0xc7, 0x80, 0x8d, 0xcf, 0x69, 0xfd, 0x2e, 0x3f, + 0x9c, 0xd3, 0x5a, 0xd5, 0xd6, 0x0b, 0xe6, 0xc6, 0x64, 0x31, 0x36, 0x34, + 0x44, 0x73, 0x93, 0xca, 0x6c, 0x84, 0xd5, 0x8a, 0x12, 0xe9, 0x5b, 0x92, + 0x1b, 0xd6, 0x51, 0x18, 0x21, 0xff, 0xfb, 0xc3, 0x85, 0xbd, 0x7e, 0x5f, + 0xfe, 0xfe, 0xd0, 0x70, 0xce, 0x59, 0xb6, 0x93, 0xe9, 0xb7, 0x67, 0xe8, + 0x86, 0x2c, 0xf1, 0x68, 0x64, 0x25, 0x16, 0xe4, 0x40, 0x10, 0xab, 0x18, + 0x8e, 0x63, 0x24, 0xe6, 0xc8, 0x36, 0xe6, 0x2d, 0x31, 0xfd, 0xd4, 0xa1, + 0xf5, 0xe4, 0xb8, 0x97, 0x6f, 0xf4, 0x91, 0x6d, 0xd8, 0x3f, 0x6f, 0xc0, + 0x40, 0x36, 0xea, 0xe5, 0x5b, 0x29, 0x1a, 0xd5, 0x50, 0x50, 0x38, 0x4f, + 0x4a, 0x6d, 0x76, 0x87, 0xe4, 0x33, 0x11, 0x4f, 0x59, 0xf9, 0x08, 0x9c, + 0x41, 0x78, 0x9a, 0x56, 0x4d, 0xf3, 0xcd, 0xe2, 0x38, 0x93, 0xf9, 0xc4, + 0x4d, 0x3b, 0xb5, 0xec, 0xf5, 0x95, 0x85, 0xf7, 0x22, 0x42, 0x70, 0xaf, + 0x29, 0xd6, 0xb6, 0x2d, 0x63, 0xb3, 0x04, 0xbf, 0x44, 0xea, 0x52, 0x77, + 0x31, 0x01, 0x87, 0xca, 0xe4, 0x1a, 0x8f, 0x56, 0xe4, 0x39, 0x7d, 0x38, + 0x69, 0xe3, 0x68, 0x23, 0xc7, 0xbe, 0xec, 0x8d, 0x8f, 0x26, 0x29, 0x0b, + 0xeb, 0x8d, 0x7a, 0x3e, 0x0d, 0x50, 0x7c, 0x06, 0xca, 0x0c, 0x01, 0x59, + 0x51, 0x23, 0x9c, 0x1a, 0xf5, 0x6b, 0x0d, 0x9f, 0x1e, 0xf0, 0x56, 0x94, + 0x11, 0x75, 0x32, 0x7f, 0xc4, 0x71, 0x4e, 0x38, 0x91, 0x22, 0x75, 0xad, + 0x4e, 0x82, 0x88, 0x39, 0xa6, 0xdb, 0x99, 0xaa, 0xd4, 0xfd, 0x78, 0x54, + 0xaa, 0x7c, 0xc3, 0xae, 0xf8, 0xf4, 0x68, 0x74, 0x65, 0x2b, 0x49, 0xa8, + 0xb1, 0x44, 0xc1, 0x70, 0x45, 0x13, 0xa2, 0x3e, 0xf9, 0x8b, 0xd9, 0x0c, + 0xc2, 0x8c, 0xa7, 0x3b, 0x57, 0x4e, 0x2c, 0x9b, 0xf7, 0x00, 0x92, 0xd3, + 0x33, 0x03, 0x7a, 0xf1, 0x3c, 0xbf, 0xe8, 0x57, 0xa1, 0x1f, 0xa3, 0x88, + 0x32, 0xf9, 0x00, 0x0b, 0xa6, 0x34, 0x08, 0x7c, 0xf5, 0xe7, 0x1e, 0x3b, + 0x9c, 0x20, 0xc8, 0xd0, 0x8c, 0x1d, 0x6e, 0x5e, 0xed, 0x6f, 0x8e, 0x3c, + 0xfe, 0xee, 0x5c, 0xa8, 0x58, 0xfa, 0x28, 0xfd, 0x1f, 0x6d, 0xfb, 0x31, + 0x08, 0xc6, 0xb5, 0x55, 0x6d, 0x84, 0x39, 0x50, 0x12, 0x0d, 0x17, 0x26, + 0xa8, 0x5b, 0xe5, 0xac, 0x17, 0x71, 0x28, 0x9c, 0xdf, 0x21, 0x8e, 0xd9, + 0x4c, 0xef, 0x05, 0xa2, 0xf7, 0xb9, 0x02, 0x39, 0x85, 0x58, 0x29, 0x44, + 0xae, 0x45, 0xed, 0xcb, 0x90, 0x62, 0xe3, 0xb1, 0x7f, 0x80, 0xd6, 0x7c, + 0xa7, 0x5b, 0x93, 0xe5, 0xd5, 0xd5, 0xd7, 0xd5, 0x6f, 0x02, 0xd4, 0xa8, + 0x1e, 0xc1, 0x34, 0xdd, 0x1c, 0x6f, 0x26, 0xae, 0x85, 0xe4, 0x2a, 0x70, + 0x67, 0x43, 0xce, 0x54, 0x5e, 0xcb, 0x92, 0x59, 0x98, 0xb5, 0x6f, 0x14, + 0x01, 0x63, 0x7f, 0x52, 0xa4, 0xc7, 0x1b, 0x63, 0x22, 0xc1, 0xd7, 0x59, + 0x4e, 0xbc, 0x89, 0x0e, 0x10, 0xa4, 0x55, 0xfd, 0xb5, 0x0d, 0xe5, 0x62, + 0x3b, 0x2a, 0x4f, 0x7f, 0x05, 0x8f, 0xcc, 0xa5, 0xd7, 0xda, 0x27, 0xbd, + 0xca, 0xc9, 0x06, 0xac, 0xa0, 0xef, 0xe7, 0x0e, 0x23, 0xd2, 0xb4, 0xd2, + 0xda, 0x6e, 0x69, 0xa2, 0x57, 0x7f, 0x26, 0x5c, 0xac, 0xda, 0x86, 0x17, + 0x87, 0x0d, 0x06, 0x8a, 0xc8, 0xe4, 0xf9, 0x9a, 0xd4, 0x79, 0xab, 0x2b, + 0x2a, 0x2a, 0x27, 0xf6, 0x1b, 0x16, 0x80, 0x99, 0x43, 0x5f, 0x6e, 0x9c, + 0xd2, 0xb7, 0xf5, 0x88, 0x3f, 0x99, 0x71, 0x6a, 0xbc, 0xfe, 0x18, 0xb8, + 0x71, 0x28, 0xb1, 0xbc, 0xb6, 0x41, 0x41, 0xcb, 0xbf, 0x94, 0x2d, 0x1f, + 0x96, 0xdc, 0x09, 0x2a, 0xd6, 0xf2, 0xc7, 0xbc, 0x29, 0x42, 0x1c, 0x4f, + 0x85, 0xc9, 0xbd, 0x4b, 0xf3, 0x28, 0x94, 0x33, 0x53, 0x27, 0x03, 0x49, + 0xbf, 0xfd, 0x08, 0x3f, 0xb5, 0x3f, 0x95, 0xc4, 0xff, 0xcd, 0xb1, 0xf5, + 0xe9, 0x51, 0x49, 0xd1, 0xa4, 0x9f, 0xa3, 0x12, 0x89, 0x95, 0x41, 0xe6, + 0x14, 0x6e, 0x1e, 0xa7, 0xc8, 0x5f, 0x28, 0xd9, 0x75, 0xc4, 0x96, 0x82, + 0x51, 0x11, 0x5b, 0x50, 0x96, 0xde, 0xce, 0x7a, 0xb8, 0x88, 0x63, 0xc6, + 0x89, 0x0e, 0x75, 0xb7, 0x11, 0xd2, 0x3a, 0x19, 0xbc, 0x48, 0x7e, 0x9e, + 0x67, 0xf9, 0xb2, 0xb8, 0x08, 0xc7, 0x23, 0x8c, 0xd6, 0x96, 0xa8, 0x92, + 0x2c, 0xaf, 0x5b, 0x12, 0x9f, 0x60, 0xe6, 0x56, 0x2d, 0xdf, 0xe8, 0x77, + 0xf2, 0xae, 0xb2, 0x8e, 0x2a, 0x8f, 0x76, 0xb0, 0x2e, 0xf2, 0x25, 0x76, + 0x45, 0x58, 0x1d, 0x94, 0x03, 0xfd, 0xd6, 0x1c, 0xed, 0xf2, 0x24, 0x4d, + 0xee, 0xe5, 0xc1, 0xb7, 0x2e, 0x55, 0xb9, 0x66, 0xd6, 0xad, 0xd7, 0x82, + 0x17, 0x8b, 0xd4, 0x4a, 0x6b, 0xc1, 0x60, 0xa4, 0x5c, 0xc0, 0x3b, 0x63, + 0xaa, 0x99, 0x07, 0xc6, 0xc3, 0x58, 0xbb, 0xcd, 0x57, 0xcf, 0xb1, 0xbc, + 0x55, 0xa0, 0xae, 0x35, 0x14, 0xe7, 0x01, 0x35, 0x9e, 0xd2, 0xa5, 0x13, + 0x25, 0x42, 0x96, 0x32, 0x97, 0x80, 0x34, 0xf5, 0x3e, 0x8c, 0xc3, 0x04, + 0xd4, 0x2e, 0x76, 0x75, 0xbb, 0x70, 0x09, 0xd1, 0x4e, 0x0d, 0xe1, 0x42, + 0xbc, 0xb9, 0x1d, 0x3e, 0x9e, 0x46, 0x10, 0xe8, 0x0f, 0xb4, 0x85, 0xa1, + 0x4f, 0xd7, 0xa7, 0x28, 0x2a, 0xfc, 0x30, 0xaf, 0xf0, 0x69, 0x4b, 0xeb, + 0x59, 0x5b, 0x5f, 0x77, 0xdf, 0xd8, 0x63, 0x4a, 0xbc, 0xf4, 0x63, 0xdf, + 0x18, 0xab, 0xaf, 0x10, 0xc2, 0xdc, 0x82, 0x97, 0xb2, 0x8d, 0xe6, 0xc1, + 0xd7, 0xa0, 0x89, 0x4d, 0xea, 0xbc, 0x19, 0x63, 0x8f, 0x48, 0xd4, 0xe1, + 0x4c, 0x6c, 0x91, 0x03, 0xcd, 0xbc, 0x64, 0x1d, 0x96, 0xed, 0xa1, 0xfa, + 0x3d, 0x78, 0x4d, 0x01, 0xf1, 0x20, 0x8e, 0x93, 0x12, 0x2a, 0x54, 0xd7, + 0x08, 0xbc, 0xdb, 0x43, 0x8e, 0x21, 0x07, 0xa1, 0x51, 0x58, 0x05, 0x4b, + 0x98, 0x15, 0x93, 0xf7, 0xa0, 0xf3, 0x72, 0xb3, 0x57, 0x3f, 0xce, 0x3f, + 0xd0, 0x8a, 0x95, 0x47, 0xf6, 0xf7, 0x49, 0x22, 0x45, 0x71, 0xe9, 0x73, + 0x89, 0xcc, 0xca, 0x3f, 0x52, 0xe4, 0xe3, 0xc2, 0x49, 0x1b, 0xc3, 0xd8, + 0x99, 0xc5, 0xc0, 0x6d, 0xbf, 0x40, 0x2d, 0x01, 0x32, 0x39, 0x56, 0x1b, + 0xba, 0x66, 0xd8, 0x72, 0x1f, 0x53, 0xe6, 0xbd, 0x0d, 0x21, 0xeb, 0x48, + 0xc3, 0xb3, 0x7d, 0x21, 0x44, 0x11, 0x96, 0xc1, 0xa9, 0x53, 0x23, 0xd6, + 0x18, 0x18, 0xda, 0x9a, 0x46, 0xd5, 0x45, 0xc3, 0x43, 0xbe, 0x5a, 0xbf, + 0x2f, 0x87, 0xee, 0x4b, 0x34, 0x33, 0x8a, 0x8f, 0x91, 0x29, 0x5b, 0x11, + 0x39, 0x23, 0xd5, 0x51, 0xde, 0x7f, 0xb1, 0x3b, 0xf5, 0x1f, 0x06, 0xbc, + 0x38, 0xa3, 0x9f, 0xd5, 0x34, 0x66, 0x3f, 0x8b, 0x01, 0x66, 0x72, 0xb2, + 0x4a, 0x4f, 0xf3, 0x0c, 0x3f, 0xe0, 0x94, 0x21, 0x1d, 0xa4, 0xba, 0x6c, + 0x43, 0x36, 0x69, 0xf8, 0x98, 0x13, 0x13, 0x6f, 0x44, 0x0a, 0x97, 0x3e, + 0xe3, 0x30, 0xdd, 0xb2, 0x2f, 0xe2, 0x45, 0x2f, 0x84, 0x81, 0xfa, 0x43, + 0x0e, 0x33, 0x2d, 0x56, 0xd3, 0x4b, 0x59, 0x5b, 0x3a, 0xdb, 0x4d, 0xbb, + 0xd6, 0x95, 0x76, 0x22, 0xe9, 0x92, 0x57, 0x7a, 0x87, 0xb1, 0x9b, 0x97, + 0x5a, 0x98, 0x9f, 0xec, 0x40, 0x64, 0x13, 0xec, 0x30, 0x8c, 0x2a, 0xea, + 0x1f, 0x1a, 0x4e, 0x60, 0x2f, 0x03, 0x2f, 0x36, 0xe1, 0x06, 0x7d, 0x14, + 0x7e, 0x3e, 0x02, 0xe0, 0x55, 0x47, 0x7c, 0x4a, 0x30, 0x5d, 0x20, 0xf6, + 0x19, 0x97, 0x3e, 0xa5, 0x62, 0xbd, 0xe4, 0x24, 0x77, 0x96, 0xe4, 0xf0, + 0x2d, 0xd9, 0x88, 0x4b, 0x0a, 0xdf, 0x3f, 0x7f, 0x07, 0x7e, 0xe7, 0x80, + 0x6d, 0x3f, 0xe7, 0x2d, 0xe1, 0x1e, 0x0b, 0x04, 0xbe, 0x2e, 0x60, 0xc5, + 0x87, 0x5b, 0xa9, 0x43, 0x33, 0x8d, 0x54, 0x9b, 0x6b, 0x55, 0x15, 0x9a, + 0x0c, 0xd9, 0x42, 0x8f, 0x0d, 0x20, 0x12, 0x41, 0xe9, 0x6b, 0xd9, 0x1f, + 0xc3, 0xe5, 0x1d, 0x4d, 0xc5, 0xfa, 0x62, 0x93, 0x58, 0x8f, 0xd8, 0xbd, + 0x70, 0x8c, 0xbb, 0x43, 0x53, 0x34, 0xaa, 0xaa, 0x3a, 0x7b, 0xcd, 0x7e, + 0xa3, 0x73, 0x08, 0xe7, 0x4b, 0xdc, 0x06, 0x5a, 0xbe, 0x96, 0x6f, 0xb7, + 0x5b, 0x91, 0x78, 0xe1, 0xb3, 0xf1, 0xe0, 0x29, 0xa3, 0x52, 0x20, 0x3b, + 0xfb, 0x70, 0x2c, 0x91, 0x8c, 0x54, 0xa3, 0x55, 0x6f, 0x74, 0x08, 0x66, + 0xb7, 0x79, 0x8e, 0xc7, 0xe7, 0x6f, 0x93, 0x10, 0xdf, 0x8c, 0xbd, 0x94, + 0xe6, 0x56, 0xcd, 0x7f, 0x66, 0x83, 0x3a, 0x14, 0x0d, 0x23, 0xad, 0x34, + 0x49, 0x61, 0x97, 0xdf, 0x57, 0xc0, 0xc9, 0xbe, 0xad, 0x42, 0x0f, 0xed, + 0x0f, 0xa3, 0xdb, 0xb3, 0x54, 0xa1, 0x0f, 0x44, 0xee, 0x30, 0x1f, 0x87, + 0x6d, 0x35, 0xd3, 0x8e, 0xe2, 0xd0, 0x83, 0x09, 0x49, 0xbf, 0x2d, 0x19, + 0x93, 0x0f, 0xef, 0xc0, 0x43, 0x03, 0xe0, 0x2e, 0x89, 0x78, 0x64, 0xf9, + 0xf7, 0x64, 0xb5, 0xda, 0x24, 0x8a, 0x8f, 0xb0, 0x7d, 0x77, 0x8d, 0x73, + 0x34, 0x26, 0x4a, 0x7f, 0x59, 0x3c, 0xf5, 0x90, 0x32, 0x70, 0x83, 0x2d, + 0x7c, 0x57, 0xbc, 0xe4, 0xfb, 0x8c, 0x55, 0xbe, 0x71, 0x4f, 0xa1, 0x26, + 0x95, 0x26, 0xf6, 0xfb, 0xc2, 0x99, 0xf5, 0x78, 0x6f, 0x37, 0xac, 0xc9, + 0x8a, 0x1b, 0x62, 0x3c, 0x5c, 0xe8, 0x47, 0x8c, 0x7b, 0x65, 0xb8, 0xb1, + 0x56, 0xf1, 0x3e, 0xb4, 0xc8, 0xc1, 0xfc, 0x6a, 0xc6, 0x54, 0xce, 0xc4, + 0x27, 0x05, 0xe8, 0x71, 0x19, 0x5d, 0xe3, 0x4b, 0xdb, 0x11, 0xc6, 0x36, + 0x67, 0x6c, 0xaa, 0xad, 0xd9, 0x2d, 0xa1, 0x24, 0xfb, 0x4c, 0x34, 0x1d, + 0x80, 0x8e, 0x46, 0x6f, 0x95, 0x6d, 0xf7, 0x11, 0xa9, 0x95, 0x85, 0x35, + 0x37, 0xc1, 0x31, 0x30, 0x39, 0x48, 0x82, 0xf4, 0x9b, 0xb8, 0xb3, 0xa7, + 0x90, 0x16, 0x5e, 0xf4, 0x6b, 0x6c, 0xf4, 0xa8, 0x38, 0xa1, 0x13, 0x8f, + 0xa8, 0x1f, 0x2b, 0x3d, 0xf3, 0x08, 0x25, 0x0e, 0xe7, 0x30, 0xb4, 0x2d, + 0x40, 0x71, 0x86, 0x96, 0xce, 0xc0, 0x19, 0x6a, 0x4d, 0x58, 0x57, 0x83, + 0x8d, 0x83, 0x2d, 0x89, 0x7e, 0xbe, 0x53, 0xcb, 0xf9, 0xb6, 0xae, 0x51, + 0x57, 0x6a, 0xa4, 0x32, 0x7a, 0xf1, 0xef, 0xc2, 0x3d, 0x6f, 0xd5, 0xa8, + 0x6b, 0xec, 0xde, 0x45, 0x52, 0x22, 0xef, 0xa1, 0xd3, 0x23, 0x8f, 0xaf, + 0xd0, 0xe7, 0xcf, 0x21, 0x1b, 0x0a, 0x11, 0x68, 0x03, 0x64, 0xca, 0x02, + 0xde, 0x5e, 0xc0, 0x2f, 0xfa, 0x1d, 0x86, 0xa8, 0x9c, 0xcf, 0xe6, 0x67, + 0x76, 0x33, 0x1d, 0x5c, 0x68, 0x12, 0xeb, 0x77, 0x2c, 0x27, 0x82, 0xe3, + 0xb2, 0xb3, 0x76, 0x85, 0xf9, 0xe4, 0xea, 0xa2, 0xf1, 0xb9, 0xcf, 0x17, + 0x7a, 0xc7, 0x10, 0xe5, 0xc0, 0xd3, 0xe5, 0x73, 0x27, 0x5b, 0xbf, 0xe3, + 0xa0, 0x4a, 0xee, 0xe6, 0xa9, 0x6f, 0xd5, 0x7e, 0xbb, 0x6a, 0xcc, 0x1b, + 0x3c, 0xd9, 0xa3, 0x9b, 0xca, 0x8c, 0x3b, 0xa7, 0x81, 0x90, 0xd4, 0xf9, + 0xf1, 0xde, 0x5b, 0xb1, 0x5f, 0x93, 0x89, 0x40, 0xee, 0x90, 0xfd, 0xee, + 0x18, 0xe5, 0x35, 0x7e, 0x13, 0xaf, 0xb9, 0xc4, 0xcf, 0x1c, 0x5b, 0x3b, + 0x89, 0xa1, 0x4a, 0xca, 0x28, 0xea, 0x9e, 0x94, 0x36, 0x06, 0xab, 0x49, + 0x58, 0xee, 0xd3, 0xa0, 0x01, 0x03, 0xb0, 0x62, 0x8a, 0x8c, 0x76, 0x61, + 0xb7, 0x30, 0x0e, 0x35, 0xfa, 0x62, 0xe5, 0x5c, 0x0e, 0xba, 0x93, 0x5f, + 0x84, 0x75, 0x0b, 0x21, 0x94, 0xf8, 0x2f, 0x81, 0xee, 0x1d, 0x2e, 0x7c, + 0x7e, 0xcf, 0x13, 0x67, 0xba, 0xc8, 0xb8, 0x06, 0xc6, 0xa4, 0xc1, 0x6d, + 0xe1, 0x07, 0x34, 0x41, 0x18, 0xac, 0x07, 0xd0, 0x57, 0x97, 0x3e, 0x1d, + 0x37, 0x89, 0x06, 0x23, 0x59, 0x49, 0x47, 0xf5, 0x88, 0x18, 0x3c, 0x46, + 0xc3, 0x8b, 0xf1, 0xa6, 0x4a, 0x31, 0xe8, 0x03, 0xec, 0xc4, 0xaa, 0x09, + 0xb0, 0x94, 0x2a, 0xb8, 0xfd, 0x86, 0x9f, 0x01, 0x4f, 0x5d, 0xd5, 0x29, + 0x6d, 0xa8, 0xa9, 0xd3, 0x52, 0x7b, 0xed, 0x51, 0xe0, 0xaa, 0x26, 0x03, + 0xf4, 0x11, 0xf9, 0xfa, 0xd1, 0x23, 0xed, 0xdd, 0x9c, 0x1e, 0x74, 0xd9, + 0xbb, 0x36, 0x28, 0x82, 0x24, 0x62, 0xad, 0x65, 0xf0, 0xe9, 0xd7, 0x60, + 0x32, 0x74, 0x34, 0x47, 0x63, 0xb4, 0x64, 0x30, 0xea, 0x54, 0xf1, 0x12, + 0x7e, 0x3e, 0xeb, 0xcd, 0x81, 0xb4, 0x25, 0x21, 0xfe, 0x0b, 0xf8, 0xb1, + 0x26, 0x16, 0x36, 0x50, 0x26, 0xa1, 0x0c, 0x3b, 0x1b, 0x71, 0xda, 0xad, + 0x9a, 0x58, 0x99, 0xf0, 0xd8, 0xc0, 0x53, 0xdd, 0xca, 0x28, 0x74, 0x10, + 0x92, 0xc7, 0xe4, 0xab, 0xce, 0xf6, 0x79, 0x8a, 0xf0, 0x4d, 0x2b, 0xa2, + 0xf4, 0xa3, 0xbd, 0x8e, 0x9c, 0xdc, 0x4a, 0x73, 0x2e, 0x56, 0x95, 0x8d, + 0xed, 0x2d, 0x62, 0xe0, 0xf7, 0x69, 0x65, 0xa5, 0xce, 0xf4, 0xad, 0xe6, + 0x3f, 0xfc, 0x78, 0x9c, 0xf1, 0xbc, 0x74, 0xfe, 0xe7, 0x64, 0xa2, 0x77, + 0x78, 0x82, 0xd5, 0xa5, 0x6a, 0xa0, 0xe1, 0xf0, 0x00, 0xd5, 0xbf, 0xb9, + 0x93, 0x88, 0xbd, 0x18, 0x16, 0x0a, 0x3a, 0x7c, 0xa0, 0x2c, 0x7b, 0x01, + 0xbb, 0xe9, 0x9a, 0x81, 0x89, 0x84, 0x12, 0x3f, 0xda, 0x3e, 0x49, 0xdd, + 0xdd, 0x57, 0x9b, 0x50, 0x75, 0xa3, 0xcc, 0xe6, 0xf3, 0xc4, 0x03, 0x95, + 0x23, 0x82, 0x23, 0x36, 0xb8, 0xe7, 0x31, 0x94, 0x90, 0xf2, 0x35, 0x6c, + 0x7b, 0xc6, 0x40, 0x32, 0xd5, 0x3e, 0xd3, 0xd7, 0x2e, 0x20, 0x63, 0x5b, + 0x8e, 0x63, 0xde, 0x61, 0x80, 0xdd, 0xd3, 0x8d, 0x17, 0xeb, 0xe0, 0x62, + 0x76, 0x7a, 0x10, 0x8d, 0x9a, 0x30, 0x4c, 0x10, 0x62, 0xf6, 0xc6, 0x68, + 0xe5, 0x91, 0xa0, 0x94, 0x05, 0x8a, 0x0e, 0x7b, 0xb0, 0x7f, 0x17, 0x19, + 0x99, 0x71, 0xdd, 0x7f, 0xa5, 0x67, 0x23, 0x61, 0x0e, 0x80, 0xcc, 0x12, + 0xd7, 0x57, 0xcb, 0x24, 0xa3, 0x6e, 0x9a, 0x35, 0x32, 0xe1, 0x8c, 0x5f, + 0xf6, 0x0a, 0xb5, 0x78, 0xe3, 0x10, 0x76, 0x4d, 0xc4, 0x22, 0xe5, 0x77, + 0x2c, 0x45, 0x83, 0x41, 0xaa, 0x4a, 0x22, 0x35, 0x72, 0xba, 0xfe, 0x3e, + 0x93, 0xdc, 0x30, 0xdd, 0xa6, 0xdd, 0xbb, 0xf4, 0xf1, 0x53, 0xc1, 0x5b, + 0x7b, 0xa6, 0x97, 0x55, 0xdf, 0xb2, 0x98, 0x19, 0x18, 0x3f, 0x87, 0x75, + 0x07, 0x0d, 0x69, 0x76, 0xb9, 0x4f, 0x58, 0x9f, 0x87, 0xff, 0x05, 0x09, + 0xc9, 0x7c, 0xaf, 0xf3, 0xd1, 0xab, 0xb8, 0xa4, 0x36, 0xa6, 0x51, 0x53, + 0x89, 0x11, 0xf4, 0xd7, 0x6d, 0xd8, 0xd6, 0xc8, 0x4f, 0x54, 0x3f, 0x64, + 0xac, 0x68, 0xdb, 0x2b, 0xb0, 0x7e, 0x0a, 0x67, 0x69, 0xf5, 0x95, 0x8a, + 0xb3, 0x9b, 0x27, 0xc9, 0x22, 0x27, 0x67, 0xe0, 0xcf, 0xa7, 0xae, 0x26, + 0xa6, 0xfc, 0xf9, 0x60, 0x7c, 0xc2, 0x82, 0x11, 0x85, 0x62, 0x5f, 0x94, + 0x47, 0x24, 0x76, 0x95, 0x13, 0x34, 0x0f, 0x45, 0x47, 0x6c, 0xc5, 0x2f, + 0x0e, 0xba, 0xe0, 0xca, 0xbb, 0x75, 0x80, 0x98, 0xc1, 0x71, 0x3b, 0xc4, + 0x4c, 0xe6, 0x36, 0x00, 0x1a, 0x63, 0x2f, 0xaf, 0x26, 0xb5, 0xba, 0x38, + 0x5a, 0xcb, 0xa3, 0x36, 0x8d, 0x65, 0x7a, 0xa5, 0xc9, 0x1a, 0x00, 0xb8, + 0x1a, 0x9d, 0x58, 0xb1, 0x1a, 0xd9, 0x0f, 0x99, 0x76, 0x18, 0xfa, 0xac, + 0x16, 0xfc, 0x77, 0x3b, 0xbc, 0x9a, 0x1e, 0x7b, 0xde, 0x37, 0xfe, 0x7c, + 0x7d, 0x85, 0xe6, 0x8e, 0xd0, 0xc6, 0xec, 0xfa, 0x27, 0xc8, 0x74, 0xc6, + 0xb5, 0xfd, 0x41, 0x9d, 0x5a, 0xff, 0xd5, 0xfd, 0xa6, 0x78, 0x41, 0x1b, + 0xec, 0x04, 0x15, 0x15, 0x3e, 0xd6, 0x57, 0x89, 0x7f, 0x24, 0x5a, 0xea, + 0x3a, 0xd4, 0xc2, 0x45, 0x38, 0xa0, 0x1a, 0xde, 0x29, 0x21, 0x13, 0x9f, + 0xc9, 0xc2, 0xaf, 0x81, 0x9f, 0x56, 0xeb, 0xaa, 0xb3, 0xd8, 0xdd, 0x72, + 0x2f, 0x91, 0x0e, 0x23, 0x66, 0xe4, 0x16, 0x73, 0x8b, 0x6d, 0x07, 0x70, + 0xe9, 0xd9, 0xe4, 0xb4, 0x9d, 0xa7, 0x9f, 0x1e, 0x16, 0x30, 0x9b, 0xde, + 0xea, 0xe2, 0xd3, 0x18, 0x90, 0xfe, 0x1d, 0x15, 0xa6, 0xc9, 0x4f, 0x66, + 0xe6, 0xd1, 0x92, 0xc1, 0x1b, 0xc9, 0x74, 0x43, 0xf7, 0x44, 0xd9, 0x8e, + 0xfd, 0x1a, 0xfc, 0xbe, 0xd9, 0x23, 0x97, 0x23, 0x4b, 0x67, 0xf7, 0x3a, + 0x5f, 0x36, 0xee, 0xb6, 0x9e, 0x66, 0x7b, 0x53, 0x94, 0x58, 0xcd, 0x12, + 0xe0, 0x7f, 0xba, 0x29, 0xfb, 0x84, 0x1c, 0xdd, 0x5f, 0x0a, 0x1b, 0x67, + 0xfd, 0x29, 0x22, 0xe6, 0x26, 0x52, 0x40, 0x8c, 0x64, 0xda, 0x32, 0xf8, + 0x80, 0x43, 0xfe, 0xc8, 0x0c, 0x97, 0xc1, 0x59, 0xe8, 0x7d, 0x51, 0x48, + 0x9c, 0x1c, 0x94, 0xf2, 0xcf, 0x7a, 0xae, 0xf3, 0x23, 0xfd, 0x10, 0x13, + 0x3b, 0x50, 0xdd, 0xc4, 0xbb, 0xe1, 0xd8, 0xea, 0x81, 0x39, 0x4f, 0x4a, + 0xd8, 0xe6, 0x4c, 0xcb, 0x04, 0x7d, 0x67, 0x62, 0xb7, 0x1a, 0xbf, 0xd0, + 0xd3, 0x85, 0x3c, 0x36, 0x57, 0x35, 0xea, 0xc4, 0x05, 0xea, 0x32, 0x6c, + 0x11, 0xe7, 0xbe, 0x6e, 0xe8, 0xe1, 0x19, 0x4d, 0xf4, 0x40, 0x3e, 0x33, + 0xb1, 0xa4, 0x44, 0xc1, 0x4f, 0xf7, 0xf2, 0x2b, 0x0f, 0x9a, 0x3a, 0xbb, + 0x36, 0x25, 0x67, 0x6d, 0x12, 0x51, 0x5f, 0x41, 0xf4, 0x79, 0x9e, 0x13, + 0xe3, 0xb3, 0x62, 0x3d, 0xe3, 0x40, 0x62, 0x66, 0xd6, 0x4c, 0xc5, 0x20, + 0x19, 0xbe, 0x57, 0xb1, 0x96, 0xbd, 0x84, 0x27, 0x67, 0x64, 0x53, 0xfa, + 0x1a, 0x04, 0x28, 0x09, 0xee, 0xf5, 0x8c, 0x27, 0xe8, 0xa7, 0xe8, 0x7c, + 0x47, 0x88, 0xd2, 0x87, 0x1b, 0xab, 0xcb, 0x6e, 0xbd, 0x0d, 0xcc, 0x82, + 0xb9, 0x1b, 0xae, 0xcf, 0x87, 0x58, 0xda, 0xd5, 0x19, 0x5d, 0xfd, 0x28, + 0x0a, 0x5e, 0xb1, 0x2f, 0x77, 0x8b, 0x6a, 0x16, 0x10, 0x45, 0xd4, 0xb2, + 0xa8, 0x6f, 0x3f, 0x3f, 0x01, 0xbe, 0x89, 0x4f, 0xf6, 0xd5, 0x18, 0x4c, + 0x6b, 0x0f, 0x19, 0xdd, 0x3d, 0x5d, 0x62, 0x3e, 0x46, 0x52, 0x25, 0x3f, + 0x0e, 0xd1, 0x2d, 0xb4, 0x74, 0xe3, 0x7c, 0xb8, 0x54, 0x9c, 0x30, 0x3c, + 0x38, 0x25, 0x0d, 0xbd, 0x54, 0x62, 0x8d, 0xd5, 0x07, 0xd6, 0xc3, 0x30, + 0x35, 0x27, 0x2c, 0x97, 0xb7, 0x72, 0x92, 0x49, 0x7b, 0xd7, 0x62, 0x5f, + 0x02, 0x18, 0x0a, 0x12, 0x5a, 0xd9, 0x1e, 0xea, 0xc2, 0x40, 0xbe, 0x33, + 0x25, 0x97, 0xdb, 0xd7, 0x1b, 0x37, 0x12, 0x00, 0x17, 0xba, 0xed, 0x4b, + 0x81, 0x13, 0x7e, 0x6c, 0xb9, 0xe5, 0x1a, 0x48, 0x6c, 0x08, 0xfa, 0x1a, + 0x15, 0xfe, 0xcd, 0x03, 0x4e, 0x9e, 0x94, 0xfa, 0x81, 0x73, 0x96, 0x8e, + 0x71, 0x99, 0x9b, 0x34, 0xf0, 0x5a, 0x9d, 0xf5, 0xa0, 0x94, 0xb8, 0x39, + 0x86, 0x6f, 0xd5, 0xbf, 0xa2, 0x1b, 0xe8, 0xdb, 0x0c, 0xce, 0xad, 0xc6, + 0x3a, 0x22, 0xbb, 0x9b, 0x99, 0x47, 0x85, 0xee, 0xd1, 0xac, 0xf3, 0x6f, + 0x64, 0xa5, 0x6d, 0xe3, 0x2c, 0x94, 0xb0, 0x1a, 0xdf, 0x37, 0xcf, 0xe8, + 0x8a, 0x52, 0x88, 0xe9, 0x69, 0xea, 0xeb, 0x7c, 0x20, 0x7a, 0x25, 0x3f, + 0xb9, 0x54, 0x32, 0x3f, 0xca, 0x1a, 0x0e, 0x87, 0xb6, 0x10, 0xab, 0x1c, + 0x4d, 0xd6, 0xe1, 0xe5, 0xcc, 0xf7, 0x0f, 0xe6, 0x67, 0x7c, 0xbf, 0x82, + 0xfc, 0xf6, 0x8b, 0xf8, 0xe7, 0x0e, 0xf6, 0x7e, 0xb5, 0x72, 0x9d, 0x77, + 0x50, 0xc3, 0x10, 0xfd, 0x05, 0x98, 0xbd, 0x72, 0x2a, 0x3a, 0xd6, 0xfe, + 0x66, 0x98, 0x70, 0x92, 0x94, 0x71, 0x07, 0x01, 0x35, 0xbf, 0x1a, 0xc2, + 0xe4, 0x02, 0x60, 0x94, 0xf3, 0xdb, 0xc7, 0xd6, 0xe6, 0x57, 0x84, 0x5a, + 0x81, 0x31, 0x3b, 0x46, 0x06, 0xa5, 0x56, 0x64, 0x2d, 0x3a, 0x4e, 0xaa, + 0x5d, 0x2c, 0xb0, 0x8d, 0x42, 0x17, 0x9d, 0x98, 0x71, 0x36, 0xfe, 0x46, + 0xc8, 0xfb, 0x25, 0xc3, 0xe7, 0xe5, 0x73, 0x42, 0x32, 0xeb, 0xb2, 0x32, + 0x9a, 0x20, 0x0a, 0x53, 0x4d, 0x8f, 0x5a, 0xd2, 0x81, 0xec, 0x24, 0x73, + 0x7d, 0x0b, 0x35, 0x59, 0xdc, 0x4f, 0x1a, 0x30, 0xb1, 0xb1, 0x3a, 0xa3, + 0x3f, 0xf3, 0x05, 0x84, 0xdc, 0x46, 0xd1, 0x2e, 0x99, 0x46, 0xf0, 0xa6, + 0x77, 0x93, 0x93, 0xb0, 0x37, 0xb3, 0xe6, 0xef, 0x7a, 0x87, 0x0d, 0x83, + 0x16, 0xe5, 0x9f, 0x2a, 0xfe, 0x9c, 0xd6, 0xd7, 0xbe, 0x4b, 0x5b, 0xa7, + 0xdf, 0x57, 0x2c, 0x26, 0x4a, 0x47, 0x1b, 0xd1, 0xb0, 0xd6, 0x2b, 0x9b, + 0x3b, 0x46, 0x51, 0x54, 0xee, 0x65, 0xd9, 0x18, 0x5b, 0xe7, 0xc1, 0x3c, + 0xa7, 0x61, 0xe2, 0x94, 0x12, 0x92, 0x6a, 0x9b, 0xdc, 0x49, 0x8f, 0x01, + 0x92, 0xc1, 0x8b, 0xf7, 0x78, 0x44, 0x7c, 0x9c, 0xc2, 0x42, 0xc2, 0xfb, + 0x31, 0x91, 0xa4, 0xa2, 0xf9, 0x10, 0x06, 0xd5, 0x96, 0x8b, 0xdc, 0x29, + 0x27, 0x64, 0xac, 0xe8, 0x3f, 0x99, 0x25, 0x26, 0x79, 0x00, 0x70, 0x80, + 0x64, 0x07, 0xad, 0x99, 0x66, 0xc3, 0x6e, 0x45, 0x32, 0x4d, 0x48, 0x42, + 0xf4, 0x35, 0x9b, 0x17, 0x00, 0x59, 0xfb, 0x95, 0x80, 0xaf, 0xbf, 0x63, + 0x18, 0x19, 0x0a, 0xb1, 0xdc, 0xe4, 0x3e, 0xd4, 0xf3, 0x1c, 0x2e, 0x08, + 0x0a, 0x44, 0xeb, 0xe2, 0x14, 0x7e, 0xe6, 0x2d, 0xb8, 0x64, 0xad, 0x84, + 0xc5, 0x9f, 0x59, 0x24, 0xbb, 0xe4, 0xc1, 0x76, 0xde, 0xc1, 0x74, 0x90, + 0xdd, 0x80, 0xbb, 0x98, 0x43, 0x52, 0x21, 0x25, 0xa1, 0xed, 0x13, 0x34, + 0x11, 0x1e, 0xad, 0x70, 0xe9, 0x38, 0xc6, 0x48, 0x6c, 0xd8, 0xa7, 0x79, + 0xeb, 0x10, 0x18, 0x95, 0x2b, 0x19, 0xdb, 0x59, 0x9c, 0x6d, 0xac, 0xf5, + 0xb5, 0x64, 0x2d, 0x71, 0xb5, 0x2c, 0x1c, 0x69, 0x4c, 0xaf, 0x23, 0xd3, + 0xdf, 0xbe, 0x36, 0x48, 0xd5, 0xae, 0xa7, 0x2f, 0x3d, 0x3a, 0xbc, 0xd7, + 0x20, 0x89, 0x38, 0x4f, 0x8f, 0x31, 0x38, 0x82, 0xc3, 0x5a, 0xce, 0x63, + 0xe7, 0x16, 0xec, 0xbf, 0x13, 0xab, 0xd9, 0x31, 0xed, 0x9b, 0x88, 0xa5, + 0x5a, 0x84, 0x7f, 0x1e, 0xcf, 0xd3, 0x5c, 0x89, 0xad, 0xac, 0xa4, 0x25, + 0x8b, 0x89, 0x52, 0x4c, 0x0c, 0xbc, 0x8d, 0x85, 0xfc, 0xf4, 0x85, 0xde, + 0x29, 0xb2, 0x6f, 0x80, 0xfd, 0xc1, 0x0e, 0x89, 0xa6, 0x1a, 0xe8, 0xad, + 0x75, 0x02, 0xdc, 0xb4, 0x54, 0xd5, 0xca, 0x3d, 0x5a, 0xd7, 0xa3, 0xaa, + 0xfe, 0xca, 0x77, 0xcc, 0x7f, 0xaf, 0xda, 0xb6, 0x20, 0x5b, 0xcc, 0x88, + 0x70, 0xc1, 0xf0, 0xac, 0x63, 0x3a, 0xc0, 0x92, 0x1e, 0xb4, 0xb7, 0xc1, + 0x57, 0x48, 0x64, 0x9b, 0xd0, 0x8d, 0x11, 0x48, 0xe8, 0xbc, 0xeb, 0x87, + 0xb0, 0x1b, 0xf4, 0x00, 0xcf, 0x83, 0xd3, 0x4f, 0x97, 0xe4, 0xa1, 0x67, + 0xf7, 0xe2, 0x6c, 0xe2, 0x43, 0xc1, 0x21, 0x06, 0x53, 0x88, 0x16, 0x71, + 0x68, 0x07, 0xfc, 0xee, 0xe0, 0x94, 0xe4, 0xa8, 0xba, 0x56, 0x80, 0x51, + 0xac, 0xb7, 0xb3, 0x19, 0xe6, 0xb0, 0x8d, 0x28, 0x6c, 0xd3, 0xa4, 0x66, + 0xf6, 0x9d, 0xd4, 0x60, 0x79, 0x75, 0x57, 0x3a, 0x15, 0x7c, 0x41, 0xcc, + 0xe3, 0xe2, 0x04, 0x9a, 0x5f, 0x0b, 0x32, 0xe6, 0xe5, 0xf8, 0xd8, 0x14, + 0x8f, 0x79, 0x7d, 0x43, 0xf9, 0x7f, 0xcf, 0xbc, 0xb4, 0x04, 0xf4, 0xd5, + 0x51, 0x2f, 0xe8, 0x1e, 0x7d, 0x97, 0xda, 0xea, 0xbc, 0x3c, 0x46, 0xff, + 0xd8, 0xd0, 0xf0, 0xc1, 0xcd, 0xd6, 0x09, 0xee, 0x68, 0xf4, 0x8c, 0xc5, + 0x6c, 0x0b, 0x30, 0xd0, 0x78, 0xdf, 0x1b, 0xb1, 0x4a, 0xdb, 0xf6, 0xf0, + 0x2c, 0xe5, 0x1f, 0xeb, 0xb5, 0x32, 0x7f, 0x83, 0xa0, 0xf6, 0x93, 0x8d, + 0xe7, 0xa4, 0x91, 0xdf, 0x5d, 0xf3, 0xb5, 0xee, 0xb9, 0x1d, 0x2f, 0xa7, + 0x0a, 0x5b, 0x80, 0x34, 0xa0, 0xdb, 0x00, 0x8e, 0x87, 0x07, 0xec, 0xad, + 0x29, 0x7d, 0x7a, 0x6c, 0xb4, 0xa3, 0x78, 0x73, 0xcc, 0x68, 0x78, 0xe0, + 0x7f, 0xb7, 0x6e, 0xdb, 0xe8, 0xd9, 0xfd, 0xde, 0xae, 0xec, 0x16, 0x55, + 0x73, 0xa1, 0x0c, 0xf5, 0xba, 0xbd, 0x40, 0xb1, 0x73, 0x17, 0x1f, 0x73, + 0x66, 0x71, 0x3a, 0x53, 0xb3, 0x50, 0xfc, 0xa9, 0xf6, 0xbc, 0xe8, 0x23, + 0x9f, 0x1f, 0x18, 0x32, 0x32, 0xb6, 0x44, 0x48, 0x4f, 0x46, 0xb8, 0x96, + 0xa8, 0xc2, 0x87, 0xf7, 0x93, 0x3f, 0xbf, 0x4a, 0x60, 0xff, 0x9e, 0x46, + 0x9f, 0x7c, 0xc4, 0xee, 0xe0, 0x36, 0x1b, 0x90, 0x9f, 0x19, 0xb1, 0xe5, + 0xc3, 0x0d, 0xb2, 0xc3, 0x72, 0x32, 0xd4, 0xf2, 0x6f, 0xb2, 0xcd, 0xa6, + 0x78, 0x26, 0x65, 0x94, 0x4b, 0x49, 0xd9, 0x17, 0xad, 0x71, 0x59, 0x8d, + 0xaf, 0xc9, 0xfb, 0xeb, 0xf5, 0x01, 0xfa, 0x49, 0xaf, 0x21, 0xbf, 0x0d, + 0x63, 0xbd, 0x42, 0x52, 0x96, 0x22, 0x23, 0xb8, 0x3b, 0x43, 0x74, 0x07, + 0x0b, 0x7d, 0x74, 0x81, 0xb4, 0x45, 0x4e, 0xe3, 0x8d, 0x5b, 0xdc, 0x46, + 0x67, 0x60, 0xea, 0x3f, 0xb0, 0xfa, 0xf7, 0x9d, 0x6b, 0x38, 0x76, 0x9f, + 0xbf, 0x93, 0xd7, 0x9a, 0x73, 0x27, 0x54, 0x0c, 0xed, 0x12, 0xd1, 0x58, + 0xa7, 0xf1, 0x22, 0x59, 0xf1, 0xa9, 0x29, 0x13, 0xe4, 0x32, 0x9f, 0xca, + 0x85, 0xa2, 0xc9, 0xfd, 0xd0, 0x8a, 0x71, 0xd5, 0xb2, 0x60, 0xdf, 0x7d, + 0x9c, 0x9a, 0xa3, 0x5e, 0xb2, 0x1e, 0x0b, 0x2c, 0xea, 0xba, 0xbb, 0x6f, + 0x49, 0xec, 0x7a, 0x24, 0x73, 0xcb, 0x82, 0x12, 0xf3, 0x34, 0x3b, 0x22, + 0x36, 0x7a, 0xd4, 0x17, 0xf5, 0x4a, 0x18, 0x00, 0x79, 0xdc, 0x3d, 0x6b, + 0x00, 0x42, 0xc1, 0x28, 0xbb, 0xa0, 0x77, 0xd4, 0x8e, 0x5f, 0x15, 0x9d, + 0x2a, 0xe1, 0x07, 0xbc, 0x5c, 0x66, 0xf1, 0xbd, 0x18, 0x7f, 0x70, 0xfe, + 0xed, 0x94, 0x70, 0x7a, 0x87, 0xe2, 0x39, 0x55, 0x56, 0xa5, 0x20, 0x8f, + 0xdd, 0xac, 0x65, 0x96, 0x2f, 0x6a, 0xc6, 0x90, 0xb1, 0x0c, 0x8d, 0x49, + 0x11, 0xb1, 0x77, 0x61, 0x80, 0xdf, 0xfa, 0xca, 0x88, 0x53, 0x8a, 0xb8, + 0x69, 0xc7, 0x6b, 0x9f, 0x72, 0xec, 0xea, 0x10, 0x50, 0xfc, 0x75, 0xdb, + 0x51, 0xe1, 0x39, 0x44, 0x3c, 0x09, 0x7a, 0xaf, 0x08, 0x83, 0xc9, 0x15, + 0x31, 0xe4, 0xe5, 0xe4, 0x92, 0x13, 0x99, 0x9e, 0x9e, 0x3a, 0x53, 0x4a, + 0xf6, 0x89, 0xdc, 0x49, 0x72, 0xcb, 0xf4, 0xcb, 0x79, 0x68, 0x40, 0xd6, + 0x4b, 0xf8, 0xea, 0x55, 0x5e, 0x37, 0x01, 0x00, 0xe9, 0xc1, 0xfe, 0x65, + 0xa1, 0xcc, 0x90, 0x94, 0x62, 0x1c, 0x16, 0x29, 0xeb, 0x31, 0xca, 0x32, + 0xdc, 0xaa, 0xe2, 0x83, 0xaf, 0x36, 0xcf, 0xf8, 0x8b, 0x27, 0x75, 0x9d, + 0x59, 0x44, 0x9a, 0x01, 0x7c, 0xe6, 0x0b, 0x5a, 0x33, 0x22, 0xe6, 0xe2, + 0x2a, 0x35, 0x13, 0xf4, 0xca, 0x93, 0x31, 0x67, 0x84, 0x5b, 0x2e, 0x07, + 0x09, 0x7e, 0xb1, 0x24, 0xbf, 0x8b, 0x73, 0xbf, 0xec, 0x27, 0x67, 0xe0, + 0xb6, 0x68, 0x8d, 0x93, 0x3e, 0x67, 0x9d, 0xec, 0xea, 0x87, 0xbc, 0x21, + 0xd2, 0x9f, 0x64, 0x99, 0x34, 0xca, 0x04, 0x55, 0x89, 0xca, 0x84, 0xe1, + 0x53, 0x87, 0xcb, 0x93, 0x54, 0xc9, 0x91, 0xee, 0x7f, 0x04, 0xa8, 0xe1, + 0xda, 0xaa, 0x83, 0xb7, 0x0b, 0x7f, 0x95, 0xae, 0xb0, 0x10, 0x53, 0x06, + 0x4f, 0x2c, 0x53, 0x2f, 0xf8, 0xda, 0x64, 0xc8, 0xdf, 0x93, 0x40, 0x33, + 0x36, 0xa9, 0x70, 0x9f, 0x53, 0xc1, 0x27, 0x3b, 0xad, 0xf8, 0x19, 0xe9, + 0x7e, 0x3b, 0x82, 0xbc, 0x8a, 0xa3, 0xba, 0x88, 0xc2, 0x6d, 0x9f, 0xe0, + 0xe2, 0x4e, 0x47, 0x45, 0x51, 0xb0, 0xca, 0xbd, 0x18, 0x6f, 0xdb, 0xa0, + 0x8c, 0xc2, 0x76, 0x5c, 0xf2, 0x71, 0x56, 0x75, 0x4d, 0x6e, 0x7f, 0x3f, + 0xfc, 0x25, 0x55, 0x95, 0xe2, 0xba, 0xca, 0x38, 0xc3, 0x9d, 0x04, 0xc1, + 0xac, 0xa0, 0x8b, 0x17, 0x18, 0x74, 0x70, 0xdb, 0x1c, 0xaa, 0xd0, 0xef, + 0x6f, 0x74, 0xe2, 0x1c, 0x48, 0x95, 0xc8, 0x3d, 0xc6, 0x7c, 0x63, 0xe3, + 0xa6, 0x51, 0x51, 0x6b, 0x5b, 0x46, 0x19, 0x89, 0xfc, 0x20, 0xed, 0xf7, + 0xcb, 0xc5, 0xbf, 0x0b, 0x25, 0x67, 0x72, 0xd3, 0x60, 0x28, 0x26, 0x4e, + 0xf3, 0x7e, 0xe0, 0x15, 0x74, 0xb5, 0x8e, 0x2a, 0x1f, 0x95, 0xbb, 0xa7, + 0x72, 0xd3, 0x05, 0xb2, 0x4f, 0x22, 0x61, 0x22, 0xce, 0x85, 0xb3, 0x7b, + 0xeb, 0xb2, 0x58, 0xf5, 0x0c, 0x36, 0x2f, 0x3c, 0x7b, 0x2e, 0xae, 0x48, + 0x09, 0x12, 0x8a, 0xc0, 0x2a, 0xbe, 0x1c, 0xfe, 0xc9, 0xcf, 0xaa, 0x41, + 0xf1, 0x9a, 0x12, 0xe7, 0xa3, 0x6e, 0x01, 0x04, 0x80, 0xb5, 0x75, 0x65, + 0xb0, 0xc9, 0xb0, 0x24, 0x40, 0x71, 0x61, 0x6b, 0xa9, 0x1b, 0x92, 0x6a, + 0x39, 0x98, 0x88, 0x67, 0xe0, 0x75, 0x47, 0x1c, 0x87, 0x69, 0xda, 0xc9, + 0x16, 0xc7, 0xb1, 0x24, 0x9b, 0xdf, 0xf4, 0xd9, 0xff, 0xec, 0xa1, 0x7c, + 0xc3, 0x97, 0xad, 0x92, 0x94, 0x4f, 0xc1, 0xfc, 0xc8, 0x49, 0x3a, 0xe7, + 0xac, 0xc6, 0x62, 0x84, 0xe2, 0xad, 0xd7, 0x11, 0x8b, 0x56, 0xd6, 0xf8, + 0xd0, 0xda, 0xf1, 0xb9, 0xbe, 0x7d, 0xcb, 0xca, 0x96, 0x72, 0x76, 0x02, + 0x35, 0x38, 0x2b, 0xe4, 0x8a, 0xcd, 0xa1, 0x9c, 0x42, 0x01, 0x7e, 0x00, + 0x9b, 0x2b, 0xbe, 0x8e, 0x08, 0x5a, 0x54, 0xad, 0x0f, 0xcd, 0x7c, 0x0f, + 0xa9, 0x95, 0xcc, 0x27, 0xd8, 0x63, 0xc2, 0xa2, 0x6b, 0xf0, 0x73, 0x42, + 0x51, 0x7d, 0xe5, 0xb6, 0x34, 0xd4, 0x5f, 0x54, 0x3a, 0x64, 0xc1, 0x32, + 0x6b, 0x16, 0x55, 0x82, 0xc7, 0x63, 0x5f, 0x21, 0x1a, 0x75, 0xb7, 0xcc, + 0xb5, 0xcd, 0x51, 0xb7, 0x42, 0x77, 0xea, 0x10, 0x5f, 0x17, 0x4e, 0xf3, + 0xaa, 0xe8, 0x53, 0x67, 0x72, 0xaa, 0xf1, 0x7d, 0x0b, 0xb4, 0xe1, 0x15, + 0x9e, 0x87, 0x75, 0xdc, 0x78, 0x8e, 0xb1, 0xd9, 0x94, 0x06, 0x8a, 0xe8, + 0x2a, 0x3a, 0xf2, 0x6c, 0x36, 0xe1, 0x35, 0x84, 0x15, 0xe6, 0xd4, 0x6a, + 0xc4, 0x14, 0x9c, 0xbc, 0x0e, 0xe7, 0xce, 0xad, 0xb8, 0xc7, 0x32, 0x62, + 0xff, 0xb6, 0x6d, 0xde, 0x44, 0xc2, 0xa1, 0x27, 0xdf, 0x59, 0x10, 0xb9, + 0x0f, 0x70, 0x53, 0x07, 0x81, 0xee, 0xf4, 0x76, 0xd2, 0x0a, 0xd7, 0x77, + 0x24, 0x20, 0x74, 0xc0, 0xc5, 0xda, 0x6a, 0x07, 0x8d, 0x6f, 0x03, 0x96, + 0x9d, 0xe6, 0x66, 0xc2, 0x37, 0xa3, 0x11, 0xe4, 0x07, 0xa8, 0x0a, 0x05, + 0xaa, 0x10, 0x3d, 0xe9, 0xd4, 0xb4, 0x6a, 0xc6, 0x54, 0xf9, 0xd2, 0xed, + 0xfa, 0x73, 0x5d, 0xfd, 0x9a, 0x9d, 0x08, 0x59, 0xcf, 0xf9, 0xd0, 0xe5, + 0xe3, 0x6d, 0xc2, 0x0b, 0xb9, 0x5d, 0x02, 0x2e, 0x1f, 0xbd, 0x9c, 0x16, + 0x97, 0x99, 0x92, 0x4d, 0x2a, 0xe0, 0xa2, 0x06, 0x7c, 0x41, 0x79, 0x18, + 0x4d, 0xbe, 0x5c, 0x2f, 0x29, 0xab, 0xfc, 0x8c, 0xd5, 0xb8, 0xc9, 0x5d, + 0x54, 0xbe, 0xfd, 0x7c, 0x2f, 0x4b, 0x1c, 0x1e, 0x8a, 0x0c, 0x31, 0xbf, + 0xd7, 0xb0, 0x44, 0xfe, 0xa0, 0x3d, 0x86, 0x17, 0x47, 0x7c, 0xd9, 0xab, + 0xb9, 0x84, 0xe3, 0x12, 0x84, 0xb5, 0x73, 0x66, 0x31, 0x33, 0x8a, 0x53, + 0x6b, 0x33, 0x68, 0x0f, 0xaf, 0x75, 0x5b, 0x86, 0xea, 0xba, 0x15, 0xe1, + 0xfd, 0x75, 0xc6, 0x45, 0x23, 0x87, 0x03, 0xba, 0x91, 0x98, 0x1c, 0x62, + 0xb7, 0x9f, 0x75, 0xab, 0x83, 0xf9, 0xcf, 0xeb, 0x02, 0x3a, 0xd9, 0x3c, + 0x17, 0x68, 0xdf, 0xd7, 0x06, 0x12, 0x65, 0xcb, 0x30, 0x52, 0x7f, 0x15, + 0x42, 0xaa, 0x7d, 0x1b, 0xe3, 0xfe, 0x62, 0x88, 0x3b, 0xb8, 0x89, 0xfe, + 0xe3, 0xf6, 0x2a, 0x2c, 0x23, 0x5d, 0xdb, 0xa2, 0x6d, 0x70, 0x9f, 0xbd, + 0xa7, 0x4c, 0x7c, 0xff, 0x7c, 0x8c, 0x29, 0xa8, 0x93, 0xd9, 0xea, 0x1b, + 0xd8, 0x0c, 0xaa, 0x2f, 0xfe, 0xf5, 0x49, 0x4c, 0x9c, 0x01, 0xa5, 0xf6, + 0xb6, 0xc5, 0x36, 0xad, 0x05, 0x2d, 0x89, 0x12, 0xb7, 0x1f, 0x36, 0x57, + 0xd6, 0x26, 0x82, 0x06, 0x37, 0xcb, 0xcc, 0x0d, 0x18, 0x31, 0xcd, 0x91, + 0xed, 0x95, 0xe6, 0xbc, 0x3a, 0x92, 0x7c, 0x01, 0xf9, 0xd8, 0x1c, 0xc9, + 0xe5, 0x66, 0x33, 0x47, 0x6e, 0xde, 0xe2, 0xd1, 0x1a, 0xbc, 0x3e, 0x1e, + 0x74, 0x56, 0x93, 0x11, 0x86, 0x51, 0x57, 0x4d, 0x6c, 0xa2, 0x95, 0x39, + 0xb9, 0xe3, 0x0a, 0x31, 0x3f, 0x3d, 0xb7, 0x9f, 0x6e, 0x0f, 0x5c, 0x01, + 0x37, 0x24, 0xde, 0x2c, 0xab, 0xb2, 0x28, 0x28, 0x81, 0x1b, 0xa9, 0x38, + 0x22, 0xcb, 0x67, 0x2e, 0x17, 0xb4, 0x3f, 0x93, 0x2d, 0x85, 0x1c, 0x4a, + 0xc8, 0xa9, 0xab, 0x3a, 0xaa, 0xb5, 0xec, 0x33, 0x77, 0x3f, 0xfc, 0x1f, + 0xa2, 0x3e, 0xab, 0xac, 0xaa, 0x15, 0x0d, 0xc4, 0x13, 0x11, 0xc4, 0xc5, + 0x9d, 0xf6, 0xb5, 0x52, 0xba, 0x01, 0xd1, 0x19, 0x7f, 0x1b, 0x87, 0x81, + 0x33, 0xed, 0xe0, 0x01, 0x48, 0x5c, 0xbf, 0xef, 0x03, 0xf8, 0xf3, 0x56, + 0x34, 0x70, 0xd8, 0xf1, 0x92, 0x9d, 0x71, 0xce, 0xc7, 0x0e, 0xbc, 0x68, + 0xff, 0xd1, 0x8b, 0x5a, 0xec, 0x97, 0x3f, 0x98, 0x3d, 0xe6, 0x1c, 0xa2, + 0x37, 0xc7, 0xbd, 0x26, 0x3c, 0x8c, 0x8f, 0xcd, 0x21, 0x17, 0x3d, 0xac, + 0x61, 0x44, 0x89, 0xa7, 0x41, 0xa7, 0xb8, 0x03, 0xde, 0xa1, 0x2c, 0x52, + 0x52, 0xd8, 0x01, 0xb3, 0x47, 0x57, 0x92, 0x00, 0x1c, 0x7a, 0x97, 0x0c, + 0x15, 0x5f, 0x31, 0xa4, 0x53, 0xa3, 0x74, 0x3f, 0x1d, 0xdf, 0x6d, 0x4e, + 0x78, 0xb6, 0x9e, 0x19, 0x55, 0x52, 0x47, 0xec, 0xc3, 0xb5, 0x38, 0x3a, + 0x75, 0xd6, 0x2e, 0x43, 0x47, 0x1d, 0x03, 0xec, 0xa6, 0xe3, 0xc1, 0x33, + 0x97, 0x25, 0x4e, 0xa3, 0x17, 0xe1, 0x1b, 0x52, 0xd5, 0x4d, 0xe4, 0x4d, + 0x9d, 0x54, 0x7c, 0x89, 0x8d, 0x36, 0xab, 0x22, 0x96, 0x2a, 0x19, 0x7f, + 0x57, 0x6a, 0xc0, 0x5c, 0x3a, 0x7e, 0xe8, 0x59, 0xb1, 0x97, 0xe6, 0x94, + 0xcc, 0x64, 0x21, 0x2b, 0x44, 0xd9, 0xf7, 0xd2, 0x20, 0x75, 0x5a, 0x0f, + 0x49, 0x73, 0x1b, 0xd9, 0x06, 0x61, 0x78, 0x37, 0xcd, 0x20, 0xf0, 0x83, + 0xed, 0x3b, 0x74, 0xde, 0x33, 0x7d, 0xb2, 0x10, 0x69, 0x0c, 0x5a, 0xdb, + 0x61, 0x64, 0xf1, 0xc4, 0x8b, 0x19, 0x20, 0xc3, 0xb2, 0x4e, 0x8d, 0xbd, + 0x90, 0xb8, 0x11, 0x06, 0xac, 0xe6, 0xf4, 0x25, 0xa4, 0x2e, 0x80, 0xa5, + 0x57, 0x07, 0xc2, 0x8b, 0xf7, 0x87, 0x73, 0x36, 0xe4, 0xfe, 0x22, 0x49, + 0x4f, 0xa1, 0x83, 0x5d, 0x7f, 0x3b, 0x95, 0x66, 0x53, 0x99, 0x14, 0x4e, + 0xe9, 0x2b, 0x5f, 0xe4, 0x39, 0x20, 0x1b, 0x2c, 0xa4, 0x57, 0x90, 0x58, + 0xe4, 0x8d, 0xe4, 0xbf, 0x76, 0x3f, 0x58, 0x96, 0x98, 0x1b, 0xe8, 0x9e, + 0xd9, 0xdc, 0x37, 0x7e, 0xb2, 0xbc, 0x7c, 0x3c, 0x56, 0x91, 0xd9, 0x83, + 0x0e, 0xa7, 0x1e, 0x8e, 0x2c, 0x2a, 0x3c, 0xee, 0x2d, 0x2f, 0x6c, 0xc8, + 0xab, 0xdf, 0x61, 0xfa, 0x1e, 0x35, 0x01, 0x88, 0x40, 0x2e, 0xb6, 0x35, + 0x7f, 0x70, 0x3c, 0x41, 0x57, 0x41, 0xa4, 0x70, 0x51, 0xd2, 0x46, 0xe8, + 0xe9, 0xd0, 0x5c, 0xd1, 0x3e, 0x07, 0xbb, 0x8d, 0x54, 0x49, 0xf5, 0x1a, + 0x5b, 0x07, 0xe2, 0x53, 0x57, 0x85, 0x0c, 0x7f, 0x14, 0x6d, 0x32, 0x80, + 0xbd, 0x0a, 0x78, 0xf6, 0x8a, 0xd7, 0x41, 0x27, 0xe7, 0x2a, 0x68, 0x2c, + 0x5c, 0xe5, 0x06, 0x7f, 0x2d, 0x80, 0x5b, 0xd2, 0x49, 0x00, 0xaa, 0x6d, + 0xf6, 0xa4, 0x3a, 0xc7, 0x44, 0xdc, 0x79, 0xc3, 0xc4, 0xc2, 0x3f, 0x0b, + 0x14, 0x31, 0xb9, 0x02, 0x55, 0x7e, 0x31, 0x1d, 0xa4, 0x3d, 0xbf, 0xc0, + 0x6f, 0x1a, 0xf7, 0x82, 0x59, 0xb7, 0xfc, 0x62, 0xb0, 0x5f, 0xe6, 0x55, + 0x15, 0xe5, 0xa7, 0xf1, 0x61, 0xbc, 0xad, 0x2c, 0x44, 0xd5, 0x23, 0x86, + 0xce, 0x38, 0xdb, 0x74, 0x48, 0xcf, 0x0c, 0x04, 0xec, 0x34, 0x52, 0xc5, + 0xe0, 0xdc, 0x92, 0xf7, 0x24, 0x7b, 0x4d, 0x2f, 0xc8, 0x55, 0x69, 0x94, + 0x9f, 0xa0, 0x95, 0xfe, 0xda, 0x43, 0xc0, 0x46, 0xfc, 0xcd, 0xf0, 0x1c, + 0x05, 0x33, 0x7d, 0xc2, 0x96, 0x33, 0xa8, 0x2d, 0xd9, 0x03, 0x5a, 0x02, + 0xb5, 0x9e, 0xfc, 0x60, 0x16, 0x76, 0xe3, 0x2e, 0xb4, 0x3d, 0xbb, 0xc6, + 0x45, 0xa0, 0x7d, 0xa4, 0xec, 0x6d, 0xcb, 0xf6, 0xdb, 0xed, 0xca, 0x60, + 0x4d, 0x6f, 0x96, 0xf9, 0xda, 0x6b, 0x1b, 0x7d, 0x3c, 0xf5, 0x4e, 0xec, + 0x8b, 0xfc, 0xee, 0x2a, 0x81, 0xc6, 0x7d, 0x60, 0xe1, 0xe6, 0x1d, 0x66, + 0x5d, 0x22, 0xcd, 0x39, 0x08, 0x4e, 0x1f, 0x09, 0x5a, 0x39, 0xe6, 0x78, + 0x34, 0x2f, 0x4a, 0xcc, 0x70, 0x35, 0x7e, 0xef, 0x22, 0x21, 0xdd, 0xcf, + 0x47, 0xb5, 0xfc, 0xb5, 0xfb, 0xcc, 0xc6, 0xf6, 0x6d, 0x90, 0x86, 0x17, + 0x58, 0x4e, 0xe9, 0x83, 0x78, 0x58, 0x98, 0x6d, 0xa8, 0xcd, 0x5c, 0xe9, + 0x40, 0x7f, 0x09, 0x3f, 0xbd, 0x33, 0xec, 0x6d, 0x68, 0xe9, 0x59, 0x9a, + 0xcd, 0x01, 0x74, 0x6b, 0xe7, 0x8c, 0x18, 0x63, 0x18, 0x9d, 0x80, 0x4f, + 0x2f, 0xca, 0x5e, 0xef, 0xd3, 0x65, 0xb6, 0xfe, 0xa4, 0x08, 0x43, 0x18, + 0x0f, 0xb5, 0x17, 0x1b, 0xa2, 0x71, 0xad, 0xea, 0x6b, 0x26, 0x8a, 0x7f, + 0x95, 0x22, 0x18, 0x55, 0x1c, 0xa3, 0x41, 0x0f, 0x13, 0x9c, 0xc8, 0xe0, + 0x24, 0xf7, 0x0d, 0x86, 0xa2, 0xf7, 0x2d, 0xbb, 0x4d, 0xc5, 0x47, 0x70, + 0xfb, 0xcc, 0xa7, 0x77, 0x83, 0xb5, 0x16, 0x72, 0xcb, 0xb1, 0x98, 0x89, + 0xe6, 0xef, 0xe8, 0xa5, 0x14, 0xe8, 0xf5, 0x34, 0x19, 0x30, 0x9c, 0xe9, + 0xd5, 0xcd, 0x34, 0x07, 0x39, 0x0e, 0xef, 0x56, 0xcf, 0x32, 0x5a, 0x90, + 0x48, 0x42, 0x28, 0x1a, 0xb5, 0xb9, 0xa5, 0x56, 0x65, 0x48, 0xce, 0xf8, + 0xf9, 0x2e, 0xc8, 0x97, 0xf9, 0x0c, 0x62, 0x16, 0x8d, 0x63, 0x15, 0xaf, + 0x70, 0x8a, 0x9c, 0xd5, 0xd7, 0x4a, 0x19, 0x53, 0xe0, 0x69, 0xb6, 0xba, + 0x92, 0x49, 0xc8, 0x95, 0xbb, 0x00, 0x37, 0x12, 0x6f, 0xb8, 0xe7, 0x5f, + 0x0b, 0xcc, 0xc9, 0x58, 0x17, 0xb1, 0x22, 0x98, 0x9e, 0x0b, 0x2b, 0xc4, + 0x66, 0xfb, 0x9c, 0x0f, 0xa8, 0x71, 0x32, 0x3d, 0x22, 0x3b, 0x5d, 0x7d, + 0x5a, 0xe5, 0x40, 0x11, 0xba, 0xca, 0x9d, 0x6f, 0x0a, 0xc9, 0x4c, 0xfe, + 0x1d, 0x41, 0x3b, 0x66, 0x90, 0x8f, 0x1f, 0xd7, 0x1c, 0xbf, 0xf0, 0x3f, + 0x4e, 0xff, 0xac, 0x52, 0x66, 0xb5, 0xdb, 0x35, 0x3a, 0xdc, 0x50, 0x3f, + 0xf4, 0xcf, 0x3b, 0x39, 0xc0, 0xe0, 0xb7, 0x4b, 0x7d, 0x11, 0x10, 0x87, + 0xdf, 0xf7, 0xd9, 0x8c, 0x17, 0x28, 0x00, 0x53, 0x9e, 0x90, 0x07, 0x85, + 0x66, 0x52, 0xd8, 0x84, 0xb0, 0x9a, 0x57, 0x4b, 0xf6, 0x74, 0x5e, 0xde, + 0x6c, 0x33, 0x60, 0x8d, 0xe6, 0x0f, 0x29, 0x54, 0x36, 0x9a, 0xbd, 0xc6, + 0x65, 0x62, 0x42, 0x3b, 0x5f, 0x2f, 0x57, 0x20, 0x26, 0x4e, 0xc3, 0x10, + 0x07, 0xce, 0x1f, 0x28, 0xa5, 0x67, 0xe6, 0x35, 0x1e, 0x8c, 0x32, 0x05, + 0x9d, 0x85, 0xe3, 0x9d, 0x7f, 0x74, 0x34, 0x0f, 0xfd, 0xa3, 0x98, 0x42, + 0x44, 0xf0, 0x16, 0x27, 0xe3, 0x39, 0x35, 0xec, 0x6f, 0x6f, 0x33, 0xf5, + 0x68, 0x19, 0x83, 0xa4, 0x40, 0xbd, 0x1f, 0xf8, 0x4b, 0x0e, 0x9b, 0x2d, + 0x7c, 0x41, 0x85, 0xec, 0x2f, 0x72, 0xa5, 0xa0, 0x4a, 0x47, 0x55, 0x94, + 0xc6, 0x17, 0x18, 0x6c, 0xfd, 0x03, 0x44, 0x1b, 0xae, 0xeb, 0xb6, 0xdf, + 0x05, 0x5d, 0xa6, 0x99, 0xb3, 0x53, 0xcb, 0x67, 0x77, 0x85, 0xb6, 0xb2, + 0xab, 0x8d, 0x7a, 0x64, 0xb9, 0xfe, 0xda, 0xd2, 0xad, 0x18, 0x86, 0x7b, + 0xe5, 0x98, 0x7e, 0x08, 0x4b, 0x78, 0x38, 0xde, 0x23, 0x23, 0x10, 0x76, + 0x0d, 0x61, 0xf6, 0x86, 0xd6, 0xba, 0xb6, 0xb8, 0x98, 0x0c, 0xca, 0xe6, + 0x17, 0xb6, 0x08, 0x58, 0x42, 0xef, 0x9d, 0x12, 0x51, 0xef, 0x52, 0x28, + 0xf8, 0xb5, 0x19, 0x82, 0xe1, 0x6f, 0x5f, 0xfa, 0x2c, 0x80, 0x9c, 0xe8, + 0x30, 0x74, 0x8c, 0x78, 0x63, 0x47, 0x91, 0xda, 0x1f, 0x4f, 0x59, 0x24, + 0x92, 0x76, 0xc3, 0x3c, 0x19, 0x18, 0xa9, 0x15, 0xbc, 0x18, 0xd0, 0xb4, + 0x15, 0xd7, 0x46, 0xed, 0x73, 0xa5, 0xdd, 0xcb, 0x28, 0x8a, 0xe8, 0x68, + 0x80, 0xfb, 0x44, 0x3f, 0x9c, 0x60, 0xf6, 0x21, 0x3e, 0xf3, 0x9e, 0x46, + 0x99, 0x0f, 0x55, 0x24, 0xd7, 0xa4, 0xa1, 0x5e, 0x42, 0x20, 0xf2, 0xf9, + 0x99, 0x42, 0x93, 0x39, 0xf2, 0x66, 0x2e, 0x47, 0x1e, 0x5b, 0x22, 0xb8, + 0xc7, 0x38, 0x45, 0x16, 0x47, 0x08, 0x88, 0xb4, 0xbf, 0xc2, 0xc3, 0x7e, + 0x58, 0x31, 0xad, 0xb0, 0xa6, 0x9b, 0x12, 0x0f, 0xb5, 0x18, 0x3c, 0x2e, + 0x46, 0x05, 0xba, 0x85, 0x9b, 0x1f, 0xdf, 0x47, 0xeb, 0xe7, 0x09, 0x41, + 0x2d, 0x9f, 0xcb, 0x5c, 0xa1, 0xc4, 0x0e, 0xb1, 0x7c, 0x50, 0x11, 0x0a, + 0x4d, 0x50, 0x8a, 0x29, 0x5a, 0x89, 0x02, 0xa5, 0xda, 0x3b, 0x6e, 0x0d, + 0x29, 0xba, 0xa5, 0xde, 0xac, 0x0f, 0x3b, 0xa3, 0xb5, 0xf2, 0x29, 0x38, + 0xe1, 0xbc, 0x90, 0x31, 0xb8, 0xe6, 0x13, 0xf6, 0x11, 0xd5, 0x4f, 0xd3, + 0xfa, 0xac, 0x92, 0xa7, 0x1d, 0x01, 0x47, 0x07, 0xe1, 0x1c, 0xf9, 0xc5, + 0x70, 0x6c, 0xf9, 0x1c, 0x4e, 0xdd, 0x97, 0x6c, 0xac, 0xa4, 0xd4, 0x1f, + 0x71, 0xde, 0xac, 0x7c, 0x8d, 0x7f, 0x12, 0x63, 0x40, 0x79, 0x6b, 0x78, + 0x78, 0xf9, 0x8b, 0x67, 0xe0, 0xfe, 0x0a, 0xfc, 0xc2, 0x3a, 0x8d, 0x02, + 0xcf, 0x89, 0xa1, 0xb1, 0x1c, 0x1e, 0x6e, 0xaf, 0x94, 0xef, 0x24, 0xee, + 0xd4, 0xd1, 0x95, 0xe2, 0x85, 0xab, 0x24, 0xe7, 0x85, 0xd1, 0xbd, 0xe0, + 0x2c, 0xdc, 0x27, 0x3e, 0x51, 0x9e, 0x9f, 0x77, 0xf8, 0xca, 0x52, 0x2d, + 0x00, 0xb6, 0xcd, 0xb6, 0x38, 0x3a, 0xfd, 0xb8, 0x1c, 0x10, 0x31, 0xe3, + 0x87, 0x90, 0xa1, 0x74, 0x84, 0x26, 0x09, 0xcf, 0x5f, 0x5b, 0xf3, 0x43, + 0x76, 0x50, 0xbc, 0x91, 0x71, 0x94, 0x8d, 0x2c, 0xe3, 0x0b, 0x88, 0xff, + 0x50, 0x04, 0xac, 0x3d, 0x96, 0x17, 0x7e, 0x6f, 0xcd, 0xc9, 0x77, 0x50, + 0x48, 0x1c, 0x3b, 0x7a, 0x95, 0x27, 0x3e, 0x1f, 0x7d, 0x2a, 0x70, 0x1d, + 0xa9, 0x57, 0x47, 0x9c, 0x20, 0x84, 0x8b, 0xe1, 0x97, 0x80, 0x9d, 0xd9, + 0xf8, 0xb4, 0x5c, 0xea, 0xbb, 0x31, 0x5a, 0x48, 0x33, 0xa5, 0x46, 0x69, + 0x92, 0x76, 0x71, 0x1e, 0x14, 0xec, 0x5b, 0x07, 0xbd, 0x91, 0xc7, 0x18, + 0xc3, 0x97, 0xe3, 0x1e, 0x0d, 0x4b, 0xe2, 0x0c, 0x25, 0xf4, 0xbe, 0xb3, + 0x7a, 0xa2, 0xdf, 0x4f, 0x2c, 0x2b, 0x0f, 0x88, 0xa2, 0x1a, 0xfc, 0xe9, + 0x65, 0x19, 0x23, 0xbb, 0xc3, 0xdb, 0x39, 0x85, 0x30, 0x8f, 0x49, 0x7e, + 0x88, 0xc1, 0x44, 0x0b, 0x99, 0xfb, 0x29, 0x15, 0x06, 0x00, 0x7e, 0x77, + 0x41, 0xc3, 0xc6, 0x7a, 0x09, 0x0d, 0x78, 0x29, 0xe4, 0x4b, 0x0a, 0x2c, + 0x78, 0x22, 0x10, 0x22, 0x43, 0xf0, 0x2e, 0x1c, 0x82, 0x24, 0x24, 0x23, + 0x41, 0x84, 0xdb, 0xc6, 0x19, 0x39, 0xbf, 0xb8, 0x4e, 0x22, 0xfa, 0xe6, + 0x89, 0x21, 0x57, 0x29, 0xa3, 0x6e, 0xc7, 0xb5, 0xc0, 0xaf, 0xc8, 0xa8, + 0xbd, 0x20, 0xf2, 0x32, 0xe0, 0x88, 0x39, 0xe6, 0x1c, 0xea, 0xa0, 0xdb, + 0xce, 0xd9, 0x2e, 0xd9, 0x00, 0xb9, 0xad, 0xd0, 0xd2, 0x68, 0xa5, 0x2b, + 0x04, 0x8d, 0xa4, 0x9c, 0x4e, 0xdc, 0xf7, 0x27, 0x56, 0xc7, 0x73, 0x4a, + 0xec, 0xf3, 0xd7, 0x9a, 0x52, 0xb7, 0x62, 0xa6, 0x2c, 0xa1, 0xe0, 0xb4, + 0x67, 0x16, 0x4c, 0xf8, 0x04, 0x5a, 0xa9, 0xf1, 0xf6, 0x8f, 0x49, 0x89, + 0x81, 0x62, 0x7d, 0x3e, 0x55, 0x0f, 0x4e, 0xb0, 0xb7, 0xec, 0xeb, 0x3d, + 0xb0, 0x73, 0x29, 0x81, 0x4b, 0x07, 0xa0, 0xce, 0x2b, 0x6a, 0x22, 0x75, + 0x70, 0x9f, 0x51, 0xde, 0x9e, 0xee, 0xe4, 0x65, 0xbf, 0x16, 0x1c, 0xfc, + 0xba, 0x93, 0xba, 0x48, 0x54, 0x22, 0x8e, 0xac, 0x7f, 0xac, 0xb4, 0xd8, + 0x65, 0x93, 0x65, 0x4a, 0x56, 0x8f, 0x1a, 0xa6, 0xe1, 0x9c, 0x2f, 0xab, + 0x87, 0x06, 0xd4, 0x32, 0xa5, 0xbd, 0x3c, 0x41, 0xa2, 0xd0, 0x42, 0x85, + 0x95, 0xdd, 0xb9, 0xaf, 0x1f, 0x20, 0xe2, 0xdd, 0x59, 0x66, 0xc9, 0x0d, + 0xb9, 0xea, 0x19, 0x4c, 0xb0, 0x00, 0xd1, 0xe5, 0x29, 0xa2, 0x40, 0x2f, + 0xf8, 0x0b, 0xde, 0x78, 0x52, 0xcb, 0x72, 0x81, 0xd6, 0xdf, 0x38, 0x03, + 0xe0, 0xba, 0xa8, 0xbf, 0x84, 0x7c, 0xcd, 0xeb, 0x2b, 0x43, 0x17, 0x34, + 0x9a, 0xab, 0x5b, 0xf4, 0xd3, 0x0c, 0x89, 0xb0, 0x47, 0x05, 0xaa, 0x89, + 0x3f, 0x34, 0x53, 0x28, 0x8e, 0xe1, 0x6c, 0x6b, 0xc7, 0x0b, 0x1f, 0x49, + 0xd2, 0x92, 0xe3, 0x71, 0x4b, 0x34, 0xc7, 0x59, 0x6f, 0x93, 0x0d, 0x43, + 0xd9, 0xc1, 0x0a, 0xfc, 0x85, 0xc8, 0x5a, 0x91, 0xd9, 0x8d, 0x71, 0x22, + 0x0c, 0xe5, 0x65, 0xde, 0x66, 0x29, 0xcd, 0x00, 0xf2, 0x1d, 0x72, 0x37, + 0xb8, 0xf7, 0x9b, 0xb0, 0xf3, 0x9e, 0xdb, 0xfb, 0x0f, 0x4f, 0xa1, 0xcc, + 0x22, 0xe5, 0x4d, 0x27, 0xa7, 0x80, 0xb7, 0x16, 0x8c, 0x96, 0xf5, 0xd2, + 0x59, 0xfb, 0x31, 0xfc, 0x8b, 0x1f, 0xf0, 0x83, 0x42, 0x1d, 0x42, 0xf6, + 0xc5, 0x01, 0xcd, 0x53, 0xe5, 0x13, 0xc0, 0x3b, 0x85, 0xa6, 0x3a, 0xc4, + 0x04, 0x61, 0x7e, 0x26, 0xd5, 0xf8, 0x02, 0xb7, 0xc6, 0xc4, 0x61, 0xa8, + 0x1d, 0x52, 0xb6, 0xf4, 0x43, 0x94, 0x76, 0x6c, 0x81, 0x1e, 0x96, 0x10, + 0xb3, 0x2e, 0x4c, 0x4a, 0xf7, 0x6a, 0x32, 0xa5, 0xef, 0x55, 0x61, 0x0d, + 0x0d, 0x06, 0x5e, 0x65, 0x54, 0x6f, 0x4f, 0xb7, 0x69, 0x9d, 0xf2, 0x3b, + 0x90, 0x6b, 0xa9, 0xdb, 0xbd, 0x2b, 0xe1, 0x05, 0xc6, 0x4e, 0x78, 0xb6, + 0xdd, 0x6a, 0xbf, 0x59, 0xb9, 0xbb, 0x09, 0xc9, 0xd5, 0x1b, 0xb4, 0x7b, + 0xf0, 0x96, 0xdb, 0x59, 0x41, 0x93, 0x3a, 0x45, 0x0d, 0xc0, 0x09, 0xcd, + 0xfd, 0x38, 0x06, 0x92, 0x1b, 0x34, 0x48, 0x50, 0xbc, 0x10, 0x53, 0x05, + 0x11, 0x0f, 0x19, 0x7b, 0x0f, 0x99, 0x38, 0x08, 0xe2, 0xec, 0xf0, 0x97, + 0x60, 0x4f, 0x28, 0xb7, 0x4f, 0x4a, 0x29, 0x2f, 0xac, 0x94, 0x2e, 0x14, + 0x4b, 0x1f, 0x07, 0x51, 0xdb, 0xb5, 0x16, 0x78, 0xc5, 0xfc, 0xdd, 0x4d, + 0x41, 0xab, 0xcb, 0x4f, 0xe4, 0x35, 0xc6, 0xd3, 0xa8, 0x27, 0xfe, 0x46, + 0x86, 0x9b, 0x49, 0x64, 0x4f, 0xb5, 0xf4, 0x81, 0x1f, 0x3a, 0x32, 0x94, + 0x19, 0x16, 0xcd, 0x09, 0xaf, 0xbc, 0xf3, 0xa9, 0x72, 0xd1, 0x27, 0xee, + 0xae, 0xf7, 0x3f, 0x3c, 0xd9, 0x4b, 0x94, 0x99, 0xd4, 0x13, 0x17, 0x3d, + 0x68, 0x86, 0xf8, 0x42, 0x2d, 0xdc, 0xc5, 0xc3, 0xad, 0x79, 0x23, 0x18, + 0xa2, 0x31, 0x20, 0x7d, 0xb7, 0x3e, 0x06, 0xb7, 0x1a, 0xf7, 0x7f, 0xf8, + 0xbc, 0xe9, 0xba, 0xba, 0xeb, 0xfa, 0xcf, 0xcf, 0xf7, 0xe0, 0x05, 0x1b, + 0xf7, 0x7b, 0x87, 0x45, 0xae, 0x61, 0x36, 0x3e, 0xb3, 0x8d, 0xe5, 0x67, + 0x5e, 0xe6, 0x0c, 0xb6, 0xe9, 0xe8, 0x00, 0x3a, 0x5b, 0x80, 0xf2, 0x73, + 0x99, 0x84, 0x33, 0x7d, 0x97, 0x65, 0x48, 0x81, 0xe0, 0xa9, 0x98, 0xf2, + 0x98, 0x37, 0x8f, 0x8c, 0x51, 0x31, 0x96, 0xcb, 0xf5, 0x62, 0xf6, 0x47, + 0x43, 0x4f, 0xd8, 0xf5, 0xa0, 0xaa, 0x19, 0x12, 0x91, 0xad, 0xbb, 0x5c, + 0x87, 0x96, 0x94, 0xe6, 0xba, 0x00, 0x1f, 0x26, 0x27, 0x21, 0xba, 0x23, + 0x01, 0xa8, 0xaa, 0x17, 0x7a, 0xb4, 0x55, 0xca, 0xba, 0xbe, 0x59, 0x0d, + 0x1f, 0x54, 0x43, 0x1a, 0xdb, 0x28, 0x1b, 0x5a, 0x77, 0x94, 0xb3, 0x3f, + 0x1e, 0x20, 0x0f, 0xc5, 0x6a, 0x2f, 0xf2, 0xe7, 0xdf, 0x37, 0xab, 0x3f, + 0x2e, 0xb2, 0xe3, 0x86, 0x68, 0xc3, 0x5c, 0x2a, 0x39, 0xb0, 0x31, 0x1e, + 0xcf, 0x1d, 0xa4, 0x38, 0x8a, 0x4a, 0x26, 0x32, 0x2b, 0xea, 0x8c, 0xc0, + 0xc6, 0xe7, 0x80, 0xca, 0xea, 0x92, 0x44, 0xad, 0x6b, 0xcf, 0x92, 0xfd, + 0xf9, 0x13, 0xfc, 0x3e, 0xf5, 0xcd, 0xd6, 0x53, 0x35, 0xf6, 0x6c, 0x6f, + 0x9d, 0x4f, 0xf1, 0xa1, 0x1d, 0xce, 0x14, 0xe5, 0xc0, 0x36, 0x79, 0x14, + 0x5c, 0x9b, 0x57, 0x55, 0xd2, 0x04, 0xd1, 0x74, 0x61, 0xa6, 0x89, 0x41, + 0x2d, 0xd4, 0x34, 0x1c, 0xe1, 0xf7, 0x23, 0x0c, 0x3d, 0x7b, 0x0a, 0xf3, + 0xca, 0x6c, 0xd7, 0x65, 0x1c, 0x93, 0xde, 0xe3, 0x66, 0xfb, 0xcb, 0x79, + 0x7c, 0x73, 0x8b, 0xcf, 0x44, 0x07, 0x58, 0x66, 0x29, 0xd6, 0x0c, 0x10, + 0xbe, 0xda, 0x38, 0x12, 0xf9, 0xb1, 0x15, 0xa4, 0x8f, 0xbf, 0xf0, 0x05, + 0xe9, 0x48, 0x6f, 0x7f, 0xd8, 0x88, 0x25, 0xa4, 0xbf, 0x5d, 0xf5, 0x6a, + 0x17, 0x7c, 0x94, 0xbb, 0xff, 0x05, 0xdd, 0xbc, 0xe0, 0xbf, 0xd6, 0xeb, + 0x2f, 0x8c, 0x9a, 0x84, 0xdf, 0x40, 0x2c, 0x5e, 0xa3, 0x18, 0xdf, 0x64, + 0x45, 0x44, 0xbd, 0x6a, 0x74, 0x6d, 0xb8, 0x19, 0xb8, 0x77, 0x60, 0x6d, + 0xae, 0x7f, 0xe9, 0x5d, 0xa8, 0xd2, 0x6d, 0x92, 0x8b, 0xa9, 0x40, 0x17, + 0x69, 0xbf, 0x72, 0xb1, 0x11, 0x49, 0x51, 0x2d, 0x81, 0x7e, 0x7d, 0x89, + 0xa5, 0x71, 0x47, 0x2a, 0x9c, 0xe3, 0x69, 0x01, 0xf0, 0xc6, 0x74, 0x0e, + 0x40, 0x61, 0x55, 0x1a, 0x43, 0xba, 0x3a, 0xf1, 0x08, 0x29, 0x44, 0x9d, + 0x51, 0x16, 0x30, 0x4f, 0xff, 0x4e, 0xc1, 0xe4, 0x53, 0xc7, 0x1c, 0x34, + 0x5e, 0x08, 0x7f, 0xdc, 0x0c, 0x35, 0xef, 0xaa, 0x7b, 0x4c, 0x89, 0x14, + 0xc6, 0x1e, 0x65, 0xb6, 0x99, 0x82, 0x11, 0x33, 0xbb, 0x6b, 0xee, 0xa7, + 0xb9, 0x1e, 0xe4, 0x37, 0x0a, 0x37, 0xb8, 0xa6, 0xa2, 0xb0, 0xfe, 0x12, + 0x99, 0x9e, 0x43, 0xec, 0x35, 0x64, 0x79, 0x7e, 0x43, 0x2d, 0xa3, 0xcc, + 0xbf, 0xcb, 0x63, 0x9f, 0xc1, 0xf0, 0x36, 0x79, 0xd5, 0x1e, 0x43, 0xb3, + 0x3f, 0x47, 0xf5, 0x03, 0x29, 0x06, 0xec, 0x9d, 0x32, 0xdd, 0x67, 0x19, + 0xcb, 0x7d, 0x75, 0x98, 0x21, 0x5e, 0xba, 0x2a, 0xd9, 0xd2, 0xce, 0x6f, + 0x46, 0xd4, 0x74, 0xc2, 0xd3, 0x13, 0x77, 0x9d, 0x3a, 0x95, 0x28, 0x6a, + 0x5a, 0xa1, 0x2c, 0xb5, 0x40, 0x3c, 0xdc, 0x78, 0x69, 0x5d, 0x99, 0x3e, + 0xf6, 0x0d, 0x36, 0xa2, 0x06, 0x13, 0xe4, 0xae, 0x1b, 0x7e, 0x24, 0x30, + 0x5f, 0x99, 0xff, 0x20, 0x94, 0x26, 0xd9, 0x97, 0x27, 0xe7, 0x26, 0x27, + 0x7a, 0x9d, 0x48, 0x9c, 0x97, 0x52, 0x82, 0x29, 0xba, 0x64, 0xc3, 0xb1, + 0xc4, 0x6f, 0xed, 0xf4, 0x03, 0x14, 0xf5, 0x30, 0x09, 0x59, 0x8d, 0x5e, + 0xb7, 0xed, 0x2f, 0x4a, 0xe8, 0x39, 0x8a, 0xb9, 0x9f, 0xc9, 0x80, 0xb9, + 0xc2, 0x77, 0x7a, 0x32, 0xd6, 0xa5, 0x4a, 0x7c, 0x86, 0x6a, 0x27, 0xf5, + 0xc3, 0x8b, 0xc5, 0x99, 0x6b, 0xfc, 0x5d, 0x8c, 0x1d, 0x37, 0x92, 0xa9, + 0x57, 0xf2, 0x64, 0xac, 0x2e, 0x7a, 0x26, 0xfa, 0x90, 0xf1, 0x61, 0x8b, + 0x8c, 0x22, 0x17, 0xbc, 0xf3, 0x49, 0x1f, 0x85, 0x19, 0xfb, 0x62, 0xe9, + 0xab, 0x61, 0x4d, 0xc3, 0x9a, 0x90, 0x6f, 0xb6, 0x30, 0x57, 0x99, 0x57, + 0x94, 0x4e, 0x6b, 0x8b, 0xa5, 0x1c, 0x8c, 0x70, 0x04, 0x40, 0xac, 0x4c, + 0x07, 0x22, 0x1a, 0x06, 0x1f, 0x17, 0xda, 0xb5, 0x1f, 0x26, 0x51, 0xfc, + 0x7c, 0x3f, 0x22, 0xcf, 0x82, 0x80, 0x7b, 0x3c, 0x7c, 0x38, 0x01, 0x1f, + 0xc9, 0xb1, 0x0e, 0x08, 0x0e, 0x04, 0xde, 0x82, 0xda, 0xf3, 0xd3, 0x25, + 0x74, 0xae, 0x21, 0xf9, 0xed, 0xe5, 0x5f, 0x32, 0xf2, 0x7f, 0xc5, 0x22, + 0x2b, 0x60, 0xbf, 0xf8, 0x34, 0xc7, 0xdd, 0x9a, 0x25, 0x09, 0xaa, 0xe2, + 0xae, 0x5f, 0xd0, 0x03, 0x76, 0x7e, 0xd8, 0x10, 0xc6, 0xcc, 0x04, 0xec, + 0xa8, 0xc9, 0xaf, 0xad, 0xf5, 0x86, 0x38, 0x54, 0x36, 0x94, 0xde, 0x58, + 0x01, 0xe6, 0x49, 0x63, 0x67, 0x69, 0x3f, 0x81, 0x95, 0x55, 0x39, 0x43, + 0x73, 0x2d, 0x6e, 0xe6, 0x07, 0xef, 0x0f, 0x71, 0x9a, 0x94, 0x8c, 0xf8, + 0x56, 0xb0, 0x7e, 0x93, 0x95, 0x30, 0x44, 0x3b, 0x4f, 0x5e, 0x04, 0x68, + 0xfc, 0x60, 0xb6, 0x6c, 0xbf, 0xc1, 0xad, 0x0f, 0x3e, 0x5f, 0x1a, 0x13, + 0xee, 0x5f, 0x70, 0xa9, 0x18, 0xd0, 0x64, 0x5c, 0x04, 0x91, 0xdf, 0xe0, + 0xcb, 0xcb, 0x1a, 0xa9, 0x44, 0xbc, 0xf8, 0x95, 0x4c, 0xae, 0x93, 0x23, + 0xc2, 0x8f, 0xf1, 0x80, 0x59, 0xb2, 0xe5, 0xa3, 0x66, 0xb7, 0x83, 0xad, + 0xaf, 0x41, 0xdf, 0xe2, 0xe1, 0x33, 0x44, 0x1d, 0xc0, 0xb5, 0xa9, 0x6a, + 0xaf, 0x2d, 0x99, 0x50, 0x64, 0xa1, 0x20, 0x85, 0x85, 0x1d, 0xbb, 0xb9, + 0x60, 0x65, 0x30, 0x13, 0x52, 0xa1, 0x1c, 0x27, 0xd6, 0xbe, 0x75, 0x74, + 0x1f, 0x76, 0x1a, 0x3d, 0xe7, 0x78, 0xb5, 0xf2, 0x82, 0x38, 0x81, 0x5d, + 0x7f, 0xad, 0x08, 0x9a, 0xe0, 0xac, 0x27, 0xf5, 0x0a, 0x2b, 0x1e, 0xe8, + 0x4b, 0x3e, 0xe5, 0x38, 0xa0, 0x55, 0x9b, 0xb1, 0x3d, 0xe8, 0x8a, 0xce, + 0x80, 0x4a, 0x20, 0xf9, 0xb5, 0x65, 0x5f, 0x05, 0xb0, 0x2c, 0xde, 0x71, + 0xba, 0x31, 0x37, 0xfb, 0x67, 0xb7, 0xa8, 0xf8, 0xcc, 0xc4, 0xd6, 0x93, + 0xae, 0xc3, 0x4a, 0x85, 0x43, 0x41, 0x57, 0x14, 0x27, 0xf6, 0xa7, 0xc7, + 0x18, 0x27, 0xc5, 0x03, 0x55, 0x93, 0xf9, 0x92, 0xb5, 0x71, 0xe8, 0x26, + 0x50, 0x0e, 0x84, 0xc4, 0x4b, 0x24, 0xca, 0x20, 0xec, 0x3b, 0x73, 0x71, + 0xed, 0xf4, 0xe7, 0x9d, 0x56, 0x03, 0xda, 0x4d, 0xd7, 0x6c, 0x58, 0xc7, + 0x5c, 0x0b, 0xaf, 0x98, 0xaf, 0xe2, 0xa4, 0x45, 0xa3, 0x87, 0xdb, 0xc6, + 0x27, 0x08, 0xdb, 0xc2, 0x33, 0xdc, 0x19, 0x1b, 0x0c, 0xda, 0x14, 0x70, + 0xc2, 0x93, 0xcc, 0xfc, 0x4d, 0xb4, 0xb0, 0x66, 0x2c, 0x93, 0x91, 0xd0, + 0x07, 0xca, 0x8c, 0x41, 0x07, 0xb0, 0xfa, 0xa4, 0x58, 0x32, 0x8d, 0x0d, + 0xf9, 0x43, 0x6d, 0x88, 0xa8, 0x46, 0x42, 0x11, 0xcd, 0xaa, 0x6b, 0x0b, + 0x34, 0xd2, 0x68, 0x29, 0x03, 0xab, 0x37, 0x58, 0xc5, 0xc2, 0xd3, 0x38, + 0xa3, 0xb8, 0x20, 0x5c, 0x75, 0x6e, 0x36, 0xa1, 0x64, 0x38, 0x48, 0x48, + 0x5f, 0x5d, 0x1f, 0x2e, 0x4d, 0x6d, 0x0f, 0xf6, 0x1a, 0xe2, 0xec, 0x87, + 0x34, 0x65, 0xd5, 0xef, 0x08, 0xc6, 0xdc, 0x73, 0x11, 0xed, 0xc2, 0x7b, + 0x38, 0x5f, 0x4e, 0xf4, 0x94, 0x0c, 0xbc, 0x22, 0x91, 0x20, 0x5c, 0xb1, + 0x72, 0x70, 0xfd, 0xdb, 0xa7, 0xf8, 0x9b, 0x2a, 0xbd, 0x26, 0x7d, 0xae, + 0x44, 0x41, 0x47, 0xea, 0xd0, 0x62, 0x88, 0x5b, 0xc2, 0x61, 0x67, 0x59, + 0x75, 0x15, 0x57, 0xa2, 0x66, 0xa4, 0x84, 0xef, 0xfa, 0x95, 0xe9, 0x5f, + 0xd3, 0x0d, 0x31, 0x95, 0xe9, 0x72, 0xc7, 0xd2, 0x1f, 0x4b, 0x14, 0x2c, + 0x0b, 0x1f, 0x63, 0xbc, 0xea, 0xbe, 0x60, 0xcb, 0x53, 0xa6, 0x37, 0xaa, + 0x85, 0xf2, 0x38, 0xa5, 0x2c, 0xe5, 0x42, 0xb7, 0xe4, 0xf2, 0xe6, 0xaf, + 0xd6, 0xbd, 0x60, 0x17, 0x1a, 0x7a, 0xd8, 0x0c, 0x48, 0x8a, 0x38, 0xb0, + 0x06, 0x94, 0x4b, 0x02, 0xa9, 0x08, 0xed, 0x41, 0x01, 0x22, 0xc5, 0x6a, + 0x56, 0x80, 0x61, 0x8d, 0xa1, 0x60, 0x28, 0x65, 0x78, 0x0d, 0xc2, 0x36, + 0x8a, 0x52, 0x9d, 0xa0, 0x3f, 0x18, 0x30, 0xc5, 0xd2, 0xf3, 0xf2, 0xdd, + 0x5f, 0xfc, 0x30, 0x48, 0x76, 0x89, 0xb1, 0x47, 0x2d, 0xd0, 0x1b, 0x60, + 0x49, 0x1e, 0x31, 0xc9, 0x44, 0xd4, 0x56, 0xe4, 0xe1, 0x1d, 0x66, 0x07, + 0xf0, 0x6f, 0x1a, 0xc4, 0x6c, 0xaa, 0x7e, 0x65, 0x3f, 0xbf, 0x0c, 0x6a, + 0xd4, 0x6b, 0x06, 0x51, 0x02, 0x82, 0xb9, 0xda, 0x90, 0x51, 0x2e, 0x09, + 0x05, 0x5e, 0xb4, 0x9d, 0x61, 0x87, 0x2e, 0x96, 0x97, 0xab, 0x92, 0xc2, + 0x4a, 0xe1, 0xda, 0x07, 0x13, 0x55, 0x08, 0xc2, 0xb1, 0x50, 0xf0, 0xa7, + 0x76, 0xfb, 0x66, 0x60, 0xb3, 0xbc, 0x39, 0xd0, 0x41, 0x0f, 0x80, 0x49, + 0xea, 0xa5, 0xdd, 0x27, 0x81, 0xef, 0x9c, 0x47, 0x92, 0xf5, 0xd2, 0xbf, + 0x77, 0x6b, 0x6c, 0x1c, 0x54, 0xae, 0x05, 0x16, 0xf7, 0x1e, 0xef, 0x05, + 0xf3, 0x9b, 0xe0, 0x06, 0xc2, 0xe2, 0xe1, 0xed, 0x56, 0x3f, 0xa0, 0xb8, + 0x9d, 0x5c, 0xa6, 0x12, 0x59, 0xcb, 0xea, 0x61, 0xd1, 0x47, 0xec, 0x8d, + 0x1e, 0x03, 0xc4, 0xfb, 0x6d, 0x4a, 0x9f, 0xf8, 0xc2, 0xc3, 0x83, 0x49, + 0x3d, 0x43, 0x90, 0x4e, 0xc5, 0x89, 0x19, 0x0b, 0x62, 0xd1, 0xe7, 0x76, + 0xbe, 0x90, 0xcc, 0xd3, 0xcd, 0x14, 0xa6, 0xf1, 0x09, 0xfd, 0x8e, 0xb5, + 0x5e, 0x73, 0x9a, 0xde, 0xb8, 0xf3, 0x53, 0xeb, 0xc2, 0x77, 0x24, 0xc0, + 0xfd, 0x53, 0x4d, 0xf1, 0x91, 0xdc, 0x33, 0x09, 0x82, 0x23, 0xde, 0xdf, + 0x14, 0x92, 0x08, 0xa4, 0xa3, 0x98, 0x82, 0xf9, 0xe5, 0x9b, 0xc2, 0x95, + 0xbc, 0xea, 0xc0, 0xc1, 0x81, 0xa0, 0xba, 0x07, 0x94, 0xd8, 0xaf, 0x75, + 0x9d, 0xaa, 0x16, 0xc4, 0x40, 0xa5, 0x44, 0x5e, 0x48, 0x74, 0x2e, 0xb6, + 0xeb, 0x85, 0x09, 0x0d, 0xe4, 0x63, 0x80, 0xeb, 0xd7, 0x7f, 0x44, 0xfe, + 0x23, 0x0a, 0xc6, 0x60, 0x0b, 0x30, 0xb3, 0x76, 0x98, 0x46, 0xf9, 0x45, + 0x02, 0x44, 0x34, 0xb8, 0xdf, 0x69, 0xbc, 0x4f, 0xb1, 0xce, 0x86, 0x04, + 0xdb, 0xb1, 0x95, 0xf7, 0x25, 0x7f, 0x9b, 0xcf, 0x1b, 0x59, 0x30, 0x15, + 0xa2, 0xba, 0xaf, 0xfa, 0xd7, 0xe0, 0x1e, 0xb7, 0x59, 0x1c, 0x5d, 0xb3, + 0x32, 0x38, 0x79, 0xa1, 0x34, 0xde, 0x6f, 0x29, 0x38, 0x2e, 0x4d, 0x48, + 0x36, 0x2a, 0x87, 0x1b, 0xc6, 0xfd, 0x7c, 0x79, 0xfd, 0x5d, 0xe0, 0xbe, + 0xcf, 0x0b, 0x66, 0x9c, 0x2b, 0x5f, 0x94, 0x49, 0xce, 0xe5, 0x48, 0x42, + 0x25, 0x65, 0x05, 0xf5, 0xab, 0x7c, 0x03, 0xd6, 0xa7, 0x2b, 0x61, 0x38, + 0x5f, 0xd2, 0x7e, 0x82, 0x93, 0x11, 0x9e, 0x18, 0xf6, 0xc2, 0x9c, 0xb7, + 0xb6, 0x58, 0x82, 0x90, 0x59, 0x55, 0x42, 0x07, 0x0f, 0x35, 0xdd, 0x2c, + 0x63, 0xe0, 0xc3, 0x7a, 0x41, 0x2d, 0x01, 0x00, 0xb9, 0x6c, 0xea, 0xe0, + 0x9b, 0x45, 0x73, 0x9c, 0x5c, 0x49, 0xe7, 0xed, 0xe3, 0x3a, 0x8d, 0x29, + 0x05, 0x27, 0x27, 0x7e, 0x99, 0x2d, 0xf9, 0x51, 0x25, 0x22, 0x68, 0x6b, + 0xc3, 0x0c, 0x21, 0xee, 0xdd, 0x89, 0xee, 0xeb, 0x96, 0x64, 0xa1, 0x11, + 0x56, 0x49, 0x08, 0xd6, 0x3c, 0x73, 0x70, 0xbe, 0x4d, 0x1a, 0x69, 0xaa, + 0xaf, 0x40, 0x26, 0x9d, 0x67, 0xb9, 0x8a, 0x8e, 0x3b, 0xae, 0x1f, 0x3b, + 0xa7, 0x63, 0x83, 0x03, 0x53, 0xad, 0x95, 0x0a, 0xb1, 0xad, 0x84, 0x31, + 0x4f, 0xaf, 0xbb, 0xe7, 0x76, 0xe6, 0x8b, 0xcf, 0xa4, 0x62, 0x98, 0x9b, + 0x45, 0x7d, 0x7e, 0x7b, 0x95, 0x47, 0x3a, 0x57, 0x6c, 0xa1, 0x6a, 0x02, + 0x57, 0xc5, 0xb2, 0x87, 0xc3, 0xa6, 0x18, 0x1e, 0xa3, 0xbe, 0xa3, 0x25, + 0x43, 0xeb, 0x74, 0x96, 0xf4, 0x1b, 0x83, 0x6d, 0xd1, 0xcf, 0x0b, 0xfa, + 0xd4, 0x37, 0xb2, 0xaf, 0x5e, 0x37, 0x0e, 0x16, 0x3c, 0x1f, 0x1c, 0x62, + 0xf8, 0xa3, 0xf9, 0x78, 0x8e, 0xb8, 0xe5, 0x9d, 0x2d, 0xb0, 0x48, 0x14, + 0x04, 0x52, 0xb8, 0x2e, 0x82, 0xd6, 0xd0, 0x7d, 0x87, 0xf9, 0x26, 0x0a, + 0x72, 0xb4, 0xe1, 0x8e, 0xac, 0xda, 0xef, 0x8e, 0x7c, 0x9d, 0x93, 0x1d, + 0x81, 0x1f, 0x10, 0xaf, 0x7d, 0x91, 0xfc, 0xbe, 0x7d, 0x9d, 0xba, 0x8a, + 0x96, 0xeb, 0x9f, 0x45, 0x2a, 0x46, 0xeb, 0x73, 0xfe, 0xdd, 0x1e, 0x70, + 0x28, 0x1b, 0x66, 0x6b, 0x60, 0xd7, 0x07, 0xea, 0xf6, 0xfb, 0xa5, 0xd8, + 0xf1, 0x02, 0xa9, 0x14, 0xc5, 0xc9, 0xdd, 0xda, 0x8c, 0xf7, 0x1b, 0x53, + 0xe9, 0xfb, 0xf1, 0xfb, 0xaf, 0x11, 0x18, 0x8c, 0xcf, 0x8f, 0xe1, 0x68, + 0xd4, 0x54, 0x14, 0x84, 0x08, 0x31, 0xda, 0xaa, 0x3b, 0xb0, 0x73, 0xf5, + 0xa9, 0x02, 0xa7, 0x45, 0x00, 0x0f, 0x4c, 0x40, 0xa7, 0xa2, 0x56, 0x90, + 0x38, 0x60, 0x8a, 0x30, 0xe2, 0xe4, 0x33, 0xc0, 0xec, 0xef, 0x8e, 0xeb, + 0xd9, 0x55, 0xe8, 0xef, 0x91, 0xfc, 0xd9, 0x95, 0x7d, 0x73, 0x2a, 0x7a, + 0x1a, 0x1f, 0x75, 0x3e, 0xfb, 0xd7, 0xf7, 0x1a, 0xa0, 0x65, 0x13, 0x76, + 0x07, 0xcb, 0xa6, 0xfb, 0x29, 0x28, 0xe0, 0x2a, 0xf5, 0xb4, 0xa5, 0x88, + 0x61, 0xcd, 0xb0, 0x7d, 0x02, 0x0e, 0xd0, 0x8e, 0xa7, 0x23, 0x20, 0x1b, + 0x0b, 0x8c, 0x0c, 0x1c, 0xa2, 0xd9, 0x2e, 0x7b, 0x7e, 0xca, 0x40, 0x6f, + 0xc9, 0xcc, 0xa9, 0x13, 0x16, 0x27, 0x6b, 0x84, 0x83, 0x6a, 0x7d, 0xc7, + 0x83, 0x36, 0xaa, 0x27, 0xd4, 0xdc, 0x4f, 0x6e, 0xbc, 0x3e, 0x54, 0xad, + 0x9f, 0xe2, 0xcb, 0x89, 0x9f, 0xde, 0x84, 0xeb, 0x96, 0x4e, 0xbe, 0xc0, + 0x9b, 0xdc, 0xe0, 0x4c, 0x86, 0x6b, 0xe6, 0x4f, 0x1e, 0x86, 0x42, 0xa8, + 0x76, 0x4a, 0x6d, 0x9a, 0xe6, 0xa6, 0xe8, 0x72, 0xfb, 0x08, 0xdb, 0x43, + 0xb1, 0x92, 0x0c, 0x23, 0x76, 0x81, 0xab, 0x8a, 0x4c, 0xd4, 0x90, 0xf3, + 0x66, 0xa1, 0x48, 0x01, 0x2a, 0x71, 0xc3, 0x97, 0xb1, 0xed, 0x81, 0x29, + 0x1e, 0x22, 0xbb, 0x21, 0x37, 0xbe, 0x98, 0x8a, 0xb6, 0xe3, 0x8b, 0x0c, + 0x4d, 0xb7, 0x2a, 0x4a, 0xab, 0x45, 0x6c, 0x7d, 0x51, 0x67, 0xb5, 0x0f, + 0x87, 0x64, 0xe4, 0xa9, 0x4e, 0x01, 0x08, 0x5c, 0xc8, 0xb1, 0xa5, 0x9f, + 0xad, 0xbc, 0x89, 0xea, 0x4a, 0xe9, 0x54, 0x86, 0x86, 0x61, 0x1d, 0x89, + 0x27, 0x9a, 0xe7, 0x5a, 0x76, 0xcb, 0xcf, 0xe2, 0x4f, 0x88, 0xd7, 0x16, + 0xa2, 0x3b, 0x88, 0xca, 0x44, 0xc1, 0x45, 0x60, 0x63, 0x87, 0x99, 0xab, + 0x58, 0x7f, 0xa0, 0xdb, 0xcc, 0xb5, 0x99, 0x01, 0x4c, 0xa4, 0x1d, 0xbc, + 0x98, 0x11, 0xea, 0x45, 0x1e, 0x4d, 0xf2, 0xf1, 0xe5, 0x37, 0xc9, 0x9f, + 0x6e, 0x8f, 0x87, 0x76, 0x41, 0x4e, 0x72, 0xf8, 0x4e, 0xf3, 0xa8, 0xd7, + 0x98, 0x34, 0xf8, 0x51, 0x7d, 0x1f, 0x72, 0x7b, 0xe8, 0x54, 0x92, 0x53, + 0x52, 0xcf, 0xe6, 0x8d, 0x86, 0x0a, 0x57, 0x5a, 0xd8, 0xc4, 0x92, 0x0f, + 0x8b, 0x63, 0x15, 0xea, 0x28, 0xef, 0x50, 0x1d, 0x80, 0x16, 0xcd, 0xf6, + 0x8e, 0xd8, 0x6a, 0x3c, 0xbf, 0x2a, 0x47, 0x00, 0xb0, 0xac, 0xcc, 0x7e, + 0x5b, 0x1b, 0xdc, 0x0c, 0x36, 0x86, 0xb7, 0x10, 0x18, 0x89, 0x61, 0x82, + 0x02, 0x28, 0xf4, 0x20, 0x3e, 0xa4, 0x5c, 0x32, 0x9e, 0x49, 0xa3, 0xe3, + 0xb7, 0x63, 0x77, 0x6c, 0x1b, 0xa8, 0x23, 0x11, 0x37, 0x3b, 0x73, 0x36, + 0x01, 0xf7, 0x68, 0x95, 0x78, 0xe4, 0x84, 0xc1, 0x72, 0x60, 0x00, 0x7f, + 0xde, 0xaa, 0x56, 0xe2, 0x03, 0x0d, 0x09, 0x92, 0x1f, 0x3b, 0x75, 0x7c, + 0x97, 0x50, 0x82, 0xcf, 0xfa, 0x5a, 0x37, 0x77, 0x0e, 0x79, 0xec, 0x91, + 0x03, 0x77, 0x2c, 0xf2, 0x9d, 0x96, 0x97, 0x2f, 0x28, 0xb7, 0xea, 0x9b, + 0x25, 0xec, 0x77, 0x2c, 0x46, 0x39, 0x31, 0x02, 0x09, 0x3b, 0x39, 0xe9, + 0x93, 0xf1, 0x4e, 0x6a, 0xf7, 0x8e, 0x90, 0x4b, 0xe6, 0xcf, 0x84, 0x7e, + 0x12, 0xcf, 0xaa, 0x0b, 0x72, 0x31, 0x44, 0x33, 0xbd, 0x73, 0x31, 0x16, + 0xde, 0x93, 0x42, 0xe4, 0x90, 0xcf, 0x66, 0x70, 0xe5, 0x75, 0xe9, 0xcd, + 0x17, 0xf9, 0xa6, 0x49, 0x41, 0x4f, 0x58, 0xcc, 0xb3, 0x23, 0x9d, 0x04, + 0x46, 0x92, 0x16, 0xce, 0xfc, 0x23, 0x86, 0xd7, 0xe7, 0x47, 0xb9, 0x27, + 0x08, 0xc2, 0x67, 0x51, 0xa4, 0x86, 0xca, 0xd9, 0x52, 0xef, 0x59, 0x01, + 0x15, 0x96, 0x42, 0x0b, 0x10, 0x44, 0x85, 0x79, 0xa6, 0x88, 0x1b, 0x8b, + 0xfc, 0xa3, 0x9f, 0x99, 0x20, 0x49, 0x43, 0xc6, 0x28, 0x14, 0x9b, 0xb4, + 0xc6, 0x41, 0x47, 0xf6, 0xe7, 0x43, 0xe5, 0xbd, 0x0a, 0x81, 0xa1, 0x66, + 0xc2, 0xfd, 0x79, 0x47, 0x8f, 0x6d, 0xee, 0x40, 0x37, 0xa9, 0xa0, 0x0f, + 0x71, 0x75, 0xbf, 0xd3, 0x74, 0xb1, 0x7d, 0x22, 0xab, 0xb3, 0x7a, 0x61, + 0x29, 0x27, 0x2d, 0x09, 0xb6, 0x4c, 0xab, 0x0c, 0x2c, 0x65, 0xa6, 0x2f, + 0xb9, 0x1e, 0xbb, 0xfb, 0x33, 0x68, 0x22, 0x74, 0xcd, 0x0b, 0x56, 0x4e, + 0x12, 0x8b, 0x27, 0x0c, 0x41, 0x8c, 0x06, 0x80, 0xd5, 0x85, 0xbd, 0x44, + 0xa1, 0x22, 0x7f, 0xcf, 0x06, 0x4b, 0x18, 0xd0, 0x6a, 0x1f, 0x5e, 0xea, + 0xce, 0x81, 0x7f, 0xc2, 0x89, 0x3d, 0xf5, 0x23, 0xc6, 0x4c, 0x8e, 0x88, + 0xc5, 0x3e, 0x1d, 0xdf, 0x45, 0x6e, 0xe1, 0x1d, 0xaa, 0xdc, 0x7a, 0xa0, + 0xb3, 0x3d, 0xb6, 0x61, 0x02, 0xa1, 0xec, 0xfa, 0x1e, 0xb6, 0xf4, 0x0d, + 0x3c, 0x43, 0xd9, 0xea, 0x54, 0x35, 0xeb, 0xe4, 0x4f, 0x1e, 0x62, 0xdf, + 0x4f, 0x42, 0x6f, 0x68, 0x48, 0x64, 0x7c, 0x33, 0x9e, 0xdb, 0x7b, 0xbc, + 0x47, 0x23, 0x55, 0xa8, 0x1a, 0x1c, 0xf7, 0x55, 0xfb, 0xfd, 0x18, 0x30, + 0x34, 0x63, 0x9d, 0x23, 0x58, 0x2c, 0x23, 0xbc, 0x23, 0x38, 0x5c, 0xcc, + 0x13, 0x8c, 0x20, 0x7d, 0x2b, 0x7e, 0x23, 0x67, 0xb9, 0xa7, 0x5f, 0x18, + 0x37, 0x11, 0xb9, 0x2d, 0x03, 0xd1, 0xdc, 0x1a, 0x13, 0x18, 0xca, 0xca, + 0x59, 0x26, 0x22, 0xa5, 0x0d, 0xb6, 0x66, 0xb2, 0x86, 0x16, 0x60, 0x2a, + 0xd2, 0xa2, 0x22, 0x21, 0xae, 0xb2, 0xe3, 0xdc, 0xa7, 0x15, 0x2f, 0x81, + 0xeb, 0x16, 0xd2, 0xc6, 0x31, 0x7f, 0x37, 0xa0, 0x81, 0xea, 0x5a, 0x49, + 0x74, 0xa9, 0x4c, 0x80, 0x5c, 0xa2, 0x6d, 0xf7, 0x08, 0xb8, 0x98, 0xb9, + 0x5d, 0xdb, 0xb7, 0x82, 0x2d, 0xd1, 0xf1, 0x26, 0x8a, 0xf9, 0xf8, 0x4e, + 0x9c, 0xaf, 0x39, 0xc3, 0xb3, 0xe4, 0xfd, 0xa6, 0x29, 0x60, 0x16, 0x37, + 0x03, 0x80, 0x75, 0x67, 0x5b, 0x68, 0x99, 0x9c, 0xd9, 0x0b, 0xa8, 0xdd, + 0x91, 0xe8, 0x3a, 0x3f, 0x35, 0x59, 0xa2, 0xbb, 0xa2, 0x82, 0x0c, 0xa4, + 0x55, 0x6f, 0xbb, 0x87, 0x9b, 0xfe, 0xa8, 0x40, 0x1c, 0x27, 0xdd, 0xa4, + 0x75, 0xe7, 0xf4, 0x85, 0xe6, 0xc2, 0x53, 0x0c, 0xbd, 0x78, 0xe3, 0x24, + 0x59, 0xfc, 0x0f, 0x22, 0x29, 0x4d, 0xa1, 0x36, 0x80, 0xa1, 0xbc, 0xce, + 0x9d, 0x9a, 0x75, 0xb6, 0x3c, 0x56, 0xb1, 0x0a, 0xd7, 0xbd, 0x1b, 0x1d, + 0xe9, 0xf8, 0x3d, 0xfc, 0xbb, 0x53, 0xf7, 0x9c, 0xe6, 0xc2, 0x7a, 0x8f, + 0xbe, 0x7d, 0x7e, 0x5b, 0xdc, 0x5e, 0x94, 0x88, 0x5f, 0x22, 0xee, 0x30, + 0xaa, 0xc7, 0x92, 0xcd, 0xcf, 0x37, 0x27, 0xc9, 0xeb, 0xb8, 0x51, 0xfa, + 0x7e, 0xab, 0x3c, 0x34, 0xb9, 0x30, 0x1c, 0x7b, 0xe5, 0xfd, 0x17, 0x83, + 0xb2, 0x36, 0xcf, 0x30, 0x80, 0x26, 0xdd, 0xb5, 0x26, 0x6b, 0x38, 0xe4, + 0x2d, 0x62, 0xbb, 0x43, 0x6c, 0xa7, 0x72, 0xea, 0xd7, 0xba, 0x57, 0x6b, + 0xc7, 0xd0, 0x0a, 0x03, 0x8a, 0x80, 0x93, 0x92, 0x8a, 0x9b, 0xdb, 0xc0, + 0x55, 0x2e, 0x10, 0x13, 0x4d, 0x5c, 0xe5, 0xcf, 0x7a, 0x0d, 0x14, 0x54, + 0x4c, 0x54, 0xda, 0xdf, 0x37, 0x6a, 0x58, 0xf8, 0x92, 0x51, 0x19, 0x48, + 0xf2, 0xcf, 0x3c, 0x22, 0x62, 0xcb, 0xce, 0x54, 0x00, 0xc7, 0x7e, 0xaf, + 0xbd, 0x7a, 0x1c, 0xef, 0x72, 0x94, 0x08, 0x05, 0x5e, 0xea, 0x7f, 0xc4, + 0x5b, 0x49, 0x94, 0x49, 0x8f, 0xb0, 0xb1, 0xae, 0x38, 0x36, 0x33, 0x95, + 0xf1, 0xe0, 0xd8, 0xab, 0xc4, 0xfa, 0xce, 0xe1, 0x60, 0x97, 0x00, 0x2a, + 0xdc, 0xed, 0x21, 0x24, 0x2d, 0x56, 0xac, 0xb5, 0x05, 0xc4, 0x1e, 0xcd, + 0x93, 0xf6, 0x03, 0xb1, 0xb5, 0x32, 0x8b, 0xbd, 0xd4, 0x27, 0x4d, 0x8d, + 0xb7, 0x98, 0x16, 0x79, 0x04, 0x12, 0x31, 0x04, 0xd8, 0xa2, 0x3a, 0x74, + 0x6c, 0x1f, 0x64, 0xa8, 0x45, 0xc7, 0x33, 0x9b, 0x8d, 0xd8, 0xb3, 0xd1, + 0xc3, 0xa5, 0x72, 0xeb, 0xe3, 0x09, 0xd9, 0xa5, 0x85, 0x0f, 0x8d, 0x3b, + 0x1a, 0x33, 0xe0, 0x93, 0xdf, 0x8b, 0x36, 0xa6, 0x3f, 0x48, 0x63, 0xbb, + 0xb2, 0xe9, 0xd9, 0x9c, 0x35, 0x48, 0x64, 0x6c, 0x89, 0xc0, 0x67, 0x38, + 0x6b, 0x21, 0xea, 0xcf, 0x49, 0xdc, 0x6e, 0x2f, 0x59, 0xec, 0x24, 0x14, + 0x7e, 0x2a, 0x54, 0x0a, 0xad, 0x29, 0x6d, 0x82, 0x70, 0xc3, 0x97, 0x1f, + 0x37, 0xbf, 0x62, 0xac, 0xad, 0x1a, 0x5f, 0x94, 0xbe, 0x60, 0x5d, 0x47, + 0x42, 0xdb, 0x6a, 0x66, 0x94, 0x15, 0x73, 0x8d, 0x71, 0x6c, 0xa1, 0xbf, + 0x87, 0x43, 0x7c, 0x39, 0x2f, 0xd6, 0xf4, 0x8e, 0xe4, 0x28, 0xd4, 0xa2, + 0x3c, 0xd7, 0x9d, 0x22, 0xfa, 0x74, 0x07, 0xe7, 0xab, 0x4b, 0xb6, 0x5b, + 0x39, 0x55, 0xe3, 0x03, 0x53, 0x6f, 0xd4, 0xd6, 0xc4, 0x9f, 0xa3, 0xf7, + 0x5b, 0xb2, 0xe3, 0xed, 0x7e, 0x23, 0x7f, 0x4c, 0x8a, 0xf4, 0x45, 0x3a, + 0x71, 0xff, 0xd9, 0x57, 0x5e, 0xfc, 0x32, 0x21, 0x64, 0xba, 0x7e, 0xd9, + 0xaa, 0x43, 0xe9, 0xd3, 0x0c, 0x7e, 0xb3, 0x8d, 0x8c, 0x53, 0xeb, 0x62, + 0xe5, 0xf6, 0xd2, 0x38, 0x2f, 0x61, 0xce, 0xb9, 0x83, 0x6f, 0x33, 0x28, + 0x18, 0x8f, 0x3a, 0x84, 0xb7, 0xfb, 0xb7, 0xa6, 0x93, 0xf2, 0xa1, 0x50, + 0x5d, 0xfb, 0x97, 0xfd, 0xb1, 0xe1, 0x4f, 0x70, 0x68, 0xb9, 0x8d, 0xc6, + 0xca, 0x8f, 0xe7, 0x95, 0x85, 0xfd, 0x6b, 0xdd, 0x8d, 0xcc, 0xfc, 0x08, + 0xb1, 0xc3, 0x6a, 0xd5, 0xcf, 0x66, 0x74, 0x5b, 0x90, 0x4d, 0xa4, 0xc5, + 0x5c, 0xc6, 0x60, 0x14, 0x80, 0x4a, 0x3c, 0x07, 0x2b, 0x81, 0x56, 0x67, + 0x07, 0x76, 0x7a, 0x3e, 0x3f, 0x28, 0x3d, 0xfd, 0xdc, 0x11, 0x08, 0xda, + 0x15, 0x7a, 0x4a, 0xcf, 0xa0, 0xb5, 0x88, 0x60, 0xd5, 0x9e, 0x58, 0xbf, + 0xdc, 0xb6, 0x25, 0x89, 0x33, 0x0f, 0x9a, 0xd2, 0xd4, 0xa7, 0x08, 0x33, + 0x76, 0x2f, 0x18, 0x8d, 0x6c, 0x15, 0xff, 0x44, 0xbd, 0xda, 0x39, 0xe4, + 0xf2, 0x61, 0xeb, 0x6b, 0xac, 0x0e, 0x12, 0xf2, 0xff, 0xb1, 0xf7, 0xe7, + 0x4d, 0x8e, 0x22, 0x69, 0xbe, 0x28, 0xfc, 0xff, 0x7c, 0x8a, 0xb8, 0x79, + 0x6d, 0xac, 0xbb, 0x46, 0x15, 0xc9, 0xbe, 0xd5, 0x4c, 0xb5, 0xbd, 0x80, + 0xd8, 0x04, 0xda, 0x40, 0x02, 0x89, 0xb1, 0x63, 0x65, 0x20, 0x56, 0xb1, + 0x8a, 0x1d, 0x1d, 0xbb, 0xe7, 0xb3, 0xbf, 0x8e, 0x14, 0x91, 0x19, 0x99, + 0x19, 0xb9, 0x54, 0x55, 0x76, 0x75, 0x4d, 0x9f, 0xce, 0x25, 0x42, 0x02, + 0x5f, 0x1e, 0x7f, 0xd6, 0xdf, 0xe3, 0x38, 0xee, 0x8b, 0x34, 0x50, 0x05, + 0x67, 0xd6, 0xe6, 0x0d, 0x03, 0x52, 0xf1, 0xa4, 0xe0, 0x91, 0x90, 0x35, + 0xe4, 0x51, 0x16, 0xb8, 0x08, 0x3b, 0x1e, 0xec, 0xdd, 0xf9, 0x7a, 0x26, + 0xa1, 0xf1, 0x50, 0xb1, 0xa9, 0xd3, 0xeb, 0xde, 0x76, 0x7b, 0x0e, 0x5d, + 0x3e, 0x99, 0xb1, 0x4b, 0x39, 0x5a, 0x84, 0xeb, 0xa5, 0xce, 0x64, 0xfb, + 0x70, 0xad, 0xee, 0xb7, 0xee, 0xc9, 0xe9, 0xcf, 0x73, 0x96, 0x54, 0x36, + 0xb6, 0x22, 0x68, 0x83, 0xd4, 0x18, 0xfb, 0xc6, 0x3b, 0x65, 0x24, 0x2f, + 0x5d, 0x47, 0x38, 0x9a, 0x65, 0xdd, 0xa1, 0x47, 0xb7, 0xf6, 0x61, 0x2c, + 0x73, 0xc6, 0x60, 0x0c, 0x34, 0xf6, 0xd6, 0x54, 0x9c, 0x8f, 0x0a, 0x7e, + 0xc1, 0xa5, 0x19, 0xb1, 0x75, 0x2c, 0x37, 0x86, 0x57, 0x17, 0xad, 0xcd, + 0xb6, 0x8b, 0x64, 0x58, 0x73, 0x73, 0xd9, 0xe5, 0x9a, 0x98, 0x85, 0x56, + 0xc1, 0x0a, 0x1e, 0x2f, 0x29, 0x26, 0xcf, 0xdb, 0x19, 0xcd, 0xc9, 0x3d, + 0x80, 0x72, 0x1c, 0x70, 0xaa, 0x73, 0x2b, 0x5f, 0xc5, 0xeb, 0x46, 0x39, + 0x24, 0x72, 0x38, 0xb4, 0x0d, 0x4a, 0x55, 0xe8, 0x62, 0xc5, 0xed, 0xb3, + 0xd5, 0x81, 0xf4, 0x45, 0x15, 0x45, 0xd5, 0x83, 0xde, 0x13, 0xf6, 0x61, + 0x66, 0x11, 0xe0, 0xd6, 0xa9, 0x5f, 0x5e, 0x5d, 0x7f, 0xbe, 0xde, 0xd6, + 0x23, 0x7c, 0x1d, 0x89, 0x70, 0x24, 0x5a, 0x77, 0x73, 0xda, 0x68, 0x29, + 0x31, 0x1f, 0xd4, 0x43, 0x79, 0x5a, 0x01, 0x6b, 0xb8, 0xba, 0xde, 0xf5, + 0x1c, 0xb9, 0xb8, 0x78, 0x85, 0xce, 0xed, 0x0e, 0xa3, 0x63, 0x31, 0xee, + 0x77, 0x98, 0x7a, 0x0a, 0x61, 0xb6, 0x99, 0xd3, 0x9b, 0x0b, 0x5b, 0x30, + 0x0a, 0x70, 0x7f, 0xdb, 0x19, 0x55, 0x30, 0x08, 0x85, 0x6d, 0x5d, 0xcc, + 0xdb, 0x2e, 0x56, 0xe7, 0x40, 0x5d, 0x64, 0x56, 0x6a, 0x6c, 0x4f, 0xb3, + 0x0b, 0xe5, 0xb4, 0x99, 0x4d, 0x5f, 0x67, 0xb1, 0x88, 0xca, 0xdb, 0x16, + 0x71, 0x81, 0x1b, 0x4e, 0x8a, 0x2d, 0x73, 0xe1, 0x17, 0xd9, 0xa5, 0xa7, + 0xf1, 0xb9, 0x37, 0xd3, 0xce, 0x45, 0xc9, 0xea, 0x57, 0x22, 0x12, 0xf7, + 0x24, 0x48, 0x59, 0xa1, 0xe5, 0x0c, 0x2b, 0x03, 0x54, 0x5a, 0xb1, 0xf1, + 0x72, 0x9f, 0xe0, 0x9b, 0x68, 0xa9, 0x07, 0x95, 0xd4, 0x69, 0xee, 0x4a, + 0x4d, 0x69, 0xb1, 0x8f, 0x2f, 0xe7, 0xf1, 0xd8, 0xaf, 0x38, 0xb1, 0x48, + 0xa7, 0x8c, 0xf9, 0x58, 0x14, 0x1b, 0x39, 0x21, 0x37, 0xb1, 0x7a, 0xe2, + 0x05, 0x77, 0x11, 0x35, 0x2d, 0x16, 0x76, 0x64, 0xc2, 0x71, 0x05, 0xb2, + 0x3e, 0x29, 0x8a, 0x8f, 0xe7, 0x70, 0x2c, 0x48, 0x89, 0x90, 0xf9, 0x1a, + 0xef, 0xf4, 0x36, 0xba, 0x17, 0x69, 0xd1, 0x22, 0xec, 0xd5, 0x89, 0xab, + 0xcf, 0xb0, 0x00, 0x49, 0x8c, 0xba, 0xa9, 0x85, 0x79, 0x5b, 0x31, 0xdb, + 0xc4, 0x0b, 0x75, 0x1e, 0x22, 0x55, 0xcd, 0xce, 0x3d, 0xc1, 0x3f, 0x37, + 0xa8, 0x9c, 0x5d, 0xc6, 0x4b, 0xa1, 0xfb, 0x87, 0x85, 0x41, 0x1e, 0xd5, + 0x8b, 0x3a, 0x3d, 0x99, 0xd2, 0x2f, 0x89, 0x40, 0xb5, 0xae, 0x2a, 0xf1, + 0xc5, 0xc9, 0x3f, 0x07, 0xc2, 0x4e, 0xe2, 0x17, 0xf9, 0xb5, 0x9e, 0x1b, + 0xeb, 0x3c, 0xcb, 0x0a, 0xe2, 0xa4, 0xa4, 0xe4, 0x82, 0x83, 0xa7, 0xc4, + 0x72, 0x46, 0x2e, 0x16, 0xe2, 0x8a, 0xaf, 0x4d, 0x1b, 0x28, 0xc3, 0x61, + 0x39, 0x3b, 0x38, 0x28, 0x4f, 0xef, 0x30, 0xd6, 0xa2, 0x28, 0x53, 0x5e, + 0x62, 0x32, 0x44, 0x31, 0x71, 0x9a, 0x53, 0x68, 0x80, 0x03, 0xf0, 0xa1, + 0xed, 0xec, 0x60, 0x29, 0x49, 0xa8, 0xd1, 0xe3, 0xb8, 0x60, 0xb1, 0xa2, + 0xec, 0x3b, 0xda, 0x85, 0x3b, 0x6c, 0xc3, 0x28, 0xe8, 0xfd, 0x42, 0x48, + 0xe8, 0x2d, 0x2b, 0x17, 0x1b, 0xed, 0xea, 0x69, 0x2d, 0x17, 0x24, 0x85, + 0x0f, 0xa2, 0x99, 0x6d, 0x9b, 0x1b, 0x8d, 0x10, 0x24, 0xb4, 0x0b, 0xf0, + 0x6d, 0x25, 0x31, 0x05, 0x45, 0xe8, 0xca, 0x3e, 0x8f, 0x66, 0xfb, 0x5c, + 0x0f, 0x39, 0x7e, 0x7d, 0x3a, 0x7a, 0x29, 0x2f, 0x5b, 0x87, 0x2a, 0x66, + 0x36, 0xbb, 0x45, 0xc6, 0xd4, 0xa8, 0x24, 0xa2, 0x6a, 0xa6, 0x5d, 0x59, + 0x67, 0x25, 0x4e, 0x8b, 0xa0, 0xb5, 0xb9, 0xe3, 0x56, 0xcb, 0x63, 0xe5, + 0x3b, 0x14, 0x4e, 0x61, 0x3e, 0xd1, 0x4b, 0x6e, 0x1a, 0x92, 0xf1, 0xc5, + 0x99, 0x23, 0x7b, 0x3e, 0x35, 0x96, 0xe1, 0x19, 0xbe, 0xe8, 0x6c, 0x2b, + 0x15, 0xae, 0x91, 0x31, 0xa4, 0x22, 0x91, 0x06, 0x15, 0x5f, 0x97, 0x0d, + 0x2b, 0x5e, 0xb7, 0x0a, 0xb8, 0x48, 0x34, 0xd9, 0xdc, 0xb2, 0x20, 0x0f, + 0xc0, 0xbc, 0xb5, 0xb0, 0x68, 0xfb, 0x25, 0x03, 0x2f, 0x87, 0x33, 0x1f, + 0xae, 0xd4, 0x2d, 0xe2, 0xc4, 0x82, 0x60, 0x5f, 0x2f, 0x31, 0x75, 0x56, + 0x28, 0x3f, 0x08, 0xed, 0xdc, 0x58, 0xb5, 0xee, 0x62, 0x38, 0x14, 0xba, + 0x90, 0xc7, 0x3b, 0x73, 0xdc, 0x2f, 0x3c, 0x23, 0x8c, 0xbd, 0x9d, 0x5a, + 0xa9, 0xd7, 0xf1, 0xb2, 0x47, 0xd8, 0x69, 0x2f, 0xc0, 0x40, 0xba, 0x16, + 0xc8, 0x9e, 0x5d, 0xef, 0x2e, 0x62, 0xd3, 0xf4, 0xd6, 0x18, 0x17, 0x68, + 0x64, 0x45, 0x5a, 0xbe, 0x5a, 0xed, 0xf6, 0x5e, 0x99, 0xda, 0xb3, 0xb0, + 0xb1, 0xf9, 0xf6, 0x38, 0x87, 0x64, 0x09, 0x3e, 0xb6, 0x02, 0x6c, 0xbb, + 0x1c, 0x92, 0x48, 0xd2, 0x09, 0x67, 0xad, 0x5e, 0x10, 0xbc, 0x66, 0xc7, + 0x9d, 0xb6, 0xce, 0x10, 0x8a, 0x19, 0x06, 0xf9, 0xcb, 0xce, 0xd8, 0x25, + 0xb3, 0x7c, 0xe8, 0x30, 0x9a, 0xa3, 0xd9, 0x21, 0xda, 0xe3, 0x4c, 0xd3, + 0xa7, 0xd2, 0x3a, 0xeb, 0x28, 0x87, 0x3b, 0x49, 0xc7, 0x90, 0x0b, 0x28, + 0xc9, 0x24, 0xb3, 0xf8, 0x48, 0x61, 0xe3, 0x70, 0x5e, 0xd7, 0x38, 0x1d, + 0x73, 0x09, 0x85, 0x5e, 0x21, 0xb2, 0x80, 0xe1, 0x22, 0x66, 0xa5, 0x4d, + 0x97, 0xc3, 0x62, 0x4f, 0x62, 0xda, 0x21, 0xc2, 0xb7, 0x4b, 0xd3, 0x20, + 0x43, 0x13, 0x6f, 0x57, 0x17, 0x62, 0xe9, 0x43, 0x9c, 0x8b, 0xfa, 0xc2, + 0x6c, 0xb9, 0xbf, 0x9a, 0x4e, 0xa4, 0x1d, 0xf7, 0xc2, 0x02, 0x57, 0x8e, + 0x17, 0x8a, 0xb6, 0x39, 0xa5, 0x4f, 0xb4, 0x50, 0xd1, 0x73, 0x86, 0xe4, + 0x61, 0xc2, 0xd2, 0xb4, 0xca, 0x44, 0xc3, 0x6a, 0x3e, 0x3f, 0x48, 0x55, + 0x6b, 0xb8, 0x98, 0xe5, 0xcc, 0x6c, 0x9b, 0xd2, 0xe3, 0xb9, 0x59, 0xae, + 0x1a, 0x52, 0x9c, 0x37, 0x46, 0xbe, 0xae, 0x7b, 0xe5, 0x82, 0x26, 0x42, + 0xb8, 0xc0, 0xb6, 0x68, 0x56, 0xaf, 0x2f, 0x41, 0x56, 0xa5, 0xdc, 0x26, + 0x4c, 0x17, 0x57, 0x6e, 0xbe, 0x77, 0x3b, 0xa0, 0xbf, 0x6b, 0xe8, 0x6a, + 0x19, 0xdb, 0x8b, 0x73, 0xde, 0x23, 0x69, 0x54, 0xe9, 0x02, 0x63, 0xc7, + 0x87, 0x2d, 0xd9, 0x5c, 0x35, 0xae, 0xe1, 0xf8, 0x62, 0xe9, 0xec, 0x71, + 0xb3, 0xe8, 0x0d, 0x92, 0x9d, 0x5f, 0x0c, 0x27, 0x3c, 0xc6, 0x33, 0xf3, + 0x84, 0x5b, 0x75, 0x05, 0x02, 0x73, 0xd9, 0x4b, 0xd0, 0xf9, 0x12, 0xd4, + 0xcb, 0xc4, 0x91, 0xca, 0x8b, 0x0e, 0x57, 0x4c, 0x6d, 0x14, 0xfa, 0x76, + 0x5f, 0xb6, 0x07, 0x95, 0xa8, 0x8e, 0x5a, 0xd2, 0x79, 0x62, 0x9c, 0x3b, + 0x22, 0xee, 0x8e, 0xfc, 0x56, 0x6d, 0x3d, 0x93, 0x88, 0x0c, 0x01, 0x6a, + 0x6c, 0x0f, 0x2a, 0x41, 0xfe, 0x6d, 0xe8, 0x74, 0xbf, 0x6a, 0xb0, 0x5d, + 0xc2, 0x2e, 0x77, 0x58, 0x85, 0xcc, 0x00, 0x3a, 0x30, 0xb1, 0x63, 0x9c, + 0x5d, 0x99, 0x79, 0x58, 0x6a, 0xf8, 0xac, 0xa2, 0x7a, 0x66, 0x5b, 0xa6, + 0xf5, 0x06, 0xb3, 0xe4, 0x05, 0x11, 0xe2, 0x66, 0xa5, 0x6e, 0xb1, 0x53, + 0xb1, 0xb9, 0x74, 0x36, 0x17, 0x14, 0xb4, 0xad, 0xf4, 0xa7, 0x0e, 0x3b, + 0x50, 0x4a, 0x94, 0x6c, 0xa7, 0x37, 0x86, 0x7a, 0x32, 0x3f, 0x31, 0xad, + 0xe5, 0xe6, 0xae, 0x7b, 0xb9, 0x08, 0x6b, 0x8f, 0x9e, 0xc1, 0xb4, 0xbe, + 0xf3, 0x46, 0xdd, 0xc7, 0x76, 0xd0, 0x82, 0x46, 0x66, 0x58, 0x40, 0x8e, + 0xe1, 0x0c, 0x1d, 0xf2, 0x55, 0xe2, 0xaf, 0x9a, 0x12, 0xc4, 0x76, 0x7f, + 0x75, 0xcd, 0xd6, 0xa5, 0xbc, 0xf7, 0xf2, 0x81, 0x3a, 0xa1, 0xbb, 0x54, + 0x6f, 0xf8, 0x8c, 0x22, 0xea, 0x79, 0x37, 0x37, 0x7d, 0xf6, 0xe2, 0xbb, + 0x87, 0x30, 0xa1, 0x6a, 0xb8, 0x16, 0x97, 0x87, 0x9a, 0xeb, 0x0f, 0xa5, + 0x0e, 0x21, 0x08, 0x08, 0x7d, 0x2e, 0x1c, 0xa1, 0xb3, 0x85, 0x94, 0x12, + 0x61, 0x95, 0x8d, 0xbb, 0x40, 0xd7, 0x95, 0x23, 0xda, 0x37, 0x95, 0x6c, + 0x69, 0x2b, 0xe1, 0xea, 0xc8, 0x62, 0x14, 0x8f, 0xe4, 0x10, 0x5a, 0x5c, + 0xd9, 0x8b, 0xf0, 0x32, 0x22, 0xb8, 0x99, 0x4b, 0xc9, 0x43, 0xeb, 0x1d, + 0xb0, 0xd6, 0xcf, 0x57, 0x21, 0xb7, 0xb6, 0x19, 0xb6, 0x97, 0xf1, 0x52, + 0x94, 0x9d, 0xd5, 0x55, 0x57, 0x5d, 0xab, 0x1d, 0x0d, 0x06, 0x4f, 0x02, + 0x03, 0x5a, 0xd1, 0x27, 0xac, 0x2e, 0xb0, 0x58, 0x19, 0x86, 0x3d, 0x6d, + 0x74, 0x9b, 0xa5, 0x82, 0x1d, 0xdc, 0xab, 0x52, 0x6f, 0xe4, 0x3e, 0x33, + 0xc7, 0x65, 0xa5, 0x62, 0xf4, 0x91, 0x5e, 0x04, 0x57, 0x10, 0x74, 0xc6, + 0x13, 0xc8, 0x86, 0x64, 0x0b, 0xb1, 0xfc, 0x6c, 0xd1, 0x42, 0xf4, 0x2a, + 0xbb, 0xd6, 0xd5, 0x85, 0x69, 0x8e, 0xcc, 0x89, 0xaa, 0xdb, 0x5d, 0x38, + 0x3b, 0x16, 0x3d, 0x73, 0x98, 0xdb, 0xbb, 0x6b, 0x9f, 0x59, 0xbe, 0x75, + 0xe0, 0x46, 0x97, 0xb5, 0x77, 0x30, 0x45, 0x6a, 0xd7, 0xf3, 0x76, 0x84, + 0x20, 0xd3, 0xdc, 0x5e, 0x8f, 0x03, 0xbd, 0xe9, 0xb0, 0xf1, 0xba, 0xce, + 0xd4, 0xd1, 0x5c, 0x08, 0x9b, 0x3e, 0xb4, 0x77, 0xa8, 0x6b, 0x06, 0x61, + 0xc3, 0x0b, 0x66, 0xbd, 0x9d, 0xc3, 0x5b, 0x75, 0xce, 0xc5, 0x23, 0x2a, + 0x24, 0x84, 0x4d, 0x60, 0xc6, 0x56, 0xd7, 0x1a, 0xc5, 0xba, 0x24, 0x11, + 0xd1, 0xef, 0xf8, 0x7d, 0x6e, 0x57, 0x8a, 0xb2, 0xdd, 0xe7, 0x6a, 0x23, + 0x82, 0x4a, 0x6b, 0xbc, 0xb9, 0x6c, 0xb9, 0xd9, 0xa9, 0xe4, 0x62, 0x5c, + 0x51, 0xaf, 0xea, 0x7a, 0xd5, 0x52, 0xc6, 0xea, 0x58, 0x1c, 0x98, 0xbe, + 0xb0, 0x10, 0x63, 0x54, 0xac, 0xb5, 0xc9, 0x8a, 0x45, 0x74, 0x5e, 0x0e, + 0xdc, 0x18, 0xc5, 0xe7, 0x43, 0x0c, 0xd5, 0x81, 0x41, 0x91, 0x50, 0x61, + 0x39, 0x55, 0x7b, 0x0e, 0x93, 0x65, 0xbb, 0x5c, 0xce, 0x15, 0xd2, 0xde, + 0x60, 0xbe, 0x09, 0x11, 0xc2, 0x45, 0x88, 0xe7, 0x5d, 0x18, 0xaf, 0x7b, + 0xb6, 0xe8, 0xe4, 0xca, 0xc5, 0x28, 0xb9, 0x88, 0xb5, 0x55, 0x92, 0xed, + 0x79, 0x48, 0xc2, 0xcf, 0x2e, 0x91, 0xac, 0x7d, 0x42, 0xe9, 0x1a, 0xe0, + 0x7e, 0x59, 0x41, 0x5b, 0xa8, 0x54, 0x19, 0x0d, 0x54, 0x9d, 0x75, 0x0b, + 0x4d, 0x42, 0xe5, 0x91, 0x11, 0x2e, 0x88, 0xa4, 0xc0, 0x2a, 0x05, 0x21, + 0xeb, 0x85, 0xa3, 0x55, 0xce, 0x98, 0x1e, 0xe3, 0x30, 0xd3, 0xe2, 0x12, + 0xa4, 0x97, 0x3a, 0x47, 0x9f, 0xe7, 0x99, 0x24, 0xcb, 0x47, 0xac, 0x6d, + 0xe7, 0xe5, 0xd6, 0x26, 0x54, 0x96, 0x84, 0x14, 0xb7, 0x02, 0x86, 0x2c, + 0xb2, 0x99, 0x19, 0xca, 0x33, 0x76, 0xb5, 0xd5, 0x68, 0x5a, 0xd0, 0x74, + 0xbd, 0x92, 0x2e, 0x26, 0xbb, 0xc3, 0xe9, 0xd1, 0x6c, 0x2f, 0xec, 0xd8, + 0x61, 0xac, 0xc3, 0x9e, 0xf9, 0x62, 0xa5, 0xaa, 0x14, 0xec, 0x69, 0x1a, + 0x1b, 0x38, 0x1a, 0x5d, 0x51, 0xae, 0x76, 0xdc, 0x94, 0x33, 0xc4, 0x1a, + 0x67, 0x4c, 0xd8, 0xb4, 0x9b, 0x99, 0x10, 0xd6, 0xab, 0x5e, 0xec, 0x54, + 0x61, 0xe7, 0x86, 0xda, 0x61, 0x24, 0x33, 0x02, 0x12, 0xdc, 0xab, 0x30, + 0x20, 0x44, 0xc0, 0xb0, 0x9c, 0x4d, 0x42, 0x6c, 0x7e, 0x80, 0xcf, 0x75, + 0x7d, 0x61, 0xf3, 0x73, 0x9e, 0x1b, 0x1b, 0xc8, 0xba, 0x20, 0xec, 0x55, + 0x74, 0x8b, 0x4e, 0xdd, 0xa3, 0x67, 0x39, 0x66, 0x05, 0xf5, 0xdc, 0x53, + 0xa3, 0x49, 0xca, 0xf4, 0x6a, 0x58, 0x69, 0x83, 0x7a, 0xa2, 0x4e, 0x08, + 0x48, 0x43, 0x18, 0x2b, 0x2c, 0x1a, 0x5f, 0xec, 0x5d, 0xde, 0x64, 0x96, + 0x94, 0x86, 0xf9, 0xa2, 0xbc, 0x44, 0x3b, 0xab, 0x6d, 0xac, 0xb6, 0x73, + 0x9d, 0x46, 0x07, 0xe6, 0x58, 0x6d, 0xcf, 0x63, 0x2b, 0x8e, 0x5a, 0xa3, + 0x75, 0x25, 0x80, 0xa1, 0x07, 0x23, 0x2e, 0x88, 0xf8, 0x84, 0x9e, 0x1d, + 0xe6, 0xd8, 0xf8, 0x07, 0x0e, 0x37, 0x62, 0x25, 0xbe, 0x88, 0x34, 0xd4, + 0x1d, 0xaa, 0x81, 0x3c, 0x7a, 0xbd, 0x54, 0xf6, 0x94, 0xa5, 0xae, 0x9d, + 0xd3, 0xe1, 0x22, 0x71, 0x18, 0x66, 0x18, 0x2c, 0xbe, 0xa1, 0xc9, 0x54, + 0x95, 0x7a, 0xad, 0x84, 0x89, 0x4e, 0x55, 0x31, 0x9c, 0x1d, 0xa7, 0xbe, + 0x30, 0xcb, 0xde, 0x8e, 0xca, 0xc2, 0x46, 0x44, 0xae, 0x3b, 0x6c, 0x29, + 0xfe, 0xc8, 0xf2, 0xec, 0x5a, 0x88, 0x4f, 0x8c, 0x42, 0x21, 0x9b, 0xe0, + 0xec, 0x79, 0x7e, 0x8d, 0x33, 0x74, 0x7a, 0x38, 0x74, 0x02, 0x7e, 0xaa, + 0x4b, 0xd5, 0xd8, 0xb2, 0x56, 0x39, 0x97, 0x75, 0x5a, 0x83, 0xf3, 0x73, + 0x99, 0x63, 0xc7, 0x75, 0xb3, 0x08, 0x02, 0x73, 0xbc, 0xa8, 0x27, 0x51, + 0xa5, 0x32, 0xac, 0x06, 0xfc, 0x49, 0xb7, 0xca, 0x1a, 0xe2, 0xb2, 0x1d, + 0x63, 0xa6, 0x6c, 0x17, 0x21, 0x08, 0x7f, 0x3e, 0x92, 0x45, 0x67, 0x5b, + 0x47, 0x65, 0x59, 0xe7, 0x35, 0xae, 0xd1, 0x8b, 0x6b, 0x8d, 0xc5, 0xb1, + 0x1c, 0x13, 0x26, 0x29, 0x68, 0x00, 0xf3, 0x0d, 0x5e, 0xc3, 0x02, 0xb0, + 0x2b, 0xa1, 0x4c, 0x5a, 0x5c, 0x63, 0xb2, 0xb7, 0xd8, 0xe4, 0x6c, 0x41, + 0xcb, 0x73, 0xb2, 0x27, 0x38, 0x21, 0x4f, 0xb0, 0xc5, 0x9a, 0x19, 0x4f, + 0x11, 0x55, 0x66, 0x09, 0xef, 0x73, 0x8d, 0x6b, 0x16, 0xea, 0xca, 0x0c, + 0xa2, 0x75, 0x8b, 0x74, 0xfb, 0x30, 0x26, 0x6d, 0x7b, 0x51, 0xed, 0x53, + 0x09, 0x1b, 0x65, 0x49, 0xb0, 0x36, 0x1d, 0x8b, 0x8e, 0x95, 0x26, 0xf6, + 0xe5, 0x68, 0x9d, 0x36, 0xd5, 0x1a, 0x3d, 0x95, 0x16, 0x04, 0xed, 0x74, + 0x2c, 0x28, 0xfd, 0x65, 0xa5, 0x3b, 0x27, 0x93, 0x3f, 0xcb, 0x8b, 0x13, + 0x56, 0x64, 0xf8, 0x19, 0x93, 0x65, 0xd7, 0x22, 0x29, 0x7a, 0x13, 0xe5, + 0x28, 0xcb, 0x0e, 0xc9, 0x61, 0xbb, 0x94, 0x81, 0x99, 0x44, 0xa1, 0x9c, + 0xee, 0x33, 0xe8, 0x1a, 0xd7, 0x23, 0x9a, 0xd8, 0xd6, 0x06, 0xb1, 0xd2, + 0x59, 0x1b, 0x74, 0xa5, 0xbf, 0x3d, 0x49, 0x8c, 0xe3, 0xe0, 0x33, 0x3f, + 0xc3, 0xb8, 0x99, 0xe1, 0x46, 0xda, 0x16, 0x38, 0xbb, 0x10, 0x20, 0x7b, + 0x6f, 0x5e, 0xae, 0x02, 0x36, 0x4e, 0xb2, 0xe3, 0xe0, 0xe4, 0xa9, 0x40, + 0x1e, 0x97, 0xd7, 0x5c, 0x77, 0x16, 0x65, 0x52, 0xe0, 0x8d, 0xb6, 0x51, + 0xb5, 0x6c, 0x1e, 0x19, 0xf6, 0x30, 0x64, 0xcb, 0x3d, 0xc4, 0x9d, 0xf5, + 0x6b, 0x13, 0x4b, 0x1a, 0xd5, 0x9e, 0xf3, 0x4c, 0x83, 0x57, 0xa8, 0x94, + 0xf9, 0x38, 0x7b, 0xbe, 0xd0, 0xfb, 0xb4, 0xa5, 0xaf, 0x76, 0x17, 0x94, + 0xbd, 0x00, 0x2d, 0x74, 0x32, 0x89, 0xe6, 0xd2, 0x26, 0x4f, 0xb8, 0x91, + 0x8c, 0x62, 0xb5, 0x1e, 0x77, 0x9b, 0x64, 0x3b, 0xd2, 0xba, 0x7c, 0xb9, + 0xaa, 0x0e, 0x49, 0xaa, 0x85, 0x9d, 0x4a, 0x1b, 0x36, 0xa9, 0xa9, 0x4c, + 0xee, 0x5a, 0xa7, 0x8e, 0x43, 0x5a, 0x64, 0xf7, 0xf4, 0x39, 0x23, 0x50, + 0x84, 0xa9, 0xb7, 0xa9, 0xba, 0x12, 0xea, 0x15, 0x85, 0x85, 0x69, 0x26, + 0x0e, 0xe3, 0x7e, 0x39, 0x34, 0x61, 0x14, 0x96, 0xcb, 0xbc, 0x33, 0x52, + 0x58, 0x31, 0xc8, 0xa8, 0xee, 0xd7, 0x0b, 0xd2, 0x29, 0x63, 0x78, 0xb9, + 0x8e, 0x18, 0xde, 0x62, 0x99, 0x02, 0x49, 0x76, 0x81, 0x6c, 0x50, 0x5a, + 0x41, 0x78, 0x21, 0x4f, 0x2c, 0x97, 0xc8, 0xdc, 0x07, 0xa9, 0x4f, 0x30, + 0xcc, 0x2e, 0xfd, 0xda, 0xc1, 0xcc, 0xcb, 0xb2, 0x14, 0x2f, 0x41, 0xc7, + 0x15, 0x5b, 0x43, 0x5d, 0x1b, 0xcc, 0x76, 0xc5, 0xd8, 0xd7, 0x51, 0xde, + 0x79, 0x27, 0xc8, 0x55, 0x69, 0x3d, 0x49, 0xaa, 0x40, 0x58, 0x41, 0xdc, + 0x2c, 0xdb, 0xe4, 0x65, 0x4a, 0x32, 0xa8, 0x17, 0x13, 0xc8, 0xa6, 0xa3, + 0x40, 0xfb, 0x16, 0x0d, 0xc8, 0xed, 0x22, 0xdb, 0x09, 0x06, 0xaf, 0x90, + 0x60, 0x53, 0x59, 0x0e, 0xa0, 0x45, 0x4e, 0xf0, 0x0d, 0x1d, 0x6e, 0xcf, + 0x6c, 0xa6, 0xb9, 0xa8, 0x36, 0xf6, 0x57, 0x6a, 0xb8, 0xf2, 0x2b, 0x85, + 0x8a, 0x83, 0x7e, 0xb0, 0x46, 0x81, 0xa2, 0xdc, 0x33, 0xc2, 0xa2, 0x33, + 0x61, 0xa7, 0xb0, 0xb3, 0x0d, 0xae, 0xf7, 0x42, 0xc4, 0xb1, 0xa1, 0x22, + 0xf2, 0xc9, 0x39, 0xaf, 0xbb, 0x08, 0xe6, 0x83, 0x1e, 0xe1, 0x17, 0x7c, + 0x8d, 0xd5, 0xeb, 0x03, 0x88, 0x8b, 0x5b, 0xc1, 0xf4, 0x72, 0x25, 0x09, + 0xb5, 0x81, 0xc9, 0xdd, 0xd1, 0xd7, 0xa1, 0x8e, 0x48, 0xa4, 0x52, 0xcc, + 0x86, 0xa0, 0xe7, 0xca, 0xb1, 0x58, 0xaa, 0x29, 0xce, 0x27, 0x1b, 0x1d, + 0xbe, 0x8a, 0x83, 0xaf, 0xc2, 0xf2, 0x56, 0x25, 0x64, 0xe5, 0x72, 0x9e, + 0x87, 0xe7, 0x72, 0xbf, 0x59, 0xe4, 0x8d, 0x32, 0x47, 0x8a, 0xb3, 0x03, + 0x8b, 0xc3, 0x8a, 0x9e, 0x1e, 0xca, 0xdb, 0x46, 0xbf, 0xf5, 0x2c, 0xb1, + 0xb0, 0x58, 0x59, 0x6e, 0x2e, 0xce, 0x58, 0x1d, 0xcf, 0x5e, 0x95, 0xac, + 0xb6, 0x3c, 0xb7, 0x9f, 0x9b, 0x5b, 0x56, 0xd2, 0x8c, 0x6b, 0xba, 0xde, + 0xe5, 0x15, 0x9d, 0x24, 0x19, 0xc3, 0x40, 0x2b, 0xdb, 0x56, 0x08, 0xc4, + 0xaa, 0x00, 0x1c, 0x67, 0x95, 0x75, 0xd9, 0xa7, 0x2a, 0x86, 0xcd, 0x82, + 0x2d, 0x3e, 0xeb, 0xd8, 0xec, 0xa4, 0x31, 0x0c, 0xce, 0xf0, 0xe7, 0x33, + 0xb5, 0x35, 0xaf, 0x1b, 0x9d, 0x93, 0x30, 0x06, 0xef, 0xd6, 0x86, 0x45, + 0x9c, 0x37, 0x4b, 0x74, 0x2b, 0x6c, 0x9b, 0x9e, 0x9c, 0x8b, 0xec, 0x3c, + 0x96, 0xb6, 0xe9, 0x72, 0x3b, 0xed, 0xd6, 0x83, 0x1f, 0x8c, 0xa3, 0xb5, + 0x5e, 0x4b, 0xb4, 0x89, 0x5a, 0x7e, 0x19, 0x1b, 0x4b, 0x4d, 0x08, 0x65, + 0xb1, 0xa7, 0x07, 0x21, 0x86, 0x45, 0x57, 0x1a, 0x46, 0xd9, 0x0f, 0x74, + 0x5c, 0x12, 0x52, 0xa4, 0xf6, 0xc5, 0x4a, 0xd1, 0x04, 0x0a, 0xaf, 0xca, + 0xd8, 0x53, 0x5c, 0x9b, 0xa3, 0x2c, 0x44, 0x9b, 0xb5, 0xa3, 0x8b, 0xf1, + 0x59, 0x9e, 0x5a, 0x4b, 0xd2, 0x34, 0x8a, 0xc2, 0x0a, 0x24, 0xed, 0xba, + 0xe9, 0xe7, 0x17, 0xf8, 0x88, 0x42, 0xc2, 0xe0, 0x67, 0xd1, 0x66, 0x8e, + 0x03, 0x8b, 0xdc, 0x8b, 0x43, 0xbb, 0xd9, 0x5f, 0xd6, 0xc5, 0xc1, 0x68, + 0xe9, 0x55, 0x3d, 0x58, 0xce, 0xce, 0x8d, 0xf5, 0x6c, 0xae, 0x30, 0xb5, + 0x14, 0x68, 0x9c, 0x00, 0x21, 0x27, 0xc9, 0x6e, 0x53, 0x01, 0xce, 0x71, + 0x64, 0xde, 0x92, 0x63, 0x1f, 0x0e, 0xe8, 0xb8, 0x3b, 0xa7, 0x7a, 0x7f, + 0xd6, 0xa4, 0xce, 0x54, 0xd8, 0x6b, 0xca, 0xb9, 0xe7, 0x63, 0x55, 0x57, + 0x43, 0x89, 0x8c, 0x5c, 0x22, 0x09, 0xc9, 0x26, 0xdc, 0x97, 0x91, 0xbf, + 0xc8, 0x6c, 0x44, 0x5f, 0x2d, 0xc9, 0x40, 0x3e, 0x77, 0x1a, 0xdb, 0x76, + 0xfb, 0x73, 0x50, 0x9a, 0x12, 0xdc, 0x4e, 0xe7, 0x2e, 0xf0, 0xa5, 0x3c, + 0x2b, 0x37, 0xed, 0x8e, 0x9c, 0x6d, 0x37, 0x9a, 0xb9, 0x9b, 0x8b, 0x86, + 0xbd, 0x71, 0xb2, 0xcc, 0xc0, 0x12, 0xbc, 0xa9, 0x46, 0xc1, 0x9d, 0x63, + 0xfd, 0xc6, 0x2b, 0x8d, 0xdd, 0x7e, 0xdd, 0x94, 0xd0, 0x69, 0xae, 0x1b, + 0x16, 0x4a, 0x42, 0xfe, 0x31, 0xef, 0x1c, 0x85, 0x44, 0xc7, 0x6e, 0x34, + 0xc7, 0x76, 0x23, 0x53, 0x0c, 0xa9, 0x47, 0x6b, 0x9b, 0x4c, 0x1d, 0x85, + 0xab, 0xcb, 0xa4, 0x62, 0x3b, 0xfc, 0x18, 0xa2, 0x17, 0x23, 0xa8, 0x2e, + 0x16, 0x49, 0x48, 0xdb, 0x80, 0x71, 0x4f, 0xa3, 0x1e, 0xb2, 0x59, 0x24, + 0x06, 0xde, 0x88, 0x1d, 0x48, 0xcb, 0x73, 0x4e, 0x89, 0xc7, 0xd6, 0xe1, + 0x72, 0x14, 0xf7, 0xcb, 0xca, 0xb7, 0xcf, 0x67, 0x81, 0x91, 0x74, 0x39, + 0x14, 0xc4, 0x52, 0x4e, 0x0a, 0x68, 0x58, 0xab, 0x4b, 0x43, 0x5a, 0xa2, + 0xfe, 0xfc, 0xa8, 0x95, 0xc0, 0x41, 0xd5, 0xbb, 0x3a, 0x91, 0xf3, 0xa8, + 0xa2, 0xeb, 0xdd, 0x35, 0x4c, 0x71, 0x3d, 0xd8, 0x45, 0x07, 0x04, 0xda, + 0x26, 0x67, 0xb3, 0x9f, 0x13, 0xeb, 0xc6, 0xd5, 0x7a, 0x64, 0xe3, 0x45, + 0x2c, 0x3f, 0xae, 0xad, 0xe8, 0x7a, 0xdc, 0xc0, 0xba, 0xa1, 0xa1, 0x85, + 0xbb, 0x87, 0x6d, 0x9d, 0xc7, 0xab, 0xf9, 0x5a, 0x1c, 0x58, 0x2d, 0x13, + 0xa5, 0xc5, 0x3a, 0x26, 0x32, 0xf8, 0x64, 0x25, 0xa9, 0x8f, 0x98, 0x23, + 0xc6, 0x1a, 0xec, 0xaa, 0xef, 0x66, 0x06, 0x6a, 0x54, 0x0c, 0x8f, 0xce, + 0x5b, 0x0e, 0x0a, 0xe6, 0x96, 0xc6, 0x6f, 0x18, 0x38, 0xf4, 0xa1, 0xd3, + 0x22, 0xb2, 0x96, 0x0d, 0x71, 0x58, 0x34, 0x69, 0x91, 0x7b, 0x40, 0xb2, + 0xba, 0x58, 0xad, 0x56, 0xe9, 0x7e, 0xb6, 0x8c, 0xd3, 0x5a, 0xe8, 0x55, + 0x3c, 0x1d, 0x90, 0xe9, 0x4d, 0xd8, 0xe9, 0x39, 0x7d, 0x0f, 0x12, 0x1b, + 0x5b, 0xb3, 0x31, 0x95, 0x0d, 0xcb, 0xad, 0x94, 0x4b, 0x57, 0xce, 0x59, + 0xa6, 0xb2, 0x61, 0xa6, 0x07, 0x04, 0xcd, 0x66, 0x12, 0x36, 0x8f, 0x8a, + 0x45, 0xb3, 0x82, 0xed, 0x8a, 0xc4, 0x6b, 0x75, 0x06, 0x39, 0x78, 0x1e, + 0xc9, 0xbc, 0xae, 0x1e, 0x2e, 0x2b, 0x1c, 0x39, 0x6b, 0x05, 0x47, 0xa0, + 0xa4, 0x76, 0x76, 0x39, 0x1b, 0x13, 0x36, 0x19, 0x80, 0xea, 0x8c, 0xd0, + 0x52, 0xbd, 0xa1, 0xc4, 0x20, 0x81, 0x0c, 0xcb, 0x19, 0x6d, 0xb9, 0x9c, + 0x59, 0xb8, 0xdb, 0x03, 0x0b, 0x61, 0x92, 0xc0, 0x5f, 0x10, 0x67, 0xbe, + 0xf3, 0x37, 0x45, 0x7c, 0xcc, 0xf2, 0x19, 0xd4, 0xe9, 0x19, 0x09, 0x00, + 0xf2, 0xe2, 0x88, 0xa4, 0xa9, 0x54, 0x72, 0xae, 0x69, 0x5f, 0x61, 0x4f, + 0x6a, 0x2c, 0x64, 0x2b, 0xaf, 0xa9, 0xbe, 0x93, 0x0f, 0xc7, 0x1e, 0x32, + 0x25, 0xb5, 0x65, 0xa1, 0x65, 0xb2, 0xdf, 0x22, 0x35, 0x0d, 0x01, 0x36, + 0x6b, 0xb2, 0x7a, 0xa5, 0x37, 0x92, 0x9a, 0xfa, 0x90, 0x74, 0x84, 0x24, + 0x87, 0x20, 0x23, 0x51, 0x08, 0xae, 0x3d, 0xcb, 0xe2, 0xda, 0x92, 0x36, + 0x32, 0x2f, 0x19, 0x0f, 0x3c, 0xd6, 0x2e, 0x0b, 0xbe, 0xbb, 0x1e, 0xf9, + 0xd2, 0x68, 0x55, 0x3c, 0xee, 0xd0, 0xfd, 0x52, 0x3e, 0xf9, 0x6d, 0x2e, + 0x54, 0x24, 0xb9, 0x0b, 0x55, 0x42, 0xad, 0x0e, 0xf5, 0x92, 0x6c, 0x23, + 0x93, 0xcc, 0x39, 0xda, 0x89, 0x36, 0x75, 0xe9, 0x72, 0xb2, 0x8a, 0x18, + 0x2a, 0x3a, 0x9c, 0x18, 0x5f, 0xc7, 0x0e, 0xf9, 0xb0, 0x4f, 0xe7, 0xd7, + 0x1e, 0x3d, 0x35, 0xe6, 0x6c, 0xbf, 0x38, 0xe5, 0x56, 0x67, 0xf5, 0x31, + 0xd2, 0x3b, 0x2b, 0xb6, 0x86, 0x83, 0xfa, 0x4c, 0xaf, 0xf2, 0xa3, 0x46, + 0x6f, 0x6c, 0x9b, 0xa4, 0x56, 0x8d, 0x07, 0x32, 0x0e, 0x2a, 0xd8, 0xcb, + 0x38, 0x46, 0x78, 0xab, 0xed, 0x6c, 0xb9, 0x6c, 0xe8, 0x82, 0x08, 0x97, + 0xc9, 0x06, 0x2d, 0xe2, 0xc3, 0x39, 0x92, 0x2d, 0x9a, 0x01, 0xa0, 0xeb, + 0x8c, 0xb6, 0x02, 0x6b, 0xae, 0x0e, 0xb4, 0xe7, 0xb7, 0xeb, 0xb3, 0x81, + 0xad, 0x4a, 0x6d, 0xc6, 0x6f, 0xdb, 0x35, 0xb9, 0x3e, 0x31, 0x7b, 0xf9, + 0x78, 0x3d, 0xc1, 0xa8, 0x48, 0xc6, 0xb0, 0xb1, 0xc3, 0xb5, 0xf3, 0x45, + 0x1f, 0xd4, 0x48, 0xab, 0x87, 0xeb, 0x06, 0x1b, 0xe3, 0xcb, 0xa5, 0xa4, + 0x0f, 0xeb, 0xb5, 0xb1, 0x5e, 0x76, 0xe9, 0xe5, 0xbc, 0x87, 0x31, 0x3c, + 0xea, 0xa3, 0x59, 0x7c, 0xc0, 0x40, 0xbc, 0xef, 0x15, 0xa6, 0x54, 0x56, + 0x1c, 0x46, 0xad, 0x8a, 0x55, 0x3c, 0x1d, 0xae, 0x80, 0x89, 0x5a, 0x0c, + 0x9d, 0x2a, 0x12, 0x81, 0xe2, 0x83, 0x56, 0x0b, 0xd8, 0xc9, 0x39, 0x5f, + 0x56, 0xaa, 0xb6, 0xce, 0xd3, 0x9e, 0x3c, 0xac, 0x76, 0xd1, 0xcc, 0x5f, + 0x61, 0xe8, 0x12, 0xc6, 0xf4, 0xab, 0x3c, 0x93, 0x78, 0xb8, 0x5a, 0xe9, + 0x81, 0x59, 0xe5, 0xc6, 0xb2, 0x5b, 0x2c, 0x7a, 0xfe, 0x9c, 0x56, 0x87, + 0x61, 0x8b, 0x35, 0xc2, 0x8a, 0x90, 0x7a, 0x76, 0x9b, 0x34, 0xc7, 0xa3, + 0xbf, 0xa1, 0x17, 0x14, 0x73, 0xc5, 0xc9, 0x75, 0x6c, 0x6f, 0xbc, 0x5c, + 0x9b, 0x05, 0x39, 0x8f, 0x1c, 0xc4, 0x12, 0xc6, 0x12, 0x69, 0x7d, 0xb6, + 0x4e, 0x12, 0x90, 0x41, 0xb7, 0x3e, 0x22, 0xbb, 0x99, 0x4a, 0xc6, 0x94, + 0x62, 0x00, 0x75, 0x1e, 0x15, 0x02, 0x87, 0xc7, 0x26, 0xd0, 0x16, 0x1a, + 0x35, 0x87, 0x49, 0xa3, 0x3a, 0x58, 0x63, 0x9a, 0xec, 0xae, 0xc0, 0xee, + 0x01, 0xfa, 0x6a, 0xf0, 0x90, 0xb6, 0x48, 0xc5, 0xd2, 0x23, 0x4f, 0x3f, + 0xcd, 0x30, 0x0b, 0xb5, 0x03, 0xd6, 0x39, 0x9e, 0x94, 0x45, 0x46, 0xaf, + 0x23, 0x72, 0x47, 0x29, 0x48, 0x88, 0x0e, 0xa5, 0x74, 0x40, 0x2f, 0xb9, + 0xa8, 0x34, 0x55, 0x44, 0xee, 0x0f, 0xb3, 0x26, 0x99, 0x7b, 0x1a, 0x17, + 0xc3, 0x95, 0x7c, 0x56, 0xa4, 0x16, 0x52, 0xb3, 0x36, 0x66, 0xb0, 0xcd, + 0x6a, 0xb9, 0x5c, 0x56, 0x79, 0xac, 0x8b, 0x1c, 0x7e, 0x10, 0xa8, 0x26, + 0xbb, 0x1e, 0xe0, 0x06, 0x37, 0x16, 0x49, 0xaf, 0x93, 0xe7, 0x38, 0xa8, + 0xd8, 0xeb, 0x3c, 0x20, 0x2e, 0xcb, 0x6d, 0x49, 0xec, 0x0f, 0xa3, 0x05, + 0x1d, 0xdb, 0x15, 0x6d, 0x1a, 0x76, 0x4e, 0xee, 0x25, 0xa7, 0xba, 0x14, + 0x43, 0xc2, 0x84, 0x68, 0x7b, 0xd0, 0x82, 0xcb, 0x42, 0x3f, 0x88, 0x5d, + 0x66, 0x6f, 0x84, 0xf3, 0x6c, 0xb7, 0xf0, 0x13, 0xb2, 0x8f, 0x5c, 0xca, + 0xe5, 0x45, 0x6d, 0x3d, 0x17, 0x17, 0x66, 0xe0, 0x04, 0x15, 0xb5, 0x9b, + 0xc3, 0x81, 0x20, 0x9c, 0x84, 0x75, 0xc4, 0xca, 0x06, 0x8e, 0x16, 0xe8, + 0xf9, 0xa4, 0x0a, 0x41, 0x82, 0xe7, 0x22, 0x46, 0x07, 0xa1, 0xc0, 0x39, + 0xaa, 0xe2, 0x05, 0x0e, 0x63, 0xaf, 0xae, 0x39, 0xb5, 0x95, 0xdb, 0x43, + 0x2e, 0xec, 0x54, 0xb1, 0x1c, 0x2c, 0x85, 0xe5, 0xd5, 0xcd, 0x2a, 0x5b, + 0xb9, 0x50, 0x85, 0xee, 0x21, 0xe7, 0x18, 0xa0, 0xdc, 0xd8, 0x5d, 0xf6, + 0xa9, 0xee, 0xe8, 0xa9, 0x78, 0x99, 0xc3, 0xba, 0xce, 0x7b, 0x95, 0x2e, + 0xed, 0x67, 0x64, 0xc0, 0x07, 0xc9, 0x55, 0x0d, 0x2e, 0xfa, 0xec, 0x24, + 0xa3, 0xc1, 0x86, 0x11, 0x6d, 0x1e, 0x86, 0x4a, 0x8c, 0x95, 0x6b, 0xde, + 0x24, 0xd6, 0x08, 0xa7, 0x86, 0xd0, 0xda, 0x83, 0xaf, 0x5c, 0x5c, 0x37, + 0xe7, 0x84, 0x38, 0x01, 0xe4, 0xdf, 0xad, 0x2a, 0x7f, 0xbf, 0x39, 0xbb, + 0xea, 0xae, 0x42, 0x82, 0x02, 0x82, 0x53, 0x28, 0x75, 0x7d, 0xda, 0x91, + 0x87, 0xde, 0x19, 0xf3, 0xae, 0xb1, 0x31, 0xb9, 0x5a, 0x5c, 0xbd, 0x93, + 0x4d, 0x9d, 0x57, 0x4b, 0x9d, 0xce, 0x22, 0x72, 0x36, 0x9a, 0xf5, 0x22, + 0xdc, 0x17, 0xb3, 0x41, 0x90, 0x93, 0x79, 0x7c, 0xde, 0x8f, 0x9c, 0xad, + 0x8b, 0x29, 0xc3, 0xd4, 0xd6, 0x4e, 0x4d, 0x19, 0xeb, 0xb0, 0x34, 0x74, + 0x5c, 0x5e, 0x1c, 0x75, 0x7b, 0x60, 0x77, 0x44, 0x37, 0x76, 0x9c, 0x81, + 0x40, 0x9e, 0x89, 0x98, 0xbb, 0x60, 0xc5, 0xcc, 0x09, 0xc3, 0xd3, 0x29, + 0xf6, 0x22, 0x2d, 0x89, 0x73, 0x2d, 0xc4, 0x94, 0xbb, 0x10, 0x82, 0xaa, + 0x61, 0xf7, 0xb3, 0xcb, 0x95, 0x4d, 0x21, 0x03, 0x00, 0x39, 0x62, 0x49, + 0x95, 0x84, 0x35, 0x62, 0xa9, 0xdb, 0x78, 0xb8, 0x5a, 0xb9, 0x7b, 0xd2, + 0x97, 0xa4, 0x82, 0xef, 0x85, 0xe5, 0xcc, 0xaf, 0xe9, 0x52, 0xd5, 0xce, + 0x18, 0x26, 0x22, 0x6b, 0x20, 0x01, 0x6c, 0x6e, 0xb6, 0x92, 0x01, 0x9f, + 0x34, 0xc8, 0x5f, 0xf3, 0xa9, 0x74, 0x59, 0x10, 0x25, 0x84, 0x1f, 0x0d, + 0x4b, 0x9f, 0x2b, 0x46, 0x0e, 0x12, 0x14, 0x42, 0xc6, 0x50, 0x88, 0xd8, + 0x6f, 0x9c, 0xd5, 0x51, 0xd1, 0xf8, 0x76, 0xd6, 0x86, 0xb1, 0xbb, 0xa0, + 0x34, 0x58, 0xc6, 0xfd, 0x79, 0x7b, 0x69, 0x85, 0x0d, 0x55, 0x23, 0x6a, + 0x16, 0x6e, 0x47, 0xe2, 0xe0, 0x5c, 0x71, 0x03, 0x0e, 0x76, 0xe4, 0x08, + 0x13, 0xa2, 0x3f, 0x52, 0x43, 0x2d, 0xc2, 0x45, 0x58, 0x74, 0x6d, 0x72, + 0x0e, 0x50, 0xa4, 0xaf, 0xed, 0x68, 0xd3, 0x49, 0x4d, 0x98, 0x18, 0xd7, + 0xfd, 0x65, 0x75, 0x85, 0xc7, 0x91, 0x2e, 0x0a, 0x90, 0xda, 0x8f, 0x97, + 0x48, 0x9b, 0x27, 0x30, 0x62, 0x1e, 0x29, 0x54, 0x8c, 0x5a, 0xca, 0x5b, + 0x65, 0xd2, 0x69, 0x71, 0x82, 0xad, 0xa0, 0xc4, 0xc8, 0x4a, 0x2c, 0xe4, + 0xa5, 0xad, 0xb5, 0x31, 0x61, 0xe9, 0x56, 0x16, 0xe1, 0xac, 0xb4, 0x1f, + 0x95, 0x61, 0x3c, 0xa8, 0xe4, 0xb2, 0x5a, 0xc6, 0x82, 0xc8, 0x79, 0x67, + 0xd6, 0x43, 0xb7, 0x8b, 0x8b, 0x7d, 0xde, 0x98, 0x47, 0x7e, 0x38, 0x1f, + 0x46, 0x82, 0x93, 0x5d, 0xfb, 0x8a, 0xd9, 0x2e, 0x75, 0xa9, 0x71, 0x17, + 0x66, 0x22, 0x55, 0x44, 0x99, 0xfe, 0xdc, 0x9f, 0x33, 0x92, 0x3b, 0xe5, + 0x4a, 0xc1, 0x9d, 0x94, 0x50, 0x5f, 0xbb, 0x8d, 0x50, 0x0f, 0x01, 0xef, + 0x9c, 0xfd, 0xde, 0xbc, 0xa0, 0xd4, 0x7a, 0x80, 0x77, 0x27, 0xac, 0x5f, + 0xae, 0x79, 0x5e, 0x34, 0x57, 0xee, 0x75, 0xcb, 0x1f, 0x20, 0xa5, 0x4e, + 0x71, 0xd4, 0x9c, 0x39, 0x3b, 0x42, 0x89, 0xe1, 0xf0, 0x22, 0x79, 0xaa, + 0x85, 0x2a, 0x5e, 0x35, 0x40, 0xab, 0x6d, 0xb5, 0x3e, 0xf7, 0xd1, 0xee, + 0x70, 0x55, 0x87, 0x24, 0x1c, 0x17, 0xa1, 0xd9, 0x2d, 0xb6, 0x7e, 0x9c, + 0xa9, 0x02, 0xb3, 0x3d, 0x2e, 0x1b, 0xbb, 0x3a, 0x2a, 0xc7, 0xe5, 0x11, + 0x0a, 0x5b, 0x69, 0xee, 0x6b, 0x24, 0xe4, 0x66, 0x3d, 0x15, 0xae, 0xa2, + 0xe3, 0x2e, 0x96, 0x87, 0x3a, 0x83, 0x63, 0xdb, 0x35, 0xaa, 0x7c, 0x0c, + 0xa4, 0x51, 0x27, 0x46, 0xc8, 0xf3, 0x47, 0x72, 0xa9, 0x30, 0x55, 0x63, + 0x22, 0x07, 0x29, 0x5c, 0x48, 0xf5, 0xa6, 0x89, 0x7b, 0x52, 0x3e, 0x98, + 0xfb, 0x3a, 0xb4, 0x0b, 0x25, 0xc0, 0x7c, 0x08, 0x63, 0xa3, 0x79, 0xe5, + 0xe6, 0xd6, 0xf5, 0xec, 0x18, 0x8b, 0x33, 0x7c, 0x89, 0x55, 0x24, 0x17, + 0x97, 0x48, 0x38, 0x6c, 0x15, 0xb5, 0x43, 0xb6, 0xa1, 0x36, 0x6b, 0x8e, + 0x95, 0x11, 0xd2, 0xd4, 0x5a, 0x13, 0xc4, 0xa3, 0x64, 0x6f, 0x86, 0x6a, + 0x47, 0x53, 0x1e, 0x51, 0x67, 0x6d, 0x70, 0xc5, 0x9d, 0x54, 0xc7, 0x46, + 0xc5, 0x61, 0x3c, 0xbd, 0xcd, 0xa3, 0x21, 0x64, 0xe7, 0x2c, 0xe4, 0x05, + 0x85, 0xa7, 0xdb, 0x67, 0xec, 0xdc, 0xf8, 0xee, 0xf6, 0xd2, 0xc4, 0xc0, + 0x52, 0xd8, 0xc5, 0x0e, 0x83, 0x5a, 0x36, 0x3c, 0x76, 0xa2, 0x59, 0xef, + 0x28, 0x7f, 0x9e, 0x61, 0x2e, 0x71, 0x4d, 0x3b, 0x44, 0x76, 0x40, 0xe4, + 0x8b, 0x2c, 0x61, 0x2b, 0x25, 0xcd, 0x81, 0x32, 0xb6, 0x11, 0x70, 0x26, + 0x81, 0x60, 0x9c, 0x53, 0xec, 0xda, 0x75, 0x01, 0x0e, 0x25, 0x4a, 0x78, + 0x05, 0xae, 0x29, 0x28, 0xcc, 0xee, 0xd8, 0x8f, 0xed, 0xbc, 0xe6, 0x0c, + 0xcc, 0x43, 0x2c, 0xce, 0xe4, 0xaf, 0x4a, 0x69, 0x68, 0x3b, 0x0b, 0xdd, + 0x63, 0xf0, 0x71, 0xd9, 0xa9, 0x8b, 0x7e, 0x1c, 0xa8, 0x5d, 0xe4, 0x1b, + 0x90, 0x6c, 0x0c, 0xea, 0xac, 0x15, 0xfb, 0xee, 0x62, 0x8a, 0xe4, 0xe9, + 0xc4, 0x15, 0x71, 0xd2, 0xec, 0x86, 0xfd, 0x7c, 0x37, 0xf7, 0x8a, 0xa8, + 0xe1, 0x0f, 0xd4, 0xde, 0x36, 0xaf, 0x28, 0xae, 0x23, 0x3b, 0x68, 0x3e, + 0x58, 0xc4, 0x66, 0xe1, 0x66, 0x0a, 0x07, 0x63, 0x67, 0x62, 0xa0, 0xfd, + 0x13, 0x14, 0xc8, 0xd1, 0xd2, 0x35, 0x1d, 0xde, 0x98, 0xf6, 0x31, 0x3a, + 0xa1, 0x86, 0xb0, 0xc2, 0xe9, 0xc1, 0xc1, 0x4a, 0xb9, 0xac, 0x8a, 0xed, + 0x6a, 0x58, 0x50, 0xc7, 0xaa, 0x83, 0x18, 0x78, 0x06, 0xbc, 0x97, 0xbc, + 0x6c, 0x10, 0x86, 0xe3, 0x2f, 0xd1, 0x51, 0xe5, 0x53, 0xa1, 0xc8, 0x0a, + 0x41, 0x55, 0x72, 0xa5, 0xda, 0x42, 0xae, 0x3d, 0x04, 0xa7, 0xf9, 0xc6, + 0xcd, 0x41, 0x3a, 0xb6, 0xac, 0x1d, 0x4b, 0xd8, 0xc7, 0xc6, 0x3c, 0xb8, + 0x1e, 0xb5, 0xf0, 0xca, 0x5f, 0x25, 0xb9, 0x19, 0x6c, 0xaa, 0xb4, 0x47, + 0x9b, 0xcf, 0xe2, 0xd1, 0xc4, 0x96, 0x85, 0x72, 0xf5, 0xb9, 0xab, 0x88, + 0xc2, 0xe7, 0x21, 0x0a, 0x62, 0x76, 0x55, 0x25, 0xb3, 0x6b, 0x28, 0xac, + 0xb9, 0x03, 0xa6, 0x17, 0xf6, 0xce, 0x5c, 0xc1, 0xab, 0x58, 0x5e, 0xee, + 0xf7, 0x7b, 0x35, 0x4f, 0xe4, 0x9d, 0xb2, 0xd4, 0x1c, 0x31, 0x33, 0xbd, + 0x39, 0xb5, 0x38, 0x6c, 0x37, 0xd4, 0xf2, 0x0c, 0xf3, 0xe7, 0xe5, 0x9e, + 0x75, 0xf4, 0xc5, 0xc5, 0x6d, 0x68, 0x18, 0x57, 0xe0, 0xc0, 0x60, 0x22, + 0x6d, 0x53, 0xd5, 0x70, 0x13, 0xaa, 0x09, 0x17, 0x08, 0xb5, 0x6a, 0x8d, + 0x5d, 0xb4, 0x41, 0x4f, 0xae, 0x60, 0x83, 0x18, 0x38, 0x57, 0x8e, 0x3b, + 0xa3, 0x3b, 0xe2, 0xe6, 0x82, 0x3c, 0x85, 0xc3, 0xa2, 0x54, 0x9b, 0xe8, + 0x62, 0x67, 0x8d, 0x8a, 0x32, 0xd4, 0xc6, 0xb2, 0x14, 0x79, 0x73, 0x64, + 0x8e, 0x17, 0x6f, 0xaf, 0xf8, 0x4b, 0x75, 0xc5, 0x66, 0x0c, 0xd2, 0x2f, + 0x96, 0x81, 0xba, 0x45, 0xd5, 0xbc, 0x3a, 0x84, 0x21, 0x41, 0x72, 0xd5, + 0x40, 0x8f, 0x55, 0x13, 0x73, 0x4a, 0x6e, 0xe3, 0xc9, 0x80, 0xb3, 0x57, + 0x55, 0xb1, 0xd7, 0xc6, 0x51, 0xb1, 0x18, 0x89, 0x18, 0xd7, 0x07, 0xa7, + 0xdc, 0x65, 0xd0, 0x46, 0x92, 0x6a, 0x6c, 0xb5, 0x3f, 0x37, 0x65, 0xed, + 0x91, 0x67, 0xe8, 0x14, 0xca, 0x68, 0xe7, 0x7a, 0xa6, 0x6d, 0x39, 0xfc, + 0xdc, 0x5d, 0xc0, 0x00, 0xa1, 0xa1, 0x9b, 0x7e, 0xb6, 0x11, 0x46, 0xcf, + 0xe9, 0xce, 0x69, 0xec, 0x26, 0x9c, 0xce, 0xf6, 0x43, 0x0e, 0x39, 0x26, + 0x46, 0x05, 0x11, 0xad, 0x70, 0x4b, 0x24, 0x5b, 0x2f, 0x2e, 0x8e, 0x4e, + 0x91, 0x06, 0x94, 0xa3, 0x73, 0xab, 0x52, 0xcf, 0x4a, 0xde, 0xb8, 0xca, + 0x65, 0xe5, 0x2c, 0x85, 0x86, 0x39, 0x88, 0x75, 0x1d, 0xec, 0xab, 0x71, + 0xe1, 0x19, 0x3c, 0x4c, 0x15, 0x33, 0x03, 0x0f, 0x4b, 0x6d, 0xb0, 0x35, + 0x75, 0x03, 0x2f, 0xae, 0x07, 0x32, 0x60, 0x85, 0x30, 0xa9, 0x7d, 0xcb, + 0x5b, 0x9b, 0x48, 0xe7, 0x52, 0x87, 0x44, 0xb6, 0xb9, 0xd1, 0x00, 0xdc, + 0x6c, 0xc2, 0x33, 0x6d, 0x27, 0x0b, 0x9e, 0xdb, 0x78, 0xa9, 0xb9, 0x63, + 0x2f, 0x28, 0x48, 0xa3, 0x44, 0x25, 0x6c, 0x47, 0x1c, 0x77, 0x84, 0x85, + 0x59, 0xda, 0x85, 0xc3, 0xb1, 0x17, 0x5b, 0xc7, 0x8f, 0x27, 0xbc, 0xed, + 0x8f, 0xf6, 0xa5, 0x09, 0x4c, 0xe2, 0x82, 0xe8, 0x67, 0xb2, 0x35, 0xf5, + 0xfc, 0x32, 0xc3, 0xf1, 0x8e, 0xb2, 0x0e, 0xfb, 0x99, 0x80, 0x67, 0x30, + 0x8f, 0xfb, 0x1b, 0xfb, 0xb2, 0x36, 0x2f, 0x9a, 0x72, 0xa9, 0xa8, 0x56, + 0xc3, 0xbc, 0x13, 0xd7, 0xeb, 0x03, 0x0d, 0x0d, 0x26, 0x1f, 0xaa, 0xe3, + 0x81, 0xeb, 0x66, 0x73, 0xa0, 0x17, 0xc7, 0xe4, 0xdc, 0x9e, 0x0e, 0xf0, + 0xb0, 0x9d, 0x71, 0x08, 0x7e, 0x25, 0x55, 0xa5, 0xda, 0x1c, 0x56, 0xc7, + 0xfc, 0x6c, 0x1e, 0x53, 0x77, 0x7d, 0x55, 0x1b, 0x1d, 0x3d, 0x7a, 0x10, + 0x30, 0x16, 0xee, 0xb4, 0xb7, 0x8c, 0x00, 0x41, 0xd2, 0x86, 0x25, 0xbd, + 0x03, 0x09, 0x2d, 0xd9, 0x63, 0x37, 0xc2, 0x01, 0x80, 0x1f, 0x3a, 0xb2, + 0x38, 0x2d, 0x6b, 0x17, 0x6b, 0x20, 0xf3, 0x78, 0x3c, 0x26, 0xe3, 0x7e, + 0xad, 0x1c, 0x66, 0xd0, 0xd2, 0x5a, 0x9d, 0x60, 0x59, 0xe6, 0x57, 0xa7, + 0x44, 0xee, 0xca, 0xc8, 0xdd, 0x53, 0x6b, 0x85, 0x67, 0x97, 0xc2, 0x5a, + 0xa1, 0x77, 0xda, 0x9e, 0x42, 0x4f, 0x40, 0xab, 0x60, 0xaf, 0x5a, 0xb4, + 0xc7, 0x6c, 0x3e, 0xa9, 0x4b, 0xae, 0xa3, 0xe8, 0xda, 0x23, 0xcc, 0x34, + 0xa7, 0x73, 0x17, 0xd6, 0xe4, 0xd0, 0x6e, 0x30, 0xca, 0x90, 0x11, 0x6b, + 0x3c, 0x59, 0x9b, 0xcb, 0x7e, 0xb6, 0x6b, 0xfb, 0xda, 0xdc, 0xcc, 0xcf, + 0x67, 0x06, 0x2e, 0x75, 0xab, 0x4c, 0x57, 0xf2, 0x38, 0x57, 0x20, 0x1a, + 0xf7, 0xce, 0x83, 0x0f, 0x73, 0xc4, 0xc2, 0x06, 0xc0, 0x1c, 0x5b, 0x18, + 0x64, 0x3d, 0x43, 0xb5, 0xc3, 0xc9, 0x89, 0x0e, 0xa0, 0x9d, 0x1a, 0xdb, + 0xa3, 0xc4, 0xd2, 0xf1, 0xc3, 0x43, 0x4e, 0xf1, 0x8b, 0x95, 0xb4, 0x9e, + 0x99, 0x03, 0xa7, 0x6e, 0xc3, 0xc5, 0xb8, 0xb3, 0xb7, 0x9e, 0x40, 0xcd, + 0x20, 0x5c, 0x88, 0x07, 0xa2, 0x26, 0xd3, 0x38, 0xe6, 0x46, 0x61, 0x48, + 0xcb, 0xab, 0xb3, 0x58, 0x62, 0xd6, 0x5e, 0xd6, 0x61, 0xae, 0x5e, 0x96, + 0x3c, 0xeb, 0x24, 0xa7, 0xd9, 0x30, 0x76, 0x0e, 0xb1, 0xbd, 0x66, 0x31, + 0x97, 0x96, 0x87, 0x74, 0x2e, 0x11, 0x6c, 0x28, 0x9c, 0x4d, 0x55, 0x29, + 0xeb, 0x50, 0x5c, 0x08, 0x42, 0x18, 0x6d, 0xec, 0x2c, 0x4d, 0x9a, 0x45, + 0x27, 0x49, 0x5b, 0x13, 0x24, 0x62, 0x78, 0x01, 0x80, 0x0d, 0xe3, 0xb6, + 0xe1, 0x66, 0x40, 0xae, 0x3e, 0x31, 0x72, 0x33, 0x5b, 0x41, 0xba, 0x73, + 0x12, 0x2e, 0x95, 0xfa, 0x5c, 0x48, 0x27, 0x44, 0xe0, 0x25, 0xd5, 0x67, + 0x47, 0x03, 0x66, 0x44, 0xb1, 0x10, 0x53, 0x3b, 0x89, 0x2d, 0x63, 0x6d, + 0xe5, 0x79, 0x9a, 0xf6, 0x0b, 0x7c, 0xa5, 0x29, 0x0a, 0xcc, 0xad, 0xf4, + 0x45, 0xac, 0xe2, 0xd2, 0xbe, 0xef, 0x75, 0x63, 0x0f, 0x67, 0x83, 0xd8, + 0x47, 0xb0, 0xd1, 0xb0, 0x95, 0xbc, 0xe6, 0xc3, 0x35, 0x27, 0xe6, 0xd7, + 0x65, 0x9f, 0xa0, 0xb1, 0x0d, 0xbb, 0xf9, 0x50, 0x16, 0xb1, 0xbd, 0x67, + 0x87, 0x38, 0x12, 0xc5, 0x1c, 0x96, 0x10, 0x31, 0xe7, 0x63, 0xa7, 0x47, + 0xcf, 0x5c, 0xd2, 0x36, 0x73, 0x6f, 0xbe, 0xea, 0x5a, 0xa1, 0x5f, 0xcf, + 0x0c, 0x2a, 0xcc, 0x48, 0x3c, 0x21, 0x37, 0xe2, 0x81, 0x59, 0x08, 0xf5, + 0x35, 0xdb, 0xed, 0x8c, 0xda, 0x3d, 0x46, 0xbd, 0xa5, 0x14, 0x41, 0x15, + 0x9f, 0x70, 0x66, 0x51, 0x1d, 0xd4, 0x46, 0x30, 0x5d, 0x46, 0x1c, 0xa9, + 0x99, 0x3f, 0x5c, 0xf1, 0xcb, 0xf9, 0x10, 0xec, 0x06, 0x65, 0xc7, 0x95, + 0xd6, 0x95, 0x6a, 0xa9, 0x03, 0xc3, 0xcc, 0x66, 0x73, 0x0d, 0x46, 0xfa, + 0x1e, 0x81, 0xec, 0xfe, 0x22, 0xc9, 0xa8, 0xcf, 0xa7, 0x44, 0x51, 0x2a, + 0x26, 0x9e, 0x42, 0x18, 0x35, 0x4b, 0xdb, 0x23, 0xba, 0xb7, 0xe3, 0x16, + 0xa3, 0x37, 0xb3, 0x0d, 0xeb, 0x29, 0xcb, 0xba, 0x57, 0xce, 0xc0, 0xab, + 0xb8, 0x71, 0xa1, 0x87, 0xb0, 0xbf, 0x49, 0x8a, 0xa8, 0x8f, 0x9d, 0x6e, + 0xaf, 0xcf, 0x72, 0xe6, 0x2a, 0x1f, 0x9a, 0xd2, 0x1d, 0x67, 0x3c, 0xa3, + 0x9d, 0x76, 0x3b, 0x1b, 0x45, 0xed, 0x91, 0x98, 0x35, 0xae, 0x63, 0x69, + 0xcb, 0xd2, 0x6d, 0xab, 0xdd, 0x01, 0xd2, 0x76, 0x4b, 0x09, 0x60, 0xfe, + 0xa8, 0x19, 0x85, 0x55, 0xb2, 0x41, 0xc2, 0xb8, 0x96, 0xc3, 0x83, 0x7e, + 0x22, 0xc8, 0xf0, 0x7c, 0xe4, 0x0e, 0x9b, 0xb9, 0x25, 0x04, 0x2e, 0x62, + 0xe6, 0x59, 0x08, 0x07, 0xf8, 0xd2, 0x15, 0xf0, 0x35, 0x5d, 0x9c, 0x16, + 0xe4, 0x00, 0x95, 0x33, 0x2b, 0x70, 0x2f, 0xe2, 0x80, 0x55, 0x5d, 0xa0, + 0xcf, 0xaf, 0x40, 0x96, 0x3e, 0xc5, 0xe8, 0x5e, 0xbf, 0x22, 0xa0, 0xfc, + 0x64, 0x5d, 0xdd, 0x25, 0x23, 0x22, 0x71, 0xe9, 0xe0, 0x6d, 0xea, 0x58, + 0xd1, 0x96, 0xc2, 0xb6, 0xb3, 0x8d, 0x11, 0x6c, 0xe4, 0x85, 0xc3, 0x42, + 0x0e, 0x91, 0x1e, 0x06, 0x1e, 0x1a, 0x70, 0xb3, 0x62, 0xd3, 0xed, 0x0a, + 0xf3, 0x41, 0x24, 0x34, 0xd6, 0xeb, 0x5d, 0x2f, 0x89, 0xd6, 0x8a, 0x10, + 0x8d, 0xe3, 0x75, 0x09, 0x82, 0x49, 0x7a, 0x99, 0x3b, 0x16, 0x88, 0x77, + 0x4a, 0xd6, 0x23, 0x21, 0xef, 0x3a, 0x8e, 0x6b, 0x2c, 0x70, 0x58, 0x3d, + 0xad, 0x6c, 0xa5, 0x2f, 0x96, 0x7a, 0x9f, 0xe0, 0x91, 0x45, 0x58, 0xd7, + 0x78, 0xab, 0x2e, 0x86, 0xcb, 0x8c, 0x4b, 0x89, 0xae, 0x76, 0x0e, 0x47, + 0x5c, 0xe0, 0x90, 0xae, 0x95, 0x28, 0xc7, 0xb3, 0xdb, 0x5d, 0xb0, 0x25, + 0xcc, 0xa3, 0xbc, 0xd2, 0x0f, 0xd6, 0xfc, 0x18, 0x38, 0x47, 0x2b, 0xa0, + 0x64, 0x8b, 0x3c, 0x34, 0x69, 0xba, 0xa1, 0xe1, 0xcd, 0x69, 0x4d, 0x64, + 0xe7, 0x85, 0xb2, 0x47, 0x84, 0x16, 0x95, 0x07, 0xc8, 0xa8, 0x56, 0xce, + 0x59, 0x2f, 0xd1, 0x44, 0x2f, 0xd7, 0x56, 0xed, 0xa0, 0xe9, 0x6e, 0xee, + 0x1b, 0xe6, 0xd6, 0x74, 0xd1, 0x33, 0xc9, 0x69, 0x22, 0x66, 0x0f, 0x03, + 0xb5, 0x24, 0x75, 0x67, 0xc1, 0xad, 0x11, 0xf4, 0xba, 0x92, 0xf3, 0x53, + 0x4d, 0x9a, 0x0b, 0x15, 0xf8, 0x63, 0x64, 0xd1, 0x2c, 0x44, 0xbe, 0x38, + 0x60, 0x33, 0xfc, 0x0a, 0x1d, 0x50, 0x0b, 0x1b, 0x54, 0x2a, 0x81, 0x7d, + 0x55, 0xa6, 0x11, 0x1b, 0x4d, 0x2f, 0xec, 0x05, 0xea, 0x89, 0x64, 0x96, + 0x9c, 0xd9, 0xec, 0x98, 0x25, 0x87, 0x84, 0xe6, 0xcf, 0x33, 0x22, 0x31, + 0x02, 0x0f, 0xca, 0x8b, 0x25, 0xed, 0x48, 0x81, 0xc9, 0x6c, 0x76, 0xd0, + 0xb2, 0xab, 0x5a, 0x6d, 0x0f, 0x61, 0x07, 0xde, 0xd8, 0x6f, 0x86, 0x83, + 0x9d, 0xf2, 0x6a, 0x2d, 0x24, 0xbd, 0x30, 0xab, 0x1b, 0x3e, 0x69, 0x30, + 0x88, 0x24, 0x3d, 0x59, 0x94, 0x02, 0x4f, 0x26, 0x02, 0x53, 0x74, 0x98, + 0xc1, 0x95, 0xf9, 0xc6, 0xba, 0x14, 0x59, 0x78, 0x98, 0x01, 0x37, 0xe7, + 0xcd, 0x9b, 0x7e, 0xbd, 0xc5, 0x85, 0xae, 0xd3, 0x67, 0x2c, 0xaf, 0xe9, + 0x10, 0x64, 0x71, 0xc5, 0xe1, 0x02, 0x53, 0xb8, 0xa4, 0x90, 0xe7, 0xde, + 0x97, 0xbd, 0x2b, 0xb6, 0x84, 0xe9, 0xd9, 0x11, 0xa9, 0x01, 0x6a, 0x2f, + 0x06, 0x81, 0x2e, 0xbc, 0x33, 0x75, 0xe0, 0x0e, 0xd5, 0xcc, 0x96, 0xfd, + 0xb3, 0x49, 0xe1, 0xa6, 0x2d, 0x57, 0x0c, 0x5a, 0x5a, 0x50, 0x41, 0xd6, + 0xe1, 0xe5, 0x98, 0x06, 0xf4, 0x8e, 0xeb, 0x97, 0xcb, 0xc8, 0xeb, 0x9c, + 0xa8, 0x2a, 0x33, 0x10, 0x19, 0x92, 0xa8, 0xe9, 0xb4, 0xe3, 0x76, 0xdb, + 0x8d, 0x40, 0xd6, 0x8d, 0xb4, 0xa0, 0xb7, 0xa7, 0x2e, 0xa7, 0xc6, 0x39, + 0x8f, 0x30, 0xa8, 0x7f, 0xd8, 0xd2, 0xf6, 0x99, 0xcd, 0xa9, 0x92, 0x83, + 0x0f, 0x44, 0x2c, 0x92, 0xc1, 0xa1, 0xaf, 0xca, 0xca, 0x58, 0x17, 0x1d, + 0x48, 0x1c, 0x92, 0xcb, 0x2a, 0x3a, 0x9c, 0x67, 0x38, 0x50, 0x0b, 0xdc, + 0x49, 0x8a, 0x63, 0x88, 0x98, 0x81, 0x97, 0x1e, 0xb8, 0x62, 0xb5, 0xe6, + 0xda, 0xeb, 0x2a, 0xc2, 0x4f, 0x69, 0x84, 0xd4, 0xcb, 0xee, 0xba, 0xa0, + 0xa7, 0xd5, 0xa6, 0xee, 0xa1, 0x5c, 0xba, 0x20, 0xe7, 0x80, 0x13, 0x87, + 0x22, 0xf1, 0x9e, 0x5a, 0xc2, 0x7b, 0x3f, 0x5c, 0xcb, 0x25, 0xbb, 0x25, + 0x9c, 0x39, 0x33, 0xb7, 0x68, 0x4b, 0x16, 0x99, 0x44, 0xca, 0x13, 0x0f, + 0x86, 0x33, 0xd5, 0xd8, 0xee, 0x55, 0xf1, 0x3c, 0xe8, 0x2d, 0x23, 0xad, + 0x6c, 0x6d, 0xb5, 0x5c, 0xf5, 0xb4, 0x03, 0x40, 0x8e, 0xad, 0xe8, 0x08, + 0x65, 0x5c, 0x64, 0x23, 0x50, 0xea, 0xb8, 0x37, 0x33, 0xc6, 0x88, 0x37, + 0x67, 0x23, 0xd7, 0xbc, 0x60, 0x03, 0xc4, 0x8c, 0x70, 0x35, 0x25, 0xfb, + 0x1a, 0x23, 0xe8, 0x03, 0x4f, 0xf2, 0xde, 0x75, 0x85, 0x83, 0x6c, 0xb6, + 0xd1, 0xc6, 0x62, 0xbd, 0xd9, 0x5e, 0xe8, 0x45, 0xae, 0x6c, 0x88, 0x9a, + 0x49, 0x77, 0xe5, 0x8c, 0x18, 0xa2, 0x45, 0x51, 0xd5, 0x28, 0xe9, 0x65, + 0x8e, 0xb3, 0xb6, 0x83, 0x4d, 0x45, 0x82, 0x40, 0xbe, 0x3d, 0x18, 0x8c, + 0x42, 0x9e, 0xb8, 0x0c, 0xaf, 0x62, 0x9a, 0x34, 0x35, 0x21, 0x5e, 0xd7, + 0x33, 0x77, 0x50, 0x22, 0xec, 0xd0, 0xce, 0x54, 0x35, 0xa6, 0x53, 0xf8, + 0x60, 0x48, 0xd4, 0xdc, 0x51, 0xc3, 0x2d, 0x30, 0xbe, 0x00, 0x61, 0x65, + 0x9b, 0x6e, 0xb1, 0xcc, 0x20, 0xc2, 0x20, 0x99, 0xcd, 0xbc, 0x78, 0x47, + 0x6b, 0x4e, 0xc5, 0x8b, 0x70, 0x5d, 0x08, 0x9b, 0xc8, 0xdf, 0x11, 0x72, + 0x4d, 0x19, 0xac, 0xb6, 0x42, 0x9c, 0x71, 0x7d, 0xec, 0x0d, 0x71, 0x91, + 0xce, 0x13, 0xf7, 0x8a, 0xd8, 0x22, 0xa4, 0xcc, 0x8a, 0xbc, 0x3e, 0x27, + 0x81, 0x15, 0xab, 0xea, 0xf2, 0xb0, 0xc5, 0x17, 0x9e, 0x5d, 0xe4, 0x3e, + 0xd7, 0xcb, 0xb3, 0x53, 0x7c, 0x19, 0x90, 0x7a, 0x58, 0x9f, 0xe5, 0x13, + 0x4b, 0xf3, 0x83, 0xa2, 0x95, 0x2c, 0x2c, 0x13, 0xe5, 0x29, 0xde, 0xc6, + 0x44, 0xad, 0x68, 0x14, 0x7d, 0x09, 0x03, 0xd3, 0x69, 0xf7, 0xd8, 0x65, + 0xab, 0x2b, 0xd8, 0x1e, 0x2b, 0x72, 0x78, 0x2f, 0x14, 0x18, 0xde, 0x6e, + 0xf0, 0x68, 0xd6, 0x1d, 0x64, 0xbd, 0xbf, 0x18, 0x87, 0xf1, 0x1c, 0xcd, + 0x8d, 0x9d, 0x40, 0x2c, 0x6b, 0x34, 0x11, 0xd5, 0xfe, 0x8a, 0x89, 0x67, + 0x9e, 0x84, 0xc2, 0x14, 0x27, 0x89, 0x6a, 0x63, 0x9e, 0x57, 0x23, 0xc1, + 0xab, 0xfd, 0x98, 0x56, 0x9d, 0x89, 0x57, 0x10, 0x19, 0xd6, 0x15, 0x37, + 0x2c, 0x16, 0xad, 0x7a, 0xb6, 0x6b, 0x4b, 0xeb, 0x3a, 0x73, 0x71, 0xe6, + 0x99, 0x75, 0xba, 0x47, 0xb2, 0x6c, 0x93, 0xf7, 0xcc, 0x62, 0x5d, 0x06, + 0xb3, 0x8a, 0xbe, 0x62, 0x88, 0xbf, 0xe9, 0x80, 0xd7, 0xd1, 0x12, 0x2a, + 0x9e, 0xb5, 0x05, 0x1a, 0x52, 0x34, 0xb4, 0x01, 0xc9, 0x89, 0x9a, 0xeb, + 0x07, 0xad, 0x3f, 0x04, 0x18, 0x4d, 0xa0, 0x1b, 0xb6, 0xdd, 0x59, 0x64, + 0xb1, 0x01, 0x60, 0x64, 0x59, 0x5c, 0x94, 0x35, 0x39, 0x13, 0xfb, 0xeb, + 0x42, 0xb1, 0x85, 0x01, 0xd6, 0x67, 0xa2, 0xcf, 0x2d, 0xc8, 0x5e, 0xd1, + 0x4d, 0xf9, 0xb2, 0x16, 0xf2, 0x1d, 0x14, 0x75, 0x02, 0x16, 0xaa, 0xc5, + 0x16, 0x29, 0x5a, 0xd3, 0xc3, 0x2e, 0xd4, 0x2e, 0x6b, 0x30, 0xce, 0x0a, + 0xd8, 0xe2, 0xb8, 0x1f, 0x20, 0x97, 0x29, 0x4f, 0x6d, 0x86, 0xe1, 0xdb, + 0x01, 0xb2, 0xcf, 0x44, 0x13, 0xee, 0xcc, 0x2d, 0x73, 0x89, 0xb5, 0x2b, + 0x9d, 0xd1, 0xe2, 0x58, 0x61, 0x3a, 0xa2, 0xb4, 0x4e, 0xb6, 0x3c, 0x44, + 0xd7, 0x45, 0xe8, 0x8d, 0x57, 0x9f, 0xb7, 0x4a, 0x64, 0x8c, 0x09, 0xcd, + 0x56, 0x62, 0x28, 0xdf, 0xf4, 0x44, 0x11, 0x03, 0x67, 0x71, 0x81, 0xcf, + 0x9b, 0x72, 0x3c, 0xcf, 0x13, 0x3b, 0xc6, 0x5b, 0xb6, 0xd7, 0x67, 0xbe, + 0xa2, 0xe0, 0xe3, 0x6a, 0xc4, 0x25, 0x3b, 0x86, 0xf1, 0xa3, 0xbf, 0x10, + 0x41, 0xee, 0xbd, 0x0b, 0x93, 0x54, 0x8f, 0x35, 0xd2, 0x53, 0x16, 0x3b, + 0x4a, 0x6b, 0x5a, 0x26, 0xe2, 0x8c, 0xd9, 0x7a, 0x8e, 0x2b, 0xa1, 0xca, + 0x59, 0xd9, 0xa6, 0x1b, 0xb4, 0xea, 0x40, 0xcc, 0x12, 0x45, 0x9b, 0x07, + 0x1d, 0x4e, 0x9c, 0x17, 0x18, 0x39, 0xc9, 0x71, 0xe9, 0xcc, 0xa3, 0x6b, + 0x90, 0x55, 0x92, 0xbe, 0x2d, 0x57, 0xbc, 0xd5, 0x6d, 0x5a, 0xf6, 0xba, + 0xda, 0x35, 0x7b, 0xd2, 0x49, 0xb3, 0x71, 0x9d, 0x25, 0x4c, 0x66, 0x6d, + 0x2f, 0xb5, 0xb8, 0x5d, 0xcf, 0xb7, 0x14, 0xc3, 0x7b, 0x07, 0x8d, 0x39, + 0x1e, 0x76, 0x42, 0x74, 0xde, 0xee, 0x40, 0xcb, 0x7e, 0x2f, 0xd9, 0xcd, + 0x1c, 0x84, 0x7c, 0x24, 0x91, 0x4b, 0xa1, 0x25, 0x60, 0x1b, 0x61, 0x83, + 0x8d, 0xb8, 0xcb, 0x71, 0xa2, 0x3b, 0x6c, 0x84, 0xe3, 0x3c, 0xc2, 0x05, + 0x55, 0x27, 0x51, 0x76, 0x09, 0xe5, 0xeb, 0x81, 0xbb, 0x28, 0x8e, 0x7a, + 0x15, 0x41, 0xd7, 0x36, 0x0e, 0x9b, 0x79, 0xdf, 0xa2, 0x6b, 0x16, 0x3a, + 0x9c, 0x98, 0x24, 0xf0, 0x44, 0x18, 0xf6, 0x02, 0x13, 0xd9, 0xca, 0x4c, + 0xc5, 0x0b, 0xf6, 0xd1, 0x59, 0xbb, 0x1c, 0x7d, 0xb5, 0xe2, 0x3d, 0x59, + 0x1e, 0xf6, 0x8e, 0x6e, 0x63, 0x8e, 0x35, 0xdb, 0x46, 0x00, 0xf0, 0xe1, + 0x87, 0xf6, 0x32, 0x6f, 0x4f, 0xc7, 0x34, 0x5b, 0xd2, 0xde, 0xc9, 0xa4, + 0xc9, 0xda, 0xe9, 0xe9, 0x60, 0xb3, 0xe7, 0x79, 0xac, 0x12, 0xd1, 0x7e, + 0xb7, 0xb9, 0x9e, 0xca, 0x66, 0x26, 0x30, 0xb0, 0xb2, 0xa5, 0x35, 0x4a, + 0xda, 0x2c, 0x63, 0x65, 0x6e, 0x0f, 0x04, 0x4e, 0x88, 0x83, 0x60, 0x32, + 0x12, 0xe3, 0x5c, 0x62, 0x3f, 0x2e, 0x65, 0x72, 0x60, 0xf7, 0xdd, 0x51, + 0x12, 0x30, 0xed, 0xda, 0x25, 0x6b, 0xc1, 0xea, 0x5b, 0x47, 0xee, 0x0d, + 0x5e, 0x3e, 0x9c, 0xf3, 0x73, 0x9c, 0xa1, 0xf6, 0x91, 0x0d, 0x01, 0x08, + 0x56, 0xa0, 0x09, 0xf4, 0x8d, 0x9b, 0x5e, 0xe6, 0x67, 0x07, 0xff, 0x7a, + 0x0c, 0xc5, 0x1c, 0xd1, 0xd8, 0x4b, 0x2a, 0x9f, 0x07, 0x3c, 0x1d, 0xc6, + 0xc8, 0x38, 0xc5, 0xbb, 0x0a, 0x1d, 0x32, 0x0d, 0xd5, 0x2f, 0x67, 0xdb, + 0xac, 0xaf, 0x5a, 0x7e, 0x14, 0x74, 0xe5, 0x52, 0x66, 0x1b, 0xc8, 0xce, + 0xb4, 0x6b, 0xe1, 0xec, 0xae, 0x73, 0x8b, 0x91, 0x21, 0x8f, 0xb2, 0xad, + 0xe5, 0xf2, 0xbc, 0xc1, 0x28, 0xfa, 0x6c, 0x79, 0x4e, 0xa1, 0x31, 0xd9, + 0x3e, 0x68, 0x07, 0x41, 0x39, 0x94, 0xa3, 0xbb, 0xcf, 0xac, 0x31, 0xd8, + 0x02, 0x10, 0xb8, 0xd2, 0x75, 0x41, 0x96, 0x67, 0x20, 0x57, 0xa6, 0x4f, + 0xda, 0x51, 0x04, 0x29, 0x8f, 0xcb, 0xad, 0x42, 0x83, 0xa2, 0x2e, 0x5c, + 0xbe, 0xc9, 0x04, 0x04, 0xf1, 0x92, 0x63, 0x85, 0xa5, 0xe5, 0x25, 0xe9, + 0x2d, 0x47, 0x3d, 0x0a, 0x97, 0x39, 0x40, 0xe3, 0x7b, 0x7b, 0x56, 0x9c, + 0xad, 0xf8, 0x7a, 0x25, 0x28, 0x1f, 0xd5, 0x80, 0x03, 0x81, 0xb2, 0x5a, + 0x00, 0x29, 0x63, 0x22, 0xb2, 0x91, 0x7a, 0x44, 0xe9, 0x43, 0x14, 0x74, + 0x73, 0x39, 0x5d, 0x75, 0xfd, 0xcc, 0xaa, 0xb7, 0x41, 0x49, 0xa7, 0xc8, + 0xa9, 0x5b, 0x6c, 0x8a, 0x68, 0xab, 0x7b, 0x41, 0xa0, 0x1f, 0xd5, 0x78, + 0x2e, 0x6d, 0xe6, 0xe1, 0xd0, 0xc7, 0xab, 0x73, 0x68, 0x6f, 0x63, 0xe9, + 0xec, 0x77, 0x39, 0xee, 0x8a, 0x6a, 0x28, 0x15, 0x6e, 0x61, 0x30, 0xce, + 0xc9, 0x2a, 0xc2, 0x71, 0x75, 0x9a, 0x76, 0x70, 0x74, 0x2a, 0xe2, 0xdc, + 0x1e, 0x35, 0x12, 0x51, 0xe4, 0x23, 0x7f, 0xf0, 0xfb, 0x6b, 0x67, 0xd0, + 0xa1, 0xed, 0xd7, 0x0d, 0xc7, 0xf5, 0x95, 0x53, 0xd4, 0xdd, 0x79, 0x6f, + 0x75, 0x57, 0x3d, 0x22, 0x98, 0x75, 0x74, 0x58, 0x03, 0xde, 0x0a, 0x61, + 0x40, 0x4f, 0xcf, 0x66, 0x28, 0x6e, 0x59, 0x93, 0x88, 0x4b, 0xdb, 0x7c, + 0xdb, 0xc1, 0x9e, 0xb0, 0xe7, 0xfb, 0x15, 0x4d, 0x62, 0x65, 0x51, 0x9f, + 0x2e, 0x20, 0x53, 0xc2, 0xc2, 0x82, 0x46, 0x18, 0xa3, 0x9a, 0x05, 0xe8, + 0x81, 0x95, 0x7b, 0x9d, 0x03, 0xf6, 0x89, 0xb5, 0xc0, 0x59, 0x5c, 0xbc, + 0x65, 0x26, 0xd2, 0x22, 0xc1, 0x2a, 0x3b, 0x5a, 0x9f, 0x67, 0xde, 0xae, + 0x3a, 0x0a, 0x4b, 0x4f, 0x07, 0x90, 0x34, 0x5b, 0x0a, 0x46, 0xc9, 0x52, + 0x73, 0x80, 0xbe, 0x31, 0x2e, 0x96, 0xf0, 0xc3, 0xf2, 0xbc, 0x58, 0x53, + 0xdd, 0xbc, 0xb9, 0xee, 0x2d, 0x4d, 0xa3, 0x87, 0x4d, 0x15, 0x50, 0x8a, + 0xb2, 0x92, 0x78, 0x8a, 0xe1, 0x52, 0x1d, 0x86, 0x66, 0x6e, 0x44, 0xa5, + 0x8a, 0x12, 0x92, 0xc6, 0x0e, 0xb8, 0xac, 0x56, 0x91, 0x84, 0x0c, 0x68, + 0x5e, 0x02, 0xb7, 0x75, 0x7f, 0x45, 0x96, 0x5d, 0xbe, 0x12, 0x0e, 0xd9, + 0xd9, 0xf1, 0x80, 0x2b, 0x80, 0x53, 0x6d, 0xbd, 0x01, 0x51, 0x69, 0xb5, + 0xd3, 0x83, 0x65, 0xde, 0xab, 0x68, 0xc1, 0x75, 0xc0, 0xc1, 0x8b, 0xc8, + 0x68, 0x04, 0xc1, 0x70, 0x5d, 0x71, 0xe3, 0x32, 0x52, 0xf3, 0x05, 0x94, + 0xf0, 0x4b, 0x6f, 0x93, 0x62, 0x43, 0x08, 0x2b, 0xc6, 0xaa, 0x39, 0xd2, + 0x18, 0x34, 0x50, 0x57, 0x84, 0x63, 0xe4, 0x78, 0x65, 0x6c, 0x58, 0x2e, + 0x3c, 0x47, 0xc4, 0x52, 0xb3, 0x76, 0xe2, 0x62, 0x88, 0x2d, 0xf7, 0x80, + 0xd3, 0x4b, 0x6a, 0x45, 0x9f, 0xf8, 0x2d, 0xb6, 0xa4, 0x55, 0xfa, 0x58, + 0x42, 0x1c, 0x45, 0xe1, 0x0e, 0x9d, 0x98, 0x9a, 0xe9, 0x05, 0xb1, 0xaf, + 0xc8, 0xba, 0x7c, 0xac, 0x7c, 0xad, 0xa7, 0xe1, 0x24, 0x33, 0xb7, 0xa9, + 0xd8, 0x66, 0x23, 0xd1, 0x0d, 0x97, 0xc8, 0x3f, 0x37, 0x9b, 0x40, 0x93, + 0xa5, 0x94, 0x4c, 0x33, 0x53, 0x88, 0xb4, 0x6d, 0x55, 0x2f, 0xfb, 0xc1, + 0xde, 0xfb, 0xaa, 0xe5, 0x97, 0xd5, 0x71, 0xad, 0x98, 0x9b, 0x8d, 0xa8, + 0x72, 0x7b, 0x93, 0xce, 0x56, 0x39, 0xb0, 0x15, 0x27, 0x41, 0xeb, 0xa2, + 0xf7, 0x2a, 0x96, 0xe2, 0x87, 0xf9, 0xd6, 0x48, 0x57, 0xd3, 0xd1, 0x81, + 0x1a, 0xb1, 0xa6, 0x2c, 0x96, 0x35, 0xd8, 0x43, 0x9d, 0x70, 0xfb, 0x58, + 0x92, 0xeb, 0xec, 0xc0, 0x34, 0xa4, 0xc5, 0x22, 0x9c, 0x49, 0x30, 0x32, + 0xb7, 0xdd, 0x87, 0x92, 0x3c, 0xe7, 0xb9, 0xe3, 0xe0, 0xcf, 0xed, 0x2d, + 0x56, 0xb5, 0x45, 0x86, 0x6e, 0x83, 0xde, 0xbf, 0xe2, 0xb4, 0xc7, 0xb2, + 0xa7, 0x6c, 0xcb, 0xcf, 0xcc, 0x0d, 0x0f, 0x5c, 0x97, 0xe4, 0x64, 0x17, + 0x7b, 0x1c, 0x21, 0x9c, 0x92, 0xab, 0x94, 0x46, 0xe0, 0xd1, 0x14, 0xb6, + 0x54, 0x02, 0x40, 0xd6, 0x06, 0xf2, 0xab, 0x63, 0x8c, 0x6f, 0xe6, 0x95, + 0x6a, 0xad, 0xdb, 0x69, 0x16, 0xef, 0x78, 0x6e, 0xf7, 0xa2, 0x89, 0x23, + 0xe7, 0x4d, 0xe0, 0x84, 0xa8, 0x18, 0xc2, 0xcb, 0x4c, 0x5a, 0x52, 0xeb, + 0x71, 0xb3, 0x82, 0x64, 0x00, 0xc7, 0x93, 0x21, 0x9d, 0xbb, 0x47, 0xdf, + 0xd7, 0x86, 0x24, 0x20, 0x47, 0x02, 0x07, 0x89, 0x98, 0xbc, 0x93, 0x42, + 0x74, 0x23, 0xef, 0x4b, 0xef, 0xda, 0x2c, 0x51, 0x4c, 0x44, 0xa9, 0x54, + 0x1b, 0x81, 0x9b, 0xba, 0x6c, 0xf8, 0x39, 0x71, 0x15, 0x10, 0x4c, 0x5d, + 0x2e, 0xbd, 0x95, 0xbe, 0xaa, 0xaf, 0x14, 0xb7, 0xdd, 0x40, 0xf3, 0xa2, + 0x91, 0xf5, 0x4b, 0x8f, 0x8f, 0xc2, 0xa8, 0x17, 0xd2, 0x58, 0xf9, 0x5b, + 0x29, 0x3f, 0xba, 0x2c, 0x7c, 0x3d, 0x00, 0x83, 0x6d, 0x92, 0xc4, 0xc8, + 0x24, 0xc6, 0x84, 0xed, 0x25, 0x32, 0x5b, 0x31, 0x16, 0xe1, 0x8a, 0xf9, + 0xb1, 0xc3, 0xc2, 0xf2, 0xe4, 0x23, 0xfb, 0x35, 0x9a, 0x6e, 0x0f, 0x1c, + 0x4e, 0x1a, 0x02, 0xcf, 0x85, 0x3c, 0xbd, 0xa9, 0x25, 0x42, 0x31, 0x9a, + 0x43, 0x98, 0xd9, 0x90, 0xb6, 0x91, 0xed, 0xbd, 0x1b, 0x41, 0x47, 0x85, + 0xa5, 0xfd, 0x19, 0xb1, 0xd3, 0x6b, 0xe7, 0x2a, 0xcd, 0x2f, 0x1a, 0xca, + 0x9c, 0xf6, 0x69, 0xeb, 0x6d, 0x4a, 0x2e, 0x17, 0xa1, 0x26, 0x64, 0xbd, + 0xb2, 0x87, 0x48, 0xd7, 0x3f, 0xcd, 0x14, 0x4d, 0x72, 0x72, 0xfa, 0x94, + 0xe5, 0x2d, 0xb5, 0x81, 0x1c, 0x63, 0x63, 0xa0, 0x2a, 0x3d, 0xeb, 0x4b, + 0xcb, 0x4f, 0x7b, 0x8d, 0x62, 0x4d, 0x78, 0x7e, 0xcc, 0x34, 0xc4, 0x2f, + 0xa1, 0x83, 0x1c, 0x85, 0x65, 0x6b, 0xc9, 0x7b, 0x0a, 0x5e, 0x70, 0xaa, + 0x65, 0x56, 0xf8, 0x96, 0xdb, 0x75, 0xd7, 0xeb, 0xb2, 0x99, 0x0f, 0x94, + 0x89, 0xd1, 0x5d, 0x02, 0xc0, 0x4e, 0x2f, 0x8f, 0xeb, 0xf9, 0x79, 0xe5, + 0x65, 0xbe, 0x6c, 0x15, 0x20, 0xd9, 0xc0, 0x43, 0x99, 0x87, 0xeb, 0x99, + 0xca, 0xd5, 0xb9, 0x59, 0x1e, 0xba, 0xb9, 0xe6, 0x50, 0xe2, 0xbc, 0x9a, + 0x2f, 0x3a, 0x2e, 0xa3, 0x4c, 0x6f, 0x8d, 0x1c, 0xf7, 0x8d, 0xc2, 0x42, + 0xab, 0xdc, 0x6e, 0x20, 0xae, 0x4e, 0x96, 0x63, 0x7b, 0xea, 0xe4, 0xa5, + 0xa0, 0x9b, 0xe2, 0x7c, 0x96, 0xab, 0xab, 0xf5, 0x42, 0x5b, 0xcd, 0x16, + 0xe6, 0x52, 0x9e, 0x17, 0xf0, 0x5e, 0x4f, 0x4c, 0x88, 0x39, 0x46, 0x03, + 0x39, 0xc5, 0xa9, 0x06, 0x27, 0xf3, 0xa8, 0x91, 0x47, 0xba, 0x30, 0x2d, + 0x10, 0x25, 0x49, 0x83, 0xa3, 0x95, 0x72, 0x0c, 0x2d, 0x35, 0xe1, 0xcd, + 0x61, 0x0d, 0x7c, 0x5a, 0x2d, 0x54, 0x48, 0x49, 0xf2, 0xfd, 0xe5, 0x4c, + 0x13, 0x23, 0x6e, 0x77, 0xd2, 0x21, 0xe0, 0x29, 0xd2, 0x84, 0x97, 0x11, + 0x40, 0xb5, 0xda, 0x62, 0x2f, 0x58, 0x64, 0xd7, 0xc0, 0xbb, 0x63, 0xb6, + 0x1c, 0x19, 0xb3, 0x1d, 0xd0, 0x7d, 0x3a, 0x9f, 0x67, 0x74, 0x97, 0x5e, + 0x25, 0xdf, 0xb0, 0x9d, 0xf1, 0x6a, 0x35, 0xbb, 0x15, 0x8a, 0x1f, 0x56, + 0x48, 0xd9, 0x66, 0x0e, 0xc5, 0xa8, 0xd2, 0xd8, 0xe0, 0xe5, 0x82, 0xde, + 0x94, 0x1b, 0x7b, 0x5e, 0x07, 0x82, 0x27, 0xed, 0x38, 0xc9, 0x53, 0x57, + 0xf1, 0x21, 0x14, 0xd5, 0x8d, 0xb9, 0x59, 0x6d, 0xcb, 0x02, 0xd6, 0x46, + 0xe0, 0x03, 0x82, 0xf5, 0x56, 0xb5, 0x31, 0xf4, 0x0a, 0x8d, 0x9b, 0x2d, + 0xa9, 0x7b, 0x72, 0x78, 0xd9, 0x88, 0x91, 0x0f, 0x33, 0xe1, 0xa9, 0xcc, + 0xb7, 0x76, 0x5f, 0xe9, 0xd7, 0x31, 0xe3, 0xbd, 0x5d, 0xbb, 0x4c, 0xd8, + 0xa4, 0xbb, 0xb6, 0x4c, 0x8e, 0xc2, 0x18, 0x55, 0x5f, 0x98, 0x83, 0x5c, + 0xad, 0xd7, 0xed, 0xbc, 0x53, 0x80, 0xb5, 0xd4, 0x4d, 0x1e, 0x30, 0x67, + 0xcc, 0xb7, 0xb3, 0x73, 0xda, 0x9f, 0xb0, 0x83, 0x9f, 0x50, 0x5a, 0x09, + 0x4b, 0xf9, 0x1c, 0xee, 0x5a, 0x71, 0xd8, 0xc2, 0xc7, 0xa5, 0xc5, 0x66, + 0x53, 0x42, 0x8f, 0xd0, 0x2b, 0x7a, 0x3f, 0x62, 0xbe, 0x19, 0xb8, 0xf6, + 0xb0, 0xba, 0x52, 0xe4, 0x6a, 0xde, 0xf0, 0x78, 0x1f, 0xd4, 0x35, 0x75, + 0xdc, 0x2d, 0x28, 0xb7, 0x29, 0xe9, 0xde, 0x3b, 0xa9, 0xbb, 0x75, 0xe8, + 0x49, 0xa6, 0xa4, 0x6c, 0x11, 0x5f, 0x90, 0x52, 0xf5, 0xbc, 0x3a, 0x66, + 0x0b, 0xe2, 0x78, 0xba, 0x70, 0xe2, 0xc1, 0xb6, 0x4f, 0xc6, 0xaa, 0xe3, + 0x39, 0xa2, 0xe8, 0xaf, 0xc3, 0x46, 0xf3, 0x85, 0xd3, 0x68, 0xc6, 0x63, + 0x90, 0x26, 0x01, 0x93, 0xb5, 0x52, 0x2e, 0x77, 0x98, 0xb0, 0x40, 0xf3, + 0x18, 0x07, 0xd8, 0xa8, 0x14, 0x68, 0x78, 0xd0, 0x22, 0x88, 0x3b, 0x4b, + 0xf4, 0x59, 0xc5, 0x4c, 0x68, 0x81, 0x43, 0x5e, 0x02, 0xe5, 0x84, 0x67, + 0x5a, 0x33, 0x7e, 0x46, 0xab, 0xc1, 0x86, 0x9e, 0xf1, 0xa7, 0x33, 0x43, + 0xcd, 0xa4, 0x82, 0x41, 0xaa, 0x5d, 0xb7, 0xe5, 0x48, 0x7a, 0x33, 0xe0, + 0xd2, 0xc6, 0xf0, 0xe1, 0x86, 0x86, 0x16, 0xc1, 0x09, 0x81, 0x8f, 0xb3, + 0x19, 0x9f, 0xe2, 0x43, 0x65, 0x5c, 0xf8, 0x53, 0x8a, 0xd3, 0x41, 0x70, + 0x36, 0x33, 0x88, 0xa9, 0x07, 0xf5, 0x7a, 0x74, 0x2c, 0x81, 0x3f, 0xb2, + 0x5d, 0xdb, 0x91, 0x10, 0xe6, 0x0c, 0x47, 0x47, 0x07, 0x01, 0x61, 0xbf, + 0x5c, 0x77, 0x31, 0xdc, 0x16, 0x22, 0x36, 0x26, 0x3d, 0xec, 0xaf, 0xf5, + 0xf3, 0x60, 0x46, 0x97, 0xd6, 0x8c, 0xa2, 0xaa, 0x2f, 0x76, 0x96, 0x3a, + 0xe2, 0x7b, 0x96, 0xaf, 0x11, 0xfe, 0x50, 0xaf, 0x91, 0xf5, 0x0e, 0x43, + 0xf6, 0x1e, 0x5d, 0x0f, 0x01, 0x12, 0x53, 0x58, 0x35, 0x5b, 0x6d, 0xaa, + 0x5c, 0x90, 0xf4, 0x62, 0x39, 0x8e, 0x17, 0xe4, 0xc0, 0xf5, 0xab, 0x73, + 0x45, 0xfb, 0x66, 0xd8, 0xd7, 0x5c, 0x67, 0xc6, 0xf5, 0x66, 0x8d, 0x21, + 0x06, 0x31, 0xab, 0xe6, 0xcb, 0xe1, 0xb8, 0x3f, 0x2e, 0xe1, 0x04, 0xe0, + 0xc5, 0xf1, 0x50, 0x1e, 0x60, 0xcd, 0xb7, 0x0b, 0xa1, 0x25, 0x9b, 0xa3, + 0x7f, 0xba, 0xba, 0x3b, 0x3d, 0x0a, 0x24, 0x9e, 0xf5, 0xd7, 0xe8, 0x69, + 0x27, 0x5d, 0x28, 0x6b, 0x74, 0xb7, 0xf5, 0xb5, 0x61, 0xd4, 0xb9, 0xb2, + 0x9a, 0xaf, 0x50, 0x6c, 0x0c, 0xbb, 0x2b, 0xc1, 0x5c, 0x8f, 0x84, 0x80, + 0x49, 0x50, 0xdb, 0x16, 0x94, 0x90, 0x89, 0x43, 0xd6, 0x87, 0x0c, 0x95, + 0x1d, 0xcd, 0x45, 0xb5, 0xe8, 0x3b, 0xeb, 0xcc, 0x27, 0x49, 0x0a, 0xed, + 0xa5, 0x71, 0xa8, 0xf4, 0xb5, 0x14, 0xaa, 0xd4, 0xac, 0xe9, 0x0e, 0x47, + 0x06, 0x1b, 0x4d, 0x79, 0x08, 0x98, 0xc0, 0xb8, 0x74, 0xd2, 0x45, 0xd3, + 0x3a, 0x2f, 0x47, 0x1c, 0xb4, 0xc0, 0xcd, 0x55, 0x52, 0xf9, 0xea, 0x16, + 0xdb, 0x1f, 0x4c, 0x46, 0x3d, 0x09, 0x33, 0x7b, 0xb9, 0xde, 0x36, 0x7b, + 0xc4, 0x03, 0x36, 0x04, 0xc1, 0xf5, 0x7c, 0x53, 0xcf, 0x18, 0xda, 0x85, + 0x56, 0x08, 0xa5, 0x18, 0xc1, 0xfe, 0x3c, 0x47, 0x54, 0x6f, 0xbf, 0xb2, + 0x8c, 0x85, 0xde, 0x06, 0x7e, 0x07, 0x5b, 0x03, 0x84, 0x88, 0xbc, 0x8b, + 0x6c, 0x0d, 0x14, 0xe0, 0x3f, 0x79, 0xc3, 0xed, 0x17, 0xcb, 0xcb, 0x11, + 0x46, 0xb7, 0xfd, 0x66, 0x35, 0x43, 0x08, 0xf7, 0xdc, 0xf3, 0x25, 0xcf, + 0x6a, 0xfc, 0x45, 0x49, 0x62, 0xf1, 0xaa, 0xee, 0x29, 0x32, 0xe7, 0x10, + 0xd6, 0x41, 0x58, 0x13, 0x98, 0x5a, 0xd8, 0x7b, 0x05, 0xf0, 0x2c, 0x7b, + 0xaf, 0xd2, 0xd3, 0x70, 0x77, 0x12, 0x00, 0x18, 0x90, 0x61, 0xec, 0x7a, + 0x42, 0x11, 0xcf, 0x89, 0xae, 0xd7, 0x31, 0x06, 0x09, 0xd2, 0x72, 0xb7, + 0x1d, 0xc3, 0x1d, 0x2d, 0x88, 0x08, 0x8a, 0x17, 0xde, 0x76, 0x98, 0x51, + 0x2c, 0x4e, 0x38, 0x96, 0x8c, 0x8c, 0xe8, 0x56, 0xd8, 0x9c, 0xf2, 0x75, + 0x2f, 0xe7, 0xc1, 0x32, 0x0b, 0x9c, 0x1d, 0x2a, 0x65, 0x7a, 0xb0, 0xa5, + 0xc7, 0xe5, 0x7c, 0xdc, 0x89, 0x07, 0x37, 0xc2, 0x57, 0xbb, 0x53, 0x97, + 0x52, 0x5b, 0x6e, 0x55, 0x74, 0x10, 0x0d, 0xad, 0x9c, 0xe8, 0xd0, 0x1a, + 0x64, 0x6f, 0x43, 0xca, 0xdc, 0xa0, 0x8b, 0xc3, 0x7c, 0x5d, 0x33, 0x52, + 0x32, 0x93, 0x67, 0x72, 0x0b, 0xcc, 0x19, 0x93, 0x4f, 0x1c, 0xbb, 0x64, + 0x37, 0x18, 0xe3, 0x48, 0xac, 0xc2, 0x07, 0x10, 0x1d, 0x50, 0x0c, 0xc0, + 0x2d, 0x46, 0xa5, 0xb0, 0xe1, 0x42, 0x59, 0xca, 0x4d, 0x21, 0x1e, 0xb9, + 0xde, 0x88, 0x40, 0xd6, 0xc3, 0xad, 0xcc, 0xa4, 0x54, 0x5b, 0x6f, 0x9c, + 0xd6, 0xd5, 0xcd, 0xe7, 0xfc, 0x22, 0x2e, 0x42, 0x47, 0x1d, 0x66, 0x0d, + 0xbd, 0x85, 0x3c, 0xb4, 0x83, 0xe1, 0xd3, 0x7a, 0xce, 0xab, 0x4b, 0xf4, + 0xac, 0xec, 0x7d, 0x43, 0x41, 0x94, 0xad, 0x84, 0xef, 0x47, 0x1a, 0x5e, + 0x62, 0xe7, 0x81, 0x5e, 0xe1, 0xd0, 0xcc, 0x19, 0xd5, 0xf0, 0x3c, 0x18, + 0x17, 0xc9, 0x42, 0x0e, 0x78, 0xb2, 0xb6, 0xe2, 0x48, 0x61, 0x15, 0xea, + 0x70, 0x72, 0x87, 0x20, 0x5c, 0x46, 0xe7, 0x8c, 0xd4, 0x23, 0x45, 0x6a, + 0x77, 0xdc, 0xb8, 0x5a, 0xd2, 0x23, 0x0a, 0x21, 0xf8, 0x68, 0x1d, 0x12, + 0x10, 0x7a, 0xd7, 0xd0, 0xb6, 0x46, 0xd6, 0x2c, 0xc3, 0xf2, 0x9c, 0xa3, + 0x1c, 0xad, 0x53, 0xac, 0xd7, 0xc3, 0xb9, 0x5f, 0x39, 0x7b, 0xaa, 0x85, + 0x79, 0x5d, 0xc3, 0x48, 0x12, 0x3a, 0xd2, 0x75, 0xcf, 0x5b, 0x16, 0x19, + 0x16, 0x70, 0xb3, 0xa1, 0xc2, 0xbd, 0x02, 0x31, 0xf2, 0x19, 0x36, 0xfc, + 0xcd, 0x52, 0x28, 0xd6, 0x19, 0x3e, 0x37, 0x16, 0xc4, 0x2e, 0x46, 0xc7, + 0x7d, 0x7c, 0xf0, 0x89, 0x61, 0x98, 0x3b, 0x18, 0xe1, 0xd5, 0x86, 0x25, + 0xbb, 0x15, 0x87, 0xc7, 0x41, 0xb0, 0x1e, 0x97, 0x78, 0xbb, 0x23, 0x24, + 0x74, 0x07, 0x51, 0x0b, 0x01, 0xe4, 0x33, 0x7a, 0xb6, 0xa2, 0x9d, 0x42, + 0x10, 0x25, 0xe0, 0x31, 0x96, 0xce, 0x72, 0xbc, 0x9e, 0xce, 0x3d, 0x62, + 0xb5, 0xdc, 0x9a, 0xa8, 0xf1, 0xf5, 0x7a, 0x7d, 0xec, 0x24, 0xc0, 0xe4, + 0x6b, 0x9d, 0x1c, 0x3d, 0x42, 0x2e, 0x64, 0x56, 0x0d, 0xdd, 0x31, 0x9a, + 0xd7, 0xf9, 0x41, 0x46, 0x85, 0x61, 0xd3, 0x7b, 0xd9, 0x72, 0xd0, 0x37, + 0xa7, 0x7d, 0x54, 0x68, 0xe7, 0x6d, 0x23, 0xae, 0x59, 0xc5, 0x5a, 0xe4, + 0x85, 0x35, 0x58, 0x6b, 0xa3, 0xd4, 0x8c, 0x8e, 0x4b, 0x5d, 0x69, 0x3d, + 0xac, 0x9d, 0x05, 0x51, 0x18, 0xc2, 0x71, 0x50, 0xf0, 0x2d, 0xb9, 0x44, + 0x5c, 0x66, 0x0b, 0x05, 0x10, 0x62, 0xf6, 0x99, 0x93, 0x84, 0xbd, 0x08, + 0x5c, 0xf0, 0x6c, 0xb6, 0x0c, 0x7d, 0xf3, 0x02, 0xb7, 0x51, 0x7a, 0x89, + 0x72, 0x94, 0x5f, 0xd6, 0xe7, 0xc5, 0xf5, 0x8a, 0x97, 0x69, 0x28, 0x2d, + 0x6a, 0x61, 0x53, 0x99, 0xf1, 0x6c, 0x9e, 0xe5, 0x12, 0x74, 0x64, 0x42, + 0x69, 0x70, 0xe1, 0xa0, 0x74, 0xc2, 0xc3, 0xaa, 0xb0, 0xeb, 0x1a, 0xdd, + 0x32, 0x0d, 0xa5, 0x49, 0xdc, 0x0e, 0x61, 0x67, 0x82, 0x8f, 0x9e, 0xb1, + 0x5d, 0x2e, 0x8a, 0xac, 0xc8, 0x84, 0x44, 0x7d, 0x55, 0x18, 0xb8, 0xa4, + 0x7c, 0x11, 0xc8, 0x1b, 0xb1, 0x6d, 0x1e, 0xd1, 0xcf, 0x46, 0x07, 0x9d, + 0x9c, 0x0b, 0xb5, 0xb7, 0xc3, 0xb0, 0xf4, 0xd2, 0xed, 0x58, 0x01, 0x20, + 0xea, 0x9a, 0xe1, 0x55, 0x1b, 0xc9, 0xca, 0x52, 0xb0, 0x60, 0x8f, 0xca, + 0x45, 0x5d, 0x37, 0xae, 0x20, 0xd3, 0xf6, 0x6a, 0x61, 0xd2, 0xdb, 0x9a, + 0xbb, 0xc8, 0x43, 0x4f, 0xe4, 0x85, 0x88, 0x00, 0x3f, 0x5b, 0x49, 0x24, + 0x8a, 0x75, 0xc2, 0x0a, 0x08, 0x74, 0x08, 0x80, 0xbf, 0xd9, 0x0f, 0xe8, + 0xf6, 0x24, 0x71, 0xfb, 0x81, 0x44, 0x01, 0x60, 0x8e, 0xce, 0xda, 0x0e, + 0xe8, 0x6f, 0xb4, 0xd3, 0x9d, 0x62, 0xd5, 0x38, 0xbb, 0xe2, 0xca, 0x6e, + 0x94, 0xfe, 0x24, 0x16, 0x1d, 0xc5, 0x8e, 0x8c, 0x81, 0x75, 0x89, 0x3c, + 0x9e, 0x0f, 0x46, 0x6f, 0x10, 0x6a, 0x9f, 0x67, 0xc7, 0xda, 0x15, 0x20, + 0x67, 0xb0, 0x03, 0x09, 0x5b, 0x98, 0xb3, 0xd9, 0xa6, 0xa0, 0x05, 0xbc, + 0xd4, 0xaf, 0x32, 0xbc, 0xcf, 0x18, 0x49, 0x6a, 0x25, 0x61, 0x16, 0xe6, + 0x79, 0x6a, 0x8b, 0xf8, 0x40, 0x52, 0xe9, 0xfe, 0x2c, 0xab, 0xb6, 0x87, + 0x23, 0x9c, 0xc8, 0xf2, 0x20, 0xec, 0x61, 0x61, 0x2a, 0x1b, 0x6a, 0xdf, + 0xf7, 0xc2, 0x78, 0x2e, 0x91, 0x9e, 0x5c, 0xb9, 0xb8, 0xb5, 0x0e, 0x0e, + 0xb3, 0x34, 0x67, 0xd2, 0x4b, 0x72, 0xe0, 0x42, 0x45, 0x9c, 0xd3, 0x31, + 0xb2, 0x8f, 0xcc, 0x73, 0x84, 0xf9, 0x90, 0xb2, 0x2e, 0x16, 0xbb, 0x5e, + 0x32, 0x9a, 0x68, 0x7e, 0x8c, 0x37, 0x01, 0x9f, 0xf7, 0x6e, 0xca, 0x2d, + 0xa4, 0xe5, 0x75, 0x39, 0x70, 0x41, 0x9e, 0x5d, 0x22, 0xfc, 0x40, 0xae, + 0x89, 0x64, 0x6c, 0x45, 0x68, 0xa9, 0x1e, 0x42, 0x2f, 0x87, 0x44, 0x2c, + 0xdf, 0xba, 0x07, 0xf6, 0x50, 0x34, 0x22, 0x1c, 0xe9, 0xb8, 0x0e, 0xf2, + 0xf4, 0x35, 0x37, 0x5f, 0xc9, 0x4b, 0x9e, 0x39, 0x87, 0x47, 0xef, 0x94, + 0x5c, 0x16, 0xb2, 0xcc, 0xd1, 0xd4, 0x89, 0xc3, 0x2e, 0x01, 0x4e, 0x78, + 0x8d, 0xd2, 0x58, 0x21, 0x5b, 0xf5, 0x33, 0x5b, 0x8a, 0xf9, 0xcc, 0x38, + 0xdb, 0xd8, 0xd9, 0xed, 0x77, 0x8a, 0x0f, 0x53, 0x2e, 0x65, 0x93, 0xb0, + 0xda, 0x0d, 0x7b, 0x72, 0x71, 0xc1, 0x57, 0xf3, 0xe4, 0xd8, 0x15, 0x4d, + 0x43, 0x65, 0xd0, 0xde, 0xe7, 0xfb, 0x53, 0xb5, 0x5e, 0x05, 0xfa, 0xba, + 0x6f, 0xd2, 0xe5, 0x55, 0x0f, 0xea, 0x23, 0x2a, 0xbb, 0xf3, 0x78, 0xb1, + 0x91, 0xf5, 0x4d, 0x9f, 0xf2, 0x11, 0xed, 0x03, 0x26, 0x4b, 0xcc, 0x7a, + 0xe9, 0xce, 0xcd, 0x8b, 0x8e, 0xef, 0xe6, 0xb1, 0xb4, 0xae, 0x54, 0x82, + 0x2a, 0x92, 0xba, 0x55, 0x2f, 0x54, 0x68, 0xf6, 0x15, 0xed, 0xc1, 0x83, + 0x2a, 0xa8, 0x69, 0xd1, 0xfb, 0xea, 0x12, 0xde, 0xab, 0x64, 0xb0, 0xb7, + 0x66, 0xd7, 0x13, 0x6f, 0x50, 0xc9, 0x75, 0x94, 0xc4, 0xfd, 0x58, 0x18, + 0x75, 0xea, 0x17, 0xca, 0x22, 0x82, 0x83, 0x2c, 0x4d, 0x19, 0x26, 0x6e, + 0x2b, 0xac, 0x68, 0xc8, 0xd1, 0xcf, 0x21, 0x5b, 0x41, 0xfc, 0x54, 0xa6, + 0x57, 0x33, 0x73, 0x4b, 0xac, 0xdb, 0x80, 0x94, 0x6a, 0x82, 0x88, 0xaa, + 0x72, 0x18, 0xec, 0xf8, 0x84, 0x1e, 0xb1, 0x95, 0x36, 0xf3, 0xe6, 0x9b, + 0x70, 0x53, 0xae, 0x38, 0x85, 0x33, 0xaa, 0x95, 0x88, 0xf0, 0xbe, 0x59, + 0xc4, 0x20, 0x28, 0x53, 0x45, 0xb0, 0x63, 0xe6, 0xc4, 0x3a, 0x3a, 0xab, + 0xaa, 0x52, 0xcf, 0xf6, 0x42, 0xa3, 0x6e, 0x77, 0xc4, 0xc9, 0xd5, 0xf3, + 0x94, 0x3d, 0x96, 0x4a, 0x3f, 0xf2, 0x2a, 0xd0, 0x9f, 0x5c, 0xde, 0xb8, + 0xf9, 0x3c, 0xaf, 0x9a, 0x4d, 0xb4, 0x5d, 0xc4, 0x1e, 0xa7, 0xcf, 0x3c, + 0x3e, 0x1e, 0x50, 0x79, 0x98, 0x0f, 0xb8, 0x1f, 0x29, 0x67, 0xfe, 0x02, + 0xef, 0x4f, 0x63, 0x46, 0xfa, 0xf8, 0xb9, 0x4e, 0xbc, 0xc5, 0xa5, 0x2c, + 0x63, 0x3a, 0xe3, 0x19, 0xa3, 0x8f, 0x4f, 0x99, 0x74, 0x5e, 0xd3, 0xc7, + 0x16, 0x18, 0x9c, 0xa2, 0x45, 0xb3, 0x9e, 0x98, 0xc5, 0x20, 0x48, 0x2c, + 0x12, 0xce, 0x2c, 0xeb, 0x36, 0x50, 0x0b, 0xe3, 0x8a, 0x7a, 0xc5, 0x50, + 0x64, 0xf5, 0xf5, 0x24, 0x04, 0x64, 0x2e, 0x9d, 0x37, 0x0b, 0x4a, 0x53, + 0x95, 0x8d, 0x2e, 0x19, 0x4e, 0x4d, 0x2b, 0xed, 0x65, 0xb1, 0xdc, 0x0c, + 0xd4, 0xd1, 0x4d, 0xd2, 0x28, 0xd5, 0xf4, 0x05, 0xc0, 0x86, 0x72, 0xb3, + 0xde, 0x38, 0x0e, 0xb2, 0xb5, 0x11, 0xe5, 0xb2, 0xad, 0x69, 0x6c, 0x5c, + 0x99, 0x4b, 0xde, 0x8f, 0xb4, 0x1d, 0x4c, 0x81, 0x8c, 0x81, 0x56, 0xb6, + 0x28, 0xc1, 0x9c, 0x38, 0x66, 0xe5, 0x84, 0xa2, 0x8d, 0xcf, 0xd9, 0x76, + 0x7b, 0x28, 0x4a, 0xad, 0x95, 0xf1, 0xa2, 0xe5, 0x04, 0x75, 0x91, 0xe4, + 0x1c, 0xd6, 0xea, 0xd7, 0xeb, 0xd6, 0x6b, 0xa3, 0x7d, 0x11, 0x77, 0x55, + 0x2f, 0xeb, 0x24, 0x24, 0x20, 0x0b, 0x21, 0xae, 0x02, 0x16, 0x2d, 0x3d, + 0xce, 0x13, 0xf0, 0xe0, 0x7a, 0xd8, 0xae, 0x23, 0x9a, 0x3a, 0xd3, 0x7b, + 0xc9, 0xc3, 0x21, 0x64, 0xde, 0x15, 0xc9, 0x7a, 0xe9, 0xe3, 0x9a, 0x2b, + 0x1f, 0x92, 0x93, 0x5d, 0x99, 0xea, 0xe5, 0x2a, 0x96, 0x92, 0x34, 0x0c, + 0x30, 0x0c, 0xe0, 0x3d, 0xa3, 0x09, 0xbd, 0x93, 0xbb, 0xac, 0x1b, 0x5b, + 0x4b, 0xa7, 0x45, 0xaf, 0x67, 0x46, 0xce, 0x84, 0x1c, 0x4f, 0x96, 0x5d, + 0x19, 0x77, 0x4b, 0x7a, 0x7e, 0xbe, 0xe4, 0x3a, 0x3a, 0x96, 0x5d, 0xb3, + 0xda, 0xe8, 0x83, 0x7c, 0x70, 0x63, 0x87, 0xa8, 0x9b, 0x06, 0xa4, 0x52, + 0x83, 0x81, 0x42, 0x67, 0x18, 0x64, 0x28, 0xeb, 0x9c, 0x5e, 0xba, 0xec, + 0x79, 0xa0, 0x24, 0x16, 0xe9, 0x7c, 0x30, 0x88, 0xa2, 0xd6, 0xc9, 0xf3, + 0xd8, 0x70, 0x26, 0xb3, 0x1e, 0x8f, 0xa6, 0x2b, 0x8e, 0x08, 0x99, 0x51, + 0x24, 0x1c, 0x29, 0x38, 0x1e, 0x72, 0xfd, 0x19, 0x24, 0x57, 0xac, 0x5e, + 0xb7, 0x8e, 0xbd, 0xc6, 0x41, 0x9e, 0x9b, 0x2d, 0x58, 0x04, 0xa3, 0xbd, + 0xc0, 0xcd, 0x00, 0x48, 0xdb, 0xb2, 0xe0, 0xcf, 0xcf, 0x3f, 0xff, 0xf0, + 0x10, 0x14, 0x55, 0xe6, 0x34, 0x7f, 0x7d, 0xd3, 0x17, 0x41, 0x80, 0xbe, + 0xf9, 0xe1, 0x3f, 0xff, 0xed, 0xff, 0xfb, 0xb7, 0x7f, 0x8b, 0x9a, 0x2c, + 0xfd, 0xf1, 0xdf, 0xdc, 0xc2, 0x1b, 0x1f, 0xfe, 0xf7, 0xbf, 0x3d, 0x3c, + 0x44, 0x7e, 0x1c, 0x46, 0xcd, 0x4f, 0x0f, 0x08, 0x0c, 0xff, 0xfb, 0x7f, + 0x82, 0xef, 0x4d, 0xd1, 0x9e, 0xa2, 0x47, 0xe7, 0xd4, 0xc4, 0x45, 0xfe, + 0xd3, 0x43, 0xe6, 0xe4, 0x71, 0xd9, 0xa6, 0xce, 0xf4, 0x6d, 0xba, 0xdb, + 0xc7, 0x5e, 0x13, 0x3d, 0x17, 0x06, 0x8d, 0xbd, 0x6b, 0xc6, 0x75, 0x4e, + 0x49, 0x58, 0x15, 0x6d, 0xee, 0x3d, 0x9e, 0x8a, 0xb4, 0xa8, 0x7e, 0x7a, + 0xe8, 0x9c, 0xea, 0xaf, 0x8f, 0xf7, 0x2f, 0xe0, 0xa7, 0xf7, 0x18, 0x56, + 0xce, 0xf8, 0xc3, 0xd4, 0x46, 0x50, 0xe4, 0xcd, 0x63, 0xe0, 0x64, 0x71, + 0x3a, 0xfe, 0xf4, 0xf0, 0x66, 0x5d, 0xf7, 0x4e, 0xea, 0xbd, 0xf9, 0xf1, + 0xa1, 0x76, 0xf2, 0xfa, 0xb1, 0xf6, 0xab, 0x38, 0xf8, 0xcf, 0x57, 0xc8, + 0xca, 0x9c, 0x2a, 0x8c, 0x01, 0x41, 0xf0, 0xf4, 0xa5, 0xe8, 0xfc, 0x2a, + 0x00, 0x36, 0xf2, 0xd3, 0x43, 0x14, 0x7b, 0x9e, 0x7f, 0xa3, 0xac, 0x74, + 0x3c, 0x2f, 0xce, 0xc3, 0xa7, 0x12, 0x1f, 0xd3, 0xf9, 0x1f, 0x37, 0x22, + 0x1f, 0x7b, 0xdf, 0x4d, 0xe2, 0xe6, 0xb1, 0x71, 0xca, 0xc7, 0x08, 0xb4, + 0x9f, 0x4e, 0x7d, 0x3c, 0xd3, 0x5b, 0x85, 0xae, 0xf3, 0x57, 0xf8, 0xc7, + 0x87, 0xa7, 0x7f, 0x37, 0x52, 0xdf, 0x55, 0xb8, 0x31, 0xe5, 0xe4, 0xa4, + 0x69, 0xd1, 0x02, 0xa2, 0xf2, 0x22, 0xf7, 0x5f, 0xde, 0x6e, 0x01, 0xd9, + 0x80, 0xf4, 0xd4, 0x3f, 0xbd, 0xbc, 0x99, 0x4c, 0x9c, 0xfe, 0xcc, 0xbd, + 0xac, 0xb8, 0x7e, 0xee, 0x4e, 0xfd, 0xfa, 0x8d, 0x57, 0x2e, 0x82, 0x71, + 0x41, 0xff, 0xf1, 0x1f, 0x80, 0x35, 0x71, 0xfe, 0x70, 0x02, 0x4c, 0x05, + 0xbf, 0xfd, 0xea, 0xe1, 0x3f, 0xa0, 0x7f, 0x7b, 0x1b, 0xba, 0xf5, 0xe3, + 0xfb, 0x2b, 0x5f, 0x97, 0x4f, 0x06, 0xca, 0x3d, 0xd6, 0x91, 0x13, 0x34, + 0xb7, 0x61, 0x7b, 0x71, 0x5d, 0xa6, 0x0e, 0x90, 0x4e, 0x9c, 0xa7, 0xd3, + 0x1d, 0x37, 0x2d, 0x4e, 0xc9, 0xe7, 0xa5, 0xf2, 0x98, 0xfa, 0x01, 0xb8, + 0xe8, 0xb4, 0x4d, 0xf1, 0xe2, 0x62, 0x75, 0x2f, 0xfa, 0xfe, 0xea, 0xf0, + 0xf8, 0x24, 0x15, 0x1c, 0xc1, 0xcb, 0xe1, 0xb3, 0x72, 0x2c, 0xea, 0xf8, + 0xae, 0x7b, 0x95, 0x3f, 0xe9, 0x5d, 0xe7, 0xbf, 0x26, 0xcf, 0x77, 0xe3, + 0xae, 0x4f, 0x95, 0xef, 0xdf, 0x7e, 0x15, 0x69, 0xea, 0xb8, 0xa9, 0xff, + 0xe0, 0x54, 0xbe, 0xf3, 0x8e, 0x09, 0xf7, 0xeb, 0x1f, 0x28, 0x3a, 0x90, + 0xe2, 0xe9, 0xaf, 0x53, 0x43, 0x0f, 0x8f, 0x0f, 0x04, 0x20, 0xe4, 0x87, + 0x17, 0x34, 0xbb, 0xc0, 0x95, 0x17, 0x19, 0xe8, 0x07, 0xa7, 0x3f, 0xa4, + 0xf0, 0x71, 0x78, 0x49, 0xe3, 0xbb, 0xab, 0xe3, 0xf3, 0xf8, 0x00, 0x49, + 0x2f, 0xfa, 0xfb, 0xe9, 0xa7, 0x67, 0xcd, 0xb8, 0x7f, 0x77, 0x9d, 0xbb, + 0x10, 0x9e, 0x46, 0x81, 0x4e, 0x6d, 0x7f, 0xb5, 0xc6, 0x63, 0x53, 0x01, + 0x99, 0x7d, 0x24, 0xbc, 0x9f, 0x1e, 0xc0, 0xd5, 0xbc, 0x2e, 0xc1, 0x20, + 0xf3, 0xe6, 0x9b, 0x1a, 0x89, 0xda, 0xcc, 0xfd, 0x06, 0x0d, 0x28, 0xab, + 0x18, 0xf0, 0xe0, 0x6e, 0xa0, 0x6e, 0x51, 0x79, 0x40, 0xd9, 0x2a, 0xc7, + 0x8b, 0xdb, 0x1a, 0x90, 0x0b, 0x3f, 0xd1, 0x0b, 0xfd, 0xc7, 0x83, 0xdb, + 0x02, 0x06, 0xe5, 0xf5, 0x3b, 0xfe, 0xde, 0xbf, 0xdf, 0xda, 0x77, 0xca, + 0xd2, 0x77, 0x00, 0x71, 0x27, 0xff, 0xbd, 0xd2, 0x7e, 0xab, 0xd6, 0x3d, + 0xde, 0x2c, 0xf1, 0xb5, 0xce, 0x9f, 0x34, 0xe5, 0x7e, 0x15, 0x08, 0xa6, + 0x1c, 0x1e, 0x3c, 0xa7, 0x8e, 0x7c, 0xef, 0x6e, 0xaf, 0xaf, 0x0c, 0xe1, + 0x71, 0xba, 0xf1, 0x03, 0xb0, 0xe0, 0xb7, 0xe8, 0xad, 0xc1, 0x97, 0xe6, + 0xfd, 0xc5, 0xe2, 0xe4, 0xbd, 0x78, 0x5b, 0xd5, 0x53, 0xf9, 0xb2, 0x88, + 0xf3, 0xc6, 0xaf, 0x6e, 0x0e, 0x2b, 0xf5, 0x07, 0xe0, 0xbe, 0x26, 0x3d, + 0x45, 0x3e, 0x71, 0x60, 0x71, 0x1e, 0x01, 0x9f, 0xd5, 0xbc, 0xbb, 0x5e, + 0xc7, 0x57, 0x7f, 0x52, 0xa0, 0x3b, 0xdd, 0xb7, 0x4b, 0xfd, 0x93, 0xe6, + 0x61, 0x30, 0xfc, 0xd2, 0x95, 0xa1, 0x4f, 0x2a, 0xd6, 0x36, 0x93, 0x91, + 0x7d, 0x8b, 0x6b, 0x03, 0x8d, 0x3e, 0x3c, 0x29, 0xe6, 0xeb, 0x66, 0xd2, + 0xf8, 0x43, 0xf3, 0xe8, 0x00, 0x66, 0x4e, 0xd7, 0xa7, 0x4e, 0xdf, 0x5d, + 0x7c, 0xdf, 0xae, 0x9f, 0xa6, 0x71, 0x59, 0xc7, 0xf5, 0xed, 0xd6, 0xa4, + 0x4c, 0x4f, 0xed, 0x00, 0xe7, 0x36, 0xf1, 0xac, 0x7e, 0x98, 0xa8, 0x71, + 0xaa, 0xcf, 0xf8, 0x1c, 0xa0, 0xc4, 0x51, 0xdc, 0x00, 0xb1, 0x95, 0xce, + 0x5d, 0xd0, 0x7d, 0xe5, 0x94, 0xef, 0x15, 0xf1, 0xae, 0x0f, 0xff, 0x0d, + 0x1c, 0xc8, 0x64, 0x8b, 0xde, 0xff, 0xba, 0x69, 0x46, 0x01, 0xca, 0xc6, + 0x0d, 0xe0, 0x15, 0xfc, 0x16, 0xbb, 0xd3, 0x7e, 0x63, 0xed, 0xa3, 0xdf, + 0x01, 0x25, 0xae, 0x5f, 0x78, 0xb3, 0x97, 0x4d, 0x4c, 0x11, 0xa8, 0xf3, + 0xef, 0x0d, 0xbc, 0x94, 0x7e, 0x5d, 0xa4, 0xb1, 0xf7, 0x05, 0xd5, 0x1d, + 0x26, 0x8d, 0xf2, 0xa6, 0x81, 0xc6, 0x79, 0xed, 0x37, 0x0f, 0x30, 0xf8, + 0x4b, 0x82, 0x7a, 0x13, 0xef, 0xbe, 0x45, 0x65, 0x7e, 0x04, 0xad, 0x3c, + 0xfc, 0xea, 0x5a, 0x2f, 0x14, 0xed, 0x75, 0xd2, 0x3e, 0x1c, 0xdd, 0x2f, + 0xbf, 0xd4, 0x3e, 0xf0, 0xcf, 0x1e, 0xb8, 0xf7, 0xc9, 0x00, 0x3f, 0xa7, + 0xde, 0xef, 0x6a, 0xbc, 0xef, 0x17, 0xfb, 0xa2, 0x82, 0xbf, 0x52, 0x81, + 0xfa, 0x12, 0x25, 0x1f, 0xb2, 0xfc, 0x13, 0xcb, 0xfd, 0xd6, 0xf6, 0x5f, + 0x13, 0xd7, 0xb7, 0x0f, 0xe6, 0x57, 0x0a, 0xf0, 0x95, 0x76, 0x3e, 0x16, + 0x21, 0xfd, 0xcd, 0xf5, 0x3e, 0x23, 0x44, 0x37, 0x05, 0xbc, 0xf8, 0xe1, + 0x9d, 0xb9, 0x4c, 0x98, 0xea, 0x27, 0x10, 0x70, 0x9c, 0xd4, 0xff, 0x2b, + 0xfc, 0x96, 0xa1, 0x5f, 0x61, 0x69, 0xe6, 0xe7, 0xed, 0x8d, 0x8b, 0x1f, + 0x99, 0xfa, 0x07, 0x51, 0xec, 0x43, 0x6b, 0x3d, 0xf9, 0x77, 0x6f, 0xf3, + 0x71, 0x53, 0x65, 0xe5, 0x4f, 0x4c, 0xf8, 0xdf, 0x9f, 0x73, 0x43, 0x4f, + 0xee, 0xe6, 0xa9, 0x83, 0xe7, 0x18, 0x87, 0x3f, 0xb9, 0x9f, 0x5b, 0xf4, + 0x7e, 0x17, 0xb4, 0x9f, 0x0a, 0x3d, 0x13, 0x85, 0x3c, 0x79, 0x92, 0x17, + 0xde, 0xe5, 0xb3, 0x3e, 0x04, 0x78, 0x8f, 0x26, 0x06, 0x43, 0x7e, 0xbe, + 0xd1, 0x14, 0xe5, 0x27, 0xbe, 0x20, 0xce, 0x81, 0x27, 0x71, 0xd2, 0x57, + 0x34, 0x2c, 0x2d, 0x5e, 0x1f, 0xc1, 0x87, 0xe4, 0x91, 0x1f, 0x92, 0xf7, + 0x44, 0x0e, 0x08, 0x12, 0xef, 0x8a, 0x10, 0xe4, 0x47, 0x24, 0xd3, 0x5f, + 0x20, 0xf9, 0x99, 0xd9, 0xd8, 0x07, 0xe1, 0xf6, 0x25, 0x4d, 0x3f, 0xfd, + 0xe4, 0xfa, 0x40, 0x9a, 0xfe, 0x8d, 0xb6, 0x57, 0x04, 0xff, 0x4e, 0x49, + 0x9e, 0x34, 0x03, 0x48, 0x28, 0x9f, 0x10, 0x4d, 0xd3, 0x54, 0x7f, 0x9d, + 0xda, 0xca, 0x9d, 0xcc, 0xff, 0xe1, 0x63, 0x49, 0x3c, 0x91, 0xf8, 0x91, + 0x97, 0x04, 0x30, 0x3c, 0xfd, 0x1c, 0x11, 0x20, 0xfe, 0x3d, 0x81, 0xb4, + 0xaf, 0xc4, 0xe5, 0x4f, 0x29, 0xc8, 0xfc, 0xc6, 0xf9, 0x10, 0xb1, 0xbd, + 0x83, 0x6a, 0x2f, 0x69, 0x82, 0x5f, 0xd3, 0x06, 0xfc, 0x15, 0x42, 0x81, + 0xb6, 0x7d, 0x4a, 0x25, 0xd0, 0xc0, 0x22, 0x6d, 0xa7, 0x20, 0xf1, 0x55, + 0x35, 0xc4, 0x3f, 0x54, 0x43, 0x02, 0xfd, 0x42, 0xc7, 0x1f, 0xa9, 0xe1, + 0x24, 0xe7, 0x67, 0x7c, 0x08, 0xff, 0x51, 0x9a, 0xf9, 0x7e, 0x68, 0x80, + 0xdf, 0x37, 0x0b, 0xbc, 0x0d, 0xf1, 0x5b, 0x0c, 0xf3, 0x65, 0xd5, 0xd2, + 0xa9, 0x6b, 0x80, 0xb4, 0x80, 0xbb, 0x0c, 0xa3, 0x3b, 0x8f, 0xbe, 0xc6, + 0x7c, 0xf8, 0x8b, 0x51, 0xbc, 0x28, 0x7f, 0x7a, 0x78, 0xc4, 0x5f, 0x53, + 0xdb, 0x49, 0x05, 0x00, 0xb4, 0x7b, 0x55, 0x10, 0xcf, 0x8d, 0x93, 0xf4, + 0x87, 0x0c, 0x46, 0x3f, 0xe2, 0x26, 0xf9, 0xbd, 0xb8, 0xf9, 0xce, 0xc6, + 0xe8, 0x2f, 0xd1, 0xfa, 0x94, 0x4b, 0x7e, 0x91, 0xe4, 0x67, 0xc3, 0xfe, + 0x90, 0x49, 0xaf, 0x78, 0x83, 0x57, 0x88, 0xbe, 0x03, 0xd3, 0x9b, 0xcb, + 0x7d, 0x46, 0xa5, 0xef, 0xfc, 0xef, 0xb7, 0x65, 0xa5, 0x9f, 0xa2, 0xcf, + 0x9b, 0x04, 0xde, 0x87, 0xaf, 0xff, 0x17, 0xa5, 0xa7, 0xbf, 0xf7, 0x02, + 0xf7, 0x0c, 0x01, 0x7e, 0x17, 0xac, 0xe2, 0xeb, 0x8d, 0xab, 0x4f, 0x35, + 0xc1, 0xa5, 0xff, 0xfc, 0xba, 0x25, 0xbf, 0x33, 0xd7, 0x89, 0x21, 0x1f, + 0x30, 0x02, 0x7f, 0xdd, 0xc3, 0xbd, 0x57, 0x14, 0xc7, 0xbd, 0xe9, 0x9d, + 0xff, 0xb9, 0x00, 0xf2, 0x69, 0xae, 0xf4, 0x8e, 0x25, 0xbf, 0xfc, 0x92, + 0x16, 0x61, 0x71, 0x63, 0xcc, 0x3b, 0x02, 0x9e, 0x51, 0xdd, 0x33, 0x9f, + 0x5f, 0x4f, 0xe2, 0xe8, 0x0f, 0xe2, 0x17, 0xfa, 0x3e, 0x0b, 0x7b, 0x08, + 0x62, 0x3f, 0xf5, 0xa6, 0x08, 0xf5, 0xcc, 0xfb, 0x77, 0x17, 0xfe, 0xf7, + 0x37, 0x81, 0xf9, 0xcf, 0xe0, 0x83, 0x4f, 0x20, 0x16, 0xf2, 0xc3, 0xef, + 0x62, 0xf8, 0x4b, 0x83, 0x24, 0x3e, 0x34, 0x0f, 0xfa, 0x6b, 0x1c, 0x7f, + 0x6f, 0x9a, 0xcf, 0xcc, 0x7c, 0x1e, 0x23, 0x60, 0xa8, 0x1f, 0xfa, 0xb9, + 0xf7, 0x21, 0x4b, 0x5f, 0x26, 0xcd, 0x0f, 0xff, 0x4f, 0x9c, 0x95, 0x45, + 0xd5, 0x38, 0x79, 0xf3, 0x99, 0x40, 0xf1, 0x75, 0x20, 0x3f, 0x65, 0xd7, + 0x9f, 0xb5, 0xcd, 0xcf, 0x91, 0xf4, 0x08, 0xcc, 0x28, 0x2d, 0xbf, 0x12, + 0x5c, 0x3e, 0x13, 0xe0, 0xde, 0x4c, 0x55, 0x7f, 0xb9, 0x2b, 0xd4, 0x9b, + 0xcf, 0xe5, 0x44, 0x1f, 0x4c, 0xe2, 0x2c, 0x1d, 0x70, 0x19, 0xf8, 0x84, + 0x07, 0x05, 0x34, 0x52, 0xbf, 0xf9, 0x68, 0xa8, 0x28, 0xfe, 0x55, 0x6f, + 0x47, 0x7f, 0x90, 0x12, 0x47, 0x20, 0xb5, 0x9e, 0x68, 0x78, 0x78, 0x75, + 0x68, 0x5f, 0x1b, 0xd4, 0xa9, 0xa8, 0x4a, 0xd0, 0xcb, 0x0f, 0x5f, 0x90, + 0x97, 0x17, 0x77, 0x9f, 0x97, 0xd9, 0x6b, 0xbc, 0xce, 0x40, 0x32, 0x96, + 0xbe, 0x9f, 0x72, 0x69, 0x6e, 0x33, 0x0d, 0x40, 0xe5, 0xef, 0xed, 0x83, + 0xb0, 0x19, 0xf8, 0x20, 0x23, 0x3f, 0xf9, 0xf5, 0xcb, 0x3c, 0xff, 0x43, + 0x0b, 0x7c, 0x59, 0xa8, 0xf1, 0x3e, 0x4b, 0x7d, 0x9c, 0x82, 0xbe, 0x1f, + 0x4f, 0x11, 0xe8, 0xf8, 0x74, 0x47, 0x17, 0x9f, 0xea, 0xc2, 0xeb, 0x4d, + 0xfe, 0x77, 0x53, 0x84, 0x61, 0x0a, 0xdc, 0x74, 0x1f, 0x37, 0xa7, 0xe8, + 0x7f, 0xfd, 0xf8, 0x5a, 0x99, 0xdb, 0xa5, 0xf8, 0xf4, 0xe4, 0x8e, 0x3f, + 0x91, 0xeb, 0xab, 0x0d, 0x57, 0xef, 0x12, 0x83, 0xcf, 0x93, 0xfd, 0x69, + 0xa2, 0xf3, 0x61, 0x13, 0xcf, 0x5d, 0xbf, 0xb8, 0x0a, 0x02, 0x44, 0x14, + 0xa7, 0xde, 0xb7, 0xe8, 0xe6, 0x57, 0xc9, 0xfa, 0xde, 0x6d, 0x7b, 0x0f, + 0x7e, 0xf6, 0x2b, 0x24, 0xf4, 0x29, 0xfa, 0xfa, 0xc4, 0xbf, 0xbe, 0x02, + 0xd6, 0xef, 0x97, 0x9a, 0x31, 0x7d, 0x81, 0x10, 0xbf, 0x88, 0x89, 0xdf, + 0x4f, 0x4f, 0x7d, 0x78, 0xf9, 0x66, 0x41, 0x1f, 0x84, 0xe0, 0x97, 0x83, + 0xf9, 0x50, 0xe4, 0x2f, 0xe8, 0x78, 0x07, 0x8c, 0x81, 0x1b, 0x07, 0x1c, + 0x99, 0x2c, 0xb3, 0x7e, 0xaf, 0xd3, 0x1f, 0xa1, 0xbe, 0x8f, 0x22, 0xd6, + 0x8b, 0x8e, 0x80, 0x5d, 0xd5, 0xaf, 0x39, 0xfb, 0x27, 0x3f, 0xfa, 0x49, + 0xa8, 0xbb, 0x61, 0x80, 0x69, 0xd6, 0xe0, 0xa7, 0x87, 0xfb, 0xdc, 0xc1, + 0x47, 0x53, 0x73, 0x77, 0x5e, 0x77, 0xb1, 0xdf, 0x4f, 0x8e, 0xf3, 0x89, + 0x15, 0x3f, 0x3c, 0x3c, 0x3e, 0x60, 0x13, 0x6a, 0xba, 0xf1, 0xfb, 0xdc, + 0xd6, 0x4d, 0x1c, 0x8c, 0x8f, 0xef, 0x3c, 0xd6, 0x0d, 0x99, 0x3c, 0x3a, + 0xb7, 0x48, 0xff, 0x05, 0x7e, 0xbd, 0x9c, 0xb7, 0xbb, 0x4f, 0x91, 0xbd, + 0x3e, 0xe5, 0xf2, 0x3c, 0xba, 0x27, 0x04, 0x03, 0xd4, 0xc9, 0xf3, 0xeb, + 0x04, 0xb0, 0xf9, 0xb5, 0xd8, 0xf9, 0x5c, 0xb8, 0x68, 0x9b, 0xb2, 0x05, + 0xf4, 0xc6, 0x9e, 0xff, 0xf0, 0xe2, 0xc2, 0xd7, 0xab, 0xdc, 0x4a, 0x7c, + 0x29, 0xdc, 0xdc, 0x8b, 0xfd, 0xf2, 0xcb, 0xe4, 0x08, 0x6e, 0xb3, 0x9b, + 0xbf, 0x6d, 0xba, 0xed, 0x7d, 0x1e, 0xfb, 0xba, 0xa4, 0x9e, 0xc3, 0xf2, + 0xbb, 0xd6, 0x7e, 0x4d, 0xb0, 0xbd, 0x21, 0xc4, 0x1f, 0xfe, 0xf3, 0x0b, + 0x18, 0x0f, 0x87, 0xe1, 0xd7, 0x26, 0xbc, 0xde, 0xc5, 0xdd, 0x67, 0x21, + 0x01, 0x8d, 0xba, 0xa9, 0xe7, 0x33, 0x19, 0xef, 0xe7, 0x32, 0xbf, 0xe0, + 0x77, 0x3e, 0x33, 0xd0, 0xf7, 0x75, 0x9f, 0x5c, 0x72, 0x13, 0xc5, 0xf9, + 0xe7, 0x19, 0xfb, 0xb9, 0x79, 0xdb, 0x57, 0x27, 0x44, 0x5f, 0xc0, 0xa1, + 0x97, 0xa6, 0xf7, 0x0d, 0x6d, 0xbe, 0x3a, 0xb3, 0xfb, 0xab, 0x24, 0xf6, + 0x1b, 0xba, 0xfc, 0x5e, 0xf3, 0xc0, 0xef, 0xf5, 0x84, 0x7a, 0x75, 0x36, + 0xee, 0x99, 0xe6, 0x67, 0xe2, 0xd2, 0xc2, 0xf1, 0x9e, 0x82, 0xf5, 0x2d, + 0x86, 0x3d, 0x02, 0x3d, 0xc9, 0xea, 0x97, 0x78, 0xf5, 0xb7, 0x3d, 0x9a, + 0xf8, 0x18, 0x39, 0x3f, 0x4f, 0xaa, 0x7c, 0xe2, 0x1b, 0xde, 0x77, 0x74, + 0x7f, 0x4c, 0x01, 0x7f, 0x08, 0x45, 0x82, 0x78, 0xf0, 0xbd, 0x77, 0x38, + 0x04, 0xfe, 0x2c, 0x80, 0x7e, 0x1a, 0x47, 0x9c, 0x85, 0xaf, 0xa9, 0xc4, + 0xb3, 0xf2, 0xbe, 0x9c, 0xbe, 0xba, 0x4d, 0x40, 0xe1, 0x4f, 0x33, 0x57, + 0x9f, 0xe3, 0xf1, 0x73, 0x5f, 0xe4, 0x07, 0x12, 0xbd, 0x77, 0xf6, 0xe3, + 0xab, 0x8f, 0xd7, 0x40, 0xdd, 0x10, 0x98, 0x47, 0x5b, 0xa5, 0x7f, 0x7d, + 0xe3, 0x39, 0x8d, 0xf3, 0xd3, 0xed, 0x02, 0x54, 0x77, 0xe1, 0x6c, 0xc8, + 0xd2, 0x1f, 0xff, 0x1d, 0xe3, 0xc1, 0xc7, 0x07, 0xf0, 0x31, 0xaf, 0x7f, + 0xfe, 0x4b, 0xd4, 0x34, 0xe5, 0x4f, 0x10, 0xd4, 0xf7, 0xfd, 0xdb, 0x1e, + 0x7b, 0x5b, 0x54, 0x21, 0x04, 0xc0, 0x3b, 0x3c, 0x15, 0xfe, 0xcb, 0xc3, + 0xe4, 0x62, 0xb9, 0x62, 0xf8, 0xf9, 0x2f, 0x13, 0xa1, 0x18, 0x8c, 0x4f, + 0xff, 0xff, 0x72, 0x27, 0xe8, 0xe7, 0xbf, 0x20, 0x04, 0xfa, 0x97, 0x27, + 0xde, 0xde, 0xbf, 0xfc, 0x3b, 0x26, 0x80, 0xa6, 0x4b, 0xa7, 0x89, 0x00, + 0xcb, 0xd2, 0xf4, 0xe7, 0xbf, 0xfc, 0x3b, 0x8a, 0xc1, 0xf0, 0x09, 0x0e, + 0xdc, 0xbf, 0xdc, 0x2e, 0x3c, 0x3e, 0xcd, 0xf2, 0x82, 0xe6, 0xde, 0x82, + 0x66, 0xbc, 0x9f, 0xff, 0xb2, 0xc4, 0xf1, 0xb7, 0xc8, 0x03, 0x8a, 0xe2, + 0x0e, 0xf1, 0x40, 0x80, 0x2e, 0x10, 0xf0, 0x17, 0x7e, 0x40, 0x65, 0xb8, + 0x7b, 0x44, 0xa3, 0xe9, 0xde, 0x35, 0x03, 0xc3, 0x7e, 0xc0, 0xe9, 0x8f, + 0xee, 0xd3, 0xe8, 0x54, 0x00, 0x41, 0xd1, 0xa9, 0x04, 0x41, 0xbd, 0xa5, + 0x1f, 0x71, 0xf2, 0x65, 0x91, 0x47, 0x54, 0x06, 0x94, 0x76, 0x68, 0xf4, + 0x88, 0xdf, 0x8a, 0x80, 0xcb, 0x5f, 0xbc, 0x4f, 0xbe, 0x45, 0x1f, 0x11, + 0xe4, 0x23, 0x2a, 0xa2, 0x47, 0x1a, 0x5c, 0xff, 0xb0, 0x5a, 0x34, 0x5d, + 0xba, 0x66, 0x8f, 0x28, 0x41, 0x3e, 0x7e, 0x42, 0x15, 0x7c, 0x27, 0xea, + 0x46, 0x35, 0x4d, 0xbc, 0xa5, 0x1f, 0x30, 0xfc, 0x95, 0xda, 0xaf, 0x75, + 0x72, 0x5d, 0xa2, 0x04, 0xfd, 0x30, 0x55, 0x7d, 0x7f, 0xf7, 0x11, 0x7d, + 0x80, 0x4d, 0x38, 0x42, 0xbb, 0x7b, 0x8b, 0x8f, 0x24, 0x0e, 0xcc, 0x8b, + 0xfe, 0xf0, 0x7e, 0xf7, 0x48, 0xe0, 0x1f, 0xb4, 0x38, 0x5d, 0x9b, 0x2e, + 0x5d, 0x33, 0x9c, 0x7e, 0x44, 0x18, 0xfa, 0x2d, 0x6a, 0xd2, 0x70, 0x44, + 0xa2, 0xd3, 0x50, 0x49, 0xdc, 0x44, 0x91, 0xb7, 0xcc, 0x87, 0xa5, 0x27, + 0x06, 0x03, 0xe6, 0x98, 0x24, 0x1e, 0xe1, 0xe4, 0x8d, 0x21, 0xb4, 0x89, + 0x51, 0x9f, 0x96, 0x7a, 0x44, 0x50, 0xfa, 0x81, 0x21, 0x4d, 0x40, 0x42, + 0x84, 0x90, 0xdd, 0x2b, 0xa4, 0xa2, 0x08, 0x1c, 0x3d, 0x82, 0x5b, 0x8f, + 0x14, 0xf9, 0xf2, 0xde, 0x53, 0x75, 0xe2, 0x2d, 0xf3, 0xf8, 0x51, 0xef, + 0x13, 0xcb, 0x00, 0xd3, 0x3b, 0x9c, 0x96, 0x01, 0xb7, 0x98, 0x8f, 0xe4, + 0x83, 0x20, 0x40, 0xc6, 0x38, 0x1d, 0x3d, 0x8f, 0xfe, 0x2d, 0xfa, 0x80, + 0x60, 0xf0, 0xc7, 0x85, 0xa8, 0xa9, 0x3f, 0xfc, 0xe3, 0xfe, 0x4c, 0x14, + 0x9f, 0xc6, 0x0b, 0xdf, 0x6a, 0x22, 0x24, 0x18, 0xf9, 0x27, 0x8d, 0x4f, + 0xdd, 0x46, 0x08, 0xfc, 0x41, 0xcd, 0x3b, 0x41, 0xf7, 0x6e, 0x1f, 0xa7, + 0x7b, 0xd7, 0x25, 0x49, 0x3e, 0xa0, 0x34, 0xfe, 0xe9, 0x58, 0x29, 0x5c, + 0x26, 0xe0, 0x0e, 0x03, 0x23, 0x06, 0xc5, 0x31, 0x20, 0x75, 0xfa, 0x2e, + 0xa6, 0x25, 0x8a, 0x81, 0xd1, 0x3f, 0x00, 0xba, 0x3e, 0x6a, 0x17, 0x45, + 0xc9, 0x8e, 0x01, 0x3c, 0xa6, 0x3b, 0x50, 0xfa, 0x56, 0x09, 0x9e, 0x78, + 0xdd, 0x3d, 0x32, 0xcf, 0x43, 0x44, 0x81, 0xc6, 0x3c, 0x7e, 0x32, 0x42, + 0xd0, 0x53, 0x87, 0x7f, 0x4a, 0x00, 0x82, 0x93, 0x4f, 0x24, 0xde, 0x14, + 0x83, 0xf9, 0x58, 0xbb, 0x81, 0x98, 0xba, 0x47, 0x20, 0xf9, 0x49, 0x1e, + 0x08, 0x7e, 0x57, 0xf3, 0x8f, 0x8b, 0xa0, 0xd3, 0xfe, 0xb3, 0x37, 0x91, + 0xd1, 0x93, 0xe4, 0x6e, 0x44, 0x4c, 0xca, 0x08, 0xe4, 0x04, 0x7f, 0x4c, + 0x3d, 0x85, 0xde, 0x54, 0x71, 0x1a, 0xe9, 0x8d, 0x2f, 0x0c, 0xd0, 0x56, + 0x18, 0x88, 0x73, 0x22, 0x44, 0x26, 0xb0, 0x4f, 0xa4, 0xc7, 0x80, 0x7e, + 0x3f, 0xea, 0x73, 0xd2, 0x83, 0xe5, 0x54, 0xf4, 0x13, 0xb3, 0x90, 0xe9, + 0xbb, 0xa2, 0x63, 0xf8, 0xad, 0x29, 0x60, 0x8e, 0xa0, 0x8f, 0x07, 0xf0, + 0xc9, 0x24, 0xc9, 0xc9, 0xd4, 0x49, 0x5c, 0x26, 0x99, 0x4f, 0xba, 0x00, + 0x95, 0x80, 0xd2, 0x62, 0xe8, 0x6b, 0xea, 0xba, 0xbc, 0x11, 0xf7, 0x40, + 0xa3, 0x1f, 0xcb, 0x1d, 0x7d, 0x4d, 0xbb, 0x4d, 0x7a, 0x12, 0x09, 0x7d, + 0xf7, 0x36, 0xaf, 0x28, 0x0b, 0x30, 0x8c, 0xd7, 0x44, 0x00, 0x78, 0x87, + 0x92, 0xb7, 0x4a, 0x30, 0x0a, 0xb4, 0x13, 0xa5, 0x3e, 0xe6, 0x1a, 0x03, + 0x94, 0x02, 0xbf, 0x09, 0x1b, 0x21, 0x81, 0x90, 0xf1, 0x9b, 0x7e, 0xe0, + 0x40, 0x8f, 0x71, 0x66, 0xe2, 0x1c, 0x79, 0x13, 0x0f, 0x86, 0xdf, 0x44, + 0x40, 0xa2, 0x93, 0x6e, 0x4c, 0x8a, 0x37, 0xe9, 0x1f, 0x79, 0xd7, 0x0d, + 0x92, 0xbc, 0x09, 0x10, 0x7b, 0x32, 0x2c, 0xe4, 0x73, 0x0c, 0x45, 0xe8, + 0x8f, 0x48, 0x9e, 0x4c, 0x5d, 0x06, 0x96, 0x0c, 0xdf, 0x14, 0x93, 0x7e, + 0x62, 0x2b, 0xd0, 0x6d, 0x80, 0xe8, 0x3f, 0x1e, 0x1d, 0x33, 0x89, 0x16, + 0x28, 0xf3, 0xcd, 0xf6, 0xef, 0x14, 0xdc, 0x58, 0x01, 0xbe, 0xbd, 0x77, + 0x71, 0xa0, 0xfc, 0x23, 0x03, 0xf4, 0x13, 0x8d, 0xd0, 0xb7, 0x30, 0xe5, + 0x60, 0x0f, 0xd8, 0xad, 0x09, 0xf8, 0x81, 0x78, 0x0b, 0x4c, 0x04, 0x06, + 0x86, 0x48, 0xdf, 0x47, 0x42, 0xbf, 0xe2, 0x63, 0xcc, 0x49, 0x6d, 0x00, + 0x45, 0xd1, 0x23, 0x41, 0xdf, 0xbd, 0xf1, 0x27, 0xfa, 0x8a, 0x60, 0x54, + 0x8a, 0xa1, 0x93, 0x25, 0x61, 0xcc, 0x6b, 0x2d, 0x90, 0x13, 0x47, 0x80, + 0x56, 0x50, 0x29, 0x28, 0x03, 0x06, 0x01, 0xec, 0x94, 0x9a, 0x86, 0x34, + 0x91, 0xfa, 0xc0, 0xc0, 0x1f, 0x0b, 0xe7, 0xe6, 0x84, 0x08, 0x44, 0x43, + 0x28, 0xe2, 0x2d, 0x01, 0xf4, 0x00, 0x06, 0xda, 0xfe, 0x9a, 0xf7, 0xbb, + 0x49, 0x1e, 0x48, 0x83, 0x60, 0x34, 0x20, 0xe5, 0x07, 0xc0, 0xa0, 0xb7, + 0x38, 0xd2, 0x81, 0x4a, 0x24, 0x73, 0x73, 0x8c, 0x2f, 0xb9, 0x75, 0x6f, + 0x97, 0x61, 0x6e, 0xed, 0x02, 0x9f, 0x00, 0xda, 0x65, 0x48, 0x10, 0x46, + 0xde, 0x77, 0x3e, 0x15, 0x03, 0x8c, 0x7e, 0x04, 0xff, 0xbb, 0x17, 0x6c, + 0xba, 0xff, 0x9d, 0x18, 0x75, 0xbf, 0xfa, 0x9e, 0xa3, 0x4f, 0x85, 0xe5, + 0x29, 0x5a, 0xe0, 0xa0, 0x55, 0x12, 0xe8, 0x06, 0x20, 0x12, 0x90, 0x00, + 0x3c, 0xf7, 0x44, 0x02, 0xb0, 0x5d, 0xfc, 0x03, 0x85, 0xbc, 0x13, 0x81, + 0x01, 0x1a, 0xd2, 0x9b, 0x78, 0x4c, 0x20, 0x2f, 0xec, 0x6e, 0x9b, 0x04, + 0x2c, 0x83, 0x1e, 0x88, 0xa9, 0xa5, 0x14, 0xdc, 0x01, 0x41, 0x13, 0x74, + 0x07, 0x1a, 0x59, 0x12, 0xa0, 0xf3, 0x89, 0x24, 0xfc, 0x56, 0xed, 0x7e, + 0xeb, 0xe6, 0xc7, 0x51, 0xf2, 0x13, 0xf7, 0x07, 0x1a, 0x27, 0x6f, 0x2d, + 0xdc, 0x5b, 0xff, 0xc8, 0xb2, 0x9f, 0x22, 0xc1, 0x2d, 0x60, 0xd0, 0xcc, + 0xad, 0x23, 0x0c, 0x60, 0x02, 0x1c, 0xc4, 0xbd, 0xb7, 0x34, 0x7a, 0x17, + 0xa0, 0xf9, 0x91, 0xa9, 0xde, 0xcd, 0x11, 0x9d, 0x0c, 0x1a, 0xfd, 0xd8, + 0x3e, 0xa6, 0x41, 0x83, 0xe8, 0x8e, 0x81, 0xdf, 0x26, 0x90, 0x2e, 0xa9, + 0xd1, 0x13, 0x57, 0x27, 0x25, 0x00, 0x94, 0x02, 0xe1, 0x92, 0x53, 0x10, + 0xfd, 0x58, 0xb9, 0x81, 0x4a, 0x83, 0x61, 0xa5, 0x14, 0xa8, 0xf4, 0x38, + 0xfd, 0xe8, 0xa6, 0xbe, 0x35, 0x94, 0x99, 0x3e, 0x3f, 0x00, 0x26, 0xa0, + 0xd4, 0x4d, 0x33, 0xee, 0x64, 0x7e, 0xe2, 0x4e, 0x69, 0x60, 0x56, 0xd4, + 0xc4, 0xe2, 0x14, 0x98, 0x3a, 0x42, 0xde, 0x2a, 0xa7, 0x80, 0xcd, 0x0f, + 0x93, 0x82, 0x4e, 0x11, 0xec, 0x49, 0xf9, 0x01, 0x7f, 0x3e, 0xb5, 0x15, + 0x72, 0x1a, 0x29, 0x3a, 0x69, 0x0b, 0xa0, 0x16, 0x50, 0x8a, 0x30, 0xb8, + 0xfc, 0x71, 0x50, 0x03, 0xc5, 0xf0, 0xa9, 0x7d, 0x6d, 0x0a, 0x1d, 0x08, + 0xd0, 0x42, 0x66, 0x8a, 0x46, 0xcf, 0x16, 0x48, 0xc0, 0x53, 0x1c, 0xfb, + 0x18, 0xee, 0x4c, 0xde, 0x92, 0x20, 0xc1, 0xf8, 0xa7, 0x1f, 0x80, 0x6a, + 0x80, 0x4e, 0xa8, 0x8f, 0x5b, 0x8d, 0x10, 0xa0, 0x79, 0x1a, 0xf0, 0xbb, + 0x00, 0x9d, 0xbd, 0x05, 0x71, 0x98, 0x00, 0xbe, 0x01, 0x26, 0xef, 0x11, + 0xee, 0xd6, 0x2a, 0xfa, 0x89, 0x7f, 0x9c, 0x1c, 0xc9, 0x8d, 0xd8, 0x1b, + 0x5b, 0x81, 0x89, 0xbe, 0x4a, 0xec, 0x4d, 0x0a, 0x34, 0x3a, 0x81, 0x8b, + 0x1b, 0xb1, 0xc4, 0x93, 0xbb, 0x58, 0x4e, 0xa2, 0x05, 0x36, 0xdf, 0x21, + 0x6f, 0x49, 0x44, 0x9b, 0x4a, 0x3d, 0x00, 0x77, 0x7c, 0xc3, 0x38, 0x53, + 0x41, 0x0d, 0xd8, 0xe1, 0x8d, 0x0b, 0x77, 0xd7, 0x0d, 0x0a, 0x02, 0xe7, + 0xf6, 0xf0, 0x8a, 0x39, 0x4c, 0xff, 0x65, 0xec, 0x2d, 0x8d, 0xb1, 0x2f, + 0xcd, 0x01, 0x03, 0x3e, 0x13, 0xa1, 0xee, 0xc3, 0x78, 0xe1, 0xf7, 0x64, + 0xb4, 0xbb, 0x21, 0xb2, 0xa9, 0x73, 0x14, 0xc8, 0x96, 0xc4, 0x6e, 0x37, + 0xc8, 0x27, 0x70, 0x05, 0x54, 0x0d, 0xdc, 0x43, 0x28, 0xa0, 0x14, 0x4f, + 0x68, 0x8b, 0xbc, 0x43, 0xa4, 0x29, 0x8e, 0x01, 0x85, 0xa1, 0xb0, 0xe9, + 0xda, 0x0d, 0xd8, 0x3d, 0xdf, 0x21, 0x01, 0x83, 0xb0, 0xc9, 0x3b, 0x63, + 0x1d, 0x42, 0xdc, 0x9d, 0xf1, 0xe4, 0xa7, 0xf0, 0x97, 0xae, 0x99, 0x9e, + 0x5a, 0x05, 0x5e, 0x09, 0xf4, 0xcc, 0x12, 0x6f, 0x61, 0xf4, 0xe1, 0xf6, + 0xe3, 0x3e, 0x02, 0xf2, 0x81, 0x79, 0x69, 0xb2, 0xe4, 0x03, 0x0e, 0x4c, + 0xe9, 0xf1, 0x23, 0x2f, 0x08, 0x3f, 0x4e, 0xe6, 0x6d, 0x32, 0x37, 0xd2, + 0x69, 0x20, 0x52, 0x0a, 0xbd, 0x47, 0xcb, 0x3b, 0x3c, 0xb8, 0x66, 0x93, + 0x3c, 0x1f, 0x6e, 0xdf, 0x3f, 0xf0, 0x0b, 0x8f, 0x77, 0xf7, 0xf9, 0x74, + 0xf9, 0x3d, 0xdb, 0x00, 0x37, 0x6f, 0xce, 0x1d, 0x54, 0x82, 0x3f, 0xa1, + 0x68, 0xf2, 0x25, 0x8c, 0xf9, 0x11, 0x47, 0xa7, 0xaf, 0xc0, 0x0f, 0x13, + 0x37, 0xa7, 0xc8, 0x00, 0x04, 0x08, 0x5a, 0x9d, 0x1a, 0x7d, 0x59, 0x64, + 0xc2, 0xef, 0xa0, 0x98, 0xf9, 0x1e, 0x6c, 0x3d, 0x3b, 0xa1, 0x5b, 0xb5, + 0x9b, 0xac, 0x26, 0xf9, 0x7d, 0xe4, 0xbc, 0x1e, 0x91, 0xa9, 0xed, 0xe9, + 0xc7, 0x27, 0x74, 0x3e, 0x39, 0x30, 0x80, 0x07, 0xa8, 0x29, 0x17, 0xfa, + 0x80, 0x23, 0xc0, 0x7b, 0xbe, 0x90, 0x37, 0x10, 0x03, 0x68, 0x88, 0xfc, + 0x72, 0x89, 0x9b, 0xc9, 0xfe, 0xee, 0x22, 0xf0, 0x57, 0x4b, 0x4c, 0x3e, + 0x10, 0x18, 0xf7, 0xef, 0xed, 0x68, 0xb2, 0x00, 0xfa, 0x2b, 0x3d, 0x7d, + 0x53, 0x33, 0x5f, 0x65, 0x0c, 0xfc, 0xf8, 0x0d, 0xe4, 0x7e, 0xad, 0x08, + 0x20, 0xf7, 0xeb, 0xfd, 0x7c, 0x95, 0x75, 0x77, 0x84, 0xf4, 0x35, 0x5a, + 0xe0, 0xaf, 0x96, 0x60, 0x7e, 0xb7, 0x14, 0xbf, 0x49, 0x5b, 0xa6, 0x08, + 0xfa, 0xb5, 0x8e, 0xbe, 0xce, 0xdb, 0x6f, 0x60, 0xff, 0xd7, 0x39, 0xc7, + 0x7c, 0x95, 0x2d, 0xdf, 0x32, 0xe6, 0xaf, 0x92, 0xf2, 0xf5, 0x6e, 0xbe, + 0x4d, 0x86, 0x5f, 0x1f, 0x10, 0x50, 0x28, 0xf8, 0x3b, 0xe8, 0xd3, 0x37, + 0x90, 0xfb, 0xfb, 0x8b, 0x2c, 0x71, 0xe0, 0xdc, 0x7e, 0xff, 0x80, 0xbe, + 0x6e, 0x43, 0x4b, 0x0c, 0x7b, 0x20, 0xe9, 0xaf, 0x32, 0xf7, 0x6b, 0x8e, + 0x03, 0xc4, 0x10, 0x1c, 0xfe, 0xdd, 0x26, 0xff, 0x2d, 0x92, 0xfe, 0x06, + 0x77, 0xf9, 0x0d, 0x5a, 0x47, 0x03, 0x51, 0x53, 0xe4, 0xef, 0xf5, 0x0b, + 0x8f, 0xdf, 0xa0, 0x76, 0xdf, 0xe0, 0x75, 0xbf, 0xa1, 0x95, 0x6f, 0xf0, + 0xa8, 0x20, 0x5b, 0xfa, 0xea, 0x90, 0x1e, 0xbf, 0x4b, 0x3c, 0xfa, 0x6a, + 0x89, 0x3b, 0xe4, 0xf9, 0xdd, 0xde, 0xe3, 0x9b, 0xc2, 0x08, 0xfc, 0x55, + 0x4a, 0x68, 0xfc, 0xab, 0x12, 0xfa, 0xfd, 0xee, 0xe5, 0x69, 0x36, 0x11, + 0x9a, 0xa6, 0x13, 0x9f, 0x3e, 0xd6, 0x5d, 0x08, 0x3e, 0xbd, 0x79, 0x31, + 0x73, 0xdc, 0xc7, 0x41, 0xfc, 0xcb, 0x2f, 0x69, 0x5c, 0x37, 0x9f, 0x2c, + 0xca, 0xf9, 0xf0, 0x31, 0xe8, 0x8b, 0x82, 0x4d, 0xf5, 0xc1, 0x5a, 0x6f, + 0x8c, 0x7e, 0x65, 0x5d, 0x09, 0xf6, 0xc1, 0xc3, 0xe6, 0x97, 0x95, 0xef, + 0x0f, 0x0c, 0x3f, 0x7c, 0x02, 0xf7, 0xd4, 0xc2, 0x17, 0x1f, 0xbe, 0xbf, + 0x68, 0xe3, 0xfd, 0xd3, 0xb6, 0xff, 0xf3, 0xdc, 0xde, 0xab, 0xd3, 0xc9, + 0x1f, 0x76, 0xfb, 0x7f, 0xde, 0xfd, 0xf8, 0x15, 0x4f, 0x2c, 0xef, 0x4d, + 0xc4, 0xf9, 0xf3, 0x23, 0xa4, 0xcf, 0x3d, 0x78, 0x79, 0x6d, 0xbc, 0xb7, + 0x5a, 0x8f, 0x8f, 0x7e, 0x55, 0x15, 0x4f, 0x73, 0xf3, 0x79, 0x9c, 0x39, + 0xf7, 0x19, 0xf1, 0xdb, 0x1a, 0x9e, 0xa7, 0xe7, 0x3d, 0x80, 0x17, 0x89, + 0x5f, 0x3d, 0x80, 0x54, 0xe0, 0x79, 0x5d, 0xf0, 0x43, 0x9c, 0x07, 0xd3, + 0x0a, 0xa0, 0xfb, 0xf3, 0xa9, 0xf7, 0xbd, 0xbf, 0xfa, 0x2e, 0xc4, 0xd3, + 0x52, 0xa1, 0x8f, 0x56, 0x41, 0x7c, 0xb5, 0xc8, 0x4b, 0x5a, 0x1f, 0x7b, + 0xa7, 0xca, 0xe3, 0x3c, 0x7c, 0x95, 0xca, 0x2f, 0x92, 0xf7, 0xfa, 0x73, + 0xaa, 0x7b, 0x6b, 0x3f, 0x7c, 0x7e, 0x51, 0x4d, 0xf5, 0xa1, 0xe0, 0xef, + 0x4b, 0x81, 0x9e, 0x1e, 0x7d, 0x5c, 0x1f, 0xe3, 0xdc, 0xf3, 0x87, 0x1b, + 0x83, 0x9f, 0xd6, 0x1d, 0x15, 0x9e, 0x93, 0xde, 0x1f, 0x9b, 0x3e, 0x3d, + 0x43, 0xfd, 0xef, 0x69, 0x59, 0xe0, 0xcf, 0x6f, 0xca, 0xaa, 0xc8, 0xca, + 0xe6, 0xcd, 0xff, 0xfa, 0xf1, 0xa3, 0xeb, 0x4e, 0x0a, 0x34, 0xe9, 0xcd, + 0x17, 0x17, 0xd9, 0xbe, 0x7f, 0x09, 0xe5, 0x2d, 0x43, 0xfe, 0xf0, 0xc9, + 0xaa, 0xa3, 0x57, 0x1f, 0x63, 0xbc, 0x32, 0x02, 0xf8, 0xe5, 0x53, 0x8d, + 0x77, 0xeb, 0x80, 0x26, 0x7a, 0xa7, 0x15, 0xaa, 0x75, 0xed, 0x84, 0xfe, + 0x27, 0x86, 0xf5, 0x6e, 0x21, 0xd8, 0xcb, 0x47, 0xcb, 0x9f, 0x79, 0x0a, + 0xfd, 0xf2, 0xf9, 0xb1, 0x2c, 0x68, 0x1b, 0x41, 0x37, 0x26, 0x3e, 0xfc, + 0xf7, 0xfd, 0x29, 0xea, 0xff, 0xfa, 0xf4, 0xc1, 0xe7, 0xc7, 0x32, 0xfe, + 0xef, 0xfb, 0x13, 0xe4, 0x22, 0xac, 0x00, 0x35, 0xff, 0xeb, 0xa3, 0xd5, + 0x98, 0x1f, 0x2f, 0x75, 0x7c, 0x2e, 0xf7, 0x72, 0xb9, 0x2d, 0x60, 0x5f, + 0x5b, 0x3e, 0xbe, 0xd7, 0xc1, 0x57, 0xd6, 0xa9, 0x7c, 0xfc, 0x78, 0xe8, + 0x05, 0xf3, 0xde, 0x2f, 0x4b, 0xff, 0xc2, 0x0a, 0xab, 0x2f, 0x3f, 0x14, + 0x7a, 0x5a, 0xab, 0xfe, 0xbc, 0x18, 0xf4, 0xe7, 0x37, 0x02, 0x90, 0xf9, + 0x08, 0xa4, 0xfb, 0x7f, 0x1e, 0xbe, 0x7c, 0xff, 0x0b, 0x0f, 0x85, 0x6f, + 0x0b, 0x5f, 0xbe, 0xbe, 0xb6, 0xe5, 0x73, 0x4f, 0xd6, 0xbd, 0xb8, 0xf2, + 0x9f, 0x5e, 0xde, 0x02, 0x75, 0xda, 0x2c, 0xff, 0xcc, 0x1a, 0xcd, 0x57, + 0xbd, 0xdc, 0x8b, 0x35, 0x51, 0x93, 0xef, 0x9e, 0x96, 0x4f, 0xbf, 0x7c, + 0x48, 0xfb, 0xf4, 0xa2, 0x0f, 0xfa, 0xca, 0xb2, 0xdb, 0xe7, 0x45, 0x4a, + 0x1f, 0x2f, 0x27, 0x7d, 0x9c, 0xfa, 0xf9, 0x70, 0x70, 0x2f, 0x1e, 0x91, + 0xbf, 0x1b, 0xeb, 0x67, 0x78, 0xf1, 0x6e, 0xd9, 0xc2, 0xb3, 0x77, 0xb9, + 0x2f, 0x3b, 0xf2, 0x9d, 0xa6, 0x05, 0x4d, 0xd7, 0x7e, 0xd3, 0x00, 0xaa, + 0xea, 0x9f, 0x1e, 0xde, 0x00, 0x22, 0x9c, 0x37, 0xff, 0xf9, 0x71, 0xc1, + 0x3a, 0x2b, 0x8a, 0xe9, 0x89, 0x6f, 0x08, 0x84, 0x9a, 0x4f, 0x5e, 0x26, + 0x76, 0xea, 0xfb, 0xc3, 0xbe, 0x17, 0x5c, 0x4a, 0x9b, 0xea, 0x8b, 0xef, + 0x3c, 0xfd, 0x96, 0x95, 0x4e, 0xaf, 0x2f, 0xed, 0xf8, 0xe0, 0x65, 0x90, + 0x17, 0x2b, 0x3e, 0xc0, 0x30, 0x26, 0x87, 0x38, 0xa9, 0xe3, 0x44, 0xea, + 0xe7, 0xd6, 0x82, 0xbc, 0x63, 0xf9, 0x8b, 0x65, 0xe8, 0x5f, 0x7c, 0x29, + 0x03, 0x5c, 0x06, 0x6e, 0xfc, 0x69, 0xad, 0xc5, 0xc7, 0x6b, 0x90, 0x27, + 0x65, 0xf9, 0xd2, 0xca, 0x8e, 0xbb, 0x2a, 0xfc, 0xf2, 0xcb, 0xdd, 0xda, + 0x1f, 0x27, 0x2c, 0xf4, 0xbf, 0x3f, 0xb7, 0xb2, 0xe2, 0xdd, 0x6a, 0x90, + 0xbb, 0x9a, 0x4c, 0xcb, 0xac, 0x82, 0xe6, 0xb9, 0xc6, 0x87, 0xba, 0xf3, + 0x99, 0x0a, 0x11, 0x50, 0xee, 0x2f, 0x94, 0x7f, 0x7f, 0xb5, 0x7a, 0xb9, + 0x30, 0x06, 0x34, 0xf3, 0xff, 0xcb, 0x7c, 0x2f, 0x76, 0x1e, 0xfe, 0xfa, + 0x72, 0xf9, 0xf0, 0xb4, 0xc2, 0xef, 0x87, 0x5b, 0x5b, 0x2f, 0x8c, 0xf0, + 0xa7, 0x68, 0x5a, 0xe7, 0x71, 0xbb, 0xfa, 0x6b, 0x5e, 0x28, 0xf9, 0x7e, + 0xaf, 0x94, 0xfc, 0xb6, 0x97, 0x4a, 0xbe, 0xba, 0xb2, 0x11, 0xf0, 0xe0, + 0x83, 0x71, 0xbe, 0x78, 0xa1, 0xe3, 0xc3, 0x21, 0xff, 0x8e, 0x17, 0x3a, + 0x7e, 0xdf, 0x2b, 0x1d, 0xdf, 0xf3, 0xa5, 0x8e, 0xdf, 0xfa, 0x5a, 0xc7, + 0x57, 0x5e, 0xec, 0xf8, 0xfc, 0xab, 0x1d, 0xaf, 0x31, 0xf8, 0xe5, 0x22, + 0xec, 0x17, 0xcb, 0xae, 0x9f, 0x30, 0xc2, 0xfb, 0xf2, 0xef, 0x96, 0x21, + 0x3f, 0xbc, 0x5f, 0x3f, 0xf3, 0x64, 0x36, 0xbf, 0x62, 0xe5, 0x2b, 0xfe, + 0x8e, 0x89, 0xf7, 0xba, 0x2f, 0x96, 0x5f, 0x7f, 0x6c, 0x2c, 0x4f, 0x7e, + 0xf9, 0x13, 0x6b, 0x79, 0x7f, 0xfd, 0xd5, 0x15, 0x98, 0x2f, 0xc3, 0xdc, + 0x87, 0xd4, 0xbf, 0x58, 0x31, 0xfc, 0x05, 0x0f, 0xf9, 0xbe, 0xce, 0xf3, + 0x82, 0xa9, 0x8f, 0x6b, 0x3c, 0xbb, 0xa9, 0x4f, 0x4b, 0x7e, 0xb8, 0xb4, + 0xea, 0xb5, 0xa5, 0x74, 0xef, 0xeb, 0xbc, 0x5c, 0x6c, 0xf6, 0xe9, 0xfb, + 0x9c, 0x5d, 0xf4, 0xc1, 0x1a, 0xb1, 0xf7, 0xd5, 0x5e, 0xac, 0xb2, 0xfa, + 0x4d, 0x6f, 0x24, 0x7e, 0x00, 0x22, 0xba, 0xe8, 0x7e, 0xe9, 0xce, 0xf0, + 0x77, 0x6f, 0xb2, 0xbe, 0xba, 0xa2, 0xe4, 0x99, 0xaf, 0xcf, 0x45, 0x9e, + 0xfc, 0xd3, 0x3b, 0x82, 0x7b, 0x40, 0xf0, 0xad, 0x85, 0xa7, 0x6e, 0x5e, + 0xa2, 0xcb, 0x4f, 0x07, 0xf0, 0xd1, 0xfa, 0xaf, 0xcf, 0x30, 0x00, 0x79, + 0xd7, 0xde, 0xc7, 0xf5, 0x5f, 0x84, 0xdd, 0x0f, 0x5f, 0x0d, 0xfe, 0xec, + 0x62, 0x96, 0x2f, 0x2c, 0x67, 0xf9, 0x76, 0xb5, 0xfd, 0x54, 0xa0, 0x9f, + 0xa1, 0x9c, 0x7c, 0xcf, 0x88, 0x97, 0xe0, 0x13, 0x43, 0x3f, 0x36, 0xab, + 0x4f, 0x86, 0xf3, 0x2d, 0x7a, 0x41, 0x7d, 0xca, 0x96, 0xe7, 0x55, 0xc1, + 0x1f, 0x2a, 0xc8, 0xeb, 0x5c, 0x25, 0xdf, 0xd5, 0x9e, 0x62, 0x4e, 0xe2, + 0x8f, 0x41, 0x05, 0xf0, 0x5c, 0xfd, 0x5a, 0xae, 0x34, 0x35, 0x43, 0xc0, + 0xff, 0xfe, 0x4d, 0x91, 0xe6, 0x65, 0x36, 0xf2, 0x6a, 0xd3, 0xaf, 0xb6, + 0xf9, 0x21, 0x70, 0xbd, 0xd5, 0x9b, 0x2e, 0xff, 0x17, 0x74, 0x43, 0x1c, + 0x7f, 0xbb, 0x7f, 0x99, 0x5e, 0x0d, 0x7a, 0x78, 0x4a, 0x39, 0xca, 0x32, + 0xf5, 0x01, 0xf2, 0x77, 0x63, 0xf0, 0x0b, 0xe0, 0xa3, 0x47, 0x70, 0xe1, + 0xf1, 0xe4, 0x94, 0xd3, 0x22, 0xe6, 0x37, 0xcf, 0x50, 0xfb, 0xe7, 0x37, + 0xa3, 0x5f, 0xbf, 0x79, 0x80, 0x9e, 0xaa, 0x4f, 0x1d, 0x4f, 0x4e, 0xe2, + 0xe7, 0x37, 0x13, 0x06, 0x7b, 0xf3, 0xd0, 0x8c, 0x25, 0x68, 0xe9, 0xbe, + 0xd4, 0xa8, 0xcc, 0xc3, 0x37, 0x0f, 0x51, 0xe5, 0x07, 0x3f, 0xbf, 0x5c, + 0x80, 0x04, 0xae, 0xfe, 0xa7, 0x0b, 0xf0, 0x15, 0x89, 0xff, 0x18, 0x9b, + 0xdc, 0x5a, 0xef, 0x61, 0x55, 0x0a, 0x8b, 0x69, 0x27, 0x82, 0x95, 0xb1, + 0x8f, 0x84, 0x7d, 0x08, 0x3e, 0xf1, 0xd3, 0x57, 0x36, 0xe4, 0xd9, 0x25, + 0xf8, 0xc5, 0x09, 0xa5, 0x52, 0x49, 0xd3, 0x05, 0x53, 0xe4, 0x96, 0xa6, + 0xb0, 0x07, 0x9f, 0xe6, 0x10, 0xf8, 0x43, 0xcc, 0x82, 0x3c, 0xc2, 0x7d, + 0x41, 0xe5, 0xc3, 0x6b, 0x49, 0xfa, 0x79, 0x4f, 0x6f, 0xe6, 0x7c, 0x4f, + 0x2f, 0x2b, 0x8d, 0x1f, 0x04, 0x7d, 0x6f, 0xef, 0x4c, 0x71, 0x77, 0x40, + 0x98, 0x60, 0x79, 0x5d, 0xa2, 0xe5, 0xe5, 0x72, 0x89, 0x8b, 0xcb, 0x62, + 0xbd, 0x4b, 0x68, 0x4f, 0x8e, 0x79, 0xaa, 0xa5, 0x46, 0x31, 0x2a, 0xc2, + 0xeb, 0xf2, 0x6a, 0x0c, 0xb5, 0xab, 0x5a, 0x29, 0xe1, 0xeb, 0x49, 0xb9, + 0x88, 0x8f, 0xa8, 0xe5, 0xe5, 0x36, 0x81, 0xf9, 0x87, 0xb4, 0x71, 0x33, + 0x9a, 0x58, 0x5f, 0xdb, 0x61, 0x1f, 0x12, 0xeb, 0x1b, 0x21, 0xfb, 0x54, + 0xd8, 0x9a, 0x5b, 0x7c, 0xa4, 0x2c, 0xdd, 0xa0, 0x54, 0x41, 0x61, 0x07, + 0xd1, 0xed, 0x7b, 0x25, 0xee, 0xce, 0x10, 0x03, 0x51, 0xd8, 0xec, 0x18, + 0x67, 0x94, 0x92, 0xa2, 0x66, 0x0f, 0xf9, 0x92, 0xce, 0xef, 0xd6, 0xd1, + 0xbe, 0xef, 0x0f, 0xa7, 0x71, 0x16, 0x6e, 0xd9, 0x75, 0x1d, 0xe2, 0x16, + 0x9b, 0xf3, 0xe6, 0x3e, 0x0a, 0xd0, 0x42, 0x58, 0x71, 0x4b, 0x62, 0xa0, + 0x79, 0x6d, 0xb4, 0x61, 0x41, 0xdc, 0x55, 0x07, 0x7d, 0x67, 0x61, 0xd9, + 0x7e, 0x1e, 0x1e, 0xe6, 0xbe, 0x22, 0x1d, 0x70, 0x73, 0x58, 0x0c, 0x7b, + 0x56, 0xef, 0x4f, 0x1d, 0xb1, 0xce, 0x6a, 0x98, 0xbb, 0x6c, 0x0b, 0x41, + 0x13, 0x0a, 0x35, 0xd1, 0x37, 0xc1, 0x4a, 0x31, 0x61, 0x0a, 0x16, 0xcf, + 0xfd, 0xa5, 0x88, 0xd4, 0x6c, 0xbe, 0xb5, 0x49, 0x6f, 0xeb, 0x87, 0x66, + 0x2c, 0x78, 0x70, 0x7e, 0xbe, 0xf6, 0x6c, 0x78, 0x9d, 0x71, 0x3a, 0x20, + 0xa3, 0x66, 0x17, 0xe9, 0x8a, 0xb3, 0x71, 0x29, 0xea, 0x09, 0x27, 0x26, + 0xaa, 0x5c, 0x3e, 0x85, 0xb9, 0xb7, 0xf7, 0x99, 0x43, 0x24, 0x2e, 0x43, + 0xc5, 0xd1, 0xf4, 0xd5, 0x38, 0xb0, 0xb6, 0x48, 0x6d, 0x29, 0x24, 0xb6, + 0x55, 0x7c, 0x85, 0x7a, 0x9e, 0x2d, 0x85, 0xe2, 0x61, 0x7b, 0x31, 0xe6, + 0x61, 0xa9, 0x42, 0x6b, 0x69, 0x35, 0x3b, 0x5f, 0x53, 0xac, 0xd6, 0x38, + 0x41, 0x6b, 0x7d, 0x23, 0x22, 0x89, 0x58, 0xa0, 0xe8, 0x8e, 0x14, 0x0e, + 0x6b, 0x9e, 0x23, 0x2a, 0x95, 0x08, 0xd3, 0x6a, 0xc0, 0xda, 0xb4, 0x3c, + 0x76, 0xb3, 0x2e, 0x14, 0x75, 0x75, 0xd1, 0x8e, 0x99, 0x65, 0x05, 0xde, + 0xa0, 0x0b, 0x09, 0xe6, 0xc6, 0x0b, 0x52, 0xb2, 0xc8, 0x05, 0xea, 0xe6, + 0xfd, 0x21, 0xcd, 0x71, 0x13, 0xcd, 0x3b, 0x7f, 0x13, 0xcc, 0xa4, 0xc5, + 0x4c, 0x4a, 0xd6, 0xbb, 0x56, 0x1b, 0x57, 0x8a, 0xc7, 0x31, 0xd9, 0xd8, + 0x2c, 0x74, 0xb1, 0xbb, 0xec, 0xb3, 0xa1, 0x67, 0x96, 0xd7, 0x11, 0xdf, + 0x48, 0x38, 0x1b, 0xcc, 0x58, 0x19, 0x27, 0xf9, 0x23, 0x39, 0x97, 0xed, + 0x43, 0x78, 0xd3, 0x06, 0x21, 0x15, 0x77, 0x89, 0xd1, 0x6e, 0x33, 0x9e, + 0x7f, 0x4d, 0xfd, 0xee, 0xca, 0x7b, 0xdf, 0x80, 0xe1, 0xae, 0x8a, 0xbf, + 0x45, 0xf3, 0x38, 0x6d, 0xda, 0x13, 0xc3, 0x80, 0x9f, 0x34, 0x6f, 0x1d, + 0x39, 0x92, 0x3e, 0x15, 0x38, 0x22, 0x37, 0xcd, 0x23, 0x86, 0x80, 0x06, + 0x7a, 0xb9, 0xe7, 0x80, 0x82, 0x99, 0x7b, 0xa9, 0xf0, 0x5c, 0x42, 0xb9, + 0x64, 0x75, 0x82, 0xb4, 0x90, 0x32, 0x17, 0x23, 0xf8, 0x1c, 0xa9, 0xb0, + 0xba, 0xdc, 0x2f, 0xb1, 0x7e, 0x93, 0x48, 0x8a, 0xd1, 0x67, 0x67, 0x37, + 0xec, 0xab, 0x56, 0x98, 0x4b, 0xf1, 0x76, 0xb5, 0x4a, 0x4e, 0x87, 0xa3, + 0x4c, 0x5f, 0x1b, 0xbf, 0x36, 0xad, 0xc3, 0x51, 0xd7, 0x53, 0x38, 0xf0, + 0x88, 0x5a, 0xd5, 0x76, 0x7d, 0x5b, 0x32, 0x89, 0x6b, 0x17, 0xc7, 0xa6, + 0x60, 0xb6, 0xca, 0xe2, 0xbc, 0xad, 0x73, 0x9a, 0x76, 0x9d, 0xa2, 0xde, + 0x6e, 0x90, 0x6d, 0x14, 0xa8, 0xcb, 0xdd, 0x4e, 0xda, 0x16, 0xe9, 0x92, + 0x5d, 0xaf, 0x61, 0xa2, 0xcc, 0x33, 0x7b, 0xd2, 0xc6, 0x34, 0x81, 0x27, + 0x6d, 0xd4, 0x71, 0xb4, 0xbd, 0x72, 0xe1, 0x6d, 0x2b, 0x0f, 0x9e, 0x2d, + 0x36, 0x68, 0x29, 0x92, 0xc9, 0xdd, 0x7e, 0xbe, 0xd7, 0x1f, 0x69, 0x8e, + 0xe2, 0xc2, 0xd3, 0xe7, 0xe5, 0x19, 0x6a, 0x74, 0x71, 0x6f, 0x7e, 0xcf, + 0x3f, 0xc7, 0x3d, 0xb3, 0xe6, 0x9e, 0xda, 0xdf, 0x2c, 0x20, 0x77, 0xab, + 0x7f, 0xd7, 0xe6, 0x4d, 0x4b, 0xd8, 0xcc, 0xef, 0x0c, 0x62, 0xc3, 0xcd, + 0x10, 0x48, 0xb0, 0xf8, 0x7d, 0xdb, 0xf7, 0xe2, 0x39, 0xdb, 0xdf, 0x19, + 0xa4, 0x6c, 0xa0, 0x83, 0x9e, 0x72, 0xdf, 0xb5, 0x79, 0x31, 0x70, 0x9f, + 0xa8, 0x67, 0xd9, 0x71, 0x33, 0x43, 0x04, 0xf3, 0xfb, 0xf2, 0x27, 0xda, + 0xc1, 0xef, 0xc4, 0x4b, 0xe7, 0x4c, 0xc3, 0x7d, 0x67, 0xf6, 0x1c, 0xb7, + 0xf4, 0x93, 0x78, 0x79, 0x16, 0x12, 0x69, 0x77, 0xfb, 0x7d, 0x9b, 0x37, + 0x51, 0x65, 0x39, 0x67, 0x9f, 0xc4, 0x0b, 0x31, 0x9e, 0xb4, 0xff, 0xae, + 0xf4, 0xef, 0x4d, 0xaf, 0x2d, 0x8a, 0x35, 0x0c, 0x17, 0xfc, 0x85, 0x2d, + 0xba, 0xc8, 0xd7, 0x8b, 0x0b, 0xbb, 0x8d, 0xad, 0xc4, 0x1d, 0xa1, 0x21, + 0x47, 0xb7, 0xf2, 0xb1, 0x42, 0xcb, 0x98, 0xaa, 0x4a, 0x6a, 0x37, 0x93, + 0x6a, 0x6f, 0xfb, 0xb1, 0xf1, 0xf0, 0x0a, 0x8e, 0x14, 0x51, 0x15, 0xa4, + 0x87, 0xed, 0x35, 0x46, 0x5c, 0x9e, 0xaf, 0xe0, 0xb3, 0x25, 0xd0, 0xe8, + 0x69, 0xee, 0xd8, 0xa9, 0xa5, 0xcb, 0xfb, 0xfb, 0x6f, 0xd5, 0x16, 0x8f, + 0x97, 0xa3, 0x99, 0x58, 0x99, 0x9e, 0x49, 0xa9, 0x68, 0x8b, 0x45, 0x62, + 0xa7, 0x85, 0x9e, 0xe9, 0xce, 0x22, 0x33, 0x6d, 0xa1, 0x4c, 0xcc, 0xb8, + 0x8c, 0x2c, 0xdd, 0xb1, 0xa5, 0xa3, 0xb3, 0x07, 0xc5, 0x62, 0x3d, 0xb3, + 0x22, 0x09, 0x14, 0xcb, 0x6c, 0x33, 0x31, 0x32, 0xdd, 0x52, 0x33, 0x50, + 0xa9, 0x4c, 0xec, 0xa8, 0xd4, 0xcd, 0x1d, 0x24, 0xd8, 0x8b, 0xd3, 0x2a, + 0x9f, 0xee, 0xed, 0x90, 0x45, 0xb6, 0x62, 0x14, 0xdb, 0x3b, 0x63, 0x19, + 0x0a, 0xbe, 0x6f, 0x31, 0x78, 0xb8, 0x50, 0x69, 0x3a, 0x64, 0xf0, 0xa8, + 0x1a, 0x28, 0x9a, 0x78, 0x52, 0xae, 0x10, 0xa0, 0x1f, 0x3d, 0xe3, 0x9c, + 0x4c, 0x37, 0xe2, 0x2c, 0xb2, 0x12, 0x3d, 0xce, 0xd2, 0xc8, 0x2a, 0xf4, + 0xd8, 0x2a, 0x43, 0xab, 0xb0, 0x43, 0xab, 0x4c, 0xf6, 0x45, 0x59, 0x98, + 0xa5, 0x70, 0x2c, 0xcb, 0xa3, 0x79, 0x11, 0x8e, 0xe9, 0xe5, 0x28, 0x5e, + 0x24, 0xf0, 0xdf, 0x16, 0x55, 0xd5, 0x11, 0x1d, 0x5d, 0x52, 0x1d, 0x4b, + 0x74, 0x22, 0x69, 0xe1, 0x80, 0x76, 0xa2, 0xe7, 0xb6, 0x86, 0xe3, 0x3a, + 0x37, 0x0f, 0xee, 0xb9, 0xdd, 0x30, 0x34, 0x4e, 0x93, 0x70, 0x72, 0x56, + 0x1a, 0xf9, 0x6c, 0x35, 0xcb, 0x8e, 0xc0, 0x73, 0x83, 0xee, 0x08, 0x12, + 0xa7, 0x02, 0x45, 0x6a, 0xd7, 0xd0, 0xcc, 0x3f, 0x10, 0xbe, 0xe7, 0x38, + 0xe6, 0xd9, 0x3a, 0x0f, 0xb1, 0xd5, 0x1e, 0xf2, 0x01, 0xeb, 0x19, 0x77, + 0x35, 0x93, 0x2e, 0x3e, 0x0a, 0xed, 0xe6, 0x2d, 0xed, 0xba, 0xdd, 0x6e, + 0x60, 0x48, 0xf8, 0x74, 0x16, 0x9a, 0xe9, 0xec, 0x96, 0xb5, 0xe7, 0x5e, + 0x67, 0x67, 0x0a, 0xbe, 0xea, 0x1b, 0x18, 0xc6, 0x6a, 0x4c, 0xa3, 0x2d, + 0x58, 0xb8, 0xdd, 0xbb, 0x5a, 0x5d, 0x49, 0x62, 0x5b, 0xa6, 0xa6, 0x77, + 0xd7, 0x59, 0x9d, 0x92, 0xd6, 0xd1, 0x8c, 0x2e, 0xd9, 0xb0, 0xc3, 0x76, + 0x6a, 0xdd, 0x95, 0x4b, 0x6d, 0xb7, 0xaa, 0x61, 0xac, 0xda, 0x2c, 0x4a, + 0x4b, 0xbc, 0xb8, 0xa2, 0xec, 0xad, 0x1c, 0xad, 0xed, 0xf6, 0x2b, 0x06, + 0xe2, 0x4e, 0x73, 0xd8, 0x82, 0xe9, 0x8a, 0x6b, 0x36, 0xe7, 0xce, 0xf1, + 0xb1, 0xdc, 0xb3, 0x2e, 0xb3, 0x18, 0xb3, 0x5d, 0x8f, 0x74, 0xcc, 0x30, + 0xcb, 0x19, 0xdb, 0x67, 0x4e, 0xe9, 0x6c, 0x29, 0xf4, 0xdb, 0xb9, 0xaa, + 0x7b, 0x9c, 0xb8, 0x15, 0x45, 0xfd, 0xe4, 0xa2, 0x0c, 0x84, 0xac, 0x51, + 0x63, 0x57, 0x36, 0x68, 0x82, 0x92, 0xaa, 0x1c, 0x2f, 0xf0, 0xfd, 0x90, + 0xd1, 0x71, 0xbd, 0xd8, 0x12, 0xc7, 0x6b, 0xc0, 0x9d, 0xc2, 0x5a, 0x5c, + 0x38, 0x17, 0xe1, 0x2a, 0xac, 0x0f, 0xb6, 0xdd, 0x0d, 0xfc, 0x6a, 0xbe, + 0xd2, 0xc8, 0x79, 0xa8, 0x97, 0x9c, 0x67, 0x2f, 0x46, 0xe6, 0xea, 0xee, + 0xc7, 0xbc, 0x5a, 0x00, 0x79, 0x6c, 0xcd, 0x2a, 0x08, 0x79, 0xbe, 0xe9, + 0xf9, 0xb2, 0xbc, 0x9e, 0x52, 0x42, 0xa9, 0x37, 0xc1, 0x45, 0x28, 0x24, + 0xc7, 0x44, 0x03, 0x18, 0x8e, 0x35, 0xd5, 0x14, 0x31, 0x01, 0x9e, 0x19, + 0x85, 0x73, 0xb9, 0x90, 0x8a, 0x15, 0x60, 0xf8, 0x29, 0xc1, 0x1d, 0xa3, + 0xda, 0x21, 0xbc, 0xbf, 0x0e, 0xc3, 0x0b, 0x59, 0x90, 0xf4, 0x6e, 0x5f, + 0xc1, 0x46, 0x67, 0x56, 0x66, 0xec, 0x1a, 0xcd, 0x5e, 0x1d, 0x0a, 0xd2, + 0x10, 0x97, 0xf3, 0xdc, 0x5d, 0xb5, 0xb5, 0x29, 0x4e, 0x59, 0xcd, 0xa9, + 0xb9, 0xb6, 0xda, 0xf6, 0x28, 0xea, 0xc8, 0xe6, 0x12, 0x8d, 0xc0, 0x63, + 0x5d, 0x77, 0x8b, 0x04, 0x4b, 0x77, 0xb3, 0xc5, 0xa1, 0x5c, 0x18, 0xe5, + 0x32, 0x28, 0xd0, 0x94, 0x8a, 0x71, 0x93, 0x18, 0x95, 0x64, 0x30, 0x2e, + 0x5e, 0xc1, 0xe9, 0xdb, 0x20, 0xea, 0x35, 0x6c, 0x4e, 0xac, 0xe2, 0x14, + 0x22, 0x5a, 0x43, 0x64, 0x64, 0xd3, 0xa9, 0x2b, 0x4a, 0xf0, 0x77, 0xdb, + 0xa4, 0x14, 0x9d, 0x3d, 0x65, 0xb4, 0x4d, 0x3b, 0x8f, 0x3c, 0x67, 0x13, + 0x6a, 0xc8, 0x49, 0xe7, 0xac, 0x34, 0xc8, 0x0d, 0x29, 0x19, 0xe0, 0x40, + 0x8a, 0x24, 0xcb, 0x6b, 0xe0, 0x28, 0x8e, 0x6c, 0xdc, 0xeb, 0xcf, 0x27, + 0x4a, 0x2d, 0x5a, 0xcd, 0x6b, 0x6d, 0x15, 0x92, 0xc8, 0xf9, 0xc5, 0xb1, + 0xce, 0xea, 0x8e, 0xab, 0xed, 0x0d, 0xb5, 0x5c, 0xf8, 0x65, 0x7b, 0x90, + 0x93, 0x60, 0x81, 0xf0, 0x17, 0xd0, 0xbf, 0xbe, 0xdd, 0xdb, 0x10, 0x9a, + 0x8f, 0x6c, 0xcf, 0x37, 0x2a, 0xb9, 0x16, 0xbc, 0x45, 0xdc, 0x27, 0xb3, + 0xd5, 0xfa, 0xb0, 0x32, 0xb4, 0x5d, 0x6d, 0xa8, 0x94, 0x6e, 0xef, 0x56, + 0xcb, 0x98, 0xde, 0xa6, 0x65, 0xbd, 0x95, 0x21, 0x1e, 0x4e, 0x04, 0xc2, + 0xe0, 0x28, 0x87, 0xf3, 0x84, 0x02, 0xb5, 0x0d, 0x4f, 0xe4, 0x63, 0xda, + 0x28, 0xaf, 0xb5, 0x4d, 0x2d, 0xc3, 0x3c, 0x53, 0x62, 0x84, 0xb2, 0x71, + 0xf9, 0x0a, 0xd7, 0x08, 0x67, 0x45, 0x41, 0xce, 0x03, 0xda, 0x74, 0xe7, + 0x12, 0x07, 0x10, 0x6f, 0x76, 0x6e, 0x0a, 0x1f, 0xfa, 0x41, 0xb0, 0x8c, + 0x4b, 0xa5, 0xe6, 0x87, 0x0b, 0x8b, 0xae, 0x61, 0x24, 0xa6, 0x23, 0xcb, + 0x13, 0x05, 0x76, 0x0c, 0x66, 0xc4, 0xe9, 0xb0, 0x17, 0xd7, 0x42, 0x7d, + 0xf6, 0x45, 0x07, 0x4f, 0x8d, 0xc3, 0xcc, 0x9b, 0xeb, 0x15, 0x50, 0xf6, + 0xeb, 0xac, 0xaf, 0xfb, 0x85, 0x02, 0x1b, 0xeb, 0xce, 0xa1, 0x78, 0xbc, + 0x59, 0x74, 0x31, 0x83, 0xb0, 0x10, 0x6f, 0xc5, 0x64, 0xbb, 0x34, 0x14, + 0x6b, 0xd6, 0x97, 0xba, 0xb1, 0x0e, 0x01, 0xda, 0xe2, 0x4f, 0xd2, 0x19, + 0xdd, 0xf8, 0xa7, 0x3d, 0x23, 0x47, 0x0b, 0x6b, 0xc1, 0x97, 0xc8, 0x79, + 0x31, 0xc8, 0x29, 0xea, 0xe0, 0x64, 0x63, 0x58, 0x70, 0x5b, 0x6d, 0xb2, + 0xe3, 0x06, 0x3a, 0x1b, 0xe5, 0x36, 0x59, 0x39, 0x00, 0x3e, 0xa6, 0x4e, + 0x78, 0xf6, 0x99, 0xd8, 0x11, 0x0e, 0xc7, 0x14, 0xf3, 0x73, 0xcc, 0x4c, + 0xea, 0x31, 0x96, 0x2c, 0x5c, 0x4a, 0xc6, 0xa0, 0xa4, 0xb3, 0xf9, 0xa8, + 0xc4, 0x98, 0x6b, 0x5e, 0x34, 0x74, 0x65, 0x4a, 0x05, 0xdd, 0x48, 0x3d, + 0x20, 0x27, 0x9d, 0xb9, 0xd9, 0x89, 0x83, 0x25, 0x93, 0xb3, 0x4a, 0x2f, + 0xdb, 0xa1, 0xa9, 0x2e, 0x94, 0x07, 0xe9, 0x02, 0xeb, 0xf1, 0x12, 0x39, + 0x7a, 0x5e, 0x90, 0xd3, 0x6d, 0xd9, 0x55, 0x8a, 0xa1, 0xbb, 0xe7, 0xf5, + 0x82, 0x58, 0x94, 0xf2, 0x61, 0xef, 0x98, 0xf6, 0x92, 0x11, 0x57, 0x25, + 0x67, 0x1e, 0xca, 0x19, 0x0d, 0x1d, 0xed, 0xfd, 0x12, 0xae, 0x8a, 0xb1, + 0x85, 0x33, 0x2d, 0xde, 0xee, 0x2a, 0x49, 0x2e, 0x65, 0x3b, 0x34, 0x0f, + 0xf8, 0x7c, 0x59, 0x6f, 0x28, 0xaa, 0x55, 0xbc, 0x0c, 0x00, 0x15, 0x32, + 0x13, 0xb2, 0x7e, 0xcb, 0x08, 0x64, 0xbd, 0x34, 0x4f, 0xae, 0x21, 0xd5, + 0xb4, 0xb7, 0xd7, 0xaa, 0xb9, 0x29, 0x4c, 0x3a, 0x6a, 0xe7, 0xce, 0x4e, + 0x24, 0x2f, 0xe5, 0x52, 0xf0, 0x7a, 0xc1, 0xde, 0x70, 0x39, 0xe6, 0xe5, + 0xcb, 0xb6, 0xa3, 0x1a, 0xea, 0x82, 0x9e, 0x2e, 0xc8, 0x41, 0x95, 0x2a, + 0xdf, 0x4d, 0x71, 0xa5, 0xc7, 0x98, 0x85, 0x9a, 0x50, 0x4b, 0x39, 0x42, + 0x19, 0xb7, 0x32, 0xf8, 0x86, 0xa7, 0xd6, 0x5a, 0x23, 0x86, 0x07, 0x46, + 0x5f, 0xb4, 0xdc, 0x55, 0x0d, 0x28, 0xbe, 0xdc, 0xcf, 0x47, 0xac, 0x27, + 0x60, 0x72, 0x58, 0xcf, 0xe7, 0x02, 0x79, 0xb4, 0x1d, 0xdd, 0x4c, 0xf9, + 0xcd, 0xbe, 0xad, 0x84, 0x35, 0xab, 0x29, 0x9b, 0x22, 0xac, 0xb6, 0xed, + 0x35, 0xa4, 0xf4, 0xa3, 0x44, 0xc3, 0x20, 0xa8, 0x1b, 0x60, 0x40, 0x26, + 0x16, 0x5e, 0x5b, 0x1e, 0xce, 0x95, 0x6d, 0xcf, 0x11, 0x12, 0x5f, 0x60, + 0x61, 0x99, 0x9d, 0xd7, 0x9d, 0x50, 0x69, 0xf9, 0x1c, 0xd7, 0xa0, 0xfe, + 0xa2, 0xd9, 0x8b, 0xb9, 0x35, 0xbd, 0xa1, 0x69, 0x5d, 0x54, 0xe7, 0x48, + 0x85, 0x8c, 0x21, 0xfa, 0x9b, 0x6c, 0x44, 0x5a, 0x5c, 0xa3, 0x94, 0xc4, + 0xdc, 0x50, 0xf1, 0x09, 0x38, 0xc8, 0x45, 0x79, 0xf2, 0xed, 0xbd, 0x05, + 0x45, 0x8a, 0xab, 0x6d, 0x79, 0x52, 0x13, 0xce, 0x55, 0x9b, 0xf5, 0x8d, + 0x66, 0x5b, 0x7b, 0xa1, 0x25, 0xe7, 0x1d, 0xdb, 0x1d, 0x36, 0x5a, 0x4f, + 0x8d, 0xeb, 0xad, 0x57, 0x33, 0x4d, 0x86, 0xef, 0x00, 0xd7, 0x99, 0xe3, + 0x0c, 0x38, 0x5e, 0x28, 0x3a, 0x5e, 0x2d, 0x9e, 0x1c, 0xd8, 0xad, 0x79, + 0x39, 0xd8, 0x66, 0x53, 0x2e, 0x8f, 0x8b, 0x1d, 0xb7, 0x39, 0xc5, 0x41, + 0x13, 0x55, 0xab, 0xed, 0xb9, 0x9d, 0x57, 0x2a, 0xd9, 0x08, 0x20, 0x66, + 0x19, 0xc4, 0x59, 0x45, 0xda, 0x00, 0x2e, 0x0b, 0x8a, 0x16, 0x0e, 0xe1, + 0x22, 0x39, 0x57, 0x75, 0x06, 0x08, 0xd4, 0xc5, 0xb4, 0x45, 0xca, 0xf9, + 0x6e, 0xc6, 0x76, 0xaa, 0xe0, 0xf6, 0xec, 0x4a, 0xa5, 0x58, 0x61, 0x56, + 0xf0, 0x7d, 0x8a, 0x15, 0x3a, 0x8b, 0xc2, 0x55, 0x69, 0x49, 0x1d, 0x2e, + 0xc2, 0x5b, 0xaf, 0x3c, 0xd8, 0xc7, 0x55, 0x79, 0xb2, 0xb2, 0xe5, 0xd1, + 0xa5, 0x84, 0x46, 0x92, 0x77, 0x33, 0x5c, 0x1f, 0x96, 0xcc, 0x5a, 0x5c, + 0xac, 0xc6, 0x05, 0xd1, 0x49, 0xf1, 0x89, 0x11, 0x36, 0xdc, 0x65, 0x66, + 0xc8, 0x5b, 0x85, 0x95, 0x1a, 0xa0, 0x5b, 0xb6, 0x89, 0xee, 0x09, 0x47, + 0xa9, 0x8a, 0x88, 0x54, 0x34, 0xaa, 0x2b, 0x16, 0x85, 0xcf, 0x0e, 0x05, + 0x24, 0x32, 0x71, 0x0c, 0x89, 0xb3, 0x8a, 0x48, 0x4a, 0x87, 0xa0, 0x9b, + 0x39, 0x56, 0xf0, 0x87, 0xde, 0x6e, 0xc3, 0xca, 0x00, 0x70, 0xde, 0x35, + 0xc8, 0x8a, 0x17, 0x5a, 0x64, 0x59, 0xd0, 0x0b, 0x3c, 0x89, 0x4e, 0x14, + 0xde, 0x0c, 0xb6, 0xe6, 0x85, 0xad, 0x63, 0x9f, 0x16, 0xb4, 0x71, 0x69, + 0xba, 0xde, 0xf6, 0xa3, 0x6b, 0xa1, 0x02, 0xd5, 0xb9, 0xec, 0x1a, 0x81, + 0x1c, 0xb2, 0x43, 0x28, 0xcf, 0x5a, 0xef, 0x74, 0xe0, 0x76, 0xf3, 0x02, + 0xe6, 0x71, 0x00, 0x18, 0x6d, 0xa9, 0xc5, 0x45, 0x31, 0x3f, 0x7a, 0xb4, + 0xee, 0x55, 0xfe, 0x26, 0x36, 0xaf, 0xfd, 0xd5, 0x68, 0xe3, 0xb3, 0x6b, + 0x08, 0x8d, 0x29, 0x45, 0x04, 0xab, 0x77, 0x94, 0xb5, 0xc5, 0xa9, 0xf0, + 0xe8, 0x70, 0x7c, 0xa0, 0x6a, 0x57, 0x89, 0xe9, 0xb5, 0x9e, 0x48, 0x0f, + 0x8e, 0xbf, 0xcf, 0x83, 0x65, 0x17, 0xef, 0x49, 0x05, 0x37, 0xd6, 0x6d, + 0x5c, 0x2d, 0x34, 0xcb, 0xb1, 0xca, 0x73, 0x80, 0x6f, 0x66, 0xe3, 0x69, + 0x5d, 0x09, 0x11, 0xa1, 0xc8, 0x7c, 0xde, 0xb3, 0x87, 0xab, 0x1c, 0x66, + 0x97, 0x36, 0x14, 0x98, 0xb2, 0xf0, 0xcf, 0xb0, 0x78, 0x1d, 0x69, 0x05, + 0xce, 0xe6, 0x40, 0xb1, 0x54, 0xb1, 0xd1, 0x2e, 0xf2, 0xbc, 0x58, 0x05, + 0x9b, 0x63, 0xd2, 0x00, 0xd0, 0x3d, 0x6c, 0xe8, 0x59, 0x04, 0xe9, 0xfd, + 0x0a, 0xc5, 0x77, 0xf5, 0x62, 0x67, 0x11, 0xc7, 0x8b, 0xbc, 0x19, 0x05, + 0xf2, 0xb9, 0x7d, 0xc3, 0xaf, 0x08, 0x19, 0x35, 0xbc, 0x2b, 0x22, 0xd0, + 0x90, 0x36, 0xc0, 0x0b, 0xda, 0x65, 0x88, 0xd0, 0xf5, 0xd2, 0xe3, 0x1a, + 0x0e, 0x36, 0xee, 0x7c, 0x49, 0x15, 0x7e, 0x53, 0x11, 0x3b, 0x15, 0x3e, + 0x57, 0x45, 0x17, 0x1f, 0x90, 0xd6, 0xd8, 0x86, 0x79, 0xb0, 0x5e, 0x97, + 0xb3, 0xc4, 0xdf, 0x84, 0x92, 0x1f, 0x86, 0x5b, 0x47, 0xdf, 0xcc, 0xb1, + 0x53, 0xa8, 0xac, 0x15, 0x09, 0xb6, 0x96, 0x6d, 0xd5, 0x2d, 0xb9, 0x4a, + 0x0d, 0x94, 0x42, 0xb1, 0xca, 0x74, 0x71, 0x26, 0x14, 0x92, 0xa8, 0xf0, + 0x34, 0x72, 0xcf, 0x35, 0xbe, 0xbe, 0xe6, 0x3c, 0x0d, 0xaf, 0x85, 0x6e, + 0xa0, 0x05, 0xc1, 0x9d, 0xa1, 0xf5, 0xde, 0x0c, 0x74, 0xdc, 0xd9, 0x49, + 0xc6, 0x15, 0x3e, 0xc6, 0xe2, 0x6c, 0xb1, 0x3f, 0x23, 0x16, 0xb3, 0x2d, + 0xbd, 0x15, 0x90, 0x9f, 0x48, 0x1b, 0x70, 0xb3, 0x49, 0x96, 0x72, 0xc7, + 0xda, 0xf3, 0x46, 0x9e, 0xef, 0x4a, 0x88, 0x1e, 0x9a, 0x1d, 0x76, 0x3a, + 0x53, 0x0a, 0x48, 0x3f, 0x3a, 0x0d, 0xb9, 0x26, 0xed, 0x7a, 0xcb, 0x5c, + 0xf4, 0x20, 0xe9, 0xc1, 0x78, 0x1c, 0x7f, 0xe1, 0x5a, 0xab, 0xe5, 0x7a, + 0x3e, 0x2e, 0x23, 0x6e, 0xd5, 0xcf, 0x1d, 0xf9, 0xca, 0x67, 0x3e, 0x65, + 0x87, 0x03, 0xbb, 0xa4, 0x0e, 0x62, 0xd1, 0x30, 0x9d, 0x77, 0xd4, 0x47, + 0x8a, 0xdd, 0x86, 0x47, 0xbb, 0x94, 0xcd, 0x15, 0x24, 0x5c, 0xb4, 0xd9, + 0x12, 0xc9, 0x5b, 0x17, 0xc5, 0xf6, 0x52, 0xb0, 0xe5, 0x02, 0x3a, 0x92, + 0x1a, 0xaf, 0xdf, 0xc0, 0x47, 0xee, 0x5c, 0xda, 0x16, 0xe5, 0xae, 0x55, + 0x99, 0x0b, 0x10, 0xbc, 0x24, 0x65, 0x45, 0x45, 0x2a, 0xba, 0x90, 0xe0, + 0x2e, 0xa5, 0x3c, 0x7a, 0xbd, 0x52, 0x31, 0x67, 0x17, 0xe1, 0x6e, 0xdf, + 0xcd, 0x2f, 0xd1, 0x30, 0x30, 0xe9, 0x42, 0xc0, 0x1c, 0xb8, 0x59, 0xec, + 0x02, 0x9a, 0xeb, 0x91, 0x63, 0x9b, 0x97, 0xfd, 0xc8, 0x37, 0xce, 0x0c, + 0x30, 0xbc, 0x3a, 0xec, 0x2e, 0xb9, 0xde, 0x79, 0xd7, 0xc8, 0xa6, 0x03, + 0x56, 0x5c, 0x5e, 0x33, 0xe0, 0x91, 0x6c, 0x52, 0xcb, 0x25, 0x7d, 0x85, + 0x88, 0xfb, 0x4e, 0xe7, 0x44, 0x66, 0x3c, 0x76, 0xf4, 0x2a, 0xca, 0xf5, + 0xda, 0x55, 0xf0, 0xf6, 0x8c, 0x9f, 0xbc, 0x85, 0xba, 0xef, 0x20, 0x08, + 0x1f, 0xf7, 0x5b, 0xd9, 0xd1, 0x91, 0xdd, 0x6e, 0x50, 0x0d, 0x2c, 0x56, + 0xb8, 0x94, 0xad, 0xcf, 0x9e, 0x40, 0xfa, 0x33, 0x2b, 0x6b, 0xf6, 0x49, + 0x6a, 0xe5, 0x9d, 0x0e, 0x43, 0x1b, 0x94, 0xcd, 0xb6, 0xa3, 0x84, 0xe2, + 0x5d, 0x8f, 0xc7, 0xfa, 0x11, 0x1b, 0x8b, 0xe1, 0xb2, 0x87, 0x1c, 0xd4, + 0x3d, 0xcd, 0x17, 0x03, 0xdc, 0xe8, 0x9c, 0xba, 0xdf, 0x57, 0xf6, 0x6e, + 0x8c, 0x53, 0x23, 0x4c, 0xf5, 0x06, 0xdd, 0xc5, 0x86, 0x69, 0x2c, 0x6b, + 0xe2, 0x68, 0x9d, 0x1d, 0x44, 0x36, 0x84, 0x76, 0x0f, 0xcf, 0x57, 0x47, + 0x4e, 0x4a, 0xc4, 0x4e, 0x28, 0xb5, 0x8d, 0x2d, 0x0b, 0x7b, 0x6c, 0xb6, + 0x6f, 0xa5, 0x38, 0x56, 0x7c, 0x61, 0xa7, 0x38, 0x3a, 0x05, 0x19, 0x4a, + 0xa7, 0x52, 0x6b, 0x52, 0x04, 0x1e, 0x63, 0x6e, 0x56, 0x64, 0x10, 0x6e, + 0xe6, 0x34, 0x97, 0x92, 0xe4, 0x32, 0xdc, 0x05, 0x21, 0x73, 0x8e, 0x17, + 0x65, 0x9c, 0x8b, 0x6b, 0xd8, 0xbf, 0x08, 0xa9, 0xdd, 0xa4, 0xf3, 0x75, + 0x75, 0x8e, 0x73, 0x73, 0x5e, 0x77, 0x57, 0xd4, 0xdd, 0xe6, 0xdb, 0xa4, + 0xf5, 0x37, 0xc4, 0x71, 0x0f, 0xed, 0x54, 0x99, 0x07, 0x02, 0x1d, 0x3a, + 0x4f, 0x5c, 0xfa, 0x25, 0x77, 0xe8, 0x55, 0x03, 0xb1, 0x4a, 0xa7, 0x61, + 0x10, 0x3d, 0xc0, 0x42, 0x7b, 0xe5, 0xa8, 0xc2, 0xde, 0x9e, 0xcd, 0x82, + 0xc3, 0x32, 0xb9, 0x98, 0x97, 0x79, 0xe3, 0xaf, 0x0e, 0xd1, 0x1a, 0x3e, + 0x6a, 0xbe, 0xcb, 0xc8, 0xee, 0x62, 0xb9, 0xa8, 0x8f, 0xfe, 0xf5, 0xb0, + 0xdc, 0x2c, 0xc6, 0xc4, 0x8d, 0x47, 0xb7, 0x86, 0x9b, 0x4b, 0x68, 0x1f, + 0x74, 0x71, 0xae, 0x25, 0x46, 0xae, 0xd3, 0xdb, 0x73, 0xc5, 0x50, 0xcc, + 0x0c, 0x78, 0xd4, 0xc2, 0x71, 0x85, 0x95, 0x94, 0xe0, 0x71, 0xdb, 0x0e, + 0x43, 0x7c, 0x97, 0xc3, 0xca, 0xea, 0x46, 0x74, 0x9f, 0x9e, 0x89, 0xa5, + 0x76, 0x88, 0xb7, 0xe6, 0x71, 0xb3, 0xe4, 0x0b, 0xf2, 0xd0, 0x8a, 0xcb, + 0x3e, 0x3c, 0xcd, 0x0e, 0x97, 0xb5, 0x87, 0xb5, 0xfc, 0x45, 0x3c, 0xd9, + 0xfb, 0x91, 0x5c, 0x8e, 0x87, 0x92, 0xda, 0x2b, 0x51, 0xe5, 0x14, 0x51, + 0xdd, 0xa2, 0xda, 0x22, 0xda, 0xef, 0x25, 0x69, 0xc3, 0x50, 0x06, 0xbf, + 0x43, 0x4e, 0xd6, 0x85, 0xc4, 0x86, 0xaa, 0x0a, 0x98, 0xa6, 0x07, 0x31, + 0x00, 0xde, 0x1f, 0x98, 0xc5, 0xc5, 0x1c, 0xb6, 0xeb, 0x44, 0xc7, 0xcf, + 0x58, 0x5c, 0x48, 0x95, 0x2a, 0xc5, 0x06, 0x51, 0x1a, 0x9b, 0x6a, 0x9b, + 0xec, 0x03, 0x9e, 0xdd, 0xed, 0xce, 0x96, 0xaa, 0xb1, 0x12, 0x1a, 0x12, + 0x69, 0xb7, 0xe1, 0x67, 0x47, 0xd4, 0xf5, 0xf2, 0x92, 0xb6, 0x82, 0x95, + 0xd5, 0x67, 0x3c, 0xa7, 0x3b, 0x1e, 0xe1, 0x23, 0x97, 0x79, 0x78, 0x92, + 0x12, 0x7d, 0xee, 0xc2, 0x57, 0x2e, 0x4b, 0x44, 0x59, 0xdd, 0xa5, 0x87, + 0x86, 0x58, 0x0f, 0x68, 0x61, 0x88, 0xfc, 0x28, 0x5e, 0x76, 0x60, 0xf8, + 0x90, 0x4e, 0xf7, 0x88, 0xbe, 0x38, 0x43, 0xe8, 0xe1, 0x4c, 0x42, 0x34, + 0x46, 0xcc, 0x1b, 0xcf, 0xa0, 0x34, 0xa0, 0x74, 0x57, 0x25, 0x8a, 0x8e, + 0xbc, 0x83, 0x10, 0xe9, 0xda, 0x33, 0x75, 0x5a, 0x1e, 0xe0, 0x56, 0x91, + 0xfc, 0x8b, 0x5f, 0x87, 0xd4, 0x96, 0xef, 0x2e, 0x3b, 0x51, 0xad, 0x52, + 0x38, 0x21, 0xcc, 0xeb, 0xd6, 0x3b, 0x5d, 0xb6, 0x84, 0x78, 0x49, 0x59, + 0xc6, 0x9e, 0x2d, 0x4d, 0x0d, 0x3e, 0xf0, 0xbd, 0x04, 0x14, 0xdd, 0x8d, + 0x61, 0xad, 0xf1, 0xa3, 0x85, 0x0a, 0xf7, 0xc7, 0x93, 0xc2, 0xe9, 0xa5, + 0x11, 0xb2, 0x0b, 0x82, 0xb3, 0x92, 0x44, 0x39, 0x82, 0x78, 0x89, 0xe3, + 0xf8, 0xd5, 0x50, 0x9a, 0x64, 0xb4, 0xad, 0x03, 0x66, 0xb8, 0x49, 0x73, + 0x3d, 0x57, 0x1c, 0x11, 0x4b, 0x5c, 0x0d, 0xf1, 0xdb, 0x00, 0xb6, 0x4f, + 0x7a, 0x36, 0xb7, 0xa1, 0x23, 0x24, 0x86, 0x6d, 0xb8, 0x15, 0x0d, 0x78, + 0x7e, 0x9d, 0xb0, 0x9e, 0x95, 0x7a, 0xd9, 0xf9, 0x60, 0x9c, 0x2a, 0x38, + 0x25, 0xa3, 0xa3, 0xce, 0x99, 0x43, 0x14, 0xb6, 0xfe, 0xd5, 0xb0, 0x66, + 0x40, 0x15, 0x58, 0x9d, 0xb1, 0x86, 0x6b, 0xb9, 0x0a, 0xb9, 0x55, 0x96, + 0x53, 0x1b, 0xa5, 0xbf, 0x50, 0xf6, 0x90, 0xb6, 0x23, 0x90, 0xba, 0xa2, + 0xc2, 0x5d, 0x4c, 0xcf, 0xca, 0xe5, 0x3e, 0xe6, 0x7d, 0x64, 0x11, 0xc3, + 0x09, 0x27, 0x5f, 0xe7, 0xe6, 0x69, 0x8f, 0x0b, 0x35, 0x5c, 0x0b, 0x33, + 0x8c, 0x21, 0x53, 0xf1, 0x60, 0xf8, 0x17, 0x11, 0xf1, 0x0a, 0xf5, 0xda, + 0x64, 0x40, 0x9c, 0xe5, 0xdc, 0x62, 0x68, 0x93, 0xb7, 0x52, 0x72, 0xbe, + 0x45, 0xb6, 0x59, 0x18, 0x8a, 0xdd, 0x52, 0xf1, 0x44, 0x1c, 0xbb, 0xa6, + 0xad, 0x11, 0x37, 0x22, 0x72, 0x31, 0xac, 0x06, 0x57, 0xec, 0xc4, 0xbf, + 0x95, 0x5d, 0xd1, 0xce, 0xbc, 0xe1, 0x74, 0x89, 0x47, 0xc8, 0x25, 0x35, + 0x9c, 0x8f, 0xd1, 0xbe, 0x20, 0x2b, 0x41, 0x96, 0x2b, 0xcf, 0x3d, 0x6f, + 0xab, 0x4e, 0xf6, 0x22, 0xdf, 0x43, 0x23, 0x35, 0x11, 0x9d, 0x1d, 0x12, + 0x04, 0x42, 0x58, 0xed, 0x45, 0xde, 0xa2, 0x16, 0x42, 0x78, 0x44, 0x87, + 0xe0, 0x8a, 0xd7, 0xf9, 0x91, 0x3d, 0xeb, 0x62, 0xdd, 0xae, 0xe6, 0x15, + 0x4f, 0x40, 0x20, 0x2e, 0xf2, 0xa6, 0x32, 0xf9, 0x47, 0x69, 0x06, 0x9c, + 0x9f, 0x7b, 0xc1, 0x02, 0xcc, 0xb1, 0xf7, 0x6b, 0x9e, 0x25, 0x18, 0xb6, + 0x21, 0x99, 0x2b, 0x14, 0xaf, 0x4d, 0x5e, 0x20, 0xf2, 0x0d, 0x49, 0x88, + 0x1c, 0x68, 0x74, 0x8b, 0xe4, 0x81, 0x64, 0x99, 0x55, 0xed, 0x36, 0xf0, + 0xa9, 0xcb, 0x4e, 0x4c, 0x47, 0xc3, 0xa7, 0xd9, 0xa5, 0x61, 0xf2, 0x0b, + 0xed, 0x46, 0xbe, 0x65, 0x51, 0x82, 0xc3, 0xae, 0xf6, 0xa0, 0x20, 0xc0, + 0xc7, 0x92, 0xd8, 0x94, 0xad, 0x15, 0x44, 0xb6, 0xb1, 0x3c, 0xa2, 0x2c, + 0x1a, 0x33, 0x58, 0xd8, 0xa1, 0x7b, 0xed, 0x68, 0xcd, 0xc7, 0xfa, 0xb8, + 0xf1, 0x1c, 0x1b, 0x70, 0x3a, 0x59, 0x1d, 0xb1, 0x21, 0x15, 0x1d, 0xe6, + 0xc2, 0xc8, 0xa3, 0x10, 0xb2, 0x36, 0x35, 0xb6, 0xd9, 0xa9, 0xf2, 0x0a, + 0x53, 0xac, 0x09, 0x72, 0xa1, 0xe6, 0xe7, 0x90, 0x9c, 0xaf, 0x14, 0x00, + 0x42, 0xe7, 0xdd, 0x75, 0x71, 0xf4, 0xb8, 0xa3, 0xc0, 0xaa, 0xd1, 0x59, + 0x2c, 0x24, 0xae, 0x3f, 0xef, 0x9d, 0x33, 0x04, 0xcd, 0xcc, 0x1a, 0x39, + 0xac, 0x88, 0x7a, 0x4c, 0x8a, 0x23, 0x10, 0xd7, 0x95, 0xea, 0x56, 0x03, + 0x08, 0x0c, 0xdc, 0xce, 0x40, 0xe9, 0x13, 0xbf, 0x88, 0x11, 0x3a, 0xb6, + 0x73, 0x7f, 0x75, 0xdd, 0x66, 0x5a, 0xaf, 0x19, 0x3c, 0xb7, 0xd2, 0x94, + 0x9e, 0x13, 0x51, 0x97, 0x2b, 0xcd, 0x2a, 0x35, 0xbb, 0x70, 0xb5, 0x88, + 0xc9, 0xad, 0xa9, 0xc5, 0x5c, 0x89, 0x7b, 0x4b, 0x4f, 0x57, 0xe9, 0x58, + 0xdc, 0xe0, 0xb9, 0xe7, 0xda, 0x8b, 0x46, 0x01, 0x7e, 0x61, 0xb1, 0x6a, + 0xa9, 0x8a, 0xea, 0x57, 0xfb, 0x7d, 0x02, 0x40, 0x89, 0xd5, 0xab, 0x7c, + 0xc2, 0x39, 0xf4, 0x1c, 0xeb, 0x3a, 0x7e, 0x48, 0xc6, 0xad, 0x12, 0xe1, + 0x70, 0xb1, 0xd9, 0x9c, 0xf4, 0x8b, 0x8c, 0x13, 0x36, 0x0f, 0x1b, 0x62, + 0xc1, 0x85, 0x84, 0x60, 0x75, 0x6b, 0x86, 0xd8, 0xec, 0x5d, 0xea, 0x04, + 0x46, 0xdd, 0x06, 0xd1, 0x8c, 0x17, 0xd9, 0xdd, 0x56, 0x04, 0xe8, 0x2c, + 0x32, 0x45, 0x18, 0x38, 0x9d, 0x68, 0xdb, 0xac, 0xad, 0xfa, 0xc0, 0xa2, + 0x7c, 0x5e, 0xed, 0x7b, 0x56, 0x23, 0x69, 0xd8, 0x97, 0x9c, 0x6b, 0xc5, + 0xaf, 0xaf, 0xb1, 0x64, 0xaf, 0x41, 0x3b, 0x95, 0x90, 0x91, 0x7b, 0x91, + 0xc2, 0x80, 0xe2, 0xa1, 0x99, 0x30, 0xc8, 0x33, 0x6b, 0xd3, 0x9d, 0xb6, + 0x9b, 0xf9, 0x76, 0xe0, 0xa8, 0xac, 0xb0, 0xe0, 0xd4, 0x59, 0xf0, 0x58, + 0x2c, 0xae, 0x54, 0x7e, 0x05, 0x78, 0xdc, 0x1d, 0x73, 0xb4, 0x6c, 0x7d, + 0x16, 0x36, 0x88, 0x02, 0x91, 0x00, 0x4e, 0xf7, 0xd4, 0x0e, 0xc5, 0x4f, + 0xb3, 0x39, 0x28, 0x37, 0x00, 0xc3, 0x5c, 0x18, 0xdd, 0xfa, 0x9a, 0xa6, + 0xbb, 0x94, 0x76, 0x14, 0x25, 0x22, 0x03, 0xc9, 0xe9, 0xc9, 0x10, 0x25, + 0x83, 0xd8, 0xa0, 0x80, 0x4f, 0xad, 0x04, 0x94, 0xb4, 0xcc, 0xc3, 0x4a, + 0x98, 0xa3, 0x1d, 0x3a, 0x97, 0x87, 0x99, 0x84, 0xd9, 0x67, 0x57, 0x57, + 0xdc, 0x81, 0x8f, 0x2a, 0x97, 0xc5, 0xfd, 0x44, 0xf7, 0x14, 0x55, 0x52, + 0x0c, 0x38, 0xe4, 0x51, 0xc1, 0x1d, 0x5d, 0x47, 0x04, 0xd8, 0x61, 0xcb, + 0x8f, 0x23, 0x41, 0xcd, 0xa1, 0x65, 0x65, 0xe7, 0x55, 0x79, 0xca, 0x1c, + 0x5d, 0x08, 0xf8, 0x6b, 0x53, 0xba, 0x47, 0xfa, 0x4a, 0xc0, 0xa3, 0xc3, + 0xad, 0xc7, 0xa3, 0x41, 0x55, 0x73, 0xff, 0x48, 0x6d, 0x84, 0xaa, 0x64, + 0xd0, 0xd5, 0x2a, 0xd3, 0x09, 0x75, 0x1a, 0x5b, 0x14, 0x4e, 0x56, 0x56, + 0xad, 0xaf, 0x72, 0xcc, 0xb6, 0x6c, 0x25, 0x70, 0x1b, 0xdf, 0x36, 0x53, + 0x36, 0x0d, 0x67, 0x54, 0xbc, 0x17, 0x6d, 0xe9, 0x56, 0xe6, 0x18, 0x5b, + 0x8d, 0xeb, 0x5e, 0xa1, 0x5c, 0xc9, 0x7d, 0xe1, 0x0c, 0xc6, 0x22, 0xe2, + 0xd5, 0xbc, 0xeb, 0x25, 0xd3, 0xe9, 0x72, 0x6d, 0x9f, 0x1b, 0x0a, 0xf0, + 0x37, 0x67, 0xad, 0x85, 0x93, 0xce, 0x81, 0x87, 0x3e, 0xb8, 0x62, 0xfc, + 0x0a, 0x6f, 0xb5, 0xdd, 0xb6, 0x44, 0xfc, 0xde, 0xda, 0xf5, 0x1b, 0xa7, + 0xf2, 0x96, 0x20, 0x15, 0xf3, 0x55, 0x1e, 0x21, 0x04, 0xe7, 0xc4, 0x6c, + 0x0e, 0xdb, 0xf4, 0x98, 0x09, 0x7e, 0x84, 0x56, 0x87, 0xdc, 0xdc, 0x1b, + 0x55, 0x68, 0x43, 0x46, 0x78, 0xba, 0x68, 0x6e, 0x73, 0x02, 0xe8, 0x30, + 0x75, 0x02, 0x34, 0x68, 0x85, 0xb4, 0xf2, 0xb1, 0x8a, 0x9d, 0x13, 0x14, + 0xe4, 0x2c, 0xe5, 0xb9, 0xab, 0xcc, 0x03, 0xa2, 0x97, 0xdc, 0x73, 0x08, + 0xdb, 0x88, 0x58, 0x46, 0x46, 0xd6, 0x38, 0x29, 0x7b, 0x10, 0xd3, 0xc9, + 0xbe, 0x66, 0x4a, 0x5d, 0x59, 0x0a, 0x4e, 0xe2, 0xb0, 0x65, 0x2f, 0x37, + 0x21, 0xde, 0x03, 0xa5, 0x46, 0xb3, 0x0e, 0x27, 0x9d, 0x7e, 0x16, 0xee, + 0x9b, 0x5b, 0xf9, 0xa4, 0x85, 0xcb, 0xed, 0xbe, 0x59, 0xa0, 0x39, 0x93, + 0x53, 0x91, 0x6a, 0x30, 0x14, 0x6e, 0xed, 0xd7, 0x72, 0xbd, 0x9e, 0x47, + 0xb3, 0x2b, 0xbd, 0x1e, 0x8e, 0xb3, 0x3c, 0x27, 0x05, 0xca, 0x5f, 0x44, + 0x2b, 0x8e, 0x17, 0x97, 0x8e, 0x97, 0xf2, 0x70, 0x57, 0x40, 0x27, 0x9b, + 0xb5, 0x36, 0x3c, 0x8f, 0x9e, 0x1b, 0xa9, 0xed, 0x97, 0x2b, 0x72, 0x8b, + 0x2f, 0x60, 0x24, 0xd9, 0x1c, 0xe5, 0xf9, 0xfa, 0x90, 0x86, 0xd3, 0x69, + 0xaa, 0x88, 0x6f, 0x98, 0x45, 0x52, 0x1d, 0x58, 0xce, 0x58, 0x76, 0x4c, + 0xbe, 0xeb, 0x0b, 0x59, 0x72, 0x32, 0x0f, 0x09, 0xc8, 0x6c, 0xdf, 0xb4, + 0xe2, 0x2e, 0x32, 0x55, 0x7c, 0x1d, 0xab, 0x34, 0x8b, 0x5b, 0x84, 0x62, + 0x19, 0x46, 0x13, 0xb2, 0x2b, 0x85, 0x37, 0x2b, 0xae, 0x76, 0xec, 0xa0, + 0x10, 0xb4, 0x6a, 0xbc, 0x1e, 0x91, 0xd0, 0x54, 0x21, 0x60, 0xa4, 0x6d, + 0x22, 0x26, 0x6b, 0xdc, 0xf7, 0x32, 0xfa, 0xc0, 0x0d, 0x37, 0x7b, 0x58, + 0x2a, 0x94, 0xb1, 0x8f, 0x96, 0x14, 0x85, 0xf0, 0x75, 0x79, 0x40, 0x3a, + 0x8e, 0x66, 0x13, 0xb1, 0xed, 0x53, 0xc2, 0x50, 0xb0, 0x2d, 0x74, 0xe1, + 0x48, 0xb9, 0xb4, 0x34, 0x48, 0x67, 0x6f, 0xba, 0x7c, 0x6c, 0xcf, 0x8d, + 0x52, 0x71, 0xd4, 0xb5, 0x9d, 0xf9, 0xd0, 0x7c, 0x1b, 0x58, 0x69, 0x76, + 0x38, 0xa7, 0xec, 0x46, 0xde, 0x90, 0xfe, 0xa0, 0x49, 0x8e, 0x3b, 0xe9, + 0xbc, 0x32, 0x13, 0x25, 0xca, 0x48, 0x42, 0x66, 0x40, 0xb3, 0x06, 0xef, + 0xd7, 0xca, 0x96, 0xa6, 0xca, 0x25, 0xed, 0x19, 0xdb, 0x2b, 0x00, 0xa0, + 0x1d, 0x44, 0xd8, 0x57, 0xff, 0xba, 0xdd, 0x33, 0x1b, 0xe6, 0x88, 0xc3, + 0x37, 0x5b, 0x6b, 0x15, 0x3e, 0xb5, 0x5d, 0x5a, 0xf6, 0x87, 0xa5, 0x17, + 0x16, 0xd7, 0x00, 0xc9, 0x4b, 0xde, 0x3e, 0xcd, 0xb8, 0x25, 0x7e, 0x12, + 0x56, 0x5e, 0x5a, 0xd8, 0x97, 0x59, 0x33, 0x63, 0xe8, 0x64, 0xeb, 0x29, + 0xb1, 0xb3, 0xb5, 0x96, 0x19, 0xb5, 0x93, 0x98, 0xcb, 0x90, 0x46, 0x38, + 0xb7, 0xcd, 0xad, 0xa5, 0x7e, 0xbe, 0xee, 0xb4, 0xf2, 0x84, 0x13, 0x21, + 0xc2, 0xb5, 0xbb, 0x5c, 0x3b, 0xa7, 0x66, 0x76, 0x46, 0xe8, 0x26, 0x68, + 0x84, 0xc3, 0x4d, 0x77, 0x76, 0xeb, 0xeb, 0x7e, 0x8d, 0x61, 0xd6, 0x62, + 0x86, 0x07, 0x9b, 0x4d, 0xd1, 0xe1, 0x49, 0x6e, 0x5a, 0x1b, 0x1d, 0x51, + 0x87, 0x10, 0xaf, 0x75, 0x74, 0xbb, 0xee, 0x6d, 0x36, 0x5d, 0x9c, 0xa0, + 0x05, 0xcc, 0x6f, 0x1b, 0x21, 0x72, 0x70, 0x5f, 0x49, 0x34, 0x3d, 0xbf, + 0xae, 0xb0, 0xde, 0x2b, 0xb3, 0xb5, 0xde, 0xba, 0x42, 0xc1, 0x6f, 0x43, + 0x03, 0x95, 0x4f, 0x6c, 0xba, 0x52, 0x0b, 0x10, 0xda, 0x47, 0x02, 0x00, + 0x93, 0x9e, 0xb1, 0x8f, 0x34, 0xa7, 0xf1, 0x94, 0x53, 0x85, 0x68, 0x5b, + 0x41, 0x25, 0x8f, 0x1a, 0x62, 0x02, 0x44, 0x05, 0xc2, 0x3f, 0x62, 0x1f, + 0x66, 0x5d, 0x4f, 0xa5, 0xfb, 0xd2, 0x9c, 0x53, 0x89, 0xed, 0xda, 0xf4, + 0xf1, 0xd2, 0x39, 0xf3, 0x56, 0x26, 0xa1, 0x62, 0x83, 0xad, 0x2b, 0x3c, + 0x2f, 0x9b, 0x08, 0x19, 0xae, 0x4d, 0x28, 0x87, 0x95, 0x80, 0x79, 0x57, + 0x38, 0x43, 0x80, 0xed, 0xc5, 0x9b, 0x48, 0x5f, 0xc3, 0x20, 0x46, 0x43, + 0x14, 0x40, 0xc8, 0xed, 0x76, 0xc9, 0x4a, 0x1c, 0xc9, 0xc5, 0xf3, 0x2e, + 0x3d, 0xb6, 0x07, 0x5a, 0xa2, 0x81, 0x07, 0xe1, 0x63, 0x02, 0x35, 0xc3, + 0x73, 0x11, 0x55, 0x39, 0x74, 0x25, 0xb3, 0x71, 0xdb, 0x24, 0xa9, 0xcb, + 0xae, 0x85, 0x44, 0x83, 0x93, 0x4b, 0xb5, 0x2c, 0x85, 0xd5, 0x78, 0x2a, + 0xec, 0x28, 0xf3, 0xb1, 0x71, 0x87, 0x43, 0x51, 0x75, 0xc0, 0x63, 0x04, + 0x32, 0x0e, 0xf1, 0xdc, 0x91, 0x98, 0xd1, 0xca, 0xb1, 0x99, 0x55, 0x02, + 0xbe, 0xf0, 0x51, 0x48, 0x39, 0x27, 0x09, 0xe9, 0x25, 0xaf, 0xb4, 0x66, + 0xeb, 0x65, 0x91, 0xc0, 0x68, 0xe7, 0xcd, 0xd6, 0xe1, 0x7c, 0xb6, 0xeb, + 0xae, 0x14, 0x16, 0x9c, 0x34, 0xfa, 0x24, 0x76, 0xcc, 0xf3, 0x98, 0x8e, + 0xe2, 0x34, 0x26, 0x93, 0x8d, 0x4f, 0xac, 0x6d, 0xe0, 0xf6, 0x5c, 0x24, + 0xba, 0x84, 0xee, 0x37, 0x8a, 0x0c, 0x41, 0x0a, 0xbf, 0xb0, 0xf0, 0xe0, + 0x34, 0xca, 0x97, 0xf3, 0x5c, 0x37, 0xe1, 0xc8, 0x59, 0xa8, 0xe8, 0xf6, + 0x64, 0x8b, 0xd6, 0xf2, 0x10, 0x06, 0x31, 0x00, 0x63, 0x15, 0x4f, 0xaa, + 0x38, 0x76, 0xd2, 0x0e, 0xd4, 0x0a, 0x02, 0xbe, 0x10, 0x0e, 0x5b, 0x09, + 0x16, 0x0f, 0xd0, 0x4e, 0x4c, 0x32, 0xad, 0xe4, 0xf6, 0xa3, 0xd6, 0x2c, + 0x2e, 0xcd, 0xc6, 0x17, 0x22, 0x04, 0xef, 0x65, 0x09, 0x1d, 0x2d, 0x0f, + 0xf3, 0xe7, 0xfc, 0xac, 0x1b, 0x91, 0xc3, 0x52, 0x32, 0x6d, 0xf7, 0x40, + 0x0d, 0xca, 0x5d, 0xff, 0xc6, 0x79, 0x23, 0xed, 0xc4, 0xc0, 0xc5, 0x02, + 0x28, 0xa6, 0x36, 0x25, 0xd4, 0x66, 0xa5, 0x7f, 0x99, 0x11, 0x0b, 0x6e, + 0x07, 0x6b, 0x58, 0x46, 0xc9, 0x57, 0x07, 0xc8, 0x5b, 0x97, 0x81, 0x89, + 0x38, 0x4e, 0xbe, 0x98, 0x11, 0x20, 0x67, 0xec, 0x14, 0xda, 0x2c, 0xdb, + 0x71, 0x9c, 0x63, 0xfa, 0xc9, 0x39, 0x26, 0x4b, 0x21, 0x56, 0xa3, 0x75, + 0xb0, 0xd9, 0x09, 0xd9, 0x6d, 0x5c, 0x16, 0x37, 0x26, 0x2b, 0xd7, 0xf5, + 0x17, 0x48, 0x15, 0x6a, 0x34, 0x43, 0xb1, 0x04, 0x82, 0x12, 0x03, 0xe4, + 0x83, 0xd4, 0x76, 0x35, 0x2e, 0x35, 0x99, 0xee, 0x16, 0xa4, 0x59, 0xaa, + 0x37, 0xbf, 0x28, 0xb2, 0x5e, 0x69, 0x6f, 0xd7, 0x28, 0x44, 0x40, 0xd0, + 0x8a, 0xe8, 0x31, 0xfa, 0x72, 0x0e, 0x0b, 0x27, 0x76, 0x39, 0x07, 0xdf, + 0xb6, 0xfb, 0xeb, 0x29, 0xa6, 0x8e, 0xe3, 0x96, 0x01, 0x3a, 0x7a, 0xb4, + 0x16, 0x00, 0xd7, 0x38, 0xd4, 0x01, 0x5e, 0xee, 0xf0, 0xe5, 0x46, 0xae, + 0x2f, 0xe7, 0x55, 0xd1, 0xf6, 0x33, 0xe4, 0xb2, 0x2b, 0x88, 0x20, 0x31, + 0x09, 0x1c, 0xe2, 0xe1, 0x0d, 0xd0, 0xcd, 0x4c, 0xe4, 0x05, 0xce, 0x99, + 0xe7, 0x59, 0xd8, 0x56, 0xac, 0x9f, 0xe3, 0xeb, 0xf3, 0x4e, 0xe5, 0xe7, + 0x15, 0x04, 0x9f, 0xa3, 0xae, 0x18, 0xad, 0x24, 0x26, 0x5b, 0x2c, 0xb5, + 0x95, 0x88, 0x69, 0x8b, 0x51, 0x2f, 0x13, 0x77, 0xc7, 0xf7, 0x08, 0xe1, + 0xd8, 0xa1, 0x42, 0x72, 0x2c, 0x35, 0xa3, 0xab, 0x6b, 0x3b, 0x8f, 0xb1, + 0x58, 0x70, 0x90, 0xd5, 0xde, 0x5d, 0x93, 0xb3, 0x55, 0xbe, 0xed, 0xa4, + 0x7e, 0x69, 0x1c, 0x81, 0x9d, 0xeb, 0xd7, 0x29, 0x37, 0x0d, 0xf0, 0x2d, + 0xc9, 0x9d, 0x69, 0x86, 0xdb, 0x5f, 0xb2, 0xd5, 0x1e, 0xa0, 0xda, 0x03, + 0x4f, 0xab, 0x5a, 0x9b, 0xd6, 0xf4, 0x65, 0x65, 0x1d, 0x0c, 0xcb, 0xb8, + 0xe9, 0x42, 0x38, 0xb2, 0x0d, 0x77, 0x1d, 0x71, 0x0b, 0x92, 0xbc, 0xbc, + 0x5f, 0x27, 0xe1, 0x09, 0xf5, 0x95, 0x48, 0xde, 0x0c, 0xa7, 0x45, 0xc7, + 0xc4, 0x97, 0x48, 0x0d, 0xe6, 0x48, 0x36, 0x28, 0x56, 0x6c, 0x34, 0x35, + 0xcb, 0x29, 0xe3, 0x4c, 0x36, 0xba, 0x85, 0x4c, 0x71, 0x21, 0x23, 0x2e, + 0xce, 0x9e, 0x8a, 0xe9, 0xc8, 0xac, 0xd1, 0x79, 0xc5, 0x49, 0xaa, 0x75, + 0xb0, 0x98, 0x07, 0xeb, 0x72, 0xf2, 0x43, 0x75, 0x41, 0xa9, 0x07, 0xd3, + 0xa7, 0x67, 0x72, 0xda, 0x43, 0xdc, 0x89, 0xed, 0xb5, 0xa2, 0x38, 0xeb, + 0x32, 0x95, 0x8b, 0x0b, 0x54, 0x75, 0xcc, 0x55, 0xb9, 0x1b, 0xeb, 0x7d, + 0x7c, 0xf3, 0x6d, 0x47, 0x90, 0x4d, 0x97, 0xce, 0x72, 0x7d, 0xea, 0xa3, + 0xd3, 0x4a, 0x3d, 0x4e, 0xa7, 0x38, 0x9f, 0x4d, 0x65, 0xb3, 0x0d, 0x02, + 0xd5, 0xa9, 0x8c, 0x0d, 0xbd, 0xd8, 0xb8, 0x68, 0x14, 0xdf, 0xe4, 0x25, + 0xab, 0x63, 0x6a, 0x5b, 0x55, 0x77, 0xd8, 0x77, 0xe6, 0x58, 0xb2, 0xf4, + 0x1a, 0xdf, 0x41, 0x01, 0xbf, 0xa8, 0x2b, 0x80, 0x7e, 0x86, 0x7a, 0x26, + 0x76, 0x32, 0x5e, 0x24, 0x91, 0xbd, 0x50, 0x87, 0x18, 0xf8, 0xb3, 0x7d, + 0xa7, 0x6c, 0x29, 0xbb, 0x3d, 0x9e, 0x73, 0xfb, 0x6c, 0x23, 0xc9, 0xf6, + 0x14, 0x69, 0xb1, 0xc3, 0x27, 0x0c, 0xe9, 0x5a, 0x67, 0x96, 0xc6, 0x2f, + 0xf6, 0x6d, 0x4c, 0x7b, 0x8d, 0xb7, 0x90, 0x46, 0x23, 0xb5, 0x56, 0xe3, + 0x0e, 0x04, 0x75, 0x5d, 0x9c, 0x11, 0x8e, 0xa3, 0xb9, 0x8e, 0xe4, 0x9d, + 0x15, 0xa5, 0xed, 0x10, 0x84, 0x1d, 0x57, 0x97, 0xf9, 0xe5, 0xd6, 0xbf, + 0xc0, 0xce, 0x8d, 0x3a, 0xa7, 0x6d, 0x9f, 0x5a, 0x75, 0xb4, 0xc8, 0x07, + 0x05, 0xbb, 0x09, 0x3d, 0xa4, 0xd2, 0x92, 0xa0, 0x29, 0x53, 0xfa, 0x80, + 0x9b, 0xc1, 0x4a, 0x4d, 0xdc, 0xed, 0xac, 0x3e, 0xf8, 0xe8, 0x1a, 0xa5, + 0xf8, 0x2d, 0xb7, 0x13, 0xb9, 0x6c, 0x13, 0x1f, 0xd5, 0x30, 0x0a, 0xe6, + 0xa7, 0x84, 0x82, 0x66, 0xfb, 0xd4, 0x54, 0x4b, 0xf3, 0xc0, 0xec, 0x3b, + 0xeb, 0x78, 0xd2, 0xb0, 0x43, 0xd6, 0x2d, 0xf9, 0x0b, 0x72, 0xd0, 0xac, + 0x3c, 0xca, 0x83, 0xa3, 0x95, 0x32, 0x5c, 0xc1, 0xc3, 0x10, 0x7f, 0xf2, + 0xe3, 0x52, 0x09, 0x35, 0xb3, 0xe0, 0x0b, 0xce, 0x0e, 0xae, 0x67, 0x22, + 0x0b, 0xa2, 0xc8, 0xf5, 0xfa, 0x8e, 0xa9, 0x80, 0x51, 0x58, 0xf1, 0xd8, + 0x9c, 0x69, 0xce, 0xb5, 0xca, 0x5a, 0x52, 0x06, 0xaf, 0x1f, 0x3a, 0x1b, + 0xda, 0xf5, 0x73, 0x9a, 0x45, 0x32, 0xfc, 0x2a, 0x36, 0xee, 0x79, 0x96, + 0xc4, 0xe3, 0x0e, 0x66, 0xd3, 0xc8, 0xd6, 0xc8, 0x61, 0xcd, 0x96, 0x47, + 0xb3, 0xea, 0x0f, 0xcc, 0x86, 0x24, 0xe1, 0x45, 0xba, 0xe5, 0xf1, 0x78, + 0x58, 0xf6, 0x97, 0x65, 0x1f, 0x94, 0xf8, 0x25, 0x5f, 0x88, 0xee, 0x4e, + 0x16, 0x5a, 0xad, 0x0c, 0xf6, 0xdc, 0x4c, 0xb8, 0x54, 0xc3, 0xd2, 0x87, + 0x4f, 0xe2, 0x88, 0xcc, 0x61, 0xf4, 0x0c, 0xc1, 0xda, 0xf5, 0xda, 0x1f, + 0x36, 0x7b, 0x3c, 0x0b, 0x50, 0x47, 0x6f, 0x57, 0x8a, 0xb3, 0xd7, 0x47, + 0x73, 0xac, 0x16, 0x41, 0x8e, 0x14, 0x0a, 0xca, 0xba, 0xf2, 0x3e, 0xba, + 0x1c, 0x44, 0x38, 0x29, 0x82, 0x03, 0x9a, 0xdb, 0x50, 0x04, 0xe7, 0x00, + 0xbd, 0x9a, 0xd0, 0xc1, 0xbf, 0x2c, 0x28, 0xee, 0x2c, 0x58, 0xb0, 0xcf, + 0xa4, 0xfb, 0xd5, 0xde, 0x3c, 0x60, 0xd6, 0x55, 0x44, 0x7c, 0x86, 0x6e, + 0x03, 0x42, 0xc8, 0x9c, 0x35, 0xaa, 0x08, 0xc3, 0x9c, 0xb9, 0x02, 0x58, + 0xe6, 0x38, 0xd6, 0xa6, 0x02, 0x3e, 0x5d, 0x2c, 0xcb, 0xcd, 0x1c, 0xaf, + 0x2a, 0x3a, 0x30, 0x23, 0xe0, 0x83, 0x17, 0x67, 0x23, 0xd5, 0x6c, 0x90, + 0x80, 0x9b, 0xa2, 0x09, 0x43, 0x06, 0xcb, 0xf4, 0xc4, 0x6c, 0xb3, 0x3f, + 0x52, 0x58, 0xc7, 0x89, 0x72, 0x62, 0x37, 0x67, 0xc7, 0x95, 0xe0, 0xa4, + 0xf6, 0x0e, 0x56, 0x5b, 0xb3, 0x20, 0xeb, 0x99, 0x2f, 0x2b, 0x9f, 0x5d, + 0x2c, 0x65, 0xab, 0xbc, 0xe0, 0xa3, 0x0b, 0x0f, 0xe5, 0x40, 0xfb, 0xcd, + 0x16, 0xc1, 0x71, 0x98, 0x32, 0x1b, 0x4d, 0x12, 0xf8, 0xe3, 0x25, 0x59, + 0x19, 0x78, 0x0b, 0xd0, 0xd1, 0x65, 0x06, 0xa7, 0x8b, 0x39, 0x40, 0xe2, + 0xcd, 0xac, 0x9b, 0x97, 0x9b, 0x56, 0x59, 0x5c, 0x40, 0xfa, 0x78, 0x06, + 0xf8, 0x34, 0xf2, 0x20, 0x8f, 0x59, 0x21, 0x09, 0x70, 0xa8, 0xb9, 0x32, + 0xaf, 0x34, 0x38, 0x5b, 0x94, 0xe5, 0x91, 0xec, 0x9a, 0x75, 0x91, 0xe6, + 0xd5, 0x6e, 0x4b, 0x28, 0x2e, 0x88, 0x68, 0x20, 0xfb, 0x8c, 0xb3, 0x5e, + 0x5e, 0xcf, 0x98, 0xc5, 0x32, 0x99, 0xe7, 0xf8, 0x1c, 0x5f, 0xd5, 0xf1, + 0xdc, 0x0a, 0x92, 0x5a, 0xb3, 0x6d, 0x0b, 0x6f, 0xe7, 0x46, 0x9f, 0x06, + 0x03, 0x35, 0x3f, 0x6a, 0xe3, 0xc5, 0xe0, 0x2c, 0xd3, 0xed, 0x0f, 0x96, + 0xbe, 0xae, 0xe9, 0x84, 0x5e, 0x6d, 0xb5, 0xa8, 0xb5, 0x8e, 0x70, 0xbe, + 0x2a, 0x1d, 0xdf, 0x8f, 0x8b, 0xc1, 0x03, 0xe3, 0x37, 0xac, 0x75, 0x43, + 0x19, 0xad, 0x72, 0xe9, 0x8f, 0xa4, 0x54, 0x77, 0x59, 0x5d, 0x85, 0xd4, + 0xa8, 0xe4, 0x3a, 0xb1, 0x03, 0xd6, 0x94, 0x1c, 0x61, 0x53, 0x42, 0x68, + 0x65, 0xe5, 0x1a, 0x28, 0x72, 0x9c, 0xe4, 0xde, 0x6c, 0x24, 0x13, 0xa9, + 0xd0, 0xc5, 0x62, 0x84, 0xfb, 0xd6, 0x12, 0xf1, 0xd9, 0x1c, 0xc0, 0x45, + 0xd3, 0x8a, 0xbc, 0x59, 0x54, 0x69, 0xcb, 0x82, 0x6d, 0x52, 0xa2, 0x83, + 0x9a, 0xca, 0xb9, 0xc9, 0xd4, 0xde, 0xa3, 0x5d, 0xa3, 0x92, 0x83, 0xed, + 0x5b, 0x52, 0xcd, 0x57, 0xd9, 0x2a, 0x81, 0xf7, 0xdd, 0x32, 0xda, 0x67, + 0xb8, 0x23, 0x37, 0x6a, 0xee, 0xd0, 0x1d, 0xd5, 0xac, 0x0e, 0x1b, 0x8d, + 0x47, 0x2d, 0xb3, 0x29, 0x71, 0x03, 0x6e, 0xe4, 0x14, 0x71, 0x98, 0x90, + 0xdf, 0xc3, 0xc9, 0xb8, 0xa6, 0xae, 0xa7, 0xf3, 0xf1, 0x70, 0x3a, 0xba, + 0xb3, 0xf1, 0x7c, 0xb8, 0x3a, 0x74, 0x82, 0x21, 0x86, 0x54, 0x9e, 0x0e, + 0x86, 0x11, 0x95, 0x81, 0xa3, 0x1f, 0x86, 0xf2, 0x60, 0x76, 0x3d, 0xab, + 0xb3, 0xcc, 0x15, 0x59, 0x1f, 0xa9, 0x95, 0x4f, 0x8b, 0x27, 0xce, 0x5b, + 0x8d, 0x67, 0x07, 0xba, 0xb6, 0xd1, 0xd8, 0x37, 0x69, 0xea, 0x1a, 0x33, + 0xa1, 0xac, 0xe2, 0x11, 0x6f, 0x96, 0x68, 0xda, 0x0f, 0x39, 0xec, 0x25, + 0xeb, 0xa3, 0x23, 0xbb, 0xde, 0x7c, 0x4d, 0x39, 0xf3, 0xa3, 0xd3, 0xf8, + 0x7c, 0x79, 0xf6, 0xea, 0x4a, 0x3f, 0x5a, 0x49, 0x7e, 0x56, 0x0d, 0xf8, + 0xaa, 0x03, 0x5a, 0x51, 0x44, 0x60, 0x10, 0xa1, 0xc5, 0x41, 0x0e, 0x87, + 0x48, 0xa3, 0x50, 0x09, 0xcc, 0xdc, 0x3d, 0x52, 0x22, 0x6e, 0x0b, 0xa0, + 0x51, 0x31, 0x72, 0x8c, 0xfd, 0x7a, 0x6b, 0x82, 0x4c, 0x51, 0x03, 0x48, + 0x4e, 0xe8, 0x59, 0x00, 0x54, 0x55, 0xef, 0x7a, 0x2e, 0x59, 0xde, 0x63, + 0xb9, 0xd3, 0xce, 0xa4, 0xd1, 0x95, 0x62, 0xde, 0x65, 0xbd, 0x15, 0x9c, + 0xbd, 0xe5, 0xc4, 0xe2, 0x69, 0x6e, 0x75, 0xaa, 0xbf, 0xe0, 0x0c, 0x68, + 0xbb, 0x04, 0x9c, 0x82, 0x4b, 0x4d, 0xd9, 0x89, 0xe7, 0x72, 0x26, 0xb3, + 0xc1, 0xe2, 0x68, 0x19, 0x63, 0x03, 0x3c, 0xbe, 0xc2, 0xaf, 0x38, 0xf5, + 0xec, 0xdb, 0x91, 0xbb, 0x59, 0x5f, 0xaa, 0xc3, 0x69, 0xbd, 0x6e, 0x67, + 0xca, 0x61, 0xbf, 0x2b, 0x51, 0xa7, 0x99, 0x9b, 0x3a, 0x7f, 0x1b, 0x8f, + 0x0a, 0xab, 0x40, 0x23, 0xfb, 0x65, 0x93, 0xca, 0xf8, 0x1c, 0x29, 0x7c, + 0x71, 0x13, 0xae, 0x5a, 0x29, 0x5d, 0xc8, 0x8e, 0xd4, 0x94, 0xcb, 0xa5, + 0x6f, 0xde, 0xf9, 0x93, 0x9e, 0xac, 0x2e, 0x94, 0x66, 0x33, 0x49, 0x07, + 0x4e, 0x0d, 0x16, 0x2e, 0x03, 0xae, 0x02, 0x5b, 0x4a, 0x78, 0xce, 0x60, + 0x84, 0x40, 0xaf, 0xdd, 0x5c, 0x18, 0x92, 0xe6, 0x66, 0xc7, 0xa9, 0x9c, + 0xcb, 0xb9, 0x68, 0xef, 0x32, 0x7b, 0x99, 0xb1, 0x9c, 0x9b, 0x42, 0xe3, + 0xd8, 0xec, 0xb4, 0xc3, 0xf1, 0x38, 0x43, 0xf6, 0xa5, 0xb1, 0x77, 0x65, + 0x4a, 0x4f, 0x1c, 0x67, 0xbf, 0xc0, 0xf5, 0x64, 0x43, 0xd7, 0xfc, 0xe6, + 0x9a, 0x44, 0x1b, 0x96, 0x1d, 0x3a, 0x18, 0x69, 0xe7, 0x07, 0x76, 0x36, + 0x3f, 0xf6, 0x97, 0xd5, 0x82, 0xe3, 0x2f, 0xa6, 0x6a, 0x22, 0xad, 0xb9, + 0xf7, 0x45, 0xb6, 0xd1, 0x54, 0x18, 0x56, 0xe0, 0xa2, 0xdc, 0x45, 0x32, + 0xbe, 0x24, 0xf9, 0xb5, 0xef, 0xce, 0x76, 0x99, 0x62, 0x02, 0xc1, 0x6e, + 0xe8, 0xf9, 0xac, 0x52, 0x11, 0xc5, 0x4c, 0x4b, 0xc6, 0xdd, 0x0c, 0x47, + 0x89, 0xb0, 0xad, 0x2c, 0xe5, 0x63, 0xd5, 0x59, 0x2c, 0x11, 0xc4, 0x39, + 0x78, 0xa2, 0xbc, 0x99, 0x23, 0xe4, 0xc9, 0x59, 0xec, 0xc8, 0xe5, 0xd9, + 0x98, 0xc5, 0x58, 0x76, 0x26, 0x5c, 0x2b, 0x93, 0x73, 0x16, 0xd8, 0xb8, + 0x19, 0x56, 0xbb, 0xf8, 0x3a, 0x1f, 0x6a, 0x56, 0x5f, 0xb2, 0xde, 0xd0, + 0xf5, 0xb6, 0x2d, 0x43, 0xe7, 0x22, 0xbb, 0x6e, 0xf2, 0x26, 0x71, 0x76, + 0x32, 0x24, 0xfa, 0x33, 0xc5, 0x1a, 0xdc, 0xc3, 0x3a, 0xad, 0xae, 0xfb, + 0x4d, 0x0d, 0xcf, 0xa9, 0x19, 0x71, 0x04, 0xc6, 0x17, 0x71, 0xe2, 0x86, + 0xef, 0xd6, 0xe2, 0xc4, 0x9b, 0x59, 0xbe, 0x5d, 0x6b, 0xda, 0x91, 0xe5, + 0x37, 0x81, 0x88, 0x46, 0x14, 0xbe, 0x0d, 0x93, 0x45, 0xa8, 0x18, 0xeb, + 0x45, 0xc5, 0x6b, 0xcb, 0xdd, 0x19, 0xe5, 0x6d, 0xa3, 0xb2, 0xcc, 0xa2, + 0xae, 0x9c, 0x6d, 0x54, 0x71, 0xbc, 0xb6, 0x6f, 0x74, 0xc7, 0x82, 0xb6, + 0x99, 0xd5, 0x46, 0x05, 0x80, 0x3b, 0xd3, 0xd4, 0x02, 0xbf, 0x5c, 0x14, + 0xad, 0x6e, 0x77, 0xf5, 0xc8, 0xae, 0xb4, 0xf8, 0x9a, 0xc4, 0x5a, 0x50, + 0xef, 0x81, 0xe4, 0x4d, 0x68, 0x10, 0x37, 0x8b, 0x3e, 0xc7, 0x16, 0x49, + 0x29, 0x0b, 0xc3, 0x29, 0x91, 0xed, 0x40, 0x03, 0x18, 0x7f, 0x77, 0xcc, + 0x92, 0xe1, 0xa2, 0x01, 0xf0, 0xbc, 0x38, 0xf7, 0x29, 0xb9, 0x72, 0x47, + 0x76, 0xc7, 0xae, 0xf7, 0x4a, 0xad, 0x18, 0x9c, 0xc2, 0x66, 0x14, 0x44, + 0x28, 0x29, 0x0e, 0x7c, 0xe5, 0x55, 0x17, 0x2f, 0x59, 0x82, 0xc8, 0x5d, + 0x34, 0xb4, 0x0e, 0x3b, 0x8f, 0x51, 0xf8, 0xe8, 0xee, 0x77, 0xbe, 0x87, + 0x60, 0x4a, 0xca, 0x6c, 0xbc, 0x41, 0x9e, 0xfc, 0xa9, 0x8a, 0xee, 0x59, + 0xc7, 0x17, 0x2c, 0x7e, 0x07, 0x49, 0x96, 0x7f, 0x34, 0x48, 0x71, 0x1d, + 0x93, 0xf4, 0x06, 0x24, 0x68, 0x66, 0xdf, 0x73, 0xbd, 0xe0, 0x6e, 0x3a, + 0xe0, 0x5c, 0x80, 0x23, 0xa8, 0xfb, 0xc8, 0xf1, 0x60, 0x37, 0xdc, 0xf1, + 0x84, 0x2a, 0x93, 0x38, 0xbb, 0x44, 0xe6, 0xf4, 0x12, 0x77, 0x98, 0xbc, + 0xab, 0x0f, 0x20, 0x7f, 0x46, 0xb4, 0xd1, 0x4b, 0x0a, 0x34, 0x03, 0x8a, + 0x3f, 0x44, 0xa4, 0x6e, 0x6a, 0xe3, 0x22, 0x56, 0x4d, 0x7c, 0xe5, 0x6c, + 0x90, 0x0c, 0xee, 0x20, 0xff, 0x38, 0x80, 0xbc, 0x22, 0xec, 0x8e, 0x3e, + 0x7c, 0xbe, 0x12, 0x86, 0x2f, 0xb3, 0x40, 0xaa, 0x99, 0xb0, 0x31, 0xb2, + 0xb4, 0xe5, 0x14, 0xfe, 0x74, 0x68, 0x0e, 0x69, 0x41, 0x67, 0xe1, 0x70, + 0x40, 0xab, 0x1e, 0xaa, 0x88, 0xf3, 0xa6, 0x5d, 0xeb, 0xa9, 0x25, 0x96, + 0xb5, 0xab, 0x1b, 0x43, 0xda, 0x38, 0x55, 0x11, 0x60, 0x35, 0x41, 0xd7, + 0xec, 0x8e, 0xdb, 0x66, 0xa7, 0x74, 0x19, 0x6d, 0x3c, 0x48, 0x17, 0x9c, + 0x30, 0xcb, 0x6d, 0x66, 0xb1, 0xa8, 0xf5, 0x2b, 0xb3, 0x88, 0x21, 0xd5, + 0x10, 0x17, 0x95, 0x7c, 0x66, 0x2c, 0x9e, 0x04, 0x11, 0xf7, 0xb0, 0x60, + 0xf9, 0x4b, 0x18, 0x70, 0x04, 0xac, 0xc3, 0x6b, 0x99, 0x8f, 0x6e, 0xfa, + 0x59, 0x0a, 0x52, 0x4a, 0x04, 0x90, 0x7b, 0x61, 0x1b, 0xec, 0x12, 0xea, + 0xec, 0xde, 0xd6, 0xa3, 0xe1, 0xda, 0x9d, 0x91, 0x99, 0xd0, 0x9c, 0xea, + 0x6a, 0x05, 0x33, 0x08, 0x35, 0x02, 0x3f, 0x7e, 0x4e, 0xd2, 0x4a, 0xde, + 0xee, 0xa4, 0xfd, 0xa2, 0xc1, 0x3c, 0x28, 0x72, 0x8f, 0x32, 0x72, 0x44, + 0xe7, 0xea, 0xae, 0x35, 0xe9, 0x45, 0x4f, 0xed, 0xe1, 0x39, 0x67, 0x03, + 0xd2, 0x49, 0xc9, 0xb1, 0x8f, 0xd6, 0x09, 0x1e, 0x9c, 0x2a, 0x3a, 0x85, + 0x18, 0x61, 0x12, 0x1e, 0xb4, 0xea, 0xcf, 0x0b, 0x98, 0x9d, 0x49, 0xe1, + 0x82, 0x47, 0xd6, 0x8b, 0x0b, 0xe7, 0x5e, 0x17, 0xfb, 0x9b, 0xef, 0x82, + 0xa1, 0x46, 0x19, 0xb3, 0xe1, 0x78, 0x3c, 0x95, 0xf4, 0x55, 0x6a, 0x2c, + 0x7e, 0xd3, 0xaa, 0x8b, 0x66, 0x4e, 0xd4, 0x94, 0xb3, 0xdf, 0x1e, 0xae, + 0xba, 0xb3, 0xee, 0x8e, 0x06, 0x3d, 0x82, 0xb4, 0x1e, 0xe4, 0xb5, 0xab, + 0x15, 0x65, 0xf8, 0x05, 0x1c, 0x85, 0xcb, 0x88, 0x0e, 0x32, 0x28, 0x92, + 0x0e, 0x67, 0x41, 0x40, 0xb6, 0x09, 0x3d, 0xe2, 0x62, 0x28, 0x5f, 0xe5, + 0x74, 0xe5, 0x1c, 0x8f, 0x14, 0x08, 0x80, 0x84, 0x6c, 0x29, 0xa1, 0xae, + 0xc5, 0x50, 0xbe, 0x48, 0xe1, 0xa6, 0x0a, 0xd8, 0x62, 0x8f, 0x1a, 0xed, + 0x6e, 0xcf, 0x6a, 0x21, 0x7f, 0x8e, 0xb5, 0xd5, 0xd2, 0x56, 0x3d, 0xc2, + 0x3d, 0x62, 0xf3, 0x2c, 0x31, 0xdd, 0x35, 0x9c, 0x89, 0x20, 0x68, 0xb9, + 0xba, 0xcf, 0x18, 0xcb, 0x2d, 0x6a, 0x1e, 0x05, 0x93, 0x8a, 0x43, 0xfe, + 0xc8, 0xa5, 0x7a, 0xbd, 0xd9, 0xa3, 0x2b, 0x78, 0xbb, 0x99, 0x61, 0xa1, + 0xc4, 0x1e, 0x66, 0x94, 0xd4, 0x34, 0x96, 0x08, 0xf4, 0xd6, 0xdd, 0x72, + 0xa5, 0xb0, 0xaf, 0x4c, 0xa4, 0xcf, 0xb3, 0x01, 0x49, 0xb9, 0x68, 0x3a, + 0xa7, 0xd0, 0x8e, 0x40, 0x79, 0xcf, 0x8a, 0x33, 0x41, 0xbf, 0xf2, 0x1b, + 0xc9, 0x6f, 0x48, 0xcf, 0x4c, 0x94, 0xc3, 0xc6, 0xda, 0x93, 0x4b, 0xd5, + 0x39, 0xab, 0x53, 0x0c, 0xbd, 0xb8, 0x0a, 0xa3, 0x8e, 0x18, 0xbe, 0x97, + 0xdb, 0x0b, 0x74, 0xca, 0x68, 0x0d, 0x3d, 0x95, 0x10, 0x72, 0x3c, 0x96, + 0x38, 0xb2, 0x4c, 0x83, 0x43, 0x6d, 0x60, 0xa5, 0x57, 0xc5, 0xad, 0x31, + 0x1e, 0x3a, 0x4d, 0xc9, 0x8a, 0xeb, 0x02, 0x35, 0x7b, 0x69, 0x6c, 0xed, + 0x95, 0x62, 0xf4, 0x20, 0x81, 0xd3, 0x0c, 0x00, 0xd3, 0xfd, 0x2d, 0x72, + 0x69, 0xa0, 0x98, 0x5f, 0x1f, 0xaa, 0x98, 0xbc, 0xb2, 0x84, 0x2e, 0xb2, + 0x38, 0x9e, 0xa0, 0x01, 0xc9, 0x48, 0xb8, 0xb6, 0xec, 0x34, 0xd3, 0xf0, + 0x95, 0x7c, 0xee, 0x75, 0x15, 0x72, 0xa6, 0x98, 0x99, 0x86, 0xe8, 0x8b, + 0x8d, 0xe4, 0x22, 0xfb, 0x82, 0x05, 0x91, 0xf4, 0x68, 0x38, 0x0e, 0x7c, + 0x50, 0xcc, 0xc8, 0xb9, 0x2a, 0xf5, 0xce, 0x58, 0x77, 0x88, 0xc9, 0xe8, + 0x07, 0x6b, 0xa4, 0xae, 0xc3, 0xca, 0xf5, 0xc2, 0xd2, 0x29, 0x89, 0xce, + 0xf1, 0x2a, 0xbc, 0x54, 0x9b, 0x1d, 0x8a, 0x84, 0x72, 0x6a, 0xa2, 0x75, + 0x15, 0x5c, 0xf4, 0x15, 0x49, 0xaa, 0x95, 0x2e, 0x8b, 0xb6, 0x95, 0x9b, + 0xcc, 0x70, 0x98, 0xb9, 0xa8, 0xb6, 0x5a, 0x90, 0xf2, 0xc9, 0x03, 0x36, + 0x30, 0x6a, 0x02, 0x1c, 0x57, 0x94, 0xba, 0xeb, 0x11, 0xcf, 0x9e, 0x65, + 0x70, 0xbb, 0x0b, 0xf5, 0x38, 0x8f, 0x73, 0x52, 0x3f, 0xad, 0x44, 0x7b, + 0x6e, 0xd1, 0xda, 0x6c, 0xae, 0x40, 0xa8, 0x56, 0xef, 0x56, 0x82, 0xc7, + 0x29, 0xca, 0x1c, 0x64, 0xc7, 0x85, 0x21, 0x72, 0x7b, 0xd3, 0xc3, 0x31, + 0x6c, 0x33, 0x3b, 0x2c, 0xed, 0x8d, 0xe3, 0x71, 0xaa, 0x26, 0x21, 0xf3, + 0x8e, 0x2d, 0x57, 0xb5, 0x0f, 0xf5, 0x90, 0x9e, 0x8a, 0x17, 0x0b, 0xa0, + 0x89, 0xb1, 0xcb, 0x19, 0xc3, 0x69, 0x45, 0x6a, 0x25, 0x26, 0x1a, 0x7a, + 0x98, 0x23, 0x82, 0x98, 0x30, 0x9c, 0x7f, 0x1a, 0x2f, 0x47, 0x92, 0x4f, + 0xd3, 0x84, 0x15, 0x78, 0xac, 0x3e, 0xf5, 0x1e, 0x4b, 0x92, 0xa2, 0x87, + 0xb4, 0xbd, 0x71, 0xdd, 0xf7, 0x15, 0x37, 0xa8, 0xee, 0x4a, 0x25, 0xeb, + 0x70, 0xd8, 0x10, 0xf5, 0x78, 0x62, 0xd5, 0xf3, 0x46, 0x39, 0x26, 0x58, + 0x2b, 0x30, 0xa5, 0x0f, 0x41, 0x46, 0xaf, 0xc2, 0xd8, 0x78, 0x91, 0x1c, + 0x07, 0x1b, 0x0f, 0xd6, 0x52, 0x3c, 0x31, 0x5d, 0xb0, 0xae, 0x37, 0x60, + 0xf0, 0x97, 0xcb, 0x76, 0xdb, 0x26, 0xfb, 0xb3, 0xd5, 0xc4, 0x67, 0x67, + 0x91, 0x29, 0x7d, 0x87, 0xe9, 0x57, 0xd1, 0x6d, 0x72, 0xd9, 0x96, 0x20, + 0x6f, 0x5f, 0x5d, 0x2d, 0xfd, 0x54, 0x55, 0x28, 0x4e, 0x0d, 0xba, 0x59, + 0x6f, 0xcf, 0x0c, 0x94, 0x46, 0x69, 0x76, 0xa9, 0x4f, 0xe9, 0x75, 0x24, + 0x7c, 0x18, 0x26, 0xb2, 0x8a, 0x2e, 0x8c, 0xf3, 0x92, 0x02, 0x92, 0x6c, + 0x10, 0xcc, 0xdf, 0x5a, 0xa4, 0x87, 0xa4, 0xd2, 0x69, 0x4f, 0x25, 0xf9, + 0x92, 0x3c, 0x73, 0x45, 0x62, 0x46, 0x2c, 0x29, 0x94, 0x80, 0xe4, 0x15, + 0xab, 0x42, 0xdb, 0x95, 0x6b, 0x57, 0xc8, 0xcc, 0x54, 0xd7, 0x8d, 0x3b, + 0x8e, 0xbb, 0xac, 0xbb, 0xae, 0x1d, 0xd4, 0x0d, 0x1d, 0xf3, 0x8a, 0x09, + 0xce, 0x6e, 0xb7, 0x35, 0x98, 0x19, 0x44, 0xf7, 0x1e, 0x14, 0x1a, 0xf3, + 0xd9, 0x06, 0xa2, 0xbc, 0x66, 0xa3, 0xb4, 0xed, 0x70, 0x10, 0x1d, 0x97, + 0x07, 0x9a, 0xed, 0xb8, 0x67, 0x4f, 0xda, 0x9c, 0xf3, 0x6a, 0x60, 0x34, + 0x24, 0x8a, 0x5b, 0x84, 0x9b, 0x21, 0xd0, 0x72, 0x97, 0x42, 0xeb, 0x54, + 0xb1, 0xb9, 0x5d, 0xeb, 0x4a, 0xb9, 0x72, 0x02, 0x5c, 0xf5, 0xfb, 0xc8, + 0xbb, 0x72, 0x42, 0x73, 0x65, 0x85, 0x86, 0x21, 0x2d, 0xcb, 0x47, 0xf4, + 0xc4, 0xb0, 0xa0, 0xab, 0x67, 0x5f, 0x2e, 0x3b, 0x18, 0xdb, 0x65, 0x29, + 0x53, 0xe7, 0x7d, 0x44, 0x62, 0x57, 0x9a, 0xc4, 0x3a, 0x99, 0x5c, 0x6a, + 0xa2, 0x35, 0x4f, 0xb0, 0x9d, 0xb7, 0x69, 0x00, 0xf4, 0x91, 0xa3, 0x7a, + 0xa7, 0x96, 0xd0, 0xb9, 0x51, 0x72, 0xbc, 0x12, 0x88, 0x66, 0x65, 0x0c, + 0x95, 0xb5, 0x57, 0xad, 0xcd, 0x1c, 0x96, 0x91, 0xcb, 0x91, 0x1f, 0xcd, + 0x13, 0x83, 0x48, 0x7b, 0x8c, 0xdc, 0xcd, 0x48, 0x79, 0xb3, 0x89, 0x38, + 0x67, 0x07, 0xf2, 0x11, 0x12, 0x59, 0xf3, 0x8e, 0x24, 0x6c, 0x0a, 0xd8, + 0x6a, 0x37, 0xd6, 0xb8, 0xc5, 0xaf, 0xf9, 0x9e, 0x38, 0xf0, 0x7b, 0x3e, + 0x47, 0x5c, 0x90, 0x0c, 0xed, 0x30, 0xb3, 0xa9, 0x34, 0x28, 0xcb, 0xb5, + 0xc6, 0x45, 0x0d, 0x7b, 0xa1, 0x57, 0x64, 0x9b, 0x03, 0xc6, 0x98, 0x41, + 0xba, 0xac, 0xe0, 0x22, 0xb4, 0x88, 0x42, 0xb0, 0xdc, 0xde, 0xac, 0x93, + 0x55, 0x5b, 0x67, 0x07, 0x1d, 0xda, 0x1e, 0x66, 0xf4, 0x5a, 0xd4, 0x07, + 0xee, 0xdc, 0xee, 0x97, 0xd8, 0x3e, 0x69, 0x14, 0x0d, 0x32, 0x75, 0x75, + 0x62, 0xe4, 0x92, 0x1d, 0x31, 0xa3, 0x72, 0xb9, 0xeb, 0x2c, 0x98, 0xcf, + 0x1d, 0x1a, 0x5d, 0xef, 0x0f, 0x34, 0x55, 0xe1, 0x47, 0xd3, 0x8b, 0xe3, + 0x6a, 0xbd, 0x4b, 0xf6, 0x56, 0xe6, 0x44, 0x82, 0xb6, 0x30, 0x04, 0x78, + 0xab, 0xd1, 0xb0, 0xa8, 0x8d, 0xdb, 0x1d, 0x5a, 0x59, 0xe5, 0x4c, 0x12, + 0x81, 0x0d, 0x69, 0x9a, 0x23, 0x08, 0xda, 0x7e, 0x53, 0x74, 0xdb, 0x7d, + 0xb9, 0x3a, 0x17, 0xba, 0x89, 0x97, 0x2b, 0x57, 0x15, 0x55, 0x55, 0xf4, + 0x1d, 0x51, 0xdc, 0x69, 0x02, 0x27, 0xee, 0xc9, 0xab, 0x9d, 0x47, 0xf0, + 0x5c, 0xd3, 0x8b, 0x0b, 0x02, 0xcb, 0x67, 0xc5, 0xee, 0x6c, 0xbf, 0x2c, + 0x9c, 0x45, 0x12, 0x17, 0x2b, 0x82, 0xb8, 0x84, 0x71, 0x1c, 0x05, 0x59, + 0xa4, 0xdb, 0x85, 0x9a, 0x97, 0x39, 0x55, 0x71, 0x09, 0xd3, 0xeb, 0x52, + 0x5c, 0x1e, 0x5c, 0xa6, 0x4d, 0xe6, 0xb8, 0xab, 0x56, 0x0a, 0xec, 0xb1, + 0xf1, 0xfa, 0xa2, 0x45, 0xd7, 0xb5, 0x22, 0xc0, 0xa7, 0x05, 0x0d, 0x1b, + 0x6a, 0x19, 0xe9, 0xf0, 0x8e, 0x2e, 0xfc, 0x6e, 0x1b, 0xe1, 0xa1, 0x94, + 0x1f, 0x28, 0xd9, 0x36, 0x13, 0xa2, 0xd5, 0x71, 0x67, 0x21, 0x65, 0x22, + 0xc7, 0xc6, 0x6d, 0xda, 0x13, 0x5b, 0x77, 0xdb, 0x07, 0x94, 0x8e, 0xe7, + 0x27, 0xf9, 0x7a, 0x8a, 0x66, 0x52, 0xd7, 0x75, 0x2d, 0x9a, 0xf9, 0x57, + 0xae, 0x3d, 0x0c, 0xdc, 0xa2, 0x09, 0x2c, 0xeb, 0xaa, 0x08, 0x9e, 0x00, + 0xca, 0xe2, 0xe5, 0x4c, 0x70, 0xaf, 0x6d, 0x2a, 0x80, 0xf6, 0x15, 0xbe, + 0x10, 0x0e, 0x4b, 0x75, 0xcd, 0x95, 0xed, 0x69, 0xe6, 0xc4, 0x07, 0x0f, + 0x9a, 0x85, 0x0b, 0x36, 0x5d, 0x60, 0x63, 0xa6, 0x60, 0x6d, 0x3a, 0x84, + 0xc8, 0xda, 0xb0, 0x9d, 0x88, 0x65, 0x90, 0x66, 0x73, 0xb4, 0x03, 0xa3, + 0x67, 0xb3, 0x26, 0x4b, 0x83, 0x6c, 0x44, 0xaf, 0x38, 0x57, 0xe4, 0xbb, + 0x6d, 0xd7, 0x28, 0x61, 0xcb, 0x74, 0xeb, 0x18, 0x9a, 0xe3, 0xdc, 0x69, + 0xc3, 0x30, 0x33, 0xe9, 0xba, 0xbf, 0x96, 0x6b, 0x10, 0xd6, 0xb4, 0x08, + 0xcb, 0x42, 0x86, 0xb2, 0xd0, 0x35, 0xc0, 0x25, 0x65, 0xbe, 0x6e, 0xe4, + 0x84, 0xbc, 0x46, 0x84, 0x2a, 0x49, 0x3c, 0xb9, 0x40, 0xae, 0xdd, 0x75, + 0xab, 0x34, 0x25, 0x05, 0xd3, 0x0b, 0x48, 0x66, 0xf0, 0xba, 0x96, 0x3d, + 0xc6, 0x3d, 0x9d, 0x73, 0x22, 0x34, 0x50, 0xad, 0xa8, 0x11, 0x74, 0xcb, + 0x36, 0xf9, 0x55, 0xa6, 0xc6, 0x78, 0xbd, 0x49, 0xd1, 0x63, 0x6c, 0xb5, + 0x41, 0xbd, 0x43, 0x63, 0x26, 0x12, 0x8b, 0x83, 0x5e, 0x51, 0x7b, 0x6a, + 0x83, 0xa7, 0xc0, 0x71, 0xa4, 0x83, 0xb4, 0x8e, 0x88, 0x2d, 0x94, 0xe9, + 0x59, 0xbc, 0x8a, 0xaa, 0x61, 0xeb, 0x1c, 0x99, 0x22, 0x77, 0x97, 0x50, + 0x11, 0xec, 0x55, 0xa7, 0x91, 0x8f, 0xf2, 0xfa, 0x90, 0x1d, 0xcd, 0xe3, + 0x7a, 0xec, 0x0e, 0x22, 0xe3, 0x4b, 0x94, 0x21, 0x2c, 0xd1, 0x6d, 0xd8, + 0xa8, 0x3b, 0x13, 0x2f, 0x32, 0x83, 0x73, 0x08, 0xba, 0x77, 0x35, 0x47, + 0x73, 0x37, 0x9e, 0x71, 0x59, 0xe7, 0xea, 0x32, 0xc3, 0x3d, 0x38, 0xdf, + 0xed, 0x23, 0x7f, 0x44, 0x61, 0x67, 0x61, 0x8e, 0x75, 0x94, 0x3a, 0x06, + 0xbc, 0xf2, 0x2f, 0x22, 0x50, 0xb6, 0x36, 0x58, 0xca, 0x23, 0x1a, 0x93, + 0x03, 0x89, 0x6a, 0x09, 0x6d, 0xae, 0x4f, 0xbb, 0x55, 0x4f, 0xea, 0x29, + 0x26, 0xc3, 0xee, 0x22, 0x18, 0xf3, 0x39, 0x5e, 0xd6, 0x11, 0x73, 0x24, + 0x93, 0x95, 0xb7, 0x10, 0xf5, 0x9d, 0xbe, 0x9e, 0x9e, 0xf9, 0xf3, 0x0b, + 0x89, 0x88, 0xb6, 0xa8, 0xb6, 0x9f, 0x11, 0x03, 0x3d, 0x27, 0x4f, 0x92, + 0x05, 0x62, 0x0a, 0xd5, 0x6d, 0xd8, 0x26, 0xd0, 0xce, 0xfb, 0x48, 0x22, + 0x35, 0xf3, 0x40, 0xe7, 0x55, 0xc9, 0x37, 0x6c, 0xb3, 0x24, 0x6c, 0x5e, + 0x33, 0x94, 0x63, 0x29, 0xb1, 0x94, 0xa3, 0x99, 0x69, 0xc0, 0xb0, 0x44, + 0xb8, 0xa5, 0x16, 0x4e, 0x69, 0xab, 0x4c, 0x90, 0x4b, 0xa7, 0xf5, 0x41, + 0x54, 0xc6, 0xdd, 0xce, 0x93, 0xe2, 0x7a, 0x54, 0x3a, 0x81, 0x5a, 0x2b, + 0x48, 0x92, 0x5f, 0xf5, 0x59, 0x6b, 0x9d, 0xf3, 0xee, 0x78, 0xc9, 0xa9, + 0x3a, 0xdd, 0xf8, 0xc2, 0x6e, 0x03, 0x09, 0xa6, 0xec, 0xab, 0x10, 0xd7, + 0x77, 0xaa, 0xd4, 0xef, 0x01, 0x76, 0xca, 0x6c, 0xb1, 0x85, 0x0b, 0x39, + 0x8e, 0x50, 0xdc, 0xbb, 0x46, 0x59, 0xec, 0x35, 0x02, 0x57, 0x08, 0xf6, + 0xb2, 0x15, 0x35, 0xb7, 0x68, 0x90, 0x53, 0x71, 0x88, 0xb1, 0x7a, 0x2f, + 0xba, 0x2b, 0xd9, 0xf0, 0x21, 0x64, 0xbf, 0x77, 0x2f, 0xf6, 0x21, 0x18, + 0x56, 0xbd, 0x53, 0x39, 0xc5, 0xb9, 0x22, 0xd4, 0x85, 0xaa, 0x2e, 0x10, + 0x38, 0x51, 0x23, 0xdd, 0xd4, 0x77, 0x2e, 0xc5, 0x5f, 0xed, 0x53, 0xb3, + 0x57, 0x99, 0x59, 0xb9, 0x0b, 0x28, 0x86, 0x09, 0xac, 0xea, 0x92, 0x35, + 0x94, 0x2f, 0x53, 0x68, 0xd3, 0xa1, 0xd0, 0xc6, 0xbc, 0xd8, 0xc1, 0x22, + 0xaf, 0xb6, 0xe8, 0x91, 0x83, 0x77, 0x65, 0x39, 0xcf, 0x62, 0x62, 0x68, + 0xb2, 0xdd, 0x0e, 0x89, 0x2e, 0x28, 0xd9, 0x58, 0xc4, 0xc2, 0x93, 0x58, + 0xaf, 0xb5, 0x76, 0xfe, 0xca, 0xbc, 0x50, 0x74, 0xb7, 0x3e, 0x35, 0xb9, + 0x8a, 0x5e, 0xb4, 0xcb, 0x28, 0x26, 0x73, 0xca, 0x08, 0x03, 0xfb, 0x50, + 0x6d, 0xaf, 0x7b, 0x55, 0x5f, 0xb7, 0x35, 0xb7, 0xdf, 0x55, 0x5e, 0xad, + 0xcc, 0xce, 0x23, 0x3c, 0x0c, 0xa7, 0x2b, 0x1d, 0x9e, 0x0a, 0xa5, 0x89, + 0xaf, 0x9a, 0xc1, 0x64, 0x36, 0x44, 0xa1, 0xc6, 0xac, 0x48, 0x71, 0x18, + 0xee, 0xaa, 0x5d, 0x79, 0xa4, 0xac, 0xcc, 0xa3, 0x48, 0x55, 0xb4, 0x59, + 0x4f, 0x20, 0x1d, 0x58, 0xd6, 0x95, 0xe4, 0x92, 0xdb, 0x7b, 0x3a, 0x0a, + 0x56, 0xba, 0x44, 0xd7, 0x27, 0xa6, 0x94, 0x91, 0x56, 0xee, 0xec, 0x9d, + 0xb2, 0xf5, 0x1b, 0x28, 0xa7, 0xf7, 0x55, 0x8b, 0xa8, 0xb8, 0x9e, 0xa6, + 0xe6, 0x01, 0xdd, 0xad, 0xaf, 0x91, 0xb3, 0xa0, 0x1a, 0xe8, 0x22, 0xa9, + 0x9c, 0xb3, 0x80, 0x51, 0x9b, 0xda, 0x9d, 0x50, 0xeb, 0x32, 0xa7, 0x50, + 0x38, 0x35, 0xa0, 0xeb, 0x81, 0xbf, 0xaa, 0x4c, 0x1f, 0xdb, 0xa9, 0xaf, + 0x1b, 0x79, 0x6e, 0xca, 0x6b, 0x97, 0xda, 0x76, 0xda, 0xd1, 0xea, 0x61, + 0xf7, 0x4a, 0xab, 0x9d, 0xe7, 0x3b, 0x82, 0x8c, 0x48, 0x21, 0x24, 0xce, + 0xaf, 0x49, 0x68, 0x5d, 0x82, 0x95, 0x68, 0x60, 0x58, 0x2a, 0xc9, 0x80, + 0x67, 0xeb, 0xc2, 0x11, 0x67, 0x2b, 0xe0, 0xf5, 0xb2, 0x04, 0x62, 0xd5, + 0x3c, 0xea, 0x4d, 0xc8, 0xdc, 0x49, 0x49, 0x96, 0xce, 0x72, 0x86, 0xac, + 0xb5, 0x7c, 0xa9, 0x9f, 0x2e, 0x88, 0x5d, 0x93, 0x4c, 0x46, 0x15, 0xbe, + 0xe5, 0x2b, 0x59, 0x2a, 0x66, 0x74, 0x59, 0xe4, 0x07, 0x7f, 0x7b, 0x59, + 0x21, 0xf1, 0x35, 0x28, 0xad, 0xcd, 0x7e, 0xdf, 0x71, 0x1b, 0x62, 0xdf, + 0x40, 0xc2, 0x2c, 0xef, 0x2e, 0xf1, 0x69, 0x15, 0x3a, 0x2b, 0x37, 0x37, + 0xf5, 0x5c, 0x73, 0x48, 0x9f, 0xf0, 0xb3, 0x9d, 0x39, 0x5a, 0xba, 0x6b, + 0xe9, 0x62, 0x92, 0xed, 0x4e, 0x54, 0xb1, 0xce, 0x44, 0xa4, 0xcc, 0x66, + 0x01, 0x11, 0x39, 0x5b, 0x6d, 0xb7, 0x46, 0x09, 0x48, 0xa7, 0x6b, 0x06, + 0x26, 0xf5, 0xc8, 0xbb, 0xb0, 0xcc, 0x31, 0x25, 0xcd, 0xde, 0xf2, 0xc8, + 0xa3, 0x1f, 0xed, 0xa3, 0xc2, 0x51, 0x62, 0x12, 0x85, 0x67, 0xa6, 0x29, + 0xdb, 0x48, 0xa7, 0x90, 0xab, 0x55, 0x51, 0xe4, 0xa8, 0x99, 0xf7, 0xe8, + 0xd6, 0xdd, 0xed, 0x30, 0x84, 0x75, 0x1a, 0x04, 0x15, 0x72, 0x97, 0x8f, + 0x11, 0xfd, 0x84, 0x81, 0x14, 0x38, 0x2c, 0xb6, 0x95, 0xbe, 0xc1, 0x56, + 0xd4, 0x8e, 0xde, 0xc3, 0xce, 0x75, 0xe6, 0x4a, 0x22, 0x97, 0x60, 0x96, + 0xb3, 0x30, 0xea, 0x93, 0xbf, 0xe1, 0xe7, 0x73, 0xc5, 0xb7, 0x66, 0x90, + 0xb4, 0x0c, 0x08, 0x90, 0x2b, 0xd2, 0xe3, 0xce, 0xcb, 0xb7, 0x2b, 0xaf, + 0x38, 0x56, 0xa1, 0xe2, 0xc5, 0xbc, 0xe4, 0x0d, 0x94, 0xa6, 0xfa, 0xb0, + 0xdc, 0x59, 0xb3, 0xb3, 0x7d, 0x29, 0xfa, 0xf4, 0x84, 0x72, 0xd7, 0x35, + 0xb5, 0x0d, 0xed, 0xd9, 0x2e, 0xcc, 0xf6, 0x4a, 0x68, 0x65, 0xc1, 0x9a, + 0x33, 0xb0, 0x4d, 0xb4, 0xb7, 0x4f, 0xbb, 0xf3, 0x51, 0x3f, 0x37, 0x8d, + 0x1c, 0xdb, 0x68, 0xbc, 0x77, 0x9c, 0x79, 0x17, 0x9e, 0x96, 0xc3, 0x71, + 0x9d, 0x6e, 0x92, 0x03, 0x5f, 0x52, 0x51, 0x1b, 0x5d, 0xda, 0x1a, 0xc5, + 0x54, 0xa0, 0x8a, 0x4d, 0x8e, 0x7a, 0x10, 0x53, 0x9c, 0x75, 0x6d, 0x56, + 0x8d, 0x2a, 0x7a, 0x2e, 0xd3, 0xf3, 0x69, 0x35, 0xa0, 0x5c, 0xd8, 0x58, + 0xd1, 0x40, 0x5f, 0x4a, 0xc7, 0x11, 0x60, 0x1e, 0xbe, 0x96, 0x3d, 0xc8, + 0xfb, 0x48, 0x90, 0xe7, 0x06, 0x86, 0x0f, 0x70, 0x93, 0x5a, 0x05, 0x4c, + 0x0e, 0x53, 0x96, 0x36, 0x78, 0x89, 0x81, 0xec, 0x84, 0x65, 0x66, 0x79, + 0xab, 0xcb, 0xac, 0x47, 0xa0, 0xe6, 0x88, 0xad, 0xe3, 0xec, 0x38, 0x1b, + 0x9d, 0xf1, 0x9c, 0xb6, 0x28, 0xa5, 0x2e, 0x8b, 0x2c, 0xb2, 0x2f, 0x19, + 0x23, 0xee, 0x4d, 0x03, 0x3d, 0x81, 0xc2, 0x44, 0xce, 0x1e, 0xbd, 0x44, + 0xd1, 0xea, 0x2e, 0x3f, 0x8a, 0x78, 0x5c, 0x4e, 0x7a, 0x8a, 0xcc, 0x41, + 0x7a, 0x74, 0x98, 0xad, 0x4a, 0xad, 0xe5, 0xca, 0x83, 0xda, 0xe2, 0x94, + 0xd8, 0xc4, 0xe4, 0x0c, 0xa1, 0xf4, 0xf3, 0x61, 0x9f, 0x93, 0x84, 0xb2, + 0xde, 0xe4, 0x84, 0x7f, 0x39, 0xa4, 0x6b, 0x4d, 0x92, 0x36, 0xe8, 0x40, + 0x14, 0x01, 0x3c, 0xf4, 0x03, 0xb6, 0x66, 0x4b, 0xaa, 0x08, 0xf7, 0xe8, + 0x26, 0x50, 0x03, 0xd2, 0x2d, 0x78, 0x20, 0xfb, 0x56, 0x06, 0x61, 0x3f, + 0x70, 0x17, 0xa3, 0x9b, 0x93, 0xcb, 0x13, 0x49, 0xae, 0x03, 0x4e, 0x3d, + 0x75, 0x28, 0xf0, 0x6d, 0xbe, 0x48, 0xc1, 0xe8, 0x18, 0xc7, 0x2b, 0x77, + 0x31, 0x1b, 0x56, 0x0e, 0x2a, 0x37, 0xc8, 0x0a, 0xa9, 0xe0, 0x76, 0xb9, + 0x89, 0xab, 0x61, 0x29, 0xea, 0xeb, 0x2e, 0x51, 0xcc, 0xea, 0x88, 0x59, + 0x31, 0xb7, 0x56, 0x23, 0x47, 0x4d, 0xe1, 0x52, 0x11, 0xcb, 0x7c, 0xce, + 0xc8, 0x3c, 0x1f, 0x56, 0xf9, 0x7e, 0xd9, 0xed, 0xc5, 0x70, 0xae, 0xaf, + 0x73, 0x54, 0x11, 0xbb, 0x23, 0x6b, 0xc5, 0x7c, 0x4c, 0xe5, 0xac, 0x9b, + 0xec, 0x51, 0x9d, 0x55, 0x35, 0x84, 0x8b, 0x45, 0xc7, 0x12, 0x84, 0xc0, + 0xc7, 0x72, 0xbb, 0xb6, 0x09, 0x1a, 0x97, 0x92, 0x94, 0x5d, 0x89, 0x64, + 0x34, 0xb0, 0x0d, 0xc5, 0x4b, 0x70, 0xb8, 0xaa, 0x70, 0x63, 0xe1, 0x2b, + 0x3b, 0xab, 0x9e, 0xda, 0xed, 0x04, 0x47, 0x15, 0x45, 0x7d, 0xeb, 0xab, + 0x45, 0xdb, 0xea, 0x48, 0x5a, 0x93, 0x87, 0xc4, 0x60, 0x95, 0xb3, 0xe5, + 0xe3, 0x7a, 0x71, 0xdc, 0x9a, 0x4c, 0xb0, 0xa1, 0x90, 0x93, 0x62, 0x78, + 0x9a, 0x81, 0x56, 0x1c, 0x3b, 0xd7, 0xfd, 0xf2, 0xb4, 0xd5, 0x4e, 0xd7, + 0x73, 0x67, 0x05, 0xbc, 0x07, 0x01, 0xed, 0xc6, 0xc6, 0xe2, 0x82, 0x6f, + 0xf9, 0xa2, 0xdb, 0xcf, 0x14, 0xb3, 0x3c, 0xe2, 0x3b, 0x93, 0xbb, 0x28, + 0xcc, 0xa5, 0x29, 0x1b, 0x37, 0x58, 0x9c, 0xb5, 0x0d, 0xbb, 0x64, 0x81, + 0x1f, 0x58, 0x6d, 0xab, 0x6d, 0x0f, 0x7c, 0xc3, 0x6c, 0xd7, 0x70, 0xe5, + 0xc2, 0x6a, 0x61, 0x5c, 0x6f, 0xb2, 0xb3, 0x64, 0x8f, 0x87, 0x8d, 0x2a, + 0xb0, 0x31, 0xe7, 0x50, 0x83, 0x15, 0x47, 0xfa, 0x7e, 0x1f, 0x70, 0xeb, + 0xc5, 0xd5, 0x3b, 0x5d, 0xd4, 0xf3, 0xa9, 0xba, 0x5c, 0x5c, 0x7a, 0xa4, + 0xd9, 0x33, 0xe0, 0x89, 0xb7, 0xad, 0x8c, 0x3e, 0x4c, 0xd4, 0x23, 0xa9, + 0xb8, 0x9c, 0x06, 0x64, 0x25, 0xef, 0xd7, 0x70, 0xad, 0x68, 0x7c, 0x8b, + 0xdb, 0x45, 0x60, 0xcd, 0xbb, 0x73, 0x06, 0x6f, 0xb9, 0x50, 0x39, 0xc6, + 0xad, 0x3d, 0x2a, 0x02, 0x48, 0x04, 0xc3, 0xe2, 0xb2, 0x58, 0x45, 0x90, + 0x41, 0xc6, 0x3b, 0xce, 0xd2, 0x88, 0xce, 0x90, 0x66, 0x20, 0x07, 0xd0, + 0x1d, 0x5e, 0x74, 0x74, 0x80, 0x91, 0x74, 0xa5, 0x2e, 0x8a, 0xc2, 0x2c, + 0x84, 0xbd, 0x05, 0x0b, 0x3c, 0x1a, 0x03, 0x12, 0x62, 0x1d, 0xf8, 0x7c, + 0xd0, 0x8f, 0xa2, 0xa4, 0x17, 0x45, 0x4c, 0xa5, 0x35, 0x0c, 0x54, 0x62, + 0x33, 0xe8, 0x50, 0x11, 0x9b, 0x0e, 0xb2, 0xa5, 0x74, 0xab, 0xf5, 0x45, + 0xad, 0x69, 0x8b, 0x85, 0x79, 0x59, 0x10, 0x4d, 0xe4, 0xba, 0xd8, 0xae, + 0x94, 0xcd, 0x4b, 0x2c, 0x5a, 0xc9, 0xfa, 0xc2, 0x9b, 0x4e, 0xbc, 0x37, + 0xb4, 0xe3, 0x45, 0x35, 0x0d, 0x6d, 0x5b, 0x2c, 0xd2, 0xcb, 0x42, 0x07, + 0x9e, 0xae, 0x28, 0x4d, 0xa5, 0xe1, 0xc3, 0xcc, 0x2a, 0x52, 0x21, 0x46, + 0xd5, 0x38, 0xdd, 0xc7, 0xb0, 0xca, 0xdb, 0xbf, 0xae, 0xec, 0x0e, 0x9f, + 0xfb, 0x45, 0x6a, 0x15, 0x9b, 0x93, 0x67, 0x55, 0x28, 0x4a, 0xc1, 0xea, + 0x69, 0x18, 0x4c, 0x72, 0xa3, 0x9f, 0xbe, 0x69, 0x89, 0x79, 0xc8, 0x31, + 0xd4, 0xe9, 0x79, 0xd5, 0xfa, 0x7a, 0x07, 0xa1, 0x61, 0x7c, 0xf9, 0xae, + 0x7f, 0x6a, 0x05, 0x24, 0xb4, 0xe1, 0xd3, 0x1a, 0xf3, 0x0c, 0x5a, 0x15, + 0xea, 0xf7, 0x6d, 0xbf, 0x62, 0x65, 0xae, 0x57, 0x6e, 0xcd, 0x6f, 0x37, + 0x64, 0x77, 0x76, 0xf8, 0xef, 0xda, 0xbc, 0xfa, 0x6e, 0x8d, 0x3f, 0xcb, + 0x26, 0x1b, 0xa6, 0x52, 0xc8, 0xef, 0xcb, 0x1f, 0x3e, 0x6f, 0x9e, 0xa8, + 0x67, 0x59, 0x62, 0x03, 0x39, 0xfc, 0x77, 0x66, 0x4f, 0x1f, 0xe1, 0xef, + 0xc4, 0x3b, 0x73, 0x69, 0x34, 0xbc, 0x7c, 0x67, 0xf1, 0xb2, 0xa7, 0x27, + 0xf1, 0x72, 0x2c, 0x74, 0x99, 0x7d, 0x67, 0xf1, 0x16, 0x17, 0x6a, 0x29, + 0x3d, 0xbd, 0xa1, 0xc0, 0x6f, 0x21, 0xb4, 0x3e, 0x5f, 0xbe, 0x6b, 0xfb, + 0xa5, 0xea, 0x63, 0xa0, 0xf9, 0xdb, 0x9b, 0x4f, 0xf3, 0x02, 0x9a, 0x35, + 0x28, 0xc7, 0x17, 0xbf, 0xf9, 0x75, 0x8d, 0x03, 0xbb, 0x2b, 0xc5, 0x35, + 0x81, 0xfa, 0x89, 0x73, 0xd8, 0xde, 0x79, 0xb2, 0xd0, 0xf7, 0x84, 0x50, + 0x25, 0x8b, 0x30, 0x0c, 0x7f, 0xfe, 0xf9, 0xfd, 0xdb, 0x33, 0x5f, 0x7b, + 0xf7, 0xab, 0x6e, 0x9c, 0xa6, 0x9d, 0xf6, 0x4f, 0xa8, 0xee, 0x2f, 0xa9, + 0xbf, 0x78, 0x09, 0xec, 0xf6, 0x4e, 0xec, 0x87, 0x2d, 0x3d, 0xbd, 0x78, + 0x7b, 0x6f, 0xef, 0x79, 0x5f, 0xfe, 0x37, 0x4f, 0x57, 0xdf, 0x55, 0x7c, + 0xb7, 0x61, 0x7f, 0x10, 0x37, 0x3f, 0x9f, 0xa6, 0x17, 0x8f, 0x7f, 0x7c, + 0xda, 0xe8, 0xe3, 0xe4, 0xdc, 0x0e, 0xe6, 0xfc, 0x39, 0x2f, 0x7e, 0x7c, + 0xda, 0x5d, 0xda, 0xf3, 0xbb, 0xf8, 0xe4, 0xdf, 0xdf, 0xd7, 0xfe, 0xf1, + 0xf9, 0x85, 0xd6, 0x5b, 0x41, 0xff, 0x67, 0xe4, 0xc7, 0xe9, 0xa8, 0xd0, + 0x38, 0x6b, 0xb3, 0xe7, 0x0b, 0xf7, 0xae, 0x6e, 0x14, 0xfd, 0x17, 0x14, + 0xf9, 0x8e, 0x77, 0xfb, 0x74, 0xdb, 0x1a, 0xbb, 0x71, 0xdc, 0xdb, 0x2b, + 0x93, 0x3f, 0xbf, 0x81, 0xc1, 0x18, 0x52, 0xa7, 0xae, 0x7f, 0x7e, 0xf3, + 0xe1, 0x36, 0x03, 0x1f, 0xbd, 0x30, 0xf8, 0xe6, 0x69, 0x5c, 0xd3, 0x01, + 0x20, 0x2f, 0xca, 0xbf, 0x7b, 0x21, 0xf2, 0xe9, 0xfe, 0xa7, 0x25, 0xa6, + 0xb7, 0x61, 0xdf, 0xdd, 0x04, 0xb7, 0xeb, 0x2e, 0x7c, 0xf7, 0xe5, 0xb6, + 0x3b, 0x4c, 0x1d, 0x17, 0xf9, 0xcf, 0x6f, 0x90, 0xb7, 0xf0, 0x9b, 0x17, + 0xd7, 0xef, 0xbb, 0x70, 0xbf, 0xf9, 0xfc, 0x2e, 0xdc, 0x2f, 0x0b, 0x3f, + 0xef, 0xc7, 0xfd, 0x06, 0xfe, 0x11, 0xfe, 0x11, 0xa5, 0xf1, 0x1f, 0x19, + 0xe6, 0xe5, 0xed, 0x8f, 0x88, 0xb9, 0xbf, 0x9a, 0xfb, 0xbe, 0xc0, 0xdf, + 0x5e, 0x14, 0xfd, 0xaf, 0x69, 0x5f, 0x9d, 0x17, 0xdf, 0x1f, 0xee, 0x3b, + 0x74, 0x57, 0x2d, 0x60, 0xe7, 0x9b, 0xe9, 0xd4, 0xc5, 0xc2, 0xf3, 0xde, + 0x7c, 0x70, 0xff, 0x94, 0xc6, 0xe5, 0x97, 0xee, 0xdf, 0xb6, 0xfc, 0x7e, + 0xf3, 0xff, 0xc2, 0xc8, 0xf4, 0xf7, 0xc3, 0x5b, 0xde, 0xcf, 0x6f, 0x96, + 0x28, 0x8d, 0xbd, 0xc5, 0x49, 0xe2, 0x81, 0xa1, 0xde, 0x32, 0x34, 0x29, + 0xdf, 0x76, 0xfc, 0xbd, 0x5f, 0xea, 0xee, 0x97, 0xae, 0x2f, 0xeb, 0x40, + 0x7f, 0x0c, 0xad, 0xb7, 0xcd, 0xc9, 0x5f, 0xa1, 0x95, 0x82, 0xdf, 0xc2, + 0x24, 0xfa, 0x40, 0x11, 0x6f, 0x61, 0xda, 0x24, 0xe1, 0xb7, 0xb7, 0xfd, + 0xa4, 0x11, 0xea, 0x2d, 0x8c, 0x77, 0x08, 0xb8, 0x45, 0x31, 0x27, 0xf8, + 0x01, 0x7d, 0x4b, 0xc2, 0xf8, 0x23, 0xf8, 0x49, 0xdd, 0x36, 0x67, 0x7c, + 0x04, 0x3f, 0x28, 0xe2, 0xf6, 0x31, 0x7a, 0x44, 0xe1, 0xb7, 0x04, 0xca, + 0x9c, 0x1e, 0x71, 0x30, 0x30, 0xec, 0xb6, 0xcd, 0x23, 0x8e, 0x81, 0x2f, + 0x28, 0x76, 0xff, 0x44, 0xbf, 0x45, 0x19, 0xba, 0x7b, 0x9c, 0x36, 0x85, + 0xc4, 0x4e, 0xf0, 0xd4, 0x06, 0x49, 0x3f, 0x20, 0xe0, 0x0b, 0x0d, 0x0a, + 0xd1, 0x24, 0xf6, 0x00, 0x7e, 0x3e, 0x7d, 0x8c, 0x40, 0x53, 0x0c, 0x43, + 0x9c, 0x40, 0x19, 0x1a, 0xbf, 0x6d, 0xfd, 0x88, 0x4c, 0x3b, 0x85, 0xbf, + 0xc5, 0x19, 0xf4, 0xe9, 0x33, 0xfe, 0x16, 0xa7, 0x51, 0x13, 0xa3, 0x41, + 0xe9, 0xe8, 0x46, 0xa2, 0x89, 0x52, 0x6f, 0xc9, 0xa9, 0x5d, 0x0a, 0x5c, + 0xa2, 0xa6, 0x6e, 0xc9, 0x47, 0x84, 0x78, 0xcb, 0x80, 0xde, 0x11, 0xec, + 0x2d, 0x8c, 0x31, 0x4f, 0xdf, 0x64, 0x14, 0x45, 0xde, 0x22, 0x80, 0x4a, + 0xea, 0x2d, 0x06, 0x33, 0xd3, 0x3e, 0x8f, 0xc4, 0x34, 0xa4, 0x87, 0x89, + 0x4e, 0xe2, 0xf9, 0x0b, 0x02, 0x3a, 0x26, 0xa6, 0xcd, 0x65, 0xdf, 0x62, + 0x34, 0x05, 0x46, 0x4d, 0xbe, 0x25, 0x60, 0xfa, 0x46, 0x1f, 0xf6, 0x30, + 0xb5, 0x46, 0xde, 0xb6, 0x2d, 0x9f, 0x36, 0x35, 0xbe, 0x7d, 0x89, 0x00, + 0x1d, 0x38, 0x75, 0x22, 0x41, 0x5d, 0x72, 0xda, 0x1e, 0x04, 0x7b, 0x4b, + 0xd0, 0x14, 0x18, 0x34, 0x0d, 0x63, 0xcf, 0x5f, 0x40, 0x71, 0x0a, 0xc3, + 0xaf, 0x4b, 0x84, 0x81, 0x01, 0xe5, 0x34, 0x18, 0x05, 0x41, 0xa2, 0x32, + 0xa8, 0x81, 0x50, 0x1a, 0x68, 0x9d, 0x06, 0x2a, 0x02, 0x58, 0x81, 0x44, + 0x08, 0xd0, 0x0e, 0x06, 0x49, 0x1f, 0xdf, 0xc2, 0x30, 0x35, 0x6d, 0x92, + 0x8e, 0xe1, 0xf4, 0x17, 0x54, 0x64, 0x7a, 0xf1, 0xf9, 0x03, 0x39, 0xbe, + 0x7b, 0x5b, 0xff, 0xe7, 0x37, 0xb7, 0x8f, 0xa9, 0xd3, 0xf8, 0x7f, 0x9d, + 0xf6, 0xa1, 0x25, 0xa8, 0x07, 0x1a, 0x74, 0x40, 0xfc, 0xf0, 0xcd, 0xea, + 0xfb, 0x62, 0x7b, 0x8f, 0x9f, 0xdf, 0xfc, 0x85, 0xcd, 0xea, 0x78, 0x53, + 0x15, 0x8f, 0x5c, 0x91, 0x7a, 0x4a, 0x33, 0x9d, 0xf0, 0xf2, 0x97, 0x57, + 0x8a, 0x4f, 0x9b, 0x7d, 0xfc, 0xfc, 0x86, 0x01, 0x63, 0x45, 0x3f, 0x6a, + 0xed, 0xc3, 0xbd, 0x3c, 0x7e, 0x7e, 0xf3, 0xf8, 0x81, 0x09, 0xff, 0xed, + 0x83, 0xb2, 0x12, 0x67, 0xbc, 0x1c, 0x24, 0x34, 0x8d, 0xf2, 0x83, 0x61, + 0x87, 0x1f, 0x96, 0xff, 0xd4, 0x52, 0xbe, 0x6e, 0x2b, 0x5f, 0xb7, 0x96, + 0x2f, 0x32, 0xe7, 0x6e, 0x31, 0x04, 0x10, 0x10, 0x83, 0x3d, 0x1b, 0x37, + 0x06, 0x4f, 0x86, 0x8d, 0xbf, 0x33, 0x71, 0xfc, 0x35, 0x13, 0xff, 0x48, + 0x82, 0x7f, 0x77, 0xe2, 0x45, 0x51, 0x7c, 0x95, 0x72, 0x0a, 0xa8, 0x25, + 0x4a, 0x7e, 0xa3, 0xad, 0x93, 0xcc, 0x67, 0x8c, 0x9d, 0xbe, 0x1b, 0x3b, + 0xfe, 0x2b, 0x8c, 0x9d, 0xfa, 0xa2, 0xb1, 0x63, 0x4f, 0xc6, 0x4e, 0xbd, + 0x30, 0x76, 0xea, 0xd7, 0x1b, 0x3b, 0xfd, 0xf4, 0x2d, 0x7a, 0xc4, 0x80, + 0x15, 0x62, 0xd8, 0xcd, 0xda, 0x91, 0x67, 0x63, 0x27, 0x5e, 0x1a, 0x3b, + 0xf1, 0x05, 0x63, 0xc7, 0x3f, 0x6f, 0xec, 0xc8, 0x87, 0xd6, 0x4e, 0xbe, + 0xb4, 0x76, 0xf2, 0x9d, 0xb5, 0xe3, 0x0c, 0xb0, 0x66, 0x02, 0x7b, 0xb2, + 0x76, 0x6c, 0xe2, 0x2c, 0x3d, 0xd9, 0x36, 0x86, 0x3e, 0xdc, 0x6d, 0xfb, + 0xa5, 0xbd, 0x93, 0xaf, 0xd9, 0xfb, 0xa7, 0xfa, 0xf2, 0x89, 0xcd, 0x7f, + 0xc6, 0xea, 0xb1, 0x69, 0x78, 0x28, 0xf2, 0xaa, 0xd9, 0x7f, 0x45, 0xb7, + 0x7f, 0xa5, 0xe9, 0x7f, 0xd5, 0xf8, 0xbf, 0x66, 0xfe, 0x1f, 0x3b, 0x80, + 0x8f, 0x5d, 0xc0, 0xab, 0x4e, 0x00, 0x7a, 0xe1, 0x05, 0xfe, 0x6b, 0x82, + 0x0c, 0x2f, 0xbe, 0xde, 0x37, 0x24, 0x79, 0x51, 0xfa, 0x76, 0x7a, 0xda, + 0x7d, 0x63, 0xa3, 0x69, 0x07, 0xb2, 0xdb, 0xb6, 0x08, 0x9f, 0xc1, 0x10, + 0x4f, 0x27, 0x77, 0x7f, 0x72, 0x6c, 0xed, 0xf3, 0xb6, 0x4b, 0x2f, 0xab, + 0xdd, 0x0f, 0xda, 0x7a, 0x15, 0x6a, 0xdc, 0x36, 0xdf, 0x7a, 0x41, 0xe0, + 0xbd, 0xad, 0x6f, 0xa6, 0xf1, 0x69, 0x1b, 0x90, 0xdf, 0x4d, 0xe3, 0x4b, + 0x92, 0x9e, 0xda, 0xfc, 0xe5, 0x04, 0x00, 0x6b, 0xe5, 0xfc, 0x76, 0xda, + 0x80, 0xee, 0x00, 0x61, 0xd6, 0xdf, 0x95, 0x36, 0x37, 0x6d, 0xab, 0x5f, + 0x5e, 0x74, 0xf9, 0xab, 0x89, 0x7a, 0x71, 0xb2, 0xd7, 0x77, 0x25, 0xac, + 0x69, 0x73, 0xff, 0xb7, 0x53, 0x05, 0x00, 0xbd, 0x9f, 0x16, 0x25, 0xc0, + 0xcf, 0xbf, 0x5f, 0xd9, 0xee, 0xdb, 0xc7, 0xbd, 0x4a, 0xe4, 0xbb, 0x6e, + 0x7e, 0xc9, 0x0a, 0xef, 0x77, 0x90, 0x5b, 0x8f, 0x75, 0xe3, 0x67, 0xdf, + 0x57, 0xb0, 0x45, 0xfa, 0x79, 0x33, 0xf8, 0x2f, 0x08, 0x64, 0x13, 0x9f, + 0xcb, 0x2c, 0xee, 0x67, 0x34, 0x7d, 0x90, 0x5b, 0xdc, 0xe9, 0x7c, 0x78, + 0xde, 0x48, 0xf0, 0x6e, 0xc6, 0x1f, 0x78, 0x85, 0x77, 0xa7, 0x6c, 0xbe, + 0x68, 0xe8, 0xf9, 0xda, 0x9b, 0x87, 0x5b, 0x52, 0x07, 0x6a, 0xbe, 0x38, + 0xd2, 0x72, 0x3a, 0x05, 0xf6, 0xcd, 0x47, 0x2e, 0xf6, 0xe9, 0x30, 0xc4, + 0x57, 0x9a, 0x78, 0x77, 0x50, 0xe2, 0xe7, 0x8f, 0x96, 0x7c, 0xf3, 0xb1, + 0x2f, 0xfb, 0x78, 0x5c, 0x37, 0x5e, 0xfd, 0xcd, 0xa9, 0x4b, 0x30, 0x9a, + 0x5f, 0xaa, 0x69, 0xd7, 0xc6, 0x0f, 0xd8, 0xf0, 0xb2, 0xda, 0xdf, 0xf4, + 0x77, 0x87, 0xcd, 0xbd, 0x52, 0xe6, 0xbf, 0xa0, 0x7b, 0xbf, 0x1f, 0x5d, + 0xfd, 0x7f, 0x1e, 0x1f, 0xa7, 0x0d, 0xe6, 0x9a, 0x26, 0x06, 0x1e, 0x37, + 0x0e, 0xf3, 0x69, 0xeb, 0xc0, 0xc7, 0xc7, 0x8f, 0x0a, 0xb5, 0xe9, 0xc7, + 0x69, 0xe1, 0xa7, 0x74, 0xa7, 0xf1, 0xdf, 0xf8, 0xa8, 0x28, 0x6a, 0xff, + 0xc1, 0xc9, 0x1f, 0x9e, 0xf6, 0x82, 0x79, 0x71, 0xfa, 0x5d, 0x50, 0x15, + 0xd9, 0x43, 0x13, 0x01, 0x21, 0x3c, 0x3c, 0x89, 0xe2, 0x2d, 0xa0, 0x28, + 0x7e, 0xad, 0x99, 0x63, 0xd1, 0x56, 0x0f, 0xf7, 0x8d, 0x2d, 0xa7, 0x9a, + 0x3d, 0x08, 0x3e, 0x0f, 0x4e, 0x5a, 0x17, 0x0f, 0xae, 0x3f, 0xe5, 0xc2, + 0x1e, 0x08, 0x20, 0xe0, 0x7e, 0xe3, 0x54, 0x4d, 0x5b, 0xbe, 0x05, 0xd1, + 0x96, 0x86, 0xa7, 0xf7, 0x9e, 0x1f, 0xe2, 0x1a, 0xf4, 0x77, 0x2a, 0x32, + 0xa0, 0x66, 0xde, 0x53, 0xa1, 0xd5, 0xce, 0xe0, 0x1f, 0x6a, 0xd0, 0x1c, + 0xb0, 0xf3, 0x1f, 0xef, 0x25, 0x11, 0x18, 0xc5, 0x6f, 0xf7, 0x36, 0xac, + 0xf6, 0xf6, 0xe3, 0xce, 0x3f, 0x43, 0xd0, 0x1e, 0x10, 0x0d, 0x48, 0xbf, + 0x6d, 0x5b, 0x77, 0x9a, 0x4e, 0x95, 0xdf, 0x3c, 0x29, 0xd3, 0x43, 0x51, + 0xde, 0x48, 0x6c, 0x8a, 0x87, 0xfb, 0x71, 0x91, 0x80, 0xc4, 0xa6, 0xf7, + 0xfd, 0xfc, 0x56, 0xbc, 0xe9, 0x8b, 0xdb, 0x41, 0xb0, 0xd3, 0x5e, 0x9b, + 0x20, 0x07, 0x4f, 0xc7, 0x87, 0xbf, 0x6e, 0x5e, 0x1e, 0x8f, 0xe8, 0xb8, + 0x3f, 0x7c, 0x95, 0x80, 0xff, 0x82, 0xda, 0xf4, 0xa3, 0x2b, 0x1f, 0x29, + 0xc8, 0x7b, 0x1e, 0x7f, 0x2a, 0x93, 0x4f, 0xec, 0xf7, 0x5b, 0xcc, 0xf4, + 0x45, 0x83, 0x9f, 0xd4, 0xbc, 0xa7, 0xcd, 0xb7, 0x4d, 0x2f, 0x81, 0xfd, + 0x7f, 0xf1, 0xfe, 0xe3, 0x7d, 0xaf, 0x9b, 0x69, 0xf2, 0xe2, 0xf5, 0x72, + 0x00, 0x95, 0x9e, 0x92, 0x9f, 0xdf, 0xdc, 0x77, 0xd4, 0x7b, 0xbd, 0x08, + 0xd0, 0x01, 0x20, 0xcd, 0xe6, 0xf1, 0xb6, 0x55, 0xc9, 0x9d, 0x3e, 0x84, + 0x41, 0x27, 0x21, 0xd2, 0xf0, 0xeb, 0x35, 0x80, 0x13, 0x78, 0x67, 0xec, + 0x1f, 0x97, 0xf8, 0xdb, 0x27, 0x35, 0xa6, 0xc6, 0x80, 0xa3, 0x28, 0x9d, + 0xfc, 0x6f, 0xb7, 0x36, 0x01, 0x32, 0x98, 0x3e, 0x7f, 0x22, 0x95, 0x8f, + 0x1d, 0xe3, 0x1f, 0xc2, 0xde, 0xf2, 0x1f, 0xc2, 0xde, 0x67, 0x1b, 0xf9, + 0x2e, 0xec, 0x05, 0x8d, 0xbd, 0x67, 0x2f, 0x8a, 0xff, 0xa9, 0xd8, 0x1b, + 0xfc, 0xc3, 0xd8, 0x0b, 0x9c, 0xd5, 0xf7, 0xe6, 0x2e, 0x68, 0xf2, 0x4f, + 0xc5, 0xdc, 0xf0, 0x1f, 0xc6, 0x5c, 0x0a, 0xfd, 0xee, 0xcc, 0x05, 0x4d, + 0xfe, 0xa9, 0x98, 0x1b, 0xfd, 0x23, 0x98, 0x0b, 0x98, 0x30, 0xe0, 0xdf, + 0xc7, 0xeb, 0x82, 0x66, 0xca, 0x07, 0x82, 0x22, 0xcb, 0xdf, 0xc9, 0xce, + 0x0f, 0x98, 0xa2, 0xfd, 0x5d, 0x99, 0xf2, 0xad, 0x92, 0xfb, 0xcc, 0xe5, + 0xc7, 0xc7, 0xfb, 0xf1, 0x99, 0x0f, 0xaf, 0x6e, 0x30, 0xfa, 0xed, 0x0a, + 0x4e, 0x24, 0xf2, 0xd5, 0x98, 0xa6, 0xf3, 0xe7, 0x45, 0x9f, 0x7f, 0x0f, + 0x51, 0xbc, 0x8e, 0x36, 0x9b, 0xee, 0x55, 0x8c, 0xf9, 0x84, 0x32, 0x11, + 0x42, 0x95, 0xaf, 0xaf, 0x83, 0xd0, 0xdf, 0x23, 0x40, 0xf5, 0x5b, 0x04, + 0xe8, 0x9c, 0x3e, 0x6f, 0x1f, 0xff, 0x23, 0x44, 0x68, 0xdc, 0xc0, 0xe8, + 0x06, 0x90, 0xb2, 0x8b, 0xaa, 0xa2, 0x0d, 0xa3, 0xbf, 0x9f, 0x14, 0xeb, + 0xde, 0x29, 0x7f, 0x99, 0x70, 0x67, 0xfd, 0x05, 0x69, 0x7e, 0xca, 0x96, + 0x0f, 0x07, 0x5d, 0x82, 0xbb, 0x8f, 0xcd, 0x13, 0xa9, 0x9f, 0x36, 0xf1, + 0xf0, 0x30, 0x0d, 0xe5, 0xe1, 0x69, 0x2c, 0x9f, 0xf6, 0xf0, 0xed, 0x5a, + 0xf2, 0x49, 0xd1, 0xff, 0x82, 0x9e, 0x33, 0xa6, 0x6f, 0x4e, 0xd9, 0x1e, + 0x5e, 0x4b, 0xf2, 0xfe, 0xa0, 0x0c, 0xed, 0x36, 0x83, 0xf3, 0xf9, 0xd4, + 0xec, 0x29, 0x63, 0xf8, 0xc7, 0xe4, 0x65, 0x4a, 0xf0, 0x30, 0x16, 0xed, + 0x43, 0xef, 0xe4, 0xcd, 0x2d, 0x55, 0x71, 0x3a, 0x7f, 0xba, 0x50, 0x3d, + 0x9c, 0xda, 0x1a, 0xa4, 0x27, 0xf1, 0xf5, 0x76, 0x18, 0x00, 0xc8, 0x90, + 0x82, 0xb8, 0xaa, 0x9b, 0xa7, 0xd4, 0xeb, 0xc1, 0x79, 0xa8, 0xd3, 0xa2, + 0xb9, 0xe5, 0x4a, 0xb7, 0xc2, 0xb9, 0xdf, 0x3f, 0x31, 0xf8, 0xc7, 0x29, + 0xbd, 0xc9, 0xef, 0xed, 0x80, 0xf6, 0x40, 0x81, 0xe9, 0xa4, 0xdd, 0xe7, + 0x14, 0xcf, 0x69, 0x6e, 0x15, 0x3f, 0x9b, 0xde, 0x19, 0xf7, 0xcc, 0x2e, + 0x0f, 0x9f, 0x7b, 0xb8, 0xe5, 0x76, 0x99, 0x93, 0x80, 0x9c, 0x28, 0x6e, + 0x6e, 0x99, 0xd3, 0xd4, 0xd5, 0x53, 0x82, 0xf7, 0xd4, 0xe5, 0xdb, 0xdf, + 0x92, 0x1a, 0x3d, 0xab, 0xc3, 0x7d, 0xda, 0x02, 0x74, 0xf5, 0x18, 0x35, + 0x59, 0xfa, 0xb7, 0xd7, 0x84, 0xf0, 0x51, 0xcd, 0x69, 0x13, 0xef, 0xef, + 0x94, 0x4e, 0x3d, 0xcd, 0xa3, 0x3d, 0x7e, 0xce, 0x75, 0x7d, 0x34, 0x2b, + 0xf8, 0x15, 0xff, 0xa1, 0x01, 0x46, 0xf3, 0x37, 0xa9, 0x6d, 0x5e, 0x75, + 0x0e, 0x5f, 0x77, 0x1f, 0x0f, 0x0f, 0x45, 0xfe, 0xe4, 0x2a, 0x27, 0xa9, + 0xdd, 0x9b, 0xf9, 0xeb, 0x0f, 0xbf, 0xd5, 0xcb, 0x4c, 0xbb, 0xd2, 0xfe, + 0xe2, 0x54, 0x55, 0xd1, 0x7f, 0x29, 0x66, 0xdc, 0xf4, 0xe3, 0x4e, 0xcf, + 0x77, 0x89, 0x1c, 0xbf, 0x86, 0xe5, 0xdf, 0xea, 0xb1, 0xdf, 0xb1, 0x65, + 0xd2, 0xeb, 0xcf, 0xb1, 0xe5, 0x33, 0xf2, 0xfa, 0x56, 0x6e, 0x05, 0xb1, + 0x3b, 0x4d, 0xbb, 0x39, 0x79, 0xeb, 0xa4, 0xbf, 0x4c, 0xb3, 0x15, 0x95, + 0xf7, 0x25, 0xb6, 0xdd, 0x2c, 0xec, 0x57, 0xb3, 0xed, 0x9b, 0x5c, 0x29, + 0x40, 0xb4, 0xf7, 0xf9, 0x95, 0xbf, 0xfd, 0xdb, 0xe7, 0xa6, 0xcc, 0x9e, + 0x67, 0x95, 0x9f, 0xe6, 0x12, 0xbf, 0x7d, 0xe6, 0xec, 0x1f, 0xe0, 0x7e, + 0x7b, 0xf7, 0x97, 0xba, 0xcd, 0xf3, 0xf1, 0xf3, 0x1e, 0x98, 0x9d, 0xf3, + 0x0f, 0x92, 0x13, 0xe7, 0x0f, 0x7f, 0x75, 0x6f, 0xfb, 0x79, 0xe7, 0xd3, + 0x29, 0x18, 0xff, 0x18, 0x7f, 0x7c, 0x23, 0x63, 0x06, 0x3d, 0x3e, 0x38, + 0xde, 0x74, 0xce, 0x7a, 0x7d, 0xf3, 0x79, 0xe1, 0x74, 0x71, 0x72, 0xb6, + 0xd3, 0x97, 0x53, 0x5b, 0x55, 0xc0, 0xf2, 0xd3, 0xf1, 0xe6, 0x59, 0x7d, + 0xef, 0xf7, 0x78, 0xc1, 0xdb, 0x11, 0x05, 0xaf, 0x9f, 0x45, 0xf0, 0xe6, + 0x37, 0x21, 0xb5, 0xe2, 0xbb, 0x40, 0xed, 0xca, 0x2f, 0x7d, 0xa7, 0x79, + 0xf3, 0xdb, 0x4c, 0xfb, 0xb7, 0x7a, 0xab, 0xca, 0xcf, 0x8a, 0xce, 0xff, + 0xe5, 0x14, 0x57, 0xa7, 0xd4, 0xff, 0xa5, 0x68, 0x9b, 0x69, 0x0b, 0xf6, + 0x2f, 0x59, 0xe0, 0x24, 0x95, 0xef, 0x8f, 0x75, 0xf3, 0xff, 0xb9, 0x1c, + 0x74, 0x3c, 0xef, 0x1f, 0xce, 0xbe, 0xdd, 0xdf, 0x39, 0x55, 0x98, 0x8a, + 0x34, 0x45, 0x18, 0x4e, 0x41, 0xd4, 0xf1, 0x4e, 0x6c, 0xdb, 0x14, 0x93, + 0xc9, 0xfe, 0x46, 0x4e, 0x7f, 0x5b, 0xfc, 0xf9, 0x56, 0xfe, 0xbf, 0x77, + 0x5e, 0xbf, 0x4c, 0x73, 0xcb, 0x5f, 0x62, 0xfe, 0x44, 0xf7, 0xcd, 0xe5, + 0xfd, 0xd1, 0x30, 0xfc, 0xe5, 0xc9, 0x04, 0xbf, 0x3e, 0x18, 0x7c, 0xa3, + 0xc7, 0xff, 0xf0, 0xf9, 0xe4, 0x17, 0x90, 0x77, 0x7c, 0x9a, 0x8e, 0xb9, + 0x79, 0xe0, 0xef, 0xe5, 0xbf, 0xdd, 0xe3, 0xff, 0xdd, 0x21, 0xe1, 0xbb, + 0x67, 0x61, 0xbf, 0x26, 0xa7, 0x7c, 0xc6, 0x36, 0x89, 0x3f, 0x02, 0x00, + 0xe7, 0x07, 0xdf, 0x90, 0x1e, 0x82, 0xa2, 0x6e, 0xe1, 0x54, 0xde, 0x1d, + 0xa6, 0xdd, 0x4e, 0x95, 0xf9, 0x23, 0xe0, 0xd7, 0xef, 0x1f, 0x5e, 0x5b, + 0xfe, 0xea, 0xc1, 0xb5, 0xe5, 0xff, 0x8c, 0xa1, 0xdd, 0xac, 0xf8, 0x57, + 0x8f, 0xee, 0x56, 0xeb, 0xb7, 0xd9, 0xf1, 0x77, 0xc1, 0x05, 0xbf, 0x92, + 0x3b, 0x6f, 0xa6, 0x63, 0x2b, 0xa6, 0x45, 0xab, 0xde, 0xa7, 0x23, 0xab, + 0x41, 0xf4, 0x88, 0x7e, 0xe9, 0xfd, 0xfa, 0x7f, 0x88, 0x2e, 0x7a, 0xaf, + 0xcc, 0xb8, 0x7d, 0x55, 0x5e, 0x53, 0xa5, 0x5f, 0x37, 0xbc, 0xef, 0xce, + 0x61, 0xdf, 0xa9, 0xbf, 0xab, 0xc6, 0x7c, 0x5f, 0x17, 0xf8, 0x65, 0xc6, + 0x37, 0x40, 0x31, 0xfd, 0xe6, 0xe7, 0x37, 0x13, 0x66, 0xfb, 0xce, 0x89, + 0x58, 0x51, 0xfa, 0xf9, 0x2f, 0x7d, 0xdc, 0x44, 0x5f, 0x0a, 0xa0, 0x53, + 0xbf, 0x7f, 0x5c, 0xba, 0xfa, 0x6d, 0xbc, 0xb8, 0xad, 0xe6, 0xfe, 0xad, + 0xe0, 0xe1, 0x5a, 0x14, 0xd9, 0x04, 0xdb, 0x40, 0x06, 0x5a, 0x7e, 0x31, + 0xef, 0x9c, 0x3a, 0xf9, 0xb3, 0x8d, 0xfc, 0x7e, 0x06, 0x4c, 0xfd, 0x5b, + 0xc7, 0x7e, 0xaa, 0x8a, 0xf2, 0x97, 0xa0, 0xf2, 0xbf, 0x88, 0x57, 0x9f, + 0xfa, 0xf8, 0x47, 0x02, 0xa6, 0x77, 0x47, 0x39, 0xfd, 0xdf, 0x89, 0x9c, + 0x3e, 0x00, 0xfa, 0xd4, 0x77, 0x02, 0xfa, 0xbf, 0x2b, 0x53, 0xfa, 0x95, + 0xb1, 0xe3, 0x8f, 0xc0, 0x5f, 0x1f, 0x30, 0xe9, 0x3f, 0xfe, 0x19, 0x99, + 0xd4, 0x7e, 0xd7, 0x87, 0x83, 0xe4, 0x3f, 0x23, 0x8b, 0xfe, 0x67, 0x80, + 0xc1, 0x37, 0x4f, 0x71, 0xfa, 0xcf, 0x19, 0x98, 0x3f, 0xd0, 0x12, 0xe8, + 0x9f, 0x51, 0x4b, 0xfe, 0x07, 0x42, 0xd0, 0xbf, 0x53, 0x30, 0x89, 0xfe, + 0x15, 0x4c, 0xbe, 0xce, 0x24, 0xfc, 0x5f, 0xc1, 0xe4, 0x6b, 0x2c, 0xba, + 0xfe, 0x2b, 0x98, 0x7c, 0x8b, 0x91, 0xfe, 0x29, 0xa2, 0xc9, 0x1f, 0x9f, + 0xf0, 0x7c, 0xa0, 0x2a, 0xc4, 0xbf, 0x22, 0xca, 0x3f, 0xd7, 0xa4, 0xc6, + 0x07, 0xd2, 0xe5, 0xfe, 0xf1, 0x4f, 0x71, 0xfe, 0xec, 0xe1, 0x84, 0xff, + 0xe7, 0x63, 0xd1, 0xf7, 0x0d, 0x26, 0xec, 0x3f, 0x1f, 0x83, 0xfe, 0xe1, + 0xa1, 0xe4, 0x1f, 0x30, 0x09, 0xf5, 0x3b, 0x67, 0x23, 0xff, 0x4e, 0x73, + 0x53, 0xdf, 0xa8, 0x83, 0xf3, 0x7f, 0x3e, 0x1d, 0xfc, 0x1f, 0x1d, 0xa3, + 0x5e, 0xce, 0x20, 0xfe, 0xdb, 0x47, 0x4b, 0x50, 0xbe, 0x3c, 0x8f, 0xf8, + 0x3c, 0x87, 0xf8, 0xf8, 0xcf, 0x34, 0x85, 0xf8, 0x59, 0xc4, 0x78, 0x37, + 0xb9, 0x57, 0x04, 0xe7, 0xc5, 0xd5, 0x7d, 0x21, 0xd3, 0x9b, 0x7f, 0xf0, + 0xac, 0xc3, 0x8b, 0xbe, 0x9e, 0x15, 0xf4, 0x33, 0x24, 0xbd, 0xb6, 0xb4, + 0xf6, 0x73, 0xc6, 0xfb, 0x2d, 0xd3, 0xa4, 0xbf, 0x0e, 0x6a, 0x7e, 0xa3, + 0x29, 0x7f, 0xde, 0x9c, 0x7f, 0xcd, 0xa3, 0xb5, 0xd7, 0xcc, 0xf7, 0xdb, + 0xa0, 0xc8, 0x97, 0x78, 0xfd, 0xab, 0x18, 0xf6, 0x1f, 0xff, 0x8c, 0x0c, + 0xfb, 0x04, 0x98, 0x7c, 0x37, 0x76, 0x91, 0xff, 0x8c, 0xec, 0x7a, 0x0d, + 0xa6, 0x7c, 0x99, 0x63, 0xaf, 0xc1, 0x95, 0xd7, 0x5c, 0xca, 0x37, 0x20, + 0x95, 0xaf, 0x07, 0x9e, 0xaf, 0x05, 0x99, 0x2f, 0x3e, 0x43, 0xff, 0x6e, + 0x92, 0x87, 0xfe, 0x19, 0x25, 0xff, 0x0a, 0x38, 0xf8, 0x46, 0x86, 0xfd, + 0x6e, 0x59, 0xbd, 0x02, 0x0a, 0xbe, 0x49, 0xe7, 0xbe, 0x7a, 0xf1, 0x2b, + 0x89, 0xee, 0xaf, 0x98, 0x75, 0x79, 0x1f, 0x3c, 0xff, 0x3c, 0x73, 0x2d, + 0x7f, 0x50, 0x1c, 0x8d, 0xfe, 0x15, 0x47, 0x7f, 0x1d, 0xc3, 0xf0, 0x7f, + 0xc5, 0xd1, 0x5f, 0xc3, 0xae, 0xeb, 0xbf, 0xe2, 0xe8, 0xff, 0xa5, 0x71, + 0x94, 0xf8, 0x57, 0x1c, 0xfd, 0x57, 0x1c, 0xfd, 0x87, 0x4f, 0x06, 0xfd, + 0x41, 0x61, 0x94, 0xfb, 0x56, 0x65, 0x7f, 0x7d, 0x4e, 0xe9, 0xff, 0xb6, + 0x20, 0xca, 0xff, 0xf3, 0xb1, 0xeb, 0xef, 0x17, 0x42, 0xd9, 0x7f, 0x3e, + 0x66, 0xfd, 0x2b, 0x80, 0x7e, 0x83, 0xdc, 0xe7, 0xff, 0x7c, 0x72, 0xff, + 0xbf, 0x22, 0x7c, 0xbe, 0x98, 0xcb, 0xfe, 0xe0, 0x75, 0xc9, 0x6f, 0x78, + 0xfd, 0xf4, 0x79, 0xe3, 0xc0, 0x5f, 0xfb, 0xfa, 0xe9, 0xc3, 0x73, 0xc5, + 0x7f, 0xc0, 0x6b, 0xa8, 0x4f, 0x1b, 0x13, 0x7e, 0x7e, 0x42, 0x5c, 0xbc, + 0xd3, 0xf6, 0xed, 0x13, 0xe1, 0xdf, 0xf2, 0x4a, 0xe9, 0xb7, 0xbc, 0x9b, + 0xfa, 0xf4, 0xee, 0xfd, 0xc9, 0xc9, 0xa7, 0x77, 0xf6, 0xea, 0x87, 0x22, + 0x4f, 0xc7, 0x87, 0xbe, 0xa8, 0x92, 0x87, 0x69, 0xda, 0xfb, 0x01, 0xc5, + 0xe1, 0xf2, 0x79, 0xa7, 0xb4, 0xb7, 0x0f, 0xbb, 0xc8, 0x9f, 0xde, 0x3c, + 0x2d, 0x92, 0x07, 0x17, 0xd8, 0xf4, 0xbd, 0xc4, 0xf4, 0x5a, 0xaa, 0x06, + 0xaa, 0x3e, 0xdc, 0x87, 0xf0, 0xe0, 0xe7, 0x37, 0x35, 0x7b, 0xfd, 0x35, + 0xff, 0x6f, 0xa7, 0x68, 0xe3, 0x3b, 0xc9, 0x6d, 0x2f, 0x00, 0xc0, 0x7e, + 0xa3, 0xf1, 0xcb, 0x07, 0xdd, 0xaf, 0xcb, 0x22, 0x9f, 0xb6, 0x91, 0x03, + 0x75, 0xea, 0xd6, 0x6d, 0x52, 0xf0, 0x2b, 0x72, 0xaa, 0xd2, 0xcf, 0xa7, + 0x72, 0x4f, 0xc2, 0xbd, 0x95, 0x7f, 0xb1, 0xdd, 0xdb, 0x6f, 0x7a, 0x33, + 0xf6, 0x5b, 0x1e, 0x29, 0xfe, 0x8e, 0xc7, 0x91, 0x5f, 0x72, 0x6f, 0x5f, + 0x9f, 0xbf, 0xff, 0x76, 0xd7, 0xf6, 0x0d, 0x6f, 0x34, 0x7e, 0xf8, 0x4e, + 0x63, 0xfd, 0xac, 0x05, 0xaf, 0x15, 0xfc, 0x8e, 0xef, 0x34, 0xbe, 0xee, + 0x08, 0x5f, 0xb7, 0x9c, 0xb0, 0x72, 0xbc, 0xd8, 0xcf, 0x9b, 0xcf, 0x80, + 0xde, 0xf7, 0x73, 0x47, 0x77, 0xca, 0x3f, 0x87, 0x8d, 0x3f, 0xef, 0xc1, + 0xbe, 0x4d, 0x14, 0xea, 0x1f, 0x20, 0x8a, 0xdf, 0xf8, 0x38, 0xfa, 0xd7, + 0xf3, 0x72, 0xda, 0x4d, 0xf3, 0xcb, 0xfc, 0x8c, 0xa7, 0x63, 0x07, 0xea, + 0xb8, 0x19, 0xff, 0x5e, 0xfc, 0xcc, 0xfe, 0x60, 0xd5, 0xee, 0xbc, 0x7a, + 0x72, 0x52, 0x77, 0x1f, 0xf5, 0x27, 0x52, 0xef, 0xb2, 0xe8, 0xfd, 0xea, + 0x97, 0xcf, 0x6f, 0x12, 0xf3, 0x4e, 0x22, 0x93, 0x76, 0x3f, 0x39, 0xb9, + 0x5f, 0x29, 0x93, 0xcf, 0x06, 0x9d, 0xaf, 0xae, 0x76, 0xfa, 0x66, 0x69, + 0x06, 0xdf, 0x26, 0xcd, 0xcf, 0x4f, 0x62, 0xfc, 0x6a, 0x79, 0x96, 0xf7, + 0xf0, 0xf0, 0x27, 0x92, 0xe4, 0x2d, 0xc4, 0x4f, 0x52, 0x72, 0xaa, 0x2f, + 0x4b, 0xf2, 0x89, 0xf4, 0xbf, 0x97, 0x65, 0x99, 0x7f, 0xb8, 0x2c, 0x6a, + 0x10, 0x9e, 0xff, 0x5c, 0x11, 0xe3, 0x33, 0xaf, 0xb6, 0xbf, 0x0f, 0x17, + 0x13, 0xa0, 0xa8, 0x9e, 0x00, 0xc5, 0xef, 0x37, 0xa7, 0xef, 0xb5, 0xb1, + 0xca, 0xcb, 0xdd, 0xa7, 0xff, 0x27, 0x6c, 0xae, 0x32, 0xed, 0x6a, 0xfd, + 0x79, 0x48, 0x6b, 0x4c, 0x30, 0x2f, 0x0f, 0x7f, 0x05, 0xa6, 0x6d, 0x26, + 0xe4, 0xf8, 0xd1, 0x46, 0x4d, 0xef, 0x18, 0xf2, 0x49, 0x1f, 0x4d, 0xf5, + 0x8a, 0xd0, 0x9a, 0x57, 0xf3, 0x9b, 0x8f, 0xf6, 0xe7, 0x7d, 0x4d, 0x2d, + 0xbe, 0x01, 0x4f, 0xff, 0x2a, 0x0c, 0xfb, 0x1e, 0xc9, 0x2a, 0xc1, 0x33, + 0x26, 0xfe, 0xf1, 0xc1, 0xf3, 0x03, 0xa7, 0x4d, 0x6f, 0xbb, 0x6d, 0xbd, + 0xdb, 0x9f, 0xf8, 0xdd, 0x86, 0xc4, 0xe0, 0xf3, 0x84, 0x5e, 0x3f, 0xd9, + 0x8e, 0xf8, 0x81, 0x80, 0x1f, 0xfe, 0xea, 0x15, 0x00, 0x9c, 0xe7, 0xd3, + 0xae, 0x58, 0x65, 0x09, 0x10, 0xfa, 0x74, 0x8b, 0x42, 0x01, 0x36, 0x87, + 0x1e, 0xa6, 0x0d, 0x6a, 0x9f, 0xb7, 0xc3, 0xaa, 0x7f, 0x78, 0x15, 0x77, + 0xbf, 0x0e, 0x7b, 0xef, 0x57, 0x5f, 0xe3, 0x18, 0x60, 0xe3, 0xd7, 0xdc, + 0x8c, 0xfd, 0x87, 0xb8, 0x99, 0x8f, 0x55, 0xee, 0x8b, 0x9e, 0xe8, 0xf1, + 0xbe, 0xd7, 0x32, 0x00, 0x17, 0x77, 0x71, 0x7f, 0x9b, 0x13, 0xb9, 0xd7, + 0xfd, 0xa5, 0x08, 0x82, 0x6f, 0x62, 0x0e, 0xb8, 0x56, 0xfd, 0x1e, 0x55, + 0x14, 0xdb, 0x34, 0x7d, 0x90, 0xfd, 0xcf, 0xcd, 0xed, 0x7c, 0xbb, 0x72, + 0xfd, 0x0a, 0x8d, 0x9d, 0x12, 0xbc, 0x22, 0x7b, 0xb7, 0xc1, 0xf6, 0x4b, + 0x2d, 0x9c, 0x34, 0xaa, 0xad, 0xa7, 0x04, 0x6a, 0xca, 0xe3, 0x00, 0x36, + 0x8c, 0x41, 0x87, 0x9d, 0x5f, 0xdd, 0x76, 0xa6, 0xfe, 0x74, 0xbb, 0xee, + 0x1f, 0x1f, 0x52, 0xdf, 0xe9, 0xa6, 0xe2, 0xf5, 0xd4, 0xe0, 0x3d, 0x65, + 0xbc, 0x1d, 0x6a, 0xf5, 0x59, 0xbd, 0xbb, 0xf7, 0x6f, 0x4d, 0xa9, 0xe2, + 0x8b, 0xb1, 0xbf, 0x37, 0x89, 0x0f, 0xf6, 0xfe, 0xbe, 0x6f, 0xea, 0x1d, + 0xe7, 0xc0, 0x41, 0x3b, 0xde, 0xc3, 0xed, 0x89, 0xf0, 0x44, 0xe5, 0x74, + 0xce, 0xc4, 0x43, 0x36, 0xf1, 0xa2, 0x08, 0x6e, 0x84, 0xd6, 0xa7, 0x6a, + 0xda, 0x4d, 0x3b, 0xba, 0xb5, 0xf5, 0x95, 0xae, 0xff, 0xba, 0x8b, 0xe2, + 0xfa, 0xc5, 0xce, 0x49, 0xb7, 0x0c, 0xd7, 0x09, 0x02, 0xe0, 0x7a, 0xeb, + 0xfb, 0x4e, 0xcf, 0xc3, 0xcd, 0x86, 0x7e, 0xf8, 0x83, 0x2c, 0xa7, 0xfb, + 0x63, 0x53, 0x89, 0x5f, 0x61, 0x37, 0x01, 0x90, 0xcf, 0x5d, 0x3c, 0x7f, + 0x4a, 0xd3, 0xd1, 0x8a, 0x7e, 0x9a, 0x05, 0xf8, 0xe9, 0x61, 0xda, 0x77, + 0x7d, 0x5f, 0x4e, 0xda, 0x01, 0x34, 0xf1, 0x8f, 0xb4, 0xa2, 0x27, 0x0a, + 0x9e, 0x77, 0x04, 0x35, 0x25, 0xf6, 0x7e, 0x42, 0xc7, 0x4f, 0xb7, 0xed, + 0x2e, 0x9f, 0xf7, 0xc3, 0x9c, 0x36, 0x3e, 0xbc, 0x93, 0xe7, 0x7f, 0x59, + 0x33, 0xa7, 0xe6, 0x5e, 0x6c, 0x30, 0xfa, 0x34, 0xcd, 0xf2, 0x00, 0x72, + 0xd9, 0x69, 0x4b, 0x7b, 0x1f, 0x98, 0x8c, 0x5f, 0x3d, 0x4c, 0x3b, 0x6d, + 0x82, 0xd0, 0xf5, 0xee, 0xc9, 0xd1, 0xa4, 0xc1, 0xd5, 0x43, 0x08, 0x50, + 0x40, 0x7b, 0xef, 0xc3, 0xfb, 0x8a, 0xfe, 0xbf, 0xe3, 0xd4, 0x43, 0xe6, + 0x8c, 0x0f, 0xd1, 0xb4, 0x75, 0xdc, 0xcd, 0x78, 0xef, 0x8f, 0x8a, 0x40, + 0x00, 0x79, 0xbe, 0x1d, 0xd7, 0x75, 0x3b, 0xed, 0x87, 0x0f, 0x70, 0xcf, + 0xb4, 0x69, 0xfe, 0xcd, 0xde, 0x4e, 0x45, 0x56, 0x3a, 0x4d, 0x3c, 0xc5, + 0xe5, 0xdb, 0x6c, 0x8f, 0x17, 0xd7, 0xd3, 0xce, 0x7e, 0xf5, 0x57, 0xfa, + 0x64, 0xd3, 0xba, 0xf8, 0x11, 0x8c, 0x2d, 0x00, 0xc3, 0x8b, 0x1e, 0x2a, + 0xa7, 0x99, 0x66, 0x96, 0x6e, 0xc3, 0x69, 0x22, 0x30, 0x3a, 0x12, 0x96, + 0xaf, 0xb7, 0x79, 0x9c, 0xc9, 0xfd, 0xf4, 0x3e, 0x30, 0xee, 0xba, 0x2d, + 0xa7, 0xe3, 0xed, 0xc0, 0x40, 0x47, 0xff, 0x6b, 0x06, 0xfd, 0xe6, 0x43, + 0xbe, 0xbd, 0x79, 0xf8, 0xc0, 0xbc, 0x27, 0x7c, 0xe4, 0x34, 0x80, 0x81, + 0x29, 0x28, 0x05, 0x38, 0xe5, 0x5f, 0x5a, 0xe0, 0xc9, 0x80, 0x13, 0x21, + 0xf1, 0xdb, 0x4e, 0xc5, 0x0f, 0x7f, 0x25, 0x50, 0xe2, 0x79, 0x8d, 0xe8, + 0xcd, 0x81, 0xfd, 0x61, 0x31, 0x73, 0xf8, 0xd3, 0x5a, 0xfe, 0x1d, 0x68, + 0x19, 0x77, 0x45, 0xd0, 0x43, 0x37, 0xea, 0xfe, 0x94, 0x1e, 0x40, 0x97, + 0x38, 0xd9, 0x84, 0x78, 0xa0, 0x93, 0x45, 0x0e, 0xa4, 0xfd, 0xb0, 0xbb, + 0x75, 0xff, 0x47, 0x7a, 0x80, 0x1d, 0x08, 0x3e, 0xcf, 0xe1, 0xf3, 0x29, + 0x3a, 0x4e, 0x87, 0xa5, 0x4c, 0x2a, 0x78, 0x23, 0xee, 0x47, 0xa0, 0xc9, + 0xf1, 0x1d, 0xc7, 0x4e, 0x10, 0x0d, 0x88, 0xf2, 0x6e, 0x37, 0x93, 0xab, + 0x38, 0x4d, 0x97, 0xeb, 0x49, 0x27, 0xe5, 0xf9, 0x52, 0x99, 0x16, 0x65, + 0x4f, 0x81, 0xd6, 0xaf, 0xbe, 0x6a, 0x4c, 0xf9, 0x83, 0x3f, 0x94, 0x7e, + 0x15, 0x4f, 0x9b, 0x7e, 0x02, 0x5d, 0x3e, 0x6e, 0xdc, 0x4d, 0x75, 0xef, + 0x76, 0x72, 0x15, 0xcf, 0x47, 0x60, 0xdc, 0xb7, 0x67, 0x05, 0xee, 0xe0, + 0x81, 0x7f, 0x32, 0xda, 0x38, 0x8d, 0x9b, 0x71, 0x22, 0xad, 0x6e, 0xa6, + 0x00, 0x0a, 0xd2, 0x9d, 0xa6, 0x19, 0xff, 0x28, 0x65, 0xd7, 0xfe, 0xc4, + 0x00, 0x71, 0xda, 0xf1, 0x76, 0x7d, 0x93, 0xde, 0x3b, 0x5d, 0xfa, 0x53, + 0xea, 0xfb, 0x9d, 0xc6, 0x07, 0xb1, 0x02, 0xe9, 0xe1, 0x83, 0x0e, 0xbc, + 0xe8, 0x4f, 0x0f, 0x62, 0x01, 0x62, 0xc4, 0x53, 0x56, 0x00, 0x9c, 0xe8, + 0xe4, 0xd7, 0xc0, 0xef, 0x3f, 0xd2, 0x04, 0xee, 0xbb, 0x06, 0x57, 0x0f, + 0x3b, 0xf3, 0xe1, 0x5d, 0x52, 0xf2, 0xe4, 0xbe, 0xef, 0x34, 0x3d, 0xc7, + 0xb1, 0xbf, 0x3e, 0x05, 0x8b, 0x29, 0xb6, 0xb4, 0x79, 0x92, 0x17, 0xfd, + 0x6d, 0x23, 0x4b, 0x80, 0xce, 0x7f, 0x04, 0x95, 0x40, 0x34, 0x9a, 0x4e, + 0xf3, 0xba, 0xc1, 0xb9, 0x3b, 0xfa, 0xfb, 0x01, 0x80, 0xc1, 0x6a, 0x04, + 0x17, 0x80, 0xc6, 0xde, 0x0f, 0x50, 0x79, 0xfb, 0x3a, 0x11, 0x5f, 0xb4, + 0x96, 0xc9, 0x42, 0x83, 0x1b, 0xc3, 0xa6, 0xb0, 0x73, 0x07, 0x94, 0x13, + 0x89, 0xc0, 0x42, 0x1c, 0x60, 0x09, 0x59, 0x01, 0xe2, 0xd0, 0x5b, 0x10, + 0xc5, 0x5d, 0xf0, 0x01, 0x44, 0x91, 0x4b, 0x0b, 0xa2, 0xaa, 0xf7, 0x47, + 0x19, 0x05, 0xfc, 0xe7, 0x8d, 0x00, 0x4e, 0x7a, 0x53, 0xad, 0xd7, 0xce, + 0xa0, 0xf8, 0x13, 0x58, 0xc2, 0xfc, 0xfe, 0xf4, 0xf2, 0x41, 0x18, 0x80, + 0xce, 0xe4, 0xc0, 0x09, 0xf2, 0x69, 0x71, 0x4a, 0x1e, 0x24, 0x3f, 0xf7, + 0x81, 0x98, 0x8b, 0xea, 0x8f, 0x34, 0x00, 0x6e, 0x7c, 0x9f, 0x41, 0x4d, + 0x49, 0xd3, 0x33, 0x49, 0xa7, 0x1b, 0x49, 0xe1, 0x33, 0x49, 0x93, 0xe3, + 0x7d, 0xca, 0x72, 0x1e, 0xfa, 0x69, 0x5f, 0xec, 0x29, 0xad, 0x71, 0xd2, + 0xaf, 0x03, 0xb6, 0x63, 0xd1, 0xde, 0x1c, 0xfb, 0xd3, 0x13, 0xdb, 0x69, + 0xf3, 0xeb, 0xf8, 0xbe, 0x53, 0xf7, 0x0d, 0xbc, 0xdd, 0x61, 0xda, 0x3d, + 0xac, 0xdc, 0x31, 0xd5, 0xdd, 0x58, 0x00, 0x72, 0xf3, 0xdf, 0x86, 0x0f, + 0x9f, 0xf1, 0x10, 0xaf, 0x9b, 0xd2, 0x3f, 0xc8, 0x0c, 0x0e, 0x7f, 0x5a, + 0x33, 0x78, 0xe2, 0xf9, 0xb3, 0x9a, 0xdd, 0xb4, 0xec, 0x9d, 0x92, 0xfd, + 0x29, 0x2d, 0x63, 0xda, 0xbf, 0x78, 0xc2, 0x6d, 0xee, 0xed, 0x10, 0xb0, + 0xfc, 0x8f, 0x34, 0x04, 0xc9, 0xad, 0x9f, 0x67, 0x71, 0x9f, 0x29, 0xf0, + 0xef, 0x9b, 0x16, 0x4f, 0x44, 0x01, 0x06, 0xdc, 0x52, 0xfa, 0x29, 0xb3, + 0x79, 0x3a, 0x94, 0xeb, 0xcb, 0x7a, 0xaf, 0xe4, 0xa0, 0x99, 0xfa, 0x96, + 0xe3, 0x9f, 0x8a, 0x74, 0x3a, 0xcb, 0x2b, 0x8a, 0x83, 0x69, 0xf3, 0xfe, + 0x02, 0x48, 0x24, 0xab, 0xef, 0xd1, 0xe1, 0x2e, 0xa0, 0xfb, 0x84, 0x05, + 0x30, 0xb0, 0xa0, 0xcd, 0x6f, 0x00, 0xe2, 0x8f, 0xd2, 0xdc, 0xfe, 0x4f, + 0xab, 0xb9, 0x77, 0x57, 0xc3, 0xbf, 0xd7, 0x04, 0x20, 0x83, 0x7f, 0xb8, + 0xc2, 0x4e, 0x82, 0x9c, 0x4e, 0xc8, 0xf9, 0xf9, 0x0d, 0xfa, 0xe6, 0x33, + 0x13, 0xbb, 0xbf, 0xfc, 0x72, 0x8a, 0xe2, 0xd4, 0x7b, 0x55, 0xcd, 0xd8, + 0x7b, 0x96, 0x76, 0xc3, 0x3f, 0x3b, 0x00, 0x7f, 0x1f, 0x34, 0x60, 0x8e, + 0x7f, 0x2c, 0xdc, 0x7f, 0x87, 0x45, 0x1e, 0x12, 0xdf, 0x2f, 0xef, 0xda, + 0x7d, 0xcb, 0xf9, 0x6f, 0x73, 0xb5, 0x4f, 0x29, 0x40, 0x13, 0x67, 0xd3, + 0x4c, 0x37, 0x80, 0xe2, 0xa0, 0xef, 0x69, 0x52, 0x2b, 0x88, 0x87, 0xe7, + 0x39, 0xb5, 0xa8, 0xa8, 0xe2, 0x6b, 0x71, 0x03, 0xee, 0x8d, 0xef, 0x54, + 0xb7, 0x94, 0xf3, 0x7e, 0x1a, 0xc2, 0x0d, 0xbc, 0x97, 0xe5, 0x74, 0x71, + 0x4a, 0xc8, 0x41, 0x23, 0xfe, 0xd7, 0x52, 0x81, 0x5d, 0x0f, 0x70, 0x93, + 0xdf, 0x44, 0x85, 0x57, 0xdf, 0xf2, 0x67, 0xa7, 0x73, 0xe2, 0xdb, 0xf1, + 0xef, 0x6f, 0x1f, 0x76, 0xc0, 0x38, 0xee, 0xba, 0x70, 0x4b, 0xf5, 0x9f, + 0x0a, 0xc5, 0x4f, 0x60, 0xed, 0x09, 0x8a, 0x3d, 0x84, 0xc5, 0x7d, 0xc2, + 0x2e, 0x4f, 0xbe, 0x83, 0xc5, 0xfc, 0x3a, 0x4d, 0x78, 0x21, 0xfd, 0xfb, + 0xc9, 0x89, 0xbf, 0xdc, 0x96, 0x4f, 0xde, 0x56, 0x48, 0x7c, 0x28, 0xe1, + 0x5f, 0x63, 0x9d, 0xdf, 0x68, 0x2c, 0x5f, 0x5e, 0x71, 0xfd, 0x77, 0x7b, + 0xf0, 0xfc, 0x7e, 0x6a, 0xed, 0x79, 0x80, 0xd3, 0xf8, 0xfe, 0x04, 0x66, + 0xf9, 0x25, 0x61, 0x18, 0xf7, 0x23, 0x0b, 0x27, 0x4a, 0x1f, 0x96, 0x37, + 0x3d, 0xfa, 0x7b, 0x0a, 0x24, 0xfe, 0x03, 0x04, 0xf2, 0x74, 0x62, 0xe7, + 0xa9, 0xad, 0xea, 0xa2, 0xfa, 0xe9, 0xa1, 0x2c, 0xa6, 0xf5, 0x0d, 0xdf, + 0x18, 0xce, 0x6f, 0xc7, 0xe5, 0xdc, 0x8c, 0xf8, 0xcf, 0xe6, 0x1d, 0xe7, + 0xfe, 0x6d, 0x18, 0xa9, 0x03, 0xe0, 0xde, 0x5d, 0x4e, 0xff, 0xa0, 0xe0, + 0xef, 0xf9, 0xcd, 0x6d, 0x32, 0xfd, 0x1d, 0x39, 0xde, 0xed, 0x8d, 0xf3, + 0x69, 0x86, 0x66, 0x72, 0x92, 0x1f, 0x9e, 0x75, 0x79, 0x57, 0xeb, 0xe9, + 0x21, 0xc4, 0x73, 0x71, 0xa0, 0x7d, 0x5f, 0x71, 0x7b, 0x5c, 0xe1, 0x3e, + 0x8d, 0xf0, 0xa7, 0x07, 0xa0, 0x15, 0xd3, 0x63, 0x8a, 0x5b, 0x5b, 0x20, + 0x8b, 0xfc, 0xa0, 0x99, 0x5b, 0x5e, 0x09, 0xf4, 0x19, 0x10, 0x90, 0x3a, + 0xe1, 0x6d, 0x22, 0x33, 0x98, 0x74, 0xe3, 0xb6, 0xb2, 0xee, 0x4b, 0x1d, + 0x2c, 0x8b, 0x9b, 0x8b, 0x67, 0x3d, 0xa7, 0x9c, 0x22, 0xce, 0x4f, 0x0f, + 0xf7, 0x03, 0x01, 0xea, 0xe7, 0xea, 0x3f, 0x4e, 0xad, 0xd6, 0x0f, 0xc8, + 0x53, 0x66, 0x09, 0x10, 0xca, 0xd4, 0xfe, 0x34, 0xb8, 0x3a, 0x2a, 0xfa, + 0xfa, 0x3e, 0xa1, 0x0a, 0x30, 0x0e, 0x48, 0x0b, 0xee, 0x8c, 0x78, 0x00, + 0xd5, 0x27, 0x3f, 0x0c, 0x58, 0x03, 0x3c, 0xf4, 0x57, 0x7a, 0x07, 0x19, + 0x75, 0x59, 0xd4, 0xf5, 0x34, 0xcb, 0xfa, 0xe3, 0xc4, 0xb9, 0x20, 0x0e, + 0xa7, 0x97, 0xe3, 0x6f, 0x0f, 0x3a, 0x6e, 0xb9, 0xf4, 0x6d, 0x2e, 0x09, + 0xe0, 0xa0, 0x10, 0xe4, 0xc9, 0xf5, 0x14, 0x11, 0xef, 0x71, 0xe7, 0xed, + 0xc3, 0x7a, 0xc2, 0xff, 0x7d, 0x5c, 0x83, 0x7a, 0xf7, 0xa7, 0x38, 0x1f, + 0x0d, 0xe4, 0xa3, 0xc3, 0x4f, 0xff, 0x54, 0x3e, 0xff, 0x23, 0x52, 0x7f, + 0x33, 0x24, 0xab, 0xfe, 0xb4, 0x90, 0xcc, 0x2d, 0xdc, 0x3f, 0xb9, 0xab, + 0x07, 0x86, 0xf5, 0x9b, 0xf9, 0x7e, 0xf9, 0xd3, 0xf2, 0x3d, 0xbb, 0x69, + 0xd6, 0xb3, 0x62, 0xfd, 0x91, 0x22, 0xb8, 0x51, 0xe3, 0xf9, 0xdd, 0x13, + 0x29, 0xdf, 0x3e, 0xbd, 0xf1, 0x7c, 0xf4, 0x36, 0x30, 0x60, 0xef, 0x0f, + 0x9d, 0xd0, 0x16, 0xf2, 0xfb, 0xac, 0x74, 0x73, 0x9b, 0xd8, 0x7e, 0xa6, + 0xe2, 0x76, 0x24, 0x77, 0x1f, 0xc5, 0x00, 0x06, 0x4c, 0x9e, 0xdc, 0x89, + 0xf3, 0xfa, 0xe1, 0xff, 0xdf, 0xde, 0xb3, 0x76, 0xb5, 0x8d, 0x24, 0xfb, + 0x3d, 0xbf, 0x42, 0xd1, 0xe6, 0x04, 0x79, 0x30, 0x06, 0x9b, 0x90, 0x64, + 0x60, 0x20, 0x87, 0x40, 0x1e, 0x6c, 0x48, 0x60, 0x63, 0x32, 0xb9, 0x7b, + 0x19, 0x0e, 0xc8, 0xb6, 0x00, 0x4d, 0x6c, 0xcb, 0x2b, 0xc9, 0x21, 0x0c, + 0xeb, 0xfb, 0xdb, 0x6f, 0x55, 0x3f, 0xa4, 0x7e, 0x4a, 0x32, 0x76, 0x12, + 0xb8, 0x7b, 0xf3, 0x41, 0xc1, 0x52, 0x77, 0x75, 0x75, 0x75, 0x75, 0x75, + 0x75, 0x75, 0x75, 0xd5, 0x57, 0x3f, 0x0e, 0xa3, 0x31, 0x0a, 0xee, 0xce, + 0xf8, 0xe2, 0x82, 0xa8, 0xb7, 0x51, 0x64, 0x17, 0x6d, 0x53, 0x6e, 0xbc, + 0x0c, 0xde, 0x25, 0xd9, 0x88, 0x4c, 0x3b, 0x00, 0x24, 0xa5, 0x17, 0xcd, + 0x61, 0xb6, 0xc4, 0xfc, 0x82, 0x2b, 0x8f, 0x04, 0x4d, 0xa2, 0xe5, 0xb4, + 0x31, 0x01, 0x19, 0x73, 0xca, 0xfe, 0x91, 0xc3, 0xf1, 0x19, 0x0d, 0x45, + 0xd9, 0xd9, 0x38, 0xe6, 0x79, 0xea, 0x91, 0x64, 0x68, 0x54, 0x8c, 0x7f, + 0x85, 0xa1, 0x09, 0x53, 0x27, 0xba, 0x82, 0xe1, 0xa0, 0x1d, 0x73, 0x04, + 0x5d, 0xa1, 0xec, 0x08, 0x1e, 0x41, 0xf3, 0x5b, 0x00, 0x32, 0xec, 0x01, + 0x0c, 0x30, 0x0e, 0x32, 0x3f, 0x46, 0xe3, 0xc0, 0x13, 0xe6, 0xc2, 0xd3, + 0xb8, 0x33, 0x83, 0x0c, 0x6f, 0x10, 0xff, 0x39, 0x38, 0x5b, 0x65, 0xcc, + 0xfe, 0x03, 0x5c, 0xad, 0xe6, 0x93, 0x2b, 0x30, 0x13, 0x12, 0x33, 0x45, + 0xdc, 0x9e, 0x39, 0xfe, 0x22, 0x4d, 0x9b, 0x47, 0x35, 0x10, 0x26, 0x79, + 0x2b, 0x5f, 0x61, 0x04, 0xe1, 0x56, 0x74, 0x7b, 0x91, 0x9e, 0xe7, 0x61, + 0x54, 0xa0, 0x24, 0x9a, 0x2a, 0x16, 0xc0, 0xf7, 0x89, 0x64, 0x5c, 0x1c, + 0x1e, 0x6b, 0xe9, 0xa7, 0x26, 0x26, 0x9d, 0x39, 0x61, 0x90, 0xe1, 0x26, + 0x63, 0xd1, 0xd0, 0xbc, 0x7f, 0xf5, 0xde, 0xd9, 0xb7, 0x95, 0x99, 0x29, + 0xcc, 0xd8, 0xe2, 0xff, 0x29, 0x3a, 0x92, 0x5b, 0x7b, 0x65, 0x84, 0xfc, + 0x68, 0x2d, 0x34, 0x13, 0x25, 0x9b, 0xff, 0x51, 0x1c, 0xf9, 0xb6, 0xfd, + 0x9d, 0x18, 0x72, 0xe5, 0x3f, 0x8b, 0x21, 0x81, 0x8e, 0xd3, 0xf2, 0xe3, + 0x77, 0x0d, 0x9f, 0x1a, 0xfc, 0xd8, 0x8c, 0xdd, 0xb7, 0x25, 0x73, 0x3f, + 0x4c, 0x0a, 0xc9, 0xba, 0x0f, 0xdf, 0x9d, 0x03, 0x7a, 0x32, 0x37, 0x7f, + 0x1e, 0x0d, 0x7f, 0x34, 0x8f, 0xde, 0x96, 0x4c, 0xe1, 0xf0, 0xbc, 0x30, + 0x19, 0xdd, 0x61, 0x0c, 0xaa, 0xa7, 0xb3, 0x67, 0x2b, 0x35, 0x13, 0x91, + 0xea, 0xf7, 0x85, 0x48, 0x7e, 0xdf, 0x8f, 0x07, 0x45, 0x54, 0x7a, 0x03, + 0x9a, 0xe8, 0xef, 0x61, 0x2f, 0x88, 0x9c, 0x23, 0x7a, 0xd4, 0x30, 0xfd, + 0x64, 0xfd, 0x4e, 0xb3, 0xf5, 0xf5, 0x8f, 0x9d, 0xad, 0x36, 0x0d, 0x6e, + 0x86, 0xac, 0x95, 0xfe, 0xe9, 0xe8, 0x32, 0x2a, 0xce, 0x98, 0xf8, 0x3a, + 0x0e, 0x82, 0xbf, 0x40, 0x2f, 0xf5, 0x47, 0x18, 0xb5, 0xf2, 0x7e, 0xd1, + 0xfe, 0x2e, 0xf0, 0x77, 0x61, 0x16, 0x5e, 0x21, 0x0f, 0xef, 0x6b, 0xfb, + 0xfd, 0xb6, 0x99, 0x04, 0x41, 0xff, 0x7e, 0x2c, 0x29, 0x83, 0x60, 0x10, + 0xc5, 0x85, 0x44, 0xda, 0xb9, 0xee, 0xc2, 0xfe, 0xa8, 0xbd, 0xfb, 0x71, + 0xfb, 0xfd, 0x5d, 0x59, 0xae, 0x77, 0xef, 0x0b, 0x13, 0x76, 0xc6, 0x17, + 0xa7, 0x71, 0x80, 0x6e, 0x6a, 0x45, 0x14, 0xde, 0x45, 0xeb, 0x16, 0xc8, + 0xda, 0xe0, 0xea, 0xae, 0x10, 0xd8, 0xbf, 0x37, 0xab, 0xd8, 0x54, 0x29, + 0x80, 0xdf, 0x1e, 0x45, 0xa9, 0xdf, 0x5f, 0x5c, 0x9c, 0xff, 0x6c, 0xdf, + 0xbe, 0x2f, 0x04, 0x9b, 0x3a, 0xeb, 0x34, 0xa5, 0xd9, 0xd2, 0xd2, 0xfc, + 0x69, 0xd6, 0xb8, 0xdf, 0x7b, 0x9e, 0xe4, 0x7a, 0xd8, 0x3d, 0x65, 0x8e, + 0x42, 0x45, 0x04, 0xfc, 0x18, 0x60, 0x49, 0x87, 0xd2, 0xf1, 0xae, 0x4c, + 0xf0, 0xe1, 0x7d, 0xe1, 0xd7, 0xae, 0xdf, 0xef, 0x8e, 0xfb, 0x7e, 0x5a, + 0xc8, 0xa3, 0x87, 0xfb, 0xfb, 0x0e, 0xfc, 0x0f, 0xca, 0x6a, 0xfc, 0x3d, + 0x26, 0xf7, 0xf3, 0xfb, 0xb3, 0xf1, 0x41, 0xef, 0xfe, 0x53, 0xe2, 0xc9, + 0x96, 0x14, 0x11, 0x6c, 0x8f, 0x14, 0x74, 0xda, 0xc0, 0x98, 0x77, 0x85, + 0x23, 0x07, 0xf7, 0x85, 0xc8, 0xbd, 0xe0, 0x6b, 0x88, 0x5e, 0x12, 0xc4, + 0x0f, 0xb6, 0x88, 0xc8, 0x48, 0xdd, 0xcf, 0xe4, 0x5a, 0x68, 0x99, 0x7a, + 0xf9, 0xdd, 0xf4, 0xcb, 0x3b, 0x2c, 0x3d, 0xd9, 0x31, 0xcf, 0x69, 0xc7, + 0xef, 0x7e, 0x19, 0x8f, 0x40, 0x4b, 0x4a, 0xd2, 0x28, 0x0e, 0xca, 0xe8, + 0x79, 0x18, 0x47, 0x40, 0xfb, 0x24, 0x8a, 0xef, 0x0a, 0xdb, 0x46, 0xf7, + 0x47, 0x36, 0x24, 0x68, 0x71, 0x2b, 0x14, 0x0b, 0x07, 0x20, 0x15, 0x12, + 0x7f, 0x30, 0xea, 0xdb, 0x62, 0x45, 0xcc, 0x24, 0x46, 0xdb, 0xf7, 0x85, + 0x54, 0x19, 0x6f, 0x92, 0xc3, 0xb1, 0xd3, 0xcb, 0xde, 0x20, 0x2c, 0xa2, + 0xda, 0xd3, 0x95, 0x65, 0xe2, 0xf5, 0x8e, 0x37, 0xac, 0xbe, 0xc3, 0x44, + 0x7f, 0x75, 0x3f, 0x36, 0x92, 0xd5, 0xb6, 0x3a, 0x7b, 0xaf, 0x9d, 0xed, + 0x71, 0x1a, 0x39, 0x07, 0xc4, 0x51, 0xfb, 0xae, 0x4c, 0xe2, 0xbf, 0xee, + 0x07, 0x89, 0xe9, 0x45, 0xa6, 0x53, 0xe2, 0xf1, 0x7b, 0xfa, 0xe7, 0x38, + 0x49, 0xc3, 0xf3, 0xc2, 0x9d, 0x7b, 0xfb, 0xe0, 0x8d, 0xb3, 0x8f, 0x07, + 0xb8, 0xa5, 0xda, 0xfb, 0x6d, 0x88, 0xf6, 0xaf, 0xfb, 0xbd, 0x00, 0xe1, + 0x5d, 0xc6, 0xfe, 0x69, 0x8a, 0x81, 0x5b, 0x0a, 0x22, 0xe3, 0x30, 0x05, + 0x3e, 0x48, 0x9d, 0x9d, 0xcb, 0x70, 0x34, 0xef, 0x5c, 0xdc, 0x15, 0x5c, + 0x06, 0x92, 0xeb, 0x24, 0x0d, 0x06, 0x77, 0xc7, 0x5f, 0xc0, 0x1a, 0xc7, + 0x8b, 0x2d, 0xd1, 0x88, 0xed, 0x4f, 0xc8, 0xce, 0xdd, 0xfd, 0xa9, 0xcc, + 0x68, 0x89, 0x93, 0x56, 0x7d, 0x27, 0x89, 0x54, 0x3b, 0x1d, 0x8f, 0x7a, + 0xb0, 0xcf, 0x81, 0xe9, 0x5d, 0x28, 0x41, 0xa9, 0xf3, 0x94, 0x73, 0x70, + 0xb4, 0x3d, 0xff, 0x15, 0xda, 0xff, 0x09, 0x86, 0xf5, 0x79, 0xd1, 0x70, + 0x7a, 0x7d, 0x12, 0xe6, 0x35, 0xde, 0x11, 0xfa, 0x49, 0x67, 0xe2, 0xdf, + 0x97, 0x8c, 0x3f, 0x44, 0x59, 0xc7, 0xeb, 0x56, 0x68, 0x3e, 0x3a, 0x2d, + 0x08, 0xee, 0x27, 0x48, 0xd0, 0x5d, 0x7a, 0x81, 0x31, 0x99, 0xb7, 0x14, + 0xfd, 0xa1, 0x51, 0xaa, 0x2a, 0x8a, 0xc9, 0xa4, 0x77, 0xda, 0xf5, 0xe3, + 0x9e, 0x5d, 0x52, 0xbe, 0x24, 0x94, 0x74, 0x8e, 0x49, 0xd4, 0x43, 0x74, + 0x1e, 0x47, 0x77, 0xeb, 0x04, 0x1d, 0xbd, 0xe9, 0xfe, 0xf2, 0xa4, 0xba, + 0x10, 0xad, 0xe2, 0x17, 0x58, 0x29, 0x76, 0x2b, 0x7a, 0xbd, 0x53, 0xb4, + 0x96, 0x31, 0xe4, 0x08, 0x1b, 0xe2, 0xcc, 0x3b, 0x9c, 0xdc, 0xf0, 0x42, + 0x37, 0xbd, 0xc0, 0xe8, 0x80, 0x29, 0x54, 0x0f, 0xd1, 0x73, 0xb3, 0x1f, + 0xd2, 0x4e, 0x71, 0xff, 0x3e, 0xda, 0x2f, 0x12, 0x0a, 0xc7, 0x1a, 0xa7, + 0xd5, 0x04, 0xa3, 0x13, 0xa4, 0x57, 0x18, 0x78, 0x87, 0xed, 0xbb, 0xf3, + 0x08, 0xb0, 0x84, 0x5a, 0x97, 0x40, 0xe5, 0x2b, 0xbc, 0x96, 0x14, 0xc3, + 0xe7, 0x24, 0xc4, 0x78, 0xb7, 0x00, 0x43, 0xef, 0x7f, 0x69, 0x00, 0xd6, + 0xa9, 0xd6, 0x9e, 0x19, 0xe6, 0x20, 0x7d, 0x4b, 0xfa, 0x38, 0xab, 0x69, + 0xac, 0x1f, 0x8d, 0x7b, 0x24, 0x74, 0x73, 0x3f, 0xf2, 0x7b, 0x05, 0xf3, + 0xcf, 0xa1, 0x17, 0x3c, 0xa8, 0x2b, 0xbf, 0xf4, 0x83, 0x21, 0xc2, 0x68, + 0x3e, 0x17, 0x49, 0xf8, 0x13, 0xc4, 0x13, 0x25, 0xc4, 0x78, 0x54, 0x44, + 0x06, 0x7a, 0x7f, 0x8e, 0x8a, 0x5e, 0x64, 0x61, 0xe9, 0xf2, 0x0b, 0x1b, + 0x0e, 0x52, 0x06, 0x53, 0x24, 0x74, 0x83, 0x51, 0xba, 0xe9, 0x36, 0x3a, + 0xe1, 0xd0, 0x5d, 0x9e, 0x9a, 0xa4, 0x4c, 0x38, 0x6e, 0x7d, 0x2c, 0x58, + 0x81, 0xee, 0x92, 0xb4, 0xab, 0x28, 0xd1, 0xae, 0xc2, 0xf3, 0xd0, 0x2e, + 0xce, 0x3e, 0x87, 0x4b, 0xaf, 0xc3, 0x42, 0x91, 0xf5, 0xb3, 0x92, 0x74, + 0xe3, 0x4b, 0xc4, 0x7d, 0xc9, 0x1f, 0x55, 0x76, 0xb3, 0x89, 0xba, 0x44, + 0xd6, 0xd9, 0xa2, 0x67, 0xf3, 0xd3, 0xe3, 0x2e, 0x9a, 0xa2, 0x9c, 0x43, + 0xbc, 0xd9, 0x75, 0x9b, 0xa9, 0x33, 0x75, 0x0f, 0x40, 0x5d, 0xa1, 0x9b, + 0x85, 0x8a, 0x47, 0x3d, 0x7e, 0x2f, 0x8c, 0xca, 0xc4, 0x82, 0x08, 0x78, + 0x29, 0x49, 0xc2, 0xde, 0x56, 0x9b, 0xfe, 0x98, 0x71, 0x6f, 0x5e, 0xc8, + 0xa3, 0x79, 0xcb, 0xe8, 0xd1, 0x64, 0xd8, 0xdb, 0xdc, 0x96, 0x75, 0xad, + 0xa4, 0x88, 0xc6, 0x69, 0x89, 0xb1, 0x96, 0x44, 0xb2, 0x71, 0xda, 0xed, + 0xbd, 0x5d, 0x4b, 0xcf, 0x4d, 0x6b, 0xaf, 0x29, 0x80, 0x24, 0xf6, 0x0b, + 0x10, 0x84, 0x8e, 0xb9, 0x5b, 0x06, 0xd7, 0x71, 0xdb, 0xac, 0x2e, 0x8b, + 0x24, 0x7f, 0x91, 0x74, 0x18, 0x68, 0xe8, 0xd1, 0x10, 0x70, 0x75, 0x7f, + 0x00, 0xdd, 0xfa, 0xd1, 0x45, 0x58, 0x38, 0x07, 0x76, 0x28, 0x2e, 0x18, + 0xf1, 0x61, 0x7a, 0xd2, 0x55, 0x8c, 0x07, 0x4c, 0xc4, 0x72, 0xe5, 0x58, + 0xaf, 0x94, 0x46, 0x54, 0x94, 0x1b, 0x2a, 0x8d, 0xf0, 0xae, 0xe0, 0x65, + 0xd4, 0xef, 0x05, 0xf1, 0xa6, 0x8b, 0x28, 0x9b, 0x0a, 0xd1, 0x65, 0x22, + 0x0d, 0xbe, 0x19, 0x41, 0xc4, 0x81, 0xdf, 0x43, 0x2d, 0xc6, 0x72, 0x31, + 0x88, 0x34, 0x0d, 0x1b, 0x77, 0x98, 0x4b, 0x7a, 0xed, 0xe5, 0xb9, 0x46, + 0x4a, 0xfe, 0x7e, 0x94, 0xc1, 0x08, 0x70, 0x57, 0x51, 0xdc, 0xb3, 0x53, + 0xa7, 0xa8, 0x84, 0x40, 0x06, 0x7b, 0xb1, 0xe5, 0x1f, 0x17, 0x34, 0x9a, + 0x88, 0x1a, 0x36, 0x6d, 0x96, 0xac, 0x25, 0x7f, 0x52, 0xec, 0xe0, 0x21, + 0xe8, 0xb7, 0x51, 0xfc, 0xe5, 0xb4, 0x7b, 0x19, 0xe0, 0x35, 0xf4, 0xa2, + 0x18, 0xc2, 0x6c, 0xb6, 0xcd, 0x23, 0x7a, 0xb0, 0x51, 0xb1, 0x28, 0x36, + 0x51, 0x59, 0x2c, 0x54, 0xa0, 0xf8, 0x0c, 0x46, 0xe9, 0xdd, 0xb1, 0x50, + 0x71, 0x5f, 0x64, 0x3b, 0x3b, 0x31, 0x75, 0x0d, 0xb0, 0x5e, 0x62, 0x77, + 0x86, 0xb7, 0x0e, 0xc9, 0xcf, 0x1f, 0x73, 0xc9, 0xc5, 0x3c, 0x6b, 0x4b, + 0xad, 0xc4, 0xc5, 0x62, 0x49, 0x9c, 0x72, 0xb4, 0x6b, 0x96, 0x89, 0x3e, + 0xf0, 0xbf, 0xf5, 0x83, 0xe1, 0x45, 0x7a, 0xb9, 0xe9, 0xb6, 0xb4, 0xc0, + 0x04, 0xcb, 0x73, 0x35, 0xba, 0x4b, 0x84, 0xf6, 0x87, 0xdd, 0xa0, 0x5f, + 0x51, 0xe5, 0x99, 0x42, 0xf1, 0x4f, 0x0a, 0x4d, 0x3c, 0x3b, 0xdb, 0x1f, + 0x76, 0x5e, 0xed, 0xcf, 0xcd, 0xc2, 0xc3, 0xfa, 0x12, 0x7d, 0xb9, 0x0b, + 0xbb, 0x1e, 0x58, 0x83, 0x0a, 0xfb, 0x7e, 0xf0, 0xee, 0x3b, 0x9a, 0xab, + 0x2d, 0xb2, 0xc0, 0xef, 0x07, 0xf1, 0x1d, 0x12, 0x05, 0x57, 0x7e, 0x6c, + 0x35, 0xee, 0x53, 0x15, 0x7e, 0xff, 0xd5, 0xc7, 0xa3, 0xa9, 0x66, 0xfd, + 0x03, 0xeb, 0xb8, 0x67, 0x32, 0x20, 0xbb, 0xf2, 0x7c, 0x19, 0xc5, 0x20, + 0x00, 0xa8, 0x5c, 0x88, 0x7a, 0x7e, 0xff, 0xf4, 0x94, 0x99, 0x00, 0xd5, + 0x21, 0xc7, 0x12, 0x84, 0x74, 0x5c, 0x1e, 0x49, 0xdf, 0xb7, 0x66, 0x9d, + 0x86, 0x15, 0xf7, 0x19, 0x59, 0xb6, 0xa6, 0xdb, 0x4c, 0x0d, 0x8a, 0xfe, + 0xff, 0xcf, 0x8c, 0x07, 0x36, 0xd4, 0xe8, 0xe5, 0x45, 0xb7, 0x7a, 0xea, + 0x28, 0xf1, 0x87, 0xa9, 0xf6, 0x3c, 0x27, 0x8a, 0xf5, 0x92, 0x24, 0xa5, + 0x17, 0x69, 0xfc, 0xbb, 0x2c, 0x8e, 0xe2, 0xbd, 0xce, 0x6e, 0x3f, 0xf0, + 0xe3, 0xe9, 0x78, 0x98, 0x7b, 0xe4, 0xf4, 0x83, 0x54, 0x70, 0x66, 0x9c, + 0xeb, 0xf9, 0x31, 0x2e, 0xb7, 0x3e, 0xa8, 0xfc, 0x1a, 0x2b, 0x85, 0xbd, + 0x4d, 0x97, 0x62, 0x7e, 0x04, 0x45, 0xb6, 0xa1, 0x48, 0xa1, 0xad, 0x9e, + 0x16, 0x3d, 0x3d, 0xe5, 0xf0, 0x34, 0xe6, 0x86, 0xbd, 0x22, 0xfb, 0x74, + 0x2b, 0x06, 0x14, 0x0a, 0xc9, 0x3f, 0x94, 0x5e, 0xa2, 0x91, 0x2c, 0x88, + 0x61, 0x6b, 0x1a, 0x0e, 0x2e, 0x60, 0xbd, 0x17, 0xca, 0x8a, 0x7f, 0x2a, + 0x95, 0x88, 0x02, 0xcd, 0xa4, 0xa9, 0x4b, 0x7a, 0x7e, 0x15, 0x74, 0x92, + 0xa8, 0xfb, 0x25, 0x48, 0x3f, 0xb3, 0xb7, 0xb6, 0xf6, 0x48, 0xb6, 0x3a, + 0x8c, 0x9e, 0xf6, 0x05, 0xa4, 0x9f, 0xbb, 0x95, 0x84, 0x17, 0x43, 0x90, + 0x84, 0x64, 0x2f, 0x42, 0x6e, 0x60, 0x1b, 0x9b, 0x4f, 0xba, 0x71, 0x38, + 0xca, 0xba, 0x07, 0x10, 0x12, 0xd8, 0x9a, 0xa7, 0xf1, 0x18, 0x03, 0x9d, + 0x6c, 0x3a, 0x37, 0xe4, 0x3d, 0xb9, 0x46, 0xbe, 0xee, 0x1c, 0x67, 0x34, + 0xb8, 0x21, 0x8b, 0xd0, 0xba, 0xe3, 0xe2, 0x7f, 0x6e, 0x9d, 0xa8, 0x4b, + 0xf0, 0x2b, 0x49, 0x63, 0xc4, 0xaf, 0xee, 0x24, 0xe1, 0x5f, 0xf0, 0xbb, + 0xb5, 0xe6, 0x4c, 0xea, 0x7a, 0x1d, 0x1a, 0x0e, 0x14, 0xb6, 0x83, 0x59, + 0xbd, 0xce, 0x75, 0x1a, 0x64, 0xb5, 0x9a, 0xc6, 0x4a, 0x79, 0xf2, 0xaa, + 0x5b, 0xd5, 0x82, 0x1e, 0x11, 0x4d, 0x6c, 0xba, 0xda, 0xd0, 0xed, 0xa9, + 0x2a, 0x60, 0xe0, 0xd9, 0xdf, 0xa5, 0x54, 0x44, 0xd3, 0xd6, 0xc6, 0x5c, + 0x68, 0x3c, 0x15, 0xda, 0xd4, 0x95, 0x59, 0x52, 0xb5, 0xb2, 0x7a, 0x27, + 0xf5, 0x07, 0x93, 0x8d, 0x07, 0xe2, 0x48, 0x1f, 0xfa, 0x71, 0x12, 0xc4, + 0xd9, 0x70, 0x8f, 0x22, 0x18, 0xec, 0x15, 0x5a, 0x78, 0x84, 0x9f, 0x68, + 0xa9, 0xed, 0x38, 0xf6, 0xaf, 0xbd, 0xce, 0xf8, 0xfc, 0x1c, 0x40, 0x52, + 0x0e, 0xd9, 0x0d, 0x28, 0xfb, 0x44, 0x71, 0xc2, 0xdf, 0xd5, 0x18, 0x90, + 0x9c, 0x9b, 0xd8, 0xa9, 0x04, 0x05, 0x02, 0x8d, 0xe8, 0x75, 0x8f, 0xe9, + 0xab, 0x93, 0x8d, 0xac, 0x26, 0x46, 0xff, 0x6b, 0x00, 0x1e, 0x50, 0x7c, + 0x25, 0x7f, 0x8b, 0x6d, 0xc3, 0x9b, 0x61, 0x70, 0xe5, 0x7c, 0x0a, 0x87, + 0xe9, 0xf3, 0x1c, 0xa3, 0x5a, 0x5e, 0x28, 0x3c, 0x77, 0x3c, 0xa9, 0x49, + 0x11, 0xa3, 0x1c, 0x2b, 0xda, 0x64, 0x1b, 0x48, 0x03, 0x10, 0x45, 0x32, + 0x34, 0x2e, 0x02, 0xf2, 0xda, 0x2b, 0xe8, 0xe3, 0xc6, 0x03, 0xd9, 0x4a, + 0x91, 0x8e, 0xe3, 0xa1, 0x73, 0xdc, 0x68, 0x34, 0x72, 0x8c, 0x1a, 0x48, + 0xfc, 0x7d, 0xc2, 0x74, 0x18, 0x84, 0x3d, 0x6b, 0xad, 0x76, 0xd2, 0x18, + 0xf8, 0x23, 0xcf, 0xab, 0x39, 0x9b, 0x5b, 0x0a, 0x62, 0x02, 0x2c, 0xa9, + 0x03, 0x8d, 0x38, 0xe8, 0x8d, 0xbb, 0x81, 0xe7, 0xf9, 0xdd, 0x2e, 0x47, + 0x61, 0x2f, 0x0d, 0x06, 0x16, 0x10, 0xf8, 0x0f, 0x4a, 0x1e, 0xe7, 0x05, + 0x1b, 0xc8, 0x24, 0x27, 0xd0, 0x4f, 0x42, 0x56, 0xe8, 0xdf, 0xef, 0x7e, + 0x7f, 0x1c, 0x48, 0x43, 0x49, 0xe0, 0x6d, 0x18, 0x61, 0x31, 0x94, 0x00, + 0xa4, 0xfe, 0x7d, 0x52, 0x77, 0x6e, 0x26, 0x4a, 0x3d, 0xf1, 0xf7, 0xe4, + 0x81, 0x02, 0x65, 0x38, 0xee, 0xf7, 0xe9, 0x67, 0xc6, 0x8d, 0x76, 0x6c, + 0x84, 0xae, 0xd1, 0x78, 0x2b, 0x8e, 0x27, 0x74, 0x09, 0x59, 0x5c, 0x1b, + 0x59, 0x8c, 0x2f, 0x49, 0xb9, 0x7e, 0xdd, 0x46, 0x59, 0x6c, 0xe6, 0x98, + 0xb3, 0xd7, 0xe2, 0xe2, 0xc9, 0x86, 0x01, 0x02, 0x93, 0x63, 0x3a, 0x0c, + 0x89, 0xa1, 0x0f, 0x09, 0x7b, 0x72, 0x50, 0x3a, 0x6d, 0x32, 0x1e, 0x5e, + 0xdc, 0x14, 0xba, 0xd5, 0xc0, 0xd9, 0xb8, 0x61, 0xc3, 0x2e, 0xe7, 0x21, + 0xa5, 0x46, 0xed, 0xc4, 0x38, 0x36, 0x02, 0x2f, 0xb9, 0x8e, 0x5b, 0x2b, + 0x28, 0x73, 0xda, 0xbd, 0xf4, 0xe3, 0xba, 0x13, 0x0e, 0x7b, 0xc1, 0xb7, + 0x02, 0xc6, 0xc1, 0xd9, 0x43, 0x48, 0x24, 0x74, 0x72, 0x91, 0xd6, 0x3a, + 0x71, 0xb6, 0x9c, 0xd5, 0x66, 0xcd, 0x52, 0x51, 0xe8, 0x44, 0x9b, 0x90, + 0xaf, 0x71, 0x0e, 0x5b, 0xb8, 0x1d, 0x68, 0x74, 0x07, 0x34, 0x1e, 0x2b, + 0x4c, 0x0b, 0xcf, 0x4d, 0x8a, 0x38, 0xd1, 0x75, 0x0d, 0x8c, 0x68, 0xe9, + 0xfb, 0x9f, 0x51, 0x38, 0xf4, 0x5c, 0x1b, 0x65, 0x00, 0xd1, 0x81, 0xa7, + 0xb1, 0x6b, 0xce, 0x99, 0x65, 0x72, 0x60, 0x2e, 0xb2, 0xae, 0x7c, 0xca, + 0xc3, 0x66, 0x78, 0x64, 0x18, 0x33, 0xf8, 0x86, 0xbc, 0x85, 0x5f, 0x0d, + 0x5c, 0x65, 0x9a, 0xb6, 0x30, 0x5d, 0x57, 0x6a, 0xd9, 0xf4, 0x83, 0x55, + 0x60, 0xf9, 0x17, 0xe7, 0xcd, 0xcb, 0xf6, 0x0e, 0xdb, 0x1a, 0xbc, 0xe9, + 0x47, 0x1d, 0xbf, 0xef, 0x1c, 0x74, 0xfe, 0x04, 0x15, 0xfb, 0x97, 0x65, + 0xb6, 0x46, 0x08, 0x05, 0xf8, 0x0a, 0x41, 0xd5, 0xbe, 0xf7, 0xfe, 0x68, + 0x04, 0x03, 0xbd, 0x2e, 0xa0, 0xd5, 0xc4, 0x55, 0x87, 0x7c, 0xe4, 0x09, + 0x90, 0xdc, 0x7c, 0xb1, 0x6a, 0xc9, 0x1f, 0x31, 0x09, 0x92, 0xf0, 0x75, + 0x55, 0xfe, 0xfa, 0xac, 0x25, 0x56, 0x7d, 0x92, 0x7d, 0x84, 0xf7, 0x98, + 0xe7, 0x41, 0xf8, 0xb6, 0x96, 0x57, 0xfc, 0xb5, 0x85, 0x60, 0xa5, 0xaf, + 0x4f, 0xf3, 0xaf, 0x6b, 0x5f, 0xde, 0xfe, 0x85, 0x49, 0x10, 0x82, 0xdd, + 0xe8, 0x6a, 0x28, 0x14, 0x79, 0x9e, 0x15, 0x69, 0x93, 0x78, 0x6c, 0x98, + 0xed, 0xe3, 0x88, 0x26, 0xfb, 0x10, 0x4a, 0xfd, 0x9a, 0x95, 0xda, 0x07, + 0xbd, 0x8e, 0x06, 0x12, 0xa2, 0x19, 0xa7, 0x58, 0x21, 0xc6, 0x36, 0x6c, + 0x9f, 0xf5, 0x2e, 0xb8, 0x4e, 0xde, 0x47, 0x9d, 0xb0, 0x1f, 0x60, 0xcc, + 0x27, 0xa8, 0x8b, 0x97, 0x81, 0x5c, 0x4b, 0x11, 0x91, 0x84, 0x58, 0x6e, + 0x5d, 0x19, 0x69, 0xb6, 0x9e, 0xa3, 0x42, 0xb9, 0x1b, 0x75, 0x05, 0xa4, + 0xf0, 0x1f, 0x46, 0x52, 0x80, 0x8f, 0xcf, 0x94, 0xd7, 0xe3, 0x11, 0xbc, + 0xfc, 0x45, 0x79, 0x49, 0xc2, 0x05, 0xc0, 0xfb, 0xa7, 0xca, 0x7b, 0x3c, + 0xda, 0x86, 0xd7, 0xcb, 0xc2, 0x6b, 0x41, 0xcb, 0x20, 0x89, 0x48, 0x6e, + 0x83, 0xd3, 0xa5, 0x09, 0xa7, 0x27, 0x16, 0x9c, 0xfe, 0x32, 0xe3, 0xb4, + 0x66, 0xc6, 0x89, 0xe6, 0x37, 0x49, 0x0a, 0xb0, 0xfa, 0x84, 0x6e, 0x3f, + 0x46, 0xb4, 0x5e, 0x9a, 0xd0, 0xda, 0xb1, 0xa0, 0xb5, 0x6d, 0x46, 0x6b, + 0x57, 0x47, 0x8b, 0xfd, 0xd7, 0xf3, 0x53, 0xff, 0x1f, 0xe3, 0x60, 0x1c, + 0xf4, 0x32, 0x2d, 0x2a, 0x4c, 0x3e, 0x27, 0x34, 0xda, 0xed, 0xba, 0x73, + 0xee, 0xf7, 0x93, 0x80, 0xbe, 0x1e, 0xf8, 0xdf, 0xda, 0x54, 0xb5, 0x7e, + 0xd6, 0xa2, 0x6f, 0xfe, 0x45, 0xea, 0xe1, 0x2e, 0x07, 0x9a, 0x60, 0x2d, + 0xa0, 0x12, 0x8b, 0xc7, 0x27, 0xbb, 0xb0, 0xd7, 0x96, 0xaa, 0x43, 0xff, + 0xbe, 0x06, 0xf1, 0xde, 0xa1, 0x50, 0x94, 0x8a, 0x9b, 0x75, 0xb2, 0xcc, + 0xd2, 0x57, 0x18, 0x77, 0x16, 0x76, 0x95, 0x9f, 0x73, 0x95, 0x6e, 0x1c, + 0x8a, 0x44, 0xa3, 0x07, 0xf2, 0x2f, 0x09, 0x63, 0x8b, 0xf5, 0xf2, 0x6f, + 0x7b, 0x34, 0x07, 0x8e, 0xfc, 0x89, 0xc6, 0xdf, 0x42, 0xec, 0x59, 0x18, + 0x2d, 0xb5, 0x40, 0x16, 0x80, 0x89, 0xc6, 0x1b, 0x55, 0x3f, 0xd3, 0xbd, + 0x91, 0xfa, 0x96, 0xee, 0xdc, 0x76, 0x70, 0x77, 0xaa, 0x7e, 0xa2, 0xbb, + 0x06, 0x8a, 0x27, 0x06, 0x5f, 0xd0, 0xbf, 0x53, 0xa7, 0x00, 0xea, 0x5f, + 0x61, 0xfb, 0xca, 0x3c, 0x05, 0xd4, 0xcf, 0xa8, 0xe9, 0xdb, 0x41, 0xe3, + 0xd7, 0x1d, 0x1a, 0x27, 0x4d, 0x47, 0x19, 0xfa, 0x3e, 0x08, 0x61, 0x9f, + 0xa5, 0xbd, 0x27, 0xc1, 0x8e, 0x4c, 0xe0, 0xe8, 0x17, 0x20, 0x4b, 0xf7, + 0xd2, 0xf4, 0x19, 0xb6, 0x7b, 0x6d, 0xb2, 0xdd, 0x63, 0x47, 0x10, 0x61, + 0x34, 0x64, 0x1b, 0x3f, 0xad, 0x24, 0xec, 0xec, 0x58, 0xa1, 0x82, 0x4f, + 0xe6, 0xa1, 0xc5, 0x02, 0xc6, 0xd6, 0xd9, 0xfb, 0x23, 0xb4, 0x4f, 0x99, + 0x3e, 0x1e, 0xb2, 0x53, 0x26, 0x23, 0x57, 0x60, 0x81, 0x76, 0x7b, 0xd7, + 0xfa, 0x6d, 0x7b, 0x64, 0xc7, 0xa6, 0x9d, 0xfa, 0x85, 0x1f, 0x71, 0x0a, + 0xa8, 0x9f, 0x88, 0x29, 0xcc, 0xf8, 0xf2, 0xe0, 0x8b, 0xf1, 0xf5, 0x0e, + 0x35, 0xfa, 0x19, 0xd8, 0x63, 0x30, 0xb2, 0xbc, 0xd5, 0x21, 0xd1, 0xf7, + 0x3b, 0xc4, 0xcc, 0x6e, 0xf9, 0x56, 0xd4, 0x8c, 0x46, 0x1d, 0x26, 0x37, + 0xa8, 0x53, 0xea, 0x11, 0xe3, 0x27, 0x8c, 0x26, 0x1c, 0x67, 0x73, 0x36, + 0x63, 0x8a, 0x36, 0x99, 0xf3, 0x9f, 0xe2, 0x7e, 0x3e, 0xe9, 0x91, 0x3e, + 0xf2, 0x02, 0x42, 0xd6, 0x1b, 0x7f, 0x24, 0x48, 0x28, 0x3c, 0x22, 0xcd, + 0x6b, 0xb0, 0x06, 0xaf, 0xa4, 0x49, 0x7b, 0x95, 0xec, 0xe0, 0xb1, 0x98, + 0xd2, 0x6e, 0xc2, 0xb8, 0x68, 0x27, 0x1a, 0x63, 0x20, 0x56, 0xe1, 0xc3, + 0x87, 0xa8, 0x3d, 0x26, 0x6e, 0x19, 0x9c, 0x4f, 0x87, 0x17, 0x7a, 0x21, + 0x84, 0x16, 0x61, 0x6f, 0x57, 0x98, 0xba, 0xf1, 0x8b, 0x93, 0x99, 0x33, + 0x88, 0xfc, 0x22, 0x7e, 0x66, 0x99, 0xaa, 0x41, 0x0e, 0xe6, 0x3e, 0xcb, + 0x7d, 0x05, 0xa5, 0x43, 0xdc, 0x2c, 0xa1, 0x82, 0xfa, 0x30, 0x57, 0x49, + 0x1a, 0xb9, 0x68, 0x15, 0xb5, 0x31, 0x2c, 0x25, 0x14, 0xba, 0x4a, 0x54, + 0xb5, 0x75, 0xf9, 0x17, 0xab, 0x16, 0x4b, 0xff, 0xad, 0x90, 0xe7, 0xce, + 0xc1, 0x87, 0x0f, 0xaf, 0x76, 0x8e, 0xf6, 0x3e, 0xbc, 0x29, 0x29, 0xde, + 0x24, 0xcf, 0x83, 0xc3, 0x57, 0x1f, 0x4a, 0x0a, 0xb6, 0x28, 0xdc, 0xfd, + 0x83, 0x76, 0x39, 0xd0, 0xd5, 0xac, 0xec, 0xab, 0xdd, 0x92, 0xa2, 0x40, + 0x42, 0xf1, 0x27, 0xdf, 0x30, 0x49, 0x34, 0x68, 0xe0, 0x71, 0xfa, 0x35, + 0x3a, 0x9d, 0x04, 0x26, 0x2d, 0x9e, 0xec, 0x7d, 0x9a, 0xeb, 0xe6, 0xf7, + 0xad, 0x75, 0x23, 0x02, 0x32, 0x7c, 0x72, 0x48, 0xe4, 0x59, 0x54, 0xfa, + 0x0e, 0xb4, 0xfe, 0x65, 0xc3, 0x0c, 0x7d, 0xb5, 0x02, 0x74, 0xdc, 0xf8, + 0x67, 0x9b, 0xc7, 0x0a, 0xc0, 0x27, 0x86, 0x4d, 0xa8, 0xca, 0x3c, 0x3a, + 0x5f, 0x74, 0x01, 0x50, 0x1a, 0x64, 0x2c, 0x68, 0xd8, 0x1c, 0xe4, 0xc6, + 0x93, 0x6c, 0x69, 0x55, 0x58, 0xb4, 0x4b, 0x03, 0xdc, 0x35, 0xfa, 0xd1, + 0x85, 0xe7, 0x66, 0x85, 0x5c, 0x06, 0xaa, 0x90, 0x35, 0x0b, 0xe8, 0x49, + 0x9b, 0x37, 0x72, 0x3e, 0xb4, 0x4f, 0xd4, 0x02, 0x5a, 0x90, 0x05, 0x83, + 0xff, 0x0c, 0x62, 0x81, 0x2d, 0x1c, 0x1e, 0xa8, 0x05, 0x01, 0x80, 0xc9, + 0x30, 0x57, 0x7a, 0x69, 0x98, 0x62, 0x32, 0xe9, 0x1f, 0x3f, 0xa6, 0x53, + 0xf3, 0x63, 0xc6, 0x40, 0x5e, 0x4d, 0x44, 0x9b, 0xee, 0x35, 0x2c, 0x78, + 0x16, 0x89, 0x8a, 0xdc, 0xbe, 0xa3, 0x8d, 0x75, 0x70, 0xe5, 0xe4, 0xc3, + 0x20, 0x7e, 0xd5, 0x44, 0x61, 0xdd, 0x39, 0x76, 0xfd, 0xb8, 0x37, 0x0e, + 0x87, 0x91, 0xcb, 0x37, 0x94, 0x32, 0x21, 0xa3, 0x21, 0x68, 0x22, 0x43, + 0xa5, 0x9b, 0xda, 0x50, 0x5d, 0x61, 0x36, 0x0b, 0x2c, 0xe8, 0x0a, 0xa3, + 0x6e, 0xa0, 0x26, 0xa1, 0xb5, 0x50, 0x44, 0x6a, 0x4b, 0x96, 0x97, 0x8b, + 0x8b, 0x79, 0x31, 0x62, 0x74, 0x67, 0x02, 0x51, 0xa6, 0x2f, 0x7b, 0x69, + 0x03, 0xc9, 0x3e, 0xe3, 0x76, 0x32, 0x48, 0x39, 0x80, 0x8c, 0xaf, 0xea, + 0xce, 0xd3, 0x95, 0x95, 0x15, 0x73, 0x5d, 0x89, 0x45, 0x90, 0x09, 0x2c, + 0x2d, 0x54, 0x19, 0xa0, 0x89, 0x99, 0xb0, 0x84, 0x47, 0xcb, 0x29, 0xcb, + 0x4b, 0x8a, 0xa4, 0xbd, 0x25, 0x41, 0x6c, 0x7c, 0x6f, 0x41, 0x90, 0x1d, + 0x04, 0x22, 0x8a, 0xec, 0x4f, 0x15, 0xd3, 0xef, 0x35, 0x2e, 0xad, 0x67, + 0xb7, 0x18, 0x17, 0x3a, 0x41, 0x8f, 0x19, 0xaa, 0xbb, 0xb0, 0x97, 0xd8, + 0x4e, 0x57, 0xea, 0x8e, 0xf4, 0xbb, 0xa9, 0xfc, 0x6e, 0x29, 0xbf, 0x57, + 0x95, 0xdf, 0x4f, 0x94, 0xdf, 0x6b, 0x75, 0x34, 0x06, 0xb2, 0x57, 0x0d, + 0xdc, 0xaf, 0xc8, 0xe6, 0x53, 0xb9, 0x71, 0xe7, 0xe1, 0xa6, 0xe3, 0xfe, + 0xcd, 0x55, 0x25, 0xa5, 0xd0, 0x9d, 0x7c, 0xd7, 0x82, 0xf6, 0x08, 0x33, + 0x5c, 0xa5, 0x4a, 0xbe, 0x49, 0x52, 0xab, 0x34, 0xa8, 0xcf, 0x84, 0x5c, + 0x53, 0x11, 0x49, 0x42, 0xed, 0xad, 0x4d, 0x07, 0xc8, 0x0c, 0x84, 0x36, + 0xac, 0x68, 0x42, 0x8d, 0x71, 0xd8, 0xe0, 0x9a, 0x7a, 0xe3, 0x2b, 0xda, + 0x1b, 0x81, 0x00, 0x26, 0x3b, 0x92, 0xb9, 0x11, 0xc9, 0x0a, 0x6d, 0x5b, + 0x5c, 0x02, 0xe0, 0x44, 0xa3, 0xa9, 0x99, 0x1d, 0x78, 0x20, 0x18, 0x01, + 0xbc, 0x64, 0x43, 0x91, 0xc7, 0xbb, 0xa9, 0x5a, 0x25, 0x05, 0x30, 0xaf, + 0xd0, 0x0a, 0xd3, 0x8b, 0xba, 0x63, 0x4c, 0x17, 0x88, 0x94, 0x8f, 0xaf, + 0xa9, 0x43, 0x65, 0x14, 0x7b, 0x67, 0xc7, 0x78, 0x0c, 0x04, 0xbf, 0xf0, + 0xdb, 0x52, 0x1c, 0x9c, 0x6f, 0xba, 0x8f, 0x6e, 0x78, 0xeb, 0x13, 0xf7, + 0xe4, 0xac, 0x66, 0x82, 0x4b, 0x93, 0x65, 0x1e, 0x0a, 0xfb, 0x2b, 0x67, + 0x33, 0x6b, 0x4c, 0x23, 0xd0, 0x8b, 0xec, 0x13, 0x1a, 0x92, 0xb7, 0xd3, + 0x34, 0x0e, 0xa1, 0x27, 0x81, 0xe7, 0x2a, 0x4d, 0x1b, 0x4c, 0x6e, 0xeb, + 0x86, 0x05, 0x1c, 0x07, 0x56, 0x47, 0xa0, 0x7c, 0x30, 0xd5, 0xed, 0x60, + 0xe3, 0x3c, 0x8a, 0x5f, 0xf9, 0xdd, 0x4b, 0x8f, 0xee, 0xae, 0xe8, 0x07, + 0x3a, 0xc5, 0x4c, 0xf0, 0x6b, 0xb6, 0xe1, 0x14, 0x0e, 0x08, 0x60, 0xd7, + 0x47, 0xc6, 0x8c, 0x9c, 0x03, 0x2d, 0xb9, 0xce, 0xa2, 0x32, 0xe9, 0xec, + 0xb4, 0x6c, 0x67, 0xdb, 0xc9, 0x29, 0xc7, 0x8a, 0xb6, 0x69, 0x18, 0xa9, + 0x9c, 0x4c, 0x39, 0xec, 0x72, 0x22, 0xc9, 0xdb, 0xda, 0x22, 0x12, 0xd1, + 0x86, 0x8b, 0xc9, 0xa2, 0x49, 0x86, 0x55, 0xd4, 0x0b, 0x64, 0x41, 0xa3, + 0xbd, 0x59, 0x33, 0x6a, 0x9a, 0x84, 0x56, 0x34, 0xf1, 0xce, 0xcb, 0xeb, + 0x34, 0x58, 0xc9, 0xa5, 0x11, 0x83, 0xdc, 0xe8, 0x32, 0xc3, 0xf1, 0x76, + 0xea, 0xad, 0x18, 0x14, 0x4a, 0x15, 0x42, 0x53, 0x85, 0xf0, 0x64, 0x5a, + 0x08, 0x2d, 0x15, 0xc2, 0xda, 0x54, 0x10, 0x32, 0x2a, 0x03, 0x98, 0x63, + 0xb3, 0xb1, 0xb9, 0xd1, 0x18, 0xe2, 0x45, 0x58, 0xdc, 0x5c, 0x47, 0xd4, + 0xc6, 0xaf, 0xc8, 0xa7, 0xcc, 0x62, 0x50, 0xab, 0xcf, 0x02, 0x21, 0xb3, + 0x2c, 0x18, 0xc0, 0x9c, 0xd8, 0xba, 0x41, 0xab, 0xd2, 0x2c, 0x1c, 0xb8, + 0x54, 0x52, 0xe9, 0x54, 0x27, 0x9b, 0xc9, 0xd2, 0xe3, 0x02, 0x2c, 0xda, + 0x48, 0xfd, 0x8b, 0x0f, 0x78, 0x4d, 0x68, 0x73, 0x13, 0xa6, 0xcc, 0xd1, + 0xae, 0x5b, 0x74, 0x50, 0xc0, 0xaa, 0x84, 0xa0, 0x6c, 0xc4, 0x64, 0xd9, + 0xd8, 0xa4, 0x09, 0x4f, 0x5f, 0x38, 0x2e, 0x0f, 0x19, 0x3e, 0x74, 0x41, + 0x5e, 0xb8, 0x79, 0x00, 0x71, 0x77, 0x9a, 0x83, 0x82, 0x0e, 0x9f, 0x7c, + 0x0a, 0x6e, 0x0f, 0x19, 0x6e, 0xd0, 0x10, 0x2b, 0xb2, 0xce, 0x8b, 0x8c, + 0x7c, 0xb4, 0xbe, 0xbf, 0xa2, 0xf3, 0x71, 0xc3, 0xda, 0x59, 0x4a, 0x8f, + 0xd2, 0x9e, 0x25, 0x92, 0x68, 0xa4, 0x33, 0xd7, 0xad, 0xc3, 0x8a, 0x33, + 0xd5, 0x79, 0x87, 0x61, 0x45, 0x31, 0xb4, 0x45, 0xe3, 0x4c, 0xe9, 0xcd, + 0x55, 0x6e, 0x6a, 0xa2, 0x17, 0x54, 0xb9, 0x3a, 0x93, 0x1d, 0x6c, 0xb4, + 0x0b, 0x58, 0x42, 0xe4, 0x27, 0x9c, 0x49, 0xf9, 0x28, 0xe8, 0xeb, 0x05, + 0x2d, 0x05, 0xac, 0xf2, 0xef, 0x7f, 0x97, 0xf5, 0xd2, 0x56, 0x99, 0xe5, + 0x62, 0xb0, 0xf5, 0x96, 0x6f, 0x84, 0x73, 0x7c, 0x8a, 0x46, 0x8f, 0x1e, + 0xff, 0xf9, 0xbd, 0x2e, 0x46, 0x4e, 0x78, 0xe3, 0x87, 0x43, 0x77, 0xbd, + 0x70, 0xdf, 0x2d, 0xce, 0x9a, 0x6c, 0xca, 0x78, 0xa2, 0x60, 0x7b, 0xec, + 0xac, 0x7c, 0x5b, 0x69, 0x02, 0xb9, 0x36, 0xe9, 0x1f, 0x1b, 0x85, 0xf0, + 0x2c, 0x7b, 0x64, 0xe5, 0x74, 0x32, 0x73, 0x85, 0x98, 0x0b, 0x72, 0x2d, + 0x8e, 0x5c, 0x6b, 0x1e, 0xc8, 0x7d, 0x95, 0xdc, 0x1f, 0xe6, 0x82, 0xe0, + 0x13, 0x8e, 0xe0, 0x93, 0x79, 0x20, 0x38, 0x62, 0x4e, 0x12, 0x73, 0x41, + 0xed, 0x39, 0x47, 0xed, 0xf9, 0x5c, 0x50, 0xcb, 0x93, 0xb4, 0xce, 0x03, + 0xbb, 0xe6, 0x0a, 0xc3, 0xae, 0xb9, 0x32, 0x0f, 0xec, 0x4c, 0x59, 0x95, + 0xe7, 0x81, 0x66, 0x8b, 0xa3, 0xd9, 0x9a, 0x11, 0x4d, 0x34, 0x2e, 0x36, + 0x55, 0x43, 0x98, 0xde, 0x8f, 0x01, 0x89, 0x13, 0xd5, 0x9b, 0x11, 0xf7, + 0xe6, 0xf7, 0x98, 0xd9, 0x72, 0x1a, 0xb9, 0xb9, 0x20, 0x38, 0xdf, 0xd9, + 0xad, 0xa4, 0xde, 0x99, 0x0b, 0x86, 0xf3, 0x9d, 0xde, 0x98, 0x94, 0x69, + 0x5e, 0x68, 0x3d, 0x9c, 0x07, 0x5a, 0xcb, 0xcb, 0x0c, 0xb3, 0xd4, 0x1f, + 0x3d, 0x2d, 0x40, 0x0d, 0xca, 0x55, 0xc6, 0xed, 0x79, 0x15, 0xdc, 0x08, + 0xc0, 0x6a, 0x0b, 0x4a, 0x1a, 0x8c, 0xe6, 0x42, 0xb4, 0x39, 0x4b, 0x9c, + 0x73, 0xd8, 0x2d, 0xbe, 0x0d, 0xf0, 0x18, 0x76, 0x2e, 0xd8, 0xcd, 0x55, + 0xd0, 0xb4, 0xca, 0x05, 0x8d, 0x31, 0x65, 0xeb, 0x6c, 0x1d, 0x69, 0x7d, + 0x0f, 0xa9, 0x43, 0x73, 0x0c, 0xa1, 0x63, 0x04, 0xac, 0x8b, 0x1f, 0x2f, + 0x3a, 0x97, 0x5f, 0xe7, 0x83, 0xe5, 0x7c, 0x45, 0x4f, 0x71, 0xea, 0xe6, + 0xb9, 0x20, 0x3c, 0x0f, 0x49, 0x64, 0xd0, 0xae, 0x6b, 0xc5, 0xa6, 0xa3, + 0x89, 0x68, 0x97, 0x97, 0x8d, 0xec, 0x65, 0x76, 0x79, 0xe1, 0x40, 0x07, + 0x31, 0x6f, 0x59, 0x4f, 0x12, 0xec, 0xf6, 0x5d, 0xd1, 0x40, 0xad, 0xc1, + 0x2f, 0x30, 0x0b, 0xa3, 0xd9, 0xcd, 0xe4, 0x58, 0x29, 0x1a, 0xd3, 0x93, + 0x34, 0xec, 0x93, 0xbc, 0xe9, 0x09, 0x49, 0xde, 0x78, 0x4e, 0x32, 0x97, + 0x6b, 0x56, 0xe0, 0x6a, 0x07, 0x3d, 0x53, 0x9b, 0xab, 0xf3, 0xc9, 0x8a, + 0x36, 0xe2, 0xbe, 0x93, 0x52, 0x87, 0x1e, 0x75, 0xda, 0x16, 0x9c, 0xf7, + 0x08, 0x4e, 0x54, 0x82, 0x95, 0xb9, 0xd4, 0xe6, 0xc7, 0xaa, 0xc8, 0x56, + 0xdd, 0x89, 0x70, 0x34, 0x42, 0xea, 0x94, 0x8d, 0xe5, 0xca, 0x8f, 0x1d, + 0xcb, 0xe6, 0x93, 0x8a, 0x83, 0x99, 0x55, 0xae, 0x63, 0x47, 0xe3, 0xeb, + 0xc2, 0x91, 0x34, 0x1f, 0x08, 0xde, 0x6a, 0x28, 0x35, 0x47, 0xd2, 0x9c, + 0xbe, 0x02, 0x55, 0x6f, 0x8a, 0x4a, 0x29, 0xa7, 0x5f, 0x7b, 0xd8, 0xc8, + 0x57, 0x90, 0x24, 0x38, 0xe7, 0xd4, 0x23, 0x3c, 0xf9, 0x48, 0x27, 0x3b, + 0x17, 0xa7, 0xa6, 0x7e, 0x5e, 0xd3, 0x33, 0x1d, 0x57, 0xd7, 0x9d, 0xb5, + 0xcc, 0xea, 0x2f, 0x5a, 0x67, 0xf4, 0xc3, 0x7d, 0x05, 0x98, 0x5c, 0x02, + 0xc1, 0xd0, 0x13, 0x3b, 0x60, 0xe0, 0xed, 0xc3, 0x3d, 0xc3, 0x61, 0x39, + 0xf3, 0xbc, 0x42, 0xcc, 0xd1, 0xe7, 0x5f, 0xc0, 0x9e, 0x73, 0x6d, 0x00, + 0x9a, 0xae, 0x77, 0x76, 0x99, 0xa6, 0xa3, 0xf5, 0xe5, 0xe5, 0x47, 0x37, + 0x02, 0x3a, 0xdc, 0x75, 0x68, 0xb2, 0x9c, 0x74, 0x5f, 0x3c, 0xba, 0xc1, + 0xfa, 0x93, 0xc7, 0xc3, 0xa8, 0x0b, 0x5b, 0xfc, 0x60, 0xf3, 0xd1, 0x0d, + 0x1e, 0xbe, 0xed, 0x92, 0x53, 0x3e, 0xdc, 0x77, 0x23, 0xb6, 0x5e, 0x6d, + 0x72, 0x26, 0x9e, 0x20, 0x72, 0x07, 0x2b, 0x43, 0xeb, 0xc8, 0x7a, 0xf8, + 0x0a, 0xd9, 0xd8, 0xf5, 0x5d, 0xd8, 0xdb, 0x3b, 0xd9, 0xcf, 0xa6, 0x6b, + 0xe1, 0x6b, 0xdb, 0xa1, 0x4e, 0xa9, 0x19, 0x7f, 0x11, 0xa0, 0xfe, 0x31, + 0x64, 0x01, 0xa6, 0xfe, 0x18, 0xba, 0xa5, 0xd5, 0x92, 0x2e, 0xbc, 0xe9, + 0x1f, 0x45, 0x23, 0xd9, 0x1c, 0xaf, 0x17, 0xa1, 0xaa, 0x87, 0xc8, 0x63, + 0xd3, 0xd0, 0x75, 0x3c, 0x2d, 0x5d, 0x51, 0xab, 0x68, 0xef, 0x1f, 0x1c, + 0x39, 0x03, 0x7f, 0xe8, 0x5f, 0x10, 0x33, 0x54, 0x3e, 0xd6, 0x98, 0xce, + 0x8f, 0x1a, 0xb0, 0x0d, 0x67, 0xcd, 0xb9, 0xdb, 0x29, 0xa6, 0x35, 0xb4, + 0x5a, 0x9c, 0x17, 0x88, 0xc5, 0x19, 0xb0, 0xc4, 0x58, 0x77, 0x78, 0xb5, + 0xe1, 0xe4, 0x98, 0x5a, 0x8a, 0x4e, 0x16, 0x84, 0xa3, 0xe9, 0x87, 0x02, + 0xac, 0xe2, 0x23, 0x5e, 0xda, 0xf4, 0x97, 0xe0, 0x1a, 0x9a, 0x14, 0x2a, + 0x95, 0x1d, 0x0b, 0x6c, 0xe8, 0x78, 0xef, 0xa1, 0x2b, 0x70, 0x29, 0x14, + 0x62, 0x86, 0x0f, 0x7b, 0x1c, 0x02, 0xbc, 0xa2, 0x57, 0x89, 0x3d, 0x77, + 0x3b, 0xc1, 0xbb, 0x2e, 0x8e, 0x4f, 0x6c, 0xf6, 0x0e, 0xbb, 0x93, 0x22, + 0x8e, 0x0a, 0x75, 0x8b, 0x23, 0xf6, 0xf0, 0xe4, 0x58, 0x6c, 0xf4, 0x84, + 0xb8, 0xc6, 0x23, 0x8b, 0x42, 0x3f, 0xf2, 0x13, 0x8b, 0x46, 0x7a, 0x19, + 0x0c, 0x3d, 0x7e, 0x8d, 0x00, 0x4d, 0x87, 0x8a, 0xc1, 0x4b, 0xb8, 0x64, + 0x40, 0x0c, 0x8b, 0x78, 0x40, 0x9e, 0xff, 0x64, 0x7e, 0xc5, 0xd4, 0xdc, + 0xf8, 0x0a, 0x50, 0xbc, 0xd6, 0xac, 0xa1, 0x62, 0x57, 0x13, 0xad, 0xab, + 0xac, 0x0b, 0x62, 0xfb, 0xb2, 0x0c, 0x65, 0x2c, 0xb8, 0x8c, 0x3d, 0x5a, + 0x46, 0xe6, 0x78, 0x41, 0xdc, 0xa9, 0x81, 0xc5, 0xc4, 0xde, 0x01, 0xeb, + 0xe1, 0x5d, 0xd1, 0xec, 0x25, 0xc1, 0x2d, 0x19, 0x77, 0xa8, 0x7f, 0xbb, + 0xb7, 0x52, 0x77, 0x5a, 0x4f, 0x6a, 0x93, 0xc7, 0x8f, 0x6e, 0x16, 0x73, + 0xc6, 0x04, 0x76, 0x64, 0xbd, 0xb7, 0xd8, 0xf8, 0xf8, 0xcc, 0xf7, 0xdc, + 0x27, 0x6e, 0x49, 0x51, 0xea, 0xa4, 0x98, 0x1d, 0x8d, 0x16, 0x15, 0xcb, + 0x3a, 0x85, 0x14, 0x41, 0x3c, 0x13, 0x8f, 0x03, 0x4f, 0xe8, 0x02, 0x51, + 0x52, 0x99, 0x8f, 0x4a, 0x56, 0xfa, 0xa6, 0xc4, 0x63, 0x86, 0x3b, 0x5c, + 0x09, 0x0d, 0x16, 0x6b, 0x7d, 0x13, 0xeb, 0xd7, 0x89, 0xcd, 0xd4, 0x2a, + 0x2e, 0x06, 0x85, 0x3a, 0xa1, 0xee, 0x66, 0x22, 0x30, 0x63, 0x17, 0x2d, + 0x16, 0x9c, 0x7a, 0xa4, 0xac, 0x24, 0x86, 0x8d, 0x72, 0x21, 0x1f, 0xa5, + 0x55, 0xdb, 0x28, 0x31, 0x15, 0xa1, 0x0d, 0xb2, 0x01, 0xcf, 0x5e, 0x51, + 0xff, 0xf0, 0x5c, 0xcd, 0xaf, 0xd3, 0xad, 0x11, 0x8b, 0x3e, 0xf1, 0x20, + 0x51, 0x68, 0x5a, 0x61, 0x68, 0x39, 0x9f, 0x02, 0x53, 0x2f, 0xb3, 0x68, + 0x4d, 0x3c, 0x67, 0xeb, 0x0b, 0x95, 0xed, 0x14, 0x92, 0x00, 0x73, 0xae, + 0xad, 0x18, 0xe8, 0x22, 0xf4, 0x1e, 0x3d, 0xf4, 0x71, 0x4a, 0xbf, 0x3d, + 0x7a, 0xbf, 0xaf, 0xf4, 0x1f, 0x76, 0xbf, 0x4a, 0xa0, 0x36, 0x51, 0x82, + 0xe7, 0x27, 0x34, 0x0b, 0xdb, 0x0b, 0x75, 0x67, 0xe1, 0x25, 0x3e, 0x76, + 0xf0, 0xb1, 0x8b, 0x8f, 0x57, 0xf8, 0x78, 0x8d, 0x8f, 0x37, 0xf8, 0x78, + 0x8b, 0x8f, 0x3d, 0x7c, 0xfc, 0x1d, 0x1f, 0xef, 0xf0, 0xb1, 0x8f, 0x8f, + 0xf7, 0xf8, 0xf8, 0x80, 0x8f, 0x03, 0x7c, 0x1c, 0xe2, 0xe3, 0x1f, 0xf8, + 0xf8, 0x88, 0x8f, 0x36, 0x3e, 0x8e, 0xf0, 0xf1, 0x09, 0x1f, 0xbf, 0xe3, + 0xe3, 0x33, 0x3e, 0xfe, 0x0b, 0x1f, 0xff, 0xc4, 0xc7, 0x7f, 0x2f, 0xe4, + 0x47, 0x34, 0x0b, 0x3e, 0xbe, 0xe9, 0xe0, 0xa3, 0x8b, 0x8f, 0x1e, 0x3e, + 0x02, 0x7c, 0x9c, 0xe3, 0xe3, 0x02, 0x1f, 0x97, 0xf8, 0x08, 0xf1, 0xf1, + 0x27, 0x3e, 0xbe, 0xe0, 0xa3, 0x8f, 0x8f, 0x01, 0x3e, 0x86, 0xf8, 0x88, + 0xf0, 0x31, 0xc2, 0xc7, 0xbf, 0xf0, 0x11, 0xe3, 0x23, 0xc1, 0x47, 0x8a, + 0x8f, 0x31, 0x3e, 0xbe, 0xe2, 0xe3, 0x0a, 0x1f, 0xdf, 0xf0, 0x71, 0x8d, + 0x8f, 0xbf, 0x44, 0x4c, 0x56, 0xf0, 0x4d, 0x13, 0x1f, 0x2d, 0x7c, 0xac, + 0xe2, 0xe3, 0x09, 0x3e, 0xd6, 0xf0, 0xf1, 0x14, 0x1f, 0xcf, 0xf0, 0xf1, + 0x1c, 0x1f, 0xbf, 0xe2, 0x63, 0x09, 0x1f, 0x0d, 0x7c, 0x9c, 0xe2, 0xe3, + 0x7f, 0xf0, 0xe1, 0xe1, 0xa3, 0x86, 0x8f, 0x87, 0xf8, 0xf8, 0x05, 0x1f, + 0xeb, 0xf8, 0xa8, 0x2f, 0xd0, 0x7b, 0x68, 0xf4, 0x62, 0x4a, 0xf7, 0x12, + 0xaf, 0xa5, 0xf4, 0xd4, 0x4b, 0x29, 0x6c, 0xa4, 0xce, 0xc4, 0x9b, 0xd0, + 0x25, 0x71, 0x6a, 0x71, 0x4d, 0xe3, 0x4b, 0x03, 0x5f, 0x2d, 0xf0, 0x54, + 0x15, 0x80, 0x4f, 0xf2, 0x0f, 0x59, 0xec, 0x48, 0x10, 0x8b, 0x97, 0xb1, + 0xfe, 0x81, 0x05, 0x8d, 0x4c, 0x28, 0x6f, 0xe5, 0x9f, 0x0d, 0xb1, 0x22, + 0xb5, 0x13, 0x5c, 0xd2, 0xa8, 0x0e, 0x37, 0xf5, 0x37, 0x5d, 0xbc, 0xed, + 0xf0, 0xf8, 0x6f, 0xdf, 0xfc, 0x8d, 0x6f, 0xcf, 0x9e, 0x3e, 0xcf, 0x3f, + 0x0a, 0xcb, 0x71, 0xf6, 0x8e, 0x85, 0xa3, 0xa5, 0xb0, 0x38, 0xf2, 0xf9, + 0x55, 0xf1, 0x33, 0xb6, 0x08, 0xd7, 0xe8, 0xe5, 0x96, 0x85, 0x05, 0x71, + 0x4a, 0x30, 0xb4, 0x71, 0x36, 0x24, 0x64, 0x05, 0xcf, 0x88, 0x2a, 0x2f, + 0x19, 0x41, 0xfa, 0x02, 0xff, 0xd8, 0xa4, 0x67, 0xce, 0xfa, 0x1a, 0x20, + 0x80, 0x54, 0xc4, 0xa4, 0x32, 0xd1, 0x30, 0xee, 0xa0, 0xd7, 0x07, 0xf9, + 0x13, 0x12, 0x85, 0x1d, 0xfe, 0xfb, 0x4d, 0x5c, 0x7a, 0xb9, 0x8b, 0x3b, + 0x7c, 0x58, 0x5c, 0xd4, 0xef, 0xcb, 0x04, 0xa5, 0xde, 0x0c, 0xe2, 0x38, + 0x2a, 0x07, 0xe3, 0x41, 0xdf, 0xbe, 0x74, 0x5a, 0x57, 0xff, 0x90, 0x2e, + 0xf9, 0x65, 0x60, 0x70, 0xd0, 0x00, 0x0c, 0x93, 0x30, 0x54, 0xc4, 0x62, + 0xf7, 0x3d, 0x72, 0x21, 0x12, 0x94, 0x76, 0xaf, 0xa8, 0x05, 0x7e, 0xc5, + 0xb5, 0xee, 0x34, 0x57, 0x6a, 0xb5, 0x9a, 0xb6, 0x03, 0x91, 0x57, 0x3a, + 0x85, 0xa2, 0xb2, 0x96, 0xb9, 0xdc, 0x09, 0x87, 0x64, 0xcc, 0x12, 0x0c, + 0x92, 0xa7, 0x09, 0x4d, 0x55, 0x65, 0x89, 0xd9, 0xe5, 0x51, 0x02, 0x8f, + 0xff, 0x68, 0xf8, 0x78, 0x58, 0xfc, 0x72, 0x7c, 0x7e, 0x0e, 0x0b, 0x42, + 0x4d, 0xab, 0x23, 0x7c, 0x35, 0x2c, 0x11, 0xc2, 0x57, 0xf1, 0x4e, 0x23, + 0x2c, 0x0a, 0x92, 0xbc, 0x36, 0x5e, 0xa1, 0x64, 0x17, 0x89, 0xeb, 0xd4, + 0x87, 0x02, 0xd7, 0x92, 0x5f, 0x4c, 0xcc, 0x51, 0xe0, 0x5a, 0x94, 0x28, + 0x57, 0x91, 0xa5, 0xf5, 0x87, 0xde, 0x9d, 0x90, 0x5a, 0xd6, 0xee, 0xab, + 0x0a, 0xe8, 0xd7, 0x1d, 0x0d, 0x1f, 0xf9, 0x84, 0x7c, 0xb2, 0x51, 0x75, + 0x27, 0x6f, 0xb6, 0x0d, 0x98, 0x16, 0xa7, 0x9c, 0x75, 0x70, 0x98, 0x39, + 0x63, 0x08, 0x74, 0xe6, 0x27, 0x94, 0xf9, 0x27, 0x61, 0x92, 0xa0, 0xe9, + 0x0b, 0xed, 0x7c, 0xeb, 0xfa, 0x2b, 0xc5, 0x53, 0x97, 0xdf, 0x8d, 0xcb, + 0xee, 0x5d, 0x6d, 0x68, 0x55, 0x5a, 0x06, 0x28, 0xad, 0x02, 0x28, 0xe4, + 0x82, 0x96, 0x0e, 0x66, 0xd5, 0x00, 0x66, 0xb5, 0x00, 0x0c, 0xde, 0xe4, + 0xd2, 0xa1, 0xac, 0x19, 0xa0, 0xac, 0x59, 0xa0, 0x64, 0xd7, 0xba, 0x74, + 0x30, 0x4f, 0x0d, 0x60, 0x9e, 0x9a, 0xc1, 0xec, 0x1e, 0x7c, 0xfe, 0xd0, + 0xde, 0xd9, 0xde, 0x7f, 0x65, 0x00, 0xf3, 0xc4, 0x5c, 0x85, 0x5f, 0x36, + 0xd3, 0x2a, 0x34, 0x6d, 0x15, 0x9e, 0x3e, 0xff, 0xb6, 0xf6, 0xec, 0xa9, + 0x5e, 0xa1, 0xd5, 0x5c, 0x47, 0x9d, 0xa4, 0x73, 0x8d, 0x51, 0xba, 0x9c, + 0xa6, 0xf6, 0xb9, 0x25, 0x7e, 0x6e, 0x19, 0x61, 0xbf, 0xfc, 0xe7, 0xe1, + 0x76, 0xbb, 0x2d, 0x80, 0xee, 0xd1, 0x28, 0xbf, 0x66, 0x4c, 0x76, 0x3e, + 0xb5, 0x8f, 0x0e, 0xde, 0xbb, 0x25, 0xa2, 0xe7, 0x55, 0x1c, 0x47, 0xf1, + 0x47, 0x34, 0xe4, 0x28, 0x42, 0x48, 0xd0, 0xed, 0xe4, 0x1a, 0xdb, 0xc3, + 0xde, 0xde, 0x30, 0x4c, 0x51, 0xb2, 0xad, 0xac, 0x88, 0xfc, 0x6e, 0x2c, + 0xa6, 0x2e, 0x16, 0x8a, 0x86, 0xaf, 0x4a, 0x22, 0xb3, 0xaa, 0x4f, 0xb6, + 0xa5, 0x16, 0xbd, 0xde, 0xd6, 0x1d, 0xb3, 0x21, 0xcf, 0x34, 0x8d, 0x43, + 0x40, 0xf3, 0xd3, 0x1e, 0x73, 0xfc, 0x90, 0x36, 0x01, 0x78, 0xb1, 0xe2, + 0x0d, 0xcc, 0xe2, 0xd4, 0x4f, 0xc7, 0xf9, 0x76, 0xc4, 0xa0, 0xe9, 0x52, + 0x10, 0x6a, 0x93, 0x25, 0xdb, 0x8b, 0x12, 0xcb, 0xa3, 0xc9, 0x48, 0xa5, + 0x96, 0x11, 0x06, 0xe9, 0x32, 0xec, 0x05, 0x78, 0x2f, 0x91, 0x58, 0xe6, + 0x9a, 0xb2, 0x43, 0xf0, 0x24, 0xbb, 0xf2, 0x69, 0x25, 0x97, 0xb6, 0xdb, + 0xb0, 0x16, 0xcc, 0x6c, 0x15, 0xb8, 0xf9, 0x0e, 0x13, 0xd1, 0x20, 0x05, + 0xf2, 0x37, 0xf4, 0x71, 0x41, 0xf7, 0xce, 0xc7, 0xc3, 0x2e, 0x1d, 0x45, + 0xf2, 0x57, 0x76, 0x9b, 0x75, 0x44, 0xeb, 0xd4, 0xc9, 0x6b, 0xf2, 0x9d, + 0xbd, 0xc9, 0x57, 0x2f, 0x60, 0xe8, 0xac, 0x22, 0xa7, 0x39, 0x91, 0xe4, + 0xb0, 0xa8, 0x46, 0x69, 0x84, 0xca, 0x59, 0x03, 0x9a, 0x03, 0x2c, 0x71, + 0x3d, 0xec, 0xf1, 0x2a, 0xb5, 0x5a, 0x9d, 0x63, 0x04, 0xad, 0x25, 0x51, + 0xff, 0x6b, 0xe0, 0x1d, 0x9f, 0xe0, 0xd2, 0x8b, 0xb8, 0x62, 0x10, 0x66, + 0xd8, 0x72, 0xe4, 0xa8, 0x32, 0x77, 0x10, 0x7e, 0x47, 0x0d, 0xaf, 0x68, + 0x1a, 0x0d, 0x2b, 0x3d, 0xa5, 0x84, 0xb6, 0x5f, 0x92, 0x0a, 0x10, 0x47, + 0x16, 0x71, 0x41, 0x10, 0x8a, 0x5f, 0xc5, 0x21, 0xea, 0x16, 0x72, 0xf9, + 0xba, 0xf3, 0x50, 0x7a, 0xc1, 0x06, 0x8a, 0x72, 0x8e, 0x84, 0x9d, 0xa7, + 0x15, 0xcc, 0xaf, 0x21, 0x90, 0xbe, 0xec, 0xa8, 0x1b, 0x37, 0x8b, 0xa1, + 0x48, 0x2f, 0x55, 0x65, 0x0f, 0x68, 0xeb, 0x8e, 0x5e, 0x14, 0xba, 0xa4, + 0xbd, 0x94, 0xba, 0xa5, 0x21, 0xea, 0x19, 0x2b, 0x28, 0xea, 0xa7, 0x36, + 0x54, 0x32, 0x39, 0xd4, 0x7e, 0x16, 0xe9, 0x95, 0xd4, 0x0e, 0xc6, 0xa2, + 0x08, 0x6d, 0xe6, 0x23, 0xe2, 0x4a, 0x76, 0x30, 0x05, 0xfe, 0x8d, 0xa8, + 0x2e, 0x6a, 0x1e, 0x57, 0x34, 0x0a, 0x97, 0x5b, 0xb3, 0x19, 0x1f, 0x95, + 0xcb, 0x90, 0x95, 0xdc, 0xc3, 0x32, 0xec, 0x3b, 0x51, 0xef, 0xba, 0x41, + 0xb6, 0x3e, 0xc4, 0x13, 0x8b, 0x36, 0xee, 0x09, 0x91, 0x6e, 0x96, 0x70, + 0xf2, 0xbb, 0xb5, 0x02, 0x6b, 0xb8, 0xa6, 0xe2, 0x32, 0x84, 0x95, 0x26, + 0x8b, 0x91, 0xae, 0xe0, 0x67, 0x66, 0xc3, 0xd9, 0xef, 0xf5, 0x4a, 0x10, + 0x2e, 0x6e, 0x5a, 0x1e, 0x40, 0xb7, 0x91, 0x05, 0x24, 0xaa, 0x49, 0x3e, + 0x84, 0xf2, 0x6c, 0x2d, 0x76, 0x26, 0x54, 0xf8, 0xcb, 0x38, 0x7d, 0x28, + 0x5f, 0x4e, 0x37, 0x53, 0x04, 0x6b, 0x89, 0x64, 0x11, 0x97, 0x60, 0x59, + 0x8c, 0xe0, 0xd0, 0x73, 0x0d, 0x62, 0x29, 0xaf, 0x18, 0x07, 0xbc, 0x0c, + 0x68, 0xc9, 0x58, 0x9a, 0xc6, 0x44, 0x07, 0x52, 0x71, 0x54, 0x64, 0x2a, + 0x56, 0x1c, 0x95, 0x9c, 0xd4, 0x99, 0xea, 0xdf, 0x4f, 0x68, 0x60, 0x82, + 0x75, 0xe7, 0x86, 0x5f, 0x60, 0x24, 0x42, 0xe8, 0x4b, 0x70, 0x5d, 0x77, + 0xc8, 0x61, 0x80, 0x42, 0x56, 0x3e, 0x56, 0xbc, 0xa2, 0x3c, 0x82, 0xd9, + 0x5b, 0x10, 0xd9, 0x37, 0x93, 0x8d, 0xa2, 0x8a, 0xc7, 0xd0, 0x04, 0xde, + 0x98, 0x20, 0x8d, 0x6c, 0x08, 0x77, 0x98, 0xbb, 0x7e, 0x9f, 0x97, 0x45, + 0xdd, 0x3d, 0x0d, 0x06, 0x9e, 0x9b, 0x53, 0x2d, 0x5b, 0x3e, 0x61, 0xb8, + 0xfe, 0xde, 0x3e, 0xf8, 0xd0, 0xa0, 0x76, 0xd7, 0xf0, 0xfc, 0xda, 0x33, + 0x34, 0x52, 0xab, 0x49, 0x71, 0x51, 0x08, 0x83, 0xa1, 0x51, 0xba, 0xb4, + 0x4f, 0x04, 0x34, 0xd9, 0xf7, 0x78, 0x12, 0x46, 0x17, 0x45, 0x18, 0x91, + 0x95, 0xca, 0xbd, 0x99, 0x88, 0xb3, 0x97, 0xa9, 0x8e, 0x36, 0x02, 0x88, + 0x71, 0x23, 0xe8, 0x20, 0x29, 0xde, 0xc8, 0x38, 0x65, 0xf8, 0x2b, 0x7d, + 0x3f, 0xab, 0x2e, 0xe2, 0x49, 0x3f, 0xec, 0xc2, 0x52, 0xee, 0xf7, 0xfb, + 0x79, 0x25, 0x6d, 0x55, 0x13, 0x9d, 0xd4, 0x11, 0x7c, 0xd8, 0x23, 0x80, + 0xb3, 0x43, 0xfc, 0x53, 0x62, 0xf6, 0x86, 0xff, 0xc9, 0x36, 0x4f, 0x68, + 0xb4, 0x9a, 0x6f, 0xac, 0xe0, 0xbe, 0x5c, 0x72, 0x6a, 0x41, 0xa6, 0x35, + 0xb6, 0x2e, 0xdc, 0x9c, 0xaf, 0xe6, 0xea, 0x2b, 0xe8, 0xde, 0xfa, 0x5d, + 0x32, 0x72, 0x2b, 0x49, 0x5e, 0xc0, 0xe4, 0x59, 0x67, 0xbf, 0x0d, 0x0e, + 0xdc, 0x74, 0xdd, 0x0f, 0x1a, 0x0c, 0x26, 0xf3, 0xa0, 0x7e, 0x90, 0x5f, + 0xd3, 0x70, 0x3b, 0xe8, 0x22, 0x91, 0xc7, 0x3e, 0xc3, 0x68, 0x5d, 0xd1, + 0x30, 0xd0, 0x45, 0x1f, 0x3f, 0x72, 0x2c, 0xf6, 0x36, 0xc8, 0xef, 0xf8, + 0xb0, 0x0b, 0x3a, 0xce, 0x96, 0x7c, 0x48, 0x1d, 0x07, 0x50, 0x24, 0x49, + 0xb7, 0x87, 0xe1, 0x80, 0x78, 0xbb, 0xbc, 0x46, 0x67, 0x36, 0xa3, 0xba, + 0x5c, 0x76, 0x9e, 0x67, 0x6c, 0x75, 0xa3, 0x0a, 0x88, 0x5b, 0x9d, 0xed, + 0x15, 0x5f, 0x68, 0x92, 0xaf, 0x09, 0x4d, 0xf4, 0x41, 0xa5, 0x44, 0xc4, + 0x94, 0xd2, 0x87, 0x51, 0xac, 0x6e, 0x78, 0xb2, 0x05, 0x91, 0xff, 0xc1, + 0xf6, 0x19, 0x6c, 0xf0, 0x80, 0x77, 0x40, 0x69, 0x85, 0x05, 0x2b, 0xbd, + 0xf6, 0xdc, 0xa5, 0xa5, 0xaf, 0x00, 0x04, 0xd3, 0xba, 0x2d, 0x5d, 0x52, + 0xaf, 0xa7, 0x3a, 0x6c, 0x41, 0x86, 0xbd, 0xe8, 0x8a, 0x8a, 0x53, 0x8a, + 0xb3, 0xb3, 0xe8, 0xb8, 0xa3, 0x6f, 0xae, 0x38, 0x55, 0x04, 0xdd, 0xdf, + 0x7e, 0x8c, 0x0d, 0x34, 0xa0, 0x31, 0x17, 0x14, 0x86, 0x25, 0x88, 0x20, + 0xbf, 0x32, 0x46, 0x5a, 0x27, 0x4c, 0x52, 0x53, 0x9d, 0x52, 0x5e, 0xe3, + 0x7e, 0x80, 0x47, 0x26, 0xa3, 0x3b, 0x22, 0x6c, 0x4b, 0x32, 0x37, 0x09, + 0x17, 0xb4, 0x33, 0xcb, 0x53, 0xf4, 0x45, 0xe4, 0x11, 0x74, 0xc2, 0xb8, + 0x22, 0x57, 0x3b, 0xc9, 0x8e, 0xc2, 0x3b, 0x7b, 0x7b, 0x74, 0x74, 0xe8, + 0x3c, 0xba, 0xc9, 0x8a, 0x27, 0x04, 0xf2, 0xc4, 0x59, 0xd2, 0x5f, 0xe2, + 0x68, 0x64, 0xa7, 0x04, 0xd2, 0x79, 0x2c, 0x2f, 0x28, 0xe0, 0x8c, 0xd2, + 0x73, 0x1f, 0x85, 0x21, 0x2c, 0x3b, 0x44, 0x70, 0x60, 0x22, 0x0a, 0x4d, + 0x4b, 0xc4, 0x52, 0xe4, 0x08, 0x1b, 0x31, 0xc2, 0x92, 0x1f, 0xc9, 0x0b, + 0xbe, 0xcd, 0xa2, 0x9f, 0x51, 0x79, 0x79, 0xf5, 0x15, 0xc6, 0x0c, 0x35, + 0x19, 0x74, 0x38, 0xf2, 0x48, 0x74, 0x11, 0x20, 0x99, 0x17, 0xe0, 0x6b, + 0x85, 0xc1, 0x7b, 0x11, 0x8b, 0x31, 0xe1, 0xb1, 0xea, 0x6c, 0x83, 0x92, + 0x5b, 0x88, 0x04, 0xd0, 0xf8, 0xdf, 0x76, 0xb2, 0x2d, 0x58, 0xe7, 0x08, + 0x9e, 0xd9, 0x1e, 0xab, 0xc3, 0x73, 0xc4, 0xf0, 0x34, 0x40, 0xd9, 0x06, + 0xa6, 0x17, 0xb1, 0xe4, 0x2d, 0xca, 0xb1, 0x4f, 0x90, 0xb2, 0x4a, 0xd8, + 0x1d, 0x16, 0x94, 0x0a, 0x5f, 0x62, 0xa0, 0xce, 0xdc, 0xa3, 0x02, 0xdf, + 0xa4, 0x98, 0x24, 0x39, 0x7f, 0x45, 0xcd, 0x8d, 0xee, 0x72, 0x32, 0x0a, + 0xcf, 0xcf, 0x93, 0xe5, 0x5e, 0x18, 0xbb, 0xba, 0x71, 0x91, 0x5a, 0x15, + 0x1b, 0x7f, 0x26, 0xd1, 0xd0, 0x60, 0x47, 0x24, 0xf9, 0x6a, 0x14, 0x72, + 0x08, 0xc8, 0xe0, 0xc1, 0x7e, 0x8e, 0x14, 0xf5, 0xcb, 0xa2, 0x28, 0x90, + 0xd7, 0xda, 0xbd, 0x3f, 0x66, 0x56, 0xc0, 0x0d, 0x64, 0x56, 0x86, 0x9c, + 0x18, 0x8c, 0xfc, 0xf4, 0x92, 0x2e, 0x03, 0x06, 0xe1, 0xa2, 0x58, 0x4f, + 0x79, 0x77, 0x58, 0xea, 0x96, 0x17, 0x08, 0x66, 0xf3, 0xd1, 0x0d, 0x82, + 0xb0, 0x1e, 0x7c, 0x1a, 0x98, 0xba, 0xe8, 0x22, 0x9a, 0x18, 0x77, 0xc4, + 0x60, 0x49, 0xe6, 0x05, 0x80, 0x61, 0xce, 0x1e, 0xdd, 0xe0, 0x38, 0x4c, + 0x96, 0x1f, 0xdd, 0x90, 0xae, 0x6b, 0x87, 0x5e, 0x94, 0x81, 0x86, 0x81, + 0xe8, 0xc9, 0xa3, 0x74, 0xcc, 0x36, 0x1b, 0x05, 0xac, 0x1f, 0x3f, 0xb6, + 0x58, 0x7e, 0x0b, 0x0e, 0x1d, 0x75, 0x35, 0x80, 0xee, 0xe6, 0xd9, 0x56, + 0x7e, 0x43, 0x3b, 0x94, 0xb4, 0x0f, 0x39, 0x13, 0x4a, 0x84, 0xc3, 0xf3, + 0xc0, 0x57, 0xd9, 0x10, 0x4a, 0x91, 0xad, 0xce, 0xed, 0x11, 0xc9, 0x30, + 0x84, 0x9d, 0xc0, 0x3d, 0xc7, 0x34, 0x5e, 0x18, 0xaa, 0x61, 0x62, 0x6c, + 0xbd, 0x4a, 0x31, 0xaf, 0xa4, 0x10, 0x75, 0x14, 0x3d, 0x01, 0x32, 0xea, + 0x4f, 0x5c, 0x8d, 0xca, 0x35, 0x34, 0x15, 0xff, 0x32, 0x08, 0x2c, 0x92, + 0xa0, 0xf2, 0xd6, 0xc2, 0xd4, 0x03, 0x3f, 0x1c, 0xbe, 0xe5, 0xc2, 0x47, + 0xbe, 0x2e, 0xe6, 0x99, 0xe0, 0x6e, 0x6d, 0xe1, 0x49, 0xbd, 0xf3, 0xd8, + 0x69, 0xad, 0xad, 0xd5, 0x2b, 0x15, 0x6f, 0x3e, 0x9d, 0xaa, 0xf8, 0xf3, + 0xa9, 0x4a, 0xaf, 0x68, 0xa5, 0x4f, 0xd4, 0x1e, 0xd2, 0x8d, 0x1e, 0x57, + 0x0b, 0xe5, 0x2e, 0x36, 0x1a, 0x8d, 0x9c, 0x00, 0x75, 0xf5, 0x93, 0x4a, + 0x41, 0x58, 0x95, 0xc2, 0x14, 0x43, 0xb8, 0xb1, 0xe3, 0x42, 0xc2, 0x2a, + 0x5d, 0xf9, 0x72, 0x5e, 0x4d, 0x83, 0x32, 0x1d, 0xaf, 0x31, 0x7e, 0x03, + 0x4c, 0xe1, 0xc9, 0xcc, 0x4b, 0xcc, 0xea, 0x84, 0x51, 0xec, 0x3c, 0x25, + 0xe2, 0xe4, 0x79, 0xad, 0x56, 0xb3, 0x4e, 0x50, 0x2d, 0x4e, 0x22, 0x30, + 0xe0, 0xf1, 0x49, 0xcd, 0x48, 0x2b, 0x2e, 0x96, 0x5e, 0xf6, 0xa3, 0x0e, + 0x69, 0x84, 0xfc, 0x71, 0xac, 0x34, 0x27, 0xd0, 0xb2, 0x06, 0x80, 0x9c, + 0x33, 0x72, 0x1c, 0xc9, 0xaf, 0x11, 0xd3, 0x84, 0x4a, 0xb2, 0x28, 0x43, + 0xd3, 0xd8, 0x99, 0x75, 0x63, 0x3f, 0x95, 0xc8, 0x3a, 0xab, 0x19, 0xce, + 0x36, 0xb2, 0x45, 0xce, 0xba, 0xb4, 0xde, 0x88, 0xc1, 0xa3, 0x9c, 0x89, + 0xaa, 0x8f, 0x89, 0x4e, 0x40, 0x58, 0x9f, 0x4a, 0x28, 0x3d, 0xb6, 0x27, + 0x5b, 0x0e, 0x55, 0xb1, 0x42, 0xcc, 0xa1, 0x4c, 0xa2, 0xb0, 0xa3, 0x29, + 0xb2, 0x9d, 0xf0, 0x9e, 0xd4, 0x9d, 0xa7, 0x82, 0x6e, 0x2f, 0x94, 0x3e, + 0x5e, 0x39, 0x21, 0xfe, 0x38, 0x2b, 0xdf, 0x9e, 0x75, 0x70, 0xef, 0x23, + 0x7e, 0x6a, 0xf2, 0x4f, 0x2d, 0xc9, 0x85, 0x56, 0xe8, 0x81, 0x42, 0x24, + 0x1e, 0xbf, 0x5b, 0x35, 0xa0, 0x00, 0xf1, 0xb6, 0x31, 0xcc, 0x90, 0xe7, + 0xee, 0x0d, 0x69, 0x4a, 0x35, 0xb6, 0x4a, 0x23, 0x3b, 0x2b, 0x37, 0xa2, + 0xed, 0xe6, 0x64, 0xb1, 0x5d, 0x6d, 0x03, 0x93, 0x35, 0x5d, 0x93, 0x44, + 0xdc, 0x7c, 0xe0, 0x28, 0x18, 0x4a, 0x8e, 0x27, 0xb3, 0x82, 0xde, 0x28, + 0x75, 0x25, 0xeb, 0xac, 0x48, 0x43, 0x0a, 0x23, 0x56, 0x77, 0x3a, 0x4d, + 0xf9, 0x5d, 0x13, 0xdf, 0xb5, 0xe4, 0x77, 0x2d, 0x7c, 0xb7, 0x2a, 0xbf, + 0x5b, 0x3d, 0xd1, 0xb9, 0x86, 0x89, 0x68, 0x0f, 0xda, 0xf9, 0xed, 0x37, + 0x22, 0x50, 0x17, 0xe1, 0x47, 0x13, 0x7f, 0xa0, 0xb8, 0xc4, 0x1f, 0x2d, + 0xfc, 0xf1, 0x1c, 0xff, 0xee, 0xac, 0x1a, 0x00, 0x90, 0xd5, 0x01, 0x40, + 0x08, 0xa2, 0xc1, 0xc4, 0x82, 0x42, 0x73, 0x8b, 0xce, 0x13, 0x51, 0x51, + 0x12, 0x44, 0x98, 0x29, 0x4a, 0x66, 0x57, 0x2c, 0xcb, 0x43, 0x57, 0xea, + 0x78, 0x98, 0xb6, 0xfe, 0x22, 0x86, 0x35, 0x75, 0x7a, 0xa1, 0x02, 0x45, + 0x2b, 0x35, 0x60, 0x27, 0x9f, 0x78, 0x22, 0x98, 0x5a, 0xae, 0x12, 0xd2, + 0x80, 0xbb, 0x32, 0xf6, 0xba, 0xc2, 0xa8, 0x6b, 0x6b, 0xba, 0x82, 0x69, + 0xd5, 0xdd, 0xf0, 0xcf, 0xcc, 0x9f, 0xce, 0x33, 0x6a, 0x0e, 0x58, 0x84, + 0x05, 0xd0, 0x4a, 0x4c, 0x73, 0x1c, 0xb0, 0xac, 0x13, 0x54, 0x17, 0x25, + 0x72, 0x1c, 0x73, 0xd0, 0x27, 0xda, 0x52, 0x8d, 0xd9, 0x9c, 0xd9, 0x55, + 0x54, 0xa2, 0xe9, 0xb3, 0x9f, 0xa2, 0x42, 0xc4, 0x8b, 0x34, 0xfc, 0xd1, + 0x28, 0x18, 0xf6, 0x3c, 0x9a, 0xb9, 0xae, 0xee, 0xe4, 0x42, 0x59, 0x44, + 0x0b, 0x18, 0xee, 0x86, 0x87, 0x1a, 0x84, 0x0a, 0x80, 0x16, 0xd9, 0xf2, + 0x2e, 0x47, 0xdd, 0x34, 0x48, 0x97, 0x40, 0x89, 0x08, 0xfc, 0x81, 0x0b, + 0x3c, 0x5f, 0x77, 0x38, 0x52, 0xcc, 0xed, 0xce, 0x6b, 0xd6, 0x74, 0x4d, + 0x4b, 0x51, 0xbd, 0x69, 0x76, 0x3d, 0x68, 0x5b, 0x9e, 0x72, 0x03, 0x72, + 0x7d, 0x01, 0x1a, 0x3c, 0x3c, 0x68, 0x1f, 0x29, 0x31, 0x09, 0xd1, 0xdc, + 0xba, 0x9e, 0xf5, 0x41, 0x08, 0x4c, 0x58, 0x41, 0xa5, 0x35, 0xaf, 0x0d, + 0x4c, 0xbe, 0xcf, 0xa8, 0xcf, 0x9a, 0x74, 0x59, 0x16, 0x11, 0xd7, 0x3c, + 0x74, 0x46, 0x75, 0x2e, 0xdf, 0xdf, 0x69, 0xdb, 0x70, 0xf6, 0xbf, 0xa4, + 0xab, 0x9a, 0x05, 0xeb, 0x2c, 0xdd, 0x14, 0xbb, 0x95, 0x3b, 0xd6, 0xf9, + 0x45, 0xee, 0x8f, 0xf9, 0x4a, 0xc0, 0x5c, 0x93, 0x51, 0x70, 0x08, 0x38, + 0xfc, 0x31, 0x3c, 0xec, 0x07, 0x78, 0xf6, 0x7b, 0xe5, 0x87, 0xa9, 0x33, + 0x1e, 0xa6, 0x61, 0x9f, 0x9c, 0x37, 0x42, 0x67, 0x99, 0x8f, 0x7d, 0x82, + 0x99, 0x37, 0x31, 0x1a, 0x7f, 0x08, 0x4b, 0xdd, 0xc1, 0x3b, 0x43, 0x3c, + 0x8d, 0x62, 0xe7, 0x4b, 0x66, 0x3a, 0xe0, 0x19, 0xf6, 0x40, 0x4c, 0x23, + 0xea, 0xfa, 0x26, 0x40, 0x07, 0xab, 0xfb, 0x1b, 0x9a, 0xe8, 0x2e, 0x28, + 0x03, 0xb9, 0x12, 0x43, 0xc4, 0x2b, 0xfc, 0x5f, 0x27, 0x5e, 0xb8, 0x68, + 0x3c, 0xc1, 0xa1, 0x6d, 0xa4, 0xdf, 0x52, 0x57, 0x76, 0xce, 0x03, 0x3a, + 0x7c, 0x05, 0xf2, 0x38, 0xd7, 0xd1, 0x38, 0x76, 0xb0, 0x06, 0xe8, 0x66, + 0x69, 0xe4, 0xf8, 0x64, 0xb2, 0x39, 0x9f, 0x3e, 0xee, 0x3b, 0x9e, 0xef, + 0x24, 0xa3, 0xa0, 0x8b, 0x27, 0x8a, 0xe3, 0x18, 0xef, 0x6f, 0xf8, 0x28, + 0xa0, 0x42, 0x14, 0x0a, 0x58, 0x70, 0xe8, 0x44, 0x54, 0x0a, 0x86, 0x43, + 0x92, 0xa2, 0xb4, 0x13, 0x47, 0x57, 0x30, 0x2c, 0x0b, 0x09, 0x4c, 0x94, + 0x41, 0xc4, 0x4f, 0x34, 0xd9, 0xc2, 0x02, 0x30, 0x3f, 0xc5, 0x28, 0xbb, + 0x00, 0x70, 0x83, 0x9e, 0xac, 0x52, 0xce, 0x83, 0xdf, 0x04, 0x5f, 0xd6, + 0x2f, 0x44, 0x8c, 0x7c, 0x05, 0x44, 0x88, 0xcf, 0x3a, 0xb3, 0x01, 0x0a, + 0xb0, 0xa8, 0x2b, 0x7b, 0x6e, 0xd8, 0xa1, 0xd0, 0x98, 0x59, 0x87, 0x30, + 0x45, 0x06, 0xaa, 0x1d, 0xd0, 0xe2, 0x80, 0xd3, 0x65, 0x1c, 0x9c, 0x23, + 0xda, 0xa4, 0x03, 0xf8, 0x07, 0xa2, 0xcc, 0xbb, 0x4a, 0x65, 0x28, 0x14, + 0x6c, 0x90, 0x62, 0x9b, 0x1c, 0xdf, 0x8d, 0xfc, 0x03, 0xa7, 0x31, 0x4a, + 0x30, 0x20, 0x6c, 0xd6, 0xc4, 0x36, 0x91, 0x56, 0x14, 0x29, 0x06, 0x15, + 0x65, 0xc1, 0x03, 0xfd, 0x30, 0x86, 0xca, 0xb5, 0x9d, 0xcb, 0xb0, 0xdf, + 0xa3, 0x0e, 0xfb, 0x19, 0x8c, 0xdd, 0x30, 0x19, 0xe1, 0x88, 0x33, 0x56, + 0x23, 0x46, 0x0d, 0x27, 0xa2, 0x54, 0xc5, 0x92, 0xbc, 0xdc, 0xd1, 0x65, + 0x98, 0x60, 0xae, 0x58, 0x60, 0x4e, 0xf4, 0x94, 0x8b, 0xaf, 0x1d, 0x3f, + 0xa1, 0xd8, 0x91, 0x8a, 0xc0, 0x2f, 0xbd, 0x08, 0x56, 0x9a, 0x61, 0x94, + 0x3a, 0x98, 0x65, 0x2b, 0x03, 0x01, 0xe4, 0x21, 0x52, 0x1d, 0xfa, 0x16, + 0x7d, 0x13, 0xba, 0xc4, 0x9a, 0x25, 0xb6, 0x15, 0xa2, 0xfc, 0xbe, 0x8f, + 0xc6, 0x49, 0x40, 0x7f, 0xba, 0x04, 0xa4, 0x24, 0x03, 0x3b, 0xe3, 0x0e, + 0x28, 0x15, 0xc9, 0x3a, 0x39, 0x5c, 0x11, 0x02, 0x91, 0x92, 0x30, 0x8c, + 0x34, 0x5a, 0xa5, 0xfc, 0x05, 0xad, 0x69, 0xeb, 0x6c, 0x1a, 0xb0, 0xb8, + 0x87, 0xb5, 0xbc, 0xd7, 0x1f, 0x89, 0xd6, 0x42, 0x29, 0x87, 0x6b, 0xb0, + 0x8d, 0x6e, 0x54, 0xbb, 0x91, 0xe8, 0xc6, 0x8c, 0x33, 0x9f, 0xf7, 0x5e, + 0xef, 0x19, 0x9d, 0xf5, 0x25, 0xbf, 0x81, 0x62, 0xe7, 0x2e, 0x2c, 0xba, + 0x4c, 0xed, 0x5b, 0xe5, 0xae, 0x5d, 0xc5, 0xd6, 0x17, 0x16, 0x26, 0x13, + 0x20, 0xd9, 0x25, 0x1f, 0x91, 0x30, 0x9b, 0x4e, 0x5e, 0xd4, 0x7e, 0x61, + 0x08, 0x8a, 0x34, 0x48, 0x4c, 0x0e, 0x12, 0xcf, 0xc3, 0x1f, 0x15, 0xc5, + 0x7f, 0x42, 0x3b, 0xb5, 0x10, 0xdd, 0xb3, 0x72, 0xf4, 0x8b, 0x02, 0x10, + 0x86, 0xb3, 0x43, 0x3d, 0x69, 0x4d, 0x29, 0xb8, 0x2c, 0xa6, 0xa8, 0xf5, + 0x20, 0xa0, 0x12, 0x56, 0x39, 0x18, 0xf3, 0x31, 0xec, 0xed, 0x30, 0xc3, + 0x80, 0xa6, 0xcc, 0xb2, 0x4b, 0xfd, 0x97, 0xdd, 0xf6, 0xd1, 0xb6, 0xf3, + 0x6f, 0xa7, 0x0d, 0x2c, 0xed, 0x7c, 0xa0, 0xa9, 0xea, 0xdc, 0x8a, 0x97, + 0xce, 0x0a, 0x28, 0x39, 0x53, 0xcf, 0x0d, 0xe3, 0x31, 0x7b, 0xc7, 0x67, + 0xe6, 0x12, 0xd3, 0x78, 0xcc, 0xc8, 0x26, 0xda, 0x60, 0x9c, 0x49, 0xf7, + 0x7a, 0xc8, 0x74, 0xc0, 0x20, 0xaa, 0x93, 0xb3, 0x42, 0x8f, 0x74, 0x21, + 0xee, 0xae, 0xd1, 0xff, 0x02, 0x41, 0x68, 0x67, 0x13, 0x62, 0xd4, 0xdc, + 0x86, 0x70, 0xc6, 0xc8, 0xc2, 0x7e, 0xb1, 0x80, 0xbb, 0xc6, 0x6a, 0x52, + 0x34, 0x5e, 0xb1, 0x2e, 0xb1, 0xc2, 0xf3, 0xaa, 0x4c, 0x59, 0xb7, 0x9f, + 0x3a, 0xeb, 0xa0, 0x0c, 0x84, 0x15, 0x92, 0x5a, 0x2e, 0x2d, 0x05, 0x68, + 0xbf, 0x77, 0x2b, 0x6c, 0xea, 0x4a, 0x74, 0x6f, 0x4d, 0xef, 0x46, 0xa7, + 0x04, 0xa4, 0x92, 0xed, 0xfb, 0x08, 0xbe, 0xf3, 0x7e, 0xd5, 0x64, 0xd3, + 0x35, 0x11, 0xa6, 0x3c, 0x65, 0xab, 0xb8, 0x74, 0xd8, 0x54, 0x67, 0x93, + 0xda, 0x3c, 0xb1, 0x28, 0x75, 0x99, 0x42, 0x77, 0x26, 0xc4, 0xc3, 0xbf, + 0xc2, 0x3b, 0x91, 0x31, 0x55, 0xf0, 0x40, 0x25, 0xe9, 0xd1, 0x17, 0xdd, + 0x3c, 0x53, 0xeb, 0xa3, 0x1b, 0xc2, 0x34, 0x0d, 0x47, 0xd4, 0xf6, 0x92, + 0x08, 0x54, 0x23, 0xca, 0x9e, 0x4c, 0xc9, 0x1b, 0x91, 0xdc, 0xd6, 0x07, + 0xef, 0xce, 0xaa, 0x9a, 0x08, 0x54, 0xe5, 0x8e, 0x29, 0x0e, 0x2e, 0xbb, + 0x93, 0x06, 0xc8, 0x72, 0xfb, 0x10, 0x39, 0x12, 0x5e, 0x76, 0x2b, 0x6e, + 0xf2, 0xcd, 0x1a, 0x1e, 0x61, 0x50, 0x16, 0x85, 0xbc, 0xf0, 0x84, 0xa9, + 0x68, 0x82, 0x9b, 0x6c, 0x26, 0x7a, 0xed, 0x2c, 0xf6, 0xb4, 0x2c, 0x19, + 0xdd, 0x0d, 0x63, 0xf0, 0x5f, 0x31, 0x34, 0xba, 0xc8, 0xdd, 0xd2, 0xf2, + 0x8a, 0x27, 0xcb, 0x2f, 0xaa, 0xdf, 0x71, 0xb2, 0x80, 0xd7, 0x02, 0x35, + 0x2a, 0x0e, 0x78, 0x22, 0x8d, 0xea, 0xce, 0xaa, 0xd9, 0x03, 0xcf, 0x3c, + 0x51, 0xca, 0xb1, 0x55, 0xd7, 0x7a, 0xba, 0x8f, 0x03, 0xbd, 0x3a, 0xf8, + 0x96, 0x1a, 0x54, 0x01, 0xc1, 0x8d, 0xce, 0x38, 0xe3, 0x95, 0x7e, 0x29, + 0xd7, 0x2d, 0xf3, 0x5d, 0x17, 0x00, 0x61, 0xa2, 0xe3, 0x81, 0x1c, 0x02, + 0x90, 0x7e, 0xd3, 0x77, 0x0e, 0xcc, 0x56, 0xfb, 0xc7, 0xd0, 0xb4, 0x5b, + 0x21, 0xfb, 0x7f, 0x0c, 0x5c, 0x44, 0x10, 0xc3, 0x3f, 0x78, 0xf9, 0xba, + 0x5b, 0xb3, 0x95, 0xc7, 0x74, 0x19, 0x04, 0x83, 0xba, 0x13, 0x0c, 0x89, + 0x29, 0x3e, 0xe8, 0x51, 0x01, 0x71, 0x52, 0x9c, 0x41, 0xe7, 0xc6, 0xb1, + 0xd6, 0x54, 0xfd, 0xbc, 0x95, 0x19, 0xb1, 0xee, 0x1c, 0x9f, 0xd8, 0xce, + 0x3b, 0xb0, 0x7a, 0x62, 0xbe, 0xa9, 0x42, 0x3e, 0x29, 0xa9, 0x7a, 0x12, + 0xe6, 0xaf, 0x60, 0x3c, 0xa2, 0x82, 0x15, 0x06, 0x4a, 0x4d, 0x7e, 0x4b, + 0x63, 0x7a, 0x61, 0x25, 0xa1, 0xb7, 0x1c, 0xf0, 0x7f, 0xba, 0xd4, 0x08, + 0x19, 0xd2, 0x7e, 0x4b, 0x7b, 0x5a, 0x2a, 0x39, 0x87, 0x1c, 0xdd, 0x6e, + 0xba, 0xd1, 0xc8, 0xef, 0x86, 0xe9, 0xf5, 0x3a, 0x9e, 0x6a, 0xb1, 0xbb, + 0x09, 0x14, 0x46, 0xd6, 0x7f, 0x8c, 0xcb, 0xb1, 0x8c, 0x5e, 0xa1, 0x13, + 0x9e, 0x5c, 0x3e, 0xed, 0x49, 0xb0, 0xb7, 0xc4, 0x66, 0xb5, 0xaf, 0x7a, + 0x12, 0x3b, 0x56, 0x3c, 0xa3, 0x2b, 0xba, 0x1b, 0x10, 0x6f, 0x03, 0x67, + 0x9d, 0xfe, 0x71, 0x4a, 0xc2, 0xe8, 0x4a, 0xa0, 0xe0, 0xef, 0x78, 0xeb, + 0x4c, 0x32, 0x5a, 0xe6, 0x3e, 0x12, 0x1a, 0xa1, 0x2f, 0xd3, 0x41, 0xbf, + 0x70, 0x07, 0x5f, 0xa2, 0xde, 0x99, 0x6c, 0x90, 0xc4, 0x22, 0x0c, 0x70, + 0x0d, 0xcb, 0xe1, 0x34, 0xc2, 0x08, 0x41, 0x6c, 0x54, 0xa8, 0x59, 0xc5, + 0x4d, 0xd0, 0x5c, 0x9b, 0x69, 0x10, 0x95, 0x7c, 0xf6, 0x2c, 0x4a, 0x08, + 0x75, 0xcb, 0xe2, 0x02, 0x5b, 0x3d, 0xa8, 0x96, 0x9a, 0xcc, 0x49, 0xaf, + 0x2b, 0x22, 0x50, 0x99, 0xd4, 0x6d, 0xc0, 0x0a, 0x77, 0x11, 0xa4, 0x72, + 0x94, 0x3c, 0xd3, 0x1d, 0xdd, 0x24, 0xbf, 0xa0, 0x5b, 0x5d, 0xc5, 0x10, + 0x55, 0x4a, 0xbb, 0x96, 0x61, 0xa1, 0x72, 0x19, 0x91, 0xec, 0xe4, 0x2d, + 0x18, 0x1f, 0x85, 0x96, 0xe9, 0xf6, 0xa1, 0xc1, 0x45, 0x78, 0xaa, 0x2d, + 0xd3, 0x3c, 0xf5, 0x23, 0xb7, 0x37, 0x1e, 0x0c, 0x32, 0xbd, 0xf6, 0xc7, + 0xaa, 0x3f, 0x2e, 0x75, 0xc9, 0x44, 0x73, 0x16, 0xe8, 0x37, 0xdb, 0x87, + 0xc4, 0xed, 0x28, 0xd3, 0x6f, 0x04, 0xd5, 0x27, 0xd7, 0x41, 0x48, 0xbe, + 0x7a, 0xa2, 0x1e, 0x15, 0x59, 0xb4, 0x6e, 0xad, 0xec, 0x34, 0x7f, 0x6d, + 0x35, 0x9a, 0x4f, 0x9f, 0x37, 0x9e, 0x34, 0x9a, 0xb7, 0x55, 0x73, 0x88, + 0xaf, 0x05, 0xcf, 0x7e, 0x89, 0xd8, 0x99, 0xb6, 0xf5, 0xac, 0x37, 0x3b, + 0xa4, 0x00, 0x7a, 0x87, 0xd2, 0xdf, 0x9a, 0x25, 0x5b, 0x2a, 0xfd, 0x8e, + 0x5e, 0x8f, 0x67, 0x2c, 0xa2, 0x4f, 0x18, 0xf6, 0x65, 0xe9, 0x4b, 0x70, + 0x2d, 0x5b, 0xfa, 0xe9, 0x84, 0x93, 0x95, 0x7e, 0x2d, 0x6f, 0xd0, 0x71, + 0xd1, 0x47, 0xe4, 0x58, 0xb6, 0x90, 0x65, 0x51, 0x10, 0xe9, 0x2c, 0x56, + 0x73, 0xa7, 0xd1, 0x08, 0x3b, 0x3c, 0x93, 0x8f, 0x7c, 0x9f, 0x84, 0xbd, + 0x65, 0x55, 0x8f, 0xf3, 0x56, 0xd4, 0xd4, 0x5d, 0x4a, 0x50, 0x9c, 0x1c, + 0x26, 0xc9, 0xc3, 0xa3, 0x03, 0x25, 0x46, 0xd4, 0x69, 0xa0, 0x8a, 0x11, + 0x3c, 0x68, 0x79, 0x62, 0x30, 0xc2, 0x64, 0x4e, 0x85, 0xc3, 0x81, 0xe1, + 0xbd, 0xf3, 0x90, 0x1d, 0xb4, 0xd4, 0xb1, 0x8b, 0x32, 0x86, 0xbe, 0xcb, + 0x62, 0xc6, 0x33, 0xd8, 0x6c, 0x7c, 0xc5, 0xe1, 0xce, 0x80, 0xb3, 0x82, + 0xd4, 0xde, 0xb5, 0x21, 0x26, 0x73, 0x92, 0x21, 0xaa, 0x81, 0x42, 0xb0, + 0x02, 0xd1, 0x0a, 0x25, 0xc7, 0x2a, 0xa1, 0x17, 0x9f, 0x46, 0xb3, 0xf7, + 0x81, 0x31, 0x32, 0xde, 0x46, 0x11, 0xae, 0x3a, 0xe0, 0xcf, 0xf7, 0xc1, + 0x70, 0x4c, 0x57, 0x4a, 0xf3, 0xb5, 0x80, 0x81, 0xf4, 0x5d, 0x0d, 0x32, + 0x6b, 0xf1, 0xa3, 0xa7, 0x0e, 0xbf, 0x58, 0xd5, 0xad, 0xc9, 0x9f, 0xb6, + 0xfb, 0x7d, 0x8f, 0xe5, 0xca, 0x72, 0x6b, 0x12, 0x71, 0x99, 0xd7, 0x7d, + 0xf5, 0x56, 0x08, 0x28, 0x56, 0x4b, 0x85, 0x45, 0x3c, 0xf9, 0xec, 0x7e, + 0xfe, 0x14, 0x3f, 0x5a, 0x8a, 0xcf, 0x2d, 0xa1, 0xa3, 0xc6, 0x90, 0xa6, + 0xcc, 0xa7, 0x53, 0x77, 0xf9, 0xe2, 0xf6, 0x48, 0xf3, 0x91, 0x15, 0x4f, + 0xcd, 0x5d, 0x10, 0xea, 0x34, 0xeb, 0x43, 0xce, 0xdf, 0x9c, 0x18, 0x39, + 0x26, 0xec, 0x0d, 0x69, 0x83, 0xfd, 0x5d, 0xb0, 0xbe, 0x19, 0x1c, 0xef, + 0x65, 0x99, 0xa7, 0xdc, 0xa7, 0x65, 0x10, 0x8f, 0xe9, 0xfd, 0x62, 0xd0, + 0xe1, 0xe8, 0x6f, 0x72, 0xab, 0x56, 0xae, 0x58, 0x41, 0x73, 0x31, 0x53, + 0x32, 0x65, 0x64, 0x4c, 0x0b, 0x5c, 0x6f, 0x6b, 0x1b, 0xd3, 0xba, 0xd0, + 0x12, 0x62, 0x91, 0x71, 0xcc, 0x3c, 0x3c, 0x31, 0x78, 0x45, 0x33, 0x13, + 0xe2, 0xe2, 0xac, 0x42, 0x7e, 0x07, 0xb1, 0x58, 0xc4, 0xee, 0x7e, 0xc6, + 0x84, 0xf9, 0x40, 0xc2, 0x1c, 0x8c, 0xd7, 0x33, 0xc1, 0x24, 0xa4, 0x0d, + 0x22, 0x65, 0xd7, 0xb9, 0x1c, 0x14, 0x52, 0xea, 0xd0, 0xfb, 0x9d, 0x75, + 0x31, 0xf7, 0x00, 0x3b, 0x6e, 0x98, 0x72, 0x26, 0x11, 0x1e, 0x3f, 0xce, + 0xee, 0x98, 0x9f, 0x64, 0x24, 0xea, 0x14, 0x70, 0xaa, 0x96, 0x79, 0x10, + 0xab, 0x32, 0x25, 0xc5, 0xca, 0x84, 0x94, 0x8b, 0xb5, 0xf3, 0xd1, 0x3c, + 0x45, 0x82, 0xb5, 0x26, 0x4f, 0xa7, 0x6e, 0xab, 0x7b, 0x04, 0x4b, 0x4a, + 0x85, 0xfa, 0xe4, 0x72, 0xbd, 0x0e, 0xc4, 0xe7, 0xd3, 0x87, 0x8d, 0xcc, + 0xb1, 0x00, 0xf5, 0x44, 0x49, 0xed, 0x9a, 0xf7, 0x13, 0xb5, 0x2c, 0x76, + 0x1d, 0x5f, 0xd5, 0xe5, 0xa7, 0x9e, 0xc7, 0xf2, 0x70, 0x67, 0x99, 0x22, + 0xaa, 0x64, 0x36, 0x35, 0x60, 0x15, 0x07, 0xa3, 0xc0, 0x4f, 0x5d, 0x73, + 0xe6, 0x59, 0x74, 0x79, 0x47, 0xff, 0x09, 0x43, 0xd2, 0x8c, 0x6a, 0x58, + 0x6c, 0x54, 0xea, 0xea, 0x43, 0xcf, 0x85, 0x75, 0x22, 0x1a, 0x77, 0x2f, + 0x89, 0x79, 0xca, 0xc5, 0x83, 0x32, 0xaa, 0x49, 0xd5, 0x70, 0xbb, 0x36, + 0xc0, 0x55, 0x07, 0x8f, 0x95, 0xd8, 0x25, 0x8c, 0xac, 0x9c, 0x9d, 0x36, + 0x1c, 0x71, 0x53, 0xa0, 0x14, 0x79, 0x85, 0xa2, 0x38, 0x19, 0x17, 0x59, + 0x1d, 0xf5, 0xe2, 0x95, 0x93, 0xb5, 0xc9, 0x17, 0xcf, 0xa2, 0x28, 0x2a, + 0xb3, 0x50, 0x62, 0x3c, 0xca, 0xe9, 0x80, 0xc9, 0xdc, 0x0b, 0xa8, 0x30, + 0x6d, 0x4f, 0x27, 0xc5, 0xbb, 0x35, 0x94, 0x57, 0x24, 0xe3, 0x5d, 0x96, + 0x31, 0xc0, 0x6e, 0x5f, 0x13, 0xf2, 0xe3, 0x4d, 0xc1, 0xdb, 0x15, 0xd3, + 0x60, 0xe8, 0x58, 0x71, 0xfd, 0x04, 0xb5, 0x49, 0xd4, 0x2b, 0xcd, 0x57, + 0x0a, 0x69, 0xa9, 0xc4, 0xba, 0x10, 0x0b, 0xe2, 0x8d, 0x29, 0xbb, 0x54, + 0xeb, 0x3b, 0x51, 0x62, 0x41, 0x31, 0x38, 0xac, 0xa1, 0xaa, 0xb0, 0xf0, + 0x66, 0x8a, 0x2b, 0xab, 0x62, 0x82, 0xc0, 0x14, 0x15, 0x2a, 0x49, 0x62, + 0x12, 0x6a, 0x4c, 0x27, 0x1e, 0xca, 0x74, 0xed, 0x4a, 0x7a, 0x3e, 0xed, + 0xba, 0xab, 0x27, 0xe2, 0x50, 0x11, 0x8f, 0xd3, 0xbe, 0x8d, 0x01, 0xe1, + 0x53, 0xd5, 0xa0, 0xef, 0x13, 0x73, 0x43, 0x95, 0x56, 0x5c, 0xd5, 0xc9, + 0x42, 0x1c, 0xa0, 0x5b, 0x53, 0xf8, 0xf6, 0x52, 0x49, 0xd5, 0xf9, 0xb3, + 0x96, 0xe5, 0xd5, 0xe4, 0xf6, 0xcd, 0xea, 0x22, 0x40, 0x56, 0xd0, 0xd5, + 0x06, 0xb5, 0xf9, 0xb2, 0x1f, 0x5c, 0x40, 0xbd, 0xb7, 0xec, 0xae, 0xb1, + 0x3c, 0x57, 0xa6, 0xd0, 0x04, 0x88, 0xda, 0x7a, 0x1e, 0x06, 0xfd, 0x1e, + 0x8c, 0xd2, 0xe9, 0x69, 0x9f, 0x40, 0x5d, 0x5a, 0xc2, 0x3b, 0xcc, 0xa0, + 0x19, 0xe4, 0x94, 0x57, 0x9d, 0x79, 0x82, 0x29, 0xf9, 0xd9, 0x76, 0x59, + 0x93, 0xde, 0xbc, 0xa2, 0x6c, 0x8b, 0x8d, 0x4a, 0xb7, 0x35, 0xad, 0x5e, + 0x20, 0xe4, 0x0e, 0x3c, 0xf1, 0x51, 0xe0, 0xad, 0x2b, 0x14, 0x60, 0xbb, + 0x78, 0x1d, 0xc7, 0xf1, 0x90, 0xdf, 0xa7, 0x30, 0x25, 0x66, 0xca, 0x24, + 0xad, 0x25, 0x24, 0x63, 0x6d, 0xa3, 0x7a, 0xd2, 0xbf, 0xd2, 0xa0, 0x9b, + 0xe8, 0x18, 0x5a, 0x54, 0xa0, 0x59, 0x92, 0x73, 0xc5, 0x16, 0xf2, 0x72, + 0x52, 0xb6, 0x00, 0xe4, 0x59, 0x5d, 0x92, 0xc2, 0x05, 0x40, 0x4a, 0x45, + 0x2a, 0x59, 0x25, 0xc5, 0x58, 0x58, 0x9e, 0xd1, 0xf4, 0x25, 0x67, 0x83, + 0x99, 0x4a, 0x3b, 0xd5, 0x43, 0x07, 0x2e, 0x68, 0x3a, 0x77, 0x1e, 0x43, + 0xa1, 0xa8, 0x07, 0x92, 0xce, 0x9d, 0xe7, 0x4e, 0xcd, 0x9a, 0xbe, 0x08, + 0xb8, 0x75, 0xf1, 0xe5, 0xf5, 0x5e, 0x0f, 0x66, 0x2d, 0x59, 0xf1, 0xf0, + 0xee, 0xcf, 0x36, 0x0c, 0x85, 0x18, 0xb0, 0xa5, 0x28, 0x4f, 0xaa, 0x15, + 0x5c, 0x96, 0x7c, 0x92, 0x15, 0x15, 0x01, 0x1a, 0x32, 0xcc, 0x4e, 0xa9, + 0xbe, 0x13, 0x02, 0x2d, 0x50, 0x38, 0x0b, 0xa8, 0xc6, 0x17, 0x64, 0x98, + 0x9d, 0x8d, 0xf6, 0xe6, 0x3c, 0xb3, 0x65, 0xf8, 0xd1, 0xb2, 0x27, 0x6e, + 0xad, 0x20, 0x19, 0x6d, 0x35, 0x18, 0x2c, 0xeb, 0x86, 0x04, 0x2a, 0x4f, + 0x29, 0x6b, 0xdb, 0x90, 0x1f, 0x73, 0x03, 0xef, 0x12, 0x76, 0xdd, 0x58, + 0x99, 0xe5, 0x9d, 0x2d, 0xdc, 0xd2, 0x53, 0x13, 0x31, 0x82, 0x50, 0x21, + 0x64, 0xd9, 0x70, 0xed, 0xf5, 0x93, 0x0e, 0xab, 0xcf, 0x2d, 0xa5, 0xb5, + 0xc2, 0xac, 0xb9, 0xe5, 0x5d, 0x61, 0x70, 0x98, 0xdf, 0x81, 0xd6, 0xa9, + 0x3c, 0x1d, 0x6e, 0x61, 0x38, 0x02, 0x62, 0xf0, 0x86, 0x01, 0x46, 0xfb, + 0x39, 0x0c, 0x70, 0x61, 0xce, 0xdd, 0x2a, 0x80, 0xf8, 0x11, 0xb9, 0x0e, + 0x2c, 0xcf, 0xc1, 0x5b, 0xde, 0x37, 0x7f, 0xa4, 0xf7, 0x27, 0x4f, 0xd3, + 0x5b, 0x5e, 0x1f, 0x3d, 0x9b, 0x42, 0x13, 0x51, 0x78, 0x3a, 0xdf, 0xca, + 0x20, 0xc8, 0xc9, 0x82, 0x04, 0x87, 0x67, 0x90, 0x2e, 0x64, 0x15, 0x5a, + 0x48, 0x9e, 0xe5, 0x72, 0x9e, 0xe8, 0x42, 0x0c, 0x78, 0xe1, 0x25, 0xea, + 0xef, 0x7e, 0x62, 0x02, 0x94, 0xa5, 0x94, 0xae, 0x06, 0x89, 0xdd, 0xe4, + 0x93, 0x40, 0x49, 0x69, 0xaf, 0x0b, 0xc1, 0xb0, 0xf8, 0x09, 0x64, 0x65, + 0x94, 0x40, 0x28, 0x39, 0xaa, 0x0b, 0x81, 0x90, 0x90, 0x6a, 0x78, 0x8a, + 0x25, 0x41, 0x90, 0x13, 0x81, 0x17, 0x52, 0x95, 0xdd, 0x39, 0xe1, 0x16, + 0x3e, 0x4b, 0xc2, 0xf0, 0x2a, 0x20, 0x08, 0xb7, 0x8a, 0x10, 0xb4, 0xb4, + 0xe1, 0x85, 0x3d, 0x81, 0xd2, 0x26, 0x49, 0x64, 0x48, 0x4e, 0x5e, 0x4e, + 0x10, 0x5a, 0x89, 0x47, 0xa7, 0x94, 0xe0, 0xb1, 0x34, 0xd3, 0xb6, 0x79, + 0x27, 0xdb, 0xd5, 0x48, 0x61, 0x79, 0xda, 0x65, 0x19, 0xa9, 0x0b, 0xb1, + 0x20, 0xa5, 0x96, 0xa2, 0x2f, 0x7a, 0xd3, 0x59, 0x3a, 0xe9, 0x0a, 0xf5, + 0xbb, 0xb4, 0xac, 0xca, 0xaa, 0x24, 0xbd, 0x75, 0xb5, 0x0e, 0xd0, 0xd2, + 0x72, 0x0f, 0xf2, 0x54, 0xd8, 0x65, 0x5c, 0x0e, 0xc5, 0xd4, 0x3e, 0xc8, + 0xf9, 0xb2, 0xab, 0x00, 0xa0, 0x4e, 0x9d, 0x26, 0x20, 0x95, 0x28, 0xc1, + 0xa1, 0x58, 0x49, 0x31, 0x8d, 0x20, 0xa5, 0xb0, 0x28, 0xa3, 0x66, 0x34, + 0x99, 0xa8, 0x06, 0x47, 0x92, 0x89, 0xa0, 0xcf, 0x95, 0xda, 0xa4, 0xaa, + 0xee, 0x0b, 0xd2, 0x20, 0xfc, 0x2b, 0x30, 0xe8, 0xbe, 0xf2, 0xad, 0x72, + 0x4f, 0xd9, 0x8a, 0xc9, 0x8a, 0x9d, 0x78, 0x19, 0xc7, 0xb0, 0x05, 0xb8, + 0xf4, 0x87, 0x17, 0x81, 0xed, 0xba, 0x72, 0x7e, 0xe5, 0x82, 0x29, 0x85, + 0xe2, 0x71, 0xef, 0x31, 0xf1, 0xde, 0x4e, 0xdc, 0x13, 0xd1, 0x39, 0x44, + 0xb8, 0x58, 0xed, 0xf1, 0x7a, 0xc7, 0x2b, 0x27, 0xd6, 0xdb, 0x66, 0x22, + 0x76, 0x26, 0x93, 0x83, 0xad, 0xc6, 0xcb, 0x32, 0x13, 0x1e, 0xbf, 0x02, + 0x5d, 0xc1, 0x97, 0xc8, 0x0e, 0x44, 0x3e, 0x2b, 0x2f, 0x3b, 0x32, 0x2e, + 0xc5, 0x49, 0x28, 0x6b, 0x85, 0xb5, 0x3d, 0xaa, 0x04, 0x26, 0x3b, 0x75, + 0xb6, 0x02, 0xca, 0xdd, 0x1f, 0x4a, 0x20, 0x31, 0x77, 0x1f, 0x23, 0x20, + 0x35, 0xd4, 0x8e, 0x1d, 0x94, 0x21, 0x66, 0x96, 0x11, 0xa2, 0x1e, 0x28, + 0xa6, 0x0c, 0xe6, 0x8e, 0x25, 0x60, 0x94, 0x0c, 0x97, 0x49, 0xd1, 0x5b, + 0x1b, 0xbe, 0x48, 0xfd, 0x4a, 0x3e, 0x15, 0xfc, 0xb0, 0x5b, 0x0d, 0x28, + 0x56, 0x38, 0x0b, 0xb9, 0x88, 0xbc, 0x35, 0x7e, 0x14, 0x40, 0x25, 0x04, + 0xe9, 0xac, 0xe5, 0xb3, 0xc9, 0x04, 0x46, 0x73, 0x08, 0xe5, 0xfb, 0x5f, + 0x5a, 0x09, 0xaf, 0x3b, 0x8e, 0x87, 0xbd, 0xe0, 0x1c, 0xd4, 0x85, 0x1e, + 0xee, 0x7a, 0xc9, 0x6b, 0x4b, 0x64, 0x0f, 0x29, 0xda, 0xba, 0x4a, 0x93, + 0x92, 0xc6, 0x6b, 0x15, 0x1d, 0x98, 0x0d, 0xf0, 0xf1, 0x7e, 0x86, 0x67, + 0xb4, 0x9d, 0xda, 0x68, 0x47, 0x97, 0x98, 0x1f, 0x31, 0x00, 0x25, 0xe8, + 0x16, 0x21, 0x69, 0x93, 0xd3, 0x5f, 0x82, 0x6b, 0x62, 0xf8, 0xb2, 0x08, + 0x6a, 0x1c, 0x3b, 0x2a, 0x9b, 0xa1, 0xe0, 0x0e, 0x3f, 0x69, 0x68, 0xae, + 0xd6, 0xca, 0xae, 0x73, 0x55, 0xed, 0xd2, 0x0c, 0x7c, 0x35, 0x23, 0x6f, + 0xcd, 0x89, 0xbf, 0xf4, 0x18, 0xed, 0x96, 0xfc, 0x99, 0x15, 0x78, 0xcd, + 0x64, 0xb4, 0xb1, 0x8f, 0x42, 0xeb, 0x59, 0x6d, 0x16, 0x76, 0x96, 0x34, + 0x89, 0x4a, 0x31, 0x09, 0x2b, 0x46, 0x23, 0x94, 0xa2, 0xd9, 0x65, 0xa7, + 0x53, 0xd9, 0xd8, 0x58, 0x42, 0x4b, 0x59, 0x22, 0x15, 0xaa, 0x59, 0xef, + 0x4d, 0x41, 0x0a, 0xc5, 0x32, 0xc6, 0xb8, 0x64, 0xa6, 0x4a, 0x0c, 0x37, + 0x3d, 0xb2, 0x8e, 0x22, 0x86, 0x33, 0xd3, 0x11, 0x63, 0x0d, 0x9a, 0x4e, + 0x9a, 0x47, 0xcb, 0xa2, 0x91, 0xc1, 0xe8, 0x9b, 0x0c, 0x02, 0x11, 0xf9, + 0xef, 0x82, 0x6b, 0xd1, 0x24, 0xa9, 0x4e, 0xae, 0x2a, 0x13, 0xab, 0x6c, + 0x41, 0x78, 0x50, 0x95, 0x37, 0x74, 0x40, 0x92, 0xd8, 0xd0, 0xfb, 0x8e, + 0x18, 0xa3, 0x97, 0xaf, 0xd5, 0x22, 0x28, 0x6e, 0x10, 0x88, 0x3f, 0x30, + 0xfb, 0x1b, 0xfd, 0x95, 0xb3, 0xb0, 0x49, 0xa6, 0x85, 0xb0, 0xe4, 0x8c, + 0x3f, 0xd3, 0x8d, 0x8d, 0x92, 0x6a, 0x8c, 0x6e, 0xf8, 0x2a, 0x75, 0xb3, + 0xd8, 0x36, 0xc4, 0xbd, 0x15, 0xbd, 0xd9, 0x58, 0x37, 0x89, 0x47, 0x32, + 0x12, 0xac, 0xce, 0x06, 0xca, 0xe2, 0x5c, 0xa6, 0x90, 0x97, 0x8c, 0x56, + 0x91, 0xe1, 0x9a, 0x76, 0x61, 0x3a, 0xec, 0x66, 0xd5, 0x0d, 0x64, 0x0f, + 0x69, 0xc2, 0x05, 0xd2, 0x22, 0xb7, 0x51, 0x32, 0xd6, 0x96, 0x53, 0xdf, + 0xbb, 0xd3, 0x27, 0x4d, 0x4e, 0x99, 0x62, 0x5b, 0x2b, 0xe2, 0xed, 0x16, + 0x53, 0x33, 0x03, 0xc1, 0x39, 0xbc, 0xce, 0xe3, 0x19, 0xff, 0x9e, 0x6d, + 0x12, 0xac, 0x4c, 0x2f, 0x6d, 0x06, 0x2b, 0x72, 0x3d, 0x5b, 0x0a, 0x4b, + 0xd8, 0xbe, 0x64, 0xb9, 0x21, 0x41, 0x26, 0x73, 0x2c, 0x67, 0x60, 0x78, + 0xe3, 0x6a, 0x07, 0xe0, 0xd9, 0x5f, 0xa5, 0xaa, 0x06, 0x29, 0x8a, 0x7f, + 0x6c, 0x14, 0x6a, 0x33, 0x14, 0xf7, 0x73, 0xe0, 0xae, 0xc4, 0xb3, 0x1e, + 0xdb, 0xec, 0x29, 0x4c, 0x69, 0x0b, 0xd4, 0xca, 0x17, 0x14, 0xc3, 0x86, + 0xd7, 0x93, 0x62, 0xbc, 0xaa, 0xfb, 0x56, 0xe5, 0x88, 0x43, 0x7c, 0x2d, + 0x1d, 0x9a, 0x89, 0x1f, 0x04, 0x9f, 0x35, 0xa9, 0xe1, 0xcc, 0xb5, 0x47, + 0x7c, 0x2b, 0x1c, 0xa0, 0x4b, 0xaf, 0xd5, 0x13, 0x6c, 0xf1, 0xa3, 0x7c, + 0x5a, 0x25, 0x7e, 0x91, 0xd7, 0x27, 0x91, 0x5c, 0x18, 0xb7, 0xc6, 0xb8, + 0x28, 0x87, 0xe8, 0xbf, 0x97, 0x7b, 0xa8, 0x46, 0x49, 0x9a, 0xdf, 0xd3, + 0x35, 0xe4, 0x87, 0x82, 0xc2, 0xe1, 0x48, 0xfb, 0x7a, 0x25, 0xa7, 0x12, + 0xa3, 0x57, 0x96, 0xcf, 0xae, 0x12, 0x92, 0x65, 0x2a, 0x1c, 0x4d, 0xd6, + 0x9f, 0x37, 0x97, 0xcf, 0x64, 0xf1, 0xfc, 0xc0, 0xe2, 0xec, 0x25, 0x9a, + 0x3f, 0x9d, 0x70, 0x70, 0x21, 0x06, 0xf3, 0x52, 0x02, 0xc0, 0xc5, 0x5d, + 0xb2, 0x99, 0x66, 0xf2, 0x07, 0xef, 0xe5, 0xdb, 0x80, 0x2e, 0x1c, 0xc7, + 0x41, 0x7f, 0x93, 0x44, 0x3c, 0x08, 0x96, 0xc8, 0x39, 0x29, 0xbd, 0x0f, + 0x70, 0xb2, 0x20, 0x40, 0x97, 0xcf, 0xbe, 0x2f, 0x49, 0xf4, 0x44, 0xd1, + 0x53, 0x59, 0x0d, 0x11, 0xce, 0xe8, 0x8b, 0x94, 0xc5, 0x3f, 0x1f, 0xd0, + 0xbb, 0x02, 0x34, 0xec, 0x12, 0xde, 0x1d, 0xf8, 0x6d, 0x19, 0xcf, 0x27, + 0xb7, 0x1e, 0xfc, 0xb6, 0x8c, 0x26, 0xcb, 0xad, 0x07, 0xff, 0x0b, 0x65, + 0x27, 0xb3, 0x57, 0xc3, 0xca, 0x04, 0x00 +}; +const unsigned int webui_html_len = 169747;