diff --git a/examples/tests/app_loader/abort-test/Makefile b/examples/tests/app_loader/abort-test/Makefile new file mode 100644 index 000000000..616699d57 --- /dev/null +++ b/examples/tests/app_loader/abort-test/Makefile @@ -0,0 +1,13 @@ +# Makefile for user application + +# Specify this directory relative to the current application. +TOCK_USERLAND_BASE_DIR = ../../../.. + +# Which files to compile. +C_SRCS := $(wildcard *.c) + +override CFLAGS += -I../app_binaries/cortex-m4 + +# Include userland master makefile. Contains rules and flags for actually +# building the application. +include $(TOCK_USERLAND_BASE_DIR)/AppMakefile.mk \ No newline at end of file diff --git a/examples/tests/app_loader/abort-test/README.md b/examples/tests/app_loader/abort-test/README.md new file mode 100644 index 000000000..89c56e3b5 --- /dev/null +++ b/examples/tests/app_loader/abort-test/README.md @@ -0,0 +1,15 @@ +# Dynamic App Loader Abort Test (Helper App) +============================================ + +This app waits upon console input. It only recognizes three characters - +'0', '1' and '2' + +When the app receives '0', it installs `tock-dpl-hello`, a variant of +the `c-hello` program. + +When the app receives '1', it installs `blink`. + +When the app receives '2', it begins installing `adc`, and midway +through the install, it aborts the install. This app essentially +showcases the ability of the `abort` functionality of the Dynamic +Process Loader. diff --git a/examples/tests/app_loader/abort-test/adc.c b/examples/tests/app_loader/abort-test/adc.c new file mode 120000 index 000000000..077d8d82c --- /dev/null +++ b/examples/tests/app_loader/abort-test/adc.c @@ -0,0 +1 @@ +../app_binaries/cortex-m4/adc.c \ No newline at end of file diff --git a/examples/tests/app_loader/abort-test/blink.c b/examples/tests/app_loader/abort-test/blink.c new file mode 120000 index 000000000..6738712d2 --- /dev/null +++ b/examples/tests/app_loader/abort-test/blink.c @@ -0,0 +1 @@ +../app_binaries/cortex-m4/blink.c \ No newline at end of file diff --git a/examples/tests/app_loader/abort-test/main.c b/examples/tests/app_loader/abort-test/main.c new file mode 100644 index 000000000..6c2eba325 --- /dev/null +++ b/examples/tests/app_loader/abort-test/main.c @@ -0,0 +1,258 @@ +// \file + +// This is a helper program to test the dynamic app loading functionality +// of Tock works. This app has three other application binaries +// (a c-hello variant, blink and ADC) +// pre-programmed into it. When the app receives a command via console, +// the dynamic process loader enables the new app to be written to flash and +// loaded as a new process, or abort it depending on the command received. + +#include +#include +#include + +#include "tock-apps.h" +#include +#include +#include +#include + + +#define FLASH_BUFFER_SIZE 512 +#define RETURNCODE_SUCCESS 0 +#define CONSOLE_BUFFER_SIZE 1 + +uint8_t console_buffer[CONSOLE_BUFFER_SIZE]; + +static bool setup_done = false; // to check if setup is done +static bool write_done = false; // to check if writing to flash is done +static bool finalize_done = false; // to check if the kernel is done finalizing the process binary +static bool load_done = false; // to check if the process was loaded successfully +static bool abort_done = false; // to check if the process binary writing + // was aborted successfully + +static bool abort_tracker = false; // track when an abort was successful to stop writing + // process binary data + +/****************************************************************************************************** +* Function Prototypes +******************************************************************************************************/ +void abort_test(void); + +/****************************************************************************************************** + * Callback functions + * + * 1. Callback to let us know when the capsule is done writing data to flash + * 2. Set callback to initiate the dynamic app load process on receiving command from console + * + *******************************************************************************************************/ + +static void app_setup_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + setup_done = true; +} + +static void app_write_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + write_done = true; +} + +static void app_finalize_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + finalize_done = true; +} + +static void app_load_done_callback(int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + + if (arg0 != RETURNCODE_SUCCESS) { + printf("[Error] Process creation failed: %d.\n", arg0); + } else { + printf("[Success] Process created successfully.\n"); + } + load_done = true; +} + +static void app_abort_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + abort_done = true; +} + +// Callback for console commands. +void abort_test(void) { + + uint8_t* app_data = adc_data; + uint32_t app_size = sizeof(adc_data); + abort_tracker = true; + + int ret = libtock_app_loader_setup(app_size); + if (ret != RETURNCODE_SUCCESS) { + printf("[Error] Setup Failed: %d.\n", ret); + tock_exit(ret); + } + + // wait on setup done callback + yield_for(&setup_done); + setup_done = false; + + printf("[Success] Setup successful. Writing app to flash.\n"); + int ret1 = write_app(app_size, app_data); + if (ret1 != RETURNCODE_SUCCESS) { + printf("[Error] App flash write unsuccessful: %d.\n", ret1); + tock_exit(ret1); + } + + if (!abort_tracker) { + printf("[Success] App flashed successfully. Creating process now.\n"); + int ret2 = libtock_app_loader_load(); + if (ret2 != RETURNCODE_SUCCESS) { + printf("[Error] Process creation failed: %d.\n", ret2); + tock_exit(ret2); + } + + // wait on load done callback + yield_for(&load_done); + load_done = false; + } + + abort_tracker = false; +} + + +/****************************************************************************************************** +* +* Function to write the app into the flash +* +* Takes app size and the app binary as arguments +******************************************************************************************************/ + +int write_app(double size, uint8_t binary[]) { + + int ret; + uint32_t write_count = 0; + uint8_t write_buffer[FLASH_BUFFER_SIZE]; + uint32_t flash_offset = 0; + + write_count = ceil(size / FLASH_BUFFER_SIZE); + + // set the write buffer + ret = libtock_app_loader_set_buffer(write_buffer, FLASH_BUFFER_SIZE); + if (ret != RETURNCODE_SUCCESS) { + printf("[Error] Failed to set the write buffer: %d.\n", ret); + return -1; + } + + if (abort_tracker) { + write_count = write_count / 2; + } + + for (uint32_t offset = 0; offset < write_count; offset++) { + // copy binary to write buffer + memcpy(write_buffer, &binary[FLASH_BUFFER_SIZE * offset], FLASH_BUFFER_SIZE); + flash_offset = (offset * FLASH_BUFFER_SIZE); + ret = libtock_app_loader_write(flash_offset, FLASH_BUFFER_SIZE); + if (ret != 0) { + printf("[Error] Failed writing data to flash at address: 0x%lx\n", flash_offset); + printf("[Error] Error nature: %d\n", ret); + return -1; + } + // wait on write done callback + yield_for(&write_done); + write_done = false; + } + + if (!abort_tracker) { + // Now that we are done writing the binary, we ask the kernel to finalize it. + printf("Done writing app, finalizing.\n"); + int ret2 = libtock_app_loader_finalize(); + if (ret2 != 0) { + printf("[Error] Failed to finalize new process binary.\n"); + return -1; + } + yield_for(&finalize_done); + finalize_done = false; + } else { + printf("[Log] Aborting Setup/Write.\n"); + int ret0 = libtock_app_loader_abort(); + if (ret0 != RETURNCODE_SUCCESS) { + printf("[Error] Abort Failed: %d.\n", ret0); + } + + // wait on abort done callback + yield_for(&abort_done); + abort_done = false; + printf("[Success] Abort Successful.\n"); + } + return 0; +} + + +/****************************************************************************************************** +* +* Main +* +******************************************************************************************************/ + +int main(void) { + printf("[Log] Simple test app to test abort functionality of dynamic process loading.\n"); + + // check if app loader driver exists + if (!libtock_app_loader_exists()) { + printf("No App Loader driver!\n"); + return -1; + } + + // set up the setup done callback + int err1 = libtock_app_loader_setup_set_upcall(app_setup_done_callback, NULL); + if (err1 != 0) { + printf("[Error] Failed to set setup done callback: %d\n", err1); + return err1; + } + + // set up the write done callback + int err2 = libtock_app_loader_write_set_upcall(app_write_done_callback, NULL); + if (err2 != 0) { + printf("[Error] Failed to set flash write done callback: %d\n", err2); + return err2; + } + + // set up the finalize done callback + int err3 = libtock_app_loader_finalize_set_upcall(app_finalize_done_callback, NULL); + if (err3 != 0) { + printf("[Error] Failed to set finalize done callback: %d\n", err3); + return err3; + } + + // set up the load done callback + int err4 = libtock_app_loader_load_set_upcall(app_load_done_callback, NULL); + if (err4 != 0) { + printf("[Error] Failed to set load done callback: %d\n", err4); + return err4; + } + + // set up the abort done callback + int err5 = libtock_app_loader_abort_set_upcall(app_abort_done_callback, NULL); + if (err5 != 0) { + printf("[Error] Failed to set abort done callback: %d\n", err5); + return err5; + } + + libtocksync_alarm_delay_ms(5000); + + printf("[Log] Initiating Abort Test.\n"); + + abort_test(); + + printf("[Log] Exiting Abort Test.\n"); + return 0; +} diff --git a/examples/tests/app_loader/abort-test/tock-dpl-hello.c b/examples/tests/app_loader/abort-test/tock-dpl-hello.c new file mode 120000 index 000000000..614b0be57 --- /dev/null +++ b/examples/tests/app_loader/abort-test/tock-dpl-hello.c @@ -0,0 +1 @@ +../app_binaries/cortex-m4/tock-dpl-hello.c \ No newline at end of file diff --git a/examples/tests/app_loader/app_binaries/cortex-m4/adc.c b/examples/tests/app_loader/app_binaries/cortex-m4/adc.c new file mode 100644 index 000000000..871043bed --- /dev/null +++ b/examples/tests/app_loader/app_binaries/cortex-m4/adc.c @@ -0,0 +1,969 @@ +#include "tock-apps.h" + +uint8_t adc_data[] = +{0x02, 0x00, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xd3, 0x01, 0x34, 0x00, 0x01, 0x00, 0x0c, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x12, + 0x00, 0x00, 0x09, 0x00, 0x14, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x12, 0x00, 0x00, 0xb0, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x61, 0x64, 0x63, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xa8, 0x23, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xa4, 0x24, 0x00, 0x00, 0xfc, 0x08, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x6a, 0x04, 0xf1, 0x07, 0x04, 0x0c, 0x44, 0x07, 0x25, + 0x24, 0xea, 0x05, 0x04, 0x85, 0x69, 0xc6, 0x69, 0x35, 0x44, + 0x0d, 0x44, 0x06, 0x00, 0x0f, 0x00, 0x9d, 0x42, 0x00, 0xdc, + 0xa5, 0x46, 0x00, 0x20, 0x29, 0x00, 0x05, 0xdf, 0xa5, 0x46, + 0x0a, 0x20, 0x21, 0x00, 0x05, 0xdf, 0x0b, 0x20, 0x29, 0x00, + 0x05, 0xdf, 0x70, 0x68, 0x38, 0x44, 0x81, 0x46, 0x30, 0x00, + 0x39, 0x00, 0x00, 0xf0, 0xf3, 0xf8, 0xff, 0xff, 0x2d, 0xe9, + 0xf0, 0x4d, 0x67, 0x4b, 0x88, 0xb0, 0x59, 0xf8, 0x03, 0x00, + 0x00, 0xaf, 0x00, 0xf0, 0x37, 0xfc, 0x00, 0xf0, 0x69, 0xf9, + 0x00, 0x28, 0x00, 0xf0, 0xb8, 0x80, 0x07, 0xf1, 0x18, 0x00, + 0x00, 0xf0, 0x3c, 0xf9, 0x60, 0x4b, 0xb9, 0x69, 0x59, 0xf8, + 0x03, 0x00, 0x00, 0xf0, 0xac, 0xfb, 0x5e, 0x4b, 0x59, 0xf8, + 0x03, 0x80, 0x40, 0x46, 0x00, 0xf0, 0xb1, 0xf9, 0xd8, 0xf8, + 0x00, 0x30, 0x00, 0x2b, 0x6a, 0xdd, 0x5a, 0x48, 0x4f, 0xf4, + 0x7a, 0x72, 0x59, 0xf8, 0x00, 0x00, 0x93, 0xfb, 0xf2, 0xf1, + 0x02, 0xfb, 0x11, 0x32, 0x00, 0xf0, 0x97, 0xfb, 0x07, 0xf1, + 0x1c, 0x00, 0x00, 0xf0, 0xb1, 0xf9, 0x54, 0x4b, 0xf9, 0x69, + 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x8d, 0xfb, 0x4f, 0xf0, + 0x00, 0x0a, 0xbb, 0x69, 0x5f, 0xfa, 0x8a, 0xf6, 0x9e, 0x42, + 0xf8, 0xda, 0x4e, 0x4b, 0x31, 0x46, 0x59, 0xf8, 0x03, 0x00, + 0x00, 0xf0, 0x80, 0xfb, 0x0a, 0x24, 0x07, 0xf1, 0x16, 0x05, + 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xe7, 0xfa, 0x01, 0x1e, + 0x49, 0xda, 0x48, 0x4b, 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, + 0x72, 0xfb, 0x64, 0x20, 0x00, 0xf0, 0x27, 0xfb, 0x01, 0x3c, + 0xef, 0xd1, 0x44, 0x4b, 0x31, 0x46, 0x59, 0xf8, 0x03, 0x00, + 0x00, 0xf0, 0x67, 0xfb, 0x42, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0xfb, 0x60, 0xc7, 0xf8, 0x08, 0xd0, 0x88, 0xb0, 0x6d, 0x46, + 0x10, 0x22, 0x00, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x52, 0xfb, + 0xfb, 0x68, 0x53, 0xf8, 0x04, 0xbb, 0xfb, 0x60, 0x3a, 0x4b, + 0x5a, 0x46, 0x59, 0xf8, 0x03, 0x00, 0x10, 0x21, 0x00, 0xf0, + 0x4f, 0xfb, 0x59, 0x46, 0x10, 0x23, 0x2a, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0xd1, 0xfa, 0x01, 0x1e, 0x27, 0xda, 0x30, 0x4b, + 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x42, 0xfb, 0x64, 0x20, + 0xd7, 0xf8, 0x08, 0xd0, 0x01, 0x34, 0x00, 0xf0, 0xf4, 0xfa, + 0x0a, 0x2c, 0xd6, 0xd1, 0x0a, 0xf1, 0x01, 0x0a, 0xab, 0xe7, + 0x40, 0xf6, 0xe4, 0x43, 0xc8, 0xf8, 0x00, 0x30, 0x2a, 0x4b, + 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0xaa, 0xfb, 0x95, 0xe7, + 0xfa, 0x8a, 0xd8, 0xf8, 0x00, 0x10, 0x26, 0x4b, 0x51, 0x43, + 0x59, 0xf8, 0x03, 0x00, 0x4f, 0xf6, 0xff, 0x73, 0x91, 0xfb, + 0xf3, 0xf1, 0x00, 0xf0, 0x20, 0xfb, 0xac, 0xe7, 0x22, 0x4b, + 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x1a, 0xfb, 0x20, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0xa5, 0xf1, 0x02, 0x0b, 0x1e, 0x35, + 0x3b, 0xf8, 0x02, 0x2f, 0xd8, 0xf8, 0x00, 0x10, 0x7b, 0x60, + 0x51, 0x43, 0x18, 0x46, 0x4f, 0xf6, 0xff, 0x72, 0x91, 0xfb, + 0xf2, 0xf1, 0x00, 0xf0, 0x07, 0xfb, 0xab, 0x45, 0x7b, 0x68, + 0xef, 0xd1, 0x16, 0x4b, 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, + 0x7b, 0xfb, 0xbb, 0xe7, 0x14, 0x4b, 0x59, 0xf8, 0x03, 0x00, + 0x00, 0xf0, 0x75, 0xfb, 0x4f, 0xf0, 0xff, 0x30, 0x20, 0x37, + 0xbd, 0x46, 0xbd, 0xe8, 0xf0, 0x8d, 0x00, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x0d, 0x46, 0x08, 0xb5, 0x41, 0x68, 0x03, 0x68, + 0x04, 0x46, 0x29, 0x44, 0x18, 0x44, 0x00, 0x22, 0xa3, 0x68, + 0xb2, 0xeb, 0x93, 0x0f, 0x1a, 0xd3, 0xd4, 0xe9, 0x03, 0x10, + 0x62, 0x69, 0x21, 0x44, 0x28, 0x44, 0x00, 0xf0, 0xa9, 0xfa, + 0xd4, 0xe9, 0x06, 0x02, 0x00, 0x21, 0x28, 0x44, 0x00, 0xf0, + 0xb1, 0xfa, 0x21, 0x6a, 0x21, 0x44, 0x00, 0x22, 0x0e, 0x1d, + 0x0b, 0x68, 0xb2, 0xeb, 0x93, 0x0f, 0x11, 0xd3, 0x00, 0x21, + 0x08, 0x46, 0xff, 0xf7, 0xe9, 0xfe, 0x00, 0xf0, 0x7d, 0xfa, + 0x50, 0xf8, 0x22, 0x30, 0x00, 0x2b, 0xb6, 0xbf, 0x03, 0xf1, + 0x00, 0x43, 0x5b, 0x19, 0x1b, 0x19, 0x41, 0xf8, 0x22, 0x30, + 0x01, 0x32, 0xd4, 0xe7, 0x56, 0xf8, 0x22, 0x00, 0x2b, 0x58, + 0x00, 0x2b, 0xb6, 0xbf, 0x03, 0xf1, 0x00, 0x43, 0x5b, 0x19, + 0x1b, 0x19, 0x2b, 0x50, 0x02, 0x32, 0xdd, 0xe7, 0x10, 0xb4, + 0x0c, 0x46, 0x03, 0x28, 0x13, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, + 0x02, 0x08, 0x0a, 0x10, 0x1b, 0x68, 0x6b, 0xb1, 0xe0, 0xb2, + 0x91, 0xb2, 0x10, 0xbc, 0x18, 0x47, 0x5b, 0x68, 0xf8, 0xe7, + 0x9b, 0x68, 0x2b, 0xb1, 0x21, 0x0a, 0xe0, 0xb2, 0x10, 0xbc, + 0x18, 0x47, 0xdb, 0x68, 0xf8, 0xe7, 0x10, 0xbc, 0x70, 0x47, + 0x49, 0x00, 0x00, 0xf0, 0x3a, 0xb8, 0x00, 0xf0, 0x49, 0xb8, + 0x10, 0xb5, 0x06, 0x4b, 0x04, 0x46, 0x59, 0xf8, 0x03, 0x00, + 0x00, 0xf0, 0x20, 0xf8, 0x20, 0xb9, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0xf0, 0x4f, 0xb8, 0x10, 0xbd, 0x38, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x08, 0x4b, 0x04, 0x46, 0x0d, 0x46, + 0x59, 0xf8, 0x03, 0x00, 0x11, 0x46, 0x00, 0xf0, 0x0e, 0xf8, + 0x28, 0xb9, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x00, 0xf0, 0x4e, 0xb8, 0x38, 0xbd, 0x00, 0xbf, 0x38, 0x00, + 0x00, 0x00, 0x05, 0x20, 0x00, 0xf0, 0x96, 0xb9, 0x10, 0xb5, + 0x86, 0xb0, 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, + 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x12, 0xf9, 0x94, 0xe8, + 0x0f, 0x00, 0x00, 0xf0, 0xa1, 0xf8, 0x00, 0xb2, 0x06, 0xb0, + 0x10, 0xbd, 0x10, 0xb5, 0x86, 0xb0, 0x02, 0xac, 0x03, 0x46, + 0x00, 0x91, 0x20, 0x46, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x46, 0xf9, 0x94, 0xe8, 0x0f, 0x00, 0x00, 0xf0, 0xa0, 0xf8, + 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x30, 0xb5, 0x87, 0xb0, + 0x00, 0x23, 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, 0x20, 0x46, + 0x1a, 0x46, 0x05, 0x21, 0x00, 0xf0, 0x0b, 0xf9, 0x00, 0x95, + 0x94, 0xe8, 0x0f, 0x00, 0x00, 0xf0, 0x65, 0xf8, 0x00, 0xb2, + 0x07, 0xb0, 0x30, 0xbd, 0x10, 0xb5, 0x86, 0xb0, 0x02, 0xac, + 0x00, 0x22, 0x03, 0x46, 0x00, 0x92, 0x20, 0x46, 0x01, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0xf8, 0xf8, 0x94, 0xe8, 0x0f, 0x00, + 0x00, 0xf0, 0x3d, 0xf8, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, + 0x10, 0xb5, 0x86, 0xb0, 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, + 0x20, 0x46, 0x03, 0x22, 0x05, 0x21, 0x00, 0xf0, 0xe7, 0xf8, + 0x94, 0xe8, 0x0f, 0x00, 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0xb2, + 0x06, 0xb0, 0x10, 0xbd, 0x30, 0xb5, 0x87, 0xb0, 0x00, 0x23, + 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, 0x20, 0x46, 0x66, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0xd5, 0xf8, 0x00, 0x95, 0x94, 0xe8, + 0x0f, 0x00, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xb2, 0x07, 0xb0, + 0x30, 0xbd, 0x30, 0xb5, 0x87, 0xb0, 0x00, 0x23, 0x02, 0xac, + 0x05, 0x46, 0x00, 0x93, 0x20, 0x46, 0x65, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0x95, 0x94, 0xe8, 0x0f, 0x00, + 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0xb2, 0x07, 0xb0, 0x30, 0xbd, + 0x40, 0x42, 0x70, 0x47, 0xff, 0xff, 0x84, 0xb0, 0x0d, 0xf1, + 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, + 0x80, 0x2b, 0x05, 0xd0, 0x3b, 0xb9, 0x9d, 0xf8, 0x04, 0x00, + 0x04, 0xb0, 0xff, 0xf7, 0xee, 0xbf, 0x00, 0x20, 0x04, 0xb0, + 0x70, 0x47, 0x00, 0x48, 0xfb, 0xe7, 0x00, 0xfc, 0xff, 0xff, + 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, + 0x9d, 0xf8, 0x00, 0x30, 0x04, 0x9a, 0x81, 0x2b, 0x03, 0xd1, + 0x11, 0x60, 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, 0x1b, 0xb9, + 0xc8, 0xb2, 0x04, 0xb0, 0xff, 0xf7, 0xd4, 0xbf, 0x01, 0x48, + 0xf6, 0xe7, 0x00, 0xbf, 0x00, 0xfc, 0xff, 0xff, 0x84, 0xb0, + 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, + 0x00, 0x30, 0x23, 0xb9, 0x9d, 0xf8, 0x0c, 0x00, 0x04, 0xb0, + 0xff, 0xf7, 0xc2, 0xbf, 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, + 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, + 0x9d, 0xf8, 0x00, 0x30, 0x23, 0xb9, 0x9d, 0xf8, 0x0c, 0x00, + 0x04, 0xb0, 0xff, 0xf7, 0xb2, 0xbf, 0x00, 0x20, 0x04, 0xb0, + 0x70, 0x47, 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, + 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, 0x23, 0xb9, 0x9d, 0xf8, + 0x0c, 0x00, 0x04, 0xb0, 0xff, 0xf7, 0xa2, 0xbf, 0x00, 0x20, + 0x04, 0xb0, 0x70, 0x47, 0x10, 0xb5, 0x11, 0x4b, 0x11, 0x4a, + 0x59, 0xf8, 0x03, 0x10, 0x59, 0xf8, 0x02, 0x20, 0x0b, 0x68, + 0x12, 0x68, 0x93, 0x42, 0x16, 0xd0, 0x0e, 0x4a, 0x59, 0xf8, + 0x02, 0x40, 0x14, 0x22, 0x5a, 0x43, 0x01, 0x33, 0xa0, 0x18, + 0xa4, 0x58, 0x5a, 0x42, 0x02, 0xf0, 0x0f, 0x02, 0x03, 0xf0, + 0x0f, 0x03, 0x58, 0xbf, 0x53, 0x42, 0x0b, 0x60, 0xd0, 0xe9, + 0x03, 0x23, 0xd0, 0xe9, 0x01, 0x01, 0xa0, 0x47, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0x20, 0xfc, 0xe7, 0x3c, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0xb5, + 0xff, 0xf7, 0xd3, 0xff, 0x01, 0x46, 0x08, 0xb9, 0x01, 0x20, + 0x00, 0xdf, 0x08, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x23, 0x78, + 0x03, 0xb1, 0x10, 0xbd, 0xff, 0xf7, 0xf1, 0xff, 0xf9, 0xe7, + 0x01, 0x46, 0x00, 0x20, 0x06, 0xdf, 0x10, 0xb5, 0x04, 0x46, + 0x08, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, 0x01, 0xdf, + 0x82, 0x28, 0x07, 0xd1, 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, + 0x23, 0x70, 0x00, 0x23, 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, + 0x02, 0x28, 0x05, 0xd1, 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, + 0x20, 0x70, 0x21, 0x73, 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, + 0xe7, 0xf8, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0x02, 0x9b, 0x02, 0xdf, 0x20, 0x70, 0xc4, 0xe9, + 0x01, 0x12, 0xe3, 0x60, 0x20, 0x46, 0x10, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, + 0x04, 0xdf, 0x82, 0x28, 0x07, 0xd1, 0x01, 0x23, 0xc4, 0xe9, + 0x01, 0x12, 0x23, 0x70, 0x00, 0x23, 0x23, 0x73, 0x20, 0x46, + 0x10, 0xbd, 0x02, 0x28, 0x05, 0xd1, 0x00, 0x20, 0xc4, 0xe9, + 0x01, 0x23, 0x20, 0x70, 0x21, 0x73, 0xf5, 0xe7, 0x01, 0x20, + 0x00, 0xf0, 0xbe, 0xf8, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, 0x03, 0xdf, 0x82, 0x28, + 0x07, 0xd1, 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, 0x23, 0x70, + 0x00, 0x23, 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x28, + 0x05, 0xd1, 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, 0x20, 0x70, + 0x21, 0x73, 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0xa2, 0xf8, + 0x08, 0xb5, 0x03, 0x46, 0x08, 0x46, 0x11, 0x46, 0x05, 0xdf, + 0x80, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x1a, 0x70, 0x5a, 0x60, + 0x18, 0x46, 0x08, 0xbd, 0x81, 0x28, 0x03, 0xd1, 0x00, 0x22, + 0x1a, 0x70, 0x59, 0x60, 0xf7, 0xe7, 0x10, 0xb9, 0x19, 0x70, + 0x58, 0x60, 0xf3, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x89, 0xf8, + 0x7f, 0xb5, 0x00, 0x23, 0x01, 0x46, 0x00, 0x93, 0x02, 0xa8, + 0x1a, 0x46, 0xff, 0xf7, 0x9a, 0xff, 0x9d, 0xf8, 0x08, 0x00, + 0xc0, 0x09, 0x07, 0xb0, 0x5d, 0xf8, 0x04, 0xfb, 0xff, 0xff, + 0x03, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x01, 0x22, 0x1a, 0x70, + 0x58, 0x70, 0x59, 0x80, 0x70, 0x47, 0x48, 0x00, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x01, 0x24, + 0x58, 0x70, 0xc3, 0xe9, 0x01, 0x12, 0x1c, 0x70, 0x10, 0xbd, + 0x48, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x4b, 0x59, 0xf8, + 0x03, 0x40, 0x00, 0x23, 0x23, 0x70, 0xe3, 0x60, 0x08, 0x4b, + 0x0d, 0x46, 0x59, 0xf8, 0x03, 0x10, 0xff, 0xf7, 0x11, 0xfe, + 0x30, 0xb9, 0x20, 0x46, 0xff, 0xf7, 0x45, 0xff, 0x63, 0x88, + 0xb4, 0xf9, 0x0c, 0x00, 0x2b, 0x80, 0x38, 0xbd, 0x48, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x15, 0x46, + 0x10, 0x4a, 0x59, 0xf8, 0x02, 0x40, 0x06, 0x46, 0x00, 0x22, + 0x0f, 0x46, 0x28, 0x46, 0x19, 0x46, 0x22, 0x70, 0xe2, 0x60, + 0xff, 0xf7, 0xf1, 0xfd, 0x00, 0x28, 0x11, 0xdb, 0x0a, 0x4b, + 0x39, 0x46, 0x59, 0xf8, 0x03, 0x20, 0x30, 0x46, 0xff, 0xf7, + 0xfd, 0xfd, 0x48, 0xb9, 0x20, 0x46, 0xff, 0xf7, 0x21, 0xff, + 0xa3, 0x68, 0xab, 0x42, 0x0c, 0xbf, 0xb4, 0xf9, 0x0c, 0x00, + 0x4f, 0xf0, 0xff, 0x30, 0xf8, 0xbd, 0x00, 0xbf, 0x48, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x01, 0x22, 0x1a, 0x70, 0x70, 0x47, 0x54, 0x00, + 0x00, 0x00, 0x30, 0xb5, 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x50, + 0x09, 0x4b, 0x00, 0x22, 0x8d, 0xb0, 0x2a, 0x70, 0x59, 0xf8, + 0x03, 0x10, 0x01, 0xab, 0x01, 0xf0, 0xbd, 0xf9, 0x04, 0x46, + 0x10, 0xb9, 0x28, 0x46, 0xff, 0xf7, 0xfa, 0xfe, 0x20, 0x46, + 0x0d, 0xb0, 0x30, 0xbd, 0x00, 0xbf, 0x54, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x08, 0xb5, 0x09, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x04, 0x46, 0x13, 0xb1, 0x00, 0x21, 0xaf, 0xf3, + 0x00, 0x80, 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x18, 0x68, + 0x83, 0x6a, 0x03, 0xb1, 0x98, 0x47, 0x20, 0x46, 0x01, 0xf0, + 0x6b, 0xf8, 0x00, 0xbf, 0xc4, 0x00, 0x00, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x0a, 0x44, 0x91, 0x42, 0x00, 0xf1, 0xff, 0x33, + 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, 0x11, 0xf8, 0x01, 0x4b, + 0x03, 0xf8, 0x01, 0x4f, 0x91, 0x42, 0xf9, 0xd1, 0x10, 0xbd, + 0x02, 0x44, 0x03, 0x46, 0x93, 0x42, 0x00, 0xd1, 0x70, 0x47, + 0x03, 0xf8, 0x01, 0x1b, 0xf9, 0xe7, 0x0f, 0xb4, 0x13, 0xb5, + 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x1c, 0x68, 0x24, 0xb1, + 0xa3, 0x69, 0x13, 0xb9, 0x20, 0x46, 0x00, 0xf0, 0x48, 0xfa, + 0x05, 0xab, 0x04, 0x9a, 0xa1, 0x68, 0x01, 0x93, 0x20, 0x46, + 0x00, 0xf0, 0x53, 0xfc, 0x02, 0xb0, 0xbd, 0xe8, 0x10, 0x40, + 0x04, 0xb0, 0x70, 0x47, 0xd8, 0x00, 0x00, 0x00, 0x70, 0xb5, + 0x0e, 0x46, 0x05, 0x46, 0x18, 0xb1, 0x83, 0x69, 0x0b, 0xb9, + 0x00, 0xf0, 0x32, 0xfa, 0xab, 0x69, 0xac, 0x68, 0x13, 0xb9, + 0x28, 0x46, 0x00, 0xf0, 0x2c, 0xfa, 0x26, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9c, 0x42, 0x17, 0xd1, 0x6c, 0x68, 0xa3, 0x89, + 0x1b, 0x07, 0x21, 0xd5, 0x23, 0x69, 0xfb, 0xb1, 0x01, 0x3e, + 0xa3, 0x68, 0x16, 0xf8, 0x01, 0x1f, 0x01, 0x3b, 0xa3, 0x60, + 0x09, 0xbb, 0x00, 0x2b, 0x32, 0xda, 0x22, 0x46, 0x0a, 0x21, + 0x28, 0x46, 0x00, 0xf0, 0x45, 0xf8, 0x01, 0x30, 0x15, 0xd0, + 0x0a, 0x20, 0x15, 0xe0, 0x19, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, 0xe1, 0xe7, 0x16, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x08, 0xbf, 0xec, 0x68, + 0xda, 0xe7, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x87, 0xf8, + 0x00, 0x28, 0xd9, 0xd0, 0x4f, 0xf0, 0xff, 0x30, 0x70, 0xbd, + 0x00, 0x2b, 0x04, 0xda, 0xa2, 0x69, 0x9a, 0x42, 0x06, 0xdc, + 0x0a, 0x29, 0x04, 0xd0, 0x23, 0x68, 0x5a, 0x1c, 0x22, 0x60, + 0x19, 0x70, 0xcb, 0xe7, 0x22, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x1a, 0xf8, 0x01, 0x30, 0xc5, 0xd1, 0xe9, 0xe7, 0x23, 0x68, + 0x0a, 0x20, 0x5a, 0x1c, 0x22, 0x60, 0x18, 0x70, 0xe5, 0xe7, + 0x00, 0xbf, 0xd0, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x01, 0x46, 0x18, 0x68, 0xff, 0xf7, 0x97, 0xbf, 0x00, 0xbf, + 0xd8, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x46, 0x14, 0x46, + 0x05, 0x46, 0x18, 0xb1, 0x83, 0x69, 0x0b, 0xb9, 0x00, 0xf0, + 0xc5, 0xf9, 0x24, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x2c, 0xd1, 0x6c, 0x68, 0xa3, 0x69, 0xa3, 0x60, 0xa3, 0x89, + 0x1a, 0x07, 0x34, 0xd5, 0x23, 0x69, 0x00, 0x2b, 0x31, 0xd0, + 0x23, 0x69, 0x20, 0x68, 0xc0, 0x1a, 0x63, 0x69, 0xff, 0xb2, + 0x83, 0x42, 0x3e, 0x46, 0x04, 0xdc, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x2d, 0xf9, 0x50, 0xbb, 0xa3, 0x68, 0x01, 0x3b, + 0xa3, 0x60, 0x23, 0x68, 0x5a, 0x1c, 0x22, 0x60, 0x1f, 0x70, + 0x63, 0x69, 0x01, 0x30, 0x83, 0x42, 0x04, 0xd0, 0xa3, 0x89, + 0xdb, 0x07, 0x06, 0xd5, 0x0a, 0x2f, 0x04, 0xd1, 0x21, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x18, 0xf9, 0xa8, 0xb9, 0x30, 0x46, + 0xf8, 0xbd, 0x0c, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x01, 0xd1, 0xac, 0x68, 0xcc, 0xe7, 0x09, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9c, 0x42, 0x08, 0xbf, 0xec, 0x68, 0xc5, 0xe7, + 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0x28, + 0xc7, 0xd0, 0x4f, 0xf0, 0xff, 0x36, 0xe6, 0xe7, 0xd0, 0x00, + 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x70, 0xb5, 0x36, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x1d, 0x68, + 0x06, 0x46, 0x0c, 0x46, 0x25, 0xb1, 0xab, 0x69, 0x13, 0xb9, + 0x28, 0x46, 0x00, 0xf0, 0x69, 0xf9, 0x31, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9c, 0x42, 0x0f, 0xd1, 0x6c, 0x68, 0xa3, 0x89, + 0xb4, 0xf9, 0x0c, 0x20, 0x19, 0x07, 0x30, 0xd4, 0xdd, 0x06, + 0x15, 0xd4, 0x09, 0x23, 0x33, 0x60, 0x42, 0xf0, 0x40, 0x03, + 0xa3, 0x81, 0x4f, 0xf0, 0xff, 0x30, 0x42, 0xe0, 0x27, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, + 0xe9, 0xe7, 0x25, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x08, 0xbf, 0xec, 0x68, 0xe2, 0xe7, 0x58, 0x07, 0x12, 0xd5, + 0x61, 0x6b, 0x41, 0xb1, 0x04, 0xf1, 0x44, 0x03, 0x99, 0x42, + 0x02, 0xd0, 0x30, 0x46, 0x00, 0xf0, 0x41, 0xfa, 0x00, 0x23, + 0x63, 0x63, 0xa3, 0x89, 0x23, 0xf0, 0x24, 0x03, 0xa3, 0x81, + 0x00, 0x23, 0x63, 0x60, 0x23, 0x69, 0x23, 0x60, 0xa3, 0x89, + 0x43, 0xf0, 0x08, 0x03, 0xa3, 0x81, 0x23, 0x69, 0x4b, 0xb9, + 0xa3, 0x89, 0x03, 0xf4, 0x20, 0x73, 0xb3, 0xf5, 0x00, 0x7f, + 0x03, 0xd0, 0x21, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xe5, 0xf9, + 0xa0, 0x89, 0xb4, 0xf9, 0x0c, 0x20, 0x10, 0xf0, 0x01, 0x03, + 0x0a, 0xd0, 0x00, 0x23, 0xa3, 0x60, 0x63, 0x69, 0x5b, 0x42, + 0xa3, 0x61, 0x23, 0x69, 0x43, 0xb9, 0x10, 0xf0, 0x80, 0x00, + 0xb6, 0xd1, 0x70, 0xbd, 0x81, 0x07, 0x58, 0xbf, 0x63, 0x69, + 0xa3, 0x60, 0xf4, 0xe7, 0x00, 0x20, 0xf7, 0xe7, 0x00, 0xbf, + 0xd8, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xe4, 0x00, + 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x8a, 0x89, 0xf8, 0xb5, + 0x05, 0x46, 0x10, 0x07, 0x0c, 0x46, 0x57, 0xd4, 0x4b, 0x68, + 0x00, 0x2b, 0x04, 0xdc, 0x0b, 0x6c, 0x00, 0x2b, 0x01, 0xdc, + 0x00, 0x20, 0xf8, 0xbd, 0xe6, 0x6a, 0x00, 0x2e, 0xfa, 0xd0, + 0x00, 0x23, 0x12, 0xf4, 0x80, 0x52, 0x2f, 0x68, 0x2b, 0x60, + 0x32, 0xd0, 0x60, 0x6d, 0xa3, 0x89, 0x5a, 0x07, 0x05, 0xd5, + 0x63, 0x68, 0xc0, 0x1a, 0x63, 0x6b, 0x0b, 0xb1, 0x23, 0x6c, + 0xc0, 0x1a, 0x00, 0x23, 0x02, 0x46, 0xe6, 0x6a, 0x21, 0x6a, + 0x28, 0x46, 0xb0, 0x47, 0x43, 0x1c, 0xa3, 0x89, 0x06, 0xd1, + 0x29, 0x68, 0x1d, 0x29, 0x2c, 0xd8, 0x29, 0x4a, 0xca, 0x40, + 0xd6, 0x07, 0x28, 0xd5, 0x00, 0x22, 0x62, 0x60, 0xd9, 0x04, + 0x22, 0x69, 0x22, 0x60, 0x04, 0xd5, 0x42, 0x1c, 0x01, 0xd1, + 0x2b, 0x68, 0x03, 0xb9, 0x60, 0x65, 0x61, 0x6b, 0x2f, 0x60, + 0x00, 0x29, 0xcb, 0xd0, 0x04, 0xf1, 0x44, 0x03, 0x99, 0x42, + 0x02, 0xd0, 0x28, 0x46, 0x00, 0xf0, 0xbf, 0xf9, 0x00, 0x20, + 0x60, 0x63, 0xc2, 0xe7, 0x21, 0x6a, 0x01, 0x23, 0x28, 0x46, + 0xb0, 0x47, 0x41, 0x1c, 0xc7, 0xd1, 0x2b, 0x68, 0x00, 0x2b, + 0xc4, 0xd0, 0x1d, 0x2b, 0x01, 0xd0, 0x16, 0x2b, 0x01, 0xd1, + 0x2f, 0x60, 0xb2, 0xe7, 0xa3, 0x89, 0x43, 0xf0, 0x40, 0x03, + 0xa3, 0x81, 0xae, 0xe7, 0x0f, 0x69, 0x00, 0x2f, 0xaa, 0xd0, + 0x93, 0x07, 0x0e, 0x68, 0x08, 0xbf, 0x4b, 0x69, 0x0f, 0x60, + 0x18, 0xbf, 0x00, 0x23, 0xf6, 0x1b, 0x8b, 0x60, 0x00, 0x2e, + 0x9f, 0xdd, 0x21, 0x6a, 0xd4, 0xf8, 0x28, 0xc0, 0x33, 0x46, + 0x3a, 0x46, 0x28, 0x46, 0xe0, 0x47, 0x00, 0x28, 0x06, 0xdc, + 0xa3, 0x89, 0x43, 0xf0, 0x40, 0x03, 0xa3, 0x81, 0x4f, 0xf0, + 0xff, 0x30, 0x90, 0xe7, 0x07, 0x44, 0x36, 0x1a, 0xea, 0xe7, + 0x00, 0xbf, 0x01, 0x00, 0x40, 0x20, 0x38, 0xb5, 0x0b, 0x69, + 0x05, 0x46, 0x0c, 0x46, 0x0b, 0xb3, 0x18, 0xb1, 0x83, 0x69, + 0x0b, 0xb9, 0x00, 0xf0, 0x74, 0xf8, 0x0f, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9c, 0x42, 0x09, 0xd1, 0x6c, 0x68, 0xb4, 0xf9, + 0x0c, 0x30, 0x9b, 0xb1, 0x21, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0xff, 0xf7, 0x65, 0xbf, 0x09, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, 0xef, 0xe7, + 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x08, 0xbf, + 0xec, 0x68, 0xe8, 0xe7, 0x00, 0x20, 0x38, 0xbd, 0x00, 0xbf, + 0xd0, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xb4, 0x00, + 0x00, 0x00, 0x00, 0x23, 0x10, 0xb5, 0x04, 0x46, 0xc0, 0xe9, + 0x00, 0x33, 0xc0, 0xe9, 0x04, 0x33, 0x83, 0x60, 0x81, 0x81, + 0x43, 0x66, 0xc2, 0x81, 0x83, 0x61, 0x19, 0x46, 0x08, 0x22, + 0x5c, 0x30, 0xff, 0xf7, 0xe1, 0xfd, 0x09, 0x4b, 0x24, 0x62, + 0x59, 0xf8, 0x03, 0x30, 0x63, 0x62, 0x07, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0xa3, 0x62, 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0xe3, 0x62, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x23, 0x63, + 0x10, 0xbd, 0x00, 0xbf, 0xc8, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, + 0x02, 0x4b, 0x59, 0xf8, 0x03, 0x10, 0x00, 0xf0, 0x9d, 0xb8, + 0x00, 0xbf, 0xcc, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x68, 0x22, + 0x4d, 0x1e, 0x55, 0x43, 0x0e, 0x46, 0x05, 0xf1, 0x74, 0x01, + 0x00, 0xf0, 0x85, 0xf9, 0x04, 0x46, 0x40, 0xb1, 0x00, 0x21, + 0xc0, 0xe9, 0x00, 0x16, 0x0c, 0x30, 0xa0, 0x60, 0x05, 0xf1, + 0x68, 0x02, 0xff, 0xf7, 0xaa, 0xfd, 0x20, 0x46, 0x70, 0xbd, + 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x10, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0xfa, 0xff, 0xa3, 0x69, 0x1b, 0xb1, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xf5, 0xbf, 0x16, 0x4a, + 0x59, 0xf8, 0x02, 0x20, 0x23, 0x65, 0xc4, 0xe9, 0x12, 0x33, + 0x14, 0x4b, 0xa2, 0x62, 0x59, 0xf8, 0x03, 0x30, 0x1b, 0x68, + 0xa3, 0x42, 0x04, 0xbf, 0x01, 0x23, 0xa3, 0x61, 0x20, 0x46, + 0x00, 0xf0, 0x20, 0xf8, 0x60, 0x60, 0x20, 0x46, 0x00, 0xf0, + 0x1c, 0xf8, 0xa0, 0x60, 0x20, 0x46, 0x00, 0xf0, 0x18, 0xf8, + 0x00, 0x22, 0xe0, 0x60, 0x04, 0x21, 0x60, 0x68, 0xff, 0xf7, + 0x88, 0xff, 0xa0, 0x68, 0x01, 0x22, 0x09, 0x21, 0xff, 0xf7, + 0x83, 0xff, 0xe0, 0x68, 0x02, 0x22, 0x12, 0x21, 0xff, 0xf7, + 0x7e, 0xff, 0x01, 0x23, 0xa3, 0x61, 0xce, 0xe7, 0x00, 0xbf, + 0xac, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xf8, 0xb5, + 0x07, 0x46, 0xff, 0xf7, 0xbc, 0xff, 0x1e, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x1e, 0x68, 0xb3, 0x69, 0x13, 0xb9, 0x30, 0x46, + 0xff, 0xf7, 0xb7, 0xff, 0x48, 0x36, 0xd6, 0xe9, 0x01, 0x34, + 0x01, 0x3b, 0x03, 0xd5, 0x33, 0x68, 0xeb, 0xb1, 0x36, 0x68, + 0xf7, 0xe7, 0xb4, 0xf9, 0x0c, 0x50, 0xb5, 0xb9, 0x13, 0x4b, + 0xe3, 0x60, 0x65, 0x66, 0xff, 0xf7, 0xa3, 0xff, 0xc4, 0xe9, + 0x01, 0x55, 0xc4, 0xe9, 0x04, 0x55, 0x25, 0x60, 0xa5, 0x61, + 0x08, 0x22, 0x29, 0x46, 0x04, 0xf1, 0x5c, 0x00, 0xff, 0xf7, + 0x3e, 0xfd, 0xc4, 0xe9, 0x0d, 0x55, 0xc4, 0xe9, 0x12, 0x55, + 0x20, 0x46, 0xf8, 0xbd, 0x68, 0x34, 0xdd, 0xe7, 0x04, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x74, 0xff, 0x04, 0x46, 0x30, 0x60, + 0x00, 0x28, 0xd9, 0xd1, 0xff, 0xf7, 0x85, 0xff, 0x0c, 0x23, + 0x3b, 0x60, 0xee, 0xe7, 0x00, 0xbf, 0x01, 0x00, 0xff, 0xff, + 0xb0, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x45, 0x06, 0x46, + 0x88, 0x46, 0x00, 0xf1, 0x48, 0x04, 0x00, 0x27, 0xd4, 0xe9, + 0x01, 0xa5, 0xba, 0xf1, 0x01, 0x0a, 0x05, 0xd5, 0x24, 0x68, + 0x00, 0x2c, 0xf7, 0xd1, 0x38, 0x46, 0xbd, 0xe8, 0xf8, 0x85, + 0xab, 0x89, 0x01, 0x2b, 0x07, 0xd9, 0xb5, 0xf9, 0x0e, 0x30, + 0x01, 0x33, 0x03, 0xd0, 0x29, 0x46, 0x30, 0x46, 0xc0, 0x47, + 0x07, 0x43, 0x68, 0x35, 0xe9, 0xe7, 0x70, 0xb5, 0x0e, 0x46, + 0xb1, 0xf9, 0x0e, 0x10, 0x00, 0x29, 0x96, 0xb0, 0x14, 0x46, + 0x1d, 0x46, 0x08, 0xda, 0xb6, 0xf9, 0x0c, 0x30, 0x00, 0x22, + 0x2a, 0x60, 0x1a, 0x06, 0x10, 0xd4, 0x4f, 0xf4, 0x80, 0x63, + 0x0e, 0xe0, 0x6a, 0x46, 0x00, 0xf0, 0x94, 0xfc, 0x00, 0x28, + 0xf1, 0xdb, 0x01, 0x9a, 0x02, 0xf4, 0x70, 0x42, 0xa2, 0xf5, + 0x00, 0x53, 0x5a, 0x42, 0x5a, 0x41, 0x2a, 0x60, 0xee, 0xe7, + 0x40, 0x23, 0x00, 0x20, 0x23, 0x60, 0x16, 0xb0, 0x70, 0xbd, + 0x8b, 0x89, 0x73, 0xb5, 0x9d, 0x07, 0x06, 0x46, 0x0c, 0x46, + 0x07, 0xd5, 0x04, 0xf1, 0x47, 0x03, 0x23, 0x60, 0x23, 0x61, + 0x01, 0x23, 0x63, 0x61, 0x02, 0xb0, 0x70, 0xbd, 0x01, 0xab, + 0x6a, 0x46, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x99, 0x05, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x99, 0xf8, 0x48, 0xb9, 0xb4, 0xf9, + 0x0c, 0x30, 0x9a, 0x05, 0xef, 0xd4, 0x23, 0xf0, 0x03, 0x03, + 0x43, 0xf0, 0x02, 0x03, 0xa3, 0x81, 0xe3, 0xe7, 0x0e, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0xb3, 0x62, 0xa3, 0x89, 0x20, 0x60, + 0x43, 0xf0, 0x80, 0x03, 0xa3, 0x81, 0x00, 0x9b, 0x63, 0x61, + 0x01, 0x9b, 0x20, 0x61, 0x5b, 0xb1, 0xb4, 0xf9, 0x0e, 0x10, + 0x30, 0x46, 0x00, 0xf0, 0x63, 0xfc, 0x28, 0xb1, 0xa3, 0x89, + 0x23, 0xf0, 0x03, 0x03, 0x43, 0xf0, 0x01, 0x03, 0xa3, 0x81, + 0xa0, 0x89, 0x05, 0x43, 0xa5, 0x81, 0xcb, 0xe7, 0xac, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x05, 0x46, 0x00, 0x29, 0x43, 0xd0, + 0x51, 0xf8, 0x04, 0x3c, 0x0c, 0x1f, 0x00, 0x2b, 0xb8, 0xbf, + 0xe4, 0x18, 0x00, 0xf0, 0xc4, 0xfc, 0x1e, 0x4b, 0x59, 0xf8, + 0x03, 0x20, 0x13, 0x68, 0x33, 0xb9, 0x63, 0x60, 0x14, 0x60, + 0x28, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x00, 0xf0, 0xb9, 0xbc, + 0xa3, 0x42, 0x08, 0xd9, 0x20, 0x68, 0x21, 0x18, 0x8b, 0x42, + 0x01, 0xbf, 0x19, 0x68, 0x5b, 0x68, 0x09, 0x18, 0x21, 0x60, + 0xed, 0xe7, 0x1a, 0x46, 0x5b, 0x68, 0x0b, 0xb1, 0xa3, 0x42, + 0xfa, 0xd9, 0x11, 0x68, 0x50, 0x18, 0xa0, 0x42, 0x0b, 0xd1, + 0x20, 0x68, 0x01, 0x44, 0x50, 0x18, 0x83, 0x42, 0x11, 0x60, + 0xe0, 0xd1, 0x18, 0x68, 0x5b, 0x68, 0x53, 0x60, 0x01, 0x44, + 0x11, 0x60, 0xda, 0xe7, 0x02, 0xd9, 0x0c, 0x23, 0x2b, 0x60, + 0xd6, 0xe7, 0x20, 0x68, 0x21, 0x18, 0x8b, 0x42, 0x04, 0xbf, + 0x19, 0x68, 0x5b, 0x68, 0x63, 0x60, 0x04, 0xbf, 0x09, 0x18, + 0x21, 0x60, 0x54, 0x60, 0xca, 0xe7, 0x38, 0xbd, 0x00, 0xbf, + 0xec, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x0f, 0x4b, 0x59, 0xf8, + 0x03, 0x60, 0x0c, 0x46, 0x31, 0x68, 0x05, 0x46, 0x11, 0xb9, + 0x00, 0xf0, 0x70, 0xfb, 0x30, 0x60, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x6b, 0xfb, 0x43, 0x1c, 0x0a, 0xd0, 0xc4, 0x1c, + 0x24, 0xf0, 0x03, 0x04, 0xa0, 0x42, 0x07, 0xd0, 0x21, 0x1a, + 0x28, 0x46, 0x00, 0xf0, 0x60, 0xfb, 0x01, 0x30, 0x01, 0xd1, + 0x4f, 0xf0, 0xff, 0x34, 0x20, 0x46, 0x70, 0xbd, 0xe8, 0x00, + 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xcd, 0x1c, 0x25, 0xf0, + 0x03, 0x05, 0x08, 0x35, 0x0c, 0x2d, 0x38, 0xbf, 0x0c, 0x25, + 0x00, 0x2d, 0x07, 0x46, 0x01, 0xdb, 0xa9, 0x42, 0x05, 0xd9, + 0x0c, 0x23, 0x3b, 0x60, 0x00, 0x26, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0xf0, 0x4c, 0xfc, 0x2e, 0x4b, 0x59, 0xf8, + 0x03, 0x60, 0x33, 0x68, 0x1c, 0x46, 0x34, 0xbb, 0x29, 0x46, + 0x38, 0x46, 0xff, 0xf7, 0xbe, 0xff, 0x43, 0x1c, 0x04, 0x46, + 0x4d, 0xd1, 0x34, 0x68, 0x26, 0x46, 0x00, 0x2e, 0x40, 0xd1, + 0x23, 0x68, 0x31, 0x46, 0x38, 0x46, 0x04, 0xeb, 0x03, 0x08, + 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0x45, 0x3a, 0xd1, 0x21, 0x68, + 0x03, 0x35, 0x6d, 0x1a, 0x25, 0xf0, 0x03, 0x05, 0x08, 0x35, + 0x0c, 0x2d, 0x38, 0xbf, 0x0c, 0x25, 0x29, 0x46, 0x38, 0x46, + 0xff, 0xf7, 0xa1, 0xff, 0x01, 0x30, 0x2b, 0xd0, 0x23, 0x68, + 0x2b, 0x44, 0x23, 0x60, 0x0e, 0xe0, 0x22, 0x68, 0x52, 0x1b, + 0x1e, 0xd4, 0x0b, 0x2a, 0x16, 0xd9, 0x61, 0x19, 0xa3, 0x42, + 0x25, 0x60, 0x18, 0xbf, 0x59, 0x60, 0x63, 0x68, 0x08, 0xbf, + 0x31, 0x60, 0x62, 0x51, 0x4b, 0x60, 0x38, 0x46, 0x04, 0xf1, + 0x0b, 0x06, 0x00, 0xf0, 0x0c, 0xfc, 0x26, 0xf0, 0x07, 0x06, + 0x23, 0x1d, 0xf2, 0x1a, 0xb4, 0xd0, 0x9b, 0x1b, 0xa3, 0x50, + 0xb1, 0xe7, 0x62, 0x68, 0xa3, 0x42, 0x0c, 0xbf, 0x32, 0x60, + 0x5a, 0x60, 0xec, 0xe7, 0x23, 0x46, 0x64, 0x68, 0xb2, 0xe7, + 0x34, 0x46, 0x76, 0x68, 0xb9, 0xe7, 0x0c, 0x23, 0x3b, 0x60, + 0x38, 0x46, 0x00, 0xf0, 0xf3, 0xfb, 0x9f, 0xe7, 0x25, 0x60, + 0xde, 0xe7, 0x00, 0xbf, 0xec, 0x00, 0x00, 0x00, 0x93, 0x68, + 0x01, 0x3b, 0x00, 0x2b, 0x10, 0xb4, 0x93, 0x60, 0x07, 0xda, + 0x94, 0x69, 0xa3, 0x42, 0x01, 0xdb, 0x0a, 0x29, 0x02, 0xd1, + 0x10, 0xbc, 0xff, 0xf7, 0x3a, 0xbc, 0x13, 0x68, 0x58, 0x1c, + 0x10, 0x60, 0x19, 0x70, 0x08, 0x46, 0x10, 0xbc, 0x70, 0x47, + 0xf8, 0xb5, 0x06, 0x46, 0x0f, 0x46, 0x14, 0x46, 0xd5, 0x18, + 0xac, 0x42, 0x01, 0xd1, 0x00, 0x20, 0x07, 0xe0, 0x14, 0xf8, + 0x01, 0x1b, 0x3a, 0x46, 0x30, 0x46, 0xff, 0xf7, 0xdc, 0xff, + 0x43, 0x1c, 0xf3, 0xd1, 0xf8, 0xbd, 0xff, 0xff, 0x2d, 0xe9, + 0xf0, 0x4d, 0x0d, 0x46, 0x9c, 0xb0, 0x14, 0x46, 0x1f, 0x46, + 0x06, 0x46, 0x18, 0xb1, 0x83, 0x69, 0x0b, 0xb9, 0xff, 0xf7, + 0xe2, 0xfd, 0x80, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9d, 0x42, + 0x5b, 0xd1, 0x75, 0x68, 0xab, 0x89, 0x18, 0x07, 0x65, 0xd5, + 0x2b, 0x69, 0x00, 0x2b, 0x62, 0xd0, 0x00, 0x23, 0x09, 0x93, + 0x20, 0x23, 0x8d, 0xf8, 0x29, 0x30, 0x30, 0x23, 0x8d, 0xf8, + 0x2a, 0x30, 0x03, 0x97, 0x4f, 0xf0, 0x0a, 0x0a, 0x23, 0x46, + 0x1f, 0x46, 0x13, 0xf8, 0x01, 0x2b, 0x0a, 0xb1, 0x25, 0x2a, + 0xf9, 0xd1, 0xb7, 0xeb, 0x04, 0x0b, 0x0b, 0xd0, 0x5b, 0x46, + 0x22, 0x46, 0x29, 0x46, 0x30, 0x46, 0xff, 0xf7, 0xba, 0xff, + 0x01, 0x30, 0x00, 0xf0, 0xc7, 0x80, 0x09, 0x9a, 0x5a, 0x44, + 0x09, 0x92, 0x3b, 0x78, 0x00, 0x2b, 0x00, 0xf0, 0xc0, 0x80, + 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0xcd, 0xe9, 0x05, 0x23, + 0x04, 0x93, 0x07, 0x93, 0x8d, 0xf8, 0x53, 0x30, 0x1a, 0x93, + 0x64, 0x4b, 0x59, 0xf8, 0x03, 0xb0, 0x01, 0x37, 0x3c, 0x46, + 0x05, 0x22, 0x14, 0xf8, 0x01, 0x1b, 0x58, 0x46, 0x00, 0xf0, + 0x22, 0xfb, 0x04, 0x9b, 0x00, 0x28, 0x30, 0xd1, 0xd9, 0x06, + 0x44, 0xbf, 0x20, 0x22, 0x8d, 0xf8, 0x53, 0x20, 0x1a, 0x07, + 0x44, 0xbf, 0x2b, 0x22, 0x8d, 0xf8, 0x53, 0x20, 0x3a, 0x78, + 0x2a, 0x2a, 0x2c, 0xd0, 0x07, 0x9a, 0x3c, 0x46, 0x00, 0x20, + 0x21, 0x46, 0x11, 0xf8, 0x01, 0x3b, 0x30, 0x3b, 0x09, 0x2b, + 0x6b, 0xd9, 0x40, 0xbb, 0x2e, 0xe0, 0x52, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9d, 0x42, 0x01, 0xd1, 0xb5, 0x68, 0x9d, 0xe7, + 0x4f, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9d, 0x42, 0x08, 0xbf, + 0xf5, 0x68, 0x96, 0xe7, 0x29, 0x46, 0x30, 0x46, 0xff, 0xf7, + 0xf9, 0xfb, 0x00, 0x28, 0x96, 0xd0, 0x4f, 0xf0, 0xff, 0x30, + 0x1c, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, 0xa0, 0xeb, 0x0b, 0x00, + 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, 0x03, 0x43, 0x04, 0x93, + 0x27, 0x46, 0xbb, 0xe7, 0x03, 0x9a, 0x11, 0x1d, 0x12, 0x68, + 0x03, 0x91, 0x00, 0x2a, 0x01, 0xdb, 0x07, 0x92, 0x04, 0xe0, + 0x52, 0x42, 0x43, 0xf0, 0x02, 0x03, 0x07, 0x92, 0x04, 0x93, + 0x23, 0x78, 0x2e, 0x2b, 0x0c, 0xd1, 0x63, 0x78, 0x2a, 0x2b, + 0x39, 0xd1, 0x03, 0x9b, 0x1a, 0x1d, 0x1b, 0x68, 0x03, 0x92, + 0x00, 0x2b, 0xb8, 0xbf, 0x4f, 0xf0, 0xff, 0x33, 0x02, 0x34, + 0x05, 0x93, 0x34, 0x4b, 0x21, 0x78, 0x59, 0xf8, 0x03, 0x70, + 0x03, 0x22, 0x38, 0x46, 0x00, 0xf0, 0xc0, 0xfa, 0x38, 0xb1, + 0x40, 0x23, 0xc0, 0x1b, 0x03, 0xfa, 0x00, 0xf0, 0x04, 0x9b, + 0x03, 0x43, 0x01, 0x34, 0x04, 0x93, 0x14, 0xf8, 0x01, 0x1b, + 0x2c, 0x4b, 0x8d, 0xf8, 0x28, 0x10, 0x59, 0xf8, 0x03, 0x00, + 0x06, 0x22, 0x00, 0xf0, 0xad, 0xfa, 0x00, 0x28, 0x38, 0xd0, + 0x28, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x0b, 0xbb, 0x03, 0x9b, + 0x07, 0x33, 0x23, 0xf0, 0x07, 0x03, 0x08, 0x33, 0x03, 0x93, + 0x09, 0x9b, 0x43, 0x44, 0x09, 0x93, 0x4b, 0xe7, 0x0a, 0xfb, + 0x02, 0x32, 0x0c, 0x46, 0x01, 0x20, 0x88, 0xe7, 0x00, 0x23, + 0x01, 0x34, 0x05, 0x93, 0x19, 0x46, 0x20, 0x46, 0x10, 0xf8, + 0x01, 0x2b, 0x30, 0x3a, 0x09, 0x2a, 0x03, 0xd9, 0x00, 0x2b, + 0xc3, 0xd0, 0x05, 0x91, 0xc1, 0xe7, 0x0a, 0xfb, 0x01, 0x21, + 0x04, 0x46, 0x01, 0x23, 0xf0, 0xe7, 0x16, 0x4b, 0x03, 0xaa, + 0x59, 0xf8, 0x03, 0x30, 0x00, 0x92, 0x04, 0xa9, 0x2a, 0x46, + 0x30, 0x46, 0xaf, 0xf3, 0x00, 0x80, 0xb0, 0xf1, 0xff, 0x3f, + 0x80, 0x46, 0xd5, 0xd1, 0xab, 0x89, 0x5b, 0x06, 0x80, 0xd4, + 0x09, 0x98, 0x80, 0xe7, 0x0c, 0x4b, 0x03, 0xaa, 0x59, 0xf8, + 0x03, 0x30, 0x00, 0x92, 0x04, 0xa9, 0x2a, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x80, 0xf8, 0xeb, 0xe7, 0x00, 0xbf, 0xd0, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x4d, 0x16, 0x46, 0x9a, 0x46, 0x8a, 0x68, + 0x0b, 0x69, 0xdd, 0xf8, 0x20, 0x80, 0x93, 0x42, 0xb8, 0xbf, + 0x13, 0x46, 0x33, 0x60, 0x91, 0xf8, 0x43, 0x20, 0x07, 0x46, + 0x0c, 0x46, 0x0a, 0xb1, 0x01, 0x33, 0x33, 0x60, 0x23, 0x68, + 0x99, 0x06, 0x42, 0xbf, 0x33, 0x68, 0x02, 0x33, 0x33, 0x60, + 0x25, 0x68, 0x15, 0xf0, 0x06, 0x05, 0x06, 0xd1, 0x04, 0xf1, + 0x19, 0x0b, 0xe3, 0x68, 0x32, 0x68, 0x9b, 0x1a, 0xab, 0x42, + 0x26, 0xdc, 0x94, 0xf8, 0x43, 0x30, 0x22, 0x68, 0x00, 0x3b, + 0x18, 0xbf, 0x01, 0x23, 0x92, 0x06, 0x2b, 0xd4, 0x04, 0xf1, + 0x43, 0x02, 0x51, 0x46, 0x38, 0x46, 0xc0, 0x47, 0x01, 0x30, + 0x1e, 0xd0, 0x23, 0x68, 0xe5, 0x68, 0x32, 0x68, 0x03, 0xf0, + 0x06, 0x03, 0x04, 0x2b, 0x08, 0xbf, 0xad, 0x1a, 0xa3, 0x68, + 0x22, 0x69, 0x0c, 0xbf, 0x25, 0xea, 0xe5, 0x75, 0x00, 0x25, + 0x93, 0x42, 0xc4, 0xbf, 0x9b, 0x1a, 0xed, 0x18, 0x00, 0x26, + 0x1a, 0x34, 0xb5, 0x42, 0x1a, 0xd1, 0x00, 0x20, 0x08, 0xe0, + 0x01, 0x23, 0x5a, 0x46, 0x51, 0x46, 0x38, 0x46, 0xc0, 0x47, + 0x01, 0x30, 0x03, 0xd1, 0x4f, 0xf0, 0xff, 0x30, 0xbd, 0xe8, + 0xf0, 0x8d, 0x01, 0x35, 0xc6, 0xe7, 0xe1, 0x18, 0x5a, 0x1c, + 0x30, 0x20, 0x81, 0xf8, 0x43, 0x00, 0x22, 0x44, 0x94, 0xf8, + 0x45, 0x10, 0x82, 0xf8, 0x43, 0x10, 0x02, 0x33, 0xc7, 0xe7, + 0x01, 0x23, 0x22, 0x46, 0x51, 0x46, 0x38, 0x46, 0xc0, 0x47, + 0x01, 0x30, 0xe6, 0xd0, 0x01, 0x36, 0xd9, 0xe7, 0xff, 0xff, + 0x2d, 0xe9, 0xf0, 0x45, 0x9a, 0x46, 0x0b, 0x7e, 0x85, 0xb0, + 0x78, 0x2b, 0x07, 0x46, 0x0c, 0x9d, 0x0c, 0x46, 0x90, 0x46, + 0x01, 0xf1, 0x43, 0x00, 0x07, 0xd8, 0x62, 0x2b, 0x08, 0xd8, + 0x00, 0x2b, 0x00, 0xf0, 0xe0, 0x80, 0x58, 0x2b, 0x00, 0xf0, + 0xa9, 0x80, 0x04, 0xf1, 0x42, 0x05, 0x3b, 0xe0, 0xa3, 0xf1, + 0x63, 0x02, 0x15, 0x2a, 0xf8, 0xd8, 0x02, 0xa1, 0x51, 0xf8, + 0x22, 0x20, 0x11, 0x44, 0x08, 0x47, 0x00, 0xbf, 0x59, 0x00, + 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, + 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0x6d, 0x00, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, + 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, + 0x69, 0x01, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xa9, 0x01, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, + 0xa1, 0x00, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0x71, 0x01, 0x00, 0x00, 0x2b, 0x68, 0x1a, 0x1d, + 0x1b, 0x68, 0x2a, 0x60, 0x04, 0xf1, 0x42, 0x05, 0x84, 0xf8, + 0x42, 0x30, 0x01, 0x23, 0xaa, 0xe0, 0x21, 0x68, 0x2a, 0x68, + 0x0e, 0x06, 0x02, 0xf1, 0x04, 0x03, 0x0c, 0xd5, 0x16, 0x68, + 0x2b, 0x60, 0x64, 0x4b, 0x00, 0x2e, 0x59, 0xf8, 0x03, 0x20, + 0x03, 0xda, 0x2d, 0x23, 0x76, 0x42, 0x84, 0xf8, 0x43, 0x30, + 0x0a, 0x23, 0x1b, 0xe0, 0x16, 0x68, 0x2b, 0x60, 0x11, 0xf0, + 0x40, 0x0f, 0x18, 0xbf, 0x36, 0xb2, 0xed, 0xe7, 0x2a, 0x68, + 0x26, 0x68, 0x11, 0x1d, 0x29, 0x60, 0x31, 0x06, 0x01, 0xd5, + 0x16, 0x68, 0x02, 0xe0, 0x75, 0x06, 0xfb, 0xd5, 0x16, 0x88, + 0x56, 0x4a, 0x6f, 0x2b, 0x59, 0xf8, 0x02, 0x20, 0x0c, 0xbf, + 0x08, 0x23, 0x0a, 0x23, 0x00, 0x21, 0x84, 0xf8, 0x43, 0x10, + 0x65, 0x68, 0xa5, 0x60, 0x00, 0x2d, 0xa2, 0xbf, 0x21, 0x68, + 0x21, 0xf0, 0x04, 0x01, 0x21, 0x60, 0x0e, 0xb9, 0x00, 0x2d, + 0x50, 0xd0, 0x05, 0x46, 0xb6, 0xfb, 0xf3, 0xf1, 0x03, 0xfb, + 0x11, 0x6c, 0x12, 0xf8, 0x0c, 0xc0, 0x05, 0xf8, 0x01, 0xcd, + 0xb4, 0x46, 0x63, 0x45, 0x0e, 0x46, 0xf3, 0xd9, 0x08, 0x2b, + 0x0b, 0xd1, 0x23, 0x68, 0xde, 0x07, 0x08, 0xd5, 0x23, 0x69, + 0x62, 0x68, 0x9a, 0x42, 0xde, 0xbf, 0x30, 0x23, 0x05, 0xf8, + 0x01, 0x3c, 0x05, 0xf1, 0xff, 0x35, 0x40, 0x1b, 0x20, 0x61, + 0xcd, 0xf8, 0x00, 0xa0, 0x43, 0x46, 0x03, 0xaa, 0x21, 0x46, + 0x38, 0x46, 0xff, 0xf7, 0xdb, 0xfe, 0x01, 0x30, 0x4e, 0xd1, + 0x4f, 0xf0, 0xff, 0x30, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x85, + 0x81, 0xf8, 0x45, 0x30, 0x34, 0x4b, 0x29, 0x68, 0x59, 0xf8, + 0x03, 0x20, 0x23, 0x68, 0x51, 0xf8, 0x04, 0x6b, 0x29, 0x60, + 0x19, 0x06, 0x14, 0xd5, 0xd9, 0x07, 0x44, 0xbf, 0x43, 0xf0, + 0x20, 0x03, 0x23, 0x60, 0x1e, 0xb9, 0x23, 0x68, 0x23, 0xf0, + 0x20, 0x03, 0x23, 0x60, 0x10, 0x23, 0xad, 0xe7, 0x23, 0x68, + 0x43, 0xf0, 0x20, 0x03, 0x23, 0x60, 0x78, 0x23, 0x84, 0xf8, + 0x45, 0x30, 0x27, 0x4b, 0xe1, 0xe7, 0x5d, 0x06, 0x48, 0xbf, + 0xb6, 0xb2, 0xe6, 0xe7, 0x05, 0x46, 0xb9, 0xe7, 0x2b, 0x68, + 0x26, 0x68, 0x62, 0x69, 0x19, 0x1d, 0x29, 0x60, 0x35, 0x06, + 0x1b, 0x68, 0x01, 0xd5, 0x1a, 0x60, 0x02, 0xe0, 0x71, 0x06, + 0xfb, 0xd5, 0x1a, 0x80, 0x00, 0x23, 0x23, 0x61, 0x05, 0x46, + 0xb8, 0xe7, 0x2b, 0x68, 0x1a, 0x1d, 0x2a, 0x60, 0x1d, 0x68, + 0x62, 0x68, 0x00, 0x21, 0x28, 0x46, 0x00, 0xf0, 0xe9, 0xf8, + 0x08, 0xb1, 0x40, 0x1b, 0x60, 0x60, 0x63, 0x68, 0x23, 0x61, + 0x00, 0x23, 0x84, 0xf8, 0x43, 0x30, 0xa6, 0xe7, 0x23, 0x69, + 0x2a, 0x46, 0x41, 0x46, 0x38, 0x46, 0xd0, 0x47, 0x01, 0x30, + 0xa9, 0xd0, 0x23, 0x68, 0x9b, 0x07, 0x13, 0xd4, 0xe0, 0x68, + 0x03, 0x9b, 0x98, 0x42, 0xb8, 0xbf, 0x18, 0x46, 0xa2, 0xe7, + 0x01, 0x23, 0x32, 0x46, 0x41, 0x46, 0x38, 0x46, 0xd0, 0x47, + 0x01, 0x30, 0x99, 0xd0, 0x01, 0x35, 0xe3, 0x68, 0x03, 0x9a, + 0x9b, 0x1a, 0xab, 0x42, 0xf2, 0xdc, 0xeb, 0xe7, 0x00, 0x25, + 0x04, 0xf1, 0x19, 0x06, 0xf5, 0xe7, 0x64, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x07, 0x4b, 0x59, 0xf8, + 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, 0x2b, 0x60, + 0x00, 0xf0, 0x2e, 0xf9, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, + 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, 0xa8, 0x00, 0x00, 0x00, + 0x10, 0xb5, 0x0c, 0x46, 0xb1, 0xf9, 0x0e, 0x10, 0x00, 0xf0, + 0xf4, 0xf8, 0x00, 0x28, 0xab, 0xbf, 0x63, 0x6d, 0xa3, 0x89, + 0x1b, 0x18, 0x23, 0xf4, 0x80, 0x53, 0xac, 0xbf, 0x63, 0x65, + 0xa3, 0x81, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x1f, 0x46, + 0x8b, 0x89, 0xdb, 0x05, 0x05, 0x46, 0x0c, 0x46, 0x16, 0x46, + 0x05, 0xd5, 0xb1, 0xf9, 0x0e, 0x10, 0x02, 0x23, 0x00, 0x22, + 0x00, 0xf0, 0x70, 0xf8, 0xa3, 0x89, 0xb4, 0xf9, 0x0e, 0x10, + 0x23, 0xf4, 0x80, 0x53, 0xa3, 0x81, 0x32, 0x46, 0x3b, 0x46, + 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0xf0, 0x17, 0xb8, + 0x10, 0xb5, 0x0c, 0x46, 0xb1, 0xf9, 0x0e, 0x10, 0x00, 0xf0, + 0x5d, 0xf8, 0x43, 0x1c, 0xa3, 0x89, 0x15, 0xbf, 0x60, 0x65, + 0x23, 0xf4, 0x80, 0x53, 0x43, 0xf4, 0x80, 0x53, 0xa3, 0x81, + 0x18, 0xbf, 0xa3, 0x81, 0x10, 0xbd, 0xb1, 0xf9, 0x0e, 0x10, + 0x00, 0xf0, 0x15, 0xb8, 0xff, 0xff, 0x38, 0xb5, 0x04, 0x46, + 0x08, 0x46, 0x11, 0x46, 0x06, 0x4a, 0x59, 0xf8, 0x02, 0x50, + 0x00, 0x22, 0x2a, 0x60, 0x1a, 0x46, 0x00, 0xf0, 0x83, 0xfa, + 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, + 0x38, 0xbd, 0xa8, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x07, 0x4b, + 0x59, 0xf8, 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, + 0x2b, 0x60, 0x00, 0xf0, 0xb0, 0xf8, 0x43, 0x1c, 0x02, 0xd1, + 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, 0xa8, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x08, 0x4b, 0x59, 0xf8, 0x03, 0x50, + 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, 0x11, 0x46, 0x2b, 0x60, + 0x00, 0xf0, 0xa0, 0xf8, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, + 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, 0x00, 0xbf, 0xa8, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x07, 0x4b, 0x59, 0xf8, 0x03, 0x50, + 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, 0x2b, 0x60, 0x00, 0xf0, + 0x86, 0xf8, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, + 0x23, 0x60, 0x38, 0xbd, 0xa8, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x06, 0x4a, 0x59, 0xf8, + 0x02, 0x50, 0x00, 0x22, 0x2a, 0x60, 0x1a, 0x46, 0x00, 0xf0, + 0x7e, 0xf8, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, + 0x23, 0x60, 0x38, 0xbd, 0xa8, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0x01, + 0x10, 0x2a, 0x2b, 0xdb, 0x10, 0xf0, 0x07, 0x0f, 0x08, 0xd0, + 0x10, 0xf8, 0x01, 0x3b, 0x01, 0x3a, 0x8b, 0x42, 0x2d, 0xd0, + 0x10, 0xf0, 0x07, 0x0f, 0x42, 0xb3, 0xf6, 0xd1, 0xf0, 0xb4, + 0x41, 0xea, 0x01, 0x21, 0x41, 0xea, 0x01, 0x41, 0x22, 0xf0, + 0x07, 0x04, 0x7f, 0xf0, 0x00, 0x07, 0x00, 0x23, 0xf0, 0xe8, + 0x02, 0x56, 0x08, 0x3c, 0x85, 0xea, 0x01, 0x05, 0x86, 0xea, + 0x01, 0x06, 0x85, 0xfa, 0x47, 0xf5, 0xa3, 0xfa, 0x87, 0xf5, + 0x86, 0xfa, 0x47, 0xf6, 0xa5, 0xfa, 0x87, 0xf6, 0x8e, 0xb9, + 0xee, 0xd1, 0xf0, 0xbc, 0x01, 0xf0, 0xff, 0x01, 0x02, 0xf0, + 0x07, 0x02, 0x32, 0xb1, 0x10, 0xf8, 0x01, 0x3b, 0x01, 0x3a, + 0x83, 0xea, 0x01, 0x03, 0x13, 0xb1, 0xf8, 0xd1, 0x00, 0x20, + 0x70, 0x47, 0x01, 0x38, 0x70, 0x47, 0x00, 0x2d, 0x06, 0xbf, + 0x35, 0x46, 0x03, 0x38, 0x07, 0x38, 0x15, 0xf0, 0x01, 0x0f, + 0x07, 0xd1, 0x01, 0x30, 0x15, 0xf4, 0x80, 0x7f, 0x02, 0xbf, + 0x01, 0x30, 0x15, 0xf4, 0xc0, 0x3f, 0x01, 0x30, 0xf0, 0xbc, + 0x01, 0x38, 0x70, 0x47, 0x00, 0xbf, 0x70, 0x47, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x06, 0x4a, + 0x59, 0xf8, 0x02, 0x50, 0x00, 0x22, 0x2a, 0x60, 0x1a, 0x46, + 0x00, 0xf0, 0x16, 0xf8, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, + 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, 0xa8, 0x00, 0x00, 0x00, + 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, 0x70, 0x47, 0x4f, 0xf0, + 0xff, 0x30, 0x70, 0x47, 0x4f, 0xf4, 0x00, 0x53, 0x4b, 0x60, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x08, 0xb5, 0xfe, 0xf7, 0x79, 0xfe, 0x00, 0x20, + 0x70, 0x47, 0x4f, 0xf0, 0xff, 0x30, 0x70, 0x47, 0x07, 0xb5, + 0x02, 0x46, 0x01, 0x21, 0x68, 0x46, 0xfe, 0xf7, 0xd2, 0xfe, + 0x9d, 0xf8, 0x00, 0x30, 0x43, 0xb1, 0x00, 0xf0, 0xf7, 0xf9, + 0x0c, 0x23, 0x03, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0x03, 0xb0, + 0x5d, 0xf8, 0x04, 0xfb, 0x01, 0x98, 0xfa, 0xe7, 0x05, 0x4b, + 0x59, 0xf8, 0x03, 0x20, 0x10, 0x68, 0x28, 0xb1, 0x03, 0x69, + 0x13, 0x60, 0x00, 0x22, 0x03, 0xb1, 0x5a, 0x61, 0x02, 0x61, + 0x70, 0x47, 0x80, 0x00, 0x00, 0x00, 0xf7, 0xb5, 0x01, 0xa8, + 0x0e, 0x46, 0x00, 0xf0, 0x62, 0xf9, 0xff, 0xf7, 0xeb, 0xff, + 0x04, 0x46, 0x20, 0xb1, 0x03, 0x68, 0x42, 0x68, 0xf3, 0x1a, + 0x9a, 0x42, 0x0b, 0xd9, 0x1d, 0x49, 0x1e, 0x4b, 0x1e, 0x4a, + 0x59, 0xf8, 0x01, 0x00, 0x59, 0xf8, 0x03, 0x30, 0x59, 0xf8, + 0x02, 0x20, 0xf0, 0x21, 0x00, 0xf0, 0xa0, 0xf9, 0x00, 0x21, + 0xc0, 0xe9, 0x04, 0x11, 0x19, 0x4b, 0x59, 0xf8, 0x03, 0x70, + 0x3d, 0x68, 0xb5, 0xb9, 0x00, 0x25, 0x23, 0x46, 0x65, 0x61, + 0x9e, 0x68, 0x24, 0x69, 0x1d, 0x61, 0x2e, 0xb1, 0xd3, 0xe9, + 0x00, 0x01, 0xda, 0x68, 0x01, 0x44, 0x01, 0x98, 0xb0, 0x47, + 0x00, 0x2c, 0xf1, 0xd1, 0x3b, 0x68, 0x1b, 0xb1, 0xd3, 0xe9, + 0x00, 0x01, 0x00, 0xf0, 0x42, 0xf9, 0x03, 0xb0, 0xf0, 0xbd, + 0x2b, 0x68, 0x01, 0x9a, 0xd2, 0x1a, 0xf3, 0x1a, 0x9a, 0x42, + 0x04, 0xd3, 0x68, 0x68, 0x83, 0x42, 0x01, 0xd2, 0x82, 0x42, + 0xdd, 0xd3, 0xff, 0xf7, 0xac, 0xff, 0xc5, 0xe9, 0x04, 0x14, + 0x25, 0x61, 0xd5, 0xe7, 0x70, 0x00, 0x00, 0x00, 0x6c, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x73, 0xb5, 0x04, 0x46, 0x01, 0xa8, 0x00, 0xf0, 0xfe, 0xf8, + 0x01, 0x9d, 0x4f, 0xf4, 0x7a, 0x70, 0xb4, 0xfb, 0xf0, 0xf6, + 0x00, 0xfb, 0x16, 0x40, 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, + 0xa0, 0xfb, 0x05, 0x01, 0x00, 0xf0, 0xe7, 0xf9, 0xe6, 0xfb, + 0x05, 0x01, 0x59, 0xb1, 0x06, 0x49, 0x07, 0x4b, 0x07, 0x4a, + 0x59, 0xf8, 0x01, 0x00, 0x59, 0xf8, 0x03, 0x30, 0x59, 0xf8, + 0x02, 0x20, 0x3f, 0x21, 0x00, 0xf0, 0x46, 0xf9, 0x02, 0xb0, + 0x70, 0xbd, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x37, 0xb5, 0x04, 0x46, 0x01, 0xa8, + 0x00, 0xf0, 0xd4, 0xf8, 0x01, 0x9a, 0xb4, 0xfb, 0xf2, 0xf5, + 0x02, 0xfb, 0x15, 0x40, 0x4f, 0xf4, 0x7a, 0x74, 0x00, 0x23, + 0xa0, 0xfb, 0x04, 0x01, 0x00, 0xf0, 0xbf, 0xf9, 0x05, 0xfb, + 0x04, 0x00, 0x03, 0xb0, 0x30, 0xbd, 0xff, 0xff, 0x2d, 0xe9, + 0xf8, 0x45, 0x08, 0x9c, 0xc4, 0xe9, 0x02, 0x23, 0x00, 0x22, + 0xc4, 0xe9, 0x00, 0x01, 0xc4, 0xe9, 0x04, 0x22, 0x22, 0x4b, + 0x59, 0xf8, 0x03, 0x60, 0x33, 0x68, 0x63, 0xb9, 0x34, 0x60, + 0x20, 0x4b, 0x00, 0x21, 0x59, 0xf8, 0x03, 0x00, 0x00, 0xf0, + 0x9c, 0xf8, 0xd4, 0xe9, 0x00, 0x01, 0xbd, 0xe8, 0xf8, 0x45, + 0x00, 0xf0, 0xcb, 0xb8, 0x47, 0x18, 0xc9, 0x43, 0x88, 0x42, + 0x94, 0xbf, 0x00, 0x21, 0x01, 0x21, 0x94, 0x46, 0xb6, 0x46, + 0xd3, 0xe9, 0x00, 0x52, 0x05, 0xeb, 0x02, 0x08, 0xd2, 0x43, + 0x95, 0x42, 0x94, 0xbf, 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, + 0x01, 0x0a, 0x8a, 0x45, 0x0e, 0xd1, 0x47, 0x45, 0x0c, 0xd2, + 0xce, 0xf8, 0x00, 0x40, 0xc4, 0xe9, 0x04, 0x3c, 0x5c, 0x61, + 0x33, 0x68, 0x9c, 0x42, 0xd4, 0xd0, 0x00, 0x20, 0xbd, 0xe8, + 0xf8, 0x85, 0x13, 0x46, 0xe3, 0xe7, 0x95, 0x42, 0x03, 0xd9, + 0xa8, 0x42, 0xee, 0xd8, 0x47, 0x45, 0xec, 0xd3, 0x1a, 0x69, + 0x03, 0xf1, 0x10, 0x0e, 0x9c, 0x46, 0x00, 0x2a, 0xf1, 0xd1, + 0x1c, 0x61, 0xc4, 0xe9, 0x04, 0x23, 0xe7, 0xe7, 0x80, 0x00, + 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x53, 0x68, 0x73, 0xb5, + 0x0d, 0x46, 0x14, 0x46, 0x02, 0xf1, 0x14, 0x06, 0x43, 0xb9, + 0x00, 0x96, 0xd2, 0xe9, 0x03, 0x23, 0xa1, 0x68, 0x28, 0x46, + 0xff, 0xf7, 0x9e, 0xff, 0x02, 0xb0, 0x70, 0xbd, 0x01, 0x3b, + 0x53, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0xff, 0xf7, 0x80, 0xff, + 0xff, 0xf7, 0x54, 0xff, 0x03, 0x4b, 0x01, 0x46, 0x59, 0xf8, + 0x03, 0x20, 0x00, 0x96, 0x23, 0x46, 0xeb, 0xe7, 0x00, 0xbf, + 0x7c, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xff, 0x4d, 0x05, 0x46, + 0x03, 0xa8, 0x0f, 0x46, 0x90, 0x46, 0x1c, 0x46, 0x00, 0xf0, + 0x56, 0xf8, 0x00, 0xbb, 0x4f, 0xf0, 0xff, 0x30, 0xff, 0xf7, + 0x66, 0xff, 0x06, 0x46, 0xff, 0xf7, 0x39, 0xff, 0xae, 0x42, + 0x82, 0x46, 0x04, 0xf1, 0x14, 0x0b, 0x17, 0xd2, 0xb5, 0xfb, + 0xf6, 0xf0, 0x43, 0x1e, 0x63, 0x60, 0x06, 0xfb, 0x10, 0x50, + 0xff, 0xf7, 0x2c, 0xff, 0xc4, 0xe9, 0x03, 0x78, 0x0c, 0x4b, + 0xa0, 0x60, 0x03, 0x98, 0x59, 0xf8, 0x03, 0x20, 0xcd, 0xf8, + 0x00, 0xb0, 0x23, 0x46, 0x51, 0x46, 0xff, 0xf7, 0x5f, 0xff, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, 0x28, 0x46, 0x03, 0x9c, + 0xff, 0xf7, 0x18, 0xff, 0xcd, 0xf8, 0x00, 0xb0, 0x01, 0x46, + 0x43, 0x46, 0x3a, 0x46, 0x20, 0x46, 0xef, 0xe7, 0x00, 0xbf, + 0x7c, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x22, + 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, 0x11, 0x46, + 0xfe, 0xf7, 0x07, 0xfd, 0x94, 0xe8, 0x0f, 0x00, 0x06, 0xb0, + 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, 0x93, 0xbc, 0x30, 0xb5, + 0x87, 0xb0, 0x00, 0x23, 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, + 0x20, 0x46, 0x01, 0x22, 0x19, 0x46, 0xfe, 0xf7, 0x11, 0xfd, + 0x00, 0x95, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, 0x6b, 0xfc, + 0x07, 0xb0, 0x30, 0xbd, 0x30, 0xb5, 0x87, 0xb0, 0x00, 0x23, + 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, 0x20, 0x46, 0x02, 0x22, + 0x19, 0x46, 0xfe, 0xf7, 0xff, 0xfc, 0x00, 0x95, 0x94, 0xe8, + 0x0f, 0x00, 0xfe, 0xf7, 0x59, 0xfc, 0x07, 0xb0, 0x30, 0xbd, + 0x10, 0xb5, 0x88, 0xb0, 0x04, 0xac, 0x03, 0x46, 0x00, 0x91, + 0x20, 0x46, 0x06, 0x22, 0x00, 0x21, 0xfe, 0xf7, 0xee, 0xfc, + 0x03, 0xab, 0x00, 0x93, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, + 0x47, 0xfc, 0x08, 0xb0, 0x10, 0xbd, 0x07, 0xb5, 0x08, 0x46, + 0x11, 0x46, 0x01, 0xaa, 0x00, 0xf0, 0x0f, 0xf8, 0x01, 0x98, + 0x03, 0xb0, 0x5d, 0xf8, 0x04, 0xfb, 0xff, 0xff, 0x03, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x01, 0x22, 0x59, 0x60, 0x1a, 0x70, + 0x18, 0x81, 0x70, 0x47, 0x90, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x40, 0x00, 0x23, 0x23, 0x70, + 0x08, 0x4b, 0x15, 0x46, 0x59, 0xf8, 0x03, 0x20, 0x00, 0xf0, + 0xfe, 0xf9, 0x38, 0xb9, 0x20, 0x46, 0xfe, 0xf7, 0x9a, 0xfc, + 0xb4, 0xf9, 0x08, 0x00, 0x08, 0xb9, 0x63, 0x68, 0x2b, 0x60, + 0x38, 0xbd, 0x90, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x1f, 0xb5, 0x14, 0x46, 0x1a, 0x46, 0x0d, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x1b, 0x68, 0x05, 0x46, 0x0e, 0x46, 0xd8, 0x68, + 0x6c, 0xb1, 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x09, 0x49, + 0x59, 0xf8, 0x01, 0x10, 0x00, 0x96, 0xcd, 0xe9, 0x01, 0x34, + 0x2b, 0x46, 0x00, 0xf0, 0x17, 0xf8, 0x00, 0xf0, 0x29, 0xf8, + 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x1c, 0x46, 0xef, 0xe7, + 0xd8, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9c, 0x00, + 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x02, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x18, 0x68, 0x70, 0x47, 0x00, 0xbf, 0xd8, 0x00, + 0x00, 0x00, 0x0e, 0xb4, 0x17, 0xb5, 0x05, 0xab, 0x01, 0x46, + 0x53, 0xf8, 0x04, 0x2b, 0x05, 0x48, 0x01, 0x93, 0x59, 0xf8, + 0x00, 0x40, 0x20, 0x68, 0xff, 0xf7, 0xf7, 0xf9, 0x03, 0xb0, + 0xbd, 0xe8, 0x10, 0x40, 0x03, 0xb0, 0x70, 0x47, 0xd8, 0x00, + 0x00, 0x00, 0x08, 0xb5, 0x06, 0x20, 0x00, 0xf0, 0x2c, 0xf8, + 0x01, 0x20, 0xff, 0xf7, 0xd3, 0xfd, 0x1f, 0x29, 0x38, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x04, 0xd9, 0x16, 0x23, 0x03, 0x60, + 0x4f, 0xf0, 0xff, 0x30, 0x38, 0xbd, 0x42, 0x6c, 0x12, 0xb1, + 0x52, 0xf8, 0x21, 0x30, 0x4b, 0xb9, 0x20, 0x46, 0x00, 0xf0, + 0x35, 0xf8, 0x2a, 0x46, 0x01, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x00, 0xf0, 0x1a, 0xb8, 0x01, 0x2b, 0x0a, 0xd0, + 0x59, 0x1c, 0x03, 0xd1, 0x16, 0x23, 0x03, 0x60, 0x01, 0x20, + 0xe7, 0xe7, 0x00, 0x24, 0x42, 0xf8, 0x25, 0x40, 0x28, 0x46, + 0x98, 0x47, 0x00, 0x20, 0xe0, 0xe7, 0xff, 0xff, 0x03, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x01, 0x46, 0x18, 0x68, 0xff, 0xf7, + 0xd0, 0xbf, 0x00, 0xbf, 0xd8, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x08, 0x4b, 0x59, 0xf8, 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, + 0x08, 0x46, 0x11, 0x46, 0x2b, 0x60, 0xff, 0xf7, 0x9a, 0xfd, + 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, + 0x38, 0xbd, 0x00, 0xbf, 0xa8, 0x00, 0x00, 0x00, 0xff, 0xf7, + 0x8d, 0xbd, 0x53, 0xb9, 0x4a, 0xb9, 0x00, 0x29, 0x08, 0xbf, + 0x00, 0x28, 0x1c, 0xbf, 0x4f, 0xf0, 0xff, 0x31, 0x4f, 0xf0, + 0xff, 0x30, 0x00, 0xf0, 0x4e, 0xb9, 0xad, 0xf1, 0x08, 0x0c, + 0x6d, 0xe9, 0x04, 0xce, 0x00, 0xf0, 0x06, 0xf8, 0xdd, 0xf8, + 0x04, 0xe0, 0xdd, 0xe9, 0x02, 0x23, 0x04, 0xb0, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x4d, 0x07, 0x46, 0x9e, 0x46, 0x08, 0x46, + 0x0b, 0x46, 0x08, 0x9e, 0x15, 0x46, 0x3c, 0x46, 0x71, 0x46, + 0xbe, 0xf1, 0x00, 0x0f, 0x40, 0xf0, 0xb2, 0x80, 0x82, 0x42, + 0xb2, 0xfa, 0x82, 0xf7, 0x43, 0xd9, 0x47, 0xb1, 0xc7, 0xf1, + 0x20, 0x0c, 0x24, 0xfa, 0x0c, 0xfc, 0xbb, 0x40, 0xbd, 0x40, + 0x4c, 0xea, 0x03, 0x03, 0xbc, 0x40, 0x4f, 0xea, 0x15, 0x4e, + 0x1f, 0xfa, 0x85, 0xf8, 0xb3, 0xfb, 0xfe, 0xfc, 0x22, 0x0c, + 0x0e, 0xfb, 0x1c, 0x33, 0x0c, 0xfb, 0x08, 0xfa, 0x42, 0xea, + 0x03, 0x43, 0x9a, 0x45, 0x28, 0xd9, 0xeb, 0x18, 0x0c, 0xf1, + 0xff, 0x30, 0x04, 0xd2, 0x9a, 0x45, 0x02, 0xd9, 0xac, 0xf1, + 0x02, 0x00, 0x2b, 0x44, 0xa3, 0xeb, 0x0a, 0x03, 0xb3, 0xfb, + 0xfe, 0xfc, 0x0c, 0xfb, 0x08, 0xf2, 0x0e, 0xfb, 0x1c, 0x33, + 0xa4, 0xb2, 0x44, 0xea, 0x03, 0x44, 0xa2, 0x42, 0x7c, 0xd9, + 0x2c, 0x19, 0x0c, 0xf1, 0xff, 0x3b, 0x04, 0xd2, 0xa2, 0x42, + 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x0b, 0x2c, 0x44, 0xa4, 0x1a, + 0x4b, 0xea, 0x00, 0x40, 0x1e, 0xb1, 0xfc, 0x40, 0x00, 0x23, + 0x34, 0x60, 0x73, 0x60, 0xbd, 0xe8, 0xf0, 0x8d, 0x60, 0x46, + 0xdd, 0xe7, 0x02, 0xb9, 0xff, 0xde, 0xff, 0xb9, 0x83, 0x1a, + 0x01, 0x21, 0x4f, 0xea, 0x15, 0x4e, 0xaa, 0xb2, 0xb3, 0xfb, + 0xfe, 0xfc, 0x20, 0x0c, 0x0e, 0xfb, 0x1c, 0x33, 0x0c, 0xfb, + 0x02, 0xf8, 0x40, 0xea, 0x03, 0x43, 0x98, 0x45, 0x52, 0xd9, + 0xeb, 0x18, 0x0c, 0xf1, 0xff, 0x30, 0x04, 0xd2, 0x98, 0x45, + 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x00, 0x2b, 0x44, 0xa3, 0xeb, + 0x08, 0x03, 0xb3, 0xfb, 0xfe, 0xfc, 0x0c, 0xfb, 0x02, 0xf2, + 0xc0, 0xe7, 0xc7, 0xf1, 0x20, 0x0c, 0x20, 0xfa, 0x0c, 0xfa, + 0x00, 0xfa, 0x07, 0xf3, 0x24, 0xfa, 0x0c, 0xfc, 0xbd, 0x40, + 0x4c, 0xea, 0x03, 0x02, 0x4f, 0xea, 0x15, 0x48, 0xab, 0xb2, + 0xba, 0xfb, 0xf8, 0xfc, 0x11, 0x0c, 0x08, 0xfb, 0x1c, 0xa0, + 0x0c, 0xfb, 0x03, 0xfe, 0x41, 0xea, 0x00, 0x40, 0x86, 0x45, + 0x04, 0xfa, 0x07, 0xf4, 0x23, 0xd9, 0x28, 0x18, 0x0c, 0xf1, + 0xff, 0x31, 0x04, 0xd2, 0x86, 0x45, 0x02, 0xd9, 0xac, 0xf1, + 0x02, 0x01, 0x28, 0x44, 0xa0, 0xeb, 0x0e, 0x00, 0x92, 0xb2, + 0xb0, 0xfb, 0xf8, 0xfe, 0x08, 0xfb, 0x1e, 0x00, 0x0e, 0xfb, + 0x03, 0xfc, 0x42, 0xea, 0x00, 0x43, 0x9c, 0x45, 0x0f, 0xd9, + 0xeb, 0x18, 0x0e, 0xf1, 0xff, 0x32, 0x04, 0xd2, 0x9c, 0x45, + 0x02, 0xd9, 0xae, 0xf1, 0x02, 0x02, 0x2b, 0x44, 0xa3, 0xeb, + 0x0c, 0x03, 0x42, 0xea, 0x01, 0x41, 0xa2, 0xe7, 0x61, 0x46, + 0xe2, 0xe7, 0x72, 0x46, 0xf6, 0xe7, 0x60, 0x46, 0xb3, 0xe7, + 0xe3, 0x46, 0x89, 0xe7, 0x86, 0x45, 0x05, 0xd9, 0x0e, 0xb1, + 0xc6, 0xe9, 0x00, 0x70, 0x00, 0x21, 0x08, 0x46, 0x89, 0xe7, + 0xbe, 0xfa, 0x8e, 0xf1, 0x79, 0xb9, 0x86, 0x45, 0x01, 0xd3, + 0xba, 0x42, 0x09, 0xd8, 0xbc, 0x1a, 0x60, 0xeb, 0x0e, 0x03, + 0x01, 0x20, 0x00, 0x2e, 0x6a, 0xd0, 0xc6, 0xe9, 0x00, 0x43, + 0x00, 0x21, 0x78, 0xe7, 0x08, 0x46, 0xf7, 0xe7, 0xc1, 0xf1, + 0x20, 0x0c, 0x0e, 0xfa, 0x01, 0xfe, 0x22, 0xfa, 0x0c, 0xf4, + 0x44, 0xea, 0x0e, 0x04, 0x00, 0xfa, 0x01, 0xf3, 0x02, 0xfa, + 0x01, 0xf5, 0x27, 0xfa, 0x0c, 0xf2, 0x20, 0xfa, 0x0c, 0xfb, + 0x4f, 0xea, 0x14, 0x4a, 0x13, 0x43, 0xbb, 0xfb, 0xfa, 0xf8, + 0x1f, 0xfa, 0x84, 0xfe, 0x0a, 0xfb, 0x18, 0xbb, 0x1a, 0x0c, + 0x08, 0xfb, 0x0e, 0xf0, 0x42, 0xea, 0x0b, 0x42, 0x90, 0x42, + 0x07, 0xfa, 0x01, 0xf7, 0x3e, 0xd9, 0xa2, 0x18, 0x08, 0xf1, + 0xff, 0x3b, 0x04, 0xd2, 0x90, 0x42, 0x02, 0xd9, 0xa8, 0xf1, + 0x02, 0x0b, 0x22, 0x44, 0x12, 0x1a, 0x9b, 0xb2, 0xb2, 0xfb, + 0xfa, 0xf8, 0x0a, 0xfb, 0x18, 0x22, 0x08, 0xfb, 0x0e, 0xfe, + 0x43, 0xea, 0x02, 0x42, 0x96, 0x45, 0x2b, 0xd9, 0xa2, 0x18, + 0x08, 0xf1, 0xff, 0x30, 0x04, 0xd2, 0x96, 0x45, 0x02, 0xd9, + 0xa8, 0xf1, 0x02, 0x00, 0x22, 0x44, 0x40, 0xea, 0x0b, 0x40, + 0xa0, 0xfb, 0x05, 0x83, 0xa2, 0xeb, 0x0e, 0x02, 0x9a, 0x42, + 0xc6, 0x46, 0x9a, 0x46, 0x02, 0xd3, 0x07, 0xd1, 0x47, 0x45, + 0x05, 0xd2, 0xb8, 0xeb, 0x05, 0x0e, 0x63, 0xeb, 0x04, 0x03, + 0x01, 0x38, 0x9a, 0x46, 0x86, 0xb1, 0xb7, 0xeb, 0x0e, 0x03, + 0x62, 0xeb, 0x0a, 0x02, 0x02, 0xfa, 0x0c, 0xfc, 0xcb, 0x40, + 0x4c, 0xea, 0x03, 0x03, 0xca, 0x40, 0xc6, 0xe9, 0x00, 0x32, + 0x9a, 0xe7, 0xc3, 0x46, 0xc7, 0xe7, 0x40, 0x46, 0xda, 0xe7, + 0x31, 0x46, 0x0f, 0xe7, 0x70, 0x47, 0x00, 0xbf, 0x00, 0xb2, + 0x18, 0x47, 0x38, 0xb5, 0x0a, 0x4b, 0x05, 0x46, 0x0c, 0x46, + 0x59, 0xf8, 0x03, 0x00, 0x11, 0x46, 0x00, 0xf0, 0x0f, 0xf8, + 0x48, 0xb9, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x1b, 0xf8, + 0x20, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x00, 0xf0, + 0x26, 0xb8, 0x38, 0xbd, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, + 0x10, 0xb5, 0x86, 0xb0, 0x01, 0x22, 0x02, 0xac, 0x03, 0x46, + 0x00, 0x91, 0x20, 0x46, 0x11, 0x46, 0xfe, 0xf7, 0x89, 0xfa, + 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, 0x18, 0xfa, 0x00, 0xb2, + 0x06, 0xb0, 0x10, 0xbd, 0x10, 0xb5, 0x86, 0xb0, 0x01, 0x22, + 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, 0x11, 0x46, + 0xfe, 0xf7, 0xa1, 0xfa, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, + 0x27, 0xfa, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x10, 0xb5, + 0x86, 0xb0, 0x00, 0x22, 0x00, 0x92, 0x02, 0xac, 0x01, 0x22, + 0x03, 0x46, 0x11, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0x82, 0xfa, + 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, 0xc7, 0xf9, 0x00, 0xb2, + 0x06, 0xb0, 0x10, 0xbd, 0x5b, 0x54, 0x6f, 0x63, 0x6b, 0x5d, + 0x20, 0x41, 0x44, 0x43, 0x20, 0x54, 0x65, 0x73, 0x74, 0x00, + 0x4e, 0x6f, 0x20, 0x41, 0x44, 0x43, 0x20, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x21, 0x00, 0x41, 0x44, 0x43, 0x20, 0x64, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x25, 0x64, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x0a, + 0x00, 0x41, 0x44, 0x43, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x76, 0x6f, 0x6c, 0x74, 0x61, + 0x67, 0x65, 0x20, 0x25, 0x64, 0x2e, 0x25, 0x64, 0x56, 0x0a, + 0x00, 0x41, 0x44, 0x43, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x76, 0x6f, + 0x6c, 0x74, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, + 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x33, 0x2e, 0x33, 0x56, + 0x00, 0x41, 0x44, 0x43, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x6c, 0x75, 0x20, + 0x62, 0x69, 0x74, 0x73, 0x0a, 0x00, 0x0a, 0x53, 0x69, 0x6e, + 0x67, 0x6c, 0x65, 0x20, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x20, 0x2d, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x20, 0x25, 0x75, 0x0a, 0x00, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x41, 0x44, 0x43, 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x41, 0x44, 0x43, 0x20, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x6d, 0x56, 0x20, 0x28, + 0x72, 0x61, 0x77, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, 0x34, + 0x78, 0x29, 0x0a, 0x00, 0x0a, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x64, 0x20, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x20, 0x2d, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x20, 0x25, 0x75, 0x0a, 0x00, 0x25, 0x6c, 0x75, 0x20, + 0x41, 0x44, 0x43, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x20, 0x61, 0x74, 0x20, 0x25, 0x6c, 0x75, 0x20, 0x48, + 0x7a, 0x0a, 0x00, 0x09, 0x5b, 0x20, 0x00, 0x25, 0x75, 0x20, + 0x00, 0x5d, 0x00, 0xff, 0x19, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x88, 0x13, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x44, 0xac, + 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0xf0, 0x49, 0x02, 0x00, + 0x98, 0xab, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x2d, 0x30, 0x2b, 0x20, 0x00, 0x68, 0x6c, 0x4c, 0x00, + 0x65, 0x66, 0x67, 0x45, 0x46, 0x47, 0x00, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x00, 0x68, 0x65, 0x61, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x4e, + 0x55, 0x4c, 0x4c, 0x20, 0x26, 0x26, 0x20, 0x21, 0x69, 0x73, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x28, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x68, + 0x65, 0x61, 0x64, 0x2d, 0x3e, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, + 0x2d, 0x3e, 0x64, 0x74, 0x29, 0x00, 0x2e, 0x2e, 0x2f, 0x2e, + 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x6c, 0x69, + 0x62, 0x74, 0x6f, 0x63, 0x6b, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, + 0x2e, 0x63, 0x00, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x20, 0x3c, + 0x3d, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x4d, + 0x41, 0x58, 0x00, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x74, + 0x69, 0x63, 0x6b, 0x73, 0x00, 0x61, 0x6c, 0x61, 0x72, 0x6d, + 0x5f, 0x75, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, + 0x00, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x22, 0x25, 0x73, 0x22, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x3a, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x22, + 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x25, 0x64, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0xff, 0xff, + 0xdc, 0x20, 0x00, 0x80, 0xec, 0x20, 0x00, 0x80, 0xfb, 0x20, + 0x00, 0x80, 0x1f, 0x21, 0x00, 0x80, 0x3d, 0x21, 0x00, 0x80, + 0x65, 0x21, 0x00, 0x80, 0x7e, 0x21, 0x00, 0x80, 0x9c, 0x21, + 0x00, 0x80, 0xb4, 0x21, 0x00, 0x80, 0xd6, 0x21, 0x00, 0x80, + 0xf6, 0x21, 0x00, 0x80, 0x11, 0x22, 0x00, 0x80, 0x15, 0x22, + 0x00, 0x80, 0x19, 0x22, 0x00, 0x80, 0xd7, 0x02, 0x00, 0x80, + 0x78, 0x09, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x80, 0x09, + 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, + 0x5d, 0x07, 0x00, 0x80, 0xd0, 0x0a, 0x00, 0x00, 0xa4, 0x22, + 0x00, 0x80, 0xaa, 0x22, 0x00, 0x80, 0xae, 0x22, 0x00, 0x80, + 0xb5, 0x22, 0x00, 0x80, 0xc6, 0x22, 0x00, 0x80, 0xd7, 0x22, + 0x00, 0x80, 0x18, 0x23, 0x00, 0x80, 0xf1, 0x18, 0x00, 0x80, + 0x3d, 0x23, 0x00, 0x80, 0xbd, 0x1a, 0x00, 0x80, 0xe4, 0x0a, + 0x00, 0x00, 0x51, 0x23, 0x00, 0x80, 0x5d, 0x23, 0x00, 0x80, + 0x1d, 0x1c, 0x00, 0x80, 0xe8, 0x0a, 0x00, 0x00, 0xd5, 0x21, + 0x00, 0x80, 0x6a, 0x23, 0x00, 0x80, 0x77, 0x23, 0x00, 0x80, + 0x41, 0x20, 0x00, 0x80, 0xbb, 0x16, 0x00, 0x80, 0xdc, 0x0a, + 0x00, 0x00, 0x61, 0x0c, 0x00, 0x80, 0x70, 0x09, 0x00, 0x00, + 0x44, 0x22, 0x00, 0x80, 0xa3, 0x10, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x16, 0x00, 0x80, 0xa9, 0x0b, 0x00, 0x80, 0x64, 0x22, + 0x00, 0x80, 0xdf, 0x16, 0x00, 0x80, 0x6c, 0x09, 0x00, 0x00, + 0x74, 0x09, 0x00, 0x00, 0x83, 0x16, 0x00, 0x80, 0x84, 0x22, + 0x00, 0x80, 0xd8, 0x0a, 0x00, 0x00, 0xd4, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xad, 0x06, 0x00, 0x80, 0xad, 0x06, 0x00, 0x80, + 0xc1, 0x06, 0x00, 0x80, 0xc1, 0x06, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x22, 0x00, 0x80, 0x84, 0x22, 0x00, 0x80, + 0x44, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x0c, 0x09, + 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, + 0x02, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x02, 0x64, + 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x02, 0x67, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x00, 0x02, 0x67, 0x00, 0x00, 0x10, 0x09, + 0x00, 0x00, 0x02, 0xbe, 0x01, 0x00, 0x14, 0x09, 0x00, 0x00, + 0x02, 0xdd, 0x01, 0x00, 0x18, 0x09, 0x00, 0x00, 0x02, 0x9c, + 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, + 0x70, 0x09, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x80, 0x00, + 0x4c, 0x1a}; diff --git a/examples/tests/app_loader/app_binaries/cortex-m4/blink.c b/examples/tests/app_loader/app_binaries/cortex-m4/blink.c new file mode 100644 index 000000000..b937a03fc --- /dev/null +++ b/examples/tests/app_loader/app_binaries/cortex-m4/blink.c @@ -0,0 +1,794 @@ +#include "tock-apps.h" + +uint8_t blink_data[] = +{0x02, 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xd7, 0x32, 0x3c, 0x6e, 0x01, 0x00, 0x0c, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x12, + 0x00, 0x00, 0x09, 0x00, 0x14, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x84, 0x12, 0x00, 0x00, 0xdc, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, + 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x1d, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xfc, 0x1d, + 0x00, 0x00, 0xb0, 0x08, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x18, 0x09, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x64, 0x1e, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x6a, 0x04, 0xf1, 0x07, 0x04, + 0x0c, 0x44, 0x07, 0x25, 0x24, 0xea, 0x05, 0x04, 0x85, 0x69, + 0xc6, 0x69, 0x35, 0x44, 0x0d, 0x44, 0x06, 0x00, 0x0f, 0x00, + 0x9d, 0x42, 0x00, 0xdc, 0xa5, 0x46, 0x00, 0x20, 0x29, 0x00, + 0x05, 0xdf, 0xa5, 0x46, 0x0a, 0x20, 0x21, 0x00, 0x05, 0xdf, + 0x0b, 0x20, 0x29, 0x00, 0x05, 0xdf, 0x70, 0x68, 0x38, 0x44, + 0x81, 0x46, 0x30, 0x00, 0x39, 0x00, 0x00, 0xf0, 0x1e, 0xf8, + 0x37, 0xb5, 0x01, 0xa8, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0x28, + 0x15, 0xdb, 0x00, 0x25, 0x00, 0x24, 0x01, 0x9b, 0xa3, 0x42, + 0x04, 0xdc, 0xfa, 0x20, 0x00, 0xf0, 0x81, 0xf9, 0x01, 0x35, + 0xf6, 0xe7, 0x45, 0xfa, 0x04, 0xf3, 0xdb, 0x07, 0x20, 0x46, + 0x03, 0xd5, 0x00, 0xf0, 0x48, 0xf8, 0x01, 0x34, 0xee, 0xe7, + 0x00, 0xf0, 0x46, 0xf8, 0xfa, 0xe7, 0x03, 0xb0, 0x30, 0xbd, + 0x0d, 0x46, 0x08, 0xb5, 0x41, 0x68, 0x03, 0x68, 0x04, 0x46, + 0x29, 0x44, 0x18, 0x44, 0x00, 0x22, 0xa3, 0x68, 0xb2, 0xeb, + 0x93, 0x0f, 0x1a, 0xd3, 0xd4, 0xe9, 0x03, 0x10, 0x62, 0x69, + 0x21, 0x44, 0x28, 0x44, 0x00, 0xf0, 0x90, 0xf9, 0xd4, 0xe9, + 0x06, 0x02, 0x00, 0x21, 0x28, 0x44, 0x00, 0xf0, 0x98, 0xf9, + 0x21, 0x6a, 0x21, 0x44, 0x00, 0x22, 0x0e, 0x1d, 0x0b, 0x68, + 0xb2, 0xeb, 0x93, 0x0f, 0x11, 0xd3, 0x00, 0x21, 0x08, 0x46, + 0xff, 0xf7, 0xbd, 0xff, 0x00, 0xf0, 0x64, 0xf9, 0x50, 0xf8, + 0x22, 0x30, 0x00, 0x2b, 0xb6, 0xbf, 0x03, 0xf1, 0x00, 0x43, + 0x5b, 0x19, 0x1b, 0x19, 0x41, 0xf8, 0x22, 0x30, 0x01, 0x32, + 0xd4, 0xe7, 0x56, 0xf8, 0x22, 0x00, 0x2b, 0x58, 0x00, 0x2b, + 0xb6, 0xbf, 0x03, 0xf1, 0x00, 0x43, 0x5b, 0x19, 0x1b, 0x19, + 0x2b, 0x50, 0x02, 0x32, 0xdd, 0xe7, 0x00, 0xf0, 0x04, 0xb8, + 0x00, 0xf0, 0x15, 0xb8, 0x00, 0xf0, 0x25, 0xb8, 0x30, 0xb5, + 0x87, 0xb0, 0x00, 0x23, 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, + 0x20, 0x46, 0x1a, 0x46, 0x02, 0x21, 0x00, 0xf0, 0xd6, 0xf8, + 0x00, 0x95, 0x94, 0xe8, 0x0f, 0x00, 0x00, 0xf0, 0x40, 0xf8, + 0x00, 0xb2, 0x07, 0xb0, 0x30, 0xbd, 0x10, 0xb5, 0x86, 0xb0, + 0x02, 0xac, 0x00, 0x22, 0x03, 0x46, 0x00, 0x92, 0x20, 0x46, + 0x01, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xc3, 0xf8, 0x94, 0xe8, + 0x0f, 0x00, 0x00, 0xf0, 0x18, 0xf8, 0x00, 0xb2, 0x06, 0xb0, + 0x10, 0xbd, 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x22, 0x00, 0x92, + 0x02, 0xac, 0x02, 0x22, 0x03, 0x46, 0x11, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xb1, 0xf8, 0x94, 0xe8, 0x0f, 0x00, 0x00, 0xf0, + 0x06, 0xf8, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x40, 0x42, + 0x70, 0x47, 0xff, 0xff, 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, + 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, 0x80, 0x2b, + 0x05, 0xd0, 0x3b, 0xb9, 0x9d, 0xf8, 0x04, 0x00, 0x04, 0xb0, + 0xff, 0xf7, 0xee, 0xbf, 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, + 0x00, 0x48, 0xfb, 0xe7, 0x00, 0xfc, 0xff, 0xff, 0x84, 0xb0, + 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, + 0x00, 0x30, 0x04, 0x9a, 0x81, 0x2b, 0x03, 0xd1, 0x11, 0x60, + 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, 0x1b, 0xb9, 0xc8, 0xb2, + 0x04, 0xb0, 0xff, 0xf7, 0xd4, 0xbf, 0x01, 0x48, 0xf6, 0xe7, + 0x00, 0xbf, 0x00, 0xfc, 0xff, 0xff, 0x84, 0xb0, 0x0d, 0xf1, + 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, + 0x23, 0xb9, 0x9d, 0xf8, 0x0c, 0x00, 0x04, 0xb0, 0xff, 0xf7, + 0xc2, 0xbf, 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, 0x84, 0xb0, + 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, + 0x00, 0x30, 0x23, 0xb9, 0x9d, 0xf8, 0x0c, 0x00, 0x04, 0xb0, + 0xff, 0xf7, 0xb2, 0xbf, 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, + 0x10, 0xb5, 0x11, 0x4b, 0x11, 0x4a, 0x59, 0xf8, 0x03, 0x10, + 0x59, 0xf8, 0x02, 0x20, 0x0b, 0x68, 0x12, 0x68, 0x93, 0x42, + 0x16, 0xd0, 0x0e, 0x4a, 0x59, 0xf8, 0x02, 0x40, 0x14, 0x22, + 0x5a, 0x43, 0x01, 0x33, 0xa0, 0x18, 0xa4, 0x58, 0x5a, 0x42, + 0x02, 0xf0, 0x0f, 0x02, 0x03, 0xf0, 0x0f, 0x03, 0x58, 0xbf, + 0x53, 0x42, 0x0b, 0x60, 0xd0, 0xe9, 0x03, 0x23, 0xd0, 0xe9, + 0x01, 0x01, 0xa0, 0x47, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x20, + 0xfc, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0xb5, 0xff, 0xf7, 0xd3, 0xff, + 0x01, 0x46, 0x08, 0xb9, 0x01, 0x20, 0x00, 0xdf, 0x08, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x23, 0x78, 0x03, 0xb1, 0x10, 0xbd, + 0xff, 0xf7, 0xf1, 0xff, 0xf9, 0xe7, 0x01, 0x46, 0x00, 0x20, + 0x06, 0xdf, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0x02, 0x9b, 0x01, 0xdf, 0x82, 0x28, 0x07, 0xd1, + 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, 0x23, 0x70, 0x00, 0x23, + 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x28, 0x05, 0xd1, + 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, 0x20, 0x70, 0x21, 0x73, + 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x65, 0xf8, 0x10, 0xb5, + 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, + 0x02, 0xdf, 0x20, 0x70, 0xc4, 0xe9, 0x01, 0x12, 0xe3, 0x60, + 0x20, 0x46, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, 0x04, 0xdf, 0x82, 0x28, + 0x07, 0xd1, 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, 0x23, 0x70, + 0x00, 0x23, 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x28, + 0x05, 0xd1, 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, 0x20, 0x70, + 0x21, 0x73, 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x3c, 0xf8, + 0x08, 0xb5, 0x03, 0x46, 0x08, 0x46, 0x11, 0x46, 0x05, 0xdf, + 0x80, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x1a, 0x70, 0x5a, 0x60, + 0x18, 0x46, 0x08, 0xbd, 0x81, 0x28, 0x03, 0xd1, 0x00, 0x22, + 0x1a, 0x70, 0x59, 0x60, 0xf7, 0xe7, 0x10, 0xb9, 0x19, 0x70, + 0x58, 0x60, 0xf3, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x23, 0xf8, + 0xff, 0xff, 0x02, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x01, 0x22, + 0x1a, 0x70, 0x70, 0x47, 0x10, 0x00, 0x00, 0x00, 0x30, 0xb5, + 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x50, 0x09, 0x4b, 0x00, 0x22, + 0x8d, 0xb0, 0x2a, 0x70, 0x59, 0xf8, 0x03, 0x10, 0x01, 0xab, + 0x01, 0xf0, 0x35, 0xf9, 0x04, 0x46, 0x10, 0xb9, 0x28, 0x46, + 0xff, 0xf7, 0x7c, 0xff, 0x20, 0x46, 0x0d, 0xb0, 0x30, 0xbd, + 0x00, 0xbf, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0xb5, 0x09, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x04, 0x46, + 0x13, 0xb1, 0x00, 0x21, 0xaf, 0xf3, 0x00, 0x80, 0x06, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x18, 0x68, 0x83, 0x6a, 0x03, 0xb1, + 0x98, 0x47, 0x20, 0x46, 0x00, 0xf0, 0xe3, 0xff, 0x00, 0xbf, + 0x7c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x44, + 0x91, 0x42, 0x00, 0xf1, 0xff, 0x33, 0x00, 0xd1, 0x70, 0x47, + 0x10, 0xb5, 0x11, 0xf8, 0x01, 0x4b, 0x03, 0xf8, 0x01, 0x4f, + 0x91, 0x42, 0xf9, 0xd1, 0x10, 0xbd, 0x02, 0x44, 0x03, 0x46, + 0x93, 0x42, 0x00, 0xd1, 0x70, 0x47, 0x03, 0xf8, 0x01, 0x1b, + 0xf9, 0xe7, 0x00, 0x23, 0x10, 0xb5, 0x04, 0x46, 0xc0, 0xe9, + 0x00, 0x33, 0xc0, 0xe9, 0x04, 0x33, 0x83, 0x60, 0x81, 0x81, + 0x43, 0x66, 0xc2, 0x81, 0x83, 0x61, 0x19, 0x46, 0x08, 0x22, + 0x5c, 0x30, 0xff, 0xf7, 0xe7, 0xff, 0x09, 0x4b, 0x24, 0x62, + 0x59, 0xf8, 0x03, 0x30, 0x63, 0x62, 0x07, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0xa3, 0x62, 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0xe3, 0x62, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x23, 0x63, + 0x10, 0xbd, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x94, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x02, 0x4b, 0x59, 0xf8, 0x03, 0x10, 0x00, 0xf0, 0x9d, 0xb8, + 0x00, 0xbf, 0x84, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x68, 0x22, + 0x4d, 0x1e, 0x55, 0x43, 0x0e, 0x46, 0x05, 0xf1, 0x74, 0x01, + 0x00, 0xf0, 0xd3, 0xf8, 0x04, 0x46, 0x40, 0xb1, 0x00, 0x21, + 0xc0, 0xe9, 0x00, 0x16, 0x0c, 0x30, 0xa0, 0x60, 0x05, 0xf1, + 0x68, 0x02, 0xff, 0xf7, 0xb0, 0xff, 0x20, 0x46, 0x70, 0xbd, + 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x10, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0xfa, 0xff, 0xa3, 0x69, 0x1b, 0xb1, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xf5, 0xbf, 0x16, 0x4a, + 0x59, 0xf8, 0x02, 0x20, 0x23, 0x65, 0xc4, 0xe9, 0x12, 0x33, + 0x14, 0x4b, 0xa2, 0x62, 0x59, 0xf8, 0x03, 0x30, 0x1b, 0x68, + 0xa3, 0x42, 0x04, 0xbf, 0x01, 0x23, 0xa3, 0x61, 0x20, 0x46, + 0x00, 0xf0, 0x20, 0xf8, 0x60, 0x60, 0x20, 0x46, 0x00, 0xf0, + 0x1c, 0xf8, 0xa0, 0x60, 0x20, 0x46, 0x00, 0xf0, 0x18, 0xf8, + 0x00, 0x22, 0xe0, 0x60, 0x04, 0x21, 0x60, 0x68, 0xff, 0xf7, + 0x88, 0xff, 0xa0, 0x68, 0x01, 0x22, 0x09, 0x21, 0xff, 0xf7, + 0x83, 0xff, 0xe0, 0x68, 0x02, 0x22, 0x12, 0x21, 0xff, 0xf7, + 0x7e, 0xff, 0x01, 0x23, 0xa3, 0x61, 0xce, 0xe7, 0x00, 0xbf, + 0x68, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xf8, 0xb5, + 0x07, 0x46, 0xff, 0xf7, 0xbc, 0xff, 0x1e, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x1e, 0x68, 0xb3, 0x69, 0x13, 0xb9, 0x30, 0x46, + 0xff, 0xf7, 0xb7, 0xff, 0x48, 0x36, 0xd6, 0xe9, 0x01, 0x34, + 0x01, 0x3b, 0x03, 0xd5, 0x33, 0x68, 0xeb, 0xb1, 0x36, 0x68, + 0xf7, 0xe7, 0xb4, 0xf9, 0x0c, 0x50, 0xb5, 0xb9, 0x13, 0x4b, + 0xe3, 0x60, 0x65, 0x66, 0xff, 0xf7, 0xa3, 0xff, 0xc4, 0xe9, + 0x01, 0x55, 0xc4, 0xe9, 0x04, 0x55, 0x25, 0x60, 0xa5, 0x61, + 0x08, 0x22, 0x29, 0x46, 0x04, 0xf1, 0x5c, 0x00, 0xff, 0xf7, + 0x44, 0xff, 0xc4, 0xe9, 0x0d, 0x55, 0xc4, 0xe9, 0x12, 0x55, + 0x20, 0x46, 0xf8, 0xbd, 0x68, 0x34, 0xdd, 0xe7, 0x04, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x74, 0xff, 0x04, 0x46, 0x30, 0x60, + 0x00, 0x28, 0xd9, 0xd1, 0xff, 0xf7, 0x85, 0xff, 0x0c, 0x23, + 0x3b, 0x60, 0xee, 0xe7, 0x00, 0xbf, 0x01, 0x00, 0xff, 0xff, + 0x6c, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x45, 0x06, 0x46, + 0x88, 0x46, 0x00, 0xf1, 0x48, 0x04, 0x00, 0x27, 0xd4, 0xe9, + 0x01, 0xa5, 0xba, 0xf1, 0x01, 0x0a, 0x05, 0xd5, 0x24, 0x68, + 0x00, 0x2c, 0xf7, 0xd1, 0x38, 0x46, 0xbd, 0xe8, 0xf8, 0x85, + 0xab, 0x89, 0x01, 0x2b, 0x07, 0xd9, 0xb5, 0xf9, 0x0e, 0x30, + 0x01, 0x33, 0x03, 0xd0, 0x29, 0x46, 0x30, 0x46, 0xc0, 0x47, + 0x07, 0x43, 0x68, 0x35, 0xe9, 0xe7, 0xff, 0xff, 0x70, 0xb5, + 0x0f, 0x4b, 0x59, 0xf8, 0x03, 0x60, 0x0c, 0x46, 0x31, 0x68, + 0x05, 0x46, 0x11, 0xb9, 0x00, 0xf0, 0x70, 0xfb, 0x30, 0x60, + 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x6b, 0xfb, 0x43, 0x1c, + 0x0a, 0xd0, 0xc4, 0x1c, 0x24, 0xf0, 0x03, 0x04, 0xa0, 0x42, + 0x07, 0xd0, 0x21, 0x1a, 0x28, 0x46, 0x00, 0xf0, 0x60, 0xfb, + 0x01, 0x30, 0x01, 0xd1, 0x4f, 0xf0, 0xff, 0x34, 0x20, 0x46, + 0x70, 0xbd, 0x9c, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0xcd, 0x1c, 0x25, 0xf0, 0x03, 0x05, 0x08, 0x35, 0x0c, 0x2d, + 0x38, 0xbf, 0x0c, 0x25, 0x00, 0x2d, 0x07, 0x46, 0x01, 0xdb, + 0xa9, 0x42, 0x05, 0xd9, 0x0c, 0x23, 0x3b, 0x60, 0x00, 0x26, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xf0, 0x0a, 0xfe, + 0x2e, 0x4b, 0x59, 0xf8, 0x03, 0x60, 0x33, 0x68, 0x1c, 0x46, + 0x34, 0xbb, 0x29, 0x46, 0x38, 0x46, 0xff, 0xf7, 0xbe, 0xff, + 0x43, 0x1c, 0x04, 0x46, 0x4d, 0xd1, 0x34, 0x68, 0x26, 0x46, + 0x00, 0x2e, 0x40, 0xd1, 0x23, 0x68, 0x31, 0x46, 0x38, 0x46, + 0x04, 0xeb, 0x03, 0x08, 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0x45, + 0x3a, 0xd1, 0x21, 0x68, 0x03, 0x35, 0x6d, 0x1a, 0x25, 0xf0, + 0x03, 0x05, 0x08, 0x35, 0x0c, 0x2d, 0x38, 0xbf, 0x0c, 0x25, + 0x29, 0x46, 0x38, 0x46, 0xff, 0xf7, 0xa1, 0xff, 0x01, 0x30, + 0x2b, 0xd0, 0x23, 0x68, 0x2b, 0x44, 0x23, 0x60, 0x0e, 0xe0, + 0x22, 0x68, 0x52, 0x1b, 0x1e, 0xd4, 0x0b, 0x2a, 0x16, 0xd9, + 0x61, 0x19, 0xa3, 0x42, 0x25, 0x60, 0x18, 0xbf, 0x59, 0x60, + 0x63, 0x68, 0x08, 0xbf, 0x31, 0x60, 0x62, 0x51, 0x4b, 0x60, + 0x38, 0x46, 0x04, 0xf1, 0x0b, 0x06, 0x00, 0xf0, 0xca, 0xfd, + 0x26, 0xf0, 0x07, 0x06, 0x23, 0x1d, 0xf2, 0x1a, 0xb4, 0xd0, + 0x9b, 0x1b, 0xa3, 0x50, 0xb1, 0xe7, 0x62, 0x68, 0xa3, 0x42, + 0x0c, 0xbf, 0x32, 0x60, 0x5a, 0x60, 0xec, 0xe7, 0x23, 0x46, + 0x64, 0x68, 0xb2, 0xe7, 0x34, 0x46, 0x76, 0x68, 0xb9, 0xe7, + 0x0c, 0x23, 0x3b, 0x60, 0x38, 0x46, 0x00, 0xf0, 0xb1, 0xfd, + 0x9f, 0xe7, 0x25, 0x60, 0xde, 0xe7, 0x00, 0xbf, 0xa0, 0x00, + 0x00, 0x00, 0x93, 0x68, 0x01, 0x3b, 0x00, 0x2b, 0x10, 0xb4, + 0x93, 0x60, 0x07, 0xda, 0x94, 0x69, 0xa3, 0x42, 0x01, 0xdb, + 0x0a, 0x29, 0x02, 0xd1, 0x10, 0xbc, 0x00, 0xf0, 0x2a, 0xbb, + 0x13, 0x68, 0x58, 0x1c, 0x10, 0x60, 0x19, 0x70, 0x08, 0x46, + 0x10, 0xbc, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x46, 0x0f, 0x46, + 0x14, 0x46, 0xd5, 0x18, 0xac, 0x42, 0x01, 0xd1, 0x00, 0x20, + 0x07, 0xe0, 0x14, 0xf8, 0x01, 0x1b, 0x3a, 0x46, 0x30, 0x46, + 0xff, 0xf7, 0xdc, 0xff, 0x43, 0x1c, 0xf3, 0xd1, 0xf8, 0xbd, + 0xff, 0xff, 0x2d, 0xe9, 0xf0, 0x4d, 0x0d, 0x46, 0x9c, 0xb0, + 0x14, 0x46, 0x1f, 0x46, 0x06, 0x46, 0x18, 0xb1, 0x83, 0x69, + 0x0b, 0xb9, 0xff, 0xf7, 0x94, 0xfe, 0x80, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x9d, 0x42, 0x5b, 0xd1, 0x75, 0x68, 0xab, 0x89, + 0x18, 0x07, 0x65, 0xd5, 0x2b, 0x69, 0x00, 0x2b, 0x62, 0xd0, + 0x00, 0x23, 0x09, 0x93, 0x20, 0x23, 0x8d, 0xf8, 0x29, 0x30, + 0x30, 0x23, 0x8d, 0xf8, 0x2a, 0x30, 0x03, 0x97, 0x4f, 0xf0, + 0x0a, 0x0a, 0x23, 0x46, 0x1f, 0x46, 0x13, 0xf8, 0x01, 0x2b, + 0x0a, 0xb1, 0x25, 0x2a, 0xf9, 0xd1, 0xb7, 0xeb, 0x04, 0x0b, + 0x0b, 0xd0, 0x5b, 0x46, 0x22, 0x46, 0x29, 0x46, 0x30, 0x46, + 0xff, 0xf7, 0xba, 0xff, 0x01, 0x30, 0x00, 0xf0, 0xc7, 0x80, + 0x09, 0x9a, 0x5a, 0x44, 0x09, 0x92, 0x3b, 0x78, 0x00, 0x2b, + 0x00, 0xf0, 0xc0, 0x80, 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, + 0xcd, 0xe9, 0x05, 0x23, 0x04, 0x93, 0x07, 0x93, 0x8d, 0xf8, + 0x53, 0x30, 0x1a, 0x93, 0x64, 0x4b, 0x59, 0xf8, 0x03, 0xb0, + 0x01, 0x37, 0x3c, 0x46, 0x05, 0x22, 0x14, 0xf8, 0x01, 0x1b, + 0x58, 0x46, 0x00, 0xf0, 0xe0, 0xfc, 0x04, 0x9b, 0x00, 0x28, + 0x30, 0xd1, 0xd9, 0x06, 0x44, 0xbf, 0x20, 0x22, 0x8d, 0xf8, + 0x53, 0x20, 0x1a, 0x07, 0x44, 0xbf, 0x2b, 0x22, 0x8d, 0xf8, + 0x53, 0x20, 0x3a, 0x78, 0x2a, 0x2a, 0x2c, 0xd0, 0x07, 0x9a, + 0x3c, 0x46, 0x00, 0x20, 0x21, 0x46, 0x11, 0xf8, 0x01, 0x3b, + 0x30, 0x3b, 0x09, 0x2b, 0x6b, 0xd9, 0x40, 0xbb, 0x2e, 0xe0, + 0x52, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9d, 0x42, 0x01, 0xd1, + 0xb5, 0x68, 0x9d, 0xe7, 0x4f, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x9d, 0x42, 0x08, 0xbf, 0xf5, 0x68, 0x96, 0xe7, 0x29, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0xfd, 0xfa, 0x00, 0x28, 0x96, 0xd0, + 0x4f, 0xf0, 0xff, 0x30, 0x1c, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, + 0xa0, 0xeb, 0x0b, 0x00, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, + 0x03, 0x43, 0x04, 0x93, 0x27, 0x46, 0xbb, 0xe7, 0x03, 0x9a, + 0x11, 0x1d, 0x12, 0x68, 0x03, 0x91, 0x00, 0x2a, 0x01, 0xdb, + 0x07, 0x92, 0x04, 0xe0, 0x52, 0x42, 0x43, 0xf0, 0x02, 0x03, + 0x07, 0x92, 0x04, 0x93, 0x23, 0x78, 0x2e, 0x2b, 0x0c, 0xd1, + 0x63, 0x78, 0x2a, 0x2b, 0x39, 0xd1, 0x03, 0x9b, 0x1a, 0x1d, + 0x1b, 0x68, 0x03, 0x92, 0x00, 0x2b, 0xb8, 0xbf, 0x4f, 0xf0, + 0xff, 0x33, 0x02, 0x34, 0x05, 0x93, 0x34, 0x4b, 0x21, 0x78, + 0x59, 0xf8, 0x03, 0x70, 0x03, 0x22, 0x38, 0x46, 0x00, 0xf0, + 0x7e, 0xfc, 0x38, 0xb1, 0x40, 0x23, 0xc0, 0x1b, 0x03, 0xfa, + 0x00, 0xf0, 0x04, 0x9b, 0x03, 0x43, 0x01, 0x34, 0x04, 0x93, + 0x14, 0xf8, 0x01, 0x1b, 0x2c, 0x4b, 0x8d, 0xf8, 0x28, 0x10, + 0x59, 0xf8, 0x03, 0x00, 0x06, 0x22, 0x00, 0xf0, 0x6b, 0xfc, + 0x00, 0x28, 0x38, 0xd0, 0x28, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x0b, 0xbb, 0x03, 0x9b, 0x07, 0x33, 0x23, 0xf0, 0x07, 0x03, + 0x08, 0x33, 0x03, 0x93, 0x09, 0x9b, 0x43, 0x44, 0x09, 0x93, + 0x4b, 0xe7, 0x0a, 0xfb, 0x02, 0x32, 0x0c, 0x46, 0x01, 0x20, + 0x88, 0xe7, 0x00, 0x23, 0x01, 0x34, 0x05, 0x93, 0x19, 0x46, + 0x20, 0x46, 0x10, 0xf8, 0x01, 0x2b, 0x30, 0x3a, 0x09, 0x2a, + 0x03, 0xd9, 0x00, 0x2b, 0xc3, 0xd0, 0x05, 0x91, 0xc1, 0xe7, + 0x0a, 0xfb, 0x01, 0x21, 0x04, 0x46, 0x01, 0x23, 0xf0, 0xe7, + 0x16, 0x4b, 0x03, 0xaa, 0x59, 0xf8, 0x03, 0x30, 0x00, 0x92, + 0x04, 0xa9, 0x2a, 0x46, 0x30, 0x46, 0xaf, 0xf3, 0x00, 0x80, + 0xb0, 0xf1, 0xff, 0x3f, 0x80, 0x46, 0xd5, 0xd1, 0xab, 0x89, + 0x5b, 0x06, 0x80, 0xd4, 0x09, 0x98, 0x80, 0xe7, 0x0c, 0x4b, + 0x03, 0xaa, 0x59, 0xf8, 0x03, 0x30, 0x00, 0x92, 0x04, 0xa9, + 0x2a, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x80, 0xf8, 0xeb, 0xe7, + 0x00, 0xbf, 0x88, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x74, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4d, 0x16, 0x46, + 0x9a, 0x46, 0x8a, 0x68, 0x0b, 0x69, 0xdd, 0xf8, 0x20, 0x80, + 0x93, 0x42, 0xb8, 0xbf, 0x13, 0x46, 0x33, 0x60, 0x91, 0xf8, + 0x43, 0x20, 0x07, 0x46, 0x0c, 0x46, 0x0a, 0xb1, 0x01, 0x33, + 0x33, 0x60, 0x23, 0x68, 0x99, 0x06, 0x42, 0xbf, 0x33, 0x68, + 0x02, 0x33, 0x33, 0x60, 0x25, 0x68, 0x15, 0xf0, 0x06, 0x05, + 0x06, 0xd1, 0x04, 0xf1, 0x19, 0x0b, 0xe3, 0x68, 0x32, 0x68, + 0x9b, 0x1a, 0xab, 0x42, 0x26, 0xdc, 0x94, 0xf8, 0x43, 0x30, + 0x22, 0x68, 0x00, 0x3b, 0x18, 0xbf, 0x01, 0x23, 0x92, 0x06, + 0x2b, 0xd4, 0x04, 0xf1, 0x43, 0x02, 0x51, 0x46, 0x38, 0x46, + 0xc0, 0x47, 0x01, 0x30, 0x1e, 0xd0, 0x23, 0x68, 0xe5, 0x68, + 0x32, 0x68, 0x03, 0xf0, 0x06, 0x03, 0x04, 0x2b, 0x08, 0xbf, + 0xad, 0x1a, 0xa3, 0x68, 0x22, 0x69, 0x0c, 0xbf, 0x25, 0xea, + 0xe5, 0x75, 0x00, 0x25, 0x93, 0x42, 0xc4, 0xbf, 0x9b, 0x1a, + 0xed, 0x18, 0x00, 0x26, 0x1a, 0x34, 0xb5, 0x42, 0x1a, 0xd1, + 0x00, 0x20, 0x08, 0xe0, 0x01, 0x23, 0x5a, 0x46, 0x51, 0x46, + 0x38, 0x46, 0xc0, 0x47, 0x01, 0x30, 0x03, 0xd1, 0x4f, 0xf0, + 0xff, 0x30, 0xbd, 0xe8, 0xf0, 0x8d, 0x01, 0x35, 0xc6, 0xe7, + 0xe1, 0x18, 0x5a, 0x1c, 0x30, 0x20, 0x81, 0xf8, 0x43, 0x00, + 0x22, 0x44, 0x94, 0xf8, 0x45, 0x10, 0x82, 0xf8, 0x43, 0x10, + 0x02, 0x33, 0xc7, 0xe7, 0x01, 0x23, 0x22, 0x46, 0x51, 0x46, + 0x38, 0x46, 0xc0, 0x47, 0x01, 0x30, 0xe6, 0xd0, 0x01, 0x36, + 0xd9, 0xe7, 0xff, 0xff, 0x2d, 0xe9, 0xf0, 0x45, 0x9a, 0x46, + 0x0b, 0x7e, 0x85, 0xb0, 0x78, 0x2b, 0x07, 0x46, 0x0c, 0x9d, + 0x0c, 0x46, 0x90, 0x46, 0x01, 0xf1, 0x43, 0x00, 0x07, 0xd8, + 0x62, 0x2b, 0x08, 0xd8, 0x00, 0x2b, 0x00, 0xf0, 0xe0, 0x80, + 0x58, 0x2b, 0x00, 0xf0, 0xa9, 0x80, 0x04, 0xf1, 0x42, 0x05, + 0x3b, 0xe0, 0xa3, 0xf1, 0x63, 0x02, 0x15, 0x2a, 0xf8, 0xd8, + 0x02, 0xa1, 0x51, 0xf8, 0x22, 0x20, 0x11, 0x44, 0x08, 0x47, + 0x00, 0xbf, 0x59, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, + 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x6d, 0x00, 0x00, 0x00, + 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, + 0xa1, 0x00, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0xe7, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xa9, 0x01, 0x00, 0x00, + 0xe7, 0xff, 0xff, 0xff, 0xa1, 0x00, 0x00, 0x00, 0xe7, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x71, 0x01, 0x00, 0x00, + 0x2b, 0x68, 0x1a, 0x1d, 0x1b, 0x68, 0x2a, 0x60, 0x04, 0xf1, + 0x42, 0x05, 0x84, 0xf8, 0x42, 0x30, 0x01, 0x23, 0xaa, 0xe0, + 0x21, 0x68, 0x2a, 0x68, 0x0e, 0x06, 0x02, 0xf1, 0x04, 0x03, + 0x0c, 0xd5, 0x16, 0x68, 0x2b, 0x60, 0x64, 0x4b, 0x00, 0x2e, + 0x59, 0xf8, 0x03, 0x20, 0x03, 0xda, 0x2d, 0x23, 0x76, 0x42, + 0x84, 0xf8, 0x43, 0x30, 0x0a, 0x23, 0x1b, 0xe0, 0x16, 0x68, + 0x2b, 0x60, 0x11, 0xf0, 0x40, 0x0f, 0x18, 0xbf, 0x36, 0xb2, + 0xed, 0xe7, 0x2a, 0x68, 0x26, 0x68, 0x11, 0x1d, 0x29, 0x60, + 0x31, 0x06, 0x01, 0xd5, 0x16, 0x68, 0x02, 0xe0, 0x75, 0x06, + 0xfb, 0xd5, 0x16, 0x88, 0x56, 0x4a, 0x6f, 0x2b, 0x59, 0xf8, + 0x02, 0x20, 0x0c, 0xbf, 0x08, 0x23, 0x0a, 0x23, 0x00, 0x21, + 0x84, 0xf8, 0x43, 0x10, 0x65, 0x68, 0xa5, 0x60, 0x00, 0x2d, + 0xa2, 0xbf, 0x21, 0x68, 0x21, 0xf0, 0x04, 0x01, 0x21, 0x60, + 0x0e, 0xb9, 0x00, 0x2d, 0x50, 0xd0, 0x05, 0x46, 0xb6, 0xfb, + 0xf3, 0xf1, 0x03, 0xfb, 0x11, 0x6c, 0x12, 0xf8, 0x0c, 0xc0, + 0x05, 0xf8, 0x01, 0xcd, 0xb4, 0x46, 0x63, 0x45, 0x0e, 0x46, + 0xf3, 0xd9, 0x08, 0x2b, 0x0b, 0xd1, 0x23, 0x68, 0xde, 0x07, + 0x08, 0xd5, 0x23, 0x69, 0x62, 0x68, 0x9a, 0x42, 0xde, 0xbf, + 0x30, 0x23, 0x05, 0xf8, 0x01, 0x3c, 0x05, 0xf1, 0xff, 0x35, + 0x40, 0x1b, 0x20, 0x61, 0xcd, 0xf8, 0x00, 0xa0, 0x43, 0x46, + 0x03, 0xaa, 0x21, 0x46, 0x38, 0x46, 0xff, 0xf7, 0xdb, 0xfe, + 0x01, 0x30, 0x4e, 0xd1, 0x4f, 0xf0, 0xff, 0x30, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x85, 0x81, 0xf8, 0x45, 0x30, 0x34, 0x4b, + 0x29, 0x68, 0x59, 0xf8, 0x03, 0x20, 0x23, 0x68, 0x51, 0xf8, + 0x04, 0x6b, 0x29, 0x60, 0x19, 0x06, 0x14, 0xd5, 0xd9, 0x07, + 0x44, 0xbf, 0x43, 0xf0, 0x20, 0x03, 0x23, 0x60, 0x1e, 0xb9, + 0x23, 0x68, 0x23, 0xf0, 0x20, 0x03, 0x23, 0x60, 0x10, 0x23, + 0xad, 0xe7, 0x23, 0x68, 0x43, 0xf0, 0x20, 0x03, 0x23, 0x60, + 0x78, 0x23, 0x84, 0xf8, 0x45, 0x30, 0x27, 0x4b, 0xe1, 0xe7, + 0x5d, 0x06, 0x48, 0xbf, 0xb6, 0xb2, 0xe6, 0xe7, 0x05, 0x46, + 0xb9, 0xe7, 0x2b, 0x68, 0x26, 0x68, 0x62, 0x69, 0x19, 0x1d, + 0x29, 0x60, 0x35, 0x06, 0x1b, 0x68, 0x01, 0xd5, 0x1a, 0x60, + 0x02, 0xe0, 0x71, 0x06, 0xfb, 0xd5, 0x1a, 0x80, 0x00, 0x23, + 0x23, 0x61, 0x05, 0x46, 0xb8, 0xe7, 0x2b, 0x68, 0x1a, 0x1d, + 0x2a, 0x60, 0x1d, 0x68, 0x62, 0x68, 0x00, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0xa7, 0xfa, 0x08, 0xb1, 0x40, 0x1b, 0x60, 0x60, + 0x63, 0x68, 0x23, 0x61, 0x00, 0x23, 0x84, 0xf8, 0x43, 0x30, + 0xa6, 0xe7, 0x23, 0x69, 0x2a, 0x46, 0x41, 0x46, 0x38, 0x46, + 0xd0, 0x47, 0x01, 0x30, 0xa9, 0xd0, 0x23, 0x68, 0x9b, 0x07, + 0x13, 0xd4, 0xe0, 0x68, 0x03, 0x9b, 0x98, 0x42, 0xb8, 0xbf, + 0x18, 0x46, 0xa2, 0xe7, 0x01, 0x23, 0x32, 0x46, 0x41, 0x46, + 0x38, 0x46, 0xd0, 0x47, 0x01, 0x30, 0x99, 0xd0, 0x01, 0x35, + 0xe3, 0x68, 0x03, 0x9a, 0x9b, 0x1a, 0xab, 0x42, 0xf2, 0xdc, + 0xeb, 0xe7, 0x00, 0x25, 0x04, 0xf1, 0x19, 0x06, 0xf5, 0xe7, + 0x20, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x07, 0x4b, 0x59, 0xf8, 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, + 0x08, 0x46, 0x2b, 0x60, 0x00, 0xf0, 0x5e, 0xfb, 0x43, 0x1c, + 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, + 0x64, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x46, 0xb1, 0xf9, + 0x0e, 0x10, 0x00, 0xf0, 0xfe, 0xfa, 0x00, 0x28, 0xab, 0xbf, + 0x63, 0x6d, 0xa3, 0x89, 0x1b, 0x18, 0x23, 0xf4, 0x80, 0x53, + 0xac, 0xbf, 0x63, 0x65, 0xa3, 0x81, 0x10, 0xbd, 0x2d, 0xe9, + 0xf0, 0x41, 0x1f, 0x46, 0x8b, 0x89, 0xdb, 0x05, 0x05, 0x46, + 0x0c, 0x46, 0x16, 0x46, 0x05, 0xd5, 0xb1, 0xf9, 0x0e, 0x10, + 0x02, 0x23, 0x00, 0x22, 0x00, 0xf0, 0xca, 0xf9, 0xa3, 0x89, + 0xb4, 0xf9, 0x0e, 0x10, 0x23, 0xf4, 0x80, 0x53, 0xa3, 0x81, + 0x32, 0x46, 0x3b, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x41, + 0x00, 0xf0, 0x6f, 0xb8, 0x10, 0xb5, 0x0c, 0x46, 0xb1, 0xf9, + 0x0e, 0x10, 0x00, 0xf0, 0xb7, 0xf9, 0x43, 0x1c, 0xa3, 0x89, + 0x15, 0xbf, 0x60, 0x65, 0x23, 0xf4, 0x80, 0x53, 0x43, 0xf4, + 0x80, 0x53, 0xa3, 0x81, 0x18, 0xbf, 0xa3, 0x81, 0x10, 0xbd, + 0xb1, 0xf9, 0x0e, 0x10, 0x00, 0xf0, 0xe3, 0xb8, 0xff, 0xff, + 0xf8, 0xb5, 0x0f, 0x46, 0x14, 0x46, 0x05, 0x46, 0x18, 0xb1, + 0x83, 0x69, 0x0b, 0xb9, 0xff, 0xf7, 0x87, 0xfb, 0x24, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x2c, 0xd1, 0x6c, 0x68, + 0xa3, 0x69, 0xa3, 0x60, 0xa3, 0x89, 0x1a, 0x07, 0x34, 0xd5, + 0x23, 0x69, 0x00, 0x2b, 0x31, 0xd0, 0x23, 0x69, 0x20, 0x68, + 0xc0, 0x1a, 0x63, 0x69, 0xff, 0xb2, 0x83, 0x42, 0x3e, 0x46, + 0x04, 0xdc, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x53, 0xf9, + 0x50, 0xbb, 0xa3, 0x68, 0x01, 0x3b, 0xa3, 0x60, 0x23, 0x68, + 0x5a, 0x1c, 0x22, 0x60, 0x1f, 0x70, 0x63, 0x69, 0x01, 0x30, + 0x83, 0x42, 0x04, 0xd0, 0xa3, 0x89, 0xdb, 0x07, 0x06, 0xd5, + 0x0a, 0x2f, 0x04, 0xd1, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x3e, 0xf9, 0xa8, 0xb9, 0x30, 0x46, 0xf8, 0xbd, 0x0c, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, + 0xcc, 0xe7, 0x09, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x08, 0xbf, 0xec, 0x68, 0xc5, 0xe7, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x28, 0xc7, 0xd0, 0x4f, 0xf0, + 0xff, 0x36, 0xe6, 0xe7, 0x88, 0x00, 0x00, 0x00, 0x98, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x08, 0x46, 0x11, 0x46, 0x06, 0x4a, 0x59, 0xf8, 0x02, 0x50, + 0x00, 0x22, 0x2a, 0x60, 0x1a, 0x46, 0x00, 0xf0, 0x5b, 0xfc, + 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, + 0x38, 0xbd, 0x64, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x36, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x1d, 0x68, 0x06, 0x46, 0x0c, 0x46, + 0x25, 0xb1, 0xab, 0x69, 0x13, 0xb9, 0x28, 0x46, 0xff, 0xf7, + 0x17, 0xfb, 0x31, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x0f, 0xd1, 0x6c, 0x68, 0xa3, 0x89, 0xb4, 0xf9, 0x0c, 0x20, + 0x19, 0x07, 0x30, 0xd4, 0xdd, 0x06, 0x15, 0xd4, 0x09, 0x23, + 0x33, 0x60, 0x42, 0xf0, 0x40, 0x03, 0xa3, 0x81, 0x4f, 0xf0, + 0xff, 0x30, 0x42, 0xe0, 0x27, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, 0xe9, 0xe7, 0x25, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x08, 0xbf, 0xec, 0x68, + 0xe2, 0xe7, 0x58, 0x07, 0x12, 0xd5, 0x61, 0x6b, 0x41, 0xb1, + 0x04, 0xf1, 0x44, 0x03, 0x99, 0x42, 0x02, 0xd0, 0x30, 0x46, + 0x00, 0xf0, 0xcd, 0xf9, 0x00, 0x23, 0x63, 0x63, 0xa3, 0x89, + 0x23, 0xf0, 0x24, 0x03, 0xa3, 0x81, 0x00, 0x23, 0x63, 0x60, + 0x23, 0x69, 0x23, 0x60, 0xa3, 0x89, 0x43, 0xf0, 0x08, 0x03, + 0xa3, 0x81, 0x23, 0x69, 0x4b, 0xb9, 0xa3, 0x89, 0x03, 0xf4, + 0x20, 0x73, 0xb3, 0xf5, 0x00, 0x7f, 0x03, 0xd0, 0x21, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x1f, 0xf9, 0xa0, 0x89, 0xb4, 0xf9, + 0x0c, 0x20, 0x10, 0xf0, 0x01, 0x03, 0x0a, 0xd0, 0x00, 0x23, + 0xa3, 0x60, 0x63, 0x69, 0x5b, 0x42, 0xa3, 0x61, 0x23, 0x69, + 0x43, 0xb9, 0x10, 0xf0, 0x80, 0x00, 0xb6, 0xd1, 0x70, 0xbd, + 0x81, 0x07, 0x58, 0xbf, 0x63, 0x69, 0xa3, 0x60, 0xf4, 0xe7, + 0x00, 0x20, 0xf7, 0xe7, 0x00, 0xbf, 0x90, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x07, 0x4b, 0x59, 0xf8, 0x03, 0x50, + 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, 0x2b, 0x60, 0x00, 0xf0, + 0x12, 0xfa, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, + 0x23, 0x60, 0x38, 0xbd, 0x64, 0x00, 0x00, 0x00, 0x8a, 0x89, + 0xf8, 0xb5, 0x05, 0x46, 0x10, 0x07, 0x0c, 0x46, 0x57, 0xd4, + 0x4b, 0x68, 0x00, 0x2b, 0x04, 0xdc, 0x0b, 0x6c, 0x00, 0x2b, + 0x01, 0xdc, 0x00, 0x20, 0xf8, 0xbd, 0xe6, 0x6a, 0x00, 0x2e, + 0xfa, 0xd0, 0x00, 0x23, 0x12, 0xf4, 0x80, 0x52, 0x2f, 0x68, + 0x2b, 0x60, 0x32, 0xd0, 0x60, 0x6d, 0xa3, 0x89, 0x5a, 0x07, + 0x05, 0xd5, 0x63, 0x68, 0xc0, 0x1a, 0x63, 0x6b, 0x0b, 0xb1, + 0x23, 0x6c, 0xc0, 0x1a, 0x00, 0x23, 0x02, 0x46, 0xe6, 0x6a, + 0x21, 0x6a, 0x28, 0x46, 0xb0, 0x47, 0x43, 0x1c, 0xa3, 0x89, + 0x06, 0xd1, 0x29, 0x68, 0x1d, 0x29, 0x2c, 0xd8, 0x29, 0x4a, + 0xca, 0x40, 0xd6, 0x07, 0x28, 0xd5, 0x00, 0x22, 0x62, 0x60, + 0xd9, 0x04, 0x22, 0x69, 0x22, 0x60, 0x04, 0xd5, 0x42, 0x1c, + 0x01, 0xd1, 0x2b, 0x68, 0x03, 0xb9, 0x60, 0x65, 0x61, 0x6b, + 0x2f, 0x60, 0x00, 0x29, 0xcb, 0xd0, 0x04, 0xf1, 0x44, 0x03, + 0x99, 0x42, 0x02, 0xd0, 0x28, 0x46, 0x00, 0xf0, 0x39, 0xf9, + 0x00, 0x20, 0x60, 0x63, 0xc2, 0xe7, 0x21, 0x6a, 0x01, 0x23, + 0x28, 0x46, 0xb0, 0x47, 0x41, 0x1c, 0xc7, 0xd1, 0x2b, 0x68, + 0x00, 0x2b, 0xc4, 0xd0, 0x1d, 0x2b, 0x01, 0xd0, 0x16, 0x2b, + 0x01, 0xd1, 0x2f, 0x60, 0xb2, 0xe7, 0xa3, 0x89, 0x43, 0xf0, + 0x40, 0x03, 0xa3, 0x81, 0xae, 0xe7, 0x0f, 0x69, 0x00, 0x2f, + 0xaa, 0xd0, 0x93, 0x07, 0x0e, 0x68, 0x08, 0xbf, 0x4b, 0x69, + 0x0f, 0x60, 0x18, 0xbf, 0x00, 0x23, 0xf6, 0x1b, 0x8b, 0x60, + 0x00, 0x2e, 0x9f, 0xdd, 0x21, 0x6a, 0xd4, 0xf8, 0x28, 0xc0, + 0x33, 0x46, 0x3a, 0x46, 0x28, 0x46, 0xe0, 0x47, 0x00, 0x28, + 0x06, 0xdc, 0xa3, 0x89, 0x43, 0xf0, 0x40, 0x03, 0xa3, 0x81, + 0x4f, 0xf0, 0xff, 0x30, 0x90, 0xe7, 0x07, 0x44, 0x36, 0x1a, + 0xea, 0xe7, 0x00, 0xbf, 0x01, 0x00, 0x40, 0x20, 0x38, 0xb5, + 0x0b, 0x69, 0x05, 0x46, 0x0c, 0x46, 0x0b, 0xb3, 0x18, 0xb1, + 0x83, 0x69, 0x0b, 0xb9, 0xff, 0xf7, 0x10, 0xfa, 0x0f, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x09, 0xd1, 0x6c, 0x68, + 0xb4, 0xf9, 0x0c, 0x30, 0x9b, 0xb1, 0x21, 0x46, 0x28, 0x46, + 0xbd, 0xe8, 0x38, 0x40, 0xff, 0xf7, 0x65, 0xbf, 0x09, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, 0x01, 0xd1, 0xac, 0x68, + 0xef, 0xe7, 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9c, 0x42, + 0x08, 0xbf, 0xec, 0x68, 0xe8, 0xe7, 0x00, 0x20, 0x38, 0xbd, + 0x00, 0xbf, 0x88, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x11, 0x46, 0x06, 0x4a, 0x59, 0xf8, 0x02, 0x50, 0x00, 0x22, + 0x2a, 0x60, 0x1a, 0x46, 0x00, 0xf0, 0x54, 0xf9, 0x43, 0x1c, + 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, + 0x64, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x0e, 0x46, 0xb1, 0xf9, + 0x0e, 0x10, 0x00, 0x29, 0x96, 0xb0, 0x14, 0x46, 0x1d, 0x46, + 0x08, 0xda, 0xb6, 0xf9, 0x0c, 0x30, 0x00, 0x22, 0x2a, 0x60, + 0x1a, 0x06, 0x10, 0xd4, 0x4f, 0xf4, 0x80, 0x63, 0x0e, 0xe0, + 0x6a, 0x46, 0x00, 0xf0, 0x05, 0xf9, 0x00, 0x28, 0xf1, 0xdb, + 0x01, 0x9a, 0x02, 0xf4, 0x70, 0x42, 0xa2, 0xf5, 0x00, 0x53, + 0x5a, 0x42, 0x5a, 0x41, 0x2a, 0x60, 0xee, 0xe7, 0x40, 0x23, + 0x00, 0x20, 0x23, 0x60, 0x16, 0xb0, 0x70, 0xbd, 0xff, 0xff, + 0x8b, 0x89, 0x73, 0xb5, 0x9d, 0x07, 0x06, 0x46, 0x0c, 0x46, + 0x07, 0xd5, 0x04, 0xf1, 0x47, 0x03, 0x23, 0x60, 0x23, 0x61, + 0x01, 0x23, 0x63, 0x61, 0x02, 0xb0, 0x70, 0xbd, 0x01, 0xab, + 0x6a, 0x46, 0xff, 0xf7, 0xc8, 0xff, 0x00, 0x99, 0x05, 0x46, + 0x30, 0x46, 0xff, 0xf7, 0x5b, 0xfa, 0x48, 0xb9, 0xb4, 0xf9, + 0x0c, 0x30, 0x9a, 0x05, 0xef, 0xd4, 0x23, 0xf0, 0x03, 0x03, + 0x43, 0xf0, 0x02, 0x03, 0xa3, 0x81, 0xe3, 0xe7, 0x0e, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0xb3, 0x62, 0xa3, 0x89, 0x20, 0x60, + 0x43, 0xf0, 0x80, 0x03, 0xa3, 0x81, 0x00, 0x9b, 0x63, 0x61, + 0x01, 0x9b, 0x20, 0x61, 0x5b, 0xb1, 0xb4, 0xf9, 0x0e, 0x10, + 0x30, 0x46, 0x00, 0xf0, 0xd3, 0xf8, 0x28, 0xb1, 0xa3, 0x89, + 0x23, 0xf0, 0x03, 0x03, 0x43, 0xf0, 0x01, 0x03, 0xa3, 0x81, + 0xa0, 0x89, 0x05, 0x43, 0xa5, 0x81, 0xcb, 0xe7, 0x68, 0x00, + 0x00, 0x00, 0x01, 0xf0, 0xff, 0x01, 0x10, 0x2a, 0x2b, 0xdb, + 0x10, 0xf0, 0x07, 0x0f, 0x08, 0xd0, 0x10, 0xf8, 0x01, 0x3b, + 0x01, 0x3a, 0x8b, 0x42, 0x2d, 0xd0, 0x10, 0xf0, 0x07, 0x0f, + 0x42, 0xb3, 0xf6, 0xd1, 0xf0, 0xb4, 0x41, 0xea, 0x01, 0x21, + 0x41, 0xea, 0x01, 0x41, 0x22, 0xf0, 0x07, 0x04, 0x7f, 0xf0, + 0x00, 0x07, 0x00, 0x23, 0xf0, 0xe8, 0x02, 0x56, 0x08, 0x3c, + 0x85, 0xea, 0x01, 0x05, 0x86, 0xea, 0x01, 0x06, 0x85, 0xfa, + 0x47, 0xf5, 0xa3, 0xfa, 0x87, 0xf5, 0x86, 0xfa, 0x47, 0xf6, + 0xa5, 0xfa, 0x87, 0xf6, 0x8e, 0xb9, 0xee, 0xd1, 0xf0, 0xbc, + 0x01, 0xf0, 0xff, 0x01, 0x02, 0xf0, 0x07, 0x02, 0x32, 0xb1, + 0x10, 0xf8, 0x01, 0x3b, 0x01, 0x3a, 0x83, 0xea, 0x01, 0x03, + 0x13, 0xb1, 0xf8, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x01, 0x38, + 0x70, 0x47, 0x00, 0x2d, 0x06, 0xbf, 0x35, 0x46, 0x03, 0x38, + 0x07, 0x38, 0x15, 0xf0, 0x01, 0x0f, 0x07, 0xd1, 0x01, 0x30, + 0x15, 0xf4, 0x80, 0x7f, 0x02, 0xbf, 0x01, 0x30, 0x15, 0xf4, + 0xc0, 0x3f, 0x01, 0x30, 0xf0, 0xbc, 0x01, 0x38, 0x70, 0x47, + 0x00, 0xbf, 0x70, 0x47, 0x70, 0x47, 0x38, 0xb5, 0x05, 0x46, + 0x00, 0x29, 0x43, 0xd0, 0x51, 0xf8, 0x04, 0x3c, 0x0c, 0x1f, + 0x00, 0x2b, 0xb8, 0xbf, 0xe4, 0x18, 0xff, 0xf7, 0xf2, 0xff, + 0x1e, 0x4b, 0x59, 0xf8, 0x03, 0x20, 0x13, 0x68, 0x33, 0xb9, + 0x63, 0x60, 0x14, 0x60, 0x28, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0xff, 0xf7, 0xe7, 0xbf, 0xa3, 0x42, 0x08, 0xd9, 0x20, 0x68, + 0x21, 0x18, 0x8b, 0x42, 0x01, 0xbf, 0x19, 0x68, 0x5b, 0x68, + 0x09, 0x18, 0x21, 0x60, 0xed, 0xe7, 0x1a, 0x46, 0x5b, 0x68, + 0x0b, 0xb1, 0xa3, 0x42, 0xfa, 0xd9, 0x11, 0x68, 0x50, 0x18, + 0xa0, 0x42, 0x0b, 0xd1, 0x20, 0x68, 0x01, 0x44, 0x50, 0x18, + 0x83, 0x42, 0x11, 0x60, 0xe0, 0xd1, 0x18, 0x68, 0x5b, 0x68, + 0x53, 0x60, 0x01, 0x44, 0x11, 0x60, 0xda, 0xe7, 0x02, 0xd9, + 0x0c, 0x23, 0x2b, 0x60, 0xd6, 0xe7, 0x20, 0x68, 0x21, 0x18, + 0x8b, 0x42, 0x04, 0xbf, 0x19, 0x68, 0x5b, 0x68, 0x63, 0x60, + 0x04, 0xbf, 0x09, 0x18, 0x21, 0x60, 0x54, 0x60, 0xca, 0xe7, + 0x38, 0xbd, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x06, 0x4a, 0x59, 0xf8, + 0x02, 0x50, 0x00, 0x22, 0x2a, 0x60, 0x1a, 0x46, 0x00, 0xf0, + 0x3c, 0xf8, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, + 0x23, 0x60, 0x38, 0xbd, 0x64, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x08, 0x4b, 0x59, 0xf8, 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, + 0x08, 0x46, 0x11, 0x46, 0x2b, 0x60, 0x00, 0xf0, 0x22, 0xf8, + 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, + 0x38, 0xbd, 0x00, 0xbf, 0x64, 0x00, 0x00, 0x00, 0x38, 0xb5, + 0x07, 0x4b, 0x59, 0xf8, 0x03, 0x50, 0x04, 0x46, 0x00, 0x23, + 0x08, 0x46, 0x2b, 0x60, 0x00, 0xf0, 0x08, 0xf8, 0x43, 0x1c, + 0x02, 0xd1, 0x2b, 0x68, 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, + 0x64, 0x00, 0x00, 0x00, 0xb0, 0xfa, 0x80, 0xf0, 0x40, 0x09, + 0x70, 0x47, 0x4f, 0xf0, 0xff, 0x30, 0x70, 0x47, 0x4f, 0xf4, + 0x00, 0x53, 0x4b, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x08, 0xb5, 0xfe, 0xf7, + 0x83, 0xff, 0x00, 0x20, 0x70, 0x47, 0x4f, 0xf0, 0xff, 0x30, + 0x70, 0x47, 0x07, 0xb5, 0x02, 0x46, 0x01, 0x21, 0x68, 0x46, + 0xfe, 0xf7, 0xc0, 0xff, 0x9d, 0xf8, 0x00, 0x30, 0x43, 0xb1, + 0x00, 0xf0, 0xf7, 0xf9, 0x0c, 0x23, 0x03, 0x60, 0x4f, 0xf0, + 0xff, 0x30, 0x03, 0xb0, 0x5d, 0xf8, 0x04, 0xfb, 0x01, 0x98, + 0xfa, 0xe7, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x20, 0x10, 0x68, + 0x28, 0xb1, 0x03, 0x69, 0x13, 0x60, 0x00, 0x22, 0x03, 0xb1, + 0x5a, 0x61, 0x02, 0x61, 0x70, 0x47, 0x3c, 0x00, 0x00, 0x00, + 0xf7, 0xb5, 0x01, 0xa8, 0x0e, 0x46, 0x00, 0xf0, 0x62, 0xf9, + 0xff, 0xf7, 0xeb, 0xff, 0x04, 0x46, 0x20, 0xb1, 0x03, 0x68, + 0x42, 0x68, 0xf3, 0x1a, 0x9a, 0x42, 0x0b, 0xd9, 0x1d, 0x49, + 0x1e, 0x4b, 0x1e, 0x4a, 0x59, 0xf8, 0x01, 0x00, 0x59, 0xf8, + 0x03, 0x30, 0x59, 0xf8, 0x02, 0x20, 0xf0, 0x21, 0x00, 0xf0, + 0xa0, 0xf9, 0x00, 0x21, 0xc0, 0xe9, 0x04, 0x11, 0x19, 0x4b, + 0x59, 0xf8, 0x03, 0x70, 0x3d, 0x68, 0xb5, 0xb9, 0x00, 0x25, + 0x23, 0x46, 0x65, 0x61, 0x9e, 0x68, 0x24, 0x69, 0x1d, 0x61, + 0x2e, 0xb1, 0xd3, 0xe9, 0x00, 0x01, 0xda, 0x68, 0x01, 0x44, + 0x01, 0x98, 0xb0, 0x47, 0x00, 0x2c, 0xf1, 0xd1, 0x3b, 0x68, + 0x1b, 0xb1, 0xd3, 0xe9, 0x00, 0x01, 0x00, 0xf0, 0x42, 0xf9, + 0x03, 0xb0, 0xf0, 0xbd, 0x2b, 0x68, 0x01, 0x9a, 0xd2, 0x1a, + 0xf3, 0x1a, 0x9a, 0x42, 0x04, 0xd3, 0x68, 0x68, 0x83, 0x42, + 0x01, 0xd2, 0x82, 0x42, 0xdd, 0xd3, 0xff, 0xf7, 0xac, 0xff, + 0xc5, 0xe9, 0x04, 0x14, 0x25, 0x61, 0xd5, 0xe7, 0x2c, 0x00, + 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x73, 0xb5, 0x04, 0x46, 0x01, 0xa8, + 0x00, 0xf0, 0xfe, 0xf8, 0x01, 0x9d, 0x4f, 0xf4, 0x7a, 0x70, + 0xb4, 0xfb, 0xf0, 0xf6, 0x00, 0xfb, 0x16, 0x40, 0x4f, 0xf4, + 0x7a, 0x72, 0x00, 0x23, 0xa0, 0xfb, 0x05, 0x01, 0x00, 0xf0, + 0xe7, 0xf9, 0xe6, 0xfb, 0x05, 0x01, 0x59, 0xb1, 0x06, 0x49, + 0x07, 0x4b, 0x07, 0x4a, 0x59, 0xf8, 0x01, 0x00, 0x59, 0xf8, + 0x03, 0x30, 0x59, 0xf8, 0x02, 0x20, 0x3f, 0x21, 0x00, 0xf0, + 0x46, 0xf9, 0x02, 0xb0, 0x70, 0xbd, 0x2c, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x37, 0xb5, + 0x04, 0x46, 0x01, 0xa8, 0x00, 0xf0, 0xd4, 0xf8, 0x01, 0x9a, + 0xb4, 0xfb, 0xf2, 0xf5, 0x02, 0xfb, 0x15, 0x40, 0x4f, 0xf4, + 0x7a, 0x74, 0x00, 0x23, 0xa0, 0xfb, 0x04, 0x01, 0x00, 0xf0, + 0xbf, 0xf9, 0x05, 0xfb, 0x04, 0x00, 0x03, 0xb0, 0x30, 0xbd, + 0xff, 0xff, 0x2d, 0xe9, 0xf8, 0x45, 0x08, 0x9c, 0xc4, 0xe9, + 0x02, 0x23, 0x00, 0x22, 0xc4, 0xe9, 0x00, 0x01, 0xc4, 0xe9, + 0x04, 0x22, 0x22, 0x4b, 0x59, 0xf8, 0x03, 0x60, 0x33, 0x68, + 0x63, 0xb9, 0x34, 0x60, 0x20, 0x4b, 0x00, 0x21, 0x59, 0xf8, + 0x03, 0x00, 0x00, 0xf0, 0x9c, 0xf8, 0xd4, 0xe9, 0x00, 0x01, + 0xbd, 0xe8, 0xf8, 0x45, 0x00, 0xf0, 0xcb, 0xb8, 0x47, 0x18, + 0xc9, 0x43, 0x88, 0x42, 0x94, 0xbf, 0x00, 0x21, 0x01, 0x21, + 0x94, 0x46, 0xb6, 0x46, 0xd3, 0xe9, 0x00, 0x52, 0x05, 0xeb, + 0x02, 0x08, 0xd2, 0x43, 0x95, 0x42, 0x94, 0xbf, 0x4f, 0xf0, + 0x00, 0x0a, 0x4f, 0xf0, 0x01, 0x0a, 0x8a, 0x45, 0x0e, 0xd1, + 0x47, 0x45, 0x0c, 0xd2, 0xce, 0xf8, 0x00, 0x40, 0xc4, 0xe9, + 0x04, 0x3c, 0x5c, 0x61, 0x33, 0x68, 0x9c, 0x42, 0xd4, 0xd0, + 0x00, 0x20, 0xbd, 0xe8, 0xf8, 0x85, 0x13, 0x46, 0xe3, 0xe7, + 0x95, 0x42, 0x03, 0xd9, 0xa8, 0x42, 0xee, 0xd8, 0x47, 0x45, + 0xec, 0xd3, 0x1a, 0x69, 0x03, 0xf1, 0x10, 0x0e, 0x9c, 0x46, + 0x00, 0x2a, 0xf1, 0xd1, 0x1c, 0x61, 0xc4, 0xe9, 0x04, 0x23, + 0xe7, 0xe7, 0x3c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x53, 0x68, 0x73, 0xb5, 0x0d, 0x46, 0x14, 0x46, 0x02, 0xf1, + 0x14, 0x06, 0x43, 0xb9, 0x00, 0x96, 0xd2, 0xe9, 0x03, 0x23, + 0xa1, 0x68, 0x28, 0x46, 0xff, 0xf7, 0x9e, 0xff, 0x02, 0xb0, + 0x70, 0xbd, 0x01, 0x3b, 0x53, 0x60, 0x4f, 0xf0, 0xff, 0x30, + 0xff, 0xf7, 0x80, 0xff, 0xff, 0xf7, 0x54, 0xff, 0x03, 0x4b, + 0x01, 0x46, 0x59, 0xf8, 0x03, 0x20, 0x00, 0x96, 0x23, 0x46, + 0xeb, 0xe7, 0x00, 0xbf, 0x38, 0x00, 0x00, 0x00, 0x2d, 0xe9, + 0xff, 0x4d, 0x05, 0x46, 0x03, 0xa8, 0x0f, 0x46, 0x90, 0x46, + 0x1c, 0x46, 0x00, 0xf0, 0x56, 0xf8, 0x00, 0xbb, 0x4f, 0xf0, + 0xff, 0x30, 0xff, 0xf7, 0x66, 0xff, 0x06, 0x46, 0xff, 0xf7, + 0x39, 0xff, 0xae, 0x42, 0x82, 0x46, 0x04, 0xf1, 0x14, 0x0b, + 0x17, 0xd2, 0xb5, 0xfb, 0xf6, 0xf0, 0x43, 0x1e, 0x63, 0x60, + 0x06, 0xfb, 0x10, 0x50, 0xff, 0xf7, 0x2c, 0xff, 0xc4, 0xe9, + 0x03, 0x78, 0x0c, 0x4b, 0xa0, 0x60, 0x03, 0x98, 0x59, 0xf8, + 0x03, 0x20, 0xcd, 0xf8, 0x00, 0xb0, 0x23, 0x46, 0x51, 0x46, + 0xff, 0xf7, 0x5f, 0xff, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, + 0x28, 0x46, 0x03, 0x9c, 0xff, 0xf7, 0x18, 0xff, 0xcd, 0xf8, + 0x00, 0xb0, 0x01, 0x46, 0x43, 0x46, 0x3a, 0x46, 0x20, 0x46, + 0xef, 0xe7, 0x00, 0xbf, 0x38, 0x00, 0x00, 0x00, 0x10, 0xb5, + 0x86, 0xb0, 0x00, 0x22, 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, + 0x20, 0x46, 0x11, 0x46, 0xfe, 0xf7, 0x11, 0xfe, 0x94, 0xe8, + 0x0f, 0x00, 0x06, 0xb0, 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, + 0xad, 0xbd, 0x30, 0xb5, 0x87, 0xb0, 0x00, 0x23, 0x02, 0xac, + 0x05, 0x46, 0x00, 0x93, 0x20, 0x46, 0x01, 0x22, 0x19, 0x46, + 0xfe, 0xf7, 0x1b, 0xfe, 0x00, 0x95, 0x94, 0xe8, 0x0f, 0x00, + 0xfe, 0xf7, 0x85, 0xfd, 0x07, 0xb0, 0x30, 0xbd, 0x30, 0xb5, + 0x87, 0xb0, 0x00, 0x23, 0x02, 0xac, 0x05, 0x46, 0x00, 0x93, + 0x20, 0x46, 0x02, 0x22, 0x19, 0x46, 0xfe, 0xf7, 0x09, 0xfe, + 0x00, 0x95, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, 0x73, 0xfd, + 0x07, 0xb0, 0x30, 0xbd, 0x10, 0xb5, 0x88, 0xb0, 0x04, 0xac, + 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, 0x06, 0x22, 0x00, 0x21, + 0xfe, 0xf7, 0xf8, 0xfd, 0x03, 0xab, 0x00, 0x93, 0x94, 0xe8, + 0x0f, 0x00, 0xfe, 0xf7, 0x61, 0xfd, 0x08, 0xb0, 0x10, 0xbd, + 0x07, 0xb5, 0x08, 0x46, 0x11, 0x46, 0x01, 0xaa, 0x00, 0xf0, + 0x0f, 0xf8, 0x01, 0x98, 0x03, 0xb0, 0x5d, 0xf8, 0x04, 0xfb, + 0xff, 0xff, 0x03, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x01, 0x22, + 0x59, 0x60, 0x1a, 0x70, 0x18, 0x81, 0x70, 0x47, 0x4c, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x4b, 0x59, 0xf8, 0x03, 0x40, + 0x00, 0x23, 0x23, 0x70, 0x08, 0x4b, 0x15, 0x46, 0x59, 0xf8, + 0x03, 0x20, 0x00, 0xf0, 0xfe, 0xf9, 0x38, 0xb9, 0x20, 0x46, + 0xfe, 0xf7, 0xa4, 0xfd, 0xb4, 0xf9, 0x08, 0x00, 0x08, 0xb9, + 0x63, 0x68, 0x2b, 0x60, 0x38, 0xbd, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x1f, 0xb5, 0x14, 0x46, 0x1a, 0x46, + 0x0d, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x1b, 0x68, 0x05, 0x46, + 0x0e, 0x46, 0xd8, 0x68, 0x6c, 0xb1, 0x0a, 0x4b, 0x59, 0xf8, + 0x03, 0x30, 0x09, 0x49, 0x59, 0xf8, 0x01, 0x10, 0x00, 0x96, + 0xcd, 0xe9, 0x01, 0x34, 0x2b, 0x46, 0x00, 0xf0, 0x17, 0xf8, + 0x00, 0xf0, 0x29, 0xf8, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x1c, 0x46, 0xef, 0xe7, 0x90, 0x00, 0x00, 0x00, 0x54, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x18, 0x68, 0x70, 0x47, + 0x00, 0xbf, 0x90, 0x00, 0x00, 0x00, 0x0e, 0xb4, 0x17, 0xb5, + 0x05, 0xab, 0x01, 0x46, 0x53, 0xf8, 0x04, 0x2b, 0x05, 0x48, + 0x01, 0x93, 0x59, 0xf8, 0x00, 0x40, 0x20, 0x68, 0xfe, 0xf7, + 0xc7, 0xff, 0x03, 0xb0, 0xbd, 0xe8, 0x10, 0x40, 0x03, 0xb0, + 0x70, 0x47, 0x90, 0x00, 0x00, 0x00, 0x08, 0xb5, 0x06, 0x20, + 0x00, 0xf0, 0x2c, 0xf8, 0x01, 0x20, 0xff, 0xf7, 0xd3, 0xfd, + 0x1f, 0x29, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x04, 0xd9, + 0x16, 0x23, 0x03, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0x38, 0xbd, + 0x42, 0x6c, 0x12, 0xb1, 0x52, 0xf8, 0x21, 0x30, 0x4b, 0xb9, + 0x20, 0x46, 0x00, 0xf0, 0x35, 0xf8, 0x2a, 0x46, 0x01, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x00, 0xf0, 0x1a, 0xb8, + 0x01, 0x2b, 0x0a, 0xd0, 0x59, 0x1c, 0x03, 0xd1, 0x16, 0x23, + 0x03, 0x60, 0x01, 0x20, 0xe7, 0xe7, 0x00, 0x24, 0x42, 0xf8, + 0x25, 0x40, 0x28, 0x46, 0x98, 0x47, 0x00, 0x20, 0xe0, 0xe7, + 0xff, 0xff, 0x03, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x01, 0x46, + 0x18, 0x68, 0xff, 0xf7, 0xd0, 0xbf, 0x00, 0xbf, 0x90, 0x00, + 0x00, 0x00, 0x38, 0xb5, 0x08, 0x4b, 0x59, 0xf8, 0x03, 0x50, + 0x04, 0x46, 0x00, 0x23, 0x08, 0x46, 0x11, 0x46, 0x2b, 0x60, + 0xff, 0xf7, 0x9a, 0xfd, 0x43, 0x1c, 0x02, 0xd1, 0x2b, 0x68, + 0x03, 0xb1, 0x23, 0x60, 0x38, 0xbd, 0x00, 0xbf, 0x64, 0x00, + 0x00, 0x00, 0xff, 0xf7, 0x8d, 0xbd, 0x53, 0xb9, 0x4a, 0xb9, + 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x1c, 0xbf, 0x4f, 0xf0, + 0xff, 0x31, 0x4f, 0xf0, 0xff, 0x30, 0x00, 0xf0, 0x4e, 0xb9, + 0xad, 0xf1, 0x08, 0x0c, 0x6d, 0xe9, 0x04, 0xce, 0x00, 0xf0, + 0x06, 0xf8, 0xdd, 0xf8, 0x04, 0xe0, 0xdd, 0xe9, 0x02, 0x23, + 0x04, 0xb0, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x4d, 0x07, 0x46, + 0x9e, 0x46, 0x08, 0x46, 0x0b, 0x46, 0x08, 0x9e, 0x15, 0x46, + 0x3c, 0x46, 0x71, 0x46, 0xbe, 0xf1, 0x00, 0x0f, 0x40, 0xf0, + 0xb2, 0x80, 0x82, 0x42, 0xb2, 0xfa, 0x82, 0xf7, 0x43, 0xd9, + 0x47, 0xb1, 0xc7, 0xf1, 0x20, 0x0c, 0x24, 0xfa, 0x0c, 0xfc, + 0xbb, 0x40, 0xbd, 0x40, 0x4c, 0xea, 0x03, 0x03, 0xbc, 0x40, + 0x4f, 0xea, 0x15, 0x4e, 0x1f, 0xfa, 0x85, 0xf8, 0xb3, 0xfb, + 0xfe, 0xfc, 0x22, 0x0c, 0x0e, 0xfb, 0x1c, 0x33, 0x0c, 0xfb, + 0x08, 0xfa, 0x42, 0xea, 0x03, 0x43, 0x9a, 0x45, 0x28, 0xd9, + 0xeb, 0x18, 0x0c, 0xf1, 0xff, 0x30, 0x04, 0xd2, 0x9a, 0x45, + 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x00, 0x2b, 0x44, 0xa3, 0xeb, + 0x0a, 0x03, 0xb3, 0xfb, 0xfe, 0xfc, 0x0c, 0xfb, 0x08, 0xf2, + 0x0e, 0xfb, 0x1c, 0x33, 0xa4, 0xb2, 0x44, 0xea, 0x03, 0x44, + 0xa2, 0x42, 0x7c, 0xd9, 0x2c, 0x19, 0x0c, 0xf1, 0xff, 0x3b, + 0x04, 0xd2, 0xa2, 0x42, 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x0b, + 0x2c, 0x44, 0xa4, 0x1a, 0x4b, 0xea, 0x00, 0x40, 0x1e, 0xb1, + 0xfc, 0x40, 0x00, 0x23, 0x34, 0x60, 0x73, 0x60, 0xbd, 0xe8, + 0xf0, 0x8d, 0x60, 0x46, 0xdd, 0xe7, 0x02, 0xb9, 0xff, 0xde, + 0xff, 0xb9, 0x83, 0x1a, 0x01, 0x21, 0x4f, 0xea, 0x15, 0x4e, + 0xaa, 0xb2, 0xb3, 0xfb, 0xfe, 0xfc, 0x20, 0x0c, 0x0e, 0xfb, + 0x1c, 0x33, 0x0c, 0xfb, 0x02, 0xf8, 0x40, 0xea, 0x03, 0x43, + 0x98, 0x45, 0x52, 0xd9, 0xeb, 0x18, 0x0c, 0xf1, 0xff, 0x30, + 0x04, 0xd2, 0x98, 0x45, 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x00, + 0x2b, 0x44, 0xa3, 0xeb, 0x08, 0x03, 0xb3, 0xfb, 0xfe, 0xfc, + 0x0c, 0xfb, 0x02, 0xf2, 0xc0, 0xe7, 0xc7, 0xf1, 0x20, 0x0c, + 0x20, 0xfa, 0x0c, 0xfa, 0x00, 0xfa, 0x07, 0xf3, 0x24, 0xfa, + 0x0c, 0xfc, 0xbd, 0x40, 0x4c, 0xea, 0x03, 0x02, 0x4f, 0xea, + 0x15, 0x48, 0xab, 0xb2, 0xba, 0xfb, 0xf8, 0xfc, 0x11, 0x0c, + 0x08, 0xfb, 0x1c, 0xa0, 0x0c, 0xfb, 0x03, 0xfe, 0x41, 0xea, + 0x00, 0x40, 0x86, 0x45, 0x04, 0xfa, 0x07, 0xf4, 0x23, 0xd9, + 0x28, 0x18, 0x0c, 0xf1, 0xff, 0x31, 0x04, 0xd2, 0x86, 0x45, + 0x02, 0xd9, 0xac, 0xf1, 0x02, 0x01, 0x28, 0x44, 0xa0, 0xeb, + 0x0e, 0x00, 0x92, 0xb2, 0xb0, 0xfb, 0xf8, 0xfe, 0x08, 0xfb, + 0x1e, 0x00, 0x0e, 0xfb, 0x03, 0xfc, 0x42, 0xea, 0x00, 0x43, + 0x9c, 0x45, 0x0f, 0xd9, 0xeb, 0x18, 0x0e, 0xf1, 0xff, 0x32, + 0x04, 0xd2, 0x9c, 0x45, 0x02, 0xd9, 0xae, 0xf1, 0x02, 0x02, + 0x2b, 0x44, 0xa3, 0xeb, 0x0c, 0x03, 0x42, 0xea, 0x01, 0x41, + 0xa2, 0xe7, 0x61, 0x46, 0xe2, 0xe7, 0x72, 0x46, 0xf6, 0xe7, + 0x60, 0x46, 0xb3, 0xe7, 0xe3, 0x46, 0x89, 0xe7, 0x86, 0x45, + 0x05, 0xd9, 0x0e, 0xb1, 0xc6, 0xe9, 0x00, 0x70, 0x00, 0x21, + 0x08, 0x46, 0x89, 0xe7, 0xbe, 0xfa, 0x8e, 0xf1, 0x79, 0xb9, + 0x86, 0x45, 0x01, 0xd3, 0xba, 0x42, 0x09, 0xd8, 0xbc, 0x1a, + 0x60, 0xeb, 0x0e, 0x03, 0x01, 0x20, 0x00, 0x2e, 0x6a, 0xd0, + 0xc6, 0xe9, 0x00, 0x43, 0x00, 0x21, 0x78, 0xe7, 0x08, 0x46, + 0xf7, 0xe7, 0xc1, 0xf1, 0x20, 0x0c, 0x0e, 0xfa, 0x01, 0xfe, + 0x22, 0xfa, 0x0c, 0xf4, 0x44, 0xea, 0x0e, 0x04, 0x00, 0xfa, + 0x01, 0xf3, 0x02, 0xfa, 0x01, 0xf5, 0x27, 0xfa, 0x0c, 0xf2, + 0x20, 0xfa, 0x0c, 0xfb, 0x4f, 0xea, 0x14, 0x4a, 0x13, 0x43, + 0xbb, 0xfb, 0xfa, 0xf8, 0x1f, 0xfa, 0x84, 0xfe, 0x0a, 0xfb, + 0x18, 0xbb, 0x1a, 0x0c, 0x08, 0xfb, 0x0e, 0xf0, 0x42, 0xea, + 0x0b, 0x42, 0x90, 0x42, 0x07, 0xfa, 0x01, 0xf7, 0x3e, 0xd9, + 0xa2, 0x18, 0x08, 0xf1, 0xff, 0x3b, 0x04, 0xd2, 0x90, 0x42, + 0x02, 0xd9, 0xa8, 0xf1, 0x02, 0x0b, 0x22, 0x44, 0x12, 0x1a, + 0x9b, 0xb2, 0xb2, 0xfb, 0xfa, 0xf8, 0x0a, 0xfb, 0x18, 0x22, + 0x08, 0xfb, 0x0e, 0xfe, 0x43, 0xea, 0x02, 0x42, 0x96, 0x45, + 0x2b, 0xd9, 0xa2, 0x18, 0x08, 0xf1, 0xff, 0x30, 0x04, 0xd2, + 0x96, 0x45, 0x02, 0xd9, 0xa8, 0xf1, 0x02, 0x00, 0x22, 0x44, + 0x40, 0xea, 0x0b, 0x40, 0xa0, 0xfb, 0x05, 0x83, 0xa2, 0xeb, + 0x0e, 0x02, 0x9a, 0x42, 0xc6, 0x46, 0x9a, 0x46, 0x02, 0xd3, + 0x07, 0xd1, 0x47, 0x45, 0x05, 0xd2, 0xb8, 0xeb, 0x05, 0x0e, + 0x63, 0xeb, 0x04, 0x03, 0x01, 0x38, 0x9a, 0x46, 0x86, 0xb1, + 0xb7, 0xeb, 0x0e, 0x03, 0x62, 0xeb, 0x0a, 0x02, 0x02, 0xfa, + 0x0c, 0xfc, 0xcb, 0x40, 0x4c, 0xea, 0x03, 0x03, 0xca, 0x40, + 0xc6, 0xe9, 0x00, 0x32, 0x9a, 0xe7, 0xc3, 0x46, 0xc7, 0xe7, + 0x40, 0x46, 0xda, 0xe7, 0x31, 0x46, 0x0f, 0xe7, 0x70, 0x47, + 0x00, 0xbf, 0x00, 0xb2, 0x18, 0x47, 0x38, 0xb5, 0x0a, 0x4b, + 0x05, 0x46, 0x0c, 0x46, 0x59, 0xf8, 0x03, 0x00, 0x11, 0x46, + 0x00, 0xf0, 0x0f, 0xf8, 0x48, 0xb9, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x1b, 0xf8, 0x20, 0xb9, 0x20, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x00, 0xf0, 0x26, 0xb8, 0x38, 0xbd, 0x00, 0xbf, + 0x5c, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x01, 0x22, + 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, 0x11, 0x46, + 0xfe, 0xf7, 0x93, 0xfb, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, + 0x32, 0xfb, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x10, 0xb5, + 0x86, 0xb0, 0x01, 0x22, 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, + 0x20, 0x46, 0x11, 0x46, 0xfe, 0xf7, 0xab, 0xfb, 0x94, 0xe8, + 0x0f, 0x00, 0xfe, 0xf7, 0x31, 0xfb, 0x00, 0xb2, 0x06, 0xb0, + 0x10, 0xbd, 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x22, 0x00, 0x92, + 0x02, 0xac, 0x01, 0x22, 0x03, 0x46, 0x11, 0x46, 0x20, 0x46, + 0xfe, 0xf7, 0x8c, 0xfb, 0x94, 0xe8, 0x0f, 0x00, 0xfe, 0xf7, + 0xe1, 0xfa, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x2d, 0x30, 0x2b, 0x20, 0x00, + 0x68, 0x6c, 0x4c, 0x00, 0x65, 0x66, 0x67, 0x45, 0x46, 0x47, + 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x00, 0x68, 0x65, 0x61, 0x64, 0x20, + 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x20, 0x26, 0x26, + 0x20, 0x21, 0x69, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x69, + 0x6e, 0x28, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x2d, 0x3e, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, + 0x68, 0x65, 0x61, 0x64, 0x2d, 0x3e, 0x64, 0x74, 0x29, 0x00, + 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x6c, 0x69, 0x62, 0x74, + 0x6f, 0x63, 0x6b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x2e, 0x63, + 0x00, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x20, 0x3c, 0x3d, 0x20, + 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x4d, 0x41, 0x58, + 0x00, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x63, + 0x6b, 0x73, 0x00, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x5f, 0x75, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x00, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x22, + 0x25, 0x73, 0x22, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x3a, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x25, 0x73, + 0x22, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x25, 0x64, + 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x18, 0x09, 0x00, 0x00, + 0x1c, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x81, 0x03, + 0x00, 0x80, 0x60, 0x0a, 0x00, 0x00, 0x50, 0x1c, 0x00, 0x80, + 0x56, 0x1c, 0x00, 0x80, 0x5a, 0x1c, 0x00, 0x80, 0x61, 0x1c, + 0x00, 0x80, 0x72, 0x1c, 0x00, 0x80, 0x83, 0x1c, 0x00, 0x80, + 0xc4, 0x1c, 0x00, 0x80, 0x05, 0x14, 0x00, 0x80, 0xe3, 0x1c, + 0x00, 0x80, 0xd1, 0x15, 0x00, 0x80, 0x74, 0x0a, 0x00, 0x00, + 0xf7, 0x1c, 0x00, 0x80, 0x03, 0x1d, 0x00, 0x80, 0x31, 0x17, + 0x00, 0x80, 0x78, 0x0a, 0x00, 0x00, 0x4b, 0x1d, 0x00, 0x80, + 0x10, 0x1d, 0x00, 0x80, 0x1d, 0x1d, 0x00, 0x80, 0x55, 0x1b, + 0x00, 0x80, 0x6f, 0x0d, 0x00, 0x80, 0x6c, 0x0a, 0x00, 0x00, + 0x79, 0x04, 0x00, 0x80, 0x14, 0x09, 0x00, 0x00, 0xf0, 0x1b, + 0x00, 0x80, 0x57, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x80, 0x89, 0x10, + 0x00, 0x80, 0x10, 0x1c, 0x00, 0x80, 0x93, 0x0d, 0x00, 0x80, + 0x10, 0x09, 0x00, 0x00, 0x37, 0x0d, 0x00, 0x80, 0x30, 0x1c, + 0x00, 0x80, 0x68, 0x0a, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, + 0x30, 0x1c, 0x00, 0x80, 0xf0, 0x1b, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x08, + 0x00, 0x00, 0xb0, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0xb4, 0x08, 0x00, 0x00, 0x02, 0x78, 0x01, 0x00, 0xb8, 0x08, + 0x00, 0x00, 0x02, 0x92, 0x01, 0x00, 0xbc, 0x08, 0x00, 0x00, + 0x02, 0x5c, 0x01, 0x00, 0x10, 0x09, 0x00, 0x00, 0x02, 0x03, + 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, + 0x80, 0x00, 0x20, 0x21}; diff --git a/examples/tests/app_loader/app_binaries/cortex-m4/tock-apps.h b/examples/tests/app_loader/app_binaries/cortex-m4/tock-apps.h new file mode 100644 index 000000000..9e713fff9 --- /dev/null +++ b/examples/tests/app_loader/app_binaries/cortex-m4/tock-apps.h @@ -0,0 +1,16 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +extern uint8_t blink_data[16384]; +extern uint8_t adc_data[16384]; +extern uint8_t tock_dpl_hello_data[8192]; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/examples/tests/app_loader/app_binaries/cortex-m4/tock-dpl-hello.c b/examples/tests/app_loader/app_binaries/cortex-m4/tock-dpl-hello.c new file mode 100644 index 000000000..eeaab3338 --- /dev/null +++ b/examples/tests/app_loader/app_binaries/cortex-m4/tock-dpl-hello.c @@ -0,0 +1,137 @@ +#include "tock-apps.h" + +uint8_t tock_dpl_hello_data[] = +{0x02, 0x00, 0x54, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x2e, 0x29, 0x30, 0x6b, 0x01, 0x00, 0x0c, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x12, + 0x00, 0x00, 0x09, 0x00, 0x14, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x12, 0x00, 0x00, 0x34, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, + 0x74, 0x6f, 0x63, 0x6b, 0x2d, 0x64, 0x70, 0x6c, 0x2d, 0x68, + 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xec, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, + 0x2c, 0x08, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xc8, 0x08, + 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x44, 0x6a, 0x04, 0xf1, 0x07, 0x04, + 0x0c, 0x44, 0x07, 0x25, 0x24, 0xea, 0x05, 0x04, 0x85, 0x69, + 0xc6, 0x69, 0x35, 0x44, 0x0d, 0x44, 0x06, 0x00, 0x0f, 0x00, + 0x9d, 0x42, 0x00, 0xdc, 0xa5, 0x46, 0x00, 0x20, 0x29, 0x00, + 0x05, 0xdf, 0xa5, 0x46, 0x0a, 0x20, 0x21, 0x00, 0x05, 0xdf, + 0x0b, 0x20, 0x29, 0x00, 0x05, 0xdf, 0x70, 0x68, 0x38, 0x44, + 0x81, 0x46, 0x30, 0x00, 0x39, 0x00, 0x00, 0xf0, 0x17, 0xf8, + 0x70, 0x47, 0x10, 0xb5, 0x08, 0x4b, 0x59, 0xf8, 0x03, 0x40, + 0x20, 0x46, 0x00, 0xf0, 0x7d, 0xf9, 0x06, 0x4b, 0x01, 0x46, + 0x59, 0xf8, 0x03, 0x20, 0x20, 0x46, 0x00, 0xf0, 0xfc, 0xf8, + 0x00, 0xf0, 0xa8, 0xf8, 0x00, 0x20, 0x10, 0xbd, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x46, 0x08, 0xb5, + 0x41, 0x68, 0x03, 0x68, 0x04, 0x46, 0x29, 0x44, 0x18, 0x44, + 0x00, 0x22, 0xa3, 0x68, 0xb2, 0xeb, 0x93, 0x0f, 0x1a, 0xd3, + 0xd4, 0xe9, 0x03, 0x10, 0x62, 0x69, 0x21, 0x44, 0x28, 0x44, + 0x00, 0xf0, 0x45, 0xf9, 0xd4, 0xe9, 0x06, 0x02, 0x00, 0x21, + 0x28, 0x44, 0x00, 0xf0, 0x4d, 0xf9, 0x21, 0x6a, 0x21, 0x44, + 0x00, 0x22, 0x0e, 0x1d, 0x0b, 0x68, 0xb2, 0xeb, 0x93, 0x0f, + 0x11, 0xd3, 0x00, 0x21, 0x08, 0x46, 0xff, 0xf7, 0xc5, 0xff, + 0x00, 0xf0, 0x19, 0xf9, 0x50, 0xf8, 0x22, 0x30, 0x00, 0x2b, + 0xb6, 0xbf, 0x03, 0xf1, 0x00, 0x43, 0x5b, 0x19, 0x1b, 0x19, + 0x41, 0xf8, 0x22, 0x30, 0x01, 0x32, 0xd4, 0xe7, 0x56, 0xf8, + 0x22, 0x00, 0x2b, 0x58, 0x00, 0x2b, 0xb6, 0xbf, 0x03, 0xf1, + 0x00, 0x43, 0x5b, 0x19, 0x1b, 0x19, 0x2b, 0x50, 0x02, 0x32, + 0xdd, 0xe7, 0x40, 0x42, 0x70, 0x47, 0xff, 0xff, 0x84, 0xb0, + 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, + 0x00, 0x30, 0x80, 0x2b, 0x05, 0xd0, 0x3b, 0xb9, 0x9d, 0xf8, + 0x04, 0x00, 0x04, 0xb0, 0xff, 0xf7, 0xee, 0xbf, 0x00, 0x20, + 0x04, 0xb0, 0x70, 0x47, 0x00, 0x48, 0xfb, 0xe7, 0x00, 0xfc, + 0xff, 0xff, 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, 0x0c, 0xe9, + 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, 0x23, 0xb9, 0x9d, 0xf8, + 0x0c, 0x00, 0x04, 0xb0, 0xff, 0xf7, 0xda, 0xbf, 0x00, 0x20, + 0x04, 0xb0, 0x70, 0x47, 0x84, 0xb0, 0x0d, 0xf1, 0x10, 0x0c, + 0x0c, 0xe9, 0x0f, 0x00, 0x9d, 0xf8, 0x00, 0x30, 0x23, 0xb9, + 0x9d, 0xf8, 0x0c, 0x00, 0x04, 0xb0, 0xff, 0xf7, 0xca, 0xbf, + 0x00, 0x20, 0x04, 0xb0, 0x70, 0x47, 0x10, 0xb5, 0x11, 0x4b, + 0x11, 0x4a, 0x59, 0xf8, 0x03, 0x10, 0x59, 0xf8, 0x02, 0x20, + 0x0b, 0x68, 0x12, 0x68, 0x93, 0x42, 0x16, 0xd0, 0x0e, 0x4a, + 0x59, 0xf8, 0x02, 0x40, 0x14, 0x22, 0x5a, 0x43, 0x01, 0x33, + 0xa0, 0x18, 0xa4, 0x58, 0x5a, 0x42, 0x02, 0xf0, 0x0f, 0x02, + 0x03, 0xf0, 0x0f, 0x03, 0x58, 0xbf, 0x53, 0x42, 0x0b, 0x60, + 0xd0, 0xe9, 0x03, 0x23, 0xd0, 0xe9, 0x01, 0x01, 0xa0, 0x47, + 0x01, 0x20, 0x10, 0xbd, 0x00, 0x20, 0xfc, 0xe7, 0x04, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0xb5, 0xff, 0xf7, 0xd3, 0xff, 0x01, 0x46, 0x08, 0xb9, + 0x01, 0x20, 0x00, 0xdf, 0x08, 0xbd, 0x01, 0x46, 0x00, 0x20, + 0x06, 0xdf, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0x02, 0x9b, 0x01, 0xdf, 0x82, 0x28, 0x07, 0xd1, + 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, 0x23, 0x70, 0x00, 0x23, + 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x28, 0x05, 0xd1, + 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, 0x20, 0x70, 0x21, 0x73, + 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x77, 0xf8, 0x10, 0xb5, + 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, + 0x02, 0xdf, 0x20, 0x70, 0xc4, 0xe9, 0x01, 0x12, 0xe3, 0x60, + 0x20, 0x46, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x11, 0x46, 0x1a, 0x46, 0x02, 0x9b, 0x04, 0xdf, 0x82, 0x28, + 0x07, 0xd1, 0x01, 0x23, 0xc4, 0xe9, 0x01, 0x12, 0x23, 0x70, + 0x00, 0x23, 0x23, 0x73, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x28, + 0x05, 0xd1, 0x00, 0x20, 0xc4, 0xe9, 0x01, 0x23, 0x20, 0x70, + 0x21, 0x73, 0xf5, 0xe7, 0x01, 0x20, 0x00, 0xf0, 0x4e, 0xf8, + 0x00, 0xb2, 0x18, 0x47, 0x38, 0xb5, 0x0a, 0x4b, 0x05, 0x46, + 0x0c, 0x46, 0x59, 0xf8, 0x03, 0x00, 0x11, 0x46, 0x00, 0xf0, + 0x0f, 0xf8, 0x48, 0xb9, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x1b, 0xf8, 0x20, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x00, 0xf0, 0x26, 0xb8, 0x38, 0xbd, 0x00, 0xbf, 0x10, 0x00, + 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x01, 0x22, 0x02, 0xac, + 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, 0x11, 0x46, 0xff, 0xf7, + 0x97, 0xff, 0x94, 0xe8, 0x0f, 0x00, 0xff, 0xf7, 0x3e, 0xff, + 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x10, 0xb5, 0x86, 0xb0, + 0x01, 0x22, 0x02, 0xac, 0x03, 0x46, 0x00, 0x91, 0x20, 0x46, + 0x11, 0x46, 0xff, 0xf7, 0xaf, 0xff, 0x94, 0xe8, 0x0f, 0x00, + 0xff, 0xf7, 0x3d, 0xff, 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, + 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x22, 0x00, 0x92, 0x02, 0xac, + 0x01, 0x22, 0x03, 0x46, 0x11, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x90, 0xff, 0x94, 0xe8, 0x0f, 0x00, 0xff, 0xf7, 0x05, 0xff, + 0x00, 0xb2, 0x06, 0xb0, 0x10, 0xbd, 0x08, 0xb5, 0x09, 0x4b, + 0x59, 0xf8, 0x03, 0x30, 0x04, 0x46, 0x13, 0xb1, 0x00, 0x21, + 0xaf, 0xf3, 0x00, 0x80, 0x06, 0x4b, 0x59, 0xf8, 0x03, 0x30, + 0x18, 0x68, 0x83, 0x6a, 0x03, 0xb1, 0x98, 0x47, 0x20, 0x46, + 0x00, 0xf0, 0x23, 0xf8, 0x00, 0xbf, 0x1c, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0a, 0x44, 0x91, 0x42, 0x00, 0xf1, + 0xff, 0x33, 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, 0x11, 0xf8, + 0x01, 0x4b, 0x03, 0xf8, 0x01, 0x4f, 0x91, 0x42, 0xf9, 0xd1, + 0x10, 0xbd, 0x02, 0x44, 0x03, 0x46, 0x93, 0x42, 0x00, 0xd1, + 0x70, 0x47, 0x03, 0xf8, 0x01, 0x1b, 0xf9, 0xe7, 0x03, 0x46, + 0x13, 0xf8, 0x01, 0x2b, 0x00, 0x2a, 0xfb, 0xd1, 0x18, 0x1a, + 0x01, 0x38, 0x70, 0x47, 0x08, 0xb5, 0xff, 0xf7, 0x31, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, + 0x00, 0x80, 0xc8, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, + 0xd0, 0x08, 0x00, 0x00, 0x7d, 0x02, 0x00, 0x80, 0x2c, 0x08, + 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x20, 0x54, + 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x70, 0x70, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x21, 0x0d, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, + 0x00, 0x80, 0xcc, 0x03, 0x00, 0x80, 0x8c, 0x03, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x08, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x64, 0x08, 0x00, 0x00, 0x02, 0x98, 0x00, 0x00, + 0x68, 0x08, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x6c, 0x08, + 0x00, 0x00, 0x02, 0x8c, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, + 0x02, 0x03, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x02, 0x03, + 0x00, 0x00, 0x80, 0x00, 0xc8, 0x1a}; diff --git a/examples/tests/app_loader/button-press-loading/Makefile b/examples/tests/app_loader/button-press-loading/Makefile new file mode 100644 index 000000000..1a785e166 --- /dev/null +++ b/examples/tests/app_loader/button-press-loading/Makefile @@ -0,0 +1,13 @@ +# Makefile for user application + +# Specify this directory relative to the current application. +TOCK_USERLAND_BASE_DIR = ../../../.. + +# Which files to compile. +C_SRCS := $(wildcard *.c) + +override CFLAGS += -I../app_binaries/cortex-m4 + +# Include userland master makefile. Contains rules and flags for actually +# building the application. +include $(TOCK_USERLAND_BASE_DIR)/AppMakefile.mk diff --git a/examples/tests/app_loader/button-press-loading/README.md b/examples/tests/app_loader/button-press-loading/README.md new file mode 100644 index 000000000..786cd9cba --- /dev/null +++ b/examples/tests/app_loader/button-press-loading/README.md @@ -0,0 +1,47 @@ +# Dynamic App Loader (Helper App) +================================= + +This app waits upon the user to press one of two buttons on the device (if supported). + +When Button 1 (Default user button on boards) is pressed, the app tried to load in the +`blink` app. + +When Button 2 is pressed, the app tries to load in the `adc` app. + +There are three stages to this: + +1. Setup Phase +2. Flash Phase +3. Load Phase + +#### Setup Phase +During the setup phase, the application passes the size of the new app `(blink)/(adc)`'s +binary to the app_loader capsule. + +The capsule returns with either a success or failure. + +On success, the app requests the app_loader capsule to flash the `blink/adc` app. + +On Failure, the app exits logs the reason for failure and exits. + +#### Flash Phase +The app sends the binary of the `blink/adc` app 512 bytes (this is the size of the shared +buffer between the app and the capsule) at a time along with the offset. + +The capsule checks that these values do not violate the bounds dictated by the kernel +and then requests the kernel to flash the app. + +The kernel performs more stringent checking on the request to ensure that memory access +violations do not take place, and flashes the app. + +The capsule then returns with either a success or failure. + +On success, the app requests the app_loader capsule to load the `blink/adc` app. + +On Failure, the app exits logs the reason for failure and exits. + +#### Load Phase +The app requests the capsule to load the new app. There are only two outcomes: + +1. The `blink/adc` app is loaded successfully and functions without requiring a restart. +2. The load process failed somewhere, and the app is erased. \ No newline at end of file diff --git a/examples/tests/app_loader/button-press-loading/adc.c b/examples/tests/app_loader/button-press-loading/adc.c new file mode 120000 index 000000000..077d8d82c --- /dev/null +++ b/examples/tests/app_loader/button-press-loading/adc.c @@ -0,0 +1 @@ +../app_binaries/cortex-m4/adc.c \ No newline at end of file diff --git a/examples/tests/app_loader/button-press-loading/blink.c b/examples/tests/app_loader/button-press-loading/blink.c new file mode 120000 index 000000000..6738712d2 --- /dev/null +++ b/examples/tests/app_loader/button-press-loading/blink.c @@ -0,0 +1 @@ +../app_binaries/cortex-m4/blink.c \ No newline at end of file diff --git a/examples/tests/app_loader/button-press-loading/main.c b/examples/tests/app_loader/button-press-loading/main.c new file mode 100644 index 000000000..4895f4769 --- /dev/null +++ b/examples/tests/app_loader/button-press-loading/main.c @@ -0,0 +1,260 @@ +// \file + +// This is a helper program to test the dynamic app loading functionality +// of Tock works. This app has two other applications' (blink and ADC) binaries +// pre-programmed into it. When the user presses a button on a supported device, +// the dynamic process loader enables the new app to be written to flash and +// loaded as a new process. + +#include +#include +#include + +#include "tock-apps.h" +#include +#include +#include +#include + + +#define FLASH_BUFFER_SIZE 512 +#define RETURNCODE_SUCCESS 0 + +static bool setup_done = false; // to check if setup is done +static bool write_done = false; // to check if writing to flash is done +static bool finalize_done = false; // to check if the kernel is done finalizing the process binary +static bool load_done = false; // to check if the process was loaded successfully +static bool button_press = false; + +/****************************************************************************************************** +* Callback functions +* +* 1. Callback to let us know when the capsule is done writing data to flash +* 2. Set button callback to initiate the dynamic app load process on pressing button 1 (on nrf52840dk) +* +******************************************************************************************************/ + +// static void nop_callback(int a __attribute__((unused)), int b __attribute__((unused)), int c __attribute__((unused)), void *d __attribute__((unused))) {} + +static void app_setup_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + setup_done = true; +} + +static void app_write_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + write_done = true; +} + +static void app_finalize_done_callback(__attribute__((unused)) int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + finalize_done = true; +} + +static void app_load_done_callback(int arg0, + __attribute__((unused)) int arg1, + __attribute__((unused)) int arg2, + __attribute__((unused)) void* ud) { + + if (arg0 != RETURNCODE_SUCCESS) { + printf("[Error] Process creation failed: %d.\n", arg0); + } else { + printf("[Success] Process created successfully.\n"); + } + load_done = true; +} + +// Callback for button presses. +static void button_callback(__attribute__ ((unused)) returncode_t retval, int btn_num, bool pressed) { + // Callback for button presses. + // val: 1 if pressed, 0 if depressed + if (pressed == 1 && !button_press) { + // Note: this variable is introduced + // because the current alarm upcall implementation + // results in panic when a button is pressed within + // the debounce period if the debounce period is long. + // Setting the debounce interval to 100ms seems to work + // but setting it to 200ms and rapidly clicking buttons + // leads to the kernel panicking. + button_press = true; + libtocksync_alarm_delay_ms(200); // debounce + + if (pressed == 1) { + const char* app_name = NULL; + unsigned char* app_data = NULL; + size_t app_size = 0; + + switch (btn_num) { + case BUTTON1: + app_name = "blink"; + app_data = blink_data; + app_size = sizeof(blink_data); + break; + case BUTTON2: + app_name = "adc"; + app_data = adc_data; + app_size = sizeof(adc_data); + break; + default: + button_press = false; + return; + } + printf("[Event] Button for %s Pressed!\n", app_name); + printf("size: %d\n", app_size); + + int ret = libtock_app_loader_setup(app_size); + if (ret != RETURNCODE_SUCCESS) { + printf("[Error] Setup Failed: %d.\n", ret); + tock_exit(ret); + } + + // wait on setup done callback + yield_for(&setup_done); + setup_done = false; + + printf("[Success] Setup successful. Writing app to flash.\n"); + int ret1 = write_app(app_size, app_data); + if (ret1 != RETURNCODE_SUCCESS) { + printf("[Error] App flash write unsuccessful: %d.\n", ret1); + tock_exit(ret1); + } + + printf("[Success] App flashed successfully. Creating process now.\n"); + int ret2 = libtock_app_loader_load(); + if (ret2 != RETURNCODE_SUCCESS) { + printf("[Error] Process creation failed: %d.\n", ret2); + tock_exit(ret2); + } + + // wait on load done callback + yield_for(&load_done); + load_done = false; + + button_press = false; + printf("[Log] Waiting for a button press.\n"); + } + } +} + + +/****************************************************************************************************** +* +* Function to write the app into the flash +* +* Takes app size and the app binary as arguments +******************************************************************************************************/ + +int write_app(double size, uint8_t binary[]) { + + uint32_t write_count = 0; + uint8_t write_buffer[FLASH_BUFFER_SIZE]; + uint32_t flash_offset = 0; + + // This value can be changed to different sizes + // to mimic different bus widths. + uint32_t write_buffer_size = FLASH_BUFFER_SIZE; + + write_count = ceil(size / write_buffer_size); + + // set the write buffer + int ret = libtock_app_loader_set_buffer(write_buffer, FLASH_BUFFER_SIZE); + if (ret != RETURNCODE_SUCCESS) { + printf("[Error] Failed to set the write buffer: %d.\n", ret); + return -1; + } + + for (uint32_t offset = 0; offset < write_count; offset++) { + // copy binary to write buffer + memcpy(write_buffer, &binary[write_buffer_size * offset], write_buffer_size); + flash_offset = (offset * write_buffer_size); + int ret1 = libtock_app_loader_write(flash_offset, write_buffer_size); + if (ret1 != 0) { + printf("[Error] Failed writing data to flash at address: 0x%lx\n", flash_offset); + printf("[Error] Error nature: %d\n", ret1); + return -1; + } + // wait on write done callback + yield_for(&write_done); + write_done = false; + } + + // Now that we are done writing the binary, we ask the kernel to finalize it. + printf("Done writing app, finalizing.\n"); + int ret2 = libtock_app_loader_finalize(); + if (ret2 != 0) { + printf("[Error] Failed to finalize new process binary.\n"); + return -1; + } + yield_for(&finalize_done); + finalize_done = false; + + return 0; +} + + +/****************************************************************************************************** +* +* Main +* +******************************************************************************************************/ + +int main(void) { + printf("[Log] Simple test app to load an app dynamically.\n"); + + // check if app loader driver exists + if (!libtock_app_loader_exists()) { + printf("No App Loader driver!\n"); + return -1; + } + + int count; + int err = libtock_button_count(&count); + // Ensure there is a button to use. + if (err < 0) return err; + printf("[Log] There are %d buttons on this board.\n", count); + + // Enable interrupts on each button. + for (int i = 0; i < count; i++) { + libtock_button_notify_on_press(i, button_callback); + } + + // set up the setup done callback + int err1 = libtock_app_loader_setup_set_upcall(app_setup_done_callback, NULL); + if (err1 != 0) { + printf("[Error] Failed to set setup done callback: %d\n", err1); + return err1; + } + + // set up the write done callback + int err2 = libtock_app_loader_write_set_upcall(app_write_done_callback, NULL); + if (err2 != 0) { + printf("[Error] Failed to set flash write done callback: %d\n", err2); + return err2; + } + + // set up the finalize done callback + int err3 = libtock_app_loader_finalize_set_upcall(app_finalize_done_callback, NULL); + if (err3 != 0) { + printf("[Error] Failed to set finalize done callback: %d\n", err3); + return err3; + } + + // set up the load done callback + int err4 = libtock_app_loader_load_set_upcall(app_load_done_callback, NULL); + if (err4 != 0) { + printf("[Error] Failed to set load done callback: %d\n", err4); + return err4; + } + + printf("[Log] Waiting for a button press.\n"); + + while (1) { + yield(); + } +} diff --git a/examples/tests/app_loader/tool/README.md b/examples/tests/app_loader/tool/README.md new file mode 100644 index 000000000..00f9e6dbd --- /dev/null +++ b/examples/tests/app_loader/tool/README.md @@ -0,0 +1,10 @@ +# Python tool to convert TAB to array +===================================== + +This python tool converts compiled TAB files into hex arrays +that can be copied into header files. This is useful in testing +the dynamic process loader application. + +Note: Please remember to `make` the application you want to + convert. Otherwise the tool will output an error message + saying file not found. diff --git a/examples/tests/app_loader/tool/tab_to_binary_array.py b/examples/tests/app_loader/tool/tab_to_binary_array.py new file mode 100644 index 000000000..de727e777 --- /dev/null +++ b/examples/tests/app_loader/tool/tab_to_binary_array.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +################################### +# Author: Viswajith Govinda Rajan +# Date:5/3/2025 +# This script takes a .tab file and +# generates a c-binary array for +# cortex-m4 architecture boards. +################################### + +import tarfile +import os +import sys + +def extract_app_name_from_filename(path): + base_name = os.path.basename(path) + app_name, _ = os.path.splitext(base_name) + return app_name + +def read_tbf_header(tbf): + + header = tbf[:16] + version = int.from_bytes(header[0:2], "little") + header_len = int.from_bytes(header[2:4], "little") + total_size = int.from_bytes(header[4:8], "little") + flags = int.from_bytes(header[8:12], "little") + + print(f"Version: {version}") + print(f"Header Length: {header_len} bytes") + print(f"Total App Size: {total_size} bytes") + print(f"Flags: {hex(flags)}") + + return total_size + + +def extract_cortex_m4_tbf(tab_path): + """Extracts the cortex-m4.tbf binary from a .tab archive.""" + try: + with tarfile.open(tab_path, "r") as tar: + if "cortex-m4.tbf" in tar.getnames(): + with tar.extractfile("cortex-m4.tbf") as tbf_file: + tbf_data = tbf_file.read() + + return tbf_data + else: + print("Error: cortex-m4.tbf not found in the .tab file.") + except Exception as e: + print(f"Extraction failed: {e}") + +def binary_to_array(tbf): + hex_array = [hex(byte) for byte in tbf] + return hex_array + +def print_hex_array(hex_array): + print("Hexadecimal Array:") + count = 0 + print("{") + for hex_byte in hex_array: + print(f"0x{hex_byte[2:].zfill(2)}", end=", ") # Add prefix '0x' and leading zero padding + count += 1 + if count % 14 == 0: + print() # Add a new line after every 14 elements + if count % 14 != 0: + print() # Add a new line if the last line is not complete + print("}") + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python3 tab_to_binary_array.py ") + sys.exit(1) + + file_path = sys.argv[1] + + if not os.path.isfile(file_path): + print(f"Error: File '{file_path}' not found.") + sys.exit(1) + + tbf = extract_cortex_m4_tbf(file_path) + total_size = read_tbf_header(tbf) + app_name = extract_app_name_from_filename(file_path) + hex_array = binary_to_array(tbf) + +print_hex_array(hex_array) diff --git a/libtock/kernel/app_loader.c b/libtock/kernel/app_loader.c new file mode 100644 index 000000000..e7b3e8589 --- /dev/null +++ b/libtock/kernel/app_loader.c @@ -0,0 +1,96 @@ +#include "app_loader.h" + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_setup_set_upcall(subscribe_upcall cb, void* userdata) { + return libtock_app_loader_setup_subscribe(cb, userdata); +} + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_write_set_upcall(subscribe_upcall cb, void* userdata) { + return libtock_app_loader_write_subscribe(cb, userdata); +} + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_finalize_set_upcall(subscribe_upcall cb, void* userdata) { + return libtock_app_loader_finalize_subscribe(cb, userdata); +} + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_load_set_upcall(subscribe_upcall cb, void* userdata) { + return libtock_app_loader_load_subscribe(cb, userdata); +} + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_abort_set_upcall(subscribe_upcall cb, void* userdata) { + return libtock_app_loader_abort_subscribe(cb, userdata); +} + +/* + * Command to request the kernel to set up for a new app. + * This functions takes the size of the new app as the argument. + */ +returncode_t libtock_app_loader_setup(uint32_t app_length) { + return libtock_app_loader_command_setup(app_length); +} + + +/* + * Function to set up a shared buffer with the capsule. + * This buffer is used to write data to the flash. + */ +returncode_t libtock_app_loader_set_buffer(uint8_t* buffer, uint32_t len) { + return libtock_app_loader_write_buffer(buffer, len); +} + +/* + * Command to write new app binary to the capsule. + * Specify the offset at which the data segment should be written. + * Also specify how long the data segment will be in bytes. + * + * After writing data, the userspace app should yield for + * the write done callback from the capsule. + */ +returncode_t libtock_app_loader_write(uint32_t flash_offset, uint32_t write_length) { + return libtock_app_loader_command_write(flash_offset, write_length); +} + +/* + * Command to request the kernel to load the newly flashed app. + */ +returncode_t libtock_app_loader_finalize(void) { + return libtock_app_loader_command_finalize(); +} + +/* + * Command to request the kernel to load the newly flashed app. + */ +returncode_t libtock_app_loader_load(void) { + return libtock_app_loader_command_load(); +} + +/* + * Command to request the kernel to abort setup/write process. + */ +returncode_t libtock_app_loader_abort(void) { + return libtock_app_loader_command_abort(); +} \ No newline at end of file diff --git a/libtock/kernel/app_loader.h b/libtock/kernel/app_loader.h new file mode 100644 index 000000000..d131fe14c --- /dev/null +++ b/libtock/kernel/app_loader.h @@ -0,0 +1,98 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "libtock/kernel/syscalls/app_loader_syscalls.h" +#include "libtock/tock.h" + +#define BUTTON1 0 +#define BUTTON2 1 +#define BUTTON3 2 + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_setup_set_upcall(subscribe_upcall cb, void* userdata); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_write_set_upcall(subscribe_upcall cb, void* userdata); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_finalize_set_upcall(subscribe_upcall cb, void* userdata); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_load_set_upcall(subscribe_upcall cb, void* userdata); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_abort_set_upcall(subscribe_upcall cb, void* userdata); + +/* + * Command to request the kernel to set up for a new app. + * This functions takes the size of the new app as the argument. + */ +returncode_t libtock_app_loader_setup(uint32_t app_length); + + +/* + * Function to set up a shared buffer with the capsule. + * This buffer is used to write data to the flash. + */ +returncode_t libtock_app_loader_set_buffer(uint8_t* buffer, uint32_t len); + +/* + * Command to write new app binary to the capsule. + * Specify the offset at which the data segment should be written. + * Also specify how long the data segment will be in bytes. + * + * After writing data, the userspace app should yield for + * the write done callback from the capsule. + */ +returncode_t libtock_app_loader_write(uint32_t flash_offset, uint32_t write_length); + +/* + * Signal to the app we are done writing a process binary. + */ +returncode_t libtock_app_loader_finalize(void); + +/* + * Command to request the kernel to load the newly flashed app. + */ +returncode_t libtock_app_loader_load(void); + +/* + * Command to request the kernel to abort the setup/write phase. + */ +returncode_t libtock_app_loader_abort(void); + + +/* + * Internal function to write new app to flash. Takes app size as argument. + */ +int write_app(double size, uint8_t binary[]); + + + +#ifdef __cplusplus +} +#endif diff --git a/libtock/kernel/syscalls/app_loader_syscalls.c b/libtock/kernel/syscalls/app_loader_syscalls.c new file mode 100644 index 000000000..29b9bf68a --- /dev/null +++ b/libtock/kernel/syscalls/app_loader_syscalls.c @@ -0,0 +1,60 @@ +#include "app_loader_syscalls.h" + +bool libtock_app_loader_exists(void) { + return driver_exists(DRIVER_NUM_APP_LOADER); +} + +returncode_t libtock_app_loader_setup_subscribe(subscribe_upcall cb, void* userdata) { + subscribe_return_t sval = subscribe(DRIVER_NUM_APP_LOADER, 0, cb, userdata); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_app_loader_write_subscribe(subscribe_upcall cb, void* userdata) { + subscribe_return_t sval = subscribe(DRIVER_NUM_APP_LOADER, 1, cb, userdata); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_app_loader_finalize_subscribe(subscribe_upcall cb, void* userdata) { + subscribe_return_t sval = subscribe(DRIVER_NUM_APP_LOADER, 2, cb, userdata); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_app_loader_load_subscribe(subscribe_upcall cb, void* userdata) { + subscribe_return_t sval = subscribe(DRIVER_NUM_APP_LOADER, 3, cb, userdata); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_app_loader_abort_subscribe(subscribe_upcall cb, void* userdata) { + subscribe_return_t sval = subscribe(DRIVER_NUM_APP_LOADER, 4, cb, userdata); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_app_loader_write_buffer(uint8_t* buffer, uint32_t len) { + allow_ro_return_t aval = allow_readonly(DRIVER_NUM_APP_LOADER, 0, (void*) buffer, len); + return tock_allow_ro_return_to_returncode(aval); +} + +returncode_t libtock_app_loader_command_setup(uint32_t app_length) { + syscall_return_t res = command(DRIVER_NUM_APP_LOADER, 1, app_length, 0); + return tock_command_return_novalue_to_returncode(res); +} + +returncode_t libtock_app_loader_command_write(uint32_t flash_offset, uint32_t write_length) { + syscall_return_t res = command(DRIVER_NUM_APP_LOADER, 2, flash_offset, write_length); + return tock_command_return_novalue_to_returncode(res); +} + +returncode_t libtock_app_loader_command_finalize(void) { + syscall_return_t res = command(DRIVER_NUM_APP_LOADER, 3, 0, 0); + return tock_command_return_novalue_to_returncode(res); +} + +returncode_t libtock_app_loader_command_load(void) { + syscall_return_t res = command(DRIVER_NUM_APP_LOADER, 4, 0, 0); + return tock_command_return_novalue_to_returncode(res); +} + +returncode_t libtock_app_loader_command_abort(void) { + syscall_return_t res = command(DRIVER_NUM_APP_LOADER, 5, 0, 0); + return tock_command_return_novalue_to_returncode(res); +} \ No newline at end of file diff --git a/libtock/kernel/syscalls/app_loader_syscalls.h b/libtock/kernel/syscalls/app_loader_syscalls.h new file mode 100644 index 000000000..58661fa07 --- /dev/null +++ b/libtock/kernel/syscalls/app_loader_syscalls.h @@ -0,0 +1,94 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "libtock/tock.h" + +// Driver number for system call +#define DRIVER_NUM_APP_LOADER 0x10001 + +/* + * Command to check if the `app_loader` capsule exists. + */ +bool libtock_app_loader_exists(void); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_setup_subscribe(subscribe_upcall cb, void* userdata); + +/* + * Command to request the kernel to set up for a new app. + * This functions takes the size of the new app as the argument. + */ +returncode_t libtock_app_loader_command_setup(uint32_t app_length); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_write_subscribe(subscribe_upcall cb, void* userdata); + +/* + * Function to set up a shared buffer with the capsule. + * This buffer is used to write data to the flash. + */ +returncode_t libtock_app_loader_write_buffer(uint8_t* buffer, uint32_t len); + +/* + * Command to write new app binary to the capsule. + * Specify the offset at which the data segment should be written. + * Also specify how long the data segment will be in bytes. + * + * After writing data, the userspace app should yield for + * the write done callback from the capsule. + */ +returncode_t libtock_app_loader_command_write(uint32_t flash_offset, uint32_t write_length); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_finalize_subscribe(subscribe_upcall cb, void* userdata); + +/* + * Signal to kernel we are done writing a new process binary. + */ +returncode_t libtock_app_loader_command_finalize(void); + +/* + * Command to request the kernel to load the newly flashed app. + */ +returncode_t libtock_app_loader_command_load(void); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_load_subscribe(subscribe_upcall cb, void* userdata); + +/* + * Command to request the kernel to abort setup/writing process. + */ +returncode_t libtock_app_loader_command_abort(void); + +/* + * Function to setup the callback from capsule. + * This function takes in the function that will be executed + * when the callback is triggered. + */ +returncode_t libtock_app_loader_abort_subscribe(subscribe_upcall cb, void* userdata); + + + +#ifdef __cplusplus +} +#endif