diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e85dd42958..7051c92ed4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -225,6 +225,65 @@ if (ENABLE_JIT_PROFILING) target_link_libraries(core PRIVATE "${VTUNE_LIBRARY}") endif() +# --- RetroAchievements --- +option(ENABLE_RETROACHIEVEMENTS "Enable RetroAchievements support" OFF) + +if (ENABLE_RETROACHIEVEMENTS) + message(STATUS "RetroAchievements: ENABLED") + + if (WIN32) + target_compile_definitions(core PUBLIC RETROACHIEVEMENTS_ENABLED HAVE_CURL CURL_STATICLIB) + + set(CURL_DEPENDENCY_NAMES + curl nghttp2 nghttp3 ngtcp2 ssh2 psl ssl crypto brotlidec + brotlicommon brotlienc zstd idn2 unistring iconv z + ) + + set(CURL_FOUND_LIBS "") + foreach(LIB_NAME ${CURL_DEPENDENCY_NAMES}) + find_library(LIB_PATH_${LIB_NAME} NAMES ${LIB_NAME} REQUIRED) + if(LIB_PATH_${LIB_NAME}) + list(APPEND CURL_FOUND_LIBS ${LIB_PATH_${LIB_NAME}}) + endif() + endforeach() + + find_library(LIB_NGTCP2_CRYPTO NAMES ngtcp2_crypto_ossl ngtcp2_crypto_openssl) + if(LIB_NGTCP2_CRYPTO) + list(INSERT CURL_FOUND_LIBS 4 ${LIB_NGTCP2_CRYPTO}) + endif() + + target_link_libraries(core PRIVATE + ${CURL_FOUND_LIBS} + ws2_32 wldap32 crypt32 normaliz advapi32 secur32 bcrypt + ) + else() + find_package(CURL REQUIRED) + target_compile_definitions(core PUBLIC RETROACHIEVEMENTS_ENABLED HAVE_CURL) + target_link_libraries(core PRIVATE ${CURL_LIBRARIES}) + target_include_directories(core PRIVATE ${CURL_INCLUDE_DIRS}) + endif() + + target_include_directories(core PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/RetroAchievements" + "${CMAKE_CURRENT_SOURCE_DIR}" + ) + + target_sources(core PRIVATE + RetroAchievements/RAClient.cpp + RetroAchievements/RAClient.h + ) + + file(GLOB_RECURSE RCH_ALL "${CMAKE_CURRENT_SOURCE_DIR}/rcheevos/src/*.c") + list(FILTER RCH_ALL EXCLUDE REGEX "rc_libretro.c|rc_client_external.c|rhash/aes.c") + target_sources(core PRIVATE ${RCH_ALL}) + target_include_directories(core PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/rcheevos/include" + "${CMAKE_CURRENT_SOURCE_DIR}/rcheevos/src" + ) +else() + message(STATUS "RetroAchievements: DISABLED (default)") +endif() + #if(CMAKE_BUILD_TYPE MATCHES "Debug") # set( # CMAKE_C_FLAGS diff --git a/src/NDS.cpp b/src/NDS.cpp index 77c48183dd..4a49802ec8 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -44,6 +44,11 @@ #include "DSi_DSP.h" #include "ARMJIT.h" #include "ARMJIT_Memory.h" +#include + +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RetroAchievements/RAClient.h" +#endif namespace melonDS { @@ -543,6 +548,9 @@ void NDS::Reset() SPI.Reset(); RTC.Reset(); Wifi.Reset(); + memset(MainRAM, 0, MainRAMMask + 1); + memset(SharedWRAM, 0, 0x8000); + memset(ARM7WRAM, 0, 0x10000); } void NDS::Start() @@ -776,6 +784,16 @@ void NDS::SetNDSCart(std::unique_ptr&& cart) // The existing cart will always be ejected; // if cart is null, then that's equivalent to ejecting a cart // without inserting a new one. + #ifdef RETROACHIEVEMENTS_ENABLED + if (ra) { + auto cart = NDSCartSlot.GetCart(); + if (cart) { + const char* h = cart->GetRAHash(); + if (h && h[0]) + ra->SetPendingGameHash(h); + } + } + #endif } void NDS::SetNDSSave(const u8* savedata, u32 savelen) @@ -922,6 +940,11 @@ void NDS::RunSystemSleep(u64 timestamp) template u32 NDS::RunFrame() { + #ifdef RETROACHIEVEMENTS_ENABLED + if (ra) { + ra->DoFrame(); + } + #endif Current = this; FrameStartTimestamp = SysTimestamp; @@ -1597,6 +1620,11 @@ void NDS::MonitorARM9Jump(u32 addr) { Log(LogLevel::Info, "Game is now booting\n"); RunningGame = true; + #ifdef RETROACHIEVEMENTS_ENABLED + if (ra) { + ra->AttachNDS(this); + } + #endif } } } diff --git a/src/NDS.h b/src/NDS.h index 17e656e9e7..106fdc17ad 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -44,6 +44,9 @@ #include "DMA.h" #include "FreeBIOS.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RetroAchievements/RAClient.h" +#endif // when touching the main loop/timing code, pls test a lot of shit // with this enabled, to make sure it doesn't desync //#define DEBUG_CHECK_DESYNC @@ -248,6 +251,11 @@ class NDS #endif public: // TODO: Encapsulate the rest of these members + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = nullptr; + void SetRAContext(RAContext* ctx) noexcept { ra = ctx; } + bool IsGameRunning() const { return RunningGame; } + #endif void* UserData; int ConsoleType; diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index bfc07f9394..d34997ed6b 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -27,6 +27,11 @@ #include "FATStorage.h" #include "Utils.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RetroAchievements/RAClient.h" +#include +#endif + namespace melonDS { using Platform::Log; @@ -202,6 +207,25 @@ CartCommon::CartCommon(std::unique_ptr&& rom, u32 len, u32 chipid, bool ba CartType(type), UserData(userdata) { + #ifdef RETROACHIEVEMENTS_ENABLED + if (ROM && ROMLength > 0) + { + const bool ok = rc_hash_generate_from_buffer( + this->ra_hash, + RC_CONSOLE_NINTENDO_DS, + ROM.get(), + ROMLength + ); + + if (ok) + { + if (ra) + { + ra->SetPendingGameHash(this->ra_hash); + } + } + } + #endif memcpy(&Header, ROM.get(), sizeof(Header)); IsDSi = Header.IsDSi() && !badDSiDump; DSiBase = Header.DSiRegionStart << 19; diff --git a/src/NDSCart.h b/src/NDSCart.h index 7e53e62e91..c814db2cff 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -30,6 +30,10 @@ #include "FATStorage.h" #include "ROMList.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RetroAchievements/RAClient.h" +#endif + namespace melonDS { class NDS; @@ -76,6 +80,11 @@ struct NDSCartArgs class CartCommon { public: + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = nullptr; + const char* GetRAHash() const { return ra_hash; } + char ra_hash[33] = {0}; + #endif CartCommon(const u8* rom, u32 len, u32 chipid, bool badDSiDump, ROMListEntry romparams, CartType type, void* userdata); CartCommon(std::unique_ptr&& rom, u32 len, u32 chipid, bool badDSiDump, ROMListEntry romparams, CartType type, void* userdata); virtual ~CartCommon(); diff --git a/src/RetroAchievements/RAClient.cpp b/src/RetroAchievements/RAClient.cpp new file mode 100644 index 0000000000..d20116c2e1 --- /dev/null +++ b/src/RetroAchievements/RAClient.cpp @@ -0,0 +1,431 @@ +#include "RAClient.h" +#include "../NDS.h" +#include +#include +#include +#include +#include "../rcheevos/include/rc_consoles.h" +#include "../rcheevos/include/rc_client.h" +#include "RetroAchievements/cacert.c" + +extern const unsigned char _accacert[]; +extern const size_t _accacert_len; +void RAContext::SetDisplayName(const char* name) +{ + m_displayName = name ? name : ""; +} + +const std::string& RAContext::GetDisplayName() const +{ + return RAContext::m_displayName; +} +static uint64_t g_ra_mem_reads = 0; +static uint64_t g_ra_mem_logged = 0; +static size_t CurlWrite(void* ptr, size_t size, size_t nmemb, void* userdata) +{ + std::string* s = static_cast(userdata); + s->append(static_cast(ptr), size * nmemb); + return size * nmemb; +} +bool RAContext::CanPause(uint32_t* frames_remaining) { + if (!client) return true; + return rc_client_can_pause(client, frames_remaining) != 0; +} + +void RAContext::SetPaused(bool paused) { + m_IsPaused = paused; +} + +RAContext::RAContext() : nds(nullptr), client(nullptr) +{ +} + +RAContext::~RAContext() +{ + Shutdown(); +} + +void RAContext::Init(melonDS::NDS* nds_) +{ + nds = nds_; + client = rc_client_create( + &RAContext::ReadMemory, + &RAContext::ServerCall + ); + rc_client_set_userdata(client, this); + rc_client_set_allow_background_memory_reads(client, 1); + rc_client_set_event_handler(client, + [](const rc_client_event_t* event, rc_client_t* client) + { + switch (event->type) + { + case RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED: + { + const rc_client_achievement_t* ach = + (const rc_client_achievement_t*)event->achievement; + RAContext* ctx = static_cast(rc_client_get_userdata(client)); + if (!ctx) return; + + if (ctx->m_onAchievementUnlocked) + ctx->m_onAchievementUnlocked( + ach->title, + ach->description, + ach->badge_url + ); + break; + } + default: + break; + } + }); +}; + + + +void RAContext::Shutdown() +{ + if (client) { + rc_client_destroy(client); + client = nullptr; + } +} + +void RAContext::DoFrame() +{ + if (!nds || !client || m_IsPaused) + return; + std::string currentHash = pendingGameHash.value_or(""); + if (currentHash != m_lastHash) { + gameLoaded = false; + m_lastHash = currentHash; + pendingLoadFailed = false; + isLoading = false; + } + if (pendingLoadFailed || isLoading) return; + if (!gameLoaded && + pendingGameHash.has_value() && + nds->IsGameRunning()) + { + isLoading = true; + LoadGame(pendingGameHash->c_str()); + return; + } + if (!gameLoaded) return; + if (rc_client_is_processing_required(client) == 0) { + return; + } + rc_client_do_frame(client); +} +// ================= Login / Load ================= + + void RAContext::SetLoggedIn(bool v) + { + if (m_logged_in == v) + return; + m_logged_in = v; + + if (RAContext::m_onLogin) + RAContext::m_onLogin(); + } + +static void LoginPasswordCallback(int result, const char* err, rc_client_t* client, void* userdata) +{ + RAContext* ctx = static_cast(userdata); + if (result == RC_OK) + { + const rc_client_user_t* user_info = rc_client_get_user_info(client); + ctx->SetToken(user_info->token ? user_info->token : ""); + ctx->SetLoggedIn(true); + if (ctx->onLoginResponse) { + ctx->onLoginResponse(true, "Logged in Successfully!"); + } + } + else + { + ctx->loginSuccess = false; + ctx->loginErrorMessage = err ? err : "Unknown error"; + ctx->SetLoggedIn(false); + if (ctx->onLoginResponse) { + ctx->onLoginResponse(false, ctx->loginErrorMessage); + } + } +} + + + +void RAContext::LoadGame(const char* hash) +{ + if (!client) return; + rc_client_begin_load_game( + client, + hash, + [](int result, const char* err, rc_client_t*, void* userdata) { + auto* context = static_cast(userdata); + + if (result == 0) { + context->pendingLoadFailed = false; + context->isLoading = false; + context->gameLoaded = true; + context->currentGameInfo = rc_client_get_game_info(context->client); + if (context->onGameLoaded){ + context->onGameLoaded();} + } + else { + context->gameLoaded = false; + context->pendingLoadError = err; + context->pendingLoadFailed = true; + context->isLoading = false; + if (context->onGameLoaded) { + context->onGameLoaded(); + } + + } + }, + this + ); +} + +// ================= CALLBACKS rcheevos ================= + +uint32_t RAContext::ReadMemory(uint32_t address, + uint8_t* buffer, + uint32_t size, + rc_client_t* client) +{ + if (address >= 0x04000000 && address < 0x04000400) + { +} + g_ra_mem_reads++; + RAContext* ctx = + static_cast(rc_client_get_userdata(client)); + + if (buffer && size > 0) + memset(buffer, 0, size); + + if (!ctx || !ctx->nds || !buffer || size == 0) + return 0; + + // ===== ARM9 MAIN RAM ===== + constexpr uint32_t ARM9_RA_BASE = 0x00000000; + constexpr uint32_t ARM9_RA_SIZE = 0x00400000; + constexpr uint32_t ARM9_PHYS_BASE = 0x02000000; + + if (address >= ARM9_RA_BASE && address + size <= ARM9_RA_SIZE) + { + memcpy(buffer, + ctx->nds->MainRAM + address, + size); + return size; + } + + // ===== WRAM ===== + constexpr uint32_t WRAM_RA_BASE = 0x03000000; + constexpr uint32_t WRAM_SIZE = 0x00008000; + + if (address >= WRAM_RA_BASE && + address + size <= WRAM_RA_BASE + WRAM_SIZE) + { + uint32_t off = address - WRAM_RA_BASE; + memcpy(buffer, + ctx->nds->SharedWRAM + off, + size); + return size; + } + + // ===== ARM7 RAM ===== + constexpr uint32_t ARM7_RA_BASE = 0x01000000; + constexpr uint32_t ARM7_SIZE = 0x00010000; + constexpr uint32_t ARM7_PHYS_BASE = 0x03800000; + + if (address >= ARM7_RA_BASE && + address + size <= ARM7_RA_BASE + ARM7_SIZE) + { + uint32_t off = address - ARM7_RA_BASE; + memcpy(buffer, + ctx->nds->ARM7WRAM + off, + size); + return size; + } + return 0; +} + +static std::string WriteCACertToTempFile() { +#ifdef _WIN32 + char tempPath[MAX_PATH]; + if (!GetTempPathA(MAX_PATH, tempPath)) { + return ""; + } + char tempFile[MAX_PATH]; + if (!GetTempFileNameA(tempPath, "ra", 0, tempFile)) { + return ""; + } + + FILE* f = fopen(tempFile, "wb"); + if (!f) return ""; + fwrite(_accacert, 1, _accacert_len, f); + fclose(f); + + return std::string(tempFile); +#else + char tmpName[] = "/tmp/ra_cacertXXXXXX"; + int fd = mkstemp(tmpName); + if (fd < 0) return ""; + + FILE* f = fdopen(fd, "wb"); + if (!f) return ""; + + fwrite(_accacert, 1, _accacert_len, f); + fclose(f); + + return std::string(tmpName); +#endif +} + +static void RemoveTempFile(const std::string& path) { + if (!path.empty()) { +#ifdef _WIN32 + DeleteFileA(path.c_str()); +#else + unlink(path.c_str()); +#endif + } +} + +void RAContext::ServerCall(const rc_api_request_t* request, + rc_client_server_callback_t callback, + void* userdata, + rc_client_t*) +{ + CURL* curl = curl_easy_init(); + if (!curl) { + callback(nullptr, userdata); + return; + } + + std::string cacertPath = WriteCACertToTempFile(); + if (cacertPath.empty()) { + callback(nullptr, userdata); + curl_easy_cleanup(curl); + return; + } + + curl_easy_setopt(curl, CURLOPT_CAINFO, cacertPath.c_str()); + + std::string response_body; + curl_easy_setopt(curl, CURLOPT_USERAGENT, "melonDS/1.1 rcheevos/1.0"); + curl_easy_setopt(curl, CURLOPT_URL, request->url); + + if (request->post_data) { + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request->post_data); + } + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_body); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15L); + + CURLcode res = curl_easy_perform(curl); + long http_code = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + if (res == CURLE_OK) { + rc_api_server_response_t api_resp; + api_resp.body = response_body.c_str(); + api_resp.body_length = static_cast(response_body.length()); + api_resp.http_status_code = static_cast(http_code); + callback(&api_resp, userdata); + } else { + callback(nullptr, userdata); + } + + curl_easy_cleanup(curl); + RemoveTempFile(cacertPath); +} +void RAContext::Reset() { + if (client) + rc_client_reset(client); +} + +void RAContext::LoginWithPassword(const char* username, const char* password, bool hardcore) +{ + if (!client) return; + + rc_client_set_hardcore_enabled(client, hardcore ? 1 : 0); + + rc_client_begin_login_with_password( + client, + username, + password, + &LoginPasswordCallback, + this + ); +} +void RAContext::SetCredentials(const char* user, const char* password, bool hardcore) { + m_user = user; + m_password = password; + m_hardcore = hardcore; +} + +void RAContext::SetPendingGameHash(const char* hash) +{ + if (!hash || !*hash) + return; + + pendingGameHash = std::string(hash); + gameLoaded = false; +} +void RAContext::AttachNDS(melonDS::NDS* nds_) +{ + if (nds == nds_) + return; + + nds = nds_; +} + +void RAContext::Enable() +{ + if (m_enabled) + return; + + m_enabled = true; + + Init(nds); + + if (!IsLoggedIn()) + { + LoginNow(); + } +} + +void RAContext::Disable() +{ + if (!m_enabled) + return; + + m_enabled = false; + + Shutdown(); + m_logged_in = false; + gameLoaded = false; + pendingGameHash.reset(); +} + +void RAContext::LoginNow() +{ + if (m_logged_in) + return; + + if (!m_user.empty() && !m_password.empty()) + { + LoginWithPassword(m_user.c_str(), m_password.c_str(), m_hardcore); + } +} + +void RAContext::SetOnAchievementUnlocked(AchievementUnlockedCallback cb) +{ + RAContext::m_onAchievementUnlocked = std::move(cb); +} + +void RAContext::SetOnGameLoadedCallback(std::function cb) +{ + onGameLoaded = std::move(cb); +} \ No newline at end of file diff --git a/src/RetroAchievements/RAClient.h b/src/RetroAchievements/RAClient.h new file mode 100644 index 0000000000..9244c27104 --- /dev/null +++ b/src/RetroAchievements/RAClient.h @@ -0,0 +1,89 @@ +#pragma once + +#include +#include +#include +#include +#include + + +using AchievementUnlockedCallback = + std::function; +namespace melonDS { class NDS; } +class RAContext { +public: + RAContext(); + ~RAContext(); + bool m_shuttingDown = false; + bool m_IsPaused = false; + bool CanPause(uint32_t* frames_remaining); + void SetPaused(bool paused); + std::function onLoginResponse; + bool pendingLoginResult = false; + bool loginSuccess = false; + std::string loginErrorMessage; + bool isLoading = false; + std::string m_lastHash; + std::string pendingLoadError; + bool pendingLoadFailed = false; + void SetOnGameLoadedCallback(std::function cb); + std::function onGameLoaded; + const rc_client_game_t* GetCurrentGameInfo() const { return currentGameInfo; } + bool IsGameLoaded() const { return gameLoaded; } + void SetOnAchievementUnlocked(AchievementUnlockedCallback cb); + void LoginNow(); + void Enable(); + void Disable(); + bool IsEnabled() const { return m_enabled; } + bool IsHardcoreEnabled() const { return m_hardcore; } + using LoginCallback = std::function; + void SetOnLogin(LoginCallback cb) + { + m_onLogin = std::move(cb); + } + void AttachNDS(melonDS::NDS* nds_); + void SetPendingGameHash(const char* hash); + void SetToken(const std::string& token) { m_token = token; } + void SetLoggedIn(bool v); + void Init(melonDS::NDS* nds); + void Shutdown(); + void DoFrame(); + void LoginWithPassword(const char* username, const char* password, bool hardcore); + void SetCredentials(const char* user, const char* password, bool hardcore); + void LoadGame(const char* hash); + void Reset(); + bool IsLoggedIn() const { return m_logged_in; } + const std::string& GetUser() const { return m_user; } + const std::string& GetToken() const { return m_token; } + const std::string& GetDisplayName() const; + melonDS::NDS* nds = nullptr; + rc_client_t* client = nullptr; + bool m_logged_in = false; +private: + void SetDisplayName(const char* name); + AchievementUnlockedCallback m_onAchievementUnlocked; + std::string m_displayName; + const rc_client_game_t* currentGameInfo = nullptr; + bool m_enabled = false; + LoginCallback m_onLogin; + std::optional pendingGameHash; + bool gameLoaded = false; + std::string m_user; + std::string m_token; + std::string m_password; + bool m_hardcore = false; + static uint32_t ReadMemory( + uint32_t address, + uint8_t* buffer, + uint32_t size, + rc_client_t* client + ); + static void ServerCall( + const rc_api_request_t* request, + rc_client_server_callback_t callback, + void* userdata, + rc_client_t* client + ); +}; \ No newline at end of file diff --git a/src/RetroAchievements/cacert.c b/src/RetroAchievements/cacert.c new file mode 100644 index 0000000000..9d789c0ec7 --- /dev/null +++ b/src/RetroAchievements/cacert.c @@ -0,0 +1,5642 @@ +/* + C-file generated by Bin2C + Compiled: Nov 20 2025 at 10:44:24 + + Copyright (C) 2018 + Segger Microcontroller GmbH + www.segger.com + + The Embedded Experts +*/ + +const unsigned char _accacert[225076UL + 1] = { + 0x23, 0x23, 0x0A, 0x23, 0x23, 0x20, 0x42, 0x75, 0x6E, 0x64, 0x6C, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x43, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x0A, 0x23, 0x23, 0x0A, + 0x23, 0x23, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x4D, 0x6F, 0x7A, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x61, 0x73, 0x20, 0x6F, 0x66, 0x3A, 0x20, + 0x54, 0x75, 0x65, 0x20, 0x44, 0x65, 0x63, 0x20, 0x20, 0x32, 0x20, 0x30, 0x34, 0x3A, 0x31, 0x32, 0x3A, 0x30, 0x32, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x47, 0x4D, 0x54, 0x0A, 0x23, 0x23, 0x0A, 0x23, 0x23, 0x20, 0x46, 0x69, 0x6E, 0x64, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3A, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x63, 0x75, 0x72, 0x6C, 0x2E, 0x73, 0x65, 0x2F, 0x64, + 0x6F, 0x63, 0x73, 0x2F, 0x63, 0x61, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x0A, 0x23, 0x23, 0x0A, 0x23, 0x23, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x62, 0x75, 0x6E, 0x64, 0x6C, + 0x65, 0x20, 0x6F, 0x66, 0x20, 0x58, 0x2E, 0x35, 0x30, 0x39, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x0A, 0x23, 0x23, 0x20, 0x28, 0x43, 0x41, 0x29, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x61, 0x75, + 0x74, 0x6F, 0x6D, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x4D, 0x6F, 0x7A, 0x69, 0x6C, 0x6C, 0x61, 0x27, 0x73, 0x20, 0x72, 0x6F, 0x6F, + 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x0A, 0x23, 0x23, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x28, 0x63, 0x65, 0x72, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2E, 0x74, 0x78, 0x74, 0x29, 0x2E, 0x20, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x6F, 0x7A, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x73, 0x6F, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x72, 0x65, 0x65, 0x3A, 0x0A, 0x23, 0x23, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x72, 0x61, 0x77, 0x2E, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x75, 0x73, 0x65, 0x72, 0x63, 0x6F, 0x6E, 0x74, + 0x65, 0x6E, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6D, 0x6F, 0x7A, 0x69, 0x6C, 0x6C, 0x61, 0x2D, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6F, 0x78, 0x2F, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6F, 0x78, 0x2F, 0x72, 0x65, 0x66, 0x73, 0x2F, 0x68, 0x65, 0x61, + 0x64, 0x73, 0x2F, 0x72, 0x65, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x2F, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2F, 0x6E, 0x73, 0x73, 0x2F, 0x6C, 0x69, 0x62, 0x2F, 0x63, 0x6B, 0x66, 0x77, 0x2F, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x69, 0x6E, + 0x73, 0x2F, 0x63, 0x65, 0x72, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2E, 0x74, 0x78, 0x74, 0x0A, 0x23, 0x23, 0x0A, 0x23, 0x23, 0x20, 0x49, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x50, 0x45, 0x4D, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x0A, 0x23, 0x23, + 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6C, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, 0x75, 0x72, 0x6C, 0x20, 0x2F, 0x20, 0x6C, 0x69, 0x62, 0x63, 0x75, 0x72, + 0x6C, 0x20, 0x2F, 0x20, 0x70, 0x68, 0x70, 0x5F, 0x63, 0x75, 0x72, 0x6C, 0x2C, 0x20, 0x6F, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0A, 0x23, 0x23, 0x20, 0x61, 0x6E, 0x20, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2B, 0x6D, 0x6F, 0x64, 0x5F, 0x73, + 0x73, 0x6C, 0x20, 0x77, 0x65, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x53, 0x53, 0x4C, 0x20, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6E, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x2E, 0x0A, 0x23, 0x23, 0x20, 0x4A, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x53, 0x4C, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6C, 0x65, 0x2E, 0x0A, 0x23, 0x23, 0x0A, 0x23, 0x23, 0x20, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x64, 0x6F, + 0x6E, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6D, 0x6B, 0x2D, 0x63, 0x61, 0x2D, 0x62, 0x75, 0x6E, 0x64, 0x6C, 0x65, 0x2E, 0x70, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x31, 0x2E, 0x33, 0x30, 0x2E, 0x0A, 0x23, 0x23, + 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x3A, 0x20, 0x61, 0x39, 0x30, 0x33, 0x62, 0x33, 0x63, 0x64, 0x30, 0x35, 0x32, 0x33, 0x31, 0x65, 0x33, 0x39, 0x33, 0x33, 0x32, 0x35, 0x31, 0x35, 0x65, 0x66, 0x37, 0x65, 0x62, 0x65, 0x33, 0x37, 0x65, + 0x36, 0x39, 0x37, 0x32, 0x36, 0x32, 0x66, 0x33, 0x39, 0x35, 0x31, 0x35, 0x61, 0x35, 0x32, 0x30, 0x31, 0x35, 0x63, 0x32, 0x33, 0x63, 0x36, 0x32, 0x38, 0x30, 0x35, 0x62, 0x37, 0x33, 0x63, 0x64, 0x30, 0x0A, 0x23, 0x23, 0x0A, 0x0A, 0x0A, 0x45, + 0x6E, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x6B, 0x54, 0x43, 0x43, 0x41, 0x33, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x45, 0x52, 0x57, 0x74, 0x51, 0x56, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, 0x43, 0x42, 0x73, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x55, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, + 0x34, 0x78, 0x4F, 0x54, 0x41, 0x33, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x4D, 0x48, 0x64, 0x33, 0x64, 0x79, 0x35, 0x6C, 0x62, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x6D, 0x35, 0x6C, 0x64, 0x43, 0x39, 0x44, 0x55, 0x46, + 0x4D, 0x67, 0x61, 0x58, 0x4D, 0x67, 0x61, 0x57, 0x35, 0x6A, 0x62, 0x33, 0x4A, 0x77, 0x0A, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x56, 0x6B, 0x49, 0x47, 0x4A, 0x35, 0x49, 0x48, 0x4A, 0x6C, 0x5A, 0x6D, 0x56, 0x79, 0x5A, 0x57, 0x35, 0x6A, 0x5A, + 0x54, 0x45, 0x66, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x57, 0x4B, 0x47, 0x4D, 0x70, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x44, 0x59, 0x67, 0x52, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x77, 0x67, 0x53, + 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x74, 0x4D, 0x43, 0x73, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x6B, 0x52, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, + 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x32, 0x4D, 0x54, 0x45, 0x79, + 0x4E, 0x7A, 0x49, 0x77, 0x4D, 0x6A, 0x4D, 0x30, 0x0A, 0x4D, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x49, 0x32, 0x4D, 0x54, 0x45, 0x79, 0x4E, 0x7A, 0x49, 0x77, 0x4E, 0x54, 0x4D, 0x30, 0x4D, 0x6C, 0x6F, 0x77, 0x67, 0x62, 0x41, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x59, 0x77, 0x46, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x31, 0x46, 0x62, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x43, 0x42, + 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x0A, 0x4D, 0x54, 0x6B, 0x77, 0x4E, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x7A, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x35, 0x75, 0x5A, 0x58, + 0x51, 0x76, 0x51, 0x31, 0x42, 0x54, 0x49, 0x47, 0x6C, 0x7A, 0x49, 0x47, 0x6C, 0x75, 0x59, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x6C, 0x5A, 0x43, 0x42, 0x69, 0x65, 0x53, 0x42, 0x79, 0x5A, 0x57, 0x5A, 0x6C, 0x63, 0x6D, + 0x56, 0x75, 0x0A, 0x59, 0x32, 0x55, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x46, 0x69, 0x68, 0x6A, 0x4B, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x41, 0x32, 0x49, 0x45, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, + 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4C, 0x54, 0x41, 0x72, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4A, 0x45, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x0A, + 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x0A, 0x41, 0x4C, 0x61, + 0x56, 0x74, 0x6B, 0x4E, 0x43, 0x2B, 0x73, 0x5A, 0x74, 0x4B, 0x6D, 0x39, 0x49, 0x33, 0x35, 0x52, 0x4D, 0x4F, 0x56, 0x63, 0x46, 0x37, 0x73, 0x4E, 0x35, 0x45, 0x55, 0x46, 0x6F, 0x4E, 0x75, 0x33, 0x73, 0x2F, 0x70, 0x6F, 0x42, 0x6A, 0x36, 0x45, + 0x34, 0x4B, 0x50, 0x7A, 0x33, 0x45, 0x45, 0x5A, 0x6D, 0x4C, 0x6B, 0x30, 0x65, 0x47, 0x72, 0x45, 0x61, 0x54, 0x73, 0x62, 0x52, 0x77, 0x4A, 0x57, 0x49, 0x73, 0x4D, 0x6E, 0x2F, 0x4D, 0x59, 0x73, 0x7A, 0x0A, 0x41, 0x39, 0x75, 0x33, 0x67, 0x33, + 0x73, 0x2B, 0x49, 0x49, 0x52, 0x65, 0x37, 0x62, 0x4A, 0x57, 0x4B, 0x4B, 0x66, 0x34, 0x34, 0x4C, 0x6C, 0x41, 0x63, 0x54, 0x66, 0x46, 0x79, 0x30, 0x63, 0x4F, 0x6C, 0x79, 0x70, 0x6F, 0x77, 0x43, 0x4B, 0x56, 0x59, 0x68, 0x58, 0x62, 0x52, 0x39, + 0x6E, 0x31, 0x30, 0x43, 0x76, 0x2F, 0x67, 0x6B, 0x76, 0x4A, 0x72, 0x54, 0x37, 0x65, 0x54, 0x4E, 0x75, 0x51, 0x67, 0x46, 0x41, 0x2F, 0x43, 0x59, 0x71, 0x45, 0x41, 0x4F, 0x77, 0x77, 0x0A, 0x43, 0x6A, 0x30, 0x59, 0x7A, 0x66, 0x76, 0x39, 0x4B, + 0x6C, 0x6D, 0x61, 0x49, 0x35, 0x55, 0x58, 0x4C, 0x45, 0x57, 0x65, 0x48, 0x32, 0x35, 0x44, 0x65, 0x57, 0x30, 0x4D, 0x58, 0x4A, 0x6A, 0x2B, 0x53, 0x4B, 0x66, 0x46, 0x49, 0x30, 0x64, 0x63, 0x58, 0x76, 0x31, 0x75, 0x35, 0x78, 0x36, 0x30, 0x39, + 0x6D, 0x68, 0x46, 0x30, 0x59, 0x61, 0x44, 0x57, 0x36, 0x4B, 0x4B, 0x6A, 0x62, 0x48, 0x6A, 0x4B, 0x59, 0x44, 0x2B, 0x4A, 0x58, 0x47, 0x49, 0x72, 0x62, 0x36, 0x38, 0x0A, 0x6A, 0x36, 0x78, 0x53, 0x6C, 0x6B, 0x75, 0x71, 0x55, 0x59, 0x33, 0x6B, + 0x45, 0x7A, 0x45, 0x5A, 0x36, 0x45, 0x35, 0x4E, 0x6E, 0x39, 0x75, 0x73, 0x73, 0x32, 0x72, 0x56, 0x76, 0x44, 0x6C, 0x55, 0x63, 0x63, 0x70, 0x36, 0x65, 0x6E, 0x2B, 0x51, 0x33, 0x58, 0x30, 0x64, 0x67, 0x4E, 0x6D, 0x42, 0x75, 0x31, 0x6B, 0x6D, + 0x77, 0x68, 0x48, 0x2B, 0x35, 0x70, 0x50, 0x69, 0x39, 0x34, 0x44, 0x6B, 0x5A, 0x66, 0x73, 0x30, 0x4E, 0x77, 0x34, 0x70, 0x67, 0x48, 0x42, 0x4E, 0x0A, 0x72, 0x7A, 0x69, 0x47, 0x4C, 0x70, 0x35, 0x2F, 0x56, 0x36, 0x2B, 0x65, 0x46, 0x36, 0x37, + 0x72, 0x48, 0x4D, 0x73, 0x6F, 0x49, 0x56, 0x2B, 0x32, 0x48, 0x4E, 0x6A, 0x6E, 0x6F, 0x67, 0x51, 0x69, 0x2B, 0x64, 0x50, 0x61, 0x32, 0x4D, 0x73, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4F, 0x42, 0x73, 0x44, 0x43, 0x42, 0x72, 0x54, 0x41, + 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x0A, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, + 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x72, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x41, 0x45, 0x4A, 0x44, 0x41, 0x69, 0x67, 0x41, 0x38, 0x79, 0x4D, 0x44, 0x41, 0x32, 0x4D, 0x54, 0x45, 0x79, 0x4E, 0x7A, 0x49, 0x77, 0x4D, 0x6A, 0x4D, 0x30, 0x4D, 0x6C, + 0x71, 0x42, 0x44, 0x7A, 0x49, 0x77, 0x4D, 0x6A, 0x59, 0x78, 0x4D, 0x54, 0x49, 0x33, 0x4D, 0x6A, 0x41, 0x31, 0x0A, 0x4D, 0x7A, 0x51, 0x79, 0x57, 0x6A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, + 0x42, 0x52, 0x6F, 0x6B, 0x4F, 0x52, 0x6E, 0x70, 0x4B, 0x5A, 0x54, 0x67, 0x4D, 0x65, 0x47, 0x5A, 0x71, 0x54, 0x78, 0x39, 0x30, 0x74, 0x44, 0x2B, 0x34, 0x53, 0x39, 0x62, 0x54, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, + 0x67, 0x51, 0x55, 0x61, 0x4A, 0x44, 0x6B, 0x5A, 0x36, 0x53, 0x6D, 0x55, 0x34, 0x44, 0x48, 0x0A, 0x68, 0x6D, 0x61, 0x6B, 0x38, 0x66, 0x64, 0x4C, 0x51, 0x2F, 0x75, 0x45, 0x76, 0x57, 0x30, 0x77, 0x48, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, + 0x68, 0x76, 0x5A, 0x39, 0x42, 0x30, 0x45, 0x41, 0x42, 0x42, 0x41, 0x77, 0x44, 0x68, 0x73, 0x49, 0x56, 0x6A, 0x63, 0x75, 0x4D, 0x54, 0x6F, 0x30, 0x4C, 0x6A, 0x41, 0x44, 0x41, 0x67, 0x53, 0x51, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, + 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x0A, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x43, 0x54, 0x31, 0x44, 0x43, 0x77, 0x31, 0x77, 0x4D, 0x67, 0x4B, 0x74, 0x44, 0x35, 0x59, 0x2B, 0x69, 0x52, 0x44, 0x41, 0x55, + 0x67, 0x71, 0x56, 0x38, 0x5A, 0x79, 0x6E, 0x74, 0x79, 0x54, 0x74, 0x53, 0x78, 0x32, 0x39, 0x43, 0x57, 0x2B, 0x31, 0x52, 0x61, 0x47, 0x53, 0x77, 0x4D, 0x43, 0x50, 0x65, 0x79, 0x76, 0x49, 0x57, 0x6F, 0x6E, 0x58, 0x39, 0x74, 0x4F, 0x31, 0x4B, + 0x7A, 0x4B, 0x74, 0x76, 0x6E, 0x31, 0x49, 0x53, 0x4D, 0x0A, 0x59, 0x2F, 0x59, 0x50, 0x79, 0x79, 0x59, 0x42, 0x6B, 0x56, 0x42, 0x73, 0x39, 0x46, 0x38, 0x55, 0x34, 0x70, 0x4E, 0x30, 0x77, 0x42, 0x4F, 0x65, 0x4D, 0x44, 0x70, 0x51, 0x34, 0x37, + 0x52, 0x67, 0x78, 0x52, 0x7A, 0x77, 0x49, 0x6B, 0x53, 0x4E, 0x63, 0x55, 0x65, 0x73, 0x79, 0x42, 0x72, 0x4A, 0x36, 0x5A, 0x75, 0x61, 0x41, 0x47, 0x41, 0x54, 0x2F, 0x33, 0x42, 0x2B, 0x58, 0x78, 0x46, 0x4E, 0x53, 0x52, 0x75, 0x7A, 0x46, 0x56, + 0x4A, 0x37, 0x79, 0x56, 0x54, 0x61, 0x0A, 0x76, 0x35, 0x32, 0x56, 0x72, 0x32, 0x75, 0x61, 0x32, 0x4A, 0x37, 0x70, 0x38, 0x65, 0x52, 0x44, 0x6A, 0x65, 0x49, 0x52, 0x52, 0x44, 0x71, 0x2F, 0x72, 0x37, 0x32, 0x44, 0x51, 0x6E, 0x4E, 0x53, 0x69, + 0x36, 0x71, 0x37, 0x70, 0x79, 0x6E, 0x50, 0x39, 0x57, 0x51, 0x63, 0x43, 0x6B, 0x33, 0x52, 0x76, 0x4B, 0x71, 0x73, 0x6E, 0x79, 0x72, 0x51, 0x2F, 0x33, 0x39, 0x2F, 0x32, 0x6E, 0x33, 0x71, 0x73, 0x65, 0x30, 0x77, 0x4A, 0x63, 0x47, 0x45, 0x32, + 0x6A, 0x54, 0x53, 0x0A, 0x57, 0x33, 0x69, 0x44, 0x56, 0x75, 0x79, 0x63, 0x4E, 0x73, 0x4D, 0x6D, 0x34, 0x68, 0x48, 0x32, 0x5A, 0x30, 0x6B, 0x64, 0x6B, 0x71, 0x75, 0x4D, 0x2B, 0x2B, 0x76, 0x2F, 0x65, 0x75, 0x36, 0x46, 0x53, 0x71, 0x64, 0x51, + 0x67, 0x50, 0x43, 0x6E, 0x58, 0x45, 0x71, 0x55, 0x4C, 0x6C, 0x38, 0x46, 0x6D, 0x54, 0x78, 0x53, 0x51, 0x65, 0x44, 0x4E, 0x74, 0x47, 0x50, 0x50, 0x41, 0x55, 0x4F, 0x36, 0x6E, 0x49, 0x50, 0x63, 0x6A, 0x32, 0x41, 0x37, 0x38, 0x31, 0x71, 0x30, + 0x0A, 0x74, 0x48, 0x75, 0x75, 0x32, 0x67, 0x75, 0x51, 0x4F, 0x48, 0x58, 0x76, 0x67, 0x52, 0x31, 0x6D, 0x30, 0x76, 0x64, 0x58, 0x63, 0x44, 0x61, 0x7A, 0x76, 0x2F, 0x77, 0x6F, 0x72, 0x33, 0x45, 0x6C, 0x68, 0x56, 0x73, 0x54, 0x2F, 0x68, 0x35, + 0x2F, 0x57, 0x72, 0x51, 0x38, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x51, 0x75, 0x6F, 0x56, 0x61, 0x64, 0x69, + 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, + 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x74, 0x7A, 0x43, 0x43, 0x41, 0x35, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x43, 0x42, + 0x51, 0x6B, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x77, 0x52, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, + 0x6B, 0x30, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x0A, 0x45, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, + 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x6C, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x65, + 0x46, 0x77, 0x30, 0x77, 0x4E, 0x6A, 0x45, 0x78, 0x4D, 0x6A, 0x51, 0x78, 0x0A, 0x4F, 0x44, 0x49, 0x33, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x54, 0x45, 0x78, 0x4D, 0x6A, 0x51, 0x78, 0x4F, 0x44, 0x49, 0x7A, 0x4D, 0x7A, 0x4E, + 0x61, 0x4D, 0x45, 0x55, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4A, 0x4E, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x52, 0x64, 0x57, 0x39, + 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x4D, 0x0A, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x52, 0x73, 0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4A, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, + 0x52, 0x70, 0x63, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, + 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x0A, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x61, 0x47, 0x4D, 0x70, 0x4C, 0x6C, 0x41, 0x30, 0x41, 0x4C, 0x61, 0x38, 0x44, 0x4B, 0x59, 0x72, 0x77, 0x44, + 0x34, 0x48, 0x49, 0x72, 0x6B, 0x77, 0x5A, 0x68, 0x52, 0x30, 0x49, 0x6E, 0x36, 0x73, 0x70, 0x52, 0x49, 0x58, 0x7A, 0x4C, 0x34, 0x47, 0x74, 0x4D, 0x68, 0x36, 0x51, 0x52, 0x72, 0x2B, 0x6A, 0x68, 0x69, 0x59, 0x61, 0x48, 0x76, 0x35, 0x2B, 0x48, + 0x42, 0x67, 0x36, 0x0A, 0x58, 0x4A, 0x78, 0x67, 0x46, 0x79, 0x6F, 0x36, 0x64, 0x49, 0x4D, 0x7A, 0x4D, 0x48, 0x31, 0x68, 0x56, 0x42, 0x48, 0x4C, 0x37, 0x61, 0x76, 0x67, 0x35, 0x74, 0x4B, 0x69, 0x66, 0x76, 0x56, 0x72, 0x62, 0x78, 0x69, 0x33, + 0x43, 0x67, 0x73, 0x74, 0x2F, 0x65, 0x6B, 0x2B, 0x37, 0x77, 0x72, 0x47, 0x73, 0x78, 0x44, 0x70, 0x33, 0x4D, 0x4A, 0x47, 0x46, 0x2F, 0x68, 0x64, 0x2F, 0x61, 0x54, 0x61, 0x2F, 0x35, 0x35, 0x4A, 0x57, 0x70, 0x7A, 0x6D, 0x4D, 0x2B, 0x59, 0x6B, + 0x0A, 0x6C, 0x76, 0x63, 0x2F, 0x75, 0x6C, 0x73, 0x72, 0x48, 0x48, 0x6F, 0x31, 0x77, 0x74, 0x5A, 0x6E, 0x2F, 0x71, 0x74, 0x6D, 0x55, 0x49, 0x74, 0x74, 0x4B, 0x47, 0x41, 0x72, 0x37, 0x39, 0x64, 0x67, 0x77, 0x38, 0x65, 0x54, 0x76, 0x49, 0x30, + 0x32, 0x6B, 0x66, 0x4E, 0x2F, 0x2B, 0x4E, 0x73, 0x52, 0x45, 0x38, 0x53, 0x63, 0x64, 0x33, 0x62, 0x42, 0x72, 0x72, 0x63, 0x43, 0x61, 0x6F, 0x46, 0x36, 0x71, 0x55, 0x57, 0x44, 0x34, 0x67, 0x58, 0x6D, 0x75, 0x56, 0x62, 0x42, 0x0A, 0x6C, 0x44, + 0x65, 0x50, 0x53, 0x48, 0x46, 0x6A, 0x49, 0x75, 0x77, 0x58, 0x5A, 0x51, 0x65, 0x56, 0x69, 0x6B, 0x76, 0x66, 0x6A, 0x38, 0x5A, 0x61, 0x43, 0x75, 0x57, 0x77, 0x34, 0x31, 0x39, 0x65, 0x61, 0x78, 0x47, 0x72, 0x44, 0x50, 0x6D, 0x46, 0x36, 0x30, + 0x54, 0x70, 0x2B, 0x41, 0x52, 0x7A, 0x38, 0x75, 0x6E, 0x2B, 0x58, 0x4A, 0x69, 0x4D, 0x39, 0x58, 0x4F, 0x76, 0x61, 0x37, 0x52, 0x2B, 0x7A, 0x64, 0x52, 0x63, 0x41, 0x69, 0x74, 0x4D, 0x4F, 0x65, 0x47, 0x79, 0x0A, 0x6C, 0x5A, 0x55, 0x74, 0x51, + 0x6F, 0x66, 0x58, 0x31, 0x62, 0x4F, 0x51, 0x51, 0x37, 0x64, 0x73, 0x45, 0x2F, 0x48, 0x65, 0x33, 0x66, 0x62, 0x45, 0x2B, 0x49, 0x6B, 0x2F, 0x30, 0x58, 0x58, 0x31, 0x6B, 0x73, 0x4F, 0x52, 0x31, 0x59, 0x71, 0x49, 0x30, 0x4A, 0x44, 0x73, 0x33, + 0x47, 0x33, 0x65, 0x69, 0x63, 0x4A, 0x6C, 0x63, 0x5A, 0x61, 0x4C, 0x44, 0x51, 0x50, 0x39, 0x6E, 0x4C, 0x39, 0x62, 0x46, 0x71, 0x79, 0x53, 0x32, 0x2B, 0x72, 0x2B, 0x65, 0x58, 0x79, 0x74, 0x0A, 0x36, 0x36, 0x2F, 0x33, 0x46, 0x73, 0x76, 0x62, + 0x7A, 0x53, 0x55, 0x72, 0x35, 0x52, 0x2F, 0x37, 0x6D, 0x70, 0x2F, 0x69, 0x55, 0x63, 0x77, 0x36, 0x55, 0x77, 0x78, 0x49, 0x35, 0x67, 0x36, 0x39, 0x79, 0x62, 0x52, 0x32, 0x42, 0x6C, 0x4C, 0x6D, 0x45, 0x52, 0x4F, 0x46, 0x63, 0x6D, 0x4D, 0x44, + 0x42, 0x4F, 0x41, 0x45, 0x4E, 0x69, 0x73, 0x67, 0x47, 0x51, 0x4C, 0x6F, 0x64, 0x4B, 0x63, 0x66, 0x74, 0x73, 0x6C, 0x57, 0x5A, 0x76, 0x42, 0x31, 0x4A, 0x64, 0x78, 0x6E, 0x0A, 0x77, 0x51, 0x35, 0x68, 0x59, 0x49, 0x69, 0x7A, 0x50, 0x74, 0x47, + 0x6F, 0x2F, 0x4B, 0x50, 0x61, 0x48, 0x62, 0x44, 0x52, 0x73, 0x53, 0x4E, 0x55, 0x33, 0x30, 0x52, 0x32, 0x62, 0x65, 0x31, 0x42, 0x32, 0x4D, 0x47, 0x79, 0x49, 0x72, 0x5A, 0x54, 0x48, 0x4E, 0x38, 0x31, 0x48, 0x64, 0x79, 0x68, 0x64, 0x79, 0x6F, + 0x78, 0x35, 0x43, 0x33, 0x31, 0x35, 0x65, 0x58, 0x62, 0x79, 0x4F, 0x44, 0x2F, 0x35, 0x59, 0x44, 0x58, 0x43, 0x32, 0x4F, 0x67, 0x2F, 0x7A, 0x4F, 0x68, 0x0A, 0x44, 0x37, 0x6F, 0x73, 0x46, 0x52, 0x58, 0x71, 0x6C, 0x37, 0x50, 0x53, 0x6F, 0x72, + 0x57, 0x2B, 0x38, 0x6F, 0x79, 0x57, 0x48, 0x68, 0x71, 0x50, 0x48, 0x57, 0x79, 0x6B, 0x59, 0x54, 0x65, 0x35, 0x68, 0x6E, 0x4D, 0x7A, 0x31, 0x35, 0x65, 0x57, 0x6E, 0x69, 0x4E, 0x39, 0x67, 0x71, 0x52, 0x4D, 0x67, 0x65, 0x4B, 0x68, 0x30, 0x62, + 0x70, 0x6E, 0x58, 0x35, 0x55, 0x48, 0x6F, 0x79, 0x63, 0x52, 0x37, 0x68, 0x59, 0x51, 0x65, 0x37, 0x78, 0x46, 0x53, 0x6B, 0x79, 0x79, 0x0A, 0x42, 0x4E, 0x4B, 0x72, 0x37, 0x39, 0x58, 0x39, 0x44, 0x46, 0x48, 0x4F, 0x55, 0x47, 0x6F, 0x49, 0x4D, + 0x66, 0x6D, 0x52, 0x32, 0x67, 0x79, 0x50, 0x5A, 0x46, 0x77, 0x44, 0x77, 0x7A, 0x71, 0x4C, 0x49, 0x44, 0x39, 0x75, 0x6A, 0x57, 0x63, 0x39, 0x4F, 0x74, 0x62, 0x2B, 0x66, 0x56, 0x75, 0x49, 0x79, 0x56, 0x37, 0x37, 0x7A, 0x47, 0x48, 0x63, 0x69, + 0x7A, 0x4E, 0x33, 0x30, 0x30, 0x51, 0x79, 0x4E, 0x51, 0x6C, 0x69, 0x42, 0x4A, 0x49, 0x57, 0x45, 0x4E, 0x69, 0x65, 0x0A, 0x4A, 0x30, 0x66, 0x37, 0x4F, 0x79, 0x48, 0x6A, 0x2B, 0x4F, 0x73, 0x64, 0x57, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, + 0x6F, 0x34, 0x47, 0x77, 0x4D, 0x49, 0x47, 0x74, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, + 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x51, 0x61, 0x68, 0x47, 0x4B, 0x38, 0x53, 0x45, 0x77, 0x7A, 0x4A, 0x51, 0x54, 0x55, 0x37, 0x74, 0x44, + 0x32, 0x41, 0x38, 0x51, 0x5A, 0x52, 0x74, 0x47, 0x55, 0x61, 0x7A, 0x42, 0x75, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x5A, 0x7A, 0x42, 0x6C, 0x67, 0x42, 0x51, 0x61, 0x68, 0x47, 0x4B, 0x38, 0x53, 0x45, 0x77, 0x7A, 0x4A, 0x51, 0x54, + 0x55, 0x37, 0x74, 0x44, 0x32, 0x41, 0x38, 0x51, 0x5A, 0x52, 0x74, 0x47, 0x55, 0x0A, 0x61, 0x36, 0x46, 0x4A, 0x70, 0x45, 0x63, 0x77, 0x52, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, + 0x30, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x47, 0x7A, + 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x0A, 0x45, 0x6C, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6F, 0x49, 0x43, 0x42, + 0x51, 0x6B, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x44, 0x34, 0x4B, 0x46, 0x6B, 0x32, 0x66, 0x42, 0x6C, 0x75, 0x6F, 0x72, + 0x6E, 0x46, 0x64, 0x4C, 0x77, 0x55, 0x76, 0x0A, 0x5A, 0x2B, 0x59, 0x54, 0x52, 0x59, 0x50, 0x45, 0x4E, 0x76, 0x62, 0x7A, 0x77, 0x43, 0x59, 0x4D, 0x44, 0x62, 0x56, 0x48, 0x5A, 0x46, 0x33, 0x34, 0x74, 0x48, 0x4C, 0x4A, 0x52, 0x71, 0x55, 0x44, + 0x47, 0x43, 0x64, 0x56, 0x69, 0x58, 0x68, 0x39, 0x64, 0x75, 0x71, 0x57, 0x4E, 0x49, 0x41, 0x58, 0x49, 0x4E, 0x7A, 0x6E, 0x67, 0x2F, 0x69, 0x4E, 0x2F, 0x41, 0x65, 0x34, 0x32, 0x6C, 0x39, 0x4E, 0x4C, 0x6D, 0x65, 0x79, 0x68, 0x50, 0x33, 0x5A, + 0x52, 0x50, 0x78, 0x33, 0x0A, 0x55, 0x49, 0x48, 0x6D, 0x66, 0x4C, 0x54, 0x4A, 0x44, 0x51, 0x74, 0x79, 0x55, 0x2F, 0x68, 0x32, 0x42, 0x77, 0x64, 0x42, 0x52, 0x35, 0x59, 0x4D, 0x2B, 0x2B, 0x43, 0x43, 0x4A, 0x70, 0x4E, 0x56, 0x6A, 0x50, 0x34, + 0x69, 0x48, 0x32, 0x42, 0x6C, 0x66, 0x46, 0x2F, 0x6E, 0x4A, 0x72, 0x50, 0x33, 0x4D, 0x70, 0x43, 0x59, 0x55, 0x4E, 0x51, 0x33, 0x63, 0x56, 0x58, 0x32, 0x6B, 0x69, 0x46, 0x34, 0x39, 0x35, 0x56, 0x35, 0x2B, 0x76, 0x67, 0x74, 0x4A, 0x6F, 0x64, + 0x6D, 0x0A, 0x56, 0x6A, 0x42, 0x33, 0x70, 0x6A, 0x64, 0x34, 0x4D, 0x31, 0x49, 0x51, 0x57, 0x4B, 0x34, 0x2F, 0x59, 0x59, 0x37, 0x79, 0x61, 0x72, 0x48, 0x76, 0x47, 0x48, 0x35, 0x4B, 0x57, 0x57, 0x50, 0x4B, 0x6A, 0x61, 0x4A, 0x57, 0x31, 0x61, + 0x63, 0x76, 0x76, 0x46, 0x59, 0x66, 0x7A, 0x7A, 0x6E, 0x42, 0x34, 0x76, 0x73, 0x4B, 0x71, 0x42, 0x55, 0x73, 0x66, 0x55, 0x31, 0x36, 0x59, 0x38, 0x5A, 0x73, 0x6C, 0x30, 0x51, 0x38, 0x30, 0x6D, 0x2F, 0x44, 0x53, 0x68, 0x63, 0x4B, 0x0A, 0x2B, + 0x4A, 0x44, 0x53, 0x56, 0x36, 0x49, 0x5A, 0x55, 0x61, 0x55, 0x74, 0x6C, 0x30, 0x48, 0x61, 0x42, 0x30, 0x2B, 0x70, 0x55, 0x4E, 0x71, 0x51, 0x6A, 0x5A, 0x52, 0x47, 0x34, 0x54, 0x37, 0x77, 0x6C, 0x50, 0x30, 0x51, 0x41, 0x44, 0x6A, 0x31, 0x4F, + 0x2B, 0x68, 0x41, 0x34, 0x62, 0x52, 0x75, 0x56, 0x68, 0x6F, 0x67, 0x7A, 0x47, 0x39, 0x59, 0x6A, 0x65, 0x30, 0x75, 0x52, 0x59, 0x2F, 0x57, 0x36, 0x5A, 0x4D, 0x2F, 0x35, 0x37, 0x45, 0x73, 0x33, 0x7A, 0x72, 0x57, 0x0A, 0x49, 0x6F, 0x7A, 0x63, + 0x68, 0x4C, 0x73, 0x69, 0x62, 0x39, 0x44, 0x34, 0x35, 0x4D, 0x59, 0x35, 0x36, 0x51, 0x53, 0x49, 0x50, 0x4D, 0x4F, 0x36, 0x36, 0x31, 0x56, 0x36, 0x62, 0x59, 0x43, 0x5A, 0x4A, 0x50, 0x56, 0x73, 0x41, 0x66, 0x76, 0x34, 0x6C, 0x37, 0x43, 0x55, + 0x57, 0x2B, 0x76, 0x39, 0x30, 0x6D, 0x2F, 0x78, 0x64, 0x32, 0x67, 0x4E, 0x4E, 0x57, 0x51, 0x6A, 0x72, 0x4C, 0x68, 0x56, 0x6F, 0x51, 0x50, 0x52, 0x54, 0x55, 0x49, 0x5A, 0x33, 0x50, 0x68, 0x31, 0x0A, 0x57, 0x56, 0x61, 0x6A, 0x2B, 0x61, 0x68, + 0x4A, 0x65, 0x66, 0x69, 0x76, 0x44, 0x72, 0x6B, 0x52, 0x6F, 0x48, 0x79, 0x33, 0x61, 0x75, 0x30, 0x30, 0x30, 0x4C, 0x59, 0x6D, 0x59, 0x6A, 0x67, 0x61, 0x68, 0x77, 0x7A, 0x34, 0x36, 0x50, 0x30, 0x75, 0x30, 0x35, 0x42, 0x2F, 0x42, 0x35, 0x45, + 0x71, 0x48, 0x64, 0x5A, 0x2B, 0x58, 0x49, 0x57, 0x44, 0x6D, 0x62, 0x41, 0x34, 0x43, 0x44, 0x2F, 0x70, 0x58, 0x76, 0x6B, 0x31, 0x42, 0x2B, 0x54, 0x4A, 0x59, 0x6D, 0x35, 0x58, 0x0A, 0x66, 0x36, 0x64, 0x51, 0x6C, 0x66, 0x65, 0x36, 0x79, 0x4A, + 0x76, 0x6D, 0x6A, 0x71, 0x49, 0x42, 0x78, 0x64, 0x5A, 0x6D, 0x76, 0x33, 0x6C, 0x68, 0x38, 0x7A, 0x77, 0x63, 0x34, 0x62, 0x6D, 0x43, 0x58, 0x46, 0x32, 0x67, 0x77, 0x2B, 0x6E, 0x59, 0x53, 0x4C, 0x30, 0x5A, 0x6F, 0x68, 0x45, 0x55, 0x47, 0x57, + 0x36, 0x79, 0x68, 0x68, 0x74, 0x6F, 0x50, 0x6B, 0x67, 0x33, 0x47, 0x6F, 0x69, 0x33, 0x58, 0x5A, 0x5A, 0x65, 0x6E, 0x4D, 0x66, 0x76, 0x4A, 0x32, 0x49, 0x49, 0x0A, 0x34, 0x70, 0x45, 0x5A, 0x58, 0x4E, 0x4C, 0x78, 0x49, 0x64, 0x32, 0x36, 0x46, + 0x30, 0x4B, 0x43, 0x6C, 0x33, 0x47, 0x42, 0x55, 0x7A, 0x47, 0x70, 0x6E, 0x2F, 0x5A, 0x39, 0x59, 0x72, 0x39, 0x79, 0x34, 0x61, 0x4F, 0x54, 0x48, 0x63, 0x79, 0x4B, 0x4A, 0x6C, 0x6F, 0x4A, 0x4F, 0x4E, 0x44, 0x4F, 0x31, 0x77, 0x32, 0x41, 0x46, + 0x72, 0x52, 0x34, 0x70, 0x54, 0x71, 0x48, 0x54, 0x49, 0x32, 0x4B, 0x70, 0x64, 0x56, 0x47, 0x6C, 0x2F, 0x49, 0x73, 0x45, 0x4C, 0x6D, 0x38, 0x0A, 0x56, 0x43, 0x4C, 0x41, 0x41, 0x56, 0x42, 0x70, 0x51, 0x35, 0x37, 0x30, 0x73, 0x75, 0x39, 0x74, + 0x2B, 0x4F, 0x7A, 0x61, 0x38, 0x65, 0x4F, 0x78, 0x37, 0x39, 0x2B, 0x52, 0x6A, 0x31, 0x51, 0x71, 0x43, 0x79, 0x58, 0x42, 0x4A, 0x68, 0x6E, 0x45, 0x55, 0x68, 0x41, 0x46, 0x5A, 0x64, 0x57, 0x43, 0x45, 0x4F, 0x72, 0x43, 0x4D, 0x63, 0x30, 0x75, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x51, 0x75, 0x6F, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6F, 0x6F, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x47, 0x6E, 0x54, 0x43, 0x43, 0x42, 0x49, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x43, 0x42, 0x63, 0x59, 0x77, 0x44, 0x51, + 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x77, 0x52, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x30, 0x78, 0x47, 0x54, + 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x0A, 0x45, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x6C, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4E, + 0x6A, 0x45, 0x78, 0x4D, 0x6A, 0x51, 0x78, 0x0A, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x6A, 0x4E, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x54, 0x45, 0x78, 0x4D, 0x6A, 0x51, 0x78, 0x4F, 0x54, 0x41, 0x32, 0x4E, 0x44, 0x52, 0x61, 0x4D, 0x45, 0x55, 0x78, + 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4A, 0x4E, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, + 0x63, 0x79, 0x42, 0x4D, 0x0A, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x52, 0x73, 0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4A, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, + 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, + 0x43, 0x0A, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x4D, 0x56, 0x30, 0x49, 0x57, 0x56, 0x4A, 0x7A, 0x6D, 0x6D, 0x4E, 0x50, 0x54, 0x54, 0x65, 0x37, 0x2B, 0x37, 0x63, 0x65, 0x66, 0x51, 0x7A, + 0x6C, 0x4B, 0x5A, 0x62, 0x50, 0x6F, 0x46, 0x6F, 0x67, 0x30, 0x32, 0x77, 0x31, 0x5A, 0x6B, 0x58, 0x54, 0x50, 0x6B, 0x72, 0x67, 0x45, 0x51, 0x4B, 0x30, 0x43, 0x53, 0x7A, 0x47, 0x72, 0x76, 0x49, 0x32, 0x52, 0x61, 0x4E, 0x67, 0x67, 0x0A, 0x44, + 0x68, 0x6F, 0x42, 0x34, 0x68, 0x70, 0x37, 0x54, 0x68, 0x64, 0x64, 0x34, 0x6F, 0x71, 0x33, 0x50, 0x35, 0x6B, 0x61, 0x7A, 0x65, 0x74, 0x68, 0x71, 0x38, 0x4A, 0x6C, 0x70, 0x68, 0x2B, 0x33, 0x74, 0x37, 0x32, 0x33, 0x6A, 0x2F, 0x7A, 0x39, 0x63, + 0x49, 0x38, 0x4C, 0x6F, 0x47, 0x65, 0x2B, 0x41, 0x61, 0x4A, 0x5A, 0x7A, 0x33, 0x48, 0x6D, 0x44, 0x79, 0x6C, 0x32, 0x2F, 0x37, 0x46, 0x57, 0x65, 0x55, 0x55, 0x72, 0x48, 0x35, 0x35, 0x36, 0x56, 0x4F, 0x69, 0x6A, 0x0A, 0x4B, 0x54, 0x56, 0x6F, + 0x70, 0x41, 0x46, 0x50, 0x44, 0x36, 0x51, 0x75, 0x4E, 0x2B, 0x38, 0x62, 0x76, 0x2B, 0x4F, 0x50, 0x45, 0x4B, 0x68, 0x79, 0x71, 0x31, 0x68, 0x58, 0x35, 0x31, 0x53, 0x47, 0x79, 0x4D, 0x6E, 0x7A, 0x57, 0x39, 0x6F, 0x73, 0x32, 0x6C, 0x32, 0x4F, + 0x62, 0x6A, 0x79, 0x6A, 0x50, 0x74, 0x72, 0x37, 0x67, 0x75, 0x58, 0x64, 0x38, 0x6C, 0x79, 0x79, 0x42, 0x54, 0x4E, 0x76, 0x69, 0x6A, 0x62, 0x4F, 0x30, 0x42, 0x4E, 0x4F, 0x2F, 0x37, 0x39, 0x4B, 0x0A, 0x44, 0x44, 0x52, 0x4D, 0x70, 0x73, 0x4D, + 0x68, 0x76, 0x56, 0x41, 0x45, 0x56, 0x65, 0x75, 0x78, 0x75, 0x35, 0x33, 0x37, 0x52, 0x52, 0x35, 0x6B, 0x46, 0x64, 0x35, 0x56, 0x41, 0x59, 0x77, 0x43, 0x64, 0x72, 0x58, 0x4C, 0x6F, 0x54, 0x39, 0x43, 0x61, 0x62, 0x77, 0x76, 0x76, 0x57, 0x68, + 0x44, 0x46, 0x6C, 0x61, 0x4A, 0x4B, 0x6A, 0x64, 0x68, 0x6B, 0x66, 0x32, 0x6D, 0x72, 0x6B, 0x37, 0x41, 0x79, 0x78, 0x52, 0x6C, 0x6C, 0x44, 0x64, 0x4C, 0x6B, 0x67, 0x62, 0x76, 0x0A, 0x42, 0x4E, 0x44, 0x49, 0x6E, 0x49, 0x6A, 0x62, 0x43, 0x33, + 0x75, 0x42, 0x72, 0x37, 0x45, 0x39, 0x4B, 0x73, 0x52, 0x6C, 0x4F, 0x6E, 0x69, 0x32, 0x37, 0x74, 0x79, 0x41, 0x73, 0x64, 0x4C, 0x54, 0x6D, 0x5A, 0x77, 0x36, 0x37, 0x6D, 0x74, 0x61, 0x61, 0x37, 0x4F, 0x4E, 0x74, 0x39, 0x58, 0x4F, 0x6E, 0x4D, + 0x4B, 0x2B, 0x70, 0x55, 0x73, 0x76, 0x46, 0x72, 0x47, 0x65, 0x61, 0x44, 0x73, 0x47, 0x62, 0x36, 0x35, 0x39, 0x6E, 0x2F, 0x6A, 0x65, 0x37, 0x4D, 0x77, 0x70, 0x0A, 0x70, 0x35, 0x69, 0x6A, 0x4A, 0x55, 0x4D, 0x76, 0x37, 0x2F, 0x46, 0x66, 0x4A, + 0x75, 0x47, 0x49, 0x54, 0x66, 0x68, 0x65, 0x62, 0x74, 0x66, 0x5A, 0x46, 0x47, 0x34, 0x5A, 0x4D, 0x32, 0x6D, 0x6E, 0x4F, 0x34, 0x53, 0x4A, 0x6B, 0x38, 0x52, 0x54, 0x56, 0x52, 0x4F, 0x68, 0x55, 0x58, 0x68, 0x41, 0x2B, 0x4C, 0x6A, 0x4A, 0x6F, + 0x75, 0x35, 0x37, 0x75, 0x6C, 0x4A, 0x43, 0x67, 0x35, 0x34, 0x55, 0x37, 0x51, 0x56, 0x53, 0x57, 0x6C, 0x6C, 0x57, 0x70, 0x35, 0x66, 0x38, 0x0A, 0x6E, 0x54, 0x38, 0x4B, 0x4B, 0x64, 0x6A, 0x63, 0x54, 0x35, 0x45, 0x4F, 0x45, 0x37, 0x7A, 0x65, + 0x6C, 0x61, 0x54, 0x66, 0x69, 0x35, 0x6D, 0x2B, 0x72, 0x4A, 0x73, 0x7A, 0x69, 0x4F, 0x2B, 0x31, 0x67, 0x61, 0x38, 0x62, 0x78, 0x69, 0x4A, 0x54, 0x79, 0x50, 0x62, 0x48, 0x37, 0x70, 0x63, 0x55, 0x73, 0x4D, 0x56, 0x38, 0x65, 0x46, 0x4C, 0x49, + 0x38, 0x4D, 0x35, 0x75, 0x64, 0x32, 0x43, 0x45, 0x70, 0x75, 0x6B, 0x71, 0x64, 0x69, 0x44, 0x74, 0x57, 0x41, 0x45, 0x58, 0x0A, 0x4D, 0x4A, 0x50, 0x70, 0x47, 0x6F, 0x76, 0x67, 0x63, 0x32, 0x50, 0x5A, 0x61, 0x70, 0x4B, 0x55, 0x53, 0x55, 0x36, + 0x30, 0x72, 0x55, 0x71, 0x46, 0x78, 0x4B, 0x4D, 0x69, 0x4D, 0x50, 0x77, 0x4A, 0x37, 0x57, 0x67, 0x69, 0x63, 0x36, 0x61, 0x49, 0x44, 0x46, 0x55, 0x68, 0x57, 0x4D, 0x58, 0x68, 0x4F, 0x70, 0x38, 0x71, 0x33, 0x63, 0x72, 0x68, 0x6B, 0x4F, 0x44, + 0x5A, 0x63, 0x36, 0x74, 0x73, 0x67, 0x4C, 0x6A, 0x6F, 0x43, 0x32, 0x53, 0x54, 0x6F, 0x4A, 0x79, 0x4D, 0x0A, 0x47, 0x66, 0x2B, 0x7A, 0x30, 0x67, 0x7A, 0x73, 0x6B, 0x53, 0x61, 0x48, 0x69, 0x72, 0x4F, 0x69, 0x34, 0x58, 0x43, 0x50, 0x4C, 0x41, + 0x72, 0x6C, 0x7A, 0x57, 0x31, 0x6F, 0x55, 0x65, 0x76, 0x61, 0x50, 0x77, 0x56, 0x2F, 0x69, 0x7A, 0x4C, 0x6D, 0x45, 0x31, 0x78, 0x72, 0x2F, 0x6C, 0x39, 0x41, 0x34, 0x69, 0x4C, 0x49, 0x74, 0x4C, 0x52, 0x6B, 0x54, 0x39, 0x61, 0x36, 0x66, 0x55, + 0x67, 0x2B, 0x71, 0x47, 0x6B, 0x4D, 0x31, 0x37, 0x75, 0x47, 0x63, 0x63, 0x6C, 0x7A, 0x0A, 0x75, 0x44, 0x38, 0x37, 0x6E, 0x53, 0x56, 0x4C, 0x32, 0x76, 0x39, 0x41, 0x36, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x49, 0x42, 0x6C, + 0x54, 0x43, 0x43, 0x41, 0x5A, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x43, 0x42, 0x34, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x67, 0x42, + 0x49, 0x48, 0x5A, 0x4D, 0x49, 0x48, 0x57, 0x4D, 0x49, 0x48, 0x54, 0x0A, 0x42, 0x67, 0x6B, 0x72, 0x42, 0x67, 0x45, 0x45, 0x41, 0x62, 0x35, 0x59, 0x41, 0x41, 0x4D, 0x77, 0x67, 0x63, 0x55, 0x77, 0x67, 0x5A, 0x4D, 0x47, 0x43, 0x43, 0x73, 0x47, + 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x49, 0x43, 0x4D, 0x49, 0x47, 0x47, 0x47, 0x6F, 0x47, 0x44, 0x51, 0x57, 0x35, 0x35, 0x49, 0x48, 0x56, 0x7A, 0x5A, 0x53, 0x42, 0x76, 0x5A, 0x69, 0x42, 0x30, 0x61, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x4E, 0x6C, + 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x0A, 0x59, 0x58, 0x52, 0x6C, 0x49, 0x47, 0x4E, 0x76, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x56, 0x7A, 0x49, 0x47, 0x46, 0x6A, 0x59, 0x32, 0x56, 0x77, 0x64, 0x47, 0x46, + 0x75, 0x59, 0x32, 0x55, 0x67, 0x62, 0x32, 0x59, 0x67, 0x64, 0x47, 0x68, 0x6C, 0x49, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x79, 0x42, + 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x0A, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x5A, 0x53, 0x42, 0x51, 0x62, 0x32, 0x78, 0x70, 0x59, 0x33, 0x6B, 0x67, 0x4C, 0x79, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, + 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x46, 0x42, 0x79, 0x59, 0x57, 0x4E, 0x30, 0x61, 0x57, 0x4E, 0x6C, 0x49, 0x46, 0x4E, 0x30, 0x59, 0x58, 0x52, 0x6C, 0x62, 0x57, 0x56, 0x75, 0x64, 0x43, 0x34, 0x77, 0x4C, 0x51, 0x59, 0x49, 0x4B, 0x77, + 0x59, 0x42, 0x0A, 0x42, 0x51, 0x55, 0x48, 0x41, 0x67, 0x45, 0x57, 0x49, 0x57, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x33, 0x64, 0x33, 0x63, 0x75, 0x63, 0x58, 0x56, 0x76, 0x64, 0x6D, 0x46, 0x6B, 0x61, 0x58, 0x4E, 0x6E, 0x62, + 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4C, 0x32, 0x4E, 0x77, 0x63, 0x7A, 0x41, 0x4C, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x0A, + 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x50, 0x4C, 0x41, 0x45, 0x2B, 0x43, 0x43, 0x51, 0x7A, 0x37, 0x37, 0x37, 0x69, 0x39, 0x6E, 0x4D, 0x70, 0x59, 0x31, 0x58, 0x4E, 0x75, 0x34, 0x79, 0x77, 0x4C, 0x51, 0x4D, 0x47, 0x34, 0x47, + 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x52, 0x6E, 0x4D, 0x47, 0x57, 0x41, 0x46, 0x50, 0x4C, 0x41, 0x45, 0x2B, 0x43, 0x43, 0x51, 0x7A, 0x37, 0x37, 0x37, 0x69, 0x39, 0x6E, 0x4D, 0x70, 0x59, 0x31, 0x58, 0x4E, 0x75, 0x34, 0x0A, 0x79, 0x77, 0x4C, + 0x51, 0x6F, 0x55, 0x6D, 0x6B, 0x52, 0x7A, 0x42, 0x46, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x43, 0x54, 0x54, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, + 0x51, 0x55, 0x58, 0x56, 0x76, 0x56, 0x6D, 0x46, 0x6B, 0x61, 0x58, 0x4D, 0x67, 0x54, 0x47, 0x6C, 0x74, 0x61, 0x58, 0x52, 0x6C, 0x5A, 0x44, 0x45, 0x62, 0x4D, 0x42, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x41, 0x78, 0x4D, 0x53, 0x55, 0x58, + 0x56, 0x76, 0x56, 0x6D, 0x46, 0x6B, 0x61, 0x58, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x7A, 0x67, 0x67, 0x49, 0x46, 0x78, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, + 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x54, 0x36, 0x32, 0x67, 0x4C, 0x45, 0x7A, 0x36, 0x77, 0x50, 0x4A, 0x76, 0x39, 0x32, 0x5A, 0x56, 0x0A, 0x71, 0x79, 0x4D, 0x30, 0x37, 0x75, 0x63, 0x70, 0x32, + 0x73, 0x4E, 0x62, 0x74, 0x72, 0x43, 0x44, 0x32, 0x64, 0x44, 0x51, 0x34, 0x69, 0x48, 0x37, 0x38, 0x32, 0x43, 0x6E, 0x4F, 0x31, 0x31, 0x67, 0x55, 0x79, 0x65, 0x69, 0x6D, 0x2F, 0x59, 0x49, 0x49, 0x69, 0x72, 0x6E, 0x76, 0x36, 0x42, 0x79, 0x35, + 0x5A, 0x77, 0x6B, 0x61, 0x6A, 0x47, 0x78, 0x6B, 0x48, 0x6F, 0x6E, 0x32, 0x34, 0x51, 0x52, 0x69, 0x53, 0x65, 0x6D, 0x64, 0x31, 0x6F, 0x34, 0x31, 0x37, 0x2B, 0x73, 0x0A, 0x68, 0x76, 0x7A, 0x75, 0x58, 0x59, 0x4F, 0x38, 0x42, 0x73, 0x62, 0x52, + 0x64, 0x32, 0x73, 0x50, 0x62, 0x53, 0x51, 0x76, 0x53, 0x33, 0x70, 0x73, 0x70, 0x77, 0x65, 0x57, 0x79, 0x75, 0x4F, 0x45, 0x6E, 0x36, 0x32, 0x49, 0x69, 0x78, 0x32, 0x72, 0x46, 0x6F, 0x31, 0x62, 0x5A, 0x68, 0x66, 0x5A, 0x46, 0x76, 0x53, 0x4C, + 0x67, 0x4E, 0x4C, 0x64, 0x2B, 0x4C, 0x4A, 0x32, 0x77, 0x2F, 0x77, 0x34, 0x45, 0x36, 0x6F, 0x4D, 0x33, 0x6B, 0x4A, 0x70, 0x4B, 0x32, 0x37, 0x7A, 0x0A, 0x50, 0x4F, 0x75, 0x41, 0x4A, 0x39, 0x76, 0x31, 0x70, 0x6B, 0x51, 0x4E, 0x6E, 0x31, 0x70, + 0x56, 0x57, 0x51, 0x76, 0x56, 0x44, 0x56, 0x4A, 0x49, 0x78, 0x61, 0x36, 0x66, 0x38, 0x69, 0x2B, 0x41, 0x78, 0x65, 0x6F, 0x79, 0x55, 0x44, 0x55, 0x53, 0x6C, 0x79, 0x37, 0x42, 0x34, 0x66, 0x2F, 0x78, 0x49, 0x34, 0x68, 0x52, 0x4F, 0x4A, 0x2F, + 0x79, 0x5A, 0x6C, 0x5A, 0x32, 0x35, 0x77, 0x39, 0x52, 0x6C, 0x36, 0x56, 0x53, 0x44, 0x45, 0x31, 0x4A, 0x55, 0x5A, 0x55, 0x32, 0x0A, 0x50, 0x62, 0x2B, 0x69, 0x53, 0x77, 0x77, 0x51, 0x48, 0x59, 0x61, 0x5A, 0x54, 0x4B, 0x72, 0x7A, 0x63, 0x68, + 0x47, 0x54, 0x35, 0x4F, 0x72, 0x32, 0x6D, 0x39, 0x71, 0x6F, 0x58, 0x61, 0x64, 0x4E, 0x74, 0x35, 0x34, 0x43, 0x72, 0x6E, 0x4D, 0x41, 0x79, 0x4E, 0x6F, 0x6A, 0x41, 0x2B, 0x6A, 0x35, 0x36, 0x68, 0x6C, 0x30, 0x59, 0x67, 0x43, 0x55, 0x79, 0x79, + 0x49, 0x67, 0x76, 0x70, 0x53, 0x6E, 0x57, 0x62, 0x57, 0x43, 0x61, 0x72, 0x36, 0x5A, 0x65, 0x58, 0x71, 0x70, 0x0A, 0x38, 0x6B, 0x6F, 0x6B, 0x55, 0x76, 0x64, 0x30, 0x2F, 0x62, 0x70, 0x4F, 0x35, 0x71, 0x67, 0x64, 0x41, 0x6D, 0x36, 0x78, 0x44, + 0x59, 0x42, 0x45, 0x77, 0x61, 0x37, 0x54, 0x49, 0x7A, 0x64, 0x66, 0x75, 0x34, 0x56, 0x38, 0x4B, 0x35, 0x49, 0x75, 0x36, 0x48, 0x36, 0x6C, 0x69, 0x39, 0x32, 0x5A, 0x34, 0x62, 0x38, 0x6E, 0x62, 0x79, 0x31, 0x64, 0x71, 0x6E, 0x75, 0x48, 0x2F, + 0x67, 0x72, 0x64, 0x53, 0x2F, 0x79, 0x4F, 0x39, 0x53, 0x62, 0x6B, 0x62, 0x6E, 0x42, 0x43, 0x0A, 0x62, 0x6A, 0x50, 0x73, 0x4D, 0x5A, 0x35, 0x37, 0x6B, 0x38, 0x48, 0x6B, 0x79, 0x57, 0x6B, 0x61, 0x50, 0x63, 0x42, 0x72, 0x54, 0x69, 0x4A, 0x74, + 0x37, 0x71, 0x74, 0x59, 0x54, 0x63, 0x62, 0x51, 0x51, 0x63, 0x45, 0x72, 0x36, 0x6B, 0x38, 0x53, 0x68, 0x31, 0x37, 0x72, 0x52, 0x64, 0x68, 0x73, 0x39, 0x5A, 0x67, 0x43, 0x30, 0x36, 0x44, 0x59, 0x56, 0x59, 0x6F, 0x47, 0x6D, 0x52, 0x6D, 0x69, + 0x6F, 0x48, 0x66, 0x52, 0x4D, 0x4A, 0x36, 0x73, 0x7A, 0x48, 0x58, 0x75, 0x0A, 0x67, 0x2F, 0x57, 0x77, 0x59, 0x6A, 0x6E, 0x50, 0x62, 0x46, 0x66, 0x69, 0x54, 0x4E, 0x4B, 0x52, 0x43, 0x77, 0x35, 0x31, 0x4B, 0x42, 0x75, 0x61, 0x76, 0x2F, 0x30, + 0x61, 0x51, 0x2F, 0x48, 0x4B, 0x64, 0x2F, 0x73, 0x37, 0x6A, 0x32, 0x47, 0x34, 0x61, 0x53, 0x67, 0x57, 0x51, 0x67, 0x52, 0x65, 0x63, 0x43, 0x6F, 0x63, 0x49, 0x64, 0x69, 0x50, 0x34, 0x62, 0x30, 0x6A, 0x57, 0x79, 0x31, 0x30, 0x51, 0x4A, 0x4C, + 0x5A, 0x59, 0x78, 0x6B, 0x4E, 0x63, 0x39, 0x31, 0x70, 0x0A, 0x76, 0x47, 0x4A, 0x48, 0x76, 0x4F, 0x42, 0x30, 0x4B, 0x37, 0x4C, 0x72, 0x66, 0x62, 0x35, 0x42, 0x47, 0x37, 0x58, 0x41, 0x52, 0x73, 0x57, 0x68, 0x49, 0x73, 0x74, 0x66, 0x54, 0x73, + 0x45, 0x6F, 0x6B, 0x74, 0x34, 0x59, 0x75, 0x74, 0x55, 0x71, 0x4B, 0x4C, 0x73, 0x52, 0x69, 0x78, 0x65, 0x54, 0x6D, 0x4A, 0x6C, 0x67, 0x6C, 0x46, 0x77, 0x6A, 0x7A, 0x31, 0x6F, 0x6E, 0x6C, 0x31, 0x34, 0x4C, 0x42, 0x51, 0x61, 0x54, 0x4E, 0x78, + 0x34, 0x37, 0x61, 0x54, 0x62, 0x72, 0x0A, 0x71, 0x5A, 0x35, 0x68, 0x48, 0x59, 0x38, 0x79, 0x32, 0x6F, 0x34, 0x4D, 0x31, 0x6E, 0x51, 0x2B, 0x65, 0x77, 0x6B, 0x6B, 0x32, 0x67, 0x46, 0x33, 0x52, 0x38, 0x51, 0x37, 0x7A, 0x54, 0x53, 0x4D, 0x6D, + 0x66, 0x58, 0x4B, 0x34, 0x53, 0x56, 0x68, 0x4D, 0x37, 0x4A, 0x5A, 0x47, 0x2B, 0x4A, 0x75, 0x31, 0x7A, 0x64, 0x58, 0x74, 0x67, 0x32, 0x70, 0x45, 0x74, 0x6F, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, + 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, + 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x74, 0x7A, 0x43, 0x43, 0x41, 0x70, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x44, + 0x4F, 0x66, 0x67, 0x35, 0x52, 0x66, 0x59, 0x52, 0x76, 0x36, 0x50, 0x35, 0x57, 0x44, 0x38, 0x47, 0x2F, 0x41, 0x77, 0x4F, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, + 0x44, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, + 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, + 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x0A, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, + 0x31, 0x63, 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x59, 0x78, 0x4D, 0x54, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, + 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x45, 0x78, 0x0A, 0x4D, 0x54, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, + 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x0A, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, + 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, + 0x30, 0x45, 0x77, 0x0A, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, + 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x74, 0x44, 0x68, 0x58, 0x4F, 0x35, 0x45, 0x4F, 0x41, 0x58, 0x4C, 0x47, 0x48, 0x38, 0x37, 0x64, 0x67, 0x2B, 0x58, 0x45, 0x53, 0x70, 0x61, 0x37, 0x63, 0x4A, 0x70, 0x53, 0x49, 0x71, 0x76, 0x54, 0x4F, + 0x0A, 0x39, 0x53, 0x41, 0x35, 0x4B, 0x46, 0x68, 0x67, 0x44, 0x50, 0x69, 0x41, 0x32, 0x71, 0x6B, 0x56, 0x6C, 0x54, 0x4A, 0x68, 0x50, 0x4C, 0x57, 0x78, 0x4B, 0x49, 0x53, 0x4B, 0x69, 0x74, 0x79, 0x66, 0x43, 0x67, 0x79, 0x44, 0x46, 0x33, 0x71, + 0x50, 0x6B, 0x4B, 0x79, 0x4B, 0x35, 0x33, 0x6C, 0x54, 0x58, 0x44, 0x47, 0x45, 0x4B, 0x76, 0x59, 0x50, 0x6D, 0x44, 0x49, 0x32, 0x64, 0x73, 0x7A, 0x65, 0x33, 0x54, 0x79, 0x6F, 0x6F, 0x75, 0x39, 0x71, 0x2B, 0x79, 0x48, 0x79, 0x0A, 0x55, 0x6D, + 0x48, 0x66, 0x6E, 0x79, 0x44, 0x58, 0x48, 0x2B, 0x4B, 0x78, 0x32, 0x66, 0x34, 0x59, 0x5A, 0x4E, 0x49, 0x53, 0x57, 0x31, 0x2F, 0x35, 0x57, 0x42, 0x67, 0x31, 0x76, 0x45, 0x66, 0x4E, 0x6F, 0x54, 0x62, 0x35, 0x61, 0x33, 0x2F, 0x55, 0x73, 0x44, + 0x67, 0x2B, 0x77, 0x52, 0x76, 0x44, 0x6A, 0x44, 0x50, 0x5A, 0x32, 0x43, 0x38, 0x59, 0x2F, 0x69, 0x67, 0x50, 0x73, 0x36, 0x65, 0x44, 0x31, 0x73, 0x4E, 0x75, 0x52, 0x4D, 0x42, 0x68, 0x4E, 0x5A, 0x59, 0x57, 0x0A, 0x2F, 0x6C, 0x6D, 0x63, 0x69, + 0x33, 0x5A, 0x74, 0x31, 0x2F, 0x47, 0x69, 0x53, 0x77, 0x30, 0x72, 0x2F, 0x77, 0x74, 0x79, 0x32, 0x70, 0x35, 0x67, 0x30, 0x49, 0x36, 0x51, 0x4E, 0x63, 0x5A, 0x34, 0x56, 0x59, 0x63, 0x67, 0x6F, 0x63, 0x2F, 0x6C, 0x62, 0x51, 0x72, 0x49, 0x53, + 0x58, 0x77, 0x78, 0x6D, 0x44, 0x4E, 0x73, 0x49, 0x75, 0x6D, 0x48, 0x30, 0x44, 0x4A, 0x61, 0x6F, 0x72, 0x6F, 0x54, 0x67, 0x68, 0x48, 0x74, 0x4F, 0x52, 0x65, 0x64, 0x6D, 0x54, 0x70, 0x79, 0x0A, 0x6F, 0x65, 0x62, 0x36, 0x70, 0x4E, 0x6E, 0x56, + 0x46, 0x7A, 0x46, 0x31, 0x72, 0x6F, 0x56, 0x39, 0x49, 0x71, 0x34, 0x2F, 0x41, 0x55, 0x61, 0x47, 0x39, 0x69, 0x68, 0x35, 0x79, 0x4C, 0x48, 0x61, 0x35, 0x46, 0x63, 0x58, 0x78, 0x48, 0x34, 0x63, 0x44, 0x72, 0x43, 0x30, 0x6B, 0x71, 0x5A, 0x57, + 0x73, 0x37, 0x32, 0x79, 0x6C, 0x2B, 0x32, 0x71, 0x70, 0x2F, 0x43, 0x33, 0x78, 0x61, 0x67, 0x2F, 0x6C, 0x52, 0x62, 0x51, 0x2F, 0x36, 0x47, 0x57, 0x36, 0x77, 0x68, 0x66, 0x0A, 0x47, 0x48, 0x64, 0x50, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, + 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, + 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x46, 0x0A, 0x36, 0x36, 0x4B, 0x76, 0x39, 0x4A, 0x4C, 0x4C, 0x67, 0x6A, 0x45, 0x74, 0x55, 0x59, + 0x75, 0x6E, 0x70, 0x79, 0x47, 0x64, 0x38, 0x32, 0x33, 0x49, 0x44, 0x7A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x52, 0x46, 0x36, 0x36, 0x4B, 0x76, 0x39, 0x4A, 0x4C, 0x4C, 0x67, 0x6A, + 0x45, 0x74, 0x55, 0x59, 0x75, 0x6E, 0x70, 0x79, 0x47, 0x64, 0x38, 0x32, 0x33, 0x49, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x0A, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, + 0x51, 0x45, 0x41, 0x6F, 0x67, 0x36, 0x38, 0x33, 0x2B, 0x4C, 0x74, 0x38, 0x4F, 0x4E, 0x79, 0x63, 0x33, 0x70, 0x6B, 0x6C, 0x4C, 0x2F, 0x33, 0x63, 0x6D, 0x62, 0x59, 0x4D, 0x75, 0x52, 0x43, 0x64, 0x57, 0x4B, 0x75, 0x68, 0x2B, 0x76, 0x79, 0x31, + 0x64, 0x6E, 0x65, 0x56, 0x72, 0x4F, 0x66, 0x7A, 0x4D, 0x34, 0x55, 0x4B, 0x4C, 0x6B, 0x4E, 0x6C, 0x32, 0x42, 0x63, 0x0A, 0x45, 0x6B, 0x78, 0x59, 0x35, 0x4E, 0x4D, 0x39, 0x67, 0x30, 0x6C, 0x46, 0x57, 0x4A, 0x63, 0x31, 0x61, 0x52, 0x71, 0x6F, + 0x52, 0x2B, 0x70, 0x57, 0x78, 0x6E, 0x6D, 0x72, 0x45, 0x74, 0x68, 0x6E, 0x67, 0x59, 0x54, 0x66, 0x66, 0x77, 0x6B, 0x38, 0x6C, 0x4F, 0x61, 0x34, 0x4A, 0x69, 0x77, 0x67, 0x76, 0x54, 0x32, 0x7A, 0x4B, 0x49, 0x6E, 0x33, 0x58, 0x2F, 0x38, 0x69, + 0x34, 0x70, 0x65, 0x45, 0x48, 0x2B, 0x6C, 0x6C, 0x37, 0x34, 0x66, 0x67, 0x33, 0x38, 0x46, 0x6E, 0x0A, 0x53, 0x62, 0x4E, 0x64, 0x36, 0x37, 0x49, 0x4A, 0x4B, 0x75, 0x73, 0x6D, 0x37, 0x58, 0x69, 0x2B, 0x66, 0x54, 0x38, 0x72, 0x38, 0x37, 0x63, + 0x6D, 0x4E, 0x57, 0x31, 0x66, 0x69, 0x51, 0x47, 0x32, 0x53, 0x56, 0x75, 0x66, 0x41, 0x51, 0x57, 0x62, 0x71, 0x7A, 0x30, 0x6C, 0x77, 0x63, 0x79, 0x32, 0x66, 0x38, 0x4C, 0x78, 0x62, 0x34, 0x62, 0x47, 0x2B, 0x6D, 0x52, 0x6F, 0x36, 0x34, 0x45, + 0x74, 0x6C, 0x4F, 0x74, 0x43, 0x74, 0x2F, 0x71, 0x4D, 0x48, 0x74, 0x31, 0x69, 0x0A, 0x38, 0x62, 0x35, 0x51, 0x5A, 0x37, 0x64, 0x73, 0x76, 0x66, 0x50, 0x78, 0x48, 0x32, 0x73, 0x4D, 0x4E, 0x67, 0x63, 0x57, 0x66, 0x7A, 0x64, 0x38, 0x71, 0x56, + 0x74, 0x74, 0x65, 0x76, 0x45, 0x53, 0x52, 0x6D, 0x43, 0x44, 0x31, 0x79, 0x63, 0x45, 0x76, 0x6B, 0x76, 0x4F, 0x6C, 0x37, 0x37, 0x44, 0x5A, 0x79, 0x70, 0x6F, 0x45, 0x64, 0x2B, 0x41, 0x35, 0x77, 0x77, 0x7A, 0x5A, 0x72, 0x38, 0x54, 0x44, 0x52, + 0x52, 0x75, 0x38, 0x33, 0x38, 0x66, 0x59, 0x78, 0x41, 0x65, 0x0A, 0x2B, 0x6F, 0x30, 0x62, 0x4A, 0x57, 0x31, 0x73, 0x6A, 0x36, 0x57, 0x33, 0x59, 0x51, 0x47, 0x78, 0x30, 0x71, 0x4D, 0x6D, 0x6F, 0x52, 0x42, 0x78, 0x6E, 0x61, 0x33, 0x69, 0x77, + 0x2F, 0x6E, 0x44, 0x6D, 0x56, 0x47, 0x33, 0x4B, 0x77, 0x63, 0x49, 0x7A, 0x69, 0x37, 0x6D, 0x55, 0x4C, 0x4B, 0x6E, 0x2B, 0x67, 0x70, 0x46, 0x4C, 0x36, 0x4C, 0x77, 0x38, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, + 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x72, 0x7A, 0x43, 0x43, 0x41, 0x70, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x44, 0x76, 0x67, 0x56, + 0x70, 0x42, 0x43, 0x52, 0x72, 0x47, 0x68, 0x64, 0x57, 0x72, 0x4A, 0x57, 0x5A, 0x48, 0x48, 0x53, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, 0x42, 0x68, 0x4D, + 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, + 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, + 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x41, 0x77, 0x0A, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x64, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, + 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4E, 0x6A, 0x45, 0x78, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x54, 0x45, + 0x78, 0x4D, 0x54, 0x41, 0x77, 0x0A, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x47, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x78, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x45, 0x48, + 0x64, 0x33, 0x0A, 0x64, 0x79, 0x35, 0x6B, 0x61, 0x57, 0x64, 0x70, 0x59, 0x32, 0x56, 0x79, 0x64, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x30, 0x52, 0x70, 0x5A, + 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x0A, + 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x34, 0x6A, 0x76, 0x68, 0x45, 0x58, 0x4C, 0x65, + 0x71, 0x4B, 0x54, 0x54, 0x6F, 0x31, 0x65, 0x71, 0x55, 0x4B, 0x4B, 0x50, 0x43, 0x33, 0x65, 0x51, 0x79, 0x61, 0x4B, 0x6C, 0x37, 0x68, 0x4C, 0x4F, 0x6C, 0x6C, 0x73, 0x42, 0x43, 0x53, 0x44, 0x4D, 0x41, 0x5A, 0x4F, 0x6E, 0x0A, 0x54, 0x6A, 0x43, + 0x33, 0x55, 0x2F, 0x64, 0x44, 0x78, 0x47, 0x6B, 0x41, 0x56, 0x35, 0x33, 0x69, 0x6A, 0x53, 0x4C, 0x64, 0x68, 0x77, 0x5A, 0x41, 0x41, 0x49, 0x45, 0x4A, 0x7A, 0x73, 0x34, 0x62, 0x67, 0x37, 0x2F, 0x66, 0x7A, 0x54, 0x74, 0x78, 0x52, 0x75, 0x4C, + 0x57, 0x5A, 0x73, 0x63, 0x46, 0x73, 0x33, 0x59, 0x6E, 0x46, 0x6F, 0x39, 0x37, 0x6E, 0x68, 0x36, 0x56, 0x66, 0x65, 0x36, 0x33, 0x53, 0x4B, 0x4D, 0x49, 0x32, 0x74, 0x61, 0x76, 0x65, 0x67, 0x77, 0x35, 0x0A, 0x42, 0x6D, 0x56, 0x2F, 0x53, 0x6C, + 0x30, 0x66, 0x76, 0x42, 0x66, 0x34, 0x71, 0x37, 0x37, 0x75, 0x4B, 0x4E, 0x64, 0x30, 0x66, 0x33, 0x70, 0x34, 0x6D, 0x56, 0x6D, 0x46, 0x61, 0x47, 0x35, 0x63, 0x49, 0x7A, 0x4A, 0x4C, 0x76, 0x30, 0x37, 0x41, 0x36, 0x46, 0x70, 0x74, 0x34, 0x33, + 0x43, 0x2F, 0x64, 0x78, 0x43, 0x2F, 0x2F, 0x41, 0x48, 0x32, 0x68, 0x64, 0x6D, 0x6F, 0x52, 0x42, 0x42, 0x59, 0x4D, 0x71, 0x6C, 0x31, 0x47, 0x4E, 0x58, 0x52, 0x6F, 0x72, 0x35, 0x48, 0x0A, 0x34, 0x69, 0x64, 0x71, 0x39, 0x4A, 0x6F, 0x7A, 0x2B, + 0x45, 0x6B, 0x49, 0x59, 0x49, 0x76, 0x55, 0x58, 0x37, 0x51, 0x36, 0x68, 0x4C, 0x2B, 0x68, 0x71, 0x6B, 0x70, 0x4D, 0x66, 0x54, 0x37, 0x50, 0x54, 0x31, 0x39, 0x73, 0x64, 0x6C, 0x36, 0x67, 0x53, 0x7A, 0x65, 0x52, 0x6E, 0x74, 0x77, 0x69, 0x35, + 0x6D, 0x33, 0x4F, 0x46, 0x42, 0x71, 0x4F, 0x61, 0x73, 0x76, 0x2B, 0x7A, 0x62, 0x4D, 0x55, 0x5A, 0x42, 0x66, 0x48, 0x57, 0x79, 0x6D, 0x65, 0x4D, 0x72, 0x2F, 0x79, 0x0A, 0x37, 0x76, 0x72, 0x54, 0x43, 0x30, 0x4C, 0x55, 0x71, 0x37, 0x64, 0x42, + 0x4D, 0x74, 0x6F, 0x4D, 0x31, 0x4F, 0x2F, 0x34, 0x67, 0x64, 0x57, 0x37, 0x6A, 0x56, 0x67, 0x2F, 0x74, 0x52, 0x76, 0x6F, 0x53, 0x53, 0x69, 0x69, 0x63, 0x4E, 0x6F, 0x78, 0x42, 0x4E, 0x33, 0x33, 0x73, 0x68, 0x62, 0x79, 0x54, 0x41, 0x70, 0x4F, + 0x42, 0x36, 0x6A, 0x74, 0x53, 0x6A, 0x31, 0x65, 0x74, 0x58, 0x2B, 0x6A, 0x6B, 0x4D, 0x4F, 0x76, 0x4A, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0A, 0x6F, 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, + 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, + 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x41, 0x39, 0x35, 0x51, 0x4E, 0x56, 0x62, 0x52, 0x54, 0x4C, 0x74, 0x6D, 0x0A, 0x38, 0x4B, 0x50, 0x69, 0x47, 0x78, 0x76, 0x44, 0x6C, 0x37, 0x49, 0x39, 0x30, 0x56, 0x55, 0x77, 0x48, 0x77, + 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x41, 0x39, 0x35, 0x51, 0x4E, 0x56, 0x62, 0x52, 0x54, 0x4C, 0x74, 0x6D, 0x38, 0x4B, 0x50, 0x69, 0x47, 0x78, 0x76, 0x44, 0x6C, 0x37, 0x49, 0x39, 0x30, 0x56, + 0x55, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x0A, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4D, 0x75, 0x63, 0x4E, 0x36, 0x70, 0x49, 0x45, 0x78, 0x49, 0x4B, 0x2B, + 0x74, 0x31, 0x45, 0x6E, 0x45, 0x39, 0x53, 0x73, 0x50, 0x54, 0x66, 0x72, 0x67, 0x54, 0x31, 0x65, 0x58, 0x6B, 0x49, 0x6F, 0x79, 0x51, 0x59, 0x2F, 0x45, 0x73, 0x72, 0x68, 0x4D, 0x41, 0x74, 0x75, 0x64, 0x58, 0x48, 0x2F, 0x76, 0x54, 0x42, 0x48, + 0x31, 0x6A, 0x4C, 0x75, 0x47, 0x32, 0x63, 0x65, 0x6E, 0x54, 0x6E, 0x6D, 0x43, 0x6D, 0x72, 0x0A, 0x45, 0x62, 0x58, 0x6A, 0x63, 0x4B, 0x43, 0x68, 0x7A, 0x55, 0x79, 0x49, 0x6D, 0x5A, 0x4F, 0x4D, 0x6B, 0x58, 0x44, 0x69, 0x71, 0x77, 0x38, 0x63, + 0x76, 0x70, 0x4F, 0x70, 0x2F, 0x32, 0x50, 0x56, 0x35, 0x41, 0x64, 0x67, 0x30, 0x36, 0x4F, 0x2F, 0x6E, 0x56, 0x73, 0x4A, 0x38, 0x64, 0x57, 0x4F, 0x34, 0x31, 0x50, 0x30, 0x6A, 0x6D, 0x50, 0x36, 0x50, 0x36, 0x66, 0x62, 0x74, 0x47, 0x62, 0x66, + 0x59, 0x6D, 0x62, 0x57, 0x30, 0x57, 0x35, 0x42, 0x6A, 0x66, 0x49, 0x74, 0x0A, 0x74, 0x65, 0x70, 0x33, 0x53, 0x70, 0x2B, 0x64, 0x57, 0x4F, 0x49, 0x72, 0x57, 0x63, 0x42, 0x41, 0x49, 0x2B, 0x30, 0x74, 0x4B, 0x49, 0x4A, 0x46, 0x50, 0x6E, 0x6C, + 0x55, 0x6B, 0x69, 0x61, 0x59, 0x34, 0x49, 0x42, 0x49, 0x71, 0x44, 0x66, 0x76, 0x38, 0x4E, 0x5A, 0x35, 0x59, 0x42, 0x62, 0x65, 0x72, 0x4F, 0x67, 0x4F, 0x7A, 0x57, 0x36, 0x73, 0x52, 0x42, 0x63, 0x34, 0x4C, 0x30, 0x6E, 0x61, 0x34, 0x55, 0x55, + 0x2B, 0x4B, 0x72, 0x6B, 0x32, 0x55, 0x38, 0x38, 0x36, 0x0A, 0x55, 0x41, 0x62, 0x33, 0x4C, 0x75, 0x6A, 0x45, 0x56, 0x30, 0x6C, 0x73, 0x59, 0x53, 0x45, 0x59, 0x31, 0x51, 0x53, 0x74, 0x65, 0x44, 0x77, 0x73, 0x4F, 0x6F, 0x42, 0x72, 0x70, 0x2B, + 0x75, 0x76, 0x46, 0x52, 0x54, 0x70, 0x32, 0x49, 0x6E, 0x42, 0x75, 0x54, 0x68, 0x73, 0x34, 0x70, 0x46, 0x73, 0x69, 0x76, 0x39, 0x6B, 0x75, 0x58, 0x63, 0x6C, 0x56, 0x7A, 0x44, 0x41, 0x47, 0x79, 0x53, 0x6A, 0x34, 0x64, 0x7A, 0x70, 0x33, 0x30, + 0x64, 0x38, 0x74, 0x62, 0x51, 0x6B, 0x0A, 0x43, 0x41, 0x55, 0x77, 0x37, 0x43, 0x32, 0x39, 0x43, 0x37, 0x39, 0x46, 0x76, 0x31, 0x43, 0x35, 0x71, 0x66, 0x50, 0x72, 0x6D, 0x41, 0x45, 0x53, 0x72, 0x63, 0x69, 0x49, 0x78, 0x70, 0x67, 0x30, 0x58, + 0x34, 0x30, 0x4B, 0x50, 0x4D, 0x62, 0x70, 0x31, 0x5A, 0x57, 0x56, 0x62, 0x64, 0x34, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6E, 0x63, 0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x78, 0x54, 0x43, 0x43, 0x41, 0x71, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x51, 0x41, 0x71, 0x78, 0x63, 0x4A, 0x6D, 0x6F, 0x4C, 0x51, 0x4A, 0x75, 0x50, 0x43, 0x33, 0x6E, 0x79, 0x72, 0x6B, 0x59, 0x6C, 0x64, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, + 0x46, 0x41, 0x44, 0x42, 0x73, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, + 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, + 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x73, 0x77, 0x0A, 0x4B, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x4A, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x49, 0x61, + 0x57, 0x64, 0x6F, 0x49, 0x45, 0x46, 0x7A, 0x63, 0x33, 0x56, 0x79, 0x59, 0x57, 0x35, 0x6A, 0x5A, 0x53, 0x42, 0x46, 0x56, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x32, 0x4D, + 0x54, 0x45, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x0A, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x78, 0x4D, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x62, 0x44, 0x45, 0x4C, + 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x45, 0x52, 0x70, 0x5A, 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, + 0x49, 0x45, 0x6C, 0x75, 0x59, 0x7A, 0x45, 0x5A, 0x0A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x51, 0x64, 0x33, 0x64, 0x33, 0x4C, 0x6D, 0x52, 0x70, 0x5A, 0x32, 0x6C, 0x6A, 0x5A, 0x58, 0x4A, 0x30, 0x4C, 0x6D, 0x4E, + 0x76, 0x62, 0x54, 0x45, 0x72, 0x4D, 0x43, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x69, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x47, 0x6C, 0x6E, 0x61, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, + 0x31, 0x63, 0x6D, 0x46, 0x75, 0x0A, 0x59, 0x32, 0x55, 0x67, 0x52, 0x56, 0x59, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, + 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4D, 0x62, 0x4D, 0x35, 0x58, 0x50, 0x6D, 0x2B, 0x39, 0x53, 0x37, 0x35, 0x53, + 0x30, 0x74, 0x0A, 0x4D, 0x71, 0x62, 0x66, 0x35, 0x59, 0x45, 0x2F, 0x79, 0x63, 0x30, 0x6C, 0x53, 0x62, 0x5A, 0x78, 0x4B, 0x73, 0x50, 0x56, 0x6C, 0x44, 0x52, 0x6E, 0x6F, 0x67, 0x6F, 0x63, 0x73, 0x46, 0x39, 0x70, 0x70, 0x6B, 0x43, 0x78, 0x78, + 0x4C, 0x65, 0x79, 0x6A, 0x39, 0x43, 0x59, 0x70, 0x4B, 0x6C, 0x42, 0x57, 0x54, 0x72, 0x54, 0x33, 0x4A, 0x54, 0x57, 0x50, 0x4E, 0x74, 0x30, 0x4F, 0x4B, 0x52, 0x4B, 0x7A, 0x45, 0x30, 0x6C, 0x67, 0x76, 0x64, 0x4B, 0x70, 0x56, 0x4D, 0x53, 0x0A, + 0x4F, 0x4F, 0x37, 0x7A, 0x53, 0x57, 0x31, 0x78, 0x6B, 0x58, 0x35, 0x6A, 0x74, 0x71, 0x75, 0x6D, 0x58, 0x38, 0x4F, 0x6B, 0x68, 0x50, 0x68, 0x50, 0x59, 0x6C, 0x47, 0x2B, 0x2B, 0x4D, 0x58, 0x73, 0x32, 0x7A, 0x69, 0x53, 0x34, 0x77, 0x62, 0x6C, + 0x43, 0x4A, 0x45, 0x4D, 0x78, 0x43, 0x68, 0x42, 0x56, 0x66, 0x76, 0x4C, 0x57, 0x6F, 0x6B, 0x56, 0x66, 0x6E, 0x48, 0x6F, 0x4E, 0x62, 0x39, 0x4E, 0x63, 0x67, 0x6B, 0x39, 0x76, 0x6A, 0x6F, 0x34, 0x55, 0x46, 0x74, 0x33, 0x0A, 0x4D, 0x52, 0x75, + 0x4E, 0x73, 0x38, 0x63, 0x6B, 0x52, 0x5A, 0x71, 0x6E, 0x72, 0x47, 0x30, 0x41, 0x46, 0x46, 0x6F, 0x45, 0x74, 0x37, 0x6F, 0x54, 0x36, 0x31, 0x45, 0x4B, 0x6D, 0x45, 0x46, 0x42, 0x49, 0x6B, 0x35, 0x6C, 0x59, 0x59, 0x65, 0x42, 0x51, 0x56, 0x43, + 0x6D, 0x65, 0x56, 0x79, 0x4A, 0x33, 0x68, 0x6C, 0x4B, 0x56, 0x39, 0x55, 0x75, 0x35, 0x6C, 0x30, 0x63, 0x55, 0x79, 0x78, 0x2B, 0x6D, 0x4D, 0x30, 0x61, 0x42, 0x68, 0x61, 0x6B, 0x61, 0x48, 0x50, 0x51, 0x0A, 0x4E, 0x41, 0x51, 0x54, 0x58, 0x4B, + 0x46, 0x78, 0x30, 0x31, 0x70, 0x38, 0x56, 0x64, 0x74, 0x65, 0x5A, 0x4F, 0x45, 0x33, 0x68, 0x7A, 0x42, 0x57, 0x42, 0x4F, 0x55, 0x52, 0x74, 0x43, 0x6D, 0x41, 0x45, 0x76, 0x46, 0x35, 0x4F, 0x59, 0x69, 0x69, 0x41, 0x68, 0x46, 0x38, 0x4A, 0x32, + 0x61, 0x33, 0x69, 0x4C, 0x64, 0x34, 0x38, 0x73, 0x6F, 0x4B, 0x71, 0x44, 0x69, 0x72, 0x43, 0x6D, 0x54, 0x43, 0x76, 0x32, 0x5A, 0x64, 0x6C, 0x59, 0x54, 0x42, 0x6F, 0x53, 0x55, 0x65, 0x0A, 0x68, 0x31, 0x30, 0x61, 0x55, 0x41, 0x73, 0x67, 0x45, + 0x73, 0x78, 0x42, 0x75, 0x32, 0x34, 0x4C, 0x55, 0x54, 0x69, 0x34, 0x53, 0x38, 0x73, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, + 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x0A, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, + 0x42, 0x42, 0x59, 0x45, 0x46, 0x4C, 0x45, 0x2B, 0x77, 0x32, 0x6B, 0x44, 0x2B, 0x4C, 0x39, 0x48, 0x41, 0x64, 0x53, 0x59, 0x4A, 0x68, 0x6F, 0x49, 0x41, 0x75, 0x39, 0x6A, 0x5A, 0x43, 0x76, 0x44, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, + 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4C, 0x45, 0x2B, 0x77, 0x32, 0x6B, 0x44, 0x2B, 0x4C, 0x39, 0x48, 0x41, 0x64, 0x53, 0x59, 0x0A, 0x4A, 0x68, 0x6F, 0x49, 0x41, 0x75, 0x39, 0x6A, 0x5A, 0x43, 0x76, 0x44, 0x4D, 0x41, 0x30, + 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x41, 0x63, 0x47, 0x67, 0x61, 0x58, 0x33, 0x4E, 0x65, 0x63, 0x6E, 0x7A, 0x79, 0x49, 0x5A, 0x67, 0x59, + 0x49, 0x56, 0x79, 0x48, 0x62, 0x49, 0x55, 0x66, 0x34, 0x4B, 0x6D, 0x65, 0x71, 0x76, 0x78, 0x67, 0x79, 0x64, 0x6B, 0x41, 0x51, 0x0A, 0x56, 0x38, 0x47, 0x4B, 0x38, 0x33, 0x72, 0x5A, 0x45, 0x57, 0x57, 0x4F, 0x4E, 0x66, 0x71, 0x65, 0x2F, 0x45, + 0x57, 0x31, 0x6E, 0x74, 0x6C, 0x4D, 0x4D, 0x55, 0x75, 0x34, 0x6B, 0x65, 0x68, 0x44, 0x4C, 0x49, 0x36, 0x7A, 0x65, 0x4D, 0x37, 0x62, 0x34, 0x31, 0x4E, 0x35, 0x63, 0x64, 0x62, 0x6C, 0x49, 0x5A, 0x51, 0x42, 0x32, 0x6C, 0x57, 0x48, 0x6D, 0x69, + 0x52, 0x6B, 0x39, 0x6F, 0x70, 0x6D, 0x7A, 0x4E, 0x36, 0x63, 0x4E, 0x38, 0x32, 0x6F, 0x4E, 0x4C, 0x46, 0x70, 0x0A, 0x6D, 0x79, 0x50, 0x49, 0x6E, 0x6E, 0x67, 0x69, 0x4B, 0x33, 0x42, 0x44, 0x34, 0x31, 0x56, 0x48, 0x4D, 0x57, 0x45, 0x5A, 0x37, + 0x31, 0x6A, 0x46, 0x68, 0x53, 0x39, 0x4F, 0x4D, 0x50, 0x61, 0x67, 0x4D, 0x52, 0x59, 0x6A, 0x79, 0x4F, 0x66, 0x69, 0x5A, 0x52, 0x59, 0x7A, 0x79, 0x37, 0x38, 0x61, 0x47, 0x36, 0x41, 0x39, 0x2B, 0x4D, 0x70, 0x65, 0x69, 0x7A, 0x47, 0x4C, 0x59, + 0x41, 0x69, 0x4A, 0x4C, 0x51, 0x77, 0x47, 0x58, 0x46, 0x4B, 0x33, 0x78, 0x50, 0x6B, 0x4B, 0x0A, 0x6D, 0x4E, 0x45, 0x56, 0x58, 0x35, 0x38, 0x53, 0x76, 0x6E, 0x77, 0x32, 0x59, 0x7A, 0x69, 0x39, 0x52, 0x4B, 0x52, 0x2F, 0x35, 0x43, 0x59, 0x72, + 0x43, 0x73, 0x53, 0x58, 0x61, 0x51, 0x33, 0x70, 0x6A, 0x4F, 0x4C, 0x41, 0x45, 0x46, 0x65, 0x34, 0x79, 0x48, 0x59, 0x53, 0x6B, 0x56, 0x58, 0x79, 0x53, 0x47, 0x6E, 0x59, 0x76, 0x43, 0x6F, 0x43, 0x57, 0x77, 0x39, 0x45, 0x31, 0x43, 0x41, 0x78, + 0x32, 0x2F, 0x53, 0x36, 0x63, 0x43, 0x5A, 0x64, 0x6B, 0x47, 0x43, 0x65, 0x0A, 0x76, 0x45, 0x73, 0x58, 0x43, 0x53, 0x2B, 0x30, 0x79, 0x78, 0x35, 0x44, 0x61, 0x4D, 0x6B, 0x48, 0x4A, 0x38, 0x48, 0x53, 0x58, 0x50, 0x66, 0x71, 0x49, 0x62, 0x6C, + 0x6F, 0x45, 0x70, 0x77, 0x38, 0x6E, 0x4C, 0x2B, 0x65, 0x2F, 0x49, 0x42, 0x63, 0x6D, 0x32, 0x50, 0x4E, 0x37, 0x45, 0x65, 0x71, 0x4A, 0x53, 0x64, 0x6E, 0x6F, 0x44, 0x66, 0x7A, 0x41, 0x49, 0x4A, 0x39, 0x56, 0x4E, 0x65, 0x70, 0x2B, 0x4F, 0x6B, + 0x75, 0x45, 0x36, 0x4E, 0x33, 0x36, 0x42, 0x39, 0x4B, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x77, 0x69, + 0x73, 0x73, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x47, 0x6F, 0x6C, 0x64, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x75, 0x6A, 0x43, 0x43, 0x41, + 0x36, 0x4B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x41, 0x4C, 0x74, 0x41, 0x48, 0x45, 0x50, 0x31, 0x58, 0x6B, 0x2B, 0x77, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, + 0x51, 0x55, 0x41, 0x4D, 0x45, 0x55, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x49, 0x4D, 0x52, 0x55, 0x77, 0x0A, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x78, 0x54, + 0x64, 0x32, 0x6C, 0x7A, 0x63, 0x31, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x51, 0x55, 0x63, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x6C, 0x4E, 0x33, 0x61, 0x58, 0x4E, 0x7A, 0x55, 0x32, 0x6C, 0x6E, + 0x62, 0x69, 0x42, 0x48, 0x62, 0x32, 0x78, 0x6B, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x52, 0x7A, 0x49, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x0A, 0x4D, 0x44, 0x59, 0x78, 0x4D, 0x44, 0x49, 0x31, 0x4D, 0x44, 0x67, 0x7A, 0x4D, 0x44, 0x4D, + 0x31, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x59, 0x78, 0x4D, 0x44, 0x49, 0x31, 0x4D, 0x44, 0x67, 0x7A, 0x4D, 0x44, 0x4D, 0x31, 0x57, 0x6A, 0x42, 0x46, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, + 0x44, 0x53, 0x44, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x55, 0x33, 0x64, 0x70, 0x0A, 0x63, 0x33, 0x4E, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x45, 0x46, 0x48, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x5A, 0x54, 0x64, 0x32, 0x6C, 0x7A, 0x63, 0x31, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x52, 0x32, 0x39, 0x73, 0x5A, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x63, 0x79, 0x4D, 0x49, + 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x0A, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, + 0x67, 0x45, 0x41, 0x72, 0x2B, 0x54, 0x75, 0x66, 0x6F, 0x73, 0x6B, 0x44, 0x68, 0x4A, 0x75, 0x71, 0x56, 0x41, 0x74, 0x46, 0x6B, 0x51, 0x37, 0x6B, 0x70, 0x4A, 0x63, 0x79, 0x72, 0x68, 0x64, 0x68, 0x4A, 0x4A, 0x43, 0x45, 0x79, 0x71, 0x38, 0x5A, + 0x56, 0x65, 0x43, 0x51, 0x44, 0x35, 0x58, 0x4A, 0x4D, 0x31, 0x51, 0x69, 0x79, 0x55, 0x71, 0x0A, 0x74, 0x32, 0x2F, 0x38, 0x37, 0x36, 0x4C, 0x51, 0x77, 0x42, 0x38, 0x43, 0x4A, 0x45, 0x6F, 0x54, 0x6C, 0x6F, 0x38, 0x6A, 0x45, 0x2B, 0x59, 0x6F, + 0x57, 0x41, 0x43, 0x6A, 0x52, 0x38, 0x63, 0x47, 0x70, 0x34, 0x51, 0x6A, 0x4B, 0x37, 0x75, 0x39, 0x6C, 0x69, 0x74, 0x2F, 0x56, 0x63, 0x79, 0x4C, 0x77, 0x56, 0x63, 0x66, 0x44, 0x6D, 0x4A, 0x6C, 0x44, 0x39, 0x30, 0x39, 0x56, 0x6F, 0x70, 0x7A, + 0x32, 0x71, 0x35, 0x2B, 0x62, 0x62, 0x71, 0x42, 0x48, 0x48, 0x35, 0x43, 0x0A, 0x6A, 0x43, 0x41, 0x31, 0x32, 0x55, 0x4E, 0x4E, 0x68, 0x50, 0x71, 0x45, 0x32, 0x31, 0x49, 0x73, 0x38, 0x77, 0x34, 0x6E, 0x64, 0x77, 0x74, 0x72, 0x76, 0x78, 0x45, + 0x76, 0x63, 0x6E, 0x69, 0x66, 0x4C, 0x74, 0x67, 0x2B, 0x35, 0x68, 0x67, 0x33, 0x57, 0x69, 0x70, 0x79, 0x2B, 0x64, 0x70, 0x69, 0x6B, 0x4A, 0x4B, 0x56, 0x79, 0x68, 0x2B, 0x63, 0x36, 0x62, 0x4D, 0x38, 0x4B, 0x38, 0x76, 0x7A, 0x41, 0x52, 0x4F, + 0x2F, 0x57, 0x73, 0x2F, 0x42, 0x74, 0x51, 0x70, 0x67, 0x0A, 0x76, 0x64, 0x32, 0x31, 0x6D, 0x57, 0x52, 0x54, 0x75, 0x4B, 0x43, 0x57, 0x73, 0x32, 0x2F, 0x69, 0x4A, 0x6E, 0x65, 0x52, 0x6A, 0x4F, 0x42, 0x69, 0x45, 0x41, 0x4B, 0x66, 0x4E, 0x41, + 0x2B, 0x6B, 0x31, 0x5A, 0x49, 0x7A, 0x55, 0x64, 0x36, 0x2B, 0x6A, 0x62, 0x71, 0x45, 0x65, 0x6D, 0x41, 0x38, 0x61, 0x74, 0x75, 0x66, 0x4B, 0x2B, 0x7A, 0x65, 0x33, 0x67, 0x45, 0x2F, 0x62, 0x6B, 0x33, 0x6C, 0x55, 0x49, 0x62, 0x4C, 0x74, 0x4B, + 0x2F, 0x74, 0x52, 0x45, 0x44, 0x46, 0x0A, 0x79, 0x6C, 0x71, 0x4D, 0x32, 0x74, 0x49, 0x72, 0x66, 0x4B, 0x6A, 0x75, 0x76, 0x71, 0x62, 0x6C, 0x43, 0x71, 0x6F, 0x4F, 0x70, 0x64, 0x38, 0x46, 0x55, 0x72, 0x64, 0x56, 0x78, 0x79, 0x4A, 0x64, 0x4D, + 0x6D, 0x71, 0x58, 0x6C, 0x32, 0x4D, 0x54, 0x32, 0x38, 0x6E, 0x62, 0x65, 0x54, 0x5A, 0x37, 0x68, 0x54, 0x70, 0x4B, 0x78, 0x56, 0x4B, 0x4A, 0x2B, 0x53, 0x54, 0x6E, 0x6E, 0x58, 0x65, 0x70, 0x67, 0x76, 0x39, 0x56, 0x48, 0x4B, 0x56, 0x78, 0x61, + 0x53, 0x76, 0x52, 0x0A, 0x41, 0x69, 0x54, 0x79, 0x73, 0x79, 0x62, 0x55, 0x61, 0x39, 0x6F, 0x45, 0x56, 0x65, 0x58, 0x42, 0x43, 0x73, 0x64, 0x74, 0x4D, 0x44, 0x65, 0x51, 0x4B, 0x75, 0x53, 0x65, 0x46, 0x44, 0x4E, 0x65, 0x46, 0x68, 0x64, 0x56, + 0x78, 0x56, 0x75, 0x31, 0x79, 0x7A, 0x53, 0x4A, 0x6B, 0x76, 0x47, 0x64, 0x4A, 0x6F, 0x2B, 0x68, 0x42, 0x39, 0x54, 0x47, 0x73, 0x6E, 0x68, 0x51, 0x32, 0x77, 0x77, 0x4D, 0x43, 0x33, 0x77, 0x4C, 0x6A, 0x45, 0x48, 0x58, 0x75, 0x65, 0x6E, 0x64, + 0x0A, 0x6A, 0x49, 0x6A, 0x33, 0x6F, 0x30, 0x32, 0x79, 0x4D, 0x73, 0x7A, 0x59, 0x46, 0x39, 0x72, 0x4E, 0x74, 0x38, 0x35, 0x6D, 0x6E, 0x64, 0x54, 0x39, 0x58, 0x76, 0x2B, 0x39, 0x6C, 0x7A, 0x34, 0x70, 0x64, 0x65, 0x64, 0x2B, 0x70, 0x32, 0x4A, + 0x59, 0x72, 0x79, 0x55, 0x30, 0x70, 0x55, 0x48, 0x48, 0x50, 0x62, 0x77, 0x4E, 0x55, 0x4D, 0x6F, 0x44, 0x41, 0x77, 0x38, 0x49, 0x57, 0x68, 0x2B, 0x56, 0x63, 0x33, 0x68, 0x69, 0x76, 0x36, 0x39, 0x79, 0x46, 0x47, 0x6B, 0x4F, 0x0A, 0x70, 0x65, + 0x55, 0x44, 0x44, 0x6E, 0x69, 0x4F, 0x4A, 0x69, 0x68, 0x43, 0x38, 0x41, 0x63, 0x4C, 0x59, 0x69, 0x41, 0x51, 0x5A, 0x7A, 0x6C, 0x47, 0x2B, 0x71, 0x6B, 0x44, 0x7A, 0x41, 0x51, 0x34, 0x65, 0x6D, 0x62, 0x76, 0x49, 0x49, 0x4F, 0x31, 0x6A, 0x45, + 0x70, 0x57, 0x6A, 0x70, 0x45, 0x41, 0x2F, 0x49, 0x35, 0x63, 0x67, 0x74, 0x36, 0x49, 0x6F, 0x4D, 0x50, 0x69, 0x61, 0x47, 0x35, 0x39, 0x6A, 0x65, 0x38, 0x38, 0x33, 0x57, 0x58, 0x30, 0x58, 0x61, 0x78, 0x52, 0x0A, 0x37, 0x79, 0x53, 0x41, 0x72, + 0x71, 0x70, 0x57, 0x6C, 0x32, 0x2F, 0x35, 0x72, 0x58, 0x33, 0x61, 0x59, 0x54, 0x2B, 0x59, 0x64, 0x7A, 0x79, 0x6C, 0x6B, 0x62, 0x59, 0x63, 0x6A, 0x43, 0x62, 0x61, 0x5A, 0x61, 0x49, 0x4A, 0x62, 0x63, 0x48, 0x69, 0x56, 0x4F, 0x4F, 0x35, 0x79, + 0x6B, 0x78, 0x4D, 0x67, 0x49, 0x39, 0x33, 0x65, 0x32, 0x43, 0x61, 0x48, 0x74, 0x2B, 0x32, 0x38, 0x6B, 0x67, 0x65, 0x44, 0x72, 0x70, 0x4F, 0x56, 0x47, 0x32, 0x59, 0x34, 0x4F, 0x47, 0x69, 0x0A, 0x47, 0x71, 0x4A, 0x33, 0x55, 0x4D, 0x2F, 0x45, + 0x59, 0x35, 0x4C, 0x73, 0x52, 0x78, 0x6D, 0x64, 0x36, 0x2B, 0x5A, 0x72, 0x7A, 0x73, 0x45, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4F, 0x42, 0x72, 0x44, 0x43, 0x42, 0x71, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, + 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x0A, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, + 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x57, 0x79, 0x56, 0x37, 0x6C, 0x71, 0x52, 0x6C, 0x55, 0x58, 0x36, 0x34, 0x4F, 0x66, 0x50, 0x41, 0x65, 0x47, 0x5A, 0x65, 0x36, 0x44, 0x72, 0x6E, 0x38, 0x4F, 0x34, 0x77, 0x48, 0x77, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x57, 0x79, 0x56, 0x37, 0x6C, 0x71, 0x52, 0x6C, 0x55, 0x58, 0x36, 0x34, 0x0A, 0x4F, 0x66, 0x50, 0x41, 0x65, 0x47, 0x5A, 0x65, 0x36, 0x44, 0x72, 0x6E, 0x38, 0x4F, + 0x34, 0x77, 0x52, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x67, 0x42, 0x44, 0x38, 0x77, 0x50, 0x54, 0x41, 0x37, 0x42, 0x67, 0x6C, 0x67, 0x68, 0x58, 0x51, 0x42, 0x57, 0x51, 0x45, 0x43, 0x41, 0x51, 0x45, 0x77, 0x4C, 0x6A, 0x41, 0x73, 0x42, 0x67, + 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x43, 0x41, 0x52, 0x59, 0x67, 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6F, 0x76, 0x0A, 0x4C, 0x33, 0x4A, 0x6C, 0x63, 0x47, 0x39, 0x7A, 0x61, 0x58, 0x52, 0x76, 0x63, 0x6E, 0x6B, 0x75, 0x63, + 0x33, 0x64, 0x70, 0x63, 0x33, 0x4E, 0x7A, 0x61, 0x57, 0x64, 0x75, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, + 0x67, 0x49, 0x42, 0x41, 0x43, 0x65, 0x36, 0x34, 0x35, 0x52, 0x38, 0x38, 0x61, 0x37, 0x41, 0x33, 0x68, 0x66, 0x6D, 0x0A, 0x35, 0x64, 0x6A, 0x56, 0x39, 0x56, 0x53, 0x77, 0x67, 0x2F, 0x53, 0x37, 0x7A, 0x56, 0x34, 0x46, 0x65, 0x30, 0x2B, 0x66, + 0x64, 0x57, 0x61, 0x76, 0x50, 0x4F, 0x68, 0x57, 0x66, 0x76, 0x78, 0x79, 0x65, 0x44, 0x67, 0x44, 0x32, 0x53, 0x74, 0x69, 0x47, 0x77, 0x43, 0x35, 0x2B, 0x4F, 0x6C, 0x67, 0x7A, 0x63, 0x7A, 0x4F, 0x55, 0x59, 0x72, 0x48, 0x55, 0x44, 0x46, 0x75, + 0x34, 0x55, 0x70, 0x2B, 0x47, 0x43, 0x39, 0x70, 0x57, 0x62, 0x59, 0x39, 0x5A, 0x49, 0x45, 0x72, 0x0A, 0x34, 0x34, 0x4F, 0x45, 0x35, 0x69, 0x4B, 0x48, 0x6A, 0x6E, 0x33, 0x67, 0x37, 0x67, 0x4B, 0x5A, 0x59, 0x62, 0x67, 0x65, 0x39, 0x4C, 0x67, + 0x72, 0x69, 0x42, 0x49, 0x57, 0x68, 0x4D, 0x49, 0x78, 0x6B, 0x7A, 0x69, 0x57, 0x4D, 0x61, 0x61, 0x35, 0x4F, 0x31, 0x4D, 0x2F, 0x77, 0x79, 0x53, 0x54, 0x56, 0x6C, 0x74, 0x70, 0x6B, 0x75, 0x7A, 0x46, 0x77, 0x62, 0x73, 0x34, 0x41, 0x4F, 0x50, + 0x73, 0x46, 0x36, 0x6D, 0x34, 0x33, 0x4D, 0x64, 0x38, 0x41, 0x59, 0x4F, 0x66, 0x0A, 0x4D, 0x6B, 0x65, 0x36, 0x55, 0x69, 0x49, 0x30, 0x48, 0x54, 0x4A, 0x36, 0x43, 0x56, 0x61, 0x6E, 0x66, 0x43, 0x55, 0x32, 0x71, 0x54, 0x31, 0x4C, 0x32, 0x73, + 0x43, 0x43, 0x62, 0x77, 0x71, 0x37, 0x45, 0x73, 0x69, 0x48, 0x53, 0x79, 0x63, 0x52, 0x2B, 0x52, 0x34, 0x74, 0x78, 0x35, 0x4D, 0x2F, 0x6E, 0x74, 0x74, 0x66, 0x4A, 0x6D, 0x74, 0x53, 0x32, 0x53, 0x36, 0x4B, 0x38, 0x52, 0x54, 0x47, 0x52, 0x49, + 0x30, 0x56, 0x71, 0x62, 0x65, 0x2F, 0x76, 0x64, 0x36, 0x6D, 0x0A, 0x47, 0x75, 0x36, 0x75, 0x4C, 0x66, 0x74, 0x49, 0x64, 0x78, 0x66, 0x2B, 0x75, 0x2B, 0x79, 0x76, 0x47, 0x50, 0x55, 0x71, 0x55, 0x66, 0x41, 0x35, 0x68, 0x4A, 0x65, 0x56, 0x62, + 0x47, 0x34, 0x62, 0x77, 0x79, 0x76, 0x45, 0x64, 0x47, 0x42, 0x35, 0x4A, 0x62, 0x41, 0x4B, 0x4A, 0x39, 0x2F, 0x66, 0x58, 0x74, 0x49, 0x35, 0x7A, 0x30, 0x56, 0x39, 0x51, 0x6B, 0x76, 0x66, 0x73, 0x79, 0x77, 0x65, 0x78, 0x63, 0x5A, 0x64, 0x79, + 0x6C, 0x55, 0x36, 0x6F, 0x4A, 0x78, 0x70, 0x0A, 0x6D, 0x6F, 0x2F, 0x61, 0x37, 0x37, 0x4B, 0x77, 0x50, 0x4A, 0x2B, 0x48, 0x62, 0x42, 0x49, 0x72, 0x5A, 0x58, 0x41, 0x56, 0x55, 0x6A, 0x45, 0x61, 0x4A, 0x4D, 0x39, 0x76, 0x4D, 0x53, 0x4E, 0x51, + 0x48, 0x34, 0x78, 0x50, 0x6A, 0x79, 0x50, 0x44, 0x64, 0x45, 0x46, 0x6A, 0x48, 0x46, 0x57, 0x6F, 0x46, 0x4E, 0x30, 0x2B, 0x34, 0x46, 0x46, 0x51, 0x7A, 0x2F, 0x45, 0x62, 0x4D, 0x46, 0x59, 0x4F, 0x6B, 0x72, 0x43, 0x43, 0x68, 0x64, 0x69, 0x44, + 0x79, 0x79, 0x4A, 0x6B, 0x0A, 0x76, 0x43, 0x32, 0x34, 0x4A, 0x64, 0x56, 0x55, 0x6F, 0x72, 0x67, 0x47, 0x36, 0x71, 0x32, 0x53, 0x70, 0x43, 0x53, 0x67, 0x77, 0x59, 0x61, 0x31, 0x53, 0x68, 0x4E, 0x71, 0x52, 0x38, 0x38, 0x75, 0x43, 0x31, 0x61, + 0x56, 0x56, 0x4D, 0x76, 0x4F, 0x6D, 0x74, 0x74, 0x71, 0x74, 0x4B, 0x61, 0x79, 0x32, 0x30, 0x45, 0x49, 0x68, 0x69, 0x64, 0x33, 0x39, 0x32, 0x71, 0x67, 0x51, 0x6D, 0x77, 0x4C, 0x4F, 0x4D, 0x37, 0x58, 0x64, 0x56, 0x41, 0x79, 0x6B, 0x73, 0x4C, + 0x66, 0x0A, 0x4B, 0x7A, 0x41, 0x69, 0x53, 0x4E, 0x44, 0x56, 0x51, 0x54, 0x67, 0x6C, 0x58, 0x61, 0x54, 0x70, 0x58, 0x5A, 0x2F, 0x47, 0x6C, 0x48, 0x58, 0x51, 0x52, 0x66, 0x30, 0x77, 0x6C, 0x30, 0x4F, 0x50, 0x6B, 0x4B, 0x73, 0x4B, 0x78, 0x34, + 0x5A, 0x7A, 0x59, 0x45, 0x70, 0x70, 0x4C, 0x64, 0x36, 0x6C, 0x65, 0x4E, 0x63, 0x47, 0x32, 0x6D, 0x71, 0x65, 0x53, 0x7A, 0x35, 0x33, 0x4F, 0x69, 0x41, 0x54, 0x49, 0x67, 0x48, 0x51, 0x76, 0x32, 0x69, 0x65, 0x59, 0x32, 0x42, 0x72, 0x0A, 0x4E, + 0x55, 0x30, 0x4C, 0x62, 0x62, 0x71, 0x68, 0x50, 0x63, 0x43, 0x54, 0x34, 0x48, 0x38, 0x6A, 0x73, 0x31, 0x57, 0x74, 0x63, 0x69, 0x56, 0x4F, 0x52, 0x76, 0x6E, 0x53, 0x46, 0x75, 0x2B, 0x77, 0x5A, 0x4D, 0x45, 0x42, 0x6E, 0x75, 0x6E, 0x4B, 0x6F, + 0x47, 0x71, 0x59, 0x44, 0x73, 0x2F, 0x59, 0x59, 0x50, 0x49, 0x76, 0x53, 0x62, 0x6A, 0x6B, 0x51, 0x75, 0x45, 0x34, 0x4E, 0x52, 0x62, 0x30, 0x79, 0x47, 0x35, 0x50, 0x39, 0x34, 0x46, 0x57, 0x36, 0x4C, 0x71, 0x6A, 0x0A, 0x76, 0x69, 0x4F, 0x76, + 0x72, 0x76, 0x31, 0x76, 0x41, 0x2B, 0x41, 0x43, 0x4F, 0x7A, 0x42, 0x32, 0x2B, 0x68, 0x74, 0x74, 0x51, 0x63, 0x38, 0x42, 0x73, 0x65, 0x6D, 0x34, 0x79, 0x57, 0x62, 0x30, 0x32, 0x79, 0x62, 0x7A, 0x4F, 0x71, 0x52, 0x30, 0x38, 0x6B, 0x6B, 0x6B, + 0x57, 0x38, 0x6D, 0x77, 0x30, 0x46, 0x66, 0x42, 0x2B, 0x6A, 0x35, 0x36, 0x34, 0x5A, 0x66, 0x4A, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, + 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x75, 0x44, 0x43, 0x43, 0x41, 0x71, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, + 0x49, 0x51, 0x44, 0x50, 0x43, 0x4F, 0x58, 0x41, 0x67, 0x57, 0x70, 0x61, 0x31, 0x43, 0x66, 0x2F, 0x44, 0x72, 0x4A, 0x78, 0x68, 0x5A, 0x30, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, + 0x55, 0x46, 0x41, 0x44, 0x42, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x58, 0x55, + 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x51, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x46, 0x7A, 0x41, 0x56, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x4D, 0x54, 0x44, 0x6C, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x5A, 0x56, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x32, 0x4D, 0x54, 0x45, 0x77, 0x4E, 0x7A, 0x45, 0x35, + 0x4D, 0x7A, 0x45, 0x78, 0x4F, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x49, 0x35, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x45, 0x35, 0x4E, 0x44, 0x41, 0x31, 0x4E, 0x56, 0x6F, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x49, 0x44, 0x41, 0x65, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x46, 0x31, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x5A, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x4E, + 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x52, 0x63, 0x77, 0x46, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x77, 0x35, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x55, 0x63, 0x6E, 0x56, + 0x7A, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x0A, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, + 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4B, 0x75, 0x6B, 0x67, 0x65, 0x57, 0x56, 0x7A, 0x66, 0x58, 0x32, 0x46, 0x49, 0x37, 0x43, 0x54, 0x38, 0x72, 0x55, 0x34, 0x6E, 0x69, 0x56, 0x57, 0x4A, 0x78, 0x42, 0x34, 0x51, + 0x32, 0x5A, 0x51, 0x43, 0x51, 0x58, 0x0A, 0x4F, 0x5A, 0x45, 0x7A, 0x5A, 0x75, 0x6D, 0x2B, 0x34, 0x59, 0x4F, 0x76, 0x59, 0x6C, 0x79, 0x4A, 0x30, 0x66, 0x77, 0x6B, 0x57, 0x32, 0x47, 0x7A, 0x34, 0x42, 0x45, 0x52, 0x51, 0x52, 0x77, 0x64, 0x62, + 0x76, 0x43, 0x34, 0x75, 0x2F, 0x6A, 0x65, 0x70, 0x34, 0x47, 0x36, 0x70, 0x6B, 0x6A, 0x47, 0x6E, 0x78, 0x32, 0x39, 0x76, 0x6F, 0x36, 0x70, 0x51, 0x54, 0x36, 0x34, 0x6C, 0x4F, 0x30, 0x70, 0x47, 0x74, 0x53, 0x4F, 0x30, 0x67, 0x4D, 0x64, 0x41, + 0x2B, 0x39, 0x74, 0x0A, 0x44, 0x57, 0x63, 0x63, 0x56, 0x39, 0x63, 0x47, 0x72, 0x63, 0x72, 0x49, 0x39, 0x66, 0x34, 0x4F, 0x72, 0x32, 0x59, 0x6C, 0x53, 0x41, 0x53, 0x57, 0x43, 0x31, 0x32, 0x6A, 0x75, 0x68, 0x62, 0x44, 0x43, 0x45, 0x2F, 0x52, + 0x52, 0x76, 0x67, 0x55, 0x58, 0x50, 0x4C, 0x49, 0x58, 0x67, 0x47, 0x5A, 0x62, 0x66, 0x32, 0x49, 0x7A, 0x49, 0x61, 0x6F, 0x77, 0x57, 0x38, 0x78, 0x51, 0x6D, 0x78, 0x53, 0x50, 0x6D, 0x6A, 0x4C, 0x38, 0x78, 0x6B, 0x30, 0x33, 0x37, 0x75, 0x48, + 0x0A, 0x47, 0x46, 0x61, 0x41, 0x4A, 0x73, 0x54, 0x51, 0x33, 0x4D, 0x42, 0x76, 0x33, 0x39, 0x36, 0x67, 0x77, 0x70, 0x45, 0x57, 0x6F, 0x47, 0x51, 0x52, 0x53, 0x30, 0x53, 0x38, 0x48, 0x76, 0x62, 0x6E, 0x2B, 0x6D, 0x50, 0x65, 0x5A, 0x71, 0x78, + 0x32, 0x70, 0x48, 0x47, 0x6A, 0x37, 0x44, 0x61, 0x55, 0x61, 0x48, 0x70, 0x33, 0x70, 0x4C, 0x48, 0x6E, 0x44, 0x69, 0x2B, 0x42, 0x65, 0x75, 0x4B, 0x31, 0x63, 0x6F, 0x62, 0x76, 0x6F, 0x6D, 0x75, 0x4C, 0x38, 0x41, 0x2F, 0x62, 0x0A, 0x30, 0x31, + 0x6B, 0x2F, 0x75, 0x6E, 0x4B, 0x38, 0x52, 0x43, 0x53, 0x63, 0x34, 0x33, 0x4F, 0x7A, 0x39, 0x36, 0x39, 0x58, 0x4C, 0x30, 0x49, 0x6D, 0x6E, 0x61, 0x6C, 0x30, 0x75, 0x67, 0x42, 0x53, 0x38, 0x6B, 0x76, 0x4E, 0x55, 0x33, 0x78, 0x48, 0x43, 0x7A, + 0x61, 0x46, 0x44, 0x6D, 0x61, 0x70, 0x43, 0x4A, 0x63, 0x57, 0x4E, 0x46, 0x66, 0x42, 0x5A, 0x76, 0x65, 0x41, 0x34, 0x2B, 0x31, 0x77, 0x56, 0x4D, 0x65, 0x54, 0x34, 0x43, 0x34, 0x6F, 0x46, 0x56, 0x6D, 0x48, 0x0A, 0x75, 0x72, 0x73, 0x43, 0x41, + 0x77, 0x45, 0x41, 0x41, 0x61, 0x4F, 0x42, 0x6E, 0x54, 0x43, 0x42, 0x6D, 0x6A, 0x41, 0x54, 0x42, 0x67, 0x6B, 0x72, 0x42, 0x67, 0x45, 0x45, 0x41, 0x59, 0x49, 0x33, 0x46, 0x41, 0x49, 0x45, 0x42, 0x68, 0x34, 0x45, 0x41, 0x45, 0x4D, 0x41, 0x51, + 0x54, 0x41, 0x4C, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x0A, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, + 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x51, 0x6A, 0x4B, 0x32, 0x46, 0x76, 0x6F, 0x45, 0x2F, 0x66, 0x35, 0x64, 0x53, 0x33, 0x72, 0x44, 0x2F, 0x66, 0x64, 0x4D, 0x51, 0x42, 0x31, 0x61, + 0x51, 0x36, 0x38, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x52, 0x30, 0x66, 0x42, 0x43, 0x30, 0x77, 0x4B, 0x7A, 0x41, 0x70, 0x6F, 0x43, 0x65, 0x67, 0x4A, 0x59, 0x59, 0x6A, 0x0A, 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x32, 0x4E, + 0x79, 0x62, 0x43, 0x35, 0x7A, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x76, 0x55, 0x31, 0x52, 0x44, 0x51, 0x53, 0x35, 0x6A, 0x63, 0x6D, 0x77, 0x77, 0x45, 0x41, 0x59, + 0x4A, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x41, 0x47, 0x43, 0x4E, 0x78, 0x55, 0x42, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x0A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, + 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x44, 0x44, 0x74, 0x54, 0x30, 0x72, 0x68, 0x57, 0x44, 0x70, 0x53, 0x63, 0x6C, 0x75, 0x31, 0x70, 0x71, 0x4E, 0x6C, 0x47, 0x4B, 0x61, 0x37, 0x55, 0x54, 0x74, 0x33, 0x36, 0x5A, 0x33, 0x71, 0x30, 0x35, + 0x39, 0x63, 0x34, 0x45, 0x56, 0x6C, 0x65, 0x77, 0x33, 0x4B, 0x57, 0x2B, 0x4A, 0x77, 0x55, 0x4C, 0x4B, 0x55, 0x42, 0x52, 0x53, 0x75, 0x0A, 0x53, 0x63, 0x65, 0x4E, 0x51, 0x51, 0x63, 0x53, 0x63, 0x35, 0x52, 0x2B, 0x44, 0x43, 0x4D, 0x68, 0x2F, + 0x62, 0x77, 0x51, 0x66, 0x32, 0x41, 0x51, 0x57, 0x6E, 0x4C, 0x31, 0x6D, 0x41, 0x36, 0x73, 0x37, 0x4C, 0x6C, 0x2F, 0x33, 0x58, 0x70, 0x76, 0x58, 0x64, 0x4D, 0x63, 0x39, 0x50, 0x2B, 0x49, 0x42, 0x57, 0x6C, 0x43, 0x71, 0x51, 0x56, 0x78, 0x79, + 0x4C, 0x65, 0x73, 0x4A, 0x75, 0x67, 0x75, 0x74, 0x49, 0x78, 0x71, 0x2F, 0x33, 0x48, 0x63, 0x75, 0x4C, 0x48, 0x66, 0x0A, 0x6D, 0x62, 0x78, 0x38, 0x49, 0x56, 0x51, 0x72, 0x35, 0x46, 0x69, 0x69, 0x75, 0x31, 0x63, 0x70, 0x72, 0x70, 0x36, 0x70, + 0x6F, 0x78, 0x6B, 0x6D, 0x44, 0x35, 0x6B, 0x75, 0x43, 0x4C, 0x44, 0x76, 0x2F, 0x57, 0x6E, 0x50, 0x6D, 0x52, 0x6F, 0x4A, 0x6A, 0x65, 0x4F, 0x6E, 0x6E, 0x79, 0x76, 0x4A, 0x4E, 0x6A, 0x52, 0x37, 0x4A, 0x4C, 0x4E, 0x34, 0x54, 0x4A, 0x55, 0x58, + 0x70, 0x41, 0x59, 0x6D, 0x48, 0x72, 0x5A, 0x6B, 0x55, 0x6A, 0x5A, 0x66, 0x59, 0x47, 0x66, 0x5A, 0x0A, 0x6E, 0x4D, 0x55, 0x46, 0x64, 0x41, 0x76, 0x6E, 0x5A, 0x79, 0x50, 0x53, 0x43, 0x50, 0x79, 0x49, 0x36, 0x61, 0x36, 0x4C, 0x66, 0x2B, 0x45, + 0x77, 0x39, 0x44, 0x64, 0x2B, 0x2F, 0x63, 0x59, 0x79, 0x32, 0x69, 0x32, 0x65, 0x52, 0x44, 0x41, 0x77, 0x62, 0x4F, 0x34, 0x48, 0x33, 0x74, 0x49, 0x30, 0x2F, 0x4E, 0x4C, 0x2F, 0x51, 0x50, 0x5A, 0x4C, 0x39, 0x47, 0x5A, 0x47, 0x42, 0x6C, 0x53, + 0x6D, 0x38, 0x6A, 0x49, 0x4B, 0x59, 0x79, 0x59, 0x77, 0x61, 0x35, 0x76, 0x52, 0x0A, 0x33, 0x49, 0x74, 0x48, 0x75, 0x75, 0x47, 0x35, 0x31, 0x57, 0x4C, 0x51, 0x6F, 0x71, 0x44, 0x30, 0x5A, 0x77, 0x56, 0x34, 0x4B, 0x57, 0x4D, 0x61, 0x62, 0x77, + 0x54, 0x57, 0x2B, 0x4D, 0x5A, 0x4D, 0x6F, 0x35, 0x71, 0x78, 0x4E, 0x37, 0x53, 0x4E, 0x35, 0x53, 0x68, 0x4C, 0x48, 0x5A, 0x34, 0x73, 0x77, 0x72, 0x68, 0x6F, 0x76, 0x4F, 0x30, 0x43, 0x37, 0x6A, 0x45, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x43, 0x41, 0x0A, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x76, 0x44, 0x43, 0x43, 0x41, 0x71, 0x53, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x42, 0x31, 0x59, 0x69, 0x70, 0x4F, 0x6A, 0x55, 0x69, 0x6F, 0x6C, 0x4E, 0x39, 0x42, 0x50, 0x49, + 0x38, 0x50, 0x6A, 0x71, 0x70, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, 0x42, 0x4B, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, + 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x58, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x51, 0x32, 0x39, + 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x5A, 0x53, 0x42, 0x48, 0x0A, 0x62, 0x47, + 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x59, 0x78, 0x4D, 0x54, 0x41, 0x33, 0x4D, 0x54, 0x6B, 0x30, 0x4D, 0x6A, 0x49, 0x34, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x6B, 0x78, 0x4D, 0x6A, + 0x4D, 0x78, 0x4D, 0x54, 0x6B, 0x31, 0x4D, 0x6A, 0x41, 0x32, 0x57, 0x6A, 0x42, 0x4B, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x67, 0x0A, 0x4D, 0x42, 0x34, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x58, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x51, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x47, + 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x5A, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x0A, 0x51, 0x30, 0x45, 0x77, 0x67, 0x67, 0x45, 0x69, + 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x76, + 0x4E, 0x53, 0x37, 0x59, 0x72, 0x47, 0x78, 0x56, 0x61, 0x51, 0x5A, 0x78, 0x35, 0x52, 0x4E, 0x6F, 0x4A, 0x4C, 0x4E, 0x50, 0x32, 0x4D, 0x77, 0x68, 0x52, 0x2F, 0x6A, 0x78, 0x0A, 0x59, 0x44, 0x69, 0x4A, 0x69, 0x51, 0x50, 0x70, 0x76, 0x65, 0x70, + 0x65, 0x52, 0x6C, 0x4D, 0x4A, 0x33, 0x46, 0x7A, 0x31, 0x57, 0x75, 0x6A, 0x33, 0x52, 0x53, 0x6F, 0x43, 0x36, 0x7A, 0x46, 0x68, 0x31, 0x79, 0x6B, 0x7A, 0x54, 0x4D, 0x37, 0x48, 0x66, 0x41, 0x6F, 0x33, 0x66, 0x67, 0x2B, 0x36, 0x4D, 0x70, 0x6A, + 0x68, 0x48, 0x5A, 0x65, 0x76, 0x6A, 0x38, 0x66, 0x63, 0x79, 0x54, 0x69, 0x57, 0x38, 0x39, 0x73, 0x61, 0x2F, 0x46, 0x48, 0x74, 0x61, 0x4D, 0x62, 0x51, 0x0A, 0x62, 0x71, 0x52, 0x38, 0x4A, 0x4E, 0x47, 0x75, 0x51, 0x73, 0x69, 0x57, 0x55, 0x47, + 0x4D, 0x75, 0x34, 0x50, 0x35, 0x31, 0x2F, 0x70, 0x69, 0x6E, 0x58, 0x30, 0x6B, 0x75, 0x6C, 0x65, 0x4D, 0x35, 0x4D, 0x32, 0x53, 0x4F, 0x48, 0x71, 0x52, 0x66, 0x6B, 0x4E, 0x4A, 0x6E, 0x50, 0x4C, 0x4C, 0x5A, 0x2F, 0x6B, 0x47, 0x35, 0x56, 0x61, + 0x63, 0x4A, 0x6A, 0x6E, 0x49, 0x46, 0x48, 0x6F, 0x76, 0x64, 0x52, 0x49, 0x57, 0x43, 0x51, 0x74, 0x42, 0x4A, 0x77, 0x42, 0x31, 0x67, 0x0A, 0x38, 0x4E, 0x45, 0x58, 0x4C, 0x4A, 0x58, 0x72, 0x39, 0x71, 0x58, 0x42, 0x6B, 0x71, 0x50, 0x46, 0x77, + 0x71, 0x63, 0x49, 0x59, 0x41, 0x31, 0x67, 0x42, 0x42, 0x43, 0x57, 0x65, 0x5A, 0x34, 0x57, 0x4E, 0x4F, 0x61, 0x70, 0x74, 0x76, 0x6F, 0x6C, 0x52, 0x54, 0x6E, 0x49, 0x48, 0x6D, 0x58, 0x35, 0x6B, 0x2F, 0x57, 0x71, 0x38, 0x56, 0x4C, 0x63, 0x6D, + 0x5A, 0x67, 0x39, 0x70, 0x59, 0x59, 0x61, 0x44, 0x44, 0x55, 0x7A, 0x2B, 0x6B, 0x75, 0x6C, 0x42, 0x41, 0x59, 0x56, 0x0A, 0x48, 0x44, 0x47, 0x41, 0x37, 0x36, 0x6F, 0x59, 0x61, 0x38, 0x4A, 0x37, 0x31, 0x39, 0x72, 0x4F, 0x2B, 0x54, 0x4D, 0x67, + 0x31, 0x66, 0x57, 0x39, 0x61, 0x6A, 0x4D, 0x74, 0x67, 0x51, 0x54, 0x37, 0x73, 0x46, 0x7A, 0x55, 0x6E, 0x4B, 0x50, 0x69, 0x58, 0x42, 0x33, 0x6A, 0x71, 0x55, 0x4A, 0x31, 0x58, 0x6E, 0x76, 0x55, 0x64, 0x2B, 0x38, 0x35, 0x56, 0x4C, 0x72, 0x4A, + 0x43, 0x68, 0x67, 0x62, 0x45, 0x70, 0x6C, 0x4A, 0x4C, 0x34, 0x68, 0x4C, 0x2F, 0x56, 0x42, 0x69, 0x0A, 0x30, 0x58, 0x50, 0x6E, 0x6A, 0x33, 0x70, 0x44, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x67, 0x5A, 0x30, 0x77, 0x67, 0x5A, 0x6F, + 0x77, 0x45, 0x77, 0x59, 0x4A, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x41, 0x47, 0x43, 0x4E, 0x78, 0x51, 0x43, 0x42, 0x41, 0x59, 0x65, 0x42, 0x41, 0x42, 0x44, 0x41, 0x45, 0x45, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x42, 0x41, 0x51, + 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, + 0x59, 0x45, 0x46, 0x4B, 0x39, 0x45, 0x42, 0x4D, 0x4A, 0x42, 0x66, 0x6B, 0x69, 0x44, 0x32, 0x30, 0x34, 0x35, 0x41, 0x75, 0x7A, 0x73, 0x68, 0x48, 0x72, 0x6D, 0x7A, 0x73, 0x6D, 0x6B, 0x4D, 0x44, 0x51, 0x47, 0x41, 0x31, 0x55, 0x64, 0x48, 0x77, + 0x51, 0x74, 0x4D, 0x43, 0x73, 0x77, 0x4B, 0x61, 0x41, 0x6E, 0x0A, 0x6F, 0x43, 0x57, 0x47, 0x49, 0x32, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x6A, 0x63, 0x6D, 0x77, 0x75, 0x63, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x64, + 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4C, 0x31, 0x4E, 0x48, 0x51, 0x30, 0x45, 0x75, 0x59, 0x33, 0x4A, 0x73, 0x4D, 0x42, 0x41, 0x47, 0x43, 0x53, 0x73, 0x47, 0x41, 0x51, 0x51, 0x42, 0x67, 0x6A, 0x63, 0x56, 0x41, + 0x51, 0x51, 0x44, 0x41, 0x67, 0x45, 0x41, 0x0A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x42, 0x6A, 0x47, 0x67, 0x68, 0x41, + 0x66, 0x61, 0x52, 0x65, 0x55, 0x77, 0x31, 0x33, 0x32, 0x48, 0x71, 0x75, 0x48, 0x77, 0x30, 0x4C, 0x55, 0x52, 0x59, 0x44, 0x37, 0x78, 0x68, 0x38, 0x79, 0x4F, 0x4F, 0x76, 0x61, 0x6C, 0x69, 0x54, 0x46, 0x47, 0x43, 0x52, 0x73, 0x6F, 0x54, 0x63, + 0x69, 0x45, 0x36, 0x2B, 0x0A, 0x4F, 0x59, 0x6F, 0x36, 0x38, 0x2B, 0x61, 0x43, 0x69, 0x56, 0x30, 0x42, 0x4E, 0x37, 0x4F, 0x72, 0x4A, 0x4B, 0x51, 0x56, 0x44, 0x70, 0x49, 0x31, 0x57, 0x6B, 0x70, 0x45, 0x58, 0x6B, 0x35, 0x58, 0x2B, 0x6E, 0x58, + 0x4F, 0x48, 0x30, 0x6A, 0x4F, 0x5A, 0x76, 0x51, 0x38, 0x51, 0x43, 0x61, 0x53, 0x6D, 0x47, 0x77, 0x62, 0x37, 0x69, 0x52, 0x47, 0x44, 0x42, 0x65, 0x7A, 0x55, 0x71, 0x58, 0x62, 0x70, 0x5A, 0x47, 0x52, 0x7A, 0x7A, 0x66, 0x54, 0x62, 0x2B, 0x63, + 0x6E, 0x0A, 0x43, 0x44, 0x70, 0x4F, 0x47, 0x52, 0x38, 0x36, 0x70, 0x31, 0x68, 0x63, 0x46, 0x38, 0x39, 0x35, 0x50, 0x34, 0x76, 0x6B, 0x70, 0x39, 0x4D, 0x6D, 0x49, 0x35, 0x30, 0x6D, 0x44, 0x31, 0x68, 0x70, 0x2F, 0x45, 0x64, 0x2B, 0x73, 0x74, + 0x43, 0x4E, 0x69, 0x35, 0x4F, 0x2F, 0x4B, 0x55, 0x39, 0x44, 0x61, 0x58, 0x52, 0x32, 0x5A, 0x30, 0x76, 0x50, 0x42, 0x34, 0x7A, 0x6D, 0x41, 0x76, 0x65, 0x31, 0x34, 0x62, 0x52, 0x44, 0x74, 0x55, 0x73, 0x74, 0x46, 0x4A, 0x2F, 0x35, 0x0A, 0x33, + 0x43, 0x59, 0x4E, 0x76, 0x36, 0x5A, 0x48, 0x64, 0x41, 0x62, 0x59, 0x69, 0x4E, 0x45, 0x36, 0x4B, 0x54, 0x43, 0x45, 0x7A, 0x74, 0x49, 0x35, 0x67, 0x47, 0x49, 0x62, 0x71, 0x4D, 0x64, 0x58, 0x53, 0x62, 0x78, 0x71, 0x56, 0x56, 0x46, 0x6E, 0x46, + 0x55, 0x71, 0x2B, 0x4E, 0x51, 0x66, 0x6B, 0x31, 0x58, 0x57, 0x59, 0x4E, 0x33, 0x6B, 0x77, 0x46, 0x4E, 0x73, 0x70, 0x6E, 0x57, 0x7A, 0x46, 0x61, 0x63, 0x78, 0x48, 0x56, 0x61, 0x49, 0x77, 0x39, 0x38, 0x78, 0x63, 0x0A, 0x66, 0x38, 0x4C, 0x44, + 0x6D, 0x42, 0x78, 0x72, 0x54, 0x68, 0x61, 0x41, 0x36, 0x33, 0x70, 0x34, 0x5A, 0x55, 0x57, 0x69, 0x41, 0x42, 0x71, 0x76, 0x44, 0x41, 0x31, 0x56, 0x5A, 0x44, 0x52, 0x49, 0x75, 0x4A, 0x4B, 0x35, 0x38, 0x62, 0x52, 0x51, 0x4B, 0x66, 0x4A, 0x50, + 0x49, 0x78, 0x2F, 0x61, 0x62, 0x4B, 0x77, 0x66, 0x52, 0x4F, 0x48, 0x64, 0x49, 0x33, 0x68, 0x52, 0x57, 0x38, 0x63, 0x57, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x4F, 0x4D, 0x4F, 0x44, 0x4F, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x48, 0x54, 0x43, 0x43, 0x41, 0x77, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x54, 0x6F, + 0x45, 0x74, 0x69, 0x6F, 0x4A, 0x6C, 0x34, 0x41, 0x73, 0x43, 0x37, 0x6A, 0x34, 0x31, 0x41, 0x6B, 0x62, 0x6C, 0x50, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, + 0x43, 0x42, 0x67, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x30, 0x49, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x45, 0x6B, 0x64, 0x79, 0x5A, + 0x57, 0x46, 0x30, 0x5A, 0x58, 0x49, 0x67, 0x54, 0x57, 0x46, 0x75, 0x59, 0x32, 0x68, 0x6C, 0x63, 0x33, 0x52, 0x6C, 0x63, 0x6A, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x48, 0x55, 0x32, 0x46, 0x73, 0x5A, + 0x6D, 0x39, 0x79, 0x5A, 0x44, 0x45, 0x61, 0x4D, 0x42, 0x67, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x52, 0x51, 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, + 0x5A, 0x57, 0x51, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x48, 0x6B, 0x4E, 0x50, 0x54, 0x55, 0x39, 0x45, 0x54, 0x79, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, + 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x0A, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4E, 0x6A, 0x45, 0x79, 0x4D, 0x44, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, + 0x61, 0x46, 0x77, 0x30, 0x79, 0x4F, 0x54, 0x45, 0x79, 0x4D, 0x7A, 0x45, 0x79, 0x4D, 0x7A, 0x55, 0x35, 0x4E, 0x54, 0x6C, 0x61, 0x4D, 0x49, 0x47, 0x42, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, + 0x48, 0x51, 0x6A, 0x45, 0x62, 0x0A, 0x4D, 0x42, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4D, 0x53, 0x52, 0x33, 0x4A, 0x6C, 0x59, 0x58, 0x52, 0x6C, 0x63, 0x69, 0x42, 0x4E, 0x59, 0x57, 0x35, 0x6A, 0x61, 0x47, 0x56, 0x7A, 0x64, 0x47, + 0x56, 0x79, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x45, 0x77, 0x64, 0x54, 0x59, 0x57, 0x78, 0x6D, 0x62, 0x33, 0x4A, 0x6B, 0x4D, 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, + 0x46, 0x44, 0x0A, 0x54, 0x30, 0x31, 0x50, 0x52, 0x45, 0x38, 0x67, 0x51, 0x30, 0x45, 0x67, 0x54, 0x47, 0x6C, 0x74, 0x61, 0x58, 0x52, 0x6C, 0x5A, 0x44, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x65, 0x51, + 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x0A, + 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, + 0x41, 0x51, 0x45, 0x41, 0x30, 0x45, 0x43, 0x4C, 0x69, 0x33, 0x4C, 0x6A, 0x6B, 0x52, 0x76, 0x33, 0x55, 0x63, 0x45, 0x62, 0x56, 0x41, 0x53, 0x59, 0x30, 0x36, 0x6D, 0x2F, 0x77, 0x65, 0x61, 0x4B, 0x58, 0x54, 0x75, 0x48, 0x0A, 0x2B, 0x37, 0x75, + 0x49, 0x7A, 0x67, 0x33, 0x6A, 0x4C, 0x7A, 0x38, 0x47, 0x6C, 0x76, 0x43, 0x69, 0x4B, 0x56, 0x43, 0x5A, 0x72, 0x74, 0x73, 0x37, 0x6F, 0x56, 0x65, 0x77, 0x64, 0x46, 0x46, 0x78, 0x7A, 0x65, 0x31, 0x43, 0x6B, 0x55, 0x31, 0x42, 0x2F, 0x71, 0x6E, + 0x49, 0x32, 0x47, 0x71, 0x47, 0x64, 0x30, 0x53, 0x37, 0x57, 0x57, 0x61, 0x58, 0x55, 0x46, 0x36, 0x30, 0x31, 0x43, 0x78, 0x77, 0x52, 0x4D, 0x2F, 0x61, 0x4E, 0x35, 0x56, 0x43, 0x61, 0x54, 0x77, 0x77, 0x0A, 0x78, 0x48, 0x47, 0x7A, 0x55, 0x76, + 0x41, 0x68, 0x54, 0x61, 0x48, 0x59, 0x75, 0x6A, 0x6C, 0x38, 0x48, 0x4A, 0x36, 0x6A, 0x4A, 0x4A, 0x33, 0x79, 0x67, 0x78, 0x61, 0x59, 0x71, 0x68, 0x5A, 0x38, 0x51, 0x35, 0x73, 0x56, 0x57, 0x37, 0x65, 0x75, 0x4E, 0x4A, 0x48, 0x2B, 0x31, 0x47, + 0x49, 0x6D, 0x47, 0x45, 0x61, 0x61, 0x50, 0x2B, 0x76, 0x42, 0x2B, 0x66, 0x47, 0x51, 0x56, 0x2B, 0x75, 0x73, 0x65, 0x67, 0x32, 0x4C, 0x32, 0x33, 0x49, 0x77, 0x61, 0x6D, 0x62, 0x56, 0x0A, 0x34, 0x45, 0x61, 0x6A, 0x63, 0x4E, 0x78, 0x6F, 0x32, + 0x66, 0x38, 0x45, 0x53, 0x49, 0x6C, 0x33, 0x33, 0x72, 0x58, 0x70, 0x2B, 0x32, 0x64, 0x74, 0x51, 0x65, 0x6D, 0x38, 0x4F, 0x62, 0x30, 0x79, 0x32, 0x57, 0x49, 0x43, 0x38, 0x62, 0x47, 0x6F, 0x50, 0x57, 0x34, 0x33, 0x6E, 0x4F, 0x49, 0x76, 0x34, + 0x74, 0x4F, 0x69, 0x4A, 0x6F, 0x76, 0x47, 0x75, 0x46, 0x56, 0x44, 0x69, 0x4F, 0x45, 0x6A, 0x50, 0x71, 0x58, 0x53, 0x4A, 0x44, 0x6C, 0x71, 0x52, 0x36, 0x73, 0x41, 0x0A, 0x31, 0x4B, 0x47, 0x7A, 0x71, 0x53, 0x58, 0x2B, 0x44, 0x54, 0x2B, 0x6E, + 0x48, 0x62, 0x72, 0x54, 0x55, 0x63, 0x45, 0x4C, 0x70, 0x4E, 0x71, 0x73, 0x4F, 0x4F, 0x39, 0x56, 0x55, 0x43, 0x51, 0x46, 0x5A, 0x55, 0x61, 0x54, 0x4E, 0x45, 0x38, 0x74, 0x6A, 0x61, 0x33, 0x47, 0x31, 0x43, 0x45, 0x5A, 0x30, 0x6F, 0x37, 0x4B, + 0x42, 0x57, 0x46, 0x78, 0x42, 0x33, 0x4E, 0x48, 0x35, 0x59, 0x6F, 0x5A, 0x45, 0x72, 0x30, 0x45, 0x54, 0x63, 0x35, 0x4F, 0x6E, 0x4B, 0x56, 0x49, 0x0A, 0x72, 0x4C, 0x73, 0x6D, 0x39, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x47, + 0x4F, 0x4D, 0x49, 0x47, 0x4C, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x51, 0x4C, 0x57, 0x4F, 0x57, 0x4C, 0x78, 0x6B, 0x77, 0x56, 0x4E, 0x36, 0x52, 0x41, 0x71, 0x54, 0x43, 0x70, 0x49, 0x62, 0x35, + 0x48, 0x4E, 0x6C, 0x70, 0x57, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x0A, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, + 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x42, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x38, 0x45, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x44, 0x36, 0x67, 0x50, 0x4B, 0x41, 0x36, 0x68, 0x6A, 0x68, 0x6F, 0x64, 0x48, + 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x57, 0x39, 0x6B, 0x0A, 0x62, 0x32, 0x4E, 0x68, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x39, 0x44, 0x54, 0x30, 0x31, 0x50, 0x52, 0x45, 0x39, 0x44, 0x5A, + 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4C, 0x6D, 0x4E, 0x79, 0x62, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, + 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x0A, 0x41, 0x51, 0x45, 0x41, 0x50, 0x70, 0x69, 0x65, 0x6D, 0x2F, 0x59, 0x62, 0x36, 0x64, 0x63, 0x35, 0x74, 0x33, 0x69, 0x75, 0x48, 0x58, 0x49, 0x59, + 0x53, 0x64, 0x4F, 0x48, 0x35, 0x45, 0x4F, 0x43, 0x36, 0x7A, 0x2F, 0x4A, 0x71, 0x76, 0x57, 0x6F, 0x74, 0x65, 0x39, 0x56, 0x66, 0x43, 0x46, 0x53, 0x5A, 0x66, 0x6E, 0x56, 0x44, 0x65, 0x46, 0x73, 0x39, 0x44, 0x36, 0x4D, 0x6B, 0x33, 0x4F, 0x52, + 0x4C, 0x67, 0x4C, 0x45, 0x54, 0x67, 0x64, 0x78, 0x62, 0x38, 0x43, 0x50, 0x0A, 0x4F, 0x47, 0x45, 0x49, 0x71, 0x42, 0x36, 0x42, 0x43, 0x73, 0x41, 0x76, 0x49, 0x43, 0x39, 0x42, 0x69, 0x35, 0x48, 0x63, 0x53, 0x45, 0x57, 0x38, 0x38, 0x63, 0x62, + 0x65, 0x75, 0x6E, 0x5A, 0x72, 0x4D, 0x38, 0x67, 0x41, 0x4C, 0x54, 0x46, 0x47, 0x54, 0x4F, 0x33, 0x6E, 0x6E, 0x63, 0x2B, 0x49, 0x6C, 0x50, 0x38, 0x7A, 0x77, 0x46, 0x62, 0x6F, 0x4A, 0x49, 0x59, 0x6D, 0x75, 0x4E, 0x67, 0x34, 0x4F, 0x4E, 0x38, + 0x71, 0x61, 0x39, 0x30, 0x53, 0x7A, 0x4D, 0x63, 0x2F, 0x0A, 0x52, 0x78, 0x64, 0x4D, 0x6F, 0x73, 0x49, 0x47, 0x6C, 0x67, 0x6E, 0x57, 0x32, 0x2F, 0x34, 0x2F, 0x50, 0x45, 0x5A, 0x42, 0x33, 0x31, 0x6A, 0x69, 0x56, 0x67, 0x38, 0x38, 0x4F, 0x38, + 0x45, 0x63, 0x6B, 0x7A, 0x58, 0x5A, 0x4F, 0x46, 0x4B, 0x73, 0x37, 0x73, 0x6A, 0x73, 0x4C, 0x6A, 0x42, 0x4F, 0x6C, 0x44, 0x57, 0x30, 0x4A, 0x42, 0x39, 0x4C, 0x65, 0x47, 0x6E, 0x61, 0x38, 0x67, 0x49, 0x34, 0x7A, 0x4A, 0x56, 0x53, 0x6B, 0x2F, + 0x42, 0x77, 0x4A, 0x56, 0x6D, 0x63, 0x0A, 0x49, 0x47, 0x66, 0x45, 0x37, 0x76, 0x6D, 0x4C, 0x56, 0x32, 0x48, 0x30, 0x6B, 0x6E, 0x5A, 0x39, 0x50, 0x34, 0x53, 0x4E, 0x56, 0x62, 0x66, 0x6F, 0x35, 0x61, 0x7A, 0x56, 0x38, 0x66, 0x55, 0x5A, 0x56, + 0x71, 0x5A, 0x61, 0x2B, 0x35, 0x41, 0x63, 0x72, 0x35, 0x50, 0x72, 0x35, 0x52, 0x7A, 0x55, 0x5A, 0x35, 0x64, 0x64, 0x42, 0x41, 0x36, 0x2B, 0x43, 0x34, 0x4F, 0x6D, 0x46, 0x34, 0x4F, 0x35, 0x4D, 0x42, 0x4B, 0x67, 0x78, 0x54, 0x4D, 0x56, 0x42, + 0x62, 0x6B, 0x4E, 0x0A, 0x2B, 0x38, 0x63, 0x46, 0x64, 0x75, 0x50, 0x59, 0x53, 0x6F, 0x33, 0x38, 0x4E, 0x42, 0x65, 0x6A, 0x78, 0x69, 0x45, 0x6F, 0x76, 0x6A, 0x42, 0x46, 0x4D, 0x52, 0x37, 0x48, 0x65, 0x4C, 0x35, 0x59, 0x59, 0x54, 0x69, 0x73, + 0x4F, 0x2B, 0x49, 0x42, 0x5A, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x4F, 0x4D, 0x4F, + 0x44, 0x4F, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x69, 0x54, 0x43, 0x43, 0x41, 0x67, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x48, 0x30, 0x65, 0x76, 0x71, 0x6D, + 0x49, 0x41, 0x63, 0x46, 0x42, 0x55, 0x54, 0x41, 0x47, 0x65, 0x6D, 0x32, 0x4F, 0x5A, 0x4B, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x43, 0x42, 0x68, 0x54, 0x45, 0x4C, 0x4D, 0x41, + 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x0A, 0x52, 0x30, 0x49, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x45, 0x6B, 0x64, 0x79, 0x5A, 0x57, 0x46, 0x30, 0x5A, 0x58, 0x49, 0x67, 0x54, + 0x57, 0x46, 0x75, 0x59, 0x32, 0x68, 0x6C, 0x63, 0x33, 0x52, 0x6C, 0x63, 0x6A, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x48, 0x55, 0x32, 0x46, 0x73, 0x5A, 0x6D, 0x39, 0x79, 0x5A, 0x44, 0x45, 0x61, 0x4D, + 0x42, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x68, 0x4D, 0x52, 0x51, 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x4B, 0x7A, 0x41, 0x70, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6B, 0x4E, 0x50, 0x54, 0x55, 0x39, 0x45, 0x54, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, + 0x62, 0x69, 0x42, 0x42, 0x0A, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x77, 0x4D, 0x7A, 0x41, 0x32, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, + 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x68, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x30, 0x49, + 0x78, 0x0A, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x45, 0x6B, 0x64, 0x79, 0x5A, 0x57, 0x46, 0x30, 0x5A, 0x58, 0x49, 0x67, 0x54, 0x57, 0x46, 0x75, 0x59, 0x32, 0x68, 0x6C, 0x63, 0x33, 0x52, 0x6C, 0x63, 0x6A, + 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x48, 0x55, 0x32, 0x46, 0x73, 0x5A, 0x6D, 0x39, 0x79, 0x5A, 0x44, 0x45, 0x61, 0x4D, 0x42, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x52, 0x0A, 0x51, + 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6B, 0x4E, 0x50, 0x54, + 0x55, 0x39, 0x45, 0x54, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x0A, 0x62, 0x33, 0x4A, 0x70, + 0x64, 0x48, 0x6B, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, 0x44, 0x52, 0x33, 0x73, 0x76, + 0x64, 0x63, 0x6D, 0x43, 0x46, 0x59, 0x58, 0x37, 0x64, 0x65, 0x53, 0x52, 0x46, 0x74, 0x53, 0x72, 0x59, 0x70, 0x6E, 0x31, 0x50, 0x6C, 0x49, 0x4C, 0x42, 0x73, 0x35, 0x42, 0x41, 0x48, 0x2B, 0x58, 0x0A, 0x34, 0x51, 0x6F, 0x6B, 0x50, 0x42, 0x30, + 0x42, 0x42, 0x4F, 0x34, 0x39, 0x30, 0x6F, 0x30, 0x4A, 0x6C, 0x77, 0x7A, 0x67, 0x64, 0x65, 0x54, 0x36, 0x2B, 0x33, 0x65, 0x4B, 0x4B, 0x76, 0x55, 0x44, 0x59, 0x45, 0x73, 0x32, 0x69, 0x78, 0x59, 0x6A, 0x46, 0x71, 0x30, 0x4A, 0x63, 0x66, 0x52, + 0x4B, 0x39, 0x43, 0x68, 0x51, 0x74, 0x50, 0x36, 0x49, 0x48, 0x47, 0x34, 0x2F, 0x62, 0x43, 0x38, 0x76, 0x43, 0x56, 0x6C, 0x62, 0x70, 0x56, 0x73, 0x4C, 0x4D, 0x35, 0x6E, 0x69, 0x0A, 0x77, 0x7A, 0x32, 0x4A, 0x2B, 0x57, 0x6F, 0x73, 0x37, 0x37, + 0x4C, 0x54, 0x42, 0x75, 0x6D, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x31, 0x63, 0x61, 0x63, 0x5A, 0x53, 0x42, 0x6D, 0x38, 0x6E, 0x5A, 0x33, 0x71, 0x51, 0x55, + 0x66, 0x66, 0x6C, 0x4D, 0x52, 0x49, 0x64, 0x35, 0x6E, 0x54, 0x65, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x0A, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, + 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, + 0x6A, 0x45, 0x41, 0x37, 0x77, 0x4E, 0x62, 0x65, 0x71, 0x79, 0x33, 0x65, 0x41, 0x70, 0x79, 0x74, 0x34, 0x6A, 0x66, 0x2F, 0x37, 0x56, 0x47, 0x0A, 0x46, 0x41, 0x6B, 0x4B, 0x2B, 0x71, 0x44, 0x6D, 0x66, 0x51, 0x6A, 0x47, 0x47, 0x6F, 0x65, 0x39, + 0x47, 0x4B, 0x68, 0x7A, 0x76, 0x53, 0x62, 0x4B, 0x59, 0x41, 0x79, 0x64, 0x7A, 0x70, 0x6D, 0x66, 0x7A, 0x31, 0x77, 0x50, 0x4D, 0x4F, 0x47, 0x2B, 0x46, 0x44, 0x48, 0x71, 0x41, 0x6A, 0x41, 0x55, 0x39, 0x4A, 0x4D, 0x38, 0x53, 0x61, 0x63, 0x7A, + 0x65, 0x70, 0x42, 0x47, 0x52, 0x37, 0x4E, 0x6A, 0x66, 0x52, 0x4F, 0x62, 0x54, 0x72, 0x64, 0x76, 0x47, 0x44, 0x65, 0x41, 0x0A, 0x55, 0x2F, 0x37, 0x64, 0x49, 0x4F, 0x41, 0x31, 0x6D, 0x6A, 0x62, 0x52, 0x78, 0x77, 0x47, 0x35, 0x35, 0x74, 0x7A, + 0x64, 0x38, 0x2F, 0x38, 0x64, 0x4C, 0x44, 0x6F, 0x57, 0x56, 0x39, 0x6D, 0x53, 0x4F, 0x64, 0x59, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6E, 0x61, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x71, 0x44, 0x43, 0x43, 0x41, 0x70, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x41, 0x50, 0x37, 0x63, 0x34, 0x77, 0x45, 0x50, 0x79, + 0x55, 0x6A, 0x2F, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x4D, 0x44, 0x51, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, + 0x6B, 0x5A, 0x53, 0x4D, 0x52, 0x49, 0x77, 0x0A, 0x45, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x6C, 0x45, 0x61, 0x47, 0x6C, 0x74, 0x65, 0x57, 0x39, 0x30, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x4D, 0x4D, 0x43, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x32, 0x35, 0x68, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x33, 0x4D, 0x44, 0x59, 0x79, 0x4F, 0x54, 0x45, 0x31, 0x4D, 0x54, 0x4D, 0x77, 0x4E, 0x56, 0x6F, 0x58, + 0x44, 0x54, 0x49, 0x33, 0x0A, 0x4D, 0x44, 0x59, 0x79, 0x4F, 0x54, 0x45, 0x31, 0x4D, 0x54, 0x4D, 0x77, 0x4E, 0x56, 0x6F, 0x77, 0x4E, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x6C, 0x49, + 0x78, 0x45, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x55, 0x52, 0x6F, 0x61, 0x57, 0x31, 0x35, 0x62, 0x33, 0x52, 0x70, 0x63, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, + 0x49, 0x0A, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x6D, 0x45, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, + 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x44, 0x49, 0x61, 0x50, 0x48, 0x4A, 0x31, 0x74, 0x61, 0x7A, 0x4E, 0x48, 0x55, 0x6D, 0x67, 0x68, 0x37, 0x73, 0x74, 0x4C, 0x37, 0x71, 0x0A, 0x58, + 0x4F, 0x45, 0x6D, 0x37, 0x52, 0x46, 0x48, 0x59, 0x65, 0x47, 0x69, 0x66, 0x42, 0x5A, 0x34, 0x51, 0x43, 0x48, 0x6B, 0x59, 0x4A, 0x35, 0x61, 0x79, 0x47, 0x50, 0x68, 0x78, 0x4C, 0x47, 0x57, 0x6B, 0x76, 0x38, 0x59, 0x62, 0x57, 0x6B, 0x6A, 0x34, + 0x53, 0x74, 0x69, 0x39, 0x39, 0x33, 0x69, 0x4E, 0x69, 0x2B, 0x52, 0x42, 0x37, 0x6C, 0x49, 0x7A, 0x77, 0x37, 0x73, 0x65, 0x62, 0x59, 0x73, 0x35, 0x7A, 0x52, 0x4C, 0x63, 0x41, 0x67, 0x6C, 0x6F, 0x7A, 0x79, 0x48, 0x0A, 0x47, 0x78, 0x6E, 0x79, + 0x67, 0x51, 0x63, 0x50, 0x4F, 0x4A, 0x41, 0x5A, 0x30, 0x78, 0x48, 0x2B, 0x68, 0x72, 0x54, 0x79, 0x30, 0x56, 0x34, 0x65, 0x48, 0x70, 0x62, 0x4E, 0x67, 0x47, 0x7A, 0x4F, 0x4F, 0x7A, 0x47, 0x54, 0x74, 0x76, 0x4B, 0x67, 0x30, 0x4B, 0x6D, 0x56, + 0x45, 0x6E, 0x32, 0x6C, 0x6D, 0x73, 0x78, 0x72, 0x79, 0x49, 0x52, 0x57, 0x69, 0x6A, 0x4F, 0x70, 0x35, 0x79, 0x49, 0x56, 0x55, 0x78, 0x62, 0x77, 0x7A, 0x42, 0x66, 0x73, 0x56, 0x31, 0x2F, 0x70, 0x0A, 0x6F, 0x67, 0x71, 0x59, 0x43, 0x64, 0x37, + 0x6A, 0x58, 0x35, 0x78, 0x76, 0x33, 0x45, 0x6A, 0x6A, 0x68, 0x51, 0x73, 0x56, 0x57, 0x71, 0x61, 0x36, 0x6E, 0x36, 0x78, 0x49, 0x34, 0x77, 0x6D, 0x79, 0x39, 0x2F, 0x51, 0x79, 0x33, 0x6C, 0x34, 0x30, 0x76, 0x68, 0x78, 0x34, 0x58, 0x55, 0x4A, + 0x62, 0x7A, 0x67, 0x34, 0x69, 0x6A, 0x30, 0x32, 0x51, 0x31, 0x33, 0x30, 0x79, 0x47, 0x4C, 0x4D, 0x4C, 0x4C, 0x47, 0x71, 0x2F, 0x6A, 0x6A, 0x38, 0x55, 0x45, 0x59, 0x6B, 0x67, 0x0A, 0x44, 0x6E, 0x63, 0x55, 0x74, 0x54, 0x32, 0x55, 0x43, 0x49, + 0x66, 0x33, 0x4A, 0x52, 0x37, 0x56, 0x73, 0x6D, 0x41, 0x41, 0x37, 0x47, 0x38, 0x71, 0x4B, 0x43, 0x56, 0x75, 0x4B, 0x6A, 0x34, 0x59, 0x59, 0x78, 0x63, 0x6C, 0x50, 0x7A, 0x35, 0x45, 0x49, 0x42, 0x62, 0x32, 0x4A, 0x73, 0x67, 0x6C, 0x72, 0x67, + 0x56, 0x4B, 0x74, 0x4F, 0x64, 0x6A, 0x4C, 0x50, 0x4F, 0x4D, 0x46, 0x6C, 0x4E, 0x2B, 0x58, 0x50, 0x73, 0x52, 0x47, 0x67, 0x6A, 0x42, 0x52, 0x6D, 0x4B, 0x66, 0x0A, 0x49, 0x72, 0x6A, 0x78, 0x77, 0x6F, 0x31, 0x70, 0x33, 0x50, 0x6F, 0x36, 0x57, + 0x41, 0x62, 0x66, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x67, 0x62, 0x77, 0x77, 0x67, 0x62, 0x6B, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, + 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x47, 0x75, 0x33, 0x2B, 0x51, 0x54, 0x6D, 0x51, 0x0A, 0x74, 0x43, 0x52, 0x5A, 0x76, 0x67, 0x48, 0x79, 0x55, 0x74, 0x56, 0x46, 0x39, 0x6C, 0x6F, 0x35, + 0x33, 0x42, 0x45, 0x77, 0x5A, 0x41, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x46, 0x30, 0x77, 0x57, 0x34, 0x41, 0x55, 0x47, 0x75, 0x33, 0x2B, 0x51, 0x54, 0x6D, 0x51, 0x74, 0x43, 0x52, 0x5A, 0x76, 0x67, 0x48, 0x79, 0x55, 0x74, 0x56, 0x46, + 0x39, 0x6C, 0x6F, 0x35, 0x33, 0x42, 0x47, 0x68, 0x4F, 0x4B, 0x51, 0x32, 0x4D, 0x44, 0x51, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x5A, 0x53, 0x4D, 0x52, 0x49, 0x77, 0x45, 0x41, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x6C, 0x45, 0x61, 0x47, 0x6C, 0x74, 0x65, 0x57, 0x39, 0x30, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x43, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, + 0x70, 0x5A, 0x32, 0x35, 0x68, 0x67, 0x67, 0x6B, 0x41, 0x2F, 0x74, 0x7A, 0x6A, 0x41, 0x51, 0x2F, 0x4A, 0x0A, 0x53, 0x50, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, + 0x45, 0x47, 0x4D, 0x42, 0x45, 0x47, 0x43, 0x57, 0x43, 0x47, 0x53, 0x41, 0x47, 0x47, 0x2B, 0x45, 0x49, 0x42, 0x41, 0x51, 0x51, 0x45, 0x41, 0x77, 0x49, 0x41, 0x42, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, + 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x0A, 0x68, 0x51, 0x4D, 0x65, 0x6B, 0x6E, 0x48, 0x32, 0x51, 0x71, 0x2F, 0x68, 0x6F, 0x32, 0x47, 0x65, 0x36, 0x2F, 0x50, 0x41, 0x44, 0x2F, 0x4B, 0x6C, 0x31, + 0x4E, 0x71, 0x56, 0x35, 0x74, 0x61, 0x2B, 0x61, 0x44, 0x59, 0x39, 0x66, 0x6D, 0x34, 0x66, 0x54, 0x49, 0x72, 0x76, 0x30, 0x51, 0x38, 0x68, 0x62, 0x56, 0x36, 0x6C, 0x55, 0x6D, 0x50, 0x4F, 0x45, 0x76, 0x6A, 0x76, 0x4B, 0x74, 0x70, 0x76, 0x36, + 0x7A, 0x66, 0x2B, 0x45, 0x77, 0x4C, 0x48, 0x79, 0x7A, 0x73, 0x2B, 0x0A, 0x49, 0x6D, 0x76, 0x61, 0x59, 0x53, 0x35, 0x2F, 0x31, 0x48, 0x49, 0x39, 0x33, 0x54, 0x44, 0x68, 0x48, 0x6B, 0x78, 0x41, 0x47, 0x59, 0x77, 0x50, 0x31, 0x35, 0x7A, 0x52, + 0x67, 0x7A, 0x42, 0x37, 0x6D, 0x46, 0x6E, 0x63, 0x66, 0x63, 0x61, 0x35, 0x44, 0x43, 0x6C, 0x4D, 0x6F, 0x54, 0x4F, 0x69, 0x36, 0x32, 0x63, 0x36, 0x5A, 0x59, 0x54, 0x54, 0x6C, 0x75, 0x4C, 0x74, 0x64, 0x6B, 0x56, 0x77, 0x6A, 0x37, 0x55, 0x72, + 0x33, 0x76, 0x6B, 0x6A, 0x31, 0x6B, 0x6C, 0x75, 0x0A, 0x50, 0x42, 0x53, 0x31, 0x78, 0x70, 0x38, 0x31, 0x48, 0x6C, 0x44, 0x51, 0x77, 0x59, 0x39, 0x71, 0x63, 0x45, 0x51, 0x43, 0x59, 0x73, 0x75, 0x75, 0x48, 0x57, 0x68, 0x42, 0x70, 0x36, 0x70, + 0x58, 0x36, 0x46, 0x4F, 0x71, 0x42, 0x39, 0x49, 0x47, 0x39, 0x74, 0x55, 0x55, 0x42, 0x67, 0x75, 0x52, 0x41, 0x33, 0x55, 0x73, 0x62, 0x48, 0x4B, 0x31, 0x59, 0x5A, 0x57, 0x61, 0x44, 0x59, 0x75, 0x35, 0x44, 0x65, 0x66, 0x31, 0x33, 0x31, 0x54, + 0x4E, 0x33, 0x75, 0x62, 0x59, 0x0A, 0x31, 0x67, 0x6B, 0x49, 0x6C, 0x32, 0x50, 0x6C, 0x77, 0x53, 0x36, 0x77, 0x74, 0x30, 0x51, 0x6D, 0x77, 0x43, 0x62, 0x41, 0x72, 0x31, 0x55, 0x77, 0x6E, 0x6A, 0x76, 0x56, 0x4E, 0x69, 0x6F, 0x5A, 0x42, 0x50, + 0x52, 0x63, 0x48, 0x76, 0x2F, 0x50, 0x4C, 0x4C, 0x66, 0x2F, 0x30, 0x50, 0x32, 0x48, 0x51, 0x42, 0x48, 0x56, 0x45, 0x53, 0x4F, 0x37, 0x53, 0x4D, 0x41, 0x68, 0x71, 0x61, 0x51, 0x6F, 0x4C, 0x66, 0x30, 0x56, 0x2B, 0x4C, 0x42, 0x4F, 0x4B, 0x2F, + 0x51, 0x77, 0x0A, 0x57, 0x79, 0x48, 0x38, 0x45, 0x5A, 0x45, 0x30, 0x76, 0x6B, 0x48, 0x76, 0x65, 0x35, 0x32, 0x58, 0x64, 0x66, 0x2B, 0x58, 0x6C, 0x63, 0x43, 0x57, 0x57, 0x43, 0x2F, 0x71, 0x75, 0x30, 0x62, 0x58, 0x75, 0x2B, 0x54, 0x5A, 0x4C, + 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x65, 0x50, 0x4B, 0x49, 0x20, 0x52, 0x6F, 0x6F, 0x74, + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x73, 0x44, 0x43, 0x43, 0x41, 0x35, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x46, 0x63, 0x69, 0x39, 0x5A, 0x55, 0x64, 0x63, 0x72, 0x37, 0x69, 0x58, 0x41, + 0x46, 0x37, 0x6B, 0x42, 0x74, 0x4B, 0x38, 0x6E, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, 0x42, 0x65, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, + 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x55, 0x56, 0x7A, 0x45, 0x6A, 0x4D, 0x43, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x61, 0x51, 0x32, 0x68, 0x31, 0x62, 0x6D, 0x64, 0x6F, 0x64, 0x32, 0x45, 0x67, 0x56, 0x47, 0x56, 0x73, + 0x5A, 0x57, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x44, 0x62, 0x79, 0x34, 0x73, 0x49, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x4B, 0x6A, 0x41, 0x6F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x49, 0x57, 0x56, 0x51, 0x53, 0x30, 0x6B, 0x67, + 0x0A, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x41, + 0x65, 0x46, 0x77, 0x30, 0x77, 0x4E, 0x44, 0x45, 0x79, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x6A, 0x4D, 0x78, 0x4D, 0x6A, 0x64, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4E, 0x44, 0x45, 0x79, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x6A, 0x4D, 0x78, 0x0A, 0x4D, 0x6A, + 0x64, 0x61, 0x4D, 0x46, 0x34, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x52, 0x58, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x70, 0x44, 0x61, 0x48, + 0x56, 0x75, 0x5A, 0x32, 0x68, 0x33, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x78, 0x6C, 0x59, 0x32, 0x39, 0x74, 0x49, 0x45, 0x4E, 0x76, 0x4C, 0x69, 0x77, 0x67, 0x54, 0x48, 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x71, 0x0A, 0x4D, 0x43, 0x67, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x68, 0x5A, 0x56, 0x42, 0x4C, 0x53, 0x53, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, + 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x0A, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, + 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x34, 0x53, 0x55, 0x50, 0x37, 0x6F, 0x33, 0x62, 0x69, 0x44, 0x4E, 0x31, 0x5A, 0x38, 0x32, 0x74, 0x48, 0x33, 0x30, 0x36, 0x54, 0x6D, 0x32, 0x64, + 0x30, 0x79, 0x38, 0x55, 0x38, 0x32, 0x4E, 0x30, 0x79, 0x77, 0x45, 0x68, 0x61, 0x6A, 0x66, 0x71, 0x68, 0x46, 0x41, 0x48, 0x53, 0x79, 0x5A, 0x62, 0x43, 0x55, 0x4E, 0x73, 0x0A, 0x49, 0x5A, 0x35, 0x71, 0x79, 0x4E, 0x55, 0x44, 0x39, 0x57, 0x42, + 0x70, 0x6A, 0x38, 0x7A, 0x77, 0x49, 0x75, 0x51, 0x66, 0x35, 0x2F, 0x64, 0x71, 0x49, 0x6A, 0x47, 0x33, 0x4C, 0x42, 0x58, 0x79, 0x34, 0x50, 0x34, 0x41, 0x61, 0x6B, 0x50, 0x2F, 0x68, 0x32, 0x58, 0x47, 0x74, 0x52, 0x72, 0x42, 0x70, 0x30, 0x78, + 0x74, 0x49, 0x6E, 0x41, 0x68, 0x69, 0x6A, 0x48, 0x79, 0x6C, 0x33, 0x53, 0x4A, 0x43, 0x52, 0x49, 0x6D, 0x48, 0x4A, 0x37, 0x4B, 0x32, 0x52, 0x4B, 0x69, 0x0A, 0x6C, 0x54, 0x7A, 0x61, 0x36, 0x57, 0x65, 0x2F, 0x43, 0x4B, 0x42, 0x6B, 0x34, 0x39, + 0x5A, 0x43, 0x74, 0x30, 0x58, 0x76, 0x6C, 0x2F, 0x54, 0x32, 0x39, 0x64, 0x65, 0x31, 0x53, 0x68, 0x55, 0x43, 0x57, 0x48, 0x32, 0x59, 0x57, 0x45, 0x74, 0x67, 0x76, 0x4D, 0x33, 0x58, 0x44, 0x5A, 0x6F, 0x54, 0x4D, 0x31, 0x50, 0x52, 0x59, 0x66, + 0x6C, 0x36, 0x31, 0x64, 0x64, 0x34, 0x73, 0x35, 0x6F, 0x7A, 0x39, 0x77, 0x43, 0x47, 0x7A, 0x68, 0x31, 0x4E, 0x6C, 0x44, 0x69, 0x76, 0x0A, 0x71, 0x4F, 0x78, 0x34, 0x55, 0x58, 0x43, 0x4B, 0x58, 0x42, 0x43, 0x44, 0x55, 0x53, 0x48, 0x33, 0x45, + 0x54, 0x30, 0x30, 0x68, 0x6C, 0x37, 0x6C, 0x53, 0x4D, 0x32, 0x58, 0x67, 0x59, 0x49, 0x31, 0x54, 0x42, 0x6E, 0x73, 0x5A, 0x66, 0x5A, 0x72, 0x78, 0x51, 0x57, 0x68, 0x37, 0x6B, 0x63, 0x54, 0x31, 0x72, 0x4D, 0x68, 0x4A, 0x35, 0x51, 0x51, 0x43, + 0x74, 0x6B, 0x6B, 0x4F, 0x37, 0x71, 0x2B, 0x52, 0x42, 0x4E, 0x47, 0x4D, 0x44, 0x2B, 0x58, 0x50, 0x4E, 0x6A, 0x58, 0x0A, 0x31, 0x32, 0x72, 0x75, 0x4F, 0x7A, 0x6A, 0x6A, 0x4B, 0x39, 0x53, 0x58, 0x44, 0x72, 0x6B, 0x62, 0x35, 0x77, 0x64, 0x4A, + 0x66, 0x7A, 0x63, 0x71, 0x2B, 0x58, 0x64, 0x34, 0x7A, 0x31, 0x54, 0x74, 0x57, 0x30, 0x61, 0x64, 0x6F, 0x34, 0x41, 0x4F, 0x6B, 0x55, 0x50, 0x42, 0x31, 0x6C, 0x74, 0x66, 0x46, 0x4C, 0x71, 0x66, 0x70, 0x6F, 0x30, 0x6B, 0x52, 0x30, 0x42, 0x5A, + 0x76, 0x33, 0x49, 0x34, 0x73, 0x6A, 0x5A, 0x73, 0x4E, 0x2F, 0x2B, 0x5A, 0x30, 0x56, 0x30, 0x4F, 0x0A, 0x57, 0x51, 0x71, 0x72, 0x61, 0x66, 0x66, 0x41, 0x73, 0x67, 0x52, 0x46, 0x65, 0x6C, 0x51, 0x41, 0x72, 0x72, 0x35, 0x54, 0x39, 0x72, 0x58, + 0x6E, 0x34, 0x66, 0x67, 0x38, 0x6F, 0x7A, 0x48, 0x53, 0x71, 0x66, 0x34, 0x68, 0x55, 0x6D, 0x54, 0x46, 0x70, 0x6D, 0x66, 0x77, 0x64, 0x51, 0x63, 0x47, 0x6C, 0x42, 0x53, 0x42, 0x56, 0x63, 0x59, 0x6E, 0x35, 0x41, 0x47, 0x50, 0x46, 0x38, 0x46, + 0x71, 0x63, 0x64, 0x65, 0x2B, 0x53, 0x2F, 0x75, 0x55, 0x57, 0x48, 0x31, 0x2B, 0x0A, 0x45, 0x54, 0x4F, 0x78, 0x51, 0x76, 0x64, 0x69, 0x62, 0x42, 0x6A, 0x57, 0x7A, 0x77, 0x6C, 0x6F, 0x50, 0x6E, 0x39, 0x73, 0x39, 0x68, 0x36, 0x50, 0x59, 0x71, + 0x32, 0x6C, 0x59, 0x39, 0x73, 0x4A, 0x70, 0x78, 0x38, 0x69, 0x51, 0x6B, 0x45, 0x65, 0x62, 0x35, 0x6D, 0x4B, 0x50, 0x74, 0x66, 0x35, 0x50, 0x30, 0x42, 0x36, 0x65, 0x62, 0x43, 0x6C, 0x41, 0x5A, 0x4C, 0x53, 0x6E, 0x54, 0x30, 0x49, 0x46, 0x61, + 0x55, 0x51, 0x41, 0x53, 0x32, 0x7A, 0x4D, 0x6E, 0x61, 0x6F, 0x0A, 0x6C, 0x51, 0x32, 0x7A, 0x65, 0x70, 0x72, 0x37, 0x42, 0x78, 0x42, 0x34, 0x45, 0x57, 0x2F, 0x68, 0x6A, 0x38, 0x65, 0x36, 0x44, 0x79, 0x55, 0x61, 0x64, 0x43, 0x72, 0x6C, 0x48, + 0x4A, 0x68, 0x42, 0x6D, 0x64, 0x38, 0x68, 0x68, 0x2B, 0x69, 0x56, 0x42, 0x6D, 0x6F, 0x4B, 0x73, 0x32, 0x70, 0x48, 0x64, 0x6D, 0x58, 0x32, 0x4F, 0x73, 0x2B, 0x50, 0x59, 0x68, 0x63, 0x5A, 0x65, 0x77, 0x6F, 0x6F, 0x7A, 0x52, 0x72, 0x53, 0x67, + 0x78, 0x34, 0x68, 0x78, 0x79, 0x79, 0x2F, 0x0A, 0x76, 0x76, 0x39, 0x68, 0x61, 0x4C, 0x64, 0x6E, 0x47, 0x37, 0x74, 0x34, 0x54, 0x59, 0x33, 0x4F, 0x5A, 0x2B, 0x58, 0x6B, 0x77, 0x59, 0x36, 0x33, 0x49, 0x32, 0x62, 0x69, 0x6E, 0x5A, 0x42, 0x31, + 0x4E, 0x4A, 0x69, 0x70, 0x4E, 0x69, 0x75, 0x4B, 0x6D, 0x70, 0x53, 0x35, 0x6E, 0x65, 0x7A, 0x4D, 0x69, 0x72, 0x48, 0x34, 0x4A, 0x59, 0x6C, 0x63, 0x57, 0x72, 0x59, 0x76, 0x6A, 0x42, 0x39, 0x74, 0x65, 0x53, 0x53, 0x6E, 0x55, 0x6D, 0x6A, 0x44, + 0x68, 0x44, 0x58, 0x69, 0x0A, 0x5A, 0x6F, 0x31, 0x6A, 0x44, 0x69, 0x56, 0x4E, 0x31, 0x52, 0x6D, 0x79, 0x35, 0x6E, 0x6B, 0x33, 0x70, 0x79, 0x4B, 0x64, 0x56, 0x44, 0x45, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x71, 0x4D, 0x47, 0x67, + 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x42, 0x34, 0x4D, 0x39, 0x37, 0x5A, 0x6E, 0x38, 0x75, 0x47, 0x53, 0x4A, 0x67, 0x6C, 0x46, 0x77, 0x46, 0x55, 0x35, 0x4C, 0x6E, 0x63, 0x2F, 0x51, 0x6B, 0x71, + 0x69, 0x0A, 0x4D, 0x41, 0x77, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x4F, 0x51, 0x59, 0x45, 0x5A, 0x79, 0x6F, 0x48, 0x41, 0x41, 0x51, 0x78, 0x4D, 0x43, 0x38, 0x77, 0x4C, 0x51, + 0x49, 0x42, 0x41, 0x44, 0x41, 0x4A, 0x42, 0x67, 0x55, 0x72, 0x44, 0x67, 0x4D, 0x43, 0x47, 0x67, 0x55, 0x41, 0x4D, 0x41, 0x63, 0x47, 0x42, 0x57, 0x63, 0x71, 0x41, 0x77, 0x41, 0x41, 0x42, 0x42, 0x52, 0x46, 0x73, 0x4D, 0x4C, 0x48, 0x0A, 0x43, + 0x6C, 0x5A, 0x38, 0x37, 0x6C, 0x74, 0x34, 0x44, 0x4A, 0x58, 0x35, 0x47, 0x46, 0x50, 0x42, 0x70, 0x68, 0x7A, 0x59, 0x45, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, + 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x43, 0x62, 0x4F, 0x44, 0x55, 0x31, 0x6B, 0x42, 0x50, 0x70, 0x56, 0x4A, 0x75, 0x66, 0x47, 0x42, 0x75, 0x76, 0x6C, 0x32, 0x49, 0x43, 0x4F, 0x31, 0x4A, 0x32, 0x42, 0x30, 0x0A, 0x31, 0x47, 0x71, 0x5A, + 0x4E, 0x46, 0x35, 0x73, 0x41, 0x46, 0x50, 0x5A, 0x6E, 0x2F, 0x4B, 0x6D, 0x73, 0x53, 0x51, 0x48, 0x52, 0x47, 0x6F, 0x71, 0x78, 0x71, 0x57, 0x4F, 0x65, 0x42, 0x4C, 0x6F, 0x52, 0x39, 0x6C, 0x59, 0x47, 0x78, 0x4D, 0x71, 0x58, 0x6E, 0x6D, 0x62, + 0x6E, 0x77, 0x6F, 0x71, 0x5A, 0x36, 0x59, 0x6C, 0x50, 0x77, 0x5A, 0x70, 0x56, 0x6E, 0x50, 0x44, 0x69, 0x6D, 0x5A, 0x49, 0x2B, 0x79, 0x6D, 0x42, 0x56, 0x33, 0x51, 0x47, 0x79, 0x70, 0x7A, 0x71, 0x0A, 0x4B, 0x4F, 0x67, 0x34, 0x5A, 0x79, 0x59, + 0x72, 0x38, 0x64, 0x57, 0x31, 0x50, 0x32, 0x57, 0x54, 0x2B, 0x44, 0x5A, 0x64, 0x6A, 0x6F, 0x32, 0x4E, 0x51, 0x43, 0x43, 0x48, 0x47, 0x65, 0x72, 0x76, 0x4A, 0x38, 0x41, 0x39, 0x74, 0x44, 0x6B, 0x50, 0x4A, 0x58, 0x74, 0x6F, 0x55, 0x48, 0x52, + 0x56, 0x6E, 0x41, 0x78, 0x5A, 0x66, 0x56, 0x6F, 0x39, 0x51, 0x5A, 0x51, 0x6C, 0x55, 0x67, 0x6A, 0x67, 0x52, 0x79, 0x77, 0x56, 0x4D, 0x52, 0x6E, 0x56, 0x76, 0x77, 0x64, 0x56, 0x0A, 0x78, 0x72, 0x73, 0x53, 0x74, 0x5A, 0x66, 0x30, 0x58, 0x34, + 0x4F, 0x46, 0x75, 0x6E, 0x48, 0x42, 0x32, 0x57, 0x79, 0x42, 0x45, 0x58, 0x59, 0x4B, 0x43, 0x72, 0x43, 0x2F, 0x67, 0x70, 0x66, 0x33, 0x36, 0x6A, 0x33, 0x36, 0x2B, 0x75, 0x77, 0x74, 0x71, 0x53, 0x69, 0x55, 0x4F, 0x31, 0x62, 0x64, 0x30, 0x6C, + 0x45, 0x75, 0x72, 0x73, 0x43, 0x39, 0x43, 0x42, 0x57, 0x4D, 0x64, 0x31, 0x49, 0x30, 0x6C, 0x74, 0x61, 0x62, 0x72, 0x4E, 0x4D, 0x64, 0x6A, 0x6D, 0x45, 0x50, 0x0A, 0x4E, 0x58, 0x75, 0x62, 0x72, 0x6A, 0x6C, 0x70, 0x43, 0x32, 0x4A, 0x67, 0x51, + 0x43, 0x41, 0x32, 0x6A, 0x36, 0x2F, 0x37, 0x4E, 0x75, 0x34, 0x74, 0x43, 0x45, 0x6F, 0x64, 0x75, 0x4C, 0x2B, 0x62, 0x58, 0x50, 0x6A, 0x71, 0x70, 0x52, 0x75, 0x67, 0x63, 0x36, 0x62, 0x59, 0x2B, 0x47, 0x37, 0x67, 0x4D, 0x77, 0x52, 0x66, 0x61, + 0x4B, 0x6F, 0x6E, 0x68, 0x2B, 0x33, 0x5A, 0x77, 0x5A, 0x43, 0x63, 0x37, 0x62, 0x33, 0x6A, 0x61, 0x6A, 0x57, 0x76, 0x59, 0x39, 0x2B, 0x72, 0x0A, 0x47, 0x4E, 0x6D, 0x36, 0x35, 0x75, 0x6C, 0x4B, 0x36, 0x6C, 0x43, 0x4B, 0x44, 0x32, 0x47, 0x54, + 0x48, 0x75, 0x49, 0x74, 0x47, 0x65, 0x49, 0x77, 0x6C, 0x44, 0x57, 0x53, 0x58, 0x51, 0x36, 0x32, 0x42, 0x36, 0x38, 0x5A, 0x67, 0x49, 0x39, 0x48, 0x6B, 0x46, 0x46, 0x4C, 0x4C, 0x6B, 0x33, 0x64, 0x68, 0x65, 0x4C, 0x53, 0x43, 0x6C, 0x49, 0x4B, + 0x46, 0x35, 0x72, 0x38, 0x47, 0x72, 0x42, 0x51, 0x41, 0x75, 0x55, 0x42, 0x6F, 0x32, 0x4D, 0x33, 0x49, 0x55, 0x78, 0x45, 0x0A, 0x78, 0x4A, 0x74, 0x52, 0x6D, 0x52, 0x45, 0x4F, 0x63, 0x35, 0x77, 0x47, 0x6A, 0x31, 0x51, 0x75, 0x70, 0x79, 0x68, + 0x65, 0x52, 0x44, 0x6D, 0x48, 0x56, 0x69, 0x30, 0x33, 0x76, 0x59, 0x56, 0x45, 0x6C, 0x4F, 0x45, 0x4D, 0x53, 0x79, 0x79, 0x63, 0x77, 0x35, 0x4B, 0x46, 0x4E, 0x47, 0x48, 0x4C, 0x44, 0x37, 0x69, 0x62, 0x53, 0x6B, 0x4E, 0x53, 0x2F, 0x6A, 0x51, + 0x36, 0x66, 0x62, 0x6A, 0x70, 0x4B, 0x64, 0x78, 0x32, 0x71, 0x63, 0x67, 0x77, 0x2B, 0x42, 0x52, 0x78, 0x0A, 0x67, 0x4D, 0x59, 0x65, 0x4E, 0x6B, 0x68, 0x30, 0x49, 0x6B, 0x46, 0x63, 0x68, 0x34, 0x4C, 0x6F, 0x47, 0x48, 0x47, 0x4C, 0x51, 0x59, + 0x6C, 0x45, 0x35, 0x33, 0x35, 0x59, 0x57, 0x36, 0x69, 0x34, 0x6A, 0x52, 0x50, 0x70, 0x70, 0x32, 0x7A, 0x44, 0x52, 0x2B, 0x32, 0x7A, 0x47, 0x70, 0x31, 0x69, 0x72, 0x6F, 0x32, 0x43, 0x36, 0x70, 0x53, 0x65, 0x33, 0x56, 0x6B, 0x51, 0x77, 0x36, + 0x33, 0x64, 0x34, 0x6B, 0x33, 0x6A, 0x4D, 0x64, 0x58, 0x48, 0x37, 0x4F, 0x6A, 0x79, 0x0A, 0x73, 0x50, 0x36, 0x53, 0x48, 0x68, 0x59, 0x4B, 0x47, 0x76, 0x7A, 0x5A, 0x38, 0x2F, 0x67, 0x6E, 0x74, 0x73, 0x6D, 0x2B, 0x48, 0x62, 0x52, 0x73, 0x5A, + 0x4A, 0x42, 0x2F, 0x39, 0x4F, 0x54, 0x45, 0x57, 0x39, 0x63, 0x33, 0x72, 0x6B, 0x49, 0x4F, 0x33, 0x61, 0x51, 0x61, 0x62, 0x33, 0x79, 0x49, 0x56, 0x4D, 0x55, 0x57, 0x62, 0x75, 0x46, 0x36, 0x61, 0x43, 0x37, 0x34, 0x4F, 0x72, 0x38, 0x4E, 0x70, + 0x44, 0x79, 0x4A, 0x4F, 0x33, 0x69, 0x6E, 0x54, 0x6D, 0x4F, 0x44, 0x0A, 0x42, 0x43, 0x45, 0x49, 0x5A, 0x34, 0x33, 0x79, 0x67, 0x6B, 0x6E, 0x51, 0x57, 0x2F, 0x32, 0x78, 0x7A, 0x51, 0x2B, 0x44, 0x68, 0x4E, 0x51, 0x2B, 0x49, 0x49, 0x58, 0x33, + 0x53, 0x6A, 0x30, 0x72, 0x6E, 0x50, 0x30, 0x71, 0x43, 0x67, 0x6C, 0x4E, 0x36, 0x6F, 0x48, 0x34, 0x45, 0x5A, 0x77, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4E, 0x20, 0x52, 0x4F, 0x4F, 0x54, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x4F, 0x44, 0x43, 0x43, 0x41, 0x69, + 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x47, 0x49, 0x41, 0x59, 0x46, 0x46, 0x6E, 0x41, 0x43, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x4D, 0x44, + 0x73, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x4A, 0x50, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x68, 0x6A, 0x5A, 0x58, 0x4A, 0x30, 0x55, + 0x30, 0x6C, 0x48, 0x54, 0x6A, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x51, 0x59, 0x32, 0x56, 0x79, 0x64, 0x46, 0x4E, 0x4A, 0x52, 0x30, 0x34, 0x67, 0x55, 0x6B, 0x39, 0x50, 0x56, 0x43, 0x42, 0x44, 0x51, + 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4E, 0x6A, 0x41, 0x33, 0x4D, 0x44, 0x51, 0x78, 0x4E, 0x7A, 0x49, 0x77, 0x4D, 0x44, 0x52, 0x61, 0x0A, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x54, 0x41, 0x33, 0x4D, 0x44, 0x51, 0x78, 0x4E, 0x7A, 0x49, 0x77, + 0x4D, 0x44, 0x52, 0x61, 0x4D, 0x44, 0x73, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x4A, 0x50, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x68, 0x6A, + 0x5A, 0x58, 0x4A, 0x30, 0x55, 0x30, 0x6C, 0x48, 0x54, 0x6A, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x78, 0x4D, 0x51, 0x59, 0x32, 0x56, 0x79, 0x64, 0x46, 0x4E, 0x4A, 0x52, 0x30, 0x34, 0x67, 0x55, 0x6B, 0x39, + 0x50, 0x56, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, + 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4C, 0x63, 0x7A, 0x75, 0x58, 0x37, 0x49, 0x0A, 0x4A, 0x55, 0x71, 0x4F, 0x74, 0x64, 0x75, 0x30, 0x4B, 0x42, 0x75, 0x71, 0x56, 0x35, 0x44, 0x6F, 0x30, 0x53, 0x4C, 0x54, 0x5A, 0x4C, + 0x72, 0x54, 0x6B, 0x2B, 0x6A, 0x55, 0x72, 0x49, 0x5A, 0x68, 0x51, 0x47, 0x70, 0x67, 0x56, 0x32, 0x68, 0x55, 0x68, 0x45, 0x32, 0x38, 0x61, 0x6C, 0x51, 0x43, 0x42, 0x66, 0x2F, 0x66, 0x6D, 0x35, 0x6F, 0x71, 0x72, 0x6C, 0x30, 0x48, 0x6A, 0x30, + 0x72, 0x44, 0x4B, 0x48, 0x2F, 0x76, 0x2B, 0x79, 0x76, 0x36, 0x65, 0x66, 0x48, 0x48, 0x0A, 0x72, 0x66, 0x41, 0x51, 0x55, 0x79, 0x53, 0x51, 0x69, 0x32, 0x62, 0x4A, 0x71, 0x49, 0x69, 0x72, 0x72, 0x31, 0x71, 0x6A, 0x41, 0x4F, 0x6D, 0x2B, 0x75, + 0x6B, 0x62, 0x75, 0x57, 0x33, 0x4E, 0x37, 0x4C, 0x42, 0x65, 0x43, 0x67, 0x56, 0x35, 0x69, 0x4C, 0x4B, 0x45, 0x43, 0x5A, 0x62, 0x4F, 0x39, 0x78, 0x53, 0x73, 0x41, 0x66, 0x73, 0x54, 0x38, 0x41, 0x7A, 0x4E, 0x58, 0x44, 0x65, 0x33, 0x69, 0x2B, + 0x73, 0x35, 0x64, 0x52, 0x64, 0x59, 0x34, 0x7A, 0x54, 0x57, 0x32, 0x0A, 0x73, 0x73, 0x48, 0x51, 0x6E, 0x49, 0x46, 0x4B, 0x71, 0x75, 0x53, 0x79, 0x41, 0x56, 0x77, 0x64, 0x6A, 0x31, 0x2B, 0x5A, 0x78, 0x4C, 0x47, 0x74, 0x32, 0x34, 0x67, 0x68, + 0x36, 0x35, 0x41, 0x49, 0x67, 0x6F, 0x44, 0x7A, 0x4D, 0x4B, 0x4E, 0x44, 0x35, 0x70, 0x43, 0x43, 0x72, 0x6C, 0x55, 0x6F, 0x53, 0x65, 0x31, 0x62, 0x31, 0x36, 0x6B, 0x51, 0x4F, 0x41, 0x37, 0x2B, 0x6A, 0x30, 0x78, 0x62, 0x6D, 0x30, 0x62, 0x71, + 0x51, 0x66, 0x57, 0x77, 0x43, 0x48, 0x54, 0x44, 0x0A, 0x30, 0x49, 0x67, 0x7A, 0x74, 0x6E, 0x7A, 0x58, 0x64, 0x4E, 0x2F, 0x63, 0x68, 0x4E, 0x46, 0x44, 0x44, 0x6E, 0x55, 0x35, 0x6F, 0x53, 0x56, 0x41, 0x4B, 0x4F, 0x70, 0x34, 0x79, 0x77, 0x34, + 0x73, 0x4C, 0x6A, 0x6D, 0x64, 0x6A, 0x49, 0x74, 0x75, 0x46, 0x68, 0x77, 0x76, 0x4A, 0x6F, 0x49, 0x51, 0x34, 0x75, 0x4E, 0x6C, 0x6C, 0x41, 0x6F, 0x45, 0x77, 0x46, 0x37, 0x33, 0x58, 0x56, 0x76, 0x34, 0x45, 0x4F, 0x4C, 0x51, 0x75, 0x6E, 0x70, + 0x4C, 0x2B, 0x39, 0x34, 0x33, 0x0A, 0x41, 0x41, 0x41, 0x61, 0x57, 0x79, 0x6A, 0x6A, 0x30, 0x70, 0x78, 0x7A, 0x50, 0x6A, 0x4B, 0x48, 0x6D, 0x4B, 0x48, 0x4A, 0x55, 0x53, 0x2F, 0x58, 0x33, 0x71, 0x77, 0x7A, 0x73, 0x30, 0x38, 0x43, 0x41, 0x77, + 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, + 0x38, 0x42, 0x0A, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x63, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4F, 0x43, 0x4D, 0x6D, 0x39, 0x73, 0x6C, 0x53, 0x62, 0x50, 0x78, 0x66, + 0x49, 0x62, 0x57, 0x73, 0x6B, 0x4B, 0x48, 0x43, 0x39, 0x42, 0x72, 0x6F, 0x4E, 0x6E, 0x6B, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x0A, + 0x41, 0x51, 0x41, 0x2B, 0x30, 0x68, 0x79, 0x4A, 0x4C, 0x6A, 0x58, 0x38, 0x2B, 0x48, 0x58, 0x64, 0x35, 0x6E, 0x39, 0x6C, 0x69, 0x50, 0x52, 0x79, 0x54, 0x4D, 0x6B, 0x73, 0x31, 0x7A, 0x4A, 0x4F, 0x38, 0x39, 0x30, 0x5A, 0x65, 0x55, 0x65, 0x39, + 0x6A, 0x6A, 0x74, 0x62, 0x6B, 0x77, 0x39, 0x51, 0x53, 0x53, 0x51, 0x54, 0x61, 0x78, 0x51, 0x47, 0x63, 0x75, 0x38, 0x4A, 0x30, 0x36, 0x47, 0x68, 0x34, 0x30, 0x43, 0x45, 0x79, 0x65, 0x63, 0x59, 0x4D, 0x6E, 0x51, 0x38, 0x0A, 0x53, 0x47, 0x34, + 0x50, 0x6E, 0x30, 0x76, 0x55, 0x39, 0x78, 0x37, 0x54, 0x6B, 0x34, 0x5A, 0x6B, 0x56, 0x4A, 0x64, 0x6A, 0x63, 0x6C, 0x44, 0x56, 0x56, 0x63, 0x2F, 0x36, 0x49, 0x4A, 0x4D, 0x43, 0x6F, 0x70, 0x76, 0x44, 0x49, 0x35, 0x4E, 0x4F, 0x46, 0x6C, 0x56, + 0x32, 0x6F, 0x48, 0x42, 0x35, 0x62, 0x63, 0x30, 0x68, 0x48, 0x38, 0x38, 0x76, 0x4C, 0x62, 0x77, 0x5A, 0x34, 0x34, 0x67, 0x78, 0x2B, 0x46, 0x6B, 0x61, 0x67, 0x51, 0x6E, 0x49, 0x6C, 0x36, 0x5A, 0x30, 0x0A, 0x78, 0x32, 0x44, 0x45, 0x57, 0x38, + 0x78, 0x58, 0x6A, 0x72, 0x4A, 0x31, 0x2F, 0x52, 0x73, 0x43, 0x43, 0x64, 0x74, 0x5A, 0x62, 0x33, 0x4B, 0x54, 0x61, 0x66, 0x63, 0x78, 0x51, 0x64, 0x61, 0x49, 0x4F, 0x4C, 0x2B, 0x48, 0x73, 0x72, 0x30, 0x57, 0x65, 0x66, 0x6D, 0x71, 0x35, 0x4C, + 0x36, 0x49, 0x4A, 0x64, 0x31, 0x68, 0x4A, 0x79, 0x4D, 0x63, 0x74, 0x54, 0x45, 0x48, 0x42, 0x44, 0x61, 0x30, 0x47, 0x70, 0x43, 0x39, 0x6F, 0x48, 0x52, 0x78, 0x55, 0x49, 0x6C, 0x74, 0x0A, 0x76, 0x42, 0x54, 0x6A, 0x44, 0x34, 0x61, 0x75, 0x38, + 0x61, 0x73, 0x2B, 0x78, 0x36, 0x41, 0x4A, 0x7A, 0x4B, 0x4E, 0x49, 0x30, 0x65, 0x44, 0x62, 0x5A, 0x4F, 0x65, 0x53, 0x74, 0x63, 0x2B, 0x76, 0x63, 0x6B, 0x4E, 0x77, 0x69, 0x2F, 0x6E, 0x44, 0x68, 0x44, 0x77, 0x54, 0x71, 0x6E, 0x36, 0x53, 0x6D, + 0x31, 0x64, 0x54, 0x6B, 0x2F, 0x70, 0x77, 0x77, 0x70, 0x45, 0x4F, 0x4D, 0x66, 0x6D, 0x62, 0x5A, 0x31, 0x33, 0x70, 0x6C, 0x6A, 0x68, 0x65, 0x58, 0x37, 0x4E, 0x7A, 0x0A, 0x54, 0x6F, 0x67, 0x56, 0x5A, 0x39, 0x36, 0x65, 0x64, 0x68, 0x42, 0x69, + 0x49, 0x4C, 0x35, 0x56, 0x61, 0x5A, 0x56, 0x44, 0x41, 0x44, 0x6C, 0x4E, 0x39, 0x75, 0x36, 0x77, 0x57, 0x6B, 0x35, 0x4A, 0x52, 0x46, 0x52, 0x59, 0x58, 0x30, 0x4B, 0x44, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4E, 0x65, 0x74, 0x4C, 0x6F, 0x63, 0x6B, 0x20, 0x41, 0x72, 0x61, 0x6E, 0x79, 0x20, 0x28, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x47, 0x6F, 0x6C, + 0x64, 0x29, 0x20, 0x46, 0xC5, 0x91, 0x74, 0x61, 0x6E, 0xC3, 0xBA, 0x73, 0xC3, 0xAD, 0x74, 0x76, 0xC3, 0xA1, 0x6E, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x46, 0x54, 0x43, 0x43, 0x41, 0x76, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x47, 0x53, 0x55, 0x45, 0x73, 0x35, 0x41, 0x41, 0x51, 0x4D, 0x41, + 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x49, 0x47, 0x6E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x49, 0x56, 0x54, + 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x77, 0x77, 0x49, 0x51, 0x6E, 0x56, 0x6B, 0x59, 0x58, 0x42, 0x6C, 0x63, 0x33, 0x51, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, + 0x45, 0x35, 0x6C, 0x64, 0x45, 0x78, 0x76, 0x59, 0x32, 0x73, 0x67, 0x53, 0x32, 0x5A, 0x30, 0x4C, 0x6A, 0x45, 0x33, 0x4D, 0x44, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x75, 0x56, 0x47, 0x46, 0x75, 0x77, 0x37, 0x70, 0x7A, 0x77, + 0x36, 0x31, 0x30, 0x0A, 0x64, 0x73, 0x4F, 0x68, 0x62, 0x6E, 0x6C, 0x72, 0x61, 0x57, 0x46, 0x6B, 0x77, 0x37, 0x4E, 0x72, 0x49, 0x43, 0x68, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, + 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x4B, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x73, 0x54, 0x6D, 0x56, 0x30, 0x54, 0x47, 0x39, 0x6A, 0x61, 0x79, 0x42, 0x42, + 0x0A, 0x63, 0x6D, 0x46, 0x75, 0x65, 0x53, 0x41, 0x6F, 0x51, 0x32, 0x78, 0x68, 0x63, 0x33, 0x4D, 0x67, 0x52, 0x32, 0x39, 0x73, 0x5A, 0x43, 0x6B, 0x67, 0x52, 0x73, 0x57, 0x52, 0x64, 0x47, 0x46, 0x75, 0x77, 0x37, 0x70, 0x7A, 0x77, 0x36, 0x31, + 0x30, 0x64, 0x73, 0x4F, 0x68, 0x62, 0x6E, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x78, 0x4D, 0x6A, 0x45, 0x78, 0x4D, 0x54, 0x55, 0x77, 0x4F, 0x44, 0x49, 0x78, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x67, 0x78, 0x0A, 0x4D, 0x6A, + 0x41, 0x32, 0x4D, 0x54, 0x55, 0x77, 0x4F, 0x44, 0x49, 0x78, 0x57, 0x6A, 0x43, 0x42, 0x70, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x46, 0x55, 0x78, 0x45, 0x54, 0x41, 0x50, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x43, 0x45, 0x4A, 0x31, 0x5A, 0x47, 0x46, 0x77, 0x5A, 0x58, 0x4E, 0x30, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x78, 0x4F, 0x0A, 0x5A, 0x58, 0x52, 0x4D, 0x62, + 0x32, 0x4E, 0x72, 0x49, 0x45, 0x74, 0x6D, 0x64, 0x43, 0x34, 0x78, 0x4E, 0x7A, 0x41, 0x31, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x4C, 0x6C, 0x52, 0x68, 0x62, 0x73, 0x4F, 0x36, 0x63, 0x38, 0x4F, 0x74, 0x64, 0x48, 0x62, 0x44, 0x6F, + 0x57, 0x35, 0x35, 0x61, 0x32, 0x6C, 0x68, 0x5A, 0x4D, 0x4F, 0x7A, 0x61, 0x79, 0x41, 0x6F, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x54, 0x5A, 0x58, 0x4A, 0x32, + 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x79, 0x6B, 0x78, 0x4E, 0x54, 0x41, 0x7A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4C, 0x45, 0x35, 0x6C, 0x64, 0x45, 0x78, 0x76, 0x59, 0x32, 0x73, 0x67, 0x51, 0x58, 0x4A, 0x68, 0x62, 0x6E, 0x6B, 0x67, + 0x4B, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x45, 0x64, 0x76, 0x62, 0x47, 0x51, 0x70, 0x49, 0x45, 0x62, 0x46, 0x6B, 0x58, 0x52, 0x68, 0x62, 0x73, 0x4F, 0x36, 0x0A, 0x63, 0x38, 0x4F, 0x74, 0x64, 0x48, 0x62, 0x44, 0x6F, 0x57, 0x35, + 0x35, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, + 0x43, 0x41, 0x51, 0x45, 0x41, 0x78, 0x43, 0x52, 0x65, 0x63, 0x37, 0x35, 0x4C, 0x62, 0x52, 0x54, 0x44, 0x6F, 0x66, 0x54, 0x6A, 0x6C, 0x35, 0x42, 0x75, 0x0A, 0x30, 0x6A, 0x42, 0x46, 0x48, 0x6A, 0x7A, 0x75, 0x5A, 0x39, 0x6C, 0x6B, 0x34, 0x42, + 0x71, 0x4B, 0x66, 0x38, 0x6F, 0x77, 0x79, 0x6F, 0x50, 0x6A, 0x49, 0x4D, 0x48, 0x6A, 0x39, 0x44, 0x72, 0x54, 0x6C, 0x46, 0x38, 0x61, 0x66, 0x46, 0x74, 0x74, 0x76, 0x7A, 0x42, 0x50, 0x68, 0x43, 0x66, 0x32, 0x6E, 0x78, 0x39, 0x4A, 0x76, 0x4D, + 0x61, 0x5A, 0x43, 0x70, 0x44, 0x79, 0x44, 0x2F, 0x56, 0x2F, 0x51, 0x34, 0x51, 0x33, 0x59, 0x31, 0x47, 0x4C, 0x65, 0x71, 0x56, 0x77, 0x0A, 0x2F, 0x48, 0x70, 0x59, 0x7A, 0x59, 0x36, 0x62, 0x37, 0x63, 0x4E, 0x47, 0x62, 0x49, 0x52, 0x77, 0x58, + 0x64, 0x72, 0x7A, 0x41, 0x5A, 0x41, 0x6A, 0x2F, 0x45, 0x34, 0x77, 0x71, 0x58, 0x37, 0x68, 0x4A, 0x32, 0x50, 0x6E, 0x37, 0x57, 0x51, 0x38, 0x6F, 0x4C, 0x6A, 0x4A, 0x4D, 0x32, 0x50, 0x2B, 0x46, 0x70, 0x44, 0x2F, 0x73, 0x4C, 0x6A, 0x39, 0x31, + 0x36, 0x6A, 0x41, 0x77, 0x4A, 0x52, 0x44, 0x43, 0x37, 0x62, 0x56, 0x57, 0x61, 0x61, 0x65, 0x56, 0x74, 0x41, 0x6B, 0x0A, 0x48, 0x33, 0x42, 0x35, 0x72, 0x39, 0x73, 0x35, 0x56, 0x41, 0x31, 0x6C, 0x64, 0x64, 0x6B, 0x56, 0x51, 0x5A, 0x51, 0x42, + 0x72, 0x31, 0x37, 0x73, 0x39, 0x6F, 0x33, 0x78, 0x2F, 0x36, 0x31, 0x6B, 0x2F, 0x69, 0x43, 0x61, 0x31, 0x31, 0x7A, 0x72, 0x2F, 0x71, 0x59, 0x66, 0x43, 0x47, 0x53, 0x6A, 0x69, 0x33, 0x5A, 0x56, 0x72, 0x52, 0x34, 0x37, 0x4B, 0x47, 0x41, 0x75, + 0x68, 0x79, 0x58, 0x6F, 0x71, 0x71, 0x38, 0x66, 0x78, 0x6D, 0x52, 0x47, 0x49, 0x4C, 0x64, 0x77, 0x0A, 0x66, 0x7A, 0x7A, 0x65, 0x53, 0x4E, 0x75, 0x57, 0x55, 0x37, 0x63, 0x35, 0x64, 0x2B, 0x51, 0x61, 0x34, 0x73, 0x63, 0x57, 0x68, 0x48, 0x61, + 0x58, 0x57, 0x79, 0x2B, 0x37, 0x47, 0x52, 0x57, 0x46, 0x2B, 0x47, 0x6D, 0x46, 0x39, 0x5A, 0x6D, 0x6E, 0x71, 0x66, 0x49, 0x30, 0x70, 0x36, 0x6D, 0x32, 0x70, 0x67, 0x50, 0x38, 0x62, 0x34, 0x59, 0x39, 0x56, 0x48, 0x78, 0x32, 0x42, 0x4A, 0x74, + 0x72, 0x2B, 0x55, 0x42, 0x64, 0x41, 0x44, 0x54, 0x48, 0x4C, 0x70, 0x6C, 0x31, 0x0A, 0x6E, 0x65, 0x57, 0x49, 0x41, 0x36, 0x70, 0x4E, 0x2B, 0x41, 0x50, 0x53, 0x51, 0x6E, 0x62, 0x41, 0x47, 0x77, 0x49, 0x44, 0x41, 0x4B, 0x69, 0x4C, 0x6F, 0x30, + 0x55, 0x77, 0x51, 0x7A, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x43, 0x44, 0x41, 0x47, 0x41, 0x51, 0x48, 0x2F, 0x41, 0x67, 0x45, 0x45, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, + 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x0A, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x7A, 0x50, 0x70, 0x6E, 0x6B, 0x2F, 0x43, 0x32, 0x75, 0x4E, 0x43, 0x6C, 0x77, + 0x42, 0x37, 0x7A, 0x55, 0x2F, 0x32, 0x4D, 0x55, 0x39, 0x2B, 0x44, 0x31, 0x35, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, + 0x4B, 0x74, 0x2F, 0x37, 0x68, 0x77, 0x57, 0x0A, 0x71, 0x5A, 0x77, 0x38, 0x55, 0x51, 0x43, 0x67, 0x77, 0x42, 0x45, 0x49, 0x42, 0x61, 0x65, 0x5A, 0x35, 0x6D, 0x38, 0x42, 0x69, 0x46, 0x52, 0x68, 0x62, 0x76, 0x47, 0x35, 0x47, 0x4B, 0x31, 0x4B, + 0x72, 0x66, 0x36, 0x42, 0x51, 0x43, 0x4F, 0x55, 0x4C, 0x2F, 0x74, 0x31, 0x66, 0x43, 0x38, 0x6F, 0x53, 0x32, 0x49, 0x6B, 0x67, 0x59, 0x49, 0x4C, 0x39, 0x57, 0x48, 0x78, 0x48, 0x47, 0x36, 0x34, 0x59, 0x54, 0x6A, 0x72, 0x67, 0x66, 0x70, 0x69, + 0x6F, 0x54, 0x74, 0x61, 0x0A, 0x59, 0x74, 0x4F, 0x55, 0x5A, 0x63, 0x54, 0x68, 0x35, 0x6D, 0x32, 0x43, 0x2B, 0x43, 0x38, 0x6C, 0x63, 0x4C, 0x49, 0x68, 0x4A, 0x73, 0x46, 0x79, 0x55, 0x52, 0x2B, 0x4D, 0x4C, 0x4D, 0x4F, 0x45, 0x6B, 0x4D, 0x4E, + 0x61, 0x6A, 0x37, 0x72, 0x50, 0x39, 0x4B, 0x64, 0x6C, 0x70, 0x65, 0x75, 0x59, 0x30, 0x66, 0x73, 0x46, 0x73, 0x6B, 0x5A, 0x31, 0x46, 0x53, 0x4E, 0x71, 0x62, 0x34, 0x56, 0x6A, 0x4D, 0x49, 0x44, 0x77, 0x31, 0x5A, 0x34, 0x66, 0x4B, 0x52, 0x7A, + 0x43, 0x0A, 0x62, 0x4C, 0x42, 0x51, 0x57, 0x56, 0x32, 0x51, 0x57, 0x7A, 0x75, 0x6F, 0x44, 0x54, 0x44, 0x50, 0x76, 0x33, 0x31, 0x2F, 0x7A, 0x76, 0x47, 0x64, 0x67, 0x37, 0x33, 0x4A, 0x52, 0x6D, 0x34, 0x67, 0x70, 0x76, 0x6C, 0x68, 0x55, 0x62, + 0x6F, 0x68, 0x4C, 0x33, 0x75, 0x2B, 0x70, 0x52, 0x56, 0x6A, 0x6F, 0x64, 0x53, 0x56, 0x68, 0x2F, 0x47, 0x65, 0x75, 0x66, 0x4F, 0x4A, 0x38, 0x7A, 0x32, 0x46, 0x75, 0x4C, 0x6A, 0x62, 0x76, 0x72, 0x57, 0x35, 0x4B, 0x66, 0x6E, 0x61, 0x0A, 0x4E, + 0x77, 0x55, 0x41, 0x53, 0x5A, 0x51, 0x44, 0x68, 0x45, 0x54, 0x6E, 0x76, 0x30, 0x4D, 0x78, 0x7A, 0x33, 0x57, 0x4C, 0x4A, 0x64, 0x48, 0x30, 0x70, 0x6D, 0x54, 0x31, 0x6B, 0x76, 0x61, 0x72, 0x42, 0x65, 0x73, 0x39, 0x36, 0x61, 0x55, 0x4C, 0x4E, + 0x6D, 0x4C, 0x61, 0x7A, 0x41, 0x5A, 0x66, 0x4E, 0x6F, 0x75, 0x32, 0x58, 0x6A, 0x47, 0x34, 0x4B, 0x76, 0x74, 0x65, 0x39, 0x6E, 0x48, 0x66, 0x52, 0x43, 0x61, 0x65, 0x78, 0x4F, 0x59, 0x4E, 0x6B, 0x62, 0x51, 0x75, 0x0A, 0x64, 0x5A, 0x57, 0x41, + 0x55, 0x57, 0x70, 0x4C, 0x4D, 0x4B, 0x61, 0x77, 0x59, 0x71, 0x47, 0x54, 0x38, 0x5A, 0x76, 0x59, 0x7A, 0x73, 0x52, 0x6A, 0x64, 0x54, 0x39, 0x5A, 0x52, 0x37, 0x45, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x65, 0x63, 0x20, 0x65, 0x2D, 0x53, 0x7A, 0x69, 0x67, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, + 0x41, 0x20, 0x32, 0x30, 0x30, 0x39, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x43, 0x6A, 0x43, 0x43, 0x41, 0x76, 0x4B, 0x67, 0x41, 0x77, + 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x41, 0x4D, 0x4A, 0x2B, 0x51, 0x77, 0x52, 0x4F, 0x52, 0x7A, 0x38, 0x5A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x49, + 0x47, 0x43, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x49, 0x56, 0x54, 0x45, 0x52, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x77, 0x77, 0x49, 0x51, 0x6E, 0x56, 0x6B, 0x59, + 0x58, 0x42, 0x6C, 0x63, 0x33, 0x51, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x55, 0x31, 0x70, 0x59, 0x33, 0x4A, 0x76, 0x63, 0x32, 0x56, 0x6A, 0x49, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x4A, + 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x6B, 0x31, 0x70, 0x59, 0x33, 0x4A, 0x76, 0x0A, 0x63, 0x32, 0x56, 0x6A, 0x49, 0x47, 0x55, 0x74, 0x55, 0x33, 0x70, 0x70, 0x5A, 0x32, 0x35, 0x76, 0x49, 0x46, 0x4A, 0x76, + 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x77, 0x4F, 0x54, 0x45, 0x66, 0x4D, 0x42, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x4A, 0x41, 0x52, 0x59, 0x51, 0x61, 0x57, 0x35, 0x6D, + 0x62, 0x30, 0x42, 0x6C, 0x4C, 0x58, 0x4E, 0x36, 0x61, 0x57, 0x64, 0x75, 0x62, 0x79, 0x35, 0x6F, 0x0A, 0x64, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4F, 0x54, 0x41, 0x32, 0x4D, 0x54, 0x59, 0x78, 0x4D, 0x54, 0x4D, 0x77, 0x4D, 0x54, 0x68, + 0x61, 0x46, 0x77, 0x30, 0x79, 0x4F, 0x54, 0x45, 0x79, 0x4D, 0x7A, 0x41, 0x78, 0x4D, 0x54, 0x4D, 0x77, 0x4D, 0x54, 0x68, 0x61, 0x4D, 0x49, 0x47, 0x43, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, + 0x49, 0x56, 0x54, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x77, 0x77, 0x49, 0x51, 0x6E, 0x56, 0x6B, 0x59, 0x58, 0x42, 0x6C, 0x63, 0x33, 0x51, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, + 0x6F, 0x4D, 0x44, 0x55, 0x31, 0x70, 0x59, 0x33, 0x4A, 0x76, 0x63, 0x32, 0x56, 0x6A, 0x49, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x6B, 0x31, 0x70, 0x59, 0x33, + 0x4A, 0x76, 0x63, 0x32, 0x56, 0x6A, 0x49, 0x47, 0x55, 0x74, 0x0A, 0x55, 0x33, 0x70, 0x70, 0x5A, 0x32, 0x35, 0x76, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x77, 0x4F, 0x54, 0x45, 0x66, 0x4D, + 0x42, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x4A, 0x41, 0x52, 0x59, 0x51, 0x61, 0x57, 0x35, 0x6D, 0x62, 0x30, 0x42, 0x6C, 0x4C, 0x58, 0x4E, 0x36, 0x61, 0x57, 0x64, 0x75, 0x62, 0x79, 0x35, 0x6F, 0x64, + 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, + 0x67, 0x67, 0x45, 0x42, 0x41, 0x4F, 0x6E, 0x34, 0x6A, 0x2F, 0x4E, 0x6A, 0x72, 0x64, 0x71, 0x47, 0x32, 0x4B, 0x66, 0x67, 0x51, 0x76, 0x76, 0x50, 0x6B, 0x64, 0x36, 0x6D, 0x4A, 0x76, 0x69, 0x5A, 0x70, 0x57, 0x4E, 0x77, 0x72, 0x5A, 0x75, 0x75, + 0x79, 0x6A, 0x4E, 0x41, 0x0A, 0x66, 0x57, 0x32, 0x57, 0x62, 0x71, 0x45, 0x4F, 0x52, 0x4F, 0x37, 0x68, 0x45, 0x35, 0x32, 0x55, 0x51, 0x6C, 0x4B, 0x61, 0x76, 0x58, 0x57, 0x46, 0x64, 0x43, 0x79, 0x6F, 0x44, 0x68, 0x32, 0x54, 0x74, 0x68, 0x69, + 0x33, 0x6A, 0x43, 0x79, 0x6F, 0x7A, 0x2F, 0x74, 0x63, 0x63, 0x62, 0x6E, 0x61, 0x37, 0x50, 0x37, 0x6F, 0x66, 0x6F, 0x2F, 0x6B, 0x4C, 0x78, 0x32, 0x79, 0x71, 0x48, 0x57, 0x48, 0x32, 0x4C, 0x65, 0x68, 0x35, 0x54, 0x76, 0x50, 0x6D, 0x55, 0x70, + 0x47, 0x0A, 0x30, 0x49, 0x4D, 0x5A, 0x66, 0x63, 0x43, 0x68, 0x45, 0x68, 0x79, 0x56, 0x62, 0x55, 0x72, 0x30, 0x32, 0x4D, 0x65, 0x6C, 0x54, 0x54, 0x4D, 0x75, 0x68, 0x54, 0x6C, 0x41, 0x64, 0x58, 0x34, 0x55, 0x66, 0x49, 0x41, 0x53, 0x6D, 0x46, + 0x44, 0x48, 0x51, 0x57, 0x65, 0x34, 0x6F, 0x49, 0x42, 0x68, 0x56, 0x4B, 0x5A, 0x73, 0x54, 0x68, 0x2F, 0x67, 0x6E, 0x51, 0x34, 0x48, 0x36, 0x63, 0x6D, 0x36, 0x4D, 0x2B, 0x66, 0x2B, 0x77, 0x46, 0x55, 0x6F, 0x4C, 0x41, 0x4B, 0x41, 0x0A, 0x70, + 0x78, 0x6E, 0x31, 0x6E, 0x74, 0x78, 0x56, 0x55, 0x77, 0x4F, 0x58, 0x65, 0x77, 0x64, 0x49, 0x2F, 0x35, 0x6E, 0x37, 0x4E, 0x34, 0x6F, 0x6B, 0x78, 0x46, 0x6E, 0x4D, 0x55, 0x42, 0x42, 0x6A, 0x6A, 0x71, 0x71, 0x70, 0x47, 0x72, 0x43, 0x45, 0x47, + 0x6F, 0x62, 0x35, 0x58, 0x37, 0x75, 0x78, 0x55, 0x47, 0x36, 0x6B, 0x30, 0x51, 0x72, 0x4D, 0x31, 0x58, 0x46, 0x2B, 0x48, 0x36, 0x63, 0x62, 0x66, 0x50, 0x56, 0x54, 0x62, 0x69, 0x4A, 0x66, 0x79, 0x79, 0x76, 0x6D, 0x0A, 0x31, 0x48, 0x78, 0x64, + 0x72, 0x74, 0x62, 0x43, 0x78, 0x6B, 0x7A, 0x6C, 0x42, 0x51, 0x48, 0x5A, 0x37, 0x56, 0x66, 0x38, 0x77, 0x53, 0x4E, 0x35, 0x2F, 0x50, 0x72, 0x49, 0x4A, 0x49, 0x4F, 0x56, 0x38, 0x37, 0x56, 0x71, 0x55, 0x51, 0x48, 0x51, 0x64, 0x39, 0x62, 0x70, + 0x45, 0x71, 0x48, 0x35, 0x47, 0x6F, 0x50, 0x37, 0x67, 0x68, 0x75, 0x35, 0x73, 0x4A, 0x66, 0x30, 0x64, 0x67, 0x59, 0x7A, 0x51, 0x30, 0x6D, 0x67, 0x2F, 0x77, 0x75, 0x31, 0x2B, 0x72, 0x55, 0x43, 0x0A, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4F, + 0x42, 0x67, 0x44, 0x42, 0x2B, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, + 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x4C, 0x44, 0x38, 0x62, 0x66, 0x0A, 0x51, 0x6B, 0x50, 0x4D, 0x50, 0x63, 0x75, 0x31, 0x53, 0x43, + 0x4F, 0x68, 0x47, 0x6E, 0x71, 0x6D, 0x4B, 0x72, 0x73, 0x30, 0x61, 0x44, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x54, 0x4C, 0x44, 0x38, 0x62, 0x66, 0x51, 0x6B, 0x50, 0x4D, 0x50, 0x63, + 0x75, 0x31, 0x53, 0x43, 0x4F, 0x68, 0x47, 0x6E, 0x71, 0x6D, 0x4B, 0x72, 0x73, 0x30, 0x61, 0x44, 0x41, 0x62, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x45, 0x45, 0x0A, 0x46, 0x44, 0x41, 0x53, 0x67, 0x52, 0x42, 0x70, 0x62, 0x6D, 0x5A, 0x76, 0x51, + 0x47, 0x55, 0x74, 0x63, 0x33, 0x70, 0x70, 0x5A, 0x32, 0x35, 0x76, 0x4C, 0x6D, 0x68, 0x31, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, + 0x51, 0x44, 0x4A, 0x30, 0x51, 0x35, 0x65, 0x4C, 0x74, 0x58, 0x4D, 0x73, 0x33, 0x77, 0x2B, 0x79, 0x2F, 0x77, 0x39, 0x2F, 0x77, 0x30, 0x6F, 0x0A, 0x6C, 0x5A, 0x4D, 0x45, 0x79, 0x4C, 0x2F, 0x61, 0x7A, 0x58, 0x6D, 0x34, 0x51, 0x35, 0x44, 0x77, + 0x70, 0x4C, 0x37, 0x76, 0x38, 0x75, 0x38, 0x68, 0x6D, 0x4C, 0x7A, 0x55, 0x31, 0x46, 0x30, 0x47, 0x39, 0x75, 0x35, 0x43, 0x37, 0x44, 0x42, 0x73, 0x6F, 0x4B, 0x71, 0x70, 0x79, 0x76, 0x47, 0x76, 0x69, 0x76, 0x6F, 0x2F, 0x43, 0x33, 0x4E, 0x71, + 0x50, 0x75, 0x6F, 0x75, 0x51, 0x48, 0x34, 0x66, 0x72, 0x6C, 0x52, 0x68, 0x65, 0x65, 0x73, 0x75, 0x43, 0x44, 0x66, 0x58, 0x0A, 0x49, 0x2F, 0x4F, 0x4D, 0x6E, 0x37, 0x34, 0x64, 0x73, 0x65, 0x47, 0x6B, 0x64, 0x64, 0x75, 0x67, 0x34, 0x6C, 0x51, + 0x55, 0x73, 0x62, 0x6F, 0x63, 0x4B, 0x61, 0x51, 0x59, 0x39, 0x68, 0x4B, 0x36, 0x6F, 0x68, 0x51, 0x55, 0x34, 0x7A, 0x45, 0x31, 0x79, 0x45, 0x44, 0x2F, 0x74, 0x2B, 0x41, 0x46, 0x64, 0x6C, 0x66, 0x42, 0x48, 0x46, 0x6E, 0x79, 0x2B, 0x4C, 0x2F, + 0x6B, 0x37, 0x53, 0x56, 0x69, 0x58, 0x49, 0x54, 0x77, 0x66, 0x6E, 0x34, 0x66, 0x73, 0x37, 0x37, 0x35, 0x0A, 0x74, 0x79, 0x45, 0x52, 0x7A, 0x41, 0x4D, 0x42, 0x56, 0x6E, 0x43, 0x6E, 0x45, 0x4A, 0x49, 0x65, 0x47, 0x7A, 0x53, 0x42, 0x48, 0x71, + 0x32, 0x63, 0x47, 0x73, 0x4D, 0x45, 0x50, 0x4F, 0x30, 0x43, 0x59, 0x64, 0x59, 0x65, 0x42, 0x76, 0x4E, 0x66, 0x4F, 0x6F, 0x66, 0x79, 0x4B, 0x2F, 0x46, 0x46, 0x68, 0x2B, 0x55, 0x39, 0x72, 0x4E, 0x48, 0x48, 0x56, 0x34, 0x53, 0x39, 0x61, 0x36, + 0x37, 0x63, 0x32, 0x50, 0x6D, 0x32, 0x47, 0x32, 0x4A, 0x77, 0x43, 0x7A, 0x30, 0x32, 0x0A, 0x79, 0x55, 0x4C, 0x79, 0x4D, 0x74, 0x64, 0x36, 0x59, 0x65, 0x62, 0x53, 0x32, 0x7A, 0x33, 0x50, 0x79, 0x4B, 0x6E, 0x4A, 0x6D, 0x39, 0x7A, 0x62, 0x57, + 0x45, 0x54, 0x58, 0x62, 0x7A, 0x69, 0x76, 0x66, 0x33, 0x6A, 0x54, 0x6F, 0x36, 0x30, 0x61, 0x64, 0x62, 0x6F, 0x63, 0x77, 0x54, 0x5A, 0x38, 0x6A, 0x78, 0x35, 0x74, 0x48, 0x4D, 0x4E, 0x31, 0x52, 0x71, 0x34, 0x31, 0x42, 0x61, 0x62, 0x32, 0x58, + 0x44, 0x30, 0x68, 0x37, 0x6C, 0x62, 0x77, 0x79, 0x59, 0x49, 0x69, 0x0A, 0x4C, 0x58, 0x70, 0x55, 0x71, 0x33, 0x44, 0x44, 0x66, 0x53, 0x4A, 0x6C, 0x67, 0x6E, 0x43, 0x57, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x52, 0x33, 0x0A, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x58, 0x7A, 0x43, 0x43, 0x41, 0x6B, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4C, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, + 0x49, 0x56, 0x68, 0x54, 0x43, 0x4B, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x54, 0x44, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x43, 0x78, 0x4D, 0x58, 0x52, 0x32, 0x78, 0x76, 0x0A, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x55, 0x6A, 0x4D, 0x78, 0x45, 0x7A, 0x41, + 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x6B, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x43, 0x6B, 0x64, + 0x73, 0x62, 0x32, 0x4A, 0x68, 0x0A, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x6B, 0x77, 0x4D, 0x7A, 0x45, 0x34, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x6A, + 0x6B, 0x77, 0x4D, 0x7A, 0x45, 0x34, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x4D, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x64, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, + 0x78, 0x54, 0x0A, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4C, 0x53, 0x42, 0x53, 0x4D, 0x7A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4B, 0x52, + 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x6A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4B, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x0A, + 0x62, 0x6A, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, + 0x67, 0x67, 0x45, 0x42, 0x41, 0x4D, 0x77, 0x6C, 0x64, 0x70, 0x42, 0x35, 0x42, 0x6E, 0x67, 0x69, 0x46, 0x76, 0x58, 0x41, 0x67, 0x37, 0x61, 0x45, 0x79, 0x69, 0x69, 0x65, 0x2F, 0x51, 0x56, 0x32, 0x45, 0x63, 0x57, 0x74, 0x0A, 0x69, 0x48, 0x4C, + 0x38, 0x52, 0x67, 0x4A, 0x44, 0x78, 0x37, 0x4B, 0x4B, 0x6E, 0x51, 0x52, 0x66, 0x4A, 0x4D, 0x73, 0x75, 0x53, 0x2B, 0x46, 0x67, 0x67, 0x6B, 0x62, 0x68, 0x55, 0x71, 0x73, 0x4D, 0x67, 0x55, 0x64, 0x77, 0x62, 0x4E, 0x31, 0x6B, 0x30, 0x65, 0x76, + 0x31, 0x4C, 0x4B, 0x4D, 0x50, 0x67, 0x6A, 0x30, 0x4D, 0x4B, 0x36, 0x36, 0x58, 0x31, 0x37, 0x59, 0x55, 0x68, 0x68, 0x42, 0x35, 0x75, 0x7A, 0x73, 0x54, 0x67, 0x48, 0x65, 0x4D, 0x43, 0x4F, 0x46, 0x4A, 0x0A, 0x30, 0x6D, 0x70, 0x69, 0x4C, 0x78, + 0x39, 0x65, 0x2B, 0x70, 0x5A, 0x6F, 0x33, 0x34, 0x6B, 0x6E, 0x6C, 0x54, 0x69, 0x66, 0x42, 0x74, 0x63, 0x2B, 0x79, 0x63, 0x73, 0x6D, 0x57, 0x51, 0x31, 0x7A, 0x33, 0x72, 0x44, 0x49, 0x36, 0x53, 0x59, 0x4F, 0x67, 0x78, 0x58, 0x47, 0x37, 0x31, + 0x75, 0x4C, 0x30, 0x67, 0x52, 0x67, 0x79, 0x6B, 0x6D, 0x6D, 0x4B, 0x50, 0x5A, 0x70, 0x4F, 0x2F, 0x62, 0x4C, 0x79, 0x43, 0x69, 0x52, 0x35, 0x5A, 0x32, 0x4B, 0x59, 0x56, 0x63, 0x33, 0x0A, 0x72, 0x48, 0x51, 0x55, 0x33, 0x48, 0x54, 0x67, 0x4F, + 0x75, 0x35, 0x79, 0x4C, 0x79, 0x36, 0x63, 0x2B, 0x39, 0x43, 0x37, 0x76, 0x2F, 0x55, 0x39, 0x41, 0x4F, 0x45, 0x47, 0x4D, 0x2B, 0x69, 0x43, 0x4B, 0x36, 0x35, 0x54, 0x70, 0x6A, 0x6F, 0x57, 0x63, 0x34, 0x7A, 0x64, 0x51, 0x51, 0x34, 0x67, 0x4F, + 0x73, 0x43, 0x30, 0x70, 0x36, 0x48, 0x70, 0x73, 0x6B, 0x2B, 0x51, 0x4C, 0x6A, 0x4A, 0x67, 0x36, 0x56, 0x66, 0x4C, 0x75, 0x51, 0x53, 0x53, 0x61, 0x47, 0x6A, 0x6C, 0x0A, 0x4F, 0x43, 0x5A, 0x67, 0x64, 0x62, 0x4B, 0x66, 0x64, 0x2F, 0x2B, 0x52, + 0x46, 0x4F, 0x2B, 0x75, 0x49, 0x45, 0x6E, 0x38, 0x72, 0x55, 0x41, 0x56, 0x53, 0x4E, 0x45, 0x43, 0x4D, 0x57, 0x45, 0x5A, 0x58, 0x72, 0x69, 0x58, 0x37, 0x36, 0x31, 0x33, 0x74, 0x32, 0x53, 0x61, 0x65, 0x72, 0x39, 0x66, 0x77, 0x52, 0x50, 0x76, + 0x6D, 0x32, 0x4C, 0x37, 0x44, 0x57, 0x7A, 0x67, 0x56, 0x47, 0x6B, 0x57, 0x71, 0x51, 0x50, 0x61, 0x62, 0x75, 0x6D, 0x44, 0x6B, 0x33, 0x46, 0x32, 0x0A, 0x78, 0x6D, 0x6D, 0x46, 0x67, 0x68, 0x63, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, + 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, + 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x0A, 0x46, 0x49, 0x2F, 0x77, 0x53, 0x33, 0x2B, 0x6F, 0x4C, 0x6B, 0x55, 0x6B, 0x72, 0x6B, 0x31, 0x51, 0x2B, 0x6D, + 0x4F, 0x61, 0x69, 0x39, 0x37, 0x69, 0x33, 0x52, 0x75, 0x38, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x42, 0x4C, 0x51, 0x4E, + 0x76, 0x41, 0x55, 0x4B, 0x72, 0x2B, 0x79, 0x41, 0x7A, 0x76, 0x39, 0x35, 0x5A, 0x55, 0x52, 0x55, 0x6D, 0x37, 0x0A, 0x6C, 0x67, 0x41, 0x4A, 0x51, 0x61, 0x79, 0x7A, 0x45, 0x34, 0x61, 0x47, 0x4B, 0x41, 0x63, 0x7A, 0x79, 0x6D, 0x76, 0x6D, 0x64, + 0x4C, 0x6D, 0x36, 0x41, 0x43, 0x32, 0x75, 0x70, 0x41, 0x72, 0x54, 0x39, 0x66, 0x48, 0x78, 0x44, 0x34, 0x71, 0x2F, 0x63, 0x32, 0x64, 0x4B, 0x67, 0x38, 0x64, 0x45, 0x65, 0x33, 0x6A, 0x67, 0x72, 0x32, 0x35, 0x73, 0x62, 0x77, 0x4D, 0x70, 0x6A, + 0x6A, 0x4D, 0x35, 0x52, 0x63, 0x4F, 0x4F, 0x35, 0x4C, 0x6C, 0x58, 0x62, 0x4B, 0x72, 0x38, 0x0A, 0x45, 0x70, 0x62, 0x73, 0x55, 0x38, 0x59, 0x74, 0x35, 0x43, 0x52, 0x73, 0x75, 0x5A, 0x52, 0x6A, 0x2B, 0x39, 0x78, 0x54, 0x61, 0x47, 0x64, 0x57, + 0x50, 0x6F, 0x4F, 0x34, 0x7A, 0x7A, 0x55, 0x68, 0x77, 0x38, 0x6C, 0x6F, 0x2F, 0x73, 0x37, 0x61, 0x77, 0x6C, 0x4F, 0x71, 0x7A, 0x4A, 0x43, 0x4B, 0x36, 0x66, 0x42, 0x64, 0x52, 0x6F, 0x79, 0x56, 0x33, 0x58, 0x70, 0x59, 0x4B, 0x42, 0x6F, 0x76, + 0x48, 0x64, 0x37, 0x4E, 0x41, 0x44, 0x64, 0x42, 0x6A, 0x2B, 0x31, 0x45, 0x0A, 0x62, 0x64, 0x64, 0x54, 0x4B, 0x4A, 0x64, 0x2B, 0x38, 0x32, 0x63, 0x45, 0x48, 0x68, 0x58, 0x58, 0x69, 0x70, 0x61, 0x30, 0x30, 0x39, 0x35, 0x4D, 0x4A, 0x36, 0x52, + 0x4D, 0x47, 0x33, 0x4E, 0x7A, 0x64, 0x76, 0x51, 0x58, 0x6D, 0x63, 0x49, 0x66, 0x65, 0x67, 0x37, 0x6A, 0x4C, 0x51, 0x69, 0x74, 0x43, 0x68, 0x77, 0x73, 0x2F, 0x7A, 0x79, 0x72, 0x56, 0x51, 0x34, 0x50, 0x6B, 0x58, 0x34, 0x32, 0x36, 0x38, 0x4E, + 0x58, 0x53, 0x62, 0x37, 0x68, 0x4C, 0x69, 0x31, 0x38, 0x0A, 0x59, 0x49, 0x76, 0x44, 0x51, 0x56, 0x45, 0x54, 0x49, 0x35, 0x33, 0x4F, 0x39, 0x7A, 0x4A, 0x72, 0x6C, 0x41, 0x47, 0x6F, 0x6D, 0x65, 0x63, 0x73, 0x4D, 0x78, 0x38, 0x36, 0x4F, 0x79, + 0x58, 0x53, 0x68, 0x6B, 0x44, 0x4F, 0x4F, 0x79, 0x79, 0x47, 0x65, 0x4D, 0x6C, 0x68, 0x4C, 0x78, 0x53, 0x36, 0x37, 0x74, 0x74, 0x56, 0x62, 0x39, 0x2B, 0x45, 0x37, 0x67, 0x55, 0x4A, 0x54, 0x62, 0x30, 0x6F, 0x32, 0x48, 0x4C, 0x4F, 0x30, 0x32, + 0x4A, 0x51, 0x5A, 0x52, 0x37, 0x72, 0x0A, 0x6B, 0x70, 0x65, 0x44, 0x4D, 0x64, 0x6D, 0x7A, 0x74, 0x63, 0x70, 0x48, 0x57, 0x44, 0x39, 0x66, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x49, 0x7A, 0x65, 0x6E, 0x70, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x38, 0x54, 0x43, 0x43, 0x41, 0x39, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x51, 0x41, 0x4C, 0x43, 0x33, 0x57, 0x68, 0x5A, 0x49, 0x58, 0x37, 0x2F, 0x68, 0x79, 0x2F, 0x57, 0x4C, 0x31, 0x78, 0x6E, 0x6D, 0x66, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, + 0x46, 0x41, 0x44, 0x41, 0x34, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x46, 0x55, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x4C, 0x53, 0x56, + 0x70, 0x46, 0x54, 0x6C, 0x42, 0x46, 0x49, 0x46, 0x4D, 0x75, 0x51, 0x53, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x43, 0x6B, 0x6C, 0x36, 0x5A, 0x57, 0x35, 0x77, 0x5A, 0x53, 0x35, 0x6A, 0x62, 0x32, + 0x30, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x63, 0x78, 0x4D, 0x6A, 0x45, 0x7A, 0x0A, 0x4D, 0x54, 0x4D, 0x77, 0x4F, 0x44, 0x49, 0x34, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x63, 0x78, 0x4D, 0x6A, 0x45, 0x7A, 0x4D, 0x44, 0x67, 0x79, 0x4E, + 0x7A, 0x49, 0x31, 0x57, 0x6A, 0x41, 0x34, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x46, 0x55, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x4C, 0x53, + 0x56, 0x70, 0x46, 0x54, 0x6C, 0x42, 0x46, 0x49, 0x46, 0x4D, 0x75, 0x0A, 0x51, 0x53, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x43, 0x6B, 0x6C, 0x36, 0x5A, 0x57, 0x35, 0x77, 0x5A, 0x53, 0x35, 0x6A, + 0x62, 0x32, 0x30, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, + 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x4A, 0x0A, 0x30, 0x33, 0x72, 0x4B, 0x44, 0x78, 0x36, 0x73, 0x70, 0x34, 0x62, 0x6F, 0x46, 0x6D, 0x56, 0x71, 0x73, 0x63, 0x49, 0x62, 0x52, 0x54, 0x4A, 0x78, 0x6C, 0x64, 0x6E, 0x2B, 0x45, 0x46, 0x76, + 0x4D, 0x72, 0x2B, 0x65, 0x6C, 0x65, 0x51, 0x47, 0x50, 0x69, 0x63, 0x50, 0x4B, 0x38, 0x6C, 0x56, 0x78, 0x39, 0x33, 0x65, 0x2B, 0x64, 0x35, 0x54, 0x7A, 0x63, 0x71, 0x51, 0x73, 0x52, 0x4E, 0x69, 0x65, 0x6B, 0x70, 0x73, 0x55, 0x4F, 0x71, 0x48, + 0x6E, 0x4A, 0x4A, 0x41, 0x4B, 0x0A, 0x43, 0x6C, 0x61, 0x4F, 0x78, 0x64, 0x67, 0x6D, 0x6C, 0x4F, 0x48, 0x5A, 0x53, 0x4F, 0x45, 0x74, 0x50, 0x74, 0x6F, 0x4B, 0x63, 0x74, 0x32, 0x6A, 0x6D, 0x52, 0x58, 0x61, 0x67, 0x61, 0x4B, 0x48, 0x39, 0x48, + 0x74, 0x75, 0x4A, 0x6E, 0x65, 0x4A, 0x57, 0x4B, 0x33, 0x57, 0x36, 0x77, 0x79, 0x79, 0x51, 0x58, 0x70, 0x7A, 0x62, 0x6D, 0x33, 0x62, 0x65, 0x6E, 0x68, 0x42, 0x36, 0x51, 0x69, 0x49, 0x45, 0x6E, 0x36, 0x48, 0x4C, 0x6D, 0x59, 0x52, 0x59, 0x32, + 0x78, 0x55, 0x0A, 0x2B, 0x7A, 0x79, 0x64, 0x63, 0x73, 0x43, 0x38, 0x4C, 0x76, 0x2F, 0x43, 0x74, 0x39, 0x30, 0x4E, 0x64, 0x75, 0x4D, 0x36, 0x31, 0x2F, 0x65, 0x30, 0x61, 0x4C, 0x36, 0x69, 0x39, 0x65, 0x4F, 0x42, 0x62, 0x73, 0x46, 0x47, 0x62, + 0x31, 0x32, 0x4E, 0x34, 0x45, 0x33, 0x47, 0x56, 0x46, 0x57, 0x4A, 0x47, 0x6A, 0x4D, 0x78, 0x43, 0x72, 0x46, 0x58, 0x75, 0x61, 0x4F, 0x4B, 0x6D, 0x4D, 0x50, 0x73, 0x4F, 0x7A, 0x54, 0x46, 0x6C, 0x55, 0x46, 0x70, 0x66, 0x6E, 0x58, 0x43, 0x0A, + 0x50, 0x43, 0x44, 0x46, 0x59, 0x62, 0x70, 0x52, 0x52, 0x36, 0x41, 0x67, 0x6B, 0x4A, 0x4F, 0x68, 0x6B, 0x45, 0x76, 0x7A, 0x54, 0x6E, 0x79, 0x46, 0x52, 0x56, 0x53, 0x61, 0x30, 0x51, 0x55, 0x6D, 0x51, 0x62, 0x43, 0x31, 0x54, 0x52, 0x30, 0x7A, + 0x76, 0x73, 0x51, 0x44, 0x79, 0x43, 0x56, 0x38, 0x77, 0x58, 0x44, 0x62, 0x4F, 0x2F, 0x51, 0x4A, 0x4C, 0x56, 0x51, 0x6E, 0x53, 0x4B, 0x77, 0x76, 0x34, 0x63, 0x53, 0x73, 0x50, 0x73, 0x6A, 0x4C, 0x6B, 0x6B, 0x78, 0x54, 0x0A, 0x4F, 0x54, 0x63, + 0x6A, 0x37, 0x4E, 0x4D, 0x42, 0x2B, 0x65, 0x41, 0x4A, 0x52, 0x45, 0x31, 0x4E, 0x5A, 0x4D, 0x44, 0x68, 0x44, 0x56, 0x71, 0x48, 0x49, 0x72, 0x79, 0x74, 0x47, 0x36, 0x50, 0x2B, 0x4A, 0x72, 0x55, 0x56, 0x38, 0x36, 0x66, 0x38, 0x68, 0x42, 0x6E, + 0x70, 0x37, 0x4B, 0x47, 0x49, 0x74, 0x45, 0x52, 0x70, 0x68, 0x49, 0x50, 0x7A, 0x69, 0x64, 0x46, 0x30, 0x42, 0x71, 0x6E, 0x4D, 0x43, 0x39, 0x62, 0x43, 0x33, 0x69, 0x65, 0x46, 0x55, 0x43, 0x62, 0x4B, 0x0A, 0x46, 0x37, 0x6A, 0x4A, 0x65, 0x6F, + 0x64, 0x57, 0x4C, 0x42, 0x6F, 0x42, 0x48, 0x6D, 0x79, 0x2B, 0x45, 0x36, 0x30, 0x51, 0x72, 0x4C, 0x55, 0x6B, 0x39, 0x54, 0x69, 0x52, 0x6F, 0x64, 0x5A, 0x4C, 0x32, 0x76, 0x47, 0x37, 0x30, 0x74, 0x35, 0x48, 0x74, 0x66, 0x47, 0x38, 0x67, 0x66, + 0x5A, 0x5A, 0x61, 0x38, 0x38, 0x5A, 0x55, 0x2B, 0x6D, 0x4E, 0x46, 0x63, 0x74, 0x4B, 0x79, 0x36, 0x6C, 0x76, 0x52, 0x4F, 0x55, 0x62, 0x51, 0x63, 0x2F, 0x68, 0x68, 0x71, 0x66, 0x4B, 0x0A, 0x30, 0x47, 0x71, 0x66, 0x76, 0x45, 0x79, 0x4E, 0x42, + 0x6A, 0x4E, 0x61, 0x6F, 0x6F, 0x58, 0x6C, 0x6B, 0x44, 0x57, 0x67, 0x59, 0x6C, 0x77, 0x57, 0x54, 0x76, 0x44, 0x6A, 0x6F, 0x76, 0x6F, 0x44, 0x47, 0x72, 0x51, 0x73, 0x63, 0x62, 0x4E, 0x59, 0x4C, 0x4E, 0x35, 0x37, 0x43, 0x39, 0x73, 0x61, 0x44, + 0x2B, 0x76, 0x65, 0x49, 0x52, 0x38, 0x47, 0x64, 0x77, 0x59, 0x44, 0x73, 0x4D, 0x6E, 0x76, 0x6D, 0x66, 0x7A, 0x41, 0x75, 0x55, 0x38, 0x4C, 0x68, 0x69, 0x6A, 0x2B, 0x0A, 0x30, 0x72, 0x6E, 0x71, 0x34, 0x39, 0x71, 0x6C, 0x77, 0x30, 0x64, 0x70, + 0x45, 0x75, 0x44, 0x62, 0x38, 0x50, 0x59, 0x5A, 0x69, 0x2B, 0x31, 0x37, 0x63, 0x4E, 0x63, 0x43, 0x31, 0x75, 0x32, 0x48, 0x47, 0x43, 0x67, 0x73, 0x42, 0x43, 0x52, 0x4D, 0x64, 0x2B, 0x52, 0x49, 0x69, 0x68, 0x72, 0x47, 0x4F, 0x35, 0x72, 0x55, + 0x44, 0x38, 0x72, 0x36, 0x64, 0x64, 0x49, 0x42, 0x51, 0x46, 0x71, 0x4E, 0x65, 0x62, 0x2B, 0x4C, 0x7A, 0x30, 0x76, 0x50, 0x71, 0x68, 0x62, 0x42, 0x0A, 0x6C, 0x65, 0x53, 0x74, 0x54, 0x49, 0x6F, 0x2B, 0x46, 0x35, 0x48, 0x55, 0x73, 0x57, 0x4C, + 0x6C, 0x67, 0x75, 0x57, 0x41, 0x42, 0x4B, 0x51, 0x44, 0x66, 0x6F, 0x32, 0x2F, 0x32, 0x6E, 0x2B, 0x69, 0x44, 0x35, 0x64, 0x50, 0x44, 0x4E, 0x4D, 0x4E, 0x2B, 0x39, 0x66, 0x52, 0x35, 0x58, 0x4A, 0x2B, 0x48, 0x4D, 0x68, 0x33, 0x2F, 0x31, 0x75, + 0x61, 0x44, 0x37, 0x65, 0x75, 0x42, 0x55, 0x62, 0x6C, 0x38, 0x61, 0x67, 0x57, 0x37, 0x45, 0x65, 0x6B, 0x46, 0x77, 0x49, 0x44, 0x0A, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x48, 0x32, 0x4D, 0x49, 0x48, 0x7A, 0x4D, 0x49, 0x47, 0x77, 0x42, 0x67, + 0x4E, 0x56, 0x48, 0x52, 0x45, 0x45, 0x67, 0x61, 0x67, 0x77, 0x67, 0x61, 0x57, 0x42, 0x44, 0x32, 0x6C, 0x75, 0x5A, 0x6D, 0x39, 0x41, 0x61, 0x58, 0x70, 0x6C, 0x62, 0x6E, 0x42, 0x6C, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x61, 0x53, 0x42, 0x6B, 0x54, + 0x43, 0x42, 0x6A, 0x6A, 0x46, 0x48, 0x4D, 0x45, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x2B, 0x0A, 0x53, 0x56, 0x70, 0x46, 0x54, 0x6C, 0x42, 0x46, 0x49, 0x46, 0x4D, 0x75, 0x51, 0x53, 0x34, 0x67, 0x4C, 0x53, 0x42, 0x44, 0x53, + 0x55, 0x59, 0x67, 0x51, 0x54, 0x41, 0x78, 0x4D, 0x7A, 0x4D, 0x33, 0x4D, 0x6A, 0x59, 0x77, 0x4C, 0x56, 0x4A, 0x4E, 0x5A, 0x58, 0x4A, 0x6A, 0x4C, 0x6C, 0x5A, 0x70, 0x64, 0x47, 0x39, 0x79, 0x61, 0x57, 0x45, 0x74, 0x52, 0x32, 0x46, 0x7A, 0x64, + 0x47, 0x56, 0x70, 0x65, 0x69, 0x42, 0x55, 0x4D, 0x54, 0x41, 0x31, 0x4E, 0x53, 0x42, 0x47, 0x0A, 0x4E, 0x6A, 0x49, 0x67, 0x55, 0x7A, 0x67, 0x78, 0x51, 0x7A, 0x42, 0x42, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6B, 0x4D, 0x4F, 0x6B, 0x46, 0x32, + 0x5A, 0x47, 0x45, 0x67, 0x5A, 0x47, 0x56, 0x73, 0x49, 0x45, 0x31, 0x6C, 0x5A, 0x47, 0x6C, 0x30, 0x5A, 0x58, 0x4A, 0x79, 0x59, 0x57, 0x35, 0x6C, 0x62, 0x79, 0x42, 0x46, 0x64, 0x47, 0x39, 0x79, 0x59, 0x6D, 0x6C, 0x6B, 0x5A, 0x57, 0x45, 0x67, + 0x4D, 0x54, 0x51, 0x67, 0x4C, 0x53, 0x41, 0x77, 0x4D, 0x54, 0x41, 0x78, 0x0A, 0x4D, 0x43, 0x42, 0x57, 0x61, 0x58, 0x52, 0x76, 0x63, 0x6D, 0x6C, 0x68, 0x4C, 0x55, 0x64, 0x68, 0x63, 0x33, 0x52, 0x6C, 0x61, 0x58, 0x6F, 0x77, 0x44, 0x77, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, + 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x0A, 0x42, 0x42, 0x59, 0x45, 0x46, 0x42, 0x30, 0x63, 0x5A, 0x51, 0x36, 0x6F, 0x38, 0x69, 0x56, 0x37, 0x74, 0x4A, 0x48, 0x50, 0x35, 0x4C, 0x47, 0x78, 0x35, 0x72, 0x31, 0x56, 0x64, 0x47, + 0x77, 0x46, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x42, 0x34, 0x70, 0x67, 0x77, 0x57, 0x53, 0x70, 0x39, 0x4D, 0x69, 0x44, + 0x72, 0x41, 0x79, 0x77, 0x36, 0x6C, 0x0A, 0x46, 0x6E, 0x32, 0x66, 0x75, 0x55, 0x68, 0x66, 0x47, 0x49, 0x38, 0x4E, 0x59, 0x6A, 0x62, 0x32, 0x7A, 0x52, 0x6C, 0x72, 0x72, 0x4B, 0x76, 0x56, 0x39, 0x70, 0x46, 0x39, 0x72, 0x6E, 0x48, 0x7A, 0x50, + 0x37, 0x4D, 0x4F, 0x65, 0x49, 0x57, 0x62, 0x6C, 0x61, 0x51, 0x6E, 0x49, 0x55, 0x64, 0x43, 0x53, 0x6E, 0x78, 0x49, 0x4F, 0x76, 0x56, 0x46, 0x66, 0x4C, 0x4D, 0x4D, 0x6A, 0x6C, 0x46, 0x34, 0x72, 0x4A, 0x55, 0x54, 0x33, 0x73, 0x62, 0x39, 0x66, + 0x62, 0x67, 0x61, 0x0A, 0x6B, 0x45, 0x79, 0x72, 0x6B, 0x67, 0x50, 0x48, 0x37, 0x55, 0x49, 0x42, 0x7A, 0x67, 0x2F, 0x59, 0x73, 0x66, 0x71, 0x69, 0x6B, 0x75, 0x46, 0x67, 0x62, 0x61, 0x35, 0x36, 0x61, 0x77, 0x6D, 0x71, 0x78, 0x69, 0x6E, 0x75, + 0x61, 0x45, 0x6C, 0x6E, 0x4D, 0x49, 0x41, 0x6B, 0x65, 0x6A, 0x45, 0x57, 0x4F, 0x56, 0x74, 0x2B, 0x38, 0x52, 0x77, 0x75, 0x33, 0x57, 0x77, 0x4A, 0x72, 0x66, 0x49, 0x78, 0x77, 0x59, 0x4A, 0x4F, 0x75, 0x62, 0x76, 0x35, 0x76, 0x72, 0x38, 0x71, + 0x0A, 0x68, 0x54, 0x2F, 0x41, 0x51, 0x4B, 0x4D, 0x36, 0x57, 0x66, 0x78, 0x5A, 0x53, 0x7A, 0x77, 0x6F, 0x4A, 0x4E, 0x75, 0x30, 0x46, 0x58, 0x57, 0x75, 0x44, 0x59, 0x69, 0x36, 0x4C, 0x6E, 0x50, 0x41, 0x76, 0x56, 0x69, 0x48, 0x35, 0x55, 0x4C, + 0x79, 0x36, 0x31, 0x37, 0x75, 0x48, 0x6A, 0x41, 0x69, 0x6D, 0x63, 0x73, 0x33, 0x30, 0x63, 0x51, 0x68, 0x62, 0x49, 0x48, 0x73, 0x76, 0x6D, 0x30, 0x6D, 0x35, 0x68, 0x7A, 0x6B, 0x51, 0x69, 0x43, 0x65, 0x52, 0x37, 0x43, 0x73, 0x0A, 0x67, 0x31, + 0x6C, 0x77, 0x4C, 0x44, 0x58, 0x57, 0x72, 0x7A, 0x59, 0x30, 0x74, 0x4D, 0x30, 0x37, 0x2B, 0x44, 0x4B, 0x6F, 0x37, 0x2B, 0x4E, 0x34, 0x69, 0x66, 0x75, 0x4E, 0x52, 0x53, 0x7A, 0x61, 0x6E, 0x4C, 0x68, 0x2B, 0x51, 0x42, 0x78, 0x68, 0x35, 0x7A, + 0x36, 0x69, 0x6B, 0x69, 0x78, 0x4C, 0x38, 0x73, 0x33, 0x36, 0x6D, 0x4C, 0x59, 0x70, 0x2F, 0x2F, 0x50, 0x79, 0x65, 0x36, 0x6B, 0x66, 0x4C, 0x71, 0x43, 0x54, 0x56, 0x79, 0x76, 0x65, 0x68, 0x51, 0x50, 0x35, 0x0A, 0x61, 0x54, 0x66, 0x4C, 0x6E, + 0x6E, 0x68, 0x71, 0x42, 0x62, 0x54, 0x46, 0x4D, 0x58, 0x69, 0x4A, 0x37, 0x48, 0x71, 0x6E, 0x68, 0x65, 0x47, 0x35, 0x65, 0x7A, 0x7A, 0x65, 0x76, 0x68, 0x35, 0x35, 0x68, 0x4D, 0x36, 0x66, 0x63, 0x41, 0x35, 0x5A, 0x77, 0x6A, 0x55, 0x75, 0x6B, + 0x43, 0x6F, 0x78, 0x32, 0x65, 0x52, 0x46, 0x65, 0x6B, 0x47, 0x6B, 0x4C, 0x68, 0x4F, 0x62, 0x4E, 0x41, 0x35, 0x6D, 0x65, 0x30, 0x6D, 0x72, 0x5A, 0x4A, 0x66, 0x51, 0x52, 0x73, 0x4E, 0x35, 0x0A, 0x6E, 0x58, 0x4A, 0x51, 0x59, 0x36, 0x61, 0x59, + 0x57, 0x77, 0x61, 0x39, 0x53, 0x47, 0x33, 0x59, 0x4F, 0x59, 0x4E, 0x77, 0x36, 0x44, 0x58, 0x77, 0x42, 0x64, 0x47, 0x71, 0x76, 0x4F, 0x50, 0x62, 0x79, 0x41, 0x4C, 0x71, 0x66, 0x50, 0x32, 0x43, 0x32, 0x73, 0x4A, 0x62, 0x55, 0x6A, 0x57, 0x75, + 0x6D, 0x44, 0x71, 0x74, 0x75, 0x6A, 0x57, 0x54, 0x49, 0x36, 0x63, 0x66, 0x53, 0x4E, 0x30, 0x31, 0x52, 0x70, 0x69, 0x79, 0x45, 0x47, 0x6A, 0x6B, 0x70, 0x54, 0x48, 0x43, 0x0A, 0x43, 0x6C, 0x67, 0x75, 0x47, 0x59, 0x45, 0x51, 0x79, 0x56, 0x42, + 0x31, 0x2F, 0x4F, 0x70, 0x61, 0x46, 0x73, 0x34, 0x52, 0x31, 0x2B, 0x37, 0x76, 0x55, 0x49, 0x67, 0x74, 0x59, 0x66, 0x38, 0x2F, 0x51, 0x6E, 0x4D, 0x46, 0x6C, 0x45, 0x50, 0x56, 0x6A, 0x6A, 0x78, 0x4F, 0x41, 0x54, 0x6F, 0x5A, 0x70, 0x52, 0x39, + 0x47, 0x54, 0x6E, 0x66, 0x51, 0x58, 0x65, 0x57, 0x42, 0x49, 0x69, 0x47, 0x48, 0x2F, 0x70, 0x52, 0x39, 0x68, 0x4E, 0x69, 0x54, 0x72, 0x64, 0x5A, 0x6F, 0x0A, 0x51, 0x30, 0x69, 0x79, 0x32, 0x2B, 0x74, 0x7A, 0x4A, 0x4F, 0x65, 0x52, 0x66, 0x31, + 0x53, 0x6B, 0x74, 0x6F, 0x41, 0x2B, 0x6E, 0x61, 0x4D, 0x38, 0x54, 0x48, 0x4C, 0x43, 0x56, 0x38, 0x53, 0x67, 0x31, 0x4D, 0x77, 0x34, 0x4A, 0x38, 0x37, 0x56, 0x42, 0x70, 0x36, 0x69, 0x53, 0x4E, 0x6E, 0x70, 0x6E, 0x38, 0x36, 0x43, 0x63, 0x44, + 0x61, 0x54, 0x6D, 0x6A, 0x76, 0x66, 0x6C, 0x69, 0x48, 0x6A, 0x57, 0x62, 0x63, 0x4D, 0x32, 0x70, 0x45, 0x33, 0x38, 0x50, 0x31, 0x5A, 0x0A, 0x57, 0x72, 0x4F, 0x5A, 0x79, 0x47, 0x6C, 0x73, 0x51, 0x79, 0x59, 0x42, 0x4E, 0x57, 0x4E, 0x67, 0x56, + 0x59, 0x6B, 0x44, 0x4F, 0x6E, 0x58, 0x59, 0x75, 0x6B, 0x72, 0x5A, 0x56, 0x50, 0x2F, 0x75, 0x33, 0x6F, 0x44, 0x59, 0x4C, 0x64, 0x45, 0x34, 0x31, 0x56, 0x34, 0x74, 0x43, 0x35, 0x68, 0x39, 0x50, 0x6D, 0x7A, 0x62, 0x2F, 0x43, 0x61, 0x49, 0x78, + 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6F, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, + 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x78, 0x54, 0x43, 0x43, 0x41, 0x71, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x42, 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x67, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, + 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x0A, 0x42, 0x30, 0x46, 0x79, 0x61, 0x58, 0x70, 0x76, 0x62, 0x6D, 0x45, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, + 0x63, 0x54, 0x43, 0x6C, 0x4E, 0x6A, 0x62, 0x33, 0x52, 0x30, 0x63, 0x32, 0x52, 0x68, 0x62, 0x47, 0x55, 0x78, 0x47, 0x6A, 0x41, 0x59, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x55, 0x64, 0x76, 0x52, 0x47, 0x46, 0x6B, 0x5A, 0x48, + 0x6B, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x0A, 0x4D, 0x54, 0x45, 0x77, 0x4C, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x68, 0x48, 0x62, 0x79, 0x42, 0x45, 0x59, 0x57, 0x52, 0x6B, 0x65, + 0x53, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x6C, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x41, 0x74, 0x49, + 0x45, 0x63, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x35, 0x0A, 0x4D, 0x44, 0x6B, 0x77, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x33, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x49, 0x7A, + 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x67, 0x59, 0x4D, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, + 0x45, 0x77, 0x64, 0x42, 0x63, 0x6D, 0x6C, 0x36, 0x0A, 0x62, 0x32, 0x35, 0x68, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x45, 0x77, 0x70, 0x54, 0x59, 0x32, 0x39, 0x30, 0x64, 0x48, 0x4E, 0x6B, 0x59, 0x57, 0x78, + 0x6C, 0x4D, 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x46, 0x48, 0x62, 0x30, 0x52, 0x68, 0x5A, 0x47, 0x52, 0x35, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, + 0x78, 0x4D, 0x43, 0x38, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x6F, 0x52, 0x32, 0x38, 0x67, 0x52, 0x47, 0x46, 0x6B, 0x5A, 0x48, 0x6B, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, + 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x5A, 0x53, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x4C, 0x53, 0x42, 0x48, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, + 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4C, 0x39, 0x78, 0x59, 0x67, 0x6A, 0x78, 0x2B, + 0x6C, 0x6B, 0x30, 0x39, 0x78, 0x76, 0x4A, 0x47, 0x4B, 0x50, 0x33, 0x67, 0x45, 0x6C, 0x59, 0x36, 0x53, 0x4B, 0x44, 0x45, 0x36, 0x62, 0x46, 0x49, 0x45, 0x4D, 0x42, 0x4F, 0x34, 0x54, 0x78, 0x35, 0x6F, 0x56, 0x4A, 0x6E, 0x79, 0x66, 0x71, 0x0A, + 0x39, 0x6F, 0x51, 0x62, 0x54, 0x71, 0x43, 0x30, 0x32, 0x33, 0x43, 0x59, 0x78, 0x7A, 0x49, 0x42, 0x73, 0x51, 0x55, 0x2B, 0x42, 0x30, 0x37, 0x75, 0x39, 0x50, 0x70, 0x50, 0x4C, 0x31, 0x6B, 0x77, 0x49, 0x75, 0x65, 0x72, 0x47, 0x56, 0x5A, 0x72, + 0x34, 0x6F, 0x41, 0x48, 0x2F, 0x50, 0x4D, 0x57, 0x64, 0x59, 0x41, 0x35, 0x55, 0x58, 0x76, 0x6C, 0x2B, 0x54, 0x57, 0x32, 0x64, 0x45, 0x36, 0x70, 0x6A, 0x59, 0x49, 0x54, 0x35, 0x4C, 0x59, 0x2F, 0x71, 0x51, 0x4F, 0x44, 0x0A, 0x2B, 0x71, 0x4B, + 0x2B, 0x69, 0x68, 0x56, 0x71, 0x66, 0x39, 0x34, 0x4C, 0x77, 0x37, 0x59, 0x5A, 0x46, 0x41, 0x58, 0x4B, 0x36, 0x73, 0x4F, 0x6F, 0x42, 0x4A, 0x51, 0x37, 0x52, 0x6E, 0x77, 0x79, 0x44, 0x66, 0x4D, 0x41, 0x5A, 0x69, 0x4C, 0x49, 0x6A, 0x57, 0x6C, + 0x74, 0x4E, 0x6F, 0x77, 0x52, 0x47, 0x4C, 0x66, 0x54, 0x73, 0x68, 0x78, 0x67, 0x74, 0x44, 0x6A, 0x36, 0x41, 0x6F, 0x7A, 0x4F, 0x30, 0x39, 0x31, 0x47, 0x42, 0x39, 0x34, 0x4B, 0x50, 0x75, 0x74, 0x64, 0x0A, 0x66, 0x4D, 0x68, 0x38, 0x2B, 0x37, + 0x41, 0x72, 0x55, 0x36, 0x53, 0x53, 0x59, 0x6D, 0x6C, 0x52, 0x4A, 0x51, 0x56, 0x68, 0x47, 0x6B, 0x53, 0x42, 0x6A, 0x43, 0x79, 0x70, 0x51, 0x35, 0x59, 0x6A, 0x33, 0x36, 0x77, 0x36, 0x67, 0x5A, 0x6F, 0x4F, 0x4B, 0x63, 0x55, 0x63, 0x71, 0x65, + 0x6C, 0x64, 0x48, 0x72, 0x61, 0x65, 0x6E, 0x6A, 0x41, 0x4B, 0x4F, 0x63, 0x37, 0x78, 0x69, 0x49, 0x44, 0x37, 0x53, 0x31, 0x33, 0x4D, 0x4D, 0x75, 0x79, 0x46, 0x59, 0x6B, 0x4D, 0x6C, 0x0A, 0x4E, 0x41, 0x4A, 0x57, 0x4A, 0x77, 0x47, 0x52, 0x74, + 0x44, 0x74, 0x77, 0x4B, 0x6A, 0x39, 0x75, 0x73, 0x65, 0x69, 0x63, 0x69, 0x41, 0x46, 0x39, 0x6E, 0x39, 0x54, 0x35, 0x32, 0x31, 0x4E, 0x74, 0x59, 0x4A, 0x32, 0x2F, 0x4C, 0x4F, 0x64, 0x59, 0x71, 0x37, 0x68, 0x66, 0x52, 0x76, 0x7A, 0x4F, 0x78, + 0x42, 0x73, 0x44, 0x50, 0x41, 0x6E, 0x72, 0x53, 0x54, 0x46, 0x63, 0x61, 0x55, 0x61, 0x7A, 0x34, 0x45, 0x63, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x0A, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, + 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, + 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x44, 0x71, 0x61, 0x68, 0x51, 0x63, 0x51, 0x5A, 0x79, 0x69, 0x32, 0x37, 0x2F, 0x61, 0x39, 0x0A, 0x42, 0x55, 0x46, 0x75, 0x49, 0x4D, 0x47, 0x55, 0x32, 0x67, 0x2F, 0x65, 0x4D, 0x41, 0x30, + 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x43, 0x5A, 0x32, 0x31, 0x31, 0x35, 0x31, 0x66, 0x6D, 0x58, 0x57, 0x57, 0x63, 0x44, 0x59, 0x66, 0x46, + 0x2B, 0x4F, 0x77, 0x59, 0x78, 0x64, 0x53, 0x32, 0x68, 0x49, 0x49, 0x35, 0x50, 0x5A, 0x59, 0x65, 0x30, 0x39, 0x36, 0x61, 0x63, 0x0A, 0x76, 0x4E, 0x6A, 0x70, 0x4C, 0x39, 0x44, 0x62, 0x57, 0x75, 0x37, 0x50, 0x64, 0x49, 0x78, 0x7A, 0x74, 0x44, + 0x68, 0x43, 0x32, 0x67, 0x56, 0x37, 0x2B, 0x41, 0x4A, 0x31, 0x75, 0x50, 0x32, 0x6C, 0x73, 0x64, 0x65, 0x75, 0x39, 0x74, 0x66, 0x65, 0x45, 0x38, 0x74, 0x54, 0x45, 0x48, 0x36, 0x4B, 0x52, 0x74, 0x47, 0x58, 0x2B, 0x72, 0x63, 0x75, 0x4B, 0x78, + 0x47, 0x72, 0x6B, 0x4C, 0x41, 0x6E, 0x67, 0x50, 0x6E, 0x6F, 0x6E, 0x31, 0x72, 0x70, 0x4E, 0x35, 0x2B, 0x72, 0x0A, 0x35, 0x4E, 0x39, 0x73, 0x73, 0x34, 0x55, 0x58, 0x6E, 0x54, 0x33, 0x5A, 0x4A, 0x45, 0x39, 0x35, 0x6B, 0x54, 0x58, 0x57, 0x58, + 0x77, 0x54, 0x72, 0x67, 0x49, 0x4F, 0x72, 0x6D, 0x67, 0x49, 0x74, 0x74, 0x52, 0x44, 0x30, 0x32, 0x4A, 0x44, 0x48, 0x42, 0x48, 0x4E, 0x41, 0x37, 0x58, 0x49, 0x6C, 0x6F, 0x4B, 0x6D, 0x66, 0x37, 0x4A, 0x36, 0x72, 0x61, 0x42, 0x4B, 0x5A, 0x56, + 0x38, 0x61, 0x50, 0x45, 0x6A, 0x6F, 0x4A, 0x70, 0x4C, 0x31, 0x45, 0x2F, 0x51, 0x59, 0x56, 0x0A, 0x4E, 0x38, 0x47, 0x62, 0x35, 0x44, 0x4B, 0x6A, 0x37, 0x54, 0x6A, 0x6F, 0x32, 0x47, 0x54, 0x7A, 0x4C, 0x48, 0x34, 0x55, 0x2F, 0x41, 0x4C, 0x71, + 0x6E, 0x38, 0x33, 0x2F, 0x42, 0x32, 0x67, 0x58, 0x32, 0x79, 0x4B, 0x51, 0x4F, 0x43, 0x31, 0x36, 0x6A, 0x64, 0x46, 0x55, 0x38, 0x57, 0x6E, 0x6A, 0x58, 0x7A, 0x50, 0x4B, 0x65, 0x6A, 0x31, 0x37, 0x43, 0x75, 0x50, 0x4B, 0x66, 0x31, 0x38, 0x35, + 0x35, 0x65, 0x4A, 0x31, 0x75, 0x73, 0x56, 0x32, 0x47, 0x44, 0x50, 0x4F, 0x0A, 0x4C, 0x50, 0x41, 0x76, 0x54, 0x4B, 0x33, 0x33, 0x73, 0x65, 0x66, 0x4F, 0x54, 0x36, 0x6A, 0x45, 0x6D, 0x30, 0x70, 0x55, 0x42, 0x73, 0x56, 0x2F, 0x66, 0x64, 0x55, + 0x49, 0x44, 0x2B, 0x49, 0x63, 0x2F, 0x6E, 0x34, 0x58, 0x75, 0x4B, 0x78, 0x65, 0x39, 0x74, 0x51, 0x57, 0x73, 0x6B, 0x4D, 0x4A, 0x44, 0x45, 0x33, 0x32, 0x70, 0x32, 0x75, 0x30, 0x6D, 0x59, 0x52, 0x6C, 0x79, 0x6E, 0x71, 0x49, 0x34, 0x75, 0x4A, + 0x45, 0x76, 0x6C, 0x7A, 0x33, 0x36, 0x68, 0x7A, 0x31, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x74, 0x61, + 0x72, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x32, 0x0A, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x33, 0x54, 0x43, 0x43, 0x41, 0x73, 0x57, + 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x6A, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x0A, 0x42, 0x30, 0x46, 0x79, 0x61, 0x58, 0x70, 0x76, 0x62, 0x6D, 0x45, 0x78, 0x45, 0x7A, + 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x6C, 0x4E, 0x6A, 0x62, 0x33, 0x52, 0x30, 0x63, 0x32, 0x52, 0x68, 0x62, 0x47, 0x55, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, + 0x4E, 0x30, 0x59, 0x58, 0x4A, 0x6D, 0x61, 0x57, 0x56, 0x73, 0x5A, 0x43, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x0A, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4D, + 0x6A, 0x41, 0x77, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4B, 0x56, 0x4E, 0x30, 0x59, 0x58, 0x4A, 0x6D, 0x61, 0x57, 0x56, 0x73, 0x5A, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, + 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x6C, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x0A, 0x65, 0x53, 0x41, 0x74, 0x49, 0x45, 0x63, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x35, 0x4D, 0x44, 0x6B, 0x77, + 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x33, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x49, 0x7A, 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x67, 0x59, 0x38, 0x78, 0x43, 0x7A, 0x41, 0x4A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x41, 0x77, 0x0A, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, 0x77, 0x64, 0x42, 0x63, 0x6D, 0x6C, 0x36, 0x62, 0x32, 0x35, 0x68, 0x4D, 0x52, 0x4D, + 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x45, 0x77, 0x70, 0x54, 0x59, 0x32, 0x39, 0x30, 0x64, 0x48, 0x4E, 0x6B, 0x59, 0x57, 0x78, 0x6C, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x78, + 0x54, 0x64, 0x47, 0x46, 0x79, 0x5A, 0x6D, 0x6C, 0x6C, 0x62, 0x47, 0x51, 0x67, 0x0A, 0x56, 0x47, 0x56, 0x6A, 0x61, 0x47, 0x35, 0x76, 0x62, 0x47, 0x39, 0x6E, 0x61, 0x57, 0x56, 0x7A, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x4D, 0x54, + 0x49, 0x77, 0x4D, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x6C, 0x54, 0x64, 0x47, 0x46, 0x79, 0x5A, 0x6D, 0x6C, 0x6C, 0x62, 0x47, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, + 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x5A, 0x53, 0x42, 0x42, 0x0A, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x4C, 0x53, 0x42, 0x48, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, + 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4C, 0x33, 0x74, 0x77, 0x51, 0x50, 0x38, 0x39, + 0x6F, 0x2F, 0x38, 0x41, 0x72, 0x46, 0x76, 0x0A, 0x57, 0x35, 0x39, 0x49, 0x32, 0x5A, 0x31, 0x35, 0x34, 0x71, 0x4B, 0x33, 0x41, 0x32, 0x46, 0x57, 0x47, 0x4D, 0x4E, 0x48, 0x74, 0x74, 0x66, 0x4B, 0x50, 0x54, 0x55, 0x75, 0x69, 0x55, 0x50, 0x33, + 0x6F, 0x57, 0x6D, 0x62, 0x33, 0x6F, 0x6F, 0x61, 0x2F, 0x52, 0x4D, 0x67, 0x6E, 0x4C, 0x52, 0x4A, 0x64, 0x7A, 0x49, 0x70, 0x56, 0x76, 0x32, 0x35, 0x37, 0x49, 0x7A, 0x64, 0x49, 0x76, 0x70, 0x79, 0x33, 0x43, 0x64, 0x68, 0x6C, 0x2B, 0x37, 0x32, + 0x57, 0x6F, 0x54, 0x73, 0x0A, 0x62, 0x68, 0x6D, 0x35, 0x69, 0x53, 0x7A, 0x63, 0x68, 0x46, 0x76, 0x56, 0x64, 0x50, 0x74, 0x72, 0x58, 0x38, 0x57, 0x4A, 0x70, 0x52, 0x42, 0x53, 0x69, 0x55, 0x5A, 0x56, 0x39, 0x4C, 0x68, 0x31, 0x48, 0x4F, 0x5A, + 0x2F, 0x35, 0x46, 0x53, 0x75, 0x53, 0x2F, 0x68, 0x56, 0x63, 0x6C, 0x63, 0x43, 0x47, 0x66, 0x67, 0x58, 0x63, 0x56, 0x6E, 0x72, 0x48, 0x69, 0x67, 0x48, 0x64, 0x4D, 0x57, 0x64, 0x53, 0x4C, 0x35, 0x73, 0x74, 0x50, 0x53, 0x6B, 0x73, 0x50, 0x4E, + 0x6B, 0x0A, 0x4E, 0x33, 0x6D, 0x53, 0x77, 0x4F, 0x78, 0x47, 0x58, 0x6E, 0x2F, 0x68, 0x62, 0x56, 0x4E, 0x4D, 0x59, 0x71, 0x2F, 0x4E, 0x48, 0x77, 0x74, 0x6A, 0x75, 0x7A, 0x71, 0x64, 0x2B, 0x2F, 0x78, 0x35, 0x41, 0x4A, 0x68, 0x68, 0x64, 0x4D, + 0x38, 0x6D, 0x67, 0x6B, 0x42, 0x6A, 0x38, 0x37, 0x4A, 0x79, 0x61, 0x68, 0x6B, 0x4E, 0x6D, 0x63, 0x72, 0x55, 0x44, 0x6E, 0x58, 0x4D, 0x4E, 0x2F, 0x75, 0x4C, 0x69, 0x63, 0x46, 0x5A, 0x38, 0x57, 0x4A, 0x2F, 0x58, 0x37, 0x4E, 0x66, 0x0A, 0x5A, + 0x54, 0x44, 0x34, 0x70, 0x37, 0x64, 0x4E, 0x64, 0x6C, 0x6F, 0x65, 0x64, 0x6C, 0x34, 0x30, 0x77, 0x4F, 0x69, 0x57, 0x56, 0x70, 0x6D, 0x4B, 0x73, 0x2F, 0x42, 0x2F, 0x70, 0x4D, 0x32, 0x39, 0x33, 0x44, 0x49, 0x78, 0x66, 0x4A, 0x48, 0x50, 0x34, + 0x46, 0x38, 0x52, 0x2B, 0x47, 0x75, 0x71, 0x53, 0x56, 0x7A, 0x52, 0x6D, 0x5A, 0x54, 0x52, 0x6F, 0x75, 0x4E, 0x6A, 0x57, 0x77, 0x6C, 0x32, 0x74, 0x56, 0x5A, 0x69, 0x34, 0x55, 0x74, 0x30, 0x48, 0x5A, 0x62, 0x55, 0x0A, 0x4A, 0x74, 0x51, 0x49, + 0x42, 0x46, 0x6E, 0x51, 0x6D, 0x41, 0x34, 0x4F, 0x35, 0x74, 0x37, 0x38, 0x77, 0x2B, 0x77, 0x66, 0x6B, 0x50, 0x45, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, + 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x48, 0x77, 0x4D, 0x4D, 0x68, 0x2B, 0x6E, 0x32, 0x54, 0x42, 0x2F, 0x78, 0x48, 0x31, 0x6F, 0x6F, 0x32, 0x4B, 0x6F, 0x6F, 0x63, 0x36, 0x72, 0x42, 0x31, 0x73, 0x6E, 0x4D, 0x41, 0x30, + 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x41, 0x52, 0x57, 0x66, 0x6F, 0x6C, 0x0A, 0x54, 0x77, 0x4E, 0x76, 0x6C, 0x4A, 0x6B, 0x37, 0x6D, 0x68, + 0x2B, 0x43, 0x68, 0x54, 0x6E, 0x55, 0x64, 0x67, 0x57, 0x55, 0x58, 0x75, 0x45, 0x6F, 0x6B, 0x32, 0x31, 0x69, 0x58, 0x51, 0x6E, 0x43, 0x6F, 0x4B, 0x6A, 0x55, 0x73, 0x48, 0x55, 0x34, 0x38, 0x54, 0x52, 0x71, 0x6E, 0x65, 0x53, 0x66, 0x69, 0x6F, + 0x59, 0x6D, 0x55, 0x65, 0x59, 0x73, 0x30, 0x63, 0x59, 0x74, 0x62, 0x70, 0x55, 0x67, 0x53, 0x70, 0x49, 0x42, 0x37, 0x4C, 0x69, 0x4B, 0x5A, 0x33, 0x73, 0x78, 0x0A, 0x34, 0x6D, 0x63, 0x75, 0x6A, 0x4A, 0x55, 0x44, 0x4A, 0x69, 0x35, 0x44, 0x6E, + 0x55, 0x6F, 0x78, 0x39, 0x67, 0x36, 0x31, 0x44, 0x4C, 0x75, 0x33, 0x34, 0x6A, 0x64, 0x2F, 0x49, 0x72, 0x6F, 0x41, 0x6F, 0x77, 0x35, 0x37, 0x55, 0x76, 0x74, 0x72, 0x75, 0x7A, 0x76, 0x45, 0x30, 0x33, 0x6C, 0x52, 0x54, 0x73, 0x32, 0x51, 0x39, + 0x47, 0x63, 0x48, 0x47, 0x63, 0x67, 0x38, 0x52, 0x6E, 0x6F, 0x4E, 0x41, 0x58, 0x33, 0x46, 0x57, 0x4F, 0x64, 0x74, 0x35, 0x6F, 0x55, 0x77, 0x0A, 0x46, 0x35, 0x6F, 0x6B, 0x78, 0x42, 0x44, 0x67, 0x42, 0x50, 0x66, 0x67, 0x38, 0x6E, 0x2F, 0x55, + 0x71, 0x67, 0x72, 0x2F, 0x51, 0x68, 0x30, 0x33, 0x37, 0x5A, 0x54, 0x6C, 0x5A, 0x46, 0x6B, 0x53, 0x49, 0x48, 0x63, 0x34, 0x30, 0x7A, 0x49, 0x2B, 0x4F, 0x49, 0x46, 0x31, 0x6C, 0x6E, 0x50, 0x36, 0x61, 0x49, 0x2B, 0x78, 0x79, 0x38, 0x34, 0x66, + 0x78, 0x65, 0x7A, 0x36, 0x6E, 0x48, 0x37, 0x50, 0x66, 0x72, 0x48, 0x78, 0x42, 0x79, 0x32, 0x32, 0x2F, 0x4C, 0x2F, 0x4B, 0x0A, 0x70, 0x4C, 0x2F, 0x51, 0x6C, 0x77, 0x56, 0x4B, 0x76, 0x4F, 0x6F, 0x59, 0x4B, 0x41, 0x4B, 0x51, 0x76, 0x56, 0x52, + 0x34, 0x43, 0x53, 0x46, 0x78, 0x30, 0x39, 0x46, 0x39, 0x48, 0x64, 0x6B, 0x57, 0x73, 0x4B, 0x6C, 0x68, 0x50, 0x64, 0x41, 0x4B, 0x41, 0x43, 0x4C, 0x38, 0x78, 0x33, 0x76, 0x4C, 0x43, 0x57, 0x52, 0x46, 0x43, 0x7A, 0x74, 0x41, 0x67, 0x66, 0x64, + 0x39, 0x66, 0x44, 0x4C, 0x31, 0x6D, 0x4D, 0x70, 0x59, 0x6A, 0x6E, 0x30, 0x71, 0x37, 0x70, 0x42, 0x5A, 0x0A, 0x63, 0x32, 0x54, 0x35, 0x4E, 0x6E, 0x52, 0x65, 0x4A, 0x61, 0x48, 0x31, 0x5A, 0x67, 0x55, 0x75, 0x66, 0x7A, 0x6B, 0x56, 0x71, 0x53, + 0x72, 0x37, 0x55, 0x49, 0x75, 0x4F, 0x68, 0x57, 0x6E, 0x30, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x74, + 0x61, 0x72, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x37, 0x7A, 0x43, 0x43, 0x41, 0x74, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, + 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x6D, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x67, 0x54, 0x0A, 0x42, 0x30, 0x46, 0x79, 0x61, 0x58, 0x70, 0x76, 0x62, 0x6D, 0x45, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x6C, 0x4E, 0x6A, 0x62, 0x33, 0x52, 0x30, 0x63, 0x32, 0x52, + 0x68, 0x62, 0x47, 0x55, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, 0x4E, 0x30, 0x59, 0x58, 0x4A, 0x6D, 0x61, 0x57, 0x56, 0x73, 0x5A, 0x43, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, + 0x73, 0x0A, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4F, 0x7A, 0x41, 0x35, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4D, 0x6C, 0x4E, 0x30, 0x59, 0x58, 0x4A, 0x6D, 0x61, 0x57, + 0x56, 0x73, 0x5A, 0x43, 0x42, 0x54, 0x5A, 0x58, 0x4A, 0x32, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x6C, 0x0A, 0x49, + 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x41, 0x74, 0x49, 0x45, 0x63, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x35, 0x4D, 0x44, 0x6B, 0x77, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, + 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x33, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x49, 0x7A, 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x67, 0x5A, 0x67, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x59, 0x54, + 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, 0x77, 0x64, 0x42, 0x63, 0x6D, 0x6C, 0x36, 0x62, 0x32, 0x35, 0x68, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, + 0x45, 0x77, 0x70, 0x54, 0x59, 0x32, 0x39, 0x30, 0x64, 0x48, 0x4E, 0x6B, 0x59, 0x57, 0x78, 0x6C, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x78, 0x54, 0x0A, 0x64, 0x47, 0x46, 0x79, 0x5A, 0x6D, 0x6C, + 0x6C, 0x62, 0x47, 0x51, 0x67, 0x56, 0x47, 0x56, 0x6A, 0x61, 0x47, 0x35, 0x76, 0x62, 0x47, 0x39, 0x6E, 0x61, 0x57, 0x56, 0x7A, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x4D, 0x54, 0x73, 0x77, 0x4F, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x44, 0x45, 0x7A, 0x4A, 0x54, 0x64, 0x47, 0x46, 0x79, 0x5A, 0x6D, 0x6C, 0x6C, 0x62, 0x47, 0x51, 0x67, 0x55, 0x32, 0x56, 0x79, 0x64, 0x6D, 0x6C, 0x6A, 0x5A, 0x58, 0x4D, 0x67, 0x0A, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, + 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x5A, 0x53, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x4C, 0x53, 0x42, 0x48, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, + 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x0A, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4E, 0x55, 0x4D, 0x4F, + 0x73, 0x51, 0x71, 0x2B, 0x55, 0x37, 0x69, 0x39, 0x62, 0x34, 0x5A, 0x6C, 0x31, 0x2B, 0x4F, 0x69, 0x46, 0x4F, 0x78, 0x48, 0x7A, 0x2F, 0x4C, 0x7A, 0x35, 0x38, 0x67, 0x45, 0x32, 0x30, 0x70, 0x4F, 0x73, 0x67, 0x50, 0x66, 0x54, 0x7A, 0x33, 0x61, + 0x33, 0x59, 0x34, 0x59, 0x39, 0x6B, 0x32, 0x59, 0x4B, 0x69, 0x62, 0x58, 0x6C, 0x77, 0x41, 0x67, 0x4C, 0x49, 0x76, 0x57, 0x58, 0x2F, 0x32, 0x0A, 0x68, 0x2F, 0x6B, 0x6C, 0x51, 0x34, 0x62, 0x6E, 0x61, 0x52, 0x74, 0x53, 0x6D, 0x70, 0x44, 0x68, + 0x63, 0x65, 0x50, 0x59, 0x4C, 0x51, 0x31, 0x4F, 0x62, 0x2F, 0x62, 0x49, 0x53, 0x64, 0x6D, 0x32, 0x38, 0x78, 0x70, 0x57, 0x72, 0x69, 0x75, 0x32, 0x64, 0x42, 0x54, 0x72, 0x7A, 0x2F, 0x73, 0x6D, 0x34, 0x78, 0x71, 0x36, 0x48, 0x5A, 0x59, 0x75, + 0x61, 0x6A, 0x74, 0x59, 0x6C, 0x49, 0x6C, 0x48, 0x56, 0x76, 0x38, 0x6C, 0x6F, 0x4A, 0x4E, 0x77, 0x55, 0x34, 0x50, 0x61, 0x0A, 0x68, 0x48, 0x51, 0x55, 0x77, 0x32, 0x65, 0x65, 0x42, 0x47, 0x67, 0x36, 0x33, 0x34, 0x35, 0x41, 0x57, 0x68, 0x31, + 0x4B, 0x54, 0x73, 0x39, 0x44, 0x6B, 0x54, 0x76, 0x6E, 0x56, 0x74, 0x59, 0x41, 0x63, 0x4D, 0x74, 0x53, 0x37, 0x6E, 0x74, 0x39, 0x72, 0x6A, 0x72, 0x6E, 0x76, 0x44, 0x48, 0x35, 0x52, 0x66, 0x62, 0x43, 0x59, 0x4D, 0x38, 0x54, 0x57, 0x51, 0x49, + 0x72, 0x67, 0x4D, 0x77, 0x30, 0x52, 0x39, 0x2B, 0x35, 0x33, 0x70, 0x42, 0x6C, 0x62, 0x51, 0x4C, 0x50, 0x0A, 0x4C, 0x4A, 0x47, 0x6D, 0x70, 0x75, 0x66, 0x65, 0x68, 0x52, 0x68, 0x4A, 0x66, 0x47, 0x5A, 0x4F, 0x6F, 0x7A, 0x70, 0x74, 0x71, 0x62, + 0x58, 0x75, 0x4E, 0x43, 0x36, 0x36, 0x44, 0x51, 0x4F, 0x34, 0x4D, 0x39, 0x39, 0x48, 0x36, 0x37, 0x46, 0x72, 0x6A, 0x53, 0x58, 0x5A, 0x6D, 0x38, 0x36, 0x42, 0x30, 0x55, 0x56, 0x47, 0x4D, 0x70, 0x5A, 0x77, 0x68, 0x39, 0x34, 0x43, 0x44, 0x6B, + 0x6C, 0x44, 0x68, 0x62, 0x5A, 0x73, 0x63, 0x37, 0x74, 0x6B, 0x36, 0x6D, 0x46, 0x42, 0x0A, 0x72, 0x4D, 0x6E, 0x55, 0x56, 0x4E, 0x2B, 0x48, 0x4C, 0x38, 0x63, 0x69, 0x73, 0x69, 0x62, 0x4D, 0x6E, 0x31, 0x6C, 0x55, 0x61, 0x4A, 0x2F, 0x38, 0x76, + 0x69, 0x6F, 0x76, 0x78, 0x46, 0x55, 0x63, 0x64, 0x55, 0x42, 0x67, 0x46, 0x34, 0x55, 0x43, 0x56, 0x54, 0x6D, 0x4C, 0x66, 0x77, 0x55, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, + 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x0A, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, + 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4A, 0x78, 0x66, 0x41, 0x4E, 0x2B, 0x71, 0x41, 0x64, 0x63, 0x77, 0x4B, 0x7A, 0x69, 0x49, 0x6F, 0x72, 0x68, 0x74, 0x53, 0x70, 0x7A, 0x79, 0x45, 0x5A, 0x47, 0x44, + 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x0A, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x42, 0x4C, 0x4E, 0x71, 0x61, 0x45, 0x64, 0x32, 0x6E, 0x64, 0x4F, 0x78, 0x6D, + 0x66, 0x5A, 0x79, 0x4D, 0x49, 0x62, 0x77, 0x35, 0x68, 0x79, 0x66, 0x32, 0x45, 0x33, 0x46, 0x2F, 0x59, 0x4E, 0x6F, 0x48, 0x4E, 0x32, 0x42, 0x74, 0x42, 0x4C, 0x5A, 0x39, 0x67, 0x33, 0x63, 0x63, 0x61, 0x61, 0x4E, 0x6E, 0x52, 0x62, 0x6F, 0x62, + 0x68, 0x69, 0x43, 0x50, 0x50, 0x0A, 0x45, 0x39, 0x35, 0x44, 0x7A, 0x2B, 0x49, 0x30, 0x73, 0x77, 0x53, 0x64, 0x48, 0x79, 0x6E, 0x56, 0x76, 0x2F, 0x68, 0x65, 0x79, 0x4E, 0x58, 0x42, 0x76, 0x65, 0x36, 0x53, 0x62, 0x7A, 0x4A, 0x30, 0x38, 0x70, + 0x47, 0x43, 0x4C, 0x37, 0x32, 0x43, 0x51, 0x6E, 0x71, 0x74, 0x4B, 0x72, 0x63, 0x67, 0x66, 0x55, 0x32, 0x38, 0x65, 0x6C, 0x55, 0x53, 0x77, 0x68, 0x58, 0x71, 0x76, 0x66, 0x64, 0x71, 0x6C, 0x53, 0x35, 0x73, 0x64, 0x4A, 0x2F, 0x50, 0x48, 0x4C, + 0x54, 0x79, 0x0A, 0x78, 0x51, 0x47, 0x6A, 0x68, 0x64, 0x42, 0x79, 0x50, 0x71, 0x31, 0x7A, 0x71, 0x77, 0x75, 0x62, 0x64, 0x51, 0x78, 0x74, 0x52, 0x62, 0x65, 0x4F, 0x6C, 0x4B, 0x79, 0x57, 0x4E, 0x37, 0x57, 0x67, 0x30, 0x49, 0x38, 0x56, 0x52, + 0x77, 0x37, 0x6A, 0x36, 0x49, 0x50, 0x64, 0x6A, 0x2F, 0x33, 0x76, 0x51, 0x51, 0x46, 0x33, 0x7A, 0x43, 0x65, 0x70, 0x59, 0x6F, 0x55, 0x7A, 0x38, 0x6A, 0x63, 0x49, 0x37, 0x33, 0x48, 0x50, 0x64, 0x77, 0x62, 0x65, 0x79, 0x42, 0x6B, 0x64, 0x0A, + 0x69, 0x45, 0x44, 0x50, 0x66, 0x55, 0x59, 0x64, 0x2F, 0x78, 0x37, 0x48, 0x34, 0x63, 0x37, 0x2F, 0x49, 0x39, 0x76, 0x47, 0x2B, 0x6F, 0x31, 0x56, 0x54, 0x71, 0x6B, 0x43, 0x35, 0x30, 0x63, 0x52, 0x52, 0x6A, 0x37, 0x30, 0x2F, 0x62, 0x31, 0x37, + 0x4B, 0x53, 0x61, 0x37, 0x71, 0x57, 0x46, 0x69, 0x4E, 0x79, 0x69, 0x32, 0x4C, 0x53, 0x72, 0x32, 0x45, 0x49, 0x5A, 0x6B, 0x79, 0x58, 0x43, 0x6E, 0x30, 0x71, 0x32, 0x33, 0x4B, 0x58, 0x42, 0x35, 0x36, 0x6A, 0x7A, 0x61, 0x0A, 0x59, 0x79, 0x57, + 0x66, 0x2F, 0x57, 0x69, 0x33, 0x4D, 0x4F, 0x78, 0x77, 0x2B, 0x33, 0x57, 0x4B, 0x74, 0x32, 0x31, 0x67, 0x5A, 0x37, 0x49, 0x65, 0x79, 0x4C, 0x6E, 0x70, 0x32, 0x4B, 0x68, 0x76, 0x41, 0x6F, 0x74, 0x6E, 0x44, 0x55, 0x30, 0x6D, 0x56, 0x33, 0x48, + 0x61, 0x49, 0x50, 0x7A, 0x42, 0x53, 0x6C, 0x43, 0x4E, 0x73, 0x53, 0x69, 0x36, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x0A, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6D, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6C, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x54, + 0x44, 0x43, 0x43, 0x41, 0x6A, 0x53, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x64, 0x33, 0x63, 0x47, 0x4A, 0x79, 0x61, 0x70, 0x73, 0x58, 0x77, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, + 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x52, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, + 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x5A, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, + 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, 0x62, 0x32, 0x31, 0x74, 0x5A, 0x58, 0x4A, 0x6A, 0x61, 0x57, 0x46, 0x73, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x77, 0x0A, 0x4D, 0x44, 0x45, 0x79, 0x4F, 0x54, 0x45, 0x30, 0x4D, 0x44, 0x59, + 0x77, 0x4E, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x77, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x45, 0x30, 0x4D, 0x44, 0x59, 0x77, 0x4E, 0x6C, 0x6F, 0x77, 0x52, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, + 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x0A, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x5A, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, 0x62, 0x32, 0x31, 0x74, 0x5A, 0x58, 0x4A, 0x6A, 0x61, 0x57, 0x46, 0x73, 0x4D, 0x49, + 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x0A, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, + 0x51, 0x45, 0x41, 0x39, 0x68, 0x74, 0x50, 0x5A, 0x77, 0x63, 0x72, 0x6F, 0x52, 0x58, 0x31, 0x42, 0x69, 0x4C, 0x4C, 0x48, 0x77, 0x47, 0x79, 0x34, 0x33, 0x4E, 0x46, 0x42, 0x6B, 0x52, 0x4A, 0x4C, 0x4C, 0x74, 0x4A, 0x4A, 0x52, 0x54, 0x57, 0x7A, + 0x73, 0x4F, 0x33, 0x71, 0x79, 0x78, 0x50, 0x78, 0x6B, 0x45, 0x79, 0x6C, 0x46, 0x66, 0x36, 0x45, 0x71, 0x64, 0x62, 0x0A, 0x44, 0x75, 0x4B, 0x50, 0x48, 0x78, 0x36, 0x47, 0x47, 0x61, 0x65, 0x71, 0x74, 0x53, 0x32, 0x35, 0x58, 0x77, 0x32, 0x4B, + 0x77, 0x71, 0x2B, 0x46, 0x4E, 0x58, 0x6B, 0x79, 0x4C, 0x62, 0x73, 0x63, 0x59, 0x6A, 0x66, 0x79, 0x73, 0x56, 0x74, 0x4B, 0x50, 0x63, 0x72, 0x4E, 0x63, 0x56, 0x2F, 0x70, 0x51, 0x72, 0x36, 0x55, 0x36, 0x4D, 0x6A, 0x65, 0x2B, 0x53, 0x4A, 0x49, + 0x5A, 0x4D, 0x62, 0x6C, 0x71, 0x38, 0x59, 0x72, 0x62, 0x61, 0x30, 0x46, 0x38, 0x50, 0x72, 0x56, 0x0A, 0x43, 0x38, 0x2B, 0x61, 0x35, 0x66, 0x42, 0x51, 0x70, 0x49, 0x73, 0x37, 0x52, 0x36, 0x55, 0x6A, 0x57, 0x33, 0x70, 0x36, 0x2B, 0x44, 0x4D, + 0x2F, 0x75, 0x4F, 0x2B, 0x5A, 0x6C, 0x2B, 0x4D, 0x67, 0x77, 0x64, 0x59, 0x6F, 0x69, 0x63, 0x2B, 0x55, 0x2B, 0x37, 0x6C, 0x46, 0x37, 0x65, 0x4E, 0x41, 0x46, 0x78, 0x48, 0x55, 0x64, 0x50, 0x41, 0x4C, 0x4D, 0x65, 0x49, 0x72, 0x4A, 0x6D, 0x71, + 0x62, 0x54, 0x46, 0x65, 0x75, 0x72, 0x43, 0x41, 0x2B, 0x75, 0x6B, 0x56, 0x36, 0x0A, 0x42, 0x66, 0x4F, 0x39, 0x6D, 0x32, 0x6B, 0x56, 0x72, 0x6E, 0x31, 0x4F, 0x49, 0x47, 0x50, 0x45, 0x4E, 0x58, 0x59, 0x36, 0x42, 0x77, 0x4C, 0x4A, 0x4E, 0x2F, + 0x33, 0x48, 0x52, 0x2B, 0x37, 0x6F, 0x38, 0x58, 0x59, 0x64, 0x63, 0x78, 0x58, 0x79, 0x6C, 0x36, 0x53, 0x31, 0x79, 0x48, 0x70, 0x35, 0x32, 0x55, 0x4B, 0x71, 0x4B, 0x33, 0x39, 0x63, 0x2F, 0x73, 0x34, 0x6D, 0x54, 0x36, 0x4E, 0x6D, 0x67, 0x54, + 0x57, 0x76, 0x52, 0x4C, 0x70, 0x55, 0x48, 0x68, 0x77, 0x77, 0x0A, 0x4D, 0x6D, 0x57, 0x64, 0x35, 0x6A, 0x79, 0x54, 0x58, 0x6C, 0x42, 0x4F, 0x65, 0x75, 0x4D, 0x36, 0x31, 0x47, 0x37, 0x4D, 0x47, 0x76, 0x76, 0x35, 0x30, 0x6A, 0x65, 0x75, 0x4A, + 0x43, 0x71, 0x72, 0x56, 0x77, 0x4D, 0x69, 0x4B, 0x41, 0x31, 0x4A, 0x64, 0x58, 0x2B, 0x33, 0x4B, 0x4E, 0x70, 0x31, 0x76, 0x34, 0x37, 0x6A, 0x33, 0x41, 0x35, 0x35, 0x4D, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, + 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x6E, 0x5A, 0x50, 0x47, 0x55, 0x34, 0x74, 0x65, 0x79, 0x71, 0x38, 0x2F, 0x6E, 0x78, 0x34, 0x50, 0x35, 0x5A, 0x6D, 0x56, 0x76, 0x43, 0x54, 0x32, + 0x6C, 0x49, 0x38, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, + 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x46, 0x69, 0x73, 0x39, 0x41, 0x51, + 0x4F, 0x7A, 0x63, 0x41, 0x4E, 0x2F, 0x77, 0x72, 0x39, 0x31, 0x4C, 0x6F, 0x57, 0x58, 0x79, 0x6D, 0x39, 0x65, 0x32, 0x69, 0x5A, 0x57, 0x45, 0x6E, 0x53, 0x74, 0x42, 0x30, 0x33, 0x54, 0x58, 0x38, 0x6E, 0x66, 0x55, 0x59, 0x47, 0x58, 0x55, 0x50, + 0x47, 0x0A, 0x68, 0x69, 0x34, 0x2B, 0x63, 0x37, 0x49, 0x6D, 0x66, 0x55, 0x2B, 0x54, 0x71, 0x62, 0x62, 0x45, 0x4B, 0x70, 0x71, 0x72, 0x49, 0x5A, 0x63, 0x55, 0x73, 0x64, 0x36, 0x4D, 0x30, 0x36, 0x75, 0x4A, 0x46, 0x64, 0x68, 0x72, 0x4A, 0x4E, + 0x54, 0x78, 0x46, 0x71, 0x37, 0x59, 0x70, 0x46, 0x7A, 0x55, 0x66, 0x31, 0x47, 0x4F, 0x37, 0x52, 0x67, 0x42, 0x73, 0x5A, 0x4E, 0x6A, 0x76, 0x62, 0x7A, 0x34, 0x59, 0x59, 0x43, 0x61, 0x6E, 0x72, 0x48, 0x4F, 0x51, 0x6E, 0x44, 0x69, 0x0A, 0x71, + 0x58, 0x30, 0x47, 0x4A, 0x58, 0x30, 0x6E, 0x6F, 0x66, 0x35, 0x76, 0x37, 0x4C, 0x4D, 0x65, 0x4A, 0x4E, 0x72, 0x6A, 0x53, 0x31, 0x55, 0x61, 0x41, 0x44, 0x73, 0x31, 0x74, 0x44, 0x76, 0x5A, 0x31, 0x31, 0x30, 0x77, 0x2F, 0x59, 0x45, 0x54, 0x69, + 0x66, 0x4C, 0x43, 0x42, 0x69, 0x76, 0x74, 0x5A, 0x38, 0x53, 0x4F, 0x79, 0x55, 0x4F, 0x79, 0x58, 0x47, 0x73, 0x56, 0x69, 0x51, 0x4B, 0x38, 0x59, 0x76, 0x78, 0x4F, 0x38, 0x72, 0x55, 0x7A, 0x71, 0x72, 0x4A, 0x76, 0x0A, 0x30, 0x77, 0x71, 0x69, + 0x55, 0x4F, 0x50, 0x32, 0x4F, 0x2B, 0x67, 0x75, 0x52, 0x4D, 0x4C, 0x62, 0x5A, 0x6A, 0x69, 0x70, 0x4D, 0x31, 0x5A, 0x49, 0x38, 0x57, 0x30, 0x62, 0x4D, 0x34, 0x30, 0x4E, 0x6A, 0x44, 0x39, 0x67, 0x4E, 0x35, 0x33, 0x54, 0x79, 0x6D, 0x31, 0x2B, + 0x4E, 0x48, 0x34, 0x4E, 0x6E, 0x33, 0x4A, 0x32, 0x69, 0x78, 0x75, 0x66, 0x63, 0x76, 0x31, 0x53, 0x4E, 0x55, 0x46, 0x46, 0x41, 0x70, 0x59, 0x76, 0x48, 0x4C, 0x4B, 0x61, 0x63, 0x30, 0x6B, 0x68, 0x0A, 0x73, 0x55, 0x6C, 0x48, 0x52, 0x55, 0x65, + 0x30, 0x37, 0x32, 0x6F, 0x30, 0x45, 0x63, 0x6C, 0x4E, 0x6D, 0x73, 0x78, 0x5A, 0x74, 0x39, 0x59, 0x43, 0x6E, 0x6C, 0x70, 0x4F, 0x5A, 0x62, 0x57, 0x55, 0x72, 0x68, 0x76, 0x66, 0x4B, 0x62, 0x41, 0x57, 0x38, 0x62, 0x38, 0x41, 0x6E, 0x67, 0x63, + 0x36, 0x46, 0x32, 0x53, 0x31, 0x42, 0x4C, 0x55, 0x6A, 0x49, 0x5A, 0x6B, 0x4B, 0x6C, 0x54, 0x75, 0x58, 0x66, 0x4F, 0x38, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6D, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x69, 0x6E, 0x67, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x54, 0x44, 0x43, 0x43, 0x41, 0x6A, 0x53, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x66, 0x45, 0x38, 0x45, 0x4F, 0x52, 0x7A, 0x55, 0x6D, 0x53, 0x30, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, + 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x77, 0x52, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x0A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x5A, 0x42, + 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x4F, 0x5A, 0x58, 0x52, 0x33, 0x62, 0x33, 0x4A, 0x72, 0x61, 0x57, 0x35, 0x6E, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x77, 0x0A, 0x4D, 0x44, 0x45, + 0x79, 0x4F, 0x54, 0x45, 0x30, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x77, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x45, 0x30, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x46, 0x6F, 0x77, 0x52, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x0A, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, + 0x4E, 0x30, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x5A, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x4F, 0x5A, 0x58, 0x52, 0x33, 0x62, 0x33, + 0x4A, 0x72, 0x61, 0x57, 0x35, 0x6E, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x0A, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, + 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x74, 0x49, 0x54, 0x4D, 0x4D, 0x78, 0x63, 0x75, 0x61, 0x35, 0x52, 0x73, 0x61, 0x32, 0x46, 0x53, 0x6F, 0x4F, 0x75, 0x6A, 0x7A, 0x33, 0x6D, 0x55, 0x54, 0x4F, 0x57, 0x55, 0x67, + 0x4A, 0x6E, 0x4C, 0x56, 0x57, 0x52, 0x45, 0x5A, 0x59, 0x39, 0x6E, 0x5A, 0x4F, 0x49, 0x47, 0x34, 0x31, 0x77, 0x33, 0x53, 0x66, 0x59, 0x76, 0x6D, 0x34, 0x53, 0x45, 0x0A, 0x48, 0x69, 0x33, 0x79, 0x59, 0x4A, 0x30, 0x77, 0x54, 0x73, 0x79, 0x45, + 0x68, 0x65, 0x49, 0x73, 0x7A, 0x78, 0x36, 0x65, 0x2F, 0x6A, 0x61, 0x72, 0x4D, 0x33, 0x63, 0x31, 0x52, 0x4E, 0x67, 0x31, 0x6C, 0x68, 0x6F, 0x39, 0x4E, 0x75, 0x68, 0x36, 0x44, 0x74, 0x6A, 0x56, 0x52, 0x36, 0x46, 0x71, 0x61, 0x59, 0x76, 0x5A, + 0x2F, 0x4C, 0x73, 0x36, 0x72, 0x6E, 0x6C, 0x61, 0x31, 0x66, 0x54, 0x57, 0x63, 0x62, 0x75, 0x61, 0x6B, 0x43, 0x4E, 0x72, 0x6D, 0x72, 0x65, 0x49, 0x0A, 0x64, 0x49, 0x63, 0x4D, 0x48, 0x6C, 0x2B, 0x35, 0x6E, 0x69, 0x33, 0x36, 0x71, 0x31, 0x4D, + 0x72, 0x33, 0x4C, 0x74, 0x32, 0x50, 0x70, 0x4E, 0x4D, 0x43, 0x41, 0x69, 0x4D, 0x48, 0x71, 0x49, 0x6A, 0x48, 0x4E, 0x52, 0x71, 0x72, 0x53, 0x4B, 0x36, 0x6D, 0x51, 0x45, 0x75, 0x62, 0x57, 0x58, 0x4C, 0x76, 0x69, 0x52, 0x6D, 0x56, 0x53, 0x52, + 0x4C, 0x51, 0x45, 0x53, 0x78, 0x47, 0x39, 0x66, 0x68, 0x77, 0x6F, 0x58, 0x41, 0x33, 0x68, 0x41, 0x2F, 0x50, 0x65, 0x32, 0x34, 0x0A, 0x2F, 0x50, 0x48, 0x78, 0x49, 0x31, 0x50, 0x63, 0x76, 0x32, 0x57, 0x58, 0x62, 0x39, 0x6E, 0x35, 0x51, 0x48, + 0x47, 0x4E, 0x66, 0x62, 0x32, 0x56, 0x31, 0x4D, 0x36, 0x2B, 0x6F, 0x46, 0x34, 0x6E, 0x49, 0x39, 0x37, 0x39, 0x70, 0x74, 0x41, 0x6D, 0x44, 0x67, 0x41, 0x70, 0x36, 0x7A, 0x78, 0x47, 0x38, 0x44, 0x31, 0x67, 0x76, 0x7A, 0x39, 0x51, 0x30, 0x74, + 0x77, 0x6D, 0x51, 0x56, 0x47, 0x65, 0x46, 0x44, 0x64, 0x43, 0x42, 0x4B, 0x4E, 0x77, 0x56, 0x36, 0x67, 0x62, 0x0A, 0x68, 0x2B, 0x30, 0x74, 0x2B, 0x6E, 0x76, 0x75, 0x6A, 0x41, 0x72, 0x6A, 0x71, 0x57, 0x61, 0x4A, 0x47, 0x63, 0x74, 0x42, 0x2B, + 0x64, 0x31, 0x45, 0x4E, 0x6D, 0x48, 0x50, 0x34, 0x6E, 0x64, 0x47, 0x79, 0x48, 0x33, 0x32, 0x39, 0x4A, 0x4B, 0x42, 0x4E, 0x76, 0x33, 0x62, 0x4E, 0x50, 0x46, 0x79, 0x66, 0x76, 0x4D, 0x4D, 0x46, 0x72, 0x32, 0x30, 0x46, 0x51, 0x49, 0x44, 0x41, + 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x42, 0x78, 0x2F, 0x53, 0x35, 0x35, 0x7A, 0x61, 0x77, 0x6D, 0x36, 0x69, 0x51, 0x4C, 0x53, 0x77, + 0x65, 0x6C, 0x41, 0x51, 0x55, 0x48, 0x54, 0x45, 0x79, 0x4C, 0x30, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, + 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, + 0x42, 0x41, 0x49, 0x6C, 0x58, 0x73, 0x68, 0x5A, 0x36, 0x71, 0x4D, 0x4C, 0x39, 0x31, 0x74, 0x6D, 0x62, 0x6D, 0x7A, 0x54, 0x43, 0x6E, 0x4C, 0x51, 0x79, 0x46, 0x45, 0x32, 0x6E, 0x70, 0x4E, 0x2F, 0x73, 0x76, 0x71, 0x65, 0x2B, 0x2B, 0x45, 0x50, + 0x62, 0x6B, 0x54, 0x66, 0x4F, 0x74, 0x44, 0x49, 0x75, 0x0A, 0x55, 0x46, 0x55, 0x61, 0x4E, 0x55, 0x35, 0x32, 0x51, 0x33, 0x45, 0x67, 0x37, 0x35, 0x4E, 0x33, 0x54, 0x68, 0x56, 0x77, 0x4C, 0x6F, 0x66, 0x44, 0x77, 0x52, 0x31, 0x74, 0x33, 0x4D, + 0x75, 0x31, 0x4A, 0x39, 0x51, 0x73, 0x56, 0x74, 0x46, 0x53, 0x55, 0x7A, 0x70, 0x45, 0x30, 0x6E, 0x50, 0x49, 0x78, 0x42, 0x73, 0x46, 0x5A, 0x56, 0x70, 0x69, 0x6B, 0x70, 0x7A, 0x75, 0x51, 0x59, 0x30, 0x78, 0x32, 0x2B, 0x63, 0x30, 0x36, 0x6C, + 0x6B, 0x68, 0x31, 0x51, 0x46, 0x36, 0x0A, 0x31, 0x32, 0x53, 0x34, 0x5A, 0x44, 0x6E, 0x4E, 0x79, 0x65, 0x32, 0x76, 0x37, 0x55, 0x73, 0x44, 0x53, 0x4B, 0x65, 0x67, 0x6D, 0x51, 0x47, 0x41, 0x33, 0x47, 0x57, 0x6A, 0x4E, 0x71, 0x35, 0x6C, 0x57, + 0x55, 0x68, 0x50, 0x67, 0x6B, 0x76, 0x49, 0x5A, 0x66, 0x46, 0x58, 0x48, 0x65, 0x56, 0x5A, 0x4C, 0x67, 0x6F, 0x2F, 0x62, 0x4E, 0x6A, 0x52, 0x39, 0x65, 0x55, 0x4A, 0x74, 0x47, 0x78, 0x55, 0x41, 0x41, 0x72, 0x67, 0x46, 0x55, 0x32, 0x48, 0x64, + 0x57, 0x32, 0x33, 0x0A, 0x57, 0x4A, 0x5A, 0x61, 0x33, 0x57, 0x33, 0x53, 0x41, 0x4B, 0x44, 0x30, 0x6D, 0x30, 0x69, 0x2B, 0x77, 0x7A, 0x65, 0x6B, 0x75, 0x6A, 0x62, 0x67, 0x66, 0x49, 0x65, 0x46, 0x6C, 0x78, 0x6F, 0x56, 0x6F, 0x74, 0x34, 0x75, + 0x6F, 0x6C, 0x75, 0x39, 0x72, 0x78, 0x6A, 0x35, 0x6B, 0x46, 0x44, 0x4E, 0x63, 0x46, 0x6E, 0x34, 0x4A, 0x32, 0x64, 0x48, 0x79, 0x38, 0x65, 0x67, 0x42, 0x7A, 0x70, 0x39, 0x30, 0x53, 0x78, 0x64, 0x62, 0x42, 0x6B, 0x36, 0x5A, 0x72, 0x56, 0x39, + 0x0A, 0x2F, 0x5A, 0x46, 0x76, 0x67, 0x72, 0x47, 0x2B, 0x43, 0x4A, 0x50, 0x62, 0x46, 0x45, 0x66, 0x78, 0x6F, 0x6A, 0x66, 0x48, 0x52, 0x5A, 0x34, 0x38, 0x78, 0x33, 0x65, 0x76, 0x5A, 0x4B, 0x69, 0x54, 0x33, 0x2F, 0x5A, 0x70, 0x67, 0x34, 0x4A, + 0x67, 0x38, 0x6B, 0x6C, 0x43, 0x4E, 0x4F, 0x31, 0x61, 0x41, 0x46, 0x53, 0x46, 0x48, 0x42, 0x59, 0x32, 0x6B, 0x67, 0x78, 0x63, 0x2B, 0x71, 0x61, 0x74, 0x76, 0x39, 0x73, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6D, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6D, 0x69, 0x75, 0x6D, 0x0A, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x52, 0x6A, 0x43, 0x43, 0x41, 0x79, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x62, 0x59, 0x77, 0x55, 0x52, 0x72, 0x47, 0x6D, 0x43, 0x75, 0x34, 0x77, 0x44, 0x51, 0x59, + 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x51, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, + 0x53, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, + 0x4E, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x51, 0x63, 0x6D, 0x56, 0x74, 0x61, 0x58, 0x56, 0x74, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x77, 0x4D, 0x44, 0x45, 0x79, 0x0A, 0x4F, + 0x54, 0x45, 0x30, 0x4D, 0x54, 0x41, 0x7A, 0x4E, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x45, 0x30, 0x4D, 0x54, 0x41, 0x7A, 0x4E, 0x6C, 0x6F, 0x77, 0x51, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x56, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, 0x30, + 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x4E, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x51, 0x63, 0x6D, 0x56, 0x74, 0x61, 0x58, 0x56, 0x74, + 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, + 0x43, 0x41, 0x67, 0x45, 0x41, 0x78, 0x42, 0x4C, 0x66, 0x71, 0x56, 0x2F, 0x2B, 0x51, 0x64, 0x33, 0x64, 0x39, 0x5A, 0x2B, 0x4B, 0x34, 0x2F, 0x61, 0x73, 0x34, 0x54, 0x78, 0x34, 0x6D, 0x72, 0x7A, 0x59, 0x38, 0x48, 0x39, 0x36, 0x6F, 0x44, 0x4D, + 0x71, 0x33, 0x49, 0x30, 0x67, 0x57, 0x36, 0x34, 0x74, 0x62, 0x2B, 0x65, 0x54, 0x32, 0x54, 0x5A, 0x77, 0x61, 0x6D, 0x6A, 0x50, 0x6A, 0x6C, 0x47, 0x6A, 0x68, 0x56, 0x74, 0x6E, 0x0A, 0x42, 0x4B, 0x41, 0x51, 0x4A, 0x47, 0x39, 0x64, 0x4B, 0x49, + 0x4C, 0x42, 0x6C, 0x31, 0x66, 0x59, 0x53, 0x43, 0x6B, 0x54, 0x74, 0x75, 0x47, 0x2B, 0x6B, 0x55, 0x33, 0x66, 0x68, 0x51, 0x78, 0x54, 0x47, 0x4A, 0x6F, 0x65, 0x4A, 0x4B, 0x4A, 0x50, 0x6A, 0x2F, 0x43, 0x69, 0x68, 0x51, 0x76, 0x4C, 0x39, 0x43, + 0x6C, 0x2F, 0x30, 0x71, 0x52, 0x59, 0x37, 0x69, 0x5A, 0x4E, 0x79, 0x61, 0x71, 0x6F, 0x65, 0x35, 0x72, 0x5A, 0x2B, 0x6A, 0x6A, 0x65, 0x52, 0x46, 0x63, 0x56, 0x0A, 0x35, 0x66, 0x69, 0x4D, 0x79, 0x4E, 0x6C, 0x49, 0x34, 0x67, 0x30, 0x57, 0x4A, + 0x78, 0x30, 0x65, 0x79, 0x49, 0x4F, 0x46, 0x4A, 0x62, 0x65, 0x36, 0x71, 0x6C, 0x56, 0x42, 0x7A, 0x41, 0x4D, 0x69, 0x53, 0x79, 0x32, 0x52, 0x6A, 0x59, 0x76, 0x6D, 0x69, 0x61, 0x39, 0x6D, 0x78, 0x2B, 0x6E, 0x2F, 0x4B, 0x2B, 0x6B, 0x38, 0x72, + 0x4E, 0x72, 0x53, 0x73, 0x38, 0x50, 0x68, 0x61, 0x4A, 0x79, 0x4A, 0x2B, 0x48, 0x6F, 0x41, 0x56, 0x74, 0x37, 0x30, 0x56, 0x5A, 0x56, 0x73, 0x0A, 0x2B, 0x37, 0x70, 0x6B, 0x33, 0x57, 0x4B, 0x4C, 0x33, 0x77, 0x74, 0x33, 0x4D, 0x75, 0x74, 0x69, + 0x7A, 0x43, 0x61, 0x61, 0x6D, 0x37, 0x75, 0x71, 0x59, 0x6F, 0x4E, 0x4D, 0x74, 0x41, 0x5A, 0x36, 0x4D, 0x4D, 0x67, 0x70, 0x76, 0x2B, 0x30, 0x47, 0x54, 0x5A, 0x65, 0x35, 0x48, 0x4D, 0x51, 0x78, 0x4B, 0x39, 0x56, 0x66, 0x76, 0x46, 0x4D, 0x53, + 0x46, 0x35, 0x79, 0x5A, 0x56, 0x79, 0x6C, 0x6D, 0x64, 0x32, 0x45, 0x68, 0x4D, 0x51, 0x63, 0x75, 0x4A, 0x55, 0x6D, 0x64, 0x0A, 0x47, 0x50, 0x4C, 0x75, 0x38, 0x79, 0x74, 0x78, 0x6A, 0x4C, 0x57, 0x36, 0x4F, 0x51, 0x64, 0x4A, 0x64, 0x2F, 0x7A, + 0x76, 0x4C, 0x70, 0x4B, 0x51, 0x42, 0x59, 0x30, 0x74, 0x4C, 0x33, 0x64, 0x37, 0x37, 0x30, 0x4F, 0x2F, 0x4E, 0x62, 0x75, 0x61, 0x32, 0x50, 0x6C, 0x7A, 0x70, 0x79, 0x7A, 0x79, 0x30, 0x46, 0x66, 0x75, 0x4B, 0x45, 0x34, 0x6D, 0x58, 0x34, 0x2B, + 0x51, 0x61, 0x41, 0x6B, 0x76, 0x75, 0x50, 0x6A, 0x63, 0x42, 0x75, 0x6B, 0x75, 0x6D, 0x6A, 0x35, 0x52, 0x0A, 0x70, 0x39, 0x45, 0x69, 0x78, 0x41, 0x71, 0x6E, 0x4F, 0x45, 0x68, 0x73, 0x73, 0x2F, 0x6E, 0x2F, 0x66, 0x61, 0x75, 0x47, 0x56, 0x2B, + 0x4F, 0x36, 0x31, 0x6F, 0x56, 0x34, 0x64, 0x37, 0x70, 0x44, 0x36, 0x6B, 0x68, 0x2F, 0x39, 0x74, 0x69, 0x2B, 0x49, 0x32, 0x30, 0x65, 0x76, 0x39, 0x45, 0x32, 0x62, 0x46, 0x68, 0x63, 0x38, 0x65, 0x36, 0x6B, 0x47, 0x56, 0x51, 0x61, 0x39, 0x51, + 0x50, 0x53, 0x64, 0x75, 0x62, 0x68, 0x6A, 0x4C, 0x30, 0x38, 0x73, 0x39, 0x4E, 0x49, 0x0A, 0x53, 0x2B, 0x4C, 0x49, 0x2B, 0x48, 0x2B, 0x53, 0x71, 0x48, 0x5A, 0x47, 0x6E, 0x45, 0x4A, 0x6C, 0x50, 0x71, 0x51, 0x65, 0x77, 0x51, 0x63, 0x44, 0x57, + 0x6B, 0x59, 0x74, 0x75, 0x4A, 0x66, 0x7A, 0x74, 0x39, 0x57, 0x79, 0x56, 0x53, 0x48, 0x76, 0x75, 0x74, 0x78, 0x4D, 0x41, 0x4A, 0x66, 0x37, 0x46, 0x4A, 0x55, 0x6E, 0x4D, 0x37, 0x2F, 0x6F, 0x51, 0x30, 0x64, 0x47, 0x30, 0x67, 0x69, 0x5A, 0x46, + 0x6D, 0x41, 0x37, 0x6D, 0x6E, 0x37, 0x53, 0x35, 0x75, 0x30, 0x34, 0x0A, 0x36, 0x75, 0x77, 0x42, 0x48, 0x6A, 0x78, 0x49, 0x56, 0x6B, 0x6B, 0x4A, 0x78, 0x30, 0x77, 0x33, 0x41, 0x4A, 0x36, 0x49, 0x44, 0x73, 0x42, 0x7A, 0x34, 0x57, 0x39, 0x6D, + 0x36, 0x58, 0x4A, 0x48, 0x4D, 0x44, 0x34, 0x51, 0x35, 0x51, 0x73, 0x44, 0x79, 0x5A, 0x70, 0x43, 0x41, 0x47, 0x7A, 0x46, 0x6C, 0x48, 0x35, 0x68, 0x78, 0x49, 0x72, 0x66, 0x66, 0x34, 0x49, 0x61, 0x43, 0x31, 0x6E, 0x45, 0x57, 0x54, 0x4A, 0x33, + 0x73, 0x37, 0x78, 0x67, 0x61, 0x56, 0x59, 0x35, 0x0A, 0x2F, 0x62, 0x51, 0x47, 0x65, 0x79, 0x7A, 0x57, 0x5A, 0x44, 0x62, 0x5A, 0x76, 0x55, 0x6A, 0x74, 0x68, 0x42, 0x39, 0x2B, 0x70, 0x53, 0x4B, 0x50, 0x4B, 0x72, 0x68, 0x43, 0x39, 0x49, 0x4B, + 0x33, 0x31, 0x46, 0x4F, 0x51, 0x65, 0x45, 0x34, 0x74, 0x47, 0x76, 0x32, 0x42, 0x62, 0x30, 0x54, 0x58, 0x4F, 0x77, 0x46, 0x30, 0x6C, 0x6B, 0x4C, 0x67, 0x41, 0x4F, 0x49, 0x75, 0x61, 0x2B, 0x72, 0x46, 0x37, 0x6E, 0x4B, 0x73, 0x75, 0x37, 0x2F, + 0x2B, 0x36, 0x71, 0x71, 0x6F, 0x0A, 0x2B, 0x4E, 0x7A, 0x32, 0x73, 0x6E, 0x6D, 0x4B, 0x74, 0x6D, 0x63, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, + 0x59, 0x45, 0x46, 0x4A, 0x33, 0x41, 0x5A, 0x36, 0x59, 0x4D, 0x49, 0x74, 0x6B, 0x6D, 0x39, 0x55, 0x57, 0x72, 0x70, 0x6D, 0x56, 0x53, 0x45, 0x53, 0x66, 0x59, 0x52, 0x61, 0x78, 0x6A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, + 0x45, 0x42, 0x0A, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, + 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x44, 0x41, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x43, 0x7A, 0x56, 0x30, 0x30, 0x51, 0x59, 0x6B, 0x34, 0x36, 0x35, 0x4B, 0x7A, 0x71, 0x75, 0x42, 0x79, 0x76, 0x0A, + 0x4D, 0x69, 0x50, 0x49, 0x73, 0x30, 0x6C, 0x61, 0x55, 0x5A, 0x78, 0x32, 0x4B, 0x49, 0x31, 0x35, 0x71, 0x6C, 0x64, 0x47, 0x46, 0x39, 0x58, 0x31, 0x55, 0x76, 0x61, 0x33, 0x52, 0x4F, 0x67, 0x49, 0x52, 0x4C, 0x38, 0x59, 0x68, 0x4E, 0x49, 0x4C, + 0x67, 0x4D, 0x33, 0x46, 0x45, 0x76, 0x30, 0x41, 0x56, 0x51, 0x56, 0x68, 0x68, 0x30, 0x48, 0x63, 0x74, 0x53, 0x53, 0x65, 0x50, 0x4D, 0x54, 0x59, 0x79, 0x50, 0x74, 0x77, 0x6E, 0x69, 0x39, 0x34, 0x6C, 0x6F, 0x4D, 0x67, 0x0A, 0x4E, 0x74, 0x35, + 0x38, 0x44, 0x32, 0x6B, 0x54, 0x69, 0x4B, 0x56, 0x31, 0x4E, 0x70, 0x67, 0x49, 0x70, 0x73, 0x62, 0x66, 0x72, 0x4D, 0x37, 0x6A, 0x57, 0x4E, 0x61, 0x33, 0x50, 0x74, 0x36, 0x36, 0x38, 0x2B, 0x73, 0x30, 0x51, 0x4E, 0x69, 0x69, 0x67, 0x66, 0x56, + 0x34, 0x50, 0x79, 0x2F, 0x56, 0x70, 0x66, 0x7A, 0x5A, 0x6F, 0x74, 0x52, 0x65, 0x42, 0x41, 0x34, 0x58, 0x72, 0x66, 0x35, 0x42, 0x38, 0x4F, 0x57, 0x79, 0x63, 0x76, 0x70, 0x45, 0x67, 0x6A, 0x4E, 0x43, 0x0A, 0x36, 0x43, 0x31, 0x59, 0x39, 0x31, + 0x61, 0x4D, 0x59, 0x6A, 0x2B, 0x36, 0x51, 0x72, 0x43, 0x63, 0x44, 0x46, 0x78, 0x2B, 0x4C, 0x6D, 0x55, 0x6D, 0x58, 0x46, 0x4E, 0x50, 0x41, 0x4C, 0x4A, 0x34, 0x66, 0x71, 0x45, 0x4E, 0x6D, 0x53, 0x32, 0x4E, 0x75, 0x42, 0x32, 0x4F, 0x6F, 0x73, + 0x53, 0x77, 0x2F, 0x57, 0x44, 0x51, 0x4D, 0x4B, 0x53, 0x4F, 0x79, 0x41, 0x52, 0x69, 0x71, 0x63, 0x54, 0x74, 0x4E, 0x64, 0x35, 0x36, 0x6C, 0x2B, 0x30, 0x4F, 0x4F, 0x46, 0x36, 0x53, 0x0A, 0x4C, 0x35, 0x4E, 0x77, 0x70, 0x61, 0x6D, 0x63, 0x62, + 0x36, 0x64, 0x39, 0x45, 0x78, 0x31, 0x2B, 0x78, 0x67, 0x68, 0x49, 0x73, 0x56, 0x35, 0x6E, 0x36, 0x31, 0x45, 0x49, 0x4A, 0x65, 0x6E, 0x6D, 0x4A, 0x57, 0x74, 0x53, 0x4B, 0x5A, 0x47, 0x63, 0x30, 0x6A, 0x6C, 0x7A, 0x43, 0x46, 0x66, 0x65, 0x6D, + 0x51, 0x61, 0x30, 0x57, 0x35, 0x30, 0x51, 0x42, 0x75, 0x48, 0x43, 0x41, 0x4B, 0x69, 0x34, 0x48, 0x45, 0x6F, 0x43, 0x43, 0x68, 0x54, 0x51, 0x77, 0x55, 0x48, 0x4B, 0x0A, 0x2B, 0x34, 0x77, 0x31, 0x49, 0x58, 0x32, 0x43, 0x4F, 0x50, 0x4B, 0x70, + 0x56, 0x4A, 0x45, 0x5A, 0x4E, 0x5A, 0x4F, 0x55, 0x62, 0x57, 0x6F, 0x36, 0x78, 0x62, 0x4C, 0x51, 0x75, 0x34, 0x6D, 0x47, 0x6B, 0x2B, 0x69, 0x62, 0x79, 0x51, 0x38, 0x36, 0x70, 0x33, 0x71, 0x34, 0x6F, 0x66, 0x42, 0x34, 0x52, 0x76, 0x72, 0x38, + 0x4E, 0x79, 0x2F, 0x6C, 0x69, 0x6F, 0x54, 0x7A, 0x33, 0x2F, 0x34, 0x45, 0x32, 0x61, 0x46, 0x6F, 0x6F, 0x43, 0x38, 0x6B, 0x34, 0x67, 0x6D, 0x56, 0x0A, 0x42, 0x74, 0x57, 0x56, 0x79, 0x75, 0x45, 0x6B, 0x6C, 0x75, 0x74, 0x38, 0x39, 0x70, 0x4D, + 0x46, 0x75, 0x2B, 0x31, 0x7A, 0x36, 0x53, 0x33, 0x52, 0x64, 0x54, 0x6E, 0x58, 0x35, 0x79, 0x54, 0x62, 0x32, 0x45, 0x35, 0x66, 0x51, 0x34, 0x2B, 0x65, 0x30, 0x42, 0x51, 0x35, 0x76, 0x31, 0x56, 0x77, 0x53, 0x4A, 0x6C, 0x58, 0x4D, 0x62, 0x53, + 0x63, 0x37, 0x6B, 0x71, 0x59, 0x41, 0x35, 0x59, 0x77, 0x48, 0x32, 0x41, 0x47, 0x37, 0x68, 0x73, 0x6A, 0x2F, 0x6F, 0x46, 0x67, 0x0A, 0x49, 0x78, 0x70, 0x48, 0x59, 0x6F, 0x57, 0x6C, 0x7A, 0x42, 0x6B, 0x30, 0x67, 0x47, 0x2B, 0x7A, 0x72, 0x42, + 0x72, 0x6A, 0x6E, 0x2F, 0x42, 0x37, 0x53, 0x4B, 0x33, 0x56, 0x41, 0x64, 0x6C, 0x6E, 0x74, 0x71, 0x6C, 0x79, 0x6B, 0x2B, 0x6F, 0x74, 0x5A, 0x72, 0x57, 0x79, 0x75, 0x4F, 0x51, 0x39, 0x50, 0x4C, 0x4C, 0x76, 0x54, 0x49, 0x7A, 0x71, 0x36, 0x77, + 0x65, 0x2F, 0x71, 0x7A, 0x57, 0x61, 0x56, 0x59, 0x61, 0x38, 0x47, 0x4B, 0x61, 0x31, 0x71, 0x46, 0x36, 0x30, 0x0A, 0x67, 0x32, 0x78, 0x72, 0x61, 0x55, 0x44, 0x54, 0x6E, 0x39, 0x7A, 0x78, 0x77, 0x32, 0x6C, 0x72, 0x75, 0x65, 0x46, 0x74, 0x43, + 0x66, 0x54, 0x78, 0x71, 0x6C, 0x42, 0x32, 0x43, 0x6E, 0x70, 0x39, 0x65, 0x68, 0x65, 0x68, 0x56, 0x5A, 0x5A, 0x43, 0x6D, 0x54, 0x45, 0x4A, 0x33, 0x57, 0x41, 0x52, 0x6A, 0x51, 0x55, 0x77, 0x66, 0x75, 0x61, 0x4F, 0x52, 0x74, 0x47, 0x64, 0x46, + 0x4E, 0x72, 0x48, 0x46, 0x2B, 0x51, 0x46, 0x6C, 0x6F, 0x7A, 0x45, 0x4A, 0x4C, 0x55, 0x62, 0x0A, 0x7A, 0x78, 0x51, 0x48, 0x73, 0x6B, 0x44, 0x34, 0x6F, 0x35, 0x35, 0x42, 0x68, 0x72, 0x77, 0x45, 0x30, 0x47, 0x75, 0x57, 0x79, 0x43, 0x71, 0x41, + 0x4E, 0x50, 0x32, 0x2F, 0x37, 0x77, 0x61, 0x6A, 0x33, 0x56, 0x6A, 0x46, 0x68, 0x54, 0x30, 0x2B, 0x6A, 0x2F, 0x36, 0x65, 0x4B, 0x65, 0x43, 0x32, 0x75, 0x41, 0x6C, 0x6F, 0x47, 0x52, 0x77, 0x59, 0x51, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x66, 0x66, 0x69, 0x72, 0x6D, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x72, 0x65, 0x6D, + 0x69, 0x75, 0x6D, 0x20, 0x45, 0x43, 0x43, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, + 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x42, 0x2F, 0x6A, 0x43, 0x43, 0x41, 0x59, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, + 0x64, 0x4A, 0x63, 0x6C, 0x69, 0x73, 0x63, 0x2F, 0x65, 0x6C, 0x51, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x52, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x30, 0x46, 0x6D, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x53, 0x41, + 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x64, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x51, 0x63, 0x6D, 0x56, 0x74, 0x61, 0x58, 0x56, 0x74, 0x49, 0x45, 0x56, + 0x44, 0x51, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x44, 0x41, 0x78, 0x0A, 0x4D, 0x6A, 0x6B, 0x78, 0x4E, 0x44, 0x49, 0x77, 0x4D, 0x6A, 0x52, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x44, 0x45, 0x79, 0x4D, 0x7A, 0x45, 0x78, 0x4E, 0x44, + 0x49, 0x77, 0x4D, 0x6A, 0x52, 0x61, 0x4D, 0x45, 0x55, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x51, 0x77, 0x45, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, + 0x74, 0x42, 0x5A, 0x6D, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x55, 0x0A, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x44, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x58, 0x51, 0x57, 0x5A, 0x6D, 0x61, 0x58, 0x4A, 0x74, 0x56, + 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x48, 0x4A, 0x6C, 0x62, 0x57, 0x6C, 0x31, 0x62, 0x53, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, + 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x0A, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, 0x4E, 0x4D, 0x46, 0x34, 0x62, 0x46, 0x5A, 0x30, 0x44, 0x30, 0x4B, 0x46, 0x35, 0x4E, 0x62, 0x63, 0x36, 0x50, 0x4A, 0x4A, 0x36, 0x79, 0x68, 0x55, 0x63, + 0x7A, 0x57, 0x4C, 0x7A, 0x6E, 0x43, 0x5A, 0x63, 0x42, 0x7A, 0x33, 0x6C, 0x56, 0x50, 0x71, 0x6A, 0x31, 0x73, 0x77, 0x53, 0x36, 0x76, 0x51, 0x55, 0x58, 0x2B, 0x69, 0x4F, 0x47, 0x61, 0x73, 0x76, 0x4C, 0x6B, 0x6A, 0x6D, 0x72, 0x42, 0x68, 0x44, + 0x65, 0x4B, 0x7A, 0x51, 0x0A, 0x4E, 0x38, 0x4F, 0x39, 0x73, 0x73, 0x30, 0x73, 0x35, 0x6B, 0x66, 0x69, 0x47, 0x75, 0x5A, 0x6A, 0x75, 0x44, 0x30, 0x75, 0x4C, 0x33, 0x6A, 0x45, 0x54, 0x39, 0x76, 0x30, 0x44, 0x36, 0x52, 0x6F, 0x54, 0x46, 0x56, + 0x79, 0x61, 0x35, 0x55, 0x64, 0x54, 0x68, 0x68, 0x43, 0x6C, 0x58, 0x6A, 0x4D, 0x4E, 0x7A, 0x79, 0x52, 0x34, 0x70, 0x74, 0x6C, 0x4B, 0x79, 0x6D, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, + 0x57, 0x0A, 0x42, 0x42, 0x53, 0x61, 0x72, 0x79, 0x6C, 0x36, 0x77, 0x42, 0x45, 0x31, 0x4E, 0x53, 0x5A, 0x52, 0x4D, 0x41, 0x44, 0x44, 0x61, 0x76, 0x35, 0x41, 0x31, 0x61, 0x37, 0x57, 0x50, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, + 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4B, 0x0A, 0x42, + 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6E, 0x41, 0x44, 0x42, 0x6B, 0x41, 0x6A, 0x41, 0x58, 0x43, 0x66, 0x4F, 0x48, 0x69, 0x46, 0x42, 0x61, 0x72, 0x38, 0x6A, 0x41, 0x51, 0x72, 0x39, 0x48, 0x58, + 0x2F, 0x56, 0x73, 0x61, 0x6F, 0x62, 0x67, 0x78, 0x43, 0x64, 0x30, 0x35, 0x44, 0x68, 0x54, 0x31, 0x77, 0x56, 0x2F, 0x47, 0x7A, 0x54, 0x6A, 0x78, 0x69, 0x2B, 0x7A, 0x79, 0x67, 0x6B, 0x38, 0x4E, 0x35, 0x33, 0x58, 0x0A, 0x35, 0x37, 0x68, 0x47, + 0x38, 0x66, 0x32, 0x68, 0x34, 0x6E, 0x45, 0x43, 0x4D, 0x45, 0x4A, 0x5A, 0x68, 0x30, 0x50, 0x55, 0x55, 0x64, 0x2B, 0x36, 0x30, 0x77, 0x6B, 0x79, 0x57, 0x73, 0x36, 0x49, 0x66, 0x6C, 0x63, 0x39, 0x6E, 0x46, 0x39, 0x43, 0x61, 0x2F, 0x55, 0x48, + 0x4C, 0x62, 0x58, 0x77, 0x67, 0x70, 0x50, 0x35, 0x57, 0x57, 0x2B, 0x75, 0x5A, 0x50, 0x70, 0x59, 0x35, 0x59, 0x73, 0x65, 0x34, 0x32, 0x4F, 0x2B, 0x74, 0x59, 0x48, 0x4E, 0x62, 0x77, 0x4B, 0x4D, 0x0A, 0x65, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6D, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x75, 0x7A, 0x43, 0x43, 0x41, 0x71, 0x4F, 0x67, 0x41, 0x77, 0x49, + 0x42, 0x41, 0x67, 0x49, 0x44, 0x42, 0x45, 0x54, 0x41, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x4D, 0x48, 0x34, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x42, 0x4D, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x45, 0x78, 0x6C, 0x56, 0x62, 0x6D, 0x6C, 0x36, 0x5A, 0x58, 0x52, 0x76, 0x49, 0x46, 0x52, 0x6C, 0x59, 0x32, + 0x68, 0x75, 0x62, 0x32, 0x78, 0x76, 0x5A, 0x32, 0x6C, 0x6C, 0x63, 0x79, 0x42, 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x35, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, + 0x30, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x49, 0x6A, 0x41, 0x67, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x47, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x31, 0x62, 0x53, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x47, 0x56, 0x6B, 0x49, 0x45, 0x35, 0x6C, 0x64, 0x48, 0x64, 0x76, 0x63, 0x6D, 0x73, 0x67, 0x51, + 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x78, 0x4D, 0x44, 0x49, 0x79, 0x0A, 0x4D, 0x54, 0x49, 0x77, 0x4E, 0x7A, 0x4D, 0x33, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x6B, 0x78, 0x4D, 0x6A, 0x4D, 0x78, 0x4D, 0x54, 0x49, 0x77, + 0x4E, 0x7A, 0x4D, 0x33, 0x57, 0x6A, 0x42, 0x2B, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x51, 0x54, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, + 0x56, 0x57, 0x35, 0x70, 0x65, 0x6D, 0x56, 0x30, 0x62, 0x79, 0x42, 0x55, 0x0A, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x67, 0x55, 0x79, 0x35, 0x42, 0x4C, 0x6A, 0x45, 0x6E, 0x4D, 0x43, 0x55, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x65, 0x51, 0x32, 0x56, 0x79, 0x64, 0x48, 0x56, 0x74, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, + 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x0A, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, 0x67, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, + 0x52, 0x6C, 0x5A, 0x43, 0x42, 0x4F, 0x5A, 0x58, 0x52, 0x33, 0x62, 0x33, 0x4A, 0x72, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, + 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x0A, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x34, 0x2F, 0x74, 0x39, 0x6F, 0x33, 0x4B, 0x36, 0x77, 0x76, 0x44, 0x4A, 0x46, 0x49, 0x66, 0x31, 0x61, + 0x77, 0x46, 0x4F, 0x34, 0x57, 0x35, 0x41, 0x42, 0x37, 0x70, 0x74, 0x4A, 0x31, 0x31, 0x2F, 0x39, 0x31, 0x73, 0x74, 0x73, 0x31, 0x72, 0x48, 0x55, 0x56, 0x2B, 0x72, 0x70, 0x44, 0x4B, 0x6D, 0x59, 0x59, 0x65, 0x32, 0x62, 0x67, 0x2B, 0x47, 0x30, + 0x6A, 0x41, 0x43, 0x0A, 0x6C, 0x2F, 0x6A, 0x58, 0x61, 0x56, 0x65, 0x68, 0x47, 0x44, 0x6C, 0x64, 0x61, 0x6D, 0x52, 0x35, 0x78, 0x67, 0x46, 0x5A, 0x72, 0x44, 0x77, 0x78, 0x53, 0x6A, 0x68, 0x38, 0x30, 0x67, 0x54, 0x53, 0x53, 0x79, 0x6A, 0x6F, + 0x49, 0x46, 0x38, 0x37, 0x42, 0x36, 0x4C, 0x4D, 0x54, 0x58, 0x50, 0x62, 0x38, 0x36, 0x35, 0x50, 0x78, 0x31, 0x62, 0x56, 0x57, 0x71, 0x65, 0x57, 0x69, 0x66, 0x72, 0x7A, 0x71, 0x32, 0x6A, 0x55, 0x49, 0x34, 0x5A, 0x5A, 0x4A, 0x38, 0x38, 0x4A, + 0x0A, 0x4A, 0x37, 0x79, 0x73, 0x62, 0x6E, 0x4B, 0x44, 0x48, 0x44, 0x42, 0x79, 0x33, 0x2B, 0x43, 0x69, 0x36, 0x64, 0x4C, 0x68, 0x64, 0x48, 0x55, 0x5A, 0x76, 0x53, 0x71, 0x65, 0x65, 0x78, 0x56, 0x55, 0x42, 0x42, 0x76, 0x58, 0x51, 0x7A, 0x6D, + 0x74, 0x56, 0x53, 0x6A, 0x46, 0x34, 0x68, 0x71, 0x37, 0x39, 0x4D, 0x44, 0x6B, 0x72, 0x6A, 0x68, 0x4A, 0x4D, 0x38, 0x78, 0x32, 0x68, 0x5A, 0x38, 0x35, 0x52, 0x64, 0x4B, 0x6B, 0x6E, 0x76, 0x49, 0x53, 0x6A, 0x46, 0x48, 0x34, 0x0A, 0x66, 0x4F, + 0x51, 0x74, 0x66, 0x2F, 0x57, 0x73, 0x58, 0x2B, 0x73, 0x57, 0x6E, 0x37, 0x45, 0x74, 0x30, 0x62, 0x72, 0x4D, 0x6B, 0x55, 0x4A, 0x33, 0x54, 0x43, 0x58, 0x4A, 0x6B, 0x44, 0x68, 0x76, 0x32, 0x2F, 0x44, 0x4D, 0x2B, 0x34, 0x34, 0x65, 0x6C, 0x31, + 0x6B, 0x2B, 0x31, 0x57, 0x42, 0x4F, 0x35, 0x67, 0x55, 0x6F, 0x37, 0x55, 0x6C, 0x35, 0x45, 0x30, 0x75, 0x36, 0x53, 0x4E, 0x73, 0x76, 0x2B, 0x58, 0x4C, 0x54, 0x4F, 0x63, 0x72, 0x2B, 0x48, 0x39, 0x67, 0x30, 0x0A, 0x63, 0x76, 0x57, 0x30, 0x51, + 0x4D, 0x38, 0x78, 0x41, 0x63, 0x50, 0x73, 0x33, 0x68, 0x45, 0x74, 0x46, 0x31, 0x30, 0x66, 0x75, 0x46, 0x44, 0x52, 0x58, 0x68, 0x6D, 0x6E, 0x61, 0x64, 0x34, 0x48, 0x4D, 0x79, 0x6A, 0x4B, 0x55, 0x4A, 0x58, 0x35, 0x70, 0x31, 0x54, 0x4C, 0x56, + 0x49, 0x5A, 0x51, 0x52, 0x61, 0x6E, 0x35, 0x53, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x0A, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, + 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x51, 0x49, 0x64, 0x73, 0x33, 0x4C, 0x42, 0x2F, 0x38, 0x6B, 0x39, 0x73, 0x58, 0x4E, 0x37, 0x62, 0x75, 0x51, 0x76, 0x4F, 0x4B, 0x45, + 0x4E, 0x30, 0x5A, 0x31, 0x39, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, + 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4B, 0x61, 0x6F, 0x72, 0x53, 0x4C, 0x4F, 0x41, 0x54, 0x32, 0x6D, 0x6F, 0x2F, 0x39, 0x69, 0x30, 0x45, 0x69, 0x64, 0x69, 0x31, 0x35, 0x79, 0x73, 0x48, 0x68, + 0x45, 0x34, 0x39, 0x77, 0x63, 0x72, 0x77, 0x6E, 0x39, 0x49, 0x30, 0x6A, 0x36, 0x76, 0x53, 0x72, 0x45, 0x75, 0x56, 0x55, 0x45, 0x74, 0x52, 0x43, 0x6A, 0x0A, 0x6A, 0x53, 0x66, 0x65, 0x43, 0x34, 0x4A, 0x6A, 0x30, 0x4F, 0x37, 0x65, 0x44, 0x44, + 0x64, 0x35, 0x51, 0x56, 0x73, 0x69, 0x73, 0x72, 0x43, 0x61, 0x51, 0x56, 0x79, 0x6D, 0x63, 0x4F, 0x44, 0x55, 0x30, 0x48, 0x66, 0x4C, 0x49, 0x39, 0x4D, 0x41, 0x34, 0x47, 0x78, 0x57, 0x4C, 0x2B, 0x46, 0x70, 0x44, 0x51, 0x33, 0x5A, 0x71, 0x72, + 0x38, 0x68, 0x67, 0x56, 0x44, 0x5A, 0x42, 0x71, 0x57, 0x6F, 0x2F, 0x35, 0x55, 0x33, 0x30, 0x4B, 0x72, 0x2B, 0x34, 0x72, 0x50, 0x31, 0x0A, 0x6D, 0x53, 0x31, 0x46, 0x68, 0x49, 0x72, 0x6C, 0x51, 0x67, 0x6E, 0x58, 0x64, 0x41, 0x49, 0x76, 0x39, + 0x34, 0x6E, 0x59, 0x6D, 0x65, 0x6D, 0x38, 0x4A, 0x39, 0x52, 0x48, 0x6A, 0x62, 0x6F, 0x4E, 0x52, 0x68, 0x78, 0x33, 0x7A, 0x78, 0x53, 0x6B, 0x48, 0x4C, 0x6D, 0x6B, 0x4D, 0x63, 0x53, 0x63, 0x4B, 0x48, 0x51, 0x44, 0x4E, 0x50, 0x38, 0x7A, 0x47, + 0x53, 0x61, 0x6C, 0x36, 0x51, 0x31, 0x30, 0x74, 0x7A, 0x36, 0x58, 0x78, 0x6E, 0x62, 0x6F, 0x4A, 0x35, 0x61, 0x6A, 0x0A, 0x5A, 0x74, 0x33, 0x68, 0x72, 0x76, 0x4A, 0x42, 0x57, 0x38, 0x71, 0x59, 0x56, 0x6F, 0x4E, 0x7A, 0x63, 0x4F, 0x53, 0x47, + 0x47, 0x74, 0x49, 0x78, 0x51, 0x62, 0x6F, 0x76, 0x76, 0x69, 0x30, 0x54, 0x57, 0x6E, 0x5A, 0x76, 0x54, 0x75, 0x68, 0x4F, 0x67, 0x51, 0x34, 0x2F, 0x57, 0x77, 0x4D, 0x69, 0x6F, 0x42, 0x4B, 0x2B, 0x5A, 0x6C, 0x67, 0x52, 0x53, 0x73, 0x73, 0x44, + 0x78, 0x4C, 0x51, 0x71, 0x4B, 0x69, 0x32, 0x57, 0x46, 0x2B, 0x41, 0x35, 0x56, 0x4C, 0x78, 0x49, 0x0A, 0x30, 0x33, 0x59, 0x6E, 0x6E, 0x5A, 0x6F, 0x74, 0x42, 0x71, 0x62, 0x4A, 0x37, 0x44, 0x6E, 0x53, 0x71, 0x39, 0x75, 0x66, 0x6D, 0x67, 0x73, + 0x6E, 0x41, 0x6A, 0x55, 0x70, 0x73, 0x55, 0x43, 0x56, 0x35, 0x2F, 0x6E, 0x6F, 0x6E, 0x46, 0x57, 0x49, 0x47, 0x55, 0x62, 0x57, 0x74, 0x7A, 0x54, 0x31, 0x66, 0x73, 0x34, 0x35, 0x6D, 0x74, 0x6B, 0x34, 0x38, 0x56, 0x48, 0x33, 0x54, 0x79, 0x77, + 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x57, 0x43, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x65, 0x7A, 0x43, 0x43, 0x41, 0x6D, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, + 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x44, 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x55, 0x56, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, + 0x4A, 0x0A, 0x56, 0x45, 0x46, 0x4A, 0x56, 0x30, 0x46, 0x4F, 0x4C, 0x55, 0x4E, 0x42, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x44, 0x41, 0x64, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x53, + 0x6F, 0x77, 0x4B, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x46, 0x55, 0x56, 0x30, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x0A, 0x64, + 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x77, 0x4F, 0x44, 0x49, 0x34, 0x4D, 0x44, 0x63, 0x79, 0x4E, 0x44, 0x4D, 0x7A, 0x57, + 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x41, 0x78, 0x4D, 0x6A, 0x4D, 0x78, 0x4D, 0x54, 0x55, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x55, + 0x56, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x4A, 0x56, 0x45, 0x46, 0x4A, 0x56, 0x30, 0x46, 0x4F, 0x4C, 0x55, 0x4E, 0x42, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, + 0x44, 0x41, 0x64, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x53, 0x6F, 0x77, 0x4B, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x46, 0x55, 0x56, 0x30, 0x4E, 0x42, 0x0A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, + 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, + 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x0A, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x77, 0x66, 0x6E, + 0x4B, 0x34, 0x70, 0x41, 0x4F, 0x55, 0x35, 0x71, 0x66, 0x65, 0x43, 0x54, 0x69, 0x52, 0x53, 0x68, 0x46, 0x41, 0x68, 0x36, 0x64, 0x38, 0x57, 0x57, 0x51, 0x55, 0x65, 0x37, 0x55, 0x52, 0x45, 0x4E, 0x33, 0x2B, 0x76, 0x39, 0x58, 0x41, 0x75, 0x31, + 0x62, 0x69, 0x68, 0x53, 0x58, 0x30, 0x4E, 0x58, 0x49, 0x50, 0x2B, 0x46, 0x50, 0x51, 0x51, 0x65, 0x46, 0x45, 0x41, 0x63, 0x4B, 0x30, 0x48, 0x4D, 0x4D, 0x78, 0x0A, 0x51, 0x68, 0x5A, 0x48, 0x68, 0x54, 0x4D, 0x69, 0x64, 0x72, 0x49, 0x4B, 0x62, + 0x77, 0x2F, 0x6C, 0x4A, 0x56, 0x42, 0x50, 0x68, 0x59, 0x61, 0x2B, 0x76, 0x35, 0x67, 0x75, 0x45, 0x47, 0x63, 0x65, 0x76, 0x68, 0x45, 0x46, 0x68, 0x67, 0x57, 0x51, 0x78, 0x46, 0x6E, 0x51, 0x66, 0x48, 0x67, 0x51, 0x73, 0x49, 0x42, 0x63, 0x74, + 0x2B, 0x48, 0x48, 0x4B, 0x33, 0x58, 0x4C, 0x66, 0x4A, 0x2B, 0x75, 0x74, 0x64, 0x47, 0x64, 0x49, 0x7A, 0x64, 0x6A, 0x70, 0x39, 0x78, 0x43, 0x0A, 0x6F, 0x69, 0x32, 0x53, 0x42, 0x42, 0x74, 0x51, 0x77, 0x58, 0x75, 0x34, 0x50, 0x68, 0x76, 0x4A, + 0x56, 0x67, 0x53, 0x4C, 0x4C, 0x31, 0x4B, 0x62, 0x72, 0x61, 0x6C, 0x57, 0x36, 0x63, 0x48, 0x2F, 0x72, 0x61, 0x6C, 0x59, 0x68, 0x7A, 0x43, 0x32, 0x67, 0x66, 0x65, 0x58, 0x52, 0x66, 0x77, 0x5A, 0x56, 0x7A, 0x73, 0x72, 0x62, 0x2B, 0x52, 0x48, + 0x39, 0x4A, 0x6C, 0x46, 0x2F, 0x68, 0x33, 0x78, 0x2B, 0x4A, 0x65, 0x6A, 0x69, 0x42, 0x30, 0x33, 0x48, 0x46, 0x79, 0x50, 0x0A, 0x34, 0x48, 0x59, 0x6C, 0x6D, 0x6C, 0x44, 0x34, 0x6F, 0x46, 0x54, 0x2F, 0x52, 0x4A, 0x42, 0x32, 0x49, 0x39, 0x49, + 0x79, 0x78, 0x73, 0x4F, 0x72, 0x42, 0x72, 0x2F, 0x38, 0x2B, 0x37, 0x2F, 0x7A, 0x72, 0x58, 0x32, 0x53, 0x59, 0x67, 0x4A, 0x62, 0x4B, 0x64, 0x4D, 0x31, 0x6F, 0x35, 0x4F, 0x61, 0x51, 0x32, 0x52, 0x67, 0x58, 0x62, 0x4C, 0x36, 0x4D, 0x76, 0x38, + 0x37, 0x42, 0x4B, 0x39, 0x4E, 0x51, 0x47, 0x72, 0x35, 0x78, 0x2B, 0x50, 0x76, 0x49, 0x2F, 0x31, 0x72, 0x0A, 0x79, 0x2B, 0x55, 0x50, 0x69, 0x7A, 0x67, 0x4E, 0x37, 0x67, 0x72, 0x38, 0x2F, 0x67, 0x2B, 0x59, 0x6E, 0x7A, 0x41, 0x78, 0x33, 0x57, + 0x78, 0x53, 0x5A, 0x66, 0x6D, 0x4C, 0x67, 0x62, 0x34, 0x69, 0x34, 0x52, 0x78, 0x59, 0x41, 0x37, 0x71, 0x52, 0x47, 0x34, 0x6B, 0x48, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, + 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x0A, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, + 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x71, 0x4F, 0x46, 0x73, 0x6D, 0x6A, 0x64, 0x36, 0x4C, 0x57, 0x76, 0x4A, 0x50, 0x65, 0x6C, 0x53, 0x44, 0x47, 0x52, 0x6A, 0x6A, 0x43, 0x44, 0x57, 0x6D, 0x75, + 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x0A, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x50, 0x4E, 0x56, 0x33, 0x50, 0x64, 0x72, 0x66, 0x69, 0x62, 0x71, 0x48, + 0x44, 0x41, 0x68, 0x55, 0x61, 0x69, 0x42, 0x51, 0x6B, 0x72, 0x36, 0x77, 0x51, 0x54, 0x32, 0x35, 0x4A, 0x6D, 0x53, 0x44, 0x43, 0x69, 0x2F, 0x6F, 0x51, 0x4D, 0x43, 0x58, 0x4B, 0x43, 0x65, 0x43, 0x4D, 0x45, 0x72, 0x4A, 0x6B, 0x2F, 0x39, 0x71, + 0x35, 0x36, 0x59, 0x41, 0x66, 0x34, 0x6C, 0x43, 0x0A, 0x6D, 0x74, 0x59, 0x52, 0x35, 0x56, 0x50, 0x4F, 0x4C, 0x38, 0x7A, 0x79, 0x32, 0x67, 0x58, 0x45, 0x2F, 0x75, 0x4A, 0x51, 0x78, 0x44, 0x71, 0x47, 0x66, 0x63, 0x7A, 0x61, 0x66, 0x68, 0x41, + 0x4A, 0x4F, 0x35, 0x49, 0x31, 0x4B, 0x6C, 0x4F, 0x79, 0x2F, 0x75, 0x73, 0x72, 0x42, 0x64, 0x6C, 0x73, 0x58, 0x65, 0x62, 0x51, 0x37, 0x39, 0x4E, 0x71, 0x5A, 0x70, 0x34, 0x56, 0x4B, 0x49, 0x56, 0x36, 0x36, 0x49, 0x49, 0x41, 0x72, 0x42, 0x36, + 0x6E, 0x43, 0x57, 0x6C, 0x57, 0x0A, 0x51, 0x74, 0x4E, 0x6F, 0x55, 0x52, 0x69, 0x2B, 0x56, 0x4A, 0x71, 0x2F, 0x52, 0x45, 0x47, 0x36, 0x53, 0x62, 0x34, 0x67, 0x75, 0x6D, 0x6C, 0x63, 0x37, 0x72, 0x68, 0x33, 0x7A, 0x63, 0x35, 0x73, 0x48, 0x36, + 0x32, 0x44, 0x6C, 0x68, 0x68, 0x39, 0x44, 0x72, 0x55, 0x55, 0x4F, 0x59, 0x54, 0x78, 0x4B, 0x4F, 0x6B, 0x74, 0x6F, 0x35, 0x35, 0x37, 0x48, 0x6E, 0x70, 0x79, 0x57, 0x6F, 0x4F, 0x7A, 0x65, 0x57, 0x2F, 0x76, 0x74, 0x50, 0x7A, 0x51, 0x43, 0x71, + 0x56, 0x59, 0x0A, 0x54, 0x30, 0x62, 0x66, 0x2B, 0x32, 0x31, 0x35, 0x57, 0x66, 0x4B, 0x45, 0x49, 0x6C, 0x4B, 0x75, 0x44, 0x38, 0x7A, 0x37, 0x66, 0x44, 0x76, 0x6E, 0x61, 0x73, 0x70, 0x48, 0x59, 0x63, 0x4E, 0x36, 0x2B, 0x4E, 0x4F, 0x53, 0x42, + 0x42, 0x2B, 0x34, 0x49, 0x49, 0x54, 0x68, 0x4E, 0x6C, 0x51, 0x57, 0x78, 0x30, 0x44, 0x65, 0x4F, 0x34, 0x70, 0x7A, 0x33, 0x4E, 0x2F, 0x47, 0x43, 0x55, 0x7A, 0x66, 0x37, 0x4E, 0x72, 0x2F, 0x31, 0x46, 0x4E, 0x43, 0x6F, 0x63, 0x6E, 0x79, 0x0A, + 0x59, 0x68, 0x30, 0x69, 0x67, 0x7A, 0x79, 0x58, 0x78, 0x66, 0x6B, 0x5A, 0x59, 0x69, 0x65, 0x73, 0x5A, 0x53, 0x4C, 0x58, 0x30, 0x7A, 0x7A, 0x47, 0x35, 0x59, 0x36, 0x79, 0x55, 0x38, 0x78, 0x4A, 0x7A, 0x72, 0x77, 0x77, 0x2F, 0x6E, 0x73, 0x4F, + 0x4D, 0x35, 0x44, 0x37, 0x37, 0x64, 0x49, 0x55, 0x6B, 0x52, 0x38, 0x48, 0x72, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x64, 0x7A, 0x43, 0x43, 0x41, 0x6C, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, + 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x64, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x4B, 0x55, 0x44, 0x45, 0x6C, 0x4D, 0x43, + 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x63, 0x0A, 0x55, 0x30, 0x56, 0x44, 0x54, 0x30, 0x30, 0x67, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x44, 0x54, + 0x79, 0x34, 0x73, 0x54, 0x46, 0x52, 0x45, 0x4C, 0x6A, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x65, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x51, 0x32, 0x39, 0x74, 0x62, + 0x58, 0x56, 0x75, 0x61, 0x57, 0x4E, 0x68, 0x0A, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x51, 0x30, 0x45, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x41, 0x35, 0x4D, 0x44, 0x55, 0x79, 0x4F, 0x54, 0x41, 0x31, + 0x4D, 0x44, 0x41, 0x7A, 0x4F, 0x56, 0x6F, 0x58, 0x44, 0x54, 0x49, 0x35, 0x4D, 0x44, 0x55, 0x79, 0x4F, 0x54, 0x41, 0x31, 0x4D, 0x44, 0x41, 0x7A, 0x4F, 0x56, 0x6F, 0x77, 0x58, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x42, 0x68, 0x4D, 0x43, 0x0A, 0x53, 0x6C, 0x41, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, 0x4E, 0x46, 0x51, 0x30, 0x39, 0x4E, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, + 0x35, 0x63, 0x33, 0x52, 0x6C, 0x62, 0x58, 0x4D, 0x67, 0x51, 0x30, 0x38, 0x75, 0x4C, 0x45, 0x78, 0x55, 0x52, 0x43, 0x34, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x48, 0x6C, 0x4E, 0x6C, 0x59, 0x33, 0x56, + 0x79, 0x0A, 0x61, 0x58, 0x52, 0x35, 0x49, 0x45, 0x4E, 0x76, 0x62, 0x57, 0x31, 0x31, 0x62, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x45, 0x4E, 0x42, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x53, + 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x0A, 0x41, + 0x4E, 0x41, 0x56, 0x4F, 0x56, 0x4B, 0x78, 0x55, 0x72, 0x4F, 0x36, 0x78, 0x56, 0x6D, 0x43, 0x78, 0x46, 0x31, 0x53, 0x72, 0x6A, 0x70, 0x44, 0x5A, 0x59, 0x42, 0x4C, 0x78, 0x2F, 0x4B, 0x57, 0x76, 0x4E, 0x73, 0x32, 0x6C, 0x39, 0x61, 0x6D, 0x5A, + 0x49, 0x79, 0x6F, 0x58, 0x76, 0x44, 0x6A, 0x43, 0x68, 0x7A, 0x33, 0x33, 0x35, 0x63, 0x39, 0x53, 0x36, 0x37, 0x32, 0x58, 0x65, 0x77, 0x68, 0x74, 0x55, 0x47, 0x72, 0x7A, 0x62, 0x6C, 0x2B, 0x64, 0x70, 0x2B, 0x2B, 0x0A, 0x2B, 0x54, 0x34, 0x32, + 0x4E, 0x4B, 0x41, 0x37, 0x77, 0x66, 0x59, 0x78, 0x45, 0x55, 0x56, 0x30, 0x6B, 0x7A, 0x31, 0x58, 0x67, 0x4D, 0x58, 0x35, 0x69, 0x5A, 0x6E, 0x4B, 0x35, 0x61, 0x74, 0x71, 0x31, 0x4C, 0x58, 0x61, 0x51, 0x5A, 0x41, 0x51, 0x77, 0x64, 0x62, 0x57, + 0x51, 0x6F, 0x6E, 0x43, 0x76, 0x2F, 0x51, 0x34, 0x45, 0x70, 0x56, 0x4D, 0x56, 0x41, 0x58, 0x33, 0x4E, 0x75, 0x52, 0x46, 0x67, 0x33, 0x73, 0x55, 0x5A, 0x64, 0x62, 0x63, 0x44, 0x45, 0x33, 0x52, 0x0A, 0x33, 0x6E, 0x34, 0x4D, 0x71, 0x7A, 0x76, + 0x45, 0x46, 0x62, 0x34, 0x36, 0x56, 0x71, 0x5A, 0x61, 0x62, 0x33, 0x5A, 0x70, 0x55, 0x71, 0x6C, 0x36, 0x75, 0x63, 0x6A, 0x72, 0x61, 0x70, 0x70, 0x64, 0x55, 0x74, 0x41, 0x74, 0x43, 0x6D, 0x73, 0x31, 0x46, 0x67, 0x6B, 0x51, 0x68, 0x4E, 0x42, + 0x71, 0x79, 0x6A, 0x6F, 0x47, 0x41, 0x44, 0x64, 0x48, 0x35, 0x48, 0x35, 0x58, 0x54, 0x7A, 0x2B, 0x4C, 0x36, 0x32, 0x65, 0x34, 0x69, 0x4B, 0x72, 0x46, 0x76, 0x6C, 0x4E, 0x56, 0x0A, 0x73, 0x70, 0x48, 0x45, 0x66, 0x62, 0x6D, 0x77, 0x68, 0x52, + 0x6B, 0x47, 0x65, 0x43, 0x37, 0x62, 0x59, 0x52, 0x72, 0x36, 0x68, 0x66, 0x56, 0x4B, 0x6B, 0x61, 0x48, 0x6E, 0x46, 0x74, 0x57, 0x4F, 0x6F, 0x6A, 0x6E, 0x66, 0x6C, 0x4C, 0x68, 0x77, 0x48, 0x79, 0x67, 0x2F, 0x69, 0x2F, 0x78, 0x41, 0x58, 0x6D, + 0x4F, 0x44, 0x50, 0x49, 0x4D, 0x71, 0x47, 0x70, 0x6C, 0x72, 0x7A, 0x39, 0x35, 0x5A, 0x61, 0x6A, 0x76, 0x38, 0x62, 0x78, 0x62, 0x58, 0x48, 0x2F, 0x31, 0x4B, 0x0A, 0x45, 0x4F, 0x74, 0x4F, 0x67, 0x68, 0x59, 0x36, 0x72, 0x43, 0x63, 0x4D, 0x55, + 0x2F, 0x47, 0x74, 0x31, 0x53, 0x53, 0x77, 0x61, 0x77, 0x4E, 0x51, 0x77, 0x53, 0x30, 0x38, 0x46, 0x74, 0x31, 0x45, 0x4E, 0x43, 0x63, 0x61, 0x64, 0x66, 0x73, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, + 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x41, 0x71, 0x46, 0x71, 0x58, 0x64, 0x6C, 0x42, 0x5A, 0x68, 0x38, 0x0A, 0x51, 0x49, 0x48, 0x34, 0x44, 0x35, 0x63, 0x73, 0x4F, 0x50, 0x45, 0x4B, 0x37, 0x44, 0x7A, 0x50, + 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, + 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x0A, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x42, 0x4D, 0x4F, 0x71, 0x4E, 0x45, 0x72, 0x4C, 0x6C, + 0x46, 0x73, 0x63, 0x65, 0x54, 0x66, 0x73, 0x67, 0x4C, 0x43, 0x6B, 0x4C, 0x66, 0x5A, 0x4F, 0x6F, 0x63, 0x37, 0x6C, 0x6C, 0x73, 0x43, 0x4C, 0x71, 0x4A, 0x58, 0x32, 0x72, 0x4B, 0x53, 0x70, 0x57, 0x65, 0x65, 0x6F, 0x38, 0x48, 0x78, 0x64, 0x70, + 0x46, 0x63, 0x6F, 0x4A, 0x78, 0x44, 0x6A, 0x72, 0x53, 0x7A, 0x47, 0x2B, 0x6E, 0x74, 0x4B, 0x45, 0x6A, 0x0A, 0x75, 0x2F, 0x59, 0x6B, 0x6E, 0x38, 0x73, 0x58, 0x2F, 0x6F, 0x79, 0x6D, 0x7A, 0x73, 0x4C, 0x53, 0x32, 0x38, 0x79, 0x4E, 0x2F, 0x48, + 0x48, 0x38, 0x41, 0x79, 0x6E, 0x42, 0x62, 0x46, 0x30, 0x7A, 0x58, 0x32, 0x53, 0x32, 0x5A, 0x54, 0x75, 0x4A, 0x62, 0x78, 0x68, 0x32, 0x65, 0x50, 0x58, 0x63, 0x6F, 0x6B, 0x67, 0x66, 0x47, 0x54, 0x2B, 0x4F, 0x6B, 0x2B, 0x76, 0x78, 0x2B, 0x68, + 0x66, 0x75, 0x7A, 0x55, 0x37, 0x6A, 0x42, 0x42, 0x4A, 0x56, 0x31, 0x75, 0x58, 0x6B, 0x0A, 0x33, 0x66, 0x73, 0x2B, 0x42, 0x58, 0x7A, 0x69, 0x48, 0x56, 0x37, 0x47, 0x70, 0x37, 0x79, 0x58, 0x54, 0x32, 0x67, 0x36, 0x39, 0x65, 0x6B, 0x75, 0x43, + 0x6B, 0x4F, 0x32, 0x72, 0x31, 0x64, 0x63, 0x59, 0x6D, 0x68, 0x38, 0x74, 0x2F, 0x32, 0x6A, 0x69, 0x6F, 0x53, 0x67, 0x72, 0x47, 0x4B, 0x2B, 0x4B, 0x77, 0x6D, 0x48, 0x4E, 0x50, 0x42, 0x71, 0x41, 0x62, 0x75, 0x62, 0x4B, 0x56, 0x59, 0x38, 0x2F, + 0x67, 0x41, 0x33, 0x7A, 0x79, 0x4E, 0x73, 0x38, 0x55, 0x36, 0x71, 0x0A, 0x74, 0x6E, 0x52, 0x47, 0x45, 0x6D, 0x79, 0x52, 0x37, 0x6A, 0x54, 0x56, 0x37, 0x4A, 0x71, 0x52, 0x35, 0x30, 0x53, 0x2B, 0x6B, 0x44, 0x46, 0x79, 0x31, 0x55, 0x6B, 0x43, + 0x39, 0x67, 0x4C, 0x6C, 0x39, 0x42, 0x2F, 0x72, 0x66, 0x4E, 0x6D, 0x57, 0x56, 0x61, 0x6E, 0x2F, 0x37, 0x49, 0x72, 0x35, 0x6D, 0x55, 0x66, 0x2F, 0x4E, 0x56, 0x6F, 0x43, 0x71, 0x67, 0x54, 0x4C, 0x69, 0x6C, 0x75, 0x48, 0x63, 0x53, 0x6D, 0x52, + 0x76, 0x61, 0x53, 0x30, 0x65, 0x67, 0x32, 0x39, 0x0A, 0x6D, 0x76, 0x56, 0x58, 0x49, 0x77, 0x41, 0x48, 0x49, 0x52, 0x63, 0x2F, 0x53, 0x6A, 0x6E, 0x52, 0x42, 0x55, 0x6B, 0x4C, 0x70, 0x37, 0x59, 0x33, 0x67, 0x61, 0x56, 0x64, 0x6A, 0x4B, 0x6F, + 0x7A, 0x58, 0x6F, 0x45, 0x6F, 0x66, 0x4B, 0x64, 0x39, 0x4A, 0x2B, 0x73, 0x41, 0x72, 0x6F, 0x30, 0x33, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x63, 0x74, 0x61, 0x6C, 0x69, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6E, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x75, 0x7A, 0x43, 0x43, 0x41, 0x36, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x56, 0x77, 0x6F, 0x52, 0x6C, + 0x30, 0x4C, 0x45, 0x34, 0x38, 0x77, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x61, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, + 0x68, 0x4D, 0x43, 0x53, 0x56, 0x51, 0x78, 0x44, 0x6A, 0x41, 0x4D, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x55, 0x31, 0x70, 0x62, 0x47, 0x46, 0x75, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, + 0x44, 0x42, 0x70, 0x42, 0x59, 0x33, 0x52, 0x68, 0x62, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4D, 0x75, 0x63, 0x43, 0x35, 0x42, 0x4C, 0x69, 0x38, 0x77, 0x4D, 0x7A, 0x4D, 0x31, 0x4F, 0x44, 0x55, 0x79, 0x4D, 0x44, 0x6B, 0x32, 0x4E, 0x7A, 0x45, 0x6E, + 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x41, 0x77, 0x77, 0x65, 0x51, 0x57, 0x4E, 0x30, 0x59, 0x57, 0x78, 0x70, 0x63, 0x79, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x5A, 0x57, 0x35, 0x30, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, + 0x76, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x6B, 0x79, 0x4D, 0x6A, 0x45, 0x78, 0x4D, 0x6A, 0x49, 0x77, 0x4D, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x4D, + 0x77, 0x4D, 0x44, 0x6B, 0x79, 0x0A, 0x4D, 0x6A, 0x45, 0x78, 0x4D, 0x6A, 0x49, 0x77, 0x4D, 0x6C, 0x6F, 0x77, 0x61, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x56, 0x51, 0x78, 0x44, 0x6A, + 0x41, 0x4D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x55, 0x31, 0x70, 0x62, 0x47, 0x46, 0x75, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x70, 0x42, 0x59, 0x33, 0x52, 0x68, 0x62, 0x47, + 0x6C, 0x7A, 0x0A, 0x49, 0x46, 0x4D, 0x75, 0x63, 0x43, 0x35, 0x42, 0x4C, 0x69, 0x38, 0x77, 0x4D, 0x7A, 0x4D, 0x31, 0x4F, 0x44, 0x55, 0x79, 0x4D, 0x44, 0x6B, 0x32, 0x4E, 0x7A, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, + 0x77, 0x77, 0x65, 0x51, 0x57, 0x4E, 0x30, 0x59, 0x57, 0x78, 0x70, 0x63, 0x79, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x5A, 0x57, 0x35, 0x30, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x0A, + 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, + 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x70, 0x38, 0x62, 0x45, 0x70, 0x53, 0x6D, 0x6B, 0x4C, 0x4F, 0x2F, 0x6C, 0x47, 0x4D, 0x57, 0x77, 0x55, 0x4B, 0x4E, 0x76, 0x55, 0x54, 0x75, 0x66, 0x43, 0x6C, 0x72, 0x4A, 0x0A, 0x77, 0x6B, 0x67, + 0x34, 0x43, 0x73, 0x49, 0x63, 0x6F, 0x42, 0x68, 0x2F, 0x6B, 0x62, 0x57, 0x48, 0x75, 0x55, 0x41, 0x2F, 0x33, 0x52, 0x31, 0x6F, 0x48, 0x77, 0x69, 0x44, 0x31, 0x53, 0x30, 0x65, 0x69, 0x4B, 0x44, 0x34, 0x6A, 0x31, 0x61, 0x50, 0x62, 0x5A, 0x6B, + 0x43, 0x6B, 0x70, 0x41, 0x57, 0x31, 0x56, 0x38, 0x49, 0x62, 0x49, 0x6E, 0x58, 0x34, 0x61, 0x79, 0x38, 0x49, 0x4D, 0x4B, 0x78, 0x34, 0x49, 0x4E, 0x52, 0x69, 0x6D, 0x6C, 0x4E, 0x41, 0x4A, 0x5A, 0x61, 0x0A, 0x62, 0x79, 0x2F, 0x41, 0x52, 0x48, + 0x36, 0x6A, 0x44, 0x75, 0x53, 0x52, 0x7A, 0x56, 0x6A, 0x75, 0x33, 0x50, 0x76, 0x48, 0x48, 0x6B, 0x56, 0x48, 0x33, 0x53, 0x65, 0x35, 0x43, 0x41, 0x47, 0x66, 0x70, 0x69, 0x45, 0x64, 0x39, 0x55, 0x45, 0x74, 0x4C, 0x30, 0x7A, 0x39, 0x4B, 0x4B, + 0x33, 0x67, 0x69, 0x71, 0x30, 0x69, 0x74, 0x46, 0x5A, 0x6C, 0x6A, 0x6F, 0x5A, 0x55, 0x6A, 0x35, 0x4E, 0x44, 0x4B, 0x64, 0x34, 0x35, 0x52, 0x6E, 0x69, 0x6A, 0x4D, 0x43, 0x4F, 0x36, 0x0A, 0x7A, 0x66, 0x42, 0x39, 0x45, 0x31, 0x66, 0x41, 0x58, + 0x64, 0x4B, 0x44, 0x61, 0x30, 0x68, 0x4D, 0x78, 0x4B, 0x75, 0x66, 0x67, 0x46, 0x70, 0x62, 0x4F, 0x72, 0x33, 0x4A, 0x70, 0x79, 0x49, 0x2F, 0x67, 0x43, 0x63, 0x7A, 0x57, 0x77, 0x36, 0x33, 0x69, 0x67, 0x78, 0x64, 0x42, 0x7A, 0x63, 0x49, 0x79, + 0x32, 0x7A, 0x53, 0x65, 0x6B, 0x63, 0x69, 0x52, 0x44, 0x58, 0x46, 0x7A, 0x4D, 0x77, 0x75, 0x6A, 0x74, 0x30, 0x71, 0x37, 0x62, 0x64, 0x39, 0x5A, 0x67, 0x31, 0x66, 0x0A, 0x59, 0x56, 0x45, 0x69, 0x56, 0x52, 0x76, 0x6A, 0x52, 0x75, 0x50, 0x6A, + 0x50, 0x64, 0x41, 0x31, 0x59, 0x70, 0x72, 0x62, 0x72, 0x78, 0x54, 0x49, 0x57, 0x36, 0x48, 0x4D, 0x69, 0x52, 0x76, 0x68, 0x4D, 0x43, 0x62, 0x38, 0x6F, 0x4A, 0x73, 0x66, 0x67, 0x61, 0x64, 0x48, 0x48, 0x77, 0x54, 0x72, 0x6F, 0x7A, 0x6D, 0x53, + 0x42, 0x70, 0x2B, 0x5A, 0x30, 0x37, 0x2F, 0x54, 0x36, 0x6B, 0x39, 0x51, 0x6E, 0x42, 0x6E, 0x2B, 0x6C, 0x6F, 0x63, 0x65, 0x50, 0x47, 0x58, 0x32, 0x0A, 0x6F, 0x78, 0x67, 0x6B, 0x67, 0x34, 0x59, 0x51, 0x35, 0x31, 0x51, 0x2B, 0x71, 0x44, 0x70, + 0x32, 0x4A, 0x45, 0x2B, 0x42, 0x49, 0x63, 0x58, 0x6A, 0x44, 0x77, 0x4C, 0x34, 0x6B, 0x35, 0x52, 0x48, 0x49, 0x4C, 0x76, 0x2B, 0x31, 0x41, 0x37, 0x54, 0x61, 0x4C, 0x6E, 0x64, 0x78, 0x48, 0x71, 0x45, 0x67, 0x75, 0x4E, 0x54, 0x56, 0x48, 0x6E, + 0x64, 0x32, 0x35, 0x7A, 0x53, 0x38, 0x67, 0x65, 0x62, 0x4C, 0x72, 0x61, 0x38, 0x50, 0x75, 0x32, 0x46, 0x62, 0x65, 0x38, 0x6C, 0x0A, 0x45, 0x66, 0x4B, 0x58, 0x47, 0x6B, 0x4A, 0x68, 0x39, 0x30, 0x71, 0x58, 0x36, 0x49, 0x75, 0x78, 0x45, 0x41, + 0x66, 0x36, 0x5A, 0x59, 0x47, 0x79, 0x6F, 0x6A, 0x6E, 0x50, 0x39, 0x7A, 0x7A, 0x2F, 0x47, 0x50, 0x76, 0x47, 0x38, 0x56, 0x71, 0x4C, 0x57, 0x65, 0x49, 0x43, 0x72, 0x48, 0x75, 0x53, 0x30, 0x45, 0x34, 0x55, 0x54, 0x31, 0x6C, 0x46, 0x39, 0x67, + 0x78, 0x65, 0x4B, 0x46, 0x2B, 0x77, 0x36, 0x44, 0x39, 0x46, 0x7A, 0x38, 0x2B, 0x76, 0x6D, 0x32, 0x2F, 0x37, 0x0A, 0x68, 0x4E, 0x4E, 0x33, 0x57, 0x70, 0x56, 0x76, 0x72, 0x4A, 0x53, 0x45, 0x6E, 0x75, 0x36, 0x38, 0x77, 0x45, 0x71, 0x50, 0x53, + 0x70, 0x50, 0x34, 0x52, 0x43, 0x48, 0x69, 0x4D, 0x55, 0x56, 0x68, 0x55, 0x45, 0x34, 0x51, 0x32, 0x4F, 0x4D, 0x31, 0x66, 0x45, 0x77, 0x5A, 0x74, 0x4E, 0x34, 0x46, 0x76, 0x36, 0x4D, 0x47, 0x6E, 0x38, 0x69, 0x31, 0x7A, 0x65, 0x51, 0x66, 0x31, + 0x78, 0x63, 0x47, 0x44, 0x58, 0x71, 0x56, 0x64, 0x46, 0x55, 0x4E, 0x61, 0x42, 0x72, 0x38, 0x0A, 0x45, 0x42, 0x74, 0x69, 0x5A, 0x4A, 0x31, 0x74, 0x34, 0x4A, 0x57, 0x67, 0x77, 0x35, 0x51, 0x48, 0x56, 0x77, 0x30, 0x55, 0x35, 0x72, 0x30, 0x46, + 0x2B, 0x37, 0x69, 0x66, 0x35, 0x74, 0x2B, 0x4C, 0x34, 0x73, 0x62, 0x6E, 0x66, 0x70, 0x62, 0x32, 0x55, 0x38, 0x57, 0x41, 0x4E, 0x46, 0x41, 0x6F, 0x57, 0x50, 0x41, 0x53, 0x55, 0x48, 0x45, 0x58, 0x4D, 0x4C, 0x72, 0x6D, 0x65, 0x47, 0x4F, 0x38, + 0x39, 0x4C, 0x4B, 0x74, 0x6D, 0x79, 0x75, 0x79, 0x2F, 0x75, 0x45, 0x35, 0x0A, 0x6A, 0x46, 0x36, 0x36, 0x43, 0x79, 0x43, 0x55, 0x33, 0x6E, 0x75, 0x44, 0x75, 0x50, 0x2F, 0x6A, 0x56, 0x6F, 0x32, 0x33, 0x45, 0x65, 0x6B, 0x37, 0x6A, 0x50, 0x4B, + 0x78, 0x77, 0x56, 0x32, 0x64, 0x70, 0x41, 0x74, 0x4D, 0x4B, 0x39, 0x6D, 0x79, 0x47, 0x50, 0x57, 0x31, 0x6E, 0x30, 0x73, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, + 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x46, 0x4C, 0x59, 0x0A, 0x69, 0x44, 0x72, 0x49, 0x6E, 0x33, 0x68, 0x6D, 0x37, 0x59, 0x6E, 0x7A, 0x65, 0x7A, 0x68, 0x77, 0x6C, 0x4D, 0x6B, 0x43, 0x41, 0x6A, 0x62, 0x51, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, + 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x55, 0x74, 0x69, 0x49, 0x4F, 0x73, + 0x69, 0x66, 0x65, 0x47, 0x62, 0x74, 0x0A, 0x69, 0x66, 0x4E, 0x37, 0x4F, 0x48, 0x43, 0x55, 0x79, 0x51, 0x49, 0x43, 0x4E, 0x74, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, + 0x67, 0x45, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x41, 0x4C, 0x65, 0x33, 0x4B, 0x48, 0x77, 0x47, 0x43, 0x6D, 0x53, + 0x55, 0x79, 0x49, 0x0A, 0x57, 0x4F, 0x59, 0x64, 0x69, 0x50, 0x63, 0x55, 0x5A, 0x45, 0x69, 0x6D, 0x32, 0x46, 0x67, 0x4B, 0x44, 0x6B, 0x38, 0x54, 0x4E, 0x64, 0x38, 0x31, 0x48, 0x64, 0x54, 0x74, 0x42, 0x6A, 0x48, 0x49, 0x67, 0x54, 0x35, 0x71, + 0x31, 0x64, 0x30, 0x37, 0x47, 0x6A, 0x4C, 0x75, 0x6B, 0x44, 0x30, 0x52, 0x30, 0x69, 0x37, 0x30, 0x6A, 0x73, 0x4E, 0x6A, 0x4C, 0x69, 0x4E, 0x6D, 0x73, 0x47, 0x65, 0x2B, 0x62, 0x37, 0x62, 0x41, 0x45, 0x7A, 0x6C, 0x67, 0x71, 0x71, 0x49, 0x30, + 0x0A, 0x4A, 0x5A, 0x4E, 0x31, 0x55, 0x74, 0x36, 0x6E, 0x6E, 0x61, 0x30, 0x4F, 0x68, 0x34, 0x6C, 0x53, 0x63, 0x57, 0x6F, 0x57, 0x50, 0x42, 0x6B, 0x64, 0x67, 0x2F, 0x69, 0x61, 0x4B, 0x57, 0x57, 0x2B, 0x39, 0x44, 0x2B, 0x61, 0x32, 0x66, 0x44, + 0x7A, 0x57, 0x6F, 0x63, 0x68, 0x63, 0x59, 0x42, 0x4E, 0x79, 0x2B, 0x41, 0x34, 0x6D, 0x7A, 0x2B, 0x37, 0x2B, 0x75, 0x41, 0x77, 0x54, 0x63, 0x2B, 0x47, 0x30, 0x32, 0x55, 0x51, 0x47, 0x52, 0x6A, 0x52, 0x6C, 0x77, 0x4B, 0x78, 0x0A, 0x4B, 0x33, + 0x4A, 0x43, 0x61, 0x4B, 0x79, 0x67, 0x76, 0x55, 0x35, 0x61, 0x32, 0x68, 0x69, 0x2F, 0x61, 0x35, 0x69, 0x42, 0x30, 0x50, 0x32, 0x61, 0x76, 0x6C, 0x34, 0x56, 0x53, 0x4D, 0x30, 0x52, 0x46, 0x62, 0x6E, 0x41, 0x4B, 0x56, 0x79, 0x30, 0x36, 0x49, + 0x6A, 0x33, 0x50, 0x6A, 0x61, 0x75, 0x74, 0x32, 0x4C, 0x39, 0x48, 0x6D, 0x4C, 0x65, 0x63, 0x48, 0x67, 0x51, 0x48, 0x45, 0x68, 0x62, 0x32, 0x72, 0x79, 0x6B, 0x4F, 0x4C, 0x70, 0x6E, 0x37, 0x56, 0x55, 0x2B, 0x0A, 0x58, 0x6C, 0x66, 0x66, 0x31, + 0x41, 0x4E, 0x41, 0x54, 0x49, 0x47, 0x6B, 0x30, 0x6B, 0x39, 0x6A, 0x70, 0x77, 0x6C, 0x43, 0x43, 0x52, 0x54, 0x38, 0x41, 0x4B, 0x6E, 0x43, 0x67, 0x48, 0x4E, 0x50, 0x4C, 0x73, 0x42, 0x41, 0x32, 0x52, 0x46, 0x37, 0x53, 0x4F, 0x70, 0x36, 0x41, + 0x73, 0x44, 0x54, 0x36, 0x79, 0x67, 0x42, 0x4A, 0x6C, 0x68, 0x30, 0x77, 0x63, 0x42, 0x7A, 0x49, 0x6D, 0x32, 0x54, 0x6C, 0x66, 0x30, 0x35, 0x66, 0x62, 0x73, 0x71, 0x34, 0x2F, 0x61, 0x43, 0x0A, 0x34, 0x79, 0x79, 0x58, 0x58, 0x30, 0x34, 0x66, + 0x6B, 0x5A, 0x54, 0x36, 0x2F, 0x69, 0x79, 0x6A, 0x32, 0x48, 0x59, 0x61, 0x75, 0x45, 0x32, 0x79, 0x4F, 0x45, 0x2B, 0x62, 0x2B, 0x68, 0x31, 0x49, 0x59, 0x48, 0x6B, 0x6D, 0x34, 0x76, 0x50, 0x39, 0x71, 0x64, 0x43, 0x61, 0x36, 0x48, 0x43, 0x50, + 0x53, 0x58, 0x72, 0x57, 0x35, 0x62, 0x30, 0x4B, 0x44, 0x74, 0x73, 0x74, 0x38, 0x34, 0x32, 0x2F, 0x36, 0x2B, 0x4F, 0x6B, 0x66, 0x63, 0x76, 0x48, 0x6C, 0x58, 0x48, 0x6F, 0x0A, 0x32, 0x71, 0x4E, 0x38, 0x78, 0x63, 0x4C, 0x34, 0x64, 0x4A, 0x49, + 0x45, 0x47, 0x34, 0x61, 0x73, 0x70, 0x43, 0x4A, 0x54, 0x51, 0x4C, 0x61, 0x73, 0x2F, 0x6B, 0x78, 0x32, 0x7A, 0x2F, 0x75, 0x55, 0x4D, 0x73, 0x41, 0x31, 0x6E, 0x33, 0x59, 0x2F, 0x62, 0x75, 0x57, 0x51, 0x62, 0x71, 0x43, 0x6D, 0x4A, 0x71, 0x4B, + 0x34, 0x4C, 0x4C, 0x37, 0x52, 0x4B, 0x34, 0x58, 0x39, 0x70, 0x32, 0x6A, 0x49, 0x75, 0x67, 0x45, 0x72, 0x73, 0x57, 0x78, 0x30, 0x48, 0x62, 0x68, 0x7A, 0x0A, 0x6C, 0x65, 0x66, 0x75, 0x74, 0x38, 0x63, 0x6C, 0x38, 0x41, 0x42, 0x4D, 0x41, 0x4C, + 0x4A, 0x2B, 0x74, 0x67, 0x75, 0x4C, 0x48, 0x50, 0x50, 0x41, 0x55, 0x4A, 0x34, 0x6C, 0x75, 0x65, 0x41, 0x49, 0x33, 0x6A, 0x5A, 0x6D, 0x2F, 0x7A, 0x65, 0x6C, 0x30, 0x62, 0x74, 0x55, 0x5A, 0x43, 0x7A, 0x4A, 0x4A, 0x37, 0x56, 0x4C, 0x6B, 0x6E, + 0x35, 0x6C, 0x2F, 0x39, 0x4D, 0x74, 0x34, 0x62, 0x6C, 0x4F, 0x76, 0x48, 0x2B, 0x6B, 0x51, 0x53, 0x47, 0x51, 0x51, 0x58, 0x65, 0x6D, 0x0A, 0x4F, 0x52, 0x2F, 0x71, 0x6E, 0x75, 0x4F, 0x66, 0x30, 0x47, 0x5A, 0x76, 0x42, 0x65, 0x79, 0x71, 0x64, + 0x6E, 0x36, 0x2F, 0x61, 0x78, 0x61, 0x67, 0x36, 0x37, 0x58, 0x48, 0x2F, 0x4A, 0x4A, 0x55, 0x4C, 0x79, 0x73, 0x52, 0x4A, 0x79, 0x55, 0x33, 0x65, 0x45, 0x78, 0x52, 0x61, 0x72, 0x44, 0x7A, 0x7A, 0x46, 0x68, 0x64, 0x46, 0x50, 0x46, 0x71, 0x53, + 0x42, 0x58, 0x2F, 0x77, 0x67, 0x65, 0x32, 0x73, 0x59, 0x30, 0x50, 0x6A, 0x6C, 0x78, 0x51, 0x52, 0x72, 0x4D, 0x39, 0x0A, 0x76, 0x77, 0x47, 0x59, 0x54, 0x37, 0x4A, 0x5A, 0x56, 0x45, 0x63, 0x2B, 0x4E, 0x48, 0x74, 0x34, 0x62, 0x56, 0x61, 0x54, + 0x4C, 0x6E, 0x50, 0x71, 0x5A, 0x69, 0x68, 0x34, 0x7A, 0x52, 0x30, 0x55, 0x76, 0x36, 0x43, 0x50, 0x4C, 0x79, 0x36, 0x34, 0x4C, 0x6F, 0x37, 0x79, 0x46, 0x49, 0x72, 0x4D, 0x36, 0x62, 0x56, 0x38, 0x2B, 0x32, 0x79, 0x64, 0x44, 0x4B, 0x58, 0x68, + 0x6C, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, + 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x57, 0x54, 0x43, 0x43, 0x41, 0x30, 0x47, 0x67, + 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x4F, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x4F, 0x54, 0x7A, 0x45, 0x64, 0x4D, 0x42, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x55, 0x0A, 0x51, 0x6E, 0x56, 0x35, 0x63, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x42, 0x42, 0x55, 0x79, 0x30, + 0x35, 0x4F, 0x44, 0x4D, 0x78, 0x4E, 0x6A, 0x4D, 0x7A, 0x4D, 0x6A, 0x63, 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x30, 0x4A, 0x31, 0x65, 0x58, 0x42, 0x68, 0x63, 0x33, 0x4D, 0x67, 0x51, 0x32, 0x78, + 0x68, 0x63, 0x33, 0x4D, 0x67, 0x4D, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x0A, 0x44, 0x54, 0x45, 0x77, 0x4D, 0x54, 0x41, 0x79, 0x4E, 0x6A, 0x41, 0x34, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x31, + 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x41, 0x79, 0x4E, 0x6A, 0x41, 0x34, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x31, 0x6F, 0x77, 0x54, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x54, 0x6B, + 0x38, 0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x46, 0x45, 0x4A, 0x31, 0x0A, 0x65, 0x58, 0x42, 0x68, 0x63, 0x33, 0x4D, 0x67, 0x51, 0x56, 0x4D, 0x74, 0x4F, 0x54, 0x67, 0x7A, 0x4D, 0x54, 0x59, 0x7A, 0x4D, + 0x7A, 0x49, 0x33, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x64, 0x43, 0x64, 0x58, 0x6C, 0x77, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x44, 0x49, 0x67, 0x55, + 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, + 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4E, 0x66, 0x48, 0x58, 0x76, 0x66, 0x42, 0x42, 0x39, 0x52, 0x33, 0x2B, 0x30, 0x4D, 0x68, 0x39, 0x50, 0x54, 0x31, 0x61, 0x65, 0x54, 0x75, 0x4D, 0x67, 0x48, 0x62, + 0x6F, 0x34, 0x59, 0x66, 0x35, 0x46, 0x6B, 0x4E, 0x75, 0x75, 0x64, 0x31, 0x0A, 0x67, 0x31, 0x4C, 0x72, 0x36, 0x68, 0x78, 0x68, 0x46, 0x55, 0x69, 0x37, 0x48, 0x51, 0x66, 0x4B, 0x6A, 0x4B, 0x36, 0x77, 0x33, 0x4A, 0x61, 0x64, 0x36, 0x73, 0x4E, + 0x67, 0x6B, 0x6F, 0x61, 0x43, 0x4B, 0x48, 0x4F, 0x63, 0x56, 0x67, 0x62, 0x2F, 0x53, 0x32, 0x54, 0x77, 0x44, 0x43, 0x6F, 0x33, 0x53, 0x62, 0x58, 0x6C, 0x7A, 0x77, 0x78, 0x38, 0x37, 0x76, 0x46, 0x4B, 0x75, 0x33, 0x4D, 0x77, 0x5A, 0x66, 0x50, + 0x56, 0x4C, 0x34, 0x4F, 0x32, 0x66, 0x75, 0x50, 0x6E, 0x0A, 0x39, 0x5A, 0x36, 0x72, 0x59, 0x50, 0x6E, 0x54, 0x38, 0x5A, 0x32, 0x53, 0x64, 0x49, 0x72, 0x6B, 0x48, 0x4A, 0x61, 0x73, 0x57, 0x34, 0x44, 0x70, 0x74, 0x66, 0x51, 0x78, 0x68, 0x36, + 0x4E, 0x52, 0x2F, 0x4D, 0x64, 0x2B, 0x6F, 0x57, 0x2B, 0x4F, 0x55, 0x33, 0x66, 0x55, 0x6C, 0x38, 0x46, 0x56, 0x4D, 0x35, 0x49, 0x2B, 0x47, 0x43, 0x39, 0x31, 0x31, 0x4B, 0x32, 0x47, 0x53, 0x63, 0x75, 0x56, 0x72, 0x31, 0x51, 0x47, 0x62, 0x4E, + 0x67, 0x47, 0x45, 0x34, 0x31, 0x62, 0x0A, 0x2F, 0x2B, 0x45, 0x6D, 0x47, 0x56, 0x6E, 0x41, 0x4A, 0x4C, 0x71, 0x42, 0x63, 0x58, 0x6D, 0x51, 0x52, 0x46, 0x42, 0x6F, 0x4A, 0x4A, 0x52, 0x66, 0x75, 0x4C, 0x4D, 0x52, 0x38, 0x53, 0x6C, 0x42, 0x59, + 0x61, 0x4E, 0x42, 0x79, 0x79, 0x4D, 0x32, 0x31, 0x63, 0x48, 0x78, 0x4D, 0x6C, 0x41, 0x51, 0x54, 0x6E, 0x2F, 0x30, 0x68, 0x70, 0x50, 0x73, 0x68, 0x4E, 0x4F, 0x4F, 0x76, 0x45, 0x75, 0x2F, 0x58, 0x41, 0x46, 0x4F, 0x42, 0x7A, 0x33, 0x63, 0x46, + 0x49, 0x71, 0x55, 0x0A, 0x43, 0x71, 0x54, 0x71, 0x63, 0x2F, 0x73, 0x4C, 0x55, 0x65, 0x67, 0x54, 0x42, 0x78, 0x6A, 0x36, 0x44, 0x76, 0x45, 0x72, 0x30, 0x56, 0x51, 0x56, 0x66, 0x54, 0x7A, 0x68, 0x39, 0x37, 0x51, 0x5A, 0x51, 0x6D, 0x64, 0x69, + 0x58, 0x6E, 0x66, 0x67, 0x6F, 0x6C, 0x58, 0x73, 0x74, 0x74, 0x6C, 0x70, 0x46, 0x39, 0x55, 0x36, 0x72, 0x30, 0x54, 0x74, 0x53, 0x73, 0x57, 0x65, 0x35, 0x48, 0x6F, 0x6E, 0x66, 0x4F, 0x56, 0x31, 0x31, 0x36, 0x72, 0x4C, 0x4A, 0x65, 0x66, 0x66, + 0x0A, 0x61, 0x77, 0x72, 0x62, 0x44, 0x30, 0x32, 0x54, 0x54, 0x71, 0x69, 0x67, 0x7A, 0x58, 0x73, 0x75, 0x38, 0x6C, 0x6B, 0x42, 0x61, 0x72, 0x63, 0x4E, 0x75, 0x41, 0x65, 0x42, 0x66, 0x6F, 0x73, 0x34, 0x47, 0x7A, 0x6A, 0x6D, 0x43, 0x6C, 0x65, + 0x5A, 0x50, 0x65, 0x34, 0x68, 0x36, 0x4B, 0x50, 0x31, 0x44, 0x42, 0x62, 0x64, 0x69, 0x2B, 0x77, 0x30, 0x6A, 0x70, 0x77, 0x71, 0x48, 0x41, 0x41, 0x56, 0x46, 0x34, 0x31, 0x6F, 0x67, 0x39, 0x4A, 0x77, 0x6E, 0x78, 0x67, 0x49, 0x0A, 0x7A, 0x52, + 0x46, 0x6F, 0x31, 0x63, 0x6C, 0x72, 0x55, 0x73, 0x33, 0x45, 0x52, 0x6F, 0x2F, 0x63, 0x74, 0x66, 0x50, 0x59, 0x56, 0x33, 0x4D, 0x65, 0x36, 0x5A, 0x51, 0x35, 0x42, 0x4C, 0x2F, 0x54, 0x33, 0x6A, 0x6A, 0x65, 0x74, 0x46, 0x50, 0x73, 0x61, 0x52, + 0x79, 0x69, 0x66, 0x73, 0x53, 0x50, 0x35, 0x42, 0x74, 0x77, 0x72, 0x66, 0x4B, 0x69, 0x2B, 0x66, 0x76, 0x33, 0x46, 0x6D, 0x52, 0x6D, 0x61, 0x5A, 0x39, 0x4A, 0x55, 0x61, 0x4C, 0x69, 0x46, 0x52, 0x68, 0x6E, 0x0A, 0x42, 0x6B, 0x70, 0x2F, 0x31, + 0x57, 0x79, 0x31, 0x54, 0x62, 0x4D, 0x7A, 0x34, 0x47, 0x48, 0x72, 0x58, 0x62, 0x37, 0x70, 0x6D, 0x41, 0x38, 0x79, 0x31, 0x78, 0x31, 0x4C, 0x50, 0x43, 0x35, 0x61, 0x41, 0x56, 0x4B, 0x52, 0x43, 0x66, 0x4C, 0x66, 0x36, 0x6F, 0x33, 0x59, 0x42, + 0x6B, 0x42, 0x6A, 0x71, 0x68, 0x48, 0x6B, 0x2F, 0x73, 0x4D, 0x33, 0x6E, 0x68, 0x52, 0x53, 0x50, 0x2F, 0x54, 0x69, 0x7A, 0x50, 0x4A, 0x68, 0x6B, 0x39, 0x48, 0x39, 0x5A, 0x32, 0x76, 0x58, 0x0A, 0x55, 0x71, 0x36, 0x2F, 0x61, 0x4B, 0x74, 0x41, + 0x51, 0x36, 0x42, 0x58, 0x4E, 0x56, 0x4E, 0x34, 0x38, 0x46, 0x50, 0x34, 0x59, 0x55, 0x49, 0x48, 0x5A, 0x4D, 0x62, 0x58, 0x62, 0x35, 0x74, 0x4D, 0x4F, 0x41, 0x31, 0x6A, 0x72, 0x47, 0x4B, 0x76, 0x4E, 0x6F, 0x75, 0x69, 0x63, 0x77, 0x6F, 0x4E, + 0x39, 0x53, 0x47, 0x39, 0x64, 0x4B, 0x70, 0x4E, 0x36, 0x6E, 0x49, 0x44, 0x53, 0x64, 0x76, 0x48, 0x58, 0x78, 0x31, 0x69, 0x59, 0x38, 0x66, 0x39, 0x33, 0x5A, 0x48, 0x73, 0x0A, 0x4D, 0x2B, 0x37, 0x31, 0x62, 0x62, 0x52, 0x75, 0x4D, 0x47, 0x6A, + 0x65, 0x79, 0x4E, 0x59, 0x6D, 0x73, 0x48, 0x56, 0x65, 0x65, 0x37, 0x51, 0x48, 0x49, 0x4A, 0x69, 0x68, 0x64, 0x6A, 0x4B, 0x34, 0x54, 0x57, 0x78, 0x50, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4D, 0x6D, 0x41, 0x64, 0x2B, + 0x42, 0x69, 0x6B, 0x6F, 0x4C, 0x31, 0x52, 0x70, 0x7A, 0x7A, 0x75, 0x76, 0x64, 0x4D, 0x77, 0x39, 0x36, 0x34, 0x6F, 0x36, 0x30, 0x35, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, + 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x0A, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x55, 0x31, 0x38, 0x68, 0x39, 0x62, 0x71, 0x77, 0x4F, + 0x6C, 0x49, 0x35, 0x4C, 0x4A, 0x4B, 0x77, 0x62, 0x41, 0x44, 0x4A, 0x37, 0x38, 0x34, 0x67, 0x37, 0x77, 0x62, 0x79, 0x6C, 0x70, 0x37, 0x70, 0x70, 0x48, 0x52, 0x2F, 0x65, 0x68, 0x62, 0x38, 0x74, 0x2F, 0x57, 0x32, 0x2B, 0x78, 0x55, 0x62, 0x50, + 0x36, 0x75, 0x6D, 0x77, 0x48, 0x4A, 0x64, 0x45, 0x4C, 0x46, 0x78, 0x37, 0x72, 0x78, 0x50, 0x34, 0x36, 0x32, 0x73, 0x0A, 0x41, 0x32, 0x30, 0x75, 0x63, 0x53, 0x36, 0x76, 0x78, 0x4F, 0x4F, 0x74, 0x6F, 0x37, 0x30, 0x4D, 0x45, 0x61, 0x65, 0x30, + 0x2F, 0x30, 0x71, 0x79, 0x65, 0x78, 0x41, 0x51, 0x48, 0x36, 0x64, 0x58, 0x51, 0x62, 0x4C, 0x41, 0x72, 0x76, 0x51, 0x73, 0x57, 0x64, 0x5A, 0x48, 0x45, 0x49, 0x6A, 0x7A, 0x49, 0x56, 0x45, 0x70, 0x4D, 0x4D, 0x70, 0x67, 0x68, 0x71, 0x39, 0x47, + 0x71, 0x78, 0x33, 0x74, 0x4F, 0x6C, 0x75, 0x77, 0x6C, 0x4E, 0x35, 0x45, 0x34, 0x30, 0x45, 0x49, 0x0A, 0x6F, 0x73, 0x48, 0x73, 0x48, 0x64, 0x62, 0x39, 0x54, 0x37, 0x62, 0x57, 0x52, 0x39, 0x41, 0x55, 0x43, 0x38, 0x72, 0x6D, 0x79, 0x72, 0x56, + 0x37, 0x64, 0x33, 0x35, 0x42, 0x48, 0x31, 0x36, 0x44, 0x78, 0x37, 0x61, 0x4D, 0x4F, 0x5A, 0x61, 0x77, 0x50, 0x35, 0x61, 0x42, 0x51, 0x57, 0x39, 0x67, 0x6B, 0x4F, 0x4C, 0x6F, 0x2B, 0x66, 0x73, 0x69, 0x63, 0x64, 0x6C, 0x39, 0x73, 0x7A, 0x31, + 0x47, 0x76, 0x37, 0x53, 0x45, 0x72, 0x35, 0x41, 0x63, 0x44, 0x34, 0x38, 0x53, 0x0A, 0x61, 0x71, 0x2F, 0x76, 0x37, 0x68, 0x35, 0x36, 0x72, 0x67, 0x4A, 0x4B, 0x69, 0x68, 0x63, 0x72, 0x64, 0x76, 0x36, 0x73, 0x56, 0x49, 0x6B, 0x6B, 0x4C, 0x45, + 0x38, 0x2F, 0x74, 0x72, 0x4B, 0x6E, 0x54, 0x6F, 0x79, 0x6F, 0x6B, 0x5A, 0x66, 0x37, 0x4B, 0x63, 0x5A, 0x37, 0x58, 0x43, 0x32, 0x35, 0x79, 0x32, 0x61, 0x32, 0x74, 0x36, 0x68, 0x62, 0x45, 0x6C, 0x47, 0x46, 0x74, 0x51, 0x6C, 0x2B, 0x59, 0x6E, + 0x68, 0x77, 0x2F, 0x71, 0x6C, 0x71, 0x59, 0x4C, 0x59, 0x64, 0x0A, 0x44, 0x6E, 0x6B, 0x4D, 0x2F, 0x63, 0x72, 0x71, 0x4A, 0x49, 0x42, 0x79, 0x77, 0x35, 0x63, 0x2F, 0x38, 0x6E, 0x65, 0x72, 0x51, 0x79, 0x49, 0x4B, 0x78, 0x2B, 0x75, 0x32, 0x44, + 0x49, 0x53, 0x43, 0x4C, 0x49, 0x42, 0x72, 0x51, 0x59, 0x6F, 0x49, 0x77, 0x4F, 0x75, 0x6C, 0x61, 0x39, 0x2B, 0x5A, 0x45, 0x73, 0x75, 0x4B, 0x31, 0x56, 0x36, 0x41, 0x44, 0x4A, 0x48, 0x67, 0x4A, 0x67, 0x67, 0x32, 0x53, 0x4D, 0x58, 0x36, 0x4F, + 0x42, 0x45, 0x31, 0x2F, 0x79, 0x57, 0x44, 0x0A, 0x4C, 0x66, 0x4A, 0x36, 0x76, 0x39, 0x72, 0x39, 0x6A, 0x76, 0x36, 0x6C, 0x79, 0x30, 0x55, 0x73, 0x48, 0x38, 0x53, 0x49, 0x55, 0x36, 0x35, 0x33, 0x44, 0x74, 0x6D, 0x61, 0x64, 0x73, 0x57, 0x4F, + 0x4C, 0x42, 0x32, 0x6A, 0x75, 0x74, 0x58, 0x73, 0x4D, 0x71, 0x37, 0x41, 0x71, 0x71, 0x7A, 0x33, 0x30, 0x58, 0x70, 0x4E, 0x36, 0x39, 0x51, 0x48, 0x34, 0x6B, 0x6A, 0x33, 0x49, 0x6F, 0x36, 0x77, 0x70, 0x4A, 0x39, 0x71, 0x7A, 0x6F, 0x36, 0x79, + 0x73, 0x6D, 0x44, 0x30, 0x0A, 0x6F, 0x79, 0x4C, 0x51, 0x49, 0x2B, 0x75, 0x55, 0x57, 0x6E, 0x70, 0x70, 0x33, 0x51, 0x2B, 0x2F, 0x51, 0x46, 0x65, 0x73, 0x61, 0x31, 0x6C, 0x51, 0x32, 0x61, 0x4F, 0x5A, 0x34, 0x57, 0x37, 0x2B, 0x6A, 0x51, 0x46, + 0x35, 0x4A, 0x79, 0x4D, 0x56, 0x33, 0x70, 0x4B, 0x64, 0x65, 0x77, 0x6C, 0x4E, 0x57, 0x75, 0x64, 0x4C, 0x53, 0x44, 0x42, 0x61, 0x47, 0x4F, 0x59, 0x4B, 0x62, 0x65, 0x61, 0x50, 0x34, 0x4E, 0x4B, 0x37, 0x35, 0x74, 0x39, 0x38, 0x62, 0x69, 0x47, + 0x43, 0x0A, 0x77, 0x57, 0x67, 0x35, 0x54, 0x62, 0x53, 0x59, 0x57, 0x47, 0x5A, 0x69, 0x7A, 0x45, 0x71, 0x51, 0x58, 0x73, 0x50, 0x36, 0x4A, 0x77, 0x53, 0x78, 0x65, 0x52, 0x56, 0x30, 0x6D, 0x63, 0x79, 0x2B, 0x72, 0x53, 0x44, 0x65, 0x4A, 0x6D, + 0x41, 0x63, 0x36, 0x31, 0x5A, 0x52, 0x70, 0x71, 0x50, 0x71, 0x35, 0x4B, 0x4D, 0x2F, 0x70, 0x2F, 0x39, 0x68, 0x33, 0x50, 0x46, 0x61, 0x54, 0x57, 0x77, 0x79, 0x49, 0x30, 0x50, 0x75, 0x72, 0x4B, 0x6A, 0x75, 0x37, 0x6B, 0x6F, 0x53, 0x0A, 0x43, + 0x54, 0x78, 0x64, 0x63, 0x63, 0x4B, 0x2B, 0x65, 0x66, 0x72, 0x43, 0x68, 0x32, 0x67, 0x64, 0x43, 0x2F, 0x31, 0x63, 0x61, 0x63, 0x77, 0x47, 0x30, 0x4A, 0x70, 0x39, 0x56, 0x4A, 0x6B, 0x71, 0x79, 0x54, 0x6B, 0x61, 0x47, 0x61, 0x39, 0x4C, 0x4B, + 0x6B, 0x50, 0x7A, 0x59, 0x31, 0x31, 0x61, 0x57, 0x4F, 0x49, 0x76, 0x34, 0x78, 0x33, 0x6B, 0x71, 0x64, 0x62, 0x51, 0x43, 0x74, 0x43, 0x65, 0x76, 0x39, 0x65, 0x42, 0x43, 0x66, 0x48, 0x4A, 0x78, 0x79, 0x59, 0x4E, 0x0A, 0x72, 0x4A, 0x67, 0x57, + 0x56, 0x71, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x42, 0x75, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, + 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x57, 0x54, 0x43, 0x43, 0x41, 0x30, 0x47, 0x67, + 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x4F, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x4F, 0x54, 0x7A, 0x45, 0x64, 0x4D, 0x42, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x55, 0x0A, 0x51, 0x6E, 0x56, 0x35, 0x63, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x42, 0x42, 0x55, 0x79, 0x30, + 0x35, 0x4F, 0x44, 0x4D, 0x78, 0x4E, 0x6A, 0x4D, 0x7A, 0x4D, 0x6A, 0x63, 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x30, 0x4A, 0x31, 0x65, 0x58, 0x42, 0x68, 0x63, 0x33, 0x4D, 0x67, 0x51, 0x32, 0x78, + 0x68, 0x63, 0x33, 0x4D, 0x67, 0x4D, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x0A, 0x44, 0x54, 0x45, 0x77, 0x4D, 0x54, 0x41, 0x79, 0x4E, 0x6A, 0x41, 0x34, 0x4D, 0x6A, 0x67, 0x31, 0x4F, 0x46, + 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x41, 0x79, 0x4E, 0x6A, 0x41, 0x34, 0x4D, 0x6A, 0x67, 0x31, 0x4F, 0x46, 0x6F, 0x77, 0x54, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x54, 0x6B, + 0x38, 0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x46, 0x45, 0x4A, 0x31, 0x0A, 0x65, 0x58, 0x42, 0x68, 0x63, 0x33, 0x4D, 0x67, 0x51, 0x56, 0x4D, 0x74, 0x4F, 0x54, 0x67, 0x7A, 0x4D, 0x54, 0x59, 0x7A, 0x4D, + 0x7A, 0x49, 0x33, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x64, 0x43, 0x64, 0x58, 0x6C, 0x77, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x44, 0x4D, 0x67, 0x55, + 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, + 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x58, 0x61, 0x43, 0x70, 0x55, 0x57, 0x55, 0x4F, 0x4F, 0x56, 0x38, 0x6C, 0x36, 0x64, 0x64, 0x6A, 0x45, 0x47, 0x4D, 0x6E, 0x71, 0x62, 0x38, 0x52, 0x42, 0x32, + 0x75, 0x41, 0x43, 0x61, 0x74, 0x56, 0x49, 0x32, 0x7A, 0x53, 0x52, 0x48, 0x0A, 0x73, 0x4A, 0x38, 0x59, 0x5A, 0x4C, 0x79, 0x61, 0x39, 0x76, 0x72, 0x56, 0x65, 0x64, 0x69, 0x51, 0x59, 0x6B, 0x77, 0x69, 0x4C, 0x39, 0x34, 0x34, 0x50, 0x64, 0x62, + 0x67, 0x71, 0x4F, 0x6B, 0x63, 0x4C, 0x4E, 0x74, 0x34, 0x45, 0x65, 0x6D, 0x4F, 0x61, 0x46, 0x45, 0x56, 0x63, 0x73, 0x66, 0x7A, 0x4D, 0x34, 0x66, 0x6B, 0x6F, 0x46, 0x30, 0x4C, 0x58, 0x4F, 0x42, 0x58, 0x42, 0x79, 0x6F, 0x77, 0x39, 0x63, 0x33, + 0x45, 0x4E, 0x33, 0x63, 0x6F, 0x54, 0x52, 0x69, 0x52, 0x0A, 0x35, 0x72, 0x2F, 0x56, 0x55, 0x76, 0x31, 0x78, 0x4C, 0x58, 0x41, 0x2B, 0x35, 0x38, 0x62, 0x45, 0x69, 0x75, 0x50, 0x77, 0x4B, 0x41, 0x76, 0x30, 0x64, 0x70, 0x69, 0x68, 0x69, 0x34, + 0x64, 0x56, 0x73, 0x6A, 0x6F, 0x54, 0x2F, 0x4C, 0x63, 0x2B, 0x4A, 0x7A, 0x65, 0x4F, 0x49, 0x75, 0x4F, 0x6F, 0x54, 0x79, 0x72, 0x76, 0x59, 0x4C, 0x73, 0x39, 0x74, 0x7A, 0x6E, 0x44, 0x44, 0x67, 0x46, 0x48, 0x6D, 0x56, 0x30, 0x53, 0x54, 0x39, + 0x74, 0x44, 0x2B, 0x6C, 0x65, 0x68, 0x0A, 0x37, 0x66, 0x6D, 0x64, 0x76, 0x68, 0x46, 0x48, 0x4A, 0x6C, 0x73, 0x54, 0x6D, 0x4B, 0x74, 0x64, 0x46, 0x6F, 0x71, 0x77, 0x4E, 0x78, 0x78, 0x58, 0x6E, 0x55, 0x58, 0x2F, 0x69, 0x4A, 0x59, 0x32, 0x76, + 0x37, 0x76, 0x4B, 0x42, 0x33, 0x74, 0x76, 0x68, 0x32, 0x50, 0x58, 0x30, 0x44, 0x4A, 0x71, 0x31, 0x6C, 0x31, 0x73, 0x44, 0x50, 0x47, 0x7A, 0x62, 0x6A, 0x6E, 0x69, 0x61, 0x7A, 0x45, 0x75, 0x4F, 0x51, 0x41, 0x6E, 0x46, 0x4E, 0x34, 0x34, 0x77, + 0x4F, 0x77, 0x5A, 0x0A, 0x5A, 0x6F, 0x59, 0x53, 0x36, 0x4A, 0x31, 0x79, 0x46, 0x68, 0x4E, 0x6B, 0x55, 0x73, 0x65, 0x70, 0x4E, 0x78, 0x7A, 0x39, 0x67, 0x6A, 0x44, 0x74, 0x68, 0x42, 0x67, 0x64, 0x39, 0x4B, 0x35, 0x63, 0x2F, 0x33, 0x41, 0x54, + 0x41, 0x4F, 0x75, 0x78, 0x39, 0x54, 0x4E, 0x36, 0x53, 0x39, 0x5A, 0x56, 0x2B, 0x41, 0x57, 0x4E, 0x53, 0x32, 0x6D, 0x77, 0x39, 0x62, 0x4D, 0x6F, 0x4E, 0x6C, 0x77, 0x55, 0x78, 0x46, 0x46, 0x7A, 0x54, 0x57, 0x73, 0x4C, 0x38, 0x54, 0x51, 0x48, + 0x0A, 0x32, 0x78, 0x63, 0x35, 0x31, 0x39, 0x77, 0x6F, 0x65, 0x32, 0x76, 0x31, 0x6E, 0x2F, 0x4D, 0x75, 0x77, 0x55, 0x38, 0x58, 0x4B, 0x68, 0x44, 0x7A, 0x7A, 0x4D, 0x72, 0x6F, 0x36, 0x2F, 0x31, 0x72, 0x71, 0x79, 0x36, 0x61, 0x6E, 0x79, 0x32, + 0x43, 0x62, 0x67, 0x54, 0x55, 0x55, 0x67, 0x47, 0x54, 0x4C, 0x54, 0x32, 0x47, 0x2F, 0x48, 0x37, 0x38, 0x33, 0x2B, 0x39, 0x43, 0x48, 0x61, 0x5A, 0x72, 0x37, 0x37, 0x6B, 0x67, 0x78, 0x76, 0x65, 0x39, 0x6F, 0x4B, 0x65, 0x56, 0x0A, 0x2F, 0x61, + 0x66, 0x6D, 0x69, 0x53, 0x54, 0x59, 0x7A, 0x49, 0x77, 0x30, 0x62, 0x4F, 0x49, 0x6A, 0x4C, 0x39, 0x6B, 0x53, 0x47, 0x69, 0x47, 0x35, 0x56, 0x5A, 0x46, 0x76, 0x43, 0x35, 0x46, 0x35, 0x47, 0x51, 0x79, 0x74, 0x51, 0x49, 0x67, 0x4C, 0x63, 0x4F, + 0x4A, 0x36, 0x30, 0x67, 0x37, 0x59, 0x61, 0x45, 0x69, 0x37, 0x67, 0x68, 0x4D, 0x35, 0x45, 0x46, 0x6A, 0x70, 0x32, 0x43, 0x6F, 0x48, 0x78, 0x68, 0x4C, 0x62, 0x57, 0x4E, 0x76, 0x53, 0x4F, 0x31, 0x55, 0x51, 0x0A, 0x52, 0x77, 0x55, 0x56, 0x5A, + 0x32, 0x4A, 0x2B, 0x47, 0x47, 0x4F, 0x6D, 0x52, 0x6A, 0x38, 0x4A, 0x44, 0x6C, 0x51, 0x79, 0x58, 0x72, 0x38, 0x4E, 0x59, 0x6E, 0x6F, 0x6E, 0x37, 0x34, 0x44, 0x6F, 0x32, 0x39, 0x6C, 0x4C, 0x42, 0x6C, 0x6F, 0x33, 0x57, 0x69, 0x58, 0x51, 0x43, + 0x42, 0x4A, 0x33, 0x31, 0x47, 0x38, 0x4A, 0x55, 0x4A, 0x63, 0x39, 0x79, 0x42, 0x33, 0x44, 0x33, 0x34, 0x78, 0x46, 0x4D, 0x46, 0x62, 0x47, 0x30, 0x32, 0x53, 0x72, 0x5A, 0x76, 0x50, 0x41, 0x0A, 0x58, 0x70, 0x61, 0x63, 0x77, 0x38, 0x54, 0x76, + 0x77, 0x33, 0x78, 0x72, 0x69, 0x7A, 0x70, 0x35, 0x66, 0x37, 0x4E, 0x4A, 0x7A, 0x7A, 0x33, 0x69, 0x69, 0x5A, 0x2B, 0x67, 0x4D, 0x45, 0x75, 0x46, 0x75, 0x5A, 0x79, 0x55, 0x4A, 0x48, 0x6D, 0x50, 0x66, 0x57, 0x75, 0x70, 0x52, 0x57, 0x67, 0x50, + 0x4B, 0x39, 0x44, 0x78, 0x32, 0x68, 0x7A, 0x4C, 0x61, 0x62, 0x6A, 0x4B, 0x53, 0x57, 0x4A, 0x74, 0x79, 0x4E, 0x42, 0x6A, 0x59, 0x74, 0x31, 0x67, 0x44, 0x31, 0x69, 0x71, 0x0A, 0x6A, 0x36, 0x47, 0x38, 0x42, 0x61, 0x56, 0x6D, 0x6F, 0x73, 0x38, + 0x62, 0x64, 0x72, 0x4B, 0x45, 0x5A, 0x4C, 0x46, 0x4D, 0x4F, 0x56, 0x4C, 0x41, 0x4D, 0x4C, 0x72, 0x77, 0x6A, 0x45, 0x73, 0x43, 0x73, 0x4C, 0x61, 0x33, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x45, 0x65, 0x34, 0x7A, 0x66, + 0x2F, 0x6C, 0x62, 0x2B, 0x37, 0x34, 0x73, 0x75, 0x77, 0x76, 0x54, 0x67, 0x37, 0x35, 0x4A, 0x62, 0x43, 0x4F, 0x50, 0x47, 0x76, 0x44, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, + 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x0A, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x41, 0x43, 0x41, 0x6A, 0x51, 0x54, 0x55, 0x45, 0x6B, + 0x4D, 0x4A, 0x41, 0x59, 0x6D, 0x44, 0x76, 0x34, 0x6A, 0x56, 0x4D, 0x31, 0x7A, 0x2B, 0x73, 0x34, 0x6A, 0x53, 0x51, 0x75, 0x4B, 0x46, 0x76, 0x64, 0x76, 0x6F, 0x57, 0x46, 0x71, 0x52, 0x49, 0x4E, 0x79, 0x7A, 0x70, 0x6B, 0x4D, 0x4C, 0x79, 0x50, + 0x50, 0x67, 0x4B, 0x6E, 0x39, 0x69, 0x42, 0x35, 0x62, 0x74, 0x62, 0x32, 0x69, 0x55, 0x73, 0x70, 0x4B, 0x64, 0x56, 0x0A, 0x63, 0x53, 0x51, 0x79, 0x39, 0x73, 0x67, 0x4C, 0x38, 0x72, 0x78, 0x71, 0x2B, 0x4A, 0x4F, 0x73, 0x73, 0x67, 0x66, 0x43, + 0x58, 0x35, 0x2F, 0x62, 0x7A, 0x4D, 0x69, 0x4B, 0x71, 0x72, 0x35, 0x71, 0x62, 0x2B, 0x46, 0x4A, 0x45, 0x4D, 0x77, 0x78, 0x31, 0x34, 0x43, 0x37, 0x75, 0x38, 0x6A, 0x59, 0x6F, 0x67, 0x35, 0x6B, 0x56, 0x2B, 0x71, 0x69, 0x39, 0x63, 0x4B, 0x70, + 0x4D, 0x52, 0x58, 0x53, 0x49, 0x47, 0x72, 0x73, 0x2F, 0x43, 0x49, 0x42, 0x4B, 0x4D, 0x2B, 0x47, 0x0A, 0x75, 0x49, 0x41, 0x65, 0x71, 0x63, 0x77, 0x52, 0x70, 0x54, 0x7A, 0x79, 0x46, 0x72, 0x4E, 0x48, 0x6E, 0x66, 0x7A, 0x53, 0x67, 0x43, 0x48, + 0x45, 0x79, 0x39, 0x42, 0x48, 0x63, 0x45, 0x47, 0x68, 0x79, 0x6F, 0x4D, 0x5A, 0x43, 0x43, 0x78, 0x74, 0x38, 0x6C, 0x31, 0x33, 0x6E, 0x49, 0x6F, 0x55, 0x45, 0x39, 0x51, 0x32, 0x48, 0x4A, 0x4C, 0x77, 0x35, 0x51, 0x59, 0x33, 0x33, 0x4B, 0x62, + 0x6D, 0x6B, 0x4A, 0x73, 0x34, 0x6A, 0x31, 0x78, 0x72, 0x47, 0x30, 0x61, 0x47, 0x0A, 0x51, 0x30, 0x4A, 0x66, 0x50, 0x67, 0x45, 0x48, 0x55, 0x31, 0x52, 0x64, 0x5A, 0x58, 0x33, 0x33, 0x69, 0x6E, 0x4F, 0x68, 0x6D, 0x6C, 0x52, 0x61, 0x48, 0x79, + 0x6C, 0x44, 0x46, 0x43, 0x66, 0x43, 0x68, 0x51, 0x2B, 0x31, 0x69, 0x48, 0x73, 0x61, 0x4F, 0x35, 0x53, 0x33, 0x48, 0x57, 0x43, 0x6E, 0x74, 0x5A, 0x7A, 0x6E, 0x4B, 0x57, 0x6C, 0x58, 0x57, 0x70, 0x75, 0x54, 0x65, 0x6B, 0x4D, 0x77, 0x47, 0x77, + 0x50, 0x58, 0x59, 0x73, 0x68, 0x41, 0x70, 0x71, 0x72, 0x38, 0x0A, 0x5A, 0x4F, 0x52, 0x4B, 0x31, 0x35, 0x46, 0x54, 0x41, 0x61, 0x67, 0x67, 0x69, 0x47, 0x36, 0x63, 0x58, 0x30, 0x53, 0x35, 0x79, 0x32, 0x43, 0x42, 0x4E, 0x4F, 0x78, 0x76, 0x30, + 0x33, 0x33, 0x61, 0x53, 0x46, 0x2F, 0x72, 0x74, 0x4A, 0x43, 0x38, 0x4C, 0x61, 0x6B, 0x63, 0x43, 0x36, 0x77, 0x63, 0x31, 0x61, 0x4A, 0x6F, 0x49, 0x49, 0x41, 0x45, 0x31, 0x76, 0x79, 0x78, 0x6A, 0x79, 0x2B, 0x37, 0x53, 0x6A, 0x45, 0x4E, 0x53, + 0x6F, 0x59, 0x63, 0x36, 0x2B, 0x49, 0x32, 0x0A, 0x4B, 0x53, 0x62, 0x31, 0x32, 0x74, 0x6A, 0x45, 0x38, 0x6E, 0x56, 0x68, 0x7A, 0x33, 0x36, 0x75, 0x64, 0x6D, 0x4E, 0x4B, 0x65, 0x6B, 0x42, 0x6C, 0x6B, 0x34, 0x66, 0x34, 0x48, 0x6F, 0x43, 0x4D, + 0x68, 0x75, 0x57, 0x47, 0x31, 0x6F, 0x38, 0x4F, 0x2F, 0x46, 0x4D, 0x73, 0x59, 0x4F, 0x67, 0x57, 0x59, 0x52, 0x71, 0x69, 0x50, 0x6B, 0x4E, 0x37, 0x7A, 0x54, 0x6C, 0x67, 0x56, 0x47, 0x72, 0x31, 0x38, 0x6F, 0x6B, 0x6D, 0x41, 0x57, 0x69, 0x44, + 0x53, 0x4B, 0x49, 0x7A, 0x0A, 0x36, 0x4D, 0x6B, 0x45, 0x6B, 0x62, 0x49, 0x52, 0x4E, 0x42, 0x45, 0x2B, 0x36, 0x74, 0x42, 0x44, 0x47, 0x52, 0x38, 0x44, 0x6B, 0x35, 0x41, 0x4D, 0x2F, 0x31, 0x45, 0x39, 0x56, 0x2F, 0x52, 0x42, 0x62, 0x75, 0x48, + 0x4C, 0x6F, 0x4C, 0x37, 0x72, 0x79, 0x57, 0x50, 0x4E, 0x62, 0x63, 0x7A, 0x6B, 0x2B, 0x44, 0x61, 0x71, 0x61, 0x4A, 0x33, 0x74, 0x76, 0x56, 0x32, 0x58, 0x63, 0x45, 0x51, 0x4E, 0x74, 0x67, 0x34, 0x31, 0x33, 0x4F, 0x45, 0x4D, 0x58, 0x62, 0x75, + 0x67, 0x0A, 0x55, 0x5A, 0x54, 0x4C, 0x66, 0x68, 0x62, 0x72, 0x45, 0x53, 0x2B, 0x6A, 0x6B, 0x6B, 0x58, 0x49, 0x54, 0x48, 0x48, 0x5A, 0x76, 0x4D, 0x6D, 0x5A, 0x55, 0x6C, 0x64, 0x47, 0x4C, 0x31, 0x44, 0x50, 0x76, 0x54, 0x56, 0x70, 0x39, 0x44, + 0x30, 0x56, 0x7A, 0x67, 0x61, 0x6C, 0x4C, 0x41, 0x38, 0x2B, 0x39, 0x6F, 0x47, 0x36, 0x6C, 0x4C, 0x76, 0x44, 0x75, 0x37, 0x39, 0x6C, 0x65, 0x4E, 0x4B, 0x47, 0x65, 0x66, 0x39, 0x4A, 0x4F, 0x78, 0x71, 0x44, 0x44, 0x50, 0x44, 0x65, 0x0A, 0x65, + 0x4F, 0x7A, 0x49, 0x38, 0x6B, 0x31, 0x4D, 0x47, 0x74, 0x36, 0x43, 0x4B, 0x66, 0x6A, 0x42, 0x57, 0x74, 0x72, 0x74, 0x37, 0x75, 0x59, 0x6E, 0x58, 0x75, 0x68, 0x46, 0x30, 0x4A, 0x30, 0x63, 0x55, 0x61, 0x68, 0x6F, 0x71, 0x30, 0x54, 0x6A, 0x30, + 0x49, 0x74, 0x71, 0x34, 0x2F, 0x67, 0x37, 0x75, 0x39, 0x78, 0x4E, 0x31, 0x32, 0x54, 0x79, 0x55, 0x62, 0x37, 0x6D, 0x71, 0x71, 0x74, 0x61, 0x36, 0x54, 0x48, 0x75, 0x42, 0x72, 0x78, 0x7A, 0x76, 0x78, 0x4E, 0x69, 0x0A, 0x43, 0x70, 0x2F, 0x48, + 0x75, 0x5A, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x2D, 0x54, 0x65, 0x6C, 0x65, 0x53, 0x65, + 0x63, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, + 0x49, 0x44, 0x77, 0x7A, 0x43, 0x43, 0x41, 0x71, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, + 0x43, 0x42, 0x67, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x0A, 0x49, 0x6C, 0x51, 0x74, 0x55, + 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x46, 0x62, 0x6E, 0x52, 0x6C, 0x63, 0x6E, 0x42, 0x79, 0x61, 0x58, 0x4E, 0x6C, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x64, 0x74, 0x59, + 0x6B, 0x67, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x46, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x55, 0x0A, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, + 0x5A, 0x57, 0x35, 0x30, 0x5A, 0x58, 0x49, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x51, 0x74, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x56, 0x4E, 0x6C, 0x59, 0x79, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, + 0x59, 0x57, 0x78, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x44, 0x4D, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x78, 0x0A, 0x4D, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x41, 0x79, 0x4F, 0x54, 0x55, + 0x32, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x4D, 0x78, 0x4D, 0x44, 0x41, 0x78, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x67, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, + 0x43, 0x52, 0x45, 0x55, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x49, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x0A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x46, 0x62, 0x6E, 0x52, 0x6C, 0x63, 0x6E, + 0x42, 0x79, 0x61, 0x58, 0x4E, 0x6C, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x46, 0x6C, + 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, 0x0A, 0x5A, 0x57, 0x35, 0x30, 0x5A, 0x58, 0x49, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x51, 0x74, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x56, 0x4E, 0x6C, 0x59, 0x79, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, + 0x44, 0x4D, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x0A, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, + 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x39, 0x64, 0x5A, 0x50, 0x77, 0x59, 0x69, 0x4A, 0x76, 0x4A, 0x4B, 0x37, 0x67, 0x65, 0x6E, 0x61, 0x73, 0x66, 0x62, 0x33, 0x5A, 0x4A, 0x4E, 0x57, 0x34, 0x74, 0x2F, 0x7A, 0x4E, 0x38, 0x45, 0x4C, 0x67, + 0x36, 0x33, 0x69, 0x49, 0x56, 0x6C, 0x36, 0x62, 0x6D, 0x6C, 0x51, 0x64, 0x54, 0x51, 0x79, 0x4B, 0x0A, 0x39, 0x74, 0x50, 0x50, 0x63, 0x50, 0x52, 0x53, 0x74, 0x64, 0x69, 0x54, 0x42, 0x4F, 0x4E, 0x47, 0x68, 0x6E, 0x46, 0x42, 0x53, 0x69, 0x76, + 0x77, 0x4B, 0x69, 0x78, 0x56, 0x41, 0x39, 0x5A, 0x49, 0x77, 0x2B, 0x41, 0x35, 0x4F, 0x4F, 0x33, 0x79, 0x58, 0x44, 0x77, 0x2F, 0x52, 0x4C, 0x79, 0x54, 0x50, 0x57, 0x47, 0x72, 0x54, 0x73, 0x30, 0x4E, 0x76, 0x76, 0x41, 0x67, 0x4A, 0x31, 0x67, + 0x4F, 0x52, 0x48, 0x38, 0x45, 0x47, 0x6F, 0x65, 0x6C, 0x31, 0x35, 0x59, 0x55, 0x0A, 0x4E, 0x70, 0x44, 0x51, 0x53, 0x58, 0x75, 0x68, 0x64, 0x66, 0x73, 0x61, 0x61, 0x33, 0x4F, 0x78, 0x2B, 0x4D, 0x36, 0x70, 0x43, 0x53, 0x7A, 0x79, 0x55, 0x39, + 0x58, 0x44, 0x46, 0x45, 0x53, 0x34, 0x68, 0x71, 0x58, 0x32, 0x69, 0x79, 0x73, 0x35, 0x32, 0x71, 0x4D, 0x7A, 0x56, 0x4E, 0x6E, 0x36, 0x63, 0x68, 0x72, 0x33, 0x49, 0x68, 0x55, 0x63, 0x69, 0x4A, 0x46, 0x72, 0x66, 0x32, 0x62, 0x6C, 0x77, 0x32, + 0x71, 0x41, 0x73, 0x43, 0x54, 0x7A, 0x33, 0x34, 0x5A, 0x46, 0x0A, 0x69, 0x50, 0x30, 0x5A, 0x66, 0x33, 0x57, 0x48, 0x48, 0x78, 0x2B, 0x78, 0x47, 0x77, 0x70, 0x7A, 0x4A, 0x46, 0x75, 0x35, 0x5A, 0x65, 0x41, 0x73, 0x56, 0x4D, 0x68, 0x67, 0x30, + 0x32, 0x59, 0x58, 0x50, 0x2B, 0x48, 0x4D, 0x56, 0x44, 0x4E, 0x7A, 0x6B, 0x51, 0x49, 0x36, 0x70, 0x6E, 0x39, 0x37, 0x64, 0x6A, 0x6D, 0x69, 0x48, 0x35, 0x61, 0x32, 0x4F, 0x4B, 0x36, 0x31, 0x79, 0x4A, 0x4E, 0x30, 0x48, 0x5A, 0x36, 0x35, 0x74, + 0x4F, 0x56, 0x67, 0x6E, 0x53, 0x39, 0x57, 0x0A, 0x30, 0x65, 0x44, 0x72, 0x58, 0x6C, 0x74, 0x4D, 0x45, 0x6E, 0x41, 0x4D, 0x62, 0x45, 0x51, 0x67, 0x71, 0x78, 0x48, 0x59, 0x39, 0x42, 0x6E, 0x32, 0x30, 0x70, 0x78, 0x53, 0x4E, 0x2B, 0x66, 0x36, + 0x74, 0x73, 0x49, 0x78, 0x4F, 0x30, 0x72, 0x55, 0x46, 0x4A, 0x6D, 0x74, 0x78, 0x78, 0x72, 0x31, 0x58, 0x56, 0x2F, 0x36, 0x42, 0x37, 0x68, 0x38, 0x44, 0x52, 0x2F, 0x57, 0x67, 0x78, 0x36, 0x7A, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, + 0x51, 0x6A, 0x42, 0x41, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, + 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x31, 0x41, 0x2F, 0x64, 0x32, 0x4F, 0x32, 0x47, 0x43, 0x61, 0x68, 0x4B, 0x71, 0x47, 0x46, 0x50, + 0x72, 0x0A, 0x41, 0x79, 0x47, 0x55, 0x76, 0x2F, 0x37, 0x4F, 0x79, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x56, 0x6A, + 0x33, 0x76, 0x6C, 0x4E, 0x57, 0x39, 0x32, 0x6E, 0x4F, 0x79, 0x57, 0x4C, 0x36, 0x75, 0x6B, 0x4B, 0x32, 0x59, 0x4A, 0x35, 0x66, 0x2B, 0x41, 0x62, 0x47, 0x77, 0x55, 0x67, 0x43, 0x34, 0x54, 0x65, 0x51, 0x62, 0x49, 0x58, 0x51, 0x62, 0x0A, 0x66, + 0x73, 0x44, 0x75, 0x58, 0x6D, 0x6B, 0x71, 0x4A, 0x61, 0x39, 0x63, 0x31, 0x68, 0x33, 0x61, 0x30, 0x6E, 0x6E, 0x4A, 0x38, 0x35, 0x63, 0x70, 0x34, 0x49, 0x61, 0x48, 0x33, 0x67, 0x52, 0x5A, 0x44, 0x2F, 0x46, 0x5A, 0x31, 0x47, 0x53, 0x46, 0x53, + 0x35, 0x6D, 0x76, 0x4A, 0x51, 0x51, 0x65, 0x79, 0x55, 0x61, 0x70, 0x6C, 0x39, 0x36, 0x43, 0x73, 0x68, 0x74, 0x77, 0x6E, 0x35, 0x7A, 0x32, 0x72, 0x33, 0x45, 0x78, 0x33, 0x58, 0x73, 0x46, 0x70, 0x53, 0x7A, 0x54, 0x0A, 0x75, 0x63, 0x70, 0x48, + 0x39, 0x73, 0x72, 0x79, 0x39, 0x75, 0x65, 0x74, 0x75, 0x55, 0x67, 0x2F, 0x76, 0x42, 0x61, 0x33, 0x77, 0x57, 0x33, 0x30, 0x36, 0x67, 0x6D, 0x76, 0x37, 0x50, 0x4F, 0x31, 0x35, 0x77, 0x57, 0x65, 0x70, 0x68, 0x36, 0x4B, 0x55, 0x31, 0x48, 0x57, + 0x6B, 0x34, 0x48, 0x4D, 0x64, 0x4A, 0x50, 0x32, 0x75, 0x64, 0x71, 0x6D, 0x4A, 0x51, 0x56, 0x30, 0x65, 0x56, 0x70, 0x2B, 0x51, 0x44, 0x36, 0x43, 0x53, 0x79, 0x59, 0x52, 0x4D, 0x47, 0x37, 0x68, 0x0A, 0x50, 0x30, 0x48, 0x48, 0x52, 0x77, 0x41, + 0x31, 0x31, 0x66, 0x58, 0x54, 0x39, 0x31, 0x51, 0x2B, 0x67, 0x54, 0x33, 0x61, 0x53, 0x57, 0x71, 0x61, 0x73, 0x2B, 0x38, 0x51, 0x50, 0x65, 0x62, 0x72, 0x62, 0x39, 0x48, 0x49, 0x49, 0x6B, 0x66, 0x4C, 0x7A, 0x4D, 0x38, 0x42, 0x4D, 0x5A, 0x4C, + 0x5A, 0x47, 0x4F, 0x4D, 0x69, 0x76, 0x67, 0x6B, 0x65, 0x47, 0x6A, 0x35, 0x61, 0x73, 0x75, 0x52, 0x72, 0x44, 0x46, 0x52, 0x36, 0x66, 0x55, 0x4E, 0x4F, 0x75, 0x49, 0x6D, 0x6C, 0x0A, 0x65, 0x39, 0x65, 0x69, 0x50, 0x5A, 0x61, 0x47, 0x7A, 0x50, + 0x49, 0x6D, 0x4E, 0x43, 0x31, 0x71, 0x6B, 0x70, 0x32, 0x61, 0x47, 0x74, 0x41, 0x77, 0x34, 0x6C, 0x31, 0x4F, 0x42, 0x4C, 0x42, 0x66, 0x69, 0x79, 0x42, 0x2B, 0x64, 0x38, 0x45, 0x39, 0x6C, 0x59, 0x4C, 0x52, 0x52, 0x70, 0x6F, 0x37, 0x50, 0x48, + 0x69, 0x34, 0x62, 0x36, 0x48, 0x51, 0x44, 0x57, 0x53, 0x69, 0x65, 0x42, 0x34, 0x70, 0x54, 0x70, 0x50, 0x44, 0x70, 0x46, 0x51, 0x55, 0x57, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, + 0x32, 0x30, 0x30, 0x39, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x4D, 0x7A, 0x43, 0x43, 0x41, 0x78, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, + 0x41, 0x67, 0x49, 0x44, 0x43, 0x59, 0x50, 0x7A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x45, 0x30, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x44, 0x41, 0x78, 0x45, 0x4C, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, + 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x6B, 0x51, 0x74, 0x56, 0x46, 0x4A, 0x56, 0x55, 0x31, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x62, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x41, + 0x7A, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x4D, 0x6A, 0x41, 0x77, 0x4F, 0x54, 0x41, 0x65, 0x0A, 0x46, 0x77, 0x30, 0x77, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x44, 0x4D, 0x31, 0x4E, 0x54, 0x68, 0x61, 0x46, 0x77, + 0x30, 0x79, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x44, 0x4D, 0x31, 0x4E, 0x54, 0x68, 0x61, 0x4D, 0x45, 0x30, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x52, + 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x78, 0x45, 0x0A, 0x4C, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x4D, 0x4D, 0x48, 0x6B, 0x51, 0x74, 0x56, 0x46, 0x4A, 0x56, 0x55, 0x31, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x62, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x41, 0x7A, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x4D, + 0x6A, 0x41, 0x77, 0x4F, 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, + 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4E, 0x4F, 0x79, 0x53, 0x73, 0x39, 0x36, 0x52, 0x2B, 0x39, 0x31, 0x6D, 0x79, 0x50, 0x36, 0x4F, 0x69, 0x2F, 0x57, 0x55, 0x45, 0x57, 0x4A, 0x4E, 0x54, 0x72, 0x47, 0x61, 0x39, 0x76, 0x2B, + 0x32, 0x77, 0x42, 0x6F, 0x71, 0x4F, 0x41, 0x44, 0x0A, 0x45, 0x52, 0x30, 0x33, 0x55, 0x41, 0x69, 0x66, 0x54, 0x55, 0x70, 0x6F, 0x6C, 0x44, 0x57, 0x7A, 0x55, 0x39, 0x47, 0x55, 0x59, 0x36, 0x63, 0x67, 0x56, 0x71, 0x2F, 0x65, 0x55, 0x58, 0x6A, + 0x73, 0x4B, 0x6A, 0x33, 0x7A, 0x53, 0x45, 0x68, 0x51, 0x50, 0x67, 0x72, 0x66, 0x52, 0x6C, 0x57, 0x4C, 0x4A, 0x32, 0x33, 0x44, 0x45, 0x45, 0x30, 0x4E, 0x6B, 0x56, 0x4A, 0x44, 0x32, 0x49, 0x66, 0x67, 0x58, 0x55, 0x34, 0x32, 0x74, 0x53, 0x48, + 0x4B, 0x58, 0x7A, 0x6C, 0x41, 0x0A, 0x42, 0x46, 0x39, 0x62, 0x66, 0x73, 0x79, 0x6A, 0x78, 0x69, 0x75, 0x70, 0x51, 0x42, 0x37, 0x5A, 0x4E, 0x6F, 0x54, 0x57, 0x53, 0x50, 0x4F, 0x53, 0x48, 0x6A, 0x52, 0x47, 0x49, 0x43, 0x54, 0x42, 0x70, 0x46, + 0x47, 0x4F, 0x53, 0x68, 0x72, 0x76, 0x55, 0x44, 0x39, 0x70, 0x58, 0x52, 0x6C, 0x2F, 0x52, 0x63, 0x50, 0x48, 0x41, 0x59, 0x39, 0x52, 0x79, 0x53, 0x50, 0x6F, 0x63, 0x71, 0x36, 0x30, 0x76, 0x46, 0x59, 0x4A, 0x66, 0x78, 0x4C, 0x4C, 0x48, 0x4C, + 0x47, 0x76, 0x0A, 0x4B, 0x5A, 0x41, 0x4B, 0x79, 0x56, 0x58, 0x4D, 0x44, 0x39, 0x4F, 0x30, 0x47, 0x75, 0x31, 0x48, 0x4E, 0x56, 0x70, 0x4B, 0x37, 0x5A, 0x78, 0x7A, 0x42, 0x43, 0x48, 0x51, 0x71, 0x72, 0x30, 0x4D, 0x45, 0x37, 0x55, 0x41, 0x79, + 0x69, 0x5A, 0x73, 0x78, 0x47, 0x73, 0x4D, 0x6C, 0x46, 0x71, 0x56, 0x6C, 0x4E, 0x70, 0x51, 0x6D, 0x76, 0x48, 0x2F, 0x70, 0x53, 0x74, 0x6D, 0x4D, 0x61, 0x54, 0x4A, 0x4F, 0x4B, 0x44, 0x66, 0x48, 0x52, 0x2B, 0x34, 0x43, 0x53, 0x37, 0x7A, 0x0A, + 0x70, 0x2B, 0x68, 0x6E, 0x55, 0x71, 0x75, 0x56, 0x48, 0x2B, 0x42, 0x47, 0x50, 0x74, 0x69, 0x6B, 0x77, 0x38, 0x70, 0x61, 0x78, 0x54, 0x47, 0x41, 0x36, 0x45, 0x69, 0x61, 0x6E, 0x35, 0x52, 0x70, 0x2F, 0x68, 0x6E, 0x64, 0x32, 0x48, 0x4E, 0x38, + 0x67, 0x63, 0x71, 0x57, 0x33, 0x6F, 0x37, 0x74, 0x73, 0x7A, 0x49, 0x46, 0x5A, 0x59, 0x51, 0x30, 0x35, 0x75, 0x62, 0x39, 0x56, 0x78, 0x43, 0x31, 0x58, 0x33, 0x61, 0x2F, 0x4C, 0x37, 0x41, 0x51, 0x44, 0x63, 0x55, 0x43, 0x0A, 0x41, 0x77, 0x45, + 0x41, 0x41, 0x61, 0x4F, 0x43, 0x41, 0x52, 0x6F, 0x77, 0x67, 0x67, 0x45, 0x57, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x50, 0x33, 0x61, 0x46, 0x4D, 0x53, 0x66, 0x4D, 0x4E, 0x34, 0x68, 0x76, 0x52, 0x35, 0x43, 0x4F, 0x66, 0x79, 0x72, 0x59, 0x79, 0x4E, 0x4A, 0x0A, 0x34, 0x50, 0x47, 0x45, 0x4D, 0x41, + 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x43, 0x42, 0x30, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x66, 0x42, 0x49, 0x48, 0x4C, 0x4D, 0x49, 0x48, 0x49, 0x4D, 0x49, + 0x47, 0x41, 0x6F, 0x48, 0x36, 0x67, 0x66, 0x49, 0x5A, 0x36, 0x62, 0x47, 0x52, 0x68, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x32, 0x52, 0x70, 0x63, 0x6D, 0x56, 0x6A, 0x64, 0x47, 0x39, 0x79, 0x0A, 0x65, 0x53, 0x35, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, + 0x58, 0x4E, 0x30, 0x4C, 0x6D, 0x35, 0x6C, 0x64, 0x43, 0x39, 0x44, 0x54, 0x6A, 0x31, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x4A, 0x54, 0x49, 0x77, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x55, 0x79, 0x4D, 0x45, 0x4E, 0x73, 0x59, + 0x58, 0x4E, 0x7A, 0x4A, 0x54, 0x49, 0x77, 0x4D, 0x79, 0x55, 0x79, 0x4D, 0x45, 0x4E, 0x42, 0x4A, 0x54, 0x49, 0x77, 0x4D, 0x69, 0x55, 0x79, 0x4D, 0x44, 0x49, 0x77, 0x0A, 0x4D, 0x44, 0x6B, 0x73, 0x54, 0x7A, 0x31, 0x45, 0x4C, 0x56, 0x52, 0x79, + 0x64, 0x58, 0x4E, 0x30, 0x4A, 0x54, 0x49, 0x77, 0x52, 0x32, 0x31, 0x69, 0x53, 0x43, 0x78, 0x44, 0x50, 0x55, 0x52, 0x46, 0x50, 0x32, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x6C, 0x63, 0x6D, 0x56, 0x32, + 0x62, 0x32, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6D, 0x78, 0x70, 0x63, 0x33, 0x51, 0x77, 0x51, 0x36, 0x42, 0x42, 0x6F, 0x44, 0x2B, 0x47, 0x0A, 0x50, 0x57, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x33, 0x64, 0x33, 0x63, + 0x75, 0x5A, 0x43, 0x31, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x32, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x66, 0x63, 0x6D, 0x39, 0x76, 0x64, 0x46, 0x39, + 0x6A, 0x62, 0x47, 0x46, 0x7A, 0x63, 0x31, 0x38, 0x7A, 0x58, 0x32, 0x4E, 0x68, 0x58, 0x7A, 0x4A, 0x66, 0x4D, 0x6A, 0x41, 0x77, 0x0A, 0x4F, 0x53, 0x35, 0x6A, 0x63, 0x6D, 0x77, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, + 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x48, 0x2B, 0x58, 0x32, 0x7A, 0x44, 0x49, 0x33, 0x36, 0x53, 0x63, 0x66, 0x53, 0x46, 0x36, 0x67, 0x48, 0x44, 0x4F, 0x46, 0x42, 0x4A, 0x70, 0x69, 0x42, + 0x53, 0x56, 0x59, 0x45, 0x51, 0x42, 0x72, 0x4C, 0x4C, 0x70, 0x4D, 0x45, 0x2B, 0x62, 0x55, 0x4D, 0x4A, 0x6D, 0x0A, 0x32, 0x48, 0x36, 0x4E, 0x4D, 0x4C, 0x56, 0x77, 0x4D, 0x65, 0x6E, 0x69, 0x61, 0x63, 0x66, 0x7A, 0x63, 0x4E, 0x73, 0x67, 0x46, + 0x59, 0x62, 0x51, 0x44, 0x66, 0x43, 0x2B, 0x72, 0x41, 0x46, 0x31, 0x68, 0x4D, 0x35, 0x2B, 0x6E, 0x30, 0x32, 0x2F, 0x74, 0x32, 0x41, 0x37, 0x6E, 0x50, 0x50, 0x4B, 0x48, 0x65, 0x4A, 0x65, 0x61, 0x4E, 0x69, 0x6A, 0x6E, 0x5A, 0x66, 0x6C, 0x51, + 0x47, 0x44, 0x53, 0x4E, 0x69, 0x48, 0x2B, 0x30, 0x4C, 0x53, 0x34, 0x46, 0x39, 0x70, 0x30, 0x0A, 0x6F, 0x33, 0x2F, 0x55, 0x33, 0x37, 0x43, 0x59, 0x41, 0x71, 0x78, 0x76, 0x61, 0x32, 0x73, 0x73, 0x4A, 0x53, 0x52, 0x79, 0x6F, 0x57, 0x58, 0x75, + 0x4A, 0x56, 0x72, 0x6C, 0x35, 0x6A, 0x4C, 0x6E, 0x38, 0x74, 0x2B, 0x72, 0x53, 0x66, 0x72, 0x7A, 0x6B, 0x47, 0x6B, 0x6A, 0x32, 0x77, 0x54, 0x5A, 0x35, 0x31, 0x78, 0x59, 0x2F, 0x47, 0x58, 0x55, 0x6C, 0x37, 0x37, 0x4D, 0x2F, 0x43, 0x34, 0x4B, + 0x7A, 0x43, 0x55, 0x71, 0x4E, 0x51, 0x54, 0x34, 0x59, 0x4A, 0x45, 0x56, 0x0A, 0x64, 0x54, 0x31, 0x42, 0x2F, 0x79, 0x4D, 0x66, 0x47, 0x63, 0x68, 0x73, 0x36, 0x34, 0x4A, 0x54, 0x42, 0x4B, 0x62, 0x6B, 0x54, 0x43, 0x4A, 0x4E, 0x6A, 0x59, 0x79, + 0x36, 0x7A, 0x6C, 0x74, 0x7A, 0x37, 0x47, 0x52, 0x55, 0x55, 0x47, 0x33, 0x52, 0x6E, 0x46, 0x58, 0x37, 0x61, 0x63, 0x4D, 0x32, 0x77, 0x34, 0x79, 0x38, 0x50, 0x49, 0x57, 0x6D, 0x61, 0x77, 0x6F, 0x6D, 0x44, 0x65, 0x43, 0x54, 0x6D, 0x47, 0x43, + 0x75, 0x66, 0x73, 0x59, 0x6B, 0x6C, 0x34, 0x70, 0x68, 0x0A, 0x58, 0x35, 0x47, 0x4F, 0x5A, 0x70, 0x49, 0x4A, 0x68, 0x7A, 0x62, 0x4E, 0x69, 0x35, 0x73, 0x74, 0x50, 0x76, 0x5A, 0x52, 0x31, 0x46, 0x44, 0x55, 0x57, 0x53, 0x69, 0x39, 0x67, 0x2F, + 0x4C, 0x4D, 0x4B, 0x48, 0x74, 0x54, 0x68, 0x6D, 0x33, 0x59, 0x4A, 0x6F, 0x68, 0x77, 0x31, 0x2B, 0x71, 0x52, 0x7A, 0x54, 0x36, 0x35, 0x79, 0x73, 0x43, 0x51, 0x62, 0x6C, 0x72, 0x47, 0x58, 0x6E, 0x52, 0x6C, 0x31, 0x31, 0x7A, 0x2B, 0x6F, 0x2B, + 0x49, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x45, 0x56, 0x20, 0x32, 0x30, 0x30, 0x39, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x51, 0x7A, 0x43, 0x43, 0x41, 0x79, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x44, 0x43, 0x59, 0x50, 0x30, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, + 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x46, 0x41, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, + 0x51, 0x4B, 0x0A, 0x44, 0x41, 0x78, 0x45, 0x4C, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x4B, 0x6A, 0x41, 0x6F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x49, 0x55, 0x51, 0x74, 0x56, + 0x46, 0x4A, 0x56, 0x55, 0x31, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x62, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x41, 0x7A, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x52, 0x56, 0x59, 0x67, 0x4D, 0x6A, 0x41, 0x77, 0x0A, + 0x4F, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x77, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x44, 0x55, 0x77, 0x4E, 0x44, 0x5A, 0x61, 0x46, 0x77, 0x30, 0x79, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x44, 0x55, 0x77, + 0x4E, 0x44, 0x5A, 0x61, 0x4D, 0x46, 0x41, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x44, 0x41, 0x78, + 0x45, 0x4C, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x4B, 0x6A, 0x41, 0x6F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x49, 0x55, 0x51, 0x74, 0x56, 0x46, 0x4A, 0x56, 0x55, 0x31, 0x51, + 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x62, 0x47, 0x46, 0x7A, 0x63, 0x79, 0x41, 0x7A, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x52, 0x56, 0x59, 0x67, 0x4D, 0x6A, 0x41, 0x77, 0x0A, 0x4F, 0x54, 0x43, 0x43, 0x41, 0x53, + 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x51, 0x6F, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4A, + 0x6E, 0x78, 0x68, 0x44, 0x52, 0x77, 0x75, 0x69, 0x2B, 0x33, 0x4D, 0x4B, 0x43, 0x4F, 0x76, 0x58, 0x77, 0x45, 0x7A, 0x37, 0x35, 0x69, 0x76, 0x4A, 0x6E, 0x39, 0x67, 0x70, 0x66, 0x53, 0x0A, 0x65, 0x67, 0x70, 0x6E, 0x6C, 0x6A, 0x67, 0x4A, 0x39, + 0x68, 0x42, 0x4F, 0x6C, 0x53, 0x4A, 0x7A, 0x6D, 0x59, 0x33, 0x61, 0x46, 0x53, 0x33, 0x6E, 0x42, 0x66, 0x77, 0x5A, 0x63, 0x79, 0x4B, 0x33, 0x6A, 0x70, 0x67, 0x41, 0x76, 0x44, 0x77, 0x39, 0x72, 0x4B, 0x46, 0x73, 0x2B, 0x39, 0x5A, 0x35, 0x4A, + 0x55, 0x75, 0x74, 0x38, 0x4D, 0x78, 0x6B, 0x32, 0x6F, 0x67, 0x2B, 0x4B, 0x62, 0x67, 0x50, 0x43, 0x64, 0x4D, 0x30, 0x33, 0x54, 0x50, 0x31, 0x59, 0x74, 0x48, 0x68, 0x0A, 0x7A, 0x52, 0x6E, 0x70, 0x37, 0x68, 0x68, 0x50, 0x54, 0x46, 0x69, 0x75, + 0x34, 0x68, 0x37, 0x57, 0x44, 0x46, 0x73, 0x56, 0x57, 0x74, 0x67, 0x36, 0x75, 0x4D, 0x51, 0x59, 0x5A, 0x42, 0x37, 0x6A, 0x4D, 0x37, 0x4B, 0x31, 0x69, 0x58, 0x64, 0x4F, 0x44, 0x4C, 0x2F, 0x5A, 0x6C, 0x47, 0x73, 0x54, 0x6C, 0x32, 0x38, 0x53, + 0x6F, 0x2F, 0x36, 0x5A, 0x71, 0x51, 0x54, 0x4D, 0x46, 0x65, 0x78, 0x67, 0x61, 0x44, 0x62, 0x74, 0x43, 0x48, 0x75, 0x33, 0x39, 0x62, 0x2B, 0x54, 0x0A, 0x37, 0x57, 0x59, 0x78, 0x67, 0x34, 0x7A, 0x47, 0x63, 0x54, 0x53, 0x48, 0x54, 0x68, 0x66, + 0x71, 0x72, 0x34, 0x75, 0x52, 0x6A, 0x52, 0x78, 0x57, 0x51, 0x61, 0x34, 0x69, 0x4E, 0x31, 0x34, 0x33, 0x38, 0x68, 0x33, 0x5A, 0x30, 0x53, 0x30, 0x4E, 0x4C, 0x32, 0x6C, 0x52, 0x70, 0x37, 0x35, 0x6D, 0x70, 0x6F, 0x6F, 0x36, 0x4B, 0x72, 0x33, + 0x48, 0x47, 0x72, 0x48, 0x68, 0x46, 0x50, 0x43, 0x2B, 0x4F, 0x68, 0x32, 0x35, 0x7A, 0x31, 0x75, 0x78, 0x61, 0x76, 0x36, 0x30, 0x0A, 0x73, 0x55, 0x59, 0x67, 0x6F, 0x76, 0x73, 0x65, 0x4F, 0x33, 0x44, 0x76, 0x6B, 0x35, 0x68, 0x39, 0x6A, 0x48, + 0x4F, 0x57, 0x38, 0x73, 0x58, 0x76, 0x68, 0x58, 0x43, 0x74, 0x4B, 0x53, 0x62, 0x38, 0x48, 0x67, 0x51, 0x2B, 0x48, 0x4B, 0x44, 0x59, 0x44, 0x38, 0x74, 0x53, 0x67, 0x32, 0x4A, 0x38, 0x37, 0x6F, 0x74, 0x54, 0x6C, 0x5A, 0x43, 0x70, 0x56, 0x36, + 0x4C, 0x71, 0x59, 0x51, 0x58, 0x59, 0x2B, 0x55, 0x33, 0x45, 0x4A, 0x2F, 0x70, 0x75, 0x72, 0x65, 0x33, 0x35, 0x0A, 0x31, 0x31, 0x48, 0x33, 0x61, 0x36, 0x55, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4F, 0x43, 0x41, 0x53, 0x51, 0x77, 0x67, + 0x67, 0x45, 0x67, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, + 0x4E, 0x4F, 0x55, 0x69, 0x6B, 0x78, 0x69, 0x45, 0x79, 0x6F, 0x5A, 0x4C, 0x73, 0x79, 0x76, 0x0A, 0x63, 0x6F, 0x70, 0x39, 0x4E, 0x74, 0x65, 0x61, 0x48, 0x4E, 0x78, 0x6E, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x43, 0x42, 0x33, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x66, 0x42, 0x49, 0x48, 0x56, 0x4D, 0x49, 0x48, 0x53, 0x4D, 0x49, 0x47, 0x48, 0x6F, 0x49, 0x47, 0x45, 0x6F, 0x49, 0x47, 0x42, + 0x68, 0x6E, 0x39, 0x73, 0x5A, 0x47, 0x46, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x0A, 0x5A, 0x47, 0x6C, 0x79, 0x5A, 0x57, 0x4E, 0x30, 0x62, 0x33, 0x4A, 0x35, 0x4C, 0x6D, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x62, 0x6D, 0x56, + 0x30, 0x4C, 0x30, 0x4E, 0x4F, 0x50, 0x55, 0x51, 0x74, 0x56, 0x46, 0x4A, 0x56, 0x55, 0x31, 0x51, 0x6C, 0x4D, 0x6A, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x4A, 0x54, 0x49, 0x77, 0x51, 0x32, 0x78, 0x68, 0x63, 0x33, 0x4D, 0x6C, 0x4D, 0x6A, 0x41, + 0x7A, 0x4A, 0x54, 0x49, 0x77, 0x51, 0x30, 0x45, 0x6C, 0x0A, 0x4D, 0x6A, 0x41, 0x79, 0x4A, 0x54, 0x49, 0x77, 0x52, 0x56, 0x59, 0x6C, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x44, 0x41, 0x35, 0x4C, 0x45, 0x38, 0x39, 0x52, 0x43, 0x31, 0x55, 0x63, 0x6E, + 0x56, 0x7A, 0x64, 0x43, 0x55, 0x79, 0x4D, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x73, 0x51, 0x7A, 0x31, 0x45, 0x52, 0x54, 0x39, 0x6A, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x5A, 0x58, 0x4A, 0x6C, 0x64, 0x6D, + 0x39, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x0A, 0x62, 0x32, 0x35, 0x73, 0x61, 0x58, 0x4E, 0x30, 0x4D, 0x45, 0x61, 0x67, 0x52, 0x4B, 0x42, 0x43, 0x68, 0x6B, 0x42, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4C, + 0x6D, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x62, 0x6D, 0x56, 0x30, 0x4C, 0x32, 0x4E, 0x79, 0x62, 0x43, 0x39, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x58, 0x33, 0x4A, 0x76, 0x62, 0x33, 0x52, 0x66, 0x59, + 0x32, 0x78, 0x68, 0x0A, 0x63, 0x33, 0x4E, 0x66, 0x4D, 0x31, 0x39, 0x6A, 0x59, 0x56, 0x38, 0x79, 0x58, 0x32, 0x56, 0x32, 0x58, 0x7A, 0x49, 0x77, 0x4D, 0x44, 0x6B, 0x75, 0x59, 0x33, 0x4A, 0x73, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, + 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x41, 0x30, 0x37, 0x58, 0x74, 0x61, 0x50, 0x4B, 0x53, 0x55, 0x69, 0x4F, 0x38, 0x61, 0x45, 0x58, 0x55, 0x48, 0x4C, 0x37, 0x50, 0x2B, + 0x0A, 0x50, 0x50, 0x6F, 0x65, 0x55, 0x53, 0x62, 0x72, 0x68, 0x2F, 0x59, 0x70, 0x33, 0x75, 0x44, 0x78, 0x31, 0x4D, 0x59, 0x6B, 0x43, 0x65, 0x6E, 0x42, 0x7A, 0x31, 0x55, 0x62, 0x74, 0x44, 0x44, 0x5A, 0x7A, 0x68, 0x72, 0x2B, 0x42, 0x6C, 0x47, + 0x6D, 0x46, 0x61, 0x51, 0x74, 0x37, 0x37, 0x4A, 0x4C, 0x76, 0x79, 0x41, 0x6F, 0x4A, 0x55, 0x6E, 0x52, 0x70, 0x6A, 0x5A, 0x33, 0x4E, 0x4F, 0x68, 0x6B, 0x33, 0x31, 0x4B, 0x78, 0x45, 0x63, 0x64, 0x7A, 0x65, 0x73, 0x30, 0x35, 0x0A, 0x6E, 0x73, + 0x4B, 0x74, 0x6A, 0x48, 0x45, 0x68, 0x38, 0x6C, 0x70, 0x72, 0x72, 0x39, 0x38, 0x38, 0x54, 0x6C, 0x57, 0x76, 0x73, 0x6F, 0x52, 0x6C, 0x46, 0x49, 0x6D, 0x35, 0x64, 0x38, 0x73, 0x71, 0x4D, 0x62, 0x37, 0x50, 0x6F, 0x32, 0x33, 0x50, 0x62, 0x30, + 0x69, 0x55, 0x4D, 0x6B, 0x5A, 0x76, 0x35, 0x33, 0x47, 0x4D, 0x6F, 0x4B, 0x61, 0x45, 0x47, 0x54, 0x63, 0x48, 0x38, 0x67, 0x4E, 0x46, 0x43, 0x53, 0x75, 0x47, 0x64, 0x58, 0x7A, 0x66, 0x58, 0x32, 0x6C, 0x58, 0x0A, 0x41, 0x4E, 0x74, 0x75, 0x32, + 0x4B, 0x5A, 0x79, 0x49, 0x6B, 0x74, 0x51, 0x31, 0x48, 0x57, 0x59, 0x56, 0x74, 0x2B, 0x33, 0x47, 0x50, 0x39, 0x44, 0x51, 0x31, 0x43, 0x75, 0x65, 0x6B, 0x52, 0x37, 0x38, 0x48, 0x6C, 0x52, 0x31, 0x30, 0x4D, 0x39, 0x70, 0x39, 0x4F, 0x42, 0x30, + 0x2F, 0x44, 0x4A, 0x54, 0x37, 0x6E, 0x61, 0x78, 0x70, 0x65, 0x47, 0x30, 0x49, 0x4C, 0x44, 0x35, 0x45, 0x4A, 0x74, 0x2F, 0x72, 0x44, 0x69, 0x5A, 0x45, 0x34, 0x4F, 0x4A, 0x75, 0x64, 0x41, 0x0A, 0x4E, 0x43, 0x61, 0x31, 0x43, 0x49, 0x6E, 0x58, + 0x43, 0x47, 0x4E, 0x6A, 0x4F, 0x43, 0x64, 0x31, 0x48, 0x6A, 0x50, 0x71, 0x62, 0x71, 0x6A, 0x64, 0x6E, 0x35, 0x6C, 0x50, 0x64, 0x45, 0x32, 0x42, 0x69, 0x59, 0x42, 0x4C, 0x33, 0x5A, 0x71, 0x58, 0x4B, 0x56, 0x77, 0x76, 0x76, 0x6F, 0x46, 0x42, + 0x75, 0x59, 0x7A, 0x2F, 0x36, 0x6E, 0x31, 0x67, 0x42, 0x70, 0x37, 0x4E, 0x31, 0x7A, 0x33, 0x54, 0x4C, 0x71, 0x4D, 0x56, 0x76, 0x4B, 0x6A, 0x6D, 0x4A, 0x75, 0x56, 0x76, 0x0A, 0x77, 0x39, 0x79, 0x34, 0x41, 0x79, 0x48, 0x71, 0x6E, 0x78, 0x62, + 0x78, 0x4C, 0x46, 0x53, 0x31, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x41, 0x20, 0x44, 0x69, 0x73, 0x69, + 0x67, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x61, 0x54, 0x43, 0x43, 0x41, 0x31, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x41, 0x4A, 0x4B, 0x34, 0x69, + 0x4E, 0x75, 0x77, 0x69, 0x73, 0x46, 0x6A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x46, 0x49, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x59, 0x54, 0x41, 0x6C, 0x4E, 0x4C, 0x4D, 0x52, 0x4D, 0x77, 0x0A, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x45, 0x77, 0x70, 0x43, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x58, 0x4E, 0x73, 0x59, 0x58, 0x5A, 0x68, 0x4D, 0x52, 0x4D, 0x77, + 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x70, 0x45, 0x61, 0x58, 0x4E, 0x70, 0x5A, 0x79, 0x42, 0x68, 0x4C, 0x6E, 0x4D, 0x75, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x44, + 0x51, 0x53, 0x42, 0x45, 0x61, 0x58, 0x4E, 0x70, 0x0A, 0x5A, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x46, 0x49, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x79, 0x4D, 0x44, 0x63, 0x78, 0x4F, 0x54, 0x41, 0x35, 0x4D, 0x54, 0x55, + 0x7A, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x79, 0x4D, 0x44, 0x63, 0x78, 0x4F, 0x54, 0x41, 0x35, 0x4D, 0x54, 0x55, 0x7A, 0x4D, 0x46, 0x6F, 0x77, 0x55, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, + 0x43, 0x55, 0x30, 0x73, 0x78, 0x0A, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x6B, 0x4A, 0x79, 0x59, 0x58, 0x52, 0x70, 0x63, 0x32, 0x78, 0x68, 0x64, 0x6D, 0x45, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x6B, 0x52, 0x70, 0x63, 0x32, 0x6C, 0x6E, 0x49, 0x47, 0x45, 0x75, 0x63, 0x79, 0x34, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x45, 0x4E, 0x42, 0x49, 0x45, + 0x52, 0x70, 0x0A, 0x63, 0x32, 0x6C, 0x6E, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x49, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, + 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x69, 0x6F, 0x38, 0x51, 0x41, 0x43, 0x64, 0x61, 0x46, 0x58, 0x53, 0x31, 0x74, 0x46, 0x50, 0x62, 0x43, 0x0A, + 0x77, 0x33, 0x4F, 0x65, 0x4E, 0x63, 0x4A, 0x78, 0x56, 0x58, 0x36, 0x42, 0x2B, 0x36, 0x74, 0x47, 0x55, 0x4F, 0x44, 0x42, 0x66, 0x45, 0x6C, 0x34, 0x35, 0x71, 0x74, 0x35, 0x57, 0x44, 0x7A, 0x61, 0x2F, 0x33, 0x77, 0x63, 0x6E, 0x39, 0x69, 0x58, + 0x41, 0x6E, 0x67, 0x2B, 0x61, 0x30, 0x45, 0x45, 0x36, 0x55, 0x47, 0x39, 0x76, 0x67, 0x4D, 0x73, 0x52, 0x66, 0x59, 0x76, 0x5A, 0x4E, 0x53, 0x72, 0x58, 0x61, 0x4E, 0x48, 0x50, 0x57, 0x53, 0x62, 0x36, 0x57, 0x69, 0x61, 0x0A, 0x78, 0x73, 0x77, + 0x62, 0x50, 0x37, 0x71, 0x2B, 0x73, 0x6F, 0x73, 0x30, 0x41, 0x69, 0x36, 0x59, 0x56, 0x52, 0x6E, 0x38, 0x6A, 0x47, 0x2B, 0x71, 0x58, 0x39, 0x70, 0x4D, 0x7A, 0x6B, 0x30, 0x44, 0x49, 0x61, 0x50, 0x59, 0x30, 0x6A, 0x53, 0x54, 0x56, 0x70, 0x62, + 0x4C, 0x54, 0x41, 0x77, 0x41, 0x46, 0x6A, 0x78, 0x66, 0x47, 0x73, 0x33, 0x49, 0x78, 0x32, 0x79, 0x6D, 0x72, 0x64, 0x4D, 0x78, 0x70, 0x37, 0x7A, 0x6F, 0x35, 0x65, 0x46, 0x6D, 0x31, 0x74, 0x4C, 0x37, 0x0A, 0x41, 0x37, 0x52, 0x42, 0x5A, 0x63, + 0x6B, 0x51, 0x72, 0x67, 0x34, 0x46, 0x59, 0x38, 0x61, 0x41, 0x61, 0x6D, 0x6B, 0x77, 0x2F, 0x64, 0x4C, 0x75, 0x6B, 0x4F, 0x38, 0x4E, 0x4A, 0x39, 0x2B, 0x66, 0x6C, 0x58, 0x50, 0x30, 0x34, 0x53, 0x58, 0x61, 0x62, 0x42, 0x62, 0x65, 0x51, 0x54, + 0x67, 0x30, 0x36, 0x6F, 0x76, 0x38, 0x30, 0x65, 0x67, 0x45, 0x46, 0x47, 0x45, 0x74, 0x51, 0x58, 0x36, 0x73, 0x78, 0x33, 0x64, 0x4F, 0x79, 0x31, 0x46, 0x55, 0x2B, 0x31, 0x36, 0x53, 0x0A, 0x47, 0x42, 0x73, 0x45, 0x57, 0x6D, 0x6A, 0x47, 0x79, + 0x63, 0x54, 0x36, 0x74, 0x78, 0x4F, 0x67, 0x6D, 0x4C, 0x63, 0x52, 0x4B, 0x37, 0x66, 0x57, 0x56, 0x38, 0x78, 0x38, 0x6E, 0x68, 0x66, 0x52, 0x79, 0x79, 0x58, 0x2B, 0x68, 0x6B, 0x34, 0x6B, 0x4C, 0x6C, 0x59, 0x4D, 0x65, 0x45, 0x32, 0x65, 0x41, + 0x52, 0x4B, 0x6D, 0x4B, 0x36, 0x63, 0x42, 0x5A, 0x57, 0x35, 0x38, 0x59, 0x68, 0x32, 0x45, 0x68, 0x4E, 0x2F, 0x71, 0x77, 0x47, 0x75, 0x31, 0x70, 0x53, 0x71, 0x56, 0x0A, 0x67, 0x38, 0x4E, 0x54, 0x45, 0x51, 0x78, 0x7A, 0x48, 0x51, 0x75, 0x79, + 0x52, 0x70, 0x44, 0x52, 0x51, 0x6A, 0x72, 0x4F, 0x51, 0x47, 0x36, 0x56, 0x72, 0x66, 0x2F, 0x47, 0x6C, 0x4B, 0x31, 0x75, 0x6C, 0x34, 0x53, 0x4F, 0x66, 0x57, 0x2B, 0x65, 0x69, 0x6F, 0x41, 0x4E, 0x53, 0x57, 0x31, 0x7A, 0x34, 0x6E, 0x75, 0x53, + 0x48, 0x73, 0x50, 0x7A, 0x77, 0x66, 0x50, 0x72, 0x4C, 0x67, 0x56, 0x76, 0x32, 0x52, 0x76, 0x50, 0x4E, 0x33, 0x59, 0x45, 0x79, 0x4C, 0x52, 0x61, 0x0A, 0x35, 0x42, 0x65, 0x6E, 0x79, 0x39, 0x31, 0x32, 0x48, 0x39, 0x41, 0x5A, 0x64, 0x75, 0x67, + 0x73, 0x42, 0x62, 0x50, 0x57, 0x6E, 0x44, 0x54, 0x59, 0x6C, 0x74, 0x78, 0x68, 0x68, 0x35, 0x45, 0x46, 0x35, 0x45, 0x51, 0x49, 0x4D, 0x38, 0x48, 0x61, 0x75, 0x51, 0x68, 0x6C, 0x31, 0x4B, 0x36, 0x79, 0x4E, 0x67, 0x33, 0x72, 0x75, 0x6A, 0x69, + 0x36, 0x44, 0x4F, 0x57, 0x62, 0x6E, 0x75, 0x75, 0x4E, 0x5A, 0x74, 0x32, 0x5A, 0x7A, 0x39, 0x61, 0x4A, 0x51, 0x66, 0x59, 0x45, 0x0A, 0x6B, 0x6F, 0x6F, 0x70, 0x4B, 0x57, 0x31, 0x72, 0x4F, 0x68, 0x7A, 0x6E, 0x64, 0x58, 0x30, 0x43, 0x63, 0x51, + 0x37, 0x7A, 0x77, 0x4F, 0x65, 0x39, 0x79, 0x78, 0x6E, 0x64, 0x6E, 0x57, 0x43, 0x79, 0x77, 0x6D, 0x5A, 0x67, 0x74, 0x72, 0x45, 0x45, 0x37, 0x73, 0x6E, 0x6D, 0x68, 0x72, 0x6D, 0x61, 0x5A, 0x6B, 0x43, 0x6F, 0x35, 0x78, 0x48, 0x74, 0x67, 0x55, + 0x55, 0x44, 0x69, 0x2F, 0x5A, 0x6E, 0x57, 0x65, 0x6A, 0x42, 0x42, 0x68, 0x47, 0x39, 0x33, 0x63, 0x2B, 0x41, 0x0A, 0x41, 0x6B, 0x39, 0x6C, 0x51, 0x48, 0x68, 0x63, 0x52, 0x31, 0x44, 0x49, 0x6D, 0x2B, 0x59, 0x66, 0x67, 0x58, 0x76, 0x6B, 0x52, + 0x4B, 0x68, 0x62, 0x68, 0x5A, 0x72, 0x69, 0x33, 0x6C, 0x72, 0x56, 0x78, 0x2F, 0x6B, 0x36, 0x52, 0x47, 0x5A, 0x4C, 0x35, 0x44, 0x4A, 0x55, 0x66, 0x4F, 0x52, 0x73, 0x6E, 0x4C, 0x4D, 0x4F, 0x50, 0x52, 0x65, 0x69, 0x73, 0x6A, 0x51, 0x53, 0x31, + 0x6E, 0x36, 0x79, 0x71, 0x45, 0x6D, 0x37, 0x30, 0x58, 0x6F, 0x6F, 0x51, 0x4C, 0x36, 0x69, 0x0A, 0x46, 0x68, 0x2F, 0x66, 0x35, 0x44, 0x63, 0x66, 0x45, 0x58, 0x50, 0x37, 0x6B, 0x41, 0x70, 0x6C, 0x51, 0x36, 0x49, 0x4E, 0x66, 0x50, 0x67, 0x47, + 0x41, 0x56, 0x55, 0x7A, 0x66, 0x62, 0x41, 0x4E, 0x75, 0x50, 0x54, 0x31, 0x72, 0x71, 0x56, 0x43, 0x56, 0x33, 0x77, 0x32, 0x45, 0x59, 0x78, 0x37, 0x58, 0x73, 0x51, 0x44, 0x6E, 0x59, 0x78, 0x35, 0x6E, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, + 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, + 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x74, 0x5A, 0x6E, 0x34, 0x72, 0x37, 0x43, 0x55, 0x39, 0x65, 0x4D, 0x67, 0x31, 0x67, 0x71, + 0x74, 0x7A, 0x6B, 0x35, 0x57, 0x70, 0x43, 0x35, 0x75, 0x0A, 0x51, 0x75, 0x30, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x43, + 0x59, 0x47, 0x58, 0x6E, 0x44, 0x6E, 0x5A, 0x54, 0x50, 0x49, 0x67, 0x6D, 0x37, 0x5A, 0x6E, 0x42, 0x63, 0x36, 0x47, 0x33, 0x70, 0x6D, 0x73, 0x67, 0x48, 0x32, 0x65, 0x44, 0x74, 0x70, 0x58, 0x69, 0x2F, 0x71, 0x2F, 0x30, 0x37, 0x35, 0x4B, 0x4D, + 0x4F, 0x59, 0x4B, 0x6D, 0x46, 0x4D, 0x0A, 0x74, 0x43, 0x51, 0x53, 0x69, 0x6E, 0x31, 0x74, 0x45, 0x52, 0x54, 0x33, 0x6E, 0x4C, 0x58, 0x4B, 0x35, 0x72, 0x79, 0x65, 0x4A, 0x34, 0x35, 0x4D, 0x47, 0x63, 0x69, 0x70, 0x76, 0x58, 0x72, 0x41, 0x31, + 0x7A, 0x59, 0x4F, 0x62, 0x59, 0x56, 0x79, 0x62, 0x71, 0x6A, 0x47, 0x6F, 0x6D, 0x33, 0x32, 0x2B, 0x6E, 0x4E, 0x6A, 0x66, 0x37, 0x78, 0x75, 0x65, 0x51, 0x67, 0x63, 0x6E, 0x59, 0x71, 0x66, 0x47, 0x6F, 0x70, 0x54, 0x70, 0x74, 0x69, 0x37, 0x32, + 0x54, 0x56, 0x56, 0x0A, 0x73, 0x52, 0x48, 0x46, 0x71, 0x51, 0x4F, 0x7A, 0x56, 0x6A, 0x75, 0x35, 0x68, 0x4A, 0x4D, 0x69, 0x58, 0x6E, 0x37, 0x42, 0x39, 0x68, 0x4A, 0x53, 0x69, 0x2B, 0x6F, 0x73, 0x5A, 0x37, 0x7A, 0x2B, 0x4E, 0x6B, 0x7A, 0x31, + 0x75, 0x4D, 0x2F, 0x52, 0x73, 0x30, 0x6D, 0x53, 0x4F, 0x39, 0x4D, 0x70, 0x44, 0x70, 0x6B, 0x62, 0x6C, 0x76, 0x64, 0x68, 0x75, 0x44, 0x76, 0x45, 0x4B, 0x37, 0x5A, 0x34, 0x62, 0x4C, 0x51, 0x6A, 0x62, 0x2F, 0x44, 0x39, 0x30, 0x37, 0x4A, 0x65, + 0x0A, 0x64, 0x52, 0x2B, 0x5A, 0x6C, 0x61, 0x69, 0x73, 0x39, 0x74, 0x72, 0x68, 0x78, 0x54, 0x46, 0x37, 0x2B, 0x39, 0x46, 0x47, 0x73, 0x39, 0x4B, 0x38, 0x5A, 0x37, 0x52, 0x69, 0x56, 0x4C, 0x6F, 0x4A, 0x39, 0x32, 0x4F, 0x77, 0x6B, 0x36, 0x4B, + 0x61, 0x2B, 0x65, 0x6C, 0x53, 0x4C, 0x6F, 0x74, 0x67, 0x45, 0x71, 0x76, 0x38, 0x39, 0x57, 0x42, 0x57, 0x37, 0x78, 0x42, 0x63, 0x69, 0x38, 0x51, 0x61, 0x51, 0x74, 0x79, 0x44, 0x57, 0x32, 0x51, 0x4F, 0x79, 0x37, 0x57, 0x38, 0x0A, 0x31, 0x6B, + 0x2F, 0x42, 0x66, 0x44, 0x78, 0x75, 0x6A, 0x52, 0x4E, 0x74, 0x2B, 0x33, 0x76, 0x72, 0x4D, 0x4E, 0x44, 0x63, 0x54, 0x61, 0x2F, 0x46, 0x31, 0x62, 0x61, 0x6C, 0x54, 0x46, 0x74, 0x78, 0x79, 0x65, 0x67, 0x78, 0x76, 0x75, 0x67, 0x34, 0x42, 0x6B, + 0x69, 0x68, 0x47, 0x75, 0x4C, 0x71, 0x30, 0x74, 0x34, 0x53, 0x4F, 0x56, 0x67, 0x61, 0x2F, 0x34, 0x41, 0x4F, 0x67, 0x6E, 0x58, 0x6D, 0x74, 0x38, 0x6B, 0x48, 0x62, 0x41, 0x37, 0x76, 0x2F, 0x7A, 0x6A, 0x78, 0x0A, 0x6D, 0x48, 0x48, 0x45, 0x74, + 0x33, 0x38, 0x4F, 0x46, 0x64, 0x41, 0x6C, 0x61, 0x62, 0x30, 0x69, 0x6E, 0x53, 0x76, 0x74, 0x42, 0x66, 0x5A, 0x47, 0x52, 0x36, 0x7A, 0x74, 0x77, 0x50, 0x44, 0x55, 0x4F, 0x2B, 0x4C, 0x73, 0x37, 0x70, 0x5A, 0x62, 0x6B, 0x42, 0x4E, 0x4F, 0x48, + 0x6C, 0x59, 0x36, 0x36, 0x37, 0x44, 0x76, 0x6C, 0x72, 0x75, 0x57, 0x49, 0x78, 0x47, 0x36, 0x38, 0x6B, 0x4F, 0x47, 0x64, 0x47, 0x53, 0x56, 0x79, 0x43, 0x68, 0x31, 0x33, 0x78, 0x30, 0x31, 0x0A, 0x75, 0x74, 0x49, 0x33, 0x67, 0x7A, 0x68, 0x54, + 0x4F, 0x44, 0x59, 0x37, 0x7A, 0x32, 0x7A, 0x70, 0x2B, 0x57, 0x73, 0x4F, 0x30, 0x50, 0x73, 0x45, 0x36, 0x45, 0x39, 0x33, 0x31, 0x32, 0x55, 0x42, 0x65, 0x49, 0x59, 0x4D, 0x65, 0x6A, 0x34, 0x68, 0x59, 0x76, 0x46, 0x2F, 0x59, 0x33, 0x45, 0x4D, + 0x79, 0x5A, 0x39, 0x45, 0x32, 0x36, 0x67, 0x6E, 0x6F, 0x6E, 0x57, 0x2B, 0x62, 0x6F, 0x45, 0x2B, 0x31, 0x38, 0x44, 0x72, 0x47, 0x35, 0x67, 0x50, 0x63, 0x46, 0x77, 0x30, 0x0A, 0x73, 0x6F, 0x72, 0x4D, 0x77, 0x49, 0x55, 0x59, 0x36, 0x32, 0x35, + 0x36, 0x73, 0x2F, 0x64, 0x61, 0x6F, 0x51, 0x65, 0x2F, 0x71, 0x55, 0x4B, 0x53, 0x38, 0x32, 0x41, 0x69, 0x6C, 0x2B, 0x51, 0x55, 0x6F, 0x51, 0x65, 0x62, 0x54, 0x6E, 0x62, 0x41, 0x6A, 0x6E, 0x33, 0x39, 0x70, 0x43, 0x58, 0x48, 0x52, 0x2B, 0x33, + 0x2F, 0x48, 0x33, 0x4F, 0x73, 0x7A, 0x4D, 0x4F, 0x6C, 0x36, 0x57, 0x38, 0x4B, 0x6A, 0x70, 0x74, 0x6C, 0x77, 0x6C, 0x43, 0x46, 0x74, 0x61, 0x4F, 0x67, 0x0A, 0x55, 0x78, 0x4C, 0x4D, 0x56, 0x59, 0x64, 0x68, 0x38, 0x34, 0x47, 0x75, 0x45, 0x45, + 0x5A, 0x68, 0x76, 0x55, 0x51, 0x68, 0x75, 0x4D, 0x49, 0x39, 0x64, 0x4D, 0x39, 0x2B, 0x4A, 0x44, 0x58, 0x36, 0x48, 0x41, 0x63, 0x4F, 0x6D, 0x7A, 0x30, 0x69, 0x79, 0x75, 0x38, 0x78, 0x4C, 0x34, 0x79, 0x73, 0x45, 0x72, 0x33, 0x76, 0x51, 0x43, + 0x6A, 0x38, 0x4B, 0x57, 0x65, 0x66, 0x73, 0x68, 0x4E, 0x50, 0x5A, 0x69, 0x54, 0x45, 0x55, 0x78, 0x6E, 0x70, 0x48, 0x69, 0x6B, 0x56, 0x0A, 0x37, 0x2B, 0x5A, 0x74, 0x73, 0x48, 0x38, 0x74, 0x5A, 0x2F, 0x33, 0x7A, 0x62, 0x42, 0x74, 0x31, 0x52, + 0x71, 0x50, 0x6C, 0x53, 0x68, 0x66, 0x70, 0x70, 0x4E, 0x63, 0x4C, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, + 0x43, 0x43, 0x56, 0x52, 0x41, 0x49, 0x5A, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x48, 0x30, 0x7A, 0x43, 0x43, 0x42, 0x62, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x58, 0x73, 0x4F, 0x33, 0x70, 0x6B, 0x4E, 0x2F, 0x70, 0x4F, 0x41, 0x77, 0x44, + 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x77, 0x51, 0x6A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x4A, 0x51, 0x55, 0x4E, 0x44, 0x56, + 0x6C, 0x4A, 0x42, 0x0A, 0x53, 0x56, 0x6F, 0x78, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x44, 0x41, 0x64, 0x51, 0x53, 0x30, 0x6C, 0x42, 0x51, 0x30, 0x4E, 0x57, 0x4D, 0x51, 0x30, 0x77, 0x43, 0x77, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x52, 0x42, 0x51, 0x30, 0x4E, 0x57, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x46, 0x55, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x54, 0x41, 0x31, + 0x0A, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x54, 0x4D, 0x33, 0x4D, 0x7A, 0x64, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x44, 0x45, 0x79, 0x4D, 0x7A, 0x45, 0x77, 0x4F, 0x54, 0x4D, 0x33, 0x4D, 0x7A, 0x64, 0x61, 0x4D, 0x45, 0x49, 0x78, 0x45, 0x6A, 0x41, + 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x43, 0x55, 0x46, 0x44, 0x51, 0x31, 0x5A, 0x53, 0x51, 0x55, 0x6C, 0x61, 0x4D, 0x54, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x48, 0x0A, 0x55, 0x45, + 0x74, 0x4A, 0x51, 0x55, 0x4E, 0x44, 0x56, 0x6A, 0x45, 0x4E, 0x4D, 0x41, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x45, 0x51, 0x55, 0x4E, 0x44, 0x56, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, + 0x4D, 0x43, 0x52, 0x56, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x0A, 0x44, 0x77, 0x41, 0x77, 0x67, + 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x62, 0x71, 0x61, 0x75, 0x2F, 0x59, 0x55, 0x71, 0x58, 0x72, 0x79, 0x2B, 0x58, 0x5A, 0x70, 0x70, 0x30, 0x58, 0x39, 0x44, 0x5A, 0x6C, 0x76, 0x33, 0x50, 0x34, 0x75, 0x52, 0x6D, 0x37, + 0x78, 0x38, 0x66, 0x52, 0x7A, 0x50, 0x43, 0x52, 0x4B, 0x50, 0x66, 0x6D, 0x74, 0x34, 0x66, 0x74, 0x56, 0x54, 0x64, 0x46, 0x58, 0x78, 0x70, 0x4E, 0x52, 0x46, 0x76, 0x75, 0x38, 0x67, 0x4D, 0x0A, 0x6A, 0x6D, 0x6F, 0x59, 0x48, 0x74, 0x69, 0x50, + 0x32, 0x52, 0x61, 0x38, 0x45, 0x45, 0x67, 0x32, 0x58, 0x50, 0x42, 0x6A, 0x73, 0x35, 0x42, 0x61, 0x58, 0x43, 0x51, 0x33, 0x31, 0x36, 0x50, 0x57, 0x79, 0x77, 0x6C, 0x78, 0x75, 0x66, 0x45, 0x42, 0x63, 0x6F, 0x53, 0x77, 0x66, 0x64, 0x74, 0x4E, + 0x67, 0x4D, 0x33, 0x38, 0x30, 0x32, 0x2F, 0x4A, 0x2B, 0x4E, 0x71, 0x32, 0x44, 0x6F, 0x4C, 0x53, 0x52, 0x59, 0x57, 0x6F, 0x47, 0x32, 0x69, 0x6F, 0x50, 0x65, 0x6A, 0x30, 0x0A, 0x52, 0x47, 0x79, 0x39, 0x6F, 0x63, 0x4C, 0x4C, 0x41, 0x37, 0x36, + 0x4D, 0x50, 0x68, 0x4D, 0x41, 0x68, 0x4E, 0x39, 0x4B, 0x53, 0x4D, 0x44, 0x6A, 0x49, 0x67, 0x72, 0x6F, 0x36, 0x54, 0x65, 0x6E, 0x47, 0x45, 0x79, 0x78, 0x43, 0x51, 0x30, 0x6A, 0x56, 0x6E, 0x38, 0x45, 0x54, 0x64, 0x6B, 0x58, 0x68, 0x42, 0x69, + 0x6C, 0x79, 0x4E, 0x70, 0x41, 0x6C, 0x48, 0x50, 0x72, 0x7A, 0x67, 0x35, 0x58, 0x50, 0x41, 0x4F, 0x42, 0x4F, 0x70, 0x30, 0x4B, 0x6F, 0x56, 0x64, 0x44, 0x0A, 0x61, 0x61, 0x78, 0x58, 0x62, 0x58, 0x6D, 0x51, 0x65, 0x4F, 0x57, 0x31, 0x74, 0x44, + 0x76, 0x59, 0x76, 0x45, 0x79, 0x4E, 0x4B, 0x4B, 0x47, 0x6E, 0x6F, 0x36, 0x65, 0x36, 0x41, 0x6B, 0x34, 0x6C, 0x30, 0x53, 0x71, 0x75, 0x37, 0x61, 0x34, 0x44, 0x49, 0x72, 0x68, 0x72, 0x49, 0x41, 0x38, 0x77, 0x4B, 0x46, 0x53, 0x56, 0x66, 0x2B, + 0x44, 0x75, 0x7A, 0x67, 0x70, 0x6D, 0x6E, 0x64, 0x46, 0x41, 0x4C, 0x57, 0x34, 0x69, 0x72, 0x35, 0x30, 0x61, 0x77, 0x51, 0x55, 0x5A, 0x0A, 0x30, 0x6D, 0x2F, 0x41, 0x38, 0x70, 0x2F, 0x34, 0x65, 0x37, 0x4D, 0x43, 0x51, 0x76, 0x74, 0x51, 0x71, + 0x52, 0x30, 0x74, 0x6B, 0x77, 0x38, 0x6A, 0x71, 0x38, 0x62, 0x42, 0x44, 0x35, 0x4C, 0x2F, 0x30, 0x4B, 0x49, 0x56, 0x39, 0x56, 0x4D, 0x4A, 0x63, 0x52, 0x7A, 0x2F, 0x52, 0x52, 0x4F, 0x45, 0x35, 0x69, 0x5A, 0x65, 0x2B, 0x4F, 0x43, 0x49, 0x48, + 0x41, 0x72, 0x38, 0x46, 0x72, 0x61, 0x6F, 0x63, 0x77, 0x61, 0x34, 0x38, 0x47, 0x4F, 0x45, 0x41, 0x71, 0x44, 0x47, 0x0A, 0x57, 0x75, 0x7A, 0x6E, 0x64, 0x4E, 0x39, 0x77, 0x72, 0x71, 0x4F, 0x44, 0x4A, 0x65, 0x72, 0x57, 0x78, 0x35, 0x65, 0x48, + 0x6B, 0x36, 0x66, 0x47, 0x69, 0x6F, 0x6F, 0x7A, 0x6C, 0x32, 0x41, 0x33, 0x45, 0x44, 0x36, 0x58, 0x50, 0x6D, 0x34, 0x70, 0x46, 0x64, 0x61, 0x68, 0x44, 0x39, 0x47, 0x49, 0x4C, 0x42, 0x4B, 0x66, 0x62, 0x36, 0x71, 0x6B, 0x78, 0x6B, 0x4C, 0x72, + 0x51, 0x61, 0x4C, 0x6A, 0x6C, 0x55, 0x50, 0x54, 0x41, 0x59, 0x56, 0x74, 0x6A, 0x72, 0x73, 0x37, 0x0A, 0x38, 0x79, 0x4D, 0x32, 0x78, 0x2F, 0x34, 0x37, 0x34, 0x4B, 0x45, 0x6C, 0x42, 0x30, 0x69, 0x72, 0x79, 0x59, 0x6C, 0x30, 0x2F, 0x77, 0x69, + 0x50, 0x67, 0x4C, 0x2F, 0x41, 0x6C, 0x6D, 0x58, 0x7A, 0x37, 0x75, 0x78, 0x4C, 0x61, 0x4C, 0x32, 0x64, 0x69, 0x4D, 0x4D, 0x78, 0x73, 0x30, 0x44, 0x78, 0x36, 0x4D, 0x2F, 0x32, 0x4F, 0x4C, 0x75, 0x63, 0x35, 0x4E, 0x46, 0x2F, 0x31, 0x4F, 0x56, + 0x59, 0x6D, 0x33, 0x7A, 0x36, 0x31, 0x50, 0x4D, 0x4F, 0x6D, 0x33, 0x57, 0x52, 0x0A, 0x35, 0x4C, 0x70, 0x53, 0x4C, 0x68, 0x6C, 0x2B, 0x30, 0x66, 0x58, 0x4E, 0x57, 0x68, 0x6E, 0x38, 0x75, 0x67, 0x62, 0x32, 0x2B, 0x31, 0x4B, 0x6F, 0x53, 0x35, + 0x6B, 0x45, 0x33, 0x66, 0x6A, 0x35, 0x74, 0x49, 0x74, 0x51, 0x6F, 0x30, 0x35, 0x69, 0x69, 0x66, 0x43, 0x48, 0x4A, 0x50, 0x71, 0x44, 0x51, 0x73, 0x47, 0x48, 0x2B, 0x74, 0x55, 0x74, 0x4B, 0x53, 0x70, 0x61, 0x63, 0x58, 0x70, 0x6B, 0x61, 0x74, + 0x63, 0x6E, 0x59, 0x47, 0x4D, 0x4E, 0x32, 0x38, 0x35, 0x4A, 0x0A, 0x39, 0x59, 0x30, 0x66, 0x6B, 0x49, 0x6B, 0x79, 0x46, 0x2F, 0x68, 0x7A, 0x51, 0x37, 0x6A, 0x53, 0x57, 0x70, 0x4F, 0x47, 0x59, 0x64, 0x62, 0x68, 0x64, 0x51, 0x72, 0x71, 0x65, + 0x57, 0x5A, 0x32, 0x69, 0x45, 0x39, 0x78, 0x36, 0x77, 0x51, 0x6C, 0x31, 0x67, 0x70, 0x61, 0x65, 0x70, 0x50, 0x6C, 0x75, 0x55, 0x73, 0x58, 0x51, 0x41, 0x2B, 0x78, 0x74, 0x72, 0x6E, 0x31, 0x33, 0x6B, 0x2F, 0x63, 0x34, 0x4C, 0x4F, 0x73, 0x4F, + 0x78, 0x46, 0x77, 0x59, 0x49, 0x52, 0x4B, 0x0A, 0x51, 0x32, 0x36, 0x5A, 0x49, 0x4D, 0x41, 0x70, 0x63, 0x51, 0x72, 0x41, 0x5A, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x49, 0x43, 0x79, 0x7A, 0x43, 0x43, 0x41, 0x73, 0x63, 0x77, + 0x66, 0x51, 0x59, 0x49, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x51, 0x45, 0x45, 0x63, 0x54, 0x42, 0x76, 0x4D, 0x45, 0x77, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x7A, 0x41, 0x43, 0x68, 0x6B, 0x42, 0x6F, + 0x64, 0x48, 0x52, 0x77, 0x0A, 0x4F, 0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4C, 0x6D, 0x46, 0x6A, 0x59, 0x33, 0x59, 0x75, 0x5A, 0x58, 0x4D, 0x76, 0x5A, 0x6D, 0x6C, 0x73, 0x5A, 0x57, 0x46, 0x6B, 0x62, 0x57, 0x6C, 0x75, 0x4C, 0x30, 0x46, + 0x79, 0x59, 0x32, 0x68, 0x70, 0x64, 0x6D, 0x39, 0x7A, 0x4C, 0x32, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x57, 0x52, 0x76, 0x63, 0x79, 0x39, 0x79, 0x59, 0x57, 0x6C, 0x36, 0x59, 0x57, 0x4E, 0x6A, 0x64, 0x6A, 0x45, + 0x75, 0x0A, 0x59, 0x33, 0x4A, 0x30, 0x4D, 0x42, 0x38, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x7A, 0x41, 0x42, 0x68, 0x68, 0x4E, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x62, 0x32, 0x4E, 0x7A, 0x63, 0x43, + 0x35, 0x68, 0x59, 0x32, 0x4E, 0x32, 0x4C, 0x6D, 0x56, 0x7A, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x53, 0x68, 0x37, 0x54, 0x6A, 0x33, 0x7A, 0x63, 0x6E, 0x6B, 0x31, 0x58, 0x32, 0x0A, 0x56, + 0x75, 0x71, 0x42, 0x35, 0x54, 0x62, 0x4D, 0x6A, 0x42, 0x34, 0x2F, 0x76, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x38, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4E, 0x4B, 0x48, 0x74, 0x4F, 0x50, 0x66, 0x4E, 0x79, 0x65, 0x54, 0x56, 0x66, 0x5A, 0x57, 0x36, 0x6F, 0x48, 0x6C, 0x4E, 0x73, 0x79, 0x4D, 0x0A, 0x48, 0x6A, 0x2B, 0x39, + 0x4D, 0x49, 0x49, 0x42, 0x63, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x67, 0x42, 0x49, 0x49, 0x42, 0x61, 0x6A, 0x43, 0x43, 0x41, 0x57, 0x59, 0x77, 0x67, 0x67, 0x46, 0x69, 0x42, 0x67, 0x52, 0x56, 0x48, 0x53, 0x41, 0x41, 0x4D, 0x49, 0x49, 0x42, + 0x57, 0x44, 0x43, 0x43, 0x41, 0x53, 0x49, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x49, 0x43, 0x4D, 0x49, 0x49, 0x42, 0x46, 0x42, 0x36, 0x43, 0x41, 0x52, 0x41, 0x41, 0x0A, 0x51, 0x51, 0x42, 0x31, 0x41, 0x48, 0x51, + 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x47, 0x6B, 0x41, 0x5A, 0x41, 0x42, 0x68, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x6B, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x44, 0x41, 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x30, 0x41, 0x47, 0x6B, + 0x41, 0x5A, 0x67, 0x42, 0x70, 0x41, 0x47, 0x4D, 0x41, 0x59, 0x51, 0x42, 0x6A, 0x41, 0x47, 0x6B, 0x41, 0x38, 0x77, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x55, 0x67, 0x42, 0x68, 0x0A, 0x41, 0x4F, 0x30, 0x41, 0x65, 0x67, 0x41, 0x67, 0x41, 0x47, + 0x51, 0x41, 0x5A, 0x51, 0x41, 0x67, 0x41, 0x47, 0x77, 0x41, 0x59, 0x51, 0x41, 0x67, 0x41, 0x45, 0x45, 0x41, 0x51, 0x77, 0x42, 0x44, 0x41, 0x46, 0x59, 0x41, 0x49, 0x41, 0x41, 0x6F, 0x41, 0x45, 0x45, 0x41, 0x5A, 0x77, 0x42, 0x6C, 0x41, 0x47, + 0x34, 0x41, 0x59, 0x77, 0x42, 0x70, 0x41, 0x47, 0x45, 0x41, 0x49, 0x41, 0x42, 0x6B, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, 0x47, 0x55, 0x41, 0x0A, 0x59, 0x77, 0x42, 0x75, 0x41, 0x47, 0x38, 0x41, 0x62, 0x41, 0x42, 0x76, 0x41, + 0x47, 0x63, 0x41, 0x37, 0x51, 0x42, 0x68, 0x41, 0x43, 0x41, 0x41, 0x65, 0x51, 0x41, 0x67, 0x41, 0x45, 0x4D, 0x41, 0x5A, 0x51, 0x42, 0x79, 0x41, 0x48, 0x51, 0x41, 0x61, 0x51, 0x42, 0x6D, 0x41, 0x47, 0x6B, 0x41, 0x59, 0x77, 0x42, 0x68, 0x41, + 0x47, 0x4D, 0x41, 0x61, 0x51, 0x44, 0x7A, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, 0x46, 0x41, 0x47, 0x77, 0x41, 0x5A, 0x51, 0x42, 0x6A, 0x0A, 0x41, 0x48, 0x51, 0x41, 0x63, 0x67, 0x44, 0x7A, 0x41, 0x47, 0x34, 0x41, 0x61, 0x51, 0x42, 0x6A, + 0x41, 0x47, 0x45, 0x41, 0x4C, 0x41, 0x41, 0x67, 0x41, 0x45, 0x4D, 0x41, 0x53, 0x51, 0x42, 0x47, 0x41, 0x43, 0x41, 0x41, 0x55, 0x51, 0x41, 0x30, 0x41, 0x44, 0x59, 0x41, 0x4D, 0x41, 0x41, 0x78, 0x41, 0x44, 0x45, 0x41, 0x4E, 0x51, 0x41, 0x32, + 0x41, 0x45, 0x55, 0x41, 0x4B, 0x51, 0x41, 0x75, 0x41, 0x43, 0x41, 0x41, 0x51, 0x77, 0x42, 0x51, 0x41, 0x46, 0x4D, 0x41, 0x0A, 0x49, 0x41, 0x42, 0x6C, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, 0x6F, 0x41, 0x48, 0x51, 0x41, 0x64, 0x41, 0x42, + 0x77, 0x41, 0x44, 0x6F, 0x41, 0x4C, 0x77, 0x41, 0x76, 0x41, 0x48, 0x63, 0x41, 0x64, 0x77, 0x42, 0x33, 0x41, 0x43, 0x34, 0x41, 0x59, 0x51, 0x42, 0x6A, 0x41, 0x47, 0x4D, 0x41, 0x64, 0x67, 0x41, 0x75, 0x41, 0x47, 0x55, 0x41, 0x63, 0x7A, 0x41, + 0x77, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x43, 0x41, 0x52, 0x59, 0x6B, 0x0A, 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x33, 0x64, 0x33, 0x64, 0x79, 0x35, 0x68, 0x59, 0x32, 0x4E, 0x32, 0x4C, 0x6D, + 0x56, 0x7A, 0x4C, 0x32, 0x78, 0x6C, 0x5A, 0x32, 0x6C, 0x7A, 0x62, 0x47, 0x46, 0x6A, 0x61, 0x57, 0x39, 0x75, 0x58, 0x32, 0x4D, 0x75, 0x61, 0x48, 0x52, 0x74, 0x4D, 0x46, 0x55, 0x47, 0x41, 0x31, 0x55, 0x64, 0x48, 0x77, 0x52, 0x4F, 0x4D, 0x45, + 0x77, 0x77, 0x53, 0x71, 0x42, 0x49, 0x6F, 0x45, 0x61, 0x47, 0x52, 0x47, 0x68, 0x30, 0x0A, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x33, 0x64, 0x33, 0x63, 0x75, 0x59, 0x57, 0x4E, 0x6A, 0x64, 0x69, 0x35, 0x6C, 0x63, 0x79, 0x39, 0x6D, 0x61, + 0x57, 0x78, 0x6C, 0x59, 0x57, 0x52, 0x74, 0x61, 0x57, 0x34, 0x76, 0x51, 0x58, 0x4A, 0x6A, 0x61, 0x47, 0x6C, 0x32, 0x62, 0x33, 0x4D, 0x76, 0x59, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x47, 0x39, 0x7A, 0x4C, + 0x33, 0x4A, 0x68, 0x61, 0x58, 0x70, 0x68, 0x59, 0x32, 0x4E, 0x32, 0x0A, 0x4D, 0x56, 0x39, 0x6B, 0x5A, 0x58, 0x49, 0x75, 0x59, 0x33, 0x4A, 0x73, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, + 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x45, 0x45, 0x45, 0x44, 0x41, 0x4F, 0x67, 0x51, 0x78, 0x68, 0x59, 0x32, 0x4E, 0x32, 0x51, 0x47, 0x46, 0x6A, 0x59, 0x33, 0x59, 0x75, 0x5A, 0x58, 0x4D, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4A, 0x63, 0x78, 0x41, 0x70, 0x2F, 0x6E, 0x2F, 0x55, 0x4E, 0x6E, 0x53, 0x45, 0x51, + 0x55, 0x35, 0x43, 0x6D, 0x48, 0x37, 0x55, 0x77, 0x6F, 0x5A, 0x74, 0x43, 0x50, 0x4E, 0x64, 0x70, 0x4E, 0x59, 0x62, 0x64, 0x4B, 0x6C, 0x30, 0x32, 0x31, 0x32, 0x35, 0x44, 0x67, 0x42, 0x53, 0x34, 0x4F, 0x78, 0x6E, 0x6E, 0x51, 0x38, 0x70, 0x64, + 0x70, 0x44, 0x37, 0x30, 0x45, 0x0A, 0x52, 0x39, 0x6D, 0x2B, 0x32, 0x37, 0x55, 0x70, 0x32, 0x70, 0x76, 0x5A, 0x72, 0x71, 0x6D, 0x5A, 0x31, 0x64, 0x4D, 0x38, 0x4D, 0x4A, 0x50, 0x31, 0x6A, 0x61, 0x47, 0x6F, 0x2F, 0x41, 0x61, 0x4E, 0x52, 0x50, + 0x54, 0x4B, 0x46, 0x70, 0x56, 0x38, 0x4D, 0x39, 0x78, 0x69, 0x69, 0x36, 0x67, 0x33, 0x2B, 0x43, 0x66, 0x59, 0x43, 0x53, 0x30, 0x62, 0x37, 0x38, 0x67, 0x55, 0x4A, 0x79, 0x43, 0x70, 0x5A, 0x45, 0x54, 0x2F, 0x4C, 0x74, 0x5A, 0x31, 0x71, 0x6D, + 0x78, 0x4E, 0x0A, 0x59, 0x45, 0x41, 0x5A, 0x53, 0x55, 0x4E, 0x55, 0x59, 0x39, 0x72, 0x69, 0x7A, 0x4C, 0x70, 0x6D, 0x35, 0x55, 0x39, 0x45, 0x65, 0x6C, 0x76, 0x5A, 0x61, 0x6F, 0x45, 0x72, 0x51, 0x4E, 0x56, 0x2F, 0x2B, 0x51, 0x45, 0x6E, 0x57, + 0x43, 0x7A, 0x49, 0x37, 0x55, 0x69, 0x52, 0x66, 0x44, 0x2B, 0x6D, 0x41, 0x4D, 0x2F, 0x45, 0x4B, 0x58, 0x4D, 0x52, 0x4E, 0x74, 0x36, 0x47, 0x47, 0x54, 0x36, 0x64, 0x37, 0x68, 0x6D, 0x4B, 0x47, 0x39, 0x57, 0x77, 0x37, 0x59, 0x34, 0x39, 0x0A, + 0x6E, 0x43, 0x72, 0x41, 0x44, 0x64, 0x67, 0x39, 0x5A, 0x75, 0x4D, 0x38, 0x44, 0x62, 0x33, 0x56, 0x6C, 0x46, 0x7A, 0x69, 0x34, 0x71, 0x63, 0x31, 0x47, 0x77, 0x51, 0x41, 0x39, 0x6A, 0x39, 0x61, 0x6A, 0x65, 0x70, 0x44, 0x76, 0x56, 0x2B, 0x4A, + 0x48, 0x61, 0x6E, 0x42, 0x73, 0x4D, 0x79, 0x5A, 0x34, 0x6B, 0x30, 0x41, 0x43, 0x74, 0x72, 0x4A, 0x4A, 0x31, 0x76, 0x6E, 0x45, 0x35, 0x42, 0x63, 0x35, 0x50, 0x55, 0x7A, 0x6F, 0x6C, 0x56, 0x74, 0x33, 0x4F, 0x41, 0x4A, 0x0A, 0x54, 0x53, 0x2B, + 0x78, 0x4A, 0x6C, 0x73, 0x6E, 0x64, 0x51, 0x41, 0x4A, 0x78, 0x47, 0x4A, 0x33, 0x4B, 0x51, 0x68, 0x66, 0x6E, 0x6C, 0x6D, 0x73, 0x74, 0x6E, 0x36, 0x74, 0x6E, 0x31, 0x51, 0x77, 0x49, 0x67, 0x50, 0x42, 0x48, 0x6E, 0x46, 0x6B, 0x2F, 0x76, 0x6B, + 0x34, 0x43, 0x70, 0x59, 0x59, 0x33, 0x51, 0x49, 0x55, 0x72, 0x43, 0x50, 0x4C, 0x42, 0x68, 0x77, 0x65, 0x70, 0x48, 0x32, 0x4E, 0x44, 0x64, 0x34, 0x6E, 0x51, 0x65, 0x69, 0x74, 0x32, 0x68, 0x57, 0x33, 0x0A, 0x73, 0x43, 0x50, 0x64, 0x4B, 0x36, + 0x6A, 0x54, 0x32, 0x69, 0x57, 0x48, 0x37, 0x65, 0x68, 0x56, 0x52, 0x45, 0x32, 0x49, 0x39, 0x44, 0x5A, 0x2B, 0x68, 0x4A, 0x70, 0x34, 0x72, 0x50, 0x63, 0x4F, 0x56, 0x6B, 0x6B, 0x4F, 0x31, 0x6A, 0x4D, 0x6C, 0x31, 0x6F, 0x52, 0x51, 0x51, 0x6D, + 0x77, 0x67, 0x45, 0x68, 0x30, 0x71, 0x31, 0x62, 0x36, 0x38, 0x38, 0x6E, 0x43, 0x42, 0x70, 0x48, 0x42, 0x67, 0x76, 0x67, 0x57, 0x31, 0x6D, 0x35, 0x34, 0x45, 0x52, 0x4C, 0x35, 0x68, 0x0A, 0x49, 0x36, 0x7A, 0x70, 0x70, 0x53, 0x53, 0x4D, 0x45, + 0x59, 0x43, 0x55, 0x57, 0x71, 0x4B, 0x69, 0x75, 0x55, 0x6E, 0x53, 0x77, 0x64, 0x7A, 0x52, 0x70, 0x2B, 0x30, 0x78, 0x45, 0x53, 0x79, 0x65, 0x47, 0x61, 0x62, 0x75, 0x34, 0x56, 0x58, 0x68, 0x77, 0x4F, 0x72, 0x50, 0x44, 0x59, 0x54, 0x6B, 0x46, + 0x37, 0x65, 0x69, 0x66, 0x4B, 0x58, 0x65, 0x56, 0x53, 0x55, 0x47, 0x37, 0x73, 0x7A, 0x41, 0x68, 0x31, 0x78, 0x41, 0x32, 0x73, 0x79, 0x56, 0x50, 0x31, 0x58, 0x67, 0x0A, 0x4E, 0x63, 0x65, 0x34, 0x68, 0x4C, 0x36, 0x30, 0x58, 0x63, 0x31, 0x36, + 0x67, 0x77, 0x46, 0x79, 0x37, 0x6F, 0x66, 0x6D, 0x58, 0x78, 0x32, 0x75, 0x74, 0x59, 0x58, 0x47, 0x4A, 0x74, 0x2F, 0x6D, 0x77, 0x5A, 0x72, 0x70, 0x48, 0x67, 0x4A, 0x48, 0x6E, 0x79, 0x71, 0x6F, 0x62, 0x61, 0x6C, 0x62, 0x7A, 0x2B, 0x78, 0x46, + 0x64, 0x33, 0x2B, 0x59, 0x4A, 0x35, 0x6F, 0x79, 0x58, 0x53, 0x72, 0x6A, 0x68, 0x4F, 0x37, 0x46, 0x6D, 0x47, 0x59, 0x76, 0x6C, 0x69, 0x41, 0x64, 0x0A, 0x33, 0x64, 0x6A, 0x44, 0x4A, 0x39, 0x65, 0x77, 0x2B, 0x66, 0x37, 0x5A, 0x66, 0x63, 0x33, + 0x51, 0x6E, 0x34, 0x38, 0x4C, 0x46, 0x46, 0x68, 0x52, 0x6E, 0x79, 0x2B, 0x4C, 0x77, 0x7A, 0x67, 0x74, 0x33, 0x75, 0x69, 0x50, 0x31, 0x6F, 0x32, 0x48, 0x70, 0x50, 0x56, 0x57, 0x51, 0x78, 0x61, 0x5A, 0x4C, 0x50, 0x53, 0x6B, 0x56, 0x72, 0x51, + 0x30, 0x75, 0x47, 0x45, 0x33, 0x79, 0x63, 0x4A, 0x59, 0x67, 0x42, 0x75, 0x67, 0x6C, 0x36, 0x48, 0x38, 0x57, 0x59, 0x33, 0x70, 0x0A, 0x45, 0x66, 0x62, 0x52, 0x44, 0x30, 0x74, 0x56, 0x4E, 0x45, 0x59, 0x71, 0x69, 0x34, 0x59, 0x37, 0x0A, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x57, 0x43, 0x41, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x51, 0x54, 0x43, 0x43, 0x41, 0x79, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x43, 0x44, 0x4C, 0x34, 0x77, 0x44, 0x51, + 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x46, 0x63, 0x78, 0x45, 0x6A, + 0x41, 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x0A, 0x43, 0x56, 0x52, 0x42, 0x53, 0x56, 0x64, 0x42, 0x54, 0x69, 0x31, 0x44, 0x51, 0x54, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x48, 0x55, + 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x54, 0x56, 0x46, 0x64, 0x44, 0x51, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, + 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x0A, 0x51, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x6A, 0x41, 0x32, 0x4D, 0x6A, 0x63, 0x77, 0x4E, 0x6A, 0x49, 0x34, 0x4D, 0x7A, 0x4E, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x44, 0x45, 0x79, + 0x4D, 0x7A, 0x45, 0x78, 0x4E, 0x54, 0x55, 0x35, 0x4E, 0x54, 0x6C, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x52, 0x58, 0x4D, 0x52, 0x49, 0x77, 0x45, 0x41, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x45, 0x77, 0x6C, 0x55, 0x51, 0x55, 0x6C, 0x58, 0x51, 0x55, 0x34, 0x74, 0x51, 0x30, 0x45, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x42, 0x31, 0x4A, 0x76, 0x62, 0x33, 0x51, + 0x67, 0x51, 0x30, 0x45, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x31, 0x52, 0x58, 0x51, 0x30, 0x45, 0x67, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, + 0x67, 0x0A, 0x51, 0x30, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, + 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x77, 0x42, 0x64, 0x76, 0x49, 0x36, 0x34, 0x7A, 0x45, 0x62, 0x6F, 0x6F, 0x68, 0x37, 0x34, 0x35, 0x4E, 0x6E, 0x48, 0x45, 0x4B, 0x48, 0x31, 0x4A, 0x77, 0x37, 0x57, 0x32, 0x43, 0x0A, 0x6E, + 0x4A, 0x66, 0x46, 0x31, 0x30, 0x78, 0x4F, 0x52, 0x55, 0x6E, 0x4C, 0x51, 0x45, 0x4B, 0x31, 0x45, 0x6A, 0x52, 0x73, 0x47, 0x63, 0x4A, 0x30, 0x70, 0x44, 0x46, 0x66, 0x68, 0x51, 0x4B, 0x58, 0x37, 0x45, 0x4D, 0x7A, 0x43, 0x6C, 0x50, 0x53, 0x6E, + 0x49, 0x79, 0x4F, 0x74, 0x37, 0x68, 0x35, 0x32, 0x79, 0x76, 0x56, 0x61, 0x76, 0x4B, 0x4F, 0x5A, 0x73, 0x54, 0x75, 0x4B, 0x77, 0x45, 0x48, 0x6B, 0x74, 0x53, 0x7A, 0x30, 0x41, 0x4C, 0x66, 0x55, 0x50, 0x5A, 0x56, 0x0A, 0x72, 0x32, 0x59, 0x4F, + 0x79, 0x2B, 0x42, 0x48, 0x59, 0x43, 0x38, 0x72, 0x4D, 0x6A, 0x6B, 0x31, 0x55, 0x6A, 0x6F, 0x6F, 0x67, 0x2F, 0x68, 0x37, 0x46, 0x73, 0x59, 0x59, 0x75, 0x47, 0x4C, 0x57, 0x52, 0x79, 0x57, 0x52, 0x7A, 0x76, 0x41, 0x5A, 0x45, 0x6B, 0x32, 0x74, + 0x59, 0x2F, 0x58, 0x54, 0x50, 0x33, 0x56, 0x66, 0x4B, 0x66, 0x43, 0x68, 0x4D, 0x42, 0x77, 0x71, 0x6F, 0x4A, 0x69, 0x6D, 0x46, 0x62, 0x33, 0x75, 0x2F, 0x52, 0x6B, 0x32, 0x38, 0x4F, 0x4B, 0x52, 0x0A, 0x51, 0x34, 0x2F, 0x36, 0x79, 0x74, 0x59, + 0x51, 0x4A, 0x30, 0x6C, 0x4D, 0x37, 0x39, 0x33, 0x42, 0x38, 0x59, 0x56, 0x77, 0x6D, 0x38, 0x72, 0x71, 0x71, 0x46, 0x70, 0x44, 0x2F, 0x47, 0x32, 0x47, 0x62, 0x33, 0x50, 0x70, 0x4E, 0x30, 0x57, 0x70, 0x38, 0x44, 0x62, 0x48, 0x7A, 0x49, 0x68, + 0x31, 0x48, 0x72, 0x74, 0x73, 0x42, 0x76, 0x2B, 0x62, 0x61, 0x7A, 0x34, 0x58, 0x37, 0x47, 0x47, 0x71, 0x63, 0x58, 0x7A, 0x47, 0x48, 0x61, 0x4C, 0x33, 0x53, 0x65, 0x6B, 0x56, 0x0A, 0x74, 0x54, 0x7A, 0x57, 0x6F, 0x57, 0x48, 0x31, 0x45, 0x66, + 0x63, 0x46, 0x62, 0x78, 0x33, 0x39, 0x45, 0x62, 0x37, 0x51, 0x4D, 0x41, 0x66, 0x43, 0x4B, 0x62, 0x41, 0x4A, 0x54, 0x69, 0x62, 0x63, 0x34, 0x36, 0x4B, 0x6F, 0x6B, 0x57, 0x6F, 0x66, 0x77, 0x70, 0x46, 0x46, 0x69, 0x46, 0x7A, 0x6C, 0x6D, 0x4C, + 0x68, 0x78, 0x70, 0x52, 0x55, 0x5A, 0x79, 0x58, 0x78, 0x31, 0x45, 0x63, 0x78, 0x77, 0x64, 0x45, 0x38, 0x74, 0x6D, 0x78, 0x32, 0x52, 0x52, 0x50, 0x31, 0x57, 0x0A, 0x4B, 0x4B, 0x44, 0x2B, 0x75, 0x34, 0x5A, 0x71, 0x79, 0x50, 0x70, 0x63, 0x43, + 0x31, 0x6A, 0x63, 0x78, 0x6B, 0x74, 0x32, 0x79, 0x4B, 0x73, 0x69, 0x32, 0x58, 0x4D, 0x50, 0x70, 0x66, 0x52, 0x61, 0x41, 0x6F, 0x6B, 0x2F, 0x54, 0x35, 0x34, 0x69, 0x67, 0x75, 0x36, 0x69, 0x64, 0x46, 0x4D, 0x71, 0x50, 0x56, 0x4D, 0x6E, 0x61, + 0x52, 0x31, 0x73, 0x6A, 0x6A, 0x49, 0x73, 0x5A, 0x41, 0x41, 0x6D, 0x59, 0x32, 0x45, 0x32, 0x54, 0x71, 0x4E, 0x47, 0x74, 0x7A, 0x39, 0x39, 0x0A, 0x73, 0x79, 0x32, 0x73, 0x62, 0x5A, 0x43, 0x69, 0x6C, 0x61, 0x4C, 0x4F, 0x7A, 0x39, 0x71, 0x43, + 0x35, 0x77, 0x63, 0x30, 0x47, 0x5A, 0x62, 0x70, 0x75, 0x43, 0x47, 0x71, 0x4B, 0x58, 0x36, 0x6D, 0x4F, 0x4C, 0x36, 0x4F, 0x4B, 0x55, 0x6F, 0x68, 0x5A, 0x6E, 0x6B, 0x66, 0x73, 0x38, 0x4F, 0x31, 0x43, 0x57, 0x66, 0x65, 0x31, 0x74, 0x51, 0x48, + 0x52, 0x76, 0x4D, 0x71, 0x32, 0x75, 0x59, 0x69, 0x4E, 0x32, 0x44, 0x4C, 0x67, 0x62, 0x59, 0x50, 0x6F, 0x41, 0x2F, 0x70, 0x0A, 0x79, 0x4A, 0x56, 0x2F, 0x76, 0x31, 0x57, 0x52, 0x42, 0x58, 0x72, 0x50, 0x50, 0x52, 0x58, 0x41, 0x62, 0x39, 0x34, + 0x4A, 0x6C, 0x41, 0x47, 0x44, 0x31, 0x7A, 0x51, 0x62, 0x7A, 0x45, 0x43, 0x6C, 0x38, 0x4C, 0x69, 0x62, 0x5A, 0x39, 0x57, 0x59, 0x6B, 0x54, 0x75, 0x6E, 0x68, 0x48, 0x69, 0x56, 0x4A, 0x71, 0x52, 0x61, 0x43, 0x50, 0x67, 0x72, 0x64, 0x4C, 0x51, + 0x41, 0x42, 0x44, 0x7A, 0x66, 0x75, 0x42, 0x53, 0x4F, 0x36, 0x4E, 0x2B, 0x70, 0x6A, 0x57, 0x78, 0x6E, 0x0A, 0x6B, 0x6A, 0x4D, 0x64, 0x77, 0x4C, 0x66, 0x53, 0x37, 0x4A, 0x4C, 0x49, 0x76, 0x67, 0x6D, 0x2F, 0x4C, 0x43, 0x6B, 0x46, 0x62, 0x77, + 0x4A, 0x72, 0x6E, 0x75, 0x2B, 0x38, 0x76, 0x79, 0x71, 0x38, 0x57, 0x38, 0x42, 0x51, 0x6A, 0x30, 0x46, 0x77, 0x63, 0x59, 0x65, 0x79, 0x54, 0x62, 0x63, 0x45, 0x71, 0x59, 0x53, 0x6A, 0x4D, 0x71, 0x2B, 0x75, 0x37, 0x6D, 0x73, 0x58, 0x69, 0x37, + 0x4B, 0x78, 0x2F, 0x6D, 0x7A, 0x68, 0x6B, 0x49, 0x79, 0x49, 0x71, 0x4A, 0x64, 0x49, 0x0A, 0x7A, 0x73, 0x68, 0x4E, 0x79, 0x2F, 0x4D, 0x47, 0x7A, 0x31, 0x39, 0x71, 0x43, 0x6B, 0x4B, 0x78, 0x48, 0x68, 0x35, 0x33, 0x4C, 0x34, 0x36, 0x67, 0x35, + 0x70, 0x49, 0x4F, 0x42, 0x76, 0x77, 0x46, 0x49, 0x74, 0x49, 0x6D, 0x34, 0x54, 0x46, 0x52, 0x66, 0x54, 0x4C, 0x63, 0x44, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x79, 0x4D, 0x77, 0x49, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, + 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4E, + 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x58, 0x7A, 0x53, 0x42, 0x64, 0x75, 0x2B, 0x57, 0x48, 0x64, 0x58, 0x6C, 0x74, 0x64, 0x6B, 0x43, + 0x59, 0x34, 0x51, 0x57, 0x77, 0x61, 0x36, 0x67, 0x0A, 0x63, 0x46, 0x47, 0x6E, 0x39, 0x30, 0x78, 0x48, 0x4E, 0x63, 0x67, 0x4C, 0x31, 0x79, 0x67, 0x39, 0x69, 0x58, 0x48, 0x5A, 0x71, 0x6A, 0x4E, 0x42, 0x36, 0x68, 0x51, 0x62, 0x62, 0x43, 0x45, + 0x41, 0x77, 0x47, 0x78, 0x43, 0x47, 0x58, 0x36, 0x66, 0x61, 0x56, 0x73, 0x67, 0x51, 0x74, 0x2B, 0x69, 0x30, 0x74, 0x72, 0x45, 0x66, 0x4A, 0x64, 0x4C, 0x6A, 0x62, 0x44, 0x6F, 0x72, 0x4D, 0x6A, 0x75, 0x70, 0x57, 0x6B, 0x45, 0x6D, 0x51, 0x71, + 0x53, 0x70, 0x71, 0x73, 0x6E, 0x0A, 0x4C, 0x68, 0x70, 0x4E, 0x67, 0x62, 0x2B, 0x45, 0x31, 0x48, 0x41, 0x65, 0x72, 0x55, 0x66, 0x2B, 0x2F, 0x55, 0x71, 0x64, 0x4D, 0x2B, 0x44, 0x79, 0x75, 0x63, 0x52, 0x46, 0x43, 0x43, 0x45, 0x4B, 0x32, 0x6D, + 0x6C, 0x70, 0x63, 0x33, 0x49, 0x4E, 0x76, 0x6A, 0x54, 0x2B, 0x6C, 0x49, 0x75, 0x74, 0x77, 0x78, 0x34, 0x31, 0x31, 0x36, 0x4B, 0x44, 0x37, 0x2B, 0x55, 0x34, 0x78, 0x36, 0x57, 0x46, 0x48, 0x36, 0x76, 0x50, 0x4E, 0x4F, 0x77, 0x2F, 0x4B, 0x50, + 0x34, 0x4D, 0x0A, 0x38, 0x56, 0x65, 0x47, 0x54, 0x73, 0x6C, 0x56, 0x39, 0x78, 0x7A, 0x55, 0x32, 0x4B, 0x56, 0x39, 0x42, 0x6E, 0x70, 0x76, 0x31, 0x64, 0x38, 0x51, 0x33, 0x34, 0x46, 0x4F, 0x49, 0x57, 0x57, 0x78, 0x74, 0x75, 0x45, 0x58, 0x65, + 0x5A, 0x56, 0x46, 0x42, 0x73, 0x35, 0x66, 0x7A, 0x4E, 0x78, 0x47, 0x69, 0x57, 0x4E, 0x6F, 0x52, 0x49, 0x32, 0x54, 0x39, 0x47, 0x52, 0x77, 0x6F, 0x44, 0x32, 0x64, 0x4B, 0x41, 0x58, 0x44, 0x4F, 0x58, 0x43, 0x34, 0x59, 0x6E, 0x73, 0x67, 0x0A, + 0x2F, 0x65, 0x54, 0x62, 0x36, 0x51, 0x69, 0x68, 0x75, 0x4A, 0x34, 0x39, 0x43, 0x63, 0x64, 0x50, 0x2B, 0x79, 0x7A, 0x34, 0x6B, 0x33, 0x5A, 0x42, 0x33, 0x6C, 0x4C, 0x67, 0x34, 0x56, 0x66, 0x53, 0x6E, 0x51, 0x4F, 0x38, 0x64, 0x35, 0x37, 0x2B, + 0x6E, 0x69, 0x6C, 0x65, 0x39, 0x38, 0x46, 0x52, 0x59, 0x42, 0x2F, 0x65, 0x32, 0x67, 0x75, 0x79, 0x4C, 0x58, 0x57, 0x33, 0x51, 0x30, 0x69, 0x54, 0x35, 0x2F, 0x5A, 0x35, 0x78, 0x6F, 0x52, 0x64, 0x67, 0x46, 0x6C, 0x67, 0x0A, 0x6C, 0x50, 0x78, + 0x34, 0x6D, 0x49, 0x38, 0x38, 0x6B, 0x31, 0x48, 0x74, 0x51, 0x4A, 0x41, 0x48, 0x33, 0x32, 0x52, 0x6A, 0x4A, 0x4D, 0x74, 0x4F, 0x63, 0x51, 0x57, 0x68, 0x31, 0x35, 0x51, 0x61, 0x69, 0x44, 0x4C, 0x78, 0x49, 0x6E, 0x51, 0x69, 0x72, 0x71, 0x57, + 0x6D, 0x32, 0x42, 0x4A, 0x70, 0x54, 0x47, 0x43, 0x6A, 0x41, 0x75, 0x34, 0x72, 0x37, 0x4E, 0x52, 0x6A, 0x6B, 0x67, 0x74, 0x65, 0x76, 0x69, 0x39, 0x32, 0x61, 0x36, 0x4F, 0x32, 0x4A, 0x72, 0x79, 0x50, 0x0A, 0x41, 0x39, 0x67, 0x4B, 0x38, 0x6B, + 0x78, 0x6B, 0x52, 0x72, 0x30, 0x35, 0x59, 0x75, 0x57, 0x57, 0x36, 0x7A, 0x52, 0x6A, 0x45, 0x53, 0x6A, 0x4D, 0x6C, 0x66, 0x47, 0x74, 0x37, 0x2B, 0x2F, 0x63, 0x67, 0x46, 0x68, 0x49, 0x36, 0x55, 0x75, 0x34, 0x36, 0x6D, 0x57, 0x73, 0x36, 0x66, + 0x79, 0x41, 0x74, 0x62, 0x58, 0x49, 0x52, 0x66, 0x6D, 0x73, 0x77, 0x5A, 0x2F, 0x5A, 0x75, 0x65, 0x70, 0x69, 0x69, 0x49, 0x37, 0x45, 0x38, 0x55, 0x75, 0x44, 0x45, 0x71, 0x33, 0x6D, 0x0A, 0x69, 0x34, 0x54, 0x57, 0x6E, 0x73, 0x4C, 0x72, 0x67, + 0x78, 0x69, 0x66, 0x61, 0x72, 0x73, 0x62, 0x4A, 0x47, 0x41, 0x7A, 0x63, 0x4D, 0x7A, 0x73, 0x39, 0x7A, 0x4C, 0x7A, 0x58, 0x4E, 0x6C, 0x35, 0x66, 0x65, 0x2B, 0x65, 0x70, 0x50, 0x37, 0x4A, 0x49, 0x38, 0x4D, 0x6B, 0x37, 0x68, 0x57, 0x53, 0x73, + 0x54, 0x32, 0x52, 0x54, 0x79, 0x61, 0x47, 0x76, 0x57, 0x5A, 0x7A, 0x4A, 0x42, 0x50, 0x71, 0x70, 0x4B, 0x35, 0x6A, 0x77, 0x61, 0x31, 0x39, 0x68, 0x41, 0x4D, 0x38, 0x0A, 0x45, 0x48, 0x69, 0x47, 0x47, 0x33, 0x6E, 0x6A, 0x78, 0x50, 0x50, 0x79, + 0x42, 0x4A, 0x55, 0x67, 0x72, 0x69, 0x4F, 0x43, 0x78, 0x4C, 0x4D, 0x36, 0x41, 0x47, 0x4B, 0x2F, 0x35, 0x6A, 0x59, 0x6B, 0x34, 0x56, 0x65, 0x36, 0x78, 0x78, 0x36, 0x51, 0x64, 0x64, 0x56, 0x66, 0x50, 0x35, 0x56, 0x68, 0x4B, 0x38, 0x45, 0x37, + 0x7A, 0x65, 0x57, 0x7A, 0x61, 0x47, 0x48, 0x51, 0x52, 0x69, 0x61, 0x70, 0x49, 0x56, 0x4A, 0x70, 0x4C, 0x65, 0x73, 0x75, 0x78, 0x2B, 0x74, 0x33, 0x0A, 0x7A, 0x71, 0x59, 0x36, 0x74, 0x51, 0x4D, 0x7A, 0x54, 0x33, 0x62, 0x52, 0x35, 0x31, 0x78, + 0x55, 0x41, 0x56, 0x33, 0x4C, 0x65, 0x50, 0x54, 0x4A, 0x44, 0x4C, 0x2F, 0x50, 0x45, 0x6F, 0x34, 0x58, 0x4C, 0x53, 0x4E, 0x6F, 0x6C, 0x4F, 0x65, 0x72, 0x2F, 0x71, 0x6D, 0x79, 0x4B, 0x77, 0x62, 0x51, 0x42, 0x4D, 0x30, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x65, 0x6C, 0x69, 0x61, 0x53, 0x6F, 0x6E, 0x65, 0x72, 0x61, 0x20, 0x52, 0x6F, 0x6F, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x76, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, + 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x4F, 0x44, 0x43, 0x43, 0x41, 0x79, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, 0x41, + 0x4A, 0x57, 0x2B, 0x46, 0x71, 0x44, 0x33, 0x4C, 0x6B, 0x62, 0x78, 0x65, 0x7A, 0x6D, 0x43, 0x63, 0x76, 0x71, 0x4C, 0x7A, 0x5A, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x46, 0x42, + 0x51, 0x41, 0x77, 0x4E, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x67, 0x77, 0x4C, 0x56, 0x47, 0x56, 0x73, 0x61, 0x57, 0x46, 0x54, 0x62, 0x32, 0x35, 0x6C, 0x63, 0x6D, 0x45, 0x78, 0x48, 0x7A, 0x41, 0x64, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x6C, 0x52, 0x6C, 0x62, 0x47, 0x6C, 0x68, 0x55, 0x32, 0x39, 0x75, 0x5A, 0x58, 0x4A, 0x68, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x64, 0x6A, 0x45, 0x77, + 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x63, 0x78, 0x4D, 0x44, 0x45, 0x34, 0x0A, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x55, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x49, 0x78, 0x4D, 0x44, 0x45, 0x34, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x55, + 0x77, 0x57, 0x6A, 0x41, 0x33, 0x4D, 0x52, 0x51, 0x77, 0x45, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x74, 0x55, 0x5A, 0x57, 0x78, 0x70, 0x59, 0x56, 0x4E, 0x76, 0x62, 0x6D, 0x56, 0x79, 0x59, 0x54, 0x45, 0x66, 0x4D, 0x42, 0x30, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x57, 0x0A, 0x56, 0x47, 0x56, 0x73, 0x61, 0x57, 0x46, 0x54, 0x62, 0x32, 0x35, 0x6C, 0x63, 0x6D, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x32, 0x4D, 0x54, + 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, + 0x49, 0x42, 0x41, 0x4D, 0x4B, 0x2B, 0x0A, 0x36, 0x79, 0x66, 0x77, 0x49, 0x61, 0x50, 0x7A, 0x61, 0x53, 0x5A, 0x56, 0x66, 0x70, 0x33, 0x46, 0x56, 0x52, 0x61, 0x52, 0x58, 0x50, 0x33, 0x76, 0x49, 0x62, 0x39, 0x54, 0x67, 0x48, 0x6F, 0x74, 0x30, + 0x70, 0x47, 0x4D, 0x59, 0x7A, 0x48, 0x77, 0x37, 0x43, 0x54, 0x77, 0x77, 0x36, 0x58, 0x53, 0x63, 0x6E, 0x77, 0x51, 0x62, 0x66, 0x51, 0x33, 0x74, 0x2B, 0x58, 0x6D, 0x66, 0x48, 0x6E, 0x71, 0x6A, 0x4C, 0x57, 0x43, 0x69, 0x36, 0x35, 0x49, 0x74, + 0x71, 0x77, 0x41, 0x0A, 0x33, 0x47, 0x56, 0x31, 0x37, 0x43, 0x70, 0x4E, 0x58, 0x38, 0x47, 0x48, 0x39, 0x53, 0x42, 0x6C, 0x4B, 0x34, 0x47, 0x6F, 0x52, 0x7A, 0x36, 0x4A, 0x49, 0x35, 0x55, 0x77, 0x46, 0x70, 0x42, 0x2F, 0x36, 0x46, 0x63, 0x48, + 0x53, 0x4F, 0x63, 0x5A, 0x72, 0x72, 0x39, 0x46, 0x5A, 0x37, 0x45, 0x33, 0x47, 0x77, 0x59, 0x71, 0x2F, 0x74, 0x37, 0x35, 0x72, 0x48, 0x32, 0x44, 0x2B, 0x31, 0x36, 0x36, 0x35, 0x49, 0x2B, 0x58, 0x5A, 0x37, 0x35, 0x4C, 0x6A, 0x6F, 0x31, 0x6B, + 0x0A, 0x42, 0x31, 0x63, 0x34, 0x56, 0x57, 0x6B, 0x30, 0x4E, 0x6A, 0x30, 0x54, 0x53, 0x4F, 0x39, 0x50, 0x34, 0x74, 0x4E, 0x6D, 0x48, 0x71, 0x54, 0x50, 0x47, 0x72, 0x64, 0x65, 0x4E, 0x6A, 0x50, 0x55, 0x74, 0x41, 0x61, 0x39, 0x47, 0x41, 0x48, + 0x39, 0x64, 0x34, 0x52, 0x51, 0x41, 0x45, 0x58, 0x31, 0x6A, 0x46, 0x33, 0x6F, 0x49, 0x37, 0x78, 0x2B, 0x2F, 0x6A, 0x58, 0x68, 0x37, 0x56, 0x42, 0x37, 0x71, 0x54, 0x43, 0x4E, 0x47, 0x64, 0x4D, 0x4A, 0x6A, 0x6D, 0x68, 0x6E, 0x0A, 0x58, 0x62, + 0x38, 0x38, 0x6C, 0x78, 0x68, 0x54, 0x75, 0x79, 0x6C, 0x69, 0x78, 0x63, 0x70, 0x65, 0x63, 0x73, 0x48, 0x48, 0x6C, 0x74, 0x54, 0x62, 0x4C, 0x61, 0x43, 0x30, 0x48, 0x32, 0x6B, 0x44, 0x37, 0x4F, 0x72, 0x69, 0x55, 0x50, 0x45, 0x4D, 0x50, 0x50, + 0x43, 0x73, 0x38, 0x31, 0x4D, 0x74, 0x38, 0x42, 0x7A, 0x31, 0x37, 0x57, 0x77, 0x35, 0x4F, 0x58, 0x4F, 0x41, 0x46, 0x73, 0x68, 0x53, 0x73, 0x43, 0x50, 0x4E, 0x34, 0x44, 0x37, 0x63, 0x33, 0x54, 0x78, 0x48, 0x0A, 0x6F, 0x4C, 0x73, 0x31, 0x69, + 0x75, 0x4B, 0x59, 0x61, 0x49, 0x75, 0x2B, 0x35, 0x62, 0x39, 0x79, 0x37, 0x74, 0x4C, 0x36, 0x70, 0x65, 0x30, 0x53, 0x37, 0x66, 0x79, 0x59, 0x47, 0x4B, 0x6B, 0x6D, 0x64, 0x74, 0x77, 0x6F, 0x53, 0x78, 0x41, 0x67, 0x48, 0x4E, 0x4E, 0x2F, 0x46, + 0x6E, 0x63, 0x74, 0x37, 0x57, 0x2B, 0x41, 0x39, 0x30, 0x6D, 0x37, 0x55, 0x77, 0x57, 0x37, 0x58, 0x57, 0x6A, 0x48, 0x31, 0x4D, 0x68, 0x31, 0x46, 0x6A, 0x2B, 0x4A, 0x57, 0x6F, 0x76, 0x33, 0x0A, 0x46, 0x30, 0x66, 0x55, 0x54, 0x50, 0x48, 0x53, + 0x69, 0x58, 0x6B, 0x2B, 0x54, 0x54, 0x32, 0x59, 0x71, 0x47, 0x48, 0x65, 0x4F, 0x68, 0x37, 0x53, 0x2B, 0x46, 0x34, 0x44, 0x34, 0x4D, 0x48, 0x4A, 0x48, 0x49, 0x7A, 0x54, 0x6A, 0x55, 0x33, 0x54, 0x6C, 0x54, 0x61, 0x7A, 0x4E, 0x31, 0x39, 0x6A, + 0x59, 0x35, 0x73, 0x7A, 0x46, 0x50, 0x41, 0x74, 0x4A, 0x6D, 0x74, 0x54, 0x66, 0x49, 0x6D, 0x4D, 0x4D, 0x73, 0x4A, 0x75, 0x37, 0x44, 0x30, 0x68, 0x41, 0x44, 0x6E, 0x4A, 0x0A, 0x6F, 0x57, 0x6A, 0x69, 0x55, 0x49, 0x4D, 0x75, 0x73, 0x44, 0x6F, + 0x72, 0x38, 0x7A, 0x61, 0x67, 0x72, 0x43, 0x2F, 0x6B, 0x62, 0x32, 0x48, 0x43, 0x55, 0x51, 0x6B, 0x35, 0x50, 0x6F, 0x74, 0x54, 0x75, 0x62, 0x74, 0x6E, 0x32, 0x74, 0x78, 0x54, 0x75, 0x58, 0x5A, 0x5A, 0x4E, 0x70, 0x31, 0x44, 0x35, 0x53, 0x44, + 0x67, 0x50, 0x54, 0x4A, 0x67, 0x68, 0x53, 0x4A, 0x52, 0x74, 0x38, 0x63, 0x7A, 0x75, 0x39, 0x30, 0x56, 0x4C, 0x36, 0x52, 0x34, 0x70, 0x67, 0x64, 0x37, 0x0A, 0x67, 0x55, 0x59, 0x32, 0x42, 0x49, 0x62, 0x64, 0x65, 0x54, 0x58, 0x48, 0x6C, 0x53, + 0x77, 0x37, 0x73, 0x4B, 0x4D, 0x58, 0x4E, 0x65, 0x56, 0x7A, 0x48, 0x37, 0x52, 0x63, 0x57, 0x65, 0x2F, 0x61, 0x36, 0x68, 0x42, 0x6C, 0x65, 0x33, 0x72, 0x51, 0x66, 0x35, 0x2B, 0x7A, 0x74, 0x43, 0x6F, 0x33, 0x4F, 0x33, 0x43, 0x4C, 0x6D, 0x31, + 0x75, 0x35, 0x4B, 0x37, 0x66, 0x73, 0x73, 0x6C, 0x45, 0x53, 0x6C, 0x31, 0x4D, 0x70, 0x57, 0x74, 0x54, 0x77, 0x45, 0x68, 0x44, 0x63, 0x0A, 0x54, 0x77, 0x4B, 0x37, 0x45, 0x70, 0x49, 0x76, 0x59, 0x74, 0x51, 0x2F, 0x61, 0x55, 0x4E, 0x38, 0x44, + 0x64, 0x62, 0x38, 0x57, 0x48, 0x55, 0x42, 0x69, 0x4A, 0x31, 0x59, 0x46, 0x6B, 0x76, 0x65, 0x75, 0x70, 0x44, 0x2F, 0x52, 0x77, 0x47, 0x4A, 0x42, 0x6D, 0x72, 0x32, 0x58, 0x37, 0x4B, 0x51, 0x61, 0x72, 0x4D, 0x43, 0x70, 0x67, 0x4B, 0x49, 0x76, + 0x37, 0x4E, 0x48, 0x66, 0x69, 0x72, 0x5A, 0x31, 0x66, 0x70, 0x6F, 0x65, 0x44, 0x56, 0x4E, 0x41, 0x67, 0x4D, 0x42, 0x0A, 0x41, 0x41, 0x47, 0x6A, 0x50, 0x7A, 0x41, 0x39, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, + 0x42, 0x42, 0x54, 0x77, 0x6A, 0x31, 0x6B, 0x34, 0x41, 0x4C, 0x50, 0x31, 0x6A, 0x35, 0x71, 0x57, 0x0A, 0x44, 0x4E, 0x58, 0x72, 0x2B, 0x6E, 0x75, 0x71, 0x46, 0x2B, 0x67, 0x54, 0x45, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, + 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x76, 0x75, 0x52, 0x63, 0x59, 0x6B, 0x34, 0x6B, 0x39, 0x41, 0x77, 0x49, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x47, 0x6A, 0x6B, 0x6B, 0x30, 0x6B, + 0x69, 0x50, 0x30, 0x51, 0x6E, 0x62, 0x37, 0x74, 0x74, 0x33, 0x6F, 0x4E, 0x6D, 0x0A, 0x7A, 0x71, 0x6A, 0x4D, 0x44, 0x66, 0x7A, 0x31, 0x6D, 0x67, 0x62, 0x6C, 0x64, 0x78, 0x53, 0x52, 0x36, 0x35, 0x31, 0x42, 0x65, 0x35, 0x6B, 0x71, 0x68, 0x4F, + 0x58, 0x2F, 0x2F, 0x43, 0x48, 0x42, 0x58, 0x66, 0x44, 0x6B, 0x48, 0x31, 0x65, 0x33, 0x64, 0x61, 0x6D, 0x68, 0x58, 0x77, 0x49, 0x6D, 0x2F, 0x39, 0x66, 0x48, 0x39, 0x30, 0x37, 0x65, 0x54, 0x2F, 0x6A, 0x33, 0x48, 0x45, 0x62, 0x41, 0x65, 0x6B, + 0x39, 0x41, 0x4C, 0x43, 0x49, 0x31, 0x38, 0x42, 0x6D, 0x78, 0x0A, 0x30, 0x47, 0x74, 0x6E, 0x4C, 0x4C, 0x43, 0x6F, 0x34, 0x4D, 0x42, 0x41, 0x4E, 0x7A, 0x58, 0x32, 0x68, 0x46, 0x78, 0x63, 0x34, 0x36, 0x39, 0x43, 0x65, 0x50, 0x36, 0x6E, 0x79, + 0x51, 0x31, 0x51, 0x36, 0x67, 0x32, 0x45, 0x64, 0x76, 0x5A, 0x52, 0x37, 0x34, 0x4E, 0x54, 0x78, 0x6E, 0x72, 0x2F, 0x44, 0x6C, 0x5A, 0x4A, 0x4C, 0x6F, 0x39, 0x36, 0x31, 0x67, 0x7A, 0x6D, 0x4A, 0x31, 0x54, 0x6A, 0x54, 0x51, 0x70, 0x67, 0x63, + 0x6D, 0x4C, 0x4E, 0x6B, 0x51, 0x66, 0x57, 0x0A, 0x70, 0x62, 0x2F, 0x49, 0x6D, 0x57, 0x76, 0x74, 0x78, 0x42, 0x6E, 0x6D, 0x71, 0x30, 0x77, 0x52, 0x4F, 0x4D, 0x56, 0x76, 0x4D, 0x65, 0x4A, 0x75, 0x53, 0x63, 0x67, 0x2F, 0x64, 0x6F, 0x41, 0x6D, + 0x41, 0x79, 0x59, 0x70, 0x34, 0x44, 0x62, 0x32, 0x39, 0x69, 0x42, 0x54, 0x34, 0x78, 0x64, 0x77, 0x4E, 0x42, 0x65, 0x64, 0x59, 0x32, 0x67, 0x65, 0x61, 0x2B, 0x7A, 0x44, 0x54, 0x59, 0x61, 0x34, 0x45, 0x7A, 0x41, 0x76, 0x58, 0x55, 0x59, 0x4E, + 0x52, 0x30, 0x50, 0x56, 0x0A, 0x47, 0x36, 0x70, 0x5A, 0x44, 0x72, 0x6C, 0x63, 0x6A, 0x51, 0x5A, 0x49, 0x72, 0x58, 0x53, 0x48, 0x58, 0x38, 0x66, 0x38, 0x4D, 0x56, 0x52, 0x42, 0x45, 0x2B, 0x4C, 0x48, 0x49, 0x51, 0x36, 0x65, 0x34, 0x42, 0x34, + 0x4E, 0x34, 0x63, 0x42, 0x37, 0x51, 0x34, 0x57, 0x51, 0x78, 0x59, 0x70, 0x59, 0x78, 0x6D, 0x55, 0x4B, 0x65, 0x46, 0x66, 0x79, 0x78, 0x69, 0x4D, 0x50, 0x41, 0x64, 0x6B, 0x67, 0x53, 0x39, 0x34, 0x50, 0x2B, 0x35, 0x4B, 0x46, 0x64, 0x53, 0x70, + 0x63, 0x0A, 0x63, 0x34, 0x31, 0x74, 0x65, 0x79, 0x57, 0x52, 0x79, 0x75, 0x35, 0x46, 0x72, 0x67, 0x5A, 0x4C, 0x41, 0x4D, 0x7A, 0x54, 0x73, 0x56, 0x6C, 0x51, 0x32, 0x6A, 0x71, 0x49, 0x4F, 0x79, 0x6C, 0x44, 0x52, 0x6C, 0x36, 0x58, 0x4B, 0x31, + 0x54, 0x4F, 0x55, 0x32, 0x2B, 0x4E, 0x53, 0x75, 0x65, 0x57, 0x2B, 0x72, 0x39, 0x78, 0x44, 0x6B, 0x4B, 0x4C, 0x66, 0x50, 0x30, 0x6F, 0x6F, 0x4E, 0x42, 0x49, 0x79, 0x74, 0x72, 0x45, 0x67, 0x55, 0x79, 0x37, 0x6F, 0x6E, 0x4F, 0x54, 0x0A, 0x4A, + 0x73, 0x6A, 0x72, 0x44, 0x4E, 0x59, 0x6D, 0x69, 0x4C, 0x62, 0x41, 0x4A, 0x4D, 0x2B, 0x37, 0x76, 0x56, 0x76, 0x72, 0x64, 0x58, 0x33, 0x70, 0x43, 0x49, 0x36, 0x47, 0x4D, 0x79, 0x78, 0x35, 0x64, 0x77, 0x6C, 0x70, 0x70, 0x59, 0x6E, 0x38, 0x73, + 0x33, 0x43, 0x51, 0x68, 0x33, 0x61, 0x50, 0x30, 0x79, 0x4B, 0x37, 0x51, 0x73, 0x36, 0x39, 0x63, 0x77, 0x73, 0x67, 0x4A, 0x69, 0x72, 0x51, 0x6D, 0x7A, 0x31, 0x77, 0x48, 0x69, 0x52, 0x73, 0x7A, 0x59, 0x64, 0x32, 0x0A, 0x71, 0x52, 0x65, 0x57, + 0x74, 0x38, 0x38, 0x4E, 0x6B, 0x76, 0x75, 0x4F, 0x47, 0x4B, 0x6D, 0x59, 0x53, 0x64, 0x47, 0x65, 0x2F, 0x6D, 0x42, 0x45, 0x63, 0x69, 0x47, 0x35, 0x47, 0x65, 0x33, 0x43, 0x39, 0x54, 0x48, 0x78, 0x4F, 0x55, 0x69, 0x49, 0x6B, 0x43, 0x52, 0x31, + 0x56, 0x42, 0x61, 0x74, 0x7A, 0x76, 0x54, 0x34, 0x61, 0x52, 0x52, 0x6B, 0x4F, 0x66, 0x75, 0x6A, 0x75, 0x4C, 0x70, 0x77, 0x51, 0x4D, 0x63, 0x6E, 0x48, 0x4C, 0x2F, 0x45, 0x56, 0x6C, 0x50, 0x36, 0x0A, 0x59, 0x32, 0x58, 0x51, 0x38, 0x78, 0x77, + 0x4F, 0x46, 0x76, 0x56, 0x72, 0x68, 0x6C, 0x68, 0x4E, 0x47, 0x4E, 0x54, 0x6B, 0x44, 0x59, 0x36, 0x6C, 0x6E, 0x56, 0x75, 0x52, 0x33, 0x48, 0x59, 0x6B, 0x55, 0x44, 0x2F, 0x47, 0x4B, 0x76, 0x76, 0x5A, 0x74, 0x35, 0x79, 0x31, 0x31, 0x75, 0x62, + 0x51, 0x32, 0x65, 0x67, 0x5A, 0x69, 0x78, 0x56, 0x78, 0x53, 0x4B, 0x32, 0x33, 0x36, 0x74, 0x68, 0x5A, 0x69, 0x4E, 0x53, 0x51, 0x76, 0x78, 0x61, 0x7A, 0x32, 0x65, 0x6D, 0x73, 0x0A, 0x57, 0x57, 0x46, 0x55, 0x79, 0x42, 0x79, 0x36, 0x79, 0x73, + 0x48, 0x4B, 0x34, 0x62, 0x6B, 0x67, 0x54, 0x49, 0x38, 0x36, 0x6B, 0x34, 0x6D, 0x6C, 0x6F, 0x4D, 0x79, 0x2F, 0x30, 0x2F, 0x5A, 0x31, 0x70, 0x48, 0x57, 0x57, 0x62, 0x56, 0x59, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x2D, 0x54, 0x65, 0x6C, 0x65, 0x53, 0x65, 0x63, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, + 0x6C, 0x61, 0x73, 0x73, 0x20, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x77, 0x7A, 0x43, 0x43, 0x41, 0x71, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, + 0x41, 0x67, 0x49, 0x42, 0x41, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x67, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x0A, 0x49, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x46, 0x62, 0x6E, 0x52, + 0x6C, 0x63, 0x6E, 0x42, 0x79, 0x61, 0x58, 0x4E, 0x6C, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, + 0x4D, 0x46, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x55, 0x0A, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x57, 0x35, 0x30, 0x5A, 0x58, 0x49, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x51, 0x74, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x56, 0x4E, 0x6C, 0x59, 0x79, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, + 0x4E, 0x7A, 0x49, 0x44, 0x49, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x67, 0x78, 0x0A, 0x4D, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x41, 0x30, 0x4D, 0x44, 0x45, 0x30, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x4D, 0x78, 0x4D, 0x44, 0x41, 0x78, 0x4D, + 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x67, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x6F, 0x4D, 0x49, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x0A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x46, 0x62, 0x6E, 0x52, 0x6C, 0x63, 0x6E, 0x42, 0x79, 0x61, 0x58, 0x4E, 0x6C, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, + 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x64, 0x74, 0x59, 0x6B, 0x67, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x46, 0x6C, 0x51, 0x74, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x55, + 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x44, 0x0A, 0x5A, 0x57, 0x35, 0x30, 0x5A, 0x58, 0x49, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x51, 0x74, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x56, 0x4E, + 0x6C, 0x59, 0x79, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x73, 0x59, 0x58, 0x4E, 0x7A, 0x49, 0x44, 0x49, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, + 0x47, 0x53, 0x49, 0x62, 0x33, 0x0A, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x71, 0x58, 0x39, 0x6F, 0x62, 0x58, 0x2B, + 0x68, 0x7A, 0x6B, 0x65, 0x58, 0x61, 0x58, 0x50, 0x53, 0x69, 0x35, 0x6B, 0x66, 0x6C, 0x38, 0x32, 0x68, 0x56, 0x59, 0x41, 0x55, 0x64, 0x41, 0x71, 0x53, 0x7A, 0x6D, 0x31, 0x6E, 0x7A, 0x48, 0x6F, 0x71, 0x76, 0x4E, 0x4B, 0x33, 0x38, 0x44, 0x63, + 0x4C, 0x5A, 0x0A, 0x53, 0x42, 0x6E, 0x75, 0x61, 0x59, 0x2F, 0x4A, 0x49, 0x50, 0x77, 0x68, 0x71, 0x67, 0x63, 0x5A, 0x37, 0x62, 0x42, 0x63, 0x72, 0x47, 0x58, 0x48, 0x58, 0x2B, 0x30, 0x43, 0x66, 0x48, 0x74, 0x38, 0x4C, 0x52, 0x76, 0x57, 0x75, + 0x72, 0x6D, 0x41, 0x77, 0x68, 0x69, 0x43, 0x46, 0x6F, 0x54, 0x36, 0x5A, 0x72, 0x41, 0x49, 0x78, 0x6C, 0x51, 0x6A, 0x67, 0x65, 0x54, 0x4E, 0x75, 0x55, 0x6B, 0x2F, 0x39, 0x6B, 0x39, 0x75, 0x4E, 0x30, 0x67, 0x6F, 0x4F, 0x41, 0x2F, 0x46, 0x0A, + 0x76, 0x75, 0x64, 0x6F, 0x63, 0x50, 0x30, 0x35, 0x6C, 0x30, 0x33, 0x53, 0x78, 0x35, 0x69, 0x52, 0x55, 0x4B, 0x72, 0x45, 0x52, 0x4C, 0x4D, 0x6A, 0x66, 0x54, 0x6C, 0x48, 0x36, 0x56, 0x4A, 0x69, 0x31, 0x68, 0x4B, 0x54, 0x58, 0x72, 0x63, 0x78, + 0x6C, 0x6B, 0x49, 0x46, 0x2B, 0x33, 0x61, 0x6E, 0x48, 0x71, 0x50, 0x31, 0x77, 0x76, 0x7A, 0x70, 0x65, 0x73, 0x56, 0x73, 0x71, 0x58, 0x46, 0x50, 0x36, 0x73, 0x74, 0x34, 0x76, 0x47, 0x43, 0x76, 0x78, 0x39, 0x37, 0x30, 0x0A, 0x32, 0x63, 0x75, + 0x2B, 0x66, 0x6A, 0x4F, 0x6C, 0x62, 0x70, 0x53, 0x44, 0x38, 0x44, 0x54, 0x36, 0x49, 0x61, 0x76, 0x71, 0x6A, 0x6E, 0x4B, 0x67, 0x50, 0x36, 0x54, 0x65, 0x4D, 0x46, 0x76, 0x76, 0x68, 0x6B, 0x31, 0x71, 0x6C, 0x56, 0x74, 0x44, 0x52, 0x4B, 0x67, + 0x51, 0x46, 0x52, 0x7A, 0x6C, 0x41, 0x56, 0x66, 0x46, 0x6D, 0x50, 0x48, 0x6D, 0x42, 0x69, 0x69, 0x52, 0x71, 0x69, 0x44, 0x46, 0x74, 0x31, 0x4D, 0x6D, 0x55, 0x55, 0x4F, 0x79, 0x43, 0x78, 0x47, 0x56, 0x0A, 0x57, 0x4F, 0x48, 0x41, 0x44, 0x33, + 0x62, 0x5A, 0x77, 0x49, 0x31, 0x38, 0x67, 0x66, 0x4E, 0x79, 0x63, 0x4A, 0x35, 0x76, 0x2F, 0x68, 0x71, 0x4F, 0x32, 0x56, 0x38, 0x31, 0x78, 0x72, 0x4A, 0x76, 0x4E, 0x48, 0x79, 0x2B, 0x53, 0x45, 0x2F, 0x69, 0x57, 0x6A, 0x6E, 0x58, 0x32, 0x4A, + 0x31, 0x34, 0x6E, 0x70, 0x2B, 0x47, 0x50, 0x67, 0x4E, 0x65, 0x47, 0x59, 0x74, 0x45, 0x6F, 0x74, 0x58, 0x48, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, + 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x2F, 0x57, 0x53, 0x41, 0x32, 0x41, 0x48, 0x6D, 0x67, 0x6F, 0x43, 0x4A, 0x72, 0x6A, 0x4E, 0x58, 0x79, 0x0A, 0x59, 0x64, 0x4B, 0x34, 0x4C, 0x4D, 0x75, 0x43, 0x53, 0x6A, 0x41, 0x4E, + 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x4D, 0x51, 0x4F, 0x69, 0x59, 0x51, 0x73, 0x66, 0x64, 0x4F, 0x68, 0x79, 0x4E, 0x73, 0x5A, 0x74, + 0x2B, 0x55, 0x32, 0x65, 0x2B, 0x69, 0x4B, 0x6F, 0x34, 0x59, 0x46, 0x57, 0x7A, 0x38, 0x32, 0x37, 0x6E, 0x2B, 0x71, 0x72, 0x6B, 0x52, 0x6B, 0x34, 0x0A, 0x72, 0x36, 0x70, 0x38, 0x46, 0x55, 0x33, 0x7A, 0x74, 0x71, 0x4F, 0x4E, 0x70, 0x66, 0x53, + 0x4F, 0x39, 0x6B, 0x53, 0x70, 0x70, 0x2B, 0x67, 0x68, 0x6C, 0x61, 0x30, 0x2B, 0x41, 0x47, 0x49, 0x57, 0x69, 0x50, 0x41, 0x43, 0x75, 0x76, 0x78, 0x68, 0x49, 0x2B, 0x59, 0x7A, 0x6D, 0x7A, 0x42, 0x36, 0x61, 0x7A, 0x5A, 0x69, 0x65, 0x36, 0x30, + 0x45, 0x49, 0x34, 0x52, 0x59, 0x5A, 0x65, 0x4C, 0x62, 0x4B, 0x34, 0x72, 0x6E, 0x4A, 0x56, 0x4D, 0x33, 0x59, 0x6C, 0x4E, 0x66, 0x0A, 0x76, 0x4E, 0x6F, 0x42, 0x59, 0x69, 0x6D, 0x69, 0x70, 0x69, 0x64, 0x78, 0x35, 0x6A, 0x6F, 0x69, 0x66, 0x73, + 0x46, 0x76, 0x48, 0x5A, 0x56, 0x77, 0x49, 0x45, 0x6F, 0x48, 0x4E, 0x4E, 0x2F, 0x71, 0x2F, 0x78, 0x57, 0x41, 0x35, 0x62, 0x72, 0x58, 0x65, 0x74, 0x68, 0x62, 0x64, 0x58, 0x77, 0x46, 0x65, 0x69, 0x6C, 0x48, 0x66, 0x6B, 0x43, 0x6F, 0x4D, 0x52, + 0x4E, 0x33, 0x7A, 0x55, 0x41, 0x37, 0x74, 0x46, 0x46, 0x48, 0x65, 0x69, 0x34, 0x52, 0x34, 0x30, 0x63, 0x52, 0x0A, 0x33, 0x70, 0x31, 0x6D, 0x30, 0x49, 0x76, 0x56, 0x56, 0x47, 0x62, 0x36, 0x67, 0x31, 0x58, 0x71, 0x66, 0x4D, 0x49, 0x70, 0x69, + 0x52, 0x76, 0x70, 0x62, 0x37, 0x50, 0x4F, 0x34, 0x67, 0x57, 0x45, 0x79, 0x53, 0x38, 0x2B, 0x65, 0x49, 0x56, 0x69, 0x62, 0x73, 0x6C, 0x66, 0x77, 0x58, 0x68, 0x6A, 0x64, 0x46, 0x6A, 0x41, 0x53, 0x42, 0x67, 0x4D, 0x6D, 0x54, 0x6E, 0x72, 0x70, + 0x4D, 0x77, 0x61, 0x74, 0x58, 0x6C, 0x61, 0x6A, 0x52, 0x57, 0x63, 0x32, 0x42, 0x51, 0x4E, 0x0A, 0x39, 0x6E, 0x6F, 0x48, 0x56, 0x38, 0x63, 0x69, 0x67, 0x77, 0x55, 0x74, 0x50, 0x4A, 0x73, 0x6C, 0x4A, 0x6A, 0x30, 0x59, 0x73, 0x36, 0x6C, 0x44, + 0x66, 0x4D, 0x6A, 0x49, 0x71, 0x32, 0x53, 0x50, 0x44, 0x71, 0x4F, 0x2F, 0x6E, 0x42, 0x75, 0x64, 0x4D, 0x4E, 0x76, 0x61, 0x30, 0x42, 0x6B, 0x75, 0x71, 0x6A, 0x7A, 0x78, 0x2B, 0x7A, 0x4F, 0x41, 0x64, 0x75, 0x54, 0x4E, 0x72, 0x52, 0x6C, 0x50, + 0x42, 0x53, 0x65, 0x4F, 0x45, 0x36, 0x46, 0x75, 0x77, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, + 0x41, 0x74, 0x6F, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x64, 0x7A, 0x43, 0x43, + 0x41, 0x6C, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x58, 0x44, 0x50, 0x4C, 0x59, 0x69, 0x78, 0x66, 0x73, 0x7A, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, + 0x42, 0x51, 0x41, 0x77, 0x50, 0x44, 0x45, 0x65, 0x4D, 0x42, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x56, 0x51, 0x58, 0x52, 0x76, 0x63, 0x79, 0x42, 0x55, 0x0A, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x47, 0x56, 0x6B, 0x55, 0x6D, 0x39, + 0x76, 0x64, 0x43, 0x41, 0x79, 0x4D, 0x44, 0x45, 0x78, 0x4D, 0x51, 0x30, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x52, 0x42, 0x64, 0x47, 0x39, 0x7A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x45, 0x77, 0x4A, 0x45, 0x52, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x54, 0x41, 0x33, 0x4D, 0x44, 0x63, 0x78, 0x4E, 0x44, 0x55, 0x34, 0x0A, 0x4D, 0x7A, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x44, 0x45, 0x79, 0x4D, 0x7A, + 0x45, 0x79, 0x4D, 0x7A, 0x55, 0x35, 0x4E, 0x54, 0x6C, 0x61, 0x4D, 0x44, 0x77, 0x78, 0x48, 0x6A, 0x41, 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x55, 0x46, 0x30, 0x62, 0x33, 0x4D, 0x67, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, + 0x52, 0x6C, 0x5A, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x45, 0x4E, 0x4D, 0x41, 0x73, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x45, 0x51, 0x58, 0x52, 0x76, 0x63, 0x7A, 0x45, 0x4C, 0x4D, + 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, + 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x56, 0x0A, 0x68, 0x54, 0x75, 0x58, 0x62, 0x79, 0x6F, 0x37, 0x4C, 0x6A, 0x76, 0x50, 0x70, 0x76, 0x4D, 0x70, 0x4E, 0x62, 0x37, 0x50, + 0x47, 0x4B, 0x77, 0x2B, 0x71, 0x74, 0x6E, 0x34, 0x54, 0x61, 0x41, 0x2B, 0x47, 0x6B, 0x65, 0x35, 0x76, 0x4A, 0x72, 0x66, 0x38, 0x76, 0x37, 0x4D, 0x50, 0x6B, 0x66, 0x6F, 0x65, 0x70, 0x62, 0x43, 0x4A, 0x49, 0x34, 0x31, 0x39, 0x4B, 0x6B, 0x4D, + 0x2F, 0x49, 0x4C, 0x39, 0x62, 0x63, 0x46, 0x79, 0x59, 0x69, 0x65, 0x39, 0x36, 0x6D, 0x76, 0x72, 0x0A, 0x35, 0x34, 0x72, 0x4D, 0x56, 0x44, 0x36, 0x51, 0x55, 0x4D, 0x2B, 0x41, 0x31, 0x4A, 0x58, 0x37, 0x36, 0x4C, 0x57, 0x43, 0x31, 0x42, 0x54, + 0x46, 0x74, 0x71, 0x6C, 0x56, 0x4A, 0x56, 0x66, 0x62, 0x73, 0x56, 0x44, 0x32, 0x73, 0x47, 0x42, 0x6B, 0x57, 0x58, 0x70, 0x70, 0x7A, 0x77, 0x4F, 0x33, 0x62, 0x77, 0x32, 0x2B, 0x79, 0x6A, 0x35, 0x76, 0x64, 0x48, 0x4C, 0x71, 0x71, 0x6A, 0x41, + 0x71, 0x63, 0x32, 0x4B, 0x2B, 0x53, 0x5A, 0x46, 0x68, 0x79, 0x42, 0x48, 0x2B, 0x0A, 0x44, 0x67, 0x4D, 0x71, 0x39, 0x32, 0x6F, 0x67, 0x33, 0x41, 0x49, 0x56, 0x44, 0x56, 0x34, 0x56, 0x61, 0x76, 0x7A, 0x6A, 0x67, 0x73, 0x47, 0x31, 0x78, 0x5A, + 0x31, 0x6B, 0x43, 0x57, 0x79, 0x6A, 0x57, 0x5A, 0x67, 0x48, 0x4A, 0x38, 0x63, 0x62, 0x6C, 0x69, 0x74, 0x68, 0x64, 0x48, 0x46, 0x73, 0x51, 0x2F, 0x48, 0x33, 0x4E, 0x59, 0x6B, 0x51, 0x34, 0x4A, 0x37, 0x73, 0x56, 0x61, 0x45, 0x33, 0x49, 0x71, + 0x4B, 0x48, 0x42, 0x41, 0x55, 0x73, 0x52, 0x33, 0x32, 0x30, 0x0A, 0x48, 0x4C, 0x6C, 0x69, 0x4B, 0x57, 0x59, 0x6F, 0x79, 0x72, 0x66, 0x68, 0x6B, 0x2F, 0x57, 0x6B, 0x6C, 0x41, 0x4F, 0x5A, 0x75, 0x58, 0x43, 0x46, 0x74, 0x65, 0x5A, 0x49, 0x36, + 0x6F, 0x31, 0x51, 0x2F, 0x4E, 0x6E, 0x65, 0x7A, 0x47, 0x38, 0x48, 0x44, 0x74, 0x30, 0x4C, 0x63, 0x70, 0x32, 0x41, 0x4D, 0x42, 0x59, 0x48, 0x6C, 0x54, 0x38, 0x6F, 0x44, 0x76, 0x33, 0x46, 0x64, 0x55, 0x39, 0x54, 0x31, 0x6E, 0x53, 0x61, 0x74, + 0x43, 0x51, 0x75, 0x6A, 0x67, 0x4B, 0x52, 0x0A, 0x7A, 0x33, 0x62, 0x46, 0x6D, 0x78, 0x35, 0x56, 0x64, 0x4A, 0x78, 0x34, 0x49, 0x62, 0x48, 0x77, 0x4C, 0x66, 0x45, 0x4C, 0x6E, 0x38, 0x4C, 0x56, 0x6C, 0x68, 0x67, 0x66, 0x38, 0x46, 0x51, 0x69, + 0x65, 0x6F, 0x77, 0x48, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x66, 0x54, 0x42, 0x37, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x6E, 0x70, 0x51, 0x61, 0x78, 0x4C, 0x4B, 0x59, 0x4A, + 0x59, 0x4F, 0x37, 0x52, 0x0A, 0x6C, 0x2B, 0x6C, 0x77, 0x72, 0x72, 0x77, 0x37, 0x47, 0x57, 0x7A, 0x62, 0x49, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, + 0x2F, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4B, 0x65, 0x6C, 0x42, 0x72, 0x45, 0x73, 0x70, 0x67, 0x6C, 0x67, 0x37, 0x74, 0x47, 0x58, 0x36, 0x58, 0x43, 0x75, 0x76, 0x44, 0x73, + 0x5A, 0x0A, 0x62, 0x4E, 0x73, 0x68, 0x4D, 0x42, 0x67, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x41, 0x51, 0x52, 0x4D, 0x41, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4C, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x41, 0x47, 0x77, 0x4C, 0x51, 0x4D, 0x45, 0x41, 0x51, + 0x45, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x0A, 0x43, + 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x41, 0x6D, 0x64, 0x7A, 0x54, 0x62, 0x6C, 0x45, 0x69, 0x47, 0x4B, 0x6B, 0x47, 0x64, 0x4C, 0x44, 0x34, 0x47, 0x6B, 0x47, 0x44, 0x45, 0x6A, 0x4B, 0x77, 0x4C, 0x56, 0x4C, 0x67, 0x66, 0x75, + 0x58, 0x76, 0x54, 0x42, 0x7A, 0x6E, 0x6B, 0x2B, 0x6A, 0x35, 0x37, 0x73, 0x6A, 0x31, 0x4F, 0x37, 0x5A, 0x38, 0x6A, 0x76, 0x5A, 0x66, 0x7A, 0x61, 0x31, 0x7A, 0x76, 0x37, 0x76, 0x31, 0x41, 0x70, 0x74, 0x2B, 0x68, 0x0A, 0x6B, 0x36, 0x45, 0x4B, + 0x68, 0x71, 0x7A, 0x76, 0x49, 0x4E, 0x42, 0x35, 0x41, 0x62, 0x31, 0x34, 0x39, 0x78, 0x6E, 0x59, 0x4A, 0x44, 0x45, 0x30, 0x42, 0x41, 0x47, 0x6D, 0x75, 0x68, 0x57, 0x61, 0x77, 0x79, 0x66, 0x63, 0x32, 0x45, 0x38, 0x50, 0x7A, 0x42, 0x68, 0x6A, + 0x2F, 0x35, 0x6B, 0x50, 0x44, 0x70, 0x46, 0x72, 0x64, 0x52, 0x62, 0x68, 0x49, 0x66, 0x7A, 0x59, 0x4A, 0x73, 0x64, 0x48, 0x74, 0x36, 0x62, 0x50, 0x57, 0x48, 0x4A, 0x78, 0x66, 0x72, 0x72, 0x68, 0x0A, 0x54, 0x5A, 0x56, 0x48, 0x4F, 0x38, 0x6D, + 0x76, 0x62, 0x61, 0x47, 0x30, 0x77, 0x65, 0x79, 0x4A, 0x39, 0x72, 0x51, 0x50, 0x4F, 0x4C, 0x58, 0x69, 0x5A, 0x4E, 0x77, 0x6C, 0x7A, 0x36, 0x62, 0x62, 0x36, 0x35, 0x70, 0x63, 0x6D, 0x61, 0x48, 0x46, 0x43, 0x4E, 0x37, 0x39, 0x35, 0x74, 0x72, + 0x56, 0x31, 0x6C, 0x70, 0x46, 0x44, 0x4D, 0x53, 0x33, 0x77, 0x72, 0x55, 0x55, 0x37, 0x37, 0x51, 0x52, 0x2F, 0x77, 0x34, 0x56, 0x74, 0x66, 0x58, 0x31, 0x32, 0x38, 0x61, 0x39, 0x0A, 0x36, 0x31, 0x71, 0x6E, 0x38, 0x46, 0x59, 0x69, 0x71, 0x54, + 0x78, 0x6C, 0x56, 0x4D, 0x59, 0x56, 0x71, 0x4C, 0x32, 0x47, 0x6E, 0x73, 0x32, 0x44, 0x6C, 0x6D, 0x68, 0x36, 0x63, 0x59, 0x47, 0x4A, 0x34, 0x51, 0x76, 0x68, 0x36, 0x68, 0x45, 0x62, 0x61, 0x41, 0x6A, 0x4D, 0x61, 0x5A, 0x37, 0x73, 0x6E, 0x6B, + 0x47, 0x65, 0x52, 0x44, 0x49, 0x6D, 0x65, 0x75, 0x4B, 0x48, 0x43, 0x6E, 0x45, 0x39, 0x36, 0x2B, 0x52, 0x61, 0x70, 0x4E, 0x4C, 0x62, 0x78, 0x63, 0x33, 0x47, 0x0A, 0x33, 0x6D, 0x42, 0x2F, 0x75, 0x66, 0x4E, 0x50, 0x52, 0x4A, 0x4C, 0x76, 0x4B, + 0x72, 0x63, 0x59, 0x50, 0x71, 0x63, 0x5A, 0x32, 0x51, 0x74, 0x39, 0x73, 0x54, 0x64, 0x42, 0x51, 0x72, 0x43, 0x36, 0x59, 0x42, 0x33, 0x79, 0x2F, 0x67, 0x6B, 0x52, 0x73, 0x50, 0x43, 0x48, 0x65, 0x36, 0x65, 0x64, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x51, 0x75, 0x6F, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, + 0x31, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x59, 0x44, 0x43, 0x43, 0x41, 0x30, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x65, 0x46, 0x68, 0x66, 0x4C, + 0x71, 0x30, 0x73, 0x47, 0x55, 0x76, 0x6A, 0x4E, 0x77, 0x63, 0x31, 0x4E, 0x42, 0x4D, 0x6F, 0x74, 0x5A, 0x62, 0x55, 0x5A, 0x5A, 0x4D, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, + 0x51, 0x41, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x30, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x46, 0x46, 0x31, + 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x48, 0x6A, 0x41, 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x56, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, + 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x53, 0x42, 0x48, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x78, 0x4E, 0x7A, 0x49, + 0x33, 0x4E, 0x44, 0x52, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x78, 0x4E, 0x7A, 0x49, 0x33, 0x4E, 0x44, 0x52, 0x61, 0x4D, 0x45, 0x67, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, + 0x54, 0x41, 0x6B, 0x4A, 0x4E, 0x0A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, + 0x56, 0x6B, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x56, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, + 0x45, 0x67, 0x0A, 0x52, 0x7A, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, + 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x67, 0x76, 0x6C, 0x41, 0x51, 0x6A, 0x75, 0x6E, 0x79, 0x62, 0x45, 0x43, 0x30, 0x42, 0x4A, 0x79, 0x46, 0x75, 0x54, 0x48, 0x4B, 0x33, 0x43, 0x33, 0x6B, 0x45, 0x61, 0x6B, 0x45, 0x0A, + 0x50, 0x42, 0x74, 0x56, 0x77, 0x65, 0x64, 0x59, 0x4D, 0x42, 0x30, 0x6B, 0x74, 0x4D, 0x50, 0x76, 0x68, 0x64, 0x36, 0x4D, 0x4C, 0x4F, 0x48, 0x42, 0x50, 0x64, 0x2B, 0x43, 0x35, 0x6B, 0x2B, 0x74, 0x52, 0x34, 0x64, 0x73, 0x37, 0x46, 0x74, 0x4A, + 0x77, 0x55, 0x72, 0x56, 0x75, 0x34, 0x2F, 0x73, 0x68, 0x36, 0x78, 0x2F, 0x67, 0x70, 0x71, 0x47, 0x37, 0x44, 0x30, 0x44, 0x6D, 0x56, 0x49, 0x42, 0x30, 0x6A, 0x57, 0x65, 0x72, 0x4E, 0x72, 0x77, 0x55, 0x38, 0x6C, 0x6D, 0x0A, 0x50, 0x4E, 0x53, + 0x73, 0x41, 0x67, 0x48, 0x61, 0x4A, 0x4E, 0x4D, 0x37, 0x71, 0x41, 0x4A, 0x47, 0x72, 0x36, 0x51, 0x63, 0x34, 0x2F, 0x68, 0x7A, 0x57, 0x48, 0x61, 0x33, 0x39, 0x67, 0x36, 0x51, 0x44, 0x62, 0x58, 0x77, 0x7A, 0x38, 0x7A, 0x36, 0x2B, 0x63, 0x5A, + 0x4D, 0x35, 0x63, 0x4F, 0x47, 0x4D, 0x41, 0x71, 0x4E, 0x46, 0x33, 0x34, 0x31, 0x36, 0x38, 0x58, 0x66, 0x75, 0x77, 0x36, 0x63, 0x77, 0x49, 0x32, 0x48, 0x34, 0x34, 0x67, 0x34, 0x68, 0x57, 0x66, 0x36, 0x0A, 0x50, 0x73, 0x65, 0x72, 0x34, 0x42, + 0x4F, 0x63, 0x42, 0x52, 0x69, 0x59, 0x7A, 0x35, 0x50, 0x31, 0x73, 0x5A, 0x4B, 0x30, 0x2F, 0x43, 0x50, 0x54, 0x7A, 0x39, 0x58, 0x45, 0x4A, 0x30, 0x6E, 0x67, 0x6E, 0x6A, 0x79, 0x62, 0x43, 0x4B, 0x4F, 0x4C, 0x58, 0x53, 0x6F, 0x68, 0x34, 0x50, + 0x77, 0x35, 0x71, 0x6C, 0x50, 0x61, 0x66, 0x58, 0x37, 0x50, 0x47, 0x67, 0x6C, 0x54, 0x76, 0x46, 0x30, 0x46, 0x42, 0x4D, 0x2B, 0x68, 0x53, 0x6F, 0x2B, 0x4C, 0x64, 0x6F, 0x49, 0x4E, 0x0A, 0x6F, 0x66, 0x6A, 0x53, 0x78, 0x78, 0x52, 0x33, 0x57, + 0x35, 0x41, 0x32, 0x42, 0x34, 0x47, 0x62, 0x50, 0x67, 0x62, 0x36, 0x55, 0x6C, 0x35, 0x6A, 0x78, 0x61, 0x59, 0x41, 0x2F, 0x71, 0x58, 0x70, 0x55, 0x68, 0x74, 0x53, 0x74, 0x5A, 0x49, 0x35, 0x63, 0x67, 0x4D, 0x4A, 0x59, 0x72, 0x32, 0x77, 0x59, + 0x42, 0x5A, 0x75, 0x70, 0x74, 0x30, 0x6C, 0x77, 0x67, 0x4E, 0x6D, 0x33, 0x66, 0x4D, 0x45, 0x30, 0x55, 0x44, 0x69, 0x54, 0x6F, 0x75, 0x47, 0x39, 0x47, 0x2F, 0x6C, 0x0A, 0x67, 0x36, 0x41, 0x6E, 0x68, 0x46, 0x34, 0x45, 0x77, 0x66, 0x57, 0x51, + 0x76, 0x54, 0x41, 0x39, 0x78, 0x4F, 0x2B, 0x6F, 0x61, 0x62, 0x77, 0x34, 0x6D, 0x36, 0x53, 0x6B, 0x6C, 0x74, 0x46, 0x69, 0x32, 0x6D, 0x6E, 0x41, 0x41, 0x5A, 0x61, 0x75, 0x79, 0x38, 0x52, 0x52, 0x4E, 0x4F, 0x6F, 0x4D, 0x71, 0x76, 0x38, 0x68, + 0x6A, 0x6C, 0x6D, 0x50, 0x53, 0x6C, 0x7A, 0x6B, 0x59, 0x5A, 0x71, 0x6E, 0x30, 0x75, 0x6B, 0x71, 0x65, 0x49, 0x31, 0x52, 0x50, 0x54, 0x6F, 0x56, 0x0A, 0x37, 0x71, 0x4A, 0x5A, 0x6A, 0x71, 0x6C, 0x63, 0x33, 0x73, 0x58, 0x35, 0x6B, 0x43, 0x4C, + 0x6C, 0x69, 0x45, 0x56, 0x78, 0x33, 0x5A, 0x47, 0x5A, 0x62, 0x48, 0x71, 0x66, 0x50, 0x54, 0x32, 0x59, 0x66, 0x46, 0x37, 0x32, 0x76, 0x68, 0x5A, 0x6F, 0x6F, 0x46, 0x36, 0x75, 0x43, 0x79, 0x50, 0x38, 0x57, 0x67, 0x2B, 0x71, 0x49, 0x6E, 0x59, + 0x74, 0x79, 0x61, 0x45, 0x51, 0x48, 0x65, 0x54, 0x54, 0x52, 0x43, 0x4F, 0x51, 0x69, 0x4A, 0x2F, 0x47, 0x4B, 0x75, 0x62, 0x58, 0x0A, 0x39, 0x5A, 0x71, 0x7A, 0x57, 0x42, 0x34, 0x76, 0x4D, 0x49, 0x6B, 0x49, 0x47, 0x31, 0x53, 0x69, 0x74, 0x5A, + 0x67, 0x6A, 0x37, 0x41, 0x68, 0x33, 0x48, 0x4A, 0x56, 0x64, 0x59, 0x64, 0x48, 0x4C, 0x69, 0x5A, 0x78, 0x66, 0x6F, 0x6B, 0x71, 0x52, 0x6D, 0x75, 0x38, 0x68, 0x71, 0x6B, 0x6B, 0x57, 0x43, 0x4B, 0x69, 0x39, 0x59, 0x53, 0x67, 0x78, 0x79, 0x58, + 0x53, 0x74, 0x68, 0x66, 0x62, 0x5A, 0x78, 0x62, 0x47, 0x4C, 0x30, 0x65, 0x55, 0x51, 0x4D, 0x6B, 0x31, 0x66, 0x0A, 0x69, 0x79, 0x41, 0x36, 0x50, 0x45, 0x6B, 0x66, 0x4D, 0x34, 0x56, 0x5A, 0x44, 0x64, 0x76, 0x4C, 0x43, 0x58, 0x56, 0x44, 0x61, + 0x58, 0x50, 0x37, 0x61, 0x33, 0x46, 0x39, 0x38, 0x4E, 0x2F, 0x45, 0x54, 0x48, 0x33, 0x47, 0x6F, 0x79, 0x37, 0x49, 0x6C, 0x58, 0x6E, 0x4C, 0x63, 0x36, 0x4B, 0x4F, 0x54, 0x6B, 0x30, 0x6B, 0x2B, 0x31, 0x37, 0x6B, 0x42, 0x4C, 0x35, 0x79, 0x47, + 0x36, 0x59, 0x6E, 0x4C, 0x55, 0x6C, 0x61, 0x6D, 0x58, 0x72, 0x58, 0x58, 0x41, 0x6B, 0x67, 0x0A, 0x74, 0x33, 0x2B, 0x55, 0x75, 0x55, 0x2F, 0x78, 0x44, 0x52, 0x78, 0x65, 0x69, 0x45, 0x49, 0x62, 0x45, 0x62, 0x66, 0x6E, 0x6B, 0x64, 0x75, 0x65, + 0x62, 0x50, 0x52, 0x71, 0x33, 0x34, 0x77, 0x47, 0x6D, 0x41, 0x4F, 0x74, 0x7A, 0x43, 0x6A, 0x76, 0x70, 0x55, 0x66, 0x7A, 0x55, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, + 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, + 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x6F, 0x35, 0x66, 0x57, 0x38, 0x31, 0x36, 0x69, 0x45, 0x4F, 0x47, 0x72, 0x52, 0x5A, 0x38, 0x38, 0x46, 0x32, 0x51, 0x38, 0x37, 0x67, 0x46, 0x77, 0x6E, 0x4D, 0x77, + 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x42, 0x6A, 0x36, 0x57, 0x33, 0x58, 0x38, 0x50, 0x6E, 0x72, 0x48, 0x58, 0x33, + 0x66, 0x48, 0x79, 0x74, 0x2F, 0x50, 0x58, 0x38, 0x4D, 0x53, 0x78, 0x45, 0x42, 0x64, 0x31, 0x44, 0x4B, 0x71, 0x75, 0x47, 0x72, 0x58, 0x31, 0x52, 0x55, 0x56, 0x52, 0x70, 0x67, 0x6A, 0x70, 0x65, 0x61, 0x51, 0x57, 0x78, 0x69, 0x5A, 0x54, 0x4F, + 0x4F, 0x74, 0x51, 0x71, 0x4F, 0x43, 0x0A, 0x4D, 0x54, 0x61, 0x49, 0x7A, 0x65, 0x6E, 0x37, 0x78, 0x41, 0x53, 0x57, 0x53, 0x49, 0x73, 0x42, 0x78, 0x34, 0x30, 0x42, 0x7A, 0x31, 0x73, 0x7A, 0x42, 0x70, 0x5A, 0x47, 0x5A, 0x6E, 0x51, 0x64, 0x54, + 0x2B, 0x33, 0x42, 0x74, 0x72, 0x6D, 0x30, 0x44, 0x57, 0x48, 0x4D, 0x59, 0x33, 0x37, 0x58, 0x4C, 0x6E, 0x65, 0x4D, 0x6C, 0x68, 0x77, 0x71, 0x49, 0x32, 0x68, 0x72, 0x68, 0x56, 0x64, 0x32, 0x63, 0x44, 0x4D, 0x54, 0x2F, 0x75, 0x46, 0x50, 0x70, + 0x69, 0x4E, 0x33, 0x0A, 0x47, 0x50, 0x6F, 0x61, 0x6A, 0x4F, 0x69, 0x39, 0x5A, 0x63, 0x6E, 0x50, 0x50, 0x2F, 0x54, 0x4A, 0x46, 0x39, 0x7A, 0x72, 0x78, 0x37, 0x7A, 0x41, 0x42, 0x43, 0x34, 0x74, 0x52, 0x69, 0x39, 0x70, 0x5A, 0x73, 0x4D, 0x62, + 0x6A, 0x2F, 0x37, 0x73, 0x50, 0x74, 0x50, 0x4B, 0x6C, 0x4C, 0x39, 0x32, 0x43, 0x69, 0x55, 0x4E, 0x71, 0x58, 0x73, 0x43, 0x48, 0x4B, 0x6E, 0x51, 0x4F, 0x31, 0x38, 0x4C, 0x77, 0x49, 0x45, 0x36, 0x50, 0x57, 0x54, 0x68, 0x76, 0x36, 0x63, 0x74, + 0x0A, 0x54, 0x72, 0x31, 0x4E, 0x78, 0x4E, 0x67, 0x70, 0x78, 0x69, 0x49, 0x59, 0x30, 0x4D, 0x57, 0x73, 0x63, 0x67, 0x4B, 0x43, 0x50, 0x36, 0x6F, 0x36, 0x6F, 0x6A, 0x6F, 0x69, 0x6C, 0x7A, 0x48, 0x64, 0x43, 0x47, 0x50, 0x44, 0x64, 0x52, 0x53, + 0x35, 0x59, 0x43, 0x67, 0x74, 0x57, 0x32, 0x6A, 0x67, 0x46, 0x71, 0x6C, 0x6D, 0x67, 0x69, 0x4E, 0x52, 0x39, 0x65, 0x74, 0x54, 0x32, 0x44, 0x47, 0x62, 0x65, 0x2B, 0x6D, 0x33, 0x6E, 0x55, 0x76, 0x72, 0x69, 0x42, 0x62, 0x50, 0x0A, 0x2B, 0x56, + 0x30, 0x34, 0x69, 0x6B, 0x6B, 0x77, 0x6A, 0x2B, 0x33, 0x78, 0x36, 0x78, 0x6E, 0x30, 0x64, 0x78, 0x6F, 0x78, 0x47, 0x45, 0x31, 0x6E, 0x56, 0x47, 0x77, 0x76, 0x62, 0x32, 0x58, 0x35, 0x32, 0x7A, 0x33, 0x73, 0x49, 0x65, 0x78, 0x65, 0x39, 0x50, + 0x53, 0x4C, 0x79, 0x6D, 0x42, 0x6C, 0x56, 0x4E, 0x46, 0x78, 0x5A, 0x50, 0x54, 0x35, 0x70, 0x71, 0x4F, 0x42, 0x4D, 0x7A, 0x59, 0x7A, 0x63, 0x66, 0x43, 0x6B, 0x65, 0x46, 0x39, 0x4F, 0x72, 0x59, 0x4D, 0x68, 0x0A, 0x33, 0x6A, 0x52, 0x4A, 0x6A, + 0x65, 0x68, 0x5A, 0x72, 0x4A, 0x33, 0x79, 0x64, 0x6C, 0x6F, 0x32, 0x38, 0x68, 0x50, 0x30, 0x72, 0x2B, 0x41, 0x4A, 0x78, 0x32, 0x45, 0x71, 0x62, 0x50, 0x66, 0x67, 0x6E, 0x61, 0x36, 0x37, 0x68, 0x6B, 0x6F, 0x6F, 0x62, 0x79, 0x37, 0x75, 0x74, + 0x48, 0x6E, 0x4E, 0x6B, 0x44, 0x50, 0x44, 0x73, 0x33, 0x62, 0x36, 0x39, 0x66, 0x42, 0x73, 0x6E, 0x51, 0x47, 0x51, 0x2B, 0x70, 0x36, 0x51, 0x39, 0x70, 0x78, 0x79, 0x7A, 0x30, 0x66, 0x61, 0x0A, 0x77, 0x78, 0x2F, 0x6B, 0x4E, 0x53, 0x42, 0x54, + 0x38, 0x6C, 0x54, 0x52, 0x33, 0x32, 0x47, 0x44, 0x70, 0x67, 0x4C, 0x69, 0x4A, 0x54, 0x6A, 0x65, 0x68, 0x54, 0x49, 0x74, 0x58, 0x6E, 0x4F, 0x51, 0x55, 0x6C, 0x31, 0x43, 0x78, 0x4D, 0x34, 0x39, 0x53, 0x2B, 0x48, 0x35, 0x47, 0x59, 0x51, 0x64, + 0x31, 0x61, 0x4A, 0x51, 0x7A, 0x45, 0x48, 0x37, 0x51, 0x52, 0x54, 0x44, 0x76, 0x64, 0x62, 0x4A, 0x57, 0x71, 0x4E, 0x6A, 0x5A, 0x67, 0x4B, 0x41, 0x76, 0x51, 0x55, 0x36, 0x0A, 0x4F, 0x30, 0x65, 0x63, 0x37, 0x41, 0x41, 0x6D, 0x54, 0x50, 0x57, + 0x49, 0x55, 0x62, 0x2B, 0x6F, 0x49, 0x33, 0x38, 0x59, 0x42, 0x37, 0x41, 0x4C, 0x37, 0x59, 0x73, 0x6D, 0x6F, 0x57, 0x54, 0x54, 0x59, 0x55, 0x72, 0x72, 0x58, 0x4A, 0x2F, 0x65, 0x73, 0x36, 0x39, 0x6E, 0x41, 0x37, 0x4D, 0x66, 0x33, 0x57, 0x31, + 0x64, 0x61, 0x57, 0x68, 0x70, 0x71, 0x31, 0x34, 0x36, 0x37, 0x48, 0x78, 0x70, 0x76, 0x4D, 0x63, 0x37, 0x68, 0x55, 0x36, 0x65, 0x46, 0x62, 0x6D, 0x30, 0x0A, 0x46, 0x55, 0x2F, 0x44, 0x6C, 0x58, 0x70, 0x59, 0x31, 0x38, 0x6C, 0x73, 0x36, 0x57, + 0x79, 0x35, 0x38, 0x79, 0x6C, 0x6A, 0x58, 0x72, 0x51, 0x73, 0x38, 0x43, 0x30, 0x39, 0x37, 0x56, 0x70, 0x6C, 0x34, 0x4B, 0x6C, 0x62, 0x51, 0x4D, 0x4A, 0x49, 0x6D, 0x59, 0x46, 0x74, 0x6E, 0x68, 0x38, 0x47, 0x4B, 0x6A, 0x77, 0x53, 0x74, 0x49, + 0x73, 0x50, 0x6D, 0x36, 0x49, 0x6B, 0x38, 0x4B, 0x61, 0x4E, 0x31, 0x6E, 0x72, 0x67, 0x53, 0x37, 0x5A, 0x6B, 0x6C, 0x6D, 0x4F, 0x56, 0x0A, 0x68, 0x4D, 0x4A, 0x4B, 0x7A, 0x52, 0x77, 0x75, 0x4A, 0x49, 0x63, 0x7A, 0x59, 0x4F, 0x58, 0x44, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x51, 0x75, 0x6F, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, + 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, + 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x59, 0x44, 0x43, 0x43, 0x41, 0x30, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x52, + 0x46, 0x63, 0x30, 0x4A, 0x46, 0x75, 0x42, 0x69, 0x5A, 0x73, 0x31, 0x38, 0x73, 0x36, 0x34, 0x4B, 0x7A, 0x74, 0x62, 0x70, 0x79, 0x62, 0x77, 0x64, 0x53, 0x67, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, + 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x30, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, + 0x45, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x48, 0x6A, 0x41, 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x56, 0x46, 0x31, + 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x69, 0x42, 0x48, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x49, + 0x78, 0x4F, 0x44, 0x55, 0x35, 0x4D, 0x7A, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x78, 0x4F, 0x44, 0x55, 0x35, 0x4D, 0x7A, 0x4A, 0x61, 0x4D, 0x45, 0x67, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4A, 0x4E, 0x0A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x4D, 0x61, 0x57, + 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x56, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, + 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x0A, 0x52, 0x7A, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, + 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x68, 0x72, 0x69, 0x57, 0x79, 0x41, 0x52, 0x6A, 0x63, 0x56, 0x34, 0x67, 0x2F, 0x52, 0x75, 0x76, 0x35, 0x72, 0x2B, 0x4C, 0x72, 0x49, 0x33, 0x48, 0x69, 0x6D, + 0x74, 0x46, 0x68, 0x0A, 0x5A, 0x69, 0x46, 0x66, 0x71, 0x71, 0x38, 0x6E, 0x55, 0x65, 0x56, 0x75, 0x47, 0x78, 0x62, 0x55, 0x4C, 0x58, 0x31, 0x51, 0x73, 0x46, 0x4E, 0x33, 0x76, 0x58, 0x67, 0x36, 0x59, 0x4F, 0x4A, 0x6B, 0x41, 0x70, 0x74, 0x38, + 0x68, 0x70, 0x76, 0x57, 0x47, 0x6F, 0x36, 0x74, 0x2F, 0x78, 0x38, 0x56, 0x66, 0x39, 0x57, 0x56, 0x48, 0x68, 0x4C, 0x4C, 0x35, 0x68, 0x53, 0x45, 0x42, 0x4D, 0x48, 0x66, 0x4E, 0x72, 0x4D, 0x57, 0x6E, 0x34, 0x72, 0x6A, 0x79, 0x64, 0x75, 0x59, + 0x0A, 0x4E, 0x4D, 0x37, 0x59, 0x4D, 0x78, 0x63, 0x6F, 0x52, 0x76, 0x79, 0x6E, 0x79, 0x66, 0x44, 0x53, 0x74, 0x4E, 0x56, 0x4E, 0x43, 0x58, 0x4A, 0x4A, 0x2B, 0x66, 0x4B, 0x48, 0x34, 0x36, 0x6E, 0x61, 0x66, 0x61, 0x46, 0x39, 0x61, 0x37, 0x49, + 0x36, 0x4A, 0x61, 0x6C, 0x74, 0x55, 0x6B, 0x53, 0x73, 0x2B, 0x4C, 0x35, 0x75, 0x2B, 0x39, 0x79, 0x6D, 0x63, 0x35, 0x47, 0x51, 0x59, 0x61, 0x59, 0x44, 0x46, 0x43, 0x44, 0x79, 0x35, 0x34, 0x65, 0x6A, 0x69, 0x4B, 0x32, 0x74, 0x0A, 0x6F, 0x49, + 0x7A, 0x2F, 0x70, 0x67, 0x73, 0x6C, 0x55, 0x69, 0x58, 0x6E, 0x46, 0x67, 0x48, 0x56, 0x79, 0x37, 0x67, 0x31, 0x67, 0x51, 0x79, 0x6A, 0x4F, 0x2F, 0x44, 0x68, 0x34, 0x66, 0x78, 0x61, 0x58, 0x63, 0x36, 0x41, 0x63, 0x57, 0x33, 0x34, 0x53, 0x61, + 0x73, 0x2B, 0x4F, 0x37, 0x71, 0x34, 0x31, 0x34, 0x41, 0x42, 0x2B, 0x36, 0x58, 0x72, 0x57, 0x37, 0x50, 0x46, 0x58, 0x6D, 0x41, 0x71, 0x4D, 0x61, 0x43, 0x76, 0x4E, 0x2B, 0x67, 0x67, 0x4F, 0x70, 0x2B, 0x6F, 0x0A, 0x4D, 0x69, 0x77, 0x4D, 0x7A, + 0x41, 0x6B, 0x64, 0x30, 0x35, 0x36, 0x4F, 0x58, 0x62, 0x78, 0x4D, 0x6D, 0x4F, 0x37, 0x46, 0x47, 0x6D, 0x68, 0x37, 0x37, 0x46, 0x4F, 0x6D, 0x36, 0x52, 0x51, 0x31, 0x6F, 0x39, 0x2F, 0x4E, 0x67, 0x4A, 0x38, 0x4D, 0x53, 0x50, 0x73, 0x63, 0x39, + 0x50, 0x47, 0x2F, 0x53, 0x72, 0x6A, 0x36, 0x31, 0x59, 0x78, 0x78, 0x53, 0x73, 0x63, 0x66, 0x72, 0x66, 0x35, 0x42, 0x6D, 0x72, 0x4F, 0x44, 0x58, 0x66, 0x4B, 0x45, 0x56, 0x75, 0x2B, 0x6C, 0x0A, 0x56, 0x30, 0x50, 0x4F, 0x4B, 0x61, 0x32, 0x4D, + 0x71, 0x31, 0x57, 0x2F, 0x78, 0x50, 0x74, 0x62, 0x41, 0x64, 0x30, 0x6A, 0x49, 0x61, 0x46, 0x59, 0x41, 0x49, 0x37, 0x44, 0x30, 0x47, 0x6F, 0x54, 0x37, 0x52, 0x50, 0x6A, 0x45, 0x69, 0x75, 0x41, 0x33, 0x47, 0x66, 0x6D, 0x6C, 0x62, 0x4C, 0x4E, + 0x48, 0x69, 0x4A, 0x75, 0x4B, 0x76, 0x68, 0x42, 0x31, 0x50, 0x4C, 0x4B, 0x46, 0x41, 0x65, 0x4E, 0x69, 0x6C, 0x55, 0x53, 0x78, 0x6D, 0x6E, 0x31, 0x75, 0x49, 0x5A, 0x6F, 0x0A, 0x4C, 0x31, 0x4E, 0x65, 0x73, 0x4E, 0x4B, 0x71, 0x49, 0x63, 0x47, + 0x59, 0x35, 0x6A, 0x44, 0x6A, 0x5A, 0x31, 0x58, 0x48, 0x6D, 0x32, 0x36, 0x73, 0x47, 0x61, 0x68, 0x56, 0x70, 0x6B, 0x55, 0x47, 0x30, 0x43, 0x4D, 0x36, 0x32, 0x2B, 0x74, 0x6C, 0x58, 0x53, 0x6F, 0x52, 0x45, 0x66, 0x41, 0x37, 0x54, 0x38, 0x70, + 0x74, 0x39, 0x44, 0x54, 0x45, 0x63, 0x65, 0x54, 0x2F, 0x41, 0x46, 0x72, 0x32, 0x58, 0x4B, 0x34, 0x6A, 0x59, 0x49, 0x56, 0x7A, 0x38, 0x65, 0x51, 0x51, 0x0A, 0x73, 0x53, 0x57, 0x75, 0x31, 0x5A, 0x4B, 0x37, 0x45, 0x38, 0x45, 0x4D, 0x34, 0x44, + 0x6E, 0x61, 0x74, 0x44, 0x6C, 0x58, 0x74, 0x61, 0x73, 0x31, 0x71, 0x6E, 0x49, 0x68, 0x4F, 0x34, 0x4D, 0x31, 0x35, 0x7A, 0x48, 0x66, 0x65, 0x69, 0x46, 0x75, 0x75, 0x44, 0x49, 0x49, 0x66, 0x52, 0x30, 0x79, 0x6B, 0x52, 0x56, 0x4B, 0x59, 0x6E, + 0x4C, 0x50, 0x34, 0x33, 0x65, 0x68, 0x76, 0x4E, 0x55, 0x52, 0x47, 0x33, 0x59, 0x42, 0x5A, 0x77, 0x6A, 0x67, 0x51, 0x51, 0x76, 0x44, 0x0A, 0x36, 0x78, 0x56, 0x75, 0x2B, 0x4B, 0x51, 0x5A, 0x32, 0x61, 0x4B, 0x72, 0x72, 0x2B, 0x49, 0x6E, 0x55, + 0x6C, 0x59, 0x72, 0x41, 0x6F, 0x6F, 0x73, 0x46, 0x43, 0x54, 0x35, 0x76, 0x30, 0x49, 0x43, 0x76, 0x79, 0x62, 0x49, 0x78, 0x6F, 0x2F, 0x67, 0x62, 0x6A, 0x68, 0x39, 0x55, 0x79, 0x33, 0x6C, 0x37, 0x5A, 0x69, 0x7A, 0x6C, 0x57, 0x4E, 0x6F, 0x66, + 0x2F, 0x6B, 0x31, 0x39, 0x4E, 0x2B, 0x49, 0x78, 0x57, 0x41, 0x31, 0x6B, 0x73, 0x42, 0x38, 0x61, 0x52, 0x78, 0x68, 0x0A, 0x6C, 0x52, 0x62, 0x51, 0x36, 0x39, 0x34, 0x4C, 0x72, 0x7A, 0x34, 0x45, 0x45, 0x45, 0x56, 0x6C, 0x57, 0x46, 0x41, 0x34, + 0x72, 0x30, 0x6A, 0x79, 0x57, 0x62, 0x59, 0x57, 0x38, 0x6A, 0x77, 0x4E, 0x6B, 0x41, 0x4C, 0x47, 0x63, 0x43, 0x34, 0x42, 0x72, 0x54, 0x77, 0x56, 0x31, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, + 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, + 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x37, 0x65, 0x64, 0x76, 0x64, 0x6C, 0x71, 0x2F, 0x59, 0x4F, 0x78, 0x4A, 0x57, 0x38, 0x61, 0x6C, 0x64, 0x37, 0x74, 0x79, 0x46, 0x6E, 0x47, + 0x62, 0x78, 0x44, 0x30, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4A, 0x48, 0x66, 0x67, 0x44, 0x39, 0x44, 0x43, 0x58, + 0x35, 0x78, 0x77, 0x76, 0x66, 0x72, 0x73, 0x34, 0x69, 0x50, 0x34, 0x56, 0x47, 0x79, 0x76, 0x44, 0x31, 0x31, 0x2B, 0x53, 0x68, 0x64, 0x79, 0x4C, 0x79, 0x5A, 0x6D, 0x33, 0x74, 0x64, 0x71, 0x75, 0x58, 0x4B, 0x34, 0x51, 0x72, 0x33, 0x36, 0x4C, + 0x4C, 0x54, 0x6E, 0x39, 0x31, 0x6E, 0x4D, 0x58, 0x36, 0x36, 0x0A, 0x41, 0x61, 0x72, 0x48, 0x61, 0x6B, 0x45, 0x37, 0x6B, 0x4E, 0x51, 0x49, 0x58, 0x4C, 0x4A, 0x67, 0x61, 0x70, 0x44, 0x77, 0x79, 0x4D, 0x34, 0x44, 0x59, 0x76, 0x6D, 0x4C, 0x37, + 0x66, 0x74, 0x75, 0x4B, 0x74, 0x77, 0x47, 0x54, 0x54, 0x77, 0x70, 0x44, 0x34, 0x6B, 0x57, 0x69, 0x6C, 0x68, 0x4D, 0x53, 0x41, 0x2F, 0x6F, 0x68, 0x47, 0x48, 0x71, 0x50, 0x48, 0x4B, 0x6D, 0x64, 0x2B, 0x52, 0x43, 0x72, 0x6F, 0x69, 0x6A, 0x51, + 0x31, 0x68, 0x35, 0x66, 0x71, 0x37, 0x4B, 0x0A, 0x70, 0x56, 0x4D, 0x4E, 0x71, 0x54, 0x31, 0x77, 0x76, 0x53, 0x41, 0x5A, 0x59, 0x61, 0x52, 0x73, 0x4F, 0x50, 0x78, 0x44, 0x4D, 0x75, 0x48, 0x42, 0x52, 0x2F, 0x2F, 0x34, 0x37, 0x50, 0x45, 0x52, + 0x49, 0x6A, 0x4B, 0x57, 0x6E, 0x4D, 0x4C, 0x32, 0x57, 0x32, 0x6D, 0x57, 0x65, 0x79, 0x41, 0x4D, 0x51, 0x30, 0x47, 0x61, 0x57, 0x2F, 0x5A, 0x5A, 0x47, 0x59, 0x6A, 0x65, 0x56, 0x59, 0x67, 0x33, 0x55, 0x51, 0x74, 0x34, 0x58, 0x41, 0x6F, 0x65, + 0x6F, 0x30, 0x4C, 0x39, 0x0A, 0x78, 0x35, 0x32, 0x49, 0x44, 0x38, 0x44, 0x79, 0x65, 0x41, 0x49, 0x6B, 0x56, 0x4A, 0x4F, 0x76, 0x69, 0x59, 0x65, 0x49, 0x79, 0x55, 0x71, 0x41, 0x48, 0x65, 0x72, 0x51, 0x62, 0x6A, 0x35, 0x68, 0x4C, 0x6A, 0x61, + 0x37, 0x4E, 0x51, 0x34, 0x6E, 0x6C, 0x76, 0x31, 0x6D, 0x4E, 0x44, 0x74, 0x68, 0x63, 0x6E, 0x50, 0x78, 0x46, 0x6C, 0x78, 0x48, 0x42, 0x6C, 0x52, 0x4A, 0x41, 0x48, 0x70, 0x59, 0x45, 0x72, 0x41, 0x4B, 0x37, 0x34, 0x58, 0x39, 0x73, 0x62, 0x67, + 0x7A, 0x0A, 0x64, 0x57, 0x71, 0x54, 0x48, 0x42, 0x4C, 0x6D, 0x59, 0x46, 0x35, 0x76, 0x48, 0x58, 0x2F, 0x4A, 0x48, 0x79, 0x50, 0x4C, 0x68, 0x47, 0x47, 0x66, 0x48, 0x6F, 0x4A, 0x45, 0x2B, 0x56, 0x2B, 0x74, 0x59, 0x6C, 0x55, 0x6B, 0x6D, 0x6C, + 0x4B, 0x59, 0x37, 0x56, 0x48, 0x6E, 0x6F, 0x58, 0x36, 0x58, 0x4F, 0x75, 0x59, 0x76, 0x48, 0x78, 0x48, 0x61, 0x55, 0x34, 0x41, 0x73, 0x68, 0x5A, 0x36, 0x72, 0x4E, 0x52, 0x44, 0x62, 0x49, 0x6C, 0x39, 0x71, 0x78, 0x56, 0x36, 0x58, 0x0A, 0x55, + 0x2F, 0x49, 0x79, 0x41, 0x67, 0x6B, 0x77, 0x6F, 0x31, 0x6A, 0x77, 0x44, 0x51, 0x48, 0x56, 0x63, 0x73, 0x61, 0x78, 0x66, 0x47, 0x6C, 0x37, 0x77, 0x2F, 0x55, 0x32, 0x52, 0x63, 0x78, 0x68, 0x62, 0x6C, 0x35, 0x4D, 0x6C, 0x4D, 0x56, 0x65, 0x72, + 0x75, 0x67, 0x4F, 0x58, 0x6F, 0x75, 0x2F, 0x39, 0x38, 0x33, 0x67, 0x37, 0x61, 0x45, 0x4F, 0x47, 0x7A, 0x50, 0x75, 0x56, 0x42, 0x6A, 0x2B, 0x44, 0x37, 0x37, 0x76, 0x66, 0x6F, 0x52, 0x72, 0x51, 0x2B, 0x4E, 0x77, 0x0A, 0x6D, 0x4E, 0x74, 0x64, + 0x64, 0x62, 0x49, 0x4E, 0x57, 0x51, 0x65, 0x46, 0x46, 0x53, 0x4D, 0x35, 0x31, 0x76, 0x48, 0x66, 0x71, 0x53, 0x59, 0x50, 0x31, 0x6B, 0x6A, 0x48, 0x73, 0x36, 0x59, 0x69, 0x39, 0x54, 0x4D, 0x33, 0x57, 0x70, 0x56, 0x48, 0x6E, 0x33, 0x75, 0x36, + 0x47, 0x42, 0x56, 0x76, 0x2F, 0x39, 0x59, 0x55, 0x5A, 0x49, 0x4E, 0x4A, 0x30, 0x67, 0x70, 0x6E, 0x49, 0x64, 0x73, 0x50, 0x4E, 0x57, 0x4E, 0x67, 0x4B, 0x43, 0x4C, 0x6A, 0x73, 0x5A, 0x57, 0x44, 0x0A, 0x7A, 0x59, 0x57, 0x6D, 0x33, 0x53, 0x38, + 0x50, 0x35, 0x32, 0x64, 0x53, 0x62, 0x72, 0x73, 0x76, 0x68, 0x58, 0x7A, 0x31, 0x53, 0x6E, 0x50, 0x6E, 0x78, 0x54, 0x37, 0x41, 0x76, 0x53, 0x45, 0x53, 0x42, 0x54, 0x2F, 0x38, 0x74, 0x77, 0x4E, 0x4A, 0x41, 0x6C, 0x76, 0x49, 0x4A, 0x65, 0x62, + 0x69, 0x56, 0x44, 0x6A, 0x31, 0x65, 0x59, 0x65, 0x4D, 0x48, 0x56, 0x4F, 0x79, 0x54, 0x6F, 0x56, 0x37, 0x42, 0x6A, 0x6A, 0x48, 0x4C, 0x50, 0x6A, 0x34, 0x73, 0x48, 0x4B, 0x4E, 0x0A, 0x4A, 0x65, 0x56, 0x33, 0x55, 0x76, 0x51, 0x44, 0x48, 0x45, + 0x69, 0x6D, 0x55, 0x46, 0x2B, 0x49, 0x49, 0x44, 0x42, 0x75, 0x38, 0x6F, 0x4A, 0x44, 0x71, 0x7A, 0x32, 0x58, 0x68, 0x4F, 0x64, 0x54, 0x2B, 0x79, 0x48, 0x42, 0x54, 0x77, 0x38, 0x69, 0x6D, 0x6F, 0x61, 0x34, 0x57, 0x53, 0x72, 0x32, 0x52, 0x7A, + 0x30, 0x5A, 0x69, 0x43, 0x33, 0x6F, 0x68, 0x65, 0x47, 0x65, 0x37, 0x49, 0x55, 0x49, 0x61, 0x72, 0x46, 0x73, 0x4E, 0x4D, 0x6B, 0x64, 0x37, 0x45, 0x67, 0x72, 0x0A, 0x4F, 0x33, 0x6A, 0x74, 0x5A, 0x73, 0x53, 0x4F, 0x65, 0x57, 0x6D, 0x44, 0x33, + 0x6E, 0x2B, 0x4D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x51, 0x75, 0x6F, 0x56, 0x61, 0x64, 0x69, 0x73, 0x20, + 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x59, 0x44, 0x43, 0x43, 0x41, 0x30, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, + 0x67, 0x49, 0x55, 0x4C, 0x76, 0x57, 0x62, 0x41, 0x69, 0x69, 0x6E, 0x32, 0x33, 0x72, 0x2F, 0x31, 0x61, 0x4F, 0x70, 0x37, 0x72, 0x30, 0x44, 0x6F, 0x4D, 0x38, 0x53, 0x61, 0x68, 0x30, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, + 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x30, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x6F, 0x54, 0x45, 0x46, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x48, 0x6A, 0x41, 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, + 0x46, 0x56, 0x46, 0x31, 0x62, 0x31, 0x5A, 0x68, 0x5A, 0x47, 0x6C, 0x7A, 0x49, 0x46, 0x4A, 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x79, 0x42, 0x48, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x6A, 0x41, + 0x78, 0x4D, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x49, 0x32, 0x4D, 0x7A, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x49, 0x32, 0x4D, 0x7A, 0x4A, 0x61, 0x4D, 0x45, 0x67, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4A, 0x4E, 0x0A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, + 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x56, 0x52, 0x64, 0x57, 0x39, 0x57, 0x59, 0x57, 0x52, 0x70, 0x63, 0x79, 0x42, 0x53, 0x62, 0x32, + 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x4D, 0x67, 0x0A, 0x52, 0x7A, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, + 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x7A, 0x79, 0x77, 0x34, 0x51, 0x5A, 0x34, 0x37, 0x71, 0x46, 0x4A, 0x65, 0x6E, 0x4D, 0x69, 0x6F, 0x4B, 0x56, 0x6A, 0x5A, 0x2F, 0x61, + 0x45, 0x7A, 0x48, 0x73, 0x32, 0x38, 0x36, 0x0A, 0x49, 0x78, 0x53, 0x52, 0x2F, 0x78, 0x6C, 0x2F, 0x70, 0x63, 0x71, 0x73, 0x37, 0x72, 0x4E, 0x32, 0x6E, 0x58, 0x72, 0x70, 0x69, 0x78, 0x75, 0x72, 0x61, 0x7A, 0x48, 0x62, 0x2B, 0x67, 0x74, 0x54, + 0x54, 0x4B, 0x2F, 0x46, 0x70, 0x52, 0x70, 0x35, 0x50, 0x49, 0x70, 0x4D, 0x2F, 0x36, 0x7A, 0x66, 0x4A, 0x64, 0x35, 0x4F, 0x32, 0x59, 0x49, 0x79, 0x43, 0x30, 0x54, 0x65, 0x79, 0x74, 0x75, 0x4D, 0x72, 0x4B, 0x4E, 0x75, 0x46, 0x6F, 0x4D, 0x37, + 0x70, 0x6D, 0x52, 0x4C, 0x0A, 0x4D, 0x6F, 0x6E, 0x37, 0x46, 0x68, 0x59, 0x34, 0x66, 0x75, 0x74, 0x44, 0x34, 0x74, 0x4E, 0x30, 0x53, 0x73, 0x4A, 0x69, 0x43, 0x6E, 0x4D, 0x4B, 0x33, 0x55, 0x6D, 0x7A, 0x56, 0x39, 0x4B, 0x77, 0x43, 0x6F, 0x57, + 0x64, 0x63, 0x54, 0x7A, 0x65, 0x6F, 0x38, 0x76, 0x41, 0x4D, 0x76, 0x4D, 0x42, 0x4F, 0x53, 0x42, 0x44, 0x47, 0x7A, 0x58, 0x52, 0x55, 0x37, 0x4F, 0x78, 0x37, 0x73, 0x57, 0x54, 0x61, 0x59, 0x49, 0x2B, 0x46, 0x72, 0x55, 0x6F, 0x52, 0x71, 0x48, + 0x65, 0x0A, 0x36, 0x6F, 0x6B, 0x4A, 0x37, 0x55, 0x4F, 0x34, 0x42, 0x55, 0x61, 0x4B, 0x68, 0x76, 0x56, 0x5A, 0x52, 0x37, 0x34, 0x62, 0x62, 0x77, 0x45, 0x68, 0x45, 0x4C, 0x6E, 0x39, 0x71, 0x64, 0x49, 0x6F, 0x79, 0x68, 0x41, 0x35, 0x43, 0x63, + 0x6F, 0x54, 0x4E, 0x73, 0x2B, 0x63, 0x72, 0x61, 0x31, 0x41, 0x64, 0x48, 0x6B, 0x72, 0x41, 0x6A, 0x38, 0x30, 0x2F, 0x2F, 0x6F, 0x67, 0x61, 0x58, 0x33, 0x54, 0x37, 0x6D, 0x48, 0x31, 0x75, 0x72, 0x50, 0x6E, 0x4D, 0x4E, 0x41, 0x33, 0x0A, 0x49, + 0x34, 0x5A, 0x79, 0x59, 0x55, 0x55, 0x70, 0x53, 0x46, 0x6C, 0x6F, 0x62, 0x33, 0x65, 0x6D, 0x4C, 0x6F, 0x47, 0x2B, 0x42, 0x30, 0x31, 0x76, 0x72, 0x38, 0x37, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x46, 0x48, 0x41, 0x47, 0x6A, 0x78, 0x2B, 0x66, 0x2B, + 0x49, 0x64, 0x70, 0x73, 0x51, 0x37, 0x76, 0x77, 0x34, 0x6B, 0x5A, 0x36, 0x2B, 0x6F, 0x63, 0x59, 0x66, 0x78, 0x36, 0x62, 0x49, 0x72, 0x63, 0x31, 0x67, 0x4D, 0x4C, 0x6E, 0x69, 0x61, 0x36, 0x45, 0x74, 0x33, 0x55, 0x0A, 0x56, 0x44, 0x6D, 0x72, + 0x4A, 0x71, 0x4D, 0x7A, 0x36, 0x6E, 0x57, 0x42, 0x32, 0x69, 0x33, 0x4E, 0x44, 0x30, 0x2F, 0x6B, 0x41, 0x39, 0x48, 0x76, 0x46, 0x5A, 0x63, 0x62, 0x61, 0x35, 0x44, 0x46, 0x41, 0x70, 0x43, 0x54, 0x5A, 0x67, 0x49, 0x68, 0x73, 0x55, 0x66, 0x65, + 0x69, 0x35, 0x70, 0x4B, 0x67, 0x4C, 0x6C, 0x56, 0x6A, 0x37, 0x57, 0x69, 0x4C, 0x38, 0x44, 0x57, 0x4D, 0x32, 0x66, 0x61, 0x66, 0x73, 0x53, 0x6E, 0x74, 0x41, 0x52, 0x45, 0x36, 0x30, 0x66, 0x37, 0x0A, 0x35, 0x6C, 0x69, 0x35, 0x39, 0x77, 0x7A, + 0x77, 0x65, 0x79, 0x75, 0x78, 0x77, 0x48, 0x41, 0x70, 0x77, 0x30, 0x42, 0x69, 0x4C, 0x54, 0x74, 0x49, 0x61, 0x64, 0x77, 0x6A, 0x50, 0x45, 0x6A, 0x72, 0x65, 0x77, 0x6C, 0x35, 0x71, 0x57, 0x33, 0x61, 0x71, 0x44, 0x43, 0x59, 0x7A, 0x34, 0x42, + 0x79, 0x41, 0x34, 0x69, 0x6D, 0x57, 0x30, 0x61, 0x75, 0x63, 0x6E, 0x6C, 0x38, 0x43, 0x41, 0x4D, 0x68, 0x5A, 0x61, 0x36, 0x33, 0x34, 0x52, 0x79, 0x6C, 0x73, 0x53, 0x71, 0x69, 0x0A, 0x4D, 0x64, 0x35, 0x6D, 0x42, 0x50, 0x66, 0x41, 0x64, 0x4F, + 0x68, 0x78, 0x33, 0x76, 0x38, 0x39, 0x57, 0x63, 0x79, 0x57, 0x4A, 0x68, 0x4B, 0x4C, 0x68, 0x5A, 0x56, 0x58, 0x47, 0x71, 0x74, 0x72, 0x64, 0x51, 0x74, 0x45, 0x50, 0x52, 0x45, 0x6F, 0x50, 0x48, 0x74, 0x68, 0x74, 0x2B, 0x4B, 0x50, 0x5A, 0x30, + 0x2F, 0x6C, 0x37, 0x44, 0x78, 0x4D, 0x59, 0x49, 0x42, 0x70, 0x56, 0x7A, 0x67, 0x65, 0x41, 0x56, 0x75, 0x4E, 0x56, 0x65, 0x6A, 0x48, 0x33, 0x38, 0x44, 0x4D, 0x0A, 0x64, 0x79, 0x4D, 0x30, 0x53, 0x58, 0x56, 0x38, 0x39, 0x70, 0x67, 0x52, 0x36, + 0x79, 0x33, 0x65, 0x37, 0x55, 0x45, 0x75, 0x46, 0x41, 0x55, 0x43, 0x66, 0x2B, 0x44, 0x2B, 0x49, 0x4F, 0x73, 0x31, 0x35, 0x78, 0x47, 0x73, 0x49, 0x73, 0x35, 0x58, 0x50, 0x64, 0x37, 0x4A, 0x4D, 0x47, 0x30, 0x51, 0x41, 0x34, 0x58, 0x4E, 0x38, + 0x66, 0x2B, 0x4D, 0x46, 0x72, 0x58, 0x42, 0x73, 0x6A, 0x36, 0x49, 0x62, 0x47, 0x42, 0x2F, 0x6B, 0x45, 0x2B, 0x56, 0x39, 0x2F, 0x59, 0x74, 0x0A, 0x72, 0x51, 0x45, 0x35, 0x42, 0x77, 0x54, 0x36, 0x64, 0x59, 0x42, 0x39, 0x76, 0x30, 0x6C, 0x51, + 0x37, 0x65, 0x2F, 0x4A, 0x78, 0x48, 0x77, 0x63, 0x36, 0x34, 0x42, 0x2B, 0x32, 0x37, 0x62, 0x51, 0x33, 0x52, 0x50, 0x2B, 0x79, 0x64, 0x4F, 0x63, 0x31, 0x37, 0x4B, 0x58, 0x71, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, + 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, + 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x78, 0x68, 0x66, 0x51, 0x76, 0x4B, 0x6A, 0x71, 0x41, 0x6B, 0x50, 0x79, 0x47, 0x77, 0x61, 0x5A, 0x58, 0x53, 0x75, + 0x51, 0x49, 0x4C, 0x6E, 0x58, 0x6E, 0x4F, 0x51, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x44, 0x52, 0x68, 0x32, 0x56, + 0x61, 0x31, 0x45, 0x6F, 0x64, 0x56, 0x54, 0x64, 0x32, 0x6A, 0x4E, 0x54, 0x46, 0x47, 0x75, 0x36, 0x51, 0x48, 0x63, 0x72, 0x78, 0x66, 0x59, 0x57, 0x4C, 0x6F, 0x70, 0x66, 0x73, 0x4C, 0x4E, 0x37, 0x45, 0x38, 0x74, 0x72, 0x50, 0x36, 0x4B, 0x5A, + 0x31, 0x2F, 0x41, 0x76, 0x57, 0x6B, 0x79, 0x61, 0x69, 0x54, 0x74, 0x33, 0x70, 0x78, 0x0A, 0x4B, 0x47, 0x6D, 0x50, 0x63, 0x2B, 0x46, 0x53, 0x6B, 0x4E, 0x72, 0x56, 0x76, 0x6A, 0x72, 0x6C, 0x74, 0x33, 0x5A, 0x71, 0x56, 0x6F, 0x41, 0x68, 0x33, + 0x31, 0x33, 0x6D, 0x36, 0x54, 0x71, 0x65, 0x35, 0x54, 0x37, 0x32, 0x6F, 0x6D, 0x6E, 0x48, 0x4B, 0x67, 0x71, 0x77, 0x47, 0x45, 0x66, 0x63, 0x49, 0x48, 0x42, 0x39, 0x55, 0x71, 0x4D, 0x2B, 0x57, 0x58, 0x7A, 0x42, 0x75, 0x73, 0x6E, 0x49, 0x46, + 0x55, 0x42, 0x68, 0x79, 0x6E, 0x4C, 0x57, 0x63, 0x4B, 0x7A, 0x53, 0x0A, 0x74, 0x2F, 0x41, 0x63, 0x35, 0x49, 0x59, 0x70, 0x38, 0x4D, 0x37, 0x76, 0x61, 0x47, 0x50, 0x51, 0x74, 0x53, 0x43, 0x4B, 0x46, 0x57, 0x47, 0x61, 0x66, 0x6F, 0x61, 0x59, + 0x74, 0x4D, 0x6E, 0x43, 0x64, 0x76, 0x76, 0x4D, 0x75, 0x6A, 0x41, 0x57, 0x7A, 0x4B, 0x4E, 0x68, 0x78, 0x6E, 0x51, 0x54, 0x35, 0x57, 0x76, 0x76, 0x6F, 0x78, 0x58, 0x71, 0x41, 0x2F, 0x34, 0x54, 0x69, 0x32, 0x54, 0x6B, 0x30, 0x38, 0x48, 0x53, + 0x36, 0x49, 0x54, 0x37, 0x53, 0x64, 0x45, 0x51, 0x0A, 0x54, 0x58, 0x6C, 0x6D, 0x36, 0x36, 0x72, 0x39, 0x39, 0x49, 0x30, 0x78, 0x48, 0x6E, 0x41, 0x55, 0x72, 0x64, 0x7A, 0x65, 0x5A, 0x78, 0x4E, 0x4D, 0x67, 0x52, 0x56, 0x68, 0x76, 0x4C, 0x66, + 0x5A, 0x6B, 0x58, 0x64, 0x78, 0x47, 0x59, 0x46, 0x67, 0x75, 0x2F, 0x42, 0x59, 0x70, 0x62, 0x57, 0x63, 0x43, 0x2F, 0x65, 0x50, 0x49, 0x6C, 0x55, 0x6E, 0x77, 0x45, 0x73, 0x42, 0x62, 0x54, 0x75, 0x5A, 0x44, 0x64, 0x51, 0x64, 0x6D, 0x32, 0x4E, + 0x6E, 0x4C, 0x39, 0x44, 0x75, 0x0A, 0x44, 0x63, 0x70, 0x6D, 0x76, 0x4A, 0x52, 0x50, 0x70, 0x71, 0x33, 0x74, 0x2F, 0x4F, 0x35, 0x6A, 0x72, 0x46, 0x63, 0x2F, 0x5A, 0x53, 0x58, 0x50, 0x73, 0x6F, 0x61, 0x50, 0x30, 0x41, 0x6A, 0x2F, 0x75, 0x48, + 0x59, 0x55, 0x62, 0x74, 0x37, 0x6C, 0x4A, 0x2B, 0x79, 0x72, 0x65, 0x4C, 0x56, 0x54, 0x75, 0x62, 0x59, 0x2F, 0x36, 0x43, 0x44, 0x35, 0x30, 0x71, 0x69, 0x2B, 0x59, 0x55, 0x62, 0x4B, 0x68, 0x34, 0x79, 0x45, 0x38, 0x2F, 0x6E, 0x78, 0x6F, 0x47, + 0x69, 0x62, 0x0A, 0x49, 0x68, 0x36, 0x42, 0x4A, 0x70, 0x73, 0x51, 0x42, 0x4A, 0x46, 0x78, 0x77, 0x41, 0x59, 0x66, 0x33, 0x4B, 0x44, 0x54, 0x75, 0x56, 0x61, 0x6E, 0x34, 0x35, 0x67, 0x74, 0x66, 0x34, 0x4F, 0x64, 0x33, 0x34, 0x77, 0x72, 0x6E, + 0x44, 0x4B, 0x4F, 0x4D, 0x70, 0x54, 0x77, 0x41, 0x54, 0x77, 0x69, 0x4B, 0x70, 0x39, 0x44, 0x77, 0x69, 0x37, 0x44, 0x6D, 0x44, 0x6B, 0x48, 0x4F, 0x48, 0x76, 0x38, 0x58, 0x67, 0x42, 0x43, 0x48, 0x2F, 0x4D, 0x79, 0x4A, 0x6E, 0x6D, 0x44, 0x0A, + 0x68, 0x50, 0x62, 0x6C, 0x38, 0x4D, 0x46, 0x52, 0x45, 0x73, 0x41, 0x4C, 0x48, 0x67, 0x51, 0x6A, 0x44, 0x46, 0x53, 0x6C, 0x54, 0x43, 0x39, 0x4A, 0x78, 0x55, 0x72, 0x52, 0x74, 0x6D, 0x35, 0x67, 0x44, 0x57, 0x76, 0x38, 0x61, 0x34, 0x75, 0x46, + 0x4A, 0x47, 0x53, 0x33, 0x69, 0x51, 0x36, 0x72, 0x4A, 0x55, 0x64, 0x62, 0x50, 0x4D, 0x39, 0x2B, 0x53, 0x62, 0x33, 0x48, 0x36, 0x51, 0x72, 0x47, 0x32, 0x76, 0x64, 0x2B, 0x44, 0x68, 0x63, 0x49, 0x30, 0x30, 0x69, 0x58, 0x0A, 0x30, 0x48, 0x47, + 0x53, 0x38, 0x41, 0x38, 0x35, 0x50, 0x6A, 0x52, 0x71, 0x48, 0x48, 0x33, 0x59, 0x38, 0x69, 0x4B, 0x75, 0x75, 0x32, 0x6E, 0x30, 0x4D, 0x37, 0x53, 0x6D, 0x53, 0x46, 0x58, 0x52, 0x44, 0x77, 0x34, 0x6D, 0x36, 0x4F, 0x79, 0x32, 0x43, 0x79, 0x32, + 0x6E, 0x68, 0x54, 0x58, 0x4E, 0x2F, 0x56, 0x6E, 0x49, 0x6E, 0x39, 0x48, 0x4E, 0x50, 0x6C, 0x6F, 0x70, 0x4E, 0x4C, 0x6B, 0x39, 0x68, 0x4D, 0x36, 0x78, 0x5A, 0x64, 0x52, 0x5A, 0x6B, 0x5A, 0x46, 0x57, 0x0A, 0x64, 0x53, 0x48, 0x42, 0x64, 0x35, + 0x37, 0x35, 0x65, 0x75, 0x46, 0x67, 0x6E, 0x64, 0x4F, 0x74, 0x42, 0x42, 0x6A, 0x30, 0x66, 0x4F, 0x74, 0x65, 0x6B, 0x34, 0x39, 0x54, 0x53, 0x69, 0x49, 0x70, 0x2B, 0x45, 0x67, 0x72, 0x50, 0x6B, 0x32, 0x47, 0x72, 0x46, 0x74, 0x2F, 0x79, 0x77, + 0x61, 0x5A, 0x57, 0x57, 0x44, 0x59, 0x57, 0x47, 0x57, 0x56, 0x6A, 0x55, 0x54, 0x52, 0x39, 0x33, 0x39, 0x2B, 0x4A, 0x33, 0x39, 0x39, 0x72, 0x6F, 0x44, 0x31, 0x42, 0x30, 0x79, 0x32, 0x0A, 0x50, 0x70, 0x78, 0x78, 0x56, 0x4A, 0x6B, 0x45, 0x53, + 0x2F, 0x31, 0x59, 0x2B, 0x5A, 0x6A, 0x30, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, + 0x49, 0x49, 0x44, 0x6C, 0x6A, 0x43, 0x43, 0x41, 0x6E, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x35, 0x4D, 0x63, 0x4F, 0x74, 0x59, 0x35, 0x5A, 0x2B, 0x70, 0x6E, 0x49, 0x37, 0x2F, 0x44, 0x72, 0x35, 0x72, 0x30, 0x53, + 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, + 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x0A, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x44, 0x45, 0x78, 0x74, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x49, + 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x4D, 0x77, 0x4F, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x0A, 0x4D, 0x54, 0x45, 0x31, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, + 0x41, 0x77, 0x57, 0x6A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, + 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x0A, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, + 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, + 0x33, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x49, 0x77, 0x0A, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, + 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x44, 0x5A, 0x35, 0x79, 0x67, 0x76, 0x55, 0x6A, 0x38, 0x32, 0x63, 0x6B, 0x6D, 0x49, + 0x6B, 0x7A, 0x54, 0x7A, 0x2B, 0x47, 0x6F, 0x65, 0x4D, 0x56, 0x53, 0x41, 0x6E, 0x36, 0x31, 0x55, 0x51, 0x62, 0x56, 0x48, 0x0A, 0x33, 0x35, 0x61, 0x6F, 0x31, 0x4B, 0x2B, 0x41, 0x4C, 0x62, 0x6B, 0x4B, 0x7A, 0x33, 0x58, 0x39, 0x69, 0x61, 0x56, + 0x39, 0x4A, 0x50, 0x72, 0x6A, 0x49, 0x67, 0x77, 0x72, 0x76, 0x4A, 0x55, 0x58, 0x43, 0x7A, 0x4F, 0x2F, 0x47, 0x55, 0x31, 0x42, 0x42, 0x70, 0x41, 0x41, 0x76, 0x51, 0x78, 0x4E, 0x45, 0x50, 0x34, 0x48, 0x74, 0x65, 0x63, 0x63, 0x62, 0x69, 0x4A, + 0x56, 0x4D, 0x57, 0x57, 0x58, 0x76, 0x64, 0x4D, 0x58, 0x30, 0x68, 0x35, 0x69, 0x38, 0x39, 0x76, 0x71, 0x0A, 0x62, 0x46, 0x43, 0x4D, 0x50, 0x34, 0x51, 0x4D, 0x6C, 0x73, 0x2B, 0x33, 0x79, 0x77, 0x50, 0x67, 0x79, 0x6D, 0x32, 0x68, 0x46, 0x45, + 0x77, 0x62, 0x69, 0x64, 0x33, 0x74, 0x41, 0x4C, 0x42, 0x53, 0x66, 0x4B, 0x2B, 0x52, 0x62, 0x4C, 0x45, 0x34, 0x45, 0x39, 0x48, 0x70, 0x45, 0x67, 0x6A, 0x41, 0x41, 0x4C, 0x41, 0x63, 0x4B, 0x78, 0x48, 0x61, 0x64, 0x33, 0x41, 0x32, 0x6D, 0x36, + 0x37, 0x4F, 0x65, 0x59, 0x66, 0x63, 0x67, 0x6E, 0x44, 0x6D, 0x43, 0x58, 0x52, 0x77, 0x0A, 0x56, 0x57, 0x6D, 0x76, 0x6F, 0x32, 0x69, 0x66, 0x76, 0x39, 0x32, 0x32, 0x65, 0x62, 0x50, 0x79, 0x6E, 0x58, 0x41, 0x70, 0x56, 0x66, 0x53, 0x72, 0x2F, + 0x35, 0x56, 0x68, 0x38, 0x38, 0x6C, 0x41, 0x62, 0x78, 0x33, 0x52, 0x76, 0x70, 0x4F, 0x37, 0x30, 0x34, 0x67, 0x71, 0x75, 0x35, 0x32, 0x2F, 0x63, 0x6C, 0x70, 0x57, 0x63, 0x54, 0x73, 0x2F, 0x31, 0x50, 0x50, 0x52, 0x43, 0x76, 0x34, 0x6F, 0x37, + 0x36, 0x50, 0x75, 0x32, 0x5A, 0x6D, 0x76, 0x41, 0x39, 0x4F, 0x50, 0x0A, 0x59, 0x4C, 0x66, 0x79, 0x6B, 0x71, 0x47, 0x78, 0x76, 0x59, 0x6D, 0x4A, 0x48, 0x7A, 0x44, 0x4E, 0x77, 0x36, 0x59, 0x75, 0x59, 0x6A, 0x4F, 0x75, 0x46, 0x67, 0x4A, 0x33, + 0x52, 0x46, 0x72, 0x6E, 0x67, 0x51, 0x6F, 0x38, 0x70, 0x30, 0x51, 0x75, 0x65, 0x62, 0x67, 0x2F, 0x42, 0x4C, 0x78, 0x63, 0x6F, 0x49, 0x66, 0x68, 0x47, 0x36, 0x39, 0x52, 0x6A, 0x73, 0x33, 0x73, 0x4C, 0x50, 0x72, 0x34, 0x2F, 0x6D, 0x33, 0x77, + 0x4F, 0x6E, 0x79, 0x71, 0x69, 0x2B, 0x52, 0x6E, 0x0A, 0x6C, 0x54, 0x47, 0x4E, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, + 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, + 0x57, 0x42, 0x42, 0x54, 0x4F, 0x0A, 0x77, 0x30, 0x71, 0x35, 0x6D, 0x56, 0x58, 0x79, 0x75, 0x4E, 0x74, 0x67, 0x76, 0x36, 0x6C, 0x2B, 0x76, 0x56, 0x61, 0x31, 0x6C, 0x7A, 0x61, 0x6E, 0x31, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, + 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x79, 0x71, 0x56, 0x56, 0x6A, 0x4F, 0x50, 0x49, 0x51, 0x57, 0x35, 0x70, 0x4A, 0x36, 0x64, 0x31, 0x45, 0x65, 0x38, 0x38, 0x68, 0x6A, + 0x5A, 0x76, 0x0A, 0x30, 0x70, 0x33, 0x47, 0x65, 0x44, 0x67, 0x64, 0x61, 0x5A, 0x61, 0x69, 0x6B, 0x6D, 0x6B, 0x75, 0x4F, 0x47, 0x79, 0x62, 0x66, 0x51, 0x54, 0x55, 0x69, 0x61, 0x57, 0x78, 0x4D, 0x54, 0x65, 0x4B, 0x79, 0x53, 0x48, 0x4D, 0x71, + 0x32, 0x7A, 0x4E, 0x69, 0x78, 0x79, 0x61, 0x31, 0x72, 0x39, 0x49, 0x30, 0x6A, 0x4A, 0x6D, 0x77, 0x59, 0x72, 0x41, 0x38, 0x79, 0x38, 0x36, 0x37, 0x38, 0x44, 0x6A, 0x31, 0x4A, 0x47, 0x47, 0x30, 0x56, 0x44, 0x6A, 0x41, 0x39, 0x74, 0x7A, 0x0A, + 0x64, 0x32, 0x39, 0x4B, 0x4F, 0x56, 0x50, 0x74, 0x33, 0x69, 0x62, 0x48, 0x74, 0x58, 0x32, 0x76, 0x4B, 0x30, 0x4C, 0x52, 0x64, 0x57, 0x4C, 0x6A, 0x53, 0x69, 0x73, 0x43, 0x78, 0x31, 0x42, 0x4C, 0x34, 0x47, 0x6E, 0x69, 0x6C, 0x6D, 0x77, 0x4F, + 0x52, 0x47, 0x59, 0x51, 0x52, 0x49, 0x2B, 0x74, 0x42, 0x65, 0x76, 0x34, 0x65, 0x61, 0x79, 0x6D, 0x47, 0x2B, 0x67, 0x33, 0x4E, 0x4A, 0x31, 0x54, 0x79, 0x57, 0x47, 0x71, 0x6F, 0x6C, 0x4B, 0x76, 0x53, 0x6E, 0x41, 0x57, 0x0A, 0x68, 0x73, 0x49, + 0x36, 0x79, 0x4C, 0x45, 0x54, 0x63, 0x44, 0x62, 0x59, 0x7A, 0x2B, 0x37, 0x30, 0x43, 0x6A, 0x54, 0x56, 0x57, 0x30, 0x7A, 0x39, 0x42, 0x35, 0x79, 0x69, 0x75, 0x74, 0x6B, 0x42, 0x63, 0x6C, 0x7A, 0x7A, 0x54, 0x63, 0x48, 0x64, 0x44, 0x72, 0x45, + 0x63, 0x44, 0x63, 0x52, 0x6A, 0x76, 0x71, 0x33, 0x30, 0x46, 0x50, 0x75, 0x4A, 0x37, 0x4B, 0x4A, 0x42, 0x44, 0x6B, 0x7A, 0x4D, 0x79, 0x46, 0x64, 0x41, 0x30, 0x47, 0x34, 0x44, 0x71, 0x73, 0x30, 0x4D, 0x0A, 0x6A, 0x6F, 0x6D, 0x5A, 0x6D, 0x57, + 0x7A, 0x77, 0x50, 0x44, 0x43, 0x76, 0x4F, 0x4E, 0x39, 0x76, 0x76, 0x4B, 0x4F, 0x2B, 0x4B, 0x53, 0x41, 0x6E, 0x71, 0x33, 0x54, 0x2F, 0x45, 0x79, 0x4A, 0x34, 0x33, 0x70, 0x64, 0x53, 0x56, 0x52, 0x36, 0x44, 0x74, 0x56, 0x51, 0x67, 0x41, 0x2B, + 0x36, 0x75, 0x77, 0x45, 0x39, 0x57, 0x33, 0x6A, 0x66, 0x4D, 0x77, 0x33, 0x2B, 0x71, 0x42, 0x43, 0x65, 0x37, 0x30, 0x33, 0x65, 0x34, 0x59, 0x74, 0x73, 0x58, 0x66, 0x4A, 0x77, 0x6F, 0x0A, 0x49, 0x68, 0x4E, 0x7A, 0x62, 0x4D, 0x38, 0x6D, 0x39, + 0x59, 0x6F, 0x70, 0x35, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, + 0x49, 0x49, 0x43, 0x52, 0x6A, 0x43, 0x43, 0x41, 0x63, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x36, 0x46, 0x61, 0x2B, 0x68, 0x33, 0x66, 0x6F, 0x4C, 0x56, 0x4A, 0x52, 0x4B, 0x2F, 0x4E, 0x4A, 0x4B, 0x42, 0x73, 0x37, + 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x56, + 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, + 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, + 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x4D, 0x77, 0x48, 0x68, 0x63, + 0x4E, 0x4D, 0x54, 0x4D, 0x77, 0x4F, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x31, 0x0A, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, + 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, + 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x0A, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, + 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x42, 0x63, 0x33, 0x4E, 0x31, 0x63, + 0x6D, 0x56, 0x6B, 0x49, 0x45, 0x6C, 0x45, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x4D, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x0A, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, + 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, 0x5A, 0x35, 0x37, 0x79, 0x73, 0x52, 0x47, 0x58, 0x74, 0x7A, 0x62, 0x67, 0x2F, 0x57, 0x50, 0x75, 0x4E, 0x73, 0x56, 0x65, 0x70, 0x52, 0x43, 0x30, 0x46, 0x46, 0x66, 0x4C, 0x76, + 0x43, 0x2F, 0x38, 0x51, 0x64, 0x4A, 0x2B, 0x31, 0x59, 0x6C, 0x4A, 0x66, 0x5A, 0x6E, 0x34, 0x66, 0x35, 0x64, 0x77, 0x62, 0x0A, 0x52, 0x58, 0x6B, 0x4C, 0x7A, 0x4D, 0x5A, 0x54, 0x43, 0x70, 0x32, 0x4E, 0x58, 0x51, 0x4C, 0x5A, 0x71, 0x56, 0x6E, + 0x65, 0x41, 0x6C, 0x72, 0x32, 0x6C, 0x53, 0x6F, 0x4F, 0x6A, 0x54, 0x68, 0x4B, 0x69, 0x6B, 0x6E, 0x47, 0x76, 0x4D, 0x59, 0x44, 0x4F, 0x41, 0x64, 0x66, 0x56, 0x64, 0x70, 0x2B, 0x43, 0x57, 0x37, 0x69, 0x66, 0x31, 0x37, 0x51, 0x52, 0x53, 0x41, + 0x50, 0x57, 0x58, 0x59, 0x51, 0x31, 0x71, 0x41, 0x6B, 0x38, 0x43, 0x33, 0x65, 0x4E, 0x76, 0x4A, 0x73, 0x0A, 0x4B, 0x54, 0x6D, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, + 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, + 0x51, 0x57, 0x42, 0x42, 0x54, 0x4C, 0x30, 0x4C, 0x32, 0x70, 0x34, 0x5A, 0x67, 0x46, 0x0A, 0x55, 0x61, 0x46, 0x4E, 0x4E, 0x36, 0x4B, 0x44, 0x65, 0x63, 0x36, 0x4E, 0x48, 0x53, 0x72, 0x6B, 0x68, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, + 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6E, 0x41, 0x44, 0x42, 0x6B, 0x41, 0x6A, 0x41, 0x6C, 0x70, 0x49, 0x46, 0x46, 0x41, 0x6D, 0x73, 0x53, 0x53, 0x33, 0x56, 0x30, 0x54, 0x38, 0x67, 0x6A, 0x34, 0x33, 0x44, 0x79, 0x64, + 0x58, 0x4C, 0x65, 0x66, 0x49, 0x6E, 0x77, 0x7A, 0x35, 0x46, 0x79, 0x0A, 0x59, 0x5A, 0x35, 0x65, 0x45, 0x4A, 0x4A, 0x5A, 0x56, 0x72, 0x6D, 0x44, 0x78, 0x78, 0x44, 0x6E, 0x4F, 0x4F, 0x6C, 0x59, 0x4A, 0x6A, 0x5A, 0x39, 0x31, 0x65, 0x51, 0x30, + 0x68, 0x6A, 0x6B, 0x43, 0x4D, 0x48, 0x77, 0x32, 0x55, 0x2F, 0x41, 0x77, 0x35, 0x57, 0x4A, 0x6A, 0x4F, 0x70, 0x6E, 0x69, 0x74, 0x71, 0x4D, 0x37, 0x6D, 0x7A, 0x54, 0x36, 0x48, 0x74, 0x6F, 0x51, 0x6B, 0x6E, 0x46, 0x65, 0x6B, 0x52, 0x4F, 0x6E, + 0x33, 0x61, 0x52, 0x75, 0x6B, 0x73, 0x77, 0x79, 0x0A, 0x31, 0x76, 0x55, 0x68, 0x5A, 0x73, 0x63, 0x76, 0x36, 0x70, 0x5A, 0x6A, 0x61, 0x6D, 0x56, 0x46, 0x6B, 0x70, 0x55, 0x42, 0x74, 0x41, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, + 0x74, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x6A, 0x6A, 0x43, 0x43, 0x41, 0x6E, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x41, 0x7A, 0x72, + 0x78, 0x35, 0x71, 0x63, 0x52, 0x71, 0x61, 0x43, 0x37, 0x4B, 0x47, 0x53, 0x78, 0x48, 0x51, 0x6E, 0x36, 0x35, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, + 0x68, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, + 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, + 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x41, 0x77, 0x0A, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x64, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, + 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x48, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x7A, 0x41, 0x34, 0x4D, 0x44, 0x45, 0x78, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4F, + 0x44, 0x41, 0x78, 0x4D, 0x54, 0x55, 0x78, 0x0A, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x47, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x55, 0x77, + 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x78, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, + 0x45, 0x48, 0x64, 0x33, 0x0A, 0x64, 0x79, 0x35, 0x6B, 0x61, 0x57, 0x64, 0x70, 0x59, 0x32, 0x56, 0x79, 0x64, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x30, 0x52, + 0x70, 0x5A, 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x63, 0x79, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, + 0x71, 0x0A, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x75, 0x7A, 0x66, 0x4E, 0x4E, 0x4E, + 0x78, 0x37, 0x61, 0x38, 0x6D, 0x79, 0x61, 0x4A, 0x43, 0x74, 0x53, 0x6E, 0x58, 0x2F, 0x52, 0x72, 0x6F, 0x68, 0x43, 0x67, 0x69, 0x4E, 0x39, 0x52, 0x6C, 0x55, 0x79, 0x66, 0x75, 0x49, 0x32, 0x2F, 0x4F, 0x75, 0x38, 0x6A, 0x71, 0x4A, 0x0A, 0x6B, + 0x54, 0x78, 0x36, 0x35, 0x71, 0x73, 0x47, 0x47, 0x6D, 0x76, 0x50, 0x72, 0x43, 0x33, 0x6F, 0x58, 0x67, 0x6B, 0x6B, 0x52, 0x4C, 0x70, 0x69, 0x6D, 0x6E, 0x37, 0x57, 0x6F, 0x36, 0x68, 0x2B, 0x34, 0x46, 0x52, 0x31, 0x49, 0x41, 0x57, 0x73, 0x55, + 0x4C, 0x65, 0x63, 0x59, 0x78, 0x70, 0x73, 0x4D, 0x4E, 0x7A, 0x61, 0x48, 0x78, 0x6D, 0x78, 0x31, 0x78, 0x37, 0x65, 0x2F, 0x64, 0x66, 0x67, 0x79, 0x35, 0x53, 0x44, 0x4E, 0x36, 0x37, 0x73, 0x48, 0x30, 0x4E, 0x4F, 0x0A, 0x33, 0x58, 0x73, 0x73, + 0x30, 0x72, 0x30, 0x75, 0x70, 0x53, 0x2F, 0x6B, 0x71, 0x62, 0x69, 0x74, 0x4F, 0x74, 0x53, 0x5A, 0x70, 0x4C, 0x59, 0x6C, 0x36, 0x5A, 0x74, 0x72, 0x41, 0x47, 0x43, 0x53, 0x59, 0x50, 0x39, 0x50, 0x49, 0x55, 0x6B, 0x59, 0x39, 0x32, 0x65, 0x51, + 0x71, 0x32, 0x45, 0x47, 0x6E, 0x49, 0x2F, 0x79, 0x75, 0x75, 0x6D, 0x30, 0x36, 0x5A, 0x49, 0x79, 0x61, 0x37, 0x58, 0x7A, 0x56, 0x2B, 0x68, 0x64, 0x47, 0x38, 0x32, 0x4D, 0x48, 0x61, 0x75, 0x56, 0x0A, 0x42, 0x4A, 0x56, 0x4A, 0x38, 0x7A, 0x55, + 0x74, 0x6C, 0x75, 0x4E, 0x4A, 0x62, 0x64, 0x31, 0x33, 0x34, 0x2F, 0x74, 0x4A, 0x53, 0x37, 0x53, 0x73, 0x56, 0x51, 0x65, 0x70, 0x6A, 0x35, 0x57, 0x7A, 0x74, 0x43, 0x4F, 0x37, 0x54, 0x47, 0x31, 0x46, 0x38, 0x50, 0x61, 0x70, 0x73, 0x70, 0x55, + 0x77, 0x74, 0x50, 0x31, 0x4D, 0x56, 0x59, 0x77, 0x6E, 0x53, 0x6C, 0x63, 0x55, 0x66, 0x49, 0x4B, 0x64, 0x7A, 0x58, 0x4F, 0x53, 0x30, 0x78, 0x5A, 0x4B, 0x42, 0x67, 0x79, 0x4D, 0x0A, 0x55, 0x4E, 0x47, 0x50, 0x48, 0x67, 0x6D, 0x2B, 0x46, 0x36, + 0x48, 0x6D, 0x49, 0x63, 0x72, 0x39, 0x67, 0x2B, 0x55, 0x51, 0x76, 0x49, 0x4F, 0x6C, 0x43, 0x73, 0x52, 0x6E, 0x4B, 0x50, 0x5A, 0x7A, 0x46, 0x42, 0x51, 0x39, 0x52, 0x6E, 0x62, 0x44, 0x68, 0x78, 0x53, 0x4A, 0x49, 0x54, 0x52, 0x4E, 0x72, 0x77, + 0x39, 0x46, 0x44, 0x4B, 0x5A, 0x4A, 0x6F, 0x62, 0x71, 0x37, 0x6E, 0x4D, 0x57, 0x78, 0x4D, 0x34, 0x4D, 0x70, 0x68, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0A, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, + 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x64, 0x42, + 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x54, 0x69, 0x4A, 0x55, 0x49, 0x42, 0x69, 0x56, 0x35, 0x75, 0x4E, 0x75, 0x0A, 0x35, 0x67, 0x2F, 0x36, 0x2B, 0x72, 0x6B, 0x53, 0x37, 0x51, 0x59, 0x58, 0x6A, 0x7A, 0x6B, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x47, 0x42, 0x6E, 0x4B, 0x4A, 0x52, 0x76, 0x44, 0x6B, 0x68, 0x6A, 0x36, 0x7A, 0x48, 0x64, + 0x36, 0x6D, 0x63, 0x59, 0x31, 0x59, 0x6C, 0x39, 0x50, 0x4D, 0x57, 0x4C, 0x53, 0x6E, 0x2F, 0x70, 0x76, 0x74, 0x73, 0x72, 0x0A, 0x46, 0x39, 0x2B, 0x77, 0x58, 0x33, 0x4E, 0x33, 0x4B, 0x6A, 0x49, 0x54, 0x4F, 0x59, 0x46, 0x6E, 0x51, 0x6F, 0x51, + 0x6A, 0x38, 0x6B, 0x56, 0x6E, 0x4E, 0x65, 0x79, 0x49, 0x76, 0x2F, 0x69, 0x50, 0x73, 0x47, 0x45, 0x4D, 0x4E, 0x4B, 0x53, 0x75, 0x49, 0x45, 0x79, 0x45, 0x78, 0x74, 0x76, 0x34, 0x4E, 0x65, 0x46, 0x32, 0x32, 0x64, 0x2B, 0x6D, 0x51, 0x72, 0x76, + 0x48, 0x52, 0x41, 0x69, 0x47, 0x66, 0x7A, 0x5A, 0x30, 0x4A, 0x46, 0x72, 0x61, 0x62, 0x41, 0x30, 0x55, 0x0A, 0x57, 0x54, 0x57, 0x39, 0x38, 0x6B, 0x6E, 0x64, 0x74, 0x68, 0x2F, 0x4A, 0x73, 0x77, 0x31, 0x48, 0x4B, 0x6A, 0x32, 0x5A, 0x4C, 0x37, + 0x74, 0x63, 0x75, 0x37, 0x58, 0x55, 0x49, 0x4F, 0x47, 0x5A, 0x58, 0x31, 0x4E, 0x47, 0x46, 0x64, 0x74, 0x6F, 0x6D, 0x2F, 0x44, 0x7A, 0x4D, 0x4E, 0x55, 0x2B, 0x4D, 0x65, 0x4B, 0x4E, 0x68, 0x4A, 0x37, 0x6A, 0x69, 0x74, 0x72, 0x61, 0x6C, 0x6A, + 0x34, 0x31, 0x45, 0x36, 0x56, 0x66, 0x38, 0x50, 0x6C, 0x77, 0x55, 0x48, 0x42, 0x48, 0x0A, 0x51, 0x52, 0x46, 0x58, 0x47, 0x55, 0x37, 0x41, 0x6A, 0x36, 0x34, 0x47, 0x78, 0x4A, 0x55, 0x54, 0x46, 0x79, 0x38, 0x62, 0x4A, 0x5A, 0x39, 0x31, 0x38, + 0x72, 0x47, 0x4F, 0x6D, 0x61, 0x46, 0x76, 0x45, 0x37, 0x46, 0x42, 0x63, 0x66, 0x36, 0x49, 0x4B, 0x73, 0x68, 0x50, 0x45, 0x43, 0x42, 0x56, 0x31, 0x2F, 0x4D, 0x55, 0x52, 0x65, 0x58, 0x67, 0x52, 0x50, 0x54, 0x71, 0x68, 0x35, 0x55, 0x79, 0x6B, + 0x77, 0x37, 0x2B, 0x55, 0x30, 0x62, 0x36, 0x4C, 0x4A, 0x33, 0x2F, 0x0A, 0x69, 0x79, 0x4B, 0x35, 0x53, 0x39, 0x6B, 0x4A, 0x52, 0x61, 0x54, 0x65, 0x70, 0x4C, 0x69, 0x61, 0x57, 0x4E, 0x30, 0x62, 0x66, 0x56, 0x4B, 0x66, 0x6A, 0x6C, 0x6C, 0x44, + 0x69, 0x49, 0x47, 0x6B, 0x6E, 0x69, 0x62, 0x56, 0x62, 0x36, 0x33, 0x64, 0x44, 0x63, 0x59, 0x33, 0x66, 0x65, 0x30, 0x44, 0x6B, 0x68, 0x76, 0x6C, 0x64, 0x31, 0x39, 0x32, 0x37, 0x6A, 0x79, 0x4E, 0x78, 0x46, 0x31, 0x57, 0x57, 0x36, 0x4C, 0x5A, + 0x5A, 0x6D, 0x36, 0x7A, 0x4E, 0x54, 0x66, 0x6C, 0x0A, 0x4D, 0x72, 0x59, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, + 0x43, 0x50, 0x7A, 0x43, 0x43, 0x41, 0x63, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x42, 0x56, 0x56, 0x57, 0x76, 0x50, 0x4A, 0x65, 0x70, 0x44, 0x55, 0x31, 0x77, 0x36, 0x51, 0x50, 0x31, 0x61, 0x74, 0x46, 0x63, 0x6A, 0x41, + 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x68, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, + 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, + 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x64, 0x45, 0x61, + 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x48, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x7A, 0x41, 0x34, 0x4D, + 0x44, 0x45, 0x78, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4F, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x55, 0x78, 0x4D, 0x6A, 0x41, 0x77, 0x0A, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x47, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x78, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x4A, + 0x62, 0x6D, 0x4D, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x45, 0x48, 0x64, 0x33, 0x64, 0x79, 0x35, 0x6B, 0x0A, 0x61, 0x57, 0x64, 0x70, 0x59, 0x32, 0x56, 0x79, 0x64, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, + 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x30, 0x52, 0x70, 0x5A, 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, + 0x30, 0x49, 0x45, 0x63, 0x7A, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x33, 0x61, + 0x66, 0x5A, 0x75, 0x34, 0x71, 0x34, 0x43, 0x2F, 0x73, 0x4C, 0x66, 0x79, 0x48, 0x53, 0x38, 0x4C, 0x36, 0x2B, 0x63, 0x2F, 0x4D, 0x7A, 0x58, 0x52, 0x71, 0x38, 0x4E, 0x4F, 0x72, 0x65, 0x78, 0x70, 0x75, 0x38, 0x30, 0x4A, 0x58, 0x32, 0x38, 0x4D, + 0x7A, 0x51, 0x43, 0x37, 0x70, 0x68, 0x57, 0x31, 0x46, 0x47, 0x66, 0x70, 0x34, 0x74, 0x6E, 0x2B, 0x36, 0x4F, 0x0A, 0x59, 0x77, 0x77, 0x58, 0x37, 0x41, 0x64, 0x77, 0x39, 0x63, 0x2B, 0x45, 0x4C, 0x6B, 0x43, 0x44, 0x6E, 0x4F, 0x67, 0x2F, 0x51, + 0x57, 0x30, 0x37, 0x72, 0x64, 0x4F, 0x6B, 0x46, 0x46, 0x6B, 0x32, 0x65, 0x4A, 0x30, 0x44, 0x51, 0x2B, 0x34, 0x51, 0x45, 0x32, 0x78, 0x79, 0x33, 0x71, 0x36, 0x49, 0x70, 0x36, 0x46, 0x72, 0x74, 0x55, 0x50, 0x4F, 0x5A, 0x39, 0x77, 0x6A, 0x2F, + 0x77, 0x4D, 0x63, 0x6F, 0x2B, 0x49, 0x2B, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, + 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x73, 0x39, 0x74, 0x49, 0x70, 0x50, 0x6D, 0x68, + 0x78, 0x64, 0x69, 0x75, 0x4E, 0x6B, 0x48, 0x4D, 0x45, 0x57, 0x4E, 0x70, 0x0A, 0x59, 0x69, 0x6D, 0x38, 0x53, 0x38, 0x59, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, + 0x77, 0x5A, 0x51, 0x49, 0x78, 0x41, 0x4B, 0x32, 0x38, 0x38, 0x6D, 0x77, 0x2F, 0x45, 0x6B, 0x72, 0x52, 0x4C, 0x54, 0x6E, 0x44, 0x43, 0x67, 0x6D, 0x58, 0x63, 0x2F, 0x53, 0x49, 0x4E, 0x6F, 0x79, 0x49, 0x4A, 0x37, 0x76, 0x6D, 0x69, 0x49, 0x31, + 0x51, 0x68, 0x61, 0x64, 0x6A, 0x2B, 0x5A, 0x34, 0x79, 0x0A, 0x33, 0x6D, 0x61, 0x54, 0x44, 0x2F, 0x48, 0x4D, 0x73, 0x51, 0x6D, 0x50, 0x33, 0x57, 0x79, 0x72, 0x2B, 0x6D, 0x74, 0x2F, 0x6F, 0x41, 0x49, 0x77, 0x4F, 0x57, 0x5A, 0x62, 0x77, 0x6D, + 0x53, 0x4E, 0x75, 0x4A, 0x35, 0x51, 0x33, 0x4B, 0x6A, 0x56, 0x53, 0x61, 0x4C, 0x74, 0x78, 0x39, 0x7A, 0x52, 0x53, 0x58, 0x38, 0x58, 0x41, 0x62, 0x6A, 0x49, 0x68, 0x6F, 0x39, 0x4F, 0x6A, 0x49, 0x67, 0x72, 0x71, 0x4A, 0x71, 0x70, 0x69, 0x73, + 0x58, 0x52, 0x41, 0x4C, 0x33, 0x34, 0x0A, 0x56, 0x4F, 0x4B, 0x61, 0x35, 0x56, 0x74, 0x38, 0x73, 0x79, 0x63, 0x58, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x34, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x6B, 0x44, 0x43, 0x43, 0x41, 0x33, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x42, 0x5A, 0x73, 0x62, 0x56, 0x35, 0x36, 0x4F, 0x49, 0x54, 0x4C, 0x69, 0x4F, 0x51, 0x65, + 0x39, 0x70, 0x33, 0x64, 0x31, 0x58, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x69, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, + 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x45, 0x77, 0x0A, 0x48, + 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x68, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x47, 0x56, 0x6B, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, + 0x7A, 0x51, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x4D, 0x77, 0x4F, 0x44, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x31, 0x0A, 0x4D, 0x54, 0x49, 0x77, + 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x69, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, + 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x42, 0x33, 0x0A, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x47, 0x6C, + 0x6E, 0x61, 0x57, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4D, 0x53, 0x45, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x68, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, + 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x47, 0x56, 0x6B, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x51, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x0A, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, + 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x2F, 0x35, 0x70, 0x42, 0x7A, 0x61, 0x4E, 0x36, 0x37, 0x35, 0x46, 0x31, 0x4B, 0x50, 0x44, + 0x41, 0x69, 0x4D, 0x47, 0x6B, 0x7A, 0x37, 0x4D, 0x4B, 0x6E, 0x4A, 0x53, 0x37, 0x4A, 0x49, 0x54, 0x33, 0x79, 0x69, 0x74, 0x68, 0x5A, 0x77, 0x75, 0x45, 0x70, 0x0A, 0x70, 0x7A, 0x31, 0x59, 0x71, 0x33, 0x61, 0x61, 0x7A, 0x61, 0x35, 0x37, 0x47, + 0x34, 0x51, 0x4E, 0x78, 0x44, 0x41, 0x66, 0x38, 0x78, 0x75, 0x6B, 0x4F, 0x42, 0x62, 0x72, 0x56, 0x73, 0x61, 0x58, 0x62, 0x52, 0x32, 0x72, 0x73, 0x6E, 0x6E, 0x79, 0x79, 0x68, 0x48, 0x53, 0x35, 0x46, 0x2F, 0x57, 0x42, 0x54, 0x78, 0x53, 0x44, + 0x31, 0x49, 0x66, 0x78, 0x70, 0x34, 0x56, 0x70, 0x58, 0x36, 0x2B, 0x6E, 0x36, 0x6C, 0x58, 0x46, 0x6C, 0x6C, 0x56, 0x63, 0x71, 0x39, 0x6F, 0x0A, 0x6B, 0x33, 0x44, 0x43, 0x73, 0x72, 0x70, 0x31, 0x6D, 0x57, 0x70, 0x7A, 0x4D, 0x70, 0x54, 0x52, + 0x45, 0x45, 0x51, 0x51, 0x4C, 0x74, 0x2B, 0x43, 0x38, 0x77, 0x65, 0x45, 0x35, 0x6E, 0x51, 0x37, 0x62, 0x58, 0x48, 0x69, 0x4C, 0x51, 0x77, 0x62, 0x37, 0x69, 0x44, 0x56, 0x79, 0x53, 0x41, 0x64, 0x59, 0x79, 0x6B, 0x74, 0x7A, 0x75, 0x78, 0x65, + 0x54, 0x73, 0x69, 0x54, 0x2B, 0x43, 0x46, 0x68, 0x6D, 0x7A, 0x54, 0x72, 0x42, 0x63, 0x5A, 0x65, 0x37, 0x46, 0x73, 0x61, 0x0A, 0x76, 0x4F, 0x76, 0x4A, 0x7A, 0x38, 0x32, 0x73, 0x4E, 0x45, 0x42, 0x66, 0x73, 0x58, 0x70, 0x6D, 0x37, 0x6E, 0x66, + 0x49, 0x53, 0x4B, 0x68, 0x6D, 0x56, 0x31, 0x65, 0x66, 0x56, 0x46, 0x69, 0x4F, 0x44, 0x43, 0x75, 0x33, 0x54, 0x36, 0x63, 0x77, 0x32, 0x56, 0x62, 0x75, 0x79, 0x6E, 0x74, 0x64, 0x34, 0x36, 0x33, 0x4A, 0x54, 0x31, 0x37, 0x6C, 0x4E, 0x65, 0x63, + 0x78, 0x79, 0x39, 0x71, 0x54, 0x58, 0x74, 0x79, 0x4F, 0x6A, 0x34, 0x44, 0x61, 0x74, 0x70, 0x47, 0x59, 0x0A, 0x51, 0x4A, 0x42, 0x35, 0x77, 0x33, 0x6A, 0x48, 0x74, 0x72, 0x48, 0x45, 0x74, 0x57, 0x6F, 0x59, 0x4F, 0x41, 0x4D, 0x51, 0x6A, 0x64, + 0x6A, 0x55, 0x4E, 0x36, 0x51, 0x75, 0x42, 0x58, 0x32, 0x49, 0x39, 0x59, 0x49, 0x2B, 0x45, 0x4A, 0x46, 0x77, 0x71, 0x31, 0x57, 0x43, 0x51, 0x54, 0x4C, 0x58, 0x32, 0x77, 0x52, 0x7A, 0x4B, 0x6D, 0x36, 0x52, 0x41, 0x58, 0x77, 0x68, 0x54, 0x4E, + 0x53, 0x38, 0x72, 0x68, 0x73, 0x44, 0x64, 0x56, 0x31, 0x34, 0x5A, 0x74, 0x6B, 0x36, 0x0A, 0x4D, 0x55, 0x53, 0x61, 0x4D, 0x30, 0x43, 0x2F, 0x43, 0x4E, 0x64, 0x61, 0x53, 0x61, 0x54, 0x43, 0x35, 0x71, 0x6D, 0x67, 0x5A, 0x39, 0x32, 0x6B, 0x4A, + 0x37, 0x79, 0x68, 0x54, 0x7A, 0x6D, 0x31, 0x45, 0x56, 0x67, 0x58, 0x39, 0x79, 0x52, 0x63, 0x52, 0x6F, 0x39, 0x6B, 0x39, 0x38, 0x46, 0x70, 0x69, 0x48, 0x61, 0x59, 0x64, 0x6A, 0x31, 0x5A, 0x58, 0x55, 0x4A, 0x32, 0x68, 0x34, 0x6D, 0x58, 0x61, + 0x58, 0x70, 0x49, 0x38, 0x4F, 0x43, 0x69, 0x45, 0x68, 0x74, 0x6D, 0x0A, 0x6D, 0x6E, 0x54, 0x4B, 0x33, 0x6B, 0x73, 0x65, 0x35, 0x77, 0x35, 0x6A, 0x72, 0x75, 0x62, 0x55, 0x37, 0x35, 0x4B, 0x53, 0x4F, 0x70, 0x34, 0x39, 0x33, 0x41, 0x44, 0x6B, + 0x52, 0x53, 0x57, 0x4A, 0x74, 0x70, 0x70, 0x45, 0x47, 0x53, 0x74, 0x2B, 0x77, 0x4A, 0x53, 0x30, 0x30, 0x6D, 0x46, 0x74, 0x36, 0x7A, 0x50, 0x5A, 0x78, 0x64, 0x39, 0x4C, 0x42, 0x41, 0x44, 0x4D, 0x66, 0x52, 0x79, 0x56, 0x77, 0x34, 0x2F, 0x33, + 0x49, 0x62, 0x4B, 0x79, 0x45, 0x62, 0x65, 0x37, 0x0A, 0x66, 0x2F, 0x4C, 0x56, 0x6A, 0x48, 0x41, 0x73, 0x51, 0x57, 0x43, 0x71, 0x73, 0x57, 0x4D, 0x59, 0x52, 0x4A, 0x55, 0x61, 0x64, 0x6D, 0x4A, 0x2B, 0x39, 0x6F, 0x43, 0x77, 0x2B, 0x2B, 0x68, + 0x6B, 0x70, 0x6A, 0x50, 0x52, 0x69, 0x51, 0x66, 0x68, 0x76, 0x62, 0x66, 0x6D, 0x51, 0x36, 0x51, 0x59, 0x75, 0x4B, 0x5A, 0x33, 0x41, 0x65, 0x45, 0x50, 0x6C, 0x41, 0x77, 0x68, 0x48, 0x62, 0x4A, 0x55, 0x4B, 0x53, 0x57, 0x4A, 0x62, 0x4F, 0x55, + 0x4F, 0x55, 0x6C, 0x46, 0x48, 0x0A, 0x64, 0x4C, 0x34, 0x6D, 0x72, 0x4C, 0x5A, 0x42, 0x64, 0x64, 0x35, 0x36, 0x72, 0x46, 0x2B, 0x4E, 0x50, 0x38, 0x6D, 0x38, 0x30, 0x30, 0x45, 0x52, 0x45, 0x6C, 0x76, 0x6C, 0x45, 0x46, 0x44, 0x72, 0x4D, 0x63, + 0x58, 0x4B, 0x63, 0x68, 0x59, 0x69, 0x43, 0x64, 0x39, 0x38, 0x54, 0x48, 0x55, 0x2F, 0x59, 0x2B, 0x77, 0x68, 0x58, 0x38, 0x51, 0x67, 0x55, 0x57, 0x74, 0x76, 0x73, 0x61, 0x75, 0x47, 0x69, 0x30, 0x2F, 0x43, 0x31, 0x6B, 0x56, 0x66, 0x6E, 0x53, + 0x44, 0x38, 0x0A, 0x6F, 0x52, 0x37, 0x46, 0x77, 0x49, 0x2B, 0x69, 0x73, 0x58, 0x34, 0x4B, 0x4A, 0x70, 0x6E, 0x31, 0x35, 0x47, 0x6B, 0x76, 0x6D, 0x42, 0x30, 0x74, 0x39, 0x64, 0x6D, 0x70, 0x73, 0x68, 0x33, 0x6C, 0x47, 0x77, 0x49, 0x44, 0x41, + 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, + 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x37, 0x4E, 0x66, 0x6A, 0x67, 0x74, 0x4A, 0x78, 0x58, 0x57, 0x52, 0x4D, + 0x33, 0x79, 0x35, 0x6E, 0x50, 0x2B, 0x65, 0x36, 0x6D, 0x4B, 0x34, 0x63, 0x44, 0x30, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x0A, 0x67, 0x67, 0x49, + 0x42, 0x41, 0x4C, 0x74, 0x68, 0x32, 0x58, 0x32, 0x70, 0x62, 0x4C, 0x34, 0x58, 0x78, 0x4A, 0x45, 0x62, 0x77, 0x36, 0x47, 0x69, 0x41, 0x49, 0x33, 0x6A, 0x5A, 0x47, 0x67, 0x50, 0x56, 0x73, 0x39, 0x33, 0x72, 0x6E, 0x44, 0x35, 0x2F, 0x5A, 0x70, + 0x4B, 0x6D, 0x62, 0x6E, 0x4A, 0x65, 0x46, 0x77, 0x4D, 0x44, 0x46, 0x2F, 0x6B, 0x35, 0x68, 0x51, 0x70, 0x56, 0x67, 0x73, 0x32, 0x53, 0x56, 0x31, 0x45, 0x59, 0x2B, 0x43, 0x74, 0x6E, 0x4A, 0x59, 0x59, 0x0A, 0x5A, 0x68, 0x73, 0x6A, 0x44, 0x54, + 0x31, 0x35, 0x36, 0x57, 0x31, 0x72, 0x31, 0x6C, 0x54, 0x34, 0x30, 0x6A, 0x7A, 0x42, 0x51, 0x30, 0x43, 0x75, 0x48, 0x56, 0x44, 0x31, 0x55, 0x76, 0x79, 0x51, 0x4F, 0x37, 0x75, 0x59, 0x6D, 0x57, 0x6C, 0x72, 0x78, 0x38, 0x47, 0x6E, 0x71, 0x47, + 0x69, 0x6B, 0x4A, 0x39, 0x79, 0x64, 0x2B, 0x53, 0x65, 0x75, 0x4D, 0x49, 0x57, 0x35, 0x39, 0x6D, 0x64, 0x4E, 0x4F, 0x6A, 0x36, 0x50, 0x57, 0x54, 0x6B, 0x69, 0x55, 0x30, 0x54, 0x72, 0x0A, 0x79, 0x46, 0x30, 0x44, 0x79, 0x75, 0x31, 0x51, 0x65, + 0x6E, 0x31, 0x69, 0x49, 0x51, 0x71, 0x41, 0x79, 0x48, 0x4E, 0x6D, 0x30, 0x61, 0x41, 0x46, 0x59, 0x46, 0x2F, 0x6F, 0x70, 0x62, 0x53, 0x6E, 0x72, 0x36, 0x6A, 0x33, 0x62, 0x54, 0x57, 0x63, 0x66, 0x46, 0x71, 0x4B, 0x31, 0x71, 0x49, 0x34, 0x6D, + 0x66, 0x4E, 0x34, 0x69, 0x2F, 0x52, 0x4E, 0x30, 0x69, 0x41, 0x4C, 0x33, 0x67, 0x54, 0x75, 0x6A, 0x4A, 0x74, 0x48, 0x67, 0x58, 0x49, 0x4E, 0x77, 0x42, 0x51, 0x79, 0x0A, 0x37, 0x7A, 0x42, 0x5A, 0x4C, 0x71, 0x37, 0x67, 0x63, 0x66, 0x4A, 0x57, + 0x35, 0x47, 0x71, 0x58, 0x62, 0x35, 0x4A, 0x51, 0x62, 0x5A, 0x61, 0x4E, 0x61, 0x48, 0x71, 0x61, 0x73, 0x6A, 0x59, 0x55, 0x65, 0x67, 0x62, 0x79, 0x4A, 0x4C, 0x6B, 0x4A, 0x45, 0x56, 0x44, 0x58, 0x43, 0x4C, 0x47, 0x34, 0x69, 0x58, 0x71, 0x45, + 0x49, 0x32, 0x46, 0x43, 0x4B, 0x65, 0x57, 0x6A, 0x7A, 0x61, 0x49, 0x67, 0x51, 0x64, 0x66, 0x52, 0x6E, 0x47, 0x54, 0x5A, 0x36, 0x69, 0x61, 0x68, 0x0A, 0x69, 0x78, 0x54, 0x58, 0x54, 0x42, 0x6D, 0x79, 0x55, 0x45, 0x46, 0x78, 0x50, 0x54, 0x39, + 0x4E, 0x63, 0x43, 0x4F, 0x47, 0x44, 0x45, 0x72, 0x63, 0x67, 0x64, 0x4C, 0x4D, 0x4D, 0x70, 0x53, 0x45, 0x44, 0x51, 0x67, 0x4A, 0x6C, 0x78, 0x78, 0x50, 0x77, 0x4F, 0x35, 0x72, 0x49, 0x48, 0x51, 0x77, 0x30, 0x75, 0x41, 0x35, 0x4E, 0x42, 0x43, + 0x46, 0x49, 0x52, 0x55, 0x42, 0x43, 0x4F, 0x68, 0x56, 0x4D, 0x74, 0x35, 0x78, 0x53, 0x64, 0x6B, 0x6F, 0x46, 0x31, 0x42, 0x4E, 0x0A, 0x35, 0x72, 0x35, 0x4E, 0x30, 0x58, 0x57, 0x73, 0x30, 0x4D, 0x72, 0x37, 0x51, 0x62, 0x68, 0x44, 0x70, 0x61, + 0x72, 0x54, 0x77, 0x77, 0x56, 0x45, 0x54, 0x79, 0x77, 0x32, 0x6D, 0x2B, 0x4C, 0x36, 0x34, 0x6B, 0x57, 0x34, 0x49, 0x31, 0x4E, 0x73, 0x42, 0x6D, 0x39, 0x6E, 0x56, 0x58, 0x39, 0x47, 0x74, 0x55, 0x77, 0x2F, 0x62, 0x69, 0x68, 0x61, 0x65, 0x53, + 0x62, 0x53, 0x70, 0x4B, 0x68, 0x69, 0x6C, 0x39, 0x49, 0x65, 0x34, 0x75, 0x31, 0x4B, 0x69, 0x37, 0x77, 0x62, 0x0A, 0x2F, 0x55, 0x64, 0x4B, 0x44, 0x64, 0x39, 0x6E, 0x5A, 0x6E, 0x36, 0x79, 0x57, 0x30, 0x48, 0x51, 0x4F, 0x2B, 0x54, 0x30, 0x4F, + 0x2F, 0x51, 0x45, 0x59, 0x2B, 0x6E, 0x76, 0x77, 0x6C, 0x51, 0x41, 0x55, 0x61, 0x43, 0x4B, 0x4B, 0x73, 0x6E, 0x4F, 0x65, 0x4D, 0x7A, 0x56, 0x36, 0x6F, 0x63, 0x45, 0x47, 0x4C, 0x50, 0x4F, 0x72, 0x30, 0x6D, 0x49, 0x72, 0x2F, 0x4F, 0x53, 0x6D, + 0x62, 0x61, 0x7A, 0x35, 0x6D, 0x45, 0x50, 0x30, 0x6F, 0x55, 0x41, 0x35, 0x31, 0x41, 0x61, 0x0A, 0x35, 0x42, 0x75, 0x56, 0x6E, 0x52, 0x6D, 0x68, 0x75, 0x5A, 0x79, 0x78, 0x6D, 0x37, 0x45, 0x41, 0x48, 0x75, 0x2F, 0x51, 0x44, 0x30, 0x39, 0x43, + 0x62, 0x4D, 0x6B, 0x4B, 0x76, 0x4F, 0x35, 0x44, 0x2B, 0x6A, 0x70, 0x78, 0x70, 0x63, 0x68, 0x4E, 0x4A, 0x71, 0x55, 0x31, 0x2F, 0x59, 0x6C, 0x64, 0x76, 0x49, 0x56, 0x69, 0x48, 0x54, 0x4C, 0x53, 0x6F, 0x43, 0x74, 0x55, 0x37, 0x5A, 0x70, 0x58, + 0x77, 0x64, 0x76, 0x36, 0x45, 0x4D, 0x38, 0x5A, 0x74, 0x34, 0x74, 0x4B, 0x0A, 0x47, 0x34, 0x38, 0x42, 0x74, 0x69, 0x65, 0x56, 0x55, 0x2B, 0x69, 0x32, 0x69, 0x57, 0x31, 0x62, 0x76, 0x47, 0x6A, 0x55, 0x49, 0x2B, 0x69, 0x4C, 0x55, 0x61, 0x4A, + 0x57, 0x2B, 0x66, 0x43, 0x6D, 0x67, 0x4B, 0x44, 0x57, 0x48, 0x72, 0x4F, 0x38, 0x44, 0x77, 0x39, 0x54, 0x64, 0x53, 0x6D, 0x71, 0x36, 0x68, 0x4E, 0x33, 0x35, 0x4E, 0x36, 0x4D, 0x67, 0x53, 0x47, 0x74, 0x42, 0x78, 0x42, 0x48, 0x45, 0x61, 0x32, + 0x48, 0x50, 0x51, 0x66, 0x52, 0x64, 0x62, 0x7A, 0x50, 0x0A, 0x38, 0x32, 0x5A, 0x2B, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x0A, 0x43, 0x4F, 0x4D, 0x4F, 0x44, 0x4F, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, + 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x32, 0x44, 0x43, 0x43, 0x41, 0x38, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, + 0x54, 0x4B, 0x72, 0x35, 0x79, 0x74, 0x74, 0x6A, 0x62, 0x2B, 0x41, 0x66, 0x39, 0x30, 0x37, 0x59, 0x57, 0x77, 0x4F, 0x47, 0x6E, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, + 0x41, 0x44, 0x43, 0x42, 0x68, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x30, 0x49, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x45, 0x6B, 0x64, + 0x79, 0x5A, 0x57, 0x46, 0x30, 0x5A, 0x58, 0x49, 0x67, 0x54, 0x57, 0x46, 0x75, 0x59, 0x32, 0x68, 0x6C, 0x63, 0x33, 0x52, 0x6C, 0x63, 0x6A, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x48, 0x55, 0x32, 0x46, + 0x73, 0x5A, 0x6D, 0x39, 0x79, 0x5A, 0x44, 0x45, 0x61, 0x4D, 0x42, 0x67, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x52, 0x51, 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, + 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6B, 0x4E, 0x50, 0x54, 0x55, 0x39, 0x45, 0x54, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, + 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x54, 0x45, 0x35, 0x4D, + 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x68, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x0A, 0x52, 0x30, 0x49, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x45, 0x6B, 0x64, 0x79, 0x5A, 0x57, 0x46, 0x30, 0x5A, 0x58, 0x49, 0x67, 0x54, 0x57, 0x46, 0x75, + 0x59, 0x32, 0x68, 0x6C, 0x63, 0x33, 0x52, 0x6C, 0x63, 0x6A, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x48, 0x55, 0x32, 0x46, 0x73, 0x5A, 0x6D, 0x39, 0x79, 0x5A, 0x44, 0x45, 0x61, 0x4D, 0x42, 0x67, 0x47, + 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x68, 0x4D, 0x52, 0x51, 0x30, 0x39, 0x4E, 0x54, 0x30, 0x52, 0x50, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x45, 0x78, 0x70, 0x62, 0x57, 0x6C, 0x30, 0x5A, 0x57, 0x51, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6B, 0x4E, 0x50, 0x54, 0x55, 0x39, 0x45, 0x54, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, + 0x42, 0x0A, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, + 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x52, 0x36, 0x46, 0x53, 0x53, 0x30, 0x67, 0x70, 0x57, 0x73, 0x61, 0x77, 0x4E, 0x4A, 0x4E, 0x33, 0x46, 0x7A, 0x30, 0x52, 0x6E, 0x0A, 0x64, + 0x4A, 0x6B, 0x72, 0x4E, 0x36, 0x4E, 0x39, 0x49, 0x33, 0x41, 0x41, 0x63, 0x62, 0x78, 0x54, 0x33, 0x38, 0x54, 0x36, 0x4B, 0x68, 0x4B, 0x50, 0x53, 0x33, 0x38, 0x51, 0x56, 0x72, 0x32, 0x66, 0x63, 0x48, 0x4B, 0x33, 0x59, 0x58, 0x2F, 0x4A, 0x53, + 0x77, 0x38, 0x58, 0x70, 0x7A, 0x33, 0x6A, 0x73, 0x41, 0x52, 0x68, 0x37, 0x76, 0x38, 0x52, 0x6C, 0x38, 0x66, 0x30, 0x68, 0x6A, 0x34, 0x4B, 0x2B, 0x6A, 0x35, 0x63, 0x2B, 0x5A, 0x50, 0x6D, 0x4E, 0x48, 0x72, 0x5A, 0x0A, 0x46, 0x47, 0x76, 0x6E, + 0x6E, 0x4C, 0x4F, 0x46, 0x6F, 0x49, 0x4A, 0x36, 0x64, 0x71, 0x39, 0x78, 0x6B, 0x4E, 0x66, 0x73, 0x2F, 0x51, 0x33, 0x36, 0x6E, 0x47, 0x7A, 0x36, 0x33, 0x37, 0x43, 0x43, 0x39, 0x42, 0x52, 0x2B, 0x2B, 0x62, 0x37, 0x45, 0x70, 0x69, 0x39, 0x50, + 0x66, 0x35, 0x6C, 0x2F, 0x74, 0x66, 0x78, 0x6E, 0x51, 0x33, 0x4B, 0x39, 0x44, 0x41, 0x44, 0x57, 0x69, 0x65, 0x74, 0x72, 0x4C, 0x4E, 0x50, 0x74, 0x6A, 0x35, 0x67, 0x63, 0x46, 0x4B, 0x74, 0x2B, 0x0A, 0x35, 0x65, 0x4E, 0x75, 0x2F, 0x4E, 0x69, + 0x6F, 0x35, 0x4A, 0x49, 0x6B, 0x32, 0x6B, 0x4E, 0x72, 0x59, 0x72, 0x68, 0x56, 0x2F, 0x65, 0x72, 0x42, 0x76, 0x47, 0x79, 0x32, 0x69, 0x2F, 0x4D, 0x4F, 0x6A, 0x5A, 0x72, 0x6B, 0x6D, 0x32, 0x78, 0x70, 0x6D, 0x66, 0x68, 0x34, 0x53, 0x44, 0x42, + 0x46, 0x31, 0x61, 0x33, 0x68, 0x44, 0x54, 0x78, 0x46, 0x59, 0x50, 0x77, 0x79, 0x6C, 0x6C, 0x45, 0x6E, 0x76, 0x47, 0x66, 0x44, 0x79, 0x69, 0x36, 0x32, 0x61, 0x2B, 0x70, 0x47, 0x0A, 0x78, 0x38, 0x63, 0x67, 0x6F, 0x4C, 0x45, 0x66, 0x5A, 0x64, + 0x35, 0x49, 0x43, 0x4C, 0x71, 0x6B, 0x54, 0x71, 0x6E, 0x79, 0x67, 0x30, 0x59, 0x33, 0x68, 0x4F, 0x76, 0x6F, 0x7A, 0x49, 0x46, 0x49, 0x51, 0x32, 0x64, 0x4F, 0x63, 0x69, 0x71, 0x62, 0x58, 0x4C, 0x31, 0x4D, 0x47, 0x79, 0x69, 0x4B, 0x58, 0x43, + 0x4A, 0x37, 0x74, 0x4B, 0x75, 0x59, 0x32, 0x65, 0x37, 0x67, 0x55, 0x59, 0x50, 0x44, 0x43, 0x55, 0x5A, 0x4F, 0x62, 0x54, 0x36, 0x5A, 0x2B, 0x70, 0x55, 0x58, 0x0A, 0x32, 0x6E, 0x77, 0x7A, 0x56, 0x30, 0x45, 0x38, 0x6A, 0x56, 0x48, 0x74, 0x43, + 0x37, 0x5A, 0x63, 0x72, 0x79, 0x78, 0x6A, 0x47, 0x74, 0x39, 0x58, 0x79, 0x44, 0x2B, 0x38, 0x36, 0x56, 0x33, 0x45, 0x6D, 0x36, 0x39, 0x46, 0x6D, 0x65, 0x4B, 0x6A, 0x57, 0x69, 0x53, 0x30, 0x75, 0x71, 0x6C, 0x57, 0x50, 0x63, 0x39, 0x76, 0x71, + 0x76, 0x39, 0x4A, 0x57, 0x4C, 0x37, 0x77, 0x71, 0x50, 0x2F, 0x30, 0x75, 0x4B, 0x33, 0x70, 0x4E, 0x2F, 0x75, 0x36, 0x75, 0x50, 0x51, 0x4C, 0x0A, 0x4F, 0x76, 0x6E, 0x6F, 0x51, 0x30, 0x49, 0x65, 0x69, 0x64, 0x69, 0x45, 0x79, 0x78, 0x50, 0x78, + 0x32, 0x62, 0x76, 0x68, 0x69, 0x57, 0x43, 0x34, 0x6A, 0x43, 0x68, 0x57, 0x72, 0x42, 0x51, 0x64, 0x6E, 0x41, 0x72, 0x6E, 0x63, 0x65, 0x76, 0x50, 0x44, 0x74, 0x30, 0x39, 0x71, 0x5A, 0x61, 0x68, 0x53, 0x4C, 0x30, 0x38, 0x39, 0x36, 0x2B, 0x31, + 0x44, 0x53, 0x4A, 0x4D, 0x77, 0x42, 0x47, 0x42, 0x37, 0x46, 0x59, 0x37, 0x39, 0x74, 0x4F, 0x69, 0x34, 0x6C, 0x75, 0x33, 0x0A, 0x73, 0x67, 0x51, 0x69, 0x55, 0x70, 0x57, 0x41, 0x6B, 0x32, 0x6E, 0x6F, 0x6A, 0x6B, 0x78, 0x6C, 0x38, 0x5A, 0x45, + 0x44, 0x4C, 0x58, 0x42, 0x30, 0x41, 0x75, 0x71, 0x4C, 0x5A, 0x78, 0x55, 0x70, 0x61, 0x56, 0x49, 0x43, 0x75, 0x39, 0x66, 0x66, 0x55, 0x47, 0x70, 0x56, 0x52, 0x72, 0x2B, 0x67, 0x6F, 0x79, 0x68, 0x68, 0x66, 0x33, 0x44, 0x51, 0x77, 0x36, 0x4B, + 0x71, 0x4C, 0x43, 0x47, 0x71, 0x52, 0x38, 0x34, 0x6F, 0x6E, 0x41, 0x5A, 0x46, 0x64, 0x72, 0x2B, 0x43, 0x0A, 0x47, 0x43, 0x65, 0x30, 0x31, 0x61, 0x36, 0x30, 0x79, 0x31, 0x44, 0x6D, 0x61, 0x2F, 0x52, 0x4D, 0x68, 0x6E, 0x45, 0x77, 0x36, 0x61, + 0x62, 0x66, 0x46, 0x6F, 0x62, 0x67, 0x32, 0x50, 0x39, 0x41, 0x33, 0x66, 0x76, 0x51, 0x51, 0x6F, 0x68, 0x2F, 0x6F, 0x7A, 0x4D, 0x36, 0x4C, 0x6C, 0x77, 0x65, 0x51, 0x52, 0x47, 0x42, 0x59, 0x38, 0x34, 0x59, 0x63, 0x57, 0x73, 0x72, 0x37, 0x4B, + 0x61, 0x4B, 0x74, 0x7A, 0x46, 0x63, 0x4F, 0x6D, 0x70, 0x48, 0x34, 0x4D, 0x4E, 0x35, 0x0A, 0x57, 0x64, 0x59, 0x67, 0x47, 0x71, 0x2F, 0x79, 0x61, 0x70, 0x69, 0x71, 0x63, 0x72, 0x78, 0x58, 0x53, 0x74, 0x4A, 0x4C, 0x6E, 0x62, 0x73, 0x51, 0x2F, + 0x4C, 0x42, 0x4D, 0x51, 0x65, 0x58, 0x74, 0x48, 0x54, 0x31, 0x65, 0x4B, 0x4A, 0x32, 0x63, 0x7A, 0x4C, 0x2B, 0x7A, 0x55, 0x64, 0x71, 0x6E, 0x52, 0x2B, 0x57, 0x45, 0x55, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, + 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x0A, 0x46, 0x67, 0x51, 0x55, 0x75, 0x36, 0x39, 0x2B, 0x41, 0x6A, 0x33, 0x36, 0x70, 0x76, 0x45, 0x38, 0x68, 0x49, 0x36, 0x74, 0x37, 0x6A, 0x69, 0x59, 0x37, 0x4E, 0x6B, 0x79, + 0x4D, 0x74, 0x51, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, + 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x41, 0x72, 0x78, 0x31, 0x55, 0x61, + 0x45, 0x74, 0x36, 0x35, 0x52, 0x75, 0x32, 0x79, 0x79, 0x54, 0x55, 0x45, 0x55, 0x41, 0x4A, 0x4E, 0x4D, 0x6E, 0x4D, 0x76, 0x6C, 0x77, 0x46, 0x54, 0x50, 0x6F, 0x43, 0x57, 0x4F, 0x41, 0x76, 0x6E, 0x39, 0x73, 0x4B, 0x49, 0x4E, 0x39, 0x53, 0x43, + 0x59, 0x50, 0x42, 0x4D, 0x74, 0x0A, 0x72, 0x46, 0x61, 0x69, 0x73, 0x4E, 0x5A, 0x2B, 0x45, 0x5A, 0x4C, 0x70, 0x4C, 0x72, 0x71, 0x65, 0x4C, 0x70, 0x70, 0x79, 0x73, 0x62, 0x30, 0x5A, 0x52, 0x47, 0x78, 0x68, 0x4E, 0x61, 0x4B, 0x61, 0x74, 0x42, + 0x59, 0x53, 0x61, 0x56, 0x71, 0x4D, 0x34, 0x64, 0x63, 0x2B, 0x70, 0x42, 0x72, 0x6F, 0x4C, 0x77, 0x50, 0x30, 0x72, 0x6D, 0x45, 0x64, 0x45, 0x42, 0x73, 0x71, 0x70, 0x49, 0x74, 0x36, 0x78, 0x66, 0x34, 0x46, 0x70, 0x75, 0x48, 0x41, 0x31, 0x73, + 0x6A, 0x2B, 0x0A, 0x6E, 0x71, 0x36, 0x50, 0x4B, 0x37, 0x6F, 0x39, 0x6D, 0x66, 0x6A, 0x59, 0x63, 0x77, 0x6C, 0x59, 0x52, 0x6D, 0x36, 0x6D, 0x6E, 0x50, 0x54, 0x58, 0x4A, 0x39, 0x4F, 0x56, 0x32, 0x6A, 0x65, 0x44, 0x63, 0x68, 0x7A, 0x54, 0x63, + 0x2B, 0x43, 0x69, 0x52, 0x35, 0x6B, 0x44, 0x4F, 0x46, 0x33, 0x56, 0x53, 0x58, 0x6B, 0x41, 0x4B, 0x52, 0x7A, 0x48, 0x37, 0x4A, 0x73, 0x67, 0x48, 0x41, 0x63, 0x6B, 0x61, 0x56, 0x64, 0x34, 0x73, 0x6A, 0x6E, 0x38, 0x4F, 0x6F, 0x53, 0x67, 0x0A, + 0x74, 0x5A, 0x78, 0x38, 0x6A, 0x62, 0x38, 0x75, 0x6B, 0x32, 0x49, 0x6E, 0x74, 0x7A, 0x6E, 0x61, 0x46, 0x78, 0x69, 0x75, 0x76, 0x54, 0x77, 0x4A, 0x61, 0x50, 0x2B, 0x45, 0x6D, 0x7A, 0x7A, 0x56, 0x31, 0x67, 0x73, 0x44, 0x34, 0x31, 0x65, 0x65, + 0x46, 0x50, 0x66, 0x52, 0x36, 0x30, 0x2F, 0x49, 0x76, 0x59, 0x63, 0x6A, 0x74, 0x37, 0x5A, 0x4A, 0x51, 0x33, 0x6D, 0x46, 0x58, 0x4C, 0x72, 0x72, 0x6B, 0x67, 0x75, 0x68, 0x78, 0x75, 0x68, 0x6F, 0x71, 0x45, 0x77, 0x57, 0x0A, 0x73, 0x52, 0x71, + 0x5A, 0x43, 0x75, 0x68, 0x54, 0x4C, 0x4A, 0x4B, 0x37, 0x6F, 0x51, 0x6B, 0x59, 0x64, 0x51, 0x78, 0x6C, 0x71, 0x48, 0x76, 0x4C, 0x49, 0x37, 0x63, 0x61, 0x77, 0x69, 0x69, 0x46, 0x77, 0x78, 0x76, 0x2F, 0x30, 0x43, 0x74, 0x69, 0x37, 0x36, 0x52, + 0x37, 0x43, 0x5A, 0x47, 0x59, 0x5A, 0x34, 0x77, 0x55, 0x41, 0x63, 0x31, 0x6F, 0x42, 0x6D, 0x70, 0x6A, 0x49, 0x58, 0x55, 0x44, 0x67, 0x49, 0x69, 0x4B, 0x62, 0x6F, 0x48, 0x47, 0x68, 0x66, 0x4B, 0x70, 0x0A, 0x70, 0x43, 0x33, 0x6E, 0x39, 0x4B, + 0x55, 0x6B, 0x45, 0x45, 0x65, 0x44, 0x79, 0x73, 0x33, 0x30, 0x6A, 0x58, 0x6C, 0x59, 0x73, 0x51, 0x61, 0x62, 0x35, 0x78, 0x6F, 0x71, 0x32, 0x5A, 0x30, 0x42, 0x31, 0x35, 0x52, 0x39, 0x37, 0x51, 0x4E, 0x4B, 0x79, 0x76, 0x44, 0x62, 0x36, 0x4B, + 0x6B, 0x42, 0x50, 0x76, 0x56, 0x57, 0x6D, 0x63, 0x6B, 0x65, 0x6A, 0x6B, 0x6B, 0x39, 0x75, 0x2B, 0x55, 0x4A, 0x75, 0x65, 0x42, 0x50, 0x53, 0x5A, 0x49, 0x39, 0x46, 0x6F, 0x4A, 0x41, 0x0A, 0x7A, 0x4D, 0x78, 0x5A, 0x78, 0x75, 0x59, 0x36, 0x37, + 0x52, 0x49, 0x75, 0x61, 0x54, 0x78, 0x73, 0x6C, 0x62, 0x48, 0x39, 0x71, 0x68, 0x31, 0x37, 0x66, 0x34, 0x61, 0x2B, 0x48, 0x67, 0x34, 0x79, 0x52, 0x76, 0x76, 0x37, 0x45, 0x34, 0x39, 0x31, 0x66, 0x30, 0x79, 0x4C, 0x53, 0x30, 0x5A, 0x6A, 0x2F, + 0x67, 0x41, 0x30, 0x51, 0x48, 0x44, 0x42, 0x77, 0x37, 0x6D, 0x68, 0x33, 0x61, 0x5A, 0x77, 0x34, 0x67, 0x53, 0x7A, 0x51, 0x62, 0x7A, 0x70, 0x67, 0x4A, 0x48, 0x71, 0x0A, 0x5A, 0x4A, 0x78, 0x36, 0x34, 0x53, 0x49, 0x44, 0x71, 0x5A, 0x78, 0x75, + 0x62, 0x77, 0x35, 0x6C, 0x54, 0x32, 0x79, 0x48, 0x68, 0x31, 0x37, 0x7A, 0x62, 0x71, 0x44, 0x35, 0x64, 0x61, 0x57, 0x62, 0x51, 0x4F, 0x68, 0x54, 0x73, 0x69, 0x65, 0x64, 0x53, 0x72, 0x6E, 0x41, 0x64, 0x79, 0x47, 0x4E, 0x2F, 0x34, 0x66, 0x79, + 0x33, 0x72, 0x79, 0x4D, 0x37, 0x78, 0x66, 0x66, 0x74, 0x30, 0x6B, 0x4C, 0x30, 0x66, 0x4A, 0x75, 0x4D, 0x41, 0x73, 0x61, 0x44, 0x6B, 0x35, 0x32, 0x0A, 0x37, 0x52, 0x48, 0x38, 0x39, 0x65, 0x6C, 0x57, 0x73, 0x6E, 0x32, 0x2F, 0x78, 0x32, 0x30, + 0x4B, 0x6B, 0x34, 0x79, 0x6C, 0x30, 0x4D, 0x43, 0x32, 0x48, 0x62, 0x34, 0x36, 0x54, 0x70, 0x53, 0x69, 0x31, 0x32, 0x35, 0x73, 0x43, 0x38, 0x4B, 0x4B, 0x66, 0x50, 0x6F, 0x67, 0x38, 0x38, 0x54, 0x6B, 0x35, 0x63, 0x30, 0x4E, 0x71, 0x4D, 0x75, + 0x52, 0x6B, 0x72, 0x46, 0x38, 0x68, 0x65, 0x79, 0x31, 0x46, 0x47, 0x6C, 0x6D, 0x44, 0x6F, 0x4C, 0x6E, 0x7A, 0x63, 0x37, 0x49, 0x0A, 0x4C, 0x61, 0x5A, 0x52, 0x66, 0x79, 0x48, 0x42, 0x4E, 0x56, 0x4F, 0x46, 0x42, 0x6B, 0x70, 0x64, 0x6E, 0x36, + 0x32, 0x37, 0x47, 0x31, 0x39, 0x30, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x33, 0x6A, 0x43, 0x43, 0x41, 0x38, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x41, 0x66, + 0x31, 0x74, 0x4D, 0x50, 0x79, 0x6A, 0x79, 0x6C, 0x47, 0x6F, 0x47, 0x37, 0x78, 0x6B, 0x44, 0x6A, 0x55, 0x44, 0x4C, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, + 0x43, 0x42, 0x69, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6B, 0x35, 0x6C, 0x64, + 0x79, 0x42, 0x4B, 0x5A, 0x58, 0x4A, 0x7A, 0x5A, 0x58, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x30, 0x70, 0x6C, 0x63, 0x6E, 0x4E, 0x6C, 0x65, 0x53, 0x42, 0x44, 0x61, 0x58, 0x52, 0x35, 0x4D, + 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x45, 0x78, 0x56, 0x55, 0x61, 0x47, 0x55, 0x67, 0x56, 0x56, 0x4E, 0x46, 0x55, 0x6C, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x35, 0x6C, 0x64, 0x48, 0x64, 0x76, + 0x63, 0x6D, 0x73, 0x78, 0x4C, 0x6A, 0x41, 0x73, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4A, 0x56, 0x56, 0x54, 0x52, 0x56, 0x4A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x51, 0x32, 0x56, 0x79, + 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x0A, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x6A, 0x41, + 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x69, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6B, 0x35, 0x6C, 0x64, 0x79, 0x42, 0x4B, 0x5A, 0x58, 0x4A, 0x7A, 0x5A, 0x58, + 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x30, 0x70, 0x6C, 0x63, 0x6E, 0x4E, 0x6C, 0x65, 0x53, 0x42, 0x44, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, + 0x51, 0x4B, 0x0A, 0x45, 0x78, 0x56, 0x55, 0x61, 0x47, 0x55, 0x67, 0x56, 0x56, 0x4E, 0x46, 0x55, 0x6C, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x35, 0x6C, 0x64, 0x48, 0x64, 0x76, 0x63, 0x6D, 0x73, 0x78, 0x4C, 0x6A, 0x41, 0x73, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4A, 0x56, 0x56, 0x54, 0x52, 0x56, 0x4A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x0A, + 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, + 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x41, 0x45, 0x6D, 0x55, 0x58, 0x4E, 0x67, 0x37, 0x44, 0x32, 0x77, 0x69, 0x7A, 0x0A, 0x30, 0x4B, 0x78, + 0x58, 0x44, 0x58, 0x62, 0x74, 0x7A, 0x53, 0x66, 0x54, 0x54, 0x4B, 0x31, 0x51, 0x67, 0x32, 0x48, 0x69, 0x71, 0x69, 0x42, 0x4E, 0x43, 0x53, 0x31, 0x6B, 0x43, 0x64, 0x7A, 0x4F, 0x69, 0x5A, 0x2F, 0x4D, 0x50, 0x61, 0x6E, 0x73, 0x39, 0x73, 0x2F, + 0x42, 0x33, 0x50, 0x48, 0x54, 0x73, 0x64, 0x5A, 0x37, 0x4E, 0x79, 0x67, 0x52, 0x4B, 0x30, 0x66, 0x61, 0x4F, 0x63, 0x61, 0x38, 0x4F, 0x68, 0x6D, 0x30, 0x58, 0x36, 0x61, 0x39, 0x66, 0x5A, 0x32, 0x6A, 0x0A, 0x59, 0x30, 0x4B, 0x32, 0x64, 0x76, + 0x4B, 0x70, 0x4F, 0x79, 0x75, 0x52, 0x2B, 0x4F, 0x4A, 0x76, 0x30, 0x4F, 0x77, 0x57, 0x49, 0x4A, 0x41, 0x4A, 0x50, 0x75, 0x4C, 0x6F, 0x64, 0x4D, 0x6B, 0x59, 0x74, 0x4A, 0x48, 0x55, 0x59, 0x6D, 0x54, 0x62, 0x66, 0x36, 0x4D, 0x47, 0x38, 0x59, + 0x67, 0x59, 0x61, 0x70, 0x41, 0x69, 0x50, 0x4C, 0x7A, 0x2B, 0x45, 0x2F, 0x43, 0x48, 0x46, 0x48, 0x76, 0x32, 0x35, 0x42, 0x2B, 0x4F, 0x31, 0x4F, 0x52, 0x52, 0x78, 0x68, 0x46, 0x6E, 0x0A, 0x52, 0x67, 0x68, 0x52, 0x79, 0x34, 0x59, 0x55, 0x56, + 0x44, 0x2B, 0x38, 0x4D, 0x2F, 0x35, 0x2B, 0x62, 0x4A, 0x7A, 0x2F, 0x46, 0x70, 0x30, 0x59, 0x76, 0x56, 0x47, 0x4F, 0x4E, 0x61, 0x61, 0x6E, 0x5A, 0x73, 0x68, 0x79, 0x5A, 0x39, 0x73, 0x68, 0x5A, 0x72, 0x48, 0x55, 0x6D, 0x33, 0x67, 0x44, 0x77, + 0x46, 0x41, 0x36, 0x36, 0x4D, 0x7A, 0x77, 0x33, 0x4C, 0x79, 0x65, 0x54, 0x50, 0x36, 0x76, 0x42, 0x5A, 0x59, 0x31, 0x48, 0x31, 0x64, 0x61, 0x74, 0x2F, 0x2F, 0x4F, 0x0A, 0x2B, 0x54, 0x32, 0x33, 0x4C, 0x4C, 0x62, 0x32, 0x56, 0x4E, 0x33, 0x49, + 0x35, 0x78, 0x49, 0x36, 0x54, 0x61, 0x35, 0x4D, 0x69, 0x72, 0x64, 0x63, 0x6D, 0x72, 0x53, 0x33, 0x49, 0x44, 0x33, 0x4B, 0x66, 0x79, 0x49, 0x30, 0x72, 0x6E, 0x34, 0x37, 0x61, 0x47, 0x59, 0x42, 0x52, 0x4F, 0x63, 0x42, 0x54, 0x6B, 0x5A, 0x54, + 0x6D, 0x7A, 0x4E, 0x67, 0x39, 0x35, 0x53, 0x2B, 0x55, 0x7A, 0x65, 0x51, 0x63, 0x30, 0x50, 0x7A, 0x4D, 0x73, 0x4E, 0x54, 0x37, 0x39, 0x75, 0x71, 0x0A, 0x2F, 0x6E, 0x52, 0x4F, 0x61, 0x63, 0x64, 0x72, 0x6A, 0x47, 0x43, 0x54, 0x33, 0x73, 0x54, + 0x48, 0x44, 0x4E, 0x2F, 0x68, 0x4D, 0x71, 0x37, 0x4D, 0x6B, 0x7A, 0x74, 0x52, 0x65, 0x4A, 0x56, 0x6E, 0x69, 0x2B, 0x34, 0x39, 0x56, 0x76, 0x34, 0x4D, 0x30, 0x47, 0x6B, 0x50, 0x47, 0x77, 0x2F, 0x7A, 0x4A, 0x53, 0x5A, 0x72, 0x4D, 0x32, 0x33, + 0x33, 0x62, 0x6B, 0x66, 0x36, 0x63, 0x30, 0x50, 0x6C, 0x66, 0x67, 0x36, 0x6C, 0x5A, 0x72, 0x45, 0x70, 0x66, 0x44, 0x4B, 0x45, 0x0A, 0x59, 0x31, 0x57, 0x4A, 0x78, 0x41, 0x33, 0x42, 0x6B, 0x31, 0x51, 0x77, 0x47, 0x52, 0x4F, 0x73, 0x30, 0x33, + 0x30, 0x33, 0x70, 0x2B, 0x74, 0x64, 0x4F, 0x6D, 0x77, 0x31, 0x58, 0x4E, 0x74, 0x42, 0x31, 0x78, 0x4C, 0x61, 0x71, 0x55, 0x6B, 0x4C, 0x33, 0x39, 0x69, 0x41, 0x69, 0x67, 0x6D, 0x54, 0x59, 0x6F, 0x36, 0x31, 0x5A, 0x73, 0x38, 0x6C, 0x69, 0x4D, + 0x32, 0x45, 0x75, 0x4C, 0x45, 0x2F, 0x70, 0x44, 0x6B, 0x50, 0x32, 0x51, 0x4B, 0x65, 0x36, 0x78, 0x4A, 0x4D, 0x0A, 0x6C, 0x58, 0x7A, 0x7A, 0x61, 0x77, 0x57, 0x70, 0x58, 0x68, 0x61, 0x44, 0x7A, 0x4C, 0x68, 0x6E, 0x34, 0x75, 0x67, 0x54, 0x6E, + 0x63, 0x78, 0x62, 0x67, 0x74, 0x4E, 0x4D, 0x73, 0x2B, 0x31, 0x62, 0x2F, 0x39, 0x37, 0x6C, 0x63, 0x36, 0x77, 0x6A, 0x4F, 0x79, 0x30, 0x41, 0x76, 0x7A, 0x56, 0x56, 0x64, 0x41, 0x6C, 0x4A, 0x32, 0x45, 0x6C, 0x59, 0x47, 0x6E, 0x2B, 0x53, 0x4E, + 0x75, 0x5A, 0x52, 0x6B, 0x67, 0x37, 0x7A, 0x4A, 0x6E, 0x30, 0x63, 0x54, 0x52, 0x65, 0x38, 0x0A, 0x79, 0x65, 0x78, 0x44, 0x4A, 0x74, 0x43, 0x2F, 0x51, 0x56, 0x39, 0x41, 0x71, 0x55, 0x52, 0x45, 0x39, 0x4A, 0x6E, 0x6E, 0x56, 0x34, 0x65, 0x65, + 0x55, 0x42, 0x39, 0x58, 0x56, 0x4B, 0x67, 0x2B, 0x2F, 0x58, 0x52, 0x6A, 0x4C, 0x37, 0x46, 0x51, 0x5A, 0x51, 0x6E, 0x6D, 0x57, 0x45, 0x49, 0x75, 0x51, 0x78, 0x70, 0x4D, 0x74, 0x50, 0x41, 0x6C, 0x52, 0x31, 0x6E, 0x36, 0x42, 0x42, 0x36, 0x54, + 0x31, 0x43, 0x5A, 0x47, 0x53, 0x6C, 0x43, 0x42, 0x73, 0x74, 0x36, 0x2B, 0x0A, 0x65, 0x4C, 0x66, 0x38, 0x5A, 0x78, 0x58, 0x68, 0x79, 0x56, 0x65, 0x45, 0x48, 0x67, 0x39, 0x6A, 0x31, 0x75, 0x6C, 0x69, 0x75, 0x74, 0x5A, 0x66, 0x56, 0x53, 0x37, + 0x71, 0x58, 0x4D, 0x59, 0x6F, 0x43, 0x41, 0x51, 0x6C, 0x4F, 0x62, 0x67, 0x4F, 0x4B, 0x36, 0x6E, 0x79, 0x54, 0x4A, 0x63, 0x63, 0x42, 0x7A, 0x38, 0x4E, 0x55, 0x76, 0x58, 0x74, 0x37, 0x79, 0x2B, 0x43, 0x44, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, + 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x55, 0x33, 0x6D, 0x2F, 0x57, 0x71, 0x6F, 0x72, 0x53, 0x73, 0x39, 0x55, 0x67, 0x4F, 0x48, 0x59, 0x6D, 0x38, + 0x43, 0x64, 0x38, 0x72, 0x49, 0x44, 0x5A, 0x73, 0x73, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, + 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x0A, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, + 0x46, 0x7A, 0x55, 0x66, 0x41, 0x33, 0x50, 0x39, 0x77, 0x46, 0x39, 0x51, 0x5A, 0x6C, 0x6C, 0x44, 0x48, 0x50, 0x46, 0x55, 0x70, 0x2F, 0x4C, 0x2B, 0x4D, 0x2B, 0x5A, 0x42, 0x6E, 0x38, 0x62, 0x32, 0x6B, 0x4D, 0x56, 0x6E, 0x35, 0x34, 0x43, 0x56, + 0x56, 0x65, 0x57, 0x0A, 0x46, 0x50, 0x46, 0x53, 0x50, 0x43, 0x65, 0x48, 0x6C, 0x43, 0x6A, 0x74, 0x48, 0x7A, 0x6F, 0x42, 0x4E, 0x36, 0x4A, 0x32, 0x2F, 0x46, 0x4E, 0x51, 0x77, 0x49, 0x53, 0x62, 0x78, 0x6D, 0x74, 0x4F, 0x75, 0x6F, 0x77, 0x68, + 0x54, 0x36, 0x4B, 0x4F, 0x56, 0x57, 0x4B, 0x52, 0x38, 0x32, 0x6B, 0x56, 0x32, 0x4C, 0x79, 0x49, 0x34, 0x38, 0x53, 0x71, 0x43, 0x2F, 0x33, 0x76, 0x71, 0x4F, 0x6C, 0x4C, 0x56, 0x53, 0x6F, 0x47, 0x49, 0x47, 0x31, 0x56, 0x65, 0x43, 0x6B, 0x5A, + 0x0A, 0x37, 0x6C, 0x38, 0x77, 0x58, 0x45, 0x73, 0x6B, 0x45, 0x56, 0x58, 0x2F, 0x4A, 0x4A, 0x70, 0x75, 0x58, 0x69, 0x6F, 0x72, 0x37, 0x67, 0x74, 0x4E, 0x6E, 0x33, 0x2F, 0x33, 0x41, 0x54, 0x69, 0x55, 0x46, 0x4A, 0x56, 0x44, 0x42, 0x77, 0x6E, + 0x37, 0x59, 0x4B, 0x6E, 0x75, 0x48, 0x4B, 0x73, 0x53, 0x6A, 0x4B, 0x43, 0x61, 0x58, 0x71, 0x65, 0x59, 0x61, 0x6C, 0x6C, 0x74, 0x69, 0x7A, 0x38, 0x49, 0x2B, 0x38, 0x6A, 0x52, 0x52, 0x61, 0x38, 0x59, 0x46, 0x57, 0x53, 0x51, 0x0A, 0x45, 0x67, + 0x39, 0x7A, 0x4B, 0x43, 0x37, 0x46, 0x34, 0x69, 0x52, 0x4F, 0x2F, 0x46, 0x6A, 0x73, 0x38, 0x50, 0x52, 0x46, 0x2F, 0x69, 0x4B, 0x7A, 0x36, 0x79, 0x2B, 0x4F, 0x30, 0x74, 0x6C, 0x46, 0x59, 0x51, 0x58, 0x42, 0x6C, 0x32, 0x2B, 0x6F, 0x64, 0x6E, + 0x4B, 0x50, 0x69, 0x34, 0x77, 0x32, 0x72, 0x37, 0x38, 0x4E, 0x42, 0x63, 0x35, 0x78, 0x6A, 0x65, 0x61, 0x6D, 0x62, 0x78, 0x39, 0x73, 0x70, 0x6E, 0x46, 0x69, 0x78, 0x64, 0x6A, 0x51, 0x67, 0x33, 0x49, 0x4D, 0x0A, 0x38, 0x57, 0x63, 0x52, 0x69, + 0x51, 0x79, 0x63, 0x45, 0x30, 0x78, 0x79, 0x4E, 0x4E, 0x2B, 0x38, 0x31, 0x58, 0x48, 0x66, 0x71, 0x6E, 0x48, 0x64, 0x34, 0x62, 0x6C, 0x73, 0x6A, 0x44, 0x77, 0x53, 0x58, 0x57, 0x58, 0x61, 0x76, 0x56, 0x63, 0x53, 0x74, 0x6B, 0x4E, 0x72, 0x2F, + 0x2B, 0x58, 0x65, 0x54, 0x57, 0x59, 0x52, 0x55, 0x63, 0x2B, 0x5A, 0x72, 0x75, 0x77, 0x58, 0x74, 0x75, 0x68, 0x78, 0x6B, 0x59, 0x7A, 0x65, 0x53, 0x66, 0x37, 0x64, 0x4E, 0x58, 0x47, 0x69, 0x0A, 0x46, 0x53, 0x65, 0x55, 0x48, 0x4D, 0x39, 0x68, + 0x34, 0x79, 0x61, 0x37, 0x62, 0x36, 0x4E, 0x6E, 0x4A, 0x53, 0x46, 0x64, 0x35, 0x74, 0x30, 0x64, 0x43, 0x79, 0x35, 0x6F, 0x47, 0x7A, 0x75, 0x43, 0x72, 0x2B, 0x79, 0x44, 0x5A, 0x34, 0x58, 0x55, 0x6D, 0x46, 0x46, 0x30, 0x73, 0x62, 0x6D, 0x5A, + 0x67, 0x49, 0x6E, 0x2F, 0x66, 0x33, 0x67, 0x5A, 0x58, 0x48, 0x6C, 0x4B, 0x59, 0x43, 0x36, 0x53, 0x51, 0x4B, 0x35, 0x4D, 0x4E, 0x79, 0x6F, 0x73, 0x79, 0x63, 0x64, 0x69, 0x0A, 0x79, 0x41, 0x35, 0x64, 0x39, 0x7A, 0x5A, 0x62, 0x79, 0x75, 0x41, + 0x6C, 0x4A, 0x51, 0x47, 0x30, 0x33, 0x52, 0x6F, 0x48, 0x6E, 0x48, 0x63, 0x41, 0x50, 0x39, 0x44, 0x63, 0x31, 0x65, 0x77, 0x39, 0x31, 0x50, 0x71, 0x37, 0x50, 0x38, 0x79, 0x46, 0x31, 0x6D, 0x39, 0x2F, 0x71, 0x53, 0x33, 0x66, 0x75, 0x51, 0x4C, + 0x33, 0x39, 0x5A, 0x65, 0x61, 0x74, 0x54, 0x58, 0x61, 0x77, 0x32, 0x65, 0x77, 0x68, 0x30, 0x71, 0x70, 0x4B, 0x4A, 0x34, 0x6A, 0x6A, 0x76, 0x39, 0x63, 0x0A, 0x4A, 0x32, 0x76, 0x68, 0x73, 0x45, 0x2F, 0x7A, 0x42, 0x2B, 0x34, 0x41, 0x4C, 0x74, + 0x52, 0x5A, 0x68, 0x38, 0x74, 0x53, 0x51, 0x5A, 0x58, 0x71, 0x39, 0x45, 0x66, 0x58, 0x37, 0x6D, 0x52, 0x42, 0x56, 0x58, 0x79, 0x4E, 0x57, 0x51, 0x4B, 0x56, 0x33, 0x57, 0x4B, 0x64, 0x77, 0x72, 0x6E, 0x75, 0x57, 0x69, 0x68, 0x30, 0x68, 0x4B, + 0x57, 0x62, 0x74, 0x35, 0x44, 0x48, 0x44, 0x41, 0x66, 0x66, 0x39, 0x59, 0x6B, 0x32, 0x64, 0x44, 0x4C, 0x57, 0x4B, 0x4D, 0x47, 0x77, 0x0A, 0x73, 0x41, 0x76, 0x67, 0x6E, 0x45, 0x7A, 0x44, 0x48, 0x4E, 0x62, 0x38, 0x34, 0x32, 0x6D, 0x31, 0x52, + 0x30, 0x61, 0x42, 0x4C, 0x36, 0x4B, 0x43, 0x71, 0x39, 0x4E, 0x6A, 0x52, 0x48, 0x44, 0x45, 0x6A, 0x66, 0x38, 0x74, 0x4D, 0x37, 0x71, 0x74, 0x6A, 0x33, 0x75, 0x31, 0x63, 0x49, 0x69, 0x75, 0x50, 0x68, 0x6E, 0x50, 0x51, 0x43, 0x6A, 0x59, 0x2F, + 0x4D, 0x69, 0x51, 0x75, 0x31, 0x32, 0x5A, 0x49, 0x76, 0x56, 0x53, 0x35, 0x6C, 0x6A, 0x46, 0x48, 0x34, 0x67, 0x78, 0x0A, 0x51, 0x2B, 0x36, 0x49, 0x48, 0x64, 0x66, 0x47, 0x6A, 0x6A, 0x78, 0x44, 0x61, 0x68, 0x32, 0x6E, 0x47, 0x4E, 0x35, 0x39, + 0x50, 0x52, 0x62, 0x78, 0x59, 0x76, 0x6E, 0x4B, 0x6B, 0x4B, 0x6A, 0x39, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, + 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x6A, 0x7A, 0x43, 0x43, 0x41, 0x68, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, + 0x41, 0x67, 0x49, 0x51, 0x58, 0x49, 0x75, 0x5A, 0x78, 0x56, 0x71, 0x55, 0x78, 0x64, 0x4A, 0x78, 0x56, 0x74, 0x37, 0x4E, 0x69, 0x59, 0x44, 0x4D, 0x4A, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, + 0x41, 0x7A, 0x43, 0x42, 0x69, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x0A, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6B, 0x35, + 0x6C, 0x64, 0x79, 0x42, 0x4B, 0x5A, 0x58, 0x4A, 0x7A, 0x5A, 0x58, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x30, 0x70, 0x6C, 0x63, 0x6E, 0x4E, 0x6C, 0x65, 0x53, 0x42, 0x44, 0x61, 0x58, 0x52, + 0x35, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x56, 0x55, 0x0A, 0x61, 0x47, 0x55, 0x67, 0x56, 0x56, 0x4E, 0x46, 0x55, 0x6C, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x35, 0x6C, 0x64, 0x48, + 0x64, 0x76, 0x63, 0x6D, 0x73, 0x78, 0x4C, 0x6A, 0x41, 0x73, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4A, 0x56, 0x56, 0x54, 0x52, 0x56, 0x4A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x51, 0x32, + 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x41, 0x77, 0x4D, + 0x6A, 0x41, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x43, 0x42, 0x69, 0x44, 0x45, 0x4C, 0x4D, + 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x0A, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6B, 0x35, 0x6C, 0x64, 0x79, 0x42, 0x4B, 0x5A, 0x58, 0x4A, 0x7A, + 0x5A, 0x58, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x30, 0x70, 0x6C, 0x63, 0x6E, 0x4E, 0x6C, 0x65, 0x53, 0x42, 0x44, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x52, 0x34, 0x77, 0x48, 0x41, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x56, 0x55, 0x0A, 0x61, 0x47, 0x55, 0x67, 0x56, 0x56, 0x4E, 0x46, 0x55, 0x6C, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x35, 0x6C, 0x64, 0x48, 0x64, 0x76, 0x63, 0x6D, 0x73, 0x78, 0x4C, 0x6A, 0x41, + 0x73, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4A, 0x56, 0x56, 0x54, 0x52, 0x56, 0x4A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, + 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, + 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, 0x61, 0x72, 0x46, 0x52, 0x61, 0x71, 0x66, 0x6C, 0x6F, 0x49, 0x2B, 0x64, 0x36, 0x31, 0x53, 0x52, 0x76, 0x55, 0x38, 0x5A, 0x61, 0x32, 0x45, 0x75, 0x72, 0x78, 0x74, + 0x57, 0x32, 0x0A, 0x30, 0x65, 0x5A, 0x7A, 0x63, 0x61, 0x37, 0x64, 0x6E, 0x4E, 0x59, 0x4D, 0x59, 0x66, 0x33, 0x62, 0x6F, 0x49, 0x6B, 0x44, 0x75, 0x41, 0x55, 0x55, 0x37, 0x46, 0x66, 0x4F, 0x37, 0x6C, 0x30, 0x2F, 0x34, 0x69, 0x47, 0x7A, 0x7A, + 0x76, 0x66, 0x55, 0x69, 0x6E, 0x6E, 0x67, 0x6F, 0x34, 0x4E, 0x2B, 0x4C, 0x5A, 0x66, 0x51, 0x59, 0x63, 0x54, 0x78, 0x6D, 0x64, 0x77, 0x6C, 0x6B, 0x57, 0x4F, 0x72, 0x66, 0x7A, 0x43, 0x6A, 0x74, 0x48, 0x44, 0x69, 0x78, 0x36, 0x45, 0x7A, 0x0A, + 0x6E, 0x50, 0x4F, 0x2F, 0x4C, 0x6C, 0x78, 0x54, 0x73, 0x56, 0x2B, 0x7A, 0x66, 0x54, 0x4A, 0x2F, 0x69, 0x6A, 0x54, 0x6A, 0x65, 0x58, 0x6D, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, + 0x42, 0x42, 0x51, 0x36, 0x34, 0x51, 0x6D, 0x47, 0x31, 0x4D, 0x38, 0x5A, 0x77, 0x70, 0x5A, 0x32, 0x64, 0x45, 0x6C, 0x32, 0x33, 0x4F, 0x41, 0x31, 0x78, 0x6D, 0x4E, 0x6A, 0x6D, 0x6A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x38, + 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4B, 0x42, 0x67, 0x67, + 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x41, 0x32, 0x5A, 0x36, 0x45, 0x57, 0x43, 0x4E, 0x7A, 0x6B, 0x6C, 0x77, 0x42, 0x42, 0x0A, 0x48, 0x55, 0x36, 0x2B, 0x34, 0x57, + 0x4D, 0x42, 0x7A, 0x7A, 0x75, 0x71, 0x51, 0x68, 0x46, 0x6B, 0x6F, 0x4A, 0x32, 0x55, 0x4F, 0x51, 0x49, 0x52, 0x65, 0x56, 0x78, 0x37, 0x48, 0x66, 0x70, 0x6B, 0x75, 0x65, 0x34, 0x57, 0x51, 0x72, 0x4F, 0x2F, 0x69, 0x73, 0x49, 0x4A, 0x78, 0x4F, + 0x7A, 0x6B, 0x73, 0x55, 0x30, 0x43, 0x4D, 0x51, 0x44, 0x70, 0x4B, 0x6D, 0x46, 0x48, 0x6A, 0x46, 0x4A, 0x4B, 0x53, 0x30, 0x34, 0x59, 0x63, 0x50, 0x62, 0x57, 0x52, 0x4E, 0x5A, 0x75, 0x0A, 0x39, 0x59, 0x4F, 0x36, 0x62, 0x56, 0x69, 0x39, 0x4A, + 0x4E, 0x6C, 0x57, 0x53, 0x4F, 0x72, 0x76, 0x78, 0x4B, 0x4A, 0x47, 0x67, 0x59, 0x68, 0x71, 0x4F, 0x6B, 0x62, 0x52, 0x71, 0x5A, 0x74, 0x4E, 0x79, 0x57, 0x48, 0x61, 0x30, 0x56, 0x31, 0x58, 0x61, 0x68, 0x67, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x52, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x48, 0x6A, 0x43, 0x43, 0x41, 0x61, 0x53, 0x67, 0x41, + 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, 0x59, 0x46, 0x6C, 0x4A, 0x34, 0x43, 0x59, 0x75, 0x75, 0x31, 0x58, 0x35, 0x43, 0x6E, 0x65, 0x4B, 0x63, 0x66, 0x6C, 0x4B, 0x32, 0x47, 0x77, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, + 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x55, 0x44, 0x45, 0x6B, 0x4D, 0x43, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x62, 0x0A, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x46, + 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x46, 0x49, 0x31, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x70, 0x48, 0x62, 0x47, 0x39, 0x69, + 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x45, 0x77, 0x70, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x4D, 0x42, 0x34, + 0x58, 0x44, 0x54, 0x45, 0x79, 0x4D, 0x54, 0x45, 0x78, 0x4D, 0x7A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x34, 0x4D, 0x44, 0x45, 0x78, 0x4F, 0x54, 0x41, 0x7A, 0x4D, 0x54, 0x51, 0x77, 0x4E, 0x31, 0x6F, + 0x77, 0x55, 0x44, 0x45, 0x6B, 0x4D, 0x43, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x62, 0x0A, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, + 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x46, 0x49, 0x31, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x70, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, + 0x64, 0x75, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x45, 0x77, 0x70, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, 0x59, 0x48, 0x4B, + 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x52, 0x30, 0x55, 0x4F, 0x6C, 0x76, 0x74, 0x39, 0x58, 0x62, 0x2F, 0x70, 0x4F, 0x64, 0x45, 0x68, 0x2B, + 0x4A, 0x38, 0x4C, 0x74, 0x74, 0x56, 0x37, 0x48, 0x70, 0x49, 0x36, 0x0A, 0x53, 0x46, 0x6B, 0x63, 0x38, 0x47, 0x49, 0x78, 0x4C, 0x63, 0x42, 0x36, 0x4B, 0x50, 0x34, 0x61, 0x70, 0x31, 0x79, 0x7A, 0x74, 0x73, 0x79, 0x58, 0x35, 0x30, 0x58, 0x55, + 0x57, 0x50, 0x72, 0x52, 0x64, 0x32, 0x31, 0x44, 0x6F, 0x73, 0x43, 0x48, 0x5A, 0x54, 0x51, 0x4B, 0x48, 0x33, 0x72, 0x64, 0x36, 0x7A, 0x77, 0x7A, 0x6F, 0x63, 0x57, 0x64, 0x54, 0x61, 0x52, 0x76, 0x51, 0x5A, 0x55, 0x34, 0x66, 0x38, 0x6B, 0x65, + 0x68, 0x4F, 0x76, 0x52, 0x6E, 0x6B, 0x6D, 0x53, 0x0A, 0x68, 0x35, 0x53, 0x48, 0x44, 0x44, 0x71, 0x46, 0x53, 0x6D, 0x61, 0x66, 0x6E, 0x56, 0x6D, 0x54, 0x54, 0x5A, 0x64, 0x68, 0x42, 0x6F, 0x5A, 0x4B, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, + 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, + 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x50, 0x65, 0x59, 0x70, 0x53, 0x4A, 0x76, 0x71, 0x42, 0x38, 0x6F, 0x68, 0x52, 0x45, 0x6F, 0x6D, 0x33, 0x6D, 0x37, 0x65, 0x30, 0x6F, + 0x50, 0x51, 0x6E, 0x31, 0x6B, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x78, 0x41, 0x4F, 0x56, 0x70, 0x45, 0x73, 0x6C, 0x75, 0x32, 0x38, + 0x59, 0x78, 0x0A, 0x75, 0x67, 0x6C, 0x42, 0x34, 0x5A, 0x66, 0x34, 0x2B, 0x2F, 0x32, 0x61, 0x34, 0x6E, 0x30, 0x53, 0x79, 0x65, 0x31, 0x38, 0x5A, 0x4E, 0x50, 0x4C, 0x42, 0x53, 0x57, 0x4C, 0x56, 0x74, 0x6D, 0x67, 0x35, 0x31, 0x35, 0x64, 0x54, + 0x67, 0x75, 0x44, 0x6E, 0x46, 0x74, 0x32, 0x4B, 0x61, 0x41, 0x4A, 0x4A, 0x69, 0x46, 0x71, 0x59, 0x67, 0x49, 0x77, 0x63, 0x64, 0x4B, 0x31, 0x6A, 0x31, 0x7A, 0x71, 0x4F, 0x2B, 0x46, 0x34, 0x43, 0x59, 0x57, 0x6F, 0x64, 0x5A, 0x49, 0x37, 0x0A, + 0x79, 0x46, 0x7A, 0x39, 0x53, 0x4F, 0x38, 0x4E, 0x64, 0x43, 0x4B, 0x6F, 0x43, 0x4F, 0x4A, 0x75, 0x78, 0x55, 0x6E, 0x4F, 0x78, 0x77, 0x79, 0x38, 0x70, 0x32, 0x46, 0x70, 0x38, 0x66, 0x63, 0x37, 0x34, 0x53, 0x72, 0x4C, 0x2B, 0x53, 0x76, 0x7A, + 0x5A, 0x70, 0x41, 0x33, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x49, 0x64, 0x65, 0x6E, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x20, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x59, 0x44, 0x43, 0x43, 0x41, 0x30, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x67, 0x46, 0x43, 0x67, 0x41, 0x41, 0x41, 0x41, 0x55, 0x55, 0x6A, 0x79, 0x45, 0x53, 0x31, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x4B, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, + 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x53, 0x57, 0x52, 0x6C, 0x62, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, + 0x51, 0x51, 0x44, 0x45, 0x78, 0x35, 0x4A, 0x5A, 0x47, 0x56, 0x75, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x51, 0x32, 0x39, 0x74, 0x62, 0x57, 0x56, 0x79, 0x59, 0x32, 0x6C, 0x68, 0x62, 0x43, 0x42, 0x53, 0x0A, 0x62, 0x32, 0x39, 0x30, + 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x45, 0x32, 0x4D, 0x54, 0x67, 0x78, 0x4D, 0x6A, 0x49, 0x7A, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x51, 0x77, 0x4D, 0x54, 0x45, 0x32, + 0x4D, 0x54, 0x67, 0x78, 0x4D, 0x6A, 0x49, 0x7A, 0x57, 0x6A, 0x42, 0x4B, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x53, 0x0A, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x53, 0x57, 0x52, 0x6C, 0x62, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x35, 0x4A, 0x5A, 0x47, 0x56, 0x75, 0x56, 0x48, 0x4A, + 0x31, 0x63, 0x33, 0x51, 0x67, 0x51, 0x32, 0x39, 0x74, 0x62, 0x57, 0x56, 0x79, 0x59, 0x32, 0x6C, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x0A, 0x49, 0x44, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, + 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x6E, 0x55, 0x42, + 0x6E, 0x65, 0x50, 0x35, 0x6B, 0x39, 0x31, 0x44, 0x4E, 0x47, 0x38, 0x57, 0x39, 0x52, 0x59, 0x59, 0x4B, 0x79, 0x71, 0x55, 0x2B, 0x50, 0x5A, 0x34, 0x6C, 0x64, 0x0A, 0x68, 0x4E, 0x6C, 0x54, 0x33, 0x51, 0x77, 0x6F, 0x32, 0x64, 0x66, 0x77, 0x2F, + 0x36, 0x36, 0x56, 0x51, 0x33, 0x4B, 0x5A, 0x2B, 0x62, 0x56, 0x64, 0x66, 0x49, 0x72, 0x42, 0x51, 0x75, 0x45, 0x78, 0x55, 0x48, 0x54, 0x52, 0x67, 0x51, 0x31, 0x38, 0x7A, 0x5A, 0x73, 0x68, 0x71, 0x30, 0x50, 0x69, 0x72, 0x4B, 0x31, 0x65, 0x68, + 0x6D, 0x37, 0x7A, 0x43, 0x59, 0x6F, 0x66, 0x57, 0x6A, 0x4B, 0x39, 0x6F, 0x75, 0x75, 0x55, 0x2B, 0x65, 0x68, 0x63, 0x43, 0x75, 0x7A, 0x2F, 0x0A, 0x6D, 0x4E, 0x4B, 0x76, 0x63, 0x62, 0x4F, 0x30, 0x55, 0x35, 0x39, 0x4F, 0x68, 0x2B, 0x2B, 0x53, + 0x76, 0x4C, 0x33, 0x73, 0x54, 0x7A, 0x49, 0x77, 0x69, 0x45, 0x73, 0x58, 0x58, 0x6C, 0x66, 0x45, 0x55, 0x38, 0x4C, 0x32, 0x41, 0x70, 0x65, 0x4E, 0x32, 0x57, 0x49, 0x72, 0x76, 0x79, 0x51, 0x66, 0x59, 0x6F, 0x33, 0x66, 0x77, 0x37, 0x67, 0x70, + 0x53, 0x30, 0x6C, 0x34, 0x50, 0x4A, 0x4E, 0x67, 0x69, 0x43, 0x4C, 0x38, 0x6D, 0x64, 0x6F, 0x32, 0x79, 0x4D, 0x4B, 0x69, 0x0A, 0x31, 0x43, 0x78, 0x55, 0x41, 0x47, 0x63, 0x31, 0x62, 0x6E, 0x4F, 0x2F, 0x41, 0x6C, 0x6A, 0x77, 0x70, 0x4E, 0x33, + 0x6C, 0x73, 0x4B, 0x49, 0x6D, 0x65, 0x73, 0x72, 0x67, 0x4E, 0x71, 0x55, 0x5A, 0x46, 0x76, 0x58, 0x39, 0x74, 0x2B, 0x2B, 0x75, 0x50, 0x30, 0x44, 0x31, 0x62, 0x56, 0x6F, 0x45, 0x2F, 0x63, 0x34, 0x30, 0x79, 0x69, 0x54, 0x63, 0x64, 0x43, 0x4D, + 0x62, 0x58, 0x54, 0x4D, 0x54, 0x45, 0x6C, 0x33, 0x45, 0x41, 0x53, 0x58, 0x32, 0x4D, 0x4E, 0x30, 0x43, 0x0A, 0x58, 0x5A, 0x2F, 0x67, 0x31, 0x55, 0x65, 0x39, 0x74, 0x4F, 0x73, 0x62, 0x6F, 0x62, 0x74, 0x4A, 0x53, 0x64, 0x69, 0x66, 0x57, 0x77, + 0x4C, 0x7A, 0x69, 0x75, 0x51, 0x6B, 0x6B, 0x4F, 0x52, 0x69, 0x54, 0x30, 0x2F, 0x42, 0x72, 0x34, 0x73, 0x4F, 0x64, 0x42, 0x65, 0x6F, 0x30, 0x58, 0x4B, 0x49, 0x61, 0x6E, 0x6F, 0x42, 0x53, 0x63, 0x79, 0x30, 0x52, 0x6E, 0x6E, 0x47, 0x46, 0x37, + 0x48, 0x61, 0x6D, 0x42, 0x34, 0x48, 0x57, 0x66, 0x70, 0x31, 0x49, 0x59, 0x56, 0x6C, 0x0A, 0x33, 0x5A, 0x42, 0x57, 0x7A, 0x76, 0x75, 0x72, 0x70, 0x57, 0x43, 0x64, 0x78, 0x4A, 0x33, 0x35, 0x55, 0x72, 0x43, 0x4C, 0x76, 0x59, 0x66, 0x35, 0x6A, + 0x79, 0x73, 0x6A, 0x43, 0x69, 0x4E, 0x32, 0x4F, 0x2F, 0x63, 0x7A, 0x34, 0x63, 0x6B, 0x41, 0x38, 0x32, 0x6E, 0x35, 0x53, 0x36, 0x4C, 0x67, 0x54, 0x72, 0x78, 0x2B, 0x6B, 0x7A, 0x6D, 0x45, 0x42, 0x2F, 0x64, 0x45, 0x63, 0x48, 0x37, 0x2B, 0x42, + 0x31, 0x72, 0x6C, 0x73, 0x61, 0x7A, 0x52, 0x47, 0x4D, 0x7A, 0x79, 0x0A, 0x4E, 0x65, 0x56, 0x4A, 0x53, 0x51, 0x6A, 0x4B, 0x56, 0x73, 0x6B, 0x39, 0x2B, 0x77, 0x38, 0x59, 0x66, 0x59, 0x73, 0x37, 0x77, 0x52, 0x50, 0x43, 0x54, 0x59, 0x2F, 0x4A, + 0x54, 0x77, 0x34, 0x33, 0x36, 0x52, 0x2B, 0x68, 0x44, 0x6D, 0x72, 0x66, 0x59, 0x69, 0x37, 0x4C, 0x4E, 0x51, 0x5A, 0x52, 0x65, 0x53, 0x7A, 0x49, 0x4A, 0x54, 0x6A, 0x30, 0x2B, 0x6B, 0x75, 0x6E, 0x69, 0x56, 0x79, 0x63, 0x30, 0x75, 0x4D, 0x4E, + 0x4F, 0x59, 0x5A, 0x4B, 0x64, 0x48, 0x7A, 0x56, 0x0A, 0x57, 0x59, 0x66, 0x43, 0x50, 0x30, 0x34, 0x4D, 0x58, 0x46, 0x4C, 0x30, 0x50, 0x66, 0x64, 0x53, 0x67, 0x76, 0x48, 0x71, 0x6F, 0x36, 0x7A, 0x39, 0x53, 0x54, 0x51, 0x61, 0x4B, 0x50, 0x4E, + 0x42, 0x69, 0x44, 0x6F, 0x54, 0x37, 0x75, 0x6A, 0x65, 0x2F, 0x35, 0x6B, 0x64, 0x58, 0x37, 0x72, 0x4C, 0x36, 0x42, 0x37, 0x79, 0x75, 0x56, 0x42, 0x67, 0x77, 0x44, 0x48, 0x54, 0x63, 0x2B, 0x58, 0x76, 0x76, 0x71, 0x44, 0x74, 0x4D, 0x77, 0x74, + 0x30, 0x76, 0x69, 0x41, 0x67, 0x0A, 0x78, 0x47, 0x64, 0x73, 0x38, 0x41, 0x67, 0x44, 0x65, 0x6C, 0x57, 0x41, 0x66, 0x30, 0x5A, 0x4F, 0x6C, 0x71, 0x66, 0x30, 0x48, 0x6A, 0x37, 0x68, 0x39, 0x74, 0x67, 0x4A, 0x34, 0x54, 0x4E, 0x6B, 0x4B, 0x32, + 0x50, 0x58, 0x4D, 0x6C, 0x36, 0x66, 0x2B, 0x63, 0x42, 0x37, 0x44, 0x33, 0x68, 0x76, 0x6C, 0x37, 0x79, 0x54, 0x6D, 0x76, 0x6D, 0x63, 0x45, 0x70, 0x42, 0x34, 0x65, 0x6F, 0x43, 0x48, 0x46, 0x64, 0x64, 0x79, 0x64, 0x4A, 0x78, 0x56, 0x64, 0x48, + 0x69, 0x78, 0x0A, 0x75, 0x75, 0x46, 0x75, 0x63, 0x41, 0x53, 0x36, 0x54, 0x36, 0x43, 0x36, 0x61, 0x4D, 0x4E, 0x37, 0x2F, 0x7A, 0x48, 0x77, 0x63, 0x7A, 0x30, 0x39, 0x6C, 0x43, 0x71, 0x78, 0x43, 0x30, 0x45, 0x4F, 0x6F, 0x50, 0x35, 0x4E, 0x69, + 0x47, 0x56, 0x72, 0x65, 0x54, 0x4F, 0x30, 0x31, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, + 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, + 0x37, 0x55, 0x51, 0x5A, 0x77, 0x4E, 0x50, 0x77, 0x42, 0x6F, 0x76, 0x75, 0x70, 0x48, 0x75, 0x2B, 0x51, 0x75, 0x63, 0x6D, 0x56, 0x4D, 0x69, 0x4F, 0x4E, 0x6E, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, + 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x41, 0x32, 0x75, 0x6B, 0x44, 0x4C, 0x32, 0x70, 0x6B, 0x74, 0x38, 0x52, 0x48, 0x59, 0x5A, 0x59, 0x52, 0x34, 0x6E, 0x4B, 0x4D, 0x31, 0x65, 0x56, 0x4F, 0x38, + 0x6C, 0x76, 0x4F, 0x4D, 0x49, 0x6B, 0x50, 0x6B, 0x70, 0x31, 0x36, 0x35, 0x6F, 0x43, 0x4F, 0x47, 0x55, 0x41, 0x46, 0x6A, 0x76, 0x4C, 0x69, 0x35, 0x2B, 0x55, 0x31, 0x4B, 0x4D, 0x74, 0x6C, 0x77, 0x48, 0x0A, 0x36, 0x6F, 0x69, 0x36, 0x6D, 0x59, + 0x74, 0x51, 0x6C, 0x4E, 0x65, 0x43, 0x67, 0x4E, 0x39, 0x68, 0x43, 0x51, 0x43, 0x54, 0x72, 0x51, 0x30, 0x55, 0x35, 0x73, 0x37, 0x42, 0x38, 0x6A, 0x65, 0x55, 0x65, 0x4C, 0x42, 0x66, 0x6E, 0x4C, 0x4F, 0x69, 0x63, 0x37, 0x69, 0x50, 0x42, 0x5A, + 0x4D, 0x34, 0x7A, 0x59, 0x30, 0x2B, 0x73, 0x4C, 0x6A, 0x37, 0x77, 0x4D, 0x2B, 0x78, 0x38, 0x75, 0x77, 0x74, 0x4C, 0x52, 0x76, 0x4D, 0x37, 0x4B, 0x71, 0x61, 0x73, 0x36, 0x70, 0x67, 0x0A, 0x67, 0x68, 0x73, 0x74, 0x4F, 0x38, 0x4F, 0x45, 0x50, + 0x56, 0x65, 0x4B, 0x6C, 0x68, 0x36, 0x63, 0x64, 0x62, 0x6A, 0x54, 0x4D, 0x4D, 0x31, 0x67, 0x43, 0x49, 0x4F, 0x51, 0x30, 0x34, 0x35, 0x55, 0x38, 0x55, 0x31, 0x6D, 0x77, 0x46, 0x31, 0x30, 0x41, 0x30, 0x43, 0x6A, 0x37, 0x6F, 0x56, 0x2B, 0x77, + 0x68, 0x39, 0x33, 0x6E, 0x41, 0x62, 0x6F, 0x77, 0x61, 0x63, 0x59, 0x58, 0x56, 0x4B, 0x56, 0x37, 0x63, 0x6E, 0x64, 0x4A, 0x5A, 0x35, 0x74, 0x2B, 0x71, 0x6E, 0x74, 0x0A, 0x6F, 0x7A, 0x6F, 0x30, 0x30, 0x46, 0x6C, 0x37, 0x32, 0x75, 0x31, 0x51, + 0x38, 0x7A, 0x57, 0x2F, 0x37, 0x65, 0x73, 0x55, 0x54, 0x54, 0x48, 0x48, 0x59, 0x50, 0x54, 0x61, 0x38, 0x59, 0x65, 0x63, 0x34, 0x6B, 0x6A, 0x69, 0x78, 0x73, 0x55, 0x33, 0x2B, 0x77, 0x59, 0x51, 0x2B, 0x6E, 0x56, 0x5A, 0x5A, 0x6A, 0x46, 0x48, + 0x4B, 0x64, 0x70, 0x32, 0x6D, 0x68, 0x7A, 0x70, 0x67, 0x71, 0x37, 0x76, 0x6D, 0x72, 0x6C, 0x52, 0x39, 0x34, 0x67, 0x6A, 0x6D, 0x6D, 0x6D, 0x56, 0x0A, 0x59, 0x6A, 0x7A, 0x6C, 0x56, 0x59, 0x41, 0x32, 0x31, 0x31, 0x51, 0x43, 0x2F, 0x2F, 0x47, + 0x35, 0x58, 0x63, 0x37, 0x55, 0x49, 0x32, 0x2F, 0x59, 0x52, 0x59, 0x52, 0x4B, 0x57, 0x32, 0x58, 0x76, 0x69, 0x51, 0x7A, 0x64, 0x46, 0x4B, 0x63, 0x67, 0x79, 0x78, 0x69, 0x6C, 0x4A, 0x62, 0x51, 0x4E, 0x2B, 0x51, 0x48, 0x77, 0x6F, 0x74, 0x4C, + 0x30, 0x41, 0x4D, 0x68, 0x30, 0x6A, 0x71, 0x45, 0x71, 0x53, 0x49, 0x35, 0x6C, 0x32, 0x78, 0x50, 0x45, 0x34, 0x69, 0x55, 0x58, 0x0A, 0x66, 0x65, 0x75, 0x2B, 0x68, 0x31, 0x73, 0x58, 0x49, 0x46, 0x52, 0x52, 0x6B, 0x30, 0x70, 0x54, 0x41, 0x77, + 0x76, 0x73, 0x58, 0x63, 0x6F, 0x7A, 0x37, 0x57, 0x4C, 0x39, 0x52, 0x63, 0x63, 0x76, 0x57, 0x39, 0x78, 0x59, 0x6F, 0x49, 0x41, 0x35, 0x35, 0x76, 0x72, 0x58, 0x2F, 0x68, 0x4D, 0x55, 0x70, 0x75, 0x30, 0x39, 0x6C, 0x45, 0x70, 0x43, 0x64, 0x4E, + 0x54, 0x44, 0x64, 0x31, 0x6C, 0x7A, 0x7A, 0x59, 0x39, 0x47, 0x76, 0x6C, 0x55, 0x34, 0x37, 0x2F, 0x72, 0x6F, 0x0A, 0x6B, 0x54, 0x4C, 0x71, 0x6C, 0x31, 0x67, 0x45, 0x49, 0x74, 0x34, 0x34, 0x77, 0x38, 0x79, 0x38, 0x62, 0x63, 0x6B, 0x7A, 0x4F, + 0x6D, 0x6F, 0x4B, 0x61, 0x54, 0x2B, 0x67, 0x79, 0x4F, 0x70, 0x79, 0x6A, 0x34, 0x78, 0x6A, 0x68, 0x69, 0x4F, 0x39, 0x62, 0x54, 0x79, 0x57, 0x6E, 0x70, 0x58, 0x67, 0x53, 0x55, 0x79, 0x71, 0x6F, 0x72, 0x6B, 0x71, 0x47, 0x35, 0x77, 0x32, 0x67, + 0x58, 0x6A, 0x74, 0x77, 0x2B, 0x68, 0x47, 0x34, 0x69, 0x5A, 0x5A, 0x52, 0x48, 0x55, 0x65, 0x0A, 0x32, 0x58, 0x57, 0x4A, 0x55, 0x63, 0x30, 0x51, 0x68, 0x4A, 0x31, 0x68, 0x59, 0x4D, 0x74, 0x64, 0x2B, 0x5A, 0x63, 0x69, 0x54, 0x59, 0x36, 0x59, + 0x35, 0x75, 0x4E, 0x2F, 0x39, 0x6C, 0x75, 0x37, 0x72, 0x73, 0x33, 0x4B, 0x53, 0x6F, 0x46, 0x72, 0x58, 0x67, 0x76, 0x7A, 0x55, 0x65, 0x46, 0x30, 0x4B, 0x2B, 0x6C, 0x2B, 0x4A, 0x36, 0x66, 0x5A, 0x6D, 0x55, 0x6C, 0x4F, 0x2B, 0x4B, 0x57, 0x41, + 0x32, 0x79, 0x55, 0x50, 0x48, 0x47, 0x4E, 0x69, 0x69, 0x73, 0x6B, 0x7A, 0x0A, 0x5A, 0x32, 0x73, 0x38, 0x45, 0x49, 0x50, 0x47, 0x72, 0x64, 0x36, 0x6F, 0x7A, 0x52, 0x61, 0x4F, 0x6A, 0x66, 0x41, 0x48, 0x4E, 0x33, 0x47, 0x66, 0x38, 0x71, 0x76, + 0x38, 0x51, 0x66, 0x58, 0x42, 0x69, 0x2B, 0x77, 0x41, 0x4E, 0x31, 0x30, 0x4A, 0x35, 0x55, 0x36, 0x41, 0x37, 0x2F, 0x71, 0x78, 0x58, 0x44, 0x67, 0x47, 0x70, 0x52, 0x74, 0x4B, 0x34, 0x64, 0x77, 0x34, 0x4C, 0x54, 0x7A, 0x63, 0x71, 0x78, 0x2B, + 0x51, 0x47, 0x74, 0x56, 0x4B, 0x6E, 0x4F, 0x37, 0x52, 0x0A, 0x63, 0x47, 0x7A, 0x4D, 0x37, 0x76, 0x52, 0x58, 0x2B, 0x42, 0x69, 0x36, 0x68, 0x47, 0x36, 0x48, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x49, 0x64, 0x65, 0x6E, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x53, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x5A, 0x6A, 0x43, 0x43, 0x41, 0x30, + 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x67, 0x46, 0x43, 0x67, 0x41, 0x41, 0x41, 0x41, 0x55, 0x55, 0x6A, 0x7A, 0x30, 0x5A, 0x38, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, + 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x4E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x53, 0x57, 0x52, 0x6C, 0x62, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x53, 0x6F, 0x77, 0x4B, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x46, 0x4A, 0x5A, 0x47, 0x56, 0x75, 0x56, + 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x48, 0x56, 0x69, 0x62, 0x47, 0x6C, 0x6A, 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x52, 0x76, 0x0A, 0x63, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x45, 0x77, + 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x45, 0x32, 0x4D, 0x54, 0x63, 0x31, 0x4D, 0x7A, 0x4D, 0x79, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x51, 0x77, 0x4D, 0x54, 0x45, 0x32, 0x4D, 0x54, 0x63, 0x31, 0x4D, 0x7A, 0x4D, 0x79, + 0x57, 0x6A, 0x42, 0x4E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x53, 0x57, 0x52, + 0x6C, 0x62, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4D, 0x53, 0x6F, 0x77, 0x4B, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x46, 0x4A, 0x5A, 0x47, 0x56, 0x75, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x48, 0x56, + 0x69, 0x62, 0x47, 0x6C, 0x6A, 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x52, 0x76, 0x63, 0x69, 0x42, 0x53, 0x0A, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, + 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x32, 0x49, 0x70, 0x54, 0x38, 0x70, 0x45, + 0x69, 0x76, 0x36, 0x45, 0x64, 0x72, 0x43, 0x76, 0x73, 0x6E, 0x64, 0x75, 0x54, 0x79, 0x0A, 0x50, 0x34, 0x6F, 0x37, 0x65, 0x6B, 0x6F, 0x73, 0x4D, 0x53, 0x71, 0x4D, 0x6A, 0x62, 0x43, 0x70, 0x77, 0x7A, 0x46, 0x72, 0x71, 0x48, 0x64, 0x32, 0x68, + 0x43, 0x61, 0x32, 0x72, 0x49, 0x46, 0x43, 0x44, 0x51, 0x6A, 0x72, 0x56, 0x56, 0x69, 0x37, 0x65, 0x76, 0x69, 0x38, 0x5A, 0x58, 0x33, 0x79, 0x6F, 0x47, 0x32, 0x4C, 0x71, 0x45, 0x66, 0x70, 0x59, 0x6E, 0x59, 0x65, 0x45, 0x65, 0x34, 0x49, 0x46, + 0x4E, 0x47, 0x79, 0x52, 0x42, 0x62, 0x30, 0x36, 0x74, 0x44, 0x36, 0x0A, 0x48, 0x69, 0x39, 0x65, 0x32, 0x38, 0x74, 0x7A, 0x51, 0x61, 0x36, 0x38, 0x41, 0x4C, 0x42, 0x4B, 0x4B, 0x30, 0x43, 0x79, 0x72, 0x4F, 0x45, 0x37, 0x53, 0x38, 0x49, 0x74, + 0x6E, 0x65, 0x53, 0x68, 0x6D, 0x2B, 0x77, 0x61, 0x4F, 0x68, 0x37, 0x77, 0x43, 0x4C, 0x50, 0x51, 0x35, 0x43, 0x51, 0x31, 0x42, 0x35, 0x2B, 0x63, 0x74, 0x4D, 0x6C, 0x53, 0x62, 0x64, 0x73, 0x48, 0x79, 0x6F, 0x2B, 0x31, 0x57, 0x2F, 0x43, 0x44, + 0x38, 0x30, 0x2F, 0x48, 0x4C, 0x61, 0x58, 0x49, 0x0A, 0x72, 0x63, 0x75, 0x56, 0x49, 0x4B, 0x51, 0x78, 0x4B, 0x46, 0x64, 0x59, 0x57, 0x75, 0x53, 0x4E, 0x47, 0x35, 0x71, 0x72, 0x6E, 0x67, 0x30, 0x4D, 0x38, 0x67, 0x6F, 0x7A, 0x4F, 0x53, 0x49, + 0x35, 0x43, 0x70, 0x63, 0x75, 0x38, 0x31, 0x4E, 0x33, 0x75, 0x55, 0x52, 0x46, 0x2F, 0x59, 0x54, 0x4C, 0x4E, 0x69, 0x43, 0x42, 0x57, 0x53, 0x32, 0x61, 0x62, 0x32, 0x31, 0x49, 0x53, 0x47, 0x48, 0x4B, 0x54, 0x4E, 0x39, 0x54, 0x30, 0x61, 0x39, + 0x53, 0x76, 0x45, 0x53, 0x66, 0x0A, 0x71, 0x79, 0x39, 0x72, 0x67, 0x33, 0x4C, 0x76, 0x64, 0x59, 0x44, 0x61, 0x42, 0x6A, 0x4D, 0x62, 0x58, 0x63, 0x6A, 0x61, 0x59, 0x38, 0x5A, 0x4E, 0x7A, 0x61, 0x78, 0x6D, 0x4D, 0x63, 0x33, 0x52, 0x33, 0x6A, + 0x36, 0x48, 0x45, 0x44, 0x62, 0x68, 0x75, 0x61, 0x52, 0x36, 0x37, 0x32, 0x42, 0x51, 0x73, 0x73, 0x76, 0x4B, 0x70, 0x6C, 0x62, 0x67, 0x4E, 0x36, 0x2B, 0x72, 0x4E, 0x42, 0x4D, 0x35, 0x4A, 0x65, 0x67, 0x35, 0x5A, 0x75, 0x53, 0x59, 0x65, 0x71, + 0x6F, 0x53, 0x0A, 0x6D, 0x4A, 0x78, 0x5A, 0x5A, 0x6F, 0x59, 0x2B, 0x72, 0x66, 0x47, 0x77, 0x79, 0x6A, 0x34, 0x47, 0x44, 0x33, 0x76, 0x77, 0x45, 0x55, 0x73, 0x33, 0x6F, 0x45, 0x52, 0x74, 0x65, 0x38, 0x75, 0x6F, 0x6A, 0x48, 0x48, 0x30, 0x31, + 0x62, 0x57, 0x52, 0x4E, 0x73, 0x7A, 0x77, 0x46, 0x63, 0x59, 0x72, 0x33, 0x6C, 0x45, 0x58, 0x73, 0x5A, 0x64, 0x4D, 0x55, 0x44, 0x32, 0x78, 0x6C, 0x56, 0x6C, 0x38, 0x42, 0x58, 0x30, 0x74, 0x49, 0x64, 0x55, 0x41, 0x76, 0x77, 0x46, 0x6E, 0x0A, + 0x6F, 0x6C, 0x35, 0x37, 0x70, 0x6C, 0x7A, 0x79, 0x39, 0x79, 0x4C, 0x78, 0x6B, 0x41, 0x32, 0x54, 0x32, 0x36, 0x70, 0x45, 0x55, 0x57, 0x62, 0x4D, 0x66, 0x58, 0x59, 0x44, 0x36, 0x32, 0x71, 0x6F, 0x4B, 0x6A, 0x67, 0x5A, 0x6C, 0x33, 0x59, 0x4E, + 0x61, 0x34, 0x70, 0x68, 0x2B, 0x62, 0x7A, 0x32, 0x37, 0x6E, 0x62, 0x39, 0x63, 0x43, 0x76, 0x64, 0x4B, 0x54, 0x7A, 0x34, 0x43, 0x68, 0x35, 0x62, 0x51, 0x68, 0x79, 0x4C, 0x56, 0x69, 0x39, 0x56, 0x47, 0x78, 0x79, 0x68, 0x0A, 0x4C, 0x72, 0x58, + 0x48, 0x46, 0x75, 0x62, 0x34, 0x71, 0x6A, 0x79, 0x53, 0x6A, 0x6D, 0x6D, 0x32, 0x41, 0x63, 0x47, 0x31, 0x68, 0x70, 0x32, 0x4A, 0x44, 0x77, 0x73, 0x34, 0x6C, 0x46, 0x54, 0x6F, 0x36, 0x74, 0x79, 0x65, 0x50, 0x53, 0x57, 0x38, 0x55, 0x79, 0x62, + 0x74, 0x31, 0x61, 0x73, 0x35, 0x71, 0x73, 0x56, 0x41, 0x54, 0x46, 0x53, 0x72, 0x73, 0x72, 0x54, 0x5A, 0x32, 0x66, 0x6A, 0x58, 0x63, 0x74, 0x73, 0x63, 0x76, 0x47, 0x32, 0x39, 0x5A, 0x56, 0x2F, 0x76, 0x0A, 0x69, 0x44, 0x55, 0x71, 0x5A, 0x69, + 0x2F, 0x75, 0x39, 0x72, 0x4E, 0x6C, 0x38, 0x44, 0x4F, 0x4E, 0x66, 0x4A, 0x68, 0x42, 0x61, 0x55, 0x59, 0x50, 0x51, 0x78, 0x78, 0x70, 0x2B, 0x70, 0x75, 0x31, 0x30, 0x47, 0x46, 0x71, 0x7A, 0x63, 0x70, 0x4C, 0x32, 0x55, 0x79, 0x51, 0x52, 0x71, + 0x73, 0x56, 0x57, 0x61, 0x46, 0x48, 0x56, 0x43, 0x6B, 0x75, 0x67, 0x79, 0x68, 0x66, 0x48, 0x4D, 0x4B, 0x69, 0x71, 0x33, 0x49, 0x58, 0x41, 0x41, 0x61, 0x4F, 0x52, 0x65, 0x79, 0x4C, 0x0A, 0x34, 0x6A, 0x4D, 0x39, 0x66, 0x39, 0x6F, 0x5A, 0x52, + 0x4F, 0x52, 0x69, 0x63, 0x73, 0x50, 0x66, 0x49, 0x73, 0x62, 0x79, 0x56, 0x74, 0x54, 0x64, 0x58, 0x35, 0x56, 0x79, 0x37, 0x57, 0x31, 0x66, 0x39, 0x30, 0x67, 0x44, 0x57, 0x2F, 0x33, 0x46, 0x4B, 0x71, 0x44, 0x32, 0x63, 0x79, 0x4F, 0x45, 0x45, + 0x42, 0x73, 0x42, 0x35, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x0A, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, + 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x34, 0x33, 0x48, 0x67, + 0x6E, 0x74, 0x69, 0x6E, 0x51, 0x74, 0x6E, 0x62, 0x63, 0x5A, 0x46, 0x72, 0x6C, 0x4A, 0x50, 0x72, 0x77, 0x36, 0x50, 0x52, 0x46, 0x4B, 0x4D, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, + 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x45, 0x66, 0x36, 0x33, 0x51, 0x71, 0x77, 0x45, 0x5A, 0x45, 0x34, 0x72, 0x55, 0x31, 0x64, 0x39, 0x2B, 0x55, 0x4F, 0x6C, 0x31, 0x51, 0x5A, 0x67, 0x6B, 0x69, 0x48, 0x56, 0x49, 0x79, + 0x71, 0x5A, 0x4A, 0x6E, 0x59, 0x57, 0x76, 0x36, 0x49, 0x41, 0x63, 0x56, 0x59, 0x70, 0x5A, 0x6D, 0x78, 0x49, 0x31, 0x51, 0x6A, 0x0A, 0x74, 0x32, 0x6F, 0x64, 0x49, 0x46, 0x66, 0x6C, 0x41, 0x57, 0x4A, 0x42, 0x46, 0x39, 0x4D, 0x4A, 0x32, 0x33, + 0x58, 0x4C, 0x62, 0x6C, 0x53, 0x51, 0x64, 0x66, 0x34, 0x61, 0x6E, 0x34, 0x45, 0x4B, 0x77, 0x74, 0x33, 0x58, 0x39, 0x77, 0x6E, 0x51, 0x57, 0x33, 0x49, 0x56, 0x35, 0x42, 0x34, 0x4A, 0x61, 0x6A, 0x30, 0x7A, 0x38, 0x79, 0x47, 0x61, 0x35, 0x68, + 0x56, 0x2B, 0x72, 0x56, 0x48, 0x56, 0x44, 0x52, 0x44, 0x74, 0x66, 0x55, 0x4C, 0x41, 0x6A, 0x2B, 0x37, 0x41, 0x0A, 0x6D, 0x67, 0x6A, 0x56, 0x51, 0x64, 0x5A, 0x63, 0x44, 0x69, 0x46, 0x70, 0x62, 0x6F, 0x42, 0x68, 0x44, 0x68, 0x58, 0x41, 0x75, + 0x4D, 0x2F, 0x46, 0x53, 0x52, 0x4A, 0x53, 0x7A, 0x4C, 0x34, 0x36, 0x7A, 0x4E, 0x51, 0x75, 0x4F, 0x41, 0x58, 0x65, 0x4E, 0x66, 0x30, 0x66, 0x62, 0x37, 0x69, 0x41, 0x61, 0x4A, 0x67, 0x39, 0x54, 0x61, 0x44, 0x4B, 0x51, 0x47, 0x58, 0x53, 0x63, + 0x33, 0x7A, 0x31, 0x69, 0x39, 0x6B, 0x4B, 0x6C, 0x54, 0x2F, 0x59, 0x50, 0x79, 0x4E, 0x74, 0x0A, 0x47, 0x74, 0x45, 0x71, 0x4A, 0x42, 0x6E, 0x5A, 0x68, 0x62, 0x4D, 0x58, 0x37, 0x33, 0x68, 0x75, 0x71, 0x56, 0x6A, 0x52, 0x49, 0x39, 0x50, 0x48, + 0x45, 0x2B, 0x31, 0x79, 0x4A, 0x58, 0x39, 0x64, 0x73, 0x58, 0x4E, 0x77, 0x30, 0x48, 0x38, 0x47, 0x6C, 0x77, 0x6D, 0x45, 0x4B, 0x59, 0x42, 0x68, 0x48, 0x66, 0x70, 0x65, 0x2F, 0x33, 0x4F, 0x73, 0x6F, 0x4F, 0x4F, 0x4A, 0x75, 0x42, 0x78, 0x78, + 0x46, 0x63, 0x62, 0x65, 0x4D, 0x58, 0x38, 0x53, 0x33, 0x4F, 0x46, 0x74, 0x0A, 0x6D, 0x36, 0x2F, 0x6E, 0x36, 0x4A, 0x39, 0x31, 0x65, 0x45, 0x79, 0x72, 0x52, 0x6A, 0x75, 0x61, 0x7A, 0x72, 0x38, 0x46, 0x47, 0x46, 0x31, 0x4E, 0x46, 0x54, 0x77, + 0x57, 0x6D, 0x68, 0x6C, 0x51, 0x42, 0x4A, 0x71, 0x79, 0x6D, 0x6D, 0x39, 0x6C, 0x69, 0x31, 0x4A, 0x66, 0x50, 0x46, 0x67, 0x45, 0x4B, 0x43, 0x58, 0x41, 0x5A, 0x6D, 0x45, 0x78, 0x66, 0x72, 0x6E, 0x67, 0x64, 0x62, 0x6B, 0x61, 0x71, 0x49, 0x48, + 0x57, 0x63, 0x68, 0x65, 0x7A, 0x78, 0x51, 0x4D, 0x78, 0x0A, 0x4E, 0x52, 0x46, 0x34, 0x65, 0x4B, 0x4C, 0x67, 0x36, 0x54, 0x43, 0x4D, 0x66, 0x34, 0x44, 0x66, 0x57, 0x4E, 0x38, 0x38, 0x75, 0x69, 0x65, 0x57, 0x34, 0x6F, 0x41, 0x30, 0x62, 0x65, + 0x4F, 0x59, 0x30, 0x32, 0x51, 0x6E, 0x72, 0x45, 0x68, 0x2B, 0x4B, 0x48, 0x64, 0x63, 0x78, 0x69, 0x56, 0x68, 0x4A, 0x66, 0x69, 0x46, 0x44, 0x47, 0x58, 0x36, 0x78, 0x44, 0x49, 0x76, 0x70, 0x5A, 0x67, 0x46, 0x35, 0x50, 0x67, 0x4C, 0x5A, 0x78, + 0x59, 0x57, 0x78, 0x6F, 0x4B, 0x34, 0x0A, 0x4D, 0x68, 0x6E, 0x35, 0x2B, 0x62, 0x6C, 0x35, 0x33, 0x42, 0x2F, 0x4E, 0x36, 0x36, 0x2B, 0x72, 0x44, 0x74, 0x30, 0x62, 0x32, 0x30, 0x58, 0x6B, 0x65, 0x75, 0x63, 0x43, 0x34, 0x70, 0x56, 0x64, 0x2F, + 0x47, 0x6E, 0x77, 0x55, 0x32, 0x6C, 0x68, 0x6C, 0x58, 0x56, 0x35, 0x43, 0x31, 0x35, 0x56, 0x35, 0x6A, 0x67, 0x63, 0x6C, 0x4B, 0x6C, 0x5A, 0x4D, 0x35, 0x37, 0x49, 0x63, 0x58, 0x52, 0x35, 0x66, 0x31, 0x47, 0x4A, 0x74, 0x73, 0x68, 0x71, 0x75, + 0x44, 0x44, 0x49, 0x0A, 0x61, 0x6A, 0x6A, 0x44, 0x62, 0x70, 0x37, 0x68, 0x4E, 0x78, 0x62, 0x71, 0x42, 0x57, 0x4A, 0x4D, 0x57, 0x78, 0x4A, 0x48, 0x37, 0x61, 0x65, 0x30, 0x73, 0x31, 0x68, 0x57, 0x78, 0x30, 0x6E, 0x7A, 0x66, 0x78, 0x4A, 0x6F, + 0x43, 0x54, 0x46, 0x78, 0x38, 0x47, 0x33, 0x34, 0x54, 0x6B, 0x66, 0x37, 0x31, 0x6F, 0x58, 0x75, 0x78, 0x56, 0x68, 0x41, 0x47, 0x61, 0x51, 0x64, 0x70, 0x2F, 0x6C, 0x4C, 0x51, 0x7A, 0x66, 0x63, 0x61, 0x46, 0x70, 0x50, 0x7A, 0x2B, 0x76, 0x43, + 0x0A, 0x5A, 0x48, 0x54, 0x65, 0x74, 0x42, 0x58, 0x5A, 0x39, 0x46, 0x52, 0x55, 0x47, 0x69, 0x38, 0x63, 0x31, 0x35, 0x64, 0x78, 0x56, 0x4A, 0x43, 0x4F, 0x32, 0x53, 0x43, 0x64, 0x55, 0x79, 0x74, 0x2F, 0x71, 0x34, 0x2F, 0x69, 0x36, 0x6A, 0x43, + 0x38, 0x55, 0x44, 0x66, 0x76, 0x38, 0x55, 0x65, 0x31, 0x66, 0x58, 0x77, 0x73, 0x42, 0x4F, 0x78, 0x6F, 0x6E, 0x62, 0x52, 0x4A, 0x52, 0x42, 0x44, 0x30, 0x63, 0x6B, 0x73, 0x63, 0x5A, 0x4F, 0x66, 0x38, 0x35, 0x6D, 0x75, 0x51, 0x0A, 0x33, 0x57, + 0x6C, 0x39, 0x61, 0x66, 0x30, 0x41, 0x56, 0x71, 0x57, 0x33, 0x72, 0x4C, 0x61, 0x74, 0x74, 0x38, 0x6F, 0x2B, 0x41, 0x65, 0x2B, 0x63, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x45, 0x6E, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x50, 0x6A, 0x43, 0x43, 0x41, 0x79, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x45, 0x53, 0x6C, 0x4F, 0x4D, 0x4B, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, + 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x76, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, + 0x41, 0x6F, 0x54, 0x44, 0x55, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4B, 0x44, 0x41, 0x6D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x48, 0x31, 0x4E, 0x6C, 0x5A, + 0x53, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x62, 0x47, 0x56, 0x6E, 0x59, 0x57, 0x77, 0x74, 0x64, 0x47, 0x56, 0x79, 0x0A, 0x62, 0x58, 0x4D, 0x78, + 0x4F, 0x54, 0x41, 0x33, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x4D, 0x43, 0x68, 0x6A, 0x4B, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x41, 0x35, 0x49, 0x45, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, + 0x59, 0x79, 0x34, 0x67, 0x4C, 0x53, 0x42, 0x6D, 0x62, 0x33, 0x49, 0x67, 0x59, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x70, 0x6C, 0x5A, 0x43, 0x42, 0x31, 0x63, 0x32, 0x55, 0x67, 0x0A, 0x62, 0x32, 0x35, 0x73, 0x65, 0x54, 0x45, + 0x79, 0x4D, 0x44, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x70, 0x52, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, + 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x43, 0x30, 0x67, 0x52, 0x7A, 0x49, 0x77, 0x0A, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x44, 0x6B, 0x77, 0x4E, 0x7A, + 0x41, 0x33, 0x4D, 0x54, 0x63, 0x79, 0x4E, 0x54, 0x55, 0x30, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x41, 0x78, 0x4D, 0x6A, 0x41, 0x33, 0x4D, 0x54, 0x63, 0x31, 0x4E, 0x54, 0x55, 0x30, 0x57, 0x6A, 0x43, 0x42, 0x76, 0x6A, 0x45, 0x4C, 0x4D, 0x41, + 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x0A, 0x44, 0x55, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, + 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4B, 0x44, 0x41, 0x6D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x48, 0x31, 0x4E, 0x6C, 0x5A, 0x53, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, + 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x62, 0x47, 0x56, 0x6E, 0x59, 0x57, 0x77, 0x74, 0x64, 0x47, 0x56, 0x79, 0x62, 0x58, 0x4D, 0x78, 0x0A, 0x4F, 0x54, 0x41, 0x33, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x4D, 0x43, 0x68, 0x6A, + 0x4B, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x41, 0x35, 0x49, 0x45, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x67, 0x4C, 0x53, 0x42, 0x6D, 0x62, 0x33, 0x49, 0x67, 0x59, 0x58, 0x56, 0x30, + 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x70, 0x6C, 0x5A, 0x43, 0x42, 0x31, 0x63, 0x32, 0x55, 0x67, 0x62, 0x32, 0x35, 0x73, 0x0A, 0x65, 0x54, 0x45, 0x79, 0x4D, 0x44, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x70, 0x52, 0x57, 0x35, + 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, + 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x43, 0x30, 0x67, 0x52, 0x7A, 0x49, 0x77, 0x67, 0x67, 0x45, 0x69, 0x0A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, + 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x36, 0x68, 0x4C, 0x5A, 0x79, 0x32, 0x35, 0x34, 0x4D, 0x61, 0x2B, 0x4B, 0x5A, 0x36, 0x54, 0x41, 0x42, 0x70, 0x33, 0x62, 0x71, 0x4D, 0x72, + 0x69, 0x56, 0x51, 0x52, 0x72, 0x4A, 0x32, 0x6D, 0x46, 0x4F, 0x57, 0x48, 0x4C, 0x50, 0x0A, 0x2F, 0x76, 0x61, 0x43, 0x65, 0x62, 0x39, 0x7A, 0x59, 0x51, 0x59, 0x4B, 0x70, 0x53, 0x66, 0x59, 0x73, 0x31, 0x2F, 0x54, 0x52, 0x55, 0x34, 0x63, 0x63, + 0x74, 0x5A, 0x4F, 0x4D, 0x76, 0x4A, 0x79, 0x69, 0x67, 0x2F, 0x33, 0x67, 0x78, 0x6E, 0x51, 0x61, 0x6F, 0x43, 0x41, 0x41, 0x45, 0x55, 0x65, 0x73, 0x4D, 0x66, 0x6E, 0x6D, 0x72, 0x38, 0x53, 0x56, 0x79, 0x63, 0x63, 0x6F, 0x32, 0x67, 0x76, 0x43, + 0x6F, 0x65, 0x39, 0x61, 0x6D, 0x73, 0x4F, 0x58, 0x6D, 0x58, 0x7A, 0x0A, 0x48, 0x48, 0x66, 0x56, 0x31, 0x49, 0x57, 0x4E, 0x63, 0x43, 0x47, 0x30, 0x73, 0x7A, 0x4C, 0x6E, 0x69, 0x36, 0x4C, 0x56, 0x68, 0x6A, 0x6B, 0x43, 0x73, 0x62, 0x6A, 0x53, + 0x52, 0x38, 0x37, 0x6B, 0x79, 0x55, 0x6E, 0x45, 0x4F, 0x36, 0x66, 0x65, 0x2B, 0x31, 0x52, 0x39, 0x56, 0x37, 0x37, 0x77, 0x36, 0x47, 0x37, 0x43, 0x65, 0x62, 0x49, 0x36, 0x43, 0x31, 0x58, 0x69, 0x55, 0x4A, 0x67, 0x57, 0x4D, 0x68, 0x4E, 0x63, + 0x4C, 0x33, 0x68, 0x57, 0x77, 0x63, 0x4B, 0x55, 0x0A, 0x73, 0x2F, 0x4A, 0x61, 0x35, 0x43, 0x65, 0x61, 0x6E, 0x79, 0x54, 0x58, 0x78, 0x75, 0x7A, 0x51, 0x6D, 0x79, 0x57, 0x43, 0x34, 0x38, 0x7A, 0x43, 0x78, 0x45, 0x58, 0x46, 0x6A, 0x4A, 0x64, + 0x36, 0x42, 0x6D, 0x73, 0x71, 0x45, 0x5A, 0x2B, 0x70, 0x43, 0x6D, 0x35, 0x49, 0x4F, 0x32, 0x2F, 0x62, 0x31, 0x42, 0x45, 0x5A, 0x51, 0x76, 0x65, 0x50, 0x42, 0x37, 0x2F, 0x31, 0x55, 0x31, 0x2B, 0x63, 0x50, 0x76, 0x51, 0x58, 0x4C, 0x4F, 0x5A, + 0x70, 0x72, 0x45, 0x34, 0x79, 0x0A, 0x54, 0x47, 0x4A, 0x33, 0x36, 0x72, 0x66, 0x6F, 0x35, 0x62, 0x73, 0x30, 0x76, 0x42, 0x6D, 0x4C, 0x72, 0x70, 0x78, 0x52, 0x35, 0x37, 0x64, 0x2B, 0x74, 0x56, 0x4F, 0x78, 0x4D, 0x79, 0x4C, 0x6C, 0x62, 0x63, + 0x39, 0x77, 0x50, 0x42, 0x72, 0x36, 0x34, 0x70, 0x74, 0x6E, 0x74, 0x6F, 0x50, 0x30, 0x6A, 0x61, 0x57, 0x76, 0x59, 0x6B, 0x78, 0x4E, 0x34, 0x46, 0x69, 0x73, 0x5A, 0x44, 0x51, 0x53, 0x41, 0x2F, 0x69, 0x32, 0x6A, 0x5A, 0x52, 0x6A, 0x4A, 0x4B, + 0x52, 0x78, 0x0A, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, + 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x71, 0x63, 0x69, 0x5A, 0x36, 0x0A, + 0x30, 0x42, 0x37, 0x76, 0x66, 0x65, 0x63, 0x37, 0x61, 0x56, 0x48, 0x55, 0x62, 0x49, 0x32, 0x66, 0x6B, 0x42, 0x4A, 0x6D, 0x71, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, + 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x65, 0x5A, 0x38, 0x64, 0x6C, 0x73, 0x61, 0x32, 0x65, 0x54, 0x38, 0x69, 0x6A, 0x59, 0x66, 0x54, 0x68, 0x77, 0x4D, 0x45, 0x59, 0x47, 0x70, 0x72, 0x6D, 0x69, 0x35, 0x5A, 0x0A, 0x69, 0x58, 0x4D, + 0x52, 0x72, 0x45, 0x50, 0x52, 0x39, 0x52, 0x50, 0x2F, 0x6A, 0x54, 0x6B, 0x72, 0x77, 0x50, 0x4B, 0x39, 0x54, 0x33, 0x43, 0x4D, 0x71, 0x53, 0x2F, 0x71, 0x46, 0x38, 0x51, 0x4C, 0x56, 0x4A, 0x37, 0x55, 0x47, 0x35, 0x61, 0x59, 0x4D, 0x7A, 0x79, + 0x6F, 0x72, 0x57, 0x4B, 0x69, 0x41, 0x48, 0x61, 0x72, 0x57, 0x57, 0x6C, 0x75, 0x42, 0x68, 0x31, 0x2B, 0x78, 0x4C, 0x6C, 0x45, 0x6A, 0x5A, 0x69, 0x76, 0x45, 0x74, 0x52, 0x68, 0x32, 0x77, 0x6F, 0x5A, 0x0A, 0x52, 0x6B, 0x66, 0x7A, 0x36, 0x2F, + 0x64, 0x6A, 0x77, 0x55, 0x41, 0x46, 0x51, 0x4B, 0x58, 0x53, 0x74, 0x2F, 0x53, 0x31, 0x6D, 0x6A, 0x61, 0x2F, 0x71, 0x59, 0x68, 0x32, 0x69, 0x41, 0x52, 0x56, 0x42, 0x43, 0x75, 0x63, 0x68, 0x33, 0x38, 0x61, 0x4E, 0x7A, 0x78, 0x2B, 0x4C, 0x61, + 0x55, 0x61, 0x32, 0x4E, 0x53, 0x4A, 0x58, 0x73, 0x71, 0x39, 0x72, 0x44, 0x31, 0x73, 0x32, 0x47, 0x32, 0x76, 0x31, 0x66, 0x4E, 0x32, 0x44, 0x38, 0x30, 0x37, 0x69, 0x44, 0x67, 0x69, 0x0A, 0x6E, 0x57, 0x79, 0x54, 0x6D, 0x73, 0x51, 0x39, 0x76, + 0x34, 0x49, 0x62, 0x5A, 0x54, 0x2B, 0x6D, 0x44, 0x31, 0x32, 0x71, 0x2F, 0x4F, 0x57, 0x79, 0x46, 0x63, 0x71, 0x31, 0x72, 0x63, 0x61, 0x38, 0x50, 0x64, 0x43, 0x45, 0x36, 0x4F, 0x6F, 0x47, 0x63, 0x72, 0x42, 0x4E, 0x4F, 0x54, 0x4A, 0x34, 0x76, + 0x7A, 0x34, 0x52, 0x6E, 0x41, 0x75, 0x6B, 0x6E, 0x5A, 0x6F, 0x68, 0x38, 0x2F, 0x43, 0x62, 0x43, 0x7A, 0x42, 0x34, 0x32, 0x38, 0x48, 0x63, 0x68, 0x30, 0x50, 0x2B, 0x0A, 0x76, 0x47, 0x4F, 0x61, 0x79, 0x73, 0x58, 0x43, 0x48, 0x4D, 0x6E, 0x48, + 0x6A, 0x66, 0x38, 0x37, 0x45, 0x6C, 0x67, 0x49, 0x35, 0x72, 0x59, 0x39, 0x37, 0x48, 0x6F, 0x73, 0x54, 0x76, 0x75, 0x44, 0x6C, 0x73, 0x34, 0x4D, 0x50, 0x47, 0x6D, 0x48, 0x56, 0x48, 0x4F, 0x6B, 0x63, 0x38, 0x4B, 0x54, 0x2F, 0x31, 0x45, 0x51, + 0x72, 0x42, 0x56, 0x55, 0x41, 0x64, 0x6A, 0x38, 0x42, 0x62, 0x47, 0x4A, 0x6F, 0x58, 0x39, 0x30, 0x67, 0x35, 0x70, 0x4A, 0x31, 0x39, 0x78, 0x4F, 0x0A, 0x65, 0x34, 0x70, 0x49, 0x62, 0x34, 0x74, 0x46, 0x39, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x45, 0x6E, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x45, 0x43, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, + 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x2B, 0x54, 0x43, 0x43, 0x41, 0x6F, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4E, 0x41, + 0x4B, 0x61, 0x4C, 0x65, 0x53, 0x6B, 0x41, 0x41, 0x41, 0x41, 0x41, 0x55, 0x4E, 0x43, 0x52, 0x2B, 0x54, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x43, 0x42, 0x76, 0x7A, 0x45, 0x4C, 0x4D, + 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x0A, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x55, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, + 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4B, 0x44, 0x41, 0x6D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x48, 0x31, 0x4E, 0x6C, 0x5A, 0x53, 0x42, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x57, 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, + 0x64, 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x62, 0x47, 0x56, 0x6E, 0x0A, 0x59, 0x57, 0x77, 0x74, 0x64, 0x47, 0x56, 0x79, 0x62, 0x58, 0x4D, 0x78, 0x4F, 0x54, 0x41, 0x33, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x4D, 0x43, 0x68, + 0x6A, 0x4B, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x45, 0x79, 0x49, 0x45, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x67, 0x4C, 0x53, 0x42, 0x6D, 0x62, 0x33, 0x49, 0x67, 0x59, 0x58, 0x56, + 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x70, 0x6C, 0x0A, 0x5A, 0x43, 0x42, 0x31, 0x63, 0x32, 0x55, 0x67, 0x62, 0x32, 0x35, 0x73, 0x65, 0x54, 0x45, 0x7A, 0x4D, 0x44, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x71, 0x52, 0x57, + 0x35, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, + 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x0A, 0x49, 0x43, 0x30, 0x67, 0x52, 0x55, 0x4D, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x79, 0x4D, 0x54, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x31, 0x4D, 0x6A, 0x55, 0x7A, 0x4E, 0x6C, 0x6F, 0x58, 0x44, + 0x54, 0x4D, 0x33, 0x4D, 0x54, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x31, 0x4E, 0x54, 0x55, 0x7A, 0x4E, 0x6C, 0x6F, 0x77, 0x67, 0x62, 0x38, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, + 0x52, 0x59, 0x77, 0x0A, 0x46, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x31, 0x46, 0x62, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x4D, 0x53, 0x67, 0x77, 0x4A, 0x67, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x39, 0x54, 0x5A, 0x57, 0x55, 0x67, 0x64, 0x33, 0x64, 0x33, 0x4C, 0x6D, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x62, 0x6D, 0x56, 0x30, 0x4C, 0x32, 0x78, 0x6C, 0x5A, 0x32, 0x46, 0x73, + 0x0A, 0x4C, 0x58, 0x52, 0x6C, 0x63, 0x6D, 0x31, 0x7A, 0x4D, 0x54, 0x6B, 0x77, 0x4E, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x7A, 0x41, 0x6F, 0x59, 0x79, 0x6B, 0x67, 0x4D, 0x6A, 0x41, 0x78, 0x4D, 0x69, 0x42, 0x46, 0x62, 0x6E, 0x52, + 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x49, 0x43, 0x30, 0x67, 0x5A, 0x6D, 0x39, 0x79, 0x49, 0x47, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x36, 0x5A, 0x57, 0x51, 0x67, 0x0A, 0x64, 0x58, + 0x4E, 0x6C, 0x49, 0x47, 0x39, 0x75, 0x62, 0x48, 0x6B, 0x78, 0x4D, 0x7A, 0x41, 0x78, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4B, 0x6B, 0x56, 0x75, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, + 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x41, 0x74, 0x0A, 0x49, 0x45, 0x56, 0x44, 0x4D, + 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x49, 0x51, 0x54, 0x79, 0x64, 0x43, 0x36, 0x62, + 0x55, 0x46, 0x37, 0x34, 0x6D, 0x7A, 0x51, 0x36, 0x31, 0x56, 0x66, 0x5A, 0x67, 0x49, 0x61, 0x4A, 0x50, 0x52, 0x62, 0x69, 0x57, 0x6C, 0x48, 0x34, 0x37, 0x6A, 0x43, 0x66, 0x66, 0x48, 0x79, 0x0A, 0x41, 0x73, 0x57, 0x66, 0x6F, 0x50, 0x5A, 0x62, + 0x31, 0x59, 0x73, 0x47, 0x47, 0x59, 0x5A, 0x50, 0x55, 0x78, 0x42, 0x74, 0x42, 0x79, 0x51, 0x6E, 0x6F, 0x61, 0x44, 0x34, 0x31, 0x55, 0x63, 0x5A, 0x59, 0x55, 0x78, 0x39, 0x79, 0x70, 0x4D, 0x6E, 0x36, 0x6E, 0x51, 0x4D, 0x37, 0x32, 0x2B, 0x57, + 0x43, 0x66, 0x35, 0x6A, 0x37, 0x48, 0x42, 0x64, 0x4E, 0x71, 0x31, 0x6E, 0x64, 0x36, 0x37, 0x4A, 0x6E, 0x58, 0x78, 0x56, 0x52, 0x44, 0x71, 0x69, 0x59, 0x31, 0x45, 0x66, 0x0A, 0x39, 0x65, 0x4E, 0x69, 0x31, 0x4B, 0x6C, 0x48, 0x42, 0x7A, 0x37, + 0x4D, 0x49, 0x4B, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, + 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x0A, 0x46, 0x4C, 0x64, 0x6A, 0x35, 0x78, 0x72, 0x64, 0x6A, 0x65, 0x6B, 0x49, 0x70, 0x6C, + 0x57, 0x44, 0x70, 0x4F, 0x42, 0x71, 0x55, 0x45, 0x46, 0x6C, 0x45, 0x55, 0x4A, 0x4A, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x63, 0x41, 0x4D, 0x47, 0x51, 0x43, 0x4D, 0x47, + 0x46, 0x35, 0x32, 0x4F, 0x56, 0x43, 0x52, 0x39, 0x38, 0x63, 0x72, 0x6C, 0x4F, 0x5A, 0x46, 0x37, 0x5A, 0x76, 0x48, 0x48, 0x33, 0x68, 0x0A, 0x76, 0x78, 0x47, 0x55, 0x30, 0x51, 0x4F, 0x49, 0x64, 0x65, 0x53, 0x4E, 0x69, 0x61, 0x53, 0x4B, 0x64, + 0x30, 0x62, 0x65, 0x62, 0x57, 0x48, 0x76, 0x41, 0x76, 0x58, 0x37, 0x74, 0x64, 0x2F, 0x4D, 0x2F, 0x6B, 0x37, 0x2F, 0x2F, 0x71, 0x6E, 0x6D, 0x70, 0x77, 0x49, 0x77, 0x57, 0x35, 0x6E, 0x58, 0x68, 0x54, 0x63, 0x47, 0x74, 0x58, 0x73, 0x49, 0x2F, + 0x65, 0x73, 0x6E, 0x69, 0x30, 0x71, 0x55, 0x2B, 0x65, 0x48, 0x36, 0x70, 0x34, 0x34, 0x6D, 0x43, 0x4F, 0x68, 0x38, 0x0A, 0x6B, 0x6D, 0x68, 0x74, 0x63, 0x39, 0x68, 0x76, 0x4A, 0x71, 0x77, 0x68, 0x41, 0x72, 0x69, 0x5A, 0x74, 0x79, 0x5A, 0x42, + 0x57, 0x79, 0x56, 0x67, 0x72, 0x74, 0x42, 0x49, 0x47, 0x75, 0x34, 0x47, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, + 0x43, 0x46, 0x43, 0x41, 0x20, 0x45, 0x56, 0x20, 0x52, 0x4F, 0x4F, 0x54, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x6A, 0x54, 0x43, 0x43, 0x41, 0x33, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x45, 0x47, 0x45, 0x72, 0x4D, 0x31, 0x6A, + 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, + 0x45, 0x77, 0x4D, 0x43, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x67, 0x77, 0x6E, 0x51, 0x32, 0x68, 0x70, 0x62, 0x6D, 0x45, 0x67, 0x52, 0x6D, 0x6C, 0x75, 0x59, 0x57, 0x35, 0x6A, 0x61, 0x57, 0x46, 0x73, 0x49, 0x45, 0x4E, 0x6C, 0x63, + 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, + 0x41, 0x78, 0x44, 0x52, 0x6B, 0x4E, 0x42, 0x0A, 0x49, 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x50, 0x54, 0x31, 0x51, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x49, 0x77, 0x4F, 0x44, 0x41, 0x34, 0x4D, 0x44, 0x4D, 0x77, 0x4E, 0x7A, 0x41, 0x78, + 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x6B, 0x78, 0x4D, 0x6A, 0x4D, 0x78, 0x4D, 0x44, 0x4D, 0x77, 0x4E, 0x7A, 0x41, 0x78, 0x57, 0x6A, 0x42, 0x57, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, + 0x54, 0x6A, 0x45, 0x77, 0x0A, 0x4D, 0x43, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x6E, 0x51, 0x32, 0x68, 0x70, 0x62, 0x6D, 0x45, 0x67, 0x52, 0x6D, 0x6C, 0x75, 0x59, 0x57, 0x35, 0x6A, 0x61, 0x57, 0x46, 0x73, 0x49, 0x45, 0x4E, + 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x44, 0x0A, 0x44, 0x41, 0x78, 0x44, 0x52, 0x6B, 0x4E, 0x42, 0x49, 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x50, 0x54, 0x31, 0x51, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, + 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x58, 0x58, 0x57, 0x76, 0x4E, 0x45, 0x44, 0x38, 0x66, 0x42, 0x56, 0x6E, 0x56, 0x0A, 0x42, + 0x55, 0x30, 0x33, 0x73, 0x51, 0x37, 0x73, 0x6D, 0x43, 0x75, 0x4F, 0x46, 0x52, 0x33, 0x36, 0x6B, 0x30, 0x73, 0x58, 0x67, 0x69, 0x46, 0x78, 0x45, 0x46, 0x4C, 0x58, 0x55, 0x57, 0x52, 0x77, 0x46, 0x73, 0x4A, 0x56, 0x61, 0x55, 0x32, 0x4F, 0x46, + 0x57, 0x32, 0x66, 0x76, 0x77, 0x77, 0x62, 0x77, 0x75, 0x43, 0x6A, 0x5A, 0x39, 0x59, 0x4D, 0x72, 0x4D, 0x38, 0x69, 0x72, 0x71, 0x39, 0x33, 0x56, 0x43, 0x70, 0x4C, 0x54, 0x49, 0x70, 0x54, 0x55, 0x6E, 0x72, 0x44, 0x0A, 0x37, 0x69, 0x37, 0x65, + 0x73, 0x33, 0x45, 0x6C, 0x77, 0x65, 0x6C, 0x64, 0x50, 0x65, 0x36, 0x68, 0x4C, 0x36, 0x50, 0x33, 0x4B, 0x6A, 0x7A, 0x4A, 0x49, 0x78, 0x31, 0x71, 0x71, 0x78, 0x32, 0x68, 0x70, 0x2F, 0x48, 0x7A, 0x37, 0x4B, 0x44, 0x56, 0x52, 0x4D, 0x38, 0x56, + 0x7A, 0x33, 0x49, 0x76, 0x48, 0x57, 0x4F, 0x58, 0x36, 0x4A, 0x6E, 0x35, 0x2F, 0x5A, 0x4F, 0x6B, 0x56, 0x49, 0x42, 0x4D, 0x55, 0x74, 0x52, 0x53, 0x71, 0x79, 0x35, 0x4A, 0x33, 0x35, 0x44, 0x4E, 0x0A, 0x75, 0x46, 0x2B, 0x2B, 0x50, 0x39, 0x36, + 0x68, 0x79, 0x6B, 0x30, 0x67, 0x31, 0x43, 0x58, 0x6F, 0x68, 0x43, 0x6C, 0x54, 0x74, 0x37, 0x47, 0x49, 0x48, 0x2F, 0x2F, 0x36, 0x32, 0x70, 0x43, 0x66, 0x43, 0x71, 0x6B, 0x74, 0x51, 0x54, 0x2B, 0x78, 0x38, 0x52, 0x67, 0x70, 0x37, 0x68, 0x5A, + 0x5A, 0x4C, 0x44, 0x52, 0x4A, 0x47, 0x71, 0x67, 0x47, 0x31, 0x36, 0x69, 0x49, 0x30, 0x67, 0x4E, 0x79, 0x65, 0x6A, 0x4C, 0x69, 0x36, 0x6D, 0x68, 0x4E, 0x62, 0x69, 0x79, 0x57, 0x0A, 0x5A, 0x58, 0x76, 0x4B, 0x57, 0x66, 0x72, 0x79, 0x34, 0x74, + 0x33, 0x75, 0x4D, 0x43, 0x7A, 0x37, 0x7A, 0x45, 0x61, 0x73, 0x78, 0x47, 0x50, 0x72, 0x62, 0x33, 0x38, 0x32, 0x4B, 0x7A, 0x52, 0x7A, 0x45, 0x70, 0x52, 0x2F, 0x33, 0x38, 0x77, 0x6D, 0x6E, 0x76, 0x46, 0x79, 0x58, 0x56, 0x42, 0x6C, 0x57, 0x59, + 0x39, 0x70, 0x73, 0x34, 0x64, 0x65, 0x4D, 0x6D, 0x2F, 0x44, 0x47, 0x49, 0x71, 0x31, 0x6C, 0x59, 0x2B, 0x77, 0x65, 0x6A, 0x66, 0x65, 0x57, 0x6B, 0x55, 0x37, 0x0A, 0x78, 0x7A, 0x62, 0x68, 0x37, 0x32, 0x66, 0x52, 0x4F, 0x64, 0x4F, 0x58, 0x57, + 0x33, 0x4E, 0x69, 0x47, 0x55, 0x67, 0x74, 0x68, 0x78, 0x77, 0x47, 0x2B, 0x33, 0x53, 0x59, 0x49, 0x45, 0x6C, 0x7A, 0x38, 0x41, 0x58, 0x53, 0x47, 0x37, 0x47, 0x67, 0x6F, 0x37, 0x63, 0x62, 0x63, 0x4E, 0x4F, 0x49, 0x61, 0x62, 0x6C, 0x61, 0x31, + 0x6A, 0x6A, 0x30, 0x59, 0x74, 0x77, 0x6C, 0x69, 0x33, 0x69, 0x2F, 0x2B, 0x4F, 0x68, 0x2B, 0x75, 0x46, 0x7A, 0x4A, 0x6C, 0x55, 0x39, 0x66, 0x0A, 0x70, 0x79, 0x32, 0x35, 0x49, 0x47, 0x76, 0x50, 0x61, 0x39, 0x33, 0x31, 0x44, 0x66, 0x53, 0x43, + 0x74, 0x2F, 0x53, 0x79, 0x5A, 0x69, 0x34, 0x51, 0x4B, 0x50, 0x61, 0x58, 0x57, 0x6E, 0x75, 0x57, 0x46, 0x6F, 0x38, 0x42, 0x47, 0x53, 0x31, 0x73, 0x62, 0x6E, 0x38, 0x35, 0x57, 0x41, 0x5A, 0x6B, 0x67, 0x77, 0x47, 0x44, 0x67, 0x38, 0x4E, 0x4E, + 0x6B, 0x74, 0x30, 0x79, 0x78, 0x6F, 0x65, 0x6B, 0x4E, 0x2B, 0x6B, 0x57, 0x7A, 0x71, 0x6F, 0x74, 0x61, 0x4B, 0x38, 0x4B, 0x0A, 0x67, 0x57, 0x55, 0x36, 0x63, 0x4D, 0x47, 0x62, 0x72, 0x55, 0x31, 0x74, 0x56, 0x4D, 0x6F, 0x71, 0x4C, 0x55, 0x75, + 0x46, 0x47, 0x37, 0x4F, 0x41, 0x35, 0x6E, 0x42, 0x46, 0x44, 0x57, 0x74, 0x65, 0x4E, 0x66, 0x42, 0x2F, 0x4F, 0x37, 0x69, 0x63, 0x35, 0x41, 0x52, 0x77, 0x69, 0x52, 0x49, 0x6C, 0x6B, 0x39, 0x6F, 0x4B, 0x6D, 0x53, 0x4A, 0x67, 0x61, 0x6D, 0x4E, + 0x67, 0x54, 0x6E, 0x59, 0x47, 0x6D, 0x45, 0x36, 0x39, 0x67, 0x36, 0x30, 0x64, 0x57, 0x49, 0x6F, 0x6C, 0x0A, 0x68, 0x64, 0x4C, 0x48, 0x5A, 0x52, 0x34, 0x74, 0x6A, 0x73, 0x62, 0x66, 0x74, 0x73, 0x62, 0x68, 0x66, 0x34, 0x6F, 0x45, 0x49, 0x52, + 0x55, 0x70, 0x64, 0x50, 0x41, 0x2B, 0x6E, 0x4A, 0x43, 0x64, 0x44, 0x43, 0x37, 0x78, 0x69, 0x6A, 0x35, 0x61, 0x71, 0x67, 0x77, 0x4A, 0x48, 0x73, 0x66, 0x56, 0x50, 0x4B, 0x50, 0x74, 0x6C, 0x38, 0x4D, 0x65, 0x4E, 0x50, 0x6F, 0x34, 0x2B, 0x51, + 0x67, 0x4F, 0x34, 0x38, 0x42, 0x64, 0x4B, 0x34, 0x50, 0x52, 0x56, 0x6D, 0x72, 0x4A, 0x0A, 0x74, 0x71, 0x68, 0x55, 0x55, 0x79, 0x35, 0x34, 0x4D, 0x6D, 0x63, 0x39, 0x67, 0x6E, 0x39, 0x30, 0x30, 0x50, 0x76, 0x68, 0x74, 0x67, 0x56, 0x67, 0x75, + 0x58, 0x44, 0x62, 0x6A, 0x67, 0x76, 0x35, 0x45, 0x31, 0x68, 0x76, 0x63, 0x57, 0x41, 0x51, 0x55, 0x68, 0x43, 0x35, 0x77, 0x55, 0x45, 0x4A, 0x37, 0x33, 0x49, 0x66, 0x5A, 0x7A, 0x46, 0x34, 0x2F, 0x35, 0x59, 0x46, 0x6A, 0x51, 0x49, 0x44, 0x41, + 0x51, 0x41, 0x42, 0x6F, 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x66, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x54, 0x6A, 0x2F, 0x69, 0x33, 0x39, 0x4B, 0x4E, 0x41, 0x4C, 0x74, 0x62, 0x71, 0x32, + 0x6F, 0x73, 0x53, 0x2F, 0x42, 0x71, 0x6F, 0x46, 0x6A, 0x4A, 0x50, 0x37, 0x4C, 0x7A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, + 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x34, 0x2F, 0x34, 0x74, 0x2F, 0x53, 0x6A, + 0x51, 0x43, 0x37, 0x57, 0x36, 0x74, 0x71, 0x4C, 0x45, 0x76, 0x77, 0x61, 0x71, 0x42, 0x59, 0x79, 0x54, 0x2B, 0x79, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, + 0x44, 0x67, 0x67, 0x49, 0x42, 0x0A, 0x41, 0x43, 0x58, 0x47, 0x75, 0x6D, 0x76, 0x72, 0x68, 0x38, 0x76, 0x65, 0x67, 0x6A, 0x6D, 0x57, 0x50, 0x66, 0x42, 0x45, 0x70, 0x32, 0x75, 0x45, 0x63, 0x77, 0x50, 0x65, 0x6E, 0x53, 0x74, 0x50, 0x75, 0x69, + 0x42, 0x2F, 0x76, 0x48, 0x69, 0x79, 0x7A, 0x35, 0x65, 0x77, 0x47, 0x35, 0x7A, 0x7A, 0x31, 0x33, 0x6B, 0x75, 0x39, 0x55, 0x69, 0x32, 0x30, 0x76, 0x73, 0x58, 0x69, 0x4F, 0x62, 0x54, 0x65, 0x6A, 0x2F, 0x74, 0x55, 0x78, 0x50, 0x51, 0x34, 0x69, + 0x39, 0x71, 0x0A, 0x65, 0x63, 0x73, 0x41, 0x49, 0x79, 0x6A, 0x6D, 0x48, 0x6A, 0x64, 0x58, 0x4E, 0x59, 0x6D, 0x45, 0x77, 0x6E, 0x5A, 0x50, 0x4E, 0x44, 0x61, 0x74, 0x5A, 0x38, 0x50, 0x4F, 0x51, 0x51, 0x61, 0x49, 0x78, 0x66, 0x66, 0x75, 0x32, + 0x42, 0x71, 0x34, 0x31, 0x67, 0x74, 0x2F, 0x55, 0x50, 0x2B, 0x54, 0x71, 0x68, 0x64, 0x4C, 0x6A, 0x4F, 0x7A, 0x74, 0x55, 0x6D, 0x43, 0x79, 0x70, 0x41, 0x62, 0x71, 0x54, 0x75, 0x76, 0x30, 0x61, 0x78, 0x6E, 0x39, 0x36, 0x2F, 0x55, 0x61, 0x0A, + 0x34, 0x43, 0x55, 0x71, 0x6D, 0x74, 0x7A, 0x48, 0x51, 0x54, 0x62, 0x33, 0x79, 0x48, 0x51, 0x46, 0x68, 0x44, 0x6D, 0x56, 0x4F, 0x64, 0x59, 0x4C, 0x4F, 0x36, 0x51, 0x6E, 0x2B, 0x67, 0x6A, 0x59, 0x58, 0x42, 0x37, 0x34, 0x42, 0x47, 0x42, 0x53, + 0x45, 0x53, 0x67, 0x6F, 0x41, 0x2F, 0x2F, 0x76, 0x55, 0x32, 0x59, 0x41, 0x70, 0x55, 0x6F, 0x30, 0x46, 0x6D, 0x5A, 0x38, 0x2F, 0x51, 0x6D, 0x6B, 0x72, 0x70, 0x35, 0x6E, 0x47, 0x6D, 0x39, 0x42, 0x43, 0x32, 0x73, 0x47, 0x0A, 0x45, 0x35, 0x75, + 0x50, 0x68, 0x6E, 0x45, 0x46, 0x74, 0x43, 0x2B, 0x4E, 0x69, 0x57, 0x59, 0x7A, 0x4B, 0x58, 0x5A, 0x55, 0x6D, 0x68, 0x48, 0x34, 0x4A, 0x2F, 0x71, 0x79, 0x50, 0x35, 0x48, 0x67, 0x7A, 0x67, 0x30, 0x62, 0x38, 0x7A, 0x41, 0x61, 0x72, 0x62, 0x38, + 0x69, 0x58, 0x52, 0x76, 0x54, 0x76, 0x79, 0x55, 0x46, 0x54, 0x65, 0x47, 0x53, 0x47, 0x6E, 0x2B, 0x5A, 0x6E, 0x7A, 0x78, 0x45, 0x6B, 0x38, 0x72, 0x55, 0x51, 0x45, 0x6C, 0x73, 0x67, 0x49, 0x66, 0x58, 0x0A, 0x42, 0x44, 0x72, 0x44, 0x4D, 0x6C, + 0x49, 0x31, 0x44, 0x6C, 0x62, 0x34, 0x70, 0x64, 0x31, 0x39, 0x78, 0x49, 0x73, 0x4E, 0x45, 0x52, 0x39, 0x54, 0x79, 0x78, 0x36, 0x79, 0x46, 0x37, 0x5A, 0x6F, 0x64, 0x31, 0x72, 0x67, 0x31, 0x4D, 0x76, 0x49, 0x42, 0x36, 0x37, 0x31, 0x4F, 0x69, + 0x36, 0x4F, 0x4E, 0x37, 0x66, 0x51, 0x41, 0x55, 0x74, 0x44, 0x4B, 0x58, 0x65, 0x4D, 0x4F, 0x5A, 0x65, 0x50, 0x67, 0x6C, 0x72, 0x34, 0x55, 0x65, 0x57, 0x4A, 0x6F, 0x42, 0x6A, 0x6E, 0x0A, 0x61, 0x48, 0x39, 0x64, 0x43, 0x69, 0x37, 0x37, 0x6F, + 0x30, 0x63, 0x4F, 0x50, 0x61, 0x59, 0x6A, 0x65, 0x73, 0x59, 0x42, 0x78, 0x34, 0x2F, 0x49, 0x58, 0x72, 0x39, 0x74, 0x67, 0x46, 0x61, 0x2B, 0x69, 0x69, 0x53, 0x36, 0x4D, 0x2B, 0x71, 0x66, 0x34, 0x54, 0x49, 0x52, 0x6E, 0x76, 0x48, 0x53, 0x54, + 0x34, 0x44, 0x32, 0x47, 0x30, 0x43, 0x76, 0x4F, 0x4A, 0x34, 0x52, 0x55, 0x48, 0x6C, 0x7A, 0x45, 0x68, 0x4C, 0x4E, 0x35, 0x6D, 0x79, 0x64, 0x4C, 0x49, 0x68, 0x79, 0x0A, 0x50, 0x44, 0x43, 0x42, 0x42, 0x70, 0x45, 0x69, 0x36, 0x6C, 0x6D, 0x74, + 0x32, 0x68, 0x6B, 0x75, 0x49, 0x73, 0x4B, 0x4E, 0x75, 0x59, 0x79, 0x48, 0x34, 0x47, 0x61, 0x38, 0x63, 0x79, 0x4E, 0x66, 0x49, 0x57, 0x52, 0x6A, 0x67, 0x45, 0x6A, 0x31, 0x6F, 0x44, 0x77, 0x59, 0x50, 0x5A, 0x54, 0x49, 0x53, 0x45, 0x45, 0x64, + 0x51, 0x4C, 0x70, 0x65, 0x2F, 0x76, 0x35, 0x57, 0x4F, 0x61, 0x48, 0x49, 0x7A, 0x31, 0x36, 0x65, 0x47, 0x57, 0x52, 0x47, 0x45, 0x4E, 0x6F, 0x58, 0x0A, 0x6B, 0x62, 0x63, 0x46, 0x67, 0x4B, 0x79, 0x4C, 0x6D, 0x5A, 0x4A, 0x39, 0x35, 0x36, 0x4C, + 0x59, 0x42, 0x77, 0x73, 0x32, 0x4A, 0x2B, 0x64, 0x49, 0x65, 0x57, 0x43, 0x4B, 0x77, 0x39, 0x63, 0x54, 0x58, 0x50, 0x68, 0x79, 0x51, 0x4E, 0x39, 0x4B, 0x79, 0x38, 0x2B, 0x5A, 0x41, 0x41, 0x6F, 0x41, 0x43, 0x78, 0x47, 0x56, 0x32, 0x6C, 0x5A, + 0x46, 0x41, 0x34, 0x67, 0x4B, 0x6E, 0x32, 0x66, 0x51, 0x31, 0x58, 0x6D, 0x78, 0x71, 0x49, 0x31, 0x41, 0x62, 0x51, 0x33, 0x43, 0x0A, 0x65, 0x6B, 0x44, 0x36, 0x38, 0x31, 0x39, 0x6B, 0x52, 0x35, 0x4C, 0x4C, 0x55, 0x37, 0x6D, 0x37, 0x57, 0x63, + 0x35, 0x50, 0x2F, 0x64, 0x41, 0x56, 0x55, 0x77, 0x48, 0x59, 0x33, 0x2B, 0x76, 0x5A, 0x35, 0x6E, 0x62, 0x76, 0x30, 0x43, 0x4F, 0x37, 0x4F, 0x36, 0x6C, 0x35, 0x73, 0x39, 0x55, 0x43, 0x4B, 0x63, 0x32, 0x4A, 0x6F, 0x35, 0x59, 0x50, 0x53, 0x6A, + 0x58, 0x6E, 0x54, 0x6B, 0x4C, 0x41, 0x64, 0x63, 0x30, 0x48, 0x7A, 0x2B, 0x59, 0x73, 0x36, 0x33, 0x73, 0x75, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4F, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4B, 0x65, 0x79, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x42, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x74, 0x54, 0x43, 0x43, 0x41, 0x70, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x64, 0x72, + 0x45, 0x67, 0x55, 0x6E, 0x54, 0x77, 0x68, 0x59, 0x64, 0x47, 0x73, 0x2F, 0x67, 0x6A, 0x47, 0x76, 0x62, 0x43, 0x77, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, + 0x42, 0x74, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x44, 0x53, 0x44, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x48, 0x56, 0x30, 0x6C, 0x54, 0x5A, + 0x55, 0x74, 0x6C, 0x65, 0x54, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x5A, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, 0x67, 0x52, 0x6D, 0x39, 0x31, 0x62, 0x6D, 0x52, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, + 0x69, 0x42, 0x46, 0x62, 0x6D, 0x52, 0x76, 0x63, 0x6E, 0x4E, 0x6C, 0x0A, 0x5A, 0x44, 0x45, 0x6F, 0x4D, 0x43, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x66, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, 0x67, 0x56, 0x30, 0x6C, 0x54, + 0x5A, 0x55, 0x74, 0x6C, 0x65, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x48, 0x51, 0x69, 0x42, 0x44, 0x51, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x44, 0x45, 0x79, + 0x4D, 0x44, 0x45, 0x78, 0x4E, 0x54, 0x41, 0x77, 0x0A, 0x4D, 0x7A, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4F, 0x54, 0x45, 0x79, 0x4D, 0x44, 0x45, 0x78, 0x4E, 0x54, 0x45, 0x77, 0x4D, 0x7A, 0x46, 0x61, 0x4D, 0x47, 0x30, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x49, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x64, 0x58, 0x53, 0x56, 0x4E, 0x6C, 0x53, 0x32, 0x56, 0x35, 0x4D, 0x53, 0x49, + 0x77, 0x49, 0x41, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x6C, 0x50, 0x53, 0x56, 0x4E, 0x55, 0x52, 0x53, 0x42, 0x47, 0x62, 0x33, 0x56, 0x75, 0x5A, 0x47, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x56, 0x75, 0x5A, 0x47, + 0x39, 0x79, 0x63, 0x32, 0x56, 0x6B, 0x4D, 0x53, 0x67, 0x77, 0x4A, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x39, 0x50, 0x53, 0x56, 0x4E, 0x55, 0x52, 0x53, 0x42, 0x58, 0x53, 0x56, 0x4E, 0x6C, 0x53, 0x32, 0x56, 0x35, 0x49, 0x45, + 0x64, 0x73, 0x0A, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x64, 0x43, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, + 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x32, 0x42, 0x65, 0x33, 0x48, 0x45, 0x6F, 0x6B, 0x4B, 0x74, 0x61, 0x58, 0x0A, + 0x73, 0x63, 0x72, 0x69, 0x48, 0x76, 0x74, 0x39, 0x4F, 0x4F, 0x2B, 0x59, 0x39, 0x62, 0x49, 0x35, 0x6D, 0x45, 0x34, 0x6E, 0x75, 0x42, 0x46, 0x64, 0x65, 0x39, 0x49, 0x6C, 0x6C, 0x49, 0x69, 0x43, 0x46, 0x53, 0x5A, 0x71, 0x47, 0x7A, 0x47, 0x37, + 0x71, 0x46, 0x73, 0x68, 0x49, 0x53, 0x76, 0x59, 0x44, 0x30, 0x36, 0x66, 0x57, 0x76, 0x47, 0x78, 0x57, 0x75, 0x52, 0x35, 0x31, 0x6A, 0x49, 0x6A, 0x4B, 0x2B, 0x46, 0x54, 0x7A, 0x4A, 0x6C, 0x46, 0x58, 0x48, 0x74, 0x50, 0x0A, 0x72, 0x62, 0x79, + 0x2F, 0x68, 0x30, 0x6F, 0x4C, 0x53, 0x35, 0x64, 0x61, 0x71, 0x50, 0x5A, 0x49, 0x37, 0x48, 0x31, 0x37, 0x44, 0x63, 0x30, 0x68, 0x42, 0x74, 0x2B, 0x65, 0x46, 0x66, 0x31, 0x42, 0x69, 0x6B, 0x69, 0x33, 0x49, 0x50, 0x53, 0x68, 0x65, 0x68, 0x74, + 0x58, 0x31, 0x46, 0x31, 0x51, 0x2F, 0x37, 0x70, 0x6E, 0x32, 0x43, 0x4F, 0x5A, 0x48, 0x38, 0x67, 0x2F, 0x34, 0x39, 0x37, 0x2F, 0x62, 0x31, 0x74, 0x33, 0x73, 0x57, 0x74, 0x75, 0x75, 0x4D, 0x6C, 0x6B, 0x0A, 0x39, 0x2B, 0x48, 0x4B, 0x51, 0x55, + 0x59, 0x4F, 0x4B, 0x58, 0x48, 0x51, 0x75, 0x53, 0x50, 0x38, 0x79, 0x59, 0x46, 0x66, 0x54, 0x76, 0x64, 0x76, 0x33, 0x37, 0x2B, 0x45, 0x72, 0x58, 0x4E, 0x6B, 0x75, 0x37, 0x64, 0x43, 0x6A, 0x6D, 0x6E, 0x32, 0x31, 0x48, 0x59, 0x64, 0x66, 0x70, + 0x32, 0x6E, 0x75, 0x46, 0x65, 0x4B, 0x55, 0x57, 0x64, 0x79, 0x31, 0x39, 0x53, 0x6F, 0x75, 0x4A, 0x56, 0x55, 0x51, 0x48, 0x4D, 0x44, 0x39, 0x75, 0x72, 0x30, 0x36, 0x2F, 0x34, 0x6F, 0x0A, 0x51, 0x6E, 0x63, 0x2F, 0x6E, 0x53, 0x4D, 0x62, 0x73, + 0x72, 0x59, 0x39, 0x67, 0x42, 0x51, 0x48, 0x54, 0x43, 0x35, 0x50, 0x39, 0x39, 0x55, 0x4B, 0x46, 0x67, 0x32, 0x39, 0x5A, 0x6B, 0x4D, 0x33, 0x66, 0x69, 0x4E, 0x44, 0x65, 0x63, 0x4E, 0x41, 0x68, 0x76, 0x56, 0x4D, 0x4B, 0x64, 0x71, 0x4F, 0x6D, + 0x71, 0x30, 0x4E, 0x70, 0x51, 0x53, 0x48, 0x69, 0x42, 0x36, 0x46, 0x34, 0x2B, 0x6C, 0x54, 0x31, 0x5A, 0x76, 0x49, 0x69, 0x77, 0x4E, 0x6A, 0x65, 0x4F, 0x76, 0x67, 0x0A, 0x47, 0x55, 0x70, 0x75, 0x75, 0x79, 0x39, 0x72, 0x4D, 0x32, 0x52, 0x59, + 0x6B, 0x36, 0x31, 0x70, 0x76, 0x34, 0x38, 0x62, 0x37, 0x34, 0x4A, 0x49, 0x78, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x31, 0x45, 0x77, 0x54, 0x7A, 0x41, 0x4C, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, + 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, + 0x55, 0x4E, 0x51, 0x2F, 0x49, 0x4E, 0x6D, 0x4E, 0x65, 0x34, 0x71, 0x50, 0x73, 0x2B, 0x54, 0x74, 0x6D, 0x46, 0x63, 0x35, 0x52, 0x55, 0x75, 0x4F, 0x52, 0x6D, 0x6A, 0x30, 0x77, 0x45, 0x41, 0x59, 0x4A, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x41, 0x47, + 0x43, 0x4E, 0x78, 0x55, 0x42, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x45, + 0x42, 0x4D, 0x2B, 0x34, 0x65, 0x79, 0x6D, 0x59, 0x47, 0x51, 0x66, 0x70, 0x33, 0x46, 0x73, 0x4C, 0x41, 0x6D, 0x7A, 0x59, 0x68, 0x37, 0x4B, 0x7A, 0x4B, 0x4E, 0x62, 0x72, 0x67, 0x68, 0x63, 0x56, 0x69, 0x58, 0x66, 0x61, 0x34, 0x33, 0x46, 0x4B, + 0x38, 0x2B, 0x35, 0x2F, 0x65, 0x61, 0x34, 0x6E, 0x33, 0x32, 0x63, 0x5A, 0x69, 0x5A, 0x42, 0x4B, 0x70, 0x44, 0x0A, 0x64, 0x48, 0x69, 0x6A, 0x34, 0x30, 0x6C, 0x68, 0x50, 0x6E, 0x4F, 0x4D, 0x54, 0x5A, 0x54, 0x67, 0x2B, 0x58, 0x48, 0x45, 0x74, + 0x68, 0x59, 0x4F, 0x55, 0x33, 0x67, 0x66, 0x31, 0x71, 0x4B, 0x48, 0x4C, 0x77, 0x49, 0x35, 0x67, 0x53, 0x6B, 0x38, 0x72, 0x78, 0x57, 0x59, 0x49, 0x54, 0x44, 0x2B, 0x4B, 0x4A, 0x41, 0x41, 0x6A, 0x4E, 0x48, 0x68, 0x79, 0x2F, 0x70, 0x65, 0x79, + 0x50, 0x33, 0x34, 0x45, 0x45, 0x59, 0x37, 0x6F, 0x6E, 0x68, 0x43, 0x6B, 0x52, 0x64, 0x30, 0x0A, 0x56, 0x51, 0x72, 0x65, 0x55, 0x47, 0x64, 0x4E, 0x5A, 0x74, 0x47, 0x6E, 0x2F, 0x2F, 0x33, 0x5A, 0x77, 0x4C, 0x57, 0x6F, 0x6F, 0x34, 0x72, 0x4F, + 0x5A, 0x76, 0x55, 0x50, 0x51, 0x38, 0x32, 0x6E, 0x4B, 0x31, 0x64, 0x37, 0x59, 0x30, 0x5A, 0x71, 0x71, 0x69, 0x35, 0x53, 0x32, 0x50, 0x54, 0x74, 0x34, 0x57, 0x32, 0x74, 0x4B, 0x5A, 0x42, 0x34, 0x53, 0x4C, 0x72, 0x68, 0x49, 0x36, 0x71, 0x6A, + 0x69, 0x65, 0x79, 0x31, 0x71, 0x35, 0x62, 0x41, 0x74, 0x45, 0x75, 0x69, 0x0A, 0x48, 0x5A, 0x65, 0x65, 0x65, 0x76, 0x4A, 0x75, 0x51, 0x48, 0x48, 0x66, 0x61, 0x50, 0x46, 0x6C, 0x54, 0x63, 0x35, 0x38, 0x42, 0x64, 0x39, 0x54, 0x5A, 0x61, 0x6D, + 0x6C, 0x38, 0x4C, 0x47, 0x58, 0x42, 0x48, 0x41, 0x56, 0x52, 0x67, 0x4F, 0x59, 0x31, 0x4E, 0x4B, 0x2F, 0x56, 0x4C, 0x53, 0x67, 0x57, 0x48, 0x31, 0x53, 0x62, 0x39, 0x70, 0x57, 0x4A, 0x6D, 0x4C, 0x55, 0x32, 0x4E, 0x75, 0x4A, 0x4D, 0x57, 0x38, + 0x63, 0x38, 0x43, 0x4C, 0x43, 0x30, 0x32, 0x49, 0x63, 0x0A, 0x4E, 0x63, 0x31, 0x4D, 0x61, 0x52, 0x56, 0x55, 0x47, 0x70, 0x43, 0x59, 0x33, 0x75, 0x73, 0x65, 0x58, 0x38, 0x70, 0x33, 0x78, 0x38, 0x75, 0x4F, 0x50, 0x55, 0x4E, 0x70, 0x6E, 0x4A, + 0x70, 0x59, 0x30, 0x43, 0x51, 0x37, 0x33, 0x78, 0x74, 0x41, 0x6C, 0x6E, 0x34, 0x31, 0x72, 0x59, 0x48, 0x48, 0x54, 0x6E, 0x47, 0x36, 0x69, 0x42, 0x4D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x5A, 0x41, 0x46, 0x49, 0x52, 0x20, 0x52, 0x4F, 0x4F, 0x54, 0x20, 0x43, 0x41, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x63, 0x6A, + 0x43, 0x43, 0x41, 0x6C, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x50, 0x6F, 0x70, 0x64, 0x42, 0x2B, 0x78, 0x56, 0x30, 0x6A, 0x4C, 0x56, 0x74, 0x2B, 0x4F, 0x32, 0x58, 0x77, 0x48, 0x72, 0x4C, 0x64, 0x7A, 0x6B, 0x31, 0x75, + 0x51, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x55, + 0x45, 0x77, 0x78, 0x4B, 0x44, 0x41, 0x6D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x30, 0x74, 0x79, 0x59, 0x57, 0x70, 0x76, 0x64, 0x32, 0x45, 0x67, 0x53, 0x58, 0x70, 0x69, 0x59, 0x53, 0x42, 0x53, 0x62, 0x33, 0x70, 0x73, 0x61, + 0x57, 0x4E, 0x36, 0x5A, 0x57, 0x35, 0x70, 0x62, 0x33, 0x64, 0x68, 0x49, 0x46, 0x4D, 0x75, 0x51, 0x53, 0x34, 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x4D, 0x4D, 0x44, 0x31, 0x4E, 0x61, 0x51, 0x55, 0x5A, 0x4A, + 0x55, 0x69, 0x42, 0x53, 0x54, 0x30, 0x39, 0x55, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x54, 0x45, 0x77, 0x4D, 0x54, 0x6B, 0x77, 0x4E, 0x7A, 0x51, 0x7A, 0x4D, 0x7A, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7A, + 0x4E, 0x54, 0x45, 0x77, 0x4D, 0x54, 0x6B, 0x77, 0x4E, 0x7A, 0x51, 0x7A, 0x4D, 0x7A, 0x42, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x42, 0x4D, 0x4D, 0x53, 0x67, + 0x77, 0x4A, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x39, 0x4C, 0x63, 0x6D, 0x46, 0x71, 0x62, 0x33, 0x64, 0x68, 0x49, 0x45, 0x6C, 0x36, 0x59, 0x6D, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x36, 0x62, 0x47, 0x6C, 0x6A, 0x65, 0x6D, 0x56, + 0x75, 0x61, 0x57, 0x39, 0x33, 0x59, 0x53, 0x42, 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x52, 0x67, 0x77, 0x46, 0x67, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x39, 0x54, 0x57, 0x6B, 0x46, 0x47, 0x53, 0x56, 0x49, 0x67, 0x55, 0x6B, + 0x39, 0x50, 0x56, 0x43, 0x42, 0x44, 0x51, 0x54, 0x49, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, + 0x41, 0x77, 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x33, 0x76, 0x44, 0x35, 0x51, 0x0A, 0x71, 0x45, 0x76, 0x4E, 0x51, 0x4C, 0x58, 0x4F, 0x59, 0x65, 0x65, 0x57, 0x79, 0x72, 0x53, 0x68, 0x32, 0x67, 0x77, 0x69, 0x73, + 0x50, 0x71, 0x31, 0x65, 0x33, 0x59, 0x41, 0x64, 0x34, 0x77, 0x4C, 0x7A, 0x33, 0x32, 0x6F, 0x68, 0x73, 0x77, 0x6D, 0x55, 0x65, 0x51, 0x67, 0x50, 0x59, 0x55, 0x4D, 0x31, 0x6C, 0x6A, 0x6A, 0x35, 0x2F, 0x51, 0x71, 0x47, 0x4A, 0x33, 0x61, 0x30, + 0x61, 0x34, 0x6D, 0x37, 0x75, 0x74, 0x54, 0x33, 0x50, 0x53, 0x51, 0x31, 0x68, 0x4E, 0x4B, 0x0A, 0x44, 0x4A, 0x41, 0x38, 0x77, 0x2F, 0x54, 0x61, 0x30, 0x6F, 0x34, 0x4E, 0x6B, 0x6A, 0x72, 0x63, 0x73, 0x62, 0x48, 0x2F, 0x4F, 0x4E, 0x37, 0x44, + 0x75, 0x69, 0x31, 0x66, 0x67, 0x4C, 0x6B, 0x43, 0x76, 0x55, 0x71, 0x64, 0x47, 0x77, 0x2B, 0x30, 0x77, 0x38, 0x4C, 0x42, 0x5A, 0x77, 0x50, 0x64, 0x33, 0x42, 0x75, 0x63, 0x50, 0x62, 0x4F, 0x77, 0x33, 0x67, 0x41, 0x65, 0x71, 0x44, 0x52, 0x48, + 0x75, 0x35, 0x72, 0x72, 0x2F, 0x67, 0x73, 0x55, 0x76, 0x54, 0x61, 0x45, 0x0A, 0x32, 0x67, 0x30, 0x67, 0x76, 0x2F, 0x70, 0x62, 0x79, 0x36, 0x6B, 0x57, 0x49, 0x4B, 0x30, 0x35, 0x59, 0x4F, 0x34, 0x76, 0x64, 0x62, 0x62, 0x6E, 0x6C, 0x35, 0x7A, + 0x35, 0x50, 0x76, 0x31, 0x2B, 0x54, 0x57, 0x39, 0x4E, 0x4C, 0x2B, 0x2B, 0x49, 0x44, 0x57, 0x72, 0x36, 0x33, 0x66, 0x45, 0x39, 0x62, 0x69, 0x43, 0x6C, 0x6F, 0x42, 0x4B, 0x30, 0x54, 0x58, 0x43, 0x35, 0x7A, 0x74, 0x64, 0x79, 0x4F, 0x34, 0x6D, + 0x54, 0x70, 0x34, 0x43, 0x45, 0x48, 0x43, 0x64, 0x4A, 0x0A, 0x63, 0x6B, 0x6D, 0x31, 0x2F, 0x7A, 0x75, 0x56, 0x6E, 0x73, 0x48, 0x4D, 0x79, 0x41, 0x48, 0x73, 0x36, 0x41, 0x36, 0x4B, 0x43, 0x70, 0x62, 0x6E, 0x73, 0x36, 0x61, 0x48, 0x35, 0x64, + 0x62, 0x35, 0x42, 0x53, 0x73, 0x4E, 0x6C, 0x30, 0x42, 0x77, 0x50, 0x4C, 0x71, 0x73, 0x64, 0x56, 0x71, 0x63, 0x31, 0x55, 0x32, 0x64, 0x41, 0x67, 0x72, 0x53, 0x53, 0x35, 0x74, 0x6D, 0x53, 0x30, 0x59, 0x48, 0x46, 0x32, 0x57, 0x74, 0x6E, 0x32, + 0x79, 0x49, 0x41, 0x4E, 0x77, 0x69, 0x0A, 0x69, 0x65, 0x44, 0x68, 0x5A, 0x4E, 0x52, 0x6E, 0x76, 0x44, 0x46, 0x35, 0x59, 0x54, 0x79, 0x37, 0x79, 0x6B, 0x48, 0x4E, 0x58, 0x47, 0x6F, 0x41, 0x79, 0x44, 0x77, 0x34, 0x6A, 0x6C, 0x69, 0x76, 0x41, + 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, + 0x52, 0x30, 0x50, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x51, 0x75, 0x46, 0x71, 0x6C, 0x4B, 0x47, 0x4C, 0x58, 0x4C, + 0x7A, 0x50, 0x56, 0x76, 0x55, 0x50, 0x4D, 0x6A, 0x58, 0x2F, 0x68, 0x64, 0x35, 0x36, 0x7A, 0x77, 0x79, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, + 0x0A, 0x41, 0x51, 0x45, 0x41, 0x74, 0x58, 0x50, 0x34, 0x41, 0x39, 0x78, 0x5A, 0x57, 0x78, 0x31, 0x32, 0x36, 0x61, 0x4D, 0x71, 0x65, 0x35, 0x41, 0x6F, 0x73, 0x6B, 0x33, 0x41, 0x4D, 0x30, 0x2B, 0x71, 0x6D, 0x72, 0x48, 0x55, 0x75, 0x4F, 0x51, + 0x6E, 0x2F, 0x36, 0x6D, 0x57, 0x6D, 0x63, 0x35, 0x47, 0x34, 0x47, 0x31, 0x38, 0x54, 0x4B, 0x49, 0x34, 0x70, 0x41, 0x5A, 0x77, 0x38, 0x50, 0x52, 0x42, 0x45, 0x65, 0x77, 0x2F, 0x52, 0x34, 0x30, 0x2F, 0x63, 0x6F, 0x66, 0x35, 0x0A, 0x4F, 0x2F, + 0x32, 0x6B, 0x62, 0x79, 0x74, 0x54, 0x41, 0x4F, 0x44, 0x2F, 0x4F, 0x62, 0x6C, 0x71, 0x42, 0x77, 0x37, 0x72, 0x48, 0x52, 0x7A, 0x32, 0x6F, 0x6E, 0x4B, 0x51, 0x79, 0x34, 0x49, 0x39, 0x45, 0x59, 0x4B, 0x4C, 0x30, 0x72, 0x75, 0x66, 0x4B, 0x71, + 0x38, 0x68, 0x35, 0x6D, 0x4F, 0x47, 0x6E, 0x58, 0x6B, 0x5A, 0x37, 0x2F, 0x65, 0x37, 0x44, 0x44, 0x57, 0x51, 0x77, 0x34, 0x72, 0x74, 0x54, 0x77, 0x2F, 0x31, 0x7A, 0x42, 0x4C, 0x5A, 0x70, 0x44, 0x36, 0x37, 0x0A, 0x6F, 0x50, 0x77, 0x67, 0x6C, + 0x56, 0x39, 0x50, 0x4A, 0x69, 0x38, 0x52, 0x49, 0x34, 0x4E, 0x4F, 0x64, 0x51, 0x63, 0x50, 0x76, 0x35, 0x76, 0x52, 0x74, 0x42, 0x33, 0x70, 0x45, 0x41, 0x54, 0x2B, 0x79, 0x6D, 0x43, 0x50, 0x6F, 0x6B, 0x79, 0x34, 0x72, 0x63, 0x2F, 0x68, 0x6B, + 0x41, 0x2F, 0x4E, 0x72, 0x67, 0x72, 0x48, 0x58, 0x58, 0x75, 0x33, 0x55, 0x4E, 0x4C, 0x55, 0x59, 0x66, 0x72, 0x56, 0x46, 0x64, 0x76, 0x58, 0x6E, 0x34, 0x64, 0x52, 0x56, 0x4F, 0x75, 0x6C, 0x0A, 0x34, 0x2B, 0x76, 0x4A, 0x68, 0x61, 0x41, 0x6C, + 0x49, 0x44, 0x66, 0x37, 0x6A, 0x73, 0x34, 0x4D, 0x4E, 0x49, 0x54, 0x68, 0x50, 0x49, 0x47, 0x79, 0x64, 0x30, 0x35, 0x44, 0x70, 0x59, 0x68, 0x66, 0x68, 0x6D, 0x65, 0x68, 0x50, 0x65, 0x61, 0x30, 0x58, 0x47, 0x47, 0x32, 0x50, 0x74, 0x76, 0x2B, + 0x74, 0x79, 0x6A, 0x46, 0x6F, 0x67, 0x65, 0x75, 0x74, 0x63, 0x72, 0x4B, 0x6A, 0x53, 0x6F, 0x53, 0x37, 0x35, 0x66, 0x74, 0x77, 0x6A, 0x43, 0x6B, 0x79, 0x53, 0x70, 0x36, 0x0A, 0x2B, 0x2F, 0x4E, 0x4E, 0x49, 0x78, 0x75, 0x5A, 0x4D, 0x7A, 0x53, + 0x67, 0x4C, 0x76, 0x57, 0x70, 0x43, 0x7A, 0x2F, 0x55, 0x58, 0x65, 0x48, 0x50, 0x68, 0x4A, 0x2F, 0x69, 0x47, 0x63, 0x4A, 0x66, 0x69, 0x74, 0x59, 0x67, 0x48, 0x75, 0x4E, 0x7A, 0x74, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6D, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x4E, 0x65, 0x74, 0x77, + 0x6F, 0x72, 0x6B, 0x20, 0x43, 0x41, 0x20, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x30, 0x6A, 0x43, 0x43, 0x41, 0x37, 0x71, 0x67, 0x41, 0x77, 0x49, + 0x42, 0x41, 0x67, 0x49, 0x51, 0x49, 0x64, 0x62, 0x51, 0x53, 0x6B, 0x38, 0x6C, 0x44, 0x38, 0x6B, 0x79, 0x4E, 0x2F, 0x79, 0x71, 0x58, 0x68, 0x4B, 0x4E, 0x36, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, + 0x42, 0x41, 0x51, 0x30, 0x46, 0x41, 0x44, 0x43, 0x42, 0x67, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x55, 0x45, 0x77, 0x78, 0x49, 0x6A, 0x41, 0x67, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, + 0x6F, 0x54, 0x47, 0x56, 0x56, 0x75, 0x61, 0x58, 0x70, 0x6C, 0x64, 0x47, 0x38, 0x67, 0x56, 0x47, 0x56, 0x6A, 0x61, 0x47, 0x35, 0x76, 0x62, 0x47, 0x39, 0x6E, 0x61, 0x57, 0x56, 0x7A, 0x49, 0x46, 0x4D, 0x75, 0x51, 0x53, 0x34, 0x78, 0x4A, 0x7A, + 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x48, 0x6B, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x31, 0x0A, 0x62, 0x53, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, + 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x45, 0x6B, 0x4D, 0x43, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x62, 0x51, 0x32, 0x56, 0x79, 0x64, 0x48, 0x56, 0x74, 0x49, 0x46, 0x52, 0x79, 0x64, + 0x58, 0x4E, 0x30, 0x5A, 0x57, 0x51, 0x67, 0x54, 0x6D, 0x56, 0x30, 0x64, 0x32, 0x39, 0x79, 0x0A, 0x61, 0x79, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x43, 0x49, 0x59, 0x44, 0x7A, 0x49, 0x77, 0x4D, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x41, 0x32, + 0x4D, 0x44, 0x67, 0x7A, 0x4F, 0x54, 0x55, 0x32, 0x57, 0x68, 0x67, 0x50, 0x4D, 0x6A, 0x41, 0x30, 0x4E, 0x6A, 0x45, 0x77, 0x4D, 0x44, 0x59, 0x77, 0x4F, 0x44, 0x4D, 0x35, 0x4E, 0x54, 0x5A, 0x61, 0x4D, 0x49, 0x47, 0x41, 0x4D, 0x51, 0x73, 0x77, + 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x51, 0x0A, 0x54, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x56, 0x57, 0x35, 0x70, 0x65, 0x6D, 0x56, 0x30, 0x62, 0x79, 0x42, + 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x67, 0x55, 0x79, 0x35, 0x42, 0x4C, 0x6A, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x65, 0x51, 0x32, 0x56, + 0x79, 0x64, 0x48, 0x56, 0x74, 0x49, 0x45, 0x4E, 0x6C, 0x0A, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x53, + 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x74, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, 0x67, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x6C, 0x5A, 0x43, 0x42, 0x4F, 0x5A, 0x58, 0x52, 0x33, 0x62, 0x33, + 0x4A, 0x72, 0x49, 0x45, 0x4E, 0x42, 0x0A, 0x49, 0x44, 0x49, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, + 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x39, 0x2B, 0x58, 0x6A, 0x34, 0x35, 0x74, 0x57, 0x41, 0x44, 0x47, 0x53, 0x64, 0x68, 0x68, 0x75, 0x57, 0x5A, 0x47, 0x63, 0x2F, 0x49, 0x6A, 0x6F, 0x65, 0x64, + 0x51, 0x46, 0x39, 0x0A, 0x37, 0x2F, 0x74, 0x63, 0x5A, 0x34, 0x7A, 0x4A, 0x7A, 0x46, 0x78, 0x72, 0x71, 0x5A, 0x48, 0x6D, 0x75, 0x55, 0x4C, 0x6C, 0x49, 0x45, 0x75, 0x62, 0x32, 0x70, 0x74, 0x37, 0x75, 0x5A, 0x6C, 0x64, 0x32, 0x5A, 0x75, 0x41, + 0x53, 0x39, 0x65, 0x45, 0x51, 0x43, 0x73, 0x6E, 0x30, 0x2B, 0x69, 0x36, 0x4D, 0x4C, 0x73, 0x2B, 0x43, 0x52, 0x71, 0x6E, 0x53, 0x5A, 0x58, 0x76, 0x4B, 0x30, 0x41, 0x6B, 0x77, 0x70, 0x66, 0x48, 0x70, 0x2B, 0x36, 0x62, 0x4A, 0x65, 0x2B, 0x6F, + 0x0A, 0x43, 0x67, 0x43, 0x58, 0x68, 0x56, 0x71, 0x71, 0x6E, 0x64, 0x77, 0x70, 0x79, 0x65, 0x49, 0x31, 0x42, 0x2B, 0x74, 0x77, 0x54, 0x55, 0x72, 0x57, 0x77, 0x62, 0x4E, 0x57, 0x75, 0x4B, 0x46, 0x42, 0x4F, 0x4A, 0x76, 0x52, 0x2B, 0x7A, 0x46, + 0x2F, 0x6A, 0x2B, 0x42, 0x66, 0x34, 0x62, 0x45, 0x2F, 0x44, 0x34, 0x34, 0x57, 0x53, 0x57, 0x44, 0x58, 0x42, 0x6F, 0x30, 0x59, 0x2B, 0x61, 0x6F, 0x6D, 0x45, 0x4B, 0x73, 0x71, 0x30, 0x39, 0x44, 0x52, 0x5A, 0x34, 0x30, 0x62, 0x0A, 0x52, 0x72, + 0x35, 0x48, 0x4D, 0x4E, 0x55, 0x75, 0x63, 0x74, 0x48, 0x46, 0x59, 0x39, 0x72, 0x6E, 0x59, 0x33, 0x6C, 0x45, 0x66, 0x6B, 0x74, 0x6A, 0x4A, 0x49, 0x6D, 0x47, 0x4C, 0x6A, 0x51, 0x2F, 0x4B, 0x55, 0x78, 0x53, 0x69, 0x79, 0x71, 0x6E, 0x77, 0x4F, + 0x4B, 0x52, 0x4B, 0x49, 0x6D, 0x35, 0x77, 0x46, 0x76, 0x35, 0x48, 0x64, 0x6E, 0x6E, 0x4A, 0x36, 0x33, 0x2F, 0x6D, 0x67, 0x4B, 0x58, 0x77, 0x63, 0x5A, 0x51, 0x6B, 0x70, 0x73, 0x43, 0x4C, 0x4C, 0x32, 0x70, 0x0A, 0x75, 0x54, 0x52, 0x5A, 0x43, + 0x72, 0x2B, 0x45, 0x53, 0x76, 0x2F, 0x66, 0x2F, 0x72, 0x4F, 0x66, 0x36, 0x39, 0x6D, 0x65, 0x34, 0x4A, 0x67, 0x6A, 0x37, 0x4B, 0x5A, 0x72, 0x64, 0x78, 0x59, 0x71, 0x32, 0x38, 0x79, 0x74, 0x4F, 0x78, 0x79, 0x6B, 0x68, 0x39, 0x78, 0x47, 0x63, + 0x31, 0x34, 0x5A, 0x59, 0x6D, 0x68, 0x46, 0x56, 0x2B, 0x53, 0x51, 0x67, 0x6B, 0x4B, 0x37, 0x51, 0x74, 0x62, 0x77, 0x59, 0x65, 0x44, 0x42, 0x6F, 0x7A, 0x31, 0x6D, 0x6F, 0x31, 0x33, 0x30, 0x0A, 0x47, 0x4F, 0x36, 0x49, 0x79, 0x59, 0x30, 0x58, + 0x52, 0x53, 0x6D, 0x5A, 0x4D, 0x6E, 0x55, 0x43, 0x4D, 0x65, 0x34, 0x70, 0x4A, 0x73, 0x68, 0x72, 0x41, 0x75, 0x61, 0x31, 0x59, 0x6B, 0x56, 0x2F, 0x4E, 0x78, 0x56, 0x61, 0x49, 0x32, 0x69, 0x4A, 0x31, 0x44, 0x37, 0x65, 0x54, 0x69, 0x65, 0x77, + 0x38, 0x45, 0x41, 0x4D, 0x76, 0x45, 0x30, 0x58, 0x79, 0x30, 0x32, 0x69, 0x73, 0x78, 0x37, 0x51, 0x42, 0x6C, 0x72, 0x64, 0x39, 0x70, 0x50, 0x50, 0x56, 0x33, 0x57, 0x5A, 0x0A, 0x39, 0x66, 0x71, 0x47, 0x47, 0x6D, 0x64, 0x34, 0x73, 0x37, 0x2B, + 0x57, 0x2F, 0x6A, 0x54, 0x63, 0x76, 0x65, 0x64, 0x53, 0x56, 0x75, 0x57, 0x7A, 0x35, 0x58, 0x56, 0x37, 0x31, 0x30, 0x47, 0x52, 0x42, 0x64, 0x78, 0x64, 0x61, 0x65, 0x4F, 0x56, 0x44, 0x55, 0x4F, 0x35, 0x2F, 0x49, 0x4F, 0x57, 0x4F, 0x5A, 0x56, + 0x37, 0x62, 0x49, 0x42, 0x61, 0x54, 0x78, 0x4E, 0x79, 0x78, 0x74, 0x64, 0x39, 0x4B, 0x58, 0x70, 0x45, 0x75, 0x6C, 0x4B, 0x6B, 0x4B, 0x74, 0x56, 0x42, 0x0A, 0x52, 0x67, 0x6B, 0x67, 0x2F, 0x69, 0x4B, 0x67, 0x74, 0x6C, 0x73, 0x77, 0x6A, 0x62, + 0x79, 0x4A, 0x44, 0x4E, 0x58, 0x58, 0x63, 0x50, 0x69, 0x48, 0x55, 0x76, 0x33, 0x61, 0x37, 0x36, 0x78, 0x52, 0x4C, 0x67, 0x65, 0x7A, 0x54, 0x76, 0x37, 0x51, 0x43, 0x64, 0x70, 0x77, 0x37, 0x35, 0x6A, 0x36, 0x56, 0x75, 0x5A, 0x74, 0x32, 0x37, + 0x56, 0x58, 0x53, 0x39, 0x7A, 0x6C, 0x4C, 0x43, 0x55, 0x56, 0x79, 0x4A, 0x34, 0x75, 0x65, 0x45, 0x37, 0x34, 0x32, 0x70, 0x79, 0x65, 0x0A, 0x68, 0x69, 0x7A, 0x4B, 0x56, 0x2F, 0x4D, 0x61, 0x35, 0x63, 0x69, 0x53, 0x69, 0x78, 0x71, 0x43, 0x6C, + 0x6E, 0x72, 0x44, 0x76, 0x46, 0x41, 0x53, 0x61, 0x64, 0x67, 0x4F, 0x57, 0x6B, 0x61, 0x4C, 0x4F, 0x75, 0x73, 0x6D, 0x2B, 0x69, 0x50, 0x4A, 0x74, 0x72, 0x43, 0x42, 0x76, 0x6B, 0x49, 0x41, 0x70, 0x50, 0x6A, 0x57, 0x2F, 0x6A, 0x41, 0x75, 0x78, + 0x39, 0x4A, 0x47, 0x39, 0x75, 0x57, 0x4F, 0x64, 0x66, 0x33, 0x79, 0x7A, 0x4C, 0x6E, 0x51, 0x68, 0x31, 0x76, 0x4D, 0x0A, 0x42, 0x68, 0x42, 0x67, 0x75, 0x34, 0x4D, 0x31, 0x74, 0x31, 0x35, 0x6E, 0x33, 0x6B, 0x66, 0x73, 0x6D, 0x55, 0x6A, 0x78, + 0x70, 0x4B, 0x45, 0x56, 0x2F, 0x71, 0x32, 0x4D, 0x59, 0x6F, 0x34, 0x35, 0x56, 0x55, 0x38, 0x35, 0x46, 0x72, 0x6D, 0x78, 0x59, 0x35, 0x33, 0x2F, 0x74, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, + 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x32, 0x6F, 0x56, 0x51, + 0x35, 0x41, 0x73, 0x4F, 0x67, 0x50, 0x34, 0x36, 0x4B, 0x76, 0x50, 0x72, 0x55, 0x2B, 0x42, 0x79, 0x6D, 0x30, 0x54, 0x6F, 0x4F, 0x2F, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, + 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4E, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x48, 0x47, 0x6C, 0x44, 0x73, 0x37, 0x6B, 0x36, 0x62, + 0x38, 0x2F, 0x4F, 0x4E, 0x57, 0x4A, 0x57, 0x73, 0x51, 0x43, 0x59, 0x66, 0x74, 0x4D, 0x78, 0x52, 0x51, 0x58, 0x4C, 0x59, 0x74, 0x50, 0x55, 0x32, 0x73, 0x51, 0x46, 0x2F, 0x78, 0x6C, 0x68, 0x4D, 0x63, 0x51, 0x53, 0x5A, 0x44, 0x65, 0x32, 0x38, + 0x63, 0x6D, 0x6B, 0x34, 0x67, 0x6D, 0x62, 0x33, 0x44, 0x57, 0x0A, 0x41, 0x6C, 0x34, 0x35, 0x6F, 0x50, 0x65, 0x50, 0x71, 0x35, 0x61, 0x31, 0x70, 0x52, 0x4E, 0x63, 0x67, 0x52, 0x52, 0x74, 0x44, 0x6F, 0x47, 0x43, 0x45, 0x52, 0x75, 0x4B, 0x54, + 0x73, 0x5A, 0x50, 0x70, 0x64, 0x31, 0x69, 0x48, 0x6B, 0x54, 0x66, 0x43, 0x56, 0x6E, 0x30, 0x57, 0x33, 0x63, 0x4C, 0x4E, 0x2B, 0x6D, 0x4C, 0x49, 0x4D, 0x62, 0x34, 0x43, 0x6B, 0x34, 0x75, 0x57, 0x42, 0x7A, 0x72, 0x4D, 0x39, 0x44, 0x50, 0x68, + 0x6D, 0x44, 0x4A, 0x32, 0x76, 0x75, 0x41, 0x0A, 0x4C, 0x35, 0x35, 0x4D, 0x59, 0x49, 0x52, 0x34, 0x50, 0x53, 0x46, 0x6B, 0x31, 0x76, 0x74, 0x42, 0x48, 0x78, 0x67, 0x50, 0x35, 0x38, 0x6C, 0x31, 0x63, 0x62, 0x32, 0x39, 0x58, 0x4E, 0x34, 0x30, + 0x68, 0x7A, 0x35, 0x42, 0x73, 0x41, 0x37, 0x32, 0x75, 0x64, 0x59, 0x2F, 0x43, 0x52, 0x4F, 0x57, 0x46, 0x43, 0x2F, 0x65, 0x6D, 0x68, 0x31, 0x61, 0x75, 0x56, 0x62, 0x4F, 0x4E, 0x54, 0x71, 0x77, 0x58, 0x33, 0x42, 0x4E, 0x58, 0x75, 0x4D, 0x70, + 0x38, 0x53, 0x4D, 0x6F, 0x0A, 0x63, 0x6C, 0x6D, 0x32, 0x71, 0x38, 0x4B, 0x4D, 0x5A, 0x69, 0x59, 0x63, 0x64, 0x79, 0x77, 0x6D, 0x64, 0x6A, 0x57, 0x4C, 0x4B, 0x4B, 0x64, 0x70, 0x6F, 0x50, 0x6B, 0x37, 0x39, 0x53, 0x50, 0x64, 0x68, 0x52, 0x42, + 0x30, 0x79, 0x5A, 0x41, 0x44, 0x56, 0x70, 0x48, 0x6E, 0x72, 0x37, 0x70, 0x48, 0x31, 0x42, 0x4B, 0x58, 0x45, 0x53, 0x4C, 0x6A, 0x6F, 0x6B, 0x6D, 0x55, 0x62, 0x4F, 0x65, 0x33, 0x6C, 0x45, 0x75, 0x36, 0x4C, 0x61, 0x54, 0x61, 0x4D, 0x34, 0x74, + 0x4D, 0x0A, 0x70, 0x6B, 0x54, 0x2F, 0x57, 0x6A, 0x7A, 0x47, 0x48, 0x57, 0x54, 0x59, 0x74, 0x54, 0x48, 0x6B, 0x70, 0x6A, 0x78, 0x36, 0x71, 0x46, 0x63, 0x4C, 0x32, 0x2B, 0x31, 0x68, 0x47, 0x73, 0x76, 0x78, 0x7A, 0x6E, 0x4E, 0x33, 0x59, 0x36, + 0x53, 0x48, 0x62, 0x30, 0x78, 0x52, 0x4F, 0x4E, 0x62, 0x6B, 0x58, 0x38, 0x65, 0x66, 0x74, 0x6F, 0x45, 0x71, 0x35, 0x49, 0x56, 0x49, 0x65, 0x56, 0x68, 0x65, 0x4F, 0x2F, 0x6A, 0x62, 0x41, 0x6F, 0x4A, 0x6E, 0x77, 0x54, 0x6E, 0x62, 0x0A, 0x77, + 0x33, 0x52, 0x4C, 0x50, 0x54, 0x59, 0x65, 0x2B, 0x53, 0x6D, 0x54, 0x69, 0x47, 0x68, 0x62, 0x71, 0x45, 0x51, 0x5A, 0x49, 0x66, 0x43, 0x6E, 0x36, 0x49, 0x45, 0x4E, 0x4C, 0x4F, 0x69, 0x54, 0x4E, 0x72, 0x51, 0x33, 0x73, 0x73, 0x71, 0x77, 0x47, + 0x79, 0x5A, 0x36, 0x6D, 0x69, 0x55, 0x66, 0x6D, 0x70, 0x71, 0x41, 0x6E, 0x6B, 0x73, 0x71, 0x50, 0x2F, 0x75, 0x6A, 0x6D, 0x76, 0x35, 0x7A, 0x4D, 0x6E, 0x48, 0x43, 0x6E, 0x73, 0x5A, 0x79, 0x34, 0x59, 0x70, 0x6F, 0x0A, 0x4A, 0x2F, 0x48, 0x6B, + 0x44, 0x37, 0x54, 0x45, 0x54, 0x4B, 0x56, 0x68, 0x6B, 0x2F, 0x69, 0x58, 0x45, 0x41, 0x63, 0x71, 0x4D, 0x43, 0x57, 0x70, 0x75, 0x63, 0x68, 0x78, 0x75, 0x4F, 0x39, 0x6F, 0x7A, 0x43, 0x31, 0x2B, 0x39, 0x65, 0x42, 0x2B, 0x44, 0x34, 0x4B, 0x6F, + 0x62, 0x37, 0x61, 0x36, 0x62, 0x49, 0x4E, 0x44, 0x64, 0x38, 0x32, 0x4B, 0x6B, 0x68, 0x65, 0x68, 0x6E, 0x6C, 0x74, 0x34, 0x46, 0x6A, 0x31, 0x46, 0x34, 0x6A, 0x4E, 0x79, 0x33, 0x65, 0x46, 0x6D, 0x0A, 0x79, 0x70, 0x6E, 0x54, 0x79, 0x63, 0x55, + 0x6D, 0x2F, 0x51, 0x31, 0x6F, 0x42, 0x45, 0x61, 0x75, 0x74, 0x74, 0x6D, 0x62, 0x6A, 0x4C, 0x34, 0x5A, 0x76, 0x72, 0x48, 0x47, 0x38, 0x68, 0x6E, 0x6A, 0x58, 0x41, 0x4C, 0x4B, 0x4C, 0x4E, 0x68, 0x76, 0x53, 0x67, 0x66, 0x5A, 0x79, 0x54, 0x58, + 0x61, 0x51, 0x48, 0x58, 0x79, 0x78, 0x4B, 0x63, 0x5A, 0x62, 0x35, 0x35, 0x43, 0x45, 0x4A, 0x68, 0x31, 0x35, 0x70, 0x57, 0x4C, 0x59, 0x4C, 0x7A, 0x74, 0x78, 0x52, 0x4C, 0x58, 0x0A, 0x69, 0x73, 0x37, 0x56, 0x6D, 0x46, 0x78, 0x57, 0x6C, 0x67, + 0x50, 0x46, 0x37, 0x6E, 0x63, 0x47, 0x4E, 0x66, 0x2F, 0x50, 0x35, 0x4F, 0x34, 0x2F, 0x45, 0x32, 0x48, 0x75, 0x32, 0x39, 0x6F, 0x74, 0x68, 0x66, 0x44, 0x4E, 0x72, 0x70, 0x32, 0x79, 0x47, 0x41, 0x6C, 0x46, 0x77, 0x35, 0x4B, 0x68, 0x63, 0x68, + 0x66, 0x38, 0x52, 0x37, 0x61, 0x67, 0x43, 0x79, 0x7A, 0x78, 0x78, 0x4E, 0x35, 0x44, 0x61, 0x41, 0x68, 0x71, 0x58, 0x7A, 0x76, 0x77, 0x64, 0x6D, 0x50, 0x37, 0x0A, 0x7A, 0x41, 0x59, 0x73, 0x70, 0x73, 0x62, 0x69, 0x44, 0x72, 0x57, 0x35, 0x76, + 0x69, 0x53, 0x50, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x65, 0x6E, 0x69, 0x63, 0x20, + 0x41, 0x63, 0x61, 0x64, 0x65, 0x6D, 0x69, 0x63, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6E, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x43, + 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x47, 0x43, 0x7A, 0x43, 0x43, 0x41, 0x2F, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, + 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x70, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x31, 0x49, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x0A, 0x42, 0x6B, 0x46, 0x30, 0x61, 0x47, 0x56, 0x75, 0x63, 0x7A, 0x46, 0x45, 0x4D, 0x45, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x37, 0x53, 0x47, 0x56, 0x73, 0x62, 0x47, 0x56, 0x75, + 0x61, 0x57, 0x4D, 0x67, 0x51, 0x57, 0x4E, 0x68, 0x5A, 0x47, 0x56, 0x74, 0x61, 0x57, 0x4D, 0x67, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, 0x45, 0x6C, 0x75, 0x63, 0x33, 0x52, 0x70, + 0x64, 0x48, 0x56, 0x30, 0x0A, 0x61, 0x57, 0x39, 0x75, 0x63, 0x79, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x4C, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x51, 0x44, 0x41, 0x2B, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4E, 0x30, 0x68, 0x6C, 0x62, 0x47, 0x78, 0x6C, 0x62, 0x6D, 0x6C, 0x6A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x62, 0x57, 0x6C, 0x6A, 0x49, 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, + 0x6C, 0x0A, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, 0x4A, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x54, + 0x55, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x55, 0x77, 0x4E, 0x7A, 0x41, 0x33, 0x4D, 0x54, 0x41, 0x78, 0x4D, 0x54, 0x49, 0x78, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x41, 0x77, 0x4E, 0x6A, 0x4D, 0x77, 0x4D, 0x54, 0x41, 0x78, 0x0A, 0x4D, + 0x54, 0x49, 0x78, 0x57, 0x6A, 0x43, 0x42, 0x70, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x31, 0x49, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, + 0x6B, 0x46, 0x30, 0x61, 0x47, 0x56, 0x75, 0x63, 0x7A, 0x46, 0x45, 0x4D, 0x45, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x37, 0x53, 0x47, 0x56, 0x73, 0x62, 0x47, 0x56, 0x75, 0x61, 0x57, 0x4D, 0x67, 0x0A, 0x51, 0x57, 0x4E, 0x68, + 0x5A, 0x47, 0x56, 0x74, 0x61, 0x57, 0x4D, 0x67, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, 0x45, 0x6C, 0x75, 0x63, 0x33, 0x52, 0x70, 0x64, 0x48, 0x56, 0x30, 0x61, 0x57, 0x39, 0x75, + 0x63, 0x79, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x4C, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x51, 0x44, 0x41, 0x2B, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x4D, 0x54, 0x4E, 0x30, 0x68, + 0x6C, 0x62, 0x47, 0x78, 0x6C, 0x62, 0x6D, 0x6C, 0x6A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x62, 0x57, 0x6C, 0x6A, 0x49, 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, + 0x4A, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x77, 0x0A, 0x4D, 0x54, 0x55, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, + 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x43, 0x2B, 0x4B, + 0x6B, 0x2F, 0x47, 0x34, 0x6E, 0x38, 0x50, 0x44, 0x77, 0x45, 0x58, 0x54, 0x32, 0x51, 0x4E, 0x72, 0x43, 0x52, 0x4F, 0x6E, 0x6B, 0x38, 0x5A, 0x6C, 0x72, 0x76, 0x0A, 0x62, 0x54, 0x6B, 0x42, 0x53, 0x52, 0x71, 0x30, 0x74, 0x38, 0x39, 0x2F, 0x54, + 0x53, 0x4E, 0x54, 0x74, 0x35, 0x41, 0x41, 0x34, 0x78, 0x4D, 0x71, 0x4B, 0x4B, 0x59, 0x78, 0x38, 0x5A, 0x45, 0x41, 0x34, 0x79, 0x6A, 0x73, 0x72, 0x69, 0x46, 0x42, 0x7A, 0x68, 0x2F, 0x61, 0x2F, 0x58, 0x30, 0x53, 0x57, 0x77, 0x47, 0x44, 0x44, + 0x37, 0x6D, 0x77, 0x58, 0x35, 0x6E, 0x68, 0x38, 0x68, 0x4B, 0x44, 0x67, 0x45, 0x30, 0x47, 0x50, 0x74, 0x2B, 0x73, 0x72, 0x2B, 0x65, 0x68, 0x0A, 0x69, 0x47, 0x73, 0x78, 0x72, 0x2F, 0x43, 0x4C, 0x30, 0x42, 0x67, 0x7A, 0x75, 0x4E, 0x74, 0x46, + 0x61, 0x6A, 0x54, 0x30, 0x41, 0x6F, 0x41, 0x6B, 0x4B, 0x41, 0x6F, 0x43, 0x46, 0x5A, 0x56, 0x65, 0x64, 0x69, 0x6F, 0x4E, 0x6D, 0x54, 0x6F, 0x55, 0x57, 0x2F, 0x62, 0x4C, 0x79, 0x31, 0x4F, 0x38, 0x45, 0x30, 0x30, 0x42, 0x69, 0x44, 0x65, 0x55, + 0x4A, 0x52, 0x74, 0x43, 0x76, 0x43, 0x4C, 0x59, 0x6A, 0x71, 0x4F, 0x57, 0x58, 0x6A, 0x72, 0x5A, 0x4D, 0x74, 0x73, 0x2B, 0x0A, 0x36, 0x50, 0x41, 0x51, 0x5A, 0x65, 0x31, 0x30, 0x34, 0x53, 0x2B, 0x6E, 0x66, 0x4B, 0x38, 0x6E, 0x4E, 0x4C, 0x73, + 0x70, 0x66, 0x5A, 0x75, 0x32, 0x7A, 0x77, 0x6E, 0x49, 0x35, 0x64, 0x4D, 0x4B, 0x2F, 0x49, 0x68, 0x6C, 0x5A, 0x58, 0x51, 0x4B, 0x33, 0x48, 0x4D, 0x63, 0x58, 0x4D, 0x31, 0x41, 0x73, 0x52, 0x7A, 0x55, 0x74, 0x6F, 0x53, 0x4D, 0x54, 0x46, 0x44, + 0x50, 0x61, 0x49, 0x36, 0x6F, 0x57, 0x61, 0x37, 0x43, 0x4A, 0x30, 0x36, 0x43, 0x6F, 0x6A, 0x58, 0x64, 0x0A, 0x46, 0x50, 0x51, 0x66, 0x2F, 0x37, 0x4A, 0x33, 0x31, 0x59, 0x63, 0x76, 0x71, 0x6D, 0x35, 0x39, 0x4A, 0x43, 0x66, 0x6E, 0x78, 0x73, + 0x73, 0x6D, 0x35, 0x75, 0x58, 0x2B, 0x5A, 0x77, 0x64, 0x6A, 0x32, 0x45, 0x55, 0x4E, 0x33, 0x54, 0x70, 0x5A, 0x5A, 0x54, 0x6C, 0x59, 0x65, 0x70, 0x4B, 0x5A, 0x63, 0x6A, 0x32, 0x63, 0x68, 0x46, 0x36, 0x49, 0x49, 0x62, 0x6A, 0x56, 0x39, 0x43, + 0x7A, 0x38, 0x32, 0x58, 0x42, 0x53, 0x54, 0x33, 0x69, 0x34, 0x76, 0x54, 0x77, 0x72, 0x0A, 0x69, 0x35, 0x57, 0x59, 0x39, 0x62, 0x50, 0x52, 0x61, 0x4D, 0x38, 0x67, 0x46, 0x48, 0x35, 0x4D, 0x58, 0x46, 0x2F, 0x6E, 0x69, 0x2B, 0x58, 0x31, 0x4E, + 0x59, 0x45, 0x5A, 0x4E, 0x39, 0x63, 0x52, 0x43, 0x4C, 0x64, 0x6D, 0x76, 0x74, 0x4E, 0x4B, 0x7A, 0x6F, 0x4E, 0x58, 0x41, 0x44, 0x72, 0x44, 0x67, 0x66, 0x67, 0x58, 0x79, 0x35, 0x49, 0x32, 0x58, 0x64, 0x47, 0x6A, 0x32, 0x48, 0x55, 0x62, 0x34, + 0x59, 0x73, 0x6E, 0x36, 0x6E, 0x70, 0x49, 0x51, 0x66, 0x31, 0x46, 0x0A, 0x47, 0x51, 0x61, 0x74, 0x4A, 0x35, 0x6C, 0x4F, 0x77, 0x58, 0x42, 0x48, 0x33, 0x62, 0x57, 0x66, 0x67, 0x56, 0x4D, 0x53, 0x35, 0x62, 0x47, 0x4D, 0x53, 0x46, 0x30, 0x78, + 0x51, 0x78, 0x66, 0x6A, 0x6A, 0x4D, 0x5A, 0x36, 0x59, 0x35, 0x5A, 0x4C, 0x4B, 0x54, 0x42, 0x4F, 0x68, 0x45, 0x35, 0x69, 0x47, 0x56, 0x34, 0x38, 0x7A, 0x70, 0x65, 0x51, 0x70, 0x58, 0x38, 0x42, 0x36, 0x35, 0x33, 0x67, 0x2B, 0x49, 0x75, 0x4A, + 0x33, 0x53, 0x57, 0x59, 0x50, 0x5A, 0x4B, 0x32, 0x0A, 0x66, 0x75, 0x2F, 0x5A, 0x38, 0x56, 0x46, 0x52, 0x66, 0x53, 0x30, 0x6D, 0x79, 0x47, 0x6C, 0x5A, 0x59, 0x65, 0x43, 0x73, 0x61, 0x72, 0x67, 0x71, 0x4E, 0x68, 0x45, 0x45, 0x65, 0x6C, 0x43, + 0x39, 0x4D, 0x6F, 0x53, 0x2B, 0x4C, 0x39, 0x78, 0x79, 0x31, 0x64, 0x63, 0x64, 0x46, 0x6B, 0x66, 0x6B, 0x52, 0x32, 0x59, 0x67, 0x50, 0x2F, 0x53, 0x57, 0x78, 0x61, 0x2B, 0x4F, 0x41, 0x58, 0x71, 0x6C, 0x44, 0x33, 0x70, 0x6B, 0x39, 0x51, 0x30, + 0x59, 0x68, 0x39, 0x6D, 0x75, 0x0A, 0x69, 0x4E, 0x58, 0x36, 0x68, 0x4D, 0x45, 0x36, 0x77, 0x47, 0x6B, 0x6F, 0x4C, 0x66, 0x49, 0x4E, 0x61, 0x46, 0x47, 0x71, 0x34, 0x36, 0x56, 0x33, 0x78, 0x71, 0x53, 0x51, 0x44, 0x71, 0x45, 0x33, 0x69, 0x7A, + 0x45, 0x6A, 0x52, 0x38, 0x45, 0x4A, 0x43, 0x4F, 0x74, 0x75, 0x39, 0x33, 0x69, 0x62, 0x31, 0x34, 0x4C, 0x38, 0x68, 0x43, 0x43, 0x5A, 0x53, 0x52, 0x6D, 0x32, 0x45, 0x6B, 0x61, 0x78, 0x2B, 0x30, 0x56, 0x56, 0x46, 0x71, 0x6D, 0x6A, 0x5A, 0x61, + 0x79, 0x63, 0x0A, 0x42, 0x77, 0x2F, 0x71, 0x61, 0x39, 0x77, 0x66, 0x4C, 0x67, 0x5A, 0x79, 0x37, 0x49, 0x61, 0x49, 0x45, 0x75, 0x51, 0x74, 0x32, 0x31, 0x38, 0x46, 0x4C, 0x2B, 0x54, 0x77, 0x41, 0x39, 0x4D, 0x6D, 0x4D, 0x2B, 0x65, 0x41, 0x77, + 0x73, 0x31, 0x43, 0x6F, 0x52, 0x63, 0x30, 0x43, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x0A, + 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, + 0x63, 0x52, 0x56, 0x6E, 0x79, 0x4D, 0x6A, 0x4A, 0x76, 0x58, 0x56, 0x64, 0x63, 0x74, 0x41, 0x34, 0x47, 0x47, 0x71, 0x64, 0x38, 0x33, 0x45, 0x6B, 0x56, 0x41, 0x73, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, + 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x48, 0x57, 0x37, 0x62, 0x56, 0x52, 0x4C, 0x71, 0x68, 0x42, 0x59, 0x52, 0x6A, 0x54, 0x79, 0x59, 0x74, 0x63, 0x57, 0x4E, 0x6C, 0x30, 0x49, 0x58, 0x74, 0x56, + 0x73, 0x79, 0x49, 0x65, 0x39, 0x74, 0x43, 0x35, 0x47, 0x38, 0x6A, 0x48, 0x34, 0x66, 0x4F, 0x70, 0x43, 0x74, 0x5A, 0x4D, 0x57, 0x56, 0x64, 0x79, 0x68, 0x44, 0x42, 0x4B, 0x67, 0x32, 0x6D, 0x46, 0x2B, 0x0A, 0x44, 0x31, 0x68, 0x59, 0x63, 0x32, + 0x52, 0x79, 0x78, 0x2B, 0x68, 0x46, 0x6A, 0x74, 0x79, 0x70, 0x38, 0x69, 0x59, 0x2F, 0x78, 0x6E, 0x6D, 0x4D, 0x73, 0x56, 0x4D, 0x49, 0x4D, 0x34, 0x47, 0x77, 0x56, 0x68, 0x4F, 0x2B, 0x35, 0x6C, 0x46, 0x63, 0x32, 0x4A, 0x73, 0x4B, 0x54, 0x30, + 0x75, 0x63, 0x56, 0x6C, 0x4D, 0x43, 0x36, 0x55, 0x2F, 0x32, 0x44, 0x57, 0x44, 0x71, 0x54, 0x55, 0x4A, 0x56, 0x36, 0x48, 0x77, 0x62, 0x49, 0x53, 0x48, 0x54, 0x47, 0x7A, 0x72, 0x4D, 0x0A, 0x64, 0x2F, 0x4B, 0x34, 0x6B, 0x50, 0x46, 0x6F, 0x78, + 0x2F, 0x6C, 0x61, 0x2F, 0x76, 0x6F, 0x74, 0x39, 0x4C, 0x2F, 0x4A, 0x39, 0x55, 0x55, 0x62, 0x7A, 0x6A, 0x67, 0x51, 0x4B, 0x6A, 0x65, 0x4B, 0x65, 0x61, 0x4F, 0x30, 0x34, 0x77, 0x6C, 0x73, 0x68, 0x59, 0x61, 0x54, 0x2F, 0x34, 0x6D, 0x57, 0x4A, + 0x33, 0x69, 0x42, 0x6A, 0x32, 0x66, 0x6A, 0x52, 0x6E, 0x52, 0x55, 0x6A, 0x74, 0x6B, 0x4E, 0x61, 0x65, 0x4A, 0x4B, 0x39, 0x45, 0x31, 0x30, 0x41, 0x2F, 0x2B, 0x79, 0x0A, 0x64, 0x2B, 0x32, 0x56, 0x5A, 0x35, 0x66, 0x6B, 0x73, 0x63, 0x57, 0x72, + 0x76, 0x32, 0x6F, 0x6A, 0x36, 0x4E, 0x53, 0x55, 0x34, 0x6B, 0x51, 0x6F, 0x59, 0x73, 0x52, 0x4C, 0x34, 0x76, 0x44, 0x59, 0x34, 0x69, 0x6C, 0x72, 0x47, 0x6E, 0x42, 0x2B, 0x4A, 0x47, 0x47, 0x54, 0x65, 0x30, 0x38, 0x44, 0x4D, 0x69, 0x55, 0x4E, + 0x52, 0x53, 0x51, 0x72, 0x6C, 0x72, 0x52, 0x47, 0x61, 0x72, 0x39, 0x4B, 0x43, 0x2F, 0x65, 0x61, 0x6A, 0x38, 0x47, 0x73, 0x47, 0x73, 0x56, 0x6E, 0x0A, 0x38, 0x32, 0x38, 0x30, 0x30, 0x76, 0x70, 0x7A, 0x59, 0x34, 0x7A, 0x76, 0x46, 0x72, 0x43, + 0x6F, 0x70, 0x45, 0x59, 0x71, 0x2B, 0x4F, 0x73, 0x53, 0x37, 0x48, 0x4B, 0x30, 0x37, 0x2F, 0x67, 0x72, 0x66, 0x6F, 0x78, 0x53, 0x77, 0x49, 0x75, 0x45, 0x56, 0x50, 0x6B, 0x76, 0x50, 0x75, 0x4E, 0x56, 0x71, 0x4E, 0x78, 0x6D, 0x73, 0x64, 0x6E, + 0x68, 0x58, 0x39, 0x69, 0x7A, 0x6A, 0x46, 0x6B, 0x30, 0x57, 0x61, 0x53, 0x72, 0x54, 0x32, 0x79, 0x37, 0x48, 0x78, 0x6A, 0x62, 0x0A, 0x64, 0x61, 0x76, 0x59, 0x79, 0x35, 0x4C, 0x4E, 0x6C, 0x44, 0x68, 0x68, 0x44, 0x67, 0x63, 0x47, 0x48, 0x30, + 0x74, 0x47, 0x45, 0x50, 0x45, 0x56, 0x76, 0x6F, 0x32, 0x46, 0x58, 0x44, 0x74, 0x4B, 0x4B, 0x34, 0x46, 0x35, 0x44, 0x37, 0x52, 0x70, 0x6E, 0x30, 0x6C, 0x51, 0x6C, 0x30, 0x33, 0x33, 0x44, 0x6C, 0x5A, 0x64, 0x77, 0x4A, 0x56, 0x71, 0x77, 0x6A, + 0x62, 0x44, 0x47, 0x32, 0x6A, 0x4A, 0x39, 0x53, 0x72, 0x63, 0x52, 0x35, 0x71, 0x2B, 0x73, 0x73, 0x37, 0x46, 0x0A, 0x4A, 0x65, 0x6A, 0x36, 0x41, 0x37, 0x6E, 0x61, 0x2B, 0x52, 0x5A, 0x75, 0x6B, 0x59, 0x54, 0x31, 0x48, 0x43, 0x6A, 0x49, 0x2F, + 0x43, 0x62, 0x4D, 0x31, 0x78, 0x79, 0x51, 0x56, 0x71, 0x64, 0x66, 0x62, 0x7A, 0x6F, 0x45, 0x76, 0x4D, 0x31, 0x34, 0x69, 0x51, 0x75, 0x4F, 0x44, 0x79, 0x2B, 0x6A, 0x71, 0x6B, 0x2B, 0x69, 0x47, 0x78, 0x49, 0x39, 0x46, 0x67, 0x68, 0x41, 0x44, + 0x2F, 0x46, 0x47, 0x54, 0x4E, 0x65, 0x71, 0x65, 0x77, 0x6A, 0x42, 0x43, 0x76, 0x56, 0x74, 0x0A, 0x4A, 0x39, 0x34, 0x43, 0x6A, 0x38, 0x72, 0x44, 0x74, 0x53, 0x76, 0x4B, 0x36, 0x65, 0x76, 0x49, 0x49, 0x56, 0x4D, 0x34, 0x70, 0x63, 0x77, 0x37, + 0x32, 0x48, 0x63, 0x33, 0x4D, 0x4B, 0x4A, 0x50, 0x32, 0x57, 0x2F, 0x52, 0x38, 0x6B, 0x43, 0x74, 0x51, 0x58, 0x6F, 0x58, 0x78, 0x64, 0x5A, 0x4B, 0x4E, 0x59, 0x6D, 0x33, 0x51, 0x64, 0x56, 0x38, 0x68, 0x6E, 0x39, 0x56, 0x54, 0x59, 0x4E, 0x4B, + 0x70, 0x58, 0x4D, 0x67, 0x77, 0x44, 0x71, 0x76, 0x6B, 0x50, 0x47, 0x61, 0x0A, 0x4A, 0x49, 0x37, 0x5A, 0x6A, 0x6E, 0x48, 0x4B, 0x65, 0x37, 0x69, 0x47, 0x32, 0x72, 0x4B, 0x50, 0x6D, 0x54, 0x34, 0x64, 0x45, 0x77, 0x30, 0x53, 0x45, 0x65, 0x37, + 0x55, 0x71, 0x2F, 0x44, 0x70, 0x46, 0x58, 0x59, 0x43, 0x35, 0x4F, 0x44, 0x66, 0x71, 0x69, 0x41, 0x65, 0x57, 0x32, 0x47, 0x46, 0x5A, 0x45, 0x43, 0x70, 0x6B, 0x4A, 0x63, 0x4E, 0x72, 0x56, 0x50, 0x53, 0x57, 0x68, 0x32, 0x48, 0x61, 0x67, 0x43, + 0x58, 0x5A, 0x57, 0x4B, 0x30, 0x76, 0x6D, 0x39, 0x71, 0x0A, 0x70, 0x2F, 0x55, 0x73, 0x51, 0x75, 0x30, 0x79, 0x72, 0x62, 0x59, 0x68, 0x6E, 0x72, 0x36, 0x38, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x65, 0x6E, 0x69, 0x63, 0x20, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6D, 0x69, 0x63, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6E, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x77, 0x7A, 0x43, 0x43, 0x41, 0x6B, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x6A, + 0x43, 0x42, 0x71, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x31, 0x49, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, 0x6B, 0x46, 0x30, 0x0A, 0x61, + 0x47, 0x56, 0x75, 0x63, 0x7A, 0x46, 0x45, 0x4D, 0x45, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x37, 0x53, 0x47, 0x56, 0x73, 0x62, 0x47, 0x56, 0x75, 0x61, 0x57, 0x4D, 0x67, 0x51, 0x57, 0x4E, 0x68, 0x5A, 0x47, 0x56, 0x74, 0x61, + 0x57, 0x4D, 0x67, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, 0x45, 0x6C, 0x75, 0x63, 0x33, 0x52, 0x70, 0x64, 0x48, 0x56, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x63, 0x79, 0x42, 0x44, + 0x5A, 0x58, 0x4A, 0x30, 0x4C, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x52, 0x44, 0x42, 0x43, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4F, 0x30, 0x68, 0x6C, 0x62, 0x47, 0x78, 0x6C, + 0x62, 0x6D, 0x6C, 0x6A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x62, 0x57, 0x6C, 0x6A, 0x49, 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x0A, 0x61, 0x43, 0x42, 0x4A, 0x62, 0x6E, 0x4E, + 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x52, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x45, 0x31, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, + 0x31, 0x4D, 0x44, 0x63, 0x77, 0x4E, 0x7A, 0x45, 0x77, 0x4D, 0x7A, 0x63, 0x78, 0x4D, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x44, 0x59, 0x7A, 0x4D, 0x44, 0x45, 0x77, 0x0A, 0x4D, 0x7A, 0x63, 0x78, 0x4D, 0x6C, 0x6F, 0x77, 0x67, 0x61, + 0x6F, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x64, 0x53, 0x4D, 0x51, 0x38, 0x77, 0x44, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x45, 0x77, 0x5A, 0x42, 0x64, 0x47, 0x68, 0x6C, 0x62, 0x6E, + 0x4D, 0x78, 0x52, 0x44, 0x42, 0x43, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x4F, 0x30, 0x68, 0x6C, 0x62, 0x47, 0x78, 0x6C, 0x62, 0x6D, 0x6C, 0x6A, 0x0A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x62, 0x57, 0x6C, 0x6A, 0x49, + 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, 0x4A, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, + 0x43, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x4D, 0x55, 0x51, 0x77, 0x51, 0x67, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x44, 0x45, 0x7A, 0x74, 0x49, 0x5A, 0x57, 0x78, 0x73, 0x5A, 0x57, 0x35, 0x70, + 0x59, 0x79, 0x42, 0x42, 0x59, 0x32, 0x46, 0x6B, 0x5A, 0x57, 0x31, 0x70, 0x59, 0x79, 0x42, 0x68, 0x62, 0x6D, 0x51, 0x67, 0x55, 0x6D, 0x56, 0x7A, 0x5A, 0x57, 0x46, 0x79, 0x59, 0x32, 0x67, 0x67, 0x53, 0x57, 0x35, 0x7A, 0x64, 0x47, 0x6C, 0x30, + 0x64, 0x58, 0x52, 0x70, 0x62, 0x32, 0x35, 0x7A, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x0A, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x78, 0x4E, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, + 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4A, 0x4B, 0x67, 0x51, 0x65, 0x68, 0x4C, 0x67, 0x6F, 0x52, 0x63, 0x34, 0x76, 0x67, 0x78, 0x45, 0x5A, 0x6D, + 0x47, 0x5A, 0x45, 0x34, 0x4A, 0x4A, 0x53, 0x2B, 0x64, 0x51, 0x53, 0x38, 0x4B, 0x72, 0x6A, 0x56, 0x50, 0x0A, 0x64, 0x4A, 0x57, 0x79, 0x55, 0x57, 0x52, 0x72, 0x6A, 0x57, 0x76, 0x6D, 0x50, 0x33, 0x43, 0x56, 0x38, 0x41, 0x56, 0x45, 0x52, 0x36, + 0x5A, 0x79, 0x4F, 0x46, 0x42, 0x32, 0x6C, 0x51, 0x4A, 0x61, 0x6A, 0x71, 0x34, 0x6F, 0x6E, 0x76, 0x6B, 0x74, 0x54, 0x70, 0x6E, 0x76, 0x4C, 0x45, 0x68, 0x76, 0x54, 0x43, 0x55, 0x70, 0x36, 0x4E, 0x46, 0x78, 0x57, 0x39, 0x38, 0x64, 0x77, 0x58, + 0x55, 0x33, 0x74, 0x4E, 0x66, 0x36, 0x65, 0x33, 0x70, 0x43, 0x6E, 0x47, 0x6F, 0x4B, 0x0A, 0x56, 0x6C, 0x70, 0x38, 0x61, 0x51, 0x75, 0x71, 0x67, 0x41, 0x6B, 0x6B, 0x62, 0x48, 0x37, 0x42, 0x52, 0x71, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, + 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, + 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x0A, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4C, 0x51, 0x69, 0x43, 0x34, 0x4B, 0x5A, 0x4A, 0x41, 0x45, 0x4F, 0x6E, 0x4C, 0x76, 0x6B, 0x44, 0x76, 0x32, 0x2F, 0x2B, 0x35, 0x63, 0x67, + 0x6B, 0x35, 0x6B, 0x71, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x32, 0x63, 0x41, 0x4D, 0x47, 0x51, 0x43, 0x4D, 0x47, 0x66, 0x4F, 0x46, 0x6D, 0x49, 0x34, 0x6F, 0x71, 0x78, 0x69, + 0x52, 0x61, 0x65, 0x70, 0x6C, 0x53, 0x54, 0x41, 0x0A, 0x47, 0x69, 0x65, 0x63, 0x4D, 0x6A, 0x76, 0x41, 0x77, 0x4E, 0x57, 0x36, 0x71, 0x65, 0x66, 0x34, 0x42, 0x45, 0x4E, 0x54, 0x68, 0x65, 0x35, 0x53, 0x49, 0x64, 0x36, 0x64, 0x39, 0x53, 0x57, + 0x44, 0x50, 0x70, 0x35, 0x59, 0x53, 0x79, 0x2F, 0x58, 0x5A, 0x78, 0x4D, 0x4F, 0x49, 0x51, 0x49, 0x77, 0x42, 0x65, 0x46, 0x31, 0x41, 0x64, 0x35, 0x6F, 0x37, 0x53, 0x6F, 0x66, 0x54, 0x55, 0x77, 0x4A, 0x43, 0x41, 0x33, 0x73, 0x53, 0x36, 0x31, + 0x6B, 0x46, 0x79, 0x6A, 0x6E, 0x0A, 0x64, 0x63, 0x35, 0x46, 0x5A, 0x58, 0x49, 0x68, 0x46, 0x38, 0x73, 0x69, 0x51, 0x51, 0x36, 0x4D, 0x45, 0x35, 0x67, 0x34, 0x6D, 0x6C, 0x52, 0x74, 0x6D, 0x38, 0x72, 0x69, 0x66, 0x4F, 0x6F, 0x43, 0x57, 0x43, + 0x4B, 0x52, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, + 0x58, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x61, 0x7A, 0x43, 0x43, 0x41, 0x31, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, 0x41, 0x49, 0x49, 0x51, 0x7A, 0x37, 0x44, 0x53, 0x51, 0x4F, 0x4E, 0x5A, 0x52, 0x47, 0x50, 0x67, + 0x75, 0x32, 0x4F, 0x43, 0x69, 0x77, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x54, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x4B, 0x54, 0x41, 0x6E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x49, 0x45, 0x6C, 0x75, 0x64, 0x47, 0x56, 0x79, 0x62, 0x6D, 0x56, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, + 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, 0x45, 0x64, 0x79, 0x62, 0x33, 0x56, 0x77, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x45, 0x77, + 0x78, 0x4A, 0x55, 0x31, 0x4A, 0x48, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x57, 0x44, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x55, 0x77, 0x4E, 0x6A, 0x41, 0x30, 0x4D, 0x54, 0x45, 0x77, 0x4E, 0x44, 0x4D, 0x34, 0x57, 0x68, + 0x63, 0x4E, 0x4D, 0x7A, 0x55, 0x77, 0x4E, 0x6A, 0x41, 0x30, 0x4D, 0x54, 0x45, 0x77, 0x4E, 0x44, 0x4D, 0x34, 0x57, 0x6A, 0x42, 0x50, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, + 0x7A, 0x45, 0x70, 0x4D, 0x43, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x67, 0x53, 0x57, 0x35, 0x30, 0x5A, 0x58, 0x4A, 0x75, 0x5A, 0x58, 0x51, 0x67, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x55, + 0x6D, 0x56, 0x7A, 0x5A, 0x57, 0x46, 0x79, 0x59, 0x32, 0x67, 0x67, 0x52, 0x33, 0x4A, 0x76, 0x64, 0x58, 0x41, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x0A, 0x44, 0x45, 0x6C, 0x54, 0x55, 0x6B, 0x63, 0x67, + 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x59, 0x4D, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, + 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x33, 0x6F, 0x4A, 0x48, 0x50, 0x30, 0x46, 0x44, 0x66, 0x7A, 0x6D, 0x35, 0x34, 0x72, 0x0A, 0x56, 0x79, 0x67, 0x63, 0x68, 0x37, 0x37, 0x63, 0x74, 0x39, 0x38, + 0x34, 0x6B, 0x49, 0x78, 0x75, 0x50, 0x4F, 0x5A, 0x58, 0x6F, 0x48, 0x6A, 0x33, 0x64, 0x63, 0x4B, 0x69, 0x2F, 0x76, 0x56, 0x71, 0x62, 0x76, 0x59, 0x41, 0x54, 0x79, 0x6A, 0x62, 0x33, 0x6D, 0x69, 0x47, 0x62, 0x45, 0x53, 0x54, 0x74, 0x72, 0x46, + 0x6A, 0x2F, 0x52, 0x51, 0x53, 0x61, 0x37, 0x38, 0x66, 0x30, 0x75, 0x6F, 0x78, 0x6D, 0x79, 0x46, 0x2B, 0x30, 0x54, 0x4D, 0x38, 0x75, 0x6B, 0x6A, 0x31, 0x0A, 0x33, 0x58, 0x6E, 0x66, 0x73, 0x37, 0x6A, 0x2F, 0x45, 0x76, 0x45, 0x68, 0x6D, 0x6B, + 0x76, 0x42, 0x69, 0x6F, 0x5A, 0x78, 0x61, 0x55, 0x70, 0x6D, 0x5A, 0x6D, 0x79, 0x50, 0x66, 0x6A, 0x78, 0x77, 0x76, 0x36, 0x30, 0x70, 0x49, 0x67, 0x62, 0x7A, 0x35, 0x4D, 0x44, 0x6D, 0x67, 0x4B, 0x37, 0x69, 0x53, 0x34, 0x2B, 0x33, 0x6D, 0x58, + 0x36, 0x55, 0x41, 0x35, 0x2F, 0x54, 0x52, 0x35, 0x64, 0x38, 0x6D, 0x55, 0x67, 0x6A, 0x55, 0x2B, 0x67, 0x34, 0x72, 0x6B, 0x38, 0x4B, 0x0A, 0x62, 0x34, 0x4D, 0x75, 0x30, 0x55, 0x6C, 0x58, 0x6A, 0x49, 0x42, 0x30, 0x74, 0x74, 0x6F, 0x76, 0x30, + 0x44, 0x69, 0x4E, 0x65, 0x77, 0x4E, 0x77, 0x49, 0x52, 0x74, 0x31, 0x38, 0x6A, 0x41, 0x38, 0x2B, 0x6F, 0x2B, 0x75, 0x33, 0x64, 0x70, 0x6A, 0x71, 0x2B, 0x73, 0x57, 0x54, 0x38, 0x4B, 0x4F, 0x45, 0x55, 0x74, 0x2B, 0x7A, 0x77, 0x76, 0x6F, 0x2F, + 0x37, 0x56, 0x33, 0x4C, 0x76, 0x53, 0x79, 0x65, 0x30, 0x72, 0x67, 0x54, 0x42, 0x49, 0x6C, 0x44, 0x48, 0x43, 0x4E, 0x0A, 0x41, 0x79, 0x6D, 0x67, 0x34, 0x56, 0x4D, 0x6B, 0x37, 0x42, 0x50, 0x5A, 0x37, 0x68, 0x6D, 0x2F, 0x45, 0x4C, 0x4E, 0x4B, + 0x6A, 0x44, 0x2B, 0x4A, 0x6F, 0x32, 0x46, 0x52, 0x33, 0x71, 0x79, 0x48, 0x42, 0x35, 0x54, 0x30, 0x59, 0x33, 0x48, 0x73, 0x4C, 0x75, 0x4A, 0x76, 0x57, 0x35, 0x69, 0x42, 0x34, 0x59, 0x6C, 0x63, 0x4E, 0x48, 0x6C, 0x73, 0x64, 0x75, 0x38, 0x37, + 0x6B, 0x47, 0x4A, 0x35, 0x35, 0x74, 0x75, 0x6B, 0x6D, 0x69, 0x38, 0x6D, 0x78, 0x64, 0x41, 0x51, 0x0A, 0x34, 0x51, 0x37, 0x65, 0x32, 0x52, 0x43, 0x4F, 0x46, 0x76, 0x75, 0x33, 0x39, 0x36, 0x6A, 0x33, 0x78, 0x2B, 0x55, 0x43, 0x42, 0x35, 0x69, + 0x50, 0x4E, 0x67, 0x69, 0x56, 0x35, 0x2B, 0x49, 0x33, 0x6C, 0x67, 0x30, 0x32, 0x64, 0x5A, 0x37, 0x37, 0x44, 0x6E, 0x4B, 0x78, 0x48, 0x5A, 0x75, 0x38, 0x41, 0x2F, 0x6C, 0x4A, 0x42, 0x64, 0x69, 0x42, 0x33, 0x51, 0x57, 0x30, 0x4B, 0x74, 0x5A, + 0x42, 0x36, 0x61, 0x77, 0x42, 0x64, 0x70, 0x55, 0x4B, 0x44, 0x39, 0x6A, 0x66, 0x0A, 0x31, 0x62, 0x30, 0x53, 0x48, 0x7A, 0x55, 0x76, 0x4B, 0x42, 0x64, 0x73, 0x30, 0x70, 0x6A, 0x42, 0x71, 0x41, 0x6C, 0x6B, 0x64, 0x32, 0x35, 0x48, 0x4E, 0x37, + 0x72, 0x4F, 0x72, 0x46, 0x6C, 0x65, 0x61, 0x4A, 0x31, 0x2F, 0x63, 0x74, 0x61, 0x4A, 0x78, 0x51, 0x5A, 0x42, 0x4B, 0x54, 0x35, 0x5A, 0x50, 0x74, 0x30, 0x6D, 0x39, 0x53, 0x54, 0x4A, 0x45, 0x61, 0x64, 0x61, 0x6F, 0x30, 0x78, 0x41, 0x48, 0x30, + 0x61, 0x68, 0x6D, 0x62, 0x57, 0x6E, 0x4F, 0x6C, 0x46, 0x75, 0x0A, 0x68, 0x6A, 0x75, 0x65, 0x66, 0x58, 0x4B, 0x6E, 0x45, 0x67, 0x56, 0x34, 0x57, 0x65, 0x30, 0x2B, 0x55, 0x58, 0x67, 0x56, 0x43, 0x77, 0x4F, 0x50, 0x6A, 0x64, 0x41, 0x76, 0x42, + 0x62, 0x49, 0x2B, 0x65, 0x30, 0x6F, 0x63, 0x53, 0x33, 0x4D, 0x46, 0x45, 0x76, 0x7A, 0x47, 0x36, 0x75, 0x42, 0x51, 0x45, 0x33, 0x78, 0x44, 0x6B, 0x33, 0x53, 0x7A, 0x79, 0x6E, 0x54, 0x6E, 0x6A, 0x68, 0x38, 0x42, 0x43, 0x4E, 0x41, 0x77, 0x31, + 0x46, 0x74, 0x78, 0x4E, 0x72, 0x51, 0x48, 0x0A, 0x75, 0x73, 0x45, 0x77, 0x4D, 0x46, 0x78, 0x49, 0x74, 0x34, 0x49, 0x37, 0x6D, 0x4B, 0x5A, 0x39, 0x59, 0x49, 0x71, 0x69, 0x6F, 0x79, 0x6D, 0x43, 0x7A, 0x4C, 0x71, 0x39, 0x67, 0x77, 0x51, 0x62, + 0x6F, 0x6F, 0x4D, 0x44, 0x51, 0x61, 0x48, 0x57, 0x42, 0x66, 0x45, 0x62, 0x77, 0x72, 0x62, 0x77, 0x71, 0x48, 0x79, 0x47, 0x4F, 0x30, 0x61, 0x6F, 0x53, 0x43, 0x71, 0x49, 0x33, 0x48, 0x61, 0x61, 0x64, 0x72, 0x38, 0x66, 0x61, 0x71, 0x55, 0x39, + 0x47, 0x59, 0x2F, 0x72, 0x0A, 0x4F, 0x50, 0x4E, 0x6B, 0x33, 0x73, 0x67, 0x72, 0x44, 0x51, 0x6F, 0x6F, 0x2F, 0x2F, 0x66, 0x62, 0x34, 0x68, 0x56, 0x43, 0x31, 0x43, 0x4C, 0x51, 0x4A, 0x31, 0x33, 0x68, 0x65, 0x66, 0x34, 0x59, 0x35, 0x33, 0x43, + 0x49, 0x72, 0x55, 0x37, 0x6D, 0x32, 0x59, 0x73, 0x36, 0x78, 0x74, 0x30, 0x6E, 0x55, 0x57, 0x37, 0x2F, 0x76, 0x47, 0x54, 0x31, 0x4D, 0x30, 0x4E, 0x50, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x34, + 0x47, 0x0A, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, + 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x35, 0x74, 0x46, 0x6E, 0x6D, 0x65, 0x37, 0x62, 0x6C, 0x35, 0x41, 0x46, 0x7A, 0x67, 0x41, 0x69, 0x49, 0x79, 0x42, 0x70, 0x59, 0x0A, 0x39, + 0x75, 0x6D, 0x62, 0x62, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x56, 0x52, 0x39, 0x59, 0x71, 0x62, 0x79, 0x79, 0x71, + 0x46, 0x44, 0x51, 0x44, 0x4C, 0x48, 0x59, 0x47, 0x6D, 0x6B, 0x67, 0x4A, 0x79, 0x6B, 0x49, 0x72, 0x47, 0x46, 0x31, 0x58, 0x49, 0x70, 0x75, 0x2B, 0x49, 0x4C, 0x6C, 0x61, 0x53, 0x2F, 0x56, 0x39, 0x6C, 0x5A, 0x4C, 0x0A, 0x75, 0x62, 0x68, 0x7A, + 0x45, 0x46, 0x6E, 0x54, 0x49, 0x5A, 0x64, 0x2B, 0x35, 0x30, 0x78, 0x78, 0x2B, 0x37, 0x4C, 0x53, 0x59, 0x4B, 0x30, 0x35, 0x71, 0x41, 0x76, 0x71, 0x46, 0x79, 0x46, 0x57, 0x68, 0x66, 0x46, 0x51, 0x44, 0x6C, 0x6E, 0x72, 0x7A, 0x75, 0x42, 0x5A, + 0x36, 0x62, 0x72, 0x4A, 0x46, 0x65, 0x2B, 0x47, 0x6E, 0x59, 0x2B, 0x45, 0x67, 0x50, 0x62, 0x6B, 0x36, 0x5A, 0x47, 0x51, 0x33, 0x42, 0x65, 0x62, 0x59, 0x68, 0x74, 0x46, 0x38, 0x47, 0x61, 0x56, 0x0A, 0x30, 0x6E, 0x78, 0x76, 0x77, 0x75, 0x6F, + 0x37, 0x37, 0x78, 0x2F, 0x50, 0x79, 0x39, 0x61, 0x75, 0x4A, 0x2F, 0x47, 0x70, 0x73, 0x4D, 0x69, 0x75, 0x2F, 0x58, 0x31, 0x2B, 0x6D, 0x76, 0x6F, 0x69, 0x42, 0x4F, 0x76, 0x2F, 0x32, 0x58, 0x2F, 0x71, 0x6B, 0x53, 0x73, 0x69, 0x73, 0x52, 0x63, + 0x4F, 0x6A, 0x2F, 0x4B, 0x4B, 0x4E, 0x46, 0x74, 0x59, 0x32, 0x50, 0x77, 0x42, 0x79, 0x56, 0x53, 0x35, 0x75, 0x43, 0x62, 0x4D, 0x69, 0x6F, 0x67, 0x7A, 0x69, 0x55, 0x77, 0x74, 0x0A, 0x68, 0x44, 0x79, 0x43, 0x33, 0x2B, 0x36, 0x57, 0x56, 0x77, + 0x57, 0x36, 0x4C, 0x4C, 0x76, 0x33, 0x78, 0x4C, 0x66, 0x48, 0x54, 0x6A, 0x75, 0x43, 0x76, 0x6A, 0x48, 0x49, 0x49, 0x6E, 0x4E, 0x7A, 0x6B, 0x74, 0x48, 0x43, 0x67, 0x4B, 0x51, 0x35, 0x4F, 0x52, 0x41, 0x7A, 0x49, 0x34, 0x4A, 0x4D, 0x50, 0x4A, + 0x2B, 0x47, 0x73, 0x6C, 0x57, 0x59, 0x48, 0x62, 0x34, 0x70, 0x68, 0x6F, 0x77, 0x69, 0x6D, 0x35, 0x37, 0x69, 0x61, 0x7A, 0x74, 0x58, 0x4F, 0x6F, 0x4A, 0x77, 0x0A, 0x54, 0x64, 0x77, 0x4A, 0x78, 0x34, 0x6E, 0x4C, 0x43, 0x67, 0x64, 0x4E, 0x62, + 0x4F, 0x68, 0x64, 0x6A, 0x73, 0x6E, 0x76, 0x7A, 0x71, 0x76, 0x48, 0x75, 0x37, 0x55, 0x72, 0x54, 0x6B, 0x58, 0x57, 0x53, 0x74, 0x41, 0x6D, 0x7A, 0x4F, 0x56, 0x79, 0x79, 0x67, 0x68, 0x71, 0x70, 0x5A, 0x58, 0x6A, 0x46, 0x61, 0x48, 0x33, 0x70, + 0x4F, 0x33, 0x4A, 0x4C, 0x46, 0x2B, 0x6C, 0x2B, 0x2F, 0x2B, 0x73, 0x4B, 0x41, 0x49, 0x75, 0x76, 0x74, 0x64, 0x37, 0x75, 0x2B, 0x4E, 0x78, 0x0A, 0x65, 0x35, 0x41, 0x57, 0x30, 0x77, 0x64, 0x65, 0x52, 0x6C, 0x4E, 0x38, 0x4E, 0x77, 0x64, 0x43, + 0x6A, 0x4E, 0x50, 0x45, 0x6C, 0x70, 0x7A, 0x56, 0x6D, 0x62, 0x55, 0x71, 0x34, 0x4A, 0x55, 0x61, 0x67, 0x45, 0x69, 0x75, 0x54, 0x44, 0x6B, 0x48, 0x7A, 0x73, 0x78, 0x48, 0x70, 0x46, 0x4B, 0x56, 0x4B, 0x37, 0x71, 0x34, 0x2B, 0x36, 0x33, 0x53, + 0x4D, 0x31, 0x4E, 0x39, 0x35, 0x52, 0x31, 0x4E, 0x62, 0x64, 0x57, 0x68, 0x73, 0x63, 0x64, 0x43, 0x62, 0x2B, 0x5A, 0x41, 0x0A, 0x4A, 0x7A, 0x56, 0x63, 0x6F, 0x79, 0x69, 0x33, 0x42, 0x34, 0x33, 0x6E, 0x6A, 0x54, 0x4F, 0x51, 0x35, 0x79, 0x4F, + 0x66, 0x2B, 0x31, 0x43, 0x63, 0x65, 0x57, 0x78, 0x47, 0x31, 0x62, 0x51, 0x56, 0x73, 0x35, 0x5A, 0x75, 0x66, 0x70, 0x73, 0x4D, 0x6C, 0x6A, 0x71, 0x34, 0x55, 0x69, 0x30, 0x2F, 0x31, 0x6C, 0x76, 0x68, 0x2B, 0x77, 0x6A, 0x43, 0x68, 0x50, 0x34, + 0x6B, 0x71, 0x4B, 0x4F, 0x4A, 0x32, 0x71, 0x78, 0x71, 0x34, 0x52, 0x67, 0x71, 0x73, 0x61, 0x68, 0x44, 0x0A, 0x59, 0x56, 0x76, 0x54, 0x48, 0x39, 0x77, 0x37, 0x6A, 0x58, 0x62, 0x79, 0x4C, 0x65, 0x69, 0x4E, 0x64, 0x64, 0x38, 0x58, 0x4D, 0x32, + 0x77, 0x39, 0x55, 0x2F, 0x74, 0x37, 0x79, 0x30, 0x46, 0x66, 0x2F, 0x39, 0x79, 0x69, 0x30, 0x47, 0x45, 0x34, 0x34, 0x5A, 0x61, 0x34, 0x72, 0x46, 0x32, 0x4C, 0x4E, 0x39, 0x64, 0x31, 0x31, 0x54, 0x50, 0x41, 0x6D, 0x52, 0x47, 0x75, 0x6E, 0x55, + 0x48, 0x42, 0x63, 0x6E, 0x57, 0x45, 0x76, 0x67, 0x4A, 0x42, 0x51, 0x6C, 0x39, 0x6E, 0x0A, 0x4A, 0x45, 0x69, 0x55, 0x30, 0x5A, 0x73, 0x6E, 0x76, 0x67, 0x63, 0x2F, 0x75, 0x62, 0x68, 0x50, 0x67, 0x58, 0x52, 0x52, 0x34, 0x58, 0x71, 0x33, 0x37, + 0x5A, 0x30, 0x6A, 0x34, 0x72, 0x37, 0x67, 0x31, 0x53, 0x67, 0x45, 0x45, 0x7A, 0x77, 0x78, 0x41, 0x35, 0x37, 0x64, 0x65, 0x6D, 0x79, 0x50, 0x78, 0x67, 0x63, 0x59, 0x78, 0x6E, 0x2F, 0x65, 0x52, 0x34, 0x34, 0x2F, 0x4B, 0x4A, 0x34, 0x45, 0x42, + 0x73, 0x2B, 0x6C, 0x56, 0x44, 0x52, 0x33, 0x76, 0x65, 0x79, 0x4A, 0x0A, 0x6D, 0x2B, 0x6B, 0x58, 0x51, 0x39, 0x39, 0x62, 0x32, 0x31, 0x2F, 0x2B, 0x6A, 0x68, 0x35, 0x58, 0x6F, 0x73, 0x31, 0x41, 0x6E, 0x58, 0x35, 0x69, 0x49, 0x74, 0x72, 0x65, + 0x47, 0x43, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5A, 0x20, + 0x46, 0x4E, 0x4D, 0x54, 0x2D, 0x52, 0x43, 0x4D, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x67, 0x7A, 0x43, 0x43, 0x41, 0x32, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x50, 0x58, 0x5A, 0x4F, 0x4E, 0x4D, 0x47, + 0x63, 0x32, 0x79, 0x41, 0x59, 0x64, 0x47, 0x73, 0x64, 0x55, 0x68, 0x47, 0x6B, 0x48, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x44, 0x73, 0x78, 0x43, 0x7A, + 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x0A, 0x41, 0x6B, 0x56, 0x54, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x68, 0x47, 0x54, 0x6B, 0x31, 0x55, 0x4C, 0x56, 0x4A, 0x44, 0x54, + 0x54, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x51, 0x51, 0x55, 0x4D, 0x67, 0x55, 0x6B, 0x46, 0x4A, 0x57, 0x69, 0x42, 0x47, 0x54, 0x6B, 0x31, 0x55, 0x4C, 0x56, 0x4A, 0x44, 0x54, 0x54, 0x41, 0x65, 0x46, + 0x77, 0x30, 0x77, 0x4F, 0x44, 0x45, 0x77, 0x0A, 0x4D, 0x6A, 0x6B, 0x78, 0x4E, 0x54, 0x55, 0x35, 0x4E, 0x54, 0x5A, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x44, 0x41, 0x78, 0x4D, 0x44, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, + 0x4D, 0x44, 0x73, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x56, 0x54, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x68, 0x47, 0x54, 0x6B, 0x31, 0x55, + 0x4C, 0x56, 0x4A, 0x44, 0x0A, 0x54, 0x54, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x51, 0x51, 0x55, 0x4D, 0x67, 0x55, 0x6B, 0x46, 0x4A, 0x57, 0x69, 0x42, 0x47, 0x54, 0x6B, 0x31, 0x55, 0x4C, 0x56, 0x4A, + 0x44, 0x54, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, + 0x43, 0x0A, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4C, 0x70, 0x78, 0x67, 0x48, 0x70, 0x4D, 0x68, 0x6D, 0x35, 0x2F, 0x79, 0x42, 0x4E, 0x74, 0x77, 0x4D, 0x5A, 0x39, 0x48, 0x41, 0x43, 0x58, 0x6A, 0x79, 0x77, 0x4D, 0x49, 0x37, 0x73, 0x51, 0x6D, 0x6B, + 0x43, 0x70, 0x47, 0x72, 0x65, 0x48, 0x69, 0x50, 0x69, 0x62, 0x56, 0x6D, 0x72, 0x37, 0x35, 0x6E, 0x75, 0x4F, 0x69, 0x35, 0x4B, 0x4F, 0x70, 0x79, 0x56, 0x64, 0x57, 0x52, 0x48, 0x62, 0x4E, 0x69, 0x36, 0x33, 0x55, 0x52, 0x63, 0x66, 0x0A, 0x71, + 0x51, 0x67, 0x66, 0x42, 0x42, 0x63, 0x6B, 0x57, 0x4B, 0x6F, 0x33, 0x53, 0x68, 0x6A, 0x66, 0x35, 0x54, 0x6E, 0x55, 0x56, 0x2F, 0x33, 0x58, 0x77, 0x53, 0x79, 0x52, 0x41, 0x5A, 0x48, 0x69, 0x49, 0x74, 0x51, 0x44, 0x77, 0x46, 0x6A, 0x38, 0x64, + 0x30, 0x66, 0x73, 0x6A, 0x7A, 0x35, 0x30, 0x51, 0x37, 0x71, 0x73, 0x4E, 0x49, 0x31, 0x4E, 0x4F, 0x48, 0x5A, 0x6E, 0x6A, 0x72, 0x44, 0x49, 0x62, 0x7A, 0x41, 0x7A, 0x57, 0x48, 0x46, 0x63, 0x74, 0x50, 0x56, 0x72, 0x0A, 0x62, 0x74, 0x51, 0x42, + 0x55, 0x4C, 0x67, 0x54, 0x66, 0x6D, 0x78, 0x4B, 0x6F, 0x30, 0x6E, 0x52, 0x49, 0x42, 0x6E, 0x75, 0x76, 0x4D, 0x41, 0x70, 0x47, 0x47, 0x57, 0x6E, 0x33, 0x76, 0x37, 0x76, 0x33, 0x51, 0x71, 0x51, 0x49, 0x65, 0x63, 0x61, 0x5A, 0x35, 0x4A, 0x43, + 0x45, 0x4A, 0x68, 0x66, 0x54, 0x7A, 0x43, 0x38, 0x50, 0x68, 0x78, 0x46, 0x74, 0x42, 0x44, 0x58, 0x61, 0x45, 0x41, 0x55, 0x77, 0x45, 0x44, 0x36, 0x35, 0x33, 0x63, 0x58, 0x65, 0x75, 0x59, 0x4C, 0x0A, 0x6A, 0x32, 0x56, 0x62, 0x50, 0x4E, 0x6D, + 0x61, 0x55, 0x74, 0x75, 0x31, 0x76, 0x5A, 0x35, 0x47, 0x7A, 0x7A, 0x33, 0x72, 0x6B, 0x51, 0x55, 0x43, 0x77, 0x4A, 0x61, 0x79, 0x64, 0x6B, 0x78, 0x4E, 0x45, 0x4A, 0x59, 0x37, 0x6B, 0x76, 0x71, 0x63, 0x66, 0x77, 0x2B, 0x5A, 0x33, 0x37, 0x34, + 0x6A, 0x4E, 0x55, 0x55, 0x65, 0x41, 0x6C, 0x7A, 0x2B, 0x74, 0x61, 0x69, 0x62, 0x6D, 0x53, 0x58, 0x61, 0x58, 0x76, 0x4D, 0x69, 0x77, 0x7A, 0x6E, 0x31, 0x35, 0x43, 0x6F, 0x75, 0x0A, 0x30, 0x38, 0x59, 0x66, 0x78, 0x47, 0x79, 0x71, 0x78, 0x52, + 0x78, 0x71, 0x41, 0x51, 0x56, 0x4B, 0x4C, 0x39, 0x4C, 0x46, 0x77, 0x61, 0x67, 0x30, 0x4A, 0x6C, 0x31, 0x6D, 0x70, 0x64, 0x49, 0x43, 0x49, 0x66, 0x6B, 0x59, 0x74, 0x77, 0x62, 0x31, 0x54, 0x70, 0x6C, 0x76, 0x71, 0x4B, 0x74, 0x4D, 0x55, 0x65, + 0x6A, 0x50, 0x55, 0x42, 0x6A, 0x46, 0x64, 0x38, 0x67, 0x35, 0x43, 0x53, 0x78, 0x4A, 0x6B, 0x6A, 0x4B, 0x5A, 0x71, 0x4C, 0x73, 0x58, 0x46, 0x33, 0x6D, 0x77, 0x0A, 0x57, 0x73, 0x58, 0x6D, 0x6F, 0x38, 0x52, 0x5A, 0x5A, 0x55, 0x63, 0x31, 0x67, + 0x31, 0x36, 0x70, 0x36, 0x44, 0x55, 0x4C, 0x6D, 0x62, 0x76, 0x6B, 0x7A, 0x53, 0x44, 0x47, 0x6D, 0x30, 0x6F, 0x47, 0x4F, 0x62, 0x56, 0x6F, 0x2F, 0x43, 0x4B, 0x36, 0x37, 0x6C, 0x57, 0x4D, 0x4B, 0x30, 0x37, 0x71, 0x38, 0x37, 0x48, 0x6A, 0x2F, + 0x4C, 0x61, 0x5A, 0x6D, 0x74, 0x56, 0x43, 0x2B, 0x6E, 0x46, 0x4E, 0x43, 0x4D, 0x2B, 0x48, 0x48, 0x6D, 0x70, 0x78, 0x66, 0x66, 0x6E, 0x54, 0x0A, 0x74, 0x4F, 0x6D, 0x6C, 0x63, 0x59, 0x46, 0x37, 0x77, 0x6B, 0x35, 0x48, 0x6C, 0x71, 0x58, 0x32, + 0x64, 0x6F, 0x57, 0x6A, 0x4B, 0x49, 0x2F, 0x70, 0x67, 0x47, 0x36, 0x42, 0x55, 0x36, 0x56, 0x74, 0x58, 0x37, 0x68, 0x49, 0x2B, 0x63, 0x4C, 0x35, 0x4E, 0x71, 0x59, 0x75, 0x53, 0x66, 0x2B, 0x34, 0x6C, 0x73, 0x4B, 0x4D, 0x42, 0x37, 0x4F, 0x62, + 0x69, 0x46, 0x6A, 0x38, 0x36, 0x78, 0x73, 0x63, 0x33, 0x69, 0x31, 0x77, 0x34, 0x70, 0x65, 0x53, 0x4D, 0x4B, 0x47, 0x4A, 0x0A, 0x34, 0x37, 0x78, 0x56, 0x71, 0x43, 0x66, 0x57, 0x53, 0x2B, 0x32, 0x51, 0x72, 0x59, 0x76, 0x36, 0x59, 0x79, 0x56, + 0x5A, 0x4C, 0x61, 0x67, 0x31, 0x33, 0x63, 0x71, 0x58, 0x4D, 0x37, 0x7A, 0x6C, 0x7A, 0x63, 0x65, 0x64, 0x30, 0x65, 0x7A, 0x76, 0x58, 0x67, 0x35, 0x4B, 0x6B, 0x41, 0x59, 0x6D, 0x59, 0x36, 0x32, 0x35, 0x32, 0x54, 0x55, 0x74, 0x42, 0x37, 0x70, + 0x32, 0x5A, 0x53, 0x79, 0x73, 0x56, 0x34, 0x39, 0x39, 0x39, 0x41, 0x65, 0x55, 0x31, 0x34, 0x45, 0x43, 0x0A, 0x6C, 0x6C, 0x32, 0x6A, 0x42, 0x30, 0x6E, 0x56, 0x65, 0x74, 0x42, 0x58, 0x2B, 0x52, 0x76, 0x6E, 0x55, 0x30, 0x5A, 0x31, 0x71, 0x72, + 0x42, 0x35, 0x51, 0x73, 0x74, 0x6F, 0x63, 0x51, 0x6A, 0x70, 0x59, 0x4C, 0x30, 0x35, 0x61, 0x63, 0x37, 0x30, 0x72, 0x38, 0x4E, 0x57, 0x51, 0x4D, 0x65, 0x74, 0x55, 0x71, 0x49, 0x4A, 0x35, 0x47, 0x2B, 0x47, 0x52, 0x34, 0x6F, 0x66, 0x36, 0x79, + 0x67, 0x6E, 0x58, 0x59, 0x4D, 0x67, 0x72, 0x77, 0x54, 0x4A, 0x62, 0x46, 0x61, 0x61, 0x0A, 0x69, 0x30, 0x62, 0x31, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x67, 0x59, 0x4D, 0x77, 0x67, 0x59, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, + 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x48, + 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x0A, 0x46, 0x50, 0x64, 0x39, 0x78, 0x66, 0x33, 0x45, 0x36, 0x4A, 0x6F, 0x62, 0x64, 0x32, 0x53, 0x6E, 0x39, 0x52, 0x32, 0x67, 0x7A, 0x4C, 0x2B, 0x48, 0x59, 0x4A, 0x70, 0x74, + 0x4D, 0x44, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x41, 0x51, 0x33, 0x4D, 0x44, 0x55, 0x77, 0x4D, 0x77, 0x59, 0x45, 0x56, 0x52, 0x30, 0x67, 0x41, 0x44, 0x41, 0x72, 0x4D, 0x43, 0x6B, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, + 0x42, 0x77, 0x49, 0x42, 0x46, 0x68, 0x31, 0x6F, 0x0A, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4C, 0x6D, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x75, 0x5A, 0x6D, 0x35, 0x74, 0x64, 0x43, 0x35, 0x6C, 0x63, 0x79, 0x39, + 0x6B, 0x63, 0x47, 0x4E, 0x7A, 0x4C, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x42, 0x35, 0x42, 0x4B, 0x33, 0x2F, 0x4D, + 0x6A, 0x54, 0x76, 0x44, 0x44, 0x0A, 0x6E, 0x46, 0x46, 0x6C, 0x6D, 0x35, 0x77, 0x69, 0x6F, 0x6F, 0x6F, 0x4D, 0x68, 0x66, 0x4E, 0x7A, 0x4B, 0x57, 0x74, 0x4E, 0x2F, 0x67, 0x48, 0x69, 0x71, 0x51, 0x78, 0x6A, 0x41, 0x62, 0x38, 0x45, 0x5A, 0x36, + 0x57, 0x64, 0x6D, 0x46, 0x2F, 0x39, 0x41, 0x52, 0x50, 0x36, 0x37, 0x4A, 0x70, 0x69, 0x36, 0x59, 0x62, 0x2B, 0x74, 0x6D, 0x4C, 0x53, 0x62, 0x6B, 0x79, 0x55, 0x2B, 0x38, 0x42, 0x31, 0x52, 0x58, 0x78, 0x6C, 0x44, 0x50, 0x69, 0x79, 0x4E, 0x38, + 0x2B, 0x73, 0x0A, 0x44, 0x38, 0x2B, 0x4E, 0x62, 0x2F, 0x6B, 0x5A, 0x39, 0x34, 0x2F, 0x73, 0x48, 0x76, 0x4A, 0x77, 0x6E, 0x76, 0x44, 0x4B, 0x75, 0x4F, 0x2B, 0x33, 0x2F, 0x33, 0x59, 0x33, 0x64, 0x6C, 0x76, 0x32, 0x62, 0x6F, 0x6A, 0x7A, 0x72, + 0x32, 0x49, 0x79, 0x49, 0x70, 0x4D, 0x4E, 0x4F, 0x6D, 0x71, 0x4F, 0x46, 0x47, 0x59, 0x4D, 0x4C, 0x56, 0x4E, 0x30, 0x56, 0x32, 0x55, 0x65, 0x31, 0x62, 0x4C, 0x64, 0x49, 0x34, 0x45, 0x37, 0x70, 0x57, 0x59, 0x6A, 0x4A, 0x32, 0x63, 0x4A, 0x0A, + 0x6A, 0x2B, 0x46, 0x33, 0x71, 0x6B, 0x50, 0x4E, 0x5A, 0x56, 0x45, 0x49, 0x37, 0x56, 0x46, 0x59, 0x2F, 0x75, 0x59, 0x35, 0x2B, 0x63, 0x74, 0x48, 0x68, 0x4B, 0x51, 0x56, 0x38, 0x58, 0x61, 0x37, 0x70, 0x4F, 0x36, 0x6B, 0x4F, 0x38, 0x52, 0x66, + 0x37, 0x37, 0x49, 0x7A, 0x6C, 0x68, 0x45, 0x59, 0x74, 0x38, 0x6C, 0x6C, 0x76, 0x68, 0x6A, 0x68, 0x6F, 0x36, 0x54, 0x63, 0x2B, 0x68, 0x6A, 0x35, 0x30, 0x37, 0x77, 0x54, 0x6D, 0x7A, 0x6C, 0x36, 0x4E, 0x4C, 0x72, 0x54, 0x0A, 0x51, 0x66, 0x76, + 0x36, 0x4D, 0x6F, 0x6F, 0x71, 0x74, 0x79, 0x75, 0x47, 0x43, 0x32, 0x6D, 0x44, 0x4F, 0x4C, 0x37, 0x4E, 0x69, 0x69, 0x34, 0x4C, 0x63, 0x4B, 0x32, 0x4E, 0x4A, 0x70, 0x4C, 0x75, 0x48, 0x76, 0x55, 0x42, 0x4B, 0x77, 0x72, 0x5A, 0x31, 0x70, 0x65, + 0x62, 0x62, 0x75, 0x43, 0x6F, 0x47, 0x52, 0x77, 0x36, 0x49, 0x59, 0x73, 0x4D, 0x48, 0x6B, 0x43, 0x74, 0x41, 0x2B, 0x66, 0x64, 0x5A, 0x6E, 0x37, 0x31, 0x75, 0x53, 0x41, 0x4E, 0x41, 0x2B, 0x69, 0x57, 0x0A, 0x2B, 0x59, 0x4A, 0x46, 0x31, 0x44, + 0x6E, 0x67, 0x6F, 0x41, 0x42, 0x64, 0x31, 0x35, 0x6A, 0x6D, 0x66, 0x5A, 0x35, 0x6E, 0x63, 0x38, 0x4F, 0x61, 0x4B, 0x76, 0x65, 0x72, 0x69, 0x36, 0x45, 0x36, 0x46, 0x4F, 0x38, 0x30, 0x76, 0x46, 0x49, 0x4F, 0x69, 0x5A, 0x69, 0x61, 0x42, 0x45, + 0x43, 0x45, 0x48, 0x58, 0x35, 0x46, 0x61, 0x5A, 0x4E, 0x58, 0x7A, 0x75, 0x76, 0x4F, 0x2B, 0x46, 0x42, 0x38, 0x54, 0x78, 0x78, 0x75, 0x42, 0x45, 0x4F, 0x62, 0x2B, 0x64, 0x59, 0x37, 0x0A, 0x49, 0x78, 0x6A, 0x70, 0x36, 0x6F, 0x37, 0x52, 0x54, + 0x55, 0x61, 0x4E, 0x38, 0x54, 0x76, 0x6B, 0x61, 0x73, 0x71, 0x36, 0x2B, 0x79, 0x4F, 0x33, 0x6D, 0x2F, 0x71, 0x5A, 0x41, 0x53, 0x6C, 0x61, 0x57, 0x46, 0x6F, 0x74, 0x34, 0x2F, 0x6E, 0x55, 0x62, 0x51, 0x34, 0x6D, 0x72, 0x63, 0x46, 0x75, 0x4E, + 0x4C, 0x77, 0x79, 0x2B, 0x41, 0x77, 0x46, 0x2B, 0x6D, 0x57, 0x6A, 0x32, 0x7A, 0x73, 0x33, 0x67, 0x79, 0x4C, 0x70, 0x31, 0x74, 0x78, 0x79, 0x4D, 0x2F, 0x31, 0x64, 0x0A, 0x38, 0x69, 0x43, 0x39, 0x64, 0x6A, 0x77, 0x6A, 0x32, 0x69, 0x6A, 0x33, + 0x2B, 0x52, 0x76, 0x72, 0x57, 0x57, 0x54, 0x56, 0x33, 0x46, 0x39, 0x79, 0x66, 0x69, 0x44, 0x38, 0x7A, 0x59, 0x6D, 0x31, 0x6B, 0x47, 0x64, 0x4E, 0x59, 0x6E, 0x6F, 0x2F, 0x54, 0x71, 0x30, 0x64, 0x77, 0x7A, 0x6E, 0x2B, 0x65, 0x76, 0x51, 0x6F, + 0x46, 0x74, 0x39, 0x42, 0x39, 0x6B, 0x69, 0x41, 0x42, 0x64, 0x63, 0x50, 0x55, 0x58, 0x6D, 0x73, 0x45, 0x4B, 0x76, 0x55, 0x37, 0x41, 0x4E, 0x6D, 0x0A, 0x35, 0x6D, 0x71, 0x77, 0x75, 0x6A, 0x47, 0x53, 0x51, 0x6B, 0x42, 0x71, 0x76, 0x6A, 0x72, + 0x54, 0x63, 0x75, 0x46, 0x71, 0x4E, 0x31, 0x57, 0x38, 0x72, 0x42, 0x32, 0x56, 0x74, 0x32, 0x6C, 0x68, 0x38, 0x6B, 0x4F, 0x52, 0x64, 0x4F, 0x61, 0x67, 0x30, 0x77, 0x6F, 0x6B, 0x52, 0x71, 0x45, 0x49, 0x72, 0x39, 0x62, 0x61, 0x52, 0x52, 0x6D, + 0x57, 0x31, 0x46, 0x4D, 0x64, 0x57, 0x34, 0x52, 0x35, 0x38, 0x4D, 0x44, 0x33, 0x52, 0x2B, 0x2B, 0x4C, 0x6A, 0x38, 0x55, 0x47, 0x0A, 0x72, 0x70, 0x31, 0x4D, 0x59, 0x70, 0x33, 0x2F, 0x52, 0x67, 0x54, 0x34, 0x30, 0x38, 0x6D, 0x32, 0x45, 0x43, + 0x56, 0x41, 0x64, 0x66, 0x34, 0x57, 0x71, 0x73, 0x6C, 0x4B, 0x59, 0x49, 0x59, 0x76, 0x75, 0x75, 0x38, 0x77, 0x64, 0x2B, 0x52, 0x55, 0x34, 0x72, 0x69, 0x45, 0x6D, 0x56, 0x69, 0x41, 0x71, 0x68, 0x4F, 0x4C, 0x55, 0x54, 0x70, 0x50, 0x53, 0x50, + 0x61, 0x4C, 0x74, 0x72, 0x4D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, + 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x54, 0x42, 0x6D, 0x79, 0x66, + 0x7A, 0x35, 0x6D, 0x2F, 0x6A, 0x41, 0x6F, 0x35, 0x34, 0x76, 0x42, 0x34, 0x69, 0x6B, 0x50, 0x6D, 0x6C, 0x6A, 0x5A, 0x62, 0x79, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, + 0x41, 0x44, 0x41, 0x35, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x50, 0x4D, 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x47, 0x51, 0x57, 0x31, + 0x68, 0x65, 0x6D, 0x39, 0x75, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x42, 0x62, 0x57, 0x46, 0x36, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, + 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x31, 0x0A, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x34, 0x4D, 0x44, 0x45, 0x78, 0x4E, 0x7A, 0x41, 0x77, 0x4D, 0x44, + 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x4F, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x42, 0x6B, + 0x46, 0x74, 0x59, 0x58, 0x70, 0x76, 0x0A, 0x62, 0x6A, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x51, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, + 0x30, 0x45, 0x67, 0x4D, 0x54, 0x43, 0x43, 0x41, 0x53, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, + 0x51, 0x6F, 0x43, 0x0A, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4C, 0x4A, 0x34, 0x67, 0x48, 0x48, 0x4B, 0x65, 0x4E, 0x58, 0x6A, 0x63, 0x61, 0x39, 0x48, 0x67, 0x46, 0x42, 0x30, 0x66, 0x57, 0x37, 0x59, 0x31, 0x34, 0x68, 0x32, 0x39, 0x4A, 0x6C, 0x6F, + 0x39, 0x31, 0x67, 0x68, 0x59, 0x50, 0x6C, 0x30, 0x68, 0x41, 0x45, 0x76, 0x72, 0x41, 0x49, 0x74, 0x68, 0x74, 0x4F, 0x67, 0x51, 0x33, 0x70, 0x4F, 0x73, 0x71, 0x54, 0x51, 0x4E, 0x72, 0x6F, 0x42, 0x76, 0x6F, 0x33, 0x62, 0x53, 0x4D, 0x67, 0x48, + 0x0A, 0x46, 0x7A, 0x5A, 0x4D, 0x39, 0x4F, 0x36, 0x49, 0x49, 0x38, 0x63, 0x2B, 0x36, 0x7A, 0x66, 0x31, 0x74, 0x52, 0x6E, 0x34, 0x53, 0x57, 0x69, 0x77, 0x33, 0x74, 0x65, 0x35, 0x64, 0x6A, 0x67, 0x64, 0x59, 0x5A, 0x36, 0x6B, 0x2F, 0x6F, 0x49, + 0x32, 0x70, 0x65, 0x56, 0x4B, 0x56, 0x75, 0x52, 0x46, 0x34, 0x66, 0x6E, 0x39, 0x74, 0x42, 0x62, 0x36, 0x64, 0x4E, 0x71, 0x63, 0x6D, 0x7A, 0x55, 0x35, 0x4C, 0x2F, 0x71, 0x77, 0x49, 0x46, 0x41, 0x47, 0x62, 0x48, 0x72, 0x51, 0x0A, 0x67, 0x4C, + 0x4B, 0x6D, 0x2B, 0x61, 0x2F, 0x73, 0x52, 0x78, 0x6D, 0x50, 0x55, 0x44, 0x67, 0x48, 0x33, 0x4B, 0x4B, 0x48, 0x4F, 0x56, 0x6A, 0x34, 0x75, 0x74, 0x57, 0x70, 0x2B, 0x55, 0x68, 0x6E, 0x4D, 0x4A, 0x62, 0x75, 0x6C, 0x48, 0x68, 0x65, 0x62, 0x34, + 0x6D, 0x6A, 0x55, 0x63, 0x41, 0x77, 0x68, 0x6D, 0x61, 0x68, 0x52, 0x57, 0x61, 0x36, 0x56, 0x4F, 0x75, 0x6A, 0x77, 0x35, 0x48, 0x35, 0x53, 0x4E, 0x7A, 0x2F, 0x30, 0x65, 0x67, 0x77, 0x4C, 0x58, 0x30, 0x74, 0x0A, 0x64, 0x48, 0x41, 0x31, 0x31, + 0x34, 0x67, 0x6B, 0x39, 0x35, 0x37, 0x45, 0x57, 0x57, 0x36, 0x37, 0x63, 0x34, 0x63, 0x58, 0x38, 0x6A, 0x4A, 0x47, 0x4B, 0x4C, 0x68, 0x44, 0x2B, 0x72, 0x63, 0x64, 0x71, 0x73, 0x71, 0x30, 0x38, 0x70, 0x38, 0x6B, 0x44, 0x69, 0x31, 0x4C, 0x39, + 0x33, 0x46, 0x63, 0x58, 0x6D, 0x6E, 0x2F, 0x36, 0x70, 0x55, 0x43, 0x79, 0x7A, 0x69, 0x4B, 0x72, 0x6C, 0x41, 0x34, 0x62, 0x39, 0x76, 0x37, 0x4C, 0x57, 0x49, 0x62, 0x78, 0x63, 0x63, 0x65, 0x0A, 0x56, 0x4F, 0x46, 0x33, 0x34, 0x47, 0x66, 0x49, + 0x44, 0x35, 0x79, 0x48, 0x49, 0x39, 0x59, 0x2F, 0x51, 0x43, 0x42, 0x2F, 0x49, 0x49, 0x44, 0x45, 0x67, 0x45, 0x77, 0x2B, 0x4F, 0x79, 0x51, 0x6D, 0x6A, 0x67, 0x53, 0x75, 0x62, 0x4A, 0x72, 0x49, 0x71, 0x67, 0x30, 0x43, 0x41, 0x77, 0x45, 0x41, + 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, + 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x49, 0x51, 0x59, 0x7A, 0x49, 0x55, 0x30, 0x37, 0x4C, 0x77, 0x4D, 0x6C, 0x4A, 0x51, + 0x75, 0x43, 0x46, 0x6D, 0x63, 0x78, 0x37, 0x49, 0x51, 0x54, 0x67, 0x6F, 0x49, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x0A, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, + 0x43, 0x59, 0x38, 0x6A, 0x64, 0x61, 0x51, 0x5A, 0x43, 0x68, 0x47, 0x73, 0x56, 0x32, 0x55, 0x53, 0x67, 0x67, 0x4E, 0x69, 0x4D, 0x4F, 0x72, 0x75, 0x59, 0x6F, 0x75, 0x36, 0x72, 0x34, 0x6C, 0x4B, 0x35, 0x49, 0x70, 0x44, 0x42, 0x2F, 0x47, 0x2F, + 0x77, 0x6B, 0x6A, 0x55, 0x75, 0x30, 0x79, 0x4B, 0x47, 0x58, 0x39, 0x72, 0x62, 0x78, 0x65, 0x6E, 0x44, 0x49, 0x55, 0x35, 0x50, 0x4D, 0x0A, 0x43, 0x43, 0x6A, 0x6A, 0x6D, 0x43, 0x58, 0x50, 0x49, 0x36, 0x54, 0x35, 0x33, 0x69, 0x48, 0x54, 0x66, + 0x49, 0x55, 0x4A, 0x72, 0x55, 0x36, 0x61, 0x64, 0x54, 0x72, 0x43, 0x43, 0x32, 0x71, 0x4A, 0x65, 0x48, 0x5A, 0x45, 0x52, 0x78, 0x68, 0x6C, 0x62, 0x49, 0x31, 0x42, 0x6A, 0x6A, 0x74, 0x2F, 0x6D, 0x73, 0x76, 0x30, 0x74, 0x61, 0x64, 0x51, 0x31, + 0x77, 0x55, 0x73, 0x4E, 0x2B, 0x67, 0x44, 0x53, 0x36, 0x33, 0x70, 0x59, 0x61, 0x41, 0x43, 0x62, 0x76, 0x58, 0x79, 0x0A, 0x38, 0x4D, 0x57, 0x79, 0x37, 0x56, 0x75, 0x33, 0x33, 0x50, 0x71, 0x55, 0x58, 0x48, 0x65, 0x65, 0x45, 0x36, 0x56, 0x2F, + 0x55, 0x71, 0x32, 0x56, 0x38, 0x76, 0x69, 0x54, 0x4F, 0x39, 0x36, 0x4C, 0x58, 0x46, 0x76, 0x4B, 0x57, 0x6C, 0x4A, 0x62, 0x59, 0x4B, 0x38, 0x55, 0x39, 0x30, 0x76, 0x76, 0x6F, 0x2F, 0x75, 0x66, 0x51, 0x4A, 0x56, 0x74, 0x4D, 0x56, 0x54, 0x38, + 0x51, 0x74, 0x50, 0x48, 0x52, 0x68, 0x38, 0x6A, 0x72, 0x64, 0x6B, 0x50, 0x53, 0x48, 0x43, 0x61, 0x0A, 0x32, 0x58, 0x56, 0x34, 0x63, 0x64, 0x46, 0x79, 0x51, 0x7A, 0x52, 0x31, 0x62, 0x6C, 0x64, 0x5A, 0x77, 0x67, 0x4A, 0x63, 0x4A, 0x6D, 0x41, + 0x70, 0x7A, 0x79, 0x4D, 0x5A, 0x46, 0x6F, 0x36, 0x49, 0x51, 0x36, 0x58, 0x55, 0x35, 0x4D, 0x73, 0x49, 0x2B, 0x79, 0x4D, 0x52, 0x51, 0x2B, 0x68, 0x44, 0x4B, 0x58, 0x4A, 0x69, 0x6F, 0x61, 0x6C, 0x64, 0x58, 0x67, 0x6A, 0x55, 0x6B, 0x4B, 0x36, + 0x34, 0x32, 0x4D, 0x34, 0x55, 0x77, 0x74, 0x42, 0x56, 0x38, 0x6F, 0x62, 0x32, 0x0A, 0x78, 0x4A, 0x4E, 0x44, 0x64, 0x32, 0x5A, 0x68, 0x77, 0x4C, 0x6E, 0x6F, 0x51, 0x64, 0x65, 0x58, 0x65, 0x47, 0x41, 0x44, 0x62, 0x6B, 0x70, 0x79, 0x72, 0x71, + 0x58, 0x52, 0x66, 0x62, 0x6F, 0x51, 0x6E, 0x6F, 0x5A, 0x73, 0x47, 0x34, 0x71, 0x35, 0x57, 0x54, 0x50, 0x34, 0x36, 0x38, 0x53, 0x51, 0x76, 0x76, 0x47, 0x35, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, + 0x51, 0x54, 0x43, 0x43, 0x41, 0x79, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x54, 0x42, 0x6D, 0x79, 0x66, 0x30, 0x70, 0x59, 0x31, 0x68, 0x70, 0x38, 0x4B, 0x44, 0x2B, 0x57, 0x47, 0x65, 0x50, 0x68, 0x62, 0x4A, 0x72, 0x75, 0x4B, + 0x4E, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x41, 0x35, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, + 0x56, 0x55, 0x7A, 0x45, 0x50, 0x4D, 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x47, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, + 0x42, 0x62, 0x57, 0x46, 0x36, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x31, 0x0A, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, + 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x4F, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, + 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x42, 0x6B, 0x46, 0x74, 0x59, 0x58, 0x70, 0x76, 0x0A, 0x62, 0x6A, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, + 0x78, 0x4D, 0x51, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, + 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x0A, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x32, 0x57, 0x6E, 0x79, 0x32, 0x63, 0x53, 0x6B, 0x78, 0x4B, + 0x67, 0x58, 0x6C, 0x52, 0x6D, 0x65, 0x79, 0x4B, 0x79, 0x32, 0x74, 0x67, 0x55, 0x52, 0x4F, 0x38, 0x54, 0x57, 0x30, 0x47, 0x2F, 0x4C, 0x41, 0x49, 0x6A, 0x64, 0x30, 0x5A, 0x45, 0x47, 0x72, 0x48, 0x4A, 0x67, 0x77, 0x31, 0x32, 0x4D, 0x42, 0x76, + 0x49, 0x49, 0x54, 0x70, 0x6C, 0x4C, 0x47, 0x62, 0x68, 0x51, 0x50, 0x44, 0x57, 0x39, 0x74, 0x4B, 0x36, 0x4D, 0x6A, 0x34, 0x0A, 0x6B, 0x48, 0x62, 0x5A, 0x57, 0x30, 0x2F, 0x6A, 0x54, 0x4F, 0x67, 0x47, 0x4E, 0x6B, 0x33, 0x4D, 0x6D, 0x71, 0x77, + 0x39, 0x44, 0x4A, 0x41, 0x72, 0x6B, 0x74, 0x51, 0x47, 0x47, 0x57, 0x43, 0x73, 0x4E, 0x30, 0x52, 0x35, 0x68, 0x59, 0x47, 0x43, 0x72, 0x56, 0x6F, 0x33, 0x34, 0x41, 0x33, 0x4D, 0x6E, 0x61, 0x5A, 0x4D, 0x55, 0x6E, 0x62, 0x71, 0x51, 0x35, 0x32, + 0x33, 0x42, 0x4E, 0x46, 0x51, 0x39, 0x6C, 0x58, 0x67, 0x31, 0x64, 0x4B, 0x6D, 0x53, 0x59, 0x58, 0x70, 0x0A, 0x4E, 0x2B, 0x6E, 0x4B, 0x66, 0x71, 0x35, 0x63, 0x6C, 0x55, 0x31, 0x49, 0x6D, 0x6A, 0x2B, 0x75, 0x49, 0x46, 0x70, 0x74, 0x69, 0x4A, + 0x58, 0x5A, 0x4E, 0x4C, 0x68, 0x53, 0x47, 0x6B, 0x4F, 0x51, 0x73, 0x4C, 0x39, 0x73, 0x42, 0x62, 0x6D, 0x32, 0x65, 0x4C, 0x66, 0x71, 0x30, 0x4F, 0x51, 0x36, 0x50, 0x42, 0x4A, 0x54, 0x59, 0x76, 0x39, 0x4B, 0x38, 0x6E, 0x75, 0x2B, 0x4E, 0x51, + 0x57, 0x70, 0x45, 0x6A, 0x54, 0x6A, 0x38, 0x32, 0x52, 0x30, 0x59, 0x69, 0x77, 0x39, 0x0A, 0x41, 0x45, 0x6C, 0x61, 0x4B, 0x50, 0x34, 0x79, 0x52, 0x4C, 0x75, 0x48, 0x33, 0x57, 0x55, 0x6E, 0x41, 0x6E, 0x45, 0x37, 0x32, 0x6B, 0x72, 0x33, 0x48, + 0x39, 0x72, 0x4E, 0x39, 0x79, 0x46, 0x56, 0x6B, 0x45, 0x38, 0x50, 0x37, 0x4B, 0x36, 0x43, 0x34, 0x5A, 0x39, 0x72, 0x32, 0x55, 0x58, 0x54, 0x75, 0x2F, 0x42, 0x66, 0x68, 0x2B, 0x30, 0x38, 0x4C, 0x44, 0x6D, 0x47, 0x32, 0x6A, 0x2F, 0x65, 0x37, + 0x48, 0x4A, 0x56, 0x36, 0x33, 0x6D, 0x6A, 0x72, 0x64, 0x76, 0x64, 0x0A, 0x66, 0x4C, 0x43, 0x36, 0x48, 0x4D, 0x37, 0x38, 0x33, 0x6B, 0x38, 0x31, 0x64, 0x73, 0x38, 0x50, 0x2B, 0x48, 0x67, 0x66, 0x61, 0x6A, 0x5A, 0x52, 0x52, 0x69, 0x64, 0x68, + 0x57, 0x2B, 0x6D, 0x65, 0x7A, 0x2F, 0x43, 0x69, 0x56, 0x58, 0x31, 0x38, 0x4A, 0x59, 0x70, 0x76, 0x4C, 0x37, 0x54, 0x46, 0x7A, 0x34, 0x51, 0x75, 0x4B, 0x2F, 0x30, 0x4E, 0x55, 0x52, 0x42, 0x73, 0x2B, 0x31, 0x38, 0x62, 0x76, 0x42, 0x74, 0x2B, + 0x78, 0x61, 0x34, 0x37, 0x6D, 0x41, 0x45, 0x78, 0x0A, 0x6B, 0x76, 0x38, 0x4C, 0x56, 0x2F, 0x53, 0x61, 0x73, 0x72, 0x6C, 0x58, 0x36, 0x61, 0x76, 0x76, 0x44, 0x58, 0x62, 0x52, 0x38, 0x4F, 0x37, 0x30, 0x7A, 0x6F, 0x61, 0x6E, 0x34, 0x47, 0x37, + 0x70, 0x74, 0x47, 0x6D, 0x68, 0x33, 0x32, 0x6E, 0x32, 0x4D, 0x38, 0x5A, 0x70, 0x4C, 0x70, 0x63, 0x54, 0x6E, 0x71, 0x57, 0x48, 0x73, 0x46, 0x63, 0x51, 0x67, 0x54, 0x66, 0x4A, 0x55, 0x37, 0x4F, 0x37, 0x66, 0x2F, 0x61, 0x53, 0x30, 0x5A, 0x7A, + 0x51, 0x47, 0x50, 0x53, 0x53, 0x0A, 0x62, 0x74, 0x71, 0x44, 0x54, 0x36, 0x5A, 0x6A, 0x6D, 0x55, 0x79, 0x6C, 0x2B, 0x31, 0x37, 0x76, 0x49, 0x57, 0x52, 0x36, 0x49, 0x46, 0x39, 0x73, 0x5A, 0x49, 0x55, 0x56, 0x79, 0x7A, 0x66, 0x70, 0x59, 0x67, + 0x77, 0x4C, 0x4B, 0x68, 0x62, 0x63, 0x41, 0x53, 0x34, 0x79, 0x32, 0x6A, 0x35, 0x4C, 0x39, 0x5A, 0x34, 0x36, 0x39, 0x68, 0x64, 0x41, 0x6C, 0x4F, 0x2B, 0x65, 0x6B, 0x51, 0x69, 0x47, 0x2B, 0x72, 0x35, 0x6A, 0x71, 0x46, 0x6F, 0x7A, 0x37, 0x4D, + 0x74, 0x30, 0x0A, 0x51, 0x35, 0x58, 0x35, 0x62, 0x47, 0x6C, 0x53, 0x4E, 0x73, 0x63, 0x70, 0x62, 0x2F, 0x78, 0x56, 0x41, 0x31, 0x77, 0x66, 0x2B, 0x35, 0x2B, 0x39, 0x52, 0x2B, 0x76, 0x6E, 0x53, 0x55, 0x65, 0x56, 0x43, 0x30, 0x36, 0x4A, 0x49, + 0x67, 0x6C, 0x4A, 0x34, 0x50, 0x56, 0x68, 0x48, 0x76, 0x47, 0x2F, 0x4C, 0x6F, 0x70, 0x79, 0x62, 0x6F, 0x42, 0x5A, 0x2F, 0x31, 0x63, 0x36, 0x2B, 0x58, 0x55, 0x79, 0x6F, 0x30, 0x35, 0x66, 0x37, 0x4F, 0x30, 0x6F, 0x59, 0x74, 0x6C, 0x4E, 0x0A, + 0x63, 0x2F, 0x4C, 0x4D, 0x67, 0x52, 0x64, 0x67, 0x37, 0x63, 0x33, 0x72, 0x33, 0x4E, 0x75, 0x6E, 0x79, 0x73, 0x56, 0x2B, 0x41, 0x72, 0x33, 0x79, 0x56, 0x41, 0x68, 0x55, 0x2F, 0x62, 0x51, 0x74, 0x43, 0x53, 0x77, 0x58, 0x56, 0x45, 0x71, 0x59, + 0x30, 0x56, 0x54, 0x68, 0x55, 0x57, 0x63, 0x49, 0x30, 0x75, 0x31, 0x75, 0x66, 0x6D, 0x38, 0x2F, 0x30, 0x69, 0x32, 0x42, 0x57, 0x53, 0x6C, 0x6D, 0x79, 0x35, 0x41, 0x35, 0x6C, 0x52, 0x45, 0x65, 0x64, 0x43, 0x66, 0x2B, 0x0A, 0x33, 0x65, 0x75, + 0x76, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x77, 0x0A, 0x44, 0x50, 0x42, 0x4D, 0x4D, 0x50, + 0x51, 0x46, 0x57, 0x41, 0x4A, 0x49, 0x2F, 0x54, 0x50, 0x6C, 0x55, 0x71, 0x39, 0x4C, 0x68, 0x4F, 0x4E, 0x6D, 0x55, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x41, + 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x71, 0x71, 0x69, 0x41, 0x6A, 0x77, 0x35, 0x34, 0x6F, 0x2B, 0x43, 0x69, 0x31, 0x4D, 0x33, 0x6D, 0x39, 0x5A, 0x68, 0x36, 0x4F, 0x2B, 0x6F, 0x41, 0x0A, 0x41, 0x37, 0x43, 0x58, 0x44, 0x70, 0x4F, 0x38, 0x57, + 0x71, 0x6A, 0x32, 0x4C, 0x49, 0x78, 0x79, 0x68, 0x36, 0x6D, 0x78, 0x2F, 0x48, 0x39, 0x7A, 0x2F, 0x57, 0x4E, 0x78, 0x65, 0x4B, 0x57, 0x48, 0x57, 0x63, 0x38, 0x77, 0x34, 0x51, 0x30, 0x51, 0x73, 0x68, 0x4E, 0x61, 0x62, 0x59, 0x4C, 0x31, 0x61, + 0x75, 0x61, 0x41, 0x6E, 0x36, 0x41, 0x46, 0x43, 0x32, 0x6A, 0x6B, 0x52, 0x32, 0x76, 0x48, 0x61, 0x74, 0x2B, 0x32, 0x2F, 0x58, 0x63, 0x79, 0x63, 0x75, 0x55, 0x59, 0x0A, 0x2B, 0x67, 0x6E, 0x30, 0x6F, 0x4A, 0x4D, 0x73, 0x58, 0x64, 0x4B, 0x4D, + 0x64, 0x59, 0x56, 0x32, 0x5A, 0x5A, 0x41, 0x4D, 0x41, 0x33, 0x6D, 0x33, 0x4D, 0x53, 0x4E, 0x6A, 0x72, 0x58, 0x69, 0x44, 0x43, 0x59, 0x5A, 0x6F, 0x68, 0x4D, 0x72, 0x2F, 0x2B, 0x63, 0x38, 0x6D, 0x6D, 0x70, 0x4A, 0x35, 0x35, 0x38, 0x31, 0x4C, + 0x78, 0x65, 0x64, 0x68, 0x70, 0x78, 0x66, 0x4C, 0x38, 0x36, 0x6B, 0x53, 0x6B, 0x35, 0x4E, 0x72, 0x70, 0x2B, 0x67, 0x76, 0x55, 0x35, 0x4C, 0x45, 0x0A, 0x59, 0x46, 0x69, 0x77, 0x7A, 0x41, 0x4A, 0x52, 0x47, 0x46, 0x75, 0x46, 0x6A, 0x57, 0x4A, + 0x5A, 0x59, 0x37, 0x61, 0x74, 0x74, 0x4E, 0x36, 0x61, 0x2B, 0x79, 0x62, 0x33, 0x41, 0x43, 0x66, 0x41, 0x58, 0x56, 0x55, 0x33, 0x64, 0x4A, 0x6E, 0x4A, 0x55, 0x48, 0x2F, 0x6A, 0x57, 0x53, 0x35, 0x45, 0x34, 0x79, 0x77, 0x6C, 0x37, 0x75, 0x78, + 0x4D, 0x4D, 0x6E, 0x65, 0x30, 0x6E, 0x78, 0x72, 0x70, 0x53, 0x31, 0x30, 0x67, 0x78, 0x64, 0x72, 0x39, 0x48, 0x49, 0x63, 0x57, 0x0A, 0x78, 0x6B, 0x50, 0x6F, 0x31, 0x4C, 0x73, 0x6D, 0x6D, 0x6B, 0x56, 0x77, 0x58, 0x71, 0x6B, 0x4C, 0x4E, 0x31, + 0x50, 0x69, 0x52, 0x6E, 0x73, 0x6E, 0x2F, 0x65, 0x42, 0x47, 0x38, 0x6F, 0x6D, 0x33, 0x7A, 0x45, 0x4B, 0x32, 0x79, 0x79, 0x67, 0x6D, 0x62, 0x74, 0x6D, 0x6C, 0x79, 0x54, 0x72, 0x49, 0x51, 0x52, 0x4E, 0x67, 0x39, 0x31, 0x43, 0x4D, 0x46, 0x61, + 0x36, 0x79, 0x62, 0x52, 0x6F, 0x56, 0x47, 0x6C, 0x64, 0x34, 0x35, 0x70, 0x49, 0x71, 0x32, 0x57, 0x57, 0x51, 0x0A, 0x67, 0x6A, 0x39, 0x73, 0x41, 0x71, 0x2B, 0x75, 0x45, 0x6A, 0x6F, 0x6E, 0x6C, 0x6A, 0x59, 0x45, 0x31, 0x78, 0x32, 0x69, 0x67, + 0x47, 0x4F, 0x70, 0x6D, 0x2F, 0x48, 0x6C, 0x75, 0x72, 0x52, 0x38, 0x46, 0x4C, 0x42, 0x4F, 0x79, 0x62, 0x45, 0x66, 0x64, 0x46, 0x38, 0x34, 0x39, 0x6C, 0x48, 0x71, 0x6D, 0x2F, 0x6F, 0x73, 0x6F, 0x68, 0x48, 0x55, 0x71, 0x53, 0x30, 0x6E, 0x47, + 0x6B, 0x57, 0x78, 0x72, 0x37, 0x4A, 0x4F, 0x63, 0x51, 0x33, 0x41, 0x57, 0x45, 0x62, 0x57, 0x0A, 0x61, 0x51, 0x62, 0x4C, 0x55, 0x38, 0x75, 0x7A, 0x2F, 0x6D, 0x74, 0x42, 0x7A, 0x55, 0x46, 0x2B, 0x66, 0x55, 0x77, 0x50, 0x66, 0x48, 0x4A, 0x35, + 0x65, 0x6C, 0x6E, 0x4E, 0x58, 0x6B, 0x6F, 0x4F, 0x72, 0x4A, 0x75, 0x70, 0x6D, 0x48, 0x4E, 0x35, 0x66, 0x4C, 0x54, 0x30, 0x7A, 0x4C, 0x6D, 0x34, 0x42, 0x77, 0x79, 0x79, 0x64, 0x46, 0x79, 0x34, 0x78, 0x32, 0x2B, 0x49, 0x6F, 0x5A, 0x43, 0x6E, + 0x39, 0x4B, 0x72, 0x35, 0x76, 0x32, 0x63, 0x36, 0x39, 0x42, 0x6F, 0x56, 0x0A, 0x59, 0x68, 0x36, 0x33, 0x6E, 0x37, 0x34, 0x39, 0x73, 0x53, 0x6D, 0x76, 0x5A, 0x36, 0x45, 0x53, 0x38, 0x6C, 0x67, 0x51, 0x47, 0x56, 0x4D, 0x44, 0x4D, 0x42, 0x75, + 0x34, 0x47, 0x6F, 0x6E, 0x32, 0x6E, 0x4C, 0x32, 0x58, 0x41, 0x34, 0x36, 0x6A, 0x43, 0x66, 0x4D, 0x64, 0x69, 0x79, 0x48, 0x78, 0x74, 0x4E, 0x2F, 0x6B, 0x48, 0x4E, 0x47, 0x66, 0x5A, 0x51, 0x49, 0x47, 0x36, 0x6C, 0x7A, 0x57, 0x45, 0x37, 0x4F, + 0x45, 0x37, 0x36, 0x4B, 0x6C, 0x58, 0x49, 0x78, 0x33, 0x0A, 0x4B, 0x61, 0x64, 0x6F, 0x77, 0x47, 0x75, 0x75, 0x51, 0x4E, 0x4B, 0x6F, 0x74, 0x4F, 0x72, 0x4E, 0x38, 0x49, 0x31, 0x4C, 0x4F, 0x4A, 0x77, 0x5A, 0x6D, 0x68, 0x73, 0x6F, 0x56, 0x4C, + 0x69, 0x4A, 0x6B, 0x4F, 0x2F, 0x4B, 0x64, 0x59, 0x45, 0x2B, 0x48, 0x76, 0x4A, 0x6B, 0x4A, 0x4D, 0x63, 0x59, 0x72, 0x30, 0x37, 0x2F, 0x52, 0x35, 0x34, 0x48, 0x39, 0x6A, 0x56, 0x6C, 0x70, 0x4E, 0x4D, 0x4B, 0x56, 0x76, 0x2F, 0x31, 0x46, 0x32, + 0x52, 0x73, 0x37, 0x36, 0x67, 0x69, 0x0A, 0x4A, 0x55, 0x6D, 0x54, 0x74, 0x74, 0x38, 0x41, 0x46, 0x39, 0x70, 0x59, 0x66, 0x6C, 0x33, 0x75, 0x78, 0x52, 0x75, 0x77, 0x30, 0x64, 0x46, 0x66, 0x49, 0x52, 0x44, 0x48, 0x2B, 0x66, 0x4F, 0x36, 0x41, + 0x67, 0x6F, 0x6E, 0x42, 0x38, 0x58, 0x78, 0x31, 0x73, 0x66, 0x54, 0x34, 0x50, 0x73, 0x4A, 0x59, 0x47, 0x77, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x42, 0x74, 0x6A, 0x43, 0x43, 0x41, 0x56, 0x75, + 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x54, 0x42, 0x6D, 0x79, 0x66, 0x31, 0x58, 0x53, 0x58, 0x4E, 0x6D, 0x59, 0x2F, 0x4F, 0x77, 0x75, 0x61, 0x32, 0x65, 0x69, 0x65, 0x64, 0x67, 0x50, 0x79, 0x53, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, + 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x6A, 0x41, 0x35, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x50, 0x4D, 0x41, 0x30, 0x47, 0x41, 0x31, + 0x55, 0x45, 0x43, 0x68, 0x4D, 0x47, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x42, 0x62, 0x57, 0x46, 0x36, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, + 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x7A, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x55, 0x79, 0x0A, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, + 0x44, 0x55, 0x79, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x4F, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x42, 0x6B, 0x46, 0x74, 0x59, 0x58, 0x70, 0x76, 0x62, 0x6A, 0x45, 0x5A, 0x0A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x51, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, + 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x7A, 0x42, 0x5A, 0x4D, 0x42, 0x4D, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, + 0x41, 0x77, 0x45, 0x48, 0x41, 0x30, 0x49, 0x41, 0x42, 0x43, 0x6D, 0x58, 0x70, 0x38, 0x5A, 0x42, 0x0A, 0x66, 0x38, 0x41, 0x4E, 0x6D, 0x2B, 0x67, 0x42, 0x47, 0x31, 0x62, 0x47, 0x38, 0x6C, 0x4B, 0x6C, 0x75, 0x69, 0x32, 0x79, 0x45, 0x75, 0x6A, + 0x53, 0x4C, 0x74, 0x66, 0x36, 0x79, 0x63, 0x58, 0x59, 0x71, 0x6D, 0x30, 0x66, 0x63, 0x34, 0x45, 0x37, 0x4F, 0x35, 0x68, 0x72, 0x4F, 0x58, 0x77, 0x7A, 0x70, 0x63, 0x56, 0x4F, 0x68, 0x6F, 0x36, 0x41, 0x46, 0x32, 0x68, 0x69, 0x52, 0x56, 0x64, + 0x39, 0x52, 0x46, 0x67, 0x64, 0x73, 0x7A, 0x66, 0x6C, 0x5A, 0x77, 0x6A, 0x72, 0x0A, 0x5A, 0x74, 0x36, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, + 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, + 0x53, 0x72, 0x74, 0x74, 0x76, 0x58, 0x42, 0x70, 0x34, 0x33, 0x0A, 0x72, 0x44, 0x43, 0x47, 0x42, 0x35, 0x46, 0x77, 0x78, 0x35, 0x7A, 0x45, 0x47, 0x62, 0x46, 0x34, 0x77, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, + 0x51, 0x51, 0x44, 0x41, 0x67, 0x4E, 0x4A, 0x41, 0x44, 0x42, 0x47, 0x41, 0x69, 0x45, 0x41, 0x34, 0x49, 0x57, 0x53, 0x6F, 0x78, 0x65, 0x33, 0x6A, 0x66, 0x6B, 0x72, 0x42, 0x71, 0x57, 0x54, 0x72, 0x42, 0x71, 0x59, 0x61, 0x47, 0x46, 0x79, 0x2B, + 0x75, 0x47, 0x68, 0x30, 0x50, 0x73, 0x63, 0x0A, 0x65, 0x47, 0x43, 0x6D, 0x51, 0x35, 0x6E, 0x46, 0x75, 0x4D, 0x51, 0x43, 0x49, 0x51, 0x43, 0x63, 0x41, 0x75, 0x2F, 0x78, 0x6C, 0x4A, 0x79, 0x7A, 0x6C, 0x76, 0x6E, 0x72, 0x78, 0x69, 0x72, 0x34, + 0x74, 0x69, 0x7A, 0x2B, 0x4F, 0x70, 0x41, 0x55, 0x46, 0x74, 0x65, 0x4D, 0x59, 0x79, 0x52, 0x49, 0x48, 0x4E, 0x38, 0x77, 0x66, 0x64, 0x56, 0x6F, 0x4F, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x34, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, + 0x49, 0x42, 0x38, 0x6A, 0x43, 0x43, 0x41, 0x58, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x54, 0x42, 0x6D, 0x79, 0x66, 0x31, 0x38, 0x47, 0x37, 0x45, 0x45, 0x77, 0x70, 0x51, 0x2B, 0x56, 0x78, 0x65, 0x33, 0x73, 0x73, 0x79, 0x42, + 0x72, 0x42, 0x44, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x41, 0x35, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, + 0x7A, 0x45, 0x50, 0x4D, 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x47, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x42, 0x62, + 0x57, 0x46, 0x36, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x30, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x55, 0x79, 0x0A, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, + 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x4F, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, + 0x56, 0x56, 0x4D, 0x78, 0x44, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x42, 0x6B, 0x46, 0x74, 0x59, 0x58, 0x70, 0x76, 0x62, 0x6A, 0x45, 0x5A, 0x0A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, + 0x51, 0x51, 0x57, 0x31, 0x68, 0x65, 0x6D, 0x39, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4E, 0x44, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, + 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4E, 0x4B, 0x72, 0x69, 0x6A, 0x64, 0x50, 0x6F, 0x31, 0x4D, 0x4E, 0x0A, 0x2F, 0x73, 0x47, 0x4B, 0x65, 0x30, 0x75, 0x6F, 0x65, 0x30, 0x5A, 0x4C, 0x59, 0x37, + 0x42, 0x69, 0x39, 0x69, 0x30, 0x62, 0x32, 0x77, 0x68, 0x78, 0x49, 0x64, 0x49, 0x41, 0x36, 0x47, 0x4F, 0x39, 0x6D, 0x69, 0x66, 0x37, 0x38, 0x44, 0x6C, 0x75, 0x58, 0x65, 0x6F, 0x39, 0x70, 0x63, 0x6D, 0x42, 0x71, 0x71, 0x4E, 0x62, 0x49, 0x4A, + 0x68, 0x46, 0x58, 0x52, 0x62, 0x62, 0x2F, 0x65, 0x67, 0x51, 0x62, 0x65, 0x4F, 0x63, 0x34, 0x4F, 0x4F, 0x39, 0x58, 0x34, 0x52, 0x69, 0x0A, 0x38, 0x33, 0x42, 0x6B, 0x4D, 0x36, 0x44, 0x4C, 0x4A, 0x43, 0x39, 0x77, 0x75, 0x6F, 0x69, 0x68, 0x4B, + 0x71, 0x42, 0x31, 0x2B, 0x49, 0x47, 0x75, 0x59, 0x67, 0x62, 0x45, 0x67, 0x64, 0x73, 0x35, 0x62, 0x69, 0x6D, 0x77, 0x48, 0x76, 0x6F, 0x75, 0x58, 0x4B, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, + 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, + 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4E, 0x50, 0x73, 0x78, 0x7A, 0x70, 0x6C, 0x62, 0x73, 0x7A, 0x68, 0x32, 0x6E, 0x61, 0x61, 0x56, 0x76, 0x75, 0x63, 0x38, 0x34, 0x5A, 0x74, 0x56, 0x2B, 0x57, 0x42, 0x4D, 0x41, 0x6F, 0x47, + 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x67, 0x41, 0x0A, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x44, 0x71, 0x4C, 0x49, 0x66, 0x47, 0x39, 0x66, 0x68, 0x47, 0x74, 0x30, 0x4F, 0x39, 0x59, 0x6C, 0x69, 0x2F, + 0x57, 0x36, 0x35, 0x31, 0x2B, 0x6B, 0x49, 0x30, 0x72, 0x7A, 0x32, 0x5A, 0x56, 0x77, 0x79, 0x7A, 0x6A, 0x4B, 0x4B, 0x6C, 0x77, 0x43, 0x6B, 0x63, 0x4F, 0x38, 0x44, 0x64, 0x5A, 0x45, 0x76, 0x38, 0x74, 0x6D, 0x5A, 0x51, 0x6F, 0x54, 0x69, 0x70, + 0x50, 0x4E, 0x55, 0x30, 0x7A, 0x57, 0x67, 0x49, 0x78, 0x41, 0x4F, 0x70, 0x31, 0x0A, 0x41, 0x45, 0x34, 0x37, 0x78, 0x44, 0x71, 0x55, 0x45, 0x70, 0x48, 0x4A, 0x57, 0x45, 0x61, 0x64, 0x49, 0x52, 0x4E, 0x79, 0x70, 0x34, 0x69, 0x63, 0x69, 0x75, + 0x52, 0x4D, 0x53, 0x74, 0x75, 0x57, 0x31, 0x4B, 0x79, 0x4C, 0x61, 0x32, 0x74, 0x4A, 0x45, 0x6C, 0x4D, 0x7A, 0x72, 0x64, 0x66, 0x6B, 0x76, 0x69, 0x54, 0x38, 0x74, 0x51, 0x70, 0x32, 0x31, 0x4B, 0x57, 0x38, 0x45, 0x41, 0x3D, 0x3D, 0x0A, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x55, 0x42, 0x49, 0x54, 0x41, 0x4B, 0x20, 0x4B, 0x61, 0x6D, 0x75, 0x20, 0x53, + 0x4D, 0x20, 0x53, 0x53, 0x4C, 0x20, 0x4B, 0x6F, 0x6B, 0x20, 0x53, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x6B, 0x61, 0x73, 0x69, 0x20, 0x2D, 0x20, 0x53, 0x75, 0x72, 0x75, 0x6D, 0x20, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x59, 0x7A, 0x43, 0x43, 0x41, 0x30, 0x75, 0x67, 0x41, 0x77, + 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x30, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, + 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x46, 0x49, 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x0A, 0x44, 0x30, 0x64, 0x6C, 0x59, 0x6E, 0x70, 0x6C, 0x49, 0x43, 0x30, 0x67, 0x53, 0x32, 0x39, 0x6A, 0x59, + 0x57, 0x56, 0x73, 0x61, 0x54, 0x46, 0x43, 0x4D, 0x45, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x35, 0x56, 0x48, 0x56, 0x79, 0x61, 0x32, 0x6C, 0x35, 0x5A, 0x53, 0x42, 0x43, 0x61, 0x57, 0x78, 0x70, 0x62, 0x58, 0x4E, 0x6C, 0x62, + 0x43, 0x42, 0x32, 0x5A, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x74, 0x75, 0x62, 0x32, 0x78, 0x76, 0x61, 0x6D, 0x6C, 0x72, 0x0A, 0x49, 0x45, 0x46, 0x79, 0x59, 0x58, 0x4E, 0x30, 0x61, 0x58, 0x4A, 0x74, 0x59, 0x53, 0x42, 0x4C, 0x64, 0x58, 0x4A, 0x31, + 0x62, 0x58, 0x55, 0x67, 0x4C, 0x53, 0x42, 0x55, 0x56, 0x55, 0x4A, 0x4A, 0x56, 0x45, 0x46, 0x4C, 0x4D, 0x53, 0x30, 0x77, 0x4B, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x79, 0x52, 0x4C, 0x59, 0x57, 0x31, 0x31, 0x49, 0x46, 0x4E, 0x6C, + 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x72, 0x59, 0x58, 0x4E, 0x35, 0x62, 0x32, 0x34, 0x67, 0x0A, 0x54, 0x57, 0x56, 0x79, 0x61, 0x32, 0x56, 0x36, 0x61, 0x53, 0x41, 0x74, 0x49, 0x45, 0x74, 0x68, 0x62, 0x58, 0x55, 0x67, 0x55, 0x30, 0x30, + 0x78, 0x4E, 0x6A, 0x41, 0x30, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x4C, 0x56, 0x52, 0x56, 0x51, 0x6B, 0x6C, 0x55, 0x51, 0x55, 0x73, 0x67, 0x53, 0x32, 0x46, 0x74, 0x64, 0x53, 0x42, 0x54, 0x54, 0x53, 0x42, 0x54, 0x55, 0x30, 0x77, + 0x67, 0x53, 0x32, 0x39, 0x72, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x0A, 0x5A, 0x6D, 0x6C, 0x72, 0x59, 0x58, 0x4E, 0x70, 0x49, 0x43, 0x30, 0x67, 0x55, 0x33, 0x56, 0x79, 0x64, 0x57, 0x30, 0x67, 0x4D, 0x54, 0x41, 0x65, 0x46, 0x77, + 0x30, 0x78, 0x4D, 0x7A, 0x45, 0x78, 0x4D, 0x6A, 0x55, 0x77, 0x4F, 0x44, 0x49, 0x31, 0x4E, 0x54, 0x56, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x7A, 0x45, 0x77, 0x4D, 0x6A, 0x55, 0x77, 0x4F, 0x44, 0x49, 0x31, 0x4E, 0x54, 0x56, 0x61, 0x4D, 0x49, + 0x48, 0x53, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x55, 0x55, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x50, 0x52, 0x32, 0x56, 0x69, 0x65, + 0x6D, 0x55, 0x67, 0x4C, 0x53, 0x42, 0x4C, 0x62, 0x32, 0x4E, 0x68, 0x5A, 0x57, 0x78, 0x70, 0x4D, 0x55, 0x49, 0x77, 0x51, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x7A, 0x6C, 0x55, 0x64, 0x58, 0x4A, 0x72, 0x61, 0x58, 0x6C, 0x6C, 0x49, + 0x45, 0x4A, 0x70, 0x62, 0x47, 0x6C, 0x74, 0x0A, 0x63, 0x32, 0x56, 0x73, 0x49, 0x48, 0x5A, 0x6C, 0x49, 0x46, 0x52, 0x6C, 0x61, 0x32, 0x35, 0x76, 0x62, 0x47, 0x39, 0x71, 0x61, 0x57, 0x73, 0x67, 0x51, 0x58, 0x4A, 0x68, 0x63, 0x33, 0x52, 0x70, + 0x63, 0x6D, 0x31, 0x68, 0x49, 0x45, 0x74, 0x31, 0x63, 0x6E, 0x56, 0x74, 0x64, 0x53, 0x41, 0x74, 0x49, 0x46, 0x52, 0x56, 0x51, 0x6B, 0x6C, 0x55, 0x51, 0x55, 0x73, 0x78, 0x4C, 0x54, 0x41, 0x72, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, + 0x4A, 0x45, 0x74, 0x68, 0x0A, 0x62, 0x58, 0x55, 0x67, 0x55, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x74, 0x68, 0x63, 0x33, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x4E, 0x5A, 0x58, 0x4A, 0x72, 0x5A, 0x58, 0x70, 0x70, 0x49, 0x43, 0x30, + 0x67, 0x53, 0x32, 0x46, 0x74, 0x64, 0x53, 0x42, 0x54, 0x54, 0x54, 0x45, 0x32, 0x4D, 0x44, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x74, 0x56, 0x46, 0x56, 0x43, 0x53, 0x56, 0x52, 0x42, 0x53, 0x79, 0x42, 0x4C, 0x59, 0x57, 0x31, + 0x31, 0x0A, 0x49, 0x46, 0x4E, 0x4E, 0x49, 0x46, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x4C, 0x62, 0x32, 0x73, 0x67, 0x55, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x74, 0x68, 0x63, 0x32, 0x6B, 0x67, 0x4C, 0x53, 0x42, 0x54, 0x64, 0x58, + 0x4A, 0x31, 0x62, 0x53, 0x41, 0x78, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x0A, 0x4D, + 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x72, 0x33, 0x55, 0x77, 0x4D, 0x36, 0x71, 0x37, 0x61, 0x39, 0x4F, 0x5A, 0x4C, 0x42, 0x49, 0x33, 0x68, 0x4E, 0x6D, 0x4E, 0x65, 0x35, 0x65, 0x41, 0x30, 0x32, 0x37, 0x6E, 0x2F, + 0x35, 0x74, 0x51, 0x6C, 0x54, 0x36, 0x51, 0x6C, 0x56, 0x5A, 0x43, 0x31, 0x78, 0x6C, 0x38, 0x4A, 0x6F, 0x53, 0x4E, 0x6B, 0x76, 0x6F, 0x42, 0x48, 0x54, 0x6F, 0x50, 0x34, 0x6D, 0x51, 0x34, 0x74, 0x34, 0x79, 0x38, 0x0A, 0x36, 0x49, 0x6A, 0x35, + 0x69, 0x79, 0x53, 0x72, 0x4C, 0x71, 0x50, 0x31, 0x4E, 0x2B, 0x52, 0x41, 0x6A, 0x68, 0x67, 0x6C, 0x65, 0x59, 0x4E, 0x31, 0x48, 0x7A, 0x76, 0x2F, 0x62, 0x4B, 0x6A, 0x46, 0x78, 0x6C, 0x62, 0x34, 0x74, 0x4F, 0x32, 0x4B, 0x52, 0x4B, 0x4F, 0x72, + 0x62, 0x45, 0x7A, 0x38, 0x48, 0x64, 0x44, 0x63, 0x37, 0x32, 0x69, 0x39, 0x7A, 0x2B, 0x53, 0x71, 0x7A, 0x76, 0x42, 0x56, 0x39, 0x36, 0x49, 0x30, 0x31, 0x49, 0x4E, 0x72, 0x4E, 0x33, 0x77, 0x63, 0x0A, 0x77, 0x76, 0x36, 0x31, 0x41, 0x2B, 0x78, + 0x58, 0x7A, 0x72, 0x79, 0x30, 0x74, 0x63, 0x58, 0x74, 0x41, 0x41, 0x39, 0x54, 0x4E, 0x79, 0x70, 0x4E, 0x39, 0x45, 0x38, 0x4D, 0x67, 0x2F, 0x75, 0x47, 0x7A, 0x38, 0x76, 0x2B, 0x6A, 0x45, 0x36, 0x39, 0x68, 0x2F, 0x6D, 0x6E, 0x69, 0x79, 0x46, + 0x58, 0x6E, 0x48, 0x72, 0x66, 0x41, 0x32, 0x65, 0x4A, 0x4C, 0x4A, 0x32, 0x58, 0x59, 0x61, 0x63, 0x51, 0x75, 0x46, 0x57, 0x51, 0x66, 0x77, 0x34, 0x74, 0x4A, 0x7A, 0x68, 0x30, 0x0A, 0x33, 0x2B, 0x66, 0x39, 0x32, 0x6B, 0x34, 0x53, 0x34, 0x30, + 0x30, 0x56, 0x49, 0x67, 0x4C, 0x49, 0x34, 0x4F, 0x44, 0x38, 0x44, 0x36, 0x32, 0x4B, 0x31, 0x38, 0x6C, 0x55, 0x55, 0x4D, 0x77, 0x37, 0x44, 0x38, 0x6F, 0x57, 0x67, 0x49, 0x54, 0x51, 0x55, 0x56, 0x62, 0x44, 0x6A, 0x6C, 0x5A, 0x2F, 0x69, 0x53, + 0x49, 0x7A, 0x4C, 0x2B, 0x61, 0x46, 0x43, 0x72, 0x32, 0x6C, 0x71, 0x42, 0x73, 0x32, 0x33, 0x74, 0x50, 0x63, 0x4C, 0x47, 0x30, 0x37, 0x78, 0x78, 0x4F, 0x39, 0x0A, 0x57, 0x53, 0x4D, 0x73, 0x35, 0x75, 0x57, 0x6B, 0x39, 0x39, 0x67, 0x4C, 0x37, + 0x65, 0x71, 0x51, 0x51, 0x45, 0x53, 0x6F, 0x6C, 0x62, 0x75, 0x54, 0x31, 0x64, 0x43, 0x41, 0x4E, 0x4C, 0x5A, 0x47, 0x65, 0x41, 0x34, 0x66, 0x41, 0x4A, 0x4E, 0x47, 0x34, 0x65, 0x37, 0x70, 0x2B, 0x65, 0x78, 0x50, 0x46, 0x77, 0x49, 0x44, 0x41, + 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x0A, 0x5A, 0x54, 0x2F, 0x48, 0x69, 0x6F, 0x62, 0x47, 0x50, 0x4E, 0x30, 0x38, 0x56, 0x46, 0x77, 0x31, + 0x2B, 0x44, 0x72, 0x74, 0x55, 0x67, 0x78, 0x48, 0x56, 0x38, 0x67, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, + 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x0A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, + 0x42, 0x41, 0x43, 0x6F, 0x2F, 0x34, 0x66, 0x45, 0x79, 0x6A, 0x71, 0x37, 0x68, 0x6D, 0x46, 0x78, 0x4C, 0x58, 0x73, 0x39, 0x72, 0x48, 0x6D, 0x6F, 0x4A, 0x30, 0x69, 0x4B, 0x70, 0x45, 0x73, 0x64, 0x65, 0x56, 0x33, 0x31, 0x7A, 0x56, 0x6D, 0x53, + 0x41, 0x68, 0x48, 0x71, 0x54, 0x35, 0x41, 0x6D, 0x35, 0x45, 0x4D, 0x32, 0x66, 0x4B, 0x69, 0x66, 0x68, 0x0A, 0x41, 0x48, 0x65, 0x2B, 0x53, 0x4D, 0x67, 0x31, 0x71, 0x49, 0x47, 0x66, 0x35, 0x4C, 0x67, 0x73, 0x79, 0x58, 0x38, 0x4F, 0x73, 0x4E, + 0x4A, 0x4C, 0x4E, 0x31, 0x33, 0x71, 0x75, 0x64, 0x55, 0x4C, 0x58, 0x6A, 0x53, 0x39, 0x39, 0x48, 0x4D, 0x70, 0x77, 0x2B, 0x30, 0x6D, 0x46, 0x5A, 0x78, 0x2B, 0x43, 0x46, 0x4F, 0x4B, 0x57, 0x49, 0x33, 0x51, 0x53, 0x79, 0x6A, 0x66, 0x77, 0x62, + 0x50, 0x66, 0x49, 0x50, 0x50, 0x35, 0x34, 0x2B, 0x4D, 0x36, 0x33, 0x38, 0x79, 0x63, 0x0A, 0x6C, 0x4E, 0x68, 0x4F, 0x54, 0x38, 0x4E, 0x72, 0x46, 0x37, 0x66, 0x33, 0x63, 0x75, 0x69, 0x74, 0x5A, 0x6A, 0x4F, 0x31, 0x4A, 0x56, 0x4F, 0x72, 0x34, + 0x50, 0x68, 0x4D, 0x71, 0x5A, 0x33, 0x39, 0x38, 0x67, 0x32, 0x36, 0x72, 0x72, 0x6E, 0x5A, 0x71, 0x73, 0x5A, 0x72, 0x2B, 0x5A, 0x4F, 0x37, 0x72, 0x71, 0x75, 0x34, 0x6C, 0x7A, 0x77, 0x44, 0x47, 0x72, 0x70, 0x44, 0x78, 0x70, 0x61, 0x35, 0x52, + 0x58, 0x49, 0x34, 0x73, 0x36, 0x65, 0x68, 0x6C, 0x6A, 0x32, 0x52, 0x0A, 0x65, 0x33, 0x37, 0x41, 0x49, 0x56, 0x4E, 0x4D, 0x68, 0x2B, 0x33, 0x79, 0x43, 0x31, 0x53, 0x56, 0x55, 0x5A, 0x50, 0x56, 0x49, 0x71, 0x55, 0x4E, 0x69, 0x76, 0x47, 0x54, + 0x44, 0x6A, 0x35, 0x55, 0x44, 0x72, 0x44, 0x59, 0x79, 0x55, 0x37, 0x63, 0x38, 0x6A, 0x45, 0x79, 0x56, 0x75, 0x70, 0x6B, 0x2B, 0x65, 0x71, 0x31, 0x6E, 0x52, 0x5A, 0x6D, 0x51, 0x6E, 0x4C, 0x7A, 0x66, 0x39, 0x4F, 0x78, 0x4D, 0x55, 0x50, 0x38, + 0x70, 0x49, 0x34, 0x58, 0x38, 0x57, 0x30, 0x6A, 0x0A, 0x71, 0x35, 0x52, 0x6D, 0x2B, 0x4B, 0x33, 0x37, 0x44, 0x77, 0x68, 0x75, 0x4A, 0x69, 0x31, 0x2F, 0x46, 0x77, 0x63, 0x4A, 0x73, 0x6F, 0x7A, 0x37, 0x55, 0x4D, 0x43, 0x66, 0x6C, 0x6F, 0x33, + 0x50, 0x74, 0x76, 0x30, 0x41, 0x6E, 0x56, 0x6F, 0x55, 0x6D, 0x72, 0x38, 0x43, 0x52, 0x50, 0x58, 0x42, 0x77, 0x70, 0x38, 0x69, 0x58, 0x71, 0x49, 0x50, 0x6F, 0x65, 0x4D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x44, 0x43, 0x41, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x55, 0x54, 0x48, 0x20, 0x52, 0x35, 0x20, 0x52, 0x4F, 0x4F, 0x54, 0x0A, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x69, 0x44, 0x43, 0x43, 0x41, 0x33, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x66, 0x51, 0x6D, 0x58, 0x2F, 0x76, 0x42, 0x48, 0x36, + 0x6E, 0x6F, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x59, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, + 0x30, 0x34, 0x78, 0x4D, 0x6A, 0x41, 0x77, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x4B, 0x55, 0x64, 0x56, 0x51, 0x55, 0x35, 0x48, 0x49, 0x45, 0x52, 0x50, 0x54, 0x6B, 0x63, 0x67, 0x51, 0x30, 0x56, 0x53, 0x56, 0x45, 0x6C, 0x47, + 0x53, 0x55, 0x4E, 0x42, 0x56, 0x45, 0x55, 0x67, 0x51, 0x56, 0x56, 0x55, 0x53, 0x45, 0x39, 0x53, 0x53, 0x56, 0x52, 0x5A, 0x49, 0x45, 0x4E, 0x50, 0x4C, 0x69, 0x78, 0x4D, 0x56, 0x45, 0x51, 0x75, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x44, 0x0A, 0x44, 0x42, 0x5A, 0x48, 0x52, 0x45, 0x4E, 0x42, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x56, 0x56, 0x55, 0x53, 0x43, 0x42, 0x53, 0x4E, 0x53, 0x42, 0x53, 0x54, 0x30, 0x39, 0x55, 0x4D, 0x42, 0x34, + 0x58, 0x44, 0x54, 0x45, 0x30, 0x4D, 0x54, 0x45, 0x79, 0x4E, 0x6A, 0x41, 0x31, 0x4D, 0x54, 0x4D, 0x78, 0x4E, 0x56, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x45, 0x31, 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, + 0x77, 0x0A, 0x59, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4D, 0x6A, 0x41, 0x77, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x4B, 0x55, 0x64, 0x56, 0x51, 0x55, + 0x35, 0x48, 0x49, 0x45, 0x52, 0x50, 0x54, 0x6B, 0x63, 0x67, 0x51, 0x30, 0x56, 0x53, 0x56, 0x45, 0x6C, 0x47, 0x53, 0x55, 0x4E, 0x42, 0x56, 0x45, 0x55, 0x67, 0x51, 0x56, 0x56, 0x55, 0x53, 0x45, 0x39, 0x53, 0x53, 0x56, 0x52, 0x5A, 0x0A, 0x49, + 0x45, 0x4E, 0x50, 0x4C, 0x69, 0x78, 0x4D, 0x56, 0x45, 0x51, 0x75, 0x4D, 0x52, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x5A, 0x48, 0x52, 0x45, 0x4E, 0x42, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, + 0x56, 0x56, 0x55, 0x53, 0x43, 0x42, 0x53, 0x4E, 0x53, 0x42, 0x53, 0x54, 0x30, 0x39, 0x55, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x0A, 0x41, 0x51, 0x45, 0x46, + 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x32, 0x61, 0x4D, 0x57, 0x38, 0x4D, 0x68, 0x30, 0x64, 0x48, 0x65, 0x62, 0x37, 0x7A, 0x4D, 0x4E, 0x4F, 0x77, 0x5A, 0x2B, + 0x56, 0x66, 0x79, 0x31, 0x59, 0x49, 0x39, 0x32, 0x68, 0x68, 0x4A, 0x43, 0x66, 0x56, 0x5A, 0x6D, 0x50, 0x6F, 0x69, 0x43, 0x37, 0x58, 0x4A, 0x6A, 0x44, 0x70, 0x36, 0x4C, 0x33, 0x54, 0x51, 0x73, 0x0A, 0x41, 0x6C, 0x46, 0x52, 0x77, 0x78, 0x6E, + 0x39, 0x57, 0x56, 0x53, 0x45, 0x79, 0x66, 0x46, 0x72, 0x73, 0x30, 0x79, 0x77, 0x36, 0x65, 0x68, 0x47, 0x58, 0x54, 0x6A, 0x47, 0x6F, 0x71, 0x63, 0x75, 0x45, 0x56, 0x65, 0x36, 0x67, 0x68, 0x57, 0x69, 0x6E, 0x49, 0x39, 0x74, 0x73, 0x4A, 0x6C, + 0x4B, 0x43, 0x76, 0x4C, 0x72, 0x69, 0x58, 0x42, 0x6A, 0x54, 0x6E, 0x6E, 0x45, 0x74, 0x31, 0x75, 0x39, 0x6F, 0x6C, 0x32, 0x78, 0x38, 0x6B, 0x45, 0x43, 0x4B, 0x36, 0x32, 0x70, 0x0A, 0x4F, 0x71, 0x50, 0x73, 0x65, 0x51, 0x72, 0x73, 0x58, 0x7A, + 0x72, 0x6A, 0x2F, 0x65, 0x2B, 0x41, 0x50, 0x4B, 0x30, 0x30, 0x6D, 0x78, 0x71, 0x72, 0x69, 0x43, 0x5A, 0x37, 0x56, 0x71, 0x4B, 0x43, 0x68, 0x68, 0x2F, 0x72, 0x4E, 0x59, 0x6D, 0x44, 0x66, 0x31, 0x2B, 0x75, 0x4B, 0x55, 0x34, 0x39, 0x74, 0x6D, + 0x37, 0x73, 0x72, 0x73, 0x48, 0x77, 0x4A, 0x35, 0x75, 0x75, 0x34, 0x2F, 0x54, 0x73, 0x37, 0x36, 0x35, 0x2F, 0x39, 0x34, 0x59, 0x39, 0x63, 0x6E, 0x72, 0x72, 0x0A, 0x70, 0x66, 0x74, 0x5A, 0x54, 0x71, 0x66, 0x72, 0x6C, 0x59, 0x77, 0x69, 0x4F, + 0x58, 0x6E, 0x68, 0x4C, 0x51, 0x69, 0x50, 0x7A, 0x4C, 0x79, 0x52, 0x75, 0x45, 0x48, 0x33, 0x46, 0x4D, 0x45, 0x6A, 0x71, 0x63, 0x4F, 0x74, 0x6D, 0x6B, 0x56, 0x45, 0x73, 0x37, 0x4C, 0x58, 0x4C, 0x4D, 0x33, 0x47, 0x4B, 0x65, 0x4A, 0x51, 0x45, + 0x4B, 0x35, 0x63, 0x79, 0x34, 0x4B, 0x4F, 0x46, 0x78, 0x67, 0x32, 0x66, 0x5A, 0x66, 0x6D, 0x69, 0x4A, 0x71, 0x77, 0x54, 0x54, 0x51, 0x4A, 0x0A, 0x39, 0x43, 0x79, 0x35, 0x57, 0x6D, 0x59, 0x71, 0x73, 0x42, 0x65, 0x62, 0x6E, 0x68, 0x35, 0x32, + 0x6E, 0x55, 0x70, 0x6D, 0x4D, 0x55, 0x48, 0x66, 0x50, 0x2F, 0x76, 0x46, 0x42, 0x75, 0x38, 0x62, 0x74, 0x6E, 0x34, 0x61, 0x52, 0x6A, 0x62, 0x33, 0x5A, 0x47, 0x4D, 0x37, 0x34, 0x7A, 0x6B, 0x59, 0x49, 0x2B, 0x64, 0x6E, 0x64, 0x52, 0x54, 0x56, + 0x64, 0x56, 0x65, 0x53, 0x4E, 0x37, 0x32, 0x2B, 0x61, 0x68, 0x73, 0x6D, 0x55, 0x50, 0x49, 0x32, 0x4A, 0x67, 0x61, 0x51, 0x0A, 0x78, 0x58, 0x41, 0x42, 0x5A, 0x47, 0x31, 0x32, 0x5A, 0x75, 0x47, 0x52, 0x32, 0x32, 0x34, 0x48, 0x77, 0x47, 0x47, + 0x41, 0x4C, 0x72, 0x49, 0x75, 0x4C, 0x34, 0x78, 0x77, 0x70, 0x39, 0x45, 0x37, 0x50, 0x4C, 0x4F, 0x52, 0x35, 0x47, 0x36, 0x32, 0x78, 0x44, 0x74, 0x77, 0x38, 0x6D, 0x79, 0x53, 0x6C, 0x77, 0x6E, 0x4E, 0x52, 0x33, 0x30, 0x59, 0x77, 0x50, 0x4F, + 0x37, 0x6E, 0x67, 0x2F, 0x57, 0x69, 0x36, 0x34, 0x48, 0x74, 0x6C, 0x6F, 0x50, 0x7A, 0x67, 0x73, 0x4D, 0x0A, 0x52, 0x36, 0x66, 0x6C, 0x50, 0x72, 0x69, 0x39, 0x66, 0x63, 0x65, 0x62, 0x4E, 0x61, 0x42, 0x68, 0x6C, 0x7A, 0x70, 0x42, 0x64, 0x52, + 0x66, 0x4D, 0x4B, 0x35, 0x5A, 0x33, 0x4B, 0x70, 0x49, 0x68, 0x48, 0x74, 0x6D, 0x56, 0x64, 0x69, 0x42, 0x6E, 0x61, 0x4D, 0x38, 0x4E, 0x76, 0x64, 0x2F, 0x57, 0x48, 0x77, 0x6C, 0x71, 0x6D, 0x75, 0x4C, 0x4D, 0x63, 0x33, 0x47, 0x6B, 0x4C, 0x33, + 0x30, 0x53, 0x67, 0x4C, 0x64, 0x54, 0x4D, 0x45, 0x5A, 0x65, 0x53, 0x31, 0x53, 0x5A, 0x0A, 0x44, 0x32, 0x66, 0x4A, 0x70, 0x63, 0x6A, 0x79, 0x49, 0x4D, 0x47, 0x43, 0x37, 0x4A, 0x30, 0x52, 0x33, 0x38, 0x49, 0x43, 0x2B, 0x78, 0x6F, 0x37, 0x30, + 0x65, 0x30, 0x67, 0x6D, 0x75, 0x39, 0x6C, 0x5A, 0x4A, 0x49, 0x51, 0x44, 0x53, 0x72, 0x69, 0x33, 0x6E, 0x44, 0x78, 0x47, 0x47, 0x65, 0x43, 0x6A, 0x47, 0x48, 0x65, 0x75, 0x4C, 0x7A, 0x52, 0x4C, 0x35, 0x7A, 0x37, 0x44, 0x39, 0x41, 0x72, 0x37, + 0x52, 0x74, 0x32, 0x75, 0x65, 0x51, 0x35, 0x56, 0x66, 0x6A, 0x34, 0x0A, 0x6F, 0x52, 0x32, 0x34, 0x71, 0x6F, 0x41, 0x41, 0x54, 0x49, 0x4C, 0x6E, 0x73, 0x6E, 0x38, 0x4A, 0x75, 0x4C, 0x77, 0x77, 0x6F, 0x43, 0x38, 0x4E, 0x39, 0x56, 0x4B, 0x65, + 0x6A, 0x76, 0x65, 0x53, 0x73, 0x77, 0x6F, 0x41, 0x48, 0x51, 0x42, 0x55, 0x6C, 0x77, 0x62, 0x67, 0x73, 0x51, 0x66, 0x5A, 0x78, 0x77, 0x39, 0x63, 0x5A, 0x58, 0x30, 0x38, 0x62, 0x56, 0x6C, 0x58, 0x35, 0x4F, 0x32, 0x6C, 0x6A, 0x65, 0x6C, 0x41, + 0x55, 0x35, 0x38, 0x56, 0x53, 0x36, 0x42, 0x78, 0x0A, 0x39, 0x68, 0x6F, 0x68, 0x34, 0x39, 0x70, 0x77, 0x42, 0x69, 0x46, 0x59, 0x46, 0x49, 0x65, 0x46, 0x64, 0x33, 0x6D, 0x71, 0x67, 0x6E, 0x6B, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, + 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4F, 0x4C, 0x4A, 0x51, 0x4A, 0x39, 0x4E, 0x7A, 0x75, 0x69, 0x61, 0x6F, 0x58, 0x7A, 0x50, 0x44, 0x6A, 0x39, 0x6C, 0x78, 0x53, 0x6D, + 0x49, 0x61, 0x68, 0x6C, 0x52, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, + 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x44, 0x52, 0x53, 0x56, + 0x66, 0x67, 0x0A, 0x70, 0x38, 0x78, 0x6F, 0x57, 0x4C, 0x6F, 0x42, 0x44, 0x79, 0x73, 0x5A, 0x7A, 0x59, 0x32, 0x77, 0x59, 0x55, 0x57, 0x73, 0x45, 0x65, 0x31, 0x6A, 0x55, 0x47, 0x6E, 0x34, 0x48, 0x33, 0x2B, 0x2B, 0x46, 0x6F, 0x2F, 0x39, 0x6E, + 0x65, 0x73, 0x4C, 0x71, 0x6A, 0x4A, 0x48, 0x64, 0x74, 0x4A, 0x6E, 0x4A, 0x4F, 0x32, 0x39, 0x66, 0x44, 0x4D, 0x79, 0x6C, 0x79, 0x72, 0x48, 0x42, 0x59, 0x5A, 0x6D, 0x44, 0x52, 0x64, 0x39, 0x46, 0x42, 0x55, 0x62, 0x31, 0x4F, 0x76, 0x39, 0x0A, + 0x48, 0x35, 0x72, 0x32, 0x58, 0x70, 0x64, 0x70, 0x74, 0x78, 0x6F, 0x6C, 0x70, 0x41, 0x71, 0x7A, 0x6B, 0x54, 0x39, 0x66, 0x4E, 0x71, 0x79, 0x4C, 0x37, 0x46, 0x65, 0x6F, 0x50, 0x75, 0x65, 0x42, 0x69, 0x68, 0x68, 0x58, 0x4F, 0x59, 0x56, 0x30, + 0x47, 0x6B, 0x4C, 0x48, 0x36, 0x56, 0x73, 0x54, 0x58, 0x34, 0x2F, 0x35, 0x43, 0x4F, 0x6D, 0x53, 0x64, 0x49, 0x33, 0x31, 0x52, 0x39, 0x4B, 0x72, 0x4F, 0x39, 0x62, 0x37, 0x65, 0x47, 0x5A, 0x4F, 0x4E, 0x6E, 0x33, 0x35, 0x0A, 0x36, 0x5A, 0x4C, + 0x70, 0x42, 0x4E, 0x37, 0x39, 0x53, 0x57, 0x50, 0x38, 0x62, 0x66, 0x73, 0x55, 0x63, 0x5A, 0x4E, 0x6E, 0x4C, 0x30, 0x64, 0x4B, 0x74, 0x37, 0x6E, 0x2F, 0x48, 0x69, 0x70, 0x7A, 0x63, 0x45, 0x59, 0x77, 0x76, 0x31, 0x72, 0x79, 0x4C, 0x33, 0x6D, + 0x6C, 0x34, 0x59, 0x30, 0x4D, 0x32, 0x66, 0x6D, 0x79, 0x59, 0x7A, 0x65, 0x4D, 0x4E, 0x32, 0x57, 0x46, 0x63, 0x47, 0x70, 0x63, 0x57, 0x77, 0x6C, 0x79, 0x75, 0x61, 0x31, 0x6A, 0x50, 0x4C, 0x48, 0x64, 0x0A, 0x2B, 0x50, 0x77, 0x79, 0x76, 0x7A, + 0x65, 0x47, 0x35, 0x4C, 0x75, 0x4F, 0x6D, 0x43, 0x64, 0x2B, 0x75, 0x68, 0x38, 0x57, 0x34, 0x58, 0x41, 0x52, 0x38, 0x67, 0x50, 0x66, 0x4A, 0x57, 0x49, 0x79, 0x4A, 0x79, 0x59, 0x59, 0x4D, 0x6F, 0x53, 0x66, 0x2F, 0x77, 0x41, 0x36, 0x45, 0x37, + 0x71, 0x61, 0x54, 0x66, 0x52, 0x50, 0x75, 0x42, 0x52, 0x77, 0x49, 0x72, 0x48, 0x4B, 0x4B, 0x35, 0x44, 0x4F, 0x4B, 0x63, 0x46, 0x77, 0x39, 0x43, 0x2B, 0x64, 0x66, 0x2F, 0x4B, 0x51, 0x0A, 0x48, 0x74, 0x5A, 0x61, 0x33, 0x37, 0x64, 0x47, 0x2F, + 0x4F, 0x61, 0x47, 0x2B, 0x73, 0x76, 0x67, 0x49, 0x48, 0x5A, 0x36, 0x75, 0x71, 0x62, 0x4C, 0x39, 0x58, 0x7A, 0x65, 0x59, 0x71, 0x57, 0x78, 0x69, 0x2B, 0x37, 0x65, 0x67, 0x6D, 0x61, 0x4B, 0x54, 0x6A, 0x6F, 0x77, 0x48, 0x7A, 0x2B, 0x41, 0x79, + 0x36, 0x30, 0x6E, 0x75, 0x67, 0x78, 0x65, 0x31, 0x39, 0x43, 0x78, 0x56, 0x73, 0x70, 0x33, 0x63, 0x62, 0x4B, 0x31, 0x64, 0x61, 0x46, 0x51, 0x71, 0x55, 0x42, 0x44, 0x0A, 0x46, 0x38, 0x49, 0x6F, 0x32, 0x63, 0x39, 0x53, 0x69, 0x31, 0x76, 0x49, + 0x59, 0x39, 0x52, 0x43, 0x50, 0x71, 0x41, 0x7A, 0x65, 0x6B, 0x59, 0x75, 0x39, 0x77, 0x6F, 0x67, 0x52, 0x6C, 0x52, 0x2B, 0x61, 0x6B, 0x38, 0x78, 0x38, 0x59, 0x46, 0x2B, 0x51, 0x6E, 0x51, 0x34, 0x5A, 0x58, 0x4D, 0x6E, 0x37, 0x73, 0x5A, 0x38, + 0x75, 0x49, 0x37, 0x58, 0x70, 0x54, 0x72, 0x58, 0x6D, 0x4B, 0x47, 0x63, 0x6A, 0x42, 0x42, 0x56, 0x30, 0x39, 0x74, 0x4C, 0x37, 0x45, 0x43, 0x51, 0x0A, 0x38, 0x73, 0x31, 0x75, 0x56, 0x39, 0x4A, 0x69, 0x44, 0x6E, 0x78, 0x58, 0x6B, 0x37, 0x47, + 0x6E, 0x62, 0x63, 0x32, 0x64, 0x67, 0x37, 0x73, 0x71, 0x35, 0x2B, 0x57, 0x32, 0x4F, 0x33, 0x46, 0x59, 0x72, 0x66, 0x33, 0x52, 0x52, 0x62, 0x78, 0x61, 0x6B, 0x65, 0x35, 0x54, 0x46, 0x57, 0x2F, 0x54, 0x52, 0x51, 0x6C, 0x31, 0x62, 0x72, 0x71, + 0x51, 0x58, 0x52, 0x34, 0x45, 0x7A, 0x7A, 0x66, 0x66, 0x48, 0x71, 0x68, 0x6D, 0x73, 0x59, 0x7A, 0x6D, 0x49, 0x47, 0x72, 0x76, 0x0A, 0x2F, 0x45, 0x68, 0x4F, 0x64, 0x4A, 0x68, 0x43, 0x72, 0x79, 0x6C, 0x76, 0x4C, 0x6D, 0x72, 0x48, 0x2B, 0x33, + 0x33, 0x52, 0x5A, 0x6A, 0x45, 0x69, 0x7A, 0x49, 0x59, 0x41, 0x66, 0x6D, 0x61, 0x44, 0x44, 0x45, 0x4C, 0x30, 0x76, 0x54, 0x53, 0x53, 0x77, 0x78, 0x72, 0x71, 0x54, 0x38, 0x70, 0x2B, 0x63, 0x6B, 0x30, 0x4C, 0x63, 0x49, 0x79, 0x6D, 0x53, 0x4C, + 0x75, 0x6D, 0x6F, 0x52, 0x54, 0x32, 0x2B, 0x31, 0x68, 0x45, 0x6D, 0x52, 0x53, 0x75, 0x71, 0x67, 0x75, 0x54, 0x0A, 0x61, 0x61, 0x41, 0x70, 0x4A, 0x55, 0x71, 0x6C, 0x79, 0x79, 0x76, 0x64, 0x69, 0x6D, 0x59, 0x48, 0x46, 0x6E, 0x67, 0x56, 0x56, + 0x33, 0x45, 0x62, 0x37, 0x50, 0x56, 0x48, 0x68, 0x50, 0x4F, 0x65, 0x4D, 0x54, 0x64, 0x36, 0x31, 0x58, 0x38, 0x6B, 0x72, 0x65, 0x53, 0x38, 0x2F, 0x66, 0x33, 0x4D, 0x62, 0x6F, 0x50, 0x6F, 0x44, 0x4B, 0x69, 0x33, 0x51, 0x57, 0x77, 0x48, 0x33, + 0x62, 0x30, 0x38, 0x68, 0x70, 0x63, 0x76, 0x30, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, + 0x53, 0x4C, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x0A, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x33, 0x54, 0x43, 0x43, 0x41, 0x38, 0x57, + 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x65, 0x79, 0x79, 0x62, 0x30, 0x78, 0x61, 0x41, 0x4D, 0x70, 0x6B, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, + 0x77, 0x66, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x6A, 0x41, 0x4D, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x4D, 0x42, 0x56, 0x52, 0x6C, 0x65, 0x47, + 0x46, 0x7A, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, 0x64, 0x49, 0x62, 0x33, 0x56, 0x7A, 0x64, 0x47, 0x39, 0x75, 0x4D, 0x52, 0x67, 0x77, 0x46, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, + 0x39, 0x54, 0x55, 0x30, 0x77, 0x67, 0x51, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x0A, 0x4D, 0x54, 0x41, 0x76, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4B, 0x46, 0x4E, 0x54, 0x54, + 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, + 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x53, 0x55, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x0A, 0x4D, 0x6A, 0x45, 0x79, 0x4D, 0x54, 0x63, 0x7A, 0x4F, 0x54, 0x4D, 0x35, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x45, 0x77, + 0x4D, 0x6A, 0x45, 0x79, 0x4D, 0x54, 0x63, 0x7A, 0x4F, 0x54, 0x4D, 0x35, 0x57, 0x6A, 0x42, 0x38, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x4F, 0x4D, 0x41, 0x77, 0x47, + 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x46, 0x56, 0x47, 0x56, 0x34, 0x59, 0x58, 0x4D, 0x78, 0x0A, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x30, 0x68, 0x76, 0x64, 0x58, 0x4E, 0x30, 0x62, 0x32, 0x34, + 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x31, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6A, 0x45, 0x78, 0x4D, 0x43, 0x38, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x6F, 0x55, 0x31, 0x4E, 0x4D, 0x0A, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, + 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x46, 0x4A, 0x54, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, + 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x0A, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x50, 0x6B, 0x50, 0x33, 0x61, 0x4D, 0x72, 0x66, 0x63, 0x76, 0x51, 0x4B, + 0x76, 0x37, 0x73, 0x5A, 0x34, 0x57, 0x6D, 0x35, 0x79, 0x34, 0x62, 0x75, 0x6E, 0x66, 0x68, 0x34, 0x2F, 0x57, 0x76, 0x70, 0x4F, 0x7A, 0x36, 0x53, 0x6C, 0x32, 0x52, 0x78, 0x46, 0x64, 0x48, 0x61, 0x78, 0x68, 0x33, 0x61, 0x33, 0x62, 0x79, 0x2F, + 0x5A, 0x50, 0x6B, 0x50, 0x51, 0x2F, 0x43, 0x0A, 0x46, 0x70, 0x34, 0x4C, 0x5A, 0x73, 0x4E, 0x57, 0x6C, 0x4A, 0x34, 0x58, 0x67, 0x34, 0x58, 0x4F, 0x56, 0x75, 0x2F, 0x79, 0x46, 0x76, 0x30, 0x41, 0x59, 0x76, 0x55, 0x69, 0x43, 0x56, 0x54, 0x6F, + 0x5A, 0x52, 0x64, 0x4F, 0x51, 0x62, 0x6E, 0x67, 0x54, 0x30, 0x61, 0x58, 0x71, 0x68, 0x76, 0x49, 0x75, 0x47, 0x35, 0x69, 0x58, 0x6D, 0x6D, 0x78, 0x58, 0x39, 0x73, 0x71, 0x41, 0x6E, 0x37, 0x38, 0x62, 0x4D, 0x72, 0x7A, 0x51, 0x64, 0x6A, 0x74, + 0x30, 0x4F, 0x6A, 0x38, 0x0A, 0x50, 0x32, 0x46, 0x49, 0x37, 0x62, 0x41, 0x44, 0x46, 0x42, 0x30, 0x51, 0x44, 0x6B, 0x73, 0x5A, 0x34, 0x4C, 0x74, 0x4F, 0x37, 0x49, 0x5A, 0x6C, 0x2F, 0x7A, 0x62, 0x7A, 0x58, 0x6D, 0x63, 0x43, 0x43, 0x35, 0x32, + 0x47, 0x56, 0x57, 0x48, 0x39, 0x65, 0x6A, 0x6A, 0x74, 0x2F, 0x75, 0x49, 0x5A, 0x41, 0x4C, 0x64, 0x76, 0x6F, 0x56, 0x42, 0x69, 0x64, 0x58, 0x51, 0x38, 0x6F, 0x50, 0x72, 0x49, 0x4A, 0x5A, 0x4B, 0x30, 0x62, 0x6E, 0x6F, 0x69, 0x78, 0x2F, 0x67, + 0x65, 0x0A, 0x6F, 0x65, 0x4F, 0x79, 0x33, 0x5A, 0x45, 0x78, 0x71, 0x79, 0x73, 0x64, 0x42, 0x50, 0x2B, 0x6C, 0x53, 0x67, 0x51, 0x33, 0x36, 0x59, 0x57, 0x6B, 0x4D, 0x79, 0x76, 0x39, 0x34, 0x74, 0x5A, 0x56, 0x4E, 0x48, 0x77, 0x5A, 0x70, 0x45, + 0x70, 0x6F, 0x78, 0x37, 0x4B, 0x6F, 0x30, 0x37, 0x66, 0x4B, 0x6F, 0x5A, 0x4F, 0x49, 0x36, 0x38, 0x47, 0x58, 0x76, 0x49, 0x7A, 0x35, 0x48, 0x64, 0x6B, 0x69, 0x68, 0x43, 0x52, 0x30, 0x78, 0x77, 0x51, 0x39, 0x61, 0x71, 0x6B, 0x70, 0x0A, 0x6B, + 0x38, 0x7A, 0x72, 0x75, 0x46, 0x76, 0x68, 0x2F, 0x6C, 0x38, 0x6C, 0x71, 0x6A, 0x52, 0x59, 0x79, 0x4D, 0x45, 0x6A, 0x56, 0x4A, 0x30, 0x62, 0x6D, 0x42, 0x48, 0x44, 0x4F, 0x4A, 0x78, 0x2B, 0x50, 0x59, 0x5A, 0x73, 0x70, 0x51, 0x39, 0x41, 0x68, + 0x6E, 0x77, 0x43, 0x39, 0x46, 0x77, 0x43, 0x54, 0x79, 0x6A, 0x4C, 0x72, 0x6E, 0x47, 0x66, 0x44, 0x7A, 0x72, 0x49, 0x4D, 0x2F, 0x34, 0x52, 0x4A, 0x54, 0x58, 0x71, 0x2F, 0x4C, 0x72, 0x46, 0x59, 0x44, 0x33, 0x5A, 0x0A, 0x66, 0x42, 0x6A, 0x56, + 0x73, 0x71, 0x6E, 0x54, 0x64, 0x58, 0x67, 0x44, 0x63, 0x69, 0x4C, 0x4B, 0x4F, 0x73, 0x4D, 0x66, 0x37, 0x79, 0x7A, 0x6C, 0x4C, 0x71, 0x6E, 0x36, 0x6E, 0x69, 0x79, 0x32, 0x55, 0x55, 0x62, 0x39, 0x72, 0x77, 0x50, 0x57, 0x36, 0x6D, 0x42, 0x6F, + 0x36, 0x6F, 0x55, 0x57, 0x4E, 0x6D, 0x75, 0x46, 0x36, 0x52, 0x37, 0x41, 0x73, 0x39, 0x33, 0x45, 0x4A, 0x4E, 0x79, 0x41, 0x4B, 0x6F, 0x46, 0x42, 0x62, 0x5A, 0x51, 0x2B, 0x79, 0x4F, 0x44, 0x4A, 0x0A, 0x67, 0x55, 0x45, 0x41, 0x6E, 0x6C, 0x36, + 0x2F, 0x66, 0x38, 0x55, 0x49, 0x6D, 0x4B, 0x49, 0x59, 0x4C, 0x45, 0x4A, 0x41, 0x73, 0x2F, 0x6C, 0x76, 0x4F, 0x43, 0x64, 0x4C, 0x54, 0x6F, 0x44, 0x30, 0x50, 0x59, 0x46, 0x48, 0x34, 0x49, 0x68, 0x38, 0x36, 0x68, 0x7A, 0x4F, 0x74, 0x58, 0x56, + 0x63, 0x55, 0x53, 0x34, 0x63, 0x4B, 0x33, 0x38, 0x61, 0x63, 0x69, 0x6A, 0x6E, 0x41, 0x4C, 0x58, 0x52, 0x64, 0x4D, 0x62, 0x58, 0x35, 0x4A, 0x2B, 0x74, 0x42, 0x35, 0x4F, 0x32, 0x0A, 0x55, 0x7A, 0x55, 0x31, 0x2F, 0x44, 0x66, 0x6B, 0x77, 0x2F, + 0x5A, 0x64, 0x46, 0x72, 0x34, 0x68, 0x63, 0x39, 0x36, 0x53, 0x43, 0x76, 0x69, 0x67, 0x59, 0x32, 0x71, 0x38, 0x6C, 0x70, 0x4A, 0x71, 0x50, 0x76, 0x69, 0x38, 0x5A, 0x56, 0x57, 0x62, 0x33, 0x76, 0x55, 0x4E, 0x69, 0x53, 0x59, 0x45, 0x2F, 0x43, + 0x55, 0x61, 0x70, 0x69, 0x56, 0x70, 0x79, 0x38, 0x4A, 0x74, 0x79, 0x6E, 0x7A, 0x69, 0x57, 0x56, 0x2B, 0x58, 0x72, 0x4F, 0x76, 0x76, 0x4C, 0x73, 0x69, 0x38, 0x0A, 0x31, 0x78, 0x74, 0x5A, 0x50, 0x43, 0x76, 0x4D, 0x38, 0x68, 0x6E, 0x49, 0x6B, + 0x32, 0x73, 0x6E, 0x59, 0x78, 0x6E, 0x50, 0x2F, 0x4F, 0x6B, 0x6D, 0x2B, 0x4D, 0x70, 0x78, 0x6D, 0x33, 0x2B, 0x54, 0x2F, 0x6A, 0x52, 0x6E, 0x68, 0x45, 0x36, 0x5A, 0x36, 0x2F, 0x79, 0x7A, 0x65, 0x41, 0x6B, 0x7A, 0x63, 0x4C, 0x70, 0x6D, 0x70, + 0x6E, 0x62, 0x74, 0x47, 0x33, 0x50, 0x72, 0x47, 0x71, 0x55, 0x4E, 0x78, 0x43, 0x49, 0x54, 0x49, 0x4A, 0x52, 0x57, 0x43, 0x6B, 0x34, 0x73, 0x0A, 0x62, 0x45, 0x36, 0x78, 0x2F, 0x63, 0x2B, 0x63, 0x43, 0x62, 0x71, 0x69, 0x4D, 0x2B, 0x32, 0x48, + 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x64, 0x42, 0x41, 0x6B, 0x48, 0x6F, 0x76, 0x56, 0x36, 0x66, 0x56, 0x4A, 0x54, + 0x45, 0x70, 0x4B, 0x56, 0x37, 0x6A, 0x69, 0x41, 0x4A, 0x51, 0x32, 0x6D, 0x57, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x38, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4E, 0x30, 0x45, 0x43, 0x51, 0x65, 0x69, 0x39, 0x58, 0x70, 0x39, 0x55, 0x6C, 0x4D, 0x53, 0x6B, 0x70, 0x58, 0x75, 0x4F, 0x49, 0x41, 0x6C, 0x44, 0x61, 0x5A, + 0x5A, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x0A, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, + 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x49, 0x42, 0x67, 0x52, 0x6C, 0x43, 0x6E, 0x37, 0x4A, 0x70, 0x30, 0x63, 0x48, 0x68, 0x35, 0x77, 0x59, 0x66, 0x47, 0x56, 0x63, 0x70, 0x4E, 0x78, 0x4A, 0x4B, 0x31, 0x6F, 0x6B, 0x31, + 0x69, 0x4F, 0x4D, 0x71, 0x38, 0x62, 0x73, 0x33, 0x41, 0x44, 0x2F, 0x43, 0x55, 0x72, 0x0A, 0x64, 0x49, 0x57, 0x51, 0x50, 0x58, 0x68, 0x71, 0x39, 0x4C, 0x6D, 0x4C, 0x70, 0x5A, 0x63, 0x37, 0x74, 0x52, 0x69, 0x52, 0x75, 0x78, 0x36, 0x6E, 0x2B, + 0x55, 0x42, 0x62, 0x6B, 0x66, 0x6C, 0x56, 0x6D, 0x61, 0x38, 0x65, 0x45, 0x64, 0x42, 0x63, 0x48, 0x61, 0x64, 0x6D, 0x34, 0x37, 0x47, 0x55, 0x42, 0x77, 0x77, 0x79, 0x4F, 0x61, 0x62, 0x71, 0x47, 0x37, 0x42, 0x35, 0x32, 0x42, 0x32, 0x63, 0x63, + 0x45, 0x54, 0x6A, 0x69, 0x74, 0x33, 0x45, 0x2B, 0x5A, 0x55, 0x66, 0x0A, 0x69, 0x6A, 0x68, 0x44, 0x50, 0x77, 0x47, 0x46, 0x70, 0x55, 0x65, 0x6E, 0x50, 0x55, 0x61, 0x79, 0x76, 0x4F, 0x55, 0x69, 0x61, 0x50, 0x64, 0x37, 0x6E, 0x4E, 0x67, 0x73, + 0x50, 0x67, 0x6F, 0x68, 0x79, 0x43, 0x30, 0x7A, 0x72, 0x4C, 0x2F, 0x46, 0x67, 0x5A, 0x6B, 0x78, 0x64, 0x4D, 0x46, 0x31, 0x63, 0x63, 0x57, 0x2B, 0x73, 0x66, 0x41, 0x6A, 0x52, 0x66, 0x53, 0x64, 0x61, 0x2F, 0x77, 0x5A, 0x59, 0x35, 0x32, 0x6A, + 0x76, 0x41, 0x54, 0x47, 0x47, 0x41, 0x73, 0x6C, 0x0A, 0x75, 0x31, 0x4F, 0x4A, 0x44, 0x37, 0x4F, 0x41, 0x55, 0x4E, 0x35, 0x46, 0x37, 0x6B, 0x52, 0x2F, 0x71, 0x35, 0x52, 0x34, 0x5A, 0x4A, 0x6A, 0x54, 0x39, 0x69, 0x6A, 0x64, 0x68, 0x39, 0x68, + 0x77, 0x5A, 0x58, 0x54, 0x37, 0x44, 0x72, 0x6B, 0x54, 0x36, 0x36, 0x63, 0x50, 0x59, 0x61, 0x6B, 0x79, 0x6C, 0x73, 0x7A, 0x65, 0x75, 0x2B, 0x31, 0x6A, 0x54, 0x42, 0x69, 0x37, 0x71, 0x55, 0x44, 0x33, 0x6F, 0x46, 0x52, 0x75, 0x49, 0x49, 0x68, + 0x78, 0x64, 0x52, 0x6A, 0x71, 0x0A, 0x65, 0x72, 0x51, 0x30, 0x63, 0x75, 0x41, 0x6A, 0x4A, 0x33, 0x64, 0x63, 0x74, 0x70, 0x44, 0x71, 0x68, 0x69, 0x56, 0x41, 0x71, 0x2B, 0x38, 0x7A, 0x44, 0x38, 0x75, 0x66, 0x67, 0x72, 0x36, 0x69, 0x49, 0x50, + 0x76, 0x32, 0x74, 0x53, 0x30, 0x61, 0x35, 0x73, 0x4B, 0x46, 0x73, 0x58, 0x51, 0x50, 0x2B, 0x38, 0x68, 0x6C, 0x41, 0x71, 0x52, 0x53, 0x41, 0x55, 0x66, 0x64, 0x53, 0x53, 0x4C, 0x42, 0x76, 0x39, 0x6A, 0x72, 0x61, 0x36, 0x78, 0x2B, 0x33, 0x75, + 0x78, 0x6A, 0x0A, 0x4D, 0x78, 0x57, 0x33, 0x49, 0x77, 0x69, 0x50, 0x78, 0x67, 0x2B, 0x4E, 0x51, 0x56, 0x72, 0x64, 0x6A, 0x73, 0x57, 0x35, 0x6A, 0x2B, 0x56, 0x46, 0x50, 0x33, 0x6A, 0x62, 0x75, 0x74, 0x49, 0x62, 0x51, 0x4C, 0x48, 0x2B, 0x63, + 0x55, 0x30, 0x2F, 0x34, 0x49, 0x47, 0x69, 0x75, 0x6C, 0x36, 0x30, 0x37, 0x42, 0x58, 0x67, 0x6B, 0x39, 0x30, 0x49, 0x48, 0x33, 0x37, 0x68, 0x56, 0x5A, 0x6B, 0x4C, 0x49, 0x64, 0x36, 0x54, 0x6E, 0x67, 0x72, 0x37, 0x35, 0x71, 0x4E, 0x4A, 0x0A, + 0x76, 0x54, 0x59, 0x77, 0x2F, 0x75, 0x64, 0x33, 0x73, 0x71, 0x42, 0x31, 0x6C, 0x37, 0x55, 0x74, 0x67, 0x59, 0x67, 0x58, 0x5A, 0x53, 0x44, 0x33, 0x32, 0x70, 0x41, 0x41, 0x6E, 0x38, 0x6C, 0x53, 0x7A, 0x44, 0x4C, 0x4B, 0x4E, 0x58, 0x7A, 0x31, + 0x50, 0x51, 0x2F, 0x59, 0x4B, 0x39, 0x66, 0x31, 0x4A, 0x6D, 0x7A, 0x4A, 0x42, 0x6A, 0x53, 0x57, 0x46, 0x75, 0x70, 0x77, 0x57, 0x52, 0x6F, 0x79, 0x65, 0x58, 0x6B, 0x4C, 0x74, 0x6F, 0x68, 0x2F, 0x44, 0x31, 0x4A, 0x49, 0x0A, 0x50, 0x62, 0x39, + 0x73, 0x32, 0x4B, 0x4A, 0x45, 0x4C, 0x74, 0x46, 0x4F, 0x74, 0x33, 0x4A, 0x59, 0x30, 0x34, 0x6B, 0x54, 0x6C, 0x66, 0x35, 0x45, 0x71, 0x2F, 0x6A, 0x58, 0x69, 0x78, 0x74, 0x75, 0x6E, 0x4C, 0x77, 0x73, 0x6F, 0x46, 0x76, 0x56, 0x61, 0x67, 0x43, + 0x76, 0x58, 0x7A, 0x66, 0x68, 0x31, 0x66, 0x6F, 0x51, 0x43, 0x35, 0x69, 0x63, 0x68, 0x75, 0x63, 0x6D, 0x6A, 0x38, 0x37, 0x77, 0x37, 0x47, 0x36, 0x4B, 0x56, 0x77, 0x75, 0x41, 0x34, 0x30, 0x36, 0x79, 0x0A, 0x77, 0x4B, 0x42, 0x6A, 0x59, 0x5A, + 0x43, 0x36, 0x56, 0x57, 0x67, 0x33, 0x64, 0x47, 0x71, 0x32, 0x6B, 0x74, 0x75, 0x66, 0x6F, 0x59, 0x59, 0x69, 0x74, 0x6D, 0x55, 0x6E, 0x44, 0x75, 0x79, 0x32, 0x6E, 0x30, 0x4A, 0x67, 0x35, 0x47, 0x66, 0x43, 0x74, 0x64, 0x70, 0x42, 0x43, 0x38, + 0x54, 0x54, 0x69, 0x32, 0x45, 0x62, 0x76, 0x50, 0x6F, 0x66, 0x6B, 0x53, 0x76, 0x58, 0x52, 0x41, 0x64, 0x65, 0x75, 0x69, 0x6D, 0x73, 0x32, 0x63, 0x58, 0x70, 0x37, 0x31, 0x4E, 0x49, 0x0A, 0x57, 0x75, 0x75, 0x41, 0x38, 0x53, 0x68, 0x59, 0x49, + 0x63, 0x32, 0x77, 0x42, 0x6C, 0x58, 0x37, 0x4A, 0x7A, 0x39, 0x54, 0x6B, 0x48, 0x43, 0x70, 0x42, 0x42, 0x35, 0x58, 0x4A, 0x37, 0x6B, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x53, 0x4C, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, + 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x45, 0x43, 0x43, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x6A, 0x54, 0x43, 0x43, 0x41, 0x68, 0x53, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x64, 0x65, 0x62, 0x66, 0x79, 0x38, 0x46, 0x6F, 0x57, 0x36, 0x67, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, + 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x49, 0x77, 0x66, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x6A, 0x41, 0x4D, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, + 0x67, 0x4D, 0x42, 0x56, 0x52, 0x6C, 0x65, 0x47, 0x46, 0x7A, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, 0x64, 0x49, 0x62, 0x33, 0x56, 0x7A, 0x64, 0x47, 0x39, 0x75, 0x4D, 0x52, 0x67, 0x77, 0x46, 0x67, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x39, 0x54, 0x55, 0x30, 0x77, 0x67, 0x51, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x4D, 0x54, 0x41, 0x76, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x4D, 0x4D, 0x4B, 0x46, 0x4E, 0x54, 0x54, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, + 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x4D, 0x6A, 0x45, 0x79, 0x0A, 0x4D, 0x54, 0x67, 0x78, 0x4E, 0x44, 0x41, 0x7A, + 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x45, 0x77, 0x4D, 0x6A, 0x45, 0x79, 0x4D, 0x54, 0x67, 0x78, 0x4E, 0x44, 0x41, 0x7A, 0x57, 0x6A, 0x42, 0x38, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, + 0x55, 0x7A, 0x45, 0x4F, 0x4D, 0x41, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x46, 0x56, 0x47, 0x56, 0x34, 0x59, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x30, 0x68, + 0x76, 0x64, 0x58, 0x4E, 0x30, 0x62, 0x32, 0x34, 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x31, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x6C, + 0x76, 0x62, 0x6A, 0x45, 0x78, 0x4D, 0x43, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x6F, 0x55, 0x31, 0x4E, 0x4D, 0x4C, 0x6D, 0x4E, 0x76, 0x0A, 0x62, 0x53, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x6C, 0x63, 0x6E, + 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x45, 0x56, 0x44, 0x51, 0x7A, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, + 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x0A, 0x42, 0x45, 0x56, 0x75, 0x71, 0x56, 0x44, 0x45, 0x70, 0x69, 0x4D, 0x32, 0x6E, 0x6C, 0x38, 0x6F, 0x6A, + 0x52, 0x66, 0x4C, 0x6C, 0x69, 0x4A, 0x6B, 0x50, 0x39, 0x78, 0x36, 0x6A, 0x68, 0x33, 0x4D, 0x43, 0x4C, 0x4F, 0x69, 0x63, 0x53, 0x53, 0x36, 0x6A, 0x6B, 0x6D, 0x35, 0x42, 0x42, 0x74, 0x48, 0x6C, 0x6C, 0x69, 0x72, 0x4C, 0x5A, 0x58, 0x49, 0x37, + 0x5A, 0x34, 0x49, 0x4E, 0x63, 0x67, 0x6E, 0x36, 0x34, 0x6D, 0x4D, 0x55, 0x31, 0x6A, 0x72, 0x59, 0x6F, 0x72, 0x2B, 0x0A, 0x38, 0x46, 0x73, 0x50, 0x61, 0x7A, 0x46, 0x53, 0x59, 0x30, 0x45, 0x37, 0x69, 0x63, 0x33, 0x73, 0x37, 0x4C, 0x61, 0x4E, + 0x47, 0x64, 0x4D, 0x30, 0x42, 0x39, 0x79, 0x37, 0x78, 0x67, 0x5A, 0x2F, 0x77, 0x6B, 0x57, 0x56, 0x37, 0x4D, 0x74, 0x2F, 0x71, 0x43, 0x50, 0x67, 0x43, 0x65, 0x6D, 0x42, 0x2B, 0x76, 0x4E, 0x48, 0x30, 0x36, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, + 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x49, 0x4C, 0x52, 0x0A, 0x68, 0x58, 0x4D, 0x77, 0x35, 0x7A, 0x55, 0x45, 0x30, 0x34, 0x34, 0x43, 0x6B, 0x76, 0x76, 0x6C, 0x70, 0x4E, 0x48, 0x45, 0x49, 0x65, 0x6A, + 0x4E, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, + 0x55, 0x67, 0x74, 0x47, 0x46, 0x63, 0x7A, 0x44, 0x6E, 0x4E, 0x51, 0x54, 0x54, 0x0A, 0x6A, 0x67, 0x4B, 0x53, 0x2B, 0x2B, 0x57, 0x6B, 0x30, 0x63, 0x51, 0x68, 0x36, 0x4D, 0x30, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, + 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x32, 0x63, 0x41, 0x4D, 0x47, 0x51, 0x43, 0x4D, 0x47, 0x2F, 0x6E, 0x36, 0x31, + 0x6B, 0x52, 0x70, 0x47, 0x44, 0x50, 0x59, 0x62, 0x43, 0x57, 0x0A, 0x65, 0x2B, 0x30, 0x46, 0x2B, 0x53, 0x38, 0x54, 0x6B, 0x64, 0x7A, 0x74, 0x35, 0x66, 0x78, 0x51, 0x61, 0x78, 0x46, 0x47, 0x52, 0x72, 0x4D, 0x63, 0x49, 0x51, 0x42, 0x69, 0x75, + 0x37, 0x37, 0x44, 0x35, 0x2B, 0x6A, 0x4E, 0x42, 0x35, 0x6E, 0x35, 0x44, 0x51, 0x74, 0x64, 0x63, 0x6A, 0x37, 0x45, 0x71, 0x67, 0x49, 0x77, 0x48, 0x37, 0x79, 0x36, 0x43, 0x2B, 0x49, 0x77, 0x4A, 0x50, 0x74, 0x38, 0x62, 0x59, 0x42, 0x56, 0x43, + 0x70, 0x6B, 0x2B, 0x67, 0x41, 0x30, 0x7A, 0x0A, 0x35, 0x57, 0x61, 0x6A, 0x73, 0x36, 0x4F, 0x37, 0x70, 0x64, 0x57, 0x4C, 0x6A, 0x77, 0x6B, 0x73, 0x70, 0x6C, 0x31, 0x2B, 0x34, 0x76, 0x41, 0x48, 0x43, 0x47, 0x68, 0x74, 0x30, 0x6E, 0x78, 0x70, + 0x62, 0x6C, 0x2F, 0x66, 0x35, 0x57, 0x70, 0x6C, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x53, 0x4C, 0x2E, + 0x63, 0x6F, 0x6D, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x53, 0x41, 0x20, + 0x52, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, + 0x49, 0x46, 0x36, 0x7A, 0x43, 0x43, 0x41, 0x39, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x56, 0x72, 0x59, 0x70, 0x7A, 0x54, 0x53, 0x38, 0x65, 0x50, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, + 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x67, 0x59, 0x49, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x51, 0x34, 0x77, 0x0A, 0x44, 0x41, 0x59, 0x44, 0x56, + 0x51, 0x51, 0x49, 0x44, 0x41, 0x56, 0x55, 0x5A, 0x58, 0x68, 0x68, 0x63, 0x7A, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x77, 0x77, 0x48, 0x53, 0x47, 0x39, 0x31, 0x63, 0x33, 0x52, 0x76, 0x62, 0x6A, 0x45, 0x59, 0x4D, + 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x50, 0x55, 0x31, 0x4E, 0x4D, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x4D, 0x54, 0x63, 0x77, 0x4E, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x35, 0x54, 0x55, 0x30, 0x77, 0x75, 0x59, 0x32, 0x39, 0x74, 0x49, 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, + 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x49, 0x79, 0x0A, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x33, 0x4D, 0x44, 0x55, + 0x7A, 0x4D, 0x54, 0x45, 0x34, 0x4D, 0x54, 0x51, 0x7A, 0x4E, 0x31, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x79, 0x4D, 0x44, 0x55, 0x7A, 0x4D, 0x44, 0x45, 0x34, 0x4D, 0x54, 0x51, 0x7A, 0x4E, 0x31, 0x6F, 0x77, 0x67, 0x59, 0x49, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x51, 0x34, 0x77, 0x44, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x0A, 0x44, 0x41, 0x56, 0x55, 0x5A, 0x58, 0x68, 0x68, 0x63, 0x7A, 0x45, 0x51, 0x4D, 0x41, + 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x77, 0x77, 0x48, 0x53, 0x47, 0x39, 0x31, 0x63, 0x33, 0x52, 0x76, 0x62, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x50, 0x55, 0x31, 0x4E, 0x4D, 0x49, 0x45, + 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x54, 0x63, 0x77, 0x4E, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x35, 0x54, 0x55, 0x30, 0x77, 0x75, 0x59, 0x32, 0x39, 0x74, 0x49, + 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, + 0x48, 0x6B, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x49, 0x79, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x0A, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, + 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x6A, 0x7A, 0x5A, 0x6C, 0x51, 0x4F, 0x48, 0x57, 0x54, 0x63, 0x44, 0x58, 0x74, 0x4F, 0x6C, 0x47, 0x32, 0x6D, 0x76, 0x71, 0x4D, 0x30, 0x66, 0x4E, + 0x54, 0x50, 0x6C, 0x39, 0x66, 0x62, 0x36, 0x39, 0x4C, 0x54, 0x33, 0x77, 0x32, 0x33, 0x6A, 0x68, 0x0A, 0x68, 0x71, 0x58, 0x5A, 0x75, 0x67, 0x6C, 0x58, 0x61, 0x4F, 0x31, 0x58, 0x50, 0x71, 0x44, 0x51, 0x43, 0x45, 0x47, 0x44, 0x35, 0x79, 0x68, + 0x42, 0x4A, 0x42, 0x2F, 0x6A, 0x63, 0x68, 0x58, 0x51, 0x41, 0x52, 0x72, 0x37, 0x58, 0x6E, 0x41, 0x6A, 0x73, 0x73, 0x75, 0x66, 0x4F, 0x65, 0x50, 0x50, 0x78, 0x55, 0x37, 0x47, 0x6B, 0x6D, 0x30, 0x6D, 0x78, 0x6E, 0x75, 0x37, 0x73, 0x39, 0x6F, + 0x6E, 0x6E, 0x51, 0x71, 0x47, 0x36, 0x59, 0x45, 0x33, 0x42, 0x66, 0x37, 0x77, 0x0A, 0x63, 0x58, 0x48, 0x73, 0x77, 0x78, 0x7A, 0x70, 0x59, 0x36, 0x49, 0x58, 0x46, 0x4A, 0x33, 0x76, 0x47, 0x32, 0x66, 0x54, 0x68, 0x56, 0x55, 0x43, 0x41, 0x74, + 0x5A, 0x4A, 0x79, 0x63, 0x78, 0x61, 0x34, 0x62, 0x48, 0x33, 0x62, 0x7A, 0x4B, 0x66, 0x79, 0x64, 0x51, 0x37, 0x69, 0x45, 0x47, 0x6F, 0x6E, 0x4C, 0x33, 0x4C, 0x71, 0x39, 0x74, 0x74, 0x65, 0x77, 0x6B, 0x66, 0x6F, 0x6B, 0x78, 0x79, 0x6B, 0x4E, + 0x6F, 0x72, 0x43, 0x50, 0x7A, 0x50, 0x50, 0x46, 0x54, 0x4F, 0x0A, 0x5A, 0x77, 0x2B, 0x6F, 0x7A, 0x31, 0x32, 0x57, 0x47, 0x51, 0x76, 0x45, 0x34, 0x33, 0x4C, 0x72, 0x72, 0x64, 0x46, 0x39, 0x48, 0x53, 0x66, 0x76, 0x6B, 0x75, 0x73, 0x51, 0x76, + 0x31, 0x76, 0x72, 0x4F, 0x36, 0x2F, 0x50, 0x67, 0x4E, 0x33, 0x42, 0x30, 0x70, 0x59, 0x45, 0x57, 0x33, 0x70, 0x2B, 0x70, 0x4B, 0x6B, 0x38, 0x4F, 0x48, 0x61, 0x6B, 0x59, 0x6F, 0x36, 0x67, 0x4F, 0x56, 0x37, 0x71, 0x64, 0x38, 0x39, 0x64, 0x41, + 0x46, 0x6D, 0x50, 0x5A, 0x69, 0x77, 0x2B, 0x0A, 0x42, 0x36, 0x4B, 0x6A, 0x42, 0x53, 0x59, 0x52, 0x61, 0x5A, 0x66, 0x71, 0x68, 0x62, 0x63, 0x50, 0x6C, 0x67, 0x74, 0x4C, 0x79, 0x45, 0x44, 0x68, 0x55, 0x4C, 0x6F, 0x75, 0x69, 0x73, 0x76, 0x33, + 0x44, 0x35, 0x6F, 0x69, 0x35, 0x33, 0x2B, 0x61, 0x4E, 0x78, 0x50, 0x4E, 0x38, 0x6B, 0x30, 0x54, 0x61, 0x79, 0x48, 0x52, 0x77, 0x4D, 0x77, 0x69, 0x38, 0x71, 0x46, 0x47, 0x39, 0x6B, 0x52, 0x70, 0x6E, 0x4D, 0x70, 0x68, 0x4E, 0x51, 0x63, 0x41, + 0x62, 0x39, 0x5A, 0x68, 0x0A, 0x43, 0x42, 0x48, 0x71, 0x75, 0x72, 0x6A, 0x32, 0x36, 0x62, 0x4E, 0x67, 0x35, 0x55, 0x32, 0x35, 0x37, 0x4A, 0x38, 0x55, 0x5A, 0x73, 0x6C, 0x58, 0x57, 0x4E, 0x76, 0x4E, 0x68, 0x32, 0x6E, 0x34, 0x69, 0x6F, 0x59, + 0x53, 0x41, 0x30, 0x65, 0x2F, 0x5A, 0x68, 0x4E, 0x32, 0x72, 0x48, 0x64, 0x39, 0x4E, 0x43, 0x53, 0x46, 0x67, 0x38, 0x33, 0x58, 0x71, 0x70, 0x79, 0x51, 0x47, 0x70, 0x38, 0x68, 0x4C, 0x48, 0x39, 0x34, 0x74, 0x32, 0x53, 0x34, 0x32, 0x4F, 0x69, + 0x6D, 0x0A, 0x39, 0x48, 0x69, 0x7A, 0x56, 0x63, 0x75, 0x45, 0x30, 0x6A, 0x4C, 0x45, 0x65, 0x4B, 0x36, 0x6A, 0x6A, 0x32, 0x48, 0x64, 0x7A, 0x67, 0x68, 0x54, 0x72, 0x65, 0x79, 0x49, 0x2F, 0x42, 0x58, 0x6B, 0x6D, 0x67, 0x33, 0x6D, 0x6E, 0x78, + 0x70, 0x33, 0x7A, 0x6B, 0x79, 0x50, 0x75, 0x42, 0x51, 0x56, 0x50, 0x57, 0x4B, 0x63, 0x68, 0x6A, 0x67, 0x47, 0x41, 0x47, 0x59, 0x53, 0x35, 0x46, 0x6C, 0x32, 0x57, 0x6C, 0x50, 0x41, 0x41, 0x70, 0x69, 0x69, 0x45, 0x43, 0x74, 0x6F, 0x0A, 0x52, + 0x48, 0x75, 0x4F, 0x65, 0x63, 0x34, 0x7A, 0x53, 0x6E, 0x61, 0x71, 0x57, 0x34, 0x45, 0x57, 0x47, 0x37, 0x57, 0x4B, 0x32, 0x4E, 0x41, 0x41, 0x65, 0x31, 0x35, 0x69, 0x74, 0x41, 0x6E, 0x57, 0x68, 0x6D, 0x4D, 0x4F, 0x70, 0x67, 0x57, 0x56, 0x53, + 0x62, 0x6F, 0x6F, 0x69, 0x34, 0x69, 0x54, 0x73, 0x6A, 0x51, 0x63, 0x32, 0x4B, 0x52, 0x56, 0x62, 0x72, 0x63, 0x63, 0x30, 0x4E, 0x36, 0x5A, 0x56, 0x54, 0x73, 0x6A, 0x39, 0x43, 0x4C, 0x67, 0x2B, 0x53, 0x6C, 0x6D, 0x0A, 0x4A, 0x75, 0x77, 0x67, + 0x55, 0x48, 0x66, 0x62, 0x53, 0x67, 0x75, 0x50, 0x76, 0x75, 0x55, 0x43, 0x59, 0x48, 0x42, 0x42, 0x58, 0x74, 0x53, 0x75, 0x55, 0x44, 0x6B, 0x69, 0x46, 0x43, 0x62, 0x4C, 0x73, 0x6A, 0x74, 0x7A, 0x64, 0x46, 0x56, 0x48, 0x42, 0x33, 0x6D, 0x42, + 0x4F, 0x61, 0x67, 0x77, 0x45, 0x30, 0x54, 0x6C, 0x42, 0x49, 0x71, 0x75, 0x6C, 0x68, 0x4D, 0x6C, 0x51, 0x67, 0x2B, 0x35, 0x55, 0x38, 0x53, 0x62, 0x2F, 0x4D, 0x33, 0x6B, 0x48, 0x4E, 0x34, 0x38, 0x0A, 0x2B, 0x71, 0x76, 0x57, 0x42, 0x6B, 0x6F, + 0x66, 0x5A, 0x36, 0x61, 0x59, 0x4D, 0x42, 0x7A, 0x64, 0x4C, 0x4E, 0x76, 0x63, 0x47, 0x4A, 0x56, 0x58, 0x5A, 0x73, 0x62, 0x2F, 0x58, 0x49, 0x74, 0x57, 0x39, 0x58, 0x63, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x6A, 0x4D, 0x47, 0x45, + 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, + 0x54, 0x35, 0x59, 0x4C, 0x76, 0x55, 0x34, 0x39, 0x55, 0x30, 0x39, 0x72, 0x6A, 0x31, 0x42, 0x6F, 0x41, 0x6C, 0x70, 0x33, 0x50, 0x62, 0x52, 0x6D, 0x6D, 0x6F, 0x6E, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, + 0x51, 0x55, 0x2B, 0x57, 0x43, 0x37, 0x31, 0x4F, 0x50, 0x56, 0x4E, 0x50, 0x61, 0x34, 0x39, 0x51, 0x61, 0x41, 0x4A, 0x61, 0x64, 0x7A, 0x32, 0x30, 0x5A, 0x70, 0x0A, 0x71, 0x4A, 0x34, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, + 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x42, 0x57, 0x73, + 0x34, 0x37, 0x4C, 0x43, 0x70, 0x31, 0x4A, 0x6A, 0x72, 0x2B, 0x6B, 0x78, 0x4A, 0x47, 0x37, 0x5A, 0x68, 0x63, 0x46, 0x55, 0x5A, 0x68, 0x31, 0x0A, 0x2B, 0x2B, 0x56, 0x51, 0x4C, 0x48, 0x71, 0x65, 0x38, 0x52, 0x54, 0x36, 0x71, 0x39, 0x4F, 0x4B, + 0x50, 0x76, 0x2B, 0x52, 0x4B, 0x59, 0x39, 0x6A, 0x69, 0x39, 0x69, 0x30, 0x71, 0x56, 0x51, 0x42, 0x44, 0x62, 0x36, 0x54, 0x68, 0x69, 0x2F, 0x35, 0x53, 0x6D, 0x33, 0x48, 0x58, 0x76, 0x56, 0x58, 0x2B, 0x63, 0x70, 0x56, 0x48, 0x42, 0x4B, 0x2B, + 0x52, 0x77, 0x38, 0x32, 0x78, 0x64, 0x39, 0x71, 0x74, 0x39, 0x74, 0x31, 0x77, 0x6B, 0x63, 0x6C, 0x66, 0x37, 0x6E, 0x78, 0x0A, 0x59, 0x2F, 0x68, 0x6F, 0x4C, 0x56, 0x55, 0x45, 0x30, 0x66, 0x4B, 0x4E, 0x73, 0x4B, 0x54, 0x50, 0x76, 0x44, 0x78, + 0x65, 0x48, 0x33, 0x6A, 0x6E, 0x70, 0x61, 0x41, 0x67, 0x63, 0x4C, 0x41, 0x45, 0x78, 0x62, 0x66, 0x33, 0x63, 0x71, 0x66, 0x65, 0x49, 0x67, 0x32, 0x39, 0x4D, 0x79, 0x56, 0x47, 0x6A, 0x47, 0x53, 0x53, 0x4A, 0x75, 0x4D, 0x2B, 0x4C, 0x6D, 0x4F, + 0x57, 0x32, 0x70, 0x75, 0x4D, 0x50, 0x66, 0x67, 0x59, 0x43, 0x64, 0x63, 0x44, 0x7A, 0x48, 0x32, 0x47, 0x0A, 0x67, 0x75, 0x44, 0x4B, 0x42, 0x41, 0x64, 0x52, 0x55, 0x4E, 0x66, 0x2F, 0x6B, 0x74, 0x55, 0x4D, 0x37, 0x39, 0x71, 0x47, 0x6E, 0x35, + 0x6E, 0x58, 0x36, 0x37, 0x65, 0x76, 0x61, 0x4F, 0x49, 0x35, 0x4A, 0x70, 0x53, 0x36, 0x61, 0x4C, 0x65, 0x2F, 0x67, 0x39, 0x50, 0x71, 0x65, 0x6D, 0x63, 0x39, 0x59, 0x6D, 0x65, 0x75, 0x4A, 0x65, 0x56, 0x79, 0x36, 0x4F, 0x4C, 0x6B, 0x37, 0x4B, + 0x34, 0x53, 0x39, 0x6B, 0x73, 0x72, 0x50, 0x4A, 0x2F, 0x70, 0x73, 0x45, 0x44, 0x7A, 0x0A, 0x4F, 0x46, 0x53, 0x7A, 0x2F, 0x62, 0x64, 0x6F, 0x79, 0x4E, 0x72, 0x47, 0x6A, 0x31, 0x45, 0x38, 0x73, 0x76, 0x75, 0x52, 0x33, 0x42, 0x7A, 0x6E, 0x6D, + 0x35, 0x33, 0x68, 0x74, 0x77, 0x31, 0x79, 0x6A, 0x2B, 0x4B, 0x6B, 0x78, 0x4B, 0x6C, 0x34, 0x2B, 0x65, 0x73, 0x55, 0x72, 0x4D, 0x5A, 0x44, 0x42, 0x63, 0x4A, 0x6C, 0x4F, 0x53, 0x67, 0x59, 0x41, 0x73, 0x4F, 0x43, 0x73, 0x70, 0x30, 0x46, 0x76, + 0x6D, 0x58, 0x74, 0x6C, 0x6C, 0x39, 0x6C, 0x64, 0x44, 0x7A, 0x37, 0x0A, 0x43, 0x54, 0x55, 0x75, 0x65, 0x35, 0x77, 0x54, 0x2F, 0x52, 0x73, 0x50, 0x58, 0x63, 0x64, 0x74, 0x67, 0x54, 0x70, 0x57, 0x44, 0x38, 0x77, 0x37, 0x34, 0x61, 0x38, 0x43, + 0x4C, 0x79, 0x4B, 0x73, 0x52, 0x73, 0x70, 0x47, 0x50, 0x4B, 0x41, 0x63, 0x54, 0x4E, 0x5A, 0x45, 0x74, 0x46, 0x34, 0x75, 0x58, 0x42, 0x56, 0x6D, 0x43, 0x65, 0x45, 0x6D, 0x4B, 0x66, 0x37, 0x47, 0x55, 0x6D, 0x47, 0x36, 0x73, 0x58, 0x50, 0x2F, + 0x77, 0x77, 0x79, 0x63, 0x35, 0x57, 0x78, 0x71, 0x0A, 0x6C, 0x44, 0x38, 0x55, 0x79, 0x6B, 0x41, 0x57, 0x6C, 0x59, 0x54, 0x7A, 0x57, 0x61, 0x6D, 0x73, 0x58, 0x30, 0x78, 0x68, 0x6B, 0x32, 0x33, 0x52, 0x4F, 0x38, 0x79, 0x69, 0x6C, 0x51, 0x77, + 0x69, 0x70, 0x6D, 0x64, 0x6E, 0x52, 0x43, 0x36, 0x35, 0x32, 0x64, 0x4B, 0x4B, 0x51, 0x62, 0x4E, 0x6D, 0x43, 0x31, 0x72, 0x37, 0x66, 0x53, 0x4F, 0x6C, 0x38, 0x68, 0x71, 0x77, 0x2F, 0x39, 0x36, 0x62, 0x67, 0x35, 0x51, 0x75, 0x30, 0x54, 0x2F, + 0x66, 0x6B, 0x72, 0x65, 0x52, 0x0A, 0x72, 0x77, 0x55, 0x37, 0x5A, 0x63, 0x65, 0x67, 0x62, 0x4C, 0x48, 0x4E, 0x59, 0x68, 0x4C, 0x44, 0x6B, 0x42, 0x76, 0x6A, 0x4A, 0x63, 0x34, 0x30, 0x76, 0x47, 0x39, 0x33, 0x64, 0x72, 0x45, 0x51, 0x77, 0x2F, + 0x63, 0x46, 0x47, 0x73, 0x44, 0x57, 0x72, 0x33, 0x52, 0x69, 0x53, 0x42, 0x64, 0x33, 0x6B, 0x6D, 0x6D, 0x51, 0x59, 0x52, 0x7A, 0x65, 0x6C, 0x59, 0x42, 0x30, 0x56, 0x49, 0x38, 0x59, 0x48, 0x4D, 0x50, 0x7A, 0x41, 0x39, 0x43, 0x2F, 0x70, 0x45, + 0x4E, 0x31, 0x0A, 0x68, 0x6C, 0x4D, 0x59, 0x65, 0x67, 0x6F, 0x75, 0x43, 0x52, 0x77, 0x32, 0x6E, 0x35, 0x48, 0x39, 0x67, 0x6F, 0x6F, 0x69, 0x53, 0x39, 0x45, 0x4F, 0x55, 0x43, 0x58, 0x64, 0x79, 0x77, 0x4D, 0x4D, 0x46, 0x38, 0x6D, 0x44, 0x41, + 0x41, 0x68, 0x4F, 0x4E, 0x55, 0x32, 0x4B, 0x69, 0x2B, 0x33, 0x77, 0x41, 0x70, 0x52, 0x6D, 0x4C, 0x45, 0x52, 0x2F, 0x79, 0x35, 0x55, 0x6E, 0x6C, 0x68, 0x65, 0x74, 0x43, 0x54, 0x43, 0x73, 0x74, 0x6E, 0x45, 0x58, 0x62, 0x6F, 0x73, 0x58, 0x0A, + 0x39, 0x68, 0x77, 0x4A, 0x31, 0x43, 0x30, 0x37, 0x6D, 0x4B, 0x56, 0x78, 0x30, 0x31, 0x51, 0x54, 0x32, 0x57, 0x44, 0x7A, 0x39, 0x55, 0x74, 0x6D, 0x54, 0x2F, 0x72, 0x78, 0x37, 0x69, 0x41, 0x53, 0x6A, 0x62, 0x53, 0x73, 0x56, 0x37, 0x46, 0x46, + 0x59, 0x36, 0x47, 0x73, 0x64, 0x71, 0x6E, 0x43, 0x2B, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, + 0x53, 0x53, 0x4C, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x45, 0x43, 0x43, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, + 0x6C, 0x44, 0x43, 0x43, 0x41, 0x68, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x4C, 0x43, 0x6D, 0x63, 0x57, 0x78, 0x62, 0x74, 0x42, 0x5A, 0x55, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, + 0x41, 0x77, 0x49, 0x77, 0x66, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x44, 0x6A, 0x41, 0x4D, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x67, 0x4D, 0x42, 0x56, 0x52, + 0x6C, 0x65, 0x47, 0x46, 0x7A, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, 0x64, 0x49, 0x62, 0x33, 0x56, 0x7A, 0x64, 0x47, 0x39, 0x75, 0x4D, 0x52, 0x67, 0x77, 0x46, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x4B, 0x44, 0x41, 0x39, 0x54, 0x55, 0x30, 0x77, 0x67, 0x51, 0x32, 0x39, 0x79, 0x63, 0x47, 0x39, 0x79, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x78, 0x4E, 0x44, 0x41, 0x79, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4B, 0x31, + 0x4E, 0x54, 0x54, 0x43, 0x35, 0x6A, 0x62, 0x32, 0x30, 0x67, 0x52, 0x56, 0x59, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, + 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x0A, 0x4D, 0x6A, 0x45, 0x79, 0x4D, 0x54, 0x67, 0x78, 0x4E, 0x54, 0x49, 0x7A, 0x57, + 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x45, 0x77, 0x4D, 0x6A, 0x45, 0x79, 0x4D, 0x54, 0x67, 0x78, 0x4E, 0x54, 0x49, 0x7A, 0x57, 0x6A, 0x42, 0x2F, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, + 0x7A, 0x45, 0x4F, 0x4D, 0x41, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x46, 0x56, 0x47, 0x56, 0x34, 0x59, 0x58, 0x4D, 0x78, 0x0A, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x30, 0x68, 0x76, + 0x64, 0x58, 0x4E, 0x30, 0x62, 0x32, 0x34, 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x31, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x6C, 0x76, + 0x62, 0x6A, 0x45, 0x30, 0x4D, 0x44, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x72, 0x55, 0x31, 0x4E, 0x4D, 0x0A, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x46, 0x56, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, + 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x45, 0x56, 0x44, 0x51, 0x7A, 0x42, 0x32, 0x4D, 0x42, 0x41, + 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x0A, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4B, 0x6F, 0x53, 0x52, 0x35, 0x43, 0x59, 0x47, 0x2F, 0x76, 0x76, 0x77, 0x30, + 0x41, 0x48, 0x67, 0x79, 0x42, 0x4F, 0x38, 0x54, 0x43, 0x43, 0x6F, 0x67, 0x62, 0x52, 0x38, 0x70, 0x4B, 0x47, 0x59, 0x66, 0x4C, 0x32, 0x49, 0x57, 0x6A, 0x4B, 0x41, 0x4D, 0x54, 0x48, 0x36, 0x6B, 0x4D, 0x41, 0x56, 0x49, 0x62, 0x63, 0x2F, 0x52, + 0x2F, 0x66, 0x41, 0x4C, 0x68, 0x42, 0x59, 0x6C, 0x7A, 0x63, 0x63, 0x42, 0x59, 0x79, 0x0A, 0x33, 0x68, 0x2B, 0x5A, 0x31, 0x4D, 0x7A, 0x46, 0x42, 0x38, 0x67, 0x49, 0x48, 0x32, 0x45, 0x57, 0x42, 0x31, 0x45, 0x39, 0x66, 0x56, 0x77, 0x48, 0x55, + 0x2B, 0x4D, 0x31, 0x4F, 0x49, 0x7A, 0x66, 0x7A, 0x5A, 0x2F, 0x5A, 0x4C, 0x67, 0x31, 0x4B, 0x74, 0x68, 0x6B, 0x75, 0x57, 0x6E, 0x42, 0x61, 0x42, 0x75, 0x32, 0x2B, 0x38, 0x4B, 0x47, 0x77, 0x79, 0x74, 0x41, 0x4A, 0x4B, 0x61, 0x4E, 0x6A, 0x4D, + 0x47, 0x45, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x0A, 0x42, 0x42, 0x59, 0x45, 0x46, 0x46, 0x76, 0x4B, 0x58, 0x75, 0x58, 0x65, 0x30, 0x6F, 0x47, 0x71, 0x7A, 0x61, 0x67, 0x74, 0x5A, 0x46, 0x47, 0x32, 0x32, 0x58, 0x4B, 0x62, + 0x6C, 0x2B, 0x5A, 0x50, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, + 0x46, 0x6F, 0x41, 0x55, 0x57, 0x38, 0x70, 0x65, 0x0A, 0x35, 0x64, 0x37, 0x53, 0x67, 0x61, 0x72, 0x4E, 0x71, 0x43, 0x31, 0x6B, 0x55, 0x62, 0x62, 0x5A, 0x63, 0x70, 0x75, 0x58, 0x35, 0x6B, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, + 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x32, 0x67, 0x41, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x51, 0x43, + 0x4B, 0x35, 0x6B, 0x43, 0x4A, 0x0A, 0x4E, 0x2B, 0x76, 0x70, 0x31, 0x52, 0x50, 0x5A, 0x79, 0x74, 0x52, 0x72, 0x4A, 0x50, 0x4F, 0x77, 0x50, 0x59, 0x64, 0x47, 0x57, 0x42, 0x72, 0x73, 0x73, 0x64, 0x39, 0x76, 0x2B, 0x31, 0x61, 0x36, 0x63, 0x47, + 0x76, 0x48, 0x4F, 0x4D, 0x7A, 0x6F, 0x73, 0x59, 0x78, 0x50, 0x44, 0x2F, 0x66, 0x78, 0x5A, 0x33, 0x59, 0x4F, 0x67, 0x39, 0x41, 0x65, 0x55, 0x59, 0x38, 0x43, 0x4D, 0x44, 0x33, 0x32, 0x49, 0x79, 0x67, 0x6D, 0x54, 0x4D, 0x5A, 0x67, 0x68, 0x35, + 0x4D, 0x6D, 0x0A, 0x6D, 0x37, 0x49, 0x31, 0x48, 0x72, 0x72, 0x57, 0x39, 0x7A, 0x7A, 0x52, 0x48, 0x4D, 0x37, 0x36, 0x4A, 0x54, 0x79, 0x6D, 0x47, 0x6F, 0x45, 0x56, 0x57, 0x2F, 0x4D, 0x53, 0x44, 0x32, 0x7A, 0x75, 0x5A, 0x59, 0x72, 0x4A, 0x68, + 0x36, 0x6A, 0x35, 0x42, 0x2B, 0x42, 0x69, 0x6D, 0x6F, 0x78, 0x63, 0x53, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x52, 0x36, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, + 0x49, 0x49, 0x46, 0x67, 0x7A, 0x43, 0x43, 0x41, 0x32, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4F, 0x52, 0x65, 0x61, 0x37, 0x41, 0x34, 0x4D, 0x7A, 0x77, 0x34, 0x56, 0x6C, 0x53, 0x4F, 0x62, 0x2F, 0x52, 0x56, 0x45, 0x77, 0x44, + 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x54, 0x44, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x58, 0x0A, 0x52, 0x32, 0x78, 0x76, + 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x55, 0x6A, 0x59, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, + 0x43, 0x6B, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x43, 0x6B, 0x64, 0x73, 0x0A, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, + 0x70, 0x5A, 0x32, 0x34, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x51, 0x78, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x51, 0x78, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x44, 0x41, + 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x4D, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x64, 0x48, 0x62, 0x47, 0x39, 0x69, 0x0A, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, + 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4C, 0x53, 0x42, 0x53, 0x4E, 0x6A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4B, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x55, 0x32, + 0x6C, 0x6E, 0x62, 0x6A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4B, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x0A, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x6A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, + 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4A, 0x55, 0x48, 0x36, + 0x48, 0x50, 0x4B, 0x5A, 0x76, 0x6E, 0x73, 0x46, 0x4D, 0x70, 0x37, 0x50, 0x50, 0x63, 0x4E, 0x43, 0x50, 0x47, 0x30, 0x52, 0x51, 0x73, 0x73, 0x0A, 0x67, 0x72, 0x52, 0x49, 0x78, 0x75, 0x74, 0x62, 0x50, 0x4B, 0x36, 0x44, 0x75, 0x45, 0x47, 0x53, + 0x4D, 0x78, 0x53, 0x6B, 0x62, 0x33, 0x2F, 0x70, 0x4B, 0x73, 0x7A, 0x47, 0x73, 0x49, 0x68, 0x72, 0x78, 0x62, 0x61, 0x4A, 0x30, 0x63, 0x61, 0x79, 0x2F, 0x78, 0x54, 0x4F, 0x55, 0x52, 0x51, 0x68, 0x37, 0x45, 0x72, 0x64, 0x47, 0x31, 0x72, 0x47, + 0x31, 0x6F, 0x66, 0x75, 0x54, 0x54, 0x6F, 0x56, 0x42, 0x75, 0x31, 0x6B, 0x5A, 0x67, 0x75, 0x53, 0x67, 0x4D, 0x70, 0x45, 0x0A, 0x33, 0x6E, 0x4F, 0x55, 0x54, 0x76, 0x4F, 0x6E, 0x69, 0x58, 0x39, 0x50, 0x65, 0x47, 0x4D, 0x49, 0x79, 0x42, 0x4A, + 0x51, 0x62, 0x55, 0x4A, 0x6D, 0x4C, 0x30, 0x32, 0x35, 0x65, 0x53, 0x68, 0x4E, 0x55, 0x68, 0x71, 0x4B, 0x47, 0x6F, 0x43, 0x33, 0x47, 0x59, 0x45, 0x4F, 0x66, 0x73, 0x53, 0x4B, 0x76, 0x47, 0x52, 0x4D, 0x49, 0x52, 0x78, 0x44, 0x61, 0x4E, 0x63, + 0x39, 0x50, 0x49, 0x72, 0x46, 0x73, 0x6D, 0x62, 0x56, 0x6B, 0x4A, 0x71, 0x33, 0x4D, 0x51, 0x62, 0x46, 0x0A, 0x76, 0x75, 0x4A, 0x74, 0x4D, 0x67, 0x61, 0x6D, 0x48, 0x76, 0x6D, 0x35, 0x36, 0x36, 0x71, 0x6A, 0x75, 0x4C, 0x2B, 0x2B, 0x67, 0x6D, + 0x4E, 0x51, 0x30, 0x50, 0x41, 0x59, 0x69, 0x64, 0x2F, 0x6B, 0x44, 0x33, 0x6E, 0x31, 0x36, 0x71, 0x49, 0x66, 0x4B, 0x74, 0x4A, 0x77, 0x4C, 0x6E, 0x76, 0x6E, 0x76, 0x4A, 0x4F, 0x37, 0x62, 0x56, 0x50, 0x69, 0x53, 0x48, 0x79, 0x4D, 0x45, 0x41, + 0x63, 0x34, 0x2F, 0x32, 0x61, 0x79, 0x64, 0x32, 0x46, 0x2B, 0x34, 0x4F, 0x71, 0x4D, 0x0A, 0x50, 0x4B, 0x71, 0x30, 0x70, 0x50, 0x62, 0x7A, 0x6C, 0x55, 0x6F, 0x53, 0x42, 0x32, 0x33, 0x39, 0x6A, 0x4C, 0x4B, 0x4A, 0x7A, 0x39, 0x43, 0x67, 0x59, + 0x58, 0x66, 0x49, 0x57, 0x48, 0x53, 0x77, 0x31, 0x43, 0x4D, 0x36, 0x39, 0x31, 0x30, 0x36, 0x79, 0x71, 0x4C, 0x62, 0x6E, 0x51, 0x6E, 0x65, 0x58, 0x55, 0x51, 0x74, 0x6B, 0x50, 0x47, 0x42, 0x7A, 0x56, 0x65, 0x53, 0x2B, 0x6E, 0x36, 0x38, 0x55, + 0x41, 0x52, 0x6A, 0x4E, 0x4E, 0x39, 0x72, 0x6B, 0x78, 0x69, 0x2B, 0x0A, 0x61, 0x7A, 0x61, 0x79, 0x4F, 0x65, 0x53, 0x73, 0x4A, 0x44, 0x61, 0x33, 0x38, 0x4F, 0x2B, 0x32, 0x48, 0x42, 0x4E, 0x58, 0x6B, 0x37, 0x62, 0x65, 0x73, 0x76, 0x6A, 0x69, + 0x68, 0x62, 0x64, 0x7A, 0x6F, 0x72, 0x67, 0x31, 0x71, 0x6B, 0x58, 0x79, 0x34, 0x4A, 0x30, 0x32, 0x6F, 0x57, 0x39, 0x55, 0x69, 0x76, 0x46, 0x79, 0x56, 0x6D, 0x34, 0x75, 0x69, 0x4D, 0x56, 0x52, 0x51, 0x6B, 0x51, 0x56, 0x6C, 0x4F, 0x36, 0x6A, + 0x78, 0x54, 0x69, 0x57, 0x6D, 0x30, 0x35, 0x4F, 0x0A, 0x57, 0x67, 0x74, 0x48, 0x38, 0x77, 0x59, 0x32, 0x53, 0x58, 0x63, 0x77, 0x76, 0x48, 0x45, 0x33, 0x35, 0x61, 0x62, 0x73, 0x49, 0x51, 0x68, 0x31, 0x2F, 0x4F, 0x5A, 0x68, 0x46, 0x6A, 0x39, + 0x33, 0x31, 0x64, 0x6D, 0x52, 0x6C, 0x34, 0x51, 0x4B, 0x62, 0x4E, 0x51, 0x43, 0x54, 0x58, 0x54, 0x41, 0x46, 0x4F, 0x33, 0x39, 0x4F, 0x66, 0x75, 0x44, 0x38, 0x6C, 0x34, 0x55, 0x6F, 0x51, 0x53, 0x77, 0x43, 0x2B, 0x6E, 0x2B, 0x37, 0x6F, 0x2F, + 0x68, 0x62, 0x67, 0x75, 0x79, 0x0A, 0x43, 0x4C, 0x4E, 0x68, 0x5A, 0x67, 0x6C, 0x71, 0x73, 0x51, 0x59, 0x36, 0x5A, 0x5A, 0x5A, 0x5A, 0x77, 0x50, 0x41, 0x31, 0x2F, 0x63, 0x6E, 0x61, 0x4B, 0x49, 0x30, 0x61, 0x45, 0x59, 0x64, 0x77, 0x67, 0x51, + 0x71, 0x6F, 0x6D, 0x6E, 0x55, 0x64, 0x6E, 0x6A, 0x71, 0x47, 0x42, 0x51, 0x43, 0x65, 0x32, 0x34, 0x44, 0x57, 0x4A, 0x66, 0x6E, 0x63, 0x42, 0x5A, 0x34, 0x6E, 0x57, 0x55, 0x78, 0x32, 0x4F, 0x56, 0x76, 0x71, 0x2B, 0x61, 0x57, 0x68, 0x32, 0x49, + 0x4D, 0x50, 0x0A, 0x30, 0x66, 0x2F, 0x66, 0x4D, 0x42, 0x48, 0x35, 0x68, 0x63, 0x38, 0x7A, 0x53, 0x50, 0x58, 0x4B, 0x62, 0x57, 0x51, 0x55, 0x4C, 0x48, 0x70, 0x59, 0x54, 0x39, 0x4E, 0x4C, 0x43, 0x45, 0x6E, 0x46, 0x6C, 0x57, 0x51, 0x61, 0x59, + 0x77, 0x35, 0x35, 0x50, 0x66, 0x57, 0x7A, 0x6A, 0x4D, 0x70, 0x59, 0x72, 0x5A, 0x78, 0x43, 0x52, 0x58, 0x6C, 0x75, 0x44, 0x6F, 0x63, 0x5A, 0x58, 0x46, 0x53, 0x78, 0x5A, 0x62, 0x61, 0x2F, 0x6A, 0x4A, 0x76, 0x63, 0x45, 0x2B, 0x6B, 0x4E, 0x0A, + 0x62, 0x37, 0x67, 0x75, 0x33, 0x47, 0x64, 0x75, 0x79, 0x59, 0x73, 0x52, 0x74, 0x59, 0x51, 0x55, 0x69, 0x67, 0x41, 0x5A, 0x63, 0x49, 0x4E, 0x35, 0x6B, 0x5A, 0x65, 0x52, 0x31, 0x42, 0x6F, 0x6E, 0x76, 0x7A, 0x63, 0x65, 0x4D, 0x67, 0x66, 0x59, + 0x46, 0x47, 0x4D, 0x38, 0x4B, 0x45, 0x79, 0x76, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x0A, 0x41, 0x77, 0x49, + 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, + 0x75, 0x62, 0x41, 0x57, 0x6A, 0x6B, 0x78, 0x50, 0x69, 0x6F, 0x75, 0x66, 0x69, 0x31, 0x78, 0x7A, 0x57, 0x78, 0x2F, 0x42, 0x2F, 0x79, 0x47, 0x64, 0x54, 0x6F, 0x44, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, + 0x41, 0x57, 0x67, 0x42, 0x53, 0x75, 0x62, 0x41, 0x57, 0x6A, 0x6B, 0x78, 0x50, 0x69, 0x6F, 0x75, 0x66, 0x69, 0x31, 0x78, 0x7A, 0x57, 0x78, 0x2F, 0x42, 0x2F, 0x79, 0x47, 0x64, 0x54, 0x6F, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, + 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x67, 0x79, 0x58, 0x74, 0x36, 0x4E, 0x48, 0x39, 0x6C, 0x56, 0x4C, 0x4E, 0x0A, 0x6E, 0x73, 0x41, 0x45, 0x6F, 0x4A, 0x46, 0x70, 0x35, + 0x6C, 0x7A, 0x51, 0x68, 0x4E, 0x37, 0x63, 0x72, 0x61, 0x4A, 0x50, 0x36, 0x45, 0x64, 0x34, 0x31, 0x6D, 0x57, 0x59, 0x71, 0x56, 0x75, 0x6F, 0x50, 0x49, 0x64, 0x38, 0x41, 0x6F, 0x72, 0x52, 0x62, 0x72, 0x63, 0x57, 0x63, 0x2B, 0x5A, 0x66, 0x77, + 0x46, 0x53, 0x59, 0x31, 0x58, 0x53, 0x2B, 0x77, 0x63, 0x33, 0x69, 0x45, 0x5A, 0x47, 0x74, 0x49, 0x78, 0x67, 0x39, 0x33, 0x65, 0x46, 0x79, 0x52, 0x4A, 0x61, 0x30, 0x0A, 0x6C, 0x56, 0x37, 0x41, 0x65, 0x34, 0x36, 0x5A, 0x65, 0x42, 0x5A, 0x44, + 0x45, 0x31, 0x5A, 0x58, 0x73, 0x36, 0x4B, 0x7A, 0x4F, 0x37, 0x56, 0x33, 0x33, 0x45, 0x42, 0x79, 0x72, 0x4B, 0x50, 0x72, 0x6D, 0x7A, 0x55, 0x2B, 0x73, 0x51, 0x67, 0x68, 0x6F, 0x65, 0x66, 0x45, 0x51, 0x7A, 0x64, 0x35, 0x4D, 0x72, 0x36, 0x31, + 0x35, 0x35, 0x77, 0x73, 0x54, 0x4C, 0x78, 0x44, 0x4B, 0x5A, 0x6D, 0x4F, 0x4D, 0x4E, 0x4F, 0x73, 0x49, 0x65, 0x44, 0x6A, 0x48, 0x66, 0x72, 0x59, 0x0A, 0x42, 0x7A, 0x4E, 0x32, 0x56, 0x41, 0x41, 0x69, 0x4B, 0x72, 0x6C, 0x4E, 0x49, 0x43, 0x35, + 0x77, 0x61, 0x4E, 0x72, 0x6C, 0x55, 0x2F, 0x79, 0x44, 0x58, 0x4E, 0x4F, 0x64, 0x38, 0x76, 0x39, 0x45, 0x44, 0x45, 0x52, 0x6D, 0x38, 0x74, 0x4C, 0x6A, 0x76, 0x55, 0x59, 0x41, 0x47, 0x6D, 0x30, 0x43, 0x75, 0x69, 0x56, 0x64, 0x6A, 0x61, 0x45, + 0x78, 0x55, 0x64, 0x31, 0x55, 0x52, 0x68, 0x78, 0x4E, 0x32, 0x35, 0x6D, 0x57, 0x37, 0x78, 0x6F, 0x63, 0x42, 0x46, 0x79, 0x6D, 0x0A, 0x46, 0x65, 0x39, 0x34, 0x34, 0x48, 0x6E, 0x2B, 0x58, 0x64, 0x73, 0x2B, 0x71, 0x6B, 0x78, 0x56, 0x2F, 0x5A, + 0x6F, 0x56, 0x71, 0x57, 0x2F, 0x68, 0x70, 0x76, 0x76, 0x66, 0x63, 0x44, 0x44, 0x70, 0x77, 0x2B, 0x35, 0x43, 0x52, 0x75, 0x33, 0x43, 0x6B, 0x77, 0x57, 0x4A, 0x2B, 0x6E, 0x31, 0x6A, 0x65, 0x7A, 0x2F, 0x51, 0x63, 0x59, 0x46, 0x38, 0x41, 0x4F, + 0x69, 0x59, 0x72, 0x67, 0x35, 0x34, 0x4E, 0x4D, 0x4D, 0x6C, 0x2B, 0x36, 0x38, 0x4B, 0x6E, 0x79, 0x42, 0x72, 0x0A, 0x33, 0x54, 0x73, 0x54, 0x6A, 0x78, 0x4B, 0x4D, 0x34, 0x6B, 0x45, 0x61, 0x53, 0x48, 0x70, 0x7A, 0x6F, 0x48, 0x64, 0x70, 0x78, + 0x37, 0x5A, 0x63, 0x66, 0x34, 0x4C, 0x49, 0x48, 0x76, 0x35, 0x59, 0x47, 0x79, 0x67, 0x72, 0x71, 0x47, 0x79, 0x74, 0x58, 0x6D, 0x33, 0x41, 0x42, 0x64, 0x4A, 0x37, 0x74, 0x2B, 0x75, 0x41, 0x2F, 0x69, 0x55, 0x33, 0x2F, 0x67, 0x4B, 0x62, 0x61, + 0x4B, 0x78, 0x43, 0x58, 0x63, 0x50, 0x75, 0x39, 0x63, 0x7A, 0x63, 0x38, 0x46, 0x42, 0x31, 0x0A, 0x30, 0x6A, 0x5A, 0x70, 0x6E, 0x4F, 0x5A, 0x37, 0x42, 0x4E, 0x39, 0x75, 0x42, 0x6D, 0x6D, 0x32, 0x33, 0x67, 0x6F, 0x4A, 0x53, 0x46, 0x6D, 0x48, + 0x36, 0x33, 0x73, 0x55, 0x59, 0x48, 0x70, 0x6B, 0x71, 0x6D, 0x6C, 0x44, 0x37, 0x35, 0x48, 0x48, 0x54, 0x4F, 0x77, 0x59, 0x33, 0x57, 0x7A, 0x76, 0x55, 0x79, 0x32, 0x4D, 0x6D, 0x65, 0x46, 0x65, 0x38, 0x6E, 0x49, 0x2B, 0x7A, 0x31, 0x54, 0x49, + 0x76, 0x57, 0x66, 0x73, 0x70, 0x41, 0x39, 0x4D, 0x52, 0x66, 0x2F, 0x54, 0x0A, 0x75, 0x54, 0x41, 0x6A, 0x42, 0x30, 0x79, 0x50, 0x45, 0x4C, 0x2B, 0x47, 0x6C, 0x74, 0x6D, 0x5A, 0x57, 0x72, 0x53, 0x5A, 0x56, 0x78, 0x79, 0x6B, 0x7A, 0x4C, 0x73, + 0x56, 0x69, 0x56, 0x4F, 0x36, 0x4C, 0x41, 0x55, 0x50, 0x35, 0x4D, 0x53, 0x65, 0x47, 0x62, 0x45, 0x59, 0x4E, 0x4E, 0x56, 0x4D, 0x6E, 0x62, 0x72, 0x74, 0x39, 0x78, 0x2B, 0x76, 0x4A, 0x4A, 0x55, 0x45, 0x65, 0x4B, 0x67, 0x44, 0x75, 0x2B, 0x36, + 0x42, 0x35, 0x64, 0x70, 0x66, 0x66, 0x49, 0x74, 0x4B, 0x0A, 0x6F, 0x5A, 0x42, 0x30, 0x4A, 0x61, 0x65, 0x7A, 0x50, 0x6B, 0x76, 0x49, 0x4C, 0x46, 0x61, 0x39, 0x78, 0x38, 0x6A, 0x76, 0x4F, 0x4F, 0x4A, 0x63, 0x6B, 0x76, 0x42, 0x35, 0x39, 0x35, + 0x79, 0x45, 0x75, 0x6E, 0x51, 0x74, 0x59, 0x51, 0x45, 0x67, 0x66, 0x6E, 0x37, 0x52, 0x38, 0x6B, 0x38, 0x48, 0x57, 0x56, 0x2B, 0x4C, 0x4C, 0x55, 0x4E, 0x53, 0x36, 0x30, 0x59, 0x4D, 0x6C, 0x4F, 0x48, 0x31, 0x5A, 0x6B, 0x64, 0x35, 0x64, 0x39, + 0x56, 0x55, 0x57, 0x78, 0x2B, 0x74, 0x0A, 0x4A, 0x44, 0x66, 0x4C, 0x52, 0x56, 0x70, 0x4F, 0x6F, 0x45, 0x52, 0x49, 0x79, 0x4E, 0x69, 0x77, 0x6D, 0x63, 0x55, 0x56, 0x68, 0x41, 0x6E, 0x32, 0x31, 0x6B, 0x6C, 0x4A, 0x77, 0x47, 0x57, 0x34, 0x35, + 0x68, 0x70, 0x78, 0x62, 0x71, 0x43, 0x6F, 0x38, 0x59, 0x4C, 0x6F, 0x52, 0x54, 0x35, 0x73, 0x31, 0x67, 0x4C, 0x58, 0x43, 0x6D, 0x65, 0x44, 0x42, 0x56, 0x72, 0x4A, 0x70, 0x42, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4F, 0x49, 0x53, 0x54, 0x45, 0x20, 0x57, 0x49, 0x53, 0x65, 0x4B, 0x65, 0x79, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, + 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x43, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x61, 0x54, 0x43, 0x43, 0x41, + 0x65, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x49, 0x53, 0x70, 0x57, 0x44, 0x4B, 0x37, 0x61, 0x44, 0x4B, 0x74, 0x41, 0x52, 0x62, 0x38, 0x72, 0x6F, 0x69, 0x30, 0x36, 0x36, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, + 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x74, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x0A, 0x53, 0x44, 0x45, 0x51, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x43, 0x68, 0x4D, 0x48, 0x56, 0x30, 0x6C, 0x54, 0x5A, 0x55, 0x74, 0x6C, 0x65, 0x54, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x5A, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, 0x67, 0x52, 0x6D, 0x39, 0x31, + 0x62, 0x6D, 0x52, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x46, 0x62, 0x6D, 0x52, 0x76, 0x63, 0x6E, 0x4E, 0x6C, 0x5A, 0x44, 0x45, 0x6F, 0x0A, 0x4D, 0x43, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x66, 0x54, 0x30, 0x6C, + 0x54, 0x56, 0x45, 0x55, 0x67, 0x56, 0x30, 0x6C, 0x54, 0x5A, 0x55, 0x74, 0x6C, 0x65, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x48, 0x51, 0x79, 0x42, 0x44, 0x51, 0x54, 0x41, + 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x31, 0x4D, 0x44, 0x6B, 0x77, 0x4F, 0x54, 0x51, 0x34, 0x4D, 0x7A, 0x52, 0x61, 0x0A, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x31, 0x4D, 0x44, 0x6B, 0x77, 0x4F, 0x54, 0x55, 0x34, 0x4D, 0x7A, + 0x4E, 0x61, 0x4D, 0x47, 0x30, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x49, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x64, 0x58, 0x53, 0x56, + 0x4E, 0x6C, 0x53, 0x32, 0x56, 0x35, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x0A, 0x45, 0x78, 0x6C, 0x50, 0x53, 0x56, 0x4E, 0x55, 0x52, 0x53, 0x42, 0x47, 0x62, 0x33, 0x56, 0x75, 0x5A, 0x47, 0x46, 0x30, 0x61, + 0x57, 0x39, 0x75, 0x49, 0x45, 0x56, 0x75, 0x5A, 0x47, 0x39, 0x79, 0x63, 0x32, 0x56, 0x6B, 0x4D, 0x53, 0x67, 0x77, 0x4A, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x39, 0x50, 0x53, 0x56, 0x4E, 0x55, 0x52, 0x53, 0x42, 0x58, 0x53, + 0x56, 0x4E, 0x6C, 0x53, 0x32, 0x56, 0x35, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x0A, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x64, 0x44, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, 0x59, 0x48, + 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x54, 0x4F, 0x6C, 0x51, 0x77, 0x4D, 0x59, 0x50, 0x63, 0x68, 0x69, 0x38, 0x32, 0x50, 0x47, 0x36, + 0x73, 0x34, 0x6E, 0x69, 0x65, 0x55, 0x71, 0x6A, 0x46, 0x71, 0x64, 0x72, 0x0A, 0x56, 0x43, 0x54, 0x62, 0x55, 0x66, 0x2F, 0x71, 0x39, 0x41, 0x6B, 0x6B, 0x77, 0x77, 0x73, 0x69, 0x6E, 0x38, 0x74, 0x71, 0x4A, 0x34, 0x4B, 0x42, 0x44, 0x64, 0x4C, + 0x41, 0x72, 0x7A, 0x48, 0x6B, 0x64, 0x49, 0x4A, 0x75, 0x79, 0x69, 0x58, 0x5A, 0x6A, 0x48, 0x57, 0x64, 0x38, 0x64, 0x76, 0x51, 0x6D, 0x71, 0x4A, 0x4C, 0x49, 0x58, 0x34, 0x57, 0x70, 0x32, 0x4F, 0x51, 0x30, 0x6A, 0x6E, 0x55, 0x73, 0x59, 0x64, + 0x34, 0x58, 0x78, 0x69, 0x57, 0x44, 0x31, 0x41, 0x62, 0x0A, 0x4E, 0x54, 0x63, 0x50, 0x61, 0x73, 0x62, 0x63, 0x32, 0x52, 0x4E, 0x4E, 0x70, 0x49, 0x36, 0x51, 0x4E, 0x2B, 0x61, 0x39, 0x57, 0x7A, 0x47, 0x52, 0x6F, 0x31, 0x51, 0x77, 0x55, 0x6A, + 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, + 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x53, 0x49, 0x63, 0x55, 0x72, 0x4F, 0x50, 0x44, 0x6E, 0x70, 0x42, 0x67, 0x4F, 0x74, 0x66, 0x4B, 0x69, 0x65, 0x37, 0x54, 0x72, + 0x59, 0x79, 0x30, 0x55, 0x47, 0x59, 0x77, 0x45, 0x41, 0x59, 0x4A, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x41, 0x47, 0x43, 0x4E, 0x78, 0x55, 0x42, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x41, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, + 0x6A, 0x30, 0x45, 0x0A, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x77, 0x4A, 0x73, 0x64, 0x70, 0x57, 0x39, 0x7A, 0x56, 0x35, 0x37, 0x4C, 0x6E, 0x79, 0x41, 0x79, 0x4D, 0x6A, 0x4D, 0x50, 0x64, 0x65, 0x59, 0x77, 0x62, + 0x59, 0x39, 0x58, 0x4A, 0x55, 0x70, 0x52, 0x4F, 0x54, 0x59, 0x4A, 0x4B, 0x63, 0x78, 0x36, 0x79, 0x67, 0x49, 0x53, 0x70, 0x4A, 0x63, 0x42, 0x4D, 0x57, 0x6D, 0x31, 0x4A, 0x4B, 0x57, 0x42, 0x34, 0x45, 0x2B, 0x4A, 0x2B, 0x53, 0x4F, 0x74, 0x6B, + 0x0A, 0x41, 0x6A, 0x45, 0x41, 0x32, 0x7A, 0x51, 0x67, 0x4D, 0x67, 0x6A, 0x2F, 0x6D, 0x6B, 0x6B, 0x43, 0x74, 0x6F, 0x6A, 0x65, 0x46, 0x4B, 0x39, 0x64, 0x62, 0x4A, 0x6C, 0x78, 0x6A, 0x52, 0x6F, 0x2F, 0x69, 0x39, 0x66, 0x67, 0x6F, 0x6A, 0x61, + 0x47, 0x48, 0x41, 0x65, 0x43, 0x4F, 0x6E, 0x5A, 0x54, 0x2F, 0x63, 0x4B, 0x69, 0x37, 0x65, 0x39, 0x37, 0x73, 0x49, 0x42, 0x50, 0x57, 0x41, 0x39, 0x4C, 0x55, 0x7A, 0x6D, 0x39, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x55, 0x43, 0x41, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x47, 0x32, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x52, 0x6A, 0x43, 0x43, 0x41, 0x79, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x58, 0x64, 0x2B, 0x78, 0x32, 0x6C, 0x71, 0x6A, 0x37, 0x56, 0x32, 0x2B, 0x57, 0x6D, 0x55, 0x67, 0x5A, + 0x51, 0x4F, 0x51, 0x37, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x41, 0x39, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, + 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x49, 0x56, 0x57, 0x35, 0x70, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x4D, 0x4D, 0x45, 0x6C, 0x56, 0x44, 0x51, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x52, 0x7A, 0x49, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x44, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x0A, 0x4E, 0x6A, 0x41, + 0x7A, 0x4D, 0x54, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x44, 0x45, 0x79, 0x4D, 0x7A, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x44, 0x30, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x4F, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x68, 0x56, 0x62, 0x6D, 0x6C, 0x55, 0x0A, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x44, + 0x45, 0x62, 0x4D, 0x42, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x53, 0x56, 0x55, 0x4E, 0x42, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x48, 0x4D, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x4D, 0x49, + 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, + 0x67, 0x45, 0x41, 0x78, 0x65, 0x59, 0x72, 0x62, 0x33, 0x7A, 0x76, 0x4A, 0x67, 0x55, 0x6E, 0x6F, 0x34, 0x45, 0x6B, 0x32, 0x6D, 0x2F, 0x4C, 0x41, 0x66, 0x6D, 0x5A, 0x6D, 0x71, 0x6B, 0x79, 0x77, 0x69, 0x4B, 0x48, 0x59, 0x55, 0x47, 0x52, 0x4F, + 0x38, 0x76, 0x44, 0x61, 0x42, 0x73, 0x47, 0x78, 0x55, 0x79, 0x70, 0x4B, 0x38, 0x46, 0x6E, 0x46, 0x79, 0x49, 0x64, 0x4B, 0x2B, 0x33, 0x35, 0x4B, 0x59, 0x6D, 0x54, 0x0A, 0x6F, 0x6E, 0x69, 0x39, 0x6B, 0x6D, 0x75, 0x67, 0x6F, 0x77, 0x32, 0x69, + 0x66, 0x73, 0x71, 0x54, 0x73, 0x36, 0x62, 0x52, 0x6A, 0x44, 0x58, 0x56, 0x64, 0x66, 0x6B, 0x58, 0x39, 0x73, 0x39, 0x46, 0x78, 0x65, 0x56, 0x36, 0x37, 0x48, 0x65, 0x54, 0x6F, 0x49, 0x38, 0x6A, 0x72, 0x67, 0x34, 0x61, 0x41, 0x33, 0x2B, 0x2B, + 0x31, 0x4E, 0x44, 0x74, 0x4C, 0x6E, 0x75, 0x72, 0x52, 0x69, 0x4E, 0x62, 0x2F, 0x79, 0x7A, 0x6D, 0x56, 0x48, 0x71, 0x55, 0x77, 0x43, 0x6F, 0x56, 0x0A, 0x38, 0x4D, 0x6D, 0x4E, 0x73, 0x48, 0x6F, 0x37, 0x4A, 0x4F, 0x48, 0x58, 0x61, 0x4F, 0x49, + 0x78, 0x50, 0x41, 0x59, 0x7A, 0x52, 0x72, 0x5A, 0x55, 0x45, 0x61, 0x61, 0x6C, 0x4C, 0x79, 0x4A, 0x55, 0x4B, 0x6C, 0x67, 0x4E, 0x41, 0x51, 0x4C, 0x78, 0x2B, 0x68, 0x56, 0x52, 0x5A, 0x32, 0x7A, 0x41, 0x2B, 0x74, 0x65, 0x32, 0x47, 0x33, 0x2F, + 0x52, 0x56, 0x6F, 0x67, 0x76, 0x47, 0x6A, 0x71, 0x4E, 0x4F, 0x37, 0x75, 0x43, 0x45, 0x65, 0x42, 0x48, 0x41, 0x4E, 0x42, 0x53, 0x0A, 0x68, 0x36, 0x76, 0x37, 0x68, 0x6E, 0x34, 0x50, 0x4A, 0x47, 0x74, 0x41, 0x6E, 0x54, 0x52, 0x6E, 0x76, 0x49, + 0x33, 0x48, 0x4C, 0x59, 0x5A, 0x76, 0x65, 0x54, 0x36, 0x4F, 0x71, 0x54, 0x77, 0x58, 0x53, 0x33, 0x2B, 0x77, 0x6D, 0x65, 0x4F, 0x77, 0x63, 0x57, 0x44, 0x63, 0x43, 0x2F, 0x56, 0x6B, 0x77, 0x38, 0x35, 0x44, 0x76, 0x47, 0x31, 0x78, 0x75, 0x64, + 0x4C, 0x65, 0x4A, 0x31, 0x75, 0x4B, 0x36, 0x4E, 0x6A, 0x47, 0x72, 0x75, 0x46, 0x5A, 0x66, 0x63, 0x38, 0x6F, 0x0A, 0x4C, 0x54, 0x57, 0x34, 0x6C, 0x56, 0x59, 0x61, 0x38, 0x62, 0x4A, 0x59, 0x53, 0x37, 0x63, 0x53, 0x4E, 0x38, 0x68, 0x38, 0x73, + 0x2B, 0x31, 0x4C, 0x67, 0x4F, 0x47, 0x4E, 0x2B, 0x6A, 0x49, 0x6A, 0x74, 0x6D, 0x2B, 0x33, 0x53, 0x4A, 0x55, 0x49, 0x73, 0x55, 0x52, 0x4F, 0x68, 0x59, 0x77, 0x36, 0x41, 0x6C, 0x51, 0x67, 0x4C, 0x39, 0x2B, 0x2F, 0x56, 0x30, 0x38, 0x37, 0x4F, + 0x70, 0x41, 0x68, 0x31, 0x38, 0x45, 0x6D, 0x4E, 0x56, 0x51, 0x67, 0x37, 0x4D, 0x63, 0x2F, 0x0A, 0x52, 0x2B, 0x7A, 0x76, 0x57, 0x72, 0x39, 0x4C, 0x65, 0x73, 0x47, 0x74, 0x4F, 0x78, 0x64, 0x51, 0x58, 0x47, 0x4C, 0x59, 0x44, 0x30, 0x74, 0x4B, + 0x33, 0x43, 0x76, 0x36, 0x62, 0x72, 0x78, 0x7A, 0x6B, 0x73, 0x33, 0x73, 0x78, 0x31, 0x44, 0x6F, 0x51, 0x5A, 0x62, 0x58, 0x71, 0x58, 0x35, 0x74, 0x32, 0x4F, 0x6B, 0x64, 0x6A, 0x34, 0x71, 0x31, 0x75, 0x56, 0x69, 0x53, 0x75, 0x6B, 0x71, 0x53, + 0x4B, 0x77, 0x78, 0x57, 0x2F, 0x59, 0x44, 0x72, 0x43, 0x50, 0x42, 0x65, 0x0A, 0x4B, 0x57, 0x34, 0x62, 0x48, 0x41, 0x79, 0x76, 0x6A, 0x35, 0x4F, 0x4A, 0x72, 0x64, 0x75, 0x39, 0x6F, 0x35, 0x34, 0x68, 0x79, 0x6F, 0x6B, 0x5A, 0x37, 0x4E, 0x2B, + 0x31, 0x77, 0x78, 0x72, 0x72, 0x46, 0x76, 0x35, 0x34, 0x4E, 0x6B, 0x7A, 0x57, 0x62, 0x74, 0x41, 0x2B, 0x46, 0x78, 0x79, 0x51, 0x46, 0x32, 0x73, 0x6D, 0x75, 0x76, 0x74, 0x36, 0x4C, 0x37, 0x38, 0x52, 0x48, 0x42, 0x67, 0x4F, 0x4C, 0x58, 0x4D, + 0x44, 0x6A, 0x36, 0x44, 0x6C, 0x4E, 0x61, 0x42, 0x61, 0x0A, 0x34, 0x6B, 0x78, 0x31, 0x48, 0x58, 0x48, 0x68, 0x4F, 0x54, 0x68, 0x54, 0x65, 0x45, 0x44, 0x4D, 0x67, 0x35, 0x50, 0x58, 0x43, 0x70, 0x36, 0x64, 0x57, 0x34, 0x2B, 0x4B, 0x35, 0x4F, + 0x58, 0x67, 0x53, 0x4F, 0x52, 0x49, 0x73, 0x6B, 0x66, 0x4E, 0x54, 0x69, 0x70, 0x31, 0x4B, 0x6E, 0x76, 0x79, 0x49, 0x76, 0x62, 0x4A, 0x76, 0x67, 0x6D, 0x52, 0x6C, 0x6C, 0x64, 0x36, 0x69, 0x49, 0x69, 0x73, 0x37, 0x6E, 0x43, 0x73, 0x2B, 0x64, + 0x77, 0x70, 0x34, 0x77, 0x77, 0x63, 0x0A, 0x4F, 0x78, 0x4A, 0x4F, 0x52, 0x4E, 0x61, 0x6E, 0x54, 0x72, 0x41, 0x6D, 0x79, 0x50, 0x50, 0x5A, 0x47, 0x70, 0x65, 0x52, 0x61, 0x4F, 0x72, 0x76, 0x6A, 0x55, 0x59, 0x47, 0x30, 0x6C, 0x5A, 0x46, 0x57, + 0x4A, 0x6F, 0x38, 0x44, 0x41, 0x2B, 0x44, 0x75, 0x41, 0x55, 0x6C, 0x77, 0x7A, 0x6E, 0x50, 0x4F, 0x36, 0x51, 0x30, 0x69, 0x62, 0x64, 0x35, 0x45, 0x69, 0x39, 0x48, 0x78, 0x65, 0x65, 0x70, 0x6C, 0x32, 0x6E, 0x38, 0x70, 0x6E, 0x64, 0x6E, 0x74, + 0x64, 0x39, 0x37, 0x0A, 0x38, 0x58, 0x70, 0x6C, 0x46, 0x65, 0x52, 0x68, 0x56, 0x6D, 0x55, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, + 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, + 0x0A, 0x42, 0x42, 0x59, 0x45, 0x46, 0x49, 0x48, 0x45, 0x6A, 0x4D, 0x7A, 0x31, 0x35, 0x44, 0x44, 0x2F, 0x70, 0x51, 0x77, 0x49, 0x58, 0x34, 0x77, 0x56, 0x5A, 0x79, 0x46, 0x30, 0x41, 0x64, 0x2F, 0x66, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, + 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x41, 0x54, 0x5A, 0x53, 0x4C, 0x31, 0x6A, 0x69, 0x75, 0x74, 0x52, 0x4F, 0x54, 0x4C, 0x2F, 0x37, 0x6C, 0x6F, 0x0A, 0x35, 0x73, + 0x4F, 0x41, 0x53, 0x44, 0x30, 0x45, 0x65, 0x2F, 0x6F, 0x6A, 0x4C, 0x33, 0x72, 0x74, 0x4E, 0x74, 0x71, 0x79, 0x7A, 0x6D, 0x33, 0x32, 0x35, 0x70, 0x37, 0x6C, 0x58, 0x31, 0x69, 0x50, 0x79, 0x7A, 0x63, 0x79, 0x6F, 0x63, 0x68, 0x6C, 0x74, 0x71, + 0x34, 0x34, 0x50, 0x54, 0x55, 0x62, 0x50, 0x72, 0x77, 0x37, 0x74, 0x67, 0x54, 0x51, 0x76, 0x50, 0x6C, 0x4A, 0x39, 0x5A, 0x76, 0x33, 0x68, 0x63, 0x55, 0x32, 0x74, 0x73, 0x75, 0x38, 0x2B, 0x4D, 0x67, 0x35, 0x0A, 0x31, 0x65, 0x52, 0x66, 0x42, + 0x37, 0x30, 0x56, 0x56, 0x4A, 0x64, 0x30, 0x79, 0x73, 0x72, 0x74, 0x54, 0x37, 0x71, 0x36, 0x5A, 0x48, 0x61, 0x66, 0x67, 0x62, 0x69, 0x45, 0x52, 0x55, 0x6C, 0x4D, 0x6A, 0x57, 0x2B, 0x69, 0x36, 0x37, 0x48, 0x4D, 0x30, 0x63, 0x4F, 0x55, 0x32, + 0x6B, 0x54, 0x43, 0x35, 0x75, 0x4C, 0x71, 0x47, 0x4F, 0x69, 0x69, 0x48, 0x79, 0x63, 0x46, 0x75, 0x74, 0x66, 0x6C, 0x31, 0x71, 0x6E, 0x4E, 0x33, 0x65, 0x39, 0x32, 0x6D, 0x49, 0x30, 0x41, 0x0A, 0x44, 0x73, 0x30, 0x62, 0x2B, 0x67, 0x4F, 0x33, + 0x6A, 0x6F, 0x42, 0x59, 0x44, 0x69, 0x63, 0x2F, 0x55, 0x76, 0x75, 0x55, 0x6F, 0x73, 0x70, 0x65, 0x5A, 0x63, 0x6E, 0x57, 0x68, 0x4E, 0x71, 0x35, 0x4E, 0x58, 0x48, 0x7A, 0x4A, 0x73, 0x42, 0x50, 0x64, 0x2B, 0x61, 0x42, 0x4A, 0x39, 0x4A, 0x33, + 0x4F, 0x35, 0x6F, 0x55, 0x62, 0x33, 0x6E, 0x30, 0x39, 0x74, 0x44, 0x68, 0x30, 0x35, 0x53, 0x36, 0x30, 0x46, 0x64, 0x52, 0x76, 0x53, 0x63, 0x46, 0x44, 0x63, 0x48, 0x39, 0x0A, 0x79, 0x42, 0x49, 0x77, 0x37, 0x6D, 0x2B, 0x4E, 0x45, 0x53, 0x73, + 0x49, 0x6E, 0x64, 0x54, 0x55, 0x76, 0x34, 0x42, 0x46, 0x46, 0x4A, 0x71, 0x49, 0x52, 0x4E, 0x6F, 0x77, 0x36, 0x72, 0x53, 0x6E, 0x34, 0x2B, 0x37, 0x76, 0x57, 0x34, 0x4C, 0x56, 0x50, 0x74, 0x61, 0x74, 0x65, 0x4A, 0x4C, 0x62, 0x58, 0x44, 0x7A, + 0x7A, 0x32, 0x4B, 0x33, 0x36, 0x75, 0x47, 0x74, 0x2F, 0x78, 0x44, 0x59, 0x6F, 0x74, 0x67, 0x49, 0x56, 0x69, 0x6C, 0x51, 0x73, 0x6E, 0x4C, 0x41, 0x58, 0x0A, 0x63, 0x34, 0x37, 0x51, 0x4E, 0x36, 0x4D, 0x55, 0x50, 0x4A, 0x69, 0x56, 0x41, 0x41, + 0x77, 0x70, 0x42, 0x56, 0x75, 0x65, 0x53, 0x55, 0x6D, 0x78, 0x58, 0x38, 0x66, 0x6A, 0x79, 0x38, 0x38, 0x6E, 0x5A, 0x59, 0x34, 0x31, 0x46, 0x37, 0x64, 0x58, 0x79, 0x44, 0x44, 0x5A, 0x51, 0x56, 0x75, 0x35, 0x46, 0x4C, 0x62, 0x6F, 0x77, 0x67, + 0x2B, 0x55, 0x4D, 0x61, 0x65, 0x55, 0x6D, 0x4D, 0x78, 0x71, 0x36, 0x37, 0x58, 0x68, 0x4A, 0x2F, 0x55, 0x51, 0x71, 0x41, 0x48, 0x6F, 0x0A, 0x6A, 0x68, 0x4A, 0x69, 0x36, 0x49, 0x6A, 0x4D, 0x74, 0x58, 0x39, 0x47, 0x6C, 0x38, 0x43, 0x62, 0x45, + 0x47, 0x59, 0x34, 0x47, 0x6A, 0x5A, 0x47, 0x58, 0x79, 0x4A, 0x6F, 0x50, 0x64, 0x2F, 0x4A, 0x78, 0x68, 0x4D, 0x6E, 0x71, 0x31, 0x4D, 0x47, 0x72, 0x4B, 0x49, 0x38, 0x68, 0x67, 0x5A, 0x6C, 0x62, 0x37, 0x46, 0x2B, 0x73, 0x53, 0x6C, 0x45, 0x6D, + 0x71, 0x4F, 0x36, 0x53, 0x57, 0x6B, 0x6F, 0x61, 0x59, 0x2F, 0x58, 0x35, 0x56, 0x2B, 0x74, 0x42, 0x49, 0x5A, 0x6B, 0x0A, 0x62, 0x78, 0x71, 0x67, 0x44, 0x4D, 0x55, 0x49, 0x59, 0x73, 0x36, 0x41, 0x6F, 0x39, 0x44, 0x7A, 0x37, 0x47, 0x6A, 0x65, + 0x76, 0x6A, 0x50, 0x48, 0x46, 0x31, 0x74, 0x2F, 0x67, 0x4D, 0x52, 0x4D, 0x54, 0x4C, 0x47, 0x6D, 0x68, 0x49, 0x72, 0x44, 0x4F, 0x37, 0x67, 0x4A, 0x7A, 0x52, 0x53, 0x42, 0x75, 0x68, 0x6A, 0x6A, 0x56, 0x46, 0x63, 0x32, 0x2F, 0x74, 0x73, 0x76, + 0x66, 0x45, 0x65, 0x68, 0x4F, 0x6A, 0x50, 0x49, 0x2B, 0x56, 0x67, 0x37, 0x52, 0x45, 0x2B, 0x78, 0x0A, 0x79, 0x67, 0x4B, 0x4A, 0x42, 0x4A, 0x59, 0x6F, 0x61, 0x4D, 0x56, 0x4C, 0x75, 0x43, 0x61, 0x4A, 0x75, 0x39, 0x59, 0x7A, 0x4C, 0x31, 0x44, + 0x56, 0x2F, 0x70, 0x71, 0x4A, 0x75, 0x68, 0x67, 0x79, 0x6B, 0x6C, 0x54, 0x47, 0x57, 0x2B, 0x43, 0x64, 0x2B, 0x56, 0x37, 0x6C, 0x44, 0x53, 0x4B, 0x62, 0x39, 0x74, 0x72, 0x69, 0x79, 0x43, 0x47, 0x79, 0x59, 0x69, 0x47, 0x71, 0x68, 0x6B, 0x43, + 0x79, 0x4C, 0x6D, 0x54, 0x54, 0x58, 0x38, 0x6A, 0x6A, 0x66, 0x68, 0x46, 0x6E, 0x0A, 0x52, 0x52, 0x38, 0x46, 0x2F, 0x75, 0x4F, 0x69, 0x37, 0x37, 0x4F, 0x6F, 0x73, 0x2F, 0x4E, 0x39, 0x6A, 0x2F, 0x67, 0x4D, 0x48, 0x79, 0x49, 0x66, 0x4C, 0x58, + 0x43, 0x30, 0x75, 0x41, 0x45, 0x30, 0x64, 0x6A, 0x41, 0x41, 0x35, 0x53, 0x4E, 0x34, 0x70, 0x31, 0x62, 0x58, 0x55, 0x42, 0x2B, 0x4B, 0x2B, 0x77, 0x62, 0x31, 0x77, 0x68, 0x6E, 0x77, 0x30, 0x41, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x55, 0x43, 0x41, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x20, 0x56, 0x61, 0x6C, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x57, 0x6A, 0x43, 0x43, 0x41, 0x30, 0x4B, 0x67, + 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x54, 0x39, 0x49, 0x72, 0x6A, 0x2F, 0x56, 0x6B, 0x79, 0x44, 0x4F, 0x65, 0x54, 0x7A, 0x52, 0x59, 0x5A, 0x69, 0x4E, 0x77, 0x59, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, + 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x43, 0x67, 0x77, 0x49, 0x56, 0x57, 0x35, 0x70, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x56, 0x44, 0x51, 0x53, 0x42, 0x46, 0x65, 0x48, 0x52, + 0x6C, 0x62, 0x6D, 0x52, 0x6C, 0x5A, 0x43, 0x42, 0x57, 0x59, 0x57, 0x78, 0x70, 0x5A, 0x47, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x55, 0x77, 0x4D, 0x7A, + 0x45, 0x7A, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x78, 0x4D, 0x6A, 0x4D, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x49, 0x56, 0x57, 0x35, 0x70, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x78, 0x4A, + 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x48, 0x46, 0x56, 0x44, 0x51, 0x53, 0x42, 0x46, 0x65, 0x48, 0x52, 0x6C, 0x62, 0x6D, 0x52, 0x6C, 0x5A, 0x43, 0x42, 0x57, 0x59, 0x57, 0x78, 0x70, 0x5A, 0x47, 0x46, 0x30, 0x61, + 0x57, 0x39, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x77, 0x67, 0x67, 0x49, 0x69, 0x0A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, + 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x70, 0x43, 0x51, 0x63, 0x6F, 0x45, 0x77, 0x4B, 0x77, 0x6D, 0x65, 0x42, 0x6B, 0x71, 0x68, 0x35, 0x44, 0x46, 0x6E, 0x70, 0x7A, 0x73, 0x5A, 0x47, 0x67, + 0x64, 0x54, 0x36, 0x6F, 0x2B, 0x75, 0x4D, 0x34, 0x41, 0x48, 0x72, 0x73, 0x0A, 0x69, 0x57, 0x6F, 0x67, 0x44, 0x34, 0x76, 0x46, 0x73, 0x4A, 0x73, 0x7A, 0x41, 0x31, 0x71, 0x47, 0x78, 0x6C, 0x69, 0x47, 0x31, 0x63, 0x47, 0x46, 0x75, 0x30, 0x2F, + 0x47, 0x6E, 0x45, 0x42, 0x4E, 0x79, 0x72, 0x37, 0x75, 0x61, 0x5A, 0x61, 0x34, 0x72, 0x59, 0x45, 0x77, 0x6D, 0x6E, 0x79, 0x53, 0x42, 0x65, 0x73, 0x46, 0x4B, 0x35, 0x70, 0x49, 0x30, 0x4C, 0x68, 0x32, 0x50, 0x70, 0x62, 0x49, 0x49, 0x4C, 0x76, + 0x53, 0x73, 0x50, 0x47, 0x50, 0x32, 0x4B, 0x78, 0x46, 0x0A, 0x52, 0x76, 0x2B, 0x71, 0x5A, 0x32, 0x43, 0x30, 0x64, 0x33, 0x35, 0x71, 0x48, 0x7A, 0x77, 0x61, 0x55, 0x6E, 0x6F, 0x45, 0x50, 0x51, 0x63, 0x38, 0x68, 0x51, 0x32, 0x45, 0x30, 0x42, + 0x39, 0x32, 0x43, 0x76, 0x64, 0x71, 0x46, 0x4E, 0x39, 0x79, 0x34, 0x7A, 0x52, 0x38, 0x56, 0x30, 0x35, 0x57, 0x41, 0x54, 0x35, 0x35, 0x38, 0x61, 0x6F, 0x70, 0x4F, 0x32, 0x7A, 0x36, 0x2B, 0x49, 0x39, 0x74, 0x54, 0x63, 0x67, 0x31, 0x33, 0x36, + 0x37, 0x72, 0x33, 0x43, 0x54, 0x75, 0x0A, 0x65, 0x55, 0x57, 0x6E, 0x68, 0x62, 0x59, 0x46, 0x69, 0x4E, 0x36, 0x49, 0x58, 0x53, 0x56, 0x38, 0x6C, 0x32, 0x52, 0x6E, 0x43, 0x64, 0x6D, 0x2F, 0x57, 0x68, 0x55, 0x46, 0x68, 0x76, 0x4D, 0x4A, 0x48, + 0x75, 0x78, 0x59, 0x4D, 0x6A, 0x4D, 0x52, 0x38, 0x33, 0x64, 0x6B, 0x73, 0x48, 0x59, 0x66, 0x35, 0x42, 0x41, 0x31, 0x46, 0x78, 0x76, 0x79, 0x44, 0x72, 0x46, 0x73, 0x70, 0x43, 0x71, 0x6A, 0x63, 0x2F, 0x77, 0x4A, 0x48, 0x78, 0x34, 0x79, 0x47, + 0x56, 0x4D, 0x52, 0x0A, 0x35, 0x39, 0x6D, 0x7A, 0x4C, 0x43, 0x35, 0x32, 0x4C, 0x71, 0x47, 0x6A, 0x33, 0x6E, 0x35, 0x71, 0x69, 0x41, 0x6E, 0x6F, 0x38, 0x67, 0x65, 0x4B, 0x2B, 0x4C, 0x4C, 0x4E, 0x45, 0x4F, 0x66, 0x69, 0x63, 0x30, 0x43, 0x54, + 0x75, 0x77, 0x6A, 0x52, 0x50, 0x2B, 0x48, 0x38, 0x43, 0x35, 0x53, 0x7A, 0x4A, 0x65, 0x39, 0x38, 0x70, 0x74, 0x66, 0x52, 0x72, 0x35, 0x2F, 0x2F, 0x6C, 0x70, 0x72, 0x31, 0x6B, 0x58, 0x75, 0x59, 0x43, 0x33, 0x66, 0x55, 0x66, 0x75, 0x67, 0x48, + 0x0A, 0x30, 0x6D, 0x4B, 0x31, 0x6C, 0x54, 0x6E, 0x6A, 0x38, 0x2F, 0x46, 0x74, 0x44, 0x77, 0x35, 0x6C, 0x68, 0x49, 0x70, 0x6A, 0x56, 0x4D, 0x57, 0x41, 0x74, 0x75, 0x43, 0x65, 0x53, 0x33, 0x31, 0x48, 0x4A, 0x71, 0x63, 0x42, 0x43, 0x46, 0x33, + 0x52, 0x69, 0x4A, 0x37, 0x58, 0x77, 0x7A, 0x4A, 0x45, 0x2B, 0x6F, 0x4A, 0x4B, 0x43, 0x6D, 0x68, 0x55, 0x66, 0x7A, 0x68, 0x54, 0x41, 0x38, 0x79, 0x6B, 0x41, 0x44, 0x4E, 0x6B, 0x55, 0x56, 0x6B, 0x4C, 0x6F, 0x34, 0x4B, 0x52, 0x0A, 0x65, 0x6C, + 0x37, 0x73, 0x46, 0x73, 0x4C, 0x7A, 0x4B, 0x75, 0x5A, 0x69, 0x32, 0x69, 0x72, 0x62, 0x57, 0x57, 0x49, 0x51, 0x4A, 0x55, 0x6F, 0x71, 0x67, 0x51, 0x74, 0x48, 0x42, 0x30, 0x4D, 0x47, 0x63, 0x49, 0x66, 0x53, 0x2B, 0x70, 0x4D, 0x52, 0x4B, 0x58, + 0x70, 0x49, 0x54, 0x65, 0x75, 0x55, 0x78, 0x33, 0x42, 0x4E, 0x72, 0x32, 0x66, 0x56, 0x55, 0x62, 0x47, 0x41, 0x49, 0x41, 0x45, 0x42, 0x74, 0x48, 0x6F, 0x49, 0x70, 0x70, 0x42, 0x2F, 0x54, 0x75, 0x44, 0x76, 0x0A, 0x42, 0x30, 0x47, 0x48, 0x72, + 0x32, 0x71, 0x6C, 0x58, 0x6F, 0x76, 0x37, 0x7A, 0x31, 0x43, 0x79, 0x6D, 0x6C, 0x53, 0x76, 0x77, 0x34, 0x6D, 0x36, 0x57, 0x43, 0x33, 0x31, 0x4D, 0x4A, 0x69, 0x78, 0x4E, 0x6E, 0x49, 0x35, 0x66, 0x6B, 0x6B, 0x45, 0x2F, 0x53, 0x6D, 0x6E, 0x54, + 0x48, 0x6E, 0x6B, 0x42, 0x56, 0x66, 0x62, 0x6C, 0x4C, 0x6B, 0x57, 0x55, 0x34, 0x31, 0x47, 0x73, 0x78, 0x32, 0x56, 0x59, 0x56, 0x64, 0x57, 0x66, 0x36, 0x2F, 0x77, 0x46, 0x6C, 0x74, 0x68, 0x0A, 0x57, 0x47, 0x38, 0x32, 0x55, 0x42, 0x45, 0x4C, + 0x32, 0x4B, 0x77, 0x72, 0x6C, 0x52, 0x59, 0x61, 0x44, 0x68, 0x38, 0x49, 0x7A, 0x54, 0x59, 0x30, 0x5A, 0x52, 0x42, 0x69, 0x5A, 0x74, 0x57, 0x41, 0x58, 0x78, 0x51, 0x67, 0x58, 0x79, 0x30, 0x4D, 0x6F, 0x48, 0x67, 0x4B, 0x61, 0x4E, 0x59, 0x73, + 0x31, 0x2B, 0x6C, 0x76, 0x4B, 0x39, 0x4A, 0x4B, 0x42, 0x5A, 0x50, 0x38, 0x6E, 0x6D, 0x39, 0x72, 0x5A, 0x2F, 0x2B, 0x49, 0x38, 0x55, 0x36, 0x6C, 0x61, 0x55, 0x70, 0x53, 0x0A, 0x4E, 0x77, 0x58, 0x71, 0x78, 0x68, 0x61, 0x4E, 0x30, 0x73, 0x53, + 0x5A, 0x30, 0x59, 0x49, 0x72, 0x4F, 0x37, 0x6F, 0x31, 0x64, 0x66, 0x64, 0x52, 0x55, 0x56, 0x6A, 0x7A, 0x79, 0x41, 0x66, 0x64, 0x35, 0x4C, 0x51, 0x44, 0x66, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, + 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x32, 0x58, 0x51, 0x36, 0x35, 0x44, 0x41, 0x39, 0x44, 0x66, 0x63, 0x53, 0x0A, 0x33, 0x48, 0x35, 0x61, 0x42, 0x5A, 0x38, 0x65, 0x4E, 0x4A, 0x72, 0x33, 0x34, 0x52, + 0x51, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, + 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x0A, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x44, 0x61, 0x4E, 0x6C, 0x38, 0x78, 0x43, 0x46, + 0x57, 0x51, 0x70, 0x4E, 0x35, 0x73, 0x6D, 0x4C, 0x4E, 0x62, 0x37, 0x72, 0x68, 0x56, 0x70, 0x4C, 0x47, 0x73, 0x61, 0x47, 0x76, 0x64, 0x66, 0x74, 0x76, 0x6B, 0x48, 0x54, 0x46, 0x6E, 0x71, 0x38, 0x38, 0x6E, 0x49, 0x75, 0x61, 0x37, 0x4D, 0x75, + 0x69, 0x35, 0x36, 0x33, 0x4D, 0x44, 0x31, 0x73, 0x43, 0x33, 0x41, 0x4F, 0x36, 0x2B, 0x66, 0x63, 0x41, 0x55, 0x52, 0x0A, 0x61, 0x70, 0x38, 0x6C, 0x54, 0x77, 0x45, 0x70, 0x63, 0x4F, 0x50, 0x6C, 0x44, 0x4F, 0x48, 0x71, 0x57, 0x6E, 0x7A, 0x63, + 0x53, 0x62, 0x76, 0x42, 0x48, 0x69, 0x71, 0x42, 0x39, 0x52, 0x5A, 0x4C, 0x63, 0x70, 0x48, 0x49, 0x6F, 0x6A, 0x47, 0x35, 0x71, 0x74, 0x72, 0x38, 0x6E, 0x52, 0x2F, 0x7A, 0x58, 0x55, 0x41, 0x43, 0x45, 0x2F, 0x78, 0x4F, 0x48, 0x41, 0x62, 0x4B, + 0x73, 0x78, 0x53, 0x51, 0x56, 0x42, 0x63, 0x5A, 0x45, 0x68, 0x72, 0x78, 0x48, 0x39, 0x63, 0x4D, 0x0A, 0x61, 0x56, 0x72, 0x32, 0x63, 0x58, 0x6A, 0x30, 0x6C, 0x48, 0x32, 0x52, 0x43, 0x34, 0x37, 0x73, 0x6B, 0x46, 0x53, 0x4F, 0x76, 0x47, 0x2B, + 0x68, 0x54, 0x4B, 0x76, 0x38, 0x64, 0x47, 0x54, 0x39, 0x63, 0x5A, 0x72, 0x34, 0x51, 0x51, 0x65, 0x68, 0x7A, 0x5A, 0x48, 0x6B, 0x50, 0x4A, 0x72, 0x67, 0x6D, 0x7A, 0x49, 0x35, 0x63, 0x36, 0x73, 0x71, 0x31, 0x57, 0x6E, 0x49, 0x65, 0x4A, 0x45, + 0x6D, 0x4D, 0x58, 0x33, 0x69, 0x78, 0x7A, 0x44, 0x78, 0x2F, 0x42, 0x52, 0x34, 0x0A, 0x64, 0x78, 0x49, 0x4F, 0x45, 0x2F, 0x54, 0x64, 0x46, 0x70, 0x53, 0x2F, 0x53, 0x32, 0x64, 0x37, 0x63, 0x46, 0x4F, 0x46, 0x79, 0x72, 0x43, 0x37, 0x38, 0x7A, + 0x68, 0x4E, 0x4C, 0x4A, 0x41, 0x35, 0x77, 0x41, 0x33, 0x43, 0x58, 0x57, 0x76, 0x70, 0x34, 0x75, 0x58, 0x56, 0x69, 0x49, 0x33, 0x57, 0x4C, 0x4C, 0x2B, 0x72, 0x47, 0x37, 0x36, 0x31, 0x4B, 0x49, 0x63, 0x53, 0x46, 0x33, 0x52, 0x75, 0x2F, 0x48, + 0x33, 0x38, 0x6A, 0x39, 0x43, 0x48, 0x4A, 0x72, 0x41, 0x62, 0x0A, 0x2B, 0x37, 0x6C, 0x73, 0x71, 0x2B, 0x4B, 0x65, 0x50, 0x52, 0x58, 0x42, 0x4F, 0x79, 0x35, 0x6E, 0x41, 0x6C, 0x69, 0x52, 0x6E, 0x2B, 0x2F, 0x34, 0x51, 0x68, 0x38, 0x73, 0x74, + 0x32, 0x6A, 0x31, 0x64, 0x61, 0x33, 0x50, 0x74, 0x66, 0x62, 0x2F, 0x45, 0x58, 0x33, 0x43, 0x38, 0x43, 0x53, 0x6C, 0x72, 0x64, 0x50, 0x36, 0x6F, 0x44, 0x79, 0x70, 0x2B, 0x6C, 0x33, 0x63, 0x70, 0x61, 0x44, 0x76, 0x52, 0x4B, 0x53, 0x2B, 0x31, + 0x75, 0x6A, 0x6C, 0x35, 0x42, 0x4F, 0x57, 0x0A, 0x46, 0x33, 0x73, 0x47, 0x50, 0x6A, 0x4C, 0x74, 0x78, 0x37, 0x64, 0x43, 0x76, 0x48, 0x61, 0x6A, 0x32, 0x47, 0x55, 0x34, 0x4B, 0x7A, 0x67, 0x31, 0x55, 0x53, 0x45, 0x4F, 0x44, 0x6D, 0x38, 0x75, + 0x4E, 0x42, 0x4E, 0x41, 0x34, 0x53, 0x74, 0x6E, 0x44, 0x47, 0x31, 0x4B, 0x51, 0x54, 0x41, 0x59, 0x49, 0x31, 0x6F, 0x79, 0x56, 0x5A, 0x6E, 0x4A, 0x46, 0x2B, 0x41, 0x38, 0x33, 0x76, 0x62, 0x73, 0x65, 0x61, 0x30, 0x72, 0x57, 0x42, 0x6D, 0x69, + 0x72, 0x53, 0x77, 0x69, 0x0A, 0x47, 0x70, 0x57, 0x4F, 0x76, 0x70, 0x61, 0x51, 0x58, 0x55, 0x4A, 0x58, 0x78, 0x50, 0x6B, 0x55, 0x41, 0x7A, 0x55, 0x72, 0x48, 0x43, 0x31, 0x52, 0x56, 0x77, 0x69, 0x6E, 0x4F, 0x74, 0x34, 0x2F, 0x35, 0x4D, 0x69, + 0x30, 0x41, 0x33, 0x50, 0x43, 0x77, 0x53, 0x61, 0x41, 0x75, 0x77, 0x74, 0x43, 0x48, 0x36, 0x30, 0x4E, 0x72, 0x79, 0x5A, 0x79, 0x32, 0x73, 0x79, 0x2B, 0x73, 0x36, 0x4F, 0x44, 0x57, 0x41, 0x32, 0x43, 0x78, 0x52, 0x39, 0x47, 0x55, 0x65, 0x4F, + 0x63, 0x0A, 0x47, 0x4D, 0x79, 0x4E, 0x6D, 0x34, 0x33, 0x73, 0x53, 0x65, 0x74, 0x31, 0x55, 0x4E, 0x57, 0x4D, 0x4B, 0x46, 0x6E, 0x4B, 0x64, 0x44, 0x54, 0x61, 0x6A, 0x41, 0x73, 0x68, 0x71, 0x78, 0x37, 0x71, 0x47, 0x2B, 0x58, 0x48, 0x2F, 0x52, + 0x55, 0x2B, 0x77, 0x42, 0x65, 0x71, 0x2B, 0x79, 0x4E, 0x75, 0x4A, 0x6B, 0x62, 0x4C, 0x2B, 0x76, 0x6D, 0x78, 0x63, 0x6D, 0x74, 0x70, 0x7A, 0x79, 0x4B, 0x45, 0x43, 0x32, 0x49, 0x50, 0x72, 0x4E, 0x6B, 0x5A, 0x41, 0x4A, 0x53, 0x69, 0x0A, 0x64, + 0x6A, 0x7A, 0x55, 0x4C, 0x5A, 0x72, 0x74, 0x42, 0x4A, 0x34, 0x74, 0x42, 0x6D, 0x49, 0x51, 0x4E, 0x31, 0x49, 0x63, 0x68, 0x58, 0x49, 0x62, 0x4A, 0x2B, 0x58, 0x4D, 0x78, 0x6A, 0x48, 0x73, 0x4E, 0x2B, 0x78, 0x6A, 0x57, 0x5A, 0x73, 0x4C, 0x48, + 0x58, 0x62, 0x4D, 0x66, 0x6A, 0x4B, 0x61, 0x69, 0x4A, 0x55, 0x49, 0x4E, 0x6C, 0x4B, 0x37, 0x33, 0x6E, 0x5A, 0x66, 0x64, 0x6B, 0x6C, 0x4A, 0x72, 0x58, 0x2B, 0x39, 0x5A, 0x53, 0x43, 0x79, 0x79, 0x63, 0x45, 0x72, 0x0A, 0x64, 0x68, 0x68, 0x32, + 0x6E, 0x31, 0x61, 0x78, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x69, 0x67, 0x6E, 0x61, + 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x47, 0x57, 0x7A, 0x43, 0x43, 0x42, 0x45, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, 0x41, 0x4D, 0x72, 0x70, 0x47, 0x34, + 0x6E, 0x78, 0x56, 0x51, 0x4D, 0x4E, 0x6F, 0x2B, 0x5A, 0x42, 0x62, 0x63, 0x54, 0x6A, 0x70, 0x75, 0x45, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x57, 0x6A, + 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x6C, 0x49, 0x78, 0x45, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x43, 0x55, 0x52, 0x6F, 0x61, 0x57, 0x31, 0x35, 0x62, + 0x33, 0x52, 0x70, 0x63, 0x7A, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x77, 0x77, 0x54, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x69, 0x41, 0x30, 0x4F, 0x44, 0x45, 0x30, 0x4E, 0x6A, 0x4D, 0x77, 0x4F, 0x44, 0x45, 0x77, 0x4D, + 0x44, 0x41, 0x7A, 0x4E, 0x6A, 0x45, 0x5A, 0x0A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x51, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x6D, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, + 0x51, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4D, 0x7A, 0x45, 0x77, 0x4D, 0x44, 0x45, 0x77, 0x4F, 0x44, 0x4D, 0x79, 0x4D, 0x6A, 0x64, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4D, 0x7A, 0x45, 0x77, 0x4D, 0x44, 0x45, 0x77, 0x4F, 0x44, 0x4D, 0x79, + 0x4D, 0x6A, 0x64, 0x61, 0x0A, 0x4D, 0x46, 0x6F, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x5A, 0x53, 0x4D, 0x52, 0x49, 0x77, 0x45, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x6C, + 0x45, 0x61, 0x47, 0x6C, 0x74, 0x65, 0x57, 0x39, 0x30, 0x61, 0x58, 0x4D, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x45, 0x7A, 0x41, 0x77, 0x4D, 0x44, 0x49, 0x67, 0x4E, 0x44, 0x67, 0x78, 0x4E, 0x44, 0x59, + 0x7A, 0x0A, 0x4D, 0x44, 0x67, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x7A, 0x59, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x45, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x32, 0x35, 0x68, 0x49, 0x46, + 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x0A, 0x44, + 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x4E, 0x47, 0x44, 0x6C, 0x6C, 0x47, 0x6C, 0x6D, 0x78, 0x36, 0x6D, 0x51, 0x57, 0x44, 0x6F, 0x79, 0x55, 0x4A, 0x4A, 0x56, 0x38, 0x67, 0x39, 0x50, 0x46, 0x4F, + 0x53, 0x62, 0x63, 0x44, 0x4F, 0x38, 0x57, 0x56, 0x34, 0x33, 0x58, 0x32, 0x4B, 0x79, 0x6A, 0x51, 0x6E, 0x2B, 0x43, 0x79, 0x75, 0x33, 0x4E, 0x57, 0x39, 0x73, 0x4F, 0x74, 0x79, 0x33, 0x74, 0x52, 0x51, 0x67, 0x58, 0x0A, 0x73, 0x74, 0x6D, 0x7A, + 0x79, 0x39, 0x59, 0x58, 0x55, 0x6E, 0x49, 0x6F, 0x32, 0x34, 0x35, 0x4F, 0x6E, 0x6F, 0x71, 0x32, 0x43, 0x2F, 0x6D, 0x65, 0x68, 0x4A, 0x70, 0x4E, 0x64, 0x74, 0x34, 0x69, 0x4B, 0x56, 0x7A, 0x53, 0x73, 0x39, 0x49, 0x47, 0x50, 0x6A, 0x41, 0x35, + 0x71, 0x58, 0x53, 0x6A, 0x6B, 0x6C, 0x59, 0x63, 0x6F, 0x57, 0x39, 0x4D, 0x43, 0x69, 0x42, 0x74, 0x6E, 0x79, 0x4E, 0x36, 0x74, 0x4D, 0x62, 0x61, 0x4C, 0x4F, 0x51, 0x64, 0x4C, 0x4E, 0x79, 0x7A, 0x0A, 0x4B, 0x4E, 0x41, 0x54, 0x38, 0x6B, 0x78, + 0x4F, 0x41, 0x6B, 0x6D, 0x68, 0x56, 0x45, 0x43, 0x65, 0x35, 0x75, 0x55, 0x46, 0x6F, 0x43, 0x32, 0x45, 0x79, 0x50, 0x2B, 0x59, 0x62, 0x4E, 0x44, 0x72, 0x69, 0x68, 0x71, 0x45, 0x43, 0x42, 0x36, 0x33, 0x61, 0x43, 0x50, 0x75, 0x49, 0x39, 0x56, + 0x77, 0x7A, 0x6D, 0x31, 0x52, 0x61, 0x52, 0x44, 0x75, 0x6F, 0x58, 0x72, 0x43, 0x30, 0x53, 0x49, 0x78, 0x77, 0x6F, 0x4B, 0x46, 0x30, 0x76, 0x4A, 0x56, 0x64, 0x6C, 0x42, 0x38, 0x0A, 0x4A, 0x58, 0x72, 0x4A, 0x68, 0x46, 0x77, 0x4C, 0x72, 0x4E, + 0x31, 0x43, 0x54, 0x69, 0x76, 0x6E, 0x67, 0x71, 0x49, 0x6B, 0x69, 0x63, 0x75, 0x51, 0x73, 0x74, 0x44, 0x75, 0x49, 0x37, 0x70, 0x6D, 0x54, 0x4C, 0x74, 0x69, 0x70, 0x50, 0x6C, 0x54, 0x57, 0x6D, 0x52, 0x37, 0x66, 0x4A, 0x6A, 0x36, 0x6F, 0x30, + 0x69, 0x65, 0x44, 0x35, 0x57, 0x75, 0x70, 0x78, 0x6A, 0x30, 0x61, 0x75, 0x77, 0x75, 0x41, 0x30, 0x57, 0x76, 0x38, 0x48, 0x54, 0x34, 0x4B, 0x73, 0x31, 0x36, 0x0A, 0x58, 0x64, 0x47, 0x2B, 0x52, 0x43, 0x59, 0x79, 0x4B, 0x66, 0x48, 0x78, 0x39, + 0x57, 0x7A, 0x4D, 0x66, 0x67, 0x49, 0x68, 0x43, 0x35, 0x39, 0x76, 0x70, 0x44, 0x2B, 0x2B, 0x6E, 0x56, 0x50, 0x69, 0x7A, 0x33, 0x32, 0x70, 0x4C, 0x48, 0x78, 0x59, 0x47, 0x70, 0x66, 0x68, 0x50, 0x54, 0x63, 0x33, 0x47, 0x47, 0x59, 0x6F, 0x30, + 0x6B, 0x44, 0x46, 0x55, 0x59, 0x71, 0x4D, 0x77, 0x79, 0x33, 0x4F, 0x55, 0x34, 0x67, 0x6B, 0x57, 0x47, 0x51, 0x77, 0x46, 0x73, 0x57, 0x71, 0x0A, 0x34, 0x4E, 0x59, 0x4B, 0x70, 0x6B, 0x44, 0x66, 0x65, 0x50, 0x62, 0x31, 0x42, 0x48, 0x78, 0x70, + 0x45, 0x34, 0x53, 0x38, 0x30, 0x64, 0x47, 0x6E, 0x42, 0x73, 0x38, 0x42, 0x39, 0x32, 0x6A, 0x41, 0x71, 0x46, 0x65, 0x37, 0x4F, 0x6D, 0x47, 0x74, 0x42, 0x49, 0x79, 0x54, 0x34, 0x36, 0x33, 0x38, 0x38, 0x4E, 0x74, 0x45, 0x62, 0x56, 0x6E, 0x63, + 0x53, 0x56, 0x6D, 0x75, 0x72, 0x4A, 0x71, 0x5A, 0x4E, 0x6A, 0x42, 0x42, 0x65, 0x33, 0x59, 0x7A, 0x49, 0x6F, 0x65, 0x6A, 0x0A, 0x77, 0x70, 0x4B, 0x47, 0x62, 0x76, 0x6C, 0x77, 0x37, 0x71, 0x36, 0x48, 0x68, 0x35, 0x55, 0x62, 0x78, 0x48, 0x71, + 0x39, 0x4D, 0x66, 0x50, 0x55, 0x30, 0x75, 0x57, 0x5A, 0x2F, 0x37, 0x35, 0x49, 0x37, 0x48, 0x58, 0x31, 0x65, 0x42, 0x59, 0x64, 0x70, 0x6E, 0x44, 0x42, 0x66, 0x7A, 0x77, 0x62, 0x6F, 0x5A, 0x4C, 0x37, 0x7A, 0x38, 0x67, 0x38, 0x31, 0x73, 0x57, + 0x54, 0x43, 0x6F, 0x2F, 0x31, 0x56, 0x54, 0x70, 0x32, 0x6C, 0x63, 0x35, 0x5A, 0x6D, 0x49, 0x6F, 0x4A, 0x0A, 0x6C, 0x58, 0x63, 0x79, 0x6D, 0x6F, 0x4F, 0x36, 0x4C, 0x41, 0x51, 0x36, 0x6C, 0x37, 0x33, 0x55, 0x4C, 0x37, 0x37, 0x58, 0x62, 0x4A, + 0x75, 0x69, 0x79, 0x6E, 0x31, 0x74, 0x4A, 0x73, 0x6C, 0x56, 0x31, 0x63, 0x2F, 0x44, 0x65, 0x56, 0x49, 0x49, 0x43, 0x5A, 0x6B, 0x48, 0x4A, 0x43, 0x31, 0x6B, 0x4A, 0x57, 0x75, 0x6D, 0x49, 0x57, 0x6D, 0x62, 0x61, 0x74, 0x31, 0x30, 0x54, 0x57, + 0x75, 0x58, 0x65, 0x6B, 0x47, 0x39, 0x71, 0x78, 0x66, 0x35, 0x6B, 0x42, 0x64, 0x49, 0x0A, 0x6A, 0x7A, 0x62, 0x35, 0x4C, 0x64, 0x58, 0x46, 0x32, 0x2B, 0x36, 0x71, 0x68, 0x55, 0x56, 0x42, 0x2B, 0x73, 0x30, 0x36, 0x52, 0x62, 0x46, 0x6F, 0x35, + 0x6A, 0x5A, 0x4D, 0x6D, 0x35, 0x42, 0x58, 0x37, 0x43, 0x4F, 0x35, 0x68, 0x77, 0x6A, 0x43, 0x78, 0x41, 0x6E, 0x78, 0x6C, 0x34, 0x59, 0x71, 0x4B, 0x45, 0x33, 0x69, 0x64, 0x4D, 0x44, 0x61, 0x78, 0x49, 0x7A, 0x62, 0x33, 0x2B, 0x4B, 0x68, 0x46, + 0x31, 0x6E, 0x4F, 0x4A, 0x46, 0x6C, 0x30, 0x4D, 0x64, 0x70, 0x2F, 0x0A, 0x2F, 0x54, 0x42, 0x74, 0x32, 0x64, 0x7A, 0x68, 0x61, 0x75, 0x48, 0x38, 0x58, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x49, 0x42, 0x47, 0x6A, 0x43, 0x43, + 0x41, 0x52, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, + 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x0A, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x42, 0x69, 0x48, 0x56, 0x75, 0x42, 0x75, 0x64, 0x2B, 0x34, 0x6B, 0x4E, 0x54, 0x78, 0x4F, 0x63, 0x35, 0x6F, + 0x66, 0x31, 0x75, 0x48, 0x69, 0x65, 0x58, 0x34, 0x72, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x42, 0x69, 0x48, 0x56, 0x75, 0x42, 0x75, 0x64, 0x2B, 0x34, 0x6B, 0x4E, 0x54, 0x78, + 0x4F, 0x63, 0x35, 0x6F, 0x66, 0x0A, 0x31, 0x75, 0x48, 0x69, 0x65, 0x58, 0x34, 0x72, 0x4D, 0x45, 0x51, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x41, 0x51, 0x39, 0x4D, 0x44, 0x73, 0x77, 0x4F, 0x51, 0x59, 0x45, 0x56, 0x52, 0x30, 0x67, 0x41, 0x44, + 0x41, 0x78, 0x4D, 0x43, 0x38, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x49, 0x42, 0x46, 0x69, 0x4E, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x63, 0x7A, 0x6F, 0x76, 0x4C, 0x33, 0x64, 0x33, 0x64, 0x33, 0x63, 0x75, 0x59, 0x32, + 0x56, 0x79, 0x0A, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x6D, 0x45, 0x75, 0x5A, 0x6E, 0x49, 0x76, 0x59, 0x58, 0x56, 0x30, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x47, 0x56, 0x7A, 0x4C, 0x7A, 0x42, 0x74, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x38, 0x45, 0x5A, + 0x6A, 0x42, 0x6B, 0x4D, 0x43, 0x2B, 0x67, 0x4C, 0x61, 0x41, 0x72, 0x68, 0x69, 0x6C, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x6D, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x32, 0x35, 0x68, 0x0A, + 0x4C, 0x6D, 0x5A, 0x79, 0x4C, 0x32, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x70, 0x5A, 0x32, 0x35, 0x68, 0x63, 0x6D, 0x39, 0x76, 0x64, 0x47, 0x4E, 0x68, 0x4C, 0x6D, 0x4E, 0x79, 0x62, 0x44, 0x41, 0x78, 0x6F, 0x43, 0x2B, 0x67, 0x4C, 0x59, 0x59, 0x72, + 0x61, 0x48, 0x52, 0x30, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x32, 0x4E, 0x79, 0x62, 0x43, 0x35, 0x6B, 0x61, 0x47, 0x6C, 0x74, 0x65, 0x57, 0x39, 0x30, 0x61, 0x58, 0x4D, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4C, 0x32, 0x4E, 0x6C, 0x0A, 0x63, 0x6E, 0x52, + 0x70, 0x5A, 0x32, 0x35, 0x68, 0x63, 0x6D, 0x39, 0x76, 0x64, 0x47, 0x4E, 0x68, 0x4C, 0x6D, 0x4E, 0x79, 0x62, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, + 0x43, 0x41, 0x67, 0x45, 0x41, 0x6C, 0x4C, 0x69, 0x65, 0x54, 0x2F, 0x44, 0x6A, 0x6C, 0x51, 0x67, 0x69, 0x35, 0x38, 0x31, 0x6F, 0x51, 0x66, 0x63, 0x63, 0x56, 0x64, 0x56, 0x38, 0x41, 0x4F, 0x49, 0x74, 0x0A, 0x4F, 0x6F, 0x6C, 0x64, 0x61, 0x44, + 0x67, 0x76, 0x55, 0x53, 0x49, 0x4C, 0x53, 0x6F, 0x33, 0x4C, 0x36, 0x62, 0x74, 0x64, 0x50, 0x72, 0x74, 0x63, 0x50, 0x62, 0x45, 0x6F, 0x2F, 0x75, 0x52, 0x54, 0x56, 0x52, 0x50, 0x50, 0x6F, 0x5A, 0x41, 0x62, 0x41, 0x68, 0x31, 0x66, 0x5A, 0x6B, + 0x59, 0x4A, 0x4D, 0x79, 0x6A, 0x68, 0x44, 0x53, 0x53, 0x58, 0x63, 0x4E, 0x4D, 0x51, 0x48, 0x2B, 0x70, 0x6B, 0x56, 0x35, 0x61, 0x37, 0x58, 0x64, 0x72, 0x6E, 0x78, 0x49, 0x78, 0x50, 0x0A, 0x54, 0x47, 0x52, 0x47, 0x48, 0x56, 0x79, 0x48, 0x34, + 0x31, 0x6E, 0x65, 0x51, 0x74, 0x47, 0x62, 0x71, 0x48, 0x36, 0x6D, 0x69, 0x64, 0x32, 0x50, 0x48, 0x4D, 0x6B, 0x77, 0x67, 0x75, 0x30, 0x37, 0x6E, 0x4D, 0x33, 0x41, 0x36, 0x52, 0x6E, 0x67, 0x61, 0x74, 0x67, 0x43, 0x64, 0x54, 0x65, 0x72, 0x39, + 0x7A, 0x51, 0x6F, 0x4B, 0x4A, 0x48, 0x79, 0x42, 0x41, 0x70, 0x50, 0x4E, 0x65, 0x4E, 0x67, 0x4A, 0x67, 0x48, 0x36, 0x30, 0x42, 0x47, 0x4D, 0x2B, 0x52, 0x46, 0x71, 0x0A, 0x37, 0x71, 0x38, 0x39, 0x77, 0x31, 0x44, 0x54, 0x6A, 0x31, 0x38, 0x7A, + 0x65, 0x54, 0x79, 0x47, 0x71, 0x48, 0x4E, 0x46, 0x6B, 0x49, 0x77, 0x67, 0x74, 0x6E, 0x4A, 0x7A, 0x46, 0x79, 0x4F, 0x2B, 0x42, 0x32, 0x58, 0x6C, 0x65, 0x4A, 0x49, 0x4E, 0x75, 0x67, 0x48, 0x41, 0x36, 0x34, 0x77, 0x63, 0x5A, 0x72, 0x2B, 0x73, + 0x68, 0x6E, 0x63, 0x42, 0x6C, 0x41, 0x32, 0x63, 0x35, 0x75, 0x6B, 0x35, 0x6A, 0x52, 0x2B, 0x6D, 0x55, 0x59, 0x79, 0x5A, 0x44, 0x44, 0x6C, 0x33, 0x0A, 0x34, 0x62, 0x53, 0x62, 0x2B, 0x68, 0x78, 0x6E, 0x56, 0x32, 0x39, 0x71, 0x61, 0x6F, 0x36, + 0x70, 0x4B, 0x30, 0x78, 0x58, 0x65, 0x58, 0x70, 0x58, 0x49, 0x73, 0x2F, 0x4E, 0x58, 0x32, 0x4E, 0x47, 0x6A, 0x56, 0x78, 0x5A, 0x4F, 0x6F, 0x62, 0x34, 0x4D, 0x6B, 0x64, 0x69, 0x6F, 0x32, 0x63, 0x4E, 0x47, 0x4A, 0x48, 0x63, 0x2B, 0x36, 0x5A, + 0x72, 0x39, 0x55, 0x68, 0x68, 0x63, 0x79, 0x4E, 0x5A, 0x6A, 0x67, 0x4B, 0x6E, 0x76, 0x45, 0x54, 0x71, 0x39, 0x45, 0x6D, 0x64, 0x0A, 0x38, 0x56, 0x52, 0x59, 0x2B, 0x57, 0x43, 0x76, 0x32, 0x68, 0x69, 0x6B, 0x4C, 0x79, 0x68, 0x46, 0x33, 0x48, + 0x71, 0x67, 0x69, 0x49, 0x5A, 0x64, 0x38, 0x7A, 0x76, 0x6E, 0x2F, 0x79, 0x6B, 0x31, 0x67, 0x50, 0x78, 0x6B, 0x51, 0x35, 0x54, 0x6D, 0x34, 0x78, 0x78, 0x76, 0x76, 0x71, 0x30, 0x4F, 0x4B, 0x6D, 0x4F, 0x5A, 0x4B, 0x38, 0x6C, 0x2B, 0x68, 0x66, + 0x5A, 0x78, 0x36, 0x41, 0x59, 0x44, 0x6C, 0x66, 0x37, 0x65, 0x6A, 0x30, 0x67, 0x63, 0x57, 0x74, 0x53, 0x53, 0x0A, 0x36, 0x43, 0x76, 0x75, 0x35, 0x7A, 0x48, 0x62, 0x75, 0x67, 0x52, 0x71, 0x68, 0x35, 0x6A, 0x6E, 0x78, 0x56, 0x2F, 0x76, 0x66, + 0x61, 0x63, 0x69, 0x39, 0x77, 0x48, 0x59, 0x54, 0x66, 0x6D, 0x4A, 0x30, 0x41, 0x36, 0x61, 0x42, 0x56, 0x6D, 0x6B, 0x6E, 0x70, 0x6A, 0x5A, 0x62, 0x79, 0x76, 0x4B, 0x63, 0x4C, 0x35, 0x6B, 0x77, 0x6C, 0x57, 0x6A, 0x39, 0x4F, 0x6D, 0x76, 0x77, + 0x35, 0x49, 0x70, 0x33, 0x49, 0x67, 0x57, 0x4A, 0x4A, 0x6B, 0x38, 0x6A, 0x53, 0x61, 0x59, 0x0A, 0x74, 0x6C, 0x75, 0x33, 0x7A, 0x4D, 0x36, 0x33, 0x4E, 0x77, 0x66, 0x39, 0x4A, 0x74, 0x6D, 0x59, 0x68, 0x53, 0x54, 0x2F, 0x57, 0x53, 0x4D, 0x44, + 0x6D, 0x75, 0x32, 0x64, 0x6E, 0x61, 0x6A, 0x6B, 0x58, 0x6A, 0x6A, 0x4F, 0x31, 0x31, 0x49, 0x4E, 0x62, 0x39, 0x49, 0x2F, 0x62, 0x62, 0x45, 0x46, 0x61, 0x30, 0x6E, 0x4F, 0x69, 0x70, 0x46, 0x47, 0x63, 0x2F, 0x54, 0x32, 0x4C, 0x2F, 0x43, 0x6F, + 0x63, 0x33, 0x63, 0x4F, 0x5A, 0x61, 0x79, 0x68, 0x6A, 0x57, 0x5A, 0x53, 0x0A, 0x61, 0x58, 0x35, 0x4C, 0x61, 0x41, 0x7A, 0x48, 0x48, 0x6A, 0x63, 0x6E, 0x67, 0x36, 0x57, 0x4D, 0x78, 0x77, 0x4C, 0x6B, 0x46, 0x4D, 0x31, 0x4A, 0x41, 0x62, 0x42, + 0x7A, 0x73, 0x2F, 0x33, 0x47, 0x6B, 0x44, 0x70, 0x76, 0x30, 0x6D, 0x7A, 0x74, 0x4F, 0x2B, 0x37, 0x73, 0x6B, 0x62, 0x36, 0x69, 0x51, 0x31, 0x32, 0x4C, 0x41, 0x45, 0x70, 0x6D, 0x4A, 0x55, 0x52, 0x77, 0x33, 0x6B, 0x41, 0x50, 0x2B, 0x48, 0x77, + 0x56, 0x39, 0x36, 0x4C, 0x4F, 0x50, 0x4E, 0x64, 0x65, 0x0A, 0x45, 0x34, 0x79, 0x42, 0x46, 0x78, 0x67, 0x58, 0x30, 0x62, 0x33, 0x78, 0x64, 0x78, 0x41, 0x36, 0x31, 0x47, 0x55, 0x35, 0x77, 0x53, 0x65, 0x73, 0x56, 0x79, 0x77, 0x6C, 0x56, 0x50, + 0x2B, 0x69, 0x32, 0x6B, 0x2B, 0x4B, 0x59, 0x54, 0x6C, 0x65, 0x72, 0x6A, 0x31, 0x4B, 0x6A, 0x4C, 0x30, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x65, 0x6D, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x47, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x6C, 0x44, + 0x43, 0x43, 0x41, 0x6E, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4B, 0x4D, 0x66, 0x58, 0x6B, 0x59, 0x67, 0x78, 0x73, 0x57, 0x4F, 0x33, 0x57, 0x32, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, + 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x6E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x4A, 0x54, 0x6A, 0x45, 0x54, 0x0A, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, + 0x78, 0x4D, 0x4B, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x42, 0x4C, 0x53, 0x54, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x63, 0x5A, 0x55, 0x31, 0x31, 0x5A, 0x47, 0x68, 0x79, 0x59, + 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x67, 0x54, 0x47, 0x6C, 0x74, 0x61, 0x58, 0x52, 0x6C, 0x0A, 0x5A, 0x44, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, + 0x41, 0x78, 0x4D, 0x54, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4C, 0x53, 0x42, 0x48, 0x4D, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4F, 0x44, 0x41, 0x79, + 0x4D, 0x54, 0x67, 0x78, 0x4F, 0x44, 0x4D, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x7A, 0x41, 0x79, 0x4D, 0x54, 0x67, 0x78, 0x0A, 0x4F, 0x44, 0x4D, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x47, 0x63, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x6C, 0x4F, 0x4D, 0x52, 0x4D, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x77, 0x70, 0x6C, 0x62, 0x56, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x55, 0x45, 0x74, + 0x4A, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x78, 0x6C, 0x54, 0x58, 0x56, 0x6B, 0x0A, 0x61, 0x48, 0x4A, 0x68, 0x49, 0x46, 0x52, 0x6C, 0x59, 0x32, 0x68, 0x75, 0x62, 0x32, 0x78, 0x76, 0x5A, 0x32, + 0x6C, 0x6C, 0x63, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4E, 0x6C, 0x62, 0x56, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x55, 0x6D, + 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x63, 0x78, 0x4D, 0x49, 0x49, 0x42, 0x0A, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, + 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x6B, 0x30, 0x75, 0x37, 0x36, 0x57, 0x61, 0x4B, 0x37, 0x70, 0x31, 0x62, 0x31, 0x54, 0x53, 0x54, 0x30, 0x42, 0x73, 0x65, 0x77, + 0x2B, 0x65, 0x65, 0x75, 0x47, 0x51, 0x7A, 0x66, 0x32, 0x4E, 0x34, 0x61, 0x4C, 0x54, 0x4E, 0x0A, 0x4C, 0x6E, 0x46, 0x31, 0x31, 0x35, 0x73, 0x67, 0x78, 0x6B, 0x30, 0x70, 0x76, 0x4C, 0x5A, 0x6F, 0x59, 0x49, 0x72, 0x33, 0x49, 0x5A, 0x70, 0x57, + 0x4E, 0x56, 0x72, 0x7A, 0x64, 0x72, 0x33, 0x59, 0x7A, 0x5A, 0x72, 0x2F, 0x6B, 0x31, 0x5A, 0x4C, 0x70, 0x56, 0x6B, 0x47, 0x6F, 0x5A, 0x4D, 0x30, 0x4B, 0x64, 0x30, 0x57, 0x4E, 0x48, 0x56, 0x4F, 0x38, 0x6F, 0x47, 0x30, 0x78, 0x35, 0x5A, 0x4F, + 0x72, 0x52, 0x6B, 0x56, 0x55, 0x6B, 0x72, 0x2B, 0x50, 0x48, 0x42, 0x31, 0x0A, 0x63, 0x4D, 0x32, 0x76, 0x4B, 0x36, 0x73, 0x56, 0x6D, 0x6A, 0x4D, 0x38, 0x71, 0x72, 0x4F, 0x4C, 0x71, 0x73, 0x31, 0x44, 0x2F, 0x66, 0x58, 0x71, 0x63, 0x50, 0x2F, + 0x74, 0x7A, 0x78, 0x45, 0x37, 0x6C, 0x4D, 0x35, 0x4F, 0x4D, 0x68, 0x62, 0x54, 0x49, 0x30, 0x41, 0x71, 0x64, 0x37, 0x4F, 0x76, 0x50, 0x41, 0x45, 0x73, 0x62, 0x4F, 0x32, 0x5A, 0x4C, 0x49, 0x76, 0x5A, 0x54, 0x6D, 0x6D, 0x59, 0x73, 0x76, 0x65, + 0x50, 0x51, 0x62, 0x41, 0x79, 0x65, 0x47, 0x48, 0x57, 0x0A, 0x44, 0x56, 0x2F, 0x44, 0x2B, 0x71, 0x4A, 0x41, 0x6B, 0x68, 0x31, 0x63, 0x46, 0x2B, 0x5A, 0x77, 0x50, 0x6A, 0x58, 0x6E, 0x6F, 0x72, 0x66, 0x43, 0x59, 0x75, 0x4B, 0x72, 0x70, 0x44, + 0x68, 0x4D, 0x74, 0x54, 0x6B, 0x31, 0x62, 0x2B, 0x6F, 0x44, 0x61, 0x66, 0x6F, 0x36, 0x56, 0x47, 0x69, 0x46, 0x62, 0x64, 0x62, 0x79, 0x4C, 0x30, 0x4E, 0x56, 0x48, 0x70, 0x45, 0x4E, 0x44, 0x74, 0x6A, 0x56, 0x61, 0x71, 0x53, 0x57, 0x30, 0x52, + 0x4D, 0x38, 0x4C, 0x48, 0x68, 0x51, 0x0A, 0x36, 0x44, 0x71, 0x53, 0x30, 0x68, 0x64, 0x57, 0x35, 0x54, 0x55, 0x61, 0x51, 0x42, 0x77, 0x2B, 0x6A, 0x53, 0x7A, 0x74, 0x4F, 0x64, 0x39, 0x43, 0x34, 0x49, 0x4E, 0x42, 0x64, 0x4E, 0x2B, 0x6A, 0x7A, + 0x63, 0x4B, 0x47, 0x59, 0x45, 0x68, 0x6F, 0x34, 0x32, 0x6B, 0x4C, 0x56, 0x41, 0x43, 0x4C, 0x35, 0x48, 0x5A, 0x70, 0x49, 0x51, 0x31, 0x35, 0x54, 0x6A, 0x51, 0x49, 0x58, 0x68, 0x54, 0x43, 0x7A, 0x4C, 0x47, 0x33, 0x72, 0x64, 0x64, 0x38, 0x63, + 0x49, 0x72, 0x48, 0x0A, 0x68, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x2B, 0x2B, 0x38, 0x4E, 0x68, 0x70, 0x36, 0x77, + 0x34, 0x39, 0x32, 0x70, 0x75, 0x66, 0x45, 0x68, 0x46, 0x33, 0x38, 0x2B, 0x2F, 0x50, 0x42, 0x33, 0x4B, 0x78, 0x6F, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, + 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, + 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x46, 0x6E, 0x2F, 0x38, 0x6F, 0x7A, 0x31, 0x68, 0x33, 0x31, 0x78, 0x50, 0x61, 0x4F, 0x66, 0x47, 0x31, 0x76, 0x52, 0x32, 0x76, 0x6A, 0x54, 0x6E, 0x47, 0x73, 0x32, 0x0A, 0x76, 0x5A, + 0x75, 0x70, 0x59, 0x65, 0x76, 0x65, 0x46, 0x69, 0x78, 0x30, 0x50, 0x5A, 0x37, 0x6D, 0x64, 0x64, 0x72, 0x58, 0x75, 0x71, 0x65, 0x38, 0x51, 0x68, 0x66, 0x6E, 0x50, 0x5A, 0x48, 0x72, 0x35, 0x58, 0x33, 0x64, 0x50, 0x70, 0x7A, 0x78, 0x7A, 0x35, + 0x4B, 0x73, 0x62, 0x45, 0x6A, 0x4D, 0x77, 0x69, 0x49, 0x2F, 0x61, 0x54, 0x76, 0x46, 0x74, 0x68, 0x55, 0x76, 0x6F, 0x7A, 0x58, 0x47, 0x61, 0x43, 0x6F, 0x63, 0x56, 0x36, 0x38, 0x35, 0x37, 0x34, 0x33, 0x51, 0x0A, 0x4E, 0x63, 0x4D, 0x59, 0x44, + 0x48, 0x73, 0x41, 0x56, 0x68, 0x7A, 0x4E, 0x69, 0x78, 0x6C, 0x30, 0x33, 0x72, 0x34, 0x50, 0x45, 0x75, 0x44, 0x51, 0x71, 0x71, 0x45, 0x2F, 0x41, 0x6A, 0x53, 0x78, 0x63, 0x4D, 0x36, 0x64, 0x47, 0x4E, 0x59, 0x49, 0x41, 0x77, 0x6C, 0x47, 0x37, + 0x6D, 0x44, 0x67, 0x66, 0x72, 0x62, 0x45, 0x53, 0x51, 0x52, 0x52, 0x66, 0x58, 0x42, 0x67, 0x76, 0x4B, 0x71, 0x79, 0x2F, 0x33, 0x6C, 0x79, 0x65, 0x71, 0x59, 0x64, 0x50, 0x56, 0x38, 0x71, 0x0A, 0x2B, 0x4D, 0x72, 0x69, 0x2F, 0x54, 0x6D, 0x33, + 0x52, 0x37, 0x6E, 0x72, 0x66, 0x74, 0x38, 0x45, 0x49, 0x36, 0x2F, 0x36, 0x6E, 0x41, 0x59, 0x48, 0x36, 0x66, 0x74, 0x6A, 0x6B, 0x34, 0x42, 0x41, 0x74, 0x63, 0x5A, 0x73, 0x43, 0x6A, 0x45, 0x6F, 0x7A, 0x67, 0x79, 0x66, 0x7A, 0x37, 0x4D, 0x6A, + 0x4E, 0x59, 0x42, 0x42, 0x6A, 0x57, 0x7A, 0x45, 0x4E, 0x33, 0x75, 0x42, 0x4C, 0x34, 0x43, 0x68, 0x51, 0x45, 0x4B, 0x46, 0x36, 0x64, 0x6B, 0x34, 0x6A, 0x65, 0x69, 0x68, 0x0A, 0x55, 0x38, 0x30, 0x42, 0x76, 0x32, 0x6E, 0x6F, 0x57, 0x67, 0x62, + 0x79, 0x52, 0x51, 0x75, 0x51, 0x2B, 0x71, 0x37, 0x68, 0x76, 0x35, 0x33, 0x79, 0x72, 0x6C, 0x63, 0x38, 0x70, 0x61, 0x36, 0x79, 0x56, 0x76, 0x53, 0x4C, 0x5A, 0x55, 0x44, 0x70, 0x2F, 0x54, 0x47, 0x42, 0x4C, 0x50, 0x51, 0x35, 0x43, 0x64, 0x6A, + 0x75, 0x61, 0x36, 0x65, 0x30, 0x70, 0x68, 0x30, 0x56, 0x70, 0x5A, 0x6A, 0x33, 0x41, 0x59, 0x48, 0x59, 0x68, 0x58, 0x33, 0x7A, 0x55, 0x56, 0x78, 0x78, 0x0A, 0x69, 0x4E, 0x36, 0x36, 0x7A, 0x42, 0x2B, 0x41, 0x66, 0x6B, 0x6F, 0x3D, 0x0A, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x65, 0x6D, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, + 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x54, 0x6A, 0x43, 0x43, 0x41, 0x64, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, + 0x49, 0x4B, 0x50, 0x50, 0x59, 0x48, 0x71, 0x57, 0x68, 0x77, 0x44, 0x74, 0x71, 0x4C, 0x68, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x72, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x4A, 0x54, 0x6A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x4B, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x42, 0x4C, 0x53, + 0x54, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x63, 0x5A, 0x55, 0x31, 0x31, 0x5A, 0x47, 0x68, 0x79, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, + 0x58, 0x4D, 0x67, 0x54, 0x47, 0x6C, 0x74, 0x61, 0x58, 0x52, 0x6C, 0x5A, 0x44, 0x45, 0x67, 0x0A, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x58, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x45, 0x56, 0x44, + 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x52, 0x7A, 0x4D, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x67, 0x77, 0x4D, 0x6A, 0x45, 0x34, 0x4D, 0x54, 0x67, 0x7A, 0x4D, 0x44, 0x41, 0x77, + 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x4D, 0x77, 0x4D, 0x6A, 0x45, 0x34, 0x0A, 0x4D, 0x54, 0x67, 0x7A, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x72, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, + 0x4A, 0x54, 0x6A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x4B, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x42, 0x4C, 0x53, 0x54, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x43, 0x68, 0x4D, 0x63, 0x5A, 0x55, 0x31, 0x31, 0x0A, 0x5A, 0x47, 0x68, 0x79, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x67, 0x54, 0x47, 0x6C, 0x74, 0x61, 0x58, + 0x52, 0x6C, 0x5A, 0x44, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x58, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, + 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x0A, 0x52, 0x7A, 0x4D, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, + 0x41, 0x51, 0x6A, 0x70, 0x51, 0x79, 0x34, 0x4C, 0x52, 0x4C, 0x31, 0x4B, 0x50, 0x4F, 0x78, 0x73, 0x74, 0x33, 0x69, 0x41, 0x68, 0x4B, 0x41, 0x6E, 0x6A, 0x6C, 0x66, 0x53, 0x55, 0x32, 0x66, 0x79, 0x53, 0x55, 0x30, 0x57, 0x58, 0x54, 0x73, 0x75, + 0x77, 0x59, 0x63, 0x0A, 0x35, 0x38, 0x42, 0x79, 0x72, 0x2B, 0x69, 0x75, 0x4C, 0x2B, 0x46, 0x42, 0x56, 0x49, 0x63, 0x55, 0x71, 0x45, 0x71, 0x79, 0x36, 0x48, 0x79, 0x43, 0x35, 0x6C, 0x74, 0x71, 0x74, 0x64, 0x79, 0x7A, 0x64, 0x63, 0x36, 0x4C, + 0x42, 0x74, 0x43, 0x47, 0x49, 0x37, 0x39, 0x47, 0x31, 0x59, 0x34, 0x50, 0x50, 0x77, 0x54, 0x30, 0x31, 0x78, 0x79, 0x53, 0x66, 0x76, 0x61, 0x6C, 0x59, 0x38, 0x4C, 0x31, 0x58, 0x34, 0x34, 0x75, 0x54, 0x36, 0x45, 0x59, 0x47, 0x51, 0x49, 0x72, + 0x0A, 0x4D, 0x67, 0x71, 0x43, 0x5A, 0x48, 0x30, 0x57, 0x6B, 0x39, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x38, 0x58, 0x51, 0x4B, 0x45, 0x45, 0x39, 0x54, + 0x4D, 0x69, 0x70, 0x75, 0x42, 0x7A, 0x68, 0x63, 0x63, 0x4C, 0x69, 0x6B, 0x65, 0x6E, 0x45, 0x68, 0x6A, 0x51, 0x6A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, + 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, + 0x4E, 0x70, 0x41, 0x44, 0x42, 0x6D, 0x41, 0x6A, 0x45, 0x41, 0x76, 0x76, 0x4E, 0x68, 0x7A, 0x77, 0x49, 0x51, 0x48, 0x57, 0x53, 0x56, 0x42, 0x37, 0x67, 0x59, 0x62, 0x6F, 0x69, 0x46, 0x42, 0x53, 0x2B, 0x44, 0x0A, 0x43, 0x42, 0x65, 0x51, 0x79, + 0x68, 0x2B, 0x4B, 0x54, 0x4F, 0x67, 0x4E, 0x47, 0x33, 0x71, 0x78, 0x72, 0x64, 0x57, 0x42, 0x43, 0x55, 0x66, 0x76, 0x4F, 0x36, 0x77, 0x49, 0x42, 0x48, 0x78, 0x63, 0x6D, 0x62, 0x48, 0x74, 0x52, 0x77, 0x66, 0x53, 0x41, 0x6A, 0x45, 0x41, 0x6E, + 0x62, 0x70, 0x56, 0x2F, 0x4B, 0x6C, 0x4B, 0x36, 0x4F, 0x33, 0x74, 0x35, 0x6E, 0x59, 0x42, 0x51, 0x6E, 0x76, 0x49, 0x2B, 0x47, 0x44, 0x5A, 0x6A, 0x56, 0x47, 0x4C, 0x56, 0x54, 0x76, 0x37, 0x0A, 0x6A, 0x48, 0x76, 0x72, 0x5A, 0x51, 0x6E, 0x44, + 0x2B, 0x4A, 0x62, 0x4E, 0x52, 0x36, 0x69, 0x43, 0x38, 0x68, 0x5A, 0x56, 0x64, 0x79, 0x52, 0x2B, 0x45, 0x68, 0x43, 0x56, 0x42, 0x43, 0x79, 0x6A, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x65, 0x6D, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x43, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x4D, 0x49, 0x49, 0x44, 0x63, 0x7A, 0x43, 0x43, 0x41, 0x6C, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4C, 0x41, 0x4B, 0x37, 0x50, 0x41, 0x4C, 0x72, 0x45, 0x7A, 0x7A, 0x4C, 0x34, 0x51, 0x37, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, + 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x56, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x0A, 0x45, 0x7A, 0x41, + 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x43, 0x6D, 0x56, 0x74, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x51, 0x53, 0x30, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x32, 0x56, + 0x4E, 0x64, 0x57, 0x52, 0x6F, 0x63, 0x6D, 0x45, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4E, 0x6C, 0x62, 0x56, 0x4E, 0x70, 0x0A, 0x5A, 0x32, 0x34, 0x67, 0x55, 0x6D, + 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x4D, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x34, 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x34, 0x4D, 0x7A, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, + 0x51, 0x7A, 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x34, 0x4D, 0x7A, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x56, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, + 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x43, 0x6D, 0x56, 0x74, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x51, 0x53, 0x30, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, + 0x32, 0x56, 0x4E, 0x64, 0x57, 0x52, 0x6F, 0x63, 0x6D, 0x45, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x45, 0x78, 0x4E, 0x6C, 0x62, 0x56, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, + 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x4D, 0x78, 0x4D, 0x49, 0x49, 0x42, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, + 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x51, 0x45, 0x41, 0x7A, 0x2B, 0x75, 0x70, 0x0A, 0x75, 0x66, 0x47, 0x5A, 0x42, 0x63, 0x7A, 0x59, 0x4B, 0x43, 0x46, 0x4B, 0x38, 0x33, 0x4D, + 0x30, 0x55, 0x59, 0x52, 0x57, 0x45, 0x50, 0x57, 0x67, 0x54, 0x79, 0x77, 0x53, 0x34, 0x2F, 0x6F, 0x54, 0x6D, 0x69, 0x66, 0x51, 0x7A, 0x2F, 0x6C, 0x35, 0x47, 0x6E, 0x52, 0x66, 0x48, 0x58, 0x6B, 0x35, 0x2F, 0x46, 0x76, 0x34, 0x63, 0x49, 0x37, + 0x67, 0x6B, 0x6C, 0x4C, 0x33, 0x35, 0x43, 0x58, 0x35, 0x56, 0x49, 0x50, 0x5A, 0x48, 0x64, 0x50, 0x49, 0x57, 0x6F, 0x55, 0x2F, 0x0A, 0x58, 0x73, 0x65, 0x32, 0x42, 0x2B, 0x34, 0x2B, 0x77, 0x4D, 0x36, 0x61, 0x72, 0x36, 0x78, 0x57, 0x51, 0x69, + 0x6F, 0x35, 0x4A, 0x58, 0x44, 0x57, 0x76, 0x37, 0x56, 0x37, 0x4E, 0x71, 0x32, 0x73, 0x39, 0x6E, 0x50, 0x63, 0x7A, 0x64, 0x63, 0x64, 0x69, 0x6F, 0x4F, 0x6C, 0x2B, 0x79, 0x75, 0x51, 0x46, 0x54, 0x64, 0x72, 0x48, 0x43, 0x5A, 0x48, 0x33, 0x44, + 0x73, 0x70, 0x56, 0x70, 0x4E, 0x71, 0x73, 0x38, 0x46, 0x71, 0x4F, 0x70, 0x30, 0x39, 0x39, 0x63, 0x47, 0x58, 0x0A, 0x4F, 0x46, 0x67, 0x46, 0x69, 0x78, 0x77, 0x52, 0x34, 0x2B, 0x53, 0x30, 0x75, 0x46, 0x32, 0x46, 0x48, 0x59, 0x50, 0x2B, 0x65, + 0x46, 0x38, 0x4C, 0x52, 0x57, 0x67, 0x59, 0x53, 0x4B, 0x56, 0x47, 0x63, 0x7A, 0x51, 0x37, 0x2F, 0x67, 0x2F, 0x49, 0x64, 0x72, 0x76, 0x48, 0x47, 0x50, 0x4D, 0x46, 0x30, 0x59, 0x62, 0x7A, 0x68, 0x65, 0x33, 0x6E, 0x75, 0x64, 0x6B, 0x79, 0x72, + 0x56, 0x57, 0x49, 0x7A, 0x71, 0x61, 0x32, 0x6B, 0x62, 0x42, 0x50, 0x72, 0x48, 0x34, 0x56, 0x0A, 0x49, 0x35, 0x62, 0x32, 0x50, 0x2F, 0x41, 0x67, 0x4E, 0x42, 0x62, 0x65, 0x43, 0x73, 0x62, 0x45, 0x42, 0x45, 0x56, 0x35, 0x66, 0x36, 0x66, 0x39, + 0x76, 0x74, 0x4B, 0x70, 0x70, 0x61, 0x2B, 0x63, 0x78, 0x53, 0x4D, 0x71, 0x39, 0x7A, 0x77, 0x68, 0x62, 0x4C, 0x32, 0x76, 0x6A, 0x30, 0x37, 0x46, 0x4F, 0x72, 0x4C, 0x7A, 0x4E, 0x42, 0x4C, 0x38, 0x33, 0x34, 0x41, 0x61, 0x53, 0x61, 0x54, 0x55, + 0x71, 0x5A, 0x58, 0x33, 0x6E, 0x6F, 0x6C, 0x65, 0x6F, 0x6F, 0x6D, 0x73, 0x0A, 0x6C, 0x4D, 0x75, 0x6F, 0x61, 0x4A, 0x75, 0x76, 0x69, 0x6D, 0x55, 0x6E, 0x7A, 0x59, 0x6E, 0x75, 0x33, 0x59, 0x79, 0x31, 0x61, 0x79, 0x6C, 0x77, 0x51, 0x36, 0x42, + 0x70, 0x43, 0x2B, 0x53, 0x35, 0x44, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x2F, 0x71, 0x48, 0x67, 0x63, 0x42, 0x34, + 0x71, 0x41, 0x7A, 0x6C, 0x53, 0x57, 0x6B, 0x4B, 0x2B, 0x0A, 0x58, 0x4A, 0x47, 0x46, 0x65, 0x68, 0x69, 0x71, 0x54, 0x62, 0x55, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, + 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, + 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x0A, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4D, 0x4A, 0x4B, 0x56, 0x76, 0x6F, 0x56, 0x49, 0x58, 0x73, 0x6F, 0x6F, 0x75, 0x6E, 0x6C, 0x48, 0x66, 0x76, 0x34, 0x4C, 0x63, 0x51, 0x35, 0x6C, 0x6B, 0x46, 0x4D, 0x4F, + 0x79, 0x63, 0x73, 0x78, 0x47, 0x77, 0x59, 0x46, 0x59, 0x44, 0x47, 0x72, 0x4B, 0x39, 0x48, 0x57, 0x53, 0x38, 0x6D, 0x43, 0x2B, 0x4D, 0x32, 0x73, 0x4F, 0x38, 0x37, 0x2F, 0x6B, 0x4F, 0x58, 0x53, 0x54, 0x4B, 0x5A, 0x45, 0x68, 0x56, 0x62, 0x33, + 0x78, 0x45, 0x70, 0x0A, 0x2F, 0x36, 0x74, 0x54, 0x2B, 0x4C, 0x76, 0x42, 0x65, 0x41, 0x2B, 0x73, 0x6E, 0x46, 0x4F, 0x76, 0x56, 0x37, 0x31, 0x6F, 0x6A, 0x44, 0x31, 0x70, 0x4D, 0x2F, 0x43, 0x6A, 0x6F, 0x43, 0x4E, 0x6A, 0x4F, 0x32, 0x52, 0x6E, + 0x49, 0x6B, 0x53, 0x74, 0x31, 0x58, 0x48, 0x4C, 0x56, 0x69, 0x70, 0x34, 0x6B, 0x71, 0x4E, 0x50, 0x45, 0x6A, 0x45, 0x32, 0x4E, 0x75, 0x4C, 0x65, 0x2F, 0x67, 0x44, 0x45, 0x6F, 0x32, 0x41, 0x50, 0x4A, 0x36, 0x32, 0x67, 0x73, 0x49, 0x71, 0x31, + 0x0A, 0x4E, 0x6E, 0x70, 0x53, 0x6F, 0x62, 0x30, 0x6E, 0x39, 0x43, 0x41, 0x6E, 0x59, 0x75, 0x68, 0x4E, 0x6C, 0x43, 0x51, 0x54, 0x35, 0x41, 0x6F, 0x45, 0x36, 0x54, 0x79, 0x72, 0x4C, 0x73, 0x68, 0x44, 0x43, 0x55, 0x72, 0x47, 0x59, 0x51, 0x54, + 0x6C, 0x53, 0x54, 0x52, 0x2B, 0x30, 0x38, 0x54, 0x49, 0x39, 0x51, 0x2F, 0x41, 0x71, 0x75, 0x6D, 0x36, 0x56, 0x46, 0x37, 0x7A, 0x59, 0x79, 0x74, 0x50, 0x54, 0x31, 0x44, 0x55, 0x2F, 0x72, 0x6C, 0x37, 0x6D, 0x59, 0x77, 0x39, 0x0A, 0x77, 0x43, + 0x36, 0x38, 0x41, 0x69, 0x76, 0x54, 0x78, 0x45, 0x44, 0x6B, 0x69, 0x67, 0x63, 0x78, 0x48, 0x70, 0x76, 0x4F, 0x4A, 0x70, 0x6B, 0x54, 0x2B, 0x78, 0x48, 0x71, 0x6D, 0x69, 0x49, 0x4D, 0x45, 0x52, 0x6E, 0x48, 0x58, 0x68, 0x75, 0x42, 0x55, 0x44, + 0x44, 0x49, 0x6C, 0x68, 0x4A, 0x75, 0x35, 0x38, 0x74, 0x42, 0x66, 0x35, 0x45, 0x37, 0x6F, 0x6B, 0x65, 0x33, 0x56, 0x49, 0x41, 0x62, 0x33, 0x41, 0x44, 0x4D, 0x6D, 0x70, 0x44, 0x71, 0x77, 0x38, 0x4E, 0x51, 0x0A, 0x42, 0x6D, 0x49, 0x4D, 0x4D, + 0x4D, 0x41, 0x56, 0x53, 0x4B, 0x65, 0x6F, 0x57, 0x58, 0x7A, 0x68, 0x72, 0x69, 0x4B, 0x69, 0x34, 0x67, 0x70, 0x36, 0x44, 0x2F, 0x70, 0x69, 0x71, 0x31, 0x4A, 0x4D, 0x34, 0x66, 0x48, 0x66, 0x79, 0x72, 0x36, 0x44, 0x44, 0x55, 0x49, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x65, 0x6D, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x43, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4B, 0x7A, 0x43, 0x43, 0x41, 0x62, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, + 0x67, 0x49, 0x4B, 0x65, 0x33, 0x47, 0x32, 0x67, 0x6C, 0x61, 0x34, 0x45, 0x6E, 0x79, 0x63, 0x71, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x61, 0x4D, 0x51, 0x73, 0x77, 0x43, + 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x54, 0x4D, 0x42, 0x45, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x4B, 0x5A, 0x57, 0x31, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x42, 0x4C, + 0x53, 0x54, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4C, 0x5A, 0x55, 0x31, 0x31, 0x5A, 0x47, 0x68, 0x79, 0x59, 0x53, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x78, 0x49, 0x44, 0x41, 0x65, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x4D, 0x54, 0x46, 0x32, 0x56, 0x74, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x46, 0x0A, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x4D, 0x7A, 0x4D, 0x42, 0x34, + 0x58, 0x44, 0x54, 0x45, 0x34, 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x34, 0x4D, 0x7A, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x7A, 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x44, 0x45, 0x34, 0x4D, 0x7A, 0x41, 0x77, 0x4D, 0x46, 0x6F, + 0x77, 0x57, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x54, 0x43, 0x6D, 0x56, 0x74, 0x55, 0x32, + 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x51, 0x53, 0x30, 0x6B, 0x78, 0x46, 0x44, 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x32, 0x56, 0x4E, 0x64, 0x57, 0x52, 0x6F, 0x63, 0x6D, 0x45, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4D, 0x53, + 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x45, 0x78, 0x64, 0x6C, 0x62, 0x56, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4C, + 0x53, 0x42, 0x44, 0x4D, 0x7A, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x50, 0x32, 0x6C, 0x59, + 0x61, 0x35, 0x37, 0x4A, 0x68, 0x41, 0x64, 0x0A, 0x36, 0x62, 0x63, 0x69, 0x4D, 0x4B, 0x34, 0x47, 0x39, 0x49, 0x47, 0x7A, 0x73, 0x55, 0x4A, 0x78, 0x6C, 0x54, 0x6D, 0x38, 0x30, 0x31, 0x4C, 0x6A, 0x72, 0x36, 0x2F, 0x35, 0x38, 0x70, 0x63, 0x31, + 0x6B, 0x6A, 0x5A, 0x47, 0x44, 0x6F, 0x65, 0x56, 0x6A, 0x62, 0x6B, 0x35, 0x57, 0x75, 0x6D, 0x37, 0x33, 0x39, 0x44, 0x2B, 0x79, 0x41, 0x64, 0x42, 0x50, 0x4C, 0x74, 0x56, 0x62, 0x34, 0x4F, 0x6A, 0x61, 0x76, 0x74, 0x69, 0x73, 0x49, 0x47, 0x4A, + 0x41, 0x6E, 0x42, 0x39, 0x0A, 0x53, 0x4D, 0x56, 0x4B, 0x34, 0x2B, 0x6B, 0x69, 0x56, 0x43, 0x4A, 0x4E, 0x6B, 0x37, 0x74, 0x43, 0x44, 0x4B, 0x39, 0x33, 0x6E, 0x43, 0x4F, 0x6D, 0x66, 0x64, 0x64, 0x68, 0x45, 0x63, 0x35, 0x6C, 0x78, 0x2F, 0x68, + 0x2F, 0x2F, 0x76, 0x58, 0x79, 0x71, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x50, 0x74, 0x61, 0x53, 0x4E, 0x43, 0x41, 0x49, 0x45, 0x44, 0x79, 0x71, 0x4F, 0x6B, + 0x41, 0x0A, 0x42, 0x32, 0x6B, 0x5A, 0x64, 0x36, 0x66, 0x6D, 0x77, 0x2F, 0x54, 0x50, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, + 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x67, 0x41, 0x0A, 0x4D, + 0x47, 0x55, 0x43, 0x4D, 0x51, 0x43, 0x30, 0x32, 0x43, 0x38, 0x43, 0x69, 0x66, 0x32, 0x32, 0x54, 0x47, 0x4B, 0x36, 0x51, 0x30, 0x34, 0x54, 0x68, 0x48, 0x4B, 0x31, 0x72, 0x74, 0x30, 0x63, 0x33, 0x74, 0x61, 0x31, 0x33, 0x46, 0x61, 0x50, 0x57, + 0x45, 0x42, 0x61, 0x4C, 0x64, 0x34, 0x67, 0x54, 0x43, 0x4B, 0x44, 0x79, 0x70, 0x4F, 0x6F, 0x66, 0x75, 0x34, 0x53, 0x51, 0x4D, 0x66, 0x57, 0x68, 0x30, 0x2F, 0x34, 0x33, 0x34, 0x55, 0x43, 0x4D, 0x42, 0x77, 0x55, 0x0A, 0x5A, 0x4F, 0x52, 0x38, + 0x6C, 0x6F, 0x4D, 0x52, 0x6E, 0x4C, 0x44, 0x52, 0x57, 0x6D, 0x46, 0x4C, 0x70, 0x67, 0x39, 0x4A, 0x30, 0x77, 0x44, 0x38, 0x6F, 0x66, 0x7A, 0x6B, 0x70, 0x66, 0x39, 0x2F, 0x72, 0x64, 0x63, 0x77, 0x30, 0x4D, 0x64, 0x33, 0x66, 0x37, 0x36, 0x42, + 0x42, 0x31, 0x55, 0x77, 0x55, 0x43, 0x41, 0x55, 0x39, 0x56, 0x63, 0x34, 0x43, 0x71, 0x67, 0x78, 0x55, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x6F, 0x6E, 0x67, 0x6B, 0x6F, 0x6E, 0x67, 0x20, 0x50, 0x6F, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x7A, 0x7A, 0x43, 0x43, 0x41, 0x37, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x43, 0x42, 0x5A, 0x66, 0x69, 0x6B, 0x79, 0x6C, 0x37, 0x41, 0x44, 0x4A, 0x6B, 0x30, 0x44, 0x66, + 0x78, 0x4D, 0x61, 0x75, 0x49, 0x37, 0x67, 0x63, 0x57, 0x71, 0x51, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x62, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, + 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x45, 0x73, 0x78, 0x45, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x55, 0x68, 0x76, 0x62, 0x6D, 0x63, 0x67, 0x53, 0x32, 0x39, 0x75, 0x5A, 0x7A, 0x45, + 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4D, 0x4A, 0x53, 0x47, 0x39, 0x75, 0x5A, 0x79, 0x42, 0x4C, 0x62, 0x32, 0x35, 0x6E, 0x4D, 0x52, 0x59, 0x77, 0x46, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x45, 0x77, + 0x31, 0x49, 0x62, 0x32, 0x35, 0x6E, 0x61, 0x32, 0x39, 0x75, 0x5A, 0x79, 0x42, 0x51, 0x62, 0x33, 0x4E, 0x30, 0x4D, 0x53, 0x41, 0x77, 0x48, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x64, 0x49, 0x62, 0x32, 0x35, 0x6E, 0x61, 0x32, + 0x39, 0x75, 0x5A, 0x79, 0x42, 0x51, 0x62, 0x33, 0x4E, 0x30, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x32, 0x0A, 0x4D, 0x44, 0x4D, 0x77, 0x4D, + 0x6A, 0x49, 0x35, 0x4E, 0x44, 0x5A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x32, 0x4D, 0x44, 0x4D, 0x77, 0x4D, 0x6A, 0x49, 0x35, 0x4E, 0x44, 0x5A, 0x61, 0x4D, 0x47, 0x38, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x59, 0x54, 0x41, 0x6B, 0x68, 0x4C, 0x4D, 0x52, 0x49, 0x77, 0x45, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, 0x77, 0x6C, 0x49, 0x62, 0x32, 0x35, 0x6E, 0x49, 0x45, 0x74, 0x76, 0x0A, 0x62, 0x6D, 0x63, 0x78, 0x45, 0x6A, 0x41, 0x51, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x43, 0x55, 0x68, 0x76, 0x62, 0x6D, 0x63, 0x67, 0x53, 0x32, 0x39, 0x75, 0x5A, 0x7A, 0x45, 0x57, 0x4D, 0x42, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4E, 0x53, 0x47, 0x39, 0x75, + 0x5A, 0x32, 0x74, 0x76, 0x62, 0x6D, 0x63, 0x67, 0x55, 0x47, 0x39, 0x7A, 0x64, 0x44, 0x45, 0x67, 0x4D, 0x42, 0x34, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x58, 0x0A, 0x53, 0x47, 0x39, 0x75, 0x5A, 0x32, 0x74, 0x76, 0x62, 0x6D, 0x63, + 0x67, 0x55, 0x47, 0x39, 0x7A, 0x64, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x4D, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, + 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x7A, 0x0A, 0x69, 0x4E, 0x66, 0x71, 0x7A, 0x67, 0x38, 0x67, 0x54, 0x72, 0x37, 0x6D, 0x31, 0x67, + 0x4E, 0x74, 0x37, 0x6C, 0x6E, 0x38, 0x77, 0x6C, 0x66, 0x66, 0x4B, 0x57, 0x69, 0x68, 0x67, 0x77, 0x34, 0x2B, 0x61, 0x4D, 0x64, 0x6F, 0x57, 0x4A, 0x77, 0x63, 0x59, 0x45, 0x75, 0x4A, 0x51, 0x77, 0x79, 0x35, 0x31, 0x42, 0x57, 0x79, 0x37, 0x73, + 0x46, 0x4F, 0x64, 0x65, 0x6D, 0x31, 0x70, 0x2B, 0x2F, 0x6C, 0x36, 0x54, 0x57, 0x5A, 0x35, 0x4D, 0x77, 0x63, 0x35, 0x30, 0x74, 0x66, 0x0A, 0x6A, 0x54, 0x4D, 0x77, 0x49, 0x44, 0x4E, 0x54, 0x32, 0x61, 0x61, 0x37, 0x31, 0x54, 0x34, 0x54, 0x6A, + 0x75, 0x6B, 0x66, 0x68, 0x30, 0x6D, 0x74, 0x55, 0x43, 0x31, 0x51, 0x79, 0x68, 0x69, 0x2B, 0x41, 0x56, 0x69, 0x69, 0x45, 0x33, 0x43, 0x57, 0x75, 0x34, 0x6D, 0x49, 0x56, 0x6F, 0x42, 0x63, 0x2B, 0x4C, 0x30, 0x73, 0x50, 0x4F, 0x46, 0x4D, 0x56, + 0x34, 0x69, 0x37, 0x30, 0x37, 0x6D, 0x56, 0x37, 0x38, 0x76, 0x48, 0x39, 0x74, 0x6F, 0x78, 0x64, 0x43, 0x69, 0x6D, 0x0A, 0x35, 0x6C, 0x53, 0x4A, 0x39, 0x55, 0x45, 0x78, 0x79, 0x75, 0x55, 0x6D, 0x47, 0x73, 0x32, 0x43, 0x34, 0x48, 0x44, 0x61, + 0x4F, 0x79, 0x6D, 0x37, 0x31, 0x51, 0x50, 0x31, 0x6D, 0x62, 0x70, 0x56, 0x39, 0x57, 0x54, 0x52, 0x59, 0x41, 0x36, 0x7A, 0x69, 0x55, 0x6D, 0x34, 0x69, 0x69, 0x38, 0x46, 0x30, 0x6F, 0x52, 0x46, 0x4B, 0x48, 0x79, 0x50, 0x61, 0x46, 0x41, 0x53, + 0x65, 0x50, 0x77, 0x4C, 0x74, 0x56, 0x50, 0x4C, 0x77, 0x70, 0x67, 0x63, 0x68, 0x4B, 0x4F, 0x65, 0x0A, 0x73, 0x4C, 0x34, 0x6A, 0x70, 0x4E, 0x72, 0x63, 0x79, 0x43, 0x73, 0x65, 0x32, 0x6D, 0x35, 0x46, 0x48, 0x6F, 0x6D, 0x59, 0x32, 0x76, 0x6B, + 0x41, 0x4C, 0x67, 0x62, 0x70, 0x44, 0x44, 0x74, 0x77, 0x31, 0x56, 0x41, 0x6C, 0x69, 0x4A, 0x6E, 0x4C, 0x7A, 0x58, 0x4E, 0x67, 0x39, 0x39, 0x58, 0x2F, 0x4E, 0x57, 0x66, 0x46, 0x6F, 0x62, 0x78, 0x65, 0x71, 0x38, 0x31, 0x4B, 0x75, 0x45, 0x58, + 0x72, 0x79, 0x47, 0x67, 0x65, 0x44, 0x51, 0x30, 0x55, 0x52, 0x68, 0x4C, 0x6A, 0x0A, 0x30, 0x6D, 0x52, 0x69, 0x69, 0x6B, 0x4B, 0x59, 0x76, 0x4C, 0x54, 0x47, 0x43, 0x41, 0x6A, 0x34, 0x2F, 0x61, 0x68, 0x4D, 0x5A, 0x4A, 0x78, 0x32, 0x41, 0x62, + 0x30, 0x76, 0x71, 0x57, 0x77, 0x7A, 0x44, 0x39, 0x67, 0x2F, 0x4B, 0x4C, 0x67, 0x38, 0x61, 0x51, 0x46, 0x43, 0x68, 0x6E, 0x35, 0x70, 0x77, 0x63, 0x6B, 0x47, 0x79, 0x75, 0x56, 0x36, 0x52, 0x6D, 0x58, 0x70, 0x77, 0x74, 0x5A, 0x51, 0x51, 0x53, + 0x34, 0x2F, 0x74, 0x2B, 0x54, 0x74, 0x62, 0x4E, 0x65, 0x2F, 0x0A, 0x4A, 0x67, 0x45, 0x52, 0x6F, 0x68, 0x59, 0x70, 0x53, 0x6D, 0x73, 0x30, 0x42, 0x70, 0x44, 0x73, 0x45, 0x39, 0x4B, 0x32, 0x2B, 0x32, 0x70, 0x32, 0x30, 0x6A, 0x7A, 0x74, 0x38, + 0x4E, 0x59, 0x74, 0x33, 0x65, 0x45, 0x56, 0x37, 0x4B, 0x4F, 0x62, 0x4C, 0x79, 0x7A, 0x4A, 0x50, 0x69, 0x76, 0x6B, 0x61, 0x54, 0x76, 0x2F, 0x63, 0x69, 0x57, 0x78, 0x4E, 0x6F, 0x5A, 0x62, 0x78, 0x33, 0x39, 0x72, 0x69, 0x31, 0x55, 0x62, 0x53, + 0x73, 0x55, 0x67, 0x59, 0x54, 0x32, 0x75, 0x0A, 0x79, 0x31, 0x44, 0x68, 0x43, 0x44, 0x71, 0x2B, 0x73, 0x49, 0x39, 0x6A, 0x51, 0x56, 0x4D, 0x77, 0x43, 0x46, 0x6B, 0x38, 0x6D, 0x42, 0x31, 0x33, 0x75, 0x6D, 0x4F, 0x52, 0x65, 0x73, 0x6F, 0x51, + 0x55, 0x47, 0x43, 0x2F, 0x38, 0x4E, 0x65, 0x38, 0x6C, 0x59, 0x65, 0x50, 0x6C, 0x38, 0x58, 0x2B, 0x6C, 0x32, 0x6F, 0x42, 0x6C, 0x4B, 0x4E, 0x38, 0x57, 0x34, 0x55, 0x64, 0x4B, 0x6A, 0x6B, 0x36, 0x30, 0x46, 0x53, 0x68, 0x30, 0x54, 0x6C, 0x78, + 0x6E, 0x66, 0x30, 0x68, 0x0A, 0x2B, 0x62, 0x56, 0x37, 0x38, 0x4F, 0x4C, 0x67, 0x41, 0x6F, 0x39, 0x75, 0x6C, 0x69, 0x51, 0x6C, 0x4C, 0x4B, 0x41, 0x65, 0x4C, 0x4B, 0x6A, 0x45, 0x69, 0x61, 0x66, 0x76, 0x37, 0x5A, 0x6B, 0x47, 0x4C, 0x37, 0x59, + 0x4B, 0x54, 0x45, 0x2F, 0x62, 0x6F, 0x73, 0x77, 0x33, 0x47, 0x71, 0x39, 0x48, 0x68, 0x53, 0x32, 0x4B, 0x58, 0x38, 0x51, 0x30, 0x4E, 0x45, 0x77, 0x41, 0x2F, 0x52, 0x69, 0x54, 0x5A, 0x78, 0x50, 0x52, 0x4E, 0x2B, 0x5A, 0x49, 0x74, 0x49, 0x73, + 0x47, 0x0A, 0x78, 0x56, 0x64, 0x37, 0x47, 0x59, 0x59, 0x4B, 0x65, 0x63, 0x73, 0x41, 0x79, 0x56, 0x4B, 0x76, 0x51, 0x76, 0x38, 0x33, 0x6A, 0x2B, 0x47, 0x6A, 0x48, 0x6E, 0x6F, 0x39, 0x55, 0x4B, 0x74, 0x6A, 0x42, 0x75, 0x63, 0x56, 0x74, 0x54, + 0x2B, 0x32, 0x52, 0x54, 0x65, 0x55, 0x4E, 0x37, 0x46, 0x2B, 0x38, 0x6B, 0x6A, 0x44, 0x66, 0x38, 0x56, 0x31, 0x2F, 0x70, 0x65, 0x4E, 0x52, 0x59, 0x38, 0x61, 0x70, 0x78, 0x70, 0x79, 0x4B, 0x42, 0x70, 0x41, 0x44, 0x77, 0x49, 0x44, 0x0A, 0x41, + 0x51, 0x41, 0x42, 0x6F, 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, + 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x51, 0x58, 0x6E, 0x63, 0x30, 0x65, 0x0A, 0x69, 0x39, 0x59, 0x35, + 0x4B, 0x33, 0x44, 0x54, 0x58, 0x4E, 0x53, 0x67, 0x75, 0x42, 0x2B, 0x77, 0x41, 0x50, 0x7A, 0x46, 0x59, 0x54, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x46, 0x35, 0x33, 0x4E, 0x48, 0x6F, 0x76, 0x57, + 0x4F, 0x53, 0x74, 0x77, 0x30, 0x31, 0x7A, 0x55, 0x6F, 0x4C, 0x67, 0x66, 0x73, 0x41, 0x44, 0x38, 0x78, 0x57, 0x45, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x0A, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, + 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x46, 0x62, 0x56, 0x65, 0x32, 0x37, 0x6D, 0x49, 0x67, 0x48, 0x53, 0x51, 0x70, 0x73, 0x59, 0x31, 0x51, 0x37, 0x58, 0x5A, 0x69, 0x4E, 0x63, 0x34, 0x2F, 0x36, 0x67, 0x78, 0x35, 0x4C, 0x53, 0x36, 0x5A, 0x53, + 0x74, 0x53, 0x36, 0x4C, 0x47, 0x37, 0x42, 0x4A, 0x38, 0x64, 0x4E, 0x56, 0x49, 0x30, 0x6C, 0x6B, 0x55, 0x6D, 0x63, 0x44, 0x72, 0x75, 0x64, 0x48, 0x72, 0x39, 0x45, 0x67, 0x77, 0x0A, 0x57, 0x36, 0x32, 0x6E, 0x56, 0x33, 0x4F, 0x5A, 0x71, 0x64, + 0x50, 0x6C, 0x74, 0x39, 0x45, 0x75, 0x57, 0x53, 0x52, 0x59, 0x33, 0x47, 0x67, 0x75, 0x4C, 0x6D, 0x4C, 0x59, 0x61, 0x75, 0x52, 0x77, 0x43, 0x79, 0x30, 0x67, 0x55, 0x43, 0x43, 0x6B, 0x4D, 0x70, 0x58, 0x52, 0x41, 0x4A, 0x69, 0x37, 0x30, 0x2F, + 0x33, 0x33, 0x4D, 0x76, 0x4A, 0x4A, 0x72, 0x73, 0x5A, 0x36, 0x34, 0x45, 0x65, 0x2B, 0x62, 0x73, 0x37, 0x4C, 0x6F, 0x33, 0x49, 0x36, 0x4C, 0x57, 0x6C, 0x64, 0x0A, 0x79, 0x38, 0x6A, 0x6F, 0x52, 0x54, 0x6E, 0x55, 0x2B, 0x6B, 0x4C, 0x42, 0x45, + 0x55, 0x78, 0x33, 0x58, 0x5A, 0x4C, 0x37, 0x61, 0x76, 0x39, 0x59, 0x52, 0x4F, 0x58, 0x72, 0x67, 0x5A, 0x36, 0x76, 0x6F, 0x4A, 0x6D, 0x74, 0x76, 0x71, 0x6B, 0x42, 0x5A, 0x73, 0x73, 0x34, 0x48, 0x54, 0x7A, 0x66, 0x51, 0x78, 0x2F, 0x30, 0x54, + 0x57, 0x36, 0x30, 0x75, 0x68, 0x64, 0x47, 0x2F, 0x48, 0x33, 0x39, 0x68, 0x34, 0x46, 0x35, 0x61, 0x67, 0x30, 0x7A, 0x44, 0x2F, 0x6F, 0x76, 0x0A, 0x2B, 0x42, 0x53, 0x35, 0x67, 0x4C, 0x4E, 0x64, 0x54, 0x61, 0x71, 0x58, 0x34, 0x66, 0x6E, 0x6B, + 0x47, 0x4D, 0x58, 0x34, 0x31, 0x54, 0x69, 0x4D, 0x4A, 0x6A, 0x7A, 0x39, 0x38, 0x69, 0x6A, 0x69, 0x37, 0x6C, 0x70, 0x4A, 0x69, 0x43, 0x7A, 0x66, 0x65, 0x54, 0x32, 0x4F, 0x6E, 0x70, 0x41, 0x38, 0x76, 0x55, 0x46, 0x4B, 0x4F, 0x74, 0x31, 0x62, + 0x39, 0x70, 0x71, 0x30, 0x7A, 0x6A, 0x38, 0x6C, 0x4D, 0x48, 0x38, 0x79, 0x66, 0x61, 0x49, 0x44, 0x6C, 0x4E, 0x44, 0x63, 0x0A, 0x65, 0x71, 0x46, 0x53, 0x33, 0x6D, 0x36, 0x54, 0x6A, 0x52, 0x67, 0x6D, 0x2F, 0x56, 0x57, 0x73, 0x76, 0x59, 0x2B, + 0x62, 0x30, 0x73, 0x2B, 0x76, 0x35, 0x34, 0x59, 0x73, 0x79, 0x78, 0x38, 0x4A, 0x62, 0x36, 0x4E, 0x76, 0x71, 0x59, 0x54, 0x55, 0x63, 0x37, 0x39, 0x4E, 0x6F, 0x58, 0x51, 0x62, 0x54, 0x69, 0x4E, 0x67, 0x38, 0x73, 0x77, 0x4F, 0x71, 0x6E, 0x2B, + 0x6B, 0x6E, 0x45, 0x77, 0x6C, 0x71, 0x4C, 0x4A, 0x6D, 0x4F, 0x7A, 0x6A, 0x2F, 0x32, 0x5A, 0x51, 0x77, 0x0A, 0x39, 0x6E, 0x4B, 0x45, 0x76, 0x6D, 0x68, 0x56, 0x45, 0x41, 0x2F, 0x47, 0x63, 0x79, 0x77, 0x57, 0x61, 0x5A, 0x4D, 0x48, 0x2F, 0x72, + 0x46, 0x46, 0x37, 0x62, 0x75, 0x69, 0x56, 0x57, 0x71, 0x77, 0x32, 0x72, 0x56, 0x4B, 0x41, 0x69, 0x55, 0x6E, 0x68, 0x64, 0x65, 0x33, 0x74, 0x34, 0x5A, 0x45, 0x46, 0x6F, 0x6C, 0x73, 0x67, 0x43, 0x73, 0x2B, 0x6C, 0x36, 0x6D, 0x63, 0x31, 0x58, + 0x35, 0x56, 0x54, 0x4D, 0x62, 0x65, 0x52, 0x52, 0x41, 0x63, 0x36, 0x75, 0x6B, 0x37, 0x0A, 0x6E, 0x77, 0x4E, 0x54, 0x37, 0x75, 0x35, 0x36, 0x41, 0x51, 0x49, 0x57, 0x65, 0x4E, 0x54, 0x6F, 0x77, 0x72, 0x35, 0x47, 0x64, 0x6F, 0x67, 0x54, 0x50, + 0x79, 0x4B, 0x37, 0x53, 0x42, 0x49, 0x64, 0x55, 0x67, 0x43, 0x30, 0x41, 0x6E, 0x34, 0x68, 0x47, 0x68, 0x36, 0x63, 0x4A, 0x66, 0x54, 0x7A, 0x50, 0x56, 0x34, 0x65, 0x30, 0x68, 0x7A, 0x35, 0x73, 0x79, 0x32, 0x32, 0x39, 0x7A, 0x64, 0x63, 0x78, + 0x73, 0x73, 0x68, 0x54, 0x72, 0x44, 0x33, 0x6D, 0x55, 0x63, 0x59, 0x0A, 0x68, 0x63, 0x45, 0x72, 0x75, 0x6C, 0x57, 0x75, 0x42, 0x75, 0x72, 0x51, 0x42, 0x37, 0x4C, 0x63, 0x71, 0x39, 0x43, 0x43, 0x6C, 0x6E, 0x58, 0x4F, 0x30, 0x6C, 0x44, 0x2B, + 0x6D, 0x65, 0x66, 0x50, 0x4C, 0x35, 0x2F, 0x6E, 0x64, 0x74, 0x46, 0x68, 0x4B, 0x76, 0x73, 0x68, 0x75, 0x7A, 0x48, 0x51, 0x71, 0x70, 0x39, 0x48, 0x70, 0x4C, 0x49, 0x69, 0x79, 0x68, 0x59, 0x36, 0x55, 0x46, 0x66, 0x45, 0x57, 0x30, 0x4E, 0x6E, + 0x78, 0x57, 0x56, 0x69, 0x41, 0x30, 0x6B, 0x42, 0x0A, 0x36, 0x30, 0x50, 0x5A, 0x32, 0x50, 0x69, 0x65, 0x72, 0x63, 0x2B, 0x78, 0x59, 0x77, 0x35, 0x46, 0x39, 0x4B, 0x42, 0x61, 0x4C, 0x4A, 0x73, 0x74, 0x78, 0x61, 0x62, 0x41, 0x72, 0x61, 0x68, + 0x48, 0x39, 0x43, 0x64, 0x4D, 0x4F, 0x41, 0x30, 0x75, 0x47, 0x30, 0x6B, 0x37, 0x55, 0x76, 0x54, 0x6F, 0x69, 0x49, 0x4D, 0x72, 0x56, 0x43, 0x6A, 0x55, 0x38, 0x6A, 0x56, 0x53, 0x74, 0x44, 0x4B, 0x44, 0x59, 0x6D, 0x6C, 0x6B, 0x44, 0x4A, 0x47, + 0x63, 0x6E, 0x35, 0x66, 0x71, 0x0A, 0x64, 0x42, 0x62, 0x39, 0x48, 0x78, 0x45, 0x47, 0x6D, 0x70, 0x76, 0x30, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, + 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x57, 0x54, 0x43, 0x43, 0x41, 0x64, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x5A, 0x76, 0x49, 0x39, 0x72, 0x34, 0x66, 0x65, 0x69, 0x37, 0x46, 0x4B, 0x36, 0x67, + 0x78, 0x58, 0x4D, 0x51, 0x48, 0x43, 0x37, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, + 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x65, 0x4D, 0x42, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x56, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x62, 0x32, 0x5A, 0x30, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, + 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x4E, 0x61, 0x57, 0x4E, 0x79, 0x62, 0x33, 0x4E, 0x76, 0x5A, 0x6E, 0x51, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x0A, + 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x55, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x44, 0x49, 0x77, + 0x4D, 0x54, 0x63, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x6B, 0x78, 0x4D, 0x6A, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x77, 0x4E, 0x6A, 0x51, 0x31, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x49, 0x77, 0x4E, 0x7A, 0x45, 0x34, 0x0A, 0x4D, 0x6A, 0x4D, + 0x78, 0x4E, 0x6A, 0x41, 0x30, 0x57, 0x6A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x65, 0x4D, 0x42, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, + 0x56, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x62, 0x32, 0x5A, 0x30, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x54, 0x59, 0x77, 0x0A, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, + 0x51, 0x44, 0x45, 0x79, 0x31, 0x4E, 0x61, 0x57, 0x4E, 0x79, 0x62, 0x33, 0x4E, 0x76, 0x5A, 0x6E, 0x51, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, + 0x4E, 0x68, 0x64, 0x47, 0x55, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x54, 0x63, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x0A, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, + 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x54, 0x55, 0x76, 0x44, 0x30, 0x43, 0x51, 0x6E, 0x56, 0x42, 0x45, 0x79, 0x50, 0x4E, 0x67, 0x41, 0x53, 0x47, 0x41, 0x6C, 0x45, 0x76, 0x61, + 0x71, 0x69, 0x42, 0x59, 0x67, 0x74, 0x6C, 0x7A, 0x50, 0x62, 0x4B, 0x6E, 0x52, 0x35, 0x76, 0x53, 0x6D, 0x5A, 0x52, 0x6F, 0x67, 0x50, 0x5A, 0x6E, 0x5A, 0x48, 0x36, 0x0A, 0x74, 0x68, 0x61, 0x78, 0x6A, 0x47, 0x37, 0x65, 0x66, 0x4D, 0x33, 0x62, + 0x65, 0x61, 0x59, 0x76, 0x7A, 0x72, 0x76, 0x4F, 0x63, 0x53, 0x2F, 0x6C, 0x70, 0x61, 0x73, 0x6F, 0x37, 0x47, 0x4D, 0x45, 0x5A, 0x70, 0x6E, 0x34, 0x2B, 0x76, 0x4B, 0x54, 0x45, 0x41, 0x58, 0x68, 0x67, 0x53, 0x68, 0x43, 0x34, 0x38, 0x5A, 0x6F, + 0x39, 0x4F, 0x59, 0x62, 0x68, 0x47, 0x42, 0x4B, 0x69, 0x61, 0x2F, 0x74, 0x65, 0x51, 0x38, 0x37, 0x7A, 0x76, 0x48, 0x32, 0x52, 0x50, 0x55, 0x42, 0x0A, 0x65, 0x4D, 0x43, 0x6A, 0x56, 0x44, 0x42, 0x53, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, + 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x49, 0x79, 0x35, 0x6C, 0x79, 0x63, 0x46, 0x49, 0x4D, 0x0A, 0x2B, 0x4F, 0x61, 0x2B, 0x73, 0x67, 0x52, 0x58, 0x4B, 0x53, 0x72, 0x50, 0x51, 0x68, 0x44, 0x74, 0x4E, 0x54, + 0x41, 0x51, 0x42, 0x67, 0x6B, 0x72, 0x42, 0x67, 0x45, 0x45, 0x41, 0x59, 0x49, 0x33, 0x46, 0x51, 0x45, 0x45, 0x41, 0x77, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, + 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x42, 0x59, 0x38, 0x6B, 0x33, 0x71, 0x44, 0x50, 0x6C, 0x66, 0x0A, 0x58, 0x75, 0x35, 0x67, 0x4B, 0x63, 0x73, 0x36, 0x38, 0x74, 0x76, 0x57, 0x4D, 0x6F, 0x51, 0x5A, 0x50, 0x33, 0x7A, 0x56, 0x4C, + 0x38, 0x4B, 0x78, 0x7A, 0x4A, 0x4F, 0x75, 0x55, 0x4C, 0x73, 0x4A, 0x4D, 0x73, 0x62, 0x47, 0x37, 0x58, 0x37, 0x4A, 0x4E, 0x70, 0x51, 0x53, 0x35, 0x47, 0x69, 0x46, 0x42, 0x71, 0x49, 0x62, 0x30, 0x43, 0x38, 0x43, 0x4D, 0x51, 0x43, 0x5A, 0x36, + 0x52, 0x61, 0x30, 0x44, 0x76, 0x70, 0x57, 0x53, 0x4E, 0x53, 0x6B, 0x4D, 0x42, 0x61, 0x52, 0x0A, 0x65, 0x4E, 0x74, 0x55, 0x6A, 0x47, 0x55, 0x42, 0x69, 0x75, 0x64, 0x51, 0x5A, 0x73, 0x49, 0x78, 0x74, 0x7A, 0x6D, 0x36, 0x75, 0x42, 0x6F, 0x69, + 0x42, 0x30, 0x37, 0x38, 0x61, 0x31, 0x51, 0x57, 0x49, 0x50, 0x38, 0x72, 0x74, 0x65, 0x64, 0x4D, 0x44, 0x45, 0x32, 0x6D, 0x54, 0x33, 0x4D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x37, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x71, 0x44, 0x43, 0x43, 0x41, 0x35, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x48, 0x74, 0x4F, 0x58, 0x43, 0x56, 0x2F, 0x59, + 0x74, 0x4C, 0x4E, 0x48, 0x63, 0x42, 0x36, 0x71, 0x76, 0x6E, 0x39, 0x46, 0x73, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, + 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x65, 0x4D, 0x42, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x56, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x62, 0x32, 0x5A, + 0x30, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x4E, 0x61, 0x57, 0x4E, 0x79, 0x62, 0x33, 0x4E, + 0x76, 0x5A, 0x6E, 0x51, 0x67, 0x0A, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x55, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, + 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x54, 0x63, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x6B, 0x78, 0x4D, 0x6A, 0x45, 0x34, 0x4D, 0x6A, 0x49, 0x31, 0x4D, 0x54, 0x49, 0x79, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, + 0x49, 0x77, 0x0A, 0x4E, 0x7A, 0x45, 0x34, 0x4D, 0x6A, 0x4D, 0x77, 0x4D, 0x44, 0x49, 0x7A, 0x57, 0x6A, 0x42, 0x6C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x65, 0x4D, + 0x42, 0x77, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x56, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x62, 0x32, 0x5A, 0x30, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, + 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x4E, 0x61, 0x57, 0x4E, 0x79, 0x62, 0x33, 0x4E, 0x76, 0x5A, 0x6E, 0x51, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, + 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x55, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x54, 0x63, 0x77, 0x0A, 0x67, 0x67, 0x49, + 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, + 0x4B, 0x57, 0x37, 0x36, 0x55, 0x4D, 0x34, 0x77, 0x70, 0x6C, 0x5A, 0x45, 0x57, 0x43, 0x70, 0x57, 0x39, 0x52, 0x32, 0x4C, 0x42, 0x69, 0x66, 0x4F, 0x5A, 0x4E, 0x74, 0x39, 0x47, 0x6B, 0x4D, 0x6D, 0x6C, 0x0A, 0x37, 0x58, 0x68, 0x71, 0x62, 0x30, + 0x65, 0x52, 0x61, 0x50, 0x67, 0x6E, 0x5A, 0x31, 0x41, 0x7A, 0x48, 0x61, 0x47, 0x6D, 0x2B, 0x2B, 0x44, 0x6C, 0x51, 0x36, 0x4F, 0x45, 0x41, 0x6C, 0x63, 0x42, 0x58, 0x5A, 0x78, 0x49, 0x51, 0x49, 0x4A, 0x54, 0x45, 0x4C, 0x79, 0x2F, 0x78, 0x7A, + 0x74, 0x6F, 0x6B, 0x4C, 0x61, 0x43, 0x4C, 0x65, 0x58, 0x30, 0x5A, 0x64, 0x44, 0x4D, 0x62, 0x52, 0x6E, 0x4D, 0x6C, 0x66, 0x6C, 0x37, 0x72, 0x45, 0x71, 0x55, 0x72, 0x51, 0x37, 0x65, 0x0A, 0x53, 0x30, 0x4D, 0x64, 0x68, 0x77, 0x65, 0x53, 0x45, + 0x35, 0x43, 0x41, 0x67, 0x32, 0x51, 0x31, 0x4F, 0x51, 0x54, 0x38, 0x35, 0x65, 0x6C, 0x73, 0x73, 0x37, 0x59, 0x66, 0x55, 0x4A, 0x51, 0x34, 0x5A, 0x56, 0x42, 0x63, 0x46, 0x30, 0x61, 0x35, 0x74, 0x6F, 0x57, 0x31, 0x48, 0x4C, 0x55, 0x58, 0x36, + 0x4E, 0x5A, 0x46, 0x6E, 0x64, 0x69, 0x79, 0x4A, 0x72, 0x44, 0x4B, 0x78, 0x48, 0x42, 0x4B, 0x72, 0x6D, 0x43, 0x6B, 0x33, 0x62, 0x50, 0x5A, 0x37, 0x50, 0x77, 0x37, 0x0A, 0x31, 0x56, 0x64, 0x79, 0x76, 0x44, 0x2F, 0x49, 0x79, 0x62, 0x4C, 0x65, + 0x53, 0x32, 0x76, 0x34, 0x49, 0x32, 0x77, 0x44, 0x77, 0x41, 0x57, 0x39, 0x6C, 0x63, 0x66, 0x4E, 0x63, 0x7A, 0x74, 0x6D, 0x67, 0x47, 0x54, 0x6A, 0x47, 0x71, 0x77, 0x75, 0x2B, 0x55, 0x63, 0x46, 0x38, 0x67, 0x61, 0x32, 0x6D, 0x33, 0x50, 0x31, + 0x65, 0x44, 0x4E, 0x62, 0x78, 0x36, 0x48, 0x37, 0x4A, 0x79, 0x71, 0x68, 0x74, 0x4A, 0x71, 0x52, 0x6A, 0x4A, 0x48, 0x54, 0x4F, 0x6F, 0x49, 0x2B, 0x0A, 0x64, 0x6B, 0x43, 0x30, 0x7A, 0x56, 0x4A, 0x68, 0x55, 0x58, 0x41, 0x6F, 0x50, 0x38, 0x58, + 0x46, 0x57, 0x76, 0x4C, 0x4A, 0x6A, 0x45, 0x6D, 0x37, 0x46, 0x46, 0x74, 0x4E, 0x79, 0x50, 0x39, 0x6E, 0x54, 0x55, 0x77, 0x53, 0x6C, 0x71, 0x33, 0x31, 0x2F, 0x6E, 0x69, 0x6F, 0x6C, 0x34, 0x66, 0x58, 0x2F, 0x56, 0x34, 0x67, 0x67, 0x4E, 0x79, + 0x68, 0x53, 0x79, 0x4C, 0x37, 0x31, 0x49, 0x6D, 0x74, 0x75, 0x73, 0x35, 0x48, 0x6C, 0x30, 0x64, 0x56, 0x65, 0x34, 0x39, 0x46, 0x0A, 0x79, 0x47, 0x63, 0x6F, 0x68, 0x4A, 0x55, 0x63, 0x61, 0x44, 0x44, 0x76, 0x37, 0x30, 0x6E, 0x67, 0x4E, 0x58, + 0x74, 0x6B, 0x35, 0x35, 0x69, 0x77, 0x6C, 0x4E, 0x70, 0x4E, 0x68, 0x54, 0x73, 0x2B, 0x56, 0x63, 0x51, 0x6F, 0x72, 0x31, 0x66, 0x7A, 0x6E, 0x68, 0x50, 0x62, 0x52, 0x69, 0x65, 0x66, 0x48, 0x71, 0x4A, 0x65, 0x52, 0x49, 0x4F, 0x6B, 0x70, 0x63, + 0x72, 0x56, 0x45, 0x37, 0x4E, 0x4C, 0x50, 0x38, 0x54, 0x6A, 0x77, 0x75, 0x61, 0x47, 0x59, 0x61, 0x52, 0x53, 0x0A, 0x4D, 0x4C, 0x6C, 0x36, 0x49, 0x45, 0x39, 0x76, 0x44, 0x7A, 0x68, 0x54, 0x79, 0x7A, 0x4D, 0x4D, 0x45, 0x79, 0x75, 0x50, 0x31, + 0x70, 0x71, 0x39, 0x4B, 0x73, 0x67, 0x74, 0x73, 0x52, 0x78, 0x39, 0x53, 0x31, 0x48, 0x4B, 0x52, 0x39, 0x46, 0x49, 0x4A, 0x33, 0x4A, 0x64, 0x68, 0x2B, 0x76, 0x56, 0x52, 0x65, 0x5A, 0x49, 0x5A, 0x5A, 0x32, 0x76, 0x55, 0x70, 0x43, 0x36, 0x57, + 0x36, 0x49, 0x59, 0x5A, 0x56, 0x63, 0x53, 0x6E, 0x32, 0x69, 0x35, 0x31, 0x42, 0x56, 0x72, 0x0A, 0x6C, 0x4D, 0x52, 0x70, 0x49, 0x70, 0x6A, 0x30, 0x4D, 0x2B, 0x44, 0x74, 0x2B, 0x56, 0x47, 0x4F, 0x51, 0x56, 0x44, 0x4A, 0x4E, 0x45, 0x39, 0x32, + 0x6B, 0x4B, 0x7A, 0x38, 0x4F, 0x4D, 0x48, 0x59, 0x34, 0x58, 0x75, 0x35, 0x34, 0x2B, 0x4F, 0x55, 0x34, 0x55, 0x5A, 0x70, 0x79, 0x77, 0x34, 0x4B, 0x55, 0x47, 0x73, 0x54, 0x75, 0x71, 0x77, 0x50, 0x4E, 0x31, 0x71, 0x33, 0x45, 0x72, 0x57, 0x51, + 0x67, 0x52, 0x35, 0x57, 0x72, 0x6C, 0x63, 0x69, 0x68, 0x74, 0x6E, 0x4A, 0x0A, 0x30, 0x74, 0x48, 0x58, 0x55, 0x65, 0x4F, 0x72, 0x4F, 0x38, 0x5A, 0x56, 0x2F, 0x52, 0x34, 0x4F, 0x30, 0x33, 0x51, 0x4B, 0x30, 0x64, 0x71, 0x71, 0x36, 0x6D, 0x6D, + 0x34, 0x6C, 0x79, 0x69, 0x50, 0x53, 0x4D, 0x51, 0x48, 0x2B, 0x46, 0x4A, 0x44, 0x4F, 0x76, 0x54, 0x4B, 0x56, 0x54, 0x55, 0x73, 0x73, 0x4B, 0x5A, 0x71, 0x77, 0x4A, 0x7A, 0x35, 0x38, 0x6F, 0x48, 0x68, 0x45, 0x6D, 0x72, 0x41, 0x52, 0x64, 0x6C, + 0x6E, 0x73, 0x38, 0x37, 0x2F, 0x49, 0x36, 0x4B, 0x4A, 0x0A, 0x43, 0x6C, 0x54, 0x55, 0x46, 0x4C, 0x6B, 0x71, 0x71, 0x4E, 0x66, 0x73, 0x2B, 0x61, 0x76, 0x4E, 0x4A, 0x56, 0x67, 0x79, 0x65, 0x59, 0x2B, 0x51, 0x57, 0x35, 0x67, 0x35, 0x78, 0x41, + 0x67, 0x47, 0x77, 0x61, 0x78, 0x2F, 0x44, 0x6A, 0x30, 0x41, 0x70, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x31, 0x51, 0x77, 0x55, 0x6A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, + 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x0A, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, + 0x67, 0x51, 0x55, 0x43, 0x63, 0x74, 0x5A, 0x66, 0x34, 0x61, 0x79, 0x63, 0x49, 0x38, 0x61, 0x77, 0x7A, 0x6E, 0x6A, 0x77, 0x4E, 0x6E, 0x70, 0x76, 0x37, 0x74, 0x4E, 0x73, 0x69, 0x4D, 0x77, 0x45, 0x41, 0x59, 0x4A, 0x4B, 0x77, 0x59, 0x42, 0x42, + 0x41, 0x47, 0x43, 0x0A, 0x4E, 0x78, 0x55, 0x42, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, + 0x41, 0x4B, 0x79, 0x76, 0x50, 0x6C, 0x33, 0x43, 0x45, 0x5A, 0x61, 0x4A, 0x6A, 0x71, 0x50, 0x6E, 0x6B, 0x74, 0x61, 0x58, 0x46, 0x62, 0x67, 0x54, 0x6F, 0x71, 0x5A, 0x43, 0x4C, 0x67, 0x4C, 0x4E, 0x46, 0x67, 0x56, 0x5A, 0x4A, 0x38, 0x6F, 0x67, + 0x0A, 0x36, 0x4C, 0x71, 0x34, 0x36, 0x42, 0x72, 0x73, 0x54, 0x61, 0x69, 0x58, 0x56, 0x71, 0x35, 0x6C, 0x51, 0x37, 0x47, 0x50, 0x41, 0x4A, 0x74, 0x53, 0x7A, 0x56, 0x58, 0x4E, 0x55, 0x7A, 0x6C, 0x74, 0x59, 0x6B, 0x79, 0x4C, 0x44, 0x56, 0x74, + 0x38, 0x4C, 0x6B, 0x53, 0x2F, 0x67, 0x78, 0x43, 0x50, 0x38, 0x31, 0x4F, 0x43, 0x67, 0x4D, 0x4E, 0x50, 0x4F, 0x73, 0x64, 0x75, 0x45, 0x54, 0x2F, 0x6D, 0x34, 0x78, 0x61, 0x52, 0x68, 0x50, 0x74, 0x74, 0x68, 0x48, 0x38, 0x30, 0x0A, 0x64, 0x4B, + 0x32, 0x4A, 0x70, 0x38, 0x36, 0x35, 0x31, 0x39, 0x65, 0x66, 0x68, 0x47, 0x53, 0x53, 0x76, 0x70, 0x57, 0x68, 0x72, 0x51, 0x6C, 0x54, 0x4D, 0x39, 0x33, 0x75, 0x43, 0x75, 0x70, 0x4B, 0x55, 0x59, 0x35, 0x76, 0x56, 0x61, 0x75, 0x36, 0x74, 0x5A, + 0x52, 0x47, 0x72, 0x6F, 0x78, 0x2F, 0x32, 0x4B, 0x4A, 0x51, 0x4A, 0x57, 0x56, 0x67, 0x67, 0x45, 0x62, 0x62, 0x4D, 0x77, 0x53, 0x75, 0x62, 0x4C, 0x57, 0x59, 0x64, 0x46, 0x51, 0x6C, 0x33, 0x4A, 0x50, 0x6B, 0x0A, 0x2B, 0x4F, 0x4E, 0x56, 0x46, + 0x54, 0x32, 0x34, 0x62, 0x63, 0x4D, 0x4B, 0x70, 0x42, 0x4C, 0x42, 0x61, 0x59, 0x56, 0x75, 0x33, 0x32, 0x54, 0x78, 0x55, 0x35, 0x6E, 0x68, 0x53, 0x6E, 0x55, 0x67, 0x6E, 0x5A, 0x55, 0x50, 0x35, 0x4E, 0x62, 0x63, 0x41, 0x2F, 0x46, 0x5A, 0x47, + 0x4F, 0x68, 0x48, 0x69, 0x62, 0x4A, 0x58, 0x57, 0x70, 0x53, 0x32, 0x71, 0x64, 0x67, 0x58, 0x4B, 0x78, 0x64, 0x4A, 0x35, 0x58, 0x62, 0x4C, 0x77, 0x56, 0x61, 0x5A, 0x4F, 0x6A, 0x65, 0x78, 0x0A, 0x2F, 0x32, 0x6B, 0x73, 0x6B, 0x5A, 0x47, 0x54, + 0x34, 0x64, 0x39, 0x4D, 0x6F, 0x7A, 0x64, 0x32, 0x54, 0x61, 0x47, 0x66, 0x2B, 0x47, 0x30, 0x65, 0x48, 0x64, 0x50, 0x36, 0x37, 0x50, 0x76, 0x30, 0x52, 0x52, 0x30, 0x54, 0x62, 0x63, 0x2F, 0x33, 0x57, 0x65, 0x55, 0x69, 0x4A, 0x33, 0x49, 0x72, + 0x68, 0x76, 0x4E, 0x58, 0x75, 0x7A, 0x44, 0x74, 0x4A, 0x45, 0x33, 0x63, 0x66, 0x56, 0x61, 0x37, 0x6F, 0x37, 0x50, 0x34, 0x4E, 0x48, 0x6D, 0x4A, 0x77, 0x65, 0x44, 0x79, 0x0A, 0x41, 0x6D, 0x48, 0x33, 0x70, 0x76, 0x77, 0x50, 0x75, 0x78, 0x77, + 0x58, 0x43, 0x36, 0x35, 0x42, 0x32, 0x58, 0x79, 0x39, 0x4A, 0x36, 0x50, 0x39, 0x4C, 0x6A, 0x72, 0x52, 0x6B, 0x35, 0x53, 0x78, 0x63, 0x78, 0x30, 0x6B, 0x69, 0x36, 0x39, 0x62, 0x49, 0x49, 0x6D, 0x74, 0x74, 0x32, 0x64, 0x6D, 0x65, 0x66, 0x55, + 0x36, 0x78, 0x71, 0x61, 0x57, 0x4D, 0x2F, 0x35, 0x54, 0x6B, 0x73, 0x68, 0x47, 0x73, 0x52, 0x47, 0x52, 0x78, 0x70, 0x6C, 0x2F, 0x6A, 0x38, 0x6E, 0x57, 0x0A, 0x5A, 0x6A, 0x45, 0x67, 0x51, 0x52, 0x43, 0x48, 0x4C, 0x51, 0x7A, 0x57, 0x77, 0x61, + 0x38, 0x30, 0x6D, 0x4D, 0x70, 0x6B, 0x67, 0x2F, 0x73, 0x54, 0x56, 0x39, 0x48, 0x42, 0x38, 0x44, 0x78, 0x36, 0x6A, 0x4B, 0x58, 0x42, 0x2F, 0x5A, 0x55, 0x68, 0x6F, 0x48, 0x48, 0x42, 0x6B, 0x32, 0x64, 0x78, 0x45, 0x75, 0x71, 0x50, 0x69, 0x41, + 0x70, 0x70, 0x47, 0x57, 0x53, 0x5A, 0x49, 0x31, 0x62, 0x37, 0x72, 0x43, 0x6F, 0x75, 0x63, 0x4C, 0x35, 0x6D, 0x78, 0x41, 0x79, 0x45, 0x0A, 0x37, 0x2B, 0x57, 0x4C, 0x38, 0x35, 0x4D, 0x42, 0x2B, 0x47, 0x71, 0x51, 0x6B, 0x32, 0x64, 0x4C, 0x73, + 0x6D, 0x69, 0x6A, 0x74, 0x57, 0x4B, 0x50, 0x36, 0x54, 0x2B, 0x4D, 0x65, 0x6A, 0x74, 0x65, 0x44, 0x2B, 0x65, 0x4D, 0x75, 0x4D, 0x5A, 0x38, 0x37, 0x7A, 0x66, 0x39, 0x64, 0x4F, 0x4C, 0x49, 0x54, 0x7A, 0x4E, 0x79, 0x34, 0x5A, 0x51, 0x35, 0x62, + 0x62, 0x30, 0x53, 0x72, 0x37, 0x34, 0x4D, 0x54, 0x6E, 0x42, 0x38, 0x47, 0x32, 0x2B, 0x4E, 0x73, 0x7A, 0x4B, 0x54, 0x0A, 0x63, 0x30, 0x51, 0x57, 0x62, 0x65, 0x6A, 0x30, 0x39, 0x2B, 0x43, 0x56, 0x67, 0x49, 0x2B, 0x57, 0x58, 0x54, 0x69, 0x6B, + 0x39, 0x4B, 0x76, 0x65, 0x43, 0x6A, 0x43, 0x48, 0x6B, 0x39, 0x68, 0x4E, 0x41, 0x48, 0x46, 0x69, 0x52, 0x53, 0x64, 0x4C, 0x4F, 0x6B, 0x4B, 0x45, 0x57, 0x33, 0x39, 0x6C, 0x74, 0x32, 0x63, 0x30, 0x55, 0x69, 0x32, 0x63, 0x46, 0x6D, 0x75, 0x71, + 0x71, 0x4E, 0x68, 0x37, 0x6F, 0x30, 0x4A, 0x4D, 0x63, 0x63, 0x63, 0x4D, 0x79, 0x6A, 0x36, 0x44, 0x0A, 0x35, 0x4B, 0x62, 0x76, 0x74, 0x77, 0x45, 0x77, 0x58, 0x6C, 0x47, 0x6A, 0x65, 0x66, 0x56, 0x77, 0x61, 0x61, 0x5A, 0x42, 0x52, 0x41, 0x2B, + 0x47, 0x73, 0x43, 0x79, 0x52, 0x78, 0x6A, 0x33, 0x71, 0x72, 0x67, 0x2B, 0x45, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x0A, 0x65, 0x2D, 0x53, 0x7A, 0x69, 0x67, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x37, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x51, 0x44, 0x43, + 0x43, 0x41, 0x65, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4D, 0x41, 0x56, 0x52, 0x49, 0x37, 0x79, 0x48, 0x39, 0x6C, 0x31, 0x6B, 0x4E, 0x39, 0x51, 0x51, 0x4B, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, + 0x39, 0x42, 0x41, 0x4D, 0x43, 0x4D, 0x48, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x68, 0x56, 0x4D, 0x52, 0x45, 0x77, 0x0A, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, + 0x68, 0x43, 0x64, 0x57, 0x52, 0x68, 0x63, 0x47, 0x56, 0x7A, 0x64, 0x44, 0x45, 0x57, 0x4D, 0x42, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x4E, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x5A, 0x57, 0x4D, 0x67, 0x54, 0x48, + 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x58, 0x4D, 0x42, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x59, 0x51, 0x77, 0x4F, 0x56, 0x6B, 0x46, 0x55, 0x53, 0x46, 0x55, 0x74, 0x0A, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x44, 0x51, 0x30, 0x4F, 0x54, 0x63, 0x78, 0x48, + 0x6A, 0x41, 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x57, 0x55, 0x74, 0x55, 0x33, 0x70, 0x70, 0x5A, 0x32, 0x35, 0x76, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x78, 0x4E, + 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x6A, 0x49, 0x78, 0x4D, 0x6A, 0x41, 0x33, 0x4D, 0x44, 0x5A, 0x61, 0x0A, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x34, 0x4D, 0x6A, 0x49, 0x78, 0x4D, 0x6A, 0x41, 0x33, + 0x4D, 0x44, 0x5A, 0x61, 0x4D, 0x48, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x68, 0x56, 0x4D, 0x52, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, 0x68, 0x43, + 0x64, 0x57, 0x52, 0x68, 0x63, 0x47, 0x56, 0x7A, 0x64, 0x44, 0x45, 0x57, 0x4D, 0x42, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x67, 0x77, 0x4E, 0x54, 0x57, 0x6C, 0x6A, 0x63, 0x6D, 0x39, 0x7A, 0x5A, 0x57, 0x4D, 0x67, 0x54, 0x48, 0x52, + 0x6B, 0x4C, 0x6A, 0x45, 0x58, 0x4D, 0x42, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x59, 0x51, 0x77, 0x4F, 0x56, 0x6B, 0x46, 0x55, 0x53, 0x46, 0x55, 0x74, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x44, 0x51, 0x30, 0x4F, 0x54, 0x63, 0x78, 0x48, 0x6A, 0x41, + 0x63, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x57, 0x55, 0x74, 0x55, 0x33, 0x70, 0x70, 0x0A, 0x5A, 0x32, 0x35, 0x76, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x78, 0x4E, 0x7A, + 0x42, 0x5A, 0x4D, 0x42, 0x4D, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x77, 0x45, 0x48, 0x41, 0x30, 0x49, 0x41, 0x42, 0x4A, 0x62, 0x63, 0x50, 0x59, + 0x72, 0x59, 0x73, 0x48, 0x74, 0x76, 0x78, 0x69, 0x65, 0x2B, 0x52, 0x4A, 0x43, 0x78, 0x0A, 0x73, 0x31, 0x59, 0x56, 0x65, 0x34, 0x35, 0x44, 0x4A, 0x48, 0x30, 0x61, 0x68, 0x46, 0x6E, 0x75, 0x59, 0x32, 0x69, 0x79, 0x78, 0x6C, 0x36, 0x48, 0x30, + 0x42, 0x56, 0x49, 0x48, 0x71, 0x69, 0x51, 0x72, 0x62, 0x31, 0x54, 0x6F, 0x74, 0x72, 0x65, 0x4F, 0x70, 0x43, 0x6D, 0x59, 0x46, 0x39, 0x6F, 0x4D, 0x72, 0x57, 0x47, 0x51, 0x64, 0x2B, 0x48, 0x57, 0x79, 0x78, 0x37, 0x78, 0x66, 0x35, 0x38, 0x65, + 0x74, 0x71, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x38, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, + 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x48, 0x45, 0x52, 0x55, 0x49, 0x30, 0x61, 0x72, 0x42, 0x65, 0x41, 0x79, 0x78, + 0x72, 0x38, 0x37, 0x47, 0x79, 0x5A, 0x44, 0x76, 0x0A, 0x76, 0x7A, 0x41, 0x45, 0x77, 0x44, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x53, 0x48, 0x45, 0x52, 0x55, 0x49, 0x30, 0x61, 0x72, + 0x42, 0x65, 0x41, 0x79, 0x78, 0x72, 0x38, 0x37, 0x47, 0x79, 0x5A, 0x44, 0x76, 0x76, 0x7A, 0x41, 0x45, 0x77, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x67, 0x4E, 0x4A, 0x41, 0x44, 0x42, + 0x47, 0x41, 0x69, 0x45, 0x41, 0x0A, 0x74, 0x56, 0x66, 0x64, 0x31, 0x34, 0x70, 0x56, 0x43, 0x7A, 0x62, 0x68, 0x68, 0x6B, 0x54, 0x36, 0x31, 0x4E, 0x6C, 0x6F, 0x6A, 0x62, 0x6A, 0x63, 0x49, 0x34, 0x71, 0x4B, 0x44, 0x64, 0x51, 0x76, 0x66, 0x65, + 0x70, 0x7A, 0x37, 0x4C, 0x39, 0x4E, 0x62, 0x4B, 0x67, 0x43, 0x49, 0x51, 0x44, 0x4C, 0x70, 0x62, 0x51, 0x53, 0x2B, 0x75, 0x65, 0x31, 0x36, 0x4D, 0x39, 0x2B, 0x6B, 0x2F, 0x7A, 0x7A, 0x4E, 0x59, 0x39, 0x76, 0x54, 0x6C, 0x70, 0x38, 0x74, 0x4C, + 0x78, 0x4F, 0x0A, 0x73, 0x76, 0x78, 0x79, 0x71, 0x6C, 0x74, 0x5A, 0x2B, 0x65, 0x66, 0x63, 0x4D, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x63, 0x65, 0x72, 0x74, 0x53, 0x49, 0x47, 0x4E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x52, + 0x7A, 0x43, 0x43, 0x41, 0x79, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x45, 0x51, 0x41, 0x30, 0x74, 0x6B, 0x37, 0x47, 0x4E, 0x69, 0x30, 0x32, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, + 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x45, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x4A, 0x50, 0x4D, 0x52, 0x51, 0x77, 0x0A, 0x45, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, + 0x45, 0x77, 0x74, 0x44, 0x52, 0x56, 0x4A, 0x55, 0x55, 0x30, 0x6C, 0x48, 0x54, 0x69, 0x42, 0x54, 0x51, 0x54, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x54, 0x59, 0x32, 0x56, 0x79, 0x64, 0x46, 0x4E, 0x4A, + 0x52, 0x30, 0x34, 0x67, 0x55, 0x6B, 0x39, 0x50, 0x56, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x48, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x79, 0x0A, 0x4D, 0x44, 0x59, 0x77, 0x4F, 0x54, 0x49, 0x33, 0x4D, 0x7A, 0x56, + 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x44, 0x59, 0x77, 0x4F, 0x54, 0x49, 0x33, 0x4D, 0x7A, 0x56, 0x61, 0x4D, 0x45, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x4A, + 0x50, 0x4D, 0x52, 0x51, 0x77, 0x45, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x74, 0x44, 0x52, 0x56, 0x4A, 0x55, 0x55, 0x30, 0x6C, 0x48, 0x0A, 0x54, 0x69, 0x42, 0x54, 0x51, 0x54, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, + 0x55, 0x45, 0x43, 0x78, 0x4D, 0x54, 0x59, 0x32, 0x56, 0x79, 0x64, 0x46, 0x4E, 0x4A, 0x52, 0x30, 0x34, 0x67, 0x55, 0x6B, 0x39, 0x50, 0x56, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x48, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, + 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x0A, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4D, 0x44, 0x46, 0x64, + 0x52, 0x6D, 0x52, 0x66, 0x55, 0x52, 0x30, 0x64, 0x49, 0x66, 0x2B, 0x44, 0x6A, 0x75, 0x57, 0x33, 0x4E, 0x67, 0x42, 0x46, 0x73, 0x7A, 0x75, 0x59, 0x35, 0x48, 0x6E, 0x43, 0x32, 0x2F, 0x4F, 0x4F, 0x77, 0x70, 0x70, 0x47, 0x6E, 0x7A, 0x43, 0x34, + 0x36, 0x2B, 0x43, 0x6A, 0x6F, 0x62, 0x58, 0x58, 0x6F, 0x39, 0x58, 0x36, 0x39, 0x4D, 0x68, 0x57, 0x66, 0x30, 0x35, 0x0A, 0x4E, 0x30, 0x49, 0x77, 0x76, 0x6C, 0x44, 0x71, 0x74, 0x67, 0x2B, 0x70, 0x69, 0x4E, 0x67, 0x75, 0x4C, 0x57, 0x6B, 0x68, + 0x35, 0x39, 0x45, 0x33, 0x47, 0x45, 0x35, 0x39, 0x6B, 0x64, 0x55, 0x57, 0x58, 0x32, 0x74, 0x62, 0x41, 0x4D, 0x49, 0x35, 0x51, 0x77, 0x30, 0x32, 0x68, 0x56, 0x4B, 0x35, 0x55, 0x32, 0x55, 0x50, 0x48, 0x55, 0x4C, 0x6C, 0x6A, 0x38, 0x38, 0x46, + 0x30, 0x2B, 0x37, 0x63, 0x44, 0x42, 0x72, 0x5A, 0x75, 0x49, 0x74, 0x34, 0x49, 0x6D, 0x66, 0x6B, 0x0A, 0x61, 0x62, 0x42, 0x6F, 0x78, 0x54, 0x7A, 0x6B, 0x62, 0x46, 0x70, 0x47, 0x35, 0x38, 0x33, 0x48, 0x2B, 0x75, 0x2F, 0x45, 0x37, 0x45, 0x75, + 0x39, 0x61, 0x71, 0x53, 0x73, 0x2F, 0x63, 0x77, 0x6F, 0x55, 0x65, 0x2B, 0x53, 0x74, 0x43, 0x6D, 0x72, 0x71, 0x7A, 0x57, 0x61, 0x54, 0x4F, 0x54, 0x45, 0x43, 0x4D, 0x59, 0x6D, 0x7A, 0x50, 0x68, 0x70, 0x6E, 0x2B, 0x53, 0x63, 0x38, 0x43, 0x6E, + 0x54, 0x58, 0x50, 0x6E, 0x47, 0x46, 0x69, 0x57, 0x65, 0x49, 0x38, 0x4D, 0x67, 0x0A, 0x77, 0x54, 0x30, 0x50, 0x50, 0x7A, 0x68, 0x41, 0x73, 0x50, 0x36, 0x43, 0x52, 0x44, 0x69, 0x71, 0x57, 0x68, 0x71, 0x4B, 0x61, 0x32, 0x4E, 0x59, 0x4F, 0x4C, + 0x51, 0x56, 0x30, 0x37, 0x59, 0x52, 0x61, 0x58, 0x73, 0x65, 0x56, 0x4F, 0x36, 0x4D, 0x47, 0x69, 0x4B, 0x73, 0x63, 0x70, 0x63, 0x2F, 0x49, 0x31, 0x6D, 0x62, 0x79, 0x53, 0x4B, 0x45, 0x77, 0x51, 0x64, 0x50, 0x7A, 0x48, 0x2F, 0x69, 0x56, 0x38, + 0x6F, 0x53, 0x63, 0x4C, 0x75, 0x6D, 0x5A, 0x66, 0x4E, 0x70, 0x0A, 0x64, 0x57, 0x4F, 0x39, 0x6C, 0x66, 0x73, 0x62, 0x6C, 0x38, 0x33, 0x6B, 0x71, 0x4B, 0x2F, 0x32, 0x30, 0x55, 0x36, 0x6F, 0x32, 0x59, 0x70, 0x78, 0x4A, 0x4D, 0x30, 0x32, 0x50, + 0x62, 0x79, 0x57, 0x78, 0x50, 0x46, 0x73, 0x71, 0x61, 0x37, 0x6C, 0x7A, 0x77, 0x31, 0x75, 0x4B, 0x41, 0x32, 0x77, 0x44, 0x72, 0x58, 0x4B, 0x55, 0x58, 0x74, 0x34, 0x46, 0x4D, 0x4D, 0x67, 0x4C, 0x33, 0x2F, 0x37, 0x46, 0x46, 0x58, 0x68, 0x45, + 0x5A, 0x6E, 0x39, 0x31, 0x51, 0x71, 0x68, 0x0A, 0x6E, 0x67, 0x4C, 0x6A, 0x59, 0x6C, 0x2F, 0x72, 0x4E, 0x55, 0x73, 0x73, 0x75, 0x48, 0x4C, 0x6F, 0x50, 0x6A, 0x31, 0x50, 0x72, 0x43, 0x79, 0x37, 0x4C, 0x6F, 0x62, 0x69, 0x6F, 0x33, 0x61, 0x50, + 0x35, 0x5A, 0x4D, 0x71, 0x7A, 0x36, 0x57, 0x72, 0x79, 0x46, 0x79, 0x4E, 0x53, 0x77, 0x62, 0x2F, 0x45, 0x6B, 0x61, 0x73, 0x65, 0x4D, 0x73, 0x55, 0x42, 0x7A, 0x58, 0x67, 0x71, 0x64, 0x2B, 0x4C, 0x36, 0x61, 0x38, 0x56, 0x54, 0x78, 0x61, 0x4A, + 0x57, 0x37, 0x33, 0x32, 0x0A, 0x6A, 0x63, 0x5A, 0x5A, 0x72, 0x6F, 0x69, 0x46, 0x44, 0x73, 0x47, 0x4A, 0x36, 0x78, 0x39, 0x6E, 0x78, 0x55, 0x57, 0x4F, 0x2F, 0x32, 0x30, 0x33, 0x4E, 0x69, 0x74, 0x34, 0x5A, 0x6F, 0x4F, 0x52, 0x55, 0x53, 0x73, + 0x39, 0x2F, 0x31, 0x46, 0x33, 0x64, 0x6D, 0x4B, 0x68, 0x37, 0x47, 0x63, 0x2B, 0x50, 0x6F, 0x47, 0x44, 0x34, 0x46, 0x61, 0x70, 0x55, 0x42, 0x38, 0x66, 0x65, 0x70, 0x6D, 0x72, 0x59, 0x37, 0x2B, 0x45, 0x46, 0x33, 0x66, 0x78, 0x44, 0x54, 0x76, + 0x66, 0x0A, 0x39, 0x35, 0x78, 0x68, 0x73, 0x7A, 0x57, 0x59, 0x69, 0x6A, 0x71, 0x79, 0x37, 0x44, 0x77, 0x61, 0x4E, 0x7A, 0x39, 0x2B, 0x6A, 0x35, 0x4C, 0x50, 0x32, 0x52, 0x49, 0x55, 0x5A, 0x4E, 0x6F, 0x51, 0x41, 0x68, 0x56, 0x42, 0x2F, 0x30, + 0x2F, 0x45, 0x36, 0x78, 0x79, 0x6A, 0x79, 0x66, 0x71, 0x5A, 0x39, 0x30, 0x62, 0x70, 0x34, 0x52, 0x6A, 0x5A, 0x73, 0x62, 0x67, 0x79, 0x4C, 0x63, 0x73, 0x55, 0x44, 0x46, 0x44, 0x59, 0x67, 0x32, 0x57, 0x44, 0x37, 0x72, 0x6C, 0x63, 0x0A, 0x7A, + 0x38, 0x73, 0x46, 0x57, 0x6B, 0x7A, 0x36, 0x47, 0x5A, 0x64, 0x72, 0x31, 0x6C, 0x30, 0x54, 0x30, 0x38, 0x4A, 0x63, 0x56, 0x4C, 0x77, 0x79, 0x63, 0x36, 0x42, 0x34, 0x39, 0x66, 0x46, 0x74, 0x48, 0x73, 0x75, 0x66, 0x70, 0x61, 0x61, 0x66, 0x49, + 0x74, 0x7A, 0x52, 0x55, 0x5A, 0x36, 0x43, 0x65, 0x57, 0x52, 0x67, 0x4B, 0x52, 0x4D, 0x2B, 0x6F, 0x2F, 0x31, 0x50, 0x63, 0x6D, 0x71, 0x72, 0x34, 0x74, 0x54, 0x6C, 0x75, 0x43, 0x52, 0x56, 0x4C, 0x45, 0x52, 0x4C, 0x0A, 0x69, 0x6F, 0x68, 0x45, + 0x6E, 0x4D, 0x71, 0x45, 0x30, 0x79, 0x6F, 0x37, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, + 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, + 0x43, 0x49, 0x53, 0x31, 0x6D, 0x78, 0x74, 0x65, 0x67, 0x34, 0x42, 0x58, 0x72, 0x7A, 0x6B, 0x77, 0x4A, 0x64, 0x38, 0x52, 0x67, 0x6E, 0x6C, 0x52, 0x75, 0x41, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, + 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x59, 0x4E, 0x34, 0x61, 0x75, 0x4F, 0x66, 0x79, 0x59, 0x49, 0x4C, 0x56, 0x41, 0x7A, 0x4F, 0x42, 0x0A, 0x79, 0x77, 0x61, 0x4B, 0x38, 0x53, 0x4A, 0x4A, 0x36, 0x65, + 0x6A, 0x71, 0x6B, 0x58, 0x2F, 0x47, 0x4D, 0x31, 0x35, 0x6F, 0x47, 0x51, 0x4F, 0x47, 0x4F, 0x30, 0x4D, 0x42, 0x7A, 0x77, 0x64, 0x77, 0x35, 0x41, 0x67, 0x65, 0x5A, 0x59, 0x57, 0x52, 0x35, 0x68, 0x45, 0x69, 0x74, 0x2F, 0x55, 0x43, 0x49, 0x34, + 0x36, 0x75, 0x75, 0x52, 0x35, 0x39, 0x48, 0x33, 0x35, 0x73, 0x35, 0x72, 0x30, 0x6C, 0x31, 0x5A, 0x55, 0x61, 0x38, 0x67, 0x57, 0x6D, 0x72, 0x34, 0x55, 0x43, 0x0A, 0x62, 0x36, 0x37, 0x34, 0x31, 0x6A, 0x48, 0x2F, 0x4A, 0x63, 0x6C, 0x4B, 0x79, + 0x4D, 0x65, 0x4B, 0x71, 0x64, 0x6D, 0x66, 0x53, 0x30, 0x6D, 0x62, 0x45, 0x56, 0x65, 0x5A, 0x6B, 0x6B, 0x4D, 0x52, 0x33, 0x72, 0x59, 0x7A, 0x70, 0x4D, 0x7A, 0x58, 0x6A, 0x57, 0x52, 0x39, 0x31, 0x4D, 0x30, 0x38, 0x4B, 0x43, 0x79, 0x30, 0x6D, + 0x70, 0x62, 0x71, 0x54, 0x66, 0x58, 0x45, 0x52, 0x4D, 0x51, 0x6C, 0x71, 0x69, 0x43, 0x41, 0x32, 0x43, 0x6C, 0x56, 0x39, 0x2B, 0x42, 0x42, 0x0A, 0x2F, 0x41, 0x59, 0x6D, 0x2F, 0x37, 0x6B, 0x32, 0x39, 0x55, 0x4D, 0x55, 0x41, 0x32, 0x5A, 0x34, + 0x34, 0x52, 0x47, 0x78, 0x32, 0x69, 0x42, 0x66, 0x52, 0x67, 0x42, 0x34, 0x41, 0x43, 0x47, 0x6C, 0x48, 0x67, 0x41, 0x6F, 0x59, 0x58, 0x68, 0x76, 0x71, 0x41, 0x45, 0x42, 0x6A, 0x35, 0x30, 0x30, 0x6D, 0x76, 0x2F, 0x30, 0x4F, 0x4A, 0x44, 0x37, + 0x75, 0x4E, 0x47, 0x7A, 0x63, 0x67, 0x62, 0x4A, 0x63, 0x65, 0x61, 0x42, 0x78, 0x58, 0x6E, 0x74, 0x43, 0x36, 0x5A, 0x35, 0x0A, 0x38, 0x68, 0x4D, 0x4C, 0x6E, 0x50, 0x64, 0x64, 0x44, 0x6E, 0x73, 0x6B, 0x6B, 0x37, 0x52, 0x49, 0x32, 0x34, 0x5A, + 0x66, 0x33, 0x6C, 0x43, 0x47, 0x65, 0x4F, 0x64, 0x41, 0x35, 0x6A, 0x47, 0x6F, 0x6B, 0x48, 0x5A, 0x77, 0x59, 0x61, 0x2B, 0x63, 0x4E, 0x79, 0x77, 0x52, 0x74, 0x59, 0x4B, 0x33, 0x71, 0x71, 0x34, 0x6B, 0x4E, 0x46, 0x74, 0x79, 0x44, 0x47, 0x6B, + 0x4E, 0x7A, 0x56, 0x6D, 0x66, 0x39, 0x6E, 0x47, 0x76, 0x6E, 0x41, 0x76, 0x52, 0x43, 0x6A, 0x6A, 0x35, 0x0A, 0x42, 0x69, 0x4B, 0x44, 0x55, 0x79, 0x55, 0x4D, 0x2F, 0x46, 0x48, 0x45, 0x35, 0x72, 0x37, 0x69, 0x4F, 0x5A, 0x55, 0x4C, 0x4A, 0x4B, + 0x32, 0x76, 0x30, 0x5A, 0x58, 0x6B, 0x6C, 0x74, 0x64, 0x30, 0x5A, 0x47, 0x74, 0x78, 0x54, 0x67, 0x49, 0x38, 0x71, 0x6F, 0x58, 0x7A, 0x49, 0x4B, 0x4E, 0x44, 0x4F, 0x58, 0x5A, 0x62, 0x62, 0x46, 0x44, 0x2B, 0x6D, 0x70, 0x77, 0x55, 0x48, 0x6D, + 0x55, 0x55, 0x69, 0x68, 0x57, 0x39, 0x6F, 0x34, 0x4A, 0x46, 0x57, 0x6B, 0x6C, 0x57, 0x0A, 0x61, 0x74, 0x4B, 0x63, 0x73, 0x57, 0x4D, 0x79, 0x35, 0x57, 0x48, 0x67, 0x55, 0x79, 0x49, 0x4F, 0x70, 0x77, 0x70, 0x4A, 0x36, 0x73, 0x74, 0x2B, 0x48, + 0x36, 0x6A, 0x69, 0x59, 0x6F, 0x44, 0x32, 0x45, 0x45, 0x56, 0x53, 0x6D, 0x41, 0x59, 0x59, 0x33, 0x71, 0x58, 0x4E, 0x4C, 0x33, 0x2B, 0x71, 0x31, 0x4F, 0x6B, 0x2B, 0x43, 0x48, 0x4C, 0x73, 0x49, 0x77, 0x4D, 0x43, 0x50, 0x4B, 0x61, 0x71, 0x32, + 0x4C, 0x78, 0x6E, 0x64, 0x44, 0x30, 0x55, 0x46, 0x2F, 0x74, 0x55, 0x0A, 0x53, 0x78, 0x66, 0x6A, 0x30, 0x33, 0x6B, 0x39, 0x62, 0x57, 0x74, 0x4A, 0x79, 0x53, 0x67, 0x4F, 0x4C, 0x6E, 0x52, 0x51, 0x76, 0x77, 0x7A, 0x5A, 0x52, 0x6A, 0x6F, 0x51, + 0x68, 0x73, 0x6D, 0x6E, 0x50, 0x2B, 0x6D, 0x67, 0x37, 0x48, 0x2F, 0x72, 0x70, 0x58, 0x64, 0x59, 0x61, 0x58, 0x48, 0x6D, 0x67, 0x77, 0x6F, 0x33, 0x38, 0x6F, 0x5A, 0x4A, 0x61, 0x72, 0x35, 0x35, 0x43, 0x4A, 0x44, 0x32, 0x41, 0x68, 0x5A, 0x6B, + 0x50, 0x75, 0x58, 0x61, 0x54, 0x48, 0x34, 0x4D, 0x0A, 0x4E, 0x4D, 0x6E, 0x35, 0x58, 0x37, 0x61, 0x7A, 0x4B, 0x46, 0x47, 0x6E, 0x70, 0x79, 0x75, 0x71, 0x53, 0x66, 0x71, 0x4E, 0x5A, 0x53, 0x6C, 0x4F, 0x34, 0x32, 0x73, 0x54, 0x70, 0x35, 0x53, + 0x6A, 0x4C, 0x56, 0x46, 0x74, 0x65, 0x41, 0x78, 0x45, 0x79, 0x39, 0x2F, 0x65, 0x43, 0x47, 0x2F, 0x4F, 0x6F, 0x32, 0x53, 0x72, 0x30, 0x35, 0x57, 0x45, 0x31, 0x4C, 0x6C, 0x53, 0x56, 0x48, 0x4A, 0x37, 0x6C, 0x69, 0x58, 0x4D, 0x76, 0x47, 0x6E, + 0x6A, 0x53, 0x47, 0x34, 0x4E, 0x0A, 0x30, 0x4D, 0x65, 0x64, 0x4A, 0x35, 0x71, 0x71, 0x2B, 0x42, 0x4F, 0x53, 0x33, 0x52, 0x37, 0x66, 0x59, 0x35, 0x38, 0x31, 0x71, 0x52, 0x59, 0x32, 0x37, 0x49, 0x79, 0x34, 0x67, 0x2F, 0x51, 0x39, 0x69, 0x59, + 0x2F, 0x4E, 0x74, 0x42, 0x64, 0x65, 0x31, 0x37, 0x4D, 0x58, 0x51, 0x52, 0x42, 0x64, 0x4A, 0x33, 0x4E, 0x67, 0x68, 0x56, 0x64, 0x4A, 0x49, 0x67, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x32, 0x6A, 0x43, 0x43, 0x41, 0x38, 0x4B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4D, 0x42, 0x66, 0x63, 0x4F, 0x68, 0x74, 0x70, 0x4A, 0x38, 0x30, 0x59, 0x31, 0x4C, 0x72, 0x71, 0x79, + 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x49, 0x47, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, + 0x0A, 0x55, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, + 0x4D, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x47, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x64, 0x32, 0x46, 0x32, 0x0A, 0x5A, 0x53, + 0x42, 0x49, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x78, 0x4D, 0x43, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x6F, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, + 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x49, 0x45, 0x46, 0x31, 0x64, + 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x6A, 0x4D, 0x78, 0x4F, 0x54, 0x4D, 0x30, 0x4D, 0x54, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x34, 0x4D, + 0x6A, 0x4D, 0x78, 0x4F, 0x54, 0x4D, 0x30, 0x4D, 0x54, 0x4A, 0x61, 0x4D, 0x49, 0x47, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, + 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x4D, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, + 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x47, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x64, 0x32, 0x46, 0x32, 0x0A, 0x5A, 0x53, 0x42, 0x49, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, + 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x78, 0x4D, 0x43, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x6F, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, + 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, + 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, + 0x49, 0x42, 0x41, 0x4C, 0x6C, 0x64, 0x55, 0x53, 0x68, 0x4C, 0x50, 0x44, 0x65, 0x53, 0x30, 0x59, 0x4C, 0x4F, 0x76, 0x52, 0x32, 0x39, 0x0A, 0x7A, 0x64, 0x32, 0x34, 0x71, 0x38, 0x38, 0x4B, 0x50, 0x75, 0x46, 0x64, 0x35, 0x64, 0x79, 0x71, 0x43, + 0x62, 0x6C, 0x58, 0x41, 0x6A, 0x37, 0x6D, 0x59, 0x32, 0x48, 0x66, 0x38, 0x67, 0x2B, 0x43, 0x59, 0x36, 0x36, 0x6A, 0x39, 0x36, 0x78, 0x7A, 0x30, 0x58, 0x7A, 0x6E, 0x73, 0x77, 0x75, 0x76, 0x43, 0x41, 0x41, 0x4A, 0x57, 0x58, 0x2F, 0x4E, 0x4B, + 0x53, 0x71, 0x49, 0x6B, 0x34, 0x63, 0x58, 0x47, 0x49, 0x44, 0x74, 0x69, 0x4C, 0x4B, 0x30, 0x74, 0x68, 0x41, 0x66, 0x0A, 0x4C, 0x64, 0x5A, 0x66, 0x56, 0x61, 0x49, 0x54, 0x58, 0x64, 0x48, 0x47, 0x36, 0x77, 0x5A, 0x57, 0x69, 0x59, 0x6A, 0x2B, + 0x72, 0x44, 0x4B, 0x64, 0x2F, 0x56, 0x7A, 0x44, 0x42, 0x63, 0x64, 0x75, 0x37, 0x6F, 0x61, 0x4A, 0x75, 0x6F, 0x67, 0x44, 0x6E, 0x58, 0x49, 0x68, 0x68, 0x70, 0x43, 0x75, 0x6A, 0x77, 0x4F, 0x6C, 0x33, 0x4A, 0x2B, 0x49, 0x4B, 0x4D, 0x75, 0x6A, + 0x6B, 0x6B, 0x6B, 0x50, 0x37, 0x4E, 0x41, 0x50, 0x34, 0x6D, 0x31, 0x45, 0x54, 0x34, 0x42, 0x71, 0x0A, 0x73, 0x74, 0x54, 0x6E, 0x6F, 0x41, 0x70, 0x54, 0x41, 0x62, 0x71, 0x4F, 0x6C, 0x35, 0x46, 0x32, 0x62, 0x72, 0x7A, 0x38, 0x31, 0x57, 0x73, + 0x32, 0x35, 0x6B, 0x43, 0x49, 0x31, 0x6E, 0x73, 0x76, 0x58, 0x77, 0x58, 0x6F, 0x4C, 0x47, 0x30, 0x52, 0x38, 0x2B, 0x65, 0x79, 0x76, 0x70, 0x4A, 0x45, 0x54, 0x4E, 0x4B, 0x58, 0x70, 0x50, 0x37, 0x53, 0x63, 0x6F, 0x46, 0x44, 0x42, 0x35, 0x7A, + 0x70, 0x45, 0x54, 0x37, 0x31, 0x69, 0x78, 0x70, 0x5A, 0x66, 0x52, 0x39, 0x6F, 0x0A, 0x57, 0x4E, 0x30, 0x45, 0x41, 0x43, 0x79, 0x57, 0x38, 0x30, 0x4F, 0x7A, 0x66, 0x70, 0x67, 0x5A, 0x64, 0x4E, 0x6D, 0x63, 0x63, 0x39, 0x6B, 0x59, 0x76, 0x6B, + 0x48, 0x48, 0x4E, 0x48, 0x6E, 0x5A, 0x39, 0x47, 0x4C, 0x43, 0x51, 0x37, 0x6D, 0x7A, 0x4A, 0x37, 0x41, 0x69, 0x79, 0x2F, 0x6B, 0x39, 0x55, 0x73, 0x63, 0x77, 0x52, 0x37, 0x50, 0x4A, 0x50, 0x72, 0x68, 0x71, 0x34, 0x75, 0x66, 0x6F, 0x67, 0x58, + 0x42, 0x65, 0x51, 0x6F, 0x74, 0x50, 0x4A, 0x71, 0x58, 0x2B, 0x0A, 0x4F, 0x73, 0x49, 0x67, 0x62, 0x72, 0x76, 0x34, 0x46, 0x6F, 0x37, 0x4E, 0x44, 0x4B, 0x6D, 0x30, 0x47, 0x32, 0x78, 0x32, 0x45, 0x4F, 0x46, 0x59, 0x65, 0x55, 0x59, 0x2B, 0x56, + 0x4D, 0x36, 0x41, 0x71, 0x46, 0x63, 0x4A, 0x4E, 0x79, 0x6B, 0x62, 0x6D, 0x52, 0x4F, 0x50, 0x44, 0x4D, 0x6A, 0x57, 0x4C, 0x42, 0x7A, 0x37, 0x42, 0x65, 0x67, 0x49, 0x6C, 0x54, 0x31, 0x6C, 0x52, 0x74, 0x7A, 0x75, 0x7A, 0x57, 0x6E, 0x69, 0x54, + 0x59, 0x2B, 0x48, 0x4B, 0x45, 0x34, 0x30, 0x0A, 0x43, 0x7A, 0x37, 0x50, 0x46, 0x4E, 0x6D, 0x37, 0x33, 0x62, 0x5A, 0x51, 0x6D, 0x71, 0x31, 0x33, 0x31, 0x42, 0x6E, 0x57, 0x32, 0x68, 0x71, 0x49, 0x79, 0x45, 0x34, 0x62, 0x4A, 0x33, 0x58, 0x59, + 0x73, 0x67, 0x6A, 0x78, 0x72, 0x6F, 0x4D, 0x77, 0x75, 0x52, 0x45, 0x4F, 0x7A, 0x59, 0x66, 0x77, 0x68, 0x49, 0x30, 0x56, 0x63, 0x6E, 0x79, 0x68, 0x37, 0x38, 0x7A, 0x79, 0x69, 0x47, 0x47, 0x36, 0x39, 0x47, 0x6D, 0x37, 0x44, 0x49, 0x77, 0x4C, + 0x64, 0x56, 0x63, 0x45, 0x0A, 0x75, 0x45, 0x34, 0x71, 0x46, 0x43, 0x34, 0x39, 0x44, 0x78, 0x77, 0x65, 0x4D, 0x71, 0x5A, 0x69, 0x4E, 0x75, 0x35, 0x6D, 0x34, 0x69, 0x4B, 0x34, 0x42, 0x55, 0x42, 0x6A, 0x45, 0x43, 0x4C, 0x7A, 0x4D, 0x78, 0x31, + 0x30, 0x63, 0x6F, 0x6F, 0x73, 0x39, 0x54, 0x6B, 0x70, 0x6F, 0x4E, 0x50, 0x6E, 0x47, 0x34, 0x43, 0x45, 0x4C, 0x63, 0x55, 0x39, 0x34, 0x30, 0x32, 0x78, 0x2F, 0x52, 0x70, 0x76, 0x75, 0x6D, 0x55, 0x48, 0x4F, 0x31, 0x6A, 0x73, 0x51, 0x6B, 0x55, + 0x6D, 0x0A, 0x2B, 0x39, 0x6A, 0x61, 0x4A, 0x58, 0x4C, 0x45, 0x39, 0x67, 0x43, 0x78, 0x49, 0x6E, 0x6D, 0x39, 0x34, 0x33, 0x78, 0x5A, 0x59, 0x6B, 0x71, 0x63, 0x42, 0x57, 0x38, 0x39, 0x7A, 0x75, 0x62, 0x57, 0x52, 0x32, 0x4F, 0x5A, 0x78, 0x69, + 0x52, 0x76, 0x63, 0x68, 0x4C, 0x49, 0x72, 0x48, 0x2B, 0x51, 0x74, 0x41, 0x75, 0x52, 0x63, 0x4F, 0x69, 0x33, 0x35, 0x68, 0x59, 0x51, 0x63, 0x52, 0x66, 0x4F, 0x33, 0x67, 0x5A, 0x50, 0x53, 0x45, 0x46, 0x39, 0x4E, 0x55, 0x71, 0x6A, 0x0A, 0x69, + 0x66, 0x4C, 0x4A, 0x53, 0x33, 0x74, 0x42, 0x45, 0x57, 0x31, 0x6E, 0x74, 0x77, 0x69, 0x59, 0x54, 0x4F, 0x55, 0x52, 0x47, 0x61, 0x35, 0x43, 0x67, 0x4E, 0x7A, 0x37, 0x6B, 0x41, 0x58, 0x55, 0x2B, 0x46, 0x44, 0x4B, 0x76, 0x75, 0x53, 0x74, 0x78, + 0x38, 0x4B, 0x55, 0x31, 0x78, 0x61, 0x64, 0x35, 0x68, 0x65, 0x50, 0x72, 0x7A, 0x62, 0x37, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x45, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4A, 0x6E, 0x67, 0x47, 0x57, 0x63, 0x4E, 0x59, 0x74, 0x74, 0x32, 0x73, 0x39, 0x6F, 0x39, + 0x75, 0x46, 0x76, 0x6F, 0x2F, 0x55, 0x4C, 0x53, 0x4D, 0x51, 0x36, 0x48, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x0A, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, + 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x6D, 0x48, 0x4E, 0x77, 0x34, 0x72, 0x44, 0x54, 0x37, 0x54, 0x6E, 0x73, 0x54, 0x47, 0x44, 0x5A, 0x71, 0x52, 0x4B, + 0x47, 0x46, 0x78, 0x36, 0x57, 0x30, 0x4F, 0x68, 0x55, 0x4B, 0x44, 0x74, 0x6B, 0x4C, 0x53, 0x47, 0x6D, 0x2B, 0x4A, 0x31, 0x57, 0x45, 0x32, 0x70, 0x49, 0x50, 0x55, 0x2F, 0x48, 0x0A, 0x50, 0x69, 0x6E, 0x62, 0x62, 0x56, 0x69, 0x44, 0x56, 0x44, + 0x32, 0x48, 0x66, 0x53, 0x4D, 0x46, 0x31, 0x4F, 0x51, 0x63, 0x33, 0x4F, 0x67, 0x34, 0x5A, 0x59, 0x62, 0x46, 0x64, 0x61, 0x64, 0x61, 0x32, 0x7A, 0x55, 0x46, 0x76, 0x58, 0x66, 0x65, 0x75, 0x79, 0x6B, 0x33, 0x51, 0x41, 0x55, 0x48, 0x77, 0x35, + 0x52, 0x53, 0x6E, 0x38, 0x70, 0x6B, 0x33, 0x66, 0x45, 0x62, 0x4B, 0x39, 0x78, 0x47, 0x43, 0x68, 0x41, 0x43, 0x4D, 0x66, 0x31, 0x4B, 0x61, 0x41, 0x30, 0x48, 0x0A, 0x5A, 0x4A, 0x44, 0x6D, 0x48, 0x76, 0x55, 0x71, 0x6F, 0x61, 0x69, 0x37, 0x50, + 0x46, 0x33, 0x35, 0x6F, 0x77, 0x67, 0x4C, 0x45, 0x51, 0x7A, 0x78, 0x50, 0x79, 0x30, 0x51, 0x6C, 0x47, 0x2F, 0x2B, 0x34, 0x6A, 0x53, 0x48, 0x67, 0x39, 0x62, 0x50, 0x35, 0x52, 0x73, 0x31, 0x62, 0x64, 0x49, 0x44, 0x34, 0x62, 0x41, 0x4E, 0x71, + 0x4B, 0x43, 0x71, 0x52, 0x69, 0x65, 0x43, 0x4E, 0x71, 0x63, 0x56, 0x74, 0x67, 0x69, 0x6D, 0x51, 0x6C, 0x52, 0x58, 0x74, 0x70, 0x6C, 0x61, 0x0A, 0x34, 0x67, 0x74, 0x35, 0x6B, 0x4E, 0x64, 0x58, 0x45, 0x6C, 0x45, 0x31, 0x47, 0x59, 0x68, 0x42, + 0x61, 0x43, 0x58, 0x55, 0x4E, 0x78, 0x65, 0x45, 0x46, 0x66, 0x73, 0x42, 0x63, 0x74, 0x79, 0x56, 0x33, 0x6C, 0x49, 0x6D, 0x49, 0x4A, 0x67, 0x6D, 0x34, 0x6E, 0x62, 0x31, 0x4A, 0x32, 0x2F, 0x36, 0x41, 0x44, 0x74, 0x4B, 0x59, 0x64, 0x6B, 0x4E, + 0x79, 0x31, 0x47, 0x54, 0x4B, 0x76, 0x30, 0x57, 0x42, 0x70, 0x61, 0x6E, 0x49, 0x35, 0x6F, 0x6A, 0x53, 0x50, 0x35, 0x52, 0x0A, 0x76, 0x62, 0x62, 0x45, 0x73, 0x4C, 0x46, 0x55, 0x7A, 0x74, 0x35, 0x73, 0x51, 0x61, 0x30, 0x57, 0x5A, 0x33, 0x37, + 0x62, 0x2F, 0x54, 0x6A, 0x4E, 0x75, 0x54, 0x68, 0x4F, 0x73, 0x73, 0x46, 0x67, 0x79, 0x35, 0x30, 0x58, 0x33, 0x31, 0x69, 0x65, 0x65, 0x6D, 0x4B, 0x79, 0x4A, 0x6F, 0x39, 0x30, 0x6C, 0x5A, 0x76, 0x6B, 0x57, 0x78, 0x33, 0x53, 0x44, 0x39, 0x32, + 0x59, 0x48, 0x4A, 0x74, 0x5A, 0x75, 0x53, 0x50, 0x54, 0x4D, 0x61, 0x43, 0x6D, 0x2F, 0x7A, 0x6A, 0x64, 0x0A, 0x7A, 0x79, 0x42, 0x50, 0x36, 0x56, 0x68, 0x57, 0x4F, 0x6D, 0x66, 0x44, 0x30, 0x66, 0x61, 0x5A, 0x6D, 0x5A, 0x32, 0x36, 0x4E, 0x72, + 0x61, 0x41, 0x4C, 0x34, 0x68, 0x48, 0x54, 0x34, 0x61, 0x2F, 0x52, 0x44, 0x71, 0x41, 0x35, 0x44, 0x63, 0x63, 0x70, 0x72, 0x72, 0x71, 0x6C, 0x35, 0x67, 0x52, 0x30, 0x49, 0x52, 0x69, 0x52, 0x32, 0x51, 0x65, 0x71, 0x75, 0x35, 0x41, 0x76, 0x7A, + 0x53, 0x78, 0x6E, 0x49, 0x39, 0x4F, 0x34, 0x66, 0x4B, 0x53, 0x54, 0x78, 0x2B, 0x4F, 0x0A, 0x38, 0x35, 0x36, 0x58, 0x33, 0x76, 0x4F, 0x6D, 0x65, 0x57, 0x71, 0x4A, 0x63, 0x55, 0x39, 0x4C, 0x4A, 0x78, 0x64, 0x49, 0x2F, 0x75, 0x7A, 0x30, 0x55, + 0x41, 0x39, 0x50, 0x53, 0x58, 0x33, 0x4D, 0x52, 0x65, 0x4F, 0x39, 0x65, 0x6B, 0x44, 0x46, 0x51, 0x64, 0x78, 0x68, 0x56, 0x69, 0x63, 0x47, 0x61, 0x65, 0x56, 0x79, 0x51, 0x59, 0x48, 0x54, 0x74, 0x67, 0x47, 0x4A, 0x6F, 0x43, 0x38, 0x36, 0x63, + 0x6E, 0x6E, 0x2B, 0x4F, 0x6A, 0x43, 0x2F, 0x51, 0x65, 0x7A, 0x48, 0x0A, 0x59, 0x6A, 0x36, 0x52, 0x53, 0x38, 0x66, 0x5A, 0x4D, 0x58, 0x5A, 0x43, 0x2B, 0x66, 0x63, 0x38, 0x59, 0x2B, 0x77, 0x6D, 0x6A, 0x48, 0x4D, 0x4D, 0x66, 0x52, 0x6F, 0x64, + 0x36, 0x71, 0x68, 0x38, 0x68, 0x36, 0x6A, 0x43, 0x4A, 0x33, 0x7A, 0x68, 0x4D, 0x30, 0x45, 0x50, 0x7A, 0x38, 0x2F, 0x38, 0x41, 0x4B, 0x41, 0x69, 0x67, 0x4A, 0x35, 0x4B, 0x70, 0x32, 0x38, 0x41, 0x73, 0x45, 0x46, 0x46, 0x74, 0x79, 0x4C, 0x4B, + 0x61, 0x45, 0x6A, 0x46, 0x51, 0x71, 0x4B, 0x75, 0x0A, 0x33, 0x52, 0x33, 0x79, 0x34, 0x47, 0x35, 0x4F, 0x42, 0x56, 0x69, 0x78, 0x77, 0x4A, 0x41, 0x57, 0x4B, 0x71, 0x51, 0x39, 0x45, 0x45, 0x43, 0x2B, 0x6A, 0x32, 0x4A, 0x6A, 0x67, 0x36, 0x6D, + 0x63, 0x67, 0x6E, 0x30, 0x74, 0x41, 0x75, 0x6D, 0x44, 0x4D, 0x48, 0x7A, 0x4C, 0x4A, 0x38, 0x6E, 0x39, 0x48, 0x6D, 0x59, 0x41, 0x73, 0x43, 0x37, 0x54, 0x49, 0x53, 0x2B, 0x4F, 0x4D, 0x78, 0x5A, 0x73, 0x6D, 0x4F, 0x30, 0x51, 0x71, 0x41, 0x66, + 0x57, 0x7A, 0x4A, 0x50, 0x50, 0x0A, 0x32, 0x39, 0x46, 0x70, 0x48, 0x4F, 0x54, 0x4B, 0x79, 0x65, 0x43, 0x32, 0x6E, 0x4F, 0x6E, 0x4F, 0x63, 0x58, 0x48, 0x65, 0x62, 0x44, 0x38, 0x57, 0x70, 0x48, 0x6B, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x45, + 0x43, 0x43, 0x20, 0x50, 0x32, 0x35, 0x36, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x59, 0x44, 0x43, 0x43, 0x41, 0x67, + 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4D, 0x44, 0x57, 0x70, 0x66, 0x43, 0x44, 0x38, 0x6F, 0x58, 0x44, 0x35, 0x52, 0x6C, 0x64, 0x39, 0x64, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, + 0x4D, 0x43, 0x4D, 0x49, 0x47, 0x52, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x52, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4D, 0x49, 0x53, + 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x64, 0x32, 0x46, 0x32, 0x5A, 0x53, 0x42, 0x49, 0x0A, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, + 0x4C, 0x6A, 0x45, 0x36, 0x4D, 0x44, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x78, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x46, + 0x51, 0x30, 0x4D, 0x67, 0x55, 0x44, 0x49, 0x31, 0x4E, 0x69, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x0A, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, + 0x30, 0x65, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x6A, 0x4D, 0x78, 0x4F, 0x54, 0x4D, 0x31, 0x4D, 0x54, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x34, 0x4D, 0x6A, 0x4D, 0x78, 0x4F, 0x54, 0x4D, + 0x31, 0x4D, 0x54, 0x42, 0x61, 0x4D, 0x49, 0x47, 0x52, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, + 0x4D, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, + 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x46, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, 0x30, 0x64, 0x32, 0x46, 0x32, 0x5A, 0x53, 0x42, 0x49, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, + 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x36, 0x4D, 0x44, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x78, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, + 0x43, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x44, 0x49, 0x31, 0x0A, 0x4E, 0x69, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, + 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x42, 0x5A, 0x4D, 0x42, 0x4D, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x77, 0x45, 0x48, 0x41, 0x30, 0x49, 0x41, + 0x42, 0x48, 0x37, 0x37, 0x62, 0x4F, 0x59, 0x6A, 0x0A, 0x34, 0x33, 0x4D, 0x79, 0x43, 0x4D, 0x70, 0x67, 0x35, 0x6C, 0x4F, 0x63, 0x75, 0x6E, 0x53, 0x4E, 0x47, 0x4C, 0x42, 0x34, 0x6B, 0x46, 0x4B, 0x41, 0x33, 0x54, 0x6A, 0x41, 0x53, 0x68, 0x33, + 0x52, 0x71, 0x4D, 0x79, 0x54, 0x70, 0x4A, 0x63, 0x47, 0x4F, 0x4D, 0x6F, 0x4E, 0x46, 0x57, 0x4C, 0x47, 0x6A, 0x67, 0x45, 0x71, 0x5A, 0x5A, 0x32, 0x71, 0x33, 0x7A, 0x53, 0x52, 0x4C, 0x6F, 0x48, 0x42, 0x35, 0x44, 0x4F, 0x53, 0x4D, 0x63, 0x54, + 0x39, 0x43, 0x54, 0x71, 0x6D, 0x0A, 0x50, 0x36, 0x32, 0x6A, 0x51, 0x7A, 0x42, 0x42, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x77, + 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x44, 0x41, 0x77, 0x63, 0x47, 0x41, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x6F, 0x30, 0x45, 0x47, 0x72, 0x4A, + 0x42, 0x74, 0x0A, 0x30, 0x55, 0x72, 0x72, 0x64, 0x61, 0x56, 0x4B, 0x45, 0x4A, 0x6D, 0x7A, 0x73, 0x61, 0x47, 0x4C, 0x53, 0x76, 0x63, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x49, 0x44, 0x52, + 0x77, 0x41, 0x77, 0x52, 0x41, 0x49, 0x67, 0x42, 0x2B, 0x5A, 0x55, 0x32, 0x67, 0x36, 0x67, 0x57, 0x72, 0x4B, 0x75, 0x45, 0x5A, 0x2B, 0x48, 0x78, 0x62, 0x62, 0x2F, 0x61, 0x64, 0x34, 0x6C, 0x76, 0x76, 0x69, 0x67, 0x74, 0x77, 0x6A, 0x7A, 0x0A, + 0x52, 0x4D, 0x34, 0x71, 0x33, 0x77, 0x67, 0x68, 0x44, 0x44, 0x63, 0x43, 0x49, 0x43, 0x30, 0x6D, 0x41, 0x36, 0x41, 0x46, 0x76, 0x57, 0x76, 0x52, 0x39, 0x6C, 0x7A, 0x34, 0x5A, 0x63, 0x79, 0x47, 0x62, 0x62, 0x4F, 0x63, 0x4E, 0x45, 0x68, 0x6A, + 0x68, 0x41, 0x6E, 0x46, 0x6A, 0x58, 0x63, 0x61, 0x34, 0x73, 0x79, 0x63, 0x34, 0x58, 0x52, 0x37, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x77, 0x61, 0x76, 0x65, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x45, 0x43, 0x43, 0x20, 0x50, 0x33, 0x38, 0x34, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x6E, 0x54, 0x43, 0x43, 0x41, 0x69, 0x53, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4D, 0x43, 0x4C, 0x32, 0x46, 0x6C, 0x32, 0x79, 0x5A, + 0x4A, 0x36, 0x53, 0x41, 0x61, 0x45, 0x63, 0x37, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x4D, 0x49, 0x47, 0x52, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, + 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x52, 0x0A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4D, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x64, 0x32, 0x46, + 0x32, 0x5A, 0x53, 0x42, 0x49, 0x0A, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x36, 0x4D, 0x44, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x78, 0x56, 0x48, + 0x4A, 0x31, 0x63, 0x33, 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x44, 0x4D, 0x34, 0x4E, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, + 0x5A, 0x70, 0x0A, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x6A, 0x4D, 0x78, 0x4F, + 0x54, 0x4D, 0x32, 0x4E, 0x44, 0x4E, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x6A, 0x41, 0x34, 0x4D, 0x6A, 0x4D, 0x78, 0x4F, 0x54, 0x4D, 0x32, 0x4E, 0x44, 0x4E, 0x61, 0x4D, 0x49, 0x47, 0x52, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4D, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, 0x58, 0x4D, 0x78, 0x45, 0x44, 0x41, 0x4F, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x63, 0x54, 0x42, 0x30, 0x4E, 0x6F, 0x61, 0x57, 0x4E, 0x68, 0x5A, 0x32, 0x38, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x46, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, + 0x30, 0x64, 0x32, 0x46, 0x32, 0x5A, 0x53, 0x42, 0x49, 0x62, 0x32, 0x78, 0x6B, 0x61, 0x57, 0x35, 0x6E, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x36, 0x4D, 0x44, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, + 0x78, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x33, 0x59, 0x58, 0x5A, 0x6C, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x44, 0x4D, 0x34, 0x0A, 0x4E, 0x43, 0x42, 0x44, 0x5A, 0x58, + 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, + 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x47, 0x76, 0x61, 0x44, 0x58, 0x55, 0x31, 0x43, 0x44, 0x46, 0x48, 0x0A, 0x42, 0x61, 0x35, 0x46, 0x6D, 0x56, 0x58, 0x78, 0x45, + 0x52, 0x4D, 0x75, 0x53, 0x76, 0x67, 0x51, 0x4D, 0x53, 0x4F, 0x6A, 0x66, 0x6F, 0x50, 0x54, 0x66, 0x79, 0x67, 0x49, 0x4F, 0x69, 0x59, 0x61, 0x4F, 0x73, 0x2B, 0x58, 0x67, 0x68, 0x2B, 0x41, 0x74, 0x79, 0x63, 0x4A, 0x6A, 0x39, 0x47, 0x4F, 0x4D, + 0x4D, 0x51, 0x4B, 0x6D, 0x77, 0x36, 0x73, 0x57, 0x41, 0x53, 0x72, 0x39, 0x7A, 0x5A, 0x39, 0x6C, 0x43, 0x4F, 0x6B, 0x6D, 0x77, 0x71, 0x4B, 0x69, 0x36, 0x76, 0x72, 0x0A, 0x2F, 0x54, 0x6B, 0x6C, 0x5A, 0x76, 0x46, 0x65, 0x2F, 0x6F, 0x79, 0x75, + 0x6A, 0x55, 0x46, 0x35, 0x6E, 0x51, 0x6C, 0x67, 0x7A, 0x69, 0x69, 0x70, 0x30, 0x34, 0x70, 0x74, 0x38, 0x39, 0x5A, 0x46, 0x31, 0x50, 0x4B, 0x59, 0x68, 0x44, 0x68, 0x6C, 0x6F, 0x4B, 0x4E, 0x44, 0x4D, 0x45, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, + 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x51, 0x4D, 0x44, 0x42, 0x77, 0x59, + 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x56, 0x71, 0x59, 0x53, 0x4A, 0x30, 0x73, 0x45, 0x79, 0x76, 0x52, 0x6A, 0x4C, 0x62, 0x4B, 0x59, 0x48, 0x54, 0x73, 0x6A, 0x6E, 0x6E, 0x62, 0x36, + 0x43, 0x6B, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6E, 0x0A, 0x41, 0x44, 0x42, 0x6B, 0x41, 0x6A, 0x41, 0x33, 0x41, 0x5A, 0x4B, 0x58, 0x52, 0x52, 0x4A, 0x2B, 0x6F, 0x50, + 0x4D, 0x2B, 0x72, 0x52, 0x6B, 0x36, 0x63, 0x74, 0x33, 0x30, 0x55, 0x4A, 0x4D, 0x44, 0x45, 0x72, 0x35, 0x45, 0x30, 0x6B, 0x39, 0x42, 0x70, 0x49, 0x79, 0x63, 0x6E, 0x52, 0x2B, 0x6A, 0x39, 0x73, 0x4B, 0x53, 0x35, 0x30, 0x67, 0x55, 0x2F, 0x6B, + 0x36, 0x62, 0x70, 0x5A, 0x46, 0x58, 0x72, 0x73, 0x59, 0x33, 0x63, 0x72, 0x73, 0x43, 0x4D, 0x47, 0x63, 0x6C, 0x0A, 0x43, 0x72, 0x45, 0x4D, 0x58, 0x75, 0x36, 0x70, 0x59, 0x35, 0x4A, 0x76, 0x35, 0x5A, 0x41, 0x4C, 0x2F, 0x6D, 0x59, 0x69, 0x79, + 0x6B, 0x66, 0x39, 0x69, 0x6A, 0x48, 0x33, 0x67, 0x2F, 0x35, 0x36, 0x76, 0x78, 0x43, 0x2B, 0x47, 0x43, 0x73, 0x65, 0x6A, 0x2F, 0x59, 0x70, 0x48, 0x70, 0x52, 0x5A, 0x37, 0x34, 0x34, 0x68, 0x4E, 0x38, 0x74, 0x52, 0x6D, 0x4B, 0x56, 0x75, 0x53, + 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4E, 0x41, 0x56, 0x45, 0x52, 0x20, 0x47, 0x6C, 0x6F, + 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x6F, 0x6A, 0x43, 0x43, 0x41, 0x34, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, + 0x67, 0x49, 0x55, 0x41, 0x5A, 0x51, 0x77, 0x48, 0x71, 0x49, 0x4C, 0x33, 0x66, 0x58, 0x46, 0x4D, 0x79, 0x71, 0x78, 0x51, 0x30, 0x52, 0x78, 0x2B, 0x4E, 0x5A, 0x51, 0x54, 0x51, 0x30, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, + 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x61, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x31, 0x49, 0x78, 0x4A, 0x6A, 0x41, 0x6B, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x55, 0x35, 0x42, 0x56, 0x6B, 0x56, 0x53, 0x49, 0x45, 0x4A, 0x56, 0x55, 0x30, 0x6C, 0x4F, 0x52, 0x56, 0x4E, 0x54, 0x49, 0x46, 0x42, 0x4D, 0x51, 0x56, 0x52, 0x47, 0x54, 0x31, 0x4A, 0x4E, 0x49, 0x45, 0x4E, 0x76, + 0x63, 0x6E, 0x41, 0x75, 0x4D, 0x54, 0x49, 0x77, 0x4D, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x44, 0x43, 0x6C, 0x4F, 0x51, 0x56, 0x5A, 0x46, 0x55, 0x69, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, + 0x76, 0x64, 0x43, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, + 0x78, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x54, 0x67, 0x77, 0x4F, 0x44, 0x55, 0x34, 0x0A, 0x4E, 0x44, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4E, 0x7A, 0x41, 0x34, 0x4D, 0x54, 0x67, 0x79, 0x4D, 0x7A, 0x55, 0x35, 0x4E, 0x54, 0x6C, 0x61, 0x4D, 0x47, + 0x6B, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x74, 0x53, 0x4D, 0x53, 0x59, 0x77, 0x4A, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x31, 0x4F, 0x51, 0x56, 0x5A, 0x46, 0x55, 0x69, + 0x42, 0x43, 0x56, 0x56, 0x4E, 0x4A, 0x54, 0x6B, 0x56, 0x54, 0x0A, 0x55, 0x79, 0x42, 0x51, 0x54, 0x45, 0x46, 0x55, 0x52, 0x6B, 0x39, 0x53, 0x54, 0x53, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x4C, 0x6A, 0x45, 0x79, 0x4D, 0x44, 0x41, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x70, 0x54, 0x6B, 0x46, 0x57, 0x52, 0x56, 0x49, 0x67, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, + 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x0A, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, + 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x32, 0x31, 0x50, 0x47, 0x54, 0x58, 0x4C, 0x56, 0x41, 0x69, 0x51, 0x71, 0x72, + 0x44, 0x5A, 0x42, 0x62, 0x0A, 0x55, 0x47, 0x4F, 0x75, 0x6B, 0x4A, 0x52, 0x30, 0x46, 0x30, 0x56, 0x79, 0x31, 0x6E, 0x74, 0x6C, 0x57, 0x69, 0x6C, 0x4C, 0x70, 0x31, 0x61, 0x67, 0x53, 0x37, 0x67, 0x76, 0x51, 0x6E, 0x58, 0x70, 0x32, 0x58, 0x73, + 0x6B, 0x57, 0x6A, 0x46, 0x6C, 0x71, 0x78, 0x63, 0x58, 0x30, 0x54, 0x4D, 0x36, 0x32, 0x52, 0x48, 0x63, 0x51, 0x44, 0x61, 0x48, 0x33, 0x38, 0x64, 0x71, 0x36, 0x53, 0x5A, 0x65, 0x57, 0x59, 0x70, 0x33, 0x34, 0x2B, 0x68, 0x49, 0x6E, 0x44, 0x45, + 0x57, 0x0A, 0x2B, 0x6A, 0x36, 0x52, 0x73, 0x63, 0x72, 0x4A, 0x6F, 0x2B, 0x4B, 0x66, 0x7A, 0x69, 0x46, 0x54, 0x6F, 0x77, 0x49, 0x32, 0x4D, 0x4D, 0x74, 0x53, 0x41, 0x75, 0x58, 0x61, 0x4D, 0x6C, 0x33, 0x44, 0x78, 0x65, 0x62, 0x35, 0x37, 0x68, + 0x48, 0x48, 0x69, 0x38, 0x6C, 0x45, 0x48, 0x6F, 0x53, 0x54, 0x47, 0x45, 0x71, 0x30, 0x6E, 0x2B, 0x55, 0x53, 0x5A, 0x47, 0x6E, 0x51, 0x4A, 0x6F, 0x56, 0x69, 0x41, 0x62, 0x62, 0x4A, 0x41, 0x68, 0x32, 0x2B, 0x67, 0x31, 0x47, 0x37, 0x0A, 0x58, + 0x4E, 0x72, 0x34, 0x72, 0x52, 0x56, 0x71, 0x6D, 0x66, 0x65, 0x53, 0x56, 0x50, 0x63, 0x30, 0x57, 0x2B, 0x6D, 0x2F, 0x36, 0x69, 0x6D, 0x42, 0x45, 0x74, 0x52, 0x54, 0x6B, 0x5A, 0x61, 0x7A, 0x6B, 0x56, 0x72, 0x64, 0x2F, 0x70, 0x42, 0x7A, 0x4B, + 0x50, 0x73, 0x77, 0x52, 0x72, 0x58, 0x4B, 0x43, 0x41, 0x66, 0x48, 0x63, 0x58, 0x4C, 0x4A, 0x5A, 0x74, 0x4D, 0x30, 0x6C, 0x2F, 0x61, 0x4D, 0x39, 0x42, 0x68, 0x4B, 0x34, 0x64, 0x41, 0x39, 0x57, 0x6B, 0x57, 0x32, 0x0A, 0x61, 0x61, 0x63, 0x70, + 0x2B, 0x79, 0x50, 0x4F, 0x69, 0x4E, 0x67, 0x53, 0x6E, 0x41, 0x42, 0x49, 0x71, 0x4B, 0x59, 0x50, 0x73, 0x7A, 0x75, 0x53, 0x6A, 0x58, 0x45, 0x4F, 0x64, 0x4D, 0x57, 0x4C, 0x79, 0x45, 0x7A, 0x35, 0x39, 0x4A, 0x75, 0x4F, 0x75, 0x44, 0x78, 0x70, + 0x37, 0x57, 0x38, 0x37, 0x55, 0x43, 0x39, 0x59, 0x37, 0x63, 0x53, 0x77, 0x30, 0x42, 0x77, 0x62, 0x61, 0x67, 0x7A, 0x69, 0x76, 0x45, 0x53, 0x71, 0x32, 0x4D, 0x30, 0x55, 0x58, 0x5A, 0x52, 0x34, 0x0A, 0x59, 0x62, 0x38, 0x4F, 0x62, 0x74, 0x6F, + 0x71, 0x76, 0x43, 0x38, 0x4D, 0x43, 0x33, 0x47, 0x6D, 0x73, 0x78, 0x59, 0x2F, 0x6E, 0x4F, 0x62, 0x35, 0x7A, 0x4A, 0x39, 0x54, 0x4E, 0x65, 0x49, 0x44, 0x6F, 0x4B, 0x41, 0x59, 0x76, 0x37, 0x76, 0x78, 0x76, 0x76, 0x54, 0x57, 0x6A, 0x49, 0x63, + 0x4E, 0x51, 0x76, 0x63, 0x47, 0x75, 0x66, 0x46, 0x74, 0x37, 0x51, 0x53, 0x55, 0x71, 0x50, 0x36, 0x32, 0x30, 0x77, 0x62, 0x47, 0x51, 0x47, 0x48, 0x66, 0x6E, 0x5A, 0x33, 0x7A, 0x0A, 0x56, 0x48, 0x62, 0x4F, 0x55, 0x7A, 0x6F, 0x42, 0x70, 0x70, + 0x4A, 0x42, 0x37, 0x41, 0x53, 0x6A, 0x6A, 0x77, 0x32, 0x69, 0x31, 0x51, 0x6E, 0x4B, 0x31, 0x73, 0x75, 0x61, 0x38, 0x65, 0x39, 0x44, 0x58, 0x63, 0x43, 0x72, 0x70, 0x55, 0x48, 0x50, 0x58, 0x46, 0x4E, 0x77, 0x63, 0x4D, 0x6D, 0x49, 0x70, 0x69, + 0x33, 0x55, 0x61, 0x32, 0x46, 0x7A, 0x55, 0x43, 0x61, 0x47, 0x59, 0x51, 0x35, 0x66, 0x47, 0x38, 0x49, 0x72, 0x34, 0x6F, 0x7A, 0x56, 0x75, 0x35, 0x33, 0x42, 0x0A, 0x41, 0x30, 0x4B, 0x36, 0x6C, 0x4E, 0x70, 0x66, 0x71, 0x62, 0x44, 0x4B, 0x7A, + 0x45, 0x30, 0x4B, 0x37, 0x30, 0x64, 0x70, 0x41, 0x79, 0x38, 0x69, 0x2B, 0x2F, 0x45, 0x6F, 0x7A, 0x72, 0x39, 0x64, 0x55, 0x47, 0x57, 0x6F, 0x6B, 0x47, 0x32, 0x7A, 0x64, 0x4C, 0x41, 0x49, 0x78, 0x36, 0x79, 0x6F, 0x30, 0x65, 0x73, 0x2B, 0x6E, + 0x50, 0x78, 0x64, 0x47, 0x6F, 0x4D, 0x75, 0x4B, 0x38, 0x75, 0x31, 0x38, 0x30, 0x53, 0x64, 0x4F, 0x71, 0x63, 0x58, 0x59, 0x5A, 0x61, 0x69, 0x0A, 0x63, 0x64, 0x4E, 0x77, 0x6C, 0x68, 0x56, 0x4E, 0x74, 0x30, 0x78, 0x7A, 0x37, 0x68, 0x6C, 0x63, + 0x78, 0x56, 0x73, 0x2B, 0x51, 0x66, 0x36, 0x73, 0x64, 0x57, 0x41, 0x37, 0x47, 0x32, 0x50, 0x4F, 0x41, 0x4E, 0x33, 0x61, 0x43, 0x4A, 0x42, 0x69, 0x74, 0x4F, 0x55, 0x74, 0x37, 0x6B, 0x69, 0x6E, 0x61, 0x78, 0x65, 0x5A, 0x56, 0x4C, 0x36, 0x48, + 0x53, 0x75, 0x4F, 0x70, 0x58, 0x67, 0x52, 0x4D, 0x36, 0x78, 0x42, 0x74, 0x56, 0x4E, 0x62, 0x76, 0x38, 0x65, 0x6A, 0x79, 0x0A, 0x59, 0x68, 0x62, 0x4C, 0x67, 0x47, 0x76, 0x74, 0x50, 0x65, 0x33, 0x31, 0x48, 0x7A, 0x43, 0x6C, 0x72, 0x6B, 0x76, + 0x4A, 0x45, 0x2B, 0x32, 0x4B, 0x41, 0x51, 0x48, 0x4A, 0x75, 0x46, 0x46, 0x59, 0x77, 0x47, 0x59, 0x36, 0x73, 0x57, 0x5A, 0x4C, 0x78, 0x4E, 0x55, 0x78, 0x41, 0x6D, 0x4C, 0x70, 0x64, 0x49, 0x51, 0x4D, 0x32, 0x30, 0x31, 0x47, 0x4C, 0x51, 0x49, + 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x30, 0x70, 0x2B, 0x49, 0x33, 0x36, 0x48, 0x4E, 0x4C, 0x4C, 0x33, 0x73, 0x39, 0x54, + 0x73, 0x42, 0x41, 0x5A, 0x4D, 0x7A, 0x4A, 0x37, 0x4C, 0x72, 0x59, 0x45, 0x73, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, + 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x0A, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, + 0x67, 0x49, 0x42, 0x41, 0x44, 0x4C, 0x4B, 0x67, 0x4C, 0x4F, 0x64, 0x50, 0x56, 0x51, 0x47, 0x33, 0x64, 0x4C, 0x53, 0x4C, 0x76, 0x43, 0x6B, 0x41, 0x53, 0x45, 0x4C, 0x5A, 0x30, 0x6A, 0x4B, 0x62, 0x59, 0x37, 0x67, 0x79, 0x4B, 0x6F, 0x4E, 0x71, + 0x6F, 0x30, 0x68, 0x56, 0x34, 0x2F, 0x47, 0x50, 0x6E, 0x72, 0x4B, 0x0A, 0x32, 0x31, 0x48, 0x55, 0x55, 0x72, 0x50, 0x55, 0x6C, 0x6F, 0x53, 0x6C, 0x57, 0x47, 0x42, 0x2F, 0x35, 0x51, 0x75, 0x4F, 0x48, 0x2F, 0x58, 0x63, 0x43, 0x68, 0x57, 0x42, + 0x35, 0x54, 0x75, 0x32, 0x74, 0x79, 0x49, 0x76, 0x43, 0x5A, 0x77, 0x54, 0x46, 0x72, 0x46, 0x73, 0x44, 0x44, 0x55, 0x49, 0x62, 0x61, 0x74, 0x6A, 0x63, 0x75, 0x33, 0x63, 0x76, 0x75, 0x7A, 0x48, 0x56, 0x2B, 0x59, 0x77, 0x49, 0x48, 0x48, 0x57, + 0x31, 0x78, 0x44, 0x42, 0x45, 0x31, 0x55, 0x42, 0x0A, 0x6A, 0x43, 0x70, 0x44, 0x35, 0x45, 0x48, 0x78, 0x7A, 0x7A, 0x70, 0x36, 0x55, 0x35, 0x4C, 0x4F, 0x6F, 0x67, 0x4D, 0x46, 0x44, 0x54, 0x6A, 0x66, 0x41, 0x72, 0x73, 0x51, 0x4C, 0x74, 0x6B, + 0x37, 0x30, 0x70, 0x74, 0x36, 0x77, 0x4B, 0x47, 0x6D, 0x2B, 0x4C, 0x55, 0x78, 0x35, 0x76, 0x52, 0x31, 0x79, 0x62, 0x6C, 0x54, 0x6D, 0x58, 0x56, 0x48, 0x49, 0x6C, 0x6F, 0x55, 0x46, 0x63, 0x64, 0x34, 0x47, 0x37, 0x61, 0x64, 0x36, 0x51, 0x7A, + 0x34, 0x47, 0x33, 0x62, 0x78, 0x0A, 0x68, 0x59, 0x54, 0x65, 0x6F, 0x64, 0x6F, 0x53, 0x37, 0x36, 0x54, 0x69, 0x45, 0x4A, 0x64, 0x36, 0x65, 0x4E, 0x34, 0x4D, 0x55, 0x5A, 0x65, 0x6F, 0x49, 0x55, 0x43, 0x4C, 0x68, 0x72, 0x30, 0x4E, 0x38, 0x46, + 0x35, 0x4F, 0x53, 0x7A, 0x61, 0x37, 0x4F, 0x79, 0x41, 0x66, 0x69, 0x6B, 0x4A, 0x57, 0x34, 0x51, 0x73, 0x61, 0x76, 0x33, 0x76, 0x51, 0x49, 0x6B, 0x4D, 0x73, 0x52, 0x49, 0x7A, 0x37, 0x35, 0x53, 0x71, 0x30, 0x62, 0x42, 0x77, 0x63, 0x75, 0x70, + 0x54, 0x67, 0x0A, 0x45, 0x33, 0x34, 0x68, 0x35, 0x70, 0x72, 0x43, 0x79, 0x38, 0x56, 0x43, 0x5A, 0x4C, 0x51, 0x65, 0x6C, 0x48, 0x73, 0x49, 0x4A, 0x63, 0x68, 0x78, 0x7A, 0x49, 0x64, 0x46, 0x56, 0x34, 0x58, 0x54, 0x6E, 0x79, 0x6C, 0x69, 0x49, + 0x6F, 0x4E, 0x52, 0x6C, 0x77, 0x41, 0x59, 0x6C, 0x33, 0x64, 0x71, 0x6D, 0x4A, 0x4C, 0x4A, 0x66, 0x47, 0x42, 0x73, 0x33, 0x32, 0x78, 0x39, 0x53, 0x75, 0x52, 0x77, 0x54, 0x4D, 0x4B, 0x65, 0x75, 0x42, 0x33, 0x33, 0x30, 0x44, 0x54, 0x48, 0x0A, + 0x44, 0x38, 0x7A, 0x37, 0x70, 0x2F, 0x38, 0x44, 0x76, 0x71, 0x31, 0x77, 0x6B, 0x4E, 0x6F, 0x4C, 0x33, 0x63, 0x68, 0x74, 0x6C, 0x31, 0x2B, 0x61, 0x66, 0x77, 0x6B, 0x79, 0x51, 0x66, 0x33, 0x4E, 0x6F, 0x73, 0x78, 0x61, 0x62, 0x55, 0x7A, 0x79, + 0x71, 0x6B, 0x6E, 0x2B, 0x5A, 0x76, 0x6A, 0x70, 0x32, 0x44, 0x58, 0x72, 0x44, 0x69, 0x67, 0x65, 0x37, 0x6B, 0x67, 0x76, 0x4F, 0x74, 0x42, 0x35, 0x43, 0x54, 0x68, 0x38, 0x70, 0x69, 0x4B, 0x43, 0x6B, 0x35, 0x58, 0x51, 0x0A, 0x41, 0x37, 0x36, + 0x2B, 0x41, 0x71, 0x41, 0x46, 0x33, 0x53, 0x41, 0x69, 0x34, 0x32, 0x38, 0x64, 0x69, 0x44, 0x52, 0x67, 0x78, 0x75, 0x59, 0x4B, 0x75, 0x51, 0x6C, 0x31, 0x43, 0x2F, 0x41, 0x48, 0x36, 0x47, 0x6D, 0x57, 0x4E, 0x63, 0x66, 0x37, 0x49, 0x34, 0x47, + 0x4F, 0x4F, 0x44, 0x6D, 0x34, 0x52, 0x53, 0x74, 0x44, 0x65, 0x4B, 0x4C, 0x52, 0x4C, 0x42, 0x54, 0x2F, 0x44, 0x53, 0x68, 0x79, 0x63, 0x70, 0x57, 0x62, 0x58, 0x67, 0x6E, 0x62, 0x69, 0x55, 0x53, 0x59, 0x0A, 0x71, 0x71, 0x46, 0x4A, 0x75, 0x33, + 0x46, 0x53, 0x38, 0x72, 0x2F, 0x32, 0x2F, 0x79, 0x65, 0x68, 0x4E, 0x71, 0x2B, 0x34, 0x74, 0x6E, 0x65, 0x49, 0x33, 0x54, 0x71, 0x6B, 0x62, 0x5A, 0x73, 0x30, 0x6B, 0x4E, 0x77, 0x55, 0x58, 0x54, 0x43, 0x2F, 0x74, 0x2B, 0x73, 0x58, 0x35, 0x49, + 0x65, 0x33, 0x63, 0x64, 0x43, 0x68, 0x31, 0x33, 0x63, 0x56, 0x31, 0x45, 0x4C, 0x58, 0x38, 0x76, 0x4D, 0x78, 0x6D, 0x56, 0x32, 0x62, 0x33, 0x52, 0x5A, 0x74, 0x50, 0x2B, 0x6F, 0x47, 0x0A, 0x49, 0x2F, 0x68, 0x47, 0x6F, 0x69, 0x4C, 0x74, 0x6B, + 0x2F, 0x62, 0x64, 0x6D, 0x75, 0x59, 0x71, 0x68, 0x37, 0x47, 0x59, 0x56, 0x50, 0x45, 0x69, 0x39, 0x32, 0x74, 0x46, 0x34, 0x2B, 0x4B, 0x4F, 0x64, 0x68, 0x32, 0x61, 0x6A, 0x63, 0x51, 0x47, 0x6A, 0x54, 0x61, 0x33, 0x46, 0x50, 0x4F, 0x64, 0x56, + 0x47, 0x6D, 0x33, 0x6A, 0x6A, 0x7A, 0x56, 0x70, 0x47, 0x32, 0x54, 0x67, 0x62, 0x65, 0x74, 0x39, 0x72, 0x31, 0x6B, 0x65, 0x38, 0x4C, 0x4A, 0x61, 0x44, 0x6D, 0x67, 0x0A, 0x6B, 0x70, 0x7A, 0x4E, 0x4E, 0x49, 0x61, 0x52, 0x6B, 0x50, 0x70, 0x6B, + 0x55, 0x5A, 0x33, 0x2B, 0x2F, 0x75, 0x75, 0x6C, 0x39, 0x58, 0x58, 0x65, 0x69, 0x66, 0x64, 0x79, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x43, 0x20, 0x52, 0x41, 0x49, 0x5A, 0x20, 0x46, 0x4E, 0x4D, 0x54, 0x2D, 0x52, 0x43, 0x4D, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x44, 0x4F, 0x52, 0x45, 0x53, 0x20, 0x53, 0x45, 0x47, 0x55, 0x52, 0x4F, 0x53, 0x0A, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x62, 0x6A, 0x43, 0x43, 0x41, 0x66, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, + 0x41, 0x67, 0x49, 0x51, 0x59, 0x76, 0x59, 0x79, 0x62, 0x4F, 0x58, 0x45, 0x34, 0x32, 0x68, 0x63, 0x47, 0x32, 0x4C, 0x64, 0x6E, 0x43, 0x36, 0x64, 0x6C, 0x54, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, + 0x41, 0x7A, 0x42, 0x34, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x46, 0x0A, 0x55, 0x7A, 0x45, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x49, 0x52, 0x6B, 0x35, + 0x4E, 0x56, 0x43, 0x31, 0x53, 0x51, 0x30, 0x30, 0x78, 0x44, 0x6A, 0x41, 0x4D, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x73, 0x4D, 0x42, 0x55, 0x4E, 0x6C, 0x63, 0x6D, 0x56, 0x7A, 0x4D, 0x52, 0x67, 0x77, 0x46, 0x67, 0x59, 0x44, 0x56, 0x51, 0x52, + 0x68, 0x44, 0x41, 0x39, 0x57, 0x51, 0x56, 0x52, 0x46, 0x55, 0x79, 0x31, 0x52, 0x4D, 0x6A, 0x67, 0x79, 0x0A, 0x4E, 0x6A, 0x41, 0x77, 0x4E, 0x45, 0x6F, 0x78, 0x4C, 0x44, 0x41, 0x71, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x49, 0x30, + 0x46, 0x44, 0x49, 0x46, 0x4A, 0x42, 0x53, 0x56, 0x6F, 0x67, 0x52, 0x6B, 0x35, 0x4E, 0x56, 0x43, 0x31, 0x53, 0x51, 0x30, 0x30, 0x67, 0x55, 0x30, 0x56, 0x53, 0x56, 0x6B, 0x6C, 0x45, 0x54, 0x31, 0x4A, 0x46, 0x55, 0x79, 0x42, 0x54, 0x52, 0x55, + 0x64, 0x56, 0x55, 0x6B, 0x39, 0x54, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x34, 0x0A, 0x4D, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x35, 0x4D, 0x7A, 0x63, 0x7A, 0x4D, 0x31, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x7A, 0x4D, 0x54, 0x49, 0x79, 0x4D, + 0x44, 0x41, 0x35, 0x4D, 0x7A, 0x63, 0x7A, 0x4D, 0x31, 0x6F, 0x77, 0x65, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x56, 0x4D, 0x78, 0x45, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x6F, 0x4D, 0x43, 0x45, 0x5A, 0x4F, 0x54, 0x56, 0x51, 0x74, 0x0A, 0x55, 0x6B, 0x4E, 0x4E, 0x4D, 0x51, 0x34, 0x77, 0x44, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x44, 0x41, 0x56, 0x44, 0x5A, 0x58, 0x4A, 0x6C, 0x63, 0x7A, 0x45, 0x59, + 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x59, 0x51, 0x77, 0x50, 0x56, 0x6B, 0x46, 0x55, 0x52, 0x56, 0x4D, 0x74, 0x55, 0x54, 0x49, 0x34, 0x4D, 0x6A, 0x59, 0x77, 0x4D, 0x44, 0x52, 0x4B, 0x4D, 0x53, 0x77, 0x77, 0x4B, 0x67, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x4E, 0x42, 0x0A, 0x51, 0x79, 0x42, 0x53, 0x51, 0x55, 0x6C, 0x61, 0x49, 0x45, 0x5A, 0x4F, 0x54, 0x56, 0x51, 0x74, 0x55, 0x6B, 0x4E, 0x4E, 0x49, 0x46, 0x4E, 0x46, 0x55, 0x6C, 0x5A, 0x4A, 0x52, 0x45, 0x39, + 0x53, 0x52, 0x56, 0x4D, 0x67, 0x55, 0x30, 0x56, 0x48, 0x56, 0x56, 0x4A, 0x50, 0x55, 0x7A, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, + 0x69, 0x41, 0x32, 0x49, 0x41, 0x0A, 0x42, 0x50, 0x61, 0x36, 0x56, 0x31, 0x50, 0x49, 0x79, 0x71, 0x76, 0x66, 0x4E, 0x6B, 0x70, 0x53, 0x49, 0x65, 0x53, 0x58, 0x30, 0x6F, 0x4E, 0x6E, 0x6E, 0x76, 0x42, 0x6C, 0x55, 0x64, 0x42, 0x65, 0x68, 0x38, + 0x64, 0x48, 0x73, 0x56, 0x6E, 0x79, 0x56, 0x30, 0x65, 0x62, 0x41, 0x41, 0x4B, 0x54, 0x52, 0x42, 0x64, 0x70, 0x32, 0x30, 0x4C, 0x48, 0x73, 0x62, 0x49, 0x36, 0x47, 0x41, 0x36, 0x30, 0x58, 0x59, 0x79, 0x7A, 0x5A, 0x6C, 0x32, 0x68, 0x4E, 0x50, + 0x6B, 0x32, 0x0A, 0x4C, 0x45, 0x6E, 0x62, 0x38, 0x30, 0x62, 0x38, 0x73, 0x30, 0x52, 0x70, 0x52, 0x42, 0x4E, 0x6D, 0x2F, 0x64, 0x66, 0x46, 0x2F, 0x61, 0x38, 0x32, 0x54, 0x63, 0x34, 0x44, 0x54, 0x51, 0x64, 0x78, 0x7A, 0x36, 0x39, 0x71, 0x42, + 0x64, 0x4B, 0x69, 0x51, 0x31, 0x6F, 0x4B, 0x55, 0x6D, 0x38, 0x42, 0x41, 0x30, 0x36, 0x4F, 0x69, 0x36, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x0A, + 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, + 0x46, 0x41, 0x47, 0x35, 0x4C, 0x2B, 0x2B, 0x2F, 0x45, 0x59, 0x5A, 0x67, 0x38, 0x6B, 0x2F, 0x51, 0x51, 0x57, 0x36, 0x72, 0x63, 0x78, 0x2F, 0x6E, 0x30, 0x6D, 0x35, 0x4A, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x0A, 0x53, 0x4D, 0x34, + 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x6B, 0x41, 0x4D, 0x47, 0x59, 0x43, 0x4D, 0x51, 0x43, 0x75, 0x53, 0x75, 0x4D, 0x72, 0x51, 0x4D, 0x4E, 0x30, 0x45, 0x66, 0x4B, 0x56, 0x72, 0x52, 0x59, 0x6A, 0x33, 0x6B, 0x34, 0x4D, 0x47, 0x75, 0x5A, + 0x64, 0x70, 0x53, 0x52, 0x65, 0x61, 0x30, 0x52, 0x37, 0x2F, 0x44, 0x6A, 0x69, 0x54, 0x38, 0x75, 0x63, 0x52, 0x52, 0x63, 0x52, 0x54, 0x42, 0x51, 0x6E, 0x4A, 0x6C, 0x55, 0x35, 0x64, 0x55, 0x6F, 0x44, 0x0A, 0x7A, 0x42, 0x4F, 0x51, 0x6E, 0x35, + 0x49, 0x43, 0x4D, 0x51, 0x44, 0x36, 0x53, 0x6D, 0x78, 0x67, 0x69, 0x48, 0x50, 0x7A, 0x37, 0x72, 0x69, 0x59, 0x59, 0x71, 0x6E, 0x4F, 0x4B, 0x38, 0x4C, 0x5A, 0x69, 0x71, 0x5A, 0x77, 0x4D, 0x52, 0x32, 0x76, 0x73, 0x4A, 0x52, 0x4D, 0x36, 0x30, + 0x2F, 0x47, 0x34, 0x39, 0x48, 0x7A, 0x59, 0x71, 0x63, 0x38, 0x2F, 0x35, 0x4D, 0x75, 0x42, 0x31, 0x78, 0x4A, 0x41, 0x57, 0x64, 0x70, 0x45, 0x67, 0x4A, 0x79, 0x76, 0x2B, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x34, 0x36, 0x0A, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x57, 0x6A, 0x43, 0x43, 0x41, 0x30, 0x4B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x53, 0x45, 0x64, 0x4B, 0x37, 0x75, 0x64, 0x63, 0x6A, 0x47, 0x4A, 0x35, 0x41, 0x58, 0x77, + 0x71, 0x64, 0x4C, 0x64, 0x44, 0x66, 0x4A, 0x57, 0x66, 0x52, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x44, 0x41, 0x55, 0x41, 0x4D, 0x45, 0x59, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, + 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4A, 0x46, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, + 0x47, 0x35, 0x32, 0x4C, 0x58, 0x4E, 0x68, 0x4D, 0x52, 0x77, 0x77, 0x47, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4E, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x0A, + 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x51, 0x32, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x35, 0x4D, 0x44, 0x4D, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x32, 0x4D, 0x44, 0x4D, 0x79, + 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x52, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x55, 0x78, 0x47, 0x54, 0x41, 0x58, 0x0A, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x62, 0x6E, 0x59, 0x74, 0x63, 0x32, 0x45, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, + 0x54, 0x45, 0x30, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x53, 0x4E, 0x44, 0x59, 0x77, 0x67, 0x67, 0x49, 0x69, 0x0A, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, + 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x73, 0x72, 0x48, 0x51, 0x79, 0x36, 0x4C, + 0x4E, 0x6C, 0x35, 0x62, 0x72, 0x74, 0x51, 0x79, 0x59, 0x64, 0x70, 0x6F, 0x6B, 0x4E, 0x52, 0x62, 0x6F, 0x70, 0x69, 0x4C, 0x4B, 0x6B, 0x48, 0x57, 0x50, 0x64, 0x30, 0x38, 0x45, 0x73, 0x0A, 0x43, 0x56, 0x65, 0x4A, 0x4F, 0x61, 0x46, 0x56, 0x36, + 0x57, 0x63, 0x30, 0x64, 0x77, 0x78, 0x75, 0x35, 0x46, 0x55, 0x64, 0x55, 0x69, 0x58, 0x53, 0x45, 0x32, 0x74, 0x65, 0x34, 0x52, 0x32, 0x70, 0x74, 0x33, 0x32, 0x4A, 0x4D, 0x6C, 0x38, 0x4E, 0x6E, 0x70, 0x38, 0x73, 0x65, 0x6D, 0x4E, 0x67, 0x51, + 0x42, 0x2B, 0x6D, 0x73, 0x4C, 0x5A, 0x34, 0x6A, 0x35, 0x6C, 0x55, 0x6C, 0x67, 0x68, 0x59, 0x72, 0x75, 0x51, 0x47, 0x76, 0x47, 0x49, 0x46, 0x41, 0x68, 0x61, 0x2F, 0x0A, 0x72, 0x36, 0x67, 0x6A, 0x41, 0x37, 0x61, 0x55, 0x44, 0x37, 0x78, 0x75, + 0x62, 0x4D, 0x4C, 0x4C, 0x31, 0x61, 0x61, 0x37, 0x44, 0x4F, 0x6E, 0x32, 0x77, 0x51, 0x4C, 0x37, 0x49, 0x64, 0x35, 0x6D, 0x33, 0x52, 0x65, 0x72, 0x64, 0x45, 0x4C, 0x76, 0x38, 0x48, 0x51, 0x76, 0x4A, 0x66, 0x54, 0x71, 0x61, 0x31, 0x56, 0x62, + 0x6B, 0x4E, 0x75, 0x64, 0x33, 0x31, 0x36, 0x48, 0x43, 0x6B, 0x44, 0x37, 0x72, 0x52, 0x6C, 0x72, 0x2B, 0x2F, 0x66, 0x4B, 0x59, 0x49, 0x6A, 0x65, 0x0A, 0x32, 0x73, 0x47, 0x50, 0x31, 0x71, 0x37, 0x56, 0x66, 0x39, 0x51, 0x38, 0x67, 0x2B, 0x37, + 0x58, 0x46, 0x6B, 0x79, 0x44, 0x52, 0x54, 0x4E, 0x72, 0x4A, 0x39, 0x43, 0x47, 0x30, 0x42, 0x77, 0x74, 0x61, 0x2F, 0x4F, 0x72, 0x66, 0x66, 0x47, 0x46, 0x71, 0x66, 0x55, 0x6F, 0x30, 0x71, 0x33, 0x76, 0x38, 0x34, 0x52, 0x4C, 0x48, 0x49, 0x66, + 0x38, 0x45, 0x36, 0x4D, 0x36, 0x63, 0x71, 0x4A, 0x61, 0x45, 0x53, 0x76, 0x57, 0x4A, 0x33, 0x45, 0x6E, 0x37, 0x59, 0x45, 0x74, 0x0A, 0x62, 0x57, 0x61, 0x42, 0x6B, 0x6F, 0x65, 0x30, 0x47, 0x31, 0x68, 0x36, 0x7A, 0x44, 0x38, 0x4B, 0x2B, 0x6B, + 0x5A, 0x50, 0x54, 0x58, 0x68, 0x63, 0x2B, 0x43, 0x74, 0x49, 0x34, 0x77, 0x53, 0x45, 0x79, 0x31, 0x33, 0x32, 0x74, 0x47, 0x71, 0x7A, 0x5A, 0x66, 0x78, 0x43, 0x6E, 0x6C, 0x45, 0x6D, 0x49, 0x79, 0x44, 0x4C, 0x50, 0x52, 0x54, 0x35, 0x67, 0x65, + 0x31, 0x6C, 0x46, 0x67, 0x42, 0x50, 0x47, 0x6D, 0x53, 0x58, 0x5A, 0x67, 0x6A, 0x50, 0x6A, 0x48, 0x76, 0x6A, 0x0A, 0x4B, 0x38, 0x43, 0x64, 0x2B, 0x52, 0x54, 0x79, 0x47, 0x2F, 0x46, 0x57, 0x61, 0x68, 0x61, 0x2F, 0x4C, 0x49, 0x57, 0x46, 0x7A, + 0x58, 0x67, 0x34, 0x6D, 0x75, 0x74, 0x43, 0x61, 0x67, 0x49, 0x30, 0x47, 0x49, 0x4D, 0x58, 0x54, 0x70, 0x52, 0x57, 0x2B, 0x4C, 0x61, 0x43, 0x74, 0x66, 0x4F, 0x57, 0x33, 0x54, 0x33, 0x7A, 0x76, 0x6E, 0x38, 0x67, 0x64, 0x7A, 0x35, 0x37, 0x47, + 0x53, 0x4E, 0x72, 0x4C, 0x4E, 0x52, 0x79, 0x63, 0x30, 0x4E, 0x58, 0x66, 0x65, 0x44, 0x34, 0x0A, 0x31, 0x32, 0x6C, 0x50, 0x46, 0x7A, 0x59, 0x45, 0x2B, 0x63, 0x43, 0x51, 0x59, 0x44, 0x64, 0x46, 0x33, 0x75, 0x59, 0x4D, 0x32, 0x48, 0x53, 0x4E, + 0x72, 0x70, 0x79, 0x69, 0x62, 0x58, 0x52, 0x64, 0x51, 0x72, 0x34, 0x47, 0x39, 0x64, 0x6C, 0x6B, 0x62, 0x67, 0x49, 0x51, 0x72, 0x49, 0x6D, 0x77, 0x54, 0x44, 0x73, 0x48, 0x54, 0x55, 0x42, 0x2B, 0x4A, 0x4D, 0x57, 0x4B, 0x6D, 0x49, 0x4A, 0x35, + 0x6A, 0x71, 0x53, 0x6E, 0x67, 0x69, 0x43, 0x4E, 0x49, 0x2F, 0x6F, 0x6E, 0x0A, 0x63, 0x63, 0x6E, 0x66, 0x78, 0x6B, 0x46, 0x30, 0x6F, 0x45, 0x33, 0x32, 0x6B, 0x52, 0x62, 0x63, 0x52, 0x6F, 0x78, 0x66, 0x4B, 0x57, 0x4D, 0x78, 0x57, 0x58, 0x45, + 0x4D, 0x32, 0x47, 0x2F, 0x43, 0x74, 0x6A, 0x4A, 0x39, 0x2B, 0x2B, 0x5A, 0x64, 0x55, 0x36, 0x5A, 0x2B, 0x46, 0x66, 0x79, 0x37, 0x64, 0x58, 0x78, 0x64, 0x37, 0x50, 0x6A, 0x32, 0x46, 0x78, 0x7A, 0x73, 0x78, 0x32, 0x73, 0x5A, 0x79, 0x2F, 0x4E, + 0x37, 0x38, 0x43, 0x73, 0x48, 0x70, 0x64, 0x6C, 0x73, 0x0A, 0x65, 0x56, 0x52, 0x32, 0x62, 0x4A, 0x30, 0x63, 0x70, 0x6D, 0x34, 0x4F, 0x36, 0x58, 0x6B, 0x4D, 0x71, 0x43, 0x4E, 0x71, 0x6F, 0x39, 0x38, 0x62, 0x4D, 0x44, 0x47, 0x66, 0x73, 0x56, + 0x52, 0x37, 0x2F, 0x6D, 0x72, 0x4C, 0x5A, 0x71, 0x72, 0x63, 0x5A, 0x64, 0x43, 0x69, 0x6E, 0x6B, 0x71, 0x61, 0x42, 0x79, 0x46, 0x72, 0x67, 0x59, 0x2F, 0x62, 0x78, 0x46, 0x6E, 0x36, 0x33, 0x69, 0x4C, 0x41, 0x42, 0x4A, 0x7A, 0x6A, 0x71, 0x6C, + 0x73, 0x32, 0x6B, 0x2B, 0x67, 0x39, 0x0A, 0x76, 0x58, 0x71, 0x68, 0x6E, 0x51, 0x74, 0x32, 0x73, 0x51, 0x76, 0x48, 0x6E, 0x66, 0x33, 0x50, 0x6D, 0x4B, 0x67, 0x47, 0x77, 0x76, 0x67, 0x71, 0x6F, 0x36, 0x47, 0x44, 0x6F, 0x4C, 0x63, 0x6C, 0x63, + 0x71, 0x55, 0x43, 0x34, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, + 0x77, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x41, 0x31, 0x79, 0x72, + 0x63, 0x34, 0x47, 0x48, 0x71, 0x4D, 0x79, 0x77, 0x70, 0x74, 0x57, 0x55, 0x34, 0x6A, 0x61, 0x57, 0x53, 0x66, 0x38, 0x46, 0x6D, 0x53, 0x77, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, + 0x0A, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x48, 0x78, 0x34, 0x37, 0x50, 0x59, 0x43, 0x4C, 0x4C, 0x74, 0x62, 0x66, 0x70, 0x49, 0x72, 0x58, 0x54, 0x6E, 0x63, 0x76, 0x74, 0x67, 0x64, 0x6F, 0x6B, 0x49, 0x7A, 0x54, 0x66, 0x6E, + 0x76, 0x70, 0x43, 0x6F, 0x37, 0x52, 0x47, 0x6B, 0x65, 0x72, 0x4E, 0x6C, 0x46, 0x6F, 0x30, 0x34, 0x38, 0x70, 0x39, 0x67, 0x6B, 0x55, 0x62, 0x4A, 0x55, 0x48, 0x4A, 0x4E, 0x4F, 0x78, 0x4F, 0x39, 0x37, 0x6B, 0x34, 0x56, 0x67, 0x0A, 0x4A, 0x75, + 0x6F, 0x4A, 0x53, 0x4F, 0x44, 0x31, 0x75, 0x38, 0x66, 0x70, 0x61, 0x4E, 0x4B, 0x37, 0x61, 0x6A, 0x46, 0x78, 0x7A, 0x48, 0x6D, 0x75, 0x45, 0x61, 0x6A, 0x77, 0x6D, 0x66, 0x33, 0x6C, 0x48, 0x37, 0x77, 0x76, 0x71, 0x4D, 0x78, 0x58, 0x36, 0x33, + 0x62, 0x45, 0x49, 0x61, 0x5A, 0x48, 0x55, 0x31, 0x56, 0x4E, 0x61, 0x4C, 0x38, 0x46, 0x70, 0x4F, 0x37, 0x58, 0x4A, 0x71, 0x74, 0x69, 0x32, 0x6B, 0x4D, 0x33, 0x53, 0x2B, 0x4C, 0x47, 0x74, 0x65, 0x57, 0x79, 0x0A, 0x67, 0x78, 0x6B, 0x36, 0x78, + 0x39, 0x50, 0x62, 0x54, 0x5A, 0x34, 0x49, 0x65, 0x76, 0x50, 0x75, 0x7A, 0x7A, 0x35, 0x69, 0x2B, 0x36, 0x7A, 0x6F, 0x59, 0x4D, 0x7A, 0x52, 0x78, 0x36, 0x46, 0x63, 0x67, 0x30, 0x58, 0x45, 0x52, 0x63, 0x7A, 0x7A, 0x46, 0x32, 0x73, 0x55, 0x79, + 0x51, 0x51, 0x43, 0x50, 0x74, 0x49, 0x6B, 0x70, 0x6E, 0x6E, 0x70, 0x48, 0x73, 0x36, 0x69, 0x35, 0x38, 0x46, 0x5A, 0x46, 0x5A, 0x38, 0x64, 0x34, 0x6B, 0x75, 0x61, 0x50, 0x70, 0x39, 0x32, 0x0A, 0x43, 0x43, 0x31, 0x72, 0x32, 0x4C, 0x70, 0x58, + 0x46, 0x4E, 0x71, 0x44, 0x36, 0x76, 0x36, 0x4D, 0x56, 0x65, 0x6E, 0x51, 0x54, 0x71, 0x6E, 0x4D, 0x64, 0x7A, 0x47, 0x78, 0x52, 0x42, 0x46, 0x36, 0x58, 0x4C, 0x45, 0x2B, 0x30, 0x78, 0x52, 0x46, 0x46, 0x52, 0x68, 0x69, 0x4A, 0x42, 0x50, 0x53, + 0x79, 0x30, 0x33, 0x4F, 0x58, 0x49, 0x50, 0x42, 0x4E, 0x76, 0x49, 0x51, 0x74, 0x51, 0x36, 0x49, 0x62, 0x62, 0x6A, 0x68, 0x56, 0x70, 0x2B, 0x4A, 0x33, 0x70, 0x5A, 0x6D, 0x0A, 0x4F, 0x55, 0x64, 0x6B, 0x4C, 0x47, 0x35, 0x4E, 0x72, 0x6D, 0x4A, + 0x37, 0x76, 0x32, 0x42, 0x30, 0x47, 0x62, 0x68, 0x57, 0x72, 0x4A, 0x4B, 0x73, 0x46, 0x6A, 0x4C, 0x74, 0x72, 0x57, 0x68, 0x56, 0x2F, 0x70, 0x69, 0x36, 0x30, 0x7A, 0x54, 0x65, 0x39, 0x4D, 0x6C, 0x68, 0x77, 0x77, 0x36, 0x47, 0x39, 0x6B, 0x75, + 0x45, 0x59, 0x4F, 0x34, 0x4E, 0x65, 0x37, 0x55, 0x79, 0x57, 0x48, 0x6D, 0x52, 0x56, 0x53, 0x79, 0x42, 0x51, 0x37, 0x4E, 0x30, 0x48, 0x33, 0x71, 0x71, 0x0A, 0x4A, 0x5A, 0x34, 0x64, 0x31, 0x36, 0x47, 0x4C, 0x75, 0x63, 0x31, 0x43, 0x4C, 0x67, + 0x53, 0x6B, 0x5A, 0x6F, 0x4E, 0x4E, 0x69, 0x54, 0x57, 0x32, 0x62, 0x4B, 0x67, 0x32, 0x53, 0x6E, 0x6B, 0x68, 0x65, 0x43, 0x4C, 0x51, 0x51, 0x72, 0x7A, 0x52, 0x51, 0x44, 0x47, 0x51, 0x6F, 0x62, 0x34, 0x45, 0x7A, 0x38, 0x70, 0x6E, 0x37, 0x66, + 0x58, 0x77, 0x67, 0x4E, 0x4E, 0x67, 0x79, 0x59, 0x4D, 0x71, 0x49, 0x67, 0x58, 0x51, 0x42, 0x7A, 0x74, 0x53, 0x76, 0x77, 0x79, 0x65, 0x0A, 0x71, 0x69, 0x76, 0x35, 0x75, 0x2B, 0x59, 0x66, 0x6A, 0x79, 0x57, 0x36, 0x68, 0x59, 0x30, 0x58, 0x48, + 0x67, 0x4C, 0x2B, 0x58, 0x56, 0x41, 0x45, 0x56, 0x38, 0x2F, 0x2B, 0x4C, 0x62, 0x7A, 0x76, 0x58, 0x4D, 0x41, 0x61, 0x71, 0x37, 0x61, 0x66, 0x4A, 0x4D, 0x62, 0x66, 0x63, 0x32, 0x68, 0x49, 0x6B, 0x43, 0x77, 0x55, 0x39, 0x44, 0x39, 0x53, 0x47, + 0x75, 0x54, 0x53, 0x79, 0x78, 0x54, 0x44, 0x59, 0x57, 0x6E, 0x50, 0x34, 0x76, 0x6B, 0x59, 0x78, 0x62, 0x6F, 0x7A, 0x0A, 0x6E, 0x78, 0x53, 0x6A, 0x42, 0x46, 0x32, 0x35, 0x63, 0x66, 0x65, 0x31, 0x6C, 0x4E, 0x6A, 0x32, 0x4D, 0x38, 0x46, 0x61, + 0x77, 0x54, 0x53, 0x4C, 0x66, 0x4A, 0x76, 0x64, 0x6B, 0x7A, 0x72, 0x6E, 0x45, 0x36, 0x4A, 0x77, 0x59, 0x5A, 0x2B, 0x76, 0x6A, 0x2B, 0x76, 0x59, 0x78, 0x58, 0x58, 0x34, 0x4D, 0x32, 0x62, 0x55, 0x64, 0x47, 0x63, 0x36, 0x4E, 0x33, 0x65, 0x63, + 0x35, 0x39, 0x32, 0x6B, 0x44, 0x33, 0x5A, 0x44, 0x5A, 0x6F, 0x70, 0x44, 0x38, 0x70, 0x2F, 0x37, 0x0A, 0x44, 0x45, 0x4A, 0x34, 0x59, 0x39, 0x48, 0x69, 0x44, 0x32, 0x39, 0x37, 0x31, 0x4B, 0x45, 0x39, 0x64, 0x4A, 0x65, 0x46, 0x74, 0x30, 0x67, + 0x35, 0x51, 0x64, 0x59, 0x67, 0x2F, 0x4E, 0x41, 0x36, 0x73, 0x2F, 0x72, 0x6F, 0x62, 0x38, 0x53, 0x4B, 0x75, 0x6E, 0x45, 0x33, 0x76, 0x6F, 0x75, 0x58, 0x73, 0x58, 0x67, 0x78, 0x54, 0x37, 0x50, 0x6E, 0x74, 0x67, 0x4D, 0x54, 0x7A, 0x6C, 0x53, + 0x64, 0x72, 0x69, 0x56, 0x5A, 0x7A, 0x48, 0x38, 0x31, 0x58, 0x77, 0x6A, 0x33, 0x0A, 0x51, 0x45, 0x55, 0x78, 0x65, 0x43, 0x70, 0x36, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x45, 0x34, 0x36, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, + 0x49, 0x43, 0x43, 0x7A, 0x43, 0x43, 0x41, 0x5A, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x53, 0x45, 0x64, 0x4B, 0x37, 0x75, 0x6A, 0x4E, 0x75, 0x31, 0x4C, 0x7A, 0x6D, 0x4A, 0x47, 0x6A, 0x46, 0x44, 0x59, 0x51, 0x64, 0x6D, 0x4F, + 0x68, 0x44, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x4D, 0x45, 0x59, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x0A, 0x41, 0x6B, 0x4A, 0x46, 0x4D, + 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x47, 0x35, 0x32, 0x4C, 0x58, 0x4E, 0x68, 0x4D, 0x52, 0x77, 0x77, 0x47, + 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4E, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x0A, 0x52, 0x54, 0x51, 0x32, 0x4D, 0x42, 0x34, 0x58, + 0x44, 0x54, 0x45, 0x35, 0x4D, 0x44, 0x4D, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x32, 0x4D, 0x44, 0x4D, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, + 0x52, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x6B, 0x55, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, + 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x62, 0x6E, 0x59, 0x74, 0x63, 0x32, 0x45, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x30, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, + 0x70, 0x5A, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x46, 0x4E, 0x44, 0x59, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x0A, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, + 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x53, 0x63, 0x44, 0x72, 0x48, 0x50, 0x74, 0x2B, 0x69, 0x65, 0x55, 0x6E, 0x64, 0x31, 0x4E, 0x50, 0x71, 0x6C, 0x52, 0x71, 0x65, 0x74, 0x4D, 0x68, 0x6B, 0x79, 0x74, 0x41, 0x65, 0x70, 0x4A, 0x38, + 0x71, 0x55, 0x75, 0x77, 0x7A, 0x53, 0x43, 0x68, 0x44, 0x48, 0x32, 0x6F, 0x6D, 0x77, 0x6C, 0x77, 0x78, 0x77, 0x45, 0x77, 0x6B, 0x42, 0x0A, 0x6A, 0x74, 0x6A, 0x71, 0x52, 0x2B, 0x71, 0x2B, 0x73, 0x6F, 0x41, 0x72, 0x7A, 0x66, 0x77, 0x6F, 0x44, + 0x64, 0x75, 0x73, 0x76, 0x4B, 0x53, 0x47, 0x4E, 0x2B, 0x31, 0x77, 0x43, 0x41, 0x42, 0x31, 0x36, 0x70, 0x4D, 0x4C, 0x65, 0x79, 0x35, 0x53, 0x6E, 0x43, 0x4E, 0x6F, 0x49, 0x77, 0x5A, 0x44, 0x37, 0x4A, 0x49, 0x76, 0x55, 0x34, 0x54, 0x62, 0x2B, + 0x30, 0x63, 0x55, 0x42, 0x2B, 0x68, 0x66, 0x6C, 0x47, 0x64, 0x64, 0x79, 0x58, 0x71, 0x42, 0x50, 0x43, 0x43, 0x6A, 0x0A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, + 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, + 0x42, 0x42, 0x51, 0x78, 0x43, 0x70, 0x43, 0x50, 0x74, 0x73, 0x61, 0x64, 0x30, 0x6B, 0x52, 0x4C, 0x0A, 0x67, 0x4C, 0x57, 0x69, 0x35, 0x68, 0x2B, 0x78, 0x45, 0x6B, 0x38, 0x62, 0x6C, 0x54, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, + 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x45, 0x41, 0x33, 0x31, 0x53, 0x51, 0x37, 0x5A, 0x76, 0x76, 0x69, 0x35, 0x51, 0x43, 0x6B, 0x78, 0x65, 0x43, 0x6D, 0x62, 0x36, 0x7A, 0x6E, 0x69, 0x7A, + 0x32, 0x43, 0x35, 0x47, 0x4D, 0x6E, 0x30, 0x6F, 0x55, 0x73, 0x66, 0x5A, 0x6B, 0x0A, 0x76, 0x4C, 0x74, 0x6F, 0x55, 0x52, 0x4D, 0x4D, 0x41, 0x2F, 0x63, 0x56, 0x69, 0x34, 0x52, 0x67, 0x75, 0x59, 0x76, 0x2F, 0x55, 0x6F, 0x37, 0x6E, 0x6A, 0x4C, + 0x77, 0x63, 0x41, 0x6A, 0x41, 0x38, 0x2B, 0x52, 0x48, 0x55, 0x6A, 0x45, 0x37, 0x41, 0x77, 0x57, 0x48, 0x43, 0x46, 0x55, 0x79, 0x71, 0x71, 0x78, 0x30, 0x4C, 0x4D, 0x56, 0x38, 0x37, 0x48, 0x4F, 0x49, 0x41, 0x6C, 0x30, 0x51, 0x78, 0x35, 0x76, + 0x35, 0x7A, 0x6C, 0x69, 0x2F, 0x61, 0x6C, 0x74, 0x50, 0x2B, 0x0A, 0x43, 0x41, 0x65, 0x7A, 0x4E, 0x49, 0x6D, 0x38, 0x42, 0x5A, 0x2F, 0x33, 0x48, 0x6F, 0x62, 0x75, 0x69, 0x33, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x4C, 0x4F, 0x42, 0x41, 0x4C, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x32, 0x30, 0x32, 0x30, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x67, 0x6A, 0x43, 0x43, 0x41, 0x32, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4C, 0x57, 0x6B, 0x75, 0x39, 0x57, 0x76, 0x74, 0x50, 0x69, 0x6C, 0x76, 0x36, 0x5A, 0x65, 0x55, 0x77, 0x44, 0x51, 0x59, + 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x54, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x56, 0x51, 0x78, 0x0A, 0x49, 0x7A, + 0x41, 0x68, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x6D, 0x55, 0x74, 0x59, 0x32, 0x39, 0x74, 0x62, 0x57, 0x56, 0x79, 0x59, 0x32, 0x55, 0x67, 0x62, 0x57, 0x39, 0x75, 0x61, 0x58, 0x52, 0x76, 0x63, 0x6D, 0x6C, 0x75, 0x5A, 0x79, + 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x52, 0x6B, 0x77, 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x48, 0x54, 0x45, 0x39, 0x43, 0x51, 0x55, 0x78, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x0A, 0x56, 0x43, 0x41, 0x79, 0x4D, + 0x44, 0x49, 0x77, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x77, 0x4D, 0x44, 0x59, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, + 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x54, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x56, 0x51, 0x78, 0x49, 0x7A, 0x41, 0x68, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, + 0x47, 0x6D, 0x55, 0x74, 0x59, 0x32, 0x39, 0x74, 0x62, 0x57, 0x56, 0x79, 0x59, 0x32, 0x55, 0x67, 0x62, 0x57, 0x39, 0x75, 0x61, 0x58, 0x52, 0x76, 0x63, 0x6D, 0x6C, 0x75, 0x5A, 0x79, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x52, 0x6B, 0x77, + 0x46, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x42, 0x48, 0x54, 0x45, 0x39, 0x43, 0x51, 0x55, 0x78, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x56, 0x43, 0x41, 0x79, 0x0A, 0x4D, 0x44, 0x49, 0x77, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, + 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x72, 0x69, 0x35, + 0x57, 0x72, 0x52, 0x73, 0x63, 0x37, 0x2F, 0x61, 0x56, 0x6A, 0x36, 0x42, 0x33, 0x47, 0x79, 0x76, 0x54, 0x59, 0x34, 0x2B, 0x45, 0x54, 0x55, 0x57, 0x69, 0x0A, 0x44, 0x35, 0x39, 0x62, 0x52, 0x61, 0x74, 0x5A, 0x65, 0x31, 0x45, 0x30, 0x2B, 0x65, + 0x79, 0x4C, 0x69, 0x6E, 0x6A, 0x46, 0x33, 0x57, 0x75, 0x76, 0x76, 0x63, 0x54, 0x66, 0x6B, 0x30, 0x55, 0x65, 0x76, 0x35, 0x45, 0x34, 0x43, 0x36, 0x34, 0x4F, 0x46, 0x75, 0x64, 0x42, 0x63, 0x2F, 0x6A, 0x62, 0x75, 0x39, 0x47, 0x34, 0x55, 0x65, + 0x44, 0x4C, 0x67, 0x7A, 0x74, 0x7A, 0x4F, 0x47, 0x35, 0x33, 0x69, 0x67, 0x39, 0x5A, 0x59, 0x79, 0x62, 0x4E, 0x70, 0x79, 0x72, 0x4F, 0x0A, 0x56, 0x50, 0x75, 0x34, 0x34, 0x73, 0x42, 0x38, 0x52, 0x38, 0x35, 0x67, 0x66, 0x44, 0x2B, 0x79, 0x63, + 0x2F, 0x4C, 0x41, 0x47, 0x62, 0x61, 0x4B, 0x6B, 0x6F, 0x63, 0x31, 0x44, 0x5A, 0x41, 0x6F, 0x6F, 0x75, 0x51, 0x56, 0x42, 0x47, 0x4D, 0x2B, 0x75, 0x71, 0x2F, 0x75, 0x66, 0x46, 0x37, 0x4D, 0x70, 0x6F, 0x74, 0x51, 0x73, 0x6A, 0x6A, 0x33, 0x51, + 0x57, 0x50, 0x4B, 0x7A, 0x76, 0x39, 0x70, 0x6A, 0x32, 0x67, 0x4F, 0x6C, 0x54, 0x62, 0x6C, 0x7A, 0x4C, 0x6D, 0x4D, 0x0A, 0x43, 0x63, 0x70, 0x4C, 0x33, 0x54, 0x47, 0x51, 0x6C, 0x73, 0x6A, 0x4D, 0x48, 0x2F, 0x31, 0x57, 0x6C, 0x6A, 0x54, 0x62, + 0x6A, 0x68, 0x7A, 0x71, 0x4C, 0x4C, 0x36, 0x46, 0x4C, 0x6D, 0x50, 0x64, 0x71, 0x71, 0x6D, 0x56, 0x30, 0x2F, 0x30, 0x70, 0x6C, 0x52, 0x50, 0x77, 0x79, 0x4A, 0x69, 0x54, 0x32, 0x53, 0x30, 0x57, 0x52, 0x35, 0x41, 0x52, 0x67, 0x36, 0x49, 0x36, + 0x49, 0x71, 0x49, 0x6F, 0x56, 0x36, 0x4C, 0x72, 0x2F, 0x73, 0x43, 0x4D, 0x4B, 0x4B, 0x43, 0x6D, 0x0A, 0x66, 0x65, 0x63, 0x71, 0x51, 0x6A, 0x75, 0x43, 0x67, 0x47, 0x4F, 0x6C, 0x59, 0x78, 0x38, 0x5A, 0x7A, 0x48, 0x79, 0x79, 0x5A, 0x71, 0x6A, + 0x43, 0x30, 0x32, 0x30, 0x33, 0x62, 0x2B, 0x4A, 0x2B, 0x42, 0x6C, 0x48, 0x5A, 0x52, 0x59, 0x51, 0x66, 0x45, 0x73, 0x34, 0x6B, 0x55, 0x6D, 0x53, 0x46, 0x43, 0x30, 0x69, 0x41, 0x54, 0x6F, 0x65, 0x78, 0x49, 0x69, 0x49, 0x77, 0x71, 0x75, 0x75, + 0x75, 0x76, 0x75, 0x41, 0x43, 0x34, 0x45, 0x44, 0x6F, 0x73, 0x45, 0x4B, 0x41, 0x0A, 0x41, 0x31, 0x47, 0x71, 0x74, 0x48, 0x36, 0x71, 0x52, 0x4E, 0x64, 0x44, 0x59, 0x66, 0x4F, 0x69, 0x61, 0x78, 0x61, 0x4A, 0x53, 0x61, 0x53, 0x6A, 0x70, 0x43, + 0x75, 0x4B, 0x41, 0x73, 0x52, 0x34, 0x39, 0x47, 0x69, 0x4B, 0x77, 0x65, 0x52, 0x36, 0x4E, 0x72, 0x46, 0x76, 0x47, 0x35, 0x59, 0x62, 0x64, 0x30, 0x6D, 0x4E, 0x31, 0x4D, 0x6B, 0x47, 0x63, 0x6F, 0x2F, 0x50, 0x55, 0x2B, 0x50, 0x63, 0x46, 0x34, + 0x55, 0x67, 0x53, 0x74, 0x79, 0x59, 0x4A, 0x39, 0x4F, 0x52, 0x0A, 0x4A, 0x69, 0x74, 0x48, 0x48, 0x6D, 0x6B, 0x48, 0x72, 0x39, 0x36, 0x69, 0x35, 0x4F, 0x54, 0x55, 0x61, 0x77, 0x75, 0x7A, 0x58, 0x6E, 0x7A, 0x55, 0x4A, 0x49, 0x42, 0x48, 0x4B, + 0x57, 0x6B, 0x37, 0x62, 0x75, 0x69, 0x73, 0x2F, 0x55, 0x44, 0x72, 0x32, 0x4F, 0x31, 0x78, 0x63, 0x53, 0x76, 0x79, 0x36, 0x46, 0x67, 0x64, 0x36, 0x30, 0x47, 0x58, 0x49, 0x73, 0x55, 0x66, 0x31, 0x44, 0x6E, 0x51, 0x4A, 0x34, 0x2B, 0x48, 0x34, + 0x78, 0x6A, 0x30, 0x34, 0x4B, 0x6C, 0x47, 0x0A, 0x44, 0x66, 0x56, 0x30, 0x4F, 0x6F, 0x49, 0x75, 0x30, 0x47, 0x34, 0x73, 0x6B, 0x61, 0x4D, 0x78, 0x58, 0x44, 0x74, 0x47, 0x36, 0x6E, 0x73, 0x45, 0x45, 0x46, 0x5A, 0x65, 0x67, 0x42, 0x33, 0x31, + 0x70, 0x57, 0x58, 0x6F, 0x67, 0x76, 0x7A, 0x69, 0x42, 0x34, 0x78, 0x69, 0x52, 0x66, 0x55, 0x67, 0x33, 0x6B, 0x5A, 0x77, 0x68, 0x71, 0x47, 0x38, 0x6B, 0x39, 0x4D, 0x65, 0x64, 0x4B, 0x5A, 0x73, 0x73, 0x43, 0x7A, 0x33, 0x41, 0x77, 0x79, 0x49, + 0x44, 0x4D, 0x76, 0x55, 0x0A, 0x63, 0x6C, 0x4F, 0x47, 0x76, 0x47, 0x42, 0x47, 0x38, 0x35, 0x68, 0x71, 0x77, 0x76, 0x47, 0x2F, 0x51, 0x2F, 0x6C, 0x77, 0x49, 0x48, 0x66, 0x4B, 0x4E, 0x30, 0x46, 0x35, 0x56, 0x56, 0x4A, 0x6A, 0x6A, 0x56, 0x73, + 0x53, 0x6E, 0x38, 0x56, 0x6F, 0x78, 0x49, 0x69, 0x64, 0x72, 0x50, 0x49, 0x77, 0x71, 0x37, 0x65, 0x6A, 0x4D, 0x5A, 0x64, 0x6E, 0x72, 0x59, 0x38, 0x58, 0x44, 0x32, 0x7A, 0x48, 0x63, 0x2B, 0x30, 0x6B, 0x6C, 0x47, 0x76, 0x49, 0x67, 0x35, 0x72, + 0x51, 0x0A, 0x6D, 0x6A, 0x64, 0x4A, 0x42, 0x4B, 0x75, 0x78, 0x46, 0x73, 0x68, 0x73, 0x53, 0x55, 0x6B, 0x74, 0x71, 0x36, 0x48, 0x51, 0x6A, 0x4A, 0x4C, 0x79, 0x51, 0x55, 0x70, 0x35, 0x49, 0x53, 0x58, 0x62, 0x59, 0x39, 0x65, 0x32, 0x6E, 0x4B, + 0x64, 0x2B, 0x51, 0x6D, 0x6E, 0x37, 0x4F, 0x6D, 0x4D, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x0A, 0x41, + 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, + 0x4E, 0x77, 0x75, 0x48, 0x39, 0x46, 0x68, 0x4E, 0x33, 0x6E, 0x6B, 0x71, 0x39, 0x58, 0x56, 0x73, 0x78, 0x4A, 0x78, 0x61, 0x44, 0x31, 0x71, 0x61, 0x4A, 0x77, 0x69, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x49, 0x77, 0x51, 0x59, + 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4E, 0x77, 0x75, 0x48, 0x39, 0x46, 0x68, 0x4E, 0x33, 0x6E, 0x6B, 0x71, 0x39, 0x58, 0x56, 0x73, 0x78, 0x4A, 0x78, 0x61, 0x44, 0x31, 0x71, 0x61, 0x4A, 0x77, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, + 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x43, 0x52, 0x38, 0x45, 0x49, 0x43, 0x61, 0x45, 0x44, 0x75, 0x77, 0x32, 0x6A, 0x41, 0x0A, 0x56, 0x43, 0x2F, 0x66, 0x37, 0x47, 0x4C, + 0x44, 0x77, 0x35, 0x36, 0x4B, 0x6F, 0x44, 0x45, 0x6F, 0x71, 0x6F, 0x4F, 0x4F, 0x70, 0x46, 0x61, 0x57, 0x45, 0x68, 0x43, 0x47, 0x56, 0x72, 0x71, 0x58, 0x63, 0x74, 0x4A, 0x55, 0x4D, 0x48, 0x79, 0x74, 0x47, 0x64, 0x55, 0x64, 0x61, 0x47, 0x2F, + 0x37, 0x46, 0x45, 0x4C, 0x59, 0x6A, 0x51, 0x37, 0x7A, 0x74, 0x64, 0x47, 0x6C, 0x34, 0x77, 0x4A, 0x43, 0x58, 0x74, 0x7A, 0x6F, 0x52, 0x6C, 0x67, 0x48, 0x4E, 0x51, 0x49, 0x77, 0x0A, 0x34, 0x4C, 0x78, 0x30, 0x53, 0x73, 0x46, 0x44, 0x4B, 0x76, + 0x2F, 0x62, 0x47, 0x74, 0x43, 0x77, 0x72, 0x32, 0x7A, 0x44, 0x2F, 0x63, 0x75, 0x7A, 0x39, 0x58, 0x39, 0x74, 0x41, 0x79, 0x35, 0x5A, 0x56, 0x70, 0x30, 0x74, 0x4C, 0x54, 0x57, 0x4D, 0x73, 0x74, 0x5A, 0x44, 0x46, 0x79, 0x79, 0x53, 0x43, 0x73, + 0x74, 0x64, 0x36, 0x49, 0x77, 0x50, 0x53, 0x33, 0x42, 0x44, 0x30, 0x49, 0x4C, 0x2F, 0x71, 0x4D, 0x79, 0x2F, 0x70, 0x4A, 0x54, 0x41, 0x76, 0x6F, 0x65, 0x39, 0x0A, 0x69, 0x75, 0x4F, 0x54, 0x65, 0x38, 0x61, 0x50, 0x6D, 0x78, 0x61, 0x64, 0x4A, + 0x32, 0x57, 0x38, 0x65, 0x73, 0x56, 0x43, 0x67, 0x6D, 0x78, 0x63, 0x42, 0x39, 0x43, 0x70, 0x77, 0x59, 0x68, 0x67, 0x52, 0x4F, 0x6D, 0x59, 0x68, 0x52, 0x5A, 0x66, 0x2B, 0x49, 0x2F, 0x4B, 0x41, 0x52, 0x44, 0x4F, 0x4A, 0x63, 0x50, 0x35, 0x59, + 0x42, 0x75, 0x67, 0x78, 0x5A, 0x66, 0x44, 0x30, 0x79, 0x79, 0x49, 0x4D, 0x61, 0x4B, 0x39, 0x4D, 0x4F, 0x7A, 0x51, 0x30, 0x4D, 0x41, 0x53, 0x0A, 0x38, 0x63, 0x45, 0x35, 0x34, 0x2B, 0x58, 0x31, 0x2B, 0x4E, 0x5A, 0x4B, 0x33, 0x54, 0x54, 0x4E, + 0x2B, 0x32, 0x2F, 0x42, 0x54, 0x2B, 0x4D, 0x41, 0x69, 0x31, 0x62, 0x69, 0x6B, 0x76, 0x63, 0x6F, 0x73, 0x6B, 0x4A, 0x33, 0x63, 0x69, 0x4E, 0x6E, 0x78, 0x7A, 0x38, 0x52, 0x46, 0x62, 0x4C, 0x45, 0x41, 0x77, 0x57, 0x2B, 0x75, 0x78, 0x46, 0x37, + 0x43, 0x72, 0x2B, 0x6F, 0x62, 0x75, 0x66, 0x2F, 0x57, 0x45, 0x50, 0x50, 0x6D, 0x32, 0x65, 0x67, 0x67, 0x41, 0x65, 0x32, 0x0A, 0x48, 0x63, 0x71, 0x74, 0x62, 0x65, 0x70, 0x42, 0x45, 0x58, 0x34, 0x74, 0x64, 0x4A, 0x50, 0x37, 0x77, 0x72, 0x79, + 0x2B, 0x55, 0x55, 0x54, 0x46, 0x37, 0x32, 0x67, 0x6C, 0x4A, 0x34, 0x44, 0x6A, 0x79, 0x4B, 0x44, 0x55, 0x45, 0x75, 0x7A, 0x5A, 0x70, 0x54, 0x63, 0x64, 0x4E, 0x33, 0x79, 0x30, 0x6B, 0x63, 0x72, 0x61, 0x31, 0x4C, 0x47, 0x57, 0x67, 0x65, 0x39, + 0x6F, 0x58, 0x48, 0x59, 0x51, 0x53, 0x61, 0x39, 0x2B, 0x70, 0x54, 0x65, 0x41, 0x73, 0x52, 0x78, 0x53, 0x0A, 0x76, 0x54, 0x4F, 0x42, 0x54, 0x49, 0x2F, 0x35, 0x33, 0x57, 0x58, 0x5A, 0x46, 0x4D, 0x32, 0x4B, 0x4A, 0x56, 0x6A, 0x30, 0x34, 0x73, + 0x57, 0x44, 0x70, 0x51, 0x6D, 0x51, 0x31, 0x47, 0x77, 0x55, 0x59, 0x37, 0x56, 0x41, 0x33, 0x2B, 0x76, 0x41, 0x2F, 0x4D, 0x52, 0x59, 0x66, 0x67, 0x30, 0x55, 0x46, 0x6F, 0x64, 0x55, 0x4A, 0x32, 0x35, 0x57, 0x35, 0x48, 0x43, 0x45, 0x75, 0x47, + 0x77, 0x79, 0x45, 0x6E, 0x36, 0x43, 0x4D, 0x55, 0x4F, 0x2B, 0x31, 0x39, 0x31, 0x38, 0x0A, 0x6F, 0x61, 0x32, 0x75, 0x31, 0x71, 0x73, 0x67, 0x45, 0x75, 0x38, 0x4B, 0x77, 0x78, 0x43, 0x4D, 0x53, 0x5A, 0x59, 0x31, 0x33, 0x41, 0x74, 0x31, 0x58, + 0x72, 0x46, 0x50, 0x31, 0x55, 0x38, 0x30, 0x44, 0x68, 0x45, 0x67, 0x42, 0x33, 0x56, 0x44, 0x52, 0x65, 0x6D, 0x6A, 0x45, 0x64, 0x71, 0x73, 0x6F, 0x35, 0x6E, 0x43, 0x74, 0x6E, 0x6B, 0x6E, 0x34, 0x72, 0x6E, 0x76, 0x79, 0x4F, 0x4C, 0x32, 0x4E, + 0x53, 0x6C, 0x36, 0x64, 0x50, 0x72, 0x46, 0x66, 0x34, 0x49, 0x46, 0x0A, 0x59, 0x71, 0x59, 0x4B, 0x36, 0x6D, 0x69, 0x79, 0x65, 0x55, 0x63, 0x47, 0x62, 0x76, 0x4A, 0x58, 0x71, 0x42, 0x55, 0x7A, 0x78, 0x76, 0x64, 0x34, 0x53, 0x6A, 0x31, 0x43, + 0x65, 0x32, 0x74, 0x2B, 0x2F, 0x76, 0x64, 0x47, 0x36, 0x74, 0x48, 0x72, 0x6A, 0x75, 0x2B, 0x49, 0x61, 0x46, 0x76, 0x6F, 0x77, 0x64, 0x6C, 0x78, 0x66, 0x76, 0x31, 0x6B, 0x37, 0x2F, 0x39, 0x6E, 0x52, 0x34, 0x68, 0x59, 0x4A, 0x53, 0x38, 0x2B, + 0x68, 0x67, 0x65, 0x39, 0x2B, 0x36, 0x6A, 0x6C, 0x0A, 0x67, 0x71, 0x69, 0x73, 0x70, 0x64, 0x4E, 0x70, 0x51, 0x38, 0x30, 0x78, 0x69, 0x45, 0x6D, 0x45, 0x55, 0x35, 0x4C, 0x41, 0x73, 0x54, 0x6B, 0x62, 0x4F, 0x59, 0x4D, 0x42, 0x4D, 0x4D, 0x54, + 0x79, 0x71, 0x66, 0x72, 0x51, 0x41, 0x37, 0x31, 0x79, 0x4E, 0x32, 0x42, 0x57, 0x48, 0x7A, 0x5A, 0x38, 0x76, 0x54, 0x6D, 0x52, 0x39, 0x57, 0x30, 0x4E, 0x76, 0x33, 0x76, 0x58, 0x6B, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x4E, 0x46, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x52, + 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x37, 0x7A, 0x43, 0x43, 0x41, 0x39, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x49, 0x44, 0x64, 0x50, 0x6A, 0x76, 0x47, 0x7A, 0x35, 0x61, 0x37, 0x45, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x67, 0x59, 0x51, 0x78, 0x45, 0x6A, 0x41, + 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x55, 0x54, 0x43, 0x55, 0x63, 0x32, 0x4D, 0x7A, 0x49, 0x34, 0x0A, 0x4E, 0x7A, 0x55, 0x78, 0x4D, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x56, + 0x4D, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x6B, 0x46, 0x4F, 0x52, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x76, 0x63, 0x6D, 0x6C, 0x6B, 0x59, 0x57, 0x51, 0x67, 0x5A, 0x47, 0x55, 0x67, 0x51, 0x32, + 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x59, 0x32, 0x6C, 0x76, 0x0A, 0x62, 0x6A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x78, 0x4D, 0x4C, 0x51, 0x55, 0x35, 0x47, 0x49, 0x45, 0x4E, 0x42, 0x49, + 0x46, 0x4A, 0x68, 0x61, 0x58, 0x6F, 0x78, 0x49, 0x6A, 0x41, 0x67, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x47, 0x55, 0x46, 0x4F, 0x52, 0x69, 0x42, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x55, 0x67, 0x55, 0x32, 0x56, 0x79, 0x64, + 0x6D, 0x56, 0x79, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x0A, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x6B, 0x77, 0x4F, 0x54, 0x41, 0x30, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x4D, 0x34, 0x57, 0x68, 0x63, 0x4E, + 0x4D, 0x7A, 0x6B, 0x77, 0x4F, 0x44, 0x4D, 0x77, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x4D, 0x34, 0x57, 0x6A, 0x43, 0x42, 0x68, 0x44, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x52, 0x4D, 0x4A, 0x52, 0x7A, 0x59, 0x7A, + 0x4D, 0x6A, 0x67, 0x33, 0x4E, 0x54, 0x45, 0x77, 0x0A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x46, 0x55, 0x7A, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, + 0x65, 0x51, 0x55, 0x35, 0x47, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x39, 0x79, 0x61, 0x57, 0x52, 0x68, 0x5A, 0x43, 0x42, 0x6B, 0x5A, 0x53, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x6A, 0x61, 0x57, 0x39, + 0x75, 0x4D, 0x52, 0x51, 0x77, 0x0A, 0x45, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x77, 0x74, 0x42, 0x54, 0x6B, 0x59, 0x67, 0x51, 0x30, 0x45, 0x67, 0x55, 0x6D, 0x46, 0x70, 0x65, 0x6A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, + 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x51, 0x55, 0x35, 0x47, 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x5A, 0x53, 0x42, 0x54, 0x5A, 0x58, 0x4A, 0x32, 0x5A, 0x58, 0x49, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, + 0x43, 0x43, 0x0A, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, + 0x67, 0x49, 0x42, 0x41, 0x4E, 0x76, 0x72, 0x61, 0x79, 0x76, 0x6D, 0x5A, 0x46, 0x53, 0x56, 0x67, 0x70, 0x43, 0x6A, 0x63, 0x71, 0x51, 0x5A, 0x41, 0x5A, 0x32, 0x63, 0x43, 0x34, 0x46, 0x66, 0x63, 0x30, 0x6D, 0x36, 0x70, 0x36, 0x7A, 0x7A, 0x0A, + 0x42, 0x45, 0x35, 0x37, 0x6C, 0x67, 0x76, 0x73, 0x45, 0x65, 0x42, 0x62, 0x70, 0x68, 0x7A, 0x4F, 0x47, 0x39, 0x49, 0x4E, 0x67, 0x78, 0x77, 0x72, 0x75, 0x4A, 0x34, 0x64, 0x66, 0x6B, 0x55, 0x79, 0x59, 0x41, 0x38, 0x48, 0x36, 0x58, 0x64, 0x59, + 0x66, 0x70, 0x39, 0x71, 0x79, 0x47, 0x46, 0x4F, 0x74, 0x69, 0x62, 0x42, 0x54, 0x49, 0x33, 0x2F, 0x54, 0x4F, 0x38, 0x30, 0x73, 0x68, 0x39, 0x6C, 0x32, 0x4C, 0x6C, 0x34, 0x39, 0x61, 0x32, 0x70, 0x63, 0x62, 0x6E, 0x76, 0x0A, 0x54, 0x31, 0x67, + 0x64, 0x70, 0x64, 0x35, 0x30, 0x49, 0x4A, 0x65, 0x68, 0x37, 0x57, 0x68, 0x4D, 0x33, 0x70, 0x49, 0x58, 0x53, 0x37, 0x79, 0x72, 0x2F, 0x32, 0x57, 0x61, 0x6E, 0x76, 0x74, 0x48, 0x32, 0x56, 0x64, 0x79, 0x38, 0x77, 0x6D, 0x68, 0x72, 0x6E, 0x5A, + 0x45, 0x45, 0x32, 0x36, 0x63, 0x4C, 0x55, 0x51, 0x35, 0x76, 0x50, 0x6E, 0x48, 0x4F, 0x36, 0x52, 0x59, 0x50, 0x55, 0x47, 0x39, 0x74, 0x4D, 0x4A, 0x4A, 0x6F, 0x38, 0x67, 0x4E, 0x30, 0x70, 0x63, 0x76, 0x0A, 0x42, 0x32, 0x56, 0x53, 0x41, 0x4B, + 0x64, 0x75, 0x79, 0x4B, 0x39, 0x6F, 0x37, 0x50, 0x51, 0x55, 0x6C, 0x72, 0x5A, 0x58, 0x48, 0x31, 0x62, 0x44, 0x4F, 0x5A, 0x38, 0x72, 0x62, 0x65, 0x54, 0x7A, 0x50, 0x76, 0x59, 0x31, 0x5A, 0x4E, 0x6F, 0x4D, 0x48, 0x4B, 0x47, 0x45, 0x53, 0x79, + 0x39, 0x4C, 0x53, 0x2B, 0x49, 0x73, 0x4A, 0x4A, 0x31, 0x74, 0x6B, 0x30, 0x44, 0x72, 0x74, 0x53, 0x4F, 0x4F, 0x4D, 0x73, 0x70, 0x76, 0x52, 0x64, 0x4F, 0x6F, 0x69, 0x58, 0x73, 0x65, 0x0A, 0x7A, 0x78, 0x37, 0x36, 0x57, 0x30, 0x4F, 0x4C, 0x7A, + 0x63, 0x32, 0x6F, 0x44, 0x32, 0x72, 0x4B, 0x44, 0x46, 0x36, 0x35, 0x6E, 0x6B, 0x65, 0x50, 0x38, 0x4E, 0x6D, 0x32, 0x43, 0x67, 0x74, 0x59, 0x5A, 0x52, 0x63, 0x7A, 0x75, 0x53, 0x50, 0x6B, 0x64, 0x78, 0x6C, 0x39, 0x79, 0x30, 0x6F, 0x75, 0x6B, + 0x6E, 0x74, 0x50, 0x4C, 0x78, 0x42, 0x33, 0x73, 0x59, 0x30, 0x76, 0x61, 0x4A, 0x78, 0x69, 0x7A, 0x4F, 0x42, 0x51, 0x2B, 0x4F, 0x79, 0x52, 0x70, 0x31, 0x52, 0x4D, 0x0A, 0x56, 0x77, 0x6E, 0x56, 0x64, 0x6D, 0x50, 0x46, 0x36, 0x47, 0x55, 0x65, + 0x37, 0x6D, 0x31, 0x71, 0x7A, 0x77, 0x6D, 0x64, 0x2B, 0x6E, 0x78, 0x50, 0x72, 0x57, 0x41, 0x49, 0x2F, 0x56, 0x61, 0x5A, 0x44, 0x78, 0x55, 0x73, 0x65, 0x36, 0x6D, 0x41, 0x71, 0x34, 0x78, 0x68, 0x6A, 0x30, 0x6F, 0x48, 0x64, 0x6B, 0x4C, 0x65, + 0x50, 0x66, 0x54, 0x64, 0x73, 0x69, 0x51, 0x7A, 0x57, 0x37, 0x69, 0x31, 0x6F, 0x30, 0x54, 0x4A, 0x72, 0x48, 0x39, 0x33, 0x50, 0x42, 0x30, 0x6A, 0x0A, 0x37, 0x49, 0x4B, 0x70, 0x70, 0x75, 0x4C, 0x49, 0x42, 0x6B, 0x77, 0x43, 0x2F, 0x71, 0x78, + 0x63, 0x6D, 0x5A, 0x6B, 0x4C, 0x4C, 0x78, 0x43, 0x4B, 0x70, 0x76, 0x52, 0x2F, 0x31, 0x59, 0x64, 0x30, 0x44, 0x56, 0x6C, 0x4A, 0x52, 0x66, 0x62, 0x77, 0x63, 0x56, 0x77, 0x35, 0x4B, 0x64, 0x61, 0x2F, 0x53, 0x69, 0x4F, 0x4C, 0x39, 0x56, 0x38, + 0x42, 0x59, 0x39, 0x4B, 0x48, 0x63, 0x79, 0x69, 0x31, 0x53, 0x77, 0x72, 0x31, 0x2B, 0x4B, 0x75, 0x43, 0x4C, 0x48, 0x35, 0x7A, 0x0A, 0x4A, 0x54, 0x49, 0x64, 0x43, 0x32, 0x4D, 0x4B, 0x46, 0x34, 0x45, 0x41, 0x2F, 0x37, 0x5A, 0x32, 0x58, 0x75, + 0x65, 0x30, 0x73, 0x55, 0x44, 0x4B, 0x49, 0x62, 0x76, 0x56, 0x67, 0x46, 0x48, 0x6C, 0x53, 0x46, 0x4A, 0x6E, 0x4C, 0x4E, 0x4A, 0x68, 0x69, 0x51, 0x63, 0x4E, 0x44, 0x38, 0x35, 0x43, 0x64, 0x38, 0x42, 0x45, 0x63, 0x35, 0x78, 0x45, 0x55, 0x4B, + 0x44, 0x62, 0x45, 0x41, 0x6F, 0x74, 0x6C, 0x52, 0x79, 0x42, 0x72, 0x2B, 0x51, 0x63, 0x35, 0x52, 0x51, 0x65, 0x0A, 0x38, 0x54, 0x5A, 0x42, 0x41, 0x51, 0x49, 0x76, 0x66, 0x58, 0x4F, 0x6E, 0x33, 0x6B, 0x4C, 0x4D, 0x54, 0x4F, 0x6D, 0x4A, 0x44, + 0x56, 0x62, 0x33, 0x6E, 0x35, 0x48, 0x55, 0x41, 0x38, 0x5A, 0x73, 0x79, 0x59, 0x2F, 0x62, 0x32, 0x42, 0x7A, 0x67, 0x51, 0x4A, 0x68, 0x64, 0x5A, 0x70, 0x6D, 0x59, 0x67, 0x47, 0x34, 0x74, 0x2F, 0x77, 0x48, 0x46, 0x7A, 0x73, 0x74, 0x47, 0x48, + 0x36, 0x77, 0x43, 0x78, 0x6B, 0x50, 0x6D, 0x72, 0x71, 0x4B, 0x45, 0x50, 0x4D, 0x56, 0x4F, 0x0A, 0x48, 0x6A, 0x31, 0x74, 0x79, 0x52, 0x52, 0x4D, 0x34, 0x79, 0x35, 0x42, 0x75, 0x38, 0x6F, 0x35, 0x76, 0x7A, 0x59, 0x38, 0x4B, 0x68, 0x6D, 0x71, + 0x51, 0x59, 0x64, 0x4F, 0x70, 0x63, 0x35, 0x4C, 0x4D, 0x6E, 0x6E, 0x64, 0x6B, 0x45, 0x6C, 0x2F, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, + 0x4D, 0x42, 0x61, 0x41, 0x46, 0x4A, 0x78, 0x66, 0x30, 0x47, 0x78, 0x6A, 0x0A, 0x6F, 0x31, 0x2B, 0x54, 0x79, 0x70, 0x4F, 0x59, 0x43, 0x4B, 0x32, 0x4D, 0x68, 0x36, 0x55, 0x73, 0x58, 0x4D, 0x45, 0x33, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, + 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x63, 0x58, 0x39, 0x42, 0x73, 0x59, 0x36, 0x4E, 0x66, 0x6B, 0x38, 0x71, 0x54, 0x6D, 0x41, 0x69, 0x74, 0x6A, 0x49, 0x65, 0x6C, 0x4C, 0x46, 0x7A, 0x42, 0x4E, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, + 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x0A, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, + 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x54, 0x68, 0x36, 0x35, 0x69, 0x73, 0x61, 0x67, 0x6D, 0x44, 0x39, 0x75, 0x77, 0x32, + 0x6E, 0x41, 0x61, 0x6C, 0x78, 0x4A, 0x0A, 0x55, 0x71, 0x7A, 0x4C, 0x4B, 0x31, 0x31, 0x34, 0x4F, 0x4D, 0x48, 0x56, 0x56, 0x49, 0x53, 0x66, 0x6B, 0x2F, 0x43, 0x48, 0x47, 0x54, 0x30, 0x73, 0x5A, 0x6F, 0x6E, 0x72, 0x44, 0x55, 0x4C, 0x38, 0x7A, + 0x50, 0x42, 0x31, 0x68, 0x54, 0x2B, 0x4C, 0x39, 0x49, 0x42, 0x64, 0x65, 0x65, 0x55, 0x58, 0x5A, 0x37, 0x30, 0x31, 0x67, 0x75, 0x4C, 0x79, 0x50, 0x49, 0x35, 0x39, 0x57, 0x7A, 0x62, 0x4C, 0x57, 0x6F, 0x41, 0x41, 0x4B, 0x66, 0x4C, 0x4F, 0x4B, + 0x79, 0x7A, 0x78, 0x0A, 0x6A, 0x36, 0x70, 0x74, 0x42, 0x5A, 0x4E, 0x73, 0x63, 0x73, 0x64, 0x57, 0x36, 0x39, 0x39, 0x51, 0x49, 0x79, 0x6A, 0x6C, 0x52, 0x52, 0x41, 0x39, 0x36, 0x47, 0x65, 0x6A, 0x72, 0x77, 0x35, 0x56, 0x44, 0x35, 0x41, 0x4A, + 0x59, 0x75, 0x39, 0x4C, 0x57, 0x61, 0x4C, 0x32, 0x55, 0x2F, 0x48, 0x41, 0x4E, 0x65, 0x51, 0x76, 0x77, 0x53, 0x53, 0x39, 0x65, 0x53, 0x39, 0x4F, 0x49, 0x43, 0x49, 0x37, 0x2F, 0x52, 0x6F, 0x67, 0x73, 0x4B, 0x51, 0x4F, 0x4C, 0x48, 0x44, 0x74, + 0x0A, 0x64, 0x44, 0x2B, 0x34, 0x45, 0x35, 0x55, 0x47, 0x55, 0x63, 0x6A, 0x6F, 0x68, 0x79, 0x62, 0x4B, 0x70, 0x46, 0x74, 0x71, 0x46, 0x69, 0x47, 0x53, 0x33, 0x58, 0x4E, 0x67, 0x6E, 0x68, 0x41, 0x59, 0x33, 0x6A, 0x79, 0x42, 0x36, 0x75, 0x67, + 0x59, 0x77, 0x33, 0x79, 0x4A, 0x38, 0x6F, 0x74, 0x51, 0x50, 0x72, 0x30, 0x52, 0x34, 0x68, 0x55, 0x44, 0x71, 0x44, 0x5A, 0x39, 0x4D, 0x77, 0x46, 0x73, 0x53, 0x42, 0x58, 0x58, 0x69, 0x4A, 0x43, 0x5A, 0x42, 0x4D, 0x58, 0x4D, 0x0A, 0x35, 0x67, + 0x66, 0x30, 0x76, 0x50, 0x53, 0x51, 0x37, 0x52, 0x50, 0x69, 0x36, 0x6F, 0x76, 0x44, 0x6A, 0x36, 0x4D, 0x7A, 0x44, 0x38, 0x45, 0x70, 0x54, 0x42, 0x4E, 0x4F, 0x32, 0x68, 0x56, 0x57, 0x63, 0x58, 0x4E, 0x79, 0x67, 0x6C, 0x44, 0x32, 0x6D, 0x6A, + 0x4E, 0x38, 0x6F, 0x72, 0x47, 0x6F, 0x47, 0x6A, 0x52, 0x30, 0x5A, 0x56, 0x7A, 0x4F, 0x30, 0x65, 0x75, 0x72, 0x55, 0x2B, 0x41, 0x61, 0x67, 0x4E, 0x6A, 0x71, 0x4F, 0x6B, 0x6E, 0x6B, 0x4A, 0x6A, 0x43, 0x62, 0x0A, 0x35, 0x52, 0x79, 0x4B, 0x71, + 0x4B, 0x6B, 0x56, 0x4D, 0x6F, 0x61, 0x5A, 0x6B, 0x67, 0x6F, 0x51, 0x49, 0x31, 0x59, 0x53, 0x34, 0x50, 0x62, 0x4F, 0x54, 0x4F, 0x4B, 0x37, 0x76, 0x74, 0x75, 0x4E, 0x6B, 0x6E, 0x4D, 0x42, 0x5A, 0x69, 0x39, 0x69, 0x50, 0x72, 0x4A, 0x79, 0x4A, + 0x30, 0x55, 0x32, 0x37, 0x55, 0x31, 0x57, 0x34, 0x35, 0x65, 0x5A, 0x2F, 0x7A, 0x6F, 0x31, 0x50, 0x71, 0x56, 0x55, 0x53, 0x6C, 0x4A, 0x5A, 0x53, 0x32, 0x44, 0x62, 0x37, 0x76, 0x35, 0x34, 0x0A, 0x45, 0x58, 0x39, 0x4B, 0x33, 0x42, 0x52, 0x35, + 0x59, 0x4C, 0x5A, 0x72, 0x5A, 0x41, 0x50, 0x62, 0x46, 0x59, 0x50, 0x68, 0x6F, 0x72, 0x37, 0x32, 0x49, 0x35, 0x64, 0x51, 0x38, 0x41, 0x6B, 0x7A, 0x4E, 0x71, 0x64, 0x78, 0x6C, 0x69, 0x58, 0x7A, 0x75, 0x55, 0x4A, 0x39, 0x32, 0x7A, 0x67, 0x2F, + 0x4C, 0x46, 0x69, 0x73, 0x36, 0x45, 0x4C, 0x68, 0x44, 0x74, 0x6A, 0x54, 0x4F, 0x30, 0x77, 0x75, 0x67, 0x75, 0x6D, 0x44, 0x4C, 0x6D, 0x73, 0x78, 0x32, 0x64, 0x31, 0x48, 0x0A, 0x68, 0x6B, 0x39, 0x74, 0x6C, 0x35, 0x45, 0x75, 0x54, 0x2B, 0x49, + 0x6F, 0x63, 0x54, 0x55, 0x57, 0x30, 0x66, 0x4A, 0x7A, 0x2F, 0x69, 0x55, 0x72, 0x42, 0x30, 0x63, 0x6B, 0x59, 0x79, 0x66, 0x49, 0x2B, 0x50, 0x62, 0x5A, 0x61, 0x2F, 0x77, 0x53, 0x4D, 0x56, 0x59, 0x49, 0x77, 0x46, 0x4E, 0x43, 0x72, 0x35, 0x7A, + 0x51, 0x4D, 0x33, 0x37, 0x38, 0x42, 0x76, 0x41, 0x78, 0x52, 0x41, 0x4D, 0x55, 0x38, 0x56, 0x6A, 0x71, 0x38, 0x6D, 0x6F, 0x4E, 0x71, 0x52, 0x47, 0x79, 0x0A, 0x67, 0x37, 0x37, 0x46, 0x47, 0x72, 0x38, 0x48, 0x36, 0x6C, 0x6E, 0x63, 0x6F, 0x34, + 0x67, 0x31, 0x37, 0x35, 0x78, 0x32, 0x4D, 0x6A, 0x78, 0x4E, 0x42, 0x69, 0x4C, 0x4F, 0x46, 0x65, 0x58, 0x64, 0x6E, 0x74, 0x69, 0x50, 0x32, 0x74, 0x37, 0x53, 0x78, 0x44, 0x6E, 0x6C, 0x46, 0x34, 0x48, 0x50, 0x4F, 0x45, 0x66, 0x72, 0x66, 0x34, + 0x68, 0x74, 0x57, 0x52, 0x76, 0x66, 0x6E, 0x30, 0x49, 0x55, 0x72, 0x6E, 0x37, 0x50, 0x71, 0x4C, 0x42, 0x6D, 0x5A, 0x64, 0x6F, 0x33, 0x0A, 0x72, 0x35, 0x2B, 0x71, 0x50, 0x65, 0x6F, 0x6F, 0x74, 0x74, 0x37, 0x56, 0x4D, 0x56, 0x67, 0x57, 0x67, + 0x6C, 0x76, 0x71, 0x75, 0x78, 0x6C, 0x31, 0x41, 0x6E, 0x4D, 0x61, 0x79, 0x6B, 0x67, 0x61, 0x49, 0x5A, 0x4F, 0x51, 0x43, 0x6F, 0x36, 0x54, 0x68, 0x4B, 0x64, 0x39, 0x4F, 0x79, 0x4D, 0x59, 0x6B, 0x6F, 0x6D, 0x67, 0x6A, 0x61, 0x77, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6D, 0x20, 0x45, 0x43, 0x2D, 0x33, 0x38, 0x34, + 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x5A, 0x54, 0x43, 0x43, 0x41, 0x65, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x65, 0x49, 0x38, 0x6E, 0x58, 0x49, 0x45, 0x53, 0x55, 0x69, 0x43, + 0x6C, 0x42, 0x4E, 0x41, 0x74, 0x33, 0x62, 0x70, 0x7A, 0x39, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x30, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x45, 0x77, 0x4A, 0x51, 0x0A, 0x54, 0x44, 0x45, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x59, 0x51, 0x58, 0x4E, 0x7A, 0x5A, 0x57, 0x4E, 0x76, 0x49, 0x45, 0x52, 0x68, 0x64, 0x47, 0x45, 0x67, 0x55, 0x33, + 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x35, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, 0x67, 0x51, 0x32, + 0x56, 0x79, 0x0A, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x4D, 0x54, 0x45, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x31, 0x62, 0x53, 0x42, 0x46, 0x51, 0x79, 0x30, 0x7A, 0x4F, 0x44, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x67, 0x77, 0x4D, 0x7A, 0x49, 0x32, 0x0A, + 0x4D, 0x44, 0x63, 0x79, 0x4E, 0x44, 0x55, 0x30, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x4D, 0x77, 0x4D, 0x7A, 0x49, 0x32, 0x4D, 0x44, 0x63, 0x79, 0x4E, 0x44, 0x55, 0x30, 0x57, 0x6A, 0x42, 0x30, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x51, 0x54, 0x44, 0x45, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x59, 0x51, 0x58, 0x4E, 0x7A, 0x5A, 0x57, 0x4E, 0x76, 0x49, 0x45, 0x52, 0x68, 0x0A, 0x64, 0x47, 0x45, + 0x67, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x35, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, + 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x0A, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x45, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x31, 0x62, 0x53, 0x42, 0x46, 0x51, 0x79, 0x30, 0x7A, 0x4F, 0x44, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, + 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x54, 0x45, 0x4B, 0x49, 0x36, 0x72, 0x47, 0x46, 0x74, 0x71, 0x0A, 0x76, 0x6D, 0x35, 0x6B, 0x4E, 0x32, 0x50, 0x6B, 0x7A, + 0x65, 0x79, 0x72, 0x4F, 0x76, 0x66, 0x4D, 0x6F, 0x62, 0x67, 0x4F, 0x67, 0x6B, 0x6E, 0x58, 0x68, 0x69, 0x6D, 0x66, 0x6F, 0x5A, 0x54, 0x79, 0x34, 0x32, 0x42, 0x34, 0x6D, 0x49, 0x46, 0x34, 0x42, 0x6B, 0x33, 0x79, 0x37, 0x4A, 0x6F, 0x4F, 0x56, + 0x32, 0x43, 0x44, 0x6E, 0x37, 0x54, 0x6D, 0x46, 0x79, 0x38, 0x61, 0x73, 0x31, 0x30, 0x43, 0x57, 0x34, 0x6B, 0x6A, 0x50, 0x4D, 0x49, 0x52, 0x42, 0x53, 0x71, 0x6E, 0x0A, 0x69, 0x42, 0x4D, 0x59, 0x38, 0x31, 0x43, 0x45, 0x31, 0x37, 0x30, 0x30, + 0x4C, 0x43, 0x65, 0x4A, 0x56, 0x66, 0x2F, 0x4F, 0x54, 0x4F, 0x66, 0x66, 0x70, 0x68, 0x38, 0x6F, 0x78, 0x50, 0x42, 0x55, 0x77, 0x37, 0x6C, 0x38, 0x74, 0x31, 0x4F, 0x74, 0x36, 0x38, 0x4B, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, + 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x49, 0x30, 0x47, 0x5A, 0x6E, 0x51, + 0x6B, 0x64, 0x6A, 0x72, 0x7A, 0x69, 0x66, 0x65, 0x38, 0x31, 0x72, 0x31, 0x48, 0x66, 0x53, 0x2B, 0x38, 0x45, 0x46, 0x39, 0x4C, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, + 0x42, 0x42, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x0A, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x41, 0x44, 0x56, 0x53, 0x32, 0x6D, 0x35, 0x68, 0x6A, 0x45, 0x66, 0x4F, + 0x2F, 0x4A, 0x55, 0x47, 0x37, 0x42, 0x4A, 0x77, 0x2B, 0x63, 0x68, 0x36, 0x39, 0x75, 0x31, 0x52, 0x73, 0x49, 0x47, 0x4C, 0x32, 0x53, 0x4B, 0x63, 0x48, 0x76, 0x6C, 0x4A, 0x46, 0x34, 0x30, 0x6A, 0x6F, 0x63, 0x56, 0x59, 0x6C, 0x69, 0x35, 0x52, + 0x73, 0x4A, 0x48, 0x72, 0x70, 0x6B, 0x61, 0x2F, 0x46, 0x32, 0x74, 0x4E, 0x51, 0x43, 0x4D, 0x51, 0x43, 0x30, 0x0A, 0x51, 0x6F, 0x53, 0x5A, 0x2F, 0x36, 0x76, 0x6E, 0x6E, 0x76, 0x75, 0x52, 0x6C, 0x79, 0x64, 0x64, 0x33, 0x4C, 0x42, 0x62, 0x4D, + 0x48, 0x48, 0x4F, 0x58, 0x6A, 0x67, 0x61, 0x61, 0x74, 0x6B, 0x6C, 0x35, 0x2B, 0x72, 0x33, 0x59, 0x5A, 0x4A, 0x57, 0x2B, 0x4F, 0x72, 0x61, 0x4E, 0x73, 0x4B, 0x48, 0x5A, 0x5A, 0x59, 0x75, 0x63, 0x69, 0x55, 0x76, 0x66, 0x39, 0x2F, 0x44, 0x45, + 0x38, 0x6B, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x75, 0x6D, 0x20, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x77, 0x44, 0x43, 0x43, 0x41, 0x36, 0x69, 0x67, 0x41, 0x77, 0x49, + 0x42, 0x41, 0x67, 0x49, 0x51, 0x48, 0x72, 0x39, 0x5A, 0x55, 0x4C, 0x6A, 0x4A, 0x67, 0x44, 0x64, 0x4D, 0x42, 0x76, 0x66, 0x72, 0x56, 0x55, 0x2B, 0x31, 0x37, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, + 0x42, 0x41, 0x51, 0x30, 0x46, 0x41, 0x44, 0x42, 0x36, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x51, 0x54, 0x44, 0x45, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, + 0x4D, 0x59, 0x51, 0x58, 0x4E, 0x7A, 0x5A, 0x57, 0x4E, 0x76, 0x49, 0x45, 0x52, 0x68, 0x64, 0x47, 0x45, 0x67, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x35, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, 0x67, 0x0A, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x64, + 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x6B, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x31, 0x62, 0x53, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, + 0x47, 0x56, 0x6B, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x0A, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x67, 0x77, 0x4D, 0x7A, 0x45, 0x32, 0x4D, 0x54, 0x49, 0x78, 0x4D, 0x44, 0x45, 0x7A, 0x57, 0x68, 0x63, 0x4E, + 0x4E, 0x44, 0x4D, 0x77, 0x4D, 0x7A, 0x45, 0x32, 0x4D, 0x54, 0x49, 0x78, 0x4D, 0x44, 0x45, 0x7A, 0x57, 0x6A, 0x42, 0x36, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x51, 0x54, 0x44, 0x45, 0x68, + 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x59, 0x0A, 0x51, 0x58, 0x4E, 0x7A, 0x5A, 0x57, 0x4E, 0x76, 0x49, 0x45, 0x52, 0x68, 0x64, 0x47, 0x45, 0x67, 0x55, 0x33, 0x6C, 0x7A, 0x64, 0x47, 0x56, 0x74, 0x63, 0x79, 0x42, + 0x54, 0x4C, 0x6B, 0x45, 0x75, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x35, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x64, 0x57, 0x30, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, + 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x42, 0x0A, 0x64, 0x58, 0x52, 0x6F, 0x62, 0x33, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x78, 0x48, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x46, 0x6B, 0x4E, 0x6C, 0x63, 0x6E, + 0x52, 0x31, 0x62, 0x53, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x47, 0x56, 0x6B, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, + 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x0A, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x52, 0x4C, 0x59, 0x36, 0x37, 0x74, 0x7A, 0x62, 0x71, 0x62, + 0x54, 0x65, 0x52, 0x6E, 0x30, 0x36, 0x54, 0x70, 0x77, 0x58, 0x6B, 0x4B, 0x51, 0x4D, 0x6C, 0x7A, 0x68, 0x79, 0x43, 0x39, 0x33, 0x79, 0x5A, 0x6E, 0x30, 0x45, 0x47, 0x7A, 0x65, 0x32, 0x6A, 0x75, 0x73, 0x44, 0x62, 0x43, 0x53, 0x7A, 0x42, 0x66, + 0x4E, 0x38, 0x70, 0x0A, 0x66, 0x6B, 0x74, 0x6C, 0x4C, 0x35, 0x4F, 0x6E, 0x31, 0x41, 0x46, 0x72, 0x41, 0x79, 0x67, 0x59, 0x6F, 0x39, 0x69, 0x64, 0x42, 0x63, 0x45, 0x71, 0x32, 0x45, 0x58, 0x78, 0x6B, 0x64, 0x37, 0x66, 0x4F, 0x39, 0x43, 0x41, + 0x41, 0x6F, 0x7A, 0x50, 0x4F, 0x41, 0x2F, 0x71, 0x70, 0x31, 0x78, 0x34, 0x45, 0x61, 0x54, 0x42, 0x79, 0x49, 0x56, 0x63, 0x4A, 0x64, 0x50, 0x54, 0x73, 0x75, 0x63, 0x6C, 0x7A, 0x78, 0x46, 0x55, 0x6C, 0x36, 0x73, 0x31, 0x77, 0x42, 0x35, 0x32, + 0x0A, 0x48, 0x4F, 0x38, 0x41, 0x55, 0x35, 0x38, 0x35, 0x33, 0x42, 0x53, 0x6C, 0x4C, 0x43, 0x49, 0x6C, 0x73, 0x33, 0x4A, 0x79, 0x2F, 0x49, 0x32, 0x7A, 0x35, 0x54, 0x34, 0x49, 0x48, 0x68, 0x51, 0x71, 0x4E, 0x77, 0x75, 0x49, 0x50, 0x4D, 0x71, + 0x77, 0x39, 0x4D, 0x6A, 0x43, 0x6F, 0x61, 0x36, 0x38, 0x77, 0x62, 0x34, 0x70, 0x5A, 0x31, 0x58, 0x69, 0x2F, 0x4B, 0x31, 0x5A, 0x58, 0x50, 0x36, 0x39, 0x56, 0x79, 0x79, 0x77, 0x6B, 0x49, 0x33, 0x43, 0x37, 0x54, 0x65, 0x32, 0x0A, 0x66, 0x4A, + 0x6D, 0x49, 0x74, 0x64, 0x55, 0x44, 0x6D, 0x6A, 0x30, 0x56, 0x44, 0x54, 0x30, 0x36, 0x71, 0x4B, 0x68, 0x46, 0x38, 0x4A, 0x56, 0x4F, 0x4A, 0x56, 0x6B, 0x64, 0x7A, 0x5A, 0x68, 0x70, 0x75, 0x39, 0x50, 0x4D, 0x4D, 0x73, 0x6D, 0x4E, 0x37, 0x34, + 0x48, 0x2B, 0x72, 0x58, 0x32, 0x4A, 0x75, 0x37, 0x70, 0x67, 0x45, 0x38, 0x70, 0x6C, 0x6C, 0x57, 0x65, 0x67, 0x38, 0x78, 0x6E, 0x32, 0x41, 0x31, 0x62, 0x55, 0x61, 0x74, 0x4D, 0x6E, 0x34, 0x71, 0x47, 0x74, 0x0A, 0x67, 0x2F, 0x42, 0x4B, 0x45, + 0x69, 0x4A, 0x33, 0x48, 0x41, 0x56, 0x7A, 0x34, 0x68, 0x6C, 0x78, 0x51, 0x73, 0x44, 0x73, 0x64, 0x55, 0x61, 0x61, 0x6B, 0x46, 0x6A, 0x67, 0x61, 0x6F, 0x34, 0x72, 0x70, 0x55, 0x59, 0x77, 0x42, 0x49, 0x34, 0x5A, 0x73, 0x68, 0x66, 0x6A, 0x76, + 0x71, 0x6D, 0x36, 0x66, 0x31, 0x62, 0x78, 0x4A, 0x41, 0x50, 0x58, 0x73, 0x69, 0x45, 0x6F, 0x64, 0x67, 0x34, 0x32, 0x4D, 0x45, 0x78, 0x35, 0x31, 0x55, 0x47, 0x61, 0x6D, 0x71, 0x69, 0x34, 0x0A, 0x4E, 0x62, 0x6F, 0x4D, 0x4F, 0x76, 0x4A, 0x45, + 0x47, 0x79, 0x43, 0x49, 0x39, 0x38, 0x55, 0x6C, 0x31, 0x7A, 0x33, 0x47, 0x34, 0x7A, 0x35, 0x44, 0x33, 0x59, 0x66, 0x2B, 0x78, 0x4F, 0x72, 0x31, 0x55, 0x7A, 0x35, 0x4D, 0x5A, 0x66, 0x38, 0x37, 0x53, 0x73, 0x74, 0x34, 0x57, 0x6D, 0x73, 0x58, + 0x58, 0x77, 0x33, 0x48, 0x77, 0x30, 0x39, 0x4F, 0x6D, 0x69, 0x71, 0x69, 0x37, 0x56, 0x64, 0x4E, 0x49, 0x75, 0x4A, 0x47, 0x6D, 0x6A, 0x38, 0x50, 0x6B, 0x54, 0x51, 0x6B, 0x0A, 0x66, 0x56, 0x58, 0x6A, 0x6A, 0x4A, 0x55, 0x33, 0x30, 0x78, 0x72, + 0x77, 0x43, 0x53, 0x73, 0x73, 0x30, 0x73, 0x6D, 0x4E, 0x74, 0x41, 0x30, 0x41, 0x71, 0x32, 0x63, 0x70, 0x4B, 0x4E, 0x67, 0x42, 0x39, 0x52, 0x6B, 0x45, 0x74, 0x68, 0x32, 0x2B, 0x64, 0x76, 0x35, 0x79, 0x58, 0x4D, 0x53, 0x46, 0x79, 0x74, 0x4B, + 0x41, 0x51, 0x64, 0x38, 0x46, 0x71, 0x4B, 0x50, 0x56, 0x68, 0x4A, 0x42, 0x50, 0x43, 0x2F, 0x50, 0x67, 0x50, 0x35, 0x73, 0x5A, 0x30, 0x6A, 0x65, 0x4A, 0x0A, 0x50, 0x2F, 0x4A, 0x37, 0x55, 0x68, 0x79, 0x4D, 0x39, 0x75, 0x48, 0x33, 0x50, 0x41, + 0x65, 0x58, 0x6A, 0x41, 0x36, 0x69, 0x57, 0x59, 0x45, 0x4D, 0x73, 0x70, 0x41, 0x39, 0x30, 0x2B, 0x4E, 0x5A, 0x52, 0x75, 0x30, 0x50, 0x71, 0x61, 0x66, 0x65, 0x67, 0x47, 0x74, 0x61, 0x71, 0x67, 0x65, 0x32, 0x47, 0x63, 0x75, 0x38, 0x56, 0x2F, + 0x4F, 0x58, 0x49, 0x58, 0x6F, 0x4D, 0x73, 0x53, 0x74, 0x30, 0x50, 0x75, 0x76, 0x61, 0x70, 0x32, 0x63, 0x74, 0x54, 0x4D, 0x53, 0x59, 0x0A, 0x6E, 0x6A, 0x59, 0x4A, 0x64, 0x6D, 0x5A, 0x6D, 0x2F, 0x42, 0x6F, 0x2F, 0x36, 0x6B, 0x68, 0x55, 0x48, + 0x4C, 0x34, 0x77, 0x76, 0x59, 0x42, 0x51, 0x76, 0x33, 0x79, 0x31, 0x7A, 0x67, 0x44, 0x32, 0x44, 0x47, 0x48, 0x5A, 0x35, 0x79, 0x51, 0x44, 0x34, 0x4F, 0x4D, 0x42, 0x67, 0x51, 0x36, 0x39, 0x32, 0x49, 0x55, 0x30, 0x69, 0x4C, 0x32, 0x79, 0x4E, + 0x71, 0x68, 0x37, 0x58, 0x41, 0x6A, 0x6C, 0x52, 0x49, 0x43, 0x4D, 0x62, 0x2F, 0x67, 0x76, 0x31, 0x53, 0x48, 0x4B, 0x0A, 0x48, 0x52, 0x7A, 0x51, 0x2B, 0x38, 0x53, 0x31, 0x68, 0x39, 0x45, 0x36, 0x54, 0x73, 0x64, 0x32, 0x74, 0x54, 0x56, 0x49, + 0x74, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, + 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x4D, 0x2B, 0x78, 0x78, 0x31, 0x0A, 0x76, 0x41, 0x4C, 0x54, 0x6E, 0x30, 0x34, 0x75, 0x53, 0x4E, 0x6E, 0x35, 0x59, 0x46, 0x53, 0x71, 0x78, 0x4C, 0x4E, 0x50, 0x2B, 0x6A, 0x41, + 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4E, 0x42, 0x51, 0x41, + 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x45, 0x69, 0x69, 0x31, 0x51, 0x41, 0x4C, 0x0A, 0x4C, 0x74, 0x41, 0x2F, 0x76, 0x42, 0x7A, 0x56, 0x74, 0x56, 0x52, 0x4A, 0x48, 0x6C, 0x70, 0x72, 0x39, 0x4F, 0x54, 0x79, 0x34, 0x45, 0x41, 0x33, 0x34, 0x4D, + 0x77, 0x55, 0x65, 0x37, 0x6E, 0x4A, 0x2B, 0x6A, 0x57, 0x31, 0x64, 0x52, 0x65, 0x54, 0x61, 0x67, 0x56, 0x70, 0x68, 0x5A, 0x7A, 0x4E, 0x54, 0x78, 0x6C, 0x34, 0x57, 0x78, 0x6D, 0x42, 0x38, 0x32, 0x4D, 0x2B, 0x77, 0x38, 0x35, 0x62, 0x6A, 0x2F, + 0x55, 0x76, 0x58, 0x67, 0x46, 0x32, 0x45, 0x7A, 0x38, 0x73, 0x0A, 0x41, 0x4C, 0x6E, 0x4E, 0x6C, 0x6C, 0x49, 0x35, 0x53, 0x57, 0x30, 0x45, 0x54, 0x73, 0x58, 0x70, 0x44, 0x34, 0x59, 0x4E, 0x34, 0x66, 0x71, 0x7A, 0x58, 0x34, 0x49, 0x53, 0x38, + 0x54, 0x72, 0x4F, 0x5A, 0x67, 0x59, 0x6B, 0x4E, 0x43, 0x76, 0x6F, 0x7A, 0x4D, 0x72, 0x6E, 0x61, 0x64, 0x79, 0x48, 0x6E, 0x63, 0x49, 0x30, 0x31, 0x33, 0x6E, 0x52, 0x30, 0x33, 0x65, 0x34, 0x71, 0x6C, 0x6C, 0x59, 0x2F, 0x70, 0x30, 0x6D, 0x2B, + 0x6A, 0x69, 0x47, 0x50, 0x70, 0x32, 0x4B, 0x0A, 0x68, 0x32, 0x52, 0x58, 0x35, 0x52, 0x63, 0x36, 0x34, 0x76, 0x6D, 0x4E, 0x75, 0x65, 0x4D, 0x7A, 0x65, 0x4D, 0x47, 0x51, 0x32, 0x4C, 0x6A, 0x64, 0x74, 0x34, 0x4E, 0x52, 0x35, 0x4D, 0x54, 0x4D, + 0x49, 0x39, 0x55, 0x47, 0x66, 0x4F, 0x5A, 0x52, 0x30, 0x38, 0x30, 0x30, 0x4D, 0x63, 0x44, 0x32, 0x52, 0x72, 0x73, 0x4C, 0x72, 0x66, 0x77, 0x39, 0x45, 0x41, 0x55, 0x71, 0x4F, 0x30, 0x71, 0x52, 0x4A, 0x65, 0x36, 0x4D, 0x31, 0x49, 0x53, 0x48, + 0x67, 0x43, 0x71, 0x38, 0x0A, 0x43, 0x59, 0x79, 0x71, 0x4F, 0x68, 0x4E, 0x66, 0x36, 0x44, 0x52, 0x35, 0x55, 0x4D, 0x45, 0x51, 0x47, 0x66, 0x6E, 0x54, 0x4B, 0x42, 0x37, 0x55, 0x30, 0x56, 0x45, 0x77, 0x4B, 0x62, 0x4F, 0x75, 0x6B, 0x47, 0x66, + 0x57, 0x48, 0x77, 0x70, 0x6A, 0x73, 0x63, 0x57, 0x70, 0x78, 0x6B, 0x49, 0x78, 0x59, 0x78, 0x65, 0x55, 0x37, 0x32, 0x6E, 0x4C, 0x4C, 0x2F, 0x71, 0x4D, 0x46, 0x48, 0x33, 0x45, 0x51, 0x78, 0x69, 0x4A, 0x32, 0x66, 0x41, 0x79, 0x51, 0x4F, 0x61, + 0x41, 0x0A, 0x34, 0x6B, 0x5A, 0x66, 0x35, 0x65, 0x50, 0x42, 0x41, 0x46, 0x6D, 0x6F, 0x2B, 0x65, 0x67, 0x67, 0x76, 0x49, 0x6B, 0x73, 0x44, 0x6B, 0x63, 0x30, 0x43, 0x2B, 0x70, 0x58, 0x77, 0x6C, 0x4D, 0x32, 0x2F, 0x4B, 0x66, 0x55, 0x72, 0x7A, + 0x48, 0x4E, 0x2F, 0x67, 0x4C, 0x6C, 0x64, 0x66, 0x71, 0x35, 0x4A, 0x77, 0x6E, 0x35, 0x38, 0x2F, 0x55, 0x37, 0x79, 0x6E, 0x32, 0x66, 0x71, 0x53, 0x4C, 0x4C, 0x69, 0x4D, 0x6D, 0x71, 0x30, 0x55, 0x63, 0x39, 0x4E, 0x6E, 0x65, 0x6F, 0x0A, 0x57, + 0x57, 0x52, 0x72, 0x4A, 0x38, 0x2F, 0x76, 0x4A, 0x38, 0x48, 0x6A, 0x4A, 0x4C, 0x57, 0x47, 0x39, 0x36, 0x35, 0x2B, 0x4D, 0x6B, 0x32, 0x77, 0x65, 0x57, 0x6A, 0x52, 0x4F, 0x65, 0x69, 0x51, 0x57, 0x4D, 0x4F, 0x44, 0x76, 0x41, 0x38, 0x73, 0x31, + 0x70, 0x66, 0x72, 0x7A, 0x67, 0x7A, 0x68, 0x49, 0x4D, 0x66, 0x61, 0x74, 0x7A, 0x37, 0x44, 0x50, 0x37, 0x38, 0x76, 0x33, 0x44, 0x53, 0x6B, 0x2B, 0x79, 0x73, 0x68, 0x7A, 0x57, 0x65, 0x50, 0x53, 0x2F, 0x54, 0x6A, 0x0A, 0x36, 0x74, 0x51, 0x2F, + 0x35, 0x30, 0x2B, 0x36, 0x75, 0x61, 0x57, 0x54, 0x52, 0x52, 0x78, 0x6D, 0x48, 0x79, 0x48, 0x36, 0x5A, 0x46, 0x35, 0x76, 0x34, 0x48, 0x61, 0x55, 0x4D, 0x73, 0x74, 0x31, 0x39, 0x57, 0x37, 0x6C, 0x39, 0x6F, 0x2F, 0x48, 0x75, 0x4B, 0x54, 0x4D, + 0x71, 0x4A, 0x5A, 0x39, 0x5A, 0x50, 0x73, 0x6B, 0x57, 0x6B, 0x6F, 0x44, 0x62, 0x47, 0x73, 0x34, 0x78, 0x75, 0x67, 0x44, 0x51, 0x35, 0x72, 0x33, 0x56, 0x37, 0x6D, 0x7A, 0x4B, 0x57, 0x6D, 0x54, 0x0A, 0x4F, 0x50, 0x51, 0x44, 0x38, 0x72, 0x76, + 0x37, 0x67, 0x6D, 0x73, 0x48, 0x49, 0x4E, 0x46, 0x53, 0x48, 0x35, 0x70, 0x6B, 0x41, 0x6E, 0x75, 0x59, 0x5A, 0x74, 0x74, 0x63, 0x54, 0x56, 0x6F, 0x50, 0x30, 0x49, 0x53, 0x56, 0x6F, 0x44, 0x77, 0x55, 0x51, 0x77, 0x62, 0x4B, 0x79, 0x74, 0x75, + 0x34, 0x51, 0x54, 0x62, 0x61, 0x61, 0x6B, 0x52, 0x6E, 0x68, 0x36, 0x2B, 0x76, 0x34, 0x30, 0x55, 0x52, 0x46, 0x57, 0x6B, 0x49, 0x73, 0x72, 0x34, 0x57, 0x4F, 0x5A, 0x63, 0x6B, 0x0A, 0x62, 0x78, 0x4A, 0x46, 0x30, 0x57, 0x64, 0x64, 0x43, 0x61, + 0x6A, 0x4A, 0x46, 0x64, 0x72, 0x36, 0x30, 0x71, 0x5A, 0x66, 0x45, 0x32, 0x45, 0x66, 0x76, 0x34, 0x57, 0x73, 0x74, 0x4B, 0x32, 0x74, 0x42, 0x5A, 0x51, 0x49, 0x67, 0x78, 0x35, 0x31, 0x46, 0x39, 0x4E, 0x78, 0x4F, 0x35, 0x4E, 0x51, 0x49, 0x31, + 0x6D, 0x67, 0x37, 0x54, 0x79, 0x52, 0x56, 0x4A, 0x31, 0x32, 0x41, 0x4D, 0x58, 0x44, 0x75, 0x44, 0x6A, 0x62, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x75, 0x6E, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x73, 0x7A, 0x43, 0x43, 0x41, 0x35, 0x75, 0x67, + 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x45, 0x77, 0x4C, 0x56, 0x34, 0x6B, 0x42, 0x4D, 0x6B, 0x6B, 0x61, 0x47, 0x46, 0x6D, 0x64, 0x64, 0x74, 0x4C, 0x75, 0x37, 0x73, 0x6D, 0x73, 0x2B, 0x2F, 0x42, 0x4D, 0x77, 0x44, 0x51, 0x59, 0x4A, + 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x59, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x45, 0x34, 0x78, 0x4E, 0x7A, 0x41, + 0x31, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x4C, 0x6B, 0x46, 0x6E, 0x5A, 0x57, 0x35, 0x6A, 0x5A, 0x53, 0x42, 0x4F, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x35, 0x68, 0x62, 0x47, 0x55, 0x67, 0x5A, 0x47, 0x55, 0x67, 0x51, 0x32, 0x56, + 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x46, 0x62, 0x47, 0x56, 0x6A, 0x0A, 0x64, 0x48, 0x4A, 0x76, 0x62, 0x6D, 0x6C, 0x78, 0x64, 0x57, 0x55, 0x78, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x45, 0x46, 0x52, 0x31, 0x62, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x6B, 0x77, 0x4E, 0x44, + 0x49, 0x32, 0x4D, 0x44, 0x67, 0x31, 0x4E, 0x7A, 0x55, 0x32, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x51, 0x77, 0x0A, 0x4E, 0x44, 0x49, 0x32, 0x4D, 0x44, 0x67, 0x31, 0x4E, 0x7A, 0x55, 0x32, 0x57, 0x6A, 0x42, 0x68, 0x4D, 0x51, 0x73, 0x77, 0x43, + 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x55, 0x54, 0x6A, 0x45, 0x33, 0x4D, 0x44, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x75, 0x51, 0x57, 0x64, 0x6C, 0x62, 0x6D, 0x4E, 0x6C, 0x49, 0x45, 0x35, 0x68, 0x64, + 0x47, 0x6C, 0x76, 0x62, 0x6D, 0x46, 0x73, 0x5A, 0x53, 0x42, 0x6B, 0x5A, 0x53, 0x42, 0x44, 0x0A, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x56, 0x73, 0x5A, 0x57, 0x4E, 0x30, + 0x63, 0x6D, 0x39, 0x75, 0x61, 0x58, 0x46, 0x31, 0x5A, 0x54, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x51, 0x56, 0x48, 0x56, 0x75, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, + 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, + 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4D, 0x50, 0x4E, 0x30, 0x2F, 0x79, 0x39, 0x42, 0x46, 0x50, 0x64, 0x44, 0x43, 0x41, 0x36, 0x31, 0x59, 0x67, 0x75, 0x42, 0x55, 0x74, 0x42, 0x39, 0x59, 0x4F, 0x43, 0x66, 0x76, 0x64, + 0x5A, 0x6E, 0x35, 0x36, 0x65, 0x59, 0x2B, 0x68, 0x7A, 0x0A, 0x32, 0x76, 0x59, 0x47, 0x71, 0x55, 0x38, 0x66, 0x74, 0x50, 0x6B, 0x4C, 0x48, 0x7A, 0x6D, 0x4D, 0x6D, 0x69, 0x44, 0x51, 0x66, 0x67, 0x62, 0x55, 0x37, 0x44, 0x54, 0x5A, 0x68, 0x72, + 0x78, 0x31, 0x57, 0x34, 0x65, 0x49, 0x38, 0x4E, 0x4C, 0x5A, 0x31, 0x4B, 0x4D, 0x4B, 0x73, 0x6D, 0x77, 0x62, 0x36, 0x30, 0x6B, 0x73, 0x50, 0x71, 0x78, 0x64, 0x32, 0x4A, 0x51, 0x44, 0x6F, 0x4F, 0x77, 0x30, 0x35, 0x54, 0x44, 0x45, 0x4E, 0x58, + 0x33, 0x37, 0x4A, 0x6B, 0x30, 0x62, 0x0A, 0x62, 0x6A, 0x42, 0x55, 0x32, 0x50, 0x57, 0x41, 0x52, 0x5A, 0x77, 0x35, 0x72, 0x5A, 0x7A, 0x4A, 0x4A, 0x51, 0x52, 0x4E, 0x6D, 0x70, 0x41, 0x2B, 0x54, 0x6B, 0x42, 0x75, 0x69, 0x6D, 0x76, 0x4E, 0x4B, + 0x57, 0x66, 0x47, 0x7A, 0x43, 0x33, 0x67, 0x64, 0x4F, 0x67, 0x46, 0x56, 0x77, 0x70, 0x49, 0x55, 0x50, 0x70, 0x36, 0x51, 0x39, 0x70, 0x2B, 0x37, 0x46, 0x75, 0x61, 0x44, 0x6D, 0x4A, 0x32, 0x2F, 0x75, 0x71, 0x64, 0x48, 0x59, 0x56, 0x79, 0x37, + 0x42, 0x47, 0x37, 0x0A, 0x4E, 0x65, 0x67, 0x66, 0x4A, 0x37, 0x2F, 0x42, 0x6F, 0x63, 0x65, 0x37, 0x53, 0x42, 0x62, 0x64, 0x56, 0x74, 0x66, 0x4D, 0x54, 0x71, 0x44, 0x68, 0x75, 0x61, 0x7A, 0x62, 0x31, 0x59, 0x4D, 0x5A, 0x47, 0x6F, 0x58, 0x52, + 0x6C, 0x4A, 0x66, 0x58, 0x79, 0x71, 0x4E, 0x6C, 0x43, 0x2F, 0x4D, 0x34, 0x2B, 0x51, 0x4B, 0x75, 0x33, 0x66, 0x5A, 0x6E, 0x7A, 0x38, 0x6B, 0x2F, 0x39, 0x59, 0x6F, 0x73, 0x52, 0x78, 0x71, 0x5A, 0x62, 0x77, 0x55, 0x4E, 0x2F, 0x64, 0x41, 0x64, + 0x0A, 0x67, 0x6A, 0x48, 0x38, 0x4B, 0x63, 0x77, 0x41, 0x57, 0x4A, 0x65, 0x52, 0x54, 0x49, 0x41, 0x41, 0x48, 0x44, 0x4F, 0x46, 0x6C, 0x69, 0x2F, 0x4C, 0x51, 0x63, 0x4B, 0x4C, 0x45, 0x49, 0x54, 0x44, 0x43, 0x53, 0x53, 0x4A, 0x48, 0x37, 0x55, + 0x50, 0x32, 0x64, 0x6C, 0x33, 0x52, 0x78, 0x69, 0x53, 0x6C, 0x47, 0x42, 0x63, 0x78, 0x35, 0x6B, 0x44, 0x50, 0x50, 0x37, 0x33, 0x6C, 0x61, 0x64, 0x39, 0x55, 0x4B, 0x47, 0x41, 0x77, 0x71, 0x6D, 0x44, 0x72, 0x56, 0x69, 0x57, 0x0A, 0x56, 0x53, + 0x48, 0x62, 0x68, 0x6C, 0x6E, 0x55, 0x72, 0x38, 0x61, 0x38, 0x33, 0x59, 0x46, 0x75, 0x42, 0x39, 0x74, 0x67, 0x59, 0x76, 0x37, 0x73, 0x45, 0x47, 0x37, 0x61, 0x61, 0x41, 0x48, 0x30, 0x67, 0x78, 0x75, 0x70, 0x50, 0x71, 0x4A, 0x62, 0x49, 0x39, + 0x64, 0x6B, 0x78, 0x74, 0x2F, 0x63, 0x6F, 0x6E, 0x33, 0x59, 0x53, 0x37, 0x71, 0x43, 0x30, 0x6C, 0x48, 0x34, 0x5A, 0x72, 0x38, 0x47, 0x52, 0x75, 0x52, 0x35, 0x4B, 0x69, 0x59, 0x32, 0x65, 0x59, 0x38, 0x66, 0x0A, 0x54, 0x70, 0x6B, 0x64, 0x73, + 0x6F, 0x38, 0x4D, 0x44, 0x68, 0x7A, 0x2F, 0x79, 0x56, 0x33, 0x41, 0x2F, 0x5A, 0x41, 0x51, 0x70, 0x72, 0x45, 0x33, 0x38, 0x38, 0x30, 0x36, 0x4A, 0x47, 0x36, 0x30, 0x68, 0x5A, 0x43, 0x2F, 0x67, 0x4C, 0x6B, 0x4D, 0x6A, 0x4E, 0x57, 0x62, 0x31, + 0x73, 0x6A, 0x78, 0x56, 0x6A, 0x38, 0x61, 0x67, 0x49, 0x6C, 0x36, 0x71, 0x65, 0x49, 0x62, 0x4D, 0x6C, 0x45, 0x73, 0x50, 0x76, 0x4C, 0x66, 0x65, 0x2F, 0x5A, 0x64, 0x65, 0x69, 0x6B, 0x5A, 0x0A, 0x6A, 0x75, 0x58, 0x49, 0x76, 0x54, 0x5A, 0x78, + 0x69, 0x31, 0x31, 0x4D, 0x77, 0x68, 0x30, 0x2F, 0x72, 0x56, 0x69, 0x69, 0x7A, 0x7A, 0x31, 0x77, 0x54, 0x61, 0x5A, 0x51, 0x6D, 0x43, 0x58, 0x63, 0x49, 0x2F, 0x6D, 0x34, 0x57, 0x45, 0x45, 0x49, 0x63, 0x62, 0x39, 0x50, 0x75, 0x49, 0x53, 0x67, + 0x6A, 0x77, 0x42, 0x55, 0x46, 0x66, 0x79, 0x52, 0x62, 0x56, 0x69, 0x6E, 0x6C, 0x6A, 0x76, 0x72, 0x53, 0x35, 0x59, 0x6E, 0x7A, 0x57, 0x75, 0x69, 0x6F, 0x59, 0x61, 0x73, 0x0A, 0x44, 0x58, 0x78, 0x55, 0x35, 0x6D, 0x5A, 0x4D, 0x5A, 0x6C, 0x2B, + 0x51, 0x76, 0x69, 0x47, 0x61, 0x41, 0x6B, 0x59, 0x74, 0x35, 0x49, 0x50, 0x43, 0x67, 0x4C, 0x6E, 0x50, 0x53, 0x7A, 0x37, 0x6F, 0x66, 0x7A, 0x77, 0x42, 0x37, 0x49, 0x39, 0x65, 0x7A, 0x58, 0x2F, 0x53, 0x4B, 0x45, 0x49, 0x42, 0x6C, 0x59, 0x72, + 0x69, 0x6C, 0x7A, 0x30, 0x51, 0x49, 0x58, 0x33, 0x32, 0x6E, 0x52, 0x7A, 0x46, 0x4E, 0x4B, 0x48, 0x73, 0x4C, 0x41, 0x34, 0x4B, 0x55, 0x69, 0x77, 0x53, 0x0A, 0x56, 0x58, 0x41, 0x6B, 0x50, 0x63, 0x76, 0x43, 0x46, 0x44, 0x56, 0x44, 0x58, 0x53, + 0x64, 0x4F, 0x76, 0x73, 0x43, 0x39, 0x71, 0x6E, 0x79, 0x57, 0x35, 0x2F, 0x79, 0x65, 0x59, 0x61, 0x31, 0x45, 0x30, 0x77, 0x43, 0x58, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, + 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x51, 0x47, 0x6D, 0x70, 0x73, 0x66, 0x55, 0x33, 0x33, 0x78, 0x39, 0x61, 0x54, 0x49, 0x0A, 0x30, 0x34, 0x59, 0x2B, 0x6F, 0x58, 0x4E, 0x5A, 0x74, 0x50, 0x64, 0x45, 0x49, 0x54, 0x41, 0x50, 0x42, + 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x41, 0x61, 0x61, 0x6D, + 0x78, 0x39, 0x54, 0x66, 0x66, 0x48, 0x31, 0x70, 0x4D, 0x6A, 0x54, 0x68, 0x6A, 0x36, 0x68, 0x63, 0x31, 0x6D, 0x30, 0x0A, 0x39, 0x30, 0x51, 0x68, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, + 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x71, 0x67, 0x56, 0x75, 0x74, 0x74, 0x30, 0x56, + 0x79, 0x62, 0x2B, 0x7A, 0x78, 0x69, 0x44, 0x32, 0x42, 0x6B, 0x65, 0x77, 0x68, 0x70, 0x4D, 0x6C, 0x0A, 0x30, 0x34, 0x32, 0x35, 0x79, 0x41, 0x41, 0x2F, 0x6C, 0x2F, 0x56, 0x53, 0x4A, 0x34, 0x68, 0x78, 0x79, 0x58, 0x54, 0x39, 0x36, 0x38, 0x70, + 0x6B, 0x32, 0x31, 0x76, 0x76, 0x48, 0x6C, 0x32, 0x36, 0x76, 0x39, 0x48, 0x72, 0x37, 0x6C, 0x78, 0x70, 0x75, 0x68, 0x62, 0x49, 0x38, 0x37, 0x6D, 0x50, 0x30, 0x7A, 0x59, 0x75, 0x51, 0x45, 0x6B, 0x48, 0x44, 0x56, 0x6E, 0x65, 0x69, 0x78, 0x43, + 0x77, 0x53, 0x51, 0x58, 0x69, 0x2F, 0x35, 0x45, 0x2F, 0x53, 0x37, 0x66, 0x64, 0x0A, 0x41, 0x6F, 0x37, 0x34, 0x67, 0x53, 0x68, 0x63, 0x7A, 0x4E, 0x78, 0x74, 0x72, 0x31, 0x38, 0x55, 0x6E, 0x48, 0x31, 0x59, 0x65, 0x41, 0x33, 0x32, 0x67, 0x41, + 0x6D, 0x35, 0x36, 0x51, 0x36, 0x58, 0x4B, 0x52, 0x6D, 0x34, 0x74, 0x2B, 0x76, 0x34, 0x46, 0x73, 0x74, 0x56, 0x45, 0x75, 0x54, 0x47, 0x66, 0x62, 0x76, 0x45, 0x37, 0x50, 0x69, 0x31, 0x48, 0x45, 0x34, 0x2B, 0x5A, 0x37, 0x2F, 0x46, 0x58, 0x78, + 0x74, 0x74, 0x62, 0x55, 0x63, 0x6F, 0x71, 0x67, 0x52, 0x59, 0x0A, 0x59, 0x64, 0x5A, 0x32, 0x76, 0x79, 0x4A, 0x2F, 0x30, 0x41, 0x64, 0x71, 0x70, 0x32, 0x52, 0x54, 0x38, 0x4A, 0x65, 0x4E, 0x6E, 0x59, 0x41, 0x2F, 0x75, 0x38, 0x45, 0x48, 0x32, + 0x32, 0x57, 0x76, 0x35, 0x70, 0x73, 0x79, 0x6D, 0x73, 0x4E, 0x55, 0x6B, 0x38, 0x51, 0x63, 0x43, 0x4D, 0x4E, 0x45, 0x2B, 0x33, 0x74, 0x6A, 0x45, 0x55, 0x50, 0x52, 0x61, 0x68, 0x70, 0x68, 0x61, 0x6E, 0x6C, 0x74, 0x6B, 0x45, 0x38, 0x70, 0x6A, + 0x6B, 0x63, 0x46, 0x77, 0x52, 0x4A, 0x70, 0x0A, 0x61, 0x64, 0x62, 0x47, 0x4E, 0x6A, 0x48, 0x68, 0x2F, 0x50, 0x71, 0x41, 0x75, 0x6C, 0x78, 0x50, 0x78, 0x4F, 0x75, 0x33, 0x4D, 0x71, 0x7A, 0x34, 0x64, 0x57, 0x45, 0x58, 0x31, 0x78, 0x41, 0x5A, + 0x75, 0x66, 0x48, 0x53, 0x43, 0x65, 0x39, 0x36, 0x51, 0x70, 0x31, 0x62, 0x57, 0x67, 0x76, 0x55, 0x78, 0x70, 0x56, 0x4F, 0x4B, 0x73, 0x37, 0x2F, 0x42, 0x39, 0x64, 0x50, 0x66, 0x68, 0x67, 0x47, 0x69, 0x50, 0x45, 0x5A, 0x74, 0x64, 0x6D, 0x59, + 0x75, 0x36, 0x35, 0x78, 0x0A, 0x78, 0x42, 0x7A, 0x6E, 0x64, 0x46, 0x6C, 0x59, 0x37, 0x77, 0x79, 0x4A, 0x7A, 0x34, 0x73, 0x66, 0x64, 0x5A, 0x4D, 0x61, 0x42, 0x42, 0x53, 0x53, 0x53, 0x46, 0x43, 0x70, 0x36, 0x31, 0x63, 0x70, 0x41, 0x42, 0x62, + 0x6A, 0x4E, 0x68, 0x7A, 0x49, 0x2B, 0x4C, 0x2F, 0x77, 0x4D, 0x39, 0x56, 0x42, 0x44, 0x38, 0x54, 0x4D, 0x50, 0x4E, 0x33, 0x70, 0x4D, 0x30, 0x4D, 0x42, 0x6B, 0x52, 0x41, 0x72, 0x48, 0x74, 0x47, 0x35, 0x58, 0x63, 0x30, 0x79, 0x47, 0x59, 0x75, + 0x50, 0x0A, 0x6A, 0x43, 0x42, 0x33, 0x31, 0x79, 0x4C, 0x45, 0x51, 0x74, 0x79, 0x45, 0x46, 0x70, 0x73, 0x6C, 0x62, 0x65, 0x69, 0x30, 0x56, 0x58, 0x46, 0x2F, 0x73, 0x48, 0x79, 0x7A, 0x30, 0x33, 0x46, 0x4A, 0x75, 0x63, 0x39, 0x53, 0x70, 0x41, + 0x51, 0x2F, 0x33, 0x44, 0x32, 0x67, 0x75, 0x36, 0x38, 0x7A, 0x6E, 0x67, 0x6F, 0x77, 0x59, 0x49, 0x37, 0x62, 0x6E, 0x56, 0x32, 0x55, 0x71, 0x4C, 0x31, 0x67, 0x35, 0x32, 0x4B, 0x41, 0x64, 0x6F, 0x47, 0x44, 0x44, 0x49, 0x7A, 0x4D, 0x0A, 0x4D, + 0x45, 0x5A, 0x4A, 0x34, 0x67, 0x7A, 0x53, 0x71, 0x4B, 0x2F, 0x72, 0x59, 0x58, 0x48, 0x76, 0x35, 0x79, 0x4A, 0x69, 0x71, 0x66, 0x64, 0x63, 0x5A, 0x47, 0x79, 0x66, 0x46, 0x6F, 0x78, 0x6E, 0x4E, 0x69, 0x64, 0x46, 0x39, 0x51, 0x6C, 0x37, 0x76, + 0x2F, 0x59, 0x51, 0x43, 0x76, 0x47, 0x77, 0x6A, 0x56, 0x52, 0x44, 0x6A, 0x41, 0x53, 0x36, 0x6F, 0x7A, 0x2F, 0x76, 0x34, 0x6A, 0x58, 0x48, 0x2B, 0x58, 0x54, 0x67, 0x62, 0x7A, 0x52, 0x42, 0x30, 0x4C, 0x39, 0x7A, 0x0A, 0x5A, 0x56, 0x63, 0x67, + 0x2B, 0x5A, 0x74, 0x6E, 0x65, 0x6D, 0x5A, 0x6F, 0x4A, 0x45, 0x36, 0x41, 0x5A, 0x62, 0x30, 0x51, 0x6D, 0x51, 0x5A, 0x5A, 0x38, 0x6D, 0x57, 0x76, 0x75, 0x4D, 0x5A, 0x48, 0x75, 0x2F, 0x32, 0x51, 0x65, 0x49, 0x74, 0x42, 0x63, 0x79, 0x36, 0x76, + 0x56, 0x52, 0x2F, 0x63, 0x4F, 0x35, 0x4A, 0x79, 0x62, 0x6F, 0x54, 0x54, 0x30, 0x47, 0x46, 0x4D, 0x44, 0x63, 0x78, 0x32, 0x56, 0x2B, 0x49, 0x74, 0x68, 0x53, 0x49, 0x56, 0x4E, 0x67, 0x33, 0x72, 0x0A, 0x41, 0x5A, 0x33, 0x72, 0x32, 0x4F, 0x76, + 0x45, 0x68, 0x4A, 0x6E, 0x37, 0x77, 0x41, 0x7A, 0x4D, 0x4D, 0x75, 0x6A, 0x6A, 0x64, 0x39, 0x71, 0x44, 0x52, 0x49, 0x75, 0x65, 0x56, 0x53, 0x6A, 0x41, 0x69, 0x31, 0x6A, 0x54, 0x6B, 0x44, 0x35, 0x4F, 0x47, 0x77, 0x44, 0x78, 0x46, 0x61, 0x32, + 0x44, 0x4B, 0x35, 0x6F, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x41, 0x52, 0x49, 0x43, 0x41, 0x20, + 0x54, 0x4C, 0x53, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, + 0x46, 0x70, 0x44, 0x43, 0x43, 0x41, 0x34, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x4F, 0x63, 0x71, 0x54, 0x48, 0x4F, 0x39, 0x44, 0x38, 0x38, 0x61, 0x4F, 0x6B, 0x38, 0x66, 0x30, 0x5A, 0x49, 0x6B, 0x34, 0x66, 0x6A, 0x41, + 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x73, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x48, 0x55, 0x6A, + 0x45, 0x33, 0x4D, 0x44, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x75, 0x53, 0x47, 0x56, 0x73, 0x62, 0x47, 0x56, 0x75, 0x61, 0x57, 0x4D, 0x67, 0x51, 0x57, 0x4E, 0x68, 0x5A, 0x47, 0x56, 0x74, 0x61, 0x57, 0x4D, 0x67, 0x59, 0x57, + 0x35, 0x6B, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, 0x45, 0x6C, 0x75, 0x63, 0x33, 0x52, 0x70, 0x64, 0x48, 0x56, 0x30, 0x61, 0x57, 0x39, 0x75, 0x0A, 0x63, 0x79, 0x42, 0x44, 0x51, 0x54, 0x45, 0x6B, 0x4D, + 0x43, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x62, 0x53, 0x45, 0x46, 0x53, 0x53, 0x55, 0x4E, 0x42, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, + 0x53, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x78, 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x54, 0x45, 0x77, 0x4E, 0x54, 0x55, 0x7A, 0x0A, 0x4F, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x31, 0x4D, 0x44, 0x49, 0x78, + 0x4D, 0x7A, 0x45, 0x77, 0x4E, 0x54, 0x55, 0x7A, 0x4E, 0x31, 0x6F, 0x77, 0x62, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x31, 0x49, 0x78, 0x4E, 0x7A, 0x41, 0x31, 0x42, 0x67, 0x4E, 0x56, + 0x42, 0x41, 0x6F, 0x4D, 0x4C, 0x6B, 0x68, 0x6C, 0x62, 0x47, 0x78, 0x6C, 0x62, 0x6D, 0x6C, 0x6A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x0A, 0x62, 0x57, 0x6C, 0x6A, 0x49, 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, + 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, 0x4A, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4A, 0x44, 0x41, 0x69, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, + 0x4D, 0x47, 0x30, 0x68, 0x42, 0x55, 0x6B, 0x6C, 0x44, 0x51, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x0A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x54, + 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, + 0x49, 0x42, 0x41, 0x49, 0x76, 0x43, 0x35, 0x36, 0x39, 0x6C, 0x6D, 0x77, 0x56, 0x6E, 0x6C, 0x73, 0x6B, 0x4E, 0x0A, 0x4A, 0x4C, 0x6E, 0x51, 0x44, 0x6D, 0x54, 0x38, 0x7A, 0x75, 0x49, 0x6B, 0x47, 0x43, 0x79, 0x45, 0x66, 0x33, 0x64, 0x52, 0x79, + 0x77, 0x51, 0x52, 0x4E, 0x72, 0x68, 0x65, 0x37, 0x57, 0x6C, 0x78, 0x70, 0x35, 0x37, 0x6B, 0x4A, 0x51, 0x6D, 0x58, 0x5A, 0x38, 0x46, 0x48, 0x77, 0x73, 0x2B, 0x52, 0x46, 0x6A, 0x5A, 0x69, 0x50, 0x54, 0x67, 0x45, 0x34, 0x56, 0x47, 0x43, 0x2F, + 0x36, 0x7A, 0x53, 0x74, 0x47, 0x6E, 0x64, 0x4C, 0x75, 0x77, 0x52, 0x6F, 0x30, 0x58, 0x75, 0x0A, 0x61, 0x32, 0x73, 0x37, 0x54, 0x4C, 0x2B, 0x4D, 0x6A, 0x61, 0x51, 0x65, 0x6E, 0x52, 0x47, 0x35, 0x36, 0x54, 0x6A, 0x35, 0x65, 0x67, 0x34, 0x4D, + 0x6D, 0x4F, 0x49, 0x6A, 0x48, 0x64, 0x46, 0x4F, 0x59, 0x39, 0x54, 0x6E, 0x75, 0x45, 0x46, 0x45, 0x2B, 0x32, 0x75, 0x76, 0x61, 0x39, 0x6F, 0x66, 0x30, 0x38, 0x57, 0x52, 0x69, 0x46, 0x75, 0x6B, 0x69, 0x5A, 0x4C, 0x52, 0x67, 0x65, 0x61, 0x4D, + 0x4F, 0x56, 0x69, 0x67, 0x31, 0x6D, 0x6C, 0x44, 0x71, 0x61, 0x32, 0x59, 0x0A, 0x55, 0x6C, 0x68, 0x75, 0x32, 0x77, 0x72, 0x37, 0x61, 0x38, 0x39, 0x6F, 0x2B, 0x75, 0x4F, 0x6B, 0x58, 0x6A, 0x70, 0x46, 0x63, 0x35, 0x67, 0x48, 0x36, 0x6C, 0x38, + 0x43, 0x63, 0x74, 0x34, 0x4D, 0x70, 0x62, 0x4F, 0x66, 0x72, 0x71, 0x6B, 0x64, 0x74, 0x78, 0x32, 0x7A, 0x2F, 0x49, 0x70, 0x5A, 0x35, 0x32, 0x35, 0x79, 0x5A, 0x61, 0x33, 0x31, 0x4D, 0x4A, 0x51, 0x6A, 0x42, 0x2F, 0x4F, 0x43, 0x46, 0x6B, 0x73, + 0x31, 0x6D, 0x4A, 0x78, 0x54, 0x75, 0x79, 0x2F, 0x4B, 0x0A, 0x35, 0x46, 0x72, 0x5A, 0x78, 0x34, 0x30, 0x64, 0x2F, 0x4A, 0x69, 0x5A, 0x2B, 0x79, 0x79, 0x6B, 0x67, 0x6D, 0x76, 0x77, 0x4B, 0x68, 0x2B, 0x4F, 0x43, 0x31, 0x39, 0x78, 0x58, 0x46, + 0x79, 0x75, 0x51, 0x6E, 0x73, 0x70, 0x69, 0x59, 0x48, 0x4C, 0x41, 0x36, 0x4F, 0x5A, 0x79, 0x6F, 0x69, 0x65, 0x43, 0x30, 0x41, 0x4A, 0x51, 0x54, 0x50, 0x62, 0x35, 0x6C, 0x68, 0x36, 0x2F, 0x61, 0x36, 0x5A, 0x63, 0x4D, 0x42, 0x61, 0x44, 0x39, + 0x59, 0x54, 0x68, 0x6E, 0x45, 0x76, 0x0A, 0x64, 0x6D, 0x6E, 0x38, 0x6B, 0x4E, 0x33, 0x62, 0x4C, 0x57, 0x37, 0x52, 0x38, 0x70, 0x76, 0x31, 0x47, 0x6D, 0x75, 0x65, 0x62, 0x78, 0x57, 0x4D, 0x65, 0x76, 0x42, 0x4C, 0x4B, 0x4B, 0x41, 0x69, 0x4F, + 0x49, 0x41, 0x6B, 0x62, 0x44, 0x61, 0x6B, 0x4F, 0x2F, 0x49, 0x77, 0x6B, 0x66, 0x4E, 0x34, 0x45, 0x38, 0x2F, 0x42, 0x50, 0x7A, 0x57, 0x72, 0x38, 0x52, 0x30, 0x52, 0x49, 0x37, 0x56, 0x44, 0x49, 0x70, 0x34, 0x42, 0x6B, 0x72, 0x63, 0x59, 0x41, + 0x75, 0x55, 0x52, 0x0A, 0x30, 0x59, 0x4C, 0x62, 0x46, 0x51, 0x44, 0x4D, 0x59, 0x54, 0x66, 0x42, 0x4B, 0x6E, 0x79, 0x61, 0x34, 0x64, 0x43, 0x36, 0x73, 0x31, 0x42, 0x47, 0x37, 0x6F, 0x4B, 0x73, 0x6E, 0x54, 0x48, 0x34, 0x2B, 0x79, 0x50, 0x69, + 0x41, 0x77, 0x42, 0x49, 0x63, 0x4B, 0x4D, 0x4A, 0x4A, 0x6E, 0x6B, 0x56, 0x55, 0x32, 0x44, 0x7A, 0x4F, 0x46, 0x79, 0x74, 0x4F, 0x4F, 0x71, 0x42, 0x41, 0x47, 0x4D, 0x55, 0x75, 0x54, 0x4E, 0x65, 0x33, 0x51, 0x76, 0x62, 0x6F, 0x45, 0x55, 0x48, + 0x0A, 0x47, 0x6A, 0x4D, 0x4A, 0x2B, 0x45, 0x32, 0x30, 0x70, 0x77, 0x4B, 0x6D, 0x61, 0x66, 0x54, 0x43, 0x57, 0x51, 0x57, 0x49, 0x5A, 0x59, 0x56, 0x57, 0x72, 0x6B, 0x76, 0x4C, 0x34, 0x4E, 0x34, 0x38, 0x66, 0x53, 0x30, 0x61, 0x79, 0x4F, 0x6E, + 0x37, 0x48, 0x36, 0x4E, 0x68, 0x53, 0x74, 0x59, 0x71, 0x45, 0x36, 0x31, 0x33, 0x54, 0x42, 0x6F, 0x59, 0x6D, 0x35, 0x45, 0x50, 0x57, 0x4E, 0x67, 0x47, 0x56, 0x4D, 0x57, 0x58, 0x2B, 0x4B, 0x6F, 0x2F, 0x49, 0x49, 0x71, 0x6D, 0x0A, 0x68, 0x61, + 0x5A, 0x33, 0x39, 0x71, 0x62, 0x38, 0x48, 0x4F, 0x4C, 0x75, 0x62, 0x70, 0x51, 0x7A, 0x4B, 0x6F, 0x4E, 0x51, 0x68, 0x41, 0x72, 0x6C, 0x54, 0x34, 0x62, 0x34, 0x55, 0x45, 0x56, 0x34, 0x41, 0x49, 0x48, 0x72, 0x57, 0x32, 0x6A, 0x6A, 0x4A, 0x6F, + 0x33, 0x4D, 0x65, 0x31, 0x78, 0x52, 0x39, 0x42, 0x51, 0x73, 0x51, 0x4C, 0x34, 0x61, 0x59, 0x42, 0x31, 0x36, 0x63, 0x6D, 0x45, 0x64, 0x48, 0x32, 0x4D, 0x74, 0x69, 0x4B, 0x72, 0x4F, 0x6F, 0x6B, 0x57, 0x51, 0x0A, 0x43, 0x50, 0x78, 0x72, 0x76, + 0x72, 0x4E, 0x51, 0x4B, 0x6C, 0x72, 0x39, 0x71, 0x45, 0x67, 0x59, 0x52, 0x74, 0x61, 0x51, 0x51, 0x4A, 0x4B, 0x51, 0x43, 0x6F, 0x52, 0x65, 0x61, 0x44, 0x48, 0x34, 0x36, 0x2B, 0x30, 0x4E, 0x30, 0x78, 0x33, 0x47, 0x66, 0x5A, 0x6B, 0x59, 0x56, + 0x56, 0x59, 0x6E, 0x5A, 0x53, 0x36, 0x4E, 0x52, 0x63, 0x55, 0x6B, 0x37, 0x4D, 0x37, 0x6A, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x41, 0x70, 0x49, 0x49, 0x36, 0x5A, 0x67, 0x70, 0x4A, 0x49, 0x4B, 0x4D, 0x2B, 0x71, 0x54, + 0x57, 0x38, 0x56, 0x58, 0x36, 0x69, 0x56, 0x4E, 0x76, 0x52, 0x4C, 0x75, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x0A, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, + 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x50, 0x70, 0x42, 0x49, 0x71, 0x6D, 0x35, 0x69, 0x46, 0x53, 0x56, 0x6D, 0x65, 0x77, 0x7A, 0x56, 0x6A, 0x49, 0x75, + 0x4A, 0x6E, 0x64, 0x66, 0x74, 0x54, 0x67, 0x66, 0x76, 0x6E, 0x4E, 0x41, 0x55, 0x58, 0x31, 0x35, 0x51, 0x76, 0x57, 0x69, 0x57, 0x6B, 0x4B, 0x51, 0x55, 0x0A, 0x45, 0x61, 0x70, 0x6F, 0x62, 0x51, 0x6B, 0x31, 0x4F, 0x55, 0x41, 0x4A, 0x32, 0x76, + 0x51, 0x4A, 0x4C, 0x44, 0x53, 0x6C, 0x65, 0x31, 0x6D, 0x45, 0x53, 0x53, 0x6D, 0x58, 0x64, 0x4D, 0x67, 0x48, 0x48, 0x6B, 0x64, 0x74, 0x38, 0x73, 0x34, 0x63, 0x55, 0x43, 0x62, 0x6A, 0x6E, 0x6A, 0x31, 0x41, 0x55, 0x7A, 0x2F, 0x33, 0x66, 0x35, + 0x5A, 0x32, 0x45, 0x4D, 0x56, 0x47, 0x70, 0x64, 0x41, 0x67, 0x53, 0x31, 0x44, 0x30, 0x4E, 0x54, 0x73, 0x59, 0x39, 0x46, 0x56, 0x71, 0x0A, 0x51, 0x52, 0x74, 0x48, 0x42, 0x6D, 0x67, 0x38, 0x75, 0x77, 0x6B, 0x49, 0x59, 0x74, 0x6C, 0x66, 0x56, + 0x55, 0x4B, 0x71, 0x72, 0x46, 0x4F, 0x46, 0x72, 0x4A, 0x56, 0x57, 0x4E, 0x6C, 0x61, 0x72, 0x35, 0x41, 0x57, 0x4D, 0x78, 0x61, 0x6A, 0x61, 0x48, 0x36, 0x4E, 0x70, 0x76, 0x56, 0x4D, 0x50, 0x78, 0x50, 0x2F, 0x63, 0x79, 0x75, 0x4E, 0x2B, 0x38, + 0x6B, 0x79, 0x49, 0x68, 0x6B, 0x64, 0x47, 0x47, 0x76, 0x4D, 0x41, 0x39, 0x59, 0x43, 0x52, 0x6F, 0x74, 0x78, 0x44, 0x0A, 0x51, 0x70, 0x53, 0x62, 0x49, 0x50, 0x44, 0x52, 0x7A, 0x62, 0x4C, 0x72, 0x4C, 0x46, 0x50, 0x43, 0x55, 0x33, 0x68, 0x4B, + 0x54, 0x77, 0x53, 0x55, 0x51, 0x5A, 0x71, 0x50, 0x4A, 0x7A, 0x4C, 0x42, 0x35, 0x55, 0x6B, 0x5A, 0x76, 0x2F, 0x48, 0x79, 0x77, 0x6F, 0x75, 0x6F, 0x43, 0x6A, 0x6B, 0x78, 0x4B, 0x4C, 0x52, 0x39, 0x59, 0x6A, 0x59, 0x73, 0x54, 0x65, 0x77, 0x66, + 0x4D, 0x37, 0x5A, 0x2B, 0x64, 0x32, 0x31, 0x2B, 0x55, 0x50, 0x43, 0x66, 0x44, 0x74, 0x63, 0x52, 0x0A, 0x6A, 0x38, 0x38, 0x59, 0x78, 0x65, 0x4D, 0x6E, 0x2F, 0x69, 0x62, 0x76, 0x42, 0x5A, 0x33, 0x50, 0x7A, 0x7A, 0x66, 0x46, 0x30, 0x48, 0x76, + 0x61, 0x4F, 0x37, 0x41, 0x57, 0x68, 0x41, 0x77, 0x36, 0x6B, 0x39, 0x61, 0x2B, 0x46, 0x39, 0x73, 0x50, 0x50, 0x67, 0x34, 0x5A, 0x65, 0x41, 0x6E, 0x48, 0x71, 0x51, 0x4A, 0x79, 0x49, 0x6B, 0x76, 0x33, 0x4E, 0x33, 0x61, 0x36, 0x64, 0x63, 0x53, + 0x46, 0x41, 0x31, 0x70, 0x6A, 0x31, 0x62, 0x46, 0x31, 0x42, 0x63, 0x4B, 0x35, 0x0A, 0x76, 0x5A, 0x53, 0x74, 0x6A, 0x42, 0x57, 0x5A, 0x70, 0x35, 0x4E, 0x39, 0x39, 0x73, 0x58, 0x7A, 0x71, 0x6E, 0x54, 0x50, 0x42, 0x49, 0x57, 0x55, 0x6D, 0x41, + 0x44, 0x30, 0x34, 0x76, 0x6E, 0x4B, 0x4A, 0x47, 0x57, 0x2F, 0x34, 0x47, 0x4B, 0x76, 0x79, 0x4D, 0x58, 0x36, 0x73, 0x73, 0x6D, 0x65, 0x56, 0x6B, 0x6A, 0x61, 0x65, 0x66, 0x32, 0x57, 0x64, 0x68, 0x57, 0x2B, 0x6F, 0x34, 0x35, 0x57, 0x78, 0x4C, + 0x4D, 0x30, 0x2F, 0x4C, 0x35, 0x48, 0x39, 0x4D, 0x47, 0x30, 0x0A, 0x71, 0x50, 0x7A, 0x56, 0x4D, 0x49, 0x68, 0x6F, 0x37, 0x73, 0x75, 0x75, 0x79, 0x57, 0x50, 0x45, 0x64, 0x72, 0x36, 0x73, 0x4F, 0x42, 0x6A, 0x68, 0x58, 0x6C, 0x7A, 0x50, 0x72, + 0x6A, 0x6F, 0x69, 0x55, 0x65, 0x76, 0x52, 0x69, 0x37, 0x50, 0x7A, 0x4B, 0x7A, 0x4D, 0x48, 0x56, 0x49, 0x66, 0x36, 0x74, 0x4C, 0x49, 0x54, 0x65, 0x37, 0x70, 0x54, 0x42, 0x47, 0x49, 0x42, 0x6E, 0x66, 0x48, 0x41, 0x54, 0x2B, 0x37, 0x68, 0x4F, + 0x74, 0x53, 0x4C, 0x49, 0x42, 0x44, 0x36, 0x0A, 0x41, 0x6C, 0x66, 0x6D, 0x37, 0x38, 0x45, 0x4C, 0x74, 0x35, 0x42, 0x47, 0x6E, 0x42, 0x6B, 0x70, 0x6A, 0x4E, 0x78, 0x76, 0x6F, 0x45, 0x70, 0x70, 0x61, 0x5A, 0x53, 0x33, 0x4A, 0x47, 0x57, 0x67, + 0x2F, 0x36, 0x77, 0x2F, 0x7A, 0x67, 0x48, 0x37, 0x49, 0x53, 0x37, 0x39, 0x61, 0x50, 0x69, 0x62, 0x38, 0x71, 0x58, 0x50, 0x4D, 0x54, 0x68, 0x63, 0x46, 0x61, 0x72, 0x6D, 0x6C, 0x77, 0x44, 0x42, 0x33, 0x31, 0x71, 0x6C, 0x70, 0x7A, 0x6D, 0x71, + 0x36, 0x59, 0x52, 0x2F, 0x0A, 0x50, 0x46, 0x47, 0x6F, 0x4F, 0x74, 0x6D, 0x55, 0x57, 0x34, 0x79, 0x2F, 0x54, 0x77, 0x68, 0x78, 0x35, 0x64, 0x75, 0x6F, 0x58, 0x4E, 0x54, 0x53, 0x70, 0x76, 0x34, 0x41, 0x6F, 0x38, 0x59, 0x57, 0x78, 0x77, 0x2F, + 0x6F, 0x67, 0x4D, 0x34, 0x63, 0x4B, 0x47, 0x52, 0x30, 0x47, 0x51, 0x6A, 0x54, 0x51, 0x75, 0x50, 0x4F, 0x41, 0x46, 0x31, 0x2F, 0x73, 0x64, 0x77, 0x54, 0x73, 0x4F, 0x45, 0x46, 0x79, 0x39, 0x45, 0x67, 0x71, 0x6F, 0x5A, 0x30, 0x6E, 0x6A, 0x6E, + 0x6E, 0x0A, 0x6B, 0x66, 0x33, 0x2F, 0x57, 0x39, 0x62, 0x33, 0x72, 0x61, 0x59, 0x76, 0x41, 0x77, 0x74, 0x74, 0x34, 0x31, 0x64, 0x55, 0x36, 0x33, 0x5A, 0x54, 0x47, 0x49, 0x30, 0x52, 0x6D, 0x4C, 0x6F, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x41, 0x52, 0x49, 0x43, 0x41, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x56, 0x44, 0x43, 0x43, 0x41, 0x64, 0x75, 0x67, 0x41, 0x77, + 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x5A, 0x33, 0x53, 0x64, 0x6A, 0x58, 0x66, 0x59, 0x4F, 0x32, 0x72, 0x62, 0x49, 0x76, 0x54, 0x2F, 0x57, 0x65, 0x4B, 0x2F, 0x7A, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, + 0x51, 0x44, 0x41, 0x7A, 0x42, 0x73, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x48, 0x0A, 0x55, 0x6A, 0x45, 0x33, 0x4D, 0x44, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x75, 0x53, + 0x47, 0x56, 0x73, 0x62, 0x47, 0x56, 0x75, 0x61, 0x57, 0x4D, 0x67, 0x51, 0x57, 0x4E, 0x68, 0x5A, 0x47, 0x56, 0x74, 0x61, 0x57, 0x4D, 0x67, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x46, 0x4A, 0x6C, 0x63, 0x32, 0x56, 0x68, 0x63, 0x6D, 0x4E, 0x6F, 0x49, + 0x45, 0x6C, 0x75, 0x63, 0x33, 0x52, 0x70, 0x64, 0x48, 0x56, 0x30, 0x61, 0x57, 0x39, 0x75, 0x63, 0x79, 0x42, 0x44, 0x0A, 0x51, 0x54, 0x45, 0x6B, 0x4D, 0x43, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x62, 0x53, 0x45, 0x46, 0x53, + 0x53, 0x55, 0x4E, 0x42, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x78, + 0x4D, 0x44, 0x49, 0x78, 0x4F, 0x54, 0x45, 0x78, 0x4D, 0x44, 0x45, 0x78, 0x4D, 0x46, 0x6F, 0x58, 0x0A, 0x44, 0x54, 0x51, 0x31, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x7A, 0x45, 0x78, 0x4D, 0x44, 0x45, 0x77, 0x4F, 0x56, 0x6F, 0x77, 0x62, 0x44, 0x45, + 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x31, 0x49, 0x78, 0x4E, 0x7A, 0x41, 0x31, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x4C, 0x6B, 0x68, 0x6C, 0x62, 0x47, 0x78, 0x6C, 0x62, 0x6D, 0x6C, + 0x6A, 0x49, 0x45, 0x46, 0x6A, 0x59, 0x57, 0x52, 0x6C, 0x62, 0x57, 0x6C, 0x6A, 0x0A, 0x49, 0x47, 0x46, 0x75, 0x5A, 0x43, 0x42, 0x53, 0x5A, 0x58, 0x4E, 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, 0x4A, 0x62, 0x6E, 0x4E, 0x30, 0x61, 0x58, + 0x52, 0x31, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6E, 0x4D, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4A, 0x44, 0x41, 0x69, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x47, 0x30, 0x68, 0x42, 0x55, 0x6B, 0x6C, 0x44, 0x51, 0x53, 0x42, 0x55, 0x54, 0x46, + 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, + 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x44, 0x67, 0x49, 0x2F, 0x72, 0x47, 0x67, 0x6C, 0x74, 0x4A, 0x36, 0x72, 0x4B, 0x39, 0x4A, 0x4F, 0x74, 0x44, 0x41, 0x34, 0x4D, 0x4D, 0x37, 0x4B, + 0x4B, 0x72, 0x78, 0x63, 0x6D, 0x31, 0x6C, 0x0A, 0x41, 0x45, 0x65, 0x49, 0x68, 0x50, 0x79, 0x61, 0x4A, 0x6D, 0x75, 0x71, 0x53, 0x37, 0x70, 0x73, 0x42, 0x41, 0x71, 0x49, 0x58, 0x68, 0x66, 0x79, 0x56, 0x59, 0x66, 0x38, 0x4D, 0x4C, 0x41, 0x30, + 0x34, 0x6A, 0x52, 0x59, 0x56, 0x78, 0x71, 0x45, 0x55, 0x2B, 0x6B, 0x77, 0x32, 0x61, 0x6E, 0x79, 0x6C, 0x6E, 0x54, 0x44, 0x55, 0x52, 0x39, 0x59, 0x53, 0x54, 0x48, 0x4D, 0x6D, 0x45, 0x35, 0x67, 0x45, 0x59, 0x64, 0x31, 0x30, 0x33, 0x4B, 0x55, + 0x6B, 0x45, 0x2B, 0x62, 0x0A, 0x45, 0x43, 0x55, 0x71, 0x71, 0x48, 0x67, 0x74, 0x76, 0x70, 0x42, 0x42, 0x57, 0x4A, 0x41, 0x56, 0x63, 0x71, 0x65, 0x68, 0x74, 0x36, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, + 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x79, 0x52, 0x74, 0x54, 0x67, 0x52, 0x4C, 0x2B, 0x42, 0x4E, 0x55, + 0x57, 0x0A, 0x30, 0x61, 0x71, 0x38, 0x6D, 0x6D, 0x2B, 0x33, 0x6F, 0x4A, 0x55, 0x5A, 0x62, 0x73, 0x6F, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, + 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x63, 0x41, 0x4D, 0x47, 0x51, 0x43, 0x4D, 0x42, 0x48, 0x65, 0x72, 0x76, 0x6A, 0x63, 0x54, 0x6F, 0x69, 0x77, 0x71, 0x66, 0x41, 0x69, 0x0A, 0x72, + 0x63, 0x4A, 0x52, 0x51, 0x4F, 0x39, 0x67, 0x63, 0x53, 0x33, 0x75, 0x6A, 0x77, 0x4C, 0x45, 0x58, 0x51, 0x4E, 0x77, 0x53, 0x61, 0x53, 0x53, 0x36, 0x73, 0x55, 0x55, 0x69, 0x48, 0x43, 0x6D, 0x30, 0x77, 0x32, 0x77, 0x71, 0x73, 0x6F, 0x73, 0x51, + 0x4A, 0x7A, 0x37, 0x36, 0x59, 0x4A, 0x75, 0x6D, 0x67, 0x49, 0x77, 0x4B, 0x30, 0x65, 0x61, 0x42, 0x38, 0x62, 0x52, 0x77, 0x6F, 0x46, 0x38, 0x79, 0x67, 0x75, 0x57, 0x47, 0x45, 0x45, 0x62, 0x6F, 0x2F, 0x51, 0x77, 0x0A, 0x43, 0x5A, 0x36, 0x31, + 0x49, 0x79, 0x67, 0x4E, 0x6E, 0x78, 0x53, 0x32, 0x50, 0x46, 0x4F, 0x69, 0x54, 0x41, 0x5A, 0x70, 0x66, 0x66, 0x70, 0x73, 0x6B, 0x63, 0x59, 0x71, 0x53, 0x55, 0x58, 0x6D, 0x37, 0x4C, 0x63, 0x54, 0x34, 0x54, 0x70, 0x73, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x75, 0x74, 0x6F, 0x72, 0x69, 0x64, 0x61, 0x64, 0x20, 0x64, 0x65, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x63, 0x69, 0x6F, 0x6E, 0x20, 0x46, 0x69, 0x72, 0x6D, 0x61, 0x70, 0x72, 0x6F, 0x66, 0x65, 0x73, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x43, 0x49, 0x46, 0x20, 0x41, 0x36, 0x32, 0x36, 0x33, 0x34, 0x30, 0x36, + 0x38, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x47, 0x46, 0x44, 0x43, 0x43, 0x41, 0x2F, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x49, 0x47, 0x33, 0x44, 0x70, 0x30, 0x76, 0x2B, 0x75, 0x62, 0x48, 0x45, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x56, 0x4D, 0x78, + 0x51, 0x6A, 0x42, 0x41, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4F, 0x55, 0x46, 0x31, 0x64, 0x47, 0x39, 0x79, 0x61, 0x57, 0x52, 0x68, 0x5A, 0x43, 0x42, 0x6B, 0x5A, 0x53, 0x42, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x61, 0x57, 0x5A, + 0x70, 0x59, 0x32, 0x46, 0x6A, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x5A, 0x70, 0x63, 0x6D, 0x31, 0x68, 0x63, 0x48, 0x4A, 0x76, 0x5A, 0x6D, 0x56, 0x7A, 0x61, 0x57, 0x39, 0x75, 0x59, 0x57, 0x77, 0x67, 0x51, 0x30, 0x6C, 0x47, 0x49, 0x45, 0x45, + 0x32, 0x0A, 0x4D, 0x6A, 0x59, 0x7A, 0x4E, 0x44, 0x41, 0x32, 0x4F, 0x44, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4E, 0x44, 0x41, 0x35, 0x4D, 0x6A, 0x4D, 0x78, 0x4E, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x64, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4E, 0x6A, + 0x41, 0x31, 0x4D, 0x44, 0x55, 0x78, 0x4E, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x64, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x56, 0x54, 0x4D, 0x55, 0x49, 0x77, 0x0A, 0x51, + 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x44, 0x6C, 0x42, 0x64, 0x58, 0x52, 0x76, 0x63, 0x6D, 0x6C, 0x6B, 0x59, 0x57, 0x51, 0x67, 0x5A, 0x47, 0x55, 0x67, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x59, + 0x32, 0x6C, 0x76, 0x62, 0x69, 0x42, 0x47, 0x61, 0x58, 0x4A, 0x74, 0x59, 0x58, 0x42, 0x79, 0x62, 0x32, 0x5A, 0x6C, 0x63, 0x32, 0x6C, 0x76, 0x62, 0x6D, 0x46, 0x73, 0x49, 0x45, 0x4E, 0x4A, 0x52, 0x69, 0x42, 0x42, 0x0A, 0x4E, 0x6A, 0x49, 0x32, + 0x4D, 0x7A, 0x51, 0x77, 0x4E, 0x6A, 0x67, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, + 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x4B, 0x6C, 0x6D, 0x75, 0x4F, 0x36, 0x76, 0x6A, 0x37, 0x38, 0x61, 0x49, 0x31, 0x34, 0x48, 0x39, 0x4D, 0x32, 0x75, 0x44, 0x44, 0x0A, 0x55, 0x74, 0x64, 0x39, 0x74, 0x68, 0x44, + 0x49, 0x41, 0x6C, 0x36, 0x7A, 0x51, 0x79, 0x72, 0x45, 0x54, 0x32, 0x71, 0x79, 0x79, 0x68, 0x78, 0x64, 0x4B, 0x4A, 0x70, 0x34, 0x45, 0x52, 0x70, 0x70, 0x57, 0x56, 0x65, 0x76, 0x74, 0x53, 0x42, 0x43, 0x35, 0x49, 0x73, 0x50, 0x35, 0x74, 0x39, + 0x62, 0x70, 0x67, 0x4F, 0x53, 0x4C, 0x2F, 0x55, 0x52, 0x35, 0x47, 0x4C, 0x58, 0x4D, 0x6E, 0x45, 0x34, 0x32, 0x51, 0x51, 0x4D, 0x63, 0x61, 0x73, 0x39, 0x55, 0x58, 0x34, 0x50, 0x0A, 0x42, 0x39, 0x39, 0x6A, 0x42, 0x56, 0x7A, 0x70, 0x76, 0x35, + 0x52, 0x76, 0x77, 0x53, 0x6D, 0x43, 0x77, 0x4C, 0x54, 0x61, 0x55, 0x62, 0x44, 0x42, 0x50, 0x4C, 0x75, 0x74, 0x4E, 0x30, 0x70, 0x63, 0x79, 0x76, 0x46, 0x4C, 0x4E, 0x67, 0x34, 0x6B, 0x71, 0x37, 0x2F, 0x44, 0x68, 0x48, 0x66, 0x39, 0x71, 0x46, + 0x44, 0x30, 0x73, 0x65, 0x66, 0x47, 0x4C, 0x39, 0x49, 0x74, 0x57, 0x59, 0x31, 0x36, 0x43, 0x6B, 0x36, 0x57, 0x61, 0x56, 0x49, 0x43, 0x71, 0x6A, 0x61, 0x59, 0x0A, 0x37, 0x50, 0x7A, 0x36, 0x46, 0x49, 0x4D, 0x4D, 0x4E, 0x78, 0x2F, 0x4A, 0x6B, + 0x6A, 0x64, 0x2F, 0x31, 0x34, 0x45, 0x74, 0x35, 0x63, 0x53, 0x35, 0x34, 0x44, 0x34, 0x30, 0x2F, 0x6D, 0x66, 0x30, 0x50, 0x6D, 0x62, 0x52, 0x30, 0x2F, 0x52, 0x41, 0x7A, 0x31, 0x35, 0x69, 0x4E, 0x41, 0x39, 0x77, 0x42, 0x6A, 0x34, 0x67, 0x47, + 0x46, 0x72, 0x4F, 0x39, 0x33, 0x49, 0x62, 0x4A, 0x57, 0x79, 0x54, 0x64, 0x42, 0x53, 0x54, 0x6F, 0x33, 0x4F, 0x78, 0x44, 0x71, 0x71, 0x48, 0x0A, 0x45, 0x43, 0x4E, 0x5A, 0x58, 0x79, 0x41, 0x46, 0x47, 0x55, 0x66, 0x74, 0x61, 0x49, 0x36, 0x53, + 0x45, 0x73, 0x70, 0x64, 0x2F, 0x4E, 0x59, 0x72, 0x73, 0x70, 0x49, 0x38, 0x49, 0x4D, 0x2F, 0x68, 0x58, 0x36, 0x38, 0x67, 0x76, 0x71, 0x42, 0x32, 0x66, 0x33, 0x62, 0x6C, 0x37, 0x42, 0x71, 0x47, 0x59, 0x54, 0x4D, 0x2B, 0x35, 0x33, 0x75, 0x30, + 0x50, 0x36, 0x41, 0x50, 0x6A, 0x71, 0x4B, 0x35, 0x61, 0x6D, 0x2B, 0x35, 0x68, 0x79, 0x5A, 0x76, 0x51, 0x57, 0x79, 0x49, 0x0A, 0x70, 0x6C, 0x44, 0x39, 0x61, 0x6D, 0x4D, 0x4C, 0x39, 0x5A, 0x4D, 0x57, 0x47, 0x78, 0x6D, 0x50, 0x73, 0x75, 0x32, + 0x62, 0x6D, 0x38, 0x6D, 0x51, 0x39, 0x51, 0x45, 0x4D, 0x33, 0x78, 0x6B, 0x39, 0x44, 0x7A, 0x34, 0x34, 0x49, 0x38, 0x6B, 0x76, 0x6A, 0x77, 0x7A, 0x52, 0x41, 0x76, 0x34, 0x62, 0x56, 0x64, 0x5A, 0x4F, 0x30, 0x49, 0x30, 0x38, 0x72, 0x30, 0x2B, + 0x6B, 0x38, 0x2F, 0x36, 0x76, 0x4B, 0x74, 0x4D, 0x46, 0x6E, 0x58, 0x6B, 0x49, 0x6F, 0x63, 0x74, 0x58, 0x0A, 0x4D, 0x62, 0x53, 0x63, 0x79, 0x4A, 0x43, 0x79, 0x5A, 0x2F, 0x51, 0x59, 0x46, 0x70, 0x4D, 0x36, 0x2F, 0x45, 0x66, 0x59, 0x30, 0x58, + 0x69, 0x57, 0x4D, 0x52, 0x2B, 0x36, 0x4B, 0x77, 0x78, 0x66, 0x58, 0x5A, 0x6D, 0x74, 0x59, 0x34, 0x6C, 0x61, 0x4A, 0x43, 0x42, 0x32, 0x32, 0x4E, 0x2F, 0x39, 0x71, 0x30, 0x36, 0x6D, 0x49, 0x71, 0x71, 0x64, 0x58, 0x75, 0x59, 0x6E, 0x69, 0x6E, + 0x31, 0x6F, 0x4B, 0x61, 0x50, 0x6E, 0x69, 0x72, 0x6A, 0x61, 0x45, 0x62, 0x73, 0x58, 0x0A, 0x4C, 0x5A, 0x6D, 0x64, 0x45, 0x79, 0x52, 0x47, 0x39, 0x38, 0x58, 0x69, 0x32, 0x4A, 0x2B, 0x4F, 0x66, 0x38, 0x65, 0x50, 0x64, 0x47, 0x31, 0x61, 0x73, + 0x75, 0x68, 0x79, 0x39, 0x61, 0x7A, 0x75, 0x4A, 0x42, 0x43, 0x74, 0x4C, 0x78, 0x54, 0x61, 0x2F, 0x79, 0x32, 0x61, 0x52, 0x6E, 0x46, 0x48, 0x76, 0x6B, 0x4C, 0x66, 0x75, 0x77, 0x48, 0x62, 0x39, 0x48, 0x2F, 0x54, 0x4B, 0x49, 0x38, 0x78, 0x57, + 0x56, 0x76, 0x54, 0x79, 0x51, 0x4B, 0x6D, 0x74, 0x46, 0x4C, 0x4B, 0x0A, 0x62, 0x70, 0x66, 0x37, 0x51, 0x38, 0x55, 0x49, 0x4A, 0x6D, 0x2B, 0x4B, 0x39, 0x4C, 0x76, 0x39, 0x6E, 0x79, 0x69, 0x71, 0x44, 0x64, 0x56, 0x46, 0x38, 0x78, 0x4D, 0x36, + 0x48, 0x64, 0x6A, 0x41, 0x65, 0x49, 0x39, 0x42, 0x5A, 0x7A, 0x77, 0x65, 0x6C, 0x47, 0x53, 0x75, 0x65, 0x77, 0x76, 0x46, 0x36, 0x4E, 0x6B, 0x42, 0x69, 0x44, 0x6B, 0x61, 0x6C, 0x34, 0x5A, 0x6B, 0x51, 0x64, 0x55, 0x37, 0x68, 0x77, 0x78, 0x75, + 0x2B, 0x67, 0x2F, 0x47, 0x76, 0x55, 0x67, 0x55, 0x0A, 0x76, 0x7A, 0x6C, 0x4E, 0x31, 0x4A, 0x35, 0x42, 0x74, 0x6F, 0x2B, 0x57, 0x48, 0x57, 0x4F, 0x57, 0x6B, 0x39, 0x6D, 0x56, 0x42, 0x6E, 0x67, 0x78, 0x61, 0x4A, 0x34, 0x33, 0x42, 0x6A, 0x75, + 0x41, 0x69, 0x55, 0x56, 0x68, 0x4F, 0x53, 0x50, 0x48, 0x47, 0x30, 0x53, 0x6A, 0x46, 0x65, 0x55, 0x63, 0x2B, 0x4A, 0x49, 0x77, 0x75, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x34, 0x48, 0x76, 0x4D, 0x49, 0x48, 0x73, 0x4D, 0x42, 0x30, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x6C, 0x7A, 0x65, 0x75, 0x72, 0x4E, 0x52, 0x34, 0x41, 0x50, 0x6E, 0x37, 0x56, 0x64, 0x4D, 0x41, 0x63, 0x74, 0x48, 0x4E, 0x48, 0x44, 0x68, 0x70, 0x6B, 0x4C, 0x7A, + 0x41, 0x53, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x43, 0x44, 0x41, 0x47, 0x41, 0x51, 0x48, 0x2F, 0x41, 0x67, 0x45, 0x42, 0x4D, 0x49, 0x47, 0x6D, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x41, 0x45, 0x67, 0x5A, + 0x34, 0x77, 0x0A, 0x67, 0x5A, 0x73, 0x77, 0x67, 0x5A, 0x67, 0x47, 0x42, 0x46, 0x55, 0x64, 0x49, 0x41, 0x41, 0x77, 0x67, 0x59, 0x38, 0x77, 0x4C, 0x77, 0x59, 0x49, 0x4B, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x67, 0x45, 0x57, 0x49, + 0x32, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x33, 0x64, 0x33, 0x63, 0x75, 0x5A, 0x6D, 0x6C, 0x79, 0x62, 0x57, 0x46, 0x77, 0x63, 0x6D, 0x39, 0x6D, 0x5A, 0x58, 0x4E, 0x70, 0x62, 0x32, 0x35, 0x68, 0x62, 0x43, 0x35, 0x6A, 0x0A, + 0x62, 0x32, 0x30, 0x76, 0x59, 0x33, 0x42, 0x7A, 0x4D, 0x46, 0x77, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x49, 0x43, 0x4D, 0x46, 0x41, 0x65, 0x54, 0x67, 0x42, 0x51, 0x41, 0x47, 0x45, 0x41, 0x63, 0x77, 0x42, 0x6C, + 0x41, 0x47, 0x38, 0x41, 0x49, 0x41, 0x42, 0x6B, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x73, 0x41, 0x47, 0x45, 0x41, 0x49, 0x41, 0x42, 0x43, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x68, 0x41, 0x47, 0x34, 0x41, 0x0A, 0x62, 0x77, 0x42, + 0x32, 0x41, 0x47, 0x45, 0x41, 0x49, 0x41, 0x41, 0x30, 0x41, 0x44, 0x63, 0x41, 0x49, 0x41, 0x42, 0x43, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6A, 0x41, 0x47, 0x55, 0x41, 0x62, 0x41, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x59, 0x51, 0x41, + 0x67, 0x41, 0x44, 0x41, 0x41, 0x4F, 0x41, 0x41, 0x77, 0x41, 0x44, 0x45, 0x41, 0x4E, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x0A, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, + 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x48, 0x53, 0x48, 0x4B, 0x41, 0x49, 0x72, 0x64, 0x78, 0x39, 0x6D, 0x69, 0x57, 0x54, 0x74, 0x6A, 0x33, + 0x51, 0x75, 0x52, 0x68, 0x79, 0x37, 0x71, 0x50, 0x6A, 0x34, 0x43, 0x78, 0x32, 0x44, 0x74, 0x6A, 0x71, 0x6E, 0x36, 0x45, 0x57, 0x4B, 0x42, 0x37, 0x66, 0x67, 0x50, 0x69, 0x44, 0x4C, 0x0A, 0x34, 0x51, 0x6A, 0x62, 0x45, 0x77, 0x6A, 0x34, 0x4B, + 0x4B, 0x45, 0x31, 0x73, 0x6F, 0x43, 0x7A, 0x43, 0x31, 0x48, 0x41, 0x30, 0x31, 0x61, 0x61, 0x6A, 0x54, 0x4E, 0x46, 0x53, 0x61, 0x39, 0x4A, 0x38, 0x4F, 0x41, 0x39, 0x42, 0x33, 0x70, 0x46, 0x45, 0x31, 0x72, 0x2F, 0x79, 0x4A, 0x66, 0x59, 0x30, + 0x78, 0x67, 0x73, 0x66, 0x5A, 0x62, 0x34, 0x33, 0x61, 0x4A, 0x6C, 0x51, 0x33, 0x43, 0x54, 0x6B, 0x42, 0x57, 0x36, 0x6B, 0x4E, 0x2F, 0x6F, 0x47, 0x62, 0x44, 0x62, 0x0A, 0x4C, 0x49, 0x70, 0x67, 0x44, 0x37, 0x64, 0x76, 0x6C, 0x41, 0x63, 0x65, + 0x48, 0x61, 0x62, 0x4A, 0x68, 0x66, 0x61, 0x39, 0x4E, 0x50, 0x68, 0x41, 0x65, 0x47, 0x49, 0x51, 0x63, 0x44, 0x71, 0x2B, 0x66, 0x55, 0x73, 0x35, 0x67, 0x61, 0x6B, 0x51, 0x31, 0x4A, 0x5A, 0x42, 0x75, 0x2F, 0x68, 0x66, 0x48, 0x41, 0x73, 0x64, + 0x43, 0x50, 0x4B, 0x78, 0x73, 0x49, 0x6C, 0x36, 0x38, 0x76, 0x65, 0x67, 0x34, 0x4D, 0x53, 0x50, 0x69, 0x33, 0x69, 0x31, 0x4F, 0x31, 0x69, 0x6C, 0x0A, 0x49, 0x34, 0x35, 0x50, 0x56, 0x66, 0x34, 0x32, 0x4F, 0x2B, 0x41, 0x4D, 0x74, 0x38, 0x6F, + 0x71, 0x4D, 0x45, 0x45, 0x67, 0x74, 0x49, 0x44, 0x4E, 0x72, 0x76, 0x78, 0x32, 0x5A, 0x6E, 0x4F, 0x6F, 0x72, 0x6D, 0x37, 0x68, 0x66, 0x4E, 0x6F, 0x44, 0x36, 0x4A, 0x51, 0x67, 0x35, 0x69, 0x4B, 0x6A, 0x30, 0x42, 0x2B, 0x51, 0x58, 0x53, 0x42, + 0x54, 0x46, 0x43, 0x5A, 0x58, 0x32, 0x6C, 0x53, 0x58, 0x33, 0x78, 0x5A, 0x45, 0x45, 0x41, 0x45, 0x65, 0x69, 0x47, 0x61, 0x50, 0x0A, 0x63, 0x6A, 0x69, 0x54, 0x33, 0x53, 0x43, 0x33, 0x4E, 0x4C, 0x37, 0x58, 0x38, 0x65, 0x35, 0x6A, 0x6A, 0x6B, + 0x64, 0x35, 0x4B, 0x41, 0x62, 0x38, 0x38, 0x31, 0x6C, 0x46, 0x4A, 0x57, 0x41, 0x69, 0x4D, 0x78, 0x75, 0x6A, 0x58, 0x36, 0x69, 0x36, 0x4B, 0x74, 0x6F, 0x61, 0x50, 0x63, 0x31, 0x41, 0x36, 0x6F, 0x7A, 0x75, 0x42, 0x52, 0x57, 0x56, 0x31, 0x61, + 0x55, 0x73, 0x49, 0x43, 0x2B, 0x6E, 0x6D, 0x43, 0x6A, 0x75, 0x52, 0x66, 0x7A, 0x78, 0x75, 0x49, 0x67, 0x41, 0x0A, 0x4C, 0x49, 0x39, 0x43, 0x32, 0x6C, 0x48, 0x56, 0x6E, 0x4F, 0x55, 0x54, 0x61, 0x48, 0x46, 0x46, 0x51, 0x34, 0x75, 0x65, 0x43, + 0x79, 0x45, 0x38, 0x53, 0x31, 0x77, 0x46, 0x33, 0x42, 0x71, 0x66, 0x6D, 0x49, 0x37, 0x61, 0x76, 0x53, 0x4B, 0x65, 0x63, 0x73, 0x32, 0x74, 0x43, 0x73, 0x76, 0x4D, 0x6F, 0x32, 0x65, 0x62, 0x4B, 0x48, 0x54, 0x45, 0x6D, 0x39, 0x63, 0x61, 0x50, + 0x41, 0x52, 0x59, 0x70, 0x6F, 0x4B, 0x64, 0x72, 0x63, 0x64, 0x37, 0x62, 0x2F, 0x2B, 0x41, 0x0A, 0x6C, 0x75, 0x6E, 0x34, 0x6A, 0x57, 0x71, 0x39, 0x47, 0x4A, 0x41, 0x64, 0x2F, 0x30, 0x6B, 0x61, 0x6B, 0x46, 0x49, 0x33, 0x6B, 0x79, 0x38, 0x38, + 0x41, 0x6C, 0x32, 0x43, 0x64, 0x67, 0x74, 0x52, 0x35, 0x78, 0x62, 0x48, 0x56, 0x2F, 0x67, 0x34, 0x2B, 0x61, 0x66, 0x4E, 0x6D, 0x79, 0x4A, 0x55, 0x37, 0x32, 0x4F, 0x77, 0x46, 0x57, 0x31, 0x54, 0x5A, 0x51, 0x4E, 0x4B, 0x58, 0x6B, 0x71, 0x67, + 0x73, 0x71, 0x65, 0x4F, 0x53, 0x51, 0x42, 0x5A, 0x4F, 0x4E, 0x58, 0x48, 0x0A, 0x39, 0x49, 0x42, 0x6B, 0x39, 0x57, 0x36, 0x56, 0x55, 0x4C, 0x67, 0x52, 0x66, 0x68, 0x56, 0x77, 0x4F, 0x45, 0x71, 0x77, 0x66, 0x39, 0x44, 0x45, 0x4D, 0x6E, 0x44, + 0x41, 0x47, 0x66, 0x2F, 0x4A, 0x4F, 0x43, 0x30, 0x55, 0x4C, 0x47, 0x62, 0x30, 0x51, 0x6B, 0x54, 0x6D, 0x56, 0x58, 0x59, 0x62, 0x67, 0x42, 0x56, 0x58, 0x2F, 0x38, 0x43, 0x6E, 0x70, 0x36, 0x6F, 0x35, 0x71, 0x74, 0x6A, 0x54, 0x63, 0x4E, 0x41, + 0x75, 0x75, 0x75, 0x75, 0x55, 0x61, 0x76, 0x70, 0x66, 0x0A, 0x4E, 0x49, 0x62, 0x6E, 0x59, 0x72, 0x58, 0x39, 0x69, 0x76, 0x41, 0x77, 0x68, 0x5A, 0x54, 0x4A, 0x72, 0x79, 0x51, 0x43, 0x4C, 0x32, 0x2F, 0x57, 0x33, 0x57, 0x66, 0x2B, 0x34, 0x37, + 0x42, 0x56, 0x54, 0x77, 0x53, 0x59, 0x54, 0x36, 0x52, 0x42, 0x56, 0x75, 0x4B, 0x54, 0x30, 0x47, 0x72, 0x6F, 0x31, 0x76, 0x50, 0x37, 0x5A, 0x65, 0x44, 0x4F, 0x64, 0x63, 0x51, 0x78, 0x57, 0x51, 0x7A, 0x75, 0x67, 0x73, 0x67, 0x4D, 0x59, 0x44, + 0x4E, 0x4B, 0x47, 0x62, 0x71, 0x45, 0x0A, 0x5A, 0x79, 0x63, 0x50, 0x76, 0x45, 0x4A, 0x64, 0x76, 0x53, 0x52, 0x55, 0x44, 0x65, 0x77, 0x64, 0x63, 0x41, 0x5A, 0x66, 0x70, 0x4C, 0x7A, 0x36, 0x49, 0x48, 0x78, 0x56, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x76, 0x54, 0x72, 0x75, 0x73, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, + 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x44, 0x7A, 0x43, 0x43, 0x41, 0x5A, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x62, 0x6D, 0x71, 0x38, 0x57, 0x61, 0x70, 0x54, 0x76, 0x70, 0x67, 0x35, 0x5A, + 0x36, 0x4C, 0x53, 0x61, 0x36, 0x51, 0x37, 0x35, 0x6D, 0x30, 0x63, 0x31, 0x74, 0x6F, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x52, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x32, 0x6C, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x51, 0x32, 0x68, 0x70, 0x62, 0x6D, 0x45, 0x67, + 0x51, 0x32, 0x38, 0x75, 0x4C, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x47, 0x6A, 0x41, 0x59, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x58, 0x5A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, + 0x0A, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x34, 0x4D, 0x44, 0x63, 0x7A, 0x4D, 0x54, 0x41, 0x33, 0x4D, 0x6A, 0x59, 0x30, 0x4E, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x7A, 0x4D, 0x44, 0x63, + 0x7A, 0x4D, 0x54, 0x41, 0x33, 0x4D, 0x6A, 0x59, 0x30, 0x4E, 0x46, 0x6F, 0x77, 0x52, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x48, 0x44, 0x41, 0x61, 0x0A, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x32, 0x6C, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x51, 0x32, 0x68, 0x70, 0x62, 0x6D, 0x45, 0x67, 0x51, 0x32, 0x38, 0x75, 0x4C, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x47, 0x6A, 0x41, 0x59, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x58, 0x5A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x48, 0x59, 0x77, 0x0A, 0x45, 0x41, 0x59, 0x48, 0x4B, + 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x5A, 0x56, 0x42, 0x4B, 0x72, 0x6F, 0x78, 0x35, 0x6C, 0x6B, 0x71, 0x71, 0x48, 0x41, 0x6A, 0x44, 0x6F, + 0x36, 0x4C, 0x4E, 0x2F, 0x6C, 0x6C, 0x57, 0x51, 0x58, 0x66, 0x39, 0x4A, 0x70, 0x52, 0x43, 0x75, 0x78, 0x33, 0x4E, 0x43, 0x4E, 0x74, 0x7A, 0x73, 0x6C, 0x74, 0x31, 0x38, 0x38, 0x2B, 0x63, 0x0A, 0x54, 0x6F, 0x4C, 0x30, 0x76, 0x2F, 0x68, 0x68, + 0x4A, 0x6F, 0x56, 0x73, 0x31, 0x6F, 0x56, 0x62, 0x63, 0x6E, 0x44, 0x53, 0x2F, 0x64, 0x74, 0x69, 0x74, 0x4E, 0x39, 0x54, 0x69, 0x37, 0x32, 0x78, 0x52, 0x46, 0x68, 0x69, 0x51, 0x67, 0x6E, 0x48, 0x2B, 0x6E, 0x39, 0x62, 0x45, 0x4F, 0x66, 0x2B, + 0x51, 0x50, 0x33, 0x41, 0x32, 0x4D, 0x4D, 0x72, 0x4D, 0x75, 0x64, 0x77, 0x70, 0x72, 0x65, 0x6D, 0x49, 0x46, 0x55, 0x64, 0x65, 0x34, 0x42, 0x64, 0x53, 0x34, 0x39, 0x6E, 0x0A, 0x54, 0x50, 0x45, 0x51, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, + 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x6D, 0x44, 0x6E, 0x4E, 0x76, 0x74, 0x69, 0x79, 0x6A, 0x50, 0x65, 0x79, 0x71, 0x2B, 0x47, 0x74, 0x4A, 0x4B, 0x39, 0x37, 0x66, 0x4B, 0x48, 0x62, 0x48, 0x38, 0x38, + 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4F, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, + 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x77, 0x56, 0x35, 0x33, 0x64, 0x56, 0x76, 0x48, 0x48, 0x34, 0x2B, + 0x6D, 0x34, 0x53, 0x56, 0x42, 0x72, 0x6D, 0x32, 0x6E, 0x44, 0x62, 0x2B, 0x7A, 0x44, 0x66, 0x53, 0x58, 0x6B, 0x56, 0x35, 0x55, 0x54, 0x0A, 0x51, 0x4A, 0x74, 0x53, 0x30, 0x7A, 0x76, 0x7A, 0x51, 0x42, 0x6D, 0x38, 0x4A, 0x73, 0x63, 0x74, 0x42, + 0x70, 0x36, 0x31, 0x65, 0x7A, 0x61, 0x66, 0x39, 0x53, 0x58, 0x55, 0x59, 0x32, 0x73, 0x41, 0x41, 0x6A, 0x45, 0x41, 0x36, 0x64, 0x50, 0x47, 0x6E, 0x6C, 0x61, 0x61, 0x4B, 0x73, 0x79, 0x68, 0x32, 0x6A, 0x2F, 0x49, 0x5A, 0x69, 0x76, 0x54, 0x57, + 0x4A, 0x77, 0x67, 0x68, 0x66, 0x71, 0x72, 0x6B, 0x59, 0x70, 0x77, 0x63, 0x42, 0x45, 0x34, 0x59, 0x47, 0x51, 0x4C, 0x0A, 0x59, 0x67, 0x6D, 0x52, 0x57, 0x41, 0x44, 0x35, 0x54, 0x66, 0x73, 0x30, 0x61, 0x4E, 0x6F, 0x4A, 0x72, 0x53, 0x45, 0x47, + 0x47, 0x4A, 0x54, 0x4F, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x76, 0x54, 0x72, 0x75, 0x73, 0x20, 0x52, 0x6F, + 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x56, 0x6A, 0x43, 0x43, 0x41, 0x7A, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x51, 0x2B, 0x4E, 0x78, 0x45, 0x39, 0x69, 0x7A, 0x57, 0x52, 0x52, 0x64, + 0x74, 0x38, 0x36, 0x4D, 0x2F, 0x54, 0x58, 0x39, 0x62, 0x37, 0x77, 0x46, 0x6A, 0x55, 0x55, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x51, 0x7A, 0x45, 0x4C, + 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x48, 0x44, 0x41, 0x61, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x45, 0x32, 0x6C, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x51, 0x32, 0x68, + 0x70, 0x62, 0x6D, 0x45, 0x67, 0x51, 0x32, 0x38, 0x75, 0x4C, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x46, 0x6A, 0x41, 0x55, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x44, 0x58, 0x5A, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x49, 0x46, 0x4A, + 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x67, 0x77, 0x4E, 0x7A, 0x4D, 0x78, 0x4D, 0x44, 0x63, 0x79, 0x4E, 0x44, 0x41, 0x31, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x4D, 0x77, 0x4E, 0x7A, + 0x4D, 0x78, 0x4D, 0x44, 0x63, 0x79, 0x4E, 0x44, 0x41, 0x31, 0x57, 0x6A, 0x42, 0x44, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x0A, 0x41, + 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x54, 0x61, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x44, 0x61, 0x47, 0x6C, 0x75, 0x59, 0x53, 0x42, 0x44, 0x62, 0x79, 0x34, 0x73, 0x54, 0x48, 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x57, 0x4D, 0x42, 0x51, 0x47, 0x41, + 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4E, 0x64, 0x6C, 0x52, 0x79, 0x64, 0x58, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x0A, 0x4B, 0x6F, 0x5A, 0x49, + 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4C, 0x31, 0x56, 0x66, 0x47, 0x48, 0x54, 0x75, 0x42, 0x30, 0x45, + 0x59, 0x67, 0x57, 0x67, 0x72, 0x6D, 0x79, 0x33, 0x63, 0x4C, 0x52, 0x42, 0x36, 0x6B, 0x73, 0x44, 0x58, 0x68, 0x41, 0x2F, 0x6B, 0x46, 0x6F, 0x63, 0x69, 0x7A, 0x75, 0x77, 0x5A, 0x6F, 0x74, 0x73, 0x0A, 0x53, 0x4B, 0x59, 0x63, 0x49, 0x72, 0x72, + 0x56, 0x51, 0x4A, 0x4C, 0x75, 0x4D, 0x37, 0x49, 0x6A, 0x57, 0x63, 0x6D, 0x4F, 0x76, 0x46, 0x6A, 0x61, 0x69, 0x35, 0x37, 0x51, 0x47, 0x66, 0x49, 0x76, 0x57, 0x63, 0x61, 0x4D, 0x59, 0x31, 0x71, 0x36, 0x6E, 0x36, 0x4D, 0x4C, 0x73, 0x4C, 0x4F, + 0x61, 0x58, 0x4C, 0x6F, 0x52, 0x75, 0x42, 0x4C, 0x70, 0x44, 0x4C, 0x76, 0x50, 0x62, 0x6D, 0x79, 0x41, 0x68, 0x79, 0x6B, 0x55, 0x41, 0x79, 0x79, 0x4E, 0x4A, 0x4A, 0x72, 0x49, 0x0A, 0x5A, 0x49, 0x4F, 0x31, 0x61, 0x71, 0x77, 0x54, 0x4C, 0x44, + 0x50, 0x78, 0x6E, 0x39, 0x77, 0x73, 0x59, 0x54, 0x77, 0x61, 0x50, 0x33, 0x42, 0x56, 0x6D, 0x36, 0x30, 0x41, 0x55, 0x6E, 0x2F, 0x50, 0x42, 0x4C, 0x6E, 0x2B, 0x4E, 0x76, 0x71, 0x63, 0x77, 0x42, 0x61, 0x75, 0x59, 0x76, 0x36, 0x57, 0x54, 0x45, + 0x4E, 0x2B, 0x56, 0x52, 0x53, 0x2B, 0x47, 0x72, 0x50, 0x53, 0x62, 0x63, 0x4B, 0x76, 0x64, 0x6D, 0x61, 0x56, 0x61, 0x79, 0x71, 0x77, 0x6C, 0x48, 0x65, 0x46, 0x0A, 0x58, 0x67, 0x51, 0x50, 0x59, 0x68, 0x31, 0x6A, 0x64, 0x66, 0x64, 0x72, 0x35, + 0x38, 0x74, 0x62, 0x6D, 0x6E, 0x44, 0x73, 0x50, 0x6D, 0x63, 0x46, 0x38, 0x50, 0x34, 0x48, 0x43, 0x49, 0x44, 0x50, 0x4B, 0x4E, 0x73, 0x46, 0x78, 0x68, 0x51, 0x6E, 0x4C, 0x34, 0x5A, 0x39, 0x38, 0x43, 0x66, 0x65, 0x2F, 0x2B, 0x5A, 0x2B, 0x4D, + 0x30, 0x6A, 0x6E, 0x43, 0x78, 0x35, 0x59, 0x30, 0x53, 0x63, 0x72, 0x55, 0x77, 0x35, 0x58, 0x53, 0x6D, 0x58, 0x58, 0x2B, 0x36, 0x4B, 0x41, 0x0A, 0x59, 0x50, 0x78, 0x4D, 0x76, 0x44, 0x56, 0x54, 0x41, 0x57, 0x71, 0x58, 0x63, 0x6F, 0x4B, 0x76, + 0x38, 0x52, 0x31, 0x77, 0x36, 0x4A, 0x7A, 0x31, 0x37, 0x31, 0x37, 0x43, 0x62, 0x4D, 0x64, 0x48, 0x66, 0x6C, 0x71, 0x55, 0x68, 0x53, 0x5A, 0x4E, 0x4F, 0x37, 0x72, 0x72, 0x54, 0x4F, 0x69, 0x77, 0x43, 0x63, 0x4A, 0x6C, 0x77, 0x70, 0x32, 0x64, + 0x43, 0x5A, 0x74, 0x4F, 0x74, 0x5A, 0x63, 0x46, 0x72, 0x50, 0x55, 0x47, 0x6F, 0x50, 0x63, 0x32, 0x42, 0x58, 0x37, 0x30, 0x0A, 0x6B, 0x4C, 0x4A, 0x72, 0x78, 0x4C, 0x54, 0x35, 0x5A, 0x4F, 0x72, 0x70, 0x47, 0x67, 0x72, 0x49, 0x44, 0x61, 0x6A, + 0x74, 0x4A, 0x38, 0x6E, 0x55, 0x35, 0x37, 0x4F, 0x35, 0x71, 0x34, 0x49, 0x69, 0x6B, 0x43, 0x63, 0x39, 0x4B, 0x75, 0x68, 0x38, 0x6B, 0x4F, 0x2B, 0x38, 0x54, 0x2F, 0x33, 0x69, 0x43, 0x69, 0x53, 0x6E, 0x33, 0x6D, 0x55, 0x6B, 0x70, 0x46, 0x33, + 0x71, 0x77, 0x48, 0x59, 0x77, 0x30, 0x33, 0x64, 0x51, 0x2B, 0x41, 0x30, 0x45, 0x6D, 0x35, 0x51, 0x32, 0x0A, 0x41, 0x58, 0x50, 0x4B, 0x42, 0x6C, 0x69, 0x6D, 0x30, 0x7A, 0x76, 0x63, 0x2B, 0x67, 0x52, 0x47, 0x45, 0x31, 0x57, 0x4B, 0x79, 0x55, + 0x52, 0x48, 0x75, 0x46, 0x45, 0x35, 0x47, 0x69, 0x37, 0x6F, 0x4E, 0x4F, 0x4A, 0x35, 0x79, 0x31, 0x6C, 0x4B, 0x43, 0x6E, 0x2B, 0x38, 0x70, 0x75, 0x38, 0x66, 0x41, 0x32, 0x64, 0x71, 0x57, 0x53, 0x73, 0x6C, 0x59, 0x70, 0x50, 0x5A, 0x55, 0x78, + 0x6C, 0x6D, 0x50, 0x43, 0x64, 0x69, 0x4B, 0x59, 0x5A, 0x4E, 0x70, 0x47, 0x76, 0x75, 0x0A, 0x2F, 0x39, 0x52, 0x4F, 0x75, 0x74, 0x57, 0x30, 0x34, 0x6F, 0x35, 0x49, 0x57, 0x67, 0x41, 0x5A, 0x43, 0x66, 0x45, 0x46, 0x32, 0x63, 0x36, 0x52, 0x73, + 0x66, 0x66, 0x72, 0x36, 0x54, 0x6C, 0x50, 0x39, 0x6D, 0x38, 0x45, 0x51, 0x35, 0x70, 0x56, 0x39, 0x54, 0x34, 0x46, 0x46, 0x4C, 0x32, 0x2F, 0x73, 0x31, 0x6D, 0x30, 0x32, 0x49, 0x34, 0x7A, 0x68, 0x4B, 0x4F, 0x51, 0x55, 0x71, 0x71, 0x7A, 0x41, + 0x70, 0x56, 0x67, 0x2B, 0x51, 0x78, 0x4D, 0x61, 0x50, 0x6E, 0x75, 0x0A, 0x31, 0x52, 0x63, 0x4E, 0x2B, 0x48, 0x46, 0x58, 0x74, 0x53, 0x58, 0x6B, 0x4B, 0x65, 0x35, 0x6C, 0x58, 0x61, 0x2F, 0x52, 0x37, 0x6A, 0x77, 0x58, 0x43, 0x31, 0x70, 0x44, + 0x78, 0x61, 0x57, 0x47, 0x36, 0x69, 0x53, 0x65, 0x34, 0x67, 0x55, 0x48, 0x33, 0x44, 0x52, 0x43, 0x45, 0x70, 0x48, 0x57, 0x4F, 0x58, 0x53, 0x75, 0x54, 0x45, 0x47, 0x43, 0x32, 0x2F, 0x4B, 0x6D, 0x53, 0x4E, 0x47, 0x7A, 0x6D, 0x2F, 0x4D, 0x7A, + 0x71, 0x76, 0x4F, 0x6D, 0x77, 0x4D, 0x56, 0x4F, 0x0A, 0x39, 0x66, 0x53, 0x64, 0x64, 0x6D, 0x50, 0x6D, 0x41, 0x73, 0x59, 0x69, 0x53, 0x38, 0x47, 0x56, 0x50, 0x31, 0x42, 0x6B, 0x4C, 0x46, 0x54, 0x6C, 0x74, 0x76, 0x41, 0x38, 0x4B, 0x63, 0x39, + 0x58, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x55, 0x59, 0x6E, 0x42, 0x6A, 0x38, 0x58, 0x57, 0x45, 0x51, 0x31, 0x69, + 0x4F, 0x30, 0x52, 0x59, 0x67, 0x0A, 0x73, 0x63, 0x61, 0x73, 0x47, 0x72, 0x7A, 0x32, 0x69, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, + 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, + 0x4F, 0x43, 0x0A, 0x41, 0x67, 0x45, 0x41, 0x4B, 0x62, 0x71, 0x53, 0x53, 0x61, 0x65, 0x74, 0x38, 0x50, 0x46, 0x77, 0x77, 0x2B, 0x53, 0x58, 0x38, 0x4A, 0x2B, 0x70, 0x4A, 0x64, 0x56, 0x72, 0x6E, 0x6A, 0x54, 0x2B, 0x35, 0x68, 0x70, 0x6B, 0x39, + 0x6A, 0x70, 0x72, 0x55, 0x72, 0x49, 0x51, 0x65, 0x42, 0x71, 0x66, 0x54, 0x4E, 0x71, 0x4B, 0x32, 0x75, 0x77, 0x63, 0x4E, 0x31, 0x4C, 0x67, 0x51, 0x6B, 0x76, 0x37, 0x62, 0x48, 0x62, 0x4B, 0x4A, 0x41, 0x73, 0x35, 0x45, 0x68, 0x57, 0x64, 0x0A, + 0x6E, 0x78, 0x45, 0x74, 0x2F, 0x48, 0x6C, 0x6B, 0x33, 0x4F, 0x44, 0x67, 0x39, 0x64, 0x33, 0x67, 0x56, 0x38, 0x6D, 0x6C, 0x73, 0x6E, 0x5A, 0x77, 0x55, 0x4B, 0x54, 0x2B, 0x74, 0x77, 0x70, 0x77, 0x31, 0x61, 0x41, 0x30, 0x38, 0x58, 0x58, 0x58, + 0x54, 0x55, 0x6D, 0x36, 0x45, 0x64, 0x47, 0x7A, 0x32, 0x4F, 0x79, 0x43, 0x2F, 0x2B, 0x73, 0x4F, 0x78, 0x4C, 0x39, 0x6B, 0x4C, 0x58, 0x31, 0x6A, 0x62, 0x68, 0x64, 0x34, 0x37, 0x46, 0x31, 0x38, 0x69, 0x4D, 0x6A, 0x72, 0x0A, 0x6A, 0x6C, 0x64, + 0x32, 0x32, 0x56, 0x6B, 0x45, 0x2B, 0x72, 0x78, 0x53, 0x48, 0x30, 0x57, 0x73, 0x38, 0x48, 0x71, 0x41, 0x37, 0x4F, 0x78, 0x76, 0x64, 0x71, 0x36, 0x52, 0x32, 0x78, 0x43, 0x4F, 0x42, 0x4E, 0x79, 0x53, 0x33, 0x36, 0x44, 0x32, 0x35, 0x71, 0x35, + 0x4A, 0x30, 0x38, 0x46, 0x73, 0x45, 0x68, 0x76, 0x4D, 0x4B, 0x61, 0x72, 0x35, 0x43, 0x4B, 0x58, 0x69, 0x4E, 0x78, 0x54, 0x4B, 0x73, 0x62, 0x68, 0x6D, 0x37, 0x78, 0x71, 0x43, 0x35, 0x50, 0x44, 0x34, 0x0A, 0x38, 0x61, 0x63, 0x57, 0x61, 0x62, + 0x66, 0x62, 0x71, 0x57, 0x45, 0x38, 0x6E, 0x2F, 0x55, 0x78, 0x79, 0x2B, 0x51, 0x41, 0x52, 0x73, 0x49, 0x76, 0x64, 0x4C, 0x47, 0x78, 0x31, 0x34, 0x48, 0x75, 0x71, 0x43, 0x61, 0x56, 0x76, 0x49, 0x69, 0x76, 0x54, 0x44, 0x55, 0x48, 0x4B, 0x67, + 0x4C, 0x4B, 0x65, 0x42, 0x52, 0x74, 0x52, 0x79, 0x74, 0x41, 0x56, 0x75, 0x6E, 0x4C, 0x4B, 0x6D, 0x43, 0x68, 0x5A, 0x77, 0x4F, 0x67, 0x7A, 0x6F, 0x79, 0x38, 0x73, 0x48, 0x4A, 0x6E, 0x0A, 0x78, 0x44, 0x48, 0x4F, 0x32, 0x7A, 0x54, 0x6C, 0x4A, + 0x51, 0x4E, 0x67, 0x4A, 0x58, 0x74, 0x78, 0x6D, 0x4F, 0x54, 0x41, 0x47, 0x79, 0x74, 0x66, 0x64, 0x45, 0x4C, 0x53, 0x53, 0x38, 0x56, 0x5A, 0x43, 0x41, 0x65, 0x48, 0x76, 0x73, 0x58, 0x44, 0x66, 0x2B, 0x65, 0x57, 0x32, 0x65, 0x48, 0x63, 0x4B, + 0x4A, 0x66, 0x57, 0x6A, 0x77, 0x58, 0x6A, 0x39, 0x5A, 0x74, 0x4F, 0x79, 0x68, 0x31, 0x51, 0x52, 0x77, 0x56, 0x54, 0x73, 0x4D, 0x6F, 0x35, 0x35, 0x34, 0x57, 0x67, 0x0A, 0x69, 0x63, 0x45, 0x46, 0x4F, 0x77, 0x45, 0x33, 0x30, 0x7A, 0x39, 0x4A, + 0x34, 0x6E, 0x66, 0x72, 0x49, 0x38, 0x69, 0x49, 0x5A, 0x6A, 0x73, 0x39, 0x4F, 0x58, 0x59, 0x68, 0x52, 0x76, 0x48, 0x73, 0x58, 0x79, 0x4F, 0x34, 0x36, 0x36, 0x4A, 0x6D, 0x64, 0x58, 0x54, 0x42, 0x51, 0x50, 0x66, 0x59, 0x61, 0x4A, 0x71, 0x54, + 0x34, 0x69, 0x32, 0x70, 0x4C, 0x72, 0x30, 0x63, 0x6F, 0x78, 0x37, 0x49, 0x64, 0x4D, 0x61, 0x6B, 0x4C, 0x58, 0x6F, 0x67, 0x71, 0x7A, 0x75, 0x34, 0x0A, 0x73, 0x45, 0x62, 0x39, 0x62, 0x39, 0x31, 0x66, 0x55, 0x6C, 0x56, 0x31, 0x59, 0x76, 0x43, + 0x58, 0x6F, 0x48, 0x7A, 0x58, 0x4F, 0x50, 0x30, 0x6C, 0x33, 0x38, 0x32, 0x67, 0x6D, 0x78, 0x44, 0x50, 0x69, 0x37, 0x67, 0x34, 0x58, 0x6C, 0x37, 0x46, 0x74, 0x4B, 0x59, 0x43, 0x4E, 0x71, 0x45, 0x65, 0x58, 0x78, 0x7A, 0x50, 0x34, 0x70, 0x61, + 0x64, 0x4B, 0x61, 0x72, 0x39, 0x6D, 0x4B, 0x35, 0x53, 0x34, 0x66, 0x4E, 0x42, 0x55, 0x76, 0x75, 0x70, 0x4C, 0x6E, 0x4B, 0x57, 0x0A, 0x6E, 0x79, 0x66, 0x6A, 0x71, 0x6E, 0x4E, 0x39, 0x2B, 0x42, 0x6F, 0x6A, 0x5A, 0x6E, 0x73, 0x37, 0x71, 0x32, + 0x57, 0x77, 0x4D, 0x67, 0x46, 0x4C, 0x46, 0x54, 0x34, 0x39, 0x6F, 0x6B, 0x38, 0x4D, 0x4B, 0x7A, 0x57, 0x69, 0x78, 0x74, 0x6C, 0x6E, 0x45, 0x6A, 0x55, 0x77, 0x7A, 0x58, 0x59, 0x75, 0x46, 0x72, 0x4F, 0x5A, 0x6E, 0x6B, 0x31, 0x50, 0x54, 0x69, + 0x30, 0x37, 0x4E, 0x45, 0x50, 0x68, 0x6D, 0x67, 0x34, 0x4E, 0x70, 0x47, 0x61, 0x58, 0x75, 0x74, 0x49, 0x63, 0x0A, 0x53, 0x6B, 0x77, 0x73, 0x4B, 0x6F, 0x75, 0x4C, 0x67, 0x55, 0x39, 0x78, 0x47, 0x71, 0x6E, 0x64, 0x58, 0x48, 0x74, 0x37, 0x43, + 0x4D, 0x55, 0x41, 0x44, 0x54, 0x64, 0x41, 0x34, 0x33, 0x78, 0x37, 0x56, 0x46, 0x38, 0x76, 0x68, 0x56, 0x39, 0x32, 0x39, 0x76, 0x65, 0x6E, 0x73, 0x42, 0x78, 0x58, 0x56, 0x73, 0x46, 0x79, 0x36, 0x4B, 0x32, 0x69, 0x72, 0x34, 0x30, 0x7A, 0x53, + 0x62, 0x6F, 0x66, 0x69, 0x74, 0x7A, 0x6D, 0x64, 0x48, 0x78, 0x67, 0x68, 0x6D, 0x2B, 0x48, 0x0A, 0x6C, 0x33, 0x73, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, + 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x47, 0x7A, 0x43, 0x43, 0x41, 0x61, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, + 0x49, 0x51, 0x51, 0x64, 0x4B, 0x64, 0x30, 0x58, 0x4C, 0x71, 0x37, 0x71, 0x65, 0x41, 0x77, 0x53, 0x78, 0x73, 0x36, 0x53, 0x2B, 0x48, 0x55, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, + 0x42, 0x50, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x70, 0x4D, 0x43, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x67, 0x53, 0x57, 0x35, 0x30, 0x5A, + 0x58, 0x4A, 0x75, 0x5A, 0x58, 0x51, 0x67, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x55, 0x6D, 0x56, 0x7A, 0x5A, 0x57, 0x46, 0x79, 0x59, 0x32, 0x67, 0x67, 0x52, 0x33, 0x4A, 0x76, 0x64, 0x58, 0x41, 0x78, 0x46, + 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x44, 0x45, 0x6C, 0x54, 0x0A, 0x55, 0x6B, 0x63, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x59, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x44, 0x41, 0x35, + 0x4D, 0x44, 0x51, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x44, 0x41, 0x35, 0x4D, 0x54, 0x63, 0x78, 0x4E, 0x6A, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x45, 0x38, 0x78, 0x43, 0x7A, 0x41, 0x4A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x0A, 0x4D, 0x53, 0x6B, 0x77, 0x4A, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x79, 0x42, 0x4A, 0x62, 0x6E, 0x52, 0x6C, 0x63, 0x6D, 0x35, 0x6C, 0x64, 0x43, 0x42, + 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x53, 0x5A, 0x58, 0x4E, 0x6C, 0x59, 0x58, 0x4A, 0x6A, 0x61, 0x43, 0x42, 0x48, 0x63, 0x6D, 0x39, 0x31, 0x63, 0x44, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x41, 0x78, 0x4D, 0x4D, 0x53, 0x56, 0x4E, 0x53, 0x0A, 0x52, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x46, 0x67, 0x79, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, + 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x7A, 0x5A, 0x76, 0x56, 0x6E, 0x34, 0x43, 0x44, 0x43, 0x75, 0x77, 0x4A, 0x53, 0x76, 0x4D, 0x57, 0x53, 0x6A, 0x35, 0x63, 0x7A, 0x33, 0x65, 0x73, 0x33, 0x6D, + 0x63, 0x46, 0x44, 0x52, 0x30, 0x48, 0x0A, 0x74, 0x74, 0x77, 0x57, 0x2B, 0x31, 0x71, 0x4C, 0x46, 0x4E, 0x76, 0x69, 0x63, 0x57, 0x44, 0x45, 0x75, 0x6B, 0x57, 0x56, 0x45, 0x59, 0x6D, 0x4F, 0x36, 0x67, 0x62, 0x66, 0x39, 0x79, 0x6F, 0x57, 0x48, + 0x4B, 0x53, 0x35, 0x78, 0x63, 0x55, 0x79, 0x34, 0x41, 0x50, 0x67, 0x48, 0x6F, 0x49, 0x59, 0x4F, 0x49, 0x76, 0x58, 0x52, 0x64, 0x67, 0x4B, 0x61, 0x6D, 0x37, 0x6D, 0x41, 0x48, 0x66, 0x37, 0x41, 0x6C, 0x46, 0x39, 0x49, 0x74, 0x67, 0x4B, 0x62, + 0x70, 0x70, 0x62, 0x0A, 0x64, 0x39, 0x2F, 0x77, 0x2B, 0x6B, 0x48, 0x73, 0x4F, 0x64, 0x78, 0x31, 0x79, 0x6D, 0x67, 0x48, 0x44, 0x42, 0x2F, 0x71, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, + 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, + 0x0A, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x66, 0x45, 0x4B, 0x57, 0x72, 0x74, 0x35, 0x4C, 0x53, 0x44, 0x76, 0x36, 0x6B, 0x76, 0x69, 0x65, 0x6A, 0x4D, 0x39, 0x74, 0x69, 0x36, 0x6C, 0x79, 0x4E, 0x35, 0x55, 0x77, 0x43, 0x67, 0x59, + 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x77, 0x65, 0x33, 0x6C, 0x4F, 0x52, 0x6C, 0x43, 0x45, 0x77, 0x6B, 0x53, 0x48, 0x52, 0x68, 0x74, 0x46, 0x0A, 0x63, 0x50, + 0x39, 0x59, 0x6D, 0x64, 0x37, 0x30, 0x2F, 0x61, 0x54, 0x53, 0x56, 0x61, 0x59, 0x67, 0x4C, 0x58, 0x54, 0x57, 0x4E, 0x4C, 0x78, 0x42, 0x6F, 0x31, 0x42, 0x66, 0x41, 0x53, 0x64, 0x57, 0x74, 0x4C, 0x34, 0x6E, 0x64, 0x51, 0x61, 0x76, 0x45, 0x69, + 0x35, 0x31, 0x6D, 0x49, 0x33, 0x38, 0x41, 0x6A, 0x45, 0x41, 0x69, 0x2F, 0x56, 0x33, 0x62, 0x4E, 0x54, 0x49, 0x5A, 0x61, 0x72, 0x67, 0x43, 0x79, 0x7A, 0x75, 0x46, 0x4A, 0x30, 0x6E, 0x4E, 0x36, 0x54, 0x35, 0x0A, 0x55, 0x36, 0x56, 0x52, 0x35, + 0x43, 0x6D, 0x44, 0x31, 0x2F, 0x69, 0x51, 0x4D, 0x56, 0x74, 0x43, 0x6E, 0x77, 0x72, 0x31, 0x2F, 0x71, 0x34, 0x41, 0x61, 0x4F, 0x65, 0x4D, 0x53, 0x51, 0x2B, 0x32, 0x62, 0x31, 0x74, 0x62, 0x46, 0x66, 0x4C, 0x6E, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x48, 0x69, 0x50, 0x4B, 0x49, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x47, + 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x61, 0x6A, 0x43, 0x43, 0x41, 0x31, 0x4B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x4C, 0x64, 0x32, 0x73, 0x7A, 0x6D, 0x4B, 0x58, 0x6C, 0x4B, 0x46, + 0x44, 0x36, 0x4C, 0x44, 0x4E, 0x64, 0x6D, 0x70, 0x65, 0x59, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x50, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x55, 0x56, 0x7A, 0x45, 0x6A, 0x4D, 0x43, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x61, 0x51, 0x32, 0x68, 0x31, 0x62, 0x6D, 0x64, 0x6F, 0x64, 0x32, 0x45, 0x67, 0x56, 0x47, + 0x56, 0x73, 0x5A, 0x57, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x44, 0x62, 0x79, 0x34, 0x73, 0x49, 0x45, 0x78, 0x30, 0x5A, 0x43, 0x34, 0x78, 0x47, 0x7A, 0x41, 0x5A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x45, 0x6B, 0x68, 0x70, 0x55, 0x45, + 0x74, 0x4A, 0x0A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4C, 0x53, 0x42, 0x48, 0x4D, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4F, 0x54, 0x41, 0x79, 0x4D, 0x6A, 0x49, 0x77, 0x4F, 0x54, 0x51, 0x32, 0x4D, + 0x44, 0x52, 0x61, 0x46, 0x77, 0x30, 0x7A, 0x4E, 0x7A, 0x45, 0x79, 0x4D, 0x7A, 0x45, 0x78, 0x4E, 0x54, 0x55, 0x35, 0x4E, 0x54, 0x6C, 0x61, 0x4D, 0x45, 0x38, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x0A, + 0x41, 0x6C, 0x52, 0x58, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x70, 0x44, 0x61, 0x48, 0x56, 0x75, 0x5A, 0x32, 0x68, 0x33, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x78, 0x6C, 0x59, 0x32, 0x39, 0x74, + 0x49, 0x45, 0x4E, 0x76, 0x4C, 0x69, 0x77, 0x67, 0x54, 0x48, 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x62, 0x4D, 0x42, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x53, 0x53, 0x47, 0x6C, 0x51, 0x53, 0x30, 0x6B, 0x67, 0x0A, 0x55, 0x6D, 0x39, + 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x74, 0x49, 0x45, 0x63, 0x78, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, + 0x43, 0x41, 0x67, 0x38, 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x39, 0x42, 0x35, 0x2F, 0x55, 0x6E, 0x4D, 0x79, 0x44, 0x48, 0x50, 0x6B, 0x76, 0x52, 0x4E, 0x30, 0x0A, 0x6F, 0x39, 0x51, 0x77, 0x71, 0x4E, + 0x43, 0x75, 0x53, 0x39, 0x69, 0x32, 0x33, 0x33, 0x56, 0x48, 0x5A, 0x76, 0x52, 0x38, 0x35, 0x7A, 0x6B, 0x45, 0x48, 0x6D, 0x70, 0x77, 0x49, 0x4E, 0x4A, 0x61, 0x52, 0x33, 0x4A, 0x6E, 0x56, 0x66, 0x53, 0x6C, 0x36, 0x4A, 0x33, 0x56, 0x48, 0x69, + 0x47, 0x68, 0x38, 0x47, 0x65, 0x36, 0x7A, 0x43, 0x46, 0x6F, 0x76, 0x6B, 0x52, 0x54, 0x76, 0x34, 0x33, 0x35, 0x34, 0x74, 0x77, 0x76, 0x56, 0x63, 0x67, 0x33, 0x50, 0x78, 0x2B, 0x6B, 0x0A, 0x77, 0x4A, 0x79, 0x7A, 0x35, 0x48, 0x64, 0x63, 0x6F, + 0x45, 0x62, 0x2B, 0x64, 0x2F, 0x6F, 0x61, 0x6F, 0x44, 0x6A, 0x71, 0x37, 0x5A, 0x70, 0x79, 0x33, 0x69, 0x75, 0x39, 0x6C, 0x46, 0x63, 0x36, 0x75, 0x75, 0x78, 0x35, 0x35, 0x31, 0x39, 0x39, 0x51, 0x6D, 0x51, 0x35, 0x65, 0x69, 0x59, 0x32, 0x39, + 0x79, 0x54, 0x77, 0x31, 0x53, 0x2B, 0x36, 0x6C, 0x5A, 0x67, 0x52, 0x5A, 0x71, 0x32, 0x58, 0x4E, 0x64, 0x5A, 0x31, 0x41, 0x59, 0x44, 0x67, 0x72, 0x2F, 0x53, 0x45, 0x0A, 0x59, 0x59, 0x77, 0x4E, 0x48, 0x6C, 0x39, 0x38, 0x68, 0x35, 0x5A, 0x65, + 0x51, 0x61, 0x2F, 0x72, 0x68, 0x2B, 0x72, 0x34, 0x58, 0x66, 0x45, 0x75, 0x69, 0x41, 0x55, 0x2B, 0x54, 0x43, 0x4B, 0x37, 0x32, 0x68, 0x38, 0x71, 0x33, 0x56, 0x4A, 0x47, 0x5A, 0x44, 0x6E, 0x7A, 0x51, 0x73, 0x37, 0x5A, 0x6E, 0x67, 0x79, 0x7A, + 0x73, 0x48, 0x65, 0x58, 0x5A, 0x4A, 0x7A, 0x41, 0x39, 0x4B, 0x4D, 0x75, 0x48, 0x35, 0x55, 0x48, 0x73, 0x42, 0x66, 0x66, 0x4D, 0x4E, 0x73, 0x41, 0x0A, 0x47, 0x4A, 0x5A, 0x4D, 0x6F, 0x59, 0x46, 0x4C, 0x33, 0x51, 0x52, 0x74, 0x55, 0x36, 0x4D, + 0x39, 0x2F, 0x41, 0x65, 0x73, 0x31, 0x4D, 0x55, 0x33, 0x67, 0x75, 0x76, 0x6B, 0x6C, 0x51, 0x67, 0x5A, 0x4B, 0x49, 0x4C, 0x53, 0x51, 0x6A, 0x71, 0x6A, 0x32, 0x46, 0x50, 0x73, 0x65, 0x59, 0x6C, 0x67, 0x53, 0x47, 0x44, 0x49, 0x63, 0x70, 0x4A, + 0x51, 0x33, 0x41, 0x4F, 0x50, 0x67, 0x7A, 0x2B, 0x79, 0x51, 0x6C, 0x64, 0x61, 0x32, 0x32, 0x72, 0x70, 0x45, 0x5A, 0x66, 0x64, 0x0A, 0x68, 0x53, 0x69, 0x38, 0x4D, 0x45, 0x79, 0x72, 0x34, 0x38, 0x4B, 0x78, 0x52, 0x55, 0x52, 0x48, 0x48, 0x2B, + 0x43, 0x4B, 0x46, 0x67, 0x65, 0x57, 0x30, 0x69, 0x45, 0x50, 0x55, 0x38, 0x44, 0x74, 0x71, 0x58, 0x37, 0x55, 0x54, 0x75, 0x79, 0x62, 0x43, 0x65, 0x79, 0x76, 0x51, 0x71, 0x77, 0x77, 0x31, 0x72, 0x2F, 0x52, 0x45, 0x45, 0x58, 0x67, 0x70, 0x68, + 0x61, 0x79, 0x70, 0x63, 0x58, 0x54, 0x54, 0x33, 0x4F, 0x55, 0x4D, 0x33, 0x45, 0x43, 0x6F, 0x57, 0x71, 0x6A, 0x0A, 0x31, 0x6A, 0x4F, 0x58, 0x54, 0x79, 0x46, 0x6A, 0x48, 0x6C, 0x75, 0x50, 0x32, 0x63, 0x46, 0x65, 0x52, 0x58, 0x46, 0x33, 0x44, + 0x34, 0x46, 0x64, 0x58, 0x79, 0x47, 0x61, 0x72, 0x59, 0x50, 0x4D, 0x2B, 0x6C, 0x37, 0x57, 0x6A, 0x53, 0x4E, 0x66, 0x47, 0x7A, 0x31, 0x42, 0x72, 0x79, 0x42, 0x31, 0x5A, 0x6C, 0x70, 0x4B, 0x39, 0x70, 0x2F, 0x37, 0x71, 0x78, 0x6A, 0x33, 0x63, + 0x63, 0x43, 0x32, 0x48, 0x54, 0x48, 0x73, 0x4F, 0x79, 0x44, 0x72, 0x79, 0x2B, 0x4B, 0x34, 0x0A, 0x39, 0x61, 0x36, 0x53, 0x73, 0x76, 0x66, 0x68, 0x68, 0x45, 0x76, 0x79, 0x6F, 0x76, 0x4B, 0x54, 0x6D, 0x69, 0x4B, 0x65, 0x30, 0x78, 0x52, 0x76, + 0x4E, 0x6C, 0x53, 0x39, 0x48, 0x31, 0x35, 0x5A, 0x46, 0x62, 0x6C, 0x7A, 0x71, 0x4D, 0x46, 0x38, 0x62, 0x33, 0x74, 0x69, 0x36, 0x52, 0x5A, 0x73, 0x52, 0x31, 0x70, 0x6C, 0x38, 0x77, 0x34, 0x52, 0x6D, 0x30, 0x62, 0x5A, 0x2F, 0x57, 0x33, 0x63, + 0x31, 0x70, 0x7A, 0x41, 0x74, 0x48, 0x32, 0x6C, 0x73, 0x4E, 0x30, 0x2F, 0x0A, 0x56, 0x6D, 0x2B, 0x68, 0x2B, 0x66, 0x62, 0x6B, 0x45, 0x6B, 0x6A, 0x39, 0x42, 0x6E, 0x38, 0x53, 0x56, 0x37, 0x61, 0x70, 0x49, 0x30, 0x39, 0x62, 0x41, 0x38, 0x50, + 0x67, 0x63, 0x53, 0x6F, 0x6A, 0x74, 0x2F, 0x65, 0x77, 0x73, 0x54, 0x75, 0x38, 0x6D, 0x4C, 0x33, 0x57, 0x6D, 0x4B, 0x67, 0x4D, 0x61, 0x2F, 0x61, 0x4F, 0x45, 0x6D, 0x65, 0x6D, 0x38, 0x72, 0x4A, 0x59, 0x35, 0x41, 0x49, 0x4A, 0x45, 0x7A, 0x79, + 0x70, 0x75, 0x78, 0x43, 0x30, 0x30, 0x6A, 0x42, 0x46, 0x0A, 0x38, 0x65, 0x7A, 0x33, 0x41, 0x42, 0x48, 0x66, 0x5A, 0x66, 0x6A, 0x63, 0x4B, 0x30, 0x4E, 0x56, 0x76, 0x78, 0x61, 0x58, 0x78, 0x41, 0x2F, 0x56, 0x4C, 0x47, 0x47, 0x45, 0x71, 0x6E, + 0x4B, 0x47, 0x2F, 0x75, 0x59, 0x36, 0x66, 0x73, 0x49, 0x2F, 0x66, 0x65, 0x37, 0x38, 0x4C, 0x78, 0x51, 0x2B, 0x35, 0x6F, 0x58, 0x64, 0x55, 0x47, 0x2B, 0x33, 0x53, 0x65, 0x30, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, + 0x41, 0x77, 0x44, 0x77, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x38, + 0x6E, 0x63, 0x58, 0x2B, 0x6C, 0x36, 0x6F, 0x2F, 0x76, 0x59, 0x39, 0x63, 0x64, 0x56, 0x6F, 0x75, 0x73, 0x6C, 0x47, 0x44, 0x44, 0x6A, 0x59, 0x72, 0x37, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, + 0x41, 0x51, 0x44, 0x0A, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x42, 0x51, 0x55, 0x66, 0x42, 0x31, + 0x33, 0x48, 0x41, 0x45, 0x34, 0x2F, 0x2B, 0x71, 0x64, 0x64, 0x52, 0x78, 0x6F, 0x73, 0x75, 0x65, 0x6A, 0x36, 0x69, 0x70, 0x30, 0x36, 0x39, 0x31, 0x78, 0x31, 0x54, 0x50, 0x4F, 0x68, 0x77, 0x45, 0x6D, 0x53, 0x4B, 0x73, 0x78, 0x42, 0x48, 0x69, + 0x0A, 0x37, 0x7A, 0x4E, 0x4B, 0x70, 0x69, 0x4D, 0x64, 0x44, 0x67, 0x31, 0x48, 0x32, 0x44, 0x66, 0x48, 0x62, 0x36, 0x38, 0x30, 0x66, 0x30, 0x2B, 0x42, 0x61, 0x7A, 0x56, 0x50, 0x36, 0x58, 0x4B, 0x6C, 0x4D, 0x65, 0x4A, 0x34, 0x35, 0x2F, 0x64, + 0x4F, 0x6C, 0x42, 0x68, 0x62, 0x51, 0x48, 0x33, 0x50, 0x61, 0x79, 0x46, 0x55, 0x68, 0x75, 0x61, 0x56, 0x65, 0x76, 0x76, 0x47, 0x79, 0x75, 0x71, 0x63, 0x53, 0x45, 0x35, 0x58, 0x43, 0x56, 0x30, 0x76, 0x72, 0x50, 0x53, 0x6C, 0x0A, 0x74, 0x4A, + 0x63, 0x7A, 0x57, 0x4E, 0x57, 0x73, 0x65, 0x61, 0x6E, 0x4D, 0x58, 0x2F, 0x6D, 0x46, 0x2B, 0x6C, 0x4C, 0x46, 0x6A, 0x66, 0x69, 0x52, 0x46, 0x4F, 0x73, 0x36, 0x44, 0x52, 0x66, 0x51, 0x55, 0x73, 0x4A, 0x37, 0x34, 0x38, 0x4A, 0x7A, 0x6A, 0x6B, + 0x5A, 0x34, 0x42, 0x6A, 0x67, 0x73, 0x36, 0x46, 0x7A, 0x61, 0x5A, 0x73, 0x54, 0x30, 0x70, 0x50, 0x42, 0x57, 0x47, 0x54, 0x4D, 0x70, 0x57, 0x6D, 0x57, 0x53, 0x42, 0x55, 0x64, 0x47, 0x53, 0x71, 0x75, 0x45, 0x0A, 0x77, 0x78, 0x34, 0x6E, 0x6F, + 0x52, 0x38, 0x52, 0x6B, 0x70, 0x6B, 0x6E, 0x64, 0x5A, 0x4D, 0x50, 0x76, 0x44, 0x59, 0x37, 0x6C, 0x31, 0x65, 0x50, 0x4A, 0x6C, 0x73, 0x4D, 0x75, 0x35, 0x77, 0x50, 0x31, 0x47, 0x34, 0x77, 0x42, 0x39, 0x54, 0x63, 0x58, 0x7A, 0x5A, 0x6F, 0x5A, + 0x6A, 0x6D, 0x44, 0x6C, 0x69, 0x63, 0x6D, 0x69, 0x73, 0x6A, 0x45, 0x4F, 0x66, 0x36, 0x61, 0x49, 0x57, 0x2F, 0x56, 0x63, 0x6F, 0x62, 0x70, 0x66, 0x32, 0x4C, 0x6C, 0x6C, 0x30, 0x37, 0x51, 0x0A, 0x4A, 0x4E, 0x42, 0x41, 0x73, 0x4E, 0x42, 0x31, + 0x43, 0x49, 0x36, 0x39, 0x61, 0x4F, 0x34, 0x49, 0x31, 0x32, 0x35, 0x38, 0x45, 0x48, 0x42, 0x47, 0x47, 0x33, 0x7A, 0x67, 0x69, 0x4C, 0x4B, 0x65, 0x63, 0x6F, 0x61, 0x5A, 0x41, 0x65, 0x4F, 0x2F, 0x6E, 0x30, 0x6B, 0x5A, 0x74, 0x43, 0x57, 0x2B, + 0x56, 0x6D, 0x57, 0x75, 0x46, 0x32, 0x50, 0x6C, 0x48, 0x74, 0x2F, 0x6F, 0x2F, 0x30, 0x65, 0x6C, 0x76, 0x2B, 0x45, 0x6D, 0x42, 0x59, 0x54, 0x6B, 0x73, 0x4D, 0x43, 0x76, 0x0A, 0x35, 0x77, 0x69, 0x5A, 0x71, 0x41, 0x78, 0x65, 0x4A, 0x6F, 0x42, + 0x46, 0x31, 0x50, 0x68, 0x6F, 0x4C, 0x35, 0x61, 0x50, 0x72, 0x75, 0x4A, 0x4B, 0x48, 0x4A, 0x77, 0x57, 0x44, 0x42, 0x4E, 0x76, 0x4F, 0x49, 0x66, 0x32, 0x75, 0x38, 0x67, 0x30, 0x58, 0x35, 0x49, 0x44, 0x55, 0x58, 0x6C, 0x77, 0x70, 0x74, 0x2F, + 0x4C, 0x39, 0x5A, 0x6C, 0x4E, 0x65, 0x63, 0x31, 0x4F, 0x76, 0x46, 0x65, 0x66, 0x51, 0x30, 0x35, 0x72, 0x4C, 0x69, 0x73, 0x59, 0x2B, 0x47, 0x70, 0x7A, 0x0A, 0x6A, 0x4C, 0x72, 0x46, 0x4E, 0x65, 0x38, 0x35, 0x61, 0x6B, 0x45, 0x65, 0x7A, 0x33, + 0x47, 0x6F, 0x6F, 0x72, 0x4B, 0x47, 0x42, 0x31, 0x73, 0x36, 0x79, 0x65, 0x48, 0x76, 0x50, 0x32, 0x55, 0x45, 0x67, 0x45, 0x63, 0x79, 0x52, 0x48, 0x43, 0x56, 0x54, 0x6A, 0x46, 0x6E, 0x61, 0x6E, 0x52, 0x62, 0x45, 0x45, 0x56, 0x31, 0x36, 0x72, + 0x43, 0x66, 0x30, 0x4F, 0x59, 0x31, 0x2F, 0x6B, 0x36, 0x66, 0x69, 0x38, 0x77, 0x72, 0x6B, 0x6B, 0x56, 0x62, 0x62, 0x69, 0x56, 0x67, 0x0A, 0x68, 0x55, 0x62, 0x4E, 0x30, 0x61, 0x71, 0x77, 0x64, 0x6D, 0x61, 0x54, 0x64, 0x35, 0x61, 0x2B, 0x67, + 0x37, 0x34, 0x34, 0x74, 0x69, 0x52, 0x4F, 0x4A, 0x67, 0x76, 0x4D, 0x37, 0x58, 0x70, 0x57, 0x47, 0x75, 0x44, 0x70, 0x57, 0x73, 0x5A, 0x6B, 0x72, 0x55, 0x78, 0x36, 0x41, 0x45, 0x68, 0x45, 0x4C, 0x37, 0x6C, 0x41, 0x75, 0x78, 0x4D, 0x2B, 0x76, + 0x68, 0x56, 0x34, 0x6E, 0x59, 0x57, 0x42, 0x53, 0x69, 0x70, 0x58, 0x33, 0x74, 0x55, 0x5A, 0x51, 0x39, 0x72, 0x62, 0x0A, 0x79, 0x6C, 0x74, 0x48, 0x68, 0x6F, 0x4D, 0x4C, 0x50, 0x37, 0x59, 0x4E, 0x64, 0x6E, 0x68, 0x7A, 0x65, 0x53, 0x4A, 0x65, + 0x73, 0x59, 0x41, 0x66, 0x7A, 0x37, 0x37, 0x52, 0x50, 0x31, 0x59, 0x51, 0x6D, 0x43, 0x75, 0x56, 0x68, 0x36, 0x45, 0x66, 0x6E, 0x57, 0x51, 0x55, 0x59, 0x44, 0x6B, 0x73, 0x73, 0x77, 0x42, 0x56, 0x4C, 0x75, 0x54, 0x31, 0x73, 0x77, 0x35, 0x58, + 0x78, 0x4A, 0x46, 0x42, 0x41, 0x4A, 0x77, 0x2F, 0x36, 0x4B, 0x58, 0x66, 0x36, 0x76, 0x62, 0x2F, 0x0A, 0x79, 0x50, 0x43, 0x74, 0x62, 0x56, 0x4B, 0x6F, 0x46, 0x36, 0x75, 0x62, 0x59, 0x66, 0x77, 0x53, 0x55, 0x54, 0x58, 0x6B, 0x4A, 0x66, 0x32, + 0x76, 0x71, 0x6D, 0x71, 0x47, 0x4F, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x6C, 0x6F, + 0x62, 0x61, 0x6C, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2D, 0x20, 0x52, 0x34, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x4D, 0x49, 0x49, 0x42, 0x33, 0x44, 0x43, 0x43, 0x41, 0x59, 0x4F, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4E, 0x41, 0x67, 0x50, 0x6C, 0x66, 0x76, 0x55, 0x2F, 0x6B, 0x2F, 0x32, 0x6C, 0x43, 0x53, 0x47, 0x79, 0x70, 0x6A, 0x41, + 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x6A, 0x42, 0x51, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x74, 0x48, 0x62, 0x47, 0x39, 0x69, 0x0A, 0x59, 0x57, + 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x55, 0x6A, 0x51, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, + 0x6F, 0x54, 0x43, 0x6B, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x43, 0x6B, 0x64, 0x73, 0x0A, 0x62, 0x32, 0x4A, 0x68, 0x62, + 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x49, 0x78, 0x4D, 0x54, 0x45, 0x7A, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x67, 0x77, 0x4D, 0x54, 0x45, 0x35, 0x4D, + 0x44, 0x4D, 0x78, 0x4E, 0x44, 0x41, 0x33, 0x57, 0x6A, 0x42, 0x51, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x78, 0x74, 0x48, 0x62, 0x47, 0x39, 0x69, 0x0A, 0x59, 0x57, 0x78, 0x54, 0x61, 0x57, 0x64, 0x75, + 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x43, 0x30, 0x67, 0x55, 0x6A, 0x51, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x6B, 0x64, 0x73, + 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x78, 0x45, 0x7A, 0x41, 0x52, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x43, 0x6B, 0x64, 0x73, 0x0A, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x46, 0x4E, 0x70, 0x5A, 0x32, 0x34, + 0x77, 0x57, 0x54, 0x41, 0x54, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x4D, 0x42, 0x42, 0x77, 0x4E, 0x43, 0x41, 0x41, 0x53, 0x34, 0x78, 0x6E, 0x6E, + 0x54, 0x6A, 0x32, 0x77, 0x6C, 0x44, 0x70, 0x38, 0x75, 0x4F, 0x52, 0x6B, 0x63, 0x41, 0x36, 0x53, 0x75, 0x6D, 0x75, 0x55, 0x35, 0x42, 0x77, 0x6B, 0x57, 0x0A, 0x79, 0x6D, 0x4F, 0x78, 0x75, 0x59, 0x62, 0x34, 0x69, 0x6C, 0x66, 0x42, 0x56, 0x38, + 0x35, 0x43, 0x2B, 0x6E, 0x4F, 0x68, 0x39, 0x32, 0x56, 0x43, 0x2F, 0x78, 0x37, 0x42, 0x41, 0x4C, 0x4A, 0x75, 0x63, 0x77, 0x37, 0x2F, 0x78, 0x79, 0x48, 0x6C, 0x47, 0x4B, 0x53, 0x71, 0x32, 0x58, 0x45, 0x2F, 0x71, 0x4E, 0x53, 0x35, 0x7A, 0x6F, + 0x77, 0x64, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x0A, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, + 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x56, 0x4C, 0x42, 0x37, 0x72, 0x55, 0x57, 0x34, 0x34, 0x6B, 0x42, 0x2F, 0x2B, + 0x77, 0x70, 0x75, 0x2B, 0x37, 0x34, 0x7A, 0x79, 0x54, 0x79, 0x6A, 0x68, 0x4E, 0x55, 0x77, 0x43, 0x67, 0x59, 0x49, 0x0A, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x49, 0x44, 0x52, 0x77, 0x41, 0x77, 0x52, 0x41, 0x49, 0x67, + 0x49, 0x6B, 0x39, 0x30, 0x63, 0x72, 0x6C, 0x67, 0x72, 0x2F, 0x48, 0x6D, 0x6E, 0x4B, 0x41, 0x57, 0x42, 0x56, 0x42, 0x66, 0x77, 0x31, 0x34, 0x37, 0x62, 0x6D, 0x46, 0x30, 0x37, 0x37, 0x34, 0x42, 0x78, 0x4C, 0x34, 0x59, 0x53, 0x46, 0x6C, 0x68, + 0x67, 0x6A, 0x49, 0x43, 0x49, 0x43, 0x61, 0x64, 0x56, 0x47, 0x4E, 0x41, 0x33, 0x6A, 0x64, 0x67, 0x0A, 0x55, 0x4D, 0x2F, 0x49, 0x32, 0x4F, 0x32, 0x64, 0x67, 0x71, 0x34, 0x33, 0x6D, 0x4C, 0x79, 0x6A, 0x6A, 0x30, 0x78, 0x4D, 0x71, 0x54, 0x51, + 0x72, 0x62, 0x4F, 0x2F, 0x37, 0x6C, 0x5A, 0x73, 0x6D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x54, 0x53, + 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x56, 0x7A, 0x43, 0x43, 0x41, 0x7A, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4E, 0x41, 0x67, 0x50, 0x6C, 0x6B, 0x32, 0x38, 0x78, 0x73, 0x42, 0x4E, + 0x4A, 0x69, 0x47, 0x75, 0x69, 0x46, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, + 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, + 0x51, 0x67, 0x0A, 0x55, 0x6A, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, + 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, + 0x43, 0x68, 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, + 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x0A, 0x43, 0x53, 0x71, + 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x32, 0x45, 0x51, 0x4B, 0x4C, 0x48, 0x75, 0x4F, + 0x68, 0x64, 0x35, 0x73, 0x37, 0x33, 0x4C, 0x2B, 0x55, 0x50, 0x72, 0x65, 0x56, 0x70, 0x30, 0x41, 0x38, 0x6F, 0x66, 0x32, 0x43, 0x2B, 0x58, 0x30, 0x79, 0x42, 0x6F, 0x4A, 0x78, 0x39, 0x76, 0x61, 0x4D, 0x0A, 0x66, 0x2F, 0x76, 0x6F, 0x32, 0x37, + 0x78, 0x71, 0x4C, 0x70, 0x65, 0x58, 0x6F, 0x34, 0x78, 0x4C, 0x2B, 0x53, 0x76, 0x32, 0x73, 0x66, 0x6E, 0x4F, 0x68, 0x42, 0x32, 0x78, 0x2B, 0x63, 0x57, 0x58, 0x33, 0x75, 0x2B, 0x35, 0x38, 0x71, 0x50, 0x70, 0x76, 0x42, 0x4B, 0x4A, 0x58, 0x71, + 0x65, 0x71, 0x55, 0x71, 0x76, 0x34, 0x49, 0x79, 0x66, 0x4C, 0x70, 0x4C, 0x47, 0x63, 0x59, 0x39, 0x76, 0x58, 0x6D, 0x58, 0x37, 0x77, 0x43, 0x6C, 0x37, 0x72, 0x61, 0x4B, 0x62, 0x30, 0x0A, 0x78, 0x6C, 0x70, 0x48, 0x44, 0x55, 0x30, 0x51, 0x4D, + 0x2B, 0x4E, 0x4F, 0x73, 0x52, 0x4F, 0x6A, 0x79, 0x42, 0x68, 0x73, 0x53, 0x2B, 0x7A, 0x38, 0x43, 0x5A, 0x44, 0x66, 0x6E, 0x57, 0x51, 0x70, 0x4A, 0x53, 0x4D, 0x48, 0x6F, 0x62, 0x54, 0x53, 0x50, 0x53, 0x35, 0x67, 0x34, 0x4D, 0x2F, 0x53, 0x43, + 0x59, 0x65, 0x37, 0x7A, 0x55, 0x6A, 0x77, 0x54, 0x63, 0x4C, 0x43, 0x65, 0x6F, 0x69, 0x4B, 0x75, 0x37, 0x72, 0x50, 0x57, 0x52, 0x6E, 0x57, 0x72, 0x34, 0x2B, 0x77, 0x0A, 0x42, 0x37, 0x43, 0x65, 0x4D, 0x66, 0x47, 0x43, 0x77, 0x63, 0x44, 0x66, + 0x4C, 0x71, 0x5A, 0x74, 0x62, 0x42, 0x6B, 0x4F, 0x74, 0x64, 0x68, 0x2B, 0x4A, 0x68, 0x70, 0x46, 0x41, 0x7A, 0x32, 0x77, 0x65, 0x61, 0x53, 0x55, 0x4B, 0x4B, 0x30, 0x50, 0x66, 0x79, 0x62, 0x6C, 0x71, 0x41, 0x6A, 0x2B, 0x6C, 0x75, 0x67, 0x38, + 0x61, 0x4A, 0x52, 0x54, 0x37, 0x6F, 0x4D, 0x36, 0x69, 0x43, 0x73, 0x56, 0x6C, 0x67, 0x6D, 0x79, 0x34, 0x48, 0x71, 0x4D, 0x4C, 0x6E, 0x58, 0x57, 0x0A, 0x6E, 0x4F, 0x75, 0x6E, 0x56, 0x6D, 0x53, 0x50, 0x6C, 0x6B, 0x39, 0x6F, 0x72, 0x6A, 0x32, + 0x58, 0x77, 0x6F, 0x53, 0x50, 0x77, 0x4C, 0x78, 0x41, 0x77, 0x41, 0x74, 0x63, 0x76, 0x66, 0x61, 0x48, 0x73, 0x7A, 0x56, 0x73, 0x72, 0x42, 0x68, 0x51, 0x66, 0x34, 0x54, 0x67, 0x54, 0x4D, 0x32, 0x53, 0x30, 0x79, 0x44, 0x70, 0x4D, 0x37, 0x78, + 0x53, 0x6D, 0x61, 0x38, 0x79, 0x74, 0x53, 0x6D, 0x7A, 0x4A, 0x53, 0x71, 0x30, 0x53, 0x50, 0x6C, 0x79, 0x34, 0x63, 0x70, 0x6B, 0x0A, 0x39, 0x2B, 0x61, 0x43, 0x45, 0x49, 0x33, 0x6F, 0x6E, 0x63, 0x4B, 0x4B, 0x69, 0x50, 0x6F, 0x34, 0x5A, 0x6F, + 0x72, 0x38, 0x59, 0x2F, 0x6B, 0x42, 0x2B, 0x58, 0x6A, 0x39, 0x65, 0x31, 0x78, 0x33, 0x2B, 0x6E, 0x61, 0x48, 0x2B, 0x75, 0x7A, 0x66, 0x73, 0x51, 0x35, 0x35, 0x6C, 0x56, 0x65, 0x30, 0x76, 0x53, 0x62, 0x76, 0x31, 0x67, 0x48, 0x52, 0x36, 0x78, + 0x59, 0x4B, 0x75, 0x34, 0x34, 0x4C, 0x74, 0x63, 0x58, 0x46, 0x69, 0x6C, 0x57, 0x72, 0x30, 0x36, 0x7A, 0x71, 0x0A, 0x6B, 0x55, 0x73, 0x70, 0x7A, 0x42, 0x6D, 0x6B, 0x4D, 0x69, 0x56, 0x4F, 0x4B, 0x76, 0x46, 0x6C, 0x52, 0x4E, 0x41, 0x43, 0x7A, + 0x71, 0x72, 0x4F, 0x53, 0x62, 0x54, 0x71, 0x6E, 0x33, 0x79, 0x44, 0x73, 0x45, 0x42, 0x37, 0x35, 0x30, 0x4F, 0x72, 0x70, 0x32, 0x79, 0x6A, 0x6A, 0x33, 0x32, 0x4A, 0x67, 0x66, 0x70, 0x4D, 0x70, 0x66, 0x2F, 0x56, 0x6A, 0x73, 0x50, 0x4F, 0x53, + 0x2B, 0x43, 0x31, 0x32, 0x4C, 0x4F, 0x4F, 0x52, 0x63, 0x39, 0x32, 0x77, 0x4F, 0x31, 0x41, 0x0A, 0x4B, 0x2F, 0x31, 0x54, 0x44, 0x37, 0x43, 0x6E, 0x31, 0x54, 0x73, 0x4E, 0x73, 0x59, 0x71, 0x69, 0x41, 0x39, 0x34, 0x78, 0x72, 0x63, 0x78, 0x33, + 0x36, 0x6D, 0x39, 0x37, 0x50, 0x74, 0x62, 0x66, 0x6B, 0x53, 0x49, 0x53, 0x35, 0x72, 0x37, 0x36, 0x32, 0x44, 0x4C, 0x38, 0x45, 0x47, 0x4D, 0x55, 0x55, 0x58, 0x4C, 0x65, 0x58, 0x64, 0x59, 0x57, 0x6B, 0x37, 0x30, 0x70, 0x61, 0x44, 0x50, 0x76, + 0x4F, 0x6D, 0x62, 0x73, 0x42, 0x34, 0x6F, 0x6D, 0x33, 0x78, 0x50, 0x58, 0x0A, 0x56, 0x32, 0x56, 0x34, 0x4A, 0x39, 0x35, 0x65, 0x53, 0x52, 0x51, 0x41, 0x6F, 0x67, 0x42, 0x2F, 0x6D, 0x71, 0x67, 0x68, 0x74, 0x71, 0x6D, 0x78, 0x6C, 0x62, 0x43, + 0x6C, 0x75, 0x51, 0x30, 0x57, 0x45, 0x64, 0x72, 0x48, 0x62, 0x45, 0x67, 0x38, 0x51, 0x4F, 0x42, 0x2B, 0x44, 0x56, 0x72, 0x4E, 0x56, 0x6A, 0x7A, 0x52, 0x6C, 0x77, 0x57, 0x35, 0x79, 0x30, 0x76, 0x74, 0x4F, 0x55, 0x75, 0x63, 0x78, 0x44, 0x2F, + 0x53, 0x56, 0x52, 0x4E, 0x75, 0x4A, 0x4C, 0x44, 0x57, 0x0A, 0x63, 0x66, 0x72, 0x30, 0x77, 0x62, 0x72, 0x4D, 0x37, 0x52, 0x76, 0x31, 0x2F, 0x6F, 0x46, 0x42, 0x32, 0x41, 0x43, 0x59, 0x50, 0x54, 0x72, 0x49, 0x72, 0x6E, 0x71, 0x59, 0x4E, 0x78, + 0x67, 0x46, 0x6C, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, + 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x35, 0x4B, 0x38, 0x72, 0x4A, + 0x6E, 0x45, 0x61, 0x4B, 0x30, 0x67, 0x6E, 0x68, 0x53, 0x39, 0x53, 0x5A, 0x69, 0x7A, 0x76, 0x38, 0x49, 0x6B, 0x54, 0x63, 0x54, 0x34, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, + 0x51, 0x41, 0x44, 0x0A, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4A, 0x2B, 0x71, 0x51, 0x69, 0x62, 0x62, 0x43, 0x35, 0x75, 0x2B, 0x2F, 0x78, 0x36, 0x57, 0x6B, 0x69, 0x34, 0x2B, 0x6F, 0x6D, 0x56, 0x4B, 0x61, 0x70, 0x69, 0x36, 0x49, 0x73, 0x74, 0x39, + 0x77, 0x54, 0x72, 0x59, 0x67, 0x67, 0x6F, 0x47, 0x78, 0x76, 0x61, 0x6C, 0x33, 0x73, 0x42, 0x4F, 0x68, 0x32, 0x5A, 0x35, 0x6F, 0x66, 0x6D, 0x6D, 0x57, 0x4A, 0x79, 0x71, 0x2B, 0x62, 0x58, 0x6D, 0x59, 0x4F, 0x66, 0x67, 0x36, 0x4C, 0x45, 0x65, + 0x0A, 0x51, 0x6B, 0x45, 0x7A, 0x43, 0x7A, 0x63, 0x39, 0x7A, 0x6F, 0x6C, 0x77, 0x46, 0x63, 0x71, 0x31, 0x4A, 0x4B, 0x6A, 0x50, 0x61, 0x37, 0x58, 0x53, 0x51, 0x43, 0x47, 0x59, 0x7A, 0x79, 0x49, 0x30, 0x7A, 0x7A, 0x76, 0x46, 0x49, 0x6F, 0x54, + 0x67, 0x78, 0x51, 0x36, 0x4B, 0x66, 0x46, 0x32, 0x49, 0x35, 0x44, 0x55, 0x6B, 0x7A, 0x70, 0x73, 0x2B, 0x47, 0x6C, 0x51, 0x65, 0x62, 0x74, 0x75, 0x79, 0x68, 0x36, 0x66, 0x38, 0x38, 0x2F, 0x71, 0x42, 0x56, 0x52, 0x52, 0x69, 0x0A, 0x43, 0x6C, + 0x6D, 0x70, 0x49, 0x67, 0x55, 0x78, 0x50, 0x6F, 0x4C, 0x57, 0x37, 0x74, 0x74, 0x58, 0x4E, 0x4C, 0x77, 0x7A, 0x6C, 0x64, 0x4D, 0x58, 0x47, 0x2B, 0x67, 0x6E, 0x6F, 0x6F, 0x74, 0x37, 0x54, 0x69, 0x59, 0x61, 0x65, 0x6C, 0x70, 0x6B, 0x74, 0x74, + 0x47, 0x73, 0x4E, 0x2F, 0x48, 0x39, 0x6F, 0x50, 0x4D, 0x34, 0x37, 0x48, 0x4C, 0x77, 0x45, 0x58, 0x57, 0x64, 0x79, 0x7A, 0x52, 0x53, 0x6A, 0x65, 0x5A, 0x32, 0x61, 0x78, 0x66, 0x47, 0x33, 0x34, 0x61, 0x72, 0x0A, 0x4A, 0x34, 0x35, 0x4A, 0x4B, + 0x33, 0x56, 0x6D, 0x67, 0x52, 0x41, 0x68, 0x70, 0x75, 0x6F, 0x2B, 0x39, 0x4B, 0x34, 0x6C, 0x2F, 0x33, 0x77, 0x56, 0x33, 0x73, 0x36, 0x4D, 0x4A, 0x54, 0x2F, 0x4B, 0x59, 0x6E, 0x41, 0x4B, 0x39, 0x79, 0x38, 0x4A, 0x5A, 0x67, 0x66, 0x49, 0x50, + 0x78, 0x7A, 0x38, 0x38, 0x4E, 0x74, 0x46, 0x4D, 0x4E, 0x39, 0x69, 0x69, 0x4D, 0x47, 0x31, 0x44, 0x35, 0x33, 0x44, 0x6E, 0x30, 0x72, 0x65, 0x57, 0x56, 0x6C, 0x48, 0x78, 0x59, 0x63, 0x69, 0x0A, 0x4E, 0x75, 0x61, 0x43, 0x70, 0x2B, 0x30, 0x4B, + 0x75, 0x65, 0x49, 0x48, 0x6F, 0x49, 0x31, 0x37, 0x65, 0x6B, 0x6F, 0x38, 0x63, 0x64, 0x4C, 0x69, 0x41, 0x36, 0x45, 0x66, 0x4D, 0x67, 0x66, 0x64, 0x47, 0x2B, 0x52, 0x43, 0x7A, 0x67, 0x77, 0x41, 0x52, 0x57, 0x47, 0x41, 0x74, 0x51, 0x73, 0x67, + 0x57, 0x53, 0x6C, 0x34, 0x76, 0x66, 0x6C, 0x56, 0x79, 0x32, 0x50, 0x46, 0x50, 0x45, 0x7A, 0x30, 0x74, 0x76, 0x2F, 0x62, 0x61, 0x6C, 0x38, 0x78, 0x61, 0x35, 0x6D, 0x65, 0x0A, 0x4C, 0x4D, 0x46, 0x72, 0x55, 0x4B, 0x54, 0x58, 0x35, 0x68, 0x67, + 0x55, 0x76, 0x59, 0x55, 0x2F, 0x5A, 0x36, 0x74, 0x47, 0x6E, 0x36, 0x44, 0x2F, 0x51, 0x71, 0x63, 0x36, 0x66, 0x31, 0x7A, 0x4C, 0x58, 0x62, 0x42, 0x77, 0x48, 0x53, 0x73, 0x30, 0x39, 0x64, 0x52, 0x32, 0x43, 0x51, 0x7A, 0x72, 0x65, 0x45, 0x78, + 0x5A, 0x42, 0x66, 0x4D, 0x7A, 0x51, 0x73, 0x4E, 0x68, 0x46, 0x52, 0x41, 0x62, 0x64, 0x30, 0x33, 0x4F, 0x49, 0x6F, 0x7A, 0x55, 0x68, 0x66, 0x4A, 0x46, 0x0A, 0x66, 0x62, 0x64, 0x54, 0x36, 0x75, 0x39, 0x41, 0x57, 0x70, 0x51, 0x4B, 0x58, 0x43, + 0x42, 0x66, 0x54, 0x6B, 0x42, 0x64, 0x59, 0x69, 0x4A, 0x32, 0x33, 0x2F, 0x2F, 0x4F, 0x59, 0x62, 0x32, 0x4D, 0x49, 0x33, 0x6A, 0x53, 0x4E, 0x77, 0x4C, 0x67, 0x6A, 0x74, 0x37, 0x52, 0x45, 0x54, 0x65, 0x4A, 0x39, 0x72, 0x2F, 0x74, 0x53, 0x51, + 0x64, 0x69, 0x72, 0x70, 0x4C, 0x73, 0x51, 0x42, 0x71, 0x76, 0x46, 0x41, 0x6E, 0x5A, 0x30, 0x45, 0x36, 0x79, 0x6F, 0x76, 0x65, 0x2B, 0x0A, 0x37, 0x75, 0x37, 0x59, 0x2F, 0x39, 0x77, 0x61, 0x4C, 0x64, 0x36, 0x34, 0x4E, 0x6E, 0x48, 0x69, 0x2F, + 0x48, 0x6D, 0x33, 0x6C, 0x43, 0x58, 0x52, 0x53, 0x48, 0x4E, 0x62, 0x6F, 0x54, 0x58, 0x6E, 0x73, 0x35, 0x6C, 0x6E, 0x64, 0x63, 0x45, 0x5A, 0x4F, 0x69, 0x74, 0x48, 0x54, 0x74, 0x4E, 0x43, 0x6A, 0x76, 0x30, 0x78, 0x79, 0x42, 0x5A, 0x6D, 0x32, + 0x74, 0x49, 0x4D, 0x50, 0x4E, 0x75, 0x7A, 0x6A, 0x73, 0x6D, 0x68, 0x44, 0x59, 0x41, 0x50, 0x65, 0x78, 0x5A, 0x33, 0x0A, 0x46, 0x4C, 0x2F, 0x2F, 0x32, 0x77, 0x6D, 0x55, 0x73, 0x70, 0x4F, 0x38, 0x49, 0x46, 0x67, 0x56, 0x36, 0x64, 0x74, 0x78, + 0x51, 0x2F, 0x50, 0x65, 0x45, 0x4D, 0x4D, 0x41, 0x33, 0x4B, 0x67, 0x71, 0x6C, 0x62, 0x62, 0x43, 0x31, 0x6A, 0x2B, 0x51, 0x61, 0x33, 0x62, 0x62, 0x62, 0x50, 0x36, 0x4D, 0x76, 0x50, 0x4A, 0x77, 0x4E, 0x51, 0x7A, 0x63, 0x6D, 0x52, 0x6B, 0x31, + 0x33, 0x4E, 0x66, 0x49, 0x52, 0x6D, 0x50, 0x56, 0x4E, 0x6E, 0x47, 0x75, 0x56, 0x2F, 0x75, 0x33, 0x0A, 0x67, 0x6D, 0x33, 0x63, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x56, 0x7A, 0x43, 0x43, 0x41, 0x7A, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x4E, 0x41, 0x67, 0x50, 0x6C, 0x72, 0x73, 0x57, 0x4E, 0x42, 0x43, 0x55, 0x61, 0x71, 0x78, 0x45, 0x6C, 0x71, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, + 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, + 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, + 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x0A, 0x55, 0x6A, 0x49, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, + 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, + 0x7A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x43, 0x68, 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, + 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x49, 0x77, + 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x0A, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, + 0x43, 0x41, 0x51, 0x44, 0x4F, 0x33, 0x76, 0x32, 0x6D, 0x2B, 0x2B, 0x7A, 0x73, 0x46, 0x44, 0x51, 0x38, 0x42, 0x77, 0x5A, 0x61, 0x62, 0x46, 0x6E, 0x33, 0x47, 0x54, 0x58, 0x64, 0x39, 0x38, 0x47, 0x64, 0x56, 0x61, 0x72, 0x54, 0x7A, 0x54, 0x75, + 0x6B, 0x6B, 0x33, 0x4C, 0x76, 0x0A, 0x43, 0x76, 0x70, 0x74, 0x6E, 0x66, 0x62, 0x77, 0x68, 0x59, 0x42, 0x62, 0x6F, 0x55, 0x68, 0x53, 0x6E, 0x7A, 0x6E, 0x46, 0x74, 0x2B, 0x34, 0x6F, 0x72, 0x4F, 0x2F, 0x4C, 0x64, 0x6D, 0x67, 0x55, 0x75, 0x64, + 0x2B, 0x74, 0x41, 0x57, 0x79, 0x5A, 0x48, 0x38, 0x51, 0x69, 0x48, 0x5A, 0x2F, 0x2B, 0x63, 0x6E, 0x66, 0x67, 0x4C, 0x46, 0x75, 0x76, 0x35, 0x41, 0x53, 0x2F, 0x54, 0x33, 0x4B, 0x67, 0x47, 0x6A, 0x53, 0x59, 0x36, 0x44, 0x6C, 0x6F, 0x37, 0x4A, + 0x55, 0x6C, 0x0A, 0x65, 0x33, 0x61, 0x68, 0x35, 0x6D, 0x6D, 0x35, 0x68, 0x52, 0x6D, 0x39, 0x69, 0x59, 0x7A, 0x2B, 0x72, 0x65, 0x30, 0x32, 0x36, 0x6E, 0x4F, 0x38, 0x2F, 0x34, 0x50, 0x69, 0x79, 0x33, 0x33, 0x42, 0x30, 0x73, 0x35, 0x4B, 0x73, + 0x34, 0x30, 0x46, 0x6E, 0x6F, 0x74, 0x4A, 0x6B, 0x39, 0x2F, 0x42, 0x57, 0x39, 0x42, 0x75, 0x58, 0x76, 0x41, 0x75, 0x4D, 0x43, 0x36, 0x43, 0x2F, 0x50, 0x71, 0x38, 0x74, 0x42, 0x63, 0x4B, 0x53, 0x4F, 0x57, 0x49, 0x6D, 0x38, 0x57, 0x62, 0x0A, + 0x61, 0x39, 0x36, 0x77, 0x79, 0x72, 0x51, 0x44, 0x38, 0x4E, 0x72, 0x30, 0x6B, 0x4C, 0x68, 0x6C, 0x5A, 0x50, 0x64, 0x63, 0x54, 0x4B, 0x33, 0x6F, 0x66, 0x6D, 0x5A, 0x65, 0x6D, 0x64, 0x65, 0x34, 0x77, 0x6A, 0x37, 0x49, 0x30, 0x42, 0x4F, 0x64, + 0x72, 0x65, 0x37, 0x6B, 0x52, 0x58, 0x75, 0x4A, 0x56, 0x66, 0x65, 0x4B, 0x48, 0x32, 0x4A, 0x53, 0x68, 0x42, 0x4B, 0x7A, 0x77, 0x6B, 0x43, 0x58, 0x34, 0x34, 0x6F, 0x66, 0x52, 0x35, 0x47, 0x6D, 0x64, 0x46, 0x72, 0x53, 0x0A, 0x2B, 0x4C, 0x46, + 0x6A, 0x4B, 0x42, 0x43, 0x34, 0x73, 0x77, 0x6D, 0x34, 0x56, 0x6E, 0x64, 0x41, 0x6F, 0x69, 0x61, 0x59, 0x65, 0x63, 0x62, 0x2B, 0x33, 0x79, 0x58, 0x75, 0x50, 0x75, 0x57, 0x67, 0x66, 0x39, 0x52, 0x68, 0x44, 0x31, 0x46, 0x4C, 0x50, 0x44, 0x2B, + 0x4D, 0x32, 0x75, 0x46, 0x77, 0x64, 0x4E, 0x6A, 0x43, 0x61, 0x4B, 0x48, 0x35, 0x77, 0x51, 0x7A, 0x70, 0x6F, 0x65, 0x4A, 0x2F, 0x75, 0x31, 0x55, 0x38, 0x64, 0x67, 0x62, 0x75, 0x61, 0x6B, 0x37, 0x4D, 0x0A, 0x6B, 0x6F, 0x67, 0x77, 0x54, 0x5A, + 0x71, 0x39, 0x54, 0x77, 0x74, 0x49, 0x6D, 0x6F, 0x53, 0x31, 0x6D, 0x4B, 0x50, 0x56, 0x2B, 0x33, 0x50, 0x42, 0x56, 0x32, 0x48, 0x64, 0x4B, 0x46, 0x5A, 0x31, 0x45, 0x36, 0x36, 0x48, 0x6A, 0x75, 0x63, 0x4D, 0x55, 0x51, 0x6B, 0x51, 0x64, 0x59, + 0x68, 0x4D, 0x76, 0x49, 0x33, 0x35, 0x65, 0x7A, 0x7A, 0x55, 0x49, 0x6B, 0x67, 0x66, 0x4B, 0x74, 0x7A, 0x72, 0x61, 0x37, 0x74, 0x45, 0x73, 0x63, 0x73, 0x7A, 0x63, 0x54, 0x4A, 0x47, 0x0A, 0x72, 0x36, 0x31, 0x4B, 0x38, 0x59, 0x7A, 0x6F, 0x64, + 0x44, 0x71, 0x73, 0x35, 0x78, 0x6F, 0x69, 0x63, 0x34, 0x44, 0x53, 0x4D, 0x50, 0x63, 0x6C, 0x51, 0x73, 0x63, 0x69, 0x4F, 0x7A, 0x73, 0x53, 0x72, 0x5A, 0x59, 0x75, 0x78, 0x73, 0x4E, 0x32, 0x42, 0x36, 0x6F, 0x67, 0x74, 0x7A, 0x56, 0x4A, 0x56, + 0x2B, 0x6D, 0x53, 0x53, 0x65, 0x68, 0x32, 0x46, 0x6E, 0x49, 0x78, 0x5A, 0x79, 0x75, 0x57, 0x66, 0x6F, 0x71, 0x6A, 0x78, 0x35, 0x52, 0x57, 0x49, 0x72, 0x39, 0x71, 0x0A, 0x53, 0x33, 0x34, 0x42, 0x49, 0x62, 0x49, 0x6A, 0x4D, 0x74, 0x2F, 0x6B, + 0x6D, 0x6B, 0x52, 0x74, 0x57, 0x56, 0x74, 0x64, 0x39, 0x51, 0x43, 0x67, 0x48, 0x4A, 0x76, 0x47, 0x65, 0x4A, 0x65, 0x4E, 0x6B, 0x50, 0x2B, 0x62, 0x79, 0x4B, 0x71, 0x30, 0x72, 0x78, 0x46, 0x52, 0x4F, 0x56, 0x37, 0x5A, 0x2B, 0x32, 0x65, 0x74, + 0x31, 0x56, 0x73, 0x52, 0x6E, 0x54, 0x4B, 0x61, 0x47, 0x37, 0x33, 0x56, 0x75, 0x6C, 0x75, 0x6C, 0x79, 0x63, 0x73, 0x6C, 0x61, 0x56, 0x4E, 0x56, 0x0A, 0x4A, 0x31, 0x7A, 0x67, 0x79, 0x6A, 0x62, 0x4C, 0x69, 0x47, 0x48, 0x37, 0x48, 0x72, 0x66, + 0x51, 0x79, 0x2B, 0x34, 0x57, 0x2B, 0x39, 0x4F, 0x6D, 0x54, 0x4E, 0x36, 0x53, 0x70, 0x64, 0x54, 0x69, 0x33, 0x2F, 0x55, 0x47, 0x56, 0x4E, 0x34, 0x75, 0x6E, 0x55, 0x75, 0x30, 0x6B, 0x7A, 0x43, 0x71, 0x67, 0x63, 0x37, 0x64, 0x47, 0x74, 0x78, + 0x52, 0x63, 0x77, 0x31, 0x50, 0x63, 0x4F, 0x6E, 0x6C, 0x74, 0x68, 0x59, 0x68, 0x47, 0x58, 0x6D, 0x79, 0x35, 0x6F, 0x6B, 0x4C, 0x0A, 0x64, 0x57, 0x54, 0x4B, 0x31, 0x61, 0x75, 0x38, 0x43, 0x63, 0x45, 0x59, 0x6F, 0x66, 0x2F, 0x55, 0x56, 0x4B, + 0x47, 0x46, 0x50, 0x50, 0x30, 0x55, 0x4A, 0x41, 0x4F, 0x79, 0x68, 0x39, 0x4F, 0x6B, 0x74, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, + 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, + 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x75, 0x2F, 0x2F, 0x4B, 0x6A, 0x69, 0x4F, 0x66, 0x54, 0x35, 0x6E, 0x4B, 0x32, 0x2B, 0x4A, 0x6F, 0x70, 0x71, 0x55, 0x56, 0x4A, 0x78, 0x63, 0x65, 0x32, 0x51, 0x34, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, + 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x0A, 0x67, 0x67, 0x49, 0x42, 0x41, 0x42, 0x2F, 0x4B, 0x7A, 0x74, 0x33, 0x48, 0x76, 0x71, 0x47, 0x66, 0x32, 0x53, 0x64, 0x4D, 0x43, 0x39, 0x77, 0x58, + 0x6D, 0x42, 0x46, 0x71, 0x69, 0x4E, 0x34, 0x39, 0x35, 0x6E, 0x46, 0x57, 0x63, 0x72, 0x4B, 0x65, 0x47, 0x6B, 0x36, 0x63, 0x31, 0x53, 0x75, 0x59, 0x4A, 0x46, 0x32, 0x62, 0x61, 0x33, 0x75, 0x77, 0x4D, 0x34, 0x49, 0x4A, 0x76, 0x64, 0x38, 0x6C, + 0x52, 0x75, 0x71, 0x59, 0x6E, 0x72, 0x59, 0x62, 0x2F, 0x6F, 0x4D, 0x38, 0x0A, 0x30, 0x6D, 0x4A, 0x68, 0x77, 0x51, 0x54, 0x74, 0x7A, 0x75, 0x44, 0x46, 0x79, 0x63, 0x67, 0x54, 0x45, 0x31, 0x58, 0x6E, 0x71, 0x47, 0x4F, 0x74, 0x6A, 0x48, 0x73, + 0x42, 0x2F, 0x6E, 0x63, 0x77, 0x34, 0x63, 0x35, 0x6F, 0x6D, 0x77, 0x58, 0x34, 0x45, 0x75, 0x35, 0x35, 0x4D, 0x61, 0x42, 0x42, 0x52, 0x54, 0x55, 0x6F, 0x43, 0x6E, 0x47, 0x6B, 0x4A, 0x45, 0x2B, 0x4D, 0x33, 0x44, 0x79, 0x43, 0x42, 0x31, 0x39, + 0x6D, 0x33, 0x48, 0x30, 0x51, 0x2F, 0x67, 0x78, 0x68, 0x0A, 0x73, 0x77, 0x57, 0x56, 0x37, 0x75, 0x47, 0x75, 0x67, 0x51, 0x2B, 0x6F, 0x2B, 0x4D, 0x65, 0x50, 0x54, 0x61, 0x67, 0x6A, 0x41, 0x69, 0x5A, 0x72, 0x48, 0x59, 0x4E, 0x53, 0x56, 0x63, + 0x36, 0x31, 0x4C, 0x77, 0x44, 0x4B, 0x67, 0x45, 0x44, 0x67, 0x34, 0x58, 0x53, 0x73, 0x59, 0x50, 0x57, 0x48, 0x67, 0x4A, 0x32, 0x75, 0x4E, 0x6D, 0x53, 0x52, 0x58, 0x62, 0x42, 0x6F, 0x47, 0x4F, 0x71, 0x4B, 0x59, 0x63, 0x6C, 0x33, 0x71, 0x4A, + 0x66, 0x45, 0x79, 0x63, 0x65, 0x6C, 0x0A, 0x2F, 0x46, 0x56, 0x4C, 0x38, 0x2F, 0x42, 0x2F, 0x75, 0x57, 0x55, 0x39, 0x4A, 0x32, 0x6A, 0x51, 0x7A, 0x47, 0x76, 0x36, 0x55, 0x35, 0x33, 0x68, 0x6B, 0x52, 0x72, 0x4A, 0x58, 0x52, 0x71, 0x57, 0x62, + 0x54, 0x4B, 0x48, 0x37, 0x51, 0x4D, 0x67, 0x79, 0x41, 0x4C, 0x4F, 0x57, 0x72, 0x37, 0x5A, 0x36, 0x76, 0x32, 0x79, 0x54, 0x63, 0x51, 0x76, 0x47, 0x39, 0x39, 0x66, 0x65, 0x76, 0x58, 0x34, 0x69, 0x38, 0x62, 0x75, 0x4D, 0x54, 0x6F, 0x6C, 0x55, + 0x56, 0x56, 0x6E, 0x0A, 0x6A, 0x57, 0x51, 0x79, 0x65, 0x2B, 0x6D, 0x65, 0x77, 0x34, 0x4B, 0x36, 0x4B, 0x69, 0x33, 0x70, 0x48, 0x72, 0x54, 0x67, 0x53, 0x41, 0x61, 0x69, 0x2F, 0x47, 0x65, 0x76, 0x48, 0x79, 0x49, 0x43, 0x63, 0x2F, 0x73, 0x67, + 0x43, 0x71, 0x2B, 0x64, 0x56, 0x45, 0x75, 0x68, 0x7A, 0x66, 0x39, 0x67, 0x52, 0x37, 0x41, 0x2F, 0x58, 0x65, 0x38, 0x62, 0x56, 0x72, 0x32, 0x58, 0x49, 0x5A, 0x59, 0x74, 0x43, 0x74, 0x46, 0x65, 0x6E, 0x54, 0x67, 0x43, 0x52, 0x32, 0x79, 0x35, + 0x0A, 0x39, 0x50, 0x59, 0x6A, 0x4A, 0x62, 0x69, 0x67, 0x61, 0x70, 0x6F, 0x72, 0x64, 0x77, 0x6A, 0x36, 0x78, 0x4C, 0x45, 0x6F, 0x6B, 0x43, 0x5A, 0x59, 0x43, 0x44, 0x7A, 0x69, 0x66, 0x71, 0x72, 0x58, 0x50, 0x57, 0x2B, 0x36, 0x4D, 0x59, 0x67, + 0x4B, 0x42, 0x65, 0x73, 0x6E, 0x74, 0x61, 0x46, 0x4A, 0x37, 0x71, 0x42, 0x46, 0x56, 0x48, 0x76, 0x6D, 0x4A, 0x32, 0x57, 0x5A, 0x49, 0x43, 0x47, 0x6F, 0x6F, 0x37, 0x7A, 0x37, 0x47, 0x4A, 0x61, 0x37, 0x55, 0x6D, 0x38, 0x4D, 0x0A, 0x37, 0x59, + 0x4E, 0x52, 0x54, 0x4F, 0x6C, 0x5A, 0x34, 0x69, 0x42, 0x67, 0x78, 0x63, 0x4A, 0x6C, 0x6B, 0x6F, 0x4B, 0x4D, 0x38, 0x78, 0x41, 0x66, 0x44, 0x6F, 0x71, 0x58, 0x76, 0x6E, 0x65, 0x43, 0x62, 0x54, 0x2B, 0x50, 0x48, 0x56, 0x32, 0x38, 0x53, 0x53, + 0x65, 0x39, 0x7A, 0x45, 0x38, 0x50, 0x34, 0x63, 0x35, 0x32, 0x68, 0x67, 0x51, 0x6A, 0x78, 0x63, 0x43, 0x4D, 0x45, 0x6C, 0x76, 0x39, 0x32, 0x34, 0x53, 0x67, 0x4A, 0x50, 0x46, 0x49, 0x2F, 0x32, 0x52, 0x38, 0x0A, 0x30, 0x4C, 0x35, 0x63, 0x46, + 0x74, 0x48, 0x76, 0x6D, 0x61, 0x33, 0x41, 0x48, 0x2F, 0x76, 0x4C, 0x72, 0x72, 0x77, 0x34, 0x49, 0x67, 0x59, 0x6D, 0x5A, 0x4E, 0x72, 0x61, 0x6C, 0x77, 0x34, 0x2F, 0x4B, 0x42, 0x56, 0x45, 0x71, 0x45, 0x38, 0x41, 0x79, 0x76, 0x43, 0x61, 0x7A, + 0x4D, 0x39, 0x30, 0x61, 0x72, 0x51, 0x2B, 0x50, 0x4F, 0x75, 0x56, 0x37, 0x4C, 0x58, 0x54, 0x57, 0x74, 0x69, 0x42, 0x6D, 0x65, 0x6C, 0x44, 0x47, 0x44, 0x66, 0x72, 0x73, 0x37, 0x76, 0x52, 0x0A, 0x57, 0x47, 0x4A, 0x42, 0x38, 0x32, 0x62, 0x53, + 0x6A, 0x36, 0x70, 0x34, 0x6C, 0x56, 0x51, 0x67, 0x77, 0x31, 0x6F, 0x75, 0x64, 0x43, 0x76, 0x56, 0x30, 0x62, 0x34, 0x59, 0x61, 0x63, 0x43, 0x73, 0x31, 0x61, 0x54, 0x50, 0x4F, 0x62, 0x70, 0x52, 0x68, 0x41, 0x4E, 0x6C, 0x36, 0x57, 0x4C, 0x41, + 0x59, 0x76, 0x37, 0x59, 0x54, 0x56, 0x57, 0x57, 0x34, 0x74, 0x41, 0x52, 0x2B, 0x6B, 0x67, 0x30, 0x45, 0x65, 0x79, 0x65, 0x37, 0x51, 0x55, 0x64, 0x35, 0x4D, 0x6A, 0x57, 0x0A, 0x48, 0x59, 0x62, 0x4C, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x54, 0x43, + 0x43, 0x41, 0x59, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4E, 0x41, 0x67, 0x50, 0x6C, 0x75, 0x49, 0x4C, 0x72, 0x49, 0x50, 0x67, 0x6C, 0x4A, 0x32, 0x30, 0x39, 0x5A, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, + 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x69, 0x0A, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, + 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, + 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x4D, 0x77, 0x0A, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, + 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4D, 0x7A, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, + 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x0A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, + 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, + 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x4D, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x0A, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, + 0x66, 0x54, 0x7A, 0x4F, 0x48, 0x4D, 0x79, 0x6D, 0x4B, 0x6F, 0x59, 0x54, 0x65, 0x79, 0x38, 0x63, 0x68, 0x57, 0x45, 0x47, 0x4A, 0x36, 0x6C, 0x61, 0x64, 0x4B, 0x30, 0x75, 0x46, 0x78, 0x68, 0x31, 0x4D, 0x4A, 0x37, 0x78, 0x2F, 0x4A, 0x6C, 0x46, + 0x79, 0x62, 0x2B, 0x4B, 0x66, 0x31, 0x71, 0x50, 0x4B, 0x7A, 0x45, 0x55, 0x55, 0x52, 0x6F, 0x75, 0x74, 0x0A, 0x37, 0x33, 0x36, 0x47, 0x6A, 0x4F, 0x79, 0x78, 0x66, 0x69, 0x2F, 0x2F, 0x71, 0x58, 0x47, 0x64, 0x47, 0x49, 0x52, 0x46, 0x42, 0x45, + 0x46, 0x56, 0x62, 0x69, 0x76, 0x71, 0x4A, 0x6E, 0x2B, 0x37, 0x6B, 0x41, 0x48, 0x6A, 0x53, 0x78, 0x6D, 0x36, 0x35, 0x46, 0x53, 0x57, 0x52, 0x51, 0x6D, 0x78, 0x31, 0x57, 0x79, 0x52, 0x52, 0x4B, 0x32, 0x45, 0x45, 0x34, 0x36, 0x61, 0x6A, 0x41, + 0x32, 0x41, 0x44, 0x44, 0x4C, 0x32, 0x34, 0x43, 0x65, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x0A, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, + 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x42, 0x38, 0x53, 0x61, 0x36, 0x6F, + 0x43, 0x32, 0x75, 0x68, 0x59, 0x48, 0x50, 0x30, 0x2F, 0x45, 0x71, 0x0A, 0x45, 0x72, 0x32, 0x34, 0x43, 0x6D, 0x66, 0x39, 0x76, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x70, + 0x41, 0x44, 0x42, 0x6D, 0x41, 0x6A, 0x45, 0x41, 0x39, 0x75, 0x45, 0x67, 0x6C, 0x52, 0x52, 0x37, 0x56, 0x4B, 0x4F, 0x51, 0x46, 0x68, 0x47, 0x2F, 0x68, 0x4D, 0x6A, 0x71, 0x62, 0x32, 0x73, 0x58, 0x6E, 0x68, 0x35, 0x47, 0x6D, 0x43, 0x43, 0x62, + 0x6E, 0x39, 0x4D, 0x4E, 0x32, 0x61, 0x7A, 0x54, 0x0A, 0x4C, 0x38, 0x31, 0x38, 0x2B, 0x46, 0x73, 0x75, 0x56, 0x62, 0x75, 0x2F, 0x33, 0x5A, 0x4C, 0x33, 0x70, 0x41, 0x7A, 0x63, 0x4D, 0x65, 0x47, 0x69, 0x41, 0x6A, 0x45, 0x41, 0x2F, 0x4A, 0x64, + 0x6D, 0x5A, 0x75, 0x56, 0x44, 0x46, 0x68, 0x4F, 0x44, 0x33, 0x63, 0x66, 0x66, 0x4C, 0x37, 0x34, 0x55, 0x4F, 0x4F, 0x30, 0x42, 0x7A, 0x72, 0x45, 0x58, 0x47, 0x68, 0x46, 0x31, 0x36, 0x62, 0x30, 0x44, 0x6A, 0x79, 0x5A, 0x2B, 0x68, 0x4F, 0x58, + 0x4A, 0x59, 0x4B, 0x61, 0x56, 0x0A, 0x31, 0x31, 0x52, 0x5A, 0x74, 0x2B, 0x63, 0x52, 0x4C, 0x49, 0x6E, 0x55, 0x75, 0x65, 0x34, 0x58, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x34, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, + 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x54, 0x43, 0x43, 0x41, 0x59, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, + 0x49, 0x4E, 0x41, 0x67, 0x50, 0x6C, 0x77, 0x47, 0x6A, 0x76, 0x59, 0x78, 0x71, 0x63, 0x63, 0x70, 0x42, 0x51, 0x55, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x48, 0x4D, 0x51, + 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x69, 0x0A, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, + 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, + 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x51, 0x77, 0x0A, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, + 0x4D, 0x7A, 0x59, 0x77, 0x4E, 0x6A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x42, 0x48, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x69, + 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x5A, 0x0A, 0x52, 0x32, 0x39, 0x76, 0x5A, 0x32, 0x78, 0x6C, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x70, 0x59, 0x32, 0x56, + 0x7A, 0x49, 0x45, 0x78, 0x4D, 0x51, 0x7A, 0x45, 0x55, 0x4D, 0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x4C, 0x52, 0x31, 0x52, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x51, 0x77, 0x64, 0x6A, 0x41, + 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x0A, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x54, 0x7A, 0x64, 0x48, 0x4F, 0x6E, 0x61, 0x49, 0x74, 0x67, 0x72, 0x6B, + 0x4F, 0x34, 0x4E, 0x63, 0x57, 0x42, 0x4D, 0x48, 0x74, 0x4C, 0x53, 0x5A, 0x33, 0x37, 0x77, 0x57, 0x48, 0x4F, 0x35, 0x74, 0x35, 0x47, 0x76, 0x57, 0x76, 0x56, 0x59, 0x52, 0x67, 0x31, 0x72, 0x6B, 0x44, 0x64, 0x63, 0x2F, 0x65, 0x4A, 0x6B, 0x54, + 0x42, 0x61, 0x36, 0x7A, 0x7A, 0x75, 0x0A, 0x68, 0x58, 0x79, 0x69, 0x51, 0x48, 0x59, 0x37, 0x71, 0x63, 0x61, 0x34, 0x52, 0x39, 0x67, 0x71, 0x35, 0x35, 0x4B, 0x52, 0x61, 0x6E, 0x50, 0x70, 0x73, 0x58, 0x49, 0x35, 0x6E, 0x79, 0x6D, 0x66, 0x6F, + 0x70, 0x6A, 0x54, 0x58, 0x31, 0x35, 0x59, 0x68, 0x6D, 0x55, 0x50, 0x6F, 0x59, 0x52, 0x6C, 0x42, 0x74, 0x48, 0x63, 0x69, 0x38, 0x6E, 0x48, 0x63, 0x38, 0x69, 0x4D, 0x61, 0x69, 0x2F, 0x6C, 0x78, 0x4B, 0x76, 0x52, 0x48, 0x59, 0x71, 0x6A, 0x51, + 0x6A, 0x42, 0x41, 0x0A, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, + 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x53, 0x41, 0x54, 0x4E, 0x62, 0x72, 0x64, 0x50, 0x39, 0x4A, 0x4E, 0x71, 0x50, 0x56, 0x32, 0x50, 0x79, 0x31, + 0x0A, 0x50, 0x73, 0x56, 0x71, 0x38, 0x4A, 0x51, 0x64, 0x6A, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x70, 0x41, 0x44, 0x42, 0x6D, 0x41, 0x6A, 0x45, 0x41, 0x36, 0x45, 0x44, + 0x2F, 0x67, 0x39, 0x34, 0x44, 0x39, 0x4A, 0x2B, 0x75, 0x48, 0x58, 0x71, 0x6E, 0x4C, 0x72, 0x6D, 0x76, 0x54, 0x2F, 0x61, 0x44, 0x48, 0x51, 0x34, 0x74, 0x68, 0x51, 0x45, 0x64, 0x30, 0x64, 0x6C, 0x71, 0x37, 0x41, 0x2F, 0x43, 0x0A, 0x72, 0x38, + 0x64, 0x65, 0x56, 0x6C, 0x35, 0x63, 0x31, 0x52, 0x78, 0x59, 0x49, 0x69, 0x67, 0x4C, 0x39, 0x7A, 0x43, 0x32, 0x4C, 0x37, 0x46, 0x38, 0x41, 0x6A, 0x45, 0x41, 0x38, 0x47, 0x45, 0x38, 0x70, 0x2F, 0x53, 0x67, 0x67, 0x75, 0x4D, 0x68, 0x31, 0x59, + 0x51, 0x64, 0x63, 0x34, 0x61, 0x63, 0x4C, 0x61, 0x2F, 0x4B, 0x4E, 0x4A, 0x76, 0x78, 0x6E, 0x37, 0x6B, 0x6A, 0x4E, 0x75, 0x4B, 0x38, 0x59, 0x41, 0x4F, 0x64, 0x67, 0x4C, 0x4F, 0x61, 0x56, 0x73, 0x6A, 0x68, 0x0A, 0x34, 0x72, 0x73, 0x55, 0x65, + 0x63, 0x72, 0x4E, 0x49, 0x64, 0x53, 0x55, 0x74, 0x55, 0x6C, 0x44, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, + 0x65, 0x6C, 0x69, 0x61, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x76, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x64, 0x44, 0x43, 0x43, 0x41, 0x31, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x50, 0x41, 0x57, 0x64, 0x66, 0x4A, 0x39, 0x62, 0x2B, 0x65, 0x75, 0x50, 0x6B, 0x72, 0x4C, 0x34, 0x4A, 0x57, 0x77, 0x57, 0x65, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, + 0x41, 0x4D, 0x45, 0x51, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x0A, 0x41, 0x6B, 0x5A, 0x4A, 0x4D, 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x46, 0x55, 0x5A, 0x57, + 0x78, 0x70, 0x59, 0x53, 0x42, 0x47, 0x61, 0x57, 0x35, 0x73, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x45, 0x39, 0x35, 0x61, 0x6A, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x51, 0x56, 0x47, 0x56, 0x73, 0x61, 0x57, + 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x32, 0x0A, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4F, 0x44, 0x45, 0x78, 0x4D, 0x6A, 0x6B, 0x78, 0x4D, 0x54, 0x55, 0x31, 0x4E, 0x54, 0x52, 0x61, 0x46, + 0x77, 0x30, 0x30, 0x4D, 0x7A, 0x45, 0x78, 0x4D, 0x6A, 0x6B, 0x78, 0x4D, 0x54, 0x55, 0x31, 0x4E, 0x54, 0x52, 0x61, 0x4D, 0x45, 0x51, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x5A, 0x4A, 0x4D, + 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x0A, 0x44, 0x42, 0x46, 0x55, 0x5A, 0x57, 0x78, 0x70, 0x59, 0x53, 0x42, 0x47, 0x61, 0x57, 0x35, 0x73, 0x59, 0x57, 0x35, 0x6B, 0x49, 0x45, 0x39, 0x35, 0x61, 0x6A, 0x45, 0x5A, + 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x51, 0x56, 0x47, 0x56, 0x73, 0x61, 0x57, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x32, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x0A, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4C, 0x4C, + 0x51, 0x50, 0x77, 0x65, 0x38, 0x34, 0x6E, 0x76, 0x51, 0x61, 0x35, 0x6E, 0x34, 0x34, 0x6E, 0x64, 0x70, 0x35, 0x38, 0x36, 0x64, 0x70, 0x41, 0x4F, 0x38, 0x67, 0x6D, 0x32, 0x68, 0x2F, 0x6F, 0x46, 0x6C, 0x48, 0x30, 0x77, 0x6E, 0x72, 0x49, 0x34, + 0x41, 0x75, 0x68, 0x5A, 0x37, 0x0A, 0x36, 0x7A, 0x42, 0x71, 0x41, 0x4D, 0x43, 0x7A, 0x64, 0x47, 0x68, 0x2B, 0x73, 0x71, 0x2F, 0x48, 0x31, 0x57, 0x4B, 0x7A, 0x65, 0x6A, 0x39, 0x51, 0x79, 0x6F, 0x77, 0x32, 0x52, 0x43, 0x52, 0x6A, 0x30, 0x6A, + 0x62, 0x70, 0x44, 0x49, 0x58, 0x32, 0x51, 0x33, 0x62, 0x56, 0x54, 0x4B, 0x46, 0x67, 0x63, 0x6D, 0x66, 0x69, 0x4B, 0x44, 0x4F, 0x6C, 0x79, 0x7A, 0x47, 0x34, 0x4F, 0x69, 0x49, 0x6A, 0x4E, 0x4C, 0x68, 0x39, 0x76, 0x56, 0x59, 0x69, 0x51, 0x4A, + 0x33, 0x71, 0x0A, 0x39, 0x48, 0x73, 0x44, 0x72, 0x57, 0x6A, 0x38, 0x73, 0x6F, 0x46, 0x50, 0x6D, 0x4E, 0x42, 0x30, 0x36, 0x6F, 0x33, 0x6C, 0x66, 0x63, 0x31, 0x6A, 0x77, 0x36, 0x50, 0x32, 0x33, 0x70, 0x4C, 0x43, 0x57, 0x42, 0x6E, 0x67, 0x6C, + 0x72, 0x76, 0x46, 0x78, 0x4B, 0x6B, 0x39, 0x70, 0x58, 0x53, 0x57, 0x2F, 0x71, 0x2F, 0x35, 0x69, 0x61, 0x71, 0x39, 0x6C, 0x52, 0x64, 0x55, 0x32, 0x48, 0x68, 0x45, 0x38, 0x51, 0x78, 0x33, 0x46, 0x5A, 0x4C, 0x67, 0x6D, 0x45, 0x4B, 0x6E, 0x0A, + 0x70, 0x4E, 0x61, 0x71, 0x49, 0x4A, 0x4C, 0x4E, 0x77, 0x61, 0x43, 0x7A, 0x6C, 0x72, 0x49, 0x36, 0x68, 0x45, 0x4B, 0x4E, 0x66, 0x64, 0x57, 0x56, 0x35, 0x4E, 0x62, 0x62, 0x36, 0x57, 0x4C, 0x45, 0x57, 0x4C, 0x4E, 0x35, 0x78, 0x59, 0x7A, 0x54, + 0x4E, 0x54, 0x4F, 0x44, 0x6E, 0x33, 0x57, 0x68, 0x55, 0x69, 0x64, 0x68, 0x4F, 0x50, 0x46, 0x5A, 0x50, 0x59, 0x35, 0x51, 0x34, 0x4C, 0x31, 0x35, 0x50, 0x4F, 0x64, 0x73, 0x6C, 0x76, 0x35, 0x65, 0x32, 0x51, 0x4A, 0x6C, 0x0A, 0x74, 0x49, 0x35, + 0x63, 0x30, 0x42, 0x45, 0x30, 0x33, 0x31, 0x32, 0x2F, 0x55, 0x71, 0x65, 0x42, 0x41, 0x4D, 0x4E, 0x2F, 0x6D, 0x55, 0x57, 0x5A, 0x46, 0x64, 0x55, 0x58, 0x79, 0x41, 0x70, 0x54, 0x37, 0x47, 0x50, 0x7A, 0x6D, 0x58, 0x33, 0x4D, 0x61, 0x52, 0x4B, + 0x47, 0x77, 0x68, 0x66, 0x77, 0x41, 0x5A, 0x36, 0x2F, 0x68, 0x4C, 0x7A, 0x52, 0x55, 0x73, 0x73, 0x62, 0x6B, 0x6D, 0x62, 0x4F, 0x70, 0x46, 0x50, 0x6C, 0x6F, 0x62, 0x2F, 0x45, 0x32, 0x77, 0x6E, 0x57, 0x0A, 0x35, 0x6F, 0x6C, 0x57, 0x4B, 0x38, + 0x6A, 0x6A, 0x66, 0x4E, 0x37, 0x6A, 0x2F, 0x34, 0x6E, 0x6C, 0x4E, 0x57, 0x34, 0x6F, 0x36, 0x47, 0x77, 0x4C, 0x49, 0x31, 0x47, 0x70, 0x4A, 0x51, 0x58, 0x72, 0x53, 0x50, 0x6A, 0x64, 0x73, 0x63, 0x72, 0x36, 0x62, 0x41, 0x68, 0x52, 0x37, 0x37, + 0x63, 0x59, 0x62, 0x45, 0x54, 0x4B, 0x4A, 0x75, 0x46, 0x7A, 0x78, 0x6F, 0x6B, 0x47, 0x67, 0x65, 0x57, 0x4B, 0x72, 0x4C, 0x44, 0x69, 0x4B, 0x63, 0x61, 0x35, 0x4A, 0x4C, 0x4E, 0x72, 0x0A, 0x52, 0x42, 0x48, 0x30, 0x70, 0x55, 0x50, 0x43, 0x54, + 0x45, 0x50, 0x6C, 0x63, 0x44, 0x61, 0x4D, 0x74, 0x6A, 0x4E, 0x58, 0x65, 0x70, 0x55, 0x75, 0x67, 0x71, 0x44, 0x30, 0x58, 0x42, 0x43, 0x7A, 0x59, 0x59, 0x50, 0x32, 0x41, 0x67, 0x57, 0x47, 0x4C, 0x6E, 0x77, 0x74, 0x62, 0x4E, 0x77, 0x44, 0x52, + 0x6D, 0x34, 0x31, 0x6B, 0x39, 0x56, 0x36, 0x6C, 0x53, 0x2F, 0x65, 0x49, 0x4E, 0x68, 0x62, 0x66, 0x70, 0x53, 0x51, 0x42, 0x47, 0x71, 0x36, 0x57, 0x54, 0x30, 0x45, 0x0A, 0x42, 0x58, 0x57, 0x64, 0x4E, 0x36, 0x49, 0x4F, 0x4C, 0x6A, 0x33, 0x72, + 0x77, 0x61, 0x52, 0x53, 0x67, 0x2F, 0x37, 0x51, 0x61, 0x39, 0x52, 0x6D, 0x6A, 0x74, 0x7A, 0x47, 0x36, 0x52, 0x4A, 0x4F, 0x48, 0x53, 0x70, 0x58, 0x71, 0x68, 0x43, 0x38, 0x66, 0x46, 0x36, 0x43, 0x66, 0x61, 0x61, 0x6D, 0x79, 0x66, 0x49, 0x74, + 0x75, 0x66, 0x55, 0x58, 0x4A, 0x36, 0x33, 0x52, 0x44, 0x6F, 0x6C, 0x55, 0x4B, 0x35, 0x58, 0x36, 0x77, 0x4B, 0x30, 0x64, 0x6D, 0x42, 0x52, 0x34, 0x0A, 0x4D, 0x30, 0x4B, 0x47, 0x43, 0x71, 0x6C, 0x7A, 0x74, 0x66, 0x74, 0x30, 0x44, 0x62, 0x63, + 0x62, 0x4D, 0x42, 0x6E, 0x45, 0x57, 0x67, 0x34, 0x63, 0x4A, 0x37, 0x66, 0x61, 0x47, 0x4E, 0x44, 0x2F, 0x69, 0x73, 0x67, 0x46, 0x75, 0x76, 0x47, 0x71, 0x48, 0x4B, 0x49, 0x33, 0x74, 0x2B, 0x5A, 0x49, 0x70, 0x45, 0x59, 0x73, 0x6C, 0x4F, 0x71, + 0x6F, 0x64, 0x6D, 0x4A, 0x48, 0x69, 0x78, 0x42, 0x54, 0x42, 0x30, 0x68, 0x58, 0x62, 0x4F, 0x4B, 0x53, 0x54, 0x62, 0x61, 0x75, 0x0A, 0x42, 0x63, 0x76, 0x63, 0x77, 0x55, 0x70, 0x65, 0x6A, 0x36, 0x77, 0x39, 0x47, 0x55, 0x37, 0x43, 0x37, 0x57, + 0x42, 0x31, 0x4B, 0x39, 0x76, 0x42, 0x79, 0x6B, 0x4C, 0x56, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x48, + 0x4B, 0x73, 0x35, 0x44, 0x4E, 0x35, 0x71, 0x6B, 0x57, 0x48, 0x39, 0x76, 0x32, 0x73, 0x48, 0x5A, 0x37, 0x57, 0x0A, 0x78, 0x79, 0x2B, 0x47, 0x32, 0x43, 0x51, 0x35, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, + 0x42, 0x52, 0x79, 0x72, 0x4F, 0x51, 0x7A, 0x65, 0x61, 0x70, 0x46, 0x68, 0x2F, 0x62, 0x39, 0x72, 0x42, 0x32, 0x65, 0x31, 0x73, 0x63, 0x76, 0x68, 0x74, 0x67, 0x6B, 0x4F, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, + 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x0A, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, + 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x6F, 0x44, 0x74, 0x5A, 0x70, 0x77, 0x6D, 0x55, 0x50, 0x6A, 0x61, 0x45, 0x30, 0x6E, 0x34, 0x76, 0x4F, 0x61, 0x57, 0x57, + 0x6C, 0x2F, 0x6F, 0x52, 0x72, 0x66, 0x78, 0x6E, 0x38, 0x33, 0x45, 0x4A, 0x0A, 0x38, 0x72, 0x4B, 0x4A, 0x68, 0x47, 0x64, 0x45, 0x72, 0x37, 0x6E, 0x76, 0x37, 0x5A, 0x62, 0x73, 0x6E, 0x47, 0x54, 0x62, 0x4D, 0x6A, 0x42, 0x76, 0x5A, 0x35, 0x71, + 0x73, 0x66, 0x6C, 0x2B, 0x79, 0x71, 0x77, 0x45, 0x32, 0x66, 0x6F, 0x48, 0x36, 0x35, 0x49, 0x52, 0x65, 0x30, 0x71, 0x77, 0x32, 0x34, 0x47, 0x74, 0x69, 0x78, 0x58, 0x31, 0x4C, 0x44, 0x6F, 0x4A, 0x74, 0x30, 0x6E, 0x5A, 0x69, 0x30, 0x66, 0x36, + 0x58, 0x2B, 0x4A, 0x38, 0x77, 0x66, 0x42, 0x6A, 0x35, 0x0A, 0x74, 0x46, 0x4A, 0x33, 0x67, 0x68, 0x31, 0x32, 0x32, 0x39, 0x4D, 0x64, 0x71, 0x66, 0x44, 0x42, 0x6D, 0x67, 0x43, 0x39, 0x62, 0x58, 0x58, 0x59, 0x66, 0x65, 0x66, 0x36, 0x78, 0x7A, + 0x69, 0x6A, 0x6E, 0x48, 0x44, 0x6F, 0x52, 0x6E, 0x6B, 0x44, 0x72, 0x79, 0x35, 0x30, 0x32, 0x33, 0x58, 0x34, 0x62, 0x6C, 0x4D, 0x4D, 0x41, 0x38, 0x69, 0x5A, 0x47, 0x6F, 0x6B, 0x31, 0x47, 0x54, 0x7A, 0x54, 0x79, 0x56, 0x52, 0x38, 0x71, 0x50, + 0x41, 0x73, 0x35, 0x6D, 0x34, 0x48, 0x0A, 0x65, 0x57, 0x39, 0x71, 0x34, 0x65, 0x62, 0x71, 0x6B, 0x59, 0x4A, 0x70, 0x43, 0x68, 0x33, 0x44, 0x66, 0x6C, 0x6D, 0x69, 0x6E, 0x6D, 0x74, 0x47, 0x46, 0x5A, 0x68, 0x62, 0x30, 0x36, 0x39, 0x47, 0x48, + 0x57, 0x4C, 0x49, 0x7A, 0x6F, 0x42, 0x53, 0x53, 0x52, 0x45, 0x2F, 0x79, 0x51, 0x51, 0x53, 0x77, 0x78, 0x4E, 0x38, 0x50, 0x7A, 0x75, 0x4B, 0x6C, 0x74, 0x73, 0x38, 0x6F, 0x42, 0x34, 0x4B, 0x74, 0x49, 0x74, 0x55, 0x73, 0x69, 0x52, 0x6E, 0x44, + 0x65, 0x2B, 0x43, 0x0A, 0x79, 0x37, 0x34, 0x38, 0x66, 0x64, 0x48, 0x69, 0x66, 0x36, 0x34, 0x57, 0x31, 0x6C, 0x5A, 0x59, 0x75, 0x64, 0x6F, 0x67, 0x73, 0x59, 0x4D, 0x56, 0x6F, 0x65, 0x2B, 0x4B, 0x54, 0x54, 0x4A, 0x76, 0x51, 0x53, 0x38, 0x54, + 0x55, 0x6F, 0x4B, 0x55, 0x31, 0x78, 0x72, 0x42, 0x65, 0x4B, 0x4A, 0x52, 0x33, 0x53, 0x74, 0x77, 0x62, 0x62, 0x63, 0x61, 0x2B, 0x66, 0x65, 0x77, 0x34, 0x47, 0x65, 0x58, 0x56, 0x74, 0x74, 0x38, 0x59, 0x56, 0x4D, 0x4A, 0x41, 0x79, 0x67, 0x43, + 0x0A, 0x51, 0x4D, 0x65, 0x7A, 0x32, 0x50, 0x32, 0x63, 0x63, 0x47, 0x72, 0x47, 0x4B, 0x4D, 0x4F, 0x46, 0x36, 0x65, 0x4C, 0x74, 0x47, 0x70, 0x4F, 0x67, 0x33, 0x6B, 0x75, 0x59, 0x6F, 0x6F, 0x51, 0x2B, 0x42, 0x58, 0x63, 0x42, 0x6C, 0x6A, 0x33, + 0x37, 0x74, 0x43, 0x41, 0x50, 0x6E, 0x48, 0x49, 0x43, 0x65, 0x68, 0x49, 0x76, 0x31, 0x61, 0x4F, 0x36, 0x55, 0x58, 0x69, 0x76, 0x4B, 0x69, 0x74, 0x45, 0x5A, 0x55, 0x36, 0x31, 0x2F, 0x51, 0x72, 0x6F, 0x77, 0x63, 0x31, 0x35, 0x0A, 0x68, 0x32, + 0x45, 0x72, 0x33, 0x6F, 0x42, 0x58, 0x52, 0x62, 0x39, 0x6E, 0x38, 0x5A, 0x75, 0x52, 0x58, 0x71, 0x57, 0x6B, 0x37, 0x46, 0x6C, 0x49, 0x45, 0x41, 0x30, 0x34, 0x78, 0x37, 0x44, 0x36, 0x77, 0x30, 0x52, 0x74, 0x42, 0x50, 0x56, 0x34, 0x55, 0x42, + 0x79, 0x53, 0x6C, 0x6C, 0x76, 0x61, 0x39, 0x62, 0x67, 0x75, 0x75, 0x6C, 0x76, 0x50, 0x35, 0x66, 0x42, 0x71, 0x6E, 0x55, 0x73, 0x76, 0x57, 0x48, 0x4D, 0x74, 0x54, 0x79, 0x33, 0x45, 0x48, 0x44, 0x37, 0x30, 0x0A, 0x73, 0x7A, 0x2B, 0x72, 0x46, + 0x51, 0x34, 0x37, 0x47, 0x55, 0x47, 0x4B, 0x70, 0x4D, 0x46, 0x58, 0x45, 0x6D, 0x5A, 0x78, 0x54, 0x50, 0x70, 0x54, 0x34, 0x31, 0x66, 0x72, 0x59, 0x70, 0x55, 0x4A, 0x6E, 0x6C, 0x54, 0x64, 0x30, 0x63, 0x49, 0x38, 0x56, 0x7A, 0x79, 0x39, 0x4F, + 0x4B, 0x32, 0x59, 0x5A, 0x4C, 0x65, 0x34, 0x41, 0x35, 0x70, 0x54, 0x56, 0x6D, 0x42, 0x64, 0x73, 0x39, 0x68, 0x43, 0x47, 0x31, 0x78, 0x4C, 0x45, 0x6F, 0x6F, 0x63, 0x36, 0x2B, 0x74, 0x39, 0x0A, 0x78, 0x6E, 0x70, 0x70, 0x78, 0x79, 0x64, 0x2F, + 0x70, 0x50, 0x69, 0x4C, 0x38, 0x75, 0x53, 0x55, 0x5A, 0x6F, 0x64, 0x4C, 0x36, 0x5A, 0x51, 0x48, 0x43, 0x52, 0x4A, 0x35, 0x69, 0x72, 0x4C, 0x72, 0x64, 0x41, 0x54, 0x63, 0x7A, 0x76, 0x52, 0x45, 0x57, 0x65, 0x41, 0x57, 0x79, 0x73, 0x55, 0x73, + 0x57, 0x4E, 0x63, 0x38, 0x65, 0x38, 0x39, 0x69, 0x68, 0x6D, 0x70, 0x51, 0x66, 0x54, 0x55, 0x32, 0x5A, 0x71, 0x66, 0x37, 0x4E, 0x2B, 0x63, 0x6F, 0x78, 0x39, 0x6A, 0x51, 0x0A, 0x72, 0x61, 0x56, 0x70, 0x6C, 0x49, 0x2F, 0x6F, 0x77, 0x64, 0x38, + 0x6B, 0x2B, 0x42, 0x73, 0x48, 0x4D, 0x59, 0x65, 0x42, 0x32, 0x46, 0x33, 0x32, 0x36, 0x43, 0x6A, 0x59, 0x53, 0x6C, 0x4B, 0x41, 0x72, 0x42, 0x50, 0x75, 0x55, 0x42, 0x51, 0x65, 0x6D, 0x4D, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x52, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, + 0x31, 0x20, 0x32, 0x30, 0x32, 0x30, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x32, 0x7A, 0x43, 0x43, 0x41, 0x6D, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x51, 0x66, 0x4D, 0x6D, 0x50, 0x4B, 0x34, 0x54, 0x58, 0x33, 0x2B, 0x6F, 0x50, 0x79, 0x57, 0x57, 0x61, 0x30, 0x30, 0x74, 0x4E, 0x6C, 0x6A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, + 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x45, 0x0A, 0x52, 0x54, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x43, 0x31, 0x55, 0x63, 0x6E, + 0x56, 0x7A, 0x64, 0x43, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x6C, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x4A, 0x53, 0x49, 0x46, + 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x53, 0x41, 0x79, 0x0A, 0x4D, 0x44, 0x49, 0x77, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x54, 0x41, 0x35, 0x4E, 0x44, 0x55, 0x77, 0x4D, + 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x31, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x54, 0x41, 0x35, 0x4E, 0x44, 0x51, 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, + 0x45, 0x55, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x45, 0x51, 0x74, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, + 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x52, 0x43, 0x31, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x56, 0x43, 0x42, 0x43, 0x55, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, + 0x4D, 0x44, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x0A, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4D, 0x62, 0x4C, 0x78, 0x79, 0x6A, + 0x52, 0x2B, 0x34, 0x54, 0x31, 0x6D, 0x75, 0x39, 0x43, 0x46, 0x43, 0x44, 0x68, 0x51, 0x32, 0x74, 0x75, 0x64, 0x61, 0x33, 0x38, 0x4B, 0x77, 0x4F, 0x45, 0x31, 0x48, 0x61, 0x54, 0x4A, 0x64, 0x64, 0x5A, 0x4F, 0x30, 0x46, 0x6C, 0x61, 0x78, 0x37, + 0x6D, 0x4E, 0x43, 0x71, 0x37, 0x0A, 0x64, 0x50, 0x59, 0x53, 0x7A, 0x75, 0x68, 0x74, 0x35, 0x36, 0x76, 0x6B, 0x50, 0x45, 0x34, 0x2F, 0x52, 0x41, 0x69, 0x4C, 0x7A, 0x52, 0x5A, 0x78, 0x79, 0x37, 0x2B, 0x53, 0x6D, 0x66, 0x53, 0x6B, 0x31, 0x7A, + 0x78, 0x51, 0x56, 0x46, 0x4B, 0x51, 0x68, 0x59, 0x4E, 0x34, 0x6C, 0x47, 0x64, 0x6E, 0x6F, 0x78, 0x77, 0x4A, 0x47, 0x54, 0x31, 0x31, 0x4E, 0x49, 0x58, 0x65, 0x37, 0x57, 0x42, 0x39, 0x78, 0x77, 0x79, 0x30, 0x51, 0x56, 0x4B, 0x35, 0x62, 0x75, + 0x58, 0x75, 0x0A, 0x51, 0x71, 0x4F, 0x43, 0x41, 0x51, 0x30, 0x77, 0x67, 0x67, 0x45, 0x4A, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, + 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x48, 0x4F, 0x52, 0x45, 0x4B, 0x76, 0x2F, 0x56, 0x62, 0x4E, 0x61, 0x66, 0x41, 0x6B, 0x6C, 0x31, 0x62, 0x4B, 0x36, 0x43, 0x4B, 0x42, 0x72, 0x71, 0x78, 0x39, 0x74, 0x0A, + 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x43, 0x42, 0x78, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x66, 0x42, 0x49, 0x47, 0x2B, 0x4D, 0x49, 0x47, 0x37, + 0x4D, 0x44, 0x36, 0x67, 0x50, 0x4B, 0x41, 0x36, 0x68, 0x6A, 0x68, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x6D, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x0A, 0x62, 0x6D, 0x56, + 0x30, 0x4C, 0x32, 0x4E, 0x79, 0x62, 0x43, 0x39, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x58, 0x32, 0x4A, 0x79, 0x58, 0x33, 0x4A, 0x76, 0x62, 0x33, 0x52, 0x66, 0x59, 0x32, 0x46, 0x66, 0x4D, 0x56, 0x38, 0x79, 0x4D, 0x44, 0x49, + 0x77, 0x4C, 0x6D, 0x4E, 0x79, 0x62, 0x44, 0x42, 0x35, 0x6F, 0x48, 0x65, 0x67, 0x64, 0x59, 0x5A, 0x7A, 0x62, 0x47, 0x52, 0x68, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x32, 0x52, 0x70, 0x63, 0x6D, 0x56, 0x6A, 0x0A, 0x64, 0x47, 0x39, 0x79, 0x65, 0x53, + 0x35, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x6D, 0x35, 0x6C, 0x64, 0x43, 0x39, 0x44, 0x54, 0x6A, 0x31, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x4A, 0x54, 0x49, 0x77, 0x51, 0x6C, 0x49, 0x6C, 0x4D, 0x6A, + 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x4A, 0x54, 0x49, 0x77, 0x51, 0x30, 0x45, 0x6C, 0x4D, 0x6A, 0x41, 0x78, 0x4A, 0x54, 0x49, 0x77, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x43, 0x78, 0x50, 0x0A, 0x50, 0x55, 0x51, 0x74, 0x56, 0x48, 0x4A, 0x31, 0x63, + 0x33, 0x51, 0x6C, 0x4D, 0x6A, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4C, 0x45, 0x4D, 0x39, 0x52, 0x45, 0x55, 0x2F, 0x59, 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x56, 0x79, 0x5A, 0x58, 0x5A, 0x76, 0x59, + 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x62, 0x47, 0x6C, 0x7A, 0x64, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x0A, 0x41, 0x77, 0x4E, 0x70, 0x41, 0x44, 0x42, 0x6D, 0x41, 0x6A, 0x45, 0x41, + 0x6C, 0x4A, 0x41, 0x74, 0x45, 0x2F, 0x72, 0x68, 0x59, 0x2F, 0x68, 0x68, 0x59, 0x2B, 0x69, 0x74, 0x68, 0x58, 0x68, 0x55, 0x6B, 0x5A, 0x79, 0x34, 0x6B, 0x7A, 0x67, 0x2B, 0x47, 0x6B, 0x48, 0x61, 0x51, 0x42, 0x5A, 0x54, 0x51, 0x67, 0x6A, 0x4B, + 0x4C, 0x34, 0x37, 0x78, 0x50, 0x6F, 0x46, 0x57, 0x77, 0x4B, 0x72, 0x59, 0x37, 0x52, 0x6A, 0x45, 0x73, 0x4B, 0x37, 0x30, 0x50, 0x76, 0x6F, 0x6D, 0x0A, 0x41, 0x6A, 0x45, 0x41, 0x38, 0x79, 0x6A, 0x69, 0x78, 0x74, 0x73, 0x72, 0x6D, 0x66, 0x75, + 0x33, 0x55, 0x62, 0x67, 0x6B, 0x6F, 0x36, 0x53, 0x55, 0x65, 0x68, 0x6F, 0x2F, 0x35, 0x6A, 0x62, 0x69, 0x41, 0x31, 0x63, 0x7A, 0x69, 0x6A, 0x44, 0x4C, 0x67, 0x73, 0x66, 0x57, 0x46, 0x42, 0x48, 0x56, 0x64, 0x57, 0x4E, 0x62, 0x46, 0x4A, 0x57, + 0x63, 0x48, 0x77, 0x48, 0x50, 0x32, 0x4E, 0x56, 0x79, 0x70, 0x77, 0x38, 0x37, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x32, 0x30, 0x32, 0x30, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x32, 0x7A, 0x43, 0x43, 0x41, 0x6D, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x58, 0x77, 0x4A, 0x42, 0x31, 0x33, 0x71, 0x48, 0x66, 0x45, 0x77, 0x44, 0x6F, 0x36, 0x79, 0x57, 0x6A, 0x66, 0x76, + 0x2F, 0x30, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x45, 0x0A, 0x52, 0x54, + 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x43, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, + 0x51, 0x44, 0x45, 0x78, 0x6C, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x53, 0x41, 0x79, 0x0A, 0x4D, 0x44, 0x49, 0x77, 0x4D, + 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x54, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x31, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x54, 0x41, 0x35, 0x4E, 0x54, 0x6B, 0x31, 0x4F, + 0x56, 0x6F, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x45, 0x51, 0x74, + 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x52, 0x43, 0x31, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x56, 0x43, 0x42, 0x46, + 0x56, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x44, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x0A, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, + 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x50, 0x45, 0x4C, 0x33, 0x59, 0x5A, 0x44, 0x49, 0x42, 0x6E, 0x66, 0x6C, 0x34, 0x58, 0x6F, 0x49, 0x6B, 0x71, 0x62, 0x7A, 0x35, 0x32, 0x59, 0x76, 0x37, 0x51, + 0x46, 0x4A, 0x73, 0x6E, 0x4C, 0x34, 0x36, 0x62, 0x53, 0x6A, 0x38, 0x57, 0x65, 0x65, 0x48, 0x73, 0x78, 0x69, 0x61, 0x6D, 0x4A, 0x72, 0x53, 0x63, 0x38, 0x0A, 0x5A, 0x52, 0x43, 0x43, 0x2F, 0x4E, 0x2F, 0x44, 0x6E, 0x55, 0x37, 0x77, 0x4D, 0x79, + 0x50, 0x45, 0x30, 0x6A, 0x4C, 0x31, 0x48, 0x4C, 0x44, 0x66, 0x4D, 0x78, 0x64, 0x64, 0x78, 0x66, 0x43, 0x78, 0x69, 0x76, 0x6E, 0x76, 0x75, 0x62, 0x63, 0x55, 0x79, 0x69, 0x6C, 0x4B, 0x77, 0x67, 0x2B, 0x70, 0x66, 0x33, 0x56, 0x6C, 0x53, 0x53, + 0x6F, 0x77, 0x5A, 0x2F, 0x52, 0x6B, 0x39, 0x39, 0x59, 0x61, 0x64, 0x39, 0x72, 0x44, 0x77, 0x70, 0x64, 0x68, 0x51, 0x6E, 0x74, 0x4A, 0x0A, 0x72, 0x61, 0x4F, 0x43, 0x41, 0x51, 0x30, 0x77, 0x67, 0x67, 0x45, 0x4A, 0x4D, 0x41, 0x38, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x48, 0x38, 0x51, 0x41, 0x52, 0x59, 0x33, 0x4F, + 0x71, 0x51, 0x6F, 0x35, 0x46, 0x44, 0x34, 0x70, 0x50, 0x66, 0x73, 0x61, 0x7A, 0x4B, 0x32, 0x2F, 0x75, 0x6D, 0x4C, 0x0A, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, + 0x42, 0x6A, 0x43, 0x42, 0x78, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x66, 0x42, 0x49, 0x47, 0x2B, 0x4D, 0x49, 0x47, 0x37, 0x4D, 0x44, 0x36, 0x67, 0x50, 0x4B, 0x41, 0x36, 0x68, 0x6A, 0x68, 0x6F, 0x64, 0x48, 0x52, 0x77, 0x4F, 0x69, 0x38, 0x76, + 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x6D, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x75, 0x0A, 0x62, 0x6D, 0x56, 0x30, 0x4C, 0x32, 0x4E, 0x79, 0x62, 0x43, 0x39, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x58, 0x32, 0x56, + 0x32, 0x58, 0x33, 0x4A, 0x76, 0x62, 0x33, 0x52, 0x66, 0x59, 0x32, 0x46, 0x66, 0x4D, 0x56, 0x38, 0x79, 0x4D, 0x44, 0x49, 0x77, 0x4C, 0x6D, 0x4E, 0x79, 0x62, 0x44, 0x42, 0x35, 0x6F, 0x48, 0x65, 0x67, 0x64, 0x59, 0x5A, 0x7A, 0x62, 0x47, 0x52, + 0x68, 0x63, 0x44, 0x6F, 0x76, 0x4C, 0x32, 0x52, 0x70, 0x63, 0x6D, 0x56, 0x6A, 0x0A, 0x64, 0x47, 0x39, 0x79, 0x65, 0x53, 0x35, 0x6B, 0x4C, 0x58, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x4C, 0x6D, 0x35, 0x6C, 0x64, 0x43, 0x39, 0x44, 0x54, 0x6A, + 0x31, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x4A, 0x54, 0x49, 0x77, 0x52, 0x56, 0x59, 0x6C, 0x4D, 0x6A, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x4A, 0x54, 0x49, 0x77, 0x51, 0x30, 0x45, 0x6C, 0x4D, 0x6A, 0x41, 0x78, 0x4A, 0x54, + 0x49, 0x77, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x43, 0x78, 0x50, 0x0A, 0x50, 0x55, 0x51, 0x74, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x6C, 0x4D, 0x6A, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4C, 0x45, 0x4D, 0x39, 0x52, 0x45, 0x55, 0x2F, 0x59, + 0x32, 0x56, 0x79, 0x64, 0x47, 0x6C, 0x6D, 0x61, 0x57, 0x4E, 0x68, 0x64, 0x47, 0x56, 0x79, 0x5A, 0x58, 0x5A, 0x76, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x62, 0x47, 0x6C, 0x7A, 0x64, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, + 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x0A, 0x41, 0x77, 0x4E, 0x70, 0x41, 0x44, 0x42, 0x6D, 0x41, 0x6A, 0x45, 0x41, 0x79, 0x6A, 0x7A, 0x47, 0x4B, 0x6E, 0x58, 0x43, 0x58, 0x6E, 0x56, 0x69, 0x4F, 0x54, 0x59, 0x41, 0x59, 0x46, 0x71, 0x4C, + 0x77, 0x5A, 0x4F, 0x5A, 0x7A, 0x4E, 0x6E, 0x62, 0x51, 0x54, 0x73, 0x37, 0x68, 0x35, 0x6B, 0x58, 0x4F, 0x39, 0x58, 0x4D, 0x54, 0x38, 0x6F, 0x69, 0x39, 0x36, 0x43, 0x41, 0x79, 0x2F, 0x6D, 0x30, 0x73, 0x52, 0x74, 0x57, 0x39, 0x58, 0x4C, 0x53, + 0x2F, 0x42, 0x6E, 0x52, 0x0A, 0x41, 0x6A, 0x45, 0x41, 0x6B, 0x66, 0x63, 0x77, 0x6B, 0x7A, 0x38, 0x51, 0x52, 0x69, 0x74, 0x78, 0x70, 0x4E, 0x41, 0x37, 0x52, 0x4A, 0x76, 0x41, 0x4B, 0x51, 0x49, 0x46, 0x73, 0x6B, 0x46, 0x33, 0x55, 0x66, 0x4E, + 0x35, 0x57, 0x70, 0x36, 0x4F, 0x46, 0x4B, 0x42, 0x4F, 0x51, 0x74, 0x4A, 0x62, 0x67, 0x66, 0x4D, 0x30, 0x61, 0x67, 0x50, 0x6E, 0x49, 0x6A, 0x68, 0x51, 0x57, 0x2B, 0x30, 0x5A, 0x54, 0x30, 0x4D, 0x57, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, + 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x50, 0x33, + 0x38, 0x34, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x47, 0x54, 0x43, 0x43, 0x41, 0x5A, 0x2B, + 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x65, 0x43, 0x54, 0x5A, 0x61, 0x7A, 0x33, 0x32, 0x63, 0x69, 0x35, 0x50, 0x68, 0x77, 0x4C, 0x42, 0x43, 0x6F, 0x75, 0x38, 0x7A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, + 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x4F, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x58, 0x4D, 0x42, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, + 0x4D, 0x4F, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4A, 0x6A, 0x41, 0x6B, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x48, 0x55, 0x52, 0x70, 0x5A, 0x32, + 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x44, 0x4D, 0x34, 0x0A, 0x4E, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x63, 0x31, 0x4D, 0x42, 0x34, 0x58, 0x44, + 0x54, 0x49, 0x78, 0x4D, 0x44, 0x45, 0x78, 0x4E, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x32, 0x4D, 0x44, 0x45, 0x78, 0x4E, 0x44, 0x49, 0x7A, 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x54, + 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x0A, 0x46, 0x7A, 0x41, 0x56, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x6B, 0x52, 0x70, 0x5A, 0x32, 0x6C, 0x44, + 0x5A, 0x58, 0x4A, 0x30, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x4D, 0x53, 0x59, 0x77, 0x4A, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x31, 0x45, 0x61, 0x57, 0x64, 0x70, 0x51, 0x32, 0x56, 0x79, 0x64, 0x43, 0x42, 0x55, + 0x54, 0x46, 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x41, 0x7A, 0x4F, 0x44, 0x51, 0x67, 0x0A, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x48, 0x4E, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, + 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4D, 0x46, 0x45, 0x6F, 0x63, 0x38, 0x52, 0x6C, 0x31, 0x43, 0x61, 0x33, 0x69, 0x4F, 0x43, 0x4E, 0x51, 0x66, 0x4E, 0x30, 0x4D, 0x73, + 0x59, 0x6E, 0x64, 0x4C, 0x78, 0x66, 0x33, 0x63, 0x31, 0x54, 0x7A, 0x76, 0x64, 0x0A, 0x6C, 0x48, 0x4A, 0x53, 0x37, 0x63, 0x49, 0x37, 0x2B, 0x4F, 0x7A, 0x36, 0x65, 0x32, 0x74, 0x59, 0x49, 0x4F, 0x79, 0x5A, 0x72, 0x73, 0x6E, 0x38, 0x61, 0x4C, + 0x4E, 0x31, 0x75, 0x64, 0x73, 0x4A, 0x37, 0x4D, 0x67, 0x54, 0x39, 0x55, 0x37, 0x47, 0x43, 0x68, 0x31, 0x6D, 0x4D, 0x45, 0x79, 0x37, 0x48, 0x30, 0x63, 0x4B, 0x50, 0x47, 0x45, 0x51, 0x51, 0x69, 0x6C, 0x38, 0x70, 0x51, 0x67, 0x4F, 0x34, 0x43, + 0x4C, 0x70, 0x30, 0x7A, 0x56, 0x6F, 0x7A, 0x70, 0x74, 0x6A, 0x0A, 0x6E, 0x34, 0x53, 0x31, 0x6D, 0x55, 0x31, 0x59, 0x6F, 0x49, 0x37, 0x31, 0x56, 0x4F, 0x65, 0x56, 0x79, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, + 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4D, 0x46, 0x52, 0x52, 0x56, 0x42, 0x5A, 0x71, 0x7A, 0x37, 0x6E, 0x4C, 0x46, 0x72, 0x36, 0x49, 0x43, 0x49, 0x53, 0x42, 0x34, 0x43, 0x49, 0x66, 0x42, 0x46, 0x71, 0x4D, 0x41, 0x34, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, + 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x67, 0x41, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x51, 0x43, 0x4A, 0x61, 0x6F, 0x31, 0x48, 0x35, 0x2B, 0x7A, 0x38, 0x62, 0x6C, 0x55, 0x44, + 0x32, 0x57, 0x64, 0x73, 0x0A, 0x4A, 0x6B, 0x36, 0x44, 0x78, 0x76, 0x33, 0x4A, 0x2B, 0x79, 0x73, 0x54, 0x76, 0x4C, 0x64, 0x36, 0x6A, 0x4C, 0x52, 0x6C, 0x30, 0x6D, 0x6C, 0x70, 0x59, 0x78, 0x4E, 0x6A, 0x4F, 0x79, 0x5A, 0x51, 0x4C, 0x67, 0x47, + 0x68, 0x65, 0x51, 0x61, 0x52, 0x6E, 0x55, 0x69, 0x2F, 0x77, 0x72, 0x34, 0x43, 0x4D, 0x45, 0x66, 0x44, 0x46, 0x58, 0x75, 0x78, 0x6F, 0x4A, 0x47, 0x5A, 0x53, 0x5A, 0x4F, 0x6F, 0x50, 0x48, 0x7A, 0x6F, 0x52, 0x67, 0x61, 0x4C, 0x4C, 0x50, 0x49, + 0x78, 0x0A, 0x41, 0x4A, 0x53, 0x64, 0x59, 0x73, 0x69, 0x4A, 0x76, 0x52, 0x6D, 0x45, 0x46, 0x4F, 0x6D, 0x6C, 0x2B, 0x77, 0x47, 0x34, 0x44, 0x58, 0x5A, 0x44, 0x6A, 0x43, 0x35, 0x54, 0x79, 0x33, 0x7A, 0x66, 0x44, 0x42, 0x65, 0x57, 0x55, 0x41, + 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, + 0x4C, 0x53, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, + 0x5A, 0x6A, 0x43, 0x43, 0x41, 0x30, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x43, 0x50, 0x6D, 0x30, 0x65, 0x4B, 0x6A, 0x36, 0x66, 0x74, 0x70, 0x71, 0x4D, 0x7A, 0x65, 0x4A, 0x33, 0x6E, 0x7A, 0x50, 0x69, 0x6A, 0x41, 0x4E, + 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x4E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, + 0x58, 0x4D, 0x42, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4F, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x4D, 0x54, 0x48, 0x45, 0x52, 0x70, 0x5A, 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x30, 0x0A, 0x4D, 0x44, 0x6B, 0x32, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, + 0x51, 0x67, 0x52, 0x7A, 0x55, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x59, 0x77, 0x4D, 0x54, 0x45, 0x30, 0x4D, 0x6A, + 0x4D, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x42, 0x4E, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x58, 0x4D, 0x42, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, + 0x68, 0x4D, 0x4F, 0x52, 0x47, 0x6C, 0x6E, 0x61, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x51, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x48, 0x45, 0x52, 0x70, 0x5A, + 0x32, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x30, 0x4D, 0x44, 0x6B, 0x32, 0x0A, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x52, 0x7A, 0x55, 0x77, 0x67, 0x67, 0x49, 0x69, + 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x7A, + 0x30, 0x50, 0x54, 0x4A, 0x65, 0x52, 0x47, 0x64, 0x2F, 0x66, 0x78, 0x6D, 0x67, 0x65, 0x66, 0x4D, 0x31, 0x65, 0x53, 0x38, 0x0A, 0x37, 0x49, 0x45, 0x2B, 0x61, 0x6A, 0x57, 0x4F, 0x4C, 0x72, 0x66, 0x6E, 0x33, 0x71, 0x2F, 0x35, 0x42, 0x30, 0x33, + 0x50, 0x4D, 0x4A, 0x33, 0x71, 0x43, 0x51, 0x75, 0x5A, 0x76, 0x57, 0x78, 0x58, 0x32, 0x68, 0x68, 0x4B, 0x75, 0x48, 0x69, 0x73, 0x4F, 0x6A, 0x6D, 0x6F, 0x70, 0x6B, 0x69, 0x73, 0x4C, 0x6E, 0x4C, 0x6C, 0x76, 0x65, 0x76, 0x78, 0x47, 0x73, 0x33, + 0x6E, 0x70, 0x41, 0x4F, 0x70, 0x50, 0x78, 0x47, 0x30, 0x32, 0x43, 0x2B, 0x4A, 0x46, 0x76, 0x75, 0x55, 0x0A, 0x41, 0x54, 0x32, 0x37, 0x4C, 0x2F, 0x67, 0x54, 0x42, 0x61, 0x46, 0x34, 0x48, 0x49, 0x34, 0x6F, 0x34, 0x45, 0x58, 0x67, 0x67, 0x2F, + 0x52, 0x5A, 0x47, 0x35, 0x57, 0x7A, 0x72, 0x6E, 0x34, 0x44, 0x52, 0x65, 0x57, 0x2B, 0x77, 0x6B, 0x4C, 0x2B, 0x37, 0x76, 0x49, 0x38, 0x74, 0x6F, 0x55, 0x54, 0x6D, 0x44, 0x4B, 0x64, 0x46, 0x71, 0x67, 0x70, 0x77, 0x67, 0x73, 0x63, 0x4F, 0x4E, + 0x79, 0x66, 0x4D, 0x58, 0x64, 0x63, 0x76, 0x79, 0x65, 0x6A, 0x2F, 0x43, 0x65, 0x73, 0x0A, 0x74, 0x79, 0x75, 0x39, 0x64, 0x4A, 0x73, 0x58, 0x4C, 0x66, 0x4B, 0x42, 0x32, 0x6C, 0x32, 0x77, 0x34, 0x53, 0x4D, 0x58, 0x50, 0x6F, 0x68, 0x4B, 0x45, + 0x69, 0x50, 0x51, 0x36, 0x73, 0x2B, 0x64, 0x33, 0x67, 0x4D, 0x58, 0x73, 0x55, 0x4A, 0x4B, 0x6F, 0x42, 0x5A, 0x4D, 0x70, 0x47, 0x32, 0x54, 0x36, 0x54, 0x38, 0x36, 0x37, 0x6A, 0x70, 0x38, 0x6E, 0x56, 0x69, 0x64, 0x39, 0x45, 0x36, 0x50, 0x2F, + 0x44, 0x73, 0x6A, 0x79, 0x47, 0x32, 0x34, 0x34, 0x67, 0x58, 0x61, 0x0A, 0x7A, 0x4F, 0x76, 0x73, 0x77, 0x7A, 0x48, 0x30, 0x31, 0x36, 0x63, 0x70, 0x56, 0x49, 0x44, 0x50, 0x52, 0x46, 0x74, 0x4D, 0x62, 0x7A, 0x43, 0x65, 0x38, 0x38, 0x7A, 0x64, + 0x48, 0x35, 0x52, 0x44, 0x6E, 0x55, 0x31, 0x2F, 0x63, 0x48, 0x41, 0x4E, 0x31, 0x44, 0x72, 0x52, 0x4E, 0x2F, 0x42, 0x73, 0x6E, 0x5A, 0x76, 0x41, 0x46, 0x4A, 0x4E, 0x59, 0x37, 0x38, 0x31, 0x42, 0x4F, 0x48, 0x57, 0x38, 0x45, 0x77, 0x4F, 0x56, + 0x66, 0x48, 0x2F, 0x6A, 0x58, 0x4F, 0x6E, 0x56, 0x0A, 0x44, 0x64, 0x58, 0x69, 0x66, 0x42, 0x42, 0x69, 0x71, 0x6D, 0x76, 0x77, 0x50, 0x58, 0x62, 0x7A, 0x50, 0x36, 0x50, 0x6F, 0x73, 0x4D, 0x48, 0x39, 0x37, 0x36, 0x70, 0x58, 0x54, 0x61, 0x79, + 0x47, 0x70, 0x78, 0x69, 0x30, 0x4B, 0x63, 0x45, 0x73, 0x44, 0x72, 0x39, 0x6B, 0x76, 0x69, 0x6D, 0x4D, 0x32, 0x41, 0x49, 0x74, 0x7A, 0x56, 0x77, 0x76, 0x38, 0x6E, 0x2F, 0x76, 0x46, 0x66, 0x51, 0x4D, 0x46, 0x61, 0x77, 0x4B, 0x73, 0x50, 0x48, + 0x54, 0x44, 0x55, 0x39, 0x71, 0x0A, 0x54, 0x58, 0x65, 0x58, 0x41, 0x61, 0x44, 0x78, 0x5A, 0x72, 0x65, 0x33, 0x7A, 0x75, 0x2F, 0x4F, 0x37, 0x4F, 0x79, 0x6C, 0x64, 0x63, 0x71, 0x73, 0x34, 0x2B, 0x46, 0x6A, 0x39, 0x37, 0x69, 0x68, 0x42, 0x4D, + 0x69, 0x38, 0x65, 0x7A, 0x39, 0x64, 0x4C, 0x52, 0x59, 0x69, 0x56, 0x75, 0x31, 0x49, 0x53, 0x66, 0x36, 0x6E, 0x4C, 0x33, 0x6B, 0x77, 0x4A, 0x5A, 0x75, 0x36, 0x61, 0x79, 0x30, 0x2F, 0x6E, 0x54, 0x76, 0x45, 0x46, 0x2B, 0x63, 0x64, 0x4C, 0x76, + 0x76, 0x79, 0x0A, 0x7A, 0x36, 0x62, 0x38, 0x34, 0x78, 0x51, 0x73, 0x6C, 0x70, 0x67, 0x68, 0x6A, 0x4C, 0x53, 0x52, 0x36, 0x52, 0x6C, 0x67, 0x67, 0x2F, 0x49, 0x77, 0x4B, 0x77, 0x5A, 0x7A, 0x55, 0x4E, 0x57, 0x59, 0x4F, 0x77, 0x62, 0x70, 0x78, + 0x34, 0x6F, 0x4D, 0x59, 0x49, 0x77, 0x6F, 0x2B, 0x46, 0x4B, 0x62, 0x62, 0x75, 0x48, 0x32, 0x54, 0x62, 0x73, 0x47, 0x4A, 0x4A, 0x76, 0x58, 0x4B, 0x79, 0x59, 0x2F, 0x2F, 0x53, 0x6F, 0x76, 0x63, 0x66, 0x58, 0x57, 0x4A, 0x4C, 0x35, 0x2F, 0x0A, + 0x4D, 0x5A, 0x34, 0x50, 0x62, 0x65, 0x69, 0x50, 0x54, 0x30, 0x32, 0x6A, 0x50, 0x2F, 0x38, 0x31, 0x36, 0x74, 0x39, 0x4A, 0x58, 0x6B, 0x47, 0x50, 0x68, 0x76, 0x6E, 0x78, 0x64, 0x33, 0x6C, 0x4C, 0x47, 0x37, 0x53, 0x6A, 0x58, 0x69, 0x2F, 0x37, + 0x52, 0x67, 0x4C, 0x51, 0x5A, 0x68, 0x4E, 0x65, 0x58, 0x6F, 0x56, 0x50, 0x7A, 0x74, 0x68, 0x77, 0x69, 0x48, 0x76, 0x4F, 0x41, 0x62, 0x57, 0x57, 0x6C, 0x39, 0x66, 0x4E, 0x66, 0x66, 0x32, 0x43, 0x2B, 0x4D, 0x49, 0x6B, 0x0A, 0x77, 0x63, 0x6F, + 0x42, 0x4F, 0x55, 0x2B, 0x4E, 0x6F, 0x73, 0x45, 0x55, 0x51, 0x42, 0x2B, 0x63, 0x5A, 0x74, 0x55, 0x4D, 0x43, 0x55, 0x62, 0x57, 0x38, 0x74, 0x44, 0x52, 0x53, 0x48, 0x5A, 0x57, 0x4F, 0x6B, 0x50, 0x4C, 0x74, 0x67, 0x6F, 0x52, 0x4F, 0x62, 0x71, + 0x4D, 0x45, 0x32, 0x77, 0x47, 0x74, 0x5A, 0x37, 0x50, 0x36, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x0A, 0x46, 0x67, 0x51, 0x55, 0x55, 0x54, + 0x4D, 0x63, 0x37, 0x54, 0x5A, 0x41, 0x72, 0x78, 0x66, 0x54, 0x4A, 0x63, 0x31, 0x70, 0x61, 0x50, 0x4B, 0x76, 0x54, 0x69, 0x4D, 0x2B, 0x73, 0x30, 0x45, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, + 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, + 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x47, 0x43, 0x6D, 0x72, 0x31, 0x74, 0x66, 0x56, 0x39, 0x71, 0x4A, 0x32, 0x30, 0x74, 0x51, 0x71, 0x63, 0x51, 0x6A, 0x4E, 0x53, 0x48, 0x2F, 0x30, + 0x47, 0x45, 0x77, 0x68, 0x4A, 0x47, 0x33, 0x50, 0x78, 0x44, 0x50, 0x4A, 0x59, 0x37, 0x4A, 0x76, 0x30, 0x59, 0x30, 0x32, 0x63, 0x45, 0x68, 0x4A, 0x68, 0x78, 0x77, 0x0A, 0x47, 0x58, 0x49, 0x65, 0x6F, 0x38, 0x6D, 0x48, 0x2F, 0x71, 0x6C, 0x44, + 0x5A, 0x4A, 0x59, 0x36, 0x79, 0x46, 0x4D, 0x45, 0x43, 0x72, 0x5A, 0x42, 0x75, 0x38, 0x52, 0x48, 0x41, 0x4E, 0x6D, 0x66, 0x47, 0x42, 0x67, 0x37, 0x73, 0x67, 0x37, 0x7A, 0x4E, 0x4F, 0x6F, 0x6B, 0x39, 0x39, 0x32, 0x76, 0x49, 0x47, 0x43, 0x75, + 0x6B, 0x69, 0x68, 0x66, 0x4E, 0x75, 0x64, 0x64, 0x35, 0x4E, 0x37, 0x48, 0x50, 0x4E, 0x74, 0x51, 0x4F, 0x61, 0x32, 0x37, 0x50, 0x53, 0x68, 0x4E, 0x0A, 0x6C, 0x6E, 0x78, 0x32, 0x78, 0x6C, 0x76, 0x30, 0x77, 0x64, 0x73, 0x55, 0x70, 0x61, 0x73, + 0x5A, 0x59, 0x67, 0x63, 0x59, 0x51, 0x46, 0x2B, 0x58, 0x6B, 0x64, 0x79, 0x63, 0x78, 0x36, 0x75, 0x31, 0x55, 0x51, 0x33, 0x6D, 0x61, 0x56, 0x4E, 0x56, 0x7A, 0x44, 0x6C, 0x39, 0x32, 0x73, 0x55, 0x52, 0x56, 0x58, 0x4C, 0x46, 0x4F, 0x34, 0x75, + 0x4A, 0x2B, 0x44, 0x51, 0x74, 0x70, 0x42, 0x66, 0x6C, 0x46, 0x2B, 0x61, 0x5A, 0x66, 0x54, 0x43, 0x49, 0x49, 0x54, 0x66, 0x4E, 0x0A, 0x4D, 0x42, 0x63, 0x39, 0x75, 0x50, 0x4B, 0x38, 0x71, 0x48, 0x57, 0x67, 0x51, 0x39, 0x77, 0x2B, 0x69, 0x55, + 0x75, 0x51, 0x72, 0x6D, 0x30, 0x44, 0x34, 0x42, 0x79, 0x6A, 0x6F, 0x4A, 0x59, 0x4A, 0x75, 0x33, 0x32, 0x6A, 0x74, 0x79, 0x6F, 0x51, 0x52, 0x45, 0x74, 0x47, 0x42, 0x7A, 0x52, 0x6A, 0x37, 0x54, 0x47, 0x35, 0x42, 0x4F, 0x36, 0x6A, 0x6D, 0x35, + 0x71, 0x75, 0x35, 0x6A, 0x46, 0x34, 0x39, 0x4F, 0x6F, 0x6B, 0x59, 0x54, 0x75, 0x72, 0x57, 0x47, 0x54, 0x2F, 0x0A, 0x75, 0x34, 0x63, 0x6E, 0x59, 0x69, 0x57, 0x42, 0x33, 0x39, 0x79, 0x68, 0x4C, 0x2F, 0x62, 0x74, 0x70, 0x2F, 0x39, 0x36, 0x6A, + 0x31, 0x45, 0x75, 0x4D, 0x50, 0x69, 0x6B, 0x41, 0x64, 0x4B, 0x46, 0x4F, 0x56, 0x38, 0x42, 0x6D, 0x5A, 0x5A, 0x76, 0x57, 0x6C, 0x74, 0x77, 0x47, 0x55, 0x62, 0x2B, 0x68, 0x6D, 0x41, 0x2B, 0x72, 0x59, 0x41, 0x51, 0x43, 0x64, 0x30, 0x35, 0x4A, + 0x53, 0x39, 0x59, 0x66, 0x37, 0x76, 0x53, 0x64, 0x50, 0x44, 0x33, 0x52, 0x68, 0x39, 0x47, 0x0A, 0x4F, 0x55, 0x72, 0x59, 0x55, 0x39, 0x44, 0x7A, 0x4C, 0x6A, 0x74, 0x78, 0x70, 0x64, 0x52, 0x76, 0x2F, 0x50, 0x4E, 0x6E, 0x35, 0x41, 0x65, 0x50, + 0x33, 0x53, 0x59, 0x5A, 0x34, 0x59, 0x31, 0x62, 0x2B, 0x71, 0x4F, 0x54, 0x45, 0x5A, 0x76, 0x70, 0x79, 0x44, 0x72, 0x44, 0x56, 0x57, 0x69, 0x61, 0x6B, 0x75, 0x46, 0x53, 0x64, 0x6A, 0x6A, 0x6F, 0x34, 0x62, 0x71, 0x39, 0x2B, 0x30, 0x2F, 0x56, + 0x37, 0x37, 0x50, 0x6E, 0x53, 0x49, 0x4D, 0x78, 0x38, 0x49, 0x49, 0x68, 0x0A, 0x34, 0x37, 0x61, 0x2B, 0x70, 0x36, 0x74, 0x76, 0x37, 0x35, 0x2F, 0x66, 0x54, 0x4D, 0x38, 0x42, 0x75, 0x47, 0x4A, 0x71, 0x49, 0x7A, 0x33, 0x6E, 0x43, 0x55, 0x32, + 0x41, 0x47, 0x33, 0x73, 0x77, 0x70, 0x4D, 0x50, 0x64, 0x42, 0x33, 0x38, 0x30, 0x76, 0x71, 0x51, 0x6D, 0x73, 0x76, 0x5A, 0x42, 0x36, 0x41, 0x6B, 0x64, 0x34, 0x79, 0x43, 0x59, 0x71, 0x6A, 0x64, 0x50, 0x2F, 0x2F, 0x66, 0x78, 0x34, 0x69, 0x6C, + 0x77, 0x4D, 0x55, 0x63, 0x2F, 0x64, 0x4E, 0x41, 0x55, 0x0A, 0x46, 0x76, 0x6F, 0x68, 0x69, 0x67, 0x4C, 0x56, 0x69, 0x67, 0x6D, 0x55, 0x64, 0x79, 0x37, 0x79, 0x57, 0x53, 0x69, 0x4C, 0x66, 0x46, 0x43, 0x53, 0x43, 0x6D, 0x5A, 0x34, 0x4F, 0x49, + 0x4E, 0x31, 0x78, 0x4C, 0x56, 0x61, 0x71, 0x42, 0x48, 0x47, 0x35, 0x63, 0x47, 0x64, 0x5A, 0x6C, 0x58, 0x50, 0x55, 0x38, 0x53, 0x76, 0x31, 0x33, 0x57, 0x46, 0x71, 0x55, 0x49, 0x54, 0x56, 0x75, 0x77, 0x68, 0x64, 0x34, 0x47, 0x54, 0x57, 0x67, + 0x7A, 0x71, 0x6C, 0x74, 0x6C, 0x4A, 0x0A, 0x79, 0x71, 0x45, 0x49, 0x38, 0x70, 0x63, 0x37, 0x62, 0x5A, 0x73, 0x45, 0x47, 0x43, 0x52, 0x45, 0x6A, 0x6E, 0x77, 0x42, 0x38, 0x74, 0x77, 0x6C, 0x32, 0x46, 0x36, 0x47, 0x6D, 0x72, 0x45, 0x35, 0x32, + 0x2F, 0x57, 0x52, 0x4D, 0x6D, 0x72, 0x52, 0x70, 0x6E, 0x43, 0x4B, 0x6F, 0x76, 0x66, 0x65, 0x70, 0x45, 0x57, 0x46, 0x4A, 0x71, 0x67, 0x65, 0x6A, 0x46, 0x30, 0x70, 0x57, 0x38, 0x68, 0x4C, 0x32, 0x4A, 0x70, 0x71, 0x41, 0x31, 0x35, 0x77, 0x38, + 0x6F, 0x56, 0x50, 0x0A, 0x62, 0x45, 0x74, 0x6F, 0x4C, 0x38, 0x70, 0x55, 0x39, 0x6F, 0x7A, 0x61, 0x4D, 0x76, 0x37, 0x44, 0x61, 0x34, 0x4D, 0x2F, 0x4F, 0x4D, 0x5A, 0x2B, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6E, 0x6C, 0x79, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x4D, 0x49, 0x49, 0x46, 0x52, 0x7A, 0x43, 0x43, 0x41, 0x79, 0x2B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x52, 0x41, 0x49, 0x34, 0x50, 0x2B, 0x55, 0x75, 0x51, 0x63, 0x57, 0x68, 0x6C, 0x4D, 0x31, 0x54, 0x30, 0x31, 0x45, 0x51, 0x35, + 0x74, 0x2B, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x50, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, + 0x43, 0x56, 0x56, 0x4D, 0x78, 0x45, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x43, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x68, 0x61, 0x57, 0x35, 0x73, 0x65, 0x54, 0x45, 0x61, 0x4D, 0x42, 0x67, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x41, 0x78, 0x4D, 0x52, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x46, 0x70, 0x62, 0x6D, 0x78, 0x35, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6A, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x0A, 0x4D, 0x6A, 0x45, 0x77, 0x4E, 0x44, + 0x41, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x59, 0x77, 0x4E, 0x44, 0x41, 0x78, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x6A, 0x41, 0x39, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x51, 0x32, 0x56, 0x79, 0x0A, 0x64, 0x47, 0x46, 0x70, 0x62, 0x6D, 0x78, 0x35, 0x4D, + 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x46, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x59, 0x57, 0x6C, 0x75, 0x62, 0x48, 0x6B, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x53, 0x4D, 0x54, 0x43, 0x43, 0x41, + 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x0A, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, + 0x41, 0x4E, 0x41, 0x32, 0x31, 0x42, 0x2F, 0x71, 0x33, 0x61, 0x76, 0x6B, 0x30, 0x62, 0x62, 0x6D, 0x2B, 0x79, 0x4C, 0x41, 0x33, 0x52, 0x4D, 0x4E, 0x61, 0x6E, 0x73, 0x69, 0x45, 0x78, 0x79, 0x58, 0x50, 0x47, 0x68, 0x6A, 0x5A, 0x6A, 0x4B, 0x63, + 0x41, 0x37, 0x57, 0x4E, 0x70, 0x49, 0x47, 0x44, 0x32, 0x6E, 0x67, 0x77, 0x45, 0x63, 0x2F, 0x63, 0x73, 0x69, 0x75, 0x2B, 0x6B, 0x72, 0x2B, 0x4F, 0x0A, 0x35, 0x4D, 0x51, 0x54, 0x76, 0x71, 0x52, 0x6F, 0x54, 0x4E, 0x6F, 0x43, 0x61, 0x42, 0x5A, + 0x30, 0x76, 0x72, 0x4C, 0x64, 0x42, 0x4F, 0x52, 0x72, 0x4B, 0x74, 0x30, 0x33, 0x48, 0x32, 0x41, 0x73, 0x32, 0x2F, 0x58, 0x33, 0x6F, 0x58, 0x79, 0x56, 0x74, 0x77, 0x78, 0x77, 0x68, 0x69, 0x37, 0x78, 0x4F, 0x75, 0x39, 0x53, 0x39, 0x38, 0x7A, + 0x54, 0x6D, 0x2F, 0x6D, 0x4C, 0x76, 0x67, 0x37, 0x66, 0x4D, 0x62, 0x65, 0x64, 0x61, 0x46, 0x79, 0x53, 0x70, 0x76, 0x58, 0x6C, 0x0A, 0x38, 0x77, 0x6F, 0x30, 0x74, 0x66, 0x39, 0x37, 0x6F, 0x75, 0x53, 0x48, 0x6F, 0x63, 0x61, 0x76, 0x46, 0x77, + 0x44, 0x76, 0x41, 0x35, 0x48, 0x74, 0x71, 0x52, 0x78, 0x4F, 0x63, 0x54, 0x33, 0x53, 0x69, 0x32, 0x79, 0x4A, 0x39, 0x48, 0x69, 0x47, 0x35, 0x6D, 0x70, 0x4A, 0x6F, 0x4D, 0x36, 0x31, 0x30, 0x72, 0x43, 0x72, 0x6D, 0x2F, 0x62, 0x30, 0x31, 0x43, + 0x37, 0x6A, 0x63, 0x76, 0x6B, 0x32, 0x78, 0x75, 0x73, 0x56, 0x74, 0x79, 0x57, 0x4D, 0x4F, 0x76, 0x77, 0x6C, 0x0A, 0x44, 0x62, 0x4D, 0x69, 0x63, 0x79, 0x46, 0x30, 0x79, 0x45, 0x71, 0x57, 0x59, 0x5A, 0x4C, 0x31, 0x4C, 0x77, 0x73, 0x59, 0x70, + 0x66, 0x53, 0x74, 0x34, 0x75, 0x35, 0x42, 0x76, 0x51, 0x46, 0x35, 0x2B, 0x70, 0x61, 0x4D, 0x6A, 0x52, 0x63, 0x43, 0x4D, 0x4C, 0x54, 0x35, 0x72, 0x33, 0x67, 0x61, 0x6A, 0x4C, 0x51, 0x32, 0x45, 0x42, 0x41, 0x48, 0x42, 0x58, 0x44, 0x51, 0x39, + 0x44, 0x47, 0x51, 0x69, 0x6C, 0x48, 0x46, 0x68, 0x69, 0x5A, 0x35, 0x73, 0x68, 0x47, 0x49, 0x0A, 0x58, 0x73, 0x58, 0x77, 0x43, 0x6C, 0x54, 0x4E, 0x53, 0x61, 0x61, 0x2F, 0x41, 0x70, 0x7A, 0x53, 0x52, 0x4B, 0x66, 0x74, 0x34, 0x33, 0x6A, 0x76, + 0x52, 0x6C, 0x35, 0x74, 0x63, 0x64, 0x46, 0x35, 0x63, 0x42, 0x78, 0x47, 0x58, 0x31, 0x48, 0x70, 0x79, 0x54, 0x66, 0x63, 0x58, 0x33, 0x35, 0x70, 0x65, 0x30, 0x48, 0x66, 0x4E, 0x45, 0x58, 0x67, 0x4F, 0x34, 0x54, 0x30, 0x6F, 0x59, 0x6F, 0x4B, + 0x4E, 0x70, 0x34, 0x33, 0x7A, 0x47, 0x4A, 0x53, 0x34, 0x59, 0x6B, 0x4E, 0x0A, 0x4B, 0x50, 0x6C, 0x36, 0x49, 0x37, 0x45, 0x4E, 0x50, 0x54, 0x32, 0x61, 0x2F, 0x5A, 0x32, 0x42, 0x37, 0x79, 0x79, 0x51, 0x77, 0x48, 0x74, 0x45, 0x54, 0x72, 0x74, + 0x4A, 0x34, 0x41, 0x35, 0x4B, 0x56, 0x70, 0x4B, 0x38, 0x79, 0x37, 0x58, 0x64, 0x65, 0x52, 0x65, 0x4A, 0x6B, 0x64, 0x35, 0x68, 0x69, 0x58, 0x53, 0x53, 0x71, 0x4F, 0x4D, 0x79, 0x68, 0x62, 0x35, 0x4F, 0x68, 0x61, 0x52, 0x4C, 0x57, 0x63, 0x73, + 0x72, 0x78, 0x58, 0x69, 0x4F, 0x63, 0x56, 0x54, 0x51, 0x0A, 0x41, 0x6A, 0x65, 0x5A, 0x6A, 0x4F, 0x56, 0x4A, 0x36, 0x75, 0x42, 0x55, 0x63, 0x71, 0x51, 0x52, 0x42, 0x69, 0x38, 0x4C, 0x6A, 0x4D, 0x46, 0x62, 0x76, 0x72, 0x57, 0x68, 0x73, 0x46, + 0x4E, 0x75, 0x6E, 0x4C, 0x68, 0x67, 0x6B, 0x52, 0x39, 0x5A, 0x61, 0x2F, 0x6B, 0x74, 0x39, 0x4A, 0x51, 0x4B, 0x6C, 0x37, 0x58, 0x73, 0x78, 0x58, 0x59, 0x44, 0x56, 0x42, 0x74, 0x6C, 0x55, 0x72, 0x70, 0x4D, 0x6B, 0x6C, 0x5A, 0x52, 0x4E, 0x61, + 0x42, 0x41, 0x32, 0x43, 0x6E, 0x62, 0x0A, 0x72, 0x6C, 0x4A, 0x32, 0x4F, 0x79, 0x30, 0x77, 0x51, 0x4A, 0x75, 0x4B, 0x30, 0x45, 0x4A, 0x57, 0x74, 0x4C, 0x65, 0x49, 0x41, 0x61, 0x53, 0x48, 0x4F, 0x31, 0x4F, 0x57, 0x7A, 0x61, 0x4D, 0x57, 0x6A, + 0x2F, 0x4E, 0x6D, 0x71, 0x68, 0x65, 0x78, 0x78, 0x32, 0x44, 0x67, 0x77, 0x55, 0x4D, 0x46, 0x44, 0x4F, 0x36, 0x62, 0x57, 0x32, 0x42, 0x76, 0x42, 0x6C, 0x79, 0x48, 0x57, 0x79, 0x66, 0x35, 0x51, 0x42, 0x47, 0x65, 0x6E, 0x44, 0x50, 0x42, 0x74, + 0x2B, 0x55, 0x31, 0x0A, 0x56, 0x77, 0x56, 0x2F, 0x4A, 0x38, 0x34, 0x58, 0x49, 0x49, 0x77, 0x63, 0x2F, 0x50, 0x48, 0x37, 0x32, 0x6A, 0x45, 0x70, 0x53, 0x65, 0x33, 0x31, 0x43, 0x34, 0x53, 0x6E, 0x54, 0x38, 0x48, 0x32, 0x54, 0x73, 0x49, 0x6F, + 0x6E, 0x50, 0x72, 0x75, 0x34, 0x4B, 0x38, 0x48, 0x2B, 0x7A, 0x4D, 0x52, 0x65, 0x69, 0x46, 0x50, 0x43, 0x79, 0x45, 0x51, 0x74, 0x6B, 0x41, 0x36, 0x71, 0x79, 0x49, 0x36, 0x42, 0x4A, 0x79, 0x4C, 0x6D, 0x34, 0x53, 0x47, 0x63, 0x70, 0x72, 0x53, + 0x0A, 0x70, 0x36, 0x58, 0x45, 0x74, 0x48, 0x57, 0x52, 0x71, 0x53, 0x73, 0x6A, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, + 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x44, 0x67, + 0x51, 0x57, 0x42, 0x42, 0x54, 0x67, 0x71, 0x6A, 0x38, 0x6C, 0x6A, 0x5A, 0x39, 0x45, 0x58, 0x4D, 0x45, 0x36, 0x36, 0x43, 0x36, 0x75, 0x64, 0x30, 0x79, 0x45, 0x50, 0x6D, 0x63, 0x4D, 0x39, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, + 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x75, 0x56, 0x65, 0x76, 0x75, 0x42, 0x4C, 0x61, 0x56, 0x34, 0x4F, 0x50, 0x61, 0x41, 0x73, 0x7A, 0x0A, 0x48, 0x51, 0x4E, 0x54, 0x56, + 0x66, 0x53, 0x56, 0x63, 0x4F, 0x51, 0x72, 0x50, 0x62, 0x41, 0x35, 0x36, 0x2F, 0x71, 0x4A, 0x59, 0x76, 0x33, 0x33, 0x31, 0x68, 0x67, 0x45, 0x4C, 0x79, 0x45, 0x30, 0x33, 0x66, 0x46, 0x6F, 0x38, 0x4E, 0x57, 0x57, 0x57, 0x74, 0x37, 0x43, 0x67, + 0x4B, 0x50, 0x42, 0x6A, 0x63, 0x5A, 0x71, 0x39, 0x31, 0x6C, 0x33, 0x72, 0x68, 0x56, 0x6B, 0x7A, 0x31, 0x74, 0x35, 0x42, 0x58, 0x64, 0x6D, 0x36, 0x6F, 0x7A, 0x54, 0x61, 0x77, 0x33, 0x64, 0x0A, 0x38, 0x56, 0x6B, 0x73, 0x77, 0x54, 0x4F, 0x6C, + 0x4D, 0x49, 0x41, 0x56, 0x52, 0x51, 0x64, 0x46, 0x47, 0x6A, 0x45, 0x69, 0x74, 0x70, 0x49, 0x41, 0x71, 0x35, 0x6C, 0x4E, 0x4F, 0x6F, 0x39, 0x33, 0x72, 0x36, 0x6B, 0x69, 0x79, 0x69, 0x39, 0x6A, 0x79, 0x68, 0x58, 0x57, 0x78, 0x38, 0x62, 0x77, + 0x50, 0x57, 0x7A, 0x38, 0x48, 0x41, 0x32, 0x59, 0x45, 0x47, 0x47, 0x65, 0x45, 0x61, 0x49, 0x69, 0x31, 0x77, 0x72, 0x79, 0x6B, 0x58, 0x70, 0x72, 0x4F, 0x51, 0x34, 0x76, 0x0A, 0x4D, 0x4D, 0x4D, 0x32, 0x53, 0x5A, 0x2F, 0x67, 0x36, 0x51, 0x38, + 0x43, 0x52, 0x46, 0x41, 0x33, 0x6C, 0x46, 0x56, 0x39, 0x36, 0x70, 0x2F, 0x32, 0x4F, 0x37, 0x71, 0x55, 0x70, 0x55, 0x7A, 0x70, 0x76, 0x44, 0x35, 0x52, 0x74, 0x4F, 0x6A, 0x4B, 0x6B, 0x6A, 0x5A, 0x55, 0x62, 0x56, 0x77, 0x6C, 0x4B, 0x4E, 0x72, + 0x64, 0x72, 0x52, 0x54, 0x39, 0x30, 0x2B, 0x37, 0x69, 0x49, 0x67, 0x58, 0x72, 0x30, 0x50, 0x4B, 0x33, 0x61, 0x42, 0x4C, 0x58, 0x57, 0x6F, 0x70, 0x42, 0x0A, 0x47, 0x73, 0x61, 0x53, 0x70, 0x56, 0x6F, 0x37, 0x59, 0x30, 0x56, 0x50, 0x76, 0x2B, + 0x45, 0x36, 0x64, 0x79, 0x49, 0x76, 0x58, 0x4C, 0x39, 0x47, 0x2B, 0x56, 0x6F, 0x44, 0x68, 0x52, 0x4E, 0x43, 0x58, 0x38, 0x72, 0x65, 0x55, 0x39, 0x64, 0x69, 0x74, 0x61, 0x59, 0x31, 0x42, 0x4D, 0x4A, 0x48, 0x2F, 0x35, 0x6E, 0x39, 0x68, 0x4E, + 0x39, 0x63, 0x7A, 0x75, 0x6C, 0x65, 0x67, 0x43, 0x68, 0x42, 0x38, 0x6E, 0x33, 0x6E, 0x48, 0x70, 0x44, 0x59, 0x54, 0x33, 0x59, 0x2B, 0x0A, 0x67, 0x6A, 0x77, 0x4E, 0x2F, 0x4B, 0x55, 0x44, 0x2B, 0x6E, 0x73, 0x61, 0x32, 0x55, 0x55, 0x65, 0x59, + 0x4E, 0x72, 0x45, 0x6A, 0x76, 0x6E, 0x38, 0x4B, 0x38, 0x6C, 0x37, 0x6C, 0x63, 0x55, 0x71, 0x2F, 0x36, 0x71, 0x4A, 0x33, 0x34, 0x49, 0x78, 0x44, 0x33, 0x4C, 0x2F, 0x44, 0x43, 0x66, 0x58, 0x43, 0x68, 0x35, 0x57, 0x41, 0x46, 0x41, 0x65, 0x44, + 0x4A, 0x44, 0x42, 0x6C, 0x72, 0x58, 0x59, 0x46, 0x49, 0x57, 0x37, 0x70, 0x77, 0x30, 0x57, 0x77, 0x66, 0x67, 0x48, 0x0A, 0x4A, 0x42, 0x75, 0x36, 0x68, 0x61, 0x45, 0x61, 0x42, 0x51, 0x6D, 0x41, 0x75, 0x70, 0x56, 0x6A, 0x79, 0x54, 0x72, 0x73, + 0x4A, 0x5A, 0x39, 0x2F, 0x6E, 0x62, 0x71, 0x6B, 0x52, 0x78, 0x57, 0x62, 0x52, 0x48, 0x44, 0x78, 0x61, 0x6B, 0x76, 0x57, 0x4F, 0x46, 0x35, 0x44, 0x38, 0x78, 0x68, 0x2B, 0x55, 0x47, 0x37, 0x70, 0x57, 0x69, 0x6A, 0x6D, 0x5A, 0x65, 0x5A, 0x33, + 0x47, 0x7A, 0x72, 0x39, 0x48, 0x62, 0x34, 0x44, 0x4A, 0x71, 0x50, 0x62, 0x31, 0x4F, 0x47, 0x37, 0x0A, 0x66, 0x70, 0x59, 0x6E, 0x4B, 0x78, 0x33, 0x75, 0x70, 0x50, 0x76, 0x61, 0x4A, 0x56, 0x51, 0x54, 0x41, 0x39, 0x34, 0x35, 0x78, 0x73, 0x4D, + 0x66, 0x54, 0x5A, 0x44, 0x73, 0x6A, 0x78, 0x74, 0x4B, 0x30, 0x68, 0x7A, 0x74, 0x68, 0x5A, 0x55, 0x34, 0x55, 0x48, 0x6C, 0x47, 0x31, 0x73, 0x47, 0x51, 0x55, 0x44, 0x47, 0x70, 0x58, 0x4A, 0x70, 0x75, 0x48, 0x66, 0x55, 0x7A, 0x56, 0x6F, 0x75, + 0x6E, 0x6D, 0x64, 0x4C, 0x79, 0x79, 0x43, 0x77, 0x7A, 0x6B, 0x35, 0x49, 0x77, 0x0A, 0x78, 0x30, 0x36, 0x4D, 0x5A, 0x54, 0x4D, 0x51, 0x5A, 0x42, 0x66, 0x39, 0x4A, 0x42, 0x65, 0x57, 0x30, 0x59, 0x33, 0x43, 0x4F, 0x6D, 0x6F, 0x72, 0x36, 0x78, + 0x4F, 0x4C, 0x52, 0x50, 0x49, 0x68, 0x38, 0x30, 0x6F, 0x61, 0x74, 0x33, 0x64, 0x66, 0x31, 0x2B, 0x32, 0x49, 0x70, 0x48, 0x4C, 0x6C, 0x4F, 0x52, 0x2B, 0x56, 0x6E, 0x62, 0x35, 0x6E, 0x77, 0x58, 0x41, 0x52, 0x50, 0x62, 0x76, 0x30, 0x2B, 0x45, + 0x6D, 0x33, 0x34, 0x79, 0x61, 0x58, 0x4F, 0x70, 0x2F, 0x53, 0x0A, 0x58, 0x33, 0x7A, 0x37, 0x77, 0x4A, 0x6C, 0x38, 0x4F, 0x53, 0x6E, 0x67, 0x65, 0x78, 0x32, 0x2F, 0x44, 0x61, 0x65, 0x50, 0x30, 0x69, 0x6B, 0x30, 0x62, 0x69, 0x51, 0x56, 0x79, + 0x39, 0x36, 0x51, 0x58, 0x72, 0x38, 0x61, 0x78, 0x47, 0x62, 0x71, 0x77, 0x75, 0x61, 0x36, 0x4F, 0x56, 0x2B, 0x4B, 0x6D, 0x61, 0x6C, 0x42, 0x57, 0x51, 0x65, 0x77, 0x4C, 0x4B, 0x38, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x43, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6E, 0x6C, 0x79, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x45, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x42, 0x39, 0x7A, 0x43, 0x43, 0x41, 0x58, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x42, 0x69, 0x55, 0x7A, 0x73, 0x55, 0x63, 0x44, 0x4D, 0x79, 0x64, 0x63, 0x2B, 0x59, 0x32, 0x61, 0x75, + 0x62, 0x2F, 0x4D, 0x2B, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x41, 0x39, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x56, 0x0A, + 0x55, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x51, 0x32, 0x56, 0x79, 0x64, 0x47, 0x46, 0x70, 0x62, 0x6D, 0x78, 0x35, 0x4D, 0x52, 0x6F, 0x77, 0x47, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, + 0x45, 0x78, 0x46, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x59, 0x57, 0x6C, 0x75, 0x62, 0x48, 0x6B, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x46, 0x4D, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x54, 0x41, 0x30, 0x0A, 0x4D, 0x44, 0x45, + 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4E, 0x6A, 0x41, 0x30, 0x4D, 0x44, 0x45, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x42, 0x61, 0x4D, 0x44, 0x30, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, + 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6C, 0x56, 0x54, 0x4D, 0x52, 0x49, 0x77, 0x45, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x6C, 0x44, 0x5A, 0x58, 0x4A, 0x30, 0x59, 0x57, 0x6C, 0x75, 0x0A, 0x62, 0x48, 0x6B, 0x78, 0x47, 0x6A, + 0x41, 0x59, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x45, 0x55, 0x4E, 0x6C, 0x63, 0x6E, 0x52, 0x68, 0x61, 0x57, 0x35, 0x73, 0x65, 0x53, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x55, 0x78, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, + 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x33, 0x6D, 0x2F, 0x34, 0x0A, 0x66, 0x78, 0x7A, 0x66, 0x37, 0x66, 0x6C, 0x48, 0x68, + 0x34, 0x61, 0x78, 0x70, 0x4D, 0x43, 0x4B, 0x2B, 0x49, 0x4B, 0x58, 0x67, 0x4F, 0x71, 0x50, 0x79, 0x45, 0x70, 0x65, 0x4B, 0x6E, 0x32, 0x49, 0x61, 0x4B, 0x63, 0x42, 0x59, 0x68, 0x53, 0x52, 0x4A, 0x48, 0x70, 0x63, 0x6E, 0x71, 0x4D, 0x58, 0x66, + 0x59, 0x71, 0x47, 0x49, 0x54, 0x51, 0x59, 0x55, 0x42, 0x73, 0x51, 0x33, 0x74, 0x41, 0x33, 0x53, 0x79, 0x62, 0x48, 0x47, 0x57, 0x43, 0x41, 0x36, 0x54, 0x53, 0x39, 0x0A, 0x59, 0x42, 0x6B, 0x32, 0x51, 0x4E, 0x59, 0x70, 0x68, 0x77, 0x6B, 0x38, + 0x6B, 0x58, 0x72, 0x32, 0x76, 0x42, 0x4D, 0x6A, 0x33, 0x56, 0x6C, 0x4F, 0x42, 0x46, 0x37, 0x50, 0x79, 0x41, 0x49, 0x63, 0x47, 0x46, 0x50, 0x42, 0x4D, 0x64, 0x6A, 0x61, 0x49, 0x4F, 0x6C, 0x45, 0x6A, 0x65, 0x52, 0x32, 0x6F, 0x30, 0x49, 0x77, + 0x51, 0x44, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x0A, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, + 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x38, 0x79, 0x67, 0x59, 0x79, 0x32, 0x52, 0x31, 0x37, 0x69, 0x6B, 0x71, 0x36, 0x2B, 0x32, 0x75, 0x49, 0x31, 0x67, + 0x34, 0x68, 0x65, 0x76, 0x49, 0x49, 0x67, 0x63, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x0A, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x78, 0x41, 0x4C, 0x47, 0x4F, 0x57, 0x69, + 0x44, 0x44, 0x73, 0x68, 0x6C, 0x69, 0x54, 0x64, 0x36, 0x77, 0x54, 0x39, 0x39, 0x75, 0x30, 0x6E, 0x43, 0x4B, 0x38, 0x5A, 0x39, 0x2B, 0x61, 0x6F, 0x7A, 0x6D, 0x75, 0x74, 0x36, 0x44, 0x61, 0x63, 0x70, 0x70, 0x73, 0x36, 0x6B, 0x46, 0x74, 0x5A, + 0x61, 0x53, 0x46, 0x34, 0x66, 0x43, 0x30, 0x75, 0x72, 0x51, 0x65, 0x38, 0x37, 0x59, 0x51, 0x56, 0x74, 0x38, 0x0A, 0x72, 0x67, 0x49, 0x77, 0x52, 0x74, 0x37, 0x71, 0x79, 0x31, 0x32, 0x61, 0x37, 0x44, 0x4C, 0x43, 0x5A, 0x52, 0x61, 0x77, 0x54, + 0x44, 0x42, 0x63, 0x4D, 0x50, 0x50, 0x61, 0x54, 0x6E, 0x4F, 0x47, 0x42, 0x74, 0x6A, 0x4F, 0x69, 0x51, 0x52, 0x49, 0x4E, 0x7A, 0x66, 0x34, 0x33, 0x54, 0x4E, 0x52, 0x6E, 0x58, 0x43, 0x76, 0x65, 0x31, 0x58, 0x59, 0x41, 0x53, 0x35, 0x39, 0x42, + 0x57, 0x51, 0x4F, 0x68, 0x72, 0x69, 0x52, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4F, 0x44, 0x43, 0x43, 0x41, 0x62, 0x36, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4A, 0x41, 0x4E, 0x5A, 0x64, 0x6D, 0x37, 0x4E, + 0x34, 0x67, 0x53, 0x37, 0x72, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x4D, 0x47, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x70, + 0x51, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x78, 0x54, 0x52, 0x55, 0x4E, 0x50, 0x54, 0x53, 0x42, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x54, 0x65, 0x58, 0x4E, 0x30, 0x5A, 0x57, + 0x31, 0x7A, 0x49, 0x45, 0x4E, 0x50, 0x4C, 0x69, 0x78, 0x4D, 0x56, 0x45, 0x51, 0x75, 0x4D, 0x53, 0x73, 0x77, 0x4B, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x4A, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, + 0x42, 0x44, 0x62, 0x32, 0x31, 0x74, 0x0A, 0x64, 0x57, 0x35, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x51, 0x30, 0x45, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, + 0x54, 0x45, 0x32, 0x4D, 0x44, 0x59, 0x78, 0x4E, 0x6A, 0x41, 0x31, 0x4D, 0x54, 0x55, 0x79, 0x4F, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x34, 0x4D, 0x44, 0x45, 0x78, 0x4F, 0x44, 0x41, 0x31, 0x4D, 0x54, 0x55, 0x79, 0x4F, 0x46, 0x6F, 0x77, 0x59, + 0x54, 0x45, 0x4C, 0x0A, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x6C, 0x41, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, 0x4E, 0x46, 0x51, 0x30, 0x39, 0x4E, + 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x46, 0x4E, 0x35, 0x63, 0x33, 0x52, 0x6C, 0x62, 0x58, 0x4D, 0x67, 0x51, 0x30, 0x38, 0x75, 0x4C, 0x45, 0x78, 0x55, 0x52, 0x43, 0x34, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, + 0x0A, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6C, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x45, 0x4E, 0x76, 0x62, 0x57, 0x31, 0x31, 0x62, 0x6D, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x52, 0x55, 0x4E, + 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x52, 0x44, 0x51, 0x54, 0x45, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x0A, 0x49, 0x67, + 0x4E, 0x69, 0x41, 0x41, 0x53, 0x6B, 0x70, 0x57, 0x39, 0x67, 0x41, 0x77, 0x50, 0x44, 0x76, 0x54, 0x48, 0x30, 0x30, 0x78, 0x65, 0x63, 0x4B, 0x34, 0x52, 0x31, 0x72, 0x4F, 0x58, 0x39, 0x50, 0x56, 0x64, 0x75, 0x31, 0x32, 0x4F, 0x2F, 0x35, 0x67, + 0x53, 0x4A, 0x6B, 0x6F, 0x36, 0x42, 0x6E, 0x4F, 0x50, 0x70, 0x52, 0x32, 0x37, 0x4B, 0x6B, 0x42, 0x4C, 0x49, 0x45, 0x2B, 0x43, 0x6E, 0x6E, 0x66, 0x64, 0x6C, 0x64, 0x42, 0x39, 0x73, 0x45, 0x4C, 0x4C, 0x6F, 0x0A, 0x35, 0x4F, 0x6E, 0x76, 0x62, + 0x59, 0x55, 0x79, 0x6D, 0x55, 0x53, 0x78, 0x58, 0x76, 0x33, 0x4D, 0x64, 0x68, 0x44, 0x59, 0x57, 0x37, 0x32, 0x69, 0x78, 0x76, 0x6E, 0x57, 0x51, 0x75, 0x52, 0x58, 0x64, 0x74, 0x79, 0x51, 0x77, 0x6A, 0x57, 0x70, 0x53, 0x34, 0x67, 0x38, 0x45, + 0x6B, 0x64, 0x74, 0x58, 0x50, 0x39, 0x4A, 0x54, 0x78, 0x70, 0x4B, 0x55, 0x4C, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x0A, 0x42, 0x42, 0x53, 0x47, 0x48, 0x4F, 0x66, 0x2B, + 0x4C, 0x61, 0x56, 0x4B, 0x69, 0x77, 0x6A, 0x2B, 0x4B, 0x42, 0x48, 0x36, 0x76, 0x71, 0x4E, 0x6D, 0x2B, 0x47, 0x42, 0x5A, 0x4C, 0x7A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, + 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x4B, 0x0A, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, + 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x41, 0x56, 0x58, 0x55, 0x49, 0x39, 0x2F, 0x4C, 0x62, 0x75, 0x39, 0x7A, 0x75, 0x78, 0x4E, 0x75, 0x69, 0x65, 0x39, 0x73, 0x52, 0x47, 0x4B, 0x45, 0x6B, 0x7A, 0x30, 0x46, 0x68, + 0x44, 0x4B, 0x6D, 0x4D, 0x70, 0x7A, 0x45, 0x32, 0x78, 0x74, 0x48, 0x71, 0x69, 0x75, 0x51, 0x30, 0x34, 0x70, 0x56, 0x31, 0x49, 0x4B, 0x76, 0x33, 0x4C, 0x0A, 0x73, 0x6E, 0x4E, 0x64, 0x6F, 0x34, 0x67, 0x49, 0x78, 0x77, 0x77, 0x43, 0x4D, 0x51, + 0x44, 0x41, 0x71, 0x79, 0x30, 0x4F, 0x62, 0x65, 0x30, 0x59, 0x6F, 0x74, 0x74, 0x54, 0x36, 0x53, 0x58, 0x62, 0x56, 0x51, 0x6A, 0x67, 0x55, 0x4D, 0x7A, 0x66, 0x52, 0x47, 0x45, 0x57, 0x67, 0x71, 0x74, 0x4A, 0x73, 0x4C, 0x4B, 0x42, 0x37, 0x48, + 0x4F, 0x48, 0x65, 0x4C, 0x52, 0x4D, 0x73, 0x6D, 0x49, 0x62, 0x45, 0x76, 0x6F, 0x57, 0x54, 0x53, 0x56, 0x4C, 0x59, 0x37, 0x30, 0x65, 0x0A, 0x4E, 0x39, 0x6B, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x42, 0x4A, 0x43, 0x41, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x64, 0x44, 0x43, 0x43, 0x41, 0x31, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x56, 0x57, 0x39, 0x6C, 0x34, 0x37, 0x54, 0x5A, 0x6B, 0x47, 0x6F, 0x62, 0x43, 0x64, 0x46, + 0x73, 0x50, 0x73, 0x42, 0x73, 0x49, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x55, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x6D, 0x4D, 0x43, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x64, 0x51, 0x6B, 0x56, 0x4A, 0x53, 0x6B, 0x6C, 0x4F, 0x52, 0x79, 0x42, 0x44, 0x52, 0x56, 0x4A, 0x55, 0x53, 0x55, + 0x5A, 0x4A, 0x51, 0x30, 0x46, 0x55, 0x52, 0x53, 0x42, 0x42, 0x56, 0x56, 0x52, 0x49, 0x54, 0x31, 0x4A, 0x4A, 0x56, 0x46, 0x6B, 0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x45, 0x4A, 0x4B, 0x0A, 0x51, + 0x30, 0x45, 0x67, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x35, 0x4D, 0x54, 0x49, 0x78, 0x4F, 0x54, 0x41, 0x7A, 0x4D, + 0x54, 0x59, 0x78, 0x4E, 0x31, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x30, 0x4D, 0x54, 0x49, 0x78, 0x4D, 0x6A, 0x41, 0x7A, 0x4D, 0x54, 0x59, 0x78, 0x4E, 0x31, 0x6F, 0x77, 0x56, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, + 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4A, 0x6A, 0x41, 0x6B, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x55, 0x4A, 0x46, 0x53, 0x55, 0x70, 0x4A, 0x54, 0x6B, 0x63, 0x67, 0x51, 0x30, 0x56, 0x53, 0x56, 0x45, 0x6C, 0x47, + 0x53, 0x55, 0x4E, 0x42, 0x56, 0x45, 0x55, 0x67, 0x51, 0x56, 0x56, 0x55, 0x53, 0x45, 0x39, 0x53, 0x53, 0x56, 0x52, 0x5A, 0x4D, 0x52, 0x30, 0x77, 0x47, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x44, 0x42, 0x52, 0x43, 0x53, 0x6B, 0x4E, + 0x42, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, + 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x50, 0x46, 0x6D, 0x0A, 0x43, 0x4C, 0x33, 0x5A, 0x78, 0x52, 0x56, 0x68, 0x79, 0x34, + 0x51, 0x45, 0x51, 0x61, 0x56, 0x70, 0x4E, 0x33, 0x63, 0x64, 0x77, 0x62, 0x42, 0x37, 0x2B, 0x73, 0x4E, 0x33, 0x53, 0x4A, 0x41, 0x54, 0x63, 0x6D, 0x54, 0x52, 0x75, 0x48, 0x79, 0x51, 0x4E, 0x5A, 0x30, 0x59, 0x65, 0x59, 0x6A, 0x6A, 0x6C, 0x77, + 0x45, 0x38, 0x52, 0x34, 0x48, 0x79, 0x44, 0x71, 0x4B, 0x59, 0x44, 0x5A, 0x34, 0x2F, 0x4E, 0x2B, 0x41, 0x5A, 0x73, 0x70, 0x44, 0x79, 0x52, 0x68, 0x79, 0x53, 0x0A, 0x73, 0x54, 0x70, 0x68, 0x7A, 0x76, 0x71, 0x33, 0x52, 0x70, 0x34, 0x44, 0x68, + 0x74, 0x63, 0x7A, 0x62, 0x75, 0x33, 0x33, 0x52, 0x59, 0x78, 0x32, 0x4E, 0x39, 0x35, 0x75, 0x6C, 0x70, 0x48, 0x33, 0x31, 0x33, 0x34, 0x72, 0x68, 0x78, 0x66, 0x56, 0x69, 0x7A, 0x58, 0x75, 0x68, 0x4A, 0x46, 0x79, 0x56, 0x39, 0x78, 0x67, 0x77, + 0x38, 0x4F, 0x35, 0x35, 0x38, 0x64, 0x6E, 0x4A, 0x43, 0x4E, 0x50, 0x59, 0x77, 0x70, 0x6A, 0x39, 0x6D, 0x5A, 0x39, 0x53, 0x31, 0x57, 0x6E, 0x0A, 0x50, 0x33, 0x68, 0x6B, 0x53, 0x57, 0x6B, 0x53, 0x6C, 0x2B, 0x42, 0x4D, 0x44, 0x64, 0x4D, 0x4A, + 0x6F, 0x44, 0x49, 0x77, 0x4F, 0x76, 0x71, 0x66, 0x77, 0x50, 0x4B, 0x63, 0x78, 0x52, 0x49, 0x71, 0x4C, 0x68, 0x79, 0x31, 0x42, 0x44, 0x50, 0x61, 0x70, 0x44, 0x67, 0x52, 0x61, 0x74, 0x37, 0x47, 0x47, 0x50, 0x5A, 0x48, 0x4F, 0x69, 0x4A, 0x42, + 0x68, 0x79, 0x4C, 0x38, 0x78, 0x49, 0x6B, 0x6F, 0x56, 0x4E, 0x69, 0x4D, 0x70, 0x54, 0x41, 0x4B, 0x2B, 0x42, 0x63, 0x57, 0x0A, 0x79, 0x71, 0x77, 0x33, 0x2F, 0x58, 0x6D, 0x6E, 0x6B, 0x52, 0x64, 0x34, 0x4F, 0x4A, 0x6D, 0x74, 0x57, 0x4F, 0x32, + 0x79, 0x33, 0x73, 0x79, 0x4A, 0x66, 0x51, 0x4F, 0x63, 0x73, 0x34, 0x6C, 0x6C, 0x35, 0x2B, 0x4D, 0x37, 0x73, 0x53, 0x4B, 0x47, 0x6A, 0x77, 0x5A, 0x74, 0x65, 0x41, 0x66, 0x39, 0x6B, 0x52, 0x4A, 0x2F, 0x73, 0x47, 0x73, 0x63, 0x69, 0x51, 0x33, + 0x35, 0x75, 0x4D, 0x74, 0x30, 0x57, 0x77, 0x66, 0x43, 0x79, 0x50, 0x51, 0x31, 0x30, 0x57, 0x52, 0x6A, 0x0A, 0x65, 0x75, 0x6C, 0x75, 0x6D, 0x69, 0x6A, 0x57, 0x4D, 0x4C, 0x33, 0x6D, 0x47, 0x39, 0x30, 0x56, 0x72, 0x34, 0x54, 0x71, 0x6E, 0x4D, + 0x66, 0x4B, 0x39, 0x51, 0x37, 0x71, 0x38, 0x6C, 0x30, 0x70, 0x68, 0x34, 0x39, 0x70, 0x63, 0x7A, 0x6D, 0x2B, 0x4C, 0x69, 0x52, 0x76, 0x52, 0x53, 0x47, 0x73, 0x78, 0x64, 0x52, 0x70, 0x4A, 0x51, 0x61, 0x44, 0x72, 0x58, 0x70, 0x49, 0x68, 0x52, + 0x4D, 0x73, 0x44, 0x51, 0x61, 0x34, 0x62, 0x48, 0x6C, 0x57, 0x2F, 0x4B, 0x4E, 0x6E, 0x0A, 0x4D, 0x6F, 0x48, 0x31, 0x56, 0x36, 0x58, 0x4B, 0x56, 0x30, 0x4A, 0x70, 0x36, 0x56, 0x77, 0x6B, 0x59, 0x65, 0x2F, 0x69, 0x4D, 0x42, 0x68, 0x4F, 0x52, + 0x4A, 0x68, 0x56, 0x62, 0x33, 0x72, 0x43, 0x6B, 0x39, 0x67, 0x5A, 0x74, 0x74, 0x35, 0x38, 0x52, 0x34, 0x6F, 0x52, 0x54, 0x6B, 0x6C, 0x48, 0x32, 0x79, 0x69, 0x55, 0x41, 0x67, 0x75, 0x55, 0x53, 0x69, 0x7A, 0x35, 0x45, 0x74, 0x42, 0x50, 0x36, + 0x44, 0x46, 0x2B, 0x62, 0x48, 0x71, 0x2F, 0x70, 0x6A, 0x2B, 0x62, 0x0A, 0x4F, 0x54, 0x30, 0x43, 0x46, 0x71, 0x4D, 0x59, 0x73, 0x32, 0x65, 0x73, 0x57, 0x7A, 0x38, 0x73, 0x67, 0x79, 0x74, 0x6E, 0x4F, 0x59, 0x46, 0x63, 0x75, 0x58, 0x36, 0x55, + 0x31, 0x57, 0x54, 0x64, 0x6E, 0x6F, 0x39, 0x75, 0x72, 0x75, 0x68, 0x38, 0x57, 0x37, 0x54, 0x58, 0x61, 0x6B, 0x64, 0x49, 0x31, 0x33, 0x36, 0x7A, 0x31, 0x43, 0x32, 0x4F, 0x56, 0x6E, 0x5A, 0x4F, 0x7A, 0x32, 0x6E, 0x78, 0x62, 0x6B, 0x52, 0x73, + 0x31, 0x43, 0x54, 0x71, 0x6A, 0x53, 0x53, 0x68, 0x0A, 0x47, 0x4C, 0x2B, 0x39, 0x56, 0x2F, 0x36, 0x70, 0x6D, 0x54, 0x57, 0x31, 0x32, 0x78, 0x42, 0x33, 0x75, 0x44, 0x31, 0x49, 0x75, 0x74, 0x62, 0x42, 0x35, 0x2F, 0x45, 0x6A, 0x50, 0x74, 0x66, + 0x66, 0x68, 0x5A, 0x30, 0x6E, 0x50, 0x4E, 0x52, 0x41, 0x76, 0x51, 0x6F, 0x4D, 0x76, 0x66, 0x58, 0x6E, 0x6A, 0x53, 0x58, 0x57, 0x67, 0x58, 0x53, 0x48, 0x52, 0x74, 0x51, 0x70, 0x64, 0x61, 0x4A, 0x43, 0x62, 0x50, 0x64, 0x7A, 0x69, 0x65, 0x64, + 0x39, 0x76, 0x33, 0x70, 0x4B, 0x0A, 0x48, 0x39, 0x4D, 0x69, 0x79, 0x52, 0x56, 0x56, 0x7A, 0x39, 0x39, 0x76, 0x66, 0x46, 0x58, 0x51, 0x70, 0x49, 0x73, 0x48, 0x45, 0x54, 0x64, 0x66, 0x67, 0x36, 0x59, 0x6D, 0x56, 0x36, 0x59, 0x42, 0x57, 0x33, + 0x37, 0x2B, 0x57, 0x47, 0x67, 0x48, 0x71, 0x65, 0x6C, 0x36, 0x32, 0x62, 0x6E, 0x6F, 0x2F, 0x31, 0x41, 0x66, 0x71, 0x38, 0x4B, 0x30, 0x77, 0x4D, 0x37, 0x6F, 0x36, 0x76, 0x30, 0x50, 0x76, 0x59, 0x31, 0x4E, 0x75, 0x4C, 0x78, 0x78, 0x41, 0x67, + 0x4D, 0x42, 0x0A, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x46, 0x37, 0x2B, 0x33, 0x4D, 0x32, 0x49, 0x30, 0x68, 0x78, 0x6B, 0x6A, 0x6B, 0x34, + 0x39, 0x63, 0x55, 0x4C, 0x71, 0x63, 0x57, 0x6B, 0x2B, 0x57, 0x59, 0x41, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x0A, + 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, + 0x41, 0x67, 0x45, 0x41, 0x55, 0x6F, 0x4B, 0x73, 0x49, 0x54, 0x51, 0x66, 0x49, 0x2F, 0x4B, 0x69, 0x32, 0x50, 0x6D, 0x34, 0x72, 0x7A, 0x63, 0x32, 0x49, 0x49, 0x6E, 0x52, 0x4E, 0x77, 0x50, 0x57, 0x61, 0x5A, 0x2B, 0x34, 0x0A, 0x59, 0x52, 0x43, + 0x36, 0x6F, 0x6A, 0x47, 0x59, 0x57, 0x55, 0x66, 0x6F, 0x30, 0x51, 0x30, 0x6C, 0x48, 0x68, 0x56, 0x42, 0x44, 0x4F, 0x41, 0x71, 0x56, 0x64, 0x56, 0x58, 0x55, 0x73, 0x76, 0x34, 0x35, 0x4D, 0x64, 0x70, 0x6F, 0x78, 0x31, 0x4E, 0x63, 0x51, 0x4A, + 0x65, 0x58, 0x79, 0x46, 0x46, 0x59, 0x45, 0x68, 0x63, 0x43, 0x59, 0x35, 0x4A, 0x45, 0x4D, 0x45, 0x45, 0x33, 0x4B, 0x6C, 0x69, 0x61, 0x77, 0x4C, 0x77, 0x51, 0x38, 0x68, 0x4F, 0x6E, 0x54, 0x68, 0x4A, 0x0A, 0x64, 0x4D, 0x6B, 0x79, 0x63, 0x46, + 0x52, 0x74, 0x77, 0x55, 0x66, 0x38, 0x6A, 0x72, 0x51, 0x32, 0x6E, 0x74, 0x53, 0x63, 0x76, 0x64, 0x30, 0x67, 0x31, 0x6C, 0x50, 0x4A, 0x47, 0x4B, 0x6D, 0x31, 0x56, 0x72, 0x6C, 0x32, 0x69, 0x35, 0x56, 0x6E, 0x5A, 0x75, 0x36, 0x39, 0x6D, 0x50, + 0x36, 0x75, 0x37, 0x37, 0x35, 0x75, 0x2B, 0x32, 0x44, 0x32, 0x2F, 0x56, 0x6E, 0x47, 0x4B, 0x68, 0x73, 0x2F, 0x49, 0x30, 0x71, 0x55, 0x4A, 0x44, 0x41, 0x6E, 0x79, 0x49, 0x6D, 0x38, 0x0A, 0x36, 0x30, 0x51, 0x6B, 0x6D, 0x73, 0x73, 0x39, 0x76, + 0x6B, 0x2F, 0x56, 0x65, 0x73, 0x36, 0x4F, 0x46, 0x38, 0x74, 0x69, 0x77, 0x64, 0x6E, 0x65, 0x48, 0x67, 0x35, 0x36, 0x2F, 0x30, 0x4F, 0x47, 0x4E, 0x46, 0x4B, 0x38, 0x59, 0x54, 0x38, 0x38, 0x58, 0x37, 0x76, 0x5A, 0x64, 0x72, 0x52, 0x54, 0x76, + 0x4A, 0x65, 0x7A, 0x2F, 0x6F, 0x70, 0x4D, 0x45, 0x69, 0x34, 0x72, 0x38, 0x39, 0x66, 0x4F, 0x34, 0x61, 0x4C, 0x2F, 0x33, 0x58, 0x74, 0x77, 0x2B, 0x7A, 0x75, 0x68, 0x0A, 0x54, 0x61, 0x52, 0x6A, 0x41, 0x76, 0x30, 0x34, 0x6C, 0x35, 0x55, 0x2F, + 0x42, 0x58, 0x43, 0x67, 0x61, 0x39, 0x39, 0x69, 0x67, 0x55, 0x4F, 0x4C, 0x74, 0x46, 0x6B, 0x4E, 0x53, 0x6F, 0x78, 0x55, 0x6E, 0x4D, 0x57, 0x37, 0x67, 0x5A, 0x2F, 0x4E, 0x66, 0x61, 0x58, 0x76, 0x43, 0x79, 0x55, 0x65, 0x4F, 0x69, 0x44, 0x62, + 0x48, 0x50, 0x77, 0x66, 0x6D, 0x47, 0x63, 0x43, 0x43, 0x74, 0x52, 0x7A, 0x52, 0x42, 0x50, 0x62, 0x55, 0x59, 0x51, 0x61, 0x56, 0x51, 0x4E, 0x57, 0x0A, 0x34, 0x41, 0x42, 0x2B, 0x64, 0x41, 0x62, 0x2F, 0x4F, 0x4D, 0x52, 0x79, 0x48, 0x64, 0x4F, + 0x6F, 0x50, 0x32, 0x67, 0x78, 0x58, 0x64, 0x4D, 0x4A, 0x78, 0x79, 0x36, 0x4D, 0x57, 0x32, 0x50, 0x67, 0x36, 0x4E, 0x77, 0x65, 0x30, 0x75, 0x78, 0x68, 0x48, 0x76, 0x4C, 0x65, 0x35, 0x65, 0x2F, 0x32, 0x6D, 0x58, 0x5A, 0x67, 0x4C, 0x52, 0x36, + 0x55, 0x63, 0x6E, 0x48, 0x47, 0x43, 0x79, 0x6F, 0x79, 0x78, 0x35, 0x4A, 0x4F, 0x31, 0x55, 0x62, 0x58, 0x48, 0x66, 0x6D, 0x70, 0x0A, 0x47, 0x51, 0x72, 0x49, 0x2B, 0x70, 0x58, 0x4F, 0x62, 0x53, 0x4F, 0x59, 0x71, 0x67, 0x73, 0x34, 0x72, 0x5A, + 0x70, 0x57, 0x44, 0x57, 0x2B, 0x4E, 0x38, 0x54, 0x45, 0x41, 0x69, 0x4D, 0x45, 0x58, 0x6E, 0x4D, 0x30, 0x5A, 0x4E, 0x6A, 0x58, 0x2B, 0x56, 0x56, 0x4F, 0x67, 0x34, 0x44, 0x77, 0x7A, 0x58, 0x35, 0x5A, 0x65, 0x34, 0x6A, 0x4C, 0x70, 0x33, 0x7A, + 0x4F, 0x37, 0x42, 0x6B, 0x71, 0x70, 0x32, 0x49, 0x52, 0x7A, 0x7A, 0x6E, 0x66, 0x53, 0x78, 0x71, 0x78, 0x78, 0x0A, 0x34, 0x56, 0x79, 0x6A, 0x48, 0x51, 0x79, 0x37, 0x43, 0x74, 0x39, 0x66, 0x34, 0x71, 0x4E, 0x78, 0x32, 0x4E, 0x6F, 0x33, 0x57, + 0x71, 0x42, 0x34, 0x4B, 0x2F, 0x54, 0x55, 0x66, 0x65, 0x74, 0x32, 0x37, 0x66, 0x4A, 0x68, 0x63, 0x4B, 0x56, 0x6C, 0x6D, 0x74, 0x4F, 0x4A, 0x4E, 0x42, 0x69, 0x72, 0x2B, 0x33, 0x49, 0x2B, 0x31, 0x37, 0x51, 0x39, 0x65, 0x56, 0x7A, 0x59, 0x48, + 0x36, 0x45, 0x7A, 0x65, 0x39, 0x6D, 0x43, 0x55, 0x41, 0x79, 0x54, 0x46, 0x36, 0x70, 0x73, 0x0A, 0x33, 0x4D, 0x4B, 0x43, 0x75, 0x77, 0x4A, 0x58, 0x4E, 0x71, 0x2B, 0x59, 0x4A, 0x79, 0x6F, 0x35, 0x55, 0x4F, 0x47, 0x77, 0x69, 0x66, 0x55, 0x6C, + 0x6C, 0x33, 0x35, 0x48, 0x61, 0x42, 0x43, 0x30, 0x37, 0x48, 0x50, 0x4B, 0x73, 0x35, 0x66, 0x52, 0x4A, 0x4E, 0x7A, 0x32, 0x59, 0x71, 0x41, 0x6F, 0x30, 0x37, 0x57, 0x6A, 0x75, 0x47, 0x53, 0x33, 0x69, 0x47, 0x4A, 0x43, 0x7A, 0x35, 0x31, 0x54, + 0x7A, 0x5A, 0x6D, 0x2B, 0x5A, 0x47, 0x69, 0x50, 0x54, 0x78, 0x34, 0x53, 0x0A, 0x53, 0x50, 0x66, 0x53, 0x4B, 0x63, 0x4F, 0x59, 0x4B, 0x4D, 0x72, 0x79, 0x4D, 0x67, 0x75, 0x54, 0x6A, 0x43, 0x6C, 0x50, 0x50, 0x47, 0x41, 0x79, 0x7A, 0x51, 0x57, + 0x57, 0x59, 0x65, 0x7A, 0x79, 0x72, 0x2F, 0x36, 0x7A, 0x63, 0x43, 0x77, 0x75, 0x70, 0x76, 0x49, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x42, 0x4A, 0x43, 0x41, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4A, + 0x54, 0x43, 0x43, 0x41, 0x61, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x4C, 0x42, 0x63, 0x49, 0x66, 0x57, 0x51, 0x71, 0x77, 0x50, 0x36, 0x46, 0x47, 0x46, 0x6B, 0x47, 0x7A, 0x37, 0x52, 0x4B, 0x36, 0x7A, 0x41, 0x4B, 0x42, + 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x55, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x0A, 0x54, 0x6A, 0x45, 0x6D, 0x4D, 0x43, 0x51, 0x47, + 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x64, 0x51, 0x6B, 0x56, 0x4A, 0x53, 0x6B, 0x6C, 0x4F, 0x52, 0x79, 0x42, 0x44, 0x52, 0x56, 0x4A, 0x55, 0x53, 0x55, 0x5A, 0x4A, 0x51, 0x30, 0x46, 0x55, 0x52, 0x53, 0x42, 0x42, 0x56, 0x56, 0x52, 0x49, + 0x54, 0x31, 0x4A, 0x4A, 0x56, 0x46, 0x6B, 0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x46, 0x45, 0x4A, 0x4B, 0x51, 0x30, 0x45, 0x67, 0x0A, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, + 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x35, 0x4D, 0x54, 0x49, 0x78, 0x4F, 0x54, 0x41, 0x7A, 0x4D, 0x54, 0x67, 0x79, 0x4D, 0x56, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x30, 0x4D, 0x54, 0x49, + 0x78, 0x4D, 0x6A, 0x41, 0x7A, 0x4D, 0x54, 0x67, 0x79, 0x4D, 0x56, 0x6F, 0x77, 0x56, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4A, 0x6A, 0x41, 0x6B, 0x42, 0x67, + 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x55, 0x4A, 0x46, 0x53, 0x55, 0x70, 0x4A, 0x54, 0x6B, 0x63, 0x67, 0x51, 0x30, 0x56, 0x53, 0x56, 0x45, 0x6C, 0x47, 0x53, 0x55, 0x4E, 0x42, 0x56, 0x45, 0x55, 0x67, 0x51, 0x56, 0x56, 0x55, 0x53, 0x45, + 0x39, 0x53, 0x53, 0x56, 0x52, 0x5A, 0x4D, 0x52, 0x30, 0x77, 0x47, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x52, 0x43, 0x0A, 0x53, 0x6B, 0x4E, 0x42, 0x49, 0x45, 0x64, 0x73, 0x62, 0x32, 0x4A, 0x68, 0x62, 0x43, 0x42, 0x53, 0x62, + 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x6A, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, + 0x4A, 0x33, 0x4C, 0x67, 0x4A, 0x47, 0x4E, 0x55, 0x32, 0x65, 0x31, 0x75, 0x56, 0x43, 0x78, 0x41, 0x2F, 0x6A, 0x6C, 0x0A, 0x53, 0x52, 0x39, 0x42, 0x49, 0x67, 0x6D, 0x77, 0x55, 0x56, 0x4A, 0x59, 0x31, 0x69, 0x73, 0x30, 0x6A, 0x38, 0x55, 0x53, + 0x52, 0x68, 0x54, 0x46, 0x69, 0x79, 0x38, 0x73, 0x68, 0x50, 0x38, 0x73, 0x62, 0x71, 0x6A, 0x56, 0x38, 0x51, 0x6E, 0x6A, 0x41, 0x79, 0x45, 0x55, 0x78, 0x45, 0x4D, 0x39, 0x66, 0x4D, 0x45, 0x73, 0x78, 0x45, 0x74, 0x71, 0x53, 0x73, 0x33, 0x70, + 0x68, 0x2B, 0x42, 0x39, 0x39, 0x69, 0x4B, 0x2B, 0x2B, 0x6B, 0x70, 0x52, 0x75, 0x44, 0x43, 0x4B, 0x0A, 0x2F, 0x65, 0x48, 0x65, 0x47, 0x42, 0x49, 0x4B, 0x39, 0x6B, 0x65, 0x33, 0x35, 0x78, 0x65, 0x2F, 0x4A, 0x34, 0x72, 0x55, 0x51, 0x55, 0x79, + 0x57, 0x50, 0x47, 0x43, 0x57, 0x77, 0x66, 0x30, 0x56, 0x48, 0x4B, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4E, 0x4A, 0x4B, 0x73, 0x56, 0x46, 0x2F, 0x42, 0x76, 0x44, + 0x52, 0x67, 0x68, 0x39, 0x4F, 0x62, 0x6C, 0x2B, 0x72, 0x67, 0x2F, 0x78, 0x49, 0x0A, 0x31, 0x4C, 0x43, 0x52, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, + 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, + 0x67, 0x41, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x42, 0x71, 0x38, 0x0A, 0x57, 0x39, 0x66, 0x2B, 0x71, 0x64, 0x4A, 0x55, 0x44, 0x6B, 0x70, 0x64, 0x30, 0x6D, 0x32, 0x78, 0x51, 0x4E, 0x7A, 0x30, 0x51, 0x39, 0x58, 0x53, 0x53, 0x70, 0x6B, 0x5A, 0x45, + 0x6C, 0x61, 0x41, 0x39, 0x34, 0x4D, 0x30, 0x34, 0x54, 0x56, 0x4F, 0x53, 0x47, 0x30, 0x45, 0x44, 0x31, 0x63, 0x78, 0x4D, 0x44, 0x41, 0x74, 0x73, 0x61, 0x71, 0x64, 0x41, 0x7A, 0x6A, 0x62, 0x42, 0x67, 0x49, 0x78, 0x41, 0x4D, 0x76, 0x4D, 0x68, + 0x31, 0x50, 0x4C, 0x65, 0x74, 0x38, 0x67, 0x0A, 0x55, 0x58, 0x4F, 0x51, 0x77, 0x4B, 0x68, 0x62, 0x59, 0x64, 0x44, 0x46, 0x55, 0x44, 0x6E, 0x39, 0x68, 0x66, 0x37, 0x42, 0x34, 0x33, 0x6A, 0x34, 0x70, 0x74, 0x5A, 0x4C, 0x76, 0x5A, 0x75, 0x48, + 0x6A, 0x77, 0x2F, 0x6C, 0x31, 0x6C, 0x4F, 0x57, 0x71, 0x7A, 0x7A, 0x49, 0x51, 0x4E, 0x70, 0x68, 0x39, 0x31, 0x4F, 0x6A, 0x39, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x74, 0x69, 0x67, 0x6F, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6E, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x45, 0x34, 0x36, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4F, 0x6A, 0x43, 0x43, 0x41, 0x63, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x51, 0x76, 0x4C, 0x4D, 0x32, 0x68, 0x74, 0x70, + 0x4E, 0x30, 0x52, 0x66, 0x46, 0x66, 0x35, 0x31, 0x4B, 0x42, 0x43, 0x34, 0x39, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x48, 0x0A, 0x51, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x50, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, + 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x54, 0x5A, 0x57, 0x4E, 0x30, 0x61, 0x57, 0x64, 0x76, 0x49, 0x46, 0x42, 0x31, 0x59, 0x6D, 0x78, 0x70, 0x59, 0x79, 0x42, + 0x54, 0x5A, 0x58, 0x4A, 0x32, 0x0A, 0x5A, 0x58, 0x49, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x56, 0x75, 0x64, 0x47, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x46, 0x4E, 0x44, + 0x59, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x7A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x59, 0x77, 0x4D, 0x7A, 0x49, 0x78, 0x4D, 0x6A, 0x4D, 0x31, 0x4F, 0x54, + 0x55, 0x35, 0x0A, 0x57, 0x6A, 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x48, 0x51, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x50, 0x55, + 0x32, 0x56, 0x6A, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x54, 0x5A, 0x57, 0x4E, 0x30, 0x0A, + 0x61, 0x57, 0x64, 0x76, 0x49, 0x46, 0x42, 0x31, 0x59, 0x6D, 0x78, 0x70, 0x59, 0x79, 0x42, 0x54, 0x5A, 0x58, 0x4A, 0x32, 0x5A, 0x58, 0x49, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x56, 0x75, 0x64, 0x47, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, + 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x46, 0x4E, 0x44, 0x59, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x0A, 0x67, 0x51, 0x51, + 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x52, 0x32, 0x2B, 0x70, 0x6D, 0x70, 0x62, 0x69, 0x44, 0x74, 0x2B, 0x64, 0x64, 0x33, 0x34, 0x77, 0x63, 0x37, 0x71, 0x4E, 0x73, 0x39, 0x58, 0x7A, 0x6A, 0x6F, 0x71, 0x31, 0x57, 0x6D, 0x56, 0x6B, 0x2F, + 0x57, 0x53, 0x4F, 0x72, 0x73, 0x66, 0x79, 0x32, 0x71, 0x77, 0x37, 0x4C, 0x46, 0x65, 0x65, 0x79, 0x5A, 0x59, 0x58, 0x38, 0x51, 0x65, 0x63, 0x63, 0x43, 0x57, 0x76, 0x6B, 0x45, 0x4E, 0x2F, 0x55, 0x30, 0x0A, 0x4E, 0x53, 0x74, 0x33, 0x7A, 0x6E, + 0x38, 0x67, 0x6A, 0x31, 0x4B, 0x6A, 0x41, 0x49, 0x6E, 0x73, 0x31, 0x61, 0x65, 0x69, 0x62, 0x56, 0x76, 0x6A, 0x53, 0x35, 0x4B, 0x54, 0x6F, 0x49, 0x44, 0x31, 0x41, 0x5A, 0x54, 0x63, 0x38, 0x47, 0x67, 0x48, 0x48, 0x73, 0x33, 0x75, 0x2F, 0x69, + 0x56, 0x53, 0x74, 0x53, 0x42, 0x44, 0x48, 0x42, 0x76, 0x2B, 0x36, 0x78, 0x6E, 0x4F, 0x51, 0x36, 0x4F, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x52, 0x49, + 0x74, 0x70, 0x4D, 0x57, 0x66, 0x46, 0x4C, 0x58, 0x79, 0x59, 0x34, 0x71, 0x70, 0x33, 0x57, 0x37, 0x75, 0x73, 0x4E, 0x77, 0x2F, 0x75, 0x70, 0x59, 0x54, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, + 0x41, 0x4D, 0x43, 0x41, 0x59, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, + 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6E, 0x41, 0x44, 0x42, 0x6B, 0x41, 0x6A, 0x41, 0x6E, 0x37, 0x71, 0x52, 0x61, 0x71, 0x43, 0x47, 0x37, 0x36, 0x55, 0x65, 0x58, 0x6C, 0x49, 0x6D, 0x6C, 0x64, 0x43, 0x42, 0x74, 0x65, 0x55, 0x2F, 0x49, + 0x76, 0x5A, 0x4E, 0x65, 0x57, 0x42, 0x6A, 0x37, 0x4C, 0x52, 0x6F, 0x41, 0x61, 0x73, 0x6D, 0x34, 0x50, 0x64, 0x43, 0x6B, 0x54, 0x30, 0x52, 0x48, 0x0A, 0x6C, 0x41, 0x46, 0x57, 0x6F, 0x76, 0x67, 0x7A, 0x4A, 0x51, 0x78, 0x43, 0x33, 0x36, 0x6F, + 0x43, 0x4D, 0x42, 0x33, 0x71, 0x34, 0x53, 0x36, 0x49, 0x4C, 0x75, 0x48, 0x35, 0x70, 0x78, 0x30, 0x43, 0x4D, 0x6B, 0x37, 0x79, 0x6E, 0x32, 0x78, 0x56, 0x64, 0x4F, 0x4F, 0x75, 0x72, 0x76, 0x75, 0x6C, 0x47, 0x75, 0x37, 0x74, 0x30, 0x76, 0x7A, + 0x43, 0x41, 0x78, 0x48, 0x72, 0x52, 0x56, 0x78, 0x67, 0x45, 0x44, 0x31, 0x63, 0x66, 0x35, 0x6B, 0x44, 0x57, 0x32, 0x31, 0x55, 0x0A, 0x53, 0x41, 0x47, 0x4B, 0x63, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x74, 0x69, 0x67, 0x6F, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6E, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x34, 0x36, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x69, 0x6A, 0x43, 0x43, 0x41, 0x33, 0x4B, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x64, 0x59, + 0x33, 0x39, 0x69, 0x36, 0x35, 0x38, 0x42, 0x77, 0x44, 0x36, 0x71, 0x53, 0x57, 0x6E, 0x34, 0x63, 0x65, 0x74, 0x46, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, + 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x48, 0x51, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x50, 0x55, 0x32, 0x56, 0x6A, 0x64, + 0x47, 0x6C, 0x6E, 0x62, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x79, 0x31, 0x54, 0x5A, 0x57, 0x4E, 0x30, 0x61, 0x57, 0x64, 0x76, 0x49, + 0x46, 0x42, 0x31, 0x59, 0x6D, 0x78, 0x70, 0x59, 0x79, 0x42, 0x54, 0x0A, 0x5A, 0x58, 0x4A, 0x32, 0x5A, 0x58, 0x49, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, 0x56, 0x75, 0x64, 0x47, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, + 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x53, 0x4E, 0x44, 0x59, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x7A, 0x49, 0x79, 0x4D, 0x44, 0x41, 0x77, 0x4D, 0x44, 0x41, 0x77, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x59, 0x77, + 0x4D, 0x7A, 0x49, 0x78, 0x4D, 0x6A, 0x4D, 0x31, 0x0A, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x42, 0x66, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x48, 0x51, 0x6A, 0x45, 0x59, 0x4D, 0x42, 0x59, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x50, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x47, 0x6C, 0x6E, 0x62, 0x79, 0x42, 0x4D, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x56, 0x6B, 0x4D, 0x54, 0x59, 0x77, 0x4E, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x44, 0x45, 0x79, 0x31, 0x54, 0x0A, 0x5A, 0x57, 0x4E, 0x30, 0x61, 0x57, 0x64, 0x76, 0x49, 0x46, 0x42, 0x31, 0x59, 0x6D, 0x78, 0x70, 0x59, 0x79, 0x42, 0x54, 0x5A, 0x58, 0x4A, 0x32, 0x5A, 0x58, 0x49, 0x67, 0x51, 0x58, 0x56, 0x30, 0x61, 0x47, + 0x56, 0x75, 0x64, 0x47, 0x6C, 0x6A, 0x59, 0x58, 0x52, 0x70, 0x62, 0x32, 0x34, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x53, 0x4E, 0x44, 0x59, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, + 0x62, 0x33, 0x0A, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x43, 0x54, 0x76, 0x74, 0x55, 0x32, 0x55, 0x6E, 0x58, 0x59, 0x41, + 0x53, 0x4F, 0x67, 0x48, 0x45, 0x64, 0x43, 0x53, 0x65, 0x35, 0x6A, 0x74, 0x72, 0x63, 0x68, 0x2F, 0x63, 0x53, 0x56, 0x31, 0x55, 0x67, 0x72, 0x4A, 0x6E, 0x77, 0x55, 0x55, 0x78, 0x44, 0x61, 0x65, 0x66, 0x30, 0x72, 0x74, 0x79, 0x32, 0x6B, 0x0A, + 0x31, 0x43, 0x7A, 0x36, 0x36, 0x6A, 0x4C, 0x64, 0x53, 0x63, 0x4B, 0x35, 0x76, 0x51, 0x39, 0x49, 0x50, 0x58, 0x74, 0x61, 0x6D, 0x46, 0x53, 0x76, 0x6E, 0x6C, 0x30, 0x78, 0x64, 0x45, 0x38, 0x48, 0x2F, 0x46, 0x41, 0x68, 0x33, 0x61, 0x54, 0x50, + 0x61, 0x45, 0x38, 0x62, 0x45, 0x6D, 0x4E, 0x74, 0x4A, 0x5A, 0x6C, 0x4D, 0x4B, 0x70, 0x6E, 0x7A, 0x53, 0x44, 0x42, 0x68, 0x2B, 0x6F, 0x46, 0x38, 0x48, 0x71, 0x63, 0x49, 0x53, 0x74, 0x77, 0x2B, 0x4B, 0x78, 0x77, 0x66, 0x0A, 0x47, 0x45, 0x78, + 0x78, 0x71, 0x6A, 0x57, 0x4D, 0x72, 0x66, 0x68, 0x75, 0x36, 0x44, 0x74, 0x4B, 0x32, 0x65, 0x57, 0x55, 0x41, 0x74, 0x61, 0x4A, 0x68, 0x42, 0x4F, 0x71, 0x62, 0x63, 0x68, 0x50, 0x4D, 0x38, 0x78, 0x51, 0x6C, 0x6A, 0x65, 0x53, 0x4D, 0x39, 0x78, + 0x66, 0x69, 0x4F, 0x65, 0x66, 0x56, 0x4E, 0x6C, 0x49, 0x38, 0x4A, 0x68, 0x44, 0x31, 0x6D, 0x62, 0x39, 0x6E, 0x78, 0x63, 0x34, 0x51, 0x38, 0x55, 0x42, 0x55, 0x51, 0x76, 0x58, 0x34, 0x79, 0x4D, 0x50, 0x0A, 0x46, 0x46, 0x31, 0x62, 0x46, 0x4F, + 0x64, 0x4C, 0x76, 0x74, 0x33, 0x30, 0x79, 0x4E, 0x6F, 0x44, 0x4E, 0x39, 0x48, 0x57, 0x4F, 0x61, 0x45, 0x68, 0x55, 0x54, 0x43, 0x44, 0x73, 0x47, 0x33, 0x58, 0x4D, 0x45, 0x36, 0x57, 0x57, 0x35, 0x48, 0x77, 0x63, 0x43, 0x53, 0x72, 0x76, 0x30, + 0x57, 0x42, 0x5A, 0x45, 0x4D, 0x4E, 0x76, 0x53, 0x45, 0x36, 0x4C, 0x7A, 0x7A, 0x70, 0x6E, 0x67, 0x33, 0x4C, 0x49, 0x4C, 0x56, 0x43, 0x4A, 0x38, 0x7A, 0x61, 0x62, 0x35, 0x76, 0x75, 0x0A, 0x5A, 0x44, 0x43, 0x51, 0x4F, 0x63, 0x32, 0x54, 0x5A, + 0x59, 0x45, 0x68, 0x4D, 0x62, 0x55, 0x6A, 0x55, 0x44, 0x4D, 0x33, 0x49, 0x75, 0x4D, 0x34, 0x37, 0x66, 0x67, 0x78, 0x4D, 0x4D, 0x78, 0x46, 0x2F, 0x6D, 0x4C, 0x35, 0x30, 0x56, 0x30, 0x79, 0x65, 0x55, 0x4B, 0x48, 0x33, 0x32, 0x72, 0x4D, 0x56, + 0x68, 0x6C, 0x41, 0x54, 0x63, 0x36, 0x71, 0x75, 0x2F, 0x6D, 0x31, 0x64, 0x6B, 0x6D, 0x55, 0x38, 0x53, 0x66, 0x34, 0x6B, 0x61, 0x57, 0x44, 0x35, 0x51, 0x61, 0x7A, 0x0A, 0x59, 0x77, 0x36, 0x41, 0x33, 0x4F, 0x41, 0x53, 0x56, 0x59, 0x43, 0x6D, + 0x4F, 0x32, 0x61, 0x30, 0x4F, 0x59, 0x63, 0x74, 0x79, 0x50, 0x44, 0x51, 0x30, 0x52, 0x54, 0x70, 0x35, 0x41, 0x31, 0x4E, 0x44, 0x76, 0x5A, 0x64, 0x56, 0x33, 0x4C, 0x46, 0x4F, 0x78, 0x78, 0x48, 0x56, 0x70, 0x33, 0x69, 0x31, 0x66, 0x75, 0x42, + 0x59, 0x59, 0x7A, 0x4D, 0x54, 0x59, 0x43, 0x51, 0x4E, 0x46, 0x75, 0x33, 0x31, 0x78, 0x52, 0x31, 0x33, 0x4E, 0x67, 0x45, 0x53, 0x4A, 0x2F, 0x41, 0x0A, 0x77, 0x53, 0x69, 0x49, 0x74, 0x4F, 0x6B, 0x63, 0x79, 0x71, 0x65, 0x78, 0x38, 0x56, 0x61, + 0x33, 0x65, 0x30, 0x6C, 0x4D, 0x57, 0x65, 0x55, 0x67, 0x46, 0x61, 0x69, 0x45, 0x41, 0x69, 0x6E, 0x36, 0x4F, 0x4A, 0x52, 0x70, 0x6D, 0x6B, 0x6B, 0x47, 0x6A, 0x38, 0x30, 0x66, 0x65, 0x52, 0x51, 0x58, 0x45, 0x67, 0x79, 0x44, 0x65, 0x74, 0x34, + 0x66, 0x73, 0x5A, 0x66, 0x75, 0x2B, 0x5A, 0x64, 0x34, 0x4B, 0x4B, 0x54, 0x49, 0x52, 0x4A, 0x4C, 0x70, 0x66, 0x53, 0x59, 0x46, 0x0A, 0x70, 0x6C, 0x68, 0x79, 0x6D, 0x33, 0x6B, 0x54, 0x32, 0x42, 0x46, 0x66, 0x72, 0x73, 0x55, 0x34, 0x59, 0x6A, + 0x52, 0x6F, 0x73, 0x6F, 0x59, 0x77, 0x6A, 0x76, 0x69, 0x51, 0x59, 0x5A, 0x34, 0x79, 0x62, 0x50, 0x55, 0x48, 0x4E, 0x73, 0x32, 0x69, 0x54, 0x47, 0x37, 0x73, 0x69, 0x6A, 0x62, 0x74, 0x38, 0x75, 0x61, 0x5A, 0x46, 0x55, 0x52, 0x77, 0x77, 0x33, + 0x79, 0x38, 0x6E, 0x44, 0x6E, 0x41, 0x74, 0x4F, 0x46, 0x72, 0x39, 0x34, 0x4D, 0x6C, 0x49, 0x31, 0x66, 0x5A, 0x0A, 0x45, 0x6F, 0x44, 0x6C, 0x53, 0x66, 0x42, 0x31, 0x44, 0x2B, 0x2B, 0x4E, 0x36, 0x78, 0x79, 0x62, 0x56, 0x43, 0x69, 0x30, 0x49, + 0x54, 0x7A, 0x38, 0x66, 0x41, 0x72, 0x2F, 0x37, 0x33, 0x74, 0x72, 0x64, 0x66, 0x2B, 0x4C, 0x48, 0x61, 0x41, 0x5A, 0x42, 0x61, 0x76, 0x36, 0x2B, 0x43, 0x75, 0x42, 0x51, 0x75, 0x67, 0x34, 0x75, 0x72, 0x76, 0x37, 0x71, 0x76, 0x30, 0x39, 0x34, + 0x50, 0x50, 0x4B, 0x33, 0x30, 0x36, 0x58, 0x6C, 0x79, 0x6E, 0x74, 0x38, 0x78, 0x68, 0x57, 0x0A, 0x36, 0x61, 0x57, 0x57, 0x72, 0x4C, 0x33, 0x44, 0x6B, 0x4A, 0x69, 0x79, 0x34, 0x50, 0x6D, 0x69, 0x31, 0x4B, 0x5A, 0x48, 0x51, 0x33, 0x78, 0x74, + 0x7A, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x56, 0x6E, 0x4E, 0x59, 0x5A, 0x4A, 0x58, 0x35, 0x6B, 0x68, 0x71, 0x77, + 0x45, 0x69, 0x6F, 0x45, 0x59, 0x6E, 0x6D, 0x68, 0x51, 0x42, 0x57, 0x49, 0x0A, 0x49, 0x55, 0x6B, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x38, + 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, + 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x43, 0x39, 0x63, 0x0A, 0x6D, 0x54, 0x7A, 0x38, 0x42, 0x6C, 0x36, 0x4D, 0x6C, 0x43, 0x35, 0x77, 0x36, 0x74, 0x49, 0x79, 0x4D, 0x59, 0x32, 0x30, 0x38, 0x46, 0x48, 0x56, 0x76, 0x41, 0x72, 0x7A, 0x5A, 0x4A, + 0x38, 0x48, 0x58, 0x74, 0x58, 0x42, 0x63, 0x32, 0x68, 0x6B, 0x65, 0x71, 0x4B, 0x35, 0x44, 0x75, 0x6A, 0x35, 0x58, 0x59, 0x55, 0x74, 0x71, 0x44, 0x64, 0x46, 0x71, 0x69, 0x6A, 0x30, 0x6C, 0x67, 0x56, 0x51, 0x59, 0x4B, 0x6C, 0x4A, 0x66, 0x70, + 0x2F, 0x69, 0x6D, 0x54, 0x59, 0x70, 0x0A, 0x45, 0x30, 0x52, 0x48, 0x61, 0x70, 0x31, 0x56, 0x49, 0x44, 0x7A, 0x59, 0x6D, 0x2F, 0x45, 0x44, 0x4D, 0x72, 0x72, 0x61, 0x51, 0x4B, 0x46, 0x7A, 0x36, 0x6F, 0x4F, 0x68, 0x74, 0x30, 0x53, 0x6D, 0x44, + 0x70, 0x6B, 0x42, 0x6D, 0x2B, 0x53, 0x38, 0x66, 0x37, 0x34, 0x54, 0x6C, 0x48, 0x37, 0x4B, 0x70, 0x68, 0x35, 0x32, 0x67, 0x44, 0x59, 0x39, 0x68, 0x41, 0x61, 0x4C, 0x4D, 0x79, 0x5A, 0x6C, 0x62, 0x63, 0x70, 0x2B, 0x6E, 0x76, 0x34, 0x66, 0x6A, + 0x46, 0x67, 0x34, 0x0A, 0x65, 0x78, 0x71, 0x44, 0x73, 0x51, 0x2B, 0x38, 0x46, 0x78, 0x47, 0x37, 0x35, 0x67, 0x62, 0x4D, 0x59, 0x2F, 0x71, 0x42, 0x38, 0x6F, 0x46, 0x4D, 0x32, 0x67, 0x73, 0x51, 0x61, 0x36, 0x48, 0x36, 0x31, 0x53, 0x69, 0x6C, + 0x7A, 0x77, 0x5A, 0x41, 0x46, 0x76, 0x39, 0x37, 0x66, 0x52, 0x68, 0x65, 0x4F, 0x52, 0x4B, 0x6B, 0x55, 0x35, 0x35, 0x2B, 0x4D, 0x6B, 0x49, 0x51, 0x70, 0x69, 0x47, 0x52, 0x71, 0x52, 0x78, 0x4F, 0x46, 0x33, 0x79, 0x45, 0x76, 0x4A, 0x2B, 0x4D, + 0x0A, 0x30, 0x65, 0x6A, 0x66, 0x35, 0x6C, 0x47, 0x35, 0x4E, 0x6B, 0x63, 0x2F, 0x6B, 0x4C, 0x6E, 0x48, 0x76, 0x41, 0x4C, 0x63, 0x57, 0x78, 0x78, 0x50, 0x44, 0x6B, 0x6A, 0x42, 0x4A, 0x59, 0x4F, 0x63, 0x43, 0x6A, 0x2B, 0x65, 0x73, 0x51, 0x4D, + 0x7A, 0x45, 0x68, 0x6F, 0x6E, 0x72, 0x50, 0x63, 0x69, 0x62, 0x43, 0x54, 0x52, 0x41, 0x55, 0x48, 0x34, 0x57, 0x41, 0x50, 0x2B, 0x4A, 0x57, 0x67, 0x69, 0x48, 0x35, 0x70, 0x61, 0x50, 0x48, 0x78, 0x73, 0x6E, 0x6E, 0x56, 0x49, 0x0A, 0x38, 0x34, + 0x48, 0x78, 0x5A, 0x6D, 0x64, 0x75, 0x54, 0x49, 0x4C, 0x41, 0x37, 0x72, 0x70, 0x58, 0x44, 0x68, 0x6A, 0x76, 0x4C, 0x70, 0x72, 0x33, 0x45, 0x74, 0x69, 0x67, 0x61, 0x2B, 0x6B, 0x46, 0x70, 0x61, 0x48, 0x70, 0x61, 0x50, 0x69, 0x38, 0x54, 0x44, + 0x38, 0x53, 0x48, 0x6B, 0x58, 0x6F, 0x55, 0x73, 0x43, 0x6A, 0x76, 0x78, 0x49, 0x6E, 0x65, 0x62, 0x6E, 0x4D, 0x4D, 0x54, 0x7A, 0x44, 0x39, 0x6A, 0x6F, 0x69, 0x46, 0x67, 0x4F, 0x67, 0x79, 0x59, 0x39, 0x6D, 0x0A, 0x70, 0x46, 0x75, 0x69, 0x54, + 0x64, 0x61, 0x42, 0x4A, 0x51, 0x62, 0x70, 0x64, 0x71, 0x51, 0x41, 0x43, 0x6A, 0x37, 0x4C, 0x7A, 0x54, 0x57, 0x62, 0x34, 0x4F, 0x45, 0x34, 0x79, 0x32, 0x42, 0x54, 0x68, 0x69, 0x68, 0x43, 0x51, 0x52, 0x78, 0x45, 0x56, 0x2B, 0x69, 0x6F, 0x72, + 0x61, 0x74, 0x46, 0x34, 0x79, 0x55, 0x51, 0x76, 0x4E, 0x73, 0x2B, 0x5A, 0x55, 0x48, 0x37, 0x47, 0x36, 0x61, 0x58, 0x44, 0x2B, 0x75, 0x35, 0x64, 0x48, 0x6E, 0x35, 0x48, 0x72, 0x77, 0x64, 0x0A, 0x56, 0x77, 0x31, 0x48, 0x72, 0x38, 0x4D, 0x76, + 0x6E, 0x34, 0x64, 0x47, 0x70, 0x2B, 0x73, 0x6D, 0x57, 0x67, 0x39, 0x57, 0x59, 0x37, 0x56, 0x69, 0x59, 0x47, 0x34, 0x41, 0x2B, 0x2B, 0x4D, 0x6E, 0x45, 0x53, 0x4C, 0x6E, 0x2F, 0x70, 0x6D, 0x50, 0x4E, 0x50, 0x57, 0x35, 0x36, 0x4D, 0x4F, 0x52, + 0x63, 0x72, 0x33, 0x59, 0x77, 0x78, 0x36, 0x35, 0x4C, 0x76, 0x4B, 0x52, 0x52, 0x46, 0x48, 0x51, 0x56, 0x38, 0x30, 0x4D, 0x4E, 0x4E, 0x56, 0x49, 0x49, 0x62, 0x2F, 0x62, 0x0A, 0x45, 0x2F, 0x46, 0x6D, 0x4A, 0x55, 0x4E, 0x53, 0x30, 0x6E, 0x41, + 0x69, 0x4E, 0x73, 0x32, 0x66, 0x78, 0x42, 0x78, 0x31, 0x49, 0x4B, 0x31, 0x6A, 0x63, 0x6D, 0x4D, 0x47, 0x44, 0x77, 0x34, 0x6E, 0x7A, 0x74, 0x4A, 0x71, 0x44, 0x62, 0x79, 0x31, 0x4F, 0x52, 0x72, 0x70, 0x30, 0x58, 0x5A, 0x36, 0x30, 0x56, 0x7A, + 0x6B, 0x35, 0x30, 0x6C, 0x4A, 0x4C, 0x56, 0x55, 0x33, 0x61, 0x50, 0x41, 0x61, 0x4F, 0x70, 0x67, 0x2B, 0x56, 0x42, 0x65, 0x48, 0x56, 0x4F, 0x6D, 0x6D, 0x0A, 0x4A, 0x31, 0x43, 0x4A, 0x65, 0x79, 0x41, 0x76, 0x50, 0x2F, 0x2B, 0x2F, 0x6F, 0x59, + 0x74, 0x4B, 0x52, 0x35, 0x6A, 0x2F, 0x4B, 0x33, 0x74, 0x4A, 0x50, 0x73, 0x4D, 0x70, 0x52, 0x6D, 0x41, 0x59, 0x51, 0x71, 0x73, 0x7A, 0x4B, 0x62, 0x72, 0x41, 0x4B, 0x62, 0x6B, 0x54, 0x69, 0x64, 0x4F, 0x49, 0x69, 0x6A, 0x6C, 0x42, 0x4F, 0x38, + 0x6E, 0x39, 0x70, 0x75, 0x30, 0x66, 0x39, 0x47, 0x42, 0x6A, 0x33, 0x39, 0x49, 0x74, 0x56, 0x51, 0x47, 0x4C, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x53, 0x4C, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x69, 0x54, 0x43, 0x43, 0x41, 0x33, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x62, 0x37, 0x37, 0x61, 0x72, 0x58, 0x4F, 0x39, + 0x43, 0x45, 0x44, 0x69, 0x69, 0x30, 0x32, 0x2B, 0x31, 0x50, 0x64, 0x62, 0x6B, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x4F, 0x4D, 0x51, 0x73, 0x77, + 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x56, 0x55, 0x7A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x50, 0x55, 0x31, 0x4E, 0x4D, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, + 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x78, 0x54, 0x55, 0x30, 0x77, 0x75, 0x59, 0x32, 0x39, 0x74, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, + 0x53, 0x55, 0x30, 0x45, 0x67, 0x0A, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x54, 0x45, 0x32, 0x4D, 0x7A, + 0x51, 0x79, 0x4D, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x32, 0x4D, 0x44, 0x67, 0x78, 0x4F, 0x54, 0x45, 0x32, 0x4D, 0x7A, 0x51, 0x79, 0x4D, 0x56, 0x6F, 0x77, 0x54, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, + 0x4D, 0x43, 0x0A, 0x56, 0x56, 0x4D, 0x78, 0x47, 0x44, 0x41, 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x31, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, + 0x6A, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x63, 0x55, 0x31, 0x4E, 0x4D, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x0A, + 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x6A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, + 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4E, 0x43, 0x6B, 0x43, 0x58, 0x4A, 0x50, 0x51, 0x49, 0x67, 0x53, 0x59, 0x54, 0x34, 0x31, 0x49, 0x35, 0x37, 0x75, 0x0A, 0x39, 0x6E, 0x54, + 0x50, 0x4C, 0x33, 0x74, 0x59, 0x50, 0x63, 0x34, 0x38, 0x44, 0x52, 0x41, 0x6F, 0x6B, 0x43, 0x2B, 0x58, 0x39, 0x34, 0x78, 0x49, 0x32, 0x4B, 0x44, 0x59, 0x4A, 0x62, 0x46, 0x4D, 0x73, 0x42, 0x46, 0x4D, 0x46, 0x33, 0x4E, 0x51, 0x30, 0x43, 0x4A, + 0x4B, 0x59, 0x37, 0x75, 0x42, 0x30, 0x79, 0x6C, 0x75, 0x31, 0x62, 0x55, 0x4A, 0x50, 0x69, 0x59, 0x59, 0x66, 0x37, 0x49, 0x53, 0x66, 0x35, 0x4F, 0x59, 0x74, 0x36, 0x2F, 0x77, 0x4E, 0x72, 0x2F, 0x79, 0x0A, 0x37, 0x68, 0x69, 0x65, 0x6E, 0x44, + 0x74, 0x53, 0x78, 0x55, 0x63, 0x5A, 0x58, 0x58, 0x54, 0x7A, 0x5A, 0x47, 0x62, 0x56, 0x58, 0x63, 0x64, 0x6F, 0x74, 0x4C, 0x38, 0x62, 0x48, 0x41, 0x61, 0x6A, 0x76, 0x49, 0x39, 0x41, 0x49, 0x37, 0x59, 0x65, 0x78, 0x6F, 0x53, 0x39, 0x55, 0x63, + 0x51, 0x62, 0x4F, 0x63, 0x47, 0x56, 0x30, 0x69, 0x6E, 0x73, 0x53, 0x36, 0x35, 0x37, 0x4C, 0x62, 0x38, 0x35, 0x2F, 0x62, 0x52, 0x69, 0x33, 0x70, 0x5A, 0x37, 0x51, 0x63, 0x61, 0x63, 0x0A, 0x6F, 0x4F, 0x41, 0x47, 0x63, 0x76, 0x76, 0x77, 0x42, + 0x35, 0x63, 0x4A, 0x4F, 0x59, 0x46, 0x30, 0x72, 0x2F, 0x63, 0x30, 0x57, 0x52, 0x46, 0x58, 0x43, 0x73, 0x4A, 0x62, 0x77, 0x53, 0x54, 0x30, 0x4D, 0x58, 0x4D, 0x77, 0x67, 0x73, 0x61, 0x64, 0x75, 0x67, 0x4C, 0x33, 0x50, 0x6E, 0x78, 0x45, 0x58, + 0x34, 0x4D, 0x4E, 0x38, 0x2F, 0x48, 0x64, 0x49, 0x47, 0x6B, 0x57, 0x43, 0x56, 0x44, 0x69, 0x31, 0x46, 0x57, 0x32, 0x34, 0x49, 0x42, 0x79, 0x64, 0x6D, 0x35, 0x4D, 0x0A, 0x52, 0x37, 0x64, 0x31, 0x56, 0x56, 0x6D, 0x30, 0x55, 0x33, 0x54, 0x5A, + 0x6C, 0x4D, 0x5A, 0x42, 0x72, 0x56, 0x69, 0x4B, 0x4D, 0x57, 0x59, 0x50, 0x48, 0x71, 0x49, 0x62, 0x4B, 0x55, 0x42, 0x4F, 0x4C, 0x39, 0x39, 0x37, 0x35, 0x68, 0x59, 0x73, 0x4C, 0x66, 0x79, 0x2F, 0x37, 0x50, 0x4F, 0x30, 0x2B, 0x72, 0x34, 0x59, + 0x39, 0x70, 0x74, 0x4A, 0x31, 0x4F, 0x34, 0x46, 0x62, 0x74, 0x6B, 0x30, 0x38, 0x35, 0x7A, 0x78, 0x37, 0x41, 0x47, 0x4C, 0x30, 0x53, 0x44, 0x47, 0x0A, 0x44, 0x36, 0x43, 0x31, 0x76, 0x42, 0x64, 0x4F, 0x53, 0x48, 0x74, 0x52, 0x77, 0x76, 0x7A, + 0x70, 0x58, 0x47, 0x6B, 0x33, 0x52, 0x32, 0x61, 0x7A, 0x61, 0x50, 0x67, 0x56, 0x4B, 0x50, 0x43, 0x35, 0x30, 0x36, 0x51, 0x56, 0x7A, 0x46, 0x70, 0x50, 0x75, 0x6C, 0x4A, 0x77, 0x6F, 0x78, 0x4A, 0x46, 0x33, 0x63, 0x61, 0x36, 0x54, 0x76, 0x76, + 0x43, 0x30, 0x50, 0x65, 0x6F, 0x55, 0x69, 0x64, 0x74, 0x62, 0x6E, 0x6D, 0x31, 0x6A, 0x50, 0x78, 0x37, 0x6A, 0x4D, 0x45, 0x57, 0x0A, 0x54, 0x4F, 0x36, 0x41, 0x66, 0x37, 0x37, 0x77, 0x64, 0x72, 0x35, 0x42, 0x55, 0x78, 0x49, 0x7A, 0x72, 0x6C, + 0x6F, 0x34, 0x51, 0x71, 0x76, 0x58, 0x44, 0x7A, 0x35, 0x42, 0x6A, 0x58, 0x59, 0x48, 0x4D, 0x74, 0x57, 0x72, 0x69, 0x66, 0x5A, 0x4F, 0x5A, 0x39, 0x6D, 0x78, 0x51, 0x6E, 0x55, 0x6A, 0x62, 0x76, 0x50, 0x4E, 0x51, 0x72, 0x4C, 0x38, 0x56, 0x66, + 0x56, 0x54, 0x68, 0x78, 0x63, 0x37, 0x77, 0x44, 0x4E, 0x59, 0x38, 0x56, 0x4C, 0x53, 0x2B, 0x59, 0x43, 0x6B, 0x0A, 0x38, 0x4F, 0x6A, 0x77, 0x4F, 0x34, 0x73, 0x34, 0x7A, 0x4B, 0x54, 0x47, 0x6B, 0x48, 0x38, 0x50, 0x6E, 0x50, 0x32, 0x4C, 0x30, + 0x61, 0x50, 0x50, 0x32, 0x6F, 0x4F, 0x6E, 0x61, 0x63, 0x6C, 0x51, 0x4E, 0x74, 0x56, 0x63, 0x42, 0x64, 0x49, 0x4B, 0x51, 0x58, 0x54, 0x62, 0x59, 0x78, 0x45, 0x33, 0x77, 0x61, 0x57, 0x67, 0x6C, 0x6B, 0x73, 0x65, 0x6A, 0x42, 0x59, 0x53, 0x64, + 0x36, 0x36, 0x55, 0x4E, 0x48, 0x73, 0x65, 0x66, 0x38, 0x4A, 0x6D, 0x41, 0x4F, 0x53, 0x71, 0x0A, 0x67, 0x2B, 0x71, 0x4B, 0x6B, 0x4B, 0x33, 0x4F, 0x4E, 0x6B, 0x52, 0x4E, 0x30, 0x56, 0x48, 0x70, 0x76, 0x42, 0x2F, 0x7A, 0x61, 0x67, 0x58, 0x39, + 0x77, 0x48, 0x51, 0x66, 0x4A, 0x52, 0x6C, 0x41, 0x55, 0x57, 0x37, 0x71, 0x67, 0x6C, 0x46, 0x41, 0x33, 0x35, 0x75, 0x35, 0x43, 0x43, 0x6F, 0x47, 0x41, 0x74, 0x55, 0x6A, 0x48, 0x42, 0x50, 0x57, 0x36, 0x64, 0x76, 0x62, 0x78, 0x72, 0x42, 0x36, + 0x79, 0x33, 0x73, 0x6E, 0x6D, 0x2F, 0x76, 0x67, 0x31, 0x55, 0x59, 0x6B, 0x0A, 0x37, 0x52, 0x42, 0x4C, 0x59, 0x30, 0x75, 0x6C, 0x42, 0x59, 0x2B, 0x36, 0x75, 0x42, 0x30, 0x72, 0x70, 0x76, 0x71, 0x52, 0x34, 0x70, 0x4A, 0x53, 0x76, 0x65, 0x7A, + 0x72, 0x5A, 0x35, 0x64, 0x74, 0x6D, 0x69, 0x32, 0x66, 0x67, 0x54, 0x49, 0x46, 0x5A, 0x7A, 0x4C, 0x37, 0x53, 0x41, 0x67, 0x2F, 0x32, 0x53, 0x57, 0x34, 0x42, 0x43, 0x55, 0x76, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, + 0x68, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x0A, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, + 0x41, 0x55, 0x2B, 0x79, 0x34, 0x33, 0x37, 0x75, 0x4F, 0x45, 0x65, 0x69, 0x63, 0x75, 0x7A, 0x52, 0x6B, 0x31, 0x73, 0x54, 0x4E, 0x38, 0x2F, 0x39, 0x52, 0x45, 0x51, 0x72, 0x6B, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, + 0x59, 0x45, 0x46, 0x50, 0x73, 0x75, 0x0A, 0x4E, 0x2B, 0x37, 0x6A, 0x68, 0x48, 0x6F, 0x6E, 0x4C, 0x73, 0x30, 0x5A, 0x4E, 0x62, 0x45, 0x7A, 0x66, 0x50, 0x2F, 0x55, 0x52, 0x45, 0x4B, 0x35, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, + 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x6A, + 0x59, 0x6C, 0x74, 0x0A, 0x68, 0x45, 0x55, 0x59, 0x38, 0x55, 0x2B, 0x7A, 0x6F, 0x4F, 0x39, 0x6F, 0x70, 0x4D, 0x41, 0x64, 0x72, 0x44, 0x43, 0x38, 0x5A, 0x32, 0x61, 0x77, 0x6D, 0x73, 0x32, 0x32, 0x71, 0x79, 0x49, 0x5A, 0x5A, 0x74, 0x4D, 0x37, + 0x51, 0x62, 0x55, 0x51, 0x6E, 0x52, 0x43, 0x36, 0x63, 0x6D, 0x34, 0x70, 0x4A, 0x43, 0x41, 0x63, 0x41, 0x5A, 0x6C, 0x69, 0x30, 0x35, 0x62, 0x67, 0x34, 0x76, 0x73, 0x4D, 0x51, 0x74, 0x66, 0x68, 0x57, 0x73, 0x53, 0x57, 0x54, 0x56, 0x54, 0x4E, + 0x0A, 0x6A, 0x38, 0x70, 0x44, 0x55, 0x2F, 0x30, 0x71, 0x75, 0x4F, 0x72, 0x34, 0x5A, 0x63, 0x6F, 0x42, 0x77, 0x71, 0x31, 0x67, 0x61, 0x41, 0x61, 0x66, 0x4F, 0x52, 0x70, 0x52, 0x32, 0x65, 0x43, 0x4E, 0x4A, 0x76, 0x6B, 0x4C, 0x54, 0x71, 0x56, + 0x54, 0x4A, 0x58, 0x6F, 0x6A, 0x70, 0x42, 0x7A, 0x4F, 0x43, 0x42, 0x76, 0x66, 0x52, 0x34, 0x69, 0x79, 0x72, 0x54, 0x37, 0x67, 0x4A, 0x34, 0x65, 0x4C, 0x53, 0x59, 0x77, 0x66, 0x71, 0x55, 0x64, 0x59, 0x65, 0x35, 0x62, 0x79, 0x0A, 0x69, 0x42, + 0x30, 0x59, 0x72, 0x72, 0x50, 0x52, 0x70, 0x67, 0x71, 0x55, 0x2B, 0x74, 0x76, 0x54, 0x35, 0x54, 0x67, 0x4B, 0x61, 0x33, 0x6B, 0x53, 0x4D, 0x2F, 0x74, 0x4B, 0x57, 0x54, 0x63, 0x57, 0x51, 0x41, 0x36, 0x37, 0x33, 0x76, 0x57, 0x4A, 0x44, 0x50, + 0x46, 0x73, 0x30, 0x2F, 0x64, 0x52, 0x61, 0x31, 0x34, 0x31, 0x39, 0x64, 0x76, 0x41, 0x4A, 0x75, 0x6F, 0x53, 0x63, 0x30, 0x36, 0x70, 0x6B, 0x5A, 0x43, 0x6D, 0x46, 0x38, 0x4E, 0x73, 0x4C, 0x7A, 0x6A, 0x55, 0x0A, 0x6F, 0x33, 0x4B, 0x55, 0x51, + 0x79, 0x78, 0x69, 0x34, 0x55, 0x35, 0x63, 0x4D, 0x6A, 0x32, 0x39, 0x54, 0x48, 0x30, 0x5A, 0x52, 0x36, 0x4C, 0x44, 0x53, 0x65, 0x65, 0x57, 0x50, 0x34, 0x2B, 0x61, 0x30, 0x7A, 0x76, 0x6B, 0x45, 0x64, 0x69, 0x4C, 0x41, 0x39, 0x7A, 0x32, 0x74, + 0x6D, 0x42, 0x56, 0x47, 0x4B, 0x61, 0x42, 0x55, 0x66, 0x50, 0x68, 0x71, 0x42, 0x56, 0x71, 0x36, 0x2B, 0x41, 0x4C, 0x38, 0x42, 0x51, 0x78, 0x31, 0x72, 0x6D, 0x4D, 0x52, 0x54, 0x71, 0x6F, 0x0A, 0x45, 0x4E, 0x6A, 0x77, 0x75, 0x53, 0x66, 0x72, + 0x39, 0x38, 0x74, 0x36, 0x37, 0x77, 0x56, 0x79, 0x6C, 0x72, 0x58, 0x45, 0x6A, 0x35, 0x5A, 0x7A, 0x78, 0x4F, 0x68, 0x57, 0x63, 0x35, 0x79, 0x38, 0x61, 0x56, 0x46, 0x6A, 0x76, 0x4F, 0x39, 0x6E, 0x48, 0x45, 0x4D, 0x61, 0x58, 0x33, 0x63, 0x5A, + 0x48, 0x78, 0x6A, 0x34, 0x48, 0x43, 0x55, 0x70, 0x2B, 0x55, 0x6D, 0x5A, 0x4B, 0x62, 0x61, 0x53, 0x50, 0x61, 0x4B, 0x44, 0x4E, 0x37, 0x45, 0x67, 0x6B, 0x61, 0x69, 0x62, 0x0A, 0x4D, 0x4F, 0x6C, 0x71, 0x62, 0x4C, 0x51, 0x6A, 0x6B, 0x32, 0x55, + 0x45, 0x71, 0x78, 0x48, 0x7A, 0x44, 0x68, 0x31, 0x54, 0x4A, 0x45, 0x6C, 0x54, 0x48, 0x61, 0x45, 0x2F, 0x6E, 0x55, 0x69, 0x53, 0x45, 0x65, 0x4A, 0x39, 0x44, 0x55, 0x2F, 0x31, 0x31, 0x37, 0x32, 0x69, 0x57, 0x44, 0x35, 0x34, 0x6E, 0x52, 0x34, + 0x66, 0x4B, 0x2F, 0x34, 0x68, 0x75, 0x78, 0x6F, 0x54, 0x74, 0x72, 0x45, 0x6F, 0x5A, 0x50, 0x32, 0x77, 0x41, 0x67, 0x44, 0x48, 0x62, 0x49, 0x43, 0x69, 0x0A, 0x76, 0x52, 0x5A, 0x51, 0x49, 0x41, 0x39, 0x79, 0x67, 0x56, 0x2F, 0x4D, 0x6C, 0x50, + 0x2B, 0x37, 0x6D, 0x65, 0x61, 0x36, 0x6B, 0x4D, 0x76, 0x71, 0x2B, 0x63, 0x59, 0x4D, 0x77, 0x71, 0x37, 0x46, 0x47, 0x63, 0x34, 0x7A, 0x6F, 0x57, 0x74, 0x63, 0x75, 0x33, 0x35, 0x38, 0x4E, 0x46, 0x63, 0x58, 0x72, 0x66, 0x41, 0x2F, 0x72, 0x73, + 0x33, 0x71, 0x72, 0x35, 0x6E, 0x73, 0x4C, 0x46, 0x52, 0x2B, 0x6A, 0x4D, 0x34, 0x75, 0x45, 0x6C, 0x5A, 0x49, 0x37, 0x78, 0x63, 0x37, 0x0A, 0x50, 0x30, 0x70, 0x65, 0x59, 0x4E, 0x4C, 0x63, 0x64, 0x44, 0x61, 0x38, 0x70, 0x55, 0x4E, 0x6A, 0x79, + 0x77, 0x39, 0x62, 0x6F, 0x77, 0x4A, 0x57, 0x43, 0x5A, 0x34, 0x6B, 0x4C, 0x4F, 0x47, 0x47, 0x67, 0x59, 0x7A, 0x2B, 0x71, 0x78, 0x63, 0x73, 0x2B, 0x73, 0x6A, 0x69, 0x4D, 0x68, 0x6F, 0x36, 0x2F, 0x34, 0x55, 0x49, 0x79, 0x59, 0x4F, 0x66, 0x38, + 0x6B, 0x70, 0x49, 0x45, 0x46, 0x52, 0x33, 0x4E, 0x2B, 0x32, 0x69, 0x76, 0x45, 0x43, 0x2B, 0x35, 0x42, 0x42, 0x30, 0x0A, 0x39, 0x2B, 0x52, 0x62, 0x75, 0x37, 0x6E, 0x7A, 0x69, 0x66, 0x6D, 0x50, 0x51, 0x64, 0x6A, 0x48, 0x35, 0x46, 0x43, 0x51, + 0x4E, 0x59, 0x41, 0x2B, 0x48, 0x4C, 0x68, 0x4E, 0x6B, 0x4E, 0x50, 0x55, 0x39, 0x38, 0x4F, 0x77, 0x6F, 0x58, 0x36, 0x45, 0x79, 0x6E, 0x65, 0x53, 0x4D, 0x53, 0x79, 0x34, 0x6B, 0x4C, 0x47, 0x43, 0x65, 0x6E, 0x52, 0x4F, 0x6D, 0x78, 0x4D, 0x6D, + 0x74, 0x4E, 0x56, 0x51, 0x5A, 0x6C, 0x52, 0x34, 0x72, 0x6D, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, + 0x53, 0x53, 0x4C, 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4F, 0x6A, 0x43, 0x43, 0x41, 0x63, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x46, 0x41, 0x50, 0x31, 0x71, 0x2F, 0x73, 0x33, 0x69, 0x78, 0x64, 0x41, 0x57, 0x2B, + 0x4A, 0x44, 0x73, 0x71, 0x58, 0x52, 0x78, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x4F, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, + 0x4A, 0x56, 0x0A, 0x55, 0x7A, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x50, 0x55, 0x31, 0x4E, 0x4D, 0x49, 0x45, 0x4E, 0x76, 0x63, 0x6E, 0x42, 0x76, 0x63, 0x6D, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4D, + 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x78, 0x54, 0x55, 0x30, 0x77, 0x75, 0x59, 0x32, 0x39, 0x74, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x0A, + 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x79, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x54, 0x45, 0x32, 0x4D, 0x7A, 0x4D, 0x30, 0x4F, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x32, + 0x4D, 0x44, 0x67, 0x78, 0x4F, 0x54, 0x45, 0x32, 0x4D, 0x7A, 0x4D, 0x30, 0x4E, 0x31, 0x6F, 0x77, 0x54, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x56, 0x56, 0x4D, 0x78, 0x0A, 0x47, 0x44, 0x41, + 0x57, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x44, 0x31, 0x4E, 0x54, 0x54, 0x43, 0x42, 0x44, 0x62, 0x33, 0x4A, 0x77, 0x62, 0x33, 0x4A, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6A, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x41, 0x77, 0x77, 0x63, 0x55, 0x31, 0x4E, 0x4D, 0x4C, 0x6D, 0x4E, 0x76, 0x62, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x0A, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, + 0x41, 0x79, 0x4D, 0x6A, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x45, 0x55, 0x70, 0x4E, 0x58, + 0x50, 0x36, 0x77, 0x72, 0x67, 0x6A, 0x7A, 0x68, 0x52, 0x39, 0x71, 0x4C, 0x46, 0x4E, 0x6F, 0x46, 0x73, 0x32, 0x37, 0x69, 0x6F, 0x73, 0x55, 0x38, 0x4E, 0x67, 0x43, 0x54, 0x57, 0x79, 0x0A, 0x4A, 0x47, 0x59, 0x6D, 0x61, 0x63, 0x43, 0x7A, 0x6C, + 0x64, 0x5A, 0x64, 0x6B, 0x6B, 0x41, 0x5A, 0x44, 0x73, 0x61, 0x6C, 0x45, 0x33, 0x44, 0x30, 0x37, 0x78, 0x4A, 0x52, 0x4B, 0x46, 0x33, 0x6E, 0x7A, 0x4C, 0x33, 0x35, 0x50, 0x49, 0x58, 0x42, 0x7A, 0x35, 0x53, 0x51, 0x79, 0x53, 0x76, 0x4F, 0x6B, + 0x6B, 0x4A, 0x59, 0x57, 0x57, 0x66, 0x39, 0x6C, 0x43, 0x63, 0x51, 0x5A, 0x49, 0x78, 0x50, 0x42, 0x4C, 0x46, 0x4E, 0x53, 0x65, 0x52, 0x37, 0x54, 0x35, 0x76, 0x31, 0x0A, 0x35, 0x77, 0x6A, 0x34, 0x41, 0x34, 0x6A, 0x33, 0x70, 0x38, 0x4F, 0x53, + 0x53, 0x78, 0x6C, 0x55, 0x67, 0x61, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, + 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x53, 0x4A, 0x6A, 0x79, 0x2B, 0x6A, 0x36, 0x43, 0x75, 0x67, 0x46, 0x46, 0x52, 0x37, 0x0A, 0x38, 0x31, 0x61, 0x34, 0x4A, 0x6C, 0x39, 0x6E, 0x4F, 0x41, 0x75, 0x63, 0x30, 0x44, 0x41, + 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x69, 0x59, 0x38, 0x76, 0x6F, 0x2B, 0x67, 0x72, 0x6F, 0x42, 0x52, 0x55, 0x65, 0x2F, 0x4E, 0x57, 0x75, 0x43, 0x5A, 0x66, 0x5A, 0x7A, 0x67, 0x4C, 0x6E, 0x4E, 0x41, + 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x0A, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, + 0x67, 0x41, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x46, 0x58, 0x6A, 0x49, 0x6C, 0x62, 0x70, 0x31, 0x35, 0x49, 0x6B, 0x57, 0x45, 0x38, 0x65, 0x6C, 0x44, 0x49, 0x50, 0x44, 0x41, 0x49, 0x32, 0x77, 0x76, 0x32, 0x73, 0x64, 0x44, 0x4A, 0x4F, 0x34, 0x66, + 0x73, 0x63, 0x67, 0x49, 0x69, 0x6A, 0x7A, 0x50, 0x76, 0x58, 0x36, 0x79, 0x76, 0x2F, 0x4E, 0x33, 0x33, 0x77, 0x0A, 0x37, 0x64, 0x65, 0x65, 0x64, 0x57, 0x6F, 0x31, 0x64, 0x6C, 0x4A, 0x46, 0x34, 0x41, 0x49, 0x78, 0x41, 0x4D, 0x65, 0x4E, 0x62, + 0x30, 0x49, 0x67, 0x6A, 0x37, 0x36, 0x32, 0x54, 0x56, 0x6E, 0x74, 0x64, 0x30, 0x30, 0x70, 0x78, 0x43, 0x41, 0x67, 0x52, 0x57, 0x53, 0x47, 0x4F, 0x6C, 0x44, 0x47, 0x78, 0x4B, 0x30, 0x74, 0x6B, 0x2F, 0x55, 0x59, 0x66, 0x58, 0x4C, 0x74, 0x71, + 0x63, 0x2F, 0x45, 0x72, 0x46, 0x63, 0x32, 0x4B, 0x41, 0x68, 0x6C, 0x33, 0x7A, 0x78, 0x35, 0x0A, 0x5A, 0x6E, 0x36, 0x67, 0x36, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x74, 0x6F, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x45, 0x43, 0x43, + 0x20, 0x54, 0x4C, 0x53, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, + 0x46, 0x54, 0x43, 0x43, 0x41, 0x5A, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x50, 0x5A, 0x67, 0x37, 0x70, 0x6D, 0x59, 0x39, 0x6B, 0x47, 0x50, 0x33, 0x66, 0x69, 0x5A, 0x58, 0x4F, 0x41, 0x54, 0x76, 0x41, 0x44, 0x41, 0x4B, + 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x4D, 0x4D, 0x53, 0x34, 0x77, 0x4C, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x56, 0x42, 0x0A, 0x64, 0x47, 0x39, 0x7A, 0x49, 0x46, 0x52, + 0x79, 0x64, 0x58, 0x4E, 0x30, 0x5A, 0x57, 0x52, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x41, 0x79, 0x4D, 0x44, 0x49, + 0x78, 0x4D, 0x51, 0x30, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x52, 0x42, 0x64, 0x47, 0x39, 0x7A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x0A, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x45, 0x52, 0x54, + 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x54, 0x41, 0x30, 0x4D, 0x6A, 0x49, 0x77, 0x4F, 0x54, 0x49, 0x32, 0x4D, 0x6A, 0x4E, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x54, 0x41, 0x30, 0x4D, 0x54, 0x63, 0x77, 0x4F, 0x54, 0x49, 0x32, 0x4D, 0x6A, + 0x4A, 0x61, 0x4D, 0x45, 0x77, 0x78, 0x4C, 0x6A, 0x41, 0x73, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4A, 0x55, 0x46, 0x30, 0x62, 0x33, 0x4D, 0x67, 0x0A, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x6C, 0x5A, 0x46, 0x4A, 0x76, 0x62, + 0x33, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x56, 0x45, 0x78, 0x54, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x6A, 0x45, 0x78, 0x44, 0x54, 0x41, 0x4C, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x6F, 0x4D, 0x42, 0x45, 0x46, 0x30, 0x62, 0x33, 0x4D, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x0A, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x48, 0x59, 0x77, 0x45, 0x41, 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49, + 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x46, 0x4B, 0x34, 0x45, 0x45, 0x41, 0x43, 0x49, 0x44, 0x59, 0x67, 0x41, 0x45, 0x6C, 0x6F, 0x5A, 0x59, 0x4B, 0x44, 0x63, 0x4B, 0x5A, 0x39, 0x43, 0x67, 0x33, 0x69, 0x51, 0x5A, 0x47, 0x65, 0x48, 0x6B, + 0x42, 0x51, 0x63, 0x66, 0x6C, 0x2B, 0x33, 0x6F, 0x5A, 0x49, 0x4B, 0x35, 0x39, 0x73, 0x52, 0x78, 0x55, 0x4D, 0x36, 0x4B, 0x0A, 0x44, 0x50, 0x2F, 0x58, 0x74, 0x58, 0x61, 0x37, 0x6F, 0x57, 0x79, 0x54, 0x62, 0x49, 0x4F, 0x69, 0x61, 0x47, 0x36, + 0x6C, 0x32, 0x62, 0x34, 0x73, 0x69, 0x4A, 0x56, 0x42, 0x7A, 0x56, 0x33, 0x64, 0x73, 0x63, 0x71, 0x44, 0x59, 0x34, 0x50, 0x4D, 0x77, 0x4C, 0x35, 0x30, 0x32, 0x65, 0x43, 0x64, 0x70, 0x4F, 0x35, 0x4B, 0x54, 0x6C, 0x62, 0x67, 0x6D, 0x43, 0x6C, + 0x42, 0x6B, 0x31, 0x49, 0x51, 0x31, 0x53, 0x51, 0x34, 0x41, 0x6A, 0x4A, 0x6E, 0x38, 0x5A, 0x51, 0x53, 0x0A, 0x62, 0x2B, 0x2F, 0x58, 0x78, 0x64, 0x34, 0x75, 0x2F, 0x52, 0x6D, 0x41, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, + 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x32, 0x4B, 0x43, 0x58, 0x57, 0x66, 0x65, + 0x42, 0x6D, 0x6D, 0x6E, 0x6F, 0x4A, 0x73, 0x6D, 0x6F, 0x37, 0x6A, 0x6A, 0x50, 0x58, 0x0A, 0x4E, 0x74, 0x4E, 0x50, 0x6F, 0x6A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, + 0x59, 0x59, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x44, 0x61, 0x41, 0x41, 0x77, 0x5A, 0x51, 0x49, 0x77, 0x57, 0x35, 0x6B, 0x70, 0x38, 0x35, 0x77, 0x78, 0x74, 0x6F, 0x6C, 0x72, 0x62, + 0x4E, 0x61, 0x39, 0x64, 0x2B, 0x46, 0x38, 0x35, 0x31, 0x46, 0x2B, 0x0A, 0x75, 0x44, 0x72, 0x4E, 0x6F, 0x7A, 0x5A, 0x66, 0x66, 0x50, 0x63, 0x38, 0x64, 0x7A, 0x37, 0x6B, 0x55, 0x4B, 0x32, 0x6F, 0x35, 0x39, 0x4A, 0x5A, 0x44, 0x43, 0x61, 0x4F, + 0x4D, 0x44, 0x74, 0x75, 0x43, 0x43, 0x72, 0x43, 0x70, 0x31, 0x72, 0x49, 0x41, 0x6A, 0x45, 0x41, 0x6D, 0x65, 0x4D, 0x4D, 0x35, 0x36, 0x50, 0x44, 0x72, 0x39, 0x4E, 0x4A, 0x4C, 0x6B, 0x61, 0x43, 0x49, 0x32, 0x5A, 0x64, 0x79, 0x51, 0x41, 0x55, + 0x45, 0x76, 0x30, 0x34, 0x39, 0x4F, 0x47, 0x59, 0x0A, 0x61, 0x33, 0x63, 0x70, 0x65, 0x74, 0x73, 0x6B, 0x7A, 0x32, 0x56, 0x41, 0x76, 0x39, 0x4C, 0x63, 0x6A, 0x42, 0x48, 0x6F, 0x39, 0x48, 0x31, 0x2F, 0x49, 0x49, 0x53, 0x70, 0x51, 0x75, 0x51, + 0x6F, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x41, 0x74, 0x6F, 0x73, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x52, 0x53, 0x41, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x5A, 0x44, 0x43, 0x43, 0x41, 0x30, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x55, 0x39, 0x58, 0x50, 0x35, 0x68, 0x6D, + 0x54, 0x43, 0x2F, 0x73, 0x72, 0x42, 0x52, 0x4C, 0x59, 0x77, 0x69, 0x71, 0x69, 0x70, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x4D, 0x4D, 0x53, 0x34, + 0x77, 0x4C, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0A, 0x44, 0x43, 0x56, 0x42, 0x64, 0x47, 0x39, 0x7A, 0x49, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x5A, 0x57, 0x52, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, + 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x78, 0x4D, 0x51, 0x30, 0x77, 0x43, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x41, 0x52, 0x42, 0x64, 0x47, + 0x39, 0x7A, 0x4D, 0x51, 0x73, 0x77, 0x0A, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x45, 0x52, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x54, 0x41, 0x30, 0x4D, 0x6A, 0x49, 0x77, 0x4F, 0x54, 0x49, 0x78, 0x4D, + 0x54, 0x42, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x54, 0x41, 0x30, 0x4D, 0x54, 0x63, 0x77, 0x4F, 0x54, 0x49, 0x78, 0x4D, 0x44, 0x6C, 0x61, 0x4D, 0x45, 0x77, 0x78, 0x4C, 0x6A, 0x41, 0x73, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x4A, + 0x55, 0x46, 0x30, 0x0A, 0x62, 0x33, 0x4D, 0x67, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x6C, 0x5A, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, + 0x56, 0x45, 0x78, 0x54, 0x49, 0x44, 0x49, 0x77, 0x4D, 0x6A, 0x45, 0x78, 0x44, 0x54, 0x41, 0x4C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x42, 0x45, 0x46, 0x30, 0x62, 0x33, 0x4D, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, + 0x0A, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x52, 0x46, 0x4D, 0x49, 0x49, 0x43, 0x49, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x38, + 0x41, 0x4D, 0x49, 0x49, 0x43, 0x43, 0x67, 0x4B, 0x43, 0x41, 0x67, 0x45, 0x41, 0x74, 0x6F, 0x41, 0x4F, 0x78, 0x48, 0x6D, 0x39, 0x42, 0x59, 0x78, 0x39, 0x73, 0x4B, 0x4F, 0x64, 0x54, 0x53, 0x4A, 0x4E, 0x79, 0x2F, 0x42, 0x42, 0x0A, 0x6C, 0x30, + 0x31, 0x5A, 0x34, 0x4E, 0x48, 0x2B, 0x56, 0x6F, 0x79, 0x58, 0x38, 0x74, 0x65, 0x39, 0x6A, 0x32, 0x79, 0x33, 0x49, 0x34, 0x39, 0x66, 0x31, 0x63, 0x54, 0x59, 0x51, 0x63, 0x76, 0x79, 0x41, 0x68, 0x35, 0x78, 0x35, 0x65, 0x6E, 0x32, 0x58, 0x73, + 0x73, 0x49, 0x4B, 0x6C, 0x34, 0x77, 0x38, 0x69, 0x31, 0x6D, 0x78, 0x34, 0x51, 0x62, 0x5A, 0x46, 0x63, 0x34, 0x6E, 0x58, 0x55, 0x74, 0x56, 0x73, 0x59, 0x76, 0x59, 0x65, 0x2B, 0x57, 0x2F, 0x43, 0x42, 0x47, 0x0A, 0x76, 0x65, 0x76, 0x55, 0x65, + 0x7A, 0x38, 0x2F, 0x66, 0x45, 0x63, 0x34, 0x42, 0x4B, 0x6B, 0x62, 0x71, 0x6C, 0x4C, 0x66, 0x45, 0x7A, 0x66, 0x54, 0x46, 0x52, 0x56, 0x4F, 0x76, 0x56, 0x39, 0x38, 0x72, 0x36, 0x31, 0x6A, 0x78, 0x33, 0x6E, 0x63, 0x43, 0x48, 0x76, 0x56, 0x6F, + 0x4F, 0x58, 0x33, 0x57, 0x33, 0x57, 0x73, 0x67, 0x46, 0x57, 0x5A, 0x6B, 0x6D, 0x47, 0x62, 0x7A, 0x53, 0x6F, 0x58, 0x66, 0x64, 0x75, 0x50, 0x39, 0x4C, 0x56, 0x71, 0x36, 0x68, 0x64, 0x4B, 0x0A, 0x5A, 0x43, 0x68, 0x6D, 0x46, 0x53, 0x6C, 0x73, + 0x41, 0x76, 0x46, 0x72, 0x31, 0x62, 0x71, 0x6A, 0x4D, 0x39, 0x78, 0x61, 0x5A, 0x36, 0x63, 0x46, 0x34, 0x72, 0x39, 0x6C, 0x74, 0x68, 0x61, 0x77, 0x45, 0x4F, 0x33, 0x4E, 0x55, 0x44, 0x50, 0x4A, 0x63, 0x46, 0x44, 0x73, 0x47, 0x59, 0x36, 0x77, + 0x78, 0x2F, 0x4A, 0x30, 0x57, 0x32, 0x74, 0x45, 0x78, 0x6E, 0x32, 0x57, 0x75, 0x5A, 0x67, 0x49, 0x57, 0x57, 0x62, 0x65, 0x4B, 0x51, 0x47, 0x62, 0x39, 0x43, 0x70, 0x74, 0x0A, 0x30, 0x78, 0x55, 0x36, 0x6B, 0x47, 0x70, 0x6E, 0x38, 0x62, 0x52, + 0x72, 0x5A, 0x74, 0x6B, 0x68, 0x36, 0x38, 0x72, 0x5A, 0x59, 0x6E, 0x78, 0x47, 0x45, 0x46, 0x7A, 0x65, 0x64, 0x55, 0x6C, 0x6E, 0x6E, 0x6B, 0x4C, 0x35, 0x2F, 0x6E, 0x57, 0x70, 0x6F, 0x36, 0x33, 0x2F, 0x64, 0x67, 0x70, 0x6E, 0x51, 0x4F, 0x50, + 0x46, 0x39, 0x34, 0x33, 0x48, 0x68, 0x5A, 0x70, 0x5A, 0x6E, 0x6D, 0x4B, 0x61, 0x61, 0x75, 0x31, 0x46, 0x68, 0x35, 0x68, 0x6E, 0x73, 0x74, 0x56, 0x4B, 0x0A, 0x50, 0x4E, 0x65, 0x30, 0x4F, 0x77, 0x41, 0x4E, 0x77, 0x49, 0x38, 0x66, 0x34, 0x55, + 0x44, 0x45, 0x72, 0x6D, 0x77, 0x68, 0x33, 0x45, 0x6C, 0x2B, 0x66, 0x73, 0x71, 0x79, 0x6A, 0x57, 0x32, 0x32, 0x76, 0x35, 0x4D, 0x76, 0x6F, 0x56, 0x77, 0x2B, 0x6A, 0x38, 0x72, 0x74, 0x67, 0x49, 0x35, 0x59, 0x34, 0x64, 0x74, 0x58, 0x7A, 0x34, + 0x55, 0x32, 0x4F, 0x4C, 0x4A, 0x78, 0x70, 0x41, 0x6D, 0x4D, 0x6B, 0x6F, 0x6B, 0x49, 0x69, 0x45, 0x6A, 0x78, 0x51, 0x47, 0x4D, 0x59, 0x0A, 0x73, 0x6C, 0x75, 0x4D, 0x57, 0x75, 0x50, 0x44, 0x30, 0x78, 0x65, 0x71, 0x71, 0x78, 0x6D, 0x6A, 0x4C, + 0x42, 0x76, 0x6B, 0x31, 0x63, 0x62, 0x69, 0x5A, 0x6E, 0x72, 0x58, 0x67, 0x68, 0x6D, 0x6D, 0x4F, 0x78, 0x59, 0x73, 0x4C, 0x33, 0x47, 0x48, 0x58, 0x30, 0x57, 0x65, 0x6C, 0x58, 0x4F, 0x54, 0x77, 0x6B, 0x4B, 0x42, 0x49, 0x52, 0x4F, 0x57, 0x31, + 0x35, 0x32, 0x37, 0x6B, 0x32, 0x67, 0x56, 0x2B, 0x70, 0x32, 0x6B, 0x48, 0x59, 0x7A, 0x79, 0x67, 0x65, 0x42, 0x59, 0x0A, 0x42, 0x72, 0x33, 0x4A, 0x74, 0x75, 0x50, 0x32, 0x69, 0x56, 0x32, 0x4A, 0x2B, 0x61, 0x78, 0x45, 0x6F, 0x63, 0x74, 0x72, + 0x2B, 0x68, 0x62, 0x78, 0x78, 0x31, 0x41, 0x39, 0x4A, 0x4E, 0x72, 0x33, 0x77, 0x2B, 0x53, 0x48, 0x31, 0x56, 0x62, 0x78, 0x54, 0x35, 0x41, 0x77, 0x2B, 0x6B, 0x55, 0x4A, 0x57, 0x64, 0x6F, 0x30, 0x7A, 0x75, 0x41, 0x54, 0x48, 0x41, 0x52, 0x38, + 0x41, 0x4E, 0x53, 0x62, 0x68, 0x71, 0x52, 0x41, 0x76, 0x4E, 0x6E, 0x63, 0x54, 0x46, 0x64, 0x2B, 0x0A, 0x72, 0x72, 0x63, 0x7A, 0x74, 0x6C, 0x35, 0x32, 0x34, 0x57, 0x57, 0x4C, 0x5A, 0x74, 0x2B, 0x4E, 0x79, 0x74, 0x65, 0x59, 0x72, 0x38, 0x34, + 0x32, 0x6D, 0x49, 0x79, 0x63, 0x67, 0x35, 0x6B, 0x44, 0x63, 0x50, 0x4F, 0x76, 0x64, 0x4F, 0x33, 0x47, 0x44, 0x6A, 0x62, 0x6E, 0x76, 0x65, 0x7A, 0x42, 0x63, 0x36, 0x65, 0x55, 0x57, 0x73, 0x75, 0x53, 0x5A, 0x49, 0x4B, 0x6D, 0x41, 0x4D, 0x46, + 0x77, 0x6F, 0x57, 0x34, 0x73, 0x4B, 0x65, 0x46, 0x59, 0x56, 0x2B, 0x78, 0x61, 0x0A, 0x66, 0x4A, 0x6C, 0x72, 0x4A, 0x61, 0x53, 0x51, 0x4F, 0x6F, 0x44, 0x30, 0x49, 0x4A, 0x32, 0x61, 0x7A, 0x73, 0x63, 0x74, 0x2B, 0x62, 0x4A, 0x4C, 0x4B, 0x5A, + 0x57, 0x44, 0x36, 0x54, 0x57, 0x4E, 0x70, 0x30, 0x6C, 0x49, 0x70, 0x77, 0x39, 0x4D, 0x47, 0x5A, 0x48, 0x51, 0x39, 0x62, 0x38, 0x51, 0x34, 0x48, 0x45, 0x43, 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, 0x77, + 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x0A, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x64, 0x45, 0x6D, 0x5A, 0x30, + 0x66, 0x2B, 0x30, 0x65, 0x6D, 0x68, 0x46, 0x64, 0x63, 0x4E, 0x2B, 0x74, 0x4E, 0x7A, 0x4D, 0x7A, 0x6A, 0x6B, 0x7A, 0x32, 0x67, 0x67, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, + 0x67, 0x47, 0x47, 0x4D, 0x41, 0x30, 0x47, 0x0A, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x44, 0x41, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x41, 0x6A, 0x51, 0x31, 0x4D, 0x6B, 0x59, 0x6C, 0x78, 0x74, + 0x2F, 0x54, 0x37, 0x43, 0x7A, 0x31, 0x55, 0x41, 0x62, 0x4D, 0x56, 0x57, 0x69, 0x4C, 0x6B, 0x4F, 0x33, 0x54, 0x72, 0x69, 0x4A, 0x51, 0x32, 0x56, 0x53, 0x70, 0x66, 0x4B, 0x67, 0x49, 0x6E, 0x75, 0x4B, 0x73, 0x31, 0x6C, 0x2B, 0x4E, 0x73, 0x57, + 0x34, 0x41, 0x6D, 0x53, 0x0A, 0x34, 0x42, 0x6A, 0x48, 0x65, 0x4A, 0x69, 0x37, 0x38, 0x2B, 0x78, 0x43, 0x55, 0x76, 0x75, 0x70, 0x70, 0x49, 0x4C, 0x58, 0x54, 0x64, 0x69, 0x4B, 0x2F, 0x4F, 0x52, 0x4F, 0x2F, 0x61, 0x75, 0x51, 0x78, 0x44, 0x68, + 0x31, 0x4D, 0x6F, 0x53, 0x66, 0x2F, 0x37, 0x4F, 0x77, 0x4B, 0x77, 0x49, 0x7A, 0x4E, 0x73, 0x41, 0x51, 0x6B, 0x47, 0x38, 0x64, 0x6E, 0x4B, 0x2F, 0x68, 0x61, 0x5A, 0x50, 0x73, 0x6F, 0x30, 0x55, 0x76, 0x46, 0x4A, 0x2F, 0x31, 0x54, 0x43, 0x70, + 0x6C, 0x0A, 0x51, 0x33, 0x49, 0x4D, 0x39, 0x38, 0x50, 0x34, 0x6C, 0x59, 0x73, 0x55, 0x38, 0x34, 0x55, 0x67, 0x59, 0x74, 0x31, 0x55, 0x55, 0x39, 0x30, 0x73, 0x33, 0x42, 0x69, 0x56, 0x61, 0x55, 0x2B, 0x44, 0x52, 0x33, 0x42, 0x41, 0x4D, 0x31, + 0x68, 0x33, 0x45, 0x67, 0x79, 0x69, 0x36, 0x31, 0x49, 0x78, 0x48, 0x6B, 0x7A, 0x4A, 0x71, 0x4D, 0x37, 0x46, 0x37, 0x38, 0x50, 0x52, 0x72, 0x65, 0x42, 0x72, 0x41, 0x77, 0x41, 0x30, 0x4A, 0x72, 0x52, 0x55, 0x49, 0x54, 0x57, 0x58, 0x0A, 0x41, + 0x64, 0x78, 0x66, 0x47, 0x2F, 0x46, 0x38, 0x35, 0x31, 0x58, 0x36, 0x4C, 0x57, 0x68, 0x33, 0x65, 0x39, 0x4E, 0x70, 0x7A, 0x4E, 0x4D, 0x4F, 0x61, 0x37, 0x70, 0x4E, 0x64, 0x6B, 0x54, 0x57, 0x77, 0x68, 0x57, 0x61, 0x4A, 0x75, 0x79, 0x77, 0x78, + 0x66, 0x57, 0x37, 0x30, 0x58, 0x70, 0x30, 0x77, 0x6D, 0x7A, 0x4E, 0x78, 0x62, 0x56, 0x65, 0x39, 0x6B, 0x7A, 0x6D, 0x57, 0x79, 0x32, 0x42, 0x32, 0x37, 0x4F, 0x33, 0x4F, 0x70, 0x65, 0x65, 0x37, 0x63, 0x39, 0x47, 0x0A, 0x73, 0x6C, 0x41, 0x39, + 0x68, 0x47, 0x43, 0x5A, 0x63, 0x62, 0x55, 0x7A, 0x74, 0x56, 0x64, 0x46, 0x35, 0x6B, 0x4A, 0x48, 0x64, 0x57, 0x6F, 0x4F, 0x73, 0x41, 0x67, 0x4D, 0x72, 0x72, 0x33, 0x65, 0x39, 0x37, 0x73, 0x50, 0x57, 0x44, 0x32, 0x50, 0x41, 0x7A, 0x48, 0x6F, + 0x50, 0x59, 0x4A, 0x51, 0x79, 0x69, 0x39, 0x65, 0x44, 0x46, 0x32, 0x30, 0x6C, 0x37, 0x34, 0x67, 0x4E, 0x41, 0x66, 0x30, 0x78, 0x42, 0x4C, 0x68, 0x37, 0x74, 0x65, 0x77, 0x32, 0x56, 0x6B, 0x74, 0x0A, 0x61, 0x66, 0x63, 0x78, 0x42, 0x50, 0x54, + 0x79, 0x2B, 0x61, 0x76, 0x35, 0x45, 0x7A, 0x48, 0x34, 0x41, 0x58, 0x63, 0x4F, 0x50, 0x55, 0x49, 0x6A, 0x4A, 0x73, 0x79, 0x61, 0x63, 0x6D, 0x64, 0x52, 0x49, 0x58, 0x72, 0x4D, 0x50, 0x49, 0x57, 0x6F, 0x36, 0x69, 0x46, 0x71, 0x4F, 0x39, 0x74, + 0x61, 0x50, 0x4B, 0x55, 0x30, 0x6E, 0x70, 0x72, 0x41, 0x4C, 0x4E, 0x2B, 0x41, 0x6E, 0x43, 0x6E, 0x67, 0x33, 0x33, 0x65, 0x55, 0x30, 0x61, 0x4B, 0x41, 0x51, 0x76, 0x39, 0x71, 0x0A, 0x54, 0x46, 0x73, 0x52, 0x30, 0x50, 0x58, 0x4E, 0x6F, 0x72, + 0x36, 0x75, 0x7A, 0x46, 0x46, 0x63, 0x77, 0x39, 0x56, 0x55, 0x65, 0x77, 0x79, 0x75, 0x31, 0x72, 0x6B, 0x47, 0x64, 0x34, 0x44, 0x69, 0x37, 0x77, 0x63, 0x61, 0x61, 0x4D, 0x78, 0x5A, 0x55, 0x61, 0x31, 0x2B, 0x58, 0x47, 0x64, 0x72, 0x75, 0x64, + 0x76, 0x69, 0x42, 0x30, 0x4A, 0x62, 0x75, 0x41, 0x45, 0x46, 0x57, 0x44, 0x6C, 0x4E, 0x35, 0x4C, 0x75, 0x59, 0x6F, 0x37, 0x45, 0x79, 0x37, 0x4E, 0x6D, 0x6A, 0x0A, 0x31, 0x6D, 0x2B, 0x55, 0x49, 0x2F, 0x38, 0x37, 0x74, 0x79, 0x6C, 0x6C, 0x35, + 0x67, 0x66, 0x70, 0x37, 0x37, 0x59, 0x5A, 0x36, 0x75, 0x66, 0x43, 0x4F, 0x42, 0x30, 0x79, 0x69, 0x4A, 0x41, 0x38, 0x45, 0x79, 0x74, 0x75, 0x7A, 0x4F, 0x2B, 0x72, 0x64, 0x77, 0x59, 0x30, 0x64, 0x34, 0x52, 0x50, 0x63, 0x75, 0x53, 0x42, 0x68, + 0x50, 0x6D, 0x35, 0x64, 0x44, 0x54, 0x65, 0x64, 0x6B, 0x2B, 0x53, 0x4B, 0x6C, 0x4F, 0x78, 0x4A, 0x54, 0x6E, 0x62, 0x50, 0x50, 0x2F, 0x6C, 0x0A, 0x50, 0x71, 0x59, 0x4F, 0x35, 0x57, 0x75, 0x65, 0x2F, 0x39, 0x76, 0x73, 0x4C, 0x33, 0x53, 0x44, + 0x33, 0x34, 0x36, 0x30, 0x73, 0x36, 0x6E, 0x65, 0x46, 0x45, 0x33, 0x2F, 0x4D, 0x61, 0x4E, 0x46, 0x63, 0x79, 0x54, 0x36, 0x6C, 0x53, 0x6E, 0x4D, 0x45, 0x70, 0x63, 0x45, 0x6F, 0x6A, 0x69, 0x32, 0x6A, 0x62, 0x44, 0x77, 0x4E, 0x2F, 0x7A, 0x49, + 0x49, 0x58, 0x38, 0x2F, 0x73, 0x79, 0x51, 0x62, 0x50, 0x59, 0x74, 0x75, 0x7A, 0x45, 0x32, 0x77, 0x46, 0x67, 0x32, 0x57, 0x0A, 0x48, 0x59, 0x4D, 0x66, 0x52, 0x73, 0x43, 0x62, 0x76, 0x55, 0x4F, 0x5A, 0x35, 0x38, 0x53, 0x57, 0x4C, 0x73, 0x35, + 0x66, 0x79, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x73, + 0x69, 0x61, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, + 0x46, 0x70, 0x54, 0x43, 0x43, 0x41, 0x34, 0x32, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x5A, 0x50, 0x59, 0x4F, 0x5A, 0x58, 0x64, 0x68, 0x61, 0x71, 0x73, 0x37, 0x74, 0x4F, 0x71, 0x46, 0x68, 0x4C, 0x75, 0x78, 0x69, 0x62, 0x68, + 0x78, 0x6B, 0x77, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x57, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, + 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, + 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x4A, 0x44, 0x41, 0x69, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x0A, 0x47, 0x31, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, + 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x48, 0x4D, 0x7A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x54, 0x41, 0x31, 0x4D, + 0x6A, 0x41, 0x77, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x54, 0x6C, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4E, 0x6A, 0x41, 0x31, 0x4D, 0x54, 0x6B, 0x77, 0x4D, 0x6A, 0x45, 0x77, 0x0A, 0x4D, 0x54, 0x6C, 0x61, 0x4D, 0x46, 0x6F, 0x78, 0x43, 0x7A, 0x41, 0x4A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x4F, 0x4D, 0x53, 0x55, 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x78, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x45, 0x46, 0x7A, 0x61, 0x57, 0x45, 0x67, + 0x56, 0x47, 0x56, 0x6A, 0x61, 0x47, 0x35, 0x76, 0x62, 0x47, 0x39, 0x6E, 0x61, 0x57, 0x56, 0x7A, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x0A, 0x4D, 0x53, 0x51, 0x77, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x74, + 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x45, 0x46, 0x7A, 0x61, 0x57, 0x45, 0x67, 0x52, 0x32, 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x52, 0x7A, 0x4D, 0x77, 0x67, 0x67, 0x49, + 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x0A, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, + 0x44, 0x41, 0x4D, 0x59, 0x4A, 0x68, 0x6B, 0x75, 0x53, 0x55, 0x47, 0x77, 0x6F, 0x71, 0x5A, 0x64, 0x43, 0x2B, 0x42, 0x71, 0x6D, 0x48, 0x4F, 0x31, 0x45, 0x53, 0x36, 0x6E, 0x42, 0x42, 0x72, 0x75, 0x4C, 0x37, 0x64, 0x4F, 0x6F, 0x4B, 0x6A, 0x62, + 0x6D, 0x7A, 0x54, 0x4E, 0x79, 0x50, 0x74, 0x78, 0x4E, 0x53, 0x54, 0x31, 0x51, 0x59, 0x34, 0x53, 0x78, 0x7A, 0x0A, 0x6C, 0x5A, 0x48, 0x46, 0x5A, 0x6A, 0x74, 0x71, 0x7A, 0x36, 0x78, 0x6A, 0x62, 0x59, 0x64, 0x54, 0x38, 0x50, 0x66, 0x78, 0x4F, + 0x62, 0x65, 0x67, 0x51, 0x32, 0x4F, 0x77, 0x78, 0x41, 0x4E, 0x64, 0x56, 0x36, 0x6E, 0x6E, 0x52, 0x4D, 0x37, 0x45, 0x6F, 0x59, 0x4E, 0x6C, 0x39, 0x6C, 0x41, 0x2B, 0x73, 0x58, 0x34, 0x57, 0x75, 0x44, 0x71, 0x4B, 0x41, 0x74, 0x43, 0x57, 0x48, + 0x77, 0x44, 0x4E, 0x42, 0x53, 0x48, 0x76, 0x42, 0x6D, 0x33, 0x64, 0x49, 0x5A, 0x77, 0x5A, 0x0A, 0x51, 0x30, 0x57, 0x68, 0x78, 0x65, 0x69, 0x41, 0x79, 0x73, 0x4B, 0x74, 0x51, 0x47, 0x49, 0x58, 0x42, 0x73, 0x61, 0x71, 0x76, 0x50, 0x50, 0x57, + 0x35, 0x76, 0x78, 0x51, 0x66, 0x6D, 0x5A, 0x43, 0x48, 0x7A, 0x79, 0x4C, 0x70, 0x6E, 0x6C, 0x35, 0x68, 0x6B, 0x41, 0x31, 0x6E, 0x79, 0x44, 0x76, 0x50, 0x2B, 0x75, 0x4C, 0x52, 0x78, 0x2B, 0x50, 0x6A, 0x73, 0x58, 0x55, 0x6A, 0x72, 0x59, 0x73, + 0x79, 0x55, 0x51, 0x45, 0x34, 0x39, 0x52, 0x44, 0x64, 0x54, 0x2F, 0x56, 0x0A, 0x50, 0x36, 0x38, 0x63, 0x7A, 0x48, 0x35, 0x47, 0x58, 0x36, 0x7A, 0x66, 0x5A, 0x42, 0x43, 0x4B, 0x37, 0x30, 0x62, 0x77, 0x6B, 0x50, 0x41, 0x50, 0x4C, 0x66, 0x53, + 0x49, 0x43, 0x37, 0x45, 0x70, 0x71, 0x71, 0x2B, 0x46, 0x71, 0x6B, 0x6C, 0x59, 0x71, 0x4C, 0x39, 0x6A, 0x6F, 0x44, 0x69, 0x52, 0x35, 0x72, 0x50, 0x6D, 0x64, 0x32, 0x6A, 0x45, 0x2B, 0x53, 0x6F, 0x5A, 0x68, 0x4C, 0x73, 0x4F, 0x34, 0x66, 0x57, + 0x76, 0x69, 0x65, 0x79, 0x6C, 0x4C, 0x31, 0x41, 0x67, 0x0A, 0x64, 0x42, 0x34, 0x53, 0x51, 0x58, 0x4D, 0x65, 0x4A, 0x4E, 0x6E, 0x4B, 0x7A, 0x69, 0x79, 0x68, 0x57, 0x54, 0x58, 0x41, 0x79, 0x42, 0x31, 0x47, 0x4A, 0x32, 0x46, 0x61, 0x6A, 0x2F, + 0x6C, 0x4E, 0x30, 0x33, 0x4A, 0x35, 0x5A, 0x68, 0x36, 0x66, 0x46, 0x5A, 0x41, 0x68, 0x4C, 0x66, 0x33, 0x74, 0x69, 0x31, 0x5A, 0x77, 0x41, 0x30, 0x70, 0x4A, 0x50, 0x6E, 0x39, 0x70, 0x4D, 0x52, 0x4A, 0x70, 0x78, 0x78, 0x35, 0x63, 0x79, 0x6E, + 0x6F, 0x54, 0x69, 0x2B, 0x6A, 0x6D, 0x0A, 0x39, 0x57, 0x41, 0x50, 0x7A, 0x4A, 0x4D, 0x73, 0x68, 0x48, 0x2F, 0x78, 0x2F, 0x47, 0x72, 0x38, 0x6D, 0x30, 0x65, 0x64, 0x32, 0x36, 0x32, 0x49, 0x50, 0x66, 0x4E, 0x32, 0x64, 0x54, 0x50, 0x58, 0x53, + 0x36, 0x54, 0x49, 0x69, 0x2F, 0x6E, 0x31, 0x51, 0x31, 0x68, 0x50, 0x79, 0x38, 0x67, 0x44, 0x56, 0x49, 0x2B, 0x6C, 0x68, 0x58, 0x67, 0x45, 0x47, 0x76, 0x4E, 0x7A, 0x38, 0x74, 0x65, 0x48, 0x48, 0x55, 0x47, 0x66, 0x35, 0x39, 0x67, 0x58, 0x7A, + 0x68, 0x71, 0x63, 0x0A, 0x44, 0x30, 0x72, 0x38, 0x33, 0x45, 0x52, 0x6F, 0x56, 0x47, 0x6A, 0x69, 0x51, 0x54, 0x7A, 0x2B, 0x4C, 0x49, 0x53, 0x47, 0x4E, 0x7A, 0x7A, 0x4E, 0x50, 0x79, 0x2B, 0x69, 0x32, 0x2B, 0x66, 0x33, 0x56, 0x41, 0x4E, 0x66, + 0x57, 0x64, 0x50, 0x33, 0x6B, 0x58, 0x6A, 0x48, 0x69, 0x33, 0x64, 0x71, 0x46, 0x75, 0x56, 0x4A, 0x68, 0x5A, 0x42, 0x46, 0x63, 0x6E, 0x41, 0x76, 0x6B, 0x56, 0x33, 0x34, 0x50, 0x6D, 0x56, 0x41, 0x43, 0x78, 0x6D, 0x5A, 0x79, 0x53, 0x59, 0x67, + 0x0A, 0x57, 0x6D, 0x6A, 0x42, 0x4E, 0x62, 0x39, 0x50, 0x70, 0x31, 0x48, 0x78, 0x32, 0x42, 0x45, 0x72, 0x57, 0x2B, 0x43, 0x61, 0x6E, 0x69, 0x67, 0x37, 0x43, 0x6A, 0x6F, 0x4B, 0x48, 0x38, 0x47, 0x42, 0x35, 0x53, 0x37, 0x77, 0x70, 0x72, 0x6C, + 0x70, 0x70, 0x59, 0x69, 0x55, 0x35, 0x6D, 0x73, 0x54, 0x66, 0x39, 0x46, 0x6B, 0x50, 0x7A, 0x32, 0x63, 0x63, 0x45, 0x62, 0x6C, 0x6F, 0x6F, 0x56, 0x37, 0x57, 0x49, 0x51, 0x6E, 0x33, 0x4D, 0x53, 0x41, 0x50, 0x6D, 0x65, 0x61, 0x0A, 0x6D, 0x73, + 0x65, 0x61, 0x4D, 0x51, 0x34, 0x77, 0x37, 0x4F, 0x59, 0x58, 0x51, 0x4A, 0x58, 0x5A, 0x52, 0x65, 0x30, 0x42, 0x6C, 0x71, 0x71, 0x2F, 0x44, 0x50, 0x4E, 0x4C, 0x30, 0x57, 0x50, 0x33, 0x45, 0x31, 0x6A, 0x41, 0x75, 0x50, 0x50, 0x36, 0x5A, 0x39, + 0x32, 0x62, 0x66, 0x57, 0x31, 0x4B, 0x2F, 0x7A, 0x4A, 0x4D, 0x74, 0x53, 0x55, 0x37, 0x2F, 0x78, 0x78, 0x6E, 0x44, 0x34, 0x55, 0x69, 0x57, 0x51, 0x57, 0x52, 0x6B, 0x55, 0x46, 0x33, 0x67, 0x64, 0x43, 0x46, 0x0A, 0x54, 0x49, 0x63, 0x51, 0x63, + 0x66, 0x2B, 0x65, 0x51, 0x78, 0x75, 0x75, 0x6C, 0x58, 0x55, 0x74, 0x67, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, + 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x49, 0x77, 0x51, 0x59, 0x4D, 0x42, 0x61, 0x41, 0x46, 0x45, 0x44, 0x6B, 0x35, 0x50, 0x49, 0x6A, 0x0A, 0x37, 0x7A, 0x6A, 0x4B, 0x73, 0x4B, 0x35, 0x58, + 0x66, 0x2F, 0x49, 0x68, 0x4D, 0x42, 0x59, 0x30, 0x32, 0x37, 0x79, 0x53, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x41, 0x35, 0x4F, 0x54, 0x79, 0x49, 0x2B, 0x38, 0x34, 0x79, 0x72, 0x43, 0x75, + 0x56, 0x33, 0x2F, 0x79, 0x49, 0x54, 0x41, 0x57, 0x4E, 0x4E, 0x75, 0x38, 0x6B, 0x6A, 0x41, 0x4F, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x0A, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x51, 0x59, + 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x43, 0x59, 0x37, 0x55, 0x65, 0x46, 0x4E, 0x4F, 0x50, 0x4D, 0x79, 0x47, 0x4C, 0x53, 0x30, 0x58, 0x75, 0x46, + 0x6C, 0x58, 0x73, 0x53, 0x55, 0x54, 0x39, 0x53, 0x6E, 0x59, 0x61, 0x50, 0x34, 0x77, 0x4D, 0x38, 0x7A, 0x41, 0x51, 0x4C, 0x70, 0x77, 0x36, 0x6F, 0x31, 0x0A, 0x44, 0x2F, 0x47, 0x55, 0x45, 0x33, 0x64, 0x33, 0x4E, 0x5A, 0x34, 0x74, 0x56, 0x6C, + 0x46, 0x45, 0x62, 0x75, 0x48, 0x47, 0x4C, 0x69, 0x67, 0x65, 0x2F, 0x39, 0x72, 0x73, 0x52, 0x38, 0x32, 0x58, 0x52, 0x42, 0x66, 0x33, 0x34, 0x45, 0x7A, 0x43, 0x34, 0x58, 0x78, 0x38, 0x4D, 0x6E, 0x70, 0x6D, 0x79, 0x46, 0x71, 0x32, 0x58, 0x46, + 0x4E, 0x46, 0x56, 0x31, 0x70, 0x46, 0x31, 0x41, 0x57, 0x5A, 0x4C, 0x79, 0x34, 0x6A, 0x56, 0x65, 0x35, 0x6A, 0x61, 0x4E, 0x2F, 0x54, 0x0A, 0x47, 0x33, 0x69, 0x6E, 0x45, 0x70, 0x51, 0x47, 0x41, 0x48, 0x55, 0x4E, 0x63, 0x6F, 0x54, 0x70, 0x4C, + 0x72, 0x78, 0x61, 0x61, 0x74, 0x58, 0x65, 0x4C, 0x31, 0x6E, 0x48, 0x6F, 0x2B, 0x7A, 0x53, 0x68, 0x32, 0x62, 0x62, 0x74, 0x31, 0x53, 0x31, 0x4A, 0x4B, 0x76, 0x30, 0x51, 0x33, 0x6A, 0x62, 0x53, 0x77, 0x54, 0x45, 0x62, 0x39, 0x33, 0x6D, 0x50, + 0x6D, 0x59, 0x2B, 0x4B, 0x66, 0x4A, 0x4C, 0x61, 0x48, 0x45, 0x69, 0x68, 0x36, 0x44, 0x34, 0x73, 0x54, 0x4E, 0x6A, 0x0A, 0x64, 0x75, 0x4D, 0x4E, 0x68, 0x58, 0x4A, 0x45, 0x49, 0x6C, 0x55, 0x2F, 0x48, 0x48, 0x7A, 0x70, 0x2F, 0x4C, 0x67, 0x56, + 0x36, 0x46, 0x4C, 0x36, 0x71, 0x6A, 0x36, 0x6A, 0x49, 0x54, 0x6B, 0x31, 0x64, 0x49, 0x6D, 0x6D, 0x61, 0x73, 0x49, 0x35, 0x2B, 0x6E, 0x6A, 0x50, 0x74, 0x71, 0x7A, 0x6E, 0x35, 0x39, 0x5A, 0x57, 0x2F, 0x79, 0x4F, 0x53, 0x4C, 0x6C, 0x41, 0x4C, + 0x71, 0x62, 0x55, 0x48, 0x4D, 0x2F, 0x51, 0x34, 0x58, 0x36, 0x52, 0x4A, 0x70, 0x73, 0x74, 0x6C, 0x0A, 0x63, 0x48, 0x62, 0x6F, 0x43, 0x6F, 0x57, 0x41, 0x53, 0x7A, 0x59, 0x39, 0x4D, 0x2F, 0x65, 0x56, 0x56, 0x48, 0x55, 0x6C, 0x32, 0x71, 0x7A, + 0x45, 0x63, 0x34, 0x4A, 0x6C, 0x36, 0x56, 0x4C, 0x31, 0x58, 0x50, 0x30, 0x34, 0x6C, 0x51, 0x4A, 0x71, 0x61, 0x54, 0x44, 0x46, 0x48, 0x41, 0x70, 0x58, 0x42, 0x36, 0x34, 0x69, 0x70, 0x43, 0x7A, 0x35, 0x78, 0x55, 0x47, 0x33, 0x75, 0x4F, 0x79, + 0x66, 0x54, 0x30, 0x67, 0x41, 0x2B, 0x51, 0x45, 0x45, 0x56, 0x63, 0x79, 0x73, 0x0A, 0x2B, 0x54, 0x49, 0x78, 0x78, 0x48, 0x57, 0x56, 0x42, 0x71, 0x42, 0x2F, 0x30, 0x59, 0x30, 0x6E, 0x33, 0x62, 0x4F, 0x70, 0x70, 0x48, 0x4B, 0x48, 0x2F, 0x6C, + 0x6D, 0x4C, 0x6D, 0x6E, 0x70, 0x30, 0x46, 0x74, 0x30, 0x57, 0x70, 0x57, 0x49, 0x70, 0x36, 0x7A, 0x71, 0x57, 0x33, 0x49, 0x75, 0x6E, 0x61, 0x46, 0x6E, 0x54, 0x36, 0x33, 0x65, 0x52, 0x4F, 0x66, 0x6A, 0x58, 0x79, 0x39, 0x6D, 0x50, 0x58, 0x31, + 0x6F, 0x6E, 0x41, 0x58, 0x31, 0x64, 0x61, 0x42, 0x6C, 0x69, 0x0A, 0x32, 0x4D, 0x6A, 0x4E, 0x39, 0x4C, 0x64, 0x79, 0x52, 0x37, 0x35, 0x62, 0x6C, 0x38, 0x37, 0x79, 0x72, 0x61, 0x4B, 0x5A, 0x6B, 0x36, 0x32, 0x55, 0x79, 0x35, 0x50, 0x32, 0x45, + 0x67, 0x6D, 0x56, 0x74, 0x71, 0x76, 0x58, 0x4F, 0x39, 0x41, 0x2F, 0x45, 0x63, 0x73, 0x77, 0x46, 0x69, 0x35, 0x35, 0x67, 0x4F, 0x52, 0x6E, 0x67, 0x53, 0x31, 0x64, 0x37, 0x58, 0x42, 0x34, 0x74, 0x6D, 0x42, 0x5A, 0x72, 0x4F, 0x46, 0x64, 0x52, + 0x57, 0x4F, 0x50, 0x79, 0x4E, 0x39, 0x79, 0x0A, 0x61, 0x46, 0x76, 0x71, 0x48, 0x62, 0x67, 0x42, 0x38, 0x58, 0x37, 0x37, 0x35, 0x34, 0x71, 0x7A, 0x34, 0x31, 0x53, 0x67, 0x4F, 0x41, 0x6E, 0x67, 0x50, 0x4E, 0x35, 0x43, 0x38, 0x73, 0x4C, 0x74, + 0x4C, 0x70, 0x76, 0x7A, 0x48, 0x7A, 0x57, 0x32, 0x4E, 0x74, 0x6A, 0x6A, 0x67, 0x4B, 0x47, 0x4C, 0x7A, 0x5A, 0x6C, 0x6B, 0x44, 0x38, 0x4B, 0x71, 0x71, 0x37, 0x48, 0x4B, 0x39, 0x57, 0x2B, 0x65, 0x51, 0x34, 0x32, 0x45, 0x56, 0x4A, 0x6D, 0x7A, + 0x62, 0x73, 0x41, 0x53, 0x0A, 0x5A, 0x74, 0x68, 0x77, 0x45, 0x50, 0x45, 0x47, 0x4E, 0x54, 0x4E, 0x44, 0x71, 0x4A, 0x77, 0x75, 0x75, 0x68, 0x51, 0x78, 0x7A, 0x68, 0x42, 0x2F, 0x48, 0x49, 0x62, 0x6A, 0x6A, 0x39, 0x4C, 0x56, 0x2B, 0x48, 0x66, + 0x73, 0x6D, 0x36, 0x76, 0x78, 0x4C, 0x32, 0x50, 0x5A, 0x51, 0x6C, 0x2F, 0x67, 0x5A, 0x34, 0x46, 0x6B, 0x6B, 0x66, 0x47, 0x58, 0x4C, 0x2F, 0x78, 0x75, 0x4A, 0x76, 0x59, 0x7A, 0x2B, 0x4E, 0x4F, 0x31, 0x2B, 0x4D, 0x52, 0x69, 0x71, 0x7A, 0x46, + 0x52, 0x0A, 0x4A, 0x51, 0x4A, 0x36, 0x2B, 0x4E, 0x31, 0x72, 0x5A, 0x64, 0x56, 0x74, 0x54, 0x54, 0x44, 0x49, 0x5A, 0x62, 0x70, 0x6F, 0x46, 0x47, 0x57, 0x73, 0x4A, 0x77, 0x74, 0x30, 0x69, 0x76, 0x4B, 0x48, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x73, 0x69, 0x61, 0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, + 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x47, 0x34, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x56, 0x54, 0x43, 0x43, 0x41, 0x64, 0x79, 0x67, 0x41, 0x77, + 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x54, 0x79, 0x4E, 0x6B, 0x75, 0x49, 0x36, 0x58, 0x59, 0x35, 0x37, 0x47, 0x55, 0x34, 0x48, 0x42, 0x64, 0x6B, 0x37, 0x4C, 0x4B, 0x6E, 0x51, 0x56, 0x31, 0x74, 0x63, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, + 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x57, 0x6A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, + 0x41, 0x6F, 0x4D, 0x48, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, + 0x79, 0x34, 0x78, 0x4A, 0x44, 0x41, 0x69, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x47, 0x31, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x48, 0x62, 0x47, 0x39, 0x69, 0x59, 0x57, 0x77, 0x67, + 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x42, 0x48, 0x4E, 0x44, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x54, 0x41, 0x31, 0x4D, 0x6A, 0x41, 0x77, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x6A, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x30, + 0x4E, 0x6A, 0x41, 0x31, 0x4D, 0x54, 0x6B, 0x77, 0x4D, 0x6A, 0x45, 0x77, 0x4D, 0x6A, 0x4A, 0x61, 0x0A, 0x4D, 0x46, 0x6F, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x4F, 0x4D, 0x53, 0x55, + 0x77, 0x49, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x44, 0x42, 0x78, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x45, 0x46, 0x7A, 0x61, 0x57, 0x45, 0x67, 0x56, 0x47, 0x56, 0x6A, 0x61, 0x47, 0x35, 0x76, 0x62, 0x47, 0x39, 0x6E, 0x61, 0x57, 0x56, + 0x7A, 0x4C, 0x43, 0x42, 0x4A, 0x62, 0x6D, 0x4D, 0x75, 0x4D, 0x53, 0x51, 0x77, 0x0A, 0x49, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x74, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x45, 0x46, 0x7A, 0x61, 0x57, 0x45, 0x67, 0x52, 0x32, + 0x78, 0x76, 0x59, 0x6D, 0x46, 0x73, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x52, 0x7A, 0x51, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, + 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x0A, 0x41, 0x41, 0x54, 0x78, 0x73, 0x38, 0x30, 0x34, 0x35, 0x43, 0x56, 0x44, 0x35, 0x64, 0x34, 0x5A, 0x43, 0x62, 0x75, 0x42, 0x65, 0x61, 0x49, 0x56, 0x58, 0x78, 0x56, 0x6A, 0x41, + 0x64, 0x37, 0x43, 0x71, 0x39, 0x32, 0x7A, 0x70, 0x68, 0x74, 0x6E, 0x53, 0x34, 0x43, 0x44, 0x72, 0x35, 0x6E, 0x4C, 0x72, 0x42, 0x66, 0x62, 0x4B, 0x35, 0x62, 0x4B, 0x66, 0x46, 0x4A, 0x56, 0x34, 0x68, 0x72, 0x68, 0x50, 0x56, 0x62, 0x77, 0x4C, + 0x78, 0x59, 0x49, 0x2B, 0x68, 0x57, 0x38, 0x0A, 0x6D, 0x37, 0x74, 0x48, 0x35, 0x6A, 0x2F, 0x75, 0x71, 0x4F, 0x46, 0x4D, 0x6A, 0x50, 0x58, 0x54, 0x4E, 0x76, 0x6B, 0x34, 0x58, 0x61, 0x74, 0x77, 0x6D, 0x6B, 0x63, 0x4E, 0x34, 0x6F, 0x46, 0x42, + 0x42, 0x75, 0x74, 0x4A, 0x2B, 0x62, 0x41, 0x70, 0x33, 0x54, 0x50, 0x73, 0x55, 0x4B, 0x56, 0x2F, 0x65, 0x53, 0x6D, 0x34, 0x49, 0x4A, 0x69, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x46, 0x0A, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x70, 0x62, 0x74, 0x4B, 0x6C, 0x38, 0x36, 0x7A, 0x4B, 0x33, 0x2B, + 0x6B, 0x4D, 0x64, 0x36, 0x58, 0x67, 0x31, 0x6D, 0x44, 0x70, 0x6D, 0x39, 0x78, 0x79, 0x39, 0x34, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4B, 0x57, 0x37, 0x53, 0x70, 0x66, 0x4F, 0x73, 0x79, 0x74, + 0x2F, 0x0A, 0x70, 0x44, 0x48, 0x65, 0x6C, 0x34, 0x4E, 0x5A, 0x67, 0x36, 0x5A, 0x76, 0x63, 0x63, 0x76, 0x65, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, + 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6E, 0x41, 0x44, 0x42, 0x6B, 0x41, 0x6A, 0x42, 0x65, 0x38, 0x75, 0x73, 0x47, 0x7A, 0x45, 0x6B, 0x78, 0x6E, 0x30, 0x41, 0x41, 0x0A, 0x62, + 0x62, 0x64, 0x2B, 0x4E, 0x76, 0x42, 0x4E, 0x45, 0x55, 0x2F, 0x7A, 0x79, 0x34, 0x6B, 0x36, 0x4C, 0x48, 0x69, 0x52, 0x55, 0x4B, 0x4E, 0x62, 0x77, 0x4D, 0x70, 0x31, 0x4A, 0x76, 0x4B, 0x2F, 0x6B, 0x46, 0x30, 0x4C, 0x67, 0x6F, 0x78, 0x67, 0x4B, + 0x4A, 0x2F, 0x47, 0x63, 0x4A, 0x70, 0x6F, 0x35, 0x50, 0x45, 0x43, 0x4D, 0x46, 0x78, 0x59, 0x44, 0x6C, 0x5A, 0x32, 0x7A, 0x31, 0x6A, 0x44, 0x31, 0x78, 0x43, 0x4D, 0x75, 0x6F, 0x36, 0x75, 0x34, 0x37, 0x78, 0x6B, 0x0A, 0x64, 0x55, 0x66, 0x46, + 0x56, 0x5A, 0x44, 0x6A, 0x2F, 0x62, 0x70, 0x56, 0x36, 0x77, 0x66, 0x45, 0x55, 0x36, 0x73, 0x33, 0x71, 0x65, 0x34, 0x68, 0x73, 0x69, 0x46, 0x62, 0x59, 0x49, 0x38, 0x39, 0x4D, 0x76, 0x48, 0x56, 0x49, 0x35, 0x54, 0x57, 0x57, 0x41, 0x3D, 0x3D, + 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x65, 0x6C, 0x65, 0x6B, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x32, 0x30, 0x32, 0x30, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x51, 0x6A, 0x43, 0x43, 0x41, 0x63, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x4E, 0x6A, 0x71, 0x57, 0x6A, 0x4D, 0x6C, 0x63, 0x73, 0x6C, 0x6A, 0x4E, 0x30, 0x41, + 0x46, 0x64, 0x78, 0x65, 0x56, 0x58, 0x41, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x6A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, + 0x4A, 0x45, 0x0A, 0x52, 0x54, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x65, 0x52, 0x47, 0x56, 0x31, 0x64, 0x48, 0x4E, 0x6A, 0x61, 0x47, 0x55, 0x67, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x57, 0x74, 0x76, 0x62, + 0x53, 0x42, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x53, 0x73, 0x77, 0x4B, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x4A, 0x55, 0x5A, 0x57, 0x78, 0x6C, 0x0A, + 0x61, 0x32, 0x39, 0x74, 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x77, + 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x54, 0x41, 0x33, 0x4E, 0x44, 0x67, 0x79, 0x4D, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x31, 0x4D, 0x44, 0x67, 0x79, 0x4E, 0x54, 0x49, 0x7A, 0x0A, 0x4E, 0x54, 0x6B, + 0x31, 0x4F, 0x56, 0x6F, 0x77, 0x59, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x6B, 0x52, + 0x6C, 0x64, 0x58, 0x52, 0x7A, 0x59, 0x32, 0x68, 0x6C, 0x49, 0x46, 0x52, 0x6C, 0x62, 0x47, 0x56, 0x72, 0x62, 0x32, 0x30, 0x67, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x70, 0x64, 0x48, 0x6B, 0x67, 0x0A, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, + 0x45, 0x72, 0x4D, 0x43, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x69, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x57, 0x74, 0x76, 0x62, 0x53, 0x42, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x55, 0x54, 0x46, + 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x44, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x0A, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, + 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4D, 0x36, 0x2F, 0x2F, 0x6C, 0x65, 0x6F, 0x76, 0x39, 0x57, 0x71, 0x39, 0x78, 0x43, 0x61, 0x7A, 0x62, 0x7A, 0x52, 0x45, 0x61, 0x4B, 0x39, 0x5A, 0x30, 0x4C, 0x4D, 0x6B, + 0x4F, 0x73, 0x56, 0x47, 0x4A, 0x44, 0x5A, 0x6F, 0x73, 0x30, 0x4D, 0x4B, 0x69, 0x58, 0x72, 0x50, 0x6B, 0x2F, 0x4F, 0x74, 0x64, 0x4B, 0x50, 0x44, 0x2F, 0x4D, 0x31, 0x0A, 0x32, 0x6B, 0x4F, 0x4C, 0x41, 0x6F, 0x43, 0x2B, 0x62, 0x31, 0x45, 0x6B, + 0x48, 0x51, 0x39, 0x72, 0x4B, 0x38, 0x71, 0x66, 0x77, 0x6D, 0x39, 0x51, 0x4D, 0x75, 0x55, 0x33, 0x49, 0x4C, 0x59, 0x67, 0x2F, 0x34, 0x67, 0x4E, 0x44, 0x32, 0x31, 0x4A, 0x75, 0x39, 0x73, 0x47, 0x70, 0x49, 0x65, 0x51, 0x6B, 0x70, 0x54, 0x30, + 0x43, 0x64, 0x44, 0x50, 0x66, 0x38, 0x69, 0x41, 0x43, 0x38, 0x47, 0x58, 0x73, 0x37, 0x73, 0x31, 0x4A, 0x38, 0x6E, 0x43, 0x47, 0x36, 0x4E, 0x43, 0x0A, 0x4D, 0x45, 0x41, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, + 0x45, 0x46, 0x4F, 0x4E, 0x79, 0x7A, 0x47, 0x36, 0x56, 0x6D, 0x55, 0x65, 0x78, 0x35, 0x72, 0x4E, 0x68, 0x54, 0x4E, 0x48, 0x4C, 0x71, 0x2B, 0x4F, 0x36, 0x7A, 0x64, 0x36, 0x66, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, + 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, + 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x63, 0x41, 0x4D, 0x47, 0x51, 0x43, 0x4D, 0x48, 0x56, 0x53, 0x69, 0x37, 0x65, 0x6B, 0x45, 0x45, 0x2B, 0x75, 0x53, 0x68, 0x43, 0x4C, 0x73, 0x6F, 0x52, 0x62, 0x51, 0x75, + 0x48, 0x6D, 0x4B, 0x6A, 0x59, 0x43, 0x32, 0x71, 0x42, 0x75, 0x47, 0x54, 0x38, 0x6C, 0x76, 0x39, 0x70, 0x5A, 0x0A, 0x4D, 0x6F, 0x37, 0x6B, 0x2B, 0x35, 0x44, 0x63, 0x6B, 0x32, 0x54, 0x4F, 0x72, 0x62, 0x52, 0x42, 0x52, 0x32, 0x44, 0x69, 0x7A, + 0x36, 0x66, 0x4C, 0x48, 0x67, 0x49, 0x77, 0x4E, 0x30, 0x47, 0x4D, 0x5A, 0x74, 0x39, 0x42, 0x61, 0x39, 0x61, 0x44, 0x41, 0x45, 0x48, 0x39, 0x4C, 0x31, 0x72, 0x33, 0x55, 0x4C, 0x52, 0x6E, 0x30, 0x53, 0x79, 0x6F, 0x63, 0x64, 0x64, 0x44, 0x79, + 0x70, 0x77, 0x6E, 0x4A, 0x4A, 0x47, 0x44, 0x53, 0x41, 0x33, 0x50, 0x7A, 0x66, 0x64, 0x55, 0x0A, 0x67, 0x61, 0x2F, 0x73, 0x66, 0x2B, 0x52, 0x6E, 0x32, 0x37, 0x69, 0x51, 0x37, 0x74, 0x30, 0x6C, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, + 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x65, 0x6C, 0x65, 0x6B, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x4C, 0x53, + 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x32, 0x30, 0x32, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, + 0x49, 0x46, 0x73, 0x7A, 0x43, 0x43, 0x41, 0x35, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x49, 0x5A, 0x78, 0x55, 0x4C, 0x65, 0x6A, 0x32, 0x37, 0x48, 0x46, 0x33, 0x2B, 0x6B, 0x37, 0x6F, 0x77, 0x33, 0x42, 0x58, 0x6C, 0x7A, + 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x6A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x45, 0x52, + 0x54, 0x45, 0x6E, 0x4D, 0x43, 0x55, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x65, 0x52, 0x47, 0x56, 0x31, 0x64, 0x48, 0x4E, 0x6A, 0x61, 0x47, 0x55, 0x67, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x57, 0x74, 0x76, 0x62, 0x53, 0x42, 0x54, 0x5A, + 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x48, 0x62, 0x57, 0x4A, 0x49, 0x4D, 0x53, 0x73, 0x77, 0x4B, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x43, 0x4A, 0x55, 0x0A, 0x5A, 0x57, 0x78, 0x6C, 0x61, 0x32, 0x39, 0x74, + 0x49, 0x46, 0x4E, 0x6C, 0x59, 0x33, 0x56, 0x79, 0x61, 0x58, 0x52, 0x35, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x7A, 0x4D, 0x42, 0x34, 0x58, + 0x44, 0x54, 0x49, 0x7A, 0x4D, 0x44, 0x4D, 0x79, 0x4F, 0x44, 0x45, 0x79, 0x4D, 0x54, 0x59, 0x30, 0x4E, 0x56, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x34, 0x4D, 0x44, 0x4D, 0x79, 0x0A, 0x4E, 0x7A, 0x49, 0x7A, 0x4E, 0x54, 0x6B, 0x31, 0x4F, 0x56, 0x6F, + 0x77, 0x59, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x4A, 0x7A, 0x41, 0x6C, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x48, 0x6B, 0x52, 0x6C, 0x64, 0x58, 0x52, + 0x7A, 0x59, 0x32, 0x68, 0x6C, 0x49, 0x46, 0x52, 0x6C, 0x62, 0x47, 0x56, 0x72, 0x62, 0x32, 0x30, 0x67, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x70, 0x0A, 0x64, 0x48, 0x6B, 0x67, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, 0x45, 0x72, 0x4D, 0x43, + 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x69, 0x56, 0x47, 0x56, 0x73, 0x5A, 0x57, 0x74, 0x76, 0x62, 0x53, 0x42, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x6C, 0x30, 0x65, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x55, 0x6C, + 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x7A, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x0A, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, + 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4F, 0x30, 0x31, 0x6F, 0x59, 0x47, 0x41, 0x38, 0x38, 0x74, 0x4B, 0x61, 0x56, 0x76, 0x43, 0x2B, 0x31, 0x47, 0x44, 0x72, + 0x69, 0x62, 0x39, 0x34, 0x57, 0x37, 0x7A, 0x67, 0x52, 0x4A, 0x39, 0x63, 0x55, 0x44, 0x2F, 0x68, 0x33, 0x56, 0x43, 0x0A, 0x4B, 0x53, 0x48, 0x74, 0x67, 0x56, 0x49, 0x73, 0x33, 0x78, 0x4C, 0x42, 0x47, 0x59, 0x53, 0x4A, 0x77, 0x62, 0x33, 0x46, + 0x4B, 0x4E, 0x58, 0x56, 0x53, 0x32, 0x78, 0x45, 0x31, 0x6B, 0x7A, 0x62, 0x42, 0x35, 0x5A, 0x4B, 0x56, 0x58, 0x72, 0x4B, 0x4E, 0x6F, 0x49, 0x45, 0x4E, 0x71, 0x69, 0x6C, 0x2F, 0x43, 0x66, 0x32, 0x53, 0x66, 0x48, 0x56, 0x63, 0x70, 0x36, 0x52, + 0x2B, 0x53, 0x50, 0x57, 0x63, 0x48, 0x75, 0x37, 0x39, 0x5A, 0x76, 0x42, 0x37, 0x4A, 0x50, 0x50, 0x0A, 0x47, 0x65, 0x70, 0x6C, 0x66, 0x6F, 0x68, 0x77, 0x6F, 0x48, 0x50, 0x38, 0x39, 0x76, 0x2B, 0x31, 0x56, 0x6D, 0x4C, 0x68, 0x63, 0x32, 0x6F, + 0x30, 0x6D, 0x44, 0x36, 0x43, 0x75, 0x4B, 0x79, 0x56, 0x55, 0x2F, 0x51, 0x42, 0x6F, 0x43, 0x63, 0x48, 0x63, 0x71, 0x4D, 0x41, 0x55, 0x36, 0x44, 0x6B, 0x73, 0x71, 0x75, 0x44, 0x4F, 0x46, 0x63, 0x7A, 0x4A, 0x5A, 0x53, 0x66, 0x76, 0x6B, 0x67, + 0x64, 0x6D, 0x4F, 0x47, 0x6A, 0x75, 0x70, 0x35, 0x63, 0x7A, 0x51, 0x52, 0x78, 0x0A, 0x55, 0x58, 0x31, 0x31, 0x65, 0x4B, 0x76, 0x7A, 0x57, 0x61, 0x72, 0x45, 0x34, 0x47, 0x43, 0x2B, 0x6A, 0x34, 0x4E, 0x53, 0x75, 0x48, 0x55, 0x61, 0x51, 0x54, + 0x58, 0x74, 0x76, 0x50, 0x4D, 0x36, 0x59, 0x2B, 0x6D, 0x70, 0x46, 0x45, 0x58, 0x58, 0x35, 0x6C, 0x4C, 0x52, 0x62, 0x74, 0x4C, 0x65, 0x76, 0x4F, 0x50, 0x31, 0x43, 0x7A, 0x76, 0x6D, 0x34, 0x4D, 0x53, 0x39, 0x51, 0x32, 0x51, 0x54, 0x70, 0x73, + 0x37, 0x30, 0x6D, 0x44, 0x64, 0x73, 0x69, 0x70, 0x57, 0x6F, 0x0A, 0x6C, 0x38, 0x68, 0x48, 0x44, 0x2F, 0x42, 0x65, 0x45, 0x49, 0x76, 0x6E, 0x48, 0x52, 0x7A, 0x2B, 0x73, 0x54, 0x75, 0x67, 0x42, 0x54, 0x4E, 0x6F, 0x42, 0x55, 0x47, 0x43, 0x77, + 0x51, 0x4D, 0x72, 0x41, 0x63, 0x6A, 0x6E, 0x6A, 0x30, 0x32, 0x72, 0x36, 0x4C, 0x58, 0x32, 0x7A, 0x57, 0x74, 0x45, 0x74, 0x65, 0x66, 0x64, 0x69, 0x2B, 0x7A, 0x71, 0x4A, 0x62, 0x51, 0x41, 0x49, 0x6C, 0x64, 0x4E, 0x73, 0x4C, 0x47, 0x79, 0x4D, + 0x63, 0x45, 0x57, 0x7A, 0x76, 0x2F, 0x39, 0x0A, 0x46, 0x49, 0x53, 0x33, 0x52, 0x2F, 0x71, 0x79, 0x38, 0x58, 0x44, 0x65, 0x32, 0x34, 0x74, 0x73, 0x4E, 0x6C, 0x69, 0x6B, 0x66, 0x4C, 0x4D, 0x52, 0x30, 0x63, 0x4E, 0x33, 0x66, 0x31, 0x2B, 0x32, + 0x4A, 0x65, 0x41, 0x4E, 0x78, 0x64, 0x4B, 0x7A, 0x2B, 0x62, 0x69, 0x34, 0x64, 0x39, 0x73, 0x33, 0x63, 0x58, 0x46, 0x48, 0x34, 0x32, 0x41, 0x59, 0x54, 0x79, 0x53, 0x32, 0x64, 0x54, 0x64, 0x34, 0x75, 0x61, 0x4E, 0x69, 0x72, 0x37, 0x33, 0x4A, + 0x63, 0x6F, 0x34, 0x76, 0x0A, 0x7A, 0x4C, 0x75, 0x75, 0x32, 0x2B, 0x51, 0x56, 0x55, 0x68, 0x6B, 0x48, 0x4D, 0x2F, 0x74, 0x71, 0x74, 0x79, 0x31, 0x4C, 0x6B, 0x43, 0x69, 0x43, 0x63, 0x2F, 0x34, 0x59, 0x69, 0x7A, 0x57, 0x4E, 0x32, 0x36, 0x63, + 0x45, 0x61, 0x72, 0x37, 0x71, 0x77, 0x55, 0x30, 0x32, 0x4F, 0x78, 0x59, 0x32, 0x6B, 0x54, 0x4C, 0x76, 0x74, 0x6B, 0x43, 0x4A, 0x6B, 0x55, 0x50, 0x67, 0x38, 0x71, 0x4B, 0x72, 0x42, 0x43, 0x37, 0x6D, 0x38, 0x6B, 0x77, 0x4F, 0x46, 0x6A, 0x51, + 0x67, 0x0A, 0x72, 0x49, 0x66, 0x42, 0x4C, 0x58, 0x37, 0x4A, 0x5A, 0x6B, 0x63, 0x58, 0x46, 0x42, 0x47, 0x6B, 0x38, 0x2F, 0x65, 0x68, 0x4A, 0x49, 0x6D, 0x72, 0x32, 0x42, 0x72, 0x49, 0x6F, 0x56, 0x79, 0x78, 0x6F, 0x2F, 0x65, 0x4D, 0x62, 0x63, + 0x67, 0x42, 0x79, 0x55, 0x2F, 0x4A, 0x37, 0x4D, 0x54, 0x38, 0x72, 0x46, 0x45, 0x7A, 0x30, 0x63, 0x69, 0x44, 0x30, 0x63, 0x6D, 0x66, 0x48, 0x64, 0x52, 0x48, 0x4E, 0x43, 0x6B, 0x2B, 0x79, 0x37, 0x41, 0x4F, 0x2B, 0x6F, 0x4D, 0x4C, 0x0A, 0x4B, + 0x46, 0x6A, 0x6C, 0x4B, 0x64, 0x77, 0x2F, 0x66, 0x4B, 0x69, 0x66, 0x79, 0x62, 0x59, 0x4B, 0x75, 0x36, 0x62, 0x6F, 0x52, 0x68, 0x59, 0x50, 0x6C, 0x75, 0x56, 0x37, 0x35, 0x47, 0x70, 0x36, 0x53, 0x47, 0x31, 0x32, 0x6D, 0x41, 0x57, 0x6C, 0x33, + 0x47, 0x30, 0x65, 0x51, 0x68, 0x35, 0x43, 0x32, 0x68, 0x72, 0x67, 0x55, 0x76, 0x65, 0x31, 0x67, 0x38, 0x41, 0x61, 0x65, 0x33, 0x67, 0x31, 0x4C, 0x44, 0x6A, 0x31, 0x48, 0x2F, 0x31, 0x4A, 0x6F, 0x79, 0x37, 0x53, 0x0A, 0x57, 0x57, 0x4F, 0x2F, + 0x67, 0x4C, 0x43, 0x4D, 0x6B, 0x33, 0x50, 0x4C, 0x4E, 0x61, 0x61, 0x5A, 0x6C, 0x53, 0x4A, 0x68, 0x5A, 0x51, 0x4E, 0x67, 0x2B, 0x79, 0x2B, 0x54, 0x53, 0x2F, 0x71, 0x61, 0x6E, 0x49, 0x41, 0x37, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, + 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, + 0x55, 0x74, 0x71, 0x65, 0x58, 0x67, 0x6A, 0x31, 0x30, 0x68, 0x5A, 0x76, 0x33, 0x50, 0x4A, 0x2B, 0x54, 0x6D, 0x70, 0x56, 0x35, 0x64, 0x56, 0x4B, 0x4D, 0x62, 0x55, 0x63, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, + 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x53, 0x32, 0x0A, 0x70, 0x35, 0x65, 0x43, 0x50, 0x58, 0x53, 0x46, 0x6D, 0x2F, + 0x63, 0x38, 0x6E, 0x35, 0x4F, 0x61, 0x6C, 0x58, 0x6C, 0x31, 0x55, 0x6F, 0x78, 0x74, 0x52, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, + 0x45, 0x41, 0x71, 0x4D, 0x78, 0x68, 0x70, 0x72, 0x35, 0x31, 0x6E, 0x68, 0x56, 0x51, 0x70, 0x47, 0x76, 0x37, 0x71, 0x48, 0x42, 0x46, 0x66, 0x4C, 0x70, 0x2B, 0x0A, 0x73, 0x56, 0x72, 0x38, 0x57, 0x79, 0x50, 0x36, 0x43, 0x6E, 0x66, 0x34, 0x6D, + 0x48, 0x47, 0x43, 0x44, 0x47, 0x33, 0x67, 0x58, 0x6B, 0x61, 0x71, 0x6B, 0x2F, 0x51, 0x65, 0x6F, 0x4D, 0x50, 0x68, 0x6B, 0x39, 0x74, 0x4C, 0x72, 0x62, 0x4B, 0x6D, 0x58, 0x61, 0x75, 0x77, 0x31, 0x47, 0x4C, 0x4C, 0x58, 0x72, 0x74, 0x6D, 0x39, + 0x53, 0x33, 0x75, 0x6C, 0x30, 0x41, 0x38, 0x59, 0x75, 0x74, 0x65, 0x31, 0x68, 0x54, 0x57, 0x6A, 0x4F, 0x4B, 0x57, 0x69, 0x30, 0x46, 0x70, 0x0A, 0x6B, 0x7A, 0x58, 0x6D, 0x75, 0x5A, 0x6C, 0x72, 0x59, 0x72, 0x53, 0x68, 0x46, 0x32, 0x59, 0x30, + 0x70, 0x6D, 0x74, 0x6A, 0x78, 0x72, 0x6C, 0x4F, 0x38, 0x69, 0x4C, 0x70, 0x57, 0x41, 0x31, 0x57, 0x51, 0x64, 0x48, 0x36, 0x44, 0x45, 0x72, 0x77, 0x4D, 0x38, 0x30, 0x37, 0x75, 0x32, 0x30, 0x68, 0x4F, 0x71, 0x36, 0x4F, 0x63, 0x72, 0x58, 0x44, + 0x53, 0x76, 0x76, 0x70, 0x66, 0x65, 0x57, 0x78, 0x6D, 0x34, 0x62, 0x75, 0x34, 0x75, 0x42, 0x39, 0x74, 0x50, 0x63, 0x79, 0x0A, 0x2F, 0x53, 0x4B, 0x45, 0x38, 0x59, 0x58, 0x4A, 0x4E, 0x33, 0x6E, 0x70, 0x74, 0x54, 0x2B, 0x2F, 0x58, 0x4F, 0x52, + 0x30, 0x73, 0x6F, 0x38, 0x52, 0x59, 0x67, 0x44, 0x64, 0x47, 0x47, 0x61, 0x68, 0x32, 0x58, 0x73, 0x6A, 0x58, 0x2F, 0x47, 0x4F, 0x31, 0x57, 0x66, 0x6F, 0x56, 0x4E, 0x70, 0x62, 0x4F, 0x6D, 0x73, 0x32, 0x62, 0x2F, 0x6D, 0x42, 0x73, 0x54, 0x4E, + 0x48, 0x4D, 0x33, 0x64, 0x41, 0x2B, 0x56, 0x4B, 0x71, 0x33, 0x64, 0x53, 0x44, 0x7A, 0x34, 0x56, 0x34, 0x0A, 0x6D, 0x5A, 0x71, 0x54, 0x75, 0x58, 0x4E, 0x6E, 0x51, 0x6B, 0x59, 0x52, 0x49, 0x65, 0x72, 0x2B, 0x43, 0x71, 0x6B, 0x62, 0x47, 0x6D, + 0x56, 0x70, 0x73, 0x34, 0x2B, 0x75, 0x46, 0x72, 0x62, 0x32, 0x53, 0x31, 0x61, 0x79, 0x4C, 0x66, 0x6D, 0x6C, 0x79, 0x4F, 0x77, 0x37, 0x59, 0x71, 0x50, 0x74, 0x61, 0x39, 0x42, 0x4F, 0x31, 0x55, 0x41, 0x4A, 0x70, 0x42, 0x2B, 0x59, 0x31, 0x7A, + 0x71, 0x6C, 0x6B, 0x6C, 0x6B, 0x67, 0x35, 0x4C, 0x42, 0x39, 0x7A, 0x56, 0x74, 0x7A, 0x0A, 0x61, 0x4C, 0x31, 0x74, 0x78, 0x4B, 0x49, 0x54, 0x44, 0x6D, 0x63, 0x5A, 0x75, 0x49, 0x31, 0x43, 0x66, 0x6D, 0x77, 0x4D, 0x6D, 0x6D, 0x36, 0x67, 0x4A, + 0x43, 0x33, 0x56, 0x52, 0x52, 0x76, 0x63, 0x78, 0x41, 0x49, 0x55, 0x2F, 0x6F, 0x56, 0x62, 0x5A, 0x5A, 0x66, 0x4B, 0x54, 0x70, 0x42, 0x51, 0x43, 0x48, 0x70, 0x43, 0x4E, 0x66, 0x6E, 0x71, 0x77, 0x6D, 0x62, 0x55, 0x2B, 0x41, 0x47, 0x75, 0x48, + 0x72, 0x53, 0x2B, 0x77, 0x36, 0x6A, 0x76, 0x2F, 0x6E, 0x61, 0x61, 0x0A, 0x6F, 0x71, 0x59, 0x66, 0x52, 0x76, 0x61, 0x45, 0x37, 0x66, 0x7A, 0x62, 0x7A, 0x73, 0x51, 0x43, 0x7A, 0x6E, 0x64, 0x49, 0x4C, 0x49, 0x79, 0x79, 0x37, 0x4D, 0x4D, 0x41, + 0x6F, 0x2B, 0x77, 0x73, 0x56, 0x52, 0x6A, 0x42, 0x66, 0x68, 0x6E, 0x75, 0x34, 0x53, 0x2F, 0x79, 0x72, 0x59, 0x4F, 0x62, 0x6E, 0x71, 0x73, 0x5A, 0x33, 0x38, 0x61, 0x4B, 0x4C, 0x34, 0x78, 0x33, 0x35, 0x62, 0x63, 0x46, 0x37, 0x44, 0x76, 0x42, + 0x37, 0x4C, 0x36, 0x47, 0x73, 0x34, 0x61, 0x38, 0x0A, 0x77, 0x50, 0x66, 0x63, 0x35, 0x2B, 0x70, 0x62, 0x72, 0x72, 0x4C, 0x4D, 0x74, 0x54, 0x57, 0x47, 0x53, 0x39, 0x44, 0x69, 0x50, 0x37, 0x62, 0x59, 0x2B, 0x41, 0x34, 0x41, 0x37, 0x6C, 0x33, + 0x6A, 0x39, 0x34, 0x31, 0x59, 0x2F, 0x38, 0x2B, 0x4C, 0x4E, 0x2B, 0x6C, 0x6A, 0x58, 0x32, 0x37, 0x33, 0x43, 0x58, 0x45, 0x32, 0x77, 0x68, 0x4A, 0x64, 0x56, 0x2F, 0x4C, 0x49, 0x74, 0x4D, 0x33, 0x7A, 0x37, 0x67, 0x4C, 0x66, 0x45, 0x64, 0x78, + 0x71, 0x75, 0x56, 0x65, 0x45, 0x0A, 0x48, 0x56, 0x6C, 0x4E, 0x6A, 0x4D, 0x37, 0x49, 0x44, 0x69, 0x50, 0x43, 0x74, 0x79, 0x61, 0x61, 0x45, 0x42, 0x52, 0x78, 0x2F, 0x70, 0x4F, 0x79, 0x69, 0x72, 0x69, 0x41, 0x38, 0x41, 0x34, 0x51, 0x6E, 0x74, + 0x4F, 0x6F, 0x55, 0x41, 0x77, 0x33, 0x67, 0x69, 0x2F, 0x71, 0x34, 0x49, 0x71, 0x64, 0x34, 0x53, 0x77, 0x35, 0x2F, 0x37, 0x57, 0x30, 0x63, 0x77, 0x44, 0x6B, 0x39, 0x30, 0x69, 0x6D, 0x63, 0x36, 0x79, 0x2F, 0x73, 0x74, 0x35, 0x33, 0x42, 0x49, + 0x65, 0x30, 0x0A, 0x6F, 0x38, 0x32, 0x62, 0x4E, 0x53, 0x51, 0x33, 0x2B, 0x70, 0x43, 0x54, 0x45, 0x34, 0x46, 0x43, 0x78, 0x70, 0x67, 0x6D, 0x64, 0x54, 0x64, 0x6D, 0x51, 0x52, 0x43, 0x73, 0x75, 0x2F, 0x57, 0x55, 0x34, 0x38, 0x49, 0x78, 0x4B, + 0x36, 0x33, 0x6E, 0x49, 0x31, 0x62, 0x4D, 0x4E, 0x53, 0x57, 0x53, 0x73, 0x31, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x0A, 0x46, 0x49, 0x52, 0x4D, 0x41, 0x50, 0x52, 0x4F, 0x46, 0x45, 0x53, 0x49, 0x4F, 0x4E, 0x41, 0x4C, 0x20, 0x43, 0x41, 0x20, 0x52, 0x4F, 0x4F, 0x54, 0x2D, 0x41, 0x20, 0x57, 0x45, 0x42, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, + 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x65, 0x6A, 0x43, 0x43, 0x41, 0x67, 0x43, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x4D, 0x5A, 0x63, 0x68, 0x37, 0x61, 0x2B, + 0x4A, 0x51, 0x6E, 0x38, 0x31, 0x51, 0x59, 0x65, 0x68, 0x5A, 0x31, 0x5A, 0x4D, 0x62, 0x54, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x75, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x46, 0x0A, 0x55, 0x7A, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x54, 0x52, 0x6D, 0x6C, 0x79, 0x62, 0x57, 0x46, 0x77, 0x63, 0x6D, 0x39, 0x6D, 0x5A, 0x58, + 0x4E, 0x70, 0x62, 0x32, 0x35, 0x68, 0x62, 0x43, 0x42, 0x54, 0x51, 0x54, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x59, 0x51, 0x77, 0x50, 0x56, 0x6B, 0x46, 0x55, 0x52, 0x56, 0x4D, 0x74, 0x51, 0x54, 0x59, 0x79, 0x4E, 0x6A, + 0x4D, 0x30, 0x4D, 0x44, 0x59, 0x34, 0x0A, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x35, 0x47, 0x53, 0x56, 0x4A, 0x4E, 0x51, 0x56, 0x42, 0x53, 0x54, 0x30, 0x5A, 0x46, 0x55, 0x30, 0x6C, 0x50, 0x54, + 0x6B, 0x46, 0x4D, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x50, 0x54, 0x31, 0x51, 0x74, 0x51, 0x53, 0x42, 0x58, 0x52, 0x55, 0x49, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x49, 0x77, 0x4E, 0x44, 0x41, 0x32, 0x4D, 0x44, 0x6B, 0x77, 0x4D, + 0x54, 0x4D, 0x32, 0x0A, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x63, 0x77, 0x4D, 0x7A, 0x4D, 0x78, 0x4D, 0x44, 0x6B, 0x77, 0x4D, 0x54, 0x4D, 0x32, 0x57, 0x6A, 0x42, 0x75, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, + 0x45, 0x77, 0x4A, 0x46, 0x55, 0x7A, 0x45, 0x63, 0x4D, 0x42, 0x6F, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x54, 0x52, 0x6D, 0x6C, 0x79, 0x62, 0x57, 0x46, 0x77, 0x63, 0x6D, 0x39, 0x6D, 0x5A, 0x58, 0x4E, 0x70, 0x62, 0x32, 0x35, 0x68, + 0x0A, 0x62, 0x43, 0x42, 0x54, 0x51, 0x54, 0x45, 0x59, 0x4D, 0x42, 0x59, 0x47, 0x41, 0x31, 0x55, 0x45, 0x59, 0x51, 0x77, 0x50, 0x56, 0x6B, 0x46, 0x55, 0x52, 0x56, 0x4D, 0x74, 0x51, 0x54, 0x59, 0x79, 0x4E, 0x6A, 0x4D, 0x30, 0x4D, 0x44, 0x59, + 0x34, 0x4D, 0x53, 0x63, 0x77, 0x4A, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x35, 0x47, 0x53, 0x56, 0x4A, 0x4E, 0x51, 0x56, 0x42, 0x53, 0x54, 0x30, 0x5A, 0x46, 0x55, 0x30, 0x6C, 0x50, 0x54, 0x6B, 0x46, 0x4D, 0x0A, 0x49, 0x45, + 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x50, 0x54, 0x31, 0x51, 0x74, 0x51, 0x53, 0x42, 0x58, 0x52, 0x55, 0x49, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, + 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x52, 0x48, 0x55, 0x2B, 0x6F, 0x73, 0x45, 0x61, 0x52, 0x33, 0x78, 0x79, 0x72, 0x71, 0x38, 0x39, 0x5A, 0x66, 0x65, 0x39, 0x4D, 0x45, 0x6B, 0x56, 0x7A, 0x36, 0x0A, 0x69, 0x4D, 0x59, 0x69, 0x75, + 0x59, 0x4D, 0x51, 0x59, 0x6E, 0x65, 0x45, 0x4D, 0x79, 0x33, 0x70, 0x41, 0x34, 0x6A, 0x55, 0x34, 0x44, 0x50, 0x33, 0x37, 0x58, 0x63, 0x73, 0x53, 0x6D, 0x44, 0x71, 0x35, 0x47, 0x2B, 0x74, 0x62, 0x62, 0x54, 0x34, 0x54, 0x49, 0x71, 0x6B, 0x35, + 0x42, 0x2F, 0x4B, 0x36, 0x6B, 0x38, 0x34, 0x53, 0x69, 0x36, 0x43, 0x63, 0x79, 0x76, 0x48, 0x5A, 0x70, 0x73, 0x4B, 0x6A, 0x45, 0x43, 0x63, 0x66, 0x49, 0x72, 0x32, 0x38, 0x6A, 0x6C, 0x67, 0x0A, 0x73, 0x74, 0x37, 0x4C, 0x37, 0x4C, 0x6A, 0x6B, + 0x62, 0x2B, 0x71, 0x62, 0x58, 0x62, 0x64, 0x54, 0x6B, 0x42, 0x67, 0x79, 0x56, 0x63, 0x55, 0x67, 0x74, 0x35, 0x53, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, + 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x6B, 0x2B, 0x46, 0x44, 0x0A, 0x59, 0x31, 0x77, 0x38, 0x6E, 0x64, 0x59, 0x6E, 0x38, 0x31, 0x4C, + 0x73, 0x46, 0x37, 0x4B, 0x70, 0x72, 0x79, 0x7A, 0x33, 0x64, 0x76, 0x67, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4A, 0x50, 0x68, 0x51, 0x32, 0x4E, 0x63, 0x50, 0x4A, 0x33, 0x57, 0x4A, 0x2F, 0x4E, + 0x53, 0x37, 0x42, 0x65, 0x79, 0x71, 0x61, 0x38, 0x73, 0x39, 0x33, 0x62, 0x34, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4B, 0x42, 0x67, + 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, 0x42, 0x6C, 0x41, 0x6A, 0x41, 0x64, 0x66, 0x4B, 0x52, 0x37, 0x77, 0x34, 0x6C, 0x31, 0x4D, 0x2B, 0x45, 0x37, 0x71, 0x55, 0x57, 0x2F, 0x52, 0x75, + 0x6E, 0x70, 0x6F, 0x64, 0x33, 0x4A, 0x49, 0x68, 0x61, 0x33, 0x52, 0x78, 0x45, 0x4C, 0x32, 0x4A, 0x71, 0x36, 0x38, 0x63, 0x67, 0x4C, 0x0A, 0x63, 0x46, 0x42, 0x54, 0x41, 0x70, 0x46, 0x77, 0x68, 0x56, 0x6D, 0x70, 0x48, 0x71, 0x54, 0x6D, 0x36, + 0x69, 0x4D, 0x78, 0x6F, 0x41, 0x41, 0x43, 0x4D, 0x51, 0x44, 0x39, 0x34, 0x76, 0x69, 0x7A, 0x72, 0x78, 0x61, 0x35, 0x48, 0x6E, 0x50, 0x45, 0x6C, 0x75, 0x50, 0x42, 0x4D, 0x42, 0x6E, 0x59, 0x66, 0x75, 0x62, 0x44, 0x6C, 0x39, 0x34, 0x63, 0x54, + 0x37, 0x69, 0x4A, 0x4C, 0x7A, 0x50, 0x72, 0x53, 0x41, 0x38, 0x5A, 0x39, 0x34, 0x64, 0x47, 0x58, 0x53, 0x61, 0x51, 0x0A, 0x70, 0x59, 0x58, 0x46, 0x75, 0x58, 0x71, 0x55, 0x50, 0x6F, 0x65, 0x6F, 0x76, 0x51, 0x41, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, + 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x57, 0x43, 0x41, 0x20, 0x43, 0x59, 0x42, 0x45, 0x52, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, + 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x6A, 0x54, 0x43, 0x43, 0x41, 0x33, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x51, 0x41, 0x45, 0x30, 0x6A, 0x4D, 0x49, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x54, 0x7A, 0x79, 0x78, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, 0x51, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x55, 0x56, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x56, 0x45, 0x46, 0x4A, 0x56, 0x30, 0x46, 0x4F, 0x4C, 0x55, 0x4E, 0x42, 0x4D, + 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x77, 0x64, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x52, 0x73, 0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4A, 0x55, 0x56, + 0x30, 0x4E, 0x42, 0x0A, 0x49, 0x45, 0x4E, 0x5A, 0x51, 0x6B, 0x56, 0x53, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x49, 0x78, 0x4D, 0x54, 0x49, 0x79, 0x4D, 0x44, 0x59, 0x31, + 0x4E, 0x44, 0x49, 0x35, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x63, 0x78, 0x4D, 0x54, 0x49, 0x79, 0x4D, 0x54, 0x55, 0x31, 0x4F, 0x54, 0x55, 0x35, 0x57, 0x6A, 0x42, 0x51, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, + 0x0A, 0x45, 0x77, 0x4A, 0x55, 0x56, 0x7A, 0x45, 0x53, 0x4D, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4A, 0x56, 0x45, 0x46, 0x4A, 0x56, 0x30, 0x46, 0x4F, 0x4C, 0x55, 0x4E, 0x42, 0x4D, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x4C, 0x45, 0x77, 0x64, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x52, 0x73, 0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x4A, 0x55, 0x56, 0x30, 0x4E, 0x42, 0x0A, 0x49, 0x45, + 0x4E, 0x5A, 0x51, 0x6B, 0x56, 0x53, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, + 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x47, 0x2B, 0x4D, 0x6F, 0x65, 0x32, 0x51, 0x6B, 0x67, 0x66, 0x68, 0x31, 0x73, 0x0A, 0x54, 0x73, 0x36, 0x50, 0x34, + 0x30, 0x63, 0x7A, 0x52, 0x4A, 0x7A, 0x48, 0x79, 0x57, 0x6D, 0x71, 0x4F, 0x6C, 0x74, 0x34, 0x37, 0x6E, 0x44, 0x53, 0x6B, 0x76, 0x67, 0x45, 0x73, 0x31, 0x4A, 0x53, 0x48, 0x57, 0x64, 0x79, 0x4B, 0x4B, 0x48, 0x66, 0x69, 0x31, 0x32, 0x56, 0x43, + 0x76, 0x37, 0x71, 0x7A, 0x65, 0x33, 0x33, 0x4B, 0x63, 0x37, 0x77, 0x62, 0x33, 0x2B, 0x73, 0x7A, 0x54, 0x33, 0x76, 0x73, 0x78, 0x78, 0x46, 0x61, 0x76, 0x63, 0x6F, 0x6B, 0x50, 0x46, 0x68, 0x0A, 0x56, 0x38, 0x55, 0x4D, 0x78, 0x4B, 0x4E, 0x51, + 0x58, 0x64, 0x37, 0x55, 0x74, 0x63, 0x73, 0x5A, 0x79, 0x6F, 0x43, 0x35, 0x64, 0x63, 0x34, 0x70, 0x7A, 0x74, 0x4B, 0x46, 0x49, 0x75, 0x77, 0x43, 0x59, 0x38, 0x78, 0x45, 0x4D, 0x43, 0x44, 0x61, 0x36, 0x70, 0x46, 0x62, 0x56, 0x75, 0x59, 0x64, + 0x48, 0x4E, 0x57, 0x64, 0x5A, 0x73, 0x63, 0x2F, 0x33, 0x34, 0x62, 0x4B, 0x53, 0x31, 0x50, 0x45, 0x32, 0x59, 0x32, 0x79, 0x48, 0x65, 0x72, 0x34, 0x33, 0x43, 0x64, 0x54, 0x0A, 0x6F, 0x30, 0x66, 0x68, 0x59, 0x63, 0x78, 0x39, 0x74, 0x62, 0x44, + 0x34, 0x37, 0x6E, 0x4F, 0x52, 0x78, 0x63, 0x35, 0x7A, 0x62, 0x38, 0x37, 0x75, 0x45, 0x42, 0x38, 0x61, 0x42, 0x73, 0x2F, 0x70, 0x4A, 0x32, 0x44, 0x46, 0x54, 0x78, 0x6E, 0x6B, 0x36, 0x38, 0x34, 0x69, 0x4A, 0x6B, 0x58, 0x58, 0x59, 0x4A, 0x6E, + 0x64, 0x7A, 0x6B, 0x38, 0x33, 0x34, 0x48, 0x2F, 0x6E, 0x59, 0x36, 0x32, 0x77, 0x75, 0x46, 0x6D, 0x34, 0x30, 0x41, 0x5A, 0x6F, 0x4E, 0x57, 0x44, 0x54, 0x0A, 0x4E, 0x71, 0x35, 0x78, 0x51, 0x77, 0x54, 0x78, 0x61, 0x57, 0x56, 0x34, 0x66, 0x50, + 0x4D, 0x66, 0x38, 0x38, 0x6F, 0x6F, 0x6E, 0x31, 0x6F, 0x67, 0x6C, 0x57, 0x61, 0x30, 0x7A, 0x62, 0x66, 0x75, 0x6A, 0x33, 0x69, 0x6B, 0x52, 0x52, 0x6A, 0x70, 0x4A, 0x69, 0x2B, 0x4E, 0x6D, 0x79, 0x6B, 0x6F, 0x73, 0x61, 0x53, 0x33, 0x4F, 0x6D, + 0x32, 0x35, 0x31, 0x42, 0x77, 0x34, 0x63, 0x6B, 0x56, 0x59, 0x73, 0x56, 0x37, 0x72, 0x38, 0x43, 0x69, 0x62, 0x74, 0x34, 0x4C, 0x4B, 0x0A, 0x2F, 0x63, 0x2F, 0x57, 0x4D, 0x77, 0x2B, 0x66, 0x2B, 0x35, 0x65, 0x65, 0x73, 0x52, 0x79, 0x63, 0x6E, + 0x75, 0x70, 0x66, 0x58, 0x74, 0x75, 0x71, 0x33, 0x56, 0x54, 0x70, 0x4D, 0x43, 0x45, 0x6F, 0x62, 0x59, 0x35, 0x35, 0x38, 0x33, 0x57, 0x53, 0x6A, 0x43, 0x62, 0x2B, 0x33, 0x4D, 0x58, 0x32, 0x77, 0x37, 0x44, 0x66, 0x52, 0x46, 0x6C, 0x44, 0x6F, + 0x37, 0x59, 0x44, 0x4B, 0x50, 0x59, 0x49, 0x4D, 0x4B, 0x6F, 0x4E, 0x4D, 0x2B, 0x48, 0x76, 0x6E, 0x4B, 0x6B, 0x48, 0x0A, 0x49, 0x75, 0x4E, 0x5A, 0x57, 0x30, 0x43, 0x50, 0x32, 0x6F, 0x69, 0x33, 0x61, 0x51, 0x69, 0x6F, 0x74, 0x79, 0x4D, 0x75, + 0x52, 0x41, 0x6C, 0x5A, 0x4E, 0x31, 0x76, 0x48, 0x34, 0x78, 0x66, 0x79, 0x49, 0x75, 0x74, 0x75, 0x4F, 0x56, 0x4C, 0x46, 0x33, 0x6C, 0x53, 0x6E, 0x6D, 0x4D, 0x6C, 0x4C, 0x49, 0x4A, 0x58, 0x63, 0x52, 0x6F, 0x6C, 0x66, 0x74, 0x42, 0x4C, 0x35, + 0x68, 0x53, 0x6D, 0x4F, 0x36, 0x38, 0x67, 0x6E, 0x46, 0x53, 0x44, 0x41, 0x53, 0x39, 0x54, 0x4D, 0x0A, 0x66, 0x41, 0x78, 0x73, 0x4E, 0x41, 0x77, 0x6D, 0x6D, 0x79, 0x59, 0x78, 0x70, 0x6A, 0x79, 0x6E, 0x39, 0x74, 0x6E, 0x51, 0x53, 0x36, 0x4A, + 0x6B, 0x2F, 0x7A, 0x75, 0x5A, 0x51, 0x58, 0x4C, 0x42, 0x34, 0x48, 0x43, 0x58, 0x38, 0x53, 0x53, 0x37, 0x4B, 0x38, 0x52, 0x30, 0x49, 0x72, 0x47, 0x73, 0x61, 0x79, 0x49, 0x79, 0x4A, 0x4E, 0x4E, 0x34, 0x4B, 0x73, 0x44, 0x41, 0x6F, 0x53, 0x2F, + 0x78, 0x55, 0x67, 0x58, 0x4A, 0x50, 0x2B, 0x39, 0x32, 0x5A, 0x75, 0x4A, 0x46, 0x0A, 0x32, 0x41, 0x30, 0x39, 0x72, 0x5A, 0x58, 0x49, 0x78, 0x34, 0x6B, 0x6D, 0x79, 0x41, 0x2B, 0x75, 0x70, 0x77, 0x4D, 0x75, 0x2B, 0x38, 0x46, 0x66, 0x2B, 0x69, + 0x44, 0x68, 0x63, 0x4B, 0x32, 0x77, 0x5A, 0x53, 0x41, 0x33, 0x4D, 0x32, 0x43, 0x77, 0x31, 0x61, 0x2F, 0x58, 0x44, 0x42, 0x7A, 0x43, 0x6B, 0x48, 0x44, 0x58, 0x53, 0x68, 0x69, 0x38, 0x66, 0x67, 0x47, 0x77, 0x73, 0x4F, 0x73, 0x56, 0x48, 0x6B, + 0x51, 0x47, 0x7A, 0x61, 0x52, 0x50, 0x36, 0x41, 0x7A, 0x52, 0x0A, 0x77, 0x79, 0x41, 0x51, 0x34, 0x56, 0x52, 0x6C, 0x6E, 0x72, 0x5A, 0x52, 0x30, 0x42, 0x70, 0x32, 0x61, 0x30, 0x4A, 0x61, 0x57, 0x48, 0x59, 0x30, 0x36, 0x72, 0x63, 0x33, 0x47, + 0x61, 0x34, 0x75, 0x64, 0x66, 0x6D, 0x57, 0x35, 0x63, 0x46, 0x5A, 0x39, 0x35, 0x52, 0x58, 0x4B, 0x53, 0x57, 0x4E, 0x4F, 0x6B, 0x79, 0x72, 0x54, 0x5A, 0x70, 0x42, 0x30, 0x46, 0x38, 0x6D, 0x41, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6F, + 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x4F, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4D, 0x43, 0x41, 0x51, 0x59, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, + 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x53, 0x64, 0x68, 0x57, 0x45, 0x55, 0x66, 0x4D, 0x46, 0x69, 0x62, 0x35, 0x64, 0x6F, + 0x35, 0x45, 0x38, 0x33, 0x0A, 0x51, 0x4F, 0x47, 0x74, 0x34, 0x41, 0x31, 0x57, 0x4E, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x6E, 0x59, 0x56, 0x68, 0x46, 0x48, 0x7A, 0x42, 0x59, 0x6D, 0x2B, + 0x58, 0x61, 0x4F, 0x52, 0x50, 0x4E, 0x30, 0x44, 0x68, 0x72, 0x65, 0x41, 0x4E, 0x56, 0x6A, 0x63, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, + 0x42, 0x0A, 0x41, 0x47, 0x53, 0x50, 0x65, 0x73, 0x52, 0x69, 0x44, 0x72, 0x57, 0x49, 0x7A, 0x4C, 0x6A, 0x48, 0x68, 0x67, 0x36, 0x68, 0x53, 0x68, 0x62, 0x4E, 0x63, 0x41, 0x75, 0x33, 0x70, 0x34, 0x55, 0x4C, 0x73, 0x33, 0x61, 0x32, 0x44, 0x36, + 0x66, 0x2F, 0x43, 0x49, 0x73, 0x4C, 0x4A, 0x63, 0x2B, 0x6F, 0x31, 0x49, 0x4E, 0x31, 0x4B, 0x72, 0x69, 0x57, 0x69, 0x4C, 0x62, 0x37, 0x33, 0x79, 0x30, 0x74, 0x74, 0x47, 0x6C, 0x54, 0x49, 0x54, 0x56, 0x58, 0x31, 0x6F, 0x6C, 0x4E, 0x0A, 0x63, + 0x37, 0x39, 0x70, 0x6A, 0x33, 0x43, 0x6A, 0x59, 0x63, 0x79, 0x61, 0x32, 0x78, 0x36, 0x61, 0x34, 0x43, 0x44, 0x34, 0x62, 0x4C, 0x75, 0x62, 0x49, 0x70, 0x31, 0x64, 0x68, 0x44, 0x47, 0x61, 0x4C, 0x49, 0x72, 0x64, 0x61, 0x71, 0x48, 0x58, 0x4B, + 0x47, 0x6E, 0x4B, 0x2F, 0x6E, 0x5A, 0x56, 0x65, 0x6B, 0x5A, 0x6E, 0x36, 0x38, 0x78, 0x44, 0x69, 0x42, 0x61, 0x69, 0x41, 0x39, 0x61, 0x35, 0x46, 0x2F, 0x67, 0x5A, 0x62, 0x47, 0x30, 0x6A, 0x41, 0x6E, 0x2F, 0x78, 0x0A, 0x58, 0x39, 0x41, 0x4B, + 0x4B, 0x53, 0x4D, 0x37, 0x30, 0x61, 0x6F, 0x4B, 0x37, 0x61, 0x6B, 0x58, 0x4A, 0x6C, 0x51, 0x4B, 0x54, 0x63, 0x4B, 0x6C, 0x54, 0x66, 0x6A, 0x46, 0x2F, 0x62, 0x69, 0x42, 0x7A, 0x79, 0x73, 0x73, 0x65, 0x4B, 0x4E, 0x6E, 0x54, 0x4B, 0x6B, 0x48, + 0x6D, 0x76, 0x50, 0x66, 0x58, 0x76, 0x74, 0x38, 0x39, 0x59, 0x6E, 0x4E, 0x64, 0x4A, 0x64, 0x68, 0x45, 0x47, 0x6F, 0x48, 0x4B, 0x34, 0x46, 0x61, 0x30, 0x6F, 0x36, 0x33, 0x35, 0x79, 0x44, 0x52, 0x0A, 0x49, 0x47, 0x34, 0x6B, 0x71, 0x49, 0x51, + 0x6E, 0x6F, 0x56, 0x65, 0x73, 0x71, 0x6C, 0x56, 0x59, 0x4C, 0x39, 0x7A, 0x5A, 0x79, 0x76, 0x70, 0x6F, 0x42, 0x4A, 0x37, 0x74, 0x52, 0x43, 0x54, 0x35, 0x64, 0x45, 0x41, 0x37, 0x49, 0x7A, 0x4F, 0x72, 0x67, 0x31, 0x6F, 0x59, 0x4A, 0x6B, 0x4B, + 0x32, 0x62, 0x56, 0x53, 0x31, 0x46, 0x6D, 0x41, 0x77, 0x62, 0x4C, 0x47, 0x67, 0x2B, 0x4C, 0x68, 0x42, 0x6F, 0x46, 0x31, 0x4A, 0x53, 0x64, 0x4A, 0x6C, 0x42, 0x54, 0x72, 0x71, 0x0A, 0x2F, 0x70, 0x31, 0x68, 0x76, 0x49, 0x62, 0x5A, 0x76, 0x39, + 0x37, 0x54, 0x75, 0x6A, 0x71, 0x78, 0x66, 0x33, 0x36, 0x53, 0x4E, 0x49, 0x37, 0x4A, 0x41, 0x47, 0x37, 0x63, 0x6D, 0x4C, 0x33, 0x63, 0x37, 0x49, 0x41, 0x46, 0x72, 0x51, 0x49, 0x39, 0x33, 0x32, 0x58, 0x74, 0x43, 0x77, 0x50, 0x33, 0x39, 0x78, + 0x61, 0x45, 0x42, 0x44, 0x47, 0x36, 0x6B, 0x35, 0x54, 0x59, 0x38, 0x68, 0x4C, 0x34, 0x69, 0x75, 0x4F, 0x2F, 0x51, 0x71, 0x2B, 0x6E, 0x31, 0x4D, 0x30, 0x52, 0x0A, 0x46, 0x78, 0x62, 0x49, 0x51, 0x68, 0x30, 0x55, 0x71, 0x45, 0x4C, 0x32, 0x30, + 0x6B, 0x43, 0x47, 0x6F, 0x45, 0x38, 0x6A, 0x79, 0x70, 0x5A, 0x46, 0x56, 0x6D, 0x41, 0x47, 0x7A, 0x62, 0x64, 0x56, 0x41, 0x61, 0x59, 0x42, 0x6C, 0x47, 0x58, 0x2B, 0x62, 0x67, 0x55, 0x4A, 0x75, 0x72, 0x53, 0x6B, 0x71, 0x75, 0x4C, 0x76, 0x57, + 0x4C, 0x36, 0x39, 0x4A, 0x31, 0x62, 0x59, 0x37, 0x33, 0x4E, 0x78, 0x57, 0x30, 0x51, 0x7A, 0x38, 0x70, 0x70, 0x79, 0x36, 0x72, 0x42, 0x65, 0x0A, 0x50, 0x6D, 0x36, 0x70, 0x55, 0x6C, 0x76, 0x73, 0x63, 0x47, 0x32, 0x31, 0x68, 0x34, 0x38, 0x33, + 0x58, 0x6A, 0x79, 0x4D, 0x6E, 0x4D, 0x37, 0x6B, 0x38, 0x4D, 0x34, 0x4D, 0x5A, 0x30, 0x48, 0x4D, 0x7A, 0x76, 0x61, 0x41, 0x71, 0x30, 0x37, 0x4D, 0x54, 0x46, 0x62, 0x31, 0x77, 0x57, 0x46, 0x5A, 0x6B, 0x37, 0x51, 0x2B, 0x70, 0x74, 0x71, 0x34, + 0x4E, 0x78, 0x4B, 0x66, 0x4B, 0x6A, 0x4C, 0x6A, 0x69, 0x37, 0x67, 0x68, 0x37, 0x4D, 0x4D, 0x72, 0x5A, 0x51, 0x7A, 0x76, 0x0A, 0x49, 0x74, 0x36, 0x49, 0x4B, 0x54, 0x74, 0x4D, 0x31, 0x2F, 0x72, 0x2B, 0x74, 0x2B, 0x46, 0x48, 0x76, 0x70, 0x77, + 0x2B, 0x50, 0x6F, 0x50, 0x37, 0x55, 0x56, 0x33, 0x31, 0x61, 0x50, 0x63, 0x75, 0x49, 0x59, 0x58, 0x63, 0x76, 0x2F, 0x46, 0x61, 0x34, 0x6E, 0x7A, 0x58, 0x78, 0x65, 0x53, 0x44, 0x77, 0x57, 0x72, 0x72, 0x75, 0x6F, 0x42, 0x61, 0x33, 0x6C, 0x77, + 0x74, 0x63, 0x48, 0x62, 0x34, 0x79, 0x4F, 0x57, 0x48, 0x68, 0x38, 0x71, 0x67, 0x6E, 0x61, 0x48, 0x6C, 0x0A, 0x49, 0x68, 0x49, 0x6E, 0x44, 0x30, 0x51, 0x39, 0x48, 0x57, 0x7A, 0x71, 0x31, 0x4D, 0x4B, 0x4C, 0x4C, 0x32, 0x39, 0x35, 0x71, 0x33, + 0x39, 0x51, 0x70, 0x73, 0x51, 0x5A, 0x70, 0x36, 0x46, 0x36, 0x74, 0x35, 0x62, 0x35, 0x77, 0x52, 0x39, 0x69, 0x57, 0x71, 0x4A, 0x44, 0x42, 0x30, 0x42, 0x65, 0x4A, 0x73, 0x61, 0x73, 0x37, 0x61, 0x35, 0x77, 0x46, 0x73, 0x57, 0x71, 0x79, 0x6E, + 0x4B, 0x4B, 0x54, 0x62, 0x44, 0x50, 0x41, 0x59, 0x73, 0x44, 0x50, 0x32, 0x37, 0x58, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x31, 0x32, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x44, 0x63, 0x6A, 0x43, 0x43, + 0x41, 0x6C, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x5A, 0x76, 0x6E, 0x48, 0x77, 0x61, 0x2F, 0x73, 0x77, 0x6C, 0x47, 0x30, 0x37, 0x56, 0x4F, 0x58, 0x35, 0x75, 0x61, 0x43, 0x77, 0x79, 0x73, 0x63, 0x6B, 0x42, 0x59, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x6C, 0x41, + 0x78, 0x49, 0x7A, 0x41, 0x68, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x6B, 0x4E, 0x35, 0x59, 0x6D, 0x56, 0x79, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x53, 0x6D, 0x46, 0x77, 0x59, 0x57, 0x34, 0x67, 0x51, 0x32, 0x38, + 0x75, 0x4C, 0x43, 0x42, 0x4D, 0x64, 0x47, 0x51, 0x75, 0x4D, 0x52, 0x30, 0x77, 0x47, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x52, 0x54, 0x0A, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, + 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4D, 0x6A, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x44, 0x41, 0x30, 0x4D, 0x44, 0x67, 0x77, 0x4E, 0x54, 0x4D, 0x32, 0x4E, 0x44, 0x5A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4D, 0x44, + 0x41, 0x30, 0x4D, 0x44, 0x67, 0x77, 0x4E, 0x54, 0x4D, 0x32, 0x4E, 0x44, 0x5A, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x70, 0x51, 0x4D, 0x53, 0x4D, 0x77, 0x49, + 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x70, 0x44, 0x65, 0x57, 0x4A, 0x6C, 0x63, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x70, 0x68, 0x63, 0x47, 0x46, 0x75, 0x49, 0x45, 0x4E, 0x76, 0x4C, 0x69, 0x77, 0x67, 0x54, + 0x48, 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x64, 0x4D, 0x42, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x55, 0x0A, 0x55, 0x32, 0x56, 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, + 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x54, 0x49, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, + 0x67, 0x67, 0x45, 0x4B, 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x43, 0x36, 0x4F, 0x63, 0x45, 0x33, 0x0A, 0x65, 0x6D, 0x68, 0x46, 0x4B, 0x78, 0x53, 0x30, 0x36, 0x2B, 0x51, 0x54, 0x36, 0x31, 0x64, 0x31, 0x49, 0x30, 0x32, 0x50, 0x4A, 0x43, 0x30, + 0x57, 0x36, 0x4B, 0x36, 0x4F, 0x79, 0x58, 0x32, 0x6B, 0x56, 0x7A, 0x73, 0x71, 0x64, 0x69, 0x55, 0x7A, 0x67, 0x32, 0x7A, 0x71, 0x4D, 0x6F, 0x71, 0x55, 0x6D, 0x30, 0x34, 0x38, 0x6C, 0x75, 0x54, 0x39, 0x55, 0x62, 0x2B, 0x5A, 0x79, 0x5A, 0x4E, + 0x2B, 0x76, 0x2F, 0x6D, 0x74, 0x70, 0x37, 0x4A, 0x49, 0x4B, 0x77, 0x63, 0x63, 0x0A, 0x4A, 0x2F, 0x56, 0x4D, 0x76, 0x48, 0x41, 0x53, 0x64, 0x36, 0x53, 0x46, 0x56, 0x4C, 0x58, 0x39, 0x6B, 0x48, 0x72, 0x6B, 0x6F, 0x2B, 0x52, 0x52, 0x57, 0x41, + 0x50, 0x4E, 0x45, 0x48, 0x6C, 0x35, 0x37, 0x6D, 0x75, 0x54, 0x48, 0x32, 0x53, 0x4F, 0x61, 0x32, 0x53, 0x72, 0x6F, 0x78, 0x50, 0x6A, 0x63, 0x66, 0x35, 0x39, 0x71, 0x35, 0x7A, 0x64, 0x4A, 0x31, 0x4D, 0x33, 0x73, 0x36, 0x6F, 0x59, 0x77, 0x6C, + 0x6B, 0x6D, 0x37, 0x46, 0x73, 0x66, 0x30, 0x75, 0x5A, 0x6C, 0x0A, 0x66, 0x4F, 0x2B, 0x54, 0x76, 0x64, 0x68, 0x59, 0x58, 0x41, 0x76, 0x41, 0x34, 0x32, 0x56, 0x76, 0x50, 0x4D, 0x66, 0x4B, 0x57, 0x65, 0x50, 0x2B, 0x62, 0x6C, 0x2B, 0x73, 0x67, + 0x37, 0x37, 0x39, 0x58, 0x53, 0x56, 0x4F, 0x4B, 0x69, 0x6B, 0x37, 0x31, 0x67, 0x75, 0x72, 0x46, 0x7A, 0x4A, 0x34, 0x70, 0x4F, 0x45, 0x2B, 0x6C, 0x45, 0x61, 0x2B, 0x59, 0x6D, 0x36, 0x62, 0x33, 0x6B, 0x61, 0x6F, 0x73, 0x52, 0x62, 0x6E, 0x68, + 0x57, 0x37, 0x30, 0x43, 0x45, 0x42, 0x46, 0x0A, 0x45, 0x61, 0x43, 0x65, 0x56, 0x45, 0x53, 0x45, 0x39, 0x39, 0x67, 0x32, 0x7A, 0x76, 0x56, 0x51, 0x52, 0x39, 0x77, 0x73, 0x4D, 0x4A, 0x76, 0x75, 0x77, 0x50, 0x57, 0x57, 0x30, 0x76, 0x34, 0x4A, + 0x68, 0x73, 0x63, 0x47, 0x57, 0x61, 0x35, 0x50, 0x72, 0x6F, 0x34, 0x52, 0x6D, 0x48, 0x76, 0x7A, 0x43, 0x31, 0x4B, 0x71, 0x59, 0x69, 0x61, 0x71, 0x49, 0x64, 0x2B, 0x4F, 0x4A, 0x54, 0x4E, 0x35, 0x6C, 0x78, 0x5A, 0x4A, 0x6A, 0x66, 0x55, 0x2B, + 0x31, 0x55, 0x65, 0x66, 0x0A, 0x4E, 0x7A, 0x46, 0x4A, 0x4D, 0x33, 0x49, 0x46, 0x54, 0x51, 0x79, 0x32, 0x56, 0x59, 0x7A, 0x78, 0x56, 0x34, 0x2B, 0x4B, 0x68, 0x39, 0x47, 0x74, 0x78, 0x52, 0x45, 0x53, 0x4F, 0x61, 0x43, 0x74, 0x41, 0x67, 0x4D, + 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, + 0x50, 0x0A, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x52, 0x58, 0x4E, 0x50, 0x4E, 0x30, 0x7A, 0x77, 0x52, 0x4C, 0x31, 0x53, + 0x58, 0x6D, 0x38, 0x55, 0x43, 0x32, 0x4C, 0x45, 0x7A, 0x5A, 0x4C, 0x65, 0x6D, 0x67, 0x72, 0x54, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x0A, 0x41, + 0x51, 0x45, 0x41, 0x50, 0x72, 0x76, 0x62, 0x46, 0x78, 0x62, 0x53, 0x38, 0x68, 0x51, 0x42, 0x49, 0x43, 0x77, 0x34, 0x67, 0x30, 0x75, 0x74, 0x76, 0x73, 0x71, 0x46, 0x65, 0x70, 0x71, 0x32, 0x6D, 0x32, 0x75, 0x6D, 0x34, 0x66, 0x79, 0x6C, 0x4F, + 0x71, 0x79, 0x74, 0x74, 0x43, 0x67, 0x36, 0x72, 0x39, 0x63, 0x42, 0x67, 0x30, 0x6B, 0x72, 0x59, 0x36, 0x4C, 0x64, 0x6D, 0x6D, 0x51, 0x4F, 0x6D, 0x46, 0x78, 0x76, 0x33, 0x59, 0x36, 0x37, 0x69, 0x6C, 0x51, 0x69, 0x0A, 0x4C, 0x55, 0x6F, 0x54, + 0x38, 0x36, 0x35, 0x41, 0x51, 0x39, 0x74, 0x50, 0x6B, 0x62, 0x65, 0x47, 0x47, 0x75, 0x77, 0x41, 0x74, 0x45, 0x47, 0x42, 0x70, 0x45, 0x2F, 0x36, 0x61, 0x6F, 0x75, 0x49, 0x73, 0x33, 0x59, 0x49, 0x63, 0x69, 0x70, 0x4A, 0x51, 0x4D, 0x50, 0x54, + 0x77, 0x34, 0x57, 0x4A, 0x6D, 0x42, 0x43, 0x6C, 0x6E, 0x57, 0x38, 0x5A, 0x74, 0x37, 0x76, 0x50, 0x65, 0x6D, 0x56, 0x56, 0x32, 0x7A, 0x66, 0x72, 0x50, 0x49, 0x70, 0x79, 0x4D, 0x70, 0x63, 0x65, 0x0A, 0x6D, 0x69, 0x6B, 0x2B, 0x72, 0x59, 0x33, + 0x6D, 0x6F, 0x78, 0x74, 0x74, 0x39, 0x58, 0x55, 0x61, 0x35, 0x72, 0x42, 0x6F, 0x75, 0x56, 0x75, 0x69, 0x37, 0x6D, 0x6C, 0x48, 0x4A, 0x7A, 0x57, 0x68, 0x68, 0x70, 0x6D, 0x41, 0x38, 0x7A, 0x4E, 0x4C, 0x34, 0x57, 0x75, 0x6B, 0x4A, 0x73, 0x50, + 0x76, 0x64, 0x46, 0x6C, 0x73, 0x65, 0x71, 0x4A, 0x6B, 0x74, 0x68, 0x35, 0x45, 0x77, 0x31, 0x44, 0x67, 0x44, 0x7A, 0x6B, 0x39, 0x71, 0x54, 0x50, 0x78, 0x70, 0x66, 0x50, 0x53, 0x0A, 0x76, 0x57, 0x4B, 0x45, 0x72, 0x49, 0x34, 0x63, 0x71, 0x63, + 0x31, 0x61, 0x76, 0x54, 0x63, 0x37, 0x62, 0x67, 0x6F, 0x69, 0x74, 0x50, 0x51, 0x56, 0x35, 0x35, 0x46, 0x59, 0x78, 0x54, 0x70, 0x45, 0x30, 0x35, 0x55, 0x6F, 0x32, 0x63, 0x42, 0x6C, 0x36, 0x58, 0x4C, 0x4B, 0x30, 0x41, 0x2B, 0x39, 0x48, 0x37, + 0x4D, 0x56, 0x32, 0x61, 0x6E, 0x6A, 0x70, 0x45, 0x63, 0x4A, 0x6E, 0x75, 0x44, 0x4C, 0x4E, 0x2F, 0x76, 0x39, 0x76, 0x5A, 0x66, 0x56, 0x76, 0x68, 0x67, 0x61, 0x0A, 0x61, 0x61, 0x49, 0x35, 0x67, 0x64, 0x6B, 0x61, 0x39, 0x61, 0x74, 0x2F, 0x79, + 0x4F, 0x50, 0x69, 0x5A, 0x77, 0x75, 0x64, 0x39, 0x41, 0x7A, 0x71, 0x56, 0x4E, 0x2F, 0x53, 0x73, 0x71, 0x2B, 0x78, 0x49, 0x76, 0x45, 0x67, 0x33, 0x37, 0x78, 0x45, 0x48, 0x41, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, + 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x31, 0x34, 0x0A, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x63, 0x6A, 0x43, 0x43, 0x41, 0x31, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x5A, 0x4E, 0x74, 0x61, 0x44, 0x43, 0x42, 0x4F, 0x36, 0x4E, 0x63, + 0x70, 0x64, 0x38, 0x68, 0x51, 0x4A, 0x36, 0x4A, 0x61, 0x4A, 0x39, 0x30, 0x74, 0x38, 0x73, 0x73, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, + 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x6C, 0x41, 0x78, 0x49, 0x7A, 0x41, 0x68, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x6B, 0x4E, 0x35, 0x59, 0x6D, 0x56, 0x79, 0x64, 0x48, + 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x53, 0x6D, 0x46, 0x77, 0x59, 0x57, 0x34, 0x67, 0x51, 0x32, 0x38, 0x75, 0x4C, 0x43, 0x42, 0x4D, 0x64, 0x47, 0x51, 0x75, 0x4D, 0x52, 0x30, 0x77, 0x47, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, + 0x52, 0x54, 0x0A, 0x5A, 0x57, 0x4E, 0x31, 0x63, 0x6D, 0x56, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4E, 0x44, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x44, 0x41, 0x30, 0x4D, + 0x44, 0x67, 0x77, 0x4E, 0x7A, 0x41, 0x32, 0x4D, 0x54, 0x6C, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4E, 0x54, 0x41, 0x30, 0x4D, 0x44, 0x67, 0x77, 0x4E, 0x7A, 0x41, 0x32, 0x4D, 0x54, 0x6C, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x0A, + 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x70, 0x51, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x70, 0x44, 0x65, 0x57, 0x4A, 0x6C, 0x63, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, + 0x49, 0x45, 0x70, 0x68, 0x63, 0x47, 0x46, 0x75, 0x49, 0x45, 0x4E, 0x76, 0x4C, 0x69, 0x77, 0x67, 0x54, 0x48, 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x64, 0x4D, 0x42, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x55, 0x0A, 0x55, 0x32, 0x56, + 0x6A, 0x64, 0x58, 0x4A, 0x6C, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x4D, 0x54, 0x51, 0x77, 0x67, 0x67, 0x49, 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, + 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, 0x46, 0x30, 0x6E, 0x71, 0x68, 0x0A, 0x31, 0x6F, 0x71, 0x2F, 0x46, 0x6A, + 0x48, 0x51, 0x6D, 0x4E, 0x45, 0x36, 0x6C, 0x50, 0x78, 0x61, 0x75, 0x47, 0x34, 0x69, 0x77, 0x57, 0x4C, 0x33, 0x70, 0x77, 0x6F, 0x6E, 0x37, 0x31, 0x44, 0x32, 0x4C, 0x72, 0x47, 0x65, 0x61, 0x42, 0x4C, 0x77, 0x62, 0x43, 0x52, 0x6A, 0x4F, 0x66, + 0x48, 0x77, 0x33, 0x78, 0x44, 0x47, 0x33, 0x72, 0x64, 0x53, 0x49, 0x4E, 0x56, 0x53, 0x57, 0x30, 0x4B, 0x5A, 0x6E, 0x76, 0x4F, 0x67, 0x76, 0x6C, 0x49, 0x66, 0x58, 0x38, 0x78, 0x6E, 0x0A, 0x62, 0x61, 0x63, 0x75, 0x55, 0x4B, 0x4C, 0x42, 0x6C, + 0x34, 0x32, 0x32, 0x2B, 0x4A, 0x58, 0x31, 0x73, 0x4C, 0x72, 0x63, 0x6E, 0x65, 0x43, 0x2B, 0x79, 0x39, 0x2F, 0x33, 0x4F, 0x50, 0x4A, 0x48, 0x39, 0x61, 0x61, 0x61, 0x6B, 0x70, 0x55, 0x71, 0x59, 0x6C, 0x6C, 0x51, 0x43, 0x36, 0x4B, 0x78, 0x4E, + 0x65, 0x64, 0x6C, 0x73, 0x6D, 0x47, 0x79, 0x36, 0x70, 0x4A, 0x78, 0x61, 0x65, 0x51, 0x70, 0x38, 0x45, 0x2B, 0x42, 0x67, 0x51, 0x51, 0x38, 0x73, 0x71, 0x56, 0x62, 0x0A, 0x31, 0x4D, 0x57, 0x6F, 0x57, 0x57, 0x64, 0x37, 0x56, 0x52, 0x78, 0x4A, + 0x71, 0x33, 0x71, 0x64, 0x77, 0x75, 0x64, 0x7A, 0x54, 0x65, 0x2F, 0x4E, 0x43, 0x63, 0x4C, 0x45, 0x56, 0x78, 0x4C, 0x62, 0x41, 0x51, 0x34, 0x6A, 0x65, 0x51, 0x6B, 0x48, 0x4F, 0x36, 0x4C, 0x6F, 0x2F, 0x49, 0x72, 0x50, 0x6A, 0x38, 0x42, 0x47, + 0x4A, 0x4A, 0x77, 0x34, 0x4A, 0x2B, 0x43, 0x44, 0x6E, 0x52, 0x75, 0x67, 0x76, 0x33, 0x67, 0x56, 0x45, 0x4F, 0x75, 0x47, 0x54, 0x67, 0x70, 0x61, 0x0A, 0x2F, 0x64, 0x2F, 0x61, 0x4C, 0x49, 0x4A, 0x2B, 0x37, 0x73, 0x72, 0x32, 0x4B, 0x65, 0x48, + 0x36, 0x63, 0x61, 0x48, 0x33, 0x69, 0x47, 0x69, 0x63, 0x6E, 0x50, 0x43, 0x4E, 0x76, 0x67, 0x39, 0x4A, 0x6B, 0x64, 0x6A, 0x71, 0x4F, 0x76, 0x6E, 0x39, 0x30, 0x47, 0x68, 0x78, 0x32, 0x2B, 0x6D, 0x31, 0x4B, 0x30, 0x36, 0x43, 0x6B, 0x6D, 0x39, + 0x6D, 0x48, 0x2B, 0x44, 0x77, 0x33, 0x45, 0x7A, 0x73, 0x79, 0x74, 0x48, 0x71, 0x75, 0x6E, 0x51, 0x47, 0x2B, 0x62, 0x4F, 0x45, 0x0A, 0x6B, 0x4A, 0x54, 0x52, 0x58, 0x34, 0x35, 0x7A, 0x47, 0x52, 0x42, 0x64, 0x41, 0x75, 0x56, 0x77, 0x70, 0x63, + 0x41, 0x51, 0x30, 0x42, 0x42, 0x38, 0x62, 0x38, 0x56, 0x59, 0x53, 0x62, 0x53, 0x77, 0x62, 0x70, 0x72, 0x61, 0x66, 0x5A, 0x58, 0x31, 0x7A, 0x4E, 0x6F, 0x43, 0x72, 0x37, 0x67, 0x73, 0x66, 0x58, 0x6D, 0x50, 0x76, 0x6B, 0x50, 0x78, 0x2B, 0x53, + 0x67, 0x6F, 0x6A, 0x51, 0x6C, 0x44, 0x2B, 0x41, 0x6A, 0x64, 0x61, 0x38, 0x69, 0x4C, 0x4C, 0x43, 0x53, 0x78, 0x0A, 0x6A, 0x56, 0x49, 0x48, 0x76, 0x58, 0x69, 0x62, 0x79, 0x38, 0x70, 0x6F, 0x73, 0x71, 0x54, 0x64, 0x44, 0x45, 0x78, 0x35, 0x59, + 0x4D, 0x61, 0x5A, 0x30, 0x5A, 0x50, 0x78, 0x4D, 0x42, 0x6F, 0x48, 0x30, 0x36, 0x34, 0x69, 0x77, 0x75, 0x72, 0x4F, 0x38, 0x59, 0x51, 0x4A, 0x7A, 0x4F, 0x41, 0x55, 0x62, 0x6E, 0x38, 0x2F, 0x66, 0x74, 0x4B, 0x43, 0x68, 0x61, 0x7A, 0x63, 0x71, + 0x52, 0x5A, 0x4F, 0x68, 0x61, 0x42, 0x67, 0x79, 0x2F, 0x61, 0x63, 0x31, 0x38, 0x69, 0x7A, 0x0A, 0x6A, 0x75, 0x33, 0x47, 0x6D, 0x35, 0x68, 0x31, 0x44, 0x56, 0x58, 0x6F, 0x58, 0x2B, 0x57, 0x56, 0x69, 0x77, 0x4B, 0x6B, 0x72, 0x6B, 0x4D, 0x70, + 0x4B, 0x42, 0x47, 0x6B, 0x35, 0x68, 0x49, 0x77, 0x41, 0x55, 0x74, 0x31, 0x61, 0x78, 0x35, 0x6D, 0x6E, 0x58, 0x6B, 0x76, 0x70, 0x58, 0x59, 0x76, 0x48, 0x55, 0x43, 0x30, 0x62, 0x63, 0x6C, 0x39, 0x65, 0x51, 0x6A, 0x73, 0x30, 0x57, 0x71, 0x32, + 0x58, 0x53, 0x71, 0x79, 0x70, 0x57, 0x61, 0x39, 0x61, 0x34, 0x58, 0x30, 0x0A, 0x64, 0x46, 0x62, 0x44, 0x39, 0x65, 0x64, 0x31, 0x55, 0x69, 0x67, 0x73, 0x70, 0x66, 0x39, 0x6D, 0x52, 0x36, 0x58, 0x55, 0x2F, 0x76, 0x36, 0x65, 0x56, 0x4C, 0x39, + 0x6C, 0x66, 0x67, 0x48, 0x57, 0x4D, 0x49, 0x2B, 0x6C, 0x4E, 0x70, 0x79, 0x69, 0x55, 0x42, 0x7A, 0x75, 0x4F, 0x49, 0x41, 0x42, 0x53, 0x4D, 0x62, 0x48, 0x64, 0x50, 0x54, 0x47, 0x72, 0x4D, 0x4E, 0x41, 0x53, 0x52, 0x5A, 0x68, 0x64, 0x43, 0x79, + 0x76, 0x6A, 0x47, 0x38, 0x31, 0x37, 0x58, 0x73, 0x59, 0x0A, 0x41, 0x46, 0x73, 0x32, 0x50, 0x4A, 0x78, 0x51, 0x44, 0x63, 0x71, 0x53, 0x4D, 0x78, 0x44, 0x78, 0x4A, 0x6B, 0x6C, 0x74, 0x33, 0x33, 0x55, 0x6B, 0x4E, 0x34, 0x49, 0x69, 0x31, 0x2B, + 0x69, 0x57, 0x2F, 0x52, 0x56, 0x4C, 0x41, 0x70, 0x59, 0x2B, 0x42, 0x33, 0x4B, 0x56, 0x66, 0x71, 0x73, 0x39, 0x54, 0x43, 0x37, 0x58, 0x79, 0x76, 0x44, 0x66, 0x34, 0x46, 0x67, 0x2F, 0x4C, 0x53, 0x38, 0x45, 0x6D, 0x6A, 0x69, 0x6A, 0x41, 0x51, + 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0A, 0x6F, 0x30, 0x49, 0x77, 0x51, 0x44, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x42, 0x70, 0x4F, 0x6A, 0x43, 0x6C, 0x34, 0x6F, 0x61, + 0x54, 0x65, 0x71, 0x0A, 0x59, 0x52, 0x33, 0x72, 0x36, 0x2F, 0x77, 0x74, 0x62, 0x79, 0x50, 0x6B, 0x38, 0x36, 0x41, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x44, + 0x67, 0x67, 0x49, 0x42, 0x41, 0x4A, 0x61, 0x41, 0x63, 0x67, 0x6B, 0x47, 0x66, 0x70, 0x7A, 0x4D, 0x6B, 0x77, 0x51, 0x57, 0x75, 0x36, 0x41, 0x36, 0x6A, 0x5A, 0x4A, 0x4F, 0x74, 0x78, 0x45, 0x61, 0x43, 0x6E, 0x46, 0x78, 0x45, 0x4D, 0x30, 0x45, + 0x0A, 0x72, 0x58, 0x2B, 0x6C, 0x52, 0x56, 0x41, 0x51, 0x5A, 0x6B, 0x35, 0x4B, 0x51, 0x61, 0x49, 0x44, 0x32, 0x52, 0x46, 0x50, 0x65, 0x6A, 0x65, 0x35, 0x53, 0x2B, 0x4C, 0x47, 0x6A, 0x7A, 0x4A, 0x6D, 0x64, 0x53, 0x58, 0x37, 0x36, 0x38, 0x34, + 0x2F, 0x41, 0x79, 0x6B, 0x6D, 0x6A, 0x62, 0x67, 0x57, 0x48, 0x66, 0x59, 0x66, 0x4D, 0x32, 0x35, 0x49, 0x35, 0x75, 0x6A, 0x34, 0x56, 0x37, 0x49, 0x62, 0x65, 0x64, 0x38, 0x37, 0x68, 0x77, 0x72, 0x69, 0x5A, 0x4C, 0x6F, 0x41, 0x0A, 0x79, 0x6D, + 0x7A, 0x76, 0x66, 0x74, 0x41, 0x6A, 0x36, 0x33, 0x69, 0x50, 0x2F, 0x32, 0x53, 0x62, 0x4E, 0x44, 0x65, 0x66, 0x4E, 0x57, 0x57, 0x69, 0x70, 0x41, 0x41, 0x39, 0x45, 0x69, 0x4F, 0x57, 0x57, 0x46, 0x33, 0x4B, 0x59, 0x34, 0x66, 0x47, 0x6F, 0x77, + 0x65, 0x49, 0x54, 0x65, 0x64, 0x70, 0x64, 0x6F, 0x70, 0x54, 0x7A, 0x66, 0x46, 0x50, 0x37, 0x45, 0x4C, 0x79, 0x6B, 0x2B, 0x4F, 0x5A, 0x70, 0x44, 0x63, 0x38, 0x68, 0x37, 0x68, 0x69, 0x32, 0x2F, 0x44, 0x73, 0x0A, 0x48, 0x7A, 0x63, 0x2F, 0x4E, + 0x31, 0x39, 0x44, 0x7A, 0x46, 0x47, 0x64, 0x74, 0x66, 0x43, 0x58, 0x77, 0x72, 0x65, 0x46, 0x61, 0x6D, 0x67, 0x4C, 0x52, 0x42, 0x37, 0x6C, 0x55, 0x65, 0x36, 0x54, 0x7A, 0x6B, 0x74, 0x75, 0x68, 0x73, 0x48, 0x53, 0x44, 0x43, 0x52, 0x5A, 0x4E, + 0x68, 0x71, 0x66, 0x4C, 0x4A, 0x47, 0x50, 0x34, 0x78, 0x6A, 0x62, 0x6C, 0x4A, 0x55, 0x4B, 0x37, 0x5A, 0x47, 0x71, 0x44, 0x70, 0x6E, 0x63, 0x6C, 0x6C, 0x50, 0x6A, 0x59, 0x59, 0x50, 0x47, 0x0A, 0x46, 0x72, 0x6F, 0x6A, 0x75, 0x74, 0x7A, 0x64, + 0x66, 0x68, 0x72, 0x47, 0x65, 0x30, 0x4B, 0x32, 0x32, 0x56, 0x6F, 0x46, 0x33, 0x4A, 0x70, 0x66, 0x31, 0x64, 0x2B, 0x34, 0x32, 0x6B, 0x64, 0x39, 0x32, 0x6A, 0x6A, 0x62, 0x72, 0x44, 0x6E, 0x56, 0x48, 0x6D, 0x74, 0x73, 0x4B, 0x68, 0x65, 0x4D, + 0x59, 0x63, 0x32, 0x78, 0x62, 0x58, 0x49, 0x42, 0x77, 0x38, 0x4D, 0x67, 0x41, 0x47, 0x4A, 0x6F, 0x46, 0x6A, 0x48, 0x56, 0x64, 0x71, 0x71, 0x47, 0x75, 0x77, 0x36, 0x71, 0x0A, 0x6E, 0x73, 0x62, 0x35, 0x38, 0x4E, 0x6E, 0x34, 0x44, 0x53, 0x45, + 0x43, 0x35, 0x4D, 0x55, 0x6F, 0x46, 0x6C, 0x6B, 0x52, 0x75, 0x64, 0x6C, 0x70, 0x63, 0x79, 0x71, 0x53, 0x65, 0x4C, 0x69, 0x53, 0x56, 0x35, 0x73, 0x49, 0x38, 0x6A, 0x72, 0x6C, 0x4C, 0x35, 0x57, 0x77, 0x57, 0x4C, 0x64, 0x72, 0x49, 0x42, 0x52, + 0x74, 0x46, 0x4F, 0x38, 0x4B, 0x76, 0x48, 0x37, 0x59, 0x56, 0x64, 0x69, 0x49, 0x32, 0x69, 0x2F, 0x36, 0x47, 0x61, 0x58, 0x37, 0x69, 0x2B, 0x42, 0x2F, 0x0A, 0x4F, 0x66, 0x56, 0x79, 0x4B, 0x34, 0x58, 0x45, 0x4C, 0x4B, 0x7A, 0x76, 0x47, 0x55, + 0x57, 0x53, 0x54, 0x4C, 0x4E, 0x68, 0x42, 0x39, 0x78, 0x4E, 0x48, 0x32, 0x37, 0x53, 0x67, 0x52, 0x4E, 0x63, 0x6D, 0x76, 0x4D, 0x53, 0x5A, 0x34, 0x50, 0x50, 0x6D, 0x7A, 0x2B, 0x4C, 0x6E, 0x35, 0x32, 0x6B, 0x75, 0x61, 0x69, 0x57, 0x41, 0x33, + 0x72, 0x46, 0x37, 0x69, 0x44, 0x65, 0x4D, 0x39, 0x6F, 0x76, 0x6E, 0x68, 0x70, 0x36, 0x64, 0x42, 0x37, 0x68, 0x37, 0x73, 0x78, 0x61, 0x0A, 0x4F, 0x67, 0x54, 0x64, 0x73, 0x78, 0x6F, 0x45, 0x71, 0x42, 0x52, 0x6A, 0x72, 0x4C, 0x64, 0x48, 0x45, + 0x6F, 0x4F, 0x61, 0x62, 0x50, 0x58, 0x6D, 0x36, 0x52, 0x55, 0x56, 0x6B, 0x52, 0x71, 0x45, 0x47, 0x51, 0x36, 0x55, 0x52, 0x4F, 0x63, 0x53, 0x6A, 0x69, 0x56, 0x62, 0x67, 0x47, 0x63, 0x5A, 0x33, 0x47, 0x4F, 0x54, 0x45, 0x41, 0x74, 0x6C, 0x4C, + 0x6F, 0x72, 0x36, 0x43, 0x5A, 0x70, 0x4F, 0x32, 0x6F, 0x59, 0x6F, 0x66, 0x61, 0x70, 0x68, 0x4E, 0x64, 0x67, 0x4F, 0x0A, 0x70, 0x79, 0x67, 0x61, 0x75, 0x31, 0x4C, 0x67, 0x65, 0x50, 0x68, 0x73, 0x75, 0x6D, 0x79, 0x77, 0x62, 0x72, 0x6D, 0x48, + 0x58, 0x75, 0x6D, 0x5A, 0x4E, 0x54, 0x66, 0x78, 0x50, 0x57, 0x51, 0x72, 0x71, 0x61, 0x41, 0x30, 0x6B, 0x38, 0x39, 0x6A, 0x4C, 0x39, 0x57, 0x42, 0x33, 0x36, 0x35, 0x6A, 0x4A, 0x36, 0x55, 0x65, 0x54, 0x6F, 0x33, 0x63, 0x4B, 0x58, 0x68, 0x5A, + 0x2B, 0x50, 0x6D, 0x68, 0x49, 0x49, 0x79, 0x6E, 0x4A, 0x6B, 0x42, 0x75, 0x67, 0x6E, 0x4C, 0x4E, 0x0A, 0x65, 0x4C, 0x4C, 0x49, 0x6A, 0x7A, 0x77, 0x65, 0x63, 0x2B, 0x66, 0x42, 0x48, 0x37, 0x2F, 0x50, 0x7A, 0x71, 0x55, 0x71, 0x6D, 0x39, 0x74, + 0x45, 0x5A, 0x44, 0x4B, 0x67, 0x75, 0x33, 0x39, 0x63, 0x4A, 0x52, 0x4E, 0x49, 0x74, 0x58, 0x2B, 0x53, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, + 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x31, 0x35, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x49, + 0x7A, 0x43, 0x43, 0x41, 0x61, 0x6D, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x46, 0x68, 0x58, 0x48, 0x77, 0x39, 0x68, 0x4A, 0x70, 0x37, 0x35, 0x70, 0x44, 0x49, 0x71, 0x49, 0x37, 0x66, 0x42, 0x77, 0x2B, 0x64, 0x32, 0x33, 0x50, + 0x6F, 0x63, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, 0x4D, 0x43, 0x53, 0x6C, 0x41, 0x78, + 0x49, 0x7A, 0x41, 0x68, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x47, 0x6B, 0x4E, 0x35, 0x59, 0x6D, 0x56, 0x79, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x53, 0x6D, 0x46, 0x77, 0x59, 0x57, 0x34, 0x67, 0x51, 0x32, 0x38, 0x75, + 0x4C, 0x43, 0x42, 0x4D, 0x64, 0x47, 0x51, 0x75, 0x4D, 0x52, 0x30, 0x77, 0x47, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x52, 0x54, 0x5A, 0x57, 0x4E, 0x31, 0x0A, 0x63, 0x6D, 0x56, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, + 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x78, 0x4E, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x44, 0x41, 0x30, 0x4D, 0x44, 0x67, 0x77, 0x4F, 0x44, 0x4D, 0x79, 0x4E, 0x54, 0x5A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4E, 0x54, 0x41, + 0x30, 0x4D, 0x44, 0x67, 0x77, 0x4F, 0x44, 0x4D, 0x79, 0x4E, 0x54, 0x5A, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x0A, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x70, 0x51, 0x4D, 0x53, 0x4D, 0x77, 0x49, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x78, 0x70, 0x44, 0x65, 0x57, 0x4A, 0x6C, 0x63, 0x6E, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x49, 0x45, 0x70, 0x68, 0x63, 0x47, 0x46, 0x75, 0x49, 0x45, 0x4E, 0x76, 0x4C, 0x69, 0x77, 0x67, 0x54, 0x48, + 0x52, 0x6B, 0x4C, 0x6A, 0x45, 0x64, 0x4D, 0x42, 0x73, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x55, 0x55, 0x32, 0x56, 0x6A, 0x0A, 0x64, 0x58, 0x4A, 0x6C, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, + 0x45, 0x4E, 0x42, 0x4D, 0x54, 0x55, 0x77, 0x64, 0x6A, 0x41, 0x51, 0x42, 0x67, 0x63, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x49, 0x42, 0x42, 0x67, 0x55, 0x72, 0x67, 0x51, 0x51, 0x41, 0x49, 0x67, 0x4E, 0x69, 0x41, 0x41, 0x51, 0x4C, 0x55, + 0x48, 0x53, 0x4E, 0x5A, 0x44, 0x4B, 0x5A, 0x6D, 0x62, 0x50, 0x53, 0x59, 0x41, 0x69, 0x34, 0x49, 0x6F, 0x35, 0x47, 0x0A, 0x64, 0x43, 0x78, 0x34, 0x77, 0x43, 0x74, 0x45, 0x4C, 0x57, 0x31, 0x66, 0x48, 0x63, 0x6D, 0x75, 0x53, 0x31, 0x49, 0x67, + 0x67, 0x7A, 0x32, 0x34, 0x46, 0x47, 0x31, 0x54, 0x68, 0x32, 0x43, 0x65, 0x58, 0x32, 0x79, 0x46, 0x32, 0x77, 0x59, 0x55, 0x6C, 0x65, 0x44, 0x48, 0x4B, 0x50, 0x2B, 0x64, 0x58, 0x2B, 0x53, 0x71, 0x38, 0x62, 0x4F, 0x4C, 0x62, 0x65, 0x31, 0x50, + 0x4C, 0x30, 0x76, 0x4A, 0x53, 0x70, 0x53, 0x52, 0x5A, 0x48, 0x58, 0x2B, 0x41, 0x65, 0x7A, 0x42, 0x0A, 0x32, 0x4F, 0x74, 0x36, 0x6C, 0x48, 0x68, 0x57, 0x47, 0x45, 0x4E, 0x66, 0x61, 0x34, 0x48, 0x4C, 0x39, 0x72, 0x7A, 0x61, 0x74, 0x41, 0x79, + 0x32, 0x4B, 0x5A, 0x4D, 0x49, 0x61, 0x59, 0x2B, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x44, 0x67, 0x59, + 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x0A, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x72, 0x51, 0x63, 0x69, 0x75, 0x2F, 0x4E, + 0x57, 0x65, 0x55, 0x55, 0x6A, 0x31, 0x76, 0x59, 0x76, 0x30, 0x68, 0x79, 0x43, 0x54, 0x51, 0x53, 0x76, 0x54, 0x39, 0x44, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x77, 0x4E, 0x6F, 0x41, 0x44, + 0x42, 0x6C, 0x41, 0x6A, 0x45, 0x41, 0x32, 0x53, 0x36, 0x4A, 0x0A, 0x66, 0x6C, 0x35, 0x4F, 0x70, 0x42, 0x45, 0x48, 0x76, 0x56, 0x6E, 0x43, 0x42, 0x39, 0x36, 0x72, 0x4D, 0x6A, 0x68, 0x54, 0x4B, 0x6B, 0x5A, 0x45, 0x42, 0x68, 0x64, 0x36, 0x7A, + 0x6C, 0x48, 0x70, 0x34, 0x50, 0x39, 0x6D, 0x4C, 0x51, 0x6C, 0x4F, 0x34, 0x45, 0x2F, 0x30, 0x42, 0x64, 0x47, 0x46, 0x39, 0x6A, 0x56, 0x67, 0x33, 0x50, 0x56, 0x79, 0x73, 0x30, 0x5A, 0x39, 0x41, 0x6A, 0x42, 0x45, 0x6D, 0x45, 0x59, 0x61, 0x67, + 0x6F, 0x55, 0x65, 0x59, 0x57, 0x6D, 0x4A, 0x0A, 0x53, 0x77, 0x64, 0x4C, 0x5A, 0x72, 0x57, 0x65, 0x71, 0x72, 0x71, 0x67, 0x48, 0x6B, 0x48, 0x5A, 0x41, 0x58, 0x51, 0x36, 0x62, 0x6B, 0x55, 0x36, 0x69, 0x59, 0x41, 0x5A, 0x65, 0x7A, 0x4B, 0x59, + 0x56, 0x57, 0x4F, 0x72, 0x36, 0x32, 0x4E, 0x75, 0x6B, 0x32, 0x32, 0x72, 0x47, 0x77, 0x6C, 0x67, 0x4D, 0x55, 0x34, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x42, 0x52, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x32, 0x30, 0x32, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x71, 0x54, 0x43, 0x43, 0x41, 0x35, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x63, 0x7A, 0x73, 0x77, 0x42, 0x45, 0x68, 0x62, 0x32, 0x55, 0x31, 0x34, + 0x4C, 0x6E, 0x4E, 0x4C, 0x79, 0x61, 0x48, 0x63, 0x5A, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x30, 0x46, 0x41, 0x44, 0x42, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x45, 0x52, 0x54, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x43, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x48, 0x62, 0x57, 0x4A, + 0x49, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x6C, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x4A, 0x53, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, + 0x67, 0x0A, 0x4D, 0x69, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x7A, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x7A, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x54, 0x41, 0x34, 0x4E, 0x54, 0x59, 0x7A, 0x4D, 0x56, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x34, 0x4D, 0x44, + 0x55, 0x77, 0x4F, 0x54, 0x41, 0x34, 0x4E, 0x54, 0x59, 0x7A, 0x4D, 0x46, 0x6F, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x46, 0x54, 0x41, 0x54, 0x0A, 0x42, + 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x45, 0x51, 0x74, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x52, + 0x43, 0x31, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x56, 0x43, 0x42, 0x43, 0x55, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x7A, 0x43, 0x43, 0x0A, 0x41, 0x69, 0x49, 0x77, + 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x37, 0x2F, + 0x43, 0x56, 0x6D, 0x52, 0x67, 0x41, 0x70, 0x4B, 0x61, 0x4F, 0x59, 0x6B, 0x50, 0x37, 0x69, 0x6E, 0x35, 0x4D, 0x67, 0x36, 0x43, 0x6A, 0x6F, 0x57, 0x7A, 0x63, 0x6B, 0x6A, 0x59, 0x61, 0x43, 0x54, 0x0A, 0x63, 0x66, 0x4B, 0x72, 0x69, 0x33, 0x4F, + 0x50, 0x6F, 0x47, 0x64, 0x6C, 0x59, 0x4E, 0x4A, 0x55, 0x61, 0x32, 0x4E, 0x52, 0x62, 0x30, 0x6B, 0x7A, 0x34, 0x48, 0x49, 0x48, 0x45, 0x33, 0x30, 0x34, 0x7A, 0x51, 0x61, 0x53, 0x42, 0x79, 0x6C, 0x53, 0x61, 0x30, 0x35, 0x33, 0x62, 0x41, 0x54, + 0x54, 0x6C, 0x66, 0x72, 0x64, 0x54, 0x49, 0x7A, 0x5A, 0x58, 0x63, 0x46, 0x68, 0x66, 0x55, 0x76, 0x6E, 0x4B, 0x4C, 0x4E, 0x45, 0x67, 0x58, 0x74, 0x52, 0x72, 0x39, 0x30, 0x7A, 0x0A, 0x73, 0x57, 0x68, 0x38, 0x31, 0x6B, 0x35, 0x4D, 0x2F, 0x69, + 0x74, 0x6F, 0x75, 0x63, 0x70, 0x6D, 0x61, 0x63, 0x54, 0x73, 0x58, 0x6C, 0x64, 0x2F, 0x39, 0x77, 0x33, 0x48, 0x6E, 0x44, 0x59, 0x32, 0x35, 0x51, 0x64, 0x67, 0x72, 0x4D, 0x42, 0x4D, 0x36, 0x67, 0x68, 0x73, 0x37, 0x77, 0x5A, 0x38, 0x54, 0x31, + 0x73, 0x6F, 0x65, 0x67, 0x6A, 0x38, 0x6B, 0x31, 0x32, 0x62, 0x39, 0x70, 0x79, 0x30, 0x69, 0x34, 0x61, 0x36, 0x49, 0x62, 0x6E, 0x30, 0x38, 0x4F, 0x68, 0x5A, 0x0A, 0x57, 0x69, 0x69, 0x68, 0x4E, 0x49, 0x51, 0x61, 0x4A, 0x5A, 0x47, 0x32, 0x74, + 0x59, 0x2F, 0x76, 0x73, 0x76, 0x6D, 0x41, 0x2B, 0x76, 0x6B, 0x39, 0x50, 0x42, 0x46, 0x79, 0x32, 0x4F, 0x4D, 0x76, 0x68, 0x6E, 0x62, 0x46, 0x65, 0x53, 0x7A, 0x42, 0x71, 0x5A, 0x43, 0x54, 0x52, 0x70, 0x68, 0x6E, 0x79, 0x34, 0x4E, 0x71, 0x6F, + 0x46, 0x41, 0x6A, 0x70, 0x7A, 0x76, 0x32, 0x67, 0x54, 0x6E, 0x67, 0x37, 0x66, 0x43, 0x35, 0x76, 0x32, 0x58, 0x78, 0x32, 0x4D, 0x74, 0x36, 0x0A, 0x2B, 0x2B, 0x39, 0x7A, 0x41, 0x38, 0x34, 0x41, 0x39, 0x48, 0x33, 0x58, 0x34, 0x46, 0x30, 0x37, + 0x5A, 0x72, 0x6A, 0x63, 0x6A, 0x72, 0x71, 0x44, 0x79, 0x34, 0x64, 0x32, 0x41, 0x2F, 0x77, 0x6C, 0x32, 0x65, 0x63, 0x6A, 0x62, 0x77, 0x62, 0x39, 0x5A, 0x2F, 0x50, 0x67, 0x2F, 0x34, 0x53, 0x38, 0x52, 0x37, 0x2B, 0x31, 0x46, 0x68, 0x68, 0x47, + 0x61, 0x52, 0x54, 0x4D, 0x42, 0x66, 0x66, 0x62, 0x30, 0x30, 0x6D, 0x73, 0x61, 0x38, 0x79, 0x72, 0x35, 0x4C, 0x55, 0x4C, 0x0A, 0x51, 0x79, 0x52, 0x65, 0x53, 0x32, 0x74, 0x4E, 0x5A, 0x39, 0x2F, 0x57, 0x74, 0x54, 0x35, 0x50, 0x65, 0x42, 0x2B, + 0x55, 0x63, 0x53, 0x54, 0x71, 0x33, 0x6E, 0x44, 0x38, 0x38, 0x5A, 0x50, 0x2B, 0x6E, 0x70, 0x4E, 0x61, 0x35, 0x4A, 0x52, 0x61, 0x6C, 0x31, 0x51, 0x4D, 0x4E, 0x58, 0x74, 0x66, 0x62, 0x4F, 0x34, 0x41, 0x48, 0x79, 0x54, 0x73, 0x41, 0x37, 0x6F, + 0x43, 0x39, 0x58, 0x62, 0x30, 0x6E, 0x39, 0x53, 0x61, 0x37, 0x59, 0x55, 0x73, 0x4F, 0x43, 0x49, 0x76, 0x0A, 0x78, 0x39, 0x67, 0x76, 0x64, 0x68, 0x46, 0x50, 0x2F, 0x57, 0x78, 0x63, 0x36, 0x50, 0x57, 0x4F, 0x4A, 0x34, 0x64, 0x2F, 0x47, 0x55, + 0x6F, 0x68, 0x52, 0x35, 0x41, 0x64, 0x65, 0x59, 0x30, 0x63, 0x57, 0x2F, 0x6A, 0x50, 0x53, 0x6F, 0x58, 0x6B, 0x37, 0x62, 0x4E, 0x62, 0x6A, 0x62, 0x37, 0x45, 0x5A, 0x43, 0x68, 0x64, 0x51, 0x63, 0x52, 0x75, 0x72, 0x44, 0x68, 0x61, 0x54, 0x79, + 0x4E, 0x30, 0x64, 0x4B, 0x6B, 0x53, 0x77, 0x2F, 0x62, 0x53, 0x75, 0x52, 0x45, 0x56, 0x0A, 0x4D, 0x77, 0x65, 0x52, 0x32, 0x44, 0x73, 0x33, 0x4F, 0x6D, 0x4D, 0x77, 0x42, 0x74, 0x48, 0x46, 0x49, 0x6A, 0x59, 0x6F, 0x59, 0x69, 0x4D, 0x51, 0x34, + 0x45, 0x62, 0x4D, 0x6C, 0x36, 0x7A, 0x57, 0x4B, 0x31, 0x31, 0x6B, 0x4A, 0x4E, 0x58, 0x75, 0x48, 0x41, 0x37, 0x65, 0x2B, 0x77, 0x68, 0x61, 0x64, 0x53, 0x72, 0x32, 0x59, 0x32, 0x33, 0x4F, 0x43, 0x30, 0x4B, 0x2B, 0x30, 0x62, 0x70, 0x77, 0x48, + 0x4A, 0x77, 0x68, 0x35, 0x51, 0x38, 0x78, 0x61, 0x52, 0x66, 0x58, 0x0A, 0x2F, 0x41, 0x71, 0x30, 0x33, 0x75, 0x32, 0x41, 0x6E, 0x4D, 0x75, 0x53, 0x74, 0x49, 0x76, 0x31, 0x33, 0x6C, 0x6D, 0x69, 0x57, 0x41, 0x6D, 0x6C, 0x59, 0x30, 0x63, 0x4C, + 0x34, 0x55, 0x45, 0x79, 0x4E, 0x45, 0x48, 0x5A, 0x6D, 0x72, 0x48, 0x5A, 0x71, 0x4C, 0x41, 0x62, 0x57, 0x74, 0x34, 0x4E, 0x44, 0x66, 0x54, 0x69, 0x73, 0x6C, 0x30, 0x31, 0x67, 0x4C, 0x6D, 0x42, 0x31, 0x49, 0x52, 0x70, 0x6B, 0x51, 0x4C, 0x4C, + 0x64, 0x64, 0x43, 0x4E, 0x78, 0x62, 0x55, 0x39, 0x0A, 0x43, 0x5A, 0x45, 0x4A, 0x6A, 0x78, 0x53, 0x68, 0x46, 0x48, 0x52, 0x35, 0x50, 0x74, 0x62, 0x4A, 0x46, 0x52, 0x32, 0x6B, 0x57, 0x56, 0x6B, 0x69, 0x33, 0x50, 0x61, 0x4B, 0x52, 0x54, 0x30, + 0x38, 0x45, 0x74, 0x59, 0x2B, 0x58, 0x54, 0x49, 0x76, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x67, 0x59, 0x34, 0x77, 0x67, 0x59, 0x73, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, + 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x5A, 0x35, 0x44, 0x77, 0x31, 0x74, 0x36, 0x31, 0x47, 0x4E, 0x56, 0x47, 0x4B, 0x58, 0x35, 0x63, 0x71, 0x2F, + 0x69, 0x65, 0x43, 0x4C, 0x78, 0x6B, 0x6C, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x45, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x64, 0x48, 0x77, + 0x52, 0x43, 0x0A, 0x4D, 0x45, 0x41, 0x77, 0x50, 0x71, 0x41, 0x38, 0x6F, 0x44, 0x71, 0x47, 0x4F, 0x47, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x6A, 0x63, 0x6D, 0x77, 0x75, 0x5A, 0x43, 0x31, 0x30, 0x63, 0x6E, 0x56, 0x7A, 0x64, + 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x32, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x66, 0x59, 0x6E, 0x4A, 0x66, 0x63, 0x6D, 0x39, 0x76, 0x64, 0x46, 0x39, 0x6A, 0x59, 0x56, 0x38, 0x79, 0x0A, + 0x58, 0x7A, 0x49, 0x77, 0x4D, 0x6A, 0x4D, 0x75, 0x59, 0x33, 0x4A, 0x73, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x44, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, 0x41, 0x30, + 0x39, 0x37, 0x4E, 0x33, 0x55, 0x39, 0x73, 0x77, 0x46, 0x72, 0x6B, 0x74, 0x70, 0x53, 0x48, 0x78, 0x51, 0x43, 0x46, 0x31, 0x36, 0x2B, 0x74, 0x49, 0x46, 0x6F, 0x45, 0x39, 0x63, 0x2B, 0x43, 0x65, 0x4A, 0x79, 0x72, 0x72, 0x0A, 0x64, 0x36, 0x6B, + 0x54, 0x70, 0x47, 0x6F, 0x4B, 0x57, 0x6C, 0x6F, 0x55, 0x4D, 0x7A, 0x31, 0x6F, 0x48, 0x34, 0x47, 0x75, 0x61, 0x66, 0x32, 0x4D, 0x6E, 0x32, 0x56, 0x73, 0x4E, 0x45, 0x4C, 0x5A, 0x4C, 0x64, 0x42, 0x2F, 0x65, 0x42, 0x61, 0x78, 0x4F, 0x71, 0x77, + 0x6A, 0x4D, 0x61, 0x31, 0x65, 0x66, 0x36, 0x37, 0x6E, 0x72, 0x69, 0x76, 0x36, 0x75, 0x76, 0x77, 0x38, 0x6C, 0x35, 0x56, 0x41, 0x6B, 0x31, 0x2F, 0x44, 0x4C, 0x51, 0x4F, 0x6A, 0x37, 0x61, 0x52, 0x76, 0x0A, 0x55, 0x39, 0x66, 0x36, 0x51, 0x41, + 0x34, 0x77, 0x39, 0x51, 0x41, 0x67, 0x4C, 0x41, 0x42, 0x4D, 0x6A, 0x44, 0x75, 0x30, 0x6F, 0x78, 0x2B, 0x32, 0x76, 0x35, 0x45, 0x79, 0x71, 0x36, 0x2B, 0x53, 0x6D, 0x4E, 0x4D, 0x57, 0x35, 0x74, 0x54, 0x52, 0x56, 0x46, 0x78, 0x44, 0x57, 0x79, + 0x36, 0x75, 0x37, 0x31, 0x63, 0x71, 0x71, 0x4C, 0x52, 0x76, 0x70, 0x4F, 0x38, 0x4E, 0x56, 0x68, 0x54, 0x61, 0x49, 0x61, 0x73, 0x67, 0x64, 0x70, 0x34, 0x44, 0x2F, 0x43, 0x61, 0x34, 0x0A, 0x6E, 0x6A, 0x38, 0x2B, 0x41, 0x79, 0x62, 0x6D, 0x54, + 0x4E, 0x75, 0x64, 0x58, 0x30, 0x4B, 0x45, 0x50, 0x55, 0x55, 0x44, 0x41, 0x78, 0x78, 0x5A, 0x69, 0x4D, 0x72, 0x63, 0x4C, 0x6D, 0x45, 0x6B, 0x57, 0x71, 0x54, 0x71, 0x4A, 0x77, 0x74, 0x7A, 0x45, 0x72, 0x35, 0x53, 0x73, 0x77, 0x72, 0x50, 0x4D, + 0x68, 0x66, 0x69, 0x48, 0x6F, 0x63, 0x61, 0x46, 0x70, 0x56, 0x49, 0x62, 0x56, 0x72, 0x67, 0x30, 0x4D, 0x38, 0x4A, 0x6B, 0x69, 0x5A, 0x6D, 0x6B, 0x64, 0x69, 0x6A, 0x0A, 0x59, 0x51, 0x36, 0x71, 0x67, 0x59, 0x46, 0x2F, 0x36, 0x46, 0x4B, 0x43, + 0x30, 0x55, 0x4C, 0x6E, 0x34, 0x42, 0x30, 0x59, 0x2B, 0x71, 0x53, 0x46, 0x4E, 0x75, 0x65, 0x47, 0x34, 0x41, 0x33, 0x72, 0x76, 0x4E, 0x54, 0x4A, 0x31, 0x6A, 0x78, 0x44, 0x38, 0x56, 0x31, 0x4A, 0x62, 0x6E, 0x36, 0x42, 0x6D, 0x32, 0x6D, 0x31, + 0x69, 0x57, 0x4B, 0x50, 0x69, 0x46, 0x4C, 0x59, 0x31, 0x2F, 0x34, 0x6E, 0x77, 0x53, 0x50, 0x46, 0x79, 0x79, 0x73, 0x43, 0x75, 0x37, 0x46, 0x66, 0x0A, 0x2F, 0x76, 0x74, 0x44, 0x68, 0x51, 0x4E, 0x47, 0x76, 0x6C, 0x33, 0x47, 0x79, 0x69, 0x45, + 0x6D, 0x2F, 0x39, 0x63, 0x43, 0x6E, 0x6E, 0x52, 0x4B, 0x33, 0x50, 0x67, 0x54, 0x46, 0x62, 0x47, 0x42, 0x56, 0x7A, 0x62, 0x4C, 0x5A, 0x56, 0x7A, 0x52, 0x48, 0x54, 0x46, 0x33, 0x36, 0x53, 0x58, 0x44, 0x77, 0x37, 0x49, 0x79, 0x4E, 0x39, 0x58, + 0x78, 0x6D, 0x41, 0x6E, 0x6B, 0x62, 0x57, 0x4F, 0x41, 0x43, 0x4B, 0x73, 0x47, 0x6B, 0x6F, 0x48, 0x55, 0x36, 0x58, 0x43, 0x50, 0x0A, 0x70, 0x7A, 0x2B, 0x79, 0x37, 0x59, 0x61, 0x4D, 0x67, 0x6D, 0x6F, 0x31, 0x79, 0x45, 0x4A, 0x61, 0x67, 0x74, + 0x46, 0x53, 0x47, 0x6B, 0x55, 0x50, 0x46, 0x61, 0x55, 0x41, 0x38, 0x4A, 0x52, 0x37, 0x5A, 0x53, 0x64, 0x58, 0x4F, 0x55, 0x50, 0x50, 0x66, 0x48, 0x2F, 0x6D, 0x76, 0x54, 0x57, 0x7A, 0x65, 0x2F, 0x45, 0x5A, 0x54, 0x4E, 0x34, 0x36, 0x6C, 0x73, + 0x2F, 0x70, 0x64, 0x75, 0x34, 0x44, 0x35, 0x38, 0x4A, 0x44, 0x55, 0x6A, 0x78, 0x71, 0x67, 0x65, 0x6A, 0x42, 0x0A, 0x57, 0x6F, 0x43, 0x39, 0x45, 0x56, 0x32, 0x54, 0x61, 0x2F, 0x76, 0x48, 0x35, 0x6D, 0x51, 0x2F, 0x75, 0x32, 0x6B, 0x63, 0x36, + 0x64, 0x30, 0x6C, 0x69, 0x36, 0x39, 0x30, 0x79, 0x56, 0x52, 0x41, 0x79, 0x73, 0x75, 0x54, 0x45, 0x77, 0x72, 0x74, 0x2B, 0x32, 0x61, 0x53, 0x45, 0x63, 0x72, 0x31, 0x77, 0x50, 0x72, 0x59, 0x67, 0x31, 0x55, 0x44, 0x66, 0x4E, 0x50, 0x46, 0x49, + 0x6B, 0x5A, 0x31, 0x63, 0x47, 0x74, 0x35, 0x53, 0x41, 0x59, 0x71, 0x67, 0x70, 0x71, 0x2F, 0x0A, 0x35, 0x75, 0x73, 0x57, 0x44, 0x69, 0x4A, 0x46, 0x41, 0x62, 0x7A, 0x64, 0x4E, 0x70, 0x51, 0x30, 0x71, 0x54, 0x55, 0x6D, 0x69, 0x74, 0x65, 0x58, + 0x75, 0x65, 0x34, 0x49, 0x63, 0x72, 0x38, 0x30, 0x6B, 0x6E, 0x43, 0x44, 0x67, 0x4B, 0x73, 0x34, 0x71, 0x6C, 0x6C, 0x6F, 0x33, 0x55, 0x43, 0x6B, 0x47, 0x4A, 0x43, 0x79, 0x38, 0x39, 0x55, 0x44, 0x79, 0x69, 0x62, 0x4B, 0x37, 0x39, 0x58, 0x48, + 0x34, 0x49, 0x39, 0x54, 0x6A, 0x76, 0x41, 0x41, 0x34, 0x36, 0x6A, 0x74, 0x0A, 0x6E, 0x2F, 0x6D, 0x74, 0x64, 0x2B, 0x41, 0x72, 0x59, 0x30, 0x2B, 0x65, 0x77, 0x2B, 0x34, 0x33, 0x75, 0x33, 0x67, 0x4A, 0x68, 0x4A, 0x36, 0x35, 0x62, 0x76, 0x73, + 0x70, 0x6D, 0x5A, 0x44, 0x6F, 0x67, 0x4E, 0x4F, 0x66, 0x4A, 0x41, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, + 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, 0x73, 0x69, 0x61, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4D, 0x54, 0x43, 0x43, 0x41, 0x62, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x4E, 0x6E, 0x54, 0x68, 0x54, 0x58, 0x78, 0x6C, 0x45, 0x38, 0x6D, 0x73, 0x67, 0x31, 0x55, 0x6C, 0x6F, 0x44, 0x35, + 0x53, 0x66, 0x69, 0x39, 0x51, 0x61, 0x4D, 0x63, 0x77, 0x43, 0x67, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, 0x7A, 0x6A, 0x30, 0x45, 0x41, 0x77, 0x4D, 0x77, 0x57, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x0A, 0x42, 0x68, + 0x4D, 0x43, 0x51, 0x30, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, + 0x39, 0x73, 0x62, 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x49, 0x6A, 0x41, 0x67, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x47, 0x56, 0x52, 0x79, 0x0A, 0x64, 0x58, 0x4E, 0x30, 0x51, + 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x51, 0x77, 0x4E, 0x54, 0x45, 0x31, 0x4D, + 0x44, 0x55, 0x30, 0x4D, 0x54, 0x55, 0x32, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x51, 0x77, 0x4E, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x55, 0x30, 0x4D, 0x54, 0x55, 0x31, 0x57, 0x6A, 0x42, 0x59, 0x0A, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x63, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x42, 0x63, 0x32, 0x6C, 0x68, 0x49, 0x46, 0x52, 0x6C, + 0x59, 0x32, 0x68, 0x75, 0x62, 0x32, 0x78, 0x76, 0x5A, 0x32, 0x6C, 0x6C, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x56, 0x48, 0x4A, + 0x31, 0x63, 0x33, 0x52, 0x42, 0x63, 0x32, 0x6C, 0x68, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x46, 0x51, 0x30, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, + 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, 0x42, 0x4C, 0x68, 0x2F, 0x0A, 0x70, 0x56, 0x73, 0x2F, 0x41, 0x54, 0x35, 0x39, 0x38, 0x49, 0x68, 0x74, 0x72, 0x69, + 0x6D, 0x59, 0x34, 0x5A, 0x74, 0x63, 0x55, 0x35, 0x6E, 0x62, 0x39, 0x77, 0x6A, 0x2F, 0x31, 0x57, 0x72, 0x67, 0x6A, 0x73, 0x74, 0x45, 0x70, 0x76, 0x44, 0x42, 0x6A, 0x4C, 0x31, 0x50, 0x31, 0x4D, 0x37, 0x55, 0x69, 0x46, 0x50, 0x6F, 0x58, 0x6C, + 0x66, 0x58, 0x54, 0x72, 0x34, 0x73, 0x50, 0x2F, 0x4D, 0x53, 0x70, 0x77, 0x44, 0x70, 0x67, 0x75, 0x4D, 0x71, 0x57, 0x7A, 0x4A, 0x38, 0x0A, 0x53, 0x35, 0x73, 0x55, 0x4B, 0x5A, 0x37, 0x34, 0x4C, 0x59, 0x4F, 0x31, 0x36, 0x34, 0x34, 0x78, 0x53, + 0x54, 0x30, 0x6D, 0x59, 0x65, 0x6B, 0x64, 0x63, 0x6F, 0x75, 0x4A, 0x74, 0x67, 0x71, 0x37, 0x6E, 0x44, 0x4D, 0x31, 0x44, 0x39, 0x72, 0x73, 0x33, 0x71, 0x6C, 0x4B, 0x48, 0x38, 0x6B, 0x7A, 0x73, 0x61, 0x4E, 0x43, 0x4D, 0x45, 0x41, 0x77, 0x44, + 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x4C, 0x49, 0x56, 0x54, + 0x75, 0x37, 0x46, 0x44, 0x7A, 0x54, 0x4C, 0x71, 0x6E, 0x71, 0x4F, 0x48, 0x2F, 0x71, 0x4B, 0x59, 0x71, 0x4B, 0x61, 0x54, 0x36, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, + 0x41, 0x67, 0x45, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x0A, 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x67, 0x41, 0x4D, 0x47, 0x55, 0x43, 0x4D, 0x46, 0x52, 0x48, 0x31, 0x38, 0x4D, 0x74, 0x59, 0x59, 0x5A, + 0x49, 0x39, 0x48, 0x6C, 0x61, 0x56, 0x51, 0x30, 0x31, 0x4C, 0x31, 0x38, 0x4E, 0x39, 0x6D, 0x64, 0x73, 0x64, 0x30, 0x41, 0x61, 0x52, 0x75, 0x66, 0x34, 0x61, 0x46, 0x74, 0x4F, 0x4A, 0x78, 0x32, 0x34, 0x6D, 0x48, 0x31, 0x2F, 0x6B, 0x37, 0x38, + 0x49, 0x54, 0x63, 0x54, 0x61, 0x52, 0x54, 0x43, 0x68, 0x44, 0x31, 0x35, 0x4B, 0x0A, 0x65, 0x41, 0x49, 0x78, 0x41, 0x4B, 0x4F, 0x52, 0x68, 0x2F, 0x49, 0x52, 0x4D, 0x34, 0x50, 0x44, 0x77, 0x59, 0x71, 0x52, 0x4F, 0x6B, 0x77, 0x72, 0x55, 0x4C, + 0x47, 0x39, 0x49, 0x70, 0x52, 0x64, 0x4E, 0x59, 0x6C, 0x7A, 0x67, 0x38, 0x57, 0x62, 0x47, 0x66, 0x36, 0x30, 0x6F, 0x65, 0x6E, 0x55, 0x6F, 0x57, 0x61, 0x32, 0x41, 0x61, 0x55, 0x32, 0x2B, 0x64, 0x68, 0x6F, 0x59, 0x53, 0x69, 0x33, 0x64, 0x4F, + 0x47, 0x69, 0x4D, 0x51, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x54, 0x72, 0x75, 0x73, 0x74, 0x41, + 0x73, 0x69, 0x61, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x52, 0x53, 0x41, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x67, 0x44, + 0x43, 0x43, 0x41, 0x32, 0x69, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, 0x48, 0x42, 0x6A, 0x59, 0x7A, 0x2B, 0x56, 0x54, 0x50, 0x79, 0x49, 0x31, 0x52, 0x6C, 0x4E, 0x55, 0x4A, 0x44, 0x78, 0x73, 0x52, 0x39, 0x46, 0x63, 0x53, 0x70, + 0x77, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4D, 0x42, 0x51, 0x41, 0x77, 0x57, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, + 0x30, 0x34, 0x78, 0x4A, 0x54, 0x41, 0x6A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x48, 0x46, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, 0x59, 0x53, 0x42, 0x55, 0x5A, 0x57, 0x4E, 0x6F, 0x62, 0x6D, 0x39, 0x73, 0x62, + 0x32, 0x64, 0x70, 0x5A, 0x58, 0x4D, 0x73, 0x49, 0x45, 0x6C, 0x75, 0x59, 0x79, 0x34, 0x78, 0x49, 0x6A, 0x41, 0x67, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x0A, 0x47, 0x56, 0x52, 0x79, 0x64, 0x58, 0x4E, 0x30, 0x51, 0x58, 0x4E, 0x70, + 0x59, 0x53, 0x42, 0x55, 0x54, 0x46, 0x4D, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4E, 0x4D, 0x6A, 0x51, 0x77, 0x4E, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x55, 0x30, + 0x4D, 0x54, 0x55, 0x33, 0x57, 0x68, 0x63, 0x4E, 0x4E, 0x44, 0x51, 0x77, 0x4E, 0x54, 0x45, 0x31, 0x4D, 0x44, 0x55, 0x30, 0x4D, 0x54, 0x55, 0x32, 0x0A, 0x57, 0x6A, 0x42, 0x59, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x47, 0x45, 0x77, 0x4A, 0x44, 0x54, 0x6A, 0x45, 0x6C, 0x4D, 0x43, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x63, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x42, 0x63, 0x32, 0x6C, 0x68, 0x49, 0x46, 0x52, 0x6C, 0x59, 0x32, 0x68, + 0x75, 0x62, 0x32, 0x78, 0x76, 0x5A, 0x32, 0x6C, 0x6C, 0x63, 0x79, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6A, 0x4C, 0x6A, 0x45, 0x69, 0x0A, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x5A, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, + 0x52, 0x42, 0x63, 0x32, 0x6C, 0x68, 0x49, 0x46, 0x52, 0x4D, 0x55, 0x79, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, + 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x0A, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4D, 0x4D, 0x57, 0x75, 0x42, 0x74, 0x71, 0x70, + 0x45, 0x52, 0x7A, 0x35, 0x64, 0x5A, 0x4F, 0x39, 0x4C, 0x6E, 0x50, 0x57, 0x77, 0x76, 0x42, 0x30, 0x5A, 0x71, 0x42, 0x39, 0x57, 0x4F, 0x77, 0x6A, 0x30, 0x50, 0x42, 0x75, 0x77, 0x68, 0x61, 0x47, 0x6E, 0x72, 0x68, 0x42, 0x33, 0x59, 0x6D, 0x48, + 0x34, 0x39, 0x70, 0x56, 0x72, 0x37, 0x2B, 0x4E, 0x6D, 0x44, 0x51, 0x44, 0x49, 0x50, 0x4E, 0x0A, 0x6C, 0x4F, 0x72, 0x6E, 0x78, 0x53, 0x31, 0x63, 0x4C, 0x77, 0x55, 0x57, 0x41, 0x70, 0x34, 0x4B, 0x71, 0x43, 0x2F, 0x6C, 0x59, 0x43, 0x5A, 0x55, + 0x6C, 0x76, 0x69, 0x59, 0x51, 0x42, 0x32, 0x73, 0x72, 0x70, 0x31, 0x30, 0x5A, 0x79, 0x39, 0x55, 0x2B, 0x35, 0x52, 0x6A, 0x6D, 0x4F, 0x4D, 0x6D, 0x53, 0x6F, 0x50, 0x47, 0x6C, 0x62, 0x59, 0x4A, 0x51, 0x31, 0x44, 0x4E, 0x44, 0x58, 0x33, 0x65, + 0x52, 0x41, 0x35, 0x67, 0x45, 0x6B, 0x39, 0x62, 0x4E, 0x62, 0x32, 0x2F, 0x0A, 0x6D, 0x54, 0x68, 0x74, 0x66, 0x57, 0x7A, 0x61, 0x34, 0x6D, 0x68, 0x7A, 0x48, 0x2F, 0x6B, 0x78, 0x70, 0x52, 0x6B, 0x51, 0x63, 0x77, 0x55, 0x71, 0x77, 0x7A, 0x49, + 0x5A, 0x68, 0x65, 0x6F, 0x30, 0x71, 0x74, 0x31, 0x43, 0x48, 0x6A, 0x43, 0x4E, 0x50, 0x35, 0x36, 0x31, 0x48, 0x6D, 0x48, 0x56, 0x62, 0x37, 0x30, 0x41, 0x63, 0x6E, 0x4B, 0x74, 0x45, 0x6A, 0x2B, 0x71, 0x70, 0x6B, 0x6C, 0x7A, 0x38, 0x6F, 0x59, + 0x56, 0x6C, 0x51, 0x77, 0x51, 0x58, 0x31, 0x46, 0x6B, 0x0A, 0x7A, 0x76, 0x39, 0x33, 0x75, 0x4D, 0x6C, 0x74, 0x72, 0x4F, 0x58, 0x56, 0x6D, 0x50, 0x47, 0x5A, 0x4C, 0x6D, 0x7A, 0x6A, 0x79, 0x55, 0x54, 0x35, 0x74, 0x55, 0x4D, 0x6E, 0x43, 0x45, + 0x33, 0x32, 0x66, 0x74, 0x35, 0x45, 0x65, 0x62, 0x75, 0x79, 0x6A, 0x42, 0x7A, 0x61, 0x30, 0x30, 0x74, 0x73, 0x4C, 0x74, 0x62, 0x44, 0x65, 0x4C, 0x64, 0x4D, 0x31, 0x61, 0x54, 0x6B, 0x32, 0x74, 0x79, 0x4B, 0x6A, 0x67, 0x37, 0x2F, 0x44, 0x38, + 0x4F, 0x6D, 0x59, 0x43, 0x59, 0x6F, 0x0A, 0x7A, 0x7A, 0x61, 0x2F, 0x2B, 0x6C, 0x63, 0x4B, 0x37, 0x46, 0x73, 0x2F, 0x36, 0x54, 0x41, 0x57, 0x65, 0x38, 0x54, 0x62, 0x78, 0x4E, 0x52, 0x6B, 0x6F, 0x44, 0x44, 0x37, 0x35, 0x66, 0x30, 0x64, 0x63, + 0x5A, 0x4C, 0x64, 0x4B, 0x59, 0x39, 0x42, 0x57, 0x4E, 0x34, 0x41, 0x72, 0x54, 0x72, 0x39, 0x50, 0x58, 0x77, 0x61, 0x71, 0x4C, 0x45, 0x58, 0x38, 0x45, 0x34, 0x30, 0x65, 0x46, 0x67, 0x6C, 0x31, 0x6F, 0x55, 0x68, 0x36, 0x33, 0x6B, 0x64, 0x30, + 0x4E, 0x79, 0x72, 0x0A, 0x7A, 0x32, 0x49, 0x38, 0x73, 0x4D, 0x65, 0x58, 0x69, 0x39, 0x62, 0x51, 0x6E, 0x39, 0x50, 0x2B, 0x50, 0x4E, 0x37, 0x46, 0x34, 0x2F, 0x77, 0x36, 0x67, 0x33, 0x43, 0x45, 0x49, 0x52, 0x30, 0x4A, 0x77, 0x71, 0x48, 0x38, + 0x75, 0x79, 0x67, 0x68, 0x5A, 0x56, 0x4E, 0x67, 0x65, 0x70, 0x42, 0x74, 0x6C, 0x6A, 0x68, 0x62, 0x2F, 0x2F, 0x48, 0x58, 0x65, 0x6C, 0x74, 0x74, 0x30, 0x38, 0x6C, 0x77, 0x53, 0x55, 0x71, 0x36, 0x48, 0x54, 0x72, 0x51, 0x55, 0x4E, 0x6F, 0x79, + 0x0A, 0x49, 0x42, 0x6E, 0x6B, 0x69, 0x7A, 0x2F, 0x72, 0x31, 0x52, 0x59, 0x6D, 0x4E, 0x7A, 0x7A, 0x37, 0x64, 0x5A, 0x36, 0x77, 0x42, 0x33, 0x43, 0x34, 0x46, 0x47, 0x42, 0x33, 0x33, 0x50, 0x59, 0x50, 0x58, 0x46, 0x49, 0x4B, 0x76, 0x46, 0x31, + 0x74, 0x6A, 0x56, 0x45, 0x4B, 0x32, 0x73, 0x55, 0x59, 0x79, 0x4A, 0x74, 0x74, 0x33, 0x4C, 0x43, 0x44, 0x73, 0x33, 0x2B, 0x6A, 0x54, 0x6E, 0x68, 0x4D, 0x6D, 0x43, 0x57, 0x72, 0x38, 0x6E, 0x34, 0x75, 0x49, 0x46, 0x36, 0x43, 0x0A, 0x46, 0x61, + 0x62, 0x57, 0x32, 0x49, 0x2B, 0x73, 0x35, 0x63, 0x30, 0x79, 0x68, 0x73, 0x6A, 0x35, 0x35, 0x4E, 0x71, 0x4A, 0x34, 0x6A, 0x73, 0x2B, 0x6B, 0x38, 0x55, 0x54, 0x61, 0x76, 0x2F, 0x48, 0x39, 0x78, 0x6A, 0x38, 0x5A, 0x37, 0x58, 0x76, 0x47, 0x43, + 0x78, 0x55, 0x71, 0x30, 0x44, 0x54, 0x62, 0x45, 0x33, 0x74, 0x78, 0x63, 0x69, 0x33, 0x4F, 0x45, 0x39, 0x6B, 0x78, 0x4A, 0x52, 0x4D, 0x54, 0x36, 0x44, 0x4E, 0x72, 0x71, 0x58, 0x47, 0x4A, 0x79, 0x56, 0x31, 0x0A, 0x4A, 0x32, 0x33, 0x47, 0x32, + 0x70, 0x79, 0x4F, 0x73, 0x41, 0x57, 0x5A, 0x31, 0x53, 0x67, 0x52, 0x78, 0x53, 0x48, 0x55, 0x75, 0x50, 0x7A, 0x48, 0x6C, 0x71, 0x74, 0x4B, 0x5A, 0x46, 0x6C, 0x68, 0x61, 0x78, 0x50, 0x38, 0x53, 0x38, 0x79, 0x53, 0x70, 0x67, 0x2B, 0x6B, 0x55, + 0x62, 0x38, 0x4F, 0x57, 0x4A, 0x44, 0x5A, 0x67, 0x6F, 0x4D, 0x35, 0x70, 0x6C, 0x2B, 0x7A, 0x2B, 0x6D, 0x36, 0x53, 0x73, 0x38, 0x30, 0x7A, 0x44, 0x6F, 0x57, 0x6F, 0x38, 0x53, 0x6E, 0x54, 0x0A, 0x71, 0x31, 0x6D, 0x74, 0x31, 0x74, 0x76, 0x65, + 0x31, 0x43, 0x75, 0x42, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x51, 0x6A, 0x42, 0x41, 0x4D, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, + 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, 0x4C, 0x67, 0x48, 0x6B, 0x58, 0x6C, 0x63, 0x42, 0x76, 0x52, 0x47, 0x2F, 0x58, 0x74, 0x5A, 0x0A, 0x79, 0x6C, 0x6F, 0x6D, 0x6B, 0x61, 0x64, 0x46, 0x4B, 0x2F, 0x68, + 0x54, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, + 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x49, 0x5A, 0x74, 0x71, 0x42, 0x53, 0x42, 0x64, 0x47, 0x42, 0x61, 0x6E, 0x45, 0x71, 0x54, 0x33, 0x0A, 0x52, 0x7A, 0x2F, 0x4E, 0x79, 0x6A, 0x75, 0x75, 0x6A, 0x73, 0x43, 0x43, 0x7A, 0x74, + 0x78, 0x49, 0x4A, 0x58, 0x67, 0x58, 0x62, 0x4F, 0x44, 0x67, 0x63, 0x4D, 0x54, 0x57, 0x6C, 0x74, 0x6E, 0x5A, 0x39, 0x72, 0x39, 0x36, 0x6E, 0x42, 0x4F, 0x37, 0x55, 0x35, 0x57, 0x53, 0x2F, 0x38, 0x2B, 0x53, 0x34, 0x50, 0x50, 0x46, 0x4A, 0x7A, + 0x56, 0x58, 0x71, 0x44, 0x75, 0x69, 0x47, 0x65, 0x76, 0x34, 0x69, 0x71, 0x4D, 0x45, 0x33, 0x6D, 0x6D, 0x4C, 0x35, 0x44, 0x77, 0x38, 0x0A, 0x76, 0x65, 0x57, 0x76, 0x30, 0x42, 0x49, 0x62, 0x35, 0x59, 0x6C, 0x72, 0x63, 0x35, 0x74, 0x76, 0x4A, + 0x51, 0x4A, 0x4C, 0x6B, 0x49, 0x4B, 0x76, 0x51, 0x4D, 0x4B, 0x74, 0x75, 0x70, 0x70, 0x67, 0x4A, 0x46, 0x71, 0x42, 0x54, 0x51, 0x55, 0x59, 0x6F, 0x2B, 0x49, 0x7A, 0x65, 0x58, 0x6F, 0x4C, 0x48, 0x35, 0x50, 0x74, 0x37, 0x44, 0x6C, 0x4B, 0x39, + 0x52, 0x4D, 0x45, 0x37, 0x49, 0x31, 0x30, 0x6E, 0x59, 0x45, 0x4B, 0x71, 0x47, 0x2F, 0x6F, 0x64, 0x76, 0x36, 0x4C, 0x0A, 0x54, 0x79, 0x74, 0x70, 0x45, 0x6F, 0x59, 0x4B, 0x4E, 0x44, 0x62, 0x64, 0x67, 0x70, 0x74, 0x76, 0x54, 0x2B, 0x42, 0x7A, + 0x33, 0x55, 0x6C, 0x2F, 0x4B, 0x44, 0x37, 0x4A, 0x4F, 0x36, 0x4E, 0x58, 0x42, 0x4E, 0x69, 0x54, 0x32, 0x54, 0x77, 0x70, 0x32, 0x78, 0x49, 0x51, 0x61, 0x4F, 0x48, 0x45, 0x69, 0x62, 0x67, 0x47, 0x49, 0x4F, 0x63, 0x62, 0x65, 0x72, 0x79, 0x78, + 0x6B, 0x32, 0x47, 0x61, 0x47, 0x55, 0x41, 0x52, 0x74, 0x57, 0x71, 0x46, 0x56, 0x77, 0x48, 0x78, 0x0A, 0x74, 0x6C, 0x6F, 0x74, 0x4A, 0x6E, 0x4D, 0x6E, 0x6C, 0x76, 0x6D, 0x35, 0x50, 0x31, 0x76, 0x51, 0x69, 0x4A, 0x33, 0x6B, 0x6F, 0x50, 0x32, + 0x36, 0x54, 0x70, 0x55, 0x4A, 0x67, 0x33, 0x39, 0x33, 0x33, 0x46, 0x45, 0x46, 0x6C, 0x4A, 0x30, 0x67, 0x63, 0x58, 0x61, 0x78, 0x37, 0x50, 0x71, 0x4A, 0x74, 0x5A, 0x77, 0x75, 0x68, 0x66, 0x47, 0x35, 0x57, 0x79, 0x52, 0x61, 0x73, 0x51, 0x6D, + 0x72, 0x32, 0x73, 0x6F, 0x61, 0x42, 0x38, 0x32, 0x47, 0x33, 0x39, 0x74, 0x70, 0x0A, 0x32, 0x37, 0x52, 0x49, 0x47, 0x41, 0x41, 0x74, 0x76, 0x4B, 0x4C, 0x45, 0x69, 0x55, 0x55, 0x6A, 0x70, 0x51, 0x37, 0x68, 0x52, 0x47, 0x55, 0x2B, 0x69, 0x73, + 0x46, 0x71, 0x4D, 0x42, 0x33, 0x69, 0x59, 0x50, 0x67, 0x36, 0x71, 0x6F, 0x63, 0x4A, 0x51, 0x72, 0x6D, 0x42, 0x6B, 0x74, 0x77, 0x6C, 0x69, 0x4A, 0x69, 0x4A, 0x38, 0x58, 0x77, 0x31, 0x38, 0x57, 0x4C, 0x4B, 0x37, 0x6E, 0x6E, 0x34, 0x47, 0x53, + 0x2F, 0x2B, 0x58, 0x2F, 0x6A, 0x62, 0x68, 0x38, 0x37, 0x71, 0x0A, 0x71, 0x41, 0x38, 0x4D, 0x70, 0x75, 0x67, 0x4C, 0x6F, 0x44, 0x7A, 0x67, 0x61, 0x35, 0x53, 0x59, 0x6E, 0x48, 0x2B, 0x74, 0x42, 0x75, 0x59, 0x63, 0x36, 0x6B, 0x49, 0x51, 0x58, + 0x2B, 0x49, 0x6D, 0x46, 0x54, 0x77, 0x33, 0x4F, 0x66, 0x66, 0x58, 0x76, 0x4F, 0x36, 0x34, 0x35, 0x65, 0x38, 0x44, 0x37, 0x72, 0x30, 0x69, 0x2B, 0x79, 0x69, 0x47, 0x4E, 0x46, 0x6A, 0x45, 0x57, 0x6E, 0x39, 0x68, 0x6F, 0x6E, 0x67, 0x50, 0x58, + 0x76, 0x50, 0x4B, 0x6E, 0x62, 0x77, 0x62, 0x0A, 0x50, 0x4B, 0x66, 0x49, 0x4C, 0x66, 0x61, 0x6E, 0x49, 0x68, 0x48, 0x4B, 0x41, 0x39, 0x6A, 0x6E, 0x5A, 0x77, 0x71, 0x4B, 0x44, 0x73, 0x73, 0x31, 0x6A, 0x6A, 0x51, 0x35, 0x32, 0x4D, 0x6A, 0x71, + 0x6A, 0x5A, 0x39, 0x6B, 0x34, 0x44, 0x65, 0x77, 0x62, 0x4E, 0x66, 0x46, 0x6A, 0x38, 0x47, 0x51, 0x59, 0x53, 0x62, 0x62, 0x4A, 0x49, 0x77, 0x65, 0x53, 0x73, 0x43, 0x49, 0x33, 0x7A, 0x57, 0x51, 0x7A, 0x6A, 0x38, 0x43, 0x39, 0x47, 0x52, 0x68, + 0x33, 0x73, 0x66, 0x49, 0x0A, 0x42, 0x35, 0x58, 0x65, 0x4D, 0x68, 0x67, 0x36, 0x6A, 0x36, 0x4A, 0x43, 0x51, 0x43, 0x54, 0x6C, 0x31, 0x6A, 0x4E, 0x64, 0x66, 0x4B, 0x37, 0x76, 0x73, 0x55, 0x31, 0x50, 0x31, 0x46, 0x65, 0x51, 0x4E, 0x57, 0x72, + 0x63, 0x72, 0x67, 0x53, 0x58, 0x53, 0x59, 0x6B, 0x30, 0x6C, 0x79, 0x34, 0x77, 0x42, 0x4F, 0x65, 0x59, 0x39, 0x39, 0x73, 0x4C, 0x41, 0x5A, 0x44, 0x42, 0x48, 0x77, 0x6F, 0x2F, 0x2B, 0x4D, 0x4C, 0x2B, 0x54, 0x76, 0x72, 0x62, 0x6D, 0x6E, 0x4E, + 0x7A, 0x0A, 0x46, 0x72, 0x77, 0x46, 0x75, 0x48, 0x6E, 0x59, 0x57, 0x61, 0x38, 0x47, 0x35, 0x7A, 0x39, 0x6E, 0x4F, 0x44, 0x6D, 0x78, 0x66, 0x4B, 0x75, 0x55, 0x34, 0x43, 0x6B, 0x55, 0x70, 0x69, 0x6A, 0x79, 0x33, 0x32, 0x33, 0x69, 0x6D, 0x74, + 0x74, 0x55, 0x51, 0x2F, 0x68, 0x48, 0x57, 0x4B, 0x4E, 0x64, 0x64, 0x42, 0x57, 0x63, 0x77, 0x61, 0x75, 0x77, 0x78, 0x7A, 0x51, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x44, 0x2D, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x20, 0x32, 0x30, 0x32, 0x33, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x71, 0x54, 0x43, 0x43, 0x41, 0x35, 0x47, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x61, 0x53, 0x59, 0x4A, 0x66, 0x6F, 0x42, 0x4C, 0x54, 0x4B, + 0x43, 0x6E, 0x6A, 0x48, 0x68, 0x69, 0x55, 0x31, 0x39, 0x61, 0x62, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x30, 0x46, 0x41, 0x44, 0x42, 0x49, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, + 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x45, 0x52, 0x54, 0x45, 0x56, 0x4D, 0x42, 0x4D, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4D, 0x4D, 0x52, 0x43, 0x31, 0x55, 0x63, 0x6E, 0x56, 0x7A, 0x64, 0x43, 0x42, 0x48, 0x62, + 0x57, 0x4A, 0x49, 0x4D, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x78, 0x6C, 0x45, 0x4C, 0x56, 0x52, 0x53, 0x56, 0x56, 0x4E, 0x55, 0x49, 0x45, 0x56, 0x57, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, + 0x30, 0x45, 0x67, 0x0A, 0x4D, 0x69, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x7A, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x7A, 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x54, 0x41, 0x35, 0x4D, 0x54, 0x41, 0x7A, 0x4D, 0x31, 0x6F, 0x58, 0x44, 0x54, 0x4D, 0x34, + 0x4D, 0x44, 0x55, 0x77, 0x4F, 0x54, 0x41, 0x35, 0x4D, 0x54, 0x41, 0x7A, 0x4D, 0x6C, 0x6F, 0x77, 0x53, 0x44, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x52, 0x45, 0x55, 0x78, 0x46, 0x54, 0x41, 0x54, + 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x54, 0x44, 0x45, 0x51, 0x74, 0x56, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x51, 0x67, 0x52, 0x32, 0x31, 0x69, 0x53, 0x44, 0x45, 0x69, 0x4D, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, + 0x5A, 0x52, 0x43, 0x31, 0x55, 0x55, 0x6C, 0x56, 0x54, 0x56, 0x43, 0x42, 0x46, 0x56, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, 0x45, 0x4E, 0x42, 0x49, 0x44, 0x49, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x7A, 0x43, 0x43, 0x0A, 0x41, 0x69, + 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4E, + 0x69, 0x4F, 0x6F, 0x34, 0x6D, 0x41, 0x43, 0x37, 0x4A, 0x58, 0x55, 0x74, 0x79, 0x70, 0x55, 0x30, 0x77, 0x33, 0x75, 0x58, 0x39, 0x6A, 0x46, 0x78, 0x50, 0x76, 0x70, 0x31, 0x73, 0x6A, 0x57, 0x32, 0x6C, 0x31, 0x0A, 0x73, 0x4A, 0x6B, 0x4B, 0x46, + 0x38, 0x47, 0x4C, 0x78, 0x4E, 0x75, 0x6F, 0x34, 0x4D, 0x77, 0x78, 0x75, 0x73, 0x4C, 0x79, 0x7A, 0x56, 0x33, 0x70, 0x74, 0x2F, 0x67, 0x64, 0x72, 0x32, 0x72, 0x45, 0x6C, 0x59, 0x66, 0x58, 0x52, 0x38, 0x6D, 0x56, 0x32, 0x49, 0x49, 0x45, 0x55, + 0x44, 0x32, 0x42, 0x43, 0x50, 0x2F, 0x6B, 0x50, 0x62, 0x4F, 0x78, 0x31, 0x73, 0x57, 0x79, 0x2F, 0x59, 0x67, 0x4A, 0x32, 0x35, 0x79, 0x45, 0x37, 0x43, 0x55, 0x58, 0x46, 0x49, 0x64, 0x2F, 0x0A, 0x4D, 0x48, 0x69, 0x62, 0x61, 0x6C, 0x6A, 0x4A, + 0x74, 0x6E, 0x4D, 0x6F, 0x50, 0x44, 0x54, 0x33, 0x6D, 0x66, 0x64, 0x2F, 0x30, 0x36, 0x62, 0x34, 0x48, 0x45, 0x56, 0x38, 0x72, 0x53, 0x79, 0x4D, 0x6C, 0x44, 0x2F, 0x59, 0x5A, 0x78, 0x42, 0x54, 0x66, 0x69, 0x4C, 0x4E, 0x54, 0x69, 0x56, 0x52, + 0x38, 0x43, 0x55, 0x6B, 0x4E, 0x52, 0x46, 0x65, 0x45, 0x4D, 0x62, 0x73, 0x68, 0x32, 0x61, 0x4A, 0x67, 0x57, 0x69, 0x36, 0x7A, 0x43, 0x75, 0x64, 0x52, 0x33, 0x4D, 0x66, 0x0A, 0x76, 0x63, 0x32, 0x52, 0x70, 0x48, 0x4A, 0x71, 0x6E, 0x4B, 0x49, + 0x62, 0x47, 0x4B, 0x42, 0x76, 0x37, 0x46, 0x44, 0x30, 0x66, 0x55, 0x44, 0x43, 0x71, 0x44, 0x44, 0x50, 0x76, 0x58, 0x50, 0x49, 0x45, 0x79, 0x73, 0x51, 0x45, 0x78, 0x36, 0x4C, 0x6D, 0x71, 0x67, 0x36, 0x6C, 0x48, 0x50, 0x54, 0x47, 0x47, 0x6B, + 0x4B, 0x53, 0x76, 0x2F, 0x42, 0x41, 0x51, 0x50, 0x2F, 0x65, 0x58, 0x2B, 0x31, 0x53, 0x48, 0x39, 0x37, 0x37, 0x75, 0x67, 0x70, 0x62, 0x7A, 0x5A, 0x4D, 0x0A, 0x6C, 0x57, 0x47, 0x47, 0x32, 0x50, 0x6D, 0x69, 0x63, 0x34, 0x72, 0x75, 0x72, 0x69, + 0x2B, 0x57, 0x37, 0x6D, 0x6A, 0x4E, 0x50, 0x55, 0x30, 0x6F, 0x51, 0x76, 0x6C, 0x46, 0x4B, 0x7A, 0x49, 0x62, 0x52, 0x6C, 0x55, 0x57, 0x61, 0x71, 0x5A, 0x4C, 0x4B, 0x66, 0x6D, 0x37, 0x6C, 0x56, 0x61, 0x2F, 0x52, 0x68, 0x33, 0x73, 0x48, 0x5A, + 0x4D, 0x64, 0x77, 0x47, 0x57, 0x79, 0x48, 0x36, 0x46, 0x44, 0x72, 0x6C, 0x61, 0x65, 0x6F, 0x4C, 0x47, 0x50, 0x61, 0x78, 0x4B, 0x33, 0x0A, 0x59, 0x47, 0x31, 0x34, 0x43, 0x38, 0x71, 0x4B, 0x58, 0x4F, 0x30, 0x65, 0x6C, 0x67, 0x36, 0x44, 0x70, + 0x6B, 0x69, 0x56, 0x6A, 0x54, 0x75, 0x6A, 0x49, 0x63, 0x53, 0x75, 0x57, 0x4D, 0x59, 0x41, 0x73, 0x6F, 0x53, 0x30, 0x49, 0x36, 0x53, 0x57, 0x68, 0x6A, 0x57, 0x34, 0x32, 0x4A, 0x37, 0x59, 0x72, 0x44, 0x52, 0x4A, 0x6D, 0x47, 0x4F, 0x56, 0x78, + 0x63, 0x74, 0x74, 0x53, 0x45, 0x66, 0x69, 0x38, 0x69, 0x34, 0x59, 0x48, 0x74, 0x41, 0x78, 0x71, 0x39, 0x31, 0x30, 0x0A, 0x37, 0x50, 0x6E, 0x63, 0x6A, 0x4C, 0x67, 0x63, 0x6A, 0x6D, 0x67, 0x6A, 0x75, 0x74, 0x44, 0x7A, 0x55, 0x4E, 0x7A, 0x50, + 0x5A, 0x59, 0x39, 0x7A, 0x4F, 0x6A, 0x4C, 0x48, 0x66, 0x50, 0x37, 0x4B, 0x67, 0x69, 0x4A, 0x50, 0x76, 0x6F, 0x35, 0x69, 0x52, 0x32, 0x62, 0x6C, 0x7A, 0x59, 0x66, 0x69, 0x36, 0x4E, 0x55, 0x50, 0x47, 0x4A, 0x2F, 0x6C, 0x42, 0x48, 0x4A, 0x4C, + 0x52, 0x6A, 0x77, 0x51, 0x38, 0x6B, 0x54, 0x43, 0x5A, 0x46, 0x5A, 0x78, 0x54, 0x6E, 0x58, 0x6F, 0x0A, 0x6E, 0x4D, 0x6B, 0x6D, 0x64, 0x4D, 0x56, 0x39, 0x57, 0x64, 0x45, 0x4B, 0x57, 0x77, 0x39, 0x74, 0x2F, 0x70, 0x35, 0x31, 0x48, 0x42, 0x6A, + 0x47, 0x47, 0x6A, 0x70, 0x38, 0x32, 0x41, 0x30, 0x45, 0x7A, 0x4D, 0x32, 0x33, 0x52, 0x57, 0x56, 0x36, 0x73, 0x59, 0x2B, 0x34, 0x72, 0x6F, 0x52, 0x49, 0x50, 0x72, 0x4E, 0x36, 0x54, 0x61, 0x67, 0x44, 0x34, 0x75, 0x4A, 0x2B, 0x41, 0x52, 0x5A, + 0x5A, 0x61, 0x42, 0x68, 0x44, 0x4D, 0x37, 0x44, 0x53, 0x33, 0x4C, 0x41, 0x61, 0x0A, 0x51, 0x7A, 0x58, 0x75, 0x70, 0x64, 0x71, 0x70, 0x52, 0x6C, 0x79, 0x75, 0x68, 0x6F, 0x46, 0x42, 0x41, 0x55, 0x70, 0x30, 0x4A, 0x75, 0x79, 0x66, 0x42, 0x72, + 0x2F, 0x43, 0x42, 0x54, 0x64, 0x6B, 0x64, 0x58, 0x67, 0x70, 0x61, 0x50, 0x33, 0x46, 0x39, 0x65, 0x76, 0x2B, 0x52, 0x2F, 0x6E, 0x6B, 0x68, 0x62, 0x44, 0x68, 0x65, 0x7A, 0x47, 0x64, 0x70, 0x6E, 0x39, 0x79, 0x6F, 0x37, 0x6E, 0x45, 0x4C, 0x43, + 0x37, 0x4D, 0x6D, 0x56, 0x63, 0x4F, 0x49, 0x51, 0x78, 0x46, 0x0A, 0x41, 0x5A, 0x52, 0x6C, 0x36, 0x32, 0x55, 0x4A, 0x78, 0x6D, 0x4D, 0x69, 0x43, 0x7A, 0x4E, 0x4A, 0x6B, 0x6B, 0x67, 0x38, 0x2F, 0x4D, 0x33, 0x4F, 0x73, 0x44, 0x36, 0x4F, 0x6E, + 0x6F, 0x76, 0x34, 0x2F, 0x6B, 0x6E, 0x46, 0x4E, 0x58, 0x4A, 0x48, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x67, 0x59, 0x34, 0x77, 0x67, 0x59, 0x73, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, + 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0A, 0x2F, 0x7A, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x71, 0x76, 0x79, 0x52, 0x45, 0x42, 0x75, 0x48, 0x6B, 0x56, 0x38, 0x57, 0x75, 0x62, 0x39, 0x50, + 0x53, 0x35, 0x46, 0x65, 0x41, 0x42, 0x79, 0x78, 0x4D, 0x6F, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x45, 0x47, 0x4D, 0x45, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x64, + 0x48, 0x77, 0x52, 0x43, 0x0A, 0x4D, 0x45, 0x41, 0x77, 0x50, 0x71, 0x41, 0x38, 0x6F, 0x44, 0x71, 0x47, 0x4F, 0x47, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4C, 0x79, 0x39, 0x6A, 0x63, 0x6D, 0x77, 0x75, 0x5A, 0x43, 0x31, 0x30, 0x63, 0x6E, 0x56, + 0x7A, 0x64, 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x76, 0x59, 0x33, 0x4A, 0x73, 0x4C, 0x32, 0x51, 0x74, 0x64, 0x48, 0x4A, 0x31, 0x63, 0x33, 0x52, 0x66, 0x5A, 0x58, 0x5A, 0x66, 0x63, 0x6D, 0x39, 0x76, 0x64, 0x46, 0x39, 0x6A, 0x59, 0x56, 0x38, + 0x79, 0x0A, 0x58, 0x7A, 0x49, 0x77, 0x4D, 0x6A, 0x4D, 0x75, 0x59, 0x33, 0x4A, 0x73, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x44, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x41, 0x51, + 0x43, 0x54, 0x79, 0x36, 0x55, 0x66, 0x6D, 0x52, 0x48, 0x73, 0x6D, 0x67, 0x31, 0x66, 0x4C, 0x42, 0x57, 0x54, 0x78, 0x6A, 0x2B, 0x2B, 0x45, 0x49, 0x31, 0x34, 0x51, 0x76, 0x42, 0x75, 0x6B, 0x45, 0x64, 0x48, 0x6A, 0x71, 0x4F, 0x53, 0x0A, 0x4D, + 0x6F, 0x31, 0x77, 0x6A, 0x2F, 0x5A, 0x62, 0x6A, 0x62, 0x36, 0x4A, 0x7A, 0x6B, 0x63, 0x42, 0x61, 0x68, 0x73, 0x67, 0x49, 0x49, 0x6C, 0x62, 0x79, 0x49, 0x49, 0x51, 0x62, 0x4F, 0x44, 0x6E, 0x6D, 0x61, 0x70, 0x72, 0x78, 0x69, 0x71, 0x67, 0x59, + 0x7A, 0x57, 0x52, 0x61, 0x6F, 0x55, 0x6C, 0x72, 0x52, 0x63, 0x34, 0x70, 0x5A, 0x74, 0x2B, 0x55, 0x50, 0x4A, 0x32, 0x36, 0x6F, 0x55, 0x46, 0x4B, 0x69, 0x64, 0x42, 0x4B, 0x37, 0x47, 0x42, 0x30, 0x61, 0x4C, 0x32, 0x0A, 0x51, 0x48, 0x57, 0x70, + 0x44, 0x73, 0x76, 0x78, 0x56, 0x55, 0x6A, 0x59, 0x37, 0x4E, 0x48, 0x73, 0x73, 0x2B, 0x6A, 0x4F, 0x46, 0x4B, 0x45, 0x31, 0x37, 0x4D, 0x4A, 0x65, 0x4E, 0x52, 0x71, 0x72, 0x70, 0x68, 0x59, 0x42, 0x42, 0x6F, 0x37, 0x71, 0x33, 0x43, 0x2B, 0x6A, + 0x69, 0x73, 0x6F, 0x73, 0x6B, 0x65, 0x74, 0x53, 0x6A, 0x6C, 0x38, 0x4D, 0x6D, 0x78, 0x66, 0x50, 0x79, 0x33, 0x4D, 0x48, 0x47, 0x63, 0x52, 0x71, 0x77, 0x6E, 0x4E, 0x55, 0x37, 0x33, 0x78, 0x44, 0x0A, 0x55, 0x6D, 0x50, 0x42, 0x45, 0x63, 0x72, + 0x43, 0x52, 0x62, 0x48, 0x30, 0x4F, 0x31, 0x50, 0x31, 0x61, 0x61, 0x34, 0x38, 0x34, 0x36, 0x58, 0x65, 0x72, 0x4F, 0x68, 0x55, 0x74, 0x37, 0x4B, 0x52, 0x2F, 0x61, 0x79, 0x70, 0x48, 0x2F, 0x4B, 0x48, 0x35, 0x42, 0x66, 0x47, 0x53, 0x61, 0x68, + 0x38, 0x32, 0x41, 0x70, 0x42, 0x39, 0x50, 0x49, 0x2B, 0x35, 0x33, 0x63, 0x30, 0x42, 0x46, 0x4C, 0x64, 0x36, 0x49, 0x48, 0x79, 0x54, 0x53, 0x39, 0x55, 0x52, 0x5A, 0x30, 0x56, 0x0A, 0x34, 0x55, 0x2F, 0x4D, 0x35, 0x64, 0x34, 0x30, 0x56, 0x78, + 0x44, 0x4A, 0x49, 0x33, 0x49, 0x58, 0x63, 0x49, 0x31, 0x51, 0x63, 0x42, 0x39, 0x57, 0x62, 0x4D, 0x79, 0x35, 0x2F, 0x7A, 0x70, 0x61, 0x54, 0x32, 0x4E, 0x36, 0x77, 0x32, 0x35, 0x6C, 0x42, 0x78, 0x32, 0x45, 0x6F, 0x66, 0x2B, 0x70, 0x44, 0x47, + 0x4F, 0x4A, 0x62, 0x62, 0x4A, 0x41, 0x69, 0x44, 0x6E, 0x58, 0x48, 0x33, 0x64, 0x6F, 0x74, 0x66, 0x79, 0x63, 0x31, 0x64, 0x5A, 0x6E, 0x61, 0x56, 0x75, 0x6F, 0x0A, 0x64, 0x4E, 0x76, 0x38, 0x69, 0x66, 0x59, 0x62, 0x4D, 0x76, 0x65, 0x6B, 0x4A, + 0x4B, 0x5A, 0x32, 0x74, 0x30, 0x64, 0x54, 0x37, 0x34, 0x31, 0x4A, 0x6A, 0x36, 0x6D, 0x32, 0x67, 0x31, 0x71, 0x6C, 0x6C, 0x70, 0x42, 0x46, 0x59, 0x66, 0x58, 0x65, 0x41, 0x30, 0x38, 0x6D, 0x44, 0x36, 0x69, 0x4C, 0x38, 0x41, 0x4F, 0x57, 0x73, + 0x4B, 0x77, 0x56, 0x30, 0x48, 0x46, 0x61, 0x61, 0x6E, 0x75, 0x55, 0x35, 0x6E, 0x43, 0x54, 0x32, 0x76, 0x46, 0x70, 0x34, 0x4C, 0x4A, 0x69, 0x0A, 0x54, 0x5A, 0x36, 0x50, 0x2F, 0x34, 0x6D, 0x64, 0x6D, 0x31, 0x33, 0x4E, 0x52, 0x65, 0x6D, 0x55, + 0x41, 0x69, 0x4B, 0x4E, 0x34, 0x44, 0x56, 0x2F, 0x36, 0x50, 0x45, 0x45, 0x65, 0x58, 0x46, 0x73, 0x56, 0x49, 0x50, 0x34, 0x4D, 0x37, 0x6B, 0x46, 0x4D, 0x68, 0x74, 0x59, 0x56, 0x52, 0x46, 0x50, 0x30, 0x4F, 0x55, 0x6E, 0x52, 0x33, 0x48, 0x73, + 0x37, 0x64, 0x70, 0x6E, 0x31, 0x6D, 0x4B, 0x6D, 0x53, 0x30, 0x30, 0x50, 0x61, 0x61, 0x4C, 0x4A, 0x76, 0x4F, 0x77, 0x69, 0x0A, 0x53, 0x35, 0x54, 0x48, 0x61, 0x4A, 0x51, 0x58, 0x66, 0x75, 0x4B, 0x4F, 0x4B, 0x44, 0x36, 0x32, 0x78, 0x75, 0x72, + 0x31, 0x4E, 0x47, 0x79, 0x66, 0x4E, 0x34, 0x67, 0x48, 0x4F, 0x4E, 0x75, 0x47, 0x63, 0x66, 0x72, 0x4E, 0x6C, 0x55, 0x68, 0x44, 0x62, 0x71, 0x4E, 0x50, 0x67, 0x6F, 0x66, 0x58, 0x4E, 0x4A, 0x68, 0x75, 0x53, 0x35, 0x4E, 0x35, 0x59, 0x48, 0x56, + 0x70, 0x44, 0x2F, 0x41, 0x61, 0x31, 0x56, 0x50, 0x36, 0x49, 0x51, 0x7A, 0x43, 0x50, 0x2B, 0x6B, 0x2F, 0x0A, 0x48, 0x78, 0x69, 0x4D, 0x6B, 0x6C, 0x31, 0x34, 0x70, 0x33, 0x5A, 0x6E, 0x47, 0x62, 0x75, 0x79, 0x36, 0x6E, 0x2F, 0x70, 0x63, 0x41, + 0x6C, 0x57, 0x56, 0x71, 0x4F, 0x77, 0x44, 0x41, 0x73, 0x74, 0x4E, 0x6C, 0x37, 0x46, 0x36, 0x63, 0x54, 0x56, 0x67, 0x38, 0x75, 0x47, 0x46, 0x35, 0x63, 0x73, 0x62, 0x42, 0x4E, 0x76, 0x68, 0x31, 0x71, 0x76, 0x53, 0x61, 0x59, 0x64, 0x32, 0x38, + 0x30, 0x34, 0x42, 0x43, 0x35, 0x66, 0x34, 0x6B, 0x6F, 0x31, 0x44, 0x69, 0x31, 0x4C, 0x0A, 0x2B, 0x4B, 0x49, 0x6B, 0x42, 0x49, 0x33, 0x59, 0x34, 0x57, 0x4E, 0x65, 0x41, 0x70, 0x49, 0x30, 0x32, 0x70, 0x68, 0x68, 0x58, 0x42, 0x78, 0x76, 0x57, + 0x48, 0x5A, 0x6B, 0x73, 0x2F, 0x77, 0x43, 0x75, 0x50, 0x57, 0x64, 0x43, 0x67, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, + 0x2D, 0x0A, 0x0A, 0x53, 0x77, 0x69, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x52, 0x53, 0x41, 0x20, 0x54, 0x4C, 0x53, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x32, 0x20, 0x2D, 0x20, 0x31, 0x0A, 0x3D, 0x3D, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, + 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x6B, 0x7A, 0x43, 0x43, 0x41, 0x33, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, + 0x55, 0x51, 0x2F, 0x6F, 0x4D, 0x58, 0x30, 0x34, 0x62, 0x67, 0x42, 0x68, 0x45, 0x37, 0x39, 0x47, 0x30, 0x54, 0x7A, 0x55, 0x66, 0x52, 0x50, 0x53, 0x41, 0x37, 0x63, 0x73, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, + 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x42, 0x51, 0x41, 0x77, 0x55, 0x54, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x0A, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4D, 0x43, 0x51, 0x30, 0x67, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, + 0x6F, 0x54, 0x44, 0x46, 0x4E, 0x33, 0x61, 0x58, 0x4E, 0x7A, 0x55, 0x32, 0x6C, 0x6E, 0x62, 0x69, 0x42, 0x42, 0x52, 0x7A, 0x45, 0x72, 0x4D, 0x43, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x69, 0x55, 0x33, 0x64, 0x70, 0x63, 0x33, + 0x4E, 0x54, 0x61, 0x57, 0x64, 0x75, 0x49, 0x46, 0x4A, 0x54, 0x51, 0x53, 0x42, 0x55, 0x0A, 0x54, 0x46, 0x4D, 0x67, 0x55, 0x6D, 0x39, 0x76, 0x64, 0x43, 0x42, 0x44, 0x51, 0x53, 0x41, 0x79, 0x4D, 0x44, 0x49, 0x79, 0x49, 0x43, 0x30, 0x67, 0x4D, + 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4D, 0x6A, 0x41, 0x32, 0x4D, 0x44, 0x67, 0x78, 0x4D, 0x54, 0x41, 0x34, 0x4D, 0x6A, 0x4A, 0x61, 0x46, 0x77, 0x30, 0x30, 0x4E, 0x7A, 0x41, 0x32, 0x4D, 0x44, 0x67, 0x78, 0x4D, 0x54, 0x41, 0x34, 0x4D, + 0x6A, 0x4A, 0x61, 0x4D, 0x46, 0x45, 0x78, 0x43, 0x7A, 0x41, 0x4A, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x49, 0x4D, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x78, 0x54, + 0x64, 0x32, 0x6C, 0x7A, 0x63, 0x31, 0x4E, 0x70, 0x5A, 0x32, 0x34, 0x67, 0x51, 0x55, 0x63, 0x78, 0x4B, 0x7A, 0x41, 0x70, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x54, 0x49, 0x6C, 0x4E, 0x33, 0x61, 0x58, 0x4E, 0x7A, 0x55, 0x32, 0x6C, 0x6E, + 0x62, 0x69, 0x42, 0x53, 0x55, 0x30, 0x45, 0x67, 0x0A, 0x56, 0x45, 0x78, 0x54, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x51, 0x30, 0x45, 0x67, 0x4D, 0x6A, 0x41, 0x79, 0x4D, 0x69, 0x41, 0x74, 0x49, 0x44, 0x45, 0x77, 0x67, 0x67, 0x49, + 0x69, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x43, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x49, 0x4B, 0x41, 0x6F, 0x49, 0x43, 0x41, 0x51, 0x44, + 0x4C, 0x4B, 0x6D, 0x6A, 0x69, 0x0A, 0x43, 0x38, 0x4E, 0x58, 0x76, 0x44, 0x56, 0x6A, 0x76, 0x48, 0x43, 0x6C, 0x4F, 0x2F, 0x4F, 0x4D, 0x50, 0x45, 0x35, 0x58, 0x6C, 0x6D, 0x37, 0x44, 0x54, 0x6A, 0x61, 0x6B, 0x39, 0x67, 0x4C, 0x4B, 0x48, 0x71, + 0x71, 0x75, 0x75, 0x4E, 0x36, 0x6F, 0x72, 0x78, 0x31, 0x32, 0x32, 0x72, 0x6F, 0x31, 0x30, 0x4A, 0x46, 0x77, 0x42, 0x39, 0x2B, 0x7A, 0x42, 0x76, 0x4B, 0x4B, 0x38, 0x69, 0x35, 0x56, 0x55, 0x58, 0x75, 0x37, 0x4C, 0x43, 0x54, 0x4C, 0x66, 0x35, + 0x49, 0x6D, 0x0A, 0x67, 0x4B, 0x4F, 0x30, 0x6C, 0x50, 0x61, 0x43, 0x6F, 0x61, 0x54, 0x6F, 0x2B, 0x6E, 0x55, 0x64, 0x57, 0x66, 0x4D, 0x48, 0x61, 0x6D, 0x46, 0x6B, 0x34, 0x73, 0x61, 0x4D, 0x6C, 0x61, 0x2B, 0x6A, 0x75, 0x34, 0x35, 0x76, 0x56, + 0x73, 0x39, 0x78, 0x7A, 0x46, 0x36, 0x42, 0x59, 0x51, 0x31, 0x74, 0x38, 0x71, 0x73, 0x43, 0x4C, 0x71, 0x53, 0x58, 0x35, 0x58, 0x48, 0x38, 0x69, 0x72, 0x43, 0x52, 0x49, 0x46, 0x75, 0x63, 0x64, 0x46, 0x4A, 0x74, 0x72, 0x68, 0x55, 0x6E, 0x0A, + 0x57, 0x58, 0x6A, 0x79, 0x43, 0x63, 0x70, 0x6C, 0x44, 0x6E, 0x2F, 0x4C, 0x39, 0x4F, 0x76, 0x6E, 0x33, 0x4B, 0x6C, 0x4D, 0x64, 0x2F, 0x59, 0x72, 0x46, 0x67, 0x53, 0x56, 0x72, 0x70, 0x78, 0x78, 0x70, 0x54, 0x38, 0x71, 0x32, 0x6B, 0x46, 0x43, + 0x35, 0x7A, 0x79, 0x45, 0x45, 0x50, 0x54, 0x68, 0x50, 0x59, 0x78, 0x72, 0x34, 0x69, 0x75, 0x52, 0x52, 0x31, 0x56, 0x50, 0x75, 0x46, 0x61, 0x2B, 0x52, 0x64, 0x34, 0x69, 0x55, 0x55, 0x31, 0x4F, 0x4B, 0x4E, 0x6C, 0x66, 0x0A, 0x47, 0x55, 0x45, + 0x47, 0x6A, 0x77, 0x35, 0x4E, 0x42, 0x75, 0x42, 0x77, 0x51, 0x43, 0x4D, 0x42, 0x61, 0x75, 0x54, 0x4C, 0x45, 0x35, 0x74, 0x7A, 0x72, 0x45, 0x30, 0x55, 0x53, 0x4A, 0x49, 0x74, 0x2F, 0x6D, 0x32, 0x6E, 0x2B, 0x49, 0x64, 0x72, 0x65, 0x58, 0x58, + 0x68, 0x76, 0x68, 0x43, 0x78, 0x71, 0x6F, 0x68, 0x41, 0x57, 0x56, 0x54, 0x58, 0x7A, 0x38, 0x54, 0x51, 0x6D, 0x30, 0x53, 0x7A, 0x4F, 0x47, 0x6C, 0x6B, 0x6A, 0x49, 0x48, 0x52, 0x49, 0x33, 0x36, 0x71, 0x0A, 0x4F, 0x54, 0x77, 0x37, 0x44, 0x35, + 0x39, 0x4B, 0x65, 0x34, 0x4C, 0x4B, 0x61, 0x32, 0x2F, 0x4B, 0x49, 0x6A, 0x34, 0x78, 0x30, 0x4C, 0x44, 0x51, 0x4B, 0x68, 0x79, 0x53, 0x69, 0x6F, 0x2F, 0x59, 0x47, 0x5A, 0x78, 0x48, 0x35, 0x44, 0x34, 0x4D, 0x75, 0x63, 0x4C, 0x4E, 0x76, 0x6B, + 0x45, 0x4D, 0x2B, 0x4B, 0x52, 0x48, 0x42, 0x64, 0x76, 0x42, 0x46, 0x7A, 0x41, 0x34, 0x4F, 0x6D, 0x6E, 0x63, 0x7A, 0x63, 0x4E, 0x70, 0x49, 0x2F, 0x32, 0x61, 0x44, 0x77, 0x4C, 0x4F, 0x0A, 0x45, 0x47, 0x72, 0x4F, 0x79, 0x76, 0x69, 0x35, 0x4B, + 0x61, 0x4D, 0x32, 0x69, 0x59, 0x61, 0x75, 0x43, 0x38, 0x42, 0x50, 0x59, 0x37, 0x6B, 0x47, 0x57, 0x55, 0x6C, 0x65, 0x44, 0x73, 0x46, 0x70, 0x73, 0x77, 0x72, 0x7A, 0x64, 0x33, 0x34, 0x75, 0x6E, 0x59, 0x79, 0x7A, 0x4A, 0x35, 0x6A, 0x53, 0x6D, + 0x59, 0x30, 0x6C, 0x70, 0x78, 0x2B, 0x47, 0x73, 0x36, 0x5A, 0x55, 0x63, 0x44, 0x6A, 0x38, 0x66, 0x56, 0x33, 0x6F, 0x54, 0x34, 0x4D, 0x4D, 0x30, 0x5A, 0x50, 0x6C, 0x0A, 0x45, 0x75, 0x52, 0x55, 0x32, 0x6A, 0x37, 0x79, 0x72, 0x54, 0x72, 0x65, + 0x50, 0x6A, 0x78, 0x46, 0x38, 0x43, 0x67, 0x50, 0x42, 0x72, 0x6E, 0x68, 0x32, 0x35, 0x64, 0x37, 0x6D, 0x55, 0x57, 0x65, 0x33, 0x66, 0x36, 0x56, 0x57, 0x51, 0x51, 0x76, 0x64, 0x54, 0x2F, 0x54, 0x72, 0x6F, 0x6D, 0x5A, 0x68, 0x71, 0x77, 0x55, + 0x74, 0x4B, 0x69, 0x45, 0x2B, 0x73, 0x68, 0x64, 0x4F, 0x78, 0x74, 0x59, 0x6B, 0x38, 0x45, 0x58, 0x6C, 0x46, 0x58, 0x49, 0x43, 0x2B, 0x4F, 0x43, 0x0A, 0x65, 0x59, 0x53, 0x66, 0x38, 0x77, 0x43, 0x45, 0x4E, 0x4F, 0x37, 0x63, 0x4D, 0x64, 0x57, + 0x50, 0x38, 0x76, 0x70, 0x50, 0x6C, 0x6B, 0x77, 0x47, 0x71, 0x6E, 0x6A, 0x37, 0x33, 0x6D, 0x53, 0x69, 0x49, 0x38, 0x30, 0x66, 0x50, 0x73, 0x57, 0x4D, 0x76, 0x44, 0x64, 0x55, 0x44, 0x72, 0x74, 0x61, 0x63, 0x6C, 0x58, 0x76, 0x79, 0x46, 0x75, + 0x31, 0x63, 0x76, 0x68, 0x34, 0x33, 0x7A, 0x63, 0x67, 0x54, 0x46, 0x65, 0x52, 0x63, 0x35, 0x4A, 0x7A, 0x72, 0x42, 0x68, 0x33, 0x0A, 0x51, 0x34, 0x49, 0x67, 0x61, 0x65, 0x7A, 0x70, 0x72, 0x43, 0x6C, 0x47, 0x35, 0x51, 0x74, 0x4F, 0x2B, 0x44, + 0x64, 0x7A, 0x69, 0x5A, 0x61, 0x4B, 0x48, 0x47, 0x32, 0x39, 0x37, 0x37, 0x37, 0x59, 0x74, 0x76, 0x54, 0x4B, 0x77, 0x50, 0x31, 0x48, 0x38, 0x4B, 0x34, 0x4C, 0x57, 0x43, 0x44, 0x46, 0x79, 0x42, 0x30, 0x32, 0x72, 0x70, 0x65, 0x4E, 0x55, 0x49, + 0x4D, 0x6D, 0x4A, 0x43, 0x6E, 0x33, 0x6E, 0x54, 0x73, 0x50, 0x42, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0A, 0x6F, 0x32, 0x4D, 0x77, 0x59, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x52, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, + 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2F, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x42, 0x6A, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, + 0x44, 0x41, 0x57, 0x67, 0x42, 0x52, 0x76, 0x6A, 0x6D, 0x4B, 0x4C, 0x6B, 0x30, 0x4F, 0x77, 0x0A, 0x34, 0x55, 0x44, 0x32, 0x70, 0x38, 0x50, 0x39, 0x38, 0x51, 0x2B, 0x34, 0x44, 0x78, 0x55, 0x34, 0x70, 0x54, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, + 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x62, 0x34, 0x35, 0x69, 0x69, 0x35, 0x4E, 0x44, 0x73, 0x4F, 0x46, 0x41, 0x39, 0x71, 0x66, 0x44, 0x2F, 0x66, 0x45, 0x50, 0x75, 0x41, 0x38, 0x56, 0x4F, 0x4B, 0x55, 0x77, 0x44, 0x51, 0x59, 0x4A, + 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x4C, 0x0A, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x77, 0x73, 0x4B, 0x55, 0x46, 0x39, 0x2B, 0x6C, 0x7A, 0x31, 0x47, 0x70, 0x55, 0x59, 0x76, 0x79, 0x79, + 0x70, 0x69, 0x71, 0x6B, 0x6B, 0x56, 0x48, 0x58, 0x31, 0x75, 0x45, 0x43, 0x72, 0x79, 0x36, 0x67, 0x6B, 0x55, 0x53, 0x73, 0x59, 0x50, 0x32, 0x4F, 0x70, 0x72, 0x70, 0x68, 0x57, 0x4B, 0x77, 0x56, 0x44, 0x49, 0x71, 0x4F, 0x33, 0x31, 0x30, 0x61, + 0x65, 0x77, 0x43, 0x6F, 0x53, 0x50, 0x59, 0x36, 0x57, 0x0A, 0x6C, 0x6B, 0x44, 0x66, 0x44, 0x44, 0x4F, 0x4C, 0x61, 0x7A, 0x65, 0x52, 0x4F, 0x70, 0x57, 0x37, 0x4F, 0x53, 0x6C, 0x74, 0x77, 0x41, 0x4A, 0x73, 0x69, 0x70, 0x51, 0x4C, 0x42, 0x77, + 0x4A, 0x4E, 0x47, 0x44, 0x37, 0x37, 0x2B, 0x33, 0x76, 0x31, 0x64, 0x6A, 0x32, 0x62, 0x39, 0x6C, 0x34, 0x77, 0x42, 0x6C, 0x67, 0x7A, 0x48, 0x71, 0x70, 0x34, 0x31, 0x65, 0x5A, 0x55, 0x42, 0x44, 0x71, 0x79, 0x67, 0x67, 0x6D, 0x4E, 0x7A, 0x68, + 0x59, 0x7A, 0x57, 0x55, 0x55, 0x6F, 0x0A, 0x38, 0x61, 0x57, 0x6A, 0x6C, 0x77, 0x35, 0x44, 0x49, 0x2F, 0x30, 0x4C, 0x49, 0x49, 0x43, 0x51, 0x2F, 0x2B, 0x4D, 0x6D, 0x7A, 0x37, 0x68, 0x6B, 0x6B, 0x65, 0x55, 0x46, 0x6A, 0x78, 0x4F, 0x67, 0x64, + 0x67, 0x33, 0x58, 0x4E, 0x77, 0x77, 0x51, 0x69, 0x4A, 0x62, 0x30, 0x50, 0x72, 0x36, 0x56, 0x76, 0x66, 0x48, 0x44, 0x66, 0x66, 0x43, 0x6A, 0x77, 0x33, 0x6C, 0x48, 0x43, 0x31, 0x79, 0x53, 0x46, 0x57, 0x50, 0x74, 0x55, 0x6E, 0x57, 0x4B, 0x35, + 0x30, 0x5A, 0x70, 0x0A, 0x79, 0x31, 0x46, 0x56, 0x43, 0x79, 0x70, 0x4D, 0x39, 0x66, 0x4A, 0x6B, 0x54, 0x36, 0x6C, 0x63, 0x2F, 0x32, 0x63, 0x79, 0x6A, 0x6C, 0x55, 0x74, 0x4D, 0x6F, 0x49, 0x63, 0x67, 0x43, 0x39, 0x71, 0x6B, 0x66, 0x6A, 0x4C, + 0x76, 0x48, 0x34, 0x59, 0x6F, 0x69, 0x61, 0x6F, 0x4C, 0x71, 0x4E, 0x54, 0x4B, 0x49, 0x66, 0x74, 0x56, 0x2B, 0x56, 0x6C, 0x65, 0x6B, 0x34, 0x41, 0x53, 0x6C, 0x74, 0x4F, 0x55, 0x38, 0x6C, 0x69, 0x4E, 0x72, 0x33, 0x43, 0x6A, 0x6C, 0x76, 0x72, + 0x0A, 0x7A, 0x47, 0x34, 0x6E, 0x67, 0x52, 0x68, 0x5A, 0x69, 0x30, 0x52, 0x6A, 0x6E, 0x39, 0x55, 0x4D, 0x5A, 0x66, 0x51, 0x70, 0x5A, 0x58, 0x2B, 0x52, 0x4C, 0x4F, 0x56, 0x2F, 0x66, 0x75, 0x69, 0x4A, 0x7A, 0x34, 0x38, 0x67, 0x79, 0x32, 0x30, + 0x48, 0x51, 0x68, 0x46, 0x52, 0x4A, 0x6A, 0x4B, 0x4B, 0x4C, 0x6A, 0x70, 0x48, 0x45, 0x37, 0x69, 0x4E, 0x76, 0x55, 0x63, 0x4E, 0x43, 0x66, 0x41, 0x57, 0x70, 0x4F, 0x32, 0x57, 0x68, 0x69, 0x34, 0x5A, 0x32, 0x4C, 0x36, 0x4D, 0x0A, 0x4F, 0x75, + 0x68, 0x46, 0x4C, 0x68, 0x47, 0x36, 0x72, 0x6C, 0x72, 0x6E, 0x75, 0x62, 0x2B, 0x78, 0x7A, 0x49, 0x2F, 0x67, 0x6F, 0x50, 0x2B, 0x34, 0x73, 0x39, 0x47, 0x46, 0x65, 0x33, 0x6C, 0x6D, 0x6F, 0x7A, 0x6D, 0x31, 0x4F, 0x32, 0x62, 0x59, 0x51, 0x4C, + 0x37, 0x50, 0x74, 0x32, 0x65, 0x4C, 0x53, 0x4D, 0x6B, 0x5A, 0x4A, 0x56, 0x58, 0x38, 0x76, 0x59, 0x33, 0x50, 0x58, 0x74, 0x70, 0x4F, 0x70, 0x76, 0x4A, 0x70, 0x7A, 0x76, 0x31, 0x2F, 0x54, 0x48, 0x66, 0x51, 0x0A, 0x77, 0x55, 0x59, 0x31, 0x6D, + 0x46, 0x77, 0x6A, 0x6D, 0x77, 0x4A, 0x46, 0x51, 0x35, 0x52, 0x61, 0x33, 0x62, 0x78, 0x48, 0x72, 0x53, 0x4C, 0x2B, 0x75, 0x6C, 0x34, 0x76, 0x6B, 0x53, 0x6B, 0x70, 0x68, 0x6E, 0x73, 0x68, 0x33, 0x6D, 0x35, 0x6B, 0x74, 0x38, 0x73, 0x4E, 0x6A, + 0x7A, 0x64, 0x62, 0x6F, 0x77, 0x68, 0x71, 0x36, 0x2F, 0x54, 0x64, 0x41, 0x6F, 0x39, 0x51, 0x41, 0x77, 0x4B, 0x78, 0x75, 0x44, 0x64, 0x6F, 0x6C, 0x6C, 0x44, 0x72, 0x75, 0x46, 0x2F, 0x55, 0x0A, 0x4B, 0x49, 0x71, 0x6C, 0x49, 0x67, 0x79, 0x4B, + 0x68, 0x50, 0x42, 0x5A, 0x4C, 0x74, 0x55, 0x33, 0x30, 0x57, 0x48, 0x6C, 0x51, 0x6E, 0x4E, 0x59, 0x4B, 0x6F, 0x48, 0x33, 0x64, 0x74, 0x76, 0x69, 0x34, 0x6B, 0x30, 0x4E, 0x58, 0x2F, 0x61, 0x33, 0x76, 0x67, 0x57, 0x30, 0x72, 0x6B, 0x34, 0x4E, + 0x33, 0x68, 0x59, 0x39, 0x41, 0x34, 0x47, 0x7A, 0x4A, 0x6C, 0x35, 0x4C, 0x75, 0x45, 0x73, 0x41, 0x7A, 0x2F, 0x2B, 0x4D, 0x46, 0x37, 0x70, 0x73, 0x59, 0x43, 0x30, 0x6E, 0x0A, 0x68, 0x7A, 0x63, 0x6B, 0x35, 0x6E, 0x70, 0x67, 0x4C, 0x37, 0x58, + 0x54, 0x67, 0x77, 0x53, 0x71, 0x54, 0x30, 0x4E, 0x31, 0x6F, 0x73, 0x47, 0x44, 0x73, 0x69, 0x65, 0x59, 0x4B, 0x37, 0x45, 0x4F, 0x67, 0x4C, 0x72, 0x41, 0x68, 0x56, 0x35, 0x43, 0x75, 0x64, 0x2B, 0x78, 0x59, 0x4A, 0x48, 0x54, 0x36, 0x78, 0x68, + 0x2B, 0x63, 0x48, 0x69, 0x75, 0x64, 0x6F, 0x4F, 0x2B, 0x63, 0x56, 0x72, 0x51, 0x6B, 0x4F, 0x50, 0x4B, 0x77, 0x52, 0x59, 0x6C, 0x5A, 0x30, 0x72, 0x77, 0x0A, 0x74, 0x6E, 0x75, 0x36, 0x34, 0x5A, 0x7A, 0x5A, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x4F, 0x49, 0x53, 0x54, 0x45, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, + 0x45, 0x43, 0x43, 0x20, 0x47, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, + 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x4E, 0x54, 0x43, 0x43, 0x41, 0x62, 0x71, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, + 0x49, 0x2F, 0x6E, 0x44, 0x31, 0x6A, 0x57, 0x76, 0x6A, 0x79, 0x68, 0x4C, 0x48, 0x2F, 0x42, 0x55, 0x36, 0x6E, 0x36, 0x58, 0x6E, 0x54, 0x41, 0x4B, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6B, 0x6A, 0x4F, 0x50, 0x51, 0x51, 0x44, 0x41, 0x7A, 0x42, 0x4C, + 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4A, 0x44, 0x0A, 0x53, 0x44, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x51, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, + 0x67, 0x52, 0x6D, 0x39, 0x31, 0x62, 0x6D, 0x52, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6A, 0x45, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x59, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, 0x67, 0x55, 0x32, 0x56, + 0x79, 0x64, 0x6D, 0x56, 0x79, 0x49, 0x46, 0x4A, 0x76, 0x62, 0x33, 0x51, 0x67, 0x0A, 0x52, 0x55, 0x4E, 0x44, 0x49, 0x45, 0x63, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x7A, 0x4D, 0x44, 0x55, 0x7A, 0x4D, 0x54, 0x45, 0x30, 0x4E, 0x44, + 0x49, 0x79, 0x4F, 0x46, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x34, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x44, 0x45, 0x30, 0x4E, 0x44, 0x49, 0x79, 0x4E, 0x31, 0x6F, 0x77, 0x53, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, + 0x4D, 0x43, 0x51, 0x30, 0x67, 0x78, 0x47, 0x54, 0x41, 0x58, 0x0A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x45, 0x45, 0x39, 0x4A, 0x55, 0x31, 0x52, 0x46, 0x49, 0x45, 0x5A, 0x76, 0x64, 0x57, 0x35, 0x6B, 0x59, 0x58, 0x52, 0x70, 0x62, + 0x32, 0x34, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x47, 0x45, 0x39, 0x4A, 0x55, 0x31, 0x52, 0x46, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x6C, 0x63, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, 0x49, + 0x45, 0x56, 0x44, 0x51, 0x79, 0x42, 0x48, 0x0A, 0x4D, 0x54, 0x42, 0x32, 0x4D, 0x42, 0x41, 0x47, 0x42, 0x79, 0x71, 0x47, 0x53, 0x4D, 0x34, 0x39, 0x41, 0x67, 0x45, 0x47, 0x42, 0x53, 0x75, 0x42, 0x42, 0x41, 0x41, 0x69, 0x41, 0x32, 0x49, 0x41, + 0x42, 0x42, 0x63, 0x76, 0x2B, 0x68, 0x4B, 0x38, 0x72, 0x42, 0x6A, 0x7A, 0x43, 0x76, 0x52, 0x45, 0x31, 0x6E, 0x5A, 0x43, 0x6E, 0x72, 0x50, 0x6F, 0x48, 0x37, 0x64, 0x35, 0x71, 0x56, 0x69, 0x32, 0x2B, 0x47, 0x58, 0x52, 0x4F, 0x69, 0x46, 0x50, + 0x71, 0x4F, 0x75, 0x6A, 0x0A, 0x76, 0x71, 0x51, 0x79, 0x63, 0x76, 0x4F, 0x32, 0x41, 0x63, 0x6B, 0x72, 0x2F, 0x58, 0x65, 0x46, 0x62, 0x6C, 0x50, 0x64, 0x72, 0x65, 0x71, 0x71, 0x4C, 0x69, 0x57, 0x53, 0x74, 0x75, 0x6B, 0x68, 0x45, 0x61, 0x69, + 0x76, 0x74, 0x55, 0x77, 0x4C, 0x38, 0x35, 0x5A, 0x67, 0x6D, 0x6A, 0x76, 0x6E, 0x36, 0x68, 0x70, 0x34, 0x4C, 0x72, 0x51, 0x39, 0x35, 0x53, 0x6A, 0x65, 0x48, 0x49, 0x43, 0x36, 0x58, 0x47, 0x34, 0x4E, 0x32, 0x78, 0x6D, 0x6C, 0x34, 0x7A, 0x2B, + 0x63, 0x0A, 0x4B, 0x72, 0x68, 0x41, 0x53, 0x39, 0x33, 0x6D, 0x54, 0x36, 0x4E, 0x6A, 0x4D, 0x47, 0x45, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2F, 0x7A, + 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x51, 0x33, 0x54, 0x59, 0x68, 0x6C, 0x7A, 0x2F, 0x77, 0x39, 0x69, 0x74, 0x57, 0x6A, 0x38, 0x55, 0x6E, 0x41, 0x54, 0x67, 0x77, 0x51, 0x0A, 0x62, + 0x30, 0x4B, 0x30, 0x6E, 0x44, 0x41, 0x64, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x4E, 0x30, 0x32, 0x49, 0x5A, 0x63, 0x2F, 0x38, 0x50, 0x59, 0x72, 0x56, 0x6F, 0x2F, 0x46, 0x4A, 0x77, 0x45, 0x34, 0x4D, 0x45, + 0x47, 0x39, 0x43, 0x74, 0x4A, 0x77, 0x77, 0x44, 0x67, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x41, 0x51, 0x48, 0x2F, 0x42, 0x41, 0x51, 0x44, 0x41, 0x67, 0x47, 0x47, 0x4D, 0x41, 0x6F, 0x47, 0x43, 0x43, 0x71, 0x47, 0x0A, 0x53, 0x4D, 0x34, 0x39, + 0x42, 0x41, 0x4D, 0x44, 0x41, 0x32, 0x6B, 0x41, 0x4D, 0x47, 0x59, 0x43, 0x4D, 0x51, 0x43, 0x70, 0x4B, 0x6A, 0x41, 0x64, 0x30, 0x4D, 0x4B, 0x66, 0x6B, 0x46, 0x46, 0x52, 0x51, 0x44, 0x36, 0x56, 0x56, 0x43, 0x48, 0x4E, 0x46, 0x6D, 0x62, 0x33, + 0x55, 0x32, 0x77, 0x49, 0x46, 0x6A, 0x6E, 0x51, 0x45, 0x6E, 0x78, 0x2F, 0x59, 0x78, 0x76, 0x66, 0x34, 0x7A, 0x67, 0x41, 0x4F, 0x64, 0x6B, 0x74, 0x55, 0x79, 0x42, 0x46, 0x43, 0x78, 0x78, 0x67, 0x0A, 0x5A, 0x7A, 0x46, 0x44, 0x4A, 0x65, 0x30, + 0x43, 0x4D, 0x51, 0x43, 0x53, 0x69, 0x61, 0x37, 0x70, 0x58, 0x47, 0x4B, 0x44, 0x59, 0x6D, 0x48, 0x35, 0x4C, 0x56, 0x65, 0x72, 0x56, 0x72, 0x6B, 0x52, 0x33, 0x53, 0x57, 0x2B, 0x61, 0x6B, 0x35, 0x4B, 0x47, 0x6F, 0x4A, 0x72, 0x33, 0x4D, 0x2F, + 0x54, 0x76, 0x45, 0x71, 0x7A, 0x50, 0x4E, 0x63, 0x75, 0x6D, 0x39, 0x76, 0x34, 0x4B, 0x47, 0x6D, 0x38, 0x61, 0x79, 0x33, 0x73, 0x4D, 0x61, 0x45, 0x36, 0x34, 0x31, 0x63, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x0A, 0x20, 0x4F, 0x49, 0x53, 0x54, 0x45, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, + 0x47, 0x31, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x46, 0x67, 0x7A, 0x43, 0x43, 0x41, 0x32, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x51, 0x56, 0x61, 0x58, + 0x5A, 0x5A, 0x35, 0x51, 0x6F, 0x78, 0x75, 0x30, 0x4D, 0x2B, 0x69, 0x66, 0x64, 0x57, 0x77, 0x46, 0x4E, 0x47, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x44, 0x42, + 0x4C, 0x4D, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x0A, 0x45, 0x77, 0x4A, 0x44, 0x53, 0x44, 0x45, 0x5A, 0x4D, 0x42, 0x63, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x51, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, + 0x55, 0x67, 0x52, 0x6D, 0x39, 0x31, 0x62, 0x6D, 0x52, 0x68, 0x64, 0x47, 0x6C, 0x76, 0x62, 0x6A, 0x45, 0x68, 0x4D, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x59, 0x54, 0x30, 0x6C, 0x54, 0x56, 0x45, 0x55, 0x67, 0x55, 0x32, + 0x56, 0x79, 0x64, 0x6D, 0x56, 0x79, 0x49, 0x46, 0x4A, 0x76, 0x0A, 0x62, 0x33, 0x51, 0x67, 0x55, 0x6C, 0x4E, 0x42, 0x49, 0x45, 0x63, 0x78, 0x4D, 0x42, 0x34, 0x58, 0x44, 0x54, 0x49, 0x7A, 0x4D, 0x44, 0x55, 0x7A, 0x4D, 0x54, 0x45, 0x30, 0x4D, + 0x7A, 0x63, 0x78, 0x4E, 0x6C, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x34, 0x4D, 0x44, 0x55, 0x79, 0x4E, 0x44, 0x45, 0x30, 0x4D, 0x7A, 0x63, 0x78, 0x4E, 0x56, 0x6F, 0x77, 0x53, 0x7A, 0x45, 0x4C, 0x4D, 0x41, 0x6B, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, + 0x68, 0x4D, 0x43, 0x51, 0x30, 0x67, 0x78, 0x0A, 0x47, 0x54, 0x41, 0x58, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x6F, 0x4D, 0x45, 0x45, 0x39, 0x4A, 0x55, 0x31, 0x52, 0x46, 0x49, 0x45, 0x5A, 0x76, 0x64, 0x57, 0x35, 0x6B, 0x59, 0x58, 0x52, 0x70, + 0x62, 0x32, 0x34, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x4D, 0x4D, 0x47, 0x45, 0x39, 0x4A, 0x55, 0x31, 0x52, 0x46, 0x49, 0x46, 0x4E, 0x6C, 0x63, 0x6E, 0x5A, 0x6C, 0x63, 0x69, 0x42, 0x53, 0x62, 0x32, 0x39, 0x30, + 0x49, 0x46, 0x4A, 0x54, 0x0A, 0x51, 0x53, 0x42, 0x48, 0x4D, 0x54, 0x43, 0x43, 0x41, 0x69, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x67, 0x49, + 0x50, 0x41, 0x44, 0x43, 0x43, 0x41, 0x67, 0x6F, 0x43, 0x67, 0x67, 0x49, 0x42, 0x41, 0x4B, 0x71, 0x75, 0x39, 0x4B, 0x75, 0x43, 0x7A, 0x2F, 0x76, 0x6C, 0x4E, 0x77, 0x76, 0x6E, 0x31, 0x5A, 0x61, 0x74, 0x6B, 0x4F, 0x68, 0x4C, 0x4B, 0x64, 0x78, + 0x56, 0x0A, 0x59, 0x4F, 0x50, 0x4D, 0x76, 0x4C, 0x4F, 0x38, 0x4C, 0x5A, 0x4B, 0x35, 0x35, 0x4B, 0x4E, 0x36, 0x38, 0x59, 0x47, 0x30, 0x6E, 0x6E, 0x4A, 0x79, 0x51, 0x39, 0x38, 0x2F, 0x71, 0x77, 0x73, 0x6D, 0x74, 0x4F, 0x35, 0x37, 0x47, 0x6D, + 0x6E, 0x37, 0x4B, 0x4E, 0x42, 0x79, 0x58, 0x45, 0x70, 0x74, 0x61, 0x5A, 0x6E, 0x77, 0x59, 0x78, 0x34, 0x4D, 0x30, 0x72, 0x48, 0x2F, 0x31, 0x6F, 0x77, 0x30, 0x30, 0x4F, 0x37, 0x62, 0x72, 0x45, 0x69, 0x35, 0x36, 0x72, 0x41, 0x55, 0x0A, 0x6A, + 0x74, 0x67, 0x48, 0x71, 0x53, 0x53, 0x59, 0x33, 0x65, 0x6B, 0x4A, 0x76, 0x71, 0x67, 0x69, 0x47, 0x31, 0x6B, 0x35, 0x30, 0x53, 0x65, 0x48, 0x33, 0x42, 0x7A, 0x4E, 0x2B, 0x50, 0x75, 0x7A, 0x36, 0x2B, 0x6D, 0x54, 0x65, 0x4F, 0x30, 0x50, 0x7A, + 0x6A, 0x64, 0x38, 0x4A, 0x6E, 0x64, 0x75, 0x6F, 0x64, 0x67, 0x73, 0x49, 0x55, 0x7A, 0x6B, 0x69, 0x6B, 0x2F, 0x48, 0x45, 0x7A, 0x78, 0x75, 0x78, 0x39, 0x55, 0x54, 0x6C, 0x37, 0x4B, 0x6F, 0x32, 0x79, 0x52, 0x70, 0x0A, 0x67, 0x31, 0x62, 0x54, + 0x61, 0x63, 0x75, 0x43, 0x45, 0x72, 0x75, 0x64, 0x47, 0x2F, 0x4C, 0x34, 0x4E, 0x50, 0x4B, 0x59, 0x4B, 0x79, 0x71, 0x4F, 0x42, 0x47, 0x66, 0x32, 0x34, 0x34, 0x65, 0x68, 0x48, 0x61, 0x31, 0x75, 0x7A, 0x6A, 0x5A, 0x30, 0x44, 0x6C, 0x34, 0x7A, + 0x4F, 0x38, 0x76, 0x62, 0x55, 0x5A, 0x65, 0x55, 0x61, 0x70, 0x55, 0x38, 0x7A, 0x68, 0x68, 0x61, 0x62, 0x6B, 0x76, 0x47, 0x2F, 0x41, 0x65, 0x50, 0x4C, 0x68, 0x71, 0x35, 0x53, 0x76, 0x64, 0x6B, 0x0A, 0x4E, 0x43, 0x6E, 0x63, 0x70, 0x6F, 0x31, + 0x51, 0x34, 0x59, 0x32, 0x4C, 0x53, 0x2B, 0x56, 0x49, 0x47, 0x32, 0x34, 0x75, 0x67, 0x42, 0x41, 0x2F, 0x35, 0x4A, 0x38, 0x62, 0x5A, 0x54, 0x38, 0x52, 0x74, 0x4F, 0x70, 0x58, 0x61, 0x5A, 0x2B, 0x30, 0x41, 0x4F, 0x75, 0x46, 0x4A, 0x4A, 0x6B, + 0x6B, 0x39, 0x53, 0x47, 0x64, 0x6C, 0x36, 0x72, 0x37, 0x4E, 0x48, 0x38, 0x43, 0x61, 0x78, 0x57, 0x51, 0x72, 0x62, 0x75, 0x65, 0x57, 0x68, 0x6C, 0x2F, 0x70, 0x49, 0x7A, 0x59, 0x0A, 0x2B, 0x6D, 0x30, 0x6F, 0x2F, 0x44, 0x6A, 0x48, 0x34, 0x30, + 0x79, 0x74, 0x61, 0x73, 0x37, 0x5A, 0x54, 0x70, 0x4F, 0x53, 0x6A, 0x73, 0x77, 0x4D, 0x5A, 0x37, 0x38, 0x4C, 0x53, 0x35, 0x62, 0x4F, 0x5A, 0x6D, 0x64, 0x54, 0x61, 0x4D, 0x73, 0x58, 0x45, 0x59, 0x35, 0x5A, 0x39, 0x36, 0x79, 0x63, 0x47, 0x37, + 0x6D, 0x4F, 0x61, 0x45, 0x53, 0x33, 0x47, 0x4B, 0x2F, 0x6D, 0x35, 0x51, 0x39, 0x6C, 0x33, 0x4A, 0x55, 0x4A, 0x73, 0x4A, 0x4D, 0x53, 0x74, 0x52, 0x38, 0x2B, 0x0A, 0x6C, 0x4B, 0x58, 0x48, 0x69, 0x48, 0x55, 0x68, 0x73, 0x64, 0x34, 0x4A, 0x4A, + 0x43, 0x70, 0x4D, 0x34, 0x72, 0x7A, 0x73, 0x54, 0x47, 0x64, 0x48, 0x77, 0x69, 0x6D, 0x49, 0x75, 0x51, 0x71, 0x36, 0x2B, 0x63, 0x46, 0x30, 0x7A, 0x6F, 0x77, 0x59, 0x4A, 0x6D, 0x58, 0x61, 0x39, 0x32, 0x2F, 0x47, 0x6A, 0x48, 0x74, 0x6F, 0x58, + 0x41, 0x76, 0x75, 0x59, 0x38, 0x42, 0x65, 0x53, 0x2F, 0x46, 0x4F, 0x7A, 0x4A, 0x38, 0x76, 0x44, 0x2B, 0x48, 0x6F, 0x6D, 0x6E, 0x71, 0x54, 0x0A, 0x38, 0x65, 0x44, 0x49, 0x32, 0x37, 0x38, 0x6E, 0x35, 0x6D, 0x55, 0x70, 0x65, 0x7A, 0x62, 0x67, + 0x4D, 0x78, 0x56, 0x7A, 0x38, 0x70, 0x31, 0x72, 0x68, 0x41, 0x68, 0x6F, 0x4B, 0x7A, 0x59, 0x48, 0x4B, 0x79, 0x66, 0x4D, 0x65, 0x4E, 0x68, 0x71, 0x68, 0x77, 0x35, 0x48, 0x64, 0x50, 0x53, 0x71, 0x6F, 0x42, 0x4E, 0x64, 0x5A, 0x48, 0x37, 0x30, + 0x32, 0x78, 0x53, 0x75, 0x2B, 0x7A, 0x72, 0x6B, 0x4C, 0x38, 0x46, 0x6C, 0x34, 0x37, 0x6C, 0x36, 0x51, 0x47, 0x7A, 0x77, 0x0A, 0x42, 0x72, 0x64, 0x37, 0x4B, 0x4A, 0x76, 0x58, 0x34, 0x56, 0x38, 0x34, 0x63, 0x35, 0x53, 0x73, 0x32, 0x58, 0x43, + 0x54, 0x4C, 0x64, 0x79, 0x45, 0x72, 0x30, 0x59, 0x63, 0x6F, 0x6E, 0x6F, 0x73, 0x50, 0x34, 0x45, 0x6D, 0x51, 0x75, 0x66, 0x55, 0x32, 0x4D, 0x56, 0x73, 0x68, 0x47, 0x59, 0x52, 0x69, 0x33, 0x64, 0x72, 0x56, 0x42, 0x79, 0x6A, 0x74, 0x64, 0x67, + 0x51, 0x38, 0x4B, 0x34, 0x70, 0x39, 0x32, 0x63, 0x49, 0x69, 0x42, 0x64, 0x63, 0x75, 0x4A, 0x64, 0x35, 0x0A, 0x7A, 0x2B, 0x6F, 0x72, 0x4B, 0x75, 0x35, 0x59, 0x4D, 0x2B, 0x56, 0x74, 0x36, 0x53, 0x6D, 0x71, 0x5A, 0x51, 0x45, 0x4E, 0x67, 0x68, + 0x50, 0x73, 0x4A, 0x51, 0x74, 0x64, 0x4C, 0x45, 0x42, 0x79, 0x46, 0x53, 0x6E, 0x54, 0x6B, 0x43, 0x7A, 0x33, 0x47, 0x6B, 0x50, 0x56, 0x61, 0x76, 0x42, 0x70, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, + 0x38, 0x47, 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x46, 0x0A, 0x4D, 0x41, 0x4D, 0x42, 0x41, 0x66, 0x38, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6A, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6F, 0x41, 0x55, 0x38, + 0x73, 0x6E, 0x42, 0x44, 0x77, 0x31, 0x6A, 0x41, 0x4C, 0x76, 0x73, 0x52, 0x51, 0x35, 0x4B, 0x48, 0x37, 0x57, 0x78, 0x73, 0x7A, 0x62, 0x4E, 0x44, 0x6F, 0x30, 0x77, 0x48, 0x51, 0x59, 0x44, 0x56, 0x52, 0x30, 0x4F, 0x42, 0x42, 0x59, 0x45, 0x46, + 0x50, 0x4C, 0x4A, 0x77, 0x51, 0x38, 0x4E, 0x59, 0x77, 0x43, 0x37, 0x0A, 0x37, 0x45, 0x55, 0x4F, 0x53, 0x68, 0x2B, 0x31, 0x73, 0x62, 0x4D, 0x32, 0x7A, 0x51, 0x36, 0x4E, 0x4D, 0x41, 0x34, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, + 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x42, 0x68, 0x6A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x77, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x67, 0x45, 0x41, 0x4E, 0x47, 0x64, 0x35, + 0x73, 0x6A, 0x72, 0x47, 0x35, 0x54, 0x33, 0x33, 0x0A, 0x49, 0x33, 0x4B, 0x35, 0x43, 0x65, 0x2B, 0x53, 0x72, 0x53, 0x63, 0x66, 0x6F, 0x45, 0x34, 0x4B, 0x73, 0x76, 0x58, 0x61, 0x46, 0x77, 0x79, 0x69, 0x68, 0x64, 0x4A, 0x2B, 0x6B, 0x6C, 0x48, + 0x39, 0x46, 0x57, 0x58, 0x58, 0x58, 0x47, 0x74, 0x6B, 0x46, 0x75, 0x36, 0x4B, 0x52, 0x63, 0x6F, 0x4D, 0x51, 0x7A, 0x5A, 0x45, 0x4E, 0x64, 0x6C, 0x2F, 0x2F, 0x6E, 0x6B, 0x36, 0x48, 0x4F, 0x6A, 0x47, 0x35, 0x44, 0x31, 0x72, 0x64, 0x39, 0x51, + 0x68, 0x45, 0x4F, 0x50, 0x32, 0x0A, 0x38, 0x79, 0x42, 0x4F, 0x71, 0x62, 0x36, 0x4A, 0x38, 0x78, 0x79, 0x63, 0x71, 0x64, 0x2B, 0x38, 0x4D, 0x44, 0x6F, 0x58, 0x30, 0x54, 0x4A, 0x44, 0x30, 0x4B, 0x71, 0x4B, 0x63, 0x68, 0x78, 0x52, 0x4B, 0x45, + 0x7A, 0x64, 0x4E, 0x73, 0x6A, 0x6B, 0x4C, 0x57, 0x64, 0x39, 0x6B, 0x59, 0x63, 0x63, 0x6E, 0x62, 0x7A, 0x38, 0x71, 0x79, 0x69, 0x57, 0x58, 0x6D, 0x46, 0x63, 0x75, 0x43, 0x49, 0x7A, 0x47, 0x45, 0x67, 0x57, 0x55, 0x4F, 0x72, 0x4B, 0x4C, 0x2B, + 0x6D, 0x6C, 0x0A, 0x53, 0x64, 0x78, 0x2F, 0x50, 0x4B, 0x51, 0x5A, 0x76, 0x44, 0x61, 0x74, 0x6B, 0x75, 0x4B, 0x35, 0x39, 0x45, 0x76, 0x56, 0x36, 0x77, 0x69, 0x74, 0x35, 0x33, 0x6A, 0x2B, 0x46, 0x38, 0x42, 0x64, 0x68, 0x33, 0x66, 0x6F, 0x5A, + 0x33, 0x64, 0x50, 0x41, 0x47, 0x61, 0x76, 0x39, 0x4C, 0x45, 0x44, 0x4F, 0x72, 0x34, 0x53, 0x66, 0x45, 0x45, 0x31, 0x35, 0x66, 0x53, 0x6D, 0x47, 0x30, 0x65, 0x4C, 0x79, 0x33, 0x6E, 0x33, 0x31, 0x72, 0x38, 0x58, 0x62, 0x6B, 0x35, 0x6C, 0x0A, + 0x38, 0x50, 0x6A, 0x61, 0x56, 0x38, 0x47, 0x55, 0x67, 0x65, 0x56, 0x36, 0x56, 0x67, 0x32, 0x37, 0x52, 0x6E, 0x39, 0x76, 0x6B, 0x66, 0x31, 0x39, 0x35, 0x68, 0x66, 0x6B, 0x67, 0x53, 0x65, 0x37, 0x42, 0x59, 0x68, 0x57, 0x33, 0x53, 0x43, 0x6C, + 0x39, 0x35, 0x67, 0x74, 0x6B, 0x52, 0x6C, 0x70, 0x4D, 0x56, 0x2B, 0x62, 0x4D, 0x50, 0x4B, 0x5A, 0x72, 0x58, 0x4A, 0x41, 0x6C, 0x73, 0x7A, 0x59, 0x64, 0x32, 0x61, 0x62, 0x74, 0x4E, 0x55, 0x4F, 0x73, 0x68, 0x44, 0x2B, 0x0A, 0x46, 0x4B, 0x72, + 0x44, 0x67, 0x48, 0x47, 0x64, 0x50, 0x59, 0x33, 0x6F, 0x66, 0x52, 0x52, 0x73, 0x59, 0x57, 0x53, 0x47, 0x52, 0x71, 0x62, 0x58, 0x56, 0x4D, 0x57, 0x32, 0x31, 0x35, 0x41, 0x57, 0x52, 0x71, 0x57, 0x46, 0x79, 0x70, 0x34, 0x36, 0x34, 0x2B, 0x59, + 0x54, 0x46, 0x72, 0x59, 0x56, 0x49, 0x38, 0x79, 0x70, 0x4B, 0x56, 0x4C, 0x39, 0x41, 0x4D, 0x62, 0x32, 0x6B, 0x49, 0x35, 0x57, 0x6A, 0x34, 0x6B, 0x49, 0x33, 0x5A, 0x61, 0x71, 0x35, 0x74, 0x4E, 0x71, 0x0A, 0x71, 0x59, 0x59, 0x31, 0x39, 0x74, + 0x56, 0x46, 0x65, 0x45, 0x4A, 0x4B, 0x52, 0x76, 0x77, 0x44, 0x79, 0x46, 0x37, 0x59, 0x5A, 0x76, 0x5A, 0x46, 0x5A, 0x53, 0x53, 0x30, 0x76, 0x6F, 0x64, 0x37, 0x56, 0x53, 0x43, 0x64, 0x39, 0x35, 0x32, 0x31, 0x4B, 0x76, 0x79, 0x35, 0x59, 0x68, + 0x6E, 0x4C, 0x62, 0x44, 0x75, 0x76, 0x30, 0x32, 0x30, 0x34, 0x62, 0x4B, 0x74, 0x37, 0x70, 0x68, 0x36, 0x4E, 0x2F, 0x4F, 0x6D, 0x65, 0x2F, 0x6D, 0x73, 0x56, 0x75, 0x64, 0x75, 0x43, 0x0A, 0x6D, 0x73, 0x75, 0x59, 0x33, 0x33, 0x4F, 0x68, 0x6B, + 0x4B, 0x43, 0x67, 0x78, 0x65, 0x44, 0x6F, 0x41, 0x61, 0x69, 0x6A, 0x46, 0x4A, 0x7A, 0x49, 0x77, 0x5A, 0x71, 0x73, 0x46, 0x56, 0x41, 0x7A, 0x6A, 0x65, 0x31, 0x38, 0x4B, 0x6F, 0x74, 0x7A, 0x6C, 0x55, 0x42, 0x44, 0x4A, 0x76, 0x79, 0x42, 0x70, + 0x43, 0x70, 0x66, 0x4F, 0x5A, 0x43, 0x33, 0x4A, 0x38, 0x74, 0x52, 0x64, 0x2F, 0x69, 0x57, 0x6B, 0x78, 0x37, 0x50, 0x38, 0x6E, 0x64, 0x39, 0x48, 0x30, 0x61, 0x54, 0x0A, 0x6F, 0x6C, 0x6B, 0x65, 0x6C, 0x55, 0x54, 0x46, 0x4C, 0x58, 0x56, 0x6B, + 0x73, 0x4E, 0x62, 0x35, 0x34, 0x44, 0x78, 0x70, 0x36, 0x67, 0x53, 0x31, 0x48, 0x41, 0x76, 0x69, 0x52, 0x6B, 0x52, 0x4E, 0x51, 0x7A, 0x75, 0x58, 0x53, 0x58, 0x45, 0x52, 0x76, 0x53, 0x53, 0x32, 0x77, 0x71, 0x31, 0x79, 0x56, 0x41, 0x62, 0x2B, + 0x61, 0x78, 0x6A, 0x35, 0x64, 0x39, 0x73, 0x70, 0x4C, 0x46, 0x4B, 0x65, 0x62, 0x58, 0x64, 0x37, 0x59, 0x76, 0x30, 0x50, 0x54, 0x59, 0x36, 0x59, 0x0A, 0x4D, 0x6A, 0x41, 0x77, 0x63, 0x52, 0x4C, 0x57, 0x4A, 0x54, 0x58, 0x6A, 0x6E, 0x2F, 0x68, + 0x76, 0x6E, 0x4C, 0x58, 0x72, 0x61, 0x68, 0x75, 0x74, 0x36, 0x68, 0x44, 0x54, 0x6C, 0x68, 0x5A, 0x79, 0x42, 0x69, 0x45, 0x6C, 0x78, 0x6B, 0x79, 0x38, 0x6A, 0x33, 0x43, 0x37, 0x44, 0x4F, 0x52, 0x65, 0x49, 0x6F, 0x4D, 0x74, 0x30, 0x72, 0x37, + 0x2B, 0x68, 0x56, 0x75, 0x30, 0x35, 0x4C, 0x30, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x00 +}; +const size_t _accacert_len = sizeof(_accacert); +/*************************** End of file ****************************/ diff --git a/src/frontend/qt_sdl/CMakeLists.txt b/src/frontend/qt_sdl/CMakeLists.txt index 31207f8695..157759a858 100644 --- a/src/frontend/qt_sdl/CMakeLists.txt +++ b/src/frontend/qt_sdl/CMakeLists.txt @@ -62,6 +62,22 @@ set(SOURCES_QT_SDL NetplayDialog.cpp ) +if (ENABLE_RETROACHIEVEMENTS) + list(APPEND SOURCES_QT_SDL + toast/ToastManager.cpp + toast/ToastManager.h + toast/AchievementToast.cpp + toast/AchievementToast.h + toast/ToastOverlay.cpp + toast/ToastOverlay.h + toast/BadgeCache.h + toast/BadgeCache.cpp + retroachievements/resources/ra.qrc + RASettingsDialog.cpp + ) + add_compile_definitions(RETROACHIEVEMENTS_ENABLED) +endif() + option(USE_QT6 "Use Qt 6 instead of Qt 5" ON) if (USE_QT6) diff --git a/src/frontend/qt_sdl/Config.cpp b/src/frontend/qt_sdl/Config.cpp index f767fcc92d..0b73fef0f4 100644 --- a/src/frontend/qt_sdl/Config.cpp +++ b/src/frontend/qt_sdl/Config.cpp @@ -103,6 +103,10 @@ DefaultList DefaultBools = {"Emu.DirectBoot", true}, {"Instance*.DS.Battery.LevelOkay", true}, {"Instance*.DSi.Battery.Charging", true}, +#ifdef RETROACHIEVEMENTS_ENABLED + {"Instance*.RetroAchievements.Enabled", false}, + {"Instance*.RetroAchievements.HardcoreMode", false}, +#endif #ifdef JIT_ENABLED {"JIT.BranchOptimisations", true}, {"JIT.LiteralOptimisations", true}, @@ -117,6 +121,11 @@ DefaultList DefaultStrings = { {"DLDI.ImagePath", "dldi.bin"}, {"DSi.SD.ImagePath", "dsisd.bin"}, + #ifdef RETROACHIEVEMENTS_ENABLED + {"Instance*.RetroAchievements.Username", ""}, + {"Instance*.RetroAchievements.Password", ""}, + {"Instance*.RetroAchievements.Token", ""}, + #endif {"Instance*.Firmware.Username", "melonDS"} }; diff --git a/src/frontend/qt_sdl/Config.h b/src/frontend/qt_sdl/Config.h index d83463f343..61a4e03996 100644 --- a/src/frontend/qt_sdl/Config.h +++ b/src/frontend/qt_sdl/Config.h @@ -92,6 +92,13 @@ class Table Table(toml::value& data, const std::string& path); ~Table() {} + #ifdef RETROACHIEVEMENTS_ENABLED + bool RA_Enabled = false; + bool RA_HardcoreMode = false; + std::string RA_Username; + std::string RA_Password; + #endif + Table& operator=(const Table& b); Array GetArray(const std::string& path); diff --git a/src/frontend/qt_sdl/EmuInstance.cpp b/src/frontend/qt_sdl/EmuInstance.cpp index d6d662fa93..52e99b0734 100755 --- a/src/frontend/qt_sdl/EmuInstance.cpp +++ b/src/frontend/qt_sdl/EmuInstance.cpp @@ -48,6 +48,10 @@ #include "FreeBIOS.h" #include "main.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "../../RetroAchievements/RAClient.h" +#endif + using std::make_unique; using std::pair; using std::string; @@ -136,6 +140,10 @@ EmuInstance::EmuInstance(int inst) : deleting(false), for (int i = 0; i < kMaxWindows; i++) windowList[i] = nullptr; + #ifdef RETROACHIEVEMENTS_ENABLED + ra = std::make_unique(); + #endif + if (inst == 0) topWindow = nullptr; createWindow(); @@ -158,6 +166,10 @@ EmuInstance::~EmuInstance() emuThread->emuExit(); emuThread->wait(); + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = getRA(); + ra->Shutdown(); + #endif delete emuThread; net.UnregisterInstance(instanceID); @@ -222,6 +234,12 @@ void EmuInstance::createWindow(int id) { win->actNewWindow->setEnabled(enable); }); + if (id == 0) + { + #ifdef RETROACHIEVEMENTS_ENABLED + SyncRetroAchievementsFromConfig(); + #endif + } } void EmuInstance::deleteWindow(int id, bool close) @@ -1369,6 +1387,13 @@ bool EmuInstance::updateConsole() noexcept else nds = new NDS(std::move(ndsargs), this); + #ifdef RETROACHIEVEMENTS_ENABLED + if (ra) + { + nds->SetRAContext(ra.get()); + } + #endif + nds->Reset(); loadRTCData(); //emuThread->updateVideoRenderer(); // not actually needed? @@ -2273,3 +2298,27 @@ void EmuInstance::animatedROMIcon(const u8 (&data)[8][512], const u16 (&palette) animatedSequenceRef.push_back(i); } } +#ifdef RETROACHIEVEMENTS_ENABLED + +void EmuInstance::SyncRetroAchievementsFromConfig() +{ + auto& cfg = getLocalConfig(); + + if (!ra) + return; + + if (!cfg.GetBool("RetroAchievements.Enabled")) + { + ra->Disable(); + return; + } + + ra->SetCredentials( + cfg.GetString("RetroAchievements.Username").c_str(), + cfg.GetString("RetroAchievements.Password").c_str(), + cfg.GetBool("RetroAchievements.HardcoreMode") + ); + + ra->Enable(); +} +#endif \ No newline at end of file diff --git a/src/frontend/qt_sdl/EmuInstance.h b/src/frontend/qt_sdl/EmuInstance.h index f143496573..6b8325a1c0 100755 --- a/src/frontend/qt_sdl/EmuInstance.h +++ b/src/frontend/qt_sdl/EmuInstance.h @@ -29,6 +29,10 @@ #include "Config.h" #include "SaveManager.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "../../RetroAchievements/RAClient.h" +#endif + const int kMaxWindows = 4; enum @@ -83,6 +87,11 @@ int getEventKeyVal(QKeyEvent* event); class EmuInstance { public: + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* getRA() const { return ra.get(); } + std::unique_ptr ra; + void SyncRetroAchievementsFromConfig(); + #endif EmuInstance(int inst); ~EmuInstance(); diff --git a/src/frontend/qt_sdl/EmuThread.cpp b/src/frontend/qt_sdl/EmuThread.cpp index e754d982aa..77ae458e25 100755 --- a/src/frontend/qt_sdl/EmuThread.cpp +++ b/src/frontend/qt_sdl/EmuThread.cpp @@ -52,6 +52,10 @@ #include "GPU3D_OpenGL.h" #include "GPU3D_Compute.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "../../RetroAchievements/RAClient.h" +#endif + #include "Savestate.h" #include "EmuInstance.h" @@ -341,12 +345,34 @@ void EmuThread::run() winUpdateCount = 0; } + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) { + if (emuInstance->hotkeyPressed(HK_FastForwardToggle) || emuInstance->hotkeyPressed(HK_FastForward)) { + emuInstance->osdAddMessage(0xFFA0A0, "HARDCORE: Fast Forward is blocked!"); + } + if (emuInstance->hotkeyPressed(HK_SlowMoToggle) || emuInstance->hotkeyPressed(HK_SlowMo)) { + emuInstance->osdAddMessage(0xFFA0A0, "HARDCORE: Slow-mo is blocked!"); + } + } + #endif + if (emuInstance->hotkeyPressed(HK_FastForwardToggle)) emuInstance->fastForwardToggled = !emuInstance->fastForwardToggled; if (emuInstance->hotkeyPressed(HK_SlowMoToggle)) emuInstance->slowmoToggled = !emuInstance->slowmoToggled; bool enablefastforward = emuInstance->hotkeyDown(HK_FastForward) | emuInstance->fastForwardToggled; bool enableslowmo = emuInstance->hotkeyDown(HK_SlowMo) | emuInstance->slowmoToggled; + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) { + enablefastforward = false; + enableslowmo = false; + emuInstance->fastForwardToggled = false; + emuInstance->slowmoToggled = false; + } + #endif + if (useOpenGL) { // when using OpenGL: when toggling fast-forward or slowmo, change the vsync interval @@ -625,19 +651,51 @@ void EmuThread::handleMessages() break; case msg_SaveState: + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) + { + emuInstance->osdAddMessage(0xFFA0A0, "Hardcore: Save states are disabled"); + break; + } + #endif msgResult = emuInstance->saveState(msg.param.value().toStdString()); break; case msg_LoadState: + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) + { + emuInstance->osdAddMessage(0xFFA0A0, "Hardcore: Load states are disabled"); + break; + } + #endif msgResult = emuInstance->loadState(msg.param.value().toStdString()); break; case msg_UndoStateLoad: + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) + { + emuInstance->osdAddMessage(0xFFA0A0, "Hardcore: Undo load is disabled"); + break; + } + #endif emuInstance->undoStateLoad(); msgResult = 1; break; case msg_ImportSavefile: + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) + { + emuInstance->osdAddMessage(0xFFA0A0, "Hardcore: Importing savefiles is disabled"); + break; + } + #endif { msgResult = 0; auto f = Platform::OpenFile(msg.param.value().toStdString(), Platform::FileMode::Read); @@ -658,6 +716,14 @@ void EmuThread::handleMessages() break; case msg_EnableCheats: + #ifdef RETROACHIEVEMENTS_ENABLED + if (Config::GetGlobalTable().GetBool("RetroAchievements.Enabled") && + Config::GetGlobalTable().GetBool("RetroAchievements.HardcoreMode")) + { + emuInstance->osdAddMessage(0xFFA0A0, "HARDCORE: Cheats are forbidden!"); + break; + } + #endif emuInstance->enableCheats(msg.param.value()); break; } @@ -712,6 +778,26 @@ void EmuThread::emuRun() void EmuThread::emuPause(bool broadcast) { +#ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + if (ra && ra->IsHardcoreEnabled()) + { + uint32_t frames_left = 0; + if (!ra->CanPause(&frames_left)) + { + if (frames_left > 0) + { + float seconds = frames_left / 60.0f; + emuInstance->osdAddMessage( + 0xFFA0A0, + "Hardcore: Wait %.1f seconds to pause", + seconds + ); + } + return; + } + } +#endif sendMessage(msg_EmuPause); waitMessage(); @@ -750,6 +836,14 @@ void EmuThread::emuExit() void EmuThread::emuFrameStep() { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + if (ra->IsHardcoreEnabled()) + { + emuInstance->osdAddMessage(0xFFA0A0, "Frame step is disabled in Hardcore Mode"); + return; + } + #endif if (emuPauseStack < emuPauseStackPauseThreshold) sendMessage(msg_EmuPause); sendMessage(msg_EmuFrameStep); diff --git a/src/frontend/qt_sdl/RASettingsDialog.cpp b/src/frontend/qt_sdl/RASettingsDialog.cpp new file mode 100644 index 0000000000..43903b604a --- /dev/null +++ b/src/frontend/qt_sdl/RASettingsDialog.cpp @@ -0,0 +1,197 @@ +#include "RASettingsDialog.h" +#include "ui_RASettingsDialog.h" + +#include "Config.h" +#include "main.h" +#include "RetroAchievements/RAClient.h" + +#include +#include +#include +#include +#include + +bool RASettingsDialog::needsReset = false; +RASettingsDialog::RASettingsDialog(EmuInstance* inst, QWidget* parent) + : QDialog(parent) + , ui(new Ui::RASettingsDialog) + , emuInstance(inst) +{ + ui->setupUi(this); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &RASettingsDialog::accept); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &RASettingsDialog::reject); + + setAttribute(Qt::WA_DeleteOnClose); + + auto& instcfg = emuInstance->getLocalConfig(); + ui->cbRAEnabled->setChecked(instcfg.GetBool("RetroAchievements.Enabled")); + ui->cbRAHardcore->setChecked(instcfg.GetBool("RetroAchievements.HardcoreMode")); + ui->leRAUsername->setText(QString::fromStdString(instcfg.GetString("RetroAchievements.Username"))); + ui->leRAPassword->setText(QString::fromStdString(instcfg.GetString("RetroAchievements.Password"))); + + auto UpdateRAUI = [this]() { + RAContext* ra = emuInstance->getRA(); + if (!ra) return; + + bool loggedIn = ra->IsLoggedIn(); + bool emuRunning = emuInstance->emuIsActive(); + + ui->cbRAEnabled->setEnabled(!loggedIn); + ui->cbRAHardcore->setEnabled(!loggedIn); + ui->leRAUsername->setEnabled(!loggedIn); + ui->leRAPassword->setEnabled(!loggedIn); + ui->btnRALogin->setEnabled(!emuRunning); + + if (emuRunning) { + ui->btnRALogin->setToolTip( + "Stop the emulation before logging in or out of RetroAchievements." + ); + } else { + ui->btnRALogin->setToolTip(QString()); + } + + if (loggedIn) { + ui->btnRALogin->setText("Logout"); + + const rc_client_user_t* user = rc_client_get_user_info(ra->client); + if (user && user->display_name) + ui->lblRAStatus->setText(QString("Logged in as: %1").arg(user->display_name)); + else + ui->lblRAStatus->setText("Logged in"); + + ui->lblRAStatus->setStyleSheet("font-weight: bold; color: #2ecc71;"); + } else { + ui->btnRALogin->setText("Login Now"); + ui->lblRAStatus->setText("Not logged in"); + ui->lblRAStatus->setStyleSheet("color: gray;"); + } + }; + + UpdateRAUI(); + + connect(ui->btnRALogin, &QPushButton::clicked, this, [this, UpdateRAUI]() { + RAContext* ra = emuInstance->getRA(); + if (!ra) return; + + if (ra->IsLoggedIn()) { + ra->SetLoggedIn(false); + ra->SetToken(""); + UpdateRAUI(); + + ui->cbRAEnabled->setProperty("user_originalValue", !ui->cbRAEnabled->isChecked()); + ui->cbRAHardcore->setProperty("user_originalValue", !ui->cbRAHardcore->isChecked()); + ui->leRAUsername->setProperty("user_originalValue", ""); + ui->leRAPassword->setProperty("user_originalValue", ""); + + if (emuInstance && emuInstance->emuIsActive()) { + done(QDialog::Accepted); + } + + } else { + std::string user = ui->leRAUsername->text().toStdString(); + std::string pass = ui->leRAPassword->text().toStdString(); + if (user.empty() || pass.empty()) return; + + ra->LoginWithPassword(user.c_str(), pass.c_str(), ui->cbRAHardcore->isChecked()); + + ui->cbRAEnabled->setProperty("user_originalValue", !ui->cbRAEnabled->isChecked()); + ui->cbRAHardcore->setProperty("user_originalValue", !ui->cbRAHardcore->isChecked()); + ui->leRAUsername->setProperty("user_originalValue", ""); + ui->leRAPassword->setProperty("user_originalValue", ""); + + if (emuInstance && emuInstance->emuIsActive()) { + done(QDialog::Accepted); + } + } + }); + + RAContext* raTmp = emuInstance->getRA(); + if (raTmp) { + auto mainWin = emuInstance->getMainWindow(); + raTmp->onLoginResponse = [this, UpdateRAUI, mainWin](bool success, const std::string& msg) { + QMetaObject::invokeMethod(this, [this, UpdateRAUI, mainWin, success, msg]() { + UpdateRAUI(); + if (mainWin) { + mainWin->ShowRALoginToast(success, msg); + } + }); + }; + } + +#define SET_ORIGVAL(type, val) \ + for (type* w : findChildren(nullptr)) \ + w->setProperty("user_originalValue", w->val()); + + SET_ORIGVAL(QLineEdit, text); + SET_ORIGVAL(QCheckBox, isChecked); + +#undef SET_ORIGVAL +} + +RASettingsDialog::~RASettingsDialog() +{ + delete ui; +} + +void RASettingsDialog::done(int r) +{ + if (!emuInstance) + { + QDialog::done(r); + return; + } + + needsReset = false; + +#ifdef RETROACHIEVEMENTS_ENABLED + if (r == QDialog::Accepted) + { + bool modified = false; + +#define CHECK_ORIGVAL(type, val) \ + if (!modified) for (type* w : findChildren(nullptr)) \ + { \ + QVariant v = w->val(); \ + if (v != w->property("user_originalValue")) \ + { \ + modified = true; \ + break; \ + } \ + } + + CHECK_ORIGVAL(QLineEdit, text); + CHECK_ORIGVAL(QCheckBox, isChecked); + +#undef CHECK_ORIGVAL + + if (modified) + { + if (emuInstance->emuIsActive() + && QMessageBox::warning( + this, + "Reset necessary to apply changes", + "The emulation will be reset for the changes to take place.", + QMessageBox::Ok, + QMessageBox::Cancel) != QMessageBox::Ok) + { + return; + } + + auto& instcfg = emuInstance->getLocalConfig(); + + instcfg.SetBool("RetroAchievements.Enabled", ui->cbRAEnabled->isChecked()); + instcfg.SetBool("RetroAchievements.HardcoreMode", ui->cbRAHardcore->isChecked()); + instcfg.SetString("RetroAchievements.Username", ui->leRAUsername->text().toStdString()); + instcfg.SetString("RetroAchievements.Password", ui->leRAPassword->text().toStdString()); + + emuInstance->SyncRetroAchievementsFromConfig(); + Config::Save(); + + needsReset = true; + } + } +#endif + + QDialog::done(r); +} \ No newline at end of file diff --git a/src/frontend/qt_sdl/RASettingsDialog.h b/src/frontend/qt_sdl/RASettingsDialog.h new file mode 100644 index 0000000000..b99f14f9d8 --- /dev/null +++ b/src/frontend/qt_sdl/RASettingsDialog.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +class EmuInstance; + +namespace Ui { +class RASettingsDialog; +} + +class RASettingsDialog : public QDialog +{ + Q_OBJECT + +public: + static bool needsReset; + explicit RASettingsDialog(EmuInstance* inst, QWidget* parent = nullptr); + ~RASettingsDialog() override; + + void done(int r) override; + +private: + Ui::RASettingsDialog* ui; + + QGroupBox* groupRA; + QCheckBox* cbRAEnabled; + QCheckBox* cbRAHardcore; + QLineEdit* leRAUsername; + QLineEdit* leRAPassword; + QPushButton* btnRALogin; + QLabel* lblRAStatus; + + EmuInstance* emuInstance; +}; \ No newline at end of file diff --git a/src/frontend/qt_sdl/RASettingsDialog.ui b/src/frontend/qt_sdl/RASettingsDialog.ui new file mode 100644 index 0000000000..10cd329c1d --- /dev/null +++ b/src/frontend/qt_sdl/RASettingsDialog.ui @@ -0,0 +1,116 @@ + + + RASettingsDialog + + + + 0 + 0 + 420 + 300 + + + + RetroAchievements Settings + + + + + + + RA + + + + + + RetroAchievements Settings + + + + + + Enable RetroAchievements + + + + + + + Hardcore Mode (No Savestates) + + + + + + + Username: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + Login Now + + + + + + + Not logged in + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok|QDialogButtonBox::Cancel + + + + + + + + \ No newline at end of file diff --git a/src/frontend/qt_sdl/Window.cpp b/src/frontend/qt_sdl/Window.cpp index 9b3ab95c2d..b0785ac5fa 100755 --- a/src/frontend/qt_sdl/Window.cpp +++ b/src/frontend/qt_sdl/Window.cpp @@ -82,6 +82,12 @@ #include "Window.h" #include "AboutDialog.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RASettingsDialog.h" +#include "RetroAchievements/RAClient.h" +#include "toast/BadgeCache.h" +#endif + using namespace melonDS; @@ -234,6 +240,10 @@ MainWindow::MainWindow(int id, EmuInstance* inst, QWidget* parent) : windowCfg(localCfg.GetTable("Window"+std::to_string(id), "Window0")), emuThread(inst->getEmuThread()), enabledSaved(false), + #ifdef RETROACHIEVEMENTS_ENABLED + m_badgeCache(this), + m_toastManager(this), + #endif focused(true) { #ifndef _WIN32 @@ -640,6 +650,11 @@ MainWindow::MainWindow(int id, EmuInstance* inst, QWidget* parent) : actMPSettings = menu->addAction("Multiplayer settings"); connect(actMPSettings, &QAction::triggered, this, &MainWindow::onOpenMPSettings); + #ifdef RETROACHIEVEMENTS_ENABLED + actRASettings = menu->addAction("RA settings"); + connect(actRASettings, &QAction::triggered, this, &MainWindow::onOpenRASettings); + #endif + actWifiSettings = menu->addAction("Wifi settings"); connect(actWifiSettings, &QAction::triggered, this, &MainWindow::onOpenWifiSettings); @@ -794,6 +809,38 @@ MainWindow::MainWindow(int id, EmuInstance* inst, QWidget* parent) : #endif // __APPLE__ } + #ifdef RETROACHIEVEMENTS_ENABLED + m_oldRAEnabled = Config::GetLocalTable(emuInstance->instanceID).GetBool("Instance*.RetroAchievements.Enabled"); + m_toastManager.Init(this); + if (auto* ra = inst->getRA()) + { + ra->SetOnGameLoadedCallback([this]() { + ShowGameLoadToast(); + }); + + ra->onLoginResponse = [this](bool success, const std::string& message) { + ShowRALoginToast(success, message); + }; + + ra->SetOnAchievementUnlocked( + [this](const char* title, + const char* desc, + const char* badgeUrl) + { + QMetaObject::invokeMethod( + this, + [this, + t = QString::fromUtf8(title), + d = QString::fromUtf8(desc), + b = QString::fromUtf8(badgeUrl)]() + { + OnAchievementUnlocked(t, d, b); + }, + Qt::QueuedConnection + ); + }); + } + #endif if (emuThread->emuIsActive()) onEmuStart(); } @@ -1566,6 +1613,17 @@ void MainWindow::onEjectGBACart() void MainWindow::onSaveState() { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + auto cfg = Config::GetLocalTable(emuInstance->instanceID); + if (cfg.GetBool("Instance*.RetroAchievements.Enabled") && + cfg.GetBool("Instance*.RetroAchievements.HardcoreMode") && + ra->IsLoggedIn()) + { + emuInstance->osdAddMessage(0xFFA0A0, "Savestates states is disabled in Hardcore Mode"); + return; + } + #endif int slot = ((QAction*)sender())->data().toInt(); QString filename; @@ -1601,6 +1659,17 @@ void MainWindow::onSaveState() void MainWindow::onLoadState() { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + auto cfg = Config::GetLocalTable(emuInstance->instanceID); + if (cfg.GetBool("Instance*.RetroAchievements.Enabled") && + cfg.GetBool("Instance*.RetroAchievements.HardcoreMode") && + ra->IsLoggedIn()) + { + emuInstance->osdAddMessage(0xFFA0A0, "Savestates disabled in Hardcore Mode"); + return; + } + #endif int slot = ((QAction*)sender())->data().toInt(); QString filename; @@ -1651,6 +1720,17 @@ void MainWindow::onUndoStateLoad() void MainWindow::onImportSavefile() { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + auto cfg = Config::GetLocalTable(emuInstance->instanceID); + if (cfg.GetBool("Instance*.RetroAchievements.Enabled") && + cfg.GetBool("Instance*.RetroAchievements.HardcoreMode") && + ra->IsLoggedIn()) + { + QMessageBox::critical(this, "melonDS", "Importing savefiles is disabled in Hardcore Mode."); + return; + } + #endif QString path = QFileDialog::getOpenFileName(this, "Select savefile", globalCfg.GetQString("LastROMFolder"), @@ -1742,6 +1822,18 @@ void MainWindow::onOpenPowerManagement() void MainWindow::onEnableCheats(bool checked) { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + auto cfg = Config::GetLocalTable(emuInstance->instanceID); + if (checked && cfg.GetBool("Instance*.RetroAchievements.Enabled") && + cfg.GetBool("Instance*.RetroAchievements.HardcoreMode") && + ra->IsLoggedIn()) + { + emuInstance->osdAddMessage(0xFFA0A0, "Cheats are disabled in Hardcore Mode"); + actEnableCheats->setChecked(false); + return; + } + #endif localCfg.SetBool("EnableCheats", checked); emuThread->enableCheats(checked); @@ -1753,6 +1845,17 @@ void MainWindow::onEnableCheats(bool checked) void MainWindow::onSetupCheats() { + #ifdef RETROACHIEVEMENTS_ENABLED + RAContext* ra = emuInstance->getRA(); + auto cfg = Config::GetLocalTable(emuInstance->instanceID); + if (cfg.GetBool("Instance*.RetroAchievements.Enabled") && + cfg.GetBool("Instance*.RetroAchievements.HardcoreMode") && + ra->IsLoggedIn()) + { + emuInstance->osdAddMessage(0xFFA0A0, "Cheat menu is disabled in Hardcore Mode"); + return; + } + #endif emuThread->emuPause(); CheatsDialog* dlg = CheatsDialog::openDlg(this); @@ -1881,6 +1984,52 @@ void MainWindow::onEmuSettingsDialogFinished(int res) if (!emuThread->emuIsActive()) actTitleManager->setEnabled(!globalCfg.GetString("DSi.NANDPath").empty()); + +#ifdef RETROACHIEVEMENTS_ENABLED +if (auto* ra = emuInstance->getRA()) +{ + const bool newRAEnabled = + localCfg.GetBool("Instance*.RetroAchievements.Enabled"); + if (m_oldRAEnabled != newRAEnabled) + { + if (newRAEnabled) + { + std::string user = + localCfg.GetString("Instance*.RetroAchievements.Username"); + std::string pass = + localCfg.GetString("Instance*.RetroAchievements.Password"); + bool hardcore = + localCfg.GetBool("Instance*.RetroAchievements.Hardcore"); + + ra->SetCredentials( + user.c_str(), + pass.c_str(), + hardcore + ); + + ra->Enable(); + + m_toastManager.ShowAchievement( + "RetroAchievements", + "Enabled", + QPixmap(":/ra/icons/ra-icon.png") + ); + } + else + { + ra->Disable(); + + m_toastManager.ShowAchievement( + "RetroAchievements", + "Disabled", + QPixmap(":/ra/icons/ra-icon.png") + ); + } + + m_oldRAEnabled = newRAEnabled; + } +} +#endif emuThread->emuUnpause(); } @@ -2009,6 +2158,35 @@ void MainWindow::onMPSettingsFinished(int res) emuThread->emuUnpause(); } +#ifdef RETROACHIEVEMENTS_ENABLED +void MainWindow::onOpenRASettings() +{ + emuThread->emuPause(); + if (!emuInstance) + return; + + RASettingsDialog* dlg = new RASettingsDialog(emuInstance, this); + connect(dlg, &QDialog::finished, + this, &MainWindow::onRASettingsFinished); + + dlg->show(); +} + +void MainWindow::onRASettingsFinished(int res) +{ + if (!emuInstance) + return; + + if (res == QDialog::Accepted) + { + emuInstance->SyncRetroAchievementsFromConfig(); + } + + if (RASettingsDialog::needsReset) + onReset(); + emuThread->emuUnpause(); +} +#endif void MainWindow::onOpenWifiSettings() { @@ -2304,6 +2482,148 @@ void MainWindow::onEmuReset() actUndoStateLoad->setEnabled(false); } +#ifdef RETROACHIEVEMENTS_ENABLED +void MainWindow::OnAchievementUnlocked( + const QString& title, + const QString& desc, + const QString& badgeUrl) +{ + m_badgeCache.DownloadBadge(badgeUrl, + [this, title, desc](const QPixmap& pix) + { + m_toastManager.ShowAchievement(title, desc, pix); + }); +} + +void MainWindow::ShowRALoginToast(bool success, const std::string& message) +{ + QString title = "RetroAchievements"; + QString toastMsg; + QPixmap pixmap(":/ra/icons/ra-icon.png"); + + if (success && emuInstance) + { + RAContext* ra = emuInstance->getRA(); + const rc_client_user_t* user = + (ra && ra->client) ? rc_client_get_user_info(ra->client) : nullptr; + + if (user && user->display_name) + { + toastMsg = QString("Logged in as %1").arg(user->display_name); + + if (user->avatar_url && !QString(user->avatar_url).isEmpty()) + { + QString avatarUrl = QString::fromUtf8(user->avatar_url); + + m_badgeCache.DownloadBadge(avatarUrl, [this, title, toastMsg](const QPixmap& avatarPix) + { + QMetaObject::invokeMethod(this, [this, title, toastMsg, avatarPix]() { + m_toastManager.ShowAchievement(title, toastMsg, avatarPix); + }); + }); + + return; + } + } + else + { + toastMsg = "Logged in!"; + } + } + else + { + toastMsg = QString("Login Error: %1") + .arg(QString::fromStdString(message)); + } + + QMetaObject::invokeMethod(this, [this, title, toastMsg, pixmap]() { + m_toastManager.ShowAchievement(title, toastMsg, pixmap); + }); +} + +void MainWindow::ShowGameLoadToast() +{ + RAContext* ra = emuInstance->getRA(); + if (ra->pendingLoadFailed) + { + QString errorMsg = QString::fromStdString(ra->pendingLoadError); + + QTimer::singleShot(100, this, [this, errorMsg]() + { + QMetaObject::invokeMethod(QApplication::instance(), [this, errorMsg]() + { + m_toastManager.ShowAchievement( + "RetroAchievements", + QString("ERROR: %1").arg(errorMsg), + QPixmap(":/ra/icons/ra-icon.png") + ); + }); + }); + + return; + } + + const rc_client_game_t* game = ra->GetCurrentGameInfo(); + if (!game) + return; + + QString title = QString::fromUtf8(game->title); + QString badgeUrl = QString::fromUtf8(game->badge_url); + + int totalAchievements = 0; + int unlockedAchievements = 0; + + rc_client_achievement_list_t* achList = + rc_client_create_achievement_list( + ra->client, + RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL, + RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE); + + if (achList) + { + for (uint32_t b = 0; b < achList->num_buckets; ++b) + { + const rc_client_achievement_bucket_t* bucket = + &achList->buckets[b]; + + for (uint32_t i = 0; i < bucket->num_achievements; ++i) + { + const rc_client_achievement_t* ach = + bucket->achievements[i]; + + ++totalAchievements; + + if (ach && ach->unlocked) + ++unlockedAchievements; + } + } + + rc_client_destroy_achievement_list(achList); + } + + //stupid function to subtract 1 from achiv because they are showing up incorectly + if (totalAchievements > 0) totalAchievements -= 1; + if (unlockedAchievements > 0) unlockedAchievements -= 1; + + QString desc = QString("Game loaded! (%1/%2 Achievements)") + .arg(unlockedAchievements) + .arg(totalAchievements); + + QTimer::singleShot(100, this, [this, title, desc, badgeUrl]() + { + m_badgeCache.DownloadBadge(badgeUrl, + [this, title, desc](const QPixmap& pix) + { + QMetaObject::invokeMethod( + QApplication::instance(), + [this, title, desc, pix]() + { + m_toastManager.ShowAchievement(title, desc, pix); + }); + }); + }); +} +#endif void MainWindow::onUpdateVideoSettings(bool glchange) { if (!emuInstance) return; diff --git a/src/frontend/qt_sdl/Window.h b/src/frontend/qt_sdl/Window.h index 678be7c9e9..525cdcad3c 100755 --- a/src/frontend/qt_sdl/Window.h +++ b/src/frontend/qt_sdl/Window.h @@ -37,6 +37,12 @@ #include "Config.h" #include "MPInterface.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "../../RetroAchievements/RAClient.h" +#include "toast/ToastManager.h" +#include "toast/BadgeCache.h" +#endif + class EmuInstance; class EmuThread; @@ -105,6 +111,16 @@ class MainWindow : public QMainWindow Q_OBJECT public: + #ifdef RETROACHIEVEMENTS_ENABLED + ToastManager m_toastManager; + BadgeCache m_badgeCache; + void ShowRALoginToast(bool success, const std::string& message); + bool m_oldRAEnabled; + void showRALoginToast(); + void ShowGameLoadToast(); + void OnAchievementUnlocked(const QString& title, const QString& desc, const QString& badgeUrl); + #endif + explicit MainWindow(int id, EmuInstance* inst, QWidget* parent = nullptr); ~MainWindow(); @@ -205,6 +221,10 @@ private slots: void onAudioSettingsFinished(int res); void onOpenMPSettings(); void onMPSettingsFinished(int res); + #ifdef RETROACHIEVEMENTS_ENABLED + void onOpenRASettings(); + void onRASettingsFinished(int res); + #endif void onOpenWifiSettings(); void onWifiSettingsFinished(int res); void onOpenFirmwareSettings(); @@ -326,6 +346,9 @@ private slots: QAction* actCameraSettings; QAction* actAudioSettings; QAction* actMPSettings; + #ifdef RETROACHIEVEMENTS_ENABLED + QAction* actRASettings; + #endif QAction* actWifiSettings; QAction* actFirmwareSettings; QAction* actPathSettings; diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index ad6eca91f8..bfbb874e7a 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -65,6 +65,10 @@ #include "Net_PCap.h" #include "Net_Slirp.h" +#ifdef RETROACHIEVEMENTS_ENABLED +#include "RetroAchievements/RAClient.h" +#endif + using namespace melonDS; QString* systemThemeName; @@ -366,6 +370,13 @@ int main(int argc, char** argv) createEmuInstance(); + #ifdef RETROACHIEVEMENTS_ENABLED + if (emuInstances[0]) + { + emuInstances[0]->SyncRetroAchievementsFromConfig(); + } + #endif + { MainWindow* win = emuInstances[0]->getMainWindow(); bool memberSyntaxUsed = false; diff --git a/src/frontend/qt_sdl/retroachievements/resources/icons/placeholder.png b/src/frontend/qt_sdl/retroachievements/resources/icons/placeholder.png new file mode 100644 index 0000000000..064082d2c8 Binary files /dev/null and b/src/frontend/qt_sdl/retroachievements/resources/icons/placeholder.png differ diff --git a/src/frontend/qt_sdl/retroachievements/resources/icons/ra-icon.png b/src/frontend/qt_sdl/retroachievements/resources/icons/ra-icon.png new file mode 100644 index 0000000000..911ffcd891 Binary files /dev/null and b/src/frontend/qt_sdl/retroachievements/resources/icons/ra-icon.png differ diff --git a/src/frontend/qt_sdl/retroachievements/resources/ra.qrc b/src/frontend/qt_sdl/retroachievements/resources/ra.qrc new file mode 100644 index 0000000000..e73c32fa23 --- /dev/null +++ b/src/frontend/qt_sdl/retroachievements/resources/ra.qrc @@ -0,0 +1,10 @@ + + + + icons/placeholder.png + icons/ra-icon.png + + + sounds/unlock.wav + + \ No newline at end of file diff --git a/src/frontend/qt_sdl/retroachievements/resources/sounds/unlock.wav b/src/frontend/qt_sdl/retroachievements/resources/sounds/unlock.wav new file mode 100644 index 0000000000..953a24795f Binary files /dev/null and b/src/frontend/qt_sdl/retroachievements/resources/sounds/unlock.wav differ diff --git a/src/frontend/qt_sdl/toast/AchievementToast.cpp b/src/frontend/qt_sdl/toast/AchievementToast.cpp new file mode 100644 index 0000000000..0d7cc5a6dc --- /dev/null +++ b/src/frontend/qt_sdl/toast/AchievementToast.cpp @@ -0,0 +1,54 @@ +#include "AchievementToast.h" +#include +#include + +AchievementToast::AchievementToast(const QString& title, + const QString& desc, + const QPixmap& icon, + QWidget* parent) + : QWidget(parent) +{ + setFixedWidth(360); + setAttribute(Qt::WA_TranslucentBackground); + + auto* root = new QHBoxLayout(this); + root->setSpacing(12); + root->setContentsMargins(12, 12, 12, 12); + + QLabel* img = new QLabel; + img->setPixmap(icon.scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + root->addWidget(img); + + auto* textCol = new QVBoxLayout; + QLabel* titleLbl = new QLabel(title); + QLabel* descLbl = new QLabel(desc); + + titleLbl->setStyleSheet("color: white; font-weight: bold;"); + descLbl->setStyleSheet("color: #DDD;"); + + textCol->addWidget(titleLbl); + textCol->addWidget(descLbl); + root->addLayout(textCol); + + setStyleSheet(R"( + background-color: rgba(20,20,20,230); + border-radius: 8px; + )"); + + m_anim = new QPropertyAnimation(this, "windowOpacity"); + m_anim->setDuration(250); +} + +void AchievementToast::play() +{ + setWindowOpacity(0.0); + m_anim->setStartValue(0.0); + m_anim->setEndValue(1.0); + m_anim->start(); + + QTimer::singleShot(4000, this, [this] { + m_anim->setDirection(QAbstractAnimation::Backward); + m_anim->start(); + connect(m_anim, &QPropertyAnimation::finished, this, &QObject::deleteLater); + }); +} \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/AchievementToast.h b/src/frontend/qt_sdl/toast/AchievementToast.h new file mode 100644 index 0000000000..6607a35a10 --- /dev/null +++ b/src/frontend/qt_sdl/toast/AchievementToast.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include +#include + +class AchievementToast : public QWidget +{ + Q_OBJECT +public: + AchievementToast(const QString& title, + const QString& desc, + const QPixmap& icon, + QWidget* parent = nullptr); + + void play(); + +private: + QPropertyAnimation* m_anim; +}; \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/BadgeCache.cpp b/src/frontend/qt_sdl/toast/BadgeCache.cpp new file mode 100644 index 0000000000..1fa9913e56 --- /dev/null +++ b/src/frontend/qt_sdl/toast/BadgeCache.cpp @@ -0,0 +1,41 @@ +#include "BadgeCache.h" +#include + +BadgeCache::BadgeCache(QObject* parent) + : QObject(parent) +{} + +QPixmap BadgeCache::GetBadge(const QString& url) +{ + if (m_cache.contains(url)) + return m_cache[url]; + + DownloadBadge(url, [](const QPixmap&){}); + + return QPixmap(":/ra/placeholder.png"); +} + +void BadgeCache::DownloadBadge(const QString& url, std::function callback) +{ + if (m_cache.contains(url)) { + callback(m_cache[url]); + return; + } + + QNetworkRequest req{ QUrl(url) }; + auto* reply = m_net.get(req); + + QObject::connect(reply, &QNetworkReply::finished, [this, reply, url, callback]() { + QPixmap pix; + if (reply->error() == QNetworkReply::NoError) + pix.loadFromData(reply->readAll()); + + if (pix.isNull()) + pix = QPixmap(":/ra/placeholder.png"); + + m_cache[url] = pix; + emit BadgeReady(url, pix); + callback(pix); + reply->deleteLater(); + }); +} \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/BadgeCache.h b/src/frontend/qt_sdl/toast/BadgeCache.h new file mode 100644 index 0000000000..d829e5caf5 --- /dev/null +++ b/src/frontend/qt_sdl/toast/BadgeCache.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include + +class BadgeCache : public QObject +{ + Q_OBJECT +public: + explicit BadgeCache(QObject* parent = nullptr); + + QPixmap GetBadge(const QString& url); + void DownloadBadge(const QString& url, + std::function callback); + +signals: + void BadgeReady(const QString& url, const QPixmap& pix); + +private: + QNetworkAccessManager m_net; + QHash m_cache; +}; \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/ToastManager.cpp b/src/frontend/qt_sdl/toast/ToastManager.cpp new file mode 100644 index 0000000000..ebe0ba3e4e --- /dev/null +++ b/src/frontend/qt_sdl/toast/ToastManager.cpp @@ -0,0 +1,28 @@ +#include "ToastManager.h" +#include "toast/ToastOverlay.h" +#include "toast/AchievementToast.h" + +ToastManager::ToastManager(QObject* parent) + : QObject(parent) +{ +} + +void ToastManager::Init(QWidget* widget) +{ + if (m_overlay) return; + + m_overlay = new ToastOverlay(widget); + + m_overlay->setGeometry(widget->rect()); + widget->installEventFilter(m_overlay); + m_overlay->show(); + m_overlay->raise(); +} +void ToastManager::ShowAchievement(const QString& title, const QString& description, const QPixmap& icon) +{ + if (!m_overlay) { + return; + } + + m_overlay->ShowToast(title, description, icon); +} \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/ToastManager.h b/src/frontend/qt_sdl/toast/ToastManager.h new file mode 100644 index 0000000000..d7fe3f1723 --- /dev/null +++ b/src/frontend/qt_sdl/toast/ToastManager.h @@ -0,0 +1,19 @@ +#pragma once +#include + +class ToastOverlay; + +class ToastManager : public QObject +{ + Q_OBJECT +public: + explicit ToastManager(QObject* parent = nullptr); + + void Init(QWidget* screenWidget); + void ShowAchievement(const QString& title, + const QString& desc, + const QPixmap& icon); + +private: + ToastOverlay* m_overlay = nullptr; +}; \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/ToastOverlay.cpp b/src/frontend/qt_sdl/toast/ToastOverlay.cpp new file mode 100644 index 0000000000..42945f9780 --- /dev/null +++ b/src/frontend/qt_sdl/toast/ToastOverlay.cpp @@ -0,0 +1,117 @@ +#include "ToastOverlay.h" +#include +#include + +ToastWidget::ToastWidget(const QString& title, const QString& description, const QPixmap& icon, QWidget* parent) + : QWidget(parent) +{ + auto* layout = new QHBoxLayout(this); + layout->setContentsMargins(10, 10, 10, 10); + + auto* iconLabel = new QLabel; + iconLabel->setPixmap(icon.scaled(32, 32, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + layout->addWidget(iconLabel); + + auto* textLayout = new QVBoxLayout; + auto* titleLabel = new QLabel(title); + titleLabel->setStyleSheet("font-weight: bold; color: white;"); + auto* descLabel = new QLabel(description); + descLabel->setStyleSheet("color: #ddd;"); + + textLayout->addWidget(titleLabel); + textLayout->addWidget(descLabel); + layout->addLayout(textLayout); + + setAttribute(Qt::WA_StyledBackground, false); + setAttribute(Qt::WA_TranslucentBackground); +} + +QSize ToastWidget::sizeHint() const +{ + return layout()->sizeHint(); +} + +void ToastWidget::paintEvent(QPaintEvent*) +{ + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + p.setBrush(QColor(40, 40, 40, 230)); + p.setPen(Qt::NoPen); + p.drawRoundedRect(rect(), 8, 8); +} + +ToastOverlay::ToastOverlay(QWidget* parent) + : QWidget(parent) +{ + setAttribute(Qt::WA_TransparentForMouseEvents); + setAttribute(Qt::WA_TranslucentBackground); + + m_soundEffect.setSource(QUrl("qrc:/ra/sounds/unlock.wav")); + m_soundEffect.setVolume(0.7f); +} + +void ToastOverlay::ShowToast(const QString& title, const QString& description, const QPixmap& icon) +{ + auto* toast = new ToastWidget(title, description, icon, this); + toast->show(); + m_toasts.append(toast); + + m_soundEffect.play(); + + RepositionToasts(); + + QTimer::singleShot(3000, toast, [this, toast]() { + m_toasts.removeOne(toast); + toast->deleteLater(); + RepositionToasts(); + }); +} + +void ToastOverlay::resizeEvent(QResizeEvent* event) +{ + if (parentWidget()) + setGeometry(parentWidget()->rect()); + + RepositionToasts(); + QWidget::resizeEvent(event); +} + +void ToastOverlay::paintEvent(QPaintEvent*) +{ +} + +void ToastOverlay::RepositionToasts() +{ + if (!parentWidget()) + return; + + const int margin = 20; + const int topOffset = 60; + + int y = topOffset; + const int rightEdge = width() - margin; + + for (auto* toast : m_toasts) + { + toast->adjustSize(); + + int x = rightEdge - toast->width(); + toast->move(x, y); + + y += toast->height() + 10; + } +} +bool ToastOverlay::eventFilter(QObject* obj, QEvent* event) +{ + if (obj == parentWidget()) + { + if (event->type() == QEvent::Resize || + event->type() == QEvent::WindowStateChange) + { + setGeometry(parentWidget()->rect()); + RepositionToasts(); + } + } + + return QWidget::eventFilter(obj, event); +} \ No newline at end of file diff --git a/src/frontend/qt_sdl/toast/ToastOverlay.h b/src/frontend/qt_sdl/toast/ToastOverlay.h new file mode 100644 index 0000000000..6f6444b03d --- /dev/null +++ b/src/frontend/qt_sdl/toast/ToastOverlay.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include +#include + +class ToastWidget : public QWidget +{ + Q_OBJECT +public: + ToastWidget(const QString& title, const QString& description, const QPixmap& icon, QWidget* parent = nullptr); + QSize sizeHint() const override; + +protected: + void paintEvent(QPaintEvent* event) override; +}; + +class ToastOverlay : public QWidget +{ + Q_OBJECT +public: + explicit ToastOverlay(QWidget* parent = nullptr); + void ShowToast(const QString& title, const QString& description, const QPixmap& icon); + +protected: + bool eventFilter(QObject* obj, QEvent* event) override; + void resizeEvent(QResizeEvent* event) override; + void paintEvent(QPaintEvent* event) override; + +private: + QList m_toasts; + void RepositionToasts(); + QSoundEffect m_soundEffect; +}; \ No newline at end of file diff --git a/src/rcheevos/include/rc_api_editor.h b/src/rcheevos/include/rc_api_editor.h new file mode 100644 index 0000000000..61e2fd4edd --- /dev/null +++ b/src/rcheevos/include/rc_api_editor.h @@ -0,0 +1,296 @@ +#ifndef RC_API_EDITOR_H +#define RC_API_EDITOR_H + +#include "rc_api_request.h" + +#include + +RC_BEGIN_C_DECLS + +/* --- Fetch Code Notes --- */ + +/** + * API parameters for a fetch code notes request. + */ +typedef struct rc_api_fetch_code_notes_request_t { + /* The unique identifier of the game */ + uint32_t game_id; +} +rc_api_fetch_code_notes_request_t; + +/* A code note definiton */ +typedef struct rc_api_code_note_t { + /* The address the note is associated to */ + uint32_t address; + /* The name of the use who last updated the note */ + const char* author; + /* The contents of the note */ + const char* note; +} rc_api_code_note_t; + +/** + * Response data for a fetch code notes request. + */ +typedef struct rc_api_fetch_code_notes_response_t { + /* An array of code notes for the game */ + rc_api_code_note_t* notes; + /* The number of items in the notes array */ + uint32_t num_notes; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_code_notes_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_code_notes_request(rc_api_request_t* request, const rc_api_fetch_code_notes_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_code_notes_request_hosted(rc_api_request_t* request, const rc_api_fetch_code_notes_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_code_notes_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_code_notes_response(rc_api_fetch_code_notes_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_code_notes_server_response(rc_api_fetch_code_notes_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_code_notes_response(rc_api_fetch_code_notes_response_t* response); + +/* --- Update Code Note --- */ + +/** + * API parameters for an update code note request. + */ +typedef struct rc_api_update_code_note_request_t { + /* The username of the developer */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* The address the note is associated to */ + uint32_t address; + /* The contents of the note (NULL or empty to delete a note) */ + const char* note; +} +rc_api_update_code_note_request_t; + +/** + * Response data for an update code note request. + */ +typedef struct rc_api_update_code_note_response_t { + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_update_code_note_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_update_code_note_request(rc_api_request_t* request, const rc_api_update_code_note_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_update_code_note_request_hosted(rc_api_request_t* request, const rc_api_update_code_note_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_update_code_note_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_update_code_note_response(rc_api_update_code_note_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_update_code_note_server_response(rc_api_update_code_note_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_update_code_note_response(rc_api_update_code_note_response_t* response); + +/* --- Update Achievement --- */ + +/** + * API parameters for an update achievement request. + */ +typedef struct rc_api_update_achievement_request_t { + /* The username of the developer */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the achievement (0 to create a new achievement) */ + uint32_t achievement_id; + /* The unique identifier of the game */ + uint32_t game_id; + /* The name of the achievement */ + const char* title; + /* The description of the achievement */ + const char* description; + /* The badge name for the achievement */ + const char* badge; + /* The serialized trigger for the achievement */ + const char* trigger; + /* The number of points the achievement is worth */ + uint32_t points; + /* The category of the achievement */ + uint32_t category; + /* The type of the achievement */ + uint32_t type; +} +rc_api_update_achievement_request_t; + +/** + * Response data for an update achievement request. + */ +typedef struct rc_api_update_achievement_response_t { + /* The unique identifier of the achievement */ + uint32_t achievement_id; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_update_achievement_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_update_achievement_request(rc_api_request_t* request, const rc_api_update_achievement_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_update_achievement_request_hosted(rc_api_request_t* request, const rc_api_update_achievement_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_update_achievement_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_update_achievement_response(rc_api_update_achievement_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_update_achievement_server_response(rc_api_update_achievement_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_update_achievement_response(rc_api_update_achievement_response_t* response); + +/* --- Update Leaderboard --- */ + +/** + * API parameters for an update leaderboard request. + */ +typedef struct rc_api_update_leaderboard_request_t { + /* The username of the developer */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the leaderboard (0 to create a new leaderboard) */ + uint32_t leaderboard_id; + /* The unique identifier of the game */ + uint32_t game_id; + /* The name of the leaderboard */ + const char* title; + /* The description of the leaderboard */ + const char* description; + /* The start trigger for the leaderboard */ + const char* start_trigger; + /* The submit trigger for the leaderboard */ + const char* submit_trigger; + /* The cancel trigger for the leaderboard */ + const char* cancel_trigger; + /* The value definition for the leaderboard */ + const char* value_definition; + /* The format of leaderboard values */ + const char* format; + /* Whether or not lower scores are better for the leaderboard */ + uint32_t lower_is_better; +} +rc_api_update_leaderboard_request_t; + +/** + * Response data for an update leaderboard request. + */ +typedef struct rc_api_update_leaderboard_response_t { + /* The unique identifier of the leaderboard */ + uint32_t leaderboard_id; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_update_leaderboard_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_update_leaderboard_request(rc_api_request_t* request, const rc_api_update_leaderboard_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_update_leaderboard_request_hosted(rc_api_request_t* request, const rc_api_update_leaderboard_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_update_leaderboard_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_update_leaderboard_response(rc_api_update_leaderboard_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_update_leaderboard_server_response(rc_api_update_leaderboard_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_update_leaderboard_response(rc_api_update_leaderboard_response_t* response); + +/* --- Update Rich Presence --- */ + +/** + * API parameters for an update rich presence request. + */ +typedef struct rc_api_update_rich_presence_request_t { + /* The username of the developer */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* The script for the rich_presence */ + const char* script; +} +rc_api_update_rich_presence_request_t; + +/** + * Response data for an update rich presence request. + */ +typedef struct rc_api_update_rich_presence_response_t { + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_update_rich_presence_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_update_rich_presence_request(rc_api_request_t* request, const rc_api_update_rich_presence_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_update_rich_presence_request_hosted(rc_api_request_t* request, const rc_api_update_rich_presence_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_update_rich_presence_server_response(rc_api_update_rich_presence_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_update_rich_presence_response(rc_api_update_rich_presence_response_t* response); + +/* --- Fetch Badge Range --- */ + +/** + * API parameters for a fetch badge range request. + */ +typedef struct rc_api_fetch_badge_range_request_t { + /* Unused */ + uint32_t unused; +} +rc_api_fetch_badge_range_request_t; + +/** + * Response data for a fetch badge range request. + */ +typedef struct rc_api_fetch_badge_range_response_t { + /* The numeric identifier of the first valid badge ID */ + uint32_t first_badge_id; + /* The numeric identifier of the first unassigned badge ID */ + uint32_t next_badge_id; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_badge_range_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_badge_range_request(rc_api_request_t* request, const rc_api_fetch_badge_range_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_badge_range_request_hosted(rc_api_request_t* request, const rc_api_fetch_badge_range_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_badge_range_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_badge_range_response(rc_api_fetch_badge_range_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_badge_range_server_response(rc_api_fetch_badge_range_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_badge_range_response(rc_api_fetch_badge_range_response_t* response); + +/* --- Add Game Hash --- */ + +/** + * API parameters for an add game hash request. + */ +typedef struct rc_api_add_game_hash_request_t { + /* The username of the developer */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game (0 to create a new game entry) */ + uint32_t game_id; + /* The unique identifier of the console for the game */ + uint32_t console_id; + /* The title of the game */ + const char* title; + /* The hash being added */ + const char* hash; + /* A description of the hash being added (usually the normalized ROM name) */ + const char* hash_description; +} +rc_api_add_game_hash_request_t; + +/** + * Response data for an update code note request. + */ +typedef struct rc_api_add_game_hash_response_t { + /* The unique identifier of the game */ + uint32_t game_id; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_add_game_hash_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_add_game_hash_request(rc_api_request_t* request, const rc_api_add_game_hash_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_add_game_hash_request_hosted(rc_api_request_t* request, const rc_api_add_game_hash_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_add_game_hash_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_add_game_hash_response(rc_api_add_game_hash_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_add_game_hash_server_response(rc_api_add_game_hash_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_add_game_hash_response(rc_api_add_game_hash_response_t* response); + +RC_END_C_DECLS + +#endif /* RC_EDITOR_H */ diff --git a/src/rcheevos/include/rc_api_info.h b/src/rcheevos/include/rc_api_info.h new file mode 100644 index 0000000000..ee5121df05 --- /dev/null +++ b/src/rcheevos/include/rc_api_info.h @@ -0,0 +1,278 @@ +#ifndef RC_API_INFO_H +#define RC_API_INFO_H + +#include "rc_api_request.h" + +#include +#include + +RC_BEGIN_C_DECLS + +/* --- Fetch Achievement Info --- */ + +/** + * API parameters for a fetch achievement info request. + */ +typedef struct rc_api_fetch_achievement_info_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the achievement */ + uint32_t achievement_id; + /* The 1-based index of the first entry to retrieve */ + uint32_t first_entry; + /* The number of entries to retrieve */ + uint32_t count; + /* Non-zero to only return unlocks earned by the user's friends */ + uint32_t friends_only; +} +rc_api_fetch_achievement_info_request_t; + +/* An achievement awarded entry */ +typedef struct rc_api_achievement_awarded_entry_t { + /* The user associated to the entry */ + const char* username; + /* A URL to the user's avatar image */ + const char* avatar_url; + /* When the achievement was awarded */ + time_t awarded; +} +rc_api_achievement_awarded_entry_t; + +/** + * Response data for a fetch achievement info request. + */ +typedef struct rc_api_fetch_achievement_info_response_t { + /* The unique identifier of the achievement */ + uint32_t id; + /* The unique identifier of the game to which the leaderboard is associated */ + uint32_t game_id; + /* The number of times the achievement has been awarded */ + uint32_t num_awarded; + /* The number of players that have earned at least one achievement for the game */ + uint32_t num_players; + + /* An array of recently rewarded entries */ + rc_api_achievement_awarded_entry_t* recently_awarded; + /* The number of items in the recently_awarded array */ + uint32_t num_recently_awarded; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_achievement_info_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_achievement_info_request(rc_api_request_t* request, const rc_api_fetch_achievement_info_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_achievement_info_request_hosted(rc_api_request_t* request, const rc_api_fetch_achievement_info_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_achievement_info_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_achievement_info_response(rc_api_fetch_achievement_info_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_achievement_info_server_response(rc_api_fetch_achievement_info_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_achievement_info_response(rc_api_fetch_achievement_info_response_t* response); + +/* --- Fetch Leaderboard Info --- */ + +/** + * API parameters for a fetch leaderboard info request. + */ +typedef struct rc_api_fetch_leaderboard_info_request_t { + /* The unique identifier of the leaderboard */ + uint32_t leaderboard_id; + /* The number of entries to retrieve */ + uint32_t count; + /* The 1-based index of the first entry to retrieve */ + uint32_t first_entry; + /* The username of the player around whom the entries should be returned */ + const char* username; +} +rc_api_fetch_leaderboard_info_request_t; + +/* A leaderboard info entry */ +typedef struct rc_api_lboard_info_entry_t { + /* The user associated to the entry */ + const char* username; + /* A URL to the user's avatar image */ + const char* avatar_url; + /* The rank of the entry */ + uint32_t rank; + /* The index of the entry */ + uint32_t index; + /* The value of the entry */ + int32_t score; + /* When the entry was submitted */ + time_t submitted; +} +rc_api_lboard_info_entry_t; + +/** + * Response data for a fetch leaderboard info request. + */ +typedef struct rc_api_fetch_leaderboard_info_response_t { + /* The unique identifier of the leaderboard */ + uint32_t id; + /* The format to pass to rc_format_value to format the leaderboard value */ + int format; + /* If non-zero, indicates that lower scores appear first */ + uint32_t lower_is_better; + /* The title of the leaderboard */ + const char* title; + /* The description of the leaderboard */ + const char* description; + /* The definition of the leaderboard to be passed to rc_runtime_activate_lboard */ + const char* definition; + /* The unique identifier of the game to which the leaderboard is associated */ + uint32_t game_id; + /* The author of the leaderboard */ + const char* author; + /* When the leaderboard was first uploaded to the server */ + time_t created; + /* When the leaderboard was last modified on the server */ + time_t updated; + + /* An array of requested entries */ + rc_api_lboard_info_entry_t* entries; + /* The number of items in the entries array */ + uint32_t num_entries; + + /* The total number of entries on the server */ + uint32_t total_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_leaderboard_info_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_leaderboard_info_request(rc_api_request_t* request, const rc_api_fetch_leaderboard_info_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_leaderboard_info_request_hosted(rc_api_request_t* request, const rc_api_fetch_leaderboard_info_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_leaderboard_info_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_leaderboard_info_response(rc_api_fetch_leaderboard_info_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_leaderboard_info_server_response(rc_api_fetch_leaderboard_info_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_leaderboard_info_response(rc_api_fetch_leaderboard_info_response_t* response); + +/* --- Fetch Games List --- */ + +/** + * API parameters for a fetch games list request. + */ +typedef struct rc_api_fetch_games_list_request_t { + /* The unique identifier of the console to query */ + uint32_t console_id; +} +rc_api_fetch_games_list_request_t; + +/* A game list entry */ +typedef struct rc_api_game_list_entry_t { + /* The unique identifier of the game */ + uint32_t id; + /* The name of the game */ + const char* name; +} +rc_api_game_list_entry_t; + +/** + * Response data for a fetch games list request. + */ +typedef struct rc_api_fetch_games_list_response_t { + /* An array of requested entries */ + rc_api_game_list_entry_t* entries; + /* The number of items in the entries array */ + uint32_t num_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_games_list_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_games_list_request(rc_api_request_t* request, const rc_api_fetch_games_list_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_games_list_request_hosted(rc_api_request_t* request, const rc_api_fetch_games_list_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_games_list_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_games_list_response(rc_api_fetch_games_list_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_games_list_server_response(rc_api_fetch_games_list_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_games_list_response(rc_api_fetch_games_list_response_t* response); + +/* --- Fetch Game Titles --- */ + +/** + * API parameters for a fetch games list request. + */ +typedef struct rc_api_fetch_game_titles_request_t { + /* An array of game ids to fetch titles for */ + const uint32_t* game_ids; + /* The number of items in the game_ids array */ + uint32_t num_game_ids; +} +rc_api_fetch_game_titles_request_t; + +/* A game title entry */ +typedef struct rc_api_game_title_entry_t { + /* The unique identifier of the game */ + uint32_t id; + /* The title of the game */ + const char* title; + /* The image name for the game badge */ + const char* image_name; +} +rc_api_game_title_entry_t; + +/** + * Response data for a fetch games title request. + */ +typedef struct rc_api_fetch_game_titles_response_t { + /* An array of requested entries */ + rc_api_game_title_entry_t* entries; + /* The number of items in the entries array */ + uint32_t num_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_game_titles_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_titles_request(rc_api_request_t* request, const rc_api_fetch_game_titles_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_titles_request_hosted(rc_api_request_t* request, const rc_api_fetch_game_titles_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_fetch_game_titles_server_response(rc_api_fetch_game_titles_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_game_titles_response(rc_api_fetch_game_titles_response_t* response); + +/* --- Fetch Game Hashes --- */ + +/** + * API parameters for a fetch games list request. + */ +typedef struct rc_api_fetch_hash_library_request_t { + /** + * The unique identifier of the console to query. + * Passing RC_CONSOLE_UNKNOWN will return hashes for all consoles. + */ + uint32_t console_id; +} rc_api_fetch_hash_library_request_t; + +/* A hash library entry */ +typedef struct rc_api_hash_library_entry_t { + /* The hash for the game */ + const char* hash; + /* The unique identifier of the game */ + uint32_t game_id; +} rc_api_hash_library_entry_t; + +/** + * Response data for a fetch hash library request. + */ +typedef struct rc_api_fetch_hash_library_response_t { + /* An array of entries, one per game */ + rc_api_hash_library_entry_t* entries; + /* The number of items in the entries array */ + uint32_t num_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_hash_library_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_hash_library_request(rc_api_request_t* request, const rc_api_fetch_hash_library_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_hash_library_request_hosted(rc_api_request_t* request, const rc_api_fetch_hash_library_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_fetch_hash_library_server_response(rc_api_fetch_hash_library_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_hash_library_response(rc_api_fetch_hash_library_response_t* response); + +RC_END_C_DECLS + +#endif /* RC_API_INFO_H */ diff --git a/src/rcheevos/include/rc_api_request.h b/src/rcheevos/include/rc_api_request.h new file mode 100644 index 0000000000..ddccc7bc28 --- /dev/null +++ b/src/rcheevos/include/rc_api_request.h @@ -0,0 +1,77 @@ +#ifndef RC_API_REQUEST_H +#define RC_API_REQUEST_H + +#include "rc_error.h" +#include "rc_util.h" + +#include + +RC_BEGIN_C_DECLS + +/** + * Information about the server being connected to. + */ +typedef struct rc_api_host_t { + /* The host name for the API calls (retroachievements.org) */ + const char* host; + /* The host name for media URLs (media.retroachievements.org) */ + const char* media_host; +} +rc_api_host_t; + +/** + * A constructed request to send to the retroachievements server. + */ +typedef struct rc_api_request_t { + /* The URL to send the request to (contains protocol, host, path, and query args) */ + const char* url; + /* Additional query args that should be sent via a POST command. If null, GET may be used */ + const char* post_data; + /* The HTTP Content-Type of the POST data. */ + const char* content_type; + + /* Storage for the url and post_data */ + rc_buffer_t buffer; +} +rc_api_request_t; + +/** + * Common attributes for all server responses. + */ +typedef struct rc_api_response_t { + /* Server-provided success indicator (non-zero on success, zero on failure) */ + int succeeded; + /* Server-provided message associated to the failure */ + const char* error_message; + /* Server-provided error code associated to the failure */ + const char* error_code; + + /* Storage for the response data */ + rc_buffer_t buffer; +} +rc_api_response_t; + +RC_EXPORT void RC_CCONV rc_api_destroy_request(rc_api_request_t* request); + +/* [deprecated] use rc_api_init_*_hosted instead */ +RC_EXPORT void RC_CCONV rc_api_set_host(const char* hostname); +/* [deprecated] use rc_api_init_*_hosted instead */ +RC_EXPORT void RC_CCONV rc_api_set_image_host(const char* hostname); + +typedef struct rc_api_server_response_t { + /* Pointer to the data returned from the server */ + const char* body; + /* Length of data returned from the server (Content-Length) */ + size_t body_length; + /* HTTP status code returned from the server */ + int http_status_code; +} rc_api_server_response_t; + +enum { + RC_API_SERVER_RESPONSE_CLIENT_ERROR = -1, + RC_API_SERVER_RESPONSE_RETRYABLE_CLIENT_ERROR = -2 +}; + +RC_END_C_DECLS + +#endif /* RC_API_REQUEST_H */ diff --git a/src/rcheevos/include/rc_api_runtime.h b/src/rcheevos/include/rc_api_runtime.h new file mode 100644 index 0000000000..8a0de01b7f --- /dev/null +++ b/src/rcheevos/include/rc_api_runtime.h @@ -0,0 +1,417 @@ +#ifndef RC_API_RUNTIME_H +#define RC_API_RUNTIME_H + +#include "rc_api_request.h" + +#include +#include + +RC_BEGIN_C_DECLS + +/* --- Fetch Image --- */ + +/** + * API parameters for a fetch image request. + * NOTE: fetch image server response is the raw image data. There is no rc_api_process_fetch_image_response function. + */ +typedef struct rc_api_fetch_image_request_t { + /* The name of the image to fetch */ + const char* image_name; + /* The type of image to fetch */ + uint32_t image_type; +} +rc_api_fetch_image_request_t; + +#define RC_IMAGE_TYPE_GAME 1 +#define RC_IMAGE_TYPE_ACHIEVEMENT 2 +#define RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED 3 +#define RC_IMAGE_TYPE_USER 4 + +RC_EXPORT int RC_CCONV rc_api_init_fetch_image_request(rc_api_request_t* request, const rc_api_fetch_image_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_image_request_hosted(rc_api_request_t* request, const rc_api_fetch_image_request_t* api_params, const rc_api_host_t* host); + +/* --- Resolve Hash --- */ + +/** + * API parameters for a resolve hash request. + */ +typedef struct rc_api_resolve_hash_request_t { + /* Unused - hash lookup does not require credentials */ + const char* username; + /* Unused - hash lookup does not require credentials */ + const char* api_token; + /* The generated hash of the game to be identified */ + const char* game_hash; +} +rc_api_resolve_hash_request_t; + +/** + * Response data for a resolve hash request. + */ +typedef struct rc_api_resolve_hash_response_t { + /* The unique identifier of the game, 0 if no match was found */ + uint32_t game_id; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_resolve_hash_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_resolve_hash_request(rc_api_request_t* request, const rc_api_resolve_hash_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_resolve_hash_request_hosted(rc_api_request_t* request, const rc_api_resolve_hash_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_resolve_hash_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_resolve_hash_response(rc_api_resolve_hash_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_resolve_hash_server_response(rc_api_resolve_hash_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_resolve_hash_response(rc_api_resolve_hash_response_t* response); + +/* --- Fetch Game Data --- */ + +/** + * API parameters for a fetch game data request. + */ +typedef struct rc_api_fetch_game_data_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* The generated hash of the game to be identified (ignored if game_id is not 0) */ + const char* game_hash; +} +rc_api_fetch_game_data_request_t; + +/* A leaderboard definition */ +typedef struct rc_api_leaderboard_definition_t { + /* The unique identifier of the leaderboard */ + uint32_t id; + /* The format to pass to rc_format_value to format the leaderboard value */ + int format; + /* The title of the leaderboard */ + const char* title; + /* The description of the leaderboard */ + const char* description; + /* The definition of the leaderboard to be passed to rc_runtime_activate_lboard */ + const char* definition; + /* Non-zero if lower values are better for this leaderboard */ + uint8_t lower_is_better; + /* Non-zero if the leaderboard should not be displayed in a list of leaderboards */ + uint8_t hidden; +} +rc_api_leaderboard_definition_t; + +/* An achievement definition */ +typedef struct rc_api_achievement_definition_t { + /* The unique identifier of the achievement */ + uint32_t id; + /* The number of points the achievement is worth */ + uint32_t points; + /* The achievement category (core, unofficial) */ + uint32_t category; + /* The title of the achievement */ + const char* title; + /* The description of the achievement */ + const char* description; + /* The definition of the achievement to be passed to rc_runtime_activate_achievement */ + const char* definition; + /* The author of the achievment */ + const char* author; + /* The image name for the achievement badge */ + const char* badge_name; + /* When the achievement was first uploaded to the server */ + time_t created; + /* When the achievement was last modified on the server */ + time_t updated; + /* The achievement type (win/progression/missable) */ + uint32_t type; + /* The approximate rarity of the achievement (X% of users have earned the achievement) */ + float rarity; + /* The approximate rarity of the achievement in hardcore (X% of users have earned the achievement in hardcore) */ + float rarity_hardcore; + /* The URL for the achievement badge */ + const char* badge_url; + /* The URL for the locked achievement badge */ + const char* badge_locked_url; +} +rc_api_achievement_definition_t; + +#define RC_ACHIEVEMENT_CATEGORY_CORE 3 +#define RC_ACHIEVEMENT_CATEGORY_UNOFFICIAL 5 + +#define RC_ACHIEVEMENT_TYPE_STANDARD 0 +#define RC_ACHIEVEMENT_TYPE_MISSABLE 1 +#define RC_ACHIEVEMENT_TYPE_PROGRESSION 2 +#define RC_ACHIEVEMENT_TYPE_WIN 3 + +/** + * Response data for a fetch game data request. + */ +typedef struct rc_api_fetch_game_data_response_t { + /* The unique identifier of the game */ + uint32_t id; + /* The console associated to the game */ + uint32_t console_id; + /* The title of the game */ + const char* title; + /* The image name for the game badge */ + const char* image_name; + /* The URL for the game badge */ + const char* image_url; + /* The rich presence script for the game to be passed to rc_runtime_activate_richpresence */ + const char* rich_presence_script; + + /* An array of achievements for the game */ + rc_api_achievement_definition_t* achievements; + /* The number of items in the achievements array */ + uint32_t num_achievements; + + /* An array of leaderboards for the game */ + rc_api_leaderboard_definition_t* leaderboards; + /* The number of items in the leaderboards array */ + uint32_t num_leaderboards; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_game_data_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_data_request(rc_api_request_t* request, const rc_api_fetch_game_data_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_data_request_hosted(rc_api_request_t* request, const rc_api_fetch_game_data_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_game_data_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_game_data_response(rc_api_fetch_game_data_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_game_data_server_response(rc_api_fetch_game_data_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_game_data_response(rc_api_fetch_game_data_response_t* response); + +/* --- Fetch Game Sets --- */ + +/** + * API parameters for a fetch game data request. + */ +typedef struct rc_api_fetch_game_sets_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* The generated hash of the game to be identified (ignored if game_id is not 0) */ + const char* game_hash; +} +rc_api_fetch_game_sets_request_t; + +#define RC_ACHIEVEMENT_SET_TYPE_CORE 0 +#define RC_ACHIEVEMENT_SET_TYPE_BONUS 1 +#define RC_ACHIEVEMENT_SET_TYPE_SPECIALTY 2 +#define RC_ACHIEVEMENT_SET_TYPE_EXCLUSIVE 3 + +/* A game subset definition */ +typedef struct rc_api_achievement_set_definition_t { + /* The unique identifier of the achievement set */ + uint32_t id; + /* The legacy game_id of the achievement set (used for editor API calls) */ + uint32_t game_id; + /* The title of the achievement set */ + const char* title; + /* The image name for the achievement set badge */ + const char* image_name; + /* The URL for the achievement set badge */ + const char* image_url; + + /* An array of achievements for the achievement set */ + rc_api_achievement_definition_t* achievements; + /* The number of items in the achievements array */ + uint32_t num_achievements; + + /* An array of leaderboards for the achievement set */ + rc_api_leaderboard_definition_t* leaderboards; + /* The number of items in the leaderboards array */ + uint32_t num_leaderboards; + + /* The type of the achievement set */ + uint8_t type; +} +rc_api_achievement_set_definition_t; + +/** + * Response data for a fetch game sets request. + */ +typedef struct rc_api_fetch_game_sets_response_t { + /* The unique identifier of the game */ + uint32_t id; + /* The console associated to the game */ + uint32_t console_id; + /* The title of the game */ + const char* title; + /* The image name for the game badge */ + const char* image_name; + /* The URL for the game badge */ + const char* image_url; + /* The rich presence script for the game to be passed to rc_runtime_activate_richpresence */ + const char* rich_presence_script; + /* The unique identifier of the game to use for session requests (startsession/ping/etc) */ + uint32_t session_game_id; + + /* An array of sets for the game */ + rc_api_achievement_set_definition_t* sets; + /* The number of items in the sets array */ + uint32_t num_sets; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_game_sets_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_sets_request(rc_api_request_t* request, const rc_api_fetch_game_sets_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_game_sets_request_hosted(rc_api_request_t* request, const rc_api_fetch_game_sets_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_fetch_game_sets_server_response(rc_api_fetch_game_sets_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_game_sets_response(rc_api_fetch_game_sets_response_t* response); + +/* --- Ping --- */ + +/** + * API parameters for a ping request. + */ +typedef struct rc_api_ping_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* (optional) The current rich presence evaluation for the user */ + const char* rich_presence; + /* (recommended) The hash associated to the game being played */ + const char* game_hash; + /* Non-zero if hardcore is currently enabled (ignored if game_hash is null) */ + uint32_t hardcore; +} +rc_api_ping_request_t; + +/** + * Response data for a ping request. + */ +typedef struct rc_api_ping_response_t { + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_ping_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_ping_request(rc_api_request_t* request, const rc_api_ping_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_ping_request_hosted(rc_api_request_t* request, const rc_api_ping_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_ping_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_ping_response(rc_api_ping_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_ping_server_response(rc_api_ping_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_ping_response(rc_api_ping_response_t* response); + +/* --- Award Achievement --- */ + +/** + * API parameters for an award achievement request. + */ +typedef struct rc_api_award_achievement_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the achievement */ + uint32_t achievement_id; + /* Non-zero if the achievement was earned in hardcore */ + uint32_t hardcore; + /* The hash associated to the game being played */ + const char* game_hash; + /* The number of seconds since the achievement was unlocked */ + uint32_t seconds_since_unlock; +} +rc_api_award_achievement_request_t; + +/** + * Response data for an award achievement request. + */ +typedef struct rc_api_award_achievement_response_t { + /* The unique identifier of the achievement that was awarded */ + uint32_t awarded_achievement_id; + /* The updated player score */ + uint32_t new_player_score; + /* The updated player softcore score */ + uint32_t new_player_score_softcore; + /* The number of achievements the user has not yet unlocked for this game + * (in hardcore/non-hardcore per hardcore flag in request) */ + uint32_t achievements_remaining; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_award_achievement_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_award_achievement_request(rc_api_request_t* request, const rc_api_award_achievement_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_award_achievement_request_hosted(rc_api_request_t* request, const rc_api_award_achievement_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_award_achievement_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_award_achievement_response(rc_api_award_achievement_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_award_achievement_server_response(rc_api_award_achievement_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_award_achievement_response(rc_api_award_achievement_response_t* response); + +/* --- Submit Leaderboard Entry --- */ + +/** + * API parameters for a submit lboard entry request. + */ +typedef struct rc_api_submit_lboard_entry_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the leaderboard */ + uint32_t leaderboard_id; + /* The value being submitted */ + int32_t score; + /* The hash associated to the game being played */ + const char* game_hash; + /* The number of seconds since the leaderboard attempt was completed */ + uint32_t seconds_since_completion; +} +rc_api_submit_lboard_entry_request_t; + +/* A leaderboard entry */ +typedef struct rc_api_lboard_entry_t { + /* The user associated to the entry */ + const char* username; + /* The rank of the entry */ + uint32_t rank; + /* The value of the entry */ + int32_t score; +} +rc_api_lboard_entry_t; + +/** + * Response data for a submit lboard entry request. + */ +typedef struct rc_api_submit_lboard_entry_response_t { + /* The value that was submitted */ + int32_t submitted_score; + /* The player's best submitted value */ + int32_t best_score; + /* The player's new rank within the leaderboard */ + uint32_t new_rank; + /* The total number of entries in the leaderboard */ + uint32_t num_entries; + + /* An array of the top entries for the leaderboard */ + rc_api_lboard_entry_t* top_entries; + /* The number of items in the top_entries array */ + uint32_t num_top_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_submit_lboard_entry_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_submit_lboard_entry_request(rc_api_request_t* request, const rc_api_submit_lboard_entry_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_submit_lboard_entry_request_hosted(rc_api_request_t* request, const rc_api_submit_lboard_entry_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_submit_lboard_entry_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_submit_lboard_entry_response(rc_api_submit_lboard_entry_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_submit_lboard_entry_server_response(rc_api_submit_lboard_entry_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_submit_lboard_entry_response(rc_api_submit_lboard_entry_response_t* response); + +RC_END_C_DECLS + +#endif /* RC_API_RUNTIME_H */ diff --git a/src/rcheevos/include/rc_api_user.h b/src/rcheevos/include/rc_api_user.h new file mode 100644 index 0000000000..c977da9564 --- /dev/null +++ b/src/rcheevos/include/rc_api_user.h @@ -0,0 +1,262 @@ +#ifndef RC_API_USER_H +#define RC_API_USER_H + +#include "rc_api_request.h" + +#include +#include + +RC_BEGIN_C_DECLS + +/* --- Login --- */ + +/** + * API parameters for a login request. + * If both password and api_token are provided, api_token will be ignored. + */ +typedef struct rc_api_login_request_t { + /* The username of the player being logged in */ + const char* username; + /* The API token from a previous login */ + const char* api_token; + /* The player's password */ + const char* password; +} +rc_api_login_request_t; + +/** + * Response data for a login request. + */ +typedef struct rc_api_login_response_t { + /* The case-corrected username of the player */ + const char* username; + /* The API token to use for all future requests */ + const char* api_token; + /* The current score of the player */ + uint32_t score; + /* The current softcore score of the player */ + uint32_t score_softcore; + /* The number of unread messages waiting for the player on the web site */ + uint32_t num_unread_messages; + /* The preferred name to display for the player */ + const char* display_name; + /* A URL to the user's avatar image */ + const char* avatar_url; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_login_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_login_request(rc_api_request_t* request, const rc_api_login_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_login_request_hosted(rc_api_request_t* request, const rc_api_login_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_login_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_login_response(rc_api_login_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_login_server_response(rc_api_login_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_login_response(rc_api_login_response_t* response); + +/* --- Start Session --- */ + +/** + * API parameters for a start session request. + */ +typedef struct rc_api_start_session_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* (recommended) The hash associated to the game being played */ + const char* game_hash; + /* Non-zero if hardcore is currently enabled (ignored if game_hash is null) */ + uint32_t hardcore; +} +rc_api_start_session_request_t; + +/** + * Response data for an achievement unlock. + */ +typedef struct rc_api_unlock_entry_t { + /* The unique identifier of the unlocked achievement */ + uint32_t achievement_id; + /* When the achievement was unlocked */ + time_t when; +} +rc_api_unlock_entry_t; + +/** + * Response data for a start session request. + */ +typedef struct rc_api_start_session_response_t { + /* An array of hardcore user unlocks */ + rc_api_unlock_entry_t* hardcore_unlocks; + /* An array of user unlocks */ + rc_api_unlock_entry_t* unlocks; + + /* The number of items in the hardcore_unlocks array */ + uint32_t num_hardcore_unlocks; + /* The number of items in the unlocks array */ + uint32_t num_unlocks; + + /* The server timestamp when the response was generated */ + time_t server_now; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_start_session_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_start_session_request(rc_api_request_t* request, const rc_api_start_session_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_start_session_request_hosted(rc_api_request_t* request, const rc_api_start_session_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_start_session_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_start_session_response(rc_api_start_session_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_start_session_server_response(rc_api_start_session_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_start_session_response(rc_api_start_session_response_t* response); + +/* --- Fetch User Unlocks --- */ + +/** + * API parameters for a fetch user unlocks request. + */ +typedef struct rc_api_fetch_user_unlocks_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the game */ + uint32_t game_id; + /* Non-zero to fetch hardcore unlocks, 0 to fetch non-hardcore unlocks */ + uint32_t hardcore; +} +rc_api_fetch_user_unlocks_request_t; + +/** + * Response data for a fetch user unlocks request. + */ +typedef struct rc_api_fetch_user_unlocks_response_t { + /* An array of achievement IDs previously unlocked by the user */ + uint32_t* achievement_ids; + /* The number of items in the achievement_ids array */ + uint32_t num_achievement_ids; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_user_unlocks_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_user_unlocks_request(rc_api_request_t* request, const rc_api_fetch_user_unlocks_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_user_unlocks_request_hosted(rc_api_request_t* request, const rc_api_fetch_user_unlocks_request_t* api_params, const rc_api_host_t* host); +/* [deprecated] use rc_api_process_fetch_user_unlocks_server_response instead */ +RC_EXPORT int RC_CCONV rc_api_process_fetch_user_unlocks_response(rc_api_fetch_user_unlocks_response_t* response, const char* server_response); +RC_EXPORT int RC_CCONV rc_api_process_fetch_user_unlocks_server_response(rc_api_fetch_user_unlocks_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_user_unlocks_response(rc_api_fetch_user_unlocks_response_t* response); + +/* --- Fetch Followed Users --- */ + +/** + * API parameters for a fetch followed users request. + */ +typedef struct rc_api_fetch_followed_users_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; +} +rc_api_fetch_followed_users_request_t; + +typedef struct rc_api_followed_user_activity_t { + /* The record associated to the activity */ + const char* context; + /* The image of the record associated to the activity */ + const char* context_image_url; + /* The description of the activity */ + const char* description; + /* The time of the activity */ + time_t when; + /* The unique identifier of the record associated to the activity */ + uint32_t context_id; +} +rc_api_followed_user_activity_t; + +/** + * Response data for a followed user. + */ +typedef struct rc_api_followed_user_t { + /* The preferred name to display for the player */ + const char* display_name; + /* A URL to the user's avatar image */ + const char* avatar_url; + /* The player's last registered activity */ + rc_api_followed_user_activity_t recent_activity; + /* The current score of the player */ + uint32_t score; +} +rc_api_followed_user_t; + +/** + * Response data for a fetch followed users request. + */ +typedef struct rc_api_fetch_followed_users_response_t { + /* An array of followed user information */ + rc_api_followed_user_t* users; + /* The number of items in the users array */ + uint32_t num_users; + + /* Common server-provided response information */ + rc_api_response_t response; +} +rc_api_fetch_followed_users_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_followed_users_request(rc_api_request_t* request, const rc_api_fetch_followed_users_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_followed_users_request_hosted(rc_api_request_t* request, const rc_api_fetch_followed_users_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_fetch_followed_users_server_response(rc_api_fetch_followed_users_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_followed_users_response(rc_api_fetch_followed_users_response_t* response); + +/* --- Fetch All Progress --- */ + +/** + * API parameters for a fetch all user progress request. + */ +typedef struct rc_api_fetch_all_user_progress_request_t { + /* The username of the player */ + const char* username; + /* The API token from the login request */ + const char* api_token; + /* The unique identifier of the console to query */ + uint32_t console_id; +} rc_api_fetch_all_user_progress_request_t; + +/* An all-user-progress entry */ +typedef struct rc_api_all_user_progress_entry_t { + /* The unique identifier of the game */ + uint32_t game_id; + /* The total number of achievements for this game */ + uint32_t num_achievements; + /* The total number of unlocked achievements for this game in softcore mode */ + uint32_t num_unlocked_achievements; + /* The total number of unlocked achievements for this game in hardcore mode */ + uint32_t num_unlocked_achievements_hardcore; +} rc_api_all_user_progress_entry_t; + +/** + * Response data for a fetch all user progress request. + */ +typedef struct rc_api_fetch_all_user_progress_response_t { + /* An array of entries, one per game */ + rc_api_all_user_progress_entry_t* entries; + /* The number of items in the entries array */ + uint32_t num_entries; + + /* Common server-provided response information */ + rc_api_response_t response; +} rc_api_fetch_all_user_progress_response_t; + +RC_EXPORT int RC_CCONV rc_api_init_fetch_all_user_progress_request(rc_api_request_t* request, const rc_api_fetch_all_user_progress_request_t* api_params); +RC_EXPORT int RC_CCONV rc_api_init_fetch_all_user_progress_request_hosted(rc_api_request_t* request, const rc_api_fetch_all_user_progress_request_t* api_params, const rc_api_host_t* host); +RC_EXPORT int RC_CCONV rc_api_process_fetch_all_user_progress_server_response(rc_api_fetch_all_user_progress_response_t* response, const rc_api_server_response_t* server_response); +RC_EXPORT void RC_CCONV rc_api_destroy_fetch_all_user_progress_response(rc_api_fetch_all_user_progress_response_t* response); + +RC_END_C_DECLS + +#endif /* RC_API_H */ diff --git a/src/rcheevos/include/rc_client.h b/src/rcheevos/include/rc_client.h new file mode 100644 index 0000000000..ef3507217d --- /dev/null +++ b/src/rcheevos/include/rc_client.h @@ -0,0 +1,871 @@ +#ifndef RC_CLIENT_H +#define RC_CLIENT_H + +#include "rc_api_request.h" +#include "rc_error.h" + +#include +#include +#include + +RC_BEGIN_C_DECLS + +/* implementation abstracted in rc_client_internal.h */ +typedef struct rc_client_t rc_client_t; +typedef struct rc_client_async_handle_t rc_client_async_handle_t; + +/*****************************************************************************\ +| Callbacks | +\*****************************************************************************/ + +/** + * Callback used to read num_bytes bytes from memory starting at address into buffer. + * Returns the number of bytes read. A return value of 0 indicates the address was invalid. + */ +typedef uint32_t (RC_CCONV *rc_client_read_memory_func_t)(uint32_t address, uint8_t* buffer, uint32_t num_bytes, rc_client_t* client); + +/** + * Internal method passed to rc_client_server_call_t to process the server response. + */ +typedef void (RC_CCONV *rc_client_server_callback_t)(const rc_api_server_response_t* server_response, void* callback_data); + +/** + * Callback used to issue a request to the server. + */ +typedef void (RC_CCONV *rc_client_server_call_t)(const rc_api_request_t* request, rc_client_server_callback_t callback, void* callback_data, rc_client_t* client); + +/** + * Generic callback for asynchronous eventing. + */ +typedef void (RC_CCONV *rc_client_callback_t)(int result, const char* error_message, rc_client_t* client, void* userdata); + +/** + * Callback for logging or displaying a message. + */ +typedef void (RC_CCONV *rc_client_message_callback_t)(const char* message, const rc_client_t* client); + +/*****************************************************************************\ +| Runtime | +\*****************************************************************************/ + +/** + * Creates a new rc_client_t object. + */ +RC_EXPORT rc_client_t* RC_CCONV rc_client_create(rc_client_read_memory_func_t read_memory_function, rc_client_server_call_t server_call_function); + +/** + * Releases resources associated to a rc_client_t object. + * Pointer will no longer be valid after making this call. + */ +RC_EXPORT void RC_CCONV rc_client_destroy(rc_client_t* client); + +/** + * Sets whether hardcore is enabled (on by default). + * Can be called with a game loaded. + * Enabling hardcore with a game loaded will raise an RC_CLIENT_EVENT_RESET + * event. Processing will be disabled until rc_client_reset is called. + */ +RC_EXPORT void RC_CCONV rc_client_set_hardcore_enabled(rc_client_t* client, int enabled); + +/** + * Gets whether hardcore is enabled (on by default). + */ +RC_EXPORT int RC_CCONV rc_client_get_hardcore_enabled(const rc_client_t* client); + +/** + * Sets whether encore mode is enabled (off by default). + * Evaluated when loading a game. Has no effect while a game is loaded. + */ +RC_EXPORT void RC_CCONV rc_client_set_encore_mode_enabled(rc_client_t* client, int enabled); + +/** + * Gets whether encore mode is enabled (off by default). + */ +RC_EXPORT int RC_CCONV rc_client_get_encore_mode_enabled(const rc_client_t* client); + +/** + * Sets whether unofficial achievements should be loaded. + * Evaluated when loading a game. Has no effect while a game is loaded. + */ +RC_EXPORT void RC_CCONV rc_client_set_unofficial_enabled(rc_client_t* client, int enabled); + +/** + * Gets whether unofficial achievements should be loaded. + */ +RC_EXPORT int RC_CCONV rc_client_get_unofficial_enabled(const rc_client_t* client); + +/** + * Sets whether spectator mode is enabled (off by default). + * If enabled, events for achievement unlocks and leaderboard submissions will be + * raised, but server calls to actually perform the unlock/submit will not occur. + * Can be modified while a game is loaded. Evaluated at unlock/submit time. + * Cannot be modified if disabled before a game is loaded. + */ +RC_EXPORT void RC_CCONV rc_client_set_spectator_mode_enabled(rc_client_t* client, int enabled); + +/** + * Gets whether spectator mode is enabled (off by default). + */ +RC_EXPORT int RC_CCONV rc_client_get_spectator_mode_enabled(const rc_client_t* client); + +/** + * Attaches client-specific data to the runtime. + */ +RC_EXPORT void RC_CCONV rc_client_set_userdata(rc_client_t* client, void* userdata); + +/** + * Gets the client-specific data attached to the runtime. + */ +RC_EXPORT void* RC_CCONV rc_client_get_userdata(const rc_client_t* client); + +/** + * Sets the name of the server to use. + */ +RC_EXPORT void RC_CCONV rc_client_set_host(rc_client_t* client, const char* hostname); + +typedef uint64_t rc_clock_t; +typedef rc_clock_t (RC_CCONV *rc_get_time_millisecs_func_t)(const rc_client_t* client); + +/** + * Specifies a function that returns a value that increases once per millisecond. + */ +RC_EXPORT void RC_CCONV rc_client_set_get_time_millisecs_function(rc_client_t* client, rc_get_time_millisecs_func_t handler); + +/** + * Marks an async process as aborted. The associated callback will not be called. + */ +RC_EXPORT void RC_CCONV rc_client_abort_async(rc_client_t* client, rc_client_async_handle_t* async_handle); + +/** + * Gets a clause that can be added to the User-Agent to identify the version of rcheevos being used. + */ +RC_EXPORT size_t RC_CCONV rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_t buffer_size); + +/*****************************************************************************\ +| Logging | +\*****************************************************************************/ + +/** + * Sets the logging level and provides a callback to be called to do the logging. + */ +RC_EXPORT void RC_CCONV rc_client_enable_logging(rc_client_t* client, int level, rc_client_message_callback_t callback); +enum { + RC_CLIENT_LOG_LEVEL_NONE = 0, + RC_CLIENT_LOG_LEVEL_ERROR = 1, + RC_CLIENT_LOG_LEVEL_WARN = 2, + RC_CLIENT_LOG_LEVEL_INFO = 3, + RC_CLIENT_LOG_LEVEL_VERBOSE = 4, + NUM_RC_CLIENT_LOG_LEVELS = 5 +}; + +/*****************************************************************************\ +| User | +\*****************************************************************************/ + +/** + * Attempt to login a user. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_login_with_password(rc_client_t* client, + const char* username, const char* password, + rc_client_callback_t callback, void* callback_userdata); + +/** + * Attempt to login a user. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_login_with_token(rc_client_t* client, + const char* username, const char* token, + rc_client_callback_t callback, void* callback_userdata); + +/** + * Logout the user. + */ +RC_EXPORT void RC_CCONV rc_client_logout(rc_client_t* client); + +typedef struct rc_client_user_t { + const char* display_name; + const char* username; + const char* token; + uint32_t score; + uint32_t score_softcore; + uint32_t num_unread_messages; + /* minimum version: 12.0 */ + const char* avatar_url; +} rc_client_user_t; + +/** + * Gets information about the logged in user. Will return NULL if the user is not logged in. + */ +RC_EXPORT const rc_client_user_t* RC_CCONV rc_client_get_user_info(const rc_client_t* client); + +/** + * Gets the URL for the user's profile picture. + * Returns RC_OK on success. + */ +RC_EXPORT int RC_CCONV rc_client_user_get_image_url(const rc_client_user_t* user, char buffer[], size_t buffer_size); + +typedef struct rc_client_user_game_summary_t { + uint32_t num_core_achievements; + uint32_t num_unofficial_achievements; + uint32_t num_unlocked_achievements; + uint32_t num_unsupported_achievements; + + uint32_t points_core; + uint32_t points_unlocked; + + /* minimum version: 12.1 */ + time_t beaten_time; + time_t completed_time; +} rc_client_user_game_summary_t; + +/** + * Gets a breakdown of the number of achievements in the game, and how many the user has unlocked. + * Used for the "You have unlocked X of Y achievements" message shown when the game starts. + */ +RC_EXPORT void RC_CCONV rc_client_get_user_game_summary(const rc_client_t* client, rc_client_user_game_summary_t* summary); + +typedef struct rc_client_all_user_progress_entry_t { + uint32_t game_id; + uint32_t num_achievements; + uint32_t num_unlocked_achievements; + uint32_t num_unlocked_achievements_hardcore; +} rc_client_all_user_progress_entry_t; + +typedef struct rc_client_all_user_progress_t { + rc_client_all_user_progress_entry_t* entries; + uint32_t num_entries; +} rc_client_all_user_progress_t; + +/** + * Callback that is fired when an all progress query completes. list may be null if the query failed. + */ +typedef void(RC_CCONV* rc_client_fetch_all_user_progress_callback_t)(int result, const char* error_message, + rc_client_all_user_progress_t* list, + rc_client_t* client, void* callback_userdata); + +/** + * Starts an asynchronous request for all progress for the given console. + * This query returns the total number of achievements for all games tracked by this console, as well as + * the user's achievement unlock count for both softcore and hardcore modes. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV +rc_client_begin_fetch_all_user_progress(rc_client_t* client, uint32_t console_id, + rc_client_fetch_all_user_progress_callback_t callback, void* callback_userdata); + +/** + * Destroys a previously-allocated result from the rc_client_begin_fetch_all_progress_list() callback. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_all_user_progress(rc_client_all_user_progress_t* list); + +/*****************************************************************************\ +| Game | +\*****************************************************************************/ + +#ifdef RC_CLIENT_SUPPORTS_HASH +/** + * Start loading an unidentified game. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_identify_and_load_game(rc_client_t* client, + uint32_t console_id, const char* file_path, + const uint8_t* data, size_t data_size, + rc_client_callback_t callback, void* callback_userdata); + +struct rc_hash_callbacks; +/** + * Provide callback functions for interacting with the file system and processing disc-based files when generating hashes. + */ +RC_EXPORT void rc_client_set_hash_callbacks(rc_client_t* client, const struct rc_hash_callbacks* callbacks); +#endif + +/** + * Start loading a game. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_load_game(rc_client_t* client, const char* hash, + rc_client_callback_t callback, void* callback_userdata); + +/** + * Gets the current progress of the asynchronous load game process. + */ +RC_EXPORT int RC_CCONV rc_client_get_load_game_state(const rc_client_t* client); +enum { + RC_CLIENT_LOAD_GAME_STATE_NONE, + RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN, + RC_CLIENT_LOAD_GAME_STATE_IDENTIFYING_GAME, + RC_CLIENT_LOAD_GAME_STATE_FETCHING_GAME_DATA, /* [deprecated] - game data is now returned by identify call */ + RC_CLIENT_LOAD_GAME_STATE_STARTING_SESSION, + RC_CLIENT_LOAD_GAME_STATE_DONE, + RC_CLIENT_LOAD_GAME_STATE_ABORTED +}; + +/** + * Determines if a game was successfully identified and loaded. + */ +RC_EXPORT int RC_CCONV rc_client_is_game_loaded(const rc_client_t* client); + +/** + * Unloads the current game. + */ +RC_EXPORT void RC_CCONV rc_client_unload_game(rc_client_t* client); + +typedef struct rc_client_game_t { + uint32_t id; + uint32_t console_id; + const char* title; + const char* hash; + const char* badge_name; + /* minimum version: 12.0 */ + const char* badge_url; +} rc_client_game_t; + +/** + * Get information about the current game. Returns NULL if no game is loaded. + * NOTE: returns a dummy game record if an unidentified game is loaded. + */ +RC_EXPORT const rc_client_game_t* RC_CCONV rc_client_get_game_info(const rc_client_t* client); + +/** + * Gets the URL for the game image. + * Returns RC_OK on success. + */ +RC_EXPORT int RC_CCONV rc_client_game_get_image_url(const rc_client_game_t* game, char buffer[], size_t buffer_size); + +#ifdef RC_CLIENT_SUPPORTS_HASH +/** + * Changes the active disc in a multi-disc game. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_identify_and_change_media(rc_client_t* client, const char* file_path, + const uint8_t* data, size_t data_size, rc_client_callback_t callback, void* callback_userdata); +#endif + +/** + * Changes the active disc in a multi-disc game. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_change_media(rc_client_t* client, const char* hash, + rc_client_callback_t callback, void* callback_userdata); +/* this function was renamed in rcheevos 12.0 */ +#define rc_client_begin_change_media_from_hash rc_client_begin_change_media + +/*****************************************************************************\ +| Subsets | +\*****************************************************************************/ + +typedef struct rc_client_subset_t { + uint32_t id; + const char* title; + char badge_name[16]; + + uint32_t num_achievements; + uint32_t num_leaderboards; + + /* minimum version: 12.0 */ + const char* badge_url; +} rc_client_subset_t; + +RC_EXPORT const rc_client_subset_t* RC_CCONV rc_client_get_subset_info(rc_client_t* client, uint32_t subset_id); + +RC_EXPORT void RC_CCONV rc_client_get_user_subset_summary(const rc_client_t* client, uint32_t subset_id, rc_client_user_game_summary_t* summary); + +typedef struct rc_client_subset_list_t { + const rc_client_subset_t** subsets; + uint32_t num_subsets; +} rc_client_subset_list_t; + +/** + * Creates a list of subsets for the currently loaded game. + * Returns an allocated list that must be free'd by calling rc_client_destroy_subset_list. + */ +RC_EXPORT rc_client_subset_list_t* RC_CCONV rc_client_create_subset_list(rc_client_t* client); + +/** + * Destroys a list allocated by rc_client_create_subset_list_list. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_subset_list(rc_client_subset_list_t* list); + +/*****************************************************************************\ +| Fetch Game Hashes | +\*****************************************************************************/ + +typedef struct rc_client_hash_library_entry_t { + char hash[33]; + uint32_t game_id; +} rc_client_hash_library_entry_t; + +typedef struct rc_client_hash_library_t { + rc_client_hash_library_entry_t* entries; + uint32_t num_entries; +} rc_client_hash_library_t; + +/** + * Callback that is fired when a hash library request completes. list may be null if the query failed. + */ +typedef void(RC_CCONV* rc_client_fetch_hash_library_callback_t)(int result, const char* error_message, + rc_client_hash_library_t* list, rc_client_t* client, + void* callback_userdata); + +/** + * Starts an asynchronous request for all hashes for the given console. + * This request returns a mapping from hashes to the game's unique identifier. A single game may have multiple + * hashes in the case of multi-disc games, or variants that are still compatible with the same achievement set. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_hash_library( + rc_client_t* client, uint32_t console_id, rc_client_fetch_hash_library_callback_t callback, void* callback_userdata); + +/** + * Destroys a previously-allocated result from the rc_client_destroy_hash_library() callback. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_hash_library(rc_client_hash_library_t* list); + +/*****************************************************************************\ +| Fetch Game Titles | +\*****************************************************************************/ + +typedef struct rc_client_game_title_entry_t { + uint32_t game_id; + const char* title; + char badge_name[16]; +} rc_client_game_title_entry_t; + +typedef struct rc_client_game_title_list_t { + rc_client_game_title_entry_t* entries; + uint32_t num_entries; +} rc_client_game_title_list_t; + +/** + * Callback that is fired when a game titles request completes. list may be null if the query failed. + */ +typedef void(RC_CCONV* rc_client_fetch_game_titles_callback_t)(int result, const char* error_message, + rc_client_game_title_list_t* list, rc_client_t* client, + void* callback_userdata); + +/** + * Starts an asynchronous request for titles and badge names for the specified games. + * The caller must provide an array of game IDs and the number of IDs in the array. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_game_titles( + rc_client_t* client, const uint32_t* game_ids, uint32_t num_game_ids, + rc_client_fetch_game_titles_callback_t callback, void* callback_userdata); + +/** + * Destroys a previously-allocated result from the rc_client_begin_fetch_game_titles() callback. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_game_title_list(rc_client_game_title_list_t* list); + +/*****************************************************************************\ +| Achievements | +\*****************************************************************************/ + +enum { + RC_CLIENT_ACHIEVEMENT_STATE_INACTIVE = 0, /* unprocessed */ + RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE = 1, /* eligible to trigger */ + RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED = 2, /* earned by user */ + RC_CLIENT_ACHIEVEMENT_STATE_DISABLED = 3, /* not supported by this version of the runtime */ + NUM_RC_CLIENT_ACHIEVEMENT_STATES = 4 +}; + +enum { + RC_CLIENT_ACHIEVEMENT_CATEGORY_NONE = 0, + RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE = (1 << 0), + RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL = (1 << 1), + RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL = RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE | RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL +}; + +enum { + RC_CLIENT_ACHIEVEMENT_TYPE_STANDARD = 0, + RC_CLIENT_ACHIEVEMENT_TYPE_MISSABLE = 1, + RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION = 2, + RC_CLIENT_ACHIEVEMENT_TYPE_WIN = 3 +}; + +enum { + RC_CLIENT_ACHIEVEMENT_BUCKET_UNKNOWN = 0, + RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED = 1, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED = 2, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED = 3, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL = 4, + RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED = 5, + RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE = 6, + RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE = 7, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED = 8, + NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS = 9 +}; + +enum { + RC_CLIENT_ACHIEVEMENT_UNLOCKED_NONE = 0, + RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE = (1 << 0), + RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE = (1 << 1), + RC_CLIENT_ACHIEVEMENT_UNLOCKED_BOTH = RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE | RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE +}; + +typedef struct rc_client_achievement_t { + const char* title; + const char* description; + char badge_name[8]; + char measured_progress[24]; + float measured_percent; + uint32_t id; + uint32_t points; + time_t unlock_time; + uint8_t state; + uint8_t category; + uint8_t bucket; + uint8_t unlocked; + /* minimum version: 11.1 */ + float rarity; + float rarity_hardcore; + uint8_t type; + /* minimum version: 12.0 */ + const char* badge_url; + const char* badge_locked_url; +} rc_client_achievement_t; + +/** + * Get information about an achievement. Returns NULL if not found. + */ +RC_EXPORT const rc_client_achievement_t* RC_CCONV rc_client_get_achievement_info(rc_client_t* client, uint32_t id); + +/** + * Gets the URL for the achievement image. + * Returns RC_OK on success. + */ +RC_EXPORT int RC_CCONV rc_client_achievement_get_image_url(const rc_client_achievement_t* achievement, int state, char buffer[], size_t buffer_size); + +typedef struct rc_client_achievement_bucket_t { + const rc_client_achievement_t** achievements; + uint32_t num_achievements; + + const char* label; + uint32_t subset_id; + uint8_t bucket_type; +} rc_client_achievement_bucket_t; + +typedef struct rc_client_achievement_list_t { + const rc_client_achievement_bucket_t* buckets; + uint32_t num_buckets; +} rc_client_achievement_list_t; + +enum { + RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE = 0, + RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS = 1 +}; + +/** + * Creates a list of achievements matching the specified category and grouping. + * Returns an allocated list that must be free'd by calling rc_client_destroy_achievement_list. + */ +RC_EXPORT rc_client_achievement_list_t* RC_CCONV rc_client_create_achievement_list(rc_client_t* client, int category, int grouping); + +/** + * Destroys a list allocated by rc_client_create_achievement_list. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_achievement_list(rc_client_achievement_list_t* list); + +/** + * Returns non-zero if there are any achievements that can be queried through rc_client_create_achievement_list(). + */ +RC_EXPORT int RC_CCONV rc_client_has_achievements(rc_client_t* client); + +/*****************************************************************************\ +| Leaderboards | +\*****************************************************************************/ + +enum { + RC_CLIENT_LEADERBOARD_STATE_INACTIVE = 0, + RC_CLIENT_LEADERBOARD_STATE_ACTIVE = 1, + RC_CLIENT_LEADERBOARD_STATE_TRACKING = 2, + RC_CLIENT_LEADERBOARD_STATE_DISABLED = 3, + NUM_RC_CLIENT_LEADERBOARD_STATES = 4 +}; + +enum { + RC_CLIENT_LEADERBOARD_FORMAT_TIME = 0, + RC_CLIENT_LEADERBOARD_FORMAT_SCORE = 1, + RC_CLIENT_LEADERBOARD_FORMAT_VALUE = 2, + NUM_RC_CLIENT_LEADERBOARD_FORMATS = 3 +}; + +#define RC_CLIENT_LEADERBOARD_DISPLAY_SIZE 24 + +typedef struct rc_client_leaderboard_t { + const char* title; + const char* description; + const char* tracker_value; + uint32_t id; + uint8_t state; + uint8_t format; + uint8_t lower_is_better; +} rc_client_leaderboard_t; + +/** + * Get information about a leaderboard. Returns NULL if not found. + */ +RC_EXPORT const rc_client_leaderboard_t* RC_CCONV rc_client_get_leaderboard_info(const rc_client_t* client, uint32_t id); + +typedef struct rc_client_leaderboard_tracker_t { + char display[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE]; + uint32_t id; +} rc_client_leaderboard_tracker_t; + +typedef struct rc_client_leaderboard_bucket_t { + const rc_client_leaderboard_t** leaderboards; + uint32_t num_leaderboards; + + const char* label; + uint32_t subset_id; + uint8_t bucket_type; +} rc_client_leaderboard_bucket_t; + +typedef struct rc_client_leaderboard_list_t { + const rc_client_leaderboard_bucket_t* buckets; + uint32_t num_buckets; +} rc_client_leaderboard_list_t; + +enum { + RC_CLIENT_LEADERBOARD_BUCKET_UNKNOWN = 0, + RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE = 1, + RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE = 2, + RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED = 3, + RC_CLIENT_LEADERBOARD_BUCKET_ALL = 4, + NUM_RC_CLIENT_LEADERBOARD_BUCKETS = 5 +}; + +enum { + RC_CLIENT_LEADERBOARD_LIST_GROUPING_NONE = 0, + RC_CLIENT_LEADERBOARD_LIST_GROUPING_TRACKING = 1 +}; + +/** + * Creates a list of leaderboards matching the specified grouping. + * Returns an allocated list that must be free'd by calling rc_client_destroy_leaderboard_list. + */ +RC_EXPORT rc_client_leaderboard_list_t* RC_CCONV rc_client_create_leaderboard_list(rc_client_t* client, int grouping); + +/** + * Destroys a list allocated by rc_client_create_leaderboard_list. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_leaderboard_list(rc_client_leaderboard_list_t* list); + +/** + * Returns non-zero if the current game has any leaderboards. + */ +RC_EXPORT int RC_CCONV rc_client_has_leaderboards(rc_client_t* client); + +typedef struct rc_client_leaderboard_entry_t { + const char* user; + char display[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE]; + time_t submitted; + uint32_t rank; + uint32_t index; +} rc_client_leaderboard_entry_t; + +typedef struct rc_client_leaderboard_entry_list_t { + rc_client_leaderboard_entry_t* entries; + uint32_t num_entries; + uint32_t total_entries; + int32_t user_index; +} rc_client_leaderboard_entry_list_t; + +typedef void (RC_CCONV *rc_client_fetch_leaderboard_entries_callback_t)(int result, const char* error_message, + rc_client_leaderboard_entry_list_t* list, rc_client_t* client, void* callback_userdata); + +/** + * Fetches a list of leaderboard entries from the server. + * Callback receives an allocated list that must be free'd by calling rc_client_destroy_leaderboard_entry_list. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_leaderboard_entries(rc_client_t* client, uint32_t leaderboard_id, + uint32_t first_entry, uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata); + +/** + * Fetches a list of leaderboard entries from the server containing the logged-in user. + * Callback receives an allocated list that must be free'd by calling rc_client_destroy_leaderboard_entry_list. + */ +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_leaderboard_entries_around_user(rc_client_t* client, uint32_t leaderboard_id, + uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata); + +/** + * Gets the URL for the profile picture of the user associated to a leaderboard entry. + * Returns RC_OK on success. + */ +RC_EXPORT int RC_CCONV rc_client_leaderboard_entry_get_user_image_url(const rc_client_leaderboard_entry_t* entry, char buffer[], size_t buffer_size); + +/** + * Destroys a list allocated by rc_client_begin_fetch_leaderboard_entries or rc_client_begin_fetch_leaderboard_entries_around_user. + */ +RC_EXPORT void RC_CCONV rc_client_destroy_leaderboard_entry_list(rc_client_leaderboard_entry_list_t* list); + +/** + * Used for scoreboard events. Contains the response from the server when a leaderboard entry is submitted. + * NOTE: This structure is only valid within the event callback. If you want to make use of the data outside + * of the callback, you should create copies of both the top entries and usernames within. + */ +typedef struct rc_client_leaderboard_scoreboard_entry_t { + /* The user associated to the entry */ + const char* username; + /* The rank of the entry */ + uint32_t rank; + /* The value of the entry */ + char score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE]; +} rc_client_leaderboard_scoreboard_entry_t; + +typedef struct rc_client_leaderboard_scoreboard_t { + /* The ID of the leaderboard which was submitted */ + uint32_t leaderboard_id; + /* The value that was submitted */ + char submitted_score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE]; + /* The player's best submitted value */ + char best_score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE]; + /* The player's new rank within the leaderboard */ + uint32_t new_rank; + /* The total number of entries in the leaderboard */ + uint32_t num_entries; + + /* An array of the top entries for the leaderboard */ + rc_client_leaderboard_scoreboard_entry_t* top_entries; + /* The number of items in the top_entries array */ + uint32_t num_top_entries; +} rc_client_leaderboard_scoreboard_t; + +/*****************************************************************************\ +| Rich Presence | +\*****************************************************************************/ + +/** + * Returns non-zero if the current game supports rich presence. + */ +RC_EXPORT int RC_CCONV rc_client_has_rich_presence(rc_client_t* client); + +/** + * Gets the current rich presence message. + * Returns the number of characters written to buffer. + */ +RC_EXPORT size_t RC_CCONV rc_client_get_rich_presence_message(rc_client_t* client, char buffer[], size_t buffer_size); + +/*****************************************************************************\ +| Processing | +\*****************************************************************************/ + +enum { + RC_CLIENT_EVENT_TYPE_NONE = 0, + RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED = 1, /* [achievement] was earned by the player */ + RC_CLIENT_EVENT_LEADERBOARD_STARTED = 2, /* [leaderboard] attempt has started */ + RC_CLIENT_EVENT_LEADERBOARD_FAILED = 3, /* [leaderboard] attempt failed */ + RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED = 4, /* [leaderboard] attempt submitted */ + RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_SHOW = 5, /* [achievement] challenge indicator should be shown */ + RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_HIDE = 6, /* [achievement] challenge indicator should be hidden */ + RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_SHOW = 7, /* progress indicator should be shown for [achievement] */ + RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE = 8, /* progress indicator should be hidden */ + RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_UPDATE = 9, /* progress indicator should be updated to reflect new badge/progress for [achievement] */ + RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW = 10, /* [leaderboard_tracker] should be shown */ + RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE = 11, /* [leaderboard_tracker] should be hidden */ + RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE = 12, /* [leaderboard_tracker] updated */ + RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD = 13, /* [leaderboard_scoreboard] possibly-new ranking received for [leaderboard] */ + RC_CLIENT_EVENT_RESET = 14, /* emulated system should be reset (as the result of enabling hardcore) */ + RC_CLIENT_EVENT_GAME_COMPLETED = 15, /* all achievements for the game have been earned */ + RC_CLIENT_EVENT_SERVER_ERROR = 16, /* an API response returned a [server_error] and will not be retried */ + RC_CLIENT_EVENT_DISCONNECTED = 17, /* an unlock request could not be completed and is pending */ + RC_CLIENT_EVENT_RECONNECTED = 18, /* all pending unlocks have been completed */ + RC_CLIENT_EVENT_SUBSET_COMPLETED = 19 /* all achievements for the subset have been earned */ +}; + +typedef struct rc_client_server_error_t { + const char* error_message; + const char* api; + int result; + uint32_t related_id; +} rc_client_server_error_t; + +typedef struct rc_client_event_t { + uint32_t type; + + rc_client_achievement_t* achievement; + rc_client_leaderboard_t* leaderboard; + rc_client_leaderboard_tracker_t* leaderboard_tracker; + rc_client_leaderboard_scoreboard_t* leaderboard_scoreboard; + rc_client_server_error_t* server_error; + rc_client_subset_t* subset; + +} rc_client_event_t; + +/** + * Callback used to notify the client when certain events occur. + */ +typedef void (RC_CCONV *rc_client_event_handler_t)(const rc_client_event_t* event, rc_client_t* client); + +/** + * Provides a callback for event handling. + */ +RC_EXPORT void RC_CCONV rc_client_set_event_handler(rc_client_t* client, rc_client_event_handler_t handler); + +/** + * Provides a callback for reading memory. + */ +RC_EXPORT void RC_CCONV rc_client_set_read_memory_function(rc_client_t* client, rc_client_read_memory_func_t handler); + +/** + * Specifies whether rc_client is allowed to read memory outside of rc_client_do_frame/rc_client_idle. + */ +RC_EXPORT void RC_CCONV rc_client_set_allow_background_memory_reads(rc_client_t* client, int allowed); + +/** + * Determines if there are any active achievements/leaderboards/rich presence that need processing. + */ +RC_EXPORT int RC_CCONV rc_client_is_processing_required(rc_client_t* client); + +/** + * Processes achievements for the current frame. + */ +RC_EXPORT void RC_CCONV rc_client_do_frame(rc_client_t* client); + +/** + * Processes the periodic queue. + * Called internally by rc_client_do_frame. + * Should be explicitly called if rc_client_do_frame is not being called because emulation is paused. + */ +RC_EXPORT void RC_CCONV rc_client_idle(rc_client_t* client); + +/** + * Determines if a sufficient amount of frames have been processed since the last call to rc_client_can_pause. + * Should not be called unless the client is trying to pause. + * If false is returned, and frames_remaining is not NULL, frames_remaining will be set to the number of frames + * still required before pause is allowed, which can be converted to a time in seconds for displaying to the user. + */ +RC_EXPORT int RC_CCONV rc_client_can_pause(rc_client_t* client, uint32_t* frames_remaining); + +/** + * Informs the runtime that the emulator has been reset. Will reset all achievements and leaderboards + * to their initial state (includes hiding indicators/trackers). + */ +RC_EXPORT void RC_CCONV rc_client_reset(rc_client_t* client); + +/** + * Gets the number of bytes needed to serialized the runtime state. + */ +RC_EXPORT size_t RC_CCONV rc_client_progress_size(rc_client_t* client); + +/** + * Serializes the runtime state into a buffer. + * Returns RC_OK on success, or an error indicator. + * [deprecated] use rc_client_serialize_progress_sized instead + */ +RC_EXPORT int RC_CCONV rc_client_serialize_progress(rc_client_t* client, uint8_t* buffer); + +/** + * Serializes the runtime state into a buffer. + * Returns RC_OK on success, or an error indicator. + */ +RC_EXPORT int RC_CCONV rc_client_serialize_progress_sized(rc_client_t* client, uint8_t* buffer, size_t buffer_size); + +/** + * Deserializes the runtime state from a buffer. + * Returns RC_OK on success, or an error indicator. + * [deprecated] use rc_client_deserialize_progress_sized instead + */ +RC_EXPORT int RC_CCONV rc_client_deserialize_progress(rc_client_t* client, const uint8_t* serialized); + +/** + * Serializes the runtime state into a buffer. + * Returns RC_OK on success, or an error indicator. + */ +RC_EXPORT int RC_CCONV rc_client_deserialize_progress_sized(rc_client_t* client, const uint8_t* serialized, size_t serialized_size); + +RC_END_C_DECLS + +#endif /* RC_RUNTIME_H */ diff --git a/src/rcheevos/include/rc_client_raintegration.h b/src/rcheevos/include/rc_client_raintegration.h new file mode 100644 index 0000000000..847c8ad225 --- /dev/null +++ b/src/rcheevos/include/rc_client_raintegration.h @@ -0,0 +1,101 @@ +#ifndef RC_CLIENT_RAINTEGRATION_H +#define RC_CLIENT_RAINTEGRATION_H + +#ifndef _WIN32 + #undef RC_CLIENT_SUPPORTS_RAINTEGRATION /* Windows required for RAIntegration */ +#endif + +#include + +#include "rc_export.h" + +RC_BEGIN_C_DECLS + +typedef struct rc_client_t rc_client_t; /* forward reference; in rc_client.h */ + +/* types needed to implement raintegration */ + +typedef struct rc_client_raintegration_menu_item_t { + const char* label; + uint32_t id; + uint8_t checked; + uint8_t enabled; +} rc_client_raintegration_menu_item_t; + +typedef struct rc_client_raintegration_menu_t { + rc_client_raintegration_menu_item_t* items; + uint32_t num_items; +} rc_client_raintegration_menu_t; + +enum { + RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_NONE = 0, + RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_PUBLISHED = 1, + RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_LOCAL = 2, + RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_MODIFIED = 3, + RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_INSECURE = 4, +}; + +enum { + RC_CLIENT_RAINTEGRATION_EVENT_TYPE_NONE = 0, + RC_CLIENT_RAINTEGRATION_EVENT_MENUITEM_CHECKED_CHANGED = 1, /* [menu_item] checked changed */ + RC_CLIENT_RAINTEGRATION_EVENT_HARDCORE_CHANGED = 2, /* hardcore was enabled or disabled */ + RC_CLIENT_RAINTEGRATION_EVENT_PAUSE = 3, /* emulated system should be paused */ + RC_CLIENT_RAINTEGRATION_EVENT_MENU_CHANGED = 4 /* one or more items were added/removed from the menu and it should be rebuilt */ +}; + +typedef struct rc_client_raintegration_event_t { + uint32_t type; + + const rc_client_raintegration_menu_item_t* menu_item; +} rc_client_raintegration_event_t; + +typedef void (RC_CCONV *rc_client_raintegration_event_handler_t)(const rc_client_raintegration_event_t* event, + rc_client_t* client); + +typedef void (RC_CCONV *rc_client_raintegration_write_memory_func_t)(uint32_t address, uint8_t* buffer, + uint32_t num_bytes, rc_client_t* client); + +typedef void (RC_CCONV* rc_client_raintegration_get_game_name_func_t)(char* buffer, uint32_t buffer_size, rc_client_t* client); + +/* types needed to integrate raintegration */ + +#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION + +#ifndef RC_CLIENT_SUPPORTS_EXTERNAL + #define RC_CLIENT_SUPPORTS_EXTERNAL /* external rc_client required for RAIntegration */ +#endif + +#include /* HWND */ + +#include "rc_client.h" + +RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_load_raintegration(rc_client_t* client, + const wchar_t* search_directory, HWND main_window_handle, + const char* client_name, const char* client_version, + rc_client_callback_t callback, void* callback_userdata); + +RC_EXPORT void RC_CCONV rc_client_unload_raintegration(rc_client_t* client); + +RC_EXPORT void RC_CCONV rc_client_raintegration_update_main_window_handle(rc_client_t* client, HWND main_window_handle); + +RC_EXPORT const rc_client_raintegration_menu_t* RC_CCONV rc_client_raintegration_get_menu(const rc_client_t* client); + +RC_EXPORT void RC_CCONV rc_client_raintegration_rebuild_submenu(rc_client_t* client, HMENU hMenu); +RC_EXPORT void RC_CCONV rc_client_raintegration_update_menu_item(const rc_client_t* client, const rc_client_raintegration_menu_item_t* menu_item); +RC_EXPORT int RC_CCONV rc_client_raintegration_activate_menu_item(const rc_client_t* client, uint32_t menu_item_id); + +RC_EXPORT void RC_CCONV rc_client_raintegration_set_write_memory_function(rc_client_t* client, rc_client_raintegration_write_memory_func_t handler); +RC_EXPORT void RC_CCONV rc_client_raintegration_set_get_game_name_function(rc_client_t* client, rc_client_raintegration_get_game_name_func_t handler); +RC_EXPORT void RC_CCONV rc_client_raintegration_set_console_id(rc_client_t* client, uint32_t console_id); +RC_EXPORT int RC_CCONV rc_client_raintegration_has_modifications(const rc_client_t* client); + +RC_EXPORT void RC_CCONV rc_client_raintegration_set_event_handler(rc_client_t* client, + rc_client_raintegration_event_handler_t handler); + +RC_EXPORT int RC_CCONV rc_client_raintegration_get_achievement_state(const rc_client_t* client, uint32_t achievement_id); + +#endif /* RC_CLIENT_SUPPORTS_RAINTEGRATION */ + +RC_END_C_DECLS + +#endif /* RC_CLIENT_RAINTEGRATION_H */ diff --git a/src/rcheevos/include/rc_consoles.h b/src/rcheevos/include/rc_consoles.h new file mode 100644 index 0000000000..5f788855b1 --- /dev/null +++ b/src/rcheevos/include/rc_consoles.h @@ -0,0 +1,138 @@ +#ifndef RC_CONSOLES_H +#define RC_CONSOLES_H + +#include "rc_export.h" + +#include + +RC_BEGIN_C_DECLS + +/*****************************************************************************\ +| Console identifiers | +\*****************************************************************************/ + +enum { + RC_CONSOLE_UNKNOWN = 0, + RC_CONSOLE_MEGA_DRIVE = 1, + RC_CONSOLE_NINTENDO_64 = 2, + RC_CONSOLE_SUPER_NINTENDO = 3, + RC_CONSOLE_GAMEBOY = 4, + RC_CONSOLE_GAMEBOY_ADVANCE = 5, + RC_CONSOLE_GAMEBOY_COLOR = 6, + RC_CONSOLE_NINTENDO = 7, + RC_CONSOLE_PC_ENGINE = 8, + RC_CONSOLE_SEGA_CD = 9, + RC_CONSOLE_SEGA_32X = 10, + RC_CONSOLE_MASTER_SYSTEM = 11, + RC_CONSOLE_PLAYSTATION = 12, + RC_CONSOLE_ATARI_LYNX = 13, + RC_CONSOLE_NEOGEO_POCKET = 14, + RC_CONSOLE_GAME_GEAR = 15, + RC_CONSOLE_GAMECUBE = 16, + RC_CONSOLE_ATARI_JAGUAR = 17, + RC_CONSOLE_NINTENDO_DS = 18, + RC_CONSOLE_WII = 19, + RC_CONSOLE_WII_U = 20, + RC_CONSOLE_PLAYSTATION_2 = 21, + RC_CONSOLE_XBOX = 22, + RC_CONSOLE_MAGNAVOX_ODYSSEY2 = 23, + RC_CONSOLE_POKEMON_MINI = 24, + RC_CONSOLE_ATARI_2600 = 25, + RC_CONSOLE_MS_DOS = 26, + RC_CONSOLE_ARCADE = 27, + RC_CONSOLE_VIRTUAL_BOY = 28, + RC_CONSOLE_MSX = 29, + RC_CONSOLE_COMMODORE_64 = 30, + RC_CONSOLE_ZX81 = 31, + RC_CONSOLE_ORIC = 32, + RC_CONSOLE_SG1000 = 33, + RC_CONSOLE_VIC20 = 34, + RC_CONSOLE_AMIGA = 35, + RC_CONSOLE_ATARI_ST = 36, + RC_CONSOLE_AMSTRAD_PC = 37, + RC_CONSOLE_APPLE_II = 38, + RC_CONSOLE_SATURN = 39, + RC_CONSOLE_DREAMCAST = 40, + RC_CONSOLE_PSP = 41, + RC_CONSOLE_CDI = 42, + RC_CONSOLE_3DO = 43, + RC_CONSOLE_COLECOVISION = 44, + RC_CONSOLE_INTELLIVISION = 45, + RC_CONSOLE_VECTREX = 46, + RC_CONSOLE_PC8800 = 47, + RC_CONSOLE_PC9800 = 48, + RC_CONSOLE_PCFX = 49, + RC_CONSOLE_ATARI_5200 = 50, + RC_CONSOLE_ATARI_7800 = 51, + RC_CONSOLE_X68K = 52, + RC_CONSOLE_WONDERSWAN = 53, + RC_CONSOLE_CASSETTEVISION = 54, + RC_CONSOLE_SUPER_CASSETTEVISION = 55, + RC_CONSOLE_NEO_GEO_CD = 56, + RC_CONSOLE_FAIRCHILD_CHANNEL_F = 57, + RC_CONSOLE_FM_TOWNS = 58, + RC_CONSOLE_ZX_SPECTRUM = 59, + RC_CONSOLE_GAME_AND_WATCH = 60, + RC_CONSOLE_NOKIA_NGAGE = 61, + RC_CONSOLE_NINTENDO_3DS = 62, + RC_CONSOLE_SUPERVISION = 63, + RC_CONSOLE_SHARPX1 = 64, + RC_CONSOLE_TIC80 = 65, + RC_CONSOLE_THOMSONTO8 = 66, + RC_CONSOLE_PC6000 = 67, + RC_CONSOLE_PICO = 68, + RC_CONSOLE_MEGADUCK = 69, + RC_CONSOLE_ZEEBO = 70, + RC_CONSOLE_ARDUBOY = 71, + RC_CONSOLE_WASM4 = 72, + RC_CONSOLE_ARCADIA_2001 = 73, + RC_CONSOLE_INTERTON_VC_4000 = 74, + RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER = 75, + RC_CONSOLE_PC_ENGINE_CD = 76, + RC_CONSOLE_ATARI_JAGUAR_CD = 77, + RC_CONSOLE_NINTENDO_DSI = 78, + RC_CONSOLE_TI83 = 79, + RC_CONSOLE_UZEBOX = 80, + RC_CONSOLE_FAMICOM_DISK_SYSTEM = 81, + + RC_CONSOLE_HUBS = 100, + RC_CONSOLE_EVENTS = 101, + RC_CONSOLE_STANDALONE = 102 +}; + +RC_EXPORT const char* RC_CCONV rc_console_name(uint32_t console_id); + +/*****************************************************************************\ +| Memory mapping | +\*****************************************************************************/ + +enum { + RC_MEMORY_TYPE_SYSTEM_RAM, /* normal system memory */ + RC_MEMORY_TYPE_SAVE_RAM, /* memory that persists between sessions */ + RC_MEMORY_TYPE_VIDEO_RAM, /* memory reserved for graphical processing */ + RC_MEMORY_TYPE_READONLY, /* memory that maps to read only data */ + RC_MEMORY_TYPE_HARDWARE_CONTROLLER, /* memory for interacting with system components */ + RC_MEMORY_TYPE_VIRTUAL_RAM, /* secondary address space that maps to real memory in system RAM */ + RC_MEMORY_TYPE_UNUSED /* these addresses don't really exist */ +}; + +typedef struct rc_memory_region_t { + uint32_t start_address; /* first address of block as queried by RetroAchievements */ + uint32_t end_address; /* last address of block as queried by RetroAchievements */ + uint32_t real_address; /* real address for first address of block */ + uint8_t type; /* RC_MEMORY_TYPE_ for block */ + const char* description; /* short description of block */ +} +rc_memory_region_t; + +typedef struct rc_memory_regions_t { + const rc_memory_region_t* region; + uint32_t num_regions; +} +rc_memory_regions_t; + +RC_EXPORT const rc_memory_regions_t* RC_CCONV rc_console_memory_regions(uint32_t console_id); + +RC_END_C_DECLS + +#endif /* RC_CONSOLES_H */ diff --git a/src/rcheevos/include/rc_error.h b/src/rcheevos/include/rc_error.h new file mode 100644 index 0000000000..5d253442da --- /dev/null +++ b/src/rcheevos/include/rc_error.h @@ -0,0 +1,59 @@ +#ifndef RC_ERROR_H +#define RC_ERROR_H + +#include "rc_export.h" + +RC_BEGIN_C_DECLS + +/*****************************************************************************\ +| Return values | +\*****************************************************************************/ + +enum { + RC_OK = 0, + RC_INVALID_FUNC_OPERAND = -1, + RC_INVALID_MEMORY_OPERAND = -2, + RC_INVALID_CONST_OPERAND = -3, + RC_INVALID_FP_OPERAND = -4, + RC_INVALID_CONDITION_TYPE = -5, + RC_INVALID_OPERATOR = -6, + RC_INVALID_REQUIRED_HITS = -7, + RC_DUPLICATED_START = -8, + RC_DUPLICATED_CANCEL = -9, + RC_DUPLICATED_SUBMIT = -10, + RC_DUPLICATED_VALUE = -11, + RC_DUPLICATED_PROGRESS = -12, + RC_MISSING_START = -13, + RC_MISSING_CANCEL = -14, + RC_MISSING_SUBMIT = -15, + RC_MISSING_VALUE = -16, + RC_INVALID_LBOARD_FIELD = -17, + RC_MISSING_DISPLAY_STRING = -18, + RC_OUT_OF_MEMORY = -19, + RC_INVALID_VALUE_FLAG = -20, + RC_MISSING_VALUE_MEASURED = -21, + RC_MULTIPLE_MEASURED = -22, + RC_INVALID_MEASURED_TARGET = -23, + RC_INVALID_COMPARISON = -24, + RC_INVALID_STATE = -25, + RC_INVALID_JSON = -26, + RC_API_FAILURE = -27, + RC_LOGIN_REQUIRED = -28, + RC_NO_GAME_LOADED = -29, + RC_HARDCORE_DISABLED = -30, + RC_ABORTED = -31, + RC_NO_RESPONSE = -32, + RC_ACCESS_DENIED = -33, + RC_INVALID_CREDENTIALS = -34, + RC_EXPIRED_TOKEN = -35, + RC_INSUFFICIENT_BUFFER = -36, + RC_INVALID_VARIABLE_NAME = -37, + RC_UNKNOWN_VARIABLE_NAME = -38, + RC_NOT_FOUND = -39 +}; + +RC_EXPORT const char* RC_CCONV rc_error_str(int ret); + +RC_END_C_DECLS + +#endif /* RC_ERROR_H */ diff --git a/src/rcheevos/include/rc_export.h b/src/rcheevos/include/rc_export.h new file mode 100644 index 0000000000..9471acd480 --- /dev/null +++ b/src/rcheevos/include/rc_export.h @@ -0,0 +1,100 @@ +#ifndef RC_EXPORT_H +#define RC_EXPORT_H + +/* These macros control how callbacks and public functions are defined */ + +/* RC_SHARED should be defined when building rcheevos as a shared library (e.g. dll/dylib/so). External code should not define this macro. */ +/* RC_STATIC should be defined when building rcheevos as a static library. External code should also define this macro. */ +/* RC_IMPORT should be defined for external code using rcheevos as a shared library. */ + +/* For compatibility, if none of these three macros are defined, then the build is assumed to be RC_STATIC */ + +#if !defined(RC_SHARED) && !defined(RC_STATIC) && !defined(RC_IMPORT) + #define RC_STATIC +#endif + +#if (defined(RC_SHARED) && defined(RC_STATIC)) || (defined(RC_SHARED) && defined(RC_IMPORT)) || (defined(RC_STATIC) && defined(RC_IMPORT)) + #error RC_SHARED, RC_STATIC, and RC_IMPORT are mutually exclusive +#endif + +/* RC_BEGIN_C_DECLS and RC_END_C_DECLS should be used for all headers, to enforce C linkage and the C calling convention */ +/* RC_BEGIN_C_DECLS should be placed after #include's and before header declarations */ +/* RC_END_C_DECLS should be placed after header declarations */ + +/* example usage + * + * #ifndef RC_HEADER_H + * #define RC_HEADER_H + * + * #include + * + * RC_BEGIN_C_DECLS + * + * uint8_t rc_function(void); + * + * RC_END_C_DECLS + * + * #endif + */ + +#if defined(__cplusplus) && !defined(CXX_BUILD) + #define RC_BEGIN_C_DECLS extern "C" { + #define RC_END_C_DECLS } +#else + #define RC_BEGIN_C_DECLS + #define RC_END_C_DECLS +#endif + +/* RC_CCONV should be used for public functions and callbacks, to enforce the cdecl calling convention, if applicable */ +/* RC_CCONV should be placed after the return type, and between the ( and * for callbacks */ + +/* example usage */ +/* void RC_CCONV rc_function(void) */ +/* void (RC_CCONV *rc_callback)(void) */ + +#if defined(_WIN32) + /* Windows compilers will ignore __cdecl when not applicable */ + #define RC_CCONV __cdecl +#elif defined(__GNUC__) && defined(__i386__) + /* GNU C compilers will warn if cdecl is defined on an unsupported platform */ + #define RC_CCONV __attribute__((cdecl)) +#else + #define RC_CCONV +#endif + +/* RC_EXPORT should be used for public functions */ +/* RC_EXPORT will provide necessary hints for shared library usage, if applicable */ +/* RC_EXPORT should be placed before the return type */ + +/* example usage */ +/* RC_EXPORT void rc_function(void) */ + +#ifdef RC_SHARED + #if defined(_WIN32) + #define RC_EXPORT __declspec(dllexport) + #elif defined(__GNUC__) && __GNUC__ >= 4 + #define RC_EXPORT __attribute__((visibility("default"))) + #else + #define RC_EXPORT + #endif +#endif + +#ifdef RC_IMPORT + #if defined(_WIN32) + #define RC_EXPORT __declspec(dllimport) + #elif defined(__GNUC__) && __GNUC__ >= 4 + #define RC_EXPORT __attribute__((visibility("default"))) + #else + #define RC_EXPORT + #endif +#endif + +#ifdef RC_STATIC + #if defined(__GNUC__) && __GNUC__ >= 4 + #define RC_EXPORT __attribute__((visibility("default"))) + #else + #define RC_EXPORT + #endif +#endif + +#endif /* RC_EXPORT_H */ diff --git a/src/rcheevos/include/rc_hash.h b/src/rcheevos/include/rc_hash.h new file mode 100644 index 0000000000..be1d378123 --- /dev/null +++ b/src/rcheevos/include/rc_hash.h @@ -0,0 +1,200 @@ +#ifndef RC_HASH_H +#define RC_HASH_H + +#include +#include +#include + +#include "rc_consoles.h" + +RC_BEGIN_C_DECLS + + struct rc_hash_iterator; + + /* ===================================================== */ + + typedef void (RC_CCONV *rc_hash_message_callback_deprecated)(const char*); + + /* specifies a function to call when an error occurs to display the error message */ + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_error_message_callback(rc_hash_message_callback_deprecated callback); + + /* specifies a function to call for verbose logging */ + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void rc_hash_init_verbose_message_callback(rc_hash_message_callback_deprecated callback); + + /* ===================================================== */ + + /* opens a file */ + typedef void* (RC_CCONV *rc_hash_filereader_open_file_handler)(const char* path_utf8); + + /* moves the file pointer - standard fseek parameters */ + typedef void (RC_CCONV *rc_hash_filereader_seek_handler)(void* file_handle, int64_t offset, int origin); + + /* locates the file pointer */ + typedef int64_t (RC_CCONV *rc_hash_filereader_tell_handler)(void* file_handle); + + /* reads the specified number of bytes from the file starting at the read pointer. + * returns the number of bytes actually read. + */ + typedef size_t (RC_CCONV *rc_hash_filereader_read_handler)(void* file_handle, void* buffer, size_t requested_bytes); + + /* closes the file */ + typedef void (RC_CCONV *rc_hash_filereader_close_file_handler)(void* file_handle); + + typedef struct rc_hash_filereader + { + rc_hash_filereader_open_file_handler open; + rc_hash_filereader_seek_handler seek; + rc_hash_filereader_tell_handler tell; + rc_hash_filereader_read_handler read; + rc_hash_filereader_close_file_handler close; + } rc_hash_filereader_t; + + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_custom_filereader(struct rc_hash_filereader* reader); + + /* ===================================================== */ + +#ifndef RC_HASH_NO_DISC + + #define RC_HASH_CDTRACK_FIRST_DATA ((uint32_t)-1) /* the first data track (skip audio tracks) */ + #define RC_HASH_CDTRACK_LAST ((uint32_t)-2) /* the last data/audio track */ + #define RC_HASH_CDTRACK_LARGEST ((uint32_t)-3) /* the largest data/audio track */ + #define RC_HASH_CDTRACK_FIRST_OF_SECOND_SESSION ((uint32_t)-4) /* the first data/audio track of the second session */ + + /* opens a track from the specified file. see the RC_HASH_CDTRACK_ defines for special tracks. + * returns a handle to be passed to the other functions, or NULL if the track could not be opened. + */ + typedef void* (RC_CCONV *rc_hash_cdreader_open_track_handler)(const char* path, uint32_t track); + typedef void* (RC_CCONV* rc_hash_cdreader_open_track_iterator_handler)(const char* path, uint32_t track, const struct rc_hash_iterator* iterator); + + /* attempts to read the specified number of bytes from the file starting at the specified absolute sector. + * returns the number of bytes actually read. + */ + typedef size_t (RC_CCONV *rc_hash_cdreader_read_sector_handler)(void* track_handle, uint32_t sector, void* buffer, size_t requested_bytes); + + /* closes the track handle */ + typedef void (RC_CCONV *rc_hash_cdreader_close_track_handler)(void* track_handle); + + /* gets the absolute sector index for the first sector of a track */ + typedef uint32_t(RC_CCONV *rc_hash_cdreader_first_track_sector_handler)(void* track_handle); + + typedef struct rc_hash_cdreader + { + rc_hash_cdreader_open_track_handler open_track; + rc_hash_cdreader_read_sector_handler read_sector; + rc_hash_cdreader_close_track_handler close_track; + rc_hash_cdreader_first_track_sector_handler first_track_sector; + rc_hash_cdreader_open_track_iterator_handler open_track_iterator; + } rc_hash_cdreader_t; + + RC_EXPORT void RC_CCONV rc_hash_get_default_cdreader(struct rc_hash_cdreader* cdreader); + /* [deprecated] don't set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_default_cdreader(void); + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_custom_cdreader(struct rc_hash_cdreader* reader); + +#endif /* RC_HASH_NO_DISC */ + +#ifndef RC_HASH_NO_ENCRYPTED + + /* specifies a function called to obtain a 3DS CIA decryption normal key. + * this key would be derived from slot0x3DKeyX and the common key specified by the passed index. + * the normal key should be written in big endian format + * returns non-zero on success, or zero on failure. + */ + typedef int (RC_CCONV *rc_hash_3ds_get_cia_normal_key_func)(uint8_t common_key_index, uint8_t out_normal_key[16]); + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_3ds_get_cia_normal_key_func(rc_hash_3ds_get_cia_normal_key_func func); + + /* specifies a function called to obtain 3DS NCCH decryption normal keys. + * the primary key will always use slot0x2CKeyX and the passed primary KeyY. + * the secondary key will use the KeyX slot passed + * the secondary KeyY will be identical to the primary keyY if the passed program id is NULL + * if the program id is not null, then the secondary KeyY will be obtained with "seed crypto" + * with "seed crypto" the 8 byte program id can be used to obtain a 16 byte "seed" within the seeddb.bin firmware file + * the primary KeyY then the seed will then be hashed with SHA256, and the upper 16 bytes of the digest will be the secondary KeyY used + * the normal keys should be written in big endian format + * returns non-zero on success, or zero on failure. + */ + typedef int (RC_CCONV *rc_hash_3ds_get_ncch_normal_keys_func)(uint8_t primary_key_y[16], uint8_t secondary_key_x_slot, uint8_t* optional_program_id, + uint8_t out_primary_key[16], uint8_t out_secondary_key[16]); + /* [deprecated] set callbacks in rc_hash_iterator_t */ + RC_EXPORT void RC_CCONV rc_hash_init_3ds_get_ncch_normal_keys_func(rc_hash_3ds_get_ncch_normal_keys_func func); + +#endif /* RC_HASH_NO_ENCRYPTED */ + +/* ===================================================== */ + +typedef void (RC_CCONV* rc_hash_message_callback_func)(const char*, const struct rc_hash_iterator* iterator); + +typedef struct rc_hash_callbacks { + rc_hash_message_callback_func verbose_message; + rc_hash_message_callback_func error_message; + + rc_hash_filereader_t filereader; +#ifndef RC_HASH_NO_DISC + rc_hash_cdreader_t cdreader; +#endif + +#ifndef RC_HASH_NO_ENCRYPTED + struct rc_hash_encryption_callbacks { + rc_hash_3ds_get_cia_normal_key_func get_3ds_cia_normal_key; + rc_hash_3ds_get_ncch_normal_keys_func get_3ds_ncch_normal_keys; + } encryption; +#endif +} rc_hash_callbacks_t; + +/* data for rc_hash_iterate + */ +typedef struct rc_hash_iterator { + const uint8_t* buffer; + size_t buffer_size; + uint8_t consoles[12]; + int index; + const char* path; + void* userdata; + + rc_hash_callbacks_t callbacks; +} rc_hash_iterator_t; + +/* initializes a rc_hash_iterator + * - path must be provided + * - if buffer and buffer_size are provided, path may be a filename (i.e. for something extracted from a zip file) + */ +RC_EXPORT void RC_CCONV rc_hash_initialize_iterator(rc_hash_iterator_t* iterator, const char* path, const uint8_t* buffer, size_t buffer_size); + +/* releases resources associated to a rc_hash_iterator + */ +RC_EXPORT void RC_CCONV rc_hash_destroy_iterator(rc_hash_iterator_t* iterator); + +/* generates the next hash for the data in the rc_hash_iterator. + * returns non-zero if a hash was generated, or zero if no more hashes can be generated for the data. + */ +RC_EXPORT int RC_CCONV rc_hash_iterate(char hash[33], rc_hash_iterator_t* iterator); + +/* generates a hash for the data in the rc_hash_iterator. + * returns non-zero if a hash was generated. + */ +RC_EXPORT int RC_CCONV rc_hash_generate(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator); + +/* ===================================================== */ + +/* generates a hash from a block of memory. + * returns non-zero on success, or zero on failure. + */ +/* [deprecated] use rc_hash_generate instead */ +RC_EXPORT int RC_CCONV rc_hash_generate_from_buffer(char hash[33], uint32_t console_id, const uint8_t* buffer, size_t buffer_size); + +/* generates a hash from a file. + * returns non-zero on success, or zero on failure. + */ +/* [deprecated] use rc_hash_generate instead */ +RC_EXPORT int RC_CCONV rc_hash_generate_from_file(char hash[33], uint32_t console_id, const char* path); + +/* ===================================================== */ + +RC_END_C_DECLS + +#endif /* RC_HASH_H */ diff --git a/src/rcheevos/include/rc_runtime.h b/src/rcheevos/include/rc_runtime.h new file mode 100644 index 0000000000..88b12dea27 --- /dev/null +++ b/src/rcheevos/include/rc_runtime.h @@ -0,0 +1,148 @@ +#ifndef RC_RUNTIME_H +#define RC_RUNTIME_H + +#include "rc_error.h" + +#include +#include + +RC_BEGIN_C_DECLS + +/*****************************************************************************\ +| Forward Declarations (defined in rc_runtime_types.h) | +\*****************************************************************************/ + +#ifndef RC_RUNTIME_TYPES_H /* prevents pedantic redefinition error */ + +typedef struct rc_trigger_t rc_trigger_t; +typedef struct rc_lboard_t rc_lboard_t; +typedef struct rc_richpresence_t rc_richpresence_t; +typedef struct rc_memref_t rc_memref_t; +typedef struct rc_value_t rc_value_t; + +#endif + +/*****************************************************************************\ +| Callbacks | +\*****************************************************************************/ + +/** + * Callback used to read num_bytes bytes from memory starting at address. If + * num_bytes is greater than 1, the value is read in little-endian from + * memory. + */ +typedef uint32_t(RC_CCONV *rc_runtime_peek_t)(uint32_t address, uint32_t num_bytes, void* ud); + +/*****************************************************************************\ +| Runtime | +\*****************************************************************************/ + +typedef struct rc_runtime_trigger_t { + uint32_t id; + rc_trigger_t* trigger; + void* buffer; + rc_memref_t* invalid_memref; + uint8_t md5[16]; + int32_t serialized_size; +} +rc_runtime_trigger_t; + +typedef struct rc_runtime_lboard_t { + uint32_t id; + int32_t value; + rc_lboard_t* lboard; + void* buffer; + rc_memref_t* invalid_memref; + uint8_t md5[16]; + uint32_t serialized_size; +} +rc_runtime_lboard_t; + +typedef struct rc_runtime_richpresence_t { + rc_richpresence_t* richpresence; + void* buffer; + uint8_t md5[16]; +} +rc_runtime_richpresence_t; + +typedef struct rc_runtime_t { + rc_runtime_trigger_t* triggers; + uint32_t trigger_count; + uint32_t trigger_capacity; + + rc_runtime_lboard_t* lboards; + uint32_t lboard_count; + uint32_t lboard_capacity; + + rc_runtime_richpresence_t* richpresence; + + struct rc_memrefs_t* memrefs; + + uint8_t owns_self; +} +rc_runtime_t; + +RC_EXPORT rc_runtime_t* RC_CCONV rc_runtime_alloc(void); +RC_EXPORT void RC_CCONV rc_runtime_init(rc_runtime_t* runtime); +RC_EXPORT void RC_CCONV rc_runtime_destroy(rc_runtime_t* runtime); + +RC_EXPORT int RC_CCONV rc_runtime_activate_achievement(rc_runtime_t* runtime, uint32_t id, const char* memaddr, void* unused_L, int unused_funcs_idx); +RC_EXPORT void RC_CCONV rc_runtime_deactivate_achievement(rc_runtime_t* runtime, uint32_t id); +RC_EXPORT rc_trigger_t* RC_CCONV rc_runtime_get_achievement(const rc_runtime_t* runtime, uint32_t id); +RC_EXPORT int RC_CCONV rc_runtime_get_achievement_measured(const rc_runtime_t* runtime, uint32_t id, unsigned* measured_value, unsigned* measured_target); +RC_EXPORT int RC_CCONV rc_runtime_format_achievement_measured(const rc_runtime_t* runtime, uint32_t id, char *buffer, size_t buffer_size); + +RC_EXPORT int RC_CCONV rc_runtime_activate_lboard(rc_runtime_t* runtime, uint32_t id, const char* memaddr, void* unused_L, int unused_funcs_idx); +RC_EXPORT void RC_CCONV rc_runtime_deactivate_lboard(rc_runtime_t* runtime, uint32_t id); +RC_EXPORT rc_lboard_t* RC_CCONV rc_runtime_get_lboard(const rc_runtime_t* runtime, uint32_t id); +RC_EXPORT int RC_CCONV rc_runtime_format_lboard_value(char* buffer, int size, int32_t value, int format); + + +RC_EXPORT int RC_CCONV rc_runtime_activate_richpresence(rc_runtime_t* runtime, const char* script, void* unused_L, int unused_funcs_idx); +RC_EXPORT int RC_CCONV rc_runtime_get_richpresence(const rc_runtime_t* runtime, char* buffer, size_t buffersize, rc_runtime_peek_t peek, void* peek_ud, void* unused_L); + +enum { + RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED, /* from WAITING, PAUSED, or PRIMED to ACTIVE */ + RC_RUNTIME_EVENT_ACHIEVEMENT_PAUSED, + RC_RUNTIME_EVENT_ACHIEVEMENT_RESET, + RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED, + RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED, + RC_RUNTIME_EVENT_LBOARD_STARTED, + RC_RUNTIME_EVENT_LBOARD_CANCELED, + RC_RUNTIME_EVENT_LBOARD_UPDATED, + RC_RUNTIME_EVENT_LBOARD_TRIGGERED, + RC_RUNTIME_EVENT_ACHIEVEMENT_DISABLED, + RC_RUNTIME_EVENT_LBOARD_DISABLED, + RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED, + RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED +}; + +typedef struct rc_runtime_event_t { + uint32_t id; + int32_t value; + uint8_t type; +} +rc_runtime_event_t; + +typedef void (RC_CCONV *rc_runtime_event_handler_t)(const rc_runtime_event_t* runtime_event); + +RC_EXPORT void RC_CCONV rc_runtime_do_frame(rc_runtime_t* runtime, rc_runtime_event_handler_t event_handler, rc_runtime_peek_t peek, void* ud, void* unused_L); +RC_EXPORT void RC_CCONV rc_runtime_reset(rc_runtime_t* runtime); + +typedef int (RC_CCONV *rc_runtime_validate_address_t)(uint32_t address); +RC_EXPORT void RC_CCONV rc_runtime_validate_addresses(rc_runtime_t* runtime, rc_runtime_event_handler_t event_handler, rc_runtime_validate_address_t validate_handler); +RC_EXPORT void RC_CCONV rc_runtime_invalidate_address(rc_runtime_t* runtime, uint32_t address); + +RC_EXPORT uint32_t RC_CCONV rc_runtime_progress_size(const rc_runtime_t* runtime, void* unused_L); + +/* [deprecated] use rc_runtime_serialize_progress_sized instead */ +RC_EXPORT int RC_CCONV rc_runtime_serialize_progress(void* buffer, const rc_runtime_t* runtime, void* unused_L); +RC_EXPORT int RC_CCONV rc_runtime_serialize_progress_sized(uint8_t* buffer, uint32_t buffer_size, const rc_runtime_t* runtime, void* unused_L); + +/* [deprecated] use rc_runtime_deserialize_progress_sized instead */ +RC_EXPORT int RC_CCONV rc_runtime_deserialize_progress(rc_runtime_t* runtime, const uint8_t* serialized, void* unused_L); +RC_EXPORT int RC_CCONV rc_runtime_deserialize_progress_sized(rc_runtime_t* runtime, const uint8_t* serialized, uint32_t serialized_size, void* unused_L); + +RC_END_C_DECLS + +#endif /* RC_RUNTIME_H */ diff --git a/src/rcheevos/include/rc_runtime_types.h b/src/rcheevos/include/rc_runtime_types.h new file mode 100644 index 0000000000..e17797063c --- /dev/null +++ b/src/rcheevos/include/rc_runtime_types.h @@ -0,0 +1,452 @@ +#ifndef RC_RUNTIME_TYPES_H +#define RC_RUNTIME_TYPES_H + +#include "rc_error.h" + +#include +#include + +RC_BEGIN_C_DECLS + +#ifndef RC_RUNTIME_H /* prevents pedantic redefiniton error */ + +typedef struct rc_trigger_t rc_trigger_t; +typedef struct rc_lboard_t rc_lboard_t; +typedef struct rc_richpresence_t rc_richpresence_t; +typedef struct rc_memref_t rc_memref_t; +typedef struct rc_value_t rc_value_t; + +#endif + +/*****************************************************************************\ +| Callbacks | +\*****************************************************************************/ + +/** + * Callback used to read num_bytes bytes from memory starting at address. If + * num_bytes is greater than 1, the value is read in little-endian from + * memory. + */ +typedef uint32_t(RC_CCONV* rc_peek_t)(uint32_t address, uint32_t num_bytes, void* ud); + +/*****************************************************************************\ +| Memory References | +\*****************************************************************************/ + +/* Sizes. */ +enum { + RC_MEMSIZE_8_BITS, + RC_MEMSIZE_16_BITS, + RC_MEMSIZE_24_BITS, + RC_MEMSIZE_32_BITS, + RC_MEMSIZE_LOW, + RC_MEMSIZE_HIGH, + RC_MEMSIZE_BIT_0, + RC_MEMSIZE_BIT_1, + RC_MEMSIZE_BIT_2, + RC_MEMSIZE_BIT_3, + RC_MEMSIZE_BIT_4, + RC_MEMSIZE_BIT_5, + RC_MEMSIZE_BIT_6, + RC_MEMSIZE_BIT_7, + RC_MEMSIZE_BITCOUNT, + RC_MEMSIZE_16_BITS_BE, + RC_MEMSIZE_24_BITS_BE, + RC_MEMSIZE_32_BITS_BE, + RC_MEMSIZE_FLOAT, + RC_MEMSIZE_MBF32, + RC_MEMSIZE_MBF32_LE, + RC_MEMSIZE_FLOAT_BE, + RC_MEMSIZE_DOUBLE32, + RC_MEMSIZE_DOUBLE32_BE, + RC_MEMSIZE_VARIABLE +}; + +typedef struct rc_memref_value_t { + /* The current value of this memory reference. */ + uint32_t value; + /* The last differing value of this memory reference. */ + uint32_t prior; + + /* The size of the value. (RC_MEMSIZE_*) */ + uint8_t size; + /* True if the value changed this frame. */ + uint8_t changed; + /* The value type of the value. (RC_VALUE_TYPE_*) */ + uint8_t type; + /* The type of memref (RC_MEMREF_TYPE_*) */ + uint8_t memref_type; +} +rc_memref_value_t; + +struct rc_memref_t { + /* The current value at the specified memory address. */ + rc_memref_value_t value; + + /* The memory address of this variable. */ + uint32_t address; +}; + +/*****************************************************************************\ +| Operands | +\*****************************************************************************/ + +/* types */ +enum { + RC_OPERAND_ADDRESS, /* The value of a live address in RAM. */ + RC_OPERAND_DELTA, /* The value last known at this address. */ + RC_OPERAND_CONST, /* A 32-bit unsigned integer. */ + RC_OPERAND_FP, /* A floating point value. */ + RC_OPERAND_FUNC, /* A function that provides the value. */ + RC_OPERAND_PRIOR, /* The last differing value at this address. */ + RC_OPERAND_BCD, /* The BCD-decoded value of a live address in RAM. */ + RC_OPERAND_INVERTED, /* The twos-complement value of a live address in RAM. */ + RC_OPERAND_RECALL /* The value captured by the last RC_CONDITION_REMEMBER condition */ +}; + +typedef struct rc_operand_t { + union { + /* A value read from memory. */ + rc_memref_t* memref; + + /* An integer value. */ + uint32_t num; + + /* A floating point value. */ + double dbl; + } value; + + /* specifies which member of the value union is being used (RC_OPERAND_*) */ + uint8_t type; + + /* the RC_MEMSIZE of the operand specified in the condition definition - memref.size may differ */ + uint8_t size; + + /* specifies how to read the memref for some types (RC_OPERAND_*) */ + uint8_t memref_access_type; + + /* if set, this operand is combining the current condition with the previous one */ + uint8_t is_combining; +} +rc_operand_t; + +RC_EXPORT int RC_CCONV rc_operand_is_memref(const rc_operand_t* operand); + +/*****************************************************************************\ +| Conditions | +\*****************************************************************************/ + +/* types */ +enum { + RC_CONDITION_STANDARD, /* this should always be 0 */ + RC_CONDITION_PAUSE_IF, + RC_CONDITION_RESET_IF, + RC_CONDITION_MEASURED_IF, + RC_CONDITION_TRIGGER, + RC_CONDITION_MEASURED, + RC_CONDITION_ADD_SOURCE, + RC_CONDITION_SUB_SOURCE, + RC_CONDITION_ADD_ADDRESS, + RC_CONDITION_REMEMBER, + RC_CONDITION_ADD_HITS, + RC_CONDITION_SUB_HITS, + RC_CONDITION_RESET_NEXT_IF, + RC_CONDITION_AND_NEXT, + RC_CONDITION_OR_NEXT +}; + +/* operators */ +enum { + RC_OPERATOR_EQ, + RC_OPERATOR_LT, + RC_OPERATOR_LE, + RC_OPERATOR_GT, + RC_OPERATOR_GE, + RC_OPERATOR_NE, + RC_OPERATOR_NONE, + RC_OPERATOR_MULT, + RC_OPERATOR_DIV, + RC_OPERATOR_AND, + RC_OPERATOR_XOR, + RC_OPERATOR_MOD, + RC_OPERATOR_ADD, + RC_OPERATOR_SUB, + + RC_OPERATOR_SUB_PARENT, /* internal use */ + RC_OPERATOR_ADD_ACCUMULATOR, /* internal use */ + RC_OPERATOR_SUB_ACCUMULATOR, /* internal use */ + RC_OPERATOR_INDIRECT_READ /* internal use */ +}; + +typedef struct rc_condition_t rc_condition_t; + +struct rc_condition_t { + /* The condition's operands. */ + rc_operand_t operand1; + rc_operand_t operand2; + + /* Required hits to fire this condition. */ + uint32_t required_hits; + /* Number of hits so far. */ + uint32_t current_hits; + + /* The next condition in the chain. */ + rc_condition_t* next; + + /* The type of the condition. (RC_CONDITION_*) */ + uint8_t type; + + /* The comparison operator to use. (RC_OPERATOR_*) */ + uint8_t oper; /* operator is a reserved word in C++. */ + + /* Will be non-zero if the condition evaluated true on the last check. + * - The lowest bit indicates whether the condition itself was true. + * - The second lowest bit will only ever be set on ResetIf conditions. + * If set, it indicates that the condition was responsible for resetting the + * trigger. A reset clears all hit counts, so the condition may not appear to + * be true just from looking at it (in which case the lower bit will be 0). + * Also, the condition might have only met its required_hits target though + * an AddHits chain which will have also been reset. + */ + uint8_t is_true; + + /* Unique identifier of optimized comparator to use. (RC_PROCESSING_COMPARE_*) */ + uint8_t optimized_comparator; +}; + +/*****************************************************************************\ +| Condition sets | +\*****************************************************************************/ + +typedef struct rc_condset_t rc_condset_t; + +struct rc_condset_t { + /* The next condition set in the chain. */ + rc_condset_t* next; + + /* The first condition in this condition set. Then follow ->next chain. */ + rc_condition_t* conditions; + + /* The number of pause conditions in this condition set. */ + /* The first pause condition is at "this + RC_ALIGN(sizeof(this)). */ + uint16_t num_pause_conditions; + + /* The number of reset conditions in this condition set. */ + uint16_t num_reset_conditions; + + /* The number of hittarget conditions in this condition set. */ + uint16_t num_hittarget_conditions; + + /* The number of non-hittarget measured conditions in this condition set. */ + uint16_t num_measured_conditions; + + /* The number of other conditions in this condition set. */ + uint16_t num_other_conditions; + + /* The number of indirect conditions in this condition set. */ + uint16_t num_indirect_conditions; + + /* True if any condition in the set is a pause condition. */ + uint8_t has_pause; /* DEPRECATED - just check num_pause_conditions != 0 */ + /* True if the set is currently paused. */ + uint8_t is_paused; +}; + +/*****************************************************************************\ +| Trigger | +\*****************************************************************************/ + +enum { + RC_TRIGGER_STATE_INACTIVE, /* achievement is not being processed */ + RC_TRIGGER_STATE_WAITING, /* achievement cannot trigger until it has been false for at least one frame */ + RC_TRIGGER_STATE_ACTIVE, /* achievement is active and may trigger */ + RC_TRIGGER_STATE_PAUSED, /* achievement is currently paused and will not trigger */ + RC_TRIGGER_STATE_RESET, /* achievement hit counts were reset */ + RC_TRIGGER_STATE_TRIGGERED, /* achievement has triggered */ + RC_TRIGGER_STATE_PRIMED, /* all non-Trigger conditions are true */ + RC_TRIGGER_STATE_DISABLED /* achievement cannot be processed at this time */ +}; + +struct rc_trigger_t { + /* The main condition set. */ + rc_condset_t* requirement; + + /* The list of sub condition sets in this test. */ + rc_condset_t* alternative; + + /* The current state of the MEASURED condition. */ + uint32_t measured_value; + + /* The target state of the MEASURED condition */ + uint32_t measured_target; + + /* The current state of the trigger */ + uint8_t state; + + /* True if at least one condition has a non-zero hit count */ + uint8_t has_hits; + + /* True if the measured value should be displayed as a percentage */ + uint8_t measured_as_percent; + + /* True if the trigger has its own rc_memrefs_t */ + uint8_t has_memrefs; +}; + +RC_EXPORT int RC_CCONV rc_trigger_size(const char* memaddr); +RC_EXPORT rc_trigger_t* RC_CCONV rc_parse_trigger(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx); +RC_EXPORT int RC_CCONV rc_evaluate_trigger(rc_trigger_t* trigger, rc_peek_t peek, void* ud, void* unused_L); +RC_EXPORT int RC_CCONV rc_test_trigger(rc_trigger_t* trigger, rc_peek_t peek, void* ud, void* unused_L); +RC_EXPORT void RC_CCONV rc_reset_trigger(rc_trigger_t* self); + +/*****************************************************************************\ +| Values | +\*****************************************************************************/ + +#define RC_VALUE_MAX_NAME_LENGTH 15 + +struct rc_value_t { + /* The current value of the variable. */ + rc_memref_value_t value; + + /* True if the value has its own rc_memrefs_t */ + uint8_t has_memrefs; + + /* The list of possible values (traverse next chain, pick max). */ + rc_condset_t* conditions; + + /* The name of the variable. */ + const char* name; + + /* The next variable in the chain. */ + rc_value_t* next; +}; + +RC_EXPORT int RC_CCONV rc_value_size(const char* memaddr); +RC_EXPORT rc_value_t* RC_CCONV rc_parse_value(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx); +RC_EXPORT int32_t RC_CCONV rc_evaluate_value(rc_value_t* value, rc_peek_t peek, void* ud, void* unused_L); + +/*****************************************************************************\ +| Leaderboards | +\*****************************************************************************/ + +/* Return values for rc_evaluate_lboard. */ +enum { + RC_LBOARD_STATE_INACTIVE, /* leaderboard is not being processed */ + RC_LBOARD_STATE_WAITING, /* leaderboard cannot activate until the start condition has been false for at least one frame */ + RC_LBOARD_STATE_ACTIVE, /* leaderboard is active and may start */ + RC_LBOARD_STATE_STARTED, /* leaderboard attempt in progress */ + RC_LBOARD_STATE_CANCELED, /* leaderboard attempt canceled */ + RC_LBOARD_STATE_TRIGGERED, /* leaderboard attempt complete, value should be submitted */ + RC_LBOARD_STATE_DISABLED /* leaderboard cannot be processed at this time */ +}; + +struct rc_lboard_t { + rc_trigger_t start; + rc_trigger_t submit; + rc_trigger_t cancel; + rc_value_t value; + rc_value_t* progress; + + uint8_t state; + uint8_t has_memrefs; +}; + +RC_EXPORT int RC_CCONV rc_lboard_size(const char* memaddr); +RC_EXPORT rc_lboard_t* RC_CCONV rc_parse_lboard(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx); +RC_EXPORT int RC_CCONV rc_evaluate_lboard(rc_lboard_t* lboard, int32_t* value, rc_peek_t peek, void* peek_ud, void* unused_L); +RC_EXPORT void RC_CCONV rc_reset_lboard(rc_lboard_t* lboard); + +/*****************************************************************************\ +| Value formatting | +\*****************************************************************************/ + +/* Supported formats. */ +enum { + RC_FORMAT_FRAMES, + RC_FORMAT_SECONDS, + RC_FORMAT_CENTISECS, + RC_FORMAT_SCORE, + RC_FORMAT_VALUE, + RC_FORMAT_MINUTES, + RC_FORMAT_SECONDS_AS_MINUTES, + RC_FORMAT_FLOAT1, + RC_FORMAT_FLOAT2, + RC_FORMAT_FLOAT3, + RC_FORMAT_FLOAT4, + RC_FORMAT_FLOAT5, + RC_FORMAT_FLOAT6, + RC_FORMAT_FIXED1, + RC_FORMAT_FIXED2, + RC_FORMAT_FIXED3, + RC_FORMAT_TENS, + RC_FORMAT_HUNDREDS, + RC_FORMAT_THOUSANDS, + RC_FORMAT_UNSIGNED_VALUE, + RC_FORMAT_UNFORMATTED +}; + +RC_EXPORT int RC_CCONV rc_parse_format(const char* format_str); +RC_EXPORT int RC_CCONV rc_format_value(char* buffer, int size, int32_t value, int format); + +/*****************************************************************************\ +| Rich Presence | +\*****************************************************************************/ + +typedef struct rc_richpresence_lookup_item_t rc_richpresence_lookup_item_t; + +struct rc_richpresence_lookup_item_t { + uint32_t first; + uint32_t last; + rc_richpresence_lookup_item_t* left; + rc_richpresence_lookup_item_t* right; + const char* label; +}; + +typedef struct rc_richpresence_lookup_t rc_richpresence_lookup_t; + +struct rc_richpresence_lookup_t { + rc_richpresence_lookup_item_t* root; + rc_richpresence_lookup_t* next; + const char* name; + const char* default_label; + uint8_t format; +}; + +typedef struct rc_richpresence_display_part_t rc_richpresence_display_part_t; + +struct rc_richpresence_display_part_t { + rc_richpresence_display_part_t* next; + const char* text; + rc_richpresence_lookup_t* lookup; + rc_operand_t value; + uint8_t display_type; +}; + +typedef struct rc_richpresence_display_t rc_richpresence_display_t; + +struct rc_richpresence_display_t { + rc_trigger_t trigger; + rc_richpresence_display_t* next; + rc_richpresence_display_part_t* display; + uint8_t has_required_hits; +}; + +struct rc_richpresence_t { + rc_richpresence_display_t* first_display; + rc_richpresence_lookup_t* first_lookup; + rc_value_t* values; + uint8_t has_memrefs; +}; + +RC_EXPORT int RC_CCONV rc_richpresence_size(const char* script); +RC_EXPORT int RC_CCONV rc_richpresence_size_lines(const char* script, int* lines_read); +RC_EXPORT rc_richpresence_t* RC_CCONV rc_parse_richpresence(void* buffer, const char* script, void* unused_L, int unused_funcs_idx); +RC_EXPORT int RC_CCONV rc_evaluate_richpresence(rc_richpresence_t* richpresence, char* buffer, size_t buffersize, rc_peek_t peek, void* peek_ud, void* unused_L); +RC_EXPORT void RC_CCONV rc_update_richpresence(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud, void* unused_L); +RC_EXPORT int RC_CCONV rc_get_richpresence_display_string(rc_richpresence_t* richpresence, char* buffer, size_t buffersize, rc_peek_t peek, void* peek_ud, void* unused_L); +RC_EXPORT void RC_CCONV rc_reset_richpresence(rc_richpresence_t* self); + +RC_END_C_DECLS + +#endif /* RC_RUNTIME_TYPES_H */ diff --git a/src/rcheevos/include/rc_util.h b/src/rcheevos/include/rc_util.h new file mode 100644 index 0000000000..18d27e0fc7 --- /dev/null +++ b/src/rcheevos/include/rc_util.h @@ -0,0 +1,51 @@ +#ifndef RC_UTIL_H +#define RC_UTIL_H + +#include "rc_export.h" + +#include +#include + +RC_BEGIN_C_DECLS + +/** + * A block of memory for variable length data (like strings and arrays). + */ +typedef struct rc_buffer_chunk_t { + /* The current location where data is being written */ + uint8_t* write; + /* The first byte past the end of data where writing cannot occur */ + uint8_t* end; + /* The first byte of the data */ + uint8_t* start; + /* The next block in the allocated memory chain */ + struct rc_buffer_chunk_t* next; +} +rc_buffer_chunk_t; + +/** + * A preallocated block of memory for variable length data (like strings and arrays). + */ +typedef struct rc_buffer_t { + /* The chunk data (will point at the local data member) */ + struct rc_buffer_chunk_t chunk; + /* Small chunk of memory pre-allocated for the chunk */ + uint8_t data[256]; +} +rc_buffer_t; + +void rc_buffer_init(rc_buffer_t* buffer); +void rc_buffer_destroy(rc_buffer_t* buffer); +uint8_t* rc_buffer_reserve(rc_buffer_t* buffer, size_t amount); +void rc_buffer_consume(rc_buffer_t* buffer, const uint8_t* start, uint8_t* end); +void* rc_buffer_alloc(rc_buffer_t* buffer, size_t amount); +char* rc_buffer_strcpy(rc_buffer_t* buffer, const char* src); +char* rc_buffer_strncpy(rc_buffer_t* buffer, const char* src, size_t len); + +uint32_t rc_djb2(const char* input); + +void rc_format_md5(char checksum[33], const uint8_t digest[16]); + +RC_END_C_DECLS + +#endif /* RC_UTIL_H */ diff --git a/src/rcheevos/include/rcheevos.h b/src/rcheevos/include/rcheevos.h new file mode 100644 index 0000000000..0d96002148 --- /dev/null +++ b/src/rcheevos/include/rcheevos.h @@ -0,0 +1,8 @@ +#ifndef RCHEEVOS_H +#define RCHEEVOS_H + +#include "rc_runtime.h" +#include "rc_runtime_types.h" +#include "rc_consoles.h" + +#endif /* RCHEEVOS_H */ diff --git a/src/rcheevos/src/rapi/rc_api_common.c b/src/rcheevos/src/rapi/rc_api_common.c new file mode 100644 index 0000000000..3a261fba46 --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_common.c @@ -0,0 +1,1379 @@ +#include "rc_api_common.h" +#include "rc_api_request.h" +#include "rc_api_runtime.h" + +#include "../rc_compat.h" + +#include +#include +#include +#include + +#define RETROACHIEVEMENTS_HOST "https://retroachievements.org" +#define RETROACHIEVEMENTS_IMAGE_HOST "https://media.retroachievements.org" +#define RETROACHIEVEMENTS_HOST_NONSSL "http://retroachievements.org" +#define RETROACHIEVEMENTS_IMAGE_HOST_NONSSL "http://media.retroachievements.org" +rc_api_host_t g_host = { NULL, NULL }; + +/* --- rc_json --- */ + +static int rc_json_parse_object(rc_json_iterator_t* iterator, rc_json_field_t* fields, size_t field_count, uint32_t* fields_seen); +static int rc_json_parse_array(rc_json_iterator_t* iterator, rc_json_field_t* field); + +static int rc_json_match_char(rc_json_iterator_t* iterator, char c) +{ + if (iterator->json < iterator->end && *iterator->json == c) { + ++iterator->json; + return 1; + } + + return 0; +} + +static void rc_json_skip_whitespace(rc_json_iterator_t* iterator) +{ + while (iterator->json < iterator->end && isspace((unsigned char)*iterator->json)) + ++iterator->json; +} + +static int rc_json_find_substring(rc_json_iterator_t* iterator, const char* substring) +{ + const char first = *substring; + const size_t substring_len = strlen(substring); + const char* end = iterator->end - substring_len; + + while (iterator->json <= end) { + if (*iterator->json == first) { + if (memcmp(iterator->json, substring, substring_len) == 0) + return 1; + } + + ++iterator->json; + } + + return 0; +} + +static int rc_json_find_closing_quote(rc_json_iterator_t* iterator) +{ + while (iterator->json < iterator->end) { + if (*iterator->json == '"') + return 1; + + if (*iterator->json == '\\') { + ++iterator->json; + if (iterator->json == iterator->end) + return 0; + } + + if (*iterator->json == '\0') + return 0; + + ++iterator->json; + } + + return 0; +} + +static int rc_json_parse_field(rc_json_iterator_t* iterator, rc_json_field_t* field) { + int result; + + if (iterator->json >= iterator->end) + return RC_INVALID_JSON; + + field->value_start = iterator->json; + + switch (*iterator->json) + { + case '"': /* quoted string */ + ++iterator->json; + if (!rc_json_find_closing_quote(iterator)) + return RC_INVALID_JSON; + ++iterator->json; + break; + + case '-': + case '+': /* signed number */ + ++iterator->json; + /* fallthrough to number */ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': /* number */ + while (iterator->json < iterator->end && *iterator->json >= '0' && *iterator->json <= '9') + ++iterator->json; + + if (rc_json_match_char(iterator, '.')) { + while (iterator->json < iterator->end && *iterator->json >= '0' && *iterator->json <= '9') + ++iterator->json; + } + break; + + case '[': /* array */ + result = rc_json_parse_array(iterator, field); + if (result != RC_OK) + return result; + + break; + + case '{': /* object */ + result = rc_json_parse_object(iterator, NULL, 0, &field->array_size); + if (result != RC_OK) + return result; + + break; + + default: /* non-quoted text [true,false,null] */ + if (!isalpha((unsigned char)*iterator->json)) + return RC_INVALID_JSON; + + while (iterator->json < iterator->end && isalnum((unsigned char)*iterator->json)) + ++iterator->json; + break; + } + + field->value_end = iterator->json; + return RC_OK; +} + +static int rc_json_parse_array(rc_json_iterator_t* iterator, rc_json_field_t* field) { + rc_json_field_t unused_field; + int result; + + if (!rc_json_match_char(iterator, '[')) + return RC_INVALID_JSON; + + field->array_size = 0; + + if (rc_json_match_char(iterator, ']')) /* empty array */ + return RC_OK; + + do + { + rc_json_skip_whitespace(iterator); + + result = rc_json_parse_field(iterator, &unused_field); + if (result != RC_OK) + return result; + + ++field->array_size; + + rc_json_skip_whitespace(iterator); + } while (rc_json_match_char(iterator, ',')); + + if (!rc_json_match_char(iterator, ']')) + return RC_INVALID_JSON; + + return RC_OK; +} + +static int rc_json_get_next_field(rc_json_iterator_t* iterator, rc_json_field_t* field) { + rc_json_skip_whitespace(iterator); + + if (!rc_json_match_char(iterator, '"')) + return RC_INVALID_JSON; + + field->name = iterator->json; + while (iterator->json < iterator->end && *iterator->json != '"') { + if (!*iterator->json) + return RC_INVALID_JSON; + ++iterator->json; + } + + if (iterator->json == iterator->end) + return RC_INVALID_JSON; + + field->name_len = iterator->json - field->name; + ++iterator->json; + + rc_json_skip_whitespace(iterator); + + if (!rc_json_match_char(iterator, ':')) + return RC_INVALID_JSON; + + rc_json_skip_whitespace(iterator); + + if (rc_json_parse_field(iterator, field) < 0) + return RC_INVALID_JSON; + + rc_json_skip_whitespace(iterator); + + return RC_OK; +} + +static int rc_json_parse_object(rc_json_iterator_t* iterator, rc_json_field_t* fields, size_t field_count, uint32_t* fields_seen) { + size_t i; + uint32_t num_fields = 0; + rc_json_field_t field; + int result; + + if (fields_seen) + *fields_seen = 0; + + for (i = 0; i < field_count; ++i) + fields[i].value_start = fields[i].value_end = NULL; + + if (!rc_json_match_char(iterator, '{')) + return RC_INVALID_JSON; + + if (rc_json_match_char(iterator, '}')) /* empty object */ + return RC_OK; + + do + { + result = rc_json_get_next_field(iterator, &field); + if (result != RC_OK) + return result; + + for (i = 0; i < field_count; ++i) { + if (!fields[i].value_start && fields[i].name_len == field.name_len && + memcmp(fields[i].name, field.name, field.name_len) == 0) { + fields[i].value_start = field.value_start; + fields[i].value_end = field.value_end; + fields[i].array_size = field.array_size; + break; + } + } + + ++num_fields; + + } while (rc_json_match_char(iterator, ',')); + + if (!rc_json_match_char(iterator, '}')) + return RC_INVALID_JSON; + + if (fields_seen) + *fields_seen = num_fields; + + return RC_OK; +} + +int rc_json_get_next_object_field(rc_json_iterator_t* iterator, rc_json_field_t* field) { + if (!rc_json_match_char(iterator, ',') && !rc_json_match_char(iterator, '{')) + return 0; + + return (rc_json_get_next_field(iterator, field) == RC_OK); +} + +int rc_json_get_object_string_length(const char* json) { + rc_json_iterator_t iterator; + memset(&iterator, 0, sizeof(iterator)); + iterator.json = json; + iterator.end = json + (1024 * 1024 * 1024); /* arbitrary 1GB limit on JSON response */ + + rc_json_parse_object(&iterator, NULL, 0, NULL); + + if (iterator.json == json) /* not JSON */ + return (int)strlen(json); + + return (int)(iterator.json - json); +} + +static int rc_json_extract_html_error(rc_api_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_iterator_t iterator; + memset(&iterator, 0, sizeof(iterator)); + iterator.json = server_response->body; + iterator.end = server_response->body + server_response->body_length; + + /* assume the title contains the most appropriate message to display to the user */ + if (rc_json_find_substring(&iterator, "")) { + const char* title_start = iterator.json + 7; + if (rc_json_find_substring(&iterator, "")) { + response->error_message = rc_buffer_strncpy(&response->buffer, title_start, iterator.json - title_start); + response->succeeded = 0; + return RC_INVALID_JSON; + } + } + + /* title not found, return the first line of the response (up to 200 characters) */ + iterator.json = server_response->body; + + while (iterator.json < iterator.end && *iterator.json != '\n' && + iterator.json - server_response->body < 200) { + ++iterator.json; + } + + if (iterator.json > server_response->body && iterator.json[-1] == '\r') + --iterator.json; + + if (iterator.json > server_response->body) + response->error_message = rc_buffer_strncpy(&response->buffer, server_response->body, iterator.json - server_response->body); + + response->succeeded = 0; + return RC_INVALID_JSON; +} + +static int rc_json_convert_error_code(const char* server_error_code) +{ + switch (server_error_code[0]) { + case 'a': + if (strcmp(server_error_code, "access_denied") == 0) + return RC_ACCESS_DENIED; + break; + + case 'e': + if (strcmp(server_error_code, "expired_token") == 0) + return RC_EXPIRED_TOKEN; + break; + + case 'i': + if (strcmp(server_error_code, "invalid_credentials") == 0) + return RC_INVALID_CREDENTIALS; + if (strcmp(server_error_code, "invalid_parameter") == 0) + return RC_INVALID_STATE; + break; + + case 'm': + if (strcmp(server_error_code, "missing_parameter") == 0) + return RC_INVALID_STATE; + break; + + case 'n': + if (strcmp(server_error_code, "not_found") == 0) + return RC_NOT_FOUND; + break; + + default: + break; + } + + return RC_API_FAILURE; +} + +int rc_json_parse_server_response(rc_api_response_t* response, const rc_api_server_response_t* server_response, rc_json_field_t* fields, size_t field_count) { + int result; + +#ifndef NDEBUG + if (field_count < 2) + return RC_INVALID_STATE; + if (strcmp(fields[0].name, "Success") != 0) + return RC_INVALID_STATE; + if (strcmp(fields[1].name, "Error") != 0) + return RC_INVALID_STATE; +#endif + + response->error_message = NULL; + + if (!server_response) { + response->succeeded = 0; + return RC_NO_RESPONSE; + } + + if (server_response->http_status_code == RC_API_SERVER_RESPONSE_CLIENT_ERROR || + server_response->http_status_code == RC_API_SERVER_RESPONSE_RETRYABLE_CLIENT_ERROR) { + /* client provided error message is passed as the response body */ + response->error_message = server_response->body; + response->succeeded = 0; + return RC_NO_RESPONSE; + } + + if (!server_response->body || !*server_response->body) { + /* expect valid HTTP status codes to have bodies that we can extract the message from, + * but provide some default messages in case they don't. */ + switch (server_response->http_status_code) { + case 504: /* 504 Gateway Timeout */ + case 522: /* 522 Connection Timed Out */ + case 524: /* 524 A Timeout Occurred */ + response->error_message = "Request has timed out."; + break; + + case 521: /* 521 Web Server is Down */ + case 523: /* 523 Origin is Unreachable */ + response->error_message = "Could not connect to server."; + break; + + default: + break; + } + + response->succeeded = 0; + return RC_NO_RESPONSE; + } + + if (*server_response->body != '{') { + result = rc_json_extract_html_error(response, server_response); + } + else { + rc_json_iterator_t iterator; + memset(&iterator, 0, sizeof(iterator)); + iterator.json = server_response->body; + iterator.end = server_response->body + server_response->body_length; + result = rc_json_parse_object(&iterator, fields, field_count, NULL); + + rc_json_get_optional_string(&response->error_message, response, &fields[1], "Error", NULL); + rc_json_get_optional_bool(&response->succeeded, &fields[0], "Success", 1); + + /* Code will be the third field in the fields array, but may not always be present */ + if (field_count > 2 && strcmp(fields[2].name, "Code") == 0) { + rc_json_get_optional_string(&response->error_code, response, &fields[2], "Code", NULL); + if (response->error_code != NULL) + result = rc_json_convert_error_code(response->error_code); + } + } + + return result; +} + +static int rc_json_missing_field(rc_api_response_t* response, const rc_json_field_t* field) { + const char* not_found = " not found in response"; + const size_t not_found_len = strlen(not_found); + const size_t field_len = strlen(field->name); + + uint8_t* write = rc_buffer_reserve(&response->buffer, field_len + not_found_len + 1); + if (write) { + response->error_message = (char*)write; + memcpy(write, field->name, field_len); + write += field_len; + memcpy(write, not_found, not_found_len + 1); + write += not_found_len + 1; + rc_buffer_consume(&response->buffer, (uint8_t*)response->error_message, write); + } + + response->succeeded = 0; + return 0; +} + +int rc_json_get_required_object(rc_json_field_t* fields, size_t field_count, rc_api_response_t* response, rc_json_field_t* field, const char* field_name) { + rc_json_iterator_t iterator; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (!field->value_start) + return rc_json_missing_field(response, field); + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = field->value_start; + iterator.end = field->value_end; + return (rc_json_parse_object(&iterator, fields, field_count, &field->array_size) == RC_OK); +} + +static int rc_json_get_array_entry_value(rc_json_field_t* field, rc_json_iterator_t* iterator) { + rc_json_skip_whitespace(iterator); + + if (iterator->json >= iterator->end) + return 0; + + if (rc_json_parse_field(iterator, field) != RC_OK) + return 0; + + rc_json_skip_whitespace(iterator); + + if (!rc_json_match_char(iterator, ',')) + rc_json_match_char(iterator, ']'); + + return 1; +} + +int rc_json_get_required_unum_array(uint32_t** entries, uint32_t* num_entries, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + rc_json_iterator_t iterator; + rc_json_field_t array; + rc_json_field_t value; + uint32_t* entry; + + memset(&array, 0, sizeof(array)); + if (!rc_json_get_required_array(num_entries, &array, response, field, field_name)) + return RC_MISSING_VALUE; + + if (*num_entries) { + *entries = (uint32_t*)rc_buffer_alloc(&response->buffer, *num_entries * sizeof(uint32_t)); + if (!*entries) + return RC_OUT_OF_MEMORY; + + value.name = field_name; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array.value_start; + iterator.end = array.value_end; + + entry = *entries; + while (rc_json_get_array_entry_value(&value, &iterator)) { + if (!rc_json_get_unum(entry, &value, field_name)) + return RC_MISSING_VALUE; + + ++entry; + } + } + else { + *entries = NULL; + } + + return RC_OK; +} + +int rc_json_get_required_array(uint32_t* num_entries, rc_json_field_t* array_field, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#endif + + if (!rc_json_get_optional_array(num_entries, array_field, field, field_name)) + return rc_json_missing_field(response, field); + + return 1; +} + +int rc_json_get_optional_array(uint32_t* num_entries, rc_json_field_t* array_field, const rc_json_field_t* field, const char* field_name) { +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (!field->value_start || *field->value_start != '[') { + *num_entries = 0; + return 0; + } + + memcpy(array_field, field, sizeof(*array_field)); + ++array_field->value_start; /* skip [ */ + + *num_entries = field->array_size; + return 1; +} + +int rc_json_get_array_entry_object(rc_json_field_t* fields, size_t field_count, rc_json_iterator_t* iterator) { + rc_json_skip_whitespace(iterator); + + if (iterator->json >= iterator->end) + return 0; + + if (rc_json_parse_object(iterator, fields, field_count, NULL) != RC_OK) + return 0; + + rc_json_skip_whitespace(iterator); + + if (!rc_json_match_char(iterator, ',')) + rc_json_match_char(iterator, ']'); + + return 1; +} + +static uint32_t rc_json_decode_hex4(const char* input) { + char hex[5]; + + memcpy(hex, input, 4); + hex[4] = '\0'; + + return (uint32_t)strtoul(hex, NULL, 16); +} + +static int rc_json_ucs32_to_utf8(uint8_t* dst, uint32_t ucs32_char) { + if (ucs32_char < 0x80) { + dst[0] = (ucs32_char & 0x7F); + return 1; + } + + if (ucs32_char < 0x0800) { + dst[1] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[0] = 0xC0 | (ucs32_char & 0x1F); + return 2; + } + + if (ucs32_char < 0x010000) { + dst[2] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[1] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[0] = 0xE0 | (ucs32_char & 0x0F); + return 3; + } + + if (ucs32_char < 0x200000) { + dst[3] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[2] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[1] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[0] = 0xF0 | (ucs32_char & 0x07); + return 4; + } + + if (ucs32_char < 0x04000000) { + dst[4] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[3] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[2] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[1] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[0] = 0xF8 | (ucs32_char & 0x03); + return 5; + } + + dst[5] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[4] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[3] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[2] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[1] = 0x80 | (ucs32_char & 0x3F); ucs32_char >>= 6; + dst[0] = 0xFC | (ucs32_char & 0x01); + return 6; +} + +int rc_json_get_string(const char** out, rc_buffer_t* buffer, const rc_json_field_t* field, const char* field_name) { + const char* src = field->value_start; + size_t len = field->value_end - field->value_start; + char* dst; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (!src) { + *out = NULL; + return 0; + } + + if (len == 4 && memcmp(field->value_start, "null", 4) == 0) { + *out = NULL; + return 1; + } + + if (*src == '\"') { + ++src; + + if (*src == '\"') { + /* simple optimization for empty string - don't allocate space */ + *out = ""; + return 1; + } + + *out = dst = (char*)rc_buffer_reserve(buffer, len - 1); /* -2 for quotes, +1 for null terminator */ + + do { + if (*src == '\\') { + ++src; + if (*src == 'n') { + /* newline */ + ++src; + *dst++ = '\n'; + continue; + } + + if (*src == 'r') { + /* carriage return */ + ++src; + *dst++ = '\r'; + continue; + } + + if (*src == 'u') { + /* unicode character */ + uint32_t ucs32_char = rc_json_decode_hex4(src + 1); + src += 5; + + if (ucs32_char >= 0xD800 && ucs32_char < 0xE000) { + /* surrogate lead - look for surrogate tail */ + if (ucs32_char < 0xDC00 && src[0] == '\\' && src[1] == 'u') { + const uint32_t surrogate = rc_json_decode_hex4(src + 2); + src += 6; + + if (surrogate >= 0xDC00 && surrogate < 0xE000) { + /* found a surrogate tail, merge them */ + ucs32_char = (((ucs32_char - 0xD800) << 10) | (surrogate - 0xDC00)) + 0x10000; + } + } + + if (!(ucs32_char & 0xFFFF0000)) { + /* invalid surrogate pair, fallback to replacement char */ + ucs32_char = 0xFFFD; + } + } + + dst += rc_json_ucs32_to_utf8((unsigned char*)dst, ucs32_char); + continue; + } + + if (*src == 't') { + /* tab */ + ++src; + *dst++ = '\t'; + continue; + } + + /* just an escaped character, fallthrough to normal copy */ + } + + *dst++ = *src++; + } while (*src != '\"'); + + } else { + *out = dst = (char*)rc_buffer_reserve(buffer, len + 1); /* +1 for null terminator */ + memcpy(dst, src, len); + dst += len; + } + + *dst++ = '\0'; + rc_buffer_consume(buffer, (uint8_t*)(*out), (uint8_t*)dst); + return 1; +} + +int rc_json_field_string_matches(const rc_json_field_t* field, const char* text) { + int is_quoted = 0; + const char* ptr = field->value_start; + if (!ptr) + return 0; + + if (*ptr == '"') { + is_quoted = 1; + ++ptr; + } + + while (ptr < field->value_end) { + if (*ptr != *text) { + if (*ptr != '\\') { + if (*ptr == '"' && is_quoted && (*text == '\0')) { + is_quoted = 0; + ++ptr; + continue; + } + + return 0; + } + + ++ptr; + switch (*ptr) { + case 'n': + if (*text != '\n') + return 0; + break; + case 'r': + if (*text != '\r') + return 0; + break; + case 't': + if (*text != '\t') + return 0; + break; + default: + if (*text != *ptr) + return 0; + break; + } + } + + ++text; + ++ptr; + } + + return !is_quoted && (*text == '\0'); +} + +void rc_json_get_optional_string(const char** out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name, const char* default_value) { + if (!rc_json_get_string(out, &response->buffer, field, field_name)) + *out = default_value; +} + +int rc_json_get_required_string(const char** out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_string(out, &response->buffer, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +int rc_json_get_num(int32_t* out, const rc_json_field_t* field, const char* field_name) { + const char* src = field->value_start; + int32_t value = 0; + int negative = 0; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (!src) { + *out = 0; + return 0; + } + + /* assert: string contains only numerals and an optional sign per rc_json_parse_field */ + if (*src == '-') { + negative = 1; + ++src; + } else if (*src == '+') { + ++src; + } else if (*src < '0' || *src > '9') { + *out = 0; + return 0; + } + + while (src < field->value_end && *src != '.') { + value *= 10; + value += *src - '0'; + ++src; + } + + if (negative) + *out = -value; + else + *out = value; + + return 1; +} + +void rc_json_get_optional_num(int32_t* out, const rc_json_field_t* field, const char* field_name, int default_value) { + if (!rc_json_get_num(out, field, field_name)) + *out = default_value; +} + +int rc_json_get_required_num(int32_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_num(out, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +int rc_json_get_unum(uint32_t* out, const rc_json_field_t* field, const char* field_name) { + const char* src = field->value_start; + uint32_t value = 0; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (!src) { + *out = 0; + return 0; + } + + if (*src < '0' || *src > '9') { + *out = 0; + return 0; + } + + /* assert: string contains only numerals per rc_json_parse_field */ + while (src < field->value_end && *src != '.') { + value *= 10; + value += *src - '0'; + ++src; + } + + *out = value; + return 1; +} + +void rc_json_get_optional_unum(uint32_t* out, const rc_json_field_t* field, const char* field_name, uint32_t default_value) { + if (!rc_json_get_unum(out, field, field_name)) + *out = default_value; +} + +int rc_json_get_required_unum(uint32_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_unum(out, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +int rc_json_get_float(float* out, const rc_json_field_t* field, const char* field_name) { + int32_t whole, fraction, fraction_denominator; + const char* decimal = field->value_start; + + if (!decimal) { + *out = 0.0f; + return 0; + } + + if (!rc_json_get_num(&whole, field, field_name)) + return 0; + + while (decimal < field->value_end && *decimal != '.') + ++decimal; + + fraction = 0; + fraction_denominator = 1; + if (decimal) { + ++decimal; + while (decimal < field->value_end && *decimal >= '0' && *decimal <= '9') { + fraction *= 10; + fraction += *decimal - '0'; + fraction_denominator *= 10; + ++decimal; + } + } + + if (whole < 0) + fraction = -fraction; + + *out = (float)whole + ((float)fraction / (float)fraction_denominator); + return 1; +} + +void rc_json_get_optional_float(float* out, const rc_json_field_t* field, const char* field_name, float default_value) { + if (!rc_json_get_float(out, field, field_name)) + *out = default_value; +} + +int rc_json_get_required_float(float* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_float(out, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +int rc_json_get_datetime(time_t* out, const rc_json_field_t* field, const char* field_name) { + struct tm tm; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (*field->value_start == '\"') { + memset(&tm, 0, sizeof(tm)); + if (sscanf_s(field->value_start + 1, "%d-%d-%d %d:%d:%d", /* DB format "2013-10-20 22:12:21" */ + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6 || + /* NOTE: relies on sscanf stopping when it sees a non-digit after the seconds. could be 'Z', '.', '+', or '-' */ + sscanf_s(field->value_start + 1, "%d-%d-%dT%d:%d:%d", /* ISO format "2013-10-20T22:12:21.000000Z */ + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6) { + tm.tm_mon--; /* 0-based */ + tm.tm_year -= 1900; /* 1900 based */ + + /* mktime converts a struct tm to a time_t using the local timezone. + * the input string is UTC. since timegm is not universally cross-platform, + * figure out the offset between UTC and local time by applying the + * timezone conversion twice and manually removing the difference */ + { + time_t local_timet = mktime(&tm); + time_t skewed_timet, tz_offset; + struct tm gmt_tm; + gmtime_s(&gmt_tm, &local_timet); + skewed_timet = mktime(&gmt_tm); /* applies local time adjustment second time */ + tz_offset = skewed_timet - local_timet; + *out = local_timet - tz_offset; + } + + return 1; + } + } + + *out = 0; + return 0; +} + +int rc_json_get_required_datetime(time_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_datetime(out, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +int rc_json_get_bool(int* out, const rc_json_field_t* field, const char* field_name) { + const char* src = field->value_start; + +#ifndef NDEBUG + if (strcmp(field->name, field_name) != 0) + return 0; +#else + (void)field_name; +#endif + + if (src) { + const size_t len = field->value_end - field->value_start; + if (len == 4 && strncasecmp(src, "true", 4) == 0) { + *out = 1; + return 1; + } else if (len == 5 && strncasecmp(src, "false", 5) == 0) { + *out = 0; + return 1; + } else if (len == 1) { + *out = (*src != '0'); + return 1; + } + } + + *out = 0; + return 0; +} + +void rc_json_get_optional_bool(int* out, const rc_json_field_t* field, const char* field_name, int default_value) { + if (!rc_json_get_bool(out, field, field_name)) + *out = default_value; +} + +int rc_json_get_required_bool(int* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name) { + if (rc_json_get_bool(out, field, field_name)) + return 1; + + return rc_json_missing_field(response, field); +} + +void rc_json_extract_filename(rc_json_field_t* field) { + if (field->value_end) { + const char* str = field->value_end; + + /* remove the extension */ + while (str > field->value_start && str[-1] != '/') { + --str; + if (*str == '.') { + field->value_end = str; + break; + } + } + + /* find the path separator */ + while (str > field->value_start && str[-1] != '/') + --str; + + field->value_start = str; + } +} + +/* --- rc_api_request --- */ + +void rc_api_destroy_request(rc_api_request_t* request) +{ + rc_buffer_destroy(&request->buffer); +} + +/* --- rc_url_builder --- */ + +void rc_url_builder_init(rc_api_url_builder_t* builder, rc_buffer_t* buffer, size_t estimated_size) { + rc_buffer_chunk_t* used_buffer; + + memset(builder, 0, sizeof(*builder)); + builder->buffer = buffer; + builder->write = builder->start = (char*)rc_buffer_reserve(buffer, estimated_size); + + used_buffer = &buffer->chunk; + while (used_buffer && used_buffer->write != (uint8_t*)builder->write) + used_buffer = used_buffer->next; + + builder->end = (used_buffer) ? (char*)used_buffer->end : builder->start + estimated_size; +} + +const char* rc_url_builder_finalize(rc_api_url_builder_t* builder) { + rc_url_builder_append(builder, "", 1); + + if (builder->result != RC_OK) + return NULL; + + rc_buffer_consume(builder->buffer, (uint8_t*)builder->start, (uint8_t*)builder->write); + return builder->start; +} + +static int rc_url_builder_reserve(rc_api_url_builder_t* builder, size_t amount) { + if (builder->result == RC_OK) { + size_t remaining = builder->end - builder->write; + if (remaining < amount) { + const size_t used = builder->write - builder->start; + const size_t current_size = builder->end - builder->start; + const size_t buffer_prefix_size = sizeof(rc_buffer_chunk_t); + char* new_start; + size_t new_size = (current_size < 256) ? 256 : current_size * 2; + do { + remaining = new_size - used; + if (remaining >= amount) + break; + + new_size *= 2; + } while (1); + + /* rc_buffer_reserve will align to 256 bytes after including the buffer prefix. attempt to account for that */ + if ((remaining - amount) > buffer_prefix_size) + new_size -= buffer_prefix_size; + + new_start = (char*)rc_buffer_reserve(builder->buffer, new_size); + if (!new_start) { + builder->result = RC_OUT_OF_MEMORY; + return RC_OUT_OF_MEMORY; + } + + if (new_start != builder->start) { + memcpy(new_start, builder->start, used); + builder->start = new_start; + builder->write = new_start + used; + } + + builder->end = builder->start + new_size; + } + } + + return builder->result; +} + +void rc_url_builder_append_encoded_str(rc_api_url_builder_t* builder, const char* str) { + static const char hex[] = "0123456789abcdef"; + const char* start = str; + size_t len = 0; + for (;;) { + const char c = *str++; + switch (c) { + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': + case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + case '-': case '_': case '.': case '~': + len++; + continue; + + case '\0': + if (len) + rc_url_builder_append(builder, start, len); + + return; + + default: + if (rc_url_builder_reserve(builder, len + 3) != RC_OK) + return; + + if (len) { + memcpy(builder->write, start, len); + builder->write += len; + } + + if (c == ' ') { + *builder->write++ = '+'; + } else { + *builder->write++ = '%'; + *builder->write++ = hex[((unsigned char)c) >> 4]; + *builder->write++ = hex[c & 0x0F]; + } + break; + } + + start = str; + len = 0; + } +} + +void rc_url_builder_append(rc_api_url_builder_t* builder, const char* data, size_t len) { + if (rc_url_builder_reserve(builder, len) == RC_OK) { + memcpy(builder->write, data, len); + builder->write += len; + } +} + +static int rc_url_builder_append_param_equals(rc_api_url_builder_t* builder, const char* param) { + size_t param_len = strlen(param); + + if (rc_url_builder_reserve(builder, param_len + 2) == RC_OK) { + if (builder->write > builder->start) { + if (builder->write[-1] != '?') + *builder->write++ = '&'; + } + + memcpy(builder->write, param, param_len); + builder->write += param_len; + *builder->write++ = '='; + } + + return builder->result; +} + +void rc_url_builder_append_unum_param(rc_api_url_builder_t* builder, const char* param, uint32_t value) { + if (rc_url_builder_append_param_equals(builder, param) == RC_OK) { + char num[16]; + int chars = snprintf(num, sizeof(num), "%u", value); + rc_url_builder_append(builder, num, chars); + } +} + +void rc_url_builder_append_num_param(rc_api_url_builder_t* builder, const char* param, int32_t value) { + if (rc_url_builder_append_param_equals(builder, param) == RC_OK) { + char num[16]; + int chars = snprintf(num, sizeof(num), "%d", value); + rc_url_builder_append(builder, num, chars); + } +} + +void rc_url_builder_append_str_param(rc_api_url_builder_t* builder, const char* param, const char* value) { + rc_url_builder_append_param_equals(builder, param); + rc_url_builder_append_encoded_str(builder, value); +} + +void rc_api_url_build_dorequest_url(rc_api_request_t* request, const rc_api_host_t* host) { + #define DOREQUEST_ENDPOINT "/dorequest.php" + rc_buffer_init(&request->buffer); + + if (!host || !host->host) { + request->url = RETROACHIEVEMENTS_HOST DOREQUEST_ENDPOINT; + } + else { + const size_t endpoint_len = sizeof(DOREQUEST_ENDPOINT); + const size_t host_len = strlen(host->host); + const size_t protocol_len = (strstr(host->host, "://")) ? 0 : 7; + const size_t url_len = protocol_len + host_len + endpoint_len; + uint8_t* url = rc_buffer_reserve(&request->buffer, url_len); + + if (protocol_len) + memcpy(url, "http://", protocol_len); + + memcpy(url + protocol_len, host->host, host_len); + memcpy(url + protocol_len + host_len, DOREQUEST_ENDPOINT, endpoint_len); + rc_buffer_consume(&request->buffer, url, url + url_len); + + request->url = (char*)url; + } + #undef DOREQUEST_ENDPOINT +} + +int rc_api_url_build_dorequest(rc_api_url_builder_t* builder, const char* api, const char* username, const char* api_token) { + if (!username || !*username || !api_token || !*api_token) { + builder->result = RC_INVALID_STATE; + return 0; + } + + rc_url_builder_append_str_param(builder, "r", api); + rc_url_builder_append_str_param(builder, "u", username); + rc_url_builder_append_str_param(builder, "t", api_token); + + return (builder->result == RC_OK); +} + +/* --- Set Host --- */ + +static void rc_api_update_host(const char** host, const char* hostname) { + if (*host != NULL) + free((void*)*host); + + if (hostname != NULL) { + if (strstr(hostname, "://")) { + *host = strdup(hostname); + } + else { + const size_t hostname_len = strlen(hostname); + if (hostname_len == 0) { + *host = NULL; + } + else { + char* newhost = (char*)malloc(hostname_len + 7 + 1); + if (newhost) { + memcpy(newhost, "http://", 7); + memcpy(&newhost[7], hostname, hostname_len + 1); + *host = newhost; + } + else { + *host = NULL; + } + } + } + } + else { + *host = NULL; + } +} + +const char* rc_api_default_host(void) { + return RETROACHIEVEMENTS_HOST; +} + +void rc_api_set_host(const char* hostname) { + if (hostname && strcmp(hostname, RETROACHIEVEMENTS_HOST) == 0) + hostname = NULL; + + rc_api_update_host(&g_host.host, hostname); + + if (!hostname) { + /* also clear out the image hostname */ + rc_api_set_image_host(NULL); + } + else if (strcmp(hostname, RETROACHIEVEMENTS_HOST_NONSSL) == 0) { + /* if just pointing at the non-HTTPS host, explicitly use the default image host + * so it doesn't try to use the web host directly */ + rc_api_set_image_host(RETROACHIEVEMENTS_IMAGE_HOST_NONSSL); + } +} + +void rc_api_set_image_host(const char* hostname) { + rc_api_update_host(&g_host.media_host, hostname); +} + +/* --- Fetch Image --- */ + +int rc_api_init_fetch_image_request(rc_api_request_t* request, const rc_api_fetch_image_request_t* api_params) { + return rc_api_init_fetch_image_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_image_request_hosted(rc_api_request_t* request, const rc_api_fetch_image_request_t* api_params, const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_buffer_init(&request->buffer); + rc_url_builder_init(&builder, &request->buffer, 64); + + if (host && host->media_host) { + /* custom media host provided */ + if (!strstr(host->host, "://")) + rc_url_builder_append(&builder, "http://", 7); + rc_url_builder_append(&builder, host->media_host, strlen(host->media_host)); + } + else if (host && host->host) { + if (strcmp(host->host, RETROACHIEVEMENTS_HOST_NONSSL) == 0) { + /* if host specifically set to non-ssl host, and no media host provided, use non-ssl media host */ + rc_url_builder_append(&builder, RETROACHIEVEMENTS_IMAGE_HOST_NONSSL, sizeof(RETROACHIEVEMENTS_IMAGE_HOST_NONSSL) - 1); + } + else if (strcmp(host->host, RETROACHIEVEMENTS_HOST) == 0) { + /* if host specifically set to ssl host, and no media host provided, use media host */ + rc_url_builder_append(&builder, RETROACHIEVEMENTS_IMAGE_HOST, sizeof(RETROACHIEVEMENTS_IMAGE_HOST) - 1); + } + else { + /* custom host and no media host provided. assume custom host is also media host */ + if (!strstr(host->host, "://")) + rc_url_builder_append(&builder, "http://", 7); + rc_url_builder_append(&builder, host->host, strlen(host->host)); + } + } + else { + /* no custom host provided */ + rc_url_builder_append(&builder, RETROACHIEVEMENTS_IMAGE_HOST, sizeof(RETROACHIEVEMENTS_IMAGE_HOST) - 1); + } + + switch (api_params->image_type) + { + case RC_IMAGE_TYPE_GAME: + rc_url_builder_append(&builder, "/Images/", 8); + rc_url_builder_append(&builder, api_params->image_name, strlen(api_params->image_name)); + rc_url_builder_append(&builder, ".png", 4); + break; + + case RC_IMAGE_TYPE_ACHIEVEMENT: + rc_url_builder_append(&builder, "/Badge/", 7); + rc_url_builder_append(&builder, api_params->image_name, strlen(api_params->image_name)); + rc_url_builder_append(&builder, ".png", 4); + break; + + case RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED: + rc_url_builder_append(&builder, "/Badge/", 7); + rc_url_builder_append(&builder, api_params->image_name, strlen(api_params->image_name)); + rc_url_builder_append(&builder, "_lock.png", 9); + break; + + case RC_IMAGE_TYPE_USER: + rc_url_builder_append(&builder, "/UserPic/", 9); + rc_url_builder_append(&builder, api_params->image_name, strlen(api_params->image_name)); + rc_url_builder_append(&builder, ".png", 4); + break; + + default: + return RC_INVALID_STATE; + } + + request->url = rc_url_builder_finalize(&builder); + request->post_data = NULL; + + return builder.result; +} + +const char* rc_api_build_avatar_url(rc_buffer_t* buffer, uint32_t image_type, const char* image_name) { + rc_api_fetch_image_request_t image_request; + rc_api_request_t request; + int result; + + memset(&image_request, 0, sizeof(image_request)); + image_request.image_type = image_type; + image_request.image_name = image_name; + + result = rc_api_init_fetch_image_request(&request, &image_request); + if (result == RC_OK) + return rc_buffer_strcpy(buffer, request.url); + + return NULL; +} diff --git a/src/rcheevos/src/rapi/rc_api_common.h b/src/rcheevos/src/rapi/rc_api_common.h new file mode 100644 index 0000000000..78e10d49b9 --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_common.h @@ -0,0 +1,88 @@ +#ifndef RC_API_COMMON_H +#define RC_API_COMMON_H + +#include "rc_api_request.h" + +#include +#include + +RC_BEGIN_C_DECLS + +#define RC_CONTENT_TYPE_URLENCODED "application/x-www-form-urlencoded" + +typedef struct rc_api_url_builder_t { + char* write; + char* start; + char* end; + /* pointer to a preallocated rc_buffer_t */ + rc_buffer_t* buffer; + int result; +} +rc_api_url_builder_t; + +void rc_url_builder_init(rc_api_url_builder_t* builder, rc_buffer_t* buffer, size_t estimated_size); +void rc_url_builder_append(rc_api_url_builder_t* builder, const char* data, size_t len); +const char* rc_url_builder_finalize(rc_api_url_builder_t* builder); + +extern rc_api_host_t g_host; + +#define RC_JSON_NEW_FIELD(n) {NULL,NULL,n,sizeof(n)-1,0} + +typedef struct rc_json_field_t { + const char* value_start; + const char* value_end; + const char* name; + size_t name_len; + uint32_t array_size; +} +rc_json_field_t; + +typedef struct rc_json_iterator_t { + const char* json; + const char* end; +} +rc_json_iterator_t; + +int rc_json_parse_server_response(rc_api_response_t* response, const rc_api_server_response_t* server_response, rc_json_field_t* fields, size_t field_count); +int rc_json_get_string(const char** out, rc_buffer_t* buffer, const rc_json_field_t* field, const char* field_name); +int rc_json_get_num(int32_t* out, const rc_json_field_t* field, const char* field_name); +int rc_json_get_unum(uint32_t* out, const rc_json_field_t* field, const char* field_name); +int rc_json_get_float(float* out, const rc_json_field_t* field, const char* field_name); +int rc_json_get_bool(int* out, const rc_json_field_t* field, const char* field_name); +int rc_json_get_datetime(time_t* out, const rc_json_field_t* field, const char* field_name); +void rc_json_get_optional_string(const char** out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name, const char* default_value); +void rc_json_get_optional_num(int32_t* out, const rc_json_field_t* field, const char* field_name, int default_value); +void rc_json_get_optional_unum(uint32_t* out, const rc_json_field_t* field, const char* field_name, uint32_t default_value); +void rc_json_get_optional_float(float* out, const rc_json_field_t* field, const char* field_name, float default_value); +void rc_json_get_optional_bool(int* out, const rc_json_field_t* field, const char* field_name, int default_value); +int rc_json_get_optional_array(uint32_t* num_entries, rc_json_field_t* iterator, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_string(const char** out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_num(int32_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_unum(uint32_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_float(float* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_bool(int* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_datetime(time_t* out, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_object(rc_json_field_t* fields, size_t field_count, rc_api_response_t* response, rc_json_field_t* field, const char* field_name); +int rc_json_get_required_unum_array(uint32_t** entries, uint32_t* num_entries, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_required_array(uint32_t* num_entries, rc_json_field_t* array_field, rc_api_response_t* response, const rc_json_field_t* field, const char* field_name); +int rc_json_get_array_entry_object(rc_json_field_t* fields, size_t field_count, rc_json_iterator_t* iterator); +int rc_json_get_next_object_field(rc_json_iterator_t* iterator, rc_json_field_t* field); +int rc_json_get_object_string_length(const char* json); +int rc_json_field_string_matches(const rc_json_field_t* field, const char* text); + +void rc_json_extract_filename(rc_json_field_t* field); + +void rc_url_builder_append_encoded_str(rc_api_url_builder_t* builder, const char* str); +void rc_url_builder_append_num_param(rc_api_url_builder_t* builder, const char* param, int32_t value); +void rc_url_builder_append_unum_param(rc_api_url_builder_t* builder, const char* param, uint32_t value); +void rc_url_builder_append_str_param(rc_api_url_builder_t* builder, const char* param, const char* value); + +const char* rc_api_default_host(void); +void rc_api_url_build_dorequest_url(rc_api_request_t* request, const rc_api_host_t* host); +int rc_api_url_build_dorequest(rc_api_url_builder_t* builder, const char* api, const char* username, const char* api_token); + +const char* rc_api_build_avatar_url(rc_buffer_t* buffer, uint32_t image_type, const char* image_name); + +RC_END_C_DECLS + +#endif /* RC_API_COMMON_H */ diff --git a/src/rcheevos/src/rapi/rc_api_editor.c b/src/rcheevos/src/rapi/rc_api_editor.c new file mode 100644 index 0000000000..775f73de8e --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_editor.c @@ -0,0 +1,625 @@ +#include "rc_api_editor.h" +#include "rc_api_common.h" +#include "rc_api_runtime.h" + +#include "../rc_compat.h" +#include "../rhash/md5.h" + +#include +#include + +/* --- Fetch Code Notes --- */ + +int rc_api_init_fetch_code_notes_request(rc_api_request_t* request, const rc_api_fetch_code_notes_request_t* api_params) { + return rc_api_init_fetch_code_notes_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_code_notes_request_hosted(rc_api_request_t* request, + const rc_api_fetch_code_notes_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "codenotes2"); + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_fetch_code_notes_response(rc_api_fetch_code_notes_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_code_notes_server_response(response, &response_obj); +} + +int rc_api_process_fetch_code_notes_server_response(rc_api_fetch_code_notes_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_field_t array_field; + rc_json_iterator_t iterator; + rc_api_code_note_t* note; + const char* address_str; + const char* last_author = ""; + size_t last_author_len = 0; + size_t len; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("CodeNotes") + }; + + rc_json_field_t note_fields[] = { + RC_JSON_NEW_FIELD("Address"), + RC_JSON_NEW_FIELD("User"), + RC_JSON_NEW_FIELD("Note") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_array(&response->num_notes, &array_field, &response->response, &fields[2], "CodeNotes")) + return RC_MISSING_VALUE; + + if (response->num_notes) { + response->notes = (rc_api_code_note_t*)rc_buffer_alloc(&response->response.buffer, response->num_notes * sizeof(rc_api_code_note_t)); + if (!response->notes) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + note = response->notes; + while (rc_json_get_array_entry_object(note_fields, sizeof(note_fields) / sizeof(note_fields[0]), &iterator)) { + /* an empty note represents a record that was deleted on the server */ + /* a note set to '' also represents a deleted note (remnant of a bug) */ + /* NOTE: len will include the quotes */ + if (note_fields[2].value_start) { + len = note_fields[2].value_end - note_fields[2].value_start; + if (len == 2 || (len == 4 && note_fields[2].value_start[1] == '\'' && note_fields[2].value_start[2] == '\'')) { + --response->num_notes; + continue; + } + } + + if (!rc_json_get_required_string(&address_str, &response->response, ¬e_fields[0], "Address")) + return RC_MISSING_VALUE; + note->address = (uint32_t)strtoul(address_str, NULL, 16); + if (!rc_json_get_required_string(¬e->note, &response->response, ¬e_fields[2], "Note")) + return RC_MISSING_VALUE; + + len = note_fields[1].value_end - note_fields[1].value_start; + if (len == last_author_len && memcmp(note_fields[1].value_start, last_author, len) == 0) { + note->author = last_author; + } + else { + if (!rc_json_get_required_string(¬e->author, &response->response, ¬e_fields[1], "User")) + return RC_MISSING_VALUE; + + if (note->author == NULL) { + /* ensure we don't pass NULL out to client */ + last_author = note->author = ""; + last_author_len = 0; + } else { + last_author = note->author; + last_author_len = len; + } + } + + ++note; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_code_notes_response(rc_api_fetch_code_notes_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Update Code Note --- */ + +int rc_api_init_update_code_note_request(rc_api_request_t* request, const rc_api_update_code_note_request_t* api_params) { + return rc_api_init_update_code_note_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_update_code_note_request_hosted(rc_api_request_t* request, + const rc_api_update_code_note_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 128); + if (!rc_api_url_build_dorequest(&builder, "submitcodenote", api_params->username, api_params->api_token)) + return builder.result; + + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + rc_url_builder_append_unum_param(&builder, "m", api_params->address); + + if (api_params->note && *api_params->note) + rc_url_builder_append_str_param(&builder, "n", api_params->note); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_update_code_note_response(rc_api_update_code_note_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_update_code_note_server_response(response, &response_obj); +} + +int rc_api_process_update_code_note_server_response(rc_api_update_code_note_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error") + /* unused fields + RC_JSON_NEW_FIELD("GameID"), + RC_JSON_NEW_FIELD("Address"), + RC_JSON_NEW_FIELD("Note") + */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + return RC_OK; +} + +void rc_api_destroy_update_code_note_response(rc_api_update_code_note_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Update Achievement --- */ + +static const char* rc_type_string(uint32_t type) { + switch (type) { + case RC_ACHIEVEMENT_TYPE_MISSABLE: return "missable"; + case RC_ACHIEVEMENT_TYPE_PROGRESSION: return "progression"; + case RC_ACHIEVEMENT_TYPE_WIN: return "win_condition"; + default: return ""; + } +} + +int rc_api_init_update_achievement_request(rc_api_request_t* request, const rc_api_update_achievement_request_t* api_params) { + return rc_api_init_update_achievement_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_update_achievement_request_hosted(rc_api_request_t* request, + const rc_api_update_achievement_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + char buffer[33]; + md5_state_t md5; + md5_byte_t hash[16]; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0 || api_params->category == 0) + return RC_INVALID_STATE; + if (!api_params->title || !*api_params->title) + return RC_INVALID_STATE; + if (!api_params->description || !*api_params->description) + return RC_INVALID_STATE; + if (!api_params->trigger || !*api_params->trigger) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 128); + if (!rc_api_url_build_dorequest(&builder, "uploadachievement", api_params->username, api_params->api_token)) + return builder.result; + + if (api_params->achievement_id) + rc_url_builder_append_unum_param(&builder, "a", api_params->achievement_id); + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + rc_url_builder_append_str_param(&builder, "n", api_params->title); + rc_url_builder_append_str_param(&builder, "d", api_params->description); + rc_url_builder_append_str_param(&builder, "m", api_params->trigger); + rc_url_builder_append_unum_param(&builder, "z", api_params->points); + rc_url_builder_append_unum_param(&builder, "f", api_params->category); + if (api_params->badge) + rc_url_builder_append_str_param(&builder, "b", api_params->badge); + rc_url_builder_append_str_param(&builder, "x", rc_type_string(api_params->type)); + + /* Evaluate the signature. */ + md5_init(&md5); + md5_append(&md5, (md5_byte_t*)api_params->username, (int)strlen(api_params->username)); + md5_append(&md5, (md5_byte_t*)"SECRET", 6); + snprintf(buffer, sizeof(buffer), "%u", api_params->achievement_id); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_append(&md5, (md5_byte_t*)"SEC", 3); + md5_append(&md5, (md5_byte_t*)api_params->trigger, (int)strlen(api_params->trigger)); + snprintf(buffer, sizeof(buffer), "%u", api_params->points); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_append(&md5, (md5_byte_t*)"RE2", 3); + snprintf(buffer, sizeof(buffer), "%u", api_params->points * 3); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_finish(&md5, hash); + rc_format_md5(buffer, hash); + rc_url_builder_append_str_param(&builder, "h", buffer); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_update_achievement_response(rc_api_update_achievement_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_update_achievement_server_response(response, &response_obj); +} + +int rc_api_process_update_achievement_server_response(rc_api_update_achievement_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("AchievementID") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_unum(&response->achievement_id, &response->response, &fields[2], "AchievementID")) + return RC_MISSING_VALUE; + + return RC_OK; +} + +void rc_api_destroy_update_achievement_response(rc_api_update_achievement_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Update Leaderboard --- */ + +int rc_api_init_update_leaderboard_request(rc_api_request_t* request, const rc_api_update_leaderboard_request_t* api_params) { + return rc_api_init_update_leaderboard_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_update_leaderboard_request_hosted(rc_api_request_t* request, + const rc_api_update_leaderboard_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + char buffer[33]; + md5_state_t md5; + md5_byte_t hash[16]; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + if (!api_params->title || !*api_params->title) + return RC_INVALID_STATE; + if (!api_params->description) + return RC_INVALID_STATE; + if (!api_params->start_trigger || !*api_params->start_trigger) + return RC_INVALID_STATE; + if (!api_params->submit_trigger || !*api_params->submit_trigger) + return RC_INVALID_STATE; + if (!api_params->cancel_trigger || !*api_params->cancel_trigger) + return RC_INVALID_STATE; + if (!api_params->value_definition || !*api_params->value_definition) + return RC_INVALID_STATE; + if (!api_params->format || !*api_params->format) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 128); + if (!rc_api_url_build_dorequest(&builder, "uploadleaderboard", api_params->username, api_params->api_token)) + return builder.result; + + if (api_params->leaderboard_id) + rc_url_builder_append_unum_param(&builder, "i", api_params->leaderboard_id); + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + rc_url_builder_append_str_param(&builder, "n", api_params->title); + rc_url_builder_append_str_param(&builder, "d", api_params->description); + rc_url_builder_append_str_param(&builder, "s", api_params->start_trigger); + rc_url_builder_append_str_param(&builder, "b", api_params->submit_trigger); + rc_url_builder_append_str_param(&builder, "c", api_params->cancel_trigger); + rc_url_builder_append_str_param(&builder, "l", api_params->value_definition); + rc_url_builder_append_num_param(&builder, "w", api_params->lower_is_better); + rc_url_builder_append_str_param(&builder, "f", api_params->format); + + /* Evaluate the signature. */ + md5_init(&md5); + md5_append(&md5, (md5_byte_t*)api_params->username, (int)strlen(api_params->username)); + md5_append(&md5, (md5_byte_t*)"SECRET", 6); + snprintf(buffer, sizeof(buffer), "%u", api_params->leaderboard_id); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_append(&md5, (md5_byte_t*)"SEC", 3); + md5_append(&md5, (md5_byte_t*)api_params->start_trigger, (int)strlen(api_params->start_trigger)); + md5_append(&md5, (md5_byte_t*)api_params->submit_trigger, (int)strlen(api_params->submit_trigger)); + md5_append(&md5, (md5_byte_t*)api_params->cancel_trigger, (int)strlen(api_params->cancel_trigger)); + md5_append(&md5, (md5_byte_t*)api_params->value_definition, (int)strlen(api_params->value_definition)); + md5_append(&md5, (md5_byte_t*)"RE2", 3); + md5_append(&md5, (md5_byte_t*)api_params->format, (int)strlen(api_params->format)); + md5_finish(&md5, hash); + rc_format_md5(buffer, hash); + rc_url_builder_append_str_param(&builder, "h", buffer); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_update_leaderboard_response(rc_api_update_leaderboard_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_update_leaderboard_server_response(response, &response_obj); +} + +int rc_api_process_update_leaderboard_server_response(rc_api_update_leaderboard_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("LeaderboardID") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_unum(&response->leaderboard_id, &response->response, &fields[2], "LeaderboardID")) + return RC_MISSING_VALUE; + + return RC_OK; +} + +void rc_api_destroy_update_leaderboard_response(rc_api_update_leaderboard_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Update Rich Presence --- */ + +int rc_api_init_update_rich_presence_request(rc_api_request_t* request, const rc_api_update_rich_presence_request_t* api_params) { + return rc_api_init_update_rich_presence_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_update_rich_presence_request_hosted(rc_api_request_t* request, + const rc_api_update_rich_presence_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + if (!api_params->script) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 128); + if (!rc_api_url_build_dorequest(&builder, "submitrichpresence", api_params->username, api_params->api_token)) + return builder.result; + + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + rc_url_builder_append_str_param(&builder, "d", api_params->script); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_update_rich_presence_server_response(rc_api_update_rich_presence_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Code"), + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + return RC_OK; +} + +void rc_api_destroy_update_rich_presence_response(rc_api_update_rich_presence_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Badge Range --- */ + +int rc_api_init_fetch_badge_range_request(rc_api_request_t* request, const rc_api_fetch_badge_range_request_t* api_params) { + return rc_api_init_fetch_badge_range_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_badge_range_request_hosted(rc_api_request_t* request, + const rc_api_fetch_badge_range_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "badgeiter"); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + (void)api_params; + + return builder.result; +} + +int rc_api_process_fetch_badge_range_response(rc_api_fetch_badge_range_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_badge_range_server_response(response, &response_obj); +} + +int rc_api_process_fetch_badge_range_server_response(rc_api_fetch_badge_range_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("FirstBadge"), + RC_JSON_NEW_FIELD("NextBadge") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_unum(&response->first_badge_id, &response->response, &fields[2], "FirstBadge")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->next_badge_id, &response->response, &fields[3], "NextBadge")) + return RC_MISSING_VALUE; + + return RC_OK; +} + +void rc_api_destroy_fetch_badge_range_response(rc_api_fetch_badge_range_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Add Game Hash --- */ + +int rc_api_init_add_game_hash_request(rc_api_request_t* request, const rc_api_add_game_hash_request_t* api_params) { + return rc_api_init_add_game_hash_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_add_game_hash_request_hosted(rc_api_request_t* request, + const rc_api_add_game_hash_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->console_id == 0) + return RC_INVALID_STATE; + if (!api_params->hash || !*api_params->hash) + return RC_INVALID_STATE; + if (api_params->game_id == 0 && (!api_params->title || !*api_params->title)) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 128); + if (!rc_api_url_build_dorequest(&builder, "submitgametitle", api_params->username, api_params->api_token)) + return builder.result; + + rc_url_builder_append_unum_param(&builder, "c", api_params->console_id); + rc_url_builder_append_str_param(&builder, "m", api_params->hash); + if (api_params->title) + rc_url_builder_append_str_param(&builder, "i", api_params->title); + if (api_params->game_id) + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + if (api_params->hash_description && *api_params->hash_description) + rc_url_builder_append_str_param(&builder, "d", api_params->hash_description); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_add_game_hash_response(rc_api_add_game_hash_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_add_game_hash_server_response(response, &response_obj); +} + +int rc_api_process_add_game_hash_server_response(rc_api_add_game_hash_response_t* response, const rc_api_server_response_t* server_response) { + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Response") + }; + + rc_json_field_t response_fields[] = { + RC_JSON_NEW_FIELD("GameID") + /* unused fields + RC_JSON_NEW_FIELD("MD5"), + RC_JSON_NEW_FIELD("ConsoleID"), + RC_JSON_NEW_FIELD("GameTitle"), + RC_JSON_NEW_FIELD("Success") + */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_object(response_fields, sizeof(response_fields) / sizeof(response_fields[0]), &response->response, &fields[2], "Response")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&response->game_id, &response->response, &response_fields[0], "GameID")) + return RC_MISSING_VALUE; + + return RC_OK; +} + +void rc_api_destroy_add_game_hash_response(rc_api_add_game_hash_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} diff --git a/src/rcheevos/src/rapi/rc_api_info.c b/src/rcheevos/src/rapi/rc_api_info.c new file mode 100644 index 0000000000..84423ae0e2 --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_info.c @@ -0,0 +1,582 @@ +#include "rc_api_info.h" +#include "rc_api_common.h" +#include "rc_api_runtime.h" + +#include "rc_runtime_types.h" + +#include "../rc_compat.h" + +#include +#include + +/* --- Fetch Achievement Info --- */ + +int rc_api_init_fetch_achievement_info_request(rc_api_request_t* request, const rc_api_fetch_achievement_info_request_t* api_params) { + return rc_api_init_fetch_achievement_info_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_achievement_info_request_hosted(rc_api_request_t* request, + const rc_api_fetch_achievement_info_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->achievement_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "achievementwondata", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "a", api_params->achievement_id); + + if (api_params->friends_only) + rc_url_builder_append_unum_param(&builder, "f", 1); + if (api_params->first_entry > 1) + rc_url_builder_append_unum_param(&builder, "o", api_params->first_entry - 1); /* number of entries to skip */ + rc_url_builder_append_unum_param(&builder, "c", api_params->count); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_fetch_achievement_info_response(rc_api_fetch_achievement_info_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_achievement_info_server_response(response, &response_obj); +} + +int rc_api_process_fetch_achievement_info_server_response(rc_api_fetch_achievement_info_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_achievement_awarded_entry_t* entry; + rc_json_field_t array_field; + rc_json_iterator_t iterator; + uint32_t timet; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("AchievementID"), + RC_JSON_NEW_FIELD("Response") + /* unused fields + RC_JSON_NEW_FIELD("Offset"), + RC_JSON_NEW_FIELD("Count"), + RC_JSON_NEW_FIELD("FriendsOnly") + * unused fields */ + }; + + rc_json_field_t response_fields[] = { + RC_JSON_NEW_FIELD("NumEarned"), + RC_JSON_NEW_FIELD("TotalPlayers"), + RC_JSON_NEW_FIELD("GameID"), + RC_JSON_NEW_FIELD("RecentWinner") /* array */ + }; + + rc_json_field_t entry_fields[] = { + RC_JSON_NEW_FIELD("User"), + RC_JSON_NEW_FIELD("DateAwarded"), + RC_JSON_NEW_FIELD("AvatarUrl") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!rc_json_get_required_unum(&response->id, &response->response, &fields[2], "AchievementID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_object(response_fields, sizeof(response_fields) / sizeof(response_fields[0]), &response->response, &fields[3], "Response")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&response->num_awarded, &response->response, &response_fields[0], "NumEarned")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->num_players, &response->response, &response_fields[1], "TotalPlayers")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->game_id, &response->response, &response_fields[2], "GameID")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_array(&response->num_recently_awarded, &array_field, &response->response, &response_fields[3], "RecentWinner")) + return RC_MISSING_VALUE; + + if (response->num_recently_awarded) { + response->recently_awarded = (rc_api_achievement_awarded_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_recently_awarded * sizeof(rc_api_achievement_awarded_entry_t)); + if (!response->recently_awarded) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + entry = response->recently_awarded; + while (rc_json_get_array_entry_object(entry_fields, sizeof(entry_fields) / sizeof(entry_fields[0]), &iterator)) { + if (!rc_json_get_required_string(&entry->username, &response->response, &entry_fields[0], "User")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&timet, &response->response, &entry_fields[1], "DateAwarded")) + return RC_MISSING_VALUE; + entry->awarded = (time_t)timet; + + rc_json_get_optional_string(&entry->avatar_url, &response->response, &entry_fields[2], "AvatarUrl", NULL); + if (!entry->avatar_url) + entry->avatar_url = rc_api_build_avatar_url(&response->response.buffer, RC_IMAGE_TYPE_USER, entry->username); + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_achievement_info_response(rc_api_fetch_achievement_info_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Leaderboard Info --- */ + +int rc_api_init_fetch_leaderboard_info_request(rc_api_request_t* request, const rc_api_fetch_leaderboard_info_request_t* api_params) { + return rc_api_init_fetch_leaderboard_info_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_leaderboard_info_request_hosted(rc_api_request_t* request, + const rc_api_fetch_leaderboard_info_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->leaderboard_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "lbinfo"); + rc_url_builder_append_unum_param(&builder, "i", api_params->leaderboard_id); + + if (api_params->username) + rc_url_builder_append_str_param(&builder, "u", api_params->username); + else if (api_params->first_entry > 1) + rc_url_builder_append_unum_param(&builder, "o", api_params->first_entry - 1); /* number of entries to skip */ + + rc_url_builder_append_unum_param(&builder, "c", api_params->count); + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_fetch_leaderboard_info_response(rc_api_fetch_leaderboard_info_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_leaderboard_info_server_response(response, &response_obj); +} + +int rc_api_process_fetch_leaderboard_info_server_response(rc_api_fetch_leaderboard_info_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_lboard_info_entry_t* entry; + rc_json_field_t array_field; + rc_json_iterator_t iterator; + uint32_t timet; + int result; + size_t len; + char format[16]; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("LeaderboardData") + }; + + rc_json_field_t leaderboarddata_fields[] = { + RC_JSON_NEW_FIELD("LBID"), + RC_JSON_NEW_FIELD("LBFormat"), + RC_JSON_NEW_FIELD("LowerIsBetter"), + RC_JSON_NEW_FIELD("LBTitle"), + RC_JSON_NEW_FIELD("LBDesc"), + RC_JSON_NEW_FIELD("LBMem"), + RC_JSON_NEW_FIELD("GameID"), + RC_JSON_NEW_FIELD("LBAuthor"), + RC_JSON_NEW_FIELD("LBCreated"), + RC_JSON_NEW_FIELD("LBUpdated"), + RC_JSON_NEW_FIELD("Entries"), /* array */ + RC_JSON_NEW_FIELD("TotalEntries") + }; + + rc_json_field_t entry_fields[] = { + RC_JSON_NEW_FIELD("User"), + RC_JSON_NEW_FIELD("Rank"), + RC_JSON_NEW_FIELD("Index"), + RC_JSON_NEW_FIELD("Score"), + RC_JSON_NEW_FIELD("DateSubmitted"), + RC_JSON_NEW_FIELD("AvatarUrl") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!rc_json_get_required_object(leaderboarddata_fields, sizeof(leaderboarddata_fields) / sizeof(leaderboarddata_fields[0]), &response->response, &fields[2], "LeaderboardData")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&response->id, &response->response, &leaderboarddata_fields[0], "LBID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->lower_is_better, &response->response, &leaderboarddata_fields[2], "LowerIsBetter")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->title, &response->response, &leaderboarddata_fields[3], "LBTitle")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->description, &response->response, &leaderboarddata_fields[4], "LBDesc")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->definition, &response->response, &leaderboarddata_fields[5], "LBMem")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->game_id, &response->response, &leaderboarddata_fields[6], "GameID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->author, &response->response, &leaderboarddata_fields[7], "LBAuthor")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_datetime(&response->created, &response->response, &leaderboarddata_fields[8], "LBCreated")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_datetime(&response->updated, &response->response, &leaderboarddata_fields[9], "LBUpdated")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->total_entries, &response->response, &leaderboarddata_fields[11], "TotalEntries")) + return RC_MISSING_VALUE; + + if (!leaderboarddata_fields[1].value_end) + return RC_MISSING_VALUE; + len = leaderboarddata_fields[1].value_end - leaderboarddata_fields[1].value_start - 2; + if (len < sizeof(format) - 1) { + memcpy(format, leaderboarddata_fields[1].value_start + 1, len); + format[len] = '\0'; + response->format = rc_parse_format(format); + } + else { + response->format = RC_FORMAT_VALUE; + } + + if (!rc_json_get_required_array(&response->num_entries, &array_field, &response->response, &leaderboarddata_fields[10], "Entries")) + return RC_MISSING_VALUE; + + if (response->num_entries) { + response->entries = (rc_api_lboard_info_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_entries * sizeof(rc_api_lboard_info_entry_t)); + if (!response->entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + entry = response->entries; + while (rc_json_get_array_entry_object(entry_fields, sizeof(entry_fields) / sizeof(entry_fields[0]), &iterator)) { + if (!rc_json_get_required_string(&entry->username, &response->response, &entry_fields[0], "User")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&entry->rank, &response->response, &entry_fields[1], "Rank")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&entry->index, &response->response, &entry_fields[2], "Index")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_num(&entry->score, &response->response, &entry_fields[3], "Score")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&timet, &response->response, &entry_fields[4], "DateSubmitted")) + return RC_MISSING_VALUE; + entry->submitted = (time_t)timet; + + rc_json_get_optional_string(&entry->avatar_url, &response->response, &entry_fields[5], "AvatarUrl", NULL); + if (!entry->avatar_url) + entry->avatar_url = rc_api_build_avatar_url(&response->response.buffer, RC_IMAGE_TYPE_USER, entry->username); + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_leaderboard_info_response(rc_api_fetch_leaderboard_info_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Games List --- */ + +int rc_api_init_fetch_games_list_request(rc_api_request_t* request, const rc_api_fetch_games_list_request_t* api_params) { + return rc_api_init_fetch_games_list_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_games_list_request_hosted(rc_api_request_t* request, + const rc_api_fetch_games_list_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->console_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "gameslist"); + rc_url_builder_append_unum_param(&builder, "c", api_params->console_id); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_fetch_games_list_response(rc_api_fetch_games_list_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_games_list_server_response(response, &response_obj); +} + +int rc_api_process_fetch_games_list_server_response(rc_api_fetch_games_list_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_game_list_entry_t* entry; + rc_json_iterator_t iterator; + rc_json_field_t field; + int result; + char* end; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Response") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!fields[2].value_start) { + /* call rc_json_get_required_object to generate the error message */ + rc_json_get_required_object(NULL, 0, &response->response, &fields[2], "Response"); + return RC_MISSING_VALUE; + } + + response->num_entries = fields[2].array_size; + rc_buffer_reserve(&response->response.buffer, response->num_entries * (32 + sizeof(rc_api_game_list_entry_t))); + + response->entries = (rc_api_game_list_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_entries * sizeof(rc_api_game_list_entry_t)); + if (!response->entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = fields[2].value_start; + iterator.end = fields[2].value_end; + + entry = response->entries; + while (rc_json_get_next_object_field(&iterator, &field)) { + entry->id = strtol(field.name, &end, 10); + + field.name = ""; + if (!rc_json_get_string(&entry->name, &response->response.buffer, &field, "")) + return RC_MISSING_VALUE; + + ++entry; + } + + return RC_OK; +} + +void rc_api_destroy_fetch_games_list_response(rc_api_fetch_games_list_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Game Titles --- */ + +int rc_api_init_fetch_game_titles_request(rc_api_request_t* request, const rc_api_fetch_game_titles_request_t* api_params) { + return rc_api_init_fetch_game_titles_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_game_titles_request_hosted(rc_api_request_t* request, + const rc_api_fetch_game_titles_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + char num[16]; + uint32_t i; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->num_game_ids == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "gameinfolist"); + rc_url_builder_append_unum_param(&builder, "g", api_params->game_ids[0]); + + for (i = 1; i < api_params->num_game_ids; i++) { + int chars = snprintf(num, sizeof(num), "%u", api_params->game_ids[i]); + rc_url_builder_append(&builder, ",", 1); + rc_url_builder_append(&builder, num, chars); + } + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_fetch_game_titles_server_response(rc_api_fetch_game_titles_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_game_title_entry_t* entry; + rc_json_iterator_t iterator; + rc_json_field_t array_field; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Response") + }; + + rc_json_field_t entry_fields[] = { + RC_JSON_NEW_FIELD("ID"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("ImageIcon") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!rc_json_get_required_array(&response->num_entries, &array_field, &response->response, &fields[2], "Response")) + return RC_MISSING_VALUE; + + if (response->num_entries) { + response->entries = (rc_api_game_title_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_entries * sizeof(rc_api_game_title_entry_t)); + if (!response->entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + entry = response->entries; + while (rc_json_get_array_entry_object(entry_fields, sizeof(entry_fields) / sizeof(entry_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&entry->id, &response->response, &entry_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&entry->title, &response->response, &entry_fields[1], "Title")) + return RC_MISSING_VALUE; + + /* ImageIcon will be '/Images/0123456.png' - only return the '0123456' */ + rc_json_extract_filename(&entry_fields[2]); + if (!rc_json_get_required_string(&entry->image_name, &response->response, &entry_fields[2], "ImageIcon")) + return RC_MISSING_VALUE; + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_game_titles_response(rc_api_fetch_game_titles_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Game Hashes --- */ + +int rc_api_init_fetch_hash_library_request(rc_api_request_t* request, + const rc_api_fetch_hash_library_request_t* api_params) +{ + return rc_api_init_fetch_hash_library_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_hash_library_request_hosted(rc_api_request_t* request, + const rc_api_fetch_hash_library_request_t* api_params, + const rc_api_host_t* host) +{ + rc_api_url_builder_t builder; + rc_api_url_build_dorequest_url(request, host); + + /* note: unauthenticated request */ + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "hashlibrary"); + if (api_params->console_id != 0) + rc_url_builder_append_unum_param(&builder, "c", api_params->console_id); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_fetch_hash_library_server_response(rc_api_fetch_hash_library_response_t* response, + const rc_api_server_response_t* server_response) +{ + rc_api_hash_library_entry_t* entry; + rc_json_iterator_t iterator; + rc_json_field_t field; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("MD5List"), + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = + rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!fields[2].value_start) { + /* call rc_json_get_required_object to generate the error message */ + rc_json_get_required_object(NULL, 0, &response->response, &fields[2], "MD5List"); + return RC_MISSING_VALUE; + } + + response->num_entries = fields[2].array_size; + if (response->num_entries > 0) { + rc_buffer_reserve(&response->response.buffer, response->num_entries * (33 + sizeof(rc_api_hash_library_entry_t))); + + response->entries = (rc_api_hash_library_entry_t*)rc_buffer_alloc( + &response->response.buffer, response->num_entries * sizeof(rc_api_hash_library_entry_t)); + if (!response->entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = fields[2].value_start; + iterator.end = fields[2].value_end; + + entry = response->entries; + while (rc_json_get_next_object_field(&iterator, &field)) { + entry->hash = rc_buffer_strncpy(&response->response.buffer, field.name, field.name_len); + + field.name = ""; + if (!rc_json_get_unum(&entry->game_id, &field, "")) + return RC_MISSING_VALUE; + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_hash_library_response(rc_api_fetch_hash_library_response_t* response) +{ + rc_buffer_destroy(&response->response.buffer); +} diff --git a/src/rcheevos/src/rapi/rc_api_runtime.c b/src/rcheevos/src/rapi/rc_api_runtime.c new file mode 100644 index 0000000000..99a001db2f --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_runtime.c @@ -0,0 +1,901 @@ +#include "rc_api_runtime.h" +#include "rc_api_common.h" + +#include "rc_runtime.h" +#include "rc_runtime_types.h" +#include "../rc_compat.h" +#include "../rhash/md5.h" + +#include +#include +#include + +/* --- Resolve Hash --- */ + +int rc_api_init_resolve_hash_request(rc_api_request_t* request, const rc_api_resolve_hash_request_t* api_params) { + return rc_api_init_resolve_hash_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_resolve_hash_request_hosted(rc_api_request_t* request, + const rc_api_resolve_hash_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (!api_params->game_hash || !*api_params->game_hash) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "gameid"); + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_resolve_hash_response(rc_api_resolve_hash_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_resolve_hash_server_response(response, &response_obj); +} + +int rc_api_process_resolve_hash_server_response(rc_api_resolve_hash_response_t* response, const rc_api_server_response_t* server_response) { + int result; + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("GameID") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + rc_json_get_required_unum(&response->game_id, &response->response, &fields[2], "GameID"); + return RC_OK; +} + +void rc_api_destroy_resolve_hash_response(rc_api_resolve_hash_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Game Data --- */ + +int rc_api_init_fetch_game_data_request(rc_api_request_t* request, const rc_api_fetch_game_data_request_t* api_params) { + return rc_api_init_fetch_game_data_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_game_data_request_hosted(rc_api_request_t* request, + const rc_api_fetch_game_data_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0 && (!api_params->game_hash || !api_params->game_hash[0])) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "patch", api_params->username, api_params->api_token)) { + if (api_params->game_id) + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + else + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_fetch_game_data_response(rc_api_fetch_game_data_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_game_data_server_response(response, &response_obj); +} + +static int rc_api_process_fetch_game_data_achievements(rc_api_response_t* response, rc_api_achievement_definition_t* achievement, rc_json_field_t* array_field) { + rc_json_iterator_t iterator; + const char* last_author = ""; + const char* last_author_field = ""; + size_t last_author_len = 0; + uint32_t timet; + size_t len; + + rc_json_field_t achievement_fields[] = { + RC_JSON_NEW_FIELD("ID"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("Description"), + RC_JSON_NEW_FIELD("Flags"), + RC_JSON_NEW_FIELD("Points"), + RC_JSON_NEW_FIELD("MemAddr"), + RC_JSON_NEW_FIELD("Author"), + RC_JSON_NEW_FIELD("BadgeName"), + RC_JSON_NEW_FIELD("Created"), + RC_JSON_NEW_FIELD("Modified"), + RC_JSON_NEW_FIELD("Type"), + RC_JSON_NEW_FIELD("Rarity"), + RC_JSON_NEW_FIELD("RarityHardcore"), + RC_JSON_NEW_FIELD("BadgeURL"), + RC_JSON_NEW_FIELD("BadgeLockedURL") + }; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field->value_start; + iterator.end = array_field->value_end; + + while (rc_json_get_array_entry_object(achievement_fields, sizeof(achievement_fields) / sizeof(achievement_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&achievement->id, response, &achievement_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&achievement->title, response, &achievement_fields[1], "Title")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&achievement->description, response, &achievement_fields[2], "Description")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&achievement->category, response, &achievement_fields[3], "Flags")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&achievement->points, response, &achievement_fields[4], "Points")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&achievement->definition, response, &achievement_fields[5], "MemAddr")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&achievement->badge_name, response, &achievement_fields[7], "BadgeName")) + return RC_MISSING_VALUE; + + rc_json_get_optional_string(&achievement->badge_url, response, &achievement_fields[13], "BadgeURL", ""); + if (!achievement->badge_url[0]) + achievement->badge_url = rc_api_build_avatar_url(&response->buffer, RC_IMAGE_TYPE_ACHIEVEMENT, achievement->badge_name); + + rc_json_get_optional_string(&achievement->badge_locked_url, response, &achievement_fields[14], "BadgeLockedURL", ""); + if (!achievement->badge_locked_url[0]) + achievement->badge_locked_url = rc_api_build_avatar_url(&response->buffer, RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED, achievement->badge_name); + + len = achievement_fields[6].value_end - achievement_fields[6].value_start; + if (len == last_author_len && memcmp(achievement_fields[6].value_start, last_author_field, len) == 0) { + achievement->author = last_author; + } + else { + if (!rc_json_get_required_string(&achievement->author, response, &achievement_fields[6], "Author")) + return RC_MISSING_VALUE; + + if (achievement->author == NULL) { + /* ensure we don't pass NULL out to client */ + last_author = achievement->author = ""; + last_author_len = 0; + } else { + last_author = achievement->author; + last_author_field = achievement_fields[6].value_start; + last_author_len = len; + } + } + + if (!rc_json_get_required_unum(&timet, response, &achievement_fields[8], "Created")) + return RC_MISSING_VALUE; + achievement->created = (time_t)timet; + if (!rc_json_get_required_unum(&timet, response, &achievement_fields[9], "Modified")) + return RC_MISSING_VALUE; + achievement->updated = (time_t)timet; + + if (rc_json_field_string_matches(&achievement_fields[10], "")) + achievement->type = RC_ACHIEVEMENT_TYPE_STANDARD; + else if (rc_json_field_string_matches(&achievement_fields[10], "progression")) + achievement->type = RC_ACHIEVEMENT_TYPE_PROGRESSION; + else if (rc_json_field_string_matches(&achievement_fields[10], "missable")) + achievement->type = RC_ACHIEVEMENT_TYPE_MISSABLE; + else if (rc_json_field_string_matches(&achievement_fields[10], "win_condition")) + achievement->type = RC_ACHIEVEMENT_TYPE_WIN; + else + achievement->type = RC_ACHIEVEMENT_TYPE_STANDARD; + + /* legacy support : if title contains[m], change type to missable and remove[m] from title */ + if (memcmp(achievement->title, "[m]", 3) == 0) { + len = 3; + while (achievement->title[len] == ' ') + ++len; + achievement->title += len; + achievement->type = RC_ACHIEVEMENT_TYPE_MISSABLE; + } + else if (achievement_fields[1].value_end && memcmp(achievement_fields[1].value_end - 4, "[m]", 3) == 0) { + len = strlen(achievement->title) - 3; + while (achievement->title[len - 1] == ' ') + --len; + ((char*)achievement->title)[len] = '\0'; + achievement->type = RC_ACHIEVEMENT_TYPE_MISSABLE; + } + + rc_json_get_optional_float(&achievement->rarity, &achievement_fields[11], "Rarity", 100.0); + rc_json_get_optional_float(&achievement->rarity_hardcore, &achievement_fields[12], "RarityHardcore", 100.0); + + ++achievement; + } + + return RC_OK; +} + +static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* response, rc_api_leaderboard_definition_t* leaderboard, rc_json_field_t* array_field) { + rc_json_iterator_t iterator; + size_t len; + int result; + char format[16]; + + rc_json_field_t leaderboard_fields[] = { + RC_JSON_NEW_FIELD("ID"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("Description"), + RC_JSON_NEW_FIELD("Mem"), + RC_JSON_NEW_FIELD("Format"), + RC_JSON_NEW_FIELD("LowerIsBetter"), + RC_JSON_NEW_FIELD("Hidden") + }; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field->value_start; + iterator.end = array_field->value_end; + + while (rc_json_get_array_entry_object(leaderboard_fields, sizeof(leaderboard_fields) / sizeof(leaderboard_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&leaderboard->id, response, &leaderboard_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&leaderboard->title, response, &leaderboard_fields[1], "Title")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&leaderboard->description, response, &leaderboard_fields[2], "Description")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&leaderboard->definition, response, &leaderboard_fields[3], "Mem")) + return RC_MISSING_VALUE; + rc_json_get_optional_bool(&result, &leaderboard_fields[5], "LowerIsBetter", 0); + leaderboard->lower_is_better = (uint8_t)result; + rc_json_get_optional_bool(&result, &leaderboard_fields[6], "Hidden", 0); + leaderboard->hidden = (uint8_t)result; + + if (!leaderboard_fields[4].value_end) + return RC_MISSING_VALUE; + len = leaderboard_fields[4].value_end - leaderboard_fields[4].value_start - 2; + if (len < sizeof(format) - 1) { + memcpy(format, leaderboard_fields[4].value_start + 1, len); + format[len] = '\0'; + leaderboard->format = rc_parse_format(format); + } + else { + leaderboard->format = RC_FORMAT_VALUE; + } + + ++leaderboard; + } + + return RC_OK; +} + +int rc_api_process_fetch_game_data_server_response(rc_api_fetch_game_data_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_field_t array_field; + size_t len; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Code"), + RC_JSON_NEW_FIELD("PatchData") /* nested object */ + }; + + rc_json_field_t patchdata_fields[] = { + RC_JSON_NEW_FIELD("ID"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("ConsoleID"), + RC_JSON_NEW_FIELD("ImageIcon"), + RC_JSON_NEW_FIELD("ImageIconURL"), + RC_JSON_NEW_FIELD("RichPresencePatch"), + RC_JSON_NEW_FIELD("Achievements"), /* array */ + RC_JSON_NEW_FIELD("Leaderboards"), /* array */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_object(patchdata_fields, sizeof(patchdata_fields) / sizeof(patchdata_fields[0]), &response->response, &fields[3], "PatchData")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&response->id, &response->response, &patchdata_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->title, &response->response, &patchdata_fields[1], "Title")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->console_id, &response->response, &patchdata_fields[2], "ConsoleID")) + return RC_MISSING_VALUE; + + /* ImageIcon will be '/Images/0123456.png' - only return the '0123456' */ + rc_json_extract_filename(&patchdata_fields[3]); + rc_json_get_optional_string(&response->image_name, &response->response, &patchdata_fields[3], "ImageIcon", ""); + rc_json_get_optional_string(&response->image_url, &response->response, &patchdata_fields[4], "ImageIconURL", ""); + if (!response->image_url[0]) + response->image_url = rc_api_build_avatar_url(&response->response.buffer, RC_IMAGE_TYPE_GAME, response->image_name); + + /* estimate the amount of space necessary to store the rich presence script, achievements, and leaderboards. + determine how much space each takes as a string in the JSON, then subtract out the non-data (field names, punctuation) + and add space for the structures. */ + len = patchdata_fields[5].value_end - patchdata_fields[5].value_start; /* rich presence */ + + len += (patchdata_fields[6].value_end - patchdata_fields[6].value_start) - /* achievements */ + patchdata_fields[6].array_size * (80 - sizeof(rc_api_achievement_definition_t)); + + len += (patchdata_fields[7].value_end - patchdata_fields[7].value_start) - /* leaderboards */ + patchdata_fields[7].array_size * (60 - sizeof(rc_api_leaderboard_definition_t)); + + rc_buffer_reserve(&response->response.buffer, len); + /* end estimation */ + + rc_json_get_optional_string(&response->rich_presence_script, &response->response, &patchdata_fields[5], "RichPresencePatch", ""); + if (!response->rich_presence_script) + response->rich_presence_script = ""; + + if (!rc_json_get_required_array(&response->num_achievements, &array_field, &response->response, &patchdata_fields[6], "Achievements")) + return RC_MISSING_VALUE; + + if (response->num_achievements) { + response->achievements = (rc_api_achievement_definition_t*)rc_buffer_alloc(&response->response.buffer, response->num_achievements * sizeof(rc_api_achievement_definition_t)); + if (!response->achievements) + return RC_OUT_OF_MEMORY; + + result = rc_api_process_fetch_game_data_achievements(&response->response, response->achievements, &array_field); + if (result != RC_OK) + return result; + } + + if (!rc_json_get_required_array(&response->num_leaderboards, &array_field, &response->response, &patchdata_fields[7], "Leaderboards")) + return RC_MISSING_VALUE; + + if (response->num_leaderboards) { + response->leaderboards = (rc_api_leaderboard_definition_t*)rc_buffer_alloc(&response->response.buffer, response->num_leaderboards * sizeof(rc_api_leaderboard_definition_t)); + if (!response->leaderboards) + return RC_OUT_OF_MEMORY; + + result = rc_api_process_fetch_game_data_leaderboards(&response->response, response->leaderboards, &array_field); + if (result != RC_OK) + return result; + } + + return RC_OK; +} + +void rc_api_destroy_fetch_game_data_response(rc_api_fetch_game_data_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Game Sets --- */ + +int rc_api_init_fetch_game_sets_request(rc_api_request_t* request, const rc_api_fetch_game_sets_request_t* api_params) { + return rc_api_init_fetch_game_sets_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_game_sets_request_hosted(rc_api_request_t* request, + const rc_api_fetch_game_sets_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (!api_params->game_id && (!api_params->game_hash || !api_params->game_hash[0])) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "achievementsets", api_params->username, api_params->api_token)) { + if (api_params->game_id) + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + else + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +static int rc_api_process_fetch_game_sets_achievement_sets(rc_api_fetch_game_sets_response_t* response, + rc_api_achievement_set_definition_t* subset, + rc_json_field_t* subset_array_field) { + rc_json_iterator_t iterator; + rc_json_field_t array_field; + size_t len; + int result; + + rc_json_field_t subset_fields[] = { + RC_JSON_NEW_FIELD("AchievementSetId"), + RC_JSON_NEW_FIELD("GameId"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("Type"), + RC_JSON_NEW_FIELD("ImageIconUrl"), + RC_JSON_NEW_FIELD("Achievements"), /* array */ + RC_JSON_NEW_FIELD("Leaderboards") /* array */ + }; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = subset_array_field->value_start; + iterator.end = subset_array_field->value_end; + + while (rc_json_get_array_entry_object(subset_fields, sizeof(subset_fields) / sizeof(subset_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&subset->id, &response->response, &subset_fields[0], "AchievementSetId")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&subset->game_id, &response->response, &subset_fields[1], "GameId")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_string(&subset->title, &response->response, &subset_fields[2], "Title")) + return RC_MISSING_VALUE; + if (!subset->title || !subset->title[0]) + subset->title = response->title; + + if (rc_json_field_string_matches(&subset_fields[3], "core")) + subset->type = RC_ACHIEVEMENT_SET_TYPE_CORE; + else if (rc_json_field_string_matches(&subset_fields[3], "bonus")) + subset->type = RC_ACHIEVEMENT_SET_TYPE_BONUS; + else if (rc_json_field_string_matches(&subset_fields[3], "specialty")) + subset->type = RC_ACHIEVEMENT_SET_TYPE_SPECIALTY; + else if (rc_json_field_string_matches(&subset_fields[3], "exclusive")) + subset->type = RC_ACHIEVEMENT_SET_TYPE_EXCLUSIVE; + else + subset->type = RC_ACHIEVEMENT_SET_TYPE_BONUS; + + if (rc_json_field_string_matches(&subset_fields[4], response->image_url)) { + subset->image_url = response->image_url; + subset->image_name = response->image_name; + } + else { + if (!rc_json_get_required_string(&subset->image_url, &response->response, &subset_fields[4], "ImageIconUrl")) + return RC_MISSING_VALUE; + rc_json_extract_filename(&subset_fields[4]); + rc_json_get_optional_string(&subset->image_name, &response->response, &subset_fields[4], "ImageIconUrl", ""); + } + + /* estimate the amount of space necessary to store the achievements, and leaderboards. + determine how much space each takes as a string in the JSON, then subtract out the non-data (field names, punctuation) + and add space for the structures. */ + len = (subset_fields[5].value_end - subset_fields[5].value_start) - /* achievements */ + subset_fields[5].array_size * (80 - sizeof(rc_api_achievement_definition_t)); + len += (subset_fields[6].value_end - subset_fields[6].value_start) - /* leaderboards */ + subset_fields[6].array_size * (60 - sizeof(rc_api_leaderboard_definition_t)); + + rc_buffer_reserve(&response->response.buffer, len); + /* end estimation */ + + if (!rc_json_get_required_array(&subset->num_achievements, &array_field, &response->response, &subset_fields[5], "Achievements")) + return RC_MISSING_VALUE; + + if (subset->num_achievements) { + subset->achievements = (rc_api_achievement_definition_t*)rc_buffer_alloc(&response->response.buffer, subset->num_achievements * sizeof(rc_api_achievement_definition_t)); + if (!subset->achievements) + return RC_OUT_OF_MEMORY; + + result = rc_api_process_fetch_game_data_achievements(&response->response, subset->achievements, &array_field); + if (result != RC_OK) + return result; + } + + if (!rc_json_get_required_array(&subset->num_leaderboards, &array_field, &response->response, &subset_fields[6], "Leaderboards")) + return RC_MISSING_VALUE; + + if (subset->num_leaderboards) { + subset->leaderboards = (rc_api_leaderboard_definition_t*)rc_buffer_alloc(&response->response.buffer, subset->num_leaderboards * sizeof(rc_api_leaderboard_definition_t)); + if (!subset->leaderboards) + return RC_OUT_OF_MEMORY; + + result = rc_api_process_fetch_game_data_leaderboards(&response->response, subset->leaderboards, &array_field); + if (result != RC_OK) + return result; + } + + ++subset; + } + + return RC_OK; +} + +int rc_api_process_fetch_game_sets_server_response(rc_api_fetch_game_sets_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_field_t array_field; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Code"), + RC_JSON_NEW_FIELD("GameId"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("ConsoleId"), + RC_JSON_NEW_FIELD("ImageIconUrl"), + RC_JSON_NEW_FIELD("RichPresenceGameId"), + RC_JSON_NEW_FIELD("RichPresencePatch"), + RC_JSON_NEW_FIELD("Sets") /* array */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_unum(&response->id, &response->response, &fields[3], "GameId")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->title, &response->response, &fields[4], "Title")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->console_id, &response->response, &fields[5], "ConsoleId")) + return RC_MISSING_VALUE; + + rc_json_get_required_string(&response->image_url, &response->response, &fields[6], "ImageIconUrl"); + rc_json_extract_filename(&fields[6]); + rc_json_get_required_string(&response->image_name, &response->response, &fields[6], "ImageIconUrl"); + + rc_json_get_optional_unum(&response->session_game_id, &fields[7], "RichPresenceGameId", response->id); + + rc_json_get_optional_string(&response->rich_presence_script, &response->response, &fields[8], "RichPresencePatch", ""); + if (!response->rich_presence_script) + response->rich_presence_script = ""; + + rc_json_get_optional_array(&response->num_sets, &array_field, &fields[9], "Sets"); + if (response->num_sets) { + response->sets = (rc_api_achievement_set_definition_t*)rc_buffer_alloc(&response->response.buffer, response->num_sets * sizeof(rc_api_achievement_set_definition_t)); + if (!response->sets) + return RC_OUT_OF_MEMORY; + + result = rc_api_process_fetch_game_sets_achievement_sets(response, response->sets, &array_field); + if (result != RC_OK) + return result; + } + + return RC_OK; +} + +void rc_api_destroy_fetch_game_sets_response(rc_api_fetch_game_sets_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Ping --- */ + +int rc_api_init_ping_request(rc_api_request_t* request, const rc_api_ping_request_t* api_params) { + return rc_api_init_ping_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_ping_request_hosted(rc_api_request_t* request, + const rc_api_ping_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "ping", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + + if (api_params->rich_presence && *api_params->rich_presence) + rc_url_builder_append_str_param(&builder, "m", api_params->rich_presence); + + if (api_params->game_hash && *api_params->game_hash) { + rc_url_builder_append_unum_param(&builder, "h", api_params->hardcore); + rc_url_builder_append_str_param(&builder, "x", api_params->game_hash); + } + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_ping_response(rc_api_ping_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_ping_server_response(response, &response_obj); +} + +int rc_api_process_ping_server_response(rc_api_ping_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + return rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); +} + +void rc_api_destroy_ping_response(rc_api_ping_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Award Achievement --- */ + +int rc_api_init_award_achievement_request(rc_api_request_t* request, const rc_api_award_achievement_request_t* api_params) { + return rc_api_init_award_achievement_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_award_achievement_request_hosted(rc_api_request_t* request, + const rc_api_award_achievement_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + char buffer[33]; + md5_state_t md5; + md5_byte_t digest[16]; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->achievement_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 96); + if (rc_api_url_build_dorequest(&builder, "awardachievement", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "a", api_params->achievement_id); + rc_url_builder_append_unum_param(&builder, "h", api_params->hardcore ? 1 : 0); + if (api_params->game_hash && *api_params->game_hash) + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + if (api_params->seconds_since_unlock) + rc_url_builder_append_unum_param(&builder, "o", api_params->seconds_since_unlock); + + /* Evaluate the signature. */ + md5_init(&md5); + snprintf(buffer, sizeof(buffer), "%u", api_params->achievement_id); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_append(&md5, (md5_byte_t*)api_params->username, (int)strlen(api_params->username)); + snprintf(buffer, sizeof(buffer), "%d", api_params->hardcore ? 1 : 0); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + if (api_params->seconds_since_unlock) { + /* second achievement id is needed by delegated unlock. including it here allows overloading + * the hash generating code on the server */ + snprintf(buffer, sizeof(buffer), "%u", api_params->achievement_id); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + snprintf(buffer, sizeof(buffer), "%u", api_params->seconds_since_unlock); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + } + md5_finish(&md5, digest); + rc_format_md5(buffer, digest); + rc_url_builder_append_str_param(&builder, "v", buffer); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_award_achievement_response(rc_api_award_achievement_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_award_achievement_server_response(response, &response_obj); +} + +int rc_api_process_award_achievement_server_response(rc_api_award_achievement_response_t* response, const rc_api_server_response_t* server_response) { + int result; + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Score"), + RC_JSON_NEW_FIELD("SoftcoreScore"), + RC_JSON_NEW_FIELD("AchievementID"), + RC_JSON_NEW_FIELD("AchievementsRemaining") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK) + return result; + + if (!response->response.succeeded) { + if (response->response.error_message && + memcmp(response->response.error_message, "User already has", 16) == 0) { + /* not really an error, the achievement is unlocked, just not by the current call. + * hardcore: User already has hardcore and regular achievements awarded. + * non-hardcore: User already has this achievement awarded. + */ + response->response.succeeded = 1; + } else { + return result; + } + } + + rc_json_get_optional_unum(&response->new_player_score, &fields[2], "Score", 0); + rc_json_get_optional_unum(&response->new_player_score_softcore, &fields[3], "SoftcoreScore", 0); + rc_json_get_optional_unum(&response->awarded_achievement_id, &fields[4], "AchievementID", 0); + rc_json_get_optional_unum(&response->achievements_remaining, &fields[5], "AchievementsRemaining", (unsigned)-1); + + return RC_OK; +} + +void rc_api_destroy_award_achievement_response(rc_api_award_achievement_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Submit Leaderboard Entry --- */ + +int rc_api_init_submit_lboard_entry_request(rc_api_request_t* request, const rc_api_submit_lboard_entry_request_t* api_params) { + return rc_api_init_submit_lboard_entry_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_submit_lboard_entry_request_hosted(rc_api_request_t* request, + const rc_api_submit_lboard_entry_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + char buffer[33]; + md5_state_t md5; + md5_byte_t digest[16]; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->leaderboard_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 96); + if (rc_api_url_build_dorequest(&builder, "submitlbentry", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "i", api_params->leaderboard_id); + rc_url_builder_append_num_param(&builder, "s", api_params->score); + + if (api_params->game_hash && *api_params->game_hash) + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + + if (api_params->seconds_since_completion) + rc_url_builder_append_unum_param(&builder, "o", api_params->seconds_since_completion); + + /* Evaluate the signature. */ + md5_init(&md5); + snprintf(buffer, sizeof(buffer), "%u", api_params->leaderboard_id); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + md5_append(&md5, (md5_byte_t*)api_params->username, (int)strlen(api_params->username)); + snprintf(buffer, sizeof(buffer), "%d", api_params->score); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + if (api_params->seconds_since_completion) { + snprintf(buffer, sizeof(buffer), "%u", api_params->seconds_since_completion); + md5_append(&md5, (md5_byte_t*)buffer, (int)strlen(buffer)); + } + md5_finish(&md5, digest); + rc_format_md5(buffer, digest); + rc_url_builder_append_str_param(&builder, "v", buffer); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_submit_lboard_entry_response(rc_api_submit_lboard_entry_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_submit_lboard_entry_server_response(response, &response_obj); +} + +int rc_api_process_submit_lboard_entry_server_response(rc_api_submit_lboard_entry_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_lboard_entry_t* entry; + rc_json_field_t array_field; + rc_json_iterator_t iterator; + const char* str; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Response") /* nested object */ + }; + + rc_json_field_t response_fields[] = { + RC_JSON_NEW_FIELD("Score"), + RC_JSON_NEW_FIELD("BestScore"), + RC_JSON_NEW_FIELD("RankInfo"), /* nested object */ + RC_JSON_NEW_FIELD("TopEntries") /* array */ + /* unused fields + RC_JSON_NEW_FIELD("LBData"), / * array * / + RC_JSON_NEW_FIELD("ScoreFormatted"), + RC_JSON_NEW_FIELD("TopEntriesFriends") / * array * / + * unused fields */ + }; + + /* unused fields + rc_json_field_t lbdata_fields[] = { + RC_JSON_NEW_FIELD("Format"), + RC_JSON_NEW_FIELD("LeaderboardID"), + RC_JSON_NEW_FIELD("GameID"), + RC_JSON_NEW_FIELD("Title"), + RC_JSON_NEW_FIELD("LowerIsBetter") + }; + * unused fields */ + + rc_json_field_t entry_fields[] = { + RC_JSON_NEW_FIELD("User"), + RC_JSON_NEW_FIELD("Rank"), + RC_JSON_NEW_FIELD("Score") + /* unused fields + RC_JSON_NEW_FIELD("DateSubmitted") + * unused fields */ + }; + + rc_json_field_t rank_info_fields[] = { + RC_JSON_NEW_FIELD("Rank"), + RC_JSON_NEW_FIELD("NumEntries") + /* unused fields + RC_JSON_NEW_FIELD("LowerIsBetter"), + RC_JSON_NEW_FIELD("UserRank") + * unused fields */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_object(response_fields, sizeof(response_fields) / sizeof(response_fields[0]), &response->response, &fields[2], "Response")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_num(&response->submitted_score, &response->response, &response_fields[0], "Score")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_num(&response->best_score, &response->response, &response_fields[1], "BestScore")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_object(rank_info_fields, sizeof(rank_info_fields) / sizeof(rank_info_fields[0]), &response->response, &response_fields[2], "RankInfo")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&response->new_rank, &response->response, &rank_info_fields[0], "Rank")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&str, &response->response, &rank_info_fields[1], "NumEntries")) + return RC_MISSING_VALUE; + response->num_entries = (unsigned)atoi(str); + + if (!rc_json_get_required_array(&response->num_top_entries, &array_field, &response->response, &response_fields[3], "TopEntries")) + return RC_MISSING_VALUE; + + if (response->num_top_entries) { + response->top_entries = (rc_api_lboard_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_top_entries * sizeof(rc_api_lboard_entry_t)); + if (!response->top_entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + entry = response->top_entries; + while (rc_json_get_array_entry_object(entry_fields, sizeof(entry_fields) / sizeof(entry_fields[0]), &iterator)) { + if (!rc_json_get_required_string(&entry->username, &response->response, &entry_fields[0], "User")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_unum(&entry->rank, &response->response, &entry_fields[1], "Rank")) + return RC_MISSING_VALUE; + + if (!rc_json_get_required_num(&entry->score, &response->response, &entry_fields[2], "Score")) + return RC_MISSING_VALUE; + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_submit_lboard_entry_response(rc_api_submit_lboard_entry_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} diff --git a/src/rcheevos/src/rapi/rc_api_user.c b/src/rcheevos/src/rapi/rc_api_user.c new file mode 100644 index 0000000000..323756cfd1 --- /dev/null +++ b/src/rcheevos/src/rapi/rc_api_user.c @@ -0,0 +1,483 @@ +#include "rc_api_user.h" +#include "rc_api_common.h" +#include "rc_api_runtime.h" +#include "rc_consoles.h" + +#include "../rc_version.h" + +#include +#include + +/* --- Login --- */ + +int rc_api_init_login_request(rc_api_request_t* request, const rc_api_login_request_t* api_params) { + return rc_api_init_login_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_login_request_hosted(rc_api_request_t* request, + const rc_api_login_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (!api_params->username || !*api_params->username) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + rc_url_builder_append_str_param(&builder, "r", "login2"); + rc_url_builder_append_str_param(&builder, "u", api_params->username); + + if (api_params->password && api_params->password[0]) + rc_url_builder_append_str_param(&builder, "p", api_params->password); + else if (api_params->api_token && api_params->api_token[0]) + rc_url_builder_append_str_param(&builder, "t", api_params->api_token); + else + return RC_INVALID_STATE; + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + + return builder.result; +} + +int rc_api_process_login_response(rc_api_login_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_login_server_response(response, &response_obj); +} + +int rc_api_process_login_server_response(rc_api_login_response_t* response, const rc_api_server_response_t* server_response) { + int result; + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Code"), + RC_JSON_NEW_FIELD("User"), + RC_JSON_NEW_FIELD("Token"), + RC_JSON_NEW_FIELD("Score"), + RC_JSON_NEW_FIELD("SoftcoreScore"), + RC_JSON_NEW_FIELD("Messages"), + RC_JSON_NEW_FIELD("AvatarUrl") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_string(&response->username, &response->response, &fields[3], "User")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&response->api_token, &response->response, &fields[4], "Token")) + return RC_MISSING_VALUE; + + rc_json_get_optional_unum(&response->score, &fields[5], "Score", 0); + rc_json_get_optional_unum(&response->score_softcore, &fields[6], "SoftcoreScore", 0); + rc_json_get_optional_unum(&response->num_unread_messages, &fields[7], "Messages", 0); + + /* For the highest level of backwards compatibility, we have decided to just send the + * display_name back to the client as the "case-corrected username", and allow it to + * be used as the Username field for the other APIs. */ + response->display_name = response->username; + + rc_json_get_optional_string(&response->avatar_url, &response->response, &fields[8], "AvatarUrl", NULL); + if (!response->avatar_url) + response->avatar_url = rc_api_build_avatar_url(&response->response.buffer, RC_IMAGE_TYPE_USER, response->username); + + return RC_OK; +} + +void rc_api_destroy_login_response(rc_api_login_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Start Session --- */ + +int rc_api_init_start_session_request(rc_api_request_t* request, const rc_api_start_session_request_t* api_params) { + return rc_api_init_start_session_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_start_session_request_hosted(rc_api_request_t* request, + const rc_api_start_session_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->game_id == 0) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "startsession", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + + if (api_params->game_hash && *api_params->game_hash) { + rc_url_builder_append_unum_param(&builder, "h", api_params->hardcore); + rc_url_builder_append_str_param(&builder, "m", api_params->game_hash); + } + + rc_url_builder_append_str_param(&builder, "l", RCHEEVOS_VERSION_STRING); + + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_start_session_response(rc_api_start_session_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_start_session_server_response(response, &response_obj); +} + +int rc_api_process_start_session_server_response(rc_api_start_session_response_t* response, const rc_api_server_response_t* server_response) { + rc_api_unlock_entry_t* unlock; + rc_json_field_t array_field; + rc_json_iterator_t iterator; + uint32_t timet; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Unlocks"), + RC_JSON_NEW_FIELD("HardcoreUnlocks"), + RC_JSON_NEW_FIELD("ServerNow") + }; + + rc_json_field_t unlock_entry_fields[] = { + RC_JSON_NEW_FIELD("ID"), + RC_JSON_NEW_FIELD("When") + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (rc_json_get_optional_array(&response->num_unlocks, &array_field, &fields[2], "Unlocks") && response->num_unlocks) { + response->unlocks = (rc_api_unlock_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_unlocks * sizeof(rc_api_unlock_entry_t)); + if (!response->unlocks) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + unlock = response->unlocks; + while (rc_json_get_array_entry_object(unlock_entry_fields, sizeof(unlock_entry_fields) / sizeof(unlock_entry_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&unlock->achievement_id, &response->response, &unlock_entry_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&timet, &response->response, &unlock_entry_fields[1], "When")) + return RC_MISSING_VALUE; + unlock->when = (time_t)timet; + + ++unlock; + } + } + + if (rc_json_get_optional_array(&response->num_hardcore_unlocks, &array_field, &fields[3], "HardcoreUnlocks") && response->num_hardcore_unlocks) { + response->hardcore_unlocks = (rc_api_unlock_entry_t*)rc_buffer_alloc(&response->response.buffer, response->num_hardcore_unlocks * sizeof(rc_api_unlock_entry_t)); + if (!response->hardcore_unlocks) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + unlock = response->hardcore_unlocks; + while (rc_json_get_array_entry_object(unlock_entry_fields, sizeof(unlock_entry_fields) / sizeof(unlock_entry_fields[0]), &iterator)) { + if (!rc_json_get_required_unum(&unlock->achievement_id, &response->response, &unlock_entry_fields[0], "ID")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&timet, &response->response, &unlock_entry_fields[1], "When")) + return RC_MISSING_VALUE; + unlock->when = (time_t)timet; + + ++unlock; + } + } + + rc_json_get_optional_unum(&timet, &fields[4], "ServerNow", 0); + response->server_now = (time_t)timet; + + return RC_OK; +} + +void rc_api_destroy_start_session_response(rc_api_start_session_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch User Unlocks --- */ + +int rc_api_init_fetch_user_unlocks_request(rc_api_request_t* request, const rc_api_fetch_user_unlocks_request_t* api_params) { + return rc_api_init_fetch_user_unlocks_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_user_unlocks_request_hosted(rc_api_request_t* request, + const rc_api_fetch_user_unlocks_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "unlocks", api_params->username, api_params->api_token)) { + rc_url_builder_append_unum_param(&builder, "g", api_params->game_id); + rc_url_builder_append_unum_param(&builder, "h", api_params->hardcore ? 1 : 0); + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_fetch_user_unlocks_response(rc_api_fetch_user_unlocks_response_t* response, const char* server_response) { + rc_api_server_response_t response_obj; + + memset(&response_obj, 0, sizeof(response_obj)); + response_obj.body = server_response; + response_obj.body_length = rc_json_get_object_string_length(server_response); + + return rc_api_process_fetch_user_unlocks_server_response(response, &response_obj); +} + +int rc_api_process_fetch_user_unlocks_server_response(rc_api_fetch_user_unlocks_response_t* response, const rc_api_server_response_t* server_response) { + int result; + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("UserUnlocks") + /* unused fields + RC_JSON_NEW_FIELD("GameID"), + RC_JSON_NEW_FIELD("HardcoreMode") + * unused fields */ + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + result = rc_json_get_required_unum_array(&response->achievement_ids, &response->num_achievement_ids, &response->response, &fields[2], "UserUnlocks"); + return result; +} + +void rc_api_destroy_fetch_user_unlocks_response(rc_api_fetch_user_unlocks_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch Followed Users --- */ + +int rc_api_init_fetch_followed_users_request(rc_api_request_t* request, const rc_api_fetch_followed_users_request_t* api_params) { + return rc_api_init_fetch_followed_users_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_followed_users_request_hosted(rc_api_request_t* request, + const rc_api_fetch_followed_users_request_t* api_params, + const rc_api_host_t* host) { + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "getfriendlist", api_params->username, api_params->api_token)) { + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_fetch_followed_users_server_response(rc_api_fetch_followed_users_response_t* response, const rc_api_server_response_t* server_response) { + rc_json_field_t array_field; + rc_json_iterator_t iterator; + rc_api_followed_user_t* user; + uint32_t timet; + int result; + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Friends") + }; + + rc_json_field_t followed_user_entry_fields[] = { + RC_JSON_NEW_FIELD("Friend"), + RC_JSON_NEW_FIELD("AvatarUrl"), + RC_JSON_NEW_FIELD("RAPoints"), + RC_JSON_NEW_FIELD("LastSeen"), + RC_JSON_NEW_FIELD("LastSeenTime"), + RC_JSON_NEW_FIELD("LastGameId"), + RC_JSON_NEW_FIELD("LastGameTitle"), + RC_JSON_NEW_FIELD("LastGameIconUrl"), + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!rc_json_get_required_array(&response->num_users, &array_field, &response->response, &fields[2], "Friends")) + return RC_MISSING_VALUE; + + if (response->num_users) { + response->users = (rc_api_followed_user_t*)rc_buffer_alloc(&response->response.buffer, response->num_users * sizeof(rc_api_followed_user_t)); + if (!response->users) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = array_field.value_start; + iterator.end = array_field.value_end; + + user = response->users; + while (rc_json_get_array_entry_object(followed_user_entry_fields, sizeof(followed_user_entry_fields) / sizeof(followed_user_entry_fields[0]), &iterator)) { + if (!rc_json_get_required_string(&user->display_name, &response->response, &followed_user_entry_fields[0], "Friend")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_string(&user->avatar_url, &response->response, &followed_user_entry_fields[1], "AvatarUrl")) + return RC_MISSING_VALUE; + if (!rc_json_get_required_unum(&user->score, &response->response, &followed_user_entry_fields[2], "RAPoints")) + return RC_MISSING_VALUE; + + rc_json_get_optional_string(&user->recent_activity.description, &response->response, &followed_user_entry_fields[3], "LastSeen", NULL); + + rc_json_get_optional_unum(&timet, &followed_user_entry_fields[4], "LastSeenTime", 0); + user->recent_activity.when = (time_t)timet; + + rc_json_get_optional_unum(&user->recent_activity.context_id, &followed_user_entry_fields[5], "LastGameId", 0); + rc_json_get_optional_string(&user->recent_activity.context, &response->response, &followed_user_entry_fields[6], "LastGameTitle", NULL); + rc_json_get_optional_string(&user->recent_activity.context_image_url, &response->response, &followed_user_entry_fields[7], "LastGameIconUrl", NULL); + + ++user; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_followed_users_response(rc_api_fetch_followed_users_response_t* response) { + rc_buffer_destroy(&response->response.buffer); +} + +/* --- Fetch All Progress --- */ + +int rc_api_init_fetch_all_user_progress_request(rc_api_request_t* request, + const rc_api_fetch_all_user_progress_request_t* api_params) +{ + return rc_api_init_fetch_all_user_progress_request_hosted(request, api_params, &g_host); +} + +int rc_api_init_fetch_all_user_progress_request_hosted(rc_api_request_t* request, + const rc_api_fetch_all_user_progress_request_t* api_params, + const rc_api_host_t* host) +{ + rc_api_url_builder_t builder; + + rc_api_url_build_dorequest_url(request, host); + + if (api_params->console_id == RC_CONSOLE_UNKNOWN) + return RC_INVALID_STATE; + + rc_url_builder_init(&builder, &request->buffer, 48); + if (rc_api_url_build_dorequest(&builder, "allprogress", api_params->username, api_params->api_token)) + { + rc_url_builder_append_unum_param(&builder, "c", api_params->console_id); + request->post_data = rc_url_builder_finalize(&builder); + request->content_type = RC_CONTENT_TYPE_URLENCODED; + } + + return builder.result; +} + +int rc_api_process_fetch_all_user_progress_server_response(rc_api_fetch_all_user_progress_response_t* response, + const rc_api_server_response_t* server_response) +{ + rc_api_all_user_progress_entry_t* entry; + int result; + + rc_json_field_t fields[] = { + RC_JSON_NEW_FIELD("Success"), + RC_JSON_NEW_FIELD("Error"), + RC_JSON_NEW_FIELD("Response"), + }; + + rc_json_field_t entry_fields[] = { + RC_JSON_NEW_FIELD("Achievements"), + RC_JSON_NEW_FIELD("Unlocked"), + RC_JSON_NEW_FIELD("UnlockedHardcore"), + }; + + memset(response, 0, sizeof(*response)); + rc_buffer_init(&response->response.buffer); + + result = + rc_json_parse_server_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); + if (result != RC_OK || !response->response.succeeded) + return result; + + if (!fields[2].value_start) { + /* call rc_json_get_required_object to generate the error message */ + rc_json_get_required_object(NULL, 0, &response->response, &fields[2], "Response"); + return RC_MISSING_VALUE; + } + + response->num_entries = fields[2].array_size; + + if (response->num_entries > 0) { + rc_json_iterator_t iterator; + rc_json_field_t field; + char* end; + + rc_buffer_reserve(&response->response.buffer, response->num_entries * sizeof(rc_api_all_user_progress_entry_t)); + + response->entries = (rc_api_all_user_progress_entry_t*)rc_buffer_alloc( + &response->response.buffer, response->num_entries * sizeof(rc_api_all_user_progress_entry_t)); + if (!response->entries) + return RC_OUT_OF_MEMORY; + + memset(&iterator, 0, sizeof(iterator)); + iterator.json = fields[2].value_start; + iterator.end = fields[2].value_end; + + entry = response->entries; + while (rc_json_get_next_object_field(&iterator, &field)) + { + entry->game_id = strtol(field.name, &end, 10); + + field.name = ""; + if (!rc_json_get_required_object(entry_fields, sizeof(entry_fields) / sizeof(entry_fields[0]), + &response->response, &field, "")) + { + return RC_MISSING_VALUE; + } + + rc_json_get_optional_unum(&entry->num_achievements, &entry_fields[0], "Achievements", 0); + rc_json_get_optional_unum(&entry->num_unlocked_achievements, &entry_fields[1], "Unlocked", 0); + rc_json_get_optional_unum(&entry->num_unlocked_achievements_hardcore, &entry_fields[2], "UnlockedHardcore", 0); + + ++entry; + } + } + + return RC_OK; +} + +void rc_api_destroy_fetch_all_user_progress_response(rc_api_fetch_all_user_progress_response_t* response) +{ + rc_buffer_destroy(&response->response.buffer); +} diff --git a/src/rcheevos/src/rc_client.c b/src/rcheevos/src/rc_client.c new file mode 100644 index 0000000000..22a4ade167 --- /dev/null +++ b/src/rcheevos/src/rc_client.c @@ -0,0 +1,6775 @@ +#include "rc_client_internal.h" + +#include "rc_api_info.h" +#include "rc_api_runtime.h" +#include "rc_api_user.h" +#include "rc_consoles.h" +#include "rc_hash.h" +#include "rc_version.h" + +#include "rapi/rc_api_common.h" + +#include "rcheevos/rc_internal.h" + +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include +#else +#include +#endif + +#define RC_CLIENT_UNKNOWN_GAME_ID (uint32_t)-1 +#define RC_CLIENT_RECENT_UNLOCK_DELAY_SECONDS (10 * 60) /* ten minutes */ + +#define RC_MINIMUM_UNPAUSED_FRAMES 20 +#define RC_PAUSE_DECAY_MULTIPLIER 4 + +enum { + RC_CLIENT_ASYNC_NOT_ABORTED = 0, + RC_CLIENT_ASYNC_ABORTED = 1, + RC_CLIENT_ASYNC_DESTROYED = 2 +}; + +typedef struct rc_client_generic_callback_data_t { + rc_client_t* client; + rc_client_callback_t callback; + void* callback_userdata; + rc_client_async_handle_t async_handle; +} rc_client_generic_callback_data_t; + +typedef struct rc_client_pending_media_t +{ +#ifdef RC_CLIENT_SUPPORTS_HASH + const char* file_path; + uint8_t* data; + size_t data_size; +#endif + const char* hash; + rc_client_callback_t callback; + void* callback_userdata; +} rc_client_pending_media_t; + +typedef struct rc_client_load_state_t +{ + rc_client_t* client; + rc_client_callback_t callback; + void* callback_userdata; + + rc_client_game_info_t* game; + rc_client_subset_info_t* subset; + rc_client_game_hash_t* hash; + +#ifdef RC_CLIENT_SUPPORTS_HASH + rc_hash_iterator_t hash_iterator; + rc_client_game_hash_t* tried_hashes[4]; +#endif + rc_client_pending_media_t* pending_media; + + rc_api_start_session_response_t *start_session_response; + + rc_client_async_handle_t async_handle; + + uint8_t progress; + uint8_t outstanding_requests; +#ifdef RC_CLIENT_SUPPORTS_HASH + uint8_t hash_console_id; +#endif +} rc_client_load_state_t; + +static void rc_client_process_resolved_hash(rc_client_load_state_t* load_state); +static void rc_client_begin_fetch_game_sets(rc_client_load_state_t* callback_data); +static void rc_client_hide_progress_tracker(rc_client_t* client, rc_client_game_info_t* game); +static void rc_client_load_error(rc_client_load_state_t* load_state, int result, const char* error_message); +static rc_client_async_handle_t* rc_client_load_game(rc_client_load_state_t* load_state, const char* hash, const char* file_path); +static void rc_client_ping(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now); +static void rc_client_raise_leaderboard_events(rc_client_t* client, rc_client_subset_info_t* subset); +static void rc_client_raise_pending_events(rc_client_t* client, rc_client_game_info_t* game); +static void rc_client_reschedule_callback(rc_client_t* client, rc_client_scheduled_callback_data_t* callback, rc_clock_t when); +static void rc_client_award_achievement_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now); +static int rc_client_is_award_achievement_pending(const rc_client_t* client, uint32_t achievement_id); +static void rc_client_submit_leaderboard_entry_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now); + +/* ===== natvis extensions ===== */ + +typedef struct __rc_client_achievement_state_enum_t { uint8_t value; } __rc_client_achievement_state_enum_t; +typedef struct __rc_client_achievement_category_enum_t { uint8_t value; } __rc_client_achievement_category_enum_t; +typedef struct __rc_client_achievement_type_enum_t { uint8_t value; } __rc_client_achievement_type_enum_t; +typedef struct __rc_client_achievement_bucket_enum_t { uint8_t value; } __rc_client_achievement_bucket_enum_t; +typedef struct __rc_client_achievement_unlocked_enum_t { uint8_t value; } __rc_client_achievement_unlocked_enum_t; +typedef struct __rc_client_leaderboard_state_enum_t { uint8_t value; } __rc_client_leaderboard_state_enum_t; +typedef struct __rc_client_leaderboard_format_enum_t { uint8_t value; } __rc_client_leaderboard_format_enum_t; +typedef struct __rc_client_log_level_enum_t { uint8_t value; } __rc_client_log_level_enum_t; +typedef struct __rc_client_event_type_enum_t { uint8_t value; } __rc_client_event_type_enum_t; +typedef struct __rc_client_load_game_state_enum_t { uint8_t value; } __rc_client_load_game_state_enum_t; +typedef struct __rc_client_user_state_enum_t { uint8_t value; } __rc_client_user_state_enum_t; +typedef struct __rc_client_mastery_state_enum_t { uint8_t value; } __rc_client_mastery_state_enum_t; +typedef struct __rc_client_spectator_mode_enum_t { uint8_t value; } __rc_client_spectator_mode_enum_t; +typedef struct __rc_client_disconnect_enum_t { uint8_t value; } __rc_client_disconnect_enum_t; +typedef struct __rc_client_leaderboard_tracker_list_t { rc_client_leaderboard_tracker_info_t* first; } __rc_client_leaderboard_tracker_list_t; +typedef struct __rc_client_subset_info_list_t { rc_client_subset_info_t* first; } __rc_client_subset_info_list_t; +typedef struct __rc_client_media_hash_list_t { rc_client_media_hash_t* first; } __rc_client_media_hash_list_t; +typedef struct __rc_client_subset_info_achievements_list_t { rc_client_subset_info_t info; } __rc_client_subset_info_achievements_list_t; +typedef struct __rc_client_subset_info_leaderboards_list_t { rc_client_subset_info_t info; } __rc_client_subset_info_leaderboards_list_t; +typedef struct __rc_client_scheduled_callback_list_t { rc_client_state_t state; } __rc_client_scheduled_callback_list_t; +typedef struct __rc_client_game_hash_list_t { rc_client_t client; } __rc_client_game_hash_list_t; + +static void rc_client_natvis_helper(const rc_client_event_t* event, rc_client_t* client) +{ + struct natvis_extensions { + __rc_client_achievement_state_enum_t achievement_state; + __rc_client_achievement_category_enum_t achievement_category; + __rc_client_achievement_type_enum_t achievement_type; + __rc_client_achievement_bucket_enum_t achievement_bucket; + __rc_client_achievement_unlocked_enum_t achievement_unlocked; + __rc_client_leaderboard_state_enum_t leaderboard_state; + __rc_client_leaderboard_format_enum_t leaderboard_format; + __rc_client_log_level_enum_t log_level; + __rc_client_event_type_enum_t event_type; + __rc_client_load_game_state_enum_t load_game_state; + __rc_client_user_state_enum_t user_state; + __rc_client_mastery_state_enum_t mastery_state; + __rc_client_spectator_mode_enum_t spectator_mode; + __rc_client_disconnect_enum_t disconnect; + __rc_client_leaderboard_tracker_list_t leaderboard_tracker_list; + __rc_client_subset_info_list_t subset_info_list; + __rc_client_media_hash_list_t media_hash_list; + __rc_client_subset_info_achievements_list_t subset_info_achievements_list; + __rc_client_subset_info_leaderboards_list_t subset_info_leaderboards_list; + __rc_client_scheduled_callback_list_t scheduled_callback_list; + __rc_client_game_hash_list_t client_game_hash_list; + } natvis; + + memset(&natvis, 0, sizeof(natvis)); + (void)event; + (void)client; + + /* this code should never be executed. it just ensures these constants get defined for + * the natvis VisualStudio extension as they're not used directly in the code. */ + natvis.achievement_type.value = RC_CLIENT_ACHIEVEMENT_TYPE_STANDARD; + natvis.achievement_type.value = RC_CLIENT_ACHIEVEMENT_TYPE_MISSABLE; + natvis.achievement_type.value = RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION; + natvis.achievement_type.value = RC_CLIENT_ACHIEVEMENT_TYPE_WIN; + natvis.achievement_category.value = RC_CLIENT_ACHIEVEMENT_CATEGORY_NONE; + natvis.event_type.value = RC_CLIENT_EVENT_TYPE_NONE; +} + +/* ===== Construction/Destruction ===== */ + +static void rc_client_dummy_event_handler(const rc_client_event_t* event, rc_client_t* client) +{ + (void)event; + (void)client; +} + +rc_client_t* rc_client_create(rc_client_read_memory_func_t read_memory_function, rc_client_server_call_t server_call_function) +{ + rc_client_t* client = (rc_client_t*)calloc(1, sizeof(rc_client_t)); + if (!client) + return NULL; + + client->state.hardcore = 1; + client->state.required_unpaused_frames = RC_MINIMUM_UNPAUSED_FRAMES; + client->state.allow_background_memory_reads = 1; + + client->callbacks.read_memory = read_memory_function; + client->callbacks.server_call = server_call_function; + client->callbacks.event_handler = rc_client_natvis_helper; + client->callbacks.event_handler = rc_client_dummy_event_handler; + rc_client_set_legacy_peek(client, RC_CLIENT_LEGACY_PEEK_AUTO); + rc_client_set_get_time_millisecs_function(client, NULL); + + rc_mutex_init(&client->state.mutex); + + rc_buffer_init(&client->state.buffer); + + return client; +} + +void rc_client_destroy(rc_client_t* client) +{ + if (!client) + return; + + rc_mutex_lock(&client->state.mutex); + { + size_t i; + for (i = 0; i < sizeof(client->state.async_handles) / sizeof(client->state.async_handles[0]); ++i) { + if (client->state.async_handles[i]) + client->state.async_handles[i]->aborted = RC_CLIENT_ASYNC_DESTROYED; + } + + if (client->state.load) { + client->state.load->async_handle.aborted = RC_CLIENT_ASYNC_DESTROYED; + client->state.load = NULL; + } + } + rc_mutex_unlock(&client->state.mutex); + + rc_client_unload_game(client); + +#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION + rc_client_unload_raintegration(client); +#endif + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->destroy) + client->state.external_client->destroy(); +#endif + + rc_buffer_destroy(&client->state.buffer); + + rc_mutex_destroy(&client->state.mutex); + + free(client); +} + +/* ===== Logging ===== */ + +void rc_client_log_message(const rc_client_t* client, const char* message) +{ + if (client->callbacks.log_call) + client->callbacks.log_call(message, client); +} + +static void rc_client_log_message_va(const rc_client_t* client, const char* format, va_list args) +{ + if (client->callbacks.log_call) { + char buffer[2048]; + +#ifdef __STDC_SECURE_LIB__ + vsprintf_s(buffer, sizeof(buffer), format, args); +#elif __STDC_VERSION__ >= 199901L /* vsnprintf requires c99 */ + vsnprintf(buffer, sizeof(buffer), format, args); +#else /* c89 doesn't have a size-limited vsprintf function - assume the buffer is large enough */ + vsprintf(buffer, format, args); +#endif + + client->callbacks.log_call(buffer, client); + } +} + +#ifdef RC_NO_VARIADIC_MACROS + +void RC_CLIENT_LOG_ERR_FORMATTED(const rc_client_t* client, const char* format, ...) +{ + if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) { + va_list args; + va_start(args, format); + rc_client_log_message_va(client, format, args); + va_end(args); + } +} + +void RC_CLIENT_LOG_WARN_FORMATTED(const rc_client_t* client, const char* format, ...) +{ + if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_WARN) { + va_list args; + va_start(args, format); + rc_client_log_message_va(client, format, args); + va_end(args); + } +} + +void RC_CLIENT_LOG_INFO_FORMATTED(const rc_client_t* client, const char* format, ...) +{ + if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) { + va_list args; + va_start(args, format); + rc_client_log_message_va(client, format, args); + va_end(args); + } +} + +void RC_CLIENT_LOG_VERBOSE_FORMATTED(const rc_client_t* client, const char* format, ...) +{ + if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_VERBOSE) { + va_list args; + va_start(args, format); + rc_client_log_message_va(client, format, args); + va_end(args); + } +} + +#else + +void rc_client_log_message_formatted(const rc_client_t* client, const char* format, ...) +{ + va_list args; + va_start(args, format); + rc_client_log_message_va(client, format, args); + va_end(args); +} + +#endif /* RC_NO_VARIADIC_MACROS */ + +void rc_client_enable_logging(rc_client_t* client, int level, rc_client_message_callback_t callback) +{ + client->callbacks.log_call = callback; + client->state.log_level = callback ? level : RC_CLIENT_LOG_LEVEL_NONE; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->enable_logging) + client->state.external_client->enable_logging(client, level, callback); +#endif +} + +/* ===== Common ===== */ + +static rc_clock_t rc_client_clock_get_now_millisecs(const rc_client_t* client) +{ +#if defined(CLOCK_MONOTONIC) + struct timespec now; + (void)client; + + if (clock_gettime(CLOCK_MONOTONIC, &now) < 0) + return 0; + + /* round nanoseconds to nearest millisecond and add to seconds */ + return ((rc_clock_t)now.tv_sec * 1000 + ((rc_clock_t)now.tv_nsec / 1000000)); +#elif defined(_WIN32) + static LARGE_INTEGER freq; + LARGE_INTEGER ticks; + + (void)client; + + /* Frequency is the number of ticks per second and is guaranteed to not change. */ + if (!freq.QuadPart) { + if (!QueryPerformanceFrequency(&freq)) + return 0; + + /* convert to number of ticks per millisecond to simplify later calculations */ + freq.QuadPart /= 1000; + } + + if (!QueryPerformanceCounter(&ticks)) + return 0; + + return (rc_clock_t)(ticks.QuadPart / freq.QuadPart); +#else + const clock_t clock_now = clock(); + + (void)client; + + if (sizeof(clock_t) == 4) { + static uint32_t clock_wraps = 0; + static clock_t last_clock = 0; + static time_t last_timet = 0; + const time_t time_now = time(NULL); + + if (last_timet != 0) { + const time_t seconds_per_clock_t = (time_t)(((uint64_t)1 << 32) / CLOCKS_PER_SEC); + if (clock_now < last_clock) { + /* clock() has wrapped */ + ++clock_wraps; + } + else if (time_now - last_timet > seconds_per_clock_t) { + /* it's been long enough that clock() has wrapped and is higher than the last time it was read */ + ++clock_wraps; + } + } + + last_timet = time_now; + last_clock = clock_now; + + return (rc_clock_t)((((uint64_t)clock_wraps << 32) | clock_now) / (CLOCKS_PER_SEC / 1000)); + } + else { + return (rc_clock_t)(clock_now / (CLOCKS_PER_SEC / 1000)); + } +#endif +} + +void rc_client_set_get_time_millisecs_function(rc_client_t* client, rc_get_time_millisecs_func_t handler) +{ + client->callbacks.get_time_millisecs = handler ? handler : rc_client_clock_get_now_millisecs; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_get_time_millisecs) + client->state.external_client->set_get_time_millisecs(client, handler); +#endif +} + +int rc_client_async_handle_aborted(rc_client_t* client, rc_client_async_handle_t* async_handle) +{ + int aborted; + + rc_mutex_lock(&client->state.mutex); + aborted = async_handle->aborted; + rc_mutex_unlock(&client->state.mutex); + + return aborted; +} + +static void rc_client_begin_async(rc_client_t* client, rc_client_async_handle_t* async_handle) +{ + size_t i; + + rc_mutex_lock(&client->state.mutex); + for (i = 0; i < sizeof(client->state.async_handles) / sizeof(client->state.async_handles[0]); ++i) { + if (!client->state.async_handles[i]) { + client->state.async_handles[i] = async_handle; + break; + } + } + rc_mutex_unlock(&client->state.mutex); +} + +static int rc_client_end_async(rc_client_t* client, rc_client_async_handle_t* async_handle) +{ + int aborted = async_handle->aborted; + + /* if client was destroyed, mutex doesn't exist and we don't need to remove the handle from the collection */ + if (aborted != RC_CLIENT_ASYNC_DESTROYED) { + size_t i; + + rc_mutex_lock(&client->state.mutex); + for (i = 0; i < sizeof(client->state.async_handles) / sizeof(client->state.async_handles[0]); ++i) { + if (client->state.async_handles[i] == async_handle) { + client->state.async_handles[i] = NULL; + break; + } + } + aborted = async_handle->aborted; + + rc_mutex_unlock(&client->state.mutex); + } + + return aborted; +} + +void rc_client_abort_async(rc_client_t* client, rc_client_async_handle_t* async_handle) +{ + if (async_handle && client) { +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->abort_async) { + client->state.external_client->abort_async(async_handle); + return; + } +#endif + + rc_mutex_lock(&client->state.mutex); + async_handle->aborted = RC_CLIENT_ASYNC_ABORTED; + rc_mutex_unlock(&client->state.mutex); + } +} + +static int rc_client_async_handle_valid(rc_client_t* client, rc_client_async_handle_t* async_handle) +{ + int valid = 0; + size_t i; + + /* there is a small window of opportunity where the client could have been destroyed before calling + * this function, but this function assumes the possibility that the handle has been destroyed, so + * we can't check it for RC_CLIENT_ASYNC_DESTROYED before attempting to scan the client data */ + rc_mutex_lock(&client->state.mutex); + + for (i = 0; i < sizeof(client->state.async_handles) / sizeof(client->state.async_handles[0]); ++i) { + if (client->state.async_handles[i] == async_handle) { + valid = 1; + break; + } + } + + rc_mutex_unlock(&client->state.mutex); + + return valid; +} + +static const char* rc_client_server_error_message(int* result, int http_status_code, const rc_api_response_t* response) +{ + if (!response->succeeded) { + if (*result == RC_OK) { + *result = RC_API_FAILURE; + if (!response->error_message) + return "Unexpected API failure with no error message"; + } + + if (response->error_message) + return response->error_message; + } + + (void)http_status_code; + + if (*result != RC_OK) + return rc_error_str(*result); + + return NULL; +} + +static void rc_client_raise_server_error_event(rc_client_t* client, + const char* api, uint32_t related_id, int result, const char* error_message) +{ + rc_client_server_error_t server_error; + rc_client_event_t client_event; + + server_error.api = api; + server_error.error_message = error_message; + server_error.result = result; + server_error.related_id = related_id; + + memset(&client_event, 0, sizeof(client_event)); + client_event.type = RC_CLIENT_EVENT_SERVER_ERROR; + client_event.server_error = &server_error; + + client->callbacks.event_handler(&client_event, client); +} + +static void rc_client_update_disconnect_state(rc_client_t* client) +{ + rc_client_scheduled_callback_data_t* scheduled_callback; + uint8_t new_state = RC_CLIENT_DISCONNECT_HIDDEN; + + rc_mutex_lock(&client->state.mutex); + + scheduled_callback = client->state.scheduled_callbacks; + for (; scheduled_callback; scheduled_callback = scheduled_callback->next) { + if (scheduled_callback->callback == rc_client_award_achievement_retry || + scheduled_callback->callback == rc_client_submit_leaderboard_entry_retry) { + new_state = RC_CLIENT_DISCONNECT_VISIBLE; + break; + } + } + + if ((client->state.disconnect & RC_CLIENT_DISCONNECT_VISIBLE) != new_state) { + if (new_state == RC_CLIENT_DISCONNECT_VISIBLE) + client->state.disconnect = RC_CLIENT_DISCONNECT_HIDDEN | RC_CLIENT_DISCONNECT_SHOW_PENDING; + else + client->state.disconnect = RC_CLIENT_DISCONNECT_VISIBLE | RC_CLIENT_DISCONNECT_HIDE_PENDING; + } + else { + client->state.disconnect = new_state; + } + + rc_mutex_unlock(&client->state.mutex); +} + +static void rc_client_raise_disconnect_events(rc_client_t* client) +{ + rc_client_event_t client_event; + uint8_t new_state; + + rc_mutex_lock(&client->state.mutex); + + if (client->state.disconnect & RC_CLIENT_DISCONNECT_SHOW_PENDING) + new_state = RC_CLIENT_DISCONNECT_VISIBLE; + else + new_state = RC_CLIENT_DISCONNECT_HIDDEN; + client->state.disconnect = new_state; + + rc_mutex_unlock(&client->state.mutex); + + memset(&client_event, 0, sizeof(client_event)); + client_event.type = (new_state == RC_CLIENT_DISCONNECT_VISIBLE) ? + RC_CLIENT_EVENT_DISCONNECTED : RC_CLIENT_EVENT_RECONNECTED; + client->callbacks.event_handler(&client_event, client); +} + +static int rc_client_should_retry(const rc_api_server_response_t* server_response) +{ + switch (server_response->http_status_code) { + case 502: /* 502 Bad Gateway */ + /* nginx connection pool full */ + return 1; + + case 503: /* 503 Service Temporarily Unavailable */ + /* site is in maintenance mode */ + return 1; + + case 504: /* 504 Gateway Timeout */ + /* timeout between web server and database server */ + return 1; + + case 429: /* 429 Too Many Requests */ + /* too many unlocks occurred at the same time */ + return 1; + + case 521: /* 521 Web Server is Down */ + /* cloudfare could not find the server */ + return 1; + + case 522: /* 522 Connection Timed Out */ + /* timeout connecting to server from cloudfare */ + return 1; + + case 523: /* 523 Origin is Unreachable */ + /* cloudfare cannot find server */ + return 1; + + case 524: /* 524 A Timeout Occurred */ + /* connection to server from cloudfare was dropped before request was completed */ + return 1; + + case 525: /* 525 SSL Handshake Failed */ + /* web server worker connection pool is exhausted */ + return 1; + + case RC_API_SERVER_RESPONSE_RETRYABLE_CLIENT_ERROR: + /* client provided non-HTTP error (explicitly retryable) */ + return 1; + + case RC_API_SERVER_RESPONSE_CLIENT_ERROR: + /* client provided non-HTTP error (implicitly non-retryable) */ + return 0; + + default: + /* assume any error not handled above where no response was received should be retried */ + if (server_response->body_length == 0 || !server_response->body || !server_response->body[0]) + return 1; + + return 0; + } +} + +static int rc_client_get_image_url(char buffer[], size_t buffer_size, int image_type, const char* image_name) +{ + rc_api_fetch_image_request_t image_request; + rc_api_request_t request; + int result; + + if (!buffer) + return RC_INVALID_STATE; + + memset(&image_request, 0, sizeof(image_request)); + image_request.image_type = image_type; + image_request.image_name = image_name; + result = rc_api_init_fetch_image_request_hosted(&request, &image_request, NULL); + if (result == RC_OK) + snprintf(buffer, buffer_size, "%s", request.url); + + rc_api_destroy_request(&request); + return result; +} + +/* ===== User ===== */ + +static void rc_client_login_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_generic_callback_data_t* login_callback_data = (rc_client_generic_callback_data_t*)callback_data; + rc_client_t* client = login_callback_data->client; + rc_api_login_response_t login_response; + rc_client_load_state_t* load_state; + const char* error_message; + int result; + + result = rc_client_end_async(client, &login_callback_data->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) + rc_client_logout(client); /* logout will reset the user state and call the load game callback */ + + free(login_callback_data); + return; + } + + if (client->state.user == RC_CLIENT_USER_STATE_NONE) { + /* logout was called */ + if (login_callback_data->callback) + login_callback_data->callback(RC_ABORTED, "Login aborted", client, login_callback_data->callback_userdata); + + free(login_callback_data); + /* logout call will immediately abort load game before this callback gets called */ + return; + } + + result = rc_api_process_login_server_response(&login_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &login_response.response); + if (error_message) { + rc_mutex_lock(&client->state.mutex); + client->state.user = RC_CLIENT_USER_STATE_NONE; + load_state = client->state.load; + rc_mutex_unlock(&client->state.mutex); + + RC_CLIENT_LOG_ERR_FORMATTED(client, "Login failed: %s", error_message); + if (login_callback_data->callback) + login_callback_data->callback(result, error_message, client, login_callback_data->callback_userdata); + + if (load_state && load_state->progress == RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN) + rc_client_begin_fetch_game_sets(load_state); + } + else { + client->user.username = rc_buffer_strcpy(&client->state.buffer, login_response.username); + + if (strcmp(login_response.username, login_response.display_name) == 0) + client->user.display_name = client->user.username; + else + client->user.display_name = rc_buffer_strcpy(&client->state.buffer, login_response.display_name); + + client->user.avatar_url = rc_buffer_strcpy(&client->state.buffer, login_response.avatar_url); + client->user.token = rc_buffer_strcpy(&client->state.buffer, login_response.api_token); + client->user.score = login_response.score; + client->user.score_softcore = login_response.score_softcore; + client->user.num_unread_messages = login_response.num_unread_messages; + + rc_mutex_lock(&client->state.mutex); + client->state.user = RC_CLIENT_USER_STATE_LOGGED_IN; + load_state = client->state.load; + rc_mutex_unlock(&client->state.mutex); + + RC_CLIENT_LOG_INFO_FORMATTED(client, "%s logged in successfully", login_response.display_name); + + if (load_state && load_state->progress == RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN) + rc_client_begin_fetch_game_sets(load_state); + + if (login_callback_data->callback) + login_callback_data->callback(RC_OK, NULL, client, login_callback_data->callback_userdata); + } + + rc_api_destroy_login_response(&login_response); + free(login_callback_data); +} + +static rc_client_async_handle_t* rc_client_begin_login(rc_client_t* client, + const rc_api_login_request_t* login_request, rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_generic_callback_data_t* callback_data; + rc_api_request_t request; + int result = rc_api_init_login_request_hosted(&request, login_request, &client->state.host); + const char* error_message = rc_error_str(result); + + if (result == RC_OK) { + rc_mutex_lock(&client->state.mutex); + + if (client->state.user == RC_CLIENT_USER_STATE_LOGIN_REQUESTED) { + error_message = "Login already in progress"; + result = RC_INVALID_STATE; + } + client->state.user = RC_CLIENT_USER_STATE_LOGIN_REQUESTED; + + rc_mutex_unlock(&client->state.mutex); + } + + if (result != RC_OK) { + callback(result, error_message, client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_generic_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, callback_userdata); + return NULL; + } + + callback_data->client = client; + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + + rc_client_begin_async(client, &callback_data->async_handle); + client->callbacks.server_call(&request, rc_client_login_callback, callback_data, client); + + rc_api_destroy_request(&request); + + /* if the user state has changed, the async operation completed synchronously */ + rc_mutex_lock(&client->state.mutex); + if (client->state.user != RC_CLIENT_USER_STATE_LOGIN_REQUESTED) + callback_data = NULL; + rc_mutex_unlock(&client->state.mutex); + + return callback_data ? &callback_data->async_handle : NULL; +} + +rc_client_async_handle_t* rc_client_begin_login_with_password(rc_client_t* client, + const char* username, const char* password, rc_client_callback_t callback, void* callback_userdata) +{ + rc_api_login_request_t login_request; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + if (!username || !username[0]) { + callback(RC_INVALID_STATE, "username is required", client, callback_userdata); + return NULL; + } + + if (!password || !password[0]) { + callback(RC_INVALID_STATE, "password is required", client, callback_userdata); + return NULL; + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_login_with_password) + return client->state.external_client->begin_login_with_password(client, username, password, callback, callback_userdata); +#endif + + memset(&login_request, 0, sizeof(login_request)); + login_request.username = username; + login_request.password = password; + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Attempting to log in %s (with password)", username); + return rc_client_begin_login(client, &login_request, callback, callback_userdata); +} + +rc_client_async_handle_t* rc_client_begin_login_with_token(rc_client_t* client, + const char* username, const char* token, rc_client_callback_t callback, void* callback_userdata) +{ + rc_api_login_request_t login_request; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + if (!username || !username[0]) { + callback(RC_INVALID_STATE, "username is required", client, callback_userdata); + return NULL; + } + + if (!token || !token[0]) { + callback(RC_INVALID_STATE, "token is required", client, callback_userdata); + return NULL; + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_login_with_token) + return client->state.external_client->begin_login_with_token(client, username, token, callback, callback_userdata); +#endif + + memset(&login_request, 0, sizeof(login_request)); + login_request.username = username; + login_request.api_token = token; + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Attempting to log in %s (with token)", username); + return rc_client_begin_login(client, &login_request, callback, callback_userdata); +} + +void rc_client_logout(rc_client_t* client) +{ + rc_client_load_state_t* load_state; + + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->logout) { + client->state.external_client->logout(); + return; + } +#endif + + switch (client->state.user) { + case RC_CLIENT_USER_STATE_LOGGED_IN: + RC_CLIENT_LOG_INFO_FORMATTED(client, "Logging %s out", client->user.display_name); + break; + + case RC_CLIENT_USER_STATE_LOGIN_REQUESTED: + RC_CLIENT_LOG_INFO(client, "Aborting login"); + break; + } + + rc_mutex_lock(&client->state.mutex); + + client->state.user = RC_CLIENT_USER_STATE_NONE; + memset(&client->user, 0, sizeof(client->user)); + + load_state = client->state.load; + + rc_mutex_unlock(&client->state.mutex); + + rc_client_unload_game(client); + + if (load_state && load_state->progress == RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN) + rc_client_load_error(load_state, RC_ABORTED, "Login aborted"); +} + +const rc_client_user_t* rc_client_get_user_info(const rc_client_t* client) +{ + if (!client) + return NULL; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->get_user_info_v3) + return client->state.external_client->get_user_info_v3(); + + if (client->state.external_client->get_user_info) + return rc_client_external_convert_v1_user(client, client->state.external_client->get_user_info()); + } +#endif + + return (client->state.user == RC_CLIENT_USER_STATE_LOGGED_IN) ? &client->user : NULL; +} + +int rc_client_user_get_image_url(const rc_client_user_t* user, char buffer[], size_t buffer_size) +{ + if (!user) + return RC_INVALID_STATE; + + if (user->avatar_url) { + snprintf(buffer, buffer_size, "%s", user->avatar_url); + return RC_OK; + } + + return rc_client_get_image_url(buffer, buffer_size, RC_IMAGE_TYPE_USER, user->display_name); +} + +static void rc_client_subset_get_user_game_summary(const rc_client_t* client, + const rc_client_subset_info_t* subset, rc_client_user_game_summary_t* summary) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + time_t last_unlock_time = 0; + time_t last_progression_time = 0; + time_t first_win_time = 0; + int num_progression_achievements = 0; + int num_win_achievements = 0; + int num_unlocked_progression_achievements = 0; + const uint8_t unlock_bit = (client->state.hardcore) ? + RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE : RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE; + + rc_mutex_lock((rc_mutex_t*)&client->state.mutex); /* remove const cast for mutex access */ + + for (; achievement < stop; ++achievement) { + switch (achievement->public_.category) { + case RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE: + ++summary->num_core_achievements; + summary->points_core += achievement->public_.points; + + if (achievement->public_.unlocked & unlock_bit) { + ++summary->num_unlocked_achievements; + summary->points_unlocked += achievement->public_.points; + + if (achievement->public_.unlock_time > last_unlock_time) + last_unlock_time = achievement->public_.unlock_time; + + if (achievement->public_.type == RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION) { + ++num_unlocked_progression_achievements; + if (achievement->public_.unlock_time > last_progression_time) + last_progression_time = achievement->public_.unlock_time; + } + else if (achievement->public_.type == RC_CLIENT_ACHIEVEMENT_TYPE_WIN) { + if (first_win_time == 0 || achievement->public_.unlock_time < first_win_time) + first_win_time = achievement->public_.unlock_time; + } + } + + if (achievement->public_.type == RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION) + ++num_progression_achievements; + else if (achievement->public_.type == RC_CLIENT_ACHIEVEMENT_TYPE_WIN) + ++num_win_achievements; + + if (achievement->public_.bucket == RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED) + ++summary->num_unsupported_achievements; + + break; + + case RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL: + ++summary->num_unofficial_achievements; + break; + + default: + continue; + } + } + + rc_mutex_unlock((rc_mutex_t*)&client->state.mutex); /* remove const cast for mutex access */ + + if (summary->num_unlocked_achievements == summary->num_core_achievements) + summary->completed_time = last_unlock_time; + + if ((first_win_time || num_win_achievements == 0) && num_unlocked_progression_achievements == num_progression_achievements) + summary->beaten_time = (first_win_time > last_progression_time) ? first_win_time : last_progression_time; +} + +void rc_client_get_user_game_summary(const rc_client_t* client, rc_client_user_game_summary_t* summary) +{ + if (!summary) + return; + + memset(summary, 0, sizeof(*summary)); + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->get_user_game_summary_v5) { + client->state.external_client->get_user_game_summary_v5(summary); + return; + } + if (client->state.external_client->get_user_game_summary) { + client->state.external_client->get_user_game_summary(summary); + return; + } + } +#endif + + if (rc_client_is_game_loaded(client)) + rc_client_subset_get_user_game_summary(client, client->game->subsets, summary); +} + +void rc_client_get_user_subset_summary(const rc_client_t* client, uint32_t subset_id, rc_client_user_game_summary_t* summary) +{ + if (!summary) + return; + + memset(summary, 0, sizeof(*summary)); + if (!client || !subset_id) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_user_subset_summary) { + client->state.external_client->get_user_subset_summary(subset_id, summary); + return; + } +#endif + + if (rc_client_is_game_loaded(client)) { + const rc_client_subset_info_t* subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (subset->public_.id == subset_id) { + rc_client_subset_get_user_game_summary(client, subset, summary); + break; + } + } + } +} + +typedef struct rc_client_fetch_all_user_progress_callback_data_t { + rc_client_t* client; + rc_client_fetch_all_user_progress_callback_t callback; + void* callback_userdata; + uint32_t console_id; + rc_client_async_handle_t async_handle; +} rc_client_fetch_all_user_progress_callback_data_t; + +static void rc_client_fetch_all_user_progress_callback(const rc_api_server_response_t* server_response, + void* callback_data) +{ + rc_client_fetch_all_user_progress_callback_data_t* ap_callback_data = + (rc_client_fetch_all_user_progress_callback_data_t*)callback_data; + rc_client_t* client = ap_callback_data->client; + rc_api_fetch_all_user_progress_response_t ap_response; + const char* error_message; + int result; + + result = rc_client_end_async(client, &ap_callback_data->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) + RC_CLIENT_LOG_VERBOSE(client, "Fetch all progress aborted"); + + free(ap_callback_data); + return; + } + + result = rc_api_process_fetch_all_user_progress_server_response(&ap_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &ap_response.response); + if (error_message) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Fetch all progress for console %u failed: %s", ap_callback_data->console_id, + error_message); + ap_callback_data->callback(result, error_message, NULL, client, ap_callback_data->callback_userdata); + } else { + rc_client_all_user_progress_t* list; + const size_t list_size = sizeof(*list) + sizeof(rc_client_all_user_progress_entry_t) * ap_response.num_entries; + + list = (rc_client_all_user_progress_t*)malloc(list_size); + if (!list) { + ap_callback_data->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, + ap_callback_data->callback_userdata); + } else { + rc_client_all_user_progress_entry_t* entry = list->entries = + (rc_client_all_user_progress_entry_t*)((uint8_t*)list + sizeof(*list)); + const rc_api_all_user_progress_entry_t* hlentry = ap_response.entries; + const rc_api_all_user_progress_entry_t* stop = hlentry + ap_response.num_entries; + + for (; hlentry < stop; ++hlentry, ++entry) + { + entry->game_id = hlentry->game_id; + entry->num_achievements = hlentry->num_achievements; + entry->num_unlocked_achievements = hlentry->num_unlocked_achievements; + entry->num_unlocked_achievements_hardcore = hlentry->num_unlocked_achievements_hardcore; + } + + list->num_entries = ap_response.num_entries; + + ap_callback_data->callback(RC_OK, NULL, list, client, ap_callback_data->callback_userdata); + } + } + + rc_api_destroy_fetch_all_user_progress_response(&ap_response); + free(ap_callback_data); +} + +rc_client_async_handle_t* rc_client_begin_fetch_all_user_progress(rc_client_t* client, uint32_t console_id, + rc_client_fetch_all_user_progress_callback_t callback, + void* callback_userdata) +{ + rc_api_fetch_all_user_progress_request_t api_params; + rc_client_fetch_all_user_progress_callback_data_t* callback_data; + rc_client_async_handle_t* async_handle; + rc_api_request_t request; + int result; + const char* error_message; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", NULL, client, callback_userdata); + return NULL; + } else if (client->state.user != RC_CLIENT_USER_STATE_LOGGED_IN) { + callback(RC_INVALID_STATE, "client must be logged in", NULL, client, callback_userdata); + return NULL; + } + + api_params.username = client->user.username; + api_params.api_token = client->user.token; + api_params.console_id = console_id; + + result = rc_api_init_fetch_all_user_progress_request_hosted(&request, &api_params, &client->state.host); + + if (result != RC_OK) { + error_message = rc_error_str(result); + callback(result, error_message, NULL, client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_fetch_all_user_progress_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, callback_userdata); + return NULL; + } + + callback_data->client = client; + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + callback_data->console_id = console_id; + + async_handle = &callback_data->async_handle; + rc_client_begin_async(client, async_handle); + client->callbacks.server_call(&request, rc_client_fetch_all_user_progress_callback, callback_data, client); + rc_api_destroy_request(&request); + + return rc_client_async_handle_valid(client, async_handle) ? async_handle : NULL; +} + +void rc_client_destroy_all_user_progress(rc_client_all_user_progress_t* list) +{ + free(list); +} + +/* ===== Game ===== */ + +static void rc_client_free_game(rc_client_game_info_t* game) +{ + rc_runtime_destroy(&game->runtime); + + rc_buffer_destroy(&game->buffer); + + free(game); +} + +static void rc_client_free_load_state(rc_client_load_state_t* load_state) +{ + if (load_state->game) + rc_client_free_game(load_state->game); + + if (load_state->start_session_response) { + rc_api_destroy_start_session_response(load_state->start_session_response); + free(load_state->start_session_response); + } + +#ifdef RC_CLIENT_SUPPORTS_HASH + rc_hash_destroy_iterator(&load_state->hash_iterator); +#endif + + free(load_state); +} + +static void rc_client_begin_load_state(rc_client_load_state_t* load_state, uint8_t state, uint8_t num_requests) +{ + rc_mutex_lock(&load_state->client->state.mutex); + + load_state->progress = state; + load_state->outstanding_requests += num_requests; + + rc_mutex_unlock(&load_state->client->state.mutex); +} + +static int rc_client_end_load_state(rc_client_load_state_t* load_state) +{ + int remaining_requests = 0; + int aborted = 0; + + rc_mutex_lock(&load_state->client->state.mutex); + + if (load_state->outstanding_requests > 0) + --load_state->outstanding_requests; + remaining_requests = load_state->outstanding_requests; + + if (load_state->client->state.load != load_state) + aborted = 1; + + rc_mutex_unlock(&load_state->client->state.mutex); + + if (aborted) { + /* we can't actually free the load_state itself if there are any outstanding requests + * or their callbacks will try to use the free'd memory. As they call end_load_state, + * the outstanding_requests count will reach zero and the memory will be free'd then. */ + if (remaining_requests == 0) { + /* if one of the callbacks called rc_client_load_error, progress will be set to + * RC_CLIENT_LOAD_STATE_ABORTED. There's no need to call the callback with RC_ABORTED + * in that case, as it will have already been called with something more appropriate. */ + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_ABORTED && load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", load_state->client, load_state->callback_userdata); + + rc_client_free_load_state(load_state); + } + + return -1; + } + + return remaining_requests; +} + +static void rc_client_load_error(rc_client_load_state_t* load_state, int result, const char* error_message) +{ + int remaining_requests = 0; + + rc_mutex_lock(&load_state->client->state.mutex); + + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_ABORTED; + if (load_state->client->state.load == load_state) + load_state->client->state.load = NULL; + + remaining_requests = load_state->outstanding_requests; + + rc_mutex_unlock(&load_state->client->state.mutex); + + RC_CLIENT_LOG_ERR_FORMATTED(load_state->client, "Load failed (%d): %s", result, error_message); + + if (load_state->callback) + load_state->callback(result, error_message, load_state->client, load_state->callback_userdata); + + /* we can't actually free the load_state itself if there are any outstanding requests + * or their callbacks will try to use the free'd memory. as they call end_load_state, + * the outstanding_requests count will reach zero and the memory will be free'd then. */ + if (remaining_requests == 0) + rc_client_free_load_state(load_state); +} + +static void rc_client_load_aborted(rc_client_load_state_t* load_state) +{ + /* prevent callback from being called when manually aborted */ + load_state->callback = NULL; + + /* mark the game as no longer being loaded */ + rc_client_load_error(load_state, RC_ABORTED, NULL); + + /* decrement the async counter and potentially free the load_state object */ + rc_client_end_load_state(load_state); +} + +static void rc_client_invalidate_memref_achievements(rc_client_game_info_t* game, rc_client_t* client, rc_memref_t* memref) +{ + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + for (; achievement < stop; ++achievement) { + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_DISABLED) + continue; + + if (rc_trigger_contains_memref(achievement->trigger, memref)) { + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_DISABLED; + achievement->public_.bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED; + + if (achievement->trigger) + achievement->trigger->state = RC_TRIGGER_STATE_DISABLED; + + RC_CLIENT_LOG_WARN_FORMATTED(client, "Disabled achievement %u. Invalid address %06X", achievement->public_.id, memref->address); + } + } + } +} + +static void rc_client_invalidate_memref_leaderboards(rc_client_game_info_t* game, rc_client_t* client, rc_memref_t* memref) +{ + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + rc_client_leaderboard_info_t* leaderboard = subset->leaderboards; + rc_client_leaderboard_info_t* stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_DISABLED) + continue; + if (!leaderboard->lboard) + continue; + + if (rc_trigger_contains_memref(&leaderboard->lboard->start, memref)) + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + else if (rc_trigger_contains_memref(&leaderboard->lboard->cancel, memref)) + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + else if (rc_trigger_contains_memref(&leaderboard->lboard->submit, memref)) + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + else if (rc_value_contains_memref(&leaderboard->lboard->value, memref)) + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + else + continue; + + leaderboard->lboard->state = RC_LBOARD_STATE_DISABLED; + + RC_CLIENT_LOG_WARN_FORMATTED(client, "Disabled leaderboard %u. Invalid address %06X", leaderboard->public_.id, memref->address); + } + } +} + +static void rc_client_validate_addresses(rc_client_game_info_t* game, rc_client_t* client) +{ + const rc_memory_regions_t* regions = rc_console_memory_regions(game->public_.console_id); + const uint32_t max_address = (regions && regions->num_regions > 0) ? + regions->region[regions->num_regions - 1].end_address : 0xFFFFFFFF; + uint8_t buffer[8]; + uint32_t total_count = 0; + uint32_t invalid_count = 0; + + rc_memref_list_t* memref_list = &game->runtime.memrefs->memrefs; + for (; memref_list; memref_list = memref_list->next) { + rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_end = memref + memref_list->count; + total_count += memref_list->count; + + for (; memref < memref_end; ++memref) { + if (memref->address > max_address || + client->callbacks.read_memory(memref->address, buffer, 1, client) == 0) { + memref->value.type = RC_VALUE_TYPE_NONE; + + rc_client_invalidate_memref_achievements(game, client, memref); + rc_client_invalidate_memref_leaderboards(game, client, memref); + + invalid_count++; + } + } + } + + game->max_valid_address = max_address; + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "%u/%u memory addresses valid", total_count - invalid_count, total_count); +} + +static void rc_client_update_legacy_runtime_achievements(rc_client_game_info_t* game, uint32_t active_count) +{ + if (active_count > 0) { + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* stop; + rc_runtime_trigger_t* trigger; + rc_client_subset_info_t* subset; + + if (active_count <= game->runtime.trigger_capacity) { + if (active_count != 0) + memset(game->runtime.triggers, 0, active_count * sizeof(rc_runtime_trigger_t)); + } else { + if (game->runtime.triggers) + free(game->runtime.triggers); + + game->runtime.trigger_capacity = active_count; + game->runtime.triggers = (rc_runtime_trigger_t*)calloc(1, active_count * sizeof(rc_runtime_trigger_t)); + } + + trigger = game->runtime.triggers; + if (!trigger) { + /* malloc failed, no way to report error, just bail */ + game->runtime.trigger_count = 0; + return; + } + + for (subset = game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + achievement = subset->achievements; + stop = achievement + subset->public_.num_achievements; + + for (; achievement < stop; ++achievement) { + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) { + trigger->id = achievement->public_.id; + memcpy(trigger->md5, achievement->md5, 16); + trigger->trigger = achievement->trigger; + ++trigger; + } + } + } + } + + game->runtime.trigger_count = active_count; +} + +static uint32_t rc_client_subset_count_active_achievements(const rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + uint32_t active_count = 0; + + for (; achievement < stop; ++achievement) { + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) + ++active_count; + } + + return active_count; +} + +void rc_client_update_active_achievements(rc_client_game_info_t* game) +{ + uint32_t active_count = 0; + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + if (subset->active) + active_count += rc_client_subset_count_active_achievements(subset); + } + + rc_client_update_legacy_runtime_achievements(game, active_count); +} + +static uint32_t rc_client_subset_toggle_hardcore_achievements(rc_client_subset_info_t* subset, rc_client_t* client, uint8_t active_bit) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + uint32_t active_count = 0; + + for (; achievement < stop; ++achievement) { + if ((achievement->public_.unlocked & active_bit) == 0) { + switch (achievement->public_.state) { + case RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED: + case RC_CLIENT_ACHIEVEMENT_STATE_INACTIVE: + rc_reset_trigger(achievement->trigger); + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE; + ++active_count; + break; + + case RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE: + ++active_count; + break; + } + } + else { + achievement->public_.unlock_time = (active_bit == RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE) ? + achievement->unlock_time_hardcore : achievement->unlock_time_softcore; + + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE || + achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_INACTIVE) { + /* if it's active despite being unlocked, and we're in encore mode, leave it active */ + if (client->state.encore_mode) { + ++active_count; + continue; + } + + /* switch to inactive */ + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED; + + if (achievement->trigger && rc_trigger_state_active(achievement->trigger->state)) { + /* hide any active challenge indicators */ + if (achievement->trigger->state == RC_TRIGGER_STATE_PRIMED) { + rc_client_event_t client_event; + memset(&client_event, 0, sizeof(client_event)); + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_HIDE; + client_event.achievement = &achievement->public_; + client->callbacks.event_handler(&client_event, client); + } + + achievement->trigger->state = RC_TRIGGER_STATE_TRIGGERED; + } + } + } + } + + return active_count; +} + +static void rc_client_toggle_hardcore_achievements(rc_client_game_info_t* game, rc_client_t* client, uint8_t active_bit) +{ + uint32_t active_count = 0; + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + if (subset->active) + active_count += rc_client_subset_toggle_hardcore_achievements(subset, client, active_bit); + } + + rc_client_update_legacy_runtime_achievements(game, active_count); +} + +static void rc_client_activate_achievements(rc_client_game_info_t* game, rc_client_t* client) +{ + const uint8_t active_bit = (client->state.encore_mode) ? + RC_CLIENT_ACHIEVEMENT_UNLOCKED_NONE : (client->state.hardcore) ? + RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE : RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE; + + rc_client_toggle_hardcore_achievements(game, client, active_bit); +} + +static void rc_client_update_legacy_runtime_leaderboards(rc_client_game_info_t* game, uint32_t active_count) +{ + if (active_count > 0) { + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* stop; + rc_client_subset_info_t* subset; + rc_runtime_lboard_t* lboard; + + if (active_count <= game->runtime.lboard_capacity) { + if (active_count != 0) + memset(game->runtime.lboards, 0, active_count * sizeof(rc_runtime_lboard_t)); + } else { + if (game->runtime.lboards) + free(game->runtime.lboards); + + game->runtime.lboard_capacity = active_count; + game->runtime.lboards = (rc_runtime_lboard_t*)calloc(1, active_count * sizeof(rc_runtime_lboard_t)); + } + + lboard = game->runtime.lboards; + if (!lboard) { + /* malloc failed. no way to report error, just bail */ + game->runtime.lboard_count = 0; + return; + } + + for (subset = game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_ACTIVE || + leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_TRACKING) { + lboard->id = leaderboard->public_.id; + memcpy(lboard->md5, leaderboard->md5, 16); + lboard->lboard = leaderboard->lboard; + ++lboard; + } + } + } + } + + game->runtime.lboard_count = active_count; +} + +void rc_client_update_active_leaderboards(rc_client_game_info_t* game) +{ + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* stop; + + uint32_t active_count = 0; + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) + { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) + { + switch (leaderboard->public_.state) + { + case RC_CLIENT_LEADERBOARD_STATE_ACTIVE: + case RC_CLIENT_LEADERBOARD_STATE_TRACKING: + ++active_count; + break; + } + } + } + + rc_client_update_legacy_runtime_leaderboards(game, active_count); +} + +static void rc_client_activate_leaderboards(rc_client_game_info_t* game, rc_client_t* client) +{ + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* stop; + const uint8_t leaderboards_allowed = + client->state.hardcore || client->state.allow_leaderboards_in_softcore; + + uint32_t active_count = 0; + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) { + switch (leaderboard->public_.state) { + case RC_CLIENT_LEADERBOARD_STATE_DISABLED: + continue; + + case RC_CLIENT_LEADERBOARD_STATE_INACTIVE: + if (leaderboards_allowed) { + rc_reset_lboard(leaderboard->lboard); + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_ACTIVE; + ++active_count; + } + break; + + default: + if (leaderboards_allowed) + ++active_count; + else + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_INACTIVE; + break; + } + } + } + + rc_client_update_legacy_runtime_leaderboards(game, active_count); +} + +static void rc_client_deactivate_leaderboards(rc_client_game_info_t* game, rc_client_t* client) +{ + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* stop; + + rc_client_subset_info_t* subset = game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) { + switch (leaderboard->public_.state) { + case RC_CLIENT_LEADERBOARD_STATE_DISABLED: + case RC_CLIENT_LEADERBOARD_STATE_INACTIVE: + continue; + + case RC_CLIENT_LEADERBOARD_STATE_TRACKING: + rc_client_release_leaderboard_tracker(client->game, leaderboard); + /* fallthrough */ /* to default */ + default: + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_INACTIVE; + break; + } + } + } + + game->runtime.lboard_count = 0; +} + +static void rc_client_apply_unlocks(rc_client_subset_info_t* subset, rc_api_unlock_entry_t* unlocks, uint32_t num_unlocks, uint8_t mode) +{ + rc_client_achievement_info_t* start = subset->achievements; + rc_client_achievement_info_t* stop = start + subset->public_.num_achievements; + rc_client_achievement_info_t* scan; + rc_api_unlock_entry_t* unlock = unlocks; + rc_api_unlock_entry_t* unlock_stop = unlocks + num_unlocks; + + for (; unlock < unlock_stop; ++unlock) { + for (scan = start; scan < stop; ++scan) { + if (scan->public_.id == unlock->achievement_id) { + scan->public_.unlocked |= mode; + + if (mode & RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE) + scan->unlock_time_hardcore = unlock->when; + if (mode & RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE) + scan->unlock_time_softcore = unlock->when; + + if (scan == start) + ++start; + else if (scan + 1 == stop) + --stop; + break; + } + } + } + + if (subset->next) + rc_client_apply_unlocks(subset->next, unlocks, num_unlocks, mode); +} + +static void rc_client_free_pending_media(rc_client_pending_media_t* pending_media) +{ + if (pending_media->hash) + free((void*)pending_media->hash); +#ifdef RC_CLIENT_SUPPORTS_HASH + if (pending_media->data) + free(pending_media->data); + free((void*)pending_media->file_path); +#endif + free(pending_media); +} + +/* NOTE: address validation uses the read_memory callback to make sure the client + * will return data for the requested address. As such, this function must + * respect the `client->state.allow_background_memory_reads setting. Use + * rc_client_queue_activate_game to dispatch this function to the do_frame loop/ + */ +static void rc_client_activate_game(rc_client_load_state_t* load_state, rc_api_start_session_response_t *start_session_response) +{ + rc_client_t* client = load_state->client; + + rc_mutex_lock(&client->state.mutex); + load_state->progress = (client->state.load == load_state) ? + RC_CLIENT_LOAD_GAME_STATE_DONE : RC_CLIENT_LOAD_GAME_STATE_ABORTED; + rc_mutex_unlock(&client->state.mutex); + + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_DONE) { + /* previous load state was aborted */ + if (load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", client, load_state->callback_userdata); + } + else if (!start_session_response && client->state.spectator_mode == RC_CLIENT_SPECTATOR_MODE_OFF) { + /* unlocks not available - assume malloc failed */ + if (load_state->callback) + load_state->callback(RC_INVALID_STATE, "Unlock arrays were not allocated", client, load_state->callback_userdata); + } + else { + if (client->state.spectator_mode == RC_CLIENT_SPECTATOR_MODE_OFF) { + rc_client_apply_unlocks(load_state->subset, start_session_response->hardcore_unlocks, + start_session_response->num_hardcore_unlocks, RC_CLIENT_ACHIEVEMENT_UNLOCKED_BOTH); + rc_client_apply_unlocks(load_state->subset, start_session_response->unlocks, + start_session_response->num_unlocks, RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE); + } + + /* make the loaded game active if another game is not aleady being loaded. */ + rc_mutex_lock(&client->state.mutex); + if (client->state.load == load_state) { + client->game = load_state->game; + client->state.frames_processed = client->state.frames_at_last_ping = 0; + } + else { + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_ABORTED; + } + rc_mutex_unlock(&client->state.mutex); + + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_ABORTED) { + /* if a change media request is pending, kick it off */ + rc_client_pending_media_t* pending_media; + + rc_mutex_lock(&load_state->client->state.mutex); + pending_media = load_state->pending_media; + load_state->pending_media = NULL; + rc_mutex_unlock(&load_state->client->state.mutex); + + if (pending_media) { + /* rc_client_check_pending_media will fail if it can't find the game in client->game or + * client->state.load->game. since we've detached the load_state, this has to occur after + * we've made the game active. */ + if (pending_media->hash) { + rc_client_begin_change_media(client, pending_media->hash, + pending_media->callback, pending_media->callback_userdata); + } else { +#ifdef RC_CLIENT_SUPPORTS_HASH + rc_client_begin_identify_and_change_media(client, pending_media->file_path, + pending_media->data, pending_media->data_size, + pending_media->callback, pending_media->callback_userdata); +#endif + } + rc_client_free_pending_media(pending_media); + } + + rc_mutex_lock(&client->state.mutex); + if (client->state.load != load_state) + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_ABORTED; + rc_mutex_unlock(&client->state.mutex); + } + + /* if the game is still being loaded, make sure all the required memory addresses are accessible + * so we can mark achievements as unsupported before loading them into the runtime. */ + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_ABORTED) { + /* ASSERT: client->game must be set before calling this function so the read_memory callback can query the console_id */ + rc_client_validate_addresses(load_state->game, client); + + rc_mutex_lock(&client->state.mutex); + if (client->state.load != load_state) + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_ABORTED; + rc_mutex_unlock(&client->state.mutex); + } + + /* if the game is still being loaded, load any active acheivements/leaderboards into the runtime */ + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_ABORTED) { + rc_client_activate_achievements(load_state->game, client); + rc_client_activate_leaderboards(load_state->game, client); + + /* detach the load state to indicate that loading is fully complete */ + rc_mutex_lock(&client->state.mutex); + if (client->state.load == load_state) + client->state.load = NULL; + else + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_ABORTED; + rc_mutex_unlock(&client->state.mutex); + } + + /* one last sanity check to make sure the game is still being loaded. */ + if (load_state->progress == RC_CLIENT_LOAD_GAME_STATE_ABORTED) { + /* game has been unloaded, or another game is being loaded over the top of this game */ + if (load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", client, load_state->callback_userdata); + } + else { + if (load_state->hash->hash[0] != '[') { + if (load_state->client->state.spectator_mode != RC_CLIENT_SPECTATOR_MODE_LOCKED) { + /* schedule the periodic ping */ + rc_client_scheduled_callback_data_t* callback_data = (rc_client_scheduled_callback_data_t*) + rc_buffer_alloc(&load_state->game->buffer, sizeof(rc_client_scheduled_callback_data_t)); + + memset(callback_data, 0, sizeof(*callback_data)); + callback_data->callback = rc_client_ping; + callback_data->related_id = load_state->game->public_.id; + callback_data->when = client->callbacks.get_time_millisecs(client) + 30 * 1000; + rc_client_schedule_callback(client, callback_data); + } + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Game %u loaded, hardcore %s%s", load_state->game->public_.id, + client->state.hardcore ? "enabled" : "disabled", + (client->state.spectator_mode != RC_CLIENT_SPECTATOR_MODE_OFF) ? ", spectating" : ""); + } + else { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Subset %u loaded", load_state->subset->public_.id); + } + + if (load_state->callback) + load_state->callback(RC_OK, NULL, client, load_state->callback_userdata); + + /* detach the game object so it doesn't get freed by free_load_state */ + load_state->game = NULL; + } + } + + rc_client_free_load_state(load_state); +} + +static void rc_client_dispatch_activate_game(struct rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)callback_data->data; + free(callback_data); + + (void)client; + (void)now; + + rc_client_activate_game(load_state, load_state->start_session_response); +} + +static void rc_client_queue_activate_game(rc_client_load_state_t* load_state) +{ + rc_client_scheduled_callback_data_t* scheduled_callback_data = + (rc_client_scheduled_callback_data_t*)calloc(1, sizeof(rc_client_scheduled_callback_data_t)); + + if (!scheduled_callback_data) { + rc_client_load_error(load_state, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + return; + } + + scheduled_callback_data->callback = rc_client_dispatch_activate_game; + scheduled_callback_data->data = load_state; + + rc_client_schedule_callback(load_state->client, scheduled_callback_data); +} + +static void rc_client_start_session_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)callback_data; + rc_api_start_session_response_t start_session_response; + int outstanding_requests; + const char* error_message; + int result; + + result = rc_client_end_async(load_state->client, &load_state->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) { + rc_client_t* client = load_state->client; + rc_client_load_aborted(load_state); + RC_CLIENT_LOG_VERBOSE(client, "Load aborted while starting session"); + } else { + rc_client_free_load_state(load_state); + } + return; + } + + result = rc_api_process_start_session_server_response(&start_session_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &start_session_response.response); + outstanding_requests = rc_client_end_load_state(load_state); + + if (error_message) { + rc_client_load_error(load_state, result, error_message); + } + else if (outstanding_requests < 0) { + /* previous load state was aborted, load_state was free'd */ + } + else if (outstanding_requests == 0 && load_state->client->state.allow_background_memory_reads) { + rc_client_activate_game(load_state, &start_session_response); + } + else { + load_state->start_session_response = + (rc_api_start_session_response_t*)malloc(sizeof(rc_api_start_session_response_t)); + + if (!load_state->start_session_response) { + rc_client_load_error(load_state, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + } + else { + /* safer to parse the response again than to try to copy it */ + rc_api_process_start_session_response(load_state->start_session_response, server_response->body); + } + + if (outstanding_requests == 0) { + if (load_state->client->state.allow_background_memory_reads) + rc_client_activate_game(load_state, load_state->start_session_response); + else + rc_client_queue_activate_game(load_state); + } + } + + rc_api_destroy_start_session_response(&start_session_response); +} + +static void rc_client_begin_start_session(rc_client_load_state_t* load_state) +{ + rc_api_start_session_request_t start_session_params; + rc_client_t* client = load_state->client; + rc_api_request_t start_session_request; + int result; + + memset(&start_session_params, 0, sizeof(start_session_params)); + start_session_params.username = client->user.username; + start_session_params.api_token = client->user.token; + start_session_params.game_id = load_state->hash->game_id; + start_session_params.game_hash = load_state->hash->hash; + start_session_params.hardcore = client->state.hardcore; + + result = rc_api_init_start_session_request_hosted(&start_session_request, &start_session_params, &client->state.host); + if (result != RC_OK) { + rc_client_load_error(load_state, result, rc_error_str(result)); + } + else { + rc_client_begin_load_state(load_state, RC_CLIENT_LOAD_GAME_STATE_STARTING_SESSION, 1); + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Starting session for game %u", start_session_params.game_id); + rc_client_begin_async(client, &load_state->async_handle); + client->callbacks.server_call(&start_session_request, rc_client_start_session_callback, load_state, client); + rc_api_destroy_request(&start_session_request); + } +} + +static void rc_client_copy_achievements(rc_client_load_state_t* load_state, + rc_client_subset_info_t* subset, + const rc_api_achievement_definition_t* achievement_definitions, uint32_t num_achievements) +{ + const rc_api_achievement_definition_t* read; + const rc_api_achievement_definition_t* stop; + rc_client_achievement_info_t* achievements; + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* scan; + rc_buffer_t* buffer; + rc_preparse_state_t preparse; + const char* memaddr; + size_t size; + rc_trigger_t* trigger; + int trigger_size; + + subset->achievements = NULL; + subset->public_.num_achievements = num_achievements; + + if (num_achievements == 0) + return; + + stop = achievement_definitions + num_achievements; + + /* if not testing unofficial, filter them out */ + if (!load_state->client->state.unofficial_enabled) { + for (read = achievement_definitions; read < stop; ++read) { + if (read->category != RC_ACHIEVEMENT_CATEGORY_CORE) + --num_achievements; + } + + subset->public_.num_achievements = num_achievements; + + if (num_achievements == 0) + return; + } + + /* preallocate space for achievements */ + size = 24 /* assume average title length of 24 */ + + 48 /* assume average description length of 48 */ + + sizeof(rc_trigger_t) + sizeof(rc_condset_t) * 2 /* trigger container */ + + sizeof(rc_condition_t) * 8 /* assume average trigger length of 8 conditions */ + + sizeof(rc_client_achievement_info_t); + buffer = &load_state->game->buffer; + rc_buffer_reserve(buffer, size * num_achievements); + + /* allocate the achievement array */ + size = sizeof(rc_client_achievement_info_t) * num_achievements; + achievement = achievements = (rc_client_achievement_info_t*)rc_buffer_alloc(buffer, size); + memset(achievements, 0, size); + + /* copy the achievement data */ + for (read = achievement_definitions; read < stop; ++read) { + if (read->category != RC_ACHIEVEMENT_CATEGORY_CORE && !load_state->client->state.unofficial_enabled) + continue; + + achievement->public_.title = rc_buffer_strcpy(buffer, read->title); + achievement->public_.description = rc_buffer_strcpy(buffer, read->description); + snprintf(achievement->public_.badge_name, sizeof(achievement->public_.badge_name), "%s", read->badge_name); + achievement->public_.id = read->id; + achievement->public_.points = read->points; + achievement->public_.category = (read->category != RC_ACHIEVEMENT_CATEGORY_CORE) ? + RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL : RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE; + achievement->public_.rarity = read->rarity; + achievement->public_.rarity_hardcore = read->rarity_hardcore; + achievement->public_.type = read->type; /* assert: mapping is 1:1 */ + achievement->public_.badge_url = rc_buffer_strcpy(buffer, read->badge_url); + achievement->public_.badge_locked_url = rc_buffer_strcpy(buffer, read->badge_locked_url); + + memaddr = read->definition; + rc_runtime_checksum(memaddr, achievement->md5); + + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = load_state->game->runtime.memrefs; + trigger = RC_ALLOC(rc_trigger_t, &preparse.parse); + rc_parse_trigger_internal(trigger, &memaddr, &preparse.parse); + + trigger_size = preparse.parse.offset; + if (trigger_size < 0) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Parse error %d processing achievement %u", trigger_size, read->id); + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_DISABLED; + achievement->public_.bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED; + } + else { + /* populate the item, using the communal memrefs pool */ + rc_reset_parse_state(&preparse.parse, rc_buffer_reserve(buffer, trigger_size)); + rc_preparse_reserve_memrefs(&preparse, load_state->game->runtime.memrefs); + achievement->trigger = RC_ALLOC(rc_trigger_t, &preparse.parse); + memaddr = read->definition; + rc_parse_trigger_internal(achievement->trigger, &memaddr, &preparse.parse); + + if (preparse.parse.offset < 0) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Parse error %d processing achievement %u", preparse.parse.offset, read->id); + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_DISABLED; + achievement->public_.bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED; + } + else { + rc_buffer_consume(buffer, (const uint8_t*)preparse.parse.buffer, (uint8_t*)preparse.parse.buffer + preparse.parse.offset); + } + + rc_destroy_preparse_state(&preparse); + } + + achievement->created_time = read->created; + achievement->updated_time = read->updated; + + scan = achievement; + while (scan > achievements) { + --scan; + if (strcmp(scan->author, read->author) == 0) { + achievement->author = scan->author; + break; + } + } + if (!achievement->author) + achievement->author = rc_buffer_strcpy(buffer, read->author); + + ++achievement; + } + + subset->achievements = achievements; +} + +uint8_t rc_client_map_leaderboard_format(int format) +{ + switch (format) { + case RC_FORMAT_SECONDS: + case RC_FORMAT_CENTISECS: + case RC_FORMAT_MINUTES: + case RC_FORMAT_SECONDS_AS_MINUTES: + case RC_FORMAT_FRAMES: + return RC_CLIENT_LEADERBOARD_FORMAT_TIME; + + case RC_FORMAT_SCORE: + return RC_CLIENT_LEADERBOARD_FORMAT_SCORE; + + case RC_FORMAT_VALUE: + case RC_FORMAT_FLOAT1: + case RC_FORMAT_FLOAT2: + case RC_FORMAT_FLOAT3: + case RC_FORMAT_FLOAT4: + case RC_FORMAT_FLOAT5: + case RC_FORMAT_FLOAT6: + case RC_FORMAT_FIXED1: + case RC_FORMAT_FIXED2: + case RC_FORMAT_FIXED3: + case RC_FORMAT_TENS: + case RC_FORMAT_HUNDREDS: + case RC_FORMAT_THOUSANDS: + case RC_FORMAT_UNSIGNED_VALUE: + default: + return RC_CLIENT_LEADERBOARD_FORMAT_VALUE; + } +} + +static void rc_client_copy_leaderboards(rc_client_load_state_t* load_state, + rc_client_subset_info_t* subset, + const rc_api_leaderboard_definition_t* leaderboard_definitions, uint32_t num_leaderboards) +{ + const rc_api_leaderboard_definition_t* read; + const rc_api_leaderboard_definition_t* stop; + rc_client_leaderboard_info_t* leaderboards; + rc_client_leaderboard_info_t* leaderboard; + rc_buffer_t* buffer; + rc_preparse_state_t preparse; + const char* memaddr; + const char* ptr; + size_t size; + rc_lboard_t* lboard; + int lboard_size; + + subset->leaderboards = NULL; + subset->public_.num_leaderboards = num_leaderboards; + + if (num_leaderboards == 0) + return; + + /* preallocate space for achievements */ + size = 24 /* assume average title length of 24 */ + + 48 /* assume average description length of 48 */ + + sizeof(rc_lboard_t) /* lboard container */ + + (sizeof(rc_trigger_t) + sizeof(rc_condset_t) * 2) * 3 /* start/submit/cancel */ + + (sizeof(rc_value_t) + sizeof(rc_condset_t)) /* value */ + + sizeof(rc_condition_t) * 4 * 4 /* assume average of 4 conditions in each start/submit/cancel/value */ + + sizeof(rc_client_leaderboard_info_t); + rc_buffer_reserve(&load_state->game->buffer, size * num_leaderboards); + + /* allocate the achievement array */ + size = sizeof(rc_client_leaderboard_info_t) * num_leaderboards; + buffer = &load_state->game->buffer; + leaderboard = leaderboards = (rc_client_leaderboard_info_t*)rc_buffer_alloc(buffer, size); + memset(leaderboards, 0, size); + + /* copy the achievement data */ + read = leaderboard_definitions; + stop = read + num_leaderboards; + do { + leaderboard->public_.title = rc_buffer_strcpy(buffer, read->title); + leaderboard->public_.description = rc_buffer_strcpy(buffer, read->description); + leaderboard->public_.id = read->id; + leaderboard->public_.format = rc_client_map_leaderboard_format(read->format); + leaderboard->public_.lower_is_better = read->lower_is_better; + leaderboard->format = (uint8_t)read->format; + leaderboard->hidden = (uint8_t)read->hidden; + + memaddr = read->definition; + rc_runtime_checksum(memaddr, leaderboard->md5); + + ptr = strstr(memaddr, "VAL:"); + if (ptr != NULL) { + /* calculate the DJB2 hash of the VAL portion of the string*/ + uint32_t hash = 5381; + ptr += 4; /* skip 'VAL:' */ + while (*ptr && (ptr[0] != ':' || ptr[1] != ':')) + hash = (hash << 5) + hash + *ptr++; + leaderboard->value_djb2 = hash; + } + + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = load_state->game->runtime.memrefs; + lboard = RC_ALLOC(rc_lboard_t, &preparse.parse); + rc_parse_lboard_internal(lboard, memaddr, &preparse.parse); + + lboard_size = preparse.parse.offset; + if (lboard_size < 0) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Parse error %d processing leaderboard %u", lboard_size, read->id); + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + } + else { + /* populate the item, using the communal memrefs pool */ + rc_reset_parse_state(&preparse.parse, rc_buffer_reserve(buffer, lboard_size)); + rc_preparse_reserve_memrefs(&preparse, load_state->game->runtime.memrefs); + leaderboard->lboard = RC_ALLOC(rc_lboard_t, &preparse.parse); + rc_parse_lboard_internal(leaderboard->lboard, memaddr, &preparse.parse); + + if (preparse.parse.offset < 0) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Parse error %d processing leaderboard %u", preparse.parse.offset, read->id); + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_DISABLED; + } + else { + rc_buffer_consume(buffer, (const uint8_t*)preparse.parse.buffer, (uint8_t*)preparse.parse.buffer + preparse.parse.offset); + } + + rc_destroy_preparse_state(&preparse); + } + + ++leaderboard; + ++read; + } while (read < stop); + + subset->leaderboards = leaderboards; +} + +static void rc_client_fetch_game_sets_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)callback_data; + rc_api_fetch_game_sets_response_t fetch_game_sets_response; + int outstanding_requests; + const char* error_message; + int result; + + result = rc_client_end_async(load_state->client, &load_state->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) { + rc_client_t* client = load_state->client; + rc_client_load_aborted(load_state); + RC_CLIENT_LOG_VERBOSE(client, "Load aborted while fetching game data"); + } else { + rc_client_free_load_state(load_state); + } + return; + } + + result = rc_api_process_fetch_game_sets_server_response(&fetch_game_sets_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &fetch_game_sets_response.response); + + outstanding_requests = rc_client_end_load_state(load_state); + + if (error_message && result != RC_NOT_FOUND) { + rc_client_load_error(load_state, result, error_message); + } + else if (outstanding_requests < 0) { + /* previous load state was aborted, load_state was free'd */ + } + else if (fetch_game_sets_response.id == 0) { + load_state->hash->game_id = 0; + rc_client_process_resolved_hash(load_state); + } + else { + rc_client_subset_info_t** next_subset; + rc_client_subset_info_t* first_subset = NULL; + uint32_t set_index; + + /* hash exists outside the load state - always update it */ + load_state->hash->game_id = fetch_game_sets_response.id; + RC_CLIENT_LOG_INFO_FORMATTED(load_state->client, "Identified game: %u \"%s\" (%s)", load_state->hash->game_id, fetch_game_sets_response.title, load_state->hash->hash); + + if (load_state->hash->hash[0] != '[') { + /* not [NO HASH] or [SUBSETxx] */ + load_state->game->public_.id = load_state->hash->game_id; + load_state->game->public_.hash = load_state->hash->hash; + } + + if (load_state->game->public_.console_id != RC_CONSOLE_UNKNOWN && + fetch_game_sets_response.console_id != load_state->game->public_.console_id) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Data for game %u is for console %u, expecting console %u", + fetch_game_sets_response.id, fetch_game_sets_response.console_id, load_state->game->public_.console_id); + } + + /* kick off the start session request while we process the game data */ + rc_client_begin_load_state(load_state, RC_CLIENT_LOAD_GAME_STATE_STARTING_SESSION, 1); + if (load_state->client->state.spectator_mode != RC_CLIENT_SPECTATOR_MODE_OFF) { + /* we can't unlock achievements without a session, lock spectator mode for the game */ + load_state->client->state.spectator_mode = RC_CLIENT_SPECTATOR_MODE_LOCKED; + } + else { + rc_client_begin_start_session(load_state); + } + + /* process the game data */ + next_subset = &first_subset; + for (set_index = 0; set_index < fetch_game_sets_response.num_sets; ++set_index) { + rc_api_achievement_set_definition_t* set = &fetch_game_sets_response.sets[set_index]; + rc_client_subset_info_t* subset; + + subset = (rc_client_subset_info_t*)rc_buffer_alloc(&load_state->game->buffer, sizeof(rc_client_subset_info_t)); + memset(subset, 0, sizeof(*subset)); + subset->public_.id = set->id; + subset->active = 1; + snprintf(subset->public_.badge_name, sizeof(subset->public_.badge_name), "%s", set->image_name); + subset->public_.badge_url = rc_buffer_strcpy(&load_state->game->buffer, set->image_url); + subset->public_.title = rc_buffer_strcpy(&load_state->game->buffer, set->title); + + rc_client_copy_achievements(load_state, subset, set->achievements, set->num_achievements); + rc_client_copy_leaderboards(load_state, subset, set->leaderboards, set->num_leaderboards); + + if (set->type == RC_ACHIEVEMENT_SET_TYPE_CORE) { + if (!first_subset) + next_subset = &subset->next; + subset->next = first_subset; + first_subset = subset; + } + else { + *next_subset = subset; + next_subset = &subset->next; + } + } + + if (!first_subset) { + rc_client_load_error(load_state, RC_NOT_FOUND, "Response contained no sets"); + } else { + load_state->subset = first_subset; + + /* core set */ + rc_mutex_lock(&load_state->client->state.mutex); + load_state->game->public_.title = rc_buffer_strcpy(&load_state->game->buffer, fetch_game_sets_response.title); + load_state->game->subsets = first_subset; + load_state->game->public_.badge_name = first_subset->public_.badge_name; + load_state->game->public_.badge_url = first_subset->public_.badge_url; + load_state->game->public_.console_id = fetch_game_sets_response.console_id; + rc_mutex_unlock(&load_state->client->state.mutex); + + if (fetch_game_sets_response.rich_presence_script && fetch_game_sets_response.rich_presence_script[0]) { + result = rc_runtime_activate_richpresence(&load_state->game->runtime, fetch_game_sets_response.rich_presence_script, NULL, 0); + if (result != RC_OK) { + RC_CLIENT_LOG_WARN_FORMATTED(load_state->client, "Parse error %d processing rich presence", result); + } + } + + if (load_state->client->callbacks.post_process_game_sets_response) { + load_state->client->callbacks.post_process_game_sets_response(server_response, + &fetch_game_sets_response, load_state->client, load_state->callback_userdata); + } + } + + outstanding_requests = rc_client_end_load_state(load_state); + if (outstanding_requests < 0) { + /* previous load state was aborted, load_state was free'd */ + } + else if (outstanding_requests == 0) { + if (load_state->client->state.allow_background_memory_reads) + rc_client_activate_game(load_state, load_state->start_session_response); + else + rc_client_queue_activate_game(load_state); + } + } + + rc_api_destroy_fetch_game_sets_response(&fetch_game_sets_response); +} + +static rc_client_game_info_t* rc_client_allocate_game(void) +{ + rc_client_game_info_t* game = (rc_client_game_info_t*)calloc(1, sizeof(*game)); + if (!game) + return NULL; + + rc_buffer_init(&game->buffer); + rc_runtime_init(&game->runtime); + + return game; +} + +static int rc_client_attach_load_state(rc_client_t* client, rc_client_load_state_t* load_state) +{ + if (client->state.load == NULL) { + rc_client_unload_game(client); + + if (load_state->game == NULL) { + load_state->game = rc_client_allocate_game(); + if (!load_state->game) { + if (load_state->callback) + load_state->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, load_state->callback_userdata); + + return 0; + } + } + + rc_mutex_lock(&client->state.mutex); + client->state.load = load_state; + client->state.frames_processed = client->state.frames_at_last_ping = 0; + rc_mutex_unlock(&client->state.mutex); + } + else if (client->state.load != load_state) { + /* previous load was aborted */ + if (load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", client, load_state->callback_userdata); + + return 0; + } + + return 1; +} + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + +static void rc_client_external_load_state_callback(int result, const char* error_message, rc_client_t* client, void* userdata) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)userdata; + int async_aborted; + + client = load_state->client; + async_aborted = rc_client_end_async(client, &load_state->async_handle); + if (async_aborted) { + if (async_aborted != RC_CLIENT_ASYNC_DESTROYED) { + RC_CLIENT_LOG_VERBOSE(client, "Load aborted during external loading"); + } + + rc_client_unload_game(client); /* unload the game from the external client */ + rc_client_free_load_state(load_state); + return; + } + + if (result != RC_OK) { + rc_client_load_error(load_state, result, error_message); + return; + } + + rc_mutex_lock(&client->state.mutex); + load_state->progress = (client->state.load == load_state) ? + RC_CLIENT_LOAD_GAME_STATE_DONE : RC_CLIENT_LOAD_GAME_STATE_ABORTED; + client->state.load = NULL; + rc_mutex_unlock(&client->state.mutex); + + if (load_state->progress != RC_CLIENT_LOAD_GAME_STATE_DONE) { + /* previous load state was aborted */ + if (load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", client, load_state->callback_userdata); + } + else { + /* keep partial game object for media_hash management */ + if (client->state.external_client) { + const rc_client_game_t* info = rc_client_get_game_info(client); + load_state->game->public_.console_id = info->console_id; + client->game = load_state->game; + load_state->game = NULL; + } + + if (load_state->callback) + load_state->callback(RC_OK, NULL, client, load_state->callback_userdata); + } + + rc_client_free_load_state(load_state); +} + +#endif + +static void rc_client_initialize_unknown_game(rc_client_game_info_t* game) +{ + rc_client_subset_info_t* subset; + char buffer[64]; + + subset = (rc_client_subset_info_t*)rc_buffer_alloc(&game->buffer, sizeof(rc_client_subset_info_t)); + memset(subset, 0, sizeof(*subset)); + subset->public_.title = ""; + game->subsets = subset; + + game->public_.title = "Unknown Game"; + game->public_.badge_name = ""; + + rc_client_get_image_url(buffer, sizeof(buffer), RC_IMAGE_TYPE_GAME, "000001"); + game->public_.badge_url = rc_buffer_strcpy(&game->buffer, buffer); +} + +static void rc_client_process_resolved_hash(rc_client_load_state_t* load_state) +{ + rc_client_t* client = load_state->client; + + if (load_state->hash->game_id == 0) { +#ifdef RC_CLIENT_SUPPORTS_HASH + char hash[33]; + + if (rc_hash_iterate(hash, &load_state->hash_iterator)) { + /* found another hash to try */ + load_state->hash_console_id = load_state->hash_iterator.consoles[load_state->hash_iterator.index - 1]; + rc_client_load_game(load_state, hash, NULL); + return; + } + + if (load_state->tried_hashes[1]) { + /* multiple hashes were tried, create a CSV */ + size_t i; + size_t count = 0; + char* ptr; + size_t size = 0; + + for (i = 0; i < sizeof(load_state->tried_hashes) / sizeof(load_state->tried_hashes[0]); ++i) { + if (!load_state->tried_hashes[i]) + break; + + size += strlen(load_state->tried_hashes[i]->hash) + 1; + count++; + } + + ptr = (char*)rc_buffer_alloc(&load_state->game->buffer, size); + load_state->game->public_.hash = ptr; + for (i = 0; i < count; i++) { + const size_t hash_len = strlen(load_state->tried_hashes[i]->hash); + memcpy(ptr, load_state->tried_hashes[i]->hash, hash_len); + ptr += hash_len; + *ptr++ = ','; + } + *(ptr - 1) = '\0'; + + load_state->game->public_.console_id = RC_CONSOLE_UNKNOWN; + } else { + /* only a single hash was tried, capture it */ + load_state->game->public_.console_id = load_state->hash_console_id; + load_state->game->public_.hash = load_state->hash->hash; + + if (client->callbacks.identify_unknown_hash) { + load_state->hash->game_id = client->callbacks.identify_unknown_hash( + load_state->hash_console_id, load_state->hash->hash, client, load_state->callback_userdata); + + if (load_state->hash->game_id != 0) { + load_state->hash->is_unknown = 1; + RC_CLIENT_LOG_INFO_FORMATTED(load_state->client, "Client says to load game %u for unidentified hash %s", + load_state->hash->game_id, load_state->hash->hash); + } + } + } + + rc_hash_destroy_iterator(&load_state->hash_iterator); /* done with this now */ +#else + load_state->game->public_.console_id = RC_CONSOLE_UNKNOWN; + load_state->game->public_.hash = load_state->hash->hash; +#endif /* RC_CLIENT_SUPPORTS_HASH */ + + if (load_state->hash->game_id == 0) { +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + #ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION + if (client->state.raintegration && client->state.raintegration->set_console_id) { + if (load_state->game->public_.console_id != RC_CONSOLE_UNKNOWN) + client->state.raintegration->set_console_id(load_state->game->public_.console_id); + } + #endif + if (client->state.external_client) { + if (client->state.external_client->load_unknown_game) { + client->state.external_client->load_unknown_game(load_state->game->public_.hash); + rc_client_load_error(load_state, RC_NO_GAME_LOADED, "Unknown game"); + return; + } + /* no external method specifically for unknown game, just pass the hash through to begin_load_game below */ + } + else { +#endif + rc_client_initialize_unknown_game(load_state->game); + + client->game = load_state->game; + load_state->game = NULL; + + rc_client_load_error(load_state, RC_NO_GAME_LOADED, "Unknown game"); + return; +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + } +#endif + } + } + + if (load_state->hash->hash[0] != '[') { /* not [NO HASH] or [SUBSETxx] */ + load_state->game->public_.id = load_state->hash->game_id; + load_state->game->public_.hash = load_state->hash->hash; + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->add_game_hash) + client->state.external_client->add_game_hash(load_state->hash->hash, load_state->hash->game_id); + + if (client->state.external_client->begin_load_game) { + rc_client_begin_async(client, &load_state->async_handle); + client->state.external_client->begin_load_game(client, load_state->hash->hash, rc_client_external_load_state_callback, load_state); + } + return; + } +#endif + + rc_client_begin_fetch_game_sets(load_state); +} + +void rc_client_load_unknown_game(rc_client_t* client, const char* tried_hashes) +{ + rc_client_game_info_t* game; + + game = rc_client_allocate_game(); + if (!game) + return; + + rc_client_initialize_unknown_game(game); + game->public_.console_id = RC_CONSOLE_UNKNOWN; + + if (strlen(tried_hashes) == 32) { /* only one hash tried, add it to the list */ + rc_client_game_hash_t* game_hash = rc_client_find_game_hash(client, tried_hashes); + game_hash->game_id = 0; + game->public_.hash = game_hash->hash; + } + else { + game->public_.hash = rc_buffer_strcpy(&game->buffer, tried_hashes); + } + + rc_client_unload_game(client); + client->game = game; +} + +static void rc_client_begin_fetch_game_sets(rc_client_load_state_t* load_state) +{ + rc_api_fetch_game_sets_request_t fetch_game_sets_request; + rc_client_t* client = load_state->client; + rc_api_request_t request; + int result; + + rc_mutex_lock(&client->state.mutex); + result = client->state.user; + if (result == RC_CLIENT_USER_STATE_LOGIN_REQUESTED) + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN; + else + load_state->progress = RC_CLIENT_LOAD_GAME_STATE_FETCHING_GAME_DATA; + rc_mutex_unlock(&client->state.mutex); + + switch (result) { + case RC_CLIENT_USER_STATE_LOGGED_IN: + break; + + case RC_CLIENT_USER_STATE_LOGIN_REQUESTED: + /* do nothing, this function will be called again after login completes */ + return; + + default: + rc_client_load_error(load_state, RC_LOGIN_REQUIRED, rc_error_str(RC_LOGIN_REQUIRED)); + return; + } + + memset(&fetch_game_sets_request, 0, sizeof(fetch_game_sets_request)); + fetch_game_sets_request.username = client->user.username; + fetch_game_sets_request.api_token = client->user.token; + + if (load_state->hash->is_unknown) /* lookup failed, but client provided a mapping */ + fetch_game_sets_request.game_id = load_state->hash->game_id; + else + fetch_game_sets_request.game_hash = load_state->hash->hash; + + result = rc_api_init_fetch_game_sets_request_hosted(&request, &fetch_game_sets_request, &client->state.host); + if (result != RC_OK) { + rc_client_load_error(load_state, result, rc_error_str(result)); + return; + } + + rc_client_begin_load_state(load_state, RC_CLIENT_LOAD_GAME_STATE_IDENTIFYING_GAME, 1); + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Fetching data for hash %s", fetch_game_sets_request.game_hash); + + rc_client_begin_async(client, &load_state->async_handle); + client->callbacks.server_call(&request, rc_client_fetch_game_sets_callback, load_state, client); + + rc_api_destroy_request(&request); +} + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL +static void rc_client_identify_game_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)callback_data; + rc_client_t* client = load_state->client; + rc_api_resolve_hash_response_t resolve_hash_response; + int outstanding_requests; + const char* error_message; + int result; + + result = rc_client_end_async(client, &load_state->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) { + rc_client_load_aborted(load_state); + RC_CLIENT_LOG_VERBOSE(client, "Load aborted during game identification"); + } else { + rc_client_free_load_state(load_state); + } + return; + } + + result = rc_api_process_resolve_hash_server_response(&resolve_hash_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &resolve_hash_response.response); + + if (error_message) { + rc_client_end_load_state(load_state); + rc_client_load_error(load_state, result, error_message); + } + else { + /* hash exists outside the load state - always update it */ + load_state->hash->game_id = resolve_hash_response.game_id; + RC_CLIENT_LOG_INFO_FORMATTED(client, "Identified game: %u (%s)", load_state->hash->game_id, load_state->hash->hash); + + /* have to call end_load_state after updating hash in case the load_state gets free'd */ + outstanding_requests = rc_client_end_load_state(load_state); + if (outstanding_requests < 0) { + /* previous load state was aborted, load_state was free'd */ + } + else { + rc_client_process_resolved_hash(load_state); + } + } + + rc_api_destroy_resolve_hash_response(&resolve_hash_response); +} +#endif + +rc_client_game_hash_t* rc_client_find_game_hash(rc_client_t* client, const char* hash) +{ + rc_client_game_hash_t* game_hash; + + rc_mutex_lock(&client->state.mutex); + game_hash = client->hashes; + while (game_hash) { + if (strcasecmp(game_hash->hash, hash) == 0) + break; + + game_hash = game_hash->next; + } + + if (!game_hash) { + game_hash = (rc_client_game_hash_t*)rc_buffer_alloc(&client->state.buffer, sizeof(rc_client_game_hash_t)); + memset(game_hash, 0, sizeof(*game_hash)); + snprintf(game_hash->hash, sizeof(game_hash->hash), "%s", hash); + game_hash->game_id = RC_CLIENT_UNKNOWN_GAME_ID; + game_hash->next = client->hashes; + client->hashes = game_hash; + } + rc_mutex_unlock(&client->state.mutex); + + return game_hash; +} + +void rc_client_add_game_hash(rc_client_t* client, const char* hash, uint32_t game_id) +{ + /* store locally, even if passing to external client */ + rc_client_game_hash_t* game_hash = rc_client_find_game_hash(client, hash); + game_hash->game_id = game_id; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->add_game_hash) + client->state.external_client->add_game_hash(hash, game_id); +#endif +} + +static rc_client_async_handle_t* rc_client_load_game(rc_client_load_state_t* load_state, + const char* hash, const char* file_path) +{ + rc_client_t* client = load_state->client; + rc_client_game_hash_t* old_hash; +#ifdef RC_CLIENT_SUPPORTS_HASH + size_t i; +#endif + + if (!rc_client_attach_load_state(client, load_state)) { + rc_client_free_load_state(load_state); + return NULL; + } + + old_hash = load_state->hash; + load_state->hash = rc_client_find_game_hash(client, hash); + +#ifdef RC_CLIENT_SUPPORTS_HASH + i = 0; + do { + if (!load_state->tried_hashes[i]) { + load_state->tried_hashes[i] = load_state->hash; + break; + } + + if (load_state->tried_hashes[i] == load_state->hash) + break; + + if (++i == sizeof(load_state->tried_hashes) / sizeof(load_state->tried_hashes[0])) { + RC_CLIENT_LOG_VERBOSE(client, "tried_hashes buffer is full"); + break; + } + } while (1); +#endif + + if (file_path) { + rc_client_media_hash_t* media_hash = + (rc_client_media_hash_t*)rc_buffer_alloc(&load_state->game->buffer, sizeof(*media_hash)); + media_hash->game_hash = load_state->hash; + media_hash->path_djb2 = rc_djb2(file_path); + media_hash->next = load_state->game->media_hash; + load_state->game->media_hash = media_hash; + } + else if (load_state->game->media_hash && load_state->game->media_hash->game_hash == old_hash) { + load_state->game->media_hash->game_hash = load_state->hash; + } + + if (load_state->hash->game_id == 0) { + rc_client_process_resolved_hash(load_state); + } +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + else if (load_state->hash->game_id == RC_CLIENT_UNKNOWN_GAME_ID && + client->state.external_client && client->state.external_client->add_game_hash) { + /* if an add_game_hash external handler exists, do the identification locally, then + * pass the resulting game_id/hash to the external client */ + rc_api_resolve_hash_request_t resolve_hash_request; + rc_api_request_t request; + int result; + + memset(&resolve_hash_request, 0, sizeof(resolve_hash_request)); + resolve_hash_request.game_hash = hash; + + result = rc_api_init_resolve_hash_request_hosted(&request, &resolve_hash_request, &client->state.host); + if (result != RC_OK) { + rc_client_load_error(load_state, result, rc_error_str(result)); + return NULL; + } + + rc_client_begin_load_state(load_state, RC_CLIENT_LOAD_GAME_STATE_IDENTIFYING_GAME, 1); + + rc_client_begin_async(client, &load_state->async_handle); + client->callbacks.server_call(&request, rc_client_identify_game_callback, load_state, client); + + rc_api_destroy_request(&request); + } + else if (load_state->hash->game_id != RC_CLIENT_UNKNOWN_GAME_ID && + client->state.external_client && client->state.external_client->begin_load_game) { + rc_client_begin_async(client, &load_state->async_handle); + client->state.external_client->begin_load_game(client, load_state->hash->hash, rc_client_external_load_state_callback, load_state); + } +#endif + else { + rc_client_begin_fetch_game_sets(load_state); + } + + return (client->state.load == load_state) ? &load_state->async_handle : NULL; +} + +static void rc_client_abort_load_in_progress(rc_client_t* client) +{ + rc_client_load_state_t* load_state; + + rc_mutex_lock(&client->state.mutex); + + load_state = client->state.load; + if (load_state) { + /* this mimics rc_client_abort_async without nesting the lock */ + load_state->async_handle.aborted = RC_CLIENT_ASYNC_ABORTED; + + client->state.load = NULL; + } + + rc_mutex_unlock(&client->state.mutex); + + if (load_state && load_state->callback) + load_state->callback(RC_ABORTED, "The requested game is no longer active", load_state->client, load_state->callback_userdata); +} + +rc_client_async_handle_t* rc_client_begin_load_game(rc_client_t* client, const char* hash, rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_load_state_t* load_state; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + if (!hash || !hash[0]) { + callback(RC_INVALID_STATE, "hash is required", client, callback_userdata); + return NULL; + } + + rc_client_abort_load_in_progress(client); + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_load_game) + return client->state.external_client->begin_load_game(client, hash, callback, callback_userdata); +#endif + + load_state = (rc_client_load_state_t*)calloc(1, sizeof(*load_state)); + if (!load_state) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, callback_userdata); + return NULL; + } + + load_state->client = client; + load_state->callback = callback; + load_state->callback_userdata = callback_userdata; + + return rc_client_load_game(load_state, hash, NULL); +} + +#ifdef RC_CLIENT_SUPPORTS_HASH + +rc_hash_iterator_t* rc_client_get_load_state_hash_iterator(rc_client_t* client) +{ + if (client && client->state.load) + return &client->state.load->hash_iterator; + + return NULL; +} + +static void rc_client_log_hash_message_verbose(const char* message, const rc_hash_iterator_t* iterator) +{ + const rc_client_load_state_t* load_state = (const rc_client_load_state_t*)iterator->userdata; + if (load_state->client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) + rc_client_log_message(load_state->client, message); +} + +static void rc_client_log_hash_message_error(const char* message, const rc_hash_iterator_t* iterator) +{ + const rc_client_load_state_t* load_state = (const rc_client_load_state_t*)iterator->userdata; + if (load_state->client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) + rc_client_log_message(load_state->client, message); +} + +void rc_client_set_hash_callbacks(rc_client_t* client, const struct rc_hash_callbacks* callbacks) +{ + memcpy(&client->callbacks.hash, callbacks, sizeof(*callbacks)); + + if (!callbacks->verbose_message) + client->callbacks.hash.verbose_message = rc_client_log_hash_message_verbose; + if (!callbacks->error_message) + client->callbacks.hash.error_message = rc_client_log_hash_message_error; +} + +rc_client_async_handle_t* rc_client_begin_identify_and_load_game(rc_client_t* client, + uint32_t console_id, const char* file_path, + const uint8_t* data, size_t data_size, + rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_load_state_t* load_state; + char hash[33]; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + rc_client_abort_load_in_progress(client); + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + /* if a add_game_hash handler exists, do the identification locally, then pass the + * resulting game_id/hash to the external client */ + if (client->state.external_client && !client->state.external_client->add_game_hash) { + if (client->state.external_client->begin_identify_and_load_game) + return client->state.external_client->begin_identify_and_load_game(client, console_id, file_path, data, data_size, callback, callback_userdata); + } +#endif + + if (data) { + if (file_path) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Identifying game: %zu bytes at %p (%s)", data_size, data, file_path); + } + else { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Identifying game: %zu bytes at %p", data_size, data); + } + } + else if (file_path) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Identifying game: %s", file_path); + } + else { + callback(RC_INVALID_STATE, "either data or file_path is required", client, callback_userdata); + return NULL; + } + + if (!file_path) + file_path = "?"; + + load_state = (rc_client_load_state_t*)calloc(1, sizeof(*load_state)); + if (!load_state) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, callback_userdata); + return NULL; + } + load_state->client = client; + load_state->callback = callback; + load_state->callback_userdata = callback_userdata; + + /* initialize the iterator */ + rc_hash_initialize_iterator(&load_state->hash_iterator, file_path, data, data_size); + rc_hash_merge_callbacks(&load_state->hash_iterator, &client->callbacks.hash); + load_state->hash_iterator.userdata = load_state; + + if (!load_state->hash_iterator.callbacks.verbose_message) + load_state->hash_iterator.callbacks.verbose_message = rc_client_log_hash_message_verbose; + if (!load_state->hash_iterator.callbacks.error_message) + load_state->hash_iterator.callbacks.error_message = rc_client_log_hash_message_error; + + /* calculate the hash */ + if (console_id == RC_CONSOLE_UNKNOWN) { + if (!rc_hash_iterate(hash, &load_state->hash_iterator)) { + rc_client_load_error(load_state, RC_INVALID_STATE, "hash generation failed"); + return NULL; + } + + load_state->hash_console_id = load_state->hash_iterator.consoles[load_state->hash_iterator.index - 1]; + } + else { + /* ASSERT: hash_iterator->index and hash_iterator->consoles[0] will be 0 from calloc */ + load_state->hash_console_id = console_id; + + /* prevent initializing the iterator so it won't try other consoles in rc_client_process_resolved_hash */ + load_state->hash_iterator.index = 0; + + if (!rc_hash_generate(hash, console_id, &load_state->hash_iterator)) { + rc_client_load_error(load_state, RC_INVALID_STATE, "hash generation failed"); + return NULL; + } + } + + return rc_client_load_game(load_state, hash, file_path); +} + +#endif /* RC_CLIENT_SUPPORTS_HASH */ + +int rc_client_get_load_game_state(const rc_client_t* client) +{ + int state = RC_CLIENT_LOAD_GAME_STATE_NONE; + if (client) { + const rc_client_load_state_t* load_state = client->state.load; + if (load_state) + state = load_state->progress; + else if (client->game) + state = RC_CLIENT_LOAD_GAME_STATE_DONE; + } + + return state; +} + +int rc_client_is_game_loaded(const rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + const rc_client_game_t* game = rc_client_get_game_info(client); + return (game && game->id != 0); + } +#endif + + return (client->game && client->game->public_.id != 0); +} + +static void rc_client_game_mark_ui_to_be_hidden(rc_client_t* client, rc_client_game_info_t* game) +{ + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* achievement_stop; + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* leaderboard_stop; + rc_client_subset_info_t* subset; + + for (subset = game->subsets; subset; subset = subset->next) { + achievement = subset->achievements; + achievement_stop = achievement + subset->public_.num_achievements; + for (; achievement < achievement_stop; ++achievement) { + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE && + achievement->trigger && achievement->trigger->state == RC_TRIGGER_STATE_PRIMED) { + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + } + } + + leaderboard = subset->leaderboards; + leaderboard_stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < leaderboard_stop; ++leaderboard) { + if (leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_TRACKING) + rc_client_release_leaderboard_tracker(game, leaderboard); + } + } + + rc_client_hide_progress_tracker(client, game); +} + +void rc_client_unload_game(rc_client_t* client) +{ + rc_client_game_info_t* game; + + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->unload_game) { + client->state.external_client->unload_game(); + + /* a game object may have been allocated to manage hashes */ + game = client->game; + client->game = NULL; + if (game != NULL) + rc_client_free_game(game); + + return; + } +#endif + + rc_mutex_lock(&client->state.mutex); + + game = client->game; + client->game = NULL; + + if (client->state.load) { + /* this mimics rc_client_abort_async without nesting the lock */ + client->state.load->async_handle.aborted = RC_CLIENT_ASYNC_ABORTED; + + /* if the game is still being loaded, let the load process clean it up */ + if (client->state.load->game == game) + game = NULL; + + client->state.load = NULL; + } + + if (client->state.spectator_mode == RC_CLIENT_SPECTATOR_MODE_LOCKED) + client->state.spectator_mode = RC_CLIENT_SPECTATOR_MODE_ON; + + if (game != NULL) { + rc_client_scheduled_callback_data_t** last; + rc_client_scheduled_callback_data_t* next; + + rc_client_game_mark_ui_to_be_hidden(client, game); + + last = &client->state.scheduled_callbacks; + do { + next = *last; + if (!next) + break; + + /* remove rich presence ping scheduled event for game */ + if (next->callback == rc_client_ping && next->related_id == game->public_.id) { + *last = next->next; + continue; + } + + last = &next->next; + } while (1); + } + + rc_mutex_unlock(&client->state.mutex); + + if (game != NULL) { + rc_client_raise_pending_events(client, game); + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Unloading game %u", game->public_.id); + rc_client_free_game(game); + } +} + +static void rc_client_change_media_internal(rc_client_t* client, const rc_client_game_hash_t* game_hash, rc_client_callback_t callback, void* callback_userdata) +{ + client->game->public_.hash = game_hash->hash; + + if (game_hash->game_id == client->game->public_.id) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Switching to valid media for game %u: %s", game_hash->game_id, game_hash->hash); + } + else if (game_hash->game_id == RC_CLIENT_UNKNOWN_GAME_ID) { + RC_CLIENT_LOG_INFO(client, "Switching to unknown media"); + } + else if (game_hash->game_id == 0) { + if (client->state.hardcore) { + RC_CLIENT_LOG_WARN_FORMATTED(client, "Disabling hardcore for unidentified media: %s", game_hash->hash); + rc_client_set_hardcore_enabled(client, 0); + callback(RC_HARDCORE_DISABLED, "Hardcore disabled. Unidentified media inserted.", client, callback_userdata); + return; + } + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Switching to unrecognized media: %s", game_hash->hash); + } + else { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Switching to known media for game %u: %s", game_hash->game_id, game_hash->hash); + } + + callback(RC_OK, NULL, client, callback_userdata); +} + +static void rc_client_identify_changed_media_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_load_state_t* load_state = (rc_client_load_state_t*)callback_data; + rc_client_t* client = load_state->client; + rc_api_resolve_hash_response_t resolve_hash_response; + + int result = rc_api_process_resolve_hash_server_response(&resolve_hash_response, server_response); + const char* error_message = rc_client_server_error_message(&result, server_response->http_status_code, &resolve_hash_response.response); + + const int async_aborted = rc_client_end_async(client, &load_state->async_handle); + if (async_aborted) { + if (async_aborted != RC_CLIENT_ASYNC_DESTROYED) { + RC_CLIENT_LOG_VERBOSE(client, "Media change aborted"); + /* if lookup succeeded, still capture the new hash */ + if (result == RC_OK) + load_state->hash->game_id = resolve_hash_response.game_id; + } + } + else if (client->game != load_state->game) { + /* loaded game changed. return success regardless of result */ + load_state->callback(RC_ABORTED, "The requested game is no longer active", client, load_state->callback_userdata); + } + else if (error_message) { + load_state->callback(result, error_message, client, load_state->callback_userdata); + } + else { + load_state->hash->game_id = resolve_hash_response.game_id; + + if (resolve_hash_response.game_id != 0) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Identified game: %u (%s)", load_state->hash->game_id, load_state->hash->hash); + } + + rc_client_change_media_internal(client, load_state->hash, load_state->callback, load_state->callback_userdata); + } + + free(load_state); + rc_api_destroy_resolve_hash_response(&resolve_hash_response); +} + +static rc_client_async_handle_t* rc_client_begin_change_media_internal(rc_client_t* client, + rc_client_game_info_t* game, rc_client_game_hash_t* game_hash, rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_load_state_t* callback_data; + rc_client_async_handle_t* async_handle; + rc_api_resolve_hash_request_t resolve_hash_request; + rc_api_request_t request; + int result; + + if (game_hash->game_id != RC_CLIENT_UNKNOWN_GAME_ID || /* previously looked up */ + game_hash->hash[0] == '[') { /* internal use - don't try to look up */ + rc_client_change_media_internal(client, game_hash, callback, callback_userdata); + return NULL; + } + + /* call the server to make sure the hash is valid for the loaded game */ + memset(&resolve_hash_request, 0, sizeof(resolve_hash_request)); + resolve_hash_request.game_hash = game_hash->hash; + + result = rc_api_init_resolve_hash_request_hosted(&request, &resolve_hash_request, &client->state.host); + if (result != RC_OK) { + callback(result, rc_error_str(result), client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_load_state_t*)calloc(1, sizeof(rc_client_load_state_t)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, callback_userdata); + return NULL; + } + + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + callback_data->client = client; + callback_data->hash = game_hash; + callback_data->game = game; + + async_handle = &callback_data->async_handle; + rc_client_begin_async(client, async_handle); + client->callbacks.server_call(&request, rc_client_identify_changed_media_callback, callback_data, client); + + rc_api_destroy_request(&request); + + /* if handle is no longer valid, the async operation completed synchronously */ + return rc_client_async_handle_valid(client, async_handle) ? async_handle : NULL; +} + +static rc_client_game_info_t* rc_client_check_pending_media(rc_client_t* client, const rc_client_pending_media_t* media) +{ + rc_client_game_info_t* game; + rc_client_pending_media_t* pending_media = NULL; + + rc_mutex_lock(&client->state.mutex); + if (client->state.load) { + game = client->state.load->game; + if (!game || game->public_.console_id == 0) { + /* still waiting for game data */ + pending_media = client->state.load->pending_media; + if (pending_media) + rc_client_free_pending_media(pending_media); + + pending_media = (rc_client_pending_media_t*)malloc(sizeof(*pending_media)); + if (!pending_media) { + rc_mutex_unlock(&client->state.mutex); + media->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, media->callback_userdata); + return NULL; + } + + memcpy(pending_media, media, sizeof(*pending_media)); + if (media->hash) + pending_media->hash = strdup(media->hash); + +#ifdef RC_CLIENT_SUPPORTS_HASH + if (media->file_path) + pending_media->file_path = strdup(media->file_path); + + if (media->data && media->data_size) { + pending_media->data = (uint8_t*)malloc(media->data_size); + if (!pending_media->data) { + rc_mutex_unlock(&client->state.mutex); + media->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), client, media->callback_userdata); + return NULL; + } + memcpy(pending_media->data, media->data, media->data_size); + } else { + pending_media->data = NULL; + } +#endif + + client->state.load->pending_media = pending_media; + } + } + else { + game = client->game; + } + rc_mutex_unlock(&client->state.mutex); + + if (!game) { + media->callback(RC_NO_GAME_LOADED, rc_error_str(RC_NO_GAME_LOADED), client, media->callback_userdata); + return NULL; + } + + /* still waiting for game data - don't call callback - it's queued */ + if (pending_media) + return NULL; + + return game; +} + +#ifdef RC_CLIENT_SUPPORTS_HASH + +rc_client_async_handle_t* rc_client_begin_identify_and_change_media(rc_client_t* client, const char* file_path, + const uint8_t* data, size_t data_size, rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_pending_media_t media; + rc_client_game_hash_t* game_hash = NULL; + rc_client_game_info_t* game; + rc_client_media_hash_t* media_hash; + uint32_t path_djb2; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + if (!data && !file_path) { + callback(RC_INVALID_STATE, "either data or file_path is required", client, callback_userdata); + return NULL; + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && !client->state.external_client->begin_change_media) { + if (client->state.external_client->begin_identify_and_change_media) + return client->state.external_client->begin_identify_and_change_media(client, file_path, data, data_size, callback, callback_userdata); + } +#endif + + memset(&media, 0, sizeof(media)); + media.file_path = file_path; + media.data = (uint8_t*)data; + media.data_size = data_size; + media.callback = callback; + media.callback_userdata = callback_userdata; + + game = rc_client_check_pending_media(client, &media); + if (game == NULL) + return NULL; + + /* check to see if we've already hashed this file */ + path_djb2 = rc_djb2(file_path); + rc_mutex_lock(&client->state.mutex); + for (media_hash = game->media_hash; media_hash; media_hash = media_hash->next) { + if (media_hash->path_djb2 == path_djb2) { + game_hash = media_hash->game_hash; + break; + } + } + rc_mutex_unlock(&client->state.mutex); + + if (!game_hash) { + char hash[33]; + int result; + + if (data != NULL) + result = rc_hash_generate_from_buffer(hash, game->public_.console_id, data, data_size); + else + result = rc_hash_generate_from_file(hash, game->public_.console_id, file_path); + + if (!result) { + /* when changing discs, if the disc is not supported by the system, allow it. this is + * primarily for games that support user-provided audio CDs, but does allow using discs + * from other systems for games that leverage user-provided discs. */ + strcpy_s(hash, sizeof(hash), "[NO HASH]"); + } + + game_hash = rc_client_find_game_hash(client, hash); + + media_hash = (rc_client_media_hash_t*)rc_buffer_alloc(&game->buffer, sizeof(*media_hash)); + media_hash->game_hash = game_hash; + media_hash->path_djb2 = path_djb2; + + rc_mutex_lock(&client->state.mutex); + media_hash->next = game->media_hash; + game->media_hash = media_hash; + rc_mutex_unlock(&client->state.mutex); + + if (!result) { +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_change_media) + return client->state.external_client->begin_change_media(client, game_hash->hash, callback, callback_userdata); +#endif + + rc_client_change_media_internal(client, game_hash, callback, callback_userdata); + return NULL; + } + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->add_game_hash) + client->state.external_client->add_game_hash(game_hash->hash, game_hash->game_id); + if (client->state.external_client->begin_change_media) + return client->state.external_client->begin_change_media(client, game_hash->hash, callback, callback_userdata); + } +#endif + + return rc_client_begin_change_media_internal(client, game, game_hash, callback, callback_userdata); +} + +#endif /* RC_CLIENT_SUPPORTS_HASH */ + +rc_client_async_handle_t* rc_client_begin_change_media(rc_client_t* client, const char* hash, + rc_client_callback_t callback, void* callback_userdata) +{ + rc_client_pending_media_t media; + rc_client_game_hash_t* game_hash; + rc_client_game_info_t* game; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", client, callback_userdata); + return NULL; + } + + if (!hash || !hash[0]) { + callback(RC_INVALID_STATE, "hash is required", client, callback_userdata); + return NULL; + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_change_media) { + return client->state.external_client->begin_change_media(client, hash, callback, callback_userdata); + } +#endif + + memset(&media, 0, sizeof(media)); + media.hash = hash; + media.callback = callback; + media.callback_userdata = callback_userdata; + + game = rc_client_check_pending_media(client, &media); + if (game == NULL) + return NULL; + + /* check to see if we've already hashed this file. */ + game_hash = rc_client_find_game_hash(client, hash); + return rc_client_begin_change_media_internal(client, game, game_hash, callback, callback_userdata); +} + +const rc_client_game_t* rc_client_get_game_info(const rc_client_t* client) +{ + if (!client) + return NULL; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->get_game_info_v3) + return client->state.external_client->get_game_info_v3(); + + if (client->state.external_client->get_game_info) + return rc_client_external_convert_v1_game(client, client->state.external_client->get_game_info()); + } +#endif + + return client->game ? &client->game->public_ : NULL; +} + +int rc_client_game_get_image_url(const rc_client_game_t* game, char buffer[], size_t buffer_size) +{ + if (!game) + return RC_INVALID_STATE; + + if (game->badge_url) { + snprintf(buffer, buffer_size, "%s", game->badge_url); + return RC_OK; + } + + return rc_client_get_image_url(buffer, buffer_size, RC_IMAGE_TYPE_GAME, game->badge_name); +} + +/* ===== Subsets ===== */ + +const rc_client_subset_t* rc_client_get_subset_info(rc_client_t* client, uint32_t subset_id) +{ + rc_client_subset_info_t* subset; + + if (!client) + return NULL; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->get_subset_info_v3) + return client->state.external_client->get_subset_info_v3(subset_id); + + if (client->state.external_client->get_subset_info) + return rc_client_external_convert_v1_subset(client, client->state.external_client->get_subset_info(subset_id)); + } +#endif + + if (!client->game) + return NULL; + + for (subset = client->game->subsets; subset; subset = subset->next) { + if (subset->public_.id == subset_id) + return &subset->public_; + } + + return NULL; +} + +rc_client_subset_list_t* rc_client_create_subset_list(rc_client_t* client) +{ + rc_client_subset_list_info_t* list; + const rc_client_subset_info_t* subset; + const rc_client_subset_t** subset_ptr; + const uint32_t list_size = RC_ALIGN(sizeof(*list)); + uint32_t num_subsets = 0; + + if (!client) + return (rc_client_subset_list_t*)calloc(1, list_size); + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->create_subset_list) + return (rc_client_subset_list_t*)client->state.external_client->create_subset_list(); +#endif + + if (!client->game) + return (rc_client_subset_list_t*)calloc(1, list_size); + + rc_mutex_lock(&client->state.mutex); + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (subset->active) + num_subsets++; + } + + list = (rc_client_subset_list_info_t*)malloc(list_size + num_subsets * sizeof(rc_client_subset_t*)); + list->public_.subsets = subset_ptr = (const rc_client_subset_t**)((uint8_t*)list + list_size); + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (subset->active) + *subset_ptr++ = &subset->public_; + } + + rc_mutex_unlock(&client->state.mutex); + + list->destroy_func = NULL; + list->public_.num_subsets = (uint32_t)(subset_ptr - list->public_.subsets); + return &list->public_; +} + +void rc_client_destroy_subset_list(rc_client_subset_list_t* list) +{ + rc_client_subset_list_info_t* info = (rc_client_subset_list_info_t*)list; + if (info->destroy_func) + info->destroy_func(info); + else + free(list); +} + +/* ===== Fetch Game Hashes ===== */ + +typedef struct rc_client_fetch_hash_library_callback_data_t { + rc_client_t* client; + rc_client_fetch_hash_library_callback_t callback; + void* callback_userdata; + uint32_t console_id; + rc_client_async_handle_t async_handle; +} rc_client_fetch_hash_library_callback_data_t; + +static void rc_client_fetch_hash_library_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_fetch_hash_library_callback_data_t* hashlib_callback_data = + (rc_client_fetch_hash_library_callback_data_t*)callback_data; + rc_client_t* client = hashlib_callback_data->client; + rc_api_fetch_hash_library_response_t hashlib_response; + const char* error_message; + int result; + + result = rc_client_end_async(client, &hashlib_callback_data->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) + RC_CLIENT_LOG_VERBOSE(client, "Fetch hash library aborted"); + + free(hashlib_callback_data); + return; + } + + result = rc_api_process_fetch_hash_library_server_response(&hashlib_response, server_response); + error_message = + rc_client_server_error_message(&result, server_response->http_status_code, &hashlib_response.response); + if (error_message) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Fetch hash library for console %u failed: %s", + hashlib_callback_data->console_id, error_message); + hashlib_callback_data->callback(result, error_message, NULL, client, hashlib_callback_data->callback_userdata); + } else { + rc_client_hash_library_t* list; + const size_t list_size = sizeof(*list) + sizeof(rc_client_hash_library_entry_t) * hashlib_response.num_entries; + list = (rc_client_hash_library_t*)malloc(list_size); + if (!list) { + hashlib_callback_data->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, + hashlib_callback_data->callback_userdata); + } else { + rc_client_hash_library_entry_t* entry = list->entries = + (rc_client_hash_library_entry_t*)((uint8_t*)list + sizeof(*list)); + const rc_api_hash_library_entry_t* hlentry = hashlib_response.entries; + const rc_api_hash_library_entry_t* stop = hlentry + hashlib_response.num_entries; + + for (; hlentry < stop; ++hlentry, ++entry) { + snprintf(entry->hash, sizeof(entry->hash), "%s", hlentry->hash); + entry->game_id = hlentry->game_id; + } + + list->num_entries = hashlib_response.num_entries; + + hashlib_callback_data->callback(RC_OK, NULL, list, client, hashlib_callback_data->callback_userdata); + } + } + + rc_api_destroy_fetch_hash_library_response(&hashlib_response); + free(hashlib_callback_data); +} + +rc_client_async_handle_t* rc_client_begin_fetch_hash_library(rc_client_t* client, uint32_t console_id, + rc_client_fetch_hash_library_callback_t callback, + void* callback_userdata) +{ + rc_api_fetch_hash_library_request_t api_params; + rc_client_fetch_hash_library_callback_data_t* callback_data; + rc_client_async_handle_t* async_handle; + rc_api_request_t request; + int result; + const char* error_message; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", NULL, client, callback_userdata); + return NULL; + } + + api_params.console_id = console_id; + result = rc_api_init_fetch_hash_library_request_hosted(&request, &api_params, &client->state.host); + + if (result != RC_OK) { + error_message = rc_error_str(result); + callback(result, error_message, NULL, client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_fetch_hash_library_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, callback_userdata); + return NULL; + } + + callback_data->client = client; + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + callback_data->console_id = console_id; + + async_handle = &callback_data->async_handle; + rc_client_begin_async(client, async_handle); + client->callbacks.server_call(&request, rc_client_fetch_hash_library_callback, callback_data, client); + rc_api_destroy_request(&request); + + return rc_client_async_handle_valid(client, async_handle) ? async_handle : NULL; +} + +void rc_client_destroy_hash_library(rc_client_hash_library_t* list) +{ + free(list); +} + +/* ===== Fetch Game Titles ===== */ + +typedef struct rc_client_fetch_game_titles_callback_data_t { + rc_client_t* client; + rc_client_fetch_game_titles_callback_t callback; + void* callback_userdata; + rc_client_async_handle_t async_handle; +} rc_client_fetch_game_titles_callback_data_t; + +static void rc_client_fetch_game_titles_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_fetch_game_titles_callback_data_t* titles_callback_data = + (rc_client_fetch_game_titles_callback_data_t*)callback_data; + rc_client_t* client = titles_callback_data->client; + rc_api_fetch_game_titles_response_t titles_response; + const char* error_message; + int result; + + result = rc_client_end_async(client, &titles_callback_data->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) + RC_CLIENT_LOG_VERBOSE(client, "Fetch game titles aborted"); + + free(titles_callback_data); + return; + } + + result = rc_api_process_fetch_game_titles_server_response(&titles_response, server_response); + error_message = + rc_client_server_error_message(&result, server_response->http_status_code, &titles_response.response); + if (error_message) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Fetch game titles failed: %s", error_message); + titles_callback_data->callback(result, error_message, NULL, client, titles_callback_data->callback_userdata); + } else { + rc_client_game_title_list_t* list; + size_t strings_size = 0; + const rc_api_game_title_entry_t* src; + const rc_api_game_title_entry_t* stop; + size_t list_size; + + /* calculate string buffer size */ + for (src = titles_response.entries, stop = src + titles_response.num_entries; src < stop; ++src) { + if (src->title) + strings_size += strlen(src->title) + 1; + } + + list_size = sizeof(*list) + sizeof(rc_client_game_title_entry_t) * titles_response.num_entries + strings_size; + list = (rc_client_game_title_list_t*)malloc(list_size); + if (!list) { + titles_callback_data->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, + titles_callback_data->callback_userdata); + } else { + rc_client_game_title_entry_t* entry = list->entries = + (rc_client_game_title_entry_t*)((uint8_t*)list + sizeof(*list)); + char* strings = (char*)((uint8_t*)list + sizeof(*list) + + sizeof(rc_client_game_title_entry_t) * titles_response.num_entries); + + for (src = titles_response.entries, stop = src + titles_response.num_entries; src < stop; ++src, ++entry) { + entry->game_id = src->id; + + if (src->title) { + const size_t len = strlen(src->title) + 1; + entry->title = strings; + memcpy(strings, src->title, len); + strings += len; + } else { + entry->title = NULL; + } + + if (src->image_name) + snprintf(entry->badge_name, sizeof(entry->badge_name), "%s", src->image_name); + else + entry->badge_name[0] = '\0'; + } + + list->num_entries = titles_response.num_entries; + + titles_callback_data->callback(RC_OK, NULL, list, client, titles_callback_data->callback_userdata); + } + } + + rc_api_destroy_fetch_game_titles_response(&titles_response); + free(titles_callback_data); +} + +rc_client_async_handle_t* rc_client_begin_fetch_game_titles(rc_client_t* client, const uint32_t* game_ids, + uint32_t num_game_ids, + rc_client_fetch_game_titles_callback_t callback, + void* callback_userdata) +{ + rc_api_fetch_game_titles_request_t api_params; + rc_client_fetch_game_titles_callback_data_t* callback_data; + rc_client_async_handle_t* async_handle; + rc_api_request_t request; + int result; + const char* error_message; + + if (!client) { + callback(RC_INVALID_STATE, "client is required", NULL, client, callback_userdata); + return NULL; + } + + if (!game_ids || num_game_ids == 0) { + callback(RC_INVALID_STATE, "game_ids is required", NULL, client, callback_userdata); + return NULL; + } + + api_params.game_ids = game_ids; + api_params.num_game_ids = num_game_ids; + result = rc_api_init_fetch_game_titles_request_hosted(&request, &api_params, &client->state.host); + + if (result != RC_OK) { + error_message = rc_error_str(result); + callback(result, error_message, NULL, client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_fetch_game_titles_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, callback_userdata); + return NULL; + } + + callback_data->client = client; + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + + async_handle = &callback_data->async_handle; + rc_client_begin_async(client, async_handle); + client->callbacks.server_call(&request, rc_client_fetch_game_titles_callback, callback_data, client); + rc_api_destroy_request(&request); + + return rc_client_async_handle_valid(client, async_handle) ? async_handle : NULL; +} + +void rc_client_destroy_game_title_list(rc_client_game_title_list_t* list) +{ + free(list); +} + +/* ===== Achievements ===== */ + +static void rc_client_update_achievement_display_information(rc_client_t* client, rc_client_achievement_info_t* achievement, time_t recent_unlock_time) +{ + uint8_t new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNKNOWN; + uint32_t new_measured_value = 0; + + if (achievement->public_.bucket == RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED) + return; + + achievement->public_.measured_progress[0] = '\0'; + + if (achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED) { + /* achievement unlocked */ + if (achievement->public_.unlock_time >= recent_unlock_time) { + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED; + } else { + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED; + + if (client->state.disconnect && rc_client_is_award_achievement_pending(client, achievement->public_.id)) + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED; + } + } + else { + /* active achievement */ + new_bucket = (achievement->public_.category == RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL) ? + RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL : RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED; + + if (achievement->trigger) { + if (achievement->trigger->measured_target) { + if (achievement->trigger->measured_value == RC_MEASURED_UNKNOWN) { + /* value hasn't been initialized yet, leave progress string empty */ + } + else if (achievement->trigger->measured_value == 0) { + /* value is 0, leave progress string empty. update progress to 0.0 */ + achievement->public_.measured_percent = 0.0; + } + else { + /* clamp measured value at target (can't get more than 100%) */ + new_measured_value = (achievement->trigger->measured_value > achievement->trigger->measured_target) ? + achievement->trigger->measured_target : achievement->trigger->measured_value; + + achievement->public_.measured_percent = ((float)new_measured_value * 100) / (float)achievement->trigger->measured_target; + + if (!achievement->trigger->measured_as_percent) { + char* ptr = achievement->public_.measured_progress; + const int buffer_size = (int)sizeof(achievement->public_.measured_progress); + const int chars = rc_format_value(ptr, buffer_size, (int32_t)new_measured_value, RC_FORMAT_UNSIGNED_VALUE); + ptr[chars] = '/'; + rc_format_value(ptr + chars + 1, buffer_size - chars - 1, (int32_t)achievement->trigger->measured_target, RC_FORMAT_UNSIGNED_VALUE); + } + else if (achievement->public_.measured_percent >= 1.0) { + snprintf(achievement->public_.measured_progress, sizeof(achievement->public_.measured_progress), + "%lu%%", (unsigned long)achievement->public_.measured_percent); + } + } + } + + if (achievement->trigger->state == RC_TRIGGER_STATE_PRIMED) + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE; + else if (achievement->public_.measured_percent >= 80.0) + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE; + } + } + + achievement->public_.bucket = new_bucket; +} + +static const char* rc_client_get_achievement_bucket_label(uint8_t bucket_type) +{ + switch (bucket_type) { + case RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED: return "Locked"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED: return "Unlocked"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED: return "Unsupported"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL: return "Unofficial"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED: return "Recently Unlocked"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE: return "Active Challenges"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE: return "Almost There"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED: return "Unlocks Not Synced to Server"; + default: return "Unknown"; + } +} + +static const char* rc_client_get_subset_achievement_bucket_label(uint8_t bucket_type, rc_client_game_info_t* game, rc_client_subset_info_t* subset) +{ + const char** ptr; + const char* label; + char* new_label; + size_t new_label_len; + + switch (bucket_type) { + case RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED: ptr = &subset->locked_label; break; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED: ptr = &subset->unlocked_label; break; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED: ptr = &subset->unsupported_label; break; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL: ptr = &subset->unofficial_label; break; + default: return rc_client_get_achievement_bucket_label(bucket_type); + } + + if (*ptr) + return *ptr; + + label = rc_client_get_achievement_bucket_label(bucket_type); + new_label_len = strlen(subset->public_.title) + strlen(label) + 4; + new_label = (char*)rc_buffer_alloc(&game->buffer, new_label_len); + snprintf(new_label, new_label_len, "%s - %s", subset->public_.title, label); + + *ptr = new_label; + return new_label; +} + +static int rc_client_compare_achievement_unlock_times(const void* a, const void* b) +{ + const rc_client_achievement_t* unlock_a = *(const rc_client_achievement_t**)a; + const rc_client_achievement_t* unlock_b = *(const rc_client_achievement_t**)b; + if (unlock_b->unlock_time == unlock_a->unlock_time) + return 0; + return (unlock_b->unlock_time < unlock_a->unlock_time) ? -1 : 1; +} + +static int rc_client_compare_achievement_progress(const void* a, const void* b) +{ + const rc_client_achievement_t* unlock_a = *(const rc_client_achievement_t**)a; + const rc_client_achievement_t* unlock_b = *(const rc_client_achievement_t**)b; + if (unlock_b->measured_percent == unlock_a->measured_percent) { + if (unlock_a->id == unlock_b->id) + return 0; + return (unlock_a->id < unlock_b->id) ? -1 : 1; + } + return (unlock_b->measured_percent < unlock_a->measured_percent) ? -1 : 1; +} + +static uint8_t rc_client_map_bucket(uint8_t bucket, int grouping) +{ + if (grouping == RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE) { + switch (bucket) { + case RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED: + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED: + return RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED; + + case RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE: + case RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE: + return RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED; + + default: + return bucket; + } + } + + return bucket; +} + +rc_client_achievement_list_t* rc_client_create_achievement_list(rc_client_t* client, int category, int grouping) +{ + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* stop; + const rc_client_achievement_t** bucket_achievements; + const rc_client_achievement_t** achievement_ptr; + rc_client_achievement_bucket_t* bucket_ptr; + rc_client_achievement_list_info_t* list; + rc_client_subset_info_t* subset; + const uint32_t list_size = RC_ALIGN(sizeof(*list)); + uint32_t bucket_counts[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS]; + uint32_t num_buckets; + uint32_t num_achievements; + size_t buckets_size; + uint8_t bucket_type; + uint32_t num_subsets = 0; + uint32_t i, j; + const uint8_t shared_bucket_order[] = { + RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE, + RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED, + RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED, + }; + const uint8_t subset_bucket_order[] = { + RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED + }; + const time_t recent_unlock_time = time(NULL) - RC_CLIENT_RECENT_UNLOCK_DELAY_SECONDS; + + if (!client) + return (rc_client_achievement_list_t*)calloc(1, sizeof(rc_client_achievement_list_info_t)); + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->create_achievement_list_v3) + return (rc_client_achievement_list_t*)client->state.external_client->create_achievement_list_v3(category, grouping); + + if (client->state.external_client->create_achievement_list) + return rc_client_external_convert_v1_achievement_list(client, + (rc_client_achievement_list_t*)client->state.external_client->create_achievement_list(category, grouping)); + } +#endif + + if (!client->game) + return (rc_client_achievement_list_t*)calloc(1, sizeof(rc_client_achievement_list_info_t)); + + memset(&bucket_counts, 0, sizeof(bucket_counts)); + + rc_mutex_lock(&client->state.mutex); + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + num_subsets++; + achievement = subset->achievements; + stop = achievement + subset->public_.num_achievements; + for (; achievement < stop; ++achievement) { + if (achievement->public_.category & category) { + rc_client_update_achievement_display_information(client, achievement, recent_unlock_time); + bucket_counts[rc_client_map_bucket(achievement->public_.bucket, grouping)]++; + } + } + } + + num_buckets = 0; + num_achievements = 0; + for (i = 0; i < sizeof(bucket_counts) / sizeof(bucket_counts[0]); ++i) { + if (bucket_counts[i]) { + int needs_split = 0; + + num_achievements += bucket_counts[i]; + + if (num_subsets > 1) { + for (j = 0; j < sizeof(subset_bucket_order) / sizeof(subset_bucket_order[0]); ++j) { + if (subset_bucket_order[j] == i) { + needs_split = 1; + break; + } + } + } + + if (!needs_split) { + ++num_buckets; + continue; + } + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + achievement = subset->achievements; + stop = achievement + subset->public_.num_achievements; + for (; achievement < stop; ++achievement) { + if (achievement->public_.category & category) { + if (rc_client_map_bucket(achievement->public_.bucket, grouping) == i) { + ++num_buckets; + break; + } + } + } + } + } + } + + buckets_size = RC_ALIGN(num_buckets * sizeof(rc_client_achievement_bucket_t)); + + list = (rc_client_achievement_list_info_t*)malloc(list_size + buckets_size + num_achievements * sizeof(rc_client_achievement_t*)); + list->public_.buckets = bucket_ptr = (rc_client_achievement_bucket_t*)((uint8_t*)list + list_size); + achievement_ptr = (const rc_client_achievement_t**)((uint8_t*)bucket_ptr + buckets_size); + + if (grouping == RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS) { + for (i = 0; i < sizeof(shared_bucket_order) / sizeof(shared_bucket_order[0]); ++i) { + bucket_type = shared_bucket_order[i]; + if (!bucket_counts[bucket_type]) + continue; + + bucket_achievements = achievement_ptr; + for (subset = client->game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + achievement = subset->achievements; + stop = achievement + subset->public_.num_achievements; + for (; achievement < stop; ++achievement) { + if (achievement->public_.category & category && + rc_client_map_bucket(achievement->public_.bucket, grouping) == bucket_type) { + *achievement_ptr++ = &achievement->public_; + } + } + } + + if (achievement_ptr > bucket_achievements) { + bucket_ptr->achievements = bucket_achievements; + bucket_ptr->num_achievements = (uint32_t)(achievement_ptr - bucket_achievements); + bucket_ptr->subset_id = 0; + bucket_ptr->label = rc_client_get_achievement_bucket_label(bucket_type); + bucket_ptr->bucket_type = bucket_type; + + if (bucket_type == RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED) + qsort((void*)bucket_ptr->achievements, bucket_ptr->num_achievements, sizeof(rc_client_achievement_t*), rc_client_compare_achievement_unlock_times); + else if (bucket_type == RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE) + qsort((void*)bucket_ptr->achievements, bucket_ptr->num_achievements, sizeof(rc_client_achievement_t*), rc_client_compare_achievement_progress); + + ++bucket_ptr; + } + } + } + + for (subset = client->game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + for (i = 0; i < sizeof(subset_bucket_order) / sizeof(subset_bucket_order[0]); ++i) { + bucket_type = subset_bucket_order[i]; + if (!bucket_counts[bucket_type]) + continue; + + bucket_achievements = achievement_ptr; + + achievement = subset->achievements; + stop = achievement + subset->public_.num_achievements; + for (; achievement < stop; ++achievement) { + if (achievement->public_.category & category && + rc_client_map_bucket(achievement->public_.bucket, grouping) == bucket_type) { + *achievement_ptr++ = &achievement->public_; + } + } + + if (achievement_ptr > bucket_achievements) { + bucket_ptr->achievements = bucket_achievements; + bucket_ptr->num_achievements = (uint32_t)(achievement_ptr - bucket_achievements); + bucket_ptr->subset_id = (num_subsets > 1) ? subset->public_.id : 0; + bucket_ptr->bucket_type = bucket_type; + + if (num_subsets > 1) + bucket_ptr->label = rc_client_get_subset_achievement_bucket_label(bucket_type, client->game, subset); + else + bucket_ptr->label = rc_client_get_achievement_bucket_label(bucket_type); + + ++bucket_ptr; + } + } + } + + rc_mutex_unlock(&client->state.mutex); + + list->destroy_func = NULL; + list->public_.num_buckets = (uint32_t)(bucket_ptr - list->public_.buckets); + return &list->public_; +} + +void rc_client_destroy_achievement_list(rc_client_achievement_list_t* list) +{ + rc_client_achievement_list_info_t* info = (rc_client_achievement_list_info_t*)list; + if (info->destroy_func) + info->destroy_func(info); + else + free(list); +} + +int rc_client_has_achievements(rc_client_t* client) +{ + rc_client_subset_info_t* subset; + int result; + + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->has_achievements) + return client->state.external_client->has_achievements(); +#endif + + if (!client->game) + return 0; + + rc_mutex_lock(&client->state.mutex); + + subset = client->game->subsets; + result = 0; + for (; subset; subset = subset->next) + { + if (!subset->active) + continue; + + if (subset->public_.num_achievements > 0) { + result = 1; + break; + } + } + + rc_mutex_unlock(&client->state.mutex); + + return result; +} + +static const rc_client_achievement_t* rc_client_subset_get_achievement_info( + rc_client_t* client, rc_client_subset_info_t* subset, uint32_t id) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + + for (; achievement < stop; ++achievement) { + if (achievement->public_.id == id) { + const time_t recent_unlock_time = time(NULL) - RC_CLIENT_RECENT_UNLOCK_DELAY_SECONDS; + rc_mutex_lock((rc_mutex_t*)(&client->state.mutex)); + rc_client_update_achievement_display_information(client, achievement, recent_unlock_time); + rc_mutex_unlock((rc_mutex_t*)(&client->state.mutex)); + return &achievement->public_; + } + } + + return NULL; +} + +const rc_client_achievement_t* rc_client_get_achievement_info(rc_client_t* client, uint32_t id) +{ + rc_client_subset_info_t* subset; + + if (!client) + return NULL; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client) { + if (client->state.external_client->get_achievement_info_v3) + return client->state.external_client->get_achievement_info_v3(id); + + if (client->state.external_client->get_achievement_info) + return rc_client_external_convert_v1_achievement(client, client->state.external_client->get_achievement_info(id)); + } +#endif + + if (!client->game) + return NULL; + + for (subset = client->game->subsets; subset; subset = subset->next) { + const rc_client_achievement_t* achievement = rc_client_subset_get_achievement_info(client, subset, id); + if (achievement != NULL) + return achievement; + } + + return NULL; +} + +int rc_client_achievement_get_image_url(const rc_client_achievement_t* achievement, int state, char buffer[], size_t buffer_size) +{ + const int image_type = (state == RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED) ? + RC_IMAGE_TYPE_ACHIEVEMENT : RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED; + + if (!achievement || !achievement->badge_name[0]) + return rc_client_get_image_url(buffer, buffer_size, image_type, "00000"); + + if (image_type == RC_IMAGE_TYPE_ACHIEVEMENT && achievement->badge_url) { + snprintf(buffer, buffer_size, "%s", achievement->badge_url); + return RC_OK; + } + + if (image_type == RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED && achievement->badge_locked_url) { + snprintf(buffer, buffer_size, "%s", achievement->badge_locked_url); + return RC_OK; + } + + return rc_client_get_image_url(buffer, buffer_size, image_type, achievement->badge_name); +} + +typedef struct rc_client_award_achievement_callback_data_t +{ + uint32_t id; + uint32_t retry_count; + uint8_t hardcore; + const char* game_hash; + rc_clock_t unlock_time; + rc_client_t* client; + rc_client_scheduled_callback_data_t* scheduled_callback_data; +} rc_client_award_achievement_callback_data_t; + +static int rc_client_is_award_achievement_pending(const rc_client_t* client, uint32_t achievement_id) +{ + /* assume lock already held */ + rc_client_scheduled_callback_data_t* scheduled_callback = client->state.scheduled_callbacks; + for (; scheduled_callback; scheduled_callback = scheduled_callback->next) + { + if (scheduled_callback->callback == rc_client_award_achievement_retry) + { + rc_client_award_achievement_callback_data_t* ach_data = + (rc_client_award_achievement_callback_data_t*)scheduled_callback->data; + if (ach_data->id == achievement_id) + return 1; + } + } + + return 0; +} + +static void rc_client_award_achievement_server_call(rc_client_award_achievement_callback_data_t* ach_data); + +static void rc_client_award_achievement_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) +{ + rc_client_award_achievement_callback_data_t* ach_data = + (rc_client_award_achievement_callback_data_t*)callback_data->data; + + (void)client; + (void)now; + + rc_client_award_achievement_server_call(ach_data); +} + +static void rc_client_award_achievement_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_award_achievement_callback_data_t* ach_data = + (rc_client_award_achievement_callback_data_t*)callback_data; + rc_api_award_achievement_response_t award_achievement_response; + + int result = rc_api_process_award_achievement_server_response(&award_achievement_response, server_response); + const char* error_message = rc_client_server_error_message(&result, server_response->http_status_code, &award_achievement_response.response); + + if (error_message) { + if (award_achievement_response.response.error_message && !rc_client_should_retry(server_response)) { + /* actual error from server */ + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Error awarding achievement %u: %s", ach_data->id, error_message); + rc_client_raise_server_error_event(ach_data->client, "award_achievement", ach_data->id, result, award_achievement_response.response.error_message); + } + else if (ach_data->retry_count++ == 0) { + /* first retry is immediate */ + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Error awarding achievement %u: %s, retrying immediately", ach_data->id, error_message); + rc_client_award_achievement_server_call(ach_data); + return; + } + else { + /* double wait time between each attempt until we hit a maximum delay of two minutes */ + /* 1s -> 2s -> 4s -> 8s -> 16s -> 32s -> 64s -> 120s -> 120s -> 120s ...*/ + const uint32_t delay = (ach_data->retry_count > 8) ? 120 : (1 << (ach_data->retry_count - 2)); + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Error awarding achievement %u: %s, retrying in %u seconds", ach_data->id, error_message, delay); + + if (!ach_data->scheduled_callback_data) { + ach_data->scheduled_callback_data = (rc_client_scheduled_callback_data_t*)calloc(1, sizeof(*ach_data->scheduled_callback_data)); + if (!ach_data->scheduled_callback_data) { + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Failed to allocate scheduled callback data for reattempt to unlock achievement %u", ach_data->id); + rc_client_raise_server_error_event(ach_data->client, "award_achievement", ach_data->id, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + return; + } + ach_data->scheduled_callback_data->callback = rc_client_award_achievement_retry; + ach_data->scheduled_callback_data->data = ach_data; + ach_data->scheduled_callback_data->related_id = ach_data->id; + } + + ach_data->scheduled_callback_data->when = + ach_data->client->callbacks.get_time_millisecs(ach_data->client) + delay * 1000; + + rc_client_schedule_callback(ach_data->client, ach_data->scheduled_callback_data); + + rc_client_update_disconnect_state(ach_data->client); + return; + } + } + else { + ach_data->client->user.score = award_achievement_response.new_player_score; + ach_data->client->user.score_softcore = award_achievement_response.new_player_score_softcore; + + if (award_achievement_response.awarded_achievement_id != ach_data->id) { + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Awarded achievement %u instead of %u", award_achievement_response.awarded_achievement_id, error_message); + } + else { + if (award_achievement_response.response.error_message) { + /* previously unlocked achievements are returned as a success with an error message */ + RC_CLIENT_LOG_INFO_FORMATTED(ach_data->client, "Achievement %u: %s", ach_data->id, award_achievement_response.response.error_message); + } + else if (ach_data->retry_count) { + RC_CLIENT_LOG_INFO_FORMATTED(ach_data->client, "Achievement %u awarded after %u attempts, new score: %u", + ach_data->id, ach_data->retry_count + 1, + ach_data->hardcore ? award_achievement_response.new_player_score : award_achievement_response.new_player_score_softcore); + } + else { + RC_CLIENT_LOG_INFO_FORMATTED(ach_data->client, "Achievement %u awarded, new score: %u", + ach_data->id, + ach_data->hardcore ? award_achievement_response.new_player_score : award_achievement_response.new_player_score_softcore); + } + + if (award_achievement_response.achievements_remaining == 0) { + rc_client_subset_info_t* subset; + for (subset = ach_data->client->game->subsets; subset; subset = subset->next) { + if (subset->mastery == RC_CLIENT_MASTERY_STATE_NONE && + rc_client_subset_get_achievement_info(ach_data->client, subset, ach_data->id)) { + if (subset->public_.id == ach_data->client->game->public_.id) { + RC_CLIENT_LOG_INFO_FORMATTED(ach_data->client, "Game %u %s", ach_data->client->game->public_.id, + ach_data->client->state.hardcore ? "mastered" : "completed"); + subset->mastery = RC_CLIENT_MASTERY_STATE_PENDING; + } + else { + RC_CLIENT_LOG_INFO_FORMATTED(ach_data->client, "Subset %u %s", ach_data->client->game->public_.id, + ach_data->client->state.hardcore ? "mastered" : "completed"); + + subset->mastery = RC_CLIENT_MASTERY_STATE_PENDING; + } + } + } + } + } + } + + if (ach_data->retry_count) + rc_client_update_disconnect_state(ach_data->client); + + if (ach_data->scheduled_callback_data) + free(ach_data->scheduled_callback_data); + free(ach_data); +} + +static void rc_client_award_achievement_server_call(rc_client_award_achievement_callback_data_t* ach_data) +{ + rc_api_award_achievement_request_t api_params; + rc_api_request_t request; + int result; + + memset(&api_params, 0, sizeof(api_params)); + api_params.username = ach_data->client->user.username; + api_params.api_token = ach_data->client->user.token; + api_params.achievement_id = ach_data->id; + api_params.hardcore = ach_data->hardcore; + api_params.game_hash = ach_data->game_hash; + + if (ach_data->retry_count) { + const rc_clock_t now = ach_data->client->callbacks.get_time_millisecs(ach_data->client); + api_params.seconds_since_unlock = (uint32_t)((now - ach_data->unlock_time) / 1000); + } + + result = rc_api_init_award_achievement_request_hosted(&request, &api_params, &ach_data->client->state.host); + if (result != RC_OK) { + RC_CLIENT_LOG_ERR_FORMATTED(ach_data->client, "Error constructing unlock request for achievement %u: %s", ach_data->id, rc_error_str(result)); + free(ach_data); + return; + } + + ach_data->client->callbacks.server_call(&request, rc_client_award_achievement_callback, ach_data, ach_data->client); + + rc_api_destroy_request(&request); +} + +static void rc_client_award_achievement(rc_client_t* client, rc_client_achievement_info_t* achievement) +{ + rc_client_award_achievement_callback_data_t* callback_data; + + rc_mutex_lock(&client->state.mutex); + + if (client->state.hardcore) { + achievement->public_.unlock_time = achievement->unlock_time_hardcore = time(NULL); + if (achievement->unlock_time_softcore == 0) + achievement->unlock_time_softcore = achievement->unlock_time_hardcore; + + /* adjust score now - will get accurate score back from server */ + client->user.score += achievement->public_.points; + } + else { + achievement->public_.unlock_time = achievement->unlock_time_softcore = time(NULL); + + /* adjust score now - will get accurate score back from server */ + client->user.score_softcore += achievement->public_.points; + } + + achievement->public_.state = RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED; + achievement->public_.unlocked |= (client->state.hardcore) ? + RC_CLIENT_ACHIEVEMENT_UNLOCKED_BOTH : RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE; + + rc_mutex_unlock(&client->state.mutex); + + if (client->callbacks.can_submit_achievement_unlock && + !client->callbacks.can_submit_achievement_unlock(achievement->public_.id, client)) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Achievement %u unlock blocked by client", achievement->public_.id); + return; + } + + /* can't unlock unofficial achievements on the server */ + if (achievement->public_.category != RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Unlocked unofficial achievement %u: %s", achievement->public_.id, achievement->public_.title); + return; + } + + /* don't actually unlock achievements when spectating */ + if (client->state.spectator_mode != RC_CLIENT_SPECTATOR_MODE_OFF) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Spectated achievement %u: %s", achievement->public_.id, achievement->public_.title); + return; + } + + callback_data = (rc_client_award_achievement_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Failed to allocate callback data for unlocking achievement %u", achievement->public_.id); + rc_client_raise_server_error_event(client, "award_achievement", achievement->public_.id, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + return; + } + callback_data->client = client; + callback_data->id = achievement->public_.id; + callback_data->hardcore = client->state.hardcore; + callback_data->game_hash = client->game->public_.hash; + callback_data->unlock_time = client->callbacks.get_time_millisecs(client); + + if (client->game) /* may be NULL if this gets called while unloading the game (from another thread - events are raised outside the lock) */ + callback_data->game_hash = client->game->public_.hash; + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Awarding achievement %u: %s", achievement->public_.id, achievement->public_.title); + rc_client_award_achievement_server_call(callback_data); +} + +static void rc_client_subset_reset_achievements(rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + + for (; achievement < stop; ++achievement) { + rc_trigger_t* trigger = achievement->trigger; + if (!trigger || achievement->public_.state != RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) + continue; + + if (trigger->state == RC_TRIGGER_STATE_PRIMED) { + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + } + + rc_reset_trigger(trigger); + } +} + +static void rc_client_reset_achievements(rc_client_t* client) +{ + rc_client_subset_info_t* subset; + for (subset = client->game->subsets; subset; subset = subset->next) + rc_client_subset_reset_achievements(subset); +} + +/* ===== Leaderboards ===== */ + +static rc_client_leaderboard_info_t* rc_client_subset_get_leaderboard_info(const rc_client_subset_info_t* subset, uint32_t id) +{ + rc_client_leaderboard_info_t* leaderboard = subset->leaderboards; + rc_client_leaderboard_info_t* stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->public_.id == id) + return leaderboard; + } + + return NULL; +} + +const rc_client_leaderboard_t* rc_client_get_leaderboard_info(const rc_client_t* client, uint32_t id) +{ + rc_client_subset_info_t* subset; + + if (!client) + return NULL; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_leaderboard_info) + return client->state.external_client->get_leaderboard_info(id); +#endif + + if (!client->game) + return NULL; + + for (subset = client->game->subsets; subset; subset = subset->next) { + const rc_client_leaderboard_info_t* leaderboard = rc_client_subset_get_leaderboard_info(subset, id); + if (leaderboard != NULL) + return &leaderboard->public_; + } + + return NULL; +} + +static const char* rc_client_get_leaderboard_bucket_label(uint8_t bucket_type) +{ + switch (bucket_type) { + case RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE: return "Inactive"; + case RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE: return "Active"; + case RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED: return "Unsupported"; + case RC_CLIENT_LEADERBOARD_BUCKET_ALL: return "All"; + default: return "Unknown"; + } +} + +static const char* rc_client_get_subset_leaderboard_bucket_label(uint8_t bucket_type, rc_client_game_info_t* game, rc_client_subset_info_t* subset) +{ + const char** ptr; + const char* label; + char* new_label; + size_t new_label_len; + + switch (bucket_type) { + case RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE: ptr = &subset->inactive_label; break; + case RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED: ptr = &subset->unsupported_label; break; + case RC_CLIENT_LEADERBOARD_BUCKET_ALL: ptr = &subset->all_label; break; + default: return rc_client_get_achievement_bucket_label(bucket_type); + } + + if (*ptr) + return *ptr; + + label = rc_client_get_leaderboard_bucket_label(bucket_type); + new_label_len = strlen(subset->public_.title) + strlen(label) + 4; + new_label = (char*)rc_buffer_alloc(&game->buffer, new_label_len); + snprintf(new_label, new_label_len, "%s - %s", subset->public_.title, label); + + *ptr = new_label; + return new_label; +} + +static uint8_t rc_client_get_leaderboard_bucket(const rc_client_leaderboard_info_t* leaderboard, int grouping) +{ + switch (leaderboard->public_.state) { + case RC_CLIENT_LEADERBOARD_STATE_TRACKING: + return (grouping == RC_CLIENT_LEADERBOARD_LIST_GROUPING_NONE) ? + RC_CLIENT_LEADERBOARD_BUCKET_ALL : RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE; + + case RC_CLIENT_LEADERBOARD_STATE_DISABLED: + return RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED; + + default: + return (grouping == RC_CLIENT_LEADERBOARD_LIST_GROUPING_NONE) ? + RC_CLIENT_LEADERBOARD_BUCKET_ALL : RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE; + } +} + +rc_client_leaderboard_list_t* rc_client_create_leaderboard_list(rc_client_t* client, int grouping) +{ + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* stop; + const rc_client_leaderboard_t** bucket_leaderboards; + const rc_client_leaderboard_t** leaderboard_ptr; + rc_client_leaderboard_bucket_t* bucket_ptr; + rc_client_leaderboard_list_info_t* list; + rc_client_subset_info_t* subset; + const uint32_t list_size = RC_ALIGN(sizeof(*list)); + uint32_t bucket_counts[8]; + uint32_t num_buckets; + uint32_t num_leaderboards; + size_t buckets_size; + uint8_t bucket_type; + uint32_t num_subsets = 0; + uint32_t i, j; + const uint8_t shared_bucket_order[] = { + RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE + }; + const uint8_t subset_bucket_order[] = { + RC_CLIENT_LEADERBOARD_BUCKET_ALL, + RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE, + RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED + }; + + if (!client) + return (rc_client_leaderboard_list_t*)calloc(1, list_size); + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->create_leaderboard_list) + return (rc_client_leaderboard_list_t*)client->state.external_client->create_leaderboard_list(grouping); +#endif + + if (!client->game) + return (rc_client_leaderboard_list_t*)calloc(1, list_size); + + memset(&bucket_counts, 0, sizeof(bucket_counts)); + + rc_mutex_lock(&client->state.mutex); + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + num_subsets++; + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->hidden) + continue; + + leaderboard->bucket = rc_client_get_leaderboard_bucket(leaderboard, grouping); + bucket_counts[leaderboard->bucket]++; + } + } + + num_buckets = 0; + num_leaderboards = 0; + for (i = 0; i < sizeof(bucket_counts) / sizeof(bucket_counts[0]); ++i) { + if (bucket_counts[i]) { + int needs_split = 0; + + num_leaderboards += bucket_counts[i]; + + if (num_subsets > 1) { + for (j = 0; j < sizeof(subset_bucket_order) / sizeof(subset_bucket_order[0]); ++j) { + if (subset_bucket_order[j] == i) { + needs_split = 1; + break; + } + } + } + + if (!needs_split) { + ++num_buckets; + continue; + } + + subset = client->game->subsets; + for (; subset; subset = subset->next) { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->bucket == i) { + ++num_buckets; + break; + } + } + } + } + } + + buckets_size = RC_ALIGN(num_buckets * sizeof(rc_client_leaderboard_bucket_t)); + + list = (rc_client_leaderboard_list_info_t*)malloc(list_size + buckets_size + num_leaderboards * sizeof(rc_client_leaderboard_t*)); + list->public_.buckets = bucket_ptr = (rc_client_leaderboard_bucket_t*)((uint8_t*)list + list_size); + leaderboard_ptr = (const rc_client_leaderboard_t**)((uint8_t*)bucket_ptr + buckets_size); + + if (grouping == RC_CLIENT_LEADERBOARD_LIST_GROUPING_TRACKING) { + for (i = 0; i < sizeof(shared_bucket_order) / sizeof(shared_bucket_order[0]); ++i) { + bucket_type = shared_bucket_order[i]; + if (!bucket_counts[bucket_type]) + continue; + + bucket_leaderboards = leaderboard_ptr; + for (subset = client->game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->bucket == bucket_type && !leaderboard->hidden) + *leaderboard_ptr++ = &leaderboard->public_; + } + } + + if (leaderboard_ptr > bucket_leaderboards) { + bucket_ptr->leaderboards = bucket_leaderboards; + bucket_ptr->num_leaderboards = (uint32_t)(leaderboard_ptr - bucket_leaderboards); + bucket_ptr->subset_id = 0; + bucket_ptr->label = rc_client_get_leaderboard_bucket_label(bucket_type); + bucket_ptr->bucket_type = bucket_type; + ++bucket_ptr; + } + } + } + + for (subset = client->game->subsets; subset; subset = subset->next) { + if (!subset->active) + continue; + + for (i = 0; i < sizeof(subset_bucket_order) / sizeof(subset_bucket_order[0]); ++i) { + bucket_type = subset_bucket_order[i]; + if (!bucket_counts[bucket_type]) + continue; + + bucket_leaderboards = leaderboard_ptr; + + leaderboard = subset->leaderboards; + stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < stop; ++leaderboard) { + if (leaderboard->bucket == bucket_type && !leaderboard->hidden) + *leaderboard_ptr++ = &leaderboard->public_; + } + + if (leaderboard_ptr > bucket_leaderboards) { + bucket_ptr->leaderboards = bucket_leaderboards; + bucket_ptr->num_leaderboards = (uint32_t)(leaderboard_ptr - bucket_leaderboards); + bucket_ptr->subset_id = (num_subsets > 1) ? subset->public_.id : 0; + bucket_ptr->bucket_type = bucket_type; + + if (num_subsets > 1) + bucket_ptr->label = rc_client_get_subset_leaderboard_bucket_label(bucket_type, client->game, subset); + else + bucket_ptr->label = rc_client_get_leaderboard_bucket_label(bucket_type); + + ++bucket_ptr; + } + } + } + + rc_mutex_unlock(&client->state.mutex); + + list->destroy_func = NULL; + list->public_.num_buckets = (uint32_t)(bucket_ptr - list->public_.buckets); + return &list->public_; +} + +void rc_client_destroy_leaderboard_list(rc_client_leaderboard_list_t* list) +{ + rc_client_leaderboard_list_info_t* info = (rc_client_leaderboard_list_info_t*)list; + if (info->destroy_func) + info->destroy_func(info); + else + free(list); +} + +int rc_client_has_leaderboards(rc_client_t* client) +{ + rc_client_subset_info_t* subset; + int result; + + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->has_leaderboards) + return client->state.external_client->has_leaderboards(); +#endif + + if (!client->game) + return 0; + + rc_mutex_lock(&client->state.mutex); + + subset = client->game->subsets; + result = 0; + for (; subset; subset = subset->next) + { + if (!subset->active) + continue; + + if (subset->public_.num_leaderboards > 0) { + result = 1; + break; + } + } + + rc_mutex_unlock(&client->state.mutex); + + return result; +} + +void rc_client_allocate_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard) +{ + rc_client_leaderboard_tracker_info_t* tracker; + rc_client_leaderboard_tracker_info_t* available_tracker = NULL; + + for (tracker = game->leaderboard_trackers; tracker; tracker = tracker->next) { + if (tracker->reference_count == 0) { + if (available_tracker == NULL && tracker->pending_events == RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_NONE) + available_tracker = tracker; + + continue; + } + + if (tracker->value_djb2 != leaderboard->value_djb2 || tracker->format != leaderboard->format) + continue; + + if (tracker->raw_value != leaderboard->value) { + /* if the value comes from tracking hits, we can't assume the trackers started in the + * same frame, so we can't share the tracker */ + if (tracker->value_from_hits) + continue; + + /* value has changed. prepare an update event */ + tracker->raw_value = leaderboard->value; + tracker->pending_events |= RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE; + game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER; + } + + /* attach to the existing tracker */ + ++tracker->reference_count; + tracker->pending_events &= ~RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_HIDE; + leaderboard->tracker = tracker; + leaderboard->public_.tracker_value = tracker->public_.display; + return; + } + + if (!available_tracker) { + rc_client_leaderboard_tracker_info_t** next = &game->leaderboard_trackers; + + available_tracker = (rc_client_leaderboard_tracker_info_t*)rc_buffer_alloc(&game->buffer, sizeof(*available_tracker)); + memset(available_tracker, 0, sizeof(*available_tracker)); + available_tracker->public_.id = 1; + + for (tracker = *next; tracker; next = &tracker->next, tracker = *next) + available_tracker->public_.id++; + + *next = available_tracker; + } + + /* update the claimed tracker */ + available_tracker->reference_count = 1; + available_tracker->value_djb2 = leaderboard->value_djb2; + available_tracker->format = leaderboard->format; + available_tracker->raw_value = leaderboard->value; + available_tracker->pending_events = RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW; + available_tracker->value_from_hits = rc_value_from_hits(&leaderboard->lboard->value); + leaderboard->tracker = available_tracker; + leaderboard->public_.tracker_value = available_tracker->public_.display; + game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER; +} + +void rc_client_release_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard) +{ + rc_client_leaderboard_tracker_info_t* tracker = leaderboard->tracker; + leaderboard->tracker = NULL; + + if (tracker && --tracker->reference_count == 0) { + tracker->pending_events |= RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_HIDE; + game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER; + } +} + +static void rc_client_update_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard) +{ + rc_client_leaderboard_tracker_info_t* tracker = leaderboard->tracker; + if (tracker && tracker->raw_value != leaderboard->value) { + tracker->raw_value = leaderboard->value; + tracker->pending_events |= RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE; + game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER; + } +} + +typedef struct rc_client_submit_leaderboard_entry_callback_data_t +{ + uint32_t id; + int32_t score; + uint32_t retry_count; + const char* game_hash; + rc_clock_t submit_time; + rc_client_t* client; + rc_client_scheduled_callback_data_t* scheduled_callback_data; +} rc_client_submit_leaderboard_entry_callback_data_t; + +static void rc_client_submit_leaderboard_entry_server_call(rc_client_submit_leaderboard_entry_callback_data_t* lboard_data); + +static void rc_client_submit_leaderboard_entry_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) +{ + rc_client_submit_leaderboard_entry_callback_data_t* lboard_data = + (rc_client_submit_leaderboard_entry_callback_data_t*)callback_data->data; + + (void)client; + (void)now; + + rc_client_submit_leaderboard_entry_server_call(lboard_data); +} + +static void rc_client_raise_scoreboard_event(rc_client_submit_leaderboard_entry_callback_data_t* lboard_data, + const rc_api_submit_lboard_entry_response_t* response) +{ + rc_client_leaderboard_scoreboard_t sboard; + rc_client_event_t client_event; + rc_client_subset_info_t* subset; + rc_client_t* client = lboard_data->client; + rc_client_leaderboard_info_t* leaderboard = NULL; + + if (!client || !client->game) + return; + + for (subset = client->game->subsets; subset; subset = subset->next) { + leaderboard = rc_client_subset_get_leaderboard_info(subset, lboard_data->id); + if (leaderboard != NULL) + break; + } + if (leaderboard == NULL) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Trying to raise scoreboard for unknown leaderboard %u", lboard_data->id); + return; + } + + memset(&sboard, 0, sizeof(sboard)); + sboard.leaderboard_id = lboard_data->id; + rc_format_value(sboard.submitted_score, sizeof(sboard.submitted_score), response->submitted_score, leaderboard->format); + rc_format_value(sboard.best_score, sizeof(sboard.best_score), response->best_score, leaderboard->format); + sboard.new_rank = response->new_rank; + sboard.num_entries = response->num_entries; + sboard.num_top_entries = response->num_top_entries; + if (sboard.num_top_entries > 0) { + sboard.top_entries = (rc_client_leaderboard_scoreboard_entry_t*)calloc( + response->num_top_entries, sizeof(rc_client_leaderboard_scoreboard_entry_t)); + if (sboard.top_entries != NULL) { + uint32_t i; + for (i = 0; i < response->num_top_entries; i++) { + sboard.top_entries[i].username = response->top_entries[i].username; + sboard.top_entries[i].rank = response->top_entries[i].rank; + rc_format_value(sboard.top_entries[i].score, sizeof(sboard.top_entries[i].score), response->top_entries[i].score, + leaderboard->format); + } + } + } + + memset(&client_event, 0, sizeof(client_event)); + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD; + client_event.leaderboard = &leaderboard->public_; + client_event.leaderboard_scoreboard = &sboard; + + lboard_data->client->callbacks.event_handler(&client_event, lboard_data->client); + + if (sboard.top_entries != NULL) { + free(sboard.top_entries); + } +} + +static void rc_client_submit_leaderboard_entry_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_submit_leaderboard_entry_callback_data_t* lboard_data = + (rc_client_submit_leaderboard_entry_callback_data_t*)callback_data; + rc_api_submit_lboard_entry_response_t submit_lboard_entry_response; + + int result = rc_api_process_submit_lboard_entry_server_response(&submit_lboard_entry_response, server_response); + const char* error_message = rc_client_server_error_message(&result, server_response->http_status_code, &submit_lboard_entry_response.response); + + if (error_message) { + if (submit_lboard_entry_response.response.error_message && !rc_client_should_retry(server_response)) { + /* actual error from server */ + RC_CLIENT_LOG_ERR_FORMATTED(lboard_data->client, "Error submitting leaderboard entry %u: %s", lboard_data->id, error_message); + rc_client_raise_server_error_event(lboard_data->client, "submit_lboard_entry", lboard_data->id, result, submit_lboard_entry_response.response.error_message); + } + else if (lboard_data->retry_count++ == 0) { + /* first retry is immediate */ + RC_CLIENT_LOG_ERR_FORMATTED(lboard_data->client, "Error submitting leaderboard entry %u: %s, retrying immediately", lboard_data->id, error_message); + rc_client_submit_leaderboard_entry_server_call(lboard_data); + return; + } + else { + /* double wait time between each attempt until we hit a maximum delay of two minutes */ + /* 1s -> 2s -> 4s -> 8s -> 16s -> 32s -> 64s -> 120s -> 120s -> 120s ...*/ + const uint32_t delay = (lboard_data->retry_count > 8) ? 120 : (1 << (lboard_data->retry_count - 2)); + RC_CLIENT_LOG_ERR_FORMATTED(lboard_data->client, "Error submitting leaderboard entry %u: %s, retrying in %u seconds", lboard_data->id, error_message, delay); + + if (!lboard_data->scheduled_callback_data) { + lboard_data->scheduled_callback_data = (rc_client_scheduled_callback_data_t*)calloc(1, sizeof(*lboard_data->scheduled_callback_data)); + if (!lboard_data->scheduled_callback_data) { + RC_CLIENT_LOG_ERR_FORMATTED(lboard_data->client, "Failed to allocate scheduled callback data for reattempt to submit entry for leaderboard %u", lboard_data->id); + rc_client_raise_server_error_event(lboard_data->client, "submit_lboard_entry", lboard_data->id, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + return; + } + lboard_data->scheduled_callback_data->callback = rc_client_submit_leaderboard_entry_retry; + lboard_data->scheduled_callback_data->data = lboard_data; + lboard_data->scheduled_callback_data->related_id = lboard_data->id; + } + + lboard_data->scheduled_callback_data->when = + lboard_data->client->callbacks.get_time_millisecs(lboard_data->client) + delay * 1000; + + rc_client_schedule_callback(lboard_data->client, lboard_data->scheduled_callback_data); + + rc_client_update_disconnect_state(lboard_data->client); + return; + } + } + else { + /* raise event for scoreboard */ + if (lboard_data->retry_count < 2) { + rc_client_raise_scoreboard_event(lboard_data, &submit_lboard_entry_response); + } + + /* not currently doing anything with the response */ + if (lboard_data->retry_count) { + RC_CLIENT_LOG_INFO_FORMATTED(lboard_data->client, "Leaderboard %u submission %d completed after %u attempts", + lboard_data->id, lboard_data->score, lboard_data->retry_count); + } + } + + if (lboard_data->retry_count) + rc_client_update_disconnect_state(lboard_data->client); + + if (lboard_data->scheduled_callback_data) + free(lboard_data->scheduled_callback_data); + free(lboard_data); +} + +static void rc_client_submit_leaderboard_entry_server_call(rc_client_submit_leaderboard_entry_callback_data_t* lboard_data) +{ + rc_api_submit_lboard_entry_request_t api_params; + rc_api_request_t request; + int result; + + memset(&api_params, 0, sizeof(api_params)); + api_params.username = lboard_data->client->user.username; + api_params.api_token = lboard_data->client->user.token; + api_params.leaderboard_id = lboard_data->id; + api_params.score = lboard_data->score; + api_params.game_hash = lboard_data->game_hash; + + if (lboard_data->retry_count) { + const rc_clock_t now = lboard_data->client->callbacks.get_time_millisecs(lboard_data->client); + api_params.seconds_since_completion = (uint32_t)((now - lboard_data->submit_time) / 1000); + } + + result = rc_api_init_submit_lboard_entry_request_hosted(&request, &api_params, &lboard_data->client->state.host); + if (result != RC_OK) { + RC_CLIENT_LOG_ERR_FORMATTED(lboard_data->client, "Error constructing submit leaderboard entry for leaderboard %u: %s", lboard_data->id, rc_error_str(result)); + return; + } + + lboard_data->client->callbacks.server_call(&request, rc_client_submit_leaderboard_entry_callback, lboard_data, lboard_data->client); + + rc_api_destroy_request(&request); +} + +static void rc_client_submit_leaderboard_entry(rc_client_t* client, rc_client_leaderboard_info_t* leaderboard) +{ + rc_client_submit_leaderboard_entry_callback_data_t* callback_data; + + if (!client->state.hardcore) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Leaderboard %u entry submission not allowed in softcore", leaderboard->public_.id); + return; + } + + if (client->callbacks.can_submit_leaderboard_entry && + !client->callbacks.can_submit_leaderboard_entry(leaderboard->public_.id, client)) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Leaderboard %u entry submission blocked by client", leaderboard->public_.id); + return; + } + + /* don't actually submit leaderboard entries when spectating */ + if (client->state.spectator_mode != RC_CLIENT_SPECTATOR_MODE_OFF) { + RC_CLIENT_LOG_INFO_FORMATTED(client, "Spectated %s (%d) for leaderboard %u: %s", + leaderboard->public_.tracker_value, leaderboard->value, leaderboard->public_.id, leaderboard->public_.title); + return; + } + + callback_data = (rc_client_submit_leaderboard_entry_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Failed to allocate callback data for submitting entry for leaderboard %u", leaderboard->public_.id); + rc_client_raise_server_error_event(client, "submit_lboard_entry", leaderboard->public_.id, RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY)); + return; + } + callback_data->client = client; + callback_data->id = leaderboard->public_.id; + callback_data->score = leaderboard->value; + callback_data->game_hash = client->game->public_.hash; + callback_data->submit_time = client->callbacks.get_time_millisecs(client); + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Submitting %s (%d) for leaderboard %u: %s", + leaderboard->public_.tracker_value, leaderboard->value, leaderboard->public_.id, leaderboard->public_.title); + rc_client_submit_leaderboard_entry_server_call(callback_data); +} + +static void rc_client_subset_reset_leaderboards(rc_client_game_info_t* game, rc_client_subset_info_t* subset) +{ + rc_client_leaderboard_info_t* leaderboard = subset->leaderboards; + rc_client_leaderboard_info_t* stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) { + rc_lboard_t* lboard = leaderboard->lboard; + if (!lboard) + continue; + + switch (leaderboard->public_.state) { + case RC_CLIENT_LEADERBOARD_STATE_INACTIVE: + case RC_CLIENT_LEADERBOARD_STATE_DISABLED: + continue; + + case RC_CLIENT_LEADERBOARD_STATE_TRACKING: + rc_client_release_leaderboard_tracker(game, leaderboard); + /* fallthrough */ /* to default */ + default: + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_ACTIVE; + rc_reset_lboard(lboard); + break; + } + } +} + +static void rc_client_reset_leaderboards(rc_client_t* client) +{ + rc_client_subset_info_t* subset; + for (subset = client->game->subsets; subset; subset = subset->next) + rc_client_subset_reset_leaderboards(client->game, subset); +} + +typedef struct rc_client_fetch_leaderboard_entries_callback_data_t { + rc_client_t* client; + rc_client_fetch_leaderboard_entries_callback_t callback; + void* callback_userdata; + uint32_t leaderboard_id; + rc_client_async_handle_t async_handle; +} rc_client_fetch_leaderboard_entries_callback_data_t; + +static void rc_client_fetch_leaderboard_entries_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_fetch_leaderboard_entries_callback_data_t* lbinfo_callback_data = (rc_client_fetch_leaderboard_entries_callback_data_t*)callback_data; + rc_client_t* client = lbinfo_callback_data->client; + rc_api_fetch_leaderboard_info_response_t lbinfo_response; + const char* error_message; + int result; + + result = rc_client_end_async(client, &lbinfo_callback_data->async_handle); + if (result) { + if (result != RC_CLIENT_ASYNC_DESTROYED) { + RC_CLIENT_LOG_VERBOSE(client, "Fetch leaderbord entries aborted"); + } + free(lbinfo_callback_data); + return; + } + + result = rc_api_process_fetch_leaderboard_info_server_response(&lbinfo_response, server_response); + error_message = rc_client_server_error_message(&result, server_response->http_status_code, &lbinfo_response.response); + if (error_message) { + RC_CLIENT_LOG_ERR_FORMATTED(client, "Fetch leaderboard %u info failed: %s", lbinfo_callback_data->leaderboard_id, error_message); + lbinfo_callback_data->callback(result, error_message, NULL, client, lbinfo_callback_data->callback_userdata); + } + else { + rc_client_leaderboard_entry_list_info_t* info; + const size_t list_size = sizeof(*info) + sizeof(rc_client_leaderboard_entry_t) * lbinfo_response.num_entries; + size_t needed_size = list_size; + uint32_t i; + + for (i = 0; i < lbinfo_response.num_entries; i++) + needed_size += strlen(lbinfo_response.entries[i].username) + 1; + + info = (rc_client_leaderboard_entry_list_info_t*)malloc(needed_size); + if (!info) { + lbinfo_callback_data->callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, lbinfo_callback_data->callback_userdata); + } + else { + rc_client_leaderboard_entry_list_t* list = &info->public_; + rc_client_leaderboard_entry_t* entry = list->entries = (rc_client_leaderboard_entry_t*)((uint8_t*)info + sizeof(*info)); + char* user = (char*)((uint8_t*)list + list_size); + const rc_api_lboard_info_entry_t* lbentry = lbinfo_response.entries; + const rc_api_lboard_info_entry_t* stop = lbentry + lbinfo_response.num_entries; + const size_t logged_in_user_len = strlen(client->user.display_name) + 1; + info->destroy_func = NULL; + list->user_index = -1; + + for (; lbentry < stop; ++lbentry, ++entry) { + const size_t len = strlen(lbentry->username) + 1; + entry->user = user; + memcpy(user, lbentry->username, len); + user += len; + + if (len == logged_in_user_len && memcmp(entry->user, client->user.display_name, len) == 0) + list->user_index = (int)(entry - list->entries); + + entry->index = lbentry->index; + entry->rank = lbentry->rank; + entry->submitted = lbentry->submitted; + + rc_format_value(entry->display, sizeof(entry->display), lbentry->score, lbinfo_response.format); + } + + list->num_entries = lbinfo_response.num_entries; + list->total_entries = lbinfo_response.total_entries; + + lbinfo_callback_data->callback(RC_OK, NULL, list, client, lbinfo_callback_data->callback_userdata); + } + } + + rc_api_destroy_fetch_leaderboard_info_response(&lbinfo_response); + free(lbinfo_callback_data); +} + +static rc_client_async_handle_t* rc_client_begin_fetch_leaderboard_info(rc_client_t* client, + const rc_api_fetch_leaderboard_info_request_t* lbinfo_request, + rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata) +{ + rc_client_fetch_leaderboard_entries_callback_data_t* callback_data; + rc_client_async_handle_t* async_handle; + rc_api_request_t request; + int result; + const char* error_message; + + result = rc_api_init_fetch_leaderboard_info_request_hosted(&request, lbinfo_request, &client->state.host); + + if (result != RC_OK) { + error_message = rc_error_str(result); + callback(result, error_message, NULL, client, callback_userdata); + return NULL; + } + + callback_data = (rc_client_fetch_leaderboard_entries_callback_data_t*)calloc(1, sizeof(*callback_data)); + if (!callback_data) { + callback(RC_OUT_OF_MEMORY, rc_error_str(RC_OUT_OF_MEMORY), NULL, client, callback_userdata); + return NULL; + } + + callback_data->client = client; + callback_data->callback = callback; + callback_data->callback_userdata = callback_userdata; + callback_data->leaderboard_id = lbinfo_request->leaderboard_id; + + async_handle = &callback_data->async_handle; + rc_client_begin_async(client, async_handle); + client->callbacks.server_call(&request, rc_client_fetch_leaderboard_entries_callback, callback_data, client); + rc_api_destroy_request(&request); + + return rc_client_async_handle_valid(client, async_handle) ? async_handle : NULL; +} + +rc_client_async_handle_t* rc_client_begin_fetch_leaderboard_entries(rc_client_t* client, uint32_t leaderboard_id, + uint32_t first_entry, uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata) +{ + rc_api_fetch_leaderboard_info_request_t lbinfo_request; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_fetch_leaderboard_entries) + return client->state.external_client->begin_fetch_leaderboard_entries(client, leaderboard_id, first_entry, count, callback, callback_userdata); +#endif + + memset(&lbinfo_request, 0, sizeof(lbinfo_request)); + lbinfo_request.leaderboard_id = leaderboard_id; + lbinfo_request.first_entry = first_entry; + lbinfo_request.count = count; + + return rc_client_begin_fetch_leaderboard_info(client, &lbinfo_request, callback, callback_userdata); +} + +rc_client_async_handle_t* rc_client_begin_fetch_leaderboard_entries_around_user(rc_client_t* client, uint32_t leaderboard_id, + uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata) +{ + rc_api_fetch_leaderboard_info_request_t lbinfo_request; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->begin_fetch_leaderboard_entries_around_user) + return client->state.external_client->begin_fetch_leaderboard_entries_around_user(client, leaderboard_id, count, callback, callback_userdata); +#endif + + memset(&lbinfo_request, 0, sizeof(lbinfo_request)); + lbinfo_request.leaderboard_id = leaderboard_id; + lbinfo_request.username = client->user.username; + lbinfo_request.count = count; + + if (!lbinfo_request.username) { + callback(RC_LOGIN_REQUIRED, rc_error_str(RC_LOGIN_REQUIRED), NULL, client, callback_userdata); + return NULL; + } + + return rc_client_begin_fetch_leaderboard_info(client, &lbinfo_request, callback, callback_userdata); +} + +void rc_client_destroy_leaderboard_entry_list(rc_client_leaderboard_entry_list_t* list) +{ + rc_client_leaderboard_entry_list_info_t* info = (rc_client_leaderboard_entry_list_info_t*)list; + if (info->destroy_func) + info->destroy_func(info); + else + free(list); +} + +int rc_client_leaderboard_entry_get_user_image_url(const rc_client_leaderboard_entry_t* entry, char buffer[], size_t buffer_size) +{ + if (!entry) + return RC_INVALID_STATE; + + return rc_client_get_image_url(buffer, buffer_size, RC_IMAGE_TYPE_USER, entry->user); +} + +/* ===== Rich Presence ===== */ + +static void rc_client_ping_callback(const rc_api_server_response_t* server_response, void* callback_data) +{ + rc_client_t* client = (rc_client_t*)callback_data; + rc_api_ping_response_t response; + + int result = rc_api_process_ping_server_response(&response, server_response); + const char* error_message = rc_client_server_error_message(&result, server_response->http_status_code, &response.response); + if (error_message) { + RC_CLIENT_LOG_WARN_FORMATTED(client, "Ping response error: %s", error_message); + } + + rc_api_destroy_ping_response(&response); +} + +static void rc_client_ping(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) +{ + rc_api_ping_request_t api_params; + rc_api_request_t request; + char buffer[256]; + int result; + + /* if no frames have been processed since the last ping, the emulator is idle. let the + * server session expire. it will be resumed/restarted once frames start getting + * processed again. */ + if (client->state.frames_processed != client->state.frames_at_last_ping) { + client->state.frames_at_last_ping = client->state.frames_processed; + + if (!client->callbacks.rich_presence_override || + !client->callbacks.rich_presence_override(client, buffer, sizeof(buffer))) { + rc_mutex_lock(&client->state.mutex); + + rc_runtime_get_richpresence(&client->game->runtime, buffer, sizeof(buffer), + client->state.legacy_peek, client, NULL); + + rc_mutex_unlock(&client->state.mutex); + } + + memset(&api_params, 0, sizeof(api_params)); + api_params.username = client->user.username; + api_params.api_token = client->user.token; + api_params.game_id = client->game->public_.id; + api_params.rich_presence = buffer; + api_params.game_hash = client->game->public_.hash; + api_params.hardcore = client->state.hardcore; + + result = rc_api_init_ping_request_hosted(&request, &api_params, &client->state.host); + if (result != RC_OK) { + RC_CLIENT_LOG_WARN_FORMATTED(client, "Error generating ping request: %s", rc_error_str(result)); + } + else { + client->callbacks.server_call(&request, rc_client_ping_callback, client, client); + } + } + + callback_data->when = now + 120 * 1000; + rc_client_schedule_callback(client, callback_data); +} + +int rc_client_has_rich_presence(rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->has_rich_presence) + return client->state.external_client->has_rich_presence(); +#endif + + if (!client->game || !client->game->runtime.richpresence || !client->game->runtime.richpresence->richpresence) + return 0; + + return 1; +} + +size_t rc_client_get_rich_presence_message(rc_client_t* client, char buffer[], size_t buffer_size) +{ + int result; + + if (!client || !buffer) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_rich_presence_message) + return client->state.external_client->get_rich_presence_message(buffer, buffer_size); +#endif + + if (!client->game) + return 0; + + rc_mutex_lock(&client->state.mutex); + + result = rc_runtime_get_richpresence(&client->game->runtime, buffer, (unsigned)buffer_size, + client->state.legacy_peek, client, NULL); + + rc_mutex_unlock(&client->state.mutex); + + if (result == 0) { + result = snprintf(buffer, buffer_size, "Playing %s", client->game->public_.title); + /* snprintf will return the amount of space needed, we want to return the number of chars written */ + if ((size_t)result >= buffer_size) + return (buffer_size - 1); + } + + return result; +} + +/* ===== Processing ===== */ + +void rc_client_set_event_handler(rc_client_t* client, rc_client_event_handler_t handler) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_event_handler) + client->state.external_client->set_event_handler(client, handler); +#endif + + client->callbacks.event_handler = handler; +} + +void rc_client_set_read_memory_function(rc_client_t* client, rc_client_read_memory_func_t handler) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_read_memory) + client->state.external_client->set_read_memory(client, handler); +#endif + + client->callbacks.read_memory = handler; +} + +void rc_client_set_allow_background_memory_reads(rc_client_t* client, int allowed) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_allow_background_memory_reads) + client->state.external_client->set_allow_background_memory_reads(allowed); +#endif + + client->state.allow_background_memory_reads = allowed; +} + +static void rc_client_invalidate_processing_memref(rc_client_t* client) +{ + /* if processing_memref is not set, this occurred following a pointer chain. ignore it. */ + if (!client->state.processing_memref) + return; + + client->state.processing_memref->value.type = RC_VALUE_TYPE_NONE; + + rc_client_invalidate_memref_achievements(client->game, client, client->state.processing_memref); + rc_client_invalidate_memref_leaderboards(client->game, client, client->state.processing_memref); + + client->state.processing_memref = NULL; +} + +static uint32_t rc_client_peek_le(uint32_t address, uint32_t num_bytes, void* ud) +{ + rc_client_t* client = (rc_client_t*)ud; + uint32_t value = 0; + uint32_t num_read = 0; + + /* if we know the address is out of range, and it's part of a pointer chain + * (processing_memref is null), don't bother processing it. */ + if (address > client->game->max_valid_address && !client->state.processing_memref) + return 0; + + if (num_bytes <= sizeof(value)) { + num_read = client->callbacks.read_memory(address, (uint8_t*)&value, num_bytes, client); + if (num_read == num_bytes) + return value; + } + + if (num_read < num_bytes) + rc_client_invalidate_processing_memref(client); + + return 0; +} + +static uint32_t rc_client_peek(uint32_t address, uint32_t num_bytes, void* ud) +{ + rc_client_t* client = (rc_client_t*)ud; + uint8_t buffer[4]; + uint32_t num_read = 0; + + /* if we know the address is out of range, and it's part of a pointer chain + * (processing_memref is null), don't bother processing it. */ + if (address > client->game->max_valid_address && !client->state.processing_memref) + return 0; + + switch (num_bytes) { + case 1: + num_read = client->callbacks.read_memory(address, buffer, 1, client); + if (num_read == 1) + return buffer[0]; + break; + case 2: + num_read = client->callbacks.read_memory(address, buffer, 2, client); + if (num_read == 2) + return buffer[0] | (buffer[1] << 8); + break; + case 3: + num_read = client->callbacks.read_memory(address, buffer, 3, client); + if (num_read == 3) + return buffer[0] | (buffer[1] << 8) | (buffer[2] << 16); + break; + case 4: + num_read = client->callbacks.read_memory(address, buffer, 4, client); + if (num_read == 4) + return buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24); + break; + default: + break; + } + + if (num_read < num_bytes) + rc_client_invalidate_processing_memref(client); + + return 0; +} + +void rc_client_set_legacy_peek(rc_client_t* client, int method) +{ + if (method == RC_CLIENT_LEGACY_PEEK_AUTO) { + union { + uint32_t whole; + uint8_t parts[4]; + } u; + u.whole = 1; + method = (u.parts[0] == 1) ? + RC_CLIENT_LEGACY_PEEK_LITTLE_ENDIAN_READS : RC_CLIENT_LEGACY_PEEK_CONSTRUCTED; + } + + client->state.legacy_peek = (method == RC_CLIENT_LEGACY_PEEK_LITTLE_ENDIAN_READS) ? + rc_client_peek_le : rc_client_peek; +} + +int rc_client_is_processing_required(rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->is_processing_required) + return client->state.external_client->is_processing_required(); +#endif + + if (!client->game) + return 0; + + if (client->game->runtime.trigger_count || client->game->runtime.lboard_count) + return 1; + + return (client->game->runtime.richpresence && client->game->runtime.richpresence->richpresence); +} + +static void rc_client_update_memref_values(rc_client_t* client) { + rc_memrefs_t* memrefs = client->game->runtime.memrefs; + rc_memref_list_t* memref_list; + rc_modified_memref_list_t* modified_memref_list; + int invalidated_memref = 0; + + memref_list = &memrefs->memrefs; + do { + rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_stop = memref + memref_list->count; + uint32_t value; + + for (; memref < memref_stop; ++memref) { + if (memref->value.type == RC_VALUE_TYPE_NONE) + continue; + + /* if processing_memref is set, and the memory read fails, all dependent achievements will be disabled */ + client->state.processing_memref = memref; + + value = rc_peek_value(memref->address, memref->value.size, client->state.legacy_peek, client); + + if (client->state.processing_memref) { + rc_update_memref_value(&memref->value, value); + } + else { + /* if the peek function cleared the processing_memref, the memref was invalidated */ + invalidated_memref = 1; + } + } + + memref_list = memref_list->next; + } while (memref_list); + + client->state.processing_memref = NULL; + + modified_memref_list = &memrefs->modified_memrefs; + if (modified_memref_list->count) { + do { + rc_modified_memref_t* modified_memref = modified_memref_list->items; + const rc_modified_memref_t* modified_memref_stop = modified_memref + modified_memref_list->count; + + for (; modified_memref < modified_memref_stop; ++modified_memref) + rc_update_memref_value(&modified_memref->memref.value, rc_get_modified_memref_value(modified_memref, client->state.legacy_peek, client)); + + modified_memref_list = modified_memref_list->next; + } while (modified_memref_list); + } + + if (client->game->runtime.richpresence && client->game->runtime.richpresence->richpresence) + rc_update_values(client->game->runtime.richpresence->richpresence->values, client->state.legacy_peek, client); + + if (invalidated_memref) + rc_client_update_active_achievements(client->game); +} + +static void rc_client_do_frame_process_achievements(rc_client_t* client, rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + + for (; achievement < stop; ++achievement) { + rc_trigger_t* trigger = achievement->trigger; + int old_state, new_state; + uint32_t old_measured_value; + + if (!trigger || achievement->public_.state != RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) + continue; + + old_measured_value = trigger->measured_value; + old_state = trigger->state; + new_state = rc_evaluate_trigger(trigger, client->state.legacy_peek, client, NULL); + + /* trigger->state doesn't actually change to RESET - RESET just serves as a notification. + * we don't care about that particular notification, so look at the actual state. */ + if (new_state == RC_TRIGGER_STATE_RESET) + new_state = trigger->state; + + /* if the measured value changed and the achievement hasn't triggered, show a progress indicator */ + if (trigger->measured_value != old_measured_value && old_measured_value != RC_MEASURED_UNKNOWN && + trigger->measured_value <= trigger->measured_target && + rc_trigger_state_active(new_state) && new_state != RC_TRIGGER_STATE_WAITING) { + + /* only show a popup for the achievement closest to triggering */ + float progress = (float)trigger->measured_value / (float)trigger->measured_target; + + if (trigger->measured_as_percent) { + /* if reporting the measured value as a percentage, only show the popup if the percentage changes */ + const uint32_t old_percent = (uint32_t)(((unsigned long long)old_measured_value * 100) / trigger->measured_target); + const uint32_t new_percent = (uint32_t)(((unsigned long long)trigger->measured_value * 100) / trigger->measured_target); + if (old_percent == new_percent) + progress = -1.0; + } + + if (progress > client->game->progress_tracker.progress) { + client->game->progress_tracker.progress = progress; + client->game->progress_tracker.achievement = achievement; + client->game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_UPDATE; + } + } + + /* if the state hasn't changed, there won't be any events raised */ + if (new_state == old_state) + continue; + + /* raise a CHALLENGE_INDICATOR_HIDE event when changing from PRIMED to anything else */ + if (old_state == RC_TRIGGER_STATE_PRIMED) + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE; + + /* raise events for each of the possible new states */ + if (new_state == RC_TRIGGER_STATE_TRIGGERED) + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_TRIGGERED; + else if (new_state == RC_TRIGGER_STATE_PRIMED) + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_SHOW; + + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + } +} + +static void rc_client_hide_progress_tracker(rc_client_t* client, rc_client_game_info_t* game) +{ + /* ASSERT: this should only be called if the mutex is held */ + + if (game->progress_tracker.hide_callback && + game->progress_tracker.hide_callback->when && + game->progress_tracker.action == RC_CLIENT_PROGRESS_TRACKER_ACTION_NONE) { + rc_client_reschedule_callback(client, game->progress_tracker.hide_callback, 0); + game->progress_tracker.action = RC_CLIENT_PROGRESS_TRACKER_ACTION_HIDE; + game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER; + } +} + +static void rc_client_progress_tracker_timer_elapsed(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) +{ + rc_client_event_t client_event; + memset(&client_event, 0, sizeof(client_event)); + + (void)callback_data; + (void)now; + + rc_mutex_lock(&client->state.mutex); + if (client->game->progress_tracker.action == RC_CLIENT_PROGRESS_TRACKER_ACTION_NONE) { + client->game->progress_tracker.hide_callback->when = 0; + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE; + } + rc_mutex_unlock(&client->state.mutex); + + if (client_event.type) + client->callbacks.event_handler(&client_event, client); +} + +static void rc_client_do_frame_update_progress_tracker(rc_client_t* client, rc_client_game_info_t* game) +{ + /* ASSERT: this should only be called if the mutex is held */ + + if (!game->progress_tracker.hide_callback) { + game->progress_tracker.hide_callback = (rc_client_scheduled_callback_data_t*) + rc_buffer_alloc(&game->buffer, sizeof(rc_client_scheduled_callback_data_t)); + memset(game->progress_tracker.hide_callback, 0, sizeof(rc_client_scheduled_callback_data_t)); + game->progress_tracker.hide_callback->callback = rc_client_progress_tracker_timer_elapsed; + } + + if (game->progress_tracker.hide_callback->when == 0) + game->progress_tracker.action = RC_CLIENT_PROGRESS_TRACKER_ACTION_SHOW; + else + game->progress_tracker.action = RC_CLIENT_PROGRESS_TRACKER_ACTION_UPDATE; + + rc_client_reschedule_callback(client, game->progress_tracker.hide_callback, + client->callbacks.get_time_millisecs(client) + 2 * 1000); +} + +static void rc_client_raise_progress_tracker_events(rc_client_t* client, rc_client_game_info_t* game) +{ + rc_client_event_t client_event; + + memset(&client_event, 0, sizeof(client_event)); + + switch (game->progress_tracker.action) { + case RC_CLIENT_PROGRESS_TRACKER_ACTION_SHOW: + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_SHOW; + break; + case RC_CLIENT_PROGRESS_TRACKER_ACTION_HIDE: + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE; + break; + default: + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_UPDATE; + break; + } + game->progress_tracker.action = RC_CLIENT_PROGRESS_TRACKER_ACTION_NONE; + + client_event.achievement = &game->progress_tracker.achievement->public_; + client->callbacks.event_handler(&client_event, client); +} + +static void rc_client_raise_achievement_events(rc_client_t* client, rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement = subset->achievements; + rc_client_achievement_info_t* stop = achievement + subset->public_.num_achievements; + rc_client_event_t client_event; + time_t recent_unlock_time = 0; + + memset(&client_event, 0, sizeof(client_event)); + + for (; achievement < stop; ++achievement) { + if (achievement->pending_events == RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_NONE) + continue; + + /* kick off award achievement request first */ + if (achievement->pending_events & RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_TRIGGERED) { + rc_client_award_achievement(client, achievement); + client->game->pending_events |= RC_CLIENT_GAME_PENDING_EVENT_UPDATE_ACTIVE_ACHIEVEMENTS; + } + + /* update display state */ + if (recent_unlock_time == 0) + recent_unlock_time = time(NULL) - RC_CLIENT_RECENT_UNLOCK_DELAY_SECONDS; + rc_client_update_achievement_display_information(client, achievement, recent_unlock_time); + + /* raise events */ + client_event.achievement = &achievement->public_; + + if (achievement->pending_events & RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE) { + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_HIDE; + client->callbacks.event_handler(&client_event, client); + } + else if (achievement->pending_events & RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_SHOW) { + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_SHOW; + client->callbacks.event_handler(&client_event, client); + } + + if (achievement->pending_events & RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_TRIGGERED) { + client_event.type = RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED; + client->callbacks.event_handler(&client_event, client); + } + + /* clear pending flags */ + achievement->pending_events = RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_NONE; + } +} + +static void rc_client_raise_mastery_event(rc_client_t* client, rc_client_subset_info_t* subset) +{ + rc_client_event_t client_event; + + memset(&client_event, 0, sizeof(client_event)); + client_event.subset = &subset->public_; + + if (subset == client->game->subsets) + client_event.type = RC_CLIENT_EVENT_GAME_COMPLETED; + else + client_event.type = RC_CLIENT_EVENT_SUBSET_COMPLETED; + + subset->mastery = RC_CLIENT_MASTERY_STATE_SHOWN; + + client->callbacks.event_handler(&client_event, client); +} + +static void rc_client_do_frame_process_leaderboards(rc_client_t* client, rc_client_subset_info_t* subset) +{ + rc_client_leaderboard_info_t* leaderboard = subset->leaderboards; + rc_client_leaderboard_info_t* stop = leaderboard + subset->public_.num_leaderboards; + + for (; leaderboard < stop; ++leaderboard) { + rc_lboard_t* lboard = leaderboard->lboard; + int old_state, new_state; + + switch (leaderboard->public_.state) { + case RC_CLIENT_LEADERBOARD_STATE_INACTIVE: + case RC_CLIENT_LEADERBOARD_STATE_DISABLED: + continue; + + default: + if (!lboard) + continue; + + break; + } + + old_state = lboard->state; + new_state = rc_evaluate_lboard(lboard, &leaderboard->value, client->state.legacy_peek, client, NULL); + + switch (new_state) { + case RC_LBOARD_STATE_STARTED: /* leaderboard is running */ + if (old_state != RC_LBOARD_STATE_STARTED) { + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_TRACKING; + leaderboard->pending_events |= RC_CLIENT_LEADERBOARD_PENDING_EVENT_STARTED; + rc_client_allocate_leaderboard_tracker(client->game, leaderboard); + } + else { + rc_client_update_leaderboard_tracker(client->game, leaderboard); + } + break; + + case RC_LBOARD_STATE_CANCELED: + if (old_state != RC_LBOARD_STATE_CANCELED) { + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_ACTIVE; + leaderboard->pending_events |= RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED; + rc_client_release_leaderboard_tracker(client->game, leaderboard); + } + break; + + case RC_LBOARD_STATE_TRIGGERED: + if (old_state != RC_RUNTIME_EVENT_LBOARD_TRIGGERED) { + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_ACTIVE; + leaderboard->pending_events |= RC_CLIENT_LEADERBOARD_PENDING_EVENT_SUBMITTED; + + if (old_state != RC_LBOARD_STATE_STARTED) + rc_client_allocate_leaderboard_tracker(client->game, leaderboard); + else + rc_client_update_leaderboard_tracker(client->game, leaderboard); + + rc_client_release_leaderboard_tracker(client->game, leaderboard); + } + break; + } + + if (leaderboard->pending_events) + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_LEADERBOARD; + } +} + +static void rc_client_raise_leaderboard_tracker_events(rc_client_t* client, rc_client_game_info_t* game) +{ + rc_client_leaderboard_tracker_info_t* tracker = game->leaderboard_trackers; + rc_client_event_t client_event; + + memset(&client_event, 0, sizeof(client_event)); + + tracker = game->leaderboard_trackers; + for (; tracker; tracker = tracker->next) { + if (tracker->pending_events == RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_NONE) + continue; + + client_event.leaderboard_tracker = &tracker->public_; + + /* update display text for new trackers or updated trackers */ + if (tracker->pending_events & (RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW | RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE)) + rc_format_value(tracker->public_.display, sizeof(tracker->public_.display), tracker->raw_value, tracker->format); + + if (tracker->pending_events & RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_HIDE) { + if (tracker->pending_events & RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW) { + /* request to show and hide in the same frame - ignore the event */ + } + else { + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE; + client->callbacks.event_handler(&client_event, client); + } + } + else if (tracker->pending_events & RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW) { + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW; + client->callbacks.event_handler(&client_event, client); + } + else if (tracker->pending_events & RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE) { + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE; + client->callbacks.event_handler(&client_event, client); + } + + tracker->pending_events = RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_NONE; + } +} + +static void rc_client_raise_leaderboard_events(rc_client_t* client, rc_client_subset_info_t* subset) +{ + rc_client_leaderboard_info_t* leaderboard = subset->leaderboards; + rc_client_leaderboard_info_t* leaderboard_stop = leaderboard + subset->public_.num_leaderboards; + rc_client_event_t client_event; + + memset(&client_event, 0, sizeof(client_event)); + + for (; leaderboard < leaderboard_stop; ++leaderboard) { + if (leaderboard->pending_events == RC_CLIENT_LEADERBOARD_PENDING_EVENT_NONE) + continue; + + client_event.leaderboard = &leaderboard->public_; + + if (leaderboard->pending_events & RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED) { + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Leaderboard %u canceled: %s", leaderboard->public_.id, leaderboard->public_.title); + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_FAILED; + client->callbacks.event_handler(&client_event, client); + } + else if (leaderboard->pending_events & RC_CLIENT_LEADERBOARD_PENDING_EVENT_SUBMITTED) { + /* kick off submission request before raising event */ + rc_client_submit_leaderboard_entry(client, leaderboard); + + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED; + client->callbacks.event_handler(&client_event, client); + } + else if (leaderboard->pending_events & RC_CLIENT_LEADERBOARD_PENDING_EVENT_STARTED) { + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Leaderboard %u started: %s", leaderboard->public_.id, leaderboard->public_.title); + client_event.type = RC_CLIENT_EVENT_LEADERBOARD_STARTED; + client->callbacks.event_handler(&client_event, client); + } + + leaderboard->pending_events = RC_CLIENT_LEADERBOARD_PENDING_EVENT_NONE; + } +} + +static void rc_client_reset_pending_events(rc_client_t* client) +{ + rc_client_subset_info_t* subset; + + client->game->pending_events = RC_CLIENT_GAME_PENDING_EVENT_NONE; + + for (subset = client->game->subsets; subset; subset = subset->next) + subset->pending_events = RC_CLIENT_SUBSET_PENDING_EVENT_NONE; +} + +static void rc_client_subset_raise_pending_events(rc_client_t* client, rc_client_subset_info_t* subset) +{ + /* raise any pending achievement events */ + if (subset->pending_events & RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT) + rc_client_raise_achievement_events(client, subset); + + /* raise any pending leaderboard events */ + if (subset->pending_events & RC_CLIENT_SUBSET_PENDING_EVENT_LEADERBOARD) + rc_client_raise_leaderboard_events(client, subset); + + /* raise mastery event if pending */ + if (subset->mastery == RC_CLIENT_MASTERY_STATE_PENDING) + rc_client_raise_mastery_event(client, subset); +} + +static void rc_client_raise_pending_events(rc_client_t* client, rc_client_game_info_t* game) +{ + rc_client_subset_info_t* subset; + + /* raise tracker events before leaderboard events so formatted values are updated for leaderboard events */ + if (game->pending_events & RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER) + rc_client_raise_leaderboard_tracker_events(client, game); + + for (subset = game->subsets; subset; subset = subset->next) + rc_client_subset_raise_pending_events(client, subset); + + /* raise progress tracker events after achievement events so formatted values are updated for tracker event */ + if (game->pending_events & RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER) + rc_client_raise_progress_tracker_events(client, game); + + /* if any achievements were unlocked, resync the active achievements list */ + if (game->pending_events & RC_CLIENT_GAME_PENDING_EVENT_UPDATE_ACTIVE_ACHIEVEMENTS) { + rc_mutex_lock(&client->state.mutex); + rc_client_update_active_achievements(game); + rc_mutex_unlock(&client->state.mutex); + } + + game->pending_events = RC_CLIENT_GAME_PENDING_EVENT_NONE; +} + +void rc_client_do_frame(rc_client_t* client) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->do_frame) { + client->state.external_client->do_frame(); + return; + } +#endif + + if (client->game && !client->game->waiting_for_reset) { + rc_runtime_richpresence_t* richpresence; + rc_client_subset_info_t* subset; + + rc_mutex_lock(&client->state.mutex); + + rc_client_reset_pending_events(client); + + rc_client_update_memref_values(client); + + client->game->progress_tracker.progress = 0.0; + for (subset = client->game->subsets; subset; subset = subset->next) { + if (subset->active) + rc_client_do_frame_process_achievements(client, subset); + } + if (client->game->pending_events & RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER) + rc_client_do_frame_update_progress_tracker(client, client->game); + + if (client->state.hardcore || client->state.allow_leaderboards_in_softcore) { + for (subset = client->game->subsets; subset; subset = subset->next) { + if (subset->active) + rc_client_do_frame_process_leaderboards(client, subset); + } + } + + richpresence = client->game->runtime.richpresence; + if (richpresence && richpresence->richpresence) + rc_update_richpresence_internal(richpresence->richpresence, client->state.legacy_peek, client); + + rc_mutex_unlock(&client->state.mutex); + + rc_client_raise_pending_events(client, client->game); + + ++client->state.frames_processed; + } + + /* we've processed a frame. if there's a pause delay in effect, process it */ + if (client->state.unpaused_frame_decay > 0) { + client->state.unpaused_frame_decay--; + + if (client->state.unpaused_frame_decay == 0 && + client->state.required_unpaused_frames > RC_MINIMUM_UNPAUSED_FRAMES) { + /* the full decay has elapsed and a penalty still exists. + * lower the penalty and reset the decay counter */ + client->state.required_unpaused_frames >>= 1; + + if (client->state.required_unpaused_frames <= RC_MINIMUM_UNPAUSED_FRAMES) + client->state.required_unpaused_frames = RC_MINIMUM_UNPAUSED_FRAMES; + + client->state.unpaused_frame_decay = + client->state.required_unpaused_frames * (RC_PAUSE_DECAY_MULTIPLIER - 1) - 1; + } + } + + rc_client_idle(client); +} + +void rc_client_idle(rc_client_t* client) +{ + rc_client_scheduled_callback_data_t* scheduled_callback; + + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->idle) { + client->state.external_client->idle(); + return; + } +#endif + + scheduled_callback = client->state.scheduled_callbacks; + if (scheduled_callback) { + const rc_clock_t now = client->callbacks.get_time_millisecs(client); + + do { + rc_mutex_lock(&client->state.mutex); + scheduled_callback = client->state.scheduled_callbacks; + if (scheduled_callback) { + if (scheduled_callback->when > now) { + /* not time for next callback yet, ignore it */ + scheduled_callback = NULL; + } + else { + /* remove the callback from the queue while we process it. callback can requeue if desired */ + client->state.scheduled_callbacks = scheduled_callback->next; + scheduled_callback->next = NULL; + } + } + rc_mutex_unlock(&client->state.mutex); + + if (!scheduled_callback) + break; + + scheduled_callback->callback(scheduled_callback, client, now); + } while (1); + } + + if (client->state.disconnect & ~RC_CLIENT_DISCONNECT_VISIBLE) + rc_client_raise_disconnect_events(client); +} + +void rc_client_schedule_callback(rc_client_t* client, rc_client_scheduled_callback_data_t* scheduled_callback) +{ + rc_client_scheduled_callback_data_t** last; + rc_client_scheduled_callback_data_t* next; + + rc_mutex_lock(&client->state.mutex); + + last = &client->state.scheduled_callbacks; + do { + next = *last; + if (!next || scheduled_callback->when < next->when) { + scheduled_callback->next = next; + *last = scheduled_callback; + break; + } + + last = &next->next; + } while (1); + + rc_mutex_unlock(&client->state.mutex); +} + +static void rc_client_reschedule_callback(rc_client_t* client, + rc_client_scheduled_callback_data_t* callback, rc_clock_t when) +{ + rc_client_scheduled_callback_data_t** last; + rc_client_scheduled_callback_data_t* next; + + /* ASSERT: this should only be called if the mutex is held */ + + callback->when = when; + + last = &client->state.scheduled_callbacks; + do { + next = *last; + + if (next == callback) { + if (when == 0) { + /* request to unschedule the callback */ + *last = next->next; + next->next = NULL; + break; + } + + if (!next->next) { + /* end of list, just append it */ + break; + } + + if (when < next->next->when) { + /* already in the correct place */ + break; + } + + /* remove from current position - will insert later */ + *last = next->next; + next->next = NULL; + continue; + } + + if (!next || (when < next->when && when != 0)) { + /* insert here */ + callback->next = next; + *last = callback; + break; + } + + last = &next->next; + } while (1); +} + +static void rc_client_reset_richpresence(rc_client_t* client) +{ + rc_runtime_richpresence_t* richpresence = client->game->runtime.richpresence; + if (richpresence && richpresence->richpresence) + rc_reset_richpresence(richpresence->richpresence); +} + +static void rc_client_reset_variables(rc_client_t* client) +{ + if (client->game->runtime.richpresence && client->game->runtime.richpresence->richpresence) + rc_reset_values(client->game->runtime.richpresence->richpresence->values); +} + +static void rc_client_reset_all(rc_client_t* client) +{ + rc_client_reset_achievements(client); + rc_client_reset_leaderboards(client); + rc_client_reset_richpresence(client); + rc_client_reset_variables(client); +} + +void rc_client_reset(rc_client_t* client) +{ + rc_client_game_hash_t* game_hash; + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->reset) { + client->state.external_client->reset(); + return; + } +#endif + + if (!client->game) + return; + + game_hash = rc_client_find_game_hash(client, client->game->public_.hash); + if (game_hash && game_hash->game_id != client->game->public_.id) { + /* current media is not for loaded game. unload game */ + RC_CLIENT_LOG_WARN_FORMATTED(client, "Disabling runtime. Reset with non-game media loaded: %u (%s)", + (game_hash->game_id == RC_CLIENT_UNKNOWN_GAME_ID) ? 0 : game_hash->game_id, game_hash->hash); + rc_client_unload_game(client); + return; + } + + RC_CLIENT_LOG_INFO(client, "Resetting runtime"); + + rc_mutex_lock(&client->state.mutex); + + client->game->waiting_for_reset = 0; + rc_client_reset_pending_events(client); + + rc_client_hide_progress_tracker(client, client->game); + rc_client_reset_all(client); + + rc_mutex_unlock(&client->state.mutex); + + rc_client_raise_pending_events(client, client->game); +} + +int rc_client_can_pause(rc_client_t* client, uint32_t* frames_remaining) +{ + if (!client) + return 1; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->can_pause) + return client->state.external_client->can_pause(frames_remaining); +#endif + + if (frames_remaining) + *frames_remaining = 0; + + /* pause is always allowed in softcore */ + if (!rc_client_get_hardcore_enabled(client)) + return 1; + + /* a full decay means we haven't processed any frames since the last time this was called. */ + if (client->state.unpaused_frame_decay == client->state.required_unpaused_frames * RC_PAUSE_DECAY_MULTIPLIER) + return 1; + + /* if less than RC_MINIMUM_UNPAUSED_FRAMES have been processed, don't allow the pause */ + if (client->state.unpaused_frame_decay > client->state.required_unpaused_frames * (RC_PAUSE_DECAY_MULTIPLIER - 1)) { + if (frames_remaining) { + *frames_remaining = client->state.unpaused_frame_decay - + client->state.required_unpaused_frames * (RC_PAUSE_DECAY_MULTIPLIER - 1); + } + return 0; + } + + /* we're going to allow the emulator to pause. calculate how many frames are needed before the next + * pause will be allowed. */ + + if (client->state.unpaused_frame_decay > 0) { + /* The user has paused within the decay window. Require a longer + * run of unpaused frames before allowing the next pause */ + if (client->state.required_unpaused_frames < 5 * 60) /* don't make delay longer then 5 seconds */ + client->state.required_unpaused_frames += RC_MINIMUM_UNPAUSED_FRAMES; + } + + /* require multiple unpaused_frames windows to decay the penalty */ + client->state.unpaused_frame_decay = client->state.required_unpaused_frames * RC_PAUSE_DECAY_MULTIPLIER; + + return 1; +} + +size_t rc_client_progress_size(rc_client_t* client) +{ + size_t result; + + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->progress_size) + return client->state.external_client->progress_size(); +#endif + + if (!rc_client_is_game_loaded(client)) + return 0; + + rc_mutex_lock(&client->state.mutex); + result = rc_runtime_progress_size(&client->game->runtime, NULL); + rc_mutex_unlock(&client->state.mutex); + + return result; +} + +int rc_client_serialize_progress(rc_client_t* client, uint8_t* buffer) +{ + return rc_client_serialize_progress_sized(client, buffer, 0xFFFFFFFF); +} + +int rc_client_serialize_progress_sized(rc_client_t* client, uint8_t* buffer, size_t buffer_size) +{ + int result; + + if (!client) + return RC_NO_GAME_LOADED; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->serialize_progress) + return client->state.external_client->serialize_progress(buffer, buffer_size); +#endif + + if (!rc_client_is_game_loaded(client)) + return RC_NO_GAME_LOADED; + + if (!buffer) + return RC_INVALID_STATE; + + rc_mutex_lock(&client->state.mutex); + result = rc_runtime_serialize_progress_sized(buffer, (uint32_t)buffer_size, &client->game->runtime, NULL); + rc_mutex_unlock(&client->state.mutex); + + return result; +} + +static void rc_client_subset_before_deserialize_progress(rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* achievement_stop; + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* leaderboard_stop; + + /* flag any visible challenge indicators to be hidden */ + achievement = subset->achievements; + achievement_stop = achievement + subset->public_.num_achievements; + for (; achievement < achievement_stop; ++achievement) { + rc_trigger_t* trigger = achievement->trigger; + if (trigger && trigger->state == RC_TRIGGER_STATE_PRIMED && + achievement->public_.state == RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) { + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + } + } + + /* flag any visible trackers to be hidden */ + leaderboard = subset->leaderboards; + leaderboard_stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < leaderboard_stop; ++leaderboard) { + rc_lboard_t* lboard = leaderboard->lboard; + if (lboard && lboard->state == RC_LBOARD_STATE_STARTED && + leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_TRACKING) { + leaderboard->pending_events |= RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_LEADERBOARD; + } + } +} + +static void rc_client_subset_after_deserialize_progress(rc_client_game_info_t* game, rc_client_subset_info_t* subset) +{ + rc_client_achievement_info_t* achievement; + rc_client_achievement_info_t* achievement_stop; + rc_client_leaderboard_info_t* leaderboard; + rc_client_leaderboard_info_t* leaderboard_stop; + + /* flag any challenge indicators that should be shown */ + achievement = subset->achievements; + achievement_stop = achievement + subset->public_.num_achievements; + for (; achievement < achievement_stop; ++achievement) { + rc_trigger_t* trigger = achievement->trigger; + if (!trigger || achievement->public_.state != RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE) + continue; + + if (trigger->state == RC_TRIGGER_STATE_PRIMED) { + /* if it's already shown, just keep it. otherwise flag it to be shown */ + if (achievement->pending_events & RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE) { + achievement->pending_events &= ~RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE; + } + else { + achievement->pending_events |= RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_SHOW; + subset->pending_events |= RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT; + } + } + /* ASSERT: only active achievements are serialized, so we don't have to worry about + * deserialization deactiving them. */ + } + + /* flag any trackers that need to be shown */ + leaderboard = subset->leaderboards; + leaderboard_stop = leaderboard + subset->public_.num_leaderboards; + for (; leaderboard < leaderboard_stop; ++leaderboard) { + rc_lboard_t* lboard = leaderboard->lboard; + if (!lboard || + leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_INACTIVE || + leaderboard->public_.state == RC_CLIENT_LEADERBOARD_STATE_DISABLED) + continue; + + if (lboard->state == RC_LBOARD_STATE_STARTED) { + leaderboard->value = (int)lboard->value.value.value; + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_TRACKING; + + /* if it's already being tracked, just update tracker. otherwise, allocate one */ + if (leaderboard->pending_events & RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED) { + leaderboard->pending_events &= ~RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED; + rc_client_update_leaderboard_tracker(game, leaderboard); + } + else { + rc_client_allocate_leaderboard_tracker(game, leaderboard); + } + } + else if (leaderboard->pending_events & RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED) { + /* deallocate the tracker (don't actually raise the failed event) */ + leaderboard->pending_events &= ~RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED; + leaderboard->public_.state = RC_CLIENT_LEADERBOARD_STATE_ACTIVE; + rc_client_release_leaderboard_tracker(game, leaderboard); + } + } +} + +int rc_client_deserialize_progress(rc_client_t* client, const uint8_t* serialized) +{ + return rc_client_deserialize_progress_sized(client, serialized, 0xFFFFFFFF); +} + +int rc_client_deserialize_progress_sized(rc_client_t* client, const uint8_t* serialized, size_t serialized_size) +{ + rc_client_subset_info_t* subset; + int result; + + if (!client) + return RC_NO_GAME_LOADED; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->deserialize_progress) + return client->state.external_client->deserialize_progress(serialized, serialized_size); +#endif + + if (!rc_client_is_game_loaded(client)) + return RC_NO_GAME_LOADED; + + rc_mutex_lock(&client->state.mutex); + + rc_client_reset_pending_events(client); + + for (subset = client->game->subsets; subset; subset = subset->next) + rc_client_subset_before_deserialize_progress(subset); + + rc_client_hide_progress_tracker(client, client->game); + + if (!serialized) { + rc_client_reset_all(client); + result = RC_OK; + } + else { + result = rc_runtime_deserialize_progress_sized(&client->game->runtime, serialized, (uint32_t)serialized_size, NULL); + } + + for (subset = client->game->subsets; subset; subset = subset->next) + rc_client_subset_after_deserialize_progress(client->game, subset); + + rc_mutex_unlock(&client->state.mutex); + + rc_client_raise_pending_events(client, client->game); + + return result; +} + +/* ===== Toggles ===== */ + +static void rc_client_enable_hardcore(rc_client_t* client) +{ + client->state.hardcore = 1; + + if (client->game) { + rc_client_toggle_hardcore_achievements(client->game, client, RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE); + rc_client_activate_leaderboards(client->game, client); + + /* disable processing until the client acknowledges the reset event by calling rc_runtime_reset() */ + RC_CLIENT_LOG_INFO(client, "Hardcore enabled, waiting for reset"); + client->game->waiting_for_reset = 1; + } + else { + RC_CLIENT_LOG_INFO(client, "Hardcore enabled"); + } +} + +static void rc_client_disable_hardcore(rc_client_t* client) +{ + client->state.hardcore = 0; + RC_CLIENT_LOG_INFO(client, "Hardcore disabled"); + + if (client->game) { + rc_client_toggle_hardcore_achievements(client->game, client, RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE); + + if (!client->state.allow_leaderboards_in_softcore) + rc_client_deactivate_leaderboards(client->game, client); + } +} + +void rc_client_set_hardcore_enabled(rc_client_t* client, int enabled) +{ + int changed = 0; + + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_hardcore_enabled) { + client->state.external_client->set_hardcore_enabled(enabled); + return; + } +#endif + + rc_mutex_lock(&client->state.mutex); + + enabled = enabled ? 1 : 0; + if (client->state.hardcore != enabled) { + if (enabled) + rc_client_enable_hardcore(client); + else + rc_client_disable_hardcore(client); + + changed = 1; + } + + rc_mutex_unlock(&client->state.mutex); + + /* events must be raised outside of lock */ + if (changed && client->game) { + if (enabled) { + /* if enabling hardcore, notify client that a reset is requested */ + if (client->game->waiting_for_reset) { + rc_client_event_t client_event; + memset(&client_event, 0, sizeof(client_event)); + client_event.type = RC_CLIENT_EVENT_RESET; + client->callbacks.event_handler(&client_event, client); + } + } + else { + /* if disabling hardcore, leaderboards will be deactivated. raise events for hiding trackers */ + rc_client_raise_pending_events(client, client->game); + } + } +} + +int rc_client_get_hardcore_enabled(const rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_hardcore_enabled) + return client->state.external_client->get_hardcore_enabled(); +#endif + + return client->state.hardcore; +} + +void rc_client_set_unofficial_enabled(rc_client_t* client, int enabled) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_unofficial_enabled) { + client->state.external_client->set_unofficial_enabled(enabled); + return; + } +#endif + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Unofficial %s", enabled ? "enabled" : "disabled"); + client->state.unofficial_enabled = enabled ? 1 : 0; +} + +int rc_client_get_unofficial_enabled(const rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_unofficial_enabled) + return client->state.external_client->get_unofficial_enabled(); +#endif + + return client->state.unofficial_enabled; +} + +void rc_client_set_encore_mode_enabled(rc_client_t* client, int enabled) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_encore_mode_enabled) { + client->state.external_client->set_encore_mode_enabled(enabled); + return; + } +#endif + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Encore mode %s", enabled ? "enabled" : "disabled"); + client->state.encore_mode = enabled ? 1 : 0; +} + +int rc_client_get_encore_mode_enabled(const rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_encore_mode_enabled) + return client->state.external_client->get_encore_mode_enabled(); +#endif + + return client->state.encore_mode; +} + +void rc_client_set_spectator_mode_enabled(rc_client_t* client, int enabled) +{ + if (!client) + return; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_spectator_mode_enabled) { + client->state.external_client->set_spectator_mode_enabled(enabled); + return; + } +#endif + + if (!enabled && client->state.spectator_mode == RC_CLIENT_SPECTATOR_MODE_LOCKED) { + RC_CLIENT_LOG_WARN(client, "Spectator mode cannot be disabled if it was enabled prior to loading game."); + return; + } + + RC_CLIENT_LOG_INFO_FORMATTED(client, "Spectator mode %s", enabled ? "enabled" : "disabled"); + client->state.spectator_mode = enabled ? RC_CLIENT_SPECTATOR_MODE_ON : RC_CLIENT_SPECTATOR_MODE_OFF; +} + +int rc_client_get_spectator_mode_enabled(const rc_client_t* client) +{ + if (!client) + return 0; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->get_spectator_mode_enabled) + return client->state.external_client->get_spectator_mode_enabled(); +#endif + + return (client->state.spectator_mode == RC_CLIENT_SPECTATOR_MODE_OFF) ? 0 : 1; +} + +void rc_client_set_userdata(rc_client_t* client, void* userdata) +{ + if (client) + client->callbacks.client_data = userdata; +} + +void* rc_client_get_userdata(const rc_client_t* client) +{ + return client ? client->callbacks.client_data : NULL; +} + +void rc_client_set_host(rc_client_t* client, const char* hostname) +{ + if (!client) + return; + + if (client->state.host.host && hostname && strcmp(hostname, client->state.host.host) == 0) + return; + + /* clear out any previously specified host information */ + memset(&client->state.host, 0, sizeof(client->state.host)); + + if (hostname && (!hostname[0] || strcmp(hostname, rc_api_default_host()) == 0)) { + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Using host: %s", rc_api_default_host()); + hostname = rc_api_default_host(); + } + else { + RC_CLIENT_LOG_VERBOSE_FORMATTED(client, "Using host: %s", hostname); + client->state.host.host = rc_buffer_strcpy(&client->state.buffer, hostname); + } + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client->state.external_client && client->state.external_client->set_host) + client->state.external_client->set_host(hostname); +#endif +} + +size_t rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_t buffer_size) +{ + size_t result; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + if (client && client->state.external_client && client->state.external_client->get_user_agent_clause) { + result = client->state.external_client->get_user_agent_clause(buffer, buffer_size); + if (result > 0) { + result += snprintf(buffer + result, buffer_size - result, " rc_client/" RCHEEVOS_VERSION_STRING); + buffer[buffer_size - 1] = '\0'; + return result; + } + } +#else + (void)client; +#endif + + result = snprintf(buffer, buffer_size, "rcheevos/" RCHEEVOS_VERSION_STRING); + + /* some implementations of snprintf will fill the buffer without null terminating. + * make sure the buffer is null terminated */ + buffer[buffer_size - 1] = '\0'; + return result; +} diff --git a/src/rcheevos/src/rc_client_internal.h b/src/rcheevos/src/rc_client_internal.h new file mode 100644 index 0000000000..fad288d62a --- /dev/null +++ b/src/rcheevos/src/rc_client_internal.h @@ -0,0 +1,409 @@ +#ifndef RC_CLIENT_INTERNAL_H +#define RC_CLIENT_INTERNAL_H + +#include "rc_client.h" + +#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION + #include "rc_client_raintegration_internal.h" +#endif +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + #include "rc_client_external.h" +#endif +#ifdef RC_CLIENT_SUPPORTS_HASH + #include "rhash/rc_hash_internal.h" +#endif + +#include "rc_compat.h" +#include "rc_runtime.h" +#include "rc_runtime_types.h" + +RC_BEGIN_C_DECLS + +/*****************************************************************************\ +| Callbacks | +\*****************************************************************************/ + +struct rc_api_fetch_game_sets_response_t; +typedef void (RC_CCONV *rc_client_post_process_game_sets_response_t)(const rc_api_server_response_t* server_response, + struct rc_api_fetch_game_sets_response_t* game_sets_response, rc_client_t* client, void* userdata); +typedef int (RC_CCONV *rc_client_can_submit_achievement_unlock_t)(uint32_t achievement_id, rc_client_t* client); +typedef int (RC_CCONV *rc_client_can_submit_leaderboard_entry_t)(uint32_t leaderboard_id, rc_client_t* client); +typedef int (RC_CCONV *rc_client_rich_presence_override_t)(rc_client_t* client, char buffer[], size_t buffersize); +typedef uint32_t (RC_CCONV* rc_client_identify_hash_func_t)(uint32_t console_id, const char* hash, + rc_client_t* client, void* callback_userdata); + +typedef struct rc_client_callbacks_t { + rc_client_read_memory_func_t read_memory; + rc_client_event_handler_t event_handler; + rc_client_server_call_t server_call; + rc_client_message_callback_t log_call; + rc_get_time_millisecs_func_t get_time_millisecs; + rc_client_identify_hash_func_t identify_unknown_hash; + rc_client_post_process_game_sets_response_t post_process_game_sets_response; + rc_client_can_submit_achievement_unlock_t can_submit_achievement_unlock; + rc_client_can_submit_leaderboard_entry_t can_submit_leaderboard_entry; + rc_client_rich_presence_override_t rich_presence_override; + +#ifdef RC_CLIENT_SUPPORTS_HASH + rc_hash_callbacks_t hash; +#endif + + void* client_data; +} rc_client_callbacks_t; + +struct rc_client_scheduled_callback_data_t; +typedef void (RC_CCONV *rc_client_scheduled_callback_t)(struct rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now); + +typedef struct rc_client_scheduled_callback_data_t +{ + rc_clock_t when; + uint32_t related_id; + rc_client_scheduled_callback_t callback; + void* data; + struct rc_client_scheduled_callback_data_t* next; +} rc_client_scheduled_callback_data_t; + +void rc_client_schedule_callback(rc_client_t* client, rc_client_scheduled_callback_data_t* scheduled_callback); + +struct rc_client_async_handle_t { + uint8_t aborted; +}; + +int rc_client_async_handle_aborted(rc_client_t* client, rc_client_async_handle_t* async_handle); + +/*****************************************************************************\ +| Achievements | +\*****************************************************************************/ + +enum { + RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_NONE = 0, + RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_TRIGGERED = (1 << 1), + RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_SHOW = (1 << 2), + RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE = (1 << 3), + RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_UPDATE = (1 << 4) /* not a real event, just triggers update */ +}; + +typedef struct rc_client_achievement_info_t { + rc_client_achievement_t public_; + + rc_trigger_t* trigger; + uint8_t md5[16]; + + time_t unlock_time_hardcore; + time_t unlock_time_softcore; + + uint8_t pending_events; + + const char* author; + time_t created_time; + time_t updated_time; +} rc_client_achievement_info_t; + +struct rc_client_achievement_list_info_t; +typedef void (RC_CCONV *rc_client_destroy_achievement_list_func_t)(struct rc_client_achievement_list_info_t* list); + +typedef struct rc_client_achievement_list_info_t { + rc_client_achievement_list_t public_; + rc_client_destroy_achievement_list_func_t destroy_func; +} rc_client_achievement_list_info_t; + +enum { + RC_CLIENT_PROGRESS_TRACKER_ACTION_NONE, + RC_CLIENT_PROGRESS_TRACKER_ACTION_SHOW, + RC_CLIENT_PROGRESS_TRACKER_ACTION_UPDATE, + RC_CLIENT_PROGRESS_TRACKER_ACTION_HIDE +}; + +typedef struct rc_client_progress_tracker_t { + rc_client_achievement_info_t* achievement; + float progress; + + rc_client_scheduled_callback_data_t* hide_callback; + uint8_t action; +} rc_client_progress_tracker_t; + +/*****************************************************************************\ +| Leaderboard Trackers | +\*****************************************************************************/ + +enum { + RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_NONE = 0, + RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE = (1 << 1), + RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW = (1 << 2), + RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_HIDE = (1 << 3) +}; + +typedef struct rc_client_leaderboard_tracker_info_t { + rc_client_leaderboard_tracker_t public_; + struct rc_client_leaderboard_tracker_info_t* next; + int32_t raw_value; + + uint32_t value_djb2; + + uint8_t format; + uint8_t pending_events; + uint8_t reference_count; + uint8_t value_from_hits; +} rc_client_leaderboard_tracker_info_t; + +/*****************************************************************************\ +| Leaderboards | +\*****************************************************************************/ + +enum { + RC_CLIENT_LEADERBOARD_PENDING_EVENT_NONE = 0, + RC_CLIENT_LEADERBOARD_PENDING_EVENT_STARTED = (1 << 1), + RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED = (1 << 2), + RC_CLIENT_LEADERBOARD_PENDING_EVENT_SUBMITTED = (1 << 3) +}; + +typedef struct rc_client_leaderboard_info_t { + rc_client_leaderboard_t public_; + + rc_lboard_t* lboard; + uint8_t md5[16]; + + rc_client_leaderboard_tracker_info_t* tracker; + + uint32_t value_djb2; + int32_t value; + + uint8_t format; + uint8_t pending_events; + uint8_t bucket; + uint8_t hidden; +} rc_client_leaderboard_info_t; + +struct rc_client_leaderboard_list_info_t; +typedef void (RC_CCONV *rc_client_destroy_leaderboard_list_func_t)(struct rc_client_leaderboard_list_info_t* list); + +typedef struct rc_client_leaderboard_list_info_t { + rc_client_leaderboard_list_t public_; + rc_client_destroy_leaderboard_list_func_t destroy_func; +} rc_client_leaderboard_list_info_t; + +struct rc_client_leaderboard_entry_list_info_t; +typedef void (RC_CCONV *rc_client_destroy_leaderboard_entry_list_func_t)(struct rc_client_leaderboard_entry_list_info_t* list); + +typedef struct rc_client_leaderboard_entry_list_info_t { + rc_client_leaderboard_entry_list_t public_; + rc_client_destroy_leaderboard_entry_list_func_t destroy_func; +} rc_client_leaderboard_entry_list_info_t; + +uint8_t rc_client_map_leaderboard_format(int format); + +/*****************************************************************************\ +| Subsets | +\*****************************************************************************/ + +enum { + RC_CLIENT_SUBSET_PENDING_EVENT_NONE = 0, + RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT = (1 << 1), + RC_CLIENT_SUBSET_PENDING_EVENT_LEADERBOARD = (1 << 2) +}; + +typedef struct rc_client_subset_info_t { + rc_client_subset_t public_; + + rc_client_achievement_info_t* achievements; + rc_client_leaderboard_info_t* leaderboards; + + struct rc_client_subset_info_t* next; + + const char* all_label; + const char* inactive_label; + const char* locked_label; + const char* unlocked_label; + const char* unofficial_label; + const char* unsupported_label; + + uint8_t active; + uint8_t mastery; + uint8_t pending_events; +} rc_client_subset_info_t; + +struct rc_client_subset_list_info_t; +typedef void (RC_CCONV* rc_client_destroy_subset_list_func_t)(struct rc_client_subset_list_info_t* list); + +typedef struct rc_client_subset_list_info_t { + rc_client_subset_list_t public_; + rc_client_destroy_subset_list_func_t destroy_func; +} rc_client_subset_list_info_t; + +/*****************************************************************************\ +| Game | +\*****************************************************************************/ + +typedef struct rc_client_game_hash_t { + char hash[33]; + uint8_t is_unknown; + uint32_t game_id; + struct rc_client_game_hash_t* next; +} rc_client_game_hash_t; + +rc_client_game_hash_t* rc_client_find_game_hash(rc_client_t* client, const char* hash); + +typedef struct rc_client_media_hash_t { + rc_client_game_hash_t* game_hash; + struct rc_client_media_hash_t* next; + uint32_t path_djb2; +} rc_client_media_hash_t; + +enum { + RC_CLIENT_GAME_PENDING_EVENT_NONE = 0, + RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER = (1 << 1), + RC_CLIENT_GAME_PENDING_EVENT_UPDATE_ACTIVE_ACHIEVEMENTS = (1 << 2), + RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER = (1 << 3) +}; + +typedef struct rc_client_game_info_t { + rc_client_game_t public_; + rc_client_leaderboard_tracker_info_t* leaderboard_trackers; + rc_client_progress_tracker_t progress_tracker; + + rc_client_subset_info_t* subsets; + + rc_client_media_hash_t* media_hash; + + rc_runtime_t runtime; + + uint32_t max_valid_address; + + uint8_t waiting_for_reset; + uint8_t pending_events; + + rc_buffer_t buffer; +} rc_client_game_info_t; + +void rc_client_update_active_achievements(rc_client_game_info_t* game); +void rc_client_update_active_leaderboards(rc_client_game_info_t* game); + +/*****************************************************************************\ +| Client | +\*****************************************************************************/ + +enum { + RC_CLIENT_USER_STATE_NONE, + RC_CLIENT_USER_STATE_LOGIN_REQUESTED, + RC_CLIENT_USER_STATE_LOGGED_IN +}; + +enum { + RC_CLIENT_MASTERY_STATE_NONE, + RC_CLIENT_MASTERY_STATE_PENDING, + RC_CLIENT_MASTERY_STATE_SHOWN +}; + +enum { + RC_CLIENT_SPECTATOR_MODE_OFF, + RC_CLIENT_SPECTATOR_MODE_ON, + RC_CLIENT_SPECTATOR_MODE_LOCKED +}; + +enum { + RC_CLIENT_DISCONNECT_HIDDEN = 0, + RC_CLIENT_DISCONNECT_VISIBLE = (1 << 0), + RC_CLIENT_DISCONNECT_SHOW_PENDING = (1 << 1), + RC_CLIENT_DISCONNECT_HIDE_PENDING = (1 << 2) +}; + +struct rc_client_load_state_t; + +typedef struct rc_client_state_t { + rc_mutex_t mutex; + rc_buffer_t buffer; + + rc_client_scheduled_callback_data_t* scheduled_callbacks; + rc_api_host_t host; + +#ifdef RC_CLIENT_SUPPORTS_EXTERNAL + rc_client_external_t* external_client; + struct rc_client_external_conversions_t* external_client_conversions; +#endif +#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION + rc_client_raintegration_t* raintegration; +#endif + + uint32_t frames_processed; + uint32_t frames_at_last_ping; + uint16_t unpaused_frame_decay; + uint16_t required_unpaused_frames; + + uint8_t hardcore; + uint8_t encore_mode; + uint8_t spectator_mode; + uint8_t unofficial_enabled; + uint8_t log_level; + uint8_t user; + uint8_t disconnect; + uint8_t allow_leaderboards_in_softcore; + uint8_t allow_background_memory_reads; + + struct rc_client_load_state_t* load; + struct rc_client_async_handle_t* async_handles[4]; + rc_memref_t* processing_memref; + + rc_peek_t legacy_peek; +} rc_client_state_t; + +struct rc_client_t { + rc_client_game_info_t* game; + rc_client_game_hash_t* hashes; + + rc_client_user_t user; + + rc_client_callbacks_t callbacks; + + rc_client_state_t state; +}; + +/*****************************************************************************\ +| Helpers | +\*****************************************************************************/ + +#ifdef RC_NO_VARIADIC_MACROS + void RC_CLIENT_LOG_ERR_FORMATTED(const rc_client_t* client, const char* format, ...); + void RC_CLIENT_LOG_WARN_FORMATTED(const rc_client_t* client, const char* format, ...); + void RC_CLIENT_LOG_INFO_FORMATTED(const rc_client_t* client, const char* format, ...); + void RC_CLIENT_LOG_VERBOSE_FORMATTED(const rc_client_t* client, const char* format, ...); +#else + void rc_client_log_message_formatted(const rc_client_t* client, const char* format, ...); + #define RC_CLIENT_LOG_ERR_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) rc_client_log_message_formatted(client, format, __VA_ARGS__); } + #define RC_CLIENT_LOG_WARN_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_WARN) rc_client_log_message_formatted(client, format, __VA_ARGS__); } + #define RC_CLIENT_LOG_INFO_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) rc_client_log_message_formatted(client, format, __VA_ARGS__); } + #define RC_CLIENT_LOG_VERBOSE_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_VERBOSE) rc_client_log_message_formatted(client, format, __VA_ARGS__); } +#endif + +void rc_client_log_message(const rc_client_t* client, const char* message); +#define RC_CLIENT_LOG_ERR(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) rc_client_log_message(client, message); } +#define RC_CLIENT_LOG_WARN(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_WARN) rc_client_log_message(client, message); } +#define RC_CLIENT_LOG_INFO(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) rc_client_log_message(client, message); } +#define RC_CLIENT_LOG_VERBOSE(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_VERBOSE) rc_client_log_message(client, message); } + +/* internals pulled from runtime.c */ +void rc_runtime_checksum(const char* memaddr, uint8_t* md5); +int rc_trigger_contains_memref(const rc_trigger_t* trigger, const rc_memref_t* memref); +int rc_value_contains_memref(const rc_value_t* value, const rc_memref_t* memref); +/* end runtime.c internals */ + +/* helper functions for unit tests */ +#ifdef RC_CLIENT_SUPPORTS_HASH +struct rc_hash_iterator; +struct rc_hash_iterator* rc_client_get_load_state_hash_iterator(rc_client_t* client); +#endif +/* end helper functions for unit tests */ + +enum { + RC_CLIENT_LEGACY_PEEK_AUTO, + RC_CLIENT_LEGACY_PEEK_CONSTRUCTED, + RC_CLIENT_LEGACY_PEEK_LITTLE_ENDIAN_READS +}; + +void rc_client_set_legacy_peek(rc_client_t* client, int method); + +void rc_client_allocate_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard); +void rc_client_release_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard); + +RC_END_C_DECLS + +#endif /* RC_CLIENT_INTERNAL_H */ diff --git a/src/rcheevos/src/rc_compat.c b/src/rcheevos/src/rc_compat.c new file mode 100644 index 0000000000..0ab9e4dda5 --- /dev/null +++ b/src/rcheevos/src/rc_compat.c @@ -0,0 +1,251 @@ +#if !defined(RC_NO_THREADS) && !defined(_WIN32) && !defined(GEKKO) && !defined(_3DS) && (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE - 0) < 500) +/* We'll want to use pthread_mutexattr_settype/PTHREAD_MUTEX_RECURSIVE, but glibc only conditionally exposes pthread_mutexattr_settype and PTHREAD_MUTEX_RECURSIVE depending on feature flags + * Defining _XOPEN_SOURCE must be done at the top of the source file, before including any headers + * pthread_mutexattr_settype/PTHREAD_MUTEX_RECURSIVE are specified the Single UNIX Specification (Version 2, 1997), along with POSIX later on (IEEE Standard 1003.1-2008), so should cover practically any pthread implementation + */ +#undef _XOPEN_SOURCE +#define _XOPEN_SOURCE 500 +#endif + +#include "rc_compat.h" + +#include +#include +#include + +#ifdef RC_C89_HELPERS + +int rc_strncasecmp(const char* left, const char* right, size_t length) +{ + while (length) + { + if (*left != *right) + { + const int diff = tolower(*left) - tolower(*right); + if (diff != 0) + return diff; + } + + ++left; + ++right; + --length; + } + + return 0; +} + +int rc_strcasecmp(const char* left, const char* right) +{ + while (*left || *right) + { + if (*left != *right) + { + const int diff = tolower(*left) - tolower(*right); + if (diff != 0) + return diff; + } + + ++left; + ++right; + } + + return 0; +} + +char* rc_strdup(const char* str) +{ + const size_t length = strlen(str); + char* buffer = (char*)malloc(length + 1); + if (buffer) + memcpy(buffer, str, length + 1); + return buffer; +} + +int rc_snprintf(char* buffer, size_t size, const char* format, ...) +{ + int result; + va_list args; + + va_start(args, format); + +#ifdef __STDC_SECURE_LIB__ + result = vsprintf_s(buffer, size, format, args); +#else + /* assume buffer is large enough and ignore size */ + (void)size; + result = vsprintf(buffer, format, args); +#endif + + va_end(args); + + return result; +} + +#endif + +#ifndef __STDC_SECURE_LIB__ + +struct tm* rc_gmtime_s(struct tm* buf, const time_t* timer) +{ + struct tm* tm = gmtime(timer); + memcpy(buf, tm, sizeof(*tm)); + return buf; +} + +#endif + +#ifndef RC_NO_THREADS + +#if defined(_WIN32) + +/* https://learn.microsoft.com/en-us/archive/msdn-magazine/2012/november/windows-with-c-the-evolution-of-synchronization-in-windows-and-c */ +/* implementation largely taken from https://github.com/libsdl-org/SDL/blob/0fc3574/src/thread/windows/SDL_sysmutex.c */ + +#if defined(WINVER) && WINVER >= 0x0600 + +void rc_mutex_init(rc_mutex_t* mutex) +{ + InitializeSRWLock(&mutex->srw_lock); + /* https://learn.microsoft.com/en-us/windows/win32/procthread/thread-handles-and-identifiers */ + /* thread ids are never 0 */ + mutex->owner = 0; + mutex->count = 0; +} + +void rc_mutex_destroy(rc_mutex_t* mutex) +{ + /* Nothing to do here */ + (void)mutex; +} + +void rc_mutex_lock(rc_mutex_t* mutex) +{ + DWORD current_thread = GetCurrentThreadId(); + if (mutex->owner == current_thread) { + ++mutex->count; + assert(mutex->count > 0); + } + else { + AcquireSRWLockExclusive(&mutex->srw_lock); + assert(mutex->owner == 0 && mutex->count == 0); + mutex->owner = current_thread; + mutex->count = 1; + } +} + +void rc_mutex_unlock(rc_mutex_t* mutex) +{ + if (mutex->owner == GetCurrentThreadId()) { + assert(mutex->count > 0); + if (--mutex->count == 0) { + mutex->owner = 0; + ReleaseSRWLockExclusive(&mutex->srw_lock); + } + } + else { + assert(!"Tried to unlock unowned mutex"); + } +} + +#else + +void rc_mutex_init(rc_mutex_t* mutex) +{ + InitializeCriticalSection(&mutex->critical_section); +} + +void rc_mutex_destroy(rc_mutex_t* mutex) +{ + DeleteCriticalSection(&mutex->critical_section); +} + +void rc_mutex_lock(rc_mutex_t* mutex) +{ + EnterCriticalSection(&mutex->critical_section); +} + +void rc_mutex_unlock(rc_mutex_t* mutex) +{ + LeaveCriticalSection(&mutex->critical_section); +} + +#endif + +#elif defined(GEKKO) + +/* https://github.com/libretro/RetroArch/pull/16116 */ + +void rc_mutex_init(rc_mutex_t* mutex) +{ + /* LWP_MutexInit has the handle passed by reference */ + /* Other LWP_Mutex* calls have the handle passed by value */ + LWP_MutexInit(&mutex->handle, 1); +} + +void rc_mutex_destroy(rc_mutex_t* mutex) +{ + LWP_MutexDestroy(mutex->handle); +} + +void rc_mutex_lock(rc_mutex_t* mutex) +{ + LWP_MutexLock(mutex->handle); +} + +void rc_mutex_unlock(rc_mutex_t* mutex) +{ + LWP_MutexUnlock(mutex->handle); +} + +#elif defined(_3DS) + +void rc_mutex_init(rc_mutex_t* mutex) +{ + RecursiveLock_Init(mutex); +} + +void rc_mutex_destroy(rc_mutex_t* mutex) +{ + /* Nothing to do here */ + (void)mutex; +} + +void rc_mutex_lock(rc_mutex_t* mutex) +{ + RecursiveLock_Lock(mutex); +} + +void rc_mutex_unlock(rc_mutex_t* mutex) +{ + RecursiveLock_Unlock(mutex); +} + +#else + +void rc_mutex_init(rc_mutex_t* mutex) +{ + /* Define the mutex as recursive, for consistent semantics against other rc_mutex_t implementations */ + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(mutex, &attr); + pthread_mutexattr_destroy(&attr); +} + +void rc_mutex_destroy(rc_mutex_t* mutex) +{ + pthread_mutex_destroy(mutex); +} + +void rc_mutex_lock(rc_mutex_t* mutex) +{ + pthread_mutex_lock(mutex); +} + +void rc_mutex_unlock(rc_mutex_t* mutex) +{ + pthread_mutex_unlock(mutex); +} + +#endif +#endif /* RC_NO_THREADS */ diff --git a/src/rcheevos/src/rc_compat.h b/src/rcheevos/src/rc_compat.h new file mode 100644 index 0000000000..3f24df2efd --- /dev/null +++ b/src/rcheevos/src/rc_compat.h @@ -0,0 +1,121 @@ +#ifndef RC_COMPAT_H +#define RC_COMPAT_H + +#ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include +#endif + +#include "rc_export.h" + +#include +#include +#include + +RC_BEGIN_C_DECLS + +#if defined(MINGW) || defined(__MINGW32__) || defined(__MINGW64__) + +/* MinGW redefinitions */ + +#define RC_NO_VARIADIC_MACROS 1 + +#elif defined(_MSC_VER) + +/* Visual Studio redefinitions */ + +#ifndef strcasecmp + #define strcasecmp _stricmp +#endif +#ifndef strncasecmp + #define strncasecmp _strnicmp +#endif +#ifndef strdup + #define strdup _strdup +#endif + +#elif __STDC_VERSION__ < 199901L + +/* C89 redefinitions */ +#define RC_C89_HELPERS 1 + +#define RC_NO_VARIADIC_MACROS 1 + +#ifndef snprintf + extern int rc_snprintf(char* buffer, size_t size, const char* format, ...); + #define snprintf rc_snprintf +#endif + +#ifndef strncasecmp + extern int rc_strncasecmp(const char* left, const char* right, size_t length); + #define strncasecmp rc_strncasecmp +#endif + +#ifndef strcasecmp + extern int rc_strcasecmp(const char* left, const char* right); + #define strcasecmp rc_strcasecmp +#endif + +#ifndef strdup + extern char* rc_strdup(const char* str); + #define strdup rc_strdup +#endif + +#endif /* __STDC_VERSION__ < 199901L */ + +#ifndef __STDC_SECURE_LIB__ + /* _CRT_SECURE_NO_WARNINGS redefinitions */ + #define strcpy_s(dest, sz, src) strcpy(dest, src) + #define sscanf_s sscanf + + /* NOTE: Microsoft secure gmtime_s parameter order differs from C11 standard */ + #include + extern struct tm* rc_gmtime_s(struct tm* buf, const time_t* timer); + #define gmtime_s rc_gmtime_s +#endif + +#ifdef RC_NO_THREADS + typedef int rc_mutex_t; + + #define rc_mutex_init(mutex) + #define rc_mutex_destroy(mutex) + #define rc_mutex_lock(mutex) + #define rc_mutex_unlock(mutex) +#else + #if defined(_WIN32) + typedef struct rc_mutex_t { + #if defined(WINVER) && WINVER >= 0x0600 + /* Windows Vista and later can use a slim reader/writer (SRW) lock */ + SRWLOCK srw_lock; + /* Current thread owner needs to be tracked (for recursive mutex usage) */ + DWORD owner; + DWORD count; + #else + /* Pre-Vista must use a critical section */ + CRITICAL_SECTION critical_section; + #endif + } rc_mutex_t; + #elif defined(GEKKO) + #include + typedef struct rc_mutex_t { + mutex_t handle; + } rc_mutex_t; + #elif defined(_3DS) + #include <3ds/synchronization.h> + typedef RecursiveLock rc_mutex_t; + #else + #include + typedef pthread_mutex_t rc_mutex_t; + #endif + + void rc_mutex_init(rc_mutex_t* mutex); + void rc_mutex_destroy(rc_mutex_t* mutex); + void rc_mutex_lock(rc_mutex_t* mutex); + void rc_mutex_unlock(rc_mutex_t* mutex); +#endif + +RC_END_C_DECLS + +#endif /* RC_COMPAT_H */ diff --git a/src/rcheevos/src/rc_util.c b/src/rcheevos/src/rc_util.c new file mode 100644 index 0000000000..cd750d2c3c --- /dev/null +++ b/src/rcheevos/src/rc_util.c @@ -0,0 +1,199 @@ +#include "rc_util.h" + +#include "rc_compat.h" +#include "rc_error.h" + +#include +#include + +#undef DEBUG_BUFFERS + +/* --- rc_buffer --- */ + +void rc_buffer_init(rc_buffer_t* buffer) +{ + buffer->chunk.write = buffer->chunk.start = &buffer->data[0]; + buffer->chunk.end = &buffer->data[sizeof(buffer->data)]; + buffer->chunk.next = NULL; + /* leave buffer->data uninitialized */ +} + +void rc_buffer_destroy(rc_buffer_t* buffer) +{ + rc_buffer_chunk_t* chunk; +#ifdef DEBUG_BUFFERS + int count = 0; + int wasted = 0; + int total = 0; +#endif + + /* first chunk is not allocated. skip it. */ + chunk = buffer->chunk.next; + + /* deallocate any additional buffers */ + while (chunk) + { + rc_buffer_chunk_t* next = chunk->next; +#ifdef DEBUG_BUFFERS + total += (int)(chunk->end - chunk->start); + wasted += (int)(chunk->end - chunk->write); + ++count; +#endif +#ifdef DEBUG_BUFFERS + printf("< free %p.%p\n", (void*)buffer, (void*)chunk); +#endif + free(chunk); + chunk = next; + } + +#ifdef DEBUG_BUFFERS + printf("-- %d allocated buffers (%d/%d used, %d wasted, %0.2f%% efficiency)\n", count, + total - wasted, total, wasted, (float)(100.0 - (wasted * 100.0) / total)); +#endif +} + +uint8_t* rc_buffer_reserve(rc_buffer_t* buffer, size_t amount) +{ + rc_buffer_chunk_t* chunk = &buffer->chunk; + size_t remaining; + while (chunk) + { + remaining = chunk->end - chunk->write; + if (remaining >= amount) + return chunk->write; + + if (!chunk->next) + { + /* allocate a chunk of memory that is a multiple of 256-bytes. the first 32 bytes will be associated + * to the chunk header, and the remaining will be used for data. + */ + const size_t chunk_header_size = sizeof(rc_buffer_chunk_t); + const size_t alloc_size = (chunk_header_size + amount + 0xFF) & ~0xFF; + chunk->next = (rc_buffer_chunk_t*)malloc(alloc_size); + if (!chunk->next) + break; + +#ifdef DEBUG_BUFFERS + printf("> alloc %p.%p\n", (void*)buffer, (void*)chunk->next); +#endif + + chunk->next->start = (uint8_t*)chunk->next + chunk_header_size; + chunk->next->write = chunk->next->start; + chunk->next->end = (uint8_t*)chunk->next + alloc_size; + chunk->next->next = NULL; + } + + chunk = chunk->next; + } + + return NULL; +} + +void rc_buffer_consume(rc_buffer_t* buffer, const uint8_t* start, uint8_t* end) +{ + rc_buffer_chunk_t* chunk = &buffer->chunk; + do + { + if (chunk->write == start) + { + size_t offset = (end - chunk->start); + offset = (offset + 7) & ~7; + chunk->write = &chunk->start[offset]; + + if (chunk->write > chunk->end) + chunk->write = chunk->end; + break; + } + + chunk = chunk->next; + } while (chunk); +} + +void* rc_buffer_alloc(rc_buffer_t* buffer, size_t amount) +{ + uint8_t* ptr = rc_buffer_reserve(buffer, amount); + rc_buffer_consume(buffer, ptr, ptr + amount); + return (void*)ptr; +} + +char* rc_buffer_strncpy(rc_buffer_t* buffer, const char* src, size_t len) +{ + uint8_t* dst = rc_buffer_reserve(buffer, len + 1); + memcpy(dst, src, len); + dst[len] = '\0'; + rc_buffer_consume(buffer, dst, dst + len + 2); + return (char*)dst; +} + +char* rc_buffer_strcpy(rc_buffer_t* buffer, const char* src) +{ + return rc_buffer_strncpy(buffer, src, strlen(src)); +} + +/* --- other --- */ + +void rc_format_md5(char checksum[33], const uint8_t digest[16]) +{ + snprintf(checksum, 33, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15] + ); +} + +uint32_t rc_djb2(const char* input) +{ + uint32_t result = 5381; + char c; + + while ((c = *input++) != '\0') + result = ((result << 5) + result) + c; /* result = result * 33 + c */ + + return result; +} + +const char* rc_error_str(int ret) +{ + switch (ret) { + case RC_OK: return "OK"; + case RC_INVALID_FUNC_OPERAND: return "Invalid function operand"; + case RC_INVALID_MEMORY_OPERAND: return "Invalid memory operand"; + case RC_INVALID_CONST_OPERAND: return "Invalid constant operand"; + case RC_INVALID_FP_OPERAND: return "Invalid floating-point operand"; + case RC_INVALID_CONDITION_TYPE: return "Invalid condition type"; + case RC_INVALID_OPERATOR: return "Invalid operator"; + case RC_INVALID_REQUIRED_HITS: return "Invalid required hits"; + case RC_DUPLICATED_START: return "Duplicated start condition"; + case RC_DUPLICATED_CANCEL: return "Duplicated cancel condition"; + case RC_DUPLICATED_SUBMIT: return "Duplicated submit condition"; + case RC_DUPLICATED_VALUE: return "Duplicated value expression"; + case RC_DUPLICATED_PROGRESS: return "Duplicated progress expression"; + case RC_MISSING_START: return "Missing start condition"; + case RC_MISSING_CANCEL: return "Missing cancel condition"; + case RC_MISSING_SUBMIT: return "Missing submit condition"; + case RC_MISSING_VALUE: return "Missing value expression"; + case RC_INVALID_LBOARD_FIELD: return "Invalid field in leaderboard"; + case RC_MISSING_DISPLAY_STRING: return "Missing display string"; + case RC_OUT_OF_MEMORY: return "Out of memory"; + case RC_INVALID_VALUE_FLAG: return "Invalid flag in value expression"; + case RC_MISSING_VALUE_MEASURED: return "Missing measured flag in value expression"; + case RC_MULTIPLE_MEASURED: return "Multiple measured targets"; + case RC_INVALID_MEASURED_TARGET: return "Invalid measured target"; + case RC_INVALID_COMPARISON: return "Invalid comparison"; + case RC_INVALID_STATE: return "Invalid state"; + case RC_INVALID_JSON: return "Invalid JSON"; + case RC_API_FAILURE: return "API call failed"; + case RC_LOGIN_REQUIRED: return "Login required"; + case RC_NO_GAME_LOADED: return "No game loaded"; + case RC_HARDCORE_DISABLED: return "Hardcore disabled"; + case RC_ABORTED: return "Aborted"; + case RC_NO_RESPONSE: return "No response"; + case RC_ACCESS_DENIED: return "Access denied"; + case RC_INVALID_CREDENTIALS: return "Invalid credentials"; + case RC_EXPIRED_TOKEN: return "Expired token"; + case RC_INSUFFICIENT_BUFFER: return "Buffer not large enough"; + case RC_INVALID_VARIABLE_NAME: return "Invalid variable name"; + case RC_UNKNOWN_VARIABLE_NAME: return "Unknown variable name"; + case RC_NOT_FOUND: return "Not found"; + default: return "Unknown error"; + } +} diff --git a/src/rcheevos/src/rc_version.c b/src/rcheevos/src/rc_version.c new file mode 100644 index 0000000000..a29d0a5f52 --- /dev/null +++ b/src/rcheevos/src/rc_version.c @@ -0,0 +1,11 @@ +#include "rc_version.h" + +uint32_t rc_version(void) +{ + return RCHEEVOS_VERSION; +} + +const char* rc_version_string(void) +{ + return RCHEEVOS_VERSION_STRING; +} diff --git a/src/rcheevos/src/rc_version.h b/src/rcheevos/src/rc_version.h new file mode 100644 index 0000000000..18b91284de --- /dev/null +++ b/src/rcheevos/src/rc_version.h @@ -0,0 +1,32 @@ +#ifndef RC_VERSION_H +#define RC_VERSION_H + +#include "rc_export.h" + +#include + +RC_BEGIN_C_DECLS + +#define RCHEEVOS_VERSION_MAJOR 12 +#define RCHEEVOS_VERSION_MINOR 1 +#define RCHEEVOS_VERSION_PATCH 0 + +#define RCHEEVOS_MAKE_VERSION(major, minor, patch) (major * 1000000 + minor * 1000 + patch) +#define RCHEEVOS_VERSION RCHEEVOS_MAKE_VERSION(RCHEEVOS_VERSION_MAJOR, RCHEEVOS_VERSION_MINOR, RCHEEVOS_VERSION_PATCH) + +#define RCHEEVOS_MAKE_STRING(num) #num +#define RCHEEVOS_MAKE_VERSION_STRING(major, minor, patch) RCHEEVOS_MAKE_STRING(major) "." RCHEEVOS_MAKE_STRING(minor) "." RCHEEVOS_MAKE_STRING(patch) +#define RCHEEVOS_MAKE_VERSION_STRING_SHORT(major, minor) RCHEEVOS_MAKE_STRING(major) "." RCHEEVOS_MAKE_STRING(minor) + +#if RCHEEVOS_VERSION_PATCH > 0 + #define RCHEEVOS_VERSION_STRING RCHEEVOS_MAKE_VERSION_STRING(RCHEEVOS_VERSION_MAJOR, RCHEEVOS_VERSION_MINOR, RCHEEVOS_VERSION_PATCH) +#else + #define RCHEEVOS_VERSION_STRING RCHEEVOS_MAKE_VERSION_STRING_SHORT(RCHEEVOS_VERSION_MAJOR, RCHEEVOS_VERSION_MINOR) +#endif + +RC_EXPORT uint32_t rc_version(void); +RC_EXPORT const char* rc_version_string(void); + +RC_END_C_DECLS + +#endif /* RC_VERSION_H */ diff --git a/src/rcheevos/src/rcheevos/alloc.c b/src/rcheevos/src/rcheevos/alloc.c new file mode 100644 index 0000000000..5dbf20cb0f --- /dev/null +++ b/src/rcheevos/src/rcheevos/alloc.c @@ -0,0 +1,312 @@ +#include "rc_internal.h" + +#include +#include + +void* rc_alloc_scratch(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset) +{ + void* data; + + /* if we have a real buffer, then allocate the data there */ + if (pointer) + return rc_alloc(pointer, offset, size, alignment, NULL, scratch_object_pointer_offset); + + /* update how much space will be required in the real buffer */ + { + const int32_t aligned_offset = (*offset + alignment - 1) & ~(alignment - 1); + *offset += (aligned_offset - *offset); + *offset += size; + } + + /* find a scratch buffer to hold the temporary data */ + data = rc_buffer_alloc(&scratch->buffer, size); + if (!data) { + *offset = RC_OUT_OF_MEMORY; + return NULL; + } + + return data; +} + +void* rc_alloc(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset) { + void* ptr; + + *offset = (*offset + alignment - 1) & ~(alignment - 1); + + if (pointer != 0) { + /* valid buffer, grab the next chunk */ + ptr = (void*)((uint8_t*)pointer + *offset); + } + else if (scratch != 0 && scratch_object_pointer_offset < sizeof(scratch->objs)) { + /* only allocate one instance of each object type (indentified by scratch_object_pointer_offset) */ + void** scratch_object_pointer = (void**)((uint8_t*)&scratch->objs + scratch_object_pointer_offset); + ptr = *scratch_object_pointer; + if (!ptr) { + int32_t used; + ptr = *scratch_object_pointer = rc_alloc_scratch(NULL, &used, size, alignment, scratch, -1); + } + } + else { + /* nowhere to get memory from, return NULL */ + ptr = NULL; + } + + *offset += size; + return ptr; +} + +char* rc_alloc_str(rc_parse_state_t* parse, const char* text, size_t length) { + int32_t used = 0; + char* ptr; + + rc_scratch_string_t** next = &parse->scratch.strings; + while (*next) { + int diff = strncmp(text, (*next)->value, length); + if (diff == 0) { + diff = (*next)->value[length]; + if (diff == 0) + return (*next)->value; + } + + if (diff < 0) + next = &(*next)->left; + else + next = &(*next)->right; + } + + *next = (rc_scratch_string_t*)rc_alloc_scratch(NULL, &used, sizeof(rc_scratch_string_t), RC_ALIGNOF(rc_scratch_string_t), &parse->scratch, RC_OFFSETOF(parse->scratch.objs, __rc_scratch_string_t)); + ptr = (char*)rc_alloc_scratch(parse->buffer, &parse->offset, (uint32_t)length + 1, RC_ALIGNOF(char), &parse->scratch, -1); + + if (!ptr || !*next) { + if (parse->offset >= 0) + parse->offset = RC_OUT_OF_MEMORY; + + return NULL; + } + + memcpy(ptr, text, length); + ptr[length] = '\0'; + + (*next)->left = NULL; + (*next)->right = NULL; + (*next)->value = ptr; + + return ptr; +} + +void rc_init_preparse_state(rc_preparse_state_t* preparse) +{ + rc_init_parse_state(&preparse->parse, NULL); + rc_init_parse_state_memrefs(&preparse->parse, &preparse->memrefs); +} + +void rc_destroy_preparse_state(rc_preparse_state_t* preparse) +{ + rc_destroy_parse_state(&preparse->parse); +} + +void rc_preparse_alloc_memrefs(rc_memrefs_t* memrefs, rc_preparse_state_t* preparse) +{ + const uint32_t num_memrefs = rc_memrefs_count_memrefs(&preparse->memrefs); + const uint32_t num_modified_memrefs = rc_memrefs_count_modified_memrefs(&preparse->memrefs); + + if (preparse->parse.offset < 0) + return; + + if (memrefs) { + memset(memrefs, 0, sizeof(*memrefs)); + preparse->parse.memrefs = memrefs; + } + + if (num_memrefs) { + rc_memref_t* memref_items = RC_ALLOC_ARRAY(rc_memref_t, num_memrefs, &preparse->parse); + + if (memrefs) { + memrefs->memrefs.capacity = num_memrefs; + memrefs->memrefs.items = memref_items; + } + } + + if (num_modified_memrefs) { + rc_modified_memref_t* modified_memref_items = + RC_ALLOC_ARRAY(rc_modified_memref_t, num_modified_memrefs, &preparse->parse); + + if (memrefs) { + memrefs->modified_memrefs.capacity = num_modified_memrefs; + memrefs->modified_memrefs.items = modified_memref_items; + } + } + + /* when preparsing, this structure will be allocated at the end. when it's allocated earlier + * in the buffer, it could be followed by something aligned at 8 bytes. force the offset to + * an 8-byte boundary */ + if (!memrefs) { + rc_alloc(preparse->parse.buffer, &preparse->parse.offset, 0, 8, &preparse->parse.scratch, 0); + } +} + +static uint32_t rc_preparse_array_size(uint32_t needed, uint32_t minimum) +{ + while (minimum < needed) + minimum <<= 1; + + return minimum; +} + +void rc_preparse_reserve_memrefs(rc_preparse_state_t* preparse, rc_memrefs_t* memrefs) +{ + uint32_t num_memrefs = rc_memrefs_count_memrefs(&preparse->memrefs); + uint32_t num_modified_memrefs = rc_memrefs_count_modified_memrefs(&preparse->memrefs); + uint32_t available; + + if (preparse->parse.offset < 0) + return; + + if (num_memrefs) { + rc_memref_list_t* memref_list = &memrefs->memrefs; + while (memref_list->count == memref_list->capacity) { + if (!memref_list->next) + break; + + memref_list = memref_list->next; + } + + available = memref_list->capacity - memref_list->count; + if (available < num_memrefs) { + rc_memref_list_t* new_memref_list = (rc_memref_list_t*)calloc(1, sizeof(rc_memref_list_t)); + if (!new_memref_list) + return; + + new_memref_list->capacity = rc_preparse_array_size(num_memrefs - available, 16); + new_memref_list->items = (rc_memref_t*)malloc(new_memref_list->capacity * sizeof(rc_memref_t)); + new_memref_list->allocated = 1; + memref_list->next = new_memref_list; + } + } + + if (num_modified_memrefs) { + rc_modified_memref_list_t* modified_memref_list = &memrefs->modified_memrefs; + while (modified_memref_list->count == modified_memref_list->capacity) { + if (!modified_memref_list->next) + break; + + modified_memref_list = modified_memref_list->next; + } + + available = modified_memref_list->capacity - modified_memref_list->count; + if (available < num_modified_memrefs) { + rc_modified_memref_list_t* new_modified_memref_list = (rc_modified_memref_list_t*)calloc(1, sizeof(rc_modified_memref_list_t)); + if (!new_modified_memref_list) + return; + + new_modified_memref_list->capacity = rc_preparse_array_size(num_modified_memrefs - available, 8); + new_modified_memref_list->items = (rc_modified_memref_t*)malloc(new_modified_memref_list->capacity * sizeof(rc_modified_memref_t)); + new_modified_memref_list->allocated = 1; + modified_memref_list->next = new_modified_memref_list; + } + } + + preparse->parse.memrefs = memrefs; +} + +static void rc_preparse_sync_operand(rc_operand_t* operand, rc_parse_state_t* parse, const rc_memrefs_t* memrefs) +{ + if (rc_operand_is_memref(operand) || rc_operand_is_recall(operand)) { + const rc_memref_t* src_memref = operand->value.memref; + + if (src_memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF) { + const rc_modified_memref_list_t* modified_memref_list = &memrefs->modified_memrefs; + for (; modified_memref_list; modified_memref_list = modified_memref_list->next) { + const rc_modified_memref_t* modified_memref = modified_memref_list->items; + const rc_modified_memref_t* modified_memref_end = modified_memref + modified_memref_list->count; + + for (; modified_memref < modified_memref_end; ++modified_memref) { + if ((const rc_modified_memref_t*)src_memref == modified_memref) { + rc_modified_memref_t* dst_modified_memref = rc_alloc_modified_memref(parse, modified_memref->memref.value.size, + &modified_memref->parent, modified_memref->modifier_type, &modified_memref->modifier); + + operand->value.memref = &dst_modified_memref->memref; + return; + } + } + } + } + else { + const rc_memref_list_t* memref_list = &memrefs->memrefs; + for (; memref_list; memref_list = memref_list->next) { + const rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_end = memref + memref_list->count; + + for (; memref < memref_end; ++memref) { + if (src_memref == memref) { + operand->value.memref = rc_alloc_memref(parse, memref->address, memref->value.size); + return; + } + } + } + } + } +} + +void rc_preparse_copy_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs) +{ + const rc_memref_list_t* memref_list = &memrefs->memrefs; + const rc_modified_memref_list_t* modified_memref_list = &memrefs->modified_memrefs; + + for (; memref_list; memref_list = memref_list->next) { + const rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_end = memref + memref_list->count; + + for (; memref < memref_end; ++memref) + rc_alloc_memref(parse, memref->address, memref->value.size); + } + + for (; modified_memref_list; modified_memref_list = modified_memref_list->next) { + rc_modified_memref_t* modified_memref = modified_memref_list->items; + const rc_modified_memref_t* modified_memref_end = modified_memref + modified_memref_list->count; + + for (; modified_memref < modified_memref_end; ++modified_memref) { + rc_preparse_sync_operand(&modified_memref->parent, parse, memrefs); + rc_preparse_sync_operand(&modified_memref->modifier, parse, memrefs); + + rc_alloc_modified_memref(parse, modified_memref->memref.value.size, + &modified_memref->parent, modified_memref->modifier_type, &modified_memref->modifier); + } + } +} + +void rc_reset_parse_state(rc_parse_state_t* parse, void* buffer) +{ + parse->buffer = buffer; + + parse->offset = 0; + parse->memrefs = NULL; + parse->existing_memrefs = NULL; + parse->variables = NULL; + parse->measured_target = 0; + parse->lines_read = 0; + parse->addsource_oper = RC_OPERATOR_NONE; + parse->addsource_parent.type = RC_OPERAND_NONE; + parse->indirect_parent.type = RC_OPERAND_NONE; + parse->remember.type = RC_OPERAND_NONE; + parse->is_value = 0; + parse->has_required_hits = 0; + parse->measured_as_percent = 0; + parse->ignore_non_parse_errors = 0; + + parse->scratch.strings = NULL; +} + +void rc_init_parse_state(rc_parse_state_t* parse, void* buffer) +{ + /* could use memset here, but rc_parse_state_t contains a 512 byte buffer that doesn't need to be initialized */ + rc_buffer_init(&parse->scratch.buffer); + memset(&parse->scratch.objs, 0, sizeof(parse->scratch.objs)); + + rc_reset_parse_state(parse, buffer); +} + +void rc_destroy_parse_state(rc_parse_state_t* parse) +{ + rc_buffer_destroy(&parse->scratch.buffer); +} diff --git a/src/rcheevos/src/rcheevos/condition.c b/src/rcheevos/src/rcheevos/condition.c new file mode 100644 index 0000000000..ff6da02bf8 --- /dev/null +++ b/src/rcheevos/src/rcheevos/condition.c @@ -0,0 +1,754 @@ +#include "rc_internal.h" + +#include +#include +#include + +static int rc_test_condition_compare(uint32_t value1, uint32_t value2, uint8_t oper) { + switch (oper) { + case RC_OPERATOR_EQ: return value1 == value2; + case RC_OPERATOR_NE: return value1 != value2; + case RC_OPERATOR_LT: return value1 < value2; + case RC_OPERATOR_LE: return value1 <= value2; + case RC_OPERATOR_GT: return value1 > value2; + case RC_OPERATOR_GE: return value1 >= value2; + default: return 1; + } +} + +static uint8_t rc_condition_determine_comparator(const rc_condition_t* self) { + switch (self->oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_NE: + case RC_OPERATOR_LT: + case RC_OPERATOR_LE: + case RC_OPERATOR_GT: + case RC_OPERATOR_GE: + break; + + default: + /* not a comparison. should not be getting compared. but if it is, legacy behavior was to return 1 */ + return RC_PROCESSING_COMPARE_ALWAYS_TRUE; + } + + if ((self->operand1.type == RC_OPERAND_ADDRESS || self->operand1.type == RC_OPERAND_DELTA) && + /* TODO: allow modified memref comparisons */ + self->operand1.value.memref->value.memref_type == RC_MEMREF_TYPE_MEMREF && !rc_operand_is_float(&self->operand1)) { + /* left side is an integer memory reference */ + int needs_translate = (self->operand1.size != self->operand1.value.memref->value.size); + + if (self->operand2.type == RC_OPERAND_CONST) { + /* right side is a constant */ + if (self->operand1.type == RC_OPERAND_ADDRESS) + return needs_translate ? RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED : RC_PROCESSING_COMPARE_MEMREF_TO_CONST; + + return needs_translate ? RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED : RC_PROCESSING_COMPARE_DELTA_TO_CONST; + } + else if ((self->operand2.type == RC_OPERAND_ADDRESS || self->operand2.type == RC_OPERAND_DELTA) && + self->operand2.value.memref->value.memref_type == RC_MEMREF_TYPE_MEMREF && !rc_operand_is_float(&self->operand2)) { + /* right side is an integer memory reference */ + const int is_same_memref = (self->operand1.value.memref == self->operand2.value.memref); + needs_translate |= (self->operand2.size != self->operand2.value.memref->value.size); + + if (self->operand1.type == RC_OPERAND_ADDRESS) { + if (self->operand2.type == RC_OPERAND_ADDRESS) { + if (is_same_memref && !needs_translate) { + /* comparing a memref to itself, will evaluate to a constant */ + return rc_test_condition_compare(0, 0, self->oper) ? RC_PROCESSING_COMPARE_ALWAYS_TRUE : RC_PROCESSING_COMPARE_ALWAYS_FALSE; + } + + return needs_translate ? RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED : RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF; + } + + assert(self->operand2.type == RC_OPERAND_DELTA); + + if (is_same_memref) { + /* delta comparison is optimized to compare with itself (for detecting change) */ + return needs_translate ? RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED : RC_PROCESSING_COMPARE_MEMREF_TO_DELTA; + } + } + else { + assert(self->operand1.type == RC_OPERAND_DELTA); + + if (self->operand2.type == RC_OPERAND_ADDRESS) { + if (is_same_memref) { + /* delta comparison is optimized to compare with itself (for detecting change) */ + return needs_translate ? RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED : RC_PROCESSING_COMPARE_DELTA_TO_MEMREF; + } + } + } + } + } + + if (self->operand1.type == RC_OPERAND_CONST && self->operand2.type == RC_OPERAND_CONST) { + /* comparing constants will always generate a constant result */ + return rc_test_condition_compare(self->operand1.value.num, self->operand2.value.num, self->oper) ? + RC_PROCESSING_COMPARE_ALWAYS_TRUE : RC_PROCESSING_COMPARE_ALWAYS_FALSE; + } + + return RC_PROCESSING_COMPARE_DEFAULT; +} + +static int rc_parse_operator(const char** memaddr) { + const char* oper = *memaddr; + + switch (*oper) { + case '=': + ++(*memaddr); + (*memaddr) += (**memaddr == '='); + return RC_OPERATOR_EQ; + + case '!': + if (oper[1] == '=') { + (*memaddr) += 2; + return RC_OPERATOR_NE; + } + /* fall through */ + default: + return RC_INVALID_OPERATOR; + + case '<': + if (oper[1] == '=') { + (*memaddr) += 2; + return RC_OPERATOR_LE; + } + + ++(*memaddr); + return RC_OPERATOR_LT; + + case '>': + if (oper[1] == '=') { + (*memaddr) += 2; + return RC_OPERATOR_GE; + } + + ++(*memaddr); + return RC_OPERATOR_GT; + + case '*': + ++(*memaddr); + return RC_OPERATOR_MULT; + + case '/': + ++(*memaddr); + return RC_OPERATOR_DIV; + + case '&': + ++(*memaddr); + return RC_OPERATOR_AND; + + case '^': + ++(*memaddr); + return RC_OPERATOR_XOR; + + case '%': + ++(*memaddr); + return RC_OPERATOR_MOD; + + case '+': + ++(*memaddr); + return RC_OPERATOR_ADD; + + case '-': + ++(*memaddr); + return RC_OPERATOR_SUB; + + case '\0':/* end of string */ + case '_': /* next condition */ + case 'S': /* next condset */ + case ')': /* end of macro */ + case '$': /* maximum of values */ + /* valid condition separator, condition may not have an operator */ + return RC_OPERATOR_NONE; + } +} + +void rc_condition_convert_to_operand(const rc_condition_t* condition, rc_operand_t* operand, rc_parse_state_t* parse) { + if (condition->oper == RC_OPERATOR_NONE) { + if (operand != &condition->operand1) + memcpy(operand, &condition->operand1, sizeof(*operand)); + } + else { + uint8_t new_size = RC_MEMSIZE_32_BITS; + if (rc_operand_is_float(&condition->operand1) || rc_operand_is_float(&condition->operand2)) + new_size = RC_MEMSIZE_FLOAT; + + /* NOTE: this makes the operand include the modification, but we have to also + * leave the modification in the condition so the condition reflects the actual + * definition. This doesn't affect the evaluation logic since this method is only + * called for combining conditions and Measured, and the Measured handling function + * ignores the operator assuming it's been handled by a modified memref chain */ + operand->value.memref = (rc_memref_t*)rc_alloc_modified_memref(parse, + new_size, &condition->operand1, condition->oper, &condition->operand2); + + /* not actually an address, just a non-delta memref read */ + operand->type = operand->memref_access_type = RC_OPERAND_ADDRESS; + + operand->size = new_size; + } +} + +rc_condition_t* rc_parse_condition(const char** memaddr, rc_parse_state_t* parse) { + rc_condition_t * self = RC_ALLOC(rc_condition_t, parse); + rc_parse_condition_internal(self, memaddr, parse); + return (parse->offset < 0) ? NULL : self; +} + +void rc_parse_condition_internal(rc_condition_t* self, const char** memaddr, rc_parse_state_t* parse) { + const char* aux; + int result; + int can_modify = 0; + + aux = *memaddr; + self->current_hits = 0; + self->is_true = 0; + self->optimized_comparator = RC_PROCESSING_COMPARE_DEFAULT; + + if (*aux != 0 && aux[1] == ':') { + switch (*aux) { + case 'p': case 'P': self->type = RC_CONDITION_PAUSE_IF; break; + case 'r': case 'R': self->type = RC_CONDITION_RESET_IF; break; + case 'a': case 'A': self->type = RC_CONDITION_ADD_SOURCE; can_modify = 1; break; + case 'b': case 'B': self->type = RC_CONDITION_SUB_SOURCE; can_modify = 1; break; + case 'c': case 'C': self->type = RC_CONDITION_ADD_HITS; break; + case 'd': case 'D': self->type = RC_CONDITION_SUB_HITS; break; + case 'n': case 'N': self->type = RC_CONDITION_AND_NEXT; break; + case 'o': case 'O': self->type = RC_CONDITION_OR_NEXT; break; + case 'm': case 'M': self->type = RC_CONDITION_MEASURED; break; + case 'q': case 'Q': self->type = RC_CONDITION_MEASURED_IF; break; + case 'i': case 'I': self->type = RC_CONDITION_ADD_ADDRESS; can_modify = 1; break; + case 't': case 'T': self->type = RC_CONDITION_TRIGGER; break; + case 'k': case 'K': self->type = RC_CONDITION_REMEMBER; can_modify = 1; break; + case 'z': case 'Z': self->type = RC_CONDITION_RESET_NEXT_IF; break; + case 'g': case 'G': + parse->measured_as_percent = 1; + self->type = RC_CONDITION_MEASURED; + break; + + /* e f h j l s u v w x y */ + default: + parse->offset = RC_INVALID_CONDITION_TYPE; + return; + } + + aux += 2; + } + else { + self->type = RC_CONDITION_STANDARD; + } + + result = rc_parse_operand(&self->operand1, &aux, parse); + if (result < 0) { + parse->offset = result; + return; + } + + result = rc_parse_operator(&aux); + if (result < 0) { + parse->offset = result; + return; + } + + self->oper = (uint8_t)result; + + if (self->oper == RC_OPERATOR_NONE) { + /* non-modifying statements must have a second operand */ + if (!can_modify) { + /* measured does not require a second operand when used in a value */ + if (self->type != RC_CONDITION_MEASURED && !parse->ignore_non_parse_errors) { + parse->offset = RC_INVALID_OPERATOR; + return; + } + } + + /* provide dummy operand of '1' and no required hits */ + rc_operand_set_const(&self->operand2, 1); + self->required_hits = 0; + *memaddr = aux; + return; + } + + if (can_modify && !rc_operator_is_modifying(self->oper)) { + /* comparison operators are not valid on modifying statements */ + switch (self->type) { + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_SUB_SOURCE: + case RC_CONDITION_ADD_ADDRESS: + /* prevent parse errors on legacy achievements where a condition was present before changing the type */ + self->oper = RC_OPERATOR_NONE; + break; + + default: + if (!parse->ignore_non_parse_errors) { + parse->offset = RC_INVALID_OPERATOR; + return; + } + break; + } + } + + result = rc_parse_operand(&self->operand2, &aux, parse); + if (result < 0) { + parse->offset = result; + return; + } + + if (self->oper == RC_OPERATOR_NONE) { + /* if operator is none, explicitly clear out the right side */ + rc_operand_set_const(&self->operand2, 0); + } + + if (*aux == '(') { + char* end; + self->required_hits = (unsigned)strtoul(++aux, &end, 10); + + if (end == aux || *end != ')') { + parse->offset = RC_INVALID_REQUIRED_HITS; + return; + } + + /* if operator is none, explicitly clear out the required hits */ + if (self->oper == RC_OPERATOR_NONE) + self->required_hits = 0; + else + parse->has_required_hits = 1; + + aux = end + 1; + } + else if (*aux == '.') { + char* end; + self->required_hits = (unsigned)strtoul(++aux, &end, 10); + + if (end == aux || *end != '.') { + parse->offset = RC_INVALID_REQUIRED_HITS; + return; + } + + /* if operator is none, explicitly clear out the required hits */ + if (self->oper == RC_OPERATOR_NONE) + self->required_hits = 0; + else + parse->has_required_hits = 1; + + aux = end + 1; + } + else { + self->required_hits = 0; + } + + if (parse->buffer != 0) + self->optimized_comparator = rc_condition_determine_comparator(self); + + *memaddr = aux; +} + +void rc_condition_update_parse_state(rc_condition_t* condition, rc_parse_state_t* parse) { + /* type of values in the chain are determined by the parent. + * the last element of a chain is determined by the operand + * + * 1 + 1.5 + 1.75 + 1.0 => (int)1 + (int)1 + (int)1 + (float)1 = (float)4.0 + * 1.0 + 1.5 + 1.75 + 1.0 => (float)1.0 + (float)1.5 + (float)1.75 + (float)1.0 = (float)5.25 + * 1.0 + 1.5 + 1.75 + 1 => (float)1.0 + (float)1.5 + (float)1.75 + (int)1 = (int)5 + */ + + switch (condition->type) { + case RC_CONDITION_ADD_ADDRESS: + if (condition->oper != RC_OPERAND_NONE) + rc_condition_convert_to_operand(condition, &parse->indirect_parent, parse); + else + memcpy(&parse->indirect_parent, &condition->operand1, sizeof(parse->indirect_parent)); + + break; + + case RC_CONDITION_ADD_SOURCE: + if (parse->addsource_parent.type == RC_OPERAND_NONE) { + rc_condition_convert_to_operand(condition, &parse->addsource_parent, parse); + } + else { + rc_operand_t cond_operand; + /* type determined by parent */ + const uint8_t new_size = rc_operand_is_float(&parse->addsource_parent) ? RC_MEMSIZE_FLOAT : RC_MEMSIZE_32_BITS; + + rc_condition_convert_to_operand(condition, &cond_operand, parse); + rc_operand_addsource(&cond_operand, parse, new_size); + memcpy(&parse->addsource_parent, &cond_operand, sizeof(cond_operand)); + } + + parse->addsource_oper = RC_OPERATOR_ADD_ACCUMULATOR; + parse->indirect_parent.type = RC_OPERAND_NONE; + break; + + case RC_CONDITION_SUB_SOURCE: + if (parse->addsource_parent.type == RC_OPERAND_NONE) { + rc_condition_convert_to_operand(condition, &parse->addsource_parent, parse); + parse->addsource_oper = RC_OPERATOR_SUB_PARENT; + } + else { + rc_operand_t cond_operand; + /* type determined by parent */ + const uint8_t new_size = rc_operand_is_float(&parse->addsource_parent) ? RC_MEMSIZE_FLOAT : RC_MEMSIZE_32_BITS; + + if (parse->addsource_oper == RC_OPERATOR_ADD_ACCUMULATOR && !rc_operand_is_memref(&parse->addsource_parent)) { + /* if the previous element was a constant we have to turn it into a memref by adding zero */ + rc_modified_memref_t* memref; + rc_operand_t zero; + rc_operand_set_const(&zero, 0); + memref = rc_alloc_modified_memref(parse, + parse->addsource_parent.size, &parse->addsource_parent, RC_OPERATOR_ADD_ACCUMULATOR, &zero); + parse->addsource_parent.value.memref = (rc_memref_t*)memref; + parse->addsource_parent.type = RC_OPERAND_ADDRESS; + } + else if (parse->addsource_oper == RC_OPERATOR_SUB_PARENT) { + /* if the previous element was also a SubSource, we have to insert a 0 and start subtracting from there */ + rc_modified_memref_t* negate; + rc_operand_t zero; + + if (rc_operand_is_float(&parse->addsource_parent)) + rc_operand_set_float_const(&zero, 0.0); + else + rc_operand_set_const(&zero, 0); + + negate = rc_alloc_modified_memref(parse, new_size, &parse->addsource_parent, RC_OPERATOR_SUB_PARENT, &zero); + parse->addsource_parent.value.memref = (rc_memref_t*)negate; + parse->addsource_parent.size = zero.size; + } + + /* subtract the condition from the chain */ + parse->addsource_oper = rc_operand_is_memref(&parse->addsource_parent) ? RC_OPERATOR_SUB_ACCUMULATOR : RC_OPERATOR_SUB_PARENT; + rc_condition_convert_to_operand(condition, &cond_operand, parse); + rc_operand_addsource(&cond_operand, parse, new_size); + memcpy(&parse->addsource_parent, &cond_operand, sizeof(cond_operand)); + + /* indicate the next value can be added to the chain */ + parse->addsource_oper = RC_OPERATOR_ADD_ACCUMULATOR; + } + + parse->indirect_parent.type = RC_OPERAND_NONE; + break; + + case RC_CONDITION_REMEMBER: + if (condition->operand1.type == RC_OPERAND_RECALL && + condition->oper == RC_OPERATOR_NONE && + parse->addsource_parent.type == RC_OPERAND_NONE && + parse->indirect_parent.type == RC_OPERAND_NONE) { + /* Remembering {recall} without any modifications is a no-op */ + break; + } + + rc_condition_convert_to_operand(condition, &condition->operand1, parse); + + if (parse->addsource_parent.type != RC_OPERAND_NONE) { + /* type determined by leaf */ + rc_operand_addsource(&condition->operand1, parse, condition->operand1.size); + condition->operand1.is_combining = 1; + } + + memcpy(&parse->remember, &condition->operand1, sizeof(parse->remember)); + + parse->addsource_parent.type = RC_OPERAND_NONE; + parse->indirect_parent.type = RC_OPERAND_NONE; + break; + + case RC_CONDITION_MEASURED: + /* Measured condition can have modifiers in values */ + if (parse->is_value) { + switch (condition->oper) { + case RC_OPERATOR_AND: + case RC_OPERATOR_XOR: + case RC_OPERATOR_DIV: + case RC_OPERATOR_MULT: + case RC_OPERATOR_MOD: + case RC_OPERATOR_ADD: + case RC_OPERATOR_SUB: + rc_condition_convert_to_operand(condition, &condition->operand1, parse); + break; + + default: + break; + } + } + + /* fallthrough */ /* to default */ + + default: + if (parse->addsource_parent.type != RC_OPERAND_NONE) { + /* type determined by leaf */ + if (parse->addsource_oper == RC_OPERATOR_ADD_ACCUMULATOR) + parse->addsource_oper = RC_OPERATOR_ADD; + + rc_operand_addsource(&condition->operand1, parse, condition->operand1.size); + condition->operand1.is_combining = 1; + + if (parse->buffer) + condition->optimized_comparator = rc_condition_determine_comparator(condition); + } + + parse->addsource_parent.type = RC_OPERAND_NONE; + parse->indirect_parent.type = RC_OPERAND_NONE; + break; + } +} + +static const rc_modified_memref_t* rc_operand_get_modified_memref(const rc_operand_t* operand) { + if (!rc_operand_is_memref(operand)) + return NULL; + + if (operand->value.memref->value.memref_type != RC_MEMREF_TYPE_MODIFIED_MEMREF) + return NULL; + + return (rc_modified_memref_t*)operand->value.memref; +} + +/* rc_condition_update_parse_state will mutate the operand1 to point at the modified memref + * containing the accumulated result up until that point. this function returns the original + * unmodified operand1 from parsing the definition. + */ +const rc_operand_t* rc_condition_get_real_operand1(const rc_condition_t* self) { + const rc_operand_t* operand = &self->operand1; + const rc_modified_memref_t* modified_memref; + + if (operand->is_combining) { + /* operand = "previous + current" - extract current */ + const rc_modified_memref_t* combining_modified_memref = rc_operand_get_modified_memref(operand); + if (combining_modified_memref) + operand = &combining_modified_memref->modifier; + } + + /* modifying operators are merged into an rc_modified_memref_t + * if operand1 is a modified memref, assume it's been merged with the right side and + * extract the parent which is the actual operand1. */ + modified_memref = rc_operand_get_modified_memref(operand); + if (modified_memref) { + if (modified_memref->modifier_type == RC_OPERATOR_INDIRECT_READ) { + /* if the modified memref is an indirect read, the parent is the indirect + * address and the modifier is the offset. the actual size and address are + * stored in the modified memref - use it */ + } else if (rc_operator_is_modifying(self->oper) && self->oper != RC_OPERATOR_NONE) { + /* operand = "parent*modifier" - extract parent.modifier will already be in operand2 */ + operand = &modified_memref->parent; + } + } + + return operand; +} + +int rc_condition_is_combining(const rc_condition_t* self) { + switch (self->type) { + case RC_CONDITION_STANDARD: + case RC_CONDITION_PAUSE_IF: + case RC_CONDITION_RESET_IF: + case RC_CONDITION_MEASURED_IF: + case RC_CONDITION_TRIGGER: + case RC_CONDITION_MEASURED: + return 0; + + default: + return 1; + } +} + +static int rc_test_condition_compare_memref_to_const(rc_condition_t* self) { + const uint32_t value1 = self->operand1.value.memref->value.value; + const uint32_t value2 = self->operand2.value.num; + assert(self->operand1.size == self->operand1.value.memref->value.size); + return rc_test_condition_compare(value1, value2, self->oper); +} + +static int rc_test_condition_compare_delta_to_const(rc_condition_t* self) { + const rc_memref_value_t* memref1 = &self->operand1.value.memref->value; + const uint32_t value1 = (memref1->changed) ? memref1->prior : memref1->value; + const uint32_t value2 = self->operand2.value.num; + assert(self->operand1.size == self->operand1.value.memref->value.size); + return rc_test_condition_compare(value1, value2, self->oper); +} + +static int rc_test_condition_compare_memref_to_memref(rc_condition_t* self) { + const uint32_t value1 = self->operand1.value.memref->value.value; + const uint32_t value2 = self->operand2.value.memref->value.value; + assert(self->operand1.size == self->operand1.value.memref->value.size); + assert(self->operand2.size == self->operand2.value.memref->value.size); + return rc_test_condition_compare(value1, value2, self->oper); +} + +static int rc_test_condition_compare_memref_to_delta(rc_condition_t* self) { + const rc_memref_value_t* memref = &self->operand1.value.memref->value; + assert(self->operand1.value.memref == self->operand2.value.memref); + assert(self->operand1.size == self->operand1.value.memref->value.size); + assert(self->operand2.size == self->operand2.value.memref->value.size); + + if (memref->changed) + return rc_test_condition_compare(memref->value, memref->prior, self->oper); + + switch (self->oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_GE: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } +} + +static int rc_test_condition_compare_delta_to_memref(rc_condition_t* self) { + const rc_memref_value_t* memref = &self->operand1.value.memref->value; + assert(self->operand1.value.memref == self->operand2.value.memref); + assert(self->operand1.size == self->operand1.value.memref->value.size); + assert(self->operand2.size == self->operand2.value.memref->value.size); + + if (memref->changed) + return rc_test_condition_compare(memref->prior, memref->value, self->oper); + + switch (self->oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_GE: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } +} + +static int rc_test_condition_compare_memref_to_const_transformed(rc_condition_t* self) { + rc_typed_value_t value1; + const uint32_t value2 = self->operand2.value.num; + + value1.type = RC_VALUE_TYPE_UNSIGNED; + value1.value.u32 = self->operand1.value.memref->value.value; + rc_transform_memref_value(&value1, self->operand1.size); + + return rc_test_condition_compare(value1.value.u32, value2, self->oper); +} + +static int rc_test_condition_compare_delta_to_const_transformed(rc_condition_t* self) { + rc_typed_value_t value1; + const rc_memref_value_t* memref1 = &self->operand1.value.memref->value; + const uint32_t value2 = self->operand2.value.num; + + value1.type = RC_VALUE_TYPE_UNSIGNED; + value1.value.u32 = (memref1->changed) ? memref1->prior : memref1->value; + rc_transform_memref_value(&value1, self->operand1.size); + + return rc_test_condition_compare(value1.value.u32, value2, self->oper); +} + +static int rc_test_condition_compare_memref_to_memref_transformed(rc_condition_t* self) { + rc_typed_value_t value1, value2; + + value1.type = RC_VALUE_TYPE_UNSIGNED; + value1.value.u32 = self->operand1.value.memref->value.value; + rc_transform_memref_value(&value1, self->operand1.size); + + value2.type = RC_VALUE_TYPE_UNSIGNED; + value2.value.u32 = self->operand2.value.memref->value.value; + rc_transform_memref_value(&value2, self->operand2.size); + + return rc_test_condition_compare(value1.value.u32, value2.value.u32, self->oper); +} + +static int rc_test_condition_compare_memref_to_delta_transformed(rc_condition_t* self) { + const rc_memref_value_t* memref = &self->operand1.value.memref->value; + assert(self->operand1.value.memref == self->operand2.value.memref); + + if (memref->changed) { + rc_typed_value_t value1, value2; + + value1.type = RC_VALUE_TYPE_UNSIGNED; + value1.value.u32 = memref->value; + rc_transform_memref_value(&value1, self->operand1.size); + + value2.type = RC_VALUE_TYPE_UNSIGNED; + value2.value.u32 = memref->prior; + rc_transform_memref_value(&value2, self->operand2.size); + + return rc_test_condition_compare(value1.value.u32, value2.value.u32, self->oper); + } + + switch (self->oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_GE: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } +} + +static int rc_test_condition_compare_delta_to_memref_transformed(rc_condition_t* self) { + const rc_memref_value_t* memref = &self->operand1.value.memref->value; + assert(self->operand1.value.memref == self->operand2.value.memref); + + if (memref->changed) { + rc_typed_value_t value1, value2; + + value1.type = RC_VALUE_TYPE_UNSIGNED; + value1.value.u32 = memref->prior; + rc_transform_memref_value(&value1, self->operand1.size); + + value2.type = RC_VALUE_TYPE_UNSIGNED; + value2.value.u32 = memref->value; + rc_transform_memref_value(&value2, self->operand2.size); + + return rc_test_condition_compare(value1.value.u32, value2.value.u32, self->oper); + } + + switch (self->oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_GE: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } +} + +int rc_test_condition(rc_condition_t* self, rc_eval_state_t* eval_state) { + rc_typed_value_t value1, value2; + + /* use an optimized comparator whenever possible */ + switch (self->optimized_comparator) { + case RC_PROCESSING_COMPARE_MEMREF_TO_CONST: + return rc_test_condition_compare_memref_to_const(self); + case RC_PROCESSING_COMPARE_MEMREF_TO_DELTA: + return rc_test_condition_compare_memref_to_delta(self); + case RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF: + return rc_test_condition_compare_memref_to_memref(self); + case RC_PROCESSING_COMPARE_DELTA_TO_CONST: + return rc_test_condition_compare_delta_to_const(self); + case RC_PROCESSING_COMPARE_DELTA_TO_MEMREF: + return rc_test_condition_compare_delta_to_memref(self); + case RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED: + return rc_test_condition_compare_memref_to_const_transformed(self); + case RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED: + return rc_test_condition_compare_memref_to_delta_transformed(self); + case RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED: + return rc_test_condition_compare_memref_to_memref_transformed(self); + case RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED: + return rc_test_condition_compare_delta_to_const_transformed(self); + case RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED: + return rc_test_condition_compare_delta_to_memref_transformed(self); + case RC_PROCESSING_COMPARE_ALWAYS_TRUE: + return 1; + case RC_PROCESSING_COMPARE_ALWAYS_FALSE: + return 0; + default: + rc_evaluate_operand(&value1, &self->operand1, eval_state); + break; + } + + rc_evaluate_operand(&value2, &self->operand2, eval_state); + + return rc_typed_value_compare(&value1, &value2, self->oper); +} + +void rc_evaluate_condition_value(rc_typed_value_t* value, rc_condition_t* self, rc_eval_state_t* eval_state) { + rc_typed_value_t amount; + + rc_evaluate_operand(value, &self->operand1, eval_state); + rc_evaluate_operand(&amount, &self->operand2, eval_state); + + rc_typed_value_combine(value, &amount, self->oper); +} diff --git a/src/rcheevos/src/rcheevos/condset.c b/src/rcheevos/src/rcheevos/condset.c new file mode 100644 index 0000000000..df067a24f5 --- /dev/null +++ b/src/rcheevos/src/rcheevos/condset.c @@ -0,0 +1,770 @@ +#include "rc_internal.h" + +#include /* memcpy */ + +enum { + RC_CONDITION_CLASSIFICATION_COMBINING, + RC_CONDITION_CLASSIFICATION_PAUSE, + RC_CONDITION_CLASSIFICATION_RESET, + RC_CONDITION_CLASSIFICATION_HITTARGET, + RC_CONDITION_CLASSIFICATION_MEASURED, + RC_CONDITION_CLASSIFICATION_OTHER, + RC_CONDITION_CLASSIFICATION_INDIRECT +}; + +static int rc_classify_condition(const rc_condition_t* cond) { + switch (cond->type) { + case RC_CONDITION_PAUSE_IF: + return RC_CONDITION_CLASSIFICATION_PAUSE; + + case RC_CONDITION_RESET_IF: + return RC_CONDITION_CLASSIFICATION_RESET; + + case RC_CONDITION_ADD_ADDRESS: + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_SUB_SOURCE: + /* these are handled by rc_modified_memref_t */ + return RC_CONDITION_CLASSIFICATION_INDIRECT; + + case RC_CONDITION_ADD_HITS: + case RC_CONDITION_AND_NEXT: + case RC_CONDITION_OR_NEXT: + case RC_CONDITION_REMEMBER: + case RC_CONDITION_RESET_NEXT_IF: + case RC_CONDITION_SUB_HITS: + return RC_CONDITION_CLASSIFICATION_COMBINING; + + case RC_CONDITION_MEASURED: + case RC_CONDITION_MEASURED_IF: + /* even if not measuring a hit target, we still want to evaluate it every frame */ + return RC_CONDITION_CLASSIFICATION_MEASURED; + + default: + if (cond->required_hits != 0) + return RC_CONDITION_CLASSIFICATION_HITTARGET; + + return RC_CONDITION_CLASSIFICATION_OTHER; + } +} + +static int32_t rc_classify_conditions(rc_condset_t* self, const char* memaddr, const rc_parse_state_t* parent_parse) { + rc_parse_state_t parse; + rc_memrefs_t memrefs; + rc_condition_t condition; + int classification; + uint32_t index = 0; + uint32_t chain_length = 1; + + rc_init_parse_state(&parse, NULL); + rc_init_parse_state_memrefs(&parse, &memrefs); + parse.ignore_non_parse_errors = parent_parse->ignore_non_parse_errors; + + do { + rc_parse_condition_internal(&condition, &memaddr, &parse); + + if (parse.offset < 0) { + rc_destroy_parse_state(&parse); + return parse.offset; + } + + ++index; + + classification = rc_classify_condition(&condition); + switch (classification) { + case RC_CONDITION_CLASSIFICATION_COMBINING: + ++chain_length; + continue; + + case RC_CONDITION_CLASSIFICATION_INDIRECT: + ++self->num_indirect_conditions; + continue; + + case RC_CONDITION_CLASSIFICATION_PAUSE: + self->num_pause_conditions += chain_length; + break; + + case RC_CONDITION_CLASSIFICATION_RESET: + self->num_reset_conditions += chain_length; + break; + + case RC_CONDITION_CLASSIFICATION_HITTARGET: + self->num_hittarget_conditions += chain_length; + break; + + case RC_CONDITION_CLASSIFICATION_MEASURED: + self->num_measured_conditions += chain_length; + break; + + default: + self->num_other_conditions += chain_length; + break; + } + + chain_length = 1; + } while (*memaddr++ == '_'); + + /* any combining conditions that don't actually feed into a non-combining condition + * need to still have space allocated for them. put them in "other" to match the + * logic in rc_find_next_classification */ + self->num_other_conditions += chain_length - 1; + + rc_destroy_parse_state(&parse); + + return (int32_t)index; +} + +static int rc_find_next_classification(const char* memaddr) { + rc_parse_state_t parse; + rc_memrefs_t memrefs; + rc_condition_t condition; + int classification; + + rc_init_parse_state(&parse, NULL); + rc_init_parse_state_memrefs(&parse, &memrefs); + + do { + rc_parse_condition_internal(&condition, &memaddr, &parse); + if (parse.offset < 0) + break; + + classification = rc_classify_condition(&condition); + switch (classification) { + case RC_CONDITION_CLASSIFICATION_COMBINING: + case RC_CONDITION_CLASSIFICATION_INDIRECT: + break; + + default: + return classification; + } + } while (*memaddr++ == '_'); + + return RC_CONDITION_CLASSIFICATION_OTHER; +} + +static void rc_condition_update_recall_operand(rc_operand_t* operand, const rc_operand_t* remember) +{ + if (operand->type == RC_OPERAND_RECALL) { + if (rc_operand_type_is_memref(operand->memref_access_type) && operand->value.memref == NULL) { + memcpy(operand, remember, sizeof(*remember)); + operand->memref_access_type = operand->type; + operand->type = RC_OPERAND_RECALL; + } + } + else if (rc_operand_is_memref(operand) && operand->value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF) { + rc_modified_memref_t* modified_memref = (rc_modified_memref_t*)operand->value.memref; + rc_condition_update_recall_operand(&modified_memref->parent, remember); + rc_condition_update_recall_operand(&modified_memref->modifier, remember); + } +} + +static void rc_update_condition_pause_remember(rc_condset_t* self) { + rc_operand_t* pause_remember = NULL; + rc_condition_t* condition; + rc_condition_t* pause_conditions; + const rc_condition_t* end_pause_condition; + + /* ASSERT: pause conditions are first conditions */ + pause_conditions = rc_condset_get_conditions(self); + end_pause_condition = pause_conditions + self->num_pause_conditions; + + for (condition = pause_conditions; condition < end_pause_condition; ++condition) { + if (condition->type == RC_CONDITION_REMEMBER) { + pause_remember = &condition->operand1; + } + else if (pause_remember == NULL) { + /* if we picked up a non-pause remember, discard it */ + if (condition->operand1.type == RC_OPERAND_RECALL && + rc_operand_type_is_memref(condition->operand1.memref_access_type)) { + condition->operand1.value.memref = NULL; + } + + if (condition->operand2.type == RC_OPERAND_RECALL && + rc_operand_type_is_memref(condition->operand2.memref_access_type)) { + condition->operand2.value.memref = NULL; + } + } + } + + if (pause_remember) { + for (condition = self->conditions; condition; condition = condition->next) { + if (condition >= end_pause_condition) { + /* if we didn't find a remember for a non-pause condition, use the last pause remember */ + rc_condition_update_recall_operand(&condition->operand1, pause_remember); + rc_condition_update_recall_operand(&condition->operand2, pause_remember); + } + + /* Anything after this point will have already been handled */ + if (condition->type == RC_CONDITION_REMEMBER) + break; + } + } +} + +rc_condset_t* rc_parse_condset(const char** memaddr, rc_parse_state_t* parse) { + rc_condset_with_trailing_conditions_t* condset_with_conditions; + rc_condset_t local_condset; + rc_condset_t* self; + rc_condition_t condition; + rc_condition_t* conditions; + rc_condition_t** next; + rc_condition_t* pause_conditions = NULL; + rc_condition_t* reset_conditions = NULL; + rc_condition_t* hittarget_conditions = NULL; + rc_condition_t* measured_conditions = NULL; + rc_condition_t* other_conditions = NULL; + rc_condition_t* indirect_conditions = NULL; + int classification, combining_classification = RC_CONDITION_CLASSIFICATION_COMBINING; + uint32_t measured_target = 0; + int32_t result; + + if (**memaddr == 'S' || **memaddr == 's' || !**memaddr) { + /* empty group - editor allows it, so we have to support it */ + self = RC_ALLOC(rc_condset_t, parse); + memset(self, 0, sizeof(*self)); + return self; + } + + memset(&local_condset, 0, sizeof(local_condset)); + result = rc_classify_conditions(&local_condset, *memaddr, parse); + if (result < 0) { + parse->offset = result; + return NULL; + } + + condset_with_conditions = RC_ALLOC_WITH_TRAILING(rc_condset_with_trailing_conditions_t, + rc_condition_t, conditions, result, parse); + if (parse->offset < 0) + return NULL; + + self = (rc_condset_t*)condset_with_conditions; + memcpy(self, &local_condset, sizeof(local_condset)); + conditions = &condset_with_conditions->conditions[0]; + + if (parse->buffer) { + pause_conditions = conditions; + conditions += self->num_pause_conditions; + + reset_conditions = conditions; + conditions += self->num_reset_conditions; + + hittarget_conditions = conditions; + conditions += self->num_hittarget_conditions; + + measured_conditions = conditions; + conditions += self->num_measured_conditions; + + other_conditions = conditions; + conditions += self->num_other_conditions; + + indirect_conditions = conditions; + } + + next = &self->conditions; + + /* each condition set has a functionally new recall accumulator */ + parse->remember.type = RC_OPERAND_NONE; + + for (;;) { + rc_parse_condition_internal(&condition, memaddr, parse); + + if (parse->offset < 0) + return NULL; + + if (condition.oper == RC_OPERATOR_NONE && !parse->ignore_non_parse_errors) { + switch (condition.type) { + case RC_CONDITION_ADD_ADDRESS: + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_SUB_SOURCE: + case RC_CONDITION_REMEMBER: + /* these conditions don't require a right hand side (implied *1) */ + break; + + case RC_CONDITION_MEASURED: + /* right hand side is not required when Measured is used in a value */ + if (parse->is_value) + break; + /* fallthrough */ /* to default */ + + default: + parse->offset = RC_INVALID_OPERATOR; + return NULL; + } + } + + switch (condition.type) { + case RC_CONDITION_MEASURED: + if (measured_target != 0) { + /* multiple Measured flags cannot exist in the same group */ + if (!parse->ignore_non_parse_errors) { + parse->offset = RC_MULTIPLE_MEASURED; + return NULL; + } + } + else if (parse->is_value) { + measured_target = (uint32_t)-1; + if (!rc_operator_is_modifying(condition.oper)) { + /* measuring comparison in a value results in a tally (hit count). set target to MAX_INT */ + condition.required_hits = measured_target; + } + } + else if (condition.required_hits != 0) { + measured_target = condition.required_hits; + } + else if (condition.operand2.type == RC_OPERAND_CONST) { + measured_target = condition.operand2.value.num; + } + else if (condition.operand2.type == RC_OPERAND_FP) { + measured_target = (unsigned)condition.operand2.value.dbl; + } + else if (!parse->ignore_non_parse_errors) { + parse->offset = RC_INVALID_MEASURED_TARGET; + return NULL; + } + + if (parse->measured_target && measured_target != parse->measured_target) { + /* multiple Measured flags in separate groups must have the same target */ + if (!parse->ignore_non_parse_errors) { + parse->offset = RC_MULTIPLE_MEASURED; + return NULL; + } + } + + parse->measured_target = measured_target; + break; + + case RC_CONDITION_STANDARD: + case RC_CONDITION_TRIGGER: + /* these flags are not allowed in value expressions */ + if (parse->is_value && !parse->ignore_non_parse_errors) { + parse->offset = RC_INVALID_VALUE_FLAG; + return NULL; + } + break; + } + + rc_condition_update_parse_state(&condition, parse); + + if (parse->buffer) { + classification = rc_classify_condition(&condition); + if (classification == RC_CONDITION_CLASSIFICATION_COMBINING) { + if (combining_classification == RC_CONDITION_CLASSIFICATION_COMBINING) { + if (**memaddr == '_') + combining_classification = rc_find_next_classification(&(*memaddr)[1]); /* skip over '_' */ + else + combining_classification = RC_CONDITION_CLASSIFICATION_OTHER; + } + + classification = combining_classification; + } + else { + combining_classification = RC_CONDITION_CLASSIFICATION_COMBINING; + } + + switch (classification) { + case RC_CONDITION_CLASSIFICATION_PAUSE: + memcpy(pause_conditions, &condition, sizeof(condition)); + *next = pause_conditions++; + break; + + case RC_CONDITION_CLASSIFICATION_RESET: + memcpy(reset_conditions, &condition, sizeof(condition)); + *next = reset_conditions++; + break; + + case RC_CONDITION_CLASSIFICATION_HITTARGET: + memcpy(hittarget_conditions, &condition, sizeof(condition)); + *next = hittarget_conditions++; + break; + + case RC_CONDITION_CLASSIFICATION_MEASURED: + memcpy(measured_conditions, &condition, sizeof(condition)); + *next = measured_conditions++; + break; + + case RC_CONDITION_CLASSIFICATION_INDIRECT: + memcpy(indirect_conditions, &condition, sizeof(condition)); + *next = indirect_conditions++; + break; + + default: + memcpy(other_conditions, &condition, sizeof(condition)); + *next = other_conditions++; + break; + } + + next = &(*next)->next; + } + + if (**memaddr != '_') + break; + + (*memaddr)++; + } + + *next = NULL; + + self->has_pause = self->num_pause_conditions > 0; + if (self->has_pause && parse->buffer && parse->remember.type != RC_OPERAND_NONE) + rc_update_condition_pause_remember(self); + + return self; +} + +static uint8_t rc_condset_evaluate_condition_no_add_hits(rc_condition_t* condition, rc_eval_state_t* eval_state) { + /* evaluate the current condition */ + uint8_t cond_valid = (uint8_t)rc_test_condition(condition, eval_state); + condition->is_true = cond_valid; + + if (eval_state->reset_next) { + /* previous ResetNextIf resets the hit count on this condition and prevents it from being true */ + eval_state->was_cond_reset |= (condition->current_hits != 0); + + condition->current_hits = 0; + cond_valid = 0; + } + else { + /* apply chained logic flags */ + cond_valid &= eval_state->and_next; + cond_valid |= eval_state->or_next; + + if (cond_valid) { + /* true conditions should update their hit count */ + eval_state->has_hits = 1; + + if (condition->required_hits == 0) { + /* no target hit count, just keep tallying */ + ++condition->current_hits; + } + else if (condition->current_hits < condition->required_hits) { + /* target hit count hasn't been met, tally and revalidate - only true if hit count becomes met */ + ++condition->current_hits; + cond_valid = (condition->current_hits == condition->required_hits); + } + else { + /* target hit count has been met, do nothing */ + } + } + else if (condition->current_hits > 0) { + /* target has been true in the past, if the hit target is met, consider it true now */ + eval_state->has_hits = 1; + cond_valid = (condition->current_hits == condition->required_hits); + } + } + + /* reset chained logic flags for the next condition */ + eval_state->and_next = 1; + eval_state->or_next = 0; + + return cond_valid; +} + +static uint32_t rc_condset_evaluate_total_hits(rc_condition_t* condition, rc_eval_state_t* eval_state) { + uint32_t total_hits = condition->current_hits; + + if (condition->required_hits != 0) { + /* if the condition has a target hit count, we have to recalculate cond_valid including the AddHits counter */ + const int32_t signed_hits = (int32_t)condition->current_hits + eval_state->add_hits; + total_hits = (signed_hits >= 0) ? (uint32_t)signed_hits : 0; + } + else { + /* no target hit count. we can't tell if the add_hits value is from this frame or not, so ignore it. + complex condition will only be true if the current condition is true */ + } + + eval_state->add_hits = 0; + + return total_hits; +} + +static uint8_t rc_condset_evaluate_condition(rc_condition_t* condition, rc_eval_state_t* eval_state) { + uint8_t cond_valid = rc_condset_evaluate_condition_no_add_hits(condition, eval_state); + + if (eval_state->add_hits != 0 && condition->required_hits != 0) { + uint32_t total_hits = rc_condset_evaluate_total_hits(condition, eval_state); + cond_valid = (total_hits >= condition->required_hits); + } + + /* reset logic flags for the next condition */ + eval_state->reset_next = 0; + + return cond_valid; +} + +static void rc_condset_evaluate_standard(rc_condition_t* condition, rc_eval_state_t* eval_state) { + const uint8_t cond_valid = rc_condset_evaluate_condition(condition, eval_state); + + eval_state->is_true &= cond_valid; + eval_state->is_primed &= cond_valid; + + if (!cond_valid && eval_state->can_short_curcuit) + eval_state->stop_processing = 1; +} + +static void rc_condset_evaluate_pause_if(rc_condition_t* condition, rc_eval_state_t* eval_state) { + const uint8_t cond_valid = rc_condset_evaluate_condition(condition, eval_state); + + if (cond_valid) { + eval_state->is_paused = 1; + + /* set cannot be valid if it's paused */ + eval_state->is_true = eval_state->is_primed = 0; + + /* as soon as we find a PauseIf that evaluates to true, stop processing the rest of the group */ + eval_state->stop_processing = 1; + } + else if (condition->required_hits == 0) { + /* PauseIf didn't evaluate true, and doesn't have a HitCount, reset the HitCount to indicate the condition didn't match */ + condition->current_hits = 0; + } + else { + /* PauseIf has a HitCount that hasn't been met, ignore it for now. */ + } +} + +static void rc_condset_evaluate_reset_if(rc_condition_t* condition, rc_eval_state_t* eval_state) { + const uint8_t cond_valid = rc_condset_evaluate_condition(condition, eval_state); + + if (cond_valid) { + /* flag the condition as being responsible for the reset */ + /* make sure not to modify bit0, as we use bitwise-and operators to combine truthiness */ + condition->is_true |= 0x02; + + /* set cannot be valid if we've hit a reset condition */ + eval_state->is_true = eval_state->is_primed = 0; + + /* let caller know to reset all hit counts */ + eval_state->was_reset = 1; + + /* can stop processing once an active ResetIf is encountered */ + eval_state->stop_processing = 1; + } +} + +static void rc_condset_evaluate_trigger(rc_condition_t* condition, rc_eval_state_t* eval_state) { + const uint8_t cond_valid = rc_condset_evaluate_condition(condition, eval_state); + + eval_state->is_true &= cond_valid; +} + +static void rc_condset_evaluate_measured(rc_condition_t* condition, rc_eval_state_t* eval_state) { + if (condition->required_hits == 0) { + rc_condset_evaluate_standard(condition, eval_state); + + /* Measured condition without a hit target measures the value of the left operand */ + rc_evaluate_operand(&eval_state->measured_value, &condition->operand1, eval_state); + eval_state->measured_from_hits = 0; + } + else { + /* this largely mimicks rc_condset_evaluate_condition, but captures the total_hits */ + uint8_t cond_valid = rc_condset_evaluate_condition_no_add_hits(condition, eval_state); + const uint32_t total_hits = rc_condset_evaluate_total_hits(condition, eval_state); + + cond_valid = (total_hits >= condition->required_hits); + eval_state->is_true &= cond_valid; + eval_state->is_primed &= cond_valid; + + /* if there is a hit target, capture the current hits */ + eval_state->measured_value.value.u32 = total_hits; + eval_state->measured_value.type = RC_VALUE_TYPE_UNSIGNED; + eval_state->measured_from_hits = 1; + + /* reset logic flags for the next condition */ + eval_state->reset_next = 0; + } +} + +static void rc_condset_evaluate_measured_if(rc_condition_t* condition, rc_eval_state_t* eval_state) { + const uint8_t cond_valid = rc_condset_evaluate_condition(condition, eval_state); + + eval_state->is_true &= cond_valid; + eval_state->is_primed &= cond_valid; + eval_state->can_measure &= cond_valid; +} + +static void rc_condset_evaluate_add_hits(rc_condition_t* condition, rc_eval_state_t* eval_state) { + rc_condset_evaluate_condition_no_add_hits(condition, eval_state); + + eval_state->add_hits += (int32_t)condition->current_hits; + + /* ResetNextIf was applied to this AddHits condition; don't apply it to future conditions */ + eval_state->reset_next = 0; +} + +static void rc_condset_evaluate_sub_hits(rc_condition_t* condition, rc_eval_state_t* eval_state) { + rc_condset_evaluate_condition_no_add_hits(condition, eval_state); + + eval_state->add_hits -= (int32_t)condition->current_hits; + + /* ResetNextIf was applied to this AddHits condition; don't apply it to future conditions */ + eval_state->reset_next = 0; +} + +static void rc_condset_evaluate_reset_next_if(rc_condition_t* condition, rc_eval_state_t* eval_state) { + eval_state->reset_next = rc_condset_evaluate_condition_no_add_hits(condition, eval_state); +} + +static void rc_condset_evaluate_and_next(rc_condition_t* condition, rc_eval_state_t* eval_state) { + eval_state->and_next = rc_condset_evaluate_condition_no_add_hits(condition, eval_state); +} + +static void rc_condset_evaluate_or_next(rc_condition_t* condition, rc_eval_state_t* eval_state) { + eval_state->or_next = rc_condset_evaluate_condition_no_add_hits(condition, eval_state); +} + +void rc_test_condset_internal(rc_condition_t* condition, uint32_t num_conditions, + rc_eval_state_t* eval_state, int can_short_circuit) { + const rc_condition_t* condition_end = condition + num_conditions; + for (; condition < condition_end; ++condition) { + switch (condition->type) { + case RC_CONDITION_STANDARD: + rc_condset_evaluate_standard(condition, eval_state); + break; + case RC_CONDITION_PAUSE_IF: + rc_condset_evaluate_pause_if(condition, eval_state); + break; + case RC_CONDITION_RESET_IF: + rc_condset_evaluate_reset_if(condition, eval_state); + break; + case RC_CONDITION_TRIGGER: + rc_condset_evaluate_trigger(condition, eval_state); + break; + case RC_CONDITION_MEASURED: + rc_condset_evaluate_measured(condition, eval_state); + break; + case RC_CONDITION_MEASURED_IF: + rc_condset_evaluate_measured_if(condition, eval_state); + break; + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_SUB_SOURCE: + case RC_CONDITION_ADD_ADDRESS: + case RC_CONDITION_REMEMBER: + /* these are handled by rc_modified_memref_t */ + break; + case RC_CONDITION_ADD_HITS: + rc_condset_evaluate_add_hits(condition, eval_state); + break; + case RC_CONDITION_SUB_HITS: + rc_condset_evaluate_sub_hits(condition, eval_state); + break; + case RC_CONDITION_RESET_NEXT_IF: + rc_condset_evaluate_reset_next_if(condition, eval_state); + break; + case RC_CONDITION_AND_NEXT: + rc_condset_evaluate_and_next(condition, eval_state); + break; + case RC_CONDITION_OR_NEXT: + rc_condset_evaluate_or_next(condition, eval_state); + break; + default: + eval_state->stop_processing = 1; + eval_state->is_true = eval_state->is_primed = 0; + break; + } + + if (eval_state->stop_processing && can_short_circuit) + break; + } +} + +rc_condition_t* rc_condset_get_conditions(rc_condset_t* self) { + if (self->conditions) + return RC_GET_TRAILING(self, rc_condset_with_trailing_conditions_t, rc_condition_t, conditions); + + return NULL; +} + +int rc_test_condset(rc_condset_t* self, rc_eval_state_t* eval_state) { + rc_condition_t* conditions; + + /* reset the processing state before processing each condset. do not reset the result state. */ + eval_state->measured_value.type = RC_VALUE_TYPE_NONE; + eval_state->add_hits = 0; + eval_state->is_true = 1; + eval_state->is_primed = 1; + eval_state->is_paused = 0; + eval_state->can_measure = 1; + eval_state->measured_from_hits = 0; + eval_state->and_next = 1; + eval_state->or_next = 0; + eval_state->reset_next = 0; + eval_state->stop_processing = 0; + + /* the conditions array is allocated immediately after the rc_condset_t, without a separate pointer */ + conditions = rc_condset_get_conditions(self); + + if (self->num_pause_conditions) { + /* one or more Pause conditions exist. if any of them are true (eval_state->is_paused), + * stop processing this group */ + rc_test_condset_internal(conditions, self->num_pause_conditions, eval_state, 1); + + self->is_paused = eval_state->is_paused; + if (self->is_paused) { + /* condset is paused. stop processing immediately. */ + return 0; + } + + conditions += self->num_pause_conditions; + } + + if (self->num_reset_conditions) { + /* one or more Reset conditions exists. if any of them are true (eval_state->was_reset), + * we'll skip some of the later steps */ + rc_test_condset_internal(conditions, self->num_reset_conditions, eval_state, eval_state->can_short_curcuit); + conditions += self->num_reset_conditions; + } + + if (self->num_hittarget_conditions) { + /* one or more hit target conditions exists. these must be processed every frame, + * unless their hit count is going to be reset */ + if (!eval_state->was_reset) + rc_test_condset_internal(conditions, self->num_hittarget_conditions, eval_state, 0); + + conditions += self->num_hittarget_conditions; + } + + if (self->num_measured_conditions) { + /* IMPORTANT: reset hit counts on these conditions before processing them so + * the MeasuredIf logic and Measured value are correct. + * NOTE: a ResetIf in a later alt group may not have been processed yet. + * Accept that as a weird edge case, and just recommend the user + * move the ResetIf if it becomes a problem. */ + if (eval_state->was_reset) { + int i; + for (i = 0; i < self->num_measured_conditions; ++i) + conditions[i].current_hits = 0; + } + + /* the measured value must be calculated every frame, even if hit counts will be reset */ + rc_test_condset_internal(conditions, self->num_measured_conditions, eval_state, 0); + conditions += self->num_measured_conditions; + + if (eval_state->measured_value.type != RC_VALUE_TYPE_NONE) { + /* if a MeasuredIf was false (!eval_state->can_measure), or the measured + * value is a hitcount and a ResetIf is true, zero out the measured value */ + if (!eval_state->can_measure || + (eval_state->measured_from_hits && eval_state->was_reset)) { + eval_state->measured_value.type = RC_VALUE_TYPE_UNSIGNED; + eval_state->measured_value.value.u32 = 0; + } + } + } + + if (self->num_other_conditions) { + /* the remaining conditions only need to be evaluated if the rest of the condset is true */ + if (eval_state->is_true) + rc_test_condset_internal(conditions, self->num_other_conditions, eval_state, eval_state->can_short_curcuit); + /* something else is false. if we can't short circuit, and there wasn't a reset, we still need to evaluate these */ + else if (!eval_state->can_short_curcuit && !eval_state->was_reset) + rc_test_condset_internal(conditions, self->num_other_conditions, eval_state, eval_state->can_short_curcuit); + } + + return eval_state->is_true; +} + +void rc_reset_condset(rc_condset_t* self) { + rc_condition_t* condition; + + for (condition = self->conditions; condition != 0; condition = condition->next) { + condition->current_hits = 0; + } +} diff --git a/src/rcheevos/src/rcheevos/consoleinfo.c b/src/rcheevos/src/rcheevos/consoleinfo.c new file mode 100644 index 0000000000..aeecb38d2c --- /dev/null +++ b/src/rcheevos/src/rcheevos/consoleinfo.c @@ -0,0 +1,1215 @@ +#include "rc_consoles.h" + +#include + +const char* rc_console_name(uint32_t console_id) +{ + switch (console_id) + { + case RC_CONSOLE_3DO: + return "3DO"; + + case RC_CONSOLE_AMIGA: + return "Amiga"; + + case RC_CONSOLE_AMSTRAD_PC: + return "Amstrad CPC"; + + case RC_CONSOLE_APPLE_II: + return "Apple II"; + + case RC_CONSOLE_ARCADE: + return "Arcade"; + + case RC_CONSOLE_ARCADIA_2001: + return "Arcadia 2001"; + + case RC_CONSOLE_ARDUBOY: + return "Arduboy"; + + case RC_CONSOLE_ATARI_2600: + return "Atari 2600"; + + case RC_CONSOLE_ATARI_5200: + return "Atari 5200"; + + case RC_CONSOLE_ATARI_7800: + return "Atari 7800"; + + case RC_CONSOLE_ATARI_JAGUAR: + return "Atari Jaguar"; + + case RC_CONSOLE_ATARI_JAGUAR_CD: + return "Atari Jaguar CD"; + + case RC_CONSOLE_ATARI_LYNX: + return "Atari Lynx"; + + case RC_CONSOLE_ATARI_ST: + return "Atari ST"; + + case RC_CONSOLE_CASSETTEVISION: + return "CassetteVision"; + + case RC_CONSOLE_CDI: + return "CD-I"; + + case RC_CONSOLE_COLECOVISION: + return "ColecoVision"; + + case RC_CONSOLE_COMMODORE_64: + return "Commodore 64"; + + case RC_CONSOLE_DREAMCAST: + return "Dreamcast"; + + case RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER: + return "Elektor TV Games Computer"; + + case RC_CONSOLE_EVENTS: + return "Events"; + + case RC_CONSOLE_FAIRCHILD_CHANNEL_F: + return "Fairchild Channel F"; + + case RC_CONSOLE_FAMICOM_DISK_SYSTEM: + return "Famicom Disk System"; + + case RC_CONSOLE_FM_TOWNS: + return "FM Towns"; + + case RC_CONSOLE_GAME_AND_WATCH: + return "Game & Watch"; + + case RC_CONSOLE_GAMEBOY: + return "GameBoy"; + + case RC_CONSOLE_GAMEBOY_ADVANCE: + return "GameBoy Advance"; + + case RC_CONSOLE_GAMEBOY_COLOR: + return "GameBoy Color"; + + case RC_CONSOLE_GAMECUBE: + return "GameCube"; + + case RC_CONSOLE_GAME_GEAR: + return "Game Gear"; + + case RC_CONSOLE_HUBS: + return "Hubs"; + + case RC_CONSOLE_INTELLIVISION: + return "Intellivision"; + + case RC_CONSOLE_INTERTON_VC_4000: + return "Interton VC 4000"; + + case RC_CONSOLE_MAGNAVOX_ODYSSEY2: + return "Magnavox Odyssey 2"; + + case RC_CONSOLE_MASTER_SYSTEM: + return "Master System"; + + case RC_CONSOLE_MEGA_DRIVE: + return "Sega Genesis"; + + case RC_CONSOLE_MEGADUCK: + return "Mega Duck"; + + case RC_CONSOLE_MS_DOS: + return "MS-DOS"; + + case RC_CONSOLE_MSX: + return "MSX"; + + case RC_CONSOLE_NEO_GEO_CD: + return "Neo Geo CD"; + + case RC_CONSOLE_NEOGEO_POCKET: + return "Neo Geo Pocket"; + + case RC_CONSOLE_NINTENDO: + return "Nintendo Entertainment System"; + + case RC_CONSOLE_NINTENDO_64: + return "Nintendo 64"; + + case RC_CONSOLE_NINTENDO_DS: + return "Nintendo DS"; + + case RC_CONSOLE_NINTENDO_DSI: + return "Nintendo DSi"; + + case RC_CONSOLE_NINTENDO_3DS: + return "Nintendo 3DS"; + + case RC_CONSOLE_NOKIA_NGAGE: + return "Nokia N-Gage"; + + case RC_CONSOLE_ORIC: + return "Oric"; + + case RC_CONSOLE_PC6000: + return "PC-6000"; + + case RC_CONSOLE_PC8800: + return "PC-8000/8800"; + + case RC_CONSOLE_PC9800: + return "PC-9800"; + + case RC_CONSOLE_PCFX: + return "PC-FX"; + + case RC_CONSOLE_PC_ENGINE: + return "PC Engine"; + + case RC_CONSOLE_PC_ENGINE_CD: + return "PC Engine CD"; + + case RC_CONSOLE_PLAYSTATION: + return "PlayStation"; + + case RC_CONSOLE_PLAYSTATION_2: + return "PlayStation 2"; + + case RC_CONSOLE_PSP: + return "PlayStation Portable"; + + case RC_CONSOLE_POKEMON_MINI: + return "Pokemon Mini"; + + case RC_CONSOLE_SEGA_32X: + return "Sega 32X"; + + case RC_CONSOLE_SEGA_CD: + return "Sega CD"; + + case RC_CONSOLE_PICO: + return "Sega Pico"; + + case RC_CONSOLE_SATURN: + return "Sega Saturn"; + + case RC_CONSOLE_SG1000: + return "SG-1000"; + + case RC_CONSOLE_SHARPX1: + return "Sharp X1"; + + case RC_CONSOLE_STANDALONE: + return "Standalone"; + + case RC_CONSOLE_SUPER_NINTENDO: + return "Super Nintendo Entertainment System"; + + case RC_CONSOLE_SUPER_CASSETTEVISION: + return "Super CassetteVision"; + + case RC_CONSOLE_SUPERVISION: + return "Watara Supervision"; + + case RC_CONSOLE_THOMSONTO8: + return "Thomson TO8"; + + case RC_CONSOLE_TI83: + return "TI-83"; + + case RC_CONSOLE_TIC80: + return "TIC-80"; + + case RC_CONSOLE_UZEBOX: + return "Uzebox"; + + case RC_CONSOLE_VECTREX: + return "Vectrex"; + + case RC_CONSOLE_VIC20: + return "VIC-20"; + + case RC_CONSOLE_VIRTUAL_BOY: + return "Virtual Boy"; + + case RC_CONSOLE_WASM4: + return "WASM-4"; + + case RC_CONSOLE_WII: + return "Wii"; + + case RC_CONSOLE_WII_U: + return "Wii-U"; + + case RC_CONSOLE_WONDERSWAN: + return "WonderSwan"; + + case RC_CONSOLE_X68K: + return "X68K"; + + case RC_CONSOLE_XBOX: + return "XBOX"; + + case RC_CONSOLE_ZEEBO: + return "Zeebo"; + + case RC_CONSOLE_ZX81: + return "ZX-81"; + + case RC_CONSOLE_ZX_SPECTRUM: + return "ZX Spectrum"; + + default: + return "Unknown"; + } +} + +/* ===== 3DO ===== */ +/* http://www.arcaderestoration.com/memorymap/48/3DO+Bios.aspx */ +/* NOTE: the Opera core attempts to expose the NVRAM as RETRO_SAVE_RAM, but the 3DO documentation + * says that applications should only access NVRAM through API calls as it's shared across mulitple + * games. This suggests that even if the core does expose it, it may change depending on which other + * games the user has played - so ignore it. + */ +static const rc_memory_region_t _rc_memory_regions_3do[] = { + { 0x000000U, 0x1FFFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Main RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_3do = { _rc_memory_regions_3do, 1 }; + +/* ===== Amiga ===== */ +/* http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node00D3.html */ +static const rc_memory_region_t _rc_memory_regions_amiga[] = { + { 0x000000U, 0x07FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Main RAM" }, /* 512KB main RAM */ + { 0x080000U, 0x0FFFFFU, 0x080000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" }, /* 512KB extended RAM */ +}; +static const rc_memory_regions_t rc_memory_regions_amiga = { _rc_memory_regions_amiga, 2 }; + +/* ===== Amstrad CPC ===== */ +/* http://www.cpcalive.com/docs/amstrad_cpc_6128_memory_map.html */ +/* https://www.cpcwiki.eu/index.php/File:AWMG_page151.jpg */ +/* The original CPC only had 64KB of memory, but the newer model has 128KB (expandable to 576KB) */ +/* https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#mmr */ +static const rc_memory_region_t _rc_memory_regions_amstrad_pc[] = { + { 0x000000U, 0x00003FU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Firmware" }, + { 0x000040U, 0x00B0FFU, 0x000040U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x00B100U, 0x00BFFFU, 0x00B100U, RC_MEMORY_TYPE_SYSTEM_RAM, "Stack and Firmware Data" }, + { 0x00C000U, 0x00FFFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Screen Memory" }, + { 0x010000U, 0x08FFFFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_amstrad_pc = { _rc_memory_regions_amstrad_pc, 5 }; + +/* ===== Apple II ===== */ +static const rc_memory_region_t _rc_memory_regions_appleii[] = { + { 0x000000U, 0x00FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Main RAM" }, + { 0x010000U, 0x01FFFFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Auxillary RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_appleii = { _rc_memory_regions_appleii, 2 }; + +/* ===== Arcadia 2001 ===== */ +/* https://amigan.yatho.com/a-coding.txt */ +/* RAM banks 1 and 2 only exist on some variant models - no game actually uses them */ +static const rc_memory_region_t _rc_memory_regions_arcadia_2001[] = { + { 0x000000U, 0x0000FFU, 0x001800U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 3 */ + { 0x000100U, 0x0001FFU, 0x001900U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "I/O Area" }, + { 0x000200U, 0x0002FFU, 0x001A00U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 4 */ +}; +static const rc_memory_regions_t rc_memory_regions_arcadia_2001 = { _rc_memory_regions_arcadia_2001, 3 }; + +/* ===== Arduboy ===== */ +/* https://scienceprog.com/avr-microcontroller-memory-map/ (Atmega32) */ +static const rc_memory_region_t _rc_memory_regions_arduboy[] = { + { 0x000000U, 0x0000FFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Registers" }, + /* https://www.dailydot.com/debug/arduboy-kickstarter/ 2.5KB of RAM */ + /* https://github.com/buserror/simavr/blob/1d227277b3d0039f9faef9ea62880ca3051b14f8/simavr/cores/avr/iom32u4.h#L1444-L1445 */ + { 0x000100U, 0x000AFFU, 0x00000100U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* 1KB of EEPROM https://github.com/libretro/arduous/blob/93e1a6289b42ef48de1fcfb96443981725955ad0/src/arduous/arduous.cpp#L453-L455 + * https://github.com/buserror/simavr/blob/1d227277b3d0039f9faef9ea62880ca3051b14f8/simavr/cores/avr/iom32u4.h#L1450 */ + /* EEPROM has it's own addressing scheme starting at $0000. I've chosen to virtualize the address + * at $80000000 to avoid a conflict */ + { 0x000B00U, 0x000EFFU, 0x80000000U, RC_MEMORY_TYPE_SAVE_RAM, "EEPROM" } +}; +static const rc_memory_regions_t rc_memory_regions_arduboy = { _rc_memory_regions_arduboy, 3 }; + +/* ===== Atari 2600 ===== */ +static const rc_memory_region_t _rc_memory_regions_atari2600[] = { + { 0x000000U, 0x00007FU, 0x000080U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_atari2600 = { _rc_memory_regions_atari2600, 1 }; + +/* ===== Atari 7800 ===== */ +/* http://www.atarihq.com/danb/files/78map.txt */ +/* http://pdf.textfiles.com/technical/7800_devkit.pdf */ +static const rc_memory_region_t _rc_memory_regions_atari7800[] = { + { 0x000000U, 0x0017FFU, 0x000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Hardware Interface" }, + { 0x001800U, 0x0027FFU, 0x001800U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x002800U, 0x002FFFU, 0x002800U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirrored RAM" }, + { 0x003000U, 0x0037FFU, 0x003000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirrored RAM" }, + { 0x003800U, 0x003FFFU, 0x003800U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirrored RAM" }, + { 0x004000U, 0x007FFFU, 0x004000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" }, + { 0x008000U, 0x00FFFFU, 0x008000U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM" } +}; +static const rc_memory_regions_t rc_memory_regions_atari7800 = { _rc_memory_regions_atari7800, 7 }; + +/* ===== Atari Jaguar ===== */ +/* https://www.mulle-kybernetik.com/jagdox/memorymap.html */ +static const rc_memory_region_t _rc_memory_regions_atari_jaguar[] = { + { 0x000000U, 0x1FFFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_atari_jaguar = { _rc_memory_regions_atari_jaguar, 1 }; + +/* ===== Atari Lynx ===== */ +/* http://www.retroisle.com/atari/lynx/Technical/Programming/lynxprgdumm.php */ +static const rc_memory_region_t _rc_memory_regions_atari_lynx[] = { + { 0x000000U, 0x0000FFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Zero Page" }, + { 0x000100U, 0x0001FFU, 0x000100U, RC_MEMORY_TYPE_SYSTEM_RAM, "Stack" }, + { 0x000200U, 0x00FBFFU, 0x000200U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x00FC00U, 0x00FCFFU, 0x00FC00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "SUZY hardware access" }, + { 0x00FD00U, 0x00FDFFU, 0x00FD00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "MIKEY hardware access" }, + { 0x00FE00U, 0x00FFF7U, 0x00FE00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Boot ROM" }, + { 0x00FFF8U, 0x00FFFFU, 0x00FFF8U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Hardware vectors" } +}; +static const rc_memory_regions_t rc_memory_regions_atari_lynx = { _rc_memory_regions_atari_lynx, 7 }; + +/* ===== ColecoVision ===== */ +static const rc_memory_region_t _rc_memory_regions_colecovision[] = { + /* "System RAM" refers to the main RAM at 0x6000-0x63FF. However, this RAM might not always be visible. + * If the Super Game Module (SGM) is active, then it might overlay its own RAM at 0x0000-0x1FFF and 0x2000-0x7FFF. + * These positions overlap the BIOS and System RAM, therefore we use virtual addresses for these memory spaces. */ + { 0x000000U, 0x0003FFU, 0x006000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x000400U, 0x0023FFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "SGM Low RAM" }, /* Normally situated at 0x0000-0x1FFF, which overlaps the BIOS */ + { 0x002400U, 0x0083FFU, 0x012000U, RC_MEMORY_TYPE_SYSTEM_RAM, "SGM High RAM" } /* Normally situated at 0x2000-0x7FFF, which overlaps System RAM */ +}; +static const rc_memory_regions_t rc_memory_regions_colecovision = { _rc_memory_regions_colecovision, 3 }; + +/* ===== Commodore 64 ===== */ +/* https://www.c64-wiki.com/wiki/Memory_Map */ +/* https://sta.c64.org/cbm64mem.html */ +/* NOTE: Several blocks of C64 memory can be bank-switched for ROM data (see https://www.c64-wiki.com/wiki/Bank_Switching). + * Achievement triggers rely on values changing, so we don't really need to look at the ROM data. + * The achievement logic assumes the RAM data is always present in the bankable blocks. As such, + * clients providing memory to achievements should always return the RAM values at the queried address. */ +static const rc_memory_region_t _rc_memory_regions_c64[] = { + { 0x000000U, 0x0003FFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Kernel RAM" }, + { 0x000400U, 0x0007FFU, 0x000400U, RC_MEMORY_TYPE_VIDEO_RAM, "Screen RAM" }, + { 0x000800U, 0x009FFFU, 0x000800U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* BASIC area. $8000-$9FFF can bank to cartridge ROM */ + { 0x00A000U, 0x00BFFFU, 0x00A000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* can bank to BASIC ROM or cartridge ROM */ + { 0x00C000U, 0x00CFFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x00D000U, 0x00DFFFU, 0x00D000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* can bank to I/O Area or character ROM */ + { 0x00E000U, 0x00FFFFU, 0x00E000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* can bank to kernel ROM */ +}; +static const rc_memory_regions_t rc_memory_regions_c64 = { _rc_memory_regions_c64, 7 }; + +/* ===== Dreamcast ===== */ +/* http://archiv.sega-dc.de/munkeechuff/hardware/Memory.html */ +static const rc_memory_region_t _rc_memory_regions_dreamcast[] = { + { 0x00000000U, 0x00FFFFFFU, 0x0C000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_dreamcast = { _rc_memory_regions_dreamcast, 1 }; + +/* ===== Elektor TV Games Computer ===== */ +/* https://amigan.yatho.com/e-coding.txt */ +static const rc_memory_region_t _rc_memory_regions_elektor_tv_games[] = { + { 0x000000U, 0x0013FFU, 0x000800U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x001400U, 0x0014FFU, 0x001C00U, RC_MEMORY_TYPE_UNUSED, "Unused" }, /* mirror of $1D00-$1DFF */ + { 0x001500U, 0x0016FFU, 0x001D00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "I/O Area" }, /* two 256-byte I/O areas */ + { 0x001700U, 0x0017FFU, 0x001F00U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_elektor_tv_games = { _rc_memory_regions_elektor_tv_games, 4 }; + +/* ===== Fairchild Channel F ===== */ +static const rc_memory_region_t _rc_memory_regions_fairchild_channel_f[] = { + /* "System RAM" is actually just a bunch of registers internal to CPU so all carts have it. + * "Video RAM" is part of the console so it's always available but it is write-only by the ROMs. + * "Cartridge RAM" is the cart BUS. Most carts only have ROMs on this bus. Exception are + * German Schach and homebrew carts that have 2K of RAM there in addition to ROM. + * "F2102 RAM" is used by Maze for 1K of RAM. + * https://discord.com/channels/310192285306454017/645777658319208448/967001438087708714 */ + { 0x00000000U, 0x0000003FU, 0x00100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x00000040U, 0x0000083FU, 0x00300000U, RC_MEMORY_TYPE_VIDEO_RAM, "Video RAM" }, + { 0x00000840U, 0x0001083FU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, + { 0x00010840U, 0x00010C3FU, 0x00200000U, RC_MEMORY_TYPE_SYSTEM_RAM, "F2102 RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_fairchild_channel_f = { _rc_memory_regions_fairchild_channel_f, 4 }; + +/* ===== Famicon Disk System ===== */ +/* https://fms.komkon.org/EMUL8/NES.html */ +static const rc_memory_region_t _rc_memory_regions_famicom_disk_system[] = { + { 0x0000U, 0x07FFU, 0x0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x0800U, 0x0FFFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x1000U, 0x17FFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x1800U, 0x1FFFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x2000U, 0x2007U, 0x2000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "PPU Register" }, + { 0x2008U, 0x3FFFU, 0x2008U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirrored PPU Register" }, /* repeats every 8 bytes */ + { 0x4000U, 0x4017U, 0x4000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "APU and I/O register" }, + { 0x4018U, 0x401FU, 0x4018U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "APU and I/O test register" }, + { 0x4020U, 0x40FFU, 0x4020U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "FDS I/O registers"}, + { 0x4100U, 0x5FFFU, 0x4100U, RC_MEMORY_TYPE_READONLY, "Cartridge data"}, /* varies by mapper */ + { 0x6000U, 0xDFFFU, 0x6000U, RC_MEMORY_TYPE_SYSTEM_RAM, "FDS RAM"}, + { 0xE000U, 0xFFFFU, 0xE000U, RC_MEMORY_TYPE_READONLY, "FDS BIOS ROM"}, +}; +static const rc_memory_regions_t rc_memory_regions_famicom_disk_system = { _rc_memory_regions_famicom_disk_system, 12 }; + +/* ===== GameBoy / MegaDuck ===== */ +static const rc_memory_region_t _rc_memory_regions_gameboy[] = { + { 0x000000U, 0x0000FFU, 0x000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Interrupt vector" }, + { 0x000100U, 0x00014FU, 0x000100U, RC_MEMORY_TYPE_READONLY, "Cartridge header" }, + { 0x000150U, 0x003FFFU, 0x000150U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM (fixed)" }, /* bank 0 */ + { 0x004000U, 0x007FFFU, 0x004000U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM (paged)" }, /* bank 1-XX (switchable) */ + { 0x008000U, 0x0097FFU, 0x008000U, RC_MEMORY_TYPE_VIDEO_RAM, "Tile RAM" }, + { 0x009800U, 0x009BFFU, 0x009800U, RC_MEMORY_TYPE_VIDEO_RAM, "BG1 map data" }, + { 0x009C00U, 0x009FFFU, 0x009C00U, RC_MEMORY_TYPE_VIDEO_RAM, "BG2 map data" }, + { 0x00A000U, 0x00BFFFU, 0x00A000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM (bank 0)"}, + { 0x00C000U, 0x00CFFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM (fixed)" }, + { 0x00D000U, 0x00DFFFU, 0x00D000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM (fixed)" }, + { 0x00E000U, 0x00FDFFU, 0x00C000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Echo RAM" }, + { 0x00FE00U, 0x00FE9FU, 0x00FE00U, RC_MEMORY_TYPE_VIDEO_RAM, "Sprite RAM"}, + { 0x00FEA0U, 0x00FEFFU, 0x00FEA0U, RC_MEMORY_TYPE_UNUSED, ""}, + { 0x00FF00U, 0x00FF7FU, 0x00FF00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Hardware I/O"}, + { 0x00FF80U, 0x00FFFEU, 0x00FF80U, RC_MEMORY_TYPE_SYSTEM_RAM, "Quick RAM"}, + { 0x00FFFFU, 0x00FFFFU, 0x00FFFFU, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Interrupt enable"}, + + /* GameBoy's cartridge RAM may have a total of up to 16 banks that can be paged through $A000-$BFFF. + * It is desirable to always have access to these extra banks. We do this by expecting the extra banks + * to be addressable at addresses not supported by the native system. 0x10000-0x16000 is reserved + * for the extra banks of system memory that are exclusive to the GameBoy Color. */ + { 0x010000U, 0x015FFFU, 0x010000U, RC_MEMORY_TYPE_UNUSED, "Unused (GameBoy Color exclusive)" }, + { 0x016000U, 0x033FFFU, 0x016000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM (banks 1-15)" }, +}; +static const rc_memory_regions_t rc_memory_regions_megaduck = { _rc_memory_regions_gameboy, 16 }; +static const rc_memory_regions_t rc_memory_regions_gameboy = { _rc_memory_regions_gameboy, 18 }; + +/* ===== GameBoy Color ===== */ +static const rc_memory_region_t _rc_memory_regions_gameboy_color[] = { + { 0x000000U, 0x0000FFU, 0x000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Interrupt vector" }, + { 0x000100U, 0x00014FU, 0x000100U, RC_MEMORY_TYPE_READONLY, "Cartridge header" }, + { 0x000150U, 0x003FFFU, 0x000150U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM (fixed)" }, /* bank 0 */ + { 0x004000U, 0x007FFFU, 0x004000U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM (paged)" }, /* bank 1-XX (switchable) */ + { 0x008000U, 0x0097FFU, 0x008000U, RC_MEMORY_TYPE_VIDEO_RAM, "Tile RAM" }, + { 0x009800U, 0x009BFFU, 0x009800U, RC_MEMORY_TYPE_VIDEO_RAM, "BG1 map data" }, + { 0x009C00U, 0x009FFFU, 0x009C00U, RC_MEMORY_TYPE_VIDEO_RAM, "BG2 map data" }, + { 0x00A000U, 0x00BFFFU, 0x00A000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM (bank 0)"}, + { 0x00C000U, 0x00CFFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM (bank 0)" }, + { 0x00D000U, 0x00DFFFU, 0x00D000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM (bank 1)" }, + { 0x00E000U, 0x00FDFFU, 0x00C000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Echo RAM" }, + { 0x00FE00U, 0x00FE9FU, 0x00FE00U, RC_MEMORY_TYPE_VIDEO_RAM, "Sprite RAM"}, + { 0x00FEA0U, 0x00FEFFU, 0x00FEA0U, RC_MEMORY_TYPE_UNUSED, ""}, + { 0x00FF00U, 0x00FF7FU, 0x00FF00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Hardware I/O"}, + { 0x00FF80U, 0x00FFFEU, 0x00FF80U, RC_MEMORY_TYPE_SYSTEM_RAM, "Quick RAM"}, + { 0x00FFFFU, 0x00FFFFU, 0x00FFFFU, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Interrupt enable"}, + + /* GameBoy Color provides 6 extra banks of system memory that can be paged out through the $D000-$DFFF, + * and the cartridge RAM may have a total of up to 16 banks page through $A000-$BFFF. + * It is desirable to always have access to these extra banks. We do this by expecting the extra banks + * to be addressable at addresses not supported by the native system. */ + { 0x010000U, 0x015FFFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM (banks 2-7)" }, + { 0x016000U, 0x033FFFU, 0x016000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM (banks 1-15)" }, +}; +static const rc_memory_regions_t rc_memory_regions_gameboy_color = { _rc_memory_regions_gameboy_color, 18 }; + +/* ===== GameBoy Advance ===== */ +/* http://problemkaputt.de/gbatek-gba-memory-map.htm */ +static const rc_memory_region_t _rc_memory_regions_gameboy_advance[] = { + { 0x000000U, 0x007FFFU, 0x03000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* 32KB Internal Work RAM */ + { 0x008000U, 0x047FFFU, 0x02000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* 256KB External Work RAM */ + { 0x048000U, 0x057FFFU, 0x0E000000U, RC_MEMORY_TYPE_SAVE_RAM, "Save RAM" } /* 64KB Game Pak SRAM */ +}; +static const rc_memory_regions_t rc_memory_regions_gameboy_advance = { _rc_memory_regions_gameboy_advance, 3 }; + +/* ===== GameCube ===== */ +/* https://wiibrew.org/wiki/Memory_map */ +static const rc_memory_region_t _rc_memory_regions_gamecube[] = { + { 0x00000000U, 0x017FFFFF, 0x80000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_gamecube = { _rc_memory_regions_gamecube, 1 }; + +/* ===== Game Gear ===== */ +/* https://www.smspower.org/Development/MemoryMap */ +/* https://www.smspower.org/Development/Mappers */ +static const rc_memory_region_t _rc_memory_regions_game_gear[] = { + { 0x000000U, 0x001FFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* GG/SMS have various possible mappings for cartridge memory depending on the mapper used. + * However, these ultimately do not map all of their memory at once, typically requiring banking. + * Thus, the "real address" used is just a virtual address mapping all cartridge memory in one contiguous block. + * Note that this may possibly refer to non-battery backed "extended RAM" so this isn't strictly RC_MEMORY_TYPE_SAVE_RAM. + * libretro cores expose "extended RAM" as RETRO_MEMORY_SAVE_RAM regardless however. + */ + { 0x002000U, 0x009FFFU, 0x010000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_game_gear = { _rc_memory_regions_game_gear, 2 }; + +/* ===== Intellivision ===== */ +/* http://wiki.intellivision.us/index.php/Memory_Map */ +/* NOTE: Intellivision memory addresses point at 16-bit values. FreeIntv exposes them as little-endian + * 32-bit values. As such, the addresses are off by a factor of 4 _and_ the data is only where we + * expect it on little-endian systems. + */ +static const rc_memory_region_t _rc_memory_regions_intellivision[] = { + /* For backwards compatibility, register a 128-byte chunk of video RAM so the system memory + * will start at $0080. $0000-$007F previously tried to map to the STIC video registers as + * RETRO_MEMORY_VIDEO_RAM, and FreeIntv didn't expose any RETRO_MEMORY_VIDEO_RAM, so the first + * byte of RETRO_MEMORY_SYSTEM_RAM was registered at $0080. The data at $0080 is actually the + * STIC registers (4 bytes each), so we need to provide an arbitrary 128-byte padding that + * claims to be video RAM to ensure the system RAM ends up at the right address. + */ + { 0x000000U, 0x00007FU, 0xFFFFFFU, RC_MEMORY_TYPE_VIDEO_RAM, "" }, + + /* RetroAchievements address = real address x4 + 0x80. + * These all have to map to RETRO_MEMORY_SYSTEM_RAM (even the video-related fields) as the + * entire block is exposed as a single entity by FreeIntv */ + + /* $0000-$007F: STIC registers, $0040-$007F are readonly */ + { 0x000080U, 0x00027FU, 0x000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "STIC Registers" }, + /* $0080-$00FF: unused */ + { 0x000280U, 0x00047FU, 0x000080U, RC_MEMORY_TYPE_UNUSED, "" }, + /* $0100-$035F: system RAM, $0100-$01EF is scratch memory and only 8-bits per address */ + { 0x000480U, 0x000DFFU, 0x000100U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* $0360-$03FF: unused */ + { 0x000E00U, 0x00107FU, 0x000360U, RC_MEMORY_TYPE_UNUSED, "" }, + /* $0400-$0FFF: cartridge RAM */ + { 0x001080U, 0x00407FU, 0x000400U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, + /* $1000-$1FFF: unused */ + { 0x004080U, 0x00807FU, 0x001000U, RC_MEMORY_TYPE_UNUSED, "" }, + /* $2000-$2FFF: cartridge RAM */ + { 0x008080U, 0x00C07FU, 0x002000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, + /* $3000-$3FFF: video RAM */ + { 0x00C080U, 0x01007FU, 0x003000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Video RAM" }, + /* $4000-$FFFF: cartridge RAM */ + { 0x010080U, 0x04007FU, 0x004000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_intellivision = { _rc_memory_regions_intellivision, 10 }; + +/* ===== Interton VC 4000 ===== */ +/* https://amigan.yatho.com/i-coding.txt */ +/* Cartridge RAM is not persisted, it's just expanded storage */ +static const rc_memory_region_t _rc_memory_regions_interton_vc_4000[] = { + { 0x000000U, 0x0003FFU, 0x001800U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, + { 0x000400U, 0x0004FFU, 0x001E00U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "I/O Area" }, + { 0x000500U, 0x0005FFU, 0x001F00U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_interton_vc_4000 = { _rc_memory_regions_interton_vc_4000, 3 }; + +/* ===== Magnavox Odyssey 2 ===== */ +/* https://sudonull.com/post/76885-Architecture-and-programming-Philips-Videopac-Magnavox-Odyssey-2 */ +static const rc_memory_region_t _rc_memory_regions_magnavox_odyssey_2[] = { + /* Internal and external RAMs are reachable using unique instructions. + * The real addresses provided are virtual and for mapping purposes only. */ + { 0x000000U, 0x00003FU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Internal RAM" }, + { 0x000040U, 0x00013FU, 0x000040U, RC_MEMORY_TYPE_SYSTEM_RAM, "External RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_magnavox_odyssey_2 = { _rc_memory_regions_magnavox_odyssey_2, 2 }; + +/* ===== Master System ===== */ +/* https://www.smspower.org/Development/MemoryMap */ +/* https://www.smspower.org/Development/Mappers */ +static const rc_memory_region_t _rc_memory_regions_master_system[] = { + { 0x000000U, 0x001FFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* GG/SMS have various possible mappings for cartridge memory depending on the mapper used. + * However, these ultimately do not map all of their memory at once, typically requiring banking. + * Thus, the "real address" used is just a virtual address mapping all cartridge memory in one contiguous block. + * Note that this may possibly refer to non-battery backed "extended RAM" so this isn't strictly RC_MEMORY_TYPE_SAVE_RAM. + * libretro cores expose "extended RAM" as RETRO_MEMORY_SAVE_RAM regardless however. + */ + { 0x002000U, 0x009FFFU, 0x010000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_master_system = { _rc_memory_regions_master_system, 2 }; + +/* ===== MegaDrive (Genesis) ===== */ +/* https://www.smspower.org/Development/MemoryMap */ +static const rc_memory_region_t _rc_memory_regions_megadrive[] = { + { 0x000000U, 0x00FFFFU, 0xFF0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x010000U, 0x01FFFFU, 0x000000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_megadrive = { _rc_memory_regions_megadrive, 2 }; + +/* ===== MegaDrive 32X (Genesis 32X) ===== */ +/* http://devster.monkeeh.com/sega/32xguide1.txt */ +static const rc_memory_region_t _rc_memory_regions_megadrive_32x[] = { + { 0x000000U, 0x00FFFFU, 0x00FF0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* Main MegaDrive RAM */ + { 0x010000U, 0x04FFFFU, 0x06000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "32X RAM"}, /* Additional 32X RAM */ + { 0x050000U, 0x05FFFFU, 0x00000000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_megadrive_32x = { _rc_memory_regions_megadrive_32x, 3 }; + +/* ===== MSX ===== */ +/* https://www.msx.org/wiki/The_Memory */ +/* MSX only has 64KB of addressable RAM, of which 32KB is reserved for the system/BIOS. + * However, the system has up to 512KB of RAM, which is paged into the addressable RAM + * We expect the raw RAM to be exposed, rather than force the devs to worry about the + * paging system. The entire RAM is expected to appear starting at $10000, which is not + * addressable by the system itself. + */ +static const rc_memory_region_t _rc_memory_regions_msx[] = { + { 0x000000U, 0x07FFFFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_msx = { _rc_memory_regions_msx, 1 }; + +/* ===== MS DOS ===== */ +static const rc_memory_region_t _rc_memory_regions_ms_dos[] = { + /* DOS emulators split the 640 KB conventional memory into two regions. + * First the part of the conventional memory given to the running game at $000000. + * The part of the conventional memory containing DOS and BIOS controlled memory + * is at $100000. The length of these can vary depending on the hardware + * and DOS version (or emulated DOS shell). + * These first two regions will only ever total to 640 KB but the regions map + * to 1 MB bounds to make resulting memory addresses more readable. + * When emulating a game not under DOS (so called 'PC Booter' games), the entirety + * of the 640 KB conventional memory block will be at $000000. + */ + { 0x00000000U, 0x0009FFFFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Game Conventional Memory" }, + { 0x000A0000U, 0x000FFFFFU, 0x000A0000U, RC_MEMORY_TYPE_UNUSED, "Padding to align OS Conventional Memory" }, + { 0x00100000U, 0x0019FFFFU, 0x00100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "OS Conventional Memory" }, + { 0x001A0000U, 0x001FFFFFU, 0x001A0000U, RC_MEMORY_TYPE_UNUSED, "Padding to align Expanded Memory" }, + /* Last is all the expanded memory which for now we map up to 64 MB which should be + * enough for the games we want to cover. An emulator might emulate more than that. + */ + { 0x00200000U, 0x041FFFFFU, 0x00200000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Expanded Memory" } +}; +static const rc_memory_regions_t rc_memory_regions_ms_dos = { _rc_memory_regions_ms_dos, 5 }; + +/* ===== Neo Geo Pocket ===== */ +/* http://neopocott.emuunlim.com/docs/tech-11.txt */ +static const rc_memory_region_t _rc_memory_regions_neo_geo_pocket[] = { + /* The docs suggest there's Work RAM exposed from $0000-$6FFF, Sound RAM from $7000-$7FFF, and Video + * RAM from $8000-$BFFF, but both MednafenNGP and FBNeo only expose system RAM from $4000-$7FFF */ + { 0x000000U, 0x003FFFU, 0x004000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_neo_geo_pocket = { _rc_memory_regions_neo_geo_pocket, 1 }; + +/* ===== Neo Geo CD ===== */ +/* https://wiki.neogeodev.org/index.php?title=68k_memory_map */ +/* NeoCD exposes $000000-$1FFFFF as System RAM, but it seems like only the WORKRAM section is used. + * This is consistent with http://www.hardmvs.fr/manuals/NeoGeoProgrammersGuide.pdf (page25), which says: + * + * Furthermore, the NEO-GEO provides addresses 100000H-10FFFFH as a work area, out of which the + * addresses 10F300H-10FFFFH are reserved exclusively for use by the system program. Therefore, + * every game is to use addresses 100000H-10F2FFH. + * + * Also note that PRG files (game ROM) can be loaded anywhere else in the $000000-$1FFFFF range. + * AoF3 illustrates this pretty clearly: https://wiki.neogeodev.org/index.php?title=IPL_file + * + * PROG_CD.PRG,0,0 + * PROG_CDX.PRG,0,058000 + * CNV_NM.PRG,0,0C0000 + * FIX_DATA.PRG,0,0FD000 + * OBJACTLK.PRG,0,130000 + * SSEL_CNV.PRG,0,15A000 + * SSEL_BAK.PRG,0,16F000 + * HITMSG.PRG,0,170000 + * SSEL_SPR.PRG,0,19D000 + */ +static const rc_memory_region_t _rc_memory_regions_neo_geo_cd[] = { + { 0x000000U, 0x00F2FFU, 0x00100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* NOTE: some BIOS settings are exposed through the reserved RAM: https://wiki.neogeodev.org/index.php?title=68k_ASM_defines */ + { 0x00F300U, 0x00FFFFU, 0x0010F300U, RC_MEMORY_TYPE_SYSTEM_RAM, "Reserved RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_neo_geo_cd = { _rc_memory_regions_neo_geo_cd, 2 }; + +/* ===== Nintendo Entertainment System ===== */ +/* https://wiki.nesdev.com/w/index.php/CPU_memory_map */ +static const rc_memory_region_t _rc_memory_regions_nes[] = { + { 0x0000U, 0x07FFU, 0x0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x0800U, 0x0FFFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x1000U, 0x17FFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x1800U, 0x1FFFU, 0x0000U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirror RAM" }, /* duplicates memory from $0000-$07FF */ + { 0x2000U, 0x2007U, 0x2000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "PPU Register" }, + { 0x2008U, 0x3FFFU, 0x2008U, RC_MEMORY_TYPE_VIRTUAL_RAM, "Mirrored PPU Register" }, /* repeats every 8 bytes */ + { 0x4000U, 0x4017U, 0x4000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "APU and I/O register" }, + { 0x4018U, 0x401FU, 0x4018U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "APU and I/O test register" }, + + /* NOTE: these are for the original NES/Famicom */ + { 0x4020U, 0x5FFFU, 0x4020U, RC_MEMORY_TYPE_READONLY, "Cartridge data"}, /* varies by mapper */ + { 0x6000U, 0x7FFFU, 0x6000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM"}, + { 0x8000U, 0xFFFFU, 0x8000U, RC_MEMORY_TYPE_READONLY, "Cartridge ROM"}, +}; +static const rc_memory_regions_t rc_memory_regions_nes = { _rc_memory_regions_nes, 11 }; + +/* ===== Nintendo 64 ===== */ +/* https://raw.githubusercontent.com/mikeryan/n64dev/master/docs/n64ops/n64ops%23h.txt */ +/* https://n64brew.dev/wiki/Memory_map#Virtual_Memory_Map */ +static const rc_memory_region_t _rc_memory_regions_n64[] = { + { 0x000000U, 0x1FFFFFU, 0x80000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RDRAM 1 */ + { 0x200000U, 0x3FFFFFU, 0x80200000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RDRAM 2 */ + { 0x400000U, 0x7FFFFFU, 0x80400000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } /* expansion pak */ +}; +static const rc_memory_regions_t rc_memory_regions_n64 = { _rc_memory_regions_n64, 3 }; + +/* ===== Nintendo DS ===== */ +/* https://www.akkit.org/info/gbatek.htm#dsmemorymaps */ +static const rc_memory_region_t _rc_memory_regions_nintendo_ds[] = { + { 0x0000000U, 0x03FFFFFU, 0x02000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* To keep DS/DSi memory maps aligned, padding is set here for the DSi's extra RAM */ + { 0x0400000U, 0x0FFFFFFU, 0x02400000U, RC_MEMORY_TYPE_UNUSED, "Unused (DSi exclusive)" }, + /* The DS/DSi have "tightly coupled memory": very fast memory directly connected to the CPU. + * This memory has an instruction variant (ITCM) and a data variant (DTCM). + * For achievement purposes it is useful to be able to access the data variant. + * This memory does not have a fixed address on console, being able to be moved to any $0xxxx000 region. + * While normally this kind of memory is addressed outside of the possible native addressing space, this is simply not possible, + * as the DS/DSi's address space covers all possible uint32_t values. + * $0E000000 is used here as a "pseudo-end," as this is nearly the end of all the memory actually mapped to addresses + * This means that (with the exception of $FFFF0000 onwards, which has the ARM9 BIOS mapped) $0E000000 onwards has nothing mapped to it + */ + { 0x1000000U, 0x1003FFFU, 0x0E000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Data TCM" } +}; +static const rc_memory_regions_t rc_memory_regions_nintendo_ds = { _rc_memory_regions_nintendo_ds, 3 }; + +/* ===== Nintendo DSi ===== */ +/* https://problemkaputt.de/gbatek.htm#dsiiomap */ +static const rc_memory_region_t _rc_memory_regions_nintendo_dsi[] = { + { 0x0000000U, 0x0FFFFFFU, 0x02000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x1000000U, 0x1003FFFU, 0x0E000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Data TCM" } +}; +static const rc_memory_regions_t rc_memory_regions_nintendo_dsi = { _rc_memory_regions_nintendo_dsi, 2 }; + +/* ===== Oric ===== */ +static const rc_memory_region_t _rc_memory_regions_oric[] = { + /* actual size depends on machine type - up to 64KB */ + { 0x000000U, 0x00FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_oric = { _rc_memory_regions_oric, 1 }; + +/* ===== PC-8800 ===== */ +static const rc_memory_region_t _rc_memory_regions_pc8800[] = { + { 0x000000U, 0x00FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Main RAM" }, + { 0x010000U, 0x010FFFU, 0x010000U, RC_MEMORY_TYPE_VIDEO_RAM, "Text VRAM" } /* technically VRAM, but often used as system RAM */ +}; +static const rc_memory_regions_t rc_memory_regions_pc8800 = { _rc_memory_regions_pc8800, 2 }; + +/* ===== PC Engine ===== */ +/* http://www.archaicpixels.com/Memory_Map */ +static const rc_memory_region_t _rc_memory_regions_pc_engine[] = { + { 0x000000U, 0x001FFFU, 0x1F0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_pc_engine = { _rc_memory_regions_pc_engine, 1 }; + +/* ===== PC Engine CD===== */ +/* http://www.archaicpixels.com/Memory_Map */ +static const rc_memory_region_t _rc_memory_regions_pc_engine_cd[] = { + { 0x000000U, 0x001FFFU, 0x1F0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x002000U, 0x011FFFU, 0x100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "CD RAM" }, + { 0x012000U, 0x041FFFU, 0x0D0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Super System Card RAM" }, + { 0x042000U, 0x0427FFU, 0x1EE000U, RC_MEMORY_TYPE_SAVE_RAM, "CD Battery-backed RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_pc_engine_cd = { _rc_memory_regions_pc_engine_cd, 4 }; + +/* ===== PC-FX ===== */ +/* http://daifukkat.su/pcfx/data/memmap.html */ +static const rc_memory_region_t _rc_memory_regions_pcfx[] = { + { 0x000000U, 0x1FFFFFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x200000U, 0x207FFFU, 0xE0000000U, RC_MEMORY_TYPE_SAVE_RAM, "Internal Backup Memory" }, + { 0x208000U, 0x20FFFFU, 0xE8000000U, RC_MEMORY_TYPE_SAVE_RAM, "External Backup Memory" }, +}; +static const rc_memory_regions_t rc_memory_regions_pcfx = { _rc_memory_regions_pcfx, 3 }; + +/* ===== PlayStation ===== */ +/* http://www.raphnet.net/electronique/psx_adaptor/Playstation.txt */ +static const rc_memory_region_t _rc_memory_regions_playstation[] = { + { 0x000000U, 0x00FFFFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Kernel RAM" }, + { 0x010000U, 0x1FFFFFU, 0x00010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x200000U, 0x2003FFU, 0x1F800000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Scratchpad RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_playstation = { _rc_memory_regions_playstation, 3 }; + +/* ===== PlayStation 2 ===== */ +/* https://psi-rockin.github.io/ps2tek/ */ +static const rc_memory_region_t _rc_memory_regions_playstation2[] = { + { 0x00000000U, 0x000FFFFFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Kernel RAM" }, + { 0x00100000U, 0x01FFFFFFU, 0x00100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x02000000U, 0x02003FFFU, 0x70000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Scratchpad RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_playstation2 = { _rc_memory_regions_playstation2, 3 }; + +/* ===== PlayStation Portable ===== */ +/* https://github.com/uofw/upspd/wiki/Memory-map */ +static const rc_memory_region_t _rc_memory_regions_psp[] = { + { 0x00000000U, 0x007FFFFFU, 0x08000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Kernel RAM" }, + { 0x00800000U, 0x01FFFFFFU, 0x08800000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_psp = { _rc_memory_regions_psp, 2 }; + +/* ===== Pokemon Mini ===== */ +/* https://www.pokemon-mini.net/documentation/memory-map/ */ +static const rc_memory_region_t _rc_memory_regions_pokemini[] = { + { 0x000000U, 0x000FFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "BIOS RAM" }, + { 0x001000U, 0x001FFFU, 0x001000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_pokemini = { _rc_memory_regions_pokemini, 2 }; + +/* ===== Sega CD ===== */ +/* https://en.wikibooks.org/wiki/Genesis_Programming/68K_Memory_map/ */ +static const rc_memory_region_t _rc_memory_regions_segacd[] = { + { 0x000000U, 0x00FFFFU, 0x00FF0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "68000 RAM" }, + { 0x010000U, 0x08FFFFU, 0x80020000U, RC_MEMORY_TYPE_SYSTEM_RAM, "CD PRG RAM" }, /* normally banked into $020000-$03FFFF */ + { 0x090000U, 0x0AFFFFU, 0x00200000U, RC_MEMORY_TYPE_SYSTEM_RAM, "CD WORD RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_segacd = { _rc_memory_regions_segacd, 3 }; + +/* ===== Sega Saturn ===== */ +/* https://segaretro.org/Sega_Saturn_hardware_notes_(2004-04-27) */ +static const rc_memory_region_t _rc_memory_regions_saturn[] = { + { 0x000000U, 0x0FFFFFU, 0x00200000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Work RAM Low" }, + { 0x100000U, 0x1FFFFFU, 0x06000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Work RAM High" } +}; +static const rc_memory_regions_t rc_memory_regions_saturn = { _rc_memory_regions_saturn, 2 }; + +/* ===== SG-1000 ===== */ +/* https://www.smspower.org/Development/MemoryMap */ +static const rc_memory_region_t _rc_memory_regions_sg1000[] = { + { 0x000000U, 0x0003FFU, 0xC000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* https://github.com/libretro/FBNeo/blob/697801c6262be6ca91615cf905444d3e039bc06f/src/burn/drv/sg1000/d_sg1000.cpp#L210-L237 */ + /* Expansion mode B exposes 8KB at $C000. The first 2KB hides the System RAM, but since the address matches, + we'll leverage that definition and expand it another 6KB */ + { 0x000400U, 0x001FFFU, 0xC400U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" }, + /* Expansion mode A exposes 8KB at $2000 */ + { 0x002000U, 0x003FFFU, 0x2000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" }, + /* Othello exposes 2KB at $8000, and The Castle exposes 8KB at $8000 */ + { 0x004000U, 0x005FFFU, 0x8000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_sg1000 = { _rc_memory_regions_sg1000, 4 }; + +/* ===== Super Cassette Vision ===== */ +/* https://github.com/mamedev/mame/blob/f32bb79e8541ba96d3a8144b220c48fb7536ba4b/src/mame/epoch/scv.cpp#L78-L86 */ +/* SCV only has 128 bytes of system RAM, any additional memory is provided on the individual carts and is + * not backed up by battery. */ +/* http://www.videogameconsolelibrary.com/pg80-super_cass_vis.htm#page=specs */ +static const rc_memory_region_t _rc_memory_regions_scv[] = { + { 0x000000U, 0x000FFFU, 0x000000U, RC_MEMORY_TYPE_READONLY, "System ROM" }, /* BIOS */ + { 0x001000U, 0x001FFFU, 0x001000U, RC_MEMORY_TYPE_UNUSED, "" }, + { 0x002000U, 0x003FFFU, 0x002000U, RC_MEMORY_TYPE_VIDEO_RAM, "Video RAM" }, /* only really goes to $33FF? */ + { 0x004000U, 0x007FFFU, 0x004000U, RC_MEMORY_TYPE_UNUSED, "" }, + { 0x008000U, 0x00FF7FU, 0x008000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Cartridge RAM" }, + { 0x00FF80U, 0x00FFFFU, 0x00FF80U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_scv = { _rc_memory_regions_scv, 6 }; + +/* ===== Super Nintendo ===== */ +/* https://en.wikibooks.org/wiki/Super_NES_Programming/SNES_memory_map#LoROM */ +static const rc_memory_region_t _rc_memory_regions_snes[] = { + { 0x000000U, 0x01FFFFU, 0x07E0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* Cartridge RAM here could be in a variety of places in SNES memory, depending on the ROM type. + * Due to this, we place Cartridge RAM outside of the possible native addressing space. + * Note that this also covers SA-1 BW-RAM (which is exposed as RETRO_MEMORY_SAVE_RAM for libretro). + */ + { 0x020000U, 0x09FFFFU, 0x1000000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" }, + /* I-RAM on the SA-1 is normally at 0x003000. However, this address typically just has a mirror of System RAM for other ROM types. + * To avoid conflicts, don't use 0x003000, instead map it outside of the possible native addressing space. + */ + { 0x0A0000U, 0x0A07FFU, 0x1080000U, RC_MEMORY_TYPE_SYSTEM_RAM, "I-RAM (SA-1)" } +}; +static const rc_memory_regions_t rc_memory_regions_snes = { _rc_memory_regions_snes, 3 }; + +/* ===== Thomson TO8 ===== */ +/* https://github.com/mamedev/mame/blob/master/src/mame/drivers/thomson.cpp#L1617 */ +static const rc_memory_region_t _rc_memory_regions_thomson_to8[] = { + { 0x000000U, 0x07FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_thomson_to8 = { _rc_memory_regions_thomson_to8, 1 }; + +/* ===== TI-83 ===== */ +/* https://tutorials.eeems.ca/ASMin28Days/lesson/day03.html#mem */ +static const rc_memory_region_t _rc_memory_regions_ti83[] = { + { 0x000000U, 0x007FFFU, 0x008000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_ti83 = { _rc_memory_regions_ti83, 1 }; + +/* ===== TIC-80 ===== */ +/* https://github.com/nesbox/TIC-80/wiki/RAM */ +static const rc_memory_region_t _rc_memory_regions_tic80[] = { + { 0x000000U, 0x003FFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Video RAM" }, /* have to classify this as system RAM because the core exposes it as part of the RETRO_MEMORY_SYSTEM_RAM */ + { 0x004000U, 0x005FFFU, 0x004000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Tile RAM" }, + { 0x006000U, 0x007FFFU, 0x006000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Sprite RAM" }, + { 0x008000U, 0x00FF7FU, 0x008000U, RC_MEMORY_TYPE_SYSTEM_RAM, "MAP RAM" }, + { 0x00FF80U, 0x00FF8BU, 0x00FF80U, RC_MEMORY_TYPE_SYSTEM_RAM, "Input State" }, + { 0x00FF8CU, 0x014003U, 0x00FF8CU, RC_MEMORY_TYPE_SYSTEM_RAM, "Sound RAM" }, + { 0x014004U, 0x014403U, 0x014004U, RC_MEMORY_TYPE_SAVE_RAM, "Persistent Memory" }, /* this is also returned as part of RETRO_MEMORY_SYSTEM_RAM, but can be extrapolated correctly because the pointer starts at the first SYSTEM_RAM region */ + { 0x014404U, 0x014603U, 0x014404U, RC_MEMORY_TYPE_SYSTEM_RAM, "Sprite Flags" }, + { 0x014604U, 0x014E03U, 0x014604U, RC_MEMORY_TYPE_SYSTEM_RAM, "System Font" }, + { 0x014E04U, 0x017FFFU, 0x014E04U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM"} +}; +static const rc_memory_regions_t rc_memory_regions_tic80 = { _rc_memory_regions_tic80, 10 }; + +/* ===== Uzebox ===== */ +/* https://uzebox.org/index.php */ +static const rc_memory_region_t _rc_memory_regions_uzebox[] = { + { 0x000000U, 0x000FFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_uzebox = { _rc_memory_regions_uzebox, 1 }; + +/* ===== Vectrex ===== */ +/* https://roadsidethoughts.com/vectrex/vectrex-memory-map.htm */ +static const rc_memory_region_t _rc_memory_regions_vectrex[] = { + { 0x000000U, 0x0003FFU, 0x00C800U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_vectrex = { _rc_memory_regions_vectrex, 1 }; + +/* ===== Virtual Boy ===== */ +static const rc_memory_region_t _rc_memory_regions_virtualboy[] = { + { 0x000000U, 0x00FFFFU, 0x05000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x010000U, 0x01FFFFU, 0x06000000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_virtualboy = { _rc_memory_regions_virtualboy, 2 }; + +/* ===== Watara Supervision ===== */ +/* https://github.com/libretro/potator/blob/b5e5ba02914fcdf4a8128072dbc709da28e08832/common/memorymap.c#L231-L259 */ +static const rc_memory_region_t _rc_memory_regions_watara_supervision[] = { + { 0x0000U, 0x001FFFU, 0x0000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x2000U, 0x003FFFU, 0x2000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Registers" }, + { 0x4000U, 0x005FFFU, 0x4000U, RC_MEMORY_TYPE_VIDEO_RAM, "Video RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_watara_supervision = { _rc_memory_regions_watara_supervision, 3 }; + +/* ===== WASM-4 ===== */ +/* fantasy console that runs specifically designed WebAssembly games */ +/* https://github.com/aduros/wasm4/blob/main/site/docs/intro.md#hardware-specs */ +static const rc_memory_region_t _rc_memory_regions_wasm4[] = { + { 0x000000U, 0x00FFFFU, 0x00000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* Persistent storage is not directly accessible from the game. It has to be loaded into System RAM first + { 0x010000U, 0x0103FFU, 0x80000000U, RC_MEMORY_TYPE_SAVE_RAM, "Disk Storage"} + */ +}; +static const rc_memory_regions_t rc_memory_regions_wasm4 = { _rc_memory_regions_wasm4, 1 }; + +/* ===== Wii ===== */ +/* https://wiibrew.org/wiki/Memory_map */ +static const rc_memory_region_t _rc_memory_regions_wii[] = { + { 0x00000000U, 0x017FFFFF, 0x80000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x01800000U, 0x0FFFFFFF, 0x81800000U, RC_MEMORY_TYPE_UNUSED, "Unused" }, + { 0x10000000U, 0x13FFFFFF, 0x90000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_wii = { _rc_memory_regions_wii, 3 }; + +/* ===== WonderSwan ===== */ +/* http://daifukkat.su/docs/wsman/#ovr_memmap */ +static const rc_memory_region_t _rc_memory_regions_wonderswan[] = { + /* RAM ends at 0x3FFF for WonderSwan, WonderSwan color uses all 64KB */ + { 0x000000U, 0x00FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + /* Only 64KB of SRAM is accessible via the addressing scheme, but the cartridge + * may have up to 512KB of SRAM. http://daifukkat.su/docs/wsman/#cart_meta + * Since beetle_wswan exposes it as a contiguous block, assume its contiguous + * even though the documentation says $20000-$FFFFF is ROM data. If this causes + * a conflict in the future, we can revisit. A new region with a virtual address + * could be added to pick up the additional SRAM data. As long as it immediately + * follows the 64KB at $10000, all existing achievements should be unaffected. + */ + { 0x010000U, 0x08FFFFU, 0x010000U, RC_MEMORY_TYPE_SAVE_RAM, "Cartridge RAM" } +}; +static const rc_memory_regions_t rc_memory_regions_wonderswan = { _rc_memory_regions_wonderswan, 2 }; + +/* ===== ZX Spectrum ===== */ +/* https://github.com/TASEmulators/BizHawk/blob/3a3b22c/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/ZXSpectrum16K/ZX16.cs + * https://github.com/TASEmulators/BizHawk/blob/3a3b22c/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/ZXSpectrum48K/ZX48.Memory.cs + * https://worldofspectrum.org/faq/reference/128kreference.htm */ +static const rc_memory_region_t _rc_memory_regions_zx_spectrum[] = { + /* ZX Spectrum is complicated as multiple models exist with varying amounts of memory. + * In practice, this can be reduced to two categories: 16K/48K units, and 128K units. + * 16K/48K units have RAM starting at $4000 onwards, 16K ending at $7FFF, 48K ending at $FFFF. + * 128K units have banked memory, with $4000-$7FFF normally having RAM bank 5, and $8000-$BFFF normally having RAM bank 2. + * $C000-$FFFF is normally reserved for banked RAM, having any of banks 0-7. + * For the purposes of the RAM map, $C000-$FFFF is assumed to be bank 0, and $10000 onwards has the other banks in order (1, 3, 4, 6, 7) + * Doing it this way always for 16K/48K games to have the same memory map on the 128K, and thus avoid issues due to the model selected. + * Later 128K units also have a special banking mode that changes up banking completely, but for 16K/48K compatibility purposes this doesn't matter, and so is irrelevant. + */ + { 0x00000U, 0x03FFFU, 0x04000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Screen RAM" }, /* RAM bank 5 on 128K units */ + { 0x04000U, 0x07FFFU, 0x08000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 2 on 128K units */ + { 0x08000U, 0x0BFFFU, 0x0C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 0-7 on 128K units, assumed to be bank 0 here */ + { 0x0C000U, 0x0FFFFU, 0x10000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 1 on 128K units */ + { 0x10000U, 0x13FFFU, 0x14000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 3 on 128K units */ + { 0x14000U, 0x17FFFU, 0x18000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 4 on 128K units */ + { 0x18000U, 0x1BFFFU, 0x1C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, /* RAM bank 6 on 128K units */ + { 0x1C000U, 0x1FFFFU, 0x20000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Screen RAM" } /* RAM bank 7 on 128K units */ +}; +static const rc_memory_regions_t rc_memory_regions_zx_spectrum = { _rc_memory_regions_zx_spectrum, 8 }; + +/* ===== default ===== */ +static const rc_memory_regions_t rc_memory_regions_none = { 0, 0 }; + +const rc_memory_regions_t* rc_console_memory_regions(uint32_t console_id) +{ + switch (console_id) + { + case RC_CONSOLE_3DO: + return &rc_memory_regions_3do; + + case RC_CONSOLE_AMIGA: + return &rc_memory_regions_amiga; + + case RC_CONSOLE_AMSTRAD_PC: + return &rc_memory_regions_amstrad_pc; + + case RC_CONSOLE_APPLE_II: + return &rc_memory_regions_appleii; + + case RC_CONSOLE_ARCADIA_2001: + return &rc_memory_regions_arcadia_2001; + + case RC_CONSOLE_ARDUBOY: + return &rc_memory_regions_arduboy; + + case RC_CONSOLE_ATARI_2600: + return &rc_memory_regions_atari2600; + + case RC_CONSOLE_ATARI_7800: + return &rc_memory_regions_atari7800; + + case RC_CONSOLE_ATARI_JAGUAR: + case RC_CONSOLE_ATARI_JAGUAR_CD: + return &rc_memory_regions_atari_jaguar; + + case RC_CONSOLE_ATARI_LYNX: + return &rc_memory_regions_atari_lynx; + + case RC_CONSOLE_COLECOVISION: + return &rc_memory_regions_colecovision; + + case RC_CONSOLE_COMMODORE_64: + return &rc_memory_regions_c64; + + case RC_CONSOLE_DREAMCAST: + return &rc_memory_regions_dreamcast; + + case RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER: + return &rc_memory_regions_elektor_tv_games; + + case RC_CONSOLE_FAIRCHILD_CHANNEL_F: + return &rc_memory_regions_fairchild_channel_f; + + case RC_CONSOLE_FAMICOM_DISK_SYSTEM: + return &rc_memory_regions_famicom_disk_system; + + case RC_CONSOLE_GAMEBOY: + return &rc_memory_regions_gameboy; + + case RC_CONSOLE_GAMEBOY_COLOR: + return &rc_memory_regions_gameboy_color; + + case RC_CONSOLE_GAMEBOY_ADVANCE: + return &rc_memory_regions_gameboy_advance; + + case RC_CONSOLE_GAMECUBE: + return &rc_memory_regions_gamecube; + + case RC_CONSOLE_GAME_GEAR: + return &rc_memory_regions_game_gear; + + case RC_CONSOLE_INTELLIVISION: + return &rc_memory_regions_intellivision; + + case RC_CONSOLE_INTERTON_VC_4000: + return &rc_memory_regions_interton_vc_4000; + + case RC_CONSOLE_MAGNAVOX_ODYSSEY2: + return &rc_memory_regions_magnavox_odyssey_2; + + case RC_CONSOLE_MASTER_SYSTEM: + return &rc_memory_regions_master_system; + + case RC_CONSOLE_MEGA_DRIVE: + return &rc_memory_regions_megadrive; + + case RC_CONSOLE_MEGADUCK: + return &rc_memory_regions_megaduck; + + case RC_CONSOLE_SEGA_32X: + return &rc_memory_regions_megadrive_32x; + + case RC_CONSOLE_MSX: + return &rc_memory_regions_msx; + + case RC_CONSOLE_MS_DOS: + return &rc_memory_regions_ms_dos; + + case RC_CONSOLE_NEOGEO_POCKET: + return &rc_memory_regions_neo_geo_pocket; + + case RC_CONSOLE_NEO_GEO_CD: + return &rc_memory_regions_neo_geo_cd; + + case RC_CONSOLE_NINTENDO: + return &rc_memory_regions_nes; + + case RC_CONSOLE_NINTENDO_64: + return &rc_memory_regions_n64; + + case RC_CONSOLE_NINTENDO_DS: + return &rc_memory_regions_nintendo_ds; + + case RC_CONSOLE_NINTENDO_DSI: + return &rc_memory_regions_nintendo_dsi; + + case RC_CONSOLE_ORIC: + return &rc_memory_regions_oric; + + case RC_CONSOLE_PC8800: + return &rc_memory_regions_pc8800; + + case RC_CONSOLE_PC_ENGINE: + return &rc_memory_regions_pc_engine; + + case RC_CONSOLE_PC_ENGINE_CD: + return &rc_memory_regions_pc_engine_cd; + + case RC_CONSOLE_PCFX: + return &rc_memory_regions_pcfx; + + case RC_CONSOLE_PLAYSTATION: + return &rc_memory_regions_playstation; + + case RC_CONSOLE_PLAYSTATION_2: + return &rc_memory_regions_playstation2; + + case RC_CONSOLE_PSP: + return &rc_memory_regions_psp; + + case RC_CONSOLE_POKEMON_MINI: + return &rc_memory_regions_pokemini; + + case RC_CONSOLE_SATURN: + return &rc_memory_regions_saturn; + + case RC_CONSOLE_SEGA_CD: + return &rc_memory_regions_segacd; + + case RC_CONSOLE_SG1000: + return &rc_memory_regions_sg1000; + + case RC_CONSOLE_SUPER_CASSETTEVISION: + return &rc_memory_regions_scv; + + case RC_CONSOLE_SUPER_NINTENDO: + return &rc_memory_regions_snes; + + case RC_CONSOLE_SUPERVISION: + return &rc_memory_regions_watara_supervision; + + case RC_CONSOLE_THOMSONTO8: + return &rc_memory_regions_thomson_to8; + + case RC_CONSOLE_TI83: + return &rc_memory_regions_ti83; + + case RC_CONSOLE_TIC80: + return &rc_memory_regions_tic80; + + case RC_CONSOLE_UZEBOX: + return &rc_memory_regions_uzebox; + + case RC_CONSOLE_VECTREX: + return &rc_memory_regions_vectrex; + + case RC_CONSOLE_VIRTUAL_BOY: + return &rc_memory_regions_virtualboy; + + case RC_CONSOLE_WASM4: + return &rc_memory_regions_wasm4; + + case RC_CONSOLE_WII: + return &rc_memory_regions_wii; + + case RC_CONSOLE_WONDERSWAN: + return &rc_memory_regions_wonderswan; + + case RC_CONSOLE_ZX_SPECTRUM: + return &rc_memory_regions_zx_spectrum; + + default: + return &rc_memory_regions_none; + } +} diff --git a/src/rcheevos/src/rcheevos/format.c b/src/rcheevos/src/rcheevos/format.c new file mode 100644 index 0000000000..bfeadf44cf --- /dev/null +++ b/src/rcheevos/src/rcheevos/format.c @@ -0,0 +1,330 @@ +#include "rc_internal.h" + +#include "../rc_compat.h" + +#include +#include +#include + +int rc_parse_format(const char* format_str) { + switch (*format_str++) { + case 'F': + if (!strcmp(format_str, "RAMES")) { + return RC_FORMAT_FRAMES; + } + if (!strncmp(format_str, "LOAT", 4) && format_str[4] >= '1' && format_str[4] <= '6' && format_str[5] == '\0') { + return RC_FORMAT_FLOAT1 + (format_str[4] - '1'); + } + if (!strncmp(format_str, "IXED", 4) && format_str[4] >= '1' && format_str[4] <= '3' && format_str[5] == '\0') { + return RC_FORMAT_FIXED1 + (format_str[4] - '1'); + } + + break; + + case 'T': + if (!strcmp(format_str, "IME")) { + return RC_FORMAT_FRAMES; + } + if (!strcmp(format_str, "IMESECS")) { + return RC_FORMAT_SECONDS; + } + if (!strcmp(format_str, "HOUSANDS")) { + return RC_FORMAT_THOUSANDS; + } + if (!strcmp(format_str, "ENS")) { + return RC_FORMAT_TENS; + } + + break; + + case 'S': + if (!strcmp(format_str, "ECS")) { + return RC_FORMAT_SECONDS; + } + if (!strcmp(format_str, "CORE")) { + return RC_FORMAT_SCORE; + } + if (!strcmp(format_str, "ECS_AS_MINS")) { + return RC_FORMAT_SECONDS_AS_MINUTES; + } + + break; + + case 'M': + if (!strcmp(format_str, "ILLISECS")) { + return RC_FORMAT_CENTISECS; + } + if (!strcmp(format_str, "INUTES")) { + return RC_FORMAT_MINUTES; + } + + break; + + case 'P': + if (!strcmp(format_str, "OINTS")) { + return RC_FORMAT_SCORE; + } + + break; + + case 'V': + if (!strcmp(format_str, "ALUE")) { + return RC_FORMAT_VALUE; + } + + break; + + case 'U': + if (!strcmp(format_str, "NSIGNED")) { + return RC_FORMAT_UNSIGNED_VALUE; + } + + break; + + case 'O': + if (!strcmp(format_str, "THER")) { + return RC_FORMAT_SCORE; + } + + break; + + case 'H': + if (!strcmp(format_str, "UNDREDS")) { + return RC_FORMAT_HUNDREDS; + } + + break; + } + + return RC_FORMAT_VALUE; +} + +static int rc_format_value_minutes(char* buffer, size_t size, uint32_t minutes) { + uint32_t hours; + + hours = minutes / 60; + minutes -= hours * 60; + return snprintf(buffer, size, "%uh%02u", hours, minutes); +} + +static int rc_format_value_seconds(char* buffer, size_t size, uint32_t seconds) { + uint32_t hours, minutes; + + /* apply modulus math to split the seconds into hours/minutes/seconds */ + minutes = seconds / 60; + seconds -= minutes * 60; + if (minutes < 60) { + return snprintf(buffer, size, "%u:%02u", minutes, seconds); + } + + hours = minutes / 60; + minutes -= hours * 60; + return snprintf(buffer, size, "%uh%02u:%02u", hours, minutes, seconds); +} + +static int rc_format_value_centiseconds(char* buffer, size_t size, uint32_t centiseconds) { + uint32_t seconds; + int chars, chars2; + + /* modulus off the centiseconds */ + seconds = centiseconds / 100; + centiseconds -= seconds * 100; + + chars = rc_format_value_seconds(buffer, size, seconds); + if (chars > 0) { + chars2 = snprintf(buffer + chars, size - chars, ".%02u", centiseconds); + if (chars2 > 0) { + chars += chars2; + } else { + chars = chars2; + } + } + + return chars; +} + +static int rc_format_value_fixed(char* buffer, size_t size, const char* format, int32_t value, int32_t factor) +{ + if (value >= 0) + return snprintf(buffer, size, format, value / factor, value % factor); + + return snprintf(buffer, size, format, value / factor, (-value) % factor); +} + +static int rc_format_value_padded(char* buffer, size_t size, const char* format, int32_t value) +{ + if (value == 0) + return snprintf(buffer, size, "0"); + + return snprintf(buffer, size, format, value); +} + +static int rc_format_insert_commas(int chars, char* buffer, size_t size) +{ + int to_insert; + char* src = buffer; + char* ptr; + char* dst = &buffer[chars]; + if (chars == 0) + return 0; + + /* ignore leading negative sign */ + if (*src == '-') + src++; + + /* determine how many digits are present in the leading number */ + ptr = src; + while (ptr < dst && isdigit((int)*ptr)) + ++ptr; + + /* determine how many commas are needed */ + to_insert = (int)((ptr - src - 1) / 3); + if (to_insert == 0) /* no commas needed */ + return chars; + + /* if there's not enough room to insert the commas, leave string as-is, but return wanted space */ + chars += to_insert; + if (chars >= (int)size) + return chars; + + /* move the trailing part of the string */ + memmove(ptr + to_insert, ptr, dst - ptr + 1); + + /* shift blocks of three digits at a time, inserting commas in front of them */ + src = ptr - 1; + dst = src + to_insert; + while (to_insert > 0) { + *dst-- = *src--; + *dst-- = *src--; + *dst-- = *src--; + *dst-- = ','; + + --to_insert; + } + + return chars; +} + +int rc_format_typed_value(char* buffer, size_t size, const rc_typed_value_t* value, int format) { + int chars; + rc_typed_value_t converted_value; + + memcpy(&converted_value, value, sizeof(converted_value)); + + switch (format) { + default: + case RC_FORMAT_VALUE: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = snprintf(buffer, size, "%d", converted_value.value.i32); + break; + + case RC_FORMAT_FRAMES: + /* 60 frames per second = 100 centiseconds / 60 frames; multiply frames by 100 / 60 */ + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = rc_format_value_centiseconds(buffer, size, converted_value.value.u32 * 10 / 6); + break; + + case RC_FORMAT_CENTISECS: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = rc_format_value_centiseconds(buffer, size, converted_value.value.u32); + break; + + case RC_FORMAT_SECONDS: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = rc_format_value_seconds(buffer, size, converted_value.value.u32); + break; + + case RC_FORMAT_SECONDS_AS_MINUTES: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = rc_format_value_minutes(buffer, size, converted_value.value.u32 / 60); + break; + + case RC_FORMAT_MINUTES: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = rc_format_value_minutes(buffer, size, converted_value.value.u32); + break; + + case RC_FORMAT_SCORE: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + return snprintf(buffer, size, "%06d", converted_value.value.i32); + + case RC_FORMAT_FLOAT1: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.1f", converted_value.value.f32); + break; + + case RC_FORMAT_FLOAT2: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.2f", converted_value.value.f32); + break; + + case RC_FORMAT_FLOAT3: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.3f", converted_value.value.f32); + break; + + case RC_FORMAT_FLOAT4: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.4f", converted_value.value.f32); + break; + + case RC_FORMAT_FLOAT5: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.5f", converted_value.value.f32); + break; + + case RC_FORMAT_FLOAT6: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_FLOAT); + chars = snprintf(buffer, size, "%.6f", converted_value.value.f32); + break; + + case RC_FORMAT_FIXED1: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_fixed(buffer, size, "%d.%u", converted_value.value.i32, 10); + break; + + case RC_FORMAT_FIXED2: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_fixed(buffer, size, "%d.%02u", converted_value.value.i32, 100); + break; + + case RC_FORMAT_FIXED3: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_fixed(buffer, size, "%d.%03u", converted_value.value.i32, 1000); + break; + + case RC_FORMAT_TENS: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_padded(buffer, size, "%d0", converted_value.value.i32); + break; + + case RC_FORMAT_HUNDREDS: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_padded(buffer, size, "%d00", converted_value.value.i32); + break; + + case RC_FORMAT_THOUSANDS: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_SIGNED); + chars = rc_format_value_padded(buffer, size, "%d000", converted_value.value.i32); + break; + + case RC_FORMAT_UNSIGNED_VALUE: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + chars = snprintf(buffer, size, "%u", converted_value.value.u32); + break; + + case RC_FORMAT_UNFORMATTED: + rc_typed_value_convert(&converted_value, RC_VALUE_TYPE_UNSIGNED); + return snprintf(buffer, size, "%u", converted_value.value.u32); + } + + return rc_format_insert_commas(chars, buffer, size); +} + +int rc_format_value(char* buffer, int size, int32_t value, int format) { + rc_typed_value_t typed_value; + + typed_value.value.i32 = value; + typed_value.type = RC_VALUE_TYPE_SIGNED; + return rc_format_typed_value(buffer, size, &typed_value, format); +} diff --git a/src/rcheevos/src/rcheevos/lboard.c b/src/rcheevos/src/rcheevos/lboard.c new file mode 100644 index 0000000000..84ff5460af --- /dev/null +++ b/src/rcheevos/src/rcheevos/lboard.c @@ -0,0 +1,287 @@ +#include "rc_internal.h" + +enum { + RC_LBOARD_START = 1 << 0, + RC_LBOARD_CANCEL = 1 << 1, + RC_LBOARD_SUBMIT = 1 << 2, + RC_LBOARD_VALUE = 1 << 3, + RC_LBOARD_PROGRESS = 1 << 4, + RC_LBOARD_COMPLETE = RC_LBOARD_START | RC_LBOARD_CANCEL | RC_LBOARD_SUBMIT | RC_LBOARD_VALUE +}; + +void rc_parse_lboard_internal(rc_lboard_t* self, const char* memaddr, rc_parse_state_t* parse) { + int found; + + self->progress = 0; + found = 0; + + for (;;) + { + if ((memaddr[0] == 's' || memaddr[0] == 'S') && + (memaddr[1] == 't' || memaddr[1] == 'T') && + (memaddr[2] == 'a' || memaddr[2] == 'A') && memaddr[3] == ':') { + if ((found & RC_LBOARD_START) != 0) { + parse->offset = RC_DUPLICATED_START; + return; + } + + memaddr += 4; + if (*memaddr && *memaddr != ':') { + found |= RC_LBOARD_START; + rc_parse_trigger_internal(&self->start, &memaddr, parse); + } + } + else if ((memaddr[0] == 'c' || memaddr[0] == 'C') && + (memaddr[1] == 'a' || memaddr[1] == 'A') && + (memaddr[2] == 'n' || memaddr[2] == 'N') && memaddr[3] == ':') { + if ((found & RC_LBOARD_CANCEL) != 0) { + parse->offset = RC_DUPLICATED_CANCEL; + return; + } + + memaddr += 4; + if (*memaddr && *memaddr != ':') { + found |= RC_LBOARD_CANCEL; + rc_parse_trigger_internal(&self->cancel, &memaddr, parse); + } + } + else if ((memaddr[0] == 's' || memaddr[0] == 'S') && + (memaddr[1] == 'u' || memaddr[1] == 'U') && + (memaddr[2] == 'b' || memaddr[2] == 'B') && memaddr[3] == ':') { + if ((found & RC_LBOARD_SUBMIT) != 0) { + parse->offset = RC_DUPLICATED_SUBMIT; + return; + } + + memaddr += 4; + if (*memaddr && *memaddr != ':') { + found |= RC_LBOARD_SUBMIT; + rc_parse_trigger_internal(&self->submit, &memaddr, parse); + } + } + else if ((memaddr[0] == 'v' || memaddr[0] == 'V') && + (memaddr[1] == 'a' || memaddr[1] == 'A') && + (memaddr[2] == 'l' || memaddr[2] == 'L') && memaddr[3] == ':') { + if ((found & RC_LBOARD_VALUE) != 0) { + parse->offset = RC_DUPLICATED_VALUE; + return; + } + + memaddr += 4; + if (*memaddr && *memaddr != ':') { + found |= RC_LBOARD_VALUE; + rc_parse_value_internal(&self->value, &memaddr, parse); + } + } + else if ((memaddr[0] == 'p' || memaddr[0] == 'P') && + (memaddr[1] == 'r' || memaddr[1] == 'R') && + (memaddr[2] == 'o' || memaddr[2] == 'O') && memaddr[3] == ':') { + if ((found & RC_LBOARD_PROGRESS) != 0) { + parse->offset = RC_DUPLICATED_PROGRESS; + return; + } + + memaddr += 4; + if (*memaddr && *memaddr != ':') { + found |= RC_LBOARD_PROGRESS; + + self->progress = RC_ALLOC(rc_value_t, parse); + rc_parse_value_internal(self->progress, &memaddr, parse); + } + } + + /* encountered an error parsing one of the parts */ + if (parse->offset < 0) + return; + + /* end of string, or end of quoted string - stop processing */ + if (memaddr[0] == '\0' || memaddr[0] == '\"') + break; + + /* expect two colons between fields */ + if (memaddr[0] != ':' || memaddr[1] != ':') { + parse->offset = RC_INVALID_LBOARD_FIELD; + return; + } + + memaddr += 2; + } + + if ((found & RC_LBOARD_COMPLETE) != RC_LBOARD_COMPLETE) { + if ((found & RC_LBOARD_START) == 0) { + parse->offset = RC_MISSING_START; + } + else if ((found & RC_LBOARD_CANCEL) == 0) { + parse->offset = RC_MISSING_CANCEL; + } + else if ((found & RC_LBOARD_SUBMIT) == 0) { + parse->offset = RC_MISSING_SUBMIT; + } + else if ((found & RC_LBOARD_VALUE) == 0) { + parse->offset = RC_MISSING_VALUE; + } + + return; + } + + self->state = RC_LBOARD_STATE_WAITING; + self->has_memrefs = 0; +} + +int rc_lboard_size(const char* memaddr) { + rc_lboard_with_memrefs_t* lboard; + rc_preparse_state_t preparse; + rc_init_preparse_state(&preparse); + + lboard = RC_ALLOC(rc_lboard_with_memrefs_t, &preparse.parse); + rc_parse_lboard_internal(&lboard->lboard, memaddr, &preparse.parse); + rc_preparse_alloc_memrefs(NULL, &preparse); + + rc_destroy_preparse_state(&preparse); + return preparse.parse.offset; +} + +rc_lboard_t* rc_parse_lboard(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx) { + rc_lboard_with_memrefs_t* lboard; + rc_preparse_state_t preparse; + + (void)unused_L; + (void)unused_funcs_idx; + + if (!buffer || !memaddr) + return 0; + + rc_init_preparse_state(&preparse); + lboard = RC_ALLOC(rc_lboard_with_memrefs_t, &preparse.parse); + rc_parse_lboard_internal(&lboard->lboard, memaddr, &preparse.parse); + + rc_reset_parse_state(&preparse.parse, buffer); + lboard = RC_ALLOC(rc_lboard_with_memrefs_t, &preparse.parse); + rc_preparse_alloc_memrefs(&lboard->memrefs, &preparse); + + rc_parse_lboard_internal(&lboard->lboard, memaddr, &preparse.parse); + lboard->lboard.has_memrefs = 1; + + rc_destroy_preparse_state(&preparse); + return (preparse.parse.offset >= 0) ? &lboard->lboard : NULL; +} + +static void rc_update_lboard_memrefs(rc_lboard_t* self, rc_peek_t peek, void* ud) { + if (self->has_memrefs) { + rc_lboard_with_memrefs_t* lboard = (rc_lboard_with_memrefs_t*)self; + rc_update_memref_values(&lboard->memrefs, peek, ud); + } +} + +int rc_evaluate_lboard(rc_lboard_t* self, int32_t* value, rc_peek_t peek, void* peek_ud, void* unused_L) { + int start_ok, cancel_ok, submit_ok; + + rc_update_lboard_memrefs(self, peek, peek_ud); + + if (self->state == RC_LBOARD_STATE_INACTIVE || self->state == RC_LBOARD_STATE_DISABLED) + return RC_LBOARD_STATE_INACTIVE; + + /* these are always tested once every frame, to ensure hit counts work properly */ + start_ok = rc_test_trigger(&self->start, peek, peek_ud, unused_L); + cancel_ok = rc_test_trigger(&self->cancel, peek, peek_ud, unused_L); + submit_ok = rc_test_trigger(&self->submit, peek, peek_ud, unused_L); + + switch (self->state) + { + case RC_LBOARD_STATE_WAITING: + case RC_LBOARD_STATE_TRIGGERED: + case RC_LBOARD_STATE_CANCELED: + /* don't activate/reactivate until the start condition becomes false */ + if (start_ok) { + *value = 0; + return RC_LBOARD_STATE_INACTIVE; /* just return inactive for all of these */ + } + + /* start condition is false, allow the leaderboard to start on future frames */ + self->state = RC_LBOARD_STATE_ACTIVE; + break; + + case RC_LBOARD_STATE_ACTIVE: + /* leaderboard attempt is not in progress. if the start condition is true and the cancel condition is not, start the attempt */ + if (start_ok && !cancel_ok) { + if (submit_ok) { + /* start and submit are both true in the same frame, just submit without announcing the leaderboard is available */ + self->state = RC_LBOARD_STATE_TRIGGERED; + } + else if (!self->start.requirement && !self->start.alternative) { + /* start trigger is empty. assume the leaderboard is in development and ignore */ + } + else { + /* start the leaderboard attempt */ + self->state = RC_LBOARD_STATE_STARTED; + } + + /* reset any hit counts in the value */ + if (self->progress) + rc_reset_value(self->progress); + + rc_reset_value(&self->value); + } + break; + + case RC_LBOARD_STATE_STARTED: + /* leaderboard attempt in progress */ + if (cancel_ok) { + /* cancel condition is true, abort the attempt */ + self->state = RC_LBOARD_STATE_CANCELED; + } + else if (submit_ok) { + /* submit condition is true, submit the current value */ + self->state = RC_LBOARD_STATE_TRIGGERED; + } + break; + } + + /* Calculate the value */ + switch (self->state) { + case RC_LBOARD_STATE_STARTED: + if (self->progress) { + *value = rc_evaluate_value(self->progress, peek, peek_ud, unused_L); + break; + } + /* fallthrough */ /* to RC_LBOARD_STATE_TRIGGERED */ + + case RC_LBOARD_STATE_TRIGGERED: + *value = rc_evaluate_value(&self->value, peek, peek_ud, unused_L); + break; + + default: + *value = 0; + break; + } + + return self->state; +} + +int rc_lboard_state_active(int state) { + switch (state) + { + case RC_LBOARD_STATE_DISABLED: + case RC_LBOARD_STATE_INACTIVE: + return 0; + + default: + return 1; + } +} + +void rc_reset_lboard(rc_lboard_t* self) { + if (!self) + return; + + self->state = RC_LBOARD_STATE_WAITING; + + rc_reset_trigger(&self->start); + rc_reset_trigger(&self->submit); + rc_reset_trigger(&self->cancel); + + if (self->progress) + rc_reset_value(self->progress); + + rc_reset_value(&self->value); +} diff --git a/src/rcheevos/src/rcheevos/memref.c b/src/rcheevos/src/rcheevos/memref.c new file mode 100644 index 0000000000..9c8f16066e --- /dev/null +++ b/src/rcheevos/src/rcheevos/memref.c @@ -0,0 +1,805 @@ +#include "rc_internal.h" + +#include /* malloc/realloc */ +#include /* memcpy */ +#include /* INFINITY/NAN */ + +#define MEMREF_PLACEHOLDER_ADDRESS 0xFFFFFFFF + +rc_memref_t* rc_alloc_memref(rc_parse_state_t* parse, uint32_t address, uint8_t size) { + rc_memref_list_t* memref_list = NULL; + rc_memref_t* memref = NULL; + int i; + + for (i = 0; i < 2; i++) { + if (i == 0) { + if (!parse->existing_memrefs) + continue; + + memref_list = &parse->existing_memrefs->memrefs; + } + else { + memref_list = &parse->memrefs->memrefs; + } + + do + { + const rc_memref_t* memref_stop; + + memref = memref_list->items; + memref_stop = memref + memref_list->count; + + for (; memref < memref_stop; ++memref) { + if (memref->address == address && memref->value.size == size) + return memref; + } + + if (!memref_list->next) + break; + + memref_list = memref_list->next; + } while (1); + } + + /* no match found, find a place to put the new entry */ + memref_list = &parse->memrefs->memrefs; + while (memref_list->count == memref_list->capacity && memref_list->next) + memref_list = memref_list->next; + + /* create a new entry */ + if (memref_list->count < memref_list->capacity) { + memref = &memref_list->items[memref_list->count++]; + } else { + const int32_t old_offset = parse->offset; + + if (memref_list->capacity != 0) { + memref_list = memref_list->next = RC_ALLOC_SCRATCH(rc_memref_list_t, parse); + memref_list->next = NULL; + } + + memref_list->items = RC_ALLOC_ARRAY_SCRATCH(rc_memref_t, 8, parse); + memref_list->count = 1; + memref_list->capacity = 8; + memref_list->allocated = 0; + + memref = memref_list->items; + + /* in preparse mode, don't count this memory, we'll do a single allocation once we have + * the final total */ + if (!parse->buffer) + parse->offset = old_offset; + } + + memset(memref, 0, sizeof(*memref)); + memref->value.memref_type = RC_MEMREF_TYPE_MEMREF; + memref->value.type = RC_VALUE_TYPE_UNSIGNED; + memref->value.size = size; + memref->address = address; + + return memref; +} + +rc_modified_memref_t* rc_alloc_modified_memref(rc_parse_state_t* parse, uint8_t size, const rc_operand_t* parent, + uint8_t modifier_type, const rc_operand_t* modifier) { + rc_modified_memref_list_t* modified_memref_list = NULL; + rc_modified_memref_t* modified_memref = NULL; + int i = 0; + + for (i = 0; i < 2; i++) { + if (i == 0) { + if (!parse->existing_memrefs) + continue; + + modified_memref_list = &parse->existing_memrefs->modified_memrefs; + } + else { + modified_memref_list = &parse->memrefs->modified_memrefs; + } + + do { + const rc_modified_memref_t* memref_stop; + + modified_memref = modified_memref_list->items; + memref_stop = modified_memref + modified_memref_list->count; + + for (; modified_memref < memref_stop; ++modified_memref) { + if (modified_memref->memref.value.size == size && + modified_memref->modifier_type == modifier_type && + rc_operands_are_equal(&modified_memref->parent, parent) && + rc_operands_are_equal(&modified_memref->modifier, modifier)) { + return modified_memref; + } + } + + if (!modified_memref_list->next) + break; + + modified_memref_list = modified_memref_list->next; + } while (1); + } + + /* no match found, find a place to put the new entry */ + modified_memref_list = &parse->memrefs->modified_memrefs; + while (modified_memref_list->count == modified_memref_list->capacity && modified_memref_list->next) + modified_memref_list = modified_memref_list->next; + + /* create a new entry */ + if (modified_memref_list->count < modified_memref_list->capacity) { + modified_memref = &modified_memref_list->items[modified_memref_list->count++]; + } else { + const int32_t old_offset = parse->offset; + + if (modified_memref_list->capacity != 0) { + modified_memref_list = modified_memref_list->next = RC_ALLOC_SCRATCH(rc_modified_memref_list_t, parse); + modified_memref_list->next = NULL; + } + + modified_memref_list->items = RC_ALLOC_ARRAY_SCRATCH(rc_modified_memref_t, 8, parse); + modified_memref_list->count = 1; + modified_memref_list->capacity = 8; + modified_memref_list->allocated = 0; + + modified_memref = modified_memref_list->items; + + /* in preparse mode, don't count this memory, we'll do a single allocation once we have + * the final total */ + if (!parse->buffer) + parse->offset = old_offset; + } + + memset(modified_memref, 0, sizeof(*modified_memref)); + modified_memref->memref.value.memref_type = RC_MEMREF_TYPE_MODIFIED_MEMREF; + modified_memref->memref.value.size = size; + modified_memref->memref.value.type = rc_memsize_is_float(size) ? RC_VALUE_TYPE_FLOAT : RC_VALUE_TYPE_UNSIGNED; + memcpy(&modified_memref->parent, parent, sizeof(modified_memref->parent)); + memcpy(&modified_memref->modifier, modifier, sizeof(modified_memref->modifier)); + modified_memref->modifier_type = modifier_type; + modified_memref->depth = 0; + modified_memref->memref.address = rc_operand_is_memref(modifier) ? modifier->value.memref->address : modifier->value.num; + + if (rc_operand_is_memref(parent) && parent->value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF) { + const rc_modified_memref_t* parent_modified_memref = (rc_modified_memref_t*)parent->value.memref; + modified_memref->depth = parent_modified_memref->depth + 1; + } + + return modified_memref; +} + +void rc_memrefs_init(rc_memrefs_t* memrefs) +{ + memset(memrefs, 0, sizeof(*memrefs)); + + memrefs->memrefs.capacity = 32; + memrefs->memrefs.items = + (rc_memref_t*)malloc(memrefs->memrefs.capacity * sizeof(rc_memref_t)); + memrefs->memrefs.allocated = 1; + + memrefs->modified_memrefs.capacity = 16; + memrefs->modified_memrefs.items = + (rc_modified_memref_t*)malloc(memrefs->modified_memrefs.capacity * sizeof(rc_modified_memref_t)); + memrefs->modified_memrefs.allocated = 1; +} + +void rc_memrefs_destroy(rc_memrefs_t* memrefs) +{ + rc_memref_list_t* memref_list = &memrefs->memrefs; + rc_modified_memref_list_t* modified_memref_list = &memrefs->modified_memrefs; + + do { + rc_memref_list_t* current_memref_list = memref_list; + memref_list = memref_list->next; + + if (current_memref_list->allocated) { + if (current_memref_list->items) + free(current_memref_list->items); + + if (current_memref_list != &memrefs->memrefs) + free(current_memref_list); + } + } while (memref_list); + + do { + rc_modified_memref_list_t* current_modified_memref_list = modified_memref_list; + modified_memref_list = modified_memref_list->next; + + if (current_modified_memref_list->allocated) { + if (current_modified_memref_list->items) + free(current_modified_memref_list->items); + + if (current_modified_memref_list != &memrefs->modified_memrefs) + free(current_modified_memref_list); + } + } while (modified_memref_list); + + free(memrefs); +} + +uint32_t rc_memrefs_count_memrefs(const rc_memrefs_t* memrefs) +{ + uint32_t count = 0; + const rc_memref_list_t* memref_list = &memrefs->memrefs; + while (memref_list) { + count += memref_list->count; + memref_list = memref_list->next; + } + + return count; +} + +uint32_t rc_memrefs_count_modified_memrefs(const rc_memrefs_t* memrefs) +{ + uint32_t count = 0; + const rc_modified_memref_list_t* modified_memref_list = &memrefs->modified_memrefs; + while (modified_memref_list) { + count += modified_memref_list->count; + modified_memref_list = modified_memref_list->next; + } + + return count; +} + +int rc_parse_memref(const char** memaddr, uint8_t* size, uint32_t* address) { + const char* aux = *memaddr; + char* end; + unsigned long value; + + if (aux[0] == '0') { + if (aux[1] != 'x' && aux[1] != 'X') + return RC_INVALID_MEMORY_OPERAND; + + aux += 2; + switch (*aux++) { + /* ordered by estimated frequency in case compiler doesn't build a jump table */ + case 'h': case 'H': *size = RC_MEMSIZE_8_BITS; break; + case ' ': *size = RC_MEMSIZE_16_BITS; break; + case 'x': case 'X': *size = RC_MEMSIZE_32_BITS; break; + + case 'm': case 'M': *size = RC_MEMSIZE_BIT_0; break; + case 'n': case 'N': *size = RC_MEMSIZE_BIT_1; break; + case 'o': case 'O': *size = RC_MEMSIZE_BIT_2; break; + case 'p': case 'P': *size = RC_MEMSIZE_BIT_3; break; + case 'q': case 'Q': *size = RC_MEMSIZE_BIT_4; break; + case 'r': case 'R': *size = RC_MEMSIZE_BIT_5; break; + case 's': case 'S': *size = RC_MEMSIZE_BIT_6; break; + case 't': case 'T': *size = RC_MEMSIZE_BIT_7; break; + case 'l': case 'L': *size = RC_MEMSIZE_LOW; break; + case 'u': case 'U': *size = RC_MEMSIZE_HIGH; break; + case 'k': case 'K': *size = RC_MEMSIZE_BITCOUNT; break; + case 'w': case 'W': *size = RC_MEMSIZE_24_BITS; break; + case 'g': case 'G': *size = RC_MEMSIZE_32_BITS_BE; break; + case 'i': case 'I': *size = RC_MEMSIZE_16_BITS_BE; break; + case 'j': case 'J': *size = RC_MEMSIZE_24_BITS_BE; break; + + /* case 'v': case 'V': */ + /* case 'y': case 'Y': 64 bit? */ + /* case 'z': case 'Z': 128 bit? */ + + case '0': + if (*aux == 'x') /* user mistyped an extra 0x: 0x0xabcd */ + return RC_INVALID_MEMORY_OPERAND; + /* fallthrough */ + + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + /* legacy support - addresses without a size prefix are assumed to be 16-bit */ + aux--; + *size = RC_MEMSIZE_16_BITS; + break; + + default: + return RC_INVALID_MEMORY_OPERAND; + } + } + else if (aux[0] == 'f' || aux[0] == 'F') { + ++aux; + switch (*aux++) { + case 'f': case 'F': *size = RC_MEMSIZE_FLOAT; break; + case 'b': case 'B': *size = RC_MEMSIZE_FLOAT_BE; break; + case 'h': case 'H': *size = RC_MEMSIZE_DOUBLE32; break; + case 'i': case 'I': *size = RC_MEMSIZE_DOUBLE32_BE; break; + case 'm': case 'M': *size = RC_MEMSIZE_MBF32; break; + case 'l': case 'L': *size = RC_MEMSIZE_MBF32_LE; break; + + default: + return RC_INVALID_FP_OPERAND; + } + } + else { + return RC_INVALID_MEMORY_OPERAND; + } + + value = strtoul(aux, &end, 16); + + if (end == aux) + return RC_INVALID_MEMORY_OPERAND; + + if (value > 0xffffffffU) + value = 0xffffffffU; + + *address = (uint32_t)value; + *memaddr = end; + return RC_OK; +} + +static float rc_build_float(uint32_t mantissa_bits, int32_t exponent, int sign) { + /* 32-bit float has a 23-bit mantissa and 8-bit exponent */ + const uint32_t implied_bit = 1 << 23; + const uint32_t mantissa = mantissa_bits | implied_bit; + double dbl = ((double)mantissa) / ((double)implied_bit); + + if (exponent > 127) { + /* exponent above 127 is a special number */ + if (mantissa_bits == 0) { + /* infinity */ +#ifdef INFINITY /* INFINITY and NAN #defines require C99 */ + dbl = (double)INFINITY; +#else + dbl = -log(0.0); +#endif + } + else { + /* NaN */ +#ifdef NAN + dbl = NAN; +#else + dbl = -sqrt(-1); +#endif + } + } + else if (exponent > 0) { + /* exponent from 1 to 127 is a number greater than 1 */ + while (exponent > 30) { + dbl *= (double)(1 << 30); + exponent -= 30; + } + dbl *= (double)((long long)1 << exponent); + } + else if (exponent < 0) { + /* exponent from -1 to -127 is a number less than 1 */ + + if (exponent == -127) { + /* exponent -127 (all exponent bits were zero) is a denormalized value + * (no implied leading bit) with exponent -126 */ + dbl = ((double)mantissa_bits) / ((double)implied_bit); + exponent = 126; + } else { + exponent = -exponent; + } + + while (exponent > 30) { + dbl /= (double)(1 << 30); + exponent -= 30; + } + dbl /= (double)((long long)1 << exponent); + } + else { + /* exponent of 0 requires no adjustment */ + } + + return (sign) ? (float)-dbl : (float)dbl; +} + +static void rc_transform_memref_float(rc_typed_value_t* value) { + /* decodes an IEEE 754 float */ + const uint32_t mantissa = (value->value.u32 & 0x7FFFFF); + const int32_t exponent = (int32_t)((value->value.u32 >> 23) & 0xFF) - 127; + const int sign = (value->value.u32 & 0x80000000); + value->value.f32 = rc_build_float(mantissa, exponent, sign); + value->type = RC_VALUE_TYPE_FLOAT; +} + +static void rc_transform_memref_float_be(rc_typed_value_t* value) { + /* decodes an IEEE 754 float in big endian format */ + const uint32_t mantissa = ((value->value.u32 & 0xFF000000) >> 24) | + ((value->value.u32 & 0x00FF0000) >> 8) | + ((value->value.u32 & 0x00007F00) << 8); + const int32_t exponent = (int32_t)(((value->value.u32 & 0x0000007F) << 1) | + ((value->value.u32 & 0x00008000) >> 15)) - 127; + const int sign = (value->value.u32 & 0x00000080); + value->value.f32 = rc_build_float(mantissa, exponent, sign); + value->type = RC_VALUE_TYPE_FLOAT; +} + +static void rc_transform_memref_double32(rc_typed_value_t* value) +{ + /* decodes the four most significant bytes of an IEEE 754 double into a float */ + const uint32_t mantissa = (value->value.u32 & 0x000FFFFF) << 3; + const int32_t exponent = (int32_t)((value->value.u32 >> 20) & 0x7FF) - 1023; + const int sign = (value->value.u32 & 0x80000000); + value->value.f32 = rc_build_float(mantissa, exponent, sign); + value->type = RC_VALUE_TYPE_FLOAT; +} + +static void rc_transform_memref_double32_be(rc_typed_value_t* value) +{ + /* decodes the four most significant bytes of an IEEE 754 double in big endian format into a float */ + const uint32_t mantissa = (((value->value.u32 & 0xFF000000) >> 24) | + ((value->value.u32 & 0x00FF0000) >> 8) | + ((value->value.u32 & 0x00000F00) << 8)) << 3; + const int32_t exponent = (int32_t)(((value->value.u32 & 0x0000007F) << 4) | + ((value->value.u32 & 0x0000F000) >> 12)) - 1023; + const int sign = (value->value.u32 & 0x00000080); + value->value.f32 = rc_build_float(mantissa, exponent, sign); + value->type = RC_VALUE_TYPE_FLOAT; +} + +static void rc_transform_memref_mbf32(rc_typed_value_t* value) { + /* decodes a Microsoft Binary Format float */ + /* NOTE: 32-bit MBF is stored in memory as big endian (at least for Apple II) */ + const uint32_t mantissa = ((value->value.u32 & 0xFF000000) >> 24) | + ((value->value.u32 & 0x00FF0000) >> 8) | + ((value->value.u32 & 0x00007F00) << 8); + const int32_t exponent = (int32_t)(value->value.u32 & 0xFF) - 129; + const int sign = (value->value.u32 & 0x00008000); + + if (mantissa == 0 && exponent == -129) + value->value.f32 = (sign) ? -0.0f : 0.0f; + else + value->value.f32 = rc_build_float(mantissa, exponent, sign); + + value->type = RC_VALUE_TYPE_FLOAT; +} + +static void rc_transform_memref_mbf32_le(rc_typed_value_t* value) { + /* decodes a Microsoft Binary Format float */ + /* Locomotive BASIC (CPC) uses MBF40, but in little endian format */ + const uint32_t mantissa = value->value.u32 & 0x007FFFFF; + const int32_t exponent = (int32_t)(value->value.u32 >> 24) - 129; + const int sign = (value->value.u32 & 0x00800000); + + if (mantissa == 0 && exponent == -129) + value->value.f32 = (sign) ? -0.0f : 0.0f; + else + value->value.f32 = rc_build_float(mantissa, exponent, sign); + + value->type = RC_VALUE_TYPE_FLOAT; +} + +static const uint8_t rc_bits_set[16] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 }; + +void rc_transform_memref_value(rc_typed_value_t* value, uint8_t size) { + /* ASSERT: value->type == RC_VALUE_TYPE_UNSIGNED */ + switch (size) + { + case RC_MEMSIZE_8_BITS: + value->value.u32 = (value->value.u32 & 0x000000ff); + break; + + case RC_MEMSIZE_16_BITS: + value->value.u32 = (value->value.u32 & 0x0000ffff); + break; + + case RC_MEMSIZE_24_BITS: + value->value.u32 = (value->value.u32 & 0x00ffffff); + break; + + case RC_MEMSIZE_32_BITS: + break; + + case RC_MEMSIZE_BIT_0: + value->value.u32 = (value->value.u32 >> 0) & 1; + break; + + case RC_MEMSIZE_BIT_1: + value->value.u32 = (value->value.u32 >> 1) & 1; + break; + + case RC_MEMSIZE_BIT_2: + value->value.u32 = (value->value.u32 >> 2) & 1; + break; + + case RC_MEMSIZE_BIT_3: + value->value.u32 = (value->value.u32 >> 3) & 1; + break; + + case RC_MEMSIZE_BIT_4: + value->value.u32 = (value->value.u32 >> 4) & 1; + break; + + case RC_MEMSIZE_BIT_5: + value->value.u32 = (value->value.u32 >> 5) & 1; + break; + + case RC_MEMSIZE_BIT_6: + value->value.u32 = (value->value.u32 >> 6) & 1; + break; + + case RC_MEMSIZE_BIT_7: + value->value.u32 = (value->value.u32 >> 7) & 1; + break; + + case RC_MEMSIZE_LOW: + value->value.u32 = value->value.u32 & 0x0f; + break; + + case RC_MEMSIZE_HIGH: + value->value.u32 = (value->value.u32 >> 4) & 0x0f; + break; + + case RC_MEMSIZE_BITCOUNT: + value->value.u32 = rc_bits_set[(value->value.u32 & 0x0F)] + + rc_bits_set[((value->value.u32 >> 4) & 0x0F)]; + break; + + case RC_MEMSIZE_16_BITS_BE: + value->value.u32 = ((value->value.u32 & 0xFF00) >> 8) | + ((value->value.u32 & 0x00FF) << 8); + break; + + case RC_MEMSIZE_24_BITS_BE: + value->value.u32 = ((value->value.u32 & 0xFF0000) >> 16) | + (value->value.u32 & 0x00FF00) | + ((value->value.u32 & 0x0000FF) << 16); + break; + + case RC_MEMSIZE_32_BITS_BE: + value->value.u32 = ((value->value.u32 & 0xFF000000) >> 24) | + ((value->value.u32 & 0x00FF0000) >> 8) | + ((value->value.u32 & 0x0000FF00) << 8) | + ((value->value.u32 & 0x000000FF) << 24); + break; + + case RC_MEMSIZE_FLOAT: + rc_transform_memref_float(value); + break; + + case RC_MEMSIZE_FLOAT_BE: + rc_transform_memref_float_be(value); + break; + + case RC_MEMSIZE_DOUBLE32: + rc_transform_memref_double32(value); + break; + + case RC_MEMSIZE_DOUBLE32_BE: + rc_transform_memref_double32_be(value); + break; + + case RC_MEMSIZE_MBF32: + rc_transform_memref_mbf32(value); + break; + + case RC_MEMSIZE_MBF32_LE: + rc_transform_memref_mbf32_le(value); + break; + + default: + break; + } +} + +static const uint32_t rc_memref_masks[] = { + 0x000000ff, /* RC_MEMSIZE_8_BITS */ + 0x0000ffff, /* RC_MEMSIZE_16_BITS */ + 0x00ffffff, /* RC_MEMSIZE_24_BITS */ + 0xffffffff, /* RC_MEMSIZE_32_BITS */ + 0x0000000f, /* RC_MEMSIZE_LOW */ + 0x000000f0, /* RC_MEMSIZE_HIGH */ + 0x00000001, /* RC_MEMSIZE_BIT_0 */ + 0x00000002, /* RC_MEMSIZE_BIT_1 */ + 0x00000004, /* RC_MEMSIZE_BIT_2 */ + 0x00000008, /* RC_MEMSIZE_BIT_3 */ + 0x00000010, /* RC_MEMSIZE_BIT_4 */ + 0x00000020, /* RC_MEMSIZE_BIT_5 */ + 0x00000040, /* RC_MEMSIZE_BIT_6 */ + 0x00000080, /* RC_MEMSIZE_BIT_7 */ + 0x000000ff, /* RC_MEMSIZE_BITCOUNT */ + 0x0000ffff, /* RC_MEMSIZE_16_BITS_BE */ + 0x00ffffff, /* RC_MEMSIZE_24_BITS_BE */ + 0xffffffff, /* RC_MEMSIZE_32_BITS_BE */ + 0xffffffff, /* RC_MEMSIZE_FLOAT */ + 0xffffffff, /* RC_MEMSIZE_MBF32 */ + 0xffffffff, /* RC_MEMSIZE_MBF32_LE */ + 0xffffffff, /* RC_MEMSIZE_FLOAT_BE */ + 0xffffffff, /* RC_MEMSIZE_DOUBLE32 */ + 0xffffffff, /* RC_MEMSIZE_DOUBLE32_BE*/ + 0xffffffff /* RC_MEMSIZE_VARIABLE */ +}; + +uint32_t rc_memref_mask(uint8_t size) { + const size_t index = (size_t)size; + if (index >= sizeof(rc_memref_masks) / sizeof(rc_memref_masks[0])) + return 0xffffffff; + + return rc_memref_masks[index]; +} + +/* all sizes less than 8-bits (1 byte) are mapped to 8-bits. 24-bit is mapped to 32-bit + * as we don't expect the client to understand a request for 3 bytes. all other reads are + * mapped to the little-endian read of the same size. */ +static const uint8_t rc_memref_shared_sizes[] = { + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_8_BITS */ + RC_MEMSIZE_16_BITS, /* RC_MEMSIZE_16_BITS */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_24_BITS */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_32_BITS */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_LOW */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_HIGH */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_0 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_1 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_2 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_3 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_4 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_5 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_6 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BIT_7 */ + RC_MEMSIZE_8_BITS, /* RC_MEMSIZE_BITCOUNT */ + RC_MEMSIZE_16_BITS, /* RC_MEMSIZE_16_BITS_BE */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_24_BITS_BE */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_32_BITS_BE */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_FLOAT */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_MBF32 */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_MBF32_LE */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_FLOAT_BE */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_DOUBLE32 */ + RC_MEMSIZE_32_BITS, /* RC_MEMSIZE_DOUBLE32_BE*/ + RC_MEMSIZE_32_BITS /* RC_MEMSIZE_VARIABLE */ +}; + +uint8_t rc_memref_shared_size(uint8_t size) { + const size_t index = (size_t)size; + if (index >= sizeof(rc_memref_shared_sizes) / sizeof(rc_memref_shared_sizes[0])) + return size; + + return rc_memref_shared_sizes[index]; +} + +uint32_t rc_peek_value(uint32_t address, uint8_t size, rc_peek_t peek, void* ud) { + if (!peek) + return 0; + + switch (size) + { + case RC_MEMSIZE_8_BITS: + return peek(address, 1, ud); + + case RC_MEMSIZE_16_BITS: + return peek(address, 2, ud); + + case RC_MEMSIZE_32_BITS: + return peek(address, 4, ud); + + default: + { + uint32_t value; + const size_t index = (size_t)size; + if (index >= sizeof(rc_memref_shared_sizes) / sizeof(rc_memref_shared_sizes[0])) + return 0; + + /* fetch the larger value and mask off the bits associated to the specified size + * for correct deduction of prior value. non-prior memrefs should already be using + * shared size memrefs to minimize the total number of memory reads required. */ + value = rc_peek_value(address, rc_memref_shared_sizes[index], peek, ud); + return value & rc_memref_masks[index]; + } + } +} + +void rc_update_memref_value(rc_memref_value_t* memref, uint32_t new_value) { + if (memref->value == new_value) { + memref->changed = 0; + } + else { + memref->prior = memref->value; + memref->value = new_value; + memref->changed = 1; + } +} + +void rc_init_parse_state_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs) +{ + if (memrefs) + memset(memrefs, 0, sizeof(*memrefs)); + + parse->memrefs = memrefs; +} + +static uint32_t rc_get_memref_value_value(const rc_memref_value_t* memref, int operand_type) { + switch (operand_type) + { + /* most common case explicitly first, even though it could be handled by default case. + * this helps the compiler to optimize if it turns the switch into a series of if/elses */ + case RC_OPERAND_ADDRESS: + return memref->value; + + case RC_OPERAND_DELTA: + if (!memref->changed) { + /* fallthrough */ + default: + return memref->value; + } + /* fallthrough */ + case RC_OPERAND_PRIOR: + return memref->prior; + } +} + +void rc_get_memref_value(rc_typed_value_t* value, rc_memref_t* memref, int operand_type) { + value->type = memref->value.type; + value->value.u32 = rc_get_memref_value_value(&memref->value, operand_type); +} + +uint32_t rc_get_modified_memref_value(const rc_modified_memref_t* memref, rc_peek_t peek, void* ud) { + rc_typed_value_t value, modifier; + + rc_evaluate_operand(&value, &memref->parent, NULL); + rc_evaluate_operand(&modifier, &memref->modifier, NULL); + + switch (memref->modifier_type) { + case RC_OPERATOR_INDIRECT_READ: + rc_typed_value_add(&value, &modifier); + rc_typed_value_convert(&value, RC_VALUE_TYPE_UNSIGNED); + value.value.u32 = rc_peek_value(value.value.u32, memref->memref.value.size, peek, ud); + value.type = memref->memref.value.type; + break; + + case RC_OPERATOR_SUB_PARENT: + /* sub parent is "-parent + modifier" */ + rc_typed_value_negate(&value); + rc_typed_value_add(&value, &modifier); + rc_typed_value_convert(&value, memref->memref.value.type); + break; + + case RC_OPERATOR_SUB_ACCUMULATOR: + rc_typed_value_negate(&modifier); + /* fallthrough */ /* to case RC_OPERATOR_SUB_ACCUMULATOR */ + + case RC_OPERATOR_ADD_ACCUMULATOR: + /* when modifying the accumulator, force the modifier to match the accumulator + * type instead of promoting them both to the less restrictive type. + * + * 18 - 17.5 will result in an integer. should it be 0 or 1? + * + * default: float is less restrictive, convert both to float for combine, + * then convert to the memref type. + * (int)((float)18 - 17.5) -> (int)(0.5) -> 0 + * + * accumulator is integer: force modifier to be integer before combining + * (int)(18 - (int)17.5) -> (int)(18 - 17) -> 1 + */ + rc_typed_value_convert(&modifier, value.type); + rc_typed_value_add(&value, &modifier); + rc_typed_value_convert(&value, memref->memref.value.type); + break; + + default: + rc_typed_value_combine(&value, &modifier, memref->modifier_type); + rc_typed_value_convert(&value, memref->memref.value.type); + break; + } + + return value.value.u32; +} + +void rc_update_memref_values(rc_memrefs_t* memrefs, rc_peek_t peek, void* ud) { + rc_memref_list_t* memref_list; + rc_modified_memref_list_t* modified_memref_list; + + memref_list = &memrefs->memrefs; + do + { + rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_stop = memref + memref_list->count; + + for (; memref < memref_stop; ++memref) { + if (memref->value.type != RC_VALUE_TYPE_NONE) + rc_update_memref_value(&memref->value, rc_peek_value(memref->address, memref->value.size, peek, ud)); + } + + memref_list = memref_list->next; + } while (memref_list); + + modified_memref_list = &memrefs->modified_memrefs; + if (modified_memref_list->count) { + do { + rc_modified_memref_t* modified_memref = modified_memref_list->items; + const rc_modified_memref_t* modified_memref_stop = modified_memref + modified_memref_list->count; + + for (; modified_memref < modified_memref_stop; ++modified_memref) + rc_update_memref_value(&modified_memref->memref.value, rc_get_modified_memref_value(modified_memref, peek, ud)); + + modified_memref_list = modified_memref_list->next; + } while (modified_memref_list); + } +} diff --git a/src/rcheevos/src/rcheevos/operand.c b/src/rcheevos/src/rcheevos/operand.c new file mode 100644 index 0000000000..ae18d93155 --- /dev/null +++ b/src/rcheevos/src/rcheevos/operand.c @@ -0,0 +1,607 @@ +#include "rc_internal.h" + +#include +#include +#include +#include + +static int rc_parse_operand_func_call(rc_operand_t* self, const char** memaddr) { + const char* aux = *memaddr; + + if (*aux++ != '@') { + return RC_INVALID_FUNC_OPERAND; + } + + if (!isalpha((unsigned char)*aux)) { + return RC_INVALID_FUNC_OPERAND; + } + + while (isalnum((unsigned char)*aux) || *aux == '_') { + aux++; + } + + self->type = RC_OPERAND_FUNC; + self->size = RC_MEMSIZE_32_BITS; + self->memref_access_type = RC_OPERAND_ADDRESS; + *memaddr = aux; + return RC_OK; +} + +static int rc_parse_operand_variable(rc_operand_t* self, const char** memaddr, rc_parse_state_t* parse) { + const char* aux = *memaddr; + size_t i; + char varName[RC_VALUE_MAX_NAME_LENGTH + 1] = { 0 }; + + for (i = 0; i < RC_VALUE_MAX_NAME_LENGTH && *aux != '}'; i++) { + if (!rc_is_valid_variable_character(*aux, i == 0)) + return RC_INVALID_VARIABLE_NAME; + + varName[i] = *aux++; + } + + if (i == 0) + return RC_INVALID_VARIABLE_NAME; + + if (*aux != '}') + return RC_INVALID_VARIABLE_NAME; + + ++aux; + + if (strcmp(varName, "recall") == 0) { + if (parse->remember.type == RC_OPERAND_NONE) { + self->value.memref = NULL; + self->size = RC_MEMSIZE_32_BITS; + self->memref_access_type = RC_OPERAND_ADDRESS; + } + else { + memcpy(self, &parse->remember, sizeof(*self)); + self->is_combining = 0; + self->memref_access_type = self->type; + } + self->type = RC_OPERAND_RECALL; + } + else { /* process named variable when feature is available.*/ + return RC_UNKNOWN_VARIABLE_NAME; + } + + *memaddr = aux; + return RC_OK; +} + +static int rc_parse_operand_memory(rc_operand_t* self, const char** memaddr, rc_parse_state_t* parse) { + const char* aux = *memaddr; + uint32_t address; + uint8_t size; + int ret; + + switch (*aux) { + case 'd': case 'D': + self->type = RC_OPERAND_DELTA; + ++aux; + break; + + case 'p': case 'P': + self->type = RC_OPERAND_PRIOR; + ++aux; + break; + + case 'b': case 'B': + self->type = RC_OPERAND_BCD; + ++aux; + break; + + case '~': + self->type = RC_OPERAND_INVERTED; + ++aux; + break; + + default: + self->type = RC_OPERAND_ADDRESS; + break; + } + + self->memref_access_type = self->type; + + ret = rc_parse_memref(&aux, &self->size, &address); + if (ret != RC_OK) + return ret; + + size = rc_memref_shared_size(self->size); + if (size != self->size && self->type == RC_OPERAND_PRIOR) { + /* if the shared size differs from the requested size and it's a prior operation, we + * have to check to make sure both sizes use the same mask, or the prior value may be + * updated when bits outside the mask are modified, which would make it look like the + * current value once the mask is applied. if the mask differs, create a new + * non-shared record for tracking the prior data. */ + if (rc_memref_mask(size) != rc_memref_mask(self->size)) + size = self->size; + } + + if (parse->indirect_parent.type != RC_OPERAND_NONE) { + rc_operand_t offset; + rc_operand_set_const(&offset, address); + + self->value.memref = (rc_memref_t*)rc_alloc_modified_memref(parse, + size, &parse->indirect_parent, RC_OPERATOR_INDIRECT_READ, &offset); + } + else { + self->value.memref = rc_alloc_memref(parse, address, size); + } + + if (parse->offset < 0) + return parse->offset; + + *memaddr = aux; + return RC_OK; +} + +int rc_parse_operand(rc_operand_t* self, const char** memaddr, rc_parse_state_t* parse) { + const char* aux = *memaddr; + char* end; + int ret; + unsigned long value; + int negative; + int allow_decimal = 0; + + self->is_combining = 0; + + switch (*aux) { + case 'h': case 'H': /* hex constant */ + if (aux[2] == 'x' || aux[2] == 'X') { + /* H0x1234 is a typo - either H1234 or 0xH1234 was probably meant */ + return RC_INVALID_CONST_OPERAND; + } + + value = strtoul(++aux, &end, 16); + if (end == aux) + return RC_INVALID_CONST_OPERAND; + + if (value > 0xffffffffU) + value = 0xffffffffU; + + rc_operand_set_const(self, (unsigned)value); + + aux = end; + break; + + case 'f': case 'F': /* floating point constant */ + if (isalpha((unsigned char)aux[1])) { + ret = rc_parse_operand_memory(self, &aux, parse); + + if (ret < 0) + return ret; + + break; + } + allow_decimal = 1; + /* fall through */ + case 'v': case 'V': /* signed integer constant */ + ++aux; + /* fall through */ + case '+': case '-': /* signed integer constant */ + negative = 0; + if (*aux == '-') { + negative = 1; + ++aux; + } + else if (*aux == '+') { + ++aux; + } + + value = strtoul(aux, &end, 10); + + if (*end == '.' && allow_decimal) { + /* custom parser for decimal values to ignore locale */ + unsigned long shift = 1; + unsigned long fraction = 0; + double dbl_val; + + aux = end + 1; + if (*aux < '0' || *aux > '9') + return RC_INVALID_FP_OPERAND; + + do { + /* only keep as many digits as will fit in a 32-bit value to prevent overflow. + * float only has around 7 digits of precision anyway. */ + if (shift < 1000000000) { + fraction *= 10; + fraction += (*aux - '0'); + shift *= 10; + } + ++aux; + } while (*aux >= '0' && *aux <= '9'); + + if (fraction != 0) { + /* non-zero fractional part, convert to double and merge in integer portion */ + const double dbl_fraction = ((double)fraction) / ((double)shift); + if (negative) + dbl_val = ((double)(-((long)value))) - dbl_fraction; + else + dbl_val = (double)value + dbl_fraction; + } + else { + /* fractional part is 0, just convert the integer portion */ + if (negative) + dbl_val = (double)(-((long)value)); + else + dbl_val = (double)value; + } + + rc_operand_set_float_const(self, dbl_val); + } + else { + /* not a floating point value, make sure something was read and advance the read pointer */ + if (end == aux) + return allow_decimal ? RC_INVALID_FP_OPERAND : RC_INVALID_CONST_OPERAND; + + aux = end; + + if (value > 0x7fffffffU) + value = 0x7fffffffU; + + if (negative) + rc_operand_set_const(self, (unsigned)(-((long)value))); + else + rc_operand_set_const(self, (unsigned)value); + } + break; + case '{': /* variable */ + ++aux; + ret = rc_parse_operand_variable(self, &aux, parse); + if (ret < 0) + return ret; + + break; + + case '0': + if (aux[1] == 'x' || aux[1] == 'X') { /* hex integer constant */ + /* fallthrough */ /* to default */ + default: + ret = rc_parse_operand_memory(self, &aux, parse); + + if (ret < 0) + return ret; + + break; + } + /* fallthrough */ /* to case '1' for case '0' where not '0x' */ + case '1': case '2': case '3': case '4': case '5': /* unsigned integer constant */ + case '6': case '7': case '8': case '9': + value = strtoul(aux, &end, 10); + if (end == aux) + return RC_INVALID_CONST_OPERAND; + + if (value > 0xffffffffU) + value = 0xffffffffU; + + rc_operand_set_const(self, (unsigned)value); + + aux = end; + break; + + case '@': + ret = rc_parse_operand_func_call(self, &aux); + + if (ret < 0) + return ret; + + break; + } + + *memaddr = aux; + return RC_OK; +} + +void rc_operand_set_const(rc_operand_t* self, uint32_t value) { + self->size = RC_MEMSIZE_32_BITS; + self->type = RC_OPERAND_CONST; + self->memref_access_type = RC_OPERAND_NONE; + self->value.num = value; +} + +void rc_operand_set_float_const(rc_operand_t* self, double value) { + self->size = RC_MEMSIZE_FLOAT; + self->type = RC_OPERAND_FP; + self->memref_access_type = RC_OPERAND_NONE; + self->value.dbl = value; +} + +int rc_operands_are_equal(const rc_operand_t* left, const rc_operand_t* right) { + if (left == right) + return 1; + + if (left->type != right->type) + return 0; + + switch (left->type) { + case RC_OPERAND_CONST: + return (left->value.num == right->value.num); + case RC_OPERAND_FP: + return (left->value.dbl == right->value.dbl); + case RC_OPERAND_RECALL: + return (left->value.memref == right->value.memref); + default: + break; + } + + /* comparing two memrefs - look for exact matches on type and size */ + if (left->size != right->size || left->value.memref->value.memref_type != right->value.memref->value.memref_type) + return 0; + + switch (left->value.memref->value.memref_type) { + case RC_MEMREF_TYPE_MODIFIED_MEMREF: + { + const rc_modified_memref_t* left_memref = (const rc_modified_memref_t*)left->value.memref; + const rc_modified_memref_t* right_memref = (const rc_modified_memref_t*)right->value.memref; + return (left_memref->modifier_type == right_memref->modifier_type && + left_memref->depth == right_memref->depth && + rc_operands_are_equal(&left_memref->modifier, &right_memref->modifier) && + rc_operands_are_equal(&left_memref->parent, &right_memref->parent) && + 1 == 1 + ); + } + + default: + return (left->value.memref->address == right->value.memref->address && + left->value.memref->value.size == right->value.memref->value.size); + } +} + +int rc_operator_is_modifying(int oper) { + switch (oper) { + case RC_OPERATOR_AND: + case RC_OPERATOR_XOR: + case RC_OPERATOR_DIV: + case RC_OPERATOR_MULT: + case RC_OPERATOR_MOD: + case RC_OPERATOR_ADD: + case RC_OPERATOR_SUB: + case RC_OPERATOR_NONE: /* NONE operator implies "* 1" */ + return 1; + + default: + return 0; + } +} + +int rc_memsize_is_float(uint8_t size) { + switch (size) { + case RC_MEMSIZE_FLOAT: + case RC_MEMSIZE_FLOAT_BE: + case RC_MEMSIZE_DOUBLE32: + case RC_MEMSIZE_DOUBLE32_BE: + case RC_MEMSIZE_MBF32: + case RC_MEMSIZE_MBF32_LE: + return 1; + + default: + return 0; + } +} + +int rc_operand_is_float_memref(const rc_operand_t* self) { + if (!rc_operand_is_memref(self)) + return 0; + + if (self->value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF) { + const rc_modified_memref_t* memref = (const rc_modified_memref_t*)self->value.memref; + if (memref->modifier_type != RC_OPERATOR_INDIRECT_READ) + return rc_memsize_is_float(self->value.memref->value.size); + } + + return rc_memsize_is_float(self->size); +} + +int rc_operand_type_is_memref(uint8_t type) { + switch (type) { + case RC_OPERAND_CONST: + case RC_OPERAND_FP: + case RC_OPERAND_FUNC: + case RC_OPERAND_RECALL: + return 0; + + default: + return 1; + } +} + +int rc_operand_type_is_transform(uint8_t type) { + switch (type) { + case RC_OPERAND_BCD: + case RC_OPERAND_INVERTED: + return 1; + + default: + return 0; + } +} + +int rc_operand_is_memref(const rc_operand_t* self) { + return rc_operand_type_is_memref(self->type); +} + +int rc_operand_is_recall(const rc_operand_t* self) { + switch (self->type) { + case RC_OPERAND_RECALL: + return 1; + + default: + return 0; + } +} + +int rc_operand_is_float(const rc_operand_t* self) { + if (self->type == RC_OPERAND_FP) + return 1; + + if (self->type == RC_OPERAND_RECALL) + return rc_memsize_is_float(self->size); + + return rc_operand_is_float_memref(self); +} + +static uint32_t rc_transform_operand_value(uint32_t value, const rc_operand_t* self) { + switch (self->type) + { + case RC_OPERAND_BCD: + switch (self->size) + { + case RC_MEMSIZE_8_BITS: + value = ((value >> 4) & 0x0f) * 10 + + ((value ) & 0x0f); + break; + + case RC_MEMSIZE_16_BITS: + case RC_MEMSIZE_16_BITS_BE: + value = ((value >> 12) & 0x0f) * 1000 + + ((value >> 8) & 0x0f) * 100 + + ((value >> 4) & 0x0f) * 10 + + ((value ) & 0x0f); + break; + + case RC_MEMSIZE_24_BITS: + case RC_MEMSIZE_24_BITS_BE: + value = ((value >> 20) & 0x0f) * 100000 + + ((value >> 16) & 0x0f) * 10000 + + ((value >> 12) & 0x0f) * 1000 + + ((value >> 8) & 0x0f) * 100 + + ((value >> 4) & 0x0f) * 10 + + ((value ) & 0x0f); + break; + + case RC_MEMSIZE_32_BITS: + case RC_MEMSIZE_32_BITS_BE: + case RC_MEMSIZE_VARIABLE: + value = ((value >> 28) & 0x0f) * 10000000 + + ((value >> 24) & 0x0f) * 1000000 + + ((value >> 20) & 0x0f) * 100000 + + ((value >> 16) & 0x0f) * 10000 + + ((value >> 12) & 0x0f) * 1000 + + ((value >> 8) & 0x0f) * 100 + + ((value >> 4) & 0x0f) * 10 + + ((value ) & 0x0f); + break; + + default: + break; + } + break; + + case RC_OPERAND_INVERTED: + switch (self->size) + { + case RC_MEMSIZE_LOW: + case RC_MEMSIZE_HIGH: + value ^= 0x0f; + break; + + case RC_MEMSIZE_8_BITS: + value ^= 0xff; + break; + + case RC_MEMSIZE_16_BITS: + case RC_MEMSIZE_16_BITS_BE: + value ^= 0xffff; + break; + + case RC_MEMSIZE_24_BITS: + case RC_MEMSIZE_24_BITS_BE: + value ^= 0xffffff; + break; + + case RC_MEMSIZE_32_BITS: + case RC_MEMSIZE_32_BITS_BE: + case RC_MEMSIZE_VARIABLE: + value ^= 0xffffffff; + break; + + default: + value ^= 0x01; + break; + } + break; + + default: + break; + } + + return value; +} + +void rc_operand_addsource(rc_operand_t* self, rc_parse_state_t* parse, uint8_t new_size) { + rc_modified_memref_t* modified_memref; + + if ((self->type == RC_OPERAND_DELTA || self->type == RC_OPERAND_PRIOR) && + self->type == parse->addsource_parent.type) { + /* if adding prev(x) and prev(y), just add x and y and take the prev of that. + * same for adding prior(x) and prior(y). */ + rc_operand_t modifier; + memcpy(&modifier, self, sizeof(modifier)); + modifier.type = parse->addsource_parent.type = RC_OPERAND_ADDRESS; + + modified_memref = rc_alloc_modified_memref(parse, + new_size, &parse->addsource_parent, parse->addsource_oper, &modifier); + } + else { + modified_memref = rc_alloc_modified_memref(parse, + new_size, &parse->addsource_parent, parse->addsource_oper, self); + + /* the modified memref will contain the combination of modified values, take the current value from that */ + self->type = self->memref_access_type = RC_OPERAND_ADDRESS; + } + + self->value.memref = (rc_memref_t*)modified_memref; + + /* result of an AddSource operation is always a 32-bit integer (even if parent or modifier is a float) */ + self->size = RC_MEMSIZE_32_BITS; +} + +void rc_evaluate_operand(rc_typed_value_t* result, const rc_operand_t* self, rc_eval_state_t* eval_state) { + /* step 1: read memory */ + switch (self->type) { + case RC_OPERAND_CONST: + result->type = RC_VALUE_TYPE_UNSIGNED; + result->value.u32 = self->value.num; + return; + + case RC_OPERAND_FP: + result->type = RC_VALUE_TYPE_FLOAT; + result->value.f32 = (float)self->value.dbl; + return; + + case RC_OPERAND_FUNC: + /* this feature was never actualized */ + result->type = RC_VALUE_TYPE_UNSIGNED; + result->value.u32 = 0; + return; + + case RC_OPERAND_RECALL: + if (!rc_operand_type_is_memref(self->memref_access_type)) { + rc_operand_t recall; + memcpy(&recall, self, sizeof(recall)); + recall.type = self->memref_access_type; + rc_evaluate_operand(result, &recall, eval_state); + return; + } + + if (!self->value.memref) { + result->type = RC_VALUE_TYPE_UNSIGNED; + result->value.u32 = 0; + return; + } + + rc_get_memref_value(result, self->value.memref, self->memref_access_type); + break; + + default: + rc_get_memref_value(result, self->value.memref, self->type); + break; + } + + /* step 2: convert read memory to desired format */ + rc_transform_memref_value(result, self->size); + + /* step 3: apply logic (BCD/invert) */ + if (result->type == RC_VALUE_TYPE_UNSIGNED) + result->value.u32 = rc_transform_operand_value(result->value.u32, self); +} diff --git a/src/rcheevos/src/rcheevos/rc_internal.h b/src/rcheevos/src/rcheevos/rc_internal.h new file mode 100644 index 0000000000..f5c3b19b33 --- /dev/null +++ b/src/rcheevos/src/rcheevos/rc_internal.h @@ -0,0 +1,390 @@ +#ifndef RC_INTERNAL_H +#define RC_INTERNAL_H + +#include "rc_runtime_types.h" +#include "rc_util.h" + +RC_BEGIN_C_DECLS + +typedef struct rc_scratch_string { + char* value; + struct rc_scratch_string* left; + struct rc_scratch_string* right; +} +rc_scratch_string_t; + +typedef struct rc_modified_memref_t { + rc_memref_t memref; /* For compatibility with rc_operand_t.value.memref */ + rc_operand_t parent; /* The parent memref this memref is derived from (type will always be a memref type) */ + rc_operand_t modifier; /* The modifier to apply to the parent. */ + uint8_t modifier_type; /* How to apply the modifier to the parent. (RC_OPERATOR_*) */ + uint16_t depth; /* The number of parents this memref has. */ +} +rc_modified_memref_t; + +typedef struct rc_memref_list_t { + rc_memref_t* items; + struct rc_memref_list_t* next; + uint16_t count; + uint16_t capacity; + uint8_t allocated; +} rc_memref_list_t; + +typedef struct rc_modified_memref_list_t { + rc_modified_memref_t* items; + struct rc_modified_memref_list_t* next; + uint16_t count; + uint16_t capacity; + uint8_t allocated; +} rc_modified_memref_list_t; + +typedef struct rc_memrefs_t { + rc_memref_list_t memrefs; + rc_modified_memref_list_t modified_memrefs; +} rc_memrefs_t; + +typedef struct rc_trigger_with_memrefs_t { + rc_trigger_t trigger; + rc_memrefs_t memrefs; +} rc_trigger_with_memrefs_t; + +typedef struct rc_lboard_with_memrefs_t { + rc_lboard_t lboard; + rc_memrefs_t memrefs; +} rc_lboard_with_memrefs_t; + +typedef struct rc_richpresence_with_memrefs_t { + rc_richpresence_t richpresence; + rc_memrefs_t memrefs; +} rc_richpresence_with_memrefs_t; + +typedef struct rc_value_with_memrefs_t { + rc_value_t value; + rc_memrefs_t memrefs; +} rc_value_with_memrefs_t; + +/* enum helpers for natvis expansion. Have to use a struct to define the mapping, + * and a single field to allow the conditional logic to switch on the value */ +typedef struct __rc_bool_enum_t { uint8_t value; } __rc_bool_enum_t; +typedef struct __rc_memsize_enum_t { uint8_t value; } __rc_memsize_enum_t; +typedef struct __rc_memsize_enum_func_t { uint8_t value; } __rc_memsize_enum_func_t; +typedef struct __rc_operand_enum_t { uint8_t value; } __rc_operand_enum_t; +typedef struct __rc_value_type_enum_t { uint8_t value; } __rc_value_type_enum_t; +typedef struct __rc_memref_type_enum_t { uint8_t value; } __rc_memref_type_enum_t; +typedef struct __rc_condition_enum_t { uint8_t value; } __rc_condition_enum_t; +typedef struct __rc_condition_enum_str_t { uint8_t value; } __rc_condition_enum_str_t; +typedef struct __rc_condset_list_t { rc_condset_t* first_condset; } __rc_condset_list_t; +typedef struct __rc_operator_enum_t { uint8_t value; } __rc_operator_enum_t; +typedef struct __rc_operator_enum_str_t { uint8_t value; } __rc_operator_enum_str_t; +typedef struct __rc_operand_memref_t { rc_operand_t operand; } __rc_operand_memref_t; /* requires &rc_operand_t to be the same as &rc_operand_t.value.memref */ +typedef struct __rc_value_list_t { rc_value_t* first_value; } __rc_value_list_t; +typedef struct __rc_trigger_state_enum_t { uint8_t value; } __rc_trigger_state_enum_t; +typedef struct __rc_lboard_state_enum_t { uint8_t value; } __rc_lboard_state_enum_t; +typedef struct __rc_richpresence_display_list_t { rc_richpresence_display_t* first_display; } __rc_richpresence_display_list_t; +typedef struct __rc_richpresence_display_part_list_t { rc_richpresence_display_part_t* display; } __rc_richpresence_display_part_list_t; +typedef struct __rc_richpresence_lookup_list_t { rc_richpresence_lookup_t* first_lookup; } __rc_richpresence_lookup_list_t; +typedef struct __rc_format_enum_t { uint8_t value; } __rc_format_enum_t; + +#define RC_ALLOW_ALIGN(T) struct __align_ ## T { uint8_t ch; T t; }; + +RC_ALLOW_ALIGN(rc_condition_t) +RC_ALLOW_ALIGN(rc_condset_t) +RC_ALLOW_ALIGN(rc_modified_memref_t) +RC_ALLOW_ALIGN(rc_lboard_t) +RC_ALLOW_ALIGN(rc_lboard_with_memrefs_t) +RC_ALLOW_ALIGN(rc_memref_t) +RC_ALLOW_ALIGN(rc_memref_list_t) +RC_ALLOW_ALIGN(rc_memrefs_t) +RC_ALLOW_ALIGN(rc_modified_memref_list_t) +RC_ALLOW_ALIGN(rc_operand_t) +RC_ALLOW_ALIGN(rc_richpresence_t) +RC_ALLOW_ALIGN(rc_richpresence_display_t) +RC_ALLOW_ALIGN(rc_richpresence_display_part_t) +RC_ALLOW_ALIGN(rc_richpresence_lookup_t) +RC_ALLOW_ALIGN(rc_richpresence_lookup_item_t) +RC_ALLOW_ALIGN(rc_richpresence_with_memrefs_t) +RC_ALLOW_ALIGN(rc_scratch_string_t) +RC_ALLOW_ALIGN(rc_trigger_t) +RC_ALLOW_ALIGN(rc_trigger_with_memrefs_t) +RC_ALLOW_ALIGN(rc_value_t) +RC_ALLOW_ALIGN(rc_value_with_memrefs_t) +RC_ALLOW_ALIGN(char) + +#define RC_ALIGNOF(T) (sizeof(struct __align_ ## T) - sizeof(T)) +#define RC_OFFSETOF(o, t) (int)((uint8_t*)&(o.t) - (uint8_t*)&(o)) + +#define RC_ALLOC(t, p) ((t*)rc_alloc((p)->buffer, &(p)->offset, sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t))) +#define RC_ALLOC_SCRATCH(t, p) ((t*)rc_alloc_scratch((p)->buffer, &(p)->offset, sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t))) +#define RC_ALLOC_ARRAY(t, n, p) ((t*)rc_alloc((p)->buffer, &(p)->offset, (n) * sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t))) +#define RC_ALLOC_ARRAY_SCRATCH(t, n, p) ((t*)rc_alloc_scratch((p)->buffer, &(p)->offset, (n) * sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t))) + +#define RC_ALLOC_WITH_TRAILING(container_type, trailing_type, trailing_field, trailing_count, parse) ((container_type*)rc_alloc(\ + (parse)->buffer, &(parse)->offset, \ + RC_OFFSETOF((*(container_type*)NULL),trailing_field) + trailing_count * sizeof(trailing_type), \ + RC_ALIGNOF(container_type), &(parse)->scratch, 0)) +#define RC_GET_TRAILING(container_pointer, container_type, trailing_type, trailing_field) (trailing_type*)(&((container_type*)(container_pointer))->trailing_field) + +/* force alignment to 4 bytes on 32-bit systems, or 8 bytes on 64-bit systems */ +#define RC_ALIGN(n) (((n) + (sizeof(void*)-1)) & ~(sizeof(void*)-1)) + +typedef struct { + rc_buffer_t buffer; + rc_scratch_string_t* strings; + + struct objs { + rc_condition_t* __rc_condition_t; + rc_condset_t* __rc_condset_t; + rc_modified_memref_t* __rc_modified_memref_t; + rc_lboard_t* __rc_lboard_t; + rc_lboard_with_memrefs_t* __rc_lboard_with_memrefs_t; + rc_memref_t* __rc_memref_t; + rc_memref_list_t* __rc_memref_list_t; + rc_memrefs_t* __rc_memrefs_t; + rc_modified_memref_list_t* __rc_modified_memref_list_t; + rc_operand_t* __rc_operand_t; + rc_richpresence_t* __rc_richpresence_t; + rc_richpresence_display_t* __rc_richpresence_display_t; + rc_richpresence_display_part_t* __rc_richpresence_display_part_t; + rc_richpresence_lookup_t* __rc_richpresence_lookup_t; + rc_richpresence_lookup_item_t* __rc_richpresence_lookup_item_t; + rc_richpresence_with_memrefs_t* __rc_richpresence_with_memrefs_t; + rc_scratch_string_t __rc_scratch_string_t; + rc_trigger_t* __rc_trigger_t; + rc_trigger_with_memrefs_t* __rc_trigger_with_memrefs_t; + rc_value_t* __rc_value_t; + rc_value_with_memrefs_t* __rc_value_with_memrefs_t; + + /* these fields aren't actually used by the code, but they force the + * virtual enum wrapper types to exist so natvis can use them */ + union { + __rc_bool_enum_t boolean; + __rc_memsize_enum_t memsize; + __rc_memsize_enum_func_t memsize_func; + __rc_operand_enum_t operand; + __rc_value_type_enum_t value_type; + __rc_memref_type_enum_t memref_type; + __rc_condition_enum_t condition; + __rc_condition_enum_str_t condition_str; + __rc_condset_list_t condset_list; + __rc_operator_enum_t oper; + __rc_operator_enum_str_t oper_str; + __rc_operand_memref_t operand_memref; + __rc_value_list_t value_list; + __rc_trigger_state_enum_t trigger_state; + __rc_lboard_state_enum_t lboard_state; + __rc_richpresence_display_list_t richpresence_display_list; + __rc_richpresence_display_part_list_t richpresence_display_part_list; + __rc_richpresence_lookup_list_t richpresence_lookup_list; + __rc_format_enum_t format; + } natvis_extension; + } objs; +} +rc_scratch_t; + +enum { + RC_VALUE_TYPE_NONE, + RC_VALUE_TYPE_UNSIGNED, + RC_VALUE_TYPE_SIGNED, + RC_VALUE_TYPE_FLOAT +}; + +typedef struct { + union { + uint32_t u32; + int32_t i32; + float f32; + } value; + + char type; +} +rc_typed_value_t; + +enum { + RC_MEMREF_TYPE_MEMREF, /* rc_memref_t */ + RC_MEMREF_TYPE_MODIFIED_MEMREF, /* rc_modified_memref_t */ + RC_MEMREF_TYPE_VALUE /* rc_value_t */ +}; + +#define RC_MEASURED_UNKNOWN 0xFFFFFFFF +#define RC_OPERAND_NONE 0xFF + +typedef struct { + /* memory accessors */ + rc_peek_t peek; + void* peek_userdata; + + /* processing state */ + rc_typed_value_t measured_value; /* captured Measured value */ + int32_t add_hits; /* AddHits/SubHits accumulator */ + uint8_t is_true; /* true if all conditions are true */ + uint8_t is_primed; /* true if all non-Trigger conditions are true */ + uint8_t is_paused; /* true if one or more PauseIf conditions is true */ + uint8_t can_measure; /* false if the measured value should be ignored */ + uint8_t measured_from_hits; /* true if the measured_value came from a condition's hit count */ + uint8_t and_next; /* true if the previous condition was AndNext true */ + uint8_t or_next; /* true if the previous condition was OrNext true */ + uint8_t reset_next; /* true if the previous condition was ResetNextIf true */ + uint8_t stop_processing; /* true to abort the processing loop */ + + /* result state */ + uint8_t has_hits; /* true if one of more hit counts is non-zero */ + uint8_t was_reset; /* true if one or more ResetIf conditions is true */ + uint8_t was_cond_reset; /* true if one or more ResetNextIf conditions is true */ + + /* control settings */ + uint8_t can_short_curcuit; /* allows logic processing to stop as soon as a false condition is encountered */ +} +rc_eval_state_t; + +typedef struct { + int32_t offset; + + void* buffer; + rc_scratch_t scratch; + + rc_memrefs_t* memrefs; + rc_memrefs_t* existing_memrefs; + rc_value_t** variables; + + uint32_t measured_target; + int lines_read; + + rc_operand_t addsource_parent; + rc_operand_t indirect_parent; + rc_operand_t remember; + uint8_t addsource_oper; + + uint8_t is_value; + uint8_t has_required_hits; + uint8_t measured_as_percent; + uint8_t ignore_non_parse_errors; +} +rc_parse_state_t; + +typedef struct rc_preparse_state_t { + rc_parse_state_t parse; + rc_memrefs_t memrefs; +} rc_preparse_state_t; + +void rc_init_parse_state(rc_parse_state_t* parse, void* buffer); +void rc_init_parse_state_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs); +void rc_reset_parse_state(rc_parse_state_t* parse, void* buffer); +void rc_destroy_parse_state(rc_parse_state_t* parse); +void rc_init_preparse_state(rc_preparse_state_t* preparse); +void rc_preparse_alloc_memrefs(rc_memrefs_t* memrefs, rc_preparse_state_t* preparse); +void rc_preparse_reserve_memrefs(rc_preparse_state_t* preparse, rc_memrefs_t* memrefs); +void rc_preparse_copy_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs); +void rc_destroy_preparse_state(rc_preparse_state_t *preparse); + +void* rc_alloc(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset); +void* rc_alloc_scratch(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset); +char* rc_alloc_str(rc_parse_state_t* parse, const char* text, size_t length); + +rc_memref_t* rc_alloc_memref(rc_parse_state_t* parse, uint32_t address, uint8_t size); +rc_modified_memref_t* rc_alloc_modified_memref(rc_parse_state_t* parse, uint8_t size, const rc_operand_t* parent, + uint8_t modifier_type, const rc_operand_t* modifier); +int rc_parse_memref(const char** memaddr, uint8_t* size, uint32_t* address); +void rc_update_memref_values(rc_memrefs_t* memrefs, rc_peek_t peek, void* ud); +void rc_update_memref_value(rc_memref_value_t* memref, uint32_t value); +void rc_get_memref_value(rc_typed_value_t* value, rc_memref_t* memref, int operand_type); +uint32_t rc_get_modified_memref_value(const rc_modified_memref_t* memref, rc_peek_t peek, void* ud); +uint8_t rc_memref_shared_size(uint8_t size); +uint32_t rc_memref_mask(uint8_t size); +void rc_transform_memref_value(rc_typed_value_t* value, uint8_t size); +uint32_t rc_peek_value(uint32_t address, uint8_t size, rc_peek_t peek, void* ud); + +void rc_memrefs_init(rc_memrefs_t* memrefs); +void rc_memrefs_destroy(rc_memrefs_t* memrefs); +uint32_t rc_memrefs_count_memrefs(const rc_memrefs_t* memrefs); +uint32_t rc_memrefs_count_modified_memrefs(const rc_memrefs_t* memrefs); + +void rc_parse_trigger_internal(rc_trigger_t* self, const char** memaddr, rc_parse_state_t* parse); +int rc_trigger_state_active(int state); +rc_memrefs_t* rc_trigger_get_memrefs(rc_trigger_t* self); + +typedef struct rc_condset_with_trailing_conditions_t { + rc_condset_t condset; + rc_condition_t conditions[2]; +} rc_condset_with_trailing_conditions_t; +RC_ALLOW_ALIGN(rc_condset_with_trailing_conditions_t) + +rc_condset_t* rc_parse_condset(const char** memaddr, rc_parse_state_t* parse); +int rc_test_condset(rc_condset_t* self, rc_eval_state_t* eval_state); +void rc_reset_condset(rc_condset_t* self); +rc_condition_t* rc_condset_get_conditions(rc_condset_t* self); +void rc_test_condset_internal(rc_condition_t* condition, uint32_t num_conditions, rc_eval_state_t* eval_state, int can_short_circuit); + +enum { + RC_PROCESSING_COMPARE_DEFAULT = 0, + RC_PROCESSING_COMPARE_MEMREF_TO_CONST, + RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, + RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF, + RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, + RC_PROCESSING_COMPARE_DELTA_TO_CONST, + RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED, + RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED, + RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, + RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED, + RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED, + RC_PROCESSING_COMPARE_ALWAYS_TRUE, + RC_PROCESSING_COMPARE_ALWAYS_FALSE +}; + +rc_condition_t* rc_parse_condition(const char** memaddr, rc_parse_state_t* parse); +void rc_parse_condition_internal(rc_condition_t* self, const char** memaddr, rc_parse_state_t* parse); +void rc_condition_update_parse_state(rc_condition_t* condition, rc_parse_state_t* parse); +int rc_test_condition(rc_condition_t* self, rc_eval_state_t* eval_state); +void rc_evaluate_condition_value(rc_typed_value_t* value, rc_condition_t* self, rc_eval_state_t* eval_state); +int rc_condition_is_combining(const rc_condition_t* self); +void rc_condition_convert_to_operand(const rc_condition_t* condition, rc_operand_t* operand, rc_parse_state_t* parse); +const rc_operand_t* rc_condition_get_real_operand1(const rc_condition_t* self); + +int rc_parse_operand(rc_operand_t* self, const char** memaddr, rc_parse_state_t* parse); +void rc_evaluate_operand(rc_typed_value_t* value, const rc_operand_t* self, rc_eval_state_t* eval_state); +int rc_operator_is_modifying(int oper); +int rc_memsize_is_float(uint8_t size); +int rc_operand_is_float_memref(const rc_operand_t* self); +int rc_operand_is_float(const rc_operand_t* self); +int rc_operand_is_recall(const rc_operand_t* self); +int rc_operand_type_is_memref(uint8_t type); +int rc_operand_type_is_transform(uint8_t type); +int rc_operands_are_equal(const rc_operand_t* left, const rc_operand_t* right); +void rc_operand_addsource(rc_operand_t* self, rc_parse_state_t* parse, uint8_t new_size); +void rc_operand_set_const(rc_operand_t* self, uint32_t value); +void rc_operand_set_float_const(rc_operand_t* self, double value); + +int rc_is_valid_variable_character(char ch, int is_first); +void rc_parse_value_internal(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse); +int rc_evaluate_value_typed(rc_value_t* self, rc_typed_value_t* value, rc_peek_t peek, void* ud); +void rc_reset_value(rc_value_t* self); +int rc_value_from_hits(rc_value_t* self); +rc_value_t* rc_alloc_variable(const char* memaddr, size_t memaddr_len, rc_parse_state_t* parse); +uint32_t rc_count_values(const rc_value_t* values); +void rc_update_values(rc_value_t* values, rc_peek_t peek, void* ud); +void rc_reset_values(rc_value_t* values); + +void rc_typed_value_convert(rc_typed_value_t* value, char new_type); +void rc_typed_value_add(rc_typed_value_t* value, const rc_typed_value_t* amount); +void rc_typed_value_multiply(rc_typed_value_t* value, const rc_typed_value_t* amount); +void rc_typed_value_divide(rc_typed_value_t* value, const rc_typed_value_t* amount); +void rc_typed_value_modulus(rc_typed_value_t* value, const rc_typed_value_t* amount); +void rc_typed_value_negate(rc_typed_value_t* value); +int rc_typed_value_compare(const rc_typed_value_t* value1, const rc_typed_value_t* value2, char oper); +void rc_typed_value_combine(rc_typed_value_t* value, rc_typed_value_t* amount, uint8_t oper); +void rc_typed_value_from_memref_value(rc_typed_value_t* value, const rc_memref_value_t* memref); + +int rc_format_typed_value(char* buffer, size_t size, const rc_typed_value_t* value, int format); + +void rc_parse_lboard_internal(rc_lboard_t* self, const char* memaddr, rc_parse_state_t* parse); +int rc_lboard_state_active(int state); + +void rc_parse_richpresence_internal(rc_richpresence_t* self, const char* script, rc_parse_state_t* parse); +rc_memrefs_t* rc_richpresence_get_memrefs(rc_richpresence_t* self); +void rc_reset_richpresence_triggers(rc_richpresence_t* self); +void rc_update_richpresence_internal(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud); + +int rc_validate_memrefs_for_console(const rc_memrefs_t* memrefs, char result[], const size_t result_size, uint32_t console_id); + +RC_END_C_DECLS + +#endif /* RC_INTERNAL_H */ diff --git a/src/rcheevos/src/rcheevos/rc_validate.c b/src/rcheevos/src/rcheevos/rc_validate.c new file mode 100644 index 0000000000..8e05a9227d --- /dev/null +++ b/src/rcheevos/src/rcheevos/rc_validate.c @@ -0,0 +1,1370 @@ +#include "rc_validate.h" + +#include "rc_consoles.h" +#include "rc_internal.h" + +#include "../rc_compat.h" + +#include +#include + +enum +{ + RC_VALIDATION_ERR_NONE, + + /* sorted by severity - most severe first */ + + /* errors that prevent the achievement from functioning */ + RC_VALIDATION_ERR_ADDRESS_OUT_OF_RANGE, + RC_VALIDATION_ERR_RECALL_BEFORE_REMEMBER, + RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_WITH_MAX, + RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_INTEGER_TO_FLOAT, + RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE, + RC_VALIDATION_ERR_CONFLICTING_CONDITION, + + /* warnings about logic that does nothing */ + RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_INTEGER_TO_FLOAT, + RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX, + RC_VALIDATION_ERR_TRAILING_CHAINING_CONDITION, + RC_VALIDATION_ERR_MEASUREDIF_WITHOUT_MEASURED, + RC_VALIDATION_ERR_ADDHITS_WITHOUT_TARGET, + + /* warnings about pointer math */ + RC_VALIDATION_ERR_POINTER_FROM_PREVIOUS_FRAME, + RC_VALIDATION_ERR_POINTER_NON_INTEGER_OFFSET, + RC_VALIDATION_ERR_POINTER_TRANSFORMED_OFFSET, + + /* warnings about potential logic errors */ + RC_VALIDATION_ERR_COMPARING_DIFFERENT_MEMORY_SIZES, + RC_VALIDATION_ERR_MASK_RESULT_ALWAYS_ZERO, + + /* warnings that some areas of memory should be avoided */ + RC_VALIDATION_ERR_KERNAL_RAM_REQUIRES_BIOS, + RC_VALIDATION_ERR_VIRTUAL_RAM_MAY_NOT_BE_EXPOSED, + + /* warnings about redundant logic */ + RC_VALIDATION_ERR_REDUNDANT_CONDITION, + RC_VALIDATION_ERR_NO_HITS_TO_RESET, + RC_VALIDATION_ERR_RESET_HIT_TARGET_OF_ONE, + RC_VALIDATION_ERR_MASK_TOO_LARGE, + + RC_VALIDATION_ERR_COUNT +}; + +enum +{ + RC_VALIDATION_VIRTUAL_RAM_OTHER, + RC_VALIDATION_VIRTUAL_RAM_MIRROR, + RC_VALIDATION_VIRTUAL_RAM_ECHO +}; + +typedef struct rc_validation_error_t +{ + uint32_t err; + uint16_t group_index; + uint16_t cond_index; + uint32_t data1; + uint32_t data2; +} rc_validation_error_t; + +typedef struct rc_validation_state_t +{ + rc_validation_error_t errors[64]; + uint32_t error_count; + uint16_t group_index; + uint16_t cond_index; + uint32_t console_id; + uint32_t max_address; + uint8_t has_alt_groups; + uint8_t has_hit_targets; +} rc_validation_state_t; + +/* this returns a negative value if err1 is more severe than err2, or + * a positive value is err2 is more severe than err1. */ +static int rc_validation_compare_severity(const rc_validation_error_t* err1, const rc_validation_error_t* err2) +{ + /* lower err value is more severe */ + int diff = (err1->err - err2->err); + if (diff != 0) + return diff; + + /* lower group index is more severe */ + diff = (err1->group_index - err2->group_index); + if (diff != 0) + return diff; + + /* lower condition value is more severe */ + return (err1->cond_index - err2->cond_index); +} + +static const rc_validation_error_t* rc_validate_find_most_severe_error(const rc_validation_state_t* state) +{ + const rc_validation_error_t* error = &state->errors[0]; + const rc_validation_error_t* most_severe_error = error; + const rc_validation_error_t* stop = &state->errors[state->error_count]; + + while (++error < stop) { + if (rc_validation_compare_severity(error, most_severe_error) < 0) + most_severe_error = error; + } + + return most_severe_error; +} + +static rc_validation_error_t* rc_validate_find_least_severe_error(rc_validation_state_t* state) +{ + rc_validation_error_t* error = &state->errors[0]; + rc_validation_error_t* least_severe_error = error; + rc_validation_error_t* stop = &state->errors[state->error_count]; + + while (++error < stop) { + if (rc_validation_compare_severity(error, least_severe_error) > 0) + least_severe_error = error; + } + + return least_severe_error; +} + +static size_t rc_validate_format_cond_index(char buffer[], size_t buffer_size, const rc_validation_state_t* state, uint32_t group_index, uint32_t cond_index) +{ + int written = 0; + + if (cond_index == 0) + return 0; + + if (state->has_alt_groups) { + if (group_index == 0) + written = snprintf(buffer, buffer_size, "Core "); + else + written = snprintf(buffer, buffer_size, "Alt%u ", group_index); + + buffer += written; + buffer_size -= written; + } + + written += snprintf(buffer, buffer_size, "Condition %u", cond_index); + return written; +} + +static const char* rc_validate_get_condition_type_string(uint32_t type) +{ + switch (type) { + case RC_CONDITION_ADD_ADDRESS: return "AddAddress"; + case RC_CONDITION_ADD_HITS: return "AddHits"; + case RC_CONDITION_ADD_SOURCE: return "AddSource"; + case RC_CONDITION_AND_NEXT: return "AndNext"; + case RC_CONDITION_MEASURED: return "Measured"; + case RC_CONDITION_MEASURED_IF: return "MeasuredIf"; + case RC_CONDITION_OR_NEXT: return "OrNext"; + case RC_CONDITION_PAUSE_IF: return "PauseIf"; + case RC_CONDITION_REMEMBER: return "Remember"; + case RC_CONDITION_RESET_IF: return "ResetIf"; + case RC_CONDITION_RESET_NEXT_IF: return "ResetNextIf"; + case RC_CONDITION_SUB_HITS: return "SubHits"; + case RC_CONDITION_SUB_SOURCE: return "SubSource"; + case RC_CONDITION_TRIGGER: return "Trigger"; + default: return "???"; + } +} + +static void rc_validate_format_error_compare_int_to_float(char buffer[], size_t buffer_size, uint32_t encoded_data, const char* limiter) +{ + int written; + rc_typed_value_t value; + value.value.u32 = encoded_data; + + written = snprintf(buffer, buffer_size, "Comparison is %s true (integer can never be %.06f", limiter, value.value.f32); + while (buffer[written - 1] == '0') + written--; + if (buffer[written] == '.') + written++; + buffer[written] = ')'; + buffer[written + 1] = '\0'; +} + +static int rc_validate_format_error(char buffer[], size_t buffer_size, const rc_validation_state_t* state, const rc_validation_error_t* error) +{ + size_t written = rc_validate_format_cond_index(buffer, buffer_size, state, error->group_index, error->cond_index); + buffer += written; + buffer_size -= written; + + if (buffer_size < 2) + return 0; + + buffer_size -= 2; + *buffer++ = ':'; + *buffer++ = ' '; + + switch (error->err) { + case RC_VALIDATION_ERR_ADDHITS_WITHOUT_TARGET: + snprintf(buffer, buffer_size, "Final condition in AddHits chain must have a hit target"); + break; + + case RC_VALIDATION_ERR_ADDRESS_OUT_OF_RANGE: + snprintf(buffer, buffer_size, "Address %04X out of range (max %04X)", error->data1, error->data2); + break; + + case RC_VALIDATION_ERR_COMPARING_DIFFERENT_MEMORY_SIZES: + snprintf(buffer, buffer_size, "Comparing different memory sizes"); + break; + + case RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_INTEGER_TO_FLOAT: + rc_validate_format_error_compare_int_to_float(buffer, buffer_size, error->data1, "always"); + break; + + case RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX: + snprintf(buffer, buffer_size, "Comparison is always true (max %u)", error->data1); + break; + + case RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE: + snprintf(buffer, buffer_size, "Comparison is never true"); + break; + + case RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_INTEGER_TO_FLOAT: + rc_validate_format_error_compare_int_to_float(buffer, buffer_size, error->data1, "never"); + break; + + case RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_WITH_MAX: + snprintf(buffer, buffer_size, "Comparison is never true (max %u)", error->data1); + break; + + case RC_VALIDATION_ERR_CONFLICTING_CONDITION: + written = snprintf(buffer, buffer_size, "Conflicts with "); + buffer += written; + buffer_size -= written; + rc_validate_format_cond_index(buffer, buffer_size, state, error->data1, error->data2); + break; + + case RC_VALIDATION_ERR_KERNAL_RAM_REQUIRES_BIOS: + snprintf(buffer, buffer_size, "Kernel RAM may not be initialized without real BIOS (address %04X)", error->data1); + break; + + case RC_VALIDATION_ERR_MASK_RESULT_ALWAYS_ZERO: + snprintf(buffer, buffer_size, "Result of mask is always 0"); + break; + + case RC_VALIDATION_ERR_MASK_TOO_LARGE: + snprintf(buffer, buffer_size, "Mask has more bits than source"); + break; + + case RC_VALIDATION_ERR_MEASUREDIF_WITHOUT_MEASURED: + snprintf(buffer, buffer_size, "MeasuredIf without Measured"); + break; + + case RC_VALIDATION_ERR_NO_HITS_TO_RESET: + snprintf(buffer, buffer_size, "No captured hits to reset"); + break; + + case RC_VALIDATION_ERR_POINTER_FROM_PREVIOUS_FRAME: + snprintf(buffer, buffer_size, "Using pointer from previous frame"); + break; + + case RC_VALIDATION_ERR_POINTER_NON_INTEGER_OFFSET: + snprintf(buffer, buffer_size, "Using non-integer value in AddAddress calculation"); + break; + + case RC_VALIDATION_ERR_POINTER_TRANSFORMED_OFFSET: + snprintf(buffer, buffer_size, "Using transformed value in AddAddress calculation"); + break; + + case RC_VALIDATION_ERR_RECALL_BEFORE_REMEMBER: + snprintf(buffer, buffer_size, "Recall used before Remember"); + break; + + case RC_VALIDATION_ERR_RESET_HIT_TARGET_OF_ONE: + snprintf(buffer, buffer_size, "Hit target of 1 is redundant on ResetIf"); + break; + + case RC_VALIDATION_ERR_REDUNDANT_CONDITION: + written = snprintf(buffer, buffer_size, "Redundant with "); + buffer += written; + buffer_size -= written; + rc_validate_format_cond_index(buffer, buffer_size, state, error->data1, error->data2); + break; + + case RC_VALIDATION_ERR_TRAILING_CHAINING_CONDITION: + snprintf(buffer, buffer_size, "%s condition type expects another condition to follow", rc_validate_get_condition_type_string(error->data1)); + break; + + case RC_VALIDATION_ERR_VIRTUAL_RAM_MAY_NOT_BE_EXPOSED: + snprintf(buffer, buffer_size, "%s RAM may not be exposed by emulator (address %04X)", + error->data2 == RC_VALIDATION_VIRTUAL_RAM_MIRROR ? "Mirror" : + error->data2 == RC_VALIDATION_VIRTUAL_RAM_ECHO ? "Echo" : "Virtual", + error->data1); + break; + } + + return 0; +} + +static void rc_validate_add_error(rc_validation_state_t* state, uint32_t error_code, uint32_t data1, uint32_t data2) +{ + rc_validation_error_t* error; + if (state->error_count == sizeof(state->errors) / sizeof(state->errors[0])) + error = rc_validate_find_least_severe_error(state); + else + error = &state->errors[state->error_count++]; + + error->err = error_code; + error->group_index = state->group_index; + error->cond_index = state->cond_index; + error->data1 = data1; + error->data2 = data2; +} + +static void rc_validate_memref(const rc_memref_t* memref, rc_validation_state_t* state) +{ + if (memref->address > state->max_address) { + rc_validate_add_error(state, RC_VALIDATION_ERR_ADDRESS_OUT_OF_RANGE, memref->address, state->max_address); + return; + } + + switch (state->console_id) { + case RC_CONSOLE_NINTENDO: + case RC_CONSOLE_FAMICOM_DISK_SYSTEM: + if (memref->address >= 0x0800 && memref->address <= 0x1FFF) + rc_validate_add_error(state, RC_VALIDATION_ERR_VIRTUAL_RAM_MAY_NOT_BE_EXPOSED, memref->address, RC_VALIDATION_VIRTUAL_RAM_MIRROR); + break; + + case RC_CONSOLE_GAMEBOY: + case RC_CONSOLE_GAMEBOY_COLOR: + if (memref->address >= 0xE000 && memref->address <= 0xFDFF) + rc_validate_add_error(state, RC_VALIDATION_ERR_VIRTUAL_RAM_MAY_NOT_BE_EXPOSED, memref->address, RC_VALIDATION_VIRTUAL_RAM_ECHO); + break; + + case RC_CONSOLE_PLAYSTATION: + if (memref->address <= 0xFFFF) + rc_validate_add_error(state, RC_VALIDATION_ERR_KERNAL_RAM_REQUIRES_BIOS, memref->address, 0); + break; + } +} + +static uint32_t rc_console_max_address(uint32_t console_id) +{ + const rc_memory_regions_t* memory_regions; + memory_regions = rc_console_memory_regions(console_id); + if (memory_regions && memory_regions->num_regions > 0) + return memory_regions->region[memory_regions->num_regions - 1].end_address; + + return 0xFFFFFFFF; +} + +int rc_validate_memrefs_for_console(const rc_memrefs_t* memrefs, char result[], const size_t result_size, uint32_t console_id) +{ + const rc_memref_list_t* memref_list = &memrefs->memrefs; + + rc_validation_state_t state; + memset(&state, 0, sizeof(state)); + state.console_id = console_id; + state.max_address = rc_console_max_address(console_id); + + result[0] = '\0'; + do + { + const rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_stop = memref + memref_list->count; + for (; memref < memref_stop; ++memref) + { + rc_validate_memref(memref, &state); + if (state.error_count) { + rc_validate_format_error(result, result_size, &state, &state.errors[0]); + return 0; + } + } + + memref_list = memref_list->next; + } while (memref_list); + + return 1; +} + +static uint32_t rc_max_value(const rc_operand_t* operand) +{ + if (operand->type == RC_OPERAND_CONST) + return operand->value.num; + + if (!rc_operand_is_memref(operand)) + return 0xFFFFFFFF; + + switch (operand->size) { + case RC_MEMSIZE_BIT_0: + case RC_MEMSIZE_BIT_1: + case RC_MEMSIZE_BIT_2: + case RC_MEMSIZE_BIT_3: + case RC_MEMSIZE_BIT_4: + case RC_MEMSIZE_BIT_5: + case RC_MEMSIZE_BIT_6: + case RC_MEMSIZE_BIT_7: + return 1; + + case RC_MEMSIZE_LOW: + case RC_MEMSIZE_HIGH: + return 0xF; + + case RC_MEMSIZE_BITCOUNT: + return 8; + + case RC_MEMSIZE_8_BITS: + /* NOTE: BCD should max out at 0x99, but because each digit can be 15, it actually maxes at 15*10 + 15 */ + return (operand->type == RC_OPERAND_BCD) ? 165 : 0xFF; + + case RC_MEMSIZE_16_BITS: + case RC_MEMSIZE_16_BITS_BE: + return (operand->type == RC_OPERAND_BCD) ? 16665 : 0xFFFF; + + case RC_MEMSIZE_24_BITS: + case RC_MEMSIZE_24_BITS_BE: + return (operand->type == RC_OPERAND_BCD) ? 1666665 : 0xFFFFFF; + + default: + return (operand->type == RC_OPERAND_BCD) ? 166666665 : 0xFFFFFFFF; + } +} + +static void rc_combine_ranges(uint32_t* min_val, uint32_t* max_val, uint8_t oper, uint32_t oper_min_val, uint32_t oper_max_val) +{ + switch (oper) { + case RC_OPERATOR_MULT: + { + unsigned long long scaled = ((unsigned long long)*min_val) * oper_min_val; + *min_val = (scaled > 0xFFFFFFFF) ? 0xFFFFFFFF : (uint32_t)scaled; + + scaled = ((unsigned long long)*max_val) * oper_max_val; + *max_val = (scaled > 0xFFFFFFFF) ? 0xFFFFFFFF : (uint32_t)scaled; + break; + } + + case RC_OPERATOR_DIV: + *min_val = (oper_max_val == 0) ? *min_val : (*min_val / oper_max_val); + *max_val = (oper_min_val == 0) ? *max_val : (*max_val / oper_min_val); + break; + + case RC_OPERATOR_AND: + *min_val = 0; + *max_val &= oper_max_val; + break; + + case RC_OPERATOR_XOR: + *min_val = 0; + *max_val |= oper_max_val; + break; + + case RC_OPERATOR_MOD: + *min_val = 0; + *max_val = (*max_val >= oper_max_val) ? oper_max_val - 1 : *max_val; + break; + + case RC_OPERATOR_ADD: + if (*min_val > *max_val) { /* underflow occurred */ + *max_val += oper_max_val; + } + else { + unsigned long long scaled = ((unsigned long long)*max_val) + oper_max_val; + *max_val = (scaled > 0xFFFFFFFF) ? 0xFFFFFFFF : (uint32_t)scaled; + } + + *min_val += oper_min_val; + break; + + case RC_OPERATOR_SUB: + *min_val -= oper_max_val; + *max_val -= oper_min_val; + break; + + case RC_OPERATOR_SUB_PARENT: + { + uint32_t temp = oper_min_val - *max_val; + *max_val = oper_max_val - *min_val; + *min_val = temp; + break; + } + + default: + break; + } +} + +static void rc_chain_get_value_range(const rc_operand_t* operand, uint32_t* min_val, uint32_t* max_val) +{ + if (rc_operand_is_memref(operand) && operand->value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF) { + const rc_modified_memref_t* modified_memref = (const rc_modified_memref_t*)operand->value.memref; + if (modified_memref->modifier_type != RC_OPERATOR_INDIRECT_READ) { + if (modified_memref->modifier_type == RC_OPERATOR_DIV && + rc_operand_is_memref(&modified_memref->modifier) && + rc_operands_are_equal(&modified_memref->modifier, &modified_memref->parent)) { + /* division by self can only return 0 or 1. */ + *min_val = 0; + *max_val = 1; + } + else { + uint32_t modifier_min_val, modifier_max_val; + rc_chain_get_value_range(&modified_memref->parent, min_val, max_val); + rc_chain_get_value_range(&modified_memref->modifier, &modifier_min_val, &modifier_max_val); + rc_combine_ranges(min_val, max_val, modified_memref->modifier_type, modifier_min_val, modifier_max_val); + } + return; + } + } + + *min_val = (operand->type == RC_OPERAND_CONST) ? operand->value.num : 0; + *max_val = rc_max_value(operand); +} + +static int rc_validate_get_condition_index(const rc_condset_t* condset, const rc_condition_t* condition) +{ + int index = 1; + const rc_condition_t* scan; + for (scan = condset->conditions; scan != NULL; scan = scan->next) + { + if (scan == condition) + return index; + + ++index; + } + + return 0; +} + +static void rc_validate_range(uint32_t min_val, uint32_t max_val, char oper, uint32_t max, rc_validation_state_t* state) +{ + switch (oper) { + case RC_OPERATOR_AND: + if (min_val > max) + rc_validate_add_error(state, RC_VALIDATION_ERR_MASK_TOO_LARGE, 0, 0); + else if (min_val == 0 && max_val == 0) + rc_validate_add_error(state, RC_VALIDATION_ERR_MASK_RESULT_ALWAYS_ZERO, 0, 0); + break; + + case RC_OPERATOR_EQ: + if (min_val > max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_WITH_MAX, max, 0); + break; + + case RC_OPERATOR_NE: + if (min_val > max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX, max, 0); + break; + + case RC_OPERATOR_GE: + if (min_val > max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_WITH_MAX, max, 0); + else if (max_val == 0) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX, max, 0); + break; + + case RC_OPERATOR_GT: + if (min_val >= max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_WITH_MAX, max, 0); + break; + + case RC_OPERATOR_LE: + if (min_val >= max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX, max, 0); + break; + + case RC_OPERATOR_LT: + if (min_val > max) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_WITH_MAX, max, 0); + else if (max_val == 0) + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE, 0, 0); + break; + } +} + +static int rc_validate_condset_internal(const rc_condset_t* condset, rc_validation_state_t* state) +{ + const rc_condition_t* cond; + int in_add_hits = 0; + int in_add_address = 0; + int is_combining = 0; + int has_measured = 0; + int measuredif_index = -1; + uint32_t errors_before = state->error_count; + + if (!condset) + return 1; + + state->cond_index = 1; + + for (cond = condset->conditions; cond; cond = cond->next, ++state->cond_index) { + /* validate the original operands first */ + const rc_operand_t* operand1 = rc_condition_get_real_operand1(cond); + int is_memref1 = rc_operand_is_memref(operand1); + const int is_memref2 = rc_operand_is_memref(&cond->operand2); + + if (!in_add_address) { + if (is_memref1) + rc_validate_memref(operand1->value.memref, state); + if (is_memref2) + rc_validate_memref(cond->operand2.value.memref, state); + } + else { + in_add_address = 0; + } + + /* if operand is {recall}, but memref is null, that means the Remember wasn't found */ + if (rc_operand_is_recall(operand1) && + rc_operand_type_is_memref(operand1->memref_access_type) && + !operand1->value.memref) { + rc_validate_add_error(state, RC_VALIDATION_ERR_RECALL_BEFORE_REMEMBER, 0, 0); + } + if (rc_operand_is_recall(&cond->operand2) && + rc_operand_type_is_memref(cond->operand2.memref_access_type) && + !cond->operand2.value.memref) { + rc_validate_add_error(state, RC_VALIDATION_ERR_RECALL_BEFORE_REMEMBER, 0, 0); + } + + switch (cond->type) { + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_SUB_SOURCE: + case RC_CONDITION_REMEMBER: + is_combining = 1; + continue; + + case RC_CONDITION_ADD_ADDRESS: + if (operand1->type == RC_OPERAND_DELTA || operand1->type == RC_OPERAND_PRIOR) + rc_validate_add_error(state, RC_VALIDATION_ERR_POINTER_FROM_PREVIOUS_FRAME, 0, 0); + else if (rc_operand_is_float(operand1) || rc_operand_is_float(&cond->operand2)) + rc_validate_add_error(state, RC_VALIDATION_ERR_POINTER_NON_INTEGER_OFFSET, 0, 0); + else if (rc_operand_type_is_transform(operand1->type) && cond->oper != RC_OPERATOR_MULT) + rc_validate_add_error(state, RC_VALIDATION_ERR_POINTER_TRANSFORMED_OFFSET, 0, 0); + + in_add_address = 1; + is_combining = 1; + continue; + + case RC_CONDITION_ADD_HITS: + case RC_CONDITION_SUB_HITS: + in_add_hits = 1; + is_combining = 1; + break; + + case RC_CONDITION_AND_NEXT: + case RC_CONDITION_OR_NEXT: + case RC_CONDITION_RESET_NEXT_IF: + is_combining = 1; + break; + + case RC_CONDITION_RESET_IF: + if (in_add_hits) { + /* ResetIf at the end of a hit chain does not require a hit target. + * It's meant to reset things if some subset of conditions have been true. */ + in_add_hits = 0; + is_combining = 0; + break; + } + if (!state->has_hit_targets) + rc_validate_add_error(state, RC_VALIDATION_ERR_NO_HITS_TO_RESET, 0, 0); + else if (cond->required_hits == 1) + rc_validate_add_error(state, RC_VALIDATION_ERR_RESET_HIT_TARGET_OF_ONE, 0, 0); + /* fallthrough */ /* to default */ + default: + if (in_add_hits) { + if (cond->required_hits == 0) + rc_validate_add_error(state, RC_VALIDATION_ERR_ADDHITS_WITHOUT_TARGET, 0, 0); + + in_add_hits = 0; + } + + has_measured |= (cond->type == RC_CONDITION_MEASURED); + if (cond->type == RC_CONDITION_MEASURED_IF && measuredif_index == -1) + measuredif_index = state->cond_index; + + is_combining = 0; + break; + } + + /* original operands are valid. now switch to the derived operands for logic + * combining/comparing them */ + operand1 = &cond->operand1; + is_memref1 = rc_operand_is_memref(operand1); + + /* check for comparing two differently sized memrefs */ + if (is_memref1 && is_memref2 && + operand1->value.memref->value.memref_type == RC_MEMREF_TYPE_MEMREF && + cond->operand2.value.memref->value.memref_type == RC_MEMREF_TYPE_MEMREF && + rc_max_value(operand1) != rc_max_value(&cond->operand2)) { + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARING_DIFFERENT_MEMORY_SIZES, 0, 0); + } + + if (is_memref1 && rc_operand_is_float(operand1)) { + /* if left side is a float, right side will be converted to a float, so don't do range validation */ + } + else if (is_memref1 || is_memref2) { + /* if either side is a memref, check for impossible comparisons */ + const rc_operand_t* operand2 = &cond->operand2; + uint8_t oper = cond->oper; + uint32_t min, max; + uint32_t max_val = rc_max_value(operand2); + uint32_t min_val; + rc_typed_value_t typed_value; + + rc_chain_get_value_range(operand1, &min, &max); + if (min > max) { /* underflow */ + min = 0; + max = 0xFFFFFFFF; + } + + if (!is_memref1) { + /* pretend constant was on right side */ + operand2 = operand1; + operand1 = &cond->operand2; + max_val = max; + max = rc_max_value(&cond->operand2); + + switch (oper) { + case RC_OPERATOR_LT: oper = RC_OPERATOR_GT; break; + case RC_OPERATOR_LE: oper = RC_OPERATOR_GE; break; + case RC_OPERATOR_GT: oper = RC_OPERATOR_LT; break; + case RC_OPERATOR_GE: oper = RC_OPERATOR_LE; break; + } + } + + switch (operand2->type) { + case RC_OPERAND_CONST: + min_val = operand2->value.num; + break; + + case RC_OPERAND_FP: + min_val = (int)operand2->value.dbl; + + /* cannot compare an integer memory reference to a non-integral floating point value */ + if (!rc_operand_is_float_memref(operand1) && (float)min_val != operand2->value.dbl) { + switch (oper) { + case RC_OPERATOR_EQ: + typed_value.value.f32 = (float)operand2->value.dbl; + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_NEVER_TRUE_INTEGER_TO_FLOAT, typed_value.value.u32, 0); + break; + + case RC_OPERATOR_NE: + typed_value.value.f32 = (float)operand2->value.dbl; + rc_validate_add_error(state, RC_VALIDATION_ERR_COMPARISON_ALWAYS_TRUE_INTEGER_TO_FLOAT, typed_value.value.u32, 0); + break; + + case RC_OPERATOR_GT: /* value could be greater than floor(float) */ + case RC_OPERATOR_LE: /* value could be less than or equal to floor(float) */ + break; + + case RC_OPERATOR_GE: /* value could be greater than or equal to ceil(float) */ + case RC_OPERATOR_LT: /* value could be less than ceil(float) */ + ++min_val; + break; + } + } + + break; + + default: /* right side is memref or add source chain */ + min_val = 0; + break; + } + + /* min_val and max_val are the range allowed by operand2. max is the upper value from operand1. */ + rc_validate_range(min_val, max_val, oper, max, state); + } + } + + if (is_combining) { + /* find the final condition so we can extract the type */ + state->cond_index--; + cond = condset->conditions; + while (cond->next) + cond = cond->next; + + rc_validate_add_error(state, RC_VALIDATION_ERR_TRAILING_CHAINING_CONDITION, cond->type, 0); + } + + if (measuredif_index != -1 && !has_measured) { + state->cond_index = measuredif_index; + rc_validate_add_error(state, RC_VALIDATION_ERR_MEASUREDIF_WITHOUT_MEASURED, 0, 0); + } + + return (state->error_count == errors_before); +} + +static int rc_condset_has_hittargets(const rc_condset_t* condset) +{ + if (condset->num_hittarget_conditions > 0) + return 1; + + /* pause and reset conditions may have hittargets and won't be classified as hittarget conditions. + * measured conditions may also have hittargets. + * other conditions may have hittarget conditions in an AndNext/OrNext chain. + * basically, check everything other than hittarget (explicitly known) and indirect (cannot have). + */ + if (condset->num_pause_conditions || condset->num_reset_conditions || condset->num_measured_conditions || condset->num_other_conditions) { + const rc_condition_t* condition = rc_condset_get_conditions((rc_condset_t*)condset); + /* ASSERT: don't need to add num_hittarget_conditions because it must be 0 per earlier check */ + const rc_condition_t* stop = condition + condset->num_pause_conditions + + condset->num_reset_conditions + condset->num_measured_conditions + + condset->num_other_conditions; + for (; condition < stop; ++condition) { + if (condition->required_hits) + return 1; + } + } + + return 0; +} + +int rc_validate_condset(const rc_condset_t* condset, char result[], const size_t result_size, uint32_t max_address) +{ + rc_validation_state_t state; + memset(&state, 0, sizeof(state)); + state.has_hit_targets = rc_condset_has_hittargets(condset); + state.max_address = max_address; + + result[0] = '\0'; + if (rc_validate_condset_internal(condset, &state)) { + const rc_validation_error_t* most_severe_error = rc_validate_find_most_severe_error(&state); + return rc_validate_format_error(result, result_size, &state, most_severe_error); + } + + return 1; +} + +int rc_validate_condset_for_console(const rc_condset_t* condset, char result[], const size_t result_size, uint32_t console_id) +{ + rc_validation_state_t state; + memset(&state, 0, sizeof(state)); + state.console_id = console_id; + state.max_address = rc_console_max_address(console_id); + state.has_hit_targets = rc_condset_has_hittargets(condset); + + result[0] = '\0'; + if (rc_validate_condset_internal(condset, &state)) { + const rc_validation_error_t* most_severe_error = rc_validate_find_most_severe_error(&state); + return rc_validate_format_error(result, result_size, &state, most_severe_error); + } + + return 1; +} + +/* rc_condition_is_combining doesn't look at conditions that build a memref (like AddSource) */ +static int rc_validate_is_combining_condition(const rc_condition_t* condition) +{ + switch (condition->type) + { + case RC_CONDITION_ADD_ADDRESS: + case RC_CONDITION_ADD_HITS: + case RC_CONDITION_ADD_SOURCE: + case RC_CONDITION_AND_NEXT: + case RC_CONDITION_OR_NEXT: + case RC_CONDITION_RESET_NEXT_IF: + case RC_CONDITION_SUB_HITS: + case RC_CONDITION_SUB_SOURCE: + case RC_CONDITION_REMEMBER: + return 1; + + default: + return 0; + } +} + +static int rc_validate_get_opposite_comparison(int oper) +{ + switch (oper) + { + case RC_OPERATOR_EQ: return RC_OPERATOR_NE; + case RC_OPERATOR_NE: return RC_OPERATOR_EQ; + case RC_OPERATOR_LT: return RC_OPERATOR_GE; + case RC_OPERATOR_LE: return RC_OPERATOR_GT; + case RC_OPERATOR_GT: return RC_OPERATOR_LE; + case RC_OPERATOR_GE: return RC_OPERATOR_LT; + default: return oper; + } +} + +static const rc_operand_t* rc_validate_get_comparison(const rc_condition_t* condition, int* comparison, unsigned* value) +{ + if (rc_operand_is_memref(&condition->operand1)) + { + if (condition->operand2.type != RC_OPERAND_CONST) + return NULL; + + *comparison = condition->oper; + *value = condition->operand2.value.num; + return &condition->operand1; + } + + if (condition->operand1.type != RC_OPERAND_CONST) + return NULL; + + if (!rc_operand_is_memref(&condition->operand2)) + return NULL; + + *comparison = rc_validate_get_opposite_comparison(condition->oper); + *value = condition->operand1.value.num; + return &condition->operand2; +} + +enum { + RC_OVERLAP_NONE = 0, + RC_OVERLAP_CONFLICTING, + RC_OVERLAP_REDUNDANT, + RC_OVERLAP_DEFER +}; + +static int rc_validate_comparison_overlap(int comparison1, uint32_t value1, int comparison2, uint32_t value2) +{ + /* NOTE: this only cares if comp2 conflicts with comp1. + * If comp1 conflicts with comp2, we'll catch that later (return RC_OVERLAP_NONE for now) */ + switch (comparison2) + { + case RC_OPERATOR_EQ: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a == 1 | a == 1 && a == 2 | a == 2 && a == 1 */ + /* redundant conflict conflict */ + return (value1 == value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_CONFLICTING; + case RC_OPERATOR_LE: /* a <= 1 && a == 1 | a <= 1 && a == 2 | a <= 2 && a == 1 */ + /* defer conflict defer */ + return (value1 < value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + case RC_OPERATOR_GE: /* a >= 1 && a == 1 | a >= 1 && a == 2 | a >= 2 && a == 1 */ + /* defer defer conflict */ + return (value1 > value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + case RC_OPERATOR_NE: /* a != 1 && a == 1 | a != 1 && a == 2 | a != 2 && a == 1 */ + /* conflict defer defer */ + return (value1 == value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + case RC_OPERATOR_LT: /* a < 1 && a == 1 | a < 1 && a == 2 | a < 2 && a == 1 */ + /* conflict conflict defer */ + return (value1 <= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + case RC_OPERATOR_GT: /* a > 1 && a == 1 | a > 1 && a == 2 | a > 2 && a == 1 */ + /* conflict defer conflict */ + return (value1 >= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + } + break; + + case RC_OPERATOR_NE: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a != 1 | a == 1 && a != 2 | a == 2 && a != 1 */ + /* conflict redundant redundant */ + return (value1 == value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_REDUNDANT; + case RC_OPERATOR_LE: /* a <= 1 && a != 1 | a <= 1 && a != 2 | a <= 2 && a != 1 */ + /* none redundant none */ + return (value1 < value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_NONE; + case RC_OPERATOR_GE: /* a >= 1 && a != 1 | a >= 1 && a != 2 | a >= 2 && a != 1 */ + /* none none redundant */ + return (value1 > value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_NONE; + case RC_OPERATOR_NE: /* a != 1 && a != 1 | a != 1 && a != 2 | a != 2 && a != 1 */ + /* redundant none none */ + return (value1 == value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_NONE; + case RC_OPERATOR_LT: /* a < 1 && a != 1 | a < 1 && a != 2 | a < 2 && a != 1 */ + /* redundant redundant none */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_NONE; + case RC_OPERATOR_GT: /* a > 1 && a != 1 | a > 1 && a != 2 | a > 2 && a != 1 */ + /* redundant none redundant */ + return (value1 >= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_NONE; + } + break; + + case RC_OPERATOR_LT: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a < 1 | a == 1 && a < 2 | a == 2 && a < 1 */ + /* conflict redundant conflict */ + return (value1 < value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_CONFLICTING; + case RC_OPERATOR_LE: /* a <= 1 && a < 1 | a <= 1 && a < 2 | a <= 2 && a < 1 */ + /* defer redundant defer */ + return (value1 < value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_GE: /* a >= 1 && a < 1 | a >= 1 && a < 2 | a >= 2 && a < 1 */ + /* conflict none conflict */ + return (value1 >= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + case RC_OPERATOR_NE: /* a != 1 && a < 1 | a != 1 && a < 2 | a != 2 && a < 1 */ + /* defer none defer */ + return (value1 >= value2) ? RC_OVERLAP_DEFER : RC_OVERLAP_NONE; + case RC_OPERATOR_LT: /* a < 1 && a < 1 | a < 1 && a < 2 | a < 2 && a < 1 */ + /* redundant redundant defer */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_GT: /* a > 1 && a < 1 | a > 1 && a < 2 | a > 2 && a < 1 */ + /* conflict none conflict */ + return (value1 >= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + } + break; + + case RC_OPERATOR_LE: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a <= 1 | a == 1 && a <= 2 | a == 2 && a <= 1 */ + /* redundant redundant conflict */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_CONFLICTING; + case RC_OPERATOR_LE: /* a <= 1 && a <= 1 | a <= 1 && a <= 2 | a <= 2 && a <= 1 */ + /* redundant redundant defer */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_GE: /* a >= 1 && a <= 1 | a >= 1 && a <= 2 | a >= 2 && a <= 1 */ + /* none none conflict */ + return (value1 > value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + case RC_OPERATOR_NE: /* a != 1 && a <= 1 | a != 1 && a <= 2 | a != 2 && a <= 1 */ + /* none none defer */ + return (value1 > value2) ? RC_OVERLAP_DEFER : RC_OVERLAP_NONE; + case RC_OPERATOR_LT: /* a < 1 && a <= 1 | a < 1 && a <= 2 | a < 2 && a <= 1 */ + /* redundant redundant defer */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_GT: /* a > 1 && a <= 1 | a > 1 && a <= 2 | a > 2 && a <= 1 */ + /* conflict none conflict */ + return (value1 >= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + } + break; + + case RC_OPERATOR_GT: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a > 1 | a == 1 && a > 2 | a == 2 && a > 1 */ + /* conflict conflict redundant */ + return (value1 > value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_CONFLICTING; + case RC_OPERATOR_LE: /* a <= 1 && a > 1 | a <= 1 && a > 2 | a <= 2 && a > 1 */ + /* conflict conflict defer */ + return (value1 <= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_DEFER; + case RC_OPERATOR_GE: /* a >= 1 && a > 1 | a >= 1 && a > 2 | a >= 2 && a > 1 */ + /* defer defer redundant */ + return (value1 > value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_NE: /* a != 1 && a > 1 | a != 1 && a > 2 | a != 2 && a > 1 */ + /* defer defer none */ + return (value1 <= value2) ? RC_OVERLAP_DEFER : RC_OVERLAP_NONE; + case RC_OPERATOR_LT: /* a < 1 && a > 1 | a < 1 && a > 2 | a < 2 && a > 1 */ + /* conflict conflict none */ + return (value1 <= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + case RC_OPERATOR_GT: /* a > 1 && a > 1 | a > 1 && a > 2 | a > 2 && a > 1 */ + /* redundant defer redundant */ + return (value1 >= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + } + break; + + case RC_OPERATOR_GE: + switch (comparison1) /* comp1 comp2 comp1 comp2 comp1 comp2 */ + { /* value1 = value2 value1 < value2 value1 > value2 */ + case RC_OPERATOR_EQ: /* a == 1 && a >= 1 | a == 1 && a >= 2 | a == 2 && a >= 1 */ + /* redundant conflict redundant */ + return (value1 >= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_CONFLICTING; + case RC_OPERATOR_LE: /* a <= 1 && a >= 1 | a <= 1 && a >= 2 | a <= 2 && a >= 1 */ + /* none conflict none */ + return (value1 < value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + case RC_OPERATOR_GE: /* a >= 1 && a >= 1 | a >= 1 && a >= 2 | a >= 2 && a >= 1 */ + /* redundant redundant defer */ + return (value1 <= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + case RC_OPERATOR_NE: /* a != 1 && a >= 1 | a != 1 && a >= 2 | a != 2 && a >= 1 */ + /* none defer none */ + return (value1 < value2) ? RC_OVERLAP_DEFER : RC_OVERLAP_NONE; + case RC_OPERATOR_LT: /* a < 1 && a >= 1 | a < 1 && a >= 2 | a < 2 && a >= 1 */ + /* conflict conflict none */ + return (value1 <= value2) ? RC_OVERLAP_CONFLICTING : RC_OVERLAP_NONE; + case RC_OPERATOR_GT: /* a > 1 && a >= 1 | a > 1 && a >= 2 | a > 2 && a >= 1 */ + /* redundant defer redundant */ + return (value1 >= value2) ? RC_OVERLAP_REDUNDANT : RC_OVERLAP_DEFER; + } + break; + } + + return RC_OVERLAP_NONE; +} + +static int rc_validate_conflicting_conditions(const rc_condset_t* conditions, const rc_condset_t* compare_conditions, + uint32_t group_index, rc_validation_state_t* state) +{ + int comparison1, comparison2; + uint32_t value1, value2; + const rc_operand_t* operand1; + const rc_operand_t* operand2; + const rc_condition_t* compare_condition; + const rc_condition_t* condition; + const rc_condition_t* condition_chain_start; + uint32_t errors_before = state->error_count; + int overlap; + int chain_matches; + + /* empty group */ + if (conditions == NULL || compare_conditions == NULL) + return 1; + + /* outer loop is the source conditions */ + for (condition = conditions->conditions; condition != NULL; condition = condition->next, ++state->cond_index) { + condition_chain_start = condition; + while (condition && rc_condition_is_combining(condition)) { + condition = condition->next; + } + if (!condition) + break; + + /* hits can be captured at any time, so any potential conflict will not be conflicting at another time */ + if (condition->required_hits) + continue; + + operand1 = rc_validate_get_comparison(condition, &comparison1, &value1); + if (!operand1) + continue; + + switch (condition->type) { + case RC_CONDITION_PAUSE_IF: + if (conditions != compare_conditions) + break; + /* fallthrough */ + case RC_CONDITION_RESET_IF: + comparison1 = rc_validate_get_opposite_comparison(comparison1); + break; + default: + if (rc_validate_is_combining_condition(condition)) + continue; + break; + } + + /* inner loop is the potentially conflicting conditions */ + state->cond_index = 1; + for (compare_condition = compare_conditions->conditions; compare_condition != NULL; compare_condition = compare_condition->next, ++state->cond_index) { + if (compare_condition == condition_chain_start) { + /* skip condition we're already looking at */ + while (compare_condition != condition) { + ++state->cond_index; + compare_condition = compare_condition->next; + } + + continue; + } + + /* if combining conditions exist, make sure the same combining conditions exist in the + * compare logic. conflicts can only occur if the combinining conditions match. */ + chain_matches = 1; + if (condition_chain_start != condition) { + const rc_condition_t* condition_chain_iter = condition_chain_start; + while (condition_chain_iter != condition) { + if (compare_condition->type != condition_chain_iter->type || + compare_condition->oper != condition_chain_iter->oper || + compare_condition->required_hits != condition_chain_iter->required_hits || + !rc_operands_are_equal(&compare_condition->operand1, &condition_chain_iter->operand1)) + { + chain_matches = 0; + break; + } + + if (compare_condition->oper != RC_OPERATOR_NONE && + !rc_operands_are_equal(&compare_condition->operand2, &condition_chain_iter->operand2)) + { + chain_matches = 0; + break; + } + + if (!compare_condition->next) { + chain_matches = 0; + break; + } + + if (compare_condition->type != RC_CONDITION_ADD_ADDRESS && + compare_condition->type != RC_CONDITION_ADD_SOURCE && + compare_condition->type != RC_CONDITION_SUB_SOURCE && + compare_condition->type != RC_CONDITION_AND_NEXT) + { + /* things like AddHits and OrNext are hard to definitively detect conflicts. ignore them. */ + chain_matches = 0; + break; + } + + ++state->cond_index; + compare_condition = compare_condition->next; + condition_chain_iter = condition_chain_iter->next; + } + } + + /* combining field didn't match, or there's more unmatched combining fields. ignore this condition */ + if (!chain_matches || rc_validate_is_combining_condition(compare_condition)) { + while (compare_condition->next && rc_validate_is_combining_condition(compare_condition)) + compare_condition = compare_condition->next; + continue; + } + + if (compare_condition->required_hits) + continue; + + operand2 = rc_validate_get_comparison(compare_condition, &comparison2, &value2); + if (!operand2 || !rc_operands_are_equal(operand1, operand2)) + continue; + + switch (compare_condition->type) { + case RC_CONDITION_PAUSE_IF: + if (conditions != compare_conditions) /* PauseIf only affects conditions in same group */ + break; + /* fallthrough */ + case RC_CONDITION_RESET_IF: + comparison2 = rc_validate_get_opposite_comparison(comparison2); + break; + default: + if (rc_validate_is_combining_condition(compare_condition)) + continue; + break; + } + + overlap = rc_validate_comparison_overlap(comparison1, value1, comparison2, value2); + switch (overlap) + { + case RC_OVERLAP_CONFLICTING: + if (compare_condition->type == RC_CONDITION_PAUSE_IF || condition->type == RC_CONDITION_PAUSE_IF) + { + /* ignore PauseIf conflicts between groups, unless both conditions are PauseIfs */ + if (conditions != compare_conditions && compare_condition->type != condition->type) + continue; + } + break; + + case RC_OVERLAP_REDUNDANT: + if (group_index != state->group_index && state->group_index == 0) + { + /* if the alt condition is more restrictive than the core condition, ignore it */ + if (rc_validate_comparison_overlap(comparison2, value2, comparison1, value1) != RC_OVERLAP_REDUNDANT) + continue; + } + + if (compare_condition->type == RC_CONDITION_PAUSE_IF || condition->type == RC_CONDITION_PAUSE_IF) + { + /* ignore PauseIf redundancies between groups */ + if (conditions != compare_conditions) + continue; + + /* if the PauseIf is less restrictive than the other condition, it's just a guard. ignore it */ + if (rc_validate_comparison_overlap(comparison2, value2, comparison1, value1) != RC_OVERLAP_REDUNDANT) + continue; + + /* PauseIf redundant with ResetIf is a conflict (both are inverted comparisons) */ + if (compare_condition->type == RC_CONDITION_RESET_IF || condition->type == RC_CONDITION_RESET_IF) + overlap = RC_OVERLAP_CONFLICTING; + } + else if (compare_condition->type == RC_CONDITION_RESET_IF && condition->type != RC_CONDITION_RESET_IF) + { + /* only ever report the redundancy on the non-ResetIf condition. The ResetIf is allowed to + * fire when the non-ResetIf condition is not true. */ + if (state->has_hit_targets) + continue; + } + else if (condition->type == RC_CONDITION_RESET_IF && compare_condition->type != RC_CONDITION_RESET_IF) + { + /* if the ResetIf condition is more restrictive than the non-ResetIf condition, + and there aren't any hits to clear, ignore it */ + if (state->has_hit_targets) + continue; + } + else if (compare_condition->type == RC_CONDITION_MEASURED_IF || condition->type == RC_CONDITION_MEASURED_IF) + { + /* ignore MeasuredIf redundancies between groups */ + if (conditions != compare_conditions) + continue; + + if (compare_condition->type == RC_CONDITION_MEASURED_IF && condition->type != RC_CONDITION_MEASURED_IF) + { + /* only ever report the redundancy on the non-MeasuredIf condition. The MeasuredIf provides + * additional functionality. */ + continue; + } + } + else if (condition->type == RC_CONDITION_TRIGGER && compare_condition->type != RC_CONDITION_TRIGGER) + { + /* Trigger is allowed to be redundant with non-trigger conditions as there may be limits that start a + * challenge that are further reduced for the completion of the challenge */ + continue; + } + break; + + default: + continue; + } + + /* if condition A conflicts with condition B, condition B will also conflict with + * condition A. don't report both. */ + { + int already_reported = 0; + const rc_validation_error_t* error = state->errors; + const rc_validation_error_t* stop = state->errors + state->error_count; + for (; error < stop; ++error) { + if (error->data2 == state->cond_index && error->data1 == state->group_index) { + if (error->err == RC_VALIDATION_ERR_REDUNDANT_CONDITION || + error->err == RC_VALIDATION_ERR_CONFLICTING_CONDITION) { + already_reported = 1; + } + } + } + + if (already_reported) + continue; + } + + rc_validate_add_error(state, (overlap == RC_OVERLAP_REDUNDANT) ? + RC_VALIDATION_ERR_REDUNDANT_CONDITION : RC_VALIDATION_ERR_CONFLICTING_CONDITION, + group_index, rc_validate_get_condition_index(conditions, condition)); + } + } + + return (state->error_count == errors_before); +} + +static int rc_validate_trigger_internal(const rc_trigger_t* trigger, rc_validation_state_t* state) +{ + rc_condset_t* alt; + uint32_t index; + + state->has_alt_groups = (trigger->alternative != NULL); + + state->has_hit_targets = trigger->requirement && rc_condset_has_hittargets(trigger->requirement); + if (!state->has_hit_targets) { + for (alt = trigger->alternative; alt; alt = alt->next) { + if (rc_condset_has_hittargets(alt)) { + state->has_hit_targets = 1; + break; + } + } + } + + state->group_index = 0; + if (rc_validate_condset_internal(trigger->requirement, state)) { + /* compare core to itself */ + rc_validate_conflicting_conditions(trigger->requirement, trigger->requirement, 0, state); + } + + index = 1; + for (alt = trigger->alternative; alt; alt = alt->next, ++index) { + state->group_index = index; + if (rc_validate_condset_internal(alt, state)) { + /* compare alt to itself */ + if (!rc_validate_conflicting_conditions(alt, alt, index, state)) + continue; + + /* compare alt to core */ + if (!rc_validate_conflicting_conditions(trigger->requirement, alt, 0, state)) + continue; + + /* compare core to alt */ + state->group_index = 0; + if (!rc_validate_conflicting_conditions(alt, trigger->requirement, index, state)) + continue; + } + } + + return (state->error_count == 0); +} + +int rc_validate_trigger(const rc_trigger_t* trigger, char result[], const size_t result_size, uint32_t max_address) +{ + rc_validation_state_t state; + memset(&state, 0, sizeof(state)); + state.max_address = max_address; + + result[0] = '\0'; + if (!rc_validate_trigger_internal(trigger, &state)) { + const rc_validation_error_t* most_severe_error = rc_validate_find_most_severe_error(&state); + return rc_validate_format_error(result, result_size, &state, most_severe_error); + } + + return 1; +} + +int rc_validate_trigger_for_console(const rc_trigger_t* trigger, char result[], const size_t result_size, uint32_t console_id) +{ + rc_validation_state_t state; + memset(&state, 0, sizeof(state)); + state.console_id = console_id; + state.max_address = rc_console_max_address(console_id); + + result[0] = '\0'; + if (!rc_validate_trigger_internal(trigger, &state)) { + const rc_validation_error_t* most_severe_error = rc_validate_find_most_severe_error(&state); + return rc_validate_format_error(result, result_size, &state, most_severe_error); + } + + return 1; +} diff --git a/src/rcheevos/src/rcheevos/rc_validate.h b/src/rcheevos/src/rcheevos/rc_validate.h new file mode 100644 index 0000000000..cfda94075d --- /dev/null +++ b/src/rcheevos/src/rcheevos/rc_validate.h @@ -0,0 +1,18 @@ +#ifndef RC_VALIDATE_H +#define RC_VALIDATE_H + +#include "rc_runtime_types.h" + +#include + +RC_BEGIN_C_DECLS + +int rc_validate_condset(const rc_condset_t* condset, char result[], const size_t result_size, uint32_t max_address); +int rc_validate_trigger(const rc_trigger_t* trigger, char result[], const size_t result_size, uint32_t max_address); + +int rc_validate_condset_for_console(const rc_condset_t* condset, char result[], const size_t result_size, uint32_t console_id); +int rc_validate_trigger_for_console(const rc_trigger_t* trigger, char result[], const size_t result_size, uint32_t console_id); + +RC_END_C_DECLS + +#endif /* RC_VALIDATE_H */ diff --git a/src/rcheevos/src/rcheevos/richpresence.c b/src/rcheevos/src/rcheevos/richpresence.c new file mode 100644 index 0000000000..b2f85c69e1 --- /dev/null +++ b/src/rcheevos/src/rcheevos/richpresence.c @@ -0,0 +1,922 @@ +#include "rc_internal.h" + +#include "../rc_compat.h" + +#include + +/* special formats only used by rc_richpresence_display_part_t.display_type. must not overlap other RC_FORMAT values */ +enum { + RC_FORMAT_STRING = 101, + RC_FORMAT_LOOKUP = 102, + RC_FORMAT_UNKNOWN_MACRO = 103, + RC_FORMAT_ASCIICHAR = 104, + RC_FORMAT_UNICODECHAR = 105 +}; + +static void rc_alloc_helper_variable_memref_value(rc_richpresence_display_part_t* part, const char* memaddr, int memaddr_len, rc_parse_state_t* parse) { + rc_preparse_state_t preparse; + const char* test_memaddr = memaddr; + rc_condset_t* condset; + rc_value_t* value; + int32_t size; + + part->value.type = RC_OPERAND_NONE; + + /* if the expression can be represented as just a memory reference, do so */ + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = parse->memrefs; + value = RC_ALLOC(rc_value_t, &preparse.parse); + rc_parse_value_internal(value, &test_memaddr, &preparse.parse); + + size = preparse.parse.offset; + if (size < 0) { + parse->offset = size; + rc_destroy_preparse_state(&preparse); + return; + } + + /* ensure new needed memrefs are allocated in the primary buffer */ + rc_preparse_copy_memrefs(parse, &preparse.memrefs); + + /* parse the value into the scratch buffer so we can look at it */ + rc_reset_parse_state(&preparse.parse, rc_buffer_alloc(&preparse.parse.scratch.buffer, (size_t)size)); + preparse.parse.memrefs = parse->memrefs; + preparse.parse.existing_memrefs = parse->existing_memrefs; + value = RC_ALLOC(rc_value_t, &preparse.parse); + test_memaddr = memaddr; + rc_parse_value_internal(value, &test_memaddr, &preparse.parse); + + condset = value->conditions; + if (condset && !condset->next) { + /* single value - if it's a single Measured clause (including any AddSource/AddAddress helpers), we can + * simplify to a memref. If there are supporting clauses like MeasuredIf or ResetIf, we can't */ + if (condset->num_measured_conditions == 1 && + !condset->num_pause_conditions && !condset->num_reset_conditions && + !condset->num_other_conditions && !condset->num_hittarget_conditions) { + rc_condition_t* condition = condset->conditions; + for (; condition; condition = condition->next) { + if (condition->type == RC_CONDITION_MEASURED && condition->required_hits == 0) { + memcpy(&part->value, &condition->operand1, sizeof(condition->operand1)); + break; + } + } + } + } + + rc_destroy_preparse_state(&preparse); + + /* could not express value with just a memory reference, create a helper variable */ + if (part->value.type == RC_OPERAND_NONE) { + value = rc_alloc_variable(memaddr, memaddr_len, parse); + if (value) { + part->value.value.memref = (rc_memref_t*)&value->value; + part->value.type = RC_OPERAND_ADDRESS; + part->value.size = RC_MEMSIZE_32_BITS; + part->value.memref_access_type = RC_OPERAND_ADDRESS; + } + } +} + +static const char* rc_parse_line(const char* line, const char** end, rc_parse_state_t* parse) { + const char* nextline; + const char* endline; + + /* get a single line */ + nextline = line; + while (*nextline && *nextline != '\n') + ++nextline; + + /* if a trailing comment marker (//) exists, the line stops there */ + endline = line; + while (endline < nextline && (endline[0] != '/' || endline[1] != '/' || (endline > line && endline[-1] == '\\'))) + ++endline; + + if (endline == nextline) { + /* trailing whitespace on a line without a comment marker may be significant, just remove the line ending */ + if (endline > line && endline[-1] == '\r') + --endline; + } else { + /* remove trailing whitespace before the comment marker */ + while (endline > line && isspace((int)((unsigned char*)endline)[-1])) + --endline; + } + + /* point end at the first character to ignore, it makes subtraction for length easier */ + *end = endline; + + /* tally the line */ + ++parse->lines_read; + + /* skip the newline character so we're pointing at the next line */ + if (*nextline == '\n') + ++nextline; + + return nextline; +} + +typedef struct rc_richpresence_builtin_macro_t { + const char* name; + size_t name_len; + uint8_t display_type; +} rc_richpresence_builtin_macro_t; + +static rc_richpresence_display_t* rc_parse_richpresence_display_internal(const char* line, const char* endline, rc_parse_state_t* parse, rc_richpresence_lookup_t* first_lookup) { + rc_richpresence_display_t* self; + rc_richpresence_display_part_t* part; + rc_richpresence_display_part_t** next; + rc_richpresence_lookup_t* lookup; + const char* ptr; + const char* in; + char* out; + + if (endline - line < 1) { + parse->offset = RC_MISSING_DISPLAY_STRING; + return 0; + } + + { + self = RC_ALLOC(rc_richpresence_display_t, parse); + memset(self, 0, sizeof(rc_richpresence_display_t)); + next = &self->display; + } + + /* break the string up on macros: text @macro() moretext */ + do { + ptr = line; + while (ptr < endline) { + if (*ptr == '@' && (ptr == line || ptr[-1] != '\\')) /* ignore escaped @s */ + break; + + ++ptr; + } + + if (ptr > line) { + part = RC_ALLOC(rc_richpresence_display_part_t, parse); + memset(part, 0, sizeof(rc_richpresence_display_part_t)); + *next = part; + next = &part->next; + + /* handle string part */ + part->display_type = RC_FORMAT_STRING; + part->text = rc_alloc_str(parse, line, (int)(ptr - line)); + if (part->text) { + /* remove backslashes used for escaping */ + in = part->text; + while (*in && *in != '\\') + ++in; + + if (*in == '\\') { + out = (char*)in++; + while (*in) { + *out++ = *in++; + if (*in == '\\') + ++in; + } + *out = '\0'; + } + } + } + + if (*ptr == '@') { + /* handle macro part */ + size_t macro_len; + + line = ++ptr; + while (ptr < endline && *ptr != '(') + ++ptr; + + if (ptr == endline) { + parse->offset = RC_MISSING_VALUE; + return 0; + } + + macro_len = ptr - line; + + part = RC_ALLOC(rc_richpresence_display_part_t, parse); + memset(part, 0, sizeof(rc_richpresence_display_part_t)); + *next = part; + next = &part->next; + + part->display_type = RC_FORMAT_UNKNOWN_MACRO; + + /* find the lookup and hook it up */ + lookup = first_lookup; + while (lookup) { + if (strncmp(lookup->name, line, macro_len) == 0 && lookup->name[macro_len] == '\0') { + part->text = lookup->name; + part->lookup = lookup; + part->display_type = lookup->format; + break; + } + + lookup = lookup->next; + } + + if (!lookup) { + static const rc_richpresence_builtin_macro_t builtin_macros[] = { + {"Number", 6, RC_FORMAT_VALUE}, + {"Score", 5, RC_FORMAT_SCORE}, + {"Centiseconds", 12, RC_FORMAT_CENTISECS}, + {"Seconds", 7, RC_FORMAT_SECONDS}, + {"Minutes", 7, RC_FORMAT_MINUTES}, + {"SecondsAsMinutes", 16, RC_FORMAT_SECONDS_AS_MINUTES}, + {"ASCIIChar", 9, RC_FORMAT_ASCIICHAR}, + {"UnicodeChar", 11, RC_FORMAT_UNICODECHAR}, + {"Float1", 6, RC_FORMAT_FLOAT1}, + {"Float2", 6, RC_FORMAT_FLOAT2}, + {"Float3", 6, RC_FORMAT_FLOAT3}, + {"Float4", 6, RC_FORMAT_FLOAT4}, + {"Float5", 6, RC_FORMAT_FLOAT5}, + {"Float6", 6, RC_FORMAT_FLOAT6}, + {"Fixed1", 6, RC_FORMAT_FIXED1}, + {"Fixed2", 6, RC_FORMAT_FIXED2}, + {"Fixed3", 6, RC_FORMAT_FIXED3}, + {"Unsigned", 8, RC_FORMAT_UNSIGNED_VALUE}, + {"Unformatted", 11, RC_FORMAT_UNFORMATTED} + }; + size_t i; + + for (i = 0; i < sizeof(builtin_macros) / sizeof(builtin_macros[0]); ++i) { + if (macro_len == builtin_macros[i].name_len && + memcmp(builtin_macros[i].name, line, builtin_macros[i].name_len) == 0) { + part->text = builtin_macros[i].name; + part->lookup = NULL; + part->display_type = builtin_macros[i].display_type; + break; + } + } + } + + /* find the closing parenthesis */ + in = line; + line = ++ptr; + while (ptr < endline && *ptr != ')') + ++ptr; + + if (*ptr != ')') { + /* non-terminated macro, dump the macro and the remaining portion of the line */ + --in; /* already skipped over @ */ + part->display_type = RC_FORMAT_STRING; + part->text = rc_alloc_str(parse, in, (int)(ptr - in)); + } + else if (part->display_type != RC_FORMAT_UNKNOWN_MACRO) { + rc_alloc_helper_variable_memref_value(part, line, (int)(ptr - line), parse); + if (parse->offset < 0) + return 0; + + ++ptr; + } + else { + /* assert: the allocated string is going to be smaller than the memory used for the parameter of the macro */ + ++ptr; + part->text = rc_alloc_str(parse, in, (int)(ptr - in)); + } + } + + line = ptr; + } while (line < endline); + + *next = 0; + + return self; +} + +static int rc_richpresence_lookup_item_count(rc_richpresence_lookup_item_t* item) +{ + if (item == NULL) + return 0; + + return (rc_richpresence_lookup_item_count(item->left) + rc_richpresence_lookup_item_count(item->right) + 1); +} + +static void rc_rebalance_richpresence_lookup_get_items(rc_richpresence_lookup_item_t* root, + rc_richpresence_lookup_item_t** items, int* index) +{ + if (root->left != NULL) + rc_rebalance_richpresence_lookup_get_items(root->left, items, index); + + items[*index] = root; + ++(*index); + + if (root->right != NULL) + rc_rebalance_richpresence_lookup_get_items(root->right, items, index); +} + +static void rc_rebalance_richpresence_lookup_rebuild(rc_richpresence_lookup_item_t** root, + rc_richpresence_lookup_item_t** items, int first, int last) +{ + int mid = (first + last) / 2; + rc_richpresence_lookup_item_t* item = items[mid]; + *root = item; + + if (mid == first) + item->left = NULL; + else + rc_rebalance_richpresence_lookup_rebuild(&item->left, items, first, mid - 1); + + if (mid == last) + item->right = NULL; + else + rc_rebalance_richpresence_lookup_rebuild(&item->right, items, mid + 1, last); +} + +static void rc_rebalance_richpresence_lookup(rc_richpresence_lookup_item_t** root, rc_parse_state_t* parse) +{ + rc_richpresence_lookup_item_t** items; + int index; + int size; + + /* don't bother rebalancing one or two items */ + int count = rc_richpresence_lookup_item_count(*root); + if (count < 3) + return; + + /* allocate space for the flattened list in scratch memory */ + size = count * sizeof(rc_richpresence_lookup_item_t*); + items = (rc_richpresence_lookup_item_t**)rc_buffer_alloc(&parse->scratch.buffer, size); + + /* if allocation fails, we can still use the unbalanced tree, so just bail out */ + if (items == NULL) + return; + + /* flatten the list */ + index = 0; + rc_rebalance_richpresence_lookup_get_items(*root, items, &index); + + /* and rebuild it as a balanced tree */ + rc_rebalance_richpresence_lookup_rebuild(root, items, 0, count - 1); +} + +static void rc_insert_richpresence_lookup_item(rc_richpresence_lookup_t* lookup, + uint32_t first, uint32_t last, const char* label, size_t label_len, rc_parse_state_t* parse) +{ + rc_richpresence_lookup_item_t** next; + rc_richpresence_lookup_item_t* item; + + next = &lookup->root; + while ((item = *next) != NULL) { + if (first > item->last) { + if (first == item->last + 1 && + strncmp(label, item->label, label_len) == 0 && item->label[label_len] == '\0') { + item->last = last; + return; + } + + next = &item->right; + } + else if (last < item->first) { + if (last == item->first - 1 && + strncmp(label, item->label, label_len) == 0 && item->label[label_len] == '\0') { + item->first = first; + return; + } + + next = &item->left; + } + else { + parse->offset = RC_DUPLICATED_VALUE; + return; + } + } + + item = RC_ALLOC_SCRATCH(rc_richpresence_lookup_item_t, parse); + item->first = first; + item->last = last; + item->label = rc_alloc_str(parse, label, label_len); + item->left = item->right = NULL; + + *next = item; +} + +static const char* rc_parse_richpresence_lookup(rc_richpresence_lookup_t* lookup, const char* nextline, rc_parse_state_t* parse) +{ + const char* line; + const char* endline; + const char* label; + char* endptr = 0; + uint32_t first, last; + int base; + + do + { + line = nextline; + if (line == NULL) + break; + + nextline = rc_parse_line(line, &endline, parse); + + if (endline - line < 2) { + /* ignore full line comments inside a lookup */ + if (line[0] == '/' && line[1] == '/') + continue; + + /* empty line indicates end of lookup */ + if (lookup->root) + rc_rebalance_richpresence_lookup(&lookup->root, parse); + break; + } + + /* "*=XXX" specifies default label if lookup does not provide a mapping for the value */ + if (line[0] == '*' && line[1] == '=') { + line += 2; + lookup->default_label = rc_alloc_str(parse, line, (int)(endline - line)); + continue; + } + + label = line; + while (label < endline && *label != '=') + ++label; + + if (label == endline) { + parse->offset = RC_MISSING_VALUE; + break; + } + ++label; + + do { + /* get the value for the mapping */ + if (line[0] == '0' && line[1] == 'x') { + line += 2; + base = 16; + } else { + base = 10; + } + + first = (unsigned)strtoul(line, &endptr, base); + + /* check for a range */ + if (*endptr != '-') { + /* no range, just set last to first */ + last = first; + } + else { + /* range, get last value */ + line = endptr + 1; + + if (line[0] == '0' && line[1] == 'x') { + line += 2; + base = 16; + } else { + base = 10; + } + + last = (unsigned)strtoul(line, &endptr, base); + } + + /* ignore spaces after the number - was previously ignored as string was split on equals */ + while (*endptr == ' ') + ++endptr; + + /* if we've found the equal sign, this is the last item */ + if (*endptr == '=') { + rc_insert_richpresence_lookup_item(lookup, first, last, label, (int)(endline - label), parse); + break; + } + + /* otherwise, if it's not a comma, it's an error */ + if (*endptr != ',') { + parse->offset = RC_INVALID_CONST_OPERAND; + break; + } + + /* insert the current item and continue scanning the next one */ + rc_insert_richpresence_lookup_item(lookup, first, last, label, (int)(endline - label), parse); + if (parse->offset < 0) + break; + + line = endptr + 1; + } while (line < endline); + + } while (parse->offset > 0); + + return nextline; +} + +void rc_parse_richpresence_internal(rc_richpresence_t* self, const char* script, rc_parse_state_t* parse) { + rc_richpresence_display_t** nextdisplay; + rc_richpresence_lookup_t* firstlookup = NULL; + rc_richpresence_lookup_t** nextlookup = &firstlookup; + rc_richpresence_lookup_t* lookup; + rc_trigger_t* trigger; + char format[64]; + const char* display = 0; + const char* line; + const char* nextline; + const char* endline; + const char* ptr; + int hasdisplay = 0; + int display_line = 0; + int chars; + + self->values = NULL; + + /* special case for empty script to return 1 line read */ + if (!*script) { + parse->lines_read = 1; + parse->offset = RC_MISSING_DISPLAY_STRING; + return; + } + + /* first pass: process macro initializers */ + line = script; + while (*line) { + nextline = rc_parse_line(line, &endline, parse); + if (strncmp(line, "Lookup:", 7) == 0) { + line += 7; + + lookup = RC_ALLOC_SCRATCH(rc_richpresence_lookup_t, parse); + lookup->name = rc_alloc_str(parse, line, (int)(endline - line)); + lookup->format = RC_FORMAT_LOOKUP; + lookup->root = NULL; + lookup->default_label = ""; + *nextlookup = lookup; + nextlookup = &lookup->next; + + nextline = rc_parse_richpresence_lookup(lookup, nextline, parse); + if (parse->offset < 0) + return; + + } else if (strncmp(line, "Format:", 7) == 0) { + line += 7; + if (endline - line == 11 && memcmp(line, "Unformatted", 11) == 0) { + /* for backwards compatibility with the comma rollout, we allow old scripts + * to define an Unformatted type mapped to VALUE, and new versions will ignore + * the definition and use the built-in macro. skip the next line (FormatType=) */ + line = rc_parse_line(nextline, &endline, parse); + continue; + } + + lookup = RC_ALLOC_SCRATCH(rc_richpresence_lookup_t, parse); + lookup->name = rc_alloc_str(parse, line, (int)(endline - line)); + lookup->root = NULL; + lookup->default_label = ""; + *nextlookup = lookup; + nextlookup = &lookup->next; + + line = nextline; + nextline = rc_parse_line(line, &endline, parse); + if (parse->buffer && strncmp(line, "FormatType=", 11) == 0) { + line += 11; + + chars = (int)(endline - line); + if (chars > 63) + chars = 63; + memcpy(format, line, chars); + format[chars] = '\0'; + + lookup->format = (uint8_t)rc_parse_format(format); + } else { + lookup->format = RC_FORMAT_VALUE; + } + } else if (strncmp(line, "Display:", 8) == 0) { + display = nextline; + display_line = parse->lines_read; + + /* scan as long as we find conditional lines or full line comments */ + do { + line = nextline; + nextline = rc_parse_line(line, &endline, parse); + } while (*line == '?' || (line[0] == '/' && line[1] == '/')); + } + + line = nextline; + } + + *nextlookup = 0; + self->first_lookup = firstlookup; + + nextdisplay = &self->first_display; + + /* second pass, process display string*/ + if (display) { + /* point the parser back at the display strings */ + int lines_read = parse->lines_read; + parse->lines_read = display_line; + line = display; + + nextline = rc_parse_line(line, &endline, parse); + + do { + if (line[0] == '?') { + /* conditional display: ?trigger?string */ + ptr = ++line; + while (ptr < endline && *ptr != '?') + ++ptr; + + if (ptr < endline) { + *nextdisplay = rc_parse_richpresence_display_internal(ptr + 1, endline, parse, firstlookup); + if (parse->offset < 0) + return; + + trigger = &((*nextdisplay)->trigger); + rc_parse_trigger_internal(trigger, &line, parse); + if (parse->offset < 0) + return; + + if (line != ptr) { + /* incomplete read */ + parse->offset = RC_INVALID_OPERATOR; + return; + } + + (*nextdisplay)->has_required_hits = parse->has_required_hits; + + if (parse->buffer) + nextdisplay = &((*nextdisplay)->next); + } + } + else if (line[0] != '/' || line[1] != '/') { + break; + } + + line = nextline; + nextline = rc_parse_line(line, &endline, parse); + } while (1); + + /* non-conditional display: string */ + *nextdisplay = rc_parse_richpresence_display_internal(line, endline, parse, firstlookup); + if (*nextdisplay) { + hasdisplay = 1; + nextdisplay = &((*nextdisplay)->next); + + /* restore the parser state */ + parse->lines_read = lines_read; + } + else { + /* this should only happen if the line is blank. + * expect parse->offset to be RC_MISSING_DISPLAY_STRING and leave parse->lines_read + * on the current line for error tracking. */ + } + } + + /* finalize */ + *nextdisplay = 0; + self->has_memrefs = 0; + + if (!hasdisplay && parse->offset > 0) { + parse->offset = RC_MISSING_DISPLAY_STRING; + } +} + +int rc_richpresence_size_lines(const char* script, int* lines_read) { + rc_richpresence_with_memrefs_t* richpresence; + rc_preparse_state_t preparse; + rc_init_preparse_state(&preparse); + + richpresence = RC_ALLOC(rc_richpresence_with_memrefs_t, &preparse.parse); + preparse.parse.variables = &richpresence->richpresence.values; + rc_parse_richpresence_internal(&richpresence->richpresence, script, &preparse.parse); + rc_preparse_alloc_memrefs(NULL, &preparse); + + if (lines_read) + *lines_read = preparse.parse.lines_read; + + rc_destroy_preparse_state(&preparse); + return preparse.parse.offset; +} + +int rc_richpresence_size(const char* script) { + return rc_richpresence_size_lines(script, NULL); +} + +rc_richpresence_t* rc_parse_richpresence(void* buffer, const char* script, void* unused_L, int unused_funcs_idx) { + rc_richpresence_with_memrefs_t* richpresence; + rc_preparse_state_t preparse; + + (void)unused_L; + (void)unused_funcs_idx; + + if (!buffer || !script) + return NULL; + + rc_init_preparse_state(&preparse); + richpresence = RC_ALLOC(rc_richpresence_with_memrefs_t, &preparse.parse); + preparse.parse.variables = &richpresence->richpresence.values; + rc_parse_richpresence_internal(&richpresence->richpresence, script, &preparse.parse); + + rc_reset_parse_state(&preparse.parse, buffer); + richpresence = RC_ALLOC(rc_richpresence_with_memrefs_t, &preparse.parse); + preparse.parse.variables = &richpresence->richpresence.values; + rc_preparse_alloc_memrefs(&richpresence->memrefs, &preparse); + + rc_parse_richpresence_internal(&richpresence->richpresence, script, &preparse.parse); + richpresence->richpresence.has_memrefs = 1; + + rc_destroy_preparse_state(&preparse); + return (preparse.parse.offset >= 0) ? &richpresence->richpresence : NULL; +} + +static void rc_update_richpresence_memrefs(rc_richpresence_t* self, rc_peek_t peek, void* ud) { + if (self->has_memrefs) { + rc_richpresence_with_memrefs_t* richpresence = (rc_richpresence_with_memrefs_t*)self; + rc_update_memref_values(&richpresence->memrefs, peek, ud); + } +} + +rc_memrefs_t* rc_richpresence_get_memrefs(rc_richpresence_t* self) { + if (self->has_memrefs) { + rc_richpresence_with_memrefs_t* richpresence = (rc_richpresence_with_memrefs_t*)self; + return &richpresence->memrefs; + } + + return NULL; +} + +void rc_update_richpresence(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud, void* unused_L) { + (void)unused_L; + + rc_update_richpresence_memrefs(richpresence, peek, peek_ud); + rc_update_values(richpresence->values, peek, peek_ud); + rc_update_richpresence_internal(richpresence, peek, peek_ud); +} + +void rc_update_richpresence_internal(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud) { + rc_richpresence_display_t* display; + + for (display = richpresence->first_display; display; display = display->next) { + if (display->has_required_hits) + rc_test_trigger(&display->trigger, peek, peek_ud, NULL); + } +} + +static int rc_evaluate_richpresence_display(rc_richpresence_display_part_t* part, char* buffer, size_t buffersize) +{ + rc_richpresence_lookup_item_t* item; + rc_typed_value_t value; + char tmp[256]; + char* ptr = buffer; + const char* text; + size_t chars; + + *ptr = '\0'; + while (part) { + switch (part->display_type) { + case RC_FORMAT_STRING: + text = part->text; + chars = strlen(text); + break; + + case RC_FORMAT_LOOKUP: + rc_evaluate_operand(&value, &part->value, NULL); + rc_typed_value_convert(&value, RC_VALUE_TYPE_UNSIGNED); + + text = part->lookup->default_label; + item = part->lookup->root; + while (item) { + if (value.value.u32 > item->last) { + item = item->right; + } + else if (value.value.u32 < item->first) { + item = item->left; + } + else { + text = item->label; + break; + } + } + + chars = strlen(text); + break; + + case RC_FORMAT_ASCIICHAR: + chars = 0; + text = tmp; + value.type = RC_VALUE_TYPE_UNSIGNED; + + do { + rc_evaluate_operand(&value, &part->value, NULL); + if (value.value.u32 == 0) { + /* null terminator - skip over remaining character macros */ + while (part->next && part->next->display_type == RC_FORMAT_ASCIICHAR) + part = part->next; + break; + } + + if (value.value.u32 < 32 || value.value.u32 >= 127) + value.value.u32 = '?'; + + tmp[chars++] = (char)value.value.u32; + if (chars == sizeof(tmp) || !part->next || part->next->display_type != RC_FORMAT_ASCIICHAR) + break; + + part = part->next; + } while (1); + + tmp[chars] = '\0'; + break; + + case RC_FORMAT_UNICODECHAR: + chars = 0; + text = tmp; + value.type = RC_VALUE_TYPE_UNSIGNED; + + do { + rc_evaluate_operand(&value, &part->value, NULL); + if (value.value.u32 == 0) { + /* null terminator - skip over remaining character macros */ + while (part->next && part->next->display_type == RC_FORMAT_UNICODECHAR) + part = part->next; + break; + } + + if (value.value.u32 < 32 || value.value.u32 > 65535) + value.value.u32 = 0xFFFD; /* unicode replacement char */ + + if (value.value.u32 < 0x80) { + tmp[chars++] = (char)value.value.u32; + } + else if (value.value.u32 < 0x0800) { + tmp[chars + 1] = (char)(0x80 | (value.value.u32 & 0x3F)); value.value.u32 >>= 6; + tmp[chars] = (char)(0xC0 | (value.value.u32 & 0x1F)); + chars += 2; + } + else { + /* surrogate pair not supported, convert to replacement char */ + if (value.value.u32 >= 0xD800 && value.value.u32 < 0xE000) + value.value.u32 = 0xFFFD; + + tmp[chars + 2] = (char)(0x80 | (value.value.u32 & 0x3F)); value.value.u32 >>= 6; + tmp[chars + 1] = (char)(0x80 | (value.value.u32 & 0x3F)); value.value.u32 >>= 6; + tmp[chars] = (char)(0xE0 | (value.value.u32 & 0x1F)); + chars += 3; + } + + if (chars >= sizeof(tmp) - 3 || !part->next || part->next->display_type != RC_FORMAT_UNICODECHAR) + break; + + part = part->next; + } while (1); + + tmp[chars] = '\0'; + break; + + case RC_FORMAT_UNKNOWN_MACRO: + chars = snprintf(tmp, sizeof(tmp), "[Unknown macro]%s", part->text); + text = tmp; + break; + + default: + rc_evaluate_operand(&value, &part->value, NULL); + chars = rc_format_typed_value(tmp, sizeof(tmp), &value, part->display_type); + text = tmp; + break; + } + + if (chars > 0 && buffersize > 0) { + if ((unsigned)chars >= buffersize) { + /* prevent write past end of buffer */ + memcpy(ptr, text, buffersize - 1); + ptr[buffersize - 1] = '\0'; + buffersize = 0; + } + else { + memcpy(ptr, text, chars); + ptr[chars] = '\0'; + buffersize -= (unsigned)chars; + } + } + + ptr += chars; + part = part->next; + } + + return (int)(ptr - buffer); +} + +int rc_get_richpresence_display_string(rc_richpresence_t* richpresence, char* buffer, size_t buffersize, rc_peek_t peek, void* peek_ud, void* unused_L) { + rc_richpresence_display_t* display; + + for (display = richpresence->first_display; display; display = display->next) { + /* if we've reached the end of the condition list, process it */ + if (!display->next) + return rc_evaluate_richpresence_display(display->display, buffer, buffersize); + + /* triggers with required hits will be updated in rc_update_richpresence */ + if (!display->has_required_hits) + rc_test_trigger(&display->trigger, peek, peek_ud, unused_L); + + /* if we've found a valid condition, process it */ + if (display->trigger.state == RC_TRIGGER_STATE_TRIGGERED) + return rc_evaluate_richpresence_display(display->display, buffer, buffersize); + } + + buffer[0] = '\0'; + return 0; +} + +int rc_evaluate_richpresence(rc_richpresence_t* richpresence, char* buffer, size_t buffersize, rc_peek_t peek, void* peek_ud, void* unused_L) { + rc_update_richpresence(richpresence, peek, peek_ud, unused_L); + return rc_get_richpresence_display_string(richpresence, buffer, buffersize, peek, peek_ud, unused_L); +} + +void rc_reset_richpresence_triggers(rc_richpresence_t* self) { + rc_richpresence_display_t* display; + + for (display = self->first_display; display; display = display->next) + rc_reset_trigger(&display->trigger); +} + +void rc_reset_richpresence(rc_richpresence_t* self) { + rc_reset_richpresence_triggers(self); + rc_reset_values(self->values); +} diff --git a/src/rcheevos/src/rcheevos/runtime.c b/src/rcheevos/src/rcheevos/runtime.c new file mode 100644 index 0000000000..9c05985ee8 --- /dev/null +++ b/src/rcheevos/src/rcheevos/runtime.c @@ -0,0 +1,852 @@ +#include "rc_runtime.h" +#include "rc_internal.h" + +#include "../rc_compat.h" +#include "../rhash/md5.h" + +#include +#include + +#define RC_RICHPRESENCE_DISPLAY_BUFFER_SIZE 256 + +/* ===== natvis extensions ===== */ + +typedef struct __rc_runtime_trigger_list_t { rc_runtime_t runtime; } __rc_runtime_trigger_list_t; +typedef struct __rc_runtime_lboard_list_t { rc_runtime_t runtime; } __rc_runtime_lboard_list_t; + +static void rc_runtime_natvis_helper(const rc_runtime_event_t* runtime_event) +{ + struct natvis_extensions { + __rc_runtime_trigger_list_t trigger_list; + __rc_runtime_lboard_list_t lboard_list; + } natvis; + + memset(&natvis, 0, sizeof(natvis)); + (void)runtime_event; + + natvis.lboard_list.runtime.lboard_count = 0; +} + +/* ============================= */ + +rc_runtime_t* rc_runtime_alloc(void) { + rc_runtime_t* self; + + /* create a reference to rc_runtime_natvis_helper so the extensions get compiled in. */ + rc_runtime_event_handler_t unused = &rc_runtime_natvis_helper; + (void)unused; + + self = (rc_runtime_t*)malloc(sizeof(rc_runtime_t)); + + if (self) { + rc_runtime_init(self); + self->owns_self = 1; + } + + return self; +} + +void rc_runtime_init(rc_runtime_t* self) { + memset(self, 0, sizeof(rc_runtime_t)); + + self->memrefs = (rc_memrefs_t*)malloc(sizeof(*self->memrefs)); + rc_memrefs_init(self->memrefs); +} + +void rc_runtime_destroy(rc_runtime_t* self) { + uint32_t i; + + if (self->triggers) { + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].buffer) + free(self->triggers[i].buffer); + } + + free(self->triggers); + self->triggers = NULL; + + self->trigger_count = self->trigger_capacity = 0; + } + + if (self->lboards) { + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].buffer) + free(self->lboards[i].buffer); + } + + free(self->lboards); + self->lboards = NULL; + + self->lboard_count = self->lboard_capacity = 0; + } + + if (self->richpresence) { + if (self->richpresence->buffer) + free(self->richpresence->buffer); + free(self->richpresence); + } + + if (self->memrefs) + rc_memrefs_destroy(self->memrefs); + + if (self->owns_self) + free(self); +} + +void rc_runtime_checksum(const char* memaddr, uint8_t* md5) { + md5_state_t state; + md5_init(&state); + md5_append(&state, (unsigned char*)memaddr, (int)strlen(memaddr)); + md5_finish(&state, md5); +} + +static void rc_runtime_deactivate_trigger_by_index(rc_runtime_t* self, uint32_t index) { + /* free the trigger, then replace it with the last trigger */ + free(self->triggers[index].buffer); + + if (--self->trigger_count > index) + memcpy(&self->triggers[index], &self->triggers[self->trigger_count], sizeof(rc_runtime_trigger_t)); +} + +void rc_runtime_deactivate_achievement(rc_runtime_t* self, uint32_t id) { + uint32_t i; + + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].id == id && self->triggers[i].trigger != NULL) + rc_runtime_deactivate_trigger_by_index(self, i); + } +} + +int rc_runtime_activate_achievement(rc_runtime_t* self, uint32_t id, const char* memaddr, void* unused_L, int unused_funcs_idx) { + void* trigger_buffer; + rc_trigger_t* trigger; + rc_runtime_trigger_t* runtime_trigger; + rc_preparse_state_t preparse; + const char* preparse_memaddr = memaddr; + uint8_t md5[16]; + int32_t size; + uint32_t i; + + (void)unused_L; + (void)unused_funcs_idx; + + if (memaddr == NULL) + return RC_INVALID_MEMORY_OPERAND; + + rc_runtime_checksum(memaddr, md5); + + /* check to see if the id is already registered with an active trigger */ + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].id == id && self->triggers[i].trigger != NULL) { + if (memcmp(self->triggers[i].md5, md5, 16) == 0) { + /* if the checksum hasn't changed, we can reuse the existing item */ + rc_reset_trigger(self->triggers[i].trigger); + return RC_OK; + } + + /* checksum has changed, deactivate the the item */ + rc_runtime_deactivate_trigger_by_index(self, i); + + /* deactivate may reorder the list so we should continue from the current index. however, we + * assume that only one trigger is active per id, so having found that, just stop scanning. + */ + break; + } + } + + /* check to see if a disabled trigger for the specific id matches the trigger being registered */ + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].id == id && memcmp(self->triggers[i].md5, md5, 16) == 0) { + /* retrieve the trigger pointer from the buffer */ + size = 0; + trigger = (rc_trigger_t*)rc_alloc(self->triggers[i].buffer, &size, sizeof(rc_trigger_t), RC_ALIGNOF(rc_trigger_t), NULL, -1); + self->triggers[i].trigger = trigger; + + rc_reset_trigger(trigger); + return RC_OK; + } + } + + /* item has not been previously registered, determine how much space we need for it, and allocate it */ + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = self->memrefs; + trigger = RC_ALLOC(rc_trigger_t, &preparse.parse); + rc_parse_trigger_internal(trigger, &preparse_memaddr, &preparse.parse); + + size = preparse.parse.offset; + if (size < 0) + return size; + + trigger_buffer = malloc(size); + if (!trigger_buffer) + return RC_OUT_OF_MEMORY; + + /* populate the item, using the communal memrefs pool */ + rc_reset_parse_state(&preparse.parse, trigger_buffer); + rc_preparse_reserve_memrefs(&preparse, self->memrefs); + trigger = RC_ALLOC(rc_trigger_t, &preparse.parse); + rc_parse_trigger_internal(trigger, &memaddr, &preparse.parse); + rc_destroy_preparse_state(&preparse); + + if (preparse.parse.offset < 0) { + free(trigger_buffer); + return preparse.parse.offset; + } + + /* grow the trigger buffer if necessary */ + if (self->trigger_count == self->trigger_capacity) { + self->trigger_capacity += 32; + if (!self->triggers) + self->triggers = (rc_runtime_trigger_t*)malloc(self->trigger_capacity * sizeof(rc_runtime_trigger_t)); + else + self->triggers = (rc_runtime_trigger_t*)realloc(self->triggers, self->trigger_capacity * sizeof(rc_runtime_trigger_t)); + + if (!self->triggers) { + free(trigger_buffer); + return RC_OUT_OF_MEMORY; + } + } + + /* assign the new trigger */ + runtime_trigger = &self->triggers[self->trigger_count]; + runtime_trigger->id = id; + runtime_trigger->trigger = trigger; + runtime_trigger->buffer = trigger_buffer; + runtime_trigger->invalid_memref = NULL; + memcpy(runtime_trigger->md5, md5, 16); + runtime_trigger->serialized_size = 0; + ++self->trigger_count; + + /* reset it, and return it */ + rc_reset_trigger(trigger); + return RC_OK; +} + +rc_trigger_t* rc_runtime_get_achievement(const rc_runtime_t* self, uint32_t id) +{ + uint32_t i; + + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].id == id && self->triggers[i].trigger != NULL) + return self->triggers[i].trigger; + } + + return NULL; +} + +int rc_runtime_get_achievement_measured(const rc_runtime_t* runtime, uint32_t id, unsigned* measured_value, unsigned* measured_target) +{ + const rc_trigger_t* trigger = rc_runtime_get_achievement(runtime, id); + if (!measured_value || !measured_target) + return 0; + + if (!trigger) { + *measured_value = *measured_target = 0; + return 0; + } + + if (rc_trigger_state_active(trigger->state)) { + *measured_value = (trigger->measured_value == RC_MEASURED_UNKNOWN) ? 0 : trigger->measured_value; + *measured_target = trigger->measured_target; + } + else { + /* don't report measured information for inactive triggers */ + *measured_value = *measured_target = 0; + } + + return 1; +} + +int rc_runtime_format_achievement_measured(const rc_runtime_t* runtime, uint32_t id, char* buffer, size_t buffer_size) +{ + const rc_trigger_t* trigger = rc_runtime_get_achievement(runtime, id); + uint32_t value; + if (!buffer || !buffer_size) + return 0; + + if (!trigger || /* no trigger */ + trigger->measured_target == 0 || /* not measured */ + !rc_trigger_state_active(trigger->state)) { /* don't report measured value for inactive triggers */ + *buffer = '\0'; + return 0; + } + + /* cap the value at the target so we can count past the target: "107 >= 100" */ + value = (trigger->measured_value == RC_MEASURED_UNKNOWN) ? 0 : trigger->measured_value; + if (value > trigger->measured_target) + value = trigger->measured_target; + + if (trigger->measured_as_percent) { + const uint32_t percent = (uint32_t)(((unsigned long long)value * 100) / trigger->measured_target); + return snprintf(buffer, buffer_size, "%u%%", percent); + } + + return snprintf(buffer, buffer_size, "%u/%u", value, trigger->measured_target); +} + +static void rc_runtime_deactivate_lboard_by_index(rc_runtime_t* self, uint32_t index) { + /* free the lboard, then replace it with the last lboard */ + free(self->lboards[index].buffer); + + if (--self->lboard_count > index) + memcpy(&self->lboards[index], &self->lboards[self->lboard_count], sizeof(rc_runtime_lboard_t)); +} + +void rc_runtime_deactivate_lboard(rc_runtime_t* self, uint32_t id) { + uint32_t i; + + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].id == id && self->lboards[i].lboard != NULL) + rc_runtime_deactivate_lboard_by_index(self, i); + } +} + +int rc_runtime_activate_lboard(rc_runtime_t* self, uint32_t id, const char* memaddr, void* unused_L, int unused_funcs_idx) { + void* lboard_buffer; + uint8_t md5[16]; + rc_lboard_t* lboard; + rc_preparse_state_t preparse; + rc_runtime_lboard_t* runtime_lboard; + int32_t size; + uint32_t i; + + (void)unused_L; + (void)unused_funcs_idx; + + if (memaddr == 0) + return RC_INVALID_MEMORY_OPERAND; + + rc_runtime_checksum(memaddr, md5); + + /* check to see if the id is already registered with an active lboard */ + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].id == id && self->lboards[i].lboard != NULL) { + if (memcmp(self->lboards[i].md5, md5, 16) == 0) { + /* if the checksum hasn't changed, we can reuse the existing item */ + rc_reset_lboard(self->lboards[i].lboard); + return RC_OK; + } + + /* checksum has changed, deactivate the the item */ + rc_runtime_deactivate_lboard_by_index(self, i); + + /* deactivate may reorder the list so we should continue from the current index. however, we + * assume that only one trigger is active per id, so having found that, just stop scanning. + */ + break; + } + } + + /* check to see if a disabled lboard for the specific id matches the lboard being registered */ + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].id == id && memcmp(self->lboards[i].md5, md5, 16) == 0) { + /* retrieve the lboard pointer from the buffer */ + size = 0; + lboard = (rc_lboard_t*)rc_alloc(self->lboards[i].buffer, &size, sizeof(rc_lboard_t), RC_ALIGNOF(rc_lboard_t), NULL, -1); + self->lboards[i].lboard = lboard; + + rc_reset_lboard(lboard); + return RC_OK; + } + } + + /* item has not been previously registered, determine how much space we need for it, and allocate it */ + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = self->memrefs; + lboard = RC_ALLOC(rc_lboard_t, &preparse.parse); + rc_parse_lboard_internal(lboard, memaddr, &preparse.parse); + + size = preparse.parse.offset; + if (size < 0) + return size; + + lboard_buffer = malloc(size); + if (!lboard_buffer) + return RC_OUT_OF_MEMORY; + + /* populate the item, using the communal memrefs pool */ + rc_reset_parse_state(&preparse.parse, lboard_buffer); + rc_preparse_reserve_memrefs(&preparse, self->memrefs); + lboard = RC_ALLOC(rc_lboard_t, &preparse.parse); + rc_parse_lboard_internal(lboard, memaddr, &preparse.parse); + rc_destroy_preparse_state(&preparse); + + if (preparse.parse.offset < 0) { + free(lboard_buffer); + return preparse.parse.offset; + } + + /* grow the lboard buffer if necessary */ + if (self->lboard_count == self->lboard_capacity) { + self->lboard_capacity += 16; + if (!self->lboards) + self->lboards = (rc_runtime_lboard_t*)malloc(self->lboard_capacity * sizeof(rc_runtime_lboard_t)); + else + self->lboards = (rc_runtime_lboard_t*)realloc(self->lboards, self->lboard_capacity * sizeof(rc_runtime_lboard_t)); + + if (!self->lboards) { + free(lboard_buffer); + return RC_OUT_OF_MEMORY; + } + } + + /* assign the new lboard */ + runtime_lboard = &self->lboards[self->lboard_count++]; + runtime_lboard->id = id; + runtime_lboard->value = 0; + runtime_lboard->lboard = lboard; + runtime_lboard->buffer = lboard_buffer; + runtime_lboard->invalid_memref = NULL; + memcpy(runtime_lboard->md5, md5, 16); + runtime_lboard->serialized_size = 0; + + /* reset it, and return it */ + rc_reset_lboard(lboard); + return RC_OK; +} + +rc_lboard_t* rc_runtime_get_lboard(const rc_runtime_t* self, uint32_t id) +{ + uint32_t i; + + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].id == id && self->lboards[i].lboard != NULL) + return self->lboards[i].lboard; + } + + return NULL; +} + +int rc_runtime_format_lboard_value(char* buffer, int size, int32_t value, int format) +{ + return rc_format_value(buffer, size, value, format); +} + +int rc_runtime_activate_richpresence(rc_runtime_t* self, const char* script, void* unused_L, int unused_funcs_idx) { + rc_richpresence_t* richpresence; + rc_preparse_state_t preparse; + uint8_t md5[16]; + int size; + + (void)unused_L; + (void)unused_funcs_idx; + + if (script == NULL) + return RC_MISSING_DISPLAY_STRING; + + rc_runtime_checksum(script, md5); + + /* look for existing match */ + if (self->richpresence && self->richpresence->richpresence && memcmp(self->richpresence->md5, md5, 16) == 0) { + /* unchanged. reset all of the conditions */ + rc_reset_richpresence(self->richpresence->richpresence); + + /* return success*/ + return RC_OK; + } + + /* no existing match found, parse script */ + rc_init_preparse_state(&preparse); + preparse.parse.existing_memrefs = self->memrefs; + richpresence = RC_ALLOC(rc_richpresence_t, &preparse.parse); + preparse.parse.variables = &richpresence->values; + rc_parse_richpresence_internal(richpresence, script, &preparse.parse); + + size = preparse.parse.offset; + if (size < 0) + return size; + + /* if there's a previous script, free it */ + if (self->richpresence) { + free(self->richpresence->buffer); + free(self->richpresence); + } + + /* allocate and process the new script */ + self->richpresence = (rc_runtime_richpresence_t*)malloc(sizeof(rc_runtime_richpresence_t)); + if (!self->richpresence) + return RC_OUT_OF_MEMORY; + + memcpy(self->richpresence->md5, md5, sizeof(md5)); + + self->richpresence->buffer = malloc(size); + if (!self->richpresence->buffer) + return RC_OUT_OF_MEMORY; + + rc_reset_parse_state(&preparse.parse, self->richpresence->buffer); + rc_preparse_reserve_memrefs(&preparse, self->memrefs); + richpresence = RC_ALLOC(rc_richpresence_t, &preparse.parse); + preparse.parse.variables = &richpresence->values; + rc_parse_richpresence_internal(richpresence, script, &preparse.parse); + rc_destroy_preparse_state(&preparse); + + if (preparse.parse.offset < 0) { + free(self->richpresence->buffer); + free(self->richpresence); + self->richpresence = NULL; + return preparse.parse.offset; + } + + if (!richpresence->first_display || !richpresence->first_display->display) { + /* non-existant rich presence */ + self->richpresence->richpresence = NULL; + } + else { + /* reset all of the conditions */ + rc_reset_richpresence(richpresence); + self->richpresence->richpresence = richpresence; + } + + return RC_OK; +} + +int rc_runtime_get_richpresence(const rc_runtime_t* self, char* buffer, size_t buffersize, rc_runtime_peek_t peek, void* peek_ud, void* unused_L) { + if (self->richpresence && self->richpresence->richpresence) + return rc_get_richpresence_display_string(self->richpresence->richpresence, buffer, buffersize, peek, peek_ud, unused_L); + + *buffer = '\0'; + return 0; +} + +void rc_runtime_do_frame(rc_runtime_t* self, rc_runtime_event_handler_t event_handler, rc_runtime_peek_t peek, void* ud, void* unused_L) { + rc_runtime_event_t runtime_event; + int i; + + runtime_event.value = 0; + + rc_update_memref_values(self->memrefs, peek, ud); + + for (i = self->trigger_count - 1; i >= 0; --i) { + rc_trigger_t* trigger = self->triggers[i].trigger; + int old_state, new_state; + uint32_t old_measured_value; + + if (!trigger) + continue; + + if (self->triggers[i].invalid_memref) { + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_DISABLED; + runtime_event.id = self->triggers[i].id; + runtime_event.value = self->triggers[i].invalid_memref->address; + + trigger->state = RC_TRIGGER_STATE_DISABLED; + self->triggers[i].invalid_memref = NULL; + + event_handler(&runtime_event); + + runtime_event.value = 0; /* achievement loop expects this to stay at 0 */ + continue; + } + + old_measured_value = trigger->measured_value; + old_state = trigger->state; + new_state = rc_evaluate_trigger(trigger, peek, ud, unused_L); + + /* trigger->state doesn't actually change to RESET, RESET just serves as a notification. + * handle the notification, then look at the actual state */ + if (new_state == RC_TRIGGER_STATE_RESET) { + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_RESET; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + + new_state = trigger->state; + } + + /* if the measured value changed and the achievement hasn't triggered, send a notification */ + if (trigger->measured_value != old_measured_value && old_measured_value != RC_MEASURED_UNKNOWN && + trigger->measured_target != 0 && trigger->measured_value <= trigger->measured_target && + new_state != RC_TRIGGER_STATE_TRIGGERED && + new_state != RC_TRIGGER_STATE_INACTIVE && new_state != RC_TRIGGER_STATE_WAITING) { + + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED; + runtime_event.id = self->triggers[i].id; + + if (trigger->measured_as_percent) { + /* if reporting measured value as a percentage, only send the notification if the percentage changes */ + const int32_t old_percent = (int32_t)(((unsigned long long)old_measured_value * 100) / trigger->measured_target); + const int32_t new_percent = (int32_t)(((unsigned long long)trigger->measured_value * 100) / trigger->measured_target); + if (old_percent != new_percent) { + runtime_event.value = new_percent; + event_handler(&runtime_event); + } + } + else { + runtime_event.value = trigger->measured_value; + event_handler(&runtime_event); + } + + runtime_event.value = 0; /* achievement loop expects this to stay at 0 */ + } + + /* if the state hasn't changed, there won't be any events raised */ + if (new_state == old_state) + continue; + + /* raise an UNPRIMED event when changing from PRIMED to anything else */ + if (old_state == RC_TRIGGER_STATE_PRIMED) { + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + } + + /* raise events for each of the possible new states */ + switch (new_state) + { + case RC_TRIGGER_STATE_TRIGGERED: + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + break; + + case RC_TRIGGER_STATE_PAUSED: + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_PAUSED; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + break; + + case RC_TRIGGER_STATE_PRIMED: + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + break; + + case RC_TRIGGER_STATE_ACTIVE: + /* only raise ACTIVATED event when transitioning from an inactive state. + * note that inactive in this case means active but cannot trigger. */ + if (old_state == RC_TRIGGER_STATE_WAITING || old_state == RC_TRIGGER_STATE_PAUSED) { + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED; + runtime_event.id = self->triggers[i].id; + event_handler(&runtime_event); + } + break; + } + } + + for (i = self->lboard_count - 1; i >= 0; --i) { + rc_lboard_t* lboard = self->lboards[i].lboard; + int lboard_state; + + if (!lboard) + continue; + + if (self->lboards[i].invalid_memref) { + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_DISABLED; + runtime_event.id = self->lboards[i].id; + runtime_event.value = self->lboards[i].invalid_memref->address; + + lboard->state = RC_LBOARD_STATE_DISABLED; + self->lboards[i].invalid_memref = NULL; + + event_handler(&runtime_event); + continue; + } + + lboard_state = lboard->state; + switch (rc_evaluate_lboard(lboard, &runtime_event.value, peek, ud, unused_L)) + { + case RC_LBOARD_STATE_STARTED: /* leaderboard is running */ + if (lboard_state != RC_LBOARD_STATE_STARTED) { + self->lboards[i].value = runtime_event.value; + + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_STARTED; + runtime_event.id = self->lboards[i].id; + event_handler(&runtime_event); + } + else if (runtime_event.value != self->lboards[i].value) { + self->lboards[i].value = runtime_event.value; + + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_UPDATED; + runtime_event.id = self->lboards[i].id; + event_handler(&runtime_event); + } + break; + + case RC_LBOARD_STATE_CANCELED: + if (lboard_state != RC_LBOARD_STATE_CANCELED) { + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_CANCELED; + runtime_event.id = self->lboards[i].id; + event_handler(&runtime_event); + } + break; + + case RC_LBOARD_STATE_TRIGGERED: + if (lboard_state != RC_RUNTIME_EVENT_LBOARD_TRIGGERED) { + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_TRIGGERED; + runtime_event.id = self->lboards[i].id; + event_handler(&runtime_event); + } + break; + } + } + + if (self->richpresence && self->richpresence->richpresence) + rc_update_richpresence(self->richpresence->richpresence, peek, ud, unused_L); +} + +void rc_runtime_reset(rc_runtime_t* self) { + uint32_t i; + + for (i = 0; i < self->trigger_count; ++i) { + if (self->triggers[i].trigger) + rc_reset_trigger(self->triggers[i].trigger); + } + + for (i = 0; i < self->lboard_count; ++i) { + if (self->lboards[i].lboard) + rc_reset_lboard(self->lboards[i].lboard); + } + + if (self->richpresence && self->richpresence->richpresence) + rc_reset_richpresence(self->richpresence->richpresence); +} + +static int rc_condset_contains_memref(const rc_condset_t* condset, const rc_memref_t* memref) { + rc_condition_t* cond; + if (!condset) + return 0; + + for (cond = condset->conditions; cond; cond = cond->next) { + if (rc_operand_is_memref(&cond->operand1) && cond->operand1.value.memref == memref) + return 1; + if (rc_operand_is_memref(&cond->operand2) && cond->operand2.value.memref == memref) + return 1; + } + + return 0; +} + +int rc_value_contains_memref(const rc_value_t* value, const rc_memref_t* memref) { + rc_condset_t* condset; + if (!value) + return 0; + + for (condset = value->conditions; condset; condset = condset->next) { + if (rc_condset_contains_memref(condset, memref)) + return 1; + } + + return 0; +} + +int rc_trigger_contains_memref(const rc_trigger_t* trigger, const rc_memref_t* memref) { + rc_condset_t* condset; + if (!trigger) + return 0; + + if (rc_condset_contains_memref(trigger->requirement, memref)) + return 1; + + for (condset = trigger->alternative; condset; condset = condset->next) { + if (rc_condset_contains_memref(condset, memref)) + return 1; + } + + return 0; +} + +static void rc_runtime_invalidate_memref(rc_runtime_t* self, rc_memref_t* memref) { + uint32_t i; + + /* disable any achievements dependent on the address */ + for (i = 0; i < self->trigger_count; ++i) { + if (!self->triggers[i].invalid_memref && rc_trigger_contains_memref(self->triggers[i].trigger, memref)) + self->triggers[i].invalid_memref = memref; + } + + /* disable any leaderboards dependent on the address */ + for (i = 0; i < self->lboard_count; ++i) { + if (!self->lboards[i].invalid_memref) { + rc_lboard_t* lboard = self->lboards[i].lboard; + if (lboard) { + if (rc_trigger_contains_memref(&lboard->start, memref)) { + lboard->start.state = RC_TRIGGER_STATE_DISABLED; + self->lboards[i].invalid_memref = memref; + } + + if (rc_trigger_contains_memref(&lboard->cancel, memref)) { + lboard->cancel.state = RC_TRIGGER_STATE_DISABLED; + self->lboards[i].invalid_memref = memref; + } + + if (rc_trigger_contains_memref(&lboard->submit, memref)) { + lboard->submit.state = RC_TRIGGER_STATE_DISABLED; + self->lboards[i].invalid_memref = memref; + } + + if (rc_value_contains_memref(&lboard->value, memref)) + self->lboards[i].invalid_memref = memref; + } + } + } +} + +void rc_runtime_invalidate_address(rc_runtime_t* self, uint32_t address) { + rc_memref_list_t* memref_list = &self->memrefs->memrefs; + do { + rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_stop = memref + memref_list->count; + + for (; memref < memref_stop; ++memref) { + if (memref->address == address) { + memref->value.type = RC_VALUE_TYPE_NONE; + rc_runtime_invalidate_memref(self, memref); + } + } + + memref_list = memref_list->next; + } while (memref_list); +} + +void rc_runtime_validate_addresses(rc_runtime_t* self, rc_runtime_event_handler_t event_handler, + rc_runtime_validate_address_t validate_handler) { + int num_invalid = 0; + rc_memref_list_t* memref_list = &self->memrefs->memrefs; + do { + rc_memref_t* memref = memref_list->items; + const rc_memref_t* memref_stop = memref + memref_list->count; + + for (; memref < memref_stop; ++memref) { + if (!validate_handler(memref->address)) { + memref->value.type = RC_VALUE_TYPE_NONE; + rc_runtime_invalidate_memref(self, memref); + + ++num_invalid; + } + } + + memref_list = memref_list->next; + } while (memref_list); + + if (num_invalid) { + rc_runtime_event_t runtime_event; + int i; + + for (i = self->trigger_count - 1; i >= 0; --i) { + rc_trigger_t* trigger = self->triggers[i].trigger; + if (trigger && self->triggers[i].invalid_memref) { + runtime_event.type = RC_RUNTIME_EVENT_ACHIEVEMENT_DISABLED; + runtime_event.id = self->triggers[i].id; + runtime_event.value = self->triggers[i].invalid_memref->address; + + trigger->state = RC_TRIGGER_STATE_DISABLED; + self->triggers[i].invalid_memref = NULL; + + event_handler(&runtime_event); + } + } + + for (i = self->lboard_count - 1; i >= 0; --i) { + rc_lboard_t* lboard = self->lboards[i].lboard; + if (lboard && self->lboards[i].invalid_memref) { + runtime_event.type = RC_RUNTIME_EVENT_LBOARD_DISABLED; + runtime_event.id = self->lboards[i].id; + runtime_event.value = self->lboards[i].invalid_memref->address; + + lboard->state = RC_LBOARD_STATE_DISABLED; + self->lboards[i].invalid_memref = NULL; + + event_handler(&runtime_event); + } + } + } +} diff --git a/src/rcheevos/src/rcheevos/runtime_progress.c b/src/rcheevos/src/rcheevos/runtime_progress.c new file mode 100644 index 0000000000..51f7e4b6f9 --- /dev/null +++ b/src/rcheevos/src/rcheevos/runtime_progress.c @@ -0,0 +1,1073 @@ +#include "rc_runtime.h" +#include "rc_internal.h" + +#include "rc_util.h" +#include "../rhash/md5.h" + +#include +#include +#include + +#define RC_RUNTIME_MARKER 0x0A504152 /* RAP\n */ + +#define RC_RUNTIME_CHUNK_MEMREFS 0x4645524D /* MREF */ +#define RC_RUNTIME_CHUNK_VARIABLES 0x53524156 /* VARS */ +#define RC_RUNTIME_CHUNK_ACHIEVEMENT 0x56484341 /* ACHV */ +#define RC_RUNTIME_CHUNK_LEADERBOARD 0x4452424C /* LBRD */ +#define RC_RUNTIME_CHUNK_RICHPRESENCE 0x48434952 /* RICH */ + +#define RC_RUNTIME_CHUNK_DONE 0x454E4F44 /* DONE */ + +#define RC_RUNTIME_MIN_BUFFER_SIZE 4 + 8 + 16 /* RUNTIME_MARKER, CHUNK_DONE, MD5 */ + +typedef struct rc_runtime_progress_t { + const rc_runtime_t* runtime; + + uint32_t offset; + uint8_t* buffer; + uint32_t buffer_size; + + uint32_t chunk_size_offset; +} rc_runtime_progress_t; + +#define assert_chunk_size(expected_size) assert((uint32_t)(progress->offset - progress->chunk_size_offset - 4) == (uint32_t)(expected_size)) + +#define RC_TRIGGER_STATE_UNUPDATED 0x7F + +#define RC_MEMREF_FLAG_CHANGED_THIS_FRAME 0x00010000 + +#define RC_VAR_FLAG_HAS_COND_DATA 0x01000000 + +#define RC_COND_FLAG_IS_TRUE_MASK 0x00000003 +#define RC_COND_FLAG_OPERAND1_IS_INDIRECT_MEMREF 0x00010000 +#define RC_COND_FLAG_OPERAND1_MEMREF_CHANGED_THIS_FRAME 0x00020000 +#define RC_COND_FLAG_OPERAND2_IS_INDIRECT_MEMREF 0x00100000 +#define RC_COND_FLAG_OPERAND2_MEMREF_CHANGED_THIS_FRAME 0x00200000 + +static void rc_runtime_progress_write_uint(rc_runtime_progress_t* progress, uint32_t value) +{ + if (progress->buffer) { + progress->buffer[progress->offset + 0] = value & 0xFF; value >>= 8; + progress->buffer[progress->offset + 1] = value & 0xFF; value >>= 8; + progress->buffer[progress->offset + 2] = value & 0xFF; value >>= 8; + progress->buffer[progress->offset + 3] = value & 0xFF; + } + + progress->offset += 4; +} + +static uint32_t rc_runtime_progress_read_uint(rc_runtime_progress_t* progress) +{ + uint32_t value = progress->buffer[progress->offset + 0] | + (progress->buffer[progress->offset + 1] << 8) | + (progress->buffer[progress->offset + 2] << 16) | + (progress->buffer[progress->offset + 3] << 24); + + progress->offset += 4; + return value; +} + +static void rc_runtime_progress_write_md5(rc_runtime_progress_t* progress, uint8_t* md5) +{ + if (progress->buffer) + memcpy(&progress->buffer[progress->offset], md5, 16); + + progress->offset += 16; +} + +static int rc_runtime_progress_match_md5(rc_runtime_progress_t* progress, uint8_t* md5) +{ + int result = 0; + if (progress->buffer) + result = (memcmp(&progress->buffer[progress->offset], md5, 16) == 0); + + progress->offset += 16; + + return result; +} + +static void rc_runtime_progress_start_chunk(rc_runtime_progress_t* progress, uint32_t chunk_id) +{ + rc_runtime_progress_write_uint(progress, chunk_id); + + progress->chunk_size_offset = progress->offset; + + progress->offset += 4; +} + +static void rc_runtime_progress_end_chunk(rc_runtime_progress_t* progress) +{ + uint32_t length; + uint32_t offset; + + progress->offset = (progress->offset + 3) & ~0x03; /* align to 4 byte boundary */ + + if (progress->buffer) { + /* ignore chunk size field when calculating chunk size */ + length = (uint32_t)(progress->offset - progress->chunk_size_offset - 4); + + /* temporarily update the write pointer to write the chunk size field */ + offset = progress->offset; + progress->offset = progress->chunk_size_offset; + rc_runtime_progress_write_uint(progress, length); + progress->offset = offset; + } +} + +static void rc_runtime_progress_init(rc_runtime_progress_t* progress, const rc_runtime_t* runtime) +{ + memset(progress, 0, sizeof(rc_runtime_progress_t)); + progress->runtime = runtime; +} + +#define RC_RUNTIME_SERIALIZED_MEMREF_SIZE 16 /* 4x uint: address, flags, value, prior */ + +static int rc_runtime_progress_write_memrefs(rc_runtime_progress_t* progress) +{ + uint32_t count = rc_memrefs_count_memrefs(progress->runtime->memrefs); + if (count == 0) + return RC_OK; + + if (progress->offset + 8 + count * RC_RUNTIME_SERIALIZED_MEMREF_SIZE > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_start_chunk(progress, RC_RUNTIME_CHUNK_MEMREFS); + + if (!progress->buffer) { + progress->offset += count * RC_RUNTIME_SERIALIZED_MEMREF_SIZE; + } + else { + uint32_t flags = 0; + const rc_memref_list_t* memref_list = &progress->runtime->memrefs->memrefs; + const rc_memref_t* memref; + + for (; memref_list; memref_list = memref_list->next) { + const rc_memref_t* memref_end; + + memref = memref_list->items; + memref_end = memref + memref_list->count; + for (; memref < memref_end; ++memref) { + flags = memref->value.size; + if (memref->value.changed) + flags |= RC_MEMREF_FLAG_CHANGED_THIS_FRAME; + + rc_runtime_progress_write_uint(progress, memref->address); + rc_runtime_progress_write_uint(progress, flags); + rc_runtime_progress_write_uint(progress, memref->value.value); + rc_runtime_progress_write_uint(progress, memref->value.prior); + } + } + } + + assert_chunk_size(count * RC_RUNTIME_SERIALIZED_MEMREF_SIZE); + rc_runtime_progress_end_chunk(progress); + return RC_OK; +} + +static void rc_runtime_progress_update_modified_memrefs(rc_runtime_progress_t* progress) +{ + rc_typed_value_t value, prior_value, modifier, prior_modifier; + rc_modified_memref_list_t* modified_memref_list; + rc_modified_memref_t* modified_memref; + rc_operand_t prior_parent_operand, prior_modifier_operand; + rc_memref_t prior_parent_memref, prior_modifier_memref; + + modified_memref_list = &progress->runtime->memrefs->modified_memrefs; + for (; modified_memref_list; modified_memref_list = modified_memref_list->next) { + const rc_modified_memref_t* modified_memref_end; + modified_memref = modified_memref_list->items; + modified_memref_end = modified_memref + modified_memref_list->count; + for (; modified_memref < modified_memref_end; ++modified_memref) { + modified_memref->memref.value.changed = 0; + + /* indirect memref values are stored in conditions */ + if (modified_memref->modifier_type == RC_OPERATOR_INDIRECT_READ) + continue; + + /* non-indirect memref values can be reconstructed from the parents */ + memcpy(&prior_parent_operand, &modified_memref->parent, sizeof(prior_parent_operand)); + if (rc_operand_is_memref(&prior_parent_operand)) { + memcpy(&prior_parent_memref, modified_memref->parent.value.memref, sizeof(prior_parent_memref)); + prior_parent_memref.value.value = prior_parent_memref.value.prior; + modified_memref->memref.value.changed |= prior_parent_memref.value.changed; + prior_parent_operand.value.memref = &prior_parent_memref; + } + + memcpy(&prior_modifier_operand, &modified_memref->modifier, sizeof(prior_modifier_operand)); + if (rc_operand_is_memref(&prior_modifier_operand)) { + memcpy(&prior_modifier_memref, modified_memref->modifier.value.memref, sizeof(prior_modifier_memref)); + prior_modifier_memref.value.value = prior_modifier_memref.value.prior; + modified_memref->memref.value.changed |= prior_modifier_memref.value.changed; + prior_modifier_operand.value.memref = &prior_modifier_memref; + } + + rc_evaluate_operand(&value, &modified_memref->parent, NULL); + rc_evaluate_operand(&modifier, &modified_memref->modifier, NULL); + rc_evaluate_operand(&prior_value, &prior_parent_operand, NULL); + rc_evaluate_operand(&prior_modifier, &prior_modifier_operand, NULL); + + if (modified_memref->modifier_type == RC_OPERATOR_SUB_PARENT) { + rc_typed_value_negate(&value); + rc_typed_value_add(&value, &modifier); + + rc_typed_value_negate(&prior_value); + rc_typed_value_add(&prior_value, &prior_modifier); + } + else { + rc_typed_value_combine(&value, &modifier, modified_memref->modifier_type); + rc_typed_value_combine(&prior_value, &prior_modifier, modified_memref->modifier_type); + } + + rc_typed_value_convert(&value, modified_memref->memref.value.type); + modified_memref->memref.value.value = value.value.u32; + + rc_typed_value_convert(&prior_value, modified_memref->memref.value.type); + modified_memref->memref.value.prior = prior_value.value.u32; + } + } +} + +static int rc_runtime_progress_read_memrefs(rc_runtime_progress_t* progress) +{ + uint32_t entries; + uint32_t address, flags, value, prior; + uint8_t size; + rc_memref_list_t* unmatched_memref_list = &progress->runtime->memrefs->memrefs; + rc_memref_t* first_unmatched_memref = unmatched_memref_list->items; + rc_memref_t* memref; + + /* re-read the chunk size to determine how many memrefs are present */ + progress->offset -= 4; + entries = rc_runtime_progress_read_uint(progress) / RC_RUNTIME_SERIALIZED_MEMREF_SIZE; + + while (entries != 0) { + address = rc_runtime_progress_read_uint(progress); + flags = rc_runtime_progress_read_uint(progress); + value = rc_runtime_progress_read_uint(progress); + prior = rc_runtime_progress_read_uint(progress); + + size = flags & 0xFF; + + memref = first_unmatched_memref; + if (memref->address == address && memref->value.size == size) { + memref->value.value = value; + memref->value.changed = (flags & RC_MEMREF_FLAG_CHANGED_THIS_FRAME) ? 1 : 0; + memref->value.prior = prior; + + first_unmatched_memref++; + if (first_unmatched_memref >= unmatched_memref_list->items + unmatched_memref_list->count) { + unmatched_memref_list = unmatched_memref_list->next; + if (!unmatched_memref_list) + break; + first_unmatched_memref = unmatched_memref_list->items; + } + } + else { + rc_memref_list_t* memref_list = unmatched_memref_list; + do { + ++memref; + if (memref >= memref_list->items + memref_list->count) { + memref_list = memref_list->next; + if (!memref_list) + break; + + memref = memref_list->items; + } + + if (memref->address == address && memref->value.size == size) { + memref->value.value = value; + memref->value.changed = (flags & RC_MEMREF_FLAG_CHANGED_THIS_FRAME) ? 1 : 0; + memref->value.prior = prior; + break; + } + + } while (1); + } + + --entries; + } + + rc_runtime_progress_update_modified_memrefs(progress); + + return RC_OK; +} + +static int rc_runtime_progress_is_indirect_memref(rc_operand_t* oper) +{ + switch (oper->type) + { + case RC_OPERAND_CONST: + case RC_OPERAND_FP: + case RC_OPERAND_RECALL: + case RC_OPERAND_FUNC: + return 0; + + default: + if (oper->value.memref->value.memref_type != RC_MEMREF_TYPE_MODIFIED_MEMREF) + return 0; + + return ((const rc_modified_memref_t*)oper->value.memref)->modifier_type == RC_OPERATOR_INDIRECT_READ; + } +} + +static int rc_runtime_progress_write_condset(rc_runtime_progress_t* progress, rc_condset_t* condset) +{ + rc_condition_t* cond; + uint32_t flags; + + if (progress->offset + 4 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, condset->is_paused); + + cond = condset->conditions; + while (cond) { + flags = (cond->is_true & RC_COND_FLAG_IS_TRUE_MASK); + + if (rc_runtime_progress_is_indirect_memref(&cond->operand1)) { + flags |= RC_COND_FLAG_OPERAND1_IS_INDIRECT_MEMREF; + if (cond->operand1.value.memref->value.changed) + flags |= RC_COND_FLAG_OPERAND1_MEMREF_CHANGED_THIS_FRAME; + } + + if (rc_runtime_progress_is_indirect_memref(&cond->operand2)) { + flags |= RC_COND_FLAG_OPERAND2_IS_INDIRECT_MEMREF; + if (cond->operand2.value.memref->value.changed) + flags |= RC_COND_FLAG_OPERAND2_MEMREF_CHANGED_THIS_FRAME; + } + + if (progress->offset + 8 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, cond->current_hits); + rc_runtime_progress_write_uint(progress, flags); + + if (flags & RC_COND_FLAG_OPERAND1_IS_INDIRECT_MEMREF) { + if (progress->offset + 8 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, cond->operand1.value.memref->value.value); + rc_runtime_progress_write_uint(progress, cond->operand1.value.memref->value.prior); + } + + if (flags & RC_COND_FLAG_OPERAND2_IS_INDIRECT_MEMREF) { + if (progress->offset + 8 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, cond->operand2.value.memref->value.value); + rc_runtime_progress_write_uint(progress, cond->operand2.value.memref->value.prior); + } + + cond = cond->next; + } + + return RC_OK; +} + +static int rc_runtime_progress_read_condset(rc_runtime_progress_t* progress, rc_condset_t* condset) +{ + rc_condition_t* cond; + uint32_t flags; + + condset->is_paused = (char)rc_runtime_progress_read_uint(progress); + + cond = condset->conditions; + while (cond) { + cond->current_hits = rc_runtime_progress_read_uint(progress); + flags = rc_runtime_progress_read_uint(progress); + + cond->is_true = (flags & RC_COND_FLAG_IS_TRUE_MASK); + + if (flags & RC_COND_FLAG_OPERAND1_IS_INDIRECT_MEMREF) { + if (!rc_operand_is_memref(&cond->operand1)) /* this should never happen, but better safe than sorry */ + return RC_INVALID_STATE; + + cond->operand1.value.memref->value.value = rc_runtime_progress_read_uint(progress); + cond->operand1.value.memref->value.prior = rc_runtime_progress_read_uint(progress); + cond->operand1.value.memref->value.changed = (flags & RC_COND_FLAG_OPERAND1_MEMREF_CHANGED_THIS_FRAME) ? 1 : 0; + } + + if (flags & RC_COND_FLAG_OPERAND2_IS_INDIRECT_MEMREF) { + if (!rc_operand_is_memref(&cond->operand2)) /* this should never happen, but better safe than sorry */ + return RC_INVALID_STATE; + + cond->operand2.value.memref->value.value = rc_runtime_progress_read_uint(progress); + cond->operand2.value.memref->value.prior = rc_runtime_progress_read_uint(progress); + cond->operand2.value.memref->value.changed = (flags & RC_COND_FLAG_OPERAND2_MEMREF_CHANGED_THIS_FRAME) ? 1 : 0; + } + + cond = cond->next; + } + + return RC_OK; +} + +static uint32_t rc_runtime_progress_should_serialize_variable_condset(const rc_condset_t* conditions) +{ + const rc_condition_t* condition; + + /* predetermined presence of pause flag - must serialize */ + if (conditions->has_pause) + return RC_VAR_FLAG_HAS_COND_DATA; + + /* if any conditions has required hits, must serialize */ + /* ASSERT: Measured with comparison and no explicit target will set hit target to 0xFFFFFFFF */ + for (condition = conditions->conditions; condition; condition = condition->next) { + if (condition->required_hits > 0) + return RC_VAR_FLAG_HAS_COND_DATA; + } + + /* can safely be reset without affecting behavior */ + return 0; +} + +static int rc_runtime_progress_write_variable(rc_runtime_progress_t* progress, const rc_value_t* variable) +{ + uint32_t flags; + + if (progress->offset + 12 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + flags = rc_runtime_progress_should_serialize_variable_condset(variable->conditions); + if (variable->value.changed) + flags |= RC_MEMREF_FLAG_CHANGED_THIS_FRAME; + + rc_runtime_progress_write_uint(progress, flags); + rc_runtime_progress_write_uint(progress, variable->value.value); + rc_runtime_progress_write_uint(progress, variable->value.prior); + + if (flags & RC_VAR_FLAG_HAS_COND_DATA) { + int result = rc_runtime_progress_write_condset(progress, variable->conditions); + if (result != RC_OK) + return result; + } + + return RC_OK; +} + +static int rc_runtime_progress_write_variables(rc_runtime_progress_t* progress) +{ + uint32_t count; + const rc_value_t* value; + int result; + + if (!progress->runtime->richpresence || !progress->runtime->richpresence->richpresence) + return RC_OK; + + value = progress->runtime->richpresence->richpresence->values; + count = rc_count_values(value); + if (count == 0) + return RC_OK; + + /* header + count + count(djb2,flags,value,prior,?cond) */ + if (progress->offset + 8 + 4 + count * 16 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_start_chunk(progress, RC_RUNTIME_CHUNK_VARIABLES); + rc_runtime_progress_write_uint(progress, count); + + for (; value; value = value->next) { + const uint32_t djb2 = rc_djb2(value->name); + if (progress->offset + 16 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, djb2); + + result = rc_runtime_progress_write_variable(progress, value); + if (result != RC_OK) + return result; + } + + rc_runtime_progress_end_chunk(progress); + return RC_OK; +} + +static int rc_runtime_progress_read_variable(rc_runtime_progress_t* progress, rc_value_t* variable) +{ + uint32_t flags = rc_runtime_progress_read_uint(progress); + variable->value.changed = (flags & RC_MEMREF_FLAG_CHANGED_THIS_FRAME) ? 1 : 0; + variable->value.value = rc_runtime_progress_read_uint(progress); + variable->value.prior = rc_runtime_progress_read_uint(progress); + + if (flags & RC_VAR_FLAG_HAS_COND_DATA) { + int result = rc_runtime_progress_read_condset(progress, variable->conditions); + if (result != RC_OK) + return result; + } + else { + rc_reset_condset(variable->conditions); + } + + return RC_OK; +} + +static int rc_runtime_progress_read_variables(rc_runtime_progress_t* progress) +{ + struct rc_pending_value_t + { + rc_value_t* variable; + uint32_t djb2; + }; + struct rc_pending_value_t local_pending_variables[32]; + struct rc_pending_value_t* pending_variables; + rc_value_t* value; + uint32_t count, serialized_count; + int result; + int32_t i; + + serialized_count = rc_runtime_progress_read_uint(progress); + if (serialized_count == 0) + return RC_OK; + + if (!progress->runtime->richpresence || !progress->runtime->richpresence->richpresence) + return RC_OK; + + value = progress->runtime->richpresence->richpresence->values; + count = rc_count_values(value); + if (count == 0) + return RC_OK; + + if (count <= sizeof(local_pending_variables) / sizeof(local_pending_variables[0])) { + pending_variables = local_pending_variables; + } + else { + pending_variables = (struct rc_pending_value_t*)malloc(count * sizeof(struct rc_pending_value_t)); + if (pending_variables == NULL) + return RC_OUT_OF_MEMORY; + } + + i = (int32_t)count; + for (; value; value = value->next) { + --i; + pending_variables[i].variable = value; + pending_variables[i].djb2 = rc_djb2(value->name); + } + + result = RC_OK; + for (; serialized_count > 0 && result == RC_OK; --serialized_count) { + uint32_t djb2 = rc_runtime_progress_read_uint(progress); + for (i = (int32_t)count - 1; i >= 0; --i) { + if (pending_variables[i].djb2 == djb2) { + value = pending_variables[i].variable; + result = rc_runtime_progress_read_variable(progress, value); + if (result == RC_OK) { + if (i < (int32_t)count - 1) + memcpy(&pending_variables[i], &pending_variables[count - 1], sizeof(struct rc_pending_value_t)); + count--; + } + break; + } + } + } + + /* VS raises a C6385 warning here because it thinks count can exceed the size of the local_pending_variables array. + * When count is larger, pending_variables points to allocated memory, so the warning is wrong. */ +#if defined (_MSC_VER) + #pragma warning(push) + #pragma warning(disable:6385) +#endif + while (count > 0) + rc_reset_value(pending_variables[--count].variable); +#if defined (_MSC_VER) + #pragma warning(pop) +#endif + + if (pending_variables != local_pending_variables) + free(pending_variables); + + return result; +} + +static int rc_runtime_progress_write_trigger(rc_runtime_progress_t* progress, const rc_trigger_t* trigger) +{ + rc_condset_t* condset; + int result; + + rc_runtime_progress_write_uint(progress, trigger->state); + rc_runtime_progress_write_uint(progress, trigger->measured_value); + + if (trigger->requirement) { + result = rc_runtime_progress_write_condset(progress, trigger->requirement); + if (result != RC_OK) + return result; + } + + condset = trigger->alternative; + while (condset) { + result = rc_runtime_progress_write_condset(progress, condset); + if (result != RC_OK) + return result; + + condset = condset->next; + } + + return RC_OK; +} + +static int rc_runtime_progress_read_trigger(rc_runtime_progress_t* progress, rc_trigger_t* trigger) +{ + rc_condset_t* condset; + int result; + + trigger->state = (char)rc_runtime_progress_read_uint(progress); + trigger->measured_value = rc_runtime_progress_read_uint(progress); + + if (trigger->requirement) { + result = rc_runtime_progress_read_condset(progress, trigger->requirement); + if (result != RC_OK) + return result; + } + + condset = trigger->alternative; + while (condset) { + result = rc_runtime_progress_read_condset(progress, condset); + if (result != RC_OK) + return result; + + condset = condset->next; + } + + return RC_OK; +} + +static int rc_runtime_progress_write_achievements(rc_runtime_progress_t* progress) +{ + uint32_t i; + int initial_offset = 0; + int result; + + for (i = 0; i < progress->runtime->trigger_count; ++i) { + rc_runtime_trigger_t* runtime_trigger = &progress->runtime->triggers[i]; + if (!runtime_trigger->trigger) + continue; + + /* don't store state for inactive or triggered achievements */ + if (!rc_trigger_state_active(runtime_trigger->trigger->state)) + continue; + + if (!progress->buffer) { + if (runtime_trigger->serialized_size) { + progress->offset += runtime_trigger->serialized_size; + continue; + } + + initial_offset = progress->offset; + } else { + if (progress->offset + runtime_trigger->serialized_size > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + } + + rc_runtime_progress_start_chunk(progress, RC_RUNTIME_CHUNK_ACHIEVEMENT); + rc_runtime_progress_write_uint(progress, runtime_trigger->id); + rc_runtime_progress_write_md5(progress, runtime_trigger->md5); + + result = rc_runtime_progress_write_trigger(progress, runtime_trigger->trigger); + if (result != RC_OK) + return result; + + if (runtime_trigger->serialized_size) { + /* runtime_trigger->serialized_size includes the header */ + assert_chunk_size(runtime_trigger->serialized_size - 8); + } + + rc_runtime_progress_end_chunk(progress); + + if (!progress->buffer) + runtime_trigger->serialized_size = progress->offset - initial_offset; + } + + return RC_OK; +} + +static int rc_runtime_progress_read_achievement(rc_runtime_progress_t* progress) +{ + uint32_t id = rc_runtime_progress_read_uint(progress); + uint32_t i; + + for (i = 0; i < progress->runtime->trigger_count; ++i) { + rc_runtime_trigger_t* runtime_trigger = &progress->runtime->triggers[i]; + if (runtime_trigger->id == id && runtime_trigger->trigger != NULL) { + /* ignore triggered and waiting achievements */ + if (runtime_trigger->trigger->state == RC_TRIGGER_STATE_UNUPDATED) { + /* only update state if definition hasn't changed (md5 matches) */ + if (rc_runtime_progress_match_md5(progress, runtime_trigger->md5)) + return rc_runtime_progress_read_trigger(progress, runtime_trigger->trigger); + break; + } + } + } + + return RC_OK; +} + +static int rc_runtime_progress_write_leaderboards(rc_runtime_progress_t* progress) +{ + uint32_t i; + uint32_t flags; + int initial_offset = 0; + int result; + + for (i = 0; i < progress->runtime->lboard_count; ++i) { + rc_runtime_lboard_t* runtime_lboard = &progress->runtime->lboards[i]; + if (!runtime_lboard->lboard) + continue; + + /* don't store state for inactive leaderboards */ + if (!rc_lboard_state_active(runtime_lboard->lboard->state)) + continue; + + if (!progress->buffer) { + if (runtime_lboard->serialized_size) { + progress->offset += runtime_lboard->serialized_size; + continue; + } + + initial_offset = progress->offset; + } else { + if (progress->offset + runtime_lboard->serialized_size > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + } + + rc_runtime_progress_start_chunk(progress, RC_RUNTIME_CHUNK_LEADERBOARD); + rc_runtime_progress_write_uint(progress, runtime_lboard->id); + rc_runtime_progress_write_md5(progress, runtime_lboard->md5); + + flags = runtime_lboard->lboard->state; + rc_runtime_progress_write_uint(progress, flags); + + result = rc_runtime_progress_write_trigger(progress, &runtime_lboard->lboard->start); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_write_trigger(progress, &runtime_lboard->lboard->submit); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_write_trigger(progress, &runtime_lboard->lboard->cancel); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_write_variable(progress, &runtime_lboard->lboard->value); + if (result != RC_OK) + return result; + + if (runtime_lboard->serialized_size) { + /* runtime_lboard->serialized_size includes the header */ + assert_chunk_size(runtime_lboard->serialized_size - 8); + } + + rc_runtime_progress_end_chunk(progress); + + if (!progress->buffer) + runtime_lboard->serialized_size = progress->offset - initial_offset; + } + + return RC_OK; +} + +static int rc_runtime_progress_read_leaderboard(rc_runtime_progress_t* progress) +{ + uint32_t id = rc_runtime_progress_read_uint(progress); + uint32_t i; + int result; + + for (i = 0; i < progress->runtime->lboard_count; ++i) { + rc_runtime_lboard_t* runtime_lboard = &progress->runtime->lboards[i]; + if (runtime_lboard->id == id && runtime_lboard->lboard != NULL) { + /* ignore triggered and waiting achievements */ + if (runtime_lboard->lboard->state == RC_TRIGGER_STATE_UNUPDATED) { + /* only update state if definition hasn't changed (md5 matches) */ + if (rc_runtime_progress_match_md5(progress, runtime_lboard->md5)) { + uint32_t flags = rc_runtime_progress_read_uint(progress); + + result = rc_runtime_progress_read_trigger(progress, &runtime_lboard->lboard->start); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_read_trigger(progress, &runtime_lboard->lboard->submit); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_read_trigger(progress, &runtime_lboard->lboard->cancel); + if (result != RC_OK) + return result; + + result = rc_runtime_progress_read_variable(progress, &runtime_lboard->lboard->value); + if (result != RC_OK) + return result; + + runtime_lboard->lboard->state = (char)(flags & 0x7F); + } + break; + } + } + } + + return RC_OK; +} + +static int rc_runtime_progress_write_rich_presence(rc_runtime_progress_t* progress) +{ + const rc_richpresence_display_t* display; + int result; + + if (!progress->runtime->richpresence || !progress->runtime->richpresence->richpresence) + return RC_OK; + + /* if there are no conditional display strings, there's nothing to capture */ + display = progress->runtime->richpresence->richpresence->first_display; + if (!display->next) + return RC_OK; + + if (progress->offset + 8 + 16 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_start_chunk(progress, RC_RUNTIME_CHUNK_RICHPRESENCE); + rc_runtime_progress_write_md5(progress, progress->runtime->richpresence->md5); + + for (; display->next; display = display->next) { + result = rc_runtime_progress_write_trigger(progress, &display->trigger); + if (result != RC_OK) + return result; + } + + rc_runtime_progress_end_chunk(progress); + return RC_OK; +} + +static int rc_runtime_progress_read_rich_presence(rc_runtime_progress_t* progress) +{ + rc_richpresence_display_t* display; + int result; + + if (!progress->runtime->richpresence || !progress->runtime->richpresence->richpresence) + return RC_OK; + + if (!rc_runtime_progress_match_md5(progress, progress->runtime->richpresence->md5)) { + rc_reset_richpresence_triggers(progress->runtime->richpresence->richpresence); + return RC_OK; + } + + display = progress->runtime->richpresence->richpresence->first_display; + for (; display->next; display = display->next) { + result = rc_runtime_progress_read_trigger(progress, &display->trigger); + if (result != RC_OK) + return result; + } + + return RC_OK; +} + +static int rc_runtime_progress_serialize_internal(rc_runtime_progress_t* progress) +{ + md5_state_t state; + uint8_t md5[16]; + int result; + + if (progress->buffer_size < RC_RUNTIME_MIN_BUFFER_SIZE) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, RC_RUNTIME_MARKER); + + if ((result = rc_runtime_progress_write_memrefs(progress)) != RC_OK) + return result; + + if ((result = rc_runtime_progress_write_variables(progress)) != RC_OK) + return result; + + if ((result = rc_runtime_progress_write_achievements(progress)) != RC_OK) + return result; + + if ((result = rc_runtime_progress_write_leaderboards(progress)) != RC_OK) + return result; + + if ((result = rc_runtime_progress_write_rich_presence(progress)) != RC_OK) + return result; + + if (progress->offset + 8 + 16 > progress->buffer_size) + return RC_INSUFFICIENT_BUFFER; + + rc_runtime_progress_write_uint(progress, RC_RUNTIME_CHUNK_DONE); + rc_runtime_progress_write_uint(progress, 16); + + if (progress->buffer) { + md5_init(&state); + md5_append(&state, progress->buffer, progress->offset); + md5_finish(&state, md5); + } + + rc_runtime_progress_write_md5(progress, md5); + + return RC_OK; +} + +uint32_t rc_runtime_progress_size(const rc_runtime_t* runtime, void* unused_L) +{ + rc_runtime_progress_t progress; + int result; + + (void)unused_L; + + rc_runtime_progress_init(&progress, runtime); + progress.buffer_size = 0xFFFFFFFF; + + result = rc_runtime_progress_serialize_internal(&progress); + if (result != RC_OK) + return result; + + return progress.offset; +} + +int rc_runtime_serialize_progress(void* buffer, const rc_runtime_t* runtime, void* unused_L) +{ + return rc_runtime_serialize_progress_sized((uint8_t*)buffer, 0xFFFFFFFF, runtime, unused_L); +} + +int rc_runtime_serialize_progress_sized(uint8_t* buffer, uint32_t buffer_size, const rc_runtime_t* runtime, void* unused_L) +{ + rc_runtime_progress_t progress; + + (void)unused_L; + + if (!buffer) + return RC_INVALID_STATE; + + rc_runtime_progress_init(&progress, runtime); + progress.buffer = (uint8_t*)buffer; + progress.buffer_size = buffer_size; + + return rc_runtime_progress_serialize_internal(&progress); +} + +int rc_runtime_deserialize_progress(rc_runtime_t* runtime, const uint8_t* serialized, void* unused_L) +{ + return rc_runtime_deserialize_progress_sized(runtime, serialized, 0xFFFFFFFF, unused_L); +} + +int rc_runtime_deserialize_progress_sized(rc_runtime_t* runtime, const uint8_t* serialized, uint32_t serialized_size, void* unused_L) +{ + rc_runtime_progress_t progress; + md5_state_t state; + uint8_t md5[16]; + uint32_t chunk_id; + uint32_t chunk_size; + uint32_t next_chunk_offset; + uint32_t i; + int seen_rich_presence = 0; + int result = RC_OK; + + (void)unused_L; + + if (!serialized || serialized_size < RC_RUNTIME_MIN_BUFFER_SIZE) { + rc_runtime_reset(runtime); + return RC_INSUFFICIENT_BUFFER; + } + + rc_runtime_progress_init(&progress, runtime); + progress.buffer = (uint8_t*)serialized; + + if (rc_runtime_progress_read_uint(&progress) != RC_RUNTIME_MARKER) { + rc_runtime_reset(runtime); + return RC_INVALID_STATE; + } + + for (i = 0; i < runtime->trigger_count; ++i) { + rc_runtime_trigger_t* runtime_trigger = &runtime->triggers[i]; + if (runtime_trigger->trigger) { + /* don't update state for inactive or triggered achievements */ + if (rc_trigger_state_active(runtime_trigger->trigger->state)) { + /* mark active achievements as unupdated. anything that's still unupdated + * after deserializing the progress will be reset to waiting */ + runtime_trigger->trigger->state = RC_TRIGGER_STATE_UNUPDATED; + } + } + } + + for (i = 0; i < runtime->lboard_count; ++i) { + rc_runtime_lboard_t* runtime_lboard = &runtime->lboards[i]; + if (runtime_lboard->lboard) { + /* don't update state for inactive or triggered achievements */ + if (rc_lboard_state_active(runtime_lboard->lboard->state)) { + /* mark active achievements as unupdated. anything that's still unupdated + * after deserializing the progress will be reset to waiting */ + runtime_lboard->lboard->state = RC_TRIGGER_STATE_UNUPDATED; + } + } + } + + do { + if (progress.offset + 8 >= serialized_size) { + result = RC_INSUFFICIENT_BUFFER; + break; + } + + chunk_id = rc_runtime_progress_read_uint(&progress); + chunk_size = rc_runtime_progress_read_uint(&progress); + next_chunk_offset = progress.offset + chunk_size; + + if (next_chunk_offset > serialized_size) { + result = RC_INSUFFICIENT_BUFFER; + break; + } + + switch (chunk_id) { + case RC_RUNTIME_CHUNK_MEMREFS: + result = rc_runtime_progress_read_memrefs(&progress); + break; + + case RC_RUNTIME_CHUNK_VARIABLES: + result = rc_runtime_progress_read_variables(&progress); + break; + + case RC_RUNTIME_CHUNK_ACHIEVEMENT: + result = rc_runtime_progress_read_achievement(&progress); + break; + + case RC_RUNTIME_CHUNK_LEADERBOARD: + result = rc_runtime_progress_read_leaderboard(&progress); + break; + + case RC_RUNTIME_CHUNK_RICHPRESENCE: + seen_rich_presence = 1; + result = rc_runtime_progress_read_rich_presence(&progress); + break; + + case RC_RUNTIME_CHUNK_DONE: + md5_init(&state); + md5_append(&state, progress.buffer, progress.offset); + md5_finish(&state, md5); + if (!rc_runtime_progress_match_md5(&progress, md5)) + result = RC_INVALID_STATE; + break; + + default: + if (chunk_size & 0xFFFF0000) + result = RC_INVALID_STATE; /* assume unknown chunk > 64KB is invalid */ + break; + } + + progress.offset = next_chunk_offset; + } while (result == RC_OK && chunk_id != RC_RUNTIME_CHUNK_DONE); + + if (result != RC_OK) { + rc_runtime_reset(runtime); + } + else { + for (i = 0; i < runtime->trigger_count; ++i) { + rc_trigger_t* trigger = runtime->triggers[i].trigger; + if (trigger && trigger->state == RC_TRIGGER_STATE_UNUPDATED) + rc_reset_trigger(trigger); + } + + for (i = 0; i < runtime->lboard_count; ++i) { + rc_lboard_t* lboard = runtime->lboards[i].lboard; + if (lboard && lboard->state == RC_TRIGGER_STATE_UNUPDATED) + rc_reset_lboard(lboard); + } + + if (!seen_rich_presence && runtime->richpresence && runtime->richpresence->richpresence) + rc_reset_richpresence_triggers(runtime->richpresence->richpresence); + } + + return result; +} diff --git a/src/rcheevos/src/rcheevos/trigger.c b/src/rcheevos/src/rcheevos/trigger.c new file mode 100644 index 0000000000..063a14f5c9 --- /dev/null +++ b/src/rcheevos/src/rcheevos/trigger.c @@ -0,0 +1,344 @@ +#include "rc_internal.h" + +#include +#include /* memset */ + +void rc_parse_trigger_internal(rc_trigger_t* self, const char** memaddr, rc_parse_state_t* parse) { + rc_condset_t** next; + const char* aux; + + aux = *memaddr; + next = &self->alternative; + + /* reset in case multiple triggers are parsed by the same parse_state */ + parse->measured_target = 0; + parse->has_required_hits = 0; + parse->measured_as_percent = 0; + + if (*aux == 's' || *aux == 'S') { + self->requirement = NULL; + } + else { + self->requirement = rc_parse_condset(&aux, parse); + + if (parse->offset < 0) + return; + + self->requirement->next = NULL; + } + + while (*aux == 's' || *aux == 'S') { + aux++; + *next = rc_parse_condset(&aux, parse); + + if (parse->offset < 0) { + return; + } + + next = &(*next)->next; + } + + *next = NULL; + *memaddr = aux; + + self->measured_target = parse->measured_target; + self->measured_value = parse->measured_target ? RC_MEASURED_UNKNOWN : 0; + self->measured_as_percent = parse->measured_as_percent; + self->state = RC_TRIGGER_STATE_WAITING; + self->has_hits = 0; + self->has_memrefs = 0; +} + +int rc_trigger_size(const char* memaddr) { + rc_trigger_with_memrefs_t* trigger; + rc_preparse_state_t preparse; + rc_init_preparse_state(&preparse); + + trigger = RC_ALLOC(rc_trigger_with_memrefs_t, &preparse.parse); + rc_parse_trigger_internal(&trigger->trigger, &memaddr, &preparse.parse); + rc_preparse_alloc_memrefs(NULL, &preparse); + + rc_destroy_preparse_state(&preparse); + return preparse.parse.offset; +} + +rc_trigger_t* rc_parse_trigger(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx) { + rc_trigger_with_memrefs_t* trigger; + rc_preparse_state_t preparse; + const char* preparse_memaddr = memaddr; + + (void)unused_L; + (void)unused_funcs_idx; + + if (!buffer || !memaddr) + return NULL; + + /* first pass : determine how many memrefs are needed */ + rc_init_preparse_state(&preparse); + trigger = RC_ALLOC(rc_trigger_with_memrefs_t, &preparse.parse); + rc_parse_trigger_internal(&trigger->trigger, &preparse_memaddr, &preparse.parse); + + /* allocate the trigger and memrefs */ + rc_reset_parse_state(&preparse.parse, buffer); + trigger = RC_ALLOC(rc_trigger_with_memrefs_t, &preparse.parse); + rc_preparse_alloc_memrefs(&trigger->memrefs, &preparse); + + /* parse the trigger */ + rc_parse_trigger_internal(&trigger->trigger, &memaddr, &preparse.parse); + trigger->trigger.has_memrefs = 1; + + rc_destroy_preparse_state(&preparse); + return (preparse.parse.offset >= 0) ? &trigger->trigger : NULL; +} + +int rc_trigger_state_active(int state) +{ + switch (state) + { + case RC_TRIGGER_STATE_DISABLED: + case RC_TRIGGER_STATE_INACTIVE: + case RC_TRIGGER_STATE_TRIGGERED: + return 0; + + default: + return 1; + } +} + +static int rc_condset_is_measured_from_hitcount(const rc_condset_t* condset, uint32_t measured_value) +{ + const rc_condition_t* condition; + for (condition = condset->conditions; condition; condition = condition->next) { + if (condition->type == RC_CONDITION_MEASURED && condition->required_hits && + condition->current_hits == measured_value) { + return 1; + } + } + + return 0; +} + +static void rc_reset_trigger_hitcounts(rc_trigger_t* self) { + rc_condset_t* condset; + + if (self->requirement) { + rc_reset_condset(self->requirement); + } + + condset = self->alternative; + + while (condset) { + rc_reset_condset(condset); + condset = condset->next; + } +} + +static void rc_update_trigger_memrefs(rc_trigger_t* self, rc_peek_t peek, void* ud) { + if (self->has_memrefs) { + rc_trigger_with_memrefs_t* trigger = (rc_trigger_with_memrefs_t*)self; + rc_update_memref_values(&trigger->memrefs, peek, ud); + } +} + +rc_memrefs_t* rc_trigger_get_memrefs(rc_trigger_t* self) { + if (self->has_memrefs) { + rc_trigger_with_memrefs_t* trigger = (rc_trigger_with_memrefs_t*)self; + return &trigger->memrefs; + } + + return NULL; +} + +int rc_evaluate_trigger(rc_trigger_t* self, rc_peek_t peek, void* ud, void* unused_L) { + rc_eval_state_t eval_state; + rc_condset_t* condset; + rc_typed_value_t measured_value; + int measured_from_hits = 0; + int ret; + char is_paused; + char is_primed; + + (void)unused_L; + + switch (self->state) + { + case RC_TRIGGER_STATE_TRIGGERED: + /* previously triggered. do nothing - return INACTIVE so caller doesn't think it triggered again */ + return RC_TRIGGER_STATE_INACTIVE; + + case RC_TRIGGER_STATE_DISABLED: + /* unsupported. do nothing - return INACTIVE */ + return RC_TRIGGER_STATE_INACTIVE; + + case RC_TRIGGER_STATE_INACTIVE: + /* not yet active. update the memrefs so deltas are correct when it becomes active, then return INACTIVE */ + rc_update_trigger_memrefs(self, peek, ud); + return RC_TRIGGER_STATE_INACTIVE; + + default: + break; + } + + /* update the memory references */ + rc_update_trigger_memrefs(self, peek, ud); + + /* process the trigger */ + memset(&eval_state, 0, sizeof(eval_state)); + eval_state.peek = peek; + eval_state.peek_userdata = ud; + + measured_value.type = RC_VALUE_TYPE_NONE; + + if (self->requirement != NULL) { + ret = rc_test_condset(self->requirement, &eval_state); + is_paused = eval_state.is_paused; + is_primed = eval_state.is_primed; + + if (eval_state.measured_value.type != RC_VALUE_TYPE_NONE) { + memcpy(&measured_value, &eval_state.measured_value, sizeof(measured_value)); + measured_from_hits = eval_state.measured_from_hits; + } + } else { + ret = 1; + is_paused = 0; + is_primed = 1; + } + + condset = self->alternative; + if (condset) { + int sub = 0; + char sub_paused = 1; + char sub_primed = 0; + + do { + sub |= rc_test_condset(condset, &eval_state); + sub_paused &= eval_state.is_paused; + sub_primed |= eval_state.is_primed; + + if (eval_state.measured_value.type != RC_VALUE_TYPE_NONE) { + /* if no previous Measured value was captured, or the new one is greater, keep the new one */ + if (measured_value.type == RC_VALUE_TYPE_NONE || + rc_typed_value_compare(&eval_state.measured_value, &measured_value, RC_OPERATOR_GT)) { + memcpy(&measured_value, &eval_state.measured_value, sizeof(measured_value)); + measured_from_hits = eval_state.measured_from_hits; + } + } + + condset = condset->next; + } while (condset); + + /* to trigger, the core must be true and at least one alt must be true */ + ret &= sub; + is_primed &= sub_primed; + + /* if the core is not paused, all alts must be paused to count as a paused trigger */ + is_paused |= sub_paused; + } + + if (is_paused) { + /* if the trigger is fully paused, ignore any updates to the measured value */ + } + else if (measured_value.type == RC_VALUE_TYPE_NONE) { + /* if a measured value was not captured, keep the old value (it's possible to pause + * an alt that is generating the measured value without fully pausing the trigger) */ + } + else { + rc_typed_value_convert(&measured_value, RC_VALUE_TYPE_UNSIGNED); + self->measured_value = measured_value.value.u32; + } + + /* if any ResetIf condition was true, reset the hit counts */ + if (eval_state.was_reset) { + /* if the measured value came from a hit count, reset it. do this before calling + * rc_reset_trigger_hitcounts in case we need to call rc_condset_is_measured_from_hitcount */ + if (measured_from_hits) { + self->measured_value = 0; + } + else if (is_paused && self->measured_value) { + /* if the measured value is in a paused group, measured_from_hits won't have been set. + * attempt to determine if it should have been */ + if (self->requirement && self->requirement->is_paused && + rc_condset_is_measured_from_hitcount(self->requirement, self->measured_value)) { + self->measured_value = 0; + } + else { + for (condset = self->alternative; condset; condset = condset->next) { + if (condset->is_paused && rc_condset_is_measured_from_hitcount(condset, self->measured_value)) { + self->measured_value = 0; + break; + } + } + } + } + + rc_reset_trigger_hitcounts(self); + + /* if there were hit counts to clear, return RESET, but don't change the state */ + if (self->has_hits) { + self->has_hits = 0; + + /* cannot be PRIMED while ResetIf is true */ + if (self->state == RC_TRIGGER_STATE_PRIMED) + self->state = RC_TRIGGER_STATE_ACTIVE; + + return RC_TRIGGER_STATE_RESET; + } + + /* any hits that were tallied were just reset */ + eval_state.has_hits = 0; + is_primed = 0; + } + else if (ret) { + /* if the state is WAITING and the trigger is ready to fire, ignore it and reset the hit counts */ + if (self->state == RC_TRIGGER_STATE_WAITING) { + rc_reset_trigger(self); + self->has_hits = 0; + return RC_TRIGGER_STATE_WAITING; + } + + /* trigger was triggered */ + self->state = RC_TRIGGER_STATE_TRIGGERED; + return RC_TRIGGER_STATE_TRIGGERED; + } + + /* did not trigger this frame - update the information we'll need for next time */ + self->has_hits = eval_state.has_hits; + + if (is_paused) { + self->state = RC_TRIGGER_STATE_PAUSED; + } + else if (is_primed) { + self->state = RC_TRIGGER_STATE_PRIMED; + } + else { + self->state = RC_TRIGGER_STATE_ACTIVE; + } + + /* if an individual condition was reset, notify the caller */ + if (eval_state.was_cond_reset) + return RC_TRIGGER_STATE_RESET; + + /* otherwise, just return the current state */ + return self->state; +} + +int rc_test_trigger(rc_trigger_t* self, rc_peek_t peek, void* ud, void* unused_L) { + /* for backwards compatibilty, rc_test_trigger always assumes the achievement is active */ + self->state = RC_TRIGGER_STATE_ACTIVE; + + return (rc_evaluate_trigger(self, peek, ud, unused_L) == RC_TRIGGER_STATE_TRIGGERED); +} + +void rc_reset_trigger(rc_trigger_t* self) { + if (!self) + return; + + rc_reset_trigger_hitcounts(self); + + self->state = RC_TRIGGER_STATE_WAITING; + + if (self->measured_target) + self->measured_value = RC_MEASURED_UNKNOWN; + + self->has_hits = 0; +} diff --git a/src/rcheevos/src/rcheevos/value.c b/src/rcheevos/src/rcheevos/value.c new file mode 100644 index 0000000000..865e31253d --- /dev/null +++ b/src/rcheevos/src/rcheevos/value.c @@ -0,0 +1,933 @@ +#include "rc_internal.h" + +#include /* memset */ +#include /* isdigit */ +#include /* FLT_EPSILON */ +#include /* fmod */ + +int rc_is_valid_variable_character(char ch, int is_first) { + if (is_first) { + if (!isalpha((unsigned char)ch)) + return 0; + } + else { + if (!isalnum((unsigned char)ch)) + return 0; + } + return 1; +} + +static void rc_parse_cond_value(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse) { + rc_condset_t** next_clause; + + next_clause = &self->conditions; + + do + { + parse->measured_target = 0; /* passing is_value=1 should prevent any conflicts, but clear it out anyway */ + *next_clause = rc_parse_condset(memaddr, parse); + if (parse->offset < 0) { + return; + } + + if (**memaddr == 'S' || **memaddr == 's') { + /* alt groups not supported */ + parse->offset = RC_INVALID_VALUE_FLAG; + } + else if (parse->measured_target == 0) { + parse->offset = RC_MISSING_VALUE_MEASURED; + } + else if (**memaddr == '$') { + /* maximum of */ + ++(*memaddr); + next_clause = &(*next_clause)->next; + continue; + } + + break; + } while (1); + + (*next_clause)->next = 0; +} + +static void rc_parse_legacy_value(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse) { + rc_condset_with_trailing_conditions_t* condset_with_conditions; + rc_condition_t** next; + rc_condset_t** next_clause; + rc_condset_t* condset; + rc_condition_t local_cond; + rc_condition_t* cond; + uint32_t num_measured_conditions; + char buffer[64] = "A:"; + const char* buffer_ptr; + char* ptr; + int done; + + /* convert legacy format into condset */ + next_clause = &self->conditions; + do { + /* count the number of joiners and add one to determine the number of clauses. */ + buffer[0] = 'A'; /* reset to AddSource */ + done = 0; + num_measured_conditions = 1; + buffer_ptr = *memaddr; + do { + switch (*buffer_ptr++) { + case '_': /* add next */ + ++num_measured_conditions; + buffer[0] = 'A'; /* reset to AddSource */ + break; + + case '*': /* multiply */ + if (*buffer_ptr == '-') { + /* multiplication by a negative number will convert to SubSource */ + ++buffer_ptr; + buffer[0] = 'B'; + } + break; + + case '\0': /* end of string */ + case '$': /* maximum of */ + case ':': /* end of leaderboard clause */ + case ')': /* end of rich presence macro */ + done = 1; + break; + + default: /* assume everything else is valid - bad stuff will be filtered out later */ + break; + } + } while (!done); + + /* if last condition is not AddSource, we'll need to add a dummy condition for the Measured */ + if (buffer[0] != 'A') + ++num_measured_conditions; + + condset_with_conditions = RC_ALLOC_WITH_TRAILING(rc_condset_with_trailing_conditions_t, + rc_condition_t, conditions, num_measured_conditions, parse); + if (parse->offset < 0) + return; + + condset = (rc_condset_t*)condset_with_conditions; + memset(condset, 0, sizeof(*condset)); + condset->num_measured_conditions = num_measured_conditions; + cond = &condset_with_conditions->conditions[0]; + + next = &condset->conditions; + + for (;; ++(*memaddr)) { + buffer[0] = 'A'; /* reset to AddSource */ + ptr = &buffer[2]; + + /* extract the next clause */ + for (;; ++(*memaddr)) { + switch (**memaddr) { + case '_': /* add next */ + *ptr = '\0'; + break; + + case '$': /* maximum of */ + case '\0': /* end of string */ + case ':': /* end of leaderboard clause */ + case ')': /* end of rich presence macro */ + /* the last condition needs to be Measured - AddSource can be changed here, + * SubSource will be handled later */ + if (buffer[0] == 'A') + buffer[0] = 'M'; + + *ptr = '\0'; + break; + + case '*': + *ptr++ = '*'; + + buffer_ptr = *memaddr + 1; + if (*buffer_ptr == '-') { + buffer[0] = 'B'; /* change to SubSource */ + ++(*memaddr); /* don't copy sign */ + ++buffer_ptr; /* ignore sign when doing floating point check */ + } + else if (*buffer_ptr == '+') { + ++buffer_ptr; /* ignore sign when doing floating point check */ + } + + /* if it looks like a floating point number, add the 'f' prefix */ + while (isdigit((unsigned char)*buffer_ptr)) + ++buffer_ptr; + if (*buffer_ptr == '.') + *ptr++ = 'f'; + continue; + + default: + *ptr++ = **memaddr; + continue; + } + + break; + } + + /* process the clause */ + if (!parse->buffer) + cond = &local_cond; + + buffer_ptr = buffer; + rc_parse_condition_internal(cond, &buffer_ptr, parse); + if (parse->offset < 0) + return; + + if (*buffer_ptr) { + /* whatever we copied as a single condition was not fully consumed */ + parse->offset = RC_INVALID_COMPARISON; + return; + } + + if (!rc_operator_is_modifying(cond->oper)) { + parse->offset = RC_INVALID_OPERATOR; + return; + } + + rc_condition_update_parse_state(cond, parse); + + *next = cond; + next = &cond->next; + + if (**memaddr != '_') /* add next */ + break; + + ++cond; + } + + /* -- end of clause -- */ + + /* clause must end in a Measured. if it doesn't, append one */ + if (cond->type != RC_CONDITION_MEASURED) { + if (!parse->buffer) + cond = &local_cond; + else + ++cond; + + buffer_ptr = "M:0"; + rc_parse_condition_internal(cond, &buffer_ptr, parse); + *next = cond; + next = &cond->next; + rc_condition_update_parse_state(cond, parse); + } + + *next = NULL; + + /* finalize clause */ + *next_clause = condset; + next_clause = &condset->next; + + if (**memaddr != '$') { + /* end of valid string */ + *next_clause = NULL; + break; + } + + /* max of ($), start a new clause */ + ++(*memaddr); + } while (1); +} + +void rc_parse_value_internal(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse) { + const uint8_t was_value = parse->is_value; + const rc_condition_t* condition; + parse->is_value = 1; + + /* if it starts with a condition flag (M: A: B: C:), parse the conditions */ + if ((*memaddr)[1] == ':') + rc_parse_cond_value(self, memaddr, parse); + else + rc_parse_legacy_value(self, memaddr, parse); + + if (parse->offset >= 0 && parse->buffer) { + self->name = "(unnamed)"; + self->value.value = self->value.prior = 0; + self->value.memref_type = RC_MEMREF_TYPE_VALUE; + self->value.changed = 0; + self->has_memrefs = 0; + + for (condition = self->conditions->conditions; condition; condition = condition->next) { + if (condition->type == RC_CONDITION_MEASURED) { + if (rc_operand_is_float(&condition->operand1)) { + self->value.size = RC_MEMSIZE_FLOAT; + self->value.type = RC_VALUE_TYPE_FLOAT; + } + else { + self->value.size = RC_MEMSIZE_32_BITS; + self->value.type = RC_VALUE_TYPE_UNSIGNED; + } + break; + } + } + } + + parse->is_value = was_value; +} + +int rc_value_size(const char* memaddr) { + rc_value_with_memrefs_t* value; + rc_preparse_state_t preparse; + rc_init_preparse_state(&preparse); + + value = RC_ALLOC(rc_value_with_memrefs_t, &preparse.parse); + rc_parse_value_internal(&value->value, &memaddr, &preparse.parse); + rc_preparse_alloc_memrefs(NULL, &preparse); + + rc_destroy_preparse_state(&preparse); + return preparse.parse.offset; +} + +rc_value_t* rc_parse_value(void* buffer, const char* memaddr, void* unused_L, int unused_funcs_idx) { + rc_value_with_memrefs_t* value; + rc_preparse_state_t preparse; + const char* preparse_memaddr = memaddr; + + (void)unused_L; + (void)unused_funcs_idx; + + if (!buffer || !memaddr) + return NULL; + + rc_init_preparse_state(&preparse); + value = RC_ALLOC(rc_value_with_memrefs_t, &preparse.parse); + rc_parse_value_internal(&value->value, &preparse_memaddr, &preparse.parse); + + rc_reset_parse_state(&preparse.parse, buffer); + value = RC_ALLOC(rc_value_with_memrefs_t, &preparse.parse); + rc_preparse_alloc_memrefs(&value->memrefs, &preparse); + + rc_parse_value_internal(&value->value, &memaddr, &preparse.parse); + value->value.has_memrefs = 1; + + rc_destroy_preparse_state(&preparse); + return (preparse.parse.offset >= 0) ? &value->value : NULL; +} + +static void rc_update_value_memrefs(rc_value_t* self, rc_peek_t peek, void* ud) { + if (self->has_memrefs) { + rc_value_with_memrefs_t* value = (rc_value_with_memrefs_t*)self; + rc_update_memref_values(&value->memrefs, peek, ud); + } +} + +int rc_evaluate_value_typed(rc_value_t* self, rc_typed_value_t* value, rc_peek_t peek, void* ud) { + rc_eval_state_t eval_state; + rc_condset_t* condset; + int valid = 0; + + rc_update_value_memrefs(self, peek, ud); + + value->value.i32 = 0; + value->type = RC_VALUE_TYPE_SIGNED; + + for (condset = self->conditions; condset != NULL; condset = condset->next) { + memset(&eval_state, 0, sizeof(eval_state)); + eval_state.peek = peek; + eval_state.peek_userdata = ud; + + rc_test_condset(condset, &eval_state); + + if (condset->is_paused) + continue; + + if (eval_state.was_reset) { + /* if any ResetIf condition was true, reset the hit counts + * NOTE: ResetIf only affects the current condset when used in values! + */ + rc_reset_condset(condset); + } + + if (eval_state.measured_value.type != RC_VALUE_TYPE_NONE) { + if (!valid) { + /* capture the first valid measurement, which may be negative */ + memcpy(value, &eval_state.measured_value, sizeof(*value)); + valid = 1; + } + else { + /* multiple condsets are currently only used for the MAX_OF operation. + * only keep the condset's value if it's higher than the current highest value. + */ + if (rc_typed_value_compare(&eval_state.measured_value, value, RC_OPERATOR_GT)) + memcpy(value, &eval_state.measured_value, sizeof(*value)); + } + } + } + + return valid; +} + +int32_t rc_evaluate_value(rc_value_t* self, rc_peek_t peek, void* ud, void* unused_L) { + rc_typed_value_t result; + int valid = rc_evaluate_value_typed(self, &result, peek, ud); + + (void)unused_L; + + if (valid) { + /* if not paused, store the value so that it's available when paused. */ + rc_typed_value_convert(&result, RC_VALUE_TYPE_UNSIGNED); + rc_update_memref_value(&self->value, result.value.u32); + } + else { + /* when paused, the Measured value will not be captured, use the last captured value. */ + result.value.u32 = self->value.value; + result.type = RC_VALUE_TYPE_UNSIGNED; + } + + rc_typed_value_convert(&result, RC_VALUE_TYPE_SIGNED); + return result.value.i32; +} + +void rc_reset_value(rc_value_t* self) { + rc_condset_t* condset = self->conditions; + while (condset != NULL) { + rc_reset_condset(condset); + condset = condset->next; + } + + self->value.value = self->value.prior = 0; + self->value.changed = 0; +} + +int rc_value_from_hits(rc_value_t* self) +{ + rc_condset_t* condset = self->conditions; + for (; condset != NULL; condset = condset->next) { + rc_condition_t* condition = condset->conditions; + for (; condition != NULL; condition = condition->next) { + if (condition->type == RC_CONDITION_MEASURED) + return (condition->required_hits != 0); + } + } + + return 0; +} + +rc_value_t* rc_alloc_variable(const char* memaddr, size_t memaddr_len, rc_parse_state_t* parse) { + rc_value_t** value_ptr = parse->variables; + rc_value_t* value; + const char* name; + uint32_t measured_target; + + if (!value_ptr) + return NULL; + + while (*value_ptr) { + value = *value_ptr; + if (strncmp(value->name, memaddr, memaddr_len) == 0 && value->name[memaddr_len] == 0) + return value; + + value_ptr = &value->next; + } + + /* capture name before calling parse as parse will update memaddr pointer */ + name = rc_alloc_str(parse, memaddr, memaddr_len); + if (!name) + return NULL; + + /* no match found, create a new entry */ + value = RC_ALLOC_SCRATCH(rc_value_t, parse); + memset(value, 0, sizeof(value->value)); + value->value.size = RC_MEMSIZE_VARIABLE; + value->next = NULL; + + /* the helper variable likely has a Measured condition. capture the current measured_target so we can restore it + * after generating the variable so the variable's Measured target doesn't conflict with the rest of the trigger. */ + measured_target = parse->measured_target; + rc_parse_value_internal(value, &memaddr, parse); + parse->measured_target = measured_target; + + /* store name after calling parse as parse will set name to (unnamed) */ + value->name = name; + + *value_ptr = value; + return value; +} + +uint32_t rc_count_values(const rc_value_t* values) { + uint32_t count = 0; + while (values) { + ++count; + values = values->next; + } + + return count; +} + +void rc_update_values(rc_value_t* values, rc_peek_t peek, void* ud) { + rc_typed_value_t result; + + rc_value_t* value = values; + for (; value; value = value->next) { + if (rc_evaluate_value_typed(value, &result, peek, ud)) { + /* store the raw bytes and type to be restored by rc_typed_value_from_memref_value */ + rc_update_memref_value(&value->value, result.value.u32); + value->value.type = result.type; + } + } +} + +void rc_reset_values(rc_value_t* values) { + rc_value_t* value = values; + + for (; value; value = value->next) + rc_reset_value(value); +} + +void rc_typed_value_from_memref_value(rc_typed_value_t* value, const rc_memref_value_t* memref) { + /* raw value is always u32, type can mark it as something else */ + value->value.u32 = memref->value; + value->type = memref->type; +} + +void rc_typed_value_convert(rc_typed_value_t* value, char new_type) { + switch (new_type) { + case RC_VALUE_TYPE_UNSIGNED: + switch (value->type) { + case RC_VALUE_TYPE_UNSIGNED: + return; + case RC_VALUE_TYPE_SIGNED: + value->value.u32 = (unsigned)value->value.i32; + break; + case RC_VALUE_TYPE_FLOAT: + value->value.u32 = (unsigned)value->value.f32; + break; + default: + value->value.u32 = 0; + break; + } + break; + + case RC_VALUE_TYPE_SIGNED: + switch (value->type) { + case RC_VALUE_TYPE_SIGNED: + return; + case RC_VALUE_TYPE_UNSIGNED: + value->value.i32 = (int)value->value.u32; + break; + case RC_VALUE_TYPE_FLOAT: + value->value.i32 = (int)value->value.f32; + break; + default: + value->value.i32 = 0; + break; + } + break; + + case RC_VALUE_TYPE_FLOAT: + switch (value->type) { + case RC_VALUE_TYPE_FLOAT: + return; + case RC_VALUE_TYPE_UNSIGNED: + value->value.f32 = (float)value->value.u32; + break; + case RC_VALUE_TYPE_SIGNED: + value->value.f32 = (float)value->value.i32; + break; + default: + value->value.f32 = 0.0; + break; + } + break; + + default: + break; + } + + value->type = new_type; +} + +static rc_typed_value_t* rc_typed_value_convert_into(rc_typed_value_t* dest, const rc_typed_value_t* source, char new_type) { + memcpy(dest, source, sizeof(rc_typed_value_t)); + rc_typed_value_convert(dest, new_type); + return dest; +} + +void rc_typed_value_negate(rc_typed_value_t* value) { + switch (value->type) + { + case RC_VALUE_TYPE_UNSIGNED: + rc_typed_value_convert(value, RC_VALUE_TYPE_SIGNED); + /* fallthrough */ /* to RC_VALUE_TYPE_SIGNED */ + + case RC_VALUE_TYPE_SIGNED: + value->value.i32 = -(value->value.i32); + break; + + case RC_VALUE_TYPE_FLOAT: + value->value.f32 = -(value->value.f32); + break; + + default: + break; + } +} + +void rc_typed_value_add(rc_typed_value_t* value, const rc_typed_value_t* amount) { + rc_typed_value_t converted; + + if (amount->type != value->type && value->type != RC_VALUE_TYPE_NONE) { + if (amount->type == RC_VALUE_TYPE_FLOAT) + rc_typed_value_convert(value, RC_VALUE_TYPE_FLOAT); + else + amount = rc_typed_value_convert_into(&converted, amount, value->type); + } + + switch (value->type) + { + case RC_VALUE_TYPE_UNSIGNED: + value->value.u32 += amount->value.u32; + break; + + case RC_VALUE_TYPE_SIGNED: + value->value.i32 += amount->value.i32; + break; + + case RC_VALUE_TYPE_FLOAT: + value->value.f32 += amount->value.f32; + break; + + case RC_VALUE_TYPE_NONE: + memcpy(value, amount, sizeof(rc_typed_value_t)); + break; + + default: + break; + } +} + +void rc_typed_value_multiply(rc_typed_value_t* value, const rc_typed_value_t* amount) { + rc_typed_value_t converted; + + switch (value->type) + { + case RC_VALUE_TYPE_UNSIGNED: + switch (amount->type) + { + case RC_VALUE_TYPE_UNSIGNED: + /* the c standard for unsigned multiplication is well defined as non-overflowing truncation + * to the type's size. this allows negative multiplication through twos-complements. i.e. + * 1 * -1 (0xFFFFFFFF) = 0xFFFFFFFF = -1 + * 3 * -2 (0xFFFFFFFE) = 0x2FFFFFFFA & 0xFFFFFFFF = 0xFFFFFFFA = -6 + * 10 * -5 (0xFFFFFFFB) = 0x9FFFFFFCE & 0xFFFFFFFF = 0xFFFFFFCE = -50 + */ + value->value.u32 *= amount->value.u32; + break; + + case RC_VALUE_TYPE_SIGNED: + value->value.u32 *= (unsigned)amount->value.i32; + break; + + case RC_VALUE_TYPE_FLOAT: + rc_typed_value_convert(value, RC_VALUE_TYPE_FLOAT); + value->value.f32 *= amount->value.f32; + break; + + default: + value->type = RC_VALUE_TYPE_NONE; + break; + } + break; + + case RC_VALUE_TYPE_SIGNED: + switch (amount->type) + { + case RC_VALUE_TYPE_SIGNED: + value->value.i32 *= amount->value.i32; + break; + + case RC_VALUE_TYPE_UNSIGNED: + value->value.i32 *= (int)amount->value.u32; + break; + + case RC_VALUE_TYPE_FLOAT: + rc_typed_value_convert(value, RC_VALUE_TYPE_FLOAT); + value->value.f32 *= amount->value.f32; + break; + + default: + value->type = RC_VALUE_TYPE_NONE; + break; + } + break; + + case RC_VALUE_TYPE_FLOAT: + if (amount->type == RC_VALUE_TYPE_NONE) { + value->type = RC_VALUE_TYPE_NONE; + } + else { + amount = rc_typed_value_convert_into(&converted, amount, RC_VALUE_TYPE_FLOAT); + value->value.f32 *= amount->value.f32; + } + break; + + default: + value->type = RC_VALUE_TYPE_NONE; + break; + } +} + +void rc_typed_value_divide(rc_typed_value_t* value, const rc_typed_value_t* amount) { + rc_typed_value_t converted; + + switch (amount->type) + { + case RC_VALUE_TYPE_UNSIGNED: + if (amount->value.u32 == 0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + switch (value->type) { + case RC_VALUE_TYPE_UNSIGNED: /* integer math */ + value->value.u32 /= amount->value.u32; + return; + case RC_VALUE_TYPE_SIGNED: /* integer math */ + value->value.i32 /= (int)amount->value.u32; + return; + case RC_VALUE_TYPE_FLOAT: + amount = rc_typed_value_convert_into(&converted, amount, RC_VALUE_TYPE_FLOAT); + break; + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + break; + + case RC_VALUE_TYPE_SIGNED: + if (amount->value.i32 == 0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + switch (value->type) { + case RC_VALUE_TYPE_SIGNED: /* integer math */ + value->value.i32 /= amount->value.i32; + return; + case RC_VALUE_TYPE_UNSIGNED: /* integer math */ + value->value.u32 /= (unsigned)amount->value.i32; + return; + case RC_VALUE_TYPE_FLOAT: + amount = rc_typed_value_convert_into(&converted, amount, RC_VALUE_TYPE_FLOAT); + break; + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + break; + + case RC_VALUE_TYPE_FLOAT: + break; + + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + + if (amount->value.f32 == 0.0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + rc_typed_value_convert(value, RC_VALUE_TYPE_FLOAT); + value->value.f32 /= amount->value.f32; +} + +void rc_typed_value_modulus(rc_typed_value_t* value, const rc_typed_value_t* amount) { + rc_typed_value_t converted; + + switch (amount->type) + { + case RC_VALUE_TYPE_UNSIGNED: + if (amount->value.u32 == 0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + switch (value->type) { + case RC_VALUE_TYPE_UNSIGNED: /* integer math */ + value->value.u32 %= amount->value.u32; + return; + case RC_VALUE_TYPE_SIGNED: /* integer math */ + value->value.i32 %= (int)amount->value.u32; + return; + case RC_VALUE_TYPE_FLOAT: + amount = rc_typed_value_convert_into(&converted, amount, RC_VALUE_TYPE_FLOAT); + break; + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + break; + + case RC_VALUE_TYPE_SIGNED: + if (amount->value.i32 == 0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + switch (value->type) { + case RC_VALUE_TYPE_SIGNED: /* integer math */ + value->value.i32 %= amount->value.i32; + return; + case RC_VALUE_TYPE_UNSIGNED: /* integer math */ + value->value.u32 %= (unsigned)amount->value.i32; + return; + case RC_VALUE_TYPE_FLOAT: + amount = rc_typed_value_convert_into(&converted, amount, RC_VALUE_TYPE_FLOAT); + break; + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + break; + + case RC_VALUE_TYPE_FLOAT: + break; + + default: + value->type = RC_VALUE_TYPE_NONE; + return; + } + + if (amount->value.f32 == 0.0) { /* divide by zero */ + value->type = RC_VALUE_TYPE_NONE; + return; + } + + rc_typed_value_convert(value, RC_VALUE_TYPE_FLOAT); + value->value.f32 = (float)fmod(value->value.f32, amount->value.f32); +} + +void rc_typed_value_combine(rc_typed_value_t* value, rc_typed_value_t* amount, uint8_t oper) { + switch (oper) { + case RC_OPERATOR_MULT: + rc_typed_value_multiply(value, amount); + break; + + case RC_OPERATOR_DIV: + rc_typed_value_divide(value, amount); + break; + + case RC_OPERATOR_AND: + rc_typed_value_convert(value, RC_VALUE_TYPE_UNSIGNED); + rc_typed_value_convert(amount, RC_VALUE_TYPE_UNSIGNED); + value->value.u32 &= amount->value.u32; + break; + + case RC_OPERATOR_XOR: + rc_typed_value_convert(value, RC_VALUE_TYPE_UNSIGNED); + rc_typed_value_convert(amount, RC_VALUE_TYPE_UNSIGNED); + value->value.u32 ^= amount->value.u32; + break; + + case RC_OPERATOR_MOD: + rc_typed_value_modulus(value, amount); + break; + + case RC_OPERATOR_ADD: + rc_typed_value_add(value, amount); + break; + + case RC_OPERATOR_SUB: + rc_typed_value_negate(amount); + rc_typed_value_add(value, amount); + break; + } +} + + +static int rc_typed_value_compare_floats(float f1, float f2, char oper) { + if (f1 == f2) { + /* exactly equal */ + } + else { + /* attempt to match 7 significant digits (24-bit mantissa supports just over 7 significant decimal digits) */ + /* https://stackoverflow.com/questions/17333/what-is-the-most-effective-way-for-float-and-double-comparison */ + const float abs1 = (f1 < 0) ? -f1 : f1; + const float abs2 = (f2 < 0) ? -f2 : f2; + const float threshold = ((abs1 < abs2) ? abs1 : abs2) * FLT_EPSILON; + const float diff = f1 - f2; + const float abs_diff = (diff < 0) ? -diff : diff; + + if (abs_diff <= threshold) { + /* approximately equal */ + } + else if (diff > threshold) { + /* greater */ + switch (oper) { + case RC_OPERATOR_NE: + case RC_OPERATOR_GT: + case RC_OPERATOR_GE: + return 1; + + default: + return 0; + } + } + else { + /* lesser */ + switch (oper) { + case RC_OPERATOR_NE: + case RC_OPERATOR_LT: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } + } + } + + /* exactly or approximately equal */ + switch (oper) { + case RC_OPERATOR_EQ: + case RC_OPERATOR_GE: + case RC_OPERATOR_LE: + return 1; + + default: + return 0; + } +} + +int rc_typed_value_compare(const rc_typed_value_t* value1, const rc_typed_value_t* value2, char oper) { + rc_typed_value_t converted_value; + if (value2->type != value1->type) { + /* if either side is a float, convert both sides to float. otherwise, assume the signed-ness of the left side. */ + if (value2->type == RC_VALUE_TYPE_FLOAT) + value1 = rc_typed_value_convert_into(&converted_value, value1, value2->type); + else + value2 = rc_typed_value_convert_into(&converted_value, value2, value1->type); + } + + switch (value1->type) { + case RC_VALUE_TYPE_UNSIGNED: + switch (oper) { + case RC_OPERATOR_EQ: return value1->value.u32 == value2->value.u32; + case RC_OPERATOR_NE: return value1->value.u32 != value2->value.u32; + case RC_OPERATOR_LT: return value1->value.u32 < value2->value.u32; + case RC_OPERATOR_LE: return value1->value.u32 <= value2->value.u32; + case RC_OPERATOR_GT: return value1->value.u32 > value2->value.u32; + case RC_OPERATOR_GE: return value1->value.u32 >= value2->value.u32; + default: return 1; + } + + case RC_VALUE_TYPE_SIGNED: + switch (oper) { + case RC_OPERATOR_EQ: return value1->value.i32 == value2->value.i32; + case RC_OPERATOR_NE: return value1->value.i32 != value2->value.i32; + case RC_OPERATOR_LT: return value1->value.i32 < value2->value.i32; + case RC_OPERATOR_LE: return value1->value.i32 <= value2->value.i32; + case RC_OPERATOR_GT: return value1->value.i32 > value2->value.i32; + case RC_OPERATOR_GE: return value1->value.i32 >= value2->value.i32; + default: return 1; + } + + case RC_VALUE_TYPE_FLOAT: + return rc_typed_value_compare_floats(value1->value.f32, value2->value.f32, oper); + + default: + return 1; + } +} diff --git a/src/rcheevos/src/rhash/aes.h b/src/rcheevos/src/rhash/aes.h new file mode 100644 index 0000000000..13e679ee14 --- /dev/null +++ b/src/rcheevos/src/rhash/aes.h @@ -0,0 +1,49 @@ +#ifndef AES_H +#define AES_H + +/* This file is sourced from https://github.com/kokke/tiny-AES-c, with unused code excised. + * This code is licensed under the Unlicense license, effectively public domain. + * https://github.com/kokke/tiny-AES-c/blob/f06ac37/unlicense.txt + */ + +#include +#include + +#define AES_BLOCKLEN 16 /* Block length in bytes - AES is 128b block only */ +#define AES_KEYLEN 16 /* Key length in bytes */ +#define AES_keyExpSize 176 + +struct AES_ctx +{ + uint8_t RoundKey[AES_keyExpSize]; + uint8_t Iv[AES_BLOCKLEN]; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t key[AES_KEYLEN]); +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t key[AES_KEYLEN], const uint8_t iv[AES_BLOCKLEN]); +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t iv[AES_BLOCKLEN]); + +/* buffer size MUST be mutile of AES_BLOCKLEN; + * Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme + * NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv() + * no IV should ever be reused with the same key + */ +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +/* Same function for encrypting as for decrypting. + * IV is incremented for every block, and used after encryption as XOR-compliment for output + * Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme + * NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv() + * no IV should ever be reused with the same key + */ +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* AES_H */ diff --git a/src/rcheevos/src/rhash/cdreader.c b/src/rcheevos/src/rhash/cdreader.c new file mode 100644 index 0000000000..9ffcc55bcb --- /dev/null +++ b/src/rcheevos/src/rhash/cdreader.c @@ -0,0 +1,838 @@ +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +#include +#include +#include + +static int cdreader_get_sector(uint8_t header[16]) +{ + int minutes = (header[12] >> 4) * 10 + (header[12] & 0x0F); + int seconds = (header[13] >> 4) * 10 + (header[13] & 0x0F); + int frames = (header[14] >> 4) * 10 + (header[14] & 0x0F); + + /* convert the MSF value to a sector index, and subtract 150 (2 seconds) per: + * For data and mixed mode media (those conforming to ISO/IEC 10149), logical block address + * zero shall be assigned to the block at MSF address 00/02/00 */ + return ((minutes * 60) + seconds) * 75 + frames - 150; +} + +static void cdreader_determine_sector_size(rc_hash_cdrom_track_t* cdrom) +{ + /* Attempt to determine the sector and header sizes. The CUE file may be lying. + * Look for the sync pattern using each of the supported sector sizes. + * Then check for the presence of "CD001", which is gauranteed to be in either the + * boot record or primary volume descriptor, one of which is always at sector 16. + */ + const uint8_t sync_pattern[] = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 + }; + + uint8_t header[32]; + const int64_t toc_sector = 16 + cdrom->track_pregap_sectors; + + cdrom->sector_size = 0; + cdrom->sector_header_size = 0; + cdrom->raw_data_size = 2048; + + cdrom->file_reader->seek(cdrom->file_handle, toc_sector * 2352 + cdrom->file_track_offset, SEEK_SET); + if (cdrom->file_reader->read(cdrom->file_handle, header, sizeof(header)) < sizeof(header)) + return; + + if (memcmp(header, sync_pattern, 12) == 0) + { + cdrom->sector_size = 2352; + + if (memcmp(&header[25], "CD001", 5) == 0) + cdrom->sector_header_size = 24; + else + cdrom->sector_header_size = 16; + + cdrom->track_first_sector = cdreader_get_sector(header) - (int)toc_sector; + } + else + { + cdrom->file_reader->seek(cdrom->file_handle, toc_sector * 2336 + cdrom->file_track_offset, SEEK_SET); + cdrom->file_reader->read(cdrom->file_handle, header, sizeof(header)); + + if (memcmp(header, sync_pattern, 12) == 0) + { + cdrom->sector_size = 2336; + + if (memcmp(&header[25], "CD001", 5) == 0) + cdrom->sector_header_size = 24; + else + cdrom->sector_header_size = 16; + + cdrom->track_first_sector = cdreader_get_sector(header) - (int)toc_sector; + } + else + { + cdrom->file_reader->seek(cdrom->file_handle, toc_sector * 2048 + cdrom->file_track_offset, SEEK_SET); + cdrom->file_reader->read(cdrom->file_handle, header, sizeof(header)); + + if (memcmp(&header[1], "CD001", 5) == 0) + { + cdrom->sector_size = 2048; + cdrom->sector_header_size = 0; + } + } + } +} + +static void* cdreader_open_bin_track(const char* path, uint32_t track, const rc_hash_iterator_t* iterator) +{ + void* file_handle; + rc_hash_cdrom_track_t* cdrom; + + if (track > 1) { + rc_hash_iterator_verbose(iterator, "Cannot locate secondary tracks without a cue sheet"); + return NULL; + } + + file_handle = iterator->callbacks.filereader.open(path); + if (!file_handle) + return NULL; + + cdrom = (rc_hash_cdrom_track_t*)calloc(1, sizeof(*cdrom)); + if (!cdrom) + return NULL; + cdrom->file_reader = &iterator->callbacks.filereader; + cdrom->file_handle = file_handle; +#ifndef NDEBUG + cdrom->track_id = track; +#endif + + cdreader_determine_sector_size(cdrom); + + if (cdrom->sector_size == 0) + { + int64_t size; + + iterator->callbacks.filereader.seek(file_handle, 0, SEEK_END); + size = iterator->callbacks.filereader.tell(file_handle); + + if ((size % 2352) == 0) + { + /* raw tracks use all 2352 bytes and have a 24 byte header */ + cdrom->sector_size = 2352; + cdrom->sector_header_size = 24; + } + else if ((size % 2048) == 0) + { + /* cooked tracks eliminate all header/footer data */ + cdrom->sector_size = 2048; + cdrom->sector_header_size = 0; + } + else if ((size % 2336) == 0) + { + /* MODE 2 format without 16-byte sync data */ + cdrom->sector_size = 2336; + cdrom->sector_header_size = 8; + } + else + { + if (iterator->callbacks.filereader.close) + iterator->callbacks.filereader.close(file_handle); + free(cdrom); + + rc_hash_iterator_verbose(iterator, "Could not determine sector size"); + + return NULL; + } + } + + return cdrom; +} + +static int cdreader_open_bin(rc_hash_cdrom_track_t* cdrom, const char* path, const char* mode) +{ + cdrom->file_handle = cdrom->file_reader->open(path); + if (!cdrom->file_handle) + return 0; + + /* determine sector size */ + cdreader_determine_sector_size(cdrom); + + /* could not determine, which means we'll probably have more issues later + * but use the CUE provided information anyway + */ + if (cdrom->sector_size == 0) + { + /* All of these modes have 2048 byte payloads. In MODE1/2352 and MODE2/2352 + * modes, the mode can actually be specified per sector to change the payload + * size, but that reduces the ability to recover from errors when the disc + * is damaged, so it's seldomly used, and when it is, it's mostly for audio + * or video data where a blip or two probably won't be noticed by the user. + * So, while we techincally support all of the following modes, we only do + * so with 2048 byte payloads. + * http://totalsonicmastering.com/cuesheetsyntax.htm + * MODE1/2048 ? CDROM Mode1 Data (cooked) [no header, no footer] + * MODE1/2352 ? CDROM Mode1 Data (raw) [16 byte header, 288 byte footer] + * MODE2/2336 ? CDROM-XA Mode2 Data [8 byte header, 280 byte footer] + * MODE2/2352 ? CDROM-XA Mode2 Data [24 byte header, 280 byte footer] + */ + if (memcmp(mode, "MODE2/2352", 10) == 0) + { + cdrom->sector_size = 2352; + cdrom->sector_header_size = 24; + } + else if (memcmp(mode, "MODE1/2048", 10) == 0) + { + cdrom->sector_size = 2048; + cdrom->sector_header_size = 0; + } + else if (memcmp(mode, "MODE2/2336", 10) == 0) + { + cdrom->sector_size = 2336; + cdrom->sector_header_size = 8; + } + else if (memcmp(mode, "MODE1/2352", 10) == 0) + { + cdrom->sector_size = 2352; + cdrom->sector_header_size = 16; + } + else if (memcmp(mode, "AUDIO", 5) == 0) + { + cdrom->sector_size = 2352; + cdrom->sector_header_size = 0; + cdrom->raw_data_size = 2352; /* no header or footer data on audio tracks */ + } + } + + return (cdrom->sector_size != 0); +} + +static char* cdreader_get_bin_path(const char* cue_path, const char* bin_name, const rc_hash_iterator_t* iterator) +{ + const char* filename = rc_path_get_filename(cue_path); + const size_t bin_name_len = strlen(bin_name); + const size_t cue_path_len = filename - cue_path; + const size_t needed = cue_path_len + bin_name_len + 1; + + char* bin_filename = (char*)malloc(needed); + if (!bin_filename) + { + rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", (unsigned)needed); + } + else + { + memcpy(bin_filename, cue_path, cue_path_len); + memcpy(bin_filename + cue_path_len, bin_name, bin_name_len + 1); + } + + return bin_filename; +} + +static int64_t cdreader_get_bin_size(const char* cue_path, const char* bin_name, const rc_hash_iterator_t* iterator) +{ + int64_t size = 0; + char* bin_filename = cdreader_get_bin_path(cue_path, bin_name, iterator); + if (bin_filename) + { + void* handle = iterator->callbacks.filereader.open(bin_filename); + if (handle) + { + iterator->callbacks.filereader.seek(handle, 0, SEEK_END); + size = iterator->callbacks.filereader.tell(handle); + + if (iterator->callbacks.filereader.close) + iterator->callbacks.filereader.close(handle); + } + + free(bin_filename); + } + + return size; +} + +static void* cdreader_open_cue_track(const char* path, uint32_t track, const rc_hash_iterator_t* iterator) +{ + void* cue_handle; + int64_t cue_offset = 0; + char buffer[1024]; + char* bin_filename = NULL; + char *ptr, *ptr2, *end; + int done = 0; + int session = 1; + size_t num_read = 0; + rc_hash_cdrom_track_t* cdrom = NULL; + + struct track_t + { + uint32_t id; + int sector_size; + int sector_count; + int first_sector; + int pregap_sectors; + int is_data; + int file_track_offset; + int file_first_sector; + char mode[16]; + char filename[256]; + } current_track, previous_track, largest_track; + + cue_handle = iterator->callbacks.filereader.open(path); + if (!cue_handle) + return NULL; + + memset(¤t_track, 0, sizeof(current_track)); + memset(&previous_track, 0, sizeof(previous_track)); + memset(&largest_track, 0, sizeof(largest_track)); + + do + { + num_read = iterator->callbacks.filereader.read(cue_handle, buffer, sizeof(buffer) - 1); + if (num_read == 0) + break; + + buffer[num_read] = 0; + if (num_read == sizeof(buffer) - 1) + end = buffer + sizeof(buffer) * 3 / 4; + else + end = buffer + num_read; + + for (ptr = buffer; ptr < end; ++ptr) + { + while (*ptr == ' ') + ++ptr; + + if (strncasecmp(ptr, "INDEX ", 6) == 0) + { + int m = 0, s = 0, f = 0; + int index; + int sector_offset; + + ptr += 6; + index = atoi(ptr); + + while (*ptr != ' ' && *ptr != '\n') + ++ptr; + while (*ptr == ' ') + ++ptr; + + /* convert mm:ss:ff to sector count */ + sscanf_s(ptr, "%d:%d:%d", &m, &s, &f); + sector_offset = ((m * 60) + s) * 75 + f; + + if (current_track.first_sector == -1) + { + current_track.first_sector = sector_offset; + if (strcmp(current_track.filename, previous_track.filename) == 0) + { + previous_track.sector_count = current_track.first_sector - previous_track.first_sector; + current_track.file_track_offset += previous_track.sector_count * previous_track.sector_size; + } + + /* if looking for the largest data track, determine previous track size */ + if (track == RC_HASH_CDTRACK_LARGEST && previous_track.sector_count > largest_track.sector_count && + previous_track.is_data) + { + memcpy(&largest_track, &previous_track, sizeof(largest_track)); + } + } + + if (index == 1) + { + current_track.pregap_sectors = (sector_offset - current_track.first_sector); + + { + char* scan = current_track.mode; + while (*scan && !isspace((unsigned char)*scan)) + ++scan; + *scan = '\0'; + + /* it's undesirable to truncate offset to 32-bits, but %lld isn't defined in c89. */ + rc_hash_iterator_verbose_formatted(iterator, "Found %s track %d (first sector %d, sector size %d, %d pregap sectors)", + current_track.mode, current_track.id, current_track.first_sector, current_track.sector_size, current_track.pregap_sectors); + } + + if (current_track.id == track) + { + done = 1; + break; + } + + if (track == RC_HASH_CDTRACK_FIRST_DATA && current_track.is_data) + { + track = current_track.id; + done = 1; + break; + } + + if (track == RC_HASH_CDTRACK_FIRST_OF_SECOND_SESSION && session == 2) + { + track = current_track.id; + done = 1; + break; + } + } + } + else if (strncasecmp(ptr, "TRACK ", 6) == 0) + { + if (current_track.sector_size) + memcpy(&previous_track, ¤t_track, sizeof(current_track)); + + ptr += 6; + current_track.id = atoi(ptr); + + current_track.pregap_sectors = -1; + current_track.first_sector = -1; + + while (*ptr != ' ') + ++ptr; + while (*ptr == ' ') + ++ptr; + memcpy(current_track.mode, ptr, sizeof(current_track.mode)); + current_track.is_data = (memcmp(current_track.mode, "MODE", 4) == 0); + + if (current_track.is_data) + { + current_track.sector_size = atoi(ptr + 6); + } + else + { + /* assume AUDIO */ + current_track.sector_size = 2352; + } + } + else if (strncasecmp(ptr, "FILE ", 5) == 0) + { + if (current_track.sector_size) + { + memcpy(&previous_track, ¤t_track, sizeof(previous_track)); + + if (previous_track.sector_count == 0) + { + const int64_t bin_size = cdreader_get_bin_size(path, previous_track.filename, iterator); + const uint32_t file_sector_count = (uint32_t)bin_size / previous_track.sector_size; + previous_track.sector_count = file_sector_count - previous_track.first_sector; + } + + /* if looking for the largest data track, check to see if this one is larger */ + if (track == RC_HASH_CDTRACK_LARGEST && previous_track.is_data && + previous_track.sector_count > largest_track.sector_count) + { + memcpy(&largest_track, &previous_track, sizeof(largest_track)); + } + } + + memset(¤t_track, 0, sizeof(current_track)); + + current_track.file_first_sector = previous_track.file_first_sector + + previous_track.first_sector + previous_track.sector_count; + + ptr += 5; + ptr2 = ptr; + if (*ptr == '"') + { + ++ptr; + do + { + ++ptr2; + } while (*ptr2 && *ptr2 != '\n' && *ptr2 != '"'); + } + else + { + do + { + ++ptr2; + } while (*ptr2 && *ptr2 != '\n' && *ptr2 != ' '); + } + + if (ptr2 - ptr < (int)sizeof(current_track.filename)) + memcpy(current_track.filename, ptr, ptr2 - ptr); + } + else if (strncasecmp(ptr, "REM ", 4) == 0) + { + ptr += 4; + while (*ptr == ' ') + ++ptr; + + if (strncasecmp(ptr, "SESSION ", 8) == 0) + { + ptr += 8; + while (*ptr == ' ') + ++ptr; + session = atoi(ptr); + } + } + + while (*ptr && *ptr != '\n') + ++ptr; + } + + if (done) + break; + + cue_offset += (ptr - buffer); + iterator->callbacks.filereader.seek(cue_handle, cue_offset, SEEK_SET); + + } while (1); + + if (iterator->callbacks.filereader.close) + iterator->callbacks.filereader.close(cue_handle); + + if (track == RC_HASH_CDTRACK_LARGEST) + { + if (current_track.sector_size && current_track.is_data) + { + const int64_t bin_size = cdreader_get_bin_size(path, current_track.filename, iterator); + const uint32_t file_sector_count = (uint32_t)bin_size / current_track.sector_size; + current_track.sector_count = file_sector_count - current_track.first_sector; + + if (largest_track.sector_count > current_track.sector_count) + memcpy(¤t_track, &largest_track, sizeof(current_track)); + } + else + { + memcpy(¤t_track, &largest_track, sizeof(current_track)); + } + + track = current_track.id; + } + else if (track == RC_HASH_CDTRACK_LAST && !done) + { + track = current_track.id; + } + + if (current_track.id == track) + { + cdrom = (rc_hash_cdrom_track_t*)calloc(1, sizeof(*cdrom)); + if (!cdrom) + { + rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", (unsigned)sizeof(*cdrom)); + return NULL; + } + + cdrom->file_reader = &iterator->callbacks.filereader; + cdrom->file_track_offset = current_track.file_track_offset; + cdrom->track_pregap_sectors = current_track.pregap_sectors; + cdrom->track_first_sector = current_track.file_first_sector + current_track.first_sector; +#ifndef NDEBUG + cdrom->track_id = current_track.id; +#endif + + /* verify existance of bin file */ + bin_filename = cdreader_get_bin_path(path, current_track.filename, iterator); + if (bin_filename) + { + if (cdreader_open_bin(cdrom, bin_filename, current_track.mode)) + { + if (cdrom->track_pregap_sectors) + rc_hash_iterator_verbose_formatted(iterator, "Opened track %d (sector size %d, %d pregap sectors)", + track, cdrom->sector_size, cdrom->track_pregap_sectors); + else + rc_hash_iterator_verbose_formatted(iterator, "Opened track %d (sector size %d)", track, cdrom->sector_size); + } + else + { + if (cdrom->file_handle) + { + cdrom->file_reader->close(cdrom->file_handle); + rc_hash_iterator_error_formatted(iterator, "Could not determine sector size for %s track", current_track.mode); + } + else + { + rc_hash_iterator_error_formatted(iterator, "Could not open %s", bin_filename); + } + + free(cdrom); + cdrom = NULL; + } + + free(bin_filename); + } + } + + return cdrom; +} + +static void* cdreader_open_gdi_track(const char* path, uint32_t track, const rc_hash_iterator_t* iterator) +{ + void* file_handle; + char buffer[1024]; + char mode[16] = "MODE1/"; + char sector_size[16]; + char file[256]; + int64_t track_size; + int track_type; + char* bin_path = NULL; + uint32_t current_track = 0; + char* ptr, *ptr2, *end; + int lba = 0; + + uint32_t largest_track = 0; + int64_t largest_track_size = 0; + char largest_track_file[256]; + char largest_track_sector_size[16]; + int largest_track_lba = 0; + + int found = 0; + size_t num_read = 0; + int64_t file_offset = 0; + rc_hash_cdrom_track_t* cdrom = NULL; + + file_handle = iterator->callbacks.filereader.open(path); + if (!file_handle) + return NULL; + + file[0] = '\0'; + do + { + num_read = iterator->callbacks.filereader.read(file_handle, buffer, sizeof(buffer) - 1); + if (num_read == 0) + break; + + buffer[num_read] = 0; + if (num_read == sizeof(buffer) - 1) + end = buffer + sizeof(buffer) * 3 / 4; + else + end = buffer + num_read; + + ptr = buffer; + + /* the first line contains the number of tracks, so we can get the last track index from it */ + if (track == RC_HASH_CDTRACK_LAST) + track = atoi(ptr); + + /* first line contains the number of tracks and will be skipped */ + while (ptr < end) + { + /* skip until next newline */ + while (*ptr != '\n' && ptr < end) + ++ptr; + + /* skip newlines */ + while ((*ptr == '\n' || *ptr == '\r') && ptr < end) + ++ptr; + + /* line format: [trackid] [lba] [type] [sectorsize] [file] [?] */ + while (isspace((unsigned char)*ptr)) + ++ptr; + + current_track = (uint32_t)atoi(ptr); + if (track && current_track != track && track != RC_HASH_CDTRACK_FIRST_DATA) + continue; + + while (isdigit((unsigned char)*ptr)) + ++ptr; + ++ptr; + + while (isspace((unsigned char)*ptr)) + ++ptr; + + lba = atoi(ptr); + while (isdigit((unsigned char)*ptr)) + ++ptr; + ++ptr; + + while (isspace((unsigned char)*ptr)) + ++ptr; + + track_type = atoi(ptr); + while (isdigit((unsigned char)*ptr)) + ++ptr; + ++ptr; + + while (isspace((unsigned char)*ptr)) + ++ptr; + + ptr2 = sector_size; + while (isdigit((unsigned char)*ptr)) + *ptr2++ = *ptr++; + *ptr2 = '\0'; + ++ptr; + + while (isspace((unsigned char)*ptr)) + ++ptr; + + ptr2 = file; + if (*ptr == '\"') + { + ++ptr; + while (*ptr != '\"') + *ptr2++ = *ptr++; + ++ptr; + } + else + { + while (*ptr != ' ') + *ptr2++ = *ptr++; + } + *ptr2 = '\0'; + + if (track == current_track) + { + found = 1; + break; + } + else if (track == RC_HASH_CDTRACK_FIRST_DATA && track_type == 4) + { + track = current_track; + found = 1; + break; + } + else if (track == RC_HASH_CDTRACK_LARGEST && track_type == 4) + { + track_size = cdreader_get_bin_size(path, file, iterator); + if (track_size > largest_track_size) + { + largest_track_size = track_size; + largest_track = current_track; + largest_track_lba = lba; + strcpy_s(largest_track_file, sizeof(largest_track_file), file); + strcpy_s(largest_track_sector_size, sizeof(largest_track_sector_size), sector_size); + } + } + } + + if (found) + break; + + file_offset += (ptr - buffer); + iterator->callbacks.filereader.seek(file_handle, file_offset, SEEK_SET); + + } while (1); + + if (iterator->callbacks.filereader.close) + iterator->callbacks.filereader.close(file_handle); + + cdrom = (rc_hash_cdrom_track_t*)calloc(1, sizeof(*cdrom)); + if (!cdrom) + { + rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", (unsigned)sizeof(*cdrom)); + return NULL; + } + + cdrom->file_reader = &iterator->callbacks.filereader; + + /* if we were tracking the largest track, make it the current track. + * otherwise, current_track will be the requested track, or last track. */ + if (largest_track != 0 && largest_track != current_track) + { + current_track = largest_track; + strcpy_s(file, sizeof(file), largest_track_file); + strcpy_s(sector_size, sizeof(sector_size), largest_track_sector_size); + lba = largest_track_lba; + } + + /* open the bin file for the track - construct mode parameter from sector_size */ + ptr = &mode[6]; + ptr2 = sector_size; + while (*ptr2 && *ptr2 != '\"') + *ptr++ = *ptr2++; + *ptr = '\0'; + + bin_path = cdreader_get_bin_path(path, file, iterator); + if (cdreader_open_bin(cdrom, bin_path, mode)) + { + cdrom->track_pregap_sectors = 0; + cdrom->track_first_sector = lba; +#ifndef NDEBUG + cdrom->track_id = current_track; +#endif + + rc_hash_iterator_verbose_formatted(iterator, "Opened track %d (sector size %d)", current_track, cdrom->sector_size); + } + else + { + rc_hash_iterator_error_formatted(iterator, "Could not open %s", bin_path); + + free(cdrom); + cdrom = NULL; + } + + free(bin_path); + + return cdrom; +} + +static void* cdreader_open_track_iterator(const char* path, uint32_t track, const rc_hash_iterator_t* iterator) +{ + /* backwards compatibility - 0 used to mean largest */ + if (track == 0) + track = RC_HASH_CDTRACK_LARGEST; + + if (rc_path_compare_extension(path, "cue")) + return cdreader_open_cue_track(path, track, iterator); + if (rc_path_compare_extension(path, "gdi")) + return cdreader_open_gdi_track(path, track, iterator); + + return cdreader_open_bin_track(path, track, iterator); +} + +static size_t cdreader_read_sector(void* track_handle, uint32_t sector, void* buffer, size_t requested_bytes) +{ + int64_t sector_start; + size_t num_read, total_read = 0; + uint8_t* buffer_ptr = (uint8_t*)buffer; + + rc_hash_cdrom_track_t* cdrom = (rc_hash_cdrom_track_t*)track_handle; + if (!cdrom) + return 0; + + if (sector < (uint32_t)cdrom->track_first_sector) + return 0; + + sector_start = (int64_t)(sector - cdrom->track_first_sector) * cdrom->sector_size + + cdrom->sector_header_size + cdrom->file_track_offset; + + while (requested_bytes > (size_t)cdrom->raw_data_size) + { + cdrom->file_reader->seek(cdrom->file_handle, sector_start, SEEK_SET); + num_read = cdrom->file_reader->read(cdrom->file_handle, buffer_ptr, cdrom->raw_data_size); + total_read += num_read; + + if (num_read < (size_t)cdrom->raw_data_size) + return total_read; + + buffer_ptr += cdrom->raw_data_size; + sector_start += cdrom->sector_size; + requested_bytes -= cdrom->raw_data_size; + } + + cdrom->file_reader->seek(cdrom->file_handle, sector_start, SEEK_SET); + num_read = cdrom->file_reader->read(cdrom->file_handle, buffer_ptr, (int)requested_bytes); + total_read += num_read; + + return total_read; +} + +static void cdreader_close_track(void* track_handle) +{ + rc_hash_cdrom_track_t* cdrom = (rc_hash_cdrom_track_t*)track_handle; + if (cdrom) + { + if (cdrom->file_handle && cdrom->file_reader->close) + cdrom->file_reader->close(cdrom->file_handle); + + free(track_handle); + } +} + +static uint32_t cdreader_first_track_sector(void* track_handle) +{ + rc_hash_cdrom_track_t* cdrom = (rc_hash_cdrom_track_t*)track_handle; + if (cdrom) + return cdrom->track_first_sector + cdrom->track_pregap_sectors; + + return 0; +} + +void rc_hash_get_default_cdreader(struct rc_hash_cdreader* cdreader) +{ + cdreader->open_track = NULL; + cdreader->read_sector = cdreader_read_sector; + cdreader->close_track = cdreader_close_track; + cdreader->first_track_sector = cdreader_first_track_sector; + cdreader->open_track_iterator = cdreader_open_track_iterator; +} + +void rc_hash_init_default_cdreader(void) +{ + struct rc_hash_cdreader cdreader; + rc_hash_get_default_cdreader(&cdreader); + rc_hash_init_custom_cdreader(&cdreader); +} diff --git a/src/rcheevos/src/rhash/hash.c b/src/rcheevos/src/rhash/hash.c new file mode 100644 index 0000000000..fe6f3ca9d0 --- /dev/null +++ b/src/rcheevos/src/rhash/hash.c @@ -0,0 +1,1402 @@ +#include "rc_hash.h" + +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#include +#endif + +#include +#include + +const char* rc_path_get_filename(const char* path); +static int rc_hash_from_file(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator); + +/* ===================================================== */ + +static rc_hash_message_callback_deprecated g_error_message_callback = NULL; +static rc_hash_message_callback_deprecated g_verbose_message_callback = NULL; + +static void rc_hash_call_g_error_message_callback(const char* message, const rc_hash_iterator_t* iterator) +{ + (void)iterator; + g_error_message_callback(message); +} + +static void rc_hash_call_g_verbose_message_callback(const char* message, const rc_hash_iterator_t* iterator) +{ + (void)iterator; + g_verbose_message_callback(message); +} + +static void rc_hash_dispatch_message_va(const rc_hash_message_callback_func callback, + const rc_hash_iterator_t* iterator, const char* format, va_list args) +{ + char buffer[1024]; + +#ifdef __STDC_SECURE_LIB__ + vsprintf_s(buffer, sizeof(buffer), format, args); +#elif __STDC_VERSION__ >= 199901L /* vsnprintf requires c99 */ + vsnprintf(buffer, sizeof(buffer), format, args); +#else /* c89 doesn't have a size-limited vsprintf function - assume the buffer is large enough */ + vsprintf(buffer, format, args); +#endif + + callback(buffer, iterator); +} + +void rc_hash_init_error_message_callback(rc_hash_message_callback_deprecated callback) +{ + g_error_message_callback = callback; +} + +static rc_hash_message_callback_func rc_hash_get_error_message_callback(const rc_hash_callbacks_t* callbacks) +{ + if (callbacks && callbacks->error_message) + return callbacks->error_message; + + if (g_error_message_callback) + return rc_hash_call_g_error_message_callback; + + if (callbacks && callbacks->verbose_message) + return callbacks->verbose_message; + + if (g_verbose_message_callback) + return rc_hash_call_g_verbose_message_callback; + + return NULL; +} + +int rc_hash_iterator_error(const rc_hash_iterator_t* iterator, const char* message) +{ + rc_hash_message_callback_func message_callback = rc_hash_get_error_message_callback(&iterator->callbacks); + + if (message_callback) + message_callback(message, iterator); + + return 0; +} + +int rc_hash_iterator_error_formatted(const rc_hash_iterator_t* iterator, const char* format, ...) +{ + rc_hash_message_callback_func message_callback = rc_hash_get_error_message_callback(&iterator->callbacks); + + if (message_callback) { + va_list args; + va_start(args, format); + rc_hash_dispatch_message_va(message_callback, iterator, format, args); + va_end(args); + } + + return 0; +} + +void rc_hash_init_verbose_message_callback(rc_hash_message_callback_deprecated callback) +{ + g_verbose_message_callback = callback; +} + +void rc_hash_iterator_verbose(const rc_hash_iterator_t* iterator, const char* message) +{ + if (iterator->callbacks.verbose_message) + iterator->callbacks.verbose_message(message, iterator); + else if (g_verbose_message_callback) + g_verbose_message_callback(message); +} + +void rc_hash_iterator_verbose_formatted(const rc_hash_iterator_t* iterator, const char* format, ...) +{ + if (iterator->callbacks.verbose_message) { + va_list args; + va_start(args, format); + rc_hash_dispatch_message_va(iterator->callbacks.verbose_message, iterator, format, args); + va_end(args); + } + else if (g_verbose_message_callback) { + va_list args; + va_start(args, format); + rc_hash_dispatch_message_va(rc_hash_call_g_verbose_message_callback, iterator, format, args); + va_end(args); + } +} + +/* ===================================================== */ + +static struct rc_hash_filereader g_filereader_funcs; +static struct rc_hash_filereader* g_filereader = NULL; + +#if defined(WINVER) && WINVER >= 0x0500 +static void* filereader_open(const char* path) +{ + /* Windows requires using wchar APIs for Unicode paths */ + /* Note that MultiByteToWideChar will only be defined for >= Windows 2000 */ + wchar_t* wpath; + int wpath_length; + FILE* fp; + + /* Calculate wpath length from path */ + wpath_length = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, NULL, 0); + if (wpath_length == 0) /* 0 indicates error (this is likely from invalid UTF-8) */ + return NULL; + + wpath = (wchar_t*)malloc(wpath_length * sizeof(wchar_t)); + if (!wpath) + return NULL; + + if (MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, wpath_length) == 0) { + free(wpath); + return NULL; + } + + #if defined(__STDC_SECURE_LIB__) + /* have to use _SH_DENYNO because some cores lock the file while its loaded */ + fp = _wfsopen(wpath, L"rb", _SH_DENYNO); + #else + fp = _wfopen(wpath, L"rb"); + #endif + + free(wpath); + return fp; +} +#else /* !WINVER >= 0x0500 */ +static void* filereader_open(const char* path) +{ + #if defined(__STDC_SECURE_LIB__) + #if defined(WINVER) + /* have to use _SH_DENYNO because some cores lock the file while its loaded */ + return _fsopen(path, "rb", _SH_DENYNO); + #else /* !WINVER */ + FILE *fp; + fopen_s(&fp, path, "rb"); + return fp; + #endif + #else /* !__STDC_SECURE_LIB__ */ + return fopen(path, "rb"); + #endif +} +#endif /* WINVER >= 0x0500 */ + +static void filereader_seek(void* file_handle, int64_t offset, int origin) +{ +#if defined(_WIN32) + _fseeki64((FILE*)file_handle, offset, origin); +#elif defined(_LARGEFILE64_SOURCE) + fseeko64((FILE*)file_handle, offset, origin); +#else + fseek((FILE*)file_handle, offset, origin); +#endif +} + +static int64_t filereader_tell(void* file_handle) +{ +#if defined(_WIN32) + return _ftelli64((FILE*)file_handle); +#elif defined(_LARGEFILE64_SOURCE) + return ftello64((FILE*)file_handle); +#else + return ftell((FILE*)file_handle); +#endif +} + +static size_t filereader_read(void* file_handle, void* buffer, size_t requested_bytes) +{ + return fread(buffer, 1, requested_bytes, (FILE*)file_handle); +} + +static void filereader_close(void* file_handle) +{ + fclose((FILE*)file_handle); +} + +/* for unit tests - normally would call rc_hash_init_custom_filereader(NULL) */ +void rc_hash_reset_filereader(void) +{ + g_filereader = NULL; +} + +void rc_hash_init_custom_filereader(struct rc_hash_filereader* reader) +{ + /* initialize with defaults first */ + g_filereader_funcs.open = filereader_open; + g_filereader_funcs.seek = filereader_seek; + g_filereader_funcs.tell = filereader_tell; + g_filereader_funcs.read = filereader_read; + g_filereader_funcs.close = filereader_close; + + /* hook up any provided custom handlers */ + if (reader) { + if (reader->open) + g_filereader_funcs.open = reader->open; + + if (reader->seek) + g_filereader_funcs.seek = reader->seek; + + if (reader->tell) + g_filereader_funcs.tell = reader->tell; + + if (reader->read) + g_filereader_funcs.read = reader->read; + + if (reader->close) + g_filereader_funcs.close = reader->close; + } + + g_filereader = &g_filereader_funcs; +} + +void* rc_file_open(const rc_hash_iterator_t* iterator, const char* path) +{ + void* handle = NULL; + + if (!iterator->callbacks.filereader.open) { + rc_hash_iterator_error(iterator, "No callback registered for opening files"); + } else { + handle = iterator->callbacks.filereader.open(path); + if (handle) + rc_hash_iterator_verbose_formatted(iterator, "Opened %s", rc_path_get_filename(path)); + } + + return handle; +} + +void rc_file_seek(const rc_hash_iterator_t* iterator, void* file_handle, int64_t offset, int origin) +{ + if (iterator->callbacks.filereader.seek) + iterator->callbacks.filereader.seek(file_handle, offset, origin); +} + +int64_t rc_file_tell(const rc_hash_iterator_t* iterator, void* file_handle) +{ + return iterator->callbacks.filereader.tell ? iterator->callbacks.filereader.tell(file_handle) : 0; +} + +size_t rc_file_read(const rc_hash_iterator_t* iterator, void* file_handle, void* buffer, int requested_bytes) +{ + return iterator->callbacks.filereader.read ? iterator->callbacks.filereader.read(file_handle, buffer, requested_bytes) : 0; +} + +void rc_file_close(const rc_hash_iterator_t* iterator, void* file_handle) +{ + if (iterator->callbacks.filereader.close) + iterator->callbacks.filereader.close(file_handle); +} + +int64_t rc_file_size(const rc_hash_iterator_t* iterator, const char* path) +{ + int64_t size = 0; + + /* don't use rc_file_open to avoid log statements */ + if (!iterator->callbacks.filereader.open) { + rc_hash_iterator_error(iterator, "No callback registered for opening files"); + } else { + void* handle = iterator->callbacks.filereader.open(path); + if (handle) { + rc_file_seek(iterator, handle, 0, SEEK_END); + size = rc_file_tell(iterator, handle); + rc_file_close(iterator, handle); + } + } + + return size; +} + +/* ===================================================== */ + +const char* rc_path_get_filename(const char* path) +{ + const char* ptr = path + strlen(path); + do { + if (ptr[-1] == '/' || ptr[-1] == '\\') + break; + + --ptr; + } while (ptr > path); + + return ptr; +} + +const char* rc_path_get_extension(const char* path) +{ + const char* ptr = path + strlen(path); + do { + if (ptr[-1] == '.') + return ptr; + + --ptr; + } while (ptr > path); + + return path + strlen(path); +} + +int rc_path_compare_extension(const char* path, const char* ext) +{ + size_t path_len = strlen(path); + size_t ext_len = strlen(ext); + const char* ptr = path + path_len - ext_len; + if (ptr[-1] != '.') + return 0; + + if (memcmp(ptr, ext, ext_len) == 0) + return 1; + + do { + if (tolower(*ptr) != *ext) + return 0; + + ++ext; + ++ptr; + } while (*ptr); + + return 1; +} + +/* ===================================================== */ + +void rc_hash_byteswap16(uint8_t* buffer, const uint8_t* stop) +{ + uint32_t* ptr = (uint32_t*)buffer; + const uint32_t* stop32 = (const uint32_t*)stop; + while (ptr < stop32) { + uint32_t temp = *ptr; + temp = (temp & 0xFF00FF00) >> 8 | + (temp & 0x00FF00FF) << 8; + *ptr++ = temp; + } +} + +void rc_hash_byteswap32(uint8_t* buffer, const uint8_t* stop) +{ + uint32_t* ptr = (uint32_t*)buffer; + const uint32_t* stop32 = (const uint32_t*)stop; + while (ptr < stop32) { + uint32_t temp = *ptr; + temp = (temp & 0xFF000000) >> 24 | + (temp & 0x00FF0000) >> 8 | + (temp & 0x0000FF00) << 8 | + (temp & 0x000000FF) << 24; + *ptr++ = temp; + } +} + +int rc_hash_finalize(const rc_hash_iterator_t* iterator, md5_state_t* md5, char hash[33]) +{ + md5_byte_t digest[16]; + + md5_finish(md5, digest); + + /* NOTE: sizeof(hash) is 4 because it's still treated like a pointer, despite specifying a size */ + snprintf(hash, 33, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15] + ); + + rc_hash_iterator_verbose_formatted(iterator, "Generated hash %s", hash); + + return 1; +} + +int rc_hash_buffer(char hash[33], const uint8_t* buffer, size_t buffer_size, const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + + if (buffer_size > MAX_BUFFER_SIZE) + buffer_size = MAX_BUFFER_SIZE; + + md5_init(&md5); + + md5_append(&md5, buffer, (int)buffer_size); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte buffer", (unsigned)buffer_size); + + return rc_hash_finalize(iterator, &md5, hash); +} + +struct rc_buffered_file +{ + const uint8_t* read_ptr; + const uint8_t* data; + size_t data_size; +}; + +static struct rc_buffered_file rc_buffered_file; + +static void* rc_file_open_buffered_file(const char* path) +{ + struct rc_buffered_file* handle = (struct rc_buffered_file*)malloc(sizeof(struct rc_buffered_file)); + (void)path; + + if (handle) + memcpy(handle, &rc_buffered_file, sizeof(rc_buffered_file)); + + return handle; +} + +static void rc_file_seek_buffered_file(void* file_handle, int64_t offset, int origin) +{ + struct rc_buffered_file* buffered_file = (struct rc_buffered_file*)file_handle; + switch (origin) { + case SEEK_SET: buffered_file->read_ptr = buffered_file->data + offset; break; + case SEEK_CUR: buffered_file->read_ptr += offset; break; + case SEEK_END: buffered_file->read_ptr = buffered_file->data + buffered_file->data_size + offset; break; + } + + if (buffered_file->read_ptr < buffered_file->data) + buffered_file->read_ptr = buffered_file->data; + else if (buffered_file->read_ptr > buffered_file->data + buffered_file->data_size) + buffered_file->read_ptr = buffered_file->data + buffered_file->data_size; +} + +static int64_t rc_file_tell_buffered_file(void* file_handle) +{ + struct rc_buffered_file* buffered_file = (struct rc_buffered_file*)file_handle; + return (buffered_file->read_ptr - buffered_file->data); +} + +static size_t rc_file_read_buffered_file(void* file_handle, void* buffer, size_t requested_bytes) +{ + struct rc_buffered_file* buffered_file = (struct rc_buffered_file*)file_handle; + const int64_t remaining = buffered_file->data_size - (buffered_file->read_ptr - buffered_file->data); + if ((int)requested_bytes > remaining) + requested_bytes = (int)remaining; + + memcpy(buffer, buffered_file->read_ptr, requested_bytes); + buffered_file->read_ptr += requested_bytes; + return requested_bytes; +} + +static void rc_file_close_buffered_file(void* file_handle) +{ + free(file_handle); +} + +static int rc_hash_file_from_buffer(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) +{ + int result; + + rc_hash_iterator_t buffered_file_iterator; + memset(&buffered_file_iterator, 0, sizeof(buffered_file_iterator)); + memcpy(&buffered_file_iterator.callbacks, &iterator->callbacks, sizeof(iterator->callbacks)); + buffered_file_iterator.userdata = iterator->userdata; + + buffered_file_iterator.callbacks.filereader.open = rc_file_open_buffered_file; + buffered_file_iterator.callbacks.filereader.close = rc_file_close_buffered_file; + buffered_file_iterator.callbacks.filereader.read = rc_file_read_buffered_file; + buffered_file_iterator.callbacks.filereader.seek = rc_file_seek_buffered_file; + buffered_file_iterator.callbacks.filereader.tell = rc_file_tell_buffered_file; + buffered_file_iterator.path = "memory stream"; + + rc_buffered_file.data = rc_buffered_file.read_ptr = iterator->buffer; + rc_buffered_file.data_size = iterator->buffer_size; + + result = rc_hash_from_file(hash, console_id, &buffered_file_iterator); + + buffered_file_iterator.path = NULL; + rc_hash_destroy_iterator(&buffered_file_iterator); + return result; +} + +static int rc_hash_from_buffer(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) +{ + switch (console_id) { + default: + return rc_hash_iterator_error_formatted(iterator, "Unsupported console for buffer hash: %d", console_id); + + case RC_CONSOLE_AMSTRAD_PC: + case RC_CONSOLE_APPLE_II: + case RC_CONSOLE_ARCADIA_2001: + case RC_CONSOLE_ATARI_2600: + case RC_CONSOLE_ATARI_JAGUAR: + case RC_CONSOLE_COLECOVISION: + case RC_CONSOLE_COMMODORE_64: + case RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER: + case RC_CONSOLE_FAIRCHILD_CHANNEL_F: + case RC_CONSOLE_GAMEBOY: + case RC_CONSOLE_GAMEBOY_ADVANCE: + case RC_CONSOLE_GAMEBOY_COLOR: + case RC_CONSOLE_GAME_GEAR: + case RC_CONSOLE_INTELLIVISION: + case RC_CONSOLE_INTERTON_VC_4000: + case RC_CONSOLE_MAGNAVOX_ODYSSEY2: + case RC_CONSOLE_MASTER_SYSTEM: + case RC_CONSOLE_MEGA_DRIVE: + case RC_CONSOLE_MEGADUCK: + case RC_CONSOLE_MSX: + case RC_CONSOLE_NEOGEO_POCKET: + case RC_CONSOLE_ORIC: + case RC_CONSOLE_PC8800: + case RC_CONSOLE_POKEMON_MINI: + case RC_CONSOLE_SEGA_32X: + case RC_CONSOLE_SG1000: + case RC_CONSOLE_SUPERVISION: + case RC_CONSOLE_TI83: + case RC_CONSOLE_TIC80: + case RC_CONSOLE_UZEBOX: + case RC_CONSOLE_VECTREX: + case RC_CONSOLE_VIRTUAL_BOY: + case RC_CONSOLE_WASM4: + case RC_CONSOLE_WONDERSWAN: + case RC_CONSOLE_ZX_SPECTRUM: + return rc_hash_buffer(hash, iterator->buffer, iterator->buffer_size, iterator); + +#ifndef RC_HASH_NO_ROM + case RC_CONSOLE_ARDUBOY: + return rc_hash_arduboy(hash, iterator); + + case RC_CONSOLE_ATARI_7800: + return rc_hash_7800(hash, iterator); + + case RC_CONSOLE_ATARI_LYNX: + return rc_hash_lynx(hash, iterator); + + case RC_CONSOLE_FAMICOM_DISK_SYSTEM: + case RC_CONSOLE_NINTENDO: + return rc_hash_nes(hash, iterator); + + case RC_CONSOLE_PC_ENGINE: /* NOTE: does not support PCEngine CD */ + return rc_hash_pce(hash, iterator); + + case RC_CONSOLE_SUPER_CASSETTEVISION: + return rc_hash_scv(hash, iterator); + + case RC_CONSOLE_SUPER_NINTENDO: + return rc_hash_snes(hash, iterator); +#endif + + case RC_CONSOLE_NINTENDO_64: + case RC_CONSOLE_NINTENDO_3DS: + case RC_CONSOLE_NINTENDO_DS: + case RC_CONSOLE_NINTENDO_DSI: + return rc_hash_file_from_buffer(hash, console_id, iterator); + } +} + +int rc_hash_whole_file(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + uint8_t* buffer; + int64_t size; + const size_t buffer_size = 65536; + void* file_handle; + size_t remaining; + int result = 0; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + rc_file_seek(iterator, file_handle, 0, SEEK_END); + size = rc_file_tell(iterator, file_handle); + + if (size > MAX_BUFFER_SIZE) { + rc_hash_iterator_verbose_formatted(iterator, "Hashing first %u bytes (of %u bytes) of %s", MAX_BUFFER_SIZE, (unsigned)size, rc_path_get_filename(iterator->path)); + remaining = MAX_BUFFER_SIZE; + } + else { + rc_hash_iterator_verbose_formatted(iterator, "Hashing %s (%u bytes)", rc_path_get_filename(iterator->path), (unsigned)size); + remaining = (size_t)size; + } + + md5_init(&md5); + + buffer = (uint8_t*)malloc(buffer_size); + if (buffer) { + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + while (remaining >= buffer_size) { + rc_file_read(iterator, file_handle, buffer, (int)buffer_size); + md5_append(&md5, buffer, (int)buffer_size); + remaining -= buffer_size; + } + + if (remaining > 0) { + rc_file_read(iterator, file_handle, buffer, (int)remaining); + md5_append(&md5, buffer, (int)remaining); + } + + free(buffer); + result = rc_hash_finalize(iterator, &md5, hash); + } + + rc_file_close(iterator, file_handle); + return result; +} + +int rc_hash_buffered_file(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) +{ + uint8_t* buffer; + int64_t size; + int result = 0; + void* file_handle; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + rc_file_seek(iterator, file_handle, 0, SEEK_END); + size = rc_file_tell(iterator, file_handle); + + if (size > MAX_BUFFER_SIZE) { + rc_hash_iterator_verbose_formatted(iterator, "Buffering first %u bytes (of %d bytes) of %s", MAX_BUFFER_SIZE, (unsigned)size, rc_path_get_filename(iterator->path)); + size = MAX_BUFFER_SIZE; + } + else { + rc_hash_iterator_verbose_formatted(iterator, "Buffering %s (%d bytes)", rc_path_get_filename(iterator->path), (unsigned)size); + } + + buffer = (uint8_t*)malloc((size_t)size); + if (buffer) { + rc_hash_iterator_t buffer_iterator; + memset(&buffer_iterator, 0, sizeof(buffer_iterator)); + memcpy(&buffer_iterator.callbacks, &iterator->callbacks, sizeof(iterator->callbacks)); + buffer_iterator.userdata = iterator->userdata; + buffer_iterator.path = iterator->path; + buffer_iterator.buffer = buffer; + buffer_iterator.buffer_size = (size_t)size; + + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, (int)size); + + result = rc_hash_from_buffer(hash, console_id, &buffer_iterator); + + free(buffer); + } + + rc_file_close(iterator, file_handle); + return result; +} + +static int rc_hash_path_is_absolute(const char* path) +{ + if (!path[0]) + return 0; + + /* "/path/to/file" or "\path\to\file" */ + if (path[0] == '/' || path[0] == '\\') + return 1; + + /* "C:\path\to\file" */ + if (path[1] == ':' && path[2] == '\\') + return 1; + + /* "scheme:/path/to/file" */ + while (*path) { + if (path[0] == ':' && path[1] == '/') + return 1; + + ++path; + } + + return 0; +} + +static const char* rc_hash_get_first_item_from_playlist(const rc_hash_iterator_t* iterator) { + char buffer[1024]; + char* disc_path; + char* ptr, *start, *next; + size_t num_read, path_len, file_len; + void* file_handle; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) { + rc_hash_iterator_error(iterator, "Could not open playlist"); + return NULL; + } + + num_read = rc_file_read(iterator, file_handle, buffer, sizeof(buffer) - 1); + buffer[num_read] = '\0'; + + rc_file_close(iterator, file_handle); + + ptr = start = buffer; + do { + /* ignore empty and commented lines */ + while (*ptr == '#' || *ptr == '\r' || *ptr == '\n') { + while (*ptr && *ptr != '\n') + ++ptr; + if (*ptr) + ++ptr; + } + + /* find and extract the current line */ + start = ptr; + while (*ptr && *ptr != '\n') + ++ptr; + next = ptr; + + /* remove trailing whitespace - especially '\r' */ + while (ptr > start && isspace((unsigned char)ptr[-1])) + --ptr; + + /* if we found a non-empty line, break out of the loop to process it */ + file_len = ptr - start; + if (file_len) + break; + + /* did we reach the end of the file? */ + if (!*next) + return NULL; + + /* if the line only contained whitespace, keep searching */ + ptr = next + 1; + } while (1); + + rc_hash_iterator_verbose_formatted(iterator, "Extracted %.*s from playlist", (int)file_len, start); + + start[file_len++] = '\0'; + if (rc_hash_path_is_absolute(start)) + path_len = 0; + else + path_len = rc_path_get_filename(iterator->path) - iterator->path; + + disc_path = (char*)malloc(path_len + file_len + 1); + if (!disc_path) + return NULL; + + if (path_len) + memcpy(disc_path, iterator->path, path_len); + + memcpy(&disc_path[path_len], start, file_len); + return disc_path; +} + +static int rc_hash_generate_from_playlist(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) { + rc_hash_iterator_t first_file_iterator; + const char* disc_path; + int result; + + rc_hash_iterator_verbose_formatted(iterator, "Processing playlist: %s", rc_path_get_filename(iterator->path)); + + disc_path = rc_hash_get_first_item_from_playlist(iterator); + if (!disc_path) + return rc_hash_iterator_error(iterator, "Failed to get first item from playlist"); + + memset(&first_file_iterator, 0, sizeof(first_file_iterator)); + memcpy(&first_file_iterator.callbacks, &iterator->callbacks, sizeof(iterator->callbacks)); + first_file_iterator.userdata = iterator->userdata; + first_file_iterator.path = disc_path; /* rc_hash_destory_iterator will free */ + + result = rc_hash_from_file(hash, console_id, &first_file_iterator); + + rc_hash_destroy_iterator(&first_file_iterator); + return result; +} + +static int rc_hash_from_file(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) +{ + const char* path = iterator->path; + + switch (console_id) { + default: + return rc_hash_iterator_error_formatted(iterator, "Unsupported console for file hash: %d", console_id); + + case RC_CONSOLE_ARCADIA_2001: + case RC_CONSOLE_ATARI_2600: + case RC_CONSOLE_ATARI_JAGUAR: + case RC_CONSOLE_COLECOVISION: + case RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER: + case RC_CONSOLE_FAIRCHILD_CHANNEL_F: + case RC_CONSOLE_GAMEBOY: + case RC_CONSOLE_GAMEBOY_ADVANCE: + case RC_CONSOLE_GAMEBOY_COLOR: + case RC_CONSOLE_GAME_GEAR: + case RC_CONSOLE_INTELLIVISION: + case RC_CONSOLE_INTERTON_VC_4000: + case RC_CONSOLE_MAGNAVOX_ODYSSEY2: + case RC_CONSOLE_MASTER_SYSTEM: + case RC_CONSOLE_MEGADUCK: + case RC_CONSOLE_NEOGEO_POCKET: + case RC_CONSOLE_ORIC: + case RC_CONSOLE_POKEMON_MINI: + case RC_CONSOLE_SEGA_32X: + case RC_CONSOLE_SG1000: + case RC_CONSOLE_SUPERVISION: + case RC_CONSOLE_TI83: + case RC_CONSOLE_TIC80: + case RC_CONSOLE_UZEBOX: + case RC_CONSOLE_VECTREX: + case RC_CONSOLE_VIRTUAL_BOY: + case RC_CONSOLE_WASM4: + case RC_CONSOLE_WONDERSWAN: + case RC_CONSOLE_ZX_SPECTRUM: + /* generic whole-file hash - don't buffer */ + return rc_hash_whole_file(hash, iterator); + + case RC_CONSOLE_MEGA_DRIVE: + /* generic whole-file hash with m3u support - don't buffer */ + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_whole_file(hash, iterator); + + case RC_CONSOLE_ATARI_7800: + case RC_CONSOLE_ATARI_LYNX: + case RC_CONSOLE_FAMICOM_DISK_SYSTEM: + case RC_CONSOLE_NINTENDO: + case RC_CONSOLE_PC_ENGINE: + case RC_CONSOLE_SUPER_CASSETTEVISION: + case RC_CONSOLE_SUPER_NINTENDO: + /* additional logic whole-file hash - buffer then call rc_hash_generate_from_buffer */ + return rc_hash_buffered_file(hash, console_id, iterator); + + case RC_CONSOLE_AMSTRAD_PC: + case RC_CONSOLE_APPLE_II: + case RC_CONSOLE_COMMODORE_64: + case RC_CONSOLE_MSX: + case RC_CONSOLE_PC8800: + /* generic whole-file hash with m3u support - don't buffer */ + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_whole_file(hash, iterator); + +#ifndef RC_HASH_NO_DISC + case RC_CONSOLE_3DO: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_3do(hash, iterator); +#endif + +#ifndef RC_HASH_NO_ROM + case RC_CONSOLE_ARCADE: + return rc_hash_arcade(hash, iterator); + + case RC_CONSOLE_ARDUBOY: + return rc_hash_arduboy(hash, iterator); +#endif + +#ifndef RC_HASH_NO_DISC + case RC_CONSOLE_ATARI_JAGUAR_CD: + return rc_hash_jaguar_cd(hash, iterator); + + case RC_CONSOLE_DREAMCAST: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_dreamcast(hash, iterator); + + case RC_CONSOLE_GAMECUBE: + return rc_hash_gamecube(hash, iterator); +#endif + +#ifndef RC_HASH_NO_ZIP + case RC_CONSOLE_MS_DOS: + return rc_hash_ms_dos(hash, iterator); +#endif + +#ifndef RC_HASH_NO_DISC + case RC_CONSOLE_NEO_GEO_CD: + return rc_hash_neogeo_cd(hash, iterator); +#endif + +#ifndef RC_HASH_NO_ROM + case RC_CONSOLE_NINTENDO_64: + return rc_hash_n64(hash, iterator); +#endif + +#ifndef RC_HASH_NO_ENCRYPTED + case RC_CONSOLE_NINTENDO_3DS: + return rc_hash_nintendo_3ds(hash, iterator); +#endif + +#ifndef RC_HASH_NO_ROM + case RC_CONSOLE_NINTENDO_DS: + case RC_CONSOLE_NINTENDO_DSI: + return rc_hash_nintendo_ds(hash, iterator); +#endif + +#ifndef RC_HASH_NO_DISC + case RC_CONSOLE_PC_ENGINE_CD: + if (rc_path_compare_extension(path, "cue") || rc_path_compare_extension(path, "chd")) + return rc_hash_pce_cd(hash, iterator); + + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_buffered_file(hash, console_id, iterator); + + case RC_CONSOLE_PCFX: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_pcfx_cd(hash, iterator); + + case RC_CONSOLE_PLAYSTATION: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_psx(hash, iterator); + + case RC_CONSOLE_PLAYSTATION_2: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_ps2(hash, iterator); + + case RC_CONSOLE_PSP: + return rc_hash_psp(hash, iterator); + + case RC_CONSOLE_SEGA_CD: + case RC_CONSOLE_SATURN: + if (rc_path_compare_extension(path, "m3u")) + return rc_hash_generate_from_playlist(hash, console_id, iterator); + + return rc_hash_sega_cd(hash, iterator); + + case RC_CONSOLE_WII: + return rc_hash_wii(hash, iterator); +#endif + } +} + +static void rc_hash_initialize_iterator_from_path(rc_hash_iterator_t* iterator, const char* path); + +static void rc_hash_iterator_append_console(struct rc_hash_iterator* iterator, uint8_t console_id) { + int i = 0; + while (iterator->consoles[i] != 0) { + if (iterator->consoles[i] == console_id) + return; + + ++i; + } + + iterator->consoles[i] = console_id; +} + +void rc_hash_merge_callbacks(rc_hash_iterator_t* iterator, const rc_hash_callbacks_t* callbacks) +{ + if (callbacks->verbose_message) + iterator->callbacks.verbose_message = callbacks->verbose_message; + if (callbacks->error_message) + iterator->callbacks.verbose_message = callbacks->error_message; + + if (callbacks->filereader.open) + memcpy(&iterator->callbacks.filereader, &callbacks->filereader, sizeof(callbacks->filereader)); + +#ifndef RC_HASH_NO_DISC + if (callbacks->cdreader.open_track) + memcpy(&iterator->callbacks.cdreader, &callbacks->cdreader, sizeof(callbacks->cdreader)); +#endif + +#ifndef RC_HASH_NO_ENCRYPTED + if (callbacks->encryption.get_3ds_cia_normal_key) + iterator->callbacks.encryption.get_3ds_cia_normal_key = callbacks->encryption.get_3ds_cia_normal_key; + if (callbacks->encryption.get_3ds_ncch_normal_keys) + iterator->callbacks.encryption.get_3ds_ncch_normal_keys = callbacks->encryption.get_3ds_ncch_normal_keys; +#endif +} + + +static void rc_hash_reset_iterator(rc_hash_iterator_t* iterator) { + memset(iterator, 0, sizeof(*iterator)); + iterator->index = -1; + + if (g_verbose_message_callback) + iterator->callbacks.verbose_message = rc_hash_call_g_verbose_message_callback; + if (g_error_message_callback) + iterator->callbacks.error_message = rc_hash_call_g_error_message_callback; + + if (g_filereader) { + memcpy(&iterator->callbacks.filereader, g_filereader, sizeof(*g_filereader)); + } else if (!iterator->callbacks.filereader.open) { + iterator->callbacks.filereader.open = filereader_open; + iterator->callbacks.filereader.close = filereader_close; + iterator->callbacks.filereader.seek = filereader_seek; + iterator->callbacks.filereader.tell = filereader_tell; + iterator->callbacks.filereader.read = filereader_read; + } + +#ifndef RC_HASH_NO_DISC + rc_hash_reset_iterator_disc(iterator); +#endif + +#ifndef RC_HASH_NO_ENCRYPTED + rc_hash_reset_iterator_encrypted(iterator); +#endif +} + +static void rc_hash_initialize_iterator_single(rc_hash_iterator_t* iterator, int data) { + iterator->consoles[0] = (uint8_t)data; +} + +static void rc_hash_initialize_iterator_bin(rc_hash_iterator_t* iterator, int data) { + (void)data; + + if (iterator->buffer_size == 0) { + /* raw bin file may be a CD track. if it's more than 32MB, try a CD hash. */ + const int64_t size = rc_file_size(iterator, iterator->path); + if (size > 32 * 1024 * 1024) { + iterator->consoles[0] = RC_CONSOLE_3DO; /* 4DO supports directly opening the bin file */ + iterator->consoles[1] = RC_CONSOLE_PLAYSTATION; /* PCSX ReARMed supports directly opening the bin file*/ + iterator->consoles[2] = RC_CONSOLE_PLAYSTATION_2; /* PCSX2 supports directly opening the bin file*/ + iterator->consoles[3] = RC_CONSOLE_SEGA_CD; /* Genesis Plus GX supports directly opening the bin file*/ + + /* fallback to megadrive which just does a full hash. */ + iterator->consoles[4] = RC_CONSOLE_MEGA_DRIVE; + return; + } + } + + /* bin is associated with MegaDrive, Sega32X, Atari 2600, Watara Supervision, MegaDuck, + * Fairchild Channel F, Arcadia 2001, Interton VC 4000, and Super Cassette Vision. + * Since they all use the same hashing algorithm, only specify one of them */ + iterator->consoles[0] = RC_CONSOLE_MEGA_DRIVE; +} + +static void rc_hash_initialize_iterator_chd(rc_hash_iterator_t* iterator, int data) { + (void)data; + + iterator->consoles[0] = RC_CONSOLE_PLAYSTATION; + iterator->consoles[1] = RC_CONSOLE_PLAYSTATION_2; + iterator->consoles[2] = RC_CONSOLE_DREAMCAST; + iterator->consoles[3] = RC_CONSOLE_SEGA_CD; /* ASSERT: handles both Sega CD and Saturn */ + iterator->consoles[4] = RC_CONSOLE_PSP; + iterator->consoles[5] = RC_CONSOLE_PC_ENGINE_CD; + iterator->consoles[6] = RC_CONSOLE_3DO; + iterator->consoles[7] = RC_CONSOLE_NEO_GEO_CD; + iterator->consoles[8] = RC_CONSOLE_PCFX; +} + +static void rc_hash_initialize_iterator_cue(rc_hash_iterator_t* iterator, int data) { + (void)data; + + iterator->consoles[0] = RC_CONSOLE_PLAYSTATION; + iterator->consoles[1] = RC_CONSOLE_PLAYSTATION_2; + iterator->consoles[2] = RC_CONSOLE_DREAMCAST; + iterator->consoles[3] = RC_CONSOLE_SEGA_CD; /* ASSERT: handles both Sega CD and Saturn */ + iterator->consoles[4] = RC_CONSOLE_PC_ENGINE_CD; + iterator->consoles[5] = RC_CONSOLE_3DO; + iterator->consoles[6] = RC_CONSOLE_PCFX; + iterator->consoles[7] = RC_CONSOLE_NEO_GEO_CD; + iterator->consoles[8] = RC_CONSOLE_ATARI_JAGUAR_CD; +} + +static void rc_hash_initialize_iterator_d88(rc_hash_iterator_t* iterator, int data) { + (void)data; + + iterator->consoles[0] = RC_CONSOLE_PC8800; + iterator->consoles[1] = RC_CONSOLE_SHARPX1; +} + +static void rc_hash_initialize_iterator_dsk(rc_hash_iterator_t* iterator, int data) { + size_t size = iterator->buffer_size; + if (size == 0) + size = (size_t)rc_file_size(iterator, iterator->path); + + (void)data; + + if (size == 512 * 9 * 80) { /* 360KB */ + /* FAT-12 3.5" DD (512 byte sectors, 9 sectors per track, 80 tracks per side */ + /* FAT-12 5.25" DD double-sided (512 byte sectors, 9 sectors per track, 80 tracks per side */ + iterator->consoles[0] = RC_CONSOLE_MSX; + } + else if (size == 512 * 9 * 80 * 2) { /* 720KB */ + /* FAT-12 3.5" DD double-sided (512 byte sectors, 9 sectors per track, 80 tracks per side */ + iterator->consoles[0] = RC_CONSOLE_MSX; + } + else if (size == 512 * 9 * 40) { /* 180KB */ + /* FAT-12 5.25" DD (512 byte sectors, 9 sectors per track, 40 tracks per side */ + iterator->consoles[0] = RC_CONSOLE_MSX; + + /* AMSDOS 3" - 40 tracks */ + iterator->consoles[1] = RC_CONSOLE_AMSTRAD_PC; + } + else if (size == 256 * 16 * 35) { /* 140KB */ + /* Apple II new format - 256 byte sectors, 16 sectors per track, 35 tracks per side */ + iterator->consoles[0] = RC_CONSOLE_APPLE_II; + } + else if (size == 256 * 13 * 35) { /* 113.75KB */ + /* Apple II old format - 256 byte sectors, 13 sectors per track, 35 tracks per side */ + iterator->consoles[0] = RC_CONSOLE_APPLE_II; + } + + /* once a best guess has been identified, make sure the others are added as fallbacks */ + + /* check MSX first, as Apple II isn't supported by RetroArch, and RAppleWin won't use the iterator */ + rc_hash_iterator_append_console(iterator, RC_CONSOLE_MSX); + rc_hash_iterator_append_console(iterator, RC_CONSOLE_AMSTRAD_PC); + rc_hash_iterator_append_console(iterator, RC_CONSOLE_ZX_SPECTRUM); + rc_hash_iterator_append_console(iterator, RC_CONSOLE_APPLE_II); +} + +static void rc_hash_initialize_iterator_iso(rc_hash_iterator_t* iterator, int data) { + (void)data; + + iterator->consoles[0] = RC_CONSOLE_PLAYSTATION_2; + iterator->consoles[1] = RC_CONSOLE_PSP; + iterator->consoles[2] = RC_CONSOLE_3DO; + iterator->consoles[3] = RC_CONSOLE_SEGA_CD; /* ASSERT: handles both Sega CD and Saturn */ + iterator->consoles[4] = RC_CONSOLE_GAMECUBE; + iterator->consoles[5] = RC_CONSOLE_WII; +} + +static void rc_hash_initialize_iterator_m3u(rc_hash_iterator_t* iterator, int data) { + const char* first_file_path; + + (void)data; + + /* temporarily set the iterator path to the m3u file so we can extract the + * path of the first disc. rc_hash_get_first_item_from_playlist will return + * an allocated string or NULL, so rc_hash_destroy_iterator won't get tripped + * up by the non-allocted value we're about to assign. + */ + first_file_path = rc_hash_get_first_item_from_playlist(iterator); + if (!first_file_path) /* did not find a disc */ + return; + + /* release the m3u path and replace with the first file path */ + free((void*)iterator->path); + iterator->path = first_file_path; /* assert: already malloc'd; don't need to strdup */ + + iterator->buffer = NULL; /* ignore buffer; assume it's the m3u contents */ + + rc_hash_initialize_iterator_from_path(iterator, iterator->path); +} + +static void rc_hash_initialize_iterator_nib(rc_hash_iterator_t* iterator, int data) { + (void)data; + + iterator->consoles[0] = RC_CONSOLE_APPLE_II; + iterator->consoles[1] = RC_CONSOLE_COMMODORE_64; +} + +static void rc_hash_initialize_iterator_rom(rc_hash_iterator_t* iterator, int data) { + (void)data; + + /* rom is associated with MSX, Thomson TO-8, and Fairchild Channel F. + * Since they all use the same hashing algorithm, only specify one of them */ + iterator->consoles[0] = RC_CONSOLE_MSX; +} + +static void rc_hash_initialize_iterator_tap(rc_hash_iterator_t* iterator, int data) { + (void)data; + + /* also Oric and ZX Spectrum, but all are full file hashes */ + iterator->consoles[0] = RC_CONSOLE_COMMODORE_64; +} + +static const rc_hash_iterator_ext_handler_entry_t rc_hash_iterator_ext_handlers[] = { + { "2d", rc_hash_initialize_iterator_single, RC_CONSOLE_SHARPX1 }, + { "3ds", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "3dsx", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "7z", rc_hash_initialize_iterator_single, RC_CONSOLE_ARCADE }, + { "83g", rc_hash_initialize_iterator_single, RC_CONSOLE_TI83 }, /* http://tibasicdev.wikidot.com/file-extensions */ + { "83p", rc_hash_initialize_iterator_single, RC_CONSOLE_TI83 }, + { "a26", rc_hash_initialize_iterator_single, RC_CONSOLE_ATARI_2600 }, + { "a78", rc_hash_initialize_iterator_single, RC_CONSOLE_ATARI_7800 }, + { "app", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "arduboy", rc_hash_initialize_iterator_single, RC_CONSOLE_ARDUBOY }, + { "axf", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "bin", rc_hash_initialize_iterator_bin, 0 }, + { "bs", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_NINTENDO }, + { "cart", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_CASSETTEVISION }, + { "cas", rc_hash_initialize_iterator_single, RC_CONSOLE_MSX }, + { "cci", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "chd", rc_hash_initialize_iterator_chd, 0 }, + { "chf", rc_hash_initialize_iterator_single, RC_CONSOLE_FAIRCHILD_CHANNEL_F }, + { "cia", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "col", rc_hash_initialize_iterator_single, RC_CONSOLE_COLECOVISION }, + { "csw", rc_hash_initialize_iterator_single, RC_CONSOLE_ZX_SPECTRUM }, + { "cue", rc_hash_initialize_iterator_cue, 0 }, + { "cxi", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "d64", rc_hash_initialize_iterator_single, RC_CONSOLE_COMMODORE_64 }, + { "d88", rc_hash_initialize_iterator_d88, 0 }, + { "dosz", rc_hash_initialize_iterator_single, RC_CONSOLE_MS_DOS }, + { "dsk", rc_hash_initialize_iterator_dsk, 0 }, + { "elf", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_3DS }, + { "fd", rc_hash_initialize_iterator_single, RC_CONSOLE_THOMSONTO8 }, + { "fds", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO }, + { "fig", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_NINTENDO }, + { "gb", rc_hash_initialize_iterator_single, RC_CONSOLE_GAMEBOY }, + { "gba", rc_hash_initialize_iterator_single, RC_CONSOLE_GAMEBOY_ADVANCE }, + { "gbc", rc_hash_initialize_iterator_single, RC_CONSOLE_GAMEBOY_COLOR }, + { "gdi", rc_hash_initialize_iterator_single, RC_CONSOLE_DREAMCAST }, + { "gg", rc_hash_initialize_iterator_single, RC_CONSOLE_GAME_GEAR }, + { "hex", rc_hash_initialize_iterator_single, RC_CONSOLE_ARDUBOY }, + { "iso", rc_hash_initialize_iterator_iso, 0 }, + { "jag", rc_hash_initialize_iterator_single, RC_CONSOLE_ATARI_JAGUAR }, + { "k7", rc_hash_initialize_iterator_single, RC_CONSOLE_THOMSONTO8 }, /* tape */ + { "lnx", rc_hash_initialize_iterator_single, RC_CONSOLE_ATARI_LYNX }, + { "m3u", rc_hash_initialize_iterator_m3u, 0 }, + { "m5", rc_hash_initialize_iterator_single, RC_CONSOLE_THOMSONTO8 }, /* cartridge */ + { "m7", rc_hash_initialize_iterator_single, RC_CONSOLE_THOMSONTO8 }, /* cartridge */ + { "md", rc_hash_initialize_iterator_single, RC_CONSOLE_MEGA_DRIVE }, + { "min", rc_hash_initialize_iterator_single, RC_CONSOLE_POKEMON_MINI }, + { "mx1", rc_hash_initialize_iterator_single, RC_CONSOLE_MSX }, + { "mx2", rc_hash_initialize_iterator_single, RC_CONSOLE_MSX }, + { "n64", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_64 }, + { "ndd", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_64 }, + { "nds", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_DS }, /* handles both DS and DSi */ + { "nes", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO }, + { "ngc", rc_hash_initialize_iterator_single, RC_CONSOLE_NEOGEO_POCKET }, + { "nib", rc_hash_initialize_iterator_nib, 0 }, + { "pbp", rc_hash_initialize_iterator_single, RC_CONSOLE_PSP }, + { "pce", rc_hash_initialize_iterator_single, RC_CONSOLE_PC_ENGINE }, + { "pgm", rc_hash_initialize_iterator_single, RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER }, + { "pzx", rc_hash_initialize_iterator_single, RC_CONSOLE_ZX_SPECTRUM }, + { "ri", rc_hash_initialize_iterator_single, RC_CONSOLE_MSX }, + { "rom", rc_hash_initialize_iterator_rom, 0 }, + { "sap", rc_hash_initialize_iterator_single, RC_CONSOLE_THOMSONTO8 }, /* disk */ + { "scl", rc_hash_initialize_iterator_single, RC_CONSOLE_ZX_SPECTRUM }, + { "sfc", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_NINTENDO }, + { "sg", rc_hash_initialize_iterator_single, RC_CONSOLE_SG1000 }, + { "sgx", rc_hash_initialize_iterator_single, RC_CONSOLE_PC_ENGINE }, + { "smc", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_NINTENDO }, + { "sv", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPERVISION }, + { "swc", rc_hash_initialize_iterator_single, RC_CONSOLE_SUPER_NINTENDO }, + { "tap", rc_hash_initialize_iterator_tap, 0 }, + { "tic", rc_hash_initialize_iterator_single, RC_CONSOLE_TIC80 }, + { "trd", rc_hash_initialize_iterator_single, RC_CONSOLE_ZX_SPECTRUM }, + { "tvc", rc_hash_initialize_iterator_single, RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER }, + { "tzx", rc_hash_initialize_iterator_single, RC_CONSOLE_ZX_SPECTRUM }, + { "uze", rc_hash_initialize_iterator_single, RC_CONSOLE_UZEBOX }, + { "v64", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_64 }, + { "vb", rc_hash_initialize_iterator_single, RC_CONSOLE_VIRTUAL_BOY }, + { "wad", rc_hash_initialize_iterator_single, RC_CONSOLE_WII }, + { "wasm", rc_hash_initialize_iterator_single, RC_CONSOLE_WASM4 }, + { "woz", rc_hash_initialize_iterator_single, RC_CONSOLE_APPLE_II }, + { "wsc", rc_hash_initialize_iterator_single, RC_CONSOLE_WONDERSWAN }, + { "z64", rc_hash_initialize_iterator_single, RC_CONSOLE_NINTENDO_64 }, + { "zip", rc_hash_initialize_iterator_single, RC_CONSOLE_ARCADE } +}; + +const rc_hash_iterator_ext_handler_entry_t* rc_hash_get_iterator_ext_handlers(size_t* num_handlers) { + *num_handlers = sizeof(rc_hash_iterator_ext_handlers) / sizeof(rc_hash_iterator_ext_handlers[0]); + return rc_hash_iterator_ext_handlers; +} + +static int rc_hash_iterator_find_handler(const void* left, const void* right) { + const rc_hash_iterator_ext_handler_entry_t* left_handler = + (const rc_hash_iterator_ext_handler_entry_t*)left; + const rc_hash_iterator_ext_handler_entry_t* right_handler = + (const rc_hash_iterator_ext_handler_entry_t*)right; + + return strcmp(left_handler->ext, right_handler->ext); +} + +static void rc_hash_initialize_iterator_from_path(rc_hash_iterator_t* iterator, const char* path) { + size_t num_handlers; + const rc_hash_iterator_ext_handler_entry_t* handlers = rc_hash_get_iterator_ext_handlers(&num_handlers); + const rc_hash_iterator_ext_handler_entry_t* handler; + rc_hash_iterator_ext_handler_entry_t search; + const char* ext = rc_path_get_extension(path); + size_t index; + + /* lowercase the extension as we copy it into the search object */ + memset(&search, 0, sizeof(search)); + for (index = 0; index < sizeof(search.ext) - 1; ++index) { + const int c = (int)ext[index]; + if (!c) + break; + + search.ext[index] = tolower(c); + } + + /* find the handler for the extension */ + handler = (const rc_hash_iterator_ext_handler_entry_t*) + bsearch(&search, handlers, num_handlers, sizeof(*handler), rc_hash_iterator_find_handler); + if (handler) { + handler->handler(iterator, handler->data); + + if (iterator->callbacks.verbose_message) { + int count = 0; + while (iterator->consoles[count]) + ++count; + + rc_hash_iterator_verbose_formatted(iterator, "Found %d potential consoles for %s file extension", count, ext); + } + } + else { + rc_hash_iterator_error_formatted(iterator, "No console mapping specified for %s file extension - trying full file hash", ext); + + /* if we didn't match the extension, default to something that does a whole file hash */ + if (!iterator->consoles[0]) + iterator->consoles[0] = RC_CONSOLE_GAMEBOY; + } +} + +void rc_hash_initialize_iterator(rc_hash_iterator_t* iterator, const char* path, const uint8_t* buffer, size_t buffer_size) +{ + rc_hash_reset_iterator(iterator); + iterator->buffer = buffer; + iterator->buffer_size = buffer_size; + + if (path) + iterator->path = strdup(path); +} + +void rc_hash_destroy_iterator(rc_hash_iterator_t* iterator) { + if (iterator->path) { + free((void*)iterator->path); + iterator->path = NULL; + } + + iterator->buffer = NULL; +} + +int rc_hash_iterate(char hash[33], rc_hash_iterator_t* iterator) { + int next_console; + int result = 0; + + if (iterator->index == -1) { + rc_hash_initialize_iterator_from_path(iterator, iterator->path); + iterator->index = 0; + } + + do { + next_console = iterator->consoles[iterator->index]; + if (next_console == 0) { + hash[0] = '\0'; + break; + } + + ++iterator->index; + + rc_hash_iterator_verbose_formatted(iterator, "Trying console %d", next_console); + + result = rc_hash_generate(hash, next_console, iterator); + } while (!result); + + return result; +} + +int rc_hash_generate(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator) { + if (iterator->buffer) + return rc_hash_from_buffer(hash, console_id, iterator); + + return rc_hash_from_file(hash, console_id, iterator); +} + +int rc_hash_generate_from_buffer(char hash[33], uint32_t console_id, const uint8_t* buffer, size_t buffer_size) { + rc_hash_iterator_t iterator; + int result; + + rc_hash_reset_iterator(&iterator); + iterator.buffer = buffer; + iterator.buffer_size = buffer_size; + + result = rc_hash_from_buffer(hash, console_id, &iterator); + + rc_hash_destroy_iterator(&iterator); + + return result; +} + +int rc_hash_generate_from_file(char hash[33], uint32_t console_id, const char* path){ + rc_hash_iterator_t iterator; + int result; + + rc_hash_reset_iterator(&iterator); + iterator.path = path; + + result = rc_hash_from_file(hash, console_id, &iterator); + + iterator.path = NULL; /* prevent free. we didn't strdup */ + + rc_hash_destroy_iterator(&iterator); + + return result; +} diff --git a/src/rcheevos/src/rhash/hash_disc.c b/src/rcheevos/src/rhash/hash_disc.c new file mode 100644 index 0000000000..83c93545e3 --- /dev/null +++ b/src/rcheevos/src/rhash/hash_disc.c @@ -0,0 +1,1340 @@ +#include "rc_hash.h" + +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +#include + +/* ===================================================== */ + +static struct rc_hash_cdreader g_cdreader_funcs; +static struct rc_hash_cdreader* g_cdreader = NULL; + +void rc_hash_reset_iterator_disc(rc_hash_iterator_t* iterator) +{ + if (g_cdreader) + memcpy(&iterator->callbacks.cdreader, g_cdreader, sizeof(*g_cdreader)); + else + rc_hash_get_default_cdreader(&iterator->callbacks.cdreader); +} + +void rc_hash_init_custom_cdreader(struct rc_hash_cdreader* reader) +{ + if (reader) { + memcpy(&g_cdreader_funcs, reader, sizeof(g_cdreader_funcs)); + g_cdreader = &g_cdreader_funcs; + } + else { + g_cdreader = NULL; + } +} + +static void* rc_cd_open_track(const rc_hash_iterator_t* iterator, uint32_t track) +{ + if (iterator->callbacks.cdreader.open_track_iterator) + return iterator->callbacks.cdreader.open_track_iterator(iterator->path, track, iterator); + + if (iterator->callbacks.cdreader.open_track) + return iterator->callbacks.cdreader.open_track(iterator->path, track); + + if (g_cdreader && g_cdreader->open_track) + return g_cdreader->open_track(iterator->path, track); + + rc_hash_iterator_error(iterator, "no hook registered for cdreader_open_track"); + return NULL; +} + +static size_t rc_cd_read_sector(const rc_hash_iterator_t* iterator, void* track_handle, uint32_t sector, void* buffer, size_t requested_bytes) +{ + if (iterator->callbacks.cdreader.read_sector) + return iterator->callbacks.cdreader.read_sector(track_handle, sector, buffer, requested_bytes); + + if (g_cdreader && g_cdreader->read_sector) + return g_cdreader->read_sector(track_handle, sector, buffer, requested_bytes); + + rc_hash_iterator_error(iterator, "no hook registered for cdreader_read_sector"); + return 0; +} + +static uint32_t rc_cd_first_track_sector(const rc_hash_iterator_t* iterator, void* track_handle) +{ + if (iterator->callbacks.cdreader.first_track_sector) + return iterator->callbacks.cdreader.first_track_sector(track_handle); + + if (g_cdreader && g_cdreader->first_track_sector) + return g_cdreader->first_track_sector(track_handle); + + rc_hash_iterator_error(iterator, "no hook registered for cdreader_first_track_sector"); + return 0; +} + +static void rc_cd_close_track(const rc_hash_iterator_t* iterator, void* track_handle) +{ + if (iterator->callbacks.cdreader.close_track) + iterator->callbacks.cdreader.close_track(track_handle); + else if (g_cdreader && g_cdreader->close_track) + g_cdreader->close_track(track_handle); + else + rc_hash_iterator_error(iterator, "no hook registered for cdreader_close_track"); +} + +static uint32_t rc_cd_find_file_sector(const rc_hash_iterator_t* iterator, void* track_handle, const char* path, uint32_t* size) +{ + uint8_t buffer[2048], *tmp; + int sector; + uint32_t num_sectors = 0; + size_t filename_length; + const char* slash; + + if (!track_handle) + return 0; + + /* we start at the root. don't need to explicitly find it */ + if (*path == '\\') + ++path; + + filename_length = strlen(path); + slash = strrchr(path, '\\'); + if (slash) { + /* find the directory record for the first part of the path */ + memcpy(buffer, path, slash - path); + buffer[slash - path] = '\0'; + + sector = rc_cd_find_file_sector(iterator, track_handle, (const char *)buffer, NULL); + if (!sector) + return 0; + + ++slash; + filename_length -= (slash - path); + path = slash; + } + else { + uint32_t logical_block_size; + + /* find the cd information */ + if (!rc_cd_read_sector(iterator, track_handle, rc_cd_first_track_sector(iterator, track_handle) + 16, buffer, 256)) + return 0; + + /* the directory_record starts at 156, the sector containing the table of contents is 2 bytes into that. + * https://www.cdroller.com/htm/readdata.html + */ + sector = buffer[156 + 2] | (buffer[156 + 3] << 8) | (buffer[156 + 4] << 16); + + /* if the table of contents spans more than one sector, it's length of section will exceed it's logical block size */ + logical_block_size = (buffer[128] | (buffer[128 + 1] << 8)); /* logical block size */ + if (logical_block_size == 0) { + num_sectors = 1; + } else { + num_sectors = (buffer[156 + 10] | (buffer[156 + 11] << 8) | (buffer[156 + 12] << 16) | (buffer[156 + 13] << 24)); /* length of section */ + num_sectors /= logical_block_size; + } + } + + /* fetch and process the directory record */ + if (!rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer))) + return 0; + + tmp = buffer; + do { + if (tmp >= buffer + sizeof(buffer) || !*tmp) { + /* end of this path table block. if the path table spans multiple sectors, keep scanning */ + if (num_sectors > 1) { + --num_sectors; + if (rc_cd_read_sector(iterator, track_handle, ++sector, buffer, sizeof(buffer))) { + tmp = buffer; + continue; + } + } + break; + } + + /* filename is 33 bytes into the record and the format is "FILENAME;version" or "DIRECTORY" */ + if ((tmp[32] == filename_length || tmp[33 + filename_length] == ';') && + strncasecmp((const char*)(tmp + 33), path, filename_length) == 0) { + sector = tmp[2] | (tmp[3] << 8) | (tmp[4] << 16); + + rc_hash_iterator_verbose_formatted(iterator, "Found %s at sector %d", path, sector); + + if (size) + *size = tmp[10] | (tmp[11] << 8) | (tmp[12] << 16) | (tmp[13] << 24); + + return sector; + } + + /* the first byte of the record is the length of the record */ + tmp += *tmp; + } while (1); + + return 0; +} + +/* ===================================================== */ + +static int rc_hash_cd_file(md5_state_t* md5, const rc_hash_iterator_t* iterator, void* track_handle, uint32_t sector, const char* name, uint32_t size, const char* description) +{ + uint8_t buffer[2048]; + size_t num_read; + + if ((num_read = rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer))) < sizeof(buffer)) + return rc_hash_iterator_error_formatted(iterator, "Could not read %s", description); + + if (size > MAX_BUFFER_SIZE) + size = MAX_BUFFER_SIZE; + + if (name) + rc_hash_iterator_verbose_formatted(iterator, "Hashing %s title (%u bytes) and contents (%u bytes) ", name, (unsigned)strlen(name), size); + else + rc_hash_iterator_verbose_formatted(iterator, "Hashing %s contents (%u bytes @ sector %u)", description, size, sector); + + if (size < (unsigned)num_read) /* we read a whole sector - only hash the part containing file data */ + num_read = (size_t)size; + + do { + md5_append(md5, buffer, (int)num_read); + + if (size <= (unsigned)num_read) + break; + size -= (unsigned)num_read; + + ++sector; + if (size >= sizeof(buffer)) + num_read = rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + else + num_read = rc_cd_read_sector(iterator, track_handle, sector, buffer, size); + } while (num_read > 0); + + return 1; +} + +/* ===================================================== */ + +int rc_hash_3do(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[2048]; + const uint8_t operafs_identifier[7] = { 0x01, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x01 }; + void* track_handle; + md5_state_t md5; + int sector; + int block_size, block_location; + int offset, stop; + size_t size = 0; + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* the Opera filesystem stores the volume information in the first 132 bytes of sector 0 + * https://github.com/barbeque/3dodump/blob/master/OperaFS-Format.md + */ + rc_cd_read_sector(iterator, track_handle, 0, buffer, 132); + + if (memcmp(buffer, operafs_identifier, sizeof(operafs_identifier)) == 0) { + rc_hash_iterator_verbose_formatted(iterator, "Found 3DO CD, title=%.32s", &buffer[0x28]); + + /* include the volume header in the hash */ + md5_init(&md5); + md5_append(&md5, buffer, 132); + + /* the block size is at offset 0x4C (assume 0x4C is always 0) */ + block_size = buffer[0x4D] * 65536 + buffer[0x4E] * 256 + buffer[0x4F]; + + /* the root directory block location is at offset 0x64 (and duplicated several + * times, but we just look at the primary record) (assume 0x64 is always 0)*/ + block_location = buffer[0x65] * 65536 + buffer[0x66] * 256 + buffer[0x67]; + + /* multiply the block index by the block size to get the real address */ + block_location *= block_size; + + /* convert that to a sector and read it */ + sector = block_location / 2048; + + do { + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + + /* offset to start of entries is at offset 0x10 (assume 0x10 and 0x11 are always 0) */ + offset = buffer[0x12] * 256 + buffer[0x13]; + + /* offset to end of entries is at offset 0x0C (assume 0x0C is always 0) */ + stop = buffer[0x0D] * 65536 + buffer[0x0E] * 256 + buffer[0x0F]; + + while (offset < stop) { + if (buffer[offset + 0x03] == 0x02) { /* file */ + if (strcasecmp((const char*)&buffer[offset + 0x20], "LaunchMe") == 0) { + /* the block size is at offset 0x0C (assume 0x0C is always 0) */ + block_size = buffer[offset + 0x0D] * 65536 + buffer[offset + 0x0E] * 256 + buffer[offset + 0x0F]; + + /* the block location is at offset 0x44 (assume 0x44 is always 0) */ + block_location = buffer[offset + 0x45] * 65536 + buffer[offset + 0x46] * 256 + buffer[offset + 0x47]; + block_location *= block_size; + + /* the file size is at offset 0x10 (assume 0x10 is always 0) */ + size = (size_t)buffer[offset + 0x11] * 65536 + buffer[offset + 0x12] * 256 + buffer[offset + 0x13]; + + rc_hash_iterator_verbose_formatted(iterator, "Hashing header (%u bytes) and %.32s (%u bytes) ", 132, &buffer[offset + 0x20], (unsigned)size); + + break; + } + } + + /* the number of extra copies of the file is at offset 0x40 (assume 0x40-0x42 are always 0) */ + offset += 0x48 + buffer[offset + 0x43] * 4; + } + + if (size != 0) + break; + + /* did not find the file, see if the directory listing is continued in another sector */ + offset = buffer[0x02] * 256 + buffer[0x03]; + + /* no more sectors to search*/ + if (offset == 0xFFFF) + break; + + /* get next sector */ + offset *= block_size; + sector = (block_location + offset) / 2048; + } while (1); + + if (size == 0) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Could not find LaunchMe"); + } + + sector = block_location / 2048; + + while (size > 2048) { + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + md5_append(&md5, buffer, sizeof(buffer)); + + ++sector; + size -= 2048; + } + + rc_cd_read_sector(iterator, track_handle, sector, buffer, size); + md5_append(&md5, buffer, (int)size); + } + else { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Not a 3DO CD"); + } + + rc_cd_close_track(iterator, track_handle); + + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_dreamcast(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[256] = ""; + void* track_handle; + char exe_file[32] = ""; + uint32_t size; + uint32_t sector; + int result = 0; + md5_state_t md5; + int i = 0; + + /* track 03 is the data track that contains the TOC and IP.BIN */ + track_handle = rc_cd_open_track(iterator, 3); + if (track_handle) { + /* first 256 bytes from first sector should have IP.BIN structure that stores game meta information + * https://mc.pp.se/dc/ip.bin.html */ + rc_cd_read_sector(iterator, track_handle, rc_cd_first_track_sector(iterator, track_handle), buffer, sizeof(buffer)); + } + + if (memcmp(&buffer[0], "SEGA SEGAKATANA ", 16) != 0) { + if (track_handle) + rc_cd_close_track(iterator, track_handle); + + /* not a gd-rom dreamcast file. check for mil-cd by looking for the marker in the first data track */ + track_handle = rc_cd_open_track(iterator, RC_HASH_CDTRACK_FIRST_DATA); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + rc_cd_read_sector(iterator, track_handle, rc_cd_first_track_sector(iterator, track_handle), buffer, sizeof(buffer)); + if (memcmp(&buffer[0], "SEGA SEGAKATANA ", 16) != 0) { + /* did not find marker on track 3 or first data track */ + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Not a Dreamcast CD"); + } + } + + /* start the hash with the game meta information */ + md5_init(&md5); + md5_append(&md5, (md5_byte_t*)buffer, 256); + + if (iterator->callbacks.verbose_message) { + uint8_t* ptr = &buffer[0xFF]; + while (ptr > &buffer[0x80] && ptr[-1] == ' ') + --ptr; + *ptr = '\0'; + + rc_hash_iterator_verbose_formatted(iterator, "Found Dreamcast CD: %.128s (%.16s)", (const char*)&buffer[0x80], (const char*)&buffer[0x40]); + } + + /* the boot filename is 96 bytes into the meta information (https://mc.pp.se/dc/ip0000.bin.html) */ + /* remove whitespace from bootfile */ + i = 0; + while (!isspace((unsigned char)buffer[96 + i]) && i < 16) + ++i; + + /* sometimes boot file isn't present on meta information. + * nothing can be done, as even the core doesn't run the game in this case. */ + if (i == 0) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Boot executable not specified on IP.BIN"); + } + + memcpy(exe_file, &buffer[96], i); + exe_file[i] = '\0'; + + sector = rc_cd_find_file_sector(iterator, track_handle, exe_file, &size); + if (sector == 0) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Could not locate boot executable"); + } + + if (rc_cd_read_sector(iterator, track_handle, sector, buffer, 1)) { + /* the boot executable is in the primary data track */ + } + else { + rc_cd_close_track(iterator, track_handle); + + /* the boot executable is normally in the last track */ + track_handle = rc_cd_open_track(iterator, RC_HASH_CDTRACK_LAST); + } + + result = rc_hash_cd_file(&md5, iterator, track_handle, sector, NULL, size, "boot executable"); + rc_cd_close_track(iterator, track_handle); + + rc_hash_finalize(iterator, &md5, hash); + return result; +} + +static int rc_hash_nintendo_disc_partition(md5_state_t* md5, const rc_hash_iterator_t* iterator, + void* file_handle, const uint32_t part_offset, uint8_t wii_shift) +{ + const uint32_t BASE_HEADER_SIZE = 0x2440; + const uint32_t MAX_HEADER_SIZE = 1024 * 1024; + + uint32_t apploader_header_size, apploader_body_size, apploader_trailer_size, header_size; + + uint8_t quad_buffer[4]; + uint8_t addr_buffer[0xD8]; + uint8_t* buffer; + + uint64_t dol_offset; + uint64_t dol_offsets[18]; + uint64_t dol_sizes[18]; + + uint8_t ix; + uint64_t remaining_size; + const uint32_t MAX_CHUNK_SIZE = 1024 * 1024; + + /* GetApploaderSize */ + rc_file_seek(iterator, file_handle, part_offset + BASE_HEADER_SIZE + 0x14, SEEK_SET); + apploader_header_size = 0x20; + rc_file_read(iterator, file_handle, quad_buffer, 4); + apploader_body_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + rc_file_read(iterator, file_handle, quad_buffer, 4); + apploader_trailer_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + header_size = BASE_HEADER_SIZE + apploader_header_size + apploader_body_size + apploader_trailer_size; + if (header_size > MAX_HEADER_SIZE) header_size = MAX_HEADER_SIZE; + + /* Hash headers */ + buffer = (uint8_t*)malloc(header_size); + if (!buffer) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not allocate temporary buffer"); + } + rc_file_seek(iterator, file_handle, part_offset, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, header_size); + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte partition header", header_size); + md5_append(md5, buffer, header_size); + + /* GetBootDOLOffset + * Base header size is guaranteed larger than 0x423 therefore buffer contains dol_offset right now + */ + dol_offset = (((uint64_t)buffer[0x420] << 24) | + ((uint64_t)buffer[0x421] << 16) | + ((uint64_t)buffer[0x422] << 8) | + (uint64_t)buffer[0x423]) << wii_shift; + free(buffer); + + /* Find offsets and sizes for the 7 main.dol code segments and 11 main.dol data segments */ + rc_file_seek(iterator, file_handle, part_offset + dol_offset, SEEK_SET); + rc_file_read(iterator, file_handle, addr_buffer, 0xD8); + for (ix = 0; ix < 18; ix++) { + dol_offsets[ix] = (((uint64_t)addr_buffer[0x0 + ix * 4] << 24) | + ((uint64_t)addr_buffer[0x1 + ix * 4] << 16) | + ((uint64_t)addr_buffer[0x2 + ix * 4] << 8) | + (uint64_t)addr_buffer[0x3 + ix * 4]) << wii_shift; + dol_sizes[ix] = (((uint64_t)addr_buffer[0x90 + ix * 4] << 24) | + ((uint64_t)addr_buffer[0x91 + ix * 4] << 16) | + ((uint64_t)addr_buffer[0x92 + ix * 4] << 8) | + (uint64_t)addr_buffer[0x93 + ix * 4]) << wii_shift; + } + + /* Iterate through the 18 main.dol segments and hash each */ + buffer = (uint8_t*)malloc(MAX_CHUNK_SIZE); + if (!buffer) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not allocate temporary buffer"); + } + + for (ix = 0; ix < 18; ix++) { + if (dol_sizes[ix] == 0) + continue; + + rc_file_seek(iterator, file_handle, part_offset + dol_offsets[ix], SEEK_SET); + if (ix < 7) + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte main.dol code segment %u", dol_sizes[ix], ix); + else + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte main.dol data segment %u", dol_sizes[ix], ix - 7); + + remaining_size = dol_sizes[ix]; + while (remaining_size > MAX_CHUNK_SIZE) { + rc_file_read(iterator, file_handle, buffer, MAX_CHUNK_SIZE); + md5_append(md5, buffer, MAX_CHUNK_SIZE); + remaining_size -= MAX_CHUNK_SIZE; + } + rc_file_read(iterator, file_handle, buffer, (int32_t)remaining_size); + md5_append(md5, buffer, (int32_t)remaining_size); + } + + free(buffer); + return 1; +} + +int rc_hash_gamecube(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + void* file_handle; + + uint8_t quad_buffer[4]; + uint8_t success; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + md5_init(&md5); + /* Check Magic Word */ + rc_file_seek(iterator, file_handle, 0x1c, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + if (quad_buffer[0] == 0xC2 && quad_buffer[1] == 0x33 && quad_buffer[2] == 0x9F && quad_buffer[3] == 0x3D) + success = rc_hash_nintendo_disc_partition(&md5, iterator, file_handle, 0, 0); + else + success = rc_hash_iterator_error(iterator, "Not a Gamecube disc"); + + /* Finalize */ + rc_file_close(iterator, file_handle); + + if (success) + return rc_hash_finalize(iterator, &md5, hash); + + return 0; +} + +/* helper variable only used for testing */ +const char* _rc_hash_jaguar_cd_homebrew_hash = NULL; + +int rc_hash_jaguar_cd(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[2352]; + void* track_handle; + md5_state_t md5; + int byteswapped = 0; + uint32_t size = 0; + uint32_t offset = 0; + uint32_t sector = 0; + uint32_t remaining; + uint32_t i; + + /* Jaguar CD header is in the first sector of the first data track OF THE SECOND SESSION. + * The first track must be an audio track, but may be a warning message or actual game audio */ + track_handle = rc_cd_open_track(iterator, RC_HASH_CDTRACK_FIRST_OF_SECOND_SESSION); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* The header is an unspecified distance into the first sector, but usually two bytes in. + * It consists of 64 bytes of "TAIR" or "ATRI" repeating, depending on whether or not the data + * is byteswapped. Then another 32 byte that reads "ATARI APPROVED DATA HEADER ATRI " + * (possibly byteswapped). Then a big-endian 32-bit value for the address where the boot code + * should be loaded, and a second big-endian 32-bit value for the size of the boot code. */ + sector = rc_cd_first_track_sector(iterator, track_handle); + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + + for (i = 64; i < sizeof(buffer) - 32 - 4 * 3; i++) { + if (memcmp(&buffer[i], "TARA IPARPVODED TA AEHDAREA RT I", 32) == 0) { + byteswapped = 1; + offset = i + 32 + 4; + size = (buffer[offset] << 16) | (buffer[offset + 1] << 24) | (buffer[offset + 2]) | (buffer[offset + 3] << 8); + break; + } + else if (memcmp(&buffer[i], "ATARI APPROVED DATA HEADER ATRI ", 32) == 0) { + byteswapped = 0; + offset = i + 32 + 4; + size = (buffer[offset] << 24) | (buffer[offset + 1] << 16) | (buffer[offset + 2] << 8) | (buffer[offset + 3]); + break; + } + } + + if (size == 0) { /* did not see ATARI APPROVED DATA HEADER */ + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Not a Jaguar CD"); + } + + i = 0; /* only loop once */ + do { + md5_init(&md5); + + offset += 4; + + rc_hash_iterator_verbose_formatted(iterator, "Hashing boot executable (%u bytes starting at %u bytes into sector %u)", size, offset, sector); + + if (size > MAX_BUFFER_SIZE) + size = MAX_BUFFER_SIZE; + + do { + if (byteswapped) + rc_hash_byteswap16(buffer, &buffer[sizeof(buffer)]); + + remaining = sizeof(buffer) - offset; + if (remaining >= size) { + md5_append(&md5, &buffer[offset], size); + size = 0; + break; + } + + md5_append(&md5, &buffer[offset], remaining); + size -= remaining; + offset = 0; + } while (rc_cd_read_sector(iterator, track_handle, ++sector, buffer, sizeof(buffer)) == sizeof(buffer)); + + rc_cd_close_track(iterator, track_handle); + + if (size > 0) + return rc_hash_iterator_error(iterator, "Not enough data"); + + rc_hash_finalize(iterator, &md5, hash); + + /* homebrew games all seem to have the same boot executable and store the actual game code in track 2. + * if we generated something other than the homebrew hash, return it. assume all homebrews are byteswapped. */ + if (strcmp(hash, "254487b59ab21bc005338e85cbf9fd2f") != 0 || !byteswapped) { + if (_rc_hash_jaguar_cd_homebrew_hash == NULL || strcmp(hash, _rc_hash_jaguar_cd_homebrew_hash) != 0) + return 1; + } + + /* if we've already been through the loop a second time, just return the hash */ + if (i == 1) + return 1; + ++i; + + rc_hash_iterator_verbose_formatted(iterator, "Potential homebrew at sector %u, checking for KART data in track 2", sector); + + track_handle = rc_cd_open_track(iterator, 2); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* track 2 of the homebrew code has the 64 bytes or ATRI followed by 32 bytes of "ATARI APPROVED DATA HEADER ATRI!", + * then 64 bytes of KART repeating. */ + sector = rc_cd_first_track_sector(iterator, track_handle); + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + if (memcmp(&buffer[0x5E], "RT!IRTKA", 8) != 0) + return rc_hash_iterator_error(iterator, "Homebrew executable not found in track 2"); + + /* found KART data*/ + rc_hash_iterator_verbose(iterator, "Found KART data in track 2"); + + offset = 0xA6; + size = (buffer[offset] << 16) | (buffer[offset + 1] << 24) | (buffer[offset + 2]) | (buffer[offset + 3] << 8); + } while (1); +} + +int rc_hash_neogeo_cd(char hash[33], const rc_hash_iterator_t* iterator) +{ + char buffer[1024], *ptr; + void* track_handle; + uint32_t sector; + uint32_t size; + md5_state_t md5; + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* https://wiki.neogeodev.org/index.php?title=IPL_file, https://wiki.neogeodev.org/index.php?title=PRG_file + * IPL file specifies data to be loaded before the game starts. PRG files are the executable code + */ + sector = rc_cd_find_file_sector(iterator, track_handle, "IPL.TXT", &size); + if (!sector) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Not a NeoGeo CD game disc"); + } + + if (rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)) == 0) { + rc_cd_close_track(iterator, track_handle); + return 0; + } + + md5_init(&md5); + + buffer[sizeof(buffer) - 1] = '\0'; + ptr = &buffer[0]; + do { + char* start = ptr; + while (*ptr && *ptr != '.') + ++ptr; + + if (strncasecmp(ptr, ".PRG", 4) == 0) { + ptr += 4; + *ptr++ = '\0'; + + sector = rc_cd_find_file_sector(iterator, track_handle, start, &size); + if (!sector || !rc_hash_cd_file(&md5, iterator, track_handle, sector, NULL, size, start)) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error_formatted(iterator, "Could not read %.16s", start); + } + } + + while (*ptr && *ptr != '\n') + ++ptr; + if (*ptr != '\n') + break; + ++ptr; + } while (*ptr != '\0' && *ptr != '\x1a'); + + rc_cd_close_track(iterator, track_handle); + return rc_hash_finalize(iterator, &md5, hash); +} + +static int rc_hash_pce_track(char hash[33], void* track_handle, const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[2048]; + md5_state_t md5; + uint32_t sector, num_sectors; + uint32_t size; + + /* the PC-Engine uses the second sector to specify boot information and program name. + * the string "PC Engine CD-ROM SYSTEM" should exist at 32 bytes into the sector + * http://shu.sheldows.com/shu/download/pcedocs/pce_cdrom.html + */ + if (rc_cd_read_sector(iterator, track_handle, rc_cd_first_track_sector(iterator, track_handle) + 1, buffer, 128) < 128) + return rc_hash_iterator_error(iterator, "Not a PC Engine CD"); + + /* normal PC Engine CD will have a header block in sector 1 */ + if (memcmp("PC Engine CD-ROM SYSTEM", &buffer[32], 23) == 0) { + /* the title of the disc is the last 22 bytes of the header */ + md5_init(&md5); + md5_append(&md5, &buffer[106], 22); + + buffer[128] = '\0'; + rc_hash_iterator_verbose_formatted(iterator, "Found PC Engine CD, title=%.22s", &buffer[106]); + + /* the first three bytes specify the sector of the program data, and the fourth byte + * is the number of sectors. + */ + sector = (buffer[0] << 16) + (buffer[1] << 8) + buffer[2]; + num_sectors = buffer[3]; + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %d sectors starting at sector %d", num_sectors, sector); + + sector += rc_cd_first_track_sector(iterator, track_handle); + while (num_sectors > 0) { + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + md5_append(&md5, buffer, sizeof(buffer)); + + ++sector; + --num_sectors; + } + } + /* GameExpress CDs use a standard Joliet filesystem - locate and hash the BOOT.BIN */ + else if ((sector = rc_cd_find_file_sector(iterator, track_handle, "BOOT.BIN", &size)) != 0 && size < MAX_BUFFER_SIZE) { + md5_init(&md5); + while (size > sizeof(buffer)) { + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + md5_append(&md5, buffer, sizeof(buffer)); + + ++sector; + size -= sizeof(buffer); + } + + if (size > 0) { + rc_cd_read_sector(iterator, track_handle, sector, buffer, size); + md5_append(&md5, buffer, size); + } + } + else { + return rc_hash_iterator_error(iterator, "Not a PC Engine CD"); + } + + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_pce_cd(char hash[33], const rc_hash_iterator_t* iterator) +{ + int result; + void* track_handle = rc_cd_open_track(iterator, RC_HASH_CDTRACK_FIRST_DATA); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + result = rc_hash_pce_track(hash, track_handle, iterator); + + rc_cd_close_track(iterator, track_handle); + + return result; +} + +int rc_hash_pcfx_cd(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[2048]; + void* track_handle; + md5_state_t md5; + int sector, num_sectors; + + /* PC-FX executable can be in any track. Assume it's in the largest data track and check there first */ + track_handle = rc_cd_open_track(iterator, RC_HASH_CDTRACK_LARGEST); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* PC-FX CD will have a header marker in sector 0 */ + sector = rc_cd_first_track_sector(iterator, track_handle); + rc_cd_read_sector(iterator, track_handle, sector, buffer, 32); + if (memcmp("PC-FX:Hu_CD-ROM", &buffer[0], 15) != 0) { + rc_cd_close_track(iterator, track_handle); + + /* not found in the largest data track, check track 2 */ + track_handle = rc_cd_open_track(iterator, 2); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + sector = rc_cd_first_track_sector(iterator, track_handle); + rc_cd_read_sector(iterator, track_handle, sector, buffer, 32); + } + + if (memcmp("PC-FX:Hu_CD-ROM", &buffer[0], 15) == 0) { + /* PC-FX boot header fills the first two sectors of the disc + * https://bitbucket.org/trap15/pcfxtools/src/master/pcfx-cdlink.c + * the important stuff is the first 128 bytes of the second sector (title being the first 32) */ + rc_cd_read_sector(iterator, track_handle, sector + 1, buffer, 128); + + md5_init(&md5); + md5_append(&md5, buffer, 128); + + rc_hash_iterator_verbose_formatted(iterator, "Found PC-FX CD, title=%.32s", &buffer[0]); + + /* the program sector is in bytes 33-36 (assume byte 36 is 0) */ + sector = (buffer[34] << 16) + (buffer[33] << 8) + buffer[32]; + + /* the number of sectors the program occupies is in bytes 37-40 (assume byte 40 is 0) */ + num_sectors = (buffer[38] << 16) + (buffer[37] << 8) + buffer[36]; + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %d sectors starting at sector %d", num_sectors, sector); + + sector += rc_cd_first_track_sector(iterator, track_handle); + while (num_sectors > 0) { + rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)); + md5_append(&md5, buffer, sizeof(buffer)); + + ++sector; + --num_sectors; + } + } + else { + int result = 0; + rc_cd_read_sector(iterator, track_handle, sector + 1, buffer, 128); + + /* some PC-FX CDs still identify as PCE CDs */ + if (memcmp("PC Engine CD-ROM SYSTEM", &buffer[32], 23) == 0) + result = rc_hash_pce_track(hash, track_handle, iterator); + + rc_cd_close_track(iterator, track_handle); + if (result) + return result; + + return rc_hash_iterator_error(iterator, "Not a PC-FX CD"); + } + + rc_cd_close_track(iterator, track_handle); + + return rc_hash_finalize(iterator, &md5, hash); +} + +static int rc_hash_find_playstation_executable(const rc_hash_iterator_t* iterator, void* track_handle, + const char* boot_key, const char* cdrom_prefix, + char exe_name[], uint32_t exe_name_size, uint32_t* exe_size) +{ + uint8_t buffer[2048]; + uint32_t size; + char* ptr; + char* start; + const size_t boot_key_len = strlen(boot_key); + const size_t cdrom_prefix_len = strlen(cdrom_prefix); + int sector; + + sector = rc_cd_find_file_sector(iterator, track_handle, "SYSTEM.CNF", NULL); + if (!sector) + return 0; + + size = (uint32_t)rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer) - 1); + buffer[size] = '\0'; + + sector = 0; + for (ptr = (char*)buffer; *ptr; ++ptr) { + if (strncmp(ptr, boot_key, boot_key_len) == 0) { + ptr += boot_key_len; + while (isspace((unsigned char)*ptr)) + ++ptr; + + if (*ptr == '=') { + ++ptr; + while (isspace((unsigned char)*ptr)) + ++ptr; + + if (strncmp(ptr, cdrom_prefix, cdrom_prefix_len) == 0) + ptr += cdrom_prefix_len; + while (*ptr == '\\') + ++ptr; + + start = ptr; + while (!isspace((unsigned char)*ptr) && *ptr != ';') + ++ptr; + + size = (uint32_t)(ptr - start); + if (size >= exe_name_size) + size = exe_name_size - 1; + + memcpy(exe_name, start, size); + exe_name[size] = '\0'; + + rc_hash_iterator_verbose_formatted(iterator, "Looking for boot executable: %s", exe_name); + + sector = rc_cd_find_file_sector(iterator, track_handle, exe_name, exe_size); + break; + } + } + + /* advance to end of line */ + while (*ptr && *ptr != '\n') + ++ptr; + } + + return sector; +} + +int rc_hash_psx(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[32]; + char exe_name[64] = ""; + void* track_handle; + uint32_t sector; + uint32_t size; + int result = 0; + md5_state_t md5; + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + sector = rc_hash_find_playstation_executable(iterator, track_handle, "BOOT", "cdrom:", exe_name, sizeof(exe_name), &size); + if (!sector) { + sector = rc_cd_find_file_sector(iterator, track_handle, "PSX.EXE", &size); + if (sector) + memcpy(exe_name, "PSX.EXE", 8); + } + + if (!sector) { + rc_hash_iterator_error(iterator, "Could not locate primary executable"); + } + else if (rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)) < sizeof(buffer)) { + rc_hash_iterator_error(iterator, "Could not read primary executable"); + } + else { + if (memcmp(buffer, "PS-X EXE", 7) != 0) { + rc_hash_iterator_verbose_formatted(iterator, "%s did not contain PS-X EXE marker", exe_name); + } + else { + /* the PS-X EXE header specifies the executable size as a 4-byte value 28 bytes into the header, which doesn't + * include the header itself. We want to include the header in the hash, so append another 2048 to that value. + */ + size = (((uint8_t)buffer[31] << 24) | ((uint8_t)buffer[30] << 16) | ((uint8_t)buffer[29] << 8) | (uint8_t)buffer[28]) + 2048; + } + + /* there's a few games that use a singular engine and only differ via their data files. luckily, they have unique + * serial numbers, and use the serial number as the boot file in the standard way. include the boot file name in the hash. + */ + md5_init(&md5); + md5_append(&md5, (md5_byte_t*)exe_name, (int)strlen(exe_name)); + + result = rc_hash_cd_file(&md5, iterator, track_handle, sector, exe_name, size, "primary executable"); + rc_hash_finalize(iterator, &md5, hash); + } + + rc_cd_close_track(iterator, track_handle); + + return result; +} + +int rc_hash_ps2(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[4]; + char exe_name[64] = ""; + void* track_handle; + uint32_t sector; + uint32_t size; + int result = 0; + md5_state_t md5; + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + sector = rc_hash_find_playstation_executable(iterator, track_handle, "BOOT2", "cdrom0:", exe_name, sizeof(exe_name), &size); + if (!sector) { + rc_hash_iterator_error(iterator, "Could not locate primary executable"); + } + else if (rc_cd_read_sector(iterator, track_handle, sector, buffer, sizeof(buffer)) < sizeof(buffer)) { + rc_hash_iterator_error(iterator, "Could not read primary executable"); + } + else { + if (memcmp(buffer, "\x7f\x45\x4c\x46", 4) != 0) + rc_hash_iterator_verbose_formatted(iterator, "%s did not contain ELF marker", exe_name); + + /* there's a few games that use a singular engine and only differ via their data files. luckily, they have unique + * serial numbers, and use the serial number as the boot file in the standard way. include the boot file name in the hash. + */ + md5_init(&md5); + md5_append(&md5, (md5_byte_t*)exe_name, (int)strlen(exe_name)); + + result = rc_hash_cd_file(&md5, iterator, track_handle, sector, exe_name, size, "primary executable"); + rc_hash_finalize(iterator, &md5, hash); + } + + rc_cd_close_track(iterator, track_handle); + + return result; +} + +int rc_hash_psp(char hash[33], const rc_hash_iterator_t* iterator) +{ + void* track_handle; + uint32_t sector; + uint32_t size; + md5_state_t md5; + + /* https://www.psdevwiki.com/psp/PBP + * A PBP file is an archive containing the PARAM.SFO, primary executable, and a bunch of metadata. + * While we could extract the PARAM.SFO and primary executable to mimic the normal PSP hashing logic, + * it's easier to just hash the entire file. This also helps alleviate issues where the primary + * executable is just a game engine and the only differentiating data would be the metadata. */ + if (rc_path_compare_extension(iterator->path, "pbp")) + return rc_hash_whole_file(hash, iterator); + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* http://www.romhacking.net/forum/index.php?topic=30899.0 + * PSP_GAME/PARAM.SFO contains key/value pairs identifying the game for the system (i.e. serial number, + * name, version). PSP_GAME/SYSDIR/EBOOT.BIN is the encrypted primary executable. + */ + sector = rc_cd_find_file_sector(iterator, track_handle, "PSP_GAME\\PARAM.SFO", &size); + if (!sector) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Not a PSP game disc"); + } + + md5_init(&md5); + if (!rc_hash_cd_file(&md5, iterator, track_handle, sector, NULL, size, "PSP_GAME\\PARAM.SFO")) { + rc_cd_close_track(iterator, track_handle); + return 0; + } + + sector = rc_cd_find_file_sector(iterator, track_handle, "PSP_GAME\\SYSDIR\\EBOOT.BIN", &size); + if (!sector) { + rc_cd_close_track(iterator, track_handle); + return rc_hash_iterator_error(iterator, "Could not find primary executable"); + } + + if (!rc_hash_cd_file(&md5, iterator, track_handle, sector, NULL, size, "PSP_GAME\\SYSDIR\\EBOOT.BIN")) { + rc_cd_close_track(iterator, track_handle); + return 0; + } + + rc_cd_close_track(iterator, track_handle); + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_sega_cd(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t buffer[512]; + void* track_handle; + + track_handle = rc_cd_open_track(iterator, 1); + if (!track_handle) + return rc_hash_iterator_error(iterator, "Could not open track"); + + /* the first 512 bytes of sector 0 are a volume header and ROM header that uniquely identify the game. + * After that is an arbitrary amount of code that ensures the game is being run in the correct region. + * Then more arbitrary code follows that actually starts the boot process. Somewhere in there, the + * primary executable is loaded. In many cases, a single game will have multiple executables, so even + * if we could determine the primary one, it's just the tip of the iceberg. As such, we've decided that + * hashing the volume and ROM headers is sufficient for identifying the game, and we'll have to trust + * that our players aren't modifying anything else on the disc. + */ + rc_cd_read_sector(iterator, track_handle, 0, buffer, sizeof(buffer)); + rc_cd_close_track(iterator, track_handle); + + if (memcmp(buffer, "SEGADISCSYSTEM ", 16) != 0 && /* Sega CD */ + memcmp(buffer, "SEGA SEGASATURN ", 16) != 0) { /* Sega Saturn */ + return rc_hash_iterator_error(iterator, "Not a Sega CD"); + } + + return rc_hash_buffer(hash, buffer, sizeof(buffer), iterator); +} + +static int rc_hash_wii_disc(md5_state_t* md5, const rc_hash_iterator_t* iterator, void* file_handle) +{ + const uint32_t MAIN_HEADER_SIZE = 0x80; + const uint64_t REGION_CODE_ADDRESS = 0x4E000; + const uint32_t CLUSTER_SIZE = 0x7C00; + const uint32_t MAX_CLUSTER_COUNT = 1024; + + uint32_t partition_info_table[8]; + uint32_t total_partition_count = 0; + uint32_t* partition_table; + uint64_t tmd_offset; + uint32_t tmd_size; + uint64_t part_offset; + uint64_t part_size; + uint32_t cluster_count; + + uint8_t quad_buffer[4]; + uint8_t* buffer; + + uint32_t ix, jx, kx; + uint8_t encrypted; + + /* Check encryption byte - if 0x61 is 0, disc is encrypted */ + rc_file_seek(iterator, file_handle, 0x61, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 1); + encrypted = (quad_buffer[0] == 0); + + /* Hash main headers */ + buffer = (uint8_t*)malloc(CLUSTER_SIZE); + if (!buffer) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not allocate temporary buffer"); + } + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte main header for [%c%c%c%c%c%c]", + MAIN_HEADER_SIZE, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]); + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, MAIN_HEADER_SIZE); + md5_append(md5, buffer, MAIN_HEADER_SIZE); + + /* Hash region code */ + rc_file_seek(iterator, file_handle, REGION_CODE_ADDRESS, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + md5_append(md5, quad_buffer, 4); + + /* Scan partition table */ + rc_file_seek(iterator, file_handle, 0x40000, SEEK_SET); + for (ix = 0; ix < 8; ix++) { + rc_file_read(iterator, file_handle, quad_buffer, 4); + partition_info_table[ix] = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + if (ix % 2 == 0) + total_partition_count += partition_info_table[ix]; + } + + if (total_partition_count == 0) { + free(buffer); + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "No partitions found"); + } + + partition_table = (uint32_t*)malloc(total_partition_count * 4 * 2); + kx = 0; + for (jx = 0; jx < 8; jx += 2) { + rc_file_seek(iterator, file_handle, ((uint64_t)partition_info_table[jx + 1]) << 2, SEEK_SET); + for (ix = 0; ix < partition_info_table[jx]; ix++) { + rc_file_read(iterator, file_handle, quad_buffer, 4); + partition_table[kx++] = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + rc_file_read(iterator, file_handle, quad_buffer, 4); + partition_table[kx++] = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + } + } + + /* Read each partition */ + for (jx = 0; jx < total_partition_count * 2; jx += 2) { + /* Don't hash Update partition*/ + if (partition_table[jx + 1] == 1) + continue; + + /* Hash title metadata */ + rc_file_seek(iterator, file_handle, ((uint64_t)partition_table[jx] << 2) + 0x2A4, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + tmd_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + rc_file_read(iterator, file_handle, quad_buffer, 4); + tmd_offset = + ((uint64_t)((quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3])) << 2; + + if (tmd_size > CLUSTER_SIZE) + tmd_size = CLUSTER_SIZE; + + rc_file_seek(iterator, file_handle, ((uint64_t)partition_table[jx] << 2) + tmd_offset, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, tmd_size); + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte title metadata (partition type %u)", + tmd_size, partition_table[jx + 1]); + md5_append(md5, buffer, tmd_size); + + /* Hash partition */ + rc_file_seek(iterator, file_handle, ((uint64_t)partition_table[jx] << 2) + 0x2B8, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + part_offset = + ((uint64_t)((quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3])) << 2; + rc_file_read(iterator, file_handle, quad_buffer, 4); + part_size = + ((uint64_t)((quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3])) << 2; + + if (encrypted) { + cluster_count = (part_size / 0x8000 > MAX_CLUSTER_COUNT) ? MAX_CLUSTER_COUNT : (uint32_t)(part_size / 0x8000); + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u encrypted clusters (%u bytes)", + cluster_count, cluster_count * CLUSTER_SIZE); + for (ix = 0; ix < cluster_count; ix++) { + rc_file_seek(iterator, file_handle, part_offset + (ix * 0x8000) + 0x400, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, CLUSTER_SIZE); + md5_append(md5, buffer, CLUSTER_SIZE); + } + } + else { /* Decrypted */ + if (rc_hash_nintendo_disc_partition(md5, iterator, file_handle, (uint32_t)part_offset, 2) == 0) { + free(partition_table); + free(buffer); + return rc_hash_iterator_error(iterator, "Failed to hash Wii partition"); + } + } + } + free(partition_table); + free(buffer); + return 1; +} + +static int rc_hash_wiiware(md5_state_t* md5, const rc_hash_iterator_t* iterator, void* file_handle) +{ + uint32_t cert_chain_size, ticket_size, tmd_size; + uint32_t tmd_start_addr, content_count, content_addr, content_size, buffer_size; + uint32_t ix; + + uint8_t quad_buffer[4]; + uint8_t* buffer; + + rc_file_seek(iterator, file_handle, 0x08, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + cert_chain_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + /* Each content is individually aligned to a 0x40-byte boundary. */ + cert_chain_size = (cert_chain_size + 0x3F) & ~0x3F; + rc_file_seek(iterator, file_handle, 0x10, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + ticket_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + ticket_size = (ticket_size + 0x3F) & ~0x3F; + rc_file_read(iterator, file_handle, quad_buffer, 4); + tmd_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + tmd_size = (tmd_size + 0x3F) & ~0x3F; + if (tmd_size > MAX_BUFFER_SIZE) + tmd_size = MAX_BUFFER_SIZE; + + tmd_start_addr = 0x40 + cert_chain_size + ticket_size; + + /* Hash TMD */ + buffer = (uint8_t*)malloc(tmd_size); + rc_file_seek(iterator, file_handle, tmd_start_addr, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, tmd_size); + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte TMD", tmd_size); + md5_append(md5, buffer, tmd_size); + free(buffer); + + /* Get count of content sections */ + rc_file_seek(iterator, file_handle, (uint64_t)tmd_start_addr + 0x1de, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 2); + content_count = (quad_buffer[0] << 8) | quad_buffer[1]; + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u content sections", content_count); + content_addr = tmd_start_addr + tmd_size; + for (ix = 0; ix < content_count; ix++) { + /* Get content section size */ + rc_file_seek(iterator, file_handle, (uint64_t)tmd_start_addr + 0x1e4 + 8 + ix * 0x24, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + if (quad_buffer[0] == 0x00 && quad_buffer[1] == 0x00 && quad_buffer[2] == 0x00 && quad_buffer[3] == 0x00) { + rc_file_read(iterator, file_handle, quad_buffer, 4); + content_size = + (quad_buffer[0] << 24) | (quad_buffer[1] << 16) | (quad_buffer[2] << 8) | quad_buffer[3]; + /* Padding between content should be ignored. But because the content data is encrypted, + the size to hash for each content should be rounded up to the size of an AES block (16 bytes). */ + content_size = (content_size + 0x0F) & ~0x0F; + } + else { + /* size > 4GB, just assume MAX_BUFFER_SIZE */ + content_size = MAX_BUFFER_SIZE; + } + buffer_size = (content_size > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE : content_size; + + /* Hash content */ + buffer = (uint8_t*)malloc(buffer_size); + rc_file_seek(iterator, file_handle, content_addr, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, buffer_size); + md5_append(md5, buffer, buffer_size); + content_addr += content_size; + content_addr = (content_addr + 0x3F) & ~0x3F; + free(buffer); + } + + return 1; +} + +int rc_hash_wii(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + void* file_handle; + + uint8_t quad_buffer[4]; + uint8_t success; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + md5_init(&md5); + /* Check Magic Words */ + rc_file_seek(iterator, file_handle, 0x18, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + if (quad_buffer[0] == 0x5D && quad_buffer[1] == 0x1C && quad_buffer[2] == 0x9E && quad_buffer[3] == 0xA3) { + success = rc_hash_wii_disc(&md5, iterator, file_handle); + } + else { + rc_file_seek(iterator, file_handle, 0x04, SEEK_SET); + rc_file_read(iterator, file_handle, quad_buffer, 4); + if (quad_buffer[0] == 'I' && quad_buffer[1] == 's' && quad_buffer[2] == 0x00 && quad_buffer[3] == 0x00) + success = rc_hash_wiiware(&md5, iterator, file_handle); + else + success = rc_hash_iterator_error(iterator, "Not a supported Wii file"); + } + + /* Finalize */ + rc_file_close(iterator, file_handle); + + if (success) + return rc_hash_finalize(iterator, &md5, hash); + + return 0; +} diff --git a/src/rcheevos/src/rhash/hash_encrypted.c b/src/rcheevos/src/rhash/hash_encrypted.c new file mode 100644 index 0000000000..e90e310757 --- /dev/null +++ b/src/rcheevos/src/rhash/hash_encrypted.c @@ -0,0 +1,566 @@ +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +#include "aes.h" + +/* ===================================================== */ + +static rc_hash_3ds_get_cia_normal_key_func _3ds_get_cia_normal_key_func = NULL; +static rc_hash_3ds_get_ncch_normal_keys_func _3ds_get_ncch_normal_keys_func = NULL; + +void rc_hash_reset_iterator_encrypted(rc_hash_iterator_t* iterator) +{ + iterator->callbacks.encryption.get_3ds_cia_normal_key = _3ds_get_cia_normal_key_func; + iterator->callbacks.encryption.get_3ds_ncch_normal_keys = _3ds_get_ncch_normal_keys_func; +} + +void rc_hash_init_3ds_get_cia_normal_key_func(rc_hash_3ds_get_cia_normal_key_func func) +{ + _3ds_get_cia_normal_key_func = func; +} + +void rc_hash_init_3ds_get_ncch_normal_keys_func(rc_hash_3ds_get_ncch_normal_keys_func func) +{ + _3ds_get_ncch_normal_keys_func = func; +} + +/* ===================================================== */ + +static int rc_hash_nintendo_3ds_ncch(md5_state_t* md5, void* file_handle, uint8_t header[0x200], + struct AES_ctx* cia_aes, const rc_hash_iterator_t* iterator) +{ + struct AES_ctx ncch_aes; + uint8_t* hash_buffer; + uint64_t exefs_offset, exefs_real_size; + uint32_t exefs_buffer_size; + uint8_t primary_key[AES_KEYLEN], secondary_key[AES_KEYLEN]; + uint8_t fixed_key_flag, no_crypto_flag, seed_crypto_flag; + uint8_t crypto_method, secondary_key_x_slot; + uint16_t ncch_version; + uint32_t i; + uint8_t primary_key_y[AES_KEYLEN], program_id[sizeof(uint64_t)]; + uint8_t iv[AES_BLOCKLEN], cia_iv[AES_BLOCKLEN]; + uint8_t exefs_section_name[8]; + uint64_t exefs_section_offset, exefs_section_size; + + exefs_offset = ((uint32_t)header[0x1A3] << 24) | (header[0x1A2] << 16) | (header[0x1A1] << 8) | header[0x1A0]; + exefs_real_size = ((uint32_t)header[0x1A7] << 24) | (header[0x1A6] << 16) | (header[0x1A5] << 8) | header[0x1A4]; + + /* Offset and size are in "media units" (1 media unit = 0x200 bytes) */ + exefs_offset *= 0x200; + exefs_real_size *= 0x200; + + if (exefs_real_size > MAX_BUFFER_SIZE) + exefs_buffer_size = MAX_BUFFER_SIZE; + else + exefs_buffer_size = (uint32_t)exefs_real_size; + + /* This region is technically optional, but it should always be present for executable content (i.e. games) */ + if (exefs_offset == 0 || exefs_real_size == 0) + return rc_hash_iterator_error(iterator, "ExeFS was not available"); + + /* NCCH flag 7 is a bitfield of various crypto related flags */ + fixed_key_flag = header[0x188 + 7] & 0x01; + no_crypto_flag = header[0x188 + 7] & 0x04; + seed_crypto_flag = header[0x188 + 7] & 0x20; + + ncch_version = (header[0x113] << 8) | header[0x112]; + + if (no_crypto_flag == 0) { + rc_hash_iterator_verbose(iterator, "Encrypted NCCH detected"); + + if (fixed_key_flag != 0) { + /* Fixed crypto key means all 0s for both keys */ + memset(primary_key, 0, sizeof(primary_key)); + memset(secondary_key, 0, sizeof(secondary_key)); + rc_hash_iterator_verbose(iterator, "Using fixed key crypto"); + } + else { + if (iterator->callbacks.encryption.get_3ds_ncch_normal_keys == NULL) + return rc_hash_iterator_error(iterator, "An encrypted NCCH was detected, but the NCCH normal keys callback was not set"); + + /* Primary key y is just the first 16 bytes of the header */ + memcpy(primary_key_y, header, sizeof(primary_key_y)); + + /* NCCH flag 3 indicates which secondary key x slot is used */ + crypto_method = header[0x188 + 3]; + + switch (crypto_method) { + case 0x00: + rc_hash_iterator_verbose(iterator, "Using NCCH crypto method v1"); + secondary_key_x_slot = 0x2C; + break; + case 0x01: + rc_hash_iterator_verbose(iterator, "Using NCCH crypto method v2"); + secondary_key_x_slot = 0x25; + break; + case 0x0A: + rc_hash_iterator_verbose(iterator, "Using NCCH crypto method v3"); + secondary_key_x_slot = 0x18; + break; + case 0x0B: + rc_hash_iterator_verbose(iterator, "Using NCCH crypto method v4"); + secondary_key_x_slot = 0x1B; + break; + default: + return rc_hash_iterator_error_formatted(iterator, "Invalid crypto method %02X", (unsigned)crypto_method); + } + + /* We only need the program id if we're doing seed crypto */ + if (seed_crypto_flag != 0) { + rc_hash_iterator_verbose(iterator, "Using seed crypto"); + memcpy(program_id, &header[0x118], sizeof(program_id)); + } + + if (iterator->callbacks.encryption.get_3ds_ncch_normal_keys(primary_key_y, secondary_key_x_slot, seed_crypto_flag != 0 ? program_id : NULL, primary_key, secondary_key) == 0) + return rc_hash_iterator_error(iterator, "Could not obtain NCCH normal keys"); + } + + switch (ncch_version) { + case 0: + case 2: + rc_hash_iterator_verbose(iterator, "Detected NCCH version 0/2"); + for (i = 0; i < 8; i++) { + /* First 8 bytes is the partition id in reverse byte order */ + iv[7 - i] = header[0x108 + i]; + } + + /* Magic number for ExeFS */ + iv[8] = 2; + + /* Rest of the bytes are 0 */ + memset(&iv[9], 0, sizeof(iv) - 9); + break; + + case 1: + rc_hash_iterator_verbose(iterator, "Detected NCCH version 1"); + for (i = 0; i < 8; i++) { + /* First 8 bytes is the partition id in normal byte order */ + iv[i] = header[0x108 + i]; + } + + /* Next 4 bytes are 0 */ + memset(&iv[8], 0, 4); + + /* Last 4 bytes is the ExeFS byte offset in big endian */ + iv[12] = (exefs_offset >> 24) & 0xFF; + iv[13] = (exefs_offset >> 16) & 0xFF; + iv[14] = (exefs_offset >> 8) & 0xFF; + iv[15] = exefs_offset & 0xFF; + break; + + default: + return rc_hash_iterator_error_formatted(iterator, "Invalid NCCH version %04X", (unsigned)ncch_version); + } + } + + /* ASSERT: file position must be +0x200 from start of NCCH (i.e. end of header) */ + exefs_offset -= 0x200; + + if (cia_aes) { + /* CBC decryption works by setting the IV to the encrypted previous block. + * Normally this means we would need to decrypt the data between the header and the ExeFS so the CIA AES state is correct. + * However, we can abuse how CBC decryption works and just set the IV to last block we would otherwise decrypt. + * We don't care about the data betweeen the header and ExeFS, so this works fine. */ + + rc_file_seek(iterator, file_handle, (int64_t)exefs_offset - AES_BLOCKLEN, SEEK_CUR); + if (rc_file_read(iterator, file_handle, cia_iv, AES_BLOCKLEN) != AES_BLOCKLEN) + return rc_hash_iterator_error(iterator, "Could not read NCCH data"); + + AES_ctx_set_iv(cia_aes, cia_iv); + } + else { + /* No encryption present, just skip over the in-between data */ + rc_file_seek(iterator, file_handle, (int64_t)exefs_offset, SEEK_CUR); + } + + hash_buffer = (uint8_t*)malloc(exefs_buffer_size); + if (!hash_buffer) + return rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", (unsigned)exefs_buffer_size); + + /* Clear out crypto flags to ensure we get the same hash for decrypted and encrypted ROMs */ + memset(&header[0x114], 0, 4); + header[0x188 + 3] = 0; + header[0x188 + 7] &= ~(0x20 | 0x04 | 0x01); + + rc_hash_iterator_verbose(iterator, "Hashing 512 byte NCCH header"); + md5_append(md5, header, 0x200); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u bytes for ExeFS (at NCCH offset %08X%08X)", + (unsigned)exefs_buffer_size, (unsigned)(exefs_offset >> 32), (unsigned)exefs_offset); + + if (rc_file_read(iterator, file_handle, hash_buffer, exefs_buffer_size) != exefs_buffer_size) { + free(hash_buffer); + return rc_hash_iterator_error(iterator, "Could not read ExeFS data"); + } + + if (cia_aes) { + rc_hash_iterator_verbose(iterator, "Performing CIA decryption for ExeFS"); + AES_CBC_decrypt_buffer(cia_aes, hash_buffer, exefs_buffer_size); + } + + if (no_crypto_flag == 0) { + rc_hash_iterator_verbose(iterator, "Performing NCCH decryption for ExeFS"); + + AES_init_ctx_iv(&ncch_aes, primary_key, iv); + AES_CTR_xcrypt_buffer(&ncch_aes, hash_buffer, 0x200); + + for (i = 0; i < 8; i++) { + memcpy(exefs_section_name, &hash_buffer[i * 16], sizeof(exefs_section_name)); + exefs_section_offset = ((uint32_t)hash_buffer[i * 16 + 11] << 24) | (hash_buffer[i * 16 + 10] << 16) | (hash_buffer[i * 16 + 9] << 8) | hash_buffer[i * 16 + 8]; + exefs_section_size = ((uint32_t)hash_buffer[i * 16 + 15] << 24) | (hash_buffer[i * 16 + 14] << 16) | (hash_buffer[i * 16 + 13] << 8) | hash_buffer[i * 16 + 12]; + + /* 0 size indicates an unused section */ + if (exefs_section_size == 0) + continue; + + /* Offsets must be aligned by a media unit */ + if (exefs_section_offset & 0x1FF) + return rc_hash_iterator_error(iterator, "ExeFS section offset is misaligned"); + + /* Offset is relative to the end of the header */ + exefs_section_offset += 0x200; + + /* Check against malformed sections */ + if (exefs_section_offset + ((exefs_section_size + 0x1FF) & ~(uint64_t)0x1FF) > (uint64_t)exefs_real_size) + return rc_hash_iterator_error(iterator, "ExeFS section would overflow"); + + if (memcmp(exefs_section_name, "icon", 4) == 0 || + memcmp(exefs_section_name, "banner", 6) == 0) { + /* Align size up by a media unit */ + exefs_section_size = (exefs_section_size + 0x1FF) & ~(uint64_t)0x1FF; + AES_init_ctx(&ncch_aes, primary_key); + } + else { + /* We don't align size up here, as the padding bytes will use the primary key rather than the secondary key */ + AES_init_ctx(&ncch_aes, secondary_key); + } + + /* In theory, the section offset + size could be greater than the buffer size */ + /* In practice, this likely never occurs, but just in case it does, ignore the section or constrict the size */ + if (exefs_section_offset + exefs_section_size > exefs_buffer_size) { + if (exefs_section_offset >= exefs_buffer_size) + continue; + + exefs_section_size = exefs_buffer_size - exefs_section_offset; + } + + exefs_section_name[7] = '\0'; + rc_hash_iterator_verbose_formatted(iterator, "Decrypting ExeFS file %s at ExeFS offset %08X with size %08X", + (const char*)exefs_section_name, (unsigned)exefs_section_offset, (unsigned)exefs_section_size); + + AES_CTR_xcrypt_buffer(&ncch_aes, &hash_buffer[exefs_section_offset], exefs_section_size & ~(uint64_t)0xF); + + if (exefs_section_size & 0x1FF) { + /* Handle padding bytes, these always use the primary key */ + exefs_section_offset += exefs_section_size; + exefs_section_size = 0x200 - (exefs_section_size & 0x1FF); + + rc_hash_iterator_verbose_formatted(iterator, "Decrypting ExeFS padding at ExeFS offset %08X with size %08X", + (unsigned)exefs_section_offset, (unsigned)exefs_section_size); + + /* Align our decryption start to an AES block boundary */ + if (exefs_section_size & 0xF) { + /* We're a little evil here re-using the IV like this, but this seems to be the best way to deal with this... */ + memcpy(iv, ncch_aes.Iv, sizeof(iv)); + exefs_section_offset &= ~(uint64_t)0xF; + + /* First decrypt these last bytes using the secondary key */ + AES_CTR_xcrypt_buffer(&ncch_aes, &hash_buffer[exefs_section_offset], 0x10 - (exefs_section_size & 0xF)); + + /* Now re-encrypt these bytes using the primary key */ + AES_init_ctx_iv(&ncch_aes, primary_key, iv); + AES_CTR_xcrypt_buffer(&ncch_aes, &hash_buffer[exefs_section_offset], 0x10 - (exefs_section_size & 0xF)); + + /* All of the padding can now be decrypted using the primary key */ + AES_ctx_set_iv(&ncch_aes, iv); + exefs_section_size += 0x10 - (exefs_section_size & 0xF); + } + + AES_init_ctx(&ncch_aes, primary_key); + AES_CTR_xcrypt_buffer(&ncch_aes, &hash_buffer[exefs_section_offset], (size_t)exefs_section_size); + } + } + } + + md5_append(md5, hash_buffer, exefs_buffer_size); + + free(hash_buffer); + return 1; +} + +static uint32_t rc_hash_nintendo_3ds_cia_signature_size(uint8_t header[0x200], const rc_hash_iterator_t* iterator) +{ + uint32_t signature_type; + + signature_type = ((uint32_t)header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3]; + switch (signature_type) { + case 0x010000: + case 0x010003: + return 0x200 + 0x3C; + + case 0x010001: + case 0x010004: + return 0x100 + 0x3C; + + case 0x010002: + case 0x010005: + return 0x3C + 0x40; + + default: + return rc_hash_iterator_error_formatted(iterator, "Invalid signature type %08X", (unsigned)signature_type); + } +} + +static int rc_hash_nintendo_3ds_cia(md5_state_t* md5, void* file_handle, uint8_t header[0x200], + const rc_hash_iterator_t* iterator) +{ + const uint32_t CIA_HEADER_SIZE = 0x2020; /* Yes, this is larger than the header[0x200], but we only use the beginning of the header */ + const uint64_t CIA_ALIGNMENT_MASK = 64 - 1; /* sizes are aligned by 64 bytes */ + struct AES_ctx aes; + uint8_t iv[AES_BLOCKLEN], normal_key[AES_KEYLEN], title_key[AES_KEYLEN], title_id[sizeof(uint64_t)]; + uint32_t cert_size, tik_size, tmd_size; + int64_t cert_offset, tik_offset, tmd_offset, content_offset; + uint32_t signature_size, i; + uint16_t content_count; + uint8_t common_key_index; + + cert_size = ((uint32_t)header[0x0B] << 24) | (header[0x0A] << 16) | (header[0x09] << 8) | header[0x08]; + tik_size = ((uint32_t)header[0x0F] << 24) | (header[0x0E] << 16) | (header[0x0D] << 8) | header[0x0C]; + tmd_size = ((uint32_t)header[0x13] << 24) | (header[0x12] << 16) | (header[0x11] << 8) | header[0x10]; + + cert_offset = (CIA_HEADER_SIZE + CIA_ALIGNMENT_MASK) & ~CIA_ALIGNMENT_MASK; + tik_offset = (cert_offset + cert_size + CIA_ALIGNMENT_MASK) & ~CIA_ALIGNMENT_MASK; + tmd_offset = (tik_offset + tik_size + CIA_ALIGNMENT_MASK) & ~CIA_ALIGNMENT_MASK; + content_offset = (tmd_offset + tmd_size + CIA_ALIGNMENT_MASK) & ~CIA_ALIGNMENT_MASK; + + /* Check if this CIA is encrypted, if it isn't, we can hash it right away */ + + rc_file_seek(iterator, file_handle, tmd_offset, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, 4) != 4) + return rc_hash_iterator_error(iterator, "Could not read TMD signature type"); + + signature_size = rc_hash_nintendo_3ds_cia_signature_size(header, iterator); + if (signature_size == 0) + return 0; /* rc_hash_nintendo_3ds_cia_signature_size will call rc_hash_error, so we don't need to do so here */ + + rc_file_seek(iterator, file_handle, signature_size + 0x9E, SEEK_CUR); + if (rc_file_read(iterator, file_handle, header, 2) != 2) + return rc_hash_iterator_error(iterator, "Could not read TMD content count"); + + content_count = (header[0] << 8) | header[1]; + + rc_file_seek(iterator, file_handle, 0x9C4 - 0x9E - 2, SEEK_CUR); + for (i = 0; i < content_count; i++) { + if (rc_file_read(iterator, file_handle, header, 0x30) != 0x30) + return rc_hash_iterator_error(iterator, "Could not read TMD content chunk"); + + /* Content index 0 is the main content (i.e. the 3DS executable) */ + if (((header[4] << 8) | header[5]) == 0) + break; + + content_offset += ((uint32_t)header[0xC] << 24) | (header[0xD] << 16) | (header[0xE] << 8) | header[0xF]; + } + + if (i == content_count) + return rc_hash_iterator_error(iterator, "Could not find main content chunk in TMD"); + + if ((header[7] & 1) == 0) { + /* Not encrypted, we can hash the NCCH immediately */ + rc_file_seek(iterator, file_handle, content_offset, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, 0x200) != 0x200) + return rc_hash_iterator_error(iterator, "Could not read NCCH header"); + + if (memcmp(&header[0x100], "NCCH", 4) != 0) + return rc_hash_iterator_error_formatted(iterator, "NCCH header was not at %08X%08X", (unsigned)(content_offset >> 32), (unsigned)content_offset); + + return rc_hash_nintendo_3ds_ncch(md5, file_handle, header, NULL, iterator); + } + + if (iterator->callbacks.encryption.get_3ds_cia_normal_key == NULL) + return rc_hash_iterator_error(iterator, "An encrypted CIA was detected, but the CIA normal key callback was not set"); + + /* Acquire the encrypted title key, title id, and common key index from the ticket */ + /* These will be needed to decrypt the title key, and that will be needed to decrypt the CIA */ + + rc_file_seek(iterator, file_handle, tik_offset, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, 4) != 4) + return rc_hash_iterator_error(iterator, "Could not read ticket signature type"); + + signature_size = rc_hash_nintendo_3ds_cia_signature_size(header, iterator); + if (signature_size == 0) + return 0; + + rc_file_seek(iterator, file_handle, signature_size, SEEK_CUR); + if (rc_file_read(iterator, file_handle, header, 0xB2) != 0xB2) + return rc_hash_iterator_error(iterator, "Could not read ticket data"); + + memcpy(title_key, &header[0x7F], sizeof(title_key)); + memcpy(title_id, &header[0x9C], sizeof(title_id)); + common_key_index = header[0xB1]; + + if (common_key_index > 5) + return rc_hash_iterator_error_formatted(iterator, "Invalid common key index %02X", (unsigned)common_key_index); + + if (iterator->callbacks.encryption.get_3ds_cia_normal_key(common_key_index, normal_key) == 0) + return rc_hash_iterator_error_formatted(iterator, "Could not obtain common key %02X", (unsigned)common_key_index); + + memset(iv, 0, sizeof(iv)); + memcpy(iv, title_id, sizeof(title_id)); + AES_init_ctx_iv(&aes, normal_key, iv); + + /* Finally, decrypt the title key */ + AES_CBC_decrypt_buffer(&aes, title_key, sizeof(title_key)); + + /* Now we can hash the NCCH */ + + rc_file_seek(iterator, file_handle, content_offset, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, 0x200) != 0x200) + return rc_hash_iterator_error(iterator, "Could not read NCCH header"); + + memset(iv, 0, sizeof(iv)); /* Content index is iv (which is always 0 for main content) */ + AES_init_ctx_iv(&aes, title_key, iv); + AES_CBC_decrypt_buffer(&aes, header, 0x200); + + if (memcmp(&header[0x100], "NCCH", 4) != 0) + return rc_hash_iterator_error_formatted(iterator, "NCCH header was not at %08X%08X", (unsigned)(content_offset >> 32), (unsigned)content_offset); + + return rc_hash_nintendo_3ds_ncch(md5, file_handle, header, &aes, iterator); +} + +static int rc_hash_nintendo_3ds_3dsx(md5_state_t* md5, void* file_handle, uint8_t header[0x200], const rc_hash_iterator_t* iterator) +{ + uint8_t* hash_buffer; + uint32_t header_size, reloc_header_size, code_size; + int64_t code_offset; + + header_size = (header[5] << 8) | header[4]; + reloc_header_size = (header[7] << 8) | header[6]; + code_size = ((uint32_t)header[0x13] << 24) | (header[0x12] << 16) | (header[0x11] << 8) | header[0x10]; + + /* 3 relocation headers are in-between the 3DSX header and code segment */ + code_offset = header_size + reloc_header_size * 3; + + if (code_size > MAX_BUFFER_SIZE) + code_size = MAX_BUFFER_SIZE; + + hash_buffer = (uint8_t*)malloc(code_size); + if (!hash_buffer) + return rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", (unsigned)code_size); + + rc_file_seek(iterator, file_handle, code_offset, SEEK_SET); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u bytes for 3DSX (at %08X)", (unsigned)code_size, (unsigned)code_offset); + + if (rc_file_read(iterator, file_handle, hash_buffer, code_size) != code_size) { + free(hash_buffer); + return rc_hash_iterator_error(iterator, "Could not read 3DSX code segment"); + } + + md5_append(md5, hash_buffer, code_size); + + free(hash_buffer); + return 1; +} + +int rc_hash_nintendo_3ds(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + void* file_handle; + uint8_t header[0x200]; /* NCCH and NCSD headers are both 0x200 bytes */ + int64_t header_offset; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + + /* If we don't have a full header, this is probably not a 3DS ROM */ + if (rc_file_read(iterator, file_handle, header, sizeof(header)) != sizeof(header)) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not read 3DS ROM header"); + } + + md5_init(&md5); + + if (memcmp(&header[0x100], "NCSD", 4) == 0) { + /* A NCSD container contains 1-8 NCCH partitions */ + /* The first partition (index 0) is reserved for executable content */ + header_offset = ((uint32_t)header[0x123] << 24) | (header[0x122] << 16) | (header[0x121] << 8) | header[0x120]; + /* Offset is in "media units" (1 media unit = 0x200 bytes) */ + header_offset *= 0x200; + + /* We include the NCSD header in the hash, as that will ensure different versions of a game result in a different hash + * This is due to some revisions / languages only ever changing other NCCH paritions (e.g. the game manual) + */ + rc_hash_iterator_verbose(iterator, "Hashing 512 byte NCSD header"); + md5_append(&md5, header, sizeof(header)); + + rc_hash_iterator_verbose_formatted(iterator, + "Detected NCSD header, seeking to NCCH partition at %08X%08X", + (unsigned)(header_offset >> 32), (unsigned)header_offset); + + rc_file_seek(iterator, file_handle, header_offset, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, sizeof(header)) != sizeof(header)) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not read 3DS NCCH header"); + } + + if (memcmp(&header[0x100], "NCCH", 4) != 0) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error_formatted(iterator, "3DS NCCH header was not at %08X%08X", (unsigned)(header_offset >> 32), (unsigned)header_offset); + } + } + + if (memcmp(&header[0x100], "NCCH", 4) == 0) { + if (rc_hash_nintendo_3ds_ncch(&md5, file_handle, header, NULL, iterator)) { + rc_file_close(iterator, file_handle); + return rc_hash_finalize(iterator, &md5, hash); + } + + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Failed to hash 3DS NCCH container"); + } + + /* Couldn't identify either an NCSD or NCCH */ + + /* Try to identify this as a CIA */ + if (header[0] == 0x20 && header[1] == 0x20 && header[2] == 0x00 && header[3] == 0x00) { + rc_hash_iterator_verbose(iterator, "Detected CIA, attempting to find executable NCCH"); + + if (rc_hash_nintendo_3ds_cia(&md5, file_handle, header, iterator)) { + rc_file_close(iterator, file_handle); + return rc_hash_finalize(iterator, &md5, hash); + } + + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Failed to hash 3DS CIA container"); + } + + /* This might be a homebrew game, try to detect that */ + if (memcmp(&header[0], "3DSX", 4) == 0) { + rc_hash_iterator_verbose(iterator, "Detected 3DSX"); + + if (rc_hash_nintendo_3ds_3dsx(&md5, file_handle, header, iterator)) { + rc_file_close(iterator, file_handle); + return rc_hash_finalize(iterator, &md5, hash); + } + + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Failed to hash 3DS 3DSX container"); + } + + /* Raw ELF marker (AXF/ELF files) */ + if (memcmp(&header[0], "\x7f\x45\x4c\x46", 4) == 0) { + rc_hash_iterator_verbose(iterator, "Detected AXF/ELF file, hashing entire file"); + + /* Don't bother doing anything fancy here, just hash entire file */ + rc_file_close(iterator, file_handle); + return rc_hash_whole_file(hash, iterator); + } + + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Not a 3DS ROM"); +} diff --git a/src/rcheevos/src/rhash/hash_rom.c b/src/rcheevos/src/rhash/hash_rom.c new file mode 100644 index 0000000000..996c3080c3 --- /dev/null +++ b/src/rcheevos/src/rhash/hash_rom.c @@ -0,0 +1,426 @@ +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +#include + +/* ===================================================== */ + +static int rc_hash_unheadered_iterator_buffer(char hash[33], const rc_hash_iterator_t* iterator, size_t header_size) +{ + return rc_hash_buffer(hash, iterator->buffer + header_size, iterator->buffer_size - header_size, iterator); +} + +static int rc_hash_iterator_buffer(char hash[33], const rc_hash_iterator_t* iterator) +{ + return rc_hash_buffer(hash, iterator->buffer, iterator->buffer_size, iterator); +} + +/* ===================================================== */ + +int rc_hash_7800(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* if the file contains a header, ignore it */ + if (memcmp(&iterator->buffer[1], "ATARI7800", 9) == 0) { + rc_hash_iterator_verbose(iterator, "Ignoring 7800 header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 128); + } + + return rc_hash_iterator_buffer(hash, iterator); +} + +int rc_hash_arcade(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* arcade hash is just the hash of the filename (no extension) - the cores are pretty stringent about having the right ROM data */ + const char* filename = rc_path_get_filename(iterator->path); + const char* ext = rc_path_get_extension(filename); + char buffer[128]; /* realistically, this should never need more than ~32 characters */ + size_t filename_length = ext - filename - 1; + + /* fbneo supports loading subsystems by using specific folder names. + * if one is found, include it in the hash. + * https://github.com/libretro/FBNeo/blob/master/src/burner/libretro/README.md#emulating-consoles-and-computers + */ + if (filename > iterator->path + 1) { + int include_folder = 0; + const char* folder = filename - 1; + size_t parent_folder_length = 0; + + do { + if (folder[-1] == '/' || folder[-1] == '\\') + break; + + --folder; + } while (folder > iterator->path); + + parent_folder_length = filename - folder - 1; + if (parent_folder_length < 16) { + char* ptr = buffer; + while (folder < filename - 1) + *ptr++ = tolower(*folder++); + *ptr = '\0'; + + folder = buffer; + } + + switch (parent_folder_length) { + case 3: + if (memcmp(folder, "nes", 3) == 0 || /* NES */ + memcmp(folder, "fds", 3) == 0 || /* FDS */ + memcmp(folder, "sms", 3) == 0 || /* Master System */ + memcmp(folder, "msx", 3) == 0 || /* MSX */ + memcmp(folder, "ngp", 3) == 0 || /* NeoGeo Pocket */ + memcmp(folder, "pce", 3) == 0 || /* PCEngine */ + memcmp(folder, "chf", 3) == 0 || /* ChannelF */ + memcmp(folder, "sgx", 3) == 0) /* SuperGrafX */ + include_folder = 1; + break; + case 4: + if (memcmp(folder, "tg16", 4) == 0 || /* TurboGrafx-16 */ + memcmp(folder, "msx1", 4) == 0) /* MSX */ + include_folder = 1; + break; + case 5: + if (memcmp(folder, "neocd", 5) == 0) /* NeoGeo CD */ + include_folder = 1; + break; + case 6: + if (memcmp(folder, "coleco", 6) == 0 || /* Colecovision */ + memcmp(folder, "sg1000", 6) == 0) /* SG-1000 */ + include_folder = 1; + break; + case 7: + if (memcmp(folder, "genesis", 7) == 0) /* Megadrive (Genesis) */ + include_folder = 1; + break; + case 8: + if (memcmp(folder, "gamegear", 8) == 0 || /* Game Gear */ + memcmp(folder, "megadriv", 8) == 0 || /* Megadrive */ + memcmp(folder, "pcengine", 8) == 0 || /* PCEngine */ + memcmp(folder, "channelf", 8) == 0 || /* ChannelF */ + memcmp(folder, "spectrum", 8) == 0) /* ZX Spectrum */ + include_folder = 1; + break; + case 9: + if (memcmp(folder, "megadrive", 9) == 0) /* Megadrive */ + include_folder = 1; + break; + case 10: + if (memcmp(folder, "supergrafx", 10) == 0 || /* SuperGrafX */ + memcmp(folder, "zxspectrum", 10) == 0) /* ZX Spectrum */ + include_folder = 1; + break; + case 12: + if (memcmp(folder, "mastersystem", 12) == 0 || /* Master System */ + memcmp(folder, "colecovision", 12) == 0) /* Colecovision */ + include_folder = 1; + break; + default: + break; + } + + if (include_folder) { + if (parent_folder_length + filename_length + 1 < sizeof(buffer)) { + buffer[parent_folder_length] = '_'; + memcpy(&buffer[parent_folder_length + 1], filename, filename_length); + return rc_hash_buffer(hash, (uint8_t*)&buffer[0], parent_folder_length + filename_length + 1, iterator); + } + } + } + + return rc_hash_buffer(hash, (uint8_t*)filename, filename_length, iterator); +} + +static int rc_hash_text(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + const uint8_t* scan = iterator->buffer; + const uint8_t* stop = iterator->buffer + iterator->buffer_size; + + md5_init(&md5); + + do { + const uint8_t* line = scan; + + /* find end of line */ + while (scan < stop && *scan != '\r' && *scan != '\n') + ++scan; + + md5_append(&md5, line, (int)(scan - line)); + + /* include a normalized line ending */ + /* NOTE: this causes a line ending to be hashed at the end of the file, even if one was not present */ + md5_append(&md5, (const uint8_t*)"\n", 1); + + /* skip newline */ + if (scan < stop && *scan == '\r') + ++scan; + if (scan < stop && *scan == '\n') + ++scan; + + } while (scan < stop); + + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_arduboy(char hash[33], const rc_hash_iterator_t* iterator) +{ + if (iterator->path && rc_path_compare_extension(iterator->path, "arduboy")) { +#ifndef RC_HASH_NO_ZIP + return rc_hash_arduboyfx(hash, iterator); +#else + rc_hash_iterator_verbose(iterator, ".arduboy file processing not enabled"); + return 0; +#endif + } + + if (!iterator->buffer) + return rc_hash_buffered_file(hash, RC_CONSOLE_ARDUBOY, iterator); + + /* https://en.wikipedia.org/wiki/Intel_HEX */ + return rc_hash_text(hash, iterator); +} + +int rc_hash_lynx(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* if the file contains a header, ignore it */ + if (memcmp(&iterator->buffer[0], "LYNX", 5) == 0) { + rc_hash_iterator_verbose(iterator, "Ignoring LYNX header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 64); + } + + return rc_hash_iterator_buffer(hash, iterator); +} + +int rc_hash_nes(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* if the file contains a header, ignore it */ + if (memcmp(&iterator->buffer[0], "NES\x1a", 4) == 0) { + rc_hash_iterator_verbose(iterator, "Ignoring NES header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 16); + } + + if (memcmp(&iterator->buffer[0], "FDS\x1a", 4) == 0) { + rc_hash_iterator_verbose(iterator, "Ignoring FDS header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 16); + } + + return rc_hash_iterator_buffer(hash, iterator); +} + +int rc_hash_n64(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t* buffer; + uint8_t* stop; + const size_t buffer_size = 65536; + md5_state_t md5; + size_t remaining; + void* file_handle; + int is_v64 = 0; + int is_n64 = 0; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + buffer = (uint8_t*)malloc(buffer_size); + if (!buffer) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error(iterator, "Could not allocate temporary buffer"); + } + stop = buffer + buffer_size; + + /* read first byte so we can detect endianness */ + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + rc_file_read(iterator, file_handle, buffer, 1); + + if (buffer[0] == 0x80) { /* z64 format (big endian [native]) */ + } + else if (buffer[0] == 0x37) { /* v64 format (byteswapped) */ + rc_hash_iterator_verbose(iterator, "converting v64 to z64"); + is_v64 = 1; + } + else if (buffer[0] == 0x40) { /* n64 format (little endian) */ + rc_hash_iterator_verbose(iterator, "converting n64 to z64"); + is_n64 = 1; + } + else if (buffer[0] == 0xE8 || buffer[0] == 0x22) { /* ndd format (don't byteswap) */ + } + else { + free(buffer); + rc_file_close(iterator, file_handle); + + rc_hash_iterator_verbose(iterator, "Not a Nintendo 64 ROM"); + return 0; + } + + /* calculate total file size */ + rc_file_seek(iterator, file_handle, 0, SEEK_END); + remaining = (size_t)rc_file_tell(iterator, file_handle); + if (remaining > MAX_BUFFER_SIZE) + remaining = MAX_BUFFER_SIZE; + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u bytes", (unsigned)remaining); + + /* begin hashing */ + md5_init(&md5); + + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + while (remaining >= buffer_size) { + rc_file_read(iterator, file_handle, buffer, (int)buffer_size); + + if (is_v64) + rc_hash_byteswap16(buffer, stop); + else if (is_n64) + rc_hash_byteswap32(buffer, stop); + + md5_append(&md5, buffer, (int)buffer_size); + remaining -= buffer_size; + } + + if (remaining > 0) { + rc_file_read(iterator, file_handle, buffer, (int)remaining); + + stop = buffer + remaining; + if (is_v64) + rc_hash_byteswap16(buffer, stop); + else if (is_n64) + rc_hash_byteswap32(buffer, stop); + + md5_append(&md5, buffer, (int)remaining); + } + + /* cleanup */ + rc_file_close(iterator, file_handle); + free(buffer); + + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_nintendo_ds(char hash[33], const rc_hash_iterator_t* iterator) +{ + uint8_t header[512]; + uint8_t* hash_buffer; + uint32_t hash_size, arm9_size, arm9_addr, arm7_size, arm7_addr, icon_addr; + size_t num_read; + int64_t offset = 0; + md5_state_t md5; + void* file_handle; + + file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + rc_file_seek(iterator, file_handle, 0, SEEK_SET); + if (rc_file_read(iterator, file_handle, header, sizeof(header)) != 512) + return rc_hash_iterator_error(iterator, "Failed to read header"); + + if (header[0] == 0x2E && header[1] == 0x00 && header[2] == 0x00 && header[3] == 0xEA && + header[0xB0] == 0x44 && header[0xB1] == 0x46 && header[0xB2] == 0x96 && header[0xB3] == 0) { + /* SuperCard header detected, ignore it */ + rc_hash_iterator_verbose(iterator, "Ignoring SuperCard header"); + + offset = 512; + rc_file_seek(iterator, file_handle, offset, SEEK_SET); + rc_file_read(iterator, file_handle, header, sizeof(header)); + } + + arm9_addr = header[0x20] | (header[0x21] << 8) | (header[0x22] << 16) | (header[0x23] << 24); + arm9_size = header[0x2C] | (header[0x2D] << 8) | (header[0x2E] << 16) | (header[0x2F] << 24); + arm7_addr = header[0x30] | (header[0x31] << 8) | (header[0x32] << 16) | (header[0x33] << 24); + arm7_size = header[0x3C] | (header[0x3D] << 8) | (header[0x3E] << 16) | (header[0x3F] << 24); + icon_addr = header[0x68] | (header[0x69] << 8) | (header[0x6A] << 16) | (header[0x6B] << 24); + + if (arm9_size + arm7_size > 16 * 1024 * 1024) { + /* sanity check - code blocks are typically less than 1MB each - assume not a DS ROM */ + return rc_hash_iterator_error_formatted(iterator, "arm9 code size (%u) + arm7 code size (%u) exceeds 16MB", arm9_size, arm7_size); + } + + hash_size = 0xA00; + if (arm9_size > hash_size) + hash_size = arm9_size; + if (arm7_size > hash_size) + hash_size = arm7_size; + + hash_buffer = (uint8_t*)malloc(hash_size); + if (!hash_buffer) { + rc_file_close(iterator, file_handle); + return rc_hash_iterator_error_formatted(iterator, "Failed to allocate %u bytes", hash_size); + } + + md5_init(&md5); + + rc_hash_iterator_verbose(iterator, "Hashing 352 byte header"); + md5_append(&md5, header, 0x160); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte arm9 code (at %08X)", arm9_size, arm9_addr); + + rc_file_seek(iterator, file_handle, arm9_addr + offset, SEEK_SET); + rc_file_read(iterator, file_handle, hash_buffer, arm9_size); + md5_append(&md5, hash_buffer, arm9_size); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u byte arm7 code (at %08X)", arm7_size, arm7_addr); + + rc_file_seek(iterator, file_handle, arm7_addr + offset, SEEK_SET); + rc_file_read(iterator, file_handle, hash_buffer, arm7_size); + md5_append(&md5, hash_buffer, arm7_size); + + rc_hash_iterator_verbose_formatted(iterator, "Hashing 2560 byte icon and labels data (at %08X)", icon_addr); + + rc_file_seek(iterator, file_handle, icon_addr + offset, SEEK_SET); + num_read = rc_file_read(iterator, file_handle, hash_buffer, 0xA00); + if (num_read < 0xA00) { + /* some homebrew games don't provide a full icon block, and no data after the icon block. + * if we didn't get a full icon block, fill the remaining portion with 0s + */ + rc_hash_iterator_verbose_formatted(iterator, + "Warning: only got %u bytes for icon and labels data, 0-padding to 2560 bytes", (unsigned)num_read); + + memset(&hash_buffer[num_read], 0, 0xA00 - num_read); + } + md5_append(&md5, hash_buffer, 0xA00); + + free(hash_buffer); + rc_file_close(iterator, file_handle); + + return rc_hash_finalize(iterator, &md5, hash); +} + +int rc_hash_pce(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* The PCE header doesn't bear any distinguishable marks, so we have to detect + * it by looking at the file size. The core looks for anything that's 512 bytes + * more than a multiple of 8KB, so we'll do that too. + * https://github.com/libretro/beetle-pce-libretro/blob/af28fb0385d00e0292c4703b3aa7e72762b564d2/mednafen/pce/huc.cpp#L196-L202 + */ + if (iterator->buffer_size & 512) { + rc_hash_iterator_verbose(iterator, "Ignoring PCE header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 512); + } + + return rc_hash_iterator_buffer(hash, iterator); +} + +int rc_hash_scv(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* if the file contains a header, ignore it */ + /* https://gitlab.com/MaaaX-EmuSCV/libretro-emuscv/-/blob/master/readme.txt#L211 */ + if (memcmp(iterator->buffer, "EmuSCV", 6) == 0) { + rc_hash_iterator_verbose(iterator, "Ignoring SCV header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 32); + } + + return rc_hash_iterator_buffer(hash, iterator); +} + +int rc_hash_snes(char hash[33], const rc_hash_iterator_t* iterator) +{ + /* if the file contains a header, ignore it */ + uint32_t calc_size = ((uint32_t)iterator->buffer_size / 0x2000) * 0x2000; + if (iterator->buffer_size - calc_size == 512) { + rc_hash_iterator_verbose(iterator, "Ignoring SNES header"); + return rc_hash_unheadered_iterator_buffer(hash, iterator, 512); + } + + return rc_hash_iterator_buffer(hash, iterator); +} diff --git a/src/rcheevos/src/rhash/hash_zip.c b/src/rcheevos/src/rhash/hash_zip.c new file mode 100644 index 0000000000..060dc938dd --- /dev/null +++ b/src/rcheevos/src/rhash/hash_zip.c @@ -0,0 +1,460 @@ +#include "rc_hash_internal.h" + +#include "../rc_compat.h" + +struct rc_hash_zip_idx +{ + size_t length; + uint8_t* data; +}; + +static int rc_hash_zip_idx_sort(const void* a, const void* b) +{ + struct rc_hash_zip_idx* A = (struct rc_hash_zip_idx*)a, * B = (struct rc_hash_zip_idx*)b; + size_t len = (A->length < B->length ? A->length : B->length); + return memcmp(A->data, B->data, len); +} + +typedef int (RC_CCONV* rc_hash_zip_filter_t)(const char* filename, uint32_t filename_len, uint64_t decomp_size, void* userdata); + +static int rc_hash_zip_file(md5_state_t* md5, void* file_handle, + const rc_hash_iterator_t* iterator, + rc_hash_zip_filter_t filter_func, void* filter_userdata) +{ + uint8_t buf[2048], *alloc_buf, *cdir_start, *cdir_max, *cdir, *hashdata, eocdirhdr_size, cdirhdr_size, nparents; + uint32_t cdir_entry_len; + size_t sizeof_idx, indices_offset, alloc_size; + int64_t i_file, archive_size, ecdh_ofs, total_files, cdir_size, cdir_ofs; + struct rc_hash_zip_idx* hashindices, *hashindex; + + rc_file_seek(iterator, file_handle, 0, SEEK_END); + archive_size = rc_file_tell(iterator, file_handle); + + /* Basic sanity checks - reject files which are too small */ + eocdirhdr_size = 22; /* the 'end of central directory header' is 22 bytes */ + if (archive_size < eocdirhdr_size) + return rc_hash_iterator_error(iterator, "ZIP is too small"); + + /* Macros used for reading ZIP and writing to a buffer for hashing (undefined again at the end of the function) */ + #define RC_ZIP_READ_LE16(p) ((uint16_t)(((const uint8_t*)(p))[0]) | ((uint16_t)(((const uint8_t*)(p))[1]) << 8U)) + #define RC_ZIP_READ_LE32(p) ((uint32_t)(((const uint8_t*)(p))[0]) | ((uint32_t)(((const uint8_t*)(p))[1]) << 8U) | ((uint32_t)(((const uint8_t*)(p))[2]) << 16U) | ((uint32_t)(((const uint8_t*)(p))[3]) << 24U)) + #define RC_ZIP_READ_LE64(p) ((uint64_t)(((const uint8_t*)(p))[0]) | ((uint64_t)(((const uint8_t*)(p))[1]) << 8U) | ((uint64_t)(((const uint8_t*)(p))[2]) << 16U) | ((uint64_t)(((const uint8_t*)(p))[3]) << 24U) | ((uint64_t)(((const uint8_t*)(p))[4]) << 32U) | ((uint64_t)(((const uint8_t*)(p))[5]) << 40U) | ((uint64_t)(((const uint8_t*)(p))[6]) << 48U) | ((uint64_t)(((const uint8_t*)(p))[7]) << 56U)) + #define RC_ZIP_WRITE_LE32(p,v) { ((uint8_t*)(p))[0] = (uint8_t)((uint32_t)(v) & 0xFF); ((uint8_t*)(p))[1] = (uint8_t)(((uint32_t)(v) >> 8) & 0xFF); ((uint8_t*)(p))[2] = (uint8_t)(((uint32_t)(v) >> 16) & 0xFF); ((uint8_t*)(p))[3] = (uint8_t)((uint32_t)(v) >> 24); } + #define RC_ZIP_WRITE_LE64(p,v) { ((uint8_t*)(p))[0] = (uint8_t)((uint64_t)(v) & 0xFF); ((uint8_t*)(p))[1] = (uint8_t)(((uint64_t)(v) >> 8) & 0xFF); ((uint8_t*)(p))[2] = (uint8_t)(((uint64_t)(v) >> 16) & 0xFF); ((uint8_t*)(p))[3] = (uint8_t)(((uint64_t)(v) >> 24) & 0xFF); ((uint8_t*)(p))[4] = (uint8_t)(((uint64_t)(v) >> 32) & 0xFF); ((uint8_t*)(p))[5] = (uint8_t)(((uint64_t)(v) >> 40) & 0xFF); ((uint8_t*)(p))[6] = (uint8_t)(((uint64_t)(v) >> 48) & 0xFF); ((uint8_t*)(p))[7] = (uint8_t)((uint64_t)(v) >> 56); } + + /* Find the end of central directory record by scanning the file from the end towards the beginning */ + for (ecdh_ofs = archive_size - sizeof(buf); ; ecdh_ofs -= (sizeof(buf) - 3)) { + int i, n = sizeof(buf); + if (ecdh_ofs < 0) + ecdh_ofs = 0; + if (n > archive_size) + n = (int)archive_size; + + rc_file_seek(iterator, file_handle, ecdh_ofs, SEEK_SET); + if (rc_file_read(iterator, file_handle, buf, n) != (size_t)n) + return rc_hash_iterator_error(iterator, "ZIP read error"); + + for (i = n - 4; i >= 0; --i) { + if (buf[i] == 'P' && RC_ZIP_READ_LE32(buf + i) == 0x06054b50) /* end of central directory header signature */ + break; + } + + if (i >= 0) { + ecdh_ofs += i; + break; + } + + if (!ecdh_ofs || (archive_size - ecdh_ofs) >= (0xFFFF + eocdirhdr_size)) + return rc_hash_iterator_error(iterator, "Failed to find ZIP central directory"); + } + + /* Read and verify the end of central directory record. */ + rc_file_seek(iterator, file_handle, ecdh_ofs, SEEK_SET); + if (rc_file_read(iterator, file_handle, buf, eocdirhdr_size) != eocdirhdr_size) + return rc_hash_iterator_error(iterator, "Failed to read ZIP central directory"); + + /* Read central dir information from end of central directory header */ + total_files = RC_ZIP_READ_LE16(buf + 0x0A); + cdir_size = RC_ZIP_READ_LE32(buf + 0x0C); + cdir_ofs = RC_ZIP_READ_LE32(buf + 0x10); + + /* Check if this is a Zip64 file. In the block of code below: + * - 20 is the size of the ZIP64 end of central directory locator + * - 56 is the size of the ZIP64 end of central directory header + */ + if ((cdir_ofs == 0xFFFFFFFF || cdir_size == 0xFFFFFFFF || total_files == 0xFFFF) && ecdh_ofs >= (20 + 56)) { + /* Read the ZIP64 end of central directory locator if it actually exists */ + rc_file_seek(iterator, file_handle, ecdh_ofs - 20, SEEK_SET); + if (rc_file_read(iterator, file_handle, buf, 20) == 20 && RC_ZIP_READ_LE32(buf) == 0x07064b50) { /* locator signature */ + /* Found the locator, now read the actual ZIP64 end of central directory header */ + int64_t ecdh64_ofs = (int64_t)RC_ZIP_READ_LE64(buf + 0x08); + if (ecdh64_ofs <= (archive_size - 56)) { + rc_file_seek(iterator, file_handle, ecdh64_ofs, SEEK_SET); + if (rc_file_read(iterator, file_handle, buf, 56) == 56 && RC_ZIP_READ_LE32(buf) == 0x06064b50) { /* header signature */ + total_files = RC_ZIP_READ_LE64(buf + 0x20); + cdir_size = RC_ZIP_READ_LE64(buf + 0x28); + cdir_ofs = RC_ZIP_READ_LE64(buf + 0x30); + } + } + } + } + + /* Basic verificaton of central directory (limit to a 256MB content directory) */ + cdirhdr_size = 46; /* the 'central directory header' is 46 bytes */ + if ((cdir_size >= 0x10000000) || (cdir_size < total_files * cdirhdr_size) || ((cdir_ofs + cdir_size) > archive_size)) + return rc_hash_iterator_error(iterator, "Central directory of ZIP file is invalid"); + + /* Allocate once for both directory and our temporary sort index (memory aligned to sizeof(rc_hash_zip_idx)) */ + sizeof_idx = sizeof(struct rc_hash_zip_idx); + indices_offset = (size_t)((cdir_size + sizeof_idx - 1) / sizeof_idx * sizeof_idx); + alloc_size = (size_t)(indices_offset + total_files * sizeof_idx); + alloc_buf = (uint8_t*)malloc(alloc_size); + + /* Read entire central directory to a buffer */ + if (!alloc_buf) + return rc_hash_iterator_error(iterator, "Could not allocate temporary buffer"); + + rc_file_seek(iterator, file_handle, cdir_ofs, SEEK_SET); + if ((int64_t)rc_file_read(iterator, file_handle, alloc_buf, (int)cdir_size) != cdir_size) { + free(alloc_buf); + return rc_hash_iterator_error(iterator, "Failed to read central directory of ZIP file"); + } + + cdir_start = alloc_buf; + cdir_max = cdir_start + cdir_size - cdirhdr_size; + cdir = cdir_start; + + /* Write our temporary hash data to the same buffer we read the central directory from. + * We can do that because the amount of data we keep for each file is guaranteed to be less than the file record. + */ + hashdata = alloc_buf; + hashindices = (struct rc_hash_zip_idx*)(alloc_buf + indices_offset); + hashindex = hashindices; + + /* Now process the central directory file records */ + for (i_file = nparents = 0, cdir = cdir_start; i_file < total_files && cdir >= cdir_start && cdir <= cdir_max; i_file++, cdir += cdir_entry_len) { + const uint8_t* name, * name_end; + uint32_t signature = RC_ZIP_READ_LE32(cdir + 0x00); + uint32_t method = RC_ZIP_READ_LE16(cdir + 0x0A); + uint32_t crc32 = RC_ZIP_READ_LE32(cdir + 0x10); + uint64_t comp_size = RC_ZIP_READ_LE32(cdir + 0x14); + uint64_t decomp_size = RC_ZIP_READ_LE32(cdir + 0x18); + uint32_t filename_len = RC_ZIP_READ_LE16(cdir + 0x1C); + int32_t extra_len = RC_ZIP_READ_LE16(cdir + 0x1E); + int32_t comment_len = RC_ZIP_READ_LE16(cdir + 0x20); + int32_t external_attr = RC_ZIP_READ_LE16(cdir + 0x26); + uint64_t local_hdr_ofs = RC_ZIP_READ_LE32(cdir + 0x2A); + cdir_entry_len = cdirhdr_size + filename_len + extra_len + comment_len; + + if (signature != 0x02014b50) /* expected central directory entry signature */ + break; + + /* Ignore records describing a directory (we only hash file records) */ + name = (cdir + cdirhdr_size); + if (name[filename_len - 1] == '/' || name[filename_len - 1] == '\\' || (external_attr & 0x10)) + continue; + + /* Handle Zip64 fields */ + if (decomp_size == 0xFFFFFFFF || comp_size == 0xFFFFFFFF || local_hdr_ofs == 0xFFFFFFFF) { + int invalid = 0; + const uint8_t* x = cdir + cdirhdr_size + filename_len, * xEnd, * field, * fieldEnd; + for (xEnd = x + extra_len; (x + (sizeof(uint16_t) * 2)) < xEnd; x = fieldEnd) { + field = x + (sizeof(uint16_t) * 2); + fieldEnd = field + RC_ZIP_READ_LE16(x + 2); + if (RC_ZIP_READ_LE16(x) != 0x0001 || fieldEnd > xEnd) + continue; /* Not the Zip64 extended information extra field */ + + if (decomp_size == 0xFFFFFFFF) { + if ((unsigned)(fieldEnd - field) < sizeof(uint64_t)) { + invalid = 1; + break; + } + + decomp_size = RC_ZIP_READ_LE64(field); + field += sizeof(uint64_t); + } + + if (comp_size == 0xFFFFFFFF) { + if ((unsigned)(fieldEnd - field) < sizeof(uint64_t)) { + invalid = 1; + break; + } + + comp_size = RC_ZIP_READ_LE64(field); + field += sizeof(uint64_t); + } + + if (local_hdr_ofs == 0xFFFFFFFF) { + if ((unsigned)(fieldEnd - field) < sizeof(uint64_t)) { + invalid = 1; + break; + } + + local_hdr_ofs = RC_ZIP_READ_LE64(field); + field += sizeof(uint64_t); + } + + break; + } + + if (invalid) { + free(alloc_buf); + return rc_hash_iterator_error(iterator, "Encountered invalid Zip64 file"); + } + } + + /* Basic sanity check on file record */ + /* 30 is the length of the local directory header preceeding the compressed data */ + if ((!method && decomp_size != comp_size) || (decomp_size && !comp_size) || + ((local_hdr_ofs + 30 + comp_size) > (uint64_t)archive_size)) { + free(alloc_buf); + return rc_hash_iterator_error(iterator, "Encountered invalid entry in ZIP central directory"); + } + + if (filter_func) { + int filtered = filter_func((const char*)name, filename_len, decomp_size, filter_userdata); + if (filtered < 0) { + free(alloc_buf); + return 0; + } + + if (filtered) /* this file shouldn't be hashed */ + continue; + } + + /* Write the pointer and length of the data we record about this file */ + hashindex->data = hashdata; + hashindex->length = filename_len + 1 + 4 + 8; + hashindex++; + + rc_hash_iterator_verbose_formatted(iterator, "File in ZIP: %.*s (%u bytes, CRC32 = %08X)", filename_len, (const char*)name, (unsigned)decomp_size, crc32); + + /* Convert and store the file name in the hash data buffer */ + for (name_end = name + filename_len; name != name_end; name++) { + *(hashdata++) = + (*name == '\\' ? '/' : /* convert back-slashes to regular slashes */ + (*name >= 'A' && *name <= 'Z') ? (*name | 0x20) : /* convert upper case letters to lower case */ + *name); /* else use the byte as-is */ + } + + /* Add zero terminator, CRC32 and decompressed size to the hash data buffer */ + *(hashdata++) = '\0'; + RC_ZIP_WRITE_LE32(hashdata, crc32); + hashdata += 4; + RC_ZIP_WRITE_LE64(hashdata, decomp_size); + hashdata += 8; + } + + rc_hash_iterator_verbose_formatted(iterator, "Hashing %u files in ZIP archive", (unsigned)(hashindex - hashindices)); + + /* Sort the file list indices */ + qsort(hashindices, (hashindex - hashindices), sizeof(struct rc_hash_zip_idx), rc_hash_zip_idx_sort); + + /* Hash the data in the order of the now sorted indices */ + for (; hashindices != hashindex; hashindices++) + md5_append(md5, hashindices->data, (int)hashindices->length); + + free(alloc_buf); + + return 1; + + #undef RC_ZIP_READ_LE16 + #undef RC_ZIP_READ_LE32 + #undef RC_ZIP_READ_LE64 + #undef RC_ZIP_WRITE_LE32 + #undef RC_ZIP_WRITE_LE64 +} + +/* ===================================================== */ + +static int rc_hash_arduboyfx_filter(const char* filename, uint32_t filename_len, uint64_t decomp_size, void* userdata) +{ + (void)decomp_size; + (void)userdata; + + /* An .arduboy file is a zip file containing an info.json pointing at one or more bin + * and hex files. It can also contain a bunch of screenshots, but we don't care about + * those. As they're also referenced in the info.json, we have to ignore that too. + * Instead of ignoring the info.json and all image files, only process any bin/hex files */ + if (filename_len > 4) { + const char* ext = &filename[filename_len - 4]; + if (strncasecmp(ext, ".hex", 4) == 0 || strncasecmp(ext, ".bin", 4) == 0) + return 0; /* keep hex and bin */ + } + + return 1; /* filter everything else */ +} + +int rc_hash_arduboyfx(char hash[33], const rc_hash_iterator_t* iterator) +{ + md5_state_t md5; + int res; + + void* file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + md5_init(&md5); + res = rc_hash_zip_file(&md5, file_handle, iterator, rc_hash_arduboyfx_filter, NULL); + rc_file_close(iterator, file_handle); + + if (!res) + return 0; + + return rc_hash_finalize(iterator, &md5, hash); +} + +/* ===================================================== */ + +struct rc_hash_ms_dos_dosz_state { + const char* path; + const struct rc_hash_ms_dos_dosz_state* child; + + md5_state_t* md5; + const rc_hash_iterator_t* iterator; + void* file_handle; + uint32_t nparents; +}; + +static int rc_hash_dosz(struct rc_hash_ms_dos_dosz_state* dosz); + +static int rc_hash_ms_dos_parent(const struct rc_hash_ms_dos_dosz_state* child, + const char* parentname, uint32_t parentname_len) +{ + const char* lastfslash = strrchr(child->path, '/'); + const char* lastbslash = strrchr(child->path, '\\'); + const char* lastslash = (lastbslash > lastfslash ? lastbslash : lastfslash); + size_t dir_len = (lastslash ? (lastslash + 1 - child->path) : 0); + char* parent_path = (char*)malloc(dir_len + parentname_len + 1); + struct rc_hash_ms_dos_dosz_state parent; + const struct rc_hash_ms_dos_dosz_state* check; + void* parent_handle; + int parent_res; + + /* Build the path of the parent by combining the directory of the current file with the name */ + if (!parent_path) + return rc_hash_iterator_error(child->iterator, "Could not allocate temporary buffer"); + + memcpy(parent_path, child->path, dir_len); + memcpy(parent_path + dir_len, parentname, parentname_len); + parent_path[dir_len + parentname_len] = '\0'; + + /* Make sure there is no recursion where a parent DOSZ is an already seen child DOSZ */ + for (check = child->child; check; check = check->child) { + if (!strcmp(check->path, parent_path)) { + free(parent_path); + return rc_hash_iterator_error(child->iterator, "Invalid DOSZ file with recursive parents"); + } + } + + /* Try to open the parent DOSZ file */ + parent_handle = rc_file_open(child->iterator, parent_path); + if (!parent_handle) { + rc_hash_iterator_error_formatted(child->iterator, "DOSZ parent file '%s' does not exist", parent_path); + free(parent_path); + return 0; + } + + /* Fully hash the parent DOSZ ahead of the child */ + memcpy(&parent, child, sizeof(parent)); + parent.path = parent_path; + parent.child = child; + parent.file_handle = parent_handle; + parent_res = rc_hash_dosz(&parent); + rc_file_close(child->iterator, parent_handle); + free(parent_path); + return parent_res; +} + +static int rc_hash_ms_dos_dosc(const struct rc_hash_ms_dos_dosz_state* dosz) +{ + size_t path_len = strlen(dosz->path); + if (dosz->path[path_len - 1] == 'z' || dosz->path[path_len - 1] == 'Z') { + void* file_handle; + char* dosc_path = strdup(dosz->path); + if (!dosc_path) + return rc_hash_iterator_error(dosz->iterator, "Could not allocate temporary buffer"); + + /* Swap the z to c and use the same capitalization, hash the file if it exists */ + dosc_path[path_len - 1] = (dosz->path[path_len - 1] == 'z' ? 'c' : 'C'); + file_handle = rc_file_open(dosz->iterator, dosc_path); + free(dosc_path); + + if (file_handle) { + /* Hash the entire contents of the DOSC file */ + int res = rc_hash_zip_file(dosz->md5, file_handle, dosz->iterator, NULL, NULL); + rc_file_close(dosz->iterator, file_handle); + if (!res) + return 0; + } + } + + return 1; +} + +static int rc_hash_dosz_filter(const char* filename, uint32_t filename_len, uint64_t decomp_size, void* userdata) +{ + struct rc_hash_ms_dos_dosz_state* dosz = (struct rc_hash_ms_dos_dosz_state*)userdata; + + /* A DOSZ file can contain a special empty .dosz.parent file in its root which means a parent dosz file is used */ + if (decomp_size == 0 && filename_len > 7 && + strncasecmp(&filename[filename_len - 7], ".parent", 7) == 0 && + !memchr(filename, '/', filename_len) && + !memchr(filename, '\\', filename_len)) + { + /* A DOSZ file can only have one parent file */ + if (dosz->nparents++) + return -1; + + /* process the parent. if it fails, stop */ + if (!rc_hash_ms_dos_parent(dosz, filename, (filename_len - 7))) + return -1; + + /* We don't hash this meta file so a user is free to rename it and the parent file */ + return 1; + } + + return 0; +} + +static int rc_hash_dosz(struct rc_hash_ms_dos_dosz_state* dosz) +{ + if (!rc_hash_zip_file(dosz->md5, dosz->file_handle, dosz->iterator, rc_hash_dosz_filter, dosz)) + return 0; + + /* A DOSZ file can only have one parent file */ + if (dosz->nparents > 1) + return rc_hash_iterator_error(dosz->iterator, "Invalid DOSZ file with multiple parents"); + + /* Check if an associated .dosc file exists */ + if (!rc_hash_ms_dos_dosc(dosz)) + return 0; + + return 1; +} + +int rc_hash_ms_dos(char hash[33], const rc_hash_iterator_t* iterator) +{ + struct rc_hash_ms_dos_dosz_state dosz; + md5_state_t md5; + int res; + + void* file_handle = rc_file_open(iterator, iterator->path); + if (!file_handle) + return rc_hash_iterator_error(iterator, "Could not open file"); + + memset(&dosz, 0, sizeof(dosz)); + dosz.path = iterator->path; + dosz.file_handle = file_handle; + dosz.iterator = iterator; + dosz.md5 = &md5; + + md5_init(&md5); + res = rc_hash_dosz(&dosz); + rc_file_close(iterator, file_handle); + + if (!res) + return 0; + + return rc_hash_finalize(iterator, &md5, hash); +} diff --git a/src/rcheevos/src/rhash/md5.c b/src/rcheevos/src/rhash/md5.c new file mode 100644 index 0000000000..f3a5205669 --- /dev/null +++ b/src/rcheevos/src/rhash/md5.c @@ -0,0 +1,382 @@ +/* + Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.c is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order + either statically or dynamically; added missing #include + in library. + 2002-03-11 lpd Corrected argument list for main(), and added int return + type, in test program and T value program. + 2002-02-21 lpd Added missing #include in test program. + 2000-07-03 lpd Patched to eliminate warnings about "constant is + unsigned in ANSI C, signed in traditional"; made test program + self-checking. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). + 1999-05-03 lpd Original version. + */ + +#include "md5.h" +#include +#include + +#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ +#ifdef ARCH_IS_BIG_ENDIAN +# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) +#else +# define BYTE_ORDER 0 +#endif + +#define T_MASK ((md5_word_t)~0) +#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) +#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) +#define T3 0x242070db +#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) +#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) +#define T6 0x4787c62a +#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) +#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) +#define T9 0x698098d8 +#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) +#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) +#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) +#define T13 0x6b901122 +#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) +#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) +#define T16 0x49b40821 +#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) +#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) +#define T19 0x265e5a51 +#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) +#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) +#define T22 0x02441453 +#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) +#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) +#define T25 0x21e1cde6 +#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) +#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) +#define T28 0x455a14ed +#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) +#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) +#define T31 0x676f02d9 +#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) +#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) +#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) +#define T35 0x6d9d6122 +#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) +#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) +#define T38 0x4bdecfa9 +#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) +#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) +#define T41 0x289b7ec6 +#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) +#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) +#define T44 0x04881d05 +#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) +#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) +#define T47 0x1fa27cf8 +#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) +#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) +#define T50 0x432aff97 +#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) +#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) +#define T53 0x655b59c3 +#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) +#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) +#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) +#define T57 0x6fa87e4f +#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) +#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) +#define T60 0x4e0811a1 +#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) +#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) +#define T63 0x2ad7d2bb +#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) + + +static void +md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) +{ + md5_word_t + a = pms->abcd[0], b = pms->abcd[1], + c = pms->abcd[2], d = pms->abcd[3]; + md5_word_t t; +#if BYTE_ORDER > 0 + /* Define storage only for big-endian CPUs. */ + md5_word_t X[16]; +#else + /* Define storage for little-endian or both types of CPUs. */ + md5_word_t xbuf[16]; + const md5_word_t *X; +#endif + + { +#if BYTE_ORDER == 0 + /* + * Determine dynamically whether this is a big-endian or + * little-endian machine, since we can use a more efficient + * algorithm on the latter. + */ + static const int w = 1; + + if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ +#endif +#if BYTE_ORDER <= 0 /* little-endian */ + { + /* + * On little-endian machines, we can process properly aligned + * data without copying it. + */ + if (!((ptrdiff_t)data & 3)) { + /* data are properly aligned */ + X = (const md5_word_t *)data; + } else { + /* not aligned */ + memcpy(xbuf, data, 64); + X = xbuf; + } + } +#endif +#if BYTE_ORDER == 0 + else /* dynamic big-endian */ +#endif +#if BYTE_ORDER >= 0 /* big-endian */ + { + /* + * On big-endian machines, we must arrange the bytes in the + * right order. + */ + const md5_byte_t *xp = data; + int i; + +# if BYTE_ORDER == 0 + X = xbuf; /* (dynamic only) */ +# else +# define xbuf X /* (static only) */ +# endif + for (i = 0; i < 16; ++i, xp += 4) + xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); + } +#endif + } + +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ +#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 7, T1); + SET(d, a, b, c, 1, 12, T2); + SET(c, d, a, b, 2, 17, T3); + SET(b, c, d, a, 3, 22, T4); + SET(a, b, c, d, 4, 7, T5); + SET(d, a, b, c, 5, 12, T6); + SET(c, d, a, b, 6, 17, T7); + SET(b, c, d, a, 7, 22, T8); + SET(a, b, c, d, 8, 7, T9); + SET(d, a, b, c, 9, 12, T10); + SET(c, d, a, b, 10, 17, T11); + SET(b, c, d, a, 11, 22, T12); + SET(a, b, c, d, 12, 7, T13); + SET(d, a, b, c, 13, 12, T14); + SET(c, d, a, b, 14, 17, T15); + SET(b, c, d, a, 15, 22, T16); +#undef SET + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ +#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 1, 5, T17); + SET(d, a, b, c, 6, 9, T18); + SET(c, d, a, b, 11, 14, T19); + SET(b, c, d, a, 0, 20, T20); + SET(a, b, c, d, 5, 5, T21); + SET(d, a, b, c, 10, 9, T22); + SET(c, d, a, b, 15, 14, T23); + SET(b, c, d, a, 4, 20, T24); + SET(a, b, c, d, 9, 5, T25); + SET(d, a, b, c, 14, 9, T26); + SET(c, d, a, b, 3, 14, T27); + SET(b, c, d, a, 8, 20, T28); + SET(a, b, c, d, 13, 5, T29); + SET(d, a, b, c, 2, 9, T30); + SET(c, d, a, b, 7, 14, T31); + SET(b, c, d, a, 12, 20, T32); +#undef SET + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + H(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 5, 4, T33); + SET(d, a, b, c, 8, 11, T34); + SET(c, d, a, b, 11, 16, T35); + SET(b, c, d, a, 14, 23, T36); + SET(a, b, c, d, 1, 4, T37); + SET(d, a, b, c, 4, 11, T38); + SET(c, d, a, b, 7, 16, T39); + SET(b, c, d, a, 10, 23, T40); + SET(a, b, c, d, 13, 4, T41); + SET(d, a, b, c, 0, 11, T42); + SET(c, d, a, b, 3, 16, T43); + SET(b, c, d, a, 6, 23, T44); + SET(a, b, c, d, 9, 4, T45); + SET(d, a, b, c, 12, 11, T46); + SET(c, d, a, b, 15, 16, T47); + SET(b, c, d, a, 2, 23, T48); +#undef SET + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ +#define I(x, y, z) ((y) ^ ((x) | ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 6, T49); + SET(d, a, b, c, 7, 10, T50); + SET(c, d, a, b, 14, 15, T51); + SET(b, c, d, a, 5, 21, T52); + SET(a, b, c, d, 12, 6, T53); + SET(d, a, b, c, 3, 10, T54); + SET(c, d, a, b, 10, 15, T55); + SET(b, c, d, a, 1, 21, T56); + SET(a, b, c, d, 8, 6, T57); + SET(d, a, b, c, 15, 10, T58); + SET(c, d, a, b, 6, 15, T59); + SET(b, c, d, a, 13, 21, T60); + SET(a, b, c, d, 4, 6, T61); + SET(d, a, b, c, 11, 10, T62); + SET(c, d, a, b, 2, 15, T63); + SET(b, c, d, a, 9, 21, T64); +#undef SET + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + pms->abcd[0] += a; + pms->abcd[1] += b; + pms->abcd[2] += c; + pms->abcd[3] += d; +} + +void +md5_init(md5_state_t *pms) +{ + pms->count[0] = pms->count[1] = 0; + pms->abcd[0] = 0x67452301; + pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; + pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; + pms->abcd[3] = 0x10325476; +} + +void +md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) +{ + const md5_byte_t *p = data; + int left = nbytes; + int offset = (pms->count[0] >> 3) & 63; + md5_word_t nbits = (md5_word_t)(nbytes << 3); + + if (nbytes <= 0) + return; + + /* Update the message length. */ + pms->count[1] += nbytes >> 29; + pms->count[0] += nbits; + if (pms->count[0] < nbits) + pms->count[1]++; + + /* Process an initial partial block. */ + if (offset) { + int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); + + memcpy(pms->buf + offset, p, copy); + if (offset + copy < 64) + return; + p += copy; + left -= copy; + md5_process(pms, pms->buf); + } + + /* Process full blocks. */ + for (; left >= 64; p += 64, left -= 64) + md5_process(pms, p); + + /* Process a final partial block. */ + if (left) + memcpy(pms->buf, p, left); +} + +void +md5_finish(md5_state_t *pms, md5_byte_t digest[16]) +{ + static const md5_byte_t pad[64] = { + 0x80, 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, 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 + }; + md5_byte_t data[8]; + int i; + + /* Save the length before padding. */ + for (i = 0; i < 8; ++i) + data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); + /* Pad to 56 bytes mod 64. */ + md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + /* Append the length. */ + md5_append(pms, data, 8); + for (i = 0; i < 16; ++i) + digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); +} diff --git a/src/rcheevos/src/rhash/md5.h b/src/rcheevos/src/rhash/md5.h new file mode 100644 index 0000000000..698c995d8f --- /dev/null +++ b/src/rcheevos/src/rhash/md5.h @@ -0,0 +1,91 @@ +/* + Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Removed support for non-ANSI compilers; removed + references to Ghostscript; clarified derivation from RFC 1321; + now handles byte order either statically or dynamically. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + */ + +#ifndef md5_INCLUDED +# define md5_INCLUDED + +/* + * This package supports both compile-time and run-time determination of CPU + * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be + * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is + * defined as non-zero, the code will be compiled to run only on big-endian + * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to + * run on either big- or little-endian CPUs, but will run slightly less + * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. + */ + +typedef unsigned char md5_byte_t; /* 8-bit byte */ +typedef unsigned int md5_word_t; /* 32-bit word */ + +/* Define the state of the MD5 Algorithm. */ +typedef struct md5_state_s { + md5_word_t count[2]; /* message length in bits, lsw first */ + md5_word_t abcd[4]; /* digest buffer */ + md5_byte_t buf[64]; /* accumulate block */ +} md5_state_t; + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Initialize the algorithm. */ +void md5_init(md5_state_t *pms); + +/* Append a string to the message. */ +void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); + +/* Finish the message and return the digest. */ +void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* md5_INCLUDED */ diff --git a/src/rcheevos/src/rhash/rc_hash_internal.h b/src/rcheevos/src/rhash/rc_hash_internal.h new file mode 100644 index 0000000000..f50a9348d2 --- /dev/null +++ b/src/rcheevos/src/rhash/rc_hash_internal.h @@ -0,0 +1,116 @@ +#ifndef RC_HASH_INTERNAL_H +#define RC_HASH_INTERNAL_H + +#include "rc_hash.h" +#include "md5.h" + +RC_BEGIN_C_DECLS + +/* hash.c */ + +void* rc_file_open(const rc_hash_iterator_t* iterator, const char* path); +void rc_file_seek(const rc_hash_iterator_t* iterator, void* file_handle, int64_t offset, int origin); +int64_t rc_file_tell(const rc_hash_iterator_t* iterator, void* file_handle); +size_t rc_file_read(const rc_hash_iterator_t* iterator, void* file_handle, void* buffer, int requested_bytes); +void rc_file_close(const rc_hash_iterator_t* iterator, void* file_handle); +int64_t rc_file_size(const rc_hash_iterator_t* iterator, const char* path); + + +void rc_hash_iterator_verbose(const rc_hash_iterator_t* iterator, const char* message); +void rc_hash_iterator_verbose_formatted(const rc_hash_iterator_t* iterator, const char* format, ...); +int rc_hash_iterator_error(const rc_hash_iterator_t* iterator, const char* message); +int rc_hash_iterator_error_formatted(const rc_hash_iterator_t* iterator, const char* format, ...); + + +/* arbitrary limit to prevent allocating and hashing large files */ +#define MAX_BUFFER_SIZE 64 * 1024 * 1024 + +void rc_hash_merge_callbacks(rc_hash_iterator_t* iterator, const rc_hash_callbacks_t* callbacks); +int rc_hash_finalize(const rc_hash_iterator_t* iterator, md5_state_t* md5, char hash[33]); + +int rc_hash_buffer(char hash[33], const uint8_t* buffer, size_t buffer_size, const rc_hash_iterator_t* iterator); +void rc_hash_byteswap16(uint8_t* buffer, const uint8_t* stop); +void rc_hash_byteswap32(uint8_t* buffer, const uint8_t* stop); + + +const char* rc_path_get_filename(const char* path); +const char* rc_path_get_extension(const char* path); +int rc_path_compare_extension(const char* path, const char* ext); + + +typedef void (RC_CCONV* rc_hash_iterator_ext_handler_t)(rc_hash_iterator_t* iterator, int data); +typedef struct rc_hash_iterator_ext_handler_entry_t { + char ext[8]; + rc_hash_iterator_ext_handler_t handler; + int data; +} rc_hash_iterator_ext_handler_entry_t; + +const rc_hash_iterator_ext_handler_entry_t* rc_hash_get_iterator_ext_handlers(size_t* num_handlers); + + +typedef struct rc_hash_cdrom_track_t { + void* file_handle; /* the file handle for reading the track data */ + const rc_hash_filereader_t* file_reader; /* functions to perform raw file I/O */ + int64_t file_track_offset;/* the offset of the track data within the file */ + int sector_size; /* the size of each sector in the track data */ + int sector_header_size; /* the offset to the raw data within a sector block */ + int raw_data_size; /* the amount of raw data within a sector block */ + int track_first_sector; /* the first absolute sector associated to the track (includes pregap) */ + int track_pregap_sectors; /* the number of pregap sectors */ +#ifndef NDEBUG + uint32_t track_id; /* the index of the track */ +#endif +} rc_hash_cdrom_track_t; + + +int rc_hash_whole_file(char hash[33], const rc_hash_iterator_t* iterator); +int rc_hash_buffered_file(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator); + +#ifndef RC_HASH_NO_ROM + /* hash_rom.c */ + int rc_hash_7800(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_arcade(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_arduboy(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_lynx(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_nes(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_n64(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_nintendo_ds(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_pce(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_scv(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_snes(char hash[33], const rc_hash_iterator_t* iterator); +#endif + +#ifndef RC_HASH_NO_DISC + /* hash_disc.c */ + void rc_hash_reset_iterator_disc(rc_hash_iterator_t* iterator); + + int rc_hash_3do(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_dreamcast(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_gamecube(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_jaguar_cd(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_neogeo_cd(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_pce_cd(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_pcfx_cd(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_psx(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_ps2(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_psp(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_sega_cd(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_wii(char hash[33], const rc_hash_iterator_t* iterator); +#endif + +#ifndef RC_HASH_NO_ENCRYPTED + /* hash_encrypted.c */ + void rc_hash_reset_iterator_encrypted(rc_hash_iterator_t* iterator); + + int rc_hash_nintendo_3ds(char hash[33], const rc_hash_iterator_t* iterator); +#endif + +#ifndef RC_HASH_NO_ZIP + /* hash_zip.c */ + int rc_hash_ms_dos(char hash[33], const rc_hash_iterator_t* iterator); + int rc_hash_arduboyfx(char hash[33], const rc_hash_iterator_t* iterator); +#endif + +RC_END_C_DECLS + +#endif /* RC_HASH_INTERNAL_H */